ZGlmZiAtLWdpdCBhL2ZpbmFsLy5hcmNjb25maWcgYi9maW5hbC8uYXJjY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MzY2MmQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC8uYXJjY29uZmlnCkBAIC0wLDAgKzEsNCBAQAoreworICAicHJvamVjdF9pZCIgOiAib3Blbm1wIiwKKyAgImNvbmR1aXRfdXJpIiA6ICJodHRwczovL3Jldmlld3MubGx2bS5vcmcvIgorfQpkaWZmIC0tZ2l0IGEvZmluYWwvLmdpdGlnbm9yZSBiL2ZpbmFsLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRiZWMxNQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsLy5naXRpZ25vcmUKQEAgLTAsMCArMSw0MiBAQAorIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSMKKyMgVGhpcyBmaWxlIHNwZWNpZmllcyBpbnRlbnRpb25hbGx5IHVudHJhY2tlZCBmaWxlcyB0aGF0IGdpdCBzaG91bGQgaWdub3JlLgorIyBTZWU6IGh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvc29mdHdhcmUvc2NtL2dpdC9kb2NzL2dpdGlnbm9yZS5odG1sCisjCisjIFRoaXMgZmlsZSBpcyBpbnRlbnRpb25hbGx5IGRpZmZlcmVudCBmcm9tIHRoZSBvdXRwdXQgb2YgYGdpdCBzdm4gc2hvdy1pZ25vcmVgLAorIyBhcyBtb3N0IG9mIHRob3NlIGFyZSB1c2VsZXNzLgorIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSMKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSMKKyMgRmlsZSBleHRlbnNpb25zIHRvIGJlIGlnbm9yZWQgYW55d2hlcmUgaW4gdGhlIHRyZWUuCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IworIyBUZW1wIGZpbGVzIGNyZWF0ZWQgYnkgbW9zdCB0ZXh0IGVkaXRvcnMuCisqfgorIyBNZXJnZSBmaWxlcyBjcmVhdGVkIGJ5IGdpdC4KKyoub3JpZworIyBCeXRlIGNvbXBpbGVkIHB5dGhvbiBtb2R1bGVzLgorKi5weWMKKyMgdmltIHN3YXAgZmlsZXMKKy4qLnN3PworLnN3PworI09TIFggc3BlY2lmaWMgZmlsZXMuCisuRFNfc3RvcmUKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSMKKyMgRXhwbGljaXQgZmlsZXMgdG8gaWdub3JlIChvbmx5IG1hdGNoZXMgb25lKS4KKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0jCisjIFZhcmlvdXMgdGFnIHByb2dyYW1zCit0YWdzCisvVEFHUworL0dQQVRICisvR1JUQUdTCisvR1NZTVMKKy9HVEFHUworLmdpdHVzZXJzCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0jCisjIERpcmVjdG9yaWVzIHRvIGlnbm9yZSAoZG8gbm90IGFkZCB0cmFpbGluZyAnLydzLCB0aGV5IHNraXAgc3ltbGlua3MpLgorIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSMKK3J1bnRpbWUvZXhwb3J0cworCisjIE5lc3RlZCBidWlsZCBkaXJlY3RvcnkKKy9idWlsZApkaWZmIC0tZ2l0IGEvZmluYWwvQ01ha2VMaXN0cy50eHQgYi9maW5hbC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWZiYTNjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyMyBAQAorY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOCBGQVRBTF9FUlJPUikKKworc2V0KE9QRU5NUF9MTFZNX1RPT0xTX0RJUiAiIiBDQUNIRSBQQVRIICJQYXRoIHRvIExMVk0gdG9vbHMgZm9yIHRlc3RpbmciKQorCithZGRfc3ViZGlyZWN0b3J5KHJ1bnRpbWUpCisKKworIyBUaGUgdGVzdHMgY3VycmVudGx5IGRvbid0IHBhc3MgaWYgdGhlIGdlbmVyaWMgRUxGIHBsdWdpbiBpcyBidWlsdC4KKyMgVE9ETzogRml4IHRoZSB0ZXN0cyBhbmQgZW5hYmxlIGxpYm9tcHRhcmdldCBieSBkZWZhdWx0IG9uIHN1cHBvcnRlZAorIyAgICAgICBhcmNoaXRlY3R1cmVzIGFuZCBwbGF0Zm9ybXMuCitzZXQoRU5BQkxFX0xJQk9NUFRBUkdFVCBPRkYpCisjIEN1cnJlbnRseSBsaWJvbXB0YXJnZXQgY2Fubm90IGJlIGNvbXBpbGVkIG9uIFdpbmRvd3Mgb3IgTWFjT1MgWC4KKyMgU2luY2UgdGhlIGRldmljZSBwbHVnaW5zIGFyZSBvbmx5IHN1cHBvcnRlZCBvbiBMaW51eCBhbnl3YXksCisjIHRoZXJlIGlzIG5vIHBvaW50IGluIHRyeWluZyB0byBjb21waWxlIGxpYm9tcHRhcmdldCBvbiBvdGhlciBPU2VzLgoraWYgKFdJTjMyIE9SICR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgIkRhcndpbiIpCisgIHNldChFTkFCTEVfTElCT01QVEFSR0VUIE9GRikKK2VuZGlmKCkKKworb3B0aW9uKE9QRU5NUF9FTkFCTEVfTElCT01QVEFSR0VUICJFbmFibGUgYnVpbGRpbmcgbGlib21wdGFyZ2V0IGZvciBvZmZsb2FkaW5nLiIKKyAgICAgICAke0VOQUJMRV9MSUJPTVBUQVJHRVR9KQoraWYgKE9QRU5NUF9FTkFCTEVfTElCT01QVEFSR0VUKQorICBhZGRfc3ViZGlyZWN0b3J5KGxpYm9tcHRhcmdldCkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL2ZpbmFsL0NSRURJVFMudHh0IGIvZmluYWwvQ1JFRElUUy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThhYjY3YQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL0NSRURJVFMudHh0CkBAIC0wLDAgKzEsNTcgQEAKK1RoaXMgZmlsZSBpcyBhIHBhcnRpYWwgbGlzdCBvZiBwZW9wbGUgd2hvIGhhdmUgY29udHJpYnV0ZWQgdG8gdGhlIExMVk0vb3Blbm1wCitwcm9qZWN0LiAgSWYgeW91IGhhdmUgY29udHJpYnV0ZWQgYSBwYXRjaCBvciBtYWRlIHNvbWUgb3RoZXIgY29udHJpYnV0aW9uIHRvCitMTFZNL29wZW5tcCwgcGxlYXNlIHN1Ym1pdCBhIHBhdGNoIHRvIHRoaXMgZmlsZSB0byBhZGQgeW91cnNlbGYsIGFuZCBpdCB3aWxsIGJlCitkb25lIQorCitUaGUgbGlzdCBpcyBzb3J0ZWQgYnkgc3VybmFtZSBhbmQgZm9ybWF0dGVkIHRvIGFsbG93IGVhc3kgZ3JlcHBpbmcgYW5kCitiZWF1dGlmaWNhdGlvbiBieSBzY3JpcHRzLiAgVGhlIGZpZWxkcyBhcmU6IG5hbWUgKE4pLCBlbWFpbCAoRSksIHdlYi1hZGRyZXNzCisoVyksIFBHUCBrZXkgSUQgYW5kIGZpbmdlcnByaW50IChQKSwgZGVzY3JpcHRpb24gKEQpLCBhbmQgc25haWwtbWFpbCBhZGRyZXNzCisoUykuCisKK046IENhcmxvIEJlcnRvbGxpCitXOiBodHRwOi8vaWJtLmNvbQorRDogSUJNIGNvbnRyaWJ1dG9yIHRvIFBvd2VyUEMgc3VwcG9ydCBpbiBDTWFrZSBmaWxlcyBhbmQgZWxzZXdoZXJlLgorCitOOiBTdW5pdGEgQ2hhbmRyYXNla2FyYW4KK0Q6IENvbnRyaWJ1dG9yIHRvIHRlc3RzdWl0ZSBmcm9tIE9wZW5VSAorCitOOiBCYXJiYXJhIENoYXBtYW4KK0Q6IENvbnRyaWJ1dG9yIHRvIHRlc3RzdWl0ZSBmcm9tIE9wZW5VSAorCitOOiBVbml2ZXJzaXR5IG9mIEhvdXN0b24KK1c6IGh0dHA6Ly93ZWIuY3MudWguZWR1L35vcGVudWgvZG93bmxvYWQvCitEOiBPcGVuVUggdGVzdCBzdWl0ZQorCitOOiBJbnRlbCBDb3Jwb3JhdGlvbiBPcGVuTVAgcnVudGltZSB0ZWFtCitXOiBodHRwOi8vb3Blbm1wcnRsLm9yZworRDogQ3JlYXRlZCB0aGUgcnVudGltZS4KKworTjogSm9obiBNZWxsb3ItQ3J1bW1leSBhbmQgb3RoZXIgbWVtYmVycyBvZiB0aGUgT3Blbk1QIFRvb2xzIFdvcmtpbmcgR3JvdXAKK0U6IGpvaG5tY0ByaWNlLmVkdQorRDogT3Blbk1QIFRvb2xzIEludGVyZmFjZSAoT01QVCkKKworTjogTWF0dGhpYXMgTXVsbGVyCitEOiBDb250cmlidXRvciB0byB0ZXN0c3VpdGUgZnJvbSBPcGVuVUgKKworTjogVGFsIE5ldm8KK0U6IHRhbEBzY2FsZW1wLmNvbQorRDogU2NhbGVNUCBjb250cmlidXRvciB0byBpbXByb3ZlIHJ1bnRpbWUgcGVyZm9ybWFuY2UgdGhlcmUuCitXOiBodHRwOi8vc2NhbGVtcC5jb20KKworTjogUGF2ZWwgTmV5dGNoZXYKK0Q6IENvbnRyaWJ1dG9yIHRvIHRlc3RzdWl0ZSBmcm9tIE9wZW5VSAorCitOOiBTdGV2ZW4gTm9vbmFuCitFOiBzdGV2ZW5AdXBsaW5rbGFicy5uZXQKK0Q6IFBhdGNoZXMgZm9yIHRoZSBBUk0gYXJjaGl0ZWN0dXJlIGFuZCByZW1vdmFsIG9mIHNldmVyYWwgaW5jb25zaXN0ZW5jaWVzLgorCitOOiBBbHAgVG9rZXIKK0U6IGFscEBudWFudGkuY29tCitEOiBNYWtpbmcgYnVpbGQgd29yayBmb3IgRnJlZUJTRC4KKworTjogQ2hlbmcgV2FuZworRDogQ29udHJpYnV0b3IgdG8gdGVzdHN1aXRlIGZyb20gT3BlblVICisKK046IERpZWdvIENhYmFsbGVybworRTogZGllZ28ubC5jYWJhbGxlcm9AZ21haWwuY29tCitEOiBGb3JrIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cwpkaWZmIC0tZ2l0IGEvZmluYWwvTElDRU5TRS50eHQgYi9maW5hbC9MSUNFTlNFLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODU4NTUyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvTElDRU5TRS50eHQKQEAgLTAsMCArMSwxNzQgQEAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgc29mdHdhcmUgY29udGFpbmVkIGluIHRoaXMgZGlyZWN0b3J5IHRyZWUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciBib3RoIHRoZQorVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyAiQlNELUxpa2UiIGxpY2Vuc2UgYW5kIHRoZSBNSVQgbGljZW5zZS4gIEFzIGEgdXNlciBvZgordGhpcyBjb2RlIHlvdSBtYXkgY2hvb3NlIHRvIHVzZSBpdCB1bmRlciBlaXRoZXIgbGljZW5zZS4gIEFzIGEgY29udHJpYnV0b3IsCit5b3UgYWdyZWUgdG8gYWxsb3cgeW91ciBjb2RlIHRvIGJlIHVzZWQgdW5kZXIgYm90aC4gIFRoZSBmdWxsIHRleHQgb2YgdGhlCityZWxldmFudCBsaWNlbnNlcyBpcyBpbmNsdWRlZCBiZWxvdy4KKworSW4gYWRkaXRpb24sIGEgbGljZW5zZSBhZ3JlZW1lbnQgZnJvbSB0aGUgY29weXJpZ2h0L3BhdGVudCBob2xkZXJzIG9mIHRoZQorc29mdHdhcmUgY29udGFpbmVkIGluIHRoaXMgZGlyZWN0b3J5IHRyZWUgaXMgaW5jbHVkZWQgYmVsb3cuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitVbml2ZXJzaXR5IG9mIElsbGlub2lzL05DU0EKK09wZW4gU291cmNlIExpY2Vuc2UKKworQ29weXJpZ2h0IChjKSAxOTk3LTIwMTYgSW50ZWwgQ29ycG9yYXRpb24KKworQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworRGV2ZWxvcGVkIGJ5OgorICAgIE9wZW5NUCBSdW50aW1lIFRlYW0KKyAgICBJbnRlbCBDb3Jwb3JhdGlvbgorICAgIGh0dHA6Ly93d3cub3Blbm1wcnRsLm9yZworCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCit0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCB3aXRoCit0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCit1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcworb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCitzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJzLgorCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVycyBpbiB0aGUKKyAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAqIE5laXRoZXIgdGhlIG5hbWVzIG9mIEludGVsIENvcnBvcmF0aW9uIE9wZW5NUCBSdW50aW1lIFRlYW0gbm9yIHRoZQorICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKK0ZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitDT05UUklCVVRPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCitPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIFdJVEggVEhFCitTT0ZUV0FSRS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NvcHlyaWdodCAoYykgMTk5Ny0yMDE2IEludGVsIENvcnBvcmF0aW9uCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKK29mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCitpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCit0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCitjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKK2Z1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorVEhFIFNPRlRXQVJFLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSW50ZWwgQ29ycG9yYXRpb24KKworU29mdHdhcmUgR3JhbnQgTGljZW5zZSBBZ3JlZW1lbnQgKCJBZ3JlZW1lbnQiKQorCitFeGNlcHQgZm9yIHRoZSBsaWNlbnNlIGdyYW50ZWQgaGVyZWluIHRvIHlvdSwgSW50ZWwgQ29ycG9yYXRpb24gKCJJbnRlbCIpIHJlc2VydmVzCithbGwgcmlnaHQsIHRpdGxlLCBhbmQgaW50ZXJlc3QgaW4gYW5kIHRvIHRoZSBTb2Z0d2FyZSAoZGVmaW5lZCBiZWxvdykuCisKK0RlZmluaXRpb24KKworIlNvZnR3YXJlIiBtZWFucyB0aGUgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBhcyB3ZWxsIGFzIGFueSBvcmlnaW5hbCB3b3JrIG9mCithdXRob3JzaGlwLCBpbmNsdWRpbmcgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zIHRvIGFuIGV4aXN0aW5nIHdvcmssIHRoYXQKK2lzIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGJ5IEludGVsIHRvIGxsdm0ub3JnIChodHRwOi8vbGx2bS5vcmcpICgiTExWTSIpIGZvcgoraW5jbHVzaW9uIGluLCBvciBkb2N1bWVudGF0aW9uIG9mLCBhbnkgb2YgdGhlIHByb2R1Y3RzIG93bmVkIG9yIG1hbmFnZWQgYnkgTExWTQorKHRoZSAiV29yayIpLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIgbWVhbnMgYW55IGZvcm0gb2YKK2VsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQgdG8gTExWTSBvciBpdHMKK3JlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMKK21haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUKK21hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgTExWTSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nCit0aGUgV29yaywgYnV0IGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3RoZXJ3aXNlLgorCisxLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcworICAgQWdyZWVtZW50LCBJbnRlbCBoZXJlYnkgZ3JhbnRzIHRvIHlvdSBhbmQgdG8gcmVjaXBpZW50cyBvZiB0aGUgU29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIGJ5IExMVk0gYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLAorICAgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZQorICAgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgU29mdHdhcmUgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3Jrcy4KKworMi4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMKKyAgIEFncmVlbWVudCwgSW50ZWwgaGVyZWJ5IGdyYW50cyB5b3UgYW5kIHRvIHJlY2lwaWVudHMgb2YgdGhlIFNvZnR3YXJlCisgICBkaXN0cmlidXRlZCBieSBMTFZNIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwKKyAgIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZQorICAgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlcgorICAgdGhlIFdvcmssIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICBieSBJbnRlbCB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgSW50ZWwncyBTb2Z0d2FyZSBhbG9uZSBvciBieQorICAgY29tYmluYXRpb24gb2YgdGhlIFNvZnR3YXJlIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBTb2Z0d2FyZSB3YXMKKyAgIHN1Ym1pdHRlZC4gSWYgYW55IGVudGl0eSBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgSW50ZWwgb3IgYW55CisgICBvdGhlciBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nCisgICB0aGF0IEludGVsJ3MgU29mdHdhcmUsIG9yIHRoZSBXb3JrIHRvIHdoaWNoIEludGVsIGhhcyBjb250cmlidXRlZCBjb25zdGl0dXRlcworICAgZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZAorICAgdG8gdGhhdCBlbnRpdHkgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgZm9yIHRoZSBTb2Z0d2FyZSBvciBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHRoZSBzb2Z0d2FyZSBpcworcHJvdmlkZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsCitlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IKK2NvbmRpdGlvbnMgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQVJNIExpbWl0ZWQKKworU29mdHdhcmUgR3JhbnQgTGljZW5zZSBBZ3JlZW1lbnQgKCJBZ3JlZW1lbnQiKQorCitFeGNlcHQgZm9yIHRoZSBsaWNlbnNlIGdyYW50ZWQgaGVyZWluIHRvIHlvdSwgQVJNIExpbWl0ZWQgKCJBUk0iKSByZXNlcnZlcyBhbGwKK3JpZ2h0LCB0aXRsZSwgYW5kIGludGVyZXN0IGluIGFuZCB0byB0aGUgU29mdHdhcmUgKGRlZmluZWQgYmVsb3cpLgorCitEZWZpbml0aW9uCisKKyJTb2Z0d2FyZSIgbWVhbnMgdGhlIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gYXMgd2VsbCBhcyBhbnkgb3JpZ2luYWwgd29yayBvZgorYXV0aG9yc2hpcCwgaW5jbHVkaW5nIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucyB0byBhbiBleGlzdGluZyB3b3JrLCB0aGF0CitpcyBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBieSBBUk0gdG8gbGx2bS5vcmcgKGh0dHA6Ly9sbHZtLm9yZykgKCJMTFZNIikgZm9yCitpbmNsdXNpb24gaW4sIG9yIGRvY3VtZW50YXRpb24gb2YsIGFueSBvZiB0aGUgcHJvZHVjdHMgb3duZWQgb3IgbWFuYWdlZCBieSBMTFZNCisodGhlICJXb3JrIikuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIiBtZWFucyBhbnkgZm9ybSBvZgorZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudCB0byBMTFZNIG9yIGl0cworcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYworbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLCBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZQorbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCBMTFZNIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcKK3RoZSBXb3JrLCBidXQgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvdGhlcndpc2UuCisKKzEuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzCisgICBBZ3JlZW1lbnQsIEFSTSBoZXJlYnkgZ3JhbnRzIHRvIHlvdSBhbmQgdG8gcmVjaXBpZW50cyBvZiB0aGUgU29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIGJ5IExMVk0gYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLAorICAgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZQorICAgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgU29mdHdhcmUgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3Jrcy4KKworMi4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMKKyAgIEFncmVlbWVudCwgQVJNIGhlcmVieSBncmFudHMgeW91IGFuZCB0byByZWNpcGllbnRzIG9mIHRoZSBTb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgYnkgTExWTSBhIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsCisgICByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UKKyAgIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIKKyAgIHRoZSBXb3JrLCB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgYnkgQVJNIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSBBUk0ncyBTb2Z0d2FyZSBhbG9uZSBvciBieQorICAgY29tYmluYXRpb24gb2YgdGhlIFNvZnR3YXJlIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBTb2Z0d2FyZSB3YXMKKyAgIHN1Ym1pdHRlZC4gSWYgYW55IGVudGl0eSBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgQVJNIG9yIGFueQorICAgb3RoZXIgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZworICAgdGhhdCBBUk0ncyBTb2Z0d2FyZSwgb3IgdGhlIFdvcmsgdG8gd2hpY2ggQVJNIGhhcyBjb250cmlidXRlZCBjb25zdGl0dXRlcworICAgZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZAorICAgdG8gdGhhdCBlbnRpdHkgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgZm9yIHRoZSBTb2Z0d2FyZSBvciBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHRoZSBzb2Z0d2FyZSBpcworcHJvdmlkZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsCitlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IKK2NvbmRpdGlvbnMgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL2ZpbmFsL2xpYm9tcHRhcmdldC9CdWlsZF9XaXRoX0NNYWtlLnR4dCBiL2ZpbmFsL2xpYm9tcHRhcmdldC9CdWlsZF9XaXRoX0NNYWtlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2M5YjAzCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvbGlib21wdGFyZ2V0L0J1aWxkX1dpdGhfQ01ha2UudHh0CkBAIC0wLDAgKzEsMTQyIEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSG93IHRvIEJ1aWxkIHRoZSBMTFZNKiBPcGVuTVAqIE9mZmxvYWRpbmcgUnVudGltZSBMaWJyYXJ5IHVzaW5nIENNYWtlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworPT09PSBWZXJzaW9uIG9mIENNYWtlIHJlcXVpcmVkOiB2Mi44LjAgb3IgYWJvdmUgPT09PQorIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0hvdyB0byBjYWxsIGNtYWtlIGluaXRpYWxseSwgdGhlbiByZXBlYXRlZGx5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLSBXaGVuIGNhbGxpbmcgY21ha2UgZm9yIHRoZSBmaXJzdCB0aW1lLCBhbGwgbmVlZGVkIGNvbXBpbGVyIG9wdGlvbnMKKyAgbXVzdCBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gIEFmdGVyIHRoaXMgaW5pdGlhbCBjYWxsIHRvCisgIGNtYWtlLCB0aGUgY29tcGlsZXIgZGVmaW5pdGlvbnMgbXVzdCBub3QgYmUgaW5jbHVkZWQgZm9yIGZ1cnRoZXIgY2FsbHMKKyAgdG8gY21ha2UuICBPdGhlciBvcHRpb25zIGNhbiBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSBtdWx0aXBsZQorICB0aW1lcyBpbmNsdWRpbmcgYWxsIGRlZmluaXRpb25zIGluIHRoZSBCdWlsZCBvcHRpb25zIHNlY3Rpb24gYmVsb3cuCistIEV4YW1wbGUgb2YgY29uZmlndXJpbmcsIGJ1aWxkaW5nLCByZWNvbmZpZ3VyaW5nLCByZWJ1aWxkaW5nOgorICAkIG1rZGlyIGJ1aWxkCisgICQgY2QgYnVpbGQKKyAgJCBjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9Z2NjIC1EQ01BS0VfQ1hYX0NPTVBJTEVSPWcrKyAuLiAgIyBJbml0aWFsIGNvbmZpZ3VyYXRpb24KKyAgJCBtYWtlCisgIC4uLgorICAkIG1ha2UgY2xlYW4KKyAgJCBjbWFrZSAtRENNQUtFX0JVSUxEX1RZUEU9RGVidWcgLi4gICAgICAgICAgICAgICAgICAgICAgICAgIyBTZWNvbmQgY29uZmlndXJhdGlvbgorICAkIG1ha2UKKyAgLi4uCisgICQgcm0gLXJmICoKKyAgJCBjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9Z2NjIC1EQ01BS0VfQ1hYX0NPTVBJTEVSPWcrKyAuLiAgIyBUaGlyZCBjb25maWd1cmF0aW9uCisgICQgbWFrZQorLSBOb3RpY2UgaW4gdGhlIGV4YW1wbGUgaG93IHRoZSBjb21waWxlciBkZWZpbml0aW9ucyBhcmUgb25seSBzcGVjaWZpZWQKKyAgZm9yIGFuIGVtcHR5IGJ1aWxkIGRpcmVjdG9yeSwgYnV0IG90aGVyIEJ1aWxkIG9wdGlvbnMgYXJlIHVzZWQgYXQgYW55IHRpbWUuCistIFRoZSBmaWxlIENNYWtlQ2FjaGUudHh0IHdoaWNoIGlzIGNyZWF0ZWQgYWZ0ZXIgdGhlIGZpcnN0IGNhbGwgdG8gY21ha2UKKyAgaXMgYSBjb25maWd1cmF0aW9uIGZpbGUgd2hpY2ggaG9sZHMgYWxsIHRoZSB2YWx1ZXMgZm9yIHRoZSBCdWlsZCBvcHRpb25zLgorICBUaGVzZSBjb25maWd1cmF0aW9uIHZhbHVlcyBjYW4gYmUgY2hhbmdlZCB1c2luZyBhIHRleHQgZWRpdG9yIHRvIG1vZGlmeSAKKyAgQ01ha2VDYWNoZS50eHQgYXMgb3Bwb3NlZCB0byB1c2luZyBkZWZpbml0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lLgorLSBUbyBoYXZlIGNtYWtlIGNyZWF0ZSBhIHBhcnRpY3VsYXIgdHlwZSBvZiBidWlsZCBnZW5lcmF0b3IgZmlsZSBzaW1wbHkgCisgIGlubHVkZSB0aGUgLUcgPEdlbmVyYXRvciBuYW1lPiBvcHRpb246CisgICQgY21ha2UgLUcgIlVuaXggTWFrZWZpbGVzIiAuLi4KKyAgWW91IGNhbiBzZWUgYSBsaXN0IG9mIGdlbmVyYXRvcnMgY21ha2Ugc3VwcG9ydHMgYnkgZXhlY3V0aW5nIGNtYWtlIHdpdGgKKyAgbm8gYXJndW1lbnRzIGFuZCBhIGxpc3Qgd2lsbCBiZSBwcmludGVkLgorCis9PT09PT09PT09PT09PT09PT09PT0KK0luc3RydWN0aW9ucyB0byBCdWlsZAorPT09PT09PT09PT09PT09PT09PT09CisgJCBjZCBsaWJvbXB0YXJnZXRfdG9wX2xldmVsLyBbIGRpcmVjdG9yeSB3aXRoIHBsdWdpbnMvICwgZGV2aWNlUlRMcy8gLCBldGMuIF0KKyAkIG1rZGlyIGJ1aWxkCisgJCBjZCBidWlsZAorCisgWyBVbml4KiBMaWJyYXJpZXMgXQorICQgY21ha2UgLURDTUFLRV9DX0NPTVBJTEVSPTxDIENvbXBpbGVyPiAtRENNQUtFX0NYWF9DT01QSUxFUj08QysrIENvbXBpbGVyPiAuLgorCisgJCBtYWtlCisgJCBtYWtlIGluc3RhbGwKKworPT09PT09PT09PT0KK1Rlc3RzCis9PT09PT09PT09PQorQWZ0ZXIgdGhlIGxpYnJhcnkgaGFzIGJlZW4gYnVpbHQsIHRoZXJlIGFyZSBvcHRpb25hbCB0ZXN0cyB0aGF0IGNhbiBiZSAKK3BlcmZvcm1lZC4gIFNvbWUgd2lsbCBiZSBza2lwcGVkIGJhc2VkIHVwb24gdGhlIHBsYXRmb3JtLgorVG8gcnVuIHRoZSB0ZXN0cywKKyQgbWFrZSBjaGVjay1saWJvbXB0YXJnZXQKKworPT09PT09PT09PT09PQorQ01ha2Ugb3B0aW9ucworPT09PT09PT09PT09PQorLURDTUFLRV9DX0NPTVBJTEVSPTxDIGNvbXBpbGVyIG5hbWU+CitTcGVjaWZ5IHRoZSBDIGNvbXBpbGVyCisKKy1EQ01BS0VfQ1hYX0NPTVBJTEVSPTxDKysgY29tcGlsZXIgbmFtZT4KK1NwZWNpZnkgdGhlIEMrKyBjb21waWxlcgorCis9PT09IEZpcnN0IHZhbHVlcyBsaXN0ZWQgYXJlIHRoZSBkZWZhdWx0IHZhbHVlID09PT0KKy1EQ01BS0VfQlVJTERfVFlQRT1SZWxlYXNlfERlYnVnfFJlbFdpdGhEZWJJbmZvCitCdWlsZCB0eXBlIGNhbiBiZSBSZWxlYXNlLCBEZWJ1Zywgb3IgUmVsV2l0aERlYkluZm8uCisKKy1ETElCT01QVEFSR0VUX0VOQUJMRV9XRVJST1I9dHJ1ZXxmYWxzZQorU2hvdWxkIGNvbnNpZGVyIHdhcm5pbmdzIGFzIGVycm9ycy4KKworLURMSUJPTVBUQVJHRVRfTExWTV9MSVRfRVhFQ1VUQUJMRT0iIgorRnVsbCBwYXRoIHRvIHRoZSBsbHZtLWxpdCB0b29sLiBSZXF1aXJlZCBmb3IgdGVzdGluZyBpbiBvdXQtb2YtdHJlZSBidWlsZHMuCisKKy1ETElCT01QVEFSR0VUX0ZJTEVDSEVDS19FWEVDVVRBQkxFPSIiCitGdWxsIHBhdGggdG8gdGhlIEZpbGVDaGVjayB0b29sLiBSZXF1aXJlZCBmb3IgdGVzdGluZyBpbiBvdXQtb2YtdHJlZSBidWlsZHMuCisKKy1ETElCT01QVEFSR0VUX09QRU5NUF9IRUFERVJfRk9MREVSPSIiCitQYXRoIG9mIHRoZSBmb2xkZXIgdGhhdCBjb250YWlucyBvbXAuaC4gVGhpcyBpcyByZXF1aXJlZCBmb3IgdGVzdGluZyAKK291dC1vZi10cmVlIGJ1aWxkcy4KKworLURMSUJPTVBUQVJHRVRfT1BFTk1QX0hPU1RfUlRMX0ZPTERFUj0iIgorUGF0aCBvZiB0aGUgZm9sZGVyIHRoYXQgY29udGFpbnMgbGlib21wLnNvLiBUaGlzIGlzIHJlcXVpcmVkIGZvciB0ZXN0aW5nIAorb3V0LW9mLXRyZWUgYnVpbGRzLgorCis9PT09IE5WUFRYIGRldmljZSBSVEwgc3BlY2lmaWMgPT09PQorLURMSUJPTVBUQVJHRVRfTlZQVFhfRU5BQkxFX0JDTElCPWZhbHNlfHRydWUKK0VuYWJsZSBDVURBIExMVk0gYml0Y29kZSBvZmZsb2FkaW5nIGRldmljZSBSVEwuIFRoaXMgaXMgdXNlZCBmb3IKK2xpbmsgdGltZSBvcHRpbWl6YXRpb24gb2YgdGhlIG9tcCBydW50aW1lIGFuZCBhcHBsaWNhdGlvbiBjb2RlLgorCistRExJQk9NUFRBUkdFVF9OVlBUWF9DVURBX0NPTVBJTEVSPTxDVURBIGNvbXBpbGVyIG5hbWU+CitMb2NhdGlvbiBvZiBhIENVREEgY29tcGlsZXIgY2FwYWJsZSBvZiBlbWl0dGluZyBMTFZNIGJpdGNvZGUuCitDdXJyZW50bHkgb25seSB0aGUgQ2xhbmcgY29tcGlsZXIgaXMgc3VwcG9ydGVkLiBUaGlzIGlzIG9ubHkgdXNlZAord2hlbiBidWlsZGluZyB0aGUgQ1VEQSBMTFZNIGJpdGNvZGUgb2ZmbG9hZGluZyBkZXZpY2UgUlRMLiBJZgordW5zcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHBhdGhzIGFyZSBpbnNwZWN0ZWQuCisKKy1ETElCT01QVEFSR0VUX05WUFRYX0JDX0xJTktFUj08TExWTSBiaXRjb2RlIGxpbmtlcj4KK0xvY2F0aW9uIG9mIGEgbGlua2VyIGNhcGFibGUgb2YgbGlua2luZyBMTFZNIGJpdGNvZGUgb2JqZWN0cy4KK1RoaXMgaXMgb25seSB1c2VkIHdoZW4gYnVpbGRpbmcgdGhlIENVREEgTExWTSBiaXRjb2RlIG9mZmxvYWRpbmcKK2RldmljZSBSVEwuIElmIHVuc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBwYXRocyBhcmUgaW5zcGVjdGVkLgorCistRExJQk9NUFRBUkdFVF9OVlBUWF9BTFRFUk5BVEVfSE9TVF9DT01QSUxFUj0iIgorSG9zdCBjb21waWxlciB0byB1c2Ugd2l0aCBOVkNDLiBUaGlzIGNvbXBpbGVyIGlzIG5vdCBnb2luZyB0byBiZSB1c2VkIHRvIHByb2R1Y2UKK2FueSBiaW5hcnkuIEluc3RlYWQsIHRoaXMgaXMgdXNlZCB0byBvdmVyY29tZSB0aGUgaW5wdXQgY29tcGlsZXIgY2hlY2tzIGRvbmUgYnkKK05WQ0MuIEUuZy4gaWYgdXNpbmcgYSBkZWZhdWx0IGhvc3QgY29tcGlsZXIgdGhhdCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIE5WQ0MsCit0aGlzIG9wdGlvbiBjYW4gYmUgdXNlIHRvIHBhc3MgdG8gTlZDQyBhIHZhbGlkIGNvbXBpbGVyIHRvIGF2b2lkIHRoZSBlcnJvci4gCisKKy1ETElCT01QVEFSR0VUX05WUFRYX0NPTVBVVEVfQ0FQQUJJTElUWT0iMzUiCitDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBDVURBIGNvbXB1dGUgY2FwYWJpbGl0aWVzIHRoYXQgc2hvdWxkIGJlIHN1cHBvcnRlZCBieQordGhlIE5WUFRYIGRldmljZSBSVEwuIEUuZy4gZm9yIGNvbXB1dGUgY2FwYWJpbGl0aWVzIDMuMCBhbmQgMy41LCB0aGUgb3B0aW9uIAorIjMwLDM1IiBzaG91bGQgYmUgdXNlZC4KKworPT09PT09PT09PT09PT09PT09PT09PT0KK0V4YW1wbGUgdXNhZ2VzIG9mIENNYWtlCis9PT09PT09PT09PT09PT09PT09PT09PQorLS0tLSBUeXBpY2FsIHVzYWdlIC0tLS0KK2NtYWtlIC1EQ01BS0VfQ19DT01QSUxFUj1nY2MgLURDTUFLRV9DWFhfQ09NUElMRVI9ZysrIC4uCitjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9Y2xhbmcgLURDTUFLRV9DWFhfQ09NUElMRVI9Y2xhbmcrKyAuLgorCistLS0tIFJlcXVlc3QgYW4gTlZQVFggcnVudGltZSBsaWJyYXJ5IHRoYXQgc3VwcG9ydHMgY29tcHV0ZSBjYXBhYmlsaXR5IDUuMCAtLS0tCitjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9Y2xhbmcgLURDTUFLRV9DWFhfQ09NUElMRVI9Y2xhbmcrKyAtRExJQk9NUFRBUkdFVF9OVlBUWF9DT01QVVRFX0NBUEFCSUxJVFk9IjUwIgorCis9PT09PT09PT0KK0Zvb3Rub3RlcworPT09PT09PT09CitbKl0gT3RoZXIgbmFtZXMgYW5kIGJyYW5kcyBtYXkgYmUgY2xhaW1lZCBhcyB0aGUgcHJvcGVydHkgb2Ygb3RoZXJzLgpkaWZmIC0tZ2l0IGEvZmluYWwvbGlib21wdGFyZ2V0L0NNYWtlTGlzdHMudHh0IGIvZmluYWwvbGlib21wdGFyZ2V0L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZTBhNmMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9saWJvbXB0YXJnZXQvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxMTkgQEAKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisjIAorIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMgU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjIAorIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKyMKKyMgQnVpbGQgb2ZmbG9hZGluZyBsaWJyYXJ5IGxpYm9tcHRhcmdldC5zby4KKyMKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisKKyMgQ01BS0UgbGlib21wdGFyZ2V0CitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi44IEZBVEFMX0VSUk9SKQorCisjIEFkZCBjbWFrZSBkaXJlY3RvcnkgdG8gc2VhcmNoIGZvciBjdXN0b20gY21ha2UgZnVuY3Rpb25zLgorc2V0KENNQUtFX01PRFVMRV9QQVRIICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jbWFrZS9Nb2R1bGVzICR7Q01BS0VfTU9EVUxFX1BBVEh9KQorCisjIFN0YW5kYWxvbmUgYnVpbGQgb3IgcGFydCBvZiBMTFZNPworc2V0KExJQk9NUFRBUkdFVF9TVEFOREFMT05FX0JVSUxEIEZBTFNFKQoraWYoIiR7Q01BS0VfU09VUkNFX0RJUn0iIFNUUkVRVUFMICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0iIE9SCisgICAiJHtDTUFLRV9TT1VSQ0VfRElSfS9saWJvbXB0YXJnZXQiIFNUUkVRVUFMICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0iKQorICBwcm9qZWN0KGxpYm9tcHRhcmdldCBDIENYWCkKKyAgc2V0KExJQk9NUFRBUkdFVF9TVEFOREFMT05FX0JVSUxEIFRSVUUpCitlbmRpZigpCisgIAorICAKK2lmKCR7TElCT01QVEFSR0VUX1NUQU5EQUxPTkVfQlVJTER9KQorICBzZXQoTElCT01QVEFSR0VUX0VOQUJMRV9XRVJST1IgRkFMU0UgQ0FDSEUgQk9PTAorICAgICJFbmFibGUgLVdlcnJvciBmbGFncyB0byB0dXJuIHdhcm5pbmdzIGludG8gZXJyb3JzIGZvciBzdXBwb3J0aW5nIGNvbXBpbGVycy4iKQorICAjIENNQUtFX0JVSUxEX1RZUEUgd2FzIG5vdCBkZWZpbmVkLCBzZXQgZGVmYXVsdCB0byBSZWxlYXNlCisgIGlmKE5PVCBDTUFLRV9CVUlMRF9UWVBFKQorICAgIHNldChDTUFLRV9CVUlMRF9UWVBFIFJlbGVhc2UpCisgIGVuZGlmKCkKKyAgc2V0KExJQk9NUFRBUkdFVF9MSUJESVJfU1VGRklYICIiIENBQ0hFIFNUUklORworICAgICJzdWZmaXggb2YgbGliIGluc3RhbGxhdGlvbiBkaXJlY3RvcnksIGUuZy4gNjQgPT4gbGliNjQiKQorZWxzZSgpCisgIHNldChMSUJPTVBUQVJHRVRfRU5BQkxFX1dFUlJPUiAke0xMVk1fRU5BQkxFX1dFUlJPUn0pCisgICMgSWYgYnVpbGRpbmcgaW4gdHJlZSwgd2UgaG9ub3IgdGhlIHNhbWUgaW5zdGFsbCBzdWZmaXggTExWTSB1c2VzLgorICBzZXQoTElCT01QVEFSR0VUX0xJQkRJUl9TVUZGSVggJHtMTFZNX0xJQkRJUl9TVUZGSVh9KQorZW5kaWYoKQorCisjIENvbXBpbGVyIGZsYWcgY2hlY2tzLgoraW5jbHVkZShjb25maWctaXgpCisKKyMgTWVzc2FnZSB1dGlsaXRpZXMuCitpbmNsdWRlKExpYm9tcHRhcmdldFV0aWxzKQorCisjIEdldCBkZXBlbmRlbmNpZXMgZm9yIHRoZSBkaWZmZXJlbnQgY29tcG9uZW50cyBvZiB0aGUgcHJvamVjdC4KK2luY2x1ZGUoTGlib21wdGFyZ2V0R2V0RGVwZW5kZW5jaWVzKQorCisjIFRoaXMgaXMgYSBsaXN0IG9mIGFsbCB0aGUgdGFyZ2V0cyB0aGF0IGFyZSBzdXBwb3J0ZWQvdGVzdGVkIHJpZ2h0IG5vdy4KK3NldCAoTElCT01QVEFSR0VUX0FMTF9UQVJHRVRTICIke0xJQk9NUFRBUkdFVF9BTExfVEFSR0VUU30gYWFyY2g2NC11bmtub3duLWxpbnV4LWdudSIpCitzZXQgKExJQk9NUFRBUkdFVF9BTExfVEFSR0VUUyAiJHtMSUJPTVBUQVJHRVRfQUxMX1RBUkdFVFN9IHBvd2VycGM2NGxlLWlibS1saW51eC1nbnUiKQorc2V0IChMSUJPTVBUQVJHRVRfQUxMX1RBUkdFVFMgIiR7TElCT01QVEFSR0VUX0FMTF9UQVJHRVRTfSBwb3dlcnBjNjQtaWJtLWxpbnV4LWdudSIpCitzZXQgKExJQk9NUFRBUkdFVF9BTExfVEFSR0VUUyAiJHtMSUJPTVBUQVJHRVRfQUxMX1RBUkdFVFN9IHg4Nl82NC1wYy1saW51eC1nbnUiKQorc2V0IChMSUJPTVBUQVJHRVRfQUxMX1RBUkdFVFMgIiR7TElCT01QVEFSR0VUX0FMTF9UQVJHRVRTfSBudnB0eDY0LW52aWRpYS1jdWRhIikKKworIyBPbmNlIHRoZSBwbHVnaW5zIGZvciB0aGUgZGlmZmVyZW50IHRhcmdldHMgYXJlIHZhbGlkYXRlZCwgdGhleSB3aWxsIGJlIGFkZGVkIHRvCisjIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCB0YXJnZXRzIGluIHRoZSBjdXJyZW50IHN5c3RlbS4KK3NldCAoTElCT01QVEFSR0VUX1NZU1RFTV9UQVJHRVRTICIiKQorCisjIFNldCBiYXNlIGRpcmVjdG9yaWVzIC0gcmVxdWlyZWQgZm9yIGxpdCB0byBsb2NhdGUgdGhlIHRlc3RzLgorc2V0KExJQk9NUFRBUkdFVF9CQVNFX0RJUiAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0pCitzZXQoTElCT01QVEFSR0VUX0JJTkFSWV9ESVIgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9KQorCisjIFdlIG5lZWQgQysrMTEgc3VwcG9ydC4KK2lmKExJQk9NUFRBUkdFVF9IQVZFX1NURF9DUFAxMV9GTEFHKQorICAKKyAgbGlib21wdGFyZ2V0X3NheSgiQnVpbGRpbmcgb2ZmbG9hZGluZyBydW50aW1lIGxpYnJhcnkgbGlib21wdGFyZ2V0LiIpCisKKyAgIyBFbmFibGUgc3VwcG9ydCBmb3IgQysrMTEuCisgIGFkZF9kZWZpbml0aW9ucygtc3RkPWMrKzExKQorICAKKyAgaWYoTElCT01QVEFSR0VUX0VOQUJMRV9XRVJST1IgQU5EIExJQk9NUFRBUkdFVF9IQVZFX1dFUlJPUl9GTEFHKQorICAgIGFkZF9kZWZpbml0aW9ucygtV2Vycm9yKQorICBlbmRpZigpCisgIAorICAjIElmIGJ1aWxkaW5nIHRoaXMgbGlicmFyeSBpbiBkZWJ1ZyBtb2RlLCB3ZSBkZWZpbmUgYSBtYWNybyB0byBlbmFibGUKKyAgIyBkdW1waW5nIHByb2dyZXNzIG1lc3NhZ2VzIGF0IHJ1bnRpbWUuCisgIHN0cmluZyggVE9MT1dFUiAiJHtDTUFLRV9CVUlMRF9UWVBFfSIgTElCT01QVEFSR0VUX0NNQUtFX0JVSUxEX1RZUEUpCisgIGlmKExJQk9NUFRBUkdFVF9DTUFLRV9CVUlMRF9UWVBFIE1BVENIRVMgZGVidWcpCisgICAgYWRkX2RlZmluaXRpb25zKC1ET01QVEFSR0VUX0RFQlVHKQorICAgIGFkZF9kZWZpbml0aW9ucygtZykKKyAgICBhZGRfZGVmaW5pdGlvbnMoLU8wKQorICBlbmRpZigpCisgIAorICBzZXQoc3JjX2ZpbGVzCisgICAgc3JjL29tcHRhcmdldC5jcHAKKyAgKQorICAKKyAgaW5jbHVkZV9kaXJlY3RvcmllcyhzcmMvKQorICAKKyAgIyBCdWlsZCBsaWJvbXB0YXJnZXQgbGlicmFyeSB3aXRoIGxpYmRsIGRlcGVuZGVuY3kuCisgIGFkZF9saWJyYXJ5KG9tcHRhcmdldCBTSEFSRUQgJHtzcmNfZmlsZXN9KQorICB0YXJnZXRfbGlua19saWJyYXJpZXMob21wdGFyZ2V0CisgICAgJHtDTUFLRV9ETF9MSUJTfQorICAgICItV2wsLS12ZXJzaW9uLXNjcmlwdD0ke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vZXhwb3J0cyIpCisgIAorICAjIEluc3RhbGwgbGlib21wdGFyZ2V0IHVuZGVyIHRoZSBsaWIgZGVzdGluYXRpb24gZm9sZGVyLgorICBpbnN0YWxsKFRBUkdFVFMgb21wdGFyZ2V0IExJQlJBUlkgREVTVElOQVRJT04gbGliJHtMSUJPTVBUQVJHRVRfTElCRElSX1NVRkZJWH0pCisgIAorICAjIFJldHJpZXZlIHRoZSBwYXRoIHRvIHRoZSByZXN1bHRpbmcgbGlicmFyeSBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGZvciAKKyAgIyB0ZXN0aW5nLgorICBnZXRfdGFyZ2V0X3Byb3BlcnR5KExJQk9NUFRBUkdFVF9MSUJSQVJZX0RJUiBvbXB0YXJnZXQgTElCUkFSWV9PVVRQVVRfRElSRUNUT1JZKQorICBpZihOT1QgTElCT01QVEFSR0VUX0xJQlJBUllfRElSKQorICAgIHNldChMSUJPTVBUQVJHRVRfTElCUkFSWV9ESVIgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9KQorICBlbmRpZigpCisKKyAgIyBCdWlsZCBvZmZsb2FkaW5nIHBsdWdpbnMgYW5kIGRldmljZSBSVExzIGlmIHRoZXkgYXJlIGF2YWlsYWJsZS4KKyAgYWRkX3N1YmRpcmVjdG9yeShwbHVnaW5zKQorICAKKyAgIyBBZGQgdGVzdHMuCisgIGFkZF9zdWJkaXJlY3RvcnkodGVzdCkKKyAgCitlbHNlKExJQk9NUFRBUkdFVF9IQVZFX1NURF9DUFAxMV9GTEFHKQorICBsaWJvbXB0YXJnZXRfc2F5KCJOb3QgYnVpbGRpbmcgb2ZmbG9hZGluZyBydW50aW1lIGxpYnJhcnkgbGlib21wdGFyZ2V0OiBob3N0IGNvbXBpbGVyIG11c3QgaGF2ZSBjKysxMSBzdXBwb3J0LiIpCitlbmRpZihMSUJPTVBUQVJHRVRfSEFWRV9TVERfQ1BQMTFfRkxBRykKZGlmZiAtLWdpdCBhL2ZpbmFsL2xpYm9tcHRhcmdldC9SRUFETUUudHh0IGIvZmluYWwvbGlib21wdGFyZ2V0L1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAwN2YyYQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL2xpYm9tcHRhcmdldC9SRUFETUUudHh0CkBAIC0wLDAgKzEsNzQgQEAKKworICAgIFJFQURNRSBmb3IgdGhlIExMVk0qIE9wZW5NUCogT2ZmbG9hZGluZyBSdW50aW1lIExpYnJhcnkgKGxpYm9tcHRhcmdldCkKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0hvdyB0byBCdWlsZCB0aGUgTExWTSogT3Blbk1QKiBPZmZsb2FkaW5nIFJ1bnRpbWUgTGlicmFyeSAobGlib21wdGFyZ2V0KQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJbi10cmVlIGJ1aWxkOgorCiskIGNkIHdoZXJlLXlvdS13YW50LXRvLWxpdmUKK0NoZWNrIG91dCBvcGVubXAgKGxpYm9tcHRhcmdldCBsaXZlcyB1bmRlciAuL2xpYm9tcHRhcmdldCkgaW50byBsbHZtL3Byb2plY3RzCiskIGNkIHdoZXJlLXlvdS13YW50LXRvLWJ1aWxkCiskIG1rZGlyIGJ1aWxkICYmIGNkIGJ1aWxkCiskIGNtYWtlIHBhdGgvdG8vbGx2bSAtRENNQUtFX0NfQ09NUElMRVI9PEMgY29tcGlsZXI+IC1EQ01BS0VfQ1hYX0NPTVBJTEVSPTxDKysgY29tcGlsZXI+CiskIG1ha2Ugb21wdGFyZ2V0CisKK091dC1vZi10cmVlIGJ1aWxkOgorCiskIGNkIHdoZXJlLXlvdS13YW50LXRvLWxpdmUKK0NoZWNrIG91dCBvcGVubXAgKGxpYm9tcHRhcmdldCBsaXZlcyB1bmRlciAuL2xpYm9tcHRhcmdldCkKKyQgY2Qgd2hlcmUteW91LXdhbnQtdG8tbGl2ZS9vcGVubXAvbGlib21wdGFyZ2V0CiskIG1rZGlyIGJ1aWxkICYmIGNkIGJ1aWxkCiskIGNtYWtlIHBhdGgvdG8vb3Blbm1wIC1EQ01BS0VfQ19DT01QSUxFUj08QyBjb21waWxlcj4gLURDTUFLRV9DWFhfQ09NUElMRVI9PEMrKyBjb21waWxlcj4KKyQgbWFrZQorCitGb3IgZGV0YWlscyBhYm91dCBidWlsZGluZywgcGxlYXNlIGxvb2sgYXQgQnVpbGRfV2l0aF9DTWFrZS50eHQKKworQXJjaGl0ZWN0dXJlcyBTdXBwb3J0ZWQKKz09PT09PT09PT09PT09PT09PT09PT09CitUaGUgY3VycmVudCBsaWJyYXJ5IGhhcyBiZWVuIG9ubHkgdGVzdGVkIGluIExpbnV4IG9wZXJhdGluZyBzeXN0ZW0gYW5kIHRoZSAKK2ZvbGxvd2luZyBob3N0IGFyY2hpdGVjdHVyZXM6IAorKiBJbnRlbChSKSA2NCBhcmNoaXRlY3R1cmUKKyogSUJNKFIpIFBvd2VyIGFyY2hpdGVjdHVyZSAoYmlnIGVuZGlhbikKKyogSUJNKFIpIFBvd2VyIGFyY2hpdGVjdHVyZSAobGl0dGxlIGVuZGlhbikKKyogQVJNKFIpIEFBcmNoNjQgYXJjaGl0ZWN0dXJlIChsaXR0bGUgZW5kaWFuKQorCitUaGUgY3VycmVudGx5IHN1cHBvcnRlZCBvZmZsb2FkaW5nIGRldmljZSBhcmNoaXRlY3R1cmVzIGFyZToKKyogSW50ZWwoUikgNjQgYXJjaGl0ZWN0dXJlIChnZW5lcmljIDY0LWJpdCBwbHVnaW4gLSBtb3N0bHkgZm9yIHRlc3RpbmcgcHVycG9zZXMpCisqIElCTShSKSBQb3dlciBhcmNoaXRlY3R1cmUgKGJpZyBlbmRpYW4pIChnZW5lcmljIDY0LWJpdCBwbHVnaW4gLSBtb3N0bHkgZm9yIHRlc3RpbmcgcHVycG9zZXMpCisqIElCTShSKSBQb3dlciBhcmNoaXRlY3R1cmUgKGxpdHRsZSBlbmRpYW4pIChnZW5lcmljIDY0LWJpdCBwbHVnaW4gLSBtb3N0bHkgZm9yIHRlc3RpbmcgcHVycG9zZXMpCisqIEFSTShSKSBBQXJjaDY0IGFyY2hpdGVjdHVyZSAobGl0dGxlIGVuZGlhbikgKGdlbmVyaWMgNjQtYml0IHBsdWdpbiAtIG1vc3RseSBmb3IgdGVzdGluZyBwdXJwb3NlcykKKyogQ1VEQShSKSBlbmFibGVkIDY0LWJpdCBOVklESUEoUikgR1BVIGFyY2hpdGVjdHVyZXMKKworU3VwcG9ydGVkIFJUTCBCdWlsZCBDb25maWd1cmF0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorU3VwcG9ydGVkIEFyY2hpdGVjdHVyZXM6IEludGVsKFIpIDY0LCBJQk0oUikgUG93ZXIgNyBhbmQgUG93ZXIgOAorCisgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICB8ICAgZ2NjICAgICAgfCAgIGNsYW5nICAgIHwKKy0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS18Cit8IExpbnV4KiBPUyAgIHwgIFllcygxKSAgICB8ICBZZXMoMikgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKDEpIGdjYyB2ZXJzaW9uIDQuOC4yIG9yIGxhdGVyIGlzIHN1cHBvcnRlZC4KKygyKSBjbGFuZyB2ZXJzaW9uIDMuNyBvciBsYXRlciBpcyBzdXBwb3J0ZWQuCisKKworRnJvbnQtZW5kIENvbXBpbGVycyB0aGF0IHdvcmsgd2l0aCB0aGlzIFJUTAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgZm9sbG93aW5nIGNvbXBpbGVycyBhcmUga25vd24gdG8gZG8gY29tcGF0aWJsZSBjb2RlIGdlbmVyYXRpb24gZm9yCit0aGlzIFJUTDogCisgIC0gY2xhbmcgKGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2NsYW5nLXlrdCApCisgIC0gY2xhbmcgKGRldmVsb3BtZW50IGJyYW5jaCBhdCBodHRwOi8vY2xhbmcubGx2bS5vcmcgLSBzZXZlcmFsIGZlYXR1cmVzIHN0aWxsIAorICAgIHVuZGVyIGRldmVsb3BtZW50KQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOb3RpY2VzCis9PT09PT09CitUaGlzIGxpYnJhcnkgYW5kIHJlbGF0ZWQgY29tcGlsZXIgc3VwcG9ydCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCwgc28gdGhlIAorZW1wbG95ZWQgaW50ZXJmYWNlIGlzIGxpa2VseSB0byBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KKworKk90aGVyIG5hbWVzIGFuZCBicmFuZHMgbWF5IGJlIGNsYWltZWQgYXMgdGhlIHByb3BlcnR5IG9mIG90aGVycy4KKwpkaWZmIC0tZ2l0IGEvZmluYWwvbGlib21wdGFyZ2V0L2NtYWtlL01vZHVsZXMvTGlib21wdGFyZ2V0R2V0RGVwZW5kZW5jaWVzLmNtYWtlIGIvZmluYWwvbGlib21wdGFyZ2V0L2NtYWtlL01vZHVsZXMvTGlib21wdGFyZ2V0R2V0RGVwZW5kZW5jaWVzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MjI3YzAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9saWJvbXB0YXJnZXQvY21ha2UvTW9kdWxlcy9MaWJvbXB0YXJnZXRHZXREZXBlbmRlbmNpZXMuY21ha2UKQEAgLTAsMCArMSwxMjQgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyBUcnkgdG8gZGV0ZWN0IGluIHRoZSBzeXN0ZW0gc2V2ZXJhbCBkZXBlbmRlbmNpZXMgcmVxdWlyZWQgYnkgdGhlIGRpZmZlcmVudAorIyBjb21wb25lbnRzIG9mIGxpYm9tcHRhcmdldC4gVGhlc2UgYXJlIHRoZSBkZXBlbmRlbmNpZXMgd2UgaGF2ZToKKyMKKyMgbGliZWxmIDogcmVxdWlyZWQgYnkgc29tZSB0YXJnZXRzIHRvIGhhbmRsZSB0aGUgRUxGIGZpbGVzIGF0IHJ1bnRpbWUuCisjIGxpYmZmaSA6IHJlcXVpcmVkIHRvIGxhdW5jaCB0YXJnZXQga2VybmVscyBnaXZlbiBmdW5jdGlvbiBhbmQgYXJndW1lbnQgCisjICAgICAgICAgIHBvaW50ZXJzLgorIyBDVURBIDogcmVxdWlyZWQgdG8gY29udHJvbCBvZmZsb2FkaW5nIHRvIE5WSURJQSBHUFVzLgorCitpbmNsdWRlIChGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTG9va2luZyBmb3IgbGliZWxmLi4uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitmaW5kX3BhdGggKAorICBMSUJPTVBUQVJHRVRfREVQX0xJQkVMRl9JTkNMVURFX0RJUgorICBOQU1FUworICAgIGxpYmVsZi5oCisgIFBBVEhTCisgICAgL3Vzci9pbmNsdWRlCisgICAgL3Vzci9sb2NhbC9pbmNsdWRlCisgICAgL29wdC9sb2NhbC9pbmNsdWRlCisgICAgL3N3L2luY2x1ZGUKKyAgICBFTlYgQ1BBVEgKKyAgUEFUSF9TVUZGSVhFUworICAgIGxpYmVsZikKKworZmluZF9saWJyYXJ5ICgKKyAgTElCT01QVEFSR0VUX0RFUF9MSUJFTEZfTElCUkFSSUVTCisgIE5BTUVTCisgICAgZWxmCisgIFBBVEhTCisgICAgL3Vzci9saWIKKyAgICAvdXNyL2xvY2FsL2xpYgorICAgIC9vcHQvbG9jYWwvbGliCisgICAgL3N3L2xpYgorICAgIEVOViBMSUJSQVJZX1BBVEgKKyAgICBFTlYgTERfTElCUkFSWV9QQVRIKQorICAgIAorc2V0KExJQk9NUFRBUkdFVF9ERVBfTElCRUxGX0lOQ0xVREVfRElSUyAke0xJQk9NUFRBUkdFVF9ERVBfTElCRUxGX0lOQ0xVREVfRElSfSkKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncygKKyAgTElCT01QVEFSR0VUX0RFUF9MSUJFTEYgCisgIERFRkFVTFRfTVNHCisgIExJQk9NUFRBUkdFVF9ERVBfTElCRUxGX0xJQlJBUklFUworICBMSUJPTVBUQVJHRVRfREVQX0xJQkVMRl9JTkNMVURFX0RJUlMpCisKK21hcmtfYXNfYWR2YW5jZWQoCisgIExJQk9NUFRBUkdFVF9ERVBfTElCRUxGX0lOQ0xVREVfRElSUyAKKyAgTElCT01QVEFSR0VUX0RFUF9MSUJFTEZfTElCUkFSSUVTKQorICAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIExvb2tpbmcgZm9yIGxpYmZmaS4uLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2ZpbmRfcGFja2FnZShQa2dDb25maWcpCisKK3BrZ19jaGVja19tb2R1bGVzKExJQk9NUFRBUkdFVF9TRUFSQ0hfTElCRkZJIFFVSUVUIGxpYmZmaSkKKworZmluZF9wYXRoICgKKyAgTElCT01QVEFSR0VUX0RFUF9MSUJGRklfSU5DTFVERV9ESVIKKyAgTkFNRVMKKyAgICBmZmkuaAorICBISU5UUworICAgICR7TElCT01QVEFSR0VUX1NFQVJDSF9MSUJGRklfSU5DTFVERURJUn0KKyAgICAke0xJQk9NUFRBUkdFVF9TRUFSQ0hfTElCRkZJX0lOQ0xVREVfRElSU30KKyAgUEFUSFMKKyAgICAvdXNyL2luY2x1ZGUKKyAgICAvdXNyL2xvY2FsL2luY2x1ZGUKKyAgICAvb3B0L2xvY2FsL2luY2x1ZGUKKyAgICAvc3cvaW5jbHVkZQorICAgIEVOViBDUEFUSCkKKworIyBEb24ndCBib3RoZXIgbG9vayBmb3IgdGhlIGxpYnJhcnkgaWYgdGhlIGhlYWRlciBmaWxlcyB3ZXJlIG5vdCBmb3VuZC4KK2lmIChMSUJPTVBUQVJHRVRfREVQX0xJQkZGSV9JTkNMVURFX0RJUikKKyAgZmluZF9saWJyYXJ5ICgKKyAgICAgIExJQk9NUFRBUkdFVF9ERVBfTElCRkZJX0xJQlJBUklFUworICAgIE5BTUVTCisgICAgICBmZmkKKyAgICBISU5UUworICAgICAgJHtMSUJPTVBUQVJHRVRfU0VBUkNIX0xJQkZGSV9MSUJESVJ9CisgICAgICAke0xJQk9NUFRBUkdFVF9TRUFSQ0hfTElCRkZJX0xJQlJBUllfRElSU30KKyAgICBQQVRIUworICAgICAgL3Vzci9saWIKKyAgICAgIC91c3IvbG9jYWwvbGliCisgICAgICAvb3B0L2xvY2FsL2xpYgorICAgICAgL3N3L2xpYgorICAgICAgRU5WIExJQlJBUllfUEFUSAorICAgICAgRU5WIExEX0xJQlJBUllfUEFUSCkKK2VuZGlmKCkKKworc2V0KExJQk9NUFRBUkdFVF9ERVBfTElCRkZJX0lOQ0xVREVfRElSUyAke0xJQk9NUFRBUkdFVF9ERVBfTElCRkZJX0lOQ0xVREVfRElSfSkKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncygKKyAgTElCT01QVEFSR0VUX0RFUF9MSUJGRkkgCisgIERFRkFVTFRfTVNHCisgIExJQk9NUFRBUkdFVF9ERVBfTElCRkZJX0xJQlJBUklFUworICBMSUJPTVBUQVJHRVRfREVQX0xJQkZGSV9JTkNMVURFX0RJUlMpCisKK21hcmtfYXNfYWR2YW5jZWQoCisgIExJQk9NUFRBUkdFVF9ERVBfTElCRkZJX0lOQ0xVREVfRElSUyAKKyAgTElCT01QVEFSR0VUX0RFUF9MSUJGRklfTElCUkFSSUVTKQorICAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIExvb2tpbmcgZm9yIENVREEuLi4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitmaW5kX3BhY2thZ2UoQ1VEQSBRVUlFVCkKKworc2V0KExJQk9NUFRBUkdFVF9ERVBfQ1VEQV9GT1VORCAke0NVREFfRk9VTkR9KQorc2V0KExJQk9NUFRBUkdFVF9ERVBfQ1VEQV9MSUJSQVJJRVMgJHtDVURBX0xJQlJBUklFU30pCitzZXQoTElCT01QVEFSR0VUX0RFUF9DVURBX0lOQ0xVREVfRElSUyAke0NVREFfSU5DTFVERV9ESVJTfSkKKworbWFya19hc19hZHZhbmNlZCgKKyAgTElCT01QVEFSR0VUX0RFUF9DVURBX0ZPVU5EIAorICBMSUJPTVBUQVJHRVRfREVQX0NVREFfSU5DTFVERV9ESVJTCisgIExJQk9NUFRBUkdFVF9ERVBfQ1VEQV9MSUJSQVJJRVMpCmRpZmYgLS1naXQgYS9maW5hbC9saWJvbXB0YXJnZXQvY21ha2UvTW9kdWxlcy9MaWJvbXB0YXJnZXRVdGlscy5jbWFrZSBiL2ZpbmFsL2xpYm9tcHRhcmdldC9jbWFrZS9Nb2R1bGVzL0xpYm9tcHRhcmdldFV0aWxzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NjQ5MDMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9saWJvbXB0YXJnZXQvY21ha2UvTW9kdWxlcy9MaWJvbXB0YXJnZXRVdGlscy5jbWFrZQpAQCAtMCwwICsxLDI4IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgdm9pZCBsaWJvbXB0YXJnZXRfc2F5KHN0cmluZyBtZXNzYWdlX3RvX3VzZXIpOworIyAtIHByaW50cyBvdXQgbWVzc2FnZV90b191c2VyCittYWNybyhsaWJvbXB0YXJnZXRfc2F5IG1lc3NhZ2VfdG9fdXNlcikKKyAgbWVzc2FnZShTVEFUVVMgIkxJQk9NUFRBUkdFVDogJHttZXNzYWdlX3RvX3VzZXJ9IikKK2VuZG1hY3JvKCkKKworIyB2b2lkIGxpYm9tcHRhcmdldF93YXJuaW5nX3NheShzdHJpbmcgbWVzc2FnZV90b191c2VyKTsKKyMgLSBwcmludHMgb3V0IG1lc3NhZ2VfdG9fdXNlciB3aXRoIGEgd2FybmluZworbWFjcm8obGlib21wdGFyZ2V0X3dhcm5pbmdfc2F5IG1lc3NhZ2VfdG9fdXNlcikKKyAgbWVzc2FnZShXQVJOSU5HICJMSUJPTVBUQVJHRVQ6ICR7bWVzc2FnZV90b191c2VyfSIpCitlbmRtYWNybygpCisKKyMgdm9pZCBsaWJvbXB0YXJnZXRfZXJyb3Jfc2F5KHN0cmluZyBtZXNzYWdlX3RvX3VzZXIpOworIyAtIHByaW50cyBvdXQgbWVzc2FnZV90b191c2VyIHdpdGggYW4gZXJyb3IgYW5kIGV4aXRzIGNtYWtlCittYWNybyhsaWJvbXB0YXJnZXRfZXJyb3Jfc2F5IG1lc3NhZ2VfdG9fdXNlcikKKyAgbWVzc2FnZShGQVRBTF9FUlJPUiAiTElCT01QVEFSR0VUOiAke21lc3NhZ2VfdG9fdXNlcn0iKQorZW5kbWFjcm8oKQpkaWZmIC0tZ2l0IGEvZmluYWwvbGlib21wdGFyZ2V0L2NtYWtlL01vZHVsZXMvY29uZmlnLWl4LmNtYWtlIGIvZmluYWwvbGlib21wdGFyZ2V0L2NtYWtlL01vZHVsZXMvY29uZmlnLWl4LmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNDQyNzAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9saWJvbXB0YXJnZXQvY21ha2UvTW9kdWxlcy9jb25maWctaXguY21ha2UKQEAgLTAsMCArMSwxNyBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCitpbmNsdWRlKENoZWNrQ0NvbXBpbGVyRmxhZykKK2luY2x1ZGUoQ2hlY2tDWFhDb21waWxlckZsYWcpCisKKyMgQ2hlY2tpbmcgQywgQ1hYCitjaGVja19jeHhfY29tcGlsZXJfZmxhZygtc3RkPWMrKzExIExJQk9NUFRBUkdFVF9IQVZFX1NURF9DUFAxMV9GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1XZXJyb3IgTElCT01QVEFSR0VUX0hBVkVfV0VSUk9SX0ZMQUcpCmRpZmYgLS1naXQgYS9maW5hbC9saWJvbXB0YXJnZXQvZXhwb3J0cyBiL2ZpbmFsL2xpYm9tcHRhcmdldC9leHBvcnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMTQ3NTEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9saWJvbXB0YXJnZXQvZXhwb3J0cwpAQCAtMCwwICsxLDI4IEBACitWRVJTMS4wIHsKKyAgZ2xvYmFsOgorICAgIF9fdGd0X3JlZ2lzdGVyX2xpYjsKKyAgICBfX3RndF91bnJlZ2lzdGVyX2xpYjsKKyAgICBfX3RndF90YXJnZXRfZGF0YV9iZWdpbjsKKyAgICBfX3RndF90YXJnZXRfZGF0YV9lbmQ7CisgICAgX190Z3RfdGFyZ2V0X2RhdGFfdXBkYXRlOworICAgIF9fdGd0X3RhcmdldDsKKyAgICBfX3RndF90YXJnZXRfdGVhbXM7CisgICAgX190Z3RfdGFyZ2V0X2RhdGFfYmVnaW5fbm93YWl0OworICAgIF9fdGd0X3RhcmdldF9kYXRhX2VuZF9ub3dhaXQ7CisgICAgX190Z3RfdGFyZ2V0X2RhdGFfdXBkYXRlX25vd2FpdDsKKyAgICBfX3RndF90YXJnZXRfbm93YWl0OworICAgIF9fdGd0X3RhcmdldF90ZWFtc19ub3dhaXQ7CisgICAgb21wX2dldF9udW1fZGV2aWNlczsKKyAgICBvbXBfZ2V0X2luaXRpYWxfZGV2aWNlOworICAgIG9tcF90YXJnZXRfYWxsb2M7CisgICAgb21wX3RhcmdldF9mcmVlOworICAgIG9tcF90YXJnZXRfaXNfcHJlc2VudDsKKyAgICBvbXBfdGFyZ2V0X21lbWNweTsKKyAgICBvbXBfdGFyZ2V0X21lbWNweV9yZWN0OworICAgIG9tcF90YXJnZXRfYXNzb2NpYXRlX3B0cjsKKyAgICBvbXBfdGFyZ2V0X2Rpc2Fzc29jaWF0ZV9wdHI7CisgICAgX19rbXBjX3B1c2hfdGFyZ2V0X3RyaXBjb3VudDsKKyAgbG9jYWw6CisgICAgKjsKK307CisKZGlmZiAtLWdpdCBhL2ZpbmFsL2xpYm9tcHRhcmdldC9wbHVnaW5zL0NNYWtlTGlzdHMudHh0IGIvZmluYWwvbGlib21wdGFyZ2V0L3BsdWdpbnMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg2YzIzMQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL2xpYm9tcHRhcmdldC9wbHVnaW5zL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNzIgQEAKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisjIAorIyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjCisjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMgU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjIAorIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKyMKKyMgQnVpbGQgcGx1Z2lucyBmb3IgdGhlIHVzZXIgc3lzdGVtIGlmIGF2YWlsYWJsZS4KKyMKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisKKyMgdm9pZCBidWlsZF9nZW5lcmljX2VsZjY0KHN0cmluZyB0bWFjaGluZSwgc3RyaW5nIHRtYWNoaW5lX25hbWUsIHN0cmluZyB0bWFjaGluZV9saWJuYW1lLCBzdHJpbmcgZWxmX21hY2hpbmVfaWQpOworIyAtIGJ1aWxkIGEgcGx1Z2luIGZvciBhbiBFTEYgYmFzZWQgZ2VuZXJpYyA2NC1iaXQgdGFyZ2V0IGJhc2VkIG9uIGxpYmZmaS4KKyMgLSB0bWFjaGluZTogbmFtZSBvZiB0aGUgbWFjaGluZSBwcm9jZXNzb3IgYXMgdXNlZCBpbiB0aGUgY21ha2UgYnVpbGQgc3lzdGVtLgorIyAtIHRtYWNoaW5lX25hbWU6IG5hbWUgb2YgdGhlIG1hY2hpbmUgdG8gYmUgcHJpbnRlZCB3aXRoIHRoZSBkZWJ1ZyBtZXNzYWdlcy4KKyMgLSB0bWFjaGluZV9saWJuYW1lOiBtYWNoaW5lIG5hbWUgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIHBsdWdpbiBsaWJyYXJ5IG5hbWUuCittYWNybyhidWlsZF9nZW5lcmljX2VsZjY0IHRtYWNoaW5lIHRtYWNoaW5lX25hbWUgdG1hY2hpbmVfbGlibmFtZSB0bWFjaGluZV90cmlwbGUgZWxmX21hY2hpbmVfaWQpCitpZihDTUFLRV9TWVNURU1fUFJPQ0VTU09SIE1BVENIRVMgIiR7dG1hY2hpbmV9JCIpCisgIGlmKExJQk9NUFRBUkdFVF9ERVBfTElCRUxGX0ZPVU5EKQorICAgIGlmKExJQk9NUFRBUkdFVF9ERVBfTElCRkZJX0ZPVU5EKQorICAgIAorICAgICAgbGlib21wdGFyZ2V0X3NheSgiQnVpbGRpbmcgJHt0bWFjaGluZV9uYW1lfSBvZmZsb2FkaW5nIHBsdWdpbi4iKQorICAgIAorICAgICAgaW5jbHVkZV9kaXJlY3Rvcmllcygke0xJQk9NUFRBUkdFVF9ERVBfTElCRkZJX0lOQ0xVREVfRElSfSkKKyAgICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtMSUJPTVBUQVJHRVRfREVQX0xJQkVMRl9JTkNMVURFX0RJUn0pCisgICAgICAKKyAgICAgICMgRGVmaW5lIG1hY3JvIHRvIGJlIHVzZWQgYXMgcHJlZml4IG9mIHRoZSBydW50aW1lIG1lc3NhZ2VzIGZvciB0aGlzIHRhcmdldC4KKyAgICAgIGFkZF9kZWZpbml0aW9ucygiLURUQVJHRVRfTkFNRT0ke3RtYWNoaW5lX25hbWV9IikKKyAgICAgIAorICAgICAgIyBEZWZpbmUgbWFjcm8gd2l0aCB0aGUgRUxGIElEIGZvciB0aGlzIHRhcmdldC4KKyAgICAgIGFkZF9kZWZpbml0aW9ucygiLURUQVJHRVRfRUxGX0lEPSR7ZWxmX21hY2hpbmVfaWR9IikKKyAgICAKKyAgICAgIGFkZF9saWJyYXJ5KCJvbXB0YXJnZXQucnRsLiR7dG1hY2hpbmVfbGlibmFtZX0iIFNIQVJFRCAKKyAgICAgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uL2dlbmVyaWMtZWxmLTY0Yml0L3NyYy9ydGwuY3BwKQorICAgICAgICAKKyAgICAgICMgSW5zdGFsbCBwbHVnaW4gdW5kZXIgdGhlIGxpYiBkZXN0aW5hdGlvbiBmb2xkZXIuCisgICAgICBpbnN0YWxsKFRBUkdFVFMgIm9tcHRhcmdldC5ydGwuJHt0bWFjaGluZV9saWJuYW1lfSIgCisgICAgICAgIExJQlJBUlkgREVTVElOQVRJT04gbGliJHtMSUJPTVBUQVJHRVRfTElCRElSX1NVRkZJWH0pCisgICAgICAgIAorICAgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKAorICAgICAgICAib21wdGFyZ2V0LnJ0bC4ke3RtYWNoaW5lX2xpYm5hbWV9IgorICAgICAgICAke0xJQk9NUFRBUkdFVF9ERVBfTElCRkZJX0xJQlJBUklFU30gCisgICAgICAgICR7TElCT01QVEFSR0VUX0RFUF9MSUJFTEZfTElCUkFSSUVTfQorICAgICAgICBkbAorICAgICAgICAiLVdsLC0tdmVyc2lvbi1zY3JpcHQ9JHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uL2V4cG9ydHMiKQorICAgIAorICAgICAgIyBSZXBvcnQgdG8gdGhlIHBhcmVudCBzY29wZSB0aGF0IHdlIGFyZSBidWlsZGluZyBhIHBsdWdpbi4KKyAgICAgIHNldChMSUJPTVBUQVJHRVRfU1lTVEVNX1RBUkdFVFMgCisgICAgICAgICIke0xJQk9NUFRBUkdFVF9TWVNURU1fVEFSR0VUU30gJHt0bWFjaGluZV90cmlwbGV9IiBQQVJFTlRfU0NPUEUpCisgICAgICAKKyAgICBlbHNlKExJQk9NUFRBUkdFVF9ERVBfTElCRkZJX0ZPVU5EKQorICAgICAgbGlib21wdGFyZ2V0X3NheSgiTm90IGJ1aWxkaW5nICR7dG1hY2hpbmVfbmFtZX0gb2ZmbG9hZGluZyBwbHVnaW46IGxpYmZmaSBkZXBlbmRlbmN5IG5vdCBmb3VuZC4iKQorICAgIGVuZGlmKExJQk9NUFRBUkdFVF9ERVBfTElCRkZJX0ZPVU5EKQorICBlbHNlKExJQk9NUFRBUkdFVF9ERVBfTElCRUxGX0ZPVU5EKQorICAgIGxpYm9tcHRhcmdldF9zYXkoIk5vdCBidWlsZGluZyAke3RtYWNoaW5lX25hbWV9IG9mZmxvYWRpbmcgcGx1Z2luOiBsaWJlbGYgZGVwZW5kZW5jeSBub3QgZm91bmQuIikKKyAgZW5kaWYoTElCT01QVEFSR0VUX0RFUF9MSUJFTEZfRk9VTkQpCitlbHNlKCkKKyAgbGlib21wdGFyZ2V0X3NheSgiTm90IGJ1aWxkaW5nICR7dG1hY2hpbmVfbmFtZX0gb2ZmbG9hZGluZyBwbHVnaW46IG1hY2hpbmUgbm90IGZvdW5kIGluIHRoZSBzeXN0ZW0uIikKK2VuZGlmKCkKK2VuZG1hY3JvKCkKKworYWRkX3N1YmRpcmVjdG9yeShhYXJjaDY0KQorYWRkX3N1YmRpcmVjdG9yeShjdWRhKQorYWRkX3N1YmRpcmVjdG9yeShwcGM2NCkKK2FkZF9zdWJkaXJlY3RvcnkocHBjNjRsZSkKK2FkZF9zdWJkaXJlY3RvcnkoeDg2XzY0KQorCisjIE1ha2Ugc3VyZSB0aGUgcGFyZW50IHNjb3BlIGNhbiBzZWUgdGhlIHBsdWdpbnMgdGhhdCB3aWxsIGJlIGNyZWF0ZWQuCitzZXQoTElCT01QVEFSR0VUX1NZU1RFTV9UQVJHRVRTICIke0xJQk9NUFRBUkdFVF9TWVNURU1fVEFSR0VUU30iIFBBUkVOVF9TQ09QRSkKKwpkaWZmIC0tZ2l0IGEvZmluYWwvbGlib21wdGFyZ2V0L3BsdWdpbnMvYWFyY2g2NC9DTWFrZUxpc3RzLnR4dCBiL2ZpbmFsL2xpYm9tcHRhcmdldC9wbHVnaW5zL2FhcmNoNjQvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNhNzZiOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL2xpYm9tcHRhcmdldC9wbHVnaW5zL2FhcmNoNjQvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxOCBAQAorIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKyMKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKyMKKyMgQnVpbGQgYSBwbHVnaW4gZm9yIGFuIGFhcmNoNjQgbWFjaGluZSBpZiBhdmFpbGFibGUuCisjCisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworCitpZihDTUFLRV9TWVNURU1fTkFNRSBNQVRDSEVTICJMaW51eCIpCisgIGJ1aWxkX2dlbmVyaWNfZWxmNjQoImFhcmNoNjQiICJhYXJjaDY0IiAiYWFyY2g2NCIgImFhcmNoNjQtdW5rbm93bi1saW51eC1nbnUiICIxODMiKQorZWxzZSgpCisgbGlib21wdGFyZ2V0X3NheSgiTm90IGJ1aWxkaW5nIGFhcmNoNjQgb2ZmbG9hZGluZyBwbHVnaW46IG1hY2hpbmUgbm90IGZvdW5kIGluIHRoZSBzeXN0ZW0uIikKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL2ZpbmFsL2xpYm9tcHRhcmdldC9wbHVnaW5zL2NvbW1vbi9lbGZfY29tbW9uLmMgYi9maW5hbC9saWJvbXB0YXJnZXQvcGx1Z2lucy9jb21tb24vZWxmX2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkODU1NzUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9saWJvbXB0YXJnZXQvcGx1Z2lucy9jb21tb24vZWxmX2NvbW1vbi5jCkBAIC0wLDAgKzEsNzMgQEAKKy8vPT09LS0gZWxmX2NvbW1vbi5jIC0gQ29tbW9uIEVMRiBmdW5jdGlvbmFsaXR5IC0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQ29tbW9uIEVMRiBmdW5jdGlvbmFsaXR5IGZvciB0YXJnZXQgcGx1Z2lucy4KKy8vIE11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIHBsdWdpbiBzb3VyY2UgZmlsZSBBRlRFUiBvbXB0YXJnZXQuaCBoYXMgYmVlbgorLy8gaW5jbHVkZWQgYW5kIG1hY3JvIERQKC4uLikgaGFzIGJlZW4gZGVmaW5lZC4KKy8vIC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWYgIShkZWZpbmVkKF9PTVBUQVJHRVRfSF8pICYmIGRlZmluZWQoRFApKQorI2Vycm9yIEluY2x1ZGUgZWxmX2NvbW1vbi5jIGluIHRoZSBwbHVnaW4gc291cmNlIEFGVEVSIG9tcHRhcmdldC5oIGhhcyBiZWVuXAorIGluY2x1ZGVkIGFuZCBtYWNybyBEUCguLi4pIGhhcyBiZWVuIGRlZmluZWQuCisjZW5kaWYKKworI2luY2x1ZGUgPGVsZi5oPgorI2luY2x1ZGUgPGxpYmVsZi5oPgorCisvLyBDaGVjayB3aGV0aGVyIGFuIGltYWdlIGlzIHZhbGlkIGZvciBleGVjdXRpb24gb24gdGFyZ2V0X2lkCitzdGF0aWMgaW5saW5lIGludDMyX3QgZWxmX2NoZWNrX21hY2hpbmUoX190Z3RfZGV2aWNlX2ltYWdlICppbWFnZSwKKyAgICB1aW50MTZfdCB0YXJnZXRfaWQpIHsKKworICAvLyBJcyB0aGUgbGlicmFyeSB2ZXJzaW9uIGluY29tcGF0aWJsZSB3aXRoIHRoZSBoZWFkZXIgZmlsZT8KKyAgaWYgKGVsZl92ZXJzaW9uKEVWX0NVUlJFTlQpID09IEVWX05PTkUpIHsKKyAgICBEUCgiSW5jb21wYXRpYmxlIEVMRiBsaWJyYXJ5IVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBjaGFyICppbWdfYmVnaW4gPSAoY2hhciAqKWltYWdlLT5JbWFnZVN0YXJ0OworICBjaGFyICppbWdfZW5kID0gKGNoYXIgKilpbWFnZS0+SW1hZ2VFbmQ7CisgIHNpemVfdCBpbWdfc2l6ZSA9IGltZ19lbmQgLSBpbWdfYmVnaW47CisKKyAgLy8gT2J0YWluIGVsZiBoYW5kbGVyCisgIEVsZiAqZSA9IGVsZl9tZW1vcnkoaW1nX2JlZ2luLCBpbWdfc2l6ZSk7CisgIGlmICghZSkgeworICAgIERQKCJVbmFibGUgdG8gZ2V0IEVMRiBoYW5kbGU6ICVzIVxuIiwgZWxmX2Vycm1zZygtMSkpOworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gQ2hlY2sgaWYgRUxGIGlzIHRoZSByaWdodCBraW5kLgorICBpZiAoZWxmX2tpbmQoZSkgIT0gRUxGX0tfRUxGKSB7CisgICAgRFAoIlVuZXhwZWN0ZWQgRUxGIHR5cGUhXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBFbGY2NF9FaGRyICplaDY0ID0gZWxmNjRfZ2V0ZWhkcihlKTsKKyAgRWxmMzJfRWhkciAqZWgzMiA9IGVsZjMyX2dldGVoZHIoZSk7CisKKyAgaWYgKCFlaDY0ICYmICFlaDMyKSB7CisgICAgRFAoIlVuYWJsZSB0byBnZXQgbWFjaGluZSBJRCBmcm9tIEVMRiBmaWxlIVxuIik7CisgICAgZWxmX2VuZChlKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHVpbnQxNl90IE1hY2hpbmVJRDsKKyAgaWYgKGVoNjQgJiYgIWVoMzIpCisgICAgTWFjaGluZUlEID0gZWg2NC0+ZV9tYWNoaW5lOworICBlbHNlIGlmIChlaDMyICYmICFlaDY0KQorICAgIE1hY2hpbmVJRCA9IGVoMzItPmVfbWFjaGluZTsKKyAgZWxzZSB7CisgICAgRFAoIkFtYmlndW91cyBFTEYgaGVhZGVyIVxuIik7CisgICAgZWxmX2VuZChlKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGVsZl9lbmQoZSk7CisgIHJldHVybiBNYWNoaW5lSUQgPT0gdGFyZ2V0X2lkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvbGlib21wdGFyZ2V0L3BsdWdpbnMvY3VkYS9DTWFrZUxpc3RzLnR4dCBiL2ZpbmFsL2xpYm9tcHRhcmdldC9wbHVnaW5zL2N1ZGEvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg0MDgzYwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL2xpYm9tcHRhcmdldC9wbHVnaW5zL2N1ZGEvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw1MCBAQAorIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKyMgCisjICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMgCisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworIworIyBCdWlsZCBhIHBsdWdpbiBmb3IgYSBDVURBIG1hY2hpbmUgaWYgYXZhaWxhYmxlLgorIworIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKK2lmKExJQk9NUFRBUkdFVF9ERVBfTElCRUxGX0ZPVU5EKQorICBpZihMSUJPTVBUQVJHRVRfREVQX0NVREFfRk9VTkQpCisgICAgaWYoQ01BS0VfU1lTVEVNX1BST0NFU1NPUiBNQVRDSEVTICIoeDg2XzY0KXwocHBjNjRsZSkkIiBBTkQgQ01BS0VfU1lTVEVNX05BTUUgTUFUQ0hFUyAiTGludXgiKQorICAgIAorICAgICAgbGlib21wdGFyZ2V0X3NheSgiQnVpbGRpbmcgQ1VEQSBvZmZsb2FkaW5nIHBsdWdpbi4iKQorICAgIAorICAgICAgIyBEZWZpbmUgdGhlIHN1ZmZpeCBmb3IgdGhlIHJ1bnRpbWUgbWVzc2FnaW5nIGR1bXBzLgorICAgICAgYWRkX2RlZmluaXRpb25zKC1EVEFSR0VUX05BTUU9Q1VEQSkKKyAgICAKKyAgICAgIGlmKExJQk9NUFRBUkdFVF9DTUFLRV9CVUlMRF9UWVBFIE1BVENIRVMgZGVidWcpCisgICAgICAgICAgYWRkX2RlZmluaXRpb25zKC1EQ1VEQV9FUlJPUl9SRVBPUlQpCisgICAgICBlbmRpZigpCisgICAgICAKKyAgICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtMSUJPTVBUQVJHRVRfREVQX0NVREFfSU5DTFVERV9ESVJTfSkKKyAgICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtMSUJPTVBUQVJHRVRfREVQX0xJQkVMRl9JTkNMVURFX0RJUlN9KQorICAgIAorICAgICAgYWRkX2xpYnJhcnkob21wdGFyZ2V0LnJ0bC5jdWRhIFNIQVJFRCBzcmMvcnRsLmNwcCkKKyAgICAgIAorICAgICAgIyBJbnN0YWxsIHBsdWdpbiB1bmRlciB0aGUgbGliIGRlc3RpbmF0aW9uIGZvbGRlci4KKyAgICAgIGluc3RhbGwoVEFSR0VUUyBvbXB0YXJnZXQucnRsLmN1ZGEgTElCUkFSWSBERVNUSU5BVElPTiBsaWIke0xJQk9NUFRBUkdFVF9MSUJESVJfU1VGRklYfSkKKyAgICAgIAorICAgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKG9tcHRhcmdldC5ydGwuY3VkYSAKKyAgICAgICAgJHtMSUJPTVBUQVJHRVRfREVQX0NVREFfTElCUkFSSUVTfSAKKyAgICAgICAgY3VkYSAKKyAgICAgICAgJHtMSUJPTVBUQVJHRVRfREVQX0xJQkVMRl9MSUJSQVJJRVN9CisgICAgICAgICItV2wsLS12ZXJzaW9uLXNjcmlwdD0ke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4vZXhwb3J0cyIpCisgICAgCisgICAgICAjIFJlcG9ydCB0byB0aGUgcGFyZW50IHNjb3BlIHRoYXQgd2UgYXJlIGJ1aWxkaW5nIGEgcGx1Z2luIGZvciBDVURBLgorICAgICAgc2V0KExJQk9NUFRBUkdFVF9TWVNURU1fVEFSR0VUUyAiJHtMSUJPTVBUQVJHRVRfU1lTVEVNX1RBUkdFVFN9IG52cHR4NjQtbnZpZGlhLWN1ZGEiIFBBUkVOVF9TQ09QRSkKKyAgICBlbHNlKCkKKyAgICAgIGxpYm9tcHRhcmdldF9zYXkoIk5vdCBidWlsZGluZyBDVURBIG9mZmxvYWRpbmcgcGx1Z2luOiBvbmx5IHN1cHBvcnQgQ1VEQSBpbiBMaW51eCB4ODZfNjQgb3IgcHBjNjRsZSBob3N0cy4iKQorICAgIGVuZGlmKCkKKyAgZWxzZSgpCisgICAgbGlib21wdGFyZ2V0X3NheSgiTm90IGJ1aWxkaW5nIENVREEgb2ZmbG9hZGluZyBwbHVnaW46IENVREEgbm90IGZvdW5kIGluIHN5c3RlbS4iKQorICBlbmRpZigpCitlbHNlKExJQk9NUFRBUkdFVF9ERVBfTElCRUxGX0ZPVU5EKQorICBsaWJvbXB0YXJnZXRfc2F5KCJOb3QgYnVpbGRpbmcgQ1VEQSBvZmZsb2FkaW5nIHBsdWdpbjogbGliZWxmIGRlcGVuZGVuY3kgbm90IGZvdW5kLiIpCitlbmRpZihMSUJPTVBUQVJHRVRfREVQX0xJQkVMRl9GT1VORCkKZGlmZiAtLWdpdCBhL2ZpbmFsL2xpYm9tcHRhcmdldC9wbHVnaW5zL2N1ZGEvc3JjL3J0bC5jcHAgYi9maW5hbC9saWJvbXB0YXJnZXQvcGx1Z2lucy9jdWRhL3NyYy9ydGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ODFjZjIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9saWJvbXB0YXJnZXQvcGx1Z2lucy9jdWRhL3NyYy9ydGwuY3BwCkBAIC0wLDAgKzEsNjk0IEBACisvLz09PS0tLS1SVExzL2N1ZGEvc3JjL3J0bC5jcHAgLSBUYXJnZXQgUlRMcyBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFJUTCBmb3IgQ1VEQSBtYWNoaW5lCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjdWRhLmg+CisjaW5jbHVkZSA8Y3VkYV9ydW50aW1lX2FwaS5oPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgIm9tcHRhcmdldHBsdWdpbi5oIgorCisjaWZuZGVmIFRBUkdFVF9OQU1FCisjZGVmaW5lIFRBUkdFVF9OQU1FIENVREEKKyNlbmRpZgorCisjZGVmaW5lIEdFVE5BTUUyKG5hbWUpICNuYW1lCisjZGVmaW5lIEdFVE5BTUUobmFtZSkgR0VUTkFNRTIobmFtZSkKKyNkZWZpbmUgRFAoLi4uKSBERUJVR1AoIlRhcmdldCAiIEdFVE5BTUUoVEFSR0VUX05BTUUpICIgUlRMIiwgX19WQV9BUkdTX18pCisKKyNpbmNsdWRlICIuLi8uLi9jb21tb24vZWxmX2NvbW1vbi5jIgorCisvLyBVdGlsaXR5IGZvciByZXRyaWV2aW5nIGFuZCBwcmludGluZyBDVURBIGVycm9yIHN0cmluZy4KKyNpZmRlZiBDVURBX0VSUk9SX1JFUE9SVAorI2RlZmluZSBDVURBX0VSUl9TVFJJTkcoZXJyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgY2hhciAqZXJyU3RyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGN1R2V0RXJyb3JTdHJpbmcoZXJyLCAmZXJyU3RyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBEUCgiQ1VEQSBlcnJvciBpczogJXNcbiIsIGVyclN0cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBDVURBX0VSUl9TVFJJTkcoZXJyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAge30KKyNlbmRpZgorCisvLy8gS2VlcCBlbnRyaWVzIHRhYmxlIHBlciBkZXZpY2UuCitzdHJ1Y3QgRnVuY09yR2JsRW50cnlUeSB7CisgIF9fdGd0X3RhcmdldF90YWJsZSBUYWJsZTsKKyAgc3RkOjp2ZWN0b3I8X190Z3Rfb2ZmbG9hZF9lbnRyeT4gRW50cmllczsKK307CisKK2VudW0gRXhlY3V0aW9uTW9kZVR5cGUgeworICBTUE1ELCAvLyBjb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzLAorICAgICAgICAvLyBjb21iaW5lZCBjb25zdHJ1Y3RzIChgdGVhbXMgZGlzdHJpYnV0ZSBwYXJhbGxlbCBmb3IgW3NpbWRdYCkKKyAgR0VORVJJQywgLy8gZXZlcnl0aGluZyBlbHNlCisgIE5PTkUKK307CisKKy8vLyBVc2UgYSBzaW5nbGUgZW50aXR5IHRvIGVuY29kZSBhIGtlcm5lbCBhbmQgYSBzZXQgb2YgZmxhZ3MKK3N0cnVjdCBLZXJuZWxUeSB7CisgIENVZnVuY3Rpb24gRnVuYzsKKworICAvLyBleGVjdXRpb24gbW9kZSBvZiBrZXJuZWwKKyAgLy8gMCAtIFNQTUQgbW9kZSAod2l0aG91dCBtYXN0ZXIgd2FycCkKKyAgLy8gMSAtIEdlbmVyaWMgbW9kZSAod2l0aCBtYXN0ZXIgd2FycCkKKyAgaW50OF90IEV4ZWN1dGlvbk1vZGU7CisKKyAgS2VybmVsVHkoQ1VmdW5jdGlvbiBfRnVuYywgaW50OF90IF9FeGVjdXRpb25Nb2RlKQorICAgICAgOiBGdW5jKF9GdW5jKSwgRXhlY3V0aW9uTW9kZShfRXhlY3V0aW9uTW9kZSkge30KK307CisKKy8vLyBMaXN0IHRoYXQgY29udGFpbnMgYWxsIHRoZSBrZXJuZWxzLgorLy8vIEZJWE1FOiB3ZSBtYXkgbmVlZCB0aGlzIHRvIGJlIHBlciBkZXZpY2UgYW5kIHBlciBsaWJyYXJ5Lgorc3RkOjpsaXN0PEtlcm5lbFR5PiBLZXJuZWxzTGlzdDsKKworLy8vIENsYXNzIGNvbnRhaW5pbmcgYWxsIHRoZSBkZXZpY2UgaW5mb3JtYXRpb24uCitjbGFzcyBSVExEZXZpY2VJbmZvVHkgeworICBzdGQ6OnZlY3RvcjxGdW5jT3JHYmxFbnRyeVR5PiBGdW5jR2JsRW50cmllczsKKworcHVibGljOgorICBpbnQgTnVtYmVyT2ZEZXZpY2VzOworICBzdGQ6OnZlY3RvcjxDVW1vZHVsZT4gTW9kdWxlczsKKyAgc3RkOjp2ZWN0b3I8Q1Vjb250ZXh0PiBDb250ZXh0czsKKworICAvLyBEZXZpY2UgcHJvcGVydGllcworICBzdGQ6OnZlY3RvcjxpbnQ+IFRocmVhZHNQZXJCbG9jazsKKyAgc3RkOjp2ZWN0b3I8aW50PiBCbG9ja3NQZXJHcmlkOworICBzdGQ6OnZlY3RvcjxpbnQ+IFdhcnBTaXplOworCisgIC8vIE9wZW5NUCBwcm9wZXJ0aWVzCisgIHN0ZDo6dmVjdG9yPGludD4gTnVtVGVhbXM7CisgIHN0ZDo6dmVjdG9yPGludD4gTnVtVGhyZWFkczsKKworICAvLyBPcGVuTVAgRW52aXJvbm1lbnQgcHJvcGVydGllcworICBpbnQgRW52TnVtVGVhbXM7CisgIGludCBFbnZUZWFtTGltaXQ7CisKKyAgLy9zdGF0aWMgaW50IEVudk51bVRocmVhZHM7CisgIHN0YXRpYyBjb25zdCBpbnQgSGFyZFRlYW1MaW1pdCA9IDE8PDE2OyAvLyA2NGsKKyAgc3RhdGljIGNvbnN0IGludCBIYXJkVGhyZWFkTGltaXQgPSAxMDI0OworICBzdGF0aWMgY29uc3QgaW50IERlZmF1bHROdW1UZWFtcyA9IDEyODsKKyAgc3RhdGljIGNvbnN0IGludCBEZWZhdWx0TnVtVGhyZWFkcyA9IDEyODsKKworICAvLyBSZWNvcmQgZW50cnkgcG9pbnQgYXNzb2NpYXRlZCB3aXRoIGRldmljZQorICB2b2lkIGFkZE9mZmxvYWRFbnRyeShpbnQzMl90IGRldmljZV9pZCwgX190Z3Rfb2ZmbG9hZF9lbnRyeSBlbnRyeSkgeworICAgIGFzc2VydChkZXZpY2VfaWQgPCAoaW50MzJfdClGdW5jR2JsRW50cmllcy5zaXplKCkgJiYKKyAgICAgICAgICAgIlVuZXhwZWN0ZWQgZGV2aWNlIGlkISIpOworICAgIEZ1bmNPckdibEVudHJ5VHkgJkUgPSBGdW5jR2JsRW50cmllc1tkZXZpY2VfaWRdOworCisgICAgRS5FbnRyaWVzLnB1c2hfYmFjayhlbnRyeSk7CisgIH0KKworICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZW50cnkgaXMgYXNzb2NpYXRlZCB3aXRoIGRldmljZQorICBib29sIGZpbmRPZmZsb2FkRW50cnkoaW50MzJfdCBkZXZpY2VfaWQsIHZvaWQgKmFkZHIpIHsKKyAgICBhc3NlcnQoZGV2aWNlX2lkIDwgKGludDMyX3QpRnVuY0dibEVudHJpZXMuc2l6ZSgpICYmCisgICAgICAgICAgICJVbmV4cGVjdGVkIGRldmljZSBpZCEiKTsKKyAgICBGdW5jT3JHYmxFbnRyeVR5ICZFID0gRnVuY0dibEVudHJpZXNbZGV2aWNlX2lkXTsKKworICAgIGZvciAoYXV0byAmaXQgOiBFLkVudHJpZXMpIHsKKyAgICAgIGlmIChpdC5hZGRyID09IGFkZHIpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIFJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgdGFyZ2V0IGVudHJpZXMgdGFibGUKKyAgX190Z3RfdGFyZ2V0X3RhYmxlICpnZXRPZmZsb2FkRW50cmllc1RhYmxlKGludDMyX3QgZGV2aWNlX2lkKSB7CisgICAgYXNzZXJ0KGRldmljZV9pZCA8IChpbnQzMl90KUZ1bmNHYmxFbnRyaWVzLnNpemUoKSAmJgorICAgICAgICAgICAiVW5leHBlY3RlZCBkZXZpY2UgaWQhIik7CisgICAgRnVuY09yR2JsRW50cnlUeSAmRSA9IEZ1bmNHYmxFbnRyaWVzW2RldmljZV9pZF07CisKKyAgICBpbnQzMl90IHNpemUgPSBFLkVudHJpZXMuc2l6ZSgpOworCisgICAgLy8gVGFibGUgaXMgZW1wdHkKKyAgICBpZiAoIXNpemUpCisgICAgICByZXR1cm4gMDsKKworICAgIF9fdGd0X29mZmxvYWRfZW50cnkgKmJlZ2luID0gJkUuRW50cmllc1swXTsKKyAgICBfX3RndF9vZmZsb2FkX2VudHJ5ICplbmQgPSAmRS5FbnRyaWVzW3NpemUgLSAxXTsKKworICAgIC8vIFVwZGF0ZSB0YWJsZSBpbmZvIGFjY29yZGluZyB0byB0aGUgZW50cmllcyBhbmQgcmV0dXJuIHRoZSBwb2ludGVyCisgICAgRS5UYWJsZS5FbnRyaWVzQmVnaW4gPSBiZWdpbjsKKyAgICBFLlRhYmxlLkVudHJpZXNFbmQgPSArK2VuZDsKKworICAgIHJldHVybiAmRS5UYWJsZTsKKyAgfQorCisgIC8vIENsZWFyIGVudHJpZXMgdGFibGUgZm9yIGEgZGV2aWNlCisgIHZvaWQgY2xlYXJPZmZsb2FkRW50cmllc1RhYmxlKGludDMyX3QgZGV2aWNlX2lkKSB7CisgICAgYXNzZXJ0KGRldmljZV9pZCA8IChpbnQzMl90KUZ1bmNHYmxFbnRyaWVzLnNpemUoKSAmJgorICAgICAgICAgICAiVW5leHBlY3RlZCBkZXZpY2UgaWQhIik7CisgICAgRnVuY09yR2JsRW50cnlUeSAmRSA9IEZ1bmNHYmxFbnRyaWVzW2RldmljZV9pZF07CisgICAgRS5FbnRyaWVzLmNsZWFyKCk7CisgICAgRS5UYWJsZS5FbnRyaWVzQmVnaW4gPSBFLlRhYmxlLkVudHJpZXNFbmQgPSAwOworICB9CisKKyAgUlRMRGV2aWNlSW5mb1R5KCkgeworICAgIERQKCJTdGFydCBpbml0aWFsaXppbmcgQ1VEQVxuIik7CisKKyAgICBDVXJlc3VsdCBlcnIgPSBjdUluaXQoMCk7CisgICAgaWYgKGVyciAhPSBDVURBX1NVQ0NFU1MpIHsKKyAgICAgIERQKCJFcnJvciB3aGVuIGluaXRpYWxpemluZyBDVURBXG4iKTsKKyAgICAgIENVREFfRVJSX1NUUklORyhlcnIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIE51bWJlck9mRGV2aWNlcyA9IDA7CisKKyAgICBlcnIgPSBjdURldmljZUdldENvdW50KCZOdW1iZXJPZkRldmljZXMpOworICAgIGlmIChlcnIgIT0gQ1VEQV9TVUNDRVNTKSB7CisgICAgICBEUCgiRXJyb3Igd2hlbiBnZXR0aW5nIENVREEgZGV2aWNlIGNvdW50XG4iKTsKKyAgICAgIENVREFfRVJSX1NUUklORyhlcnIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChOdW1iZXJPZkRldmljZXMgPT0gMCkgeworICAgICAgRFAoIlRoZXJlIGFyZSBubyBkZXZpY2VzIHN1cHBvcnRpbmcgQ1VEQS5cbiIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEZ1bmNHYmxFbnRyaWVzLnJlc2l6ZShOdW1iZXJPZkRldmljZXMpOworICAgIENvbnRleHRzLnJlc2l6ZShOdW1iZXJPZkRldmljZXMpOworICAgIFRocmVhZHNQZXJCbG9jay5yZXNpemUoTnVtYmVyT2ZEZXZpY2VzKTsKKyAgICBCbG9ja3NQZXJHcmlkLnJlc2l6ZShOdW1iZXJPZkRldmljZXMpOworICAgIFdhcnBTaXplLnJlc2l6ZShOdW1iZXJPZkRldmljZXMpOworICAgIE51bVRlYW1zLnJlc2l6ZShOdW1iZXJPZkRldmljZXMpOworICAgIE51bVRocmVhZHMucmVzaXplKE51bWJlck9mRGV2aWNlcyk7CisKKyAgICAvLyBHZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHJlZ2FyZGluZyB0ZWFtcworICAgIGNoYXIgKmVudlN0ciA9IGdldGVudigiT01QX1RFQU1fTElNSVQiKTsKKyAgICBpZiAoZW52U3RyKSB7CisgICAgICAvLyBPTVBfVEVBTV9MSU1JVCBoYXMgYmVlbiBzZXQKKyAgICAgIEVudlRlYW1MaW1pdCA9IHN0ZDo6c3RvaShlbnZTdHIpOworICAgICAgRFAoIlBhcnNlZCBPTVBfVEVBTV9MSU1JVD0lZFxuIiwgRW52VGVhbUxpbWl0KTsKKyAgICB9IGVsc2UgeworICAgICAgRW52VGVhbUxpbWl0ID0gLTE7CisgICAgfQorICAgIGVudlN0ciA9IGdldGVudigiT01QX05VTV9URUFNUyIpOworICAgIGlmIChlbnZTdHIpIHsKKyAgICAgIC8vIE9NUF9OVU1fVEVBTVMgaGFzIGJlZW4gc2V0CisgICAgICBFbnZOdW1UZWFtcyA9IHN0ZDo6c3RvaShlbnZTdHIpOworICAgICAgRFAoIlBhcnNlZCBPTVBfTlVNX1RFQU1TPSVkXG4iLCBFbnZOdW1UZWFtcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIEVudk51bVRlYW1zID0gLTE7CisgICAgfQorICB9CisKKyAgflJUTERldmljZUluZm9UeSgpIHsKKyAgICAvLyBDbG9zZSBtb2R1bGVzCisgICAgZm9yIChhdXRvICZtb2R1bGUgOiBNb2R1bGVzKQorICAgICAgaWYgKG1vZHVsZSkgeworICAgICAgICBDVXJlc3VsdCBlcnIgPSBjdU1vZHVsZVVubG9hZChtb2R1bGUpOworICAgICAgICBpZiAoZXJyICE9IENVREFfU1VDQ0VTUykgeworICAgICAgICAgIERQKCJFcnJvciB3aGVuIHVubG9hZGluZyBDVURBIG1vZHVsZVxuIik7CisgICAgICAgICAgQ1VEQV9FUlJfU1RSSU5HKGVycik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgIC8vIERlc3Ryb3kgY29udGV4dHMKKyAgICBmb3IgKGF1dG8gJmN0eCA6IENvbnRleHRzKQorICAgICAgaWYgKGN0eCkgeworICAgICAgICBDVXJlc3VsdCBlcnIgPSBjdUN0eERlc3Ryb3koY3R4KTsKKyAgICAgICAgaWYgKGVyciAhPSBDVURBX1NVQ0NFU1MpIHsKKyAgICAgICAgICBEUCgiRXJyb3Igd2hlbiBkZXN0cm95aW5nIENVREEgY29udGV4dFxuIik7CisgICAgICAgICAgQ1VEQV9FUlJfU1RSSU5HKGVycik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgfQorfTsKKworc3RhdGljIFJUTERldmljZUluZm9UeSBEZXZpY2VJbmZvOworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2ludDMyX3QgX190Z3RfcnRsX2lzX3ZhbGlkX2JpbmFyeShfX3RndF9kZXZpY2VfaW1hZ2UgKmltYWdlKSB7CisgIHJldHVybiBlbGZfY2hlY2tfbWFjaGluZShpbWFnZSwgMTkwKTsgLy8gRU1fQ1VEQSA9IDE5MC4KK30KKworaW50MzJfdCBfX3RndF9ydGxfbnVtYmVyX29mX2RldmljZXMoKSB7IHJldHVybiBEZXZpY2VJbmZvLk51bWJlck9mRGV2aWNlczsgfQorCitpbnQzMl90IF9fdGd0X3J0bF9pbml0X2RldmljZShpbnQzMl90IGRldmljZV9pZCkgeworCisgIENVZGV2aWNlIGN1RGV2aWNlOworICBEUCgiR2V0dGluZyBkZXZpY2UgJWRcbiIsIGRldmljZV9pZCk7CisgIENVcmVzdWx0IGVyciA9IGN1RGV2aWNlR2V0KCZjdURldmljZSwgZGV2aWNlX2lkKTsKKyAgaWYgKGVyciAhPSBDVURBX1NVQ0NFU1MpIHsKKyAgICBEUCgiRXJyb3Igd2hlbiBnZXR0aW5nIENVREEgZGV2aWNlIHdpdGggaWQgPSAlZFxuIiwgZGV2aWNlX2lkKTsKKyAgICBDVURBX0VSUl9TVFJJTkcoZXJyKTsKKyAgICByZXR1cm4gT0ZGTE9BRF9GQUlMOworICB9CisKKyAgLy8gQ3JlYXRlIHRoZSBjb250ZXh0IGFuZCBzYXZlIGl0IHRvIHVzZSB3aGVuZXZlciB0aGlzIGRldmljZSBpcyBzZWxlY3RlZC4KKyAgZXJyID0gY3VDdHhDcmVhdGUoJkRldmljZUluZm8uQ29udGV4dHNbZGV2aWNlX2lkXSwgQ1VfQ1RYX1NDSEVEX0JMT0NLSU5HX1NZTkMsCisgICAgICAgICAgICAgICAgICAgIGN1RGV2aWNlKTsKKyAgaWYgKGVyciAhPSBDVURBX1NVQ0NFU1MpIHsKKyAgICBEUCgiRXJyb3Igd2hlbiBjcmVhdGluZyBhIENVREEgY29udGV4dFxuIik7CisgICAgQ1VEQV9FUlJfU1RSSU5HKGVycik7CisgICAgcmV0dXJuIE9GRkxPQURfRkFJTDsKKyAgfQorCisgIC8vIHNjYW4gcHJvcGVydGllcyB0byBkZXRlcm1pbmUgbnVtYmVyIG9mIHRocmVhZHMvYmxvY2sgYW5kIGJsb2Nrcy9ncmlkLgorICBzdHJ1Y3QgY3VkYURldmljZVByb3AgUHJvcGVydGllczsKKyAgY3VkYUVycm9yX3QgZXJyb3IgPSBjdWRhR2V0RGV2aWNlUHJvcGVydGllcygmUHJvcGVydGllcywgZGV2aWNlX2lkKTsKKyAgaWYgKGVycm9yICE9IGN1ZGFTdWNjZXNzKSB7CisgICAgRFAoIkVycm9yIGdldHRpbmcgZGV2aWNlIFByb3BlcnRpZXMsIHVzZSBkZWZhdWx0c1xuIik7CisgICAgRGV2aWNlSW5mby5CbG9ja3NQZXJHcmlkW2RldmljZV9pZF0gPSBSVExEZXZpY2VJbmZvVHk6OkRlZmF1bHROdW1UZWFtczsKKyAgICBEZXZpY2VJbmZvLlRocmVhZHNQZXJCbG9ja1tkZXZpY2VfaWRdID0gUlRMRGV2aWNlSW5mb1R5OjpEZWZhdWx0TnVtVGhyZWFkczsKKyAgICBEZXZpY2VJbmZvLldhcnBTaXplW2RldmljZV9pZF0gPSAzMjsKKyAgfSBlbHNlIHsKKyAgICAvLyBHZXQgYmxvY2tzIHBlciBncmlkCisgICAgaWYgKFByb3BlcnRpZXMubWF4R3JpZFNpemVbMF0gPD0gUlRMRGV2aWNlSW5mb1R5OjpIYXJkVGVhbUxpbWl0KSB7CisgICAgICBEZXZpY2VJbmZvLkJsb2Nrc1BlckdyaWRbZGV2aWNlX2lkXSA9IFByb3BlcnRpZXMubWF4R3JpZFNpemVbMF07CisgICAgICBEUCgiVXNpbmcgJWQgQ1VEQSBibG9ja3MgcGVyIGdyaWRcbiIsIFByb3BlcnRpZXMubWF4R3JpZFNpemVbMF0pOworICAgIH0gZWxzZSB7CisgICAgICBEZXZpY2VJbmZvLkJsb2Nrc1BlckdyaWRbZGV2aWNlX2lkXSA9IFJUTERldmljZUluZm9UeTo6SGFyZFRlYW1MaW1pdDsKKyAgICAgIERQKCJNYXggQ1VEQSBibG9ja3MgcGVyIGdyaWQgJWQgZXhjZWVkcyB0aGUgaGFyZCB0ZWFtIGxpbWl0ICVkLCBjYXBwaW5nICIKKyAgICAgICAgICAiYXQgdGhlIGhhcmQgbGltaXRcbiIsIFByb3BlcnRpZXMubWF4R3JpZFNpemVbMF0sCisgICAgICAgICAgUlRMRGV2aWNlSW5mb1R5OjpIYXJkVGVhbUxpbWl0KTsKKyAgICB9CisKKyAgICAvLyBHZXQgdGhyZWFkcyBwZXIgYmxvY2ssIGV4cGxvaXQgdGhyZWFkcyBvbmx5IGFsb25nIHggYXhpcworICAgIGlmIChQcm9wZXJ0aWVzLm1heFRocmVhZHNEaW1bMF0gPD0gUlRMRGV2aWNlSW5mb1R5OjpIYXJkVGhyZWFkTGltaXQpIHsKKyAgICAgIERldmljZUluZm8uVGhyZWFkc1BlckJsb2NrW2RldmljZV9pZF0gPSBQcm9wZXJ0aWVzLm1heFRocmVhZHNEaW1bMF07CisgICAgICBEUCgiVXNpbmcgJWQgQ1VEQSB0aHJlYWRzIHBlciBibG9ja1xuIiwgUHJvcGVydGllcy5tYXhUaHJlYWRzRGltWzBdKTsKKyAgICAgIGlmIChQcm9wZXJ0aWVzLm1heFRocmVhZHNEaW1bMF0gPCBQcm9wZXJ0aWVzLm1heFRocmVhZHNQZXJCbG9jaykgeworICAgICAgICBEUCgiKGZld2VyIHRoYW4gbWF4IHBlciBibG9jayBhbG9uZyBhbGwgeHl6IGRpbXMgJWQpXG4iLAorICAgICAgICAgICAgUHJvcGVydGllcy5tYXhUaHJlYWRzUGVyQmxvY2spOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBEZXZpY2VJbmZvLlRocmVhZHNQZXJCbG9ja1tkZXZpY2VfaWRdID0gUlRMRGV2aWNlSW5mb1R5OjpIYXJkVGhyZWFkTGltaXQ7CisgICAgICBEUCgiTWF4IENVREEgdGhyZWFkcyBwZXIgYmxvY2sgJWQgZXhjZWVkcyB0aGUgaGFyZCB0aHJlYWQgbGltaXQgJWQsICIKKyAgICAgICAgICAiY2FwcGluZyBhdCB0aGUgaGFyZCBsaW1pdFxuIiwgUHJvcGVydGllcy5tYXhUaHJlYWRzRGltWzBdLAorICAgICAgICAgIFJUTERldmljZUluZm9UeTo6SGFyZFRocmVhZExpbWl0KTsKKyAgICB9CisKKyAgICAvLyBHZXQgd2FycCBzaXplCisgICAgRGV2aWNlSW5mby5XYXJwU2l6ZVtkZXZpY2VfaWRdID0gUHJvcGVydGllcy53YXJwU2l6ZTsKKyAgfQorCisgIC8vIEFkanVzdCB0ZWFtcyB0byB0aGUgZW52IHZhcmlhYmxlcworICBpZiAoRGV2aWNlSW5mby5FbnZUZWFtTGltaXQgPiAwICYmCisgICAgICBEZXZpY2VJbmZvLkJsb2Nrc1BlckdyaWRbZGV2aWNlX2lkXSA+IERldmljZUluZm8uRW52VGVhbUxpbWl0KSB7CisgICAgRGV2aWNlSW5mby5CbG9ja3NQZXJHcmlkW2RldmljZV9pZF0gPSBEZXZpY2VJbmZvLkVudlRlYW1MaW1pdDsKKyAgICBEUCgiQ2FwcGluZyBtYXggQ1VEQSBibG9ja3MgcGVyIGdyaWQgdG8gT01QX1RFQU1fTElNSVQ9JWRcbiIsCisgICAgICAgIERldmljZUluZm8uRW52VGVhbUxpbWl0KTsKKyAgfQorCisgIERQKCJNYXggbnVtYmVyIG9mIENVREEgYmxvY2tzICVkLCB0aHJlYWRzICVkICYgd2FycCBzaXplICVkXG4iLAorICAgICBEZXZpY2VJbmZvLkJsb2Nrc1BlckdyaWRbZGV2aWNlX2lkXSwgRGV2aWNlSW5mby5UaHJlYWRzUGVyQmxvY2tbZGV2aWNlX2lkXSwKKyAgICAgRGV2aWNlSW5mby5XYXJwU2l6ZVtkZXZpY2VfaWRdKTsKKworICAvLyBTZXQgZGVmYXVsdCBudW1iZXIgb2YgdGVhbXMKKyAgaWYgKERldmljZUluZm8uRW52TnVtVGVhbXMgPiAwKSB7CisgICAgRGV2aWNlSW5mby5OdW1UZWFtc1tkZXZpY2VfaWRdID0gRGV2aWNlSW5mby5FbnZOdW1UZWFtczsKKyAgICBEUCgiRGVmYXVsdCBudW1iZXIgb2YgdGVhbXMgc2V0IGFjY29yZGluZyB0byBlbnZpcm9ubWVudCAlZFxuIiwKKyAgICAgICAgRGV2aWNlSW5mby5FbnZOdW1UZWFtcyk7CisgIH0gZWxzZSB7CisgICAgRGV2aWNlSW5mby5OdW1UZWFtc1tkZXZpY2VfaWRdID0gUlRMRGV2aWNlSW5mb1R5OjpEZWZhdWx0TnVtVGVhbXM7CisgICAgRFAoIkRlZmF1bHQgbnVtYmVyIG9mIHRlYW1zIHNldCBhY2NvcmRpbmcgdG8gbGlicmFyeSdzIGRlZmF1bHQgJWRcbiIsCisgICAgICAgIFJUTERldmljZUluZm9UeTo6RGVmYXVsdE51bVRlYW1zKTsKKyAgfQorICBpZiAoRGV2aWNlSW5mby5OdW1UZWFtc1tkZXZpY2VfaWRdID4gRGV2aWNlSW5mby5CbG9ja3NQZXJHcmlkW2RldmljZV9pZF0pIHsKKyAgICBEZXZpY2VJbmZvLk51bVRlYW1zW2RldmljZV9pZF0gPSBEZXZpY2VJbmZvLkJsb2Nrc1BlckdyaWRbZGV2aWNlX2lkXTsKKyAgICBEUCgiRGVmYXVsdCBudW1iZXIgb2YgdGVhbXMgZXhjZWVkcyBkZXZpY2UgbGltaXQsIGNhcHBpbmcgYXQgJWRcbiIsCisgICAgICAgIERldmljZUluZm8uQmxvY2tzUGVyR3JpZFtkZXZpY2VfaWRdKTsKKyAgfQorCisgIC8vIFNldCBkZWZhdWx0IG51bWJlciBvZiB0aHJlYWRzCisgIERldmljZUluZm8uTnVtVGhyZWFkc1tkZXZpY2VfaWRdID0gUlRMRGV2aWNlSW5mb1R5OjpEZWZhdWx0TnVtVGhyZWFkczsKKyAgRFAoIkRlZmF1bHQgbnVtYmVyIG9mIHRocmVhZHMgc2V0IGFjY29yZGluZyB0byBsaWJyYXJ5J3MgZGVmYXVsdCAlZFxuIiwKKyAgICAgICAgICBSVExEZXZpY2VJbmZvVHk6OkRlZmF1bHROdW1UaHJlYWRzKTsKKyAgaWYgKERldmljZUluZm8uTnVtVGhyZWFkc1tkZXZpY2VfaWRdID4KKyAgICAgIERldmljZUluZm8uVGhyZWFkc1BlckJsb2NrW2RldmljZV9pZF0pIHsKKyAgICBEZXZpY2VJbmZvLk51bVRlYW1zW2RldmljZV9pZF0gPSBEZXZpY2VJbmZvLlRocmVhZHNQZXJCbG9ja1tkZXZpY2VfaWRdOworICAgIERQKCJEZWZhdWx0IG51bWJlciBvZiB0aHJlYWRzIGV4Y2VlZHMgZGV2aWNlIGxpbWl0LCBjYXBwaW5nIGF0ICVkXG4iLAorICAgICAgICBEZXZpY2VJbmZvLlRocmVhZHNQZXJCbG9ja1tkZXZpY2VfaWRdKTsKKyAgfQorCisgIHJldHVybiBPRkZMT0FEX1NVQ0NFU1M7Cit9CisKK19fdGd0X3RhcmdldF90YWJsZSAqX190Z3RfcnRsX2xvYWRfYmluYXJ5KGludDMyX3QgZGV2aWNlX2lkLAorICAgIF9fdGd0X2RldmljZV9pbWFnZSAqaW1hZ2UpIHsKKworICAvLyBTZXQgdGhlIGNvbnRleHQgd2UgYXJlIHVzaW5nLgorICBDVXJlc3VsdCBlcnIgPSBjdUN0eFNldEN1cnJlbnQoRGV2aWNlSW5mby5Db250ZXh0c1tkZXZpY2VfaWRdKTsKKyAgaWYgKGVyciAhPSBDVURBX1NVQ0NFU1MpIHsKKyAgICBEUCgiRXJyb3Igd2hlbiBzZXR0aW5nIGEgQ1VEQSBjb250ZXh0IGZvciBkZXZpY2UgJWRcbiIsIGRldmljZV9pZCk7CisgICAgQ1VEQV9FUlJfU1RSSU5HKGVycik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvLyBDbGVhciB0aGUgb2ZmbG9hZCB0YWJsZSBhcyB3ZSBhcmUgZ29pbmcgdG8gY3JlYXRlIGEgbmV3IG9uZS4KKyAgRGV2aWNlSW5mby5jbGVhck9mZmxvYWRFbnRyaWVzVGFibGUoZGV2aWNlX2lkKTsKKworICAvLyBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgZXh0cmFjdCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMuCisKKyAgQ1Vtb2R1bGUgY3Vtb2Q7CisgIERQKCJMb2FkIGRhdGEgZnJvbSBpbWFnZSAiIERQeE1PRCAiXG4iLCBEUHhQVFIoaW1hZ2UtPkltYWdlU3RhcnQpKTsKKyAgZXJyID0gY3VNb2R1bGVMb2FkRGF0YUV4KCZjdW1vZCwgaW1hZ2UtPkltYWdlU3RhcnQsIDAsIE5VTEwsIE5VTEwpOworICBpZiAoZXJyICE9IENVREFfU1VDQ0VTUykgeworICAgIERQKCJFcnJvciB3aGVuIGxvYWRpbmcgQ1VEQSBtb2R1bGVcbiIpOworICAgIENVREFfRVJSX1NUUklORyhlcnIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgRFAoIkNVREEgbW9kdWxlIHN1Y2Nlc3NmdWxseSBsb2FkZWQhXG4iKTsKKyAgRGV2aWNlSW5mby5Nb2R1bGVzLnB1c2hfYmFjayhjdW1vZCk7CisKKyAgLy8gRmluZCB0aGUgc3ltYm9scyBpbiB0aGUgbW9kdWxlIGJ5IG5hbWUuCisgIF9fdGd0X29mZmxvYWRfZW50cnkgKkhvc3RCZWdpbiA9IGltYWdlLT5FbnRyaWVzQmVnaW47CisgIF9fdGd0X29mZmxvYWRfZW50cnkgKkhvc3RFbmQgPSBpbWFnZS0+RW50cmllc0VuZDsKKworICBmb3IgKF9fdGd0X29mZmxvYWRfZW50cnkgKmUgPSBIb3N0QmVnaW47IGUgIT0gSG9zdEVuZDsgKytlKSB7CisKKyAgICBpZiAoIWUtPmFkZHIpIHsKKyAgICAgIC8vIFdlIHJldHVybiBOVUxMIHdoZW4gc29tZXRoaW5nIGxpa2UgdGhpcyBoYXBwZW5zLCB0aGUgaG9zdCBzaG91bGQgaGF2ZQorICAgICAgLy8gYWx3YXlzIHNvbWV0aGluZyBpbiB0aGUgYWRkcmVzcyB0byB1bmlxdWVseSBpZGVudGlmeSB0aGUgdGFyZ2V0IHJlZ2lvbi4KKyAgICAgIERQKCJJbnZhbGlkIGJpbmFyeTogaG9zdCBlbnRyeSAnPG51bGw+JyAoc2l6ZSA9ICV6ZCkuLi5cbiIsIGUtPnNpemUpOworCisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoZS0+c2l6ZSkgeworICAgICAgX190Z3Rfb2ZmbG9hZF9lbnRyeSBlbnRyeSA9ICplOworCisgICAgICBDVWRldmljZXB0ciBjdXB0cjsKKyAgICAgIHNpemVfdCBjdXNpemU7CisgICAgICBlcnIgPSBjdU1vZHVsZUdldEdsb2JhbCgmY3VwdHIsICZjdXNpemUsIGN1bW9kLCBlLT5uYW1lKTsKKworICAgICAgaWYgKGVyciAhPSBDVURBX1NVQ0NFU1MpIHsKKyAgICAgICAgRFAoIkxvYWRpbmcgZ2xvYmFsICclcycgKEZhaWxlZClcbiIsIGUtPm5hbWUpOworICAgICAgICBDVURBX0VSUl9TVFJJTkcoZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisKKyAgICAgIGlmIChjdXNpemUgIT0gZS0+c2l6ZSkgeworICAgICAgICBEUCgiTG9hZGluZyBnbG9iYWwgJyVzJyAtIHNpemUgbWlzbWF0Y2ggKCV6ZCAhPSAlemQpXG4iLCBlLT5uYW1lLAorICAgICAgICAgICAgY3VzaXplLCBlLT5zaXplKTsKKyAgICAgICAgQ1VEQV9FUlJfU1RSSU5HKGVycik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorCisgICAgICBEUCgiRW50cnkgcG9pbnQgIiBEUHhNT0QgIiBtYXBzIHRvIGdsb2JhbCAlcyAoIiBEUHhNT0QgIilcbiIsCisgICAgICAgICAgRFB4UFRSKGUgLSBIb3N0QmVnaW4pLCBlLT5uYW1lLCBEUHhQVFIoY3VwdHIpKTsKKyAgICAgIGVudHJ5LmFkZHIgPSAodm9pZCAqKWN1cHRyOworCisgICAgICBEZXZpY2VJbmZvLmFkZE9mZmxvYWRFbnRyeShkZXZpY2VfaWQsIGVudHJ5KTsKKworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgQ1VmdW5jdGlvbiBmdW47CisgICAgZXJyID0gY3VNb2R1bGVHZXRGdW5jdGlvbigmZnVuLCBjdW1vZCwgZS0+bmFtZSk7CisKKyAgICBpZiAoZXJyICE9IENVREFfU1VDQ0VTUykgeworICAgICAgRFAoIkxvYWRpbmcgJyVzJyAoRmFpbGVkKVxuIiwgZS0+bmFtZSk7CisgICAgICBDVURBX0VSUl9TVFJJTkcoZXJyKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIERQKCJFbnRyeSBwb2ludCAiIERQeE1PRCAiIG1hcHMgdG8gJXMgKCIgRFB4TU9EICIpXG4iLAorICAgICAgICBEUHhQVFIoZSAtIEhvc3RCZWdpbiksIGUtPm5hbWUsIERQeFBUUihmdW4pKTsKKworICAgIC8vIGRlZmF1bHQgdmFsdWUgR0VORVJJQyAoaW4gY2FzZSBzeW1ib2wgaXMgbWlzc2luZyBmcm9tIGN1YmluIGZpbGUpCisgICAgaW50OF90IEV4ZWNNb2RlVmFsID0gRXhlY3V0aW9uTW9kZVR5cGU6OkdFTkVSSUM7CisgICAgc3RkOjpzdHJpbmcgRXhlY01vZGVOYW1lU3RyIChlLT5uYW1lKTsKKyAgICBFeGVjTW9kZU5hbWVTdHIgKz0gIl9leGVjX21vZGUiOworICAgIGNvbnN0IGNoYXIgKkV4ZWNNb2RlTmFtZSA9IEV4ZWNNb2RlTmFtZVN0ci5jX3N0cigpOworCisgICAgQ1VkZXZpY2VwdHIgRXhlY01vZGVQdHI7CisgICAgc2l6ZV90IGN1c2l6ZTsKKyAgICBlcnIgPSBjdU1vZHVsZUdldEdsb2JhbCgmRXhlY01vZGVQdHIsICZjdXNpemUsIGN1bW9kLCBFeGVjTW9kZU5hbWUpOworICAgIGlmIChlcnIgPT0gQ1VEQV9TVUNDRVNTKSB7CisgICAgICBpZiAoKHNpemVfdCljdXNpemUgIT0gc2l6ZW9mKGludDhfdCkpIHsKKyAgICAgICAgRFAoIkxvYWRpbmcgZ2xvYmFsIGV4ZWNfbW9kZSAnJXMnIC0gc2l6ZSBtaXNtYXRjaCAoJXpkICE9ICV6ZClcbiIsCisgICAgICAgICAgIEV4ZWNNb2RlTmFtZSwgY3VzaXplLCBzaXplb2YoaW50OF90KSk7CisgICAgICAgIENVREFfRVJSX1NUUklORyhlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKworICAgICAgZXJyID0gY3VNZW1jcHlEdG9IKCZFeGVjTW9kZVZhbCwgRXhlY01vZGVQdHIsIGN1c2l6ZSk7CisgICAgICBpZiAoZXJyICE9IENVREFfU1VDQ0VTUykgeworICAgICAgICBEUCgiRXJyb3Igd2hlbiBjb3B5aW5nIGRhdGEgZnJvbSBkZXZpY2UgdG8gaG9zdC4gUG9pbnRlcnM6ICIKKyAgICAgICAgICAgImhvc3QgPSAiIERQeE1PRCAiLCBkZXZpY2UgPSAiIERQeE1PRCAiLCBzaXplID0gJXpkXG4iLAorICAgICAgICAgICBEUHhQVFIoJkV4ZWNNb2RlVmFsKSwgRFB4UFRSKEV4ZWNNb2RlUHRyKSwgY3VzaXplKTsKKyAgICAgICAgQ1VEQV9FUlJfU1RSSU5HKGVycik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorCisgICAgICBpZiAoRXhlY01vZGVWYWwgPCAwIHx8IEV4ZWNNb2RlVmFsID4gMSkgeworICAgICAgICBEUCgiRXJyb3Igd3JvbmcgZXhlY19tb2RlIHZhbHVlIHNwZWNpZmllZCBpbiBjdWJpbiBmaWxlOiAlZFxuIiwKKyAgICAgICAgICAgRXhlY01vZGVWYWwpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgRFAoIkxvYWRpbmcgZ2xvYmFsIGV4ZWNfbW9kZSAnJXMnIC0gc3ltYm9sIG1pc3NpbmcsIHVzaW5nIGRlZmF1bHQgdmFsdWUgIgorICAgICAgICAgICJHRU5FUklDICgxKVxuIiwgRXhlY01vZGVOYW1lKTsKKyAgICAgIENVREFfRVJSX1NUUklORyhlcnIpOworICAgIH0KKworICAgIEtlcm5lbHNMaXN0LnB1c2hfYmFjayhLZXJuZWxUeShmdW4sIEV4ZWNNb2RlVmFsKSk7CisKKyAgICBfX3RndF9vZmZsb2FkX2VudHJ5IGVudHJ5ID0gKmU7CisgICAgZW50cnkuYWRkciA9ICh2b2lkICopJktlcm5lbHNMaXN0LmJhY2soKTsKKyAgICBEZXZpY2VJbmZvLmFkZE9mZmxvYWRFbnRyeShkZXZpY2VfaWQsIGVudHJ5KTsKKyAgfQorCisgIHJldHVybiBEZXZpY2VJbmZvLmdldE9mZmxvYWRFbnRyaWVzVGFibGUoZGV2aWNlX2lkKTsKK30KKwordm9pZCAqX190Z3RfcnRsX2RhdGFfYWxsb2MoaW50MzJfdCBkZXZpY2VfaWQsIGludDY0X3Qgc2l6ZSwgdm9pZCAqaHN0X3B0cikgeworICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvLyBTZXQgdGhlIGNvbnRleHQgd2UgYXJlIHVzaW5nLgorICBDVXJlc3VsdCBlcnIgPSBjdUN0eFNldEN1cnJlbnQoRGV2aWNlSW5mby5Db250ZXh0c1tkZXZpY2VfaWRdKTsKKyAgaWYgKGVyciAhPSBDVURBX1NVQ0NFU1MpIHsKKyAgICBEUCgiRXJyb3Igd2hpbGUgdHJ5aW5nIHRvIHNldCBDVURBIGN1cnJlbnQgY29udGV4dFxuIik7CisgICAgQ1VEQV9FUlJfU1RSSU5HKGVycik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBDVWRldmljZXB0ciBwdHI7CisgIGVyciA9IGN1TWVtQWxsb2MoJnB0ciwgc2l6ZSk7CisgIGlmIChlcnIgIT0gQ1VEQV9TVUNDRVNTKSB7CisgICAgRFAoIkVycm9yIHdoaWxlIHRyeWluZyB0byBhbGxvY2F0ZSAlZFxuIiwgZXJyKTsKKyAgICBDVURBX0VSUl9TVFJJTkcoZXJyKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHZvaWQgKnZwdHIgPSAodm9pZCAqKXB0cjsKKyAgcmV0dXJuIHZwdHI7Cit9CisKK2ludDMyX3QgX190Z3RfcnRsX2RhdGFfc3VibWl0KGludDMyX3QgZGV2aWNlX2lkLCB2b2lkICp0Z3RfcHRyLCB2b2lkICpoc3RfcHRyLAorICAgIGludDY0X3Qgc2l6ZSkgeworICAvLyBTZXQgdGhlIGNvbnRleHQgd2UgYXJlIHVzaW5nLgorICBDVXJlc3VsdCBlcnIgPSBjdUN0eFNldEN1cnJlbnQoRGV2aWNlSW5mby5Db250ZXh0c1tkZXZpY2VfaWRdKTsKKyAgaWYgKGVyciAhPSBDVURBX1NVQ0NFU1MpIHsKKyAgICBEUCgiRXJyb3Igd2hlbiBzZXR0aW5nIENVREEgY29udGV4dFxuIik7CisgICAgQ1VEQV9FUlJfU1RSSU5HKGVycik7CisgICAgcmV0dXJuIE9GRkxPQURfRkFJTDsKKyAgfQorCisgIGVyciA9IGN1TWVtY3B5SHRvRCgoQ1VkZXZpY2VwdHIpdGd0X3B0ciwgaHN0X3B0ciwgc2l6ZSk7CisgIGlmIChlcnIgIT0gQ1VEQV9TVUNDRVNTKSB7CisgICAgRFAoIkVycm9yIHdoZW4gY29weWluZyBkYXRhIGZyb20gaG9zdCB0byBkZXZpY2UuIFBvaW50ZXJzOiBob3N0ID0gIiBEUHhNT0QKKyAgICAgICAiLCBkZXZpY2UgPSAiIERQeE1PRCAiLCBzaXplID0gJSIgUFJJZDY0ICJcbiIsIERQeFBUUihoc3RfcHRyKSwKKyAgICAgICBEUHhQVFIodGd0X3B0ciksIHNpemUpOworICAgIENVREFfRVJSX1NUUklORyhlcnIpOworICAgIHJldHVybiBPRkZMT0FEX0ZBSUw7CisgIH0KKyAgcmV0dXJuIE9GRkxPQURfU1VDQ0VTUzsKK30KKworaW50MzJfdCBfX3RndF9ydGxfZGF0YV9yZXRyaWV2ZShpbnQzMl90IGRldmljZV9pZCwgdm9pZCAqaHN0X3B0ciwgdm9pZCAqdGd0X3B0ciwKKyAgICBpbnQ2NF90IHNpemUpIHsKKyAgLy8gU2V0IHRoZSBjb250ZXh0IHdlIGFyZSB1c2luZy4KKyAgQ1VyZXN1bHQgZXJyID0gY3VDdHhTZXRDdXJyZW50KERldmljZUluZm8uQ29udGV4dHNbZGV2aWNlX2lkXSk7CisgIGlmIChlcnIgIT0gQ1VEQV9TVUNDRVNTKSB7CisgICAgRFAoIkVycm9yIHdoZW4gc2V0dGluZyBDVURBIGNvbnRleHRcbiIpOworICAgIENVREFfRVJSX1NUUklORyhlcnIpOworICAgIHJldHVybiBPRkZMT0FEX0ZBSUw7CisgIH0KKworICBlcnIgPSBjdU1lbWNweUR0b0goaHN0X3B0ciwgKENVZGV2aWNlcHRyKXRndF9wdHIsIHNpemUpOworICBpZiAoZXJyICE9IENVREFfU1VDQ0VTUykgeworICAgIERQKCJFcnJvciB3aGVuIGNvcHlpbmcgZGF0YSBmcm9tIGRldmljZSB0byBob3N0LiBQb2ludGVyczogaG9zdCA9ICIgRFB4TU9ECisgICAgICAgICIsIGRldmljZSA9ICIgRFB4TU9EICIsIHNpemUgPSAlIiBQUklkNjQgIlxuIiwgRFB4UFRSKGhzdF9wdHIpLAorICAgICAgICBEUHhQVFIodGd0X3B0ciksIHNpemUpOworICAgIENVREFfRVJSX1NUUklORyhlcnIpOworICAgIHJldHVybiBPRkZMT0FEX0ZBSUw7CisgIH0KKyAgcmV0dXJuIE9GRkxPQURfU1VDQ0VTUzsKK30KKworaW50MzJfdCBfX3RndF9ydGxfZGF0YV9kZWxldGUoaW50MzJfdCBkZXZpY2VfaWQsIHZvaWQgKnRndF9wdHIpIHsKKyAgLy8gU2V0IHRoZSBjb250ZXh0IHdlIGFyZSB1c2luZy4KKyAgQ1VyZXN1bHQgZXJyID0gY3VDdHhTZXRDdXJyZW50KERldmljZUluZm8uQ29udGV4dHNbZGV2aWNlX2lkXSk7CisgIGlmIChlcnIgIT0gQ1VEQV9TVUNDRVNTKSB7CisgICAgRFAoIkVycm9yIHdoZW4gc2V0dGluZyBDVURBIGNvbnRleHRcbiIpOworICAgIENVREFfRVJSX1NUUklORyhlcnIpOworICAgIHJldHVybiBPRkZMT0FEX0ZBSUw7CisgIH0KKworICBlcnIgPSBjdU1lbUZyZWUoKENVZGV2aWNlcHRyKXRndF9wdHIpOworICBpZiAoZXJyICE9IENVREFfU1VDQ0VTUykgeworICAgIERQKCJFcnJvciB3aGVuIGZyZWVpbmcgQ1VEQSBtZW1vcnlcbiIpOworICAgIENVREFfRVJSX1NUUklORyhlcnIpOworICAgIHJldHVybiBPRkZMT0FEX0ZBSUw7CisgIH0KKyAgcmV0dXJuIE9GRkxPQURfU1VDQ0VTUzsKK30KKworaW50MzJfdCBfX3RndF9ydGxfcnVuX3RhcmdldF90ZWFtX3JlZ2lvbihpbnQzMl90IGRldmljZV9pZCwgdm9pZCAqdGd0X2VudHJ5X3B0ciwKKyAgICB2b2lkICoqdGd0X2FyZ3MsIHB0cmRpZmZfdCAqdGd0X29mZnNldHMsIGludDMyX3QgYXJnX251bSwgaW50MzJfdCB0ZWFtX251bSwKKyAgICBpbnQzMl90IHRocmVhZF9saW1pdCwgdWludDY0X3QgbG9vcF90cmlwY291bnQpIHsKKyAgLy8gU2V0IHRoZSBjb250ZXh0IHdlIGFyZSB1c2luZy4KKyAgQ1VyZXN1bHQgZXJyID0gY3VDdHhTZXRDdXJyZW50KERldmljZUluZm8uQ29udGV4dHNbZGV2aWNlX2lkXSk7CisgIGlmIChlcnIgIT0gQ1VEQV9TVUNDRVNTKSB7CisgICAgRFAoIkVycm9yIHdoZW4gc2V0dGluZyBDVURBIGNvbnRleHRcbiIpOworICAgIENVREFfRVJSX1NUUklORyhlcnIpOworICAgIHJldHVybiBPRkZMT0FEX0ZBSUw7CisgIH0KKworICAvLyBBbGwgYXJncyBhcmUgcmVmZXJlbmNlcy4KKyAgc3RkOjp2ZWN0b3I8dm9pZCAqPiBhcmdzKGFyZ19udW0pOworICBzdGQ6OnZlY3Rvcjx2b2lkICo+IHB0cnMoYXJnX251bSk7CisKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYXJnX251bTsgKytpKSB7CisgICAgcHRyc1tpXSA9ICh2b2lkICopKChpbnRwdHJfdCl0Z3RfYXJnc1tpXSArIHRndF9vZmZzZXRzW2ldKTsKKyAgICBhcmdzW2ldID0gJnB0cnNbaV07CisgIH0KKworICBLZXJuZWxUeSAqS2VybmVsSW5mbyA9IChLZXJuZWxUeSAqKXRndF9lbnRyeV9wdHI7CisKKyAgaW50IGN1ZGFUaHJlYWRzUGVyQmxvY2s7CisKKyAgaWYgKHRocmVhZF9saW1pdCA+IDApIHsKKyAgICBjdWRhVGhyZWFkc1BlckJsb2NrID0gdGhyZWFkX2xpbWl0OworICAgIERQKCJTZXR0aW5nIENVREEgdGhyZWFkcyBwZXIgYmxvY2sgdG8gcmVxdWVzdGVkICVkXG4iLCB0aHJlYWRfbGltaXQpOworICAgIC8vIEFkZCBtYXN0ZXIgd2FycCBpZiBuZWNlc3NhcnkKKyAgICBpZiAoS2VybmVsSW5mby0+RXhlY3V0aW9uTW9kZSA9PSBHRU5FUklDKSB7CisgICAgICBjdWRhVGhyZWFkc1BlckJsb2NrICs9IERldmljZUluZm8uV2FycFNpemVbZGV2aWNlX2lkXTsKKyAgICAgIERQKCJBZGRpbmcgbWFzdGVyIHdhcnA6ICslZCB0aHJlYWRzXG4iLCBEZXZpY2VJbmZvLldhcnBTaXplW2RldmljZV9pZF0pOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBjdWRhVGhyZWFkc1BlckJsb2NrID0gRGV2aWNlSW5mby5OdW1UaHJlYWRzW2RldmljZV9pZF07CisgICAgRFAoIlNldHRpbmcgQ1VEQSB0aHJlYWRzIHBlciBibG9jayB0byBkZWZhdWx0ICVkXG4iLAorICAgICAgICBEZXZpY2VJbmZvLk51bVRocmVhZHNbZGV2aWNlX2lkXSk7CisgIH0KKworICBpZiAoY3VkYVRocmVhZHNQZXJCbG9jayA+IERldmljZUluZm8uVGhyZWFkc1BlckJsb2NrW2RldmljZV9pZF0pIHsKKyAgICBjdWRhVGhyZWFkc1BlckJsb2NrID0gRGV2aWNlSW5mby5UaHJlYWRzUGVyQmxvY2tbZGV2aWNlX2lkXTsKKyAgICBEUCgiVGhyZWFkcyBwZXIgYmxvY2sgY2FwcGVkIGF0IGRldmljZSBsaW1pdCAlZFxuIiwKKyAgICAgICAgRGV2aWNlSW5mby5UaHJlYWRzUGVyQmxvY2tbZGV2aWNlX2lkXSk7CisgIH0KKworICBpbnQga2VybmVsX2xpbWl0OworICBlcnIgPSBjdUZ1bmNHZXRBdHRyaWJ1dGUoJmtlcm5lbF9saW1pdCwKKyAgICAgIENVX0ZVTkNfQVRUUklCVVRFX01BWF9USFJFQURTX1BFUl9CTE9DSywgS2VybmVsSW5mby0+RnVuYyk7CisgIGlmIChlcnIgPT0gQ1VEQV9TVUNDRVNTKSB7CisgICAgaWYgKGtlcm5lbF9saW1pdCA8IGN1ZGFUaHJlYWRzUGVyQmxvY2spIHsKKyAgICAgIGN1ZGFUaHJlYWRzUGVyQmxvY2sgPSBrZXJuZWxfbGltaXQ7CisgICAgICBEUCgiVGhyZWFkcyBwZXIgYmxvY2sgY2FwcGVkIGF0IGtlcm5lbCBsaW1pdCAlZFxuIiwga2VybmVsX2xpbWl0KTsKKyAgICB9CisgIH0KKworICBpbnQgY3VkYUJsb2Nrc1BlckdyaWQ7CisgIGlmICh0ZWFtX251bSA8PSAwKSB7CisgICAgaWYgKGxvb3BfdHJpcGNvdW50ID4gMCAmJiBEZXZpY2VJbmZvLkVudk51bVRlYW1zIDwgMCkgeworICAgICAgaWYgKEtlcm5lbEluZm8tPkV4ZWN1dGlvbk1vZGUgPT0gU1BNRCkgeworICAgICAgICAvLyBXZSBoYXZlIGEgY29tYmluZWQgY29uc3RydWN0LCBpLmUuIGB0YXJnZXQgdGVhbXMgZGlzdHJpYnV0ZSBwYXJhbGxlbAorICAgICAgICAvLyBmb3IgW3NpbWRdYC4gV2UgbGF1bmNoIHNvIG1hbnkgdGVhbXMgc28gdGhhdCBlYWNoIHRocmVhZCB3aWxsCisgICAgICAgIC8vIGV4ZWN1dGUgb25lIGl0ZXJhdGlvbiBvZiB0aGUgbG9vcC4KKyAgICAgICAgLy8gcm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgaW50ZWdlcgorICAgICAgICBjdWRhQmxvY2tzUGVyR3JpZCA9ICgobG9vcF90cmlwY291bnQgLSAxKSAvIGN1ZGFUaHJlYWRzUGVyQmxvY2spICsgMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIElmIHdlIHJlYWNoIHRoaXMgcG9pbnQsIHRoZW4gd2UgaGF2ZSBhIG5vbi1jb21iaW5lZCBjb25zdHJ1Y3QsIGkuZS4KKyAgICAgICAgLy8gYHRlYW1zIGRpc3RyaWJ1dGVgIHdpdGggYSBuZXN0ZWQgYHBhcmFsbGVsIGZvcmAgYW5kIGVhY2ggdGVhbSBpcworICAgICAgICAvLyBhc3NpZ25lZCBvbmUgaXRlcmF0aW9uIG9mIHRoZSBgZGlzdHJpYnV0ZWAgbG9vcC4gRS5nLjoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gI3ByYWdtYSBvbXAgdGFyZ2V0IHRlYW1zIGRpc3RyaWJ1dGUKKyAgICAgICAgLy8gZm9yKC4uLmxvb3BfdHJpcGNvdW50Li4uKSB7CisgICAgICAgIC8vICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yCisgICAgICAgIC8vICAgZm9yKC4uLikge30KKyAgICAgICAgLy8gfQorICAgICAgICAvLworICAgICAgICAvLyBUaHJlYWRzIHdpdGhpbiBhIHRlYW0gd2lsbCBleGVjdXRlIHRoZSBpdGVyYXRpb25zIG9mIHRoZSBgcGFyYWxsZWxgCisgICAgICAgIC8vIGxvb3AuCisgICAgICAgIGN1ZGFCbG9ja3NQZXJHcmlkID0gbG9vcF90cmlwY291bnQ7CisgICAgICB9CisgICAgICBEUCgiVXNpbmcgJWQgdGVhbXMgZHVlIHRvIGxvb3AgdHJpcCBjb3VudCAlIiBQUkl1NjQgIiBhbmQgbnVtYmVyIG9mICIKKyAgICAgICAgICAidGhyZWFkcyBwZXIgYmxvY2sgJWRcbiIsIGN1ZGFCbG9ja3NQZXJHcmlkLCBsb29wX3RyaXBjb3VudCwKKyAgICAgICAgICBjdWRhVGhyZWFkc1BlckJsb2NrKTsKKyAgICB9IGVsc2UgeworICAgICAgY3VkYUJsb2Nrc1BlckdyaWQgPSBEZXZpY2VJbmZvLk51bVRlYW1zW2RldmljZV9pZF07CisgICAgICBEUCgiVXNpbmcgZGVmYXVsdCBudW1iZXIgb2YgdGVhbXMgJWRcbiIsIERldmljZUluZm8uTnVtVGVhbXNbZGV2aWNlX2lkXSk7CisgICAgfQorICB9IGVsc2UgaWYgKHRlYW1fbnVtID4gRGV2aWNlSW5mby5CbG9ja3NQZXJHcmlkW2RldmljZV9pZF0pIHsKKyAgICBjdWRhQmxvY2tzUGVyR3JpZCA9IERldmljZUluZm8uQmxvY2tzUGVyR3JpZFtkZXZpY2VfaWRdOworICAgIERQKCJDYXBwaW5nIG51bWJlciBvZiB0ZWFtcyB0byB0ZWFtIGxpbWl0ICVkXG4iLAorICAgICAgICBEZXZpY2VJbmZvLkJsb2Nrc1BlckdyaWRbZGV2aWNlX2lkXSk7CisgIH0gZWxzZSB7CisgICAgY3VkYUJsb2Nrc1BlckdyaWQgPSB0ZWFtX251bTsKKyAgICBEUCgiVXNpbmcgcmVxdWVzdGVkIG51bWJlciBvZiB0ZWFtcyAlZFxuIiwgdGVhbV9udW0pOworICB9CisKKyAgLy8gUnVuIG9uIHRoZSBkZXZpY2UuCisgIERQKCJMYXVuY2gga2VybmVsIHdpdGggJWQgYmxvY2tzIGFuZCAlZCB0aHJlYWRzXG4iLCBjdWRhQmxvY2tzUGVyR3JpZCwKKyAgICAgY3VkYVRocmVhZHNQZXJCbG9jayk7CisKKyAgZXJyID0gY3VMYXVuY2hLZXJuZWwoS2VybmVsSW5mby0+RnVuYywgY3VkYUJsb2Nrc1BlckdyaWQsIDEsIDEsCisgICAgICBjdWRhVGhyZWFkc1BlckJsb2NrLCAxLCAxLCAwIC8qYnl0ZXMgb2Ygc2hhcmVkIG1lbW9yeSovLCAwLCAmYXJnc1swXSwgMCk7CisgIGlmIChlcnIgIT0gQ1VEQV9TVUNDRVNTKSB7CisgICAgRFAoIkRldmljZSBrZXJuZWwgbGF1bmNoIGZhaWxlZCFcbiIpOworICAgIENVREFfRVJSX1NUUklORyhlcnIpOworICAgIGFzc2VydChlcnIgPT0gQ1VEQV9TVUNDRVNTICYmICJVbmFibGUgdG8gbGF1bmNoIHRhcmdldCBleGVjdXRpb24hIik7CisgICAgcmV0dXJuIE9GRkxPQURfRkFJTDsKKyAgfQorCisgIERQKCJMYXVuY2ggb2YgZW50cnkgcG9pbnQgYXQgIiBEUHhNT0QgIiBzdWNjZXNzZnVsIVxuIiwKKyAgICAgIERQeFBUUih0Z3RfZW50cnlfcHRyKSk7CisKKyAgY3VkYUVycm9yX3Qgc3luY19lcnJvciA9IGN1ZGFEZXZpY2VTeW5jaHJvbml6ZSgpOworICBpZiAoc3luY19lcnJvciAhPSBjdWRhU3VjY2VzcykgeworICBEUCgiS2VybmVsIGV4ZWN1dGlvbiBlcnJvciBhdCAiIERQeE1PRCAiLCAlcy5cbiIsIERQeFBUUih0Z3RfZW50cnlfcHRyKSwKKyAgICAgIGN1ZGFHZXRFcnJvclN0cmluZyhzeW5jX2Vycm9yKSk7CisgICAgcmV0dXJuIE9GRkxPQURfRkFJTDsKKyAgfSBlbHNlIHsKKyAgICBEUCgiS2VybmVsIGV4ZWN1dGlvbiBhdCAiIERQeE1PRCAiIHN1Y2Nlc3NmdWwhXG4iLCBEUHhQVFIodGd0X2VudHJ5X3B0cikpOworICB9CisKKyAgcmV0dXJuIE9GRkxPQURfU1VDQ0VTUzsKK30KKworaW50MzJfdCBfX3RndF9ydGxfcnVuX3RhcmdldF9yZWdpb24oaW50MzJfdCBkZXZpY2VfaWQsIHZvaWQgKnRndF9lbnRyeV9wdHIsCisgICAgdm9pZCAqKnRndF9hcmdzLCBwdHJkaWZmX3QgKnRndF9vZmZzZXRzLCBpbnQzMl90IGFyZ19udW0pIHsKKyAgLy8gdXNlIG9uZSB0ZWFtIGFuZCB0aGUgZGVmYXVsdCBudW1iZXIgb2YgdGhyZWFkcy4KKyAgY29uc3QgaW50MzJfdCB0ZWFtX251bSA9IDE7CisgIGNvbnN0IGludDMyX3QgdGhyZWFkX2xpbWl0ID0gMDsKKyAgcmV0dXJuIF9fdGd0X3J0bF9ydW5fdGFyZ2V0X3RlYW1fcmVnaW9uKGRldmljZV9pZCwgdGd0X2VudHJ5X3B0ciwgdGd0X2FyZ3MsCisgICAgICB0Z3Rfb2Zmc2V0cywgYXJnX251bSwgdGVhbV9udW0sIHRocmVhZF9saW1pdCwgMCk7Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9maW5hbC9saWJvbXB0YXJnZXQvcGx1Z2lucy9leHBvcnRzIGIvZmluYWwvbGlib21wdGFyZ2V0L3BsdWdpbnMvZXhwb3J0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjlmN2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvbGlib21wdGFyZ2V0L3BsdWdpbnMvZXhwb3J0cwpAQCAtMCwwICsxLDE1IEBACitWRVJTMS4wIHsKKyAgZ2xvYmFsOgorICAgIF9fdGd0X3J0bF9pc192YWxpZF9iaW5hcnk7CisgICAgX190Z3RfcnRsX251bWJlcl9vZl9kZXZpY2VzOworICAgIF9fdGd0X3J0bF9pbml0X2RldmljZTsKKyAgICBfX3RndF9ydGxfbG9hZF9iaW5hcnk7CisgICAgX190Z3RfcnRsX2RhdGFfYWxsb2M7CisgICAgX190Z3RfcnRsX2RhdGFfc3VibWl0OworICAgIF9fdGd0X3J0bF9kYXRhX3JldHJpZXZlOworICAgIF9fdGd0X3J0bF9kYXRhX2RlbGV0ZTsKKyAgICBfX3RndF9ydGxfcnVuX3RhcmdldF90ZWFtX3JlZ2lvbjsKKyAgICBfX3RndF9ydGxfcnVuX3RhcmdldF9yZWdpb247CisgIGxvY2FsOgorICAgICo7Cit9OwpkaWZmIC0tZ2l0IGEvZmluYWwvbGlib21wdGFyZ2V0L3BsdWdpbnMvZ2VuZXJpYy1lbGYtNjRiaXQvc3JjL3J0bC5jcHAgYi9maW5hbC9saWJvbXB0YXJnZXQvcGx1Z2lucy9nZW5lcmljLWVsZi02NGJpdC9zcmMvcnRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmE2OWRmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvbGlib21wdGFyZ2V0L3BsdWdpbnMvZ2VuZXJpYy1lbGYtNjRiaXQvc3JjL3J0bC5jcHAKQEAgLTAsMCArMSwzMTkgQEAKKy8vPT09LVJUTHMvZ2VuZXJpYy02NGJpdC9zcmMvcnRsLmNwcCAtIFRhcmdldCBSVExzIEltcGxlbWVudGF0aW9uIC0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gUlRMIGZvciBnZW5lcmljIDY0LWJpdCBtYWNoaW5lCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPGZmaS5oPgorI2luY2x1ZGUgPGdlbGYuaD4KKyNpbmNsdWRlIDxsaW5rLmg+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJvbXB0YXJnZXRwbHVnaW4uaCIKKworI2lmbmRlZiBUQVJHRVRfTkFNRQorI2RlZmluZSBUQVJHRVRfTkFNRSBHZW5lcmljIEVMRiAtIDY0Yml0CisjZW5kaWYKKworI2lmbmRlZiBUQVJHRVRfRUxGX0lECisjZGVmaW5lIFRBUkdFVF9FTEZfSUQgMAorI2VuZGlmCisKKyNkZWZpbmUgR0VUTkFNRTIobmFtZSkgI25hbWUKKyNkZWZpbmUgR0VUTkFNRShuYW1lKSBHRVROQU1FMihuYW1lKQorI2RlZmluZSBEUCguLi4pIERFQlVHUCgiVGFyZ2V0ICIgR0VUTkFNRShUQVJHRVRfTkFNRSkgIiBSVEwiLCBfX1ZBX0FSR1NfXykKKworI2luY2x1ZGUgIi4uLy4uL2NvbW1vbi9lbGZfY29tbW9uLmMiCisKKyNkZWZpbmUgTlVNQkVSX09GX0RFVklDRVMgNAorI2RlZmluZSBPRkZMT0FEU0VDVElPTk5BTUUgIi5vbXBfb2ZmbG9hZGluZy5lbnRyaWVzIgorCisvLy8gQXJyYXkgb2YgRHluYW1pYyBsaWJyYXJpZXMgbG9hZGVkIGZvciB0aGlzIHRhcmdldC4KK3N0cnVjdCBEeW5MaWJUeSB7CisgIGNoYXIgKkZpbGVOYW1lOworICB2b2lkICpIYW5kbGU7Cit9OworCisvLy8gS2VlcCBlbnRyaWVzIHRhYmxlIHBlciBkZXZpY2UuCitzdHJ1Y3QgRnVuY09yR2JsRW50cnlUeSB7CisgIF9fdGd0X3RhcmdldF90YWJsZSBUYWJsZTsKK307CisKKy8vLyBDbGFzcyBjb250YWluaW5nIGFsbCB0aGUgZGV2aWNlIGluZm9ybWF0aW9uLgorY2xhc3MgUlRMRGV2aWNlSW5mb1R5IHsKKyAgc3RkOjp2ZWN0b3I8RnVuY09yR2JsRW50cnlUeT4gRnVuY0dibEVudHJpZXM7CisKK3B1YmxpYzoKKyAgc3RkOjpsaXN0PER5bkxpYlR5PiBEeW5MaWJzOworCisgIC8vIFJlY29yZCBlbnRyeSBwb2ludCBhc3NvY2lhdGVkIHdpdGggZGV2aWNlLgorICB2b2lkIGNyZWF0ZU9mZmxvYWRUYWJsZShpbnQzMl90IGRldmljZV9pZCwgX190Z3Rfb2ZmbG9hZF9lbnRyeSAqYmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdGd0X29mZmxvYWRfZW50cnkgKmVuZCkgeworICAgIGFzc2VydChkZXZpY2VfaWQgPCAoaW50MzJfdClGdW5jR2JsRW50cmllcy5zaXplKCkgJiYKKyAgICAgICAgICAgIlVuZXhwZWN0ZWQgZGV2aWNlIGlkISIpOworICAgIEZ1bmNPckdibEVudHJ5VHkgJkUgPSBGdW5jR2JsRW50cmllc1tkZXZpY2VfaWRdOworCisgICAgRS5UYWJsZS5FbnRyaWVzQmVnaW4gPSBiZWdpbjsKKyAgICBFLlRhYmxlLkVudHJpZXNFbmQgPSBlbmQ7CisgIH0KKworICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZW50cnkgaXMgYXNzb2NpYXRlZCB3aXRoIGRldmljZS4KKyAgYm9vbCBmaW5kT2ZmbG9hZEVudHJ5KGludDMyX3QgZGV2aWNlX2lkLCB2b2lkICphZGRyKSB7CisgICAgYXNzZXJ0KGRldmljZV9pZCA8IChpbnQzMl90KUZ1bmNHYmxFbnRyaWVzLnNpemUoKSAmJgorICAgICAgICAgICAiVW5leHBlY3RlZCBkZXZpY2UgaWQhIik7CisgICAgRnVuY09yR2JsRW50cnlUeSAmRSA9IEZ1bmNHYmxFbnRyaWVzW2RldmljZV9pZF07CisKKyAgICBmb3IgKF9fdGd0X29mZmxvYWRfZW50cnkgKmkgPSBFLlRhYmxlLkVudHJpZXNCZWdpbiwgKmUgPSBFLlRhYmxlLkVudHJpZXNFbmQ7CisgICAgICAgICBpIDwgZTsgKytpKSB7CisgICAgICBpZiAoaS0+YWRkciA9PSBhZGRyKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBSZXR1cm4gdGhlIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBlbnRyaWVzIHRhYmxlLgorICBfX3RndF90YXJnZXRfdGFibGUgKmdldE9mZmxvYWRFbnRyaWVzVGFibGUoaW50MzJfdCBkZXZpY2VfaWQpIHsKKyAgICBhc3NlcnQoZGV2aWNlX2lkIDwgKGludDMyX3QpRnVuY0dibEVudHJpZXMuc2l6ZSgpICYmCisgICAgICAgICAgICJVbmV4cGVjdGVkIGRldmljZSBpZCEiKTsKKyAgICBGdW5jT3JHYmxFbnRyeVR5ICZFID0gRnVuY0dibEVudHJpZXNbZGV2aWNlX2lkXTsKKworICAgIHJldHVybiAmRS5UYWJsZTsKKyAgfQorCisgIFJUTERldmljZUluZm9UeShpbnQzMl90IG51bV9kZXZpY2VzKSB7IEZ1bmNHYmxFbnRyaWVzLnJlc2l6ZShudW1fZGV2aWNlcyk7IH0KKworICB+UlRMRGV2aWNlSW5mb1R5KCkgeworICAgIC8vIENsb3NlIGR5bmFtaWMgbGlicmFyaWVzCisgICAgZm9yIChhdXRvICZsaWIgOiBEeW5MaWJzKSB7CisgICAgICBpZiAobGliLkhhbmRsZSkgeworICAgICAgICBkbGNsb3NlKGxpYi5IYW5kbGUpOworICAgICAgICByZW1vdmUobGliLkZpbGVOYW1lKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK307CisKK3N0YXRpYyBSVExEZXZpY2VJbmZvVHkgRGV2aWNlSW5mbyhOVU1CRVJfT0ZfREVWSUNFUyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworaW50MzJfdCBfX3RndF9ydGxfaXNfdmFsaWRfYmluYXJ5KF9fdGd0X2RldmljZV9pbWFnZSAqaW1hZ2UpIHsKKy8vIElmIHdlIGRvbid0IGhhdmUgYSB2YWxpZCBFTEYgSUQgd2UgY2FuIGp1c3QgZmFpbC4KKyNpZiBUQVJHRVRfRUxGX0lEIDwgMQorICByZXR1cm4gMDsKKyNlbHNlCisgIHJldHVybiBlbGZfY2hlY2tfbWFjaGluZShpbWFnZSwgVEFSR0VUX0VMRl9JRCk7CisjZW5kaWYKK30KKworaW50MzJfdCBfX3RndF9ydGxfbnVtYmVyX29mX2RldmljZXMoKSB7IHJldHVybiBOVU1CRVJfT0ZfREVWSUNFUzsgfQorCitpbnQzMl90IF9fdGd0X3J0bF9pbml0X2RldmljZShpbnQzMl90IGRldmljZV9pZCkgeyByZXR1cm4gT0ZGTE9BRF9TVUNDRVNTOyB9CisKK19fdGd0X3RhcmdldF90YWJsZSAqX190Z3RfcnRsX2xvYWRfYmluYXJ5KGludDMyX3QgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX190Z3RfZGV2aWNlX2ltYWdlICppbWFnZSkgeworCisgIERQKCJEZXYgJWQ6IGxvYWQgYmluYXJ5IGZyb20gIiBEUHhNT0QgIiBpbWFnZVxuIiwgZGV2aWNlX2lkLAorICAgICBEUHhQVFIoaW1hZ2UtPkltYWdlU3RhcnQpKTsKKworICBhc3NlcnQoZGV2aWNlX2lkID49IDAgJiYgZGV2aWNlX2lkIDwgTlVNQkVSX09GX0RFVklDRVMgJiYgImJhZCBkZXYgaWQiKTsKKworICBzaXplX3QgSW1hZ2VTaXplID0gKHNpemVfdClpbWFnZS0+SW1hZ2VFbmQgLSAoc2l6ZV90KWltYWdlLT5JbWFnZVN0YXJ0OworICBzaXplX3QgTnVtRW50cmllcyA9IChzaXplX3QpKGltYWdlLT5FbnRyaWVzRW5kIC0gaW1hZ2UtPkVudHJpZXNCZWdpbik7CisgIERQKCJFeHBlY3RpbmcgdG8gaGF2ZSAlemQgZW50cmllcyBkZWZpbmVkLlxuIiwgTnVtRW50cmllcyk7CisKKyAgLy8gSXMgdGhlIGxpYnJhcnkgdmVyc2lvbiBpbmNvbXBhdGlibGUgd2l0aCB0aGUgaGVhZGVyIGZpbGU/CisgIGlmIChlbGZfdmVyc2lvbihFVl9DVVJSRU5UKSA9PSBFVl9OT05FKSB7CisgICAgRFAoIkluY29tcGF0aWJsZSBFTEYgbGlicmFyeSFcbiIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgLy8gT2J0YWluIGVsZiBoYW5kbGVyCisgIEVsZiAqZSA9IGVsZl9tZW1vcnkoKGNoYXIgKilpbWFnZS0+SW1hZ2VTdGFydCwgSW1hZ2VTaXplKTsKKyAgaWYgKCFlKSB7CisgICAgRFAoIlVuYWJsZSB0byBnZXQgRUxGIGhhbmRsZTogJXMhXG4iLCBlbGZfZXJybXNnKC0xKSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBpZiAoZWxmX2tpbmQoZSkgIT0gRUxGX0tfRUxGKSB7CisgICAgRFAoIkludmFsaWQgRWxmIGtpbmQhXG4iKTsKKyAgICBlbGZfZW5kKGUpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgLy8gRmluZCB0aGUgZW50cmllcyBzZWN0aW9uIG9mZnNldAorICBFbGZfU2NuICpzZWN0aW9uID0gMDsKKyAgRWxmNjRfT2ZmIGVudHJpZXNfb2Zmc2V0ID0gMDsKKworICBzaXplX3Qgc2hzdHJuZHg7CisKKyAgaWYgKGVsZl9nZXRzaGRyc3RybmR4KGUsICZzaHN0cm5keCkpIHsKKyAgICBEUCgiVW5hYmxlIHRvIGdldCBFTEYgc3RyaW5ncyBpbmRleCFcbiIpOworICAgIGVsZl9lbmQoZSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICB3aGlsZSAoKHNlY3Rpb24gPSBlbGZfbmV4dHNjbihlLCBzZWN0aW9uKSkpIHsKKyAgICBHRWxmX1NoZHIgaGRyOworICAgIGdlbGZfZ2V0c2hkcihzZWN0aW9uLCAmaGRyKTsKKworICAgIGlmICghc3RyY21wKGVsZl9zdHJwdHIoZSwgc2hzdHJuZHgsIGhkci5zaF9uYW1lKSwgT0ZGTE9BRFNFQ1RJT05OQU1FKSkgeworICAgICAgZW50cmllc19vZmZzZXQgPSBoZHIuc2hfYWRkcjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmICghZW50cmllc19vZmZzZXQpIHsKKyAgICBEUCgiRW50cmllcyBTZWN0aW9uIE9mZnNldCBOb3QgRm91bmRcbiIpOworICAgIGVsZl9lbmQoZSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBEUCgiT2Zmc2V0IG9mIGVudHJpZXMgc2VjdGlvbiBpcyAoIiBEUHhNT0QgIikuXG4iLCBEUHhQVFIoZW50cmllc19vZmZzZXQpKTsKKworICAvLyBsb2FkIGR5bmFtaWMgbGlicmFyeSBhbmQgZ2V0IHRoZSBlbnRyeSBwb2ludHMuIFdlIHVzZSB0aGUgZGwgbGlicmFyeQorICAvLyB0byBkbyB0aGUgbG9hZGluZyBvZiB0aGUgbGlicmFyeSwgYnV0IHdlIGNvdWxkIGRvIGl0IGRpcmVjdGx5IHRvIGF2b2lkIHRoZQorICAvLyBkdW1wIHRvIHRoZSB0ZW1wb3JhcnkgZmlsZS4KKyAgLy8KKyAgLy8gMSkgQ3JlYXRlIHRtcCBmaWxlIHdpdGggdGhlIGxpYnJhcnkgY29udGVudHMuCisgIC8vIDIpIFVzZSBkbG9wZW4gdG8gbG9hZCB0aGUgZmlsZSBhbmQgZGxzeW0gdG8gcmV0cmlldmUgdGhlIHN5bWJvbHMuCisgIGNoYXIgdG1wX25hbWVbXSA9ICIvdG1wL3RtcGZpbGVfWFhYWFhYIjsKKyAgaW50IHRtcF9mZCA9IG1rc3RlbXAodG1wX25hbWUpOworCisgIGlmICh0bXBfZmQgPT0gLTEpIHsKKyAgICBlbGZfZW5kKGUpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgRklMRSAqZnRtcCA9IGZkb3Blbih0bXBfZmQsICJ3YiIpOworCisgIGlmICghZnRtcCkgeworICAgIGVsZl9lbmQoZSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBmd3JpdGUoaW1hZ2UtPkltYWdlU3RhcnQsIEltYWdlU2l6ZSwgMSwgZnRtcCk7CisgIGZjbG9zZShmdG1wKTsKKworICBEeW5MaWJUeSBMaWIgPSB7dG1wX25hbWUsIGRsb3Blbih0bXBfbmFtZSwgUlRMRF9MQVpZKX07CisKKyAgaWYgKCFMaWIuSGFuZGxlKSB7CisgICAgRFAoIlRhcmdldCBsaWJyYXJ5IGxvYWRpbmcgZXJyb3I6ICVzXG4iLCBkbGVycm9yKCkpOworICAgIGVsZl9lbmQoZSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBEZXZpY2VJbmZvLkR5bkxpYnMucHVzaF9iYWNrKExpYik7CisKKyAgc3RydWN0IGxpbmtfbWFwICpsaWJJbmZvID0gKHN0cnVjdCBsaW5rX21hcCAqKUxpYi5IYW5kbGU7CisKKyAgLy8gVGhlIHBsYWNlIHdoZXJlIHRoZSBlbnRyaWVzIGluZm8gaXMgbG9hZGVkIGlzIHRoZSBsaWJyYXJ5IGJhc2UgYWRkcmVzcworICAvLyBwbHVzIHRoZSBvZmZzZXQgZGV0ZXJtaW5lZCBmcm9tIHRoZSBFTEYgZmlsZS4KKyAgRWxmNjRfQWRkciBlbnRyaWVzX2FkZHIgPSBsaWJJbmZvLT5sX2FkZHIgKyBlbnRyaWVzX29mZnNldDsKKworICBEUCgiUG9pbnRlciB0byBmaXJzdCBlbnRyeSB0byBiZSBsb2FkZWQgaXMgKCIgRFB4TU9EICIpLlxuIiwKKyAgICAgIERQeFBUUihlbnRyaWVzX2FkZHIpKTsKKworICAvLyBUYWJsZSBvZiBwb2ludGVycyB0byBhbGwgdGhlIGVudHJpZXMgaW4gdGhlIHRhcmdldC4KKyAgX190Z3Rfb2ZmbG9hZF9lbnRyeSAqZW50cmllc190YWJsZSA9IChfX3RndF9vZmZsb2FkX2VudHJ5ICopZW50cmllc19hZGRyOworCisgIF9fdGd0X29mZmxvYWRfZW50cnkgKmVudHJpZXNfYmVnaW4gPSAmZW50cmllc190YWJsZVswXTsKKyAgX190Z3Rfb2ZmbG9hZF9lbnRyeSAqZW50cmllc19lbmQgPSBlbnRyaWVzX2JlZ2luICsgTnVtRW50cmllczsKKworICBpZiAoIWVudHJpZXNfYmVnaW4pIHsKKyAgICBEUCgiQ2FuJ3Qgb2J0YWluIGVudHJpZXMgYmVnaW5cbiIpOworICAgIGVsZl9lbmQoZSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBEUCgiRW50cmllcyB0YWJsZSByYW5nZSBpcyAoIiBEUHhNT0QgIiktPigiIERQeE1PRCAiKVxuIiwKKyAgICAgIERQeFBUUihlbnRyaWVzX2JlZ2luKSwgRFB4UFRSKGVudHJpZXNfZW5kKSk7CisgIERldmljZUluZm8uY3JlYXRlT2ZmbG9hZFRhYmxlKGRldmljZV9pZCwgZW50cmllc19iZWdpbiwgZW50cmllc19lbmQpOworCisgIGVsZl9lbmQoZSk7CisKKyAgcmV0dXJuIERldmljZUluZm8uZ2V0T2ZmbG9hZEVudHJpZXNUYWJsZShkZXZpY2VfaWQpOworfQorCit2b2lkICpfX3RndF9ydGxfZGF0YV9hbGxvYyhpbnQzMl90IGRldmljZV9pZCwgaW50NjRfdCBzaXplLCB2b2lkICpoc3RfcHRyKSB7CisgIHZvaWQgKnB0ciA9IG1hbGxvYyhzaXplKTsKKyAgcmV0dXJuIHB0cjsKK30KKworaW50MzJfdCBfX3RndF9ydGxfZGF0YV9zdWJtaXQoaW50MzJfdCBkZXZpY2VfaWQsIHZvaWQgKnRndF9wdHIsIHZvaWQgKmhzdF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHNpemUpIHsKKyAgbWVtY3B5KHRndF9wdHIsIGhzdF9wdHIsIHNpemUpOworICByZXR1cm4gT0ZGTE9BRF9TVUNDRVNTOworfQorCitpbnQzMl90IF9fdGd0X3J0bF9kYXRhX3JldHJpZXZlKGludDMyX3QgZGV2aWNlX2lkLCB2b2lkICpoc3RfcHRyLCB2b2lkICp0Z3RfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHNpemUpIHsKKyAgbWVtY3B5KGhzdF9wdHIsIHRndF9wdHIsIHNpemUpOworICByZXR1cm4gT0ZGTE9BRF9TVUNDRVNTOworfQorCitpbnQzMl90IF9fdGd0X3J0bF9kYXRhX2RlbGV0ZShpbnQzMl90IGRldmljZV9pZCwgdm9pZCAqdGd0X3B0cikgeworICBmcmVlKHRndF9wdHIpOworICByZXR1cm4gT0ZGTE9BRF9TVUNDRVNTOworfQorCitpbnQzMl90IF9fdGd0X3J0bF9ydW5fdGFyZ2V0X3RlYW1fcmVnaW9uKGludDMyX3QgZGV2aWNlX2lkLCB2b2lkICp0Z3RfZW50cnlfcHRyLAorICAgIHZvaWQgKip0Z3RfYXJncywgcHRyZGlmZl90ICp0Z3Rfb2Zmc2V0cywgaW50MzJfdCBhcmdfbnVtLCBpbnQzMl90IHRlYW1fbnVtLAorICAgIGludDMyX3QgdGhyZWFkX2xpbWl0LCB1aW50NjRfdCBsb29wX3RyaXBjb3VudCAvKm5vdCB1c2VkKi8pIHsKKyAgLy8gaWdub3JlIHRlYW0gbnVtIGFuZCB0aHJlYWQgbGltaXQuCisKKyAgLy8gVXNlIGxpYmZmaSB0byBsYXVuY2ggZXhlY3V0aW9uLgorICBmZmlfY2lmIGNpZjsKKworICAvLyBBbGwgYXJncyBhcmUgcmVmZXJlbmNlcy4KKyAgc3RkOjp2ZWN0b3I8ZmZpX3R5cGUgKj4gYXJnc190eXBlcyhhcmdfbnVtLCAmZmZpX3R5cGVfcG9pbnRlcik7CisgIHN0ZDo6dmVjdG9yPHZvaWQgKj4gYXJncyhhcmdfbnVtKTsKKyAgc3RkOjp2ZWN0b3I8dm9pZCAqPiBwdHJzKGFyZ19udW0pOworCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGFyZ19udW07ICsraSkgeworICAgIHB0cnNbaV0gPSAodm9pZCAqKSgoaW50cHRyX3QpdGd0X2FyZ3NbaV0gKyB0Z3Rfb2Zmc2V0c1tpXSk7CisgICAgYXJnc1tpXSA9ICZwdHJzW2ldOworICB9CisKKyAgZmZpX3N0YXR1cyBzdGF0dXMgPSBmZmlfcHJlcF9jaWYoJmNpZiwgRkZJX0RFRkFVTFRfQUJJLCBhcmdfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmZpX3R5cGVfdm9pZCwgJmFyZ3NfdHlwZXNbMF0pOworCisgIGFzc2VydChzdGF0dXMgPT0gRkZJX09LICYmICJVbmFibGUgdG8gcHJlcGFyZSB0YXJnZXQgbGF1bmNoISIpOworCisgIGlmIChzdGF0dXMgIT0gRkZJX09LKQorICAgIHJldHVybiBPRkZMT0FEX0ZBSUw7CisKKyAgRFAoIlJ1bm5pbmcgZW50cnkgcG9pbnQgYXQgIiBEUHhNT0QgIi4uLlxuIiwgRFB4UFRSKHRndF9lbnRyeV9wdHIpKTsKKworICB2b2lkICgqZW50cnkpKHZvaWQpOworICAqKCh2b2lkKiopICZlbnRyeSkgPSB0Z3RfZW50cnlfcHRyOworICBmZmlfY2FsbCgmY2lmLCBlbnRyeSwgTlVMTCwgJmFyZ3NbMF0pOworICByZXR1cm4gT0ZGTE9BRF9TVUNDRVNTOworfQorCitpbnQzMl90IF9fdGd0X3J0bF9ydW5fdGFyZ2V0X3JlZ2lvbihpbnQzMl90IGRldmljZV9pZCwgdm9pZCAqdGd0X2VudHJ5X3B0ciwKKyAgICB2b2lkICoqdGd0X2FyZ3MsIHB0cmRpZmZfdCAqdGd0X29mZnNldHMsIGludDMyX3QgYXJnX251bSkgeworICAvLyB1c2Ugb25lIHRlYW0gYW5kIG9uZSB0aHJlYWQuCisgIHJldHVybiBfX3RndF9ydGxfcnVuX3RhcmdldF90ZWFtX3JlZ2lvbihkZXZpY2VfaWQsIHRndF9lbnRyeV9wdHIsIHRndF9hcmdzLAorICAgICAgdGd0X29mZnNldHMsIGFyZ19udW0sIDEsIDEsIDApOworfQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmluYWwvbGlib21wdGFyZ2V0L3BsdWdpbnMvcHBjNjQvQ01ha2VMaXN0cy50eHQgYi9maW5hbC9saWJvbXB0YXJnZXQvcGx1Z2lucy9wcGM2NC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODQ5YTAzCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvbGlib21wdGFyZ2V0L3BsdWdpbnMvcHBjNjQvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxOCBAQAorIyM9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09IyMKKyMgCisjICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMKKyMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMgCisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworIworIyBCdWlsZCBhIHBsdWdpbiBmb3IgYSBwcGM2NCBtYWNoaW5lIGlmIGF2YWlsYWJsZS4KKyMKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisKK2lmKENNQUtFX1NZU1RFTV9OQU1FIE1BVENIRVMgIkxpbnV4IikKKyAgYnVpbGRfZ2VuZXJpY19lbGY2NCgicHBjNjQiICJQUEM2NCIgInBwYzY0IiAicG93ZXJwYzY0LWlibS1saW51eC1nbnUiICIyMSIpCitlbHNlKCkKKyBsaWJvbXB0YXJnZXRfc2F5KCJOb3QgYnVpbGRpbmcgcHBjNjQgb2ZmbG9hZGluZyBwbHVnaW46IG1hY2hpbmUgbm90IGZvdW5kIGluIHRoZSBzeXN0ZW0uIikKK2VuZGlmKCkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9maW5hbC9saWJvbXB0YXJnZXQvcGx1Z2lucy9wcGM2NGxlL0NNYWtlTGlzdHMudHh0IGIvZmluYWwvbGlib21wdGFyZ2V0L3BsdWdpbnMvcHBjNjRsZS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2NlZmRmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvbGlib21wdGFyZ2V0L3BsdWdpbnMvcHBjNjRsZS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDE4IEBACisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworIyAKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIyAKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisjCisjIEJ1aWxkIGEgcGx1Z2luIGZvciBhIHBwYzY0bGUgbWFjaGluZSBpZiBhdmFpbGFibGUuCisjCisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworCitpZihDTUFLRV9TWVNURU1fTkFNRSBNQVRDSEVTICJMaW51eCIpCisgIGJ1aWxkX2dlbmVyaWNfZWxmNjQoInBwYzY0bGUiICJQUEM2NGxlIiAicHBjNjQiICJwb3dlcnBjNjRsZS1pYm0tbGludXgtZ251IiAiMjEiKQorZWxzZSgpCisgbGlib21wdGFyZ2V0X3NheSgiTm90IGJ1aWxkaW5nIHBwYzY0bGUgb2ZmbG9hZGluZyBwbHVnaW46IG1hY2hpbmUgbm90IGZvdW5kIGluIHRoZSBzeXN0ZW0uIikKK2VuZGlmKCkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9maW5hbC9saWJvbXB0YXJnZXQvcGx1Z2lucy94ODZfNjQvQ01ha2VMaXN0cy50eHQgYi9maW5hbC9saWJvbXB0YXJnZXQvcGx1Z2lucy94ODZfNjQvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRkNWJiYQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL2xpYm9tcHRhcmdldC9wbHVnaW5zL3g4Nl82NC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDE4IEBACisjIz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0jIworIyAKKyMgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIworIyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIyAKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisjCisjIEJ1aWxkIGEgcGx1Z2luIGZvciBhIHg4Nl82NCBtYWNoaW5lIGlmIGF2YWlsYWJsZS4KKyMKKyMjPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSMjCisKK2lmKENNQUtFX1NZU1RFTV9OQU1FIE1BVENIRVMgIkxpbnV4IikKKyAgYnVpbGRfZ2VuZXJpY19lbGY2NCgieDg2XzY0IiAieDg2XzY0IiAieDg2XzY0IiAieDg2XzY0LXBjLWxpbnV4LWdudSIgIjYyIikKK2Vsc2UoKQorIGxpYm9tcHRhcmdldF9zYXkoIk5vdCBidWlsZGluZyB4ODZfNjQgb2ZmbG9hZGluZyBwbHVnaW46IG1hY2hpbmUgbm90IGZvdW5kIGluIHRoZSBzeXN0ZW0uIikKK2VuZGlmKCkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9maW5hbC9saWJvbXB0YXJnZXQvc3JjL29tcHRhcmdldC5jcHAgYi9maW5hbC9saWJvbXB0YXJnZXQvc3JjL29tcHRhcmdldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVkYzNmNwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL2xpYm9tcHRhcmdldC9zcmMvb21wdGFyZ2V0LmNwcApAQCAtMCwwICsxLDIzNDYgQEAKKy8vPT09LS0tLS0tIG9tcHRhcmdldC5jcHAgLSBUYXJnZXQgaW5kZXBlbmRlbnQgT3Blbk1QIHRhcmdldCBSVEwgLS0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gSW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVyZmFjZSB0byBiZSB1c2VkIGJ5IENsYW5nIGR1cmluZyB0aGUgY29kZWdlbiBvZiBhCisvLyB0YXJnZXQgcmVnaW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vIEhlYWRlciBmaWxlIGdsb2JhbCB0byB0aGlzIHByb2plY3QKKyNpbmNsdWRlICJvbXB0YXJnZXQuaCIKKworI2RlZmluZSBEUCguLi4pIERFQlVHUCgiTGlib21wdGFyZ2V0IiwgX19WQV9BUkdTX18pCisjZGVmaW5lIElORl9SRUZfQ05UIChMT05HX01BWD4+MSkgLy8gbGVhdmUgcm9vbSBmb3IgYWRkaXRpb25zL3N1YnRyYWN0aW9ucworI2RlZmluZSBDT05TSURFUkVEX0lORih4KSAoeCA+IChJTkZfUkVGX0NOVD4+MSkpCisKKy8vIExpc3Qgb2YgYWxsIHBsdWdpbnMgdGhhdCBjYW4gc3VwcG9ydCBvZmZsb2FkaW5nLgorc3RhdGljIGNvbnN0IGNoYXIgKlJUTE5hbWVzW10gPSB7CisgICAgLyogUG93ZXJQQyB0YXJnZXQgKi8gImxpYm9tcHRhcmdldC5ydGwucHBjNjQuc28iLAorICAgIC8qIHg4Nl82NCB0YXJnZXQgICovICJsaWJvbXB0YXJnZXQucnRsLng4Nl82NC5zbyIsCisgICAgLyogQ1VEQSB0YXJnZXQgICAgKi8gImxpYm9tcHRhcmdldC5ydGwuY3VkYS5zbyIsCisgICAgLyogQUFyY2g2NCB0YXJnZXQgKi8gImxpYm9tcHRhcmdldC5ydGwuYWFyY2g2NC5zbyJ9OworCisvLyBmb3J3YXJkIGRlY2xhcmF0aW9ucworc3RydWN0IFJUTEluZm9UeTsKK3N0YXRpYyBpbnQgdGFyZ2V0KGludDMyX3QgZGV2aWNlX2lkLCB2b2lkICpob3N0X3B0ciwgaW50MzJfdCBhcmdfbnVtLAorICAgIHZvaWQgKiphcmdzX2Jhc2UsIHZvaWQgKiphcmdzLCBpbnQ2NF90ICphcmdfc2l6ZXMsIGludDY0X3QgKmFyZ190eXBlcywKKyAgICBpbnQzMl90IHRlYW1fbnVtLCBpbnQzMl90IHRocmVhZF9saW1pdCwgaW50IElzVGVhbUNvbnN0cnVjdCk7CisKKy8vLyBNYXAgYmV0d2VlbiBob3N0IGRhdGEgYW5kIHRhcmdldCBkYXRhLgorc3RydWN0IEhvc3REYXRhVG9UYXJnZXRUeSB7CisgIHVpbnRwdHJfdCBIc3RQdHJCYXNlOyAvLyBob3N0IGluZm8uCisgIHVpbnRwdHJfdCBIc3RQdHJCZWdpbjsKKyAgdWludHB0cl90IEhzdFB0ckVuZDsgLy8gbm9uLWluY2x1c2l2ZS4KKworICB1aW50cHRyX3QgVGd0UHRyQmVnaW47IC8vIHRhcmdldCBpbmZvLgorCisgIGxvbmcgUmVmQ291bnQ7CisKKyAgSG9zdERhdGFUb1RhcmdldFR5KCkKKyAgICAgIDogSHN0UHRyQmFzZSgwKSwgSHN0UHRyQmVnaW4oMCksIEhzdFB0ckVuZCgwKSwKKyAgICAgICAgVGd0UHRyQmVnaW4oMCksIFJlZkNvdW50KDApIHt9CisgIEhvc3REYXRhVG9UYXJnZXRUeSh1aW50cHRyX3QgQlAsIHVpbnRwdHJfdCBCLCB1aW50cHRyX3QgRSwgdWludHB0cl90IFRCKQorICAgICAgOiBIc3RQdHJCYXNlKEJQKSwgSHN0UHRyQmVnaW4oQiksIEhzdFB0ckVuZChFKSwKKyAgICAgICAgVGd0UHRyQmVnaW4oVEIpLCBSZWZDb3VudCgxKSB7fQorICBIb3N0RGF0YVRvVGFyZ2V0VHkodWludHB0cl90IEJQLCB1aW50cHRyX3QgQiwgdWludHB0cl90IEUsIHVpbnRwdHJfdCBUQiwKKyAgICAgIGxvbmcgUkYpCisgICAgICA6IEhzdFB0ckJhc2UoQlApLCBIc3RQdHJCZWdpbihCKSwgSHN0UHRyRW5kKEUpLAorICAgICAgICBUZ3RQdHJCZWdpbihUQiksIFJlZkNvdW50KFJGKSB7fQorfTsKKwordHlwZWRlZiBzdGQ6Omxpc3Q8SG9zdERhdGFUb1RhcmdldFR5PiBIb3N0RGF0YVRvVGFyZ2V0TGlzdFR5OworCitzdHJ1Y3QgTG9va3VwUmVzdWx0IHsKKyAgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBJc0NvbnRhaW5lZCAgIDogMTsKKyAgICB1bnNpZ25lZCBFeHRlbmRzQmVmb3JlIDogMTsKKyAgICB1bnNpZ25lZCBFeHRlbmRzQWZ0ZXIgIDogMTsKKyAgfSBGbGFnczsKKworICBIb3N0RGF0YVRvVGFyZ2V0TGlzdFR5OjppdGVyYXRvciBFbnRyeTsKKworICBMb29rdXBSZXN1bHQoKSA6IEZsYWdzKHswLDAsMH0pLCBFbnRyeSgpIHt9Cit9OworCisvLy8gTWFwIGZvciBzaGFkb3cgcG9pbnRlcnMKK3N0cnVjdCBTaGFkb3dQdHJWYWxUeSB7CisgIHZvaWQgKkhzdFB0clZhbDsKKyAgdm9pZCAqVGd0UHRyQWRkcjsKKyAgdm9pZCAqVGd0UHRyVmFsOworfTsKK3R5cGVkZWYgc3RkOjptYXA8dm9pZCAqLCBTaGFkb3dQdHJWYWxUeT4gU2hhZG93UHRyTGlzdFR5OworCisvLy8KK3N0cnVjdCBQZW5kaW5nQ3RvckR0b3JMaXN0c1R5IHsKKyAgc3RkOjpsaXN0PHZvaWQgKj4gUGVuZGluZ0N0b3JzOworICBzdGQ6Omxpc3Q8dm9pZCAqPiBQZW5kaW5nRHRvcnM7Cit9OwordHlwZWRlZiBzdGQ6Om1hcDxfX3RndF9iaW5fZGVzYyAqLCBQZW5kaW5nQ3RvckR0b3JMaXN0c1R5PgorICAgIFBlbmRpbmdDdG9yc0R0b3JzUGVyTGlicmFyeTsKKworc3RydWN0IERldmljZVR5IHsKKyAgaW50MzJfdCBEZXZpY2VJRDsKKyAgUlRMSW5mb1R5ICpSVEw7CisgIGludDMyX3QgUlRMRGV2aWNlSUQ7CisKKyAgYm9vbCBJc0luaXQ7CisgIHN0ZDo6b25jZV9mbGFnIEluaXRGbGFnOworICBib29sIEhhc1BlbmRpbmdHbG9iYWxzOworCisgIEhvc3REYXRhVG9UYXJnZXRMaXN0VHkgSG9zdERhdGFUb1RhcmdldE1hcDsKKyAgUGVuZGluZ0N0b3JzRHRvcnNQZXJMaWJyYXJ5IFBlbmRpbmdDdG9yc0R0b3JzOworCisgIFNoYWRvd1B0ckxpc3RUeSBTaGFkb3dQdHJNYXA7CisKKyAgc3RkOjptdXRleCBEYXRhTWFwTXR4LCBQZW5kaW5nR2xvYmFsc010eCwgU2hhZG93TXR4OworCisgIHVpbnQ2NF90IGxvb3BUcmlwQ250OworCisgIERldmljZVR5KFJUTEluZm9UeSAqUlRMKQorICAgICAgOiBEZXZpY2VJRCgtMSksIFJUTChSVEwpLCBSVExEZXZpY2VJRCgtMSksIElzSW5pdChmYWxzZSksIEluaXRGbGFnKCksCisgICAgICAgIEhhc1BlbmRpbmdHbG9iYWxzKGZhbHNlKSwgSG9zdERhdGFUb1RhcmdldE1hcCgpLAorICAgICAgICBQZW5kaW5nQ3RvcnNEdG9ycygpLCBTaGFkb3dQdHJNYXAoKSwgRGF0YU1hcE10eCgpLCBQZW5kaW5nR2xvYmFsc010eCgpLAorICAgICAgICBTaGFkb3dNdHgoKSwgbG9vcFRyaXBDbnQoMCkge30KKworICAvLyBUaGUgZXhpc3RlbmNlIG9mIG11dGV4ZXMgbWFrZXMgRGV2aWNlVHkgbm9uLWNvcHlhYmxlLiBXZSBuZWVkIHRvCisgIC8vIHByb3ZpZGUgYSBjb3B5IGNvbnN0cnVjdG9yIGFuZCBhbiBhc3NpZ25tZW50IG9wZXJhdG9yIGV4cGxpY2l0bHkuCisgIERldmljZVR5KGNvbnN0IERldmljZVR5ICZkKQorICAgICAgOiBEZXZpY2VJRChkLkRldmljZUlEKSwgUlRMKGQuUlRMKSwgUlRMRGV2aWNlSUQoZC5SVExEZXZpY2VJRCksCisgICAgICAgIElzSW5pdChkLklzSW5pdCksIEluaXRGbGFnKCksIEhhc1BlbmRpbmdHbG9iYWxzKGQuSGFzUGVuZGluZ0dsb2JhbHMpLAorICAgICAgICBIb3N0RGF0YVRvVGFyZ2V0TWFwKGQuSG9zdERhdGFUb1RhcmdldE1hcCksCisgICAgICAgIFBlbmRpbmdDdG9yc0R0b3JzKGQuUGVuZGluZ0N0b3JzRHRvcnMpLCBTaGFkb3dQdHJNYXAoZC5TaGFkb3dQdHJNYXApLAorICAgICAgICBEYXRhTWFwTXR4KCksIFBlbmRpbmdHbG9iYWxzTXR4KCksCisgICAgICAgIFNoYWRvd010eCgpLCBsb29wVHJpcENudChkLmxvb3BUcmlwQ250KSB7fQorCisgIERldmljZVR5JiBvcGVyYXRvcj0oY29uc3QgRGV2aWNlVHkgJmQpIHsKKyAgICBEZXZpY2VJRCA9IGQuRGV2aWNlSUQ7CisgICAgUlRMID0gZC5SVEw7CisgICAgUlRMRGV2aWNlSUQgPSBkLlJUTERldmljZUlEOworICAgIElzSW5pdCA9IGQuSXNJbml0OworICAgIEhhc1BlbmRpbmdHbG9iYWxzID0gZC5IYXNQZW5kaW5nR2xvYmFsczsKKyAgICBIb3N0RGF0YVRvVGFyZ2V0TWFwID0gZC5Ib3N0RGF0YVRvVGFyZ2V0TWFwOworICAgIFBlbmRpbmdDdG9yc0R0b3JzID0gZC5QZW5kaW5nQ3RvcnNEdG9yczsKKyAgICBTaGFkb3dQdHJNYXAgPSBkLlNoYWRvd1B0ck1hcDsKKyAgICBsb29wVHJpcENudCA9IGQubG9vcFRyaXBDbnQ7CisKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBsb25nIGdldE1hcEVudHJ5UmVmQ250KHZvaWQgKkhzdFB0ckJlZ2luKTsKKyAgTG9va3VwUmVzdWx0IGxvb2t1cE1hcHBpbmcodm9pZCAqSHN0UHRyQmVnaW4sIGludDY0X3QgU2l6ZSk7CisgIHZvaWQgKmdldE9yQWxsb2NUZ3RQdHIodm9pZCAqSHN0UHRyQmVnaW4sIHZvaWQgKkhzdFB0ckJhc2UsIGludDY0X3QgU2l6ZSwKKyAgICAgIGJvb2wgJklzTmV3LCBib29sIElzSW1wbGljaXQsIGJvb2wgVXBkYXRlUmVmQ291bnQgPSB0cnVlKTsKKyAgdm9pZCAqZ2V0VGd0UHRyQmVnaW4odm9pZCAqSHN0UHRyQmVnaW4sIGludDY0X3QgU2l6ZSk7CisgIHZvaWQgKmdldFRndFB0ckJlZ2luKHZvaWQgKkhzdFB0ckJlZ2luLCBpbnQ2NF90IFNpemUsIGJvb2wgJklzTGFzdCwKKyAgICAgIGJvb2wgVXBkYXRlUmVmQ291bnQpOworICBpbnQgZGVhbGxvY1RndFB0cih2b2lkICpUZ3RQdHJCZWdpbiwgaW50NjRfdCBTaXplLCBib29sIEZvcmNlRGVsZXRlKTsKKyAgaW50IGFzc29jaWF0ZVB0cih2b2lkICpIc3RQdHJCZWdpbiwgdm9pZCAqVGd0UHRyQmVnaW4sIGludDY0X3QgU2l6ZSk7CisgIGludCBkaXNhc3NvY2lhdGVQdHIodm9pZCAqSHN0UHRyQmVnaW4pOworCisgIC8vIGNhbGxzIHRvIFJUTAorICBpbnQzMl90IGluaXRPbmNlKCk7CisgIF9fdGd0X3RhcmdldF90YWJsZSAqbG9hZF9iaW5hcnkodm9pZCAqSW1nKTsKKworICBpbnQzMl90IGRhdGFfc3VibWl0KHZvaWQgKlRndFB0ckJlZ2luLCB2b2lkICpIc3RQdHJCZWdpbiwgaW50NjRfdCBTaXplKTsKKyAgaW50MzJfdCBkYXRhX3JldHJpZXZlKHZvaWQgKkhzdFB0ckJlZ2luLCB2b2lkICpUZ3RQdHJCZWdpbiwgaW50NjRfdCBTaXplKTsKKworICBpbnQzMl90IHJ1bl9yZWdpb24odm9pZCAqVGd0RW50cnlQdHIsIHZvaWQgKipUZ3RWYXJzUHRyLAorICAgICAgcHRyZGlmZl90ICpUZ3RPZmZzZXRzLCBpbnQzMl90IFRndFZhcnNTaXplKTsKKyAgaW50MzJfdCBydW5fdGVhbV9yZWdpb24odm9pZCAqVGd0RW50cnlQdHIsIHZvaWQgKipUZ3RWYXJzUHRyLAorICAgICAgcHRyZGlmZl90ICpUZ3RPZmZzZXRzLCBpbnQzMl90IFRndFZhcnNTaXplLCBpbnQzMl90IE51bVRlYW1zLAorICAgICAgaW50MzJfdCBUaHJlYWRMaW1pdCwgdWludDY0X3QgTG9vcFRyaXBDb3VudCk7CisKK3ByaXZhdGU6CisgIC8vIENhbGwgdG8gUlRMCisgIHZvaWQgaW5pdCgpOyAvLyBUbyBiZSBjYWxsZWQgb25seSB2aWEgRGV2aWNlVHk6OmluaXRPbmNlKCkKK307CisKKy8vLyBNYXAgYmV0d2VlbiBEZXZpY2UgSUQgKGkuZS4gb3Blbm1wIGRldmljZSBpZCkgYW5kIGl0cyBEZXZpY2VUeS4KK3R5cGVkZWYgc3RkOjp2ZWN0b3I8RGV2aWNlVHk+IERldmljZXNUeTsKK3N0YXRpYyBEZXZpY2VzVHkgRGV2aWNlczsKKworc3RydWN0IFJUTEluZm9UeSB7CisgIHR5cGVkZWYgaW50MzJfdChpc192YWxpZF9iaW5hcnlfdHkpKHZvaWQgKik7CisgIHR5cGVkZWYgaW50MzJfdChudW1iZXJfb2ZfZGV2aWNlc190eSkoKTsKKyAgdHlwZWRlZiBpbnQzMl90KGluaXRfZGV2aWNlX3R5KShpbnQzMl90KTsKKyAgdHlwZWRlZiBfX3RndF90YXJnZXRfdGFibGUgKihsb2FkX2JpbmFyeV90eSkoaW50MzJfdCwgdm9pZCAqKTsKKyAgdHlwZWRlZiB2b2lkICooZGF0YV9hbGxvY190eSkoaW50MzJfdCwgaW50NjRfdCwgdm9pZCAqKTsKKyAgdHlwZWRlZiBpbnQzMl90KGRhdGFfc3VibWl0X3R5KShpbnQzMl90LCB2b2lkICosIHZvaWQgKiwgaW50NjRfdCk7CisgIHR5cGVkZWYgaW50MzJfdChkYXRhX3JldHJpZXZlX3R5KShpbnQzMl90LCB2b2lkICosIHZvaWQgKiwgaW50NjRfdCk7CisgIHR5cGVkZWYgaW50MzJfdChkYXRhX2RlbGV0ZV90eSkoaW50MzJfdCwgdm9pZCAqKTsKKyAgdHlwZWRlZiBpbnQzMl90KHJ1bl9yZWdpb25fdHkpKGludDMyX3QsIHZvaWQgKiwgdm9pZCAqKiwgcHRyZGlmZl90ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KTsKKyAgdHlwZWRlZiBpbnQzMl90KHJ1bl90ZWFtX3JlZ2lvbl90eSkoaW50MzJfdCwgdm9pZCAqLCB2b2lkICoqLCBwdHJkaWZmX3QgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCwgaW50MzJfdCwgaW50MzJfdCwgdWludDY0X3QpOworCisgIGludDMyX3QgSWR4OyAgICAgICAgICAgICAgICAgICAgIC8vIFJUTCBpbmRleCwgaW5kZXggaXMgdGhlIG51bWJlciBvZiBkZXZpY2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIG90aGVyIFJUTHMgdGhhdCB3ZXJlIHJlZ2lzdGVyZWQgYmVmb3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpLmUuIHRoZSBPcGVuTVAgaW5kZXggb2YgdGhlIGZpcnN0IGRldmljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSByZWdpc3RlcmVkIHdpdGggdGhpcyBSVEwuCisgIGludDMyX3QgTnVtYmVyT2ZEZXZpY2VzOyAgICAgICAgIC8vIE51bWJlciBvZiBkZXZpY2VzIHRoaXMgUlRMIGRlYWxzIHdpdGguCisgIHN0ZDo6dmVjdG9yPERldmljZVR5ICo+IERldmljZXM7IC8vIG9uZSBwZXIgZGV2aWNlIChOdW1iZXJPZkRldmljZXMgaW4gdG90YWwpLgorCisgIHZvaWQgKkxpYnJhcnlIYW5kbGVyOworCisjaWZkZWYgT01QVEFSR0VUX0RFQlVHCisgIHN0ZDo6c3RyaW5nIFJUTE5hbWU7CisjZW5kaWYKKworICAvLyBGdW5jdGlvbnMgaW1wbGVtZW50ZWQgaW4gdGhlIFJUTC4KKyAgaXNfdmFsaWRfYmluYXJ5X3R5ICppc192YWxpZF9iaW5hcnk7CisgIG51bWJlcl9vZl9kZXZpY2VzX3R5ICpudW1iZXJfb2ZfZGV2aWNlczsKKyAgaW5pdF9kZXZpY2VfdHkgKmluaXRfZGV2aWNlOworICBsb2FkX2JpbmFyeV90eSAqbG9hZF9iaW5hcnk7CisgIGRhdGFfYWxsb2NfdHkgKmRhdGFfYWxsb2M7CisgIGRhdGFfc3VibWl0X3R5ICpkYXRhX3N1Ym1pdDsKKyAgZGF0YV9yZXRyaWV2ZV90eSAqZGF0YV9yZXRyaWV2ZTsKKyAgZGF0YV9kZWxldGVfdHkgKmRhdGFfZGVsZXRlOworICBydW5fcmVnaW9uX3R5ICpydW5fcmVnaW9uOworICBydW5fdGVhbV9yZWdpb25fdHkgKnJ1bl90ZWFtX3JlZ2lvbjsKKworICAvLyBBcmUgdGhlcmUgaW1hZ2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFJUTC4KKyAgYm9vbCBpc1VzZWQ7CisKKyAgLy8gTXV0ZXggZm9yIHRocmVhZC1zYWZldHkgd2hlbiBjYWxsaW5nIFJUTCBpbnRlcmZhY2UgZnVuY3Rpb25zLgorICAvLyBJdCBpcyBlYXNpZXIgdG8gZW5mb3JjZSB0aHJlYWQtc2FmZXR5IGF0IHRoZSBsaWJvbXB0YXJnZXQgbGV2ZWwsCisgIC8vIHNvIHRoYXQgZGV2ZWxvcGVycyBvZiBuZXcgUlRMcyBkbyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCBpdC4KKyAgc3RkOjptdXRleCBNdHg7CisKKyAgLy8gVGhlIGV4aXN0ZW5jZSBvZiB0aGUgbXV0ZXggYWJvdmUgbWFrZXMgUlRMSW5mb1R5IG5vbi1jb3B5YWJsZS4KKyAgLy8gV2UgbmVlZCB0byBwcm92aWRlIGEgY29weSBjb25zdHJ1Y3RvciBleHBsaWNpdGx5LgorICBSVExJbmZvVHkoKQorICAgICAgOiBJZHgoLTEpLCBOdW1iZXJPZkRldmljZXMoLTEpLCBEZXZpY2VzKCksIExpYnJhcnlIYW5kbGVyKDApLAorI2lmZGVmIE9NUFRBUkdFVF9ERUJVRworICAgICAgICBSVExOYW1lKCksCisjZW5kaWYKKyAgICAgICAgaXNfdmFsaWRfYmluYXJ5KDApLCBudW1iZXJfb2ZfZGV2aWNlcygwKSwgaW5pdF9kZXZpY2UoMCksCisgICAgICAgIGxvYWRfYmluYXJ5KDApLCBkYXRhX2FsbG9jKDApLCBkYXRhX3N1Ym1pdCgwKSwgZGF0YV9yZXRyaWV2ZSgwKSwKKyAgICAgICAgZGF0YV9kZWxldGUoMCksIHJ1bl9yZWdpb24oMCksIHJ1bl90ZWFtX3JlZ2lvbigwKSwgaXNVc2VkKGZhbHNlKSwKKyAgICAgICAgTXR4KCkge30KKworICBSVExJbmZvVHkoY29uc3QgUlRMSW5mb1R5ICZyKSA6IE10eCgpIHsKKyAgICBJZHggPSByLklkeDsKKyAgICBOdW1iZXJPZkRldmljZXMgPSByLk51bWJlck9mRGV2aWNlczsKKyAgICBEZXZpY2VzID0gci5EZXZpY2VzOworICAgIExpYnJhcnlIYW5kbGVyID0gci5MaWJyYXJ5SGFuZGxlcjsKKyNpZmRlZiBPTVBUQVJHRVRfREVCVUcKKyAgICBSVExOYW1lID0gci5SVExOYW1lOworI2VuZGlmCisgICAgaXNfdmFsaWRfYmluYXJ5ID0gci5pc192YWxpZF9iaW5hcnk7CisgICAgbnVtYmVyX29mX2RldmljZXMgPSByLm51bWJlcl9vZl9kZXZpY2VzOworICAgIGluaXRfZGV2aWNlID0gci5pbml0X2RldmljZTsKKyAgICBsb2FkX2JpbmFyeSA9IHIubG9hZF9iaW5hcnk7CisgICAgZGF0YV9hbGxvYyA9IHIuZGF0YV9hbGxvYzsKKyAgICBkYXRhX3N1Ym1pdCA9IHIuZGF0YV9zdWJtaXQ7CisgICAgZGF0YV9yZXRyaWV2ZSA9IHIuZGF0YV9yZXRyaWV2ZTsKKyAgICBkYXRhX2RlbGV0ZSA9IHIuZGF0YV9kZWxldGU7CisgICAgcnVuX3JlZ2lvbiA9IHIucnVuX3JlZ2lvbjsKKyAgICBydW5fdGVhbV9yZWdpb24gPSByLnJ1bl90ZWFtX3JlZ2lvbjsKKyAgICBpc1VzZWQgPSByLmlzVXNlZDsKKyAgfQorfTsKKworLy8vIFJUTHMgaWRlbnRpZmllZCBpbiB0aGUgc3lzdGVtLgorY2xhc3MgUlRMc1R5IHsKK3ByaXZhdGU6CisgIC8vIE11dGV4LWxpa2Ugb2JqZWN0IHRvIGd1YXJhbnRlZSB0aHJlYWQtc2FmZXR5IGFuZCB1bmlxdWUgaW5pdGlhbGl6YXRpb24KKyAgLy8gKGkuZS4gdGhlIGxpYnJhcnkgYXR0ZW1wdHMgdG8gbG9hZCB0aGUgUlRMcyAocGx1Z2lucykgb25seSBvbmNlKS4KKyAgc3RkOjpvbmNlX2ZsYWcgaW5pdEZsYWc7CisgIHZvaWQgTG9hZFJUTHMoKTsgLy8gbm90IHRocmVhZC1zYWZlCisKK3B1YmxpYzoKKyAgLy8gTGlzdCBvZiB0aGUgZGV0ZWN0ZWQgcnVudGltZSBsaWJyYXJpZXMuCisgIHN0ZDo6bGlzdDxSVExJbmZvVHk+IEFsbFJUTHM7CisKKyAgLy8gQXJyYXkgb2YgcG9pbnRlcnMgdG8gdGhlIGRldGVjdGVkIHJ1bnRpbWUgbGlicmFyaWVzIHRoYXQgaGF2ZSBjb21wYXRpYmxlCisgIC8vIGJpbmFyaWVzLgorICBzdGQ6OnZlY3RvcjxSVExJbmZvVHkgKj4gVXNlZFJUTHM7CisKKyAgZXhwbGljaXQgUlRMc1R5KCkge30KKworICAvLyBMb2FkIGFsbCB0aGUgcnVudGltZSBsaWJyYXJpZXMgKHBsdWdpbnMpIGlmIG5vdCBkb25lIGJlZm9yZS4KKyAgdm9pZCBMb2FkUlRMc09uY2UoKTsKK307CisKK3ZvaWQgUlRMc1R5OjpMb2FkUlRMcygpIHsKKyAgLy8gUGFyc2UgZW52aXJvbm1lbnQgdmFyaWFibGUgT01QX1RBUkdFVF9PRkZMT0FEIChpZiBzZXQpCisgIGNoYXIgKmVudlN0ciA9IGdldGVudigiT01QX1RBUkdFVF9PRkZMT0FEIik7CisgIGlmIChlbnZTdHIgJiYgIXN0cmNtcChlbnZTdHIsICJESVNBQkxFRCIpKSB7CisgICAgRFAoIlRhcmdldCBvZmZsb2FkaW5nIGRpc2FibGVkIGJ5IGVudmlyb25tZW50XG4iKTsKKyAgICByZXR1cm47CisgIH0KKworICBEUCgiTG9hZGluZyBSVExzLi4uXG4iKTsKKworICAvLyBBdHRlbXB0IHRvIG9wZW4gYWxsIHRoZSBwbHVnaW5zIGFuZCwgaWYgdGhleSBleGlzdCwgY2hlY2sgaWYgdGhlIGludGVyZmFjZQorICAvLyBpcyBjb3JyZWN0IGFuZCBpZiB0aGV5IGFyZSBzdXBwb3J0aW5nIGFueSBkZXZpY2VzLgorICBmb3IgKGF1dG8gKk5hbWUgOiBSVExOYW1lcykgeworICAgIERQKCJMb2FkaW5nIGxpYnJhcnkgJyVzJy4uLlxuIiwgTmFtZSk7CisgICAgdm9pZCAqZHlubGliX2hhbmRsZSA9IGRsb3BlbihOYW1lLCBSVExEX05PVyk7CisKKyAgICBpZiAoIWR5bmxpYl9oYW5kbGUpIHsKKyAgICAgIC8vIExpYnJhcnkgZG9lcyBub3QgZXhpc3Qgb3IgY2Fubm90IGJlIGZvdW5kLgorICAgICAgRFAoIlVuYWJsZSB0byBsb2FkIGxpYnJhcnkgJyVzJzogJXMhXG4iLCBOYW1lLCBkbGVycm9yKCkpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgRFAoIlN1Y2Nlc3NmdWxseSBsb2FkZWQgbGlicmFyeSAnJXMnIVxuIiwgTmFtZSk7CisKKyAgICAvLyBSZXRyaWV2ZSB0aGUgUlRMIGluZm9ybWF0aW9uIGZyb20gdGhlIHJ1bnRpbWUgbGlicmFyeS4KKyAgICBSVExJbmZvVHkgUjsKKworICAgIFIuTGlicmFyeUhhbmRsZXIgPSBkeW5saWJfaGFuZGxlOworICAgIFIuaXNVc2VkID0gZmFsc2U7CisKKyNpZmRlZiBPTVBUQVJHRVRfREVCVUcKKyAgICBSLlJUTE5hbWUgPSBOYW1lOworI2VuZGlmCisKKyAgICBpZiAoISgqKCh2b2lkKiopICZSLmlzX3ZhbGlkX2JpbmFyeSkgPSBkbHN5bSgKKyAgICAgICAgICAgICAgZHlubGliX2hhbmRsZSwgIl9fdGd0X3J0bF9pc192YWxpZF9iaW5hcnkiKSkpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoISgqKCh2b2lkKiopICZSLm51bWJlcl9vZl9kZXZpY2VzKSA9IGRsc3ltKAorICAgICAgICAgICAgICBkeW5saWJfaGFuZGxlLCAiX190Z3RfcnRsX251bWJlcl9vZl9kZXZpY2VzIikpKQorICAgICAgY29udGludWU7CisgICAgaWYgKCEoKigodm9pZCoqKSAmUi5pbml0X2RldmljZSkgPSBkbHN5bSgKKyAgICAgICAgICAgICAgZHlubGliX2hhbmRsZSwgIl9fdGd0X3J0bF9pbml0X2RldmljZSIpKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmICghKCooKHZvaWQqKikgJlIubG9hZF9iaW5hcnkpID0gZGxzeW0oCisgICAgICAgICAgICAgIGR5bmxpYl9oYW5kbGUsICJfX3RndF9ydGxfbG9hZF9iaW5hcnkiKSkpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoISgqKCh2b2lkKiopICZSLmRhdGFfYWxsb2MpID0gZGxzeW0oCisgICAgICAgICAgICAgIGR5bmxpYl9oYW5kbGUsICJfX3RndF9ydGxfZGF0YV9hbGxvYyIpKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmICghKCooKHZvaWQqKikgJlIuZGF0YV9zdWJtaXQpID0gZGxzeW0oCisgICAgICAgICAgICAgIGR5bmxpYl9oYW5kbGUsICJfX3RndF9ydGxfZGF0YV9zdWJtaXQiKSkpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoISgqKCh2b2lkKiopICZSLmRhdGFfcmV0cmlldmUpID0gZGxzeW0oCisgICAgICAgICAgICAgIGR5bmxpYl9oYW5kbGUsICJfX3RndF9ydGxfZGF0YV9yZXRyaWV2ZSIpKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmICghKCooKHZvaWQqKikgJlIuZGF0YV9kZWxldGUpID0gZGxzeW0oCisgICAgICAgICAgICAgIGR5bmxpYl9oYW5kbGUsICJfX3RndF9ydGxfZGF0YV9kZWxldGUiKSkpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoISgqKCh2b2lkKiopICZSLnJ1bl9yZWdpb24pID0gZGxzeW0oCisgICAgICAgICAgICAgIGR5bmxpYl9oYW5kbGUsICJfX3RndF9ydGxfcnVuX3RhcmdldF9yZWdpb24iKSkpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoISgqKCh2b2lkKiopICZSLnJ1bl90ZWFtX3JlZ2lvbikgPSBkbHN5bSgKKyAgICAgICAgICAgICAgZHlubGliX2hhbmRsZSwgIl9fdGd0X3J0bF9ydW5fdGFyZ2V0X3RlYW1fcmVnaW9uIikpKQorICAgICAgY29udGludWU7CisKKyAgICAvLyBObyBkZXZpY2VzIGFyZSBzdXBwb3J0ZWQgYnkgdGhpcyBSVEw/CisgICAgaWYgKCEoUi5OdW1iZXJPZkRldmljZXMgPSBSLm51bWJlcl9vZl9kZXZpY2VzKCkpKSB7CisgICAgICBEUCgiTm8gZGV2aWNlcyBzdXBwb3J0ZWQgaW4gdGhpcyBSVExcbiIpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgRFAoIlJlZ2lzdGVyaW5nIFJUTCAlcyBzdXBwb3J0aW5nICVkIGRldmljZXMhXG4iLAorICAgICAgICBSLlJUTE5hbWUuY19zdHIoKSwgUi5OdW1iZXJPZkRldmljZXMpOworCisgICAgLy8gVGhlIFJUTCBpcyB2YWxpZCEgV2lsbCBzYXZlIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgUlRMcyBsaXN0LgorICAgIEFsbFJUTHMucHVzaF9iYWNrKFIpOworICB9CisKKyAgRFAoIlJUTHMgbG9hZGVkIVxuIik7CisKKyAgcmV0dXJuOworfQorCit2b2lkIFJUTHNUeTo6TG9hZFJUTHNPbmNlKCkgeworICAvLyBSVEwuTG9hZFJUTHMoKSBpcyBjYWxsZWQgb25seSBvbmNlIGluIGEgdGhyZWFkLXNhZmUgZmFzaGlvbi4KKyAgc3RkOjpjYWxsX29uY2UoaW5pdEZsYWcsICZSVExzVHk6OkxvYWRSVExzLCB0aGlzKTsKK30KKworc3RhdGljIFJUTHNUeSBSVExzOworc3RhdGljIHN0ZDo6bXV0ZXggUlRMc010eDsKKworLy8vIE1hcCBiZXR3ZWVuIHRoZSBob3N0IGVudHJ5IGJlZ2luIGFuZCB0aGUgdHJhbnNsYXRpb24gdGFibGUuIEVhY2gKKy8vLyByZWdpc3RlcmVkIGxpYnJhcnkgZ2V0cyBvbmUgVHJhbnNsYXRpb25UYWJsZS4gVXNlIHRoZSBtYXAgZnJvbQorLy8vIF9fdGd0X29mZmxvYWRfZW50cnkgc28gdGhhdCB3ZSBtYXkgcXVpY2tseSBkZXRlcm1pbmUgd2hldGhlciB3ZQorLy8vIGFyZSB0cnlpbmcgdG8gKHJlKXJlZ2lzdGVyIGFuIGV4aXN0aW5nIGxpYiBvciByZWFsbHkgaGF2ZSBhIG5ldyBvbmUuCitzdHJ1Y3QgVHJhbnNsYXRpb25UYWJsZSB7CisgIF9fdGd0X3RhcmdldF90YWJsZSBIb3N0VGFibGU7CisKKyAgLy8gSW1hZ2UgYXNzaWduZWQgdG8gYSBnaXZlbiBkZXZpY2UuCisgIHN0ZDo6dmVjdG9yPF9fdGd0X2RldmljZV9pbWFnZSAqPiBUYXJnZXRzSW1hZ2VzOyAvLyBPbmUgaW1hZ2UgcGVyIGRldmljZSBJRC4KKworICAvLyBUYWJsZSBvZiBlbnRyeSBwb2ludHMgb3IgTlVMTCBpZiBpdCB3YXMgbm90IGFscmVhZHkgY29tcHV0ZWQuCisgIHN0ZDo6dmVjdG9yPF9fdGd0X3RhcmdldF90YWJsZSAqPiBUYXJnZXRzVGFibGU7IC8vIE9uZSB0YWJsZSBwZXIgZGV2aWNlIElELgorfTsKK3R5cGVkZWYgc3RkOjptYXA8X190Z3Rfb2ZmbG9hZF9lbnRyeSAqLCBUcmFuc2xhdGlvblRhYmxlPgorICAgIEhvc3RFbnRyaWVzQmVnaW5Ub1RyYW5zVGFibGVUeTsKK3N0YXRpYyBIb3N0RW50cmllc0JlZ2luVG9UcmFuc1RhYmxlVHkgSG9zdEVudHJpZXNCZWdpblRvVHJhbnNUYWJsZTsKK3N0YXRpYyBzdGQ6Om11dGV4IFRybFRibE10eDsKKworLy8vIE1hcCBiZXR3ZWVuIHRoZSBob3N0IHB0ciBhbmQgYSB0YWJsZSBpbmRleAorc3RydWN0IFRhYmxlTWFwIHsKKyAgVHJhbnNsYXRpb25UYWJsZSAqVGFibGU7IC8vIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaG9zdCBwdHIuCisgIHVpbnQzMl90IEluZGV4OyAvLyBpbmRleCBpbiB3aGljaCB0aGUgaG9zdCBwdHIgdHJhbnNsYXRlZCBlbnRyeSBpcyBmb3VuZC4KKyAgVGFibGVNYXAoKSA6IFRhYmxlKDApLCBJbmRleCgwKSB7fQorICBUYWJsZU1hcChUcmFuc2xhdGlvblRhYmxlICp0YWJsZSwgdWludDMyX3QgaW5kZXgpCisgICAgICA6IFRhYmxlKHRhYmxlKSwgSW5kZXgoaW5kZXgpIHt9Cit9OwordHlwZWRlZiBzdGQ6Om1hcDx2b2lkICosIFRhYmxlTWFwPiBIb3N0UHRyVG9UYWJsZU1hcFR5Oworc3RhdGljIEhvc3RQdHJUb1RhYmxlTWFwVHkgSG9zdFB0clRvVGFibGVNYXA7CitzdGF0aWMgc3RkOjptdXRleCBUYmxNYXBNdHg7CisKKy8vLyBDaGVjayB3aGV0aGVyIGEgZGV2aWNlIGhhcyBhbiBhc3NvY2lhdGVkIFJUTCBhbmQgaW5pdGlhbGl6ZSBpdCBpZiBpdCdzIG5vdAorLy8vIGFscmVhZHkgaW5pdGlhbGl6ZWQuCitzdGF0aWMgYm9vbCBkZXZpY2VfaXNfcmVhZHkoaW50IGRldmljZV9udW0pIHsKKyAgRFAoIkNoZWNraW5nIHdoZXRoZXIgZGV2aWNlICVkIGlzIHJlYWR5LlxuIiwgZGV2aWNlX251bSk7CisgIC8vIERldmljZXMuc2l6ZSgpIGNhbiBvbmx5IGNoYW5nZSB3aGlsZSByZWdpc3RlcmluZyBhIG5ldworICAvLyBsaWJyYXJ5LCBzbyB0cnkgdG8gYWNxdWlyZSB0aGUgbG9jayBvZiBSVExzJyBtdXRleC4KKyAgUlRMc010eC5sb2NrKCk7CisgIHNpemVfdCBEZXZpY2VzX3NpemUgPSBEZXZpY2VzLnNpemUoKTsKKyAgUlRMc010eC51bmxvY2soKTsKKyAgaWYgKERldmljZXNfc2l6ZSA8PSAoc2l6ZV90KWRldmljZV9udW0pIHsKKyAgICBEUCgiRGV2aWNlIElEICAlZCBkb2VzIG5vdCBoYXZlIGEgbWF0Y2hpbmcgUlRMXG4iLCBkZXZpY2VfbnVtKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBHZXQgZGV2aWNlIGluZm8KKyAgRGV2aWNlVHkgJkRldmljZSA9IERldmljZXNbZGV2aWNlX251bV07CisKKyAgRFAoIklzIHRoZSBkZXZpY2UgJWQgKGxvY2FsIElEICVkKSBpbml0aWFsaXplZD8gJWRcbiIsIGRldmljZV9udW0sCisgICAgICAgRGV2aWNlLlJUTERldmljZUlELCBEZXZpY2UuSXNJbml0KTsKKworICAvLyBJbml0IHRoZSBkZXZpY2UgaWYgbm90IGRvbmUgYmVmb3JlCisgIGlmICghRGV2aWNlLklzSW5pdCAmJiBEZXZpY2UuaW5pdE9uY2UoKSAhPSBPRkZMT0FEX1NVQ0NFU1MpIHsKKyAgICBEUCgiRmFpbGVkIHRvIGluaXQgZGV2aWNlICVkXG4iLCBkZXZpY2VfbnVtKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBEUCgiRGV2aWNlICVkIGlzIHJlYWR5IHRvIHVzZS5cbiIsIGRldmljZV9udW0pOworCisgIHJldHVybiB0cnVlOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVGFyZ2V0IEFQSSBmdW5jdGlvbnMKKy8vCitFWFRFUk4gaW50IG9tcF9nZXRfbnVtX2RldmljZXModm9pZCkgeworICBSVExzTXR4LmxvY2soKTsKKyAgc2l6ZV90IERldmljZXNfc2l6ZSA9IERldmljZXMuc2l6ZSgpOworICBSVExzTXR4LnVubG9jaygpOworCisgIERQKCJDYWxsIHRvIG9tcF9nZXRfbnVtX2RldmljZXMgcmV0dXJuaW5nICV6ZFxuIiwgRGV2aWNlc19zaXplKTsKKworICByZXR1cm4gRGV2aWNlc19zaXplOworfQorCitFWFRFUk4gaW50IG9tcF9nZXRfaW5pdGlhbF9kZXZpY2Uodm9pZCkgeworICBEUCgiQ2FsbCB0byBvbXBfZ2V0X2luaXRpYWxfZGV2aWNlIHJldHVybmluZyAlZFxuIiwgSE9TVF9ERVZJQ0UpOworICByZXR1cm4gSE9TVF9ERVZJQ0U7Cit9CisKK0VYVEVSTiB2b2lkICpvbXBfdGFyZ2V0X2FsbG9jKHNpemVfdCBzaXplLCBpbnQgZGV2aWNlX251bSkgeworICBEUCgiQ2FsbCB0byBvbXBfdGFyZ2V0X2FsbG9jIGZvciBkZXZpY2UgJWQgcmVxdWVzdGluZyAlenUgYnl0ZXNcbiIsCisgICAgICBkZXZpY2VfbnVtLCBzaXplKTsKKworICBpZiAoc2l6ZSA8PSAwKSB7CisgICAgRFAoIkNhbGwgdG8gb21wX3RhcmdldF9hbGxvYyB3aXRoIG5vbi1wb3NpdGl2ZSBsZW5ndGhcbiIpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgdm9pZCAqcmMgPSBOVUxMOworCisgIGlmIChkZXZpY2VfbnVtID09IG9tcF9nZXRfaW5pdGlhbF9kZXZpY2UoKSkgeworICAgIHJjID0gbWFsbG9jKHNpemUpOworICAgIERQKCJvbXBfdGFyZ2V0X2FsbG9jIHJldHVybnMgaG9zdCBwdHIgIiBEUHhNT0QgIlxuIiwgRFB4UFRSKHJjKSk7CisgICAgcmV0dXJuIHJjOworICB9CisKKyAgaWYgKCFkZXZpY2VfaXNfcmVhZHkoZGV2aWNlX251bSkpIHsKKyAgICBEUCgib21wX3RhcmdldF9hbGxvYyByZXR1cm5zIE5VTEwgcHRyXG4iKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIERldmljZVR5ICZEZXZpY2UgPSBEZXZpY2VzW2RldmljZV9udW1dOworICByYyA9IERldmljZS5SVEwtPmRhdGFfYWxsb2MoRGV2aWNlLlJUTERldmljZUlELCBzaXplLCBOVUxMKTsKKyAgRFAoIm9tcF90YXJnZXRfYWxsb2MgcmV0dXJucyBkZXZpY2UgcHRyICIgRFB4TU9EICJcbiIsIERQeFBUUihyYykpOworICByZXR1cm4gcmM7Cit9CisKK0VYVEVSTiB2b2lkIG9tcF90YXJnZXRfZnJlZSh2b2lkICpkZXZpY2VfcHRyLCBpbnQgZGV2aWNlX251bSkgeworICBEUCgiQ2FsbCB0byBvbXBfdGFyZ2V0X2ZyZWUgZm9yIGRldmljZSAlZCBhbmQgYWRkcmVzcyAiIERQeE1PRCAiXG4iLAorICAgICAgZGV2aWNlX251bSwgRFB4UFRSKGRldmljZV9wdHIpKTsKKworICBpZiAoIWRldmljZV9wdHIpIHsKKyAgICBEUCgiQ2FsbCB0byBvbXBfdGFyZ2V0X2ZyZWUgd2l0aCBOVUxMIHB0clxuIik7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGRldmljZV9udW0gPT0gb21wX2dldF9pbml0aWFsX2RldmljZSgpKSB7CisgICAgZnJlZShkZXZpY2VfcHRyKTsKKyAgICBEUCgib21wX3RhcmdldF9mcmVlIGRlYWxsb2NhdGVkIGhvc3QgcHRyXG4iKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoIWRldmljZV9pc19yZWFkeShkZXZpY2VfbnVtKSkgeworICAgIERQKCJvbXBfdGFyZ2V0X2ZyZWUgcmV0dXJucywgbm90aGluZyB0byBkb1xuIik7CisgICAgcmV0dXJuOworICB9CisKKyAgRGV2aWNlVHkgJkRldmljZSA9IERldmljZXNbZGV2aWNlX251bV07CisgIERldmljZS5SVEwtPmRhdGFfZGVsZXRlKERldmljZS5SVExEZXZpY2VJRCwgKHZvaWQgKilkZXZpY2VfcHRyKTsKKyAgRFAoIm9tcF90YXJnZXRfZnJlZSBkZWFsbG9jYXRlZCBkZXZpY2UgcHRyXG4iKTsKK30KKworRVhURVJOIGludCBvbXBfdGFyZ2V0X2lzX3ByZXNlbnQodm9pZCAqcHRyLCBpbnQgZGV2aWNlX251bSkgeworICBEUCgiQ2FsbCB0byBvbXBfdGFyZ2V0X2lzX3ByZXNlbnQgZm9yIGRldmljZSAlZCBhbmQgYWRkcmVzcyAiIERQeE1PRCAiXG4iLAorICAgICAgZGV2aWNlX251bSwgRFB4UFRSKHB0cikpOworCisgIGlmICghcHRyKSB7CisgICAgRFAoIkNhbGwgdG8gb21wX3RhcmdldF9pc19wcmVzZW50IHdpdGggTlVMTCBwdHIsIHJldHVybmluZyBmYWxzZVxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKGRldmljZV9udW0gPT0gb21wX2dldF9pbml0aWFsX2RldmljZSgpKSB7CisgICAgRFAoIkNhbGwgdG8gb21wX3RhcmdldF9pc19wcmVzZW50IG9uIGhvc3QsIHJldHVybmluZyB0cnVlXG4iKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIFJUTHNNdHgubG9jaygpOworICBzaXplX3QgRGV2aWNlc19zaXplID0gRGV2aWNlcy5zaXplKCk7CisgIFJUTHNNdHgudW5sb2NrKCk7CisgIGlmIChEZXZpY2VzX3NpemUgPD0gKHNpemVfdClkZXZpY2VfbnVtKSB7CisgICAgRFAoIkNhbGwgdG8gb21wX3RhcmdldF9pc19wcmVzZW50IHdpdGggaW52YWxpZCBkZXZpY2UgSUQsIHJldHVybmluZyAiCisgICAgICAgICJmYWxzZVxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgRGV2aWNlVHkmIERldmljZSA9IERldmljZXNbZGV2aWNlX251bV07CisgIGJvb2wgSXNMYXN0OyAvLyBub3QgdXNlZAorICBpbnQgcmMgPSAoRGV2aWNlLmdldFRndFB0ckJlZ2luKHB0ciwgMCwgSXNMYXN0LCBmYWxzZSkgIT0gTlVMTCk7CisgIERQKCJDYWxsIHRvIG9tcF90YXJnZXRfaXNfcHJlc2VudCByZXR1cm5zICVkXG4iLCByYyk7CisgIHJldHVybiByYzsKK30KKworRVhURVJOIGludCBvbXBfdGFyZ2V0X21lbWNweSh2b2lkICpkc3QsIHZvaWQgKnNyYywgc2l6ZV90IGxlbmd0aCwKKyAgICBzaXplX3QgZHN0X29mZnNldCwgc2l6ZV90IHNyY19vZmZzZXQsIGludCBkc3RfZGV2aWNlLCBpbnQgc3JjX2RldmljZSkgeworICBEUCgiQ2FsbCB0byBvbXBfdGFyZ2V0X21lbWNweSwgZHN0IGRldmljZSAlZCwgc3JjIGRldmljZSAlZCwgIgorICAgICAgImRzdCBhZGRyICIgRFB4TU9EICIsIHNyYyBhZGRyICIgRFB4TU9EICIsIGRzdCBvZmZzZXQgJXp1LCAiCisgICAgICAic3JjIG9mZnNldCAlenUsIGxlbmd0aCAlenVcbiIsIGRzdF9kZXZpY2UsIHNyY19kZXZpY2UsIERQeFBUUihkc3QpLAorICAgICAgRFB4UFRSKHNyYyksIGRzdF9vZmZzZXQsIHNyY19vZmZzZXQsIGxlbmd0aCk7CisKKyAgaWYgKCFkc3QgfHwgIXNyYyB8fCBsZW5ndGggPD0gMCkgeworICAgIERQKCJDYWxsIHRvIG9tcF90YXJnZXRfbWVtY3B5IHdpdGggaW52YWxpZCBhcmd1bWVudHNcbiIpOworICAgIHJldHVybiBPRkZMT0FEX0ZBSUw7CisgIH0KKworICBpZiAoc3JjX2RldmljZSAhPSBvbXBfZ2V0X2luaXRpYWxfZGV2aWNlKCkgJiYgIWRldmljZV9pc19yZWFkeShzcmNfZGV2aWNlKSkgeworICAgICAgRFAoIm9tcF90YXJnZXRfbWVtY3B5IHJldHVybnMgT0ZGTE9BRF9GQUlMXG4iKTsKKyAgICAgIHJldHVybiBPRkZMT0FEX0ZBSUw7CisgIH0KKworICBpZiAoZHN0X2RldmljZSAhPSBvbXBfZ2V0X2luaXRpYWxfZGV2aWNlKCkgJiYgIWRldmljZV9pc19yZWFkeShkc3RfZGV2aWNlKSkgeworICAgICAgRFAoIm9tcF90YXJnZXRfbWVtY3B5IHJldHVybnMgT0ZGTE9BRF9GQUlMXG4iKTsKKyAgICAgIHJldHVybiBPRkZMT0FEX0ZBSUw7CisgIH0KKworICBpbnQgcmMgPSBPRkZMT0FEX1NVQ0NFU1M7CisgIHZvaWQgKnNyY0FkZHIgPSAoY2hhciAqKXNyYyArIHNyY19vZmZzZXQ7CisgIHZvaWQgKmRzdEFkZHIgPSAoY2hhciAqKWRzdCArIGRzdF9vZmZzZXQ7CisKKyAgaWYgKHNyY19kZXZpY2UgPT0gb21wX2dldF9pbml0aWFsX2RldmljZSgpICYmCisgICAgICBkc3RfZGV2aWNlID09IG9tcF9nZXRfaW5pdGlhbF9kZXZpY2UoKSkgeworICAgIERQKCJjb3B5IGZyb20gaG9zdCB0byBob3N0XG4iKTsKKyAgICBjb25zdCB2b2lkICpwID0gbWVtY3B5KGRzdEFkZHIsIHNyY0FkZHIsIGxlbmd0aCk7CisgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgIHJjID0gT0ZGTE9BRF9GQUlMOworICB9IGVsc2UgaWYgKHNyY19kZXZpY2UgPT0gb21wX2dldF9pbml0aWFsX2RldmljZSgpKSB7CisgICAgRFAoImNvcHkgZnJvbSBob3N0IHRvIGRldmljZVxuIik7CisgICAgRGV2aWNlVHkmIERzdERldiA9IERldmljZXNbZHN0X2RldmljZV07CisgICAgcmMgPSBEc3REZXYuZGF0YV9zdWJtaXQoZHN0QWRkciwgc3JjQWRkciwgbGVuZ3RoKTsKKyAgfSBlbHNlIGlmIChkc3RfZGV2aWNlID09IG9tcF9nZXRfaW5pdGlhbF9kZXZpY2UoKSkgeworICAgIERQKCJjb3B5IGZyb20gZGV2aWNlIHRvIGhvc3RcbiIpOworICAgIERldmljZVR5JiBTcmNEZXYgPSBEZXZpY2VzW3NyY19kZXZpY2VdOworICAgIHJjID0gU3JjRGV2LmRhdGFfcmV0cmlldmUoZHN0QWRkciwgc3JjQWRkciwgbGVuZ3RoKTsKKyAgfSBlbHNlIHsKKyAgICBEUCgiY29weSBmcm9tIGRldmljZSB0byBkZXZpY2VcbiIpOworICAgIHZvaWQgKmJ1ZmZlciA9IG1hbGxvYyhsZW5ndGgpOworICAgIERldmljZVR5JiBTcmNEZXYgPSBEZXZpY2VzW3NyY19kZXZpY2VdOworICAgIERldmljZVR5JiBEc3REZXYgPSBEZXZpY2VzW2RzdF9kZXZpY2VdOworICAgIHJjID0gU3JjRGV2LmRhdGFfcmV0cmlldmUoYnVmZmVyLCBzcmNBZGRyLCBsZW5ndGgpOworICAgIGlmIChyYyA9PSBPRkZMT0FEX1NVQ0NFU1MpCisgICAgICByYyA9IERzdERldi5kYXRhX3N1Ym1pdChkc3RBZGRyLCBidWZmZXIsIGxlbmd0aCk7CisgIH0KKworICBEUCgib21wX3RhcmdldF9tZW1jcHkgcmV0dXJucyAlZFxuIiwgcmMpOworICByZXR1cm4gcmM7Cit9CisKK0VYVEVSTiBpbnQgb21wX3RhcmdldF9tZW1jcHlfcmVjdCh2b2lkICpkc3QsIHZvaWQgKnNyYywgc2l6ZV90IGVsZW1lbnRfc2l6ZSwKKyAgICBpbnQgbnVtX2RpbXMsIGNvbnN0IHNpemVfdCAqdm9sdW1lLCBjb25zdCBzaXplX3QgKmRzdF9vZmZzZXRzLAorICAgIGNvbnN0IHNpemVfdCAqc3JjX29mZnNldHMsIGNvbnN0IHNpemVfdCAqZHN0X2RpbWVuc2lvbnMsCisgICAgY29uc3Qgc2l6ZV90ICpzcmNfZGltZW5zaW9ucywgaW50IGRzdF9kZXZpY2UsIGludCBzcmNfZGV2aWNlKSB7CisgIERQKCJDYWxsIHRvIG9tcF90YXJnZXRfbWVtY3B5X3JlY3QsIGRzdCBkZXZpY2UgJWQsIHNyYyBkZXZpY2UgJWQsICIKKyAgICAgICJkc3QgYWRkciAiIERQeE1PRCAiLCBzcmMgYWRkciAiIERQeE1PRCAiLCBkc3Qgb2Zmc2V0cyAiIERQeE1PRCAiLCAiCisgICAgICAic3JjIG9mZnNldHMgIiBEUHhNT0QgIiwgZHN0IGRpbXMgIiBEUHhNT0QgIiwgc3JjIGRpbXMgIiBEUHhNT0QgIiwgIgorICAgICAgInZvbHVtZSAiIERQeE1PRCAiLCBlbGVtZW50IHNpemUgJXp1LCBudW1fZGltcyAlZFxuIiwgZHN0X2RldmljZSwKKyAgICAgIHNyY19kZXZpY2UsIERQeFBUUihkc3QpLCBEUHhQVFIoc3JjKSwgRFB4UFRSKGRzdF9vZmZzZXRzKSwKKyAgICAgIERQeFBUUihzcmNfb2Zmc2V0cyksIERQeFBUUihkc3RfZGltZW5zaW9ucyksIERQeFBUUihzcmNfZGltZW5zaW9ucyksCisgICAgICBEUHhQVFIodm9sdW1lKSwgZWxlbWVudF9zaXplLCBudW1fZGltcyk7CisKKyAgaWYgKCEoZHN0IHx8IHNyYykpIHsKKyAgICBEUCgiQ2FsbCB0byBvbXBfdGFyZ2V0X21lbWNweV9yZWN0IHJldHVybnMgbWF4IHN1cHBvcnRlZCBkaW1lbnNpb25zICVkXG4iLAorICAgICAgICBJTlRfTUFYKTsKKyAgICByZXR1cm4gSU5UX01BWDsKKyAgfQorCisgIGlmICghZHN0IHx8ICFzcmMgfHwgZWxlbWVudF9zaXplIDwgMSB8fCBudW1fZGltcyA8IDEgfHwgIXZvbHVtZSB8fAorICAgICAgIWRzdF9vZmZzZXRzIHx8ICFzcmNfb2Zmc2V0cyB8fCAhZHN0X2RpbWVuc2lvbnMgfHwgIXNyY19kaW1lbnNpb25zKSB7CisgICAgRFAoIkNhbGwgdG8gb21wX3RhcmdldF9tZW1jcHlfcmVjdCB3aXRoIGludmFsaWQgYXJndW1lbnRzXG4iKTsKKyAgICByZXR1cm4gT0ZGTE9BRF9GQUlMOworICB9CisKKyAgaW50IHJjOworICBpZiAobnVtX2RpbXMgPT0gMSkgeworICAgIHJjID0gb21wX3RhcmdldF9tZW1jcHkoZHN0LCBzcmMsIGVsZW1lbnRfc2l6ZSAqIHZvbHVtZVswXSwKKyAgICAgICAgZWxlbWVudF9zaXplICogZHN0X29mZnNldHNbMF0sIGVsZW1lbnRfc2l6ZSAqIHNyY19vZmZzZXRzWzBdLAorICAgICAgICBkc3RfZGV2aWNlLCBzcmNfZGV2aWNlKTsKKyAgfSBlbHNlIHsKKyAgICBzaXplX3QgZHN0X3NsaWNlX3NpemUgPSBlbGVtZW50X3NpemU7CisgICAgc2l6ZV90IHNyY19zbGljZV9zaXplID0gZWxlbWVudF9zaXplOworICAgIGZvciAoaW50IGk9MTsgaTxudW1fZGltczsgKytpKSB7CisgICAgICBkc3Rfc2xpY2Vfc2l6ZSAqPSBkc3RfZGltZW5zaW9uc1tpXTsKKyAgICAgIHNyY19zbGljZV9zaXplICo9IHNyY19kaW1lbnNpb25zW2ldOworICAgIH0KKworICAgIHNpemVfdCBkc3Rfb2ZmID0gZHN0X29mZnNldHNbMF0gKiBkc3Rfc2xpY2Vfc2l6ZTsKKyAgICBzaXplX3Qgc3JjX29mZiA9IHNyY19vZmZzZXRzWzBdICogc3JjX3NsaWNlX3NpemU7CisgICAgZm9yIChzaXplX3QgaT0wOyBpPHZvbHVtZVswXTsgKytpKSB7CisgICAgICByYyA9IG9tcF90YXJnZXRfbWVtY3B5X3JlY3QoKGNoYXIgKikgZHN0ICsgZHN0X29mZiArIGRzdF9zbGljZV9zaXplICogaSwKKyAgICAgICAgICAoY2hhciAqKSBzcmMgKyBzcmNfb2ZmICsgc3JjX3NsaWNlX3NpemUgKiBpLCBlbGVtZW50X3NpemUsCisgICAgICAgICAgbnVtX2RpbXMgLSAxLCB2b2x1bWUgKyAxLCBkc3Rfb2Zmc2V0cyArIDEsIHNyY19vZmZzZXRzICsgMSwKKyAgICAgICAgICBkc3RfZGltZW5zaW9ucyArIDEsIHNyY19kaW1lbnNpb25zICsgMSwgZHN0X2RldmljZSwgc3JjX2RldmljZSk7CisKKyAgICAgIGlmIChyYykgeworICAgICAgICBEUCgiUmVjdXJzaXZlIGNhbGwgdG8gb21wX3RhcmdldF9tZW1jcHlfcmVjdCByZXR1cm5zIHVuc3VjY2Vzc2Z1bGx5XG4iKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgICAgfQorICAgIH0KKyAgfQorCisgIERQKCJvbXBfdGFyZ2V0X21lbWNweV9yZWN0IHJldHVybnMgJWRcbiIsIHJjKTsKKyAgcmV0dXJuIHJjOworfQorCitFWFRFUk4gaW50IG9tcF90YXJnZXRfYXNzb2NpYXRlX3B0cih2b2lkICpob3N0X3B0ciwgdm9pZCAqZGV2aWNlX3B0ciwKKyAgICBzaXplX3Qgc2l6ZSwgc2l6ZV90IGRldmljZV9vZmZzZXQsIGludCBkZXZpY2VfbnVtKSB7CisgIERQKCJDYWxsIHRvIG9tcF90YXJnZXRfYXNzb2NpYXRlX3B0ciB3aXRoIGhvc3RfcHRyICIgRFB4TU9EICIsICIKKyAgICAgICJkZXZpY2VfcHRyICIgRFB4TU9EICIsIHNpemUgJXp1LCBkZXZpY2Vfb2Zmc2V0ICV6dSwgZGV2aWNlX251bSAlZFxuIiwKKyAgICAgIERQeFBUUihob3N0X3B0ciksIERQeFBUUihkZXZpY2VfcHRyKSwgc2l6ZSwgZGV2aWNlX29mZnNldCwgZGV2aWNlX251bSk7CisKKyAgaWYgKCFob3N0X3B0ciB8fCAhZGV2aWNlX3B0ciB8fCBzaXplIDw9IDApIHsKKyAgICBEUCgiQ2FsbCB0byBvbXBfdGFyZ2V0X2Fzc29jaWF0ZV9wdHIgd2l0aCBpbnZhbGlkIGFyZ3VtZW50c1xuIik7CisgICAgcmV0dXJuIE9GRkxPQURfRkFJTDsKKyAgfQorCisgIGlmIChkZXZpY2VfbnVtID09IG9tcF9nZXRfaW5pdGlhbF9kZXZpY2UoKSkgeworICAgIERQKCJvbXBfdGFyZ2V0X2Fzc29jaWF0ZV9wdHI6IG5vIGFzc29jaWF0aW9uIHBvc3NpYmxlIG9uIHRoZSBob3N0XG4iKTsKKyAgICByZXR1cm4gT0ZGTE9BRF9GQUlMOworICB9CisKKyAgaWYgKCFkZXZpY2VfaXNfcmVhZHkoZGV2aWNlX251bSkpIHsKKyAgICBEUCgib21wX3RhcmdldF9hc3NvY2lhdGVfcHRyIHJldHVybnMgT0ZGTE9BRF9GQUlMXG4iKTsKKyAgICByZXR1cm4gT0ZGTE9BRF9GQUlMOworICB9CisKKyAgRGV2aWNlVHkmIERldmljZSA9IERldmljZXNbZGV2aWNlX251bV07CisgIHZvaWQgKmRldmljZV9hZGRyID0gKHZvaWQgKikoKHVpbnQ2NF90KWRldmljZV9wdHIgKyAodWludDY0X3QpZGV2aWNlX29mZnNldCk7CisgIGludCByYyA9IERldmljZS5hc3NvY2lhdGVQdHIoaG9zdF9wdHIsIGRldmljZV9hZGRyLCBzaXplKTsKKyAgRFAoIm9tcF90YXJnZXRfYXNzb2NpYXRlX3B0ciByZXR1cm5zICVkXG4iLCByYyk7CisgIHJldHVybiByYzsKK30KKworRVhURVJOIGludCBvbXBfdGFyZ2V0X2Rpc2Fzc29jaWF0ZV9wdHIodm9pZCAqaG9zdF9wdHIsIGludCBkZXZpY2VfbnVtKSB7CisgIERQKCJDYWxsIHRvIG9tcF90YXJnZXRfZGlzYXNzb2NpYXRlX3B0ciB3aXRoIGhvc3RfcHRyICIgRFB4TU9EICIsICIKKyAgICAgICJkZXZpY2VfbnVtICVkXG4iLCBEUHhQVFIoaG9zdF9wdHIpLCBkZXZpY2VfbnVtKTsKKworICBpZiAoIWhvc3RfcHRyKSB7CisgICAgRFAoIkNhbGwgdG8gb21wX3RhcmdldF9hc3NvY2lhdGVfcHRyIHdpdGggaW52YWxpZCBob3N0X3B0clxuIik7CisgICAgcmV0dXJuIE9GRkxPQURfRkFJTDsKKyAgfQorCisgIGlmIChkZXZpY2VfbnVtID09IG9tcF9nZXRfaW5pdGlhbF9kZXZpY2UoKSkgeworICAgIERQKCJvbXBfdGFyZ2V0X2Rpc2Fzc29jaWF0ZV9wdHI6IG5vIGFzc29jaWF0aW9uIHBvc3NpYmxlIG9uIHRoZSBob3N0XG4iKTsKKyAgICByZXR1cm4gT0ZGTE9BRF9GQUlMOworICB9CisKKyAgaWYgKCFkZXZpY2VfaXNfcmVhZHkoZGV2aWNlX251bSkpIHsKKyAgICBEUCgib21wX3RhcmdldF9kaXNhc3NvY2lhdGVfcHRyIHJldHVybnMgT0ZGTE9BRF9GQUlMXG4iKTsKKyAgICByZXR1cm4gT0ZGTE9BRF9GQUlMOworICB9CisKKyAgRGV2aWNlVHkmIERldmljZSA9IERldmljZXNbZGV2aWNlX251bV07CisgIGludCByYyA9IERldmljZS5kaXNhc3NvY2lhdGVQdHIoaG9zdF9wdHIpOworICBEUCgib21wX3RhcmdldF9kaXNhc3NvY2lhdGVfcHRyIHJldHVybnMgJWRcbiIsIHJjKTsKKyAgcmV0dXJuIHJjOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gZnVuY3Rpb25hbGl0eSBmb3IgZGV2aWNlCisKK2ludCBEZXZpY2VUeTo6YXNzb2NpYXRlUHRyKHZvaWQgKkhzdFB0ckJlZ2luLCB2b2lkICpUZ3RQdHJCZWdpbiwgaW50NjRfdCBTaXplKSB7CisgIERhdGFNYXBNdHgubG9jaygpOworCisgIC8vIENoZWNrIGlmIGVudHJ5IGV4aXN0cworICBmb3IgKGF1dG8gJkhUIDogSG9zdERhdGFUb1RhcmdldE1hcCkgeworICAgIGlmICgodWludHB0cl90KUhzdFB0ckJlZ2luID09IEhULkhzdFB0ckJlZ2luKSB7CisgICAgICAvLyBNYXBwaW5nIGFscmVhZHkgZXhpc3RzCisgICAgICBib29sIGlzVmFsaWQgPSBIVC5Ic3RQdHJCZWdpbiA9PSAodWludHB0cl90KSBIc3RQdHJCZWdpbiAmJgorICAgICAgICAgICAgICAgICAgICAgSFQuSHN0UHRyRW5kID09ICh1aW50cHRyX3QpIEhzdFB0ckJlZ2luICsgU2l6ZSAmJgorICAgICAgICAgICAgICAgICAgICAgSFQuVGd0UHRyQmVnaW4gPT0gKHVpbnRwdHJfdCkgVGd0UHRyQmVnaW47CisgICAgICBEYXRhTWFwTXR4LnVubG9jaygpOworICAgICAgaWYgKGlzVmFsaWQpIHsKKyAgICAgICAgRFAoIkF0dGVtcHQgdG8gcmUtYXNzb2NpYXRlIHRoZSBzYW1lIGRldmljZSBwdHIrb2Zmc2V0IHdpdGggdGhlIHNhbWUgIgorICAgICAgICAgICAgImhvc3QgcHRyLCBub3RoaW5nIHRvIGRvXG4iKTsKKyAgICAgICAgcmV0dXJuIE9GRkxPQURfU1VDQ0VTUzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIERQKCJOb3QgYWxsb3dlZCB0byByZS1hc3NvY2lhdGUgYSBkaWZmZXJlbnQgZGV2aWNlIHB0citvZmZzZXQgd2l0aCB0aGUgIgorICAgICAgICAgICAgInNhbWUgaG9zdCBwdHJcbiIpOworICAgICAgICByZXR1cm4gT0ZGTE9BRF9GQUlMOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIE1hcHBpbmcgZG9lcyBub3QgZXhpc3QsIGFsbG9jYXRlIGl0CisgIEhvc3REYXRhVG9UYXJnZXRUeSBuZXdFbnRyeTsKKworICAvLyBTZXQgdXAgbWlzc2luZyBmaWVsZHMKKyAgbmV3RW50cnkuSHN0UHRyQmFzZSA9ICh1aW50cHRyX3QpIEhzdFB0ckJlZ2luOworICBuZXdFbnRyeS5Ic3RQdHJCZWdpbiA9ICh1aW50cHRyX3QpIEhzdFB0ckJlZ2luOworICBuZXdFbnRyeS5Ic3RQdHJFbmQgPSAodWludHB0cl90KSBIc3RQdHJCZWdpbiArIFNpemU7CisgIG5ld0VudHJ5LlRndFB0ckJlZ2luID0gKHVpbnRwdHJfdCkgVGd0UHRyQmVnaW47CisgIC8vIHJlZkNvdW50IG11c3QgYmUgaW5maW5pdGUKKyAgbmV3RW50cnkuUmVmQ291bnQgPSBJTkZfUkVGX0NOVDsKKworICBEUCgiQ3JlYXRpbmcgbmV3IG1hcCBlbnRyeTogSHN0QmFzZT0iIERQeE1PRCAiLCBIc3RCZWdpbj0iIERQeE1PRCAiLCBIc3RFbmQ9IgorICAgICAgRFB4TU9EICIsIFRndEJlZ2luPSIgRFB4TU9EICJcbiIsIERQeFBUUihuZXdFbnRyeS5Ic3RQdHJCYXNlKSwKKyAgICAgIERQeFBUUihuZXdFbnRyeS5Ic3RQdHJCZWdpbiksIERQeFBUUihuZXdFbnRyeS5Ic3RQdHJFbmQpLAorICAgICAgRFB4UFRSKG5ld0VudHJ5LlRndFB0ckJlZ2luKSk7CisgIEhvc3REYXRhVG9UYXJnZXRNYXAucHVzaF9mcm9udChuZXdFbnRyeSk7CisKKyAgRGF0YU1hcE10eC51bmxvY2soKTsKKworICByZXR1cm4gT0ZGTE9BRF9TVUNDRVNTOworfQorCitpbnQgRGV2aWNlVHk6OmRpc2Fzc29jaWF0ZVB0cih2b2lkICpIc3RQdHJCZWdpbikgeworICBEYXRhTWFwTXR4LmxvY2soKTsKKworICAvLyBDaGVjayBpZiBlbnRyeSBleGlzdHMKKyAgZm9yIChIb3N0RGF0YVRvVGFyZ2V0TGlzdFR5OjppdGVyYXRvciBpaSA9IEhvc3REYXRhVG9UYXJnZXRNYXAuYmVnaW4oKTsKKyAgICAgIGlpICE9IEhvc3REYXRhVG9UYXJnZXRNYXAuZW5kKCk7ICsraWkpIHsKKyAgICBpZiAoKHVpbnRwdHJfdClIc3RQdHJCZWdpbiA9PSBpaS0+SHN0UHRyQmVnaW4pIHsKKyAgICAgIC8vIE1hcHBpbmcgZXhpc3RzCisgICAgICBpZiAoQ09OU0lERVJFRF9JTkYoaWktPlJlZkNvdW50KSkgeworICAgICAgICBEUCgiQXNzb2NpYXRpb24gZm91bmQsIHJlbW92aW5nIGl0XG4iKTsKKyAgICAgICAgSG9zdERhdGFUb1RhcmdldE1hcC5lcmFzZShpaSk7CisgICAgICAgIERhdGFNYXBNdHgudW5sb2NrKCk7CisgICAgICAgIHJldHVybiBPRkZMT0FEX1NVQ0NFU1M7CisgICAgICB9IGVsc2UgeworICAgICAgICBEUCgiVHJ5aW5nIHRvIGRpc2Fzc29jaWF0ZSBhIHBvaW50ZXIgd2hpY2ggd2FzIG5vdCBtYXBwZWQgdmlhICIKKyAgICAgICAgICAgICJvbXBfdGFyZ2V0X2Fzc29jaWF0ZV9wdHJcbiIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBNYXBwaW5nIG5vdCBmb3VuZAorICBEYXRhTWFwTXR4LnVubG9jaygpOworICBEUCgiQXNzb2NpYXRpb24gbm90IGZvdW5kXG4iKTsKKyAgcmV0dXJuIE9GRkxPQURfRkFJTDsKK30KKworLy8gR2V0IHJlZiBjb3VudCBvZiBtYXAgZW50cnkgY29udGFpbmluZyBIc3RQdHJCZWdpbgorbG9uZyBEZXZpY2VUeTo6Z2V0TWFwRW50cnlSZWZDbnQodm9pZCAqSHN0UHRyQmVnaW4pIHsKKyAgdWludHB0cl90IGhwID0gKHVpbnRwdHJfdClIc3RQdHJCZWdpbjsKKyAgbG9uZyBSZWZDbnQgPSAtMTsKKworICBEYXRhTWFwTXR4LmxvY2soKTsKKyAgZm9yIChhdXRvICZIVCA6IEhvc3REYXRhVG9UYXJnZXRNYXApIHsKKyAgICBpZiAoaHAgPj0gSFQuSHN0UHRyQmVnaW4gJiYgaHAgPCBIVC5Ic3RQdHJFbmQpIHsKKyAgICAgIERQKCJEZXZpY2VUeTo6Z2V0TWFwRW50cnk6IHJlcXVlc3RlZCBlbnRyeSBmb3VuZFxuIik7CisgICAgICBSZWZDbnQgPSBIVC5SZWZDb3VudDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBEYXRhTWFwTXR4LnVubG9jaygpOworCisgIGlmIChSZWZDbnQgPCAwKSB7CisgICAgRFAoIkRldmljZVR5OjpnZXRNYXBFbnRyeTogcmVxdWVzdGVkIGVudHJ5IG5vdCBmb3VuZFxuIik7CisgIH0KKworICByZXR1cm4gUmVmQ250OworfQorCitMb29rdXBSZXN1bHQgRGV2aWNlVHk6Omxvb2t1cE1hcHBpbmcodm9pZCAqSHN0UHRyQmVnaW4sIGludDY0X3QgU2l6ZSkgeworICB1aW50cHRyX3QgaHAgPSAodWludHB0cl90KUhzdFB0ckJlZ2luOworICBMb29rdXBSZXN1bHQgbHI7CisKKyAgRFAoIkxvb2tpbmcgdXAgbWFwcGluZyhIc3RQdHJCZWdpbj0iIERQeE1PRCAiLCBTaXplPSVsZCkuLi5cbiIsIERQeFBUUihocCksCisgICAgICBTaXplKTsKKyAgZm9yIChsci5FbnRyeSA9IEhvc3REYXRhVG9UYXJnZXRNYXAuYmVnaW4oKTsKKyAgICAgIGxyLkVudHJ5ICE9IEhvc3REYXRhVG9UYXJnZXRNYXAuZW5kKCk7ICsrbHIuRW50cnkpIHsKKyAgICBhdXRvICZIVCA9ICpsci5FbnRyeTsKKyAgICAvLyBJcyBpdCBjb250YWluZWQ/CisgICAgbHIuRmxhZ3MuSXNDb250YWluZWQgPSBocCA+PSBIVC5Ic3RQdHJCZWdpbiAmJiBocCA8IEhULkhzdFB0ckVuZCAmJgorICAgICAgICAoaHArU2l6ZSkgPD0gSFQuSHN0UHRyRW5kOworICAgIC8vIERvZXMgaXQgZXh0ZW5kIGludG8gYW4gYWxyZWFkeSBtYXBwZWQgcmVnaW9uPworICAgIGxyLkZsYWdzLkV4dGVuZHNCZWZvcmUgPSBocCA8IEhULkhzdFB0ckJlZ2luICYmIChocCtTaXplKSA+IEhULkhzdFB0ckJlZ2luOworICAgIC8vIERvZXMgaXQgZXh0ZW5kIGJleW9uZCB0aGUgbWFwcGVkIHJlZ2lvbj8KKyAgICBsci5GbGFncy5FeHRlbmRzQWZ0ZXIgPSBocCA8IEhULkhzdFB0ckVuZCAmJiAoaHArU2l6ZSkgPiBIVC5Ic3RQdHJFbmQ7CisKKyAgICBpZiAobHIuRmxhZ3MuSXNDb250YWluZWQgfHwgbHIuRmxhZ3MuRXh0ZW5kc0JlZm9yZSB8fAorICAgICAgICBsci5GbGFncy5FeHRlbmRzQWZ0ZXIpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChsci5GbGFncy5FeHRlbmRzQmVmb3JlKSB7CisgICAgRFAoIldBUk5JTkc6IFBvaW50ZXIgaXMgbm90IG1hcHBlZCBidXQgc2VjdGlvbiBleHRlbmRzIGludG8gYWxyZWFkeSAiCisgICAgICAgICJtYXBwZWQgZGF0YVxuIik7CisgIH0KKyAgaWYgKGxyLkZsYWdzLkV4dGVuZHNBZnRlcikgeworICAgIERQKCJXQVJOSU5HOiBQb2ludGVyIGlzIGFscmVhZHkgbWFwcGVkIGJ1dCBzZWN0aW9uIGV4dGVuZHMgYmV5b25kIG1hcHBlZCAiCisgICAgICAgICJyZWdpb25cbiIpOworICB9CisKKyAgcmV0dXJuIGxyOworfQorCisvLyBVc2VkIGJ5IHRhcmdldF9kYXRhX2JlZ2luCisvLyBSZXR1cm4gdGhlIHRhcmdldCBwb2ludGVyIGJlZ2luICh3aGVyZSB0aGUgZGF0YSB3aWxsIGJlIG1vdmVkKS4KKy8vIEFsbG9jYXRlIG1lbW9yeSBpZiB0aGlzIGlzIHRoZSBmaXJzdCBvY2N1cnJlbmNlIGlmIHRoaXMgbWFwcGluZy4KKy8vIEluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50ZXIuCisvLyBJZiBOVUxMIGlzIHJldHVybmVkLCB0aGVuIGVpdGhlciBkYXRhIGFsbG9jYXRpb24gZmFpbGVkIG9yIHRoZSB1c2VyIHRyaWVkCisvLyB0byBkbyBhbiBpbGxlZ2FsIG1hcHBpbmcuCit2b2lkICpEZXZpY2VUeTo6Z2V0T3JBbGxvY1RndFB0cih2b2lkICpIc3RQdHJCZWdpbiwgdm9pZCAqSHN0UHRyQmFzZSwKKyAgICBpbnQ2NF90IFNpemUsIGJvb2wgJklzTmV3LCBib29sIElzSW1wbGljaXQsIGJvb2wgVXBkYXRlUmVmQ291bnQpIHsKKyAgdm9pZCAqcmMgPSBOVUxMOworICBEYXRhTWFwTXR4LmxvY2soKTsKKyAgTG9va3VwUmVzdWx0IGxyID0gbG9va3VwTWFwcGluZyhIc3RQdHJCZWdpbiwgU2l6ZSk7CisKKyAgLy8gQ2hlY2sgaWYgdGhlIHBvaW50ZXIgaXMgY29udGFpbmVkLgorICBpZiAobHIuRmxhZ3MuSXNDb250YWluZWQgfHwKKyAgICAgICgobHIuRmxhZ3MuRXh0ZW5kc0JlZm9yZSB8fCBsci5GbGFncy5FeHRlbmRzQWZ0ZXIpICYmIElzSW1wbGljaXQpKSB7CisgICAgYXV0byAmSFQgPSAqbHIuRW50cnk7CisgICAgSXNOZXcgPSBmYWxzZTsKKworICAgIGlmIChVcGRhdGVSZWZDb3VudCkKKyAgICAgICsrSFQuUmVmQ291bnQ7CisKKyAgICB1aW50cHRyX3QgdHAgPSBIVC5UZ3RQdHJCZWdpbiArICgodWludHB0cl90KUhzdFB0ckJlZ2luIC0gSFQuSHN0UHRyQmVnaW4pOworICAgIERQKCJNYXBwaW5nIGV4aXN0cyVzIHdpdGggSHN0UHRyQmVnaW49IiBEUHhNT0QgIiwgVGd0UHRyQmVnaW49IiBEUHhNT0QgIiwgIgorICAgICAgICAiU2l6ZT0lbGQsJXMgUmVmQ291bnQ9JXNcbiIsIChJc0ltcGxpY2l0ID8gIiAoaW1wbGljaXQpIiA6ICIiKSwKKyAgICAgICAgRFB4UFRSKEhzdFB0ckJlZ2luKSwgRFB4UFRSKHRwKSwgU2l6ZSwKKyAgICAgICAgKFVwZGF0ZVJlZkNvdW50ID8gIiB1cGRhdGVkIiA6ICIiKSwKKyAgICAgICAgKENPTlNJREVSRURfSU5GKEhULlJlZkNvdW50KSkgPyAiSU5GIiA6CisgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhIVC5SZWZDb3VudCkuY19zdHIoKSk7CisgICAgcmMgPSAodm9pZCAqKXRwOworICB9IGVsc2UgaWYgKChsci5GbGFncy5FeHRlbmRzQmVmb3JlIHx8IGxyLkZsYWdzLkV4dGVuZHNBZnRlcikgJiYgIUlzSW1wbGljaXQpIHsKKyAgICAvLyBFeHBsaWNpdCBleHRlbnNpb24gb2YgbWFwcGVkIGRhdGEgLSBub3QgYWxsb3dlZC4KKyAgICBEUCgiRXhwbGljaXQgZXh0ZW5zaW9uIG9mIG1hcHBpbmcgaXMgbm90IGFsbG93ZWQuXG4iKTsKKyAgfSBlbHNlIGlmIChTaXplKSB7CisgICAgLy8gSWYgaXQgaXMgbm90IGNvbnRhaW5lZCBhbmQgU2l6ZSA+IDAgd2Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBlbnRyeSBmb3IgaXQuCisgICAgSXNOZXcgPSB0cnVlOworICAgIHVpbnRwdHJfdCB0cCA9ICh1aW50cHRyX3QpUlRMLT5kYXRhX2FsbG9jKFJUTERldmljZUlELCBTaXplLCBIc3RQdHJCZWdpbik7CisgICAgRFAoIkNyZWF0aW5nIG5ldyBtYXAgZW50cnk6IEhzdEJhc2U9IiBEUHhNT0QgIiwgSHN0QmVnaW49IiBEUHhNT0QgIiwgIgorICAgICAgICAiSHN0RW5kPSIgRFB4TU9EICIsIFRndEJlZ2luPSIgRFB4TU9EICJcbiIsIERQeFBUUihIc3RQdHJCYXNlKSwKKyAgICAgICAgRFB4UFRSKEhzdFB0ckJlZ2luKSwgRFB4UFRSKCh1aW50cHRyX3QpSHN0UHRyQmVnaW4gKyBTaXplKSwgRFB4UFRSKHRwKSk7CisgICAgSG9zdERhdGFUb1RhcmdldE1hcC5wdXNoX2Zyb250KEhvc3REYXRhVG9UYXJnZXRUeSgodWludHB0cl90KUhzdFB0ckJhc2UsCisgICAgICAgICh1aW50cHRyX3QpSHN0UHRyQmVnaW4sICh1aW50cHRyX3QpSHN0UHRyQmVnaW4gKyBTaXplLCB0cCkpOworICAgIHJjID0gKHZvaWQgKil0cDsKKyAgfQorCisgIERhdGFNYXBNdHgudW5sb2NrKCk7CisgIHJldHVybiByYzsKK30KKworLy8gVXNlZCBieSB0YXJnZXRfZGF0YV9iZWdpbiwgdGFyZ2V0X2RhdGFfZW5kLCB0YXJnZXRfZGF0YV91cGRhdGUgYW5kIHRhcmdldC4KKy8vIFJldHVybiB0aGUgdGFyZ2V0IHBvaW50ZXIgYmVnaW4gKHdoZXJlIHRoZSBkYXRhIHdpbGwgYmUgbW92ZWQpLgorLy8gRGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnRlciBpZiBjYWxsZWQgZnJvbSB0YXJnZXRfZGF0YV9lbmQuCit2b2lkICpEZXZpY2VUeTo6Z2V0VGd0UHRyQmVnaW4odm9pZCAqSHN0UHRyQmVnaW4sIGludDY0X3QgU2l6ZSwgYm9vbCAmSXNMYXN0LAorICAgIGJvb2wgVXBkYXRlUmVmQ291bnQpIHsKKyAgdm9pZCAqcmMgPSBOVUxMOworICBEYXRhTWFwTXR4LmxvY2soKTsKKyAgTG9va3VwUmVzdWx0IGxyID0gbG9va3VwTWFwcGluZyhIc3RQdHJCZWdpbiwgU2l6ZSk7CisKKyAgaWYgKGxyLkZsYWdzLklzQ29udGFpbmVkIHx8IGxyLkZsYWdzLkV4dGVuZHNCZWZvcmUgfHwgbHIuRmxhZ3MuRXh0ZW5kc0FmdGVyKSB7CisgICAgYXV0byAmSFQgPSAqbHIuRW50cnk7CisgICAgSXNMYXN0ID0gIShIVC5SZWZDb3VudCA+IDEpOworCisgICAgaWYgKEhULlJlZkNvdW50ID4gMSAmJiBVcGRhdGVSZWZDb3VudCkKKyAgICAgIC0tSFQuUmVmQ291bnQ7CisKKyAgICB1aW50cHRyX3QgdHAgPSBIVC5UZ3RQdHJCZWdpbiArICgodWludHB0cl90KUhzdFB0ckJlZ2luIC0gSFQuSHN0UHRyQmVnaW4pOworICAgIERQKCJNYXBwaW5nIGV4aXN0cyB3aXRoIEhzdFB0ckJlZ2luPSIgRFB4TU9EICIsIFRndFB0ckJlZ2luPSIgRFB4TU9EICIsICIKKyAgICAgICAgIlNpemU9JWxkLCVzIFJlZkNvdW50PSVzXG4iLCBEUHhQVFIoSHN0UHRyQmVnaW4pLCBEUHhQVFIodHApLCBTaXplLAorICAgICAgICAoVXBkYXRlUmVmQ291bnQgPyAiIHVwZGF0ZWQiIDogIiIpLAorICAgICAgICAoQ09OU0lERVJFRF9JTkYoSFQuUmVmQ291bnQpKSA/ICJJTkYiIDoKKyAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKEhULlJlZkNvdW50KS5jX3N0cigpKTsKKyAgICByYyA9ICh2b2lkICopdHA7CisgIH0gZWxzZSB7CisgICAgSXNMYXN0ID0gZmFsc2U7CisgIH0KKworICBEYXRhTWFwTXR4LnVubG9jaygpOworICByZXR1cm4gcmM7Cit9CisKKy8vIFJldHVybiB0aGUgdGFyZ2V0IHBvaW50ZXIgYmVnaW4gKHdoZXJlIHRoZSBkYXRhIHdpbGwgYmUgbW92ZWQpLgorLy8gTG9jay1mcmVlIHZlcnNpb24gY2FsbGVkIHdoZW4gbG9hZGluZyBnbG9iYWwgc3ltYm9scyBmcm9tIHRoZSBmYXQgYmluYXJ5Lgordm9pZCAqRGV2aWNlVHk6OmdldFRndFB0ckJlZ2luKHZvaWQgKkhzdFB0ckJlZ2luLCBpbnQ2NF90IFNpemUpIHsKKyAgdWludHB0cl90IGhwID0gKHVpbnRwdHJfdClIc3RQdHJCZWdpbjsKKyAgTG9va3VwUmVzdWx0IGxyID0gbG9va3VwTWFwcGluZyhIc3RQdHJCZWdpbiwgU2l6ZSk7CisgIGlmIChsci5GbGFncy5Jc0NvbnRhaW5lZCB8fCBsci5GbGFncy5FeHRlbmRzQmVmb3JlIHx8IGxyLkZsYWdzLkV4dGVuZHNBZnRlcikgeworICAgIGF1dG8gJkhUID0gKmxyLkVudHJ5OworICAgIHVpbnRwdHJfdCB0cCA9IEhULlRndFB0ckJlZ2luICsgKGhwIC0gSFQuSHN0UHRyQmVnaW4pOworICAgIHJldHVybiAodm9pZCAqKXRwOworICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK2ludCBEZXZpY2VUeTo6ZGVhbGxvY1RndFB0cih2b2lkICpIc3RQdHJCZWdpbiwgaW50NjRfdCBTaXplLCBib29sIEZvcmNlRGVsZXRlKSB7CisgIC8vIENoZWNrIGlmIHRoZSBwb2ludGVyIGlzIGNvbnRhaW5lZCBpbiBhbnkgc3ViLW5vZGVzLgorICBpbnQgcmM7CisgIERhdGFNYXBNdHgubG9jaygpOworICBMb29rdXBSZXN1bHQgbHIgPSBsb29rdXBNYXBwaW5nKEhzdFB0ckJlZ2luLCBTaXplKTsKKyAgaWYgKGxyLkZsYWdzLklzQ29udGFpbmVkIHx8IGxyLkZsYWdzLkV4dGVuZHNCZWZvcmUgfHwgbHIuRmxhZ3MuRXh0ZW5kc0FmdGVyKSB7CisgICAgYXV0byAmSFQgPSAqbHIuRW50cnk7CisgICAgaWYgKEZvcmNlRGVsZXRlKQorICAgICAgSFQuUmVmQ291bnQgPSAxOworICAgIGlmICgtLUhULlJlZkNvdW50IDw9IDApIHsKKyAgICAgIGFzc2VydChIVC5SZWZDb3VudCA9PSAwICYmICJkaWQgbm90IGV4cGVjdCBhIG5lZ2F0aXZlIHJlZiBjb3VudCIpOworICAgICAgRFAoIkRlbGV0aW5nIHRndCBkYXRhICIgRFB4TU9EICIgb2Ygc2l6ZSAlbGRcbiIsCisgICAgICAgICAgRFB4UFRSKEhULlRndFB0ckJlZ2luKSwgU2l6ZSk7CisgICAgICBSVEwtPmRhdGFfZGVsZXRlKFJUTERldmljZUlELCAodm9pZCAqKUhULlRndFB0ckJlZ2luKTsKKyAgICAgIERQKCJSZW1vdmluZyVzIG1hcHBpbmcgd2l0aCBIc3RQdHJCZWdpbj0iIERQeE1PRCAiLCBUZ3RQdHJCZWdpbj0iIERQeE1PRAorICAgICAgICAgICIsIFNpemU9JWxkXG4iLCAoRm9yY2VEZWxldGUgPyAiIChmb3JjZWQpIiA6ICIiKSwKKyAgICAgICAgICBEUHhQVFIoSFQuSHN0UHRyQmVnaW4pLCBEUHhQVFIoSFQuVGd0UHRyQmVnaW4pLCBTaXplKTsKKyAgICAgIEhvc3REYXRhVG9UYXJnZXRNYXAuZXJhc2UobHIuRW50cnkpOworICAgIH0KKyAgICByYyA9IE9GRkxPQURfU1VDQ0VTUzsKKyAgfSBlbHNlIHsKKyAgICBEUCgiU2VjdGlvbiB0byBkZWxldGUgKGhzdCBhZGRyICIgRFB4TU9EICIpIGRvZXMgbm90IGV4aXN0IGluIHRoZSBhbGxvY2F0ZWQiCisgICAgICAgIiBtZW1vcnlcbiIsIERQeFBUUihIc3RQdHJCZWdpbikpOworICAgIHJjID0gT0ZGTE9BRF9GQUlMOworICB9CisKKyAgRGF0YU1hcE10eC51bmxvY2soKTsKKyAgcmV0dXJuIHJjOworfQorCisvLy8gSW5pdCBkZXZpY2UsIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5Lgordm9pZCBEZXZpY2VUeTo6aW5pdCgpIHsKKyAgaW50MzJfdCByYyA9IFJUTC0+aW5pdF9kZXZpY2UoUlRMRGV2aWNlSUQpOworICBpZiAocmMgPT0gT0ZGTE9BRF9TVUNDRVNTKSB7CisgICAgSXNJbml0ID0gdHJ1ZTsKKyAgfQorfQorCisvLy8gVGhyZWFkLXNhZmUgbWV0aG9kIHRvIGluaXRpYWxpemUgdGhlIGRldmljZSBvbmx5IG9uY2UuCitpbnQzMl90IERldmljZVR5Ojppbml0T25jZSgpIHsKKyAgc3RkOjpjYWxsX29uY2UoSW5pdEZsYWcsICZEZXZpY2VUeTo6aW5pdCwgdGhpcyk7CisKKyAgLy8gQXQgdGhpcyBwb2ludCwgaWYgSXNJbml0IGlzIHRydWUsIHRoZW4gZWl0aGVyIHRoaXMgdGhyZWFkIG9yIHNvbWUgb3RoZXIKKyAgLy8gdGhyZWFkIGluIHRoZSBwYXN0IHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCB0aGUgZGV2aWNlLCBzbyB3ZSBjYW4gcmV0dXJuCisgIC8vIE9GRkxPQURfU1VDQ0VTUy4gSWYgdGhpcyB0aHJlYWQgZXhlY3V0ZWQgaW5pdCgpIHZpYSBjYWxsX29uY2UoKSBhbmQgaXQKKyAgLy8gZmFpbGVkLCByZXR1cm4gT0ZGTE9BRF9GQUlMLiBJZiBjYWxsX29uY2UgZGlkIG5vdCBpbnZva2UgaW5pdCgpLCBpdCBtZWFucworICAvLyB0aGF0IHNvbWUgb3RoZXIgdGhyZWFkIGFscmVhZHkgYXR0ZW1wdGVkIHRvIGV4ZWN1dGUgaW5pdCgpIGFuZCBpZiBJc0luaXQKKyAgLy8gaXMgc3RpbGwgZmFsc2UsIHJldHVybiBPRkZMT0FEX0ZBSUwuCisgIGlmIChJc0luaXQpCisgICAgcmV0dXJuIE9GRkxPQURfU1VDQ0VTUzsKKyAgZWxzZQorICAgIHJldHVybiBPRkZMT0FEX0ZBSUw7Cit9CisKKy8vIExvYWQgYmluYXJ5IHRvIGRldmljZS4KK19fdGd0X3RhcmdldF90YWJsZSAqRGV2aWNlVHk6OmxvYWRfYmluYXJ5KHZvaWQgKkltZykgeworICBSVEwtPk10eC5sb2NrKCk7CisgIF9fdGd0X3RhcmdldF90YWJsZSAqcmMgPSBSVEwtPmxvYWRfYmluYXJ5KFJUTERldmljZUlELCBJbWcpOworICBSVEwtPk10eC51bmxvY2soKTsKKyAgcmV0dXJuIHJjOworfQorCisvLyBTdWJtaXQgZGF0YSB0byBkZXZpY2UuCitpbnQzMl90IERldmljZVR5OjpkYXRhX3N1Ym1pdCh2b2lkICpUZ3RQdHJCZWdpbiwgdm9pZCAqSHN0UHRyQmVnaW4sCisgICAgaW50NjRfdCBTaXplKSB7CisgIHJldHVybiBSVEwtPmRhdGFfc3VibWl0KFJUTERldmljZUlELCBUZ3RQdHJCZWdpbiwgSHN0UHRyQmVnaW4sIFNpemUpOworfQorCisvLyBSZXRyaWV2ZSBkYXRhIGZyb20gZGV2aWNlLgoraW50MzJfdCBEZXZpY2VUeTo6ZGF0YV9yZXRyaWV2ZSh2b2lkICpIc3RQdHJCZWdpbiwgdm9pZCAqVGd0UHRyQmVnaW4sCisgICAgaW50NjRfdCBTaXplKSB7CisgIHJldHVybiBSVEwtPmRhdGFfcmV0cmlldmUoUlRMRGV2aWNlSUQsIEhzdFB0ckJlZ2luLCBUZ3RQdHJCZWdpbiwgU2l6ZSk7Cit9CisKKy8vIFJ1biByZWdpb24gb24gZGV2aWNlCitpbnQzMl90IERldmljZVR5OjpydW5fcmVnaW9uKHZvaWQgKlRndEVudHJ5UHRyLCB2b2lkICoqVGd0VmFyc1B0ciwKKyAgICBwdHJkaWZmX3QgKlRndE9mZnNldHMsIGludDMyX3QgVGd0VmFyc1NpemUpIHsKKyAgcmV0dXJuIFJUTC0+cnVuX3JlZ2lvbihSVExEZXZpY2VJRCwgVGd0RW50cnlQdHIsIFRndFZhcnNQdHIsIFRndE9mZnNldHMsCisgICAgICBUZ3RWYXJzU2l6ZSk7Cit9CisKKy8vIFJ1biB0ZWFtIHJlZ2lvbiBvbiBkZXZpY2UuCitpbnQzMl90IERldmljZVR5OjpydW5fdGVhbV9yZWdpb24odm9pZCAqVGd0RW50cnlQdHIsIHZvaWQgKipUZ3RWYXJzUHRyLAorICAgIHB0cmRpZmZfdCAqVGd0T2Zmc2V0cywgaW50MzJfdCBUZ3RWYXJzU2l6ZSwgaW50MzJfdCBOdW1UZWFtcywKKyAgICBpbnQzMl90IFRocmVhZExpbWl0LCB1aW50NjRfdCBMb29wVHJpcENvdW50KSB7CisgIHJldHVybiBSVEwtPnJ1bl90ZWFtX3JlZ2lvbihSVExEZXZpY2VJRCwgVGd0RW50cnlQdHIsIFRndFZhcnNQdHIsIFRndE9mZnNldHMsCisgICAgICBUZ3RWYXJzU2l6ZSwgTnVtVGVhbXMsIFRocmVhZExpbWl0LCBMb29wVHJpcENvdW50KTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEZ1bmN0aW9uYWxpdHkgZm9yIHJlZ2lzdGVyaW5nIGxpYnMKKworc3RhdGljIHZvaWQgUmVnaXN0ZXJJbWFnZUludG9UcmFuc2xhdGlvblRhYmxlKFRyYW5zbGF0aW9uVGFibGUgJlRULAorICAgIFJUTEluZm9UeSAmUlRMLCBfX3RndF9kZXZpY2VfaW1hZ2UgKmltYWdlKSB7CisKKyAgLy8gc2FtZSBzaXplLCBhcyB3aGVuIHdlIGluY3JlYXNlIG9uZSwgd2UgYWxzbyBpbmNyZWFzZSB0aGUgb3RoZXIuCisgIGFzc2VydChUVC5UYXJnZXRzVGFibGUuc2l6ZSgpID09IFRULlRhcmdldHNJbWFnZXMuc2l6ZSgpICYmCisgICAgICAgICAiV2Ugc2hvdWxkIGhhdmUgYXMgbWFueSBpbWFnZXMgYXMgd2UgaGF2ZSB0YWJsZXMhIik7CisKKyAgLy8gUmVzaXplIHRoZSBUYXJnZXRzIFRhYmxlIGFuZCBJbWFnZXMgdG8gYWNjb21tb2RhdGUgdGhlIG5ldyB0YXJnZXRzIGlmCisgIC8vIHJlcXVpcmVkCisgIHVuc2lnbmVkIFRhcmdldHNUYWJsZU1pbmltdW1TaXplID0gUlRMLklkeCArIFJUTC5OdW1iZXJPZkRldmljZXM7CisKKyAgaWYgKFRULlRhcmdldHNUYWJsZS5zaXplKCkgPCBUYXJnZXRzVGFibGVNaW5pbXVtU2l6ZSkgeworICAgIFRULlRhcmdldHNJbWFnZXMucmVzaXplKFRhcmdldHNUYWJsZU1pbmltdW1TaXplLCAwKTsKKyAgICBUVC5UYXJnZXRzVGFibGUucmVzaXplKFRhcmdldHNUYWJsZU1pbmltdW1TaXplLCAwKTsKKyAgfQorCisgIC8vIFJlZ2lzdGVyIHRoZSBpbWFnZSBpbiBhbGwgZGV2aWNlcyBmb3IgdGhpcyB0YXJnZXQgdHlwZS4KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgUlRMLk51bWJlck9mRGV2aWNlczsgKytpKSB7CisgICAgLy8gSWYgd2UgYXJlIGNoYW5naW5nIHRoZSBpbWFnZSB3ZSBhcmUgYWxzbyBpbnZhbGlkYXRpbmcgdGhlIHRhcmdldCB0YWJsZS4KKyAgICBpZiAoVFQuVGFyZ2V0c0ltYWdlc1tSVEwuSWR4ICsgaV0gIT0gaW1hZ2UpIHsKKyAgICAgIFRULlRhcmdldHNJbWFnZXNbUlRMLklkeCArIGldID0gaW1hZ2U7CisgICAgICBUVC5UYXJnZXRzVGFibGVbUlRMLklkeCArIGldID0gMDsgLy8gbGF6eSBpbml0aWFsaXphdGlvbiBvZiB0YXJnZXQgdGFibGUuCisgICAgfQorICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBGdW5jdGlvbmFsaXR5IGZvciByZWdpc3RlcmluZyBDdG9ycy9EdG9ycworCitzdGF0aWMgdm9pZCBSZWdpc3Rlckdsb2JhbEN0b3JzRHRvcnNGb3JJbWFnZShfX3RndF9iaW5fZGVzYyAqZGVzYywKKyAgICBfX3RndF9kZXZpY2VfaW1hZ2UgKmltZywgUlRMSW5mb1R5ICpSVEwpIHsKKworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBSVEwtPk51bWJlck9mRGV2aWNlczsgKytpKSB7CisgICAgRGV2aWNlVHkgJkRldmljZSA9IERldmljZXNbUlRMLT5JZHggKyBpXTsKKyAgICBEZXZpY2UuUGVuZGluZ0dsb2JhbHNNdHgubG9jaygpOworICAgIERldmljZS5IYXNQZW5kaW5nR2xvYmFscyA9IHRydWU7CisgICAgZm9yIChfX3RndF9vZmZsb2FkX2VudHJ5ICplbnRyeSA9IGltZy0+RW50cmllc0JlZ2luOworICAgICAgICBlbnRyeSAhPSBpbWctPkVudHJpZXNFbmQ7ICsrZW50cnkpIHsKKyAgICAgIGlmIChlbnRyeS0+ZmxhZ3MgJiBPTVBfREVDTEFSRV9UQVJHRVRfQ1RPUikgeworICAgICAgICBEUCgiQWRkaW5nIGN0b3IgIiBEUHhNT0QgIiB0byB0aGUgcGVuZGluZyBsaXN0LlxuIiwKKyAgICAgICAgICAgIERQeFBUUihlbnRyeS0+YWRkcikpOworICAgICAgICBEZXZpY2UuUGVuZGluZ0N0b3JzRHRvcnNbZGVzY10uUGVuZGluZ0N0b3JzLnB1c2hfYmFjayhlbnRyeS0+YWRkcik7CisgICAgICB9IGVsc2UgaWYgKGVudHJ5LT5mbGFncyAmIE9NUF9ERUNMQVJFX1RBUkdFVF9EVE9SKSB7CisgICAgICAgIC8vIER0b3JzIGFyZSBwdXNoZWQgaW4gcmV2ZXJzZSBvcmRlciBzbyB0aGV5IGFyZSBleGVjdXRlZCBmcm9tIGVuZAorICAgICAgICAvLyB0byBiZWdpbm5pbmcgd2hlbiB1bnJlZ2lzdGVyaW5nIHRoZSBsaWJyYXJ5IQorICAgICAgICBEUCgiQWRkaW5nIGR0b3IgIiBEUHhNT0QgIiB0byB0aGUgcGVuZGluZyBsaXN0LlxuIiwKKyAgICAgICAgICAgIERQeFBUUihlbnRyeS0+YWRkcikpOworICAgICAgICBEZXZpY2UuUGVuZGluZ0N0b3JzRHRvcnNbZGVzY10uUGVuZGluZ0R0b3JzLnB1c2hfZnJvbnQoZW50cnktPmFkZHIpOworICAgICAgfQorCisgICAgICBpZiAoZW50cnktPmZsYWdzICYgT01QX0RFQ0xBUkVfVEFSR0VUX0xJTkspIHsKKyAgICAgICAgRFAoIlRoZSBcImxpbmtcIiBhdHRyaWJ1dGUgaXMgbm90IHlldCBzdXBwb3J0ZWQhXG4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgRGV2aWNlLlBlbmRpbmdHbG9iYWxzTXR4LnVubG9jaygpOworICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8gYWRkcyBhIHRhcmdldCBzaGFyZWQgbGlicmFyeSB0byB0aGUgdGFyZ2V0IGV4ZWN1dGlvbiBpbWFnZQorRVhURVJOIHZvaWQgX190Z3RfcmVnaXN0ZXJfbGliKF9fdGd0X2Jpbl9kZXNjICpkZXNjKSB7CisKKyAgLy8gQXR0ZW1wdCB0byBsb2FkIGFsbCBwbHVnaW5zIGF2YWlsYWJsZSBpbiB0aGUgc3lzdGVtLgorICBSVExzLkxvYWRSVExzT25jZSgpOworCisgIFJUTHNNdHgubG9jaygpOworICAvLyBSZWdpc3RlciB0aGUgaW1hZ2VzIHdpdGggdGhlIFJUTHMgdGhhdCB1bmRlcnN0YW5kIHRoZW0sIGlmIGFueS4KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZGVzYy0+TnVtRGV2aWNlSW1hZ2VzOyArK2kpIHsKKyAgICAvLyBPYnRhaW4gdGhlIGltYWdlLgorICAgIF9fdGd0X2RldmljZV9pbWFnZSAqaW1nID0gJmRlc2MtPkRldmljZUltYWdlc1tpXTsKKworICAgIFJUTEluZm9UeSAqRm91bmRSVEwgPSBOVUxMOworCisgICAgLy8gU2NhbiB0aGUgUlRMcyB0aGF0IGhhdmUgYXNzb2NpYXRlZCBpbWFnZXMgdW50aWwgd2UgZmluZCBvbmUgdGhhdCBzdXBwb3J0cworICAgIC8vIHRoZSBjdXJyZW50IGltYWdlLgorICAgIGZvciAoYXV0byAmUiA6IFJUTHMuQWxsUlRMcykgeworICAgICAgaWYgKCFSLmlzX3ZhbGlkX2JpbmFyeShpbWcpKSB7CisgICAgICAgIERQKCJJbWFnZSAiIERQeE1PRCAiIGlzIE5PVCBjb21wYXRpYmxlIHdpdGggUlRMICVzIVxuIiwKKyAgICAgICAgICAgIERQeFBUUihpbWctPkltYWdlU3RhcnQpLCBSLlJUTE5hbWUuY19zdHIoKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBEUCgiSW1hZ2UgIiBEUHhNT0QgIiBpcyBjb21wYXRpYmxlIHdpdGggUlRMICVzIVxuIiwKKyAgICAgICAgICBEUHhQVFIoaW1nLT5JbWFnZVN0YXJ0KSwgUi5SVExOYW1lLmNfc3RyKCkpOworCisgICAgICAvLyBJZiB0aGlzIFJUTCBpcyBub3QgYWxyZWFkeSBpbiB1c2UsIGluaXRpYWxpemUgaXQuCisgICAgICBpZiAoIVIuaXNVc2VkKSB7CisgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGRldmljZSBpbmZvcm1hdGlvbiBmb3IgdGhlIFJUTCB3ZSBhcmUgYWJvdXQgdG8gdXNlLgorICAgICAgICBEZXZpY2VUeSBkZXZpY2UoJlIpOworCisgICAgICAgIHNpemVfdCBzdGFydCA9IERldmljZXMuc2l6ZSgpOworICAgICAgICBEZXZpY2VzLnJlc2l6ZShzdGFydCArIFIuTnVtYmVyT2ZEZXZpY2VzLCBkZXZpY2UpOworICAgICAgICBmb3IgKGludDMyX3QgZGV2aWNlX2lkID0gMDsgZGV2aWNlX2lkIDwgUi5OdW1iZXJPZkRldmljZXM7CisgICAgICAgICAgICBkZXZpY2VfaWQrKykgeworICAgICAgICAgIC8vIGdsb2JhbCBkZXZpY2UgSUQKKyAgICAgICAgICBEZXZpY2VzW3N0YXJ0ICsgZGV2aWNlX2lkXS5EZXZpY2VJRCA9IHN0YXJ0ICsgZGV2aWNlX2lkOworICAgICAgICAgIC8vIFJUTCBsb2NhbCBkZXZpY2UgSUQKKyAgICAgICAgICBEZXZpY2VzW3N0YXJ0ICsgZGV2aWNlX2lkXS5SVExEZXZpY2VJRCA9IGRldmljZV9pZDsKKworICAgICAgICAgIC8vIFNhdmUgcG9pbnRlciB0byBkZXZpY2UgaW4gUlRMIGluIGNhc2Ugd2Ugd2FudCB0byB1bnJlZ2lzdGVyIHRoZSBSVEwKKyAgICAgICAgICBSLkRldmljZXMucHVzaF9iYWNrKCZEZXZpY2VzW3N0YXJ0ICsgZGV2aWNlX2lkXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBpbmRleCBvZiB0aGlzIFJUTCBhbmQgc2F2ZSBpdCBpbiB0aGUgdXNlZCBSVExzLgorICAgICAgICBSLklkeCA9IChSVExzLlVzZWRSVExzLmVtcHR5KCkpCisgICAgICAgICAgICAgICAgICAgID8gMAorICAgICAgICAgICAgICAgICAgICA6IFJUTHMuVXNlZFJUTHMuYmFjaygpLT5JZHggKworICAgICAgICAgICAgICAgICAgICAgICAgICBSVExzLlVzZWRSVExzLmJhY2soKS0+TnVtYmVyT2ZEZXZpY2VzOworICAgICAgICBhc3NlcnQoKHNpemVfdCkgUi5JZHggPT0gc3RhcnQgJiYKKyAgICAgICAgICAgICJSVEwgaW5kZXggc2hvdWxkIGVxdWFsIHRoZSBudW1iZXIgb2YgZGV2aWNlcyB1c2VkIHNvIGZhci4iKTsKKyAgICAgICAgUi5pc1VzZWQgPSB0cnVlOworICAgICAgICBSVExzLlVzZWRSVExzLnB1c2hfYmFjaygmUik7CisKKyAgICAgICAgRFAoIlJUTCAiIERQeE1PRCAiIGhhcyBpbmRleCAlZCFcbiIsIERQeFBUUihSLkxpYnJhcnlIYW5kbGVyKSwgUi5JZHgpOworICAgICAgfQorCisgICAgICAvLyBJbml0aWFsaXplIChpZiBuZWNlc3NhcnkpIHRyYW5zbGF0aW9uIHRhYmxlIGZvciB0aGlzIGxpYnJhcnkuCisgICAgICBUcmxUYmxNdHgubG9jaygpOworICAgICAgaWYoIUhvc3RFbnRyaWVzQmVnaW5Ub1RyYW5zVGFibGUuY291bnQoZGVzYy0+SG9zdEVudHJpZXNCZWdpbikpeworICAgICAgICBUcmFuc2xhdGlvblRhYmxlICZ0dCA9CisgICAgICAgICAgICBIb3N0RW50cmllc0JlZ2luVG9UcmFuc1RhYmxlW2Rlc2MtPkhvc3RFbnRyaWVzQmVnaW5dOworICAgICAgICB0dC5Ib3N0VGFibGUuRW50cmllc0JlZ2luID0gZGVzYy0+SG9zdEVudHJpZXNCZWdpbjsKKyAgICAgICAgdHQuSG9zdFRhYmxlLkVudHJpZXNFbmQgPSBkZXNjLT5Ib3N0RW50cmllc0VuZDsKKyAgICAgIH0KKworICAgICAgLy8gUmV0cmlldmUgdHJhbnNsYXRpb24gdGFibGUgZm9yIHRoaXMgbGlicmFyeS4KKyAgICAgIFRyYW5zbGF0aW9uVGFibGUgJlRyYW5zVGFibGUgPQorICAgICAgICAgIEhvc3RFbnRyaWVzQmVnaW5Ub1RyYW5zVGFibGVbZGVzYy0+SG9zdEVudHJpZXNCZWdpbl07CisKKyAgICAgIERQKCJSZWdpc3RlcmluZyBpbWFnZSAiIERQeE1PRCAiIHdpdGggUlRMICVzIVxuIiwKKyAgICAgICAgICBEUHhQVFIoaW1nLT5JbWFnZVN0YXJ0KSwgUi5SVExOYW1lLmNfc3RyKCkpOworICAgICAgUmVnaXN0ZXJJbWFnZUludG9UcmFuc2xhdGlvblRhYmxlKFRyYW5zVGFibGUsIFIsIGltZyk7CisgICAgICBUcmxUYmxNdHgudW5sb2NrKCk7CisgICAgICBGb3VuZFJUTCA9ICZSOworCisgICAgICAvLyBMb2FkIGN0b3JzL2R0b3JzIGZvciBzdGF0aWMgb2JqZWN0cworICAgICAgUmVnaXN0ZXJHbG9iYWxDdG9yc0R0b3JzRm9ySW1hZ2UoZGVzYywgaW1nLCBGb3VuZFJUTCk7CisKKyAgICAgIC8vIGlmIGFuIFJUTCB3YXMgZm91bmQgd2UgYXJlIGRvbmUgLSBwcm9jZWVkIHRvIHJlZ2lzdGVyIHRoZSBuZXh0IGltYWdlCisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIUZvdW5kUlRMKSB7CisgICAgICBEUCgiTm8gUlRMIGZvdW5kIGZvciBpbWFnZSAiIERQeE1PRCAiIVxuIiwgRFB4UFRSKGltZy0+SW1hZ2VTdGFydCkpOworICAgIH0KKyAgfQorICBSVExzTXR4LnVubG9jaygpOworCisKKyAgRFAoIkRvbmUgcmVnaXN0ZXJpbmcgZW50cmllcyFcbiIpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vIHVubG9hZHMgYSB0YXJnZXQgc2hhcmVkIGxpYnJhcnkKK0VYVEVSTiB2b2lkIF9fdGd0X3VucmVnaXN0ZXJfbGliKF9fdGd0X2Jpbl9kZXNjICpkZXNjKSB7CisgIERQKCJVbmxvYWRpbmcgdGFyZ2V0IGxpYnJhcnkhXG4iKTsKKworICBSVExzTXR4LmxvY2soKTsKKyAgLy8gRmluZCB3aGljaCBSVEwgdW5kZXJzdGFuZHMgZWFjaCBpbWFnZSwgaWYgYW55LgorICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBkZXNjLT5OdW1EZXZpY2VJbWFnZXM7ICsraSkgeworICAgIC8vIE9idGFpbiB0aGUgaW1hZ2UuCisgICAgX190Z3RfZGV2aWNlX2ltYWdlICppbWcgPSAmZGVzYy0+RGV2aWNlSW1hZ2VzW2ldOworCisgICAgUlRMSW5mb1R5ICpGb3VuZFJUTCA9IE5VTEw7CisKKyAgICAvLyBTY2FuIHRoZSBSVExzIHRoYXQgaGF2ZSBhc3NvY2lhdGVkIGltYWdlcyB1bnRpbCB3ZSBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzCisgICAgLy8gdGhlIGN1cnJlbnQgaW1hZ2UuIFdlIG9ubHkgbmVlZCB0byBzY2FuIFJUTHMgdGhhdCBhcmUgYWxyZWFkeSBiZWluZyB1c2VkLgorICAgIGZvciAoYXV0byAqUiA6IFJUTHMuVXNlZFJUTHMpIHsKKworICAgICAgYXNzZXJ0KFItPmlzVXNlZCAmJiAiRXhwZWN0aW5nIHVzZWQgUlRMcy4iKTsKKworICAgICAgaWYgKCFSLT5pc192YWxpZF9iaW5hcnkoaW1nKSkgeworICAgICAgICBEUCgiSW1hZ2UgIiBEUHhNT0QgIiBpcyBOT1QgY29tcGF0aWJsZSB3aXRoIFJUTCAiIERQeE1PRCAiIVxuIiwKKyAgICAgICAgICAgIERQeFBUUihpbWctPkltYWdlU3RhcnQpLCBEUHhQVFIoUi0+TGlicmFyeUhhbmRsZXIpKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIERQKCJJbWFnZSAiIERQeE1PRCAiIGlzIGNvbXBhdGlibGUgd2l0aCBSVEwgIiBEUHhNT0QgIiFcbiIsCisgICAgICAgICAgRFB4UFRSKGltZy0+SW1hZ2VTdGFydCksIERQeFBUUihSLT5MaWJyYXJ5SGFuZGxlcikpOworCisgICAgICBGb3VuZFJUTCA9IFI7CisKKyAgICAgIC8vIEV4ZWN1dGUgZHRvcnMgZm9yIHN0YXRpYyBvYmplY3RzIGlmIHRoZSBkZXZpY2UgaGFzIGJlZW4gdXNlZCwgaS5lLgorICAgICAgLy8gaWYgaXRzIFBlbmRpbmdDdG9ycyBsaXN0IGhhcyBiZWVuIGVtcHRpZWQuCisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBGb3VuZFJUTC0+TnVtYmVyT2ZEZXZpY2VzOyArK2kpIHsKKyAgICAgICAgRGV2aWNlVHkgJkRldmljZSA9IERldmljZXNbRm91bmRSVEwtPklkeCArIGldOworICAgICAgICBEZXZpY2UuUGVuZGluZ0dsb2JhbHNNdHgubG9jaygpOworICAgICAgICBpZiAoRGV2aWNlLlBlbmRpbmdDdG9yc0R0b3JzW2Rlc2NdLlBlbmRpbmdDdG9ycy5lbXB0eSgpKSB7CisgICAgICAgICAgZm9yIChhdXRvICZkdG9yIDogRGV2aWNlLlBlbmRpbmdDdG9yc0R0b3JzW2Rlc2NdLlBlbmRpbmdEdG9ycykgeworICAgICAgICAgICAgaW50IHJjID0gdGFyZ2V0KERldmljZS5EZXZpY2VJRCwgZHRvciwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMSwKKyAgICAgICAgICAgICAgICAxLCB0cnVlIC8qdGVhbSovKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBPRkZMT0FEX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgRFAoIlJ1bm5pbmcgZGVzdHJ1Y3RvciAiIERQeE1PRCAiIGZhaWxlZC5cbiIsIERQeFBUUihkdG9yKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIC8vIFJlbW92ZSB0aGlzIGxpYnJhcnkncyBlbnRyeSBmcm9tIFBlbmRpbmdDdG9yc0R0b3JzCisgICAgICAgICAgRGV2aWNlLlBlbmRpbmdDdG9yc0R0b3JzLmVyYXNlKGRlc2MpOworICAgICAgICB9CisgICAgICAgIERldmljZS5QZW5kaW5nR2xvYmFsc010eC51bmxvY2soKTsKKyAgICAgIH0KKworICAgICAgRFAoIlVucmVnaXN0ZXJlZCBpbWFnZSAiIERQeE1PRCAiIGZyb20gUlRMICIgRFB4TU9EICIhXG4iLAorICAgICAgICAgIERQeFBUUihpbWctPkltYWdlU3RhcnQpLCBEUHhQVFIoUi0+TGlicmFyeUhhbmRsZXIpKTsKKworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gaWYgbm8gUlRMIHdhcyBmb3VuZCBwcm9jZWVkIHRvIHVucmVnaXN0ZXIgdGhlIG5leHQgaW1hZ2UKKyAgICBpZiAoIUZvdW5kUlRMKXsKKyAgICAgIERQKCJObyBSVExzIGluIHVzZSBzdXBwb3J0IHRoZSBpbWFnZSAiIERQeE1PRCAiIVxuIiwKKyAgICAgICAgICBEUHhQVFIoaW1nLT5JbWFnZVN0YXJ0KSk7CisgICAgfQorICB9CisgIFJUTHNNdHgudW5sb2NrKCk7CisgIERQKCJEb25lIHVucmVnaXN0ZXJpbmcgaW1hZ2VzIVxuIik7CisKKyAgLy8gUmVtb3ZlIGVudHJpZXMgZnJvbSBIb3N0UHRyVG9UYWJsZU1hcAorICBUYmxNYXBNdHgubG9jaygpOworICBmb3IgKF9fdGd0X29mZmxvYWRfZW50cnkgKmN1ciA9IGRlc2MtPkhvc3RFbnRyaWVzQmVnaW47CisgICAgICBjdXIgPCBkZXNjLT5Ib3N0RW50cmllc0VuZDsgKytjdXIpIHsKKyAgICBIb3N0UHRyVG9UYWJsZU1hcC5lcmFzZShjdXItPmFkZHIpOworICB9CisKKyAgLy8gUmVtb3ZlIHRyYW5zbGF0aW9uIHRhYmxlIGZvciB0aGlzIGRlc2NyaXB0b3IuCisgIGF1dG8gdHQgPSBIb3N0RW50cmllc0JlZ2luVG9UcmFuc1RhYmxlLmZpbmQoZGVzYy0+SG9zdEVudHJpZXNCZWdpbik7CisgIGlmICh0dCAhPSBIb3N0RW50cmllc0JlZ2luVG9UcmFuc1RhYmxlLmVuZCgpKSB7CisgICAgRFAoIlJlbW92aW5nIHRyYW5zbGF0aW9uIHRhYmxlIGZvciBkZXNjcmlwdG9yICIgRFB4TU9EICJcbiIsCisgICAgICAgIERQeFBUUihkZXNjLT5Ib3N0RW50cmllc0JlZ2luKSk7CisgICAgSG9zdEVudHJpZXNCZWdpblRvVHJhbnNUYWJsZS5lcmFzZSh0dCk7CisgIH0gZWxzZSB7CisgICAgRFAoIlRyYW5zbGF0aW9uIHRhYmxlIGZvciBkZXNjcmlwdG9yICIgRFB4TU9EICIgY2Fubm90IGJlIGZvdW5kLCBwcm9iYWJseSAiCisgICAgICAgICJpdCBoYXMgYmVlbiBhbHJlYWR5IHJlbW92ZWQuXG4iLCBEUHhQVFIoZGVzYy0+SG9zdEVudHJpZXNCZWdpbikpOworICB9CisKKyAgVGJsTWFwTXR4LnVubG9jaygpOworCisgIC8vIFRPRE86IFJlbW92ZSBSVEwgYW5kIHRoZSBkZXZpY2VzIGl0IG1hbmFnZXMgaWYgaXQncyBub3QgdXNlZCBhbnltb3JlPworICAvLyBUT0RPOiBXcml0ZSBzb21lIFJUTC0+dW5sb2FkX2ltYWdlKC4uLikgZnVuY3Rpb24/CisKKyAgRFAoIkRvbmUgdW5yZWdpc3RlcmluZyBsaWJyYXJ5IVxuIik7Cit9CisKKy8vLyBNYXAgZ2xvYmFsIGRhdGEgYW5kIGV4ZWN1dGUgcGVuZGluZyBjdG9ycworc3RhdGljIGludCBJbml0TGlicmFyeShEZXZpY2VUeSYgRGV2aWNlKSB7CisgIC8qCisgICAqIE1hcCBnbG9iYWwgZGF0YQorICAgKi8KKyAgaW50MzJfdCBkZXZpY2VfaWQgPSBEZXZpY2UuRGV2aWNlSUQ7CisgIGludCByYyA9IE9GRkxPQURfU1VDQ0VTUzsKKworICBEZXZpY2UuUGVuZGluZ0dsb2JhbHNNdHgubG9jaygpOworICBUcmxUYmxNdHgubG9jaygpOworICBmb3IgKEhvc3RFbnRyaWVzQmVnaW5Ub1RyYW5zVGFibGVUeTo6aXRlcmF0b3IKKyAgICAgIGlpID0gSG9zdEVudHJpZXNCZWdpblRvVHJhbnNUYWJsZS5iZWdpbigpOworICAgICAgaWkgIT0gSG9zdEVudHJpZXNCZWdpblRvVHJhbnNUYWJsZS5lbmQoKTsgKytpaSkgeworICAgIFRyYW5zbGF0aW9uVGFibGUgKlRyYW5zVGFibGUgPSAmaWktPnNlY29uZDsKKyAgICBpZiAoVHJhbnNUYWJsZS0+VGFyZ2V0c1RhYmxlW2RldmljZV9pZF0gIT0gMCkgeworICAgICAgLy8gTGlicmFyeSBlbnRyaWVzIGhhdmUgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZAorICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gMSkgZ2V0IGltYWdlLgorICAgIGFzc2VydChUcmFuc1RhYmxlLT5UYXJnZXRzSW1hZ2VzLnNpemUoKSA+IChzaXplX3QpZGV2aWNlX2lkICYmCisgICAgICAgICAgICJOb3QgZXhwZWN0aW5nIGEgZGV2aWNlIElEIG91dHNpZGUgdGhlIHRhYmxlJ3MgYm91bmRzISIpOworICAgIF9fdGd0X2RldmljZV9pbWFnZSAqaW1nID0gVHJhbnNUYWJsZS0+VGFyZ2V0c0ltYWdlc1tkZXZpY2VfaWRdOworICAgIGlmICghaW1nKSB7CisgICAgICBEUCgiTm8gaW1hZ2UgbG9hZGVkIGZvciBkZXZpY2UgaWQgJWQuXG4iLCBkZXZpY2VfaWQpOworICAgICAgcmMgPSBPRkZMT0FEX0ZBSUw7CisgICAgICBicmVhazsKKyAgICB9CisgICAgLy8gMikgbG9hZCBpbWFnZSBpbnRvIHRoZSB0YXJnZXQgdGFibGUuCisgICAgX190Z3RfdGFyZ2V0X3RhYmxlICpUYXJnZXRUYWJsZSA9CisgICAgICAgIFRyYW5zVGFibGUtPlRhcmdldHNUYWJsZVtkZXZpY2VfaWRdID0gRGV2aWNlLmxvYWRfYmluYXJ5KGltZyk7CisgICAgLy8gVW5hYmxlIHRvIGdldCB0YWJsZSBmb3IgdGhpcyBpbWFnZTogaW52YWxpZGF0ZSBpbWFnZSBhbmQgZmFpbC4KKyAgICBpZiAoIVRhcmdldFRhYmxlKSB7CisgICAgICBEUCgiVW5hYmxlIHRvIGdlbmVyYXRlIGVudHJpZXMgdGFibGUgZm9yIGRldmljZSBpZCAlZC5cbiIsIGRldmljZV9pZCk7CisgICAgICBUcmFuc1RhYmxlLT5UYXJnZXRzSW1hZ2VzW2RldmljZV9pZF0gPSAwOworICAgICAgcmMgPSBPRkZMT0FEX0ZBSUw7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBWZXJpZnkgd2hldGhlciB0aGUgdHdvIHRhYmxlIHNpemVzIG1hdGNoLgorICAgIHNpemVfdCBoc2l6ZSA9CisgICAgICAgIFRyYW5zVGFibGUtPkhvc3RUYWJsZS5FbnRyaWVzRW5kIC0gVHJhbnNUYWJsZS0+SG9zdFRhYmxlLkVudHJpZXNCZWdpbjsKKyAgICBzaXplX3QgdHNpemUgPSBUYXJnZXRUYWJsZS0+RW50cmllc0VuZCAtIFRhcmdldFRhYmxlLT5FbnRyaWVzQmVnaW47CisKKyAgICAvLyBJbnZhbGlkIGltYWdlIGZvciB0aGVzZSBob3N0IGVudHJpZXMhCisgICAgaWYgKGhzaXplICE9IHRzaXplKSB7CisgICAgICBEUCgiSG9zdCBhbmQgVGFyZ2V0IHRhYmxlcyBtaXNtYXRjaCBmb3IgZGV2aWNlIGlkICVkIFslenggIT0gJXp4XS5cbiIsCisgICAgICAgICBkZXZpY2VfaWQsIGhzaXplLCB0c2l6ZSk7CisgICAgICBUcmFuc1RhYmxlLT5UYXJnZXRzSW1hZ2VzW2RldmljZV9pZF0gPSAwOworICAgICAgVHJhbnNUYWJsZS0+VGFyZ2V0c1RhYmxlW2RldmljZV9pZF0gPSAwOworICAgICAgcmMgPSBPRkZMT0FEX0ZBSUw7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBwcm9jZXNzIGdsb2JhbCBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgbWFwcGVkLgorICAgIERldmljZS5EYXRhTWFwTXR4LmxvY2soKTsKKyAgICBfX3RndF90YXJnZXRfdGFibGUgKkhvc3RUYWJsZSA9ICZUcmFuc1RhYmxlLT5Ib3N0VGFibGU7CisgICAgZm9yIChfX3RndF9vZmZsb2FkX2VudHJ5ICpDdXJyRGV2aWNlRW50cnkgPSBUYXJnZXRUYWJsZS0+RW50cmllc0JlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqQ3Vyckhvc3RFbnRyeSA9IEhvc3RUYWJsZS0+RW50cmllc0JlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqRW50cnlEZXZpY2VFbmQgPSBUYXJnZXRUYWJsZS0+RW50cmllc0VuZDsKKyAgICAgICAgIEN1cnJEZXZpY2VFbnRyeSAhPSBFbnRyeURldmljZUVuZDsKKyAgICAgICAgIEN1cnJEZXZpY2VFbnRyeSsrLCBDdXJySG9zdEVudHJ5KyspIHsKKyAgICAgIGlmIChDdXJyRGV2aWNlRW50cnktPnNpemUgIT0gMCkgeworICAgICAgICAvLyBoYXMgZGF0YS4KKyAgICAgICAgYXNzZXJ0KEN1cnJEZXZpY2VFbnRyeS0+c2l6ZSA9PSBDdXJySG9zdEVudHJ5LT5zaXplICYmCisgICAgICAgICAgICAgICAiZGF0YSBzaXplIG1pc21hdGNoIik7CisKKyAgICAgICAgLy8gRm9ydHJhbiBtYXkgdXNlIG11bHRpcGxlIHdlYWsgZGVjbGFyYXRpb25zIGZvciB0aGUgc2FtZSBzeW1ib2wsCisgICAgICAgIC8vIHRoZXJlZm9yZSB3ZSBtdXN0IGFsbG93IGZvciBtdWx0aXBsZSB3ZWFrIHN5bWJvbHMgdG8gYmUgbG9hZGVkIGZyb20KKyAgICAgICAgLy8gdGhlIGZhdCBiaW5hcnkuIFRyZWF0IHRoZXNlIG1hcHBpbmdzIGFzIGFueSBvdGhlciAicmVndWxhciIgbWFwcGluZy4KKyAgICAgICAgLy8gQWRkIGVudHJ5IHRvIG1hcC4KKyAgICAgICAgaWYgKERldmljZS5nZXRUZ3RQdHJCZWdpbihDdXJySG9zdEVudHJ5LT5hZGRyLCBDdXJySG9zdEVudHJ5LT5zaXplKSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgRFAoIkFkZCBtYXBwaW5nIGZyb20gaG9zdCAiIERQeE1PRCAiIHRvIGRldmljZSAiIERQeE1PRCAiIHdpdGggc2l6ZSAlenUiCisgICAgICAgICAgICAiXG4iLCBEUHhQVFIoQ3Vyckhvc3RFbnRyeS0+YWRkciksIERQeFBUUihDdXJyRGV2aWNlRW50cnktPmFkZHIpLAorICAgICAgICAgICAgQ3VyckRldmljZUVudHJ5LT5zaXplKTsKKyAgICAgICAgRGV2aWNlLkhvc3REYXRhVG9UYXJnZXRNYXAucHVzaF9mcm9udChIb3N0RGF0YVRvVGFyZ2V0VHkoCisgICAgICAgICAgICAodWludHB0cl90KUN1cnJIb3N0RW50cnktPmFkZHIgLypIc3RQdHJCYXNlKi8sCisgICAgICAgICAgICAodWludHB0cl90KUN1cnJIb3N0RW50cnktPmFkZHIgLypIc3RQdHJCZWdpbiovLAorICAgICAgICAgICAgKHVpbnRwdHJfdClDdXJySG9zdEVudHJ5LT5hZGRyICsgQ3Vyckhvc3RFbnRyeS0+c2l6ZSAvKkhzdFB0ckVuZCovLAorICAgICAgICAgICAgKHVpbnRwdHJfdClDdXJyRGV2aWNlRW50cnktPmFkZHIgLypUZ3RQdHJCZWdpbiovLAorICAgICAgICAgICAgSU5GX1JFRl9DTlQgLypSZWZDb3VudCovKSk7CisgICAgICB9CisgICAgfQorICAgIERldmljZS5EYXRhTWFwTXR4LnVubG9jaygpOworICB9CisgIFRybFRibE10eC51bmxvY2soKTsKKworICBpZiAocmMgIT0gT0ZGTE9BRF9TVUNDRVNTKSB7CisgICAgRGV2aWNlLlBlbmRpbmdHbG9iYWxzTXR4LnVubG9jaygpOworICAgIHJldHVybiByYzsKKyAgfQorCisgIC8qCisgICAqIFJ1biBjdG9ycyBmb3Igc3RhdGljIG9iamVjdHMKKyAgICovCisgIGlmICghRGV2aWNlLlBlbmRpbmdDdG9yc0R0b3JzLmVtcHR5KCkpIHsKKyAgICAvLyBDYWxsIGFsbCBjdG9ycyBmb3IgYWxsIGxpYnJhcmllcyByZWdpc3RlcmVkIHNvIGZhcgorICAgIGZvciAoYXV0byAmbGliIDogRGV2aWNlLlBlbmRpbmdDdG9yc0R0b3JzKSB7CisgICAgICBpZiAoIWxpYi5zZWNvbmQuUGVuZGluZ0N0b3JzLmVtcHR5KCkpIHsKKyAgICAgICAgRFAoIkhhcyBwZW5kaW5nIGN0b3JzLi4uIGNhbGwgbm93XG4iKTsKKyAgICAgICAgZm9yIChhdXRvICZlbnRyeSA6IGxpYi5zZWNvbmQuUGVuZGluZ0N0b3JzKSB7CisgICAgICAgICAgdm9pZCAqY3RvciA9IGVudHJ5OworICAgICAgICAgIGludCByYyA9IHRhcmdldChkZXZpY2VfaWQsIGN0b3IsIDAsIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDEsIDEsIHRydWUgLyp0ZWFtKi8pOworICAgICAgICAgIGlmIChyYyAhPSBPRkZMT0FEX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIERQKCJSdW5uaW5nIGN0b3IgIiBEUHhNT0QgIiBmYWlsZWQuXG4iLCBEUHhQVFIoY3RvcikpOworICAgICAgICAgICAgRGV2aWNlLlBlbmRpbmdHbG9iYWxzTXR4LnVubG9jaygpOworICAgICAgICAgICAgcmV0dXJuIE9GRkxPQURfRkFJTDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2xlYXIgdGhlIGxpc3QgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGRldmljZSBoYXMgYmVlbiB1c2VkCisgICAgICAgIGxpYi5zZWNvbmQuUGVuZGluZ0N0b3JzLmNsZWFyKCk7CisgICAgICAgIERQKCJEb25lIHdpdGggcGVuZGluZyBjdG9ycyBmb3IgbGliICIgRFB4TU9EICJcbiIsIERQeFBUUihsaWIuZmlyc3QpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgRGV2aWNlLkhhc1BlbmRpbmdHbG9iYWxzID0gZmFsc2U7CisgIERldmljZS5QZW5kaW5nR2xvYmFsc010eC51bmxvY2soKTsKKworICByZXR1cm4gT0ZGTE9BRF9TVUNDRVNTOworfQorCisvLyBDaGVjayB3aGV0aGVyIGEgZGV2aWNlIGhhcyBiZWVuIGluaXRpYWxpemVkLCBnbG9iYWwgY3RvcnMgaGF2ZSBiZWVuCisvLyBleGVjdXRlZCBhbmQgZ2xvYmFsIGRhdGEgaGFzIGJlZW4gbWFwcGVkOyBkbyBzbyBpZiBub3QgYWxyZWFkeSBkb25lLgorc3RhdGljIGludCBDaGVja0RldmljZShpbnQzMl90IGRldmljZV9pZCkgeworICAvLyBJcyBkZXZpY2UgcmVhZHk/CisgIGlmICghZGV2aWNlX2lzX3JlYWR5KGRldmljZV9pZCkpIHsKKyAgICBEUCgiRGV2aWNlICVkIGlzIG5vdCByZWFkeS5cbiIsIGRldmljZV9pZCk7CisgICAgcmV0dXJuIE9GRkxPQURfRkFJTDsKKyAgfQorCisgIC8vIEdldCBkZXZpY2UgaW5mby4KKyAgRGV2aWNlVHkgJkRldmljZSA9IERldmljZXNbZGV2aWNlX2lkXTsKKworICAvLyBDaGVjayB3aGV0aGVyIGdsb2JhbCBkYXRhIGhhcyBiZWVuIG1hcHBlZCBmb3IgdGhpcyBkZXZpY2UKKyAgRGV2aWNlLlBlbmRpbmdHbG9iYWxzTXR4LmxvY2soKTsKKyAgYm9vbCBoYXNQZW5kaW5nR2xvYmFscyA9IERldmljZS5IYXNQZW5kaW5nR2xvYmFsczsKKyAgRGV2aWNlLlBlbmRpbmdHbG9iYWxzTXR4LnVubG9jaygpOworICBpZiAoaGFzUGVuZGluZ0dsb2JhbHMgJiYgSW5pdExpYnJhcnkoRGV2aWNlKSAhPSBPRkZMT0FEX1NVQ0NFU1MpIHsKKyAgICBEUCgiRmFpbGVkIHRvIGluaXQgZ2xvYmFscyBvbiBkZXZpY2UgJWRcbiIsIGRldmljZV9pZCk7CisgICAgcmV0dXJuIE9GRkxPQURfRkFJTDsKKyAgfQorCisgIHJldHVybiBPRkZMT0FEX1NVQ0NFU1M7Cit9CisKKy8vIEZvbGxvd2luZyBkYXRhdHlwZXMgYW5kIGZ1bmN0aW9ucyAodGd0X29sZG1hcF90eXBlLCBjb21iaW5lZF9lbnRyeV90LAorLy8gdHJhbnNsYXRlX21hcCwgY2xlYW51cF9tYXApIHdpbGwgYmUgcmVtb3ZlZCBvbmNlIHRoZSBjb21waWxlciBzdGFydHMgdXNpbmcKKy8vIHRoZSBuZXcgbWFwIHR5cGVzLgorCisvLyBPbGQgbWFwIHR5cGVzCitlbnVtIHRndF9vbGRtYXBfdHlwZSB7CisgIE9NUF9UR1RfT0xETUFQVFlQRV9UTyAgICAgICAgICA9IDB4MDAxLCAvLyBjb3B5IGRhdGEgZnJvbSBob3N0IHRvIGRldmljZQorICBPTVBfVEdUX09MRE1BUFRZUEVfRlJPTSAgICAgICAgPSAweDAwMiwgLy8gY29weSBkYXRhIGZyb20gZGV2aWNlIHRvIGhvc3QKKyAgT01QX1RHVF9PTERNQVBUWVBFX0FMV0FZUyAgICAgID0gMHgwMDQsIC8vIGNvcHkgcmVnYXJkbGVzcyBvZiB0aGUgcmVmLiBjb3VudAorICBPTVBfVEdUX09MRE1BUFRZUEVfREVMRVRFICAgICAgPSAweDAwOCwgLy8gZm9yY2UgdW5tYXBwaW5nIG9mIGRhdGEKKyAgT01QX1RHVF9PTERNQVBUWVBFX01BUF9QVFIgICAgID0gMHgwMTAsIC8vIG1hcCBwb2ludGVyIGFzIHdlbGwgYXMgcG9pbnRlZQorICBPTVBfVEdUX09MRE1BUFRZUEVfRklSU1RfTUFQICAgPSAweDAyMCwgLy8gZmlyc3Qgb2NjdXJyZW5jZSBvZiBtYXBwZWQgdmFyaWFibGUKKyAgT01QX1RHVF9PTERNQVBUWVBFX1JFVFVSTl9QVFIgID0gMHgwNDAsIC8vIHJldHVybiBUZ3RCYXNlIGFkZHIgb2YgbWFwcGVkIGRhdGEKKyAgT01QX1RHVF9PTERNQVBUWVBFX1BSSVZBVEVfUFRSID0gMHgwODAsIC8vIHByaXZhdGUgdmFyaWFibGUgLSBub3QgbWFwcGVkCisgIE9NUF9UR1RfT0xETUFQVFlQRV9QUklWQVRFX1ZBTCA9IDB4MTAwICAvLyBjb3B5IGJ5IHZhbHVlIC0gbm90IG1hcHBlZAorfTsKKworLy8gVGVtcG9yYXJ5IGZ1bmN0aW9ucyBmb3IgbWFwIHRyYW5zbGF0aW9uIGFuZCBjbGVhbnVwCitzdHJ1Y3QgY29tYmluZWRfZW50cnlfdCB7CisgIGludCBudW1fbWVtYmVyczsgLy8gbnVtYmVyIG9mIG1lbWJlcnMgaW4gY29tYmluZWQgZW50cnkKKyAgdm9pZCAqYmFzZV9hZGRyOyAvLyBiYXNlIGFkZHJlc3Mgb2YgY29tYmluZWQgZW50cnkKKyAgdm9pZCAqYmVnaW5fYWRkcjsgLy8gYmVnaW4gYWRkcmVzcyBvZiBjb21iaW5lZCBlbnRyeQorICB2b2lkICplbmRfYWRkcjsgLy8gc2l6ZSBvZiBjb21iaW5lZCBlbnRyeQorfTsKKworc3RhdGljIHZvaWQgdHJhbnNsYXRlX21hcChpbnQzMl90IGFyZ19udW0sIHZvaWQgKiphcmdzX2Jhc2UsIHZvaWQgKiphcmdzLAorICAgIGludDY0X3QgKmFyZ19zaXplcywgaW50MzJfdCAqYXJnX3R5cGVzLCBpbnQzMl90ICZuZXdfYXJnX251bSwKKyAgICB2b2lkICoqJm5ld19hcmdzX2Jhc2UsIHZvaWQgKiombmV3X2FyZ3MsIGludDY0X3QgKiZuZXdfYXJnX3NpemVzLAorICAgIGludDY0X3QgKiZuZXdfYXJnX3R5cGVzLCBib29sIGlzX3RhcmdldF9jb25zdHJ1Y3QpIHsKKyAgaWYgKGFyZ19udW0gPD0gMCkgeworICAgIERQKCJOb3RoaW5nIHRvIHRyYW5zbGF0ZVxuIik7CisgICAgbmV3X2FyZ19udW0gPSAwOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIGFycmF5IG9mIGNvbWJpbmVkIGVudHJpZXMKKyAgY29tYmluZWRfZW50cnlfdCAqY21iX2VudHJpZXMgPQorICAgICAgKGNvbWJpbmVkX2VudHJ5X3QgKikgYWxsb2NhKGFyZ19udW0gKiBzaXplb2YoY29tYmluZWRfZW50cnlfdCkpOworICAvLyBudW1iZXIgb2YgY29tYmluZWQgZW50cmllcworICBsb25nIG51bV9jb21iaW5lZCA9IDA7CisgIC8vIG9sZCBlbnRyeSBpcyBNQVBfUFRSPworICBib29sICppc19wdHJfb2xkID0gKGJvb2wgKikgYWxsb2NhKGFyZ19udW0gKiBzaXplb2YoYm9vbCkpOworICAvLyBvbGQgZW50cnkgaXMgbWVtYmVyIG9mIG1lbWJlcl9vZltvbGRdIGNtYl9lbnRyeQorICBpbnQgKm1lbWJlcl9vZiA9IChpbnQgKikgYWxsb2NhKGFyZ19udW0gKiBzaXplb2YoaW50KSk7CisgIC8vIHRlbXBvcmFyeSBzdG9yYWdlIGZvciBtb2RpZmljYXRpb25zIG9mIHRoZSBvcmlnaW5hbCBhcmdfdHlwZXMKKyAgaW50MzJfdCAqbW9kX2FyZ190eXBlcyA9IChpbnQzMl90ICopIGFsbG9jYShhcmdfbnVtICAqc2l6ZW9mKGludDMyX3QpKTsKKworICBEUCgiVHJhbnNsYXRpbmcgJWQgbWFwIGVudHJpZXNcbiIsIGFyZ19udW0pOworICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ19udW07ICsraSkgeworICAgIG1lbWJlcl9vZltpXSA9IC0xOworICAgIGlzX3B0cl9vbGRbaV0gPSBmYWxzZTsKKyAgICBtb2RfYXJnX3R5cGVzW2ldID0gYXJnX3R5cGVzW2ldOworICAgIC8vIFNjYW4gcHJldmlvdXMgZW50cmllcyB0byBzZWUgd2hldGhlciB0aGlzIGVudHJ5IHNoYXJlcyB0aGUgc2FtZSBiYXNlCisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpOyArK2opIHsKKyAgICAgIHZvaWQgKm5ld19iZWdpbl9hZGRyID0gTlVMTDsKKyAgICAgIHZvaWQgKm5ld19lbmRfYWRkciA9IE5VTEw7CisKKyAgICAgIGlmIChtb2RfYXJnX3R5cGVzW2ldICYgT01QX1RHVF9PTERNQVBUWVBFX01BUF9QVFIpIHsKKyAgICAgICAgaWYgKGFyZ3NfYmFzZVtpXSA9PSBhcmdzW2pdKSB7CisgICAgICAgICAgaWYgKCEobW9kX2FyZ190eXBlc1tqXSAmIE9NUF9UR1RfT0xETUFQVFlQRV9NQVBfUFRSKSkgeworICAgICAgICAgICAgRFAoIkVudHJ5ICVkIGhhcyB0aGUgc2FtZSBiYXNlIGFzIGVudHJ5ICVkJ3MgYmVnaW4gYWRkcmVzc1xuIiwgaSwKKyAgICAgICAgICAgICAgICBqKTsKKyAgICAgICAgICAgIG5ld19iZWdpbl9hZGRyID0gYXJnc19iYXNlW2ldOworICAgICAgICAgICAgbmV3X2VuZF9hZGRyID0gKGNoYXIgKilhcmdzX2Jhc2VbaV0gKyBzaXplb2Yodm9pZCAqKTsKKyAgICAgICAgICAgIGFzc2VydChhcmdfc2l6ZXNbal0gPT0gc2l6ZW9mKHZvaWQgKikpOworICAgICAgICAgICAgaXNfcHRyX29sZFtqXSA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIERQKCJFbnRyeSAlZCBoYXMgdGhlIHNhbWUgYmFzZSBhcyBlbnRyeSAlZCdzIGJlZ2luIGFkZHJlc3MsIGJ1dCAiCisgICAgICAgICAgICAgICAgIiVkJ3MgYmFzZSB3YXMgYSBNQVBfUFRSIHRvb1xuIiwgaSwgaiwgaik7CisgICAgICAgICAgICBpbnQzMl90IHRvX2Zyb21fYWx3YXlzX2RlbGV0ZSA9CisgICAgICAgICAgICAgICAgT01QX1RHVF9PTERNQVBUWVBFX1RPIHwgT01QX1RHVF9PTERNQVBUWVBFX0ZST00gfAorICAgICAgICAgICAgICAgIE9NUF9UR1RfT0xETUFQVFlQRV9BTFdBWVMgfCBPTVBfVEdUX09MRE1BUFRZUEVfREVMRVRFOworICAgICAgICAgICAgaWYgKG1vZF9hcmdfdHlwZXNbal0gJiB0b19mcm9tX2Fsd2F5c19kZWxldGUpIHsKKyAgICAgICAgICAgICAgRFAoIlJlc2V0dGluZyB0by9mcm9tL2Fsd2F5cy9kZWxldGUgZmxhZ3MgZm9yIGVudHJ5ICVkIGJlY2F1c2UgIgorICAgICAgICAgICAgICAgICAgIml0IGlzIG9ubHkgYSBwb2ludGVyIHRvIHBvaW50ZXJcbiIsIGopOworICAgICAgICAgICAgICBtb2RfYXJnX3R5cGVzW2pdICY9IH50b19mcm9tX2Fsd2F5c19kZWxldGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoIShtb2RfYXJnX3R5cGVzW2ldICYgT01QX1RHVF9PTERNQVBUWVBFX0ZJUlNUX01BUCkgJiYKKyAgICAgICAgICAgIGFyZ3NfYmFzZVtpXSA9PSBhcmdzX2Jhc2Vbal0pIHsKKyAgICAgICAgICBEUCgiRW50cnkgJWQgaGFzIHRoZSBzYW1lIGJhc2UgYWRkcmVzcyBhcyBlbnRyeSAlZFxuIiwgaSwgaik7CisgICAgICAgICAgbmV3X2JlZ2luX2FkZHIgPSBhcmdzW2ldOworICAgICAgICAgIG5ld19lbmRfYWRkciA9IChjaGFyICopYXJnc1tpXSArIGFyZ19zaXplc1tpXTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBJZiB3ZSBoYXZlIGNvbWJpbmVkIHRoZSBlbnRyeSB3aXRoIGEgcHJldmlvdXMgb25lCisgICAgICBpZiAobmV3X2JlZ2luX2FkZHIpIHsKKyAgICAgICAgaW50IGlkOworICAgICAgICBpZihtZW1iZXJfb2Zbal0gPT0gLTEpIHsKKyAgICAgICAgICAvLyBXZSBoYXZlIGEgbmV3IGVudHJ5CisgICAgICAgICAgaWQgPSBudW1fY29tYmluZWQrKzsKKyAgICAgICAgICBEUCgiQ3JlYXRpbmcgbmV3IGNvbWJpbmVkIGVudHJ5ICVkIGZvciBvbGQgZW50cnkgJWRcbiIsIGlkLCBqKTsKKyAgICAgICAgICAvLyBJbml0aWFsaXplIG5ldyBlbnRyeQorICAgICAgICAgIGNtYl9lbnRyaWVzW2lkXS5udW1fbWVtYmVycyA9IDE7CisgICAgICAgICAgY21iX2VudHJpZXNbaWRdLmJhc2VfYWRkciA9IGFyZ3NfYmFzZVtqXTsKKyAgICAgICAgICBpZiAobW9kX2FyZ190eXBlc1tqXSAmIE9NUF9UR1RfT0xETUFQVFlQRV9NQVBfUFRSKSB7CisgICAgICAgICAgICBjbWJfZW50cmllc1tpZF0uYmVnaW5fYWRkciA9IGFyZ3NfYmFzZVtqXTsKKyAgICAgICAgICAgIGNtYl9lbnRyaWVzW2lkXS5lbmRfYWRkciA9IChjaGFyICopYXJnc19iYXNlW2pdICsgYXJnX3NpemVzW2pdOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbWJfZW50cmllc1tpZF0uYmVnaW5fYWRkciA9IGFyZ3Nbal07CisgICAgICAgICAgICBjbWJfZW50cmllc1tpZF0uZW5kX2FkZHIgPSAoY2hhciAqKWFyZ3Nbal0gKyBhcmdfc2l6ZXNbal07CisgICAgICAgICAgfQorICAgICAgICAgIG1lbWJlcl9vZltqXSA9IGlkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIFJldXNlIGV4aXN0aW5nIGNvbWJpbmVkIGVudHJ5CisgICAgICAgICAgRFAoIlJldXNpbmcgZXhpc3RpbmcgY29tYmluZWQgZW50cnkgJWRcbiIsIG1lbWJlcl9vZltqXSk7CisgICAgICAgICAgaWQgPSBtZW1iZXJfb2Zbal07CisgICAgICAgIH0KKworICAgICAgICAvLyBVcGRhdGUgY29tYmluZWQgZW50cnkKKyAgICAgICAgRFAoIkFkZGluZyBlbnRyeSAlZCB0byBjb21iaW5lZCBlbnRyeSAlZFxuIiwgaSwgaWQpOworICAgICAgICBjbWJfZW50cmllc1tpZF0ubnVtX21lbWJlcnMrKzsKKyAgICAgICAgLy8gYmFzZV9hZGRyIHN0YXlzIHRoZSBzYW1lCisgICAgICAgIGNtYl9lbnRyaWVzW2lkXS5iZWdpbl9hZGRyID0KKyAgICAgICAgICAgIHN0ZDo6bWluKGNtYl9lbnRyaWVzW2lkXS5iZWdpbl9hZGRyLCBuZXdfYmVnaW5fYWRkcik7CisgICAgICAgIGNtYl9lbnRyaWVzW2lkXS5lbmRfYWRkciA9CisgICAgICAgICAgICBzdGQ6Om1heChjbWJfZW50cmllc1tpZF0uZW5kX2FkZHIsIG5ld19lbmRfYWRkcik7CisgICAgICAgIG1lbWJlcl9vZltpXSA9IGlkOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBEUCgiTmV3IGVudHJpZXM6ICVsZCBjb21iaW5lZCArICVkIG9yaWdpbmFsXG4iLCBudW1fY29tYmluZWQsIGFyZ19udW0pOworICBuZXdfYXJnX251bSA9IGFyZ19udW0gKyBudW1fY29tYmluZWQ7CisgIG5ld19hcmdzX2Jhc2UgPSAodm9pZCAqKikgbWFsbG9jKG5ld19hcmdfbnVtICogc2l6ZW9mKHZvaWQgKikpOworICBuZXdfYXJncyA9ICh2b2lkICoqKSBtYWxsb2MobmV3X2FyZ19udW0gKiBzaXplb2Yodm9pZCAqKSk7CisgIG5ld19hcmdfc2l6ZXMgPSAoaW50NjRfdCAqKSBtYWxsb2MobmV3X2FyZ19udW0gKiBzaXplb2YoaW50NjRfdCkpOworICBuZXdfYXJnX3R5cGVzID0gKGludDY0X3QgKikgbWFsbG9jKG5ld19hcmdfbnVtICogc2l6ZW9mKGludDY0X3QpKTsKKworICBjb25zdCBpbnQ2NF90IGFsaWdubWVudCA9IDg7CisKKyAgaW50IG5leHRfaWQgPSAwOyAvLyBuZXh0IElECisgIGludCBuZXh0X2NpZCA9IDA7IC8vIG5leHQgY29tYmluZWQgSUQKKyAgaW50ICpjb21iaW5lZF90b19uZXdfaWQgPSAoaW50ICopIGFsbG9jYShudW1fY29tYmluZWQgKiBzaXplb2YoaW50KSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnX251bTsgKytpKSB7CisgICAgLy8gSXQgaXMgbWVtYmVyX29mCisgICAgaWYgKG1lbWJlcl9vZltpXSA9PSBuZXh0X2NpZCkgeworICAgICAgaW50IGNpZCA9IG5leHRfY2lkKys7IC8vIElEIG9mIHRoaXMgY29tYmluZWQgZW50cnkKKyAgICAgIGludCBuaWQgPSBuZXh0X2lkKys7IC8vIElEIG9mIHRoZSBuZXcgKGdsb2JhbCkgZW50cnkKKyAgICAgIGNvbWJpbmVkX3RvX25ld19pZFtjaWRdID0gbmlkOworICAgICAgRFAoIkNvbWJpbmVkIGVudHJ5ICUzZCB3aWxsIGJlY29tZSBuZXcgZW50cnkgJTNkXG4iLCBjaWQsIG5pZCk7CisKKyAgICAgIGludDY0X3QgcGFkZGluZyA9IChpbnQ2NF90KWNtYl9lbnRyaWVzW2NpZF0uYmVnaW5fYWRkciAlIGFsaWdubWVudDsKKyAgICAgIGlmIChwYWRkaW5nKSB7CisgICAgICAgIERQKCJVc2luZyBhIHBhZGRpbmcgb2YgJSIgUFJJZDY0ICIgZm9yIGJlZ2luIGFkZHJlc3MgIiBEUHhNT0QgIlxuIiwKKyAgICAgICAgICAgIHBhZGRpbmcsIERQeFBUUihjbWJfZW50cmllc1tjaWRdLmJlZ2luX2FkZHIpKTsKKyAgICAgICAgY21iX2VudHJpZXNbY2lkXS5iZWdpbl9hZGRyID0KKyAgICAgICAgICAgIChjaGFyICopY21iX2VudHJpZXNbY2lkXS5iZWdpbl9hZGRyIC0gcGFkZGluZzsKKyAgICAgIH0KKworICAgICAgbmV3X2FyZ3NfYmFzZVtuaWRdID0gY21iX2VudHJpZXNbY2lkXS5iYXNlX2FkZHI7CisgICAgICBuZXdfYXJnc1tuaWRdID0gY21iX2VudHJpZXNbY2lkXS5iZWdpbl9hZGRyOworICAgICAgbmV3X2FyZ19zaXplc1tuaWRdID0gKGludDY0X3QpICgoY2hhciAqKWNtYl9lbnRyaWVzW2NpZF0uZW5kX2FkZHIgLQorICAgICAgICAgIChjaGFyICopY21iX2VudHJpZXNbY2lkXS5iZWdpbl9hZGRyKTsKKyAgICAgIG5ld19hcmdfdHlwZXNbbmlkXSA9IE9NUF9UR1RfTUFQVFlQRV9UQVJHRVRfUEFSQU07CisgICAgICBEUCgiRW50cnkgJTNkOiBiYXNlX2FkZHIgIiBEUHhNT0QgIiwgYmVnaW5fYWRkciAiIERQeE1PRCAiLCAiCisgICAgICAgICAgInNpemUgJSIgUFJJZDY0ICIsIHR5cGUgMHglIiBQUkl4NjQgIlxuIiwgbmlkLAorICAgICAgICAgIERQeFBUUihuZXdfYXJnc19iYXNlW25pZF0pLCBEUHhQVFIobmV3X2FyZ3NbbmlkXSksIG5ld19hcmdfc2l6ZXNbbmlkXSwKKyAgICAgICAgICBuZXdfYXJnX3R5cGVzW25pZF0pOworICAgIH0gZWxzZSBpZiAobWVtYmVyX29mW2ldICE9IC0xKSB7CisgICAgICBEUCgiQ29tYmluZWQgZW50cnkgJTNkIGhhcyBiZWVuIGVuY291bnRlcmVkIGJlZm9yZSwgZG8gbm90aGluZ1xuIiwKKyAgICAgICAgICBtZW1iZXJfb2ZbaV0pOworICAgIH0KKworICAgIC8vIE5vdyB0aGF0IHRoZSBjb21iaW5lZCBlbnRyeSAodGhlIG9uZSB0aGUgb2xkIGVudHJ5IHdhcyBhIG1lbWJlciBvZikgaGFzCisgICAgLy8gYmVlbiBpbnNlcnRlZCBpbnRvIHRoZSBuZXcgYXJndW1lbnRzIGxpc3QsIHByb2NlZWQgd2l0aCB0aGUgb2xkIGVudHJ5LgorICAgIGludCBuaWQgPSBuZXh0X2lkKys7CisgICAgRFAoIk9sZCBlbnRyeSAlM2Qgd2lsbCBiZWNvbWUgbmV3IGVudHJ5ICUzZFxuIiwgaSwgbmlkKTsKKworICAgIG5ld19hcmdzX2Jhc2VbbmlkXSA9IGFyZ3NfYmFzZVtpXTsKKyAgICBuZXdfYXJnc1tuaWRdID0gYXJnc1tpXTsKKyAgICBuZXdfYXJnX3NpemVzW25pZF0gPSBhcmdfc2l6ZXNbaV07CisgICAgaW50NjRfdCBvbGRfdHlwZSA9IG1vZF9hcmdfdHlwZXNbaV07CisKKyAgICBpZiAoaXNfcHRyX29sZFtpXSkgeworICAgICAgLy8gUmVzZXQgVE8gYW5kIEZST00gZmxhZ3MKKyAgICAgIG9sZF90eXBlICY9IH4oT01QX1RHVF9PTERNQVBUWVBFX1RPIHwgT01QX1RHVF9PTERNQVBUWVBFX0ZST00pOworICAgIH0KKworICAgIGlmIChtZW1iZXJfb2ZbaV0gPT0gLTEpIHsKKyAgICAgIGlmICghaXNfdGFyZ2V0X2NvbnN0cnVjdCkKKyAgICAgICAgb2xkX3R5cGUgJj0gfk9NUF9UR1RfTUFQVFlQRV9UQVJHRVRfUEFSQU07CisgICAgICBuZXdfYXJnX3R5cGVzW25pZF0gPSBvbGRfdHlwZTsKKyAgICAgIERQKCJFbnRyeSAlM2Q6IGJhc2VfYWRkciAiIERQeE1PRCAiLCBiZWdpbl9hZGRyICIgRFB4TU9EICIsIHNpemUgJSIgUFJJZDY0CisgICAgICAgICAgIiwgdHlwZSAweCUiIFBSSXg2NCAiIChvbGQgZW50cnkgJWQgbm90IE1FTUJFUl9PRilcbiIsIG5pZCwKKyAgICAgICAgICBEUHhQVFIobmV3X2FyZ3NfYmFzZVtuaWRdKSwgRFB4UFRSKG5ld19hcmdzW25pZF0pLCBuZXdfYXJnX3NpemVzW25pZF0sCisgICAgICAgICAgbmV3X2FyZ190eXBlc1tuaWRdLCBpKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gT2xkIGVudHJ5IGlzIG5vdCBGSVJTVF9NQVAKKyAgICAgIG9sZF90eXBlICY9IH5PTVBfVEdUX09MRE1BUFRZUEVfRklSU1RfTUFQOworICAgICAgLy8gQWRkIE1FTUJFUl9PRgorICAgICAgaW50IG5ld19tZW1iZXJfb2YgPSBjb21iaW5lZF90b19uZXdfaWRbbWVtYmVyX29mW2ldXTsKKyAgICAgIG9sZF90eXBlIHw9ICgoaW50NjRfdCluZXdfbWVtYmVyX29mICsgMSkgPDwgNDg7CisgICAgICBuZXdfYXJnX3R5cGVzW25pZF0gPSBvbGRfdHlwZTsKKyAgICAgIERQKCJFbnRyeSAlM2Q6IGJhc2VfYWRkciAiIERQeE1PRCAiLCBiZWdpbl9hZGRyICIgRFB4TU9EICIsIHNpemUgJSIgUFJJZDY0CisgICAgICAgICIsIHR5cGUgMHglIiBQUkl4NjQgIiAob2xkIGVudHJ5ICVkIE1FTUJFUl9PRiAlZClcbiIsIG5pZCwKKyAgICAgICAgRFB4UFRSKG5ld19hcmdzX2Jhc2VbbmlkXSksIERQeFBUUihuZXdfYXJnc1tuaWRdKSwgbmV3X2FyZ19zaXplc1tuaWRdLAorICAgICAgICBuZXdfYXJnX3R5cGVzW25pZF0sIGksIG5ld19tZW1iZXJfb2YpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBjbGVhbnVwX21hcChpbnQzMl90IG5ld19hcmdfbnVtLCB2b2lkICoqbmV3X2FyZ3NfYmFzZSwKKyAgICB2b2lkICoqbmV3X2FyZ3MsIGludDY0X3QgKm5ld19hcmdfc2l6ZXMsIGludDY0X3QgKm5ld19hcmdfdHlwZXMsCisgICAgaW50MzJfdCBhcmdfbnVtLCB2b2lkICoqYXJnc19iYXNlKSB7CisgIGlmIChuZXdfYXJnX251bSA+IDApIHsKKyAgICBpbnQgb2Zmc2V0ID0gbmV3X2FyZ19udW0gLSBhcmdfbnVtOworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGFyZ19udW07ICsraSkgeworICAgICAgLy8gUmVzdG9yZSBvbGQgYmFzZSBhZGRyZXNzCisgICAgICBhcmdzX2Jhc2VbaV0gPSBuZXdfYXJnc19iYXNlW2krb2Zmc2V0XTsKKyAgICB9CisgICAgZnJlZShuZXdfYXJnc19iYXNlKTsKKyAgICBmcmVlKG5ld19hcmdzKTsKKyAgICBmcmVlKG5ld19hcmdfc2l6ZXMpOworICAgIGZyZWUobmV3X2FyZ190eXBlcyk7CisgIH0KK30KKworc3RhdGljIHNob3J0IG1lbWJlcl9vZihpbnQ2NF90IHR5cGUpIHsKKyAgcmV0dXJuICgodHlwZSAmIE9NUF9UR1RfTUFQVFlQRV9NRU1CRVJfT0YpID4+IDQ4KSAtIDE7Cit9CisKKy8vLyBJbnRlcm5hbCBmdW5jdGlvbiB0byBkbyB0aGUgbWFwcGluZyBhbmQgdHJhbnNmZXIgdGhlIGRhdGEgdG8gdGhlIGRldmljZQorc3RhdGljIGludCB0YXJnZXRfZGF0YV9iZWdpbihEZXZpY2VUeSAmRGV2aWNlLCBpbnQzMl90IGFyZ19udW0sCisgICAgdm9pZCAqKmFyZ3NfYmFzZSwgdm9pZCAqKmFyZ3MsIGludDY0X3QgKmFyZ19zaXplcywgaW50NjRfdCAqYXJnX3R5cGVzKSB7CisgIC8vIHByb2Nlc3MgZWFjaCBpbnB1dC4KKyAgaW50IHJjID0gT0ZGTE9BRF9TVUNDRVNTOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBhcmdfbnVtOyArK2kpIHsKKyAgICAvLyBJZ25vcmUgcHJpdmF0ZSB2YXJpYWJsZXMgYW5kIGFycmF5cyAtIHRoZXJlIGlzIG5vIG1hcHBpbmcgZm9yIHRoZW0uCisgICAgaWYgKChhcmdfdHlwZXNbaV0gJiBPTVBfVEdUX01BUFRZUEVfTElURVJBTCkgfHwKKyAgICAgICAgKGFyZ190eXBlc1tpXSAmIE9NUF9UR1RfTUFQVFlQRV9QUklWQVRFKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgdm9pZCAqSHN0UHRyQmVnaW4gPSBhcmdzW2ldOworICAgIHZvaWQgKkhzdFB0ckJhc2UgPSBhcmdzX2Jhc2VbaV07CisgICAgLy8gQWRkcmVzcyBvZiBwb2ludGVyIG9uIHRoZSBob3N0IGFuZCBkZXZpY2UsIHJlc3BlY3RpdmVseS4KKyAgICB2b2lkICpQb2ludGVyX0hzdFB0ckJlZ2luLCAqUG9pbnRlcl9UZ3RQdHJCZWdpbjsKKyAgICBib29sIElzTmV3LCBQb2ludGVyX0lzTmV3OworICAgIGJvb2wgSXNJbXBsaWNpdCA9IGFyZ190eXBlc1tpXSAmIE9NUF9UR1RfTUFQVFlQRV9JTVBMSUNJVDsKKyAgICBib29sIFVwZGF0ZVJlZiA9ICEoYXJnX3R5cGVzW2ldICYgT01QX1RHVF9NQVBUWVBFX01FTUJFUl9PRik7CisgICAgaWYgKGFyZ190eXBlc1tpXSAmIE9NUF9UR1RfTUFQVFlQRV9QVFJfQU5EX09CSikgeworICAgICAgRFAoIkhhcyBhIHBvaW50ZXIgZW50cnk6IFxuIik7CisgICAgICAvLyBiYXNlIGlzIGFkZHJlc3Mgb2YgcG9pbnRlci4KKyAgICAgIFBvaW50ZXJfVGd0UHRyQmVnaW4gPSBEZXZpY2UuZ2V0T3JBbGxvY1RndFB0cihIc3RQdHJCYXNlLCBIc3RQdHJCYXNlLAorICAgICAgICAgIHNpemVvZih2b2lkICopLCBQb2ludGVyX0lzTmV3LCBJc0ltcGxpY2l0LCBVcGRhdGVSZWYpOworICAgICAgaWYgKCFQb2ludGVyX1RndFB0ckJlZ2luKSB7CisgICAgICAgIERQKCJDYWxsIHRvIGdldE9yQWxsb2NUZ3RQdHIgcmV0dXJuZWQgbnVsbCBwb2ludGVyIChkZXZpY2UgZmFpbHVyZSBvciAiCisgICAgICAgICAgICAiaWxsZWdhbCBtYXBwaW5nKS5cbiIpOworICAgICAgfQorICAgICAgRFAoIlRoZXJlIGFyZSAlenUgYnl0ZXMgYWxsb2NhdGVkIGF0IHRhcmdldCBhZGRyZXNzICIgRFB4TU9EICIgLSBpcyVzIG5ldyIKKyAgICAgICAgICAiXG4iLCBzaXplb2Yodm9pZCAqKSwgRFB4UFRSKFBvaW50ZXJfVGd0UHRyQmVnaW4pLAorICAgICAgICAgIChQb2ludGVyX0lzTmV3ID8gIiIgOiAiIG5vdCIpKTsKKyAgICAgIFBvaW50ZXJfSHN0UHRyQmVnaW4gPSBIc3RQdHJCYXNlOworICAgICAgLy8gbW9kaWZ5IGN1cnJlbnQgZW50cnkuCisgICAgICBIc3RQdHJCYXNlID0gKih2b2lkICoqKUhzdFB0ckJhc2U7CisgICAgICBVcGRhdGVSZWYgPSB0cnVlOyAvLyBzdWJzZXF1ZW50bHkgdXBkYXRlIHJlZiBjb3VudCBvZiBwb2ludGVlCisgICAgfQorCisgICAgdm9pZCAqVGd0UHRyQmVnaW4gPSBEZXZpY2UuZ2V0T3JBbGxvY1RndFB0cihIc3RQdHJCZWdpbiwgSHN0UHRyQmFzZSwKKyAgICAgICAgYXJnX3NpemVzW2ldLCBJc05ldywgSXNJbXBsaWNpdCwgVXBkYXRlUmVmKTsKKyAgICBpZiAoIVRndFB0ckJlZ2luICYmIGFyZ19zaXplc1tpXSkgeworICAgICAgLy8gSWYgYXJnX3NpemVzW2ldPT0wLCB0aGVuIHRoZSBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gTlVMTCwgc28KKyAgICAgIC8vIGdldE9yQWxsb2MoKSByZXR1cm5pbmcgTlVMTCBpcyBub3QgYW4gZXJyb3IuCisgICAgICBEUCgiQ2FsbCB0byBnZXRPckFsbG9jVGd0UHRyIHJldHVybmVkIG51bGwgcG9pbnRlciAoZGV2aWNlIGZhaWx1cmUgb3IgIgorICAgICAgICAgICJpbGxlZ2FsIG1hcHBpbmcpLlxuIik7CisgICAgfQorICAgIERQKCJUaGVyZSBhcmUgJSIgUFJJZDY0ICIgYnl0ZXMgYWxsb2NhdGVkIGF0IHRhcmdldCBhZGRyZXNzICIgRFB4TU9ECisgICAgICAgICIgLSBpcyVzIG5ld1xuIiwgYXJnX3NpemVzW2ldLCBEUHhQVFIoVGd0UHRyQmVnaW4pLAorICAgICAgICAoSXNOZXcgPyAiIiA6ICIgbm90IikpOworCisgICAgaWYgKGFyZ190eXBlc1tpXSAmIE9NUF9UR1RfTUFQVFlQRV9SRVRVUk5fUEFSQU0pIHsKKyAgICAgIHZvaWQgKnJldF9wdHI7CisgICAgICBpZiAoYXJnX3R5cGVzW2ldICYgT01QX1RHVF9NQVBUWVBFX1BUUl9BTkRfT0JKKQorICAgICAgICByZXRfcHRyID0gUG9pbnRlcl9UZ3RQdHJCZWdpbjsKKyAgICAgIGVsc2UgeworICAgICAgICBib29sIElzTGFzdDsgLy8gbm90IHVzZWQKKyAgICAgICAgcmV0X3B0ciA9IERldmljZS5nZXRUZ3RQdHJCZWdpbihIc3RQdHJCZWdpbiwgMCwgSXNMYXN0LCBmYWxzZSk7CisgICAgICB9CisKKyAgICAgIERQKCJSZXR1cm5pbmcgZGV2aWNlIHBvaW50ZXIgIiBEUHhNT0QgIlxuIiwgRFB4UFRSKHJldF9wdHIpKTsKKyAgICAgIGFyZ3NfYmFzZVtpXSA9IHJldF9wdHI7CisgICAgfQorCisgICAgaWYgKGFyZ190eXBlc1tpXSAmIE9NUF9UR1RfTUFQVFlQRV9UTykgeworICAgICAgYm9vbCBjb3B5ID0gZmFsc2U7CisgICAgICBpZiAoSXNOZXcgfHwgKGFyZ190eXBlc1tpXSAmIE9NUF9UR1RfTUFQVFlQRV9BTFdBWVMpKSB7CisgICAgICAgIGNvcHkgPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChhcmdfdHlwZXNbaV0gJiBPTVBfVEdUX01BUFRZUEVfTUVNQkVSX09GKSB7CisgICAgICAgIC8vIENvcHkgZGF0YSBvbmx5IGlmIHRoZSAicGFyZW50IiBzdHJ1Y3QgaGFzIFJlZkNvdW50PT0xLgorICAgICAgICBzaG9ydCBwYXJlbnRfaWR4ID0gbWVtYmVyX29mKGFyZ190eXBlc1tpXSk7CisgICAgICAgIGxvbmcgcGFyZW50X3JjID0gRGV2aWNlLmdldE1hcEVudHJ5UmVmQ250KGFyZ3NbcGFyZW50X2lkeF0pOworICAgICAgICBhc3NlcnQocGFyZW50X3JjID4gMCAmJiAicGFyZW50IHN0cnVjdCBub3QgZm91bmQiKTsKKyAgICAgICAgaWYgKHBhcmVudF9yYyA9PSAxKSB7CisgICAgICAgICAgY29weSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGNvcHkpIHsKKyAgICAgICAgRFAoIk1vdmluZyAlIiBQUklkNjQgIiBieXRlcyAoaHN0OiIgRFB4TU9EICIpIC0+ICh0Z3Q6IiBEUHhNT0QgIilcbiIsCisgICAgICAgICAgICBhcmdfc2l6ZXNbaV0sIERQeFBUUihIc3RQdHJCZWdpbiksIERQeFBUUihUZ3RQdHJCZWdpbikpOworICAgICAgICBpbnQgcnQgPSBEZXZpY2UuZGF0YV9zdWJtaXQoVGd0UHRyQmVnaW4sIEhzdFB0ckJlZ2luLCBhcmdfc2l6ZXNbaV0pOworICAgICAgICBpZiAocnQgIT0gT0ZGTE9BRF9TVUNDRVNTKSB7CisgICAgICAgICAgRFAoIkNvcHlpbmcgZGF0YSB0byBkZXZpY2UgZmFpbGVkLlxuIik7CisgICAgICAgICAgcmMgPSBPRkZMT0FEX0ZBSUw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYXJnX3R5cGVzW2ldICYgT01QX1RHVF9NQVBUWVBFX1BUUl9BTkRfT0JKKSB7CisgICAgICBEUCgiVXBkYXRlIHBvaW50ZXIgKCIgRFB4TU9EICIpIC0+IFsiIERQeE1PRCAiXVxuIiwKKyAgICAgICAgICBEUHhQVFIoUG9pbnRlcl9UZ3RQdHJCZWdpbiksIERQeFBUUihUZ3RQdHJCZWdpbikpOworICAgICAgdWludDY0X3QgRGVsdGEgPSAodWludDY0X3QpSHN0UHRyQmVnaW4gLSAodWludDY0X3QpSHN0UHRyQmFzZTsKKyAgICAgIHZvaWQgKlRndFB0ckJhc2UgPSAodm9pZCAqKSgodWludDY0X3QpVGd0UHRyQmVnaW4gLSBEZWx0YSk7CisgICAgICBpbnQgcnQgPSBEZXZpY2UuZGF0YV9zdWJtaXQoUG9pbnRlcl9UZ3RQdHJCZWdpbiwgJlRndFB0ckJhc2UsCisgICAgICAgICAgc2l6ZW9mKHZvaWQgKikpOworICAgICAgaWYgKHJ0ICE9IE9GRkxPQURfU1VDQ0VTUykgeworICAgICAgICBEUCgiQ29weWluZyBkYXRhIHRvIGRldmljZSBmYWlsZWQuXG4iKTsKKyAgICAgICAgcmMgPSBPRkZMT0FEX0ZBSUw7CisgICAgICB9CisgICAgICAvLyBjcmVhdGUgc2hhZG93IHBvaW50ZXJzIGZvciB0aGlzIGVudHJ5CisgICAgICBEZXZpY2UuU2hhZG93TXR4LmxvY2soKTsKKyAgICAgIERldmljZS5TaGFkb3dQdHJNYXBbUG9pbnRlcl9Ic3RQdHJCZWdpbl0gPSB7SHN0UHRyQmFzZSwKKyAgICAgICAgICBQb2ludGVyX1RndFB0ckJlZ2luLCBUZ3RQdHJCYXNlfTsKKyAgICAgIERldmljZS5TaGFkb3dNdHgudW5sb2NrKCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJjOworfQorCitFWFRFUk4gdm9pZCBfX3RndF90YXJnZXRfZGF0YV9iZWdpbl9ub3dhaXQoaW50MzJfdCBkZXZpY2VfaWQsIGludDMyX3QgYXJnX251bSwKKyAgICB2b2lkICoqYXJnc19iYXNlLCB2b2lkICoqYXJncywgaW50NjRfdCAqYXJnX3NpemVzLCBpbnQzMl90ICphcmdfdHlwZXMsCisgICAgaW50MzJfdCBkZXBOdW0sIHZvaWQgKmRlcExpc3QsIGludDMyX3Qgbm9BbGlhc0RlcE51bSwKKyAgICB2b2lkICpub0FsaWFzRGVwTGlzdCkgeworICBpZiAoZGVwTnVtICsgbm9BbGlhc0RlcE51bSA+IDApCisgICAgX19rbXBjX29tcF90YXNrd2FpdChOVUxMLCAwKTsKKworICBfX3RndF90YXJnZXRfZGF0YV9iZWdpbihkZXZpY2VfaWQsIGFyZ19udW0sIGFyZ3NfYmFzZSwgYXJncywgYXJnX3NpemVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdfdHlwZXMpOworfQorCisvLy8gY3JlYXRlcyBob3N0LXRvLXRhcmdldCBkYXRhIG1hcHBpbmcsIHN0b3JlcyBpdCBpbiB0aGUKKy8vLyBsaWJvbXB0YXJnZXQuc28gaW50ZXJuYWwgc3RydWN0dXJlIChhbiBlbnRyeSBpbiBhIHN0YWNrIG9mIGRhdGEgbWFwcykKKy8vLyBhbmQgcGFzc2VzIHRoZSBkYXRhIHRvIHRoZSBkZXZpY2UuCitFWFRFUk4gdm9pZCBfX3RndF90YXJnZXRfZGF0YV9iZWdpbihpbnQzMl90IGRldmljZV9pZCwgaW50MzJfdCBhcmdfbnVtLAorICAgIHZvaWQgKiphcmdzX2Jhc2UsIHZvaWQgKiphcmdzLCBpbnQ2NF90ICphcmdfc2l6ZXMsIGludDMyX3QgKmFyZ190eXBlcykgeworICBEUCgiRW50ZXJpbmcgZGF0YSBiZWdpbiByZWdpb24gZm9yIGRldmljZSAlZCB3aXRoICVkIG1hcHBpbmdzXG4iLCBkZXZpY2VfaWQsCisgICAgIGFyZ19udW0pOworCisgIC8vIE5vIGRldmljZXMgYXZhaWxhYmxlPworICBpZiAoZGV2aWNlX2lkID09IE9GRkxPQURfREVWSUNFX0RFRkFVTFQpIHsKKyAgICBkZXZpY2VfaWQgPSBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlKCk7CisgICAgRFAoIlVzZSBkZWZhdWx0IGRldmljZSBpZCAlZFxuIiwgZGV2aWNlX2lkKTsKKyAgfQorCisgIGlmIChDaGVja0RldmljZShkZXZpY2VfaWQpICE9IE9GRkxPQURfU1VDQ0VTUykgeworICAgIERQKCJGYWlsZWQgdG8gZ2V0IGRldmljZSAlZCByZWFkeVxuIiwgZGV2aWNlX2lkKTsKKyAgICByZXR1cm47CisgIH0KKworICBEZXZpY2VUeSYgRGV2aWNlID0gRGV2aWNlc1tkZXZpY2VfaWRdOworCisgIC8vIFRyYW5zbGF0ZSBtYXBzCisgIGludDMyX3QgbmV3X2FyZ19udW07CisgIHZvaWQgKipuZXdfYXJnc19iYXNlOworICB2b2lkICoqbmV3X2FyZ3M7CisgIGludDY0X3QgKm5ld19hcmdfc2l6ZXM7CisgIGludDY0X3QgKm5ld19hcmdfdHlwZXM7CisgIHRyYW5zbGF0ZV9tYXAoYXJnX251bSwgYXJnc19iYXNlLCBhcmdzLCBhcmdfc2l6ZXMsIGFyZ190eXBlcywgbmV3X2FyZ19udW0sCisgICAgICBuZXdfYXJnc19iYXNlLCBuZXdfYXJncywgbmV3X2FyZ19zaXplcywgbmV3X2FyZ190eXBlcywgZmFsc2UpOworCisgIC8vdGFyZ2V0X2RhdGFfYmVnaW4oRGV2aWNlLCBhcmdfbnVtLCBhcmdzX2Jhc2UsIGFyZ3MsIGFyZ19zaXplcywgYXJnX3R5cGVzKTsKKyAgdGFyZ2V0X2RhdGFfYmVnaW4oRGV2aWNlLCBuZXdfYXJnX251bSwgbmV3X2FyZ3NfYmFzZSwgbmV3X2FyZ3MsIG5ld19hcmdfc2l6ZXMsCisgICAgICBuZXdfYXJnX3R5cGVzKTsKKworICAvLyBDbGVhbnVwIHRyYW5zbGF0aW9uIG1lbW9yeQorICBjbGVhbnVwX21hcChuZXdfYXJnX251bSwgbmV3X2FyZ3NfYmFzZSwgbmV3X2FyZ3MsIG5ld19hcmdfc2l6ZXMsCisgICAgICBuZXdfYXJnX3R5cGVzLCBhcmdfbnVtLCBhcmdzX2Jhc2UpOworfQorCisvLy8gSW50ZXJuYWwgZnVuY3Rpb24gdG8gdW5kbyB0aGUgbWFwcGluZyBhbmQgcmV0cmlldmUgdGhlIGRhdGEgZnJvbSB0aGUgZGV2aWNlLgorc3RhdGljIGludCB0YXJnZXRfZGF0YV9lbmQoRGV2aWNlVHkgJkRldmljZSwgaW50MzJfdCBhcmdfbnVtLCB2b2lkICoqYXJnc19iYXNlLAorICAgIHZvaWQgKiphcmdzLCBpbnQ2NF90ICphcmdfc2l6ZXMsIGludDY0X3QgKmFyZ190eXBlcykgeworICBpbnQgcmMgPSBPRkZMT0FEX1NVQ0NFU1M7CisgIC8vIHByb2Nlc3MgZWFjaCBpbnB1dC4KKyAgZm9yIChpbnQzMl90IGkgPSBhcmdfbnVtIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAvLyBJZ25vcmUgcHJpdmF0ZSB2YXJpYWJsZXMgYW5kIGFycmF5cyAtIHRoZXJlIGlzIG5vIG1hcHBpbmcgZm9yIHRoZW0uCisgICAgLy8gQWxzbywgaWdub3JlIHRoZSB1c2VfZGV2aWNlX3B0ciBkaXJlY3RpdmUsIGl0IGhhcyBubyBlZmZlY3QgaGVyZS4KKyAgICBpZiAoKGFyZ190eXBlc1tpXSAmIE9NUF9UR1RfTUFQVFlQRV9MSVRFUkFMKSB8fAorICAgICAgICAoYXJnX3R5cGVzW2ldICYgT01QX1RHVF9NQVBUWVBFX1BSSVZBVEUpKQorICAgICAgY29udGludWU7CisKKyAgICB2b2lkICpIc3RQdHJCZWdpbiA9IGFyZ3NbaV07CisgICAgYm9vbCBJc0xhc3Q7CisgICAgYm9vbCBVcGRhdGVSZWYgPSAhKGFyZ190eXBlc1tpXSAmIE9NUF9UR1RfTUFQVFlQRV9NRU1CRVJfT0YpIHx8CisgICAgICAgIChhcmdfdHlwZXNbaV0gJiBPTVBfVEdUX01BUFRZUEVfUFRSX0FORF9PQkopOworICAgIGJvb2wgRm9yY2VEZWxldGUgPSBhcmdfdHlwZXNbaV0gJiBPTVBfVEdUX01BUFRZUEVfREVMRVRFOworCisgICAgLy8gSWYgUFRSX0FORF9PQkosIEhzdFB0ckJlZ2luIGlzIGFkZHJlc3Mgb2YgcG9pbnRlZQorICAgIHZvaWQgKlRndFB0ckJlZ2luID0gRGV2aWNlLmdldFRndFB0ckJlZ2luKEhzdFB0ckJlZ2luLCBhcmdfc2l6ZXNbaV0sIElzTGFzdCwKKyAgICAgICAgVXBkYXRlUmVmKTsKKyAgICBEUCgiVGhlcmUgYXJlICUiIFBSSWQ2NCAiIGJ5dGVzIGFsbG9jYXRlZCBhdCB0YXJnZXQgYWRkcmVzcyAiIERQeE1PRAorICAgICAgICAiIC0gaXMlcyBsYXN0XG4iLCBhcmdfc2l6ZXNbaV0sIERQeFBUUihUZ3RQdHJCZWdpbiksCisgICAgICAgIChJc0xhc3QgPyAiIiA6ICIgbm90IikpOworCisgICAgYm9vbCBEZWxFbnRyeSA9IElzTGFzdCB8fCBGb3JjZURlbGV0ZTsKKworICAgIGlmICgoYXJnX3R5cGVzW2ldICYgT01QX1RHVF9NQVBUWVBFX01FTUJFUl9PRikgJiYKKyAgICAgICAgIShhcmdfdHlwZXNbaV0gJiBPTVBfVEdUX01BUFRZUEVfUFRSX0FORF9PQkopKSB7CisgICAgICBEZWxFbnRyeSA9IGZhbHNlOyAvLyBwcm90ZWN0IHBhcmVudCBzdHJ1Y3QgZnJvbSBiZWluZyBkZWFsbG9jYXRlZAorICAgIH0KKworICAgIGlmICgoYXJnX3R5cGVzW2ldICYgT01QX1RHVF9NQVBUWVBFX0ZST00pIHx8IERlbEVudHJ5KSB7CisgICAgICAvLyBNb3ZlIGRhdGEgYmFjayB0byB0aGUgaG9zdAorICAgICAgaWYgKGFyZ190eXBlc1tpXSAmIE9NUF9UR1RfTUFQVFlQRV9GUk9NKSB7CisgICAgICAgIGJvb2wgQWx3YXlzID0gYXJnX3R5cGVzW2ldICYgT01QX1RHVF9NQVBUWVBFX0FMV0FZUzsKKyAgICAgICAgYm9vbCBDb3B5TWVtYmVyID0gZmFsc2U7CisgICAgICAgIGlmICgoYXJnX3R5cGVzW2ldICYgT01QX1RHVF9NQVBUWVBFX01FTUJFUl9PRikgJiYKKyAgICAgICAgICAgICEoYXJnX3R5cGVzW2ldICYgT01QX1RHVF9NQVBUWVBFX1BUUl9BTkRfT0JKKSkgeworICAgICAgICAgIC8vIENvcHkgZGF0YSBvbmx5IGlmIHRoZSAicGFyZW50IiBzdHJ1Y3QgaGFzIFJlZkNvdW50PT0xLgorICAgICAgICAgIHNob3J0IHBhcmVudF9pZHggPSBtZW1iZXJfb2YoYXJnX3R5cGVzW2ldKTsKKyAgICAgICAgICBsb25nIHBhcmVudF9yYyA9IERldmljZS5nZXRNYXBFbnRyeVJlZkNudChhcmdzW3BhcmVudF9pZHhdKTsKKyAgICAgICAgICBhc3NlcnQocGFyZW50X3JjID4gMCAmJiAicGFyZW50IHN0cnVjdCBub3QgZm91bmQiKTsKKyAgICAgICAgICBpZiAocGFyZW50X3JjID09IDEpIHsKKyAgICAgICAgICAgIENvcHlNZW1iZXIgPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChEZWxFbnRyeSB8fCBBbHdheXMgfHwgQ29weU1lbWJlcikgeworICAgICAgICAgIERQKCJNb3ZpbmcgJSIgUFJJZDY0ICIgYnl0ZXMgKHRndDoiIERQeE1PRCAiKSAtPiAoaHN0OiIgRFB4TU9EICIpXG4iLAorICAgICAgICAgICAgICBhcmdfc2l6ZXNbaV0sIERQeFBUUihUZ3RQdHJCZWdpbiksIERQeFBUUihIc3RQdHJCZWdpbikpOworICAgICAgICAgIGludCBydCA9IERldmljZS5kYXRhX3JldHJpZXZlKEhzdFB0ckJlZ2luLCBUZ3RQdHJCZWdpbiwgYXJnX3NpemVzW2ldKTsKKyAgICAgICAgICBpZiAocnQgIT0gT0ZGTE9BRF9TVUNDRVNTKSB7CisgICAgICAgICAgICBEUCgiQ29weWluZyBkYXRhIGZyb20gZGV2aWNlIGZhaWxlZC5cbiIpOworICAgICAgICAgICAgcmMgPSBPRkZMT0FEX0ZBSUw7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIElmIHdlIGNvcGllZCBiYWNrIHRvIHRoZSBob3N0IGEgc3RydWN0L2FycmF5IGNvbnRhaW5pbmcgcG9pbnRlcnMsIHdlCisgICAgICAvLyBuZWVkIHRvIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGhvc3QgcG9pbnRlciB2YWx1ZXMgZnJvbSB0aGVpciBzaGFkb3cKKyAgICAgIC8vIGNvcGllcy4gSWYgdGhlIHN0cnVjdCBpcyBnb2luZyB0byBiZSBkZWFsbG9jYXRlZCwgcmVtb3ZlIGFueSByZW1haW5pbmcKKyAgICAgIC8vIHNoYWRvdyBwb2ludGVyIGVudHJpZXMgZm9yIHRoaXMgc3RydWN0LgorICAgICAgdWludHB0cl90IGxiID0gKHVpbnRwdHJfdCkgSHN0UHRyQmVnaW47CisgICAgICB1aW50cHRyX3QgdWIgPSAodWludHB0cl90KSBIc3RQdHJCZWdpbiArIGFyZ19zaXplc1tpXTsKKyAgICAgIERldmljZS5TaGFkb3dNdHgubG9jaygpOworICAgICAgZm9yIChTaGFkb3dQdHJMaXN0VHk6Oml0ZXJhdG9yIGl0ID0gRGV2aWNlLlNoYWRvd1B0ck1hcC5iZWdpbigpOworICAgICAgICAgIGl0ICE9IERldmljZS5TaGFkb3dQdHJNYXAuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgdm9pZCAqKlNoYWRvd0hzdFB0ckFkZHIgPSAodm9pZCoqKSBpdC0+Zmlyc3Q7CisKKyAgICAgICAgLy8gQW4gU1RMIG1hcCBpcyBzb3J0ZWQgb24gaXRzIGtleXM7IHVzZSB0aGlzIHByb3BlcnR5CisgICAgICAgIC8vIHRvIHF1aWNrbHkgZGV0ZXJtaW5lIHdoZW4gdG8gYnJlYWsgb3V0IG9mIHRoZSBsb29wLgorICAgICAgICBpZiAoKHVpbnRwdHJfdCkgU2hhZG93SHN0UHRyQWRkciA8IGxiKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoKHVpbnRwdHJfdCkgU2hhZG93SHN0UHRyQWRkciA+PSB1YikKKyAgICAgICAgICBicmVhazsKKworICAgICAgICAvLyBJZiB3ZSBjb3BpZWQgdGhlIHN0cnVjdCB0byB0aGUgaG9zdCwgd2UgbmVlZCB0byByZXN0b3JlIHRoZSBwb2ludGVyLgorICAgICAgICBpZiAoYXJnX3R5cGVzW2ldICYgT01QX1RHVF9NQVBUWVBFX0ZST00pIHsKKyAgICAgICAgICBEUCgiUmVzdG9yaW5nIG9yaWdpbmFsIGhvc3QgcG9pbnRlciB2YWx1ZSAiIERQeE1PRCAiIGZvciBob3N0ICIKKyAgICAgICAgICAgICAgInBvaW50ZXIgIiBEUHhNT0QgIlxuIiwgRFB4UFRSKGl0LT5zZWNvbmQuSHN0UHRyVmFsKSwKKyAgICAgICAgICAgICAgRFB4UFRSKFNoYWRvd0hzdFB0ckFkZHIpKTsKKyAgICAgICAgICAqU2hhZG93SHN0UHRyQWRkciA9IGl0LT5zZWNvbmQuSHN0UHRyVmFsOworICAgICAgICB9CisgICAgICAgIC8vIElmIHRoZSBzdHJ1Y3QgaXMgdG8gYmUgZGVhbGxvY2F0ZWQsIHJlbW92ZSB0aGUgc2hhZG93IGVudHJ5LgorICAgICAgICBpZiAoRGVsRW50cnkpIHsKKyAgICAgICAgICBEUCgiUmVtb3Zpbmcgc2hhZG93IHBvaW50ZXIgIiBEUHhNT0QgIlxuIiwgRFB4UFRSKFNoYWRvd0hzdFB0ckFkZHIpKTsKKyAgICAgICAgICBEZXZpY2UuU2hhZG93UHRyTWFwLmVyYXNlKGl0KTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgRGV2aWNlLlNoYWRvd010eC51bmxvY2soKTsKKworICAgICAgLy8gRGVhbGxvY2F0ZSBtYXAKKyAgICAgIGlmIChEZWxFbnRyeSkgeworICAgICAgICBpbnQgcnQgPSBEZXZpY2UuZGVhbGxvY1RndFB0cihIc3RQdHJCZWdpbiwgYXJnX3NpemVzW2ldLCBGb3JjZURlbGV0ZSk7CisgICAgICAgIGlmIChydCAhPSBPRkZMT0FEX1NVQ0NFU1MpIHsKKyAgICAgICAgICBEUCgiRGVhbGxvY2F0aW5nIGRhdGEgZnJvbSBkZXZpY2UgZmFpbGVkLlxuIik7CisgICAgICAgICAgcmMgPSBPRkZMT0FEX0ZBSUw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gcmM7Cit9CisKKy8vLyBwYXNzZXMgZGF0YSBmcm9tIHRoZSB0YXJnZXQsIHJlbGVhc2VzIHRhcmdldCBtZW1vcnkgYW5kIGRlc3Ryb3lzCisvLy8gdGhlIGhvc3QtdGFyZ2V0IG1hcHBpbmcgKHRvcCBlbnRyeSBmcm9tIHRoZSBzdGFjayBvZiBkYXRhIG1hcHMpCisvLy8gY3JlYXRlZCBieSB0aGUgbGFzdCBfX3RndF90YXJnZXRfZGF0YV9iZWdpbi4KK0VYVEVSTiB2b2lkIF9fdGd0X3RhcmdldF9kYXRhX2VuZChpbnQzMl90IGRldmljZV9pZCwgaW50MzJfdCBhcmdfbnVtLAorICAgIHZvaWQgKiphcmdzX2Jhc2UsIHZvaWQgKiphcmdzLCBpbnQ2NF90ICphcmdfc2l6ZXMsIGludDMyX3QgKmFyZ190eXBlcykgeworICBEUCgiRW50ZXJpbmcgZGF0YSBlbmQgcmVnaW9uIHdpdGggJWQgbWFwcGluZ3NcbiIsIGFyZ19udW0pOworCisgIC8vIE5vIGRldmljZXMgYXZhaWxhYmxlPworICBpZiAoZGV2aWNlX2lkID09IE9GRkxPQURfREVWSUNFX0RFRkFVTFQpIHsKKyAgICBkZXZpY2VfaWQgPSBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlKCk7CisgIH0KKworICBSVExzTXR4LmxvY2soKTsKKyAgc2l6ZV90IERldmljZXNfc2l6ZSA9IERldmljZXMuc2l6ZSgpOworICBSVExzTXR4LnVubG9jaygpOworICBpZiAoRGV2aWNlc19zaXplIDw9IChzaXplX3QpZGV2aWNlX2lkKSB7CisgICAgRFAoIkRldmljZSBJRCAgJWQgZG9lcyBub3QgaGF2ZSBhIG1hdGNoaW5nIFJUTC5cbiIsIGRldmljZV9pZCk7CisgICAgcmV0dXJuOworICB9CisKKyAgRGV2aWNlVHkgJkRldmljZSA9IERldmljZXNbZGV2aWNlX2lkXTsKKyAgaWYgKCFEZXZpY2UuSXNJbml0KSB7CisgICAgRFAoInVuaW5pdCBkZXZpY2U6IGlnbm9yZSIpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFRyYW5zbGF0ZSBtYXBzCisgIGludDMyX3QgbmV3X2FyZ19udW07CisgIHZvaWQgKipuZXdfYXJnc19iYXNlOworICB2b2lkICoqbmV3X2FyZ3M7CisgIGludDY0X3QgKm5ld19hcmdfc2l6ZXM7CisgIGludDY0X3QgKm5ld19hcmdfdHlwZXM7CisgIHRyYW5zbGF0ZV9tYXAoYXJnX251bSwgYXJnc19iYXNlLCBhcmdzLCBhcmdfc2l6ZXMsIGFyZ190eXBlcywgbmV3X2FyZ19udW0sCisgICAgICBuZXdfYXJnc19iYXNlLCBuZXdfYXJncywgbmV3X2FyZ19zaXplcywgbmV3X2FyZ190eXBlcywgZmFsc2UpOworCisgIC8vdGFyZ2V0X2RhdGFfZW5kKERldmljZSwgYXJnX251bSwgYXJnc19iYXNlLCBhcmdzLCBhcmdfc2l6ZXMsIGFyZ190eXBlcyk7CisgIHRhcmdldF9kYXRhX2VuZChEZXZpY2UsIG5ld19hcmdfbnVtLCBuZXdfYXJnc19iYXNlLCBuZXdfYXJncywgbmV3X2FyZ19zaXplcywKKyAgICAgIG5ld19hcmdfdHlwZXMpOworCisgIC8vIENsZWFudXAgdHJhbnNsYXRpb24gbWVtb3J5CisgIGNsZWFudXBfbWFwKG5ld19hcmdfbnVtLCBuZXdfYXJnc19iYXNlLCBuZXdfYXJncywgbmV3X2FyZ19zaXplcywKKyAgICAgIG5ld19hcmdfdHlwZXMsIGFyZ19udW0sIGFyZ3NfYmFzZSk7Cit9CisKK0VYVEVSTiB2b2lkIF9fdGd0X3RhcmdldF9kYXRhX2VuZF9ub3dhaXQoaW50MzJfdCBkZXZpY2VfaWQsIGludDMyX3QgYXJnX251bSwKKyAgICB2b2lkICoqYXJnc19iYXNlLCB2b2lkICoqYXJncywgaW50NjRfdCAqYXJnX3NpemVzLCBpbnQzMl90ICphcmdfdHlwZXMsCisgICAgaW50MzJfdCBkZXBOdW0sIHZvaWQgKmRlcExpc3QsIGludDMyX3Qgbm9BbGlhc0RlcE51bSwKKyAgICB2b2lkICpub0FsaWFzRGVwTGlzdCkgeworICBpZiAoZGVwTnVtICsgbm9BbGlhc0RlcE51bSA+IDApCisgICAgX19rbXBjX29tcF90YXNrd2FpdChOVUxMLCAwKTsKKworICBfX3RndF90YXJnZXRfZGF0YV9lbmQoZGV2aWNlX2lkLCBhcmdfbnVtLCBhcmdzX2Jhc2UsIGFyZ3MsIGFyZ19zaXplcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ190eXBlcyk7Cit9CisKKy8vLyBwYXNzZXMgZGF0YSB0by9mcm9tIHRoZSB0YXJnZXQuCitFWFRFUk4gdm9pZCBfX3RndF90YXJnZXRfZGF0YV91cGRhdGUoaW50MzJfdCBkZXZpY2VfaWQsIGludDMyX3QgYXJnX251bSwKKyAgICB2b2lkICoqYXJnc19iYXNlLCB2b2lkICoqYXJncywgaW50NjRfdCAqYXJnX3NpemVzLCBpbnQzMl90ICphcmdfdHlwZXMpIHsKKyAgRFAoIkVudGVyaW5nIGRhdGEgdXBkYXRlIHdpdGggJWQgbWFwcGluZ3NcbiIsIGFyZ19udW0pOworCisgIC8vIE5vIGRldmljZXMgYXZhaWxhYmxlPworICBpZiAoZGV2aWNlX2lkID09IE9GRkxPQURfREVWSUNFX0RFRkFVTFQpIHsKKyAgICBkZXZpY2VfaWQgPSBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlKCk7CisgIH0KKworICBpZiAoQ2hlY2tEZXZpY2UoZGV2aWNlX2lkKSAhPSBPRkZMT0FEX1NVQ0NFU1MpIHsKKyAgICBEUCgiRmFpbGVkIHRvIGdldCBkZXZpY2UgJWQgcmVhZHlcbiIsIGRldmljZV9pZCk7CisgICAgcmV0dXJuOworICB9CisKKyAgRGV2aWNlVHkmIERldmljZSA9IERldmljZXNbZGV2aWNlX2lkXTsKKworICAvLyBwcm9jZXNzIGVhY2ggaW5wdXQuCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGFyZ19udW07ICsraSkgeworICAgIGlmICgoYXJnX3R5cGVzW2ldICYgT01QX1RHVF9NQVBUWVBFX0xJVEVSQUwpIHx8CisgICAgICAgIChhcmdfdHlwZXNbaV0gJiBPTVBfVEdUX01BUFRZUEVfUFJJVkFURSkpCisgICAgICBjb250aW51ZTsKKworICAgIHZvaWQgKkhzdFB0ckJlZ2luID0gYXJnc1tpXTsKKyAgICBpbnQ2NF90IE1hcFNpemUgPSBhcmdfc2l6ZXNbaV07CisgICAgYm9vbCBJc0xhc3Q7CisgICAgdm9pZCAqVGd0UHRyQmVnaW4gPSBEZXZpY2UuZ2V0VGd0UHRyQmVnaW4oSHN0UHRyQmVnaW4sIE1hcFNpemUsIElzTGFzdCwKKyAgICAgICAgZmFsc2UpOworCisgICAgaWYgKGFyZ190eXBlc1tpXSAmIE9NUF9UR1RfTUFQVFlQRV9GUk9NKSB7CisgICAgICBEUCgiTW92aW5nICUiIFBSSWQ2NCAiIGJ5dGVzICh0Z3Q6IiBEUHhNT0QgIikgLT4gKGhzdDoiIERQeE1PRCAiKVxuIiwKKyAgICAgICAgICBhcmdfc2l6ZXNbaV0sIERQeFBUUihUZ3RQdHJCZWdpbiksIERQeFBUUihIc3RQdHJCZWdpbikpOworICAgICAgRGV2aWNlLmRhdGFfcmV0cmlldmUoSHN0UHRyQmVnaW4sIFRndFB0ckJlZ2luLCBNYXBTaXplKTsKKworICAgICAgdWludHB0cl90IGxiID0gKHVpbnRwdHJfdCkgSHN0UHRyQmVnaW47CisgICAgICB1aW50cHRyX3QgdWIgPSAodWludHB0cl90KSBIc3RQdHJCZWdpbiArIE1hcFNpemU7CisgICAgICBEZXZpY2UuU2hhZG93TXR4LmxvY2soKTsKKyAgICAgIGZvciAoU2hhZG93UHRyTGlzdFR5OjppdGVyYXRvciBpdCA9IERldmljZS5TaGFkb3dQdHJNYXAuYmVnaW4oKTsKKyAgICAgICAgICBpdCAhPSBEZXZpY2UuU2hhZG93UHRyTWFwLmVuZCgpOyArK2l0KSB7CisgICAgICAgIHZvaWQgKipTaGFkb3dIc3RQdHJBZGRyID0gKHZvaWQqKikgaXQtPmZpcnN0OworICAgICAgICBpZiAoKHVpbnRwdHJfdCkgU2hhZG93SHN0UHRyQWRkciA8IGxiKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoKHVpbnRwdHJfdCkgU2hhZG93SHN0UHRyQWRkciA+PSB1YikKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgRFAoIlJlc3RvcmluZyBvcmlnaW5hbCBob3N0IHBvaW50ZXIgdmFsdWUgIiBEUHhNT0QgIiBmb3IgaG9zdCBwb2ludGVyICIKKyAgICAgICAgICAgIERQeE1PRCAiXG4iLCBEUHhQVFIoaXQtPnNlY29uZC5Ic3RQdHJWYWwpLAorICAgICAgICAgICAgRFB4UFRSKFNoYWRvd0hzdFB0ckFkZHIpKTsKKyAgICAgICAgKlNoYWRvd0hzdFB0ckFkZHIgPSBpdC0+c2Vjb25kLkhzdFB0clZhbDsKKyAgICAgIH0KKyAgICAgIERldmljZS5TaGFkb3dNdHgudW5sb2NrKCk7CisgICAgfQorCisgICAgaWYgKGFyZ190eXBlc1tpXSAmIE9NUF9UR1RfTUFQVFlQRV9UTykgeworICAgICAgRFAoIk1vdmluZyAlIiBQUklkNjQgIiBieXRlcyAoaHN0OiIgRFB4TU9EICIpIC0+ICh0Z3Q6IiBEUHhNT0QgIilcbiIsCisgICAgICAgICAgYXJnX3NpemVzW2ldLCBEUHhQVFIoSHN0UHRyQmVnaW4pLCBEUHhQVFIoVGd0UHRyQmVnaW4pKTsKKyAgICAgIERldmljZS5kYXRhX3N1Ym1pdChUZ3RQdHJCZWdpbiwgSHN0UHRyQmVnaW4sIE1hcFNpemUpOworCisgICAgICB1aW50cHRyX3QgbGIgPSAodWludHB0cl90KSBIc3RQdHJCZWdpbjsKKyAgICAgIHVpbnRwdHJfdCB1YiA9ICh1aW50cHRyX3QpIEhzdFB0ckJlZ2luICsgTWFwU2l6ZTsKKyAgICAgIERldmljZS5TaGFkb3dNdHgubG9jaygpOworICAgICAgZm9yIChTaGFkb3dQdHJMaXN0VHk6Oml0ZXJhdG9yIGl0ID0gRGV2aWNlLlNoYWRvd1B0ck1hcC5iZWdpbigpOworICAgICAgICAgIGl0ICE9IERldmljZS5TaGFkb3dQdHJNYXAuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgdm9pZCAqKlNoYWRvd0hzdFB0ckFkZHIgPSAodm9pZCoqKSBpdC0+Zmlyc3Q7CisgICAgICAgIGlmICgodWludHB0cl90KSBTaGFkb3dIc3RQdHJBZGRyIDwgbGIpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICgodWludHB0cl90KSBTaGFkb3dIc3RQdHJBZGRyID49IHViKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBEUCgiUmVzdG9yaW5nIG9yaWdpbmFsIHRhcmdldCBwb2ludGVyIHZhbHVlICIgRFB4TU9EICIgZm9yIHRhcmdldCAiCisgICAgICAgICAgICAicG9pbnRlciAiIERQeE1PRCAiXG4iLCBEUHhQVFIoaXQtPnNlY29uZC5UZ3RQdHJWYWwpLAorICAgICAgICAgICAgRFB4UFRSKGl0LT5zZWNvbmQuVGd0UHRyQWRkcikpOworICAgICAgICBEZXZpY2UuZGF0YV9zdWJtaXQoaXQtPnNlY29uZC5UZ3RQdHJBZGRyLAorICAgICAgICAgICAgJml0LT5zZWNvbmQuVGd0UHRyVmFsLCBzaXplb2Yodm9pZCAqKSk7CisgICAgICB9CisgICAgICBEZXZpY2UuU2hhZG93TXR4LnVubG9jaygpOworICAgIH0KKyAgfQorfQorCitFWFRFUk4gdm9pZCBfX3RndF90YXJnZXRfZGF0YV91cGRhdGVfbm93YWl0KAorICAgIGludDMyX3QgZGV2aWNlX2lkLCBpbnQzMl90IGFyZ19udW0sIHZvaWQgKiphcmdzX2Jhc2UsIHZvaWQgKiphcmdzLAorICAgIGludDY0X3QgKmFyZ19zaXplcywgaW50MzJfdCAqYXJnX3R5cGVzLCBpbnQzMl90IGRlcE51bSwgdm9pZCAqZGVwTGlzdCwKKyAgICBpbnQzMl90IG5vQWxpYXNEZXBOdW0sIHZvaWQgKm5vQWxpYXNEZXBMaXN0KSB7CisgIGlmIChkZXBOdW0gKyBub0FsaWFzRGVwTnVtID4gMCkKKyAgICBfX2ttcGNfb21wX3Rhc2t3YWl0KE5VTEwsIDApOworCisgIF9fdGd0X3RhcmdldF9kYXRhX3VwZGF0ZShkZXZpY2VfaWQsIGFyZ19udW0sIGFyZ3NfYmFzZSwgYXJncywgYXJnX3NpemVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnX3R5cGVzKTsKK30KKworLy8vIHBlcmZvcm1zIHRoZSBzYW1lIGFjdGlvbnMgYXMgZGF0YV9iZWdpbiBpbiBjYXNlIGFyZ19udW0gaXMKKy8vLyBub24temVybyBhbmQgaW5pdGlhdGVzIHJ1biBvZiB0aGUgb2ZmbG9hZGVkIHJlZ2lvbiBvbiB0aGUgdGFyZ2V0IHBsYXRmb3JtOworLy8vIGlmIGFyZ19udW0gaXMgbm9uLXplcm8gYWZ0ZXIgdGhlIHJlZ2lvbiBleGVjdXRpb24gaXMgZG9uZSBpdCBhbHNvCisvLy8gcGVyZm9ybXMgdGhlIHNhbWUgYWN0aW9uIGFzIGRhdGFfdXBkYXRlIGFuZCBkYXRhX2VuZCBhYm92ZS4gVGhpcyBmdW5jdGlvbgorLy8vIHJldHVybnMgMCBpZiBpdCB3YXMgYWJsZSB0byB0cmFuc2ZlciB0aGUgZXhlY3V0aW9uIHRvIGEgdGFyZ2V0IGFuZCBhbgorLy8vIGludGVnZXIgZGlmZmVyZW50IGZyb20gemVybyBvdGhlcndpc2UuCitzdGF0aWMgaW50IHRhcmdldChpbnQzMl90IGRldmljZV9pZCwgdm9pZCAqaG9zdF9wdHIsIGludDMyX3QgYXJnX251bSwKKyAgICB2b2lkICoqYXJnc19iYXNlLCB2b2lkICoqYXJncywgaW50NjRfdCAqYXJnX3NpemVzLCBpbnQ2NF90ICphcmdfdHlwZXMsCisgICAgaW50MzJfdCB0ZWFtX251bSwgaW50MzJfdCB0aHJlYWRfbGltaXQsIGludCBJc1RlYW1Db25zdHJ1Y3QpIHsKKyAgRGV2aWNlVHkgJkRldmljZSA9IERldmljZXNbZGV2aWNlX2lkXTsKKworICAvLyBGaW5kIHRoZSB0YWJsZSBpbmZvcm1hdGlvbiBpbiB0aGUgbWFwIG9yIGxvb2sgaXQgdXAgaW4gdGhlIHRyYW5zbGF0aW9uCisgIC8vIHRhYmxlcy4KKyAgVGFibGVNYXAgKlRNID0gMDsKKyAgVGJsTWFwTXR4LmxvY2soKTsKKyAgSG9zdFB0clRvVGFibGVNYXBUeTo6aXRlcmF0b3IgVGFibGVNYXBJdCA9IEhvc3RQdHJUb1RhYmxlTWFwLmZpbmQoaG9zdF9wdHIpOworICBpZiAoVGFibGVNYXBJdCA9PSBIb3N0UHRyVG9UYWJsZU1hcC5lbmQoKSkgeworICAgIC8vIFdlIGRvbid0IGhhdmUgYSBtYXAuIFNvIHNlYXJjaCBhbGwgdGhlIHJlZ2lzdGVyZWQgbGlicmFyaWVzLgorICAgIFRybFRibE10eC5sb2NrKCk7CisgICAgZm9yIChIb3N0RW50cmllc0JlZ2luVG9UcmFuc1RhYmxlVHk6Oml0ZXJhdG9yCisgICAgICAgICAgICAgaWkgPSBIb3N0RW50cmllc0JlZ2luVG9UcmFuc1RhYmxlLmJlZ2luKCksCisgICAgICAgICAgICAgaWUgPSBIb3N0RW50cmllc0JlZ2luVG9UcmFuc1RhYmxlLmVuZCgpOworICAgICAgICAgIVRNICYmIGlpICE9IGllOyArK2lpKSB7CisgICAgICAvLyBnZXQgdGhlIHRyYW5zbGF0aW9uIHRhYmxlICh3aGljaCBjb250YWlucyBhbGwgdGhlIGdvb2QgaW5mbykuCisgICAgICBUcmFuc2xhdGlvblRhYmxlICpUcmFuc1RhYmxlID0gJmlpLT5zZWNvbmQ7CisgICAgICAvLyBpdGVyYXRlIG92ZXIgYWxsIHRoZSBob3N0IHRhYmxlIGVudHJpZXMgdG8gc2VlIGlmIHdlIGNhbiBsb2NhdGUgdGhlCisgICAgICAvLyBob3N0X3B0ci4KKyAgICAgIF9fdGd0X29mZmxvYWRfZW50cnkgKmJlZ2luID0gVHJhbnNUYWJsZS0+SG9zdFRhYmxlLkVudHJpZXNCZWdpbjsKKyAgICAgIF9fdGd0X29mZmxvYWRfZW50cnkgKmVuZCA9IFRyYW5zVGFibGUtPkhvc3RUYWJsZS5FbnRyaWVzRW5kOworICAgICAgX190Z3Rfb2ZmbG9hZF9lbnRyeSAqY3VyID0gYmVnaW47CisgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBjdXIgPCBlbmQ7ICsrY3VyLCArK2kpIHsKKyAgICAgICAgaWYgKGN1ci0+YWRkciAhPSBob3N0X3B0cikKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgLy8gd2UgZ290IGEgbWF0Y2gsIG5vdyBmaWxsIHRoZSBIb3N0UHRyVG9UYWJsZU1hcCBzbyB0aGF0IHdlCisgICAgICAgIC8vIG1heSBhdm9pZCB0aGlzIHNlYXJjaCBuZXh0IHRpbWUuCisgICAgICAgIFRNID0gJkhvc3RQdHJUb1RhYmxlTWFwW2hvc3RfcHRyXTsKKyAgICAgICAgVE0tPlRhYmxlID0gVHJhbnNUYWJsZTsKKyAgICAgICAgVE0tPkluZGV4ID0gaTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIFRybFRibE10eC51bmxvY2soKTsKKyAgfSBlbHNlIHsKKyAgICBUTSA9ICZUYWJsZU1hcEl0LT5zZWNvbmQ7CisgIH0KKyAgVGJsTWFwTXR4LnVubG9jaygpOworCisgIC8vIE5vIG1hcCBmb3IgdGhpcyBob3N0IHBvaW50ZXIgZm91bmQhCisgIGlmICghVE0pIHsKKyAgICBEUCgiSG9zdCBwdHIgIiBEUHhNT0QgIiBkb2VzIG5vdCBoYXZlIGEgbWF0Y2hpbmcgdGFyZ2V0IHBvaW50ZXIuXG4iLAorICAgICAgIERQeFBUUihob3N0X3B0cikpOworICAgIHJldHVybiBPRkZMT0FEX0ZBSUw7CisgIH0KKworICAvLyBnZXQgdGFyZ2V0IHRhYmxlLgorICBUcmxUYmxNdHgubG9jaygpOworICBhc3NlcnQoVE0tPlRhYmxlLT5UYXJnZXRzVGFibGUuc2l6ZSgpID4gKHNpemVfdClkZXZpY2VfaWQgJiYKKyAgICAgICAgICJOb3QgZXhwZWN0aW5nIGEgZGV2aWNlIElEIG91dHNpZGUgdGhlIHRhYmxlJ3MgYm91bmRzISIpOworICBfX3RndF90YXJnZXRfdGFibGUgKlRhcmdldFRhYmxlID0gVE0tPlRhYmxlLT5UYXJnZXRzVGFibGVbZGV2aWNlX2lkXTsKKyAgVHJsVGJsTXR4LnVubG9jaygpOworICBhc3NlcnQoVGFyZ2V0VGFibGUgJiYgIkdsb2JhbCBkYXRhIGhhcyBub3QgYmVlbiBtYXBwZWRcbiIpOworCisgIC8vIE1vdmUgZGF0YSB0byBkZXZpY2UuCisgIGludCByYyA9IHRhcmdldF9kYXRhX2JlZ2luKERldmljZSwgYXJnX251bSwgYXJnc19iYXNlLCBhcmdzLCBhcmdfc2l6ZXMsCisgICAgICBhcmdfdHlwZXMpOworCisgIGlmIChyYyAhPSBPRkZMT0FEX1NVQ0NFU1MpIHsKKyAgICBEUCgiQ2FsbCB0byB0YXJnZXRfZGF0YV9iZWdpbiBmYWlsZWQsIHNraXBwaW5nIHRhcmdldCBleGVjdXRpb24uXG4iKTsKKyAgICAvLyBDYWxsIHRhcmdldF9kYXRhX2VuZCB0byBkZWFsbG9jIHdoYXRldmVyIHRhcmdldF9kYXRhX2JlZ2luIGFsbG9jYXRlZAorICAgIC8vIGFuZCByZXR1cm4gT0ZGTE9BRF9GQUlMLgorICAgIHRhcmdldF9kYXRhX2VuZChEZXZpY2UsIGFyZ19udW0sIGFyZ3NfYmFzZSwgYXJncywgYXJnX3NpemVzLCBhcmdfdHlwZXMpOworICAgIHJldHVybiBPRkZMT0FEX0ZBSUw7CisgIH0KKworICBzdGQ6OnZlY3Rvcjx2b2lkICo+IHRndF9hcmdzOworICBzdGQ6OnZlY3RvcjxwdHJkaWZmX3Q+IHRndF9vZmZzZXRzOworCisgIC8vIExpc3Qgb2YgKGZpcnN0LSlwcml2YXRlIGFycmF5cyBhbGxvY2F0ZWQgZm9yIHRoaXMgdGFyZ2V0IHJlZ2lvbgorICBzdGQ6OnZlY3Rvcjx2b2lkICo+IGZwQXJyYXlzOworCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGFyZ19udW07ICsraSkgeworICAgIGlmICghKGFyZ190eXBlc1tpXSAmIE9NUF9UR1RfTUFQVFlQRV9UQVJHRVRfUEFSQU0pKSB7CisgICAgICAvLyBUaGlzIGlzIG5vdCBhIHRhcmdldCBwYXJhbWV0ZXIsIGRvIG5vdCBwdXNoIGl0IGludG8gdGd0X2FyZ3MuCisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgdm9pZCAqSHN0UHRyQmVnaW4gPSBhcmdzW2ldOworICAgIHZvaWQgKkhzdFB0ckJhc2UgPSBhcmdzX2Jhc2VbaV07CisgICAgdm9pZCAqVGd0UHRyQmVnaW47CisgICAgcHRyZGlmZl90IFRndEJhc2VPZmZzZXQ7CisgICAgYm9vbCBJc0xhc3Q7IC8vIHVudXNlZC4KKyAgICBpZiAoYXJnX3R5cGVzW2ldICYgT01QX1RHVF9NQVBUWVBFX0xJVEVSQUwpIHsKKyAgICAgIERQKCJGb3J3YXJkaW5nIGZpcnN0LXByaXZhdGUgdmFsdWUgIiBEUHhNT0QgIiB0byB0aGUgdGFyZ2V0IGNvbnN0cnVjdFxuIiwKKyAgICAgICAgICBEUHhQVFIoSHN0UHRyQmFzZSkpOworICAgICAgVGd0UHRyQmVnaW4gPSBIc3RQdHJCYXNlOworICAgICAgVGd0QmFzZU9mZnNldCA9IDA7CisgICAgfSBlbHNlIGlmIChhcmdfdHlwZXNbaV0gJiBPTVBfVEdUX01BUFRZUEVfUFJJVkFURSkgeworICAgICAgLy8gQWxsb2NhdGUgbWVtb3J5IGZvciAoZmlyc3QtKXByaXZhdGUgYXJyYXkKKyAgICAgIFRndFB0ckJlZ2luID0gRGV2aWNlLlJUTC0+ZGF0YV9hbGxvYyhEZXZpY2UuUlRMRGV2aWNlSUQsCisgICAgICAgICAgYXJnX3NpemVzW2ldLCBIc3RQdHJCZWdpbik7CisgICAgICBpZiAoIVRndFB0ckJlZ2luKSB7CisgICAgICAgIERQICgiRGF0YSBhbGxvY2F0aW9uIGZvciAlc3ByaXZhdGUgYXJyYXkgIiBEUHhNT0QgIiBmYWlsZWRcbiIsCisgICAgICAgICAgICAoYXJnX3R5cGVzW2ldICYgT01QX1RHVF9NQVBUWVBFX1RPID8gImZpcnN0LSIgOiAiIiksCisgICAgICAgICAgICBEUHhQVFIoSHN0UHRyQmVnaW4pKTsKKyAgICAgICAgcmMgPSBPRkZMT0FEX0ZBSUw7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZnBBcnJheXMucHVzaF9iYWNrKFRndFB0ckJlZ2luKTsKKyAgICAgICAgVGd0QmFzZU9mZnNldCA9IChpbnRwdHJfdClIc3RQdHJCYXNlIC0gKGludHB0cl90KUhzdFB0ckJlZ2luOworI2lmZGVmIE9NUFRBUkdFVF9ERUJVRworICAgICAgICB2b2lkICpUZ3RQdHJCYXNlID0gKHZvaWQgKikoKGludHB0cl90KVRndFB0ckJlZ2luICsgVGd0QmFzZU9mZnNldCk7CisgICAgICAgIERQKCJBbGxvY2F0ZWQgJSIgUFJJZDY0ICIgYnl0ZXMgb2YgdGFyZ2V0IG1lbW9yeSBhdCAiIERQeE1PRCAiIGZvciAiCisgICAgICAgICAgICAiJXNwcml2YXRlIGFycmF5ICIgRFB4TU9EICIgLSBwdXNoaW5nIHRhcmdldCBhcmd1bWVudCAiIERQeE1PRCAiXG4iLAorICAgICAgICAgICAgYXJnX3NpemVzW2ldLCBEUHhQVFIoVGd0UHRyQmVnaW4pLAorICAgICAgICAgICAgKGFyZ190eXBlc1tpXSAmIE9NUF9UR1RfTUFQVFlQRV9UTyA/ICJmaXJzdC0iIDogIiIpLAorICAgICAgICAgICAgRFB4UFRSKEhzdFB0ckJlZ2luKSwgRFB4UFRSKFRndFB0ckJhc2UpKTsKKyNlbmRpZgorICAgICAgICAvLyBJZiBmaXJzdC1wcml2YXRlLCBjb3B5IGRhdGEgZnJvbSBob3N0CisgICAgICAgIGlmIChhcmdfdHlwZXNbaV0gJiBPTVBfVEdUX01BUFRZUEVfVE8pIHsKKyAgICAgICAgICBpbnQgcnQgPSBEZXZpY2UuZGF0YV9zdWJtaXQoVGd0UHRyQmVnaW4sIEhzdFB0ckJlZ2luLCBhcmdfc2l6ZXNbaV0pOworICAgICAgICAgIGlmIChydCAhPSBPRkZMT0FEX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIERQICgiQ29weWluZyBkYXRhIHRvIGRldmljZSBmYWlsZWQuXG4iKTsKKyAgICAgICAgICAgIHJjID0gT0ZGTE9BRF9GQUlMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChhcmdfdHlwZXNbaV0gJiBPTVBfVEdUX01BUFRZUEVfUFRSX0FORF9PQkopIHsKKyAgICAgIFRndFB0ckJlZ2luID0gRGV2aWNlLmdldFRndFB0ckJlZ2luKEhzdFB0ckJhc2UsIHNpemVvZih2b2lkICopLCBJc0xhc3QsCisgICAgICAgICAgZmFsc2UpOworICAgICAgVGd0QmFzZU9mZnNldCA9IDA7IC8vIG5vIG9mZnNldCBmb3IgcHRycy4KKyAgICAgIERQKCJPYnRhaW5lZCB0YXJnZXQgYXJndW1lbnQgIiBEUHhNT0QgIiBmcm9tIGhvc3QgcG9pbnRlciAiIERQeE1PRCAiIHRvICIKKyAgICAgICAgICJvYmplY3QgIiBEUHhNT0QgIlxuIiwgRFB4UFRSKFRndFB0ckJlZ2luKSwgRFB4UFRSKEhzdFB0ckJhc2UpLAorICAgICAgICAgRFB4UFRSKEhzdFB0ckJhc2UpKTsKKyAgICB9IGVsc2UgeworICAgICAgVGd0UHRyQmVnaW4gPSBEZXZpY2UuZ2V0VGd0UHRyQmVnaW4oSHN0UHRyQmVnaW4sIGFyZ19zaXplc1tpXSwgSXNMYXN0LAorICAgICAgICAgIGZhbHNlKTsKKyAgICAgIFRndEJhc2VPZmZzZXQgPSAoaW50cHRyX3QpSHN0UHRyQmFzZSAtIChpbnRwdHJfdClIc3RQdHJCZWdpbjsKKyNpZmRlZiBPTVBUQVJHRVRfREVCVUcKKyAgICAgIHZvaWQgKlRndFB0ckJhc2UgPSAodm9pZCAqKSgoaW50cHRyX3QpVGd0UHRyQmVnaW4gKyBUZ3RCYXNlT2Zmc2V0KTsKKyAgICAgIERQKCJPYnRhaW5lZCB0YXJnZXQgYXJndW1lbnQgIiBEUHhNT0QgIiBmcm9tIGhvc3QgcG9pbnRlciAiIERQeE1PRCAiXG4iLAorICAgICAgICAgIERQeFBUUihUZ3RQdHJCYXNlKSwgRFB4UFRSKEhzdFB0ckJlZ2luKSk7CisjZW5kaWYKKyAgICB9CisgICAgdGd0X2FyZ3MucHVzaF9iYWNrKFRndFB0ckJlZ2luKTsKKyAgICB0Z3Rfb2Zmc2V0cy5wdXNoX2JhY2soVGd0QmFzZU9mZnNldCk7CisgIH0KKyAgLy8gUHVzaCBvbXAgaGFuZGxlLgorICB0Z3RfYXJncy5wdXNoX2JhY2soKHZvaWQgKikwKTsKKyAgdGd0X29mZnNldHMucHVzaF9iYWNrKDApOworCisgIGFzc2VydCh0Z3RfYXJncy5zaXplKCkgPT0gdGd0X29mZnNldHMuc2l6ZSgpICYmCisgICAgICAiU2l6ZSBtaXNtYXRjaCBpbiBhcmd1bWVudHMgYW5kIG9mZnNldHMiKTsKKworICAvLyBQb3AgbG9vcCB0cmlwIGNvdW50CisgIHVpbnQ2NF90IGx0YyA9IERldmljZS5sb29wVHJpcENudDsKKyAgRGV2aWNlLmxvb3BUcmlwQ250ID0gMDsKKworICAvLyBMYXVuY2ggZGV2aWNlIGV4ZWN1dGlvbi4KKyAgaWYgKHJjID09IE9GRkxPQURfU1VDQ0VTUykgeworICAgIERQKCJMYXVuY2hpbmcgdGFyZ2V0IGV4ZWN1dGlvbiAlcyB3aXRoIHBvaW50ZXIgIiBEUHhNT0QgIiAoaW5kZXg9JWQpLlxuIiwKKyAgICAgICAgVGFyZ2V0VGFibGUtPkVudHJpZXNCZWdpbltUTS0+SW5kZXhdLm5hbWUsCisgICAgICAgIERQeFBUUihUYXJnZXRUYWJsZS0+RW50cmllc0JlZ2luW1RNLT5JbmRleF0uYWRkciksIFRNLT5JbmRleCk7CisgICAgaWYgKElzVGVhbUNvbnN0cnVjdCkgeworICAgICAgcmMgPSBEZXZpY2UucnVuX3RlYW1fcmVnaW9uKFRhcmdldFRhYmxlLT5FbnRyaWVzQmVnaW5bVE0tPkluZGV4XS5hZGRyLAorICAgICAgICAgICZ0Z3RfYXJnc1swXSwgJnRndF9vZmZzZXRzWzBdLCB0Z3RfYXJncy5zaXplKCksIHRlYW1fbnVtLAorICAgICAgICAgIHRocmVhZF9saW1pdCwgbHRjKTsKKyAgICB9IGVsc2UgeworICAgICAgcmMgPSBEZXZpY2UucnVuX3JlZ2lvbihUYXJnZXRUYWJsZS0+RW50cmllc0JlZ2luW1RNLT5JbmRleF0uYWRkciwKKyAgICAgICAgICAmdGd0X2FyZ3NbMF0sICZ0Z3Rfb2Zmc2V0c1swXSwgdGd0X2FyZ3Muc2l6ZSgpKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgRFAoIkVycm9ycyBvY2N1cnJlZCB3aGlsZSBvYnRhaW5pbmcgdGFyZ2V0IGFyZ3VtZW50cywgc2tpcHBpbmcga2VybmVsICIKKyAgICAgICAgImV4ZWN1dGlvblxuIik7CisgIH0KKworICAvLyBEZWFsbG9jYXRlIChmaXJzdC0pcHJpdmF0ZSBhcnJheXMKKyAgZm9yIChhdXRvIGl0IDogZnBBcnJheXMpIHsKKyAgICBpbnQgcnQgPSBEZXZpY2UuUlRMLT5kYXRhX2RlbGV0ZShEZXZpY2UuUlRMRGV2aWNlSUQsIGl0KTsKKyAgICBpZiAocnQgIT0gT0ZGTE9BRF9TVUNDRVNTKSB7CisgICAgICBEUCgiRGVhbGxvY2F0aW9uIG9mIChmaXJzdC0pcHJpdmF0ZSBhcnJheXMgZmFpbGVkLlxuIik7CisgICAgICByYyA9IE9GRkxPQURfRkFJTDsKKyAgICB9CisgIH0KKworICAvLyBNb3ZlIGRhdGEgZnJvbSBkZXZpY2UuCisgIGludCBydCA9IHRhcmdldF9kYXRhX2VuZChEZXZpY2UsIGFyZ19udW0sIGFyZ3NfYmFzZSwgYXJncywgYXJnX3NpemVzLAorICAgICAgYXJnX3R5cGVzKTsKKworICBpZiAocnQgIT0gT0ZGTE9BRF9TVUNDRVNTKSB7CisgICAgRFAoIkNhbGwgdG8gdGFyZ2V0X2RhdGFfZW5kIGZhaWxlZC5cbiIpOworICAgIHJjID0gT0ZGTE9BRF9GQUlMOworICB9CisKKyAgcmV0dXJuIHJjOworfQorCitFWFRFUk4gaW50IF9fdGd0X3RhcmdldChpbnQzMl90IGRldmljZV9pZCwgdm9pZCAqaG9zdF9wdHIsIGludDMyX3QgYXJnX251bSwKKyAgICB2b2lkICoqYXJnc19iYXNlLCB2b2lkICoqYXJncywgaW50NjRfdCAqYXJnX3NpemVzLCBpbnQzMl90ICphcmdfdHlwZXMpIHsKKyAgRFAoIkVudGVyaW5nIHRhcmdldCByZWdpb24gd2l0aCBlbnRyeSBwb2ludCAiIERQeE1PRCAiIGFuZCBkZXZpY2UgSWQgJWRcbiIsCisgICAgIERQeFBUUihob3N0X3B0ciksIGRldmljZV9pZCk7CisKKyAgaWYgKGRldmljZV9pZCA9PSBPRkZMT0FEX0RFVklDRV9ERUZBVUxUKSB7CisgICAgZGV2aWNlX2lkID0gb21wX2dldF9kZWZhdWx0X2RldmljZSgpOworICB9CisKKyAgaWYgKENoZWNrRGV2aWNlKGRldmljZV9pZCkgIT0gT0ZGTE9BRF9TVUNDRVNTKSB7CisgICAgRFAoIkZhaWxlZCB0byBnZXQgZGV2aWNlICVkIHJlYWR5XG4iLCBkZXZpY2VfaWQpOworICAgIHJldHVybiBPRkZMT0FEX0ZBSUw7CisgIH0KKworICAvLyBUcmFuc2xhdGUgbWFwcworICBpbnQzMl90IG5ld19hcmdfbnVtOworICB2b2lkICoqbmV3X2FyZ3NfYmFzZTsKKyAgdm9pZCAqKm5ld19hcmdzOworICBpbnQ2NF90ICpuZXdfYXJnX3NpemVzOworICBpbnQ2NF90ICpuZXdfYXJnX3R5cGVzOworICB0cmFuc2xhdGVfbWFwKGFyZ19udW0sIGFyZ3NfYmFzZSwgYXJncywgYXJnX3NpemVzLCBhcmdfdHlwZXMsIG5ld19hcmdfbnVtLAorICAgICAgbmV3X2FyZ3NfYmFzZSwgbmV3X2FyZ3MsIG5ld19hcmdfc2l6ZXMsIG5ld19hcmdfdHlwZXMsIHRydWUpOworCisgIC8vcmV0dXJuIHRhcmdldChkZXZpY2VfaWQsIGhvc3RfcHRyLCBhcmdfbnVtLCBhcmdzX2Jhc2UsIGFyZ3MsIGFyZ19zaXplcywKKyAgLy8gICAgYXJnX3R5cGVzLCAwLCAwLCBmYWxzZSAvKnRlYW0qLywgZmFsc2UgLypyZWN1cnNpdmUqLyk7CisgIGludCByYyA9IHRhcmdldChkZXZpY2VfaWQsIGhvc3RfcHRyLCBuZXdfYXJnX251bSwgbmV3X2FyZ3NfYmFzZSwgbmV3X2FyZ3MsCisgICAgICBuZXdfYXJnX3NpemVzLCBuZXdfYXJnX3R5cGVzLCAwLCAwLCBmYWxzZSAvKnRlYW0qLyk7CisKKyAgLy8gQ2xlYW51cCB0cmFuc2xhdGlvbiBtZW1vcnkKKyAgY2xlYW51cF9tYXAobmV3X2FyZ19udW0sIG5ld19hcmdzX2Jhc2UsIG5ld19hcmdzLCBuZXdfYXJnX3NpemVzLAorICAgICAgbmV3X2FyZ190eXBlcywgYXJnX251bSwgYXJnc19iYXNlKTsKKworICByZXR1cm4gcmM7Cit9CisKK0VYVEVSTiBpbnQgX190Z3RfdGFyZ2V0X25vd2FpdChpbnQzMl90IGRldmljZV9pZCwgdm9pZCAqaG9zdF9wdHIsCisgICAgaW50MzJfdCBhcmdfbnVtLCB2b2lkICoqYXJnc19iYXNlLCB2b2lkICoqYXJncywgaW50NjRfdCAqYXJnX3NpemVzLAorICAgIGludDMyX3QgKmFyZ190eXBlcywgaW50MzJfdCBkZXBOdW0sIHZvaWQgKmRlcExpc3QsIGludDMyX3Qgbm9BbGlhc0RlcE51bSwKKyAgICB2b2lkICpub0FsaWFzRGVwTGlzdCkgeworICBpZiAoZGVwTnVtICsgbm9BbGlhc0RlcE51bSA+IDApCisgICAgX19rbXBjX29tcF90YXNrd2FpdChOVUxMLCAwKTsKKworICByZXR1cm4gX190Z3RfdGFyZ2V0KGRldmljZV9pZCwgaG9zdF9wdHIsIGFyZ19udW0sIGFyZ3NfYmFzZSwgYXJncywgYXJnX3NpemVzLAorICAgICAgICAgICAgICAgICAgICAgIGFyZ190eXBlcyk7Cit9CisKK0VYVEVSTiBpbnQgX190Z3RfdGFyZ2V0X3RlYW1zKGludDMyX3QgZGV2aWNlX2lkLCB2b2lkICpob3N0X3B0ciwKKyAgICBpbnQzMl90IGFyZ19udW0sIHZvaWQgKiphcmdzX2Jhc2UsIHZvaWQgKiphcmdzLCBpbnQ2NF90ICphcmdfc2l6ZXMsCisgICAgaW50MzJfdCAqYXJnX3R5cGVzLCBpbnQzMl90IHRlYW1fbnVtLCBpbnQzMl90IHRocmVhZF9saW1pdCkgeworICBEUCgiRW50ZXJpbmcgdGFyZ2V0IHJlZ2lvbiB3aXRoIGVudHJ5IHBvaW50ICIgRFB4TU9EICIgYW5kIGRldmljZSBJZCAlZFxuIiwKKyAgICAgRFB4UFRSKGhvc3RfcHRyKSwgZGV2aWNlX2lkKTsKKworICBpZiAoZGV2aWNlX2lkID09IE9GRkxPQURfREVWSUNFX0RFRkFVTFQpIHsKKyAgICBkZXZpY2VfaWQgPSBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlKCk7CisgIH0KKworICBpZiAoQ2hlY2tEZXZpY2UoZGV2aWNlX2lkKSAhPSBPRkZMT0FEX1NVQ0NFU1MpIHsKKyAgICBEUCgiRmFpbGVkIHRvIGdldCBkZXZpY2UgJWQgcmVhZHlcbiIsIGRldmljZV9pZCk7CisgICAgcmV0dXJuIE9GRkxPQURfRkFJTDsKKyAgfQorCisgIC8vIFRyYW5zbGF0ZSBtYXBzCisgIGludDMyX3QgbmV3X2FyZ19udW07CisgIHZvaWQgKipuZXdfYXJnc19iYXNlOworICB2b2lkICoqbmV3X2FyZ3M7CisgIGludDY0X3QgKm5ld19hcmdfc2l6ZXM7CisgIGludDY0X3QgKm5ld19hcmdfdHlwZXM7CisgIHRyYW5zbGF0ZV9tYXAoYXJnX251bSwgYXJnc19iYXNlLCBhcmdzLCBhcmdfc2l6ZXMsIGFyZ190eXBlcywgbmV3X2FyZ19udW0sCisgICAgICBuZXdfYXJnc19iYXNlLCBuZXdfYXJncywgbmV3X2FyZ19zaXplcywgbmV3X2FyZ190eXBlcywgdHJ1ZSk7CisKKyAgLy9yZXR1cm4gdGFyZ2V0KGRldmljZV9pZCwgaG9zdF9wdHIsIGFyZ19udW0sIGFyZ3NfYmFzZSwgYXJncywgYXJnX3NpemVzLAorICAvLyAgICAgICAgICAgICAgYXJnX3R5cGVzLCB0ZWFtX251bSwgdGhyZWFkX2xpbWl0LCB0cnVlIC8qdGVhbSovLAorICAvLyAgICAgICAgICAgICAgZmFsc2UgLypyZWN1cnNpdmUqLyk7CisgIGludCByYyA9IHRhcmdldChkZXZpY2VfaWQsIGhvc3RfcHRyLCBuZXdfYXJnX251bSwgbmV3X2FyZ3NfYmFzZSwgbmV3X2FyZ3MsCisgICAgICBuZXdfYXJnX3NpemVzLCBuZXdfYXJnX3R5cGVzLCB0ZWFtX251bSwgdGhyZWFkX2xpbWl0LCB0cnVlIC8qdGVhbSovKTsKKworICAvLyBDbGVhbnVwIHRyYW5zbGF0aW9uIG1lbW9yeQorICBjbGVhbnVwX21hcChuZXdfYXJnX251bSwgbmV3X2FyZ3NfYmFzZSwgbmV3X2FyZ3MsIG5ld19hcmdfc2l6ZXMsCisgICAgICBuZXdfYXJnX3R5cGVzLCBhcmdfbnVtLCBhcmdzX2Jhc2UpOworCisgIHJldHVybiByYzsKK30KKworRVhURVJOIGludCBfX3RndF90YXJnZXRfdGVhbXNfbm93YWl0KGludDMyX3QgZGV2aWNlX2lkLCB2b2lkICpob3N0X3B0ciwKKyAgICBpbnQzMl90IGFyZ19udW0sIHZvaWQgKiphcmdzX2Jhc2UsIHZvaWQgKiphcmdzLCBpbnQ2NF90ICphcmdfc2l6ZXMsCisgICAgaW50MzJfdCAqYXJnX3R5cGVzLCBpbnQzMl90IHRlYW1fbnVtLCBpbnQzMl90IHRocmVhZF9saW1pdCwgaW50MzJfdCBkZXBOdW0sCisgICAgdm9pZCAqZGVwTGlzdCwgaW50MzJfdCBub0FsaWFzRGVwTnVtLCB2b2lkICpub0FsaWFzRGVwTGlzdCkgeworICBpZiAoZGVwTnVtICsgbm9BbGlhc0RlcE51bSA+IDApCisgICAgX19rbXBjX29tcF90YXNrd2FpdChOVUxMLCAwKTsKKworICByZXR1cm4gX190Z3RfdGFyZ2V0X3RlYW1zKGRldmljZV9pZCwgaG9zdF9wdHIsIGFyZ19udW0sIGFyZ3NfYmFzZSwgYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdfc2l6ZXMsIGFyZ190eXBlcywgdGVhbV9udW0sIHRocmVhZF9saW1pdCk7Cit9CisKKworLy8gVGhlIHRyaXAgY291bnQgbWVjaGFuaXNtIHdpbGwgYmUgcmV2aXNlZCAtIHRoaXMgc2NoZW1lIGlzIG5vdCB0aHJlYWQtc2FmZS4KK0VYVEVSTiB2b2lkIF9fa21wY19wdXNoX3RhcmdldF90cmlwY291bnQoaW50MzJfdCBkZXZpY2VfaWQsCisgICAgdWludDY0X3QgbG9vcF90cmlwY291bnQpIHsKKyAgaWYgKGRldmljZV9pZCA9PSBPRkZMT0FEX0RFVklDRV9ERUZBVUxUKSB7CisgICAgZGV2aWNlX2lkID0gb21wX2dldF9kZWZhdWx0X2RldmljZSgpOworICB9CisKKyAgaWYgKENoZWNrRGV2aWNlKGRldmljZV9pZCkgIT0gT0ZGTE9BRF9TVUNDRVNTKSB7CisgICAgRFAoIkZhaWxlZCB0byBnZXQgZGV2aWNlICVkIHJlYWR5XG4iLCBkZXZpY2VfaWQpOworICAgIHJldHVybjsKKyAgfQorCisgIERQKCJfX2ttcGNfcHVzaF90YXJnZXRfdHJpcGNvdW50KCVkLCAlIiBQUkl1NjQgIilcbiIsIGRldmljZV9pZCwKKyAgICAgIGxvb3BfdHJpcGNvdW50KTsKKyAgRGV2aWNlc1tkZXZpY2VfaWRdLmxvb3BUcmlwQ250ID0gbG9vcF90cmlwY291bnQ7Cit9CisKZGlmZiAtLWdpdCBhL2ZpbmFsL2xpYm9tcHRhcmdldC9zcmMvb21wdGFyZ2V0LmggYi9maW5hbC9saWJvbXB0YXJnZXQvc3JjL29tcHRhcmdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNDY0ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9saWJvbXB0YXJnZXQvc3JjL29tcHRhcmdldC5oCkBAIC0wLDAgKzEsMjM3IEBACisvLz09PS0tLS0tLS0tIG9tcHRhcmdldC5oIC0gVGFyZ2V0IGluZGVwZW5kZW50IE9wZW5NUCB0YXJnZXQgUlRMIC0tIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEludGVyZmFjZSB0byBiZSB1c2VkIGJ5IENsYW5nIGR1cmluZyB0aGUgY29kZWdlbiBvZiBhCisvLyB0YXJnZXQgcmVnaW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX09NUFRBUkdFVF9IXworI2RlZmluZSBfT01QVEFSR0VUX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2RlZmluZSBPRkZMT0FEX1NVQ0NFU1MgKDApCisjZGVmaW5lIE9GRkxPQURfRkFJTCAofjApCisKKyNkZWZpbmUgT0ZGTE9BRF9ERVZJQ0VfREVGQVVMVCAgICAgLTEKKyNkZWZpbmUgSE9TVF9ERVZJQ0UgICAgICAgICAgICAgICAgLTEwCisKKy8vLyBEYXRhIGF0dHJpYnV0ZXMgZm9yIGVhY2ggZGF0YSByZWZlcmVuY2UgdXNlZCBpbiBhbiBPcGVuTVAgdGFyZ2V0IHJlZ2lvbi4KK2VudW0gdGd0X21hcF90eXBlIHsKKyAgLy8gTm8gZmxhZ3MKKyAgT01QX1RHVF9NQVBUWVBFX05PTkUgICAgICAgICAgICA9IDB4MDAwLAorICAvLyBjb3B5IGRhdGEgZnJvbSBob3N0IHRvIGRldmljZQorICBPTVBfVEdUX01BUFRZUEVfVE8gICAgICAgICAgICAgID0gMHgwMDEsCisgIC8vIGNvcHkgZGF0YSBmcm9tIGRldmljZSB0byBob3N0CisgIE9NUF9UR1RfTUFQVFlQRV9GUk9NICAgICAgICAgICAgPSAweDAwMiwKKyAgLy8gY29weSByZWdhcmRsZXNzIG9mIHRoZSByZWZlcmVuY2UgY291bnQKKyAgT01QX1RHVF9NQVBUWVBFX0FMV0FZUyAgICAgICAgICA9IDB4MDA0LAorICAvLyBmb3JjZSB1bm1hcHBpbmcgb2YgZGF0YQorICBPTVBfVEdUX01BUFRZUEVfREVMRVRFICAgICAgICAgID0gMHgwMDgsCisgIC8vIG1hcCB0aGUgcG9pbnRlciBhcyB3ZWxsIGFzIHRoZSBwb2ludGVlCisgIE9NUF9UR1RfTUFQVFlQRV9QVFJfQU5EX09CSiAgICAgPSAweDAxMCwKKyAgLy8gcGFzcyBkZXZpY2UgYmFzZSBhZGRyZXNzIHRvIGtlcm5lbAorICBPTVBfVEdUX01BUFRZUEVfVEFSR0VUX1BBUkFNICAgID0gMHgwMjAsCisgIC8vIHJldHVybiBiYXNlIGRldmljZSBhZGRyZXNzIG9mIG1hcHBlZCBkYXRhCisgIE9NUF9UR1RfTUFQVFlQRV9SRVRVUk5fUEFSQU0gICAgPSAweDA0MCwKKyAgLy8gcHJpdmF0ZSB2YXJpYWJsZSAtIG5vdCBtYXBwZWQKKyAgT01QX1RHVF9NQVBUWVBFX1BSSVZBVEUgICAgICAgICA9IDB4MDgwLAorICAvLyBjb3B5IGJ5IHZhbHVlIC0gbm90IG1hcHBlZAorICBPTVBfVEdUX01BUFRZUEVfTElURVJBTCAgICAgICAgID0gMHgxMDAsCisgIC8vIG1hcHBpbmcgaXMgaW1wbGljaXQKKyAgT01QX1RHVF9NQVBUWVBFX0lNUExJQ0lUICAgICAgICA9IDB4MjAwLAorICAvLyBtZW1iZXIgb2Ygc3RydWN0LCBtZW1iZXIgZ2l2ZW4gYnkgNCBNU0JzIC0gMQorICBPTVBfVEdUX01BUFRZUEVfTUVNQkVSX09GICAgICAgID0gMHhmZmZmMDAwMDAwMDAwMDAwCit9OworCitlbnVtIE9wZW5NUE9mZmxvYWRpbmdEZWNsYXJlVGFyZ2V0RmxhZ3MgeworICAvLy8gTWFyayB0aGUgZW50cnkgYXMgaGF2aW5nIGEgJ2xpbmsnIGF0dHJpYnV0ZS4KKyAgT01QX0RFQ0xBUkVfVEFSR0VUX0xJTksgPSAweDAxLAorICAvLy8gTWFyayB0aGUgZW50cnkgYXMgYmVpbmcgYSBnbG9iYWwgY29uc3RydWN0b3IuCisgIE9NUF9ERUNMQVJFX1RBUkdFVF9DVE9SID0gMHgwMiwKKyAgLy8vIE1hcmsgdGhlIGVudHJ5IGFzIGJlaW5nIGEgZ2xvYmFsIGRlc3RydWN0b3IuCisgIE9NUF9ERUNMQVJFX1RBUkdFVF9EVE9SID0gMHgwNAorfTsKKworLy8vIFRoaXMgc3RydWN0IGlzIGEgcmVjb3JkIG9mIGFuIGVudHJ5IHBvaW50IG9yIGdsb2JhbC4gRm9yIGEgZnVuY3Rpb24KKy8vLyBlbnRyeSBwb2ludCB0aGUgc2l6ZSBpcyBleHBlY3RlZCB0byBiZSB6ZXJvCitzdHJ1Y3QgX190Z3Rfb2ZmbG9hZF9lbnRyeSB7CisgIHZvaWQgKmFkZHI7ICAgLy8gUG9pbnRlciB0byB0aGUgb2ZmbG9hZCBlbnRyeSBpbmZvIChmdW5jdGlvbiBvciBnbG9iYWwpCisgIGNoYXIgKm5hbWU7ICAgLy8gTmFtZSBvZiB0aGUgZnVuY3Rpb24gb3IgZ2xvYmFsCisgIHNpemVfdCBzaXplOyAgLy8gU2l6ZSBvZiB0aGUgZW50cnkgaW5mbyAoMCBpZiBpdCBpcyBhIGZ1bmN0aW9uKQorICBpbnQzMl90IGZsYWdzOyAvLyBGbGFncyBhc3NvY2lhdGVkIHdpdGggdGhlIGVudHJ5LCBlLmcuICdsaW5rJy4KKyAgaW50MzJfdCByZXNlcnZlZDsgLy8gUmVzZXJ2ZWQsIHRvIGJlIHVzZWQgYnkgdGhlIHJ1bnRpbWUgbGlicmFyeS4KK307CisKKy8vLyBUaGlzIHN0cnVjdCBpcyBhIHJlY29yZCBvZiB0aGUgZGV2aWNlIGltYWdlIGluZm9ybWF0aW9uCitzdHJ1Y3QgX190Z3RfZGV2aWNlX2ltYWdlIHsKKyAgdm9pZCAqSW1hZ2VTdGFydDsgICAgICAgICAgICAgICAgICAvLyBQb2ludGVyIHRvIHRoZSB0YXJnZXQgY29kZSBzdGFydAorICB2b2lkICpJbWFnZUVuZDsgICAgICAgICAgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gdGhlIHRhcmdldCBjb2RlIGVuZAorICBfX3RndF9vZmZsb2FkX2VudHJ5ICpFbnRyaWVzQmVnaW47IC8vIEJlZ2luIG9mIHRhYmxlIHdpdGggYWxsIHRhcmdldCBlbnRyaWVzCisgIF9fdGd0X29mZmxvYWRfZW50cnkgKkVudHJpZXNFbmQ7ICAgLy8gRW5kIG9mIHRhYmxlIChub24gaW5jbHVzaXZlKQorfTsKKworLy8vIFRoaXMgc3RydWN0IGlzIGEgcmVjb3JkIG9mIGFsbCB0aGUgaG9zdCBjb2RlIHRoYXQgbWF5IGJlIG9mZmxvYWRlZCB0byBhCisvLy8gdGFyZ2V0Lgorc3RydWN0IF9fdGd0X2Jpbl9kZXNjIHsKKyAgaW50MzJfdCBOdW1EZXZpY2VJbWFnZXM7ICAgICAgICAgICAvLyBOdW1iZXIgb2YgZGV2aWNlIHR5cGVzIHN1cHBvcnRlZAorICBfX3RndF9kZXZpY2VfaW1hZ2UgKkRldmljZUltYWdlczsgIC8vIEFycmF5IG9mIGRldmljZSBpbWFnZXMgKDEgcGVyIGRldi4gdHlwZSkKKyAgX190Z3Rfb2ZmbG9hZF9lbnRyeSAqSG9zdEVudHJpZXNCZWdpbjsgLy8gQmVnaW4gb2YgdGFibGUgd2l0aCBhbGwgaG9zdCBlbnRyaWVzCisgIF9fdGd0X29mZmxvYWRfZW50cnkgKkhvc3RFbnRyaWVzRW5kOyAgIC8vIEVuZCBvZiB0YWJsZSAobm9uIGluY2x1c2l2ZSkKK307CisKKy8vLyBUaGlzIHN0cnVjdCBjb250YWlucyB0aGUgb2ZmbG9hZCBlbnRyaWVzIGlkZW50aWZpZWQgYnkgdGhlIHRhcmdldCBydW50aW1lCitzdHJ1Y3QgX190Z3RfdGFyZ2V0X3RhYmxlIHsKKyAgX190Z3Rfb2ZmbG9hZF9lbnRyeSAqRW50cmllc0JlZ2luOyAvLyBCZWdpbiBvZiB0aGUgdGFibGUgd2l0aCBhbGwgdGhlIGVudHJpZXMKKyAgX190Z3Rfb2ZmbG9hZF9lbnRyeQorICAgICAgKkVudHJpZXNFbmQ7IC8vIEVuZCBvZiB0aGUgdGFibGUgd2l0aCBhbGwgdGhlIGVudHJpZXMgKG5vbiBpbmNsdXNpdmUpCit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vIEltcGxlbWVudGVkIGluIGxpYm9tcCwgdGhleSBhcmUgY2FsbGVkIGZyb20gd2l0aGluIF9fdGd0XyogZnVuY3Rpb25zLgoraW50IG9tcF9nZXRfZGVmYXVsdF9kZXZpY2Uodm9pZCkgX19hdHRyaWJ1dGVfXygod2VhaykpOworaW50MzJfdCBfX2ttcGNfb21wX3Rhc2t3YWl0KHZvaWQgKmxvY19yZWYsIGludDMyX3QgZ3RpZCkgX19hdHRyaWJ1dGVfXygod2VhaykpOworCitpbnQgb21wX2dldF9udW1fZGV2aWNlcyh2b2lkKTsKK2ludCBvbXBfZ2V0X2luaXRpYWxfZGV2aWNlKHZvaWQpOwordm9pZCAqb21wX3RhcmdldF9hbGxvYyhzaXplX3Qgc2l6ZSwgaW50IGRldmljZV9udW0pOwordm9pZCBvbXBfdGFyZ2V0X2ZyZWUodm9pZCAqZGV2aWNlX3B0ciwgaW50IGRldmljZV9udW0pOworaW50IG9tcF90YXJnZXRfaXNfcHJlc2VudCh2b2lkICpwdHIsIGludCBkZXZpY2VfbnVtKTsKK2ludCBvbXBfdGFyZ2V0X21lbWNweSh2b2lkICpkc3QsIHZvaWQgKnNyYywgc2l6ZV90IGxlbmd0aCwgc2l6ZV90IGRzdF9vZmZzZXQsCisgICAgc2l6ZV90IHNyY19vZmZzZXQsIGludCBkc3RfZGV2aWNlLCBpbnQgc3JjX2RldmljZSk7CitpbnQgb21wX3RhcmdldF9tZW1jcHlfcmVjdCh2b2lkICpkc3QsIHZvaWQgKnNyYywgc2l6ZV90IGVsZW1lbnRfc2l6ZSwKKyAgICBpbnQgbnVtX2RpbXMsIGNvbnN0IHNpemVfdCAqdm9sdW1lLCBjb25zdCBzaXplX3QgKmRzdF9vZmZzZXRzLAorICAgIGNvbnN0IHNpemVfdCAqc3JjX29mZnNldHMsIGNvbnN0IHNpemVfdCAqZHN0X2RpbWVuc2lvbnMsCisgICAgY29uc3Qgc2l6ZV90ICpzcmNfZGltZW5zaW9ucywgaW50IGRzdF9kZXZpY2UsIGludCBzcmNfZGV2aWNlKTsKK2ludCBvbXBfdGFyZ2V0X2Fzc29jaWF0ZV9wdHIodm9pZCAqaG9zdF9wdHIsIHZvaWQgKmRldmljZV9wdHIsIHNpemVfdCBzaXplLAorICAgIHNpemVfdCBkZXZpY2Vfb2Zmc2V0LCBpbnQgZGV2aWNlX251bSk7CitpbnQgb21wX3RhcmdldF9kaXNhc3NvY2lhdGVfcHRyKHZvaWQgKmhvc3RfcHRyLCBpbnQgZGV2aWNlX251bSk7CisKKy8vLyBhZGRzIGEgdGFyZ2V0IHNoYXJlZCBsaWJyYXJ5IHRvIHRoZSB0YXJnZXQgZXhlY3V0aW9uIGltYWdlCit2b2lkIF9fdGd0X3JlZ2lzdGVyX2xpYihfX3RndF9iaW5fZGVzYyAqZGVzYyk7CisKKy8vLyByZW1vdmVzIGEgdGFyZ2V0IHNoYXJlZCBsaWJyYXJ5IGZyb20gdGhlIHRhcmdldCBleGVjdXRpb24gaW1hZ2UKK3ZvaWQgX190Z3RfdW5yZWdpc3Rlcl9saWIoX190Z3RfYmluX2Rlc2MgKmRlc2MpOworCisvLyBjcmVhdGVzIHRoZSBob3N0IHRvIHRhcmdldCBkYXRhIG1hcHBpbmcsIHN0b3JlcyBpdCBpbiB0aGUKKy8vIGxpYm9tcHRhcmdldC5zbyBpbnRlcm5hbCBzdHJ1Y3R1cmUgKGFuIGVudHJ5IGluIGEgc3RhY2sgb2YgZGF0YSBtYXBzKSBhbmQKKy8vIHBhc3NlcyB0aGUgZGF0YSB0byB0aGUgZGV2aWNlOwordm9pZCBfX3RndF90YXJnZXRfZGF0YV9iZWdpbihpbnQzMl90IGRldmljZV9pZCwgaW50MzJfdCBhcmdfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqYXJnc19iYXNlLCB2b2lkICoqYXJncywgaW50NjRfdCAqYXJnX3NpemVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICphcmdfdHlwZXMpOwordm9pZCBfX3RndF90YXJnZXRfZGF0YV9iZWdpbl9ub3dhaXQoaW50MzJfdCBkZXZpY2VfaWQsIGludDMyX3QgYXJnX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiphcmdzX2Jhc2UsIHZvaWQgKiphcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqYXJnX3NpemVzLCBpbnQzMl90ICphcmdfdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRlcE51bSwgdm9pZCAqZGVwTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbm9BbGlhc0RlcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm5vQWxpYXNEZXBMaXN0KTsKKworLy8gcGFzc2VzIGRhdGEgZnJvbSB0aGUgdGFyZ2V0LCByZWxlYXNlIHRhcmdldCBtZW1vcnkgYW5kIGRlc3Ryb3lzIHRoZQorLy8gaG9zdC10YXJnZXQgbWFwcGluZyAodG9wIGVudHJ5IGZyb20gdGhlIHN0YWNrIG9mIGRhdGEgbWFwcykgY3JlYXRlZCBieQorLy8gdGhlIGxhc3QgX190Z3RfdGFyZ2V0X2RhdGFfYmVnaW4KK3ZvaWQgX190Z3RfdGFyZ2V0X2RhdGFfZW5kKGludDMyX3QgZGV2aWNlX2lkLCBpbnQzMl90IGFyZ19udW0sIHZvaWQgKiphcmdzX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqYXJncywgaW50NjRfdCAqYXJnX3NpemVzLCBpbnQzMl90ICphcmdfdHlwZXMpOwordm9pZCBfX3RndF90YXJnZXRfZGF0YV9lbmRfbm93YWl0KGludDMyX3QgZGV2aWNlX2lkLCBpbnQzMl90IGFyZ19udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmFyZ3NfYmFzZSwgdm9pZCAqKmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqYXJnX3NpemVzLCBpbnQzMl90ICphcmdfdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZXBOdW0sIHZvaWQgKmRlcExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBub0FsaWFzRGVwTnVtLCB2b2lkICpub0FsaWFzRGVwTGlzdCk7CisKKy8vLyBwYXNzZXMgZGF0YSB0by9mcm9tIHRoZSB0YXJnZXQKK3ZvaWQgX190Z3RfdGFyZ2V0X2RhdGFfdXBkYXRlKGludDMyX3QgZGV2aWNlX2lkLCBpbnQzMl90IGFyZ19udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqYXJnc19iYXNlLCB2b2lkICoqYXJncywgaW50NjRfdCAqYXJnX3NpemVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqYXJnX3R5cGVzKTsKK3ZvaWQgX190Z3RfdGFyZ2V0X2RhdGFfdXBkYXRlX25vd2FpdChpbnQzMl90IGRldmljZV9pZCwgaW50MzJfdCBhcmdfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiphcmdzX2Jhc2UsIHZvaWQgKiphcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmFyZ19zaXplcywgaW50MzJfdCAqYXJnX3R5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGVwTnVtLCB2b2lkICpkZXBMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbm9BbGlhc0RlcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpub0FsaWFzRGVwTGlzdCk7CisKKy8vIFBlcmZvcm1zIHRoZSBzYW1lIGFjdGlvbnMgYXMgZGF0YV9iZWdpbiBpbiBjYXNlIGFyZ19udW0gaXMgbm9uLXplcm8KKy8vIGFuZCBpbml0aWF0ZXMgcnVuIG9mIG9mZmxvYWRlZCByZWdpb24gb24gdGFyZ2V0IHBsYXRmb3JtOyBpZiBhcmdfbnVtCisvLyBpcyBub24temVybyBhZnRlciB0aGUgcmVnaW9uIGV4ZWN1dGlvbiBpcyBkb25lIGl0IGFsc28gcGVyZm9ybXMgdGhlCisvLyBzYW1lIGFjdGlvbiBhcyBkYXRhX2VuZCBhYm92ZS4gVGhlIGZvbGxvd2luZyB0eXBlcyBhcmUgdXNlZDsgdGhpcworLy8gZnVuY3Rpb24gcmV0dXJucyAwIGlmIGl0IHdhcyBhYmxlIHRvIHRyYW5zZmVyIHRoZSBleGVjdXRpb24gdG8gYQorLy8gdGFyZ2V0IGFuZCBhbiBpbnQgZGlmZmVyZW50IGZyb20gemVybyBvdGhlcndpc2UuCitpbnQgX190Z3RfdGFyZ2V0KGludDMyX3QgZGV2aWNlX2lkLCB2b2lkICpob3N0X3B0ciwgaW50MzJfdCBhcmdfbnVtLAorICAgICAgICAgICAgICAgICB2b2lkICoqYXJnc19iYXNlLCB2b2lkICoqYXJncywgaW50NjRfdCAqYXJnX3NpemVzLAorICAgICAgICAgICAgICAgICBpbnQzMl90ICphcmdfdHlwZXMpOworaW50IF9fdGd0X3RhcmdldF9ub3dhaXQoaW50MzJfdCBkZXZpY2VfaWQsIHZvaWQgKmhvc3RfcHRyLCBpbnQzMl90IGFyZ19udW0sCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqYXJnc19iYXNlLCB2b2lkICoqYXJncywgaW50NjRfdCAqYXJnX3NpemVzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqYXJnX3R5cGVzLCBpbnQzMl90IGRlcE51bSwgdm9pZCAqZGVwTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbm9BbGlhc0RlcE51bSwgdm9pZCAqbm9BbGlhc0RlcExpc3QpOworCitpbnQgX190Z3RfdGFyZ2V0X3RlYW1zKGludDMyX3QgZGV2aWNlX2lkLCB2b2lkICpob3N0X3B0ciwgaW50MzJfdCBhcmdfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqYXJnc19iYXNlLCB2b2lkICoqYXJncywgaW50NjRfdCAqYXJnX3NpemVzLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICphcmdfdHlwZXMsIGludDMyX3QgbnVtX3RlYW1zLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRocmVhZF9saW1pdCk7CitpbnQgX190Z3RfdGFyZ2V0X3RlYW1zX25vd2FpdChpbnQzMl90IGRldmljZV9pZCwgdm9pZCAqaG9zdF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGFyZ19udW0sIHZvaWQgKiphcmdzX2Jhc2UsIHZvaWQgKiphcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqYXJnX3NpemVzLCBpbnQzMl90ICphcmdfdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bV90ZWFtcywgaW50MzJfdCB0aHJlYWRfbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRlcE51bSwgdm9pZCAqZGVwTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbm9BbGlhc0RlcE51bSwgdm9pZCAqbm9BbGlhc0RlcExpc3QpOwordm9pZCBfX2ttcGNfcHVzaF90YXJnZXRfdHJpcGNvdW50KGludDMyX3QgZGV2aWNlX2lkLCB1aW50NjRfdCBsb29wX3RyaXBjb3VudCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNpZmRlZiBPTVBUQVJHRVRfREVCVUcKKyNpbmNsdWRlIDxzdGRpby5oPgorI2RlZmluZSBERUJVR1AocHJlZml4LCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZnByaW50ZihzdGRlcnIsICIlcyAtLT4gIiwgcHJlZml4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZwcmludGYoc3RkZXJyLCBfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjaWZuZGVmIF9fU1REQ19GT1JNQVRfTUFDUk9TCisjZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TCisjZW5kaWYKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZGVmaW5lIERQeE1PRCAiMHglMCoiIFBSSXhQVFIKKyNkZWZpbmUgRFB4UFRSKHB0cikgKChpbnQpKDIqc2l6ZW9mKHVpbnRwdHJfdCkpKSwgKCh1aW50cHRyX3QpIChwdHIpKQorCisvKgorICogVG8gcHJpbnRmIGEgcG9pbnRlciBpbiBoZXggd2l0aCBhIGZpeGVkIHdpZHRoIG9mIDE2IGRpZ2l0cyBhbmQgYSBsZWFkaW5nIDB4LAorICogdXNlIHByaW50ZigicHRyPSIgRFB4TU9EICIuLi5cbiIsIERQeFBUUihwdHIpKTsKKyAqCisgKiBEUHhNT0QgZXhwYW5kcyB0bzoKKyAqICAgIjB4JTAqIiBQUkl4UFRSCisgKiB3aGVyZSBQUkl4UFRSIGV4cGFuZHMgdG8gYW4gYXBwcm9wcmlhdGUgbW9kaWZpZXIgZm9yIHRoZSB0eXBlIHVpbnRwdHJfdCBvbiBhCisgKiBzcGVjaWZpYyBwbGF0Zm9ybSwgZS5nLiAibHUiIGlmIHVpbnRwdHJfdCBpcyB0eXBlZGVmJ2QgYXMgdW5zaWduZWQgbG9uZzoKKyAqICAgIjB4JTAqbHUiCisgKgorICogVWx0aW1hdGVseSwgdGhlIHdob2xlIHN0YXRlbWVudCBleHBhbmRzIHRvOgorICogICBwcmludGYoInB0cj0weCUwKmx1Li4uXG4iLCAgLy8gdGhlIDAqIG1vZGlmaWVyIGV4cGVjdHMgYW4gZXh0cmEgYXJndW1lbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZnlpbmcgdGhlIHdpZHRoIG9mIHRoZSBvdXRwdXQKKyAqICAgKGludCkoMipzaXplb2YodWludHB0cl90KSksIC8vIHRoZSBleHRyYSBhcmd1bWVudCBzcGVjaWZ5aW5nIHRoZSB3aWR0aAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gOCBkaWdpdHMgZm9yIDMyYml0IHN5c3RlbXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDE2IGRpZ2l0cyBmb3IgNjRiaXQKKyAqICAgKHVpbnRwdHJfdCkgcHRyKTsKKyAqLworI2Vsc2UKKyNkZWZpbmUgREVCVUdQKHByZWZpeCwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHt9CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lIEVYVEVSTiBleHRlcm4gIkMiCisjZWxzZQorI2RlZmluZSBFWFRFUk4gZXh0ZXJuCisjZW5kaWYKKworI2VuZGlmIC8vIF9PTVBUQVJHRVRfSF8KZGlmZiAtLWdpdCBhL2ZpbmFsL2xpYm9tcHRhcmdldC9zcmMvb21wdGFyZ2V0cGx1Z2luLmggYi9maW5hbC9saWJvbXB0YXJnZXQvc3JjL29tcHRhcmdldHBsdWdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZmEwNTkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9saWJvbXB0YXJnZXQvc3JjL29tcHRhcmdldHBsdWdpbi5oCkBAIC0wLDAgKzEsOTIgQEAKKy8vPT09LS0gb21wdGFyZ2V0cGx1Z2luLmggLSBUYXJnZXQgZGVwZW5kZW50IE9wZW5NUCBQbHVnaW4gQVBJIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYW4gaW50ZXJmYWNlIGJldHdlZW4gdGFyZ2V0IGluZGVwZW5kZW50IE9wZW5NUCBvZmZsb2FkCisvLyBydW50aW1lIGxpYnJhcnkgbGlib21wdGFyZ2V0IGFuZCB0YXJnZXQgZGVwZW5kZW50IHBsdWdpbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9PTVBUQVJHRVRQTFVHSU5fSF8KKyNkZWZpbmUgX09NUFRBUkdFVFBMVUdJTl9IXworCisjaW5jbHVkZSA8b21wdGFyZ2V0Lmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGRldmljZXMgb2YgdGhlIHR5cGUgc3VwcG9ydGVkIGJ5IHRoZQorLy8gdGFyZ2V0IFJUTC4KK2ludDMyX3QgX190Z3RfcnRsX251bWJlcl9vZl9kZXZpY2VzKHZvaWQpOworCisvLyBSZXR1cm4gYW4gaW50ZWdlciBkaWZmZXJlbnQgZnJvbSB6ZXJvIGlmIHRoZSBwcm92aWRlZCBkZXZpY2UgaW1hZ2UgY2FuIGJlCisvLyBzdXBwb3J0ZWQgYnkgdGhlIHJ1bnRpbWUuIFRoZSBmdW5jdGlvbmFsaXR5IGlzIHNpbWlsYXIgdG8gY29tcGFyaW5nIHRoZQorLy8gcmVzdWx0IG9mIF9fdGd0X19ydGxfX2xvYWRfX2JpbmFyeSB0byBOVUxMLiBIb3dldmVyLCB0aGlzIGlzIG1lYW50IHRvIGJlIGEKKy8vIGxpZ2h0d2VpZ2h0IHF1ZXJ5IHRvIGRldGVybWluZSBpZiB0aGUgUlRMIGlzIHN1aXRhYmxlIGZvciBhbiBpbWFnZSB3aXRob3V0CisvLyBoYXZpbmcgdG8gbG9hZCB0aGUgbGlicmFyeSwgd2hpY2ggY2FuIGJlIGV4cGVuc2l2ZS4KK2ludDMyX3QgX190Z3RfcnRsX2lzX3ZhbGlkX2JpbmFyeShfX3RndF9kZXZpY2VfaW1hZ2UgKkltYWdlKTsKKworLy8gSW5pdGlhbGl6ZSB0aGUgc3BlY2lmaWVkIGRldmljZS4gSW4gY2FzZSBvZiBzdWNjZXNzIHJldHVybiAwOyBvdGhlcndpc2UKKy8vIHJldHVybiBhbiBlcnJvciBjb2RlLgoraW50MzJfdCBfX3RndF9ydGxfaW5pdF9kZXZpY2UoaW50MzJfdCBJRCk7CisKKy8vIFBhc3MgYW4gZXhlY3V0YWJsZSBpbWFnZSBzZWN0aW9uIGRlc2NyaWJlZCBieSBpbWFnZSB0byB0aGUgc3BlY2lmaWVkCisvLyBkZXZpY2UgYW5kIHByZXBhcmUgYW4gYWRkcmVzcyB0YWJsZSBvZiB0YXJnZXQgZW50aXRpZXMuIEluIGNhc2Ugb2YgZXJyb3IsCisvLyByZXR1cm4gTlVMTC4gT3RoZXJ3aXNlLCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBidWlsdCBhZGRyZXNzIHRhYmxlLgorLy8gSW5kaXZpZHVhbCBlbnRyaWVzIGluIHRoZSB0YWJsZSBtYXkgYWxzbyBiZSBOVUxMLCB3aGVuIHRoZSBjb3JyZXNwb25kaW5nCisvLyBvZmZsb2FkIHJlZ2lvbiBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSB0YXJnZXQgZGV2aWNlLgorX190Z3RfdGFyZ2V0X3RhYmxlICpfX3RndF9ydGxfbG9hZF9iaW5hcnkoaW50MzJfdCBJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdGd0X2RldmljZV9pbWFnZSAqSW1hZ2UpOworCisvLyBBbGxvY2F0ZSBkYXRhIG9uIHRoZSBwYXJ0aWN1bGFyIHRhcmdldCBkZXZpY2UsIG9mIHRoZSBzcGVjaWZpZWQgc2l6ZS4KKy8vIEhvc3RQdHIgaXMgYSBhZGRyZXNzIG9mIHRoZSBob3N0IGRhdGEgdGhlIGFsbG9jYXRlZCB0YXJnZXQgZGF0YQorLy8gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggKEhvc3RQdHIgbWF5IGJlIE5VTEwgaWYgaXQgaXMgbm90IGtub3duIGF0CisvLyBhbGxvY2F0aW9uIHRpbWUsIGxpa2UgZm9yIGV4YW1wbGUgaXQgd291bGQgYmUgZm9yIHRhcmdldCBkYXRhIHRoYXQKKy8vIGlzIGFsbG9jYXRlZCBieSBvbXBfdGFyZ2V0X2FsbG9jKCkgQVBJKS4gUmV0dXJuIGFkZHJlc3Mgb2YgdGhlCisvLyBhbGxvY2F0ZWQgZGF0YSBvbiB0aGUgdGFyZ2V0IHRoYXQgd2lsbCBiZSB1c2VkIGJ5IGxpYm9tcHRhcmdldC5zbyB0bworLy8gaW5pdGlhbGl6ZSB0aGUgdGFyZ2V0IGRhdGEgbWFwcGluZyBzdHJ1Y3R1cmVzLiBUaGVzZSBhZGRyZXNzZXMgYXJlCisvLyB1c2VkIHRvIGdlbmVyYXRlIGEgdGFibGUgb2YgdGFyZ2V0IHZhcmlhYmxlcyB0byBwYXNzIHRvCisvLyBfX3RndF9ydGxfcnVuX3JlZ2lvbigpLiBUaGUgX190Z3RfcnRsX2RhdGFfYWxsb2MoKSByZXR1cm5zIE5VTEwgaW4KKy8vIGNhc2UgYW4gZXJyb3Igb2NjdXJyZWQgb24gdGhlIHRhcmdldCBkZXZpY2UuCit2b2lkICpfX3RndF9ydGxfZGF0YV9hbGxvYyhpbnQzMl90IElELCBpbnQ2NF90IFNpemUsIHZvaWQgKkhvc3RQdHIpOworCisvLyBQYXNzIHRoZSBkYXRhIGNvbnRlbnQgdG8gdGhlIHRhcmdldCBkZXZpY2UgdXNpbmcgdGhlIHRhcmdldCBhZGRyZXNzLgorLy8gSW4gY2FzZSBvZiBzdWNjZXNzLCByZXR1cm4gemVyby4gT3RoZXJ3aXNlLCByZXR1cm4gYW4gZXJyb3IgY29kZS4KK2ludDMyX3QgX190Z3RfcnRsX2RhdGFfc3VibWl0KGludDMyX3QgSUQsIHZvaWQgKlRhcmdldFB0ciwgdm9pZCAqSG9zdFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgU2l6ZSk7CisKKy8vIFJldHJpZXZlIHRoZSBkYXRhIGNvbnRlbnQgZnJvbSB0aGUgdGFyZ2V0IGRldmljZSB1c2luZyBpdHMgYWRkcmVzcy4KKy8vIEluIGNhc2Ugb2Ygc3VjY2VzcywgcmV0dXJuIHplcm8uIE90aGVyd2lzZSwgcmV0dXJuIGFuIGVycm9yIGNvZGUuCitpbnQzMl90IF9fdGd0X3J0bF9kYXRhX3JldHJpZXZlKGludDMyX3QgSUQsIHZvaWQgKkhvc3RQdHIsIHZvaWQgKlRhcmdldFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBTaXplKTsKKworLy8gRGUtYWxsb2NhdGUgdGhlIGRhdGEgcmVmZXJlbmNlZCBieSB0YXJnZXQgcHRyIG9uIHRoZSBkZXZpY2UuIEluIGNhc2Ugb2YKKy8vIHN1Y2Nlc3MsIHJldHVybiB6ZXJvLiBPdGhlcndpc2UsIHJldHVybiBhbiBlcnJvciBjb2RlLgoraW50MzJfdCBfX3RndF9ydGxfZGF0YV9kZWxldGUoaW50MzJfdCBJRCwgdm9pZCAqVGFyZ2V0UHRyKTsKKworLy8gVHJhbnNmZXIgY29udHJvbCB0byB0aGUgb2ZmbG9hZGVkIGVudHJ5IEVudHJ5IG9uIHRoZSB0YXJnZXQgZGV2aWNlLgorLy8gQXJncyBhbmQgT2Zmc2V0cyBhcmUgYXJyYXlzIG9mIE51bUFyZ3Mgc2l6ZSBvZiB0YXJnZXQgYWRkcmVzc2VzIGFuZAorLy8gb2Zmc2V0cy4gQW4gb2Zmc2V0IHNob3VsZCBiZSBhZGRlZCB0byB0aGUgdGFyZ2V0IGFkZHJlc3MgYmVmb3JlIHBhc3NpbmcgaXQKKy8vIHRvIHRoZSBvdXRsaW5lZCBmdW5jdGlvbiBvbiBkZXZpY2Ugc2lkZS4gSW4gY2FzZSBvZiBzdWNjZXNzLCByZXR1cm4gemVyby4KKy8vIE90aGVyd2lzZSwgcmV0dXJuIGFuIGVycm9yIGNvZGUuCitpbnQzMl90IF9fdGd0X3J0bF9ydW5fdGFyZ2V0X3JlZ2lvbihpbnQzMl90IElELCB2b2lkICpFbnRyeSwgdm9pZCAqKkFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgKk9mZnNldHMsIGludDMyX3QgTnVtQXJncyk7CisKKy8vIFNpbWlsYXIgdG8gX190Z3RfcnRsX3J1bl90YXJnZXRfcmVnaW9uLCBidXQgYWRkaXRpb25hbGx5IHNwZWNpZnkgdGhlCisvLyBudW1iZXIgb2YgdGVhbXMgdG8gYmUgY3JlYXRlZCBhbmQgYSBudW1iZXIgb2YgdGhyZWFkcyBpbiBlYWNoIHRlYW0uCitpbnQzMl90IF9fdGd0X3J0bF9ydW5fdGFyZ2V0X3RlYW1fcmVnaW9uKGludDMyX3QgSUQsIHZvaWQgKkVudHJ5LCB2b2lkICoqQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90ICpPZmZzZXRzLCBpbnQzMl90IE51bUFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgTnVtVGVhbXMsIGludDMyX3QgVGhyZWFkTGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGxvb3BfdHJpcGNvdW50KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8vIF9PTVBUQVJHRVRQTFVHSU5fSF8KZGlmZiAtLWdpdCBhL2ZpbmFsL2xpYm9tcHRhcmdldC90ZXN0L0NNYWtlTGlzdHMudHh0IGIvZmluYWwvbGlib21wdGFyZ2V0L3Rlc3QvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk4MTRkZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL2xpYm9tcHRhcmdldC90ZXN0L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsOTIgQEAKKyMgQ01ha2VMaXN0cy50eHQgZmlsZSBmb3IgdW5pdCB0ZXN0aW5nIE9wZW5NUCBMaWJyYXJ5CitpbmNsdWRlKEZpbmRQeXRob25JbnRlcnApCitpbmNsdWRlKENoZWNrVHlwZVNpemUpCitpZihOT1QgUFlUSE9OSU5URVJQX0ZPVU5EKQorICBsaWJvbXB0YXJnZXRfd2FybmluZ19zYXkoIkNvdWxkIG5vdCBmaW5kIFB5dGhvbi4iKQorICBsaWJvbXB0YXJnZXRfd2FybmluZ19zYXkoIlRoZSBjaGVjay1saWJvbXB0YXJnZXQgdGFyZ2V0IHdpbGwgbm90IGJlIGF2YWlsYWJsZSEiKQorICByZXR1cm4oKQorZW5kaWYoKQorCitzZXQoTElCT01QVEFSR0VUX1RFU1RfQ0ZMQUdTICIiIENBQ0hFIFNUUklORworICAiRXh0cmEgY29tcGlsZXIgZmxhZ3MgdG8gc2VuZCB0byB0aGUgdGVzdCBjb21waWxlciIpCisKK2lmKCR7TElCT01QVEFSR0VUX1NUQU5EQUxPTkVfQlVJTER9KQorICAjIE1ha2Ugc3VyZSB3ZSBjYW4gdXNlIHRoZSBjb25zb2xlIHBvb2wgZm9yIHJlY2VudCBjbWFrZSBhbmQgbmluamEgPiAxLjUKKyAgaWYoQ01BS0VfVkVSU0lPTiBWRVJTSU9OX0xFU1MgMy4xLjIwMTQxMTE3KQorICAgIHNldChjbWFrZV8zXzJfVVNFU19URVJNSU5BTCkKKyAgZWxzZSgpCisgICAgc2V0KGNtYWtlXzNfMl9VU0VTX1RFUk1JTkFMIFVTRVNfVEVSTUlOQUwpCisgIGVuZGlmKCkKKyAgc2V0KExJQk9NUFRBUkdFVF9URVNUX0NfQ09NUElMRVIgJHtDTUFLRV9DX0NPTVBJTEVSfSBDQUNIRSBTVFJJTkcKKyAgICAiQyBjb21waWxlciB0byB1c2UgZm9yIHRlc3RpbmcgT3Blbk1QIG9mZmxvYWRpbmcgbGlicmFyeSIpCisgIHNldChMSUJPTVBUQVJHRVRfVEVTVF9DWFhfQ09NUElMRVIgJHtDTUFLRV9DWFhfQ09NUElMRVJ9IENBQ0hFIFNUUklORworICAgICJDKysgY29tcGlsZXIgdG8gdXNlIGZvciB0ZXN0aW5nIE9wZW5NUCBvZmZsb2FkaW5nIGxpYnJhcnkiKQorICBzZXQoTElCT01QVEFSR0VUX1RFU1RfT1BFTk1QX0ZMQUcgLWZvcGVubXAgQ0FDSEUgU1RSSU5HCisgICAgIk9wZW5NUCBjb21waWxlciBmbGFnIHRvIHVzZSBmb3IgdGVzdGluZyBPcGVuTVAgb2ZmbG9hZGluZyBsaWJyYXJ5IikKKyAgZmluZF9wcm9ncmFtKExJQk9NUFRBUkdFVF9MTFZNX0xJVF9FWEVDVVRBQkxFCisgICAgTkFNRVMgbGx2bS1saXQgbGl0LnB5IGxpdAorICAgIFBBVEhTICR7T1BFTk1QX0xMVk1fVE9PTFNfRElSfSkKKyAgaWYoTk9UIExJQk9NUFRBUkdFVF9MTFZNX0xJVF9FWEVDVVRBQkxFKQorICAgIGxpYm9tcHRhcmdldF9zYXkoIkNhbm5vdCBmaW5kIGxsdm0tbGl0LiIpCisgICAgbGlib21wdGFyZ2V0X3NheSgiUGxlYXNlIHB1dCBsbHZtLWxpdCBpbiB5b3VyIFBBVEggb3Igc2V0IExJQk9NUFRBUkdFVF9MTFZNX0xJVF9FWEVDVVRBQkxFIHRvIGl0cyBmdWxsIHBhdGggb3IgcG9pbnQgT1BFTk1QX0xMVk1fVE9PTFNfRElSIHRvIGl0cyBkaXJlY3RvcnkiKQorICAgIGxpYm9tcHRhcmdldF93YXJuaW5nX3NheSgiVGhlIGNoZWNrLWxpYm9tcHRhcmdldCB0YXJnZXQgd2lsbCBub3QgYmUgYXZhaWxhYmxlISIpCisgICAgcmV0dXJuKCkKKyAgZW5kaWYoKQorICAKKyAgZmluZF9wcm9ncmFtKExJQk9NUFRBUkdFVF9GSUxFQ0hFQ0tfRVhFQ1VUQUJMRQorICAgIE5BTUVTIEZpbGVDaGVjaworICAgIFBBVEhTICR7T1BFTk1QX0xMVk1fVE9PTFNfRElSfSkKKyAgaWYoTk9UIExJQk9NUFRBUkdFVF9GSUxFQ0hFQ0tfRVhFQ1VUQUJMRSkKKyAgICBsaWJvbXB0YXJnZXRfc2F5KCJDYW5ub3QgZmluZCBGaWxlQ2hlY2suIikKKyAgICBsaWJvbXB0YXJnZXRfc2F5KCJQbGVhc2UgcHV0IEZpbGVDaGVjayBpbiB5b3VyIFBBVEggb3Igc2V0IExJQk9NUFRBUkdFVF9GSUxFQ0hFQ0tfRVhFQ1VUQUJMRSB0byBpdHMgZnVsbCBwYXRoIG9yIHBvaW50IE9QRU5NUF9MTFZNX1RPT0xTX0RJUiB0byBpdHMgZGlyZWN0b3J5IikKKyAgICBsaWJvbXB0YXJnZXRfd2FybmluZ19zYXkoIlRoZSBjaGVjay1saWJvbXB0YXJnZXQgdGFyZ2V0IHdpbGwgbm90IGJlIGF2YWlsYWJsZSEiKQorICAgIHJldHVybigpCisgIGVuZGlmKCkKKyAgCisgICMgU2V0IGxpdCBhcmd1bWVudHMKKyAgIyBUaGUgLWogMSBsZXRzIHRoZSBhY3R1YWwgdGVzdHMgcnVuIHdpdGggdGhlIGVudGlyZSBtYWNoaW5lLgorICAjIFdlIGhhdmUgb25lIHRlc3QgdGhyZWFkIHRoYXQgc3Bhd25zIHRoZSB0ZXN0cyBzZXJpYWxseS4gIFRoaXMgYWxsb3dzCisgICMgRWFjaCB0ZXN0IHRvIHVzZSB0aGUgZW50aXJlIG1hY2hpbmUuCisgIHNldChMSUJPTVBUQVJHRVRfTElUX0FSR1NfREVGQVVMVCAiLXN2IC0tc2hvdy11bnN1cHBvcnRlZCAtLXNob3cteGZhaWwgLWogMSIpCisgIGlmKE1TVkMgT1IgWENPREUpCisgICAgc2V0KExJQk9NUFRBUkdFVF9MSVRfQVJHU19ERUZBVUxUICIke0xJQk9NUFRBUkdFVF9MSVRfQVJHU19ERUZBVUxUfSAtLW5vLXByb2dyZXNzLWJhciIpCisgIGVuZGlmKCkKKyAgc2V0KExJQk9NUFRBUkdFVF9MSVRfQVJHUyAiJHtMSUJPTVBUQVJHRVRfTElUX0FSR1NfREVGQVVMVH0iIENBQ0hFIFNUUklORworICAgICJEZWZhdWx0IG9wdGlvbnMgZm9yIGxpdCIpCisgIHNlcGFyYXRlX2FyZ3VtZW50cyhMSUJPTVBUQVJHRVRfTElUX0FSR1MpCisgIGFkZF9jdXN0b21fdGFyZ2V0KGNoZWNrLWxpYm9tcHRhcmdldAorICAgIENPTU1BTkQgJHtQWVRIT05fRVhFQ1VUQUJMRX0gJHtMSUJPTVBUQVJHRVRfTExWTV9MSVRfRVhFQ1VUQUJMRX0gJHtMSUJPTVBUQVJHRVRfTElUX0FSR1N9ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfQorICAgIERFUEVORFMgb21wdGFyZ2V0CisgICAgQ09NTUVOVCAiUnVubmluZyBsaWJvbXB0YXJnZXQgdGVzdHMiCisgICAgJHtjbWFrZV8zXzJfVVNFU19URVJNSU5BTH0KKyAgKQorICAKKyAgc2V0KExJQk9NUFRBUkdFVF9PUEVOTVBfSEVBREVSX0ZPTERFUiAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9Ly4uLy4uL3J1bnRpbWUvc3JjIiBDQUNIRSBTVFJJTkcKKyAgICAiUGF0aCB0byBmb2xkZXIgY29udGFpbmluZyBvbXAuaCIpCisgIHNldChMSUJPTVBUQVJHRVRfT1BFTk1QX0hPU1RfUlRMX0ZPTERFUiAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9Ly4uLy4uL3J1bnRpbWUvc3JjIiBDQUNIRSBTVFJJTkcKKyAgICAiUGF0aCB0byBmb2xkZXIgY29udGFpbmluZyBsaWJvbXAuc28iKQorZWxzZSgpCisgICMgTExWTSBzb3VyY2UgdHJlZSBidWlsZCwgdGVzdCBqdXN0LWJ1aWx0IGNsYW5nCisgIGlmKE5PVCBNU1ZDKQorICAgIHNldChMSUJPTVBUQVJHRVRfVEVTVF9DX0NPTVBJTEVSICR7TExWTV9SVU5USU1FX09VVFBVVF9JTlRESVJ9L2NsYW5nKQorICAgIHNldChMSUJPTVBUQVJHRVRfVEVTVF9DWFhfQ09NUElMRVIgJHtMTFZNX1JVTlRJTUVfT1VUUFVUX0lOVERJUn0vY2xhbmcrKykKKyAgICBzZXQoTElCT01QVEFSR0VUX0ZJTEVDSEVDS19FWEVDVVRBQkxFICR7TExWTV9SVU5USU1FX09VVFBVVF9JTlRESVJ9L0ZpbGVDaGVjaykKKyAgZWxzZSgpCisgICAgbGlib21wdGFyZ2V0X3dhcm5pbmdfc2F5KCJOb3QgcHJlcGFyZWQgdG8gcnVuIHRlc3RzIG9uIFdpbmRvd3Mgc3lzdGVtcy4iKQorICBlbmRpZigpCisgIHNldChMSUJPTVBUQVJHRVRfVEVTVF9PUEVOTVBfRkxBRyAtZm9wZW5tcD1saWJvbXApCisgICMgVXNlIGFkZF9saXRfdGVzdHN1aXRlKCkgZnJvbSBMTFZNIENNYWtlLiBUaGlzIGFsc28gZGVwZW5kcyBvbiBPcGVuTVAKKyAgIyBpbXBsZW1lbnRhdGlvbiBiZWNhdXNlIGl0IHVzZXMgb21wLmguCisgIGFkZF9saXRfdGVzdHN1aXRlKGNoZWNrLWxpYm9tcHRhcmdldAorICAgICJSdW5uaW5nIGxpYm9tcHRhcmdldCB0ZXN0cyIKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKyAgICBERVBFTkRTIG9tcHRhcmdldCBvbXAKKyAgKQorICAKKyAgc2V0KExJQk9NUFRBUkdFVF9PUEVOTVBfSEVBREVSX0ZPTERFUiAiJHtMSUJPTVBUQVJHRVRfQklOQVJZX0RJUn0vLi4vcnVudGltZS9zcmMiKQorZW5kaWYoKQorCisjIENvbmZpZ3VyZSB0aGUgbGl0LnNpdGUuY2ZnLmluIGZpbGUKK3NldChBVVRPX0dFTl9DT01NRU5UICIjIyBBdXRvZ2VuZXJhdGVkIGJ5IGxpYm9tcHRhcmdldCBjb25maWd1cmF0aW9uLlxuIyBEbyBub3QgZWRpdCEiKQorY29uZmlndXJlX2ZpbGUobGl0LnNpdGUuY2ZnLmluIGxpdC5zaXRlLmNmZyBAT05MWSkKKwpkaWZmIC0tZ2l0IGEvZmluYWwvbGlib21wdGFyZ2V0L3Rlc3QvbGl0LmNmZyBiL2ZpbmFsL2xpYm9tcHRhcmdldC90ZXN0L2xpdC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y2NGRlNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL2xpYm9tcHRhcmdldC90ZXN0L2xpdC5jZmcKQEAgLTAsMCArMSwxMTYgQEAKKyMgLSotIFB5dGhvbiAtKi0gdmltOiBzZXQgZnQ9cHl0aG9uIHRzPTQgc3c9NCBleHBhbmR0YWIgdHc9Nzk6CisjIENvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlICdsaXQnIHRlc3QgcnVubmVyLgorCitpbXBvcnQgb3MKK2ltcG9ydCBsaXQuZm9ybWF0cworCisjIFRlbGwgcHlsaW50IHRoYXQgd2Uga25vdyBjb25maWcgYW5kIGxpdF9jb25maWcgZXhpc3Qgc29tZXdoZXJlLgoraWYgJ1BZTElOVF9JTVBPUlQnIGluIG9zLmVudmlyb246CisgICAgY29uZmlnID0gb2JqZWN0KCkKKyAgICBsaXRfY29uZmlnID0gb2JqZWN0KCkKKworZGVmIGFwcGVuZF9keW5hbWljX2xpYnJhcnlfcGF0aChuYW1lLCB2YWx1ZSwgc2VwKToKKyAgICBpZiBuYW1lIGluIGNvbmZpZy5lbnZpcm9ubWVudDoKKyAgICAgICAgY29uZmlnLmVudmlyb25tZW50W25hbWVdID0gdmFsdWUgKyBzZXAgKyBjb25maWcuZW52aXJvbm1lbnRbbmFtZV0KKyAgICBlbHNlOgorICAgICAgICBjb25maWcuZW52aXJvbm1lbnRbbmFtZV0gPSB2YWx1ZQorCisjIG5hbWU6IFRoZSBuYW1lIG9mIHRoaXMgdGVzdCBzdWl0ZS4KK2NvbmZpZy5uYW1lID0gJ2xpYm9tcHRhcmdldCcKKworIyBzdWZmaXhlczogQSBsaXN0IG9mIGZpbGUgZXh0ZW5zaW9ucyB0byB0cmVhdCBhcyB0ZXN0IGZpbGVzLgorY29uZmlnLnN1ZmZpeGVzID0gWycuYycsICcuY3BwJywgJy5jYyddCisKKyMgdGVzdF9zb3VyY2Vfcm9vdDogVGhlIHJvb3QgcGF0aCB3aGVyZSB0ZXN0cyBhcmUgbG9jYXRlZC4KK2NvbmZpZy50ZXN0X3NvdXJjZV9yb290ID0gb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKQorCisjIHRlc3RfZXhlY19yb290OiBUaGUgcm9vdCBvYmplY3QgZGlyZWN0b3J5IHdoZXJlIG91dHB1dCBpcyBwbGFjZWQKK2NvbmZpZy50ZXN0X2V4ZWNfcm9vdCA9IGNvbmZpZy5saWJvbXB0YXJnZXRfb2JqX3Jvb3QKKworIyB0ZXN0IGZvcm1hdAorY29uZmlnLnRlc3RfZm9ybWF0ID0gbGl0LmZvcm1hdHMuU2hUZXN0KCkKKworIyBjb21waWxlciBmbGFncworY29uZmlnLnRlc3RfY2ZsYWdzID0gY29uZmlnLnRlc3Rfb3Blbm1wX2ZsYWcgKyBcCisgICAgIiAtSSAiICsgY29uZmlnLnRlc3Rfc291cmNlX3Jvb3QgKyBcCisgICAgIiAtSSAiICsgY29uZmlnLm9tcF9oZWFkZXJfZGlyZWN0b3J5ICsgXAorICAgICIgLUwgIiArIGNvbmZpZy5saWJyYXJ5X2RpcjsKKyAgICAKK2lmIGNvbmZpZy5vbXBfaG9zdF9ydGxfZGlyZWN0b3J5OgorICAgIGNvbmZpZy50ZXN0X2NmbGFncyA9IGNvbmZpZy50ZXN0X2NmbGFncyArICIgLUwgIiArIFwKKyAgICAgICAgY29uZmlnLm9tcF9ob3N0X3J0bF9kaXJlY3RvcnkgIAorICAgIAorY29uZmlnLnRlc3RfY2ZsYWdzID0gY29uZmlnLnRlc3RfY2ZsYWdzICsgIiAiICsgY29uZmlnLnRlc3RfZXh0cmFfY2ZsYWdzCisKKyMgU2V0dXAgZW52aXJvbm1lbnQgdG8gZmluZCBkeW5hbWljIGxpYnJhcnkgYXQgcnVudGltZQoraWYgY29uZmlnLm9wZXJhdGluZ19zeXN0ZW0gPT0gJ1dpbmRvd3MnOgorICAgIGFwcGVuZF9keW5hbWljX2xpYnJhcnlfcGF0aCgnUEFUSCcsIGNvbmZpZy5saWJyYXJ5X2RpciwgIjsiKQorICAgIGFwcGVuZF9keW5hbWljX2xpYnJhcnlfcGF0aCgnUEFUSCcsIGNvbmZpZy5vbXBfaG9zdF9ydGxfZGlyZWN0b3J5LCAiOyIpCitlbGlmIGNvbmZpZy5vcGVyYXRpbmdfc3lzdGVtID09ICdEYXJ3aW4nOgorICAgIGFwcGVuZF9keW5hbWljX2xpYnJhcnlfcGF0aCgnRFlMRF9MSUJSQVJZX1BBVEgnLCBjb25maWcubGlicmFyeV9kaXIsICI6IikKKyAgICBhcHBlbmRfZHluYW1pY19saWJyYXJ5X3BhdGgoJ0RZTERfTElCUkFSWV9QQVRIJywgXAorICAgICAgICBjb25maWcub21wX2hvc3RfcnRsX2RpcmVjdG9yeSwgIjsiKQorICAgIGNvbmZpZy50ZXN0X2NmbGFncyArPSAiIC1XbCwtcnBhdGgsIiArIGNvbmZpZy5saWJyYXJ5X2RpcgorICAgIGNvbmZpZy50ZXN0X2NmbGFncyArPSAiIC1XbCwtcnBhdGgsIiArIGNvbmZpZy5vbXBfaG9zdF9ydGxfZGlyZWN0b3J5CitlbHNlOiAjIFVuaWNlcworICAgIGFwcGVuZF9keW5hbWljX2xpYnJhcnlfcGF0aCgnTERfTElCUkFSWV9QQVRIJywgY29uZmlnLmxpYnJhcnlfZGlyLCAiOiIpCisgICAgYXBwZW5kX2R5bmFtaWNfbGlicmFyeV9wYXRoKCdMRF9MSUJSQVJZX1BBVEgnLCBcCisgICAgICAgIGNvbmZpZy5vbXBfaG9zdF9ydGxfZGlyZWN0b3J5LCAiOiIpCisgICAgCisjIHN1YnN0aXR1dGlvbnMKKyMgLSBmb3IgdGFyZ2V0cyB0aGF0IGV4aXN0IGluIHRoZSBzeXN0ZW0gY3JlYXRlIHRoZSBhY3R1YWwgY29tbWFuZC4KKyMgLSBmb3IgdmFsaWQgdGFyZ2V0cyB0aGF0IGRvIG5vdCBleGlzdCBpbiB0aGUgc3lzdGVtLCByZXR1cm4gZmFsc2UsIHNvIHRoYXQgdGhlCisjICAgc2FtZSB0ZXN0IGNhbiBiZSB1c2VkIGZvciBkaWZmZXJlbnQgdGFyZ2V0cy4KKworIyBTY2FuIGFsbCB0aGUgdmFsaWQgdGFyZ2V0cy4KK2ZvciBsaWJvbXB0YXJnZXRfdGFyZ2V0IGluIGNvbmZpZy5saWJvbXB0YXJnZXRfYWxsX3RhcmdldHM6CisgICAgIyBJcyB0aGlzIHRhcmdldCBpbiB0aGUgY3VycmVudCBzeXN0ZW0/IElmIHNvIGNyZWF0ZSBhIGNvbXBpbGUsIHJ1biBhbmQgdGVzdAorICAgICMgY29tbWFuZC4gT3RoZXJ3aXNlIGNyZWF0ZSBjb21tYW5kIHRoYXQgcmV0dXJuIGZhbHNlLgorICAgIGlmIGxpYm9tcHRhcmdldF90YXJnZXQgaW4gY29uZmlnLmxpYm9tcHRhcmdldF9zeXN0ZW1fdGFyZ2V0czoKKyAgICAgICAgY29uZmlnLnN1YnN0aXR1dGlvbnMuYXBwZW5kKCgiJWxpYm9tcHRhcmdldC1jb21waWxleHgtcnVuLWFuZC1jaGVjay0iICsgXAorICAgICAgICAgICAgbGlib21wdGFyZ2V0X3RhcmdldCwgXAorICAgICAgICAgICAgIiVsaWJvbXB0YXJnZXQtY29tcGlsZXh4LWFuZC1ydW4tIiArIGxpYm9tcHRhcmdldF90YXJnZXQgKyBcCisgICAgICAgICAgICAiIHwgIiArIGNvbmZpZy5saWJvbXB0YXJnZXRfZmlsZWNoZWNrICsgIiAlcyIpKQorICAgICAgICBjb25maWcuc3Vic3RpdHV0aW9ucy5hcHBlbmQoKCIlbGlib21wdGFyZ2V0LWNvbXBpbGUtcnVuLWFuZC1jaGVjay0iICsgXAorICAgICAgICAgICAgbGlib21wdGFyZ2V0X3RhcmdldCwgXAorICAgICAgICAgICAgIiVsaWJvbXB0YXJnZXQtY29tcGlsZS1hbmQtcnVuLSIgKyBsaWJvbXB0YXJnZXRfdGFyZ2V0ICsgXAorICAgICAgICAgICAgIiB8ICIgKyBjb25maWcubGlib21wdGFyZ2V0X2ZpbGVjaGVjayArICIgJXMiKSkgICAgICAKKyAgICAgICAgY29uZmlnLnN1YnN0aXR1dGlvbnMuYXBwZW5kKCgiJWxpYm9tcHRhcmdldC1jb21waWxleHgtYW5kLXJ1bi0iICsgXAorICAgICAgICAgICAgbGlib21wdGFyZ2V0X3RhcmdldCwgXAorICAgICAgICAgICAgIiVjbGFuZ3h4LSIgKyBsaWJvbXB0YXJnZXRfdGFyZ2V0ICsgIiAlcyAtbyAldC0iICsgXAorICAgICAgICAgICAgbGlib21wdGFyZ2V0X3RhcmdldCArICIgJiYgJXQtIiArIGxpYm9tcHRhcmdldF90YXJnZXQpKSAgICAKKyAgICAgICAgY29uZmlnLnN1YnN0aXR1dGlvbnMuYXBwZW5kKCgiJWxpYm9tcHRhcmdldC1jb21waWxlLWFuZC1ydW4tIiArIFwKKyAgICAgICAgICAgIGxpYm9tcHRhcmdldF90YXJnZXQsIFwKKyAgICAgICAgICAgICIlY2xhbmctIiArIGxpYm9tcHRhcmdldF90YXJnZXQgKyAiICVzIC1vICV0LSIgKyBcCisgICAgICAgICAgICBsaWJvbXB0YXJnZXRfdGFyZ2V0ICsgIiAmJiAldC0iICsgbGlib21wdGFyZ2V0X3RhcmdldCkpCisgICAgICAgIGNvbmZpZy5zdWJzdGl0dXRpb25zLmFwcGVuZCgoIiVjbGFuZ3h4LSIgKyBsaWJvbXB0YXJnZXRfdGFyZ2V0LCBcCisgICAgICAgICAgICAiJWNsYW5neHggJWNmbGFncyAtZm9wZW5tcC10YXJnZXRzPSIgKyBsaWJvbXB0YXJnZXRfdGFyZ2V0KSkgICAgCisgICAgICAgIGNvbmZpZy5zdWJzdGl0dXRpb25zLmFwcGVuZCgoIiVjbGFuZy0iICsgbGlib21wdGFyZ2V0X3RhcmdldCwgXAorICAgICAgICAgICAgIiVjbGFuZyAlY2ZsYWdzIC1mb3Blbm1wLXRhcmdldHM9IiArIGxpYm9tcHRhcmdldF90YXJnZXQpKQorICAgICAgICBjb25maWcuc3Vic3RpdHV0aW9ucy5hcHBlbmQoKCIlZmNoZWNrLSIgKyBsaWJvbXB0YXJnZXRfdGFyZ2V0LCBcCisgICAgICAgICAgICBjb25maWcubGlib21wdGFyZ2V0X2ZpbGVjaGVjayArICIgJXMiKSkKKyAgICBlbHNlOgorICAgICAgICBjb25maWcuc3Vic3RpdHV0aW9ucy5hcHBlbmQoKCIlbGlib21wdGFyZ2V0LWNvbXBpbGUtcnVuLWFuZC1jaGVjay0iICsgXAorICAgICAgICAgICAgbGlib21wdGFyZ2V0X3RhcmdldCwgXAorICAgICAgICAgICAgImVjaG8gaWdub3JlZC1jb21tYW5kIikpCisgICAgICAgIGNvbmZpZy5zdWJzdGl0dXRpb25zLmFwcGVuZCgoIiVsaWJvbXB0YXJnZXQtY29tcGlsZXh4LXJ1bi1hbmQtY2hlY2stIiArIFwKKyAgICAgICAgICAgIGxpYm9tcHRhcmdldF90YXJnZXQsIFwKKyAgICAgICAgICAgICJlY2hvIGlnbm9yZWQtY29tbWFuZCIpKQorICAgICAgICBjb25maWcuc3Vic3RpdHV0aW9ucy5hcHBlbmQoKCIlbGlib21wdGFyZ2V0LWNvbXBpbGUtYW5kLXJ1bi0iICsgXAorICAgICAgICAgICAgbGlib21wdGFyZ2V0X3RhcmdldCwgXAorICAgICAgICAgICAgImVjaG8gaWdub3JlZC1jb21tYW5kIikpCisgICAgICAgIGNvbmZpZy5zdWJzdGl0dXRpb25zLmFwcGVuZCgoIiVsaWJvbXB0YXJnZXQtY29tcGlsZXh4LWFuZC1ydW4tIiArIFwKKyAgICAgICAgICAgIGxpYm9tcHRhcmdldF90YXJnZXQsIFwKKyAgICAgICAgICAgICJlY2hvIGlnbm9yZWQtY29tbWFuZCIpKQorICAgICAgICBjb25maWcuc3Vic3RpdHV0aW9ucy5hcHBlbmQoKCIlY2xhbmctIiArIGxpYm9tcHRhcmdldF90YXJnZXQsIFwKKyAgICAgICAgICAgICJlY2hvIGlnbm9yZWQtY29tbWFuZCIpKQorICAgICAgICBjb25maWcuc3Vic3RpdHV0aW9ucy5hcHBlbmQoKCIlY2xhbmd4eC0iICsgbGlib21wdGFyZ2V0X3RhcmdldCwgXAorICAgICAgICAgICAgImVjaG8gaWdub3JlZC1jb21tYW5kIikpCisgICAgICAgIGNvbmZpZy5zdWJzdGl0dXRpb25zLmFwcGVuZCgoIiVmY2hlY2stIiArIGxpYm9tcHRhcmdldF90YXJnZXQsIFwKKyAgICAgICAgICAgICJlY2hvIGlnbm9yZWQtY29tbWFuZCIpKQorCitjb25maWcuc3Vic3RpdHV0aW9ucy5hcHBlbmQoKCIlY2xhbmd4eCIsIGNvbmZpZy50ZXN0X2N4eF9jb21waWxlcikpCitjb25maWcuc3Vic3RpdHV0aW9ucy5hcHBlbmQoKCIlY2xhbmciLCBjb25maWcudGVzdF9jX2NvbXBpbGVyKSkKK2NvbmZpZy5zdWJzdGl0dXRpb25zLmFwcGVuZCgoIiVvcGVubXBfZmxhZyIsIGNvbmZpZy50ZXN0X29wZW5tcF9mbGFnKSkKK2NvbmZpZy5zdWJzdGl0dXRpb25zLmFwcGVuZCgoIiVjZmxhZ3MiLCBjb25maWcudGVzdF9jZmxhZ3MpKQorCmRpZmYgLS1naXQgYS9maW5hbC9saWJvbXB0YXJnZXQvdGVzdC9saXQuc2l0ZS5jZmcuaW4gYi9maW5hbC9saWJvbXB0YXJnZXQvdGVzdC9saXQuc2l0ZS5jZmcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU2NDlhOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL2xpYm9tcHRhcmdldC90ZXN0L2xpdC5zaXRlLmNmZy5pbgpAQCAtMCwwICsxLDIwIEBACitAQVVUT19HRU5fQ09NTUVOVEAKKworY29uZmlnLnRlc3RfY19jb21waWxlciA9ICJATElCT01QVEFSR0VUX1RFU1RfQ19DT01QSUxFUkAiCitjb25maWcudGVzdF9jeHhfY29tcGlsZXIgPSAiQExJQk9NUFRBUkdFVF9URVNUX0NYWF9DT01QSUxFUkAiCitjb25maWcudGVzdF9vcGVubXBfZmxhZyA9ICJATElCT01QVEFSR0VUX1RFU1RfT1BFTk1QX0ZMQUdAIgorIyBGb3IgdGhlIG1vbWVudCB3ZSBzdGlsbCBuZWVkIHRvIHBhc3MgbGlib21wdGFyZ2V0IGV4cGxpY2l0bHkuIE9uY2UgdGhlIGRyaXZlcgorIyBwYXRjaCwgbGFuZHMsIHRoaXMgaXMgbm90IHJlcXVpcmVkIGFueW1vcmUuCitjb25maWcudGVzdF9leHRyYV9jZmxhZ3MgPSAiLWxvbXB0YXJnZXQgQExJQk9NUFRBUkdFVF9URVNUX0NGTEFHU0AiCitjb25maWcubGlib21wdGFyZ2V0X29ial9yb290ID0gIkBDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJAIgorY29uZmlnLmxpYnJhcnlfZGlyID0gIkBMSUJPTVBUQVJHRVRfTElCUkFSWV9ESVJAIgorY29uZmlnLm9tcF9oZWFkZXJfZGlyZWN0b3J5ID0gIkBMSUJPTVBUQVJHRVRfT1BFTk1QX0hFQURFUl9GT0xERVJAIgorY29uZmlnLm9tcF9ob3N0X3J0bF9kaXJlY3RvcnkgPSAiQExJQk9NUFRBUkdFVF9PUEVOTVBfSE9TVF9SVExfRk9MREVSQCIKK2NvbmZpZy5vcGVyYXRpbmdfc3lzdGVtID0gIkBDTUFLRV9TWVNURU1fTkFNRUAiCitjb25maWcubGlib21wdGFyZ2V0X2FsbF90YXJnZXRzID0gIkBMSUJPTVBUQVJHRVRfQUxMX1RBUkdFVFNAIi5zcGxpdCgpCitjb25maWcubGlib21wdGFyZ2V0X3N5c3RlbV90YXJnZXRzID0gIkBMSUJPTVBUQVJHRVRfU1lTVEVNX1RBUkdFVFNAIi5zcGxpdCgpCitjb25maWcubGlib21wdGFyZ2V0X2ZpbGVjaGVjayA9ICJATElCT01QVEFSR0VUX0ZJTEVDSEVDS19FWEVDVVRBQkxFQCIKKworIyBMZXQgdGhlIG1haW4gY29uZmlnIGRvIHRoZSByZWFsIHdvcmsuCitsaXRfY29uZmlnLmxvYWRfY29uZmlnKGNvbmZpZywgIkBMSUJPTVBUQVJHRVRfQkFTRV9ESVJAL3Rlc3QvbGl0LmNmZyIpCisKZGlmZiAtLWdpdCBhL2ZpbmFsL2xpYm9tcHRhcmdldC90ZXN0L29mZmxvYWRpbmcvb2ZmbG9hZGluZ19zdWNjZXNzLmMgYi9maW5hbC9saWJvbXB0YXJnZXQvdGVzdC9vZmZsb2FkaW5nL29mZmxvYWRpbmdfc3VjY2Vzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZTc4ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9saWJvbXB0YXJnZXQvdGVzdC9vZmZsb2FkaW5nL29mZmxvYWRpbmdfc3VjY2Vzcy5jCkBAIC0wLDAgKzEsMjMgQEAKKy8vIFJVTjogJWxpYm9tcHRhcmdldC1jb21waWxlLXJ1bi1hbmQtY2hlY2stYWFyY2g2NC11bmtub3duLWxpbnV4LWdudQorLy8gUlVOOiAlbGlib21wdGFyZ2V0LWNvbXBpbGUtcnVuLWFuZC1jaGVjay1wb3dlcnBjNjQtaWJtLWxpbnV4LWdudQorLy8gUlVOOiAlbGlib21wdGFyZ2V0LWNvbXBpbGUtcnVuLWFuZC1jaGVjay1wb3dlcnBjNjRsZS1pYm0tbGludXgtZ251CisvLyBSVU46ICVsaWJvbXB0YXJnZXQtY29tcGlsZS1ydW4tYW5kLWNoZWNrLXg4Nl82NC1wYy1saW51eC1nbnUKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b21wLmg+CisKK2ludCBtYWluKHZvaWQpIHsKKyAgaW50IGlzSG9zdCA9IC0xOworCisjcHJhZ21hIG9tcCB0YXJnZXQgbWFwKGZyb206IGlzSG9zdCkKKyAgeyBpc0hvc3QgPSBvbXBfaXNfaW5pdGlhbF9kZXZpY2UoKTsgfQorCisgIGlmIChpc0hvc3QgPCAwKSB7CisgICAgcHJpbnRmKCJSdW50aW1lIGVycm9yLCBpc0hvc3Q9JWRcbiIsIGlzSG9zdCk7CisgIH0KKworICAvLyBDSEVDSzogVGFyZ2V0IHJlZ2lvbiBleGVjdXRlZCBvbiB0aGUgZGV2aWNlCisgIHByaW50ZigiVGFyZ2V0IHJlZ2lvbiBleGVjdXRlZCBvbiB0aGUgJXNcbiIsIGlzSG9zdCA/ICJob3N0IiA6ICJkZXZpY2UiKTsKKworICByZXR1cm4gaXNIb3N0OworfQpkaWZmIC0tZ2l0IGEvZmluYWwvbGlib21wdGFyZ2V0L3Rlc3Qvb2ZmbG9hZGluZy9vZmZsb2FkaW5nX3N1Y2Nlc3MuY3BwIGIvZmluYWwvbGlib21wdGFyZ2V0L3Rlc3Qvb2ZmbG9hZGluZy9vZmZsb2FkaW5nX3N1Y2Nlc3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlY2Q5N2EKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9saWJvbXB0YXJnZXQvdGVzdC9vZmZsb2FkaW5nL29mZmxvYWRpbmdfc3VjY2Vzcy5jcHAKQEAgLTAsMCArMSwyMyBAQAorLy8gUlVOOiAlbGlib21wdGFyZ2V0LWNvbXBpbGV4eC1ydW4tYW5kLWNoZWNrLWFhcmNoNjQtdW5rbm93bi1saW51eC1nbnUKKy8vIFJVTjogJWxpYm9tcHRhcmdldC1jb21waWxleHgtcnVuLWFuZC1jaGVjay1wb3dlcnBjNjQtaWJtLWxpbnV4LWdudQorLy8gUlVOOiAlbGlib21wdGFyZ2V0LWNvbXBpbGV4eC1ydW4tYW5kLWNoZWNrLXBvd2VycGM2NGxlLWlibS1saW51eC1nbnUKKy8vIFJVTjogJWxpYm9tcHRhcmdldC1jb21waWxleHgtcnVuLWFuZC1jaGVjay14ODZfNjQtcGMtbGludXgtZ251CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9tcC5oPgorCitpbnQgbWFpbih2b2lkKSB7CisgIGludCBpc0hvc3QgPSAwOworCisjcHJhZ21hIG9tcCB0YXJnZXQgbWFwKGZyb206IGlzSG9zdCkKKyAgeyBpc0hvc3QgPSBvbXBfaXNfaW5pdGlhbF9kZXZpY2UoKTsgfQorCisgIGlmIChpc0hvc3QgPCAwKSB7CisgICAgcHJpbnRmKCJSdW50aW1lIGVycm9yLCBpc0hvc3Q9JWRcbiIsIGlzSG9zdCk7CisgIH0KKworICAvLyBDSEVDSzogVGFyZ2V0IHJlZ2lvbiBleGVjdXRlZCBvbiB0aGUgZGV2aWNlCisgIHByaW50ZigiVGFyZ2V0IHJlZ2lvbiBleGVjdXRlZCBvbiB0aGUgJXNcbiIsIGlzSG9zdCA/ICJob3N0IiA6ICJkZXZpY2UiKTsKKworICByZXR1cm4gaXNIb3N0OworfQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9NYWtlZmlsZSBiL2ZpbmFsL29mZmxvYWQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzVlMzc0NAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvTWFrZWZpbGUKQEAgLTAsMCArMSwyMjQgQEAKKyMNCisjIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vDQorIy8vDQorIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUNCisjLy8NCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3Blbg0KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4NCisjLy8NCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisjDQorDQorIyBNQUtFRklMRSBQQVJBTUVURVJTDQorIw0KKyMgcm9vdF9kaXIgLSBwYXRoIHRvIHJvb3QgZGlyZWN0b3J5IG9mIGxpYm9mZmxvYWQNCisjIGJ1aWxkX2RpciAtIHBhdGggdG8gYnVpbGQgZGlyZWN0b3J5DQorIyBtcHNzX2RpciAtIHBhdGggdG8gcm9vdCBkaXJlY3Rvcnkgb2YgbXBzcw0KKyMgbXBzc192ZXJzaW9uIC0gdmVyc2lvbiBvZiB0aGUgbXBzcyAoZS5nLiwgdmVyc2lvbiAiMy4zLngiIHdvdWxkIGJlICIzMyIpDQorIyBsaWJpb21wX2hvc3RfZGlyIC0gcGF0aCB0byBob3N0IGxpYmlvbXAgZGlyZWN0b3J5ICh1bm5lY2Vzc2FyeSBpZiBjb21waWxlcl9ob3N0IGlzIGljYykNCisjIGxpYmlvbXBfdGFyZ2V0X2RpciAtIHBhdGggdG8gdGFyZ2V0IGxpYmlvbXAgZGlyZWN0b3J5ICh1bm5lY2VzYXJyeSBpZiBjb21waWxlcl90YXJnZXQgaXMgaWNjKQ0KKyMgb21wX2hlYWRlcl9kaXIgLSBwYXRoIHRvIG9tcC5oICh1bm5lY2Vzc2FyeSBpZiBjb21waWxlcl9ob3N0IGFuZCBjb21waWxlcl90YXJnZXQgYXJlIGljYykNCisjIG9zX2hvc3QgLSBob3N0IG9wZXJhdGluZyBzeXN0ZW0NCisjIG9zX3RhcmdldCAtIHRhcmdldCBvcGVyYXRpbmcgc3lzdGVtDQorIyBjb21waWxlcl9ob3N0IC0gaG9zdCBjb21waWxlcg0KKyMgY29tcGlsZXJfdGFyZ2V0IC0gdGFyZ2V0IGNvbXBpbGVyDQorIyBvcHRpb25zX2hvc3QgLSBhZGRpdGlvbmFsIG9wdGlvbnMgZm9yIGhvc3QgY29tcGlsZXINCisjIG9wdGlvbnNfdGFyZ2V0IC0gYWRkaXRpb25hbCBvcHRpb25zIGZvciB0YXJnZXQgY29tcGlsZXINCisjDQorDQorIyBEaXJlY3Rvcmllcw0KK3Jvb3RfZGlyPz0uDQorYnVpbGRfZGlyPz0kKHJvb3RfZGlyKS9idWlsZA0KK2J1aWxkX2hvc3RfZGlyPSQoYnVpbGRfZGlyKS9ob3N0DQorYnVpbGRfdGFyZ2V0X2Rpcj0kKGJ1aWxkX2RpcikvdGFyZ2V0DQorb2JqX2hvc3RfZGlyPSQoYnVpbGRfZGlyKS9vYmpfaG9zdA0KK29ial90YXJnZXRfZGlyPSQoYnVpbGRfZGlyKS9vYmpfdGFyZ2V0DQorc291cmNlX2Rpcj0kKHJvb3RfZGlyKS9zcmMNCitpbXBvcnRlZF9kaXI9JChzb3VyY2VfZGlyKS9pbXBvcnRlZA0KKw0KKyMgT1MNCitvc19ob3N0Pz1saW51eA0KK29zX3RhcmdldD89bGludXgNCitpZm5lcSAoJChvc19ob3N0KV8kKG9zX3RhcmdldCksIGxpbnV4X2xpbnV4KQ0KKyAgJChlcnJvciAiT25seSBsaW51eCBpcyBzdXBwb3J0ZWQiKQ0KK2VuZGlmDQorDQorIyBDb21waWxlcnMNCitjb21waWxlcl9ob3N0Pz1nY2MNCitjb21waWxlcl90YXJnZXQ/PWdjYw0KKw0KKyMgTVBTUw0KK21wc3NfdmVyc2lvbj89MzANCittcHNzX2Rpcj89Lw0KK21wc3NfcHJlc2VudD0kKHNoZWxsIGlmIHRlc3QgLWQgJChtcHNzX2Rpcik7IHRoZW4gZWNobyBPSzsgZWxzZSBlY2hvIEtPOyBmaSkNCitpZm5lcSAoJChtcHNzX3ByZXNlbnQpLCBPSykNCisgICQoZXJyb3IgIkNhbm5vdCBmaW5kIE1QU1MgZGlyZWN0b3J5ICQobXBzc19kaXIpIikNCitlbmRpZg0KKw0KK2lmZXEgKCQoc2hlbGwgdGVzdCAkKG1wc3NfdmVyc2lvbikgLWd0IDMzOyBlY2hvICQkPyksIDApDQorICBjb2lfZGlyPSQobXBzc19kaXIpL3N5c3Jvb3RzL2sxb20tbXBzcy1saW51eC91c3INCisgIGNvaV9pbmNsdWRlPSQoY29pX2RpcikvaW5jbHVkZS9pbnRlbC1jb2kNCisgIGNvaV9saWJfaG9zdD0kKG1wc3NfZGlyKS9saWI2NA0KKyAgY29pX2xpYl9kZXZpY2U9JChjb2lfZGlyKS9saWI2NA0KK2Vsc2UNCisgIGNvaV9kaXI9JChtcHNzX2Rpcikvb3B0L2ludGVsL21pYy9jb2kNCisgIGNvaV9pbmNsdWRlPSQoY29pX2RpcikvaW5jbHVkZQ0KKyAgY29pX2xpYl9ob3N0PSQoY29pX2RpcikvaG9zdC1saW51eC1yZWxlYXNlL2xpYg0KKyAgY29pX2xpYl9kZXZpY2U9JChjb2lfZGlyKS9kZXZpY2UtbGludXgtcmVsZWFzZS9saWINCitlbmRpZg0KK215b19kaXI9JChtcHNzX2Rpcikvb3B0L2ludGVsL21pYy9teW8NCisNCisjIFNvdXJjZXMNCitzcmNfbGlib2ZmbG9hZF9jb21tb249ZHZfdXRpbC5jcHAgbGlib2ZmbG9hZF9lcnJvci5jIGxpYm9mZmxvYWRfbXNnLmMgb2ZmbG9hZF9jb21tb24uY3BwIG9mZmxvYWRfdGFibGUuY3BwIG9mZmxvYWRfdHJhY2UuY3BwIG9mZmxvYWRfdXRpbC5jcHANCisNCitzcmNfbGlib2ZmbG9hZF9ob3N0PSQoc3JjX2xpYm9mZmxvYWRfY29tbW9uKSBjZWFuX3V0aWwuY3BwIGNvaS9jb2lfY2xpZW50LmNwcCBjb21waWxlcl9pZl9ob3N0LmNwcCBvZmZsb2FkX2VuZ2luZS5jcHAgb2ZmbG9hZF9lbnYuY3BwIG9mZmxvYWRfaG9zdC5jcHAgb2ZmbG9hZF9vbXBfaG9zdC5jcHAgb2ZmbG9hZF90aW1lcl9ob3N0LmNwcCBvZmZsb2FkX29yc2wuY3BwIG9yc2wtbGl0ZS9saWIvb3JzbC1saXRlLmMgb2ZmbG9hZF9teW9faG9zdC5jcHANCitzcmNfbGlib2ZmbG9hZF9ob3N0Oj0kKGZvcmVhY2ggZmlsZSwkKHNyY19saWJvZmZsb2FkX2hvc3QpLCQoc291cmNlX2RpcikvJChmaWxlKSkNCisNCitzcmNfbGlib2ZmbG9hZF90YXJnZXQ9JChzcmNfbGlib2ZmbG9hZF9jb21tb24pIGNvaS9jb2lfc2VydmVyLmNwcCBjb21waWxlcl9pZl90YXJnZXQuY3BwIG9mZmxvYWRfb21wX3RhcmdldC5jcHAgb2ZmbG9hZF90YXJnZXQuY3BwIG9mZmxvYWRfdGltZXJfdGFyZ2V0LmNwcCBvZmZsb2FkX215b190YXJnZXQuY3BwDQorc3JjX2xpYm9mZmxvYWRfdGFyZ2V0Oj0kKGZvcmVhY2ggZmlsZSwkKHNyY19saWJvZmZsb2FkX3RhcmdldCksJChzb3VyY2VfZGlyKS8kKGZpbGUpKQ0KKw0KK3NyY19vZmxkPW9mbGRiZWdpbi5jcHAgb2ZsZGVuZC5jcHANCitzcmNfb2ZsZDo9JChmb3JlYWNoIGZpbGUsJChzcmNfb2ZsZCksJChzb3VyY2VfZGlyKS8kKGZpbGUpKQ0KKw0KK2hlYWRlcnM9JCh3aWxkY2FyZCAkKHNvdXJjZV9kaXIpLyouaCkgJCh3aWxkY2FyZCAkKHNvdXJjZV9kaXIpL2NvaS8qLmgpICQod2lsZGNhcmQgJChzb3VyY2VfZGlyKS9vcnNsLWxpdGUvaW5jbHVkZS8qLmgpDQoraWZuZXEgKCQob21wX2hlYWRlcl9kaXIpLCApDQorICBoZWFkZXJzKz0kKGltcG9ydGVkX2Rpcikvb21wLmgNCitlbmRpZg0KKw0KKyMgT2JqZWN0cw0KK29ial9saWJvZmZsb2FkX2hvc3Q9JChub3RkaXIgJChzcmNfbGlib2ZmbG9hZF9ob3N0KSkNCitvYmpfbGlib2ZmbG9hZF9ob3N0Oj0kKG9ial9saWJvZmZsb2FkX2hvc3Q6LmNwcD0ubykNCitvYmpfbGlib2ZmbG9hZF9ob3N0Oj0kKG9ial9saWJvZmZsb2FkX2hvc3Q6LmM9Lm8pDQorb2JqX2xpYm9mZmxvYWRfaG9zdDo9JChmb3JlYWNoIGZpbGUsJChvYmpfbGlib2ZmbG9hZF9ob3N0KSwkKG9ial9ob3N0X2RpcikvJChmaWxlKSkNCisNCitvYmpfbGlib2ZmbG9hZF90YXJnZXQ9JChub3RkaXIgJChzcmNfbGlib2ZmbG9hZF90YXJnZXQpKQ0KK29ial9saWJvZmZsb2FkX3RhcmdldDo9JChvYmpfbGlib2ZmbG9hZF90YXJnZXQ6LmNwcD0ubykNCitvYmpfbGlib2ZmbG9hZF90YXJnZXQ6PSQob2JqX2xpYm9mZmxvYWRfdGFyZ2V0Oi5jPS5vKQ0KK29ial9saWJvZmZsb2FkX3RhcmdldDo9JChmb3JlYWNoIGZpbGUsJChvYmpfbGlib2ZmbG9hZF90YXJnZXQpLCQob2JqX3RhcmdldF9kaXIpLyQoZmlsZSkpDQorDQorb2JqX29mbGQ9JChub3RkaXIgJChzcmNfb2ZsZCkpDQorb2JqX29mbGQ6PSQob2JqX29mbGQ6LmNwcD0ubykNCitvYmpfb2ZsZF9ob3N0PSQoZm9yZWFjaCBmaWxlLCQob2JqX29mbGQpLCQoYnVpbGRfaG9zdF9kaXIpLyQoZmlsZSkpDQorb2JqX29mbGRfdGFyZ2V0PSQoZm9yZWFjaCBmaWxlLCQob2JqX29mbGQpLCQoYnVpbGRfdGFyZ2V0X2RpcikvJChmaWxlKSkNCisNCisjIE9wdGlvbnMNCitvcHRzX2NvbW1vbj0tTzIgLXcgLWZwaWMgLWMgLURDT0lfTElCUkFSWV9WRVJTSU9OPTIgLURNWU9fU1VQUE9SVCAtRE9GRkxPQURfREVCVUc9MSAtRFNFUF9TVVBQT1JUIC1EVElNSU5HX1NVUFBPUlQgLUkkKGNvaV9pbmNsdWRlKSAtSSQobXlvX2RpcikvaW5jbHVkZSAtSSQoc291cmNlX2RpcikNCitpZm5lcSAoJChvbXBfaGVhZGVyX2RpciksICkNCisgIG9wdHNfY29tbW9uKz0tSSQoaW1wb3J0ZWRfZGlyKQ0KK2VuZGlmDQorDQorb3B0c19saWJvZmZsb2FkPS1zaGFyZWQgLVdsLC1zb25hbWUsbGlib2ZmbG9hZC5zby41IC1sZGwgLWxzdGRjKysgLWxpb21wNQ0KKw0KK29wdHNfbGlib2ZmbG9hZF9ob3N0PSQob3B0c19saWJvZmZsb2FkKSAtTCQoY29pX2xpYl9ob3N0KSAtbGNvaV9ob3N0IC1MJChteW9fZGlyKS9saWIgLWxteW8tY2xpZW50DQoraWZuZXEgKCQobGliaW9tcF9ob3N0X2RpciksICkNCisgIG9wdHNfbGlib2ZmbG9hZF9ob3N0Kz0tTCQobGliaW9tcF9ob3N0X2RpcikNCitlbmRpZg0KKw0KK29wdHNfbGlib2ZmbG9hZF90YXJnZXQ9JChvcHRzX2xpYm9mZmxvYWQpIC1MJChjb2lfbGliX2RldmljZSkgLWxjb2lfZGV2aWNlIC1MJChteW9fZGlyKS9saWIgLWxteW8tc2VydmljZQ0KK2lmbmVxICgkKGxpYmlvbXBfdGFyZ2V0X2RpciksICkNCisgIG9wdHNfbGlib2ZmbG9hZF90YXJnZXQrPS1MJChsaWJpb21wX3RhcmdldF9kaXIpDQorZW5kaWYNCisNCitvcHRpb25zX2hvc3Q/PQ0KK29wdHNfaG9zdD0kKG9wdGlvbnNfaG9zdCkgLURIT1NUX0xJQlJBUlk9MSAtRE1QU1NfVkVSU0lPTj0kKG1wc3NfdmVyc2lvbikNCitpZmVxICgkKG9zX2hvc3QpLCBsaW51eCkNCisgIG9wdHNfaG9zdCs9LURMSU5VWA0KK2VuZGlmDQorDQorb3B0aW9uc190YXJnZXQ/PQ0KK29wdHNfdGFyZ2V0PSQob3B0aW9uc190YXJnZXQpIC1ESE9TVF9MSUJSQVJZPTANCitpZmVxICgkKG9zX3RhcmdldCksIGxpbnV4KQ0KKyAgb3B0c190YXJnZXQrPS1ETElOVVgNCitlbmRpZg0KK2lmZXEgKCQoY29tcGlsZXJfdGFyZ2V0KSwgaWNjKQ0KKyAgb3B0c190YXJnZXQrPS1tbWljDQorZW5kaWYNCisNCisjIE1ha2UgdGFyZ2V0cw0KKy5QSE9OWTogYWxsIGNsZWFuIGluZm8NCisNCithbGw6IGluZm8gJChidWlsZF9ob3N0X2RpcikvbGlib2ZmbG9hZC5zbyAkKGJ1aWxkX3RhcmdldF9kaXIpL2xpYm9mZmxvYWQuc28gJChvYmpfb2ZsZF9ob3N0KSAkKG9ial9vZmxkX3RhcmdldCkNCisNCisNCiskKGJ1aWxkX2hvc3RfZGlyKS9saWJvZmZsb2FkLnNvOiAkKGJ1aWxkX2hvc3RfZGlyKS9saWJvZmZsb2FkLnNvLjUgfCAkKGJ1aWxkX2hvc3RfZGlyKQ0KKwlsbiAtZiAkPCAkQA0KKw0KKyQoYnVpbGRfaG9zdF9kaXIpL2xpYm9mZmxvYWQuc28uNTogJChvYmpfbGlib2ZmbG9hZF9ob3N0KSB8ICQoYnVpbGRfaG9zdF9kaXIpDQorCSQoY29tcGlsZXJfaG9zdCkgJChvcHRzX2xpYm9mZmxvYWRfaG9zdCkgJChvcHRzX2hvc3QpICReIC1vICRADQorDQorJChvYmpfaG9zdF9kaXIpLyUubzogJChzb3VyY2VfZGlyKS8lLmMgJChoZWFkZXJzKSB8ICQob2JqX2hvc3RfZGlyKQ0KKwkkKGNvbXBpbGVyX2hvc3QpICQob3B0c19jb21tb24pICQob3B0c19ob3N0KSAkPCAtbyAkQA0KKw0KKyQob2JqX2hvc3RfZGlyKS8lLm86ICQoc291cmNlX2RpcikvJS5jcHAgJChoZWFkZXJzKSB8ICQob2JqX2hvc3RfZGlyKQ0KKwkkKGNvbXBpbGVyX2hvc3QpICQob3B0c19jb21tb24pICQob3B0c19ob3N0KSAkPCAtbyAkQA0KKw0KKyQob2JqX2hvc3RfZGlyKS8lLm86ICQoc291cmNlX2RpcikvY29pLyUuY3BwICQoaGVhZGVycykgfCAkKG9ial9ob3N0X2RpcikNCisJJChjb21waWxlcl9ob3N0KSAkKG9wdHNfY29tbW9uKSAkKG9wdHNfaG9zdCkgJDwgLW8gJEANCisNCiskKG9ial9ob3N0X2RpcikvJS5vOiAkKHNvdXJjZV9kaXIpL29yc2wtbGl0ZS9saWIvJS5jICQoaGVhZGVycykgfCAkKG9ial9ob3N0X2RpcikNCisJJChjb21waWxlcl9ob3N0KSAkKG9wdHNfY29tbW9uKSAkKG9wdHNfaG9zdCkgJDwgLW8gJEANCisNCisNCiskKGJ1aWxkX3RhcmdldF9kaXIpL2xpYm9mZmxvYWQuc286ICQoYnVpbGRfdGFyZ2V0X2RpcikvbGlib2ZmbG9hZC5zby41IHwgJChidWlsZF90YXJnZXRfZGlyKQ0KKwlsbiAtZiAkPCAkQA0KKw0KKyQoYnVpbGRfdGFyZ2V0X2RpcikvbGlib2ZmbG9hZC5zby41OiAkKG9ial9saWJvZmZsb2FkX3RhcmdldCkgfCAkKGJ1aWxkX3RhcmdldF9kaXIpDQorCSQoY29tcGlsZXJfdGFyZ2V0KSAkKG9wdHNfbGlib2ZmbG9hZF90YXJnZXQpICQob3B0c190YXJnZXQpICReIC1vICRADQorDQorJChvYmpfdGFyZ2V0X2RpcikvJS5vOiAkKHNvdXJjZV9kaXIpLyUuYyAkKGhlYWRlcnMpIHwgJChvYmpfdGFyZ2V0X2RpcikNCisJJChjb21waWxlcl90YXJnZXQpICQob3B0c19jb21tb24pICQob3B0c190YXJnZXQpICQ8IC1vICRADQorDQorJChvYmpfdGFyZ2V0X2RpcikvJS5vOiAkKHNvdXJjZV9kaXIpLyUuY3BwICQoaGVhZGVycykgfCAkKG9ial90YXJnZXRfZGlyKQ0KKwkkKGNvbXBpbGVyX3RhcmdldCkgJChvcHRzX2NvbW1vbikgJChvcHRzX3RhcmdldCkgJDwgLW8gJEANCisNCiskKG9ial90YXJnZXRfZGlyKS8lLm86ICQoc291cmNlX2RpcikvY29pLyUuY3BwICQoaGVhZGVycykgfCAkKG9ial90YXJnZXRfZGlyKQ0KKwkkKGNvbXBpbGVyX3RhcmdldCkgJChvcHRzX2NvbW1vbikgJChvcHRzX3RhcmdldCkgJDwgLW8gJEANCisNCiskKG9ial90YXJnZXRfZGlyKS8lLm86ICQoc291cmNlX2Rpcikvb3JzbC1saXRlL2xpYi8lLmMgJChoZWFkZXJzKSB8ICQob2JqX3RhcmdldF9kaXIpDQorCSQoY29tcGlsZXJfdGFyZ2V0KSAkKG9wdHNfY29tbW9uKSAkKG9wdHNfdGFyZ2V0KSAkPCAtbyAkQA0KKw0KKw0KKyQoYnVpbGRfaG9zdF9kaXIpLyUubzogJChzb3VyY2VfZGlyKS8lLmNwcCAkKGhlYWRlcnMpIHwgJChidWlsZF9ob3N0X2RpcikNCisJJChjb21waWxlcl9ob3N0KSAkKG9wdHNfY29tbW9uKSAkKG9wdHNfaG9zdCkgJDwgLW8gJEANCisNCiskKGJ1aWxkX3RhcmdldF9kaXIpLyUubzogJChzb3VyY2VfZGlyKS8lLmNwcCAkKGhlYWRlcnMpIHwgJChidWlsZF90YXJnZXRfZGlyKQ0KKwkkKGNvbXBpbGVyX3RhcmdldCkgJChvcHRzX2NvbW1vbikgJChvcHRzX3RhcmdldCkgJDwgLW8gJEANCisNCisNCiskKGltcG9ydGVkX2Rpcikvb21wLmg6ICQob21wX2hlYWRlcl9kaXIpL29tcC5oIHwgJChpbXBvcnRlZF9kaXIpDQorCWNwICQ8ICRADQorDQorDQorJChidWlsZF9ob3N0X2RpcikgJChidWlsZF90YXJnZXRfZGlyKSAkKG9ial9ob3N0X2RpcikgJChvYmpfdGFyZ2V0X2Rpcik6IHwgJChidWlsZF9kaXIpDQorCSQoc2hlbGwgbWtkaXIgLXAgJEAgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCkNCisJQGVjaG8gIkNyZWF0ZWQgJEAgZGlyZWN0b3J5Ig0KKw0KKyQoYnVpbGRfZGlyKToNCisJJChzaGVsbCBta2RpciAtcCAkQCA+L2Rldi9udWxsIDI+L2Rldi9udWxsKQ0KKwlAZWNobyAiQ3JlYXRlZCAkQCBkaXJlY3RvcnkiDQorDQorJChpbXBvcnRlZF9kaXIpOg0KKwkkKHNoZWxsIG1rZGlyIC1wICRAID4vZGV2L251bGwgMj4vZGV2L251bGwpDQorCUBlY2hvICJDcmVhdGVkICRAIGRpcmVjdG9yeSINCisNCisNCitjbGVhbjoNCisJJChzaGVsbCBybSAtcmYgJChidWlsZF9kaXIpKQ0KKwlAZWNobyAiUmVtb3ZlICQoYnVpbGRfZGlyKSBkaXJlY3RvcnkiDQorDQorDQoraW5mbzoNCisJQGVjaG8gInJvb3RfZGlyID0gJChyb290X2RpcikiDQorCUBlY2hvICJidWlsZF9kaXIgPSAkKGJ1aWxkX2RpcikiDQorCUBlY2hvICJtcHNzX2RpciA9ICQobXBzc19kaXIpIg0KKwlAZWNobyAibXBzc192ZXJzaW9uID0gJChtcHNzX3ZlcnNpb24pIg0KKwlAZWNobyAibGliaW9tcF9ob3N0X2RpciA9ICQobGliaW9tcF9ob3N0X2RpcikiDQorCUBlY2hvICJsaWJpb21wX3RhcmdldF9kaXIgPSAkKGxpYmlvbXBfdGFyZ2V0X2RpcikiDQorCUBlY2hvICJvbXBfaGVhZGVyX2RpciA9ICQob21wX2hlYWRlcl9kaXIpIg0KKwlAZWNobyAib3NfaG9zdCA9ICQob3NfaG9zdCkiDQorCUBlY2hvICJvc190YXJnZXQgPSAkKG9zX3RhcmdldCkiDQorCUBlY2hvICJjb21waWxlcl9ob3N0ID0gJChjb21waWxlcl9ob3N0KSINCisJQGVjaG8gImNvbXBpbGVyX3RhcmdldCA9ICQoY29tcGlsZXJfdGFyZ2V0KSINCisJQGVjaG8gIm9wdGlvbnNfaG9zdCA9ICQob3B0aW9uc19ob3N0KSINCisJQGVjaG8gIm9wdGlvbnNfdGFyZ2V0ID0gJChvcHRpb25zX3RhcmdldCkiDQorDQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9SRUFETUUudHh0IGIvZmluYWwvb2ZmbG9hZC9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmViOWZiMWQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL1JFQURNRS50eHQKQEAgLTAsMCArMSwxMjkgQEAKKw0KKwkgICAgICAgUkVBRE1FIGZvciBJbnRlbChSKSBPZmZsb2FkIFJ1bnRpbWUgTGlicmFyeQ0KKwkgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KK0hvdyB0byBCdWlsZCBEb2N1bWVudGF0aW9uDQorPT09PT09PT09PT09PT09PT09PT09PT09PT0NCisNCitUaGUgbWFpbiBkb2N1bWVudGF0aW9uIGlzIGluIERveHlnZW4qIGZvcm1hdCwgYW5kIHRoaXMgZGlzdHJpYnV0aW9uDQorc2hvdWxkIGNvbWUgd2l0aCBwcmUtYnVpbHQgUERGIGRvY3VtZW50YXRpb24gaW4gZG9jL1JlZmVyZW5jZS5wZGYuDQorSG93ZXZlciwgYW4gSFRNTCB2ZXJzaW9uIGNhbiBiZSBidWlsdCBieSBleGVjdXRpbmc6DQorDQorJSBkb3h5Z2VuIGRvYy9kb3h5Z2VuL2NvbmZpZw0KKw0KK2luIHRoaXMgZGlyZWN0b3J5Lg0KKw0KK1RoYXQgd2lsbCBwcm9kdWNlIEhUTUwgZG9jdW1lbnRhdGlvbiBpbiB0aGUgZG9jL2RveHlnZW4vZ2VuZXJhdGVkDQorZGlyZWN0b3J5LCB3aGljaCBjYW4gYmUgYWNjZXNzZWQgYnkgcG9pbnRpbmcgYSB3ZWIgYnJvd3NlciBhdCB0aGUNCitpbmRleC5odG1sIGZpbGUgdGhlcmUuDQorDQorSWYgeW91IGRvbid0IGhhdmUgRG94eWdlbiBpbnN0YWxsZWQsIHlvdSBjYW4gZG93bmxvYWQgaXQgZnJvbQ0KK3d3dy5kb3h5Z2VuLm9yZy4NCisNCisNCitTb2Z0d2FyZSBSZXF1aXJlbWVudHMNCis9PT09PT09PT09PT09PT09PT09PT0NCisNCitJbnRlbChSKSBPZmZsb2FkIFJ1bnRpbWUgTGlicmFyeSByZXF1aXJlcyBhZGRpdGlvbmFsIHNvZnR3YXJlOg0KKw0KKzEpIEludGVsKFIpIE9wZW5NUCogUnVudGltZSBMaWJyYXJ5LiAgWW91IGNhbiBlaXRoZXIgZG93bmxvYWQgdGhlIHNvdXJjZQ0KK2NvZGUgZm9yIHRoYXQgKGZyb20gb3Blbm1wcnRsLm9yZyBvciBvcGVubXAubGx2bS5vcmcpIG9yIHNpbXBseSB1c2UgdGhlDQorY29tcGlsZWQgdmVyc2lvbiBkaXN0cmlidXRlZCB3aXRoIHRoZSBJbnRlbCBjb21waWxlcnMuDQorMikgSW50ZWwoUikgQ09JIFJ1bnRpbWUgTGlicmFyeSBhbmQgSW50ZWwoUikgTVlPIFJ1bnRpbWUgTGlicmFyeS4gIFRoZXNlDQorbGlicmFyaWVzIGFyZSBwYXJ0IG9mIEludGVsKFIpIE1hbnljb3JlIFBsYXRmb3JtIFNvZnR3YXJlIFN0YWNrIChNUFNTKS4gIFlvdQ0KK2NhbiBkb3dubG9hZCBNUFNTIHNvdXJjZSBjb2RlIG9yIGJpbmFyaWVzIGZyb20NCitzb2Z0d2FyZS5pbnRlbC5jb20vZW4tdXMvYXJ0aWNsZXMvaW50ZWwtbWFueWNvcmUtcGxhdGZvcm0tc29mdHdhcmUtc3RhY2stbXBzcy4NCitCaW5hcmllcyBpbmNsdWRlIGhvc3QgbGlicmFyaWVzIGZvciBJbnRlbChSKSA2NCBBcmNoaXRlY3R1cmUgYW5kIHRhcmdldA0KK2xpYnJhcmllcyBmb3IgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlLg0KKw0KK0Fsc28geW91IHdpbGwgcmVxdWlyZSBhbGwgb2YgdGhlIGxpYnJhcmllcyB0aGF0IGVuYWJsZSB0aGUgdGFyZ2V0IGNvZGUgdG8gcnVuDQorb24gZGV2aWNlLiAgSWYgeW91IHRhcmdldCB0aGUgSW50ZWwoUikgWGVvbiBQaGkgKFRNKSBjb3Byb2Nlc3NvciwgdGhlc2UNCitsaWJyYXJpZXMgY2FuIGJlIHRha2VuIGZyb20gTVBTUyB0b28uDQorDQorDQorSG93IHRvIEJ1aWxkIHRoZSBJbnRlbChSKSBPZmZsb2FkIFJ1bnRpbWUgTGlicmFyeQ0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisNCitUaGUgTWFrZWZpbGUgYXQgdGhlIHRvcC1sZXZlbCB3aWxsIGF0dGVtcHQgdG8gZGV0ZWN0IHdoYXQgaXQgbmVlZHMgdG8NCitidWlsZCB0aGUgSW50ZWwoUikgT2ZmbG9hZCBSdW50aW1lIExpYnJhcnkuICBUbyBzZWUgdGhlIGRlZmF1bHQgc2V0dGluZ3MsDQordHlwZToNCisNCittYWtlIGluZm8NCisNCitZb3UgY2FuIGNoYW5nZSB0aGUgTWFrZWZpbGUncyBiZWhhdmlvciB3aXRoIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoNCisNCityb290X2RpcjoJICAgICAgVGhlIHBhdGggdG8gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUNCisJCSAgICAgIHRvcC1sZXZlbCBNYWtlZmlsZS4gIEJ5IGRlZmF1bHQsIHRoaXMgd2lsbCB0YWtlIG9uIHRoZQ0KKwkJICAgICAgdmFsdWUgb2YgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuDQorDQorYnVpbGRfZGlyOgkgICAgICBUaGUgcGF0aCB0byB0aGUgYnVpbGQgZGlyZWN0b3J5LiAgQnkgZGVmYXVsdCwgdGhpcyB3aWxsDQorCQkgICAgICB0YWtlIG9uIHZhbHVlIFtyb290X2Rpcl0vYnVpbGQuDQorDQorbXBzc19kaXI6CSAgICAgIFRoZSBwYXRoIHRvIHRoZSBJbnRlbChSKSBNYW55Y29yZSBQbGF0Zm9ybSBTb2Z0d2FyZQ0KKwkJICAgICAgU3RhY2sgaW5zdGFsbCBkaXJlY3RvcnkuICBCeSBkZWZhdWx0LCB0aGlzIHdpbGwgdGFrZSBvbg0KKwkJICAgICAgdGhlIHZhbHVlIG9mIG9wZXJhdGluZyBzeXN0ZW0ncyByb290IGRpcmVjdG9yeS4NCisNCitsaWJpb21wX2hvc3RfZGlyOiAgICAgVGhlIHBhdGggdG8gdGhlIGhvc3QgSW50ZWwoUikgT3Blbk1QKiBSdW50aW1lIExpYnJhcnkuDQorCQkgICAgICBUaGlzIG9wdGlvbiBpcyByZXF1aXJlZCB3aGVuIHRoZSBob3N0IGNvbXBpbGVyIGlzIG90aGVyDQorCQkgICAgICB0aGFuIGljYy4NCisNCitsaWJpb21wX3RhcmdldF9kaXI6ICAgVGhlIHBhdGggdG8gdGhlIHRhcmdldCBJbnRlbChSKSBPcGVuTVAqIFJ1bnRpbWUNCisJCSAgICAgIExpYnJhcnkuICBUaGlzIG9wdGlvbiBpcyByZXF1aXJlZCB3aGVuIHRoZSB0YXJnZXQNCisJCSAgICAgIGNvbXBpbGVyIGlzIG90aGVyIHRoYW4gaWNjLg0KKw0KK29tcF9oZWFkZXJfZGlyOiAgICAgICBUaGUgcGF0aCB0byB0aGUgaGVhZGVyIGZpbGUgPG9tcC5oPiBvZiBJbnRlbChSKSBPcGVuTVAqDQorCQkgICAgICBSdW50aW1lIExpYnJhcnkuICBUaGlzIG9wdGlvbiBpcyByZXF1aXJlZCBpZiBlaXRoZXIgaG9zdA0KKwkJICAgICAgb3IgdGFyZ2V0IGNvbXBpbGVyIGlzIG90aGVyIHRoYW4gaWNjLg0KKw0KK29zX2hvc3Q6CSAgICAgIE9wZXJhdGluZyBzeXN0ZW0gb24gaG9zdC4gIEN1cnJlbnRseSBzdXBwb3J0cyBvbmx5DQorCQkgICAgICAibGludXgiIHdoaWNoIGlzIHNldCBieSBkZWZhdWx0Lg0KKw0KK29zX3RhcmdldDoJICAgICAgT3BlcmF0aW5nIHN5c3RlbSBvbiB0YXJnZXQgZGV2aWNlLiAgQ3VycmVudGx5IHN1cHBvcnRzDQorCQkgICAgICBvbmx5ICJsaW51eCIgd2hpY2ggaXMgc2V0IGJ5IGRlZmF1bHQuDQorDQorY29tcGlsZXJfaG9zdDoJICAgICAgV2hpY2ggY29tcGlsZXIgdG8gdXNlIGZvciB0aGUgYnVpbGQgb2YgdGhlIGhvc3QgcGFydC4NCisJCSAgICAgIERlZmF1bHRzIHRvICJnY2MiKi4gIEFsc28gc3VwcG9ydHMgImljYyIgYW5kICJjbGFuZyIqLg0KKwkJICAgICAgWW91IHNob3VsZCBwcm92aWRlIHRoZSBmdWxsIHBhdGggdG8gdGhlIGNvbXBpbGVyIG9yIGl0DQorCQkgICAgICBzaG91bGQgYmUgaW4gdGhlIHVzZXIncyBwYXRoLg0KKw0KK2NvbXBpbGVyX2hvc3Q6CSAgICAgIFdoaWNoIGNvbXBpbGVyIHRvIHVzZSBmb3IgdGhlIGJ1aWxkIG9mIHRoZSB0YXJnZXQgcGFydC4NCisJCSAgICAgIERlZmF1bHRzIHRvICJnY2MiKi4gIEFsc28gc3VwcG9ydHMgImljYyIgYW5kICJjbGFuZyIqLg0KKwkJICAgICAgWW91IHNob3VsZCBwcm92aWRlIHRoZSBmdWxsIHBhdGggdG8gdGhlIGNvbXBpbGVyIG9yIGl0DQorCQkgICAgICBzaG91bGQgYmUgaW4gdGhlIHVzZXIncyBwYXRoLg0KKw0KK29wdGlvbnNfaG9zdDoJICAgICAgQWRkaXRpb25hbCBvcHRpb25zIGZvciB0aGUgaG9zdCBjb21waWxlci4NCisNCitvcHRpb25zX3RhcmdldDogICAgICAgQWRkaXRpb25hbCBvcHRpb25zIGZvciB0aGUgdGFyZ2V0IGNvbXBpbGVyLg0KKw0KK1RvIHVzZSBhbnkgb2YgdGhlIG9wdGlvbnMgYWJvdmUsIHNpbXBsZSBhZGQgPG9wdGlvbl9uYW1lPj08dmFsdWU+LiAgRm9yDQorZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gYnVpbGQgd2l0aCBpY2MgaW5zdGVhZCBvZiBnY2MsIHR5cGU6DQorDQorbWFrZSBjb21waWxlcl9ob3N0PWljYyBjb21waWxlcl90YXJnZXQ9aWNjDQorDQorDQorU3VwcG9ydGVkIFJUTCBCdWlsZCBDb25maWd1cmF0aW9ucw0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisNCitTdXBwb3J0ZWQgQXJjaGl0ZWN0dXJlczogSW50ZWwoUikgNjQsIGFuZCBJbnRlbChSKSBNYW55IEludGVncmF0ZWQNCitDb3JlIEFyY2hpdGVjdHVyZQ0KKw0KKwkgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisJICAgICAgfCAgIGljYy9pY2wgICAgIHwgICAgZ2NjICAgICAgfCAgICBjbGFuZyAgICB8DQorLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCit8IExpbnV4KiBPUyAgIHwgICAgICBZZXMgICAgICB8ICAgICBZZXMoMSkgIHwgICAgIFllcygxKSAgfA0KK3wgT1MgWCogICAgICAgfCAgICAgICBObyAgICAgIHwgICAgICBObyAgICAgfCAgICAgIE5vICAgICB8DQorfCBXaW5kb3dzKiBPUyB8ICAgICAgIE5vICAgICAgfCAgICAgIE5vICAgICB8ICAgICAgTm8gICAgIHwNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKygxKSBMaWJvZmZsb2FkIHJlcXVpcmVzIF9yZHRzYyBpbnRyaW5zaWMsIHdoaWNoIG1heSBiZSB1bnN1cHBvcnRlZCBieSBzb21lDQorICAgIHZlcnNpb25zIG9mIGNvbXBpbGVyLiAgSW4gdGhpcyBjYXNlIHlvdSBuZWVkIHRvIGluY2x1ZGUgc3JjL3JkdHNjLmgNCisgICAgbWFudWFsbHkgYnkgdXNpbmcgTWFrZWZpbGUgb3B0aW9ucyBvcHRpb25zX2hvc3QgYW5kIG9wdGlvbnNfdGFyZ2V0Og0KKw0KKyAgICBtYWtlIG9wdGlvbnNfaG9zdD0iLWluY2x1ZGUgc3JjL3JkdHNjLmgiIG9wdGlvbnNfdGFyZ2V0PSItaW5jbHVkZSBzcmMvcmR0c2MuaCINCisNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK05vdGljZXMNCis9PT09PT09DQorDQorKk90aGVyIG5hbWVzIGFuZCBicmFuZHMgbWF5IGJlIGNsYWltZWQgYXMgdGhlIHByb3BlcnR5IG9mIG90aGVycy4NCmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL2RvYy9SZWZlcmVuY2UucGRmIGIvZmluYWwvb2ZmbG9hZC9kb2MvUmVmZXJlbmNlLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTE3NmYwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9kb2MvUmVmZXJlbmNlLnBkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL2RvYy9kb3h5Z2VuL2NvbmZpZyBiL2ZpbmFsL29mZmxvYWQvZG9jL2RveHlnZW4vY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ0NWI2OTYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL2RvYy9kb3h5Z2VuL2NvbmZpZwpAQCAtMCwwICsxLDIzMjggQEAKKyMgRG94eWZpbGUgMS44LjYKKworIyBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBzZXR0aW5ncyB0byBiZSB1c2VkIGJ5IHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbQorIyBkb3h5Z2VuICh3d3cuZG94eWdlbi5vcmcpIGZvciBhIHByb2plY3QuCisjCisjIEFsbCB0ZXh0IGFmdGVyIGEgZG91YmxlIGhhc2ggKCMjKSBpcyBjb25zaWRlcmVkIGEgY29tbWVudCBhbmQgaXMgcGxhY2VkIGluCisjIGZyb250IG9mIHRoZSBUQUcgaXQgaXMgcHJlY2VkaW5nLgorIworIyBBbGwgdGV4dCBhZnRlciBhIHNpbmdsZSBoYXNoICgjKSBpcyBjb25zaWRlcmVkIGEgY29tbWVudCBhbmQgd2lsbCBiZSBpZ25vcmVkLgorIyBUaGUgZm9ybWF0IGlzOgorIyBUQUcgPSB2YWx1ZSBbdmFsdWUsIC4uLl0KKyMgRm9yIGxpc3RzLCBpdGVtcyBjYW4gYWxzbyBiZSBhcHBlbmRlZCB1c2luZzoKKyMgVEFHICs9IHZhbHVlIFt2YWx1ZSwgLi4uXQorIyBWYWx1ZXMgdGhhdCBjb250YWluIHNwYWNlcyBzaG91bGQgYmUgcGxhY2VkIGJldHdlZW4gcXVvdGVzIChcIiBcIikuCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHJvamVjdCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoaXMgdGFnIHNwZWNpZmllcyB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIGNvbmZpZyBmaWxlCisjIHRoYXQgZm9sbG93LiBUaGUgZGVmYXVsdCBpcyBVVEYtOCB3aGljaCBpcyBhbHNvIHRoZSBlbmNvZGluZyB1c2VkIGZvciBhbGwgdGV4dAorIyBiZWZvcmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhpcyB0YWcuIERveHlnZW4gdXNlcyBsaWJpY29udiAob3IgdGhlIGljb252CisjIGJ1aWx0IGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJpY29udgorIyBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgZW5jb2RpbmdzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogVVRGLTguCisKK0RPWFlGSUxFX0VOQ09ESU5HICAgICAgPSBVVEYtOAorCisjIFRoZSBQUk9KRUNUX05BTUUgdGFnIGlzIGEgc2luZ2xlIHdvcmQgKG9yIGEgc2VxdWVuY2Ugb2Ygd29yZHMgc3Vycm91bmRlZCBieQorIyBkb3VibGUtcXVvdGVzLCB1bmxlc3MgeW91IGFyZSB1c2luZyBEb3h5d2l6YXJkKSB0aGF0IHNob3VsZCBpZGVudGlmeSB0aGUKKyMgcHJvamVjdCBmb3Igd2hpY2ggdGhlIGRvY3VtZW50YXRpb24gaXMgZ2VuZXJhdGVkLiBUaGlzIG5hbWUgaXMgdXNlZCBpbiB0aGUKKyMgdGl0bGUgb2YgbW9zdCBnZW5lcmF0ZWQgcGFnZXMgYW5kIGluIGEgZmV3IG90aGVyIHBsYWNlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE15IFByb2plY3QuCisKK1BST0pFQ1RfTkFNRSAgICAgICAgICAgPSAiSW50ZWwmcmVnOyZuYnNwO09mZmxvYWQgUnVudGltZSBMaWJyYXJ5IgorCisjIFRoZSBQUk9KRUNUX05VTUJFUiB0YWcgY2FuIGJlIHVzZWQgdG8gZW50ZXIgYSBwcm9qZWN0IG9yIHJldmlzaW9uIG51bWJlci4gVGhpcworIyBjb3VsZCBiZSBoYW5keSBmb3IgYXJjaGl2aW5nIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiBvciBpZiBzb21lIHZlcnNpb24KKyMgY29udHJvbCBzeXN0ZW0gaXMgdXNlZC4KKworUFJPSkVDVF9OVU1CRVIgICAgICAgICA9IAorCisjIFVzaW5nIHRoZSBQUk9KRUNUX0JSSUVGIHRhZyBvbmUgY2FuIHByb3ZpZGUgYW4gb3B0aW9uYWwgb25lIGxpbmUgZGVzY3JpcHRpb24KKyMgZm9yIGEgcHJvamVjdCB0aGF0IGFwcGVhcnMgYXQgdGhlIHRvcCBvZiBlYWNoIHBhZ2UgYW5kIHNob3VsZCBnaXZlIHZpZXdlciBhCisjIHF1aWNrIGlkZWEgYWJvdXQgdGhlIHB1cnBvc2Ugb2YgdGhlIHByb2plY3QuIEtlZXAgdGhlIGRlc2NyaXB0aW9uIHNob3J0LgorCitQUk9KRUNUX0JSSUVGICAgICAgICAgID0gCisKKyMgV2l0aCB0aGUgUFJPSkVDVF9MT0dPIHRhZyBvbmUgY2FuIHNwZWNpZnkgYW4gbG9nbyBvciBpY29uIHRoYXQgaXMgaW5jbHVkZWQgaW4KKyMgdGhlIGRvY3VtZW50YXRpb24uIFRoZSBtYXhpbXVtIGhlaWdodCBvZiB0aGUgbG9nbyBzaG91bGQgbm90IGV4Y2VlZCA1NSBwaXhlbHMKKyMgYW5kIHRoZSBtYXhpbXVtIHdpZHRoIHNob3VsZCBub3QgZXhjZWVkIDIwMCBwaXhlbHMuIERveHlnZW4gd2lsbCBjb3B5IHRoZSBsb2dvCisjIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorCitQUk9KRUNUX0xPR08gICAgICAgICAgID0gCisKKyMgVGhlIE9VVFBVVF9ESVJFQ1RPUlkgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgKHJlbGF0aXZlIG9yIGFic29sdXRlKSBwYXRoCisjIGludG8gd2hpY2ggdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIHdpbGwgYmUgd3JpdHRlbi4gSWYgYSByZWxhdGl2ZSBwYXRoIGlzCisjIGVudGVyZWQsIGl0IHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIHdoZXJlIGRveHlnZW4gd2FzIHN0YXJ0ZWQuIElmCisjIGxlZnQgYmxhbmsgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdpbGwgYmUgdXNlZC4KKworT1VUUFVUX0RJUkVDVE9SWSAgICAgICA9IGRvYy9kb3h5Z2VuL2dlbmVyYXRlZAorCisjIElmIHRoZSBDUkVBVEVfU1VCRElSUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgY3JlYXRlIDQwOTYgc3ViLQorIyBkaXJlY3RvcmllcyAoaW4gMiBsZXZlbHMpIHVuZGVyIHRoZSBvdXRwdXQgZGlyZWN0b3J5IG9mIGVhY2ggb3V0cHV0IGZvcm1hdCBhbmQKKyMgd2lsbCBkaXN0cmlidXRlIHRoZSBnZW5lcmF0ZWQgZmlsZXMgb3ZlciB0aGVzZSBkaXJlY3Rvcmllcy4gRW5hYmxpbmcgdGhpcworIyBvcHRpb24gY2FuIGJlIHVzZWZ1bCB3aGVuIGZlZWRpbmcgZG94eWdlbiBhIGh1Z2UgYW1vdW50IG9mIHNvdXJjZSBmaWxlcywgd2hlcmUKKyMgcHV0dGluZyBhbGwgZ2VuZXJhdGVkIGZpbGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSB3b3VsZCBvdGhlcndpc2UgY2F1c2VzCisjIHBlcmZvcm1hbmNlIHByb2JsZW1zIGZvciB0aGUgZmlsZSBzeXN0ZW0uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQ1JFQVRFX1NVQkRJUlMgICAgICAgICA9IE5PCisKKyMgVGhlIE9VVFBVVF9MQU5HVUFHRSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBsYW5ndWFnZSBpbiB3aGljaCBhbGwKKyMgZG9jdW1lbnRhdGlvbiBnZW5lcmF0ZWQgYnkgZG94eWdlbiBpcyB3cml0dGVuLiBEb3h5Z2VuIHdpbGwgdXNlIHRoaXMKKyMgaW5mb3JtYXRpb24gdG8gZ2VuZXJhdGUgYWxsIGNvbnN0YW50IG91dHB1dCBpbiB0aGUgcHJvcGVyIGxhbmd1YWdlLgorIyBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBBZnJpa2FhbnMsIEFyYWJpYywgQXJtZW5pYW4sIEJyYXppbGlhbiwgQ2F0YWxhbiwgQ2hpbmVzZSwKKyMgQ2hpbmVzZS1UcmFkaXRpb25hbCwgQ3JvYXRpYW4sIEN6ZWNoLCBEYW5pc2gsIER1dGNoLCBFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSwKKyMgRXNwZXJhbnRvLCBGYXJzaSAoUGVyc2lhbiksIEZpbm5pc2gsIEZyZW5jaCwgR2VybWFuLCBHcmVlaywgSHVuZ2FyaWFuLAorIyBJbmRvbmVzaWFuLCBJdGFsaWFuLCBKYXBhbmVzZSwgSmFwYW5lc2UtZW4gKEphcGFuZXNlIHdpdGggRW5nbGlzaCBtZXNzYWdlcyksCisjIEtvcmVhbiwgS29yZWFuLWVuIChLb3JlYW4gd2l0aCBFbmdsaXNoIG1lc3NhZ2VzKSwgTGF0dmlhbiwgTGl0aHVhbmlhbiwKKyMgTWFjZWRvbmlhbiwgTm9yd2VnaWFuLCBQZXJzaWFuIChGYXJzaSksIFBvbGlzaCwgUG9ydHVndWVzZSwgUm9tYW5pYW4sIFJ1c3NpYW4sCisjIFNlcmJpYW4sIFNlcmJpYW4tQ3lyaWxsaWMsIFNsb3ZhaywgU2xvdmVuZSwgU3BhbmlzaCwgU3dlZGlzaCwgVHVya2lzaCwKKyMgVWtyYWluaWFuIGFuZCBWaWV0bmFtZXNlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogRW5nbGlzaC4KKworT1VUUFVUX0xBTkdVQUdFICAgICAgICA9IEVuZ2xpc2gKKworIyBJZiB0aGUgQlJJRUZfTUVNQkVSX0RFU0MgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGluY2x1ZGUgYnJpZWYgbWVtYmVyCisjIGRlc2NyaXB0aW9ucyBhZnRlciB0aGUgbWVtYmVycyB0aGF0IGFyZSBsaXN0ZWQgaW4gdGhlIGZpbGUgYW5kIGNsYXNzCisjIGRvY3VtZW50YXRpb24gKHNpbWlsYXIgdG8gSmF2YWRvYykuIFNldCB0byBOTyB0byBkaXNhYmxlIHRoaXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0JSSUVGX01FTUJFUl9ERVNDICAgICAgPSBZRVMKKworIyBJZiB0aGUgUkVQRUFUX0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBwcmVwZW5kIHRoZSBicmllZgorIyBkZXNjcmlwdGlvbiBvZiBhIG1lbWJlciBvciBmdW5jdGlvbiBiZWZvcmUgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uCisjCisjIE5vdGU6IElmIGJvdGggSElERV9VTkRPQ19NRU1CRVJTIGFuZCBCUklFRl9NRU1CRVJfREVTQyBhcmUgc2V0IHRvIE5PLCB0aGUKKyMgYnJpZWYgZGVzY3JpcHRpb25zIHdpbGwgYmUgY29tcGxldGVseSBzdXBwcmVzc2VkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitSRVBFQVRfQlJJRUYgICAgICAgICAgID0gWUVTCisKKyMgVGhpcyB0YWcgaW1wbGVtZW50cyBhIHF1YXNpLWludGVsbGlnZW50IGJyaWVmIGRlc2NyaXB0aW9uIGFiYnJldmlhdG9yIHRoYXQgaXMKKyMgdXNlZCB0byBmb3JtIHRoZSB0ZXh0IGluIHZhcmlvdXMgbGlzdGluZ3MuIEVhY2ggc3RyaW5nIGluIHRoaXMgbGlzdCwgaWYgZm91bmQKKyMgYXMgdGhlIGxlYWRpbmcgdGV4dCBvZiB0aGUgYnJpZWYgZGVzY3JpcHRpb24sIHdpbGwgYmUgc3RyaXBwZWQgZnJvbSB0aGUgdGV4dAorIyBhbmQgdGhlIHJlc3VsdCwgYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgd2hvbGUgbGlzdCwgaXMgdXNlZCBhcyB0aGUgYW5ub3RhdGVkCisjIHRleHQuIE90aGVyd2lzZSwgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIGlzIHVzZWQgYXMtaXMuIElmIGxlZnQgYmxhbmssIHRoZQorIyBmb2xsb3dpbmcgdmFsdWVzIGFyZSB1c2VkICgkbmFtZSBpcyBhdXRvbWF0aWNhbGx5IHJlcGxhY2VkIHdpdGggdGhlIG5hbWUgb2YKKyMgdGhlIGVudGl0eSk6VGhlICRuYW1lIGNsYXNzLCBUaGUgJG5hbWUgd2lkZ2V0LCBUaGUgJG5hbWUgZmlsZSwgaXMsIHByb3ZpZGVzLAorIyBzcGVjaWZpZXMsIGNvbnRhaW5zLCByZXByZXNlbnRzLCBhLCBhbiBhbmQgdGhlLgorCitBQkJSRVZJQVRFX0JSSUVGICAgICAgID0gIlRoZSAkbmFtZSBjbGFzcyIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgJG5hbWUgd2lkZ2V0IiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSAkbmFtZSBmaWxlIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhlCisKKyMgSWYgdGhlIEFMV0FZU19ERVRBSUxFRF9TRUMgYW5kIFJFUEVBVF9CUklFRiB0YWdzIGFyZSBib3RoIHNldCB0byBZRVMgdGhlbgorIyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBkZXRhaWxlZCBzZWN0aW9uIGV2ZW4gaWYgdGhlcmUgaXMgb25seSBhIGJyaWVmCisjIGRlc2NyaXB0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0FMV0FZU19ERVRBSUxFRF9TRUMgICAgPSBOTworCisjIElmIHRoZSBJTkxJTkVfSU5IRVJJVEVEX01FTUIgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBzaG93IGFsbAorIyBpbmhlcml0ZWQgbWVtYmVycyBvZiBhIGNsYXNzIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoYXQgY2xhc3MgYXMgaWYgdGhvc2UKKyMgbWVtYmVycyB3ZXJlIG9yZGluYXJ5IGNsYXNzIG1lbWJlcnMuIENvbnN0cnVjdG9ycywgZGVzdHJ1Y3RvcnMgYW5kIGFzc2lnbm1lbnQKKyMgb3BlcmF0b3JzIG9mIHRoZSBiYXNlIGNsYXNzZXMgd2lsbCBub3QgYmUgc2hvd24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSU5MSU5FX0lOSEVSSVRFRF9NRU1CICA9IE5PCisKKyMgSWYgdGhlIEZVTExfUEFUSF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgcHJlcGVuZCB0aGUgZnVsbCBwYXRoCisjIGJlZm9yZSBmaWxlcyBuYW1lIGluIHRoZSBmaWxlIGxpc3QgYW5kIGluIHRoZSBoZWFkZXIgZmlsZXMuIElmIHNldCB0byBOTyB0aGUKKyMgc2hvcnRlc3QgcGF0aCB0aGF0IG1ha2VzIHRoZSBmaWxlIG5hbWUgdW5pcXVlIHdpbGwgYmUgdXNlZAorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitGVUxMX1BBVEhfTkFNRVMgICAgICAgID0gWUVTCisKKyMgVGhlIFNUUklQX0ZST01fUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZiB0aGUgcGF0aC4KKyMgU3RyaXBwaW5nIGlzIG9ubHkgZG9uZSBpZiBvbmUgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIG1hdGNoZXMgdGhlIGxlZnQtaGFuZAorIyBwYXJ0IG9mIHRoZSBwYXRoLiBUaGUgdGFnIGNhbiBiZSB1c2VkIHRvIHNob3cgcmVsYXRpdmUgcGF0aHMgaW4gdGhlIGZpbGUgbGlzdC4KKyMgSWYgbGVmdCBibGFuayB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggZG94eWdlbiBpcyBydW4gaXMgdXNlZCBhcyB0aGUgcGF0aCB0bworIyBzdHJpcC4KKyMKKyMgTm90ZSB0aGF0IHlvdSBjYW4gc3BlY2lmeSBhYnNvbHV0ZSBwYXRocyBoZXJlLCBidXQgYWxzbyByZWxhdGl2ZSBwYXRocywgd2hpY2gKKyMgd2lsbCBiZSByZWxhdGl2ZSBmcm9tIHRoZSBkaXJlY3Rvcnkgd2hlcmUgZG94eWdlbiBpcyBzdGFydGVkLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRlVMTF9QQVRIX05BTUVTIGlzIHNldCB0byBZRVMuCisKK1NUUklQX0ZST01fUEFUSCAgICAgICAgPSBzcmMvCisKKyMgVGhlIFNUUklQX0ZST01fSU5DX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHN0cmlwIGEgdXNlci1kZWZpbmVkIHBhcnQgb2YgdGhlCisjIHBhdGggbWVudGlvbmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIGEgY2xhc3MsIHdoaWNoIHRlbGxzIHRoZSByZWFkZXIgd2hpY2gKKyMgaGVhZGVyIGZpbGUgdG8gaW5jbHVkZSBpbiBvcmRlciB0byB1c2UgYSBjbGFzcy4gSWYgbGVmdCBibGFuayBvbmx5IHRoZSBuYW1lIG9mCisjIHRoZSBoZWFkZXIgZmlsZSBjb250YWluaW5nIHRoZSBjbGFzcyBkZWZpbml0aW9uIGlzIHVzZWQuIE90aGVyd2lzZSBvbmUgc2hvdWxkCisjIHNwZWNpZnkgdGhlIGxpc3Qgb2YgaW5jbHVkZSBwYXRocyB0aGF0IGFyZSBub3JtYWxseSBwYXNzZWQgdG8gdGhlIGNvbXBpbGVyCisjIHVzaW5nIHRoZSAtSSBmbGFnLgorCitTVFJJUF9GUk9NX0lOQ19QQVRIICAgID0gc3JjLworCisjIElmIHRoZSBTSE9SVF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIG11Y2ggc2hvcnRlciAoYnV0CisjIGxlc3MgcmVhZGFibGUpIGZpbGUgbmFtZXMuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpcyB5b3VyIGZpbGUgc3lzdGVtcyBkb2Vzbid0CisjIHN1cHBvcnQgbG9uZyBuYW1lcyBsaWtlIG9uIERPUywgTWFjLCBvciBDRC1ST00uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU0hPUlRfTkFNRVMgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEpBVkFET0NfQVVUT0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGludGVycHJldCB0aGUKKyMgZmlyc3QgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBKYXZhZG9jLXN0eWxlIGNvbW1lbnQgYXMgdGhlIGJyaWVmCisjIGRlc2NyaXB0aW9uLiBJZiBzZXQgdG8gTk8sIHRoZSBKYXZhZG9jLXN0eWxlIHdpbGwgYmVoYXZlIGp1c3QgbGlrZSByZWd1bGFyIFF0LQorIyBzdHlsZSBjb21tZW50cyAodGh1cyByZXF1aXJpbmcgYW4gZXhwbGljaXQgQGJyaWVmIGNvbW1hbmQgZm9yIGEgYnJpZWYKKyMgZGVzY3JpcHRpb24uKQorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0pBVkFET0NfQVVUT0JSSUVGICAgICAgPSBOTworCisjIElmIHRoZSBRVF9BVVRPQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgaW50ZXJwcmV0IHRoZSBmaXJzdAorIyBsaW5lICh1bnRpbCB0aGUgZmlyc3QgZG90KSBvZiBhIFF0LXN0eWxlIGNvbW1lbnQgYXMgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLiBJZgorIyBzZXQgdG8gTk8sIHRoZSBRdC1zdHlsZSB3aWxsIGJlaGF2ZSBqdXN0IGxpa2UgcmVndWxhciBRdC1zdHlsZSBjb21tZW50cyAodGh1cworIyByZXF1aXJpbmcgYW4gZXhwbGljaXQgXGJyaWVmIGNvbW1hbmQgZm9yIGEgYnJpZWYgZGVzY3JpcHRpb24uKQorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1FUX0FVVE9CUklFRiAgICAgICAgICAgPSBOTworCisjIFRoZSBNVUxUSUxJTkVfQ1BQX0lTX0JSSUVGIHRhZyBjYW4gYmUgc2V0IHRvIFlFUyB0byBtYWtlIGRveHlnZW4gdHJlYXQgYQorIyBtdWx0aS1saW5lIEMrKyBzcGVjaWFsIGNvbW1lbnQgYmxvY2sgKGkuZS4gYSBibG9jayBvZiAvLyEgb3IgLy8vIGNvbW1lbnRzKSBhcworIyBhIGJyaWVmIGRlc2NyaXB0aW9uLiBUaGlzIHVzZWQgdG8gYmUgdGhlIGRlZmF1bHQgYmVoYXZpb3IuIFRoZSBuZXcgZGVmYXVsdCBpcworIyB0byB0cmVhdCBhIG11bHRpLWxpbmUgQysrIGNvbW1lbnQgYmxvY2sgYXMgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbi4gU2V0IHRoaXMKKyMgdGFnIHRvIFlFUyBpZiB5b3UgcHJlZmVyIHRoZSBvbGQgYmVoYXZpb3IgaW5zdGVhZC4KKyMKKyMgTm90ZSB0aGF0IHNldHRpbmcgdGhpcyB0YWcgdG8gWUVTIGFsc28gbWVhbnMgdGhhdCByYXRpb25hbCByb3NlIGNvbW1lbnRzIGFyZQorIyBub3QgcmVjb2duaXplZCBhbnkgbW9yZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitNVUxUSUxJTkVfQ1BQX0lTX0JSSUVGID0gTk8KKworIyBJZiB0aGUgSU5IRVJJVF9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gYW4gdW5kb2N1bWVudGVkIG1lbWJlciBpbmhlcml0cyB0aGUKKyMgZG9jdW1lbnRhdGlvbiBmcm9tIGFueSBkb2N1bWVudGVkIG1lbWJlciB0aGF0IGl0IHJlLWltcGxlbWVudHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0lOSEVSSVRfRE9DUyAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgU0VQQVJBVEVfTUVNQkVSX1BBR0VTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCBwcm9kdWNlIGEKKyMgbmV3IHBhZ2UgZm9yIGVhY2ggbWVtYmVyLiBJZiBzZXQgdG8gTk8sIHRoZSBkb2N1bWVudGF0aW9uIG9mIGEgbWVtYmVyIHdpbGwgYmUKKyMgcGFydCBvZiB0aGUgZmlsZS9jbGFzcy9uYW1lc3BhY2UgdGhhdCBjb250YWlucyBpdC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTRVBBUkFURV9NRU1CRVJfUEFHRVMgID0gTk8KKworIyBUaGUgVEFCX1NJWkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbnVtYmVyIG9mIHNwYWNlcyBpbiBhIHRhYi4gRG94eWdlbgorIyB1c2VzIHRoaXMgdmFsdWUgdG8gcmVwbGFjZSB0YWJzIGJ5IHNwYWNlcyBpbiBjb2RlIGZyYWdtZW50cy4KKyMgTWluaW11bSB2YWx1ZTogMSwgbWF4aW11bSB2YWx1ZTogMTYsIGRlZmF1bHQgdmFsdWU6IDQuCisKK1RBQl9TSVpFICAgICAgICAgICAgICAgPSA4CisKKyMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIG51bWJlciBvZiBhbGlhc2VzIHRoYXQgYWN0IGFzIGNvbW1hbmRzIGluCisjIHRoZSBkb2N1bWVudGF0aW9uLiBBbiBhbGlhcyBoYXMgdGhlIGZvcm06CisjIG5hbWU9dmFsdWUKKyMgRm9yIGV4YW1wbGUgYWRkaW5nCisjICJzaWRlZWZmZWN0PUBwYXIgU2lkZSBFZmZlY3RzOlxuIgorIyB3aWxsIGFsbG93IHlvdSB0byBwdXQgdGhlIGNvbW1hbmQgXHNpZGVlZmZlY3QgKG9yIEBzaWRlZWZmZWN0KSBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbiwgd2hpY2ggd2lsbCByZXN1bHQgaW4gYSB1c2VyLWRlZmluZWQgcGFyYWdyYXBoIHdpdGggaGVhZGluZworIyAiU2lkZSBFZmZlY3RzOiIuIFlvdSBjYW4gcHV0IFxuJ3MgaW4gdGhlIHZhbHVlIHBhcnQgb2YgYW4gYWxpYXMgdG8gaW5zZXJ0CisjIG5ld2xpbmVzLgorCitBTElBU0VTICAgICAgICAgICAgICAgID0gCisKKyMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIG51bWJlciBvZiB3b3JkLWtleXdvcmQgbWFwcGluZ3MgKFRDTCBvbmx5KS4KKyMgQSBtYXBwaW5nIGhhcyB0aGUgZm9ybSAibmFtZT12YWx1ZSIuIEZvciBleGFtcGxlIGFkZGluZyAiY2xhc3M9aXRjbDo6Y2xhc3MiCisjIHdpbGwgYWxsb3cgeW91IHRvIHVzZSB0aGUgY29tbWFuZCBjbGFzcyBpbiB0aGUgaXRjbDo6Y2xhc3MgbWVhbmluZy4KKworVENMX1NVQlNUICAgICAgICAgICAgICA9IAorCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX0ZPUl9DIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEMgc291cmNlcworIyBvbmx5LiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyBtb3JlIHRhaWxvcmVkIGZvciBDLiBGb3IKKyMgaW5zdGFuY2UsIHNvbWUgb2YgdGhlIG5hbWVzIHRoYXQgYXJlIHVzZWQgd2lsbCBiZSBkaWZmZXJlbnQuIFRoZSBsaXN0IG9mIGFsbAorIyBtZW1iZXJzIHdpbGwgYmUgb21pdHRlZCwgZXRjLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK09QVElNSVpFX09VVFBVVF9GT1JfQyAgPSBOTworCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX0pBVkEgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgSmF2YSBvcgorIyBQeXRob24gc291cmNlcyBvbmx5LiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyBtb3JlIHRhaWxvcmVkCisjIGZvciB0aGF0IGxhbmd1YWdlLiBGb3IgaW5zdGFuY2UsIG5hbWVzcGFjZXMgd2lsbCBiZSBwcmVzZW50ZWQgYXMgcGFja2FnZXMsCisjIHF1YWxpZmllZCBzY29wZXMgd2lsbCBsb29rIGRpZmZlcmVudCwgZXRjLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK09QVElNSVpFX09VVFBVVF9KQVZBICAgPSBOTworCisjIFNldCB0aGUgT1BUSU1JWkVfRk9SX0ZPUlRSQU4gdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgRm9ydHJhbgorIyBzb3VyY2VzLiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyB0YWlsb3JlZCBmb3IgRm9ydHJhbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitPUFRJTUlaRV9GT1JfRk9SVFJBTiAgID0gTk8KKworIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9WSERMIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIFZIREwKKyMgc291cmNlcy4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgdGFpbG9yZWQgZm9yIFZIREwuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworT1BUSU1JWkVfT1VUUFVUX1ZIREwgICA9IE5PCisKKyMgRG94eWdlbiBzZWxlY3RzIHRoZSBwYXJzZXIgdG8gdXNlIGRlcGVuZGluZyBvbiB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBmaWxlcyBpdAorIyBwYXJzZXMuIFdpdGggdGhpcyB0YWcgeW91IGNhbiBhc3NpZ24gd2hpY2ggcGFyc2VyIHRvIHVzZSBmb3IgYSBnaXZlbgorIyBleHRlbnNpb24uIERveHlnZW4gaGFzIGEgYnVpbHQtaW4gbWFwcGluZywgYnV0IHlvdSBjYW4gb3ZlcnJpZGUgb3IgZXh0ZW5kIGl0CisjIHVzaW5nIHRoaXMgdGFnLiBUaGUgZm9ybWF0IGlzIGV4dD1sYW5ndWFnZSwgd2hlcmUgZXh0IGlzIGEgZmlsZSBleHRlbnNpb24sIGFuZAorIyBsYW5ndWFnZSBpcyBvbmUgb2YgdGhlIHBhcnNlcnMgc3VwcG9ydGVkIGJ5IGRveHlnZW46IElETCwgSmF2YSwgSmF2YXNjcmlwdCwKKyMgQyMsIEMsIEMrKywgRCwgUEhQLCBPYmplY3RpdmUtQywgUHl0aG9uLCBGb3J0cmFuLCBWSERMLiBGb3IgaW5zdGFuY2UgdG8gbWFrZQorIyBkb3h5Z2VuIHRyZWF0IC5pbmMgZmlsZXMgYXMgRm9ydHJhbiBmaWxlcyAoZGVmYXVsdCBpcyBQSFApLCBhbmQgLmYgZmlsZXMgYXMgQworIyAoZGVmYXVsdCBpcyBGb3J0cmFuKSwgdXNlOiBpbmM9Rm9ydHJhbiBmPUMuCisjCisjIE5vdGUgRm9yIGZpbGVzIHdpdGhvdXQgZXh0ZW5zaW9uIHlvdSBjYW4gdXNlIG5vX2V4dGVuc2lvbiBhcyBhIHBsYWNlaG9sZGVyLgorIworIyBOb3RlIHRoYXQgZm9yIGN1c3RvbSBleHRlbnNpb25zIHlvdSBhbHNvIG5lZWQgdG8gc2V0IEZJTEVfUEFUVEVSTlMgb3RoZXJ3aXNlCisjIHRoZSBmaWxlcyBhcmUgbm90IHJlYWQgYnkgZG94eWdlbi4KKworRVhURU5TSU9OX01BUFBJTkcgICAgICA9IAorCisjIElmIHRoZSBNQVJLRE9XTl9TVVBQT1JUIHRhZyBpcyBlbmFibGVkIHRoZW4gZG94eWdlbiBwcmUtcHJvY2Vzc2VzIGFsbCBjb21tZW50cworIyBhY2NvcmRpbmcgdG8gdGhlIE1hcmtkb3duIGZvcm1hdCwgd2hpY2ggYWxsb3dzIGZvciBtb3JlIHJlYWRhYmxlCisjIGRvY3VtZW50YXRpb24uIFNlZSBodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duLyBmb3IgZGV0YWlscy4KKyMgVGhlIG91dHB1dCBvZiBtYXJrZG93biBwcm9jZXNzaW5nIGlzIGZ1cnRoZXIgcHJvY2Vzc2VkIGJ5IGRveHlnZW4sIHNvIHlvdSBjYW4KKyMgbWl4IGRveHlnZW4sIEhUTUwsIGFuZCBYTUwgY29tbWFuZHMgd2l0aCBNYXJrZG93biBmb3JtYXR0aW5nLiBEaXNhYmxlIG9ubHkgaW4KKyMgY2FzZSBvZiBiYWNrd2FyZCBjb21wYXRpYmlsaXRpZXMgaXNzdWVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitNQVJLRE9XTl9TVVBQT1JUICAgICAgID0gWUVTCisKKyMgV2hlbiBlbmFibGVkIGRveHlnZW4gdHJpZXMgdG8gbGluayB3b3JkcyB0aGF0IGNvcnJlc3BvbmQgdG8gZG9jdW1lbnRlZAorIyBjbGFzc2VzLCBvciBuYW1lc3BhY2VzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgZG9jdW1lbnRhdGlvbi4gU3VjaCBhIGxpbmsgY2FuCisjIGJlIHByZXZlbnRlZCBpbiBpbmRpdmlkdWFsIGNhc2VzIGJ5IGJ5IHB1dHRpbmcgYSAlIHNpZ24gaW4gZnJvbnQgb2YgdGhlIHdvcmQKKyMgb3IgZ2xvYmFsbHkgYnkgc2V0dGluZyBBVVRPTElOS19TVVBQT1JUIHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitBVVRPTElOS19TVVBQT1JUICAgICAgID0gWUVTCisKKyMgSWYgeW91IHVzZSBTVEwgY2xhc3NlcyAoaS5lLiBzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3IsIGV0Yy4pIGJ1dCBkbyBub3Qgd2FudAorIyB0byBpbmNsdWRlIChhIHRhZyBmaWxlIGZvcikgdGhlIFNUTCBzb3VyY2VzIGFzIGlucHV0LCB0aGVuIHlvdSBzaG91bGQgc2V0IHRoaXMKKyMgdGFnIHRvIFlFUyBpbiBvcmRlciB0byBsZXQgZG94eWdlbiBtYXRjaCBmdW5jdGlvbnMgZGVjbGFyYXRpb25zIGFuZAorIyBkZWZpbml0aW9ucyB3aG9zZSBhcmd1bWVudHMgY29udGFpbiBTVEwgY2xhc3NlcyAoZS5nLiBmdW5jKHN0ZDo6c3RyaW5nKTsKKyMgdmVyc3VzIGZ1bmMoc3RkOjpzdHJpbmcpIHt9KS4gVGhpcyBhbHNvIG1ha2UgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uCisjIGRpYWdyYW1zIHRoYXQgaW52b2x2ZSBTVEwgY2xhc3NlcyBtb3JlIGNvbXBsZXRlIGFuZCBhY2N1cmF0ZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitCVUlMVElOX1NUTF9TVVBQT1JUICAgID0gTk8KKworIyBJZiB5b3UgdXNlIE1pY3Jvc29mdCdzIEMrKy9DTEkgbGFuZ3VhZ2UsIHlvdSBzaG91bGQgc2V0IHRoaXMgb3B0aW9uIHRvIFlFUyB0bworIyBlbmFibGUgcGFyc2luZyBzdXBwb3J0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0NQUF9DTElfU1VQUE9SVCAgICAgICAgPSBOTworCisjIFNldCB0aGUgU0lQX1NVUFBPUlQgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2Ygc2lwIChzZWU6CisjIGh0dHA6Ly93d3cucml2ZXJiYW5rY29tcHV0aW5nLmNvLnVrL3NvZnR3YXJlL3NpcC9pbnRybykgc291cmNlcyBvbmx5LiBEb3h5Z2VuCisjIHdpbGwgcGFyc2UgdGhlbSBsaWtlIG5vcm1hbCBDKysgYnV0IHdpbGwgYXNzdW1lIGFsbCBjbGFzc2VzIHVzZSBwdWJsaWMgaW5zdGVhZAorIyBvZiBwcml2YXRlIGluaGVyaXRhbmNlIHdoZW4gbm8gZXhwbGljaXQgcHJvdGVjdGlvbiBrZXl3b3JkIGlzIHByZXNlbnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU0lQX1NVUFBPUlQgICAgICAgICAgICA9IE5PCisKKyMgRm9yIE1pY3Jvc29mdCdzIElETCB0aGVyZSBhcmUgcHJvcGdldCBhbmQgcHJvcHB1dCBhdHRyaWJ1dGVzIHRvIGluZGljYXRlCisjIGdldHRlciBhbmQgc2V0dGVyIG1ldGhvZHMgZm9yIGEgcHJvcGVydHkuIFNldHRpbmcgdGhpcyBvcHRpb24gdG8gWUVTIHdpbGwgbWFrZQorIyBkb3h5Z2VuIHRvIHJlcGxhY2UgdGhlIGdldCBhbmQgc2V0IG1ldGhvZHMgYnkgYSBwcm9wZXJ0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhpcyB3aWxsIG9ubHkgd29yayBpZiB0aGUgbWV0aG9kcyBhcmUgaW5kZWVkIGdldHRpbmcgb3Igc2V0dGluZyBhIHNpbXBsZQorIyB0eXBlLiBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgb3IgeW91IHdhbnQgdG8gc2hvdyB0aGUgbWV0aG9kcyBhbnl3YXksIHlvdQorIyBzaG91bGQgc2V0IHRoaXMgb3B0aW9uIHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitJRExfUFJPUEVSVFlfU1VQUE9SVCAgID0gWUVTCisKKyMgSWYgbWVtYmVyIGdyb3VwaW5nIGlzIHVzZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kIHRoZSBESVNUUklCVVRFX0dST1VQX0RPQworIyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgcmV1c2UgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGZpcnN0CisjIG1lbWJlciBpbiB0aGUgZ3JvdXAgKGlmIGFueSkgZm9yIHRoZSBvdGhlciBtZW1iZXJzIG9mIHRoZSBncm91cC4gQnkgZGVmYXVsdAorIyBhbGwgbWVtYmVycyBvZiBhIGdyb3VwIG11c3QgYmUgZG9jdW1lbnRlZCBleHBsaWNpdGx5LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0RJU1RSSUJVVEVfR1JPVVBfRE9DICAgPSBOTworCisjIFNldCB0aGUgU1VCR1JPVVBJTkcgdGFnIHRvIFlFUyB0byBhbGxvdyBjbGFzcyBtZW1iZXIgZ3JvdXBzIG9mIHRoZSBzYW1lIHR5cGUKKyMgKGZvciBpbnN0YW5jZSBhIGdyb3VwIG9mIHB1YmxpYyBmdW5jdGlvbnMpIHRvIGJlIHB1dCBhcyBhIHN1Ymdyb3VwIG9mIHRoYXQKKyMgdHlwZSAoZS5nLiB1bmRlciB0aGUgUHVibGljIEZ1bmN0aW9ucyBzZWN0aW9uKS4gU2V0IGl0IHRvIE5PIHRvIHByZXZlbnQKKyMgc3ViZ3JvdXBpbmcuIEFsdGVybmF0aXZlbHksIHRoaXMgY2FuIGJlIGRvbmUgcGVyIGNsYXNzIHVzaW5nIHRoZQorIyBcbm9zdWJncm91cGluZyBjb21tYW5kLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTVUJHUk9VUElORyAgICAgICAgICAgID0gWUVTCisKKyMgV2hlbiB0aGUgSU5MSU5FX0dST1VQRURfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgY2xhc3Nlcywgc3RydWN0cyBhbmQgdW5pb25zCisjIGFyZSBzaG93biBpbnNpZGUgdGhlIGdyb3VwIGluIHdoaWNoIHRoZXkgYXJlIGluY2x1ZGVkIChlLmcuIHVzaW5nIFxpbmdyb3VwKQorIyBpbnN0ZWFkIG9mIG9uIGEgc2VwYXJhdGUgcGFnZSAoZm9yIEhUTUwgYW5kIE1hbiBwYWdlcykgb3Igc2VjdGlvbiAoZm9yIExhVGVYCisjIGFuZCBSVEYpLgorIworIyBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGRvZXMgbm90IHdvcmsgaW4gY29tYmluYXRpb24gd2l0aAorIyBTRVBBUkFURV9NRU1CRVJfUEFHRVMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSU5MSU5FX0dST1VQRURfQ0xBU1NFUyA9IE5PCisKKyMgV2hlbiB0aGUgSU5MSU5FX1NJTVBMRV9TVFJVQ1RTIHRhZyBpcyBzZXQgdG8gWUVTLCBzdHJ1Y3RzLCBjbGFzc2VzLCBhbmQgdW5pb25zCisjIHdpdGggb25seSBwdWJsaWMgZGF0YSBmaWVsZHMgb3Igc2ltcGxlIHR5cGVkZWYgZmllbGRzIHdpbGwgYmUgc2hvd24gaW5saW5lIGluCisjIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBzY29wZSBpbiB3aGljaCB0aGV5IGFyZSBkZWZpbmVkIChpLmUuIGZpbGUsCisjIG5hbWVzcGFjZSwgb3IgZ3JvdXAgZG9jdW1lbnRhdGlvbiksIHByb3ZpZGVkIHRoaXMgc2NvcGUgaXMgZG9jdW1lbnRlZC4gSWYgc2V0CisjIHRvIE5PLCBzdHJ1Y3RzLCBjbGFzc2VzLCBhbmQgdW5pb25zIGFyZSBzaG93biBvbiBhIHNlcGFyYXRlIHBhZ2UgKGZvciBIVE1MIGFuZAorIyBNYW4gcGFnZXMpIG9yIHNlY3Rpb24gKGZvciBMYVRlWCBhbmQgUlRGKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTkxJTkVfU0lNUExFX1NUUlVDVFMgID0gTk8KKworIyBXaGVuIFRZUEVERUZfSElERVNfU1RSVUNUIHRhZyBpcyBlbmFibGVkLCBhIHR5cGVkZWYgb2YgYSBzdHJ1Y3QsIHVuaW9uLCBvcgorIyBlbnVtIGlzIGRvY3VtZW50ZWQgYXMgc3RydWN0LCB1bmlvbiwgb3IgZW51bSB3aXRoIHRoZSBuYW1lIG9mIHRoZSB0eXBlZGVmLiBTbworIyB0eXBlZGVmIHN0cnVjdCBUeXBlUyB7fSBUeXBlVCwgd2lsbCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXMgYSBzdHJ1Y3QKKyMgd2l0aCBuYW1lIFR5cGVULiBXaGVuIGRpc2FibGVkIHRoZSB0eXBlZGVmIHdpbGwgYXBwZWFyIGFzIGEgbWVtYmVyIG9mIGEgZmlsZSwKKyMgbmFtZXNwYWNlLCBvciBjbGFzcy4gQW5kIHRoZSBzdHJ1Y3Qgd2lsbCBiZSBuYW1lZCBUeXBlUy4gVGhpcyBjYW4gdHlwaWNhbGx5IGJlCisjIHVzZWZ1bCBmb3IgQyBjb2RlIGluIGNhc2UgdGhlIGNvZGluZyBjb252ZW50aW9uIGRpY3RhdGVzIHRoYXQgYWxsIGNvbXBvdW5kCisjIHR5cGVzIGFyZSB0eXBlZGVmJ2VkIGFuZCBvbmx5IHRoZSB0eXBlZGVmIGlzIHJlZmVyZW5jZWQsIG5ldmVyIHRoZSB0YWcgbmFtZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitUWVBFREVGX0hJREVTX1NUUlVDVCAgID0gTk8KKworIyBUaGUgc2l6ZSBvZiB0aGUgc3ltYm9sIGxvb2t1cCBjYWNoZSBjYW4gYmUgc2V0IHVzaW5nIExPT0tVUF9DQUNIRV9TSVpFLiBUaGlzCisjIGNhY2hlIGlzIHVzZWQgdG8gcmVzb2x2ZSBzeW1ib2xzIGdpdmVuIHRoZWlyIG5hbWUgYW5kIHNjb3BlLiBTaW5jZSB0aGlzIGNhbiBiZQorIyBhbiBleHBlbnNpdmUgcHJvY2VzcyBhbmQgb2Z0ZW4gdGhlIHNhbWUgc3ltYm9sIGFwcGVhcnMgbXVsdGlwbGUgdGltZXMgaW4gdGhlCisjIGNvZGUsIGRveHlnZW4ga2VlcHMgYSBjYWNoZSBvZiBwcmUtcmVzb2x2ZWQgc3ltYm9scy4gSWYgdGhlIGNhY2hlIGlzIHRvbyBzbWFsbAorIyBkb3h5Z2VuIHdpbGwgYmVjb21lIHNsb3dlci4gSWYgdGhlIGNhY2hlIGlzIHRvbyBsYXJnZSwgbWVtb3J5IGlzIHdhc3RlZC4gVGhlCisjIGNhY2hlIHNpemUgaXMgZ2l2ZW4gYnkgdGhpcyBmb3JtdWxhOiAyXigxNitMT09LVVBfQ0FDSEVfU0laRSkuIFRoZSB2YWxpZCByYW5nZQorIyBpcyAwLi45LCB0aGUgZGVmYXVsdCBpcyAwLCBjb3JyZXNwb25kaW5nIHRvIGEgY2FjaGUgc2l6ZSBvZiAyXjE2PTY1NTM2CisjIHN5bWJvbHMuIEF0IHRoZSBlbmQgb2YgYSBydW4gZG94eWdlbiB3aWxsIHJlcG9ydCB0aGUgY2FjaGUgdXNhZ2UgYW5kIHN1Z2dlc3QKKyMgdGhlIG9wdGltYWwgY2FjaGUgc2l6ZSBmcm9tIGEgc3BlZWQgcG9pbnQgb2Ygdmlldy4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogOSwgZGVmYXVsdCB2YWx1ZTogMC4KKworTE9PS1VQX0NBQ0hFX1NJWkUgICAgICA9IDAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBCdWlsZCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBFWFRSQUNUX0FMTCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgYXNzdW1lIGFsbCBlbnRpdGllcyBpbgorIyBkb2N1bWVudGF0aW9uIGFyZSBkb2N1bWVudGVkLCBldmVuIGlmIG5vIGRvY3VtZW50YXRpb24gd2FzIGF2YWlsYWJsZS4gUHJpdmF0ZQorIyBjbGFzcyBtZW1iZXJzIGFuZCBzdGF0aWMgZmlsZSBtZW1iZXJzIHdpbGwgYmUgaGlkZGVuIHVubGVzcyB0aGUKKyMgRVhUUkFDVF9QUklWQVRFIHJlc3BlY3RpdmVseSBFWFRSQUNUX1NUQVRJQyB0YWdzIGFyZSBzZXQgdG8gWUVTLgorIyBOb3RlOiBUaGlzIHdpbGwgYWxzbyBkaXNhYmxlIHRoZSB3YXJuaW5ncyBhYm91dCB1bmRvY3VtZW50ZWQgbWVtYmVycyB0aGF0IGFyZQorIyBub3JtYWxseSBwcm9kdWNlZCB3aGVuIFdBUk5JTkdTIGlzIHNldCB0byBZRVMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9BTEwgICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBFWFRSQUNUX1BSSVZBVEUgdGFnIGlzIHNldCB0byBZRVMgYWxsIHByaXZhdGUgbWVtYmVycyBvZiBhIGNsYXNzIHdpbGwKKyMgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9QUklWQVRFICAgICAgICA9IFlFUworCisjIElmIHRoZSBFWFRSQUNUX1BBQ0tBR0UgdGFnIGlzIHNldCB0byBZRVMgYWxsIG1lbWJlcnMgd2l0aCBwYWNrYWdlIG9yIGludGVybmFsCisjIHNjb3BlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9QQUNLQUdFICAgICAgICA9IFlFUworCisjIElmIHRoZSBFWFRSQUNUX1NUQVRJQyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgc3RhdGljIG1lbWJlcnMgb2YgYSBmaWxlIHdpbGwgYmUKKyMgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9TVEFUSUMgICAgICAgICA9IFlFUworCisjIElmIHRoZSBFWFRSQUNUX0xPQ0FMX0NMQVNTRVMgdGFnIGlzIHNldCB0byBZRVMgY2xhc3NlcyAoYW5kIHN0cnVjdHMpIGRlZmluZWQKKyMgbG9jYWxseSBpbiBzb3VyY2UgZmlsZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gSWYgc2V0IHRvIE5PCisjIG9ubHkgY2xhc3NlcyBkZWZpbmVkIGluIGhlYWRlciBmaWxlcyBhcmUgaW5jbHVkZWQuIERvZXMgbm90IGhhdmUgYW55IGVmZmVjdAorIyBmb3IgSmF2YSBzb3VyY2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitFWFRSQUNUX0xPQ0FMX0NMQVNTRVMgID0gWUVTCisKKyMgVGhpcyBmbGFnIGlzIG9ubHkgdXNlZnVsIGZvciBPYmplY3RpdmUtQyBjb2RlLiBXaGVuIHNldCB0byBZRVMgbG9jYWwgbWV0aG9kcywKKyMgd2hpY2ggYXJlIGRlZmluZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIHNlY3Rpb24gYnV0IG5vdCBpbiB0aGUgaW50ZXJmYWNlIGFyZQorIyBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gSWYgc2V0IHRvIE5PIG9ubHkgbWV0aG9kcyBpbiB0aGUgaW50ZXJmYWNlIGFyZQorIyBpbmNsdWRlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX0xPQ0FMX01FVEhPRFMgID0gTk8KKworIyBJZiB0aGlzIGZsYWcgaXMgc2V0IHRvIFlFUywgdGhlIG1lbWJlcnMgb2YgYW5vbnltb3VzIG5hbWVzcGFjZXMgd2lsbCBiZQorIyBleHRyYWN0ZWQgYW5kIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIG5hbWVzcGFjZSBjYWxsZWQKKyMgJ2Fub255bW91c19uYW1lc3BhY2V7ZmlsZX0nLCB3aGVyZSBmaWxlIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgYmFzZSBuYW1lIG9mCisjIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGFub255bW91cyBuYW1lc3BhY2UuIEJ5IGRlZmF1bHQgYW5vbnltb3VzIG5hbWVzcGFjZQorIyBhcmUgaGlkZGVuLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYVFJBQ1RfQU5PTl9OU1BBQ0VTICAgPSBOTworCisjIElmIHRoZSBISURFX1VORE9DX01FTUJFUlMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBoaWRlIGFsbAorIyB1bmRvY3VtZW50ZWQgbWVtYmVycyBpbnNpZGUgZG9jdW1lbnRlZCBjbGFzc2VzIG9yIGZpbGVzLiBJZiBzZXQgdG8gTk8gdGhlc2UKKyMgbWVtYmVycyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSB2YXJpb3VzIG92ZXJ2aWV3cywgYnV0IG5vIGRvY3VtZW50YXRpb24KKyMgc2VjdGlvbiBpcyBnZW5lcmF0ZWQuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QgaWYgRVhUUkFDVF9BTEwgaXMgZW5hYmxlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX1VORE9DX01FTUJFUlMgICAgID0gTk8KKworIyBJZiB0aGUgSElERV9VTkRPQ19DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaGlkZSBhbGwKKyMgdW5kb2N1bWVudGVkIGNsYXNzZXMgdGhhdCBhcmUgbm9ybWFsbHkgdmlzaWJsZSBpbiB0aGUgY2xhc3MgaGllcmFyY2h5LiBJZiBzZXQKKyMgdG8gTk8gdGhlc2UgY2xhc3NlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSB2YXJpb3VzIG92ZXJ2aWV3cy4gVGhpcyBvcHRpb24gaGFzCisjIG5vIGVmZmVjdCBpZiBFWFRSQUNUX0FMTCBpcyBlbmFibGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0hJREVfVU5ET0NfQ0xBU1NFUyAgICAgPSBOTworCisjIElmIHRoZSBISURFX0ZSSUVORF9DT01QT1VORFMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBoaWRlIGFsbCBmcmllbmQKKyMgKGNsYXNzfHN0cnVjdHx1bmlvbikgZGVjbGFyYXRpb25zLiBJZiBzZXQgdG8gTk8gdGhlc2UgZGVjbGFyYXRpb25zIHdpbGwgYmUKKyMgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9GUklFTkRfQ09NUE9VTkRTICA9IE5PCisKKyMgSWYgdGhlIEhJREVfSU5fQk9EWV9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaGlkZSBhbnkKKyMgZG9jdW1lbnRhdGlvbiBibG9ja3MgZm91bmQgaW5zaWRlIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24uIElmIHNldCB0byBOTyB0aGVzZQorIyBibG9ja3Mgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZnVuY3Rpb24ncyBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIGJsb2NrLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0hJREVfSU5fQk9EWV9ET0NTICAgICAgPSBOTworCisjIFRoZSBJTlRFUk5BTF9ET0NTIHRhZyBkZXRlcm1pbmVzIGlmIGRvY3VtZW50YXRpb24gdGhhdCBpcyB0eXBlZCBhZnRlciBhCisjIFxpbnRlcm5hbCBjb21tYW5kIGlzIGluY2x1ZGVkLiBJZiB0aGUgdGFnIGlzIHNldCB0byBOTyB0aGVuIHRoZSBkb2N1bWVudGF0aW9uCisjIHdpbGwgYmUgZXhjbHVkZWQuIFNldCBpdCB0byBZRVMgdG8gaW5jbHVkZSB0aGUgaW50ZXJuYWwgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTlRFUk5BTF9ET0NTICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgQ0FTRV9TRU5TRV9OQU1FUyB0YWcgaXMgc2V0IHRvIE5PIHRoZW4gZG94eWdlbiB3aWxsIG9ubHkgZ2VuZXJhdGUgZmlsZQorIyBuYW1lcyBpbiBsb3dlci1jYXNlIGxldHRlcnMuIElmIHNldCB0byBZRVMgdXBwZXItY2FzZSBsZXR0ZXJzIGFyZSBhbHNvCisjIGFsbG93ZWQuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBoYXZlIGNsYXNzZXMgb3IgZmlsZXMgd2hvc2UgbmFtZXMgb25seSBkaWZmZXIKKyMgaW4gY2FzZSBhbmQgaWYgeW91ciBmaWxlIHN5c3RlbSBzdXBwb3J0cyBjYXNlIHNlbnNpdGl2ZSBmaWxlIG5hbWVzLiBXaW5kb3dzCisjIGFuZCBNYWMgdXNlcnMgYXJlIGFkdmlzZWQgdG8gc2V0IHRoaXMgb3B0aW9uIHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogc3lzdGVtIGRlcGVuZGVudC4KKworQ0FTRV9TRU5TRV9OQU1FUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfU0NPUEVfTkFNRVMgdGFnIGlzIHNldCB0byBOTyB0aGVuIGRveHlnZW4gd2lsbCBzaG93IG1lbWJlcnMgd2l0aAorIyB0aGVpciBmdWxsIGNsYXNzIGFuZCBuYW1lc3BhY2Ugc2NvcGVzIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gWUVTIHRoZQorIyBzY29wZSB3aWxsIGJlIGhpZGRlbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX1NDT1BFX05BTUVTICAgICAgID0gTk8KKworIyBJZiB0aGUgU0hPV19JTkNMVURFX0ZJTEVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHB1dCBhIGxpc3Qgb2YKKyMgdGhlIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGJ5IGEgZmlsZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGF0IGZpbGUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NIT1dfSU5DTFVERV9GSUxFUyAgICAgPSBZRVMKKworCitTSE9XX0dST1VQRURfTUVNQl9JTkMgID0gTk8KKworIyBJZiB0aGUgRk9SQ0VfTE9DQUxfSU5DTFVERVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgbGlzdCBpbmNsdWRlCisjIGZpbGVzIHdpdGggZG91YmxlIHF1b3RlcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiByYXRoZXIgdGhhbiB3aXRoIHNoYXJwIGJyYWNrZXRzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0ZPUkNFX0xPQ0FMX0lOQ0xVREVTICAgPSBOTworCisjIElmIHRoZSBJTkxJTkVfSU5GTyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGEgdGFnIFtpbmxpbmVdIGlzIGluc2VydGVkIGluIHRoZQorIyBkb2N1bWVudGF0aW9uIGZvciBpbmxpbmUgbWVtYmVycy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworSU5MSU5FX0lORk8gICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBTT1JUX01FTUJFUl9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlCisjIChkZXRhaWxlZCkgZG9jdW1lbnRhdGlvbiBvZiBmaWxlIGFuZCBjbGFzcyBtZW1iZXJzIGFscGhhYmV0aWNhbGx5IGJ5IG1lbWJlcgorIyBuYW1lLiBJZiBzZXQgdG8gTk8gdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4gZGVjbGFyYXRpb24gb3JkZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NPUlRfTUVNQkVSX0RPQ1MgICAgICAgPSBZRVMKKworIyBJZiB0aGUgU09SVF9CUklFRl9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlIGJyaWVmCisjIGRlc2NyaXB0aW9ucyBvZiBmaWxlLCBuYW1lc3BhY2UgYW5kIGNsYXNzIG1lbWJlcnMgYWxwaGFiZXRpY2FsbHkgYnkgbWVtYmVyCisjIG5hbWUuIElmIHNldCB0byBOTyB0aGUgbWVtYmVycyB3aWxsIGFwcGVhciBpbiBkZWNsYXJhdGlvbiBvcmRlci4gTm90ZSB0aGF0CisjIHRoaXMgd2lsbCBhbHNvIGluZmx1ZW5jZSB0aGUgb3JkZXIgb2YgdGhlIGNsYXNzZXMgaW4gdGhlIGNsYXNzIGxpc3QuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09SVF9CUklFRl9ET0NTICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFNPUlRfTUVNQkVSU19DVE9SU18xU1QgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUKKyMgKGJyaWVmIGFuZCBkZXRhaWxlZCkgZG9jdW1lbnRhdGlvbiBvZiBjbGFzcyBtZW1iZXJzIHNvIHRoYXQgY29uc3RydWN0b3JzIGFuZAorIyBkZXN0cnVjdG9ycyBhcmUgbGlzdGVkIGZpcnN0LiBJZiBzZXQgdG8gTk8gdGhlIGNvbnN0cnVjdG9ycyB3aWxsIGFwcGVhciBpbiB0aGUKKyMgcmVzcGVjdGl2ZSBvcmRlcnMgZGVmaW5lZCBieSBTT1JUX0JSSUVGX0RPQ1MgYW5kIFNPUlRfTUVNQkVSX0RPQ1MuCisjIE5vdGU6IElmIFNPUlRfQlJJRUZfRE9DUyBpcyBzZXQgdG8gTk8gdGhpcyBvcHRpb24gaXMgaWdub3JlZCBmb3Igc29ydGluZyBicmllZgorIyBtZW1iZXIgZG9jdW1lbnRhdGlvbi4KKyMgTm90ZTogSWYgU09SVF9NRU1CRVJfRE9DUyBpcyBzZXQgdG8gTk8gdGhpcyBvcHRpb24gaXMgaWdub3JlZCBmb3Igc29ydGluZworIyBkZXRhaWxlZCBtZW1iZXIgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTT1JUX01FTUJFUlNfQ1RPUlNfMVNUID0gTk8KKworIyBJZiB0aGUgU09SVF9HUk9VUF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZSBoaWVyYXJjaHkKKyMgb2YgZ3JvdXAgbmFtZXMgaW50byBhbHBoYWJldGljYWwgb3JkZXIuIElmIHNldCB0byBOTyB0aGUgZ3JvdXAgbmFtZXMgd2lsbAorIyBhcHBlYXIgaW4gdGhlaXIgZGVmaW5lZCBvcmRlci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTT1JUX0dST1VQX05BTUVTICAgICAgID0gTk8KKworIyBJZiB0aGUgU09SVF9CWV9TQ09QRV9OQU1FIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgY2xhc3MgbGlzdCB3aWxsIGJlIHNvcnRlZCBieQorIyBmdWxseS1xdWFsaWZpZWQgbmFtZXMsIGluY2x1ZGluZyBuYW1lc3BhY2VzLiBJZiBzZXQgdG8gTk8sIHRoZSBjbGFzcyBsaXN0IHdpbGwKKyMgYmUgc29ydGVkIG9ubHkgYnkgY2xhc3MgbmFtZSwgbm90IGluY2x1ZGluZyB0aGUgbmFtZXNwYWNlIHBhcnQuCisjIE5vdGU6IFRoaXMgb3B0aW9uIGlzIG5vdCB2ZXJ5IHVzZWZ1bCBpZiBISURFX1NDT1BFX05BTUVTIGlzIHNldCB0byBZRVMuCisjIE5vdGU6IFRoaXMgb3B0aW9uIGFwcGxpZXMgb25seSB0byB0aGUgY2xhc3MgbGlzdCwgbm90IHRvIHRoZSBhbHBoYWJldGljYWwKKyMgbGlzdC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTT1JUX0JZX1NDT1BFX05BTUUgICAgID0gTk8KKworIyBJZiB0aGUgU1RSSUNUX1BST1RPX01BVENISU5HIG9wdGlvbiBpcyBlbmFibGVkIGFuZCBkb3h5Z2VuIGZhaWxzIHRvIGRvIHByb3BlcgorIyB0eXBlIHJlc29sdXRpb24gb2YgYWxsIHBhcmFtZXRlcnMgb2YgYSBmdW5jdGlvbiBpdCB3aWxsIHJlamVjdCBhIG1hdGNoIGJldHdlZW4KKyMgdGhlIHByb3RvdHlwZSBhbmQgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgbWVtYmVyIGZ1bmN0aW9uIGV2ZW4gaWYgdGhlcmUgaXMKKyMgb25seSBvbmUgY2FuZGlkYXRlIG9yIGl0IGlzIG9idmlvdXMgd2hpY2ggY2FuZGlkYXRlIHRvIGNob29zZSBieSBkb2luZyBhCisjIHNpbXBsZSBzdHJpbmcgbWF0Y2guIEJ5IGRpc2FibGluZyBTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgZG94eWdlbiB3aWxsIHN0aWxsCisjIGFjY2VwdCBhIG1hdGNoIGJldHdlZW4gcHJvdG90eXBlIGFuZCBpbXBsZW1lbnRhdGlvbiBpbiBzdWNoIGNhc2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NUUklDVF9QUk9UT19NQVRDSElORyAgPSBOTworCisjIFRoZSBHRU5FUkFURV9UT0RPTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlICggWUVTKSBvciBkaXNhYmxlICggTk8pIHRoZQorIyB0b2RvIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXHRvZG8gY29tbWFuZHMgaW4gdGhlCisjIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0dFTkVSQVRFX1RPRE9MSVNUICAgICAgPSBZRVMKKworIyBUaGUgR0VORVJBVEVfVEVTVExJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoIFlFUykgb3IgZGlzYWJsZSAoIE5PKSB0aGUKKyMgdGVzdCBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0ZXN0IGNvbW1hbmRzIGluIHRoZQorIyBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9URVNUTElTVCAgICAgID0gWUVTCisKKyMgVGhlIEdFTkVSQVRFX0JVR0xJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoIFlFUykgb3IgZGlzYWJsZSAoIE5PKSB0aGUgYnVnCisjIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXGJ1ZyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfQlVHTElTVCAgICAgICA9IFlFUworCisjIFRoZSBHRU5FUkFURV9ERVBSRUNBVEVETElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlICggWUVTKSBvciBkaXNhYmxlICggTk8pCisjIHRoZSBkZXByZWNhdGVkIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXGRlcHJlY2F0ZWQgY29tbWFuZHMgaW4KKyMgdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0dFTkVSQVRFX0RFUFJFQ0FURURMSVNUPSBZRVMKKworIyBUaGUgRU5BQkxFRF9TRUNUSU9OUyB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIGNvbmRpdGlvbmFsIGRvY3VtZW50YXRpb24KKyMgc2VjdGlvbnMsIG1hcmtlZCBieSBcaWYgPHNlY3Rpb25fbGFiZWw+IC4uLiBcZW5kaWYgYW5kIFxjb25kIDxzZWN0aW9uX2xhYmVsPgorIyAuLi4gXGVuZGNvbmQgYmxvY2tzLgorCitFTkFCTEVEX1NFQ1RJT05TICAgICAgID0gCisKKyMgVGhlIE1BWF9JTklUSUFMSVpFUl9MSU5FUyB0YWcgZGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbGluZXMgdGhhdCB0aGUKKyMgaW5pdGlhbCB2YWx1ZSBvZiBhIHZhcmlhYmxlIG9yIG1hY3JvIC8gZGVmaW5lIGNhbiBoYXZlIGZvciBpdCB0byBhcHBlYXIgaW4gdGhlCisjIGRvY3VtZW50YXRpb24uIElmIHRoZSBpbml0aWFsaXplciBjb25zaXN0cyBvZiBtb3JlIGxpbmVzIHRoYW4gc3BlY2lmaWVkIGhlcmUKKyMgaXQgd2lsbCBiZSBoaWRkZW4uIFVzZSBhIHZhbHVlIG9mIDAgdG8gaGlkZSBpbml0aWFsaXplcnMgY29tcGxldGVseS4gVGhlCisjIGFwcGVhcmFuY2Ugb2YgdGhlIHZhbHVlIG9mIGluZGl2aWR1YWwgdmFyaWFibGVzIGFuZCBtYWNyb3MgLyBkZWZpbmVzIGNhbiBiZQorIyBjb250cm9sbGVkIHVzaW5nIFxzaG93aW5pdGlhbGl6ZXIgb3IgXGhpZGVpbml0aWFsaXplciBjb21tYW5kIGluIHRoZQorIyBkb2N1bWVudGF0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhpcyBzZXR0aW5nLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxMDAwMCwgZGVmYXVsdCB2YWx1ZTogMzAuCisKK01BWF9JTklUSUFMSVpFUl9MSU5FUyAgPSAzMAorCisjIFNldCB0aGUgU0hPV19VU0VEX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBsaXN0IG9mIGZpbGVzIGdlbmVyYXRlZCBhdAorIyB0aGUgYm90dG9tIG9mIHRoZSBkb2N1bWVudGF0aW9uIG9mIGNsYXNzZXMgYW5kIHN0cnVjdHMuIElmIHNldCB0byBZRVMgdGhlIGxpc3QKKyMgd2lsbCBtZW50aW9uIHRoZSBmaWxlcyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU0hPV19VU0VEX0ZJTEVTICAgICAgICA9IFlFUworCisjIFNldCB0aGUgU0hPV19GSUxFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgRmlsZXMgcGFnZS4gVGhpcworIyB3aWxsIHJlbW92ZSB0aGUgRmlsZXMgZW50cnkgZnJvbSB0aGUgUXVpY2sgSW5kZXggYW5kIGZyb20gdGhlIEZvbGRlciBUcmVlIFZpZXcKKyMgKGlmIHNwZWNpZmllZCkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NIT1dfRklMRVMgICAgICAgICAgICAgPSBZRVMKKworIyBTZXQgdGhlIFNIT1dfTkFNRVNQQUNFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgTmFtZXNwYWNlcworIyBwYWdlLiBUaGlzIHdpbGwgcmVtb3ZlIHRoZSBOYW1lc3BhY2VzIGVudHJ5IGZyb20gdGhlIFF1aWNrIEluZGV4IGFuZCBmcm9tIHRoZQorIyBGb2xkZXIgVHJlZSBWaWV3IChpZiBzcGVjaWZpZWQpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTSE9XX05BTUVTUEFDRVMgICAgICAgID0gWUVTCisKKyMgVGhlIEZJTEVfVkVSU0lPTl9GSUxURVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwcm9ncmFtIG9yIHNjcmlwdCB0aGF0CisjIGRveHlnZW4gc2hvdWxkIGludm9rZSB0byBnZXQgdGhlIGN1cnJlbnQgdmVyc2lvbiBmb3IgZWFjaCBmaWxlICh0eXBpY2FsbHkgZnJvbQorIyB0aGUgdmVyc2lvbiBjb250cm9sIHN5c3RlbSkuIERveHlnZW4gd2lsbCBpbnZva2UgdGhlIHByb2dyYW0gYnkgZXhlY3V0aW5nICh2aWEKKyMgcG9wZW4oKSkgdGhlIGNvbW1hbmQgY29tbWFuZCBpbnB1dC1maWxlLCB3aGVyZSBjb21tYW5kIGlzIHRoZSB2YWx1ZSBvZiB0aGUKKyMgRklMRV9WRVJTSU9OX0ZJTFRFUiB0YWcsIGFuZCBpbnB1dC1maWxlIGlzIHRoZSBuYW1lIG9mIGFuIGlucHV0IGZpbGUgcHJvdmlkZWQKKyMgYnkgZG94eWdlbi4gV2hhdGV2ZXIgdGhlIHByb2dyYW0gd3JpdGVzIHRvIHN0YW5kYXJkIG91dHB1dCBpcyB1c2VkIGFzIHRoZSBmaWxlCisjIHZlcnNpb24uIEZvciBhbiBleGFtcGxlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbi4KKworRklMRV9WRVJTSU9OX0ZJTFRFUiAgICA9IAorCisjIFRoZSBMQVlPVVRfRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGxheW91dCBmaWxlIHdoaWNoIHdpbGwgYmUgcGFyc2VkCisjIGJ5IGRveHlnZW4uIFRoZSBsYXlvdXQgZmlsZSBjb250cm9scyB0aGUgZ2xvYmFsIHN0cnVjdHVyZSBvZiB0aGUgZ2VuZXJhdGVkCisjIG91dHB1dCBmaWxlcyBpbiBhbiBvdXRwdXQgZm9ybWF0IGluZGVwZW5kZW50IHdheS4gVG8gY3JlYXRlIHRoZSBsYXlvdXQgZmlsZQorIyB0aGF0IHJlcHJlc2VudHMgZG94eWdlbidzIGRlZmF1bHRzLCBydW4gZG94eWdlbiB3aXRoIHRoZSAtbCBvcHRpb24uIFlvdSBjYW4KKyMgb3B0aW9uYWxseSBzcGVjaWZ5IGEgZmlsZSBuYW1lIGFmdGVyIHRoZSBvcHRpb24sIGlmIG9taXR0ZWQgRG94eWdlbkxheW91dC54bWwKKyMgd2lsbCBiZSB1c2VkIGFzIHRoZSBuYW1lIG9mIHRoZSBsYXlvdXQgZmlsZS4KKyMKKyMgTm90ZSB0aGF0IGlmIHlvdSBydW4gZG94eWdlbiBmcm9tIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgYSBmaWxlIGNhbGxlZAorIyBEb3h5Z2VuTGF5b3V0LnhtbCwgZG94eWdlbiB3aWxsIHBhcnNlIGl0IGF1dG9tYXRpY2FsbHkgZXZlbiBpZiB0aGUgTEFZT1VUX0ZJTEUKKyMgdGFnIGlzIGxlZnQgZW1wdHkuCisKK0xBWU9VVF9GSUxFICAgICAgICAgICAgPSAKKworIyBUaGUgQ0lURV9CSUJfRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgYmliIGZpbGVzIGNvbnRhaW5pbmcKKyMgdGhlIHJlZmVyZW5jZSBkZWZpbml0aW9ucy4gVGhpcyBtdXN0IGJlIGEgbGlzdCBvZiAuYmliIGZpbGVzLiBUaGUgLmJpYgorIyBleHRlbnNpb24gaXMgYXV0b21hdGljYWxseSBhcHBlbmRlZCBpZiBvbWl0dGVkLiBUaGlzIHJlcXVpcmVzIHRoZSBiaWJ0ZXggdG9vbAorIyB0byBiZSBpbnN0YWxsZWQuIFNlZSBhbHNvIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmliVGVYIGZvciBtb3JlIGluZm8uCisjIEZvciBMYVRlWCB0aGUgc3R5bGUgb2YgdGhlIGJpYmxpb2dyYXBoeSBjYW4gYmUgY29udHJvbGxlZCB1c2luZworIyBMQVRFWF9CSUJfU1RZTEUuIFRvIHVzZSB0aGlzIGZlYXR1cmUgeW91IG5lZWQgYmlidGV4IGFuZCBwZXJsIGF2YWlsYWJsZSBpbiB0aGUKKyMgc2VhcmNoIHBhdGguIERvIG5vdCB1c2UgZmlsZSBuYW1lcyB3aXRoIHNwYWNlcywgYmlidGV4IGNhbm5vdCBoYW5kbGUgdGhlbS4gU2VlCisjIGFsc28gXGNpdGUgZm9yIGluZm8gaG93IHRvIGNyZWF0ZSByZWZlcmVuY2VzLgorCitDSVRFX0JJQl9GSUxFUyAgICAgICAgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gd2FybmluZyBhbmQgcHJvZ3Jlc3MgbWVzc2FnZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgUVVJRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBtZXNzYWdlcyB0aGF0IGFyZSBnZW5lcmF0ZWQgdG8KKyMgc3RhbmRhcmQgb3V0cHV0IGJ5IGRveHlnZW4uIElmIFFVSUVUIGlzIHNldCB0byBZRVMgdGhpcyBpbXBsaWVzIHRoYXQgdGhlCisjIG1lc3NhZ2VzIGFyZSBvZmYuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUVVJRVQgICAgICAgICAgICAgICAgICA9IE5PCisKKyMgVGhlIFdBUk5JTkdTIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0IGFyZQorIyBnZW5lcmF0ZWQgdG8gc3RhbmRhcmQgZXJyb3IgKCBzdGRlcnIpIGJ5IGRveHlnZW4uIElmIFdBUk5JTkdTIGlzIHNldCB0byBZRVMKKyMgdGhpcyBpbXBsaWVzIHRoYXQgdGhlIHdhcm5pbmdzIGFyZSBvbi4KKyMKKyMgVGlwOiBUdXJuIHdhcm5pbmdzIG9uIHdoaWxlIHdyaXRpbmcgdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1dBUk5JTkdTICAgICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgV0FSTl9JRl9VTkRPQ1VNRU5URUQgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlCisjIHdhcm5pbmdzIGZvciB1bmRvY3VtZW50ZWQgbWVtYmVycy4gSWYgRVhUUkFDVF9BTEwgaXMgc2V0IHRvIFlFUyB0aGVuIHRoaXMgZmxhZworIyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZGlzYWJsZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1dBUk5fSUZfVU5ET0NVTUVOVEVEICAgPSBZRVMKKworIyBJZiB0aGUgV0FSTl9JRl9ET0NfRVJST1IgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSB3YXJuaW5ncyBmb3IKKyMgcG90ZW50aWFsIGVycm9ycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiwgc3VjaCBhcyBub3QgZG9jdW1lbnRpbmcgc29tZSBwYXJhbWV0ZXJzCisjIGluIGEgZG9jdW1lbnRlZCBmdW5jdGlvbiwgb3IgZG9jdW1lbnRpbmcgcGFyYW1ldGVycyB0aGF0IGRvbid0IGV4aXN0IG9yIHVzaW5nCisjIG1hcmt1cCBjb21tYW5kcyB3cm9uZ2x5LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitXQVJOX0lGX0RPQ19FUlJPUiAgICAgID0gWUVTCisKKyMgVGhpcyBXQVJOX05PX1BBUkFNRE9DIG9wdGlvbiBjYW4gYmUgZW5hYmxlZCB0byBnZXQgd2FybmluZ3MgZm9yIGZ1bmN0aW9ucyB0aGF0CisjIGFyZSBkb2N1bWVudGVkLCBidXQgaGF2ZSBubyBkb2N1bWVudGF0aW9uIGZvciB0aGVpciBwYXJhbWV0ZXJzIG9yIHJldHVybgorIyB2YWx1ZS4gSWYgc2V0IHRvIE5PIGRveHlnZW4gd2lsbCBvbmx5IHdhcm4gYWJvdXQgd3Jvbmcgb3IgaW5jb21wbGV0ZSBwYXJhbWV0ZXIKKyMgZG9jdW1lbnRhdGlvbiwgYnV0IG5vdCBhYm91dCB0aGUgYWJzZW5jZSBvZiBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1dBUk5fTk9fUEFSQU1ET0MgICAgICAgPSBOTworCisjIFRoZSBXQVJOX0ZPUk1BVCB0YWcgZGV0ZXJtaW5lcyB0aGUgZm9ybWF0IG9mIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgZG94eWdlbgorIyBjYW4gcHJvZHVjZS4gVGhlIHN0cmluZyBzaG91bGQgY29udGFpbiB0aGUgJGZpbGUsICRsaW5lLCBhbmQgJHRleHQgdGFncywgd2hpY2gKKyMgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgZmlsZSBhbmQgbGluZSBudW1iZXIgZnJvbSB3aGljaCB0aGUgd2FybmluZyBvcmlnaW5hdGVkCisjIGFuZCB0aGUgd2FybmluZyB0ZXh0LiBPcHRpb25hbGx5IHRoZSBmb3JtYXQgbWF5IGNvbnRhaW4gJHZlcnNpb24sIHdoaWNoIHdpbGwKKyMgYmUgcmVwbGFjZWQgYnkgdGhlIHZlcnNpb24gb2YgdGhlIGZpbGUgKGlmIGl0IGNvdWxkIGJlIG9idGFpbmVkIHZpYQorIyBGSUxFX1ZFUlNJT05fRklMVEVSKQorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogJGZpbGU6JGxpbmU6ICR0ZXh0LgorCitXQVJOX0ZPUk1BVCAgICAgICAgICAgID0gIiRmaWxlOiRsaW5lOiAkdGV4dCIKKworIyBUaGUgV0FSTl9MT0dGSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgZmlsZSB0byB3aGljaCB3YXJuaW5nIGFuZCBlcnJvcgorIyBtZXNzYWdlcyBzaG91bGQgYmUgd3JpdHRlbi4gSWYgbGVmdCBibGFuayB0aGUgb3V0cHV0IGlzIHdyaXR0ZW4gdG8gc3RhbmRhcmQKKyMgZXJyb3IgKHN0ZGVycikuCisKK1dBUk5fTE9HRklMRSAgICAgICAgICAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgaW5wdXQgZmlsZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgSU5QVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZXMgYW5kL29yIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbgorIyBkb2N1bWVudGVkIHNvdXJjZSBmaWxlcy4gWW91IG1heSBlbnRlciBmaWxlIG5hbWVzIGxpa2UgbXlmaWxlLmNwcCBvcgorIyBkaXJlY3RvcmllcyBsaWtlIC91c3Ivc3JjL215cHJvamVjdC4gU2VwYXJhdGUgdGhlIGZpbGVzIG9yIGRpcmVjdG9yaWVzIHdpdGgKKyMgc3BhY2VzLgorIyBOb3RlOiBJZiB0aGlzIHRhZyBpcyBlbXB0eSB0aGUgY3VycmVudCBkaXJlY3RvcnkgaXMgc2VhcmNoZWQuCisKK0lOUFVUICAgICAgICAgICAgICAgICAgPSBzcmMKKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgdGhlIHNvdXJjZSBmaWxlcworIyB0aGF0IGRveHlnZW4gcGFyc2VzLiBJbnRlcm5hbGx5IGRveHlnZW4gdXNlcyB0aGUgVVRGLTggZW5jb2RpbmcuIERveHlnZW4gdXNlcworIyBsaWJpY29udiAob3IgdGhlIGljb252IGJ1aWx0IGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlIHRoZSBsaWJpY29udgorIyBkb2N1bWVudGF0aW9uIChzZWU6IGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJpY29udikgZm9yIHRoZSBsaXN0IG9mCisjIHBvc3NpYmxlIGVuY29kaW5ncy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFVURi04LgorCitJTlBVVF9FTkNPRElORyAgICAgICAgID0gVVRGLTgKKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIElOUFVUIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlCisjIEZJTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybnMgKGxpa2UgKi5jcHAgYW5kCisjICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4gSWYgbGVmdCBibGFuayB0aGUKKyMgZm9sbG93aW5nIHBhdHRlcm5zIGFyZSB0ZXN0ZWQ6Ki5jLCAqLmNjLCAqLmN4eCwgKi5jcHAsICouYysrLCAqLmphdmEsICouaWksCisjICouaXh4LCAqLmlwcCwgKi5pKyssICouaW5sLCAqLmlkbCwgKi5kZGwsICoub2RsLCAqLmgsICouaGgsICouaHh4LCAqLmhwcCwKKyMgKi5oKyssICouY3MsICouZCwgKi5waHAsICoucGhwNCwgKi5waHA1LCAqLnBodG1sLCAqLmluYywgKi5tLCAqLm1hcmtkb3duLAorIyAqLm1kLCAqLm1tLCAqLmRveCwgKi5weSwgKi5mOTAsICouZiwgKi5mb3IsICoudGNsLCAqLnZoZCwgKi52aGRsLCAqLnVjZiwKKyMgKi5xc2YsICouYXMgYW5kICouanMuCisKK0ZJTEVfUEFUVEVSTlMgICAgICAgICAgPSAqLmMgKi5oICouY3BwICouZjkwCisKKyMgVGhlIFJFQ1VSU0lWRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIG9yIG5vdCBzdWJkaXJlY3RvcmllcyBzaG91bGQKKyMgYmUgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIGFzIHdlbGwuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUkVDVVJTSVZFICAgICAgICAgICAgICA9IFlFUworCisjIFRoZSBFWENMVURFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBiZQorIyBleGNsdWRlZCBmcm9tIHRoZSBJTlBVVCBzb3VyY2UgZmlsZXMuIFRoaXMgd2F5IHlvdSBjYW4gZWFzaWx5IGV4Y2x1ZGUgYQorIyBzdWJkaXJlY3RvcnkgZnJvbSBhIGRpcmVjdG9yeSB0cmVlIHdob3NlIHJvb3QgaXMgc3BlY2lmaWVkIHdpdGggdGhlIElOUFVUIHRhZy4KKyMKKyMgTm90ZSB0aGF0IHJlbGF0aXZlIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggZG94eWdlbiBpcworIyBydW4uCisKK0VYQ0xVREUgICAgICAgICAgICAgICAgPSBzcmMvaW1wb3J0ZWQgc3JjL3JkdHNjLmgKKworIyBUaGUgRVhDTFVERV9TWU1MSU5LUyB0YWcgY2FuIGJlIHVzZWQgdG8gc2VsZWN0IHdoZXRoZXIgb3Igbm90IGZpbGVzIG9yCisjIGRpcmVjdG9yaWVzIHRoYXQgYXJlIHN5bWJvbGljIGxpbmtzIChhIFVuaXggZmlsZSBzeXN0ZW0gZmVhdHVyZSkgYXJlIGV4Y2x1ZGVkCisjIGZyb20gdGhlIGlucHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYQ0xVREVfU1lNTElOS1MgICAgICAgPSBOTworCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVQgdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUKKyMgRVhDTFVERV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJucyB0byBleGNsdWRlCisjIGNlcnRhaW4gZmlsZXMgZnJvbSB0aG9zZSBkaXJlY3Rvcmllcy4KKyMKKyMgTm90ZSB0aGF0IHRoZSB3aWxkY2FyZHMgYXJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgZmlsZSB3aXRoIGFic29sdXRlIHBhdGgsIHNvIHRvCisjIGV4Y2x1ZGUgYWxsIHRlc3QgZGlyZWN0b3JpZXMgZm9yIGV4YW1wbGUgdXNlIHRoZSBwYXR0ZXJuICovdGVzdC8qCisKK0VYQ0xVREVfUEFUVEVSTlMgICAgICAgPSAKKworIyBUaGUgRVhDTFVERV9TWU1CT0xTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHN5bWJvbCBuYW1lcworIyAobmFtZXNwYWNlcywgY2xhc3NlcywgZnVuY3Rpb25zLCBldGMuKSB0aGF0IHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHRoZQorIyBvdXRwdXQuIFRoZSBzeW1ib2wgbmFtZSBjYW4gYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSwgYSB3b3JkLCBvciBpZiB0aGUKKyMgd2lsZGNhcmQgKiBpcyB1c2VkLCBhIHN1YnN0cmluZy4gRXhhbXBsZXM6IEFOYW1lc3BhY2UsIEFDbGFzcywKKyMgQUNsYXNzOjpBTmFtZXNwYWNlLCBBTmFtZXNwYWNlOjoqVGVzdAorIworIyBOb3RlIHRoYXQgdGhlIHdpbGRjYXJkcyBhcmUgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBmaWxlIHdpdGggYWJzb2x1dGUgcGF0aCwgc28gdG8KKyMgZXhjbHVkZSBhbGwgdGVzdCBkaXJlY3RvcmllcyB1c2UgdGhlIHBhdHRlcm4gKi90ZXN0LyoKKworRVhDTFVERV9TWU1CT0xTICAgICAgICA9IAorCisjIFRoZSBFWEFNUExFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3IgZGlyZWN0b3JpZXMKKyMgdGhhdCBjb250YWluIGV4YW1wbGUgY29kZSBmcmFnbWVudHMgdGhhdCBhcmUgaW5jbHVkZWQgKHNlZSB0aGUgXGluY2x1ZGUKKyMgY29tbWFuZCkuCisKK0VYQU1QTEVfUEFUSCAgICAgICAgICAgPSAKKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIEVYQU1QTEVfUEFUSCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQorIyBFWEFNUExFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm4gKGxpa2UgKi5jcHAgYW5kCisjICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4gSWYgbGVmdCBibGFuayBhbGwKKyMgZmlsZXMgYXJlIGluY2x1ZGVkLgorCitFWEFNUExFX1BBVFRFUk5TICAgICAgID0gKgorCisjIElmIHRoZSBFWEFNUExFX1JFQ1VSU0lWRSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHN1YmRpcmVjdG9yaWVzIHdpbGwgYmUKKyMgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIHRvIGJlIHVzZWQgd2l0aCB0aGUgXGluY2x1ZGUgb3IgXGRvbnRpbmNsdWRlIGNvbW1hbmRzCisjIGlycmVzcGVjdGl2ZSBvZiB0aGUgdmFsdWUgb2YgdGhlIFJFQ1VSU0lWRSB0YWcuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhBTVBMRV9SRUNVUlNJVkUgICAgICA9IE5PCisKKyMgVGhlIElNQUdFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3IgZGlyZWN0b3JpZXMKKyMgdGhhdCBjb250YWluIGltYWdlcyB0aGF0IGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZQorIyBcaW1hZ2UgY29tbWFuZCkuCisKK0lNQUdFX1BBVEggICAgICAgICAgICAgPSAKKworIyBUaGUgSU5QVVRfRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSB0aGF0IGRveHlnZW4gc2hvdWxkCisjIGludm9rZSB0byBmaWx0ZXIgZm9yIGVhY2ggaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgZmlsdGVyIHByb2dyYW0KKyMgYnkgZXhlY3V0aW5nICh2aWEgcG9wZW4oKSkgdGhlIGNvbW1hbmQ6CisjCisjIDxmaWx0ZXI+IDxpbnB1dC1maWxlPgorIworIyB3aGVyZSA8ZmlsdGVyPiBpcyB0aGUgdmFsdWUgb2YgdGhlIElOUFVUX0ZJTFRFUiB0YWcsIGFuZCA8aW5wdXQtZmlsZT4gaXMgdGhlCisjIG5hbWUgb2YgYW4gaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIHRoZW4gdXNlIHRoZSBvdXRwdXQgdGhhdCB0aGUgZmlsdGVyCisjIHByb2dyYW0gd3JpdGVzIHRvIHN0YW5kYXJkIG91dHB1dC4gSWYgRklMVEVSX1BBVFRFUk5TIGlzIHNwZWNpZmllZCwgdGhpcyB0YWcKKyMgd2lsbCBiZSBpZ25vcmVkLgorIworIyBOb3RlIHRoYXQgdGhlIGZpbHRlciBtdXN0IG5vdCBhZGQgb3IgcmVtb3ZlIGxpbmVzOyBpdCBpcyBhcHBsaWVkIGJlZm9yZSB0aGUKKyMgY29kZSBpcyBzY2FubmVkLCBidXQgbm90IHdoZW4gdGhlIG91dHB1dCBjb2RlIGlzIGdlbmVyYXRlZC4gSWYgbGluZXMgYXJlIGFkZGVkCisjIG9yIHJlbW92ZWQsIHRoZSBhbmNob3JzIHdpbGwgbm90IGJlIHBsYWNlZCBjb3JyZWN0bHkuCisKK0lOUFVUX0ZJTFRFUiAgICAgICAgICAgPSAKKworIyBUaGUgRklMVEVSX1BBVFRFUk5TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbHRlcnMgb24gYSBwZXIgZmlsZSBwYXR0ZXJuCisjIGJhc2lzLiBEb3h5Z2VuIHdpbGwgY29tcGFyZSB0aGUgZmlsZSBuYW1lIHdpdGggZWFjaCBwYXR0ZXJuIGFuZCBhcHBseSB0aGUKKyMgZmlsdGVyIGlmIHRoZXJlIGlzIGEgbWF0Y2guIFRoZSBmaWx0ZXJzIGFyZSBhIGxpc3Qgb2YgdGhlIGZvcm06IHBhdHRlcm49ZmlsdGVyCisjIChsaWtlICouY3BwPW15X2NwcF9maWx0ZXIpLiBTZWUgSU5QVVRfRklMVEVSIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIG9uIGhvdworIyBmaWx0ZXJzIGFyZSB1c2VkLiBJZiB0aGUgRklMVEVSX1BBVFRFUk5TIHRhZyBpcyBlbXB0eSBvciBpZiBub25lIG9mIHRoZQorIyBwYXR0ZXJucyBtYXRjaCB0aGUgZmlsZSBuYW1lLCBJTlBVVF9GSUxURVIgaXMgYXBwbGllZC4KKworRklMVEVSX1BBVFRFUk5TICAgICAgICA9IAorCisjIElmIHRoZSBGSUxURVJfU09VUkNFX0ZJTEVTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgaW5wdXQgZmlsdGVyIChpZiBzZXQgdXNpbmcKKyMgSU5QVVRfRklMVEVSICkgd2lsbCBhbHNvIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBpbnB1dCBmaWxlcyB0aGF0IGFyZSB1c2VkIGZvcgorIyBwcm9kdWNpbmcgdGhlIHNvdXJjZSBmaWxlcyB0byBicm93c2UgKGkuZS4gd2hlbiBTT1VSQ0VfQlJPV1NFUiBpcyBzZXQgdG8gWUVTKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitGSUxURVJfU09VUkNFX0ZJTEVTICAgID0gTk8KKworIyBUaGUgRklMVEVSX1NPVVJDRV9QQVRURVJOUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBzb3VyY2UgZmlsdGVycyBwZXIgZmlsZQorIyBwYXR0ZXJuLiBBIHBhdHRlcm4gd2lsbCBvdmVycmlkZSB0aGUgc2V0dGluZyBmb3IgRklMVEVSX1BBVFRFUk4gKGlmIGFueSkgYW5kCisjIGl0IGlzIGFsc28gcG9zc2libGUgdG8gZGlzYWJsZSBzb3VyY2UgZmlsdGVyaW5nIGZvciBhIHNwZWNpZmljIHBhdHRlcm4gdXNpbmcKKyMgKi5leHQ9IChzbyB3aXRob3V0IG5hbWluZyBhIGZpbHRlcikuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBGSUxURVJfU09VUkNFX0ZJTEVTIGlzIHNldCB0byBZRVMuCisKK0ZJTFRFUl9TT1VSQ0VfUEFUVEVSTlMgPSAKKworIyBJZiB0aGUgVVNFX01ERklMRV9BU19NQUlOUEFHRSB0YWcgcmVmZXJzIHRvIHRoZSBuYW1lIG9mIGEgbWFya2Rvd24gZmlsZSB0aGF0CisjIGlzIHBhcnQgb2YgdGhlIGlucHV0LCBpdHMgY29udGVudHMgd2lsbCBiZSBwbGFjZWQgb24gdGhlIG1haW4gcGFnZQorIyAoaW5kZXguaHRtbCkuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgaGF2ZSBhIHByb2plY3Qgb24gZm9yIGluc3RhbmNlIEdpdEh1YgorIyBhbmQgd2FudCB0byByZXVzZSB0aGUgaW50cm9kdWN0aW9uIHBhZ2UgYWxzbyBmb3IgdGhlIGRveHlnZW4gb3V0cHV0LgorCitVU0VfTURGSUxFX0FTX01BSU5QQUdFID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gc291cmNlIGJyb3dzaW5nCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIFNPVVJDRV9CUk9XU0VSIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gYSBsaXN0IG9mIHNvdXJjZSBmaWxlcyB3aWxsIGJlCisjIGdlbmVyYXRlZC4gRG9jdW1lbnRlZCBlbnRpdGllcyB3aWxsIGJlIGNyb3NzLXJlZmVyZW5jZWQgd2l0aCB0aGVzZSBzb3VyY2VzLgorIworIyBOb3RlOiBUbyBnZXQgcmlkIG9mIGFsbCBzb3VyY2UgY29kZSBpbiB0aGUgZ2VuZXJhdGVkIG91dHB1dCwgbWFrZSBzdXJlIHRoYXQKKyMgYWxzbyBWRVJCQVRJTV9IRUFERVJTIGlzIHNldCB0byBOTy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTT1VSQ0VfQlJPV1NFUiAgICAgICAgID0gWUVTCisKKyMgU2V0dGluZyB0aGUgSU5MSU5FX1NPVVJDRVMgdGFnIHRvIFlFUyB3aWxsIGluY2x1ZGUgdGhlIGJvZHkgb2YgZnVuY3Rpb25zLAorIyBjbGFzc2VzIGFuZCBlbnVtcyBkaXJlY3RseSBpbnRvIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0lOTElORV9TT1VSQ0VTICAgICAgICAgPSBOTworCisjIFNldHRpbmcgdGhlIFNUUklQX0NPREVfQ09NTUVOVFMgdGFnIHRvIFlFUyB3aWxsIGluc3RydWN0IGRveHlnZW4gdG8gaGlkZSBhbnkKKyMgc3BlY2lhbCBjb21tZW50IGJsb2NrcyBmcm9tIGdlbmVyYXRlZCBzb3VyY2UgY29kZSBmcmFnbWVudHMuIE5vcm1hbCBDLCBDKysgYW5kCisjIEZvcnRyYW4gY29tbWVudHMgd2lsbCBhbHdheXMgcmVtYWluIHZpc2libGUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NUUklQX0NPREVfQ09NTUVOVFMgICAgPSBZRVMKKworIyBJZiB0aGUgUkVGRVJFTkNFRF9CWV9SRUxBVElPTiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGZvciBlYWNoIGRvY3VtZW50ZWQKKyMgZnVuY3Rpb24gYWxsIGRvY3VtZW50ZWQgZnVuY3Rpb25zIHJlZmVyZW5jaW5nIGl0IHdpbGwgYmUgbGlzdGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1JFRkVSRU5DRURfQllfUkVMQVRJT04gPSBZRVMKKworIyBJZiB0aGUgUkVGRVJFTkNFU19SRUxBVElPTiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGZvciBlYWNoIGRvY3VtZW50ZWQgZnVuY3Rpb24KKyMgYWxsIGRvY3VtZW50ZWQgZW50aXRpZXMgY2FsbGVkL3VzZWQgYnkgdGhhdCBmdW5jdGlvbiB3aWxsIGJlIGxpc3RlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitSRUZFUkVOQ0VTX1JFTEFUSU9OICAgID0gTk8KKworIyBJZiB0aGUgUkVGRVJFTkNFU19MSU5LX1NPVVJDRSB0YWcgaXMgc2V0IHRvIFlFUyBhbmQgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldAorIyB0byBZRVMsIHRoZW4gdGhlIGh5cGVybGlua3MgZnJvbSBmdW5jdGlvbnMgaW4gUkVGRVJFTkNFU19SRUxBVElPTiBhbmQKKyMgUkVGRVJFTkNFRF9CWV9SRUxBVElPTiBsaXN0cyB3aWxsIGxpbmsgdG8gdGhlIHNvdXJjZSBjb2RlLiBPdGhlcndpc2UgdGhleSB3aWxsCisjIGxpbmsgdG8gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1JFRkVSRU5DRVNfTElOS19TT1VSQ0UgPSBZRVMKKworIyBJZiBTT1VSQ0VfVE9PTFRJUFMgaXMgZW5hYmxlZCAodGhlIGRlZmF1bHQpIHRoZW4gaG92ZXJpbmcgYSBoeXBlcmxpbmsgaW4gdGhlCisjIHNvdXJjZSBjb2RlIHdpbGwgc2hvdyBhIHRvb2x0aXAgd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHN1Y2ggYXMgcHJvdG90eXBlLAorIyBicmllZiBkZXNjcmlwdGlvbiBhbmQgbGlua3MgdG8gdGhlIGRlZmluaXRpb24gYW5kIGRvY3VtZW50YXRpb24uIFNpbmNlIHRoaXMKKyMgd2lsbCBtYWtlIHRoZSBIVE1MIGZpbGUgbGFyZ2VyIGFuZCBsb2FkaW5nIG9mIGxhcmdlIGZpbGVzIGEgYml0IHNsb3dlciwgeW91CisjIGNhbiBvcHQgdG8gZGlzYWJsZSB0aGlzIGZlYXR1cmUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTT1VSQ0VfQlJPV1NFUiBpcyBzZXQgdG8gWUVTLgorCitTT1VSQ0VfVE9PTFRJUFMgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFVTRV9IVEFHUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSByZWZlcmVuY2VzIHRvIHNvdXJjZSBjb2RlIHdpbGwKKyMgcG9pbnQgdG8gdGhlIEhUTUwgZ2VuZXJhdGVkIGJ5IHRoZSBodGFncygxKSB0b29sIGluc3RlYWQgb2YgZG94eWdlbiBidWlsdC1pbgorIyBzb3VyY2UgYnJvd3Nlci4gVGhlIGh0YWdzIHRvb2wgaXMgcGFydCBvZiBHTlUncyBnbG9iYWwgc291cmNlIHRhZ2dpbmcgc3lzdGVtCisjIChzZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2dsb2JhbC9nbG9iYWwuaHRtbCkuIFlvdSB3aWxsIG5lZWQgdmVyc2lvbgorIyA0LjguNiBvciBoaWdoZXIuCisjCisjIFRvIHVzZSBpdCBkbyB0aGUgZm9sbG93aW5nOgorIyAtIEluc3RhbGwgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGdsb2JhbAorIyAtIEVuYWJsZSBTT1VSQ0VfQlJPV1NFUiBhbmQgVVNFX0hUQUdTIGluIHRoZSBjb25maWcgZmlsZQorIyAtIE1ha2Ugc3VyZSB0aGUgSU5QVVQgcG9pbnRzIHRvIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZQorIyAtIFJ1biBkb3h5Z2VuIGFzIG5vcm1hbAorIworIyBEb3h5Z2VuIHdpbGwgaW52b2tlIGh0YWdzIChhbmQgdGhhdCB3aWxsIGluIHR1cm4gaW52b2tlIGd0YWdzKSwgc28gdGhlc2UKKyMgdG9vbHMgbXVzdCBiZSBhdmFpbGFibGUgZnJvbSB0aGUgY29tbWFuZCBsaW5lIChpLmUuIGluIHRoZSBzZWFyY2ggcGF0aCkuCisjCisjIFRoZSByZXN1bHQ6IGluc3RlYWQgb2YgdGhlIHNvdXJjZSBicm93c2VyIGdlbmVyYXRlZCBieSBkb3h5Z2VuLCB0aGUgbGlua3MgdG8KKyMgc291cmNlIGNvZGUgd2lsbCBub3cgcG9pbnQgdG8gdGhlIG91dHB1dCBvZiBodGFncy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU09VUkNFX0JST1dTRVIgaXMgc2V0IHRvIFlFUy4KKworVVNFX0hUQUdTICAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFZFUkJBVElNX0hFQURFUlMgdGFnIGlzIHNldCB0aGUgWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKKyMgdmVyYmF0aW0gY29weSBvZiB0aGUgaGVhZGVyIGZpbGUgZm9yIGVhY2ggY2xhc3MgZm9yIHdoaWNoIGFuIGluY2x1ZGUgaXMKKyMgc3BlY2lmaWVkLiBTZXQgdG8gTk8gdG8gZGlzYWJsZSB0aGlzLgorIyBTZWUgYWxzbzogU2VjdGlvbiBcY2xhc3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1ZFUkJBVElNX0hFQURFUlMgICAgICAgPSBZRVMKKworIyBJZiB0aGUgQ0xBTkdfQVNTSVNURURfUEFSU0lORyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgdXNlIHRoZQorIyBjbGFuZyBwYXJzZXIgKHNlZTogaHR0cDovL2NsYW5nLmxsdm0ub3JnLykgZm9yIG1vcmUgYWN1cmF0ZSBwYXJzaW5nIGF0IHRoZQorIyBjb3N0IG9mIHJlZHVjZWQgcGVyZm9ybWFuY2UuIFRoaXMgY2FuIGJlIHBhcnRpY3VsYXJseSBoZWxwZnVsIHdpdGggdGVtcGxhdGUKKyMgcmljaCBDKysgY29kZSBmb3Igd2hpY2ggZG94eWdlbidzIGJ1aWx0LWluIHBhcnNlciBsYWNrcyB0aGUgbmVjZXNzYXJ5IHR5cGUKKyMgaW5mb3JtYXRpb24uCisjIE5vdGU6IFRoZSBhdmFpbGFiaWxpdHkgb2YgdGhpcyBvcHRpb24gZGVwZW5kcyBvbiB3aGV0aGVyIG9yIG5vdCBkb3h5Z2VuIHdhcworIyBjb21waWxlZCB3aXRoIHRoZSAtLXdpdGgtbGliY2xhbmcgb3B0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0NMQU5HX0FTU0lTVEVEX1BBUlNJTkcgPSBOTworCisjIElmIGNsYW5nIGFzc2lzdGVkIHBhcnNpbmcgaXMgZW5hYmxlZCB5b3UgY2FuIHByb3ZpZGUgdGhlIGNvbXBpbGVyIHdpdGggY29tbWFuZAorIyBsaW5lIG9wdGlvbnMgdGhhdCB5b3Ugd291bGQgbm9ybWFsbHkgdXNlIHdoZW4gaW52b2tpbmcgdGhlIGNvbXBpbGVyLiBOb3RlIHRoYXQKKyMgdGhlIGluY2x1ZGUgcGF0aHMgd2lsbCBhbHJlYWR5IGJlIHNldCBieSBkb3h5Z2VuIGZvciB0aGUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzCisjIHNwZWNpZmllZCB3aXRoIElOUFVUIGFuZCBJTkNMVURFX1BBVEguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBDTEFOR19BU1NJU1RFRF9QQVJTSU5HIGlzIHNldCB0byBZRVMuCisKK0NMQU5HX09QVElPTlMgICAgICAgICAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgYWxwaGFiZXRpY2FsIGNsYXNzIGluZGV4CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEFMUEhBQkVUSUNBTF9JTkRFWCB0YWcgaXMgc2V0IHRvIFlFUywgYW4gYWxwaGFiZXRpY2FsIGluZGV4IG9mIGFsbAorIyBjb21wb3VuZHMgd2lsbCBiZSBnZW5lcmF0ZWQuIEVuYWJsZSB0aGlzIGlmIHRoZSBwcm9qZWN0IGNvbnRhaW5zIGEgbG90IG9mCisjIGNsYXNzZXMsIHN0cnVjdHMsIHVuaW9ucyBvciBpbnRlcmZhY2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitBTFBIQUJFVElDQUxfSU5ERVggICAgID0gWUVTCisKKyMgVGhlIENPTFNfSU5fQUxQSEFfSU5ERVggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluCisjIHdoaWNoIHRoZSBhbHBoYWJldGljYWwgaW5kZXggbGlzdCB3aWxsIGJlIHNwbGl0LgorIyBNaW5pbXVtIHZhbHVlOiAxLCBtYXhpbXVtIHZhbHVlOiAyMCwgZGVmYXVsdCB2YWx1ZTogNS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEFMUEhBQkVUSUNBTF9JTkRFWCBpcyBzZXQgdG8gWUVTLgorCitDT0xTX0lOX0FMUEhBX0lOREVYICAgID0gNQorCisjIEluIGNhc2UgYWxsIGNsYXNzZXMgaW4gYSBwcm9qZWN0IHN0YXJ0IHdpdGggYSBjb21tb24gcHJlZml4LCBhbGwgY2xhc3NlcyB3aWxsCisjIGJlIHB1dCB1bmRlciB0aGUgc2FtZSBoZWFkZXIgaW4gdGhlIGFscGhhYmV0aWNhbCBpbmRleC4gVGhlIElHTk9SRV9QUkVGSVggdGFnCisjIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwcmVmaXggKG9yIGEgbGlzdCBvZiBwcmVmaXhlcykgdGhhdCBzaG91bGQgYmUgaWdub3JlZAorIyB3aGlsZSBnZW5lcmF0aW5nIHRoZSBpbmRleCBoZWFkZXJzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgQUxQSEFCRVRJQ0FMX0lOREVYIGlzIHNldCB0byBZRVMuCisKK0lHTk9SRV9QUkVGSVggICAgICAgICAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgSFRNTCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgSFRNTCBvdXRwdXQKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfSFRNTCAgICAgICAgICA9IFlFUworCisjIFRoZSBIVE1MX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBIVE1MIGRvY3Mgd2lsbCBiZSBwdXQuIElmIGEKKyMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCisjIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IGh0bWwuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfT1VUUFVUICAgICAgICAgICAgPSBodG1sCisKKyMgVGhlIEhUTUxfRklMRV9FWFRFTlNJT04gdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgZXh0ZW5zaW9uIGZvciBlYWNoCisjIGdlbmVyYXRlZCBIVE1MIHBhZ2UgKGZvciBleGFtcGxlOiAuaHRtLCAucGhwLCAuYXNwKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IC5odG1sLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0ZJTEVfRVhURU5TSU9OICAgID0gLmh0bWwKKworIyBUaGUgSFRNTF9IRUFERVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgSFRNTCBoZWFkZXIgZmlsZSBmb3IKKyMgZWFjaCBnZW5lcmF0ZWQgSFRNTCBwYWdlLiBJZiB0aGUgdGFnIGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKKyMgc3RhbmRhcmQgaGVhZGVyLgorIworIyBUbyBnZXQgdmFsaWQgSFRNTCB0aGUgaGVhZGVyIGZpbGUgdGhhdCBpbmNsdWRlcyBhbnkgc2NyaXB0cyBhbmQgc3R5bGUgc2hlZXRzCisjIHRoYXQgZG94eWdlbiBuZWVkcywgd2hpY2ggaXMgZGVwZW5kZW50IG9uIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdXNlZCAoZS5nLgorIyB0aGUgc2V0dGluZyBHRU5FUkFURV9UUkVFVklFVykuIEl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0byBzdGFydCB3aXRoIGEKKyMgZGVmYXVsdCBoZWFkZXIgdXNpbmcKKyMgZG94eWdlbiAtdyBodG1sIG5ld19oZWFkZXIuaHRtbCBuZXdfZm9vdGVyLmh0bWwgbmV3X3N0eWxlc2hlZXQuY3NzCisjIFlvdXJDb25maWdGaWxlCisjIGFuZCB0aGVuIG1vZGlmeSB0aGUgZmlsZSBuZXdfaGVhZGVyLmh0bWwuIFNlZSBhbHNvIHNlY3Rpb24gIkRveHlnZW4gdXNhZ2UiCisjIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgdGhlIGRlZmF1bHQgaGVhZGVyIHRoYXQgZG94eWdlbiBub3JtYWxseQorIyB1c2VzLgorIyBOb3RlOiBUaGUgaGVhZGVyIGlzIHN1YmplY3QgdG8gY2hhbmdlIHNvIHlvdSB0eXBpY2FsbHkgaGF2ZSB0byByZWdlbmVyYXRlIHRoZQorIyBkZWZhdWx0IGhlYWRlciB3aGVuIHVwZ3JhZGluZyB0byBhIG5ld2VyIHZlcnNpb24gb2YgZG94eWdlbi4gRm9yIGEgZGVzY3JpcHRpb24KKyMgb2YgdGhlIHBvc3NpYmxlIG1hcmtlcnMgYW5kIGJsb2NrIG5hbWVzIHNlZSB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9IRUFERVIgICAgICAgICAgICA9IAorCisjIFRoZSBIVE1MX0ZPT1RFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHVzZXItZGVmaW5lZCBIVE1MIGZvb3RlciBmb3IgZWFjaAorIyBnZW5lcmF0ZWQgSFRNTCBwYWdlLiBJZiB0aGUgdGFnIGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgc3RhbmRhcmQKKyMgZm9vdGVyLiBTZWUgSFRNTF9IRUFERVIgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIGEgZGVmYXVsdAorIyBmb290ZXIgYW5kIHdoYXQgc3BlY2lhbCBjb21tYW5kcyBjYW4gYmUgdXNlZCBpbnNpZGUgdGhlIGZvb3Rlci4gU2VlIGFsc28KKyMgc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSB0aGUgZGVmYXVsdCBmb290ZXIKKyMgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5IHVzZXMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRk9PVEVSICAgICAgICAgICAgPSAKKworIyBUaGUgSFRNTF9TVFlMRVNIRUVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgdXNlci1kZWZpbmVkIGNhc2NhZGluZyBzdHlsZQorIyBzaGVldCB0aGF0IGlzIHVzZWQgYnkgZWFjaCBIVE1MIHBhZ2UuIEl0IGNhbiBiZSB1c2VkIHRvIGZpbmUtdHVuZSB0aGUgbG9vayBvZgorIyB0aGUgSFRNTCBvdXRwdXQuIElmIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZGVmYXVsdCBzdHlsZSBzaGVldC4KKyMgU2VlIGFsc28gc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSB0aGUgc3R5bGUKKyMgc2hlZXQgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5IHVzZXMuCisjIE5vdGU6IEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBIVE1MX0VYVFJBX1NUWUxFU0hFRVQgaW5zdGVhZCBvZiB0aGlzIHRhZywgYXMKKyMgaXQgaXMgbW9yZSByb2J1c3QgYW5kIHRoaXMgdGFnIChIVE1MX1NUWUxFU0hFRVQpIHdpbGwgaW4gdGhlIGZ1dHVyZSBiZWNvbWUKKyMgb2Jzb2xldGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfU1RZTEVTSEVFVCAgICAgICAgPSAKKworIyBUaGUgSFRNTF9FWFRSQV9TVFlMRVNIRUVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFuIGFkZGl0aW9uYWwgdXNlci0KKyMgZGVmaW5lZCBjYXNjYWRpbmcgc3R5bGUgc2hlZXQgdGhhdCBpcyBpbmNsdWRlZCBhZnRlciB0aGUgc3RhbmRhcmQgc3R5bGUgc2hlZXRzCisjIGNyZWF0ZWQgYnkgZG94eWdlbi4gVXNpbmcgdGhpcyBvcHRpb24gb25lIGNhbiBvdmVycnVsZSBjZXJ0YWluIHN0eWxlIGFzcGVjdHMuCisjIFRoaXMgaXMgcHJlZmVycmVkIG92ZXIgdXNpbmcgSFRNTF9TVFlMRVNIRUVUIHNpbmNlIGl0IGRvZXMgbm90IHJlcGxhY2UgdGhlCisjIHN0YW5kYXJkIHN0eWxlIHNoZWV0IGFuZCBpcyB0aGVyZWZvciBtb3JlIHJvYnVzdCBhZ2FpbnN0IGZ1dHVyZSB1cGRhdGVzLgorIyBEb3h5Z2VuIHdpbGwgY29weSB0aGUgc3R5bGUgc2hlZXQgZmlsZSB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4gRm9yIGFuIGV4YW1wbGUKKyMgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0VYVFJBX1NUWUxFU0hFRVQgID0gCisKKyMgVGhlIEhUTUxfRVhUUkFfRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZXh0cmEgaW1hZ2VzIG9yCisjIG90aGVyIHNvdXJjZSBmaWxlcyB3aGljaCBzaG91bGQgYmUgY29waWVkIHRvIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIE5vdGUKKyMgdGhhdCB0aGVzZSBmaWxlcyB3aWxsIGJlIGNvcGllZCB0byB0aGUgYmFzZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFVzZSB0aGUKKyMgJHJlbHBhdGheIG1hcmtlciBpbiB0aGUgSFRNTF9IRUFERVIgYW5kL29yIEhUTUxfRk9PVEVSIGZpbGVzIHRvIGxvYWQgdGhlc2UKKyMgZmlsZXMuIEluIHRoZSBIVE1MX1NUWUxFU0hFRVQgZmlsZSwgdXNlIHRoZSBmaWxlIG5hbWUgb25seS4gQWxzbyBub3RlIHRoYXQgdGhlCisjIGZpbGVzIHdpbGwgYmUgY29waWVkIGFzLWlzOyB0aGVyZSBhcmUgbm8gY29tbWFuZHMgb3IgbWFya2VycyBhdmFpbGFibGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRVhUUkFfRklMRVMgICAgICAgPSAKKworIyBUaGUgSFRNTF9DT0xPUlNUWUxFX0hVRSB0YWcgY29udHJvbHMgdGhlIGNvbG9yIG9mIHRoZSBIVE1MIG91dHB1dC4gRG94eWdlbgorIyB3aWxsIGFkanVzdCB0aGUgY29sb3JzIGluIHRoZSBzdHlsZXNoZWV0IGFuZCBiYWNrZ3JvdW5kIGltYWdlcyBhY2NvcmRpbmcgdG8KKyMgdGhpcyBjb2xvci4gSHVlIGlzIHNwZWNpZmllZCBhcyBhbiBhbmdsZSBvbiBhIGNvbG9yd2hlZWwsIHNlZQorIyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0h1ZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gRm9yIGluc3RhbmNlIHRoZSB2YWx1ZQorIyAwIHJlcHJlc2VudHMgcmVkLCA2MCBpcyB5ZWxsb3csIDEyMCBpcyBncmVlbiwgMTgwIGlzIGN5YW4sIDI0MCBpcyBibHVlLCAzMDAKKyMgcHVycGxlLCBhbmQgMzYwIGlzIHJlZCBhZ2Fpbi4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMzU5LCBkZWZhdWx0IHZhbHVlOiAyMjAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfQ09MT1JTVFlMRV9IVUUgICAgPSAyMjAKKworIyBUaGUgSFRNTF9DT0xPUlNUWUxFX1NBVCB0YWcgY29udHJvbHMgdGhlIHB1cml0eSAob3Igc2F0dXJhdGlvbikgb2YgdGhlIGNvbG9ycworIyBpbiB0aGUgSFRNTCBvdXRwdXQuIEZvciBhIHZhbHVlIG9mIDAgdGhlIG91dHB1dCB3aWxsIHVzZSBncmF5c2NhbGVzIG9ubHkuIEEKKyMgdmFsdWUgb2YgMjU1IHdpbGwgcHJvZHVjZSB0aGUgbW9zdCB2aXZpZCBjb2xvcnMuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDI1NSwgZGVmYXVsdCB2YWx1ZTogMTAwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0NPTE9SU1RZTEVfU0FUICAgID0gMTAwCisKKyMgVGhlIEhUTUxfQ09MT1JTVFlMRV9HQU1NQSB0YWcgY29udHJvbHMgdGhlIGdhbW1hIGNvcnJlY3Rpb24gYXBwbGllZCB0byB0aGUKKyMgbHVtaW5hbmNlIGNvbXBvbmVudCBvZiB0aGUgY29sb3JzIGluIHRoZSBIVE1MIG91dHB1dC4gVmFsdWVzIGJlbG93IDEwMAorIyBncmFkdWFsbHkgbWFrZSB0aGUgb3V0cHV0IGxpZ2h0ZXIsIHdoZXJlYXMgdmFsdWVzIGFib3ZlIDEwMCBtYWtlIHRoZSBvdXRwdXQKKyMgZGFya2VyLiBUaGUgdmFsdWUgZGl2aWRlZCBieSAxMDAgaXMgdGhlIGFjdHVhbCBnYW1tYSBhcHBsaWVkLCBzbyA4MCByZXByZXNlbnRzCisjIGEgZ2FtbWEgb2YgMC44LCBUaGUgdmFsdWUgMjIwIHJlcHJlc2VudHMgYSBnYW1tYSBvZiAyLjIsIGFuZCAxMDAgZG9lcyBub3QKKyMgY2hhbmdlIHRoZSBnYW1tYS4KKyMgTWluaW11bSB2YWx1ZTogNDAsIG1heGltdW0gdmFsdWU6IDI0MCwgZGVmYXVsdCB2YWx1ZTogODAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfQ09MT1JTVFlMRV9HQU1NQSAgPSA4MAorCisjIElmIHRoZSBIVE1MX1RJTUVTVEFNUCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBmb290ZXIgb2YgZWFjaCBnZW5lcmF0ZWQgSFRNTAorIyBwYWdlIHdpbGwgY29udGFpbiB0aGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoZSBwYWdlIHdhcyBnZW5lcmF0ZWQuIFNldHRpbmcgdGhpcworIyB0byBOTyBjYW4gaGVscCB3aGVuIGNvbXBhcmluZyB0aGUgb3V0cHV0IG9mIG11bHRpcGxlIHJ1bnMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfVElNRVNUQU1QICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgSFRNTF9EWU5BTUlDX1NFQ1RJT05TIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGdlbmVyYXRlZCBIVE1MCisjIGRvY3VtZW50YXRpb24gd2lsbCBjb250YWluIHNlY3Rpb25zIHRoYXQgY2FuIGJlIGhpZGRlbiBhbmQgc2hvd24gYWZ0ZXIgdGhlCisjIHBhZ2UgaGFzIGxvYWRlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0RZTkFNSUNfU0VDVElPTlMgID0gTk8KKworIyBXaXRoIEhUTUxfSU5ERVhfTlVNX0VOVFJJRVMgb25lIGNhbiBjb250cm9sIHRoZSBwcmVmZXJyZWQgbnVtYmVyIG9mIGVudHJpZXMKKyMgc2hvd24gaW4gdGhlIHZhcmlvdXMgdHJlZSBzdHJ1Y3R1cmVkIGluZGljZXMgaW5pdGlhbGx5OyB0aGUgdXNlciBjYW4gZXhwYW5kCisjIGFuZCBjb2xsYXBzZSBlbnRyaWVzIGR5bmFtaWNhbGx5IGxhdGVyIG9uLiBEb3h5Z2VuIHdpbGwgZXhwYW5kIHRoZSB0cmVlIHRvCisjIHN1Y2ggYSBsZXZlbCB0aGF0IGF0IG1vc3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZW50cmllcyBhcmUgdmlzaWJsZSAodW5sZXNzCisjIGEgZnVsbHkgY29sbGFwc2VkIHRyZWUgYWxyZWFkeSBleGNlZWRzIHRoaXMgYW1vdW50KS4gU28gc2V0dGluZyB0aGUgbnVtYmVyIG9mCisjIGVudHJpZXMgMSB3aWxsIHByb2R1Y2UgYSBmdWxsIGNvbGxhcHNlZCB0cmVlIGJ5IGRlZmF1bHQuIDAgaXMgYSBzcGVjaWFsIHZhbHVlCisjIHJlcHJlc2VudGluZyBhbiBpbmZpbml0ZSBudW1iZXIgb2YgZW50cmllcyBhbmQgd2lsbCByZXN1bHQgaW4gYSBmdWxsIGV4cGFuZGVkCisjIHRyZWUgYnkgZGVmYXVsdC4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogOTk5OSwgZGVmYXVsdCB2YWx1ZTogMTAwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0lOREVYX05VTV9FTlRSSUVTID0gMTAwCisKKyMgSWYgdGhlIEdFTkVSQVRFX0RPQ1NFVCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcyB3aWxsIGJlCisjIGdlbmVyYXRlZCB0aGF0IGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciBBcHBsZSdzIFhjb2RlIDMgaW50ZWdyYXRlZCBkZXZlbG9wbWVudAorIyBlbnZpcm9ubWVudCAoc2VlOiBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS90b29scy94Y29kZS8pLCBpbnRyb2R1Y2VkIHdpdGgKKyMgT1NYIDEwLjUgKExlb3BhcmQpLiBUbyBjcmVhdGUgYSBkb2N1bWVudGF0aW9uIHNldCwgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKKyMgTWFrZWZpbGUgaW4gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gUnVubmluZyBtYWtlIHdpbGwgcHJvZHVjZSB0aGUgZG9jc2V0IGluCisjIHRoYXQgZGlyZWN0b3J5IGFuZCBydW5uaW5nIG1ha2UgaW5zdGFsbCB3aWxsIGluc3RhbGwgdGhlIGRvY3NldCBpbgorIyB+L0xpYnJhcnkvRGV2ZWxvcGVyL1NoYXJlZC9Eb2N1bWVudGF0aW9uL0RvY1NldHMgc28gdGhhdCBYY29kZSB3aWxsIGZpbmQgaXQgYXQKKyMgc3RhcnR1cC4gU2VlIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3Rvb2xzL2NyZWF0aW5nZG9jc2V0c3dpdGhkb3h5Z2VuLmh0bWwKKyMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfRE9DU0VUICAgICAgICA9IE5PCisKKyMgVGhpcyB0YWcgZGV0ZXJtaW5lcyB0aGUgbmFtZSBvZiB0aGUgZG9jc2V0IGZlZWQuIEEgZG9jdW1lbnRhdGlvbiBmZWVkIHByb3ZpZGVzCisjIGFuIHVtYnJlbGxhIHVuZGVyIHdoaWNoIG11bHRpcGxlIGRvY3VtZW50YXRpb24gc2V0cyBmcm9tIGEgc2luZ2xlIHByb3ZpZGVyCisjIChzdWNoIGFzIGEgY29tcGFueSBvciBwcm9kdWN0IHN1aXRlKSBjYW4gYmUgZ3JvdXBlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IERveHlnZW4gZ2VuZXJhdGVkIGRvY3MuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NTRVQgaXMgc2V0IHRvIFlFUy4KKworRE9DU0VUX0ZFRUROQU1FICAgICAgICA9ICJEb3h5Z2VuIGdlbmVyYXRlZCBkb2NzIgorCisjIFRoaXMgdGFnIHNwZWNpZmllcyBhIHN0cmluZyB0aGF0IHNob3VsZCB1bmlxdWVseSBpZGVudGlmeSB0aGUgZG9jdW1lbnRhdGlvbgorIyBzZXQgYnVuZGxlLiBUaGlzIHNob3VsZCBiZSBhIHJldmVyc2UgZG9tYWluLW5hbWUgc3R5bGUgc3RyaW5nLCBlLmcuCisjIGNvbS5teWNvbXBhbnkuTXlEb2NTZXQuIERveHlnZW4gd2lsbCBhcHBlbmQgLmRvY3NldCB0byB0aGUgbmFtZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IG9yZy5kb3h5Z2VuLlByb2plY3QuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NTRVQgaXMgc2V0IHRvIFlFUy4KKworRE9DU0VUX0JVTkRMRV9JRCAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QKKworIyBUaGUgRE9DU0VUX1BVQkxJU0hFUl9JRCB0YWcgc3BlY2lmaWVzIGEgc3RyaW5nIHRoYXQgc2hvdWxkIHVuaXF1ZWx5IGlkZW50aWZ5CisjIHRoZSBkb2N1bWVudGF0aW9uIHB1Ymxpc2hlci4gVGhpcyBzaG91bGQgYmUgYSByZXZlcnNlIGRvbWFpbi1uYW1lIHN0eWxlCisjIHN0cmluZywgZS5nLiBjb20ubXljb21wYW55Lk15RG9jU2V0LmRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBvcmcuZG94eWdlbi5QdWJsaXNoZXIuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NTRVQgaXMgc2V0IHRvIFlFUy4KKworRE9DU0VUX1BVQkxJU0hFUl9JRCAgICA9IG9yZy5kb3h5Z2VuLlB1Ymxpc2hlcgorCisjIFRoZSBET0NTRVRfUFVCTElTSEVSX05BTUUgdGFnIGlkZW50aWZpZXMgdGhlIGRvY3VtZW50YXRpb24gcHVibGlzaGVyLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogUHVibGlzaGVyLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCisKK0RPQ1NFVF9QVUJMSVNIRVJfTkFNRSAgPSBQdWJsaXNoZXIKKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIGdlbmVyYXRlcyB0aHJlZQorIyBhZGRpdGlvbmFsIEhUTUwgaW5kZXggZmlsZXM6IGluZGV4LmhocCwgaW5kZXguaGhjLCBhbmQgaW5kZXguaGhrLiBUaGUKKyMgaW5kZXguaGhwIGlzIGEgcHJvamVjdCBmaWxlIHRoYXQgY2FuIGJlIHJlYWQgYnkgTWljcm9zb2Z0J3MgSFRNTCBIZWxwIFdvcmtzaG9wCisjIChzZWU6IGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9lbi11cy9kb3dubG9hZC9kZXRhaWxzLmFzcHg/aWQ9MjExMzgpIG9uCisjIFdpbmRvd3MuCisjCisjIFRoZSBIVE1MIEhlbHAgV29ya3Nob3AgY29udGFpbnMgYSBjb21waWxlciB0aGF0IGNhbiBjb252ZXJ0IGFsbCBIVE1MIG91dHB1dAorIyBnZW5lcmF0ZWQgYnkgZG94eWdlbiBpbnRvIGEgc2luZ2xlIGNvbXBpbGVkIEhUTUwgZmlsZSAoLmNobSkuIENvbXBpbGVkIEhUTUwKKyMgZmlsZXMgYXJlIG5vdyB1c2VkIGFzIHRoZSBXaW5kb3dzIDk4IGhlbHAgZm9ybWF0LCBhbmQgd2lsbCByZXBsYWNlIHRoZSBvbGQKKyMgV2luZG93cyBoZWxwIGZvcm1hdCAoLmhscCkgb24gYWxsIFdpbmRvd3MgcGxhdGZvcm1zIGluIHRoZSBmdXR1cmUuIENvbXByZXNzZWQKKyMgSFRNTCBmaWxlcyBhbHNvIGNvbnRhaW4gYW4gaW5kZXgsIGEgdGFibGUgb2YgY29udGVudHMsIGFuZCB5b3UgY2FuIHNlYXJjaCBmb3IKKyMgd29yZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uIFRoZSBIVE1MIHdvcmtzaG9wIGFsc28gY29udGFpbnMgYSB2aWV3ZXIgZm9yCisjIGNvbXByZXNzZWQgSFRNTCBmaWxlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9IVE1MSEVMUCAgICAgID0gTk8KKworIyBUaGUgQ0hNX0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgbmFtZSBvZiB0aGUgcmVzdWx0aW5nIC5jaG0KKyMgZmlsZS4gWW91IGNhbiBhZGQgYSBwYXRoIGluIGZyb250IG9mIHRoZSBmaWxlIGlmIHRoZSByZXN1bHQgc2hvdWxkIG5vdCBiZQorIyB3cml0dGVuIHRvIHRoZSBodG1sIG91dHB1dCBkaXJlY3RvcnkuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitDSE1fRklMRSAgICAgICAgICAgICAgID0gCisKKyMgVGhlIEhIQ19MT0NBVElPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gKGFic29sdXRlIHBhdGgKKyMgaW5jbHVkaW5nIGZpbGUgbmFtZSkgb2YgdGhlIEhUTUwgaGVscCBjb21waWxlciAoIGhoYy5leGUpLiBJZiBub24tZW1wdHkKKyMgZG94eWdlbiB3aWxsIHRyeSB0byBydW4gdGhlIEhUTUwgaGVscCBjb21waWxlciBvbiB0aGUgZ2VuZXJhdGVkIGluZGV4LmhocC4KKyMgVGhlIGZpbGUgaGFzIHRvIGJlIHNwZWNpZmllZCB3aXRoIGZ1bGwgcGF0aC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCisKK0hIQ19MT0NBVElPTiAgICAgICAgICAgPSAKKworIyBUaGUgR0VORVJBVEVfQ0hJIGZsYWcgY29udHJvbHMgaWYgYSBzZXBhcmF0ZSAuY2hpIGluZGV4IGZpbGUgaXMgZ2VuZXJhdGVkICgKKyMgWUVTKSBvciB0aGF0IGl0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbWFzdGVyIC5jaG0gZmlsZSAoIE5PKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfQ0hJICAgICAgICAgICA9IE5PCisKKyMgVGhlIENITV9JTkRFWF9FTkNPRElORyBpcyB1c2VkIHRvIGVuY29kZSBIdG1sSGVscCBpbmRleCAoIGhoayksIGNvbnRlbnQgKCBoaGMpCisjIGFuZCBwcm9qZWN0IGZpbGUgY29udGVudC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCisKK0NITV9JTkRFWF9FTkNPRElORyAgICAgPSAKKworIyBUaGUgQklOQVJZX1RPQyBmbGFnIGNvbnRyb2xzIHdoZXRoZXIgYSBiaW5hcnkgdGFibGUgb2YgY29udGVudHMgaXMgZ2VuZXJhdGVkICgKKyMgWUVTKSBvciBhIG5vcm1hbCB0YWJsZSBvZiBjb250ZW50cyAoIE5PKSBpbiB0aGUgLmNobSBmaWxlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitCSU5BUllfVE9DICAgICAgICAgICAgID0gTk8KKworIyBUaGUgVE9DX0VYUEFORCBmbGFnIGNhbiBiZSBzZXQgdG8gWUVTIHRvIGFkZCBleHRyYSBpdGVtcyBmb3IgZ3JvdXAgbWVtYmVycyB0bworIyB0aGUgdGFibGUgb2YgY29udGVudHMgb2YgdGhlIEhUTUwgaGVscCBkb2N1bWVudGF0aW9uIGFuZCB0byB0aGUgdHJlZSB2aWV3LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitUT0NfRVhQQU5EICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfUUhQIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBib3RoIFFIUF9OQU1FU1BBQ0UgYW5kCisjIFFIUF9WSVJUVUFMX0ZPTERFUiBhcmUgc2V0LCBhbiBhZGRpdGlvbmFsIGluZGV4IGZpbGUgd2lsbCBiZSBnZW5lcmF0ZWQgdGhhdAorIyBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgUXQncyBxaGVscGdlbmVyYXRvciB0byBnZW5lcmF0ZSBhIFF0IENvbXByZXNzZWQgSGVscAorIyAoLnFjaCkgb2YgdGhlIGdlbmVyYXRlZCBIVE1MIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfUUhQICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFFIR19MT0NBVElPTiB0YWcgaXMgc3BlY2lmaWVkLCB0aGUgUUNIX0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkKKyMgdGhlIGZpbGUgbmFtZSBvZiB0aGUgcmVzdWx0aW5nIC5xY2ggZmlsZS4gVGhlIHBhdGggc3BlY2lmaWVkIGlzIHJlbGF0aXZlIHRvCisjIHRoZSBIVE1MIG91dHB1dCBmb2xkZXIuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUNIX0ZJTEUgICAgICAgICAgICAgICA9IAorCisjIFRoZSBRSFBfTkFNRVNQQUNFIHRhZyBzcGVjaWZpZXMgdGhlIG5hbWVzcGFjZSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIFF0IEhlbHAKKyMgUHJvamVjdCBvdXRwdXQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgUXQgSGVscCBQcm9qZWN0IC8gTmFtZXNwYWNlCisjIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNuYW1lc3BhY2UpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogb3JnLmRveHlnZW4uUHJvamVjdC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSFBfTkFNRVNQQUNFICAgICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdAorCisjIFRoZSBRSFBfVklSVFVBTF9GT0xERVIgdGFnIHNwZWNpZmllcyB0aGUgbmFtZXNwYWNlIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgUXQKKyMgSGVscCBQcm9qZWN0IG91dHB1dC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSBRdCBIZWxwIFByb2plY3QgLyBWaXJ0dWFsCisjIEZvbGRlcnMgKHNlZTogaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI3ZpcnR1YWwtCisjIGZvbGRlcnMpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogZG9jLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIUF9WSVJUVUFMX0ZPTERFUiAgICAgPSBkb2MKKworIyBJZiB0aGUgUUhQX0NVU1RfRklMVEVSX05BTUUgdGFnIGlzIHNldCwgaXQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgY3VzdG9tCisjIGZpbHRlciB0byBhZGQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgUXQgSGVscCBQcm9qZWN0IC8gQ3VzdG9tCisjIEZpbHRlcnMgKHNlZTogaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI2N1c3RvbS0KKyMgZmlsdGVycykuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhQX0NVU1RfRklMVEVSX05BTUUgICA9IAorCisjIFRoZSBRSFBfQ1VTVF9GSUxURVJfQVRUUlMgdGFnIHNwZWNpZmllcyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyBvZiB0aGUKKyMgY3VzdG9tIGZpbHRlciB0byBhZGQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgUXQgSGVscCBQcm9qZWN0IC8gQ3VzdG9tCisjIEZpbHRlcnMgKHNlZTogaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI2N1c3RvbS0KKyMgZmlsdGVycykuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhQX0NVU1RfRklMVEVSX0FUVFJTICA9IAorCisjIFRoZSBRSFBfU0VDVF9GSUxURVJfQVRUUlMgdGFnIHNwZWNpZmllcyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyB0aGlzCisjIHByb2plY3QncyBmaWx0ZXIgc2VjdGlvbiBtYXRjaGVzLiBRdCBIZWxwIFByb2plY3QgLyBGaWx0ZXIgQXR0cmlidXRlcyAoc2VlOgorIyBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjZmlsdGVyLWF0dHJpYnV0ZXMpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIUF9TRUNUX0ZJTFRFUl9BVFRSUyAgPSAKKworIyBUaGUgUUhHX0xPQ0FUSU9OIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiBRdCdzCisjIHFoZWxwZ2VuZXJhdG9yLiBJZiBub24tZW1wdHkgZG94eWdlbiB3aWxsIHRyeSB0byBydW4gcWhlbHBnZW5lcmF0b3Igb24gdGhlCisjIGdlbmVyYXRlZCAucWhwIGZpbGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhHX0xPQ0FUSU9OICAgICAgICAgICA9IAorCisjIElmIHRoZSBHRU5FUkFURV9FQ0xJUFNFSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcyB3aWxsIGJlCisjIGdlbmVyYXRlZCwgdG9nZXRoZXIgd2l0aCB0aGUgSFRNTCBmaWxlcywgdGhleSBmb3JtIGFuIEVjbGlwc2UgaGVscCBwbHVnaW4uIFRvCisjIGluc3RhbGwgdGhpcyBwbHVnaW4gYW5kIG1ha2UgaXQgYXZhaWxhYmxlIHVuZGVyIHRoZSBoZWxwIGNvbnRlbnRzIG1lbnUgaW4KKyMgRWNsaXBzZSwgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgSFRNTCBhbmQgWE1MIGZpbGVzIG5lZWRzCisjIHRvIGJlIGNvcGllZCBpbnRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeSBvZiBlY2xpcHNlLiBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5CisjIHdpdGhpbiB0aGUgcGx1Z2lucyBkaXJlY3Rvcnkgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBFQ0xJUFNFX0RPQ19JRCB2YWx1ZS4KKyMgQWZ0ZXIgY29weWluZyBFY2xpcHNlIG5lZWRzIHRvIGJlIHJlc3RhcnRlZCBiZWZvcmUgdGhlIGhlbHAgYXBwZWFycy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9FQ0xJUFNFSEVMUCAgID0gTk8KKworIyBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgRWNsaXBzZSBoZWxwIHBsdWdpbi4gV2hlbiBpbnN0YWxsaW5nIHRoZSBwbHVnaW4KKyMgdGhlIGRpcmVjdG9yeSBuYW1lIGNvbnRhaW5pbmcgdGhlIEhUTUwgYW5kIFhNTCBmaWxlcyBzaG91bGQgYWxzbyBoYXZlIHRoaXMKKyMgbmFtZS4gRWFjaCBkb2N1bWVudGF0aW9uIHNldCBzaG91bGQgaGF2ZSBpdHMgb3duIGlkZW50aWZpZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBvcmcuZG94eWdlbi5Qcm9qZWN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRUNMSVBTRUhFTFAgaXMgc2V0IHRvIFlFUy4KKworRUNMSVBTRV9ET0NfSUQgICAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QKKworIyBJZiB5b3Ugd2FudCBmdWxsIGNvbnRyb2wgb3ZlciB0aGUgbGF5b3V0IG9mIHRoZSBnZW5lcmF0ZWQgSFRNTCBwYWdlcyBpdCBtaWdodAorIyBiZSBuZWNlc3NhcnkgdG8gZGlzYWJsZSB0aGUgaW5kZXggYW5kIHJlcGxhY2UgaXQgd2l0aCB5b3VyIG93bi4gVGhlCisjIERJU0FCTEVfSU5ERVggdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBjb25kZW5zZWQgaW5kZXggKHRhYnMpIGF0IHRvcAorIyBvZiBlYWNoIEhUTUwgcGFnZS4gQSB2YWx1ZSBvZiBOTyBlbmFibGVzIHRoZSBpbmRleCBhbmQgdGhlIHZhbHVlIFlFUyBkaXNhYmxlcworIyBpdC4gU2luY2UgdGhlIHRhYnMgaW4gdGhlIGluZGV4IGNvbnRhaW4gdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgdGhlIG5hdmlnYXRpb24KKyMgdHJlZSwgeW91IGNhbiBzZXQgdGhpcyBvcHRpb24gdG8gWUVTIGlmIHlvdSBhbHNvIHNldCBHRU5FUkFURV9UUkVFVklFVyB0byBZRVMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworRElTQUJMRV9JTkRFWCAgICAgICAgICA9IE5PCisKKyMgVGhlIEdFTkVSQVRFX1RSRUVWSUVXIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciBhIHRyZWUtbGlrZSBpbmRleAorIyBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGdlbmVyYXRlZCB0byBkaXNwbGF5IGhpZXJhcmNoaWNhbCBpbmZvcm1hdGlvbi4gSWYgdGhlIHRhZworIyB2YWx1ZSBpcyBzZXQgdG8gWUVTLCBhIHNpZGUgcGFuZWwgd2lsbCBiZSBnZW5lcmF0ZWQgY29udGFpbmluZyBhIHRyZWUtbGlrZQorIyBpbmRleCBzdHJ1Y3R1cmUgKGp1c3QgbGlrZSB0aGUgb25lIHRoYXQgaXMgZ2VuZXJhdGVkIGZvciBIVE1MIEhlbHApLiBGb3IgdGhpcworIyB0byB3b3JrIGEgYnJvd3NlciB0aGF0IHN1cHBvcnRzIEphdmFTY3JpcHQsIERIVE1MLCBDU1MgYW5kIGZyYW1lcyBpcyByZXF1aXJlZAorIyAoaS5lLiBhbnkgbW9kZXJuIGJyb3dzZXIpLiBXaW5kb3dzIHVzZXJzIGFyZSBwcm9iYWJseSBiZXR0ZXIgb2ZmIHVzaW5nIHRoZQorIyBIVE1MIGhlbHAgZmVhdHVyZS4gVmlhIGN1c3RvbSBzdHlsZXNoZWV0cyAoc2VlIEhUTUxfRVhUUkFfU1RZTEVTSEVFVCkgb25lIGNhbgorIyBmdXJ0aGVyIGZpbmUtdHVuZSB0aGUgbG9vayBvZiB0aGUgaW5kZXguIEFzIGFuIGV4YW1wbGUsIHRoZSBkZWZhdWx0IHN0eWxlCisjIHNoZWV0IGdlbmVyYXRlZCBieSBkb3h5Z2VuIGhhcyBhbiBleGFtcGxlIHRoYXQgc2hvd3MgaG93IHRvIHB1dCBhbiBpbWFnZSBhdAorIyB0aGUgcm9vdCBvZiB0aGUgdHJlZSBpbnN0ZWFkIG9mIHRoZSBQUk9KRUNUX05BTUUuIFNpbmNlIHRoZSB0cmVlIGJhc2ljYWxseSBoYXMKKyMgdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgdGhlIHRhYiBpbmRleCwgeW91IGNvdWxkIGNvbnNpZGVyIHNldHRpbmcKKyMgRElTQUJMRV9JTkRFWCB0byBZRVMgd2hlbiBlbmFibGluZyB0aGlzIG9wdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9UUkVFVklFVyAgICAgID0gTk8KKworIyBUaGUgRU5VTV9WQUxVRVNfUEVSX0xJTkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbnVtYmVyIG9mIGVudW0gdmFsdWVzIHRoYXQKKyMgZG94eWdlbiB3aWxsIGdyb3VwIG9uIG9uZSBsaW5lIGluIHRoZSBnZW5lcmF0ZWQgSFRNTCBkb2N1bWVudGF0aW9uLgorIworIyBOb3RlIHRoYXQgYSB2YWx1ZSBvZiAwIHdpbGwgY29tcGxldGVseSBzdXBwcmVzcyB0aGUgZW51bSB2YWx1ZXMgZnJvbSBhcHBlYXJpbmcKKyMgaW4gdGhlIG92ZXJ2aWV3IHNlY3Rpb24uCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDIwLCBkZWZhdWx0IHZhbHVlOiA0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitFTlVNX1ZBTFVFU19QRVJfTElORSAgID0gNAorCisjIElmIHRoZSB0cmVldmlldyBpcyBlbmFibGVkIChzZWUgR0VORVJBVEVfVFJFRVZJRVcpIHRoZW4gdGhpcyB0YWcgY2FuIGJlIHVzZWQKKyMgdG8gc2V0IHRoZSBpbml0aWFsIHdpZHRoIChpbiBwaXhlbHMpIG9mIHRoZSBmcmFtZSBpbiB3aGljaCB0aGUgdHJlZSBpcyBzaG93bi4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTUwMCwgZGVmYXVsdCB2YWx1ZTogMjUwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitUUkVFVklFV19XSURUSCAgICAgICAgID0gMjUwCisKKyMgV2hlbiB0aGUgRVhUX0xJTktTX0lOX1dJTkRPVyBvcHRpb24gaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgb3BlbiBsaW5rcyB0bworIyBleHRlcm5hbCBzeW1ib2xzIGltcG9ydGVkIHZpYSB0YWcgZmlsZXMgaW4gYSBzZXBhcmF0ZSB3aW5kb3cuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworRVhUX0xJTktTX0lOX1dJTkRPVyAgICA9IE5PCisKKyMgVXNlIHRoaXMgdGFnIHRvIGNoYW5nZSB0aGUgZm9udCBzaXplIG9mIExhVGVYIGZvcm11bGFzIGluY2x1ZGVkIGFzIGltYWdlcyBpbgorIyB0aGUgSFRNTCBkb2N1bWVudGF0aW9uLiBXaGVuIHlvdSBjaGFuZ2UgdGhlIGZvbnQgc2l6ZSBhZnRlciBhIHN1Y2Nlc3NmdWwKKyMgZG94eWdlbiBydW4geW91IG5lZWQgdG8gbWFudWFsbHkgcmVtb3ZlIGFueSBmb3JtXyoucG5nIGltYWdlcyBmcm9tIHRoZSBIVE1MCisjIG91dHB1dCBkaXJlY3RvcnkgdG8gZm9yY2UgdGhlbSB0byBiZSByZWdlbmVyYXRlZC4KKyMgTWluaW11bSB2YWx1ZTogOCwgbWF4aW11bSB2YWx1ZTogNTAsIGRlZmF1bHQgdmFsdWU6IDEwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitGT1JNVUxBX0ZPTlRTSVpFICAgICAgID0gMTAKKworIyBVc2UgdGhlIEZPUk1VTEFfVFJBTlBBUkVOVCB0YWcgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZSBpbWFnZXMKKyMgZ2VuZXJhdGVkIGZvciBmb3JtdWxhcyBhcmUgdHJhbnNwYXJlbnQgUE5Hcy4gVHJhbnNwYXJlbnQgUE5HcyBhcmUgbm90CisjIHN1cHBvcnRlZCBwcm9wZXJseSBmb3IgSUUgNi4wLCBidXQgYXJlIHN1cHBvcnRlZCBvbiBhbGwgbW9kZXJuIGJyb3dzZXJzLgorIworIyBOb3RlIHRoYXQgd2hlbiBjaGFuZ2luZyB0aGlzIG9wdGlvbiB5b3UgbmVlZCB0byBkZWxldGUgYW55IGZvcm1fKi5wbmcgZmlsZXMgaW4KKyMgdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeSBiZWZvcmUgdGhlIGNoYW5nZXMgaGF2ZSBlZmZlY3QuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0ZPUk1VTEFfVFJBTlNQQVJFTlQgICAgPSBZRVMKKworIyBFbmFibGUgdGhlIFVTRV9NQVRISkFYIG9wdGlvbiB0byByZW5kZXIgTGFUZVggZm9ybXVsYXMgdXNpbmcgTWF0aEpheCAoc2VlCisjIGh0dHA6Ly93d3cubWF0aGpheC5vcmcpIHdoaWNoIHVzZXMgY2xpZW50IHNpZGUgSmF2YXNjcmlwdCBmb3IgdGhlIHJlbmRlcmluZworIyBpbnN0ZWFkIG9mIHVzaW5nIHByZXJlbmRlcmVkIGJpdG1hcHMuIFVzZSB0aGlzIGlmIHlvdSBkbyBub3QgaGF2ZSBMYVRlWAorIyBpbnN0YWxsZWQgb3IgaWYgeW91IHdhbnQgdG8gZm9ybXVsYXMgbG9vayBwcmV0dGllciBpbiB0aGUgSFRNTCBvdXRwdXQuIFdoZW4KKyMgZW5hYmxlZCB5b3UgbWF5IGFsc28gbmVlZCB0byBpbnN0YWxsIE1hdGhKYXggc2VwYXJhdGVseSBhbmQgY29uZmlndXJlIHRoZSBwYXRoCisjIHRvIGl0IHVzaW5nIHRoZSBNQVRISkFYX1JFTFBBVEggb3B0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK1VTRV9NQVRISkFYICAgICAgICAgICAgPSBOTworCisjIFdoZW4gTWF0aEpheCBpcyBlbmFibGVkIHlvdSBjYW4gc2V0IHRoZSBkZWZhdWx0IG91dHB1dCBmb3JtYXQgdG8gYmUgdXNlZCBmb3IKKyMgdGhlIE1hdGhKYXggb3V0cHV0LiBTZWUgdGhlIE1hdGhKYXggc2l0ZSAoc2VlOgorIyBodHRwOi8vZG9jcy5tYXRoamF4Lm9yZy9lbi9sYXRlc3Qvb3V0cHV0Lmh0bWwpIGZvciBtb3JlIGRldGFpbHMuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmU6IEhUTUwtQ1NTICh3aGljaCBpcyBzbG93ZXIsIGJ1dCBoYXMgdGhlIGJlc3QKKyMgY29tcGF0aWJpbGl0eSksIE5hdGl2ZU1NTCAoaS5lLiBNYXRoTUwpIGFuZCBTVkcuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBIVE1MLUNTUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFVTRV9NQVRISkFYIGlzIHNldCB0byBZRVMuCisKK01BVEhKQVhfRk9STUFUICAgICAgICAgPSBIVE1MLUNTUworCisjIFdoZW4gTWF0aEpheCBpcyBlbmFibGVkIHlvdSBuZWVkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSBIVE1MCisjIG91dHB1dCBkaXJlY3RvcnkgdXNpbmcgdGhlIE1BVEhKQVhfUkVMUEFUSCBvcHRpb24uIFRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkKKyMgc2hvdWxkIGNvbnRhaW4gdGhlIE1hdGhKYXguanMgc2NyaXB0LiBGb3IgaW5zdGFuY2UsIGlmIHRoZSBtYXRoamF4IGRpcmVjdG9yeQorIyBpcyBsb2NhdGVkIGF0IHRoZSBzYW1lIGxldmVsIGFzIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnksIHRoZW4KKyMgTUFUSEpBWF9SRUxQQVRIIHNob3VsZCBiZSAuLi9tYXRoamF4LiBUaGUgZGVmYXVsdCB2YWx1ZSBwb2ludHMgdG8gdGhlIE1hdGhKYXgKKyMgQ29udGVudCBEZWxpdmVyeSBOZXR3b3JrIHNvIHlvdSBjYW4gcXVpY2tseSBzZWUgdGhlIHJlc3VsdCB3aXRob3V0IGluc3RhbGxpbmcKKyMgTWF0aEpheC4gSG93ZXZlciwgaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gaW5zdGFsbCBhIGxvY2FsIGNvcHkgb2YKKyMgTWF0aEpheCBmcm9tIGh0dHA6Ly93d3cubWF0aGpheC5vcmcgYmVmb3JlIGRlcGxveW1lbnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBodHRwOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgVVNFX01BVEhKQVggaXMgc2V0IHRvIFlFUy4KKworTUFUSEpBWF9SRUxQQVRIICAgICAgICA9IGh0dHA6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QKKworIyBUaGUgTUFUSEpBWF9FWFRFTlNJT05TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIE1hdGhKYXgKKyMgZXh0ZW5zaW9uIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGVuYWJsZWQgZHVyaW5nIE1hdGhKYXggcmVuZGVyaW5nLiBGb3IgZXhhbXBsZQorIyBNQVRISkFYX0VYVEVOU0lPTlMgPSBUZVgvQU1TbWF0aCBUZVgvQU1Tc3ltYm9scworIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgVVNFX01BVEhKQVggaXMgc2V0IHRvIFlFUy4KKworTUFUSEpBWF9FWFRFTlNJT05TICAgICA9IAorCisjIFRoZSBNQVRISkFYX0NPREVGSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgZmlsZSB3aXRoIGphdmFzY3JpcHQgcGllY2VzCisjIG9mIGNvZGUgdGhhdCB3aWxsIGJlIHVzZWQgb24gc3RhcnR1cCBvZiB0aGUgTWF0aEpheCBjb2RlLiBTZWUgdGhlIE1hdGhKYXggc2l0ZQorIyAoc2VlOiBodHRwOi8vZG9jcy5tYXRoamF4Lm9yZy9lbi9sYXRlc3Qvb3V0cHV0Lmh0bWwpIGZvciBtb3JlIGRldGFpbHMuIEZvciBhbgorIyBleGFtcGxlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFVTRV9NQVRISkFYIGlzIHNldCB0byBZRVMuCisKK01BVEhKQVhfQ09ERUZJTEUgICAgICAgPSAKKworIyBXaGVuIHRoZSBTRUFSQ0hFTkdJTkUgdGFnIGlzIGVuYWJsZWQgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgc2VhcmNoIGJveCBmb3IKKyMgdGhlIEhUTUwgb3V0cHV0LiBUaGUgdW5kZXJseWluZyBzZWFyY2ggZW5naW5lIHVzZXMgamF2YXNjcmlwdCBhbmQgREhUTUwgYW5kCisjIHNob3VsZCB3b3JrIG9uIGFueSBtb2Rlcm4gYnJvd3Nlci4gTm90ZSB0aGF0IHdoZW4gdXNpbmcgSFRNTCBoZWxwCisjIChHRU5FUkFURV9IVE1MSEVMUCksIFF0IGhlbHAgKEdFTkVSQVRFX1FIUCksIG9yIGRvY3NldHMgKEdFTkVSQVRFX0RPQ1NFVCkKKyMgdGhlcmUgaXMgYWxyZWFkeSBhIHNlYXJjaCBmdW5jdGlvbiBzbyB0aGlzIG9uZSBzaG91bGQgdHlwaWNhbGx5IGJlIGRpc2FibGVkLgorIyBGb3IgbGFyZ2UgcHJvamVjdHMgdGhlIGphdmFzY3JpcHQgYmFzZWQgc2VhcmNoIGVuZ2luZSBjYW4gYmUgc2xvdywgdGhlbgorIyBlbmFibGluZyBTRVJWRVJfQkFTRURfU0VBUkNIIG1heSBwcm92aWRlIGEgYmV0dGVyIHNvbHV0aW9uLiBJdCBpcyBwb3NzaWJsZSB0bworIyBzZWFyY2ggdXNpbmcgdGhlIGtleWJvYXJkOyB0byBqdW1wIHRvIHRoZSBzZWFyY2ggYm94IHVzZSA8YWNjZXNzIGtleT4gKyBTCisjICh3aGF0IHRoZSA8YWNjZXNzIGtleT4gaXMgZGVwZW5kcyBvbiB0aGUgT1MgYW5kIGJyb3dzZXIsIGJ1dCBpdCBpcyB0eXBpY2FsbHkKKyMgPENUUkw+LCA8QUxUPi88b3B0aW9uPiwgb3IgYm90aCkuIEluc2lkZSB0aGUgc2VhcmNoIGJveCB1c2UgdGhlIDxjdXJzb3IgZG93bgorIyBrZXk+IHRvIGp1bXAgaW50byB0aGUgc2VhcmNoIHJlc3VsdHMgd2luZG93LCB0aGUgcmVzdWx0cyBjYW4gYmUgbmF2aWdhdGVkCisjIHVzaW5nIHRoZSA8Y3Vyc29yIGtleXM+LiBQcmVzcyA8RW50ZXI+IHRvIHNlbGVjdCBhbiBpdGVtIG9yIDxlc2NhcGU+IHRvIGNhbmNlbAorIyB0aGUgc2VhcmNoLiBUaGUgZmlsdGVyIG9wdGlvbnMgY2FuIGJlIHNlbGVjdGVkIHdoZW4gdGhlIGN1cnNvciBpcyBpbnNpZGUgdGhlCisjIHNlYXJjaCBib3ggYnkgcHJlc3NpbmcgPFNoaWZ0Pis8Y3Vyc29yIGRvd24+LiBBbHNvIGhlcmUgdXNlIHRoZSA8Y3Vyc29yIGtleXM+CisjIHRvIHNlbGVjdCBhIGZpbHRlciBhbmQgPEVudGVyPiBvciA8ZXNjYXBlPiB0byBhY3RpdmF0ZSBvciBjYW5jZWwgdGhlIGZpbHRlcgorIyBvcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK1NFQVJDSEVOR0lORSAgICAgICAgICAgPSBZRVMKKworIyBXaGVuIHRoZSBTRVJWRVJfQkFTRURfU0VBUkNIIHRhZyBpcyBlbmFibGVkIHRoZSBzZWFyY2ggZW5naW5lIHdpbGwgYmUKKyMgaW1wbGVtZW50ZWQgdXNpbmcgYSB3ZWIgc2VydmVyIGluc3RlYWQgb2YgYSB3ZWIgY2xpZW50IHVzaW5nIEphdmFzY3JpcHQuIFRoZXJlCisjIGFyZSB0d28gZmxhdm91cnMgb2Ygd2ViIHNlcnZlciBiYXNlZCBzZWFyY2hpbmcgZGVwZW5kaW5nIG9uIHRoZQorIyBFWFRFUk5BTF9TRUFSQ0ggc2V0dGluZy4gV2hlbiBkaXNhYmxlZCwgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgUEhQIHNjcmlwdCBmb3IKKyMgc2VhcmNoaW5nIGFuZCBhbiBpbmRleCBmaWxlIHVzZWQgYnkgdGhlIHNjcmlwdC4gV2hlbiBFWFRFUk5BTF9TRUFSQ0ggaXMKKyMgZW5hYmxlZCB0aGUgaW5kZXhpbmcgYW5kIHNlYXJjaGluZyBuZWVkcyB0byBiZSBwcm92aWRlZCBieSBleHRlcm5hbCB0b29scy4gU2VlCisjIHRoZSBzZWN0aW9uICJFeHRlcm5hbCBJbmRleGluZyBhbmQgU2VhcmNoaW5nIiBmb3IgZGV0YWlscy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK1NFUlZFUl9CQVNFRF9TRUFSQ0ggICAgPSBOTworCisjIFdoZW4gRVhURVJOQUxfU0VBUkNIIHRhZyBpcyBlbmFibGVkIGRveHlnZW4gd2lsbCBubyBsb25nZXIgZ2VuZXJhdGUgdGhlIFBIUAorIyBzY3JpcHQgZm9yIHNlYXJjaGluZy4gSW5zdGVhZCB0aGUgc2VhcmNoIHJlc3VsdHMgYXJlIHdyaXR0ZW4gdG8gYW4gWE1MIGZpbGUKKyMgd2hpY2ggbmVlZHMgdG8gYmUgcHJvY2Vzc2VkIGJ5IGFuIGV4dGVybmFsIGluZGV4ZXIuIERveHlnZW4gd2lsbCBpbnZva2UgYW4KKyMgZXh0ZXJuYWwgc2VhcmNoIGVuZ2luZSBwb2ludGVkIHRvIGJ5IHRoZSBTRUFSQ0hFTkdJTkVfVVJMIG9wdGlvbiB0byBvYnRhaW4gdGhlCisjIHNlYXJjaCByZXN1bHRzLgorIworIyBEb3h5Z2VuIHNoaXBzIHdpdGggYW4gZXhhbXBsZSBpbmRleGVyICggZG94eWluZGV4ZXIpIGFuZCBzZWFyY2ggZW5naW5lCisjIChkb3h5c2VhcmNoLmNnaSkgd2hpY2ggYXJlIGJhc2VkIG9uIHRoZSBvcGVuIHNvdXJjZSBzZWFyY2ggZW5naW5lIGxpYnJhcnkKKyMgWGFwaWFuIChzZWU6IGh0dHA6Ly94YXBpYW4ub3JnLykuCisjCisjIFNlZSB0aGUgc2VjdGlvbiAiRXh0ZXJuYWwgSW5kZXhpbmcgYW5kIFNlYXJjaGluZyIgZm9yIGRldGFpbHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitFWFRFUk5BTF9TRUFSQ0ggICAgICAgID0gTk8KKworIyBUaGUgU0VBUkNIRU5HSU5FX1VSTCBzaG91bGQgcG9pbnQgdG8gYSBzZWFyY2ggZW5naW5lIGhvc3RlZCBieSBhIHdlYiBzZXJ2ZXIKKyMgd2hpY2ggd2lsbCByZXR1cm4gdGhlIHNlYXJjaCByZXN1bHRzIHdoZW4gRVhURVJOQUxfU0VBUkNIIGlzIGVuYWJsZWQuCisjCisjIERveHlnZW4gc2hpcHMgd2l0aCBhbiBleGFtcGxlIGluZGV4ZXIgKCBkb3h5aW5kZXhlcikgYW5kIHNlYXJjaCBlbmdpbmUKKyMgKGRveHlzZWFyY2guY2dpKSB3aGljaCBhcmUgYmFzZWQgb24gdGhlIG9wZW4gc291cmNlIHNlYXJjaCBlbmdpbmUgbGlicmFyeQorIyBYYXBpYW4gKHNlZTogaHR0cDovL3hhcGlhbi5vcmcvKS4gU2VlIHRoZSBzZWN0aW9uICJFeHRlcm5hbCBJbmRleGluZyBhbmQKKyMgU2VhcmNoaW5nIiBmb3IgZGV0YWlscy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitTRUFSQ0hFTkdJTkVfVVJMICAgICAgID0gCisKKyMgV2hlbiBTRVJWRVJfQkFTRURfU0VBUkNIIGFuZCBFWFRFUk5BTF9TRUFSQ0ggYXJlIGJvdGggZW5hYmxlZCB0aGUgdW5pbmRleGVkCisjIHNlYXJjaCBkYXRhIGlzIHdyaXR0ZW4gdG8gYSBmaWxlIGZvciBpbmRleGluZyBieSBhbiBleHRlcm5hbCB0b29sLiBXaXRoIHRoZQorIyBTRUFSQ0hEQVRBX0ZJTEUgdGFnIHRoZSBuYW1lIG9mIHRoaXMgZmlsZSBjYW4gYmUgc3BlY2lmaWVkLgorIyBUaGUgZGVmYXVsdCBmaWxlIGlzOiBzZWFyY2hkYXRhLnhtbC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitTRUFSQ0hEQVRBX0ZJTEUgICAgICAgID0gc2VhcmNoZGF0YS54bWwKKworIyBXaGVuIFNFUlZFUl9CQVNFRF9TRUFSQ0ggYW5kIEVYVEVSTkFMX1NFQVJDSCBhcmUgYm90aCBlbmFibGVkIHRoZQorIyBFWFRFUk5BTF9TRUFSQ0hfSUQgdGFnIGNhbiBiZSB1c2VkIGFzIGFuIGlkZW50aWZpZXIgZm9yIHRoZSBwcm9qZWN0LiBUaGlzIGlzCisjIHVzZWZ1bCBpbiBjb21iaW5hdGlvbiB3aXRoIEVYVFJBX1NFQVJDSF9NQVBQSU5HUyB0byBzZWFyY2ggdGhyb3VnaCBtdWx0aXBsZQorIyBwcm9qZWN0cyBhbmQgcmVkaXJlY3QgdGhlIHJlc3VsdHMgYmFjayB0byB0aGUgcmlnaHQgcHJvamVjdC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitFWFRFUk5BTF9TRUFSQ0hfSUQgICAgID0gCisKKyMgVGhlIEVYVFJBX1NFQVJDSF9NQVBQSU5HUyB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIHNlYXJjaGluZyB0aHJvdWdoIGRveHlnZW4KKyMgcHJvamVjdHMgb3RoZXIgdGhhbiB0aGUgb25lIGRlZmluZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsIGJ1dCB0aGF0IGFyZQorIyBhbGwgYWRkZWQgdG8gdGhlIHNhbWUgZXh0ZXJuYWwgc2VhcmNoIGluZGV4LiBFYWNoIHByb2plY3QgbmVlZHMgdG8gaGF2ZSBhCisjIHVuaXF1ZSBpZCBzZXQgdmlhIEVYVEVSTkFMX1NFQVJDSF9JRC4gVGhlIHNlYXJjaCBtYXBwaW5nIHRoZW4gbWFwcyB0aGUgaWQgb2YKKyMgdG8gYSByZWxhdGl2ZSBsb2NhdGlvbiB3aGVyZSB0aGUgZG9jdW1lbnRhdGlvbiBjYW4gYmUgZm91bmQuIFRoZSBmb3JtYXQgaXM6CisjIEVYVFJBX1NFQVJDSF9NQVBQSU5HUyA9IHRhZ25hbWUxPWxvYzEgdGFnbmFtZTI9bG9jMiAuLi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitFWFRSQV9TRUFSQ0hfTUFQUElOR1MgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIExhVGVYIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgTGFUZVggb3V0cHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9MQVRFWCAgICAgICAgID0gWUVTCisKKyMgVGhlIExBVEVYX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBMYVRlWCBkb2NzIHdpbGwgYmUgcHV0LiBJZiBhCisjIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgorIyBpdC4KKyMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiBsYXRleC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX09VVFBVVCAgICAgICAgICAgPSBsYXRleAorCisjIFRoZSBMQVRFWF9DTURfTkFNRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgTGFUZVggY29tbWFuZCBuYW1lIHRvIGJlCisjIGludm9rZWQuCisjCisjIE5vdGUgdGhhdCB3aGVuIGVuYWJsaW5nIFVTRV9QREZMQVRFWCB0aGlzIG9wdGlvbiBpcyBvbmx5IHVzZWQgZm9yIGdlbmVyYXRpbmcKKyMgYml0bWFwcyBmb3IgZm9ybXVsYXMgaW4gdGhlIEhUTUwgb3V0cHV0LCBidXQgbm90IGluIHRoZSBNYWtlZmlsZSB0aGF0IGlzCisjIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuCisjIFRoZSBkZWZhdWx0IGZpbGUgaXM6IGxhdGV4LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfQ01EX05BTUUgICAgICAgICA9IGxhdGV4CisKKyMgVGhlIE1BS0VJTkRFWF9DTURfTkFNRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgY29tbWFuZCBuYW1lIHRvIGdlbmVyYXRlCisjIGluZGV4IGZvciBMYVRlWC4KKyMgVGhlIGRlZmF1bHQgZmlsZSBpczogbWFrZWluZGV4LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTUFLRUlOREVYX0NNRF9OQU1FICAgICA9IG1ha2VpbmRleAorCisjIElmIHRoZSBDT01QQUNUX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gZ2VuZXJhdGVzIG1vcmUgY29tcGFjdCBMYVRlWAorIyBkb2N1bWVudHMuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3Igc21hbGwgcHJvamVjdHMgYW5kIG1heSBoZWxwIHRvIHNhdmUgc29tZQorIyB0cmVlcyBpbiBnZW5lcmFsLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitDT01QQUNUX0xBVEVYICAgICAgICAgID0gTk8KKworIyBUaGUgUEFQRVJfVFlQRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBwYXBlciB0eXBlIHRoYXQgaXMgdXNlZCBieSB0aGUKKyMgcHJpbnRlci4KKyMgUG9zc2libGUgdmFsdWVzIGFyZTogYTQgKDIxMCB4IDI5NyBtbSksIGxldHRlciAoOC41IHggMTEgaW5jaGVzKSwgbGVnYWwgKDguNSB4CisjIDE0IGluY2hlcykgYW5kIGV4ZWN1dGl2ZSAoNy4yNSB4IDEwLjUgaW5jaGVzKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IGE0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworUEFQRVJfVFlQRSAgICAgICAgICAgICA9IGE0CisKKyMgVGhlIEVYVFJBX1BBQ0tBR0VTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIExhVGVYIHBhY2thZ2UgbmFtZXMKKyMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIExhVGVYIG91dHB1dC4gVG8gZ2V0IHRoZSB0aW1lcyBmb250IGZvcgorIyBpbnN0YW5jZSB5b3UgY2FuIHNwZWNpZnkKKyMgRVhUUkFfUEFDS0FHRVM9dGltZXMKKyMgSWYgbGVmdCBibGFuayBubyBleHRyYSBwYWNrYWdlcyB3aWxsIGJlIGluY2x1ZGVkLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworRVhUUkFfUEFDS0FHRVMgICAgICAgICA9IAorCisjIFRoZSBMQVRFWF9IRUFERVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBMYVRlWCBoZWFkZXIgZm9yIHRoZQorIyBnZW5lcmF0ZWQgTGFUZVggZG9jdW1lbnQuIFRoZSBoZWFkZXIgc2hvdWxkIGNvbnRhaW4gZXZlcnl0aGluZyB1bnRpbCB0aGUgZmlyc3QKKyMgY2hhcHRlci4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzdGFuZGFyZCBoZWFkZXIuIFNlZQorIyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGxldCBkb3h5Z2VuIHdyaXRlIHRoZQorIyBkZWZhdWx0IGhlYWRlciB0byBhIHNlcGFyYXRlIGZpbGUuCisjCisjIE5vdGU6IE9ubHkgdXNlIGEgdXNlci1kZWZpbmVkIGhlYWRlciBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchIFRoZQorIyBmb2xsb3dpbmcgY29tbWFuZHMgaGF2ZSBhIHNwZWNpYWwgbWVhbmluZyBpbnNpZGUgdGhlIGhlYWRlcjogJHRpdGxlLAorIyAkZGF0ZXRpbWUsICRkYXRlLCAkZG94eWdlbnZlcnNpb24sICRwcm9qZWN0bmFtZSwgJHByb2plY3RudW1iZXIuIERveHlnZW4gd2lsbAorIyByZXBsYWNlIHRoZW0gYnkgcmVzcGVjdGl2ZWx5IHRoZSB0aXRsZSBvZiB0aGUgcGFnZSwgdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSwKKyMgb25seSB0aGUgY3VycmVudCBkYXRlLCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgZG94eWdlbiwgdGhlIHByb2plY3QgbmFtZSAoc2VlCisjIFBST0pFQ1RfTkFNRSksIG9yIHRoZSBwcm9qZWN0IG51bWJlciAoc2VlIFBST0pFQ1RfTlVNQkVSKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0hFQURFUiAgICAgICAgICAgPSBkb2MvZG94eWdlbi9oZWFkZXIudGV4CisKKyMgVGhlIExBVEVYX0ZPT1RFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIExhVGVYIGZvb3RlciBmb3IgdGhlCisjIGdlbmVyYXRlZCBMYVRlWCBkb2N1bWVudC4gVGhlIGZvb3RlciBzaG91bGQgY29udGFpbiBldmVyeXRoaW5nIGFmdGVyIHRoZSBsYXN0CisjIGNoYXB0ZXIuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgc3RhbmRhcmQgZm9vdGVyLgorIworIyBOb3RlOiBPbmx5IHVzZSBhIHVzZXItZGVmaW5lZCBmb290ZXIgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIQorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfRk9PVEVSICAgICAgICAgICA9IAorCisjIFRoZSBMQVRFWF9FWFRSQV9GSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBleHRyYSBpbWFnZXMgb3IKKyMgb3RoZXIgc291cmNlIGZpbGVzIHdoaWNoIHNob3VsZCBiZSBjb3BpZWQgdG8gdGhlIExBVEVYX09VVFBVVCBvdXRwdXQKKyMgZGlyZWN0b3J5LiBOb3RlIHRoYXQgdGhlIGZpbGVzIHdpbGwgYmUgY29waWVkIGFzLWlzOyB0aGVyZSBhcmUgbm8gY29tbWFuZHMgb3IKKyMgbWFya2VycyBhdmFpbGFibGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9FWFRSQV9GSUxFUyAgICAgID0gCisKKyMgSWYgdGhlIFBERl9IWVBFUkxJTktTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgTGFUZVggdGhhdCBpcyBnZW5lcmF0ZWQgaXMKKyMgcHJlcGFyZWQgZm9yIGNvbnZlcnNpb24gdG8gUERGICh1c2luZyBwczJwZGYgb3IgcGRmbGF0ZXgpLiBUaGUgUERGIGZpbGUgd2lsbAorIyBjb250YWluIGxpbmtzIChqdXN0IGxpa2UgdGhlIEhUTUwgb3V0cHV0KSBpbnN0ZWFkIG9mIHBhZ2UgcmVmZXJlbmNlcy4gVGhpcworIyBtYWtlcyB0aGUgb3V0cHV0IHN1aXRhYmxlIGZvciBvbmxpbmUgYnJvd3NpbmcgdXNpbmcgYSBQREYgdmlld2VyLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworUERGX0hZUEVSTElOS1MgICAgICAgICA9IFlFUworCisjIElmIHRoZSBMQVRFWF9QREZMQVRFWCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHVzZSBwZGZsYXRleCB0byBnZW5lcmF0ZQorIyB0aGUgUERGIGZpbGUgZGlyZWN0bHkgZnJvbSB0aGUgTGFUZVggZmlsZXMuIFNldCB0aGlzIG9wdGlvbiB0byBZRVMgdG8gZ2V0IGEKKyMgaGlnaGVyIHF1YWxpdHkgUERGIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitVU0VfUERGTEFURVggICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIExBVEVYX0JBVENITU9ERSB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGFkZCB0aGUgXGJhdGNobW9kZQorIyBjb21tYW5kIHRvIHRoZSBnZW5lcmF0ZWQgTGFUZVggZmlsZXMuIFRoaXMgd2lsbCBpbnN0cnVjdCBMYVRlWCB0byBrZWVwIHJ1bm5pbmcKKyMgaWYgZXJyb3JzIG9jY3VyLCBpbnN0ZWFkIG9mIGFza2luZyB0aGUgdXNlciBmb3IgaGVscC4gVGhpcyBvcHRpb24gaXMgYWxzbyB1c2VkCisjIHdoZW4gZ2VuZXJhdGluZyBmb3JtdWxhcyBpbiBIVE1MLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9CQVRDSE1PREUgICAgICAgID0gTk8KKworIyBJZiB0aGUgTEFURVhfSElERV9JTkRJQ0VTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIG5vdCBpbmNsdWRlIHRoZQorIyBpbmRleCBjaGFwdGVycyAoc3VjaCBhcyBGaWxlIEluZGV4LCBDb21wb3VuZCBJbmRleCwgZXRjLikgaW4gdGhlIG91dHB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfSElERV9JTkRJQ0VTICAgICA9IE5PCisKKyMgSWYgdGhlIExBVEVYX1NPVVJDRV9DT0RFIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGluY2x1ZGUgc291cmNlCisjIGNvZGUgd2l0aCBzeW50YXggaGlnaGxpZ2h0aW5nIGluIHRoZSBMYVRlWCBvdXRwdXQuCisjCisjIE5vdGUgdGhhdCB3aGljaCBzb3VyY2VzIGFyZSBzaG93biBhbHNvIGRlcGVuZHMgb24gb3RoZXIgc2V0dGluZ3Mgc3VjaCBhcworIyBTT1VSQ0VfQlJPV1NFUi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfU09VUkNFX0NPREUgICAgICA9IE5PCisKKyMgVGhlIExBVEVYX0JJQl9TVFlMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgc3R5bGUgdG8gdXNlIGZvciB0aGUKKyMgYmlibGlvZ3JhcGh5LCBlLmcuIHBsYWlubmF0LCBvciBpZWVldHIuIFNlZQorIyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpYlRlWCBhbmQgXGNpdGUgZm9yIG1vcmUgaW5mby4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IHBsYWluLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfQklCX1NUWUxFICAgICAgICA9IHBsYWluCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFJURiBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfUlRGIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBSVEYgb3V0cHV0LiBUaGUKKyMgUlRGIG91dHB1dCBpcyBvcHRpbWl6ZWQgZm9yIFdvcmQgOTcgYW5kIG1heSBub3QgbG9vayB0b28gcHJldHR5IHdpdGggb3RoZXIgUlRGCisjIHJlYWRlcnMvZWRpdG9ycy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9SVEYgICAgICAgICAgID0gTk8KKworIyBUaGUgUlRGX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBSVEYgZG9jcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogcnRmLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK1JURl9PVVRQVVQgICAgICAgICAgICAgPSBydGYKKworIyBJZiB0aGUgQ09NUEFDVF9SVEYgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiBnZW5lcmF0ZXMgbW9yZSBjb21wYWN0IFJURgorIyBkb2N1bWVudHMuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3Igc21hbGwgcHJvamVjdHMgYW5kIG1heSBoZWxwIHRvIHNhdmUgc29tZQorIyB0cmVlcyBpbiBnZW5lcmFsLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9SVEYgaXMgc2V0IHRvIFlFUy4KKworQ09NUEFDVF9SVEYgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFJURl9IWVBFUkxJTktTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgUlRGIHRoYXQgaXMgZ2VuZXJhdGVkIHdpbGwKKyMgY29udGFpbiBoeXBlcmxpbmsgZmllbGRzLiBUaGUgUlRGIGZpbGUgd2lsbCBjb250YWluIGxpbmtzIChqdXN0IGxpa2UgdGhlIEhUTUwKKyMgb3V0cHV0KSBpbnN0ZWFkIG9mIHBhZ2UgcmVmZXJlbmNlcy4gVGhpcyBtYWtlcyB0aGUgb3V0cHV0IHN1aXRhYmxlIGZvciBvbmxpbmUKKyMgYnJvd3NpbmcgdXNpbmcgV29yZCBvciBzb21lIG90aGVyIFdvcmQgY29tcGF0aWJsZSByZWFkZXJzIHRoYXQgc3VwcG9ydCB0aG9zZQorIyBmaWVsZHMuCisjCisjIE5vdGU6IFdvcmRQYWQgKHdyaXRlKSBhbmQgb3RoZXJzIGRvIG5vdCBzdXBwb3J0IGxpbmtzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9SVEYgaXMgc2V0IHRvIFlFUy4KKworUlRGX0hZUEVSTElOS1MgICAgICAgICA9IE5PCisKKyMgTG9hZCBzdHlsZXNoZWV0IGRlZmluaXRpb25zIGZyb20gZmlsZS4gU3ludGF4IGlzIHNpbWlsYXIgdG8gZG94eWdlbidzIGNvbmZpZworIyBmaWxlLCBpLmUuIGEgc2VyaWVzIG9mIGFzc2lnbm1lbnRzLiBZb3Ugb25seSBoYXZlIHRvIHByb3ZpZGUgcmVwbGFjZW1lbnRzLAorIyBtaXNzaW5nIGRlZmluaXRpb25zIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZS4KKyMKKyMgU2VlIGFsc28gc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSB0aGUKKyMgZGVmYXVsdCBzdHlsZSBzaGVldCB0aGF0IGRveHlnZW4gbm9ybWFsbHkgdXNlcy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitSVEZfU1RZTEVTSEVFVF9GSUxFICAgID0gCisKKyMgU2V0IG9wdGlvbmFsIHZhcmlhYmxlcyB1c2VkIGluIHRoZSBnZW5lcmF0aW9uIG9mIGFuIFJURiBkb2N1bWVudC4gU3ludGF4IGlzCisjIHNpbWlsYXIgdG8gZG94eWdlbidzIGNvbmZpZyBmaWxlLiBBIHRlbXBsYXRlIGV4dGVuc2lvbnMgZmlsZSBjYW4gYmUgZ2VuZXJhdGVkCisjIHVzaW5nIGRveHlnZW4gLWUgcnRmIGV4dGVuc2lvbkZpbGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9SVEYgaXMgc2V0IHRvIFlFUy4KKworUlRGX0VYVEVOU0lPTlNfRklMRSAgICA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBtYW4gcGFnZSBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfTUFOIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBtYW4gcGFnZXMgZm9yCisjIGNsYXNzZXMgYW5kIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX01BTiAgICAgICAgICAgPSBOTworCisjIFRoZSBNQU5fT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIG1hbiBwYWdlcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuIEEgZGlyZWN0b3J5IG1hbjMgd2lsbCBiZSBjcmVhdGVkIGluc2lkZSB0aGUgZGlyZWN0b3J5IHNwZWNpZmllZCBieQorIyBNQU5fT1VUUFVULgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IG1hbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX01BTiBpcyBzZXQgdG8gWUVTLgorCitNQU5fT1VUUFVUICAgICAgICAgICAgID0gbWFuCisKKyMgVGhlIE1BTl9FWFRFTlNJT04gdGFnIGRldGVybWluZXMgdGhlIGV4dGVuc2lvbiB0aGF0IGlzIGFkZGVkIHRvIHRoZSBnZW5lcmF0ZWQKKyMgbWFuIHBhZ2VzLiBJbiBjYXNlIHRoZSBtYW51YWwgc2VjdGlvbiBkb2VzIG5vdCBzdGFydCB3aXRoIGEgbnVtYmVyLCB0aGUgbnVtYmVyCisjIDMgaXMgcHJlcGVuZGVkLiBUaGUgZG90ICguKSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBNQU5fRVhURU5TSU9OIHRhZyBpcworIyBvcHRpb25hbC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IC4zLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTUFOIGlzIHNldCB0byBZRVMuCisKK01BTl9FWFRFTlNJT04gICAgICAgICAgPSAuMworCisjIElmIHRoZSBNQU5fTElOS1MgdGFnIGlzIHNldCB0byBZRVMgYW5kIGRveHlnZW4gZ2VuZXJhdGVzIG1hbiBvdXRwdXQsIHRoZW4gaXQKKyMgd2lsbCBnZW5lcmF0ZSBvbmUgYWRkaXRpb25hbCBtYW4gZmlsZSBmb3IgZWFjaCBlbnRpdHkgZG9jdW1lbnRlZCBpbiB0aGUgcmVhbAorIyBtYW4gcGFnZShzKS4gVGhlc2UgYWRkaXRpb25hbCBmaWxlcyBvbmx5IHNvdXJjZSB0aGUgcmVhbCBtYW4gcGFnZSwgYnV0IHdpdGhvdXQKKyMgdGhlbSB0aGUgbWFuIGNvbW1hbmQgd291bGQgYmUgdW5hYmxlIHRvIGZpbmQgdGhlIGNvcnJlY3QgcGFnZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTUFOIGlzIHNldCB0byBZRVMuCisKK01BTl9MSU5LUyAgICAgICAgICAgICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBYTUwgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX1hNTCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYW4gWE1MIGZpbGUgdGhhdAorIyBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9YTUwgICAgICAgICAgID0gTk8KKworIyBUaGUgWE1MX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBYTUwgcGFnZXMgd2lsbCBiZSBwdXQuIElmIGEKKyMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCisjIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IHhtbC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1hNTCBpcyBzZXQgdG8gWUVTLgorCitYTUxfT1VUUFVUICAgICAgICAgICAgID0geG1sCisKKyMgVGhlIFhNTF9TQ0hFTUEgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBYTUwgc2NoZW1hLCB3aGljaCBjYW4gYmUgdXNlZCBieSBhCisjIHZhbGlkYXRpbmcgWE1MIHBhcnNlciB0byBjaGVjayB0aGUgc3ludGF4IG9mIHRoZSBYTUwgZmlsZXMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9YTUwgaXMgc2V0IHRvIFlFUy4KKworWE1MX1NDSEVNQSAgICAgICAgICAgICA9IAorCisjIFRoZSBYTUxfRFREIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgWE1MIERURCwgd2hpY2ggY2FuIGJlIHVzZWQgYnkgYQorIyB2YWxpZGF0aW5nIFhNTCBwYXJzZXIgdG8gY2hlY2sgdGhlIHN5bnRheCBvZiB0aGUgWE1MIGZpbGVzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfWE1MIGlzIHNldCB0byBZRVMuCisKK1hNTF9EVEQgICAgICAgICAgICAgICAgPSAKKworIyBJZiB0aGUgWE1MX1BST0dSQU1MSVNUSU5HIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBkdW1wIHRoZSBwcm9ncmFtCisjIGxpc3RpbmdzIChpbmNsdWRpbmcgc3ludGF4IGhpZ2hsaWdodGluZyBhbmQgY3Jvc3MtcmVmZXJlbmNpbmcgaW5mb3JtYXRpb24pIHRvCisjIHRoZSBYTUwgb3V0cHV0LiBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHNpemUKKyMgb2YgdGhlIFhNTCBvdXRwdXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9YTUwgaXMgc2V0IHRvIFlFUy4KKworWE1MX1BST0dSQU1MSVNUSU5HICAgICA9IFlFUworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBET0NCT09LIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9ET0NCT09LIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBEb2Nib29rIGZpbGVzCisjIHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgUERGLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX0RPQ0JPT0sgICAgICAgPSBOTworCisjIFRoZSBET0NCT09LX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBEb2Nib29rIHBhZ2VzIHdpbGwgYmUgcHV0LgorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbgorIyBmcm9udCBvZiBpdC4KKyMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiBkb2Nib29rLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DQk9PSyBpcyBzZXQgdG8gWUVTLgorCitET0NCT09LX09VVFBVVCAgICAgICAgID0gZG9jYm9vaworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIEF1dG9HZW4gRGVmaW5pdGlvbnMgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0FVVE9HRU5fREVGIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhbiBBdXRvR2VuCisjIERlZmluaXRpb25zIChzZWUgaHR0cDovL2F1dG9nZW4uc2YubmV0KSBmaWxlIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZgorIyB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgaXMgc3RpbGwKKyMgZXhwZXJpbWVudGFsIGFuZCBpbmNvbXBsZXRlIGF0IHRoZSBtb21lbnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfQVVUT0dFTl9ERUYgICA9IE5PCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFBlcmwgbW9kdWxlIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9QRVJMTU9EIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIFBlcmwgbW9kdWxlCisjIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4KKyMKKyMgTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcyBzdGlsbCBleHBlcmltZW50YWwgYW5kIGluY29tcGxldGUgYXQgdGhlIG1vbWVudC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9QRVJMTU9EICAgICAgID0gTk8KKworIyBJZiB0aGUgUEVSTE1PRF9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgdGhlIG5lY2Vzc2FyeQorIyBNYWtlZmlsZSBydWxlcywgUGVybCBzY3JpcHRzIGFuZCBMYVRlWCBjb2RlIHRvIGJlIGFibGUgdG8gZ2VuZXJhdGUgUERGIGFuZCBEVkkKKyMgb3V0cHV0IGZyb20gdGhlIFBlcmwgbW9kdWxlIG91dHB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUEVSTE1PRCBpcyBzZXQgdG8gWUVTLgorCitQRVJMTU9EX0xBVEVYICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUEVSTE1PRF9QUkVUVFkgdGFnIGlzIHNldCB0byBZRVMgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlIG5pY2VseQorIyBmb3JtYXR0ZWQgc28gaXQgY2FuIGJlIHBhcnNlZCBieSBhIGh1bWFuIHJlYWRlci4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8KKyMgdW5kZXJzdGFuZCB3aGF0IGlzIGdvaW5nIG9uLiBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhpcyB0YWcgaXMgc2V0IHRvIE5PIHRoZQorIyBzaXplIG9mIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQgd2lsbCBiZSBtdWNoIHNtYWxsZXIgYW5kIFBlcmwgd2lsbCBwYXJzZSBpdAorIyBqdXN0IHRoZSBzYW1lLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUEVSTE1PRCBpcyBzZXQgdG8gWUVTLgorCitQRVJMTU9EX1BSRVRUWSAgICAgICAgID0gWUVTCisKKyMgVGhlIG5hbWVzIG9mIHRoZSBtYWtlIHZhcmlhYmxlcyBpbiB0aGUgZ2VuZXJhdGVkIGRveHlydWxlcy5tYWtlIGZpbGUgYXJlCisjIHByZWZpeGVkIHdpdGggdGhlIHN0cmluZyBjb250YWluZWQgaW4gUEVSTE1PRF9NQUtFVkFSX1BSRUZJWC4gVGhpcyBpcyB1c2VmdWwKKyMgc28gZGlmZmVyZW50IGRveHlydWxlcy5tYWtlIGZpbGVzIGluY2x1ZGVkIGJ5IHRoZSBzYW1lIE1ha2VmaWxlIGRvbid0CisjIG92ZXJ3cml0ZSBlYWNoIG90aGVyJ3MgdmFyaWFibGVzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUEVSTE1PRCBpcyBzZXQgdG8gWUVTLgorCitQRVJMTU9EX01BS0VWQVJfUFJFRklYID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIHByZXByb2Nlc3NvcgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBFTkFCTEVfUFJFUFJPQ0VTU0lORyB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZXZhbHVhdGUgYWxsCisjIEMtcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgZm91bmQgaW4gdGhlIHNvdXJjZXMgYW5kIGluY2x1ZGUgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0VOQUJMRV9QUkVQUk9DRVNTSU5HICAgPSBZRVMKKworIyBJZiB0aGUgTUFDUk9fRVhQQU5TSU9OIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBleHBhbmQgYWxsIG1hY3JvIG5hbWVzCisjIGluIHRoZSBzb3VyY2UgY29kZS4gSWYgc2V0IHRvIE5PIG9ubHkgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gd2lsbCBiZQorIyBwZXJmb3JtZWQuIE1hY3JvIGV4cGFuc2lvbiBjYW4gYmUgZG9uZSBpbiBhIGNvbnRyb2xsZWQgd2F5IGJ5IHNldHRpbmcKKyMgRVhQQU5EX09OTFlfUFJFREVGIHRvIFlFUy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworTUFDUk9fRVhQQU5TSU9OICAgICAgICA9IFlFUworCisjIElmIHRoZSBFWFBBTkRfT05MWV9QUkVERUYgYW5kIE1BQ1JPX0VYUEFOU0lPTiB0YWdzIGFyZSBib3RoIHNldCB0byBZRVMgdGhlbgorIyB0aGUgbWFjcm8gZXhwYW5zaW9uIGlzIGxpbWl0ZWQgdG8gdGhlIG1hY3JvcyBzcGVjaWZpZWQgd2l0aCB0aGUgUFJFREVGSU5FRCBhbmQKKyMgRVhQQU5EX0FTX0RFRklORUQgdGFncy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworRVhQQU5EX09OTFlfUFJFREVGICAgICA9IFlFUworCisjIElmIHRoZSBTRUFSQ0hfSU5DTFVERVMgdGFnIGlzIHNldCB0byBZRVMgdGhlIGluY2x1ZGVzIGZpbGVzIGluIHRoZQorIyBJTkNMVURFX1BBVEggd2lsbCBiZSBzZWFyY2hlZCBpZiBhICNpbmNsdWRlIGlzIGZvdW5kLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworU0VBUkNIX0lOQ0xVREVTICAgICAgICA9IFlFUworCisjIFRoZSBJTkNMVURFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAorIyBjb250YWluIGluY2x1ZGUgZmlsZXMgdGhhdCBhcmUgbm90IGlucHV0IGZpbGVzIGJ1dCBzaG91bGQgYmUgcHJvY2Vzc2VkIGJ5IHRoZQorIyBwcmVwcm9jZXNzb3IuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hfSU5DTFVERVMgaXMgc2V0IHRvIFlFUy4KKworSU5DTFVERV9QQVRIICAgICAgICAgICA9IAorCisjIFlvdSBjYW4gdXNlIHRoZSBJTkNMVURFX0ZJTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQKKyMgcGF0dGVybnMgKGxpa2UgKi5oIGFuZCAqLmhwcCkgdG8gZmlsdGVyIG91dCB0aGUgaGVhZGVyLWZpbGVzIGluIHRoZQorIyBkaXJlY3Rvcmllcy4gSWYgbGVmdCBibGFuaywgdGhlIHBhdHRlcm5zIHNwZWNpZmllZCB3aXRoIEZJTEVfUEFUVEVSTlMgd2lsbCBiZQorIyB1c2VkLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworSU5DTFVERV9GSUxFX1BBVFRFUk5TICA9IAorCisjIFRoZSBQUkVERUZJTkVEIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIG1hY3JvIG5hbWVzIHRoYXQgYXJlCisjIGRlZmluZWQgYmVmb3JlIHRoZSBwcmVwcm9jZXNzb3IgaXMgc3RhcnRlZCAoc2ltaWxhciB0byB0aGUgLUQgb3B0aW9uIG9mIGUuZy4KKyMgZ2NjKS4gVGhlIGFyZ3VtZW50IG9mIHRoZSB0YWcgaXMgYSBsaXN0IG9mIG1hY3JvcyBvZiB0aGUgZm9ybTogbmFtZSBvcgorIyBuYW1lPWRlZmluaXRpb24gKG5vIHNwYWNlcykuIElmIHRoZSBkZWZpbml0aW9uIGFuZCB0aGUgIj0iIGFyZSBvbWl0dGVkLCAiPTEiCisjIGlzIGFzc3VtZWQuIFRvIHByZXZlbnQgYSBtYWNybyBkZWZpbml0aW9uIGZyb20gYmVpbmcgdW5kZWZpbmVkIHZpYSAjdW5kZWYgb3IKKyMgcmVjdXJzaXZlbHkgZXhwYW5kZWQgdXNlIHRoZSA6PSBvcGVyYXRvciBpbnN0ZWFkIG9mIHRoZSA9IG9wZXJhdG9yLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworUFJFREVGSU5FRCAgICAgICAgICAgICA9IENPSV9MSUJSQVJZX1ZFUlNJT049MiAtRE1ZT19TVVBQT1JUIC1ET0ZGTE9BRF9ERUJVRz0xIC1EU0VQX1NVUFBPUlQgLURUSU1JTkdfU1VQUE9SVAorCisjIElmIHRoZSBNQUNST19FWFBBTlNJT04gYW5kIEVYUEFORF9PTkxZX1BSRURFRiB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gdGhpcworIyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGxpc3Qgb2YgbWFjcm8gbmFtZXMgdGhhdCBzaG91bGQgYmUgZXhwYW5kZWQuIFRoZQorIyBtYWNybyBkZWZpbml0aW9uIHRoYXQgaXMgZm91bmQgaW4gdGhlIHNvdXJjZXMgd2lsbCBiZSB1c2VkLiBVc2UgdGhlIFBSRURFRklORUQKKyMgdGFnIGlmIHlvdSB3YW50IHRvIHVzZSBhIGRpZmZlcmVudCBtYWNybyBkZWZpbml0aW9uIHRoYXQgb3ZlcnJ1bGVzIHRoZQorIyBkZWZpbml0aW9uIGZvdW5kIGluIHRoZSBzb3VyY2UgY29kZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCisKK0VYUEFORF9BU19ERUZJTkVEICAgICAgPSAKKworIyBJZiB0aGUgU0tJUF9GVU5DVElPTl9NQUNST1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuJ3MgcHJlcHJvY2Vzc29yIHdpbGwKKyMgcmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIGZ1bmN0aW9uLWxpa2UgbWFjcm9zIHRoYXQgYXJlIGFsb25lIG9uIGEgbGluZSwgaGF2ZSBhbgorIyBhbGwgdXBwZXJjYXNlIG5hbWUsIGFuZCBkbyBub3QgZW5kIHdpdGggYSBzZW1pY29sb24uIFN1Y2ggZnVuY3Rpb24gbWFjcm9zIGFyZQorIyB0eXBpY2FsbHkgdXNlZCBmb3IgYm9pbGVyLXBsYXRlIGNvZGUsIGFuZCB3aWxsIGNvbmZ1c2UgdGhlIHBhcnNlciBpZiBub3QKKyMgcmVtb3ZlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCisKK1NLSVBfRlVOQ1RJT05fTUFDUk9TICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBleHRlcm5hbCByZWZlcmVuY2VzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIFRBR0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHRhZyBmaWxlcy4gRm9yIGVhY2ggdGFnCisjIGZpbGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBleHRlcm5hbCBkb2N1bWVudGF0aW9uIHNob3VsZCBiZSBhZGRlZC4gVGhlIGZvcm1hdCBvZgorIyBhIHRhZyBmaWxlIHdpdGhvdXQgdGhpcyBsb2NhdGlvbiBpcyBhcyBmb2xsb3dzOgorIyBUQUdGSUxFUyA9IGZpbGUxIGZpbGUyIC4uLgorIyBBZGRpbmcgbG9jYXRpb24gZm9yIHRoZSB0YWcgZmlsZXMgaXMgZG9uZSBhcyBmb2xsb3dzOgorIyBUQUdGSUxFUyA9IGZpbGUxPWxvYzEgImZpbGUyID0gbG9jMiIgLi4uCisjIHdoZXJlIGxvYzEgYW5kIGxvYzIgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGhzIG9yIFVSTHMuIFNlZSB0aGUKKyMgc2VjdGlvbiAiTGlua2luZyB0byBleHRlcm5hbCBkb2N1bWVudGF0aW9uIiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlCisjIG9mIHRhZyBmaWxlcy4KKyMgTm90ZTogRWFjaCB0YWcgZmlsZSBtdXN0IGhhdmUgYW4gdW5pcXVlIG5hbWUgKHdoZXJlIHRoZSBuYW1lIGRvZXMgTk9UIGluY2x1ZGUKKyMgdGhlIHBhdGgpLiBJZiBhIHRhZyBmaWxlIGlzIG5vdCBsb2NhdGVkIGluIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggZG94eWdlbiBpcworIyBydW4sIHlvdSBtdXN0IGFsc28gc3BlY2lmeSB0aGUgcGF0aCB0byB0aGUgdGFnZmlsZSBoZXJlLgorCitUQUdGSUxFUyAgICAgICAgICAgICAgID0gCisKKyMgV2hlbiBhIGZpbGUgbmFtZSBpcyBzcGVjaWZpZWQgYWZ0ZXIgR0VORVJBVEVfVEFHRklMRSwgZG94eWdlbiB3aWxsIGNyZWF0ZSBhCisjIHRhZyBmaWxlIHRoYXQgaXMgYmFzZWQgb24gdGhlIGlucHV0IGZpbGVzIGl0IHJlYWRzLiBTZWUgc2VjdGlvbiAiTGlua2luZyB0bworIyBleHRlcm5hbCBkb2N1bWVudGF0aW9uIiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNhZ2Ugb2YgdGFnIGZpbGVzLgorCitHRU5FUkFURV9UQUdGSUxFICAgICAgID0gCisKKyMgSWYgdGhlIEFMTEVYVEVSTkFMUyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgZXh0ZXJuYWwgY2xhc3Mgd2lsbCBiZSBsaXN0ZWQgaW4gdGhlCisjIGNsYXNzIGluZGV4LiBJZiBzZXQgdG8gTk8gb25seSB0aGUgaW5oZXJpdGVkIGV4dGVybmFsIGNsYXNzZXMgd2lsbCBiZSBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQUxMRVhURVJOQUxTICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVEVSTkFMX0dST1VQUyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgZXh0ZXJuYWwgZ3JvdXBzIHdpbGwgYmUgbGlzdGVkIGluCisjIHRoZSBtb2R1bGVzIGluZGV4LiBJZiBzZXQgdG8gTk8sIG9ubHkgdGhlIGN1cnJlbnQgcHJvamVjdCdzIGdyb3VwcyB3aWxsIGJlCisjIGxpc3RlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworRVhURVJOQUxfR1JPVVBTICAgICAgICA9IFlFUworCisjIElmIHRoZSBFWFRFUk5BTF9QQUdFUyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgZXh0ZXJuYWwgcGFnZXMgd2lsbCBiZSBsaXN0ZWQgaW4KKyMgdGhlIHJlbGF0ZWQgcGFnZXMgaW5kZXguIElmIHNldCB0byBOTywgb25seSB0aGUgY3VycmVudCBwcm9qZWN0J3MgcGFnZXMgd2lsbAorIyBiZSBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0VYVEVSTkFMX1BBR0VTICAgICAgICAgPSBZRVMKKworIyBUaGUgUEVSTF9QQVRIIHNob3VsZCBiZSB0aGUgYWJzb2x1dGUgcGF0aCBhbmQgbmFtZSBvZiB0aGUgcGVybCBzY3JpcHQKKyMgaW50ZXJwcmV0ZXIgKGkuZS4gdGhlIHJlc3VsdCBvZiAnd2hpY2ggcGVybCcpLgorIyBUaGUgZGVmYXVsdCBmaWxlICh3aXRoIGFic29sdXRlIHBhdGgpIGlzOiAvdXNyL2Jpbi9wZXJsLgorCitQRVJMX1BBVEggICAgICAgICAgICAgID0gL3Vzci9iaW4vcGVybAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBkb3QgdG9vbAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBDTEFTU19ESUFHUkFNUyB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjbGFzcyBkaWFncmFtCisjIChpbiBIVE1MIGFuZCBMYVRlWCkgZm9yIGNsYXNzZXMgd2l0aCBiYXNlIG9yIHN1cGVyIGNsYXNzZXMuIFNldHRpbmcgdGhlIHRhZyB0bworIyBOTyB0dXJucyB0aGUgZGlhZ3JhbXMgb2ZmLiBOb3RlIHRoYXQgdGhpcyBvcHRpb24gYWxzbyB3b3JrcyB3aXRoIEhBVkVfRE9UCisjIGRpc2FibGVkLCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gaW5zdGFsbCBhbmQgdXNlIGRvdCwgc2luY2UgaXQgeWllbGRzIG1vcmUKKyMgcG93ZXJmdWwgZ3JhcGhzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitDTEFTU19ESUFHUkFNUyAgICAgICAgID0gWUVTCisKKyMgWW91IGNhbiBkZWZpbmUgbWVzc2FnZSBzZXF1ZW5jZSBjaGFydHMgd2l0aGluIGRveHlnZW4gY29tbWVudHMgdXNpbmcgdGhlIFxtc2MKKyMgY29tbWFuZC4gRG94eWdlbiB3aWxsIHRoZW4gcnVuIHRoZSBtc2NnZW4gdG9vbCAoc2VlOgorIyBodHRwOi8vd3d3Lm1jdGVybmFuLm1lLnVrL21zY2dlbi8pKSB0byBwcm9kdWNlIHRoZSBjaGFydCBhbmQgaW5zZXJ0IGl0IGluIHRoZQorIyBkb2N1bWVudGF0aW9uLiBUaGUgTVNDR0VOX1BBVEggdGFnIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgZGlyZWN0b3J5IHdoZXJlCisjIHRoZSBtc2NnZW4gdG9vbCByZXNpZGVzLiBJZiBsZWZ0IGVtcHR5IHRoZSB0b29sIGlzIGFzc3VtZWQgdG8gYmUgZm91bmQgaW4gdGhlCisjIGRlZmF1bHQgc2VhcmNoIHBhdGguCisKK01TQ0dFTl9QQVRIICAgICAgICAgICAgPSAKKworIyBZb3UgY2FuIGluY2x1ZGUgZGlhZ3JhbXMgbWFkZSB3aXRoIGRpYSBpbiBkb3h5Z2VuIGRvY3VtZW50YXRpb24uIERveHlnZW4gd2lsbAorIyB0aGVuIHJ1biBkaWEgdG8gcHJvZHVjZSB0aGUgZGlhZ3JhbSBhbmQgaW5zZXJ0IGl0IGluIHRoZSBkb2N1bWVudGF0aW9uLiBUaGUKKyMgRElBX1BBVEggdGFnIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBkaWEgYmluYXJ5IHJlc2lkZXMuCisjIElmIGxlZnQgZW1wdHkgZGlhIGlzIGFzc3VtZWQgdG8gYmUgZm91bmQgaW4gdGhlIGRlZmF1bHQgc2VhcmNoIHBhdGguCisKK0RJQV9QQVRIICAgICAgICAgICAgICAgPSAKKworIyBJZiBzZXQgdG8gWUVTLCB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24gZ3JhcGhzIHdpbGwgaGlkZSBpbmhlcml0YW5jZQorIyBhbmQgdXNhZ2UgcmVsYXRpb25zIGlmIHRoZSB0YXJnZXQgaXMgdW5kb2N1bWVudGVkIG9yIGlzIG5vdCBhIGNsYXNzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitISURFX1VORE9DX1JFTEFUSU9OUyAgID0gWUVTCisKKyMgSWYgeW91IHNldCB0aGUgSEFWRV9ET1QgdGFnIHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBhc3N1bWUgdGhlIGRvdCB0b29sIGlzCisjIGF2YWlsYWJsZSBmcm9tIHRoZSBwYXRoLiBUaGlzIHRvb2wgaXMgcGFydCBvZiBHcmFwaHZpeiAoc2VlOgorIyBodHRwOi8vd3d3LmdyYXBodml6Lm9yZy8pLCBhIGdyYXBoIHZpc3VhbGl6YXRpb24gdG9vbGtpdCBmcm9tIEFUJlQgYW5kIEx1Y2VudAorIyBCZWxsIExhYnMuIFRoZSBvdGhlciBvcHRpb25zIGluIHRoaXMgc2VjdGlvbiBoYXZlIG5vIGVmZmVjdCBpZiB0aGlzIG9wdGlvbiBpcworIyBzZXQgdG8gTk8KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitIQVZFX0RPVCAgICAgICAgICAgICAgID0gTk8KKworIyBUaGUgRE9UX05VTV9USFJFQURTIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGRvdCBpbnZvY2F0aW9ucyBkb3h5Z2VuIGlzIGFsbG93ZWQKKyMgdG8gcnVuIGluIHBhcmFsbGVsLiBXaGVuIHNldCB0byAwIGRveHlnZW4gd2lsbCBiYXNlIHRoaXMgb24gdGhlIG51bWJlciBvZgorIyBwcm9jZXNzb3JzIGF2YWlsYWJsZSBpbiB0aGUgc3lzdGVtLiBZb3UgY2FuIHNldCBpdCBleHBsaWNpdGx5IHRvIGEgdmFsdWUKKyMgbGFyZ2VyIHRoYW4gMCB0byBnZXQgY29udHJvbCBvdmVyIHRoZSBiYWxhbmNlIGJldHdlZW4gQ1BVIGxvYWQgYW5kIHByb2Nlc3NpbmcKKyMgc3BlZWQuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDMyLCBkZWZhdWx0IHZhbHVlOiAwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX05VTV9USFJFQURTICAgICAgICA9IDAKKworIyBXaGVuIHlvdSB3YW50IGEgZGlmZmVyZW50bHkgbG9va2luZyBmb250IG4gdGhlIGRvdCBmaWxlcyB0aGF0IGRveHlnZW4KKyMgZ2VuZXJhdGVzIHlvdSBjYW4gc3BlY2lmeSB0aGUgZm9udCBuYW1lIHVzaW5nIERPVF9GT05UTkFNRS4gWW91IG5lZWQgdG8gbWFrZQorIyBzdXJlIGRvdCBpcyBhYmxlIHRvIGZpbmQgdGhlIGZvbnQsIHdoaWNoIGNhbiBiZSBkb25lIGJ5IHB1dHRpbmcgaXQgaW4gYQorIyBzdGFuZGFyZCBsb2NhdGlvbiBvciBieSBzZXR0aW5nIHRoZSBET1RGT05UUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBieQorIyBzZXR0aW5nIERPVF9GT05UUEFUSCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGZvbnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBIZWx2ZXRpY2EuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfRk9OVE5BTUUgICAgICAgICAgID0gSGVsdmV0aWNhCisKKyMgVGhlIERPVF9GT05UU0laRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBzaXplIChpbiBwb2ludHMpIG9mIHRoZSBmb250IG9mCisjIGRvdCBncmFwaHMuCisjIE1pbmltdW0gdmFsdWU6IDQsIG1heGltdW0gdmFsdWU6IDI0LCBkZWZhdWx0IHZhbHVlOiAxMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9GT05UU0laRSAgICAgICAgICAgPSAxMAorCisjIEJ5IGRlZmF1bHQgZG94eWdlbiB3aWxsIHRlbGwgZG90IHRvIHVzZSB0aGUgZGVmYXVsdCBmb250IGFzIHNwZWNpZmllZCB3aXRoCisjIERPVF9GT05UTkFNRS4gSWYgeW91IHNwZWNpZnkgYSBkaWZmZXJlbnQgZm9udCB1c2luZyBET1RfRk9OVE5BTUUgeW91IGNhbiBzZXQKKyMgdGhlIHBhdGggd2hlcmUgZG90IGNhbiBmaW5kIGl0IHVzaW5nIHRoaXMgdGFnLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0ZPTlRQQVRIICAgICAgICAgICA9IAorCisjIElmIHRoZSBDTEFTU19HUkFQSCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvcgorIyBlYWNoIGRvY3VtZW50ZWQgY2xhc3Mgc2hvd2luZyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmhlcml0YW5jZSByZWxhdGlvbnMuCisjIFNldHRpbmcgdGhpcyB0YWcgdG8gWUVTIHdpbGwgZm9yY2UgdGhlIENMQVNTX0RJQUdSQU1TIHRhZyB0byBOTy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0NMQVNTX0dSQVBIICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgQ09MTEFCT1JBVElPTl9HUkFQSCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIGdyYXBoIGZvciBlYWNoIGRvY3VtZW50ZWQgY2xhc3Mgc2hvd2luZyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbXBsZW1lbnRhdGlvbgorIyBkZXBlbmRlbmNpZXMgKGluaGVyaXRhbmNlLCBjb250YWlubWVudCwgYW5kIGNsYXNzIHJlZmVyZW5jZXMgdmFyaWFibGVzKSBvZiB0aGUKKyMgY2xhc3Mgd2l0aCBvdGhlciBkb2N1bWVudGVkIGNsYXNzZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitDT0xMQUJPUkFUSU9OX0dSQVBIICAgID0gWUVTCisKKyMgSWYgdGhlIEdST1VQX0dSQVBIUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvcgorIyBncm91cHMsIHNob3dpbmcgdGhlIGRpcmVjdCBncm91cHMgZGVwZW5kZW5jaWVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworR1JPVVBfR1JBUEhTICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBVTUxfTE9PSyB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgaW5oZXJpdGFuY2UgYW5kCisjIGNvbGxhYm9yYXRpb24gZGlhZ3JhbXMgaW4gYSBzdHlsZSBzaW1pbGFyIHRvIHRoZSBPTUcncyBVbmlmaWVkIE1vZGVsaW5nCisjIExhbmd1YWdlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitVTUxfTE9PSyAgICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgVU1MX0xPT0sgdGFnIGlzIGVuYWJsZWQsIHRoZSBmaWVsZHMgYW5kIG1ldGhvZHMgYXJlIHNob3duIGluc2lkZSB0aGUKKyMgY2xhc3Mgbm9kZS4gSWYgdGhlcmUgYXJlIG1hbnkgZmllbGRzIG9yIG1ldGhvZHMgYW5kIG1hbnkgbm9kZXMgdGhlIGdyYXBoIG1heQorIyBiZWNvbWUgdG9vIGJpZyB0byBiZSB1c2VmdWwuIFRoZSBVTUxfTElNSVRfTlVNX0ZJRUxEUyB0aHJlc2hvbGQgbGltaXRzIHRoZQorIyBudW1iZXIgb2YgaXRlbXMgZm9yIGVhY2ggdHlwZSB0byBtYWtlIHRoZSBzaXplIG1vcmUgbWFuYWdlYWJsZS4gU2V0IHRoaXMgdG8gMAorIyBmb3Igbm8gbGltaXQuIE5vdGUgdGhhdCB0aGUgdGhyZXNob2xkIG1heSBiZSBleGNlZWRlZCBieSA1MCUgYmVmb3JlIHRoZSBsaW1pdAorIyBpcyBlbmZvcmNlZC4gU28gd2hlbiB5b3Ugc2V0IHRoZSB0aHJlc2hvbGQgdG8gMTAsIHVwIHRvIDE1IGZpZWxkcyBtYXkgYXBwZWFyLAorIyBidXQgaWYgdGhlIG51bWJlciBleGNlZWRzIDE1LCB0aGUgdG90YWwgYW1vdW50IG9mIGZpZWxkcyBzaG93biBpcyBsaW1pdGVkIHRvCisjIDEwLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxMDAsIGRlZmF1bHQgdmFsdWU6IDEwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworVU1MX0xJTUlUX05VTV9GSUVMRFMgICA9IDEwCisKKyMgSWYgdGhlIFRFTVBMQVRFX1JFTEFUSU9OUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBpbmhlcml0YW5jZSBhbmQKKyMgY29sbGFib3JhdGlvbiBncmFwaHMgd2lsbCBzaG93IHRoZSByZWxhdGlvbnMgYmV0d2VlbiB0ZW1wbGF0ZXMgYW5kIHRoZWlyCisjIGluc3RhbmNlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworVEVNUExBVEVfUkVMQVRJT05TICAgICA9IE5PCisKKyMgSWYgdGhlIElOQ0xVREVfR1JBUEgsIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGFuZCBTRUFSQ0hfSU5DTFVERVMgdGFncyBhcmUgc2V0IHRvCisjIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoIGRvY3VtZW50ZWQgZmlsZSBzaG93aW5nIHRoZQorIyBkaXJlY3QgYW5kIGluZGlyZWN0IGluY2x1ZGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBmaWxlIHdpdGggb3RoZXIgZG9jdW1lbnRlZAorIyBmaWxlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0lOQ0xVREVfR1JBUEggICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgSU5DTFVERURfQllfR1JBUEgsIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGFuZCBTRUFSQ0hfSU5DTFVERVMgdGFncyBhcmUKKyMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoIGRvY3VtZW50ZWQgZmlsZSBzaG93aW5nCisjIHRoZSBkaXJlY3QgYW5kIGluZGlyZWN0IGluY2x1ZGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBmaWxlIHdpdGggb3RoZXIgZG9jdW1lbnRlZAorIyBmaWxlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0lOQ0xVREVEX0JZX0dSQVBIICAgICAgPSBZRVMKKworIyBJZiB0aGUgQ0FMTF9HUkFQSCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGNhbGwKKyMgZGVwZW5kZW5jeSBncmFwaCBmb3IgZXZlcnkgZ2xvYmFsIGZ1bmN0aW9uIG9yIGNsYXNzIG1ldGhvZC4KKyMKKyMgTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgdGltZSBvZiBhIHJ1bi4KKyMgU28gaW4gbW9zdCBjYXNlcyBpdCB3aWxsIGJlIGJldHRlciB0byBlbmFibGUgY2FsbCBncmFwaHMgZm9yIHNlbGVjdGVkCisjIGZ1bmN0aW9ucyBvbmx5IHVzaW5nIHRoZSBcY2FsbGdyYXBoIGNvbW1hbmQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0NBTExfR1JBUEggICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBDQUxMRVJfR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjYWxsZXIKKyMgZGVwZW5kZW5jeSBncmFwaCBmb3IgZXZlcnkgZ2xvYmFsIGZ1bmN0aW9uIG9yIGNsYXNzIG1ldGhvZC4KKyMKKyMgTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgdGltZSBvZiBhIHJ1bi4KKyMgU28gaW4gbW9zdCBjYXNlcyBpdCB3aWxsIGJlIGJldHRlciB0byBlbmFibGUgY2FsbGVyIGdyYXBocyBmb3Igc2VsZWN0ZWQKKyMgZnVuY3Rpb25zIG9ubHkgdXNpbmcgdGhlIFxjYWxsZXJncmFwaCBjb21tYW5kLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitDQUxMRVJfR1JBUEggICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgR1JBUEhJQ0FMX0hJRVJBUkNIWSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBncmFwaGljYWwKKyMgaGllcmFyY2h5IG9mIGFsbCBjbGFzc2VzIGluc3RlYWQgb2YgYSB0ZXh0dWFsIG9uZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0dSQVBISUNBTF9ISUVSQVJDSFkgICAgPSBZRVMKKworIyBJZiB0aGUgRElSRUNUT1JZX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNob3cgdGhlCisjIGRlcGVuZGVuY2llcyBhIGRpcmVjdG9yeSBoYXMgb24gb3RoZXIgZGlyZWN0b3JpZXMgaW4gYSBncmFwaGljYWwgd2F5LiBUaGUKKyMgZGVwZW5kZW5jeSByZWxhdGlvbnMgYXJlIGRldGVybWluZWQgYnkgdGhlICNpbmNsdWRlIHJlbGF0aW9ucyBiZXR3ZWVuIHRoZQorIyBmaWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitESVJFQ1RPUllfR1JBUEggICAgICAgID0gWUVTCisKKyMgVGhlIERPVF9JTUFHRV9GT1JNQVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgaW1hZ2UgZm9ybWF0IG9mIHRoZSBpbWFnZXMKKyMgZ2VuZXJhdGVkIGJ5IGRvdC4KKyMgTm90ZTogSWYgeW91IGNob29zZSBzdmcgeW91IG5lZWQgdG8gc2V0IEhUTUxfRklMRV9FWFRFTlNJT04gdG8geGh0bWwgaW4gb3JkZXIKKyMgdG8gbWFrZSB0aGUgU1ZHIGZpbGVzIHZpc2libGUgaW4gSUUgOSsgKG90aGVyIGJyb3dzZXJzIGRvIG5vdCBoYXZlIHRoaXMKKyMgcmVxdWlyZW1lbnQpLgorIyBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBwbmcsIGpwZywgZ2lmIGFuZCBzdmcuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBwbmcuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfSU1BR0VfRk9STUFUICAgICAgID0gcG5nCisKKyMgSWYgRE9UX0lNQUdFX0ZPUk1BVCBpcyBzZXQgdG8gc3ZnLCB0aGVuIHRoaXMgb3B0aW9uIGNhbiBiZSBzZXQgdG8gWUVTIHRvCisjIGVuYWJsZSBnZW5lcmF0aW9uIG9mIGludGVyYWN0aXZlIFNWRyBpbWFnZXMgdGhhdCBhbGxvdyB6b29taW5nIGFuZCBwYW5uaW5nLgorIworIyBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyBhIG1vZGVybiBicm93c2VyIG90aGVyIHRoYW4gSW50ZXJuZXQgRXhwbG9yZXIuIFRlc3RlZAorIyBhbmQgd29ya2luZyBhcmUgRmlyZWZveCwgQ2hyb21lLCBTYWZhcmksIGFuZCBPcGVyYS4KKyMgTm90ZTogRm9yIElFIDkrIHlvdSBuZWVkIHRvIHNldCBIVE1MX0ZJTEVfRVhURU5TSU9OIHRvIHhodG1sIGluIG9yZGVyIHRvIG1ha2UKKyMgdGhlIFNWRyBmaWxlcyB2aXNpYmxlLiBPbGRlciB2ZXJzaW9ucyBvZiBJRSBkbyBub3QgaGF2ZSBTVkcgc3VwcG9ydC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworSU5URVJBQ1RJVkVfU1ZHICAgICAgICA9IE5PCisKKyMgVGhlIERPVF9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBwYXRoIHdoZXJlIHRoZSBkb3QgdG9vbCBjYW4gYmUKKyMgZm91bmQuIElmIGxlZnQgYmxhbmssIGl0IGlzIGFzc3VtZWQgdGhlIGRvdCB0b29sIGNhbiBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9QQVRIICAgICAgICAgICAgICAgPSAKKworIyBUaGUgRE9URklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBkb3QgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUgXGRvdGZpbGUKKyMgY29tbWFuZCkuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RGSUxFX0RJUlMgICAgICAgICAgID0gCisKKyMgVGhlIE1TQ0ZJTEVfRElSUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0CisjIGNvbnRhaW4gbXNjIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgdGhlIFxtc2NmaWxlCisjIGNvbW1hbmQpLgorCitNU0NGSUxFX0RJUlMgICAgICAgICAgID0gCisKKyMgVGhlIERJQUZJTEVfRElSUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0CisjIGNvbnRhaW4gZGlhIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgdGhlIFxkaWFmaWxlCisjIGNvbW1hbmQpLgorCitESUFGSUxFX0RJUlMgICAgICAgICAgID0gCisKKyMgVGhlIERPVF9HUkFQSF9NQVhfTk9ERVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygbm9kZXMKKyMgdGhhdCB3aWxsIGJlIHNob3duIGluIHRoZSBncmFwaC4gSWYgdGhlIG51bWJlciBvZiBub2RlcyBpbiBhIGdyYXBoIGJlY29tZXMKKyMgbGFyZ2VyIHRoYW4gdGhpcyB2YWx1ZSwgZG94eWdlbiB3aWxsIHRydW5jYXRlIHRoZSBncmFwaCwgd2hpY2ggaXMgdmlzdWFsaXplZAorIyBieSByZXByZXNlbnRpbmcgYSBub2RlIGFzIGEgcmVkIGJveC4gTm90ZSB0aGF0IGRveHlnZW4gaWYgdGhlIG51bWJlciBvZiBkaXJlY3QKKyMgY2hpbGRyZW4gb2YgdGhlIHJvb3Qgbm9kZSBpbiBhIGdyYXBoIGlzIGFscmVhZHkgbGFyZ2VyIHRoYW4KKyMgRE9UX0dSQVBIX01BWF9OT0RFUyB0aGVuIHRoZSBncmFwaCB3aWxsIG5vdCBiZSBzaG93biBhdCBhbGwuIEFsc28gbm90ZSB0aGF0CisjIHRoZSBzaXplIG9mIGEgZ3JhcGggY2FuIGJlIGZ1cnRoZXIgcmVzdHJpY3RlZCBieSBNQVhfRE9UX0dSQVBIX0RFUFRILgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxMDAwMCwgZGVmYXVsdCB2YWx1ZTogNTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfR1JBUEhfTUFYX05PREVTICAgID0gNTAKKworIyBUaGUgTUFYX0RPVF9HUkFQSF9ERVBUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBtYXhpbXVtIGRlcHRoIG9mIHRoZSBncmFwaHMKKyMgZ2VuZXJhdGVkIGJ5IGRvdC4gQSBkZXB0aCB2YWx1ZSBvZiAzIG1lYW5zIHRoYXQgb25seSBub2RlcyByZWFjaGFibGUgZnJvbSB0aGUKKyMgcm9vdCBieSBmb2xsb3dpbmcgYSBwYXRoIHZpYSBhdCBtb3N0IDMgZWRnZXMgd2lsbCBiZSBzaG93bi4gTm9kZXMgdGhhdCBsYXkKKyMgZnVydGhlciBmcm9tIHRoZSByb290IG5vZGUgd2lsbCBiZSBvbWl0dGVkLiBOb3RlIHRoYXQgc2V0dGluZyB0aGlzIG9wdGlvbiB0byAxCisjIG9yIDIgbWF5IGdyZWF0bHkgcmVkdWNlIHRoZSBjb21wdXRhdGlvbiB0aW1lIG5lZWRlZCBmb3IgbGFyZ2UgY29kZSBiYXNlcy4gQWxzbworIyBub3RlIHRoYXQgdGhlIHNpemUgb2YgYSBncmFwaCBjYW4gYmUgZnVydGhlciByZXN0cmljdGVkIGJ5CisjIERPVF9HUkFQSF9NQVhfTk9ERVMuIFVzaW5nIGEgZGVwdGggb2YgMCBtZWFucyBubyBkZXB0aCByZXN0cmljdGlvbi4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTAwMCwgZGVmYXVsdCB2YWx1ZTogMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK01BWF9ET1RfR1JBUEhfREVQVEggICAgPSAwCisKKyMgU2V0IHRoZSBET1RfVFJBTlNQQVJFTlQgdGFnIHRvIFlFUyB0byBnZW5lcmF0ZSBpbWFnZXMgd2l0aCBhIHRyYW5zcGFyZW50CisjIGJhY2tncm91bmQuIFRoaXMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCwgYmVjYXVzZSBkb3Qgb24gV2luZG93cyBkb2VzIG5vdCBzZWVtCisjIHRvIHN1cHBvcnQgdGhpcyBvdXQgb2YgdGhlIGJveC4KKyMKKyMgV2FybmluZzogRGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSB1c2VkLCBlbmFibGluZyB0aGlzIG9wdGlvbiBtYXkgbGVhZCB0bworIyBiYWRseSBhbnRpLWFsaWFzZWQgbGFiZWxzIG9uIHRoZSBlZGdlcyBvZiBhIGdyYXBoIChpLmUuIHRoZXkgYmVjb21lIGhhcmQgdG8KKyMgcmVhZCkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9UUkFOU1BBUkVOVCAgICAgICAgPSBOTworCisjIFNldCB0aGUgRE9UX01VTFRJX1RBUkdFVFMgdGFnIHRvIFlFUyBhbGxvdyBkb3QgdG8gZ2VuZXJhdGUgbXVsdGlwbGUgb3V0cHV0CisjIGZpbGVzIGluIG9uZSBydW4gKGkuZS4gbXVsdGlwbGUgLW8gYW5kIC1UIG9wdGlvbnMgb24gdGhlIGNvbW1hbmQgbGluZSkuIFRoaXMKKyMgbWFrZXMgZG90IHJ1biBmYXN0ZXIsIGJ1dCBzaW5jZSBvbmx5IG5ld2VyIHZlcnNpb25zIG9mIGRvdCAoPjEuOC4xMCkgc3VwcG9ydAorIyB0aGlzLCB0aGlzIGZlYXR1cmUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX01VTFRJX1RBUkdFVFMgICAgICA9IE5PCisKKyMgSWYgdGhlIEdFTkVSQVRFX0xFR0VORCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBsZWdlbmQgcGFnZQorIyBleHBsYWluaW5nIHRoZSBtZWFuaW5nIG9mIHRoZSB2YXJpb3VzIGJveGVzIGFuZCBhcnJvd3MgaW4gdGhlIGRvdCBnZW5lcmF0ZWQKKyMgZ3JhcGhzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfTEVHRU5EICAgICAgICA9IFlFUworCisjIElmIHRoZSBET1RfQ0xFQU5VUCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgcmVtb3ZlIHRoZSBpbnRlcm1lZGlhdGUgZG90CisjIGZpbGVzIHRoYXQgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHZhcmlvdXMgZ3JhcGhzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0NMRUFOVVAgICAgICAgICAgICA9IFlFUwpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9kb2MvZG94eWdlbi9oZWFkZXIudGV4IGIvZmluYWwvb2ZmbG9hZC9kb2MvZG94eWdlbi9oZWFkZXIudGV4Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVlOTYzYzIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL2RvYy9kb3h5Z2VuL2hlYWRlci50ZXgKQEAgLTAsMCArMSw5MCBAQAorJSBMYXRleCBoZWFkZXIgZm9yIGRveHlnZW4gMS44LjMuMQ0KK1xkb2N1bWVudGNsYXNze2Jvb2t9DQorXHVzZXBhY2thZ2VbYTRwYXBlcix0b3A9Mi41Y20sYm90dG9tPTIuNWNtLGxlZnQ9Mi41Y20scmlnaHQ9Mi41Y21de2dlb21ldHJ5fQ0KK1x1c2VwYWNrYWdle21ha2VpZHh9DQorXHVzZXBhY2thZ2V7bmF0YmlifQ0KK1x1c2VwYWNrYWdle2dyYXBoaWN4fQ0KK1x1c2VwYWNrYWdle211bHRpY29sfQ0KK1x1c2VwYWNrYWdle2Zsb2F0fQ0KK1x1c2VwYWNrYWdle2xpc3RpbmdzfQ0KK1x1c2VwYWNrYWdle2NvbG9yfQ0KK1x1c2VwYWNrYWdle2lmdGhlbn0NCitcdXNlcGFja2FnZVt0YWJsZV17eGNvbG9yfQ0KK1x1c2VwYWNrYWdle3RleHRjb21wfQ0KK1x1c2VwYWNrYWdle2FsbHR0fQ0KK1x1c2VwYWNrYWdle2lmcGRmfQ0KK1xpZnBkZg0KK1x1c2VwYWNrYWdlW3BkZnRleCwNCisgICAgICAgICAgICBwYWdlYmFja3JlZj10cnVlLA0KKyAgICAgICAgICAgIGNvbG9ybGlua3M9dHJ1ZSwNCisgICAgICAgICAgICBsaW5rY29sb3I9Ymx1ZSwNCisgICAgICAgICAgICB1bmljb2RlDQorICAgICAgICAgICBde2h5cGVycmVmfQ0KK1xlbHNlDQorXHVzZXBhY2thZ2VbcHMycGRmLA0KKyAgICAgICAgICAgIHBhZ2ViYWNrcmVmPXRydWUsDQorICAgICAgICAgICAgY29sb3JsaW5rcz10cnVlLA0KKyAgICAgICAgICAgIGxpbmtjb2xvcj1ibHVlLA0KKyAgICAgICAgICAgIHVuaWNvZGUNCisgICAgICAgICAgIF17aHlwZXJyZWZ9DQorXHVzZXBhY2thZ2V7cHNwaWN0dXJlfQ0KK1xmaQ0KK1x1c2VwYWNrYWdlW3V0Zjhde2lucHV0ZW5jfQ0KK1x1c2VwYWNrYWdle21hdGhwdG14fQ0KK1x1c2VwYWNrYWdlW3NjYWxlZD0uOTBde2hlbHZldH0NCitcdXNlcGFja2FnZXtjb3VyaWVyfQ0KK1x1c2VwYWNrYWdle3NlY3RzdHl9DQorXHVzZXBhY2thZ2V7YW1zc3ltYn0NCitcdXNlcGFja2FnZVt0aXRsZXNde3RvY2xvZnR9DQorXHVzZXBhY2thZ2V7ZG94eWdlbn0NCitcdXNlcGFja2FnZXtmYW5jeWhkcn0NCitccGFnZXN0eWxle2ZhbmN5fQ0KK1xsc3RzZXR7bGFuZ3VhZ2U9QysrLGlucHV0ZW5jb2Rpbmc9dXRmOCxiYXNpY3N0eWxlPVxmb290bm90ZXNpemUsYnJlYWtsaW5lcz10cnVlLGJyZWFrYXR3aGl0ZXNwYWNlPXRydWUsdGFic2l6ZT00LG51bWJlcnM9bGVmdCB9DQorXG1ha2VpbmRleA0KK1xzZXRjb3VudGVye3RvY2RlcHRofXszfQ0KK1xyZW5ld2NvbW1hbmR7XGZvb3RydWxld2lkdGh9ezAuNHB0fQ0KK1xyZW5ld2NvbW1hbmR7XGZhbWlseWRlZmF1bHR9e1xzZmRlZmF1bHR9DQorXGhmdXp6PTE1cHQNCitcc2V0bGVuZ3Roe1xlbWVyZ2VuY3lzdHJldGNofXsxNXB0fQ0KK1xoYmFkbmVzcz03NTANCitcdG9sZXJhbmNlPTc1MA0KK1xiZWdpbntkb2N1bWVudH0NCitcaHlwZXJzZXR1cHtwYWdlYW5jaG9yPWZhbHNlLGNpdGVjb2xvcj1ibHVlfQ0KK1xiZWdpbnt0aXRsZXBhZ2V9DQorXHZzcGFjZSp7N2NtfQ0KK1xiZWdpbntjZW50ZXJ9DQore1xMYXJnZSBJbnRlbFx0ZXh0c3VwZXJzY3JpcHR7XHRleHRyZWdpc3RlcmVkfSBPZmZsb2FkIFJ1bnRpbWUgTGlicmFyeSB9XFwNCitcdnNwYWNlKnsxY219DQore1xsYXJnZSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAkZG94eWdlbnZlcnNpb24gfVxcDQorXHZzcGFjZSp7MC41Y219DQore1xzbWFsbCAkZGF0ZXRpbWUgfVxcDQorXGVuZHtjZW50ZXJ9DQorXGVuZHt0aXRsZXBhZ2V9DQorDQore1xiZiBGVEMgT3B0aW1pemF0aW9uIE5vdGljZX0NCisNCitJbnRlbCdzIGNvbXBpbGVycyBtYXkgb3IgbWF5IG5vdCBvcHRpbWl6ZSB0byB0aGUgc2FtZSBkZWdyZWUgZm9yIG5vbi1JbnRlbCBtaWNyb3Byb2Nlc3NvcnMgZm9yDQorb3B0aW1pemF0aW9ucyB0aGF0IGFyZSBub3QgdW5pcXVlIHRvIEludGVsIG1pY3JvcHJvY2Vzc29ycy4gVGhlc2Ugb3B0aW1pemF0aW9ucyBpbmNsdWRlIFNTRTIsDQorU1NFMywgYW5kIFNTU0UzIGluc3RydWN0aW9uIHNldHMgYW5kIG90aGVyIG9wdGltaXphdGlvbnMuIEludGVsIGRvZXMgbm90IGd1YXJhbnRlZSB0aGUNCithdmFpbGFiaWxpdHksIGZ1bmN0aW9uYWxpdHksIG9yIGVmZmVjdGl2ZW5lc3Mgb2YgYW55IG9wdGltaXphdGlvbiBvbiBtaWNyb3Byb2Nlc3NvcnMgbm90DQorbWFudWZhY3R1cmVkIGJ5IEludGVsLg0KKw0KK01pY3JvcHJvY2Vzc29yLWRlcGVuZGVudCBvcHRpbWl6YXRpb25zIGluIHRoaXMgcHJvZHVjdCBhcmUgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIEludGVsDQorbWljcm9wcm9jZXNzb3JzLiBDZXJ0YWluIG9wdGltaXphdGlvbnMgbm90IHNwZWNpZmljIHRvIEludGVsIG1pY3JvYXJjaGl0ZWN0dXJlIGFyZSByZXNlcnZlZCBmb3INCitJbnRlbCBtaWNyb3Byb2Nlc3NvcnMuIFBsZWFzZSByZWZlciB0byB0aGUgYXBwbGljYWJsZSBwcm9kdWN0IFVzZXIgYW5kIFJlZmVyZW5jZSBHdWlkZXMgZm9yDQorbW9yZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIHNwZWNpZmljIGluc3RydWN0aW9uIHNldHMgY292ZXJlZCBieSB0aGlzIG5vdGljZS4NCisNCitOb3RpY2UgcmV2aXNpb24gXCMyMDExMDgwNA0KKw0KK1x2c3BhY2UqezAuNWNtfQ0KKw0KK3tcYmYgVHJhZGVtYXJrc30NCisNCitJbnRlbCwgWGVvbiwgYW5kIEludGVsIFhlb24gUGhpIGFyZSB0cmFkZW1hcmtzIG9mIEludGVsIENvcnBvcmF0aW9uIGluIHRoZSBVLlMuIGFuZC9vciBvdGhlciBjb3VudHJpZXMuDQorDQorVGhpcyBkb2N1bWVudCBpcyBDb3B5cmlnaHQgXHRleHRjb3B5cmlnaHQgMjAxNCwgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuIA0KKw0KK1xwYWdlbnVtYmVyaW5ne3JvbWFufQ0KK1x0YWJsZW9mY29udGVudHMNCitccGFnZW51bWJlcmluZ3thcmFiaWN9DQorXGh5cGVyc2V0dXB7cGFnZWFuY2hvcj10cnVlLGNpdGVjb2xvcj1ibHVlfQ0KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL2NlYW5fdXRpbC5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9jZWFuX3V0aWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMTg5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9jZWFuX3V0aWwuY3BwCkBAIC0wLDAgKzEsMzQ0IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJjZWFuX3V0aWwuaCIKKyNpbmNsdWRlICJvZmZsb2FkX2NvbW1vbi5oIgorCisvLyAxLiBhbGxvY2F0ZSBlbGVtZW50IG9mIENlYW5SZWFkUmFuZ2VzIHR5cGUKKy8vIDIuIGluaXRpYWxpemVkIGl0IGZvciByZWFkaW5nIGNvbnNlcXVlbnRseSBjb250aWd1b3VzIHJhbmdlcworLy8gICAgZGVzY3JpYmVkIGJ5ICJhcCIgYXJndW1lbnQKK0NlYW5SZWFkUmFuZ2VzICogaW5pdF9yZWFkX3Jhbmdlc19hcnJfZGVzYyhjb25zdCBhcnJfZGVzYyAqYXApCit7CisgICAgQ2VhblJlYWRSYW5nZXMgKiByZXM7CisKKyAgICAvLyBmaW5kIHRoZSBtYXggY29udGlndW91cyByYW5nZQorICAgIGludDY0X3QgcmFuayA9IGFwLT5yYW5rIC0gMTsKKyAgICBpbnQ2NF90IGxlbmd0aCA9IGFwLT5kaW1bcmFua10uc2l6ZTsKKyAgICBmb3IgKDsgcmFuayA+PSAwOyByYW5rLS0pIHsKKyAgICAgICAgaWYgKGFwLT5kaW1bcmFua10uc3RyaWRlID09IDEpIHsKKyAgICAgICAgICAgIGxlbmd0aCAqPSAoYXAtPmRpbVtyYW5rXS51cHBlciAtIGFwLT5kaW1bcmFua10ubG93ZXIgKyAxKTsKKyAgICAgICAgICAgIGlmIChyYW5rID4gMCAmJiBsZW5ndGggIT0gYXAtPmRpbVtyYW5rIC0gMV0uc2l6ZSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXMgPShDZWFuUmVhZFJhbmdlcyAqKW1hbGxvYyhzaXplb2YoQ2VhblJlYWRSYW5nZXMpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXAtPnJhbmsgLSByYW5rKSAqIHNpemVvZihDZWFuUmVhZERpbSkpOworICAgIHJlcy0+Y3VycmVudF9udW1iZXIgPSAwOworICAgIHJlcy0+cmFuZ2Vfc2l6ZSA9IGxlbmd0aDsKKyAgICByZXMtPmxhc3Rfbm9uY29udF9pbmQgPSByYW5rOworCisgICAgLy8gY2FsY3VsYXRlIG51bWJlciBvZiBjb250aWd1b3VzIHJhbmdlcyBpbnNpZGUgbm9uY29udGlndW91cyBkaW1lbnNpb25zCisgICAgaW50IGNvdW50ID0gMTsKKyAgICBib29sIHByZXZfaXNfY29udCA9IHRydWU7CisgICAgaW50NjRfdCBvZmZzZXQgPSAwOworCisgICAgZm9yICg7IHJhbmsgPj0gMDsgcmFuay0tKSB7CisgICAgICAgIHJlcy0+RGltW3JhbmtdLmNvdW50ID0gY291bnQ7CisgICAgICAgIHJlcy0+RGltW3JhbmtdLnNpemUgPSBhcC0+ZGltW3JhbmtdLnN0cmlkZSAqIGFwLT5kaW1bcmFua10uc2l6ZTsKKyAgICAgICAgY291bnQgKj0gKHByZXZfaXNfY29udCAmJiBhcC0+ZGltW3JhbmtdLnN0cmlkZSA9PSAxPyAxIDoKKyAgICAgICAgICAgIChhcC0+ZGltW3JhbmtdLnVwcGVyIC0gYXAtPmRpbVtyYW5rXS5sb3dlciArCisgICAgICAgICAgICBhcC0+ZGltW3JhbmtdLnN0cmlkZSkgLyBhcC0+ZGltW3JhbmtdLnN0cmlkZSk7CisgICAgICAgIHByZXZfaXNfY29udCA9IGZhbHNlOworICAgICAgICBvZmZzZXQgKz0oYXAtPmRpbVtyYW5rXS5sb3dlciAtIGFwLT5kaW1bcmFua10ubGluZGV4KSAqCisgICAgICAgICAgICAgICAgIGFwLT5kaW1bcmFua10uc2l6ZTsKKyAgICB9CisgICAgcmVzLT5yYW5nZV9tYXhfbnVtYmVyID0gY291bnQ7CisgICAgcmVzIC0+IHB0ciA9ICh2b2lkKilhcC0+YmFzZTsKKyAgICByZXMgLT4gaW5pdF9vZmZzZXQgPSBvZmZzZXQ7CisgICAgcmV0dXJuIHJlczsKK30KKworLy8gY2hlY2sgaWYgcmFuZ2VzIGRlc2NyaWJlZCBieSAxIGFyZ3VtZW50IGNvdWxkIGJlIHRyYW5zZmVycmVkIGludG8gcmFuZ2VzCisvLyBkZXNjcmliZWQgYnkgMi1uZCBvbmUKK2Jvb2wgY2Vhbl9yYW5nZXNfbWF0Y2goCisgICAgQ2VhblJlYWRSYW5nZXMgKiByZWFkX3JuZzEsCisgICAgQ2VhblJlYWRSYW5nZXMgKiByZWFkX3JuZzIKKykKK3sKKyAgICByZXR1cm4gKCByZWFkX3JuZzEgPT0gTlVMTCB8fCByZWFkX3JuZzIgPT0gTlVMTCB8fAorICAgICAgICAgICAgKHJlYWRfcm5nMS0+cmFuZ2Vfc2l6ZSAlIHJlYWRfcm5nMi0+cmFuZ2Vfc2l6ZSA9PSAwIHx8CisgICAgICAgICAgICByZWFkX3JuZzItPnJhbmdlX3NpemUgJSByZWFkX3JuZzEtPnJhbmdlX3NpemUgPT0gMCkpOworfQorCisvLyBTZXQgbmV4dCBvZmZzZXQgYW5kIGxlbmd0aCBhbmQgcmV0dXJucyB0cnVlIGZvciBuZXh0IHJhbmdlLgorLy8gUmV0dXJucyBmYWxzZSBpZiB0aGUgcmFuZ2VzIGFyZSBvdmVyLgorYm9vbCBnZXRfbmV4dF9yYW5nZSgKKyAgICBDZWFuUmVhZFJhbmdlcyAqIHJlYWRfcm5nLAorICAgIGludDY0X3QgKm9mZnNldAorKQoreworICAgIGlmICgrK3JlYWRfcm5nLT5jdXJyZW50X251bWJlciA+IHJlYWRfcm5nLT5yYW5nZV9tYXhfbnVtYmVyKSB7CisgICAgICAgIHJlYWRfcm5nLT5jdXJyZW50X251bWJlciA9IDA7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaW50IHJhbmsgPSAwOworICAgIGludCBudW0gPSByZWFkX3JuZy0+Y3VycmVudF9udW1iZXIgLSAxOworICAgIGludDY0X3QgY3VyX29mZnNldCA9IDA7CisgICAgaW50IG51bV9sb2M7CisgICAgZm9yICg7IHJhbmsgPD0gcmVhZF9ybmctPmxhc3Rfbm9uY29udF9pbmQ7IHJhbmsrKykgeworICAgICAgICBudW1fbG9jID0gbnVtIC8gcmVhZF9ybmctPkRpbVtyYW5rXS5jb3VudDsKKyAgICAgICAgY3VyX29mZnNldCArPSBudW1fbG9jICogcmVhZF9ybmctPkRpbVtyYW5rXS5zaXplOworICAgICAgICBudW0gPSBudW0gJSByZWFkX3JuZy0+RGltW3JhbmtdLmNvdW50OworICAgIH0KKyAgICAqb2Zmc2V0ID0gY3VyX29mZnNldCArIHJlYWRfcm5nLT5pbml0X29mZnNldDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBpc19hcnJfZGVzY19jb250aWd1b3VzKGNvbnN0IGFycl9kZXNjICphcCkKK3sKKyAgICBpbnQ2NF90IHJhbmsgPSBhcC0+cmFuayAtIDE7CisgICAgaW50NjRfdCBsZW5ndGggPSBhcC0+ZGltW3JhbmtdLnNpemU7CisgICAgZm9yICg7IHJhbmsgPj0gMDsgcmFuay0tKSB7CisgICAgICAgIGlmIChhcC0+ZGltW3JhbmtdLnN0cmlkZSA+IDEgJiYKKyAgICAgICAgICAgIGFwLT5kaW1bcmFua10udXBwZXIgLSBhcC0+ZGltW3JhbmtdLmxvd2VyICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobGVuZ3RoICE9IGFwLT5kaW1bcmFua10uc2l6ZSkgeworICAgICAgICAgICAgZm9yICg7IHJhbmsgPj0gMDsgcmFuay0tKSB7CisgICAgICAgICAgICAgICAgaWYgKGFwLT5kaW1bcmFua10udXBwZXIgLSBhcC0+ZGltW3JhbmtdLmxvd2VyICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGxlbmd0aCAqPSAoYXAtPmRpbVtyYW5rXS51cHBlciAtIGFwLT5kaW1bcmFua10ubG93ZXIgKyAxKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2ludDY0X3QgY2Vhbl9nZXRfdHJhbnNmX3NpemUoQ2VhblJlYWRSYW5nZXMgKiByZWFkX3JuZykKK3sKKyAgICByZXR1cm4ocmVhZF9ybmctPnJhbmdlX21heF9udW1iZXIgKiByZWFkX3JuZy0+cmFuZ2Vfc2l6ZSk7Cit9CisKK3N0YXRpYyB1aW50NjRfdCBsYXN0X2xlZnQsIGxhc3RfcmlnaHQ7Cit0eXBlZGVmIHZvaWQgKCpmcHApKGNvbnN0IGNoYXIgKnNwYWNlcywgdWludDY0X3QgbG93LCB1aW50NjRfdCBoaWdoLCBpbnQgZXNpemUpOworCitzdGF0aWMgdm9pZCBnZW5lcmF0ZV9vbmVfcmFuZ2UoCisgICAgY29uc3QgY2hhciAqc3BhY2VzLAorICAgIHVpbnQ2NF90IGxyYW5nZSwKKyAgICB1aW50NjRfdCBycmFuZ2UsCisgICAgZnBwIGZwLAorICAgIGludCBlc2l6ZQorKQoreworICAgIE9GRkxPQURfVFJBQ0UoMywKKyAgICAgICAgIiVzICAgIGdlbmVyYXRlX29uZV9yYW5nZShscmFuZ2U9JXAsIHJyYW5nZT0lcCwgZXNpemU9JWQpXG4iLAorICAgICAgICBzcGFjZXMsICh2b2lkKilscmFuZ2UsICh2b2lkKilycmFuZ2UsIGVzaXplKTsKKyAgICBpZiAobGFzdF9sZWZ0ID09IC0xKSB7CisgICAgICAgIC8vIEZpcnN0IHJhbmdlCisgICAgICAgIGxhc3RfbGVmdCA9IGxyYW5nZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChscmFuZ2UgPT0gbGFzdF9yaWdodCsxKSB7CisgICAgICAgICAgICAvLyBFeHRlbmQgcHJldmlvdXMgcmFuZ2UsIGRvbid0IHByaW50CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAoKmZwKShzcGFjZXMsIGxhc3RfbGVmdCwgbGFzdF9yaWdodCwgZXNpemUpOworICAgICAgICAgICAgbGFzdF9sZWZ0ID0gbHJhbmdlOworICAgICAgICB9CisgICAgfQorICAgIGxhc3RfcmlnaHQgPSBycmFuZ2U7Cit9CisKK3N0YXRpYyB2b2lkIGdlbmVyYXRlX21lbV9yYW5nZXNfb25lX3JhbmsoCisgICAgY29uc3QgY2hhciAqc3BhY2VzLAorICAgIHVpbnQ2NF90IGJhc2UsCisgICAgdWludDY0X3QgcmFuaywKKyAgICBjb25zdCBzdHJ1Y3QgZGltX2Rlc2MgKmRkcCwKKyAgICBmcHAgZnAsCisgICAgaW50IGVzaXplCispCit7CisgICAgdWludDY0X3QgbGluZGV4ID0gZGRwLT5saW5kZXg7CisgICAgdWludDY0X3QgbG93ZXIgPSBkZHAtPmxvd2VyOworICAgIHVpbnQ2NF90IHVwcGVyID0gZGRwLT51cHBlcjsKKyAgICB1aW50NjRfdCBzdHJpZGUgPSBkZHAtPnN0cmlkZTsKKyAgICB1aW50NjRfdCBzaXplID0gZGRwLT5zaXplOworICAgIE9GRkxPQURfVFJBQ0UoMywKKyAgICAgICAgIiVzICAgICIKKyAgICAgICAgImdlbmVyYXRlX21lbV9yYW5nZXNfb25lX3JhbmsoYmFzZT0lcCwgcmFuaz0lbGxkLCBsaW5kZXg9JWxsZCwgIgorICAgICAgICAibG93ZXI9JWxsZCwgdXBwZXI9JWxsZCwgc3RyaWRlPSVsbGQsIHNpemU9JWxsZCwgZXNpemU9JWQpXG4iLAorICAgICAgICBzcGFjZXMsICh2b2lkKiliYXNlLCByYW5rLCBsaW5kZXgsIGxvd2VyLCB1cHBlciwgc3RyaWRlLCBzaXplLCBlc2l6ZSk7CisgICAgaWYgKHJhbmsgPT0gMSkgeworICAgICAgICB1aW50NjRfdCBscmFuZ2UsIHJyYW5nZTsKKyAgICAgICAgaWYgKHN0cmlkZSA9PSAxKSB7CisgICAgICAgICAgICBscmFuZ2UgPSBiYXNlICsgKGxvd2VyLWxpbmRleCkqc2l6ZTsKKyAgICAgICAgICAgIHJyYW5nZSA9IGxyYW5nZSArICh1cHBlci1sb3dlcisxKSpzaXplIC0gMTsKKyAgICAgICAgICAgIGdlbmVyYXRlX29uZV9yYW5nZShzcGFjZXMsIGxyYW5nZSwgcnJhbmdlLCBmcCwgZXNpemUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZm9yIChpbnQgaT1sb3dlci1saW5kZXg7IGk8PXVwcGVyLWxpbmRleDsgaSs9c3RyaWRlKSB7CisgICAgICAgICAgICAgICAgbHJhbmdlID0gYmFzZSArIGkqc2l6ZTsKKyAgICAgICAgICAgICAgICBycmFuZ2UgPSBscmFuZ2UgKyBzaXplIC0gMTsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZV9vbmVfcmFuZ2Uoc3BhY2VzLCBscmFuZ2UsIHJyYW5nZSwgZnAsIGVzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZm9yIChpbnQgaT1sb3dlci1saW5kZXg7IGk8PXVwcGVyLWxpbmRleDsgaSs9c3RyaWRlKSB7CisgICAgICAgICAgICBnZW5lcmF0ZV9tZW1fcmFuZ2VzX29uZV9yYW5rKAorICAgICAgICAgICAgICAgIHNwYWNlcywgYmFzZStpKnNpemUsIHJhbmstMSwgZGRwKzEsIGZwLCBlc2l6ZSk7CisKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgZ2VuZXJhdGVfbWVtX3JhbmdlcygKKyAgICBjb25zdCBjaGFyICpzcGFjZXMsCisgICAgY29uc3QgYXJyX2Rlc2MgKmFkcCwKKyAgICBib29sIGRlcmVmLAorICAgIGZwcCBmcAorKQoreworICAgIHVpbnQ2NF90IGVzaXplOworCisgICAgT0ZGTE9BRF9UUkFDRSgzLAorICAgICAgICAiJXMgICAgIgorICAgICAgICAiZ2VuZXJhdGVfbWVtX3JhbmdlcyhhZHA9JXAsIGRlcmVmPSVkLCBmcClcbiIsCisgICAgICAgIHNwYWNlcywgYWRwLCBkZXJlZik7CisgICAgbGFzdF9sZWZ0ID0gLTE7CisgICAgbGFzdF9yaWdodCA9IC0yOworCisgICAgLy8gRWxlbWVudCBzaXplIGlzIGRlcml2ZWQgZnJvbSBsYXN0IGRpbWVuc2lvbgorICAgIGVzaXplID0gYWRwLT5kaW1bYWRwLT5yYW5rLTFdLnNpemU7CisKKyAgICBnZW5lcmF0ZV9tZW1fcmFuZ2VzX29uZV9yYW5rKAorICAgICAgICAvLyBGb3IgY19jZWFuX3ZhciB0aGUgYmFzZSBhZGRyIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhCisgICAgICAgIC8vIEZvciBjX2NlYW5fdmFyX3B0ciB0aGUgYmFzZSBhZGRyIGlzIGRlcmVmZXJlbmNlZCB0byBnZXQgdG8gdGhlIGRhdGEKKyAgICAgICAgc3BhY2VzLCBkZXJlZiA/ICooKHVpbnQ2NF90KikoYWRwLT5iYXNlKSkgOiBhZHAtPmJhc2UsCisgICAgICAgIGFkcC0+cmFuaywgJmFkcC0+ZGltWzBdLCBmcCwgZXNpemUpOworICAgICgqZnApKHNwYWNlcywgbGFzdF9sZWZ0LCBsYXN0X3JpZ2h0LCBlc2l6ZSk7Cit9CisKKy8vIHJldHVybnMgb2Zmc2V0IGFuZCBsZW5ndGggb2YgdGhlIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQKK3ZvaWQgX19hcnJfZGF0YV9vZmZzZXRfYW5kX2xlbmd0aCgKKyAgICBjb25zdCBhcnJfZGVzYyAqYWRwLAorICAgIGludDY0X3QgJm9mZnNldCwKKyAgICBpbnQ2NF90ICZsZW5ndGgKKykKK3sKKyAgICBpbnQ2NF90IHJhbmsgPSBhZHAtPnJhbmsgLSAxOworICAgIGludDY0X3Qgc2l6ZSA9IGFkcC0+ZGltW3JhbmtdLnNpemU7CisgICAgaW50NjRfdCByX29mZiA9IDA7IC8vIG9mZnNldCBmcm9tIHJpZ2h0IGJvdW5kYXJ5CisKKyAgICAvLyBmaW5kIHRoZSByaWdodG1vc3QgZGltZW5zaW9uIHdoaWNoIHRha2VzIGp1c3QgcGFydCBvZiBpdHMKKyAgICAvLyByYW5nZS4gV2UgZGVmaW5lIGl0IGlmIHRoZSBzaXplIG9mIGxlZnQgcmFuayBpcyBub3QgZXF1YWwKKyAgICAvLyB0aGUgcmFuZ2UncyBsZW5ndGggYmV0d2VlbiB1cHBlciBhbmQgbG93ZXIgYm91bmdhcmllcworICAgIHdoaWxlIChyYW5rID4gMCkgeworICAgICAgICBzaXplICo9IChhZHAtPmRpbVtyYW5rXS51cHBlciAtIGFkcC0+ZGltW3JhbmtdLmxvd2VyICsgMSk7CisgICAgICAgIGlmIChzaXplICE9IGFkcC0+ZGltW3JhbmsgLSAxXS5zaXplKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByYW5rLS07CisgICAgfQorCisgICAgb2Zmc2V0ID0gKGFkcC0+ZGltW3JhbmtdLmxvd2VyIC0gYWRwLT5kaW1bcmFua10ubGluZGV4KSAqCisgICAgICAgICAgICAgYWRwLT5kaW1bcmFua10uc2l6ZTsKKworICAgIC8vIGZpbmQgZ2FwcyBib3RoIGZyb20gdGhlIGxlZnQgLSBvZmZzZXQgYW5kIGZyb20gdGhlIHJpZ2h0IC0gcl9vZmYKKyAgICBmb3IgKHJhbmstLTsgcmFuayA+PSAwOyByYW5rLS0pIHsKKyAgICAgICAgb2Zmc2V0ICs9IChhZHAtPmRpbVtyYW5rXS5sb3dlciAtIGFkcC0+ZGltW3JhbmtdLmxpbmRleCkgKgorICAgICAgICAgICAgICAgICAgYWRwLT5kaW1bcmFua10uc2l6ZTsKKyAgICAgICAgcl9vZmYgKz0gYWRwLT5kaW1bcmFua10uc2l6ZSAtCisgICAgICAgICAgICAgICAgIChhZHAtPmRpbVtyYW5rICsgMV0udXBwZXIgLSBhZHAtPmRpbVtyYW5rICsgMV0ubGluZGV4ICsgMSkgKgorICAgICAgICAgICAgICAgICBhZHAtPmRpbVtyYW5rICsgMV0uc2l6ZTsKKyAgICB9CisgICAgbGVuZ3RoID0gKGFkcC0+ZGltWzBdLnVwcGVyIC0gYWRwLT5kaW1bMF0ubGluZGV4ICsgMSkgKgorICAgICAgICAgICAgIGFkcC0+ZGltWzBdLnNpemUgLSBvZmZzZXQgLSByX29mZjsKK30KKworI2lmIE9GRkxPQURfREVCVUcgPiAwCisKK3ZvaWQgcHJpbnRfcmFuZ2UoCisgICAgY29uc3QgY2hhciAqc3BhY2VzLAorICAgIHVpbnQ2NF90IGxvdywKKyAgICB1aW50NjRfdCBoaWdoLAorICAgIGludCBlc2l6ZQorKQoreworICAgIGNoYXIgYnVmZmVyWzEwMjRdOworICAgIGNoYXIgbnVtYmVyWzMyXTsKKworICAgIE9GRkxPQURfVFJBQ0UoMywgIiVzICAgICAgICBwcmludF9yYW5nZShsb3c9JXAsIGhpZ2g9JXAsIGVzaXplPSVkKVxuIiwKKyAgICAgICAgc3BhY2VzLCAodm9pZCopbG93LCAodm9pZCopaGlnaCwgZXNpemUpOworCisgICAgaWYgKGNvbnNvbGVfZW5hYmxlZCA8IDQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBPRkZMT0FEX1RSQUNFKDQsICIlcyAgICAgICAgICAgIHZhbHVlczpcbiIsIHNwYWNlcyk7CisgICAgaW50IGNvdW50ID0gMDsKKyAgICBidWZmZXJbMF0gPSAnXDAnOworICAgIHdoaWxlIChsb3cgPD0gaGlnaCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoZXNpemUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgc3ByaW50ZihudW1iZXIsICIlZCAiLCAqKChjaGFyICopbG93KSk7CisgICAgICAgICAgICBsb3cgKz0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBzcHJpbnRmKG51bWJlciwgIiVkICIsICooKHNob3J0ICopbG93KSk7CisgICAgICAgICAgICBsb3cgKz0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBzcHJpbnRmKG51bWJlciwgIiVkICIsICooKGludCAqKWxvdykpOworICAgICAgICAgICAgbG93ICs9IDQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHNwcmludGYobnVtYmVyLCAiMHglMDE2eCAiLCAqKCh1aW50NjRfdCAqKWxvdykpOworICAgICAgICAgICAgbG93ICs9IDg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzdHJjYXQoYnVmZmVyLCBudW1iZXIpOworICAgICAgICBjb3VudCsrOworICAgICAgICBpZiAoY291bnQgPT0gMTApIHsKKyAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoNCwgIiVzICAgICAgICAgICAgJXNcbiIsIHNwYWNlcywgYnVmZmVyKTsKKyAgICAgICAgICAgIGNvdW50ID0gMDsKKyAgICAgICAgICAgIGJ1ZmZlclswXSA9ICdcMCc7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGNvdW50ICE9IDApIHsKKyAgICAgICAgT0ZGTE9BRF9UUkFDRSg0LCAiJXMgICAgICAgICAgICAlc1xuIiwgc3BhY2VzLCBidWZmZXIpOworICAgIH0KK30KKwordm9pZCBfX2Fycl9kZXNjX2R1bXAoCisgICAgY29uc3QgY2hhciAqc3BhY2VzLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgY29uc3QgYXJyX2Rlc2MgKmFkcCwKKyAgICBib29sIGRlcmVmCispCit7CisgICAgT0ZGTE9BRF9UUkFDRSgyLCAiJXMlcyBDRUFOIGV4cHJlc3Npb24gJXBcbiIsIHNwYWNlcywgbmFtZSwgYWRwKTsKKworICAgIGlmIChhZHAgIT0gMCkgeworICAgICAgICBPRkZMT0FEX1RSQUNFKDIsICIlcyAgICBiYXNlPSVsbHgsIHJhbms9JWxsZFxuIiwKKyAgICAgICAgICAgIHNwYWNlcywgYWRwLT5iYXNlLCBhZHAtPnJhbmspOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWRwLT5yYW5rOyBpKyspIHsKKyAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzICAgIGRpbWVuc2lvbiAlZDogc2l6ZT0lbGxkLCBsaW5kZXg9JWxsZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAibG93ZXI9JWxsZCwgdXBwZXI9JWxsZCwgc3RyaWRlPSVsbGRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlcywgaSwgYWRwLT5kaW1baV0uc2l6ZSwgYWRwLT5kaW1baV0ubGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBhZHAtPmRpbVtpXS5sb3dlciwgYWRwLT5kaW1baV0udXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFkcC0+ZGltW2ldLnN0cmlkZSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gRm9yIGNfY2Vhbl92YXIgdGhlIGJhc2UgYWRkciBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZGF0YQorICAgICAgICAvLyBGb3IgY19jZWFuX3Zhcl9wdHIgdGhlIGJhc2UgYWRkciBpcyBkZXJlZmVyZW5jZWQgdG8gZ2V0IHRvIHRoZSBkYXRhCisgICAgICAgIGdlbmVyYXRlX21lbV9yYW5nZXMoc3BhY2VzLCBhZHAsIGRlcmVmLCAmcHJpbnRfcmFuZ2UpOworICAgIH0KK30KKyNlbmRpZiAvLyBPRkZMT0FEX0RFQlVHCmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9jZWFuX3V0aWwuaCBiL2ZpbmFsL29mZmxvYWQvc3JjL2NlYW5fdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZGViY2MKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9jZWFuX3V0aWwuaApAQCAtMCwwICsxLDEwMSBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIENFQU5fVVRJTF9IX0lOQ0xVREVECisjZGVmaW5lIENFQU5fVVRJTF9IX0lOQ0xVREVECisKKyNpZiBNUFNTX1ZFUlNJT04gPiAzMworI2luY2x1ZGUgPHNvdXJjZS9DT0lCdWZmZXJfc291cmNlLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2lmIE1QU1NfVkVSU0lPTiA8PSAzMworLy8gQ0VBTiBleHByZXNzaW9uIHJlcHJlc2VudGF0aW9uCitzdHJ1Y3QgZGltX2Rlc2MgeworICAgIGludDY0X3Qgc2l6ZTsgICAgICAgLy8gTGVuZ3RoIG9mIGRhdGEgdHlwZQorICAgIGludDY0X3QgbGluZGV4OyAgICAgLy8gTG93ZXIgaW5kZXgKKyAgICBpbnQ2NF90IGxvd2VyOyAgICAgIC8vIExvd2VyIHNlY3Rpb24gYm91bmQKKyAgICBpbnQ2NF90IHVwcGVyOyAgICAgIC8vIFVwcGVyIHNlY3Rpb24gYm91bmQKKyAgICBpbnQ2NF90IHN0cmlkZTsgICAgIC8vIFN0cmlkZQorfTsKKworc3RydWN0IGFycl9kZXNjIHsKKyAgICBpbnQ2NF90IGJhc2U7ICAgICAgIC8vIEJhc2UgYWRkcmVzcworICAgIGludDY0X3QgcmFuazsgICAgICAgLy8gUmFuayBvZiBhcnJheQorICAgIGRpbV9kZXNjIGRpbVsxXTsKK307CisjZW5kaWYKKworc3RydWN0IENlYW5SZWFkRGltIHsKKyAgICBpbnQ2NF90IGNvdW50OyAvLyBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgZGltZW5zaW9uCisgICAgaW50NjRfdCBzaXplOyAgLy8gVGhlIG51bWJlciBvZiBieXRlcyBiZXR3ZWVuIHN1Y2Nlc3NpdmUKKyAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50cyBpbiB0aGlzIGRpbWVuc2lvbi4KK307CisKK3N0cnVjdCBDZWFuUmVhZFJhbmdlcyB7CisgICAgdm9pZCAqICBwdHI7CisgICAgaW50NjRfdCBjdXJyZW50X251bWJlcjsgICAvLyB0aGUgbnVtYmVyIG9mIHJhbmdlcyByZWFkCisgICAgaW50NjRfdCByYW5nZV9tYXhfbnVtYmVyOyAvLyBudW1iZXIgb2YgY29udGlndW91cyByYW5nZXMKKyAgICBpbnQ2NF90IHJhbmdlX3NpemU7ICAgICAgIC8vIHNpemUgb2YgbWF4IGNvbnRpZ3VvdXMgcmFuZ2UKKyAgICBpbnQgICAgIGxhc3Rfbm9uY29udF9pbmQ7IC8vIHNpemUgb2YgRGltIGFycmF5CisgICAgaW50NjRfdCBpbml0X29mZnNldDsgICAgICAvLyBvZmZzZXQgb2YgMS1zdCBlbGVtZW50IGZyb20gYXJyYXkgbGVmdCBib3VuZAorICAgIENlYW5SZWFkRGltIERpbVsxXTsKK307CisKKy8vIGFycmF5IGRlc2NyaXB0b3IgbGVuZ3RoCisjZGVmaW5lIF9fYXJyX2Rlc2NfbGVuZ3RoKHJhbmspIFwKKyAgICAoc2l6ZW9mKGludDY0X3QpICsgc2l6ZW9mKGRpbV9kZXNjKSAqIChyYW5rKSkKKworLy8gcmV0dXJucyBvZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZAordm9pZCBfX2Fycl9kYXRhX29mZnNldF9hbmRfbGVuZ3RoKGNvbnN0IGFycl9kZXNjICphZHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgJmxlbmd0aCk7CisKKy8vIGRlZmluZSBpZiBkYXRhIGFycmF5IGRlc2NyaWJlZCBieSBhcmd1bWVudCBpcyBjb250aWd1b3VzIG9uZQorYm9vbCBpc19hcnJfZGVzY19jb250aWd1b3VzKGNvbnN0IGFycl9kZXNjICphcCk7CisKKy8vIGFsbG9jYXRlIGVsZW1lbnQgb2YgQ2VhblJlYWRSYW5nZXMgdHlwZSBpbml0aWFsaXplZAorLy8gdG8gcmVhZCBjb25zZXF1ZW50bHkgY29udGlndW91cyByYW5nZXMgZGVzY3JpYmVkIGJ5ICJhcCIgYXJndW1lbnQKK0NlYW5SZWFkUmFuZ2VzICogaW5pdF9yZWFkX3Jhbmdlc19hcnJfZGVzYyhjb25zdCBhcnJfZGVzYyAqYXApOworCisvLyBjaGVjayBpZiByYW5nZXMgZGVzY3JpYmVkIGJ5IDEgYXJndW1lbnQgY291bGQgYmUgdHJhbnNmZXJyZWQgaW50byByYW5nZXMKKy8vIGRlc2NyaWJlZCBieSAyLW5kIG9uZQorYm9vbCBjZWFuX3Jhbmdlc19tYXRjaCgKKyAgICBDZWFuUmVhZFJhbmdlcyAqIHJlYWRfcm5nMSwKKyAgICBDZWFuUmVhZFJhbmdlcyAqIHJlYWRfcm5nMgorKTsKKworLy8gZmlyc3QgYXJndW1lbnQgLSByZXR1cm5lZCB2YWx1ZSBieSBjYWxsIHRvIGluaXRfcmVhZF9yYW5nZXNfYXJyX2Rlc2MuCisvLyByZXR1cm5zIHRydWUgaWYgb2Zmc2V0IGFuZCBsZW5ndGggb2YgbmV4dCByYW5nZSBpcyBzZXQgc3VjY2Vzc2Z1bHkuCisvLyByZXR1cm5zIGZhbHNlIGlmIHRoZSByYW5nZXMgaXMgb3Zlci4KK2Jvb2wgZ2V0X25leHRfcmFuZ2UoCisgICAgQ2VhblJlYWRSYW5nZXMgKiByZWFkX3JuZywKKyAgICBpbnQ2NF90ICpvZmZzZXQKKyk7CisKKy8vIHJldHVybnMgbnVtYmVyIG9mIHRyYW5zZmVycmVkIGJ5dGVzCitpbnQ2NF90IGNlYW5fZ2V0X3RyYW5zZl9zaXplKENlYW5SZWFkUmFuZ2VzICogcmVhZF9ybmcpOworCisjaWYgT0ZGTE9BRF9ERUJVRyA+IDAKKy8vIHByaW50cyBhcnJheSBkZXNjcmlwdG9yIGNvbnRlbnRzIHRvIHN0ZGVycgordm9pZCAgICBfX2Fycl9kZXNjX2R1bXAoCisgICAgY29uc3QgY2hhciAqc3BhY2VzLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgY29uc3QgYXJyX2Rlc2MgKmFkcCwKKyAgICBib29sIGRlcmVmZXJlbmNlKTsKKyNlbHNlCisjZGVmaW5lIF9fYXJyX2Rlc2NfZHVtcCgKKyAgICBzcGFjZXMsCisgICAgbmFtZSwKKyAgICBhZHAsCisgICAgZGVyZWZlcmVuY2UpCisjZW5kaWYgLy8gT0ZGTE9BRF9ERUJVRworCisjZW5kaWYgLy8gQ0VBTl9VVElMX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL2NvaS9jb2lfY2xpZW50LmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL2NvaS9jb2lfY2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjhjN2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvY29pL2NvaV9jbGllbnQuY3BwCkBAIC0wLDAgKzEsMzUwIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8vIFRoZSBDT0kgaG9zdCBpbnRlcmZhY2UKKworI2luY2x1ZGUgImNvaV9jbGllbnQuaCIKKyNpbmNsdWRlICIuLi9vZmZsb2FkX2NvbW1vbi5oIgorCituYW1lc3BhY2UgQ09JIHsKKworI2RlZmluZSBDT0lfVkVSU0lPTjEgICAgIkNPSV8xLjAiCisjZGVmaW5lIENPSV9WRVJTSU9OMiAgICAiQ09JXzIuMCIKKworYm9vbCAgICAgICAgICAgIGlzX2F2YWlsYWJsZTsKK3N0YXRpYyB2b2lkKiAgICBsaWJfaGFuZGxlOworCisvLyBwb2ludGVycyB0byBmdW5jdGlvbnMgZnJvbSBDT0kgbGlicmFyeQorQ09JUkVTVUxUICgqRW5naW5lR2V0Q291bnQpKENPSV9JU0FfVFlQRSwgdWludDMyX3QqKTsKK0NPSVJFU1VMVCAoKkVuZ2luZUdldEhhbmRsZSkoQ09JX0lTQV9UWVBFLCB1aW50MzJfdCwgQ09JRU5HSU5FKik7CisKK0NPSVJFU1VMVCAoKlByb2Nlc3NDcmVhdGVGcm9tTWVtb3J5KShDT0lFTkdJTkUsIGNvbnN0IGNoYXIqLCBjb25zdCB2b2lkKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCwgaW50LCBjb25zdCBjaGFyKiosIHVpbnQ4X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioqLCB1aW50OF90LCBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90LCBDT0lQUk9DRVNTKik7CitDT0lSRVNVTFQgKCpQcm9jZXNzRGVzdHJveSkoQ09JUFJPQ0VTUywgaW50MzJfdCwgdWludDhfdCwgaW50OF90KiwgdWludDMyX3QqKTsKK0NPSVJFU1VMVCAoKlByb2Nlc3NHZXRGdW5jdGlvbkhhbmRsZXMpKENPSVBST0NFU1MsIHVpbnQzMl90LCBjb25zdCBjaGFyKiosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lGVU5DVElPTiopOworQ09JUkVTVUxUICgqUHJvY2Vzc0xvYWRMaWJyYXJ5RnJvbU1lbW9yeSkoQ09JUFJPQ0VTUywgY29uc3Qgdm9pZCosIHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciosIHVpbnQ2NF90LCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSUxJQlJBUlkqKTsKK0NPSVJFU1VMVCAoKlByb2Nlc3NSZWdpc3RlckxpYnJhcmllcykodWludDMyX3QsIGNvbnN0IHZvaWQqKiwgY29uc3QgdWludDY0X3QqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiosIGNvbnN0IHVpbnQ2NF90Kik7CisKK0NPSVJFU1VMVCAoKlBpcGVsaW5lQ3JlYXRlKShDT0lQUk9DRVNTLCBDT0lfQ1BVX01BU0ssIHVpbnQzMl90LCBDT0lQSVBFTElORSopOworQ09JUkVTVUxUICgqUGlwZWxpbmVEZXN0cm95KShDT0lQSVBFTElORSk7CitDT0lSRVNVTFQgKCpQaXBlbGluZVJ1bkZ1bmN0aW9uKShDT0lQSVBFTElORSwgQ09JRlVOQ1RJT04sIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09JQlVGRkVSKiwgY29uc3QgQ09JX0FDQ0VTU19GTEFHUyosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgY29uc3QgQ09JRVZFTlQqLCBjb25zdCB2b2lkKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90LCB2b2lkKiwgdWludDE2X3QsIENPSUVWRU5UKik7CisKK0NPSVJFU1VMVCAoKkJ1ZmZlckNyZWF0ZSkodWludDY0X3QsIENPSV9CVUZGRVJfVFlQRSwgdWludDMyX3QsIGNvbnN0IHZvaWQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgY29uc3QgQ09JUFJPQ0VTUyosIENPSUJVRkZFUiopOworQ09JUkVTVUxUICgqQnVmZmVyQ3JlYXRlRnJvbU1lbW9yeSkodWludDY0X3QsIENPSV9CVUZGRVJfVFlQRSwgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiwgdWludDMyX3QsIGNvbnN0IENPSVBST0NFU1MqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JQlVGRkVSKik7CitDT0lSRVNVTFQgKCpCdWZmZXJEZXN0cm95KShDT0lCVUZGRVIpOworQ09JUkVTVUxUICgqQnVmZmVyTWFwKShDT0lCVUZGRVIsIHVpbnQ2NF90LCB1aW50NjRfdCwgQ09JX01BUF9UWVBFLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09JRVZFTlQqLCBDT0lFVkVOVCosIENPSU1BUElOU1RBTkNFKiwgdm9pZCoqKTsKK0NPSVJFU1VMVCAoKkJ1ZmZlclVubWFwKShDT0lNQVBJTlNUQU5DRSwgdWludDMyX3QsIGNvbnN0IENPSUVWRU5UKiwgQ09JRVZFTlQqKTsKK0NPSVJFU1VMVCAoKkJ1ZmZlcldyaXRlKShDT0lCVUZGRVIsIHVpbnQ2NF90LCBjb25zdCB2b2lkKiwgdWludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVFlQRSwgdWludDMyX3QsIGNvbnN0IENPSUVWRU5UKiwgQ09JRVZFTlQqKTsKK0NPSVJFU1VMVCAoKkJ1ZmZlclJlYWQpKENPSUJVRkZFUiwgdWludDY0X3QsIHZvaWQqLCB1aW50NjRfdCwgQ09JX0NPUFlfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90LCBjb25zdCBDT0lFVkVOVCosIENPSUVWRU5UKik7CitDT0lSRVNVTFQgKCpCdWZmZXJDb3B5KShDT0lCVUZGRVIsIENPSUJVRkZFUiwgdWludDY0X3QsIHVpbnQ2NF90LCB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1RZUEUsIHVpbnQzMl90LCBjb25zdCBDT0lFVkVOVCosIENPSUVWRU5UKik7CitDT0lSRVNVTFQgKCpCdWZmZXJHZXRTaW5rQWRkcmVzcykoQ09JQlVGRkVSLCB1aW50NjRfdCopOworQ09JUkVTVUxUICgqQnVmZmVyU2V0U3RhdGUpKENPSUJVRkZFUiwgQ09JUFJPQ0VTUywgQ09JX0JVRkZFUl9TVEFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQlVGRkVSX01PVkVfRkxBRywgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBDT0lFVkVOVCosIENPSUVWRU5UKik7CisKK0NPSVJFU1VMVCAoKkV2ZW50V2FpdCkodWludDE2X3QsIGNvbnN0IENPSUVWRU5UKiwgaW50MzJfdCwgdWludDhfdCwgdWludDMyX3QqLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCopOworCit1aW50NjRfdCAgKCpQZXJmR2V0Q3ljbGVGcmVxdWVuY3kpKHZvaWQpOworCitib29sIGluaXQodm9pZCkKK3sKKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisgICAgY29uc3QgY2hhciAqbGliX25hbWUgPSAibGliY29pX2hvc3Quc28uMCI7CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyAgICBjb25zdCBjaGFyICpsaWJfbmFtZSA9ICJjb2lfaG9zdC5kbGwiOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiTG9hZGluZyBDT0kgbGlicmFyeSAlcyAuLi5cbiIsIGxpYl9uYW1lKTsKKyAgICBsaWJfaGFuZGxlID0gRExfb3BlbihsaWJfbmFtZSk7CisgICAgaWYgKGxpYl9oYW5kbGUgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gbG9hZCB0aGUgbGlicmFyeVxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBFbmdpbmVHZXRDb3VudCA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSV9JU0FfVFlQRSwgdWludDMyX3QqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JRW5naW5lR2V0Q291bnQiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChFbmdpbmVHZXRDb3VudCA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lFbmdpbmVHZXRDb3VudCIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBFbmdpbmVHZXRIYW5kbGUgPQorICAgICAgICAoQ09JUkVTVUxUICgqKShDT0lfSVNBX1RZUEUsIHVpbnQzMl90LCBDT0lFTkdJTkUqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JRW5naW5lR2V0SGFuZGxlIiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoRW5naW5lR2V0SGFuZGxlID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSUVuZ2luZUdldEhhbmRsZSIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBQcm9jZXNzQ3JlYXRlRnJvbU1lbW9yeSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSUVOR0lORSwgY29uc3QgY2hhciosIGNvbnN0IHZvaWQqLCB1aW50NjRfdCwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiosIHVpbnQ4X3QsIGNvbnN0IGNoYXIqKiwgdWludDhfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciosIHVpbnQ2NF90LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90LCBDT0lQUk9DRVNTKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSVByb2Nlc3NDcmVhdGVGcm9tTWVtb3J5IiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoUHJvY2Vzc0NyZWF0ZUZyb21NZW1vcnkgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JUHJvY2Vzc0NyZWF0ZUZyb21NZW1vcnkiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUHJvY2Vzc0Rlc3Ryb3kgPQorICAgICAgICAoQ09JUkVTVUxUICgqKShDT0lQUk9DRVNTLCBpbnQzMl90LCB1aW50OF90LCBpbnQ4X3QqLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lQcm9jZXNzRGVzdHJveSIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKFByb2Nlc3NEZXN0cm95ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSVByb2Nlc3NEZXN0cm95Iik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFByb2Nlc3NHZXRGdW5jdGlvbkhhbmRsZXMgPQorICAgICAgICAoQ09JUkVTVUxUICgqKShDT0lQUk9DRVNTLCB1aW50MzJfdCwgY29uc3QgY2hhcioqLCBDT0lGVU5DVElPTiopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lQcm9jZXNzR2V0RnVuY3Rpb25IYW5kbGVzIiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoUHJvY2Vzc0dldEZ1bmN0aW9uSGFuZGxlcyA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lQcm9jZXNzR2V0RnVuY3Rpb25IYW5kbGVzIik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFByb2Nlc3NMb2FkTGlicmFyeUZyb21NZW1vcnkgPQorICAgICAgICAoQ09JUkVTVUxUICgqKShDT0lQUk9DRVNTLCBjb25zdCB2b2lkKiwgdWludDY0X3QsIGNvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosIHVpbnQ2NF90LCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ09JTElCUkFSWSopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lQcm9jZXNzTG9hZExpYnJhcnlGcm9tTWVtb3J5IiwgQ09JX1ZFUlNJT04yKTsKKyAgICBpZiAoUHJvY2Vzc0xvYWRMaWJyYXJ5RnJvbU1lbW9yeSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lQcm9jZXNzTG9hZExpYnJhcnlGcm9tTWVtb3J5Iik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFByb2Nlc3NSZWdpc3RlckxpYnJhcmllcyA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKHVpbnQzMl90LCBjb25zdCB2b2lkKiosIGNvbnN0IHVpbnQ2NF90KiwgY29uc3QgY2hhcioqLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50NjRfdCopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lQcm9jZXNzUmVnaXN0ZXJMaWJyYXJpZXMiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChQcm9jZXNzUmVnaXN0ZXJMaWJyYXJpZXMgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JUHJvY2Vzc1JlZ2lzdGVyTGlicmFyaWVzIik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFBpcGVsaW5lQ3JlYXRlID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JUFJPQ0VTUywgQ09JX0NQVV9NQVNLLCB1aW50MzJfdCwgQ09JUElQRUxJTkUqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JUGlwZWxpbmVDcmVhdGUiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChQaXBlbGluZUNyZWF0ZSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lQaXBlbGluZUNyZWF0ZSIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBQaXBlbGluZURlc3Ryb3kgPQorICAgICAgICAoQ09JUkVTVUxUICgqKShDT0lQSVBFTElORSkpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSVBpcGVsaW5lRGVzdHJveSIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKFBpcGVsaW5lRGVzdHJveSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lQaXBlbGluZURlc3Ryb3kiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUGlwZWxpbmVSdW5GdW5jdGlvbiA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSVBJUEVMSU5FLCBDT0lGVU5DVElPTiwgdWludDMyX3QsIGNvbnN0IENPSUJVRkZFUiosCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENPSV9BQ0NFU1NfRkxBR1MqLCB1aW50MzJfdCwgY29uc3QgQ09JRVZFTlQqLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiwgdWludDE2X3QsIHZvaWQqLCB1aW50MTZfdCwgQ09JRVZFTlQqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JUGlwZWxpbmVSdW5GdW5jdGlvbiIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKFBpcGVsaW5lUnVuRnVuY3Rpb24gPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JUGlwZWxpbmVSdW5GdW5jdGlvbiIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBCdWZmZXJDcmVhdGUgPQorICAgICAgICAoQ09JUkVTVUxUICgqKSh1aW50NjRfdCwgQ09JX0JVRkZFUl9UWVBFLCB1aW50MzJfdCwgY29uc3Qgdm9pZCosCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90LCBjb25zdCBDT0lQUk9DRVNTKiwgQ09JQlVGRkVSKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUJ1ZmZlckNyZWF0ZSIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKEJ1ZmZlckNyZWF0ZSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lCdWZmZXJDcmVhdGUiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQnVmZmVyQ3JlYXRlRnJvbU1lbW9yeSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKHVpbnQ2NF90LCBDT0lfQlVGRkVSX1RZUEUsIHVpbnQzMl90LCB2b2lkKiwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QsIGNvbnN0IENPSVBST0NFU1MqLCBDT0lCVUZGRVIqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JQnVmZmVyQ3JlYXRlRnJvbU1lbW9yeSIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKEJ1ZmZlckNyZWF0ZUZyb21NZW1vcnkgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JQnVmZmVyQ3JlYXRlRnJvbU1lbW9yeSIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBCdWZmZXJEZXN0cm95ID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JQlVGRkVSKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JQnVmZmVyRGVzdHJveSIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKEJ1ZmZlckRlc3Ryb3kgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JQnVmZmVyRGVzdHJveSIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBCdWZmZXJNYXAgPQorICAgICAgICAoQ09JUkVTVUxUICgqKShDT0lCVUZGRVIsIHVpbnQ2NF90LCB1aW50NjRfdCwgQ09JX01BUF9UWVBFLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09JRVZFTlQqLCBDT0lFVkVOVCosIENPSU1BUElOU1RBTkNFKiwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JQnVmZmVyTWFwIiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoQnVmZmVyTWFwID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSUJ1ZmZlck1hcCIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBCdWZmZXJVbm1hcCA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSU1BUElOU1RBTkNFLCB1aW50MzJfdCwgY29uc3QgQ09JRVZFTlQqLAorICAgICAgICAgICAgICAgICAgICAgICBDT0lFVkVOVCopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lCdWZmZXJVbm1hcCIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKEJ1ZmZlclVubWFwID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSUJ1ZmZlclVubWFwIik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEJ1ZmZlcldyaXRlID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JQlVGRkVSLCB1aW50NjRfdCwgY29uc3Qgdm9pZCosIHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9UWVBFLCB1aW50MzJfdCwgY29uc3QgQ09JRVZFTlQqLAorICAgICAgICAgICAgICAgICAgICAgICBDT0lFVkVOVCopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lCdWZmZXJXcml0ZSIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKEJ1ZmZlcldyaXRlID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSUJ1ZmZlcldyaXRlIik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEJ1ZmZlclJlYWQgPQorICAgICAgICAoQ09JUkVTVUxUICgqKShDT0lCVUZGRVIsIHVpbnQ2NF90LCB2b2lkKiwgdWludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVFlQRSwgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09JRVZFTlQqLCBDT0lFVkVOVCopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lCdWZmZXJSZWFkIiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoQnVmZmVyUmVhZCA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lCdWZmZXJSZWFkIik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEJ1ZmZlckNvcHkgPQorICAgICAgICAoQ09JUkVTVUxUICgqKShDT0lCVUZGRVIsIENPSUJVRkZFUiwgdWludDY0X3QsIHVpbnQ2NF90LCB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVFlQRSwgdWludDMyX3QsIGNvbnN0IENPSUVWRU5UKiwKKyAgICAgICAgICAgICAgICAgICAgICAgQ09JRVZFTlQqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JQnVmZmVyQ29weSIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKEJ1ZmZlckNvcHkgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JQnVmZmVyQ29weSIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBCdWZmZXJHZXRTaW5rQWRkcmVzcyA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSUJVRkZFUiwgdWludDY0X3QqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JQnVmZmVyR2V0U2lua0FkZHJlc3MiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChCdWZmZXJHZXRTaW5rQWRkcmVzcyA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lCdWZmZXJHZXRTaW5rQWRkcmVzcyIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBCdWZmZXJTZXRTdGF0ZSA9CisgICAgICAgIChDT0lSRVNVTFQoKikoQ09JQlVGRkVSLCBDT0lQUk9DRVNTLCBDT0lfQlVGRkVSX1NUQVRFLAorICAgICAgICAgICAgICAgICAgICAgIENPSV9CVUZGRVJfTU9WRV9GTEFHLCB1aW50MzJfdCwgY29uc3QgQ09JRVZFTlQqLAorICAgICAgICAgICAgICAgICAgICAgIENPSUVWRU5UKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUJ1ZmZlclNldFN0YXRlIiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoQnVmZmVyU2V0U3RhdGUgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JQnVmZmVyU2V0U3RhdGUiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgRXZlbnRXYWl0ID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikodWludDE2X3QsIGNvbnN0IENPSUVWRU5UKiwgaW50MzJfdCwgdWludDhfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqLCB1aW50MzJfdCopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lFdmVudFdhaXQiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChFdmVudFdhaXQgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JRXZlbnRXYWl0Iik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFBlcmZHZXRDeWNsZUZyZXF1ZW5jeSA9CisgICAgICAgICh1aW50NjRfdCAoKikodm9pZCkpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSVBlcmZHZXRDeWNsZUZyZXF1ZW5jeSIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKFBlcmZHZXRDeWNsZUZyZXF1ZW5jeSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lQZXJmR2V0Q3ljbGVGcmVxdWVuY3kiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaXNfYXZhaWxhYmxlID0gdHJ1ZTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIGZpbmkodm9pZCkKK3sKKyAgICBpc19hdmFpbGFibGUgPSBmYWxzZTsKKworICAgIGlmIChsaWJfaGFuZGxlICE9IDApIHsKKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIERMX2Nsb3NlKGxpYl9oYW5kbGUpOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorICAgICAgICBsaWJfaGFuZGxlID0gMDsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIENPSQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvY29pL2NvaV9jbGllbnQuaCBiL2ZpbmFsL29mZmxvYWQvc3JjL2NvaS9jb2lfY2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc3NWE4YgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL2NvaS9jb2lfY2xpZW50LmgKQEAgLTAsMCArMSwxMTggQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLy8gVGhlIGludGVyZmFjZSBiZXR3ZWVuIG9mZmxvYWQgbGlicmFyeSBhbmQgdGhlIENPSSBBUEkgb24gdGhlIGhvc3QKKworI2lmbmRlZiBDT0lfQ0xJRU5UX0hfSU5DTFVERUQKKyNkZWZpbmUgQ09JX0NMSUVOVF9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxjb21tb24vQ09JUGVyZl9jb21tb24uaD4KKyNpbmNsdWRlIDxzb3VyY2UvQ09JRW5naW5lX3NvdXJjZS5oPgorI2luY2x1ZGUgPHNvdXJjZS9DT0lQcm9jZXNzX3NvdXJjZS5oPgorI2luY2x1ZGUgPHNvdXJjZS9DT0lQaXBlbGluZV9zb3VyY2UuaD4KKyNpbmNsdWRlIDxzb3VyY2UvQ09JQnVmZmVyX3NvdXJjZS5oPgorI2luY2x1ZGUgPHNvdXJjZS9DT0lFdmVudF9zb3VyY2UuaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiLi4vbGlib2ZmbG9hZF9lcnJvcl9jb2Rlcy5oIgorI2luY2x1ZGUgIi4uL29mZmxvYWRfdXRpbC5oIgorCisjZGVmaW5lIE1JQ19FTkdJTkVTX01BWCAgICAgMTI4CisKKyNpZiBNSUNfRU5HSU5FU19NQVggPCBDT0lfTUFYX0lTQV9NSUNfREVWSUNFUworI2Vycm9yIE1JQ19FTkdJTkVTX01BWCBuZWVkIHRvIGJlIGluY3JlYXNlZAorI2VuZGlmCisKKy8vIENPSSBsaWJyYXJ5IGludGVyZmFjZQorbmFtZXNwYWNlIENPSSB7CisKK2V4dGVybiBib29sIGluaXQodm9pZCk7CitleHRlcm4gdm9pZCBmaW5pKHZvaWQpOworCitleHRlcm4gYm9vbCBpc19hdmFpbGFibGU7CisKKy8vIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBmcm9tIENPSSBsaWJyYXJ5CitleHRlcm4gQ09JUkVTVUxUICgqRW5naW5lR2V0Q291bnQpKENPSV9JU0FfVFlQRSwgdWludDMyX3QqKTsKK2V4dGVybiBDT0lSRVNVTFQgKCpFbmdpbmVHZXRIYW5kbGUpKENPSV9JU0FfVFlQRSwgdWludDMyX3QsIENPSUVOR0lORSopOworCitleHRlcm4gQ09JUkVTVUxUICgqUHJvY2Vzc0NyZWF0ZUZyb21NZW1vcnkpKENPSUVOR0lORSwgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCosIHVpbnQ2NF90LCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioqLCB1aW50OF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiwgdWludDhfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgdWludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciosIHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSVBST0NFU1MqKTsKK2V4dGVybiBDT0lSRVNVTFQgKCpQcm9jZXNzRGVzdHJveSkoQ09JUFJPQ0VTUywgaW50MzJfdCwgdWludDhfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QqLCB1aW50MzJfdCopOworZXh0ZXJuIENPSVJFU1VMVCAoKlByb2Nlc3NHZXRGdW5jdGlvbkhhbmRsZXMpKENPSVBST0NFU1MsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JRlVOQ1RJT04qKTsKK2V4dGVybiBDT0lSRVNVTFQgKCpQcm9jZXNzTG9hZExpYnJhcnlGcm9tTWVtb3J5KShDT0lQUk9DRVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lMSUJSQVJZKik7CitleHRlcm4gQ09JUkVTVUxUICgqUHJvY2Vzc1JlZ2lzdGVyTGlicmFyaWVzKSh1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCoqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50NjRfdCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDY0X3QqKTsKKworZXh0ZXJuIENPSVJFU1VMVCAoKlBpcGVsaW5lQ3JlYXRlKShDT0lQUk9DRVNTLCBDT0lfQ1BVX01BU0ssIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSVBJUEVMSU5FKik7CitleHRlcm4gQ09JUkVTVUxUICgqUGlwZWxpbmVEZXN0cm95KShDT0lQSVBFTElORSk7CitleHRlcm4gQ09JUkVTVUxUICgqUGlwZWxpbmVSdW5GdW5jdGlvbikoQ09JUElQRUxJTkUsIENPSUZVTkNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QsIGNvbnN0IENPSUJVRkZFUiosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0lfQUNDRVNTX0ZMQUdTKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90LCBjb25zdCBDT0lFVkVOVCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiwgdWludDE2X3QsIHZvaWQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QsIENPSUVWRU5UKik7CisKK2V4dGVybiBDT0lSRVNVTFQgKCpCdWZmZXJDcmVhdGUpKHVpbnQ2NF90LCBDT0lfQlVGRkVSX1RZUEUsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiwgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENPSVBST0NFU1MqLCBDT0lCVUZGRVIqKTsKK2V4dGVybiBDT0lSRVNVTFQgKCpCdWZmZXJDcmVhdGVGcm9tTWVtb3J5KSh1aW50NjRfdCwgQ09JX0JVRkZFUl9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QsIHZvaWQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QsIGNvbnN0IENPSVBST0NFU1MqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JQlVGRkVSKik7CitleHRlcm4gQ09JUkVTVUxUICgqQnVmZmVyRGVzdHJveSkoQ09JQlVGRkVSKTsKK2V4dGVybiBDT0lSRVNVTFQgKCpCdWZmZXJNYXApKENPSUJVRkZFUiwgdWludDY0X3QsIHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfTUFQX1RZUEUsIHVpbnQzMl90LCBjb25zdCBDT0lFVkVOVCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSUVWRU5UKiwgQ09JTUFQSU5TVEFOQ0UqLCB2b2lkKiopOworZXh0ZXJuIENPSVJFU1VMVCAoKkJ1ZmZlclVubWFwKShDT0lNQVBJTlNUQU5DRSwgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09JRVZFTlQqLCBDT0lFVkVOVCopOworZXh0ZXJuIENPSVJFU1VMVCAoKkJ1ZmZlcldyaXRlKShDT0lCVUZGRVIsIHVpbnQ2NF90LCBjb25zdCB2b2lkKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCwgQ09JX0NPUFlfVFlQRSwgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09JRVZFTlQqLCBDT0lFVkVOVCopOworZXh0ZXJuIENPSVJFU1VMVCAoKkJ1ZmZlclJlYWQpKENPSUJVRkZFUiwgdWludDY0X3QsIHZvaWQqLCB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1RZUEUsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09JRVZFTlQqLCBDT0lFVkVOVCopOworZXh0ZXJuIENPSVJFU1VMVCAoKkJ1ZmZlckNvcHkpKENPSUJVRkZFUiwgQ09JQlVGRkVSLCB1aW50NjRfdCwgdWludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCwgQ09JX0NPUFlfVFlQRSwgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0lFVkVOVCosIENPSUVWRU5UKik7CitleHRlcm4gQ09JUkVTVUxUICgqQnVmZmVyR2V0U2lua0FkZHJlc3MpKENPSUJVRkZFUiwgdWludDY0X3QqKTsKK2V4dGVybiBDT0lSRVNVTFQgKCpCdWZmZXJTZXRTdGF0ZSkoQ09JQlVGRkVSLCBDT0lQUk9DRVNTLCBDT0lfQlVGRkVSX1NUQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQlVGRkVSX01PVkVfRkxBRywgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgQ09JRVZFTlQqLCBDT0lFVkVOVCopOworCitleHRlcm4gQ09JUkVTVUxUICgqRXZlbnRXYWl0KSh1aW50MTZfdCwgY29uc3QgQ09JRVZFTlQqLCBpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCwgdWludDMyX3QqLCB1aW50MzJfdCopOworCitleHRlcm4gdWludDY0X3QgICgqUGVyZkdldEN5Y2xlRnJlcXVlbmN5KSh2b2lkKTsKKworfSAvLyBuYW1lc3BhY2UgQ09JCisKKyNlbmRpZiAvLyBDT0lfQ0xJRU5UX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL2NvaS9jb2lfc2VydmVyLmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL2NvaS9jb2lfc2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2U2YzJkCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvY29pL2NvaV9zZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsMTMwIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8vIFRoZSBDT0kgaW50ZXJmYWNlIG9uIHRoZSB0YXJnZXQKKworI2luY2x1ZGUgImNvaV9zZXJ2ZXIuaCIKKworI2luY2x1ZGUgIi4uL29mZmxvYWRfdGFyZ2V0LmgiCisjaW5jbHVkZSAiLi4vb2ZmbG9hZF90aW1lci5oIgorI2lmZGVmIE1ZT19TVVBQT1JUCisjaW5jbHVkZSAiLi4vb2ZmbG9hZF9teW9fdGFyZ2V0LmgiICAgICAgLy8gZm9yIF9fb2ZmbG9hZF9teW9MaWJJbml0L0ZpbmkKKyNlbmRpZiAvLyBNWU9fU1VQUE9SVAorCitDT0lOQVRJVkVMSUJFWFBPUlQKK3ZvaWQgc2VydmVyX2NvbXB1dGUoCisgICAgdWludDMyX3QgIGJ1ZmZlcl9jb3VudCwKKyAgICB2b2lkKiogICAgYnVmZmVycywKKyAgICB1aW50NjRfdCogYnVmZmVyc19sZW4sCisgICAgdm9pZCogICAgIG1pc2NfZGF0YSwKKyAgICB1aW50MTZfdCAgbWlzY19kYXRhX2xlbiwKKyAgICB2b2lkKiAgICAgcmV0dXJuX2RhdGEsCisgICAgdWludDE2X3QgIHJldHVybl9kYXRhX2xlbgorKQoreworICAgIE9mZmxvYWREZXNjcmlwdG9yOjpvZmZsb2FkKGJ1ZmZlcl9jb3VudCwgYnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNjX2RhdGEsIG1pc2NfZGF0YV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuX2RhdGEsIHJldHVybl9kYXRhX2xlbik7Cit9CisKK0NPSU5BVElWRUxJQkVYUE9SVAordm9pZCBzZXJ2ZXJfaW5pdCgKKyAgICB1aW50MzJfdCAgYnVmZmVyX2NvdW50LAorICAgIHZvaWQqKiAgICBidWZmZXJzLAorICAgIHVpbnQ2NF90KiBidWZmZXJzX2xlbiwKKyAgICB2b2lkKiAgICAgbWlzY19kYXRhLAorICAgIHVpbnQxNl90ICBtaXNjX2RhdGFfbGVuLAorICAgIHZvaWQqICAgICByZXR1cm5fZGF0YSwKKyAgICB1aW50MTZfdCAgcmV0dXJuX2RhdGFfbGVuCispCit7CisgICAgc3RydWN0IGluaXRfZGF0YSB7CisgICAgICAgIGludCAgZGV2aWNlX2luZGV4OworICAgICAgICBpbnQgIGRldmljZXNfdG90YWw7CisgICAgICAgIGludCAgY29uc29sZV9sZXZlbDsKKyAgICAgICAgaW50ICBvZmZsb2FkX3JlcG9ydF9sZXZlbDsKKyAgICB9ICpkYXRhID0gKHN0cnVjdCBpbml0X2RhdGEqKSBtaXNjX2RhdGE7CisKKyAgICAvLyBzZXQgZGV2aWNlIGluZGV4IGFuZCBudW1iZXIgb2YgdG90YWwgZGV2aWNlcworICAgIG1pY19pbmRleCA9IGRhdGEtPmRldmljZV9pbmRleDsKKyAgICBtaWNfZW5naW5lc190b3RhbCA9IGRhdGEtPmRldmljZXNfdG90YWw7CisKKyAgICAvLyBpbml0aWFsaXplIHRyYWNlIGxldmVsCisgICAgY29uc29sZV9lbmFibGVkID0gZGF0YS0+Y29uc29sZV9sZXZlbDsKKyAgICBvZmZsb2FkX3JlcG9ydF9sZXZlbCA9IGRhdGEtPm9mZmxvYWRfcmVwb3J0X2xldmVsOworCisgICAgLy8gcmV0dXJuIGJhY2sgdGhlIHByb2Nlc3MgaWQKKyAgICAqKChwaWRfdCopIHJldHVybl9kYXRhKSA9IGdldHBpZCgpOworfQorCitDT0lOQVRJVkVMSUJFWFBPUlQKK3ZvaWQgc2VydmVyX3Zhcl90YWJsZV9zaXplKAorICAgIHVpbnQzMl90ICBidWZmZXJfY291bnQsCisgICAgdm9pZCoqICAgIGJ1ZmZlcnMsCisgICAgdWludDY0X3QqIGJ1ZmZlcnNfbGVuLAorICAgIHZvaWQqICAgICBtaXNjX2RhdGEsCisgICAgdWludDE2X3QgIG1pc2NfZGF0YV9sZW4sCisgICAgdm9pZCogICAgIHJldHVybl9kYXRhLAorICAgIHVpbnQxNl90ICByZXR1cm5fZGF0YV9sZW4KKykKK3sKKyAgICBzdHJ1Y3QgUGFyYW1zIHsKKyAgICAgICAgaW50NjRfdCBuZWxlbXM7CisgICAgICAgIGludDY0X3QgbGVuZ3RoOworICAgIH0gKnBhcmFtczsKKworICAgIHBhcmFtcyA9IHN0YXRpY19jYXN0PFBhcmFtcyo+KHJldHVybl9kYXRhKTsKKyAgICBwYXJhbXMtPmxlbmd0aCA9IF9fb2ZmbG9hZF92YXJzLnRhYmxlX3NpemUocGFyYW1zLT5uZWxlbXMpOworfQorCitDT0lOQVRJVkVMSUJFWFBPUlQKK3ZvaWQgc2VydmVyX3Zhcl90YWJsZV9jb3B5KAorICAgIHVpbnQzMl90ICBidWZmZXJfY291bnQsCisgICAgdm9pZCoqICAgIGJ1ZmZlcnMsCisgICAgdWludDY0X3QqIGJ1ZmZlcnNfbGVuLAorICAgIHZvaWQqICAgICBtaXNjX2RhdGEsCisgICAgdWludDE2X3QgIG1pc2NfZGF0YV9sZW4sCisgICAgdm9pZCogICAgIHJldHVybl9kYXRhLAorICAgIHVpbnQxNl90ICByZXR1cm5fZGF0YV9sZW4KKykKK3sKKyAgICBfX29mZmxvYWRfdmFycy50YWJsZV9jb3B5KGJ1ZmZlcnNbMF0sICpzdGF0aWNfY2FzdDxpbnQ2NF90Kj4obWlzY19kYXRhKSk7Cit9CisKKyNpZmRlZiBNWU9fU1VQUE9SVAorLy8gdGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIGJsb2NraW5nIGJlaGF2aW9yIG9mIG15b2lMaWJJbml0L0ZpbmkgY2FsbHMKK0NPSU5BVElWRUxJQkVYUE9SVAordm9pZCBzZXJ2ZXJfbXlvaW5pdCgKKyAgICB1aW50MzJfdCAgYnVmZmVyX2NvdW50LAorICAgIHZvaWQqKiAgICBidWZmZXJzLAorICAgIHVpbnQ2NF90KiBidWZmZXJzX2xlbiwKKyAgICB2b2lkKiAgICAgbWlzY19kYXRhLAorICAgIHVpbnQxNl90ICBtaXNjX2RhdGFfbGVuLAorICAgIHZvaWQqICAgICByZXR1cm5fZGF0YSwKKyAgICB1aW50MTZfdCAgcmV0dXJuX2RhdGFfbGVuCispCit7CisgICAgX19vZmZsb2FkX215b0xpYkluaXQoKTsKK30KKworQ09JTkFUSVZFTElCRVhQT1JUCit2b2lkIHNlcnZlcl9teW9maW5pKAorICAgIHVpbnQzMl90ICBidWZmZXJfY291bnQsCisgICAgdm9pZCoqICAgIGJ1ZmZlcnMsCisgICAgdWludDY0X3QqIGJ1ZmZlcnNfbGVuLAorICAgIHZvaWQqICAgICBtaXNjX2RhdGEsCisgICAgdWludDE2X3QgIG1pc2NfZGF0YV9sZW4sCisgICAgdm9pZCogICAgIHJldHVybl9kYXRhLAorICAgIHVpbnQxNl90ICByZXR1cm5fZGF0YV9sZW4KKykKK3sKKyAgICBfX29mZmxvYWRfbXlvTGliRmluaSgpOworfQorI2VuZGlmIC8vIE1ZT19TVVBQT1JUCmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9jb2kvY29pX3NlcnZlci5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvY29pL2NvaV9zZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzQ0ZDllCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvY29pL2NvaV9zZXJ2ZXIuaApAQCAtMCwwICsxLDc0IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8vVGhlIGludGVyZmFjZSBiZXR3ZWVuIG9mZmxvYWQgbGlicmFyeSBhbmQgdGhlIENPSSBBUEkgb24gdGhlIHRhcmdldC4KKworI2lmbmRlZiBDT0lfU0VSVkVSX0hfSU5DTFVERUQKKyNkZWZpbmUgQ09JX1NFUlZFUl9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxjb21tb24vQ09JRW5naW5lX2NvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1vbi9DT0lQZXJmX2NvbW1vbi5oPgorI2luY2x1ZGUgPHNpbmsvQ09JUHJvY2Vzc19zaW5rLmg+CisjaW5jbHVkZSA8c2luay9DT0lQaXBlbGluZV9zaW5rLmg+CisjaW5jbHVkZSA8c2luay9DT0lCdWZmZXJfc2luay5oPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICIuLi9saWJvZmZsb2FkX2Vycm9yX2NvZGVzLmgiCisKKy8vIHdyYXBwZXJzIGZvciBDT0kgQVBJCisjZGVmaW5lIFBpcGVsaW5lU3RhcnRFeGVjdXRpbmdSdW5GdW5jdGlvbnMoKSBcCisgICAgeyBcCisgICAgICAgIENPSVJFU1VMVCByZXMgPSBDT0lQaXBlbGluZVN0YXJ0RXhlY3V0aW5nUnVuRnVuY3Rpb25zKCk7IFwKKyAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeyBcCisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcGlwZWxpbmVfc3RhcnRfcnVuX2Z1bmNzLCBtaWNfaW5kZXgsIHJlcyk7IFwKKyAgICAgICAgICAgIGV4aXQoMSk7IFwKKyAgICAgICAgfSBcCisgICAgfQorCisjZGVmaW5lIFByb2Nlc3NXYWl0Rm9yU2h1dGRvd24oKSBcCisgICAgeyBcCisgICAgICAgIENPSVJFU1VMVCByZXMgPSBDT0lQcm9jZXNzV2FpdEZvclNodXRkb3duKCk7IFwKKyAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeyBcCisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcHJvY2Vzc193YWl0X3NodXRkb3duLCBtaWNfaW5kZXgsIHJlcyk7IFwKKyAgICAgICAgICAgIGV4aXQoMSk7IFwKKyAgICAgICAgfSBcCisgICAgfQorCisjZGVmaW5lIEJ1ZmZlckFkZFJlZihidWYpIFwKKyAgICB7IFwKKyAgICAgICAgQ09JUkVTVUxUIHJlcyA9IENPSUJ1ZmZlckFkZFJlZihidWYpOyBcCisgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsgXAorICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2J1Zl9hZGRfcmVmLCBtaWNfaW5kZXgsIHJlcyk7IFwKKyAgICAgICAgICAgIGV4aXQoMSk7IFwKKyAgICAgICAgfSBcCisgICAgfQorCisjZGVmaW5lIEJ1ZmZlclJlbGVhc2VSZWYoYnVmKSBcCisgICAgeyBcCisgICAgICAgIENPSVJFU1VMVCByZXMgPSBDT0lCdWZmZXJSZWxlYXNlUmVmKGJ1Zik7IFwKKyAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeyBcCisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfYnVmX3JlbGVhc2VfcmVmLCBtaWNfaW5kZXgsIHJlcyk7IFwKKyAgICAgICAgICAgIGV4aXQoMSk7IFwKKyAgICAgICAgfSBcCisgICAgfQorCisjZGVmaW5lIEVuZ2luZUdldEluZGV4KGluZGV4KSBcCisgICAgeyBcCisgICAgICAgIENPSV9JU0FfVFlQRSBpc2FfdHlwZTsgXAorICAgICAgICBDT0lSRVNVTFQgcmVzID0gQ09JRW5naW5lR2V0SW5kZXgoJmlzYV90eXBlLCBpbmRleCk7IFwKKyAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeyBcCisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfZ2V0X2VuZ2luZV9pbmRleCwgbWljX2luZGV4LCByZXMpOyBcCisgICAgICAgICAgICBleGl0KDEpOyBcCisgICAgICAgIH0gXAorICAgIH0KKworI2VuZGlmIC8vIENPSV9TRVJWRVJfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvY29tcGlsZXJfaWZfaG9zdC5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9jb21waWxlcl9pZl9ob3N0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmM0MzBiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvY29tcGlsZXJfaWZfaG9zdC5jcHAKQEAgLTAsMCArMSwzMjMgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImNvbXBpbGVyX2lmX2hvc3QuaCIKKworI2luY2x1ZGUgPG1hbGxvYy5oPgorI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyNpbmNsdWRlIDxhbGxvY2EuaD4KKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworLy8gR2xvYmFsIGNvdW50ZXIgb24gaG9zdC4gCisvLyBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgaWYgUDJPUFRfb2ZmbG9hZF9kb19kYXRhX3BlcnNpc3RlbmNlID09IDIuCisvLyBUaGUgdmFyaWFibGUgdXNlZCB0byBpZGVudGlmeSBvZmZsb2FkIGNvbnN0cnVjdHMgY29udGFpbmVkIGluIG9uZSBwcm9jZWR1cmUuCisvLyBJbmNyZW1lbnQgb2YgT0ZGTE9BRF9DQUxMX0NPVU5UIGlzIGluc2VydGVkIGF0IGVudHJpZXMgb2YgSE9TVCByb3V0aW5lcyB3aXRoCisvLyBvZmZsb2FkIGNvbnN0cnVjdHMuCitzdGF0aWMgaW50IG9mZmxvYWRfY2FsbF9jb3VudCA9IDA7CisKK2V4dGVybiAiQyIgT0ZGTE9BRCBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKAorICAgIFRBUkdFVF9UWVBFICAgICAgdGFyZ2V0X3R5cGUsCisgICAgaW50ICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLAorICAgIGludCAgICAgICAgICAgICAgaXNfb3B0aW9uYWwsCisgICAgX09mZmxvYWRfc3RhdHVzKiBzdGF0dXMsCisgICAgY29uc3QgY2hhciogICAgICBmaWxlLAorICAgIHVpbnQ2NF90ICAgICAgICAgbGluZQorKQoreworICAgIGJvb2wgcmV0dmFsOworICAgIE9GRkxPQUQgb2ZsZDsKKworICAgIC8vIGluaXRpYWxpemUgc3RhdHVzCisgICAgaWYgKHN0YXR1cyAhPSAwKSB7CisgICAgICAgIHN0YXR1cy0+cmVzdWx0ID0gT0ZGTE9BRF9VTkFWQUlMQUJMRTsKKyAgICAgICAgc3RhdHVzLT5kZXZpY2VfbnVtYmVyID0gLTE7CisgICAgICAgIHN0YXR1cy0+ZGF0YV9zZW50ID0gMDsKKyAgICAgICAgc3RhdHVzLT5kYXRhX3JlY2VpdmVkID0gMDsKKyAgICB9CisKKyAgICAvLyBtYWtlIHN1cmUgbGlicmF5IGlzIGluaXRpYWxpemVkCisgICAgcmV0dmFsID0gX19vZmZsb2FkX2luaXRfbGlicmFyeSgpOworCisgICAgLy8gT0ZGTE9BRF9USU1FUl9JTklUIG11c3QgZm9sbG93IGNhbGwgdG8gX19vZmZsb2FkX2luaXRfbGlicmFyeQorICAgIE9mZmxvYWRIb3N0VGltZXJEYXRhICogdGltZXJfZGF0YSA9IE9GRkxPQURfVElNRVJfSU5JVChmaWxlLCBsaW5lKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RBUlQodGltZXJfZGF0YSwgY19vZmZsb2FkX2hvc3RfdG90YWxfb2ZmbG9hZCk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X2luaXRpYWxpemUpOworCisgICAgLy8gaW5pdGlhbGl6ZSBhbGwgZGV2aWNlcyBpcyBpbml0X3R5cGUgaXMgb25fb2ZmbG9hZF9hbGwKKyAgICBpZiAocmV0dmFsICYmIF9fb2ZmbG9hZF9pbml0X3R5cGUgPT0gY19pbml0X29uX29mZmxvYWRfYWxsKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWljX2VuZ2luZXNfdG90YWw7IGkrKykgeworICAgICAgICAgICAgIG1pY19lbmdpbmVzW2ldLmluaXQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBPRkZMT0FEX1RJTUVSX1NUT1AodGltZXJfZGF0YSwgY19vZmZsb2FkX2hvc3RfaW5pdGlhbGl6ZSk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X3RhcmdldF9hY3F1aXJlKTsKKworICAgIGlmICh0YXJnZXRfdHlwZSA9PSBUQVJHRVRfSE9TVCkgeworICAgICAgICAvLyBIb3N0IGFsd2F5cyBhdmFpbGFibGUKKyAgICAgICAgcmV0dmFsID0gdHJ1ZTsKKyAgICB9CisgICAgZWxzZSBpZiAodGFyZ2V0X3R5cGUgPT0gVEFSR0VUX01JQykgeworICAgICAgICBpZiAodGFyZ2V0X251bWJlciA+PSAtMSkgeworICAgICAgICAgICAgaWYgKHJldHZhbCkgeworICAgICAgICAgICAgICAgIGlmICh0YXJnZXRfbnVtYmVyID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXNlciBwcm92aWRlZCB0aGUgZGV2aWNlIG51bWJlcgorICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyID0gdGFyZ2V0X251bWJlciAlIG1pY19lbmdpbmVzX3RvdGFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGRldmljZSAwCisgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIgPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHJlc2VydmUgZGV2aWNlIGluIE9SU0wKKyAgICAgICAgICAgICAgICBpZiAoaXNfb3B0aW9uYWwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFPUlNMOjp0cnlfcmVzZXJ2ZSh0YXJnZXRfbnVtYmVyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciA9IC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoIU9SU0w6OnJlc2VydmUodGFyZ2V0X251bWJlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgZGV2aWNlCisgICAgICAgICAgICAgICAgaWYgKHRhcmdldF9udW1iZXIgPj0gMCAmJgorICAgICAgICAgICAgICAgICAgICBfX29mZmxvYWRfaW5pdF90eXBlID09IGNfaW5pdF9vbl9vZmZsb2FkKSB7CisgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVElNRVJfU1RBUlQodGltZXJfZGF0YSwgY19vZmZsb2FkX2hvc3RfaW5pdGlhbGl6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1pY19lbmdpbmVzW3RhcmdldF9udW1iZXJdLmluaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9USU1FUl9TVE9QKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X2luaXRpYWxpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGZhbGxiYWNrIHRvIENQVQorICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIgPSAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRhcmdldF9udW1iZXIgPCAwIHx8ICFyZXR2YWwpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWlzX29wdGlvbmFsICYmIHN0YXR1cyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19kZXZpY2VfaXNfbm90X2F2YWlsYWJsZSk7CisgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dmFsID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfaW52YWxpZF9kZXZpY2VfbnVtYmVyKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmV0dmFsKSB7CisgICAgICAgIG9mbGQgPSBuZXcgT2ZmbG9hZERlc2NyaXB0b3IodGFyZ2V0X251bWJlciwgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc19vcHRpb25hbCwgZmFsc2UsIHRpbWVyX2RhdGEpOworICAgICAgICBPRkZMT0FEX1RJTUVSX0hPU1RfTUlDX05VTSh0aW1lcl9kYXRhLCB0YXJnZXRfbnVtYmVyKTsKKyAgICAgICAgT2ZmbG9hZF9SZXBvcnRfUHJvbG9nKHRpbWVyX2RhdGEpOworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoMiwgdGltZXJfZGF0YS0+b2ZmbG9hZF9udW1iZXIsIGNfb2ZmbG9hZF9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdGFydGluZyBvZmZsb2FkOiB0YXJnZXRfdHlwZSA9ICVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtYmVyID0gJWQsIGlzX29wdGlvbmFsID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgaXNfb3B0aW9uYWwpOworCisgICAgICAgIE9GRkxPQURfVElNRVJfU1RPUCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF90YXJnZXRfYWNxdWlyZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBvZmxkID0gTlVMTDsKKworICAgICAgICBPRkZMT0FEX1RJTUVSX1NUT1AodGltZXJfZGF0YSwgY19vZmZsb2FkX2hvc3RfdGFyZ2V0X2FjcXVpcmUpOworICAgICAgICBPRkZMT0FEX1RJTUVSX1NUT1AodGltZXJfZGF0YSwgY19vZmZsb2FkX2hvc3RfdG90YWxfb2ZmbG9hZCk7CisgICAgICAgIG9mZmxvYWRfcmVwb3J0X2ZyZWVfZGF0YSh0aW1lcl9kYXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gb2ZsZDsKK30KKworZXh0ZXJuICJDIiBPRkZMT0FEIE9GRkxPQURfVEFSR0VUX0FDUVVJUkUxKAorICAgIGNvbnN0IGludCogIGRldmljZV9udW0sCisgICAgY29uc3QgY2hhciogZmlsZSwKKyAgICB1aW50NjRfdCAgICBsaW5lCispCit7CisgICAgaW50IHRhcmdldF9udW1iZXI7CisKKyAgICAvLyBtYWtlIHN1cmUgbGlicmF5IGlzIGluaXRpYWxpemVkIGFuZCBhdCBsZWFzdCBvbmUgZGV2aWNlIGlzIGF2YWlsYWJsZQorICAgIGlmICghX19vZmZsb2FkX2luaXRfbGlicmFyeSgpKSB7CisgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19kZXZpY2VfaXNfbm90X2F2YWlsYWJsZSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgLy8gT0ZGTE9BRF9USU1FUl9JTklUIG11c3QgZm9sbG93IGNhbGwgdG8gX19vZmZsb2FkX2luaXRfbGlicmFyeQorCisgICAgT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiB0aW1lcl9kYXRhID0gT0ZGTE9BRF9USU1FUl9JTklUKGZpbGUsIGxpbmUpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVEFSVCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF90b3RhbF9vZmZsb2FkKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RBUlQodGltZXJfZGF0YSwgY19vZmZsb2FkX2hvc3RfaW5pdGlhbGl6ZSk7CisKKyAgICBpZiAoX19vZmZsb2FkX2luaXRfdHlwZSA9PSBjX2luaXRfb25fb2ZmbG9hZF9hbGwpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaWNfZW5naW5lc190b3RhbDsgaSsrKSB7CisgICAgICAgICAgICAgbWljX2VuZ2luZXNbaV0uaW5pdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgT0ZGTE9BRF9USU1FUl9TVE9QKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X2luaXRpYWxpemUpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVEFSVCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF90YXJnZXRfYWNxdWlyZSk7CisKKyAgICAvLyB1c2UgZGVmYXVsdCBkZXZpY2UgbnVtYmVyIGlmIGl0IGlzIG5vdCBwcm92aWRlZAorICAgIGlmIChkZXZpY2VfbnVtICE9IDApIHsKKyAgICAgICAgdGFyZ2V0X251bWJlciA9ICpkZXZpY2VfbnVtOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgdGFyZ2V0X251bWJlciA9IF9fb21wX2RldmljZV9udW07CisgICAgfQorCisgICAgLy8gZGV2aWNlIG51bWJlciBzaG91bGQgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciB2YWx1ZQorICAgIGlmICh0YXJnZXRfbnVtYmVyIDwgMCkgeworICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfb21wX2ludmFsaWRfZGV2aWNlX251bSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgLy8gc2hvdWxkIHdlIGRvIHRoaXMgZm9yIE9wZW5NUD8KKyAgICB0YXJnZXRfbnVtYmVyICU9IG1pY19lbmdpbmVzX3RvdGFsOworCisgICAgLy8gcmVzZXJ2ZSBkZXZpY2UgaW4gT1JTTAorICAgIGlmICghT1JTTDo6cmVzZXJ2ZSh0YXJnZXRfbnVtYmVyKSkgeworICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfZGV2aWNlX2lzX25vdF9hdmFpbGFibGUpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIC8vIGluaXRpYWxpemUgZGV2aWNlKHMpCisgICAgT0ZGTE9BRF9USU1FUl9TVEFSVCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF9pbml0aWFsaXplKTsKKworICAgIGlmIChfX29mZmxvYWRfaW5pdF90eXBlID09IGNfaW5pdF9vbl9vZmZsb2FkKSB7CisgICAgICAgIG1pY19lbmdpbmVzW3RhcmdldF9udW1iZXJdLmluaXQoKTsKKyAgICB9CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUT1AodGltZXJfZGF0YSwgY19vZmZsb2FkX2hvc3RfaW5pdGlhbGl6ZSk7CisKKyAgICBPRkZMT0FEIG9mbGQgPQorICAgICAgICBuZXcgT2ZmbG9hZERlc2NyaXB0b3IodGFyZ2V0X251bWJlciwgMCwgdHJ1ZSwgdHJ1ZSwgdGltZXJfZGF0YSk7CisKKyAgICBPRkZMT0FEX1RJTUVSX0hPU1RfTUlDX05VTSh0aW1lcl9kYXRhLCB0YXJnZXRfbnVtYmVyKTsKKworICAgIE9mZmxvYWRfUmVwb3J0X1Byb2xvZyh0aW1lcl9kYXRhKTsKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSgyLCB0aW1lcl9kYXRhLT5vZmZsb2FkX251bWJlciwgY19vZmZsb2FkX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RhcnRpbmcgT3Blbk1QIG9mZmxvYWQsIGRldmljZSA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RPUCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF90YXJnZXRfYWNxdWlyZSk7CisKKyAgICByZXR1cm4gb2ZsZDsKK30KKworaW50IG9mZmxvYWRfb2ZmbG9hZF93cmFwKAorICAgIE9GRkxPQUQgb2ZsZCwKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIGludCBpc19lbXB0eSwKKyAgICBpbnQgbnVtX3ZhcnMsCisgICAgVmFyRGVzYyAqdmFycywKKyAgICBWYXJEZXNjMiAqdmFyczIsCisgICAgaW50IG51bV93YWl0cywKKyAgICBjb25zdCB2b2lkICoqd2FpdHMsCisgICAgY29uc3Qgdm9pZCAqKnNpZ25hbCwKKyAgICBpbnQgZW50cnlfaWQsCisgICAgY29uc3Qgdm9pZCAqc3RhY2tfYWRkcgorKQoreworICAgIGJvb2wgcmV0ID0gb2ZsZC0+b2ZmbG9hZChuYW1lLCBpc19lbXB0eSwgdmFycywgdmFyczIsIG51bV92YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0cywgbnVtX3dhaXRzLCBzaWduYWwsIGVudHJ5X2lkLCBzdGFja19hZGRyKTsKKyAgICBpZiAoIXJldCB8fCBzaWduYWwgPT0gMCkgeworICAgICAgICBkZWxldGUgb2ZsZDsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworZXh0ZXJuICJDIiBpbnQgT0ZGTE9BRF9PRkZMT0FEMSgKKyAgICBPRkZMT0FEIG9mbGQsCisgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICBpbnQgaXNfZW1wdHksCisgICAgaW50IG51bV92YXJzLAorICAgIFZhckRlc2MgKnZhcnMsCisgICAgVmFyRGVzYzIgKnZhcnMyLAorICAgIGludCBudW1fd2FpdHMsCisgICAgY29uc3Qgdm9pZCAqKndhaXRzLAorICAgIGNvbnN0IHZvaWQgKipzaWduYWwKKykKK3sKKyAgICByZXR1cm4gb2ZmbG9hZF9vZmZsb2FkX3dyYXAob2ZsZCwgbmFtZSwgaXNfZW1wdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3ZhcnMsIHZhcnMsIHZhcnMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV93YWl0cywgd2FpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsLCBOVUxMLCBOVUxMKTsKK30KKworZXh0ZXJuICJDIiBpbnQgT0ZGTE9BRF9PRkZMT0FEMigKKyAgICBPRkZMT0FEIG9mbGQsCisgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICBpbnQgaXNfZW1wdHksCisgICAgaW50IG51bV92YXJzLAorICAgIFZhckRlc2MgKnZhcnMsCisgICAgVmFyRGVzYzIgKnZhcnMyLAorICAgIGludCBudW1fd2FpdHMsCisgICAgY29uc3Qgdm9pZCoqIHdhaXRzLAorICAgIGNvbnN0IHZvaWQqKiBzaWduYWwsCisgICAgaW50IGVudHJ5X2lkLAorICAgIGNvbnN0IHZvaWQgKnN0YWNrX2FkZHIKKykKK3sKKyAgICByZXR1cm4gb2ZmbG9hZF9vZmZsb2FkX3dyYXAob2ZsZCwgbmFtZSwgaXNfZW1wdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3ZhcnMsIHZhcnMsIHZhcnMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV93YWl0cywgd2FpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsLCBlbnRyeV9pZCwgc3RhY2tfYWRkcik7Cit9CisKK2V4dGVybiAiQyIgaW50IE9GRkxPQURfT0ZGTE9BRCgKKyAgICBPRkZMT0FEIG9mbGQsCisgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICBpbnQgaXNfZW1wdHksCisgICAgaW50IG51bV92YXJzLAorICAgIFZhckRlc2MgKnZhcnMsCisgICAgVmFyRGVzYzIgKnZhcnMyLAorICAgIGludCBudW1fd2FpdHMsCisgICAgY29uc3Qgdm9pZCAqKndhaXRzLAorICAgIGNvbnN0IHZvaWQgKnNpZ25hbCwKKyAgICBpbnQgZW50cnlfaWQsCisgICAgY29uc3Qgdm9pZCAqc3RhY2tfYWRkcgorKQoreworICAgIC8vIHNpZ25hbCBpcyBwYXNzZWQgYnkgcmVmZXJlbmNlIG5vdworICAgIGNvbnN0IHZvaWQgKipzaWduYWxfbmV3ID0gKHNpZ25hbCAhPSAwKSA/ICZzaWduYWwgOiAwOworICAgIGNvbnN0IHZvaWQgKip3YWl0c19uZXcgPSAwOworICAgIGludCBudW1fd2FpdHNfbmV3ID0gMDsKKworICAgIC8vIHJlbW92ZSBOVUxMIHZhbHVlcyBmcm9tIHRoZSBsaXN0IG9mIHNpZ25hbHMgdG8gd2FpdCBmb3IKKyAgICBpZiAobnVtX3dhaXRzID4gMCkgeworICAgICAgICB3YWl0c19uZXcgPSAoY29uc3Qgdm9pZCoqKSBhbGxvY2Eoc2l6ZW9mKHZvaWQqKSAqIG51bV93YWl0cyk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX3dhaXRzOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh3YWl0c1tpXSAhPSAwKSB7CisgICAgICAgICAgICAgICAgd2FpdHNfbmV3W251bV93YWl0c19uZXcrK10gPSB3YWl0c1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPRkZMT0FEX09GRkxPQUQxKG9mbGQsIG5hbWUsIGlzX2VtcHR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV92YXJzLCB2YXJzLCB2YXJzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fd2FpdHNfbmV3LCB3YWl0c19uZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsX25ldyk7Cit9CisKK2V4dGVybiAiQyIgaW50IE9GRkxPQURfQ0FMTF9DT1VOVCgpCit7CisgICAgb2ZmbG9hZF9jYWxsX2NvdW50Kys7CisgICAgcmV0dXJuIG9mZmxvYWRfY2FsbF9jb3VudDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL2NvbXBpbGVyX2lmX2hvc3QuaCBiL2ZpbmFsL29mZmxvYWQvc3JjL2NvbXBpbGVyX2lmX2hvc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjM0YzUxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvY29tcGlsZXJfaWZfaG9zdC5oCkBAIC0wLDAgKzEsMTMzIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8qISBcZmlsZQorICAgIFxicmllZiBUaGUgaW50ZXJmYWNlIGJldHdlZW4gY29tcGlsZXItZ2VuZXJhdGVkIGhvc3QgY29kZSBhbmQgcnVudGltZSBsaWJyYXJ5CisqLworCisjaWZuZGVmIENPTVBJTEVSX0lGX0hPU1RfSF9JTkNMVURFRAorI2RlZmluZSBDT01QSUxFUl9JRl9IT1NUX0hfSU5DTFVERUQKKworI2luY2x1ZGUgIm9mZmxvYWRfaG9zdC5oIgorCisjZGVmaW5lIE9GRkxPQURfVEFSR0VUX0FDUVVJUkUgICAgICAgICAgT0ZGTE9BRF9QUkVGSVgodGFyZ2V0X2FjcXVpcmUpCisjZGVmaW5lIE9GRkxPQURfVEFSR0VUX0FDUVVJUkUxICAgICAgICAgT0ZGTE9BRF9QUkVGSVgodGFyZ2V0X2FjcXVpcmUxKQorI2RlZmluZSBPRkZMT0FEX09GRkxPQUQgICAgICAgICAgICAgICAgIE9GRkxPQURfUFJFRklYKG9mZmxvYWQpCisjZGVmaW5lIE9GRkxPQURfT0ZGTE9BRDEgICAgICAgICAgICAgICAgT0ZGTE9BRF9QUkVGSVgob2ZmbG9hZDEpCisjZGVmaW5lIE9GRkxPQURfT0ZGTE9BRDIgICAgICAgICAgICAgICAgT0ZGTE9BRF9QUkVGSVgob2ZmbG9hZDIpCisjZGVmaW5lIE9GRkxPQURfQ0FMTF9DT1VOVCAgICAgICAgICAgICAgT0ZGTE9BRF9QUkVGSVgob2ZmbG9hZF9jYWxsX2NvdW50KQorCisKKy8qISBcZm4gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRQorICAgIFxicmllZiBBdHRlbXB0IHRvIGFjcXVpcmUgdGhlIHRhcmdldC4KKyAgICBccGFyYW0gdGFyZ2V0X3R5cGUgICBUaGUgdHlwZSBvZiB0YXJnZXQuCisgICAgXHBhcmFtIHRhcmdldF9udW1iZXIgVGhlIGRldmljZSBudW1iZXIuCisgICAgXHBhcmFtIGlzX29wdGlvbmFsICAgV2hldGhlciBDUFUgZmFsbC1iYWNrIGlzIGFsbG93ZWQuCisgICAgXHBhcmFtIHN0YXR1cyAgICAgICAgQWRkcmVzcyBvZiB2YXJpYWJsZSB0byBob2xkIG9mZmxvYWQgc3RhdHVzLgorICAgIFxwYXJhbSBmaWxlICAgICAgICAgIEZpbGVuYW1lIGluIHdoaWNoIHRoaXMgb2ZmbG9hZCBvY2N1cnJlZC4KKyAgICBccGFyYW0gbGluZSAgICAgICAgICBMaW5lIG51bWJlciBpbiB0aGUgZmlsZSB3aGVyZSB0aGlzIG9mZmxvYWQgb2NjdXJyZWQuCisqLworZXh0ZXJuICJDIiBPRkZMT0FEIE9GRkxPQURfVEFSR0VUX0FDUVVJUkUoCisgICAgVEFSR0VUX1RZUEUgICAgICB0YXJnZXRfdHlwZSwKKyAgICBpbnQgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsCisgICAgaW50ICAgICAgICAgICAgICBpc19vcHRpb25hbCwKKyAgICBfT2ZmbG9hZF9zdGF0dXMqIHN0YXR1cywKKyAgICBjb25zdCBjaGFyKiAgICAgIGZpbGUsCisgICAgdWludDY0X3QgICAgICAgICBsaW5lCispOworCisvKiEgXGZuIE9GRkxPQURfVEFSR0VUX0FDUVVJUkUxCisgICAgXGJyaWVmIEFjcXVpcmUgdGhlIHRhcmdldCBmb3Igb2ZmbG9hZCAoT3Blbk1QKS4KKyAgICBccGFyYW0gZGV2aWNlX251bWJlciBEZXZpY2UgbnVtYmVyIG9yIG51bGwgaWYgbm90IHNwZWNpZmllZC4KKyAgICBccGFyYW0gZmlsZSAgICAgICAgICBGaWxlbmFtZSBpbiB3aGljaCB0aGlzIG9mZmxvYWQgb2NjdXJyZWQKKyAgICBccGFyYW0gbGluZSAgICAgICAgICBMaW5lIG51bWJlciBpbiB0aGUgZmlsZSB3aGVyZSB0aGlzIG9mZmxvYWQgb2NjdXJyZWQuCisqLworZXh0ZXJuICJDIiBPRkZMT0FEIE9GRkxPQURfVEFSR0VUX0FDUVVJUkUxKAorICAgIGNvbnN0IGludCogICAgICBkZXZpY2VfbnVtYmVyLAorICAgIGNvbnN0IGNoYXIqICAgICBmaWxlLAorICAgIHVpbnQ2NF90ICAgICAgICBsaW5lCispOworCisvKiEgXGZuIE9GRkxPQURfT0ZGTE9BRDEKKyAgICBcYnJpZWYgUnVuIGZ1bmN0aW9uIG9uIHRhcmdldCB1c2luZyBpbnRlcmZhY2UgZm9yIG9sZCBkYXRhIHBlcnNpc3RlbmNlLgorICAgIFxwYXJhbSBvIE9mZmxvYWQgZGVzY3JpcHRvciBjcmVhdGVkIGJ5IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUuCisgICAgXHBhcmFtIG5hbWUgTmFtZSBvZiBvZmZsb2FkIGVudHJ5IHBvaW50LgorICAgIFxwYXJhbSBpc19lbXB0eSBJZiBubyBjb2RlIHRvIGV4ZWN1dGUgKGUuZy4gb2ZmbG9hZF90cmFuc2ZlcikKKyAgICBccGFyYW0gbnVtX3ZhcnMgTnVtYmVyIG9mIHZhcmlhYmxlIGRlc2NyaXB0b3JzLgorICAgIFxwYXJhbSB2YXJzIFBvaW50ZXIgdG8gVmFyRGVzYyBhcnJheS4KKyAgICBccGFyYW0gdmFyczIgUG9pbnRlciB0byBWYXJEZXNjMiBhcnJheS4KKyAgICBccGFyYW0gbnVtX3dhaXRzIE51bWJlciBvZiAid2FpdCIgdmFsdWVzLgorICAgIFxwYXJhbSB3YWl0cyBQb2ludGVyIHRvIGFycmF5IG9mIHdhaXQgdmFsdWVzLgorICAgIFxwYXJhbSBzaWduYWwgUG9pbnRlciB0byBzaWduYWwgdmFsdWUgb3IgTlVMTC4KKyovCitleHRlcm4gIkMiIGludCBPRkZMT0FEX09GRkxPQUQxKAorICAgIE9GRkxPQUQgbywKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIGludCBpc19lbXB0eSwKKyAgICBpbnQgbnVtX3ZhcnMsCisgICAgVmFyRGVzYyAqdmFycywKKyAgICBWYXJEZXNjMiAqdmFyczIsCisgICAgaW50IG51bV93YWl0cywKKyAgICBjb25zdCB2b2lkKiogd2FpdHMsCisgICAgY29uc3Qgdm9pZCoqIHNpZ25hbAorKTsKKworLyohIFxmbiBPRkZMT0FEX09GRkxPQUQyCisgICAgXGJyaWVmIFJ1biBmdW5jdGlvbiBvbiB0YXJnZXQgdXNpbmcgaW50ZXJmYWNlIGZvciBuZXcgZGF0YSBwZXJzaXN0ZW5jZS4KKyAgICBccGFyYW0gbyBPZmZsb2FkIGRlc2NyaXB0b3IgY3JlYXRlZCBieSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFLgorICAgIFxwYXJhbSBuYW1lIE5hbWUgb2Ygb2ZmbG9hZCBlbnRyeSBwb2ludC4KKyAgICBccGFyYW0gaXNfZW1wdHkgSWYgbm8gY29kZSB0byBleGVjdXRlIChlLmcuIG9mZmxvYWRfdHJhbnNmZXIpCisgICAgXHBhcmFtIG51bV92YXJzIE51bWJlciBvZiB2YXJpYWJsZSBkZXNjcmlwdG9ycy4KKyAgICBccGFyYW0gdmFycyBQb2ludGVyIHRvIFZhckRlc2MgYXJyYXkuCisgICAgXHBhcmFtIHZhcnMyIFBvaW50ZXIgdG8gVmFyRGVzYzIgYXJyYXkuCisgICAgXHBhcmFtIG51bV93YWl0cyBOdW1iZXIgb2YgIndhaXQiIHZhbHVlcy4KKyAgICBccGFyYW0gd2FpdHMgUG9pbnRlciB0byBhcnJheSBvZiB3YWl0IHZhbHVlcy4KKyAgICBccGFyYW0gc2lnbmFsIFBvaW50ZXIgdG8gc2lnbmFsIHZhbHVlIG9yIE5VTEwuCisgICAgXHBhcmFtIGVudHJ5X2lkIEEgc2lnbmF0dXJlIGZvciB0aGUgZnVuY3Rpb24gZG9pbmcgdGhlIG9mZmxvYWQuCisgICAgXHBhcmFtIHN0YWNrX2FkZHIgVGhlIHN0YWNrIGZyYW1lIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uIGRvaW5nIG9mZmxvYWQuCisqLworZXh0ZXJuICJDIiBpbnQgT0ZGTE9BRF9PRkZMT0FEMigKKyAgICBPRkZMT0FEIG8sCisgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICBpbnQgaXNfZW1wdHksCisgICAgaW50IG51bV92YXJzLAorICAgIFZhckRlc2MgKnZhcnMsCisgICAgVmFyRGVzYzIgKnZhcnMyLAorICAgIGludCBudW1fd2FpdHMsCisgICAgY29uc3Qgdm9pZCoqIHdhaXRzLAorICAgIGNvbnN0IHZvaWQqKiBzaWduYWwsCisgICAgaW50IGVudHJ5X2lkLAorICAgIGNvbnN0IHZvaWQgKnN0YWNrX2FkZHIKKyk7CisKKy8vIFJ1biBmdW5jdGlvbiBvbiB0YXJnZXQgKG9ic29sZXRlKS4KKy8vIEBwYXJhbSBvICAgIE9GRkxPQUQgb2JqZWN0CisvLyBAcGFyYW0gbmFtZSBmdW5jdGlvbiBuYW1lCitleHRlcm4gIkMiIGludCBPRkZMT0FEX09GRkxPQUQoCisgICAgT0ZGTE9BRCBvLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgaW50IGlzX2VtcHR5LAorICAgIGludCBudW1fdmFycywKKyAgICBWYXJEZXNjICp2YXJzLAorICAgIFZhckRlc2MyICp2YXJzMiwKKyAgICBpbnQgbnVtX3dhaXRzLAorICAgIGNvbnN0IHZvaWQqKiB3YWl0cywKKyAgICBjb25zdCB2b2lkKiBzaWduYWwsCisgICAgaW50IGVudHJ5X2lkID0gMCwKKyAgICBjb25zdCB2b2lkICpzdGFja19hZGRyID0gTlVMTAorKTsKKworLy8gR2xvYmFsIGNvdW50ZXIgb24gaG9zdC4KKy8vIFRoaXMgdmFyaWFibGUgaXMgdXNlZCBpZiBQMk9QVF9vZmZsb2FkX2RvX2RhdGFfcGVyc2lzdGVuY2UgPT0gMi4KKy8vIFRoZSB2YXJpYWJsZSB1c2VkIHRvIGlkZW50aWZ5IG9mZmxvYWQgY29uc3RydWN0cyBjb250YWluZWQgaW4gb25lIHByb2NlZHVyZS4KKy8vIENhbGwgdG8gT0ZGTE9BRF9DQUxMX0NPVU5UKCkgaXMgaW5zZXJ0ZWQgYXQgSE9TVCBvbiBlbnRyeSBvZiB0aGUgcm91dGluZS4KK2V4dGVybiAiQyIgaW50ICBPRkZMT0FEX0NBTExfQ09VTlQoKTsKKworI2VuZGlmIC8vIENPTVBJTEVSX0lGX0hPU1RfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvY29tcGlsZXJfaWZfdGFyZ2V0LmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL2NvbXBpbGVyX2lmX3RhcmdldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFmODJiOAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL2NvbXBpbGVyX2lmX3RhcmdldC5jcHAKQEAgLTAsMCArMSw0NCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAiY29tcGlsZXJfaWZfdGFyZ2V0LmgiCisKK2V4dGVybiAiQyIgdm9pZCBPRkZMT0FEX1RBUkdFVF9FTlRFUigKKyAgICBPRkZMT0FEIG9mbGQsCisgICAgaW50IHZhcnNfdG90YWwsCisgICAgVmFyRGVzYyAqdmFycywKKyAgICBWYXJEZXNjMiAqdmFyczIKKykKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcyglcCwgJWQsICVwLCAlcClcbiIsIF9fZnVuY19fLCBvZmxkLAorICAgICAgICAgICAgICAgICAgICAgICAgdmFyc190b3RhbCwgdmFycywgdmFyczIpOworICAgIG9mbGQtPm1lcmdlX3Zhcl9kZXNjcyh2YXJzLCB2YXJzMiwgdmFyc190b3RhbCk7CisgICAgb2ZsZC0+c2NhdHRlcl9jb3B5aW5fZGF0YSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgT0ZGTE9BRF9UQVJHRVRfTEVBVkUoCisgICAgT0ZGTE9BRCBvZmxkCispCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgb2ZsZCk7CisgICAgb2ZsZC0+Z2F0aGVyX2NvcHlvdXRfZGF0YSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgT0ZGTE9BRF9UQVJHRVRfTUFJTih2b2lkKQoreworICAgIC8vIGluaXRpYWxpemUgdGFyZ2V0IHBhcnQKKyAgICBfX29mZmxvYWRfdGFyZ2V0X2luaXQoKTsKKworICAgIC8vIHBhc3MgY29udHJvbCB0byBDT0kKKyAgICBQaXBlbGluZVN0YXJ0RXhlY3V0aW5nUnVuRnVuY3Rpb25zKCk7CisgICAgUHJvY2Vzc1dhaXRGb3JTaHV0ZG93bigpOworCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRXhpdGluZyBtYWluLi4uXG4iKTsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL2NvbXBpbGVyX2lmX3RhcmdldC5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvY29tcGlsZXJfaWZfdGFyZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlkMmMxYwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL2NvbXBpbGVyX2lmX3RhcmdldC5oCkBAIC0wLDAgKzEsNTAgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLyohIFxmaWxlCisgICAgXGJyaWVmIFRoZSBpbnRlcmZhY2UgYmV0d2VlbiBjb21waWxlci1nZW5lcmF0ZWQgdGFyZ2V0IGNvZGUgYW5kIHJ1bnRpbWUgbGlicmFyeQorKi8KKworI2lmbmRlZiBDT01QSUxFUl9JRl9UQVJHRVRfSF9JTkNMVURFRAorI2RlZmluZSBDT01QSUxFUl9JRl9UQVJHRVRfSF9JTkNMVURFRAorCisjaW5jbHVkZSAib2ZmbG9hZF90YXJnZXQuaCIKKworI2RlZmluZSBPRkZMT0FEX1RBUkdFVF9FTlRFUiAgICAgICAgICAgIE9GRkxPQURfUFJFRklYKHRhcmdldF9lbnRlcikKKyNkZWZpbmUgT0ZGTE9BRF9UQVJHRVRfTEVBVkUgICAgICAgICAgICBPRkZMT0FEX1BSRUZJWCh0YXJnZXRfbGVhdmUpCisjZGVmaW5lIE9GRkxPQURfVEFSR0VUX01BSU4gICAgICAgICAgICAgT0ZGTE9BRF9QUkVGSVgodGFyZ2V0X21haW4pCisKKy8qISBcZm4gT0ZGTE9BRF9UQVJHRVRfRU5URVIKKyAgICBcYnJpZWYgRmlsbCBpbiB2YXJpYWJsZSBhZGRyZXNzZXMgdXNpbmcgVmFyRGVzYyBhcnJheS4KKyAgICBcYnJpZWYgVGhlbiBjYWxsIGJhY2sgdGhlIHJ1bnRpbWUgbGlicmFyeSB0byBmZXRjaCBkYXRhLgorICAgIFxwYXJhbSBvZmxkICAgICAgICAgT2ZmbG9hZCBkZXNjcmlwdG9yIGNyZWF0ZWQgYnkgcnVudGltZS4KKyAgICBccGFyYW0gdmFyX2Rlc2NfbnVtIE51bWJlciBvZiB2YXJpYWJsZSBkZXNjcmlwdG9ycy4KKyAgICBccGFyYW0gdmFyX2Rlc2MgICAgIFBvaW50ZXIgdG8gVmFyRGVzYyBhcnJheS4KKyAgICBccGFyYW0gdmFyX2Rlc2MyICAgIFBvaW50ZXIgdG8gVmFyRGVzYzIgYXJyYXkuCisqLworZXh0ZXJuICJDIiB2b2lkIE9GRkxPQURfVEFSR0VUX0VOVEVSKAorICAgIE9GRkxPQUQgb2ZsZCwKKyAgICBpbnQgdmFyX2Rlc2NfbnVtLAorICAgIFZhckRlc2MgKnZhcl9kZXNjLAorICAgIFZhckRlc2MyICp2YXJfZGVzYzIKKyk7CisKKy8qISBcZm4gT0ZGTE9BRF9UQVJHRVRfTEVBVkUKKyAgICBcYnJpZWYgQ2FsbCBiYWNrIHRoZSBydW50aW1lIGxpYnJhcnkgdG8gZ2F0aGVyIG91dHB1dHMgdXNpbmcgVmFyRGVzYyBhcnJheS4KKyAgICBccGFyYW0gb2ZsZCBPZmZsb2FkIGRlc2NyaXB0b3IgY3JlYXRlZCBieSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFLgorKi8KK2V4dGVybiAiQyIgdm9pZCBPRkZMT0FEX1RBUkdFVF9MRUFWRSgKKyAgICBPRkZMT0FEIG9mbGQKKyk7CisKKy8vIEVudHJ5IHBvaW50IGZvciB0aGUgdGFyZ2V0IGFwcGxpY2F0aW9uLgorZXh0ZXJuICJDIiB2b2lkIE9GRkxPQURfVEFSR0VUX01BSU4odm9pZCk7CisKKyNlbmRpZiAvLyBDT01QSUxFUl9JRl9UQVJHRVRfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvZHZfdXRpbC5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9kdl91dGlsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWQ3MjcxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvZHZfdXRpbC5jcHAKQEAgLTAsMCArMSwxMzEgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgIm9mZmxvYWRfY29tbW9uLmgiCisKK2Jvb2wgX19kdl9pc19jb250aWd1b3VzKGNvbnN0IEFyckRlc2MgKmR2cCkKK3sKKyAgICBpZiAoZHZwLT5GbGFncyAmIEFyckRlc2NGbGFnc0NvbnRpZ3VvdXMpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKGR2cC0+UmFuayAhPSAwKSB7CisgICAgICAgIGlmIChkdnAtPkRpbVswXS5NdWx0ICE9IGR2cC0+TGVuKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBkdnAtPlJhbms7IGkrKykgeworICAgICAgICAgICAgaWYgKGR2cC0+RGltW2ldLk11bHQgIT0KKyAgICAgICAgICAgICAgICBkdnAtPkRpbVtpLTFdLkV4dGVudCAqIGR2cC0+RGltW2ktMV0uTXVsdCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBfX2R2X2lzX2FsbG9jYXRlZChjb25zdCBBcnJEZXNjICpkdnApCit7CisgICAgcmV0dXJuIChkdnAtPkZsYWdzICYgQXJyRGVzY0ZsYWdzRGVmaW5lZCk7Cit9CisKK3VpbnQ2NF90IF9fZHZfZGF0YV9sZW5ndGgoY29uc3QgQXJyRGVzYyAqZHZwKQoreworICAgIHVpbnQ2NF90IHNpemU7CisKKyAgICBpZiAoZHZwLT5SYW5rID09IDApIHsKKyAgICAgICAgc2l6ZSA9IGR2cC0+TGVuOworICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9CisKKyAgICBzaXplID0gZHZwLT5MZW47CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkdnAtPlJhbms7ICsraSkgeworICAgICAgICBzaXplICs9IChkdnAtPkRpbVtpXS5FeHRlbnQtMSkgKiBkdnAtPkRpbVtpXS5NdWx0OworICAgIH0KKyAgICByZXR1cm4gc2l6ZTsKK30KKwordWludDY0X3QgX19kdl9kYXRhX2xlbmd0aChjb25zdCBBcnJEZXNjICpkdnAsIGludDY0X3QgY291bnQpCit7CisgICAgaWYgKGR2cC0+UmFuayA9PSAwKSB7CisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQgKiBkdnAtPkRpbVswXS5NdWx0OworfQorCisvLyBDcmVhdGUgQ2VhblJlYWRSYW5nZXMgZGF0YSBmb3IgcmVhZGluZyBjb250aWd1b3VzIHJhbmdlcyBvZgorLy8gbm9uY29udGlndW91cyBhcnJheSBkZWZpbmVkIGJ5IHRoZSBhcmd1bWVudAorQ2VhblJlYWRSYW5nZXMgKiBpbml0X3JlYWRfcmFuZ2VzX2R2KGNvbnN0IEFyckRlc2MgKmR2cCkKK3sKKyAgICBpbnQ2NF90ICAgICAgICAgbGVuOworICAgIGludCAgICAgICAgICAgICBjb3VudDsKKyAgICBpbnQgICAgICAgICAgICAgcmFuayA9IGR2cC0+UmFuazsKKyAgICBDZWFuUmVhZFJhbmdlcyAqcmVzID0gTlVMTDsKKworICAgIGlmIChyYW5rICE9IDApIHsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBsZW4gPSBkdnAtPkxlbjsKKyAgICAgICAgaWYgKGR2cC0+RGltWzBdLk11bHQgPT0gbGVuKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcmFuazsgaSsrKSB7CisgICAgICAgICAgICAgICAgbGVuICo9IGR2cC0+RGltW2ktMV0uRXh0ZW50OworICAgICAgICAgICAgICAgIGlmIChkdnAtPkRpbVtpXS5NdWx0ICE9IGxlbikgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmVzID0gKENlYW5SZWFkUmFuZ2VzICopbWFsbG9jKAorICAgICAgICAgICAgc2l6ZW9mKENlYW5SZWFkUmFuZ2VzKSArIChyYW5rIC0gaSkgKiBzaXplb2YoQ2VhblJlYWREaW0pKTsKKyAgICAgICAgcmVzIC0+IGxhc3Rfbm9uY29udF9pbmQgPSByYW5rIC0gaSAtIDE7CisgICAgICAgIGNvdW50ID0gMTsKKyAgICAgICAgZm9yICg7IGkgPCByYW5rOyBpKyspIHsKKyAgICAgICAgICAgIHJlcy0+RGltW3JhbmsgLSBpIC0gMV0uY291bnQgPSBjb3VudDsKKyAgICAgICAgICAgIHJlcy0+RGltW3JhbmsgLSBpIC0gMV0uc2l6ZSA9IGR2cC0+RGltW2ldLk11bHQ7CisgICAgICAgICAgICBjb3VudCAqPSBkdnAtPkRpbVtpXS5FeHRlbnQ7CisgICAgICAgIH0KKyAgICAgICAgcmVzIC0+IHJhbmdlX21heF9udW1iZXIgPSBjb3VudDsKKyAgICAgICAgcmVzIC0+IHJhbmdlX3NpemUgPSBsZW47CisgICAgICAgIHJlcyAtPiBwdHIgPSAodm9pZCopZHZwLT5CYXNlOworICAgICAgICByZXMgLT4gY3VycmVudF9udW1iZXIgPSAwOworICAgICAgICByZXMgLT4gaW5pdF9vZmZzZXQgPSAwOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisjaWYgT0ZGTE9BRF9ERUJVRyA+IDAKK3ZvaWQgX19kdl9kZXNjX2R1bXAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgQXJyRGVzYyAqZHZwKQoreworICAgIE9GRkxPQURfVFJBQ0UoMywgIiVzIERWICVwXG4iLCBuYW1lLCBkdnApOworCisgICAgaWYgKGR2cCAhPSAwKSB7CisgICAgICAgIE9GRkxPQURfVFJBQ0UoMywKKyAgICAgICAgICAgICAgICAgICAgICAiICAgIGR2LT5CYXNlICAgPSAweCVseFxuIgorICAgICAgICAgICAgICAgICAgICAgICIgICAgZHYtPkxlbiAgICA9IDB4JWx4XG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAgICBkdi0+T2Zmc2V0ID0gMHglbHhcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiICAgIGR2LT5GbGFncyAgPSAweCVseFxuIgorICAgICAgICAgICAgICAgICAgICAgICIgICAgZHYtPlJhbmsgICA9IDB4JWx4XG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAgICBkdi0+UmVzcnZkID0gMHglbHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZHZwLT5CYXNlLAorICAgICAgICAgICAgICAgICAgICAgIGR2cC0+TGVuLAorICAgICAgICAgICAgICAgICAgICAgIGR2cC0+T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIGR2cC0+RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgZHZwLT5SYW5rLAorICAgICAgICAgICAgICAgICAgICAgIGR2cC0+UmVzZXJ2ZWQpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGR2cC0+UmFuazsgaSsrKSB7CisgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgKCVkKSBFeHRlbnQ9JWxkLCBNdWx0aXBsaWVyPSVsZCwgTG93ZXJCb3VuZD0lbGRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGR2cC0+RGltW2ldLkV4dGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHZwLT5EaW1baV0uTXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHZwLT5EaW1baV0uTG93ZXJCb3VuZCk7CisgICAgICAgIH0KKyAgICB9Cit9CisjZW5kaWYgLy8gT0ZGTE9BRF9ERUJVRyA+IDAKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL2R2X3V0aWwuaCBiL2ZpbmFsL29mZmxvYWQvc3JjL2R2X3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGZhNzdkCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvZHZfdXRpbC5oCkBAIC0wLDAgKzEsNjMgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBEVl9VVElMX0hfSU5DTFVERUQKKyNkZWZpbmUgRFZfVVRJTF9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gRG9wZSB2ZWN0b3IgZGVjbGFyYXRpb25zCisjZGVmaW5lIEFyckRlc2NNYXhBcnJheVJhbmsgICAgICAgICAzMQorCisvLyBEb3BlIHZlY3RvciBmbGFncworI2RlZmluZSBBcnJEZXNjRmxhZ3NEZWZpbmVkICAgICAgICAgMQorI2RlZmluZSBBcnJEZXNjRmxhZ3NOb2RlYWxsb2MgICAgICAgMgorI2RlZmluZSBBcnJEZXNjRmxhZ3NDb250aWd1b3VzICAgICAgNAorCit0eXBlZGVmIGludDY0X3QgZHZfc2l6ZTsKKwordHlwZWRlZiBzdHJ1Y3QgRGltRGVzYyB7CisgICAgZHZfc2l6ZSAgICAgICAgRXh0ZW50OyAgICAgIC8vIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIGRpbWVuc2lvbgorICAgIGR2X3NpemUgICAgICAgIE11bHQ7ICAgICAgICAvLyBNdWx0aXBsaWVyIGZvciB0aGlzIGRpbWVuc2lvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG51bWJlciBvZiBieXRlcyBiZXR3ZWVuIHN1Y2Nlc3NpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudHMgaW4gdGhpcyBkaW1lbnNpb24uCisgICAgZHZfc2l6ZSAgICAgICAgTG93ZXJCb3VuZDsgIC8vIExvd2VyQm91bmQgb2YgdGhpcyBkaW1lbnNpb24KK30gRGltRGVzYyA7CisKK3R5cGVkZWYgc3RydWN0IEFyckRlc2MgeworICAgIGR2X3NpemUgICAgICAgIEJhc2U7ICAgICAgICAvLyBCYXNlIGFkZHJlc3MKKyAgICBkdl9zaXplICAgICAgICBMZW47ICAgICAgICAgLy8gTGVuZ3RoIG9mIGRhdGEgdHlwZSwgdXNlZCBvbmx5IGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFyYWN0ZXIgc3RyaW5ncy4KKyAgICBkdl9zaXplICAgICAgICBPZmZzZXQ7CisgICAgZHZfc2l6ZSAgICAgICAgRmxhZ3M7ICAgICAgIC8vIEZsYWdzCisgICAgZHZfc2l6ZSAgICAgICAgUmFuazsgICAgICAgIC8vIFJhbmsgb2YgcG9pbnRlcgorICAgIGR2X3NpemUgICAgICAgIFJlc2VydmVkOyAgICAvLyByZXNlcnZlZCBmb3Igb3Blbm1wIHJlcXVlc3RzCisgICAgRGltRGVzYyBEaW1bQXJyRGVzY01heEFycmF5UmFua107Cit9IEFyckRlc2MgOworCit0eXBlZGVmIEFyckRlc2MqIHBBcnJEZXNjOworCitib29sIF9fZHZfaXNfY29udGlndW91cyhjb25zdCBBcnJEZXNjICpkdnApOworCitib29sIF9fZHZfaXNfYWxsb2NhdGVkKGNvbnN0IEFyckRlc2MgKmR2cCk7CisKK3VpbnQ2NF90IF9fZHZfZGF0YV9sZW5ndGgoY29uc3QgQXJyRGVzYyAqZHZwKTsKKwordWludDY0X3QgX19kdl9kYXRhX2xlbmd0aChjb25zdCBBcnJEZXNjICpkdnAsIGludDY0X3QgbmVsZW1zKTsKKworQ2VhblJlYWRSYW5nZXMgKiBpbml0X3JlYWRfcmFuZ2VzX2R2KGNvbnN0IEFyckRlc2MgKmR2cCk7CisKKyNpZiBPRkZMT0FEX0RFQlVHID4gMAordm9pZCAgICBfX2R2X2Rlc2NfZHVtcChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBBcnJEZXNjICpkdnApOworI2Vsc2UgLy8gT0ZGTE9BRF9ERUJVRworI2RlZmluZSBfX2R2X2Rlc2NfZHVtcChuYW1lLCBkdnApCisjZW5kaWYgLy8gT0ZGTE9BRF9ERUJVRworCisjZW5kaWYgLy8gRFZfVVRJTF9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9saWJvZmZsb2FkX2Vycm9yLmMgYi9maW5hbC9vZmZsb2FkL3NyYy9saWJvZmZsb2FkX2Vycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMxNWY4YgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL2xpYm9mZmxvYWRfZXJyb3IuYwpAQCAtMCwwICsxLDQ1MiBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpZm5kZWYgdmFfY29weQorI2RlZmluZSB2YV9jb3B5KGRzdCwgc3JjKSAoKGRzdCkgPSAoc3JjKSkKKyNlbmRpZgorCisjaW5jbHVkZSAibGlib2ZmbG9hZF9tc2cuaCIKKworI2luY2x1ZGUgImxpYm9mZmxvYWRfZXJyb3JfY29kZXMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZXJyb3ItaGFuZGxpbmcgZnVuY3Rpb24sIGxpYm9mZmxvYWRfZXJyb3Jfc3VwcG9ydCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIF9fbGlib2ZmbG9hZF9lcnJvcl9zdXBwb3J0KGVycm9yX3R5cGVzIGlucHV0X3RhZywgLi4uKQoreworICAgIHZhX2xpc3QgYXJnczsKKyAgICB2YV9zdGFydChhcmdzLCBpbnB1dF90YWcpOworCisgICAgc3dpdGNoIChpbnB1dF90YWcpIHsKKyAgICAgICAgY2FzZSBjX2RldmljZV9pc19ub3RfYXZhaWxhYmxlOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2RldmljZV9pc19ub3RfYXZhaWxhYmxlLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfaW52YWxpZF9kZXZpY2VfbnVtYmVyOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2ludmFsaWRfZGV2aWNlX251bWJlciwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3NlbmRfZnVuY19wdHI6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2Nfc2VuZF9mdW5jX3B0ciwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3JlY2VpdmVfZnVuY19wdHI6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfcmVjZWl2ZV9mdW5jX3B0ciwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfbWFsbG9jOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX29mZmxvYWRfbWFsbG9jLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZDE6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2Nfb2ZmbG9hZDEsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY191bmtub3duX3Zhcl90eXBlOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIGNfdW5rbm93bl92YXJfdHlwZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2ludmFsaWRfZW52X3Zhcl92YWx1ZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19pbnZhbGlkX2Vudl92YXJfdmFsdWUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19pbnZhbGlkX2Vudl92YXJfaW50X3ZhbHVlOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2ludmFsaWRfZW52X3Zhcl9pbnRfdmFsdWUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19pbnZhbGlkX2Vudl9yZXBvcnRfdmFsdWU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfaW52YWxpZF9lbnZfcmVwb3J0X3ZhbHVlLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9zaWduYWxlZDE6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2Nfb2ZmbG9hZF9zaWduYWxlZDEsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3NpZ25hbGVkMjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19vZmZsb2FkX3NpZ25hbGVkMiwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX215b3dyYXBwZXJfY2hlY2tyZXN1bHQ6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfbXlvd3JhcHBlcl9jaGVja3Jlc3VsdCwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX215b3RhcmdldF9jaGVja3Jlc3VsdDoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19teW90YXJnZXRfY2hlY2tyZXN1bHQsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2Rlc2NyaXB0b3Jfb2ZmbG9hZDoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19vZmZsb2FkX2Rlc2NyaXB0b3Jfb2ZmbG9hZCwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX21lcmdlX3Zhcl9kZXNjczE6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfbWVyZ2VfdmFyX2Rlc2NzMSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX21lcmdlX3Zhcl9kZXNjczI6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfbWVyZ2VfdmFyX2Rlc2NzMiwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX21pY19wYXJzZV9lbnZfdmFyX2xpc3QxOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX21pY19wYXJzZV9lbnZfdmFyX2xpc3QxLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbWljX3BhcnNlX2Vudl92YXJfbGlzdDI6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfbWljX3BhcnNlX2Vudl92YXJfbGlzdDIsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19taWNfcHJvY2Vzc19leGl0X3JldDoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19taWNfcHJvY2Vzc19leGl0X3JldCwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX21pY19wcm9jZXNzX2V4aXRfc2lnOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX21pY19wcm9jZXNzX2V4aXRfc2lnLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbWljX3Byb2Nlc3NfZXhpdDoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19taWNfcHJvY2Vzc19leGl0LCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbWljX2luaXQzOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX21pY19pbml0MywgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX21pY19pbml0NDoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19taWNfaW5pdDQsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19taWNfaW5pdDU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfbWljX2luaXQ1LCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbWljX2luaXQ2OgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX21pY19pbml0NiwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX25vX3N0YXRpY192YXJfZGF0YToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19ub19zdGF0aWNfdmFyX2RhdGEsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19ub19wdHJfZGF0YToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19ub19wdHJfZGF0YSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2dldF9lbmdpbmVfaGFuZGxlOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2dldF9lbmdpbmVfaGFuZGxlLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfZ2V0X2VuZ2luZV9pbmRleDoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19nZXRfZW5naW5lX2luZGV4LCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfcHJvY2Vzc19jcmVhdGU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfcHJvY2Vzc19jcmVhdGUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19wcm9jZXNzX3dhaXRfc2h1dGRvd246CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfcHJvY2Vzc193YWl0X3NodXRkb3duLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfcHJvY2Vzc19wcm94eV9mbHVzaDoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19wcm9jZXNzX3Byb3h5X2ZsdXNoLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfcHJvY2Vzc19nZXRfZnVuY19oYW5kbGVzOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3Byb2Nlc3NfZ2V0X2Z1bmNfaGFuZGxlcywgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2xvYWRfbGlicmFyeToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19sb2FkX2xpYnJhcnksIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19jb2lwaXBlX21heF9udW1iZXI6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfY29pX3BpcGVsaW5lX21heF9udW1iZXIsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19waXBlbGluZV9jcmVhdGU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfcGlwZWxpbmVfY3JlYXRlLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfcGlwZWxpbmVfcnVuX2Z1bmM6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfcGlwZWxpbmVfcnVuX2Z1bmMsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19waXBlbGluZV9zdGFydF9ydW5fZnVuY3M6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfcGlwZWxpbmVfc3RhcnRfcnVuX2Z1bmNzLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfYnVmX2NyZWF0ZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19idWZfY3JlYXRlLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfYnVmX2NyZWF0ZV9vdXRfb2ZfbWVtOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2J1Zl9jcmVhdGVfb3V0X29mX21lbSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2J1Zl9jcmVhdGVfZnJvbV9tZW06CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX2NyZWF0ZV9mcm9tX21lbSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2J1Zl9kZXN0cm95OgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2J1Zl9kZXN0cm95LCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfYnVmX21hcDoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19idWZfbWFwLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfYnVmX3VubWFwOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2J1Zl91bm1hcCwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2J1Zl9yZWFkOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2J1Zl9yZWFkLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfYnVmX3dyaXRlOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2J1Zl93cml0ZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2J1Zl9jb3B5OgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2J1Zl9jb3B5LCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfYnVmX2dldF9hZGRyZXNzOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2J1Zl9nZXRfYWRkcmVzcywgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2J1Zl9hZGRfcmVmOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2J1Zl9hZGRfcmVmLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfYnVmX3JlbGVhc2VfcmVmOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2J1Zl9yZWxlYXNlX3JlZiwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2J1Zl9zZXRfc3RhdGU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX3NldF9zdGF0ZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2V2ZW50X3dhaXQ6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfZXZlbnRfd2FpdCwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3plcm9fb3JfbmVnX3B0cl9sZW46CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfemVyb19vcl9uZWdfcHRyX2xlbiwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3plcm9fb3JfbmVnX3RyYW5zZmVyX3NpemU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfemVyb19vcl9uZWdfdHJhbnNmZXJfc2l6ZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2JhZF9wdHJfbWVtX3JhbmdlOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2JhZF9wdHJfbWVtX3JhbmdlLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfZGlmZmVyZW50X3NyY19hbmRfZHN0bl9zaXplczoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19kaWZmZXJlbnRfc3JjX2FuZF9kc3RuX3NpemVzLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfcmFuZ2VzX2RvbnRfbWF0Y2g6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfcmFuZ2VzX2RvbnRfbWF0Y2gsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19kZXN0aW5hdGlvbl9pc19vdmVyOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2Rlc3RpbmF0aW9uX2lzX292ZXIsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19zbGljZV9vZl9ub25jb250X2FycmF5OgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3NsaWNlX29mX25vbmNvbnRfYXJyYXksIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19ub25fY29udGlndW91c19kb3BlX3ZlY3RvcjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19ub25fY29udGlndW91c19kb3BlX3ZlY3RvciwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2g6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29tcF9pbnZhbGlkX2RldmljZV9udW1fZW52OgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX29tcF9pbnZhbGlkX2RldmljZV9udW1fZW52LCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb21wX2ludmFsaWRfZGV2aWNlX251bToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19vbXBfaW52YWxpZF9kZXZpY2VfbnVtLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfdW5rbm93bl9iaW5hcnlfdHlwZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY191bmtub3duX2JpbmFyeV90eXBlLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbXVsdGlwbGVfdGFyZ2V0X2V4ZXM6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfbXVsdGlwbGVfdGFyZ2V0X2V4ZXMsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19ub190YXJnZXRfZXhlOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX25vX3RhcmdldF9leGUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19yZXBvcnRfdW5rbm93bl90aW1lcl9ub2RlOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3JlcG9ydF91bmtub3duX3RpbWVyX25vZGUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19yZXBvcnRfdW5rbm93bl90cmFjZV9ub2RlOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3JlcG9ydF91bmtub3duX3RyYWNlX25vZGUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHZhX2VuZChhcmdzKTsKK30KKworY2hhciBjb25zdCAqIHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoZXJyb3JfdHlwZXMgaW5wdXRfdGFnKQoreworICAgIHN3aXRjaCAoaW5wdXRfdGFnKSB7CisgICAgICAgIGNhc2UgY19yZXBvcnRfdGl0bGU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF90aXRsZSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2Zyb21fZmlsZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2Zyb21fZmlsZSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X29mZmxvYWQ6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9vZmZsb2FkKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbWljOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbWljKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfZmlsZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2ZpbGUpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9saW5lOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbGluZSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2hvc3Q6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0KSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfdGFnOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfdGFnKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfY3B1X3RpbWU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9jcHVfdGltZSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3NlY29uZHM6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9zZWNvbmRzKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfY3B1X3RvX21pY19kYXRhOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfY3B1X3RvX21pY19kYXRhKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfYnl0ZXM6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ieXRlcykpOworICAgICAgICBjYXNlIGNfcmVwb3J0X21pY190aW1lOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbWljX3RpbWUpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9taWNfdG9fY3B1X2RhdGE6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9taWNfdG9fY3B1X2RhdGEpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9jb21wdXRlOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfY29tcHV0ZSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2NvcHlpbl9kYXRhOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfY29weWluX2RhdGEpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9jb3B5b3V0X2RhdGE6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9jb3B5b3V0X2RhdGEpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9jcmVhdGVfYnVmX2hvc3Q6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2NyZWF0ZV9idWZfaG9zdCkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2NyZWF0ZV9idWZfbWljOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfY3JlYXRlX2J1Zl9taWMpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9kZXN0cm95OgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfZGVzdHJveSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2dhdGhlcl9jb3B5aW5fZGF0YToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2dhdGhlcl9jb3B5aW5fZGF0YSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2dhdGhlcl9jb3B5b3V0X2RhdGE6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9nYXRoZXJfY29weW91dF9kYXRhKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfc3RhdGVfc2lnbmFsOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfc3RhdGVfc2lnbmFsKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfc2lnbmFsOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfc2lnbmFsKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfd2FpdDoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3dhaXQpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9pbml0OgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaW5pdCkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2luaXRfZnVuYzoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2luaXRfZnVuYykpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2xvZ2ljYWxfY2FyZDoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2xvZ2ljYWxfY2FyZCkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X21pY19teW9fZnB0cjoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X21pY19teW9fZnB0cikpOworICAgICAgICBjYXNlIGNfcmVwb3J0X21pY19teW9fc2hhcmVkOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbWljX215b19zaGFyZWQpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9teW9hY3F1aXJlOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbXlvYWNxdWlyZSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X215b2Zpbmk6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9teW9maW5pKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbXlvaW5pdDoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X215b2luaXQpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9teW9yZWdpc3RlcjoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X215b3JlZ2lzdGVyKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbXlvcmVsZWFzZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X215b3JlbGVhc2UpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9teW9zaGFyZWRhbGlnbmVkZnJlZToKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X215b3NoYXJlZGFsaWduZWRmcmVlKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbXlvc2hhcmVkYWxpZ25lZG1hbGxvYzoKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X215b3NoYXJlZGFsaWduZWRtYWxsb2MpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9teW9zaGFyZWRmcmVlOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbXlvc2hhcmVkZnJlZSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X215b3NoYXJlZG1hbGxvYzoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X215b3NoYXJlZG1hbGxvYykpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3BoeXNpY2FsX2NhcmQ6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9waHlzaWNhbF9jYXJkKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfcmVjZWl2ZV9wb2ludGVyX2RhdGE6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9yZWNlaXZlX3BvaW50ZXJfZGF0YSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3JlY2VpdmVkX3BvaW50ZXJfZGF0YToKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3JlY2VpdmVkX3BvaW50ZXJfZGF0YSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3JlZ2lzdGVyOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfcmVnaXN0ZXIpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9zY2F0dGVyX2NvcHlpbl9kYXRhOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfc2NhdHRlcl9jb3B5aW5fZGF0YSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3NjYXR0ZXJfY29weW91dF9kYXRhOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfc2NhdHRlcl9jb3B5b3V0X2RhdGEpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9zZW5kX3BvaW50ZXJfZGF0YToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3NlbmRfcG9pbnRlcl9kYXRhKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfc2VudF9wb2ludGVyX2RhdGE6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9zZW50X3BvaW50ZXJfZGF0YSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3N0YXJ0OgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfc3RhcnQpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9zdGFydF90YXJnZXRfZnVuYzoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3N0YXJ0X3RhcmdldF9mdW5jKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfc3RhdGU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9zdGF0ZSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3VucmVnaXN0ZXI6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF91bnJlZ2lzdGVyKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfdmFyOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfdmFyKSk7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19yZXBvcnRfdW5rbm93bl90cmFjZV9ub2RlKTsKKyAgICAgICAgICAgIGFib3J0KCk7CisgICAgfQorfQorCitjaGFyIGNvbnN0ICogcmVwb3J0X2dldF9ob3N0X3N0YWdlX3N0cihpbnQgaSkKK3sKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF90b3RhbF9vZmZsb2FkOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgIG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0X3RvdGFsX29mZmxvYWRfdGltZSkpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X2luaXRpYWxpemU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0X2luaXRpYWxpemUpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF90YXJnZXRfYWNxdWlyZToKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3RfdGFyZ2V0X2FjcXVpcmUpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF93YWl0X2RlcHM6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0X3dhaXRfZGVwcykpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X3NldHVwX2J1ZmZlcnM6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0X3NldHVwX2J1ZmZlcnMpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF9hbGxvY19idWZmZXJzOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF9hbGxvY19idWZmZXJzKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3Rfc2V0dXBfbWlzY19kYXRhOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF9zZXR1cF9taXNjX2RhdGEpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF9hbGxvY19kYXRhX2J1ZmZlcjoKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3RfYWxsb2NfZGF0YV9idWZmZXIpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF9zZW5kX3BvaW50ZXJzOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF9zZW5kX3BvaW50ZXJzKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3RfZ2F0aGVyX2lucHV0czoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3RfZ2F0aGVyX2lucHV0cykpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X21hcF9pbl9kYXRhX2J1ZmZlcjoKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3RfbWFwX2luX2RhdGFfYnVmZmVyKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3RfdW5tYXBfaW5fZGF0YV9idWZmZXI6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKAorICAgICAgICAgICAgICAgIG1zZ19jX3JlcG9ydF9ob3N0X3VubWFwX2luX2RhdGFfYnVmZmVyKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3Rfc3RhcnRfY29tcHV0ZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3Rfc3RhcnRfY29tcHV0ZSkpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X3dhaXRfY29tcHV0ZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3Rfd2FpdF9jb21wdXRlKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3Rfc3RhcnRfYnVmZmVyc19yZWFkczoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIoCisgICAgICAgICAgICAgICAgbXNnX2NfcmVwb3J0X2hvc3Rfc3RhcnRfYnVmZmVyc19yZWFkcykpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X3NjYXR0ZXJfb3V0cHV0czoKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3Rfc2NhdHRlcl9vdXRwdXRzKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3RfbWFwX291dF9kYXRhX2J1ZmZlcjoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIoCisgICAgICAgICAgICAgICAgbXNnX2NfcmVwb3J0X2hvc3RfbWFwX291dF9kYXRhX2J1ZmZlcikpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X3VubWFwX291dF9kYXRhX2J1ZmZlcjoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIoCisgICAgICAgICAgICAgICAgbXNnX2NfcmVwb3J0X2hvc3RfdW5tYXBfb3V0X2RhdGFfYnVmZmVyKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3Rfd2FpdF9idWZmZXJzX3JlYWRzOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF93YWl0X2J1ZmZlcnNfcmVhZHMpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF9kZXN0cm95X2J1ZmZlcnM6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0X2Rlc3Ryb3lfYnVmZmVycykpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3JlcG9ydF91bmtub3duX3RpbWVyX25vZGUpOworICAgICAgICAgICAgYWJvcnQoKTsKKyAgICB9Cit9CisKK2NoYXIgY29uc3QgKiByZXBvcnRfZ2V0X3RhcmdldF9zdGFnZV9zdHIoaW50IGkpCit7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3RhcmdldF90b3RhbF90aW1lOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfdGFyZ2V0X3RvdGFsX3RpbWUpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfdGFyZ2V0X2Rlc2NyaXB0b3Jfc2V0dXA6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF90YXJnZXRfZGVzY3JpcHRvcl9zZXR1cCkpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF90YXJnZXRfZnVuY19sb29rdXA6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF90YXJnZXRfZnVuY19sb29rdXApKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfdGFyZ2V0X2Z1bmNfdGltZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3RhcmdldF9mdW5jX3RpbWUpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfdGFyZ2V0X3NjYXR0ZXJfaW5wdXRzOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfdGFyZ2V0X3NjYXR0ZXJfaW5wdXRzKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3RhcmdldF9hZGRfYnVmZmVyX3JlZnM6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF90YXJnZXRfYWRkX2J1ZmZlcl9yZWZzKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3RhcmdldF9jb21wdXRlOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfdGFyZ2V0X2NvbXB1dGUpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfdGFyZ2V0X2dhdGhlcl9vdXRwdXRzOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cgorICAgICAgICAgICAgICAgIChtc2dfY19yZXBvcnRfdGFyZ2V0X2dhdGhlcl9vdXRwdXRzKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3RhcmdldF9yZWxlYXNlX2J1ZmZlcl9yZWZzOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cigKKyAgICAgICAgICAgICAgICBtc2dfY19yZXBvcnRfdGFyZ2V0X3JlbGVhc2VfYnVmZmVyX3JlZnMpKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19yZXBvcnRfdW5rbm93bl90aW1lcl9ub2RlKTsKKyAgICAgICAgICAgIGFib3J0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvbGlib2ZmbG9hZF9lcnJvcl9jb2Rlcy5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvbGlib2ZmbG9hZF9lcnJvcl9jb2Rlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MjE2N2IKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9saWJvZmZsb2FkX2Vycm9yX2NvZGVzLmgKQEAgLTAsMCArMSwyNzYgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmICFkZWZpbmVkKExJQk9GRkxPQURfRVJST1JfQ09ERVNfSCkKKyNkZWZpbmUgTElCT0ZGTE9BRF9FUlJPUl9DT0RFU19ICisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKwordHlwZWRlZiBlbnVtCit7CisgICAgY19kZXZpY2VfaXNfbm90X2F2YWlsYWJsZSA9IDAsCisgICAgY19pbnZhbGlkX2RldmljZV9udW1iZXIsCisgICAgY19vZmZsb2FkMSwKKyAgICBjX3Vua25vd25fdmFyX3R5cGUsCisgICAgY19zZW5kX2Z1bmNfcHRyLAorICAgIGNfcmVjZWl2ZV9mdW5jX3B0ciwKKyAgICBjX29mZmxvYWRfbWFsbG9jLAorICAgIGNfaW52YWxpZF9lbnZfdmFyX3ZhbHVlLAorICAgIGNfaW52YWxpZF9lbnZfdmFyX2ludF92YWx1ZSwKKyAgICBjX2ludmFsaWRfZW52X3JlcG9ydF92YWx1ZSwKKyAgICBjX29mZmxvYWRfc2lnbmFsZWQxLAorICAgIGNfb2ZmbG9hZF9zaWduYWxlZDIsCisgICAgY19teW90YXJnZXRfY2hlY2tyZXN1bHQsCisgICAgY19teW93cmFwcGVyX2NoZWNrcmVzdWx0LAorICAgIGNfb2ZmbG9hZF9kZXNjcmlwdG9yX29mZmxvYWQsCisgICAgY19tZXJnZV92YXJfZGVzY3MxLAorICAgIGNfbWVyZ2VfdmFyX2Rlc2NzMiwKKyAgICBjX21pY19wYXJzZV9lbnZfdmFyX2xpc3QxLAorICAgIGNfbWljX3BhcnNlX2Vudl92YXJfbGlzdDIsCisgICAgY19taWNfcHJvY2Vzc19leGl0X3JldCwKKyAgICBjX21pY19wcm9jZXNzX2V4aXRfc2lnLAorICAgIGNfbWljX3Byb2Nlc3NfZXhpdCwKKyAgICBjX21pY19pbml0MywKKyAgICBjX21pY19pbml0NCwKKyAgICBjX21pY19pbml0NSwKKyAgICBjX21pY19pbml0NiwKKyAgICBjX25vX3N0YXRpY192YXJfZGF0YSwKKyAgICBjX25vX3B0cl9kYXRhLAorICAgIGNfZ2V0X2VuZ2luZV9oYW5kbGUsCisgICAgY19nZXRfZW5naW5lX2luZGV4LAorICAgIGNfcHJvY2Vzc19jcmVhdGUsCisgICAgY19wcm9jZXNzX2dldF9mdW5jX2hhbmRsZXMsCisgICAgY19wcm9jZXNzX3dhaXRfc2h1dGRvd24sCisgICAgY19wcm9jZXNzX3Byb3h5X2ZsdXNoLAorICAgIGNfbG9hZF9saWJyYXJ5LAorICAgIGNfcGlwZWxpbmVfY3JlYXRlLAorICAgIGNfcGlwZWxpbmVfcnVuX2Z1bmMsCisgICAgY19waXBlbGluZV9zdGFydF9ydW5fZnVuY3MsCisgICAgY19idWZfY3JlYXRlLAorICAgIGNfYnVmX2NyZWF0ZV9vdXRfb2ZfbWVtLAorICAgIGNfYnVmX2NyZWF0ZV9mcm9tX21lbSwKKyAgICBjX2J1Zl9kZXN0cm95LAorICAgIGNfYnVmX21hcCwKKyAgICBjX2J1Zl91bm1hcCwKKyAgICBjX2J1Zl9yZWFkLAorICAgIGNfYnVmX3dyaXRlLAorICAgIGNfYnVmX2NvcHksCisgICAgY19idWZfZ2V0X2FkZHJlc3MsCisgICAgY19idWZfYWRkX3JlZiwKKyAgICBjX2J1Zl9yZWxlYXNlX3JlZiwKKyAgICBjX2J1Zl9zZXRfc3RhdGUsCisgICAgY19ldmVudF93YWl0LAorICAgIGNfemVyb19vcl9uZWdfcHRyX2xlbiwKKyAgICBjX3plcm9fb3JfbmVnX3RyYW5zZmVyX3NpemUsCisgICAgY19iYWRfcHRyX21lbV9yYW5nZSwKKyAgICBjX2RpZmZlcmVudF9zcmNfYW5kX2RzdG5fc2l6ZXMsCisgICAgY19yYW5nZXNfZG9udF9tYXRjaCwKKyAgICBjX2Rlc3RpbmF0aW9uX2lzX292ZXIsCisgICAgY19zbGljZV9vZl9ub25jb250X2FycmF5LAorICAgIGNfbm9uX2NvbnRpZ3VvdXNfZG9wZV92ZWN0b3IsCisgICAgY19wb2ludGVyX2FycmF5X21pc21hdGNoLAorICAgIGNfb21wX2ludmFsaWRfZGV2aWNlX251bV9lbnYsCisgICAgY19vbXBfaW52YWxpZF9kZXZpY2VfbnVtLAorICAgIGNfdW5rbm93bl9iaW5hcnlfdHlwZSwKKyAgICBjX211bHRpcGxlX3RhcmdldF9leGVzLAorICAgIGNfbm9fdGFyZ2V0X2V4ZSwKKyAgICBjX3JlcG9ydF9ob3N0LAorICAgIGNfcmVwb3J0X3RhcmdldCwKKyAgICBjX3JlcG9ydF90aXRsZSwKKyAgICBjX3JlcG9ydF9mcm9tX2ZpbGUsCisgICAgY19yZXBvcnRfZmlsZSwKKyAgICBjX3JlcG9ydF9saW5lLAorICAgIGNfcmVwb3J0X3RhZywKKyAgICBjX3JlcG9ydF9zZWNvbmRzLAorICAgIGNfcmVwb3J0X2J5dGVzLAorICAgIGNfcmVwb3J0X21pYywKKyAgICBjX3JlcG9ydF9jcHVfdGltZSwKKyAgICBjX3JlcG9ydF9jcHVfdG9fbWljX2RhdGEsCisgICAgY19yZXBvcnRfbWljX3RpbWUsCisgICAgY19yZXBvcnRfbWljX3RvX2NwdV9kYXRhLAorICAgIGNfcmVwb3J0X3Vua25vd25fdGltZXJfbm9kZSwKKyAgICBjX3JlcG9ydF91bmtub3duX3RyYWNlX25vZGUsCisgICAgY19yZXBvcnRfb2ZmbG9hZCwKKyAgICBjX3JlcG9ydF93X3RhZywKKyAgICBjX3JlcG9ydF9zdGF0ZSwKKyAgICBjX3JlcG9ydF9zdGFydCwKKyAgICBjX3JlcG9ydF9pbml0LAorICAgIGNfcmVwb3J0X2xvZ2ljYWxfY2FyZCwKKyAgICBjX3JlcG9ydF9waHlzaWNhbF9jYXJkLAorICAgIGNfcmVwb3J0X3JlZ2lzdGVyLAorICAgIGNfcmVwb3J0X2luaXRfZnVuYywKKyAgICBjX3JlcG9ydF9jcmVhdGVfYnVmX2hvc3QsCisgICAgY19yZXBvcnRfY3JlYXRlX2J1Zl9taWMsCisgICAgY19yZXBvcnRfc2VuZF9wb2ludGVyX2RhdGEsCisgICAgY19yZXBvcnRfc2VudF9wb2ludGVyX2RhdGEsCisgICAgY19yZXBvcnRfZ2F0aGVyX2NvcHlpbl9kYXRhLAorICAgIGNfcmVwb3J0X2NvcHlpbl9kYXRhLAorICAgIGNfcmVwb3J0X3N0YXRlX3NpZ25hbCwKKyAgICBjX3JlcG9ydF9zaWduYWwsCisgICAgY19yZXBvcnRfd2FpdCwKKyAgICBjX3JlcG9ydF9jb21wdXRlLAorICAgIGNfcmVwb3J0X3JlY2VpdmVfcG9pbnRlcl9kYXRhLAorICAgIGNfcmVwb3J0X3JlY2VpdmVkX3BvaW50ZXJfZGF0YSwKKyAgICBjX3JlcG9ydF9zdGFydF90YXJnZXRfZnVuYywKKyAgICBjX3JlcG9ydF92YXIsCisgICAgY19yZXBvcnRfc2NhdHRlcl9jb3B5aW5fZGF0YSwKKyAgICBjX3JlcG9ydF9nYXRoZXJfY29weW91dF9kYXRhLAorICAgIGNfcmVwb3J0X3NjYXR0ZXJfY29weW91dF9kYXRhLAorICAgIGNfcmVwb3J0X2NvcHlvdXRfZGF0YSwKKyAgICBjX3JlcG9ydF91bnJlZ2lzdGVyLAorICAgIGNfcmVwb3J0X2Rlc3Ryb3ksCisgICAgY19yZXBvcnRfbXlvaW5pdCwKKyAgICBjX3JlcG9ydF9teW9yZWdpc3RlciwKKyAgICBjX3JlcG9ydF9teW9maW5pLAorICAgIGNfcmVwb3J0X21pY19teW9fc2hhcmVkLAorICAgIGNfcmVwb3J0X21pY19teW9fZnB0ciwKKyAgICBjX3JlcG9ydF9teW9zaGFyZWRtYWxsb2MsCisgICAgY19yZXBvcnRfbXlvc2hhcmVkZnJlZSwKKyAgICBjX3JlcG9ydF9teW9zaGFyZWRhbGlnbmVkbWFsbG9jLAorICAgIGNfcmVwb3J0X215b3NoYXJlZGFsaWduZWRmcmVlLAorICAgIGNfcmVwb3J0X215b2FjcXVpcmUsCisgICAgY19yZXBvcnRfbXlvcmVsZWFzZSwKKyAgICBjX2NvaXBpcGVfbWF4X251bWJlcgorfSBlcnJvcl90eXBlczsKKworZW51bSBPZmZsb2FkSG9zdFBoYXNlIHsKKyAgICAvLyBUb3RhbCB0aW1lIG9uIGhvc3QgZm9yIGVudGlyZSBvZmZsb2FkCisgICAgY19vZmZsb2FkX2hvc3RfdG90YWxfb2ZmbG9hZCA9IDAsCisKKyAgICAvLyBUaW1lIHRvIGxvYWQgdGFyZ2V0IGJpbmFyeQorICAgIGNfb2ZmbG9hZF9ob3N0X2luaXRpYWxpemUsCisKKyAgICAvLyBUaW1lIHRvIGFjcXVpcmUgbHJiIGF2YWlsYWJpbGl0eSBkeW5hbWljYWxseQorICAgIGNfb2ZmbG9hZF9ob3N0X3RhcmdldF9hY3F1aXJlLAorCisgICAgLy8gVGltZSB0byB3YWl0IGZvciBkZXBlbmRlbmNpZXMKKyAgICBjX29mZmxvYWRfaG9zdF93YWl0X2RlcHMsCisKKyAgICAvLyBUaW1lIHRvIGFsbG9jYXRlIHBvaW50ZXIgYnVmZmVycywgaW5pdGlhdGUgd3JpdGVzIGZvciBwb2ludGVycworICAgIC8vIGFuZCBjYWxjdWxhdGUgc2l6ZSBvZiBjb3B5aW4vY29weW91dCBidWZmZXIKKyAgICBjX29mZmxvYWRfaG9zdF9zZXR1cF9idWZmZXJzLAorCisgICAgLy8gVGltZSB0byBhbGxvY2F0ZSBwb2ludGVyIGJ1ZmZlcnMKKyAgICBjX29mZmxvYWRfaG9zdF9hbGxvY19idWZmZXJzLAorCisgICAgLy8gVGltZSB0byBpbml0aWFsaXplIG1pc2MgZGF0YQorICAgIGNfb2ZmbG9hZF9ob3N0X3NldHVwX21pc2NfZGF0YSwKKworICAgIC8vIFRpbWUgdG8gYWxsb2NhdGUgY29weWluL2NvcHlvdXQgYnVmZmVyCisgICAgY19vZmZsb2FkX2hvc3RfYWxsb2NfZGF0YV9idWZmZXIsCisKKyAgICAvLyBUaW1lIHRvIGluaXRpYXRlIHdyaXRlcyBmcm9tIGhvc3QgcG9pbnRlcnMgdG8gYnVmZmVycworICAgIGNfb2ZmbG9hZF9ob3N0X3NlbmRfcG9pbnRlcnMsCisKKyAgICAvLyBUaW1lIHRvIEdhdGhlciBJTiBkYXRhIG9mIG9mZmxvYWQgaW50byBidWZmZXIKKyAgICBjX29mZmxvYWRfaG9zdF9nYXRoZXJfaW5wdXRzLAorCisgICAgLy8gVGltZSB0byBtYXAgYnVmZmVyCisgICAgY19vZmZsb2FkX2hvc3RfbWFwX2luX2RhdGFfYnVmZmVyLAorCisgICAgLy8gVGltZSB0byB1bm1hcCBidWZmZXIKKyAgICBjX29mZmxvYWRfaG9zdF91bm1hcF9pbl9kYXRhX2J1ZmZlciwKKworICAgIC8vIFRpbWUgdG8gc3RhcnQgcmVtb3RlIGZ1bmN0aW9uIGNhbGwgdGhhdCBkb2VzIGNvbXB1dGF0aW9uIG9uIGxyYgorICAgIGNfb2ZmbG9hZF9ob3N0X3N0YXJ0X2NvbXB1dGUsCisKKyAgICAvLyBUaW1lIHRvIHdhaXQgZm9yIGNvbXB1dGUgdG8gZmluaXNoCisgICAgY19vZmZsb2FkX2hvc3Rfd2FpdF9jb21wdXRlLAorCisgICAgLy8gVGltZSB0byBpbml0aWF0ZSByZWFkcyBmcm9tIHBvaW50ZXIgYnVmZmVycworICAgIGNfb2ZmbG9hZF9ob3N0X3N0YXJ0X2J1ZmZlcnNfcmVhZHMsCisKKyAgICAvLyBUaW1lIHRvIHVwZGF0ZSBob3N0IHZhcmlhYmVscyB3aXRoIE9VVCBkYXRhIGZyb20gYnVmZmVyCisgICAgY19vZmZsb2FkX2hvc3Rfc2NhdHRlcl9vdXRwdXRzLAorCisgICAgLy8gVGltZSB0byBtYXAgYnVmZmVyCisgICAgY19vZmZsb2FkX2hvc3RfbWFwX291dF9kYXRhX2J1ZmZlciwKKworICAgIC8vIFRpbWUgdG8gdW5tYXAgYnVmZmVyCisgICAgY19vZmZsb2FkX2hvc3RfdW5tYXBfb3V0X2RhdGFfYnVmZmVyLAorCisgICAgLy8gVGltZSB0byB3YWl0IHJlYWRzIGZyb20gYnVmZmVycyB0byBmaW5pc2gKKyAgICBjX29mZmxvYWRfaG9zdF93YWl0X2J1ZmZlcnNfcmVhZHMsCisKKyAgICAvLyBUaW1lIHRvIGRlc3Ryb3kgYnVmZmVycyB0aGF0IGFyZSBubyBsb25nZXIgbmVlZGVkCisgICAgY19vZmZsb2FkX2hvc3RfZGVzdHJveV9idWZmZXJzLAorCisgICAgLy8gTEFTVCBUSU1FIE1PTklUT1IKKyAgICBjX29mZmxvYWRfaG9zdF9tYXhfcGhhc2UKK307CisKK2VudW0gT2ZmbG9hZFRhcmdldFBoYXNlIHsKKyAgICAvLyBUb3RhbCB0aW1lIHNwZW50IG9uIHRoZSB0YXJnZXQKKyAgICBjX29mZmxvYWRfdGFyZ2V0X3RvdGFsX3RpbWUgPSAwLAorCisgICAgLy8gVGltZSB0byBpbml0aWFsaXplIG9mZmxvYWQgZGVzY3JpcHRvcgorICAgIGNfb2ZmbG9hZF90YXJnZXRfZGVzY3JpcHRvcl9zZXR1cCwKKworICAgIC8vIFRpbWUgdG8gZmluZCB0YXJnZXQgZW50cnkgcG9pbnQgaW4gbG9va3VwIHRhYmxlCisgICAgY19vZmZsb2FkX3RhcmdldF9mdW5jX2xvb2t1cCwKKworICAgIC8vIFRvdGFsIHRpbWUgc3BlbmQgZXhlY3V0aW5nIG9mZmxvYWQgZW50cnkKKyAgICBjX29mZmxvYWRfdGFyZ2V0X2Z1bmNfdGltZSwKKworICAgIC8vIFRpbWUgdG8gaW5pdGlhbGl6ZSB0YXJnZXQgdmFyaWFibGVzIHdpdGggSU4gdmFsdWVzIGZyb20gYnVmZmVyCisgICAgY19vZmZsb2FkX3RhcmdldF9zY2F0dGVyX2lucHV0cywKKworICAgIC8vIFRpbWUgdG8gYWRkIGJ1ZmZlciByZWZlcmVuY2UgZm9yIHBvaW50ZXIgYnVmZmVycworICAgIGNfb2ZmbG9hZF90YXJnZXRfYWRkX2J1ZmZlcl9yZWZzLAorCisgICAgLy8gVG90YWwgdGltZSBvbiBscmIgZm9yIGNvbXB1dGF0aW9uCisgICAgY19vZmZsb2FkX3RhcmdldF9jb21wdXRlLAorCisgICAgLy8gT24gbHJiLCB0aW1lIHRvIGNvcHkgT1VUIGludG8gYnVmZmVyCisgICAgY19vZmZsb2FkX3RhcmdldF9nYXRoZXJfb3V0cHV0cywKKworICAgIC8vIFRpbWUgdG8gcmVsZWFzZSBidWZmZXIgcmVmZXJlbmNlcworICAgIGNfb2ZmbG9hZF90YXJnZXRfcmVsZWFzZV9idWZmZXJfcmVmcywKKworICAgIC8vIExBU1QgVElNRSBNT05JVE9SCisgICAgY19vZmZsb2FkX3RhcmdldF9tYXhfcGhhc2UKK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK3ZvaWQgX19saWJvZmZsb2FkX2Vycm9yX3N1cHBvcnQoZXJyb3JfdHlwZXMgaW5wdXRfdGFnLCAuLi4pOwordm9pZCBfX2xpYm9mZmxvYWRfcmVwb3J0X3N1cHBvcnQoZXJyb3JfdHlwZXMgaW5wdXRfdGFnLCAuLi4pOworY2hhciBjb25zdCAqb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIoaW50IG1zZ0NvZGUpOworY2hhciBjb25zdCAqIHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoZXJyb3JfdHlwZXMgaW5wdXRfdGFnKTsKK2NoYXIgY29uc3QgKiByZXBvcnRfZ2V0X2hvc3Rfc3RhZ2Vfc3RyKGludCBpKTsKK2NoYXIgY29uc3QgKiByZXBvcnRfZ2V0X3RhcmdldF9zdGFnZV9zdHIoaW50IGkpOworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2RlZmluZSB0ZXN0X21zZ19jYXQobm0sIG1zZykgXAorICAgIGZwcmludGYoc3RkZXJyLCAiXHQgVEVTVCBmb3IgJXMgXG4gXHQiLCBubSk7IFwKKyAgICBfX2xpYm9mZmxvYWRfZXJyb3Jfc3VwcG9ydChtc2cpOworCisjZGVmaW5lIHRlc3RfbXNnX2NhdDEobm0sIG1zZywgLi4uKSBcCisgICAgZnByaW50ZihzdGRlcnIsICJcdCBURVNUIGZvciAlcyBcbiBcdCIsIG5tKTsgXAorICAgIF9fbGlib2ZmbG9hZF9lcnJvcl9zdXBwb3J0KG1zZywgX19WQV9BUkdTX18pOworCit2b2lkIHdyaXRlX21lc3NhZ2UoRklMRSAqIGZpbGUsIGludCBtc2dDb2RlLCB2YV9saXN0IGFyZ3NfcCk7CisKKyNkZWZpbmUgTElCT0ZGTE9BRF9FUlJPUiBfX2xpYm9mZmxvYWRfZXJyb3Jfc3VwcG9ydAorCisjaWZkZWYgVEFSR0VUX1dJTk5UCisjZGVmaW5lIExJQk9GRkxPQURfQUJPUlQgXAorICAgICAgICAgX3NldF9hYm9ydF9iZWhhdmlvcigwLCBfV1JJVEVfQUJPUlRfTVNHKTsgXAorICAgICAgICAgYWJvcnQoKQorI2Vsc2UKKyNkZWZpbmUgTElCT0ZGTE9BRF9BQk9SVCBcCisgICAgICAgICBhYm9ydCgpCisjZW5kaWYKKworI2VuZGlmIC8vICFkZWZpbmVkKExJQk9GRkxPQURfRVJST1JfQ09ERVNfSCkKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL2xpYm9mZmxvYWRfbXNnLmMgYi9maW5hbC9vZmZsb2FkL3NyYy9saWJvZmZsb2FkX21zZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNjAzOTIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9saWJvZmZsb2FkX21zZy5jCkBAIC0wLDAgKzEsMzUgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBCcmluZyBpbiB0aGUgc3RhdGljIHN0cmluZyB0YWJsZSBhbmQgdGhlIGVudW1lcmF0aW9ucyBmb3IgaW5kZXhpbmcgaW50bworLy8gaXQuCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2luY2x1ZGUgImxpYm9mZmxvYWRfbXNnLmgiCisKKyMgZGVmaW5lIERZTkFSVF9TVERFUlJfUFVUUyhfX21lc3NhZ2VfdGV4dF9fKSBmcHV0cygoX19tZXNzYWdlX3RleHRfXyksc3RkZXJyKQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIE5vdyB0aGUgY29kZSBmb3IgYWNjZXNzaW5nIHRoZSBtZXNzYWdlIGNhdGFsb2dzCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisgICAgdm9pZCB3cml0ZV9tZXNzYWdlKEZJTEUgKiBmaWxlLCBpbnQgbXNnQ29kZSkgeworICAgICAgICBmcHV0cyhNRVNTQUdFX1RBQkxFX05BTUVbIG1zZ0NvZGUgXSwgZmlsZSk7CisgICAgICAgIGZmbHVzaChmaWxlKTsKKyAgICB9CisKKyAgICBjaGFyIGNvbnN0ICpvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihpbnQgbXNnQ29kZSkgeworICAgICAgICByZXR1cm4gTUVTU0FHRV9UQUJMRV9OQU1FWyBtc2dDb2RlIF07CisgICAgfQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvbGlib2ZmbG9hZF9tc2cuaCBiL2ZpbmFsL29mZmxvYWQvc3JjL2xpYm9mZmxvYWRfbXNnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE0NDVmOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL2xpYm9mZmxvYWRfbXNnLmgKQEAgLTAsMCArMSwzMjYgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIGZpbGU6IGxpYm9mZmxvYWRfbXNnLmgKK2VudW0geworCV9fZHVtbXlfXyA9IDAsCisJbXNnX2NfZGV2aWNlX2lzX25vdF9hdmFpbGFibGUsCisJbXNnX2NfaW52YWxpZF9kZXZpY2VfbnVtYmVyLAorCW1zZ19jX3NlbmRfZnVuY19wdHIsCisJbXNnX2NfcmVjZWl2ZV9mdW5jX3B0ciwKKwltc2dfY19vZmZsb2FkX21hbGxvYywKKwltc2dfY19vZmZsb2FkMSwKKwltc2dfY191bmtub3duX3Zhcl90eXBlLAorCW1zZ19jX2ludmFsaWRfZW52X3Zhcl92YWx1ZSwKKwltc2dfY19pbnZhbGlkX2Vudl92YXJfaW50X3ZhbHVlLAorCW1zZ19jX2ludmFsaWRfZW52X3JlcG9ydF92YWx1ZSwKKwltc2dfY19vZmZsb2FkX3NpZ25hbGVkMSwKKwltc2dfY19vZmZsb2FkX3NpZ25hbGVkMiwKKwltc2dfY19teW93cmFwcGVyX2NoZWNrcmVzdWx0LAorCW1zZ19jX215b3RhcmdldF9jaGVja3Jlc3VsdCwKKwltc2dfY19vZmZsb2FkX2Rlc2NyaXB0b3Jfb2ZmbG9hZCwKKwltc2dfY19tZXJnZV92YXJfZGVzY3MxLAorCW1zZ19jX21lcmdlX3Zhcl9kZXNjczIsCisJbXNnX2NfbWljX3BhcnNlX2Vudl92YXJfbGlzdDEsCisJbXNnX2NfbWljX3BhcnNlX2Vudl92YXJfbGlzdDIsCisJbXNnX2NfbWljX3Byb2Nlc3NfZXhpdF9yZXQsCisJbXNnX2NfbWljX3Byb2Nlc3NfZXhpdF9zaWcsCisJbXNnX2NfbWljX3Byb2Nlc3NfZXhpdCwKKwltc2dfY19taWNfaW5pdDMsCisJbXNnX2NfbWljX2luaXQ0LAorCW1zZ19jX21pY19pbml0NSwKKwltc2dfY19taWNfaW5pdDYsCisJbXNnX2Nfbm9fc3RhdGljX3Zhcl9kYXRhLAorCW1zZ19jX25vX3B0cl9kYXRhLAorCW1zZ19jX2dldF9lbmdpbmVfaGFuZGxlLAorCW1zZ19jX2dldF9lbmdpbmVfaW5kZXgsCisJbXNnX2NfcHJvY2Vzc19jcmVhdGUsCisJbXNnX2NfcHJvY2Vzc19nZXRfZnVuY19oYW5kbGVzLAorCW1zZ19jX3Byb2Nlc3Nfd2FpdF9zaHV0ZG93biwKKwltc2dfY19wcm9jZXNzX3Byb3h5X2ZsdXNoLAorCW1zZ19jX2xvYWRfbGlicmFyeSwKKwltc2dfY19waXBlbGluZV9jcmVhdGUsCisJbXNnX2NfcGlwZWxpbmVfcnVuX2Z1bmMsCisJbXNnX2NfcGlwZWxpbmVfc3RhcnRfcnVuX2Z1bmNzLAorCW1zZ19jX2J1Zl9jcmVhdGUsCisJbXNnX2NfYnVmX2NyZWF0ZV9vdXRfb2ZfbWVtLAorCW1zZ19jX2J1Zl9jcmVhdGVfZnJvbV9tZW0sCisJbXNnX2NfYnVmX2Rlc3Ryb3ksCisJbXNnX2NfYnVmX21hcCwKKwltc2dfY19idWZfdW5tYXAsCisJbXNnX2NfYnVmX3JlYWQsCisJbXNnX2NfYnVmX3dyaXRlLAorCW1zZ19jX2J1Zl9jb3B5LAorCW1zZ19jX2J1Zl9nZXRfYWRkcmVzcywKKwltc2dfY19idWZfYWRkX3JlZiwKKwltc2dfY19idWZfcmVsZWFzZV9yZWYsCisJbXNnX2NfYnVmX3NldF9zdGF0ZSwKKwltc2dfY19ldmVudF93YWl0LAorCW1zZ19jX3plcm9fb3JfbmVnX3B0cl9sZW4sCisJbXNnX2NfemVyb19vcl9uZWdfdHJhbnNmZXJfc2l6ZSwKKwltc2dfY19iYWRfcHRyX21lbV9yYW5nZSwKKwltc2dfY19kaWZmZXJlbnRfc3JjX2FuZF9kc3RuX3NpemVzLAorCW1zZ19jX25vbl9jb250aWd1b3VzX2RvcGVfdmVjdG9yLAorCW1zZ19jX29tcF9pbnZhbGlkX2RldmljZV9udW1fZW52LAorCW1zZ19jX29tcF9pbnZhbGlkX2RldmljZV9udW0sCisJbXNnX2NfdW5rbm93bl9iaW5hcnlfdHlwZSwKKwltc2dfY19tdWx0aXBsZV90YXJnZXRfZXhlcywKKwltc2dfY19ub190YXJnZXRfZXhlLAorCW1zZ19jX3JlcG9ydF91bmtub3duX3RpbWVyX25vZGUsCisJbXNnX2NfcmVwb3J0X3Vua25vd25fdHJhY2Vfbm9kZSwKKwltc2dfY19yZXBvcnRfaG9zdCwKKwltc2dfY19yZXBvcnRfbWljLAorCW1zZ19jX3JlcG9ydF90aXRsZSwKKwltc2dfY19yZXBvcnRfc2Vjb25kcywKKwltc2dfY19yZXBvcnRfYnl0ZXMsCisJbXNnX2NfcmVwb3J0X2NwdV90aW1lLAorCW1zZ19jX3JlcG9ydF9taWNfdGltZSwKKwltc2dfY19yZXBvcnRfdGFnLAorCW1zZ19jX3JlcG9ydF9mcm9tX2ZpbGUsCisJbXNnX2NfcmVwb3J0X2ZpbGUsCisJbXNnX2NfcmVwb3J0X2xpbmUsCisJbXNnX2NfcmVwb3J0X2NwdV90b19taWNfZGF0YSwKKwltc2dfY19yZXBvcnRfbWljX3RvX2NwdV9kYXRhLAorCW1zZ19jX3JlcG9ydF9vZmZsb2FkLAorCW1zZ19jX3JlcG9ydF93X3RhZywKKwltc2dfY19yZXBvcnRfc3RhdGUsCisJbXNnX2NfcmVwb3J0X3N0YXJ0LAorCW1zZ19jX3JlcG9ydF9pbml0LAorCW1zZ19jX3JlcG9ydF9sb2dpY2FsX2NhcmQsCisJbXNnX2NfcmVwb3J0X3BoeXNpY2FsX2NhcmQsCisJbXNnX2NfcmVwb3J0X3JlZ2lzdGVyLAorCW1zZ19jX3JlcG9ydF9pbml0X2Z1bmMsCisJbXNnX2NfcmVwb3J0X2NyZWF0ZV9idWZfaG9zdCwKKwltc2dfY19yZXBvcnRfY3JlYXRlX2J1Zl9taWMsCisJbXNnX2NfcmVwb3J0X3NlbmRfcG9pbnRlcl9kYXRhLAorCW1zZ19jX3JlcG9ydF9zZW50X3BvaW50ZXJfZGF0YSwKKwltc2dfY19yZXBvcnRfZ2F0aGVyX2NvcHlpbl9kYXRhLAorCW1zZ19jX3JlcG9ydF9jb3B5aW5fZGF0YSwKKwltc2dfY19yZXBvcnRfc3RhdGVfc2lnbmFsLAorCW1zZ19jX3JlcG9ydF9zaWduYWwsCisJbXNnX2NfcmVwb3J0X3dhaXQsCisJbXNnX2NfcmVwb3J0X2NvbXB1dGUsCisJbXNnX2NfcmVwb3J0X3JlY2VpdmVfcG9pbnRlcl9kYXRhLAorCW1zZ19jX3JlcG9ydF9yZWNlaXZlZF9wb2ludGVyX2RhdGEsCisJbXNnX2NfcmVwb3J0X3N0YXJ0X3RhcmdldF9mdW5jLAorCW1zZ19jX3JlcG9ydF92YXIsCisJbXNnX2NfcmVwb3J0X3NjYXR0ZXJfY29weWluX2RhdGEsCisJbXNnX2NfcmVwb3J0X2dhdGhlcl9jb3B5b3V0X2RhdGEsCisJbXNnX2NfcmVwb3J0X3NjYXR0ZXJfY29weW91dF9kYXRhLAorCW1zZ19jX3JlcG9ydF9jb3B5b3V0X2RhdGEsCisJbXNnX2NfcmVwb3J0X3VucmVnaXN0ZXIsCisJbXNnX2NfcmVwb3J0X2Rlc3Ryb3ksCisJbXNnX2NfcmVwb3J0X215b2luaXQsCisJbXNnX2NfcmVwb3J0X215b3JlZ2lzdGVyLAorCW1zZ19jX3JlcG9ydF9teW9maW5pLAorCW1zZ19jX3JlcG9ydF9taWNfbXlvX3NoYXJlZCwKKwltc2dfY19yZXBvcnRfbWljX215b19mcHRyLAorCW1zZ19jX3JlcG9ydF9teW9zaGFyZWRtYWxsb2MsCisJbXNnX2NfcmVwb3J0X215b3NoYXJlZGZyZWUsCisJbXNnX2NfcmVwb3J0X215b3NoYXJlZGFsaWduZWRtYWxsb2MsCisJbXNnX2NfcmVwb3J0X215b3NoYXJlZGFsaWduZWRmcmVlLAorCW1zZ19jX3JlcG9ydF9teW9hY3F1aXJlLAorCW1zZ19jX3JlcG9ydF9teW9yZWxlYXNlLAorCW1zZ19jX3JlcG9ydF9ob3N0X3RvdGFsX29mZmxvYWRfdGltZSwKKwltc2dfY19yZXBvcnRfaG9zdF9pbml0aWFsaXplLAorCW1zZ19jX3JlcG9ydF9ob3N0X3RhcmdldF9hY3F1aXJlLAorCW1zZ19jX3JlcG9ydF9ob3N0X3dhaXRfZGVwcywKKwltc2dfY19yZXBvcnRfaG9zdF9zZXR1cF9idWZmZXJzLAorCW1zZ19jX3JlcG9ydF9ob3N0X2FsbG9jX2J1ZmZlcnMsCisJbXNnX2NfcmVwb3J0X2hvc3Rfc2V0dXBfbWlzY19kYXRhLAorCW1zZ19jX3JlcG9ydF9ob3N0X2FsbG9jX2RhdGFfYnVmZmVyLAorCW1zZ19jX3JlcG9ydF9ob3N0X3NlbmRfcG9pbnRlcnMsCisJbXNnX2NfcmVwb3J0X2hvc3RfZ2F0aGVyX2lucHV0cywKKwltc2dfY19yZXBvcnRfaG9zdF9tYXBfaW5fZGF0YV9idWZmZXIsCisJbXNnX2NfcmVwb3J0X2hvc3RfdW5tYXBfaW5fZGF0YV9idWZmZXIsCisJbXNnX2NfcmVwb3J0X2hvc3Rfc3RhcnRfY29tcHV0ZSwKKwltc2dfY19yZXBvcnRfaG9zdF93YWl0X2NvbXB1dGUsCisJbXNnX2NfcmVwb3J0X2hvc3Rfc3RhcnRfYnVmZmVyc19yZWFkcywKKwltc2dfY19yZXBvcnRfaG9zdF9zY2F0dGVyX291dHB1dHMsCisJbXNnX2NfcmVwb3J0X2hvc3RfbWFwX291dF9kYXRhX2J1ZmZlciwKKwltc2dfY19yZXBvcnRfaG9zdF91bm1hcF9vdXRfZGF0YV9idWZmZXIsCisJbXNnX2NfcmVwb3J0X2hvc3Rfd2FpdF9idWZmZXJzX3JlYWRzLAorCW1zZ19jX3JlcG9ydF9ob3N0X2Rlc3Ryb3lfYnVmZmVycywKKwltc2dfY19yZXBvcnRfdGFyZ2V0X3RvdGFsX3RpbWUsCisJbXNnX2NfcmVwb3J0X3RhcmdldF9kZXNjcmlwdG9yX3NldHVwLAorCW1zZ19jX3JlcG9ydF90YXJnZXRfZnVuY19sb29rdXAsCisJbXNnX2NfcmVwb3J0X3RhcmdldF9mdW5jX3RpbWUsCisJbXNnX2NfcmVwb3J0X3RhcmdldF9zY2F0dGVyX2lucHV0cywKKwltc2dfY19yZXBvcnRfdGFyZ2V0X2FkZF9idWZmZXJfcmVmcywKKwltc2dfY19yZXBvcnRfdGFyZ2V0X2NvbXB1dGUsCisJbXNnX2NfcmVwb3J0X3RhcmdldF9nYXRoZXJfb3V0cHV0cywKKwltc2dfY19yZXBvcnRfdGFyZ2V0X3JlbGVhc2VfYnVmZmVyX3JlZnMsCisJbXNnX2NfY29pX3BpcGVsaW5lX21heF9udW1iZXIsCisJbXNnX2NfcmFuZ2VzX2RvbnRfbWF0Y2gsCisJbXNnX2NfZGVzdGluYXRpb25faXNfb3ZlciwKKwltc2dfY19zbGljZV9vZl9ub25jb250X2FycmF5LAorCW1zZ19jX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsCisJbGFzdE1zZyA9IDE1MiwKKwlmaXJzdE1zZyA9IDEKK307CisKKworI2lmICFkZWZpbmVkKE1FU1NBR0VfVEFCTEVfTkFNRSkKKyMgICAgZGVmaW5lIE1FU1NBR0VfVEFCTEVfTkFNRSBfX2xpYm9mZmxvYWRfbWVzc2FnZV90YWJsZQorI2VuZGlmCisKK3N0YXRpYyBjaGFyIGNvbnN0ICogTUVTU0FHRV9UQUJMRV9OQU1FW10gPSB7CisJLyogICAwIF9fZHVtbXlfXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAiVW4tdXNlZCBtZXNzYWdlIiwKKwkvKiAgIDEgbXNnX2NfZGV2aWNlX2lzX25vdF9hdmFpbGFibGUgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3Qgb2ZmbG9hZCB0byBNSUMgLSBkZXZpY2UgaXMgbm90IGF2YWlsYWJsZSIsCisJLyogICAyIG1zZ19jX2ludmFsaWRfZGV2aWNlX251bWJlciAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogZXhwZWN0ZWQgYSBudW1iZXIgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIC0xIiwKKwkvKiAgIDMgbXNnX2Nfc2VuZF9mdW5jX3B0ciAgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3QgZmluZCBmdW5jdGlvbiBuYW1lIGZvciBhZGRyZXNzICVwIiwKKwkvKiAgIDQgbXNnX2NfcmVjZWl2ZV9mdW5jX3B0ciAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3QgZmluZCBhZGRyZXNzIG9mIGZ1bmN0aW9uICVzIiwKKwkvKiAgIDUgbXNnX2Nfb2ZmbG9hZF9tYWxsb2MgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgKHJlcXVlc3RlZD0lbGxkIGJ5dGVzLCBhbGlnbiAlbGxkKSIsCisJLyogICA2IG1zZ19jX29mZmxvYWQxICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogZGV2aWNlICVkIGRvZXMgbm90IGhhdmUgYSBwZW5kaW5nIHNpZ25hbCBmb3Igd2FpdCglcCkiLAorCS8qICAgNyBtc2dfY191bmtub3duX3Zhcl90eXBlICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IHVua25vd24gdmFyaWFibGUgdHlwZSAlZCIsCisJLyogICA4IG1zZ19jX2ludmFsaWRfZW52X3Zhcl92YWx1ZSAgICAgICAgICAgICAqLyAib2ZmbG9hZCB3YXJuaW5nOiBpZ25vcmluZyBpbnZhbGlkIHZhbHVlIHNwZWNpZmllZCBmb3IgJXMiLAorCS8qICAgOSBtc2dfY19pbnZhbGlkX2Vudl92YXJfaW50X3ZhbHVlICAgICAgICAgKi8gIm9mZmxvYWQgd2FybmluZzogc3BlY2lmeSBhbiBpbnRlZ2VyIHZhbHVlIGZvciAlcyIsCisJLyogIDEwIG1zZ19jX2ludmFsaWRfZW52X3JlcG9ydF92YWx1ZSAgICAgICAgICAqLyAib2ZmbG9hZCB3YXJuaW5nOiBpZ25vcmluZyAlcyBzZXR0aW5nOyB1c2UgYSB2YWx1ZSBpbiByYW5nZSAxLTMiLAorCS8qICAxMSBtc2dfY19vZmZsb2FkX3NpZ25hbGVkMSAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGludmFsaWQgZGV2aWNlIG51bWJlciAlZCBzcGVjaWZpZWQgaW4gX09mZmxvYWRfc2lnbmFsZWQiLAorCS8qICAxMiBtc2dfY19vZmZsb2FkX3NpZ25hbGVkMiAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGludmFsaWQgc2lnbmFsICVwIHNwZWNpZmllZCBmb3IgX09mZmxvYWRfc2lnbmFsZWQiLAorCS8qICAxMyBtc2dfY19teW93cmFwcGVyX2NoZWNrcmVzdWx0ICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6ICVzIGZhaWxlZCB3aXRoIGVycm9yICVkIiwKKwkvKiAgMTQgbXNnX2NfbXlvdGFyZ2V0X2NoZWNrcmVzdWx0ICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiAlcyBmYWlsZWQgd2l0aCBlcnJvciAlZCIsCisJLyogIDE1IG1zZ19jX29mZmxvYWRfZGVzY3JpcHRvcl9vZmZsb2FkICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IGZpbmQgb2ZmbG9hZCBlbnRyeSAlcyIsCisJLyogIDE2IG1zZ19jX21lcmdlX3Zhcl9kZXNjczEgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogdW5leHBlY3RlZCBudW1iZXIgb2YgdmFyaWFibGUgZGVzY3JpcHRvcnMiLAorCS8qICAxNyBtc2dfY19tZXJnZV92YXJfZGVzY3MyICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IHVuZXhwZWN0ZWQgdmFyaWFibGUgdHlwZSIsCisJLyogIDE4IG1zZ19jX21pY19wYXJzZV9lbnZfdmFyX2xpc3QxICAgICAgICAgICAqLyAib2ZmbG9hZF9lcnJvcjogTUlDIGVudmlyb25tZW50IHZhcmlhYmxlIG11c3QgYmVnaW4gd2l0aCBhbiBhbHBhYmV0aWMgY2hhcmFjdGVyIiwKKwkvKiAgMTkgbXNnX2NfbWljX3BhcnNlX2Vudl92YXJfbGlzdDIgICAgICAgICAgICovICJvZmZsb2FkX2Vycm9yOiBNSUMgZW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQgd2l0aCCRPZIiLAorCS8qICAyMCBtc2dfY19taWNfcHJvY2Vzc19leGl0X3JldCAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IHByb2Nlc3Mgb24gdGhlIGRldmljZSAlZCB1bmV4cGVjdGVkbHkgZXhpdGVkIHdpdGggY29kZSAlZCIsCisJLyogIDIxIG1zZ19jX21pY19wcm9jZXNzX2V4aXRfc2lnICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogcHJvY2VzcyBvbiB0aGUgZGV2aWNlICVkIHdhcyB0ZXJtaW5hdGVkIGJ5IHNpZ25hbCAlZCAoJXMpIiwKKwkvKiAgMjIgbXNnX2NfbWljX3Byb2Nlc3NfZXhpdCAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBwcm9jZXNzIG9uIHRoZSBkZXZpY2UgJWQgd2FzIHVuZXhwZWN0ZWRseSB0ZXJtaW5hdGVkIiwKKwkvKiAgMjMgbXNnX2NfbWljX2luaXQzICAgICAgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIHdhcm5pbmc6IGlnbm9yaW5nIE1JQ19TVEFDS1NJWkUgc2V0dGluZzsgdXNlIGEgdmFsdWUgPj0gMTZLIGFuZCBhIG11bHRpcGxlIG9mIDRLIiwKKwkvKiAgMjQgbXNnX2NfbWljX2luaXQ0ICAgICAgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiB0aHJlYWQga2V5IGNyZWF0ZSBmYWlsZWQgd2l0aCBlcnJvciAlZCIsCisJLyogIDI1IG1zZ19jX21pY19pbml0NSAgICAgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCB3YXJuaW5nOiBzcGVjaWZ5IE9GRkxPQURfREVWSUNFUyBhcyBjb21tYS1zZXBhcmF0ZWQgcGh5c2ljYWwgZGV2aWNlIG51bWJlcnMgb3IgJ25vbmUnIiwKKwkvKiAgMjYgbXNnX2NfbWljX2luaXQ2ICAgICAgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIHdhcm5pbmc6IE9GRkxPQURfREVWSUNFUyBkZXZpY2UgbnVtYmVyICVkIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBwaHlzaWNhbCBkZXZpY2UiLAorCS8qICAyNyBtc2dfY19ub19zdGF0aWNfdmFyX2RhdGEgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBmaW5kIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHN0YXRpY2FsbHkgYWxsb2NhdGVkIHZhcmlhYmxlICVwIiwKKwkvKiAgMjggbXNnX2Nfbm9fcHRyX2RhdGEgICAgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3QgZmluZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCBwb2ludGVyIHZhcmlhYmxlICVwIiwKKwkvKiAgMjkgbXNnX2NfZ2V0X2VuZ2luZV9oYW5kbGUgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3QgZ2V0IGRldmljZSAlZCBoYW5kbGUgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgMzAgbXNnX2NfZ2V0X2VuZ2luZV9pbmRleCAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3QgZ2V0IHBoeXNpY2FsIGluZGV4IGZvciBsb2dpY2FsIGRldmljZSAlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICAzMSBtc2dfY19wcm9jZXNzX2NyZWF0ZSAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBzdGFydCBwcm9jZXNzIG9uIHRoZSBkZXZpY2UgJWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgMzIgbXNnX2NfcHJvY2Vzc19nZXRfZnVuY19oYW5kbGVzICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3QgZ2V0IGZ1bmN0aW9uIGhhbmRsZXMgb24gdGhlIGRldmljZSAlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICAzMyBtc2dfY19wcm9jZXNzX3dhaXRfc2h1dGRvd24gICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IHdhaXQgZm9yIHByb2Nlc3Mgc2h1dGRvd24gZmFpbGVkIG9uIGRldmljZSAlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICAzNCBtc2dfY19wcm9jZXNzX3Byb3h5X2ZsdXNoICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBmbHVzaCBwcm9jZXNzIG91dHB1dCBvbiBkZXZpY2UgJWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgMzUgbXNnX2NfbG9hZF9saWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3QgbG9hZCBsaWJyYXJ5IHRvIHRoZSBkZXZpY2UgJWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgMzYgbXNnX2NfcGlwZWxpbmVfY3JlYXRlICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3QgY3JlYXRlIHBpcGVsaW5lIG9uIHRoZSBkZXZpY2UgJWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgMzcgbXNnX2NfcGlwZWxpbmVfcnVuX2Z1bmMgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3QgZXhlY3V0ZSBmdW5jdGlvbiBvbiB0aGUgZGV2aWNlICVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDM4IG1zZ19jX3BpcGVsaW5lX3N0YXJ0X3J1bl9mdW5jcyAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IHN0YXJ0IGV4ZWN1dGluZyBwaXBlbGluZSBmdW5jdGlvbiBvbiB0aGUgZGV2aWNlICVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDM5IG1zZ19jX2J1Zl9jcmVhdGUgICAgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IGNyZWF0ZSBidWZmZXIgb24gZGV2aWNlICVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDQwIG1zZ19jX2J1Zl9jcmVhdGVfb3V0X29mX21lbSAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IGNyZWF0ZSBidWZmZXIgb24gZGV2aWNlICVkLCBvdXQgb2YgbWVtb3J5IiwKKwkvKiAgNDEgbXNnX2NfYnVmX2NyZWF0ZV9mcm9tX21lbSAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3QgY3JlYXRlIGJ1ZmZlciBmcm9tIG1lbW9yeSBvbiBkZXZpY2UgJWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgNDIgbXNnX2NfYnVmX2Rlc3Ryb3kgICAgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBidWZmZXIgZGVzdHJveSBmYWlsZWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgNDMgbXNnX2NfYnVmX21hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBidWZmZXIgbWFwIGZhaWxlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICA0NCBtc2dfY19idWZfdW5tYXAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGJ1ZmZlciB1bm1hcCBmYWlsZWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgNDUgbXNnX2NfYnVmX3JlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBidWZmZXIgcmVhZCBmYWlsZWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgNDYgbXNnX2NfYnVmX3dyaXRlICAgICAgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBidWZmZXIgd3JpdGUgZmFpbGVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDQ3IG1zZ19jX2J1Zl9jb3B5ICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogYnVmZmVyIGNvcHkgZmFpbGVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDQ4IG1zZ19jX2J1Zl9nZXRfYWRkcmVzcyAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IGdldCBidWZmZXIgYWRkcmVzcyBvbiBkZXZpY2UgJWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgNDkgbXNnX2NfYnVmX2FkZF9yZWYgICAgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3QgcmV1c2UgYnVmZmVyIG1lbW9yeSBvbiBkZXZpY2UgJWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgNTAgbXNnX2NfYnVmX3JlbGVhc2VfcmVmICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3QgcmVsZWFzZSBidWZmZXIgbWVtb3J5IG9uIGRldmljZSAlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICA1MSBtc2dfY19idWZfc2V0X3N0YXRlICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGJ1ZmZlciBzZXQgc3RhdGUgZmFpbGVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDUyIG1zZ19jX2V2ZW50X3dhaXQgICAgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogd2FpdCBmb3IgZXZlbnQgdG8gYmVjb21lIHNpZ25hbGVkIGZhaWxlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICA1MyBtc2dfY196ZXJvX29yX25lZ19wdHJfbGVuICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IG1lbW9yeSBhbGxvY2F0aW9uIG9mIG5lZ2F0aXZlIGxlbmd0aCBpcyBub3Qgc3VwcG9ydGVkIiwKKwkvKiAgNTQgbXNnX2NfemVyb19vcl9uZWdfdHJhbnNmZXJfc2l6ZSAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBkYXRhIHRyYW5zZmVyIG9mIHplcm8gb3IgbmVnYXRpdmUgc2l6ZSBpcyBub3Qgc3VwcG9ydGVkIiwKKwkvKiAgNTUgbXNnX2NfYmFkX3B0cl9tZW1fcmFuZ2UgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBhZGRyZXNzIHJhbmdlIHBhcnRpYWxseSBvdmVybGFwcyB3aXRoIGV4aXN0aW5nIGFsbG9jYXRpb24iLAorCS8qICA1NiBtc2dfY19kaWZmZXJlbnRfc3JjX2FuZF9kc3RuX3NpemVzICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IHNpemUgb2YgdGhlIHNvdXJjZSAlZCBkaWZmZXJzIGZyb20gc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gJWQiLAorCS8qICA1NyBtc2dfY19ub25fY29udGlndW91c19kb3BlX3ZlY3RvciAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IG9mZmxvYWQgZGF0YSB0cmFuc2ZlciBzdXBwb3J0cyBvbmx5IGEgc2luZ2xlIGNvbnRpZ3VvdXMgbWVtb3J5IHJhbmdlIHBlciB2YXJpYWJsZSIsCisJLyogIDU4IG1zZ19jX29tcF9pbnZhbGlkX2RldmljZV9udW1fZW52ICAgICAgICAqLyAib2ZmbG9hZCB3YXJuaW5nOiBpZ25vcmluZyAlcyBzZXR0aW5nOyB1c2UgYSBub24tbmVnYXRpdmUgaW50ZWdlciB2YWx1ZSIsCisJLyogIDU5IG1zZ19jX29tcF9pbnZhbGlkX2RldmljZV9udW0gICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogZGV2aWNlIG51bWJlciBzaG91bGQgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciB2YWx1ZSIsCisJLyogIDYwIG1zZ19jX3Vua25vd25fYmluYXJ5X3R5cGUgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogdW5leHBlY3RlZCBlbWJlZGRlZCB0YXJnZXQgYmluYXJ5IHR5cGUsIGV4cGVjdGVkIGVpdGhlciBhbiBleGVjdXRhYmxlIG9yIHNoYXJlZCBsaWJyYXJ5IiwKKwkvKiAgNjEgbXNnX2NfbXVsdGlwbGVfdGFyZ2V0X2V4ZXMgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBtb3JlIHRoYXQgb25lIHRhcmdldCBleGVjdXRhYmxlIGZvdW5kIiwKKwkvKiAgNjIgbXNnX2Nfbm9fdGFyZ2V0X2V4ZSAgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiB0YXJnZXQgZXhlY3V0YWJsZSBpcyBub3QgYXZhaWxhYmxlIiwKKwkvKiAgNjMgbXNnX2NfcmVwb3J0X3Vua25vd25fdGltZXJfbm9kZSAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiB1bmtub3duIHRpbWVyIG5vZGUiLAorCS8qICA2NCBtc2dfY19yZXBvcnRfdW5rbm93bl90cmFjZV9ub2RlICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IHVua25vd24gdHJhY2Ugbm9kZSIsCisJLyogIDY1IG1zZ19jX3JlcG9ydF9ob3N0ICAgICAgICAgICAgICAgICAgICAgICAqLyAiSE9TVCIsCisJLyogIDY2IG1zZ19jX3JlcG9ydF9taWMgICAgICAgICAgICAgICAgICAgICAgICAqLyAiTUlDIiwKKwkvKiAgNjcgbXNnX2NfcmVwb3J0X3RpdGxlICAgICAgICAgICAgICAgICAgICAgICovICJ0aW1lciBkYXRhICAgICAgIChzZWMpIiwKKwkvKiAgNjggbXNnX2NfcmVwb3J0X3NlY29uZHMgICAgICAgICAgICAgICAgICAgICovICIoc2Vjb25kcykiLAorCS8qICA2OSBtc2dfY19yZXBvcnRfYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgKi8gIihieXRlcykiLAorCS8qICA3MCBtc2dfY19yZXBvcnRfY3B1X3RpbWUgICAgICAgICAgICAgICAgICAgKi8gIkNQVSBUaW1lIiwKKwkvKiAgNzEgbXNnX2NfcmVwb3J0X21pY190aW1lICAgICAgICAgICAgICAgICAgICovICJNSUMgVGltZSIsCisJLyogIDcyIG1zZ19jX3JlcG9ydF90YWcgICAgICAgICAgICAgICAgICAgICAgICAqLyAiVGFnIiwKKwkvKiAgNzMgbXNnX2NfcmVwb3J0X2Zyb21fZmlsZSAgICAgICAgICAgICAgICAgICovICJPZmZsb2FkIGZyb20gZmlsZSIsCisJLyogIDc0IG1zZ19jX3JlcG9ydF9maWxlICAgICAgICAgICAgICAgICAgICAgICAqLyAiRmlsZSIsCisJLyogIDc1IG1zZ19jX3JlcG9ydF9saW5lICAgICAgICAgICAgICAgICAgICAgICAqLyAiTGluZSIsCisJLyogIDc2IG1zZ19jX3JlcG9ydF9jcHVfdG9fbWljX2RhdGEgICAgICAgICAgICAqLyAiQ1BVLT5NSUMgRGF0YSIsCisJLyogIDc3IG1zZ19jX3JlcG9ydF9taWNfdG9fY3B1X2RhdGEgICAgICAgICAgICAqLyAiTUlDLT5DUFUgRGF0YSIsCisJLyogIDc4IG1zZ19jX3JlcG9ydF9vZmZsb2FkICAgICAgICAgICAgICAgICAgICAqLyAiT2ZmbG9hZCIsCisJLyogIDc5IG1zZ19jX3JlcG9ydF93X3RhZyAgICAgICAgICAgICAgICAgICAgICAqLyAiVGFnICVkIiwKKwkvKiAgODAgbXNnX2NfcmVwb3J0X3N0YXRlICAgICAgICAgICAgICAgICAgICAgICovICJTdGF0ZSIsCisJLyogIDgxIG1zZ19jX3JlcG9ydF9zdGFydCAgICAgICAgICAgICAgICAgICAgICAqLyAiU3RhcnQgdGFyZ2V0IiwKKwkvKiAgODIgbXNnX2NfcmVwb3J0X2luaXQgICAgICAgICAgICAgICAgICAgICAgICovICJJbml0aWFsaXplIiwKKwkvKiAgODMgbXNnX2NfcmVwb3J0X2xvZ2ljYWxfY2FyZCAgICAgICAgICAgICAgICovICJsb2dpY2FsIGNhcmQiLAorCS8qICA4NCBtc2dfY19yZXBvcnRfcGh5c2ljYWxfY2FyZCAgICAgICAgICAgICAgKi8gInBoeXNpY2FsIGNhcmQiLAorCS8qICA4NSBtc2dfY19yZXBvcnRfcmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgKi8gIlJlZ2lzdGVyIHN0YXRpYyBkYXRhIHRhYmxlcyIsCisJLyogIDg2IG1zZ19jX3JlcG9ydF9pbml0X2Z1bmMgICAgICAgICAgICAgICAgICAqLyAiU2V0dXAgdGFyZ2V0IGVudHJ5IiwKKwkvKiAgODcgbXNnX2NfcmVwb3J0X2NyZWF0ZV9idWZfaG9zdCAgICAgICAgICAgICovICJDcmVhdGUgaG9zdCBidWZmZXIiLAorCS8qICA4OCBtc2dfY19yZXBvcnRfY3JlYXRlX2J1Zl9taWMgICAgICAgICAgICAgKi8gIkNyZWF0ZSB0YXJnZXQgYnVmZmVyIiwKKwkvKiAgODkgbXNnX2NfcmVwb3J0X3NlbmRfcG9pbnRlcl9kYXRhICAgICAgICAgICovICJTZW5kIHBvaW50ZXIgZGF0YSIsCisJLyogIDkwIG1zZ19jX3JlcG9ydF9zZW50X3BvaW50ZXJfZGF0YSAgICAgICAgICAqLyAiSG9zdC0+dGFyZ2V0IHBvaW50ZXIgZGF0YSIsCisJLyogIDkxIG1zZ19jX3JlcG9ydF9nYXRoZXJfY29weWluX2RhdGEgICAgICAgICAqLyAiR2F0aGVyIGNvcHlpbiBkYXRhIiwKKwkvKiAgOTIgbXNnX2NfcmVwb3J0X2NvcHlpbl9kYXRhICAgICAgICAgICAgICAgICovICJIb3N0LT50YXJnZXQgY29weWluIGRhdGEiLAorCS8qICA5MyBtc2dfY19yZXBvcnRfc3RhdGVfc2lnbmFsICAgICAgICAgICAgICAgKi8gIlNpZ25hbCIsCisJLyogIDk0IG1zZ19jX3JlcG9ydF9zaWduYWwgICAgICAgICAgICAgICAgICAgICAqLyAic2lnbmFsIDoiLAorCS8qICA5NSBtc2dfY19yZXBvcnRfd2FpdCAgICAgICAgICAgICAgICAgICAgICAgKi8gIndhaXRzICA6IiwKKwkvKiAgOTYgbXNnX2NfcmVwb3J0X2NvbXB1dGUgICAgICAgICAgICAgICAgICAgICovICJFeGVjdXRlIHRhc2sgb24gdGFyZ2V0IiwKKwkvKiAgOTcgbXNnX2NfcmVwb3J0X3JlY2VpdmVfcG9pbnRlcl9kYXRhICAgICAgICovICJSZWNlaXZlIHBvaW50ZXIgZGF0YSIsCisJLyogIDk4IG1zZ19jX3JlcG9ydF9yZWNlaXZlZF9wb2ludGVyX2RhdGEgICAgICAqLyAiVGFyZ2V0LT5ob3N0IHBvaW50ZXIgZGF0YSIsCisJLyogIDk5IG1zZ19jX3JlcG9ydF9zdGFydF90YXJnZXRfZnVuYyAgICAgICAgICAqLyAiU3RhcnQgdGFyZ2V0IGVudHJ5IiwKKwkvKiAxMDAgbXNnX2NfcmVwb3J0X3ZhciAgICAgICAgICAgICAgICAgICAgICAgICovICJWYXIiLAorCS8qIDEwMSBtc2dfY19yZXBvcnRfc2NhdHRlcl9jb3B5aW5fZGF0YSAgICAgICAgKi8gIlNjYXR0ZXIgY29weWluIGRhdGEiLAorCS8qIDEwMiBtc2dfY19yZXBvcnRfZ2F0aGVyX2NvcHlvdXRfZGF0YSAgICAgICAgKi8gIkdhdGhlciBjb3B5b3V0IGRhdGEiLAorCS8qIDEwMyBtc2dfY19yZXBvcnRfc2NhdHRlcl9jb3B5b3V0X2RhdGEgICAgICAgKi8gIlNjYXR0ZXIgY29weW91dCBkYXRhIiwKKwkvKiAxMDQgbXNnX2NfcmVwb3J0X2NvcHlvdXRfZGF0YSAgICAgICAgICAgICAgICovICJUYXJnZXQtPmhvc3QgY29weW91dCBkYXRhIiwKKwkvKiAxMDUgbXNnX2NfcmVwb3J0X3VucmVnaXN0ZXIgICAgICAgICAgICAgICAgICovICJVbnJlZ2lzdGVyIGRhdGEgdGFibGVzIiwKKwkvKiAxMDYgbXNnX2NfcmVwb3J0X2Rlc3Ryb3kgICAgICAgICAgICAgICAgICAgICovICJEZXN0cm95IiwKKwkvKiAxMDcgbXNnX2NfcmVwb3J0X215b2luaXQgICAgICAgICAgICAgICAgICAgICovICJJbml0aWFsaXplIE1ZTyIsCisJLyogMTA4IG1zZ19jX3JlcG9ydF9teW9yZWdpc3RlciAgICAgICAgICAgICAgICAqLyAiUmVnaXN0ZXIgTVlPIHRhYmxlcyIsCisJLyogMTA5IG1zZ19jX3JlcG9ydF9teW9maW5pICAgICAgICAgICAgICAgICAgICAqLyAiRmluYWxpemUgTVlPIiwKKwkvKiAxMTAgbXNnX2NfcmVwb3J0X21pY19teW9fc2hhcmVkICAgICAgICAgICAgICovICJNSUMgTVlPIHNoYXJlZCB0YWJsZSByZWdpc3RlciIsCisJLyogMTExIG1zZ19jX3JlcG9ydF9taWNfbXlvX2ZwdHIgICAgICAgICAgICAgICAqLyAiTUlDIE1ZTyBmcHRyIHRhYmxlIHJlZ2lzdGVyIiwKKwkvKiAxMTIgbXNnX2NfcmVwb3J0X215b3NoYXJlZG1hbGxvYyAgICAgICAgICAgICovICJNWU8gc2hhcmVkIG1hbGxvYyIsCisJLyogMTEzIG1zZ19jX3JlcG9ydF9teW9zaGFyZWRmcmVlICAgICAgICAgICAgICAqLyAiTVlPIHNoYXJlZCBmcmVlIiwKKwkvKiAxMTQgbXNnX2NfcmVwb3J0X215b3NoYXJlZGFsaWduZWRtYWxsb2MgICAgICovICJNWU8gc2hhcmVkIGFsaWduZWQgbWFsbG9jIiwKKwkvKiAxMTUgbXNnX2NfcmVwb3J0X215b3NoYXJlZGFsaWduZWRmcmVlICAgICAgICovICJNWU8gc2hhcmVkIGFsaWduZWQgZnJlZSIsCisJLyogMTE2IG1zZ19jX3JlcG9ydF9teW9hY3F1aXJlICAgICAgICAgICAgICAgICAqLyAiTVlPIGFjcXVpcmUiLAorCS8qIDExNyBtc2dfY19yZXBvcnRfbXlvcmVsZWFzZSAgICAgICAgICAgICAgICAgKi8gIk1ZTyByZWxlYXNlIiwKKwkvKiAxMTggbXNnX2NfcmVwb3J0X2hvc3RfdG90YWxfb2ZmbG9hZF90aW1lICAgICovICJob3N0OiB0b3RhbCBvZmZsb2FkIHRpbWUiLAorCS8qIDExOSBtc2dfY19yZXBvcnRfaG9zdF9pbml0aWFsaXplICAgICAgICAgICAgKi8gImhvc3Q6IGluaXRpYWxpemUgdGFyZ2V0IiwKKwkvKiAxMjAgbXNnX2NfcmVwb3J0X2hvc3RfdGFyZ2V0X2FjcXVpcmUgICAgICAgICovICJob3N0OiBhY3F1aXJlIHRhcmdldCIsCisJLyogMTIxIG1zZ19jX3JlcG9ydF9ob3N0X3dhaXRfZGVwcyAgICAgICAgICAgICAqLyAiaG9zdDogd2FpdCBkZXBlbmRlbmNpZXMiLAorCS8qIDEyMiBtc2dfY19yZXBvcnRfaG9zdF9zZXR1cF9idWZmZXJzICAgICAgICAgKi8gImhvc3Q6IHNldHVwIGJ1ZmZlcnMiLAorCS8qIDEyMyBtc2dfY19yZXBvcnRfaG9zdF9hbGxvY19idWZmZXJzICAgICAgICAgKi8gImhvc3Q6IGFsbG9jYXRlIGJ1ZmZlcnMiLAorCS8qIDEyNCBtc2dfY19yZXBvcnRfaG9zdF9zZXR1cF9taXNjX2RhdGEgICAgICAgKi8gImhvc3Q6IHNldHVwIG1pc2NfZGF0YSIsCisJLyogMTI1IG1zZ19jX3JlcG9ydF9ob3N0X2FsbG9jX2RhdGFfYnVmZmVyICAgICAqLyAiaG9zdDogYWxsb2NhdGUgYnVmZmVyIiwKKwkvKiAxMjYgbXNnX2NfcmVwb3J0X2hvc3Rfc2VuZF9wb2ludGVycyAgICAgICAgICovICJob3N0OiBzZW5kIHBvaW50ZXJzIiwKKwkvKiAxMjcgbXNnX2NfcmVwb3J0X2hvc3RfZ2F0aGVyX2lucHV0cyAgICAgICAgICovICJob3N0OiBnYXRoZXIgaW5wdXRzIiwKKwkvKiAxMjggbXNnX2NfcmVwb3J0X2hvc3RfbWFwX2luX2RhdGFfYnVmZmVyICAgICovICJob3N0OiBtYXAgSU4gZGF0YSBidWZmZXIiLAorCS8qIDEyOSBtc2dfY19yZXBvcnRfaG9zdF91bm1hcF9pbl9kYXRhX2J1ZmZlciAgKi8gImhvc3Q6IHVubWFwIElOIGRhdGEgYnVmZmVyIiwKKwkvKiAxMzAgbXNnX2NfcmVwb3J0X2hvc3Rfc3RhcnRfY29tcHV0ZSAgICAgICAgICovICJob3N0OiBpbml0aWF0ZSBjb21wdXRlIiwKKwkvKiAxMzEgbXNnX2NfcmVwb3J0X2hvc3Rfd2FpdF9jb21wdXRlICAgICAgICAgICovICJob3N0OiB3YWl0IGNvbXB1dGUiLAorCS8qIDEzMiBtc2dfY19yZXBvcnRfaG9zdF9zdGFydF9idWZmZXJzX3JlYWRzICAgKi8gImhvc3Q6IGluaXRpYXRlIHBvaW50ZXIgcmVhZHMiLAorCS8qIDEzMyBtc2dfY19yZXBvcnRfaG9zdF9zY2F0dGVyX291dHB1dHMgICAgICAgKi8gImhvc3Q6IHNjYXR0ZXIgb3V0cHV0cyIsCisJLyogMTM0IG1zZ19jX3JlcG9ydF9ob3N0X21hcF9vdXRfZGF0YV9idWZmZXIgICAqLyAiaG9zdDogbWFwIE9VVCBkYXRhIGJ1ZmZlciIsCisJLyogMTM1IG1zZ19jX3JlcG9ydF9ob3N0X3VubWFwX291dF9kYXRhX2J1ZmZlciAqLyAiaG9zdDogdW5tYXAgT1VUIGRhdGEgYnVmZmVyIiwKKwkvKiAxMzYgbXNnX2NfcmVwb3J0X2hvc3Rfd2FpdF9idWZmZXJzX3JlYWRzICAgICovICJob3N0OiB3YWl0IHBvaW50ZXIgcmVhZHMiLAorCS8qIDEzNyBtc2dfY19yZXBvcnRfaG9zdF9kZXN0cm95X2J1ZmZlcnMgICAgICAgKi8gImhvc3Q6IGRlc3Ryb3kgYnVmZmVycyIsCisJLyogMTM4IG1zZ19jX3JlcG9ydF90YXJnZXRfdG90YWxfdGltZSAgICAgICAgICAqLyAidGFyZ2V0OiB0b3RhbCB0aW1lIiwKKwkvKiAxMzkgbXNnX2NfcmVwb3J0X3RhcmdldF9kZXNjcmlwdG9yX3NldHVwICAgICovICJ0YXJnZXQ6IHNldHVwIG9mZmxvYWQgZGVzY3JpcHRvciIsCisJLyogMTQwIG1zZ19jX3JlcG9ydF90YXJnZXRfZnVuY19sb29rdXAgICAgICAgICAqLyAidGFyZ2V0OiBlbnRyeSBsb29rdXAiLAorCS8qIDE0MSBtc2dfY19yZXBvcnRfdGFyZ2V0X2Z1bmNfdGltZSAgICAgICAgICAgKi8gInRhcmdldDogZW50cnkgdGltZSIsCisJLyogMTQyIG1zZ19jX3JlcG9ydF90YXJnZXRfc2NhdHRlcl9pbnB1dHMgICAgICAqLyAidGFyZ2V0OiBzY2F0dGVyIGlucHV0cyIsCisJLyogMTQzIG1zZ19jX3JlcG9ydF90YXJnZXRfYWRkX2J1ZmZlcl9yZWZzICAgICAqLyAidGFyZ2V0OiBhZGQgYnVmZmVyIHJlZmVyZW5jZSIsCisJLyogMTQ0IG1zZ19jX3JlcG9ydF90YXJnZXRfY29tcHV0ZSAgICAgICAgICAgICAqLyAidGFyZ2V0OiBjb21wdXRlIiwKKwkvKiAxNDUgbXNnX2NfcmVwb3J0X3RhcmdldF9nYXRoZXJfb3V0cHV0cyAgICAgICovICJ0YXJnZXQ6IGdhdGhlciBvdXRwdXRzIiwKKwkvKiAxNDYgbXNnX2NfcmVwb3J0X3RhcmdldF9yZWxlYXNlX2J1ZmZlcl9yZWZzICovICJ0YXJnZXQ6IHJlbW92ZSBidWZmZXIgcmVmZXJlbmNlIiwKKwkvKiAxNDcgbXNnX2NfY29pX3BpcGVsaW5lX21heF9udW1iZXIgICAgICAgICAgICovICJudW1iZXIgb2YgaG9zdCB0aHJlYWRzIGRvaW5nIG9mZmxvYWQgZXhjZWVkcyBtYXhpbXVtIG9mICVkIiwKKwkvKiAxNDggbXNnX2NfcmFuZ2VzX2RvbnRfbWF0Y2ggICAgICAgICAgICAgICAgICovICJyYW5nZXMgb2Ygc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkb24ndCBtYXRjaCB0b2dldGhlciIsCisJLyogMTQ5IG1zZ19jX2Rlc3RpbmF0aW9uX2lzX292ZXIgICAgICAgICAgICAgICAqLyAiaW5zdWZmaWNpZW50IGRlc3RpbmF0aW9uIG1lbW9yeSB0byB0cmFuc2ZlciBzb3VyY2UiLAorCS8qIDE1MCBtc2dfY19zbGljZV9vZl9ub25jb250X2FycmF5ICAgICAgICAgICAgKi8gImEgbm9uLWNvbnRpZ3VvdXMgc2xpY2UgbWF5IGJlIHRha2VuIG9mIGNvbnRpZ3VvdXMgYXJyYXlzIG9ubHkiLAorCS8qIDE1MSBtc2dfY19wb2ludGVyX2FycmF5X21pc21hdGNoICAgICAgICAgICAgKi8gIm51bWJlciBvZiAlcyBlbGVtZW50cyBpcyBsZXNzIHRoYW4gZGVzY3JpYmVkIGJ5IHRoZSBzb3VyY2UiLAorfTsKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL21pY19saWIuZjkwIGIvZmluYWwvb2ZmbG9hZC9zcmMvbWljX2xpYi5mOTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMyZTRkZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL21pY19saWIuZjkwCkBAIC0wLDAgKzEsNDQxIEBACishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKworISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCishICogVGhpcyBmaWxlIGlzIGludGVuZGVkIHRvIHN1cHBvcnQgdGhlIEludGVsKHIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZS4KKyEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorISBmcmVlIGZvcm0gRm9ydHJhbiBzb3VyY2UgLSBzaG91bGQgYmUgbmFtZWQgLmY5MAorISBsaW5lcyBhcmUgbG9uZ2VyIHRoYW4gNzIgY2hhcmFjdGVycworCittb2R1bGUgbWljX2xpYgordXNlLCBpbnRyaW5zaWMgOjogaXNvX2NfYmluZGluZworCitpbnRlZ2VyLCBwYXJhbWV0ZXI6OiB0YXJnZXRfbWljPTIKK2ludGVnZXIsIHBhcmFtZXRlcjo6IGRlZmF1bHRfdGFyZ2V0X3R5cGU9dGFyZ2V0X21pYworaW50ZWdlciwgcGFyYW1ldGVyOjogZGVmYXVsdF90YXJnZXRfbnVtYmVyPTAKKworZW51bSwgYmluZChDKQorICAgIGVudW1lcmF0b3IgOjogT0ZGTE9BRF9TVUNDRVNTICA9IDAKKyAgICBlbnVtZXJhdG9yIDo6IE9GRkxPQURfRElTQUJMRUQgICAgICAgICAgISBvZmZsb2FkIGlzIGRpc2FibGVkCisgICAgZW51bWVyYXRvciA6OiBPRkZMT0FEX1VOQVZBSUxBQkxFICAgICAgICEgY2FyZCBpcyBub3QgYXZhaWxhYmxlCisgICAgZW51bWVyYXRvciA6OiBPRkZMT0FEX09VVF9PRl9NRU1PUlkgICAgICEgbm90IGVub3VnaCBtZW1vcnkgb24gZGV2aWNlCisgICAgZW51bWVyYXRvciA6OiBPRkZMT0FEX1BST0NFU1NfRElFRCAgICAgICEgdGFyZ2V0IHByb2Nlc3MgaGFzIGRpZWQKKyAgICBlbnVtZXJhdG9yIDo6IE9GRkxPQURfRVJST1IgICAgICAgICAgICAgISB1bnNwZWNpZmllZCBlcnJvcgorZW5kIGVudW0KKwordHlwZSwgYmluZCAoQykgOjogb2ZmbG9hZF9zdGF0dXMKKyAgICBpbnRlZ2VyKGtpbmQ9Y19pbnQpICAgIDo6ICByZXN1bHQgICAgICAgICAgPSBPRkZMT0FEX0RJU0FCTEVECisgICAgaW50ZWdlcihraW5kPWNfaW50KSAgICA6OiAgZGV2aWNlX251bWJlciAgID0gLTEKKyAgICBpbnRlZ2VyKGtpbmQ9Y19zaXplX3QpIDo6ICBkYXRhX3NlbnQgICAgICAgPSAwCisgICAgaW50ZWdlcihraW5kPWNfc2l6ZV90KSA6OiAgZGF0YV9yZWNlaXZlZCAgID0gMAorZW5kIHR5cGUgb2ZmbG9hZF9zdGF0dXMKKworaW50ZXJmYWNlCitmdW5jdGlvbiBvZmZsb2FkX251bWJlcl9vZl9kZXZpY2VzICgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJfT2ZmbG9hZF9udW1iZXJfb2ZfZGV2aWNlcyIpCishZGVjJCBhdHRyaWJ1dGVzIGRlZmF1bHQgOjogb2ZmbG9hZF9udW1iZXJfb2ZfZGV2aWNlcworICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IG9mZmxvYWRfbnVtYmVyX29mX2RldmljZXMKKyFkZWMkIGF0dHJpYnV0ZXMgb2ZmbG9hZDptaWMgOjogb2ZmbG9hZF9udW1iZXJfb2ZfZGV2aWNlcworIWRpciQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogIG9mZmxvYWRfbnVtYmVyX29mX2RldmljZXMKK2VuZCBmdW5jdGlvbiBvZmZsb2FkX251bWJlcl9vZl9kZXZpY2VzCisKK2Z1bmN0aW9uIG9mZmxvYWRfc2lnbmFsZWQodGFyZ2V0X251bWJlciwgc2lnbmFsKSAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIl9PZmZsb2FkX3NpZ25hbGVkIikKKyFkZWMkIGF0dHJpYnV0ZXMgZGVmYXVsdCA6OiBvZmZsb2FkX3NpZ25hbGVkCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnQ2NF90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpIDo6IG9mZmxvYWRfc2lnbmFsZWQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludDY0X3QpLCB2YWx1ZSA6OiBzaWduYWwKKyFkZWMkIGF0dHJpYnV0ZXMgb2ZmbG9hZDptaWMgOjogb2ZmbG9hZF9zaWduYWxlZAorZW5kIGZ1bmN0aW9uIG9mZmxvYWRfc2lnbmFsZWQKKworc3Vicm91dGluZSBvZmZsb2FkX3JlcG9ydCh2YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAiX09mZmxvYWRfcmVwb3J0IikKKyFkZWMkIGF0dHJpYnV0ZXMgZGVmYXVsdCA6OiBvZmZsb2FkX3JlcG9ydAorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHZhbAorIWRlYyQgYXR0cmlidXRlcyBvZmZsb2FkOm1pYyA6OiBvZmZsb2FkX3JlcG9ydAorZW5kIHN1YnJvdXRpbmUgb2ZmbG9hZF9yZXBvcnQKKworZnVuY3Rpb24gb2ZmbG9hZF9nZXRfZGV2aWNlX251bWJlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAiX09mZmxvYWRfZ2V0X2RldmljZV9udW1iZXIiKQorIWRlYyQgYXR0cmlidXRlcyBkZWZhdWx0IDo6IG9mZmxvYWRfZ2V0X2RldmljZV9udW1iZXIKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBvZmZsb2FkX2dldF9kZXZpY2VfbnVtYmVyCishZGVjJCBhdHRyaWJ1dGVzIG9mZmxvYWQ6bWljIDo6IG9mZmxvYWRfZ2V0X2RldmljZV9udW1iZXIKK2VuZCBmdW5jdGlvbiBvZmZsb2FkX2dldF9kZXZpY2VfbnVtYmVyCisKK2Z1bmN0aW9uIG9mZmxvYWRfZ2V0X3BoeXNpY2FsX2RldmljZV9udW1iZXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIl9PZmZsb2FkX2dldF9waHlzaWNhbF9kZXZpY2VfbnVtYmVyIikKKyFkZWMkIGF0dHJpYnV0ZXMgZGVmYXVsdCA6OiBvZmZsb2FkX2dldF9waHlzaWNhbF9kZXZpY2VfbnVtYmVyCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjogb2ZmbG9hZF9nZXRfcGh5c2ljYWxfZGV2aWNlX251bWJlcgorIWRlYyQgYXR0cmlidXRlcyBvZmZsb2FkOm1pYyA6OiBvZmZsb2FkX2dldF9waHlzaWNhbF9kZXZpY2VfbnVtYmVyCitlbmQgZnVuY3Rpb24gb2ZmbG9hZF9nZXRfcGh5c2ljYWxfZGV2aWNlX251bWJlcgorCishIE9wZW5NUCBBUEkgd3JhcHBlcnMKKworc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV90aHJlYWRzKSAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF9zZXRfbnVtX3RocmVhZHNfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgbnVtX3RocmVhZHMKK2VuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHNfdGFyZ2V0CisKK2Z1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHNfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF9nZXRfbWF4X3RocmVhZHNfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBvbXBfZ2V0X21heF90aHJlYWRzX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKK2VuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzX3RhcmdldAorCitmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jc190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlcikgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJvbXBfZ2V0X251bV9wcm9jc190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IG9tcF9nZXRfbnVtX3Byb2NzX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKK2VuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jc190YXJnZXQKKworc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWNfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3RocmVhZHMpICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF9zZXRfZHluYW1pY190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBudW1fdGhyZWFkcworZW5kIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljX3RhcmdldAorCitmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWNfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJvbXBfZ2V0X2R5bmFtaWNfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBvbXBfZ2V0X2R5bmFtaWNfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pY190YXJnZXQKKworc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZF90YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF9zZXRfbmVzdGVkX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIG5lc3RlZAorZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWRfdGFyZ2V0CisKK2Z1bmN0aW9uIG9tcF9nZXRfbmVzdGVkX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyKSAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF9nZXRfbmVzdGVkX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjogb21wX2dldF9uZXN0ZWRfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkX3RhcmdldAorCitzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGVfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2luZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllcikgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJvbXBfc2V0X3NjaGVkdWxlX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIGtpbmQsIG1vZGlmaWVyCitlbmQgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlX3RhcmdldAorCitzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGVfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2luZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllcikgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJvbXBfZ2V0X3NjaGVkdWxlX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjoga2luZCwgbW9kaWZpZXIKK2VuZCBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGVfdGFyZ2V0CisKKyEgbG9jayBBUEkgZnVuY3Rpb25zCisKK3N1YnJvdXRpbmUgb21wX2luaXRfbG9ja190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJvbXBfaW5pdF9sb2NrX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICAhZGlyJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiAgb21wX2luaXRfbG9ja190YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCisgIGludGVnZXIgKGtpbmQ9Y19pbnRwdHJfdCksIHZhbHVlIDo6IGxvY2sKK2VuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2tfdGFyZ2V0CisKK3N1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9ja190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJvbXBfZGVzdHJveV9sb2NrX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICAhZGlyJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiAgb21wX2Rlc3Ryb3lfbG9ja190YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCisgIGludGVnZXIgKGtpbmQ9Y19pbnRwdHJfdCksIHZhbHVlIDo6IGxvY2sKK2VuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2tfdGFyZ2V0CisKK3N1YnJvdXRpbmUgb21wX3NldF9sb2NrX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJvbXBfc2V0X2xvY2tfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgICFkaXIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6ICBvbXBfc2V0X2xvY2tfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBsb2NrCitlbmQgc3Vicm91dGluZSBvbXBfc2V0X2xvY2tfdGFyZ2V0CisKK3N1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2tfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJvbXBfdW5zZXRfbG9ja190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgIWRpciQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogIG9tcF91bnNldF9sb2NrX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbG9jaworZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2tfdGFyZ2V0CisKK2Z1bmN0aW9uIG9tcF90ZXN0X2xvY2tfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJvbXBfdGVzdF9sb2NrX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjogb21wX3Rlc3RfbG9ja190YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCisgIGludGVnZXIgKGtpbmQ9Y19pbnRwdHJfdCksIHZhbHVlIDo6IGxvY2sKK2VuZCBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrX3RhcmdldAorCishIG5lc3RlZCBsb2NrIEFQSSBmdW5jdGlvbnMKKworc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2tfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF9pbml0X25lc3RfbG9ja190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCisgIGludGVnZXIgKGtpbmQ9Y19pbnRwdHJfdCksIHZhbHVlIDo6IGxvY2sKK2VuZCBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9ja190YXJnZXQKKworc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2tfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jaykgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF9kZXN0cm95X25lc3RfbG9ja190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCisgIGludGVnZXIgKGtpbmQ9Y19pbnRwdHJfdCksIHZhbHVlIDo6IGxvY2sKK2VuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9ja190YXJnZXQKKworc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9ja190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF9zZXRfbmVzdF9sb2NrX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbG9jaworZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2tfdGFyZ2V0CisKK3N1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9ja190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJvbXBfdW5zZXRfbmVzdF9sb2NrX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbG9jaworZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9ja190YXJnZXQKKworZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF90ZXN0X25lc3RfbG9ja190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IG9tcF90ZXN0X25lc3RfbG9ja190YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCisgIGludGVnZXIgKGtpbmQ9Y19pbnRwdHJfdCksIHZhbHVlIDo6IGxvY2sKK2VuZCBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2tfdGFyZ2V0CisKKyEga21wIEFQSSBmdW5jdGlvbnMKKworc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV90YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9zZXRfc3RhY2tzaXplX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIHNpemUKK2VuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3RhcmdldAorCitmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV90YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlcikgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfZ2V0X3N0YWNrc2l6ZV90YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IGttcF9nZXRfc3RhY2tzaXplX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKK2VuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV90YXJnZXQKKworc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9zZXRfc3RhY2tzaXplX3NfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgc2l6ZQorZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfc190YXJnZXQKKworZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfc190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlcikgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX2dldF9zdGFja3NpemVfc190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IGttcF9nZXRfc3RhY2tzaXplX3NfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3NfdGFyZ2V0CisKK3N1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWVfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfc2V0X2Jsb2NrdGltZV90YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCB0aW1lCitlbmQgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZV90YXJnZXQKKworZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWVfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX2dldF9ibG9ja3RpbWVfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBrbXBfZ2V0X2Jsb2NrdGltZV90YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCitlbmQgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWVfdGFyZ2V0CisKK3N1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbF90YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlcikgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX3NldF9saWJyYXJ5X3NlcmlhbF90YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCitlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsX3RhcmdldAorCitzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyKSAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKK2VuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kX3RhcmdldAorCitzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0X3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyKSAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0X3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKK2VuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0X3RhcmdldAorCitzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX3NldF9saWJyYXJ5X3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIG1vZGUKK2VuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90YXJnZXQKKworZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5X3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyKSAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX2dldF9saWJyYXJ5X3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjoga21wX2dldF9saWJyYXJ5X3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKK2VuZCBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnlfdGFyZ2V0CisKK3N1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0c190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0cykgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfc2V0X2RlZmF1bHRzX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19jaGFyCisgY2hhcmFjdGVyIChraW5kPWNfY2hhcikgOjogZGVmYXVsdHMoKikKKyBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKK2VuZCBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHNfdGFyZ2V0CisKKyEgYWZmaW5pdHkgQVBJIGZ1bmN0aW9ucworCitzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFza190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrKSAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbWFzaworZW5kIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrX3RhcmdldAorCitzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzaykgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCisgIGludGVnZXIgKGtpbmQ9Y19pbnRwdHJfdCksIHZhbHVlIDo6IG1hc2sKK2VuZCBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfdGFyZ2V0CisKK2Z1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfc2V0X2FmZmluaXR5X3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjoga21wX3NldF9hZmZpbml0eV90YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCisgIGludGVnZXIgKGtpbmQ9Y19pbnRwdHJfdCksIHZhbHVlIDo6IG1hc2sKK2VuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X3RhcmdldAorCitmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX2dldF9hZmZpbml0eV90YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IGttcF9nZXRfYWZmaW5pdHlfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBtYXNrCitlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV90YXJnZXQKKworZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvY190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlcikgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjoga21wX2dldF9hZmZpbml0eV9tYXhfcHJvY190YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCitlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvY190YXJnZXQKKworZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYywgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrKSAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBwcm9jCisgIGludGVnZXIgKGtpbmQ9Y19pbnRwdHJfdCksIHZhbHVlIDo6IG1hc2sKK2VuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQKKworZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jLCAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2spICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgcHJvYworICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBtYXNrCitlbmQgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQKKworZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYywgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrKSAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBwcm9jCisgIGludGVnZXIgKGtpbmQ9Y19pbnRwdHJfdCksIHZhbHVlIDo6IG1hc2sKK2VuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQKKworZW5kIGludGVyZmFjZQorZW5kIG1vZHVsZSBtaWNfbGliCmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkLmggYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg5MTRiNwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWQuaApAQCAtMCwwICsxLDQ3NCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvKgorICogSW5jbHVkZSBmaWxlIGZvciBPZmZsb2FkIEFQSS4KKyAqLworCisjaWZuZGVmIE9GRkxPQURfSF9JTkNMVURFRAorI2RlZmluZSBPRkZMT0FEX0hfSU5DTFVERUQKKworI2lmIGRlZmluZWQoTElOVVgpIHx8IGRlZmluZWQoRlJFRUJTRCkKKyNpbmNsdWRlIDxiaXRzL2Z1bmN0ZXhjZXB0Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPG9tcC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgVEFSR0VUX0FUVFJJQlVURSBfX2RlY2xzcGVjKHRhcmdldChtaWMpKQorCisvKgorICogIFRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLgorICovCit0eXBlZGVmIGVudW0gVEFSR0VUX1RZUEUgeworICAgIFRBUkdFVF9OT05FLCAgICAvKiBVbmRlZmluZSB0YXJnZXQgKi8KKyAgICBUQVJHRVRfSE9TVCwgICAgLyogSG9zdCB1c2VkIGFzIHRhcmdldCAqLworICAgIFRBUkdFVF9NSUMgICAgICAvKiBNSUMgdGFyZ2V0ICovCit9IFRBUkdFVF9UWVBFOworCisvKgorICogIFRoZSBkZWZhdWx0IHRhcmdldCB0eXBlLgorICovCisjZGVmaW5lIERFRkFVTFRfVEFSR0VUX1RZUEUgVEFSR0VUX01JQworCisvKgorICogIFRoZSBkZWZhdWx0IHRhcmdldCBudW1iZXIuCisgKi8KKyNkZWZpbmUgREVGQVVMVF9UQVJHRVRfTlVNQkVSIDAKKworLyoKKyAqICBPZmZsb2FkIHN0YXR1cy4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBPRkZMT0FEX1NVQ0NFU1MgPSAwLAorICAgIE9GRkxPQURfRElTQUJMRUQsICAgICAgICAgICAgICAgLyogb2ZmbG9hZCBpcyBkaXNhYmxlZCAqLworICAgIE9GRkxPQURfVU5BVkFJTEFCTEUsICAgICAgICAgICAgLyogY2FyZCBpcyBub3QgYXZhaWxhYmxlICovCisgICAgT0ZGTE9BRF9PVVRfT0ZfTUVNT1JZLCAgICAgICAgICAvKiBub3QgZW5vdWdoIG1lbW9yeSBvbiBkZXZpY2UgKi8KKyAgICBPRkZMT0FEX1BST0NFU1NfRElFRCwgICAgICAgICAgIC8qIHRhcmdldCBwcm9jZXNzIGhhcyBkaWVkICovCisgICAgT0ZGTE9BRF9FUlJPUiAgICAgICAgICAgICAgICAgICAvKiB1bnNwZWNpZmllZCBlcnJvciAqLworfSBfT2ZmbG9hZF9yZXN1bHQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBfT2ZmbG9hZF9yZXN1bHQgcmVzdWx0OyAgICAgICAgIC8qIHJlc3VsdCwgc2VlIGFib3ZlICovCisgICAgaW50ICAgICAgICAgICAgIGRldmljZV9udW1iZXI7ICAvKiBkZXZpY2UgbnVtYmVyICovCisgICAgc2l6ZV90ICAgICAgICAgIGRhdGFfc2VudDsgICAgICAvKiBudW1iZXIgb2YgYnl0ZXMgc2VudCB0byB0aGUgdGFyZ2V0ICovCisgICAgc2l6ZV90ICAgICAgICAgIGRhdGFfcmVjZWl2ZWQ7ICAvKiBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgYnkgaG9zdCAqLworfSBfT2ZmbG9hZF9zdGF0dXM7CisKKyNkZWZpbmUgT0ZGTE9BRF9TVEFUVVNfSU5JVCh4KSBcCisgICAgKCh4KS5yZXN1bHQgPSBPRkZMT0FEX0RJU0FCTEVEKQorCisjZGVmaW5lIE9GRkxPQURfU1RBVFVTX0lOSVRJQUxJWkVSIFwKKyAgICB7IE9GRkxPQURfRElTQUJMRUQsIC0xLCAwLCAwIH0KKworLyogT2ZmbG9hZCBydW50aW1lIGludGVyZmFjZXMgKi8KKworZXh0ZXJuIGludCBfT2ZmbG9hZF9udW1iZXJfb2ZfZGV2aWNlcyh2b2lkKTsKK2V4dGVybiBpbnQgX09mZmxvYWRfZ2V0X2RldmljZV9udW1iZXIodm9pZCk7CitleHRlcm4gaW50IF9PZmZsb2FkX2dldF9waHlzaWNhbF9kZXZpY2VfbnVtYmVyKHZvaWQpOworCitleHRlcm4gdm9pZCogX09mZmxvYWRfc2hhcmVkX21hbGxvYyhzaXplX3Qgc2l6ZSk7CitleHRlcm4gdm9pZCAgX09mZmxvYWRfc2hhcmVkX2ZyZWUodm9pZCAqcHRyKTsKKworZXh0ZXJuIHZvaWQqIF9PZmZsb2FkX3NoYXJlZF9hbGlnbmVkX21hbGxvYyhzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWduKTsKK2V4dGVybiB2b2lkICBfT2ZmbG9hZF9zaGFyZWRfYWxpZ25lZF9mcmVlKHZvaWQgKnB0cik7CisKK2V4dGVybiBpbnQgX09mZmxvYWRfc2lnbmFsZWQoaW50IGluZGV4LCB2b2lkICpzaWduYWwpOworZXh0ZXJuIHZvaWQgX09mZmxvYWRfcmVwb3J0KGludCB2YWwpOworCisvKiBPcGVuTVAgQVBJICovCisKK2V4dGVybiB2b2lkIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UoaW50IG51bSk7CitleHRlcm4gaW50ICBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlKHZvaWQpOworZXh0ZXJuIGludCAgb21wX2dldF9udW1fZGV2aWNlcyh2b2lkKTsKKworLyogT3Blbk1QIEFQSSB3cmFwcGVycyAqLworCisvKiBTZXQgbnVtX3RocmVhZHMgb24gdGFyZ2V0ICovCitleHRlcm4gdm9pZCBvbXBfc2V0X251bV90aHJlYWRzX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgbnVtX3RocmVhZHMKKyk7CisKKy8qIEdldCBtYXhfdGhyZWFkcyBmcm9tIHRhcmdldCAqLworZXh0ZXJuIGludCBvbXBfZ2V0X21heF90aHJlYWRzX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworLyogR2V0IG51bV9wcm9jcyBmcm9tIHRhcmdldCAqLworZXh0ZXJuIGludCBvbXBfZ2V0X251bV9wcm9jc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKyk7CisKKy8qIFNldCBkeW5hbWljIG9uIHRhcmdldCAqLworZXh0ZXJuIHZvaWQgb21wX3NldF9keW5hbWljX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgbnVtX3RocmVhZHMKKyk7CisKKy8qIEdldCBkeW5hbWljIGZyb20gdGFyZ2V0ICovCitleHRlcm4gaW50IG9tcF9nZXRfZHluYW1pY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKyk7CisKKy8qIFNldCBuZXN0ZWQgb24gdGFyZ2V0ICovCitleHRlcm4gdm9pZCBvbXBfc2V0X25lc3RlZF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG5lc3RlZAorKTsKKworLyogR2V0IG5lc3RlZCBmcm9tIHRhcmdldCAqLworZXh0ZXJuIGludCBvbXBfZ2V0X25lc3RlZF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKyk7CisKK2V4dGVybiB2b2lkIG9tcF9zZXRfbnVtX3RocmVhZHNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBudW1fdGhyZWFkcworKTsKKworZXh0ZXJuIGludCBvbXBfZ2V0X21heF90aHJlYWRzX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworZXh0ZXJuIGludCBvbXBfZ2V0X251bV9wcm9jc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKyk7CisKK2V4dGVybiB2b2lkIG9tcF9zZXRfZHluYW1pY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG51bV90aHJlYWRzCispOworCitleHRlcm4gaW50IG9tcF9nZXRfZHluYW1pY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKyk7CisKK2V4dGVybiB2b2lkIG9tcF9zZXRfbmVzdGVkX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgbnVtX3RocmVhZHMKKyk7CisKK2V4dGVybiBpbnQgb21wX2dldF9uZXN0ZWRfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispOworCitleHRlcm4gdm9pZCBvbXBfc2V0X3NjaGVkdWxlX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfc2NoZWRfdCBraW5kLAorICAgIGludCBtb2RpZmllcgorKTsKKworZXh0ZXJuIHZvaWQgb21wX2dldF9zY2hlZHVsZV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX3NjaGVkX3QgKmtpbmQsCisgICAgaW50ICptb2RpZmllcgorKTsKKworLyogbG9jayBBUEkgZnVuY3Rpb25zICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBvbXBfbG9ja190IGxvY2s7Cit9IG9tcF9sb2NrX3RhcmdldF90OworCitleHRlcm4gdm9pZCBvbXBfaW5pdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbG9ja190YXJnZXRfdCAqbG9jaworKTsKKworZXh0ZXJuIHZvaWQgb21wX2Rlc3Ryb3lfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX2xvY2tfdGFyZ2V0X3QgKmxvY2sKKyk7CisKK2V4dGVybiB2b2lkIG9tcF9zZXRfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX2xvY2tfdGFyZ2V0X3QgKmxvY2sKKyk7CisKK2V4dGVybiB2b2lkIG9tcF91bnNldF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbG9ja190YXJnZXRfdCAqbG9jaworKTsKKworZXh0ZXJuIGludCBvbXBfdGVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbG9ja190YXJnZXRfdCAqbG9jaworKTsKKworLyogbmVzdGVkIGxvY2sgQVBJIGZ1bmN0aW9ucyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgb21wX25lc3RfbG9ja190IGxvY2s7Cit9IG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3Q7CisKK2V4dGVybiB2b2lkIG9tcF9pbml0X25lc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCAqbG9jaworKTsKKworZXh0ZXJuIHZvaWQgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90ICpsb2NrCispOworCitleHRlcm4gdm9pZCBvbXBfc2V0X25lc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCAqbG9jaworKTsKKworZXh0ZXJuIHZvaWQgb21wX3Vuc2V0X25lc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCAqbG9jaworKTsKKworZXh0ZXJuIGludCBvbXBfdGVzdF9uZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgKmxvY2sKKyk7CisKKy8qIGttcCBBUEkgZnVuY3Rpb25zICovCisKK2V4dGVybiB2b2lkIGttcF9zZXRfc3RhY2tzaXplX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgc2l6ZQorKTsKKworZXh0ZXJuIGludCBrbXBfZ2V0X3N0YWNrc2l6ZV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKyk7CisKK2V4dGVybiB2b2lkIGttcF9zZXRfc3RhY2tzaXplX3NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIHNpemVfdCBzaXplCispOworCitleHRlcm4gc2l6ZV90IGttcF9nZXRfc3RhY2tzaXplX3NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispOworCitleHRlcm4gdm9pZCBrbXBfc2V0X2Jsb2NrdGltZV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHRpbWUKKyk7CisKK2V4dGVybiBpbnQga21wX2dldF9ibG9ja3RpbWVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispOworCitleHRlcm4gdm9pZCBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworZXh0ZXJuIHZvaWQga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispOworCitleHRlcm4gdm9pZCBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKyk7CisKK2V4dGVybiB2b2lkIGttcF9zZXRfbGlicmFyeV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG1vZGUKKyk7CisKK2V4dGVybiBpbnQga21wX2dldF9saWJyYXJ5X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworZXh0ZXJuIHZvaWQga21wX3NldF9kZWZhdWx0c190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgY2hhciBjb25zdCAqZGVmYXVsdHMKKyk7CisKKy8qIGFmZmluaXR5IEFQSSBmdW5jdGlvbnMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGttcF9hZmZpbml0eV9tYXNrX3QgbWFzazsKK30ga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3Q7CisKK2V4dGVybiB2b2lkIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFza190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKyk7CisKK2V4dGVybiB2b2lkIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispOworCitleHRlcm4gaW50IGttcF9zZXRfYWZmaW5pdHlfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispOworCitleHRlcm4gaW50IGttcF9nZXRfYWZmaW5pdHlfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispOworCitleHRlcm4gaW50IGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispOworCitleHRlcm4gaW50IGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgcHJvYywKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKTsKKworZXh0ZXJuIGludCBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgcHJvYywKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKTsKKworZXh0ZXJuIGludCBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHByb2MsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvKiBleHRlcm4gIkMiICovCisKKy8qIE5hbWVzcGFjZSBmb3IgdGhlIHNoYXJlZF9hbGxvY2F0b3IuICovCituYW1lc3BhY2UgX19vZmZsb2FkIHsKKyAgLyogVGhpcyBmb2xsb3dzIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBzdGQ6OmFsbG9jYXRvci4gKi8KKyAgLyogRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiB0aGUgY2xhc3MgdGVtcGxhdGUuICovCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBjbGFzcyBzaGFyZWRfYWxsb2NhdG9yOworCisgIC8qIFNwZWNpYWxpemF0aW9uIGZvciBzaGFyZWRfYWxsb2NhdG9yPHZvaWQ+LiAqLworICB0ZW1wbGF0ZSA8PgorICBjbGFzcyBzaGFyZWRfYWxsb2NhdG9yPHZvaWQ+IHsKKyAgcHVibGljOgorICAgIHR5cGVkZWYgdm9pZCAgICAgICAqcG9pbnRlcjsKKyAgICB0eXBlZGVmIGNvbnN0IHZvaWQgKmNvbnN0X3BvaW50ZXI7CisgICAgdHlwZWRlZiB2b2lkICAgICAgICB2YWx1ZV90eXBlOworICAgIHRlbXBsYXRlIDxjbGFzcyBVPiBzdHJ1Y3QgcmViaW5kIHsgdHlwZWRlZiBzaGFyZWRfYWxsb2NhdG9yPFU+IG90aGVyOyB9OworICB9OworCisgIC8qIERlZmluaXRpb24gb2Ygc2hhcmVkX2FsbG9jYXRvcjxUPi4gKi8KKyAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgIGNsYXNzIHNoYXJlZF9hbGxvY2F0b3IgeworICBwdWJsaWM6CisgICAgdHlwZWRlZiBzaXplX3QgICAgIHNpemVfdHlwZTsKKyAgICB0eXBlZGVmIHB0cmRpZmZfdCAgZGlmZmVyZW5jZV90eXBlOworICAgIHR5cGVkZWYgVCAgICAgICAgICpwb2ludGVyOworICAgIHR5cGVkZWYgY29uc3QgVCAgICpjb25zdF9wb2ludGVyOworICAgIHR5cGVkZWYgVCAgICAgICAgICZyZWZlcmVuY2U7CisgICAgdHlwZWRlZiBjb25zdCBUICAgJmNvbnN0X3JlZmVyZW5jZTsKKyAgICB0eXBlZGVmIFQgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVT4gc3RydWN0IHJlYmluZCB7IHR5cGVkZWYgc2hhcmVkX2FsbG9jYXRvcjxVPiBvdGhlcjsgfTsKKyAgICBzaGFyZWRfYWxsb2NhdG9yKCkgdGhyb3coKSB7IH0KKyAgICBzaGFyZWRfYWxsb2NhdG9yKGNvbnN0IHNoYXJlZF9hbGxvY2F0b3ImKSB0aHJvdygpIHsgfQorICAgIHRlbXBsYXRlIDxjbGFzcyBVPiBzaGFyZWRfYWxsb2NhdG9yKGNvbnN0IHNoYXJlZF9hbGxvY2F0b3I8VT4mKSB0aHJvdygpIHsgfQorICAgIH5zaGFyZWRfYWxsb2NhdG9yKCkgdGhyb3coKSB7IH0KKyAgICBwb2ludGVyIGFkZHJlc3MocmVmZXJlbmNlIHgpIGNvbnN0IHsgcmV0dXJuICZ4OyB9CisgICAgY29uc3RfcG9pbnRlciBhZGRyZXNzKGNvbnN0X3JlZmVyZW5jZSB4KSBjb25zdCB7IHJldHVybiAmeDsgfQorICAgIHBvaW50ZXIgYWxsb2NhdGUoCisgICAgICBzaXplX3R5cGUsIHNoYXJlZF9hbGxvY2F0b3I8dm9pZD46OmNvbnN0X3BvaW50ZXIgaGludCA9IDApOworICAgIHZvaWQgZGVhbGxvY2F0ZShwb2ludGVyIHAsIHNpemVfdHlwZSBuKTsKKyAgICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB0aHJvdygpIHsKKyAgICAgIHJldHVybiBzaXplX3R5cGUoLTEpL3NpemVvZihUKTsKKyAgICB9IC8qIG1heF9zaXplICovCisgICAgdm9pZCBjb25zdHJ1Y3QocG9pbnRlciBwLCBjb25zdCBUJiBhcmcpIHsKKyAgICAgIDo6bmV3IChwKSBUKGFyZyk7CisgICAgfSAvKiBjb25zdHJ1Y3QgKi8KKyAgICB2b2lkIGRlc3Ryb3kocG9pbnRlciBwKSB7CisgICAgICBwLT5+VCgpOworICAgIH0gLyogZGVzdHJveSAqLworICB9OworCisgIC8qIERlZmluaXRpb24gZm9yIGFsbG9jYXRlLiAqLworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgdHlwZW5hbWUgc2hhcmVkX2FsbG9jYXRvcjxUPjo6cG9pbnRlcgorICBzaGFyZWRfYWxsb2NhdG9yPFQ+OjphbGxvY2F0ZShzaGFyZWRfYWxsb2NhdG9yPFQ+OjpzaXplX3R5cGUgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX2FsbG9jYXRvcjx2b2lkPjo6Y29uc3RfcG9pbnRlcikgeworICAgIC8qIEFsbG9jYXRlIGZyb20gc2hhcmVkIG1lbW9yeS4gKi8KKyAgICB2b2lkICpwdHIgPSBfT2ZmbG9hZF9zaGFyZWRfbWFsbG9jKHMqc2l6ZW9mKFQpKTsKKyAgICBpZiAocHRyID09IDApIHN0ZDo6X190aHJvd19iYWRfYWxsb2MoKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8cG9pbnRlcj4ocHRyKTsKKyAgfSAvKiBhbGxvY2F0ZSAqLworCisgIHRlbXBsYXRlIDxjbGFzcyBUPgorICB2b2lkIHNoYXJlZF9hbGxvY2F0b3I8VD46OmRlYWxsb2NhdGUocG9pbnRlciBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX2FsbG9jYXRvcjxUPjo6c2l6ZV90eXBlKSB7CisgICAgLyogRnJlZSB0aGUgc2hhcmVkIG1lbW9yeS4gKi8KKyAgICBfT2ZmbG9hZF9zaGFyZWRfZnJlZShwKTsKKyAgfSAvKiBkZWFsbG9jYXRlICovCisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPgorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHNoYXJlZF9hbGxvY2F0b3I8X1QxPiAmLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfYWxsb2NhdG9yPF9UMj4gJikgdGhyb3coKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0gIC8qIG9wZXJhdG9yPT0gKi8KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDI+CisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3Qgc2hhcmVkX2FsbG9jYXRvcjxfVDE+ICYsIAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9hbGxvY2F0b3I8X1QyPiAmKSB0aHJvdygpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gIC8qIG9wZXJhdG9yIT0gKi8KK30gIC8qIF9fb2ZmbG9hZCAqLworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiBPRkZMT0FEX0hfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfY29tbW9uLmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfY29tbW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjgxYjA2Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9jb21tb24uY3BwCkBAIC0wLDAgKzEsMTcwIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZiBkZWZpbmVkKExJTlVYKSB8fCBkZWZpbmVkKEZSRUVCU0QpCisjaW5jbHVkZSA8bW1fbWFsbG9jLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIm9mZmxvYWRfY29tbW9uLmgiCisKKy8vIFRoZSBkZWJ1ZyByb3V0aW5lcworCisjaWYgT0ZGTE9BRF9ERUJVRyA+IDAKKwordm9pZCBfX2R1bXBfYnl0ZXMoCisgICAgaW50IHRyYWNlX2xldmVsLAorICAgIGNvbnN0IHZvaWQgKmRhdGEsCisgICAgaW50IGxlbgorKQoreworICAgIGlmIChjb25zb2xlX2VuYWJsZWQgPiB0cmFjZV9sZXZlbCkgeworICAgICAgICBjb25zdCB1aW50OF90ICphcnIgPSAoY29uc3QgdWludDhfdCopIGRhdGE7CisgICAgICAgIGNoYXIgYnVmZmVyWzQwOTZdOworICAgICAgICBjaGFyICpidWZmZXJwOworICAgICAgICBpbnQgY291bnQgPSAwOworCisgICAgICAgIGJ1ZmZlcnAgPSBidWZmZXI7CisgICAgICAgIHdoaWxlIChsZW4tLSkgeworICAgICAgICAgICAgc3ByaW50ZihidWZmZXJwLCAiJTAyeCIsICphcnIrKyk7CisgICAgICAgICAgICBidWZmZXJwICs9IDI7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgaWYgKChjb3VudCYzKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgc3ByaW50ZihidWZmZXJwLCAiICIpOworICAgICAgICAgICAgICAgIGJ1ZmZlcnArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoY291bnQmNjMpID09IDApIHsKKyAgICAgICAgICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKHRyYWNlX2xldmVsLCAiJXNcbiIsIGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgYnVmZmVycCA9IGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBjb3VudCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvdW50KSB7CisgICAgICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKHRyYWNlX2xldmVsLCAiJXNcbiIsIGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9Cit9CisjZW5kaWYgLy8gT0ZGTE9BRF9ERUJVRworCisvLyBUaGUgTWFyc2hhbGxlciBhbmQgYXNzb2NpYXRlZCByb3V0aW5lcworCit2b2lkIE1hcnNoYWxsZXI6OnNlbmRfZGF0YSgKKyAgICBjb25zdCB2b2lkICpkYXRhLAorICAgIGludDY0X3QgbGVuZ3RoCispCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAic2VuZF9kYXRhKCVwLCAlbGxkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIGxlbmd0aCk7CisgICAgbWVtY3B5KGJ1ZmZlcl9wdHIsIGRhdGEsIChzaXplX3QpbGVuZ3RoKTsKKyAgICBidWZmZXJfcHRyICs9IGxlbmd0aDsKKyAgICB0ZnJfc2l6ZSArPSBsZW5ndGg7Cit9CisKK3ZvaWQgTWFyc2hhbGxlcjo6cmVjZWl2ZV9kYXRhKAorICAgIHZvaWQgKmRhdGEsCisgICAgaW50NjRfdCBsZW5ndGgKKykKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJyZWNlaXZlX2RhdGEoJXAsICVsbGQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgbGVuZ3RoKTsKKyAgICBtZW1jcHkoZGF0YSwgYnVmZmVyX3B0ciwgKHNpemVfdClsZW5ndGgpOworICAgIGJ1ZmZlcl9wdHIgKz0gbGVuZ3RoOworICAgIHRmcl9zaXplICs9IGxlbmd0aDsKK30KKworLy8gU2VuZCBmdW5jdGlvbiBwb2ludGVyCit2b2lkIE1hcnNoYWxsZXI6OnNlbmRfZnVuY19wdHIoCisgICAgY29uc3Qgdm9pZCogZGF0YQorKQoreworICAgIGNvbnN0IGNoYXIqIG5hbWU7CisgICAgc2l6ZV90ICAgICAgbGVuZ3RoOworCisgICAgaWYgKGRhdGEgIT0gMCkgeworICAgICAgICBuYW1lID0gX19vZmZsb2FkX2Z1bmNzLmZpbmRfbmFtZShkYXRhKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gMCkgeworI2lmIE9GRkxPQURfREVCVUcgPiAwCisgICAgICAgICAgICBpZiAoY29uc29sZV9lbmFibGVkID4gMikgeworICAgICAgICAgICAgICAgIF9fb2ZmbG9hZF9mdW5jcy5kdW1wKCk7CisgICAgICAgICAgICB9CisjZW5kaWYgLy8gT0ZGTE9BRF9ERUJVRyA+IDAKKworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3NlbmRfZnVuY19wdHIsIGRhdGEpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgICBsZW5ndGggPSBzdHJsZW4obmFtZSkgKyAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbmFtZSA9ICIiOworICAgICAgICBsZW5ndGggPSAxOworICAgIH0KKworICAgIG1lbWNweShidWZmZXJfcHRyLCBuYW1lLCBsZW5ndGgpOworICAgIGJ1ZmZlcl9wdHIgKz0gbGVuZ3RoOworICAgIHRmcl9zaXplICs9IGxlbmd0aDsKK30KKworLy8gUmVjZWl2ZSBmdW5jdGlvbiBwb2ludGVyCit2b2lkIE1hcnNoYWxsZXI6OnJlY2VpdmVfZnVuY19wdHIoCisgICAgY29uc3Qgdm9pZCoqIGRhdGEKKykKK3sKKyAgICBjb25zdCBjaGFyKiBuYW1lOworICAgIHNpemVfdCAgICAgIGxlbmd0aDsKKworICAgIG5hbWUgPSAoY29uc3QgY2hhciopIGJ1ZmZlcl9wdHI7CisgICAgaWYgKG5hbWVbMF0gIT0gJ1wwJykgeworICAgICAgICAqZGF0YSA9IF9fb2ZmbG9hZF9mdW5jcy5maW5kX2FkZHIobmFtZSk7CisgICAgICAgIGlmICgqZGF0YSA9PSAwKSB7CisjaWYgT0ZGTE9BRF9ERUJVRyA+IDAKKyAgICAgICAgICAgIGlmIChjb25zb2xlX2VuYWJsZWQgPiAyKSB7CisgICAgICAgICAgICAgICAgX19vZmZsb2FkX2Z1bmNzLmR1bXAoKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBPRkZMT0FEX0RFQlVHID4gMAorCisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcmVjZWl2ZV9mdW5jX3B0ciwgbmFtZSk7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICAgIGxlbmd0aCA9IHN0cmxlbihuYW1lKSArIDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAqZGF0YSA9IDA7CisgICAgICAgIGxlbmd0aCA9IDE7CisgICAgfQorCisgICAgYnVmZmVyX3B0ciArPSBsZW5ndGg7CisgICAgdGZyX3NpemUgKz0gbGVuZ3RoOworfQorCisvLyBFbmQgb2YgdGhlIE1hcnNoYWxsZXIgYW5kIGFzc29jaWF0ZWQgcm91dGluZXMKKworZXh0ZXJuIHZvaWQgKk9GRkxPQURfTUFMTE9DKAorICAgIHNpemVfdCBzaXplLAorICAgIHNpemVfdCBhbGlnbgorKQoreworICAgIHZvaWQgKnB0cjsKKyAgICBpbnQgICBlcnI7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICIlcyglbGxkLCAlbGxkKVxuIiwgX19mdW5jX18sIHNpemUsIGFsaWduKTsKKworICAgIGlmIChhbGlnbiA8IHNpemVvZih2b2lkKikpIHsKKyAgICAgICAgYWxpZ24gPSBzaXplb2Yodm9pZCopOworICAgIH0KKworICAgIHB0ciA9IF9tbV9tYWxsb2Moc2l6ZSwgYWxpZ24pOworICAgIGlmIChwdHIgPT0gTlVMTCkgeworICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfb2ZmbG9hZF9tYWxsb2MsIHNpemUsIGFsaWduKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICIlcyByZXR1cm5lZCAlcFxuIiwgX19mdW5jX18sIHB0cik7CisKKyAgICByZXR1cm4gcHRyOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9jb21tb24uaCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFjYjhiYgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfY29tbW9uLmgKQEAgLTAsMCArMSw0NDQgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLyohIFxmaWxlCisgICAgXGJyaWVmIFRoZSBwYXJ0cyBvZiB0aGUgcnVudGltZSBsaWJyYXJ5IGNvbW1vbiB0byBob3N0IGFuZCB0YXJnZXQKKyovCisKKyNpZm5kZWYgT0ZGTE9BRF9DT01NT05fSF9JTkNMVURFRAorI2RlZmluZSBPRkZMT0FEX0NPTU1PTl9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1lbW9yeS5oPgorCisjaW5jbHVkZSAib2ZmbG9hZC5oIgorI2luY2x1ZGUgIm9mZmxvYWRfdGFibGUuaCIKKyNpbmNsdWRlICJvZmZsb2FkX3RyYWNlLmgiCisjaW5jbHVkZSAib2ZmbG9hZF90aW1lci5oIgorI2luY2x1ZGUgIm9mZmxvYWRfdXRpbC5oIgorI2luY2x1ZGUgImNlYW5fdXRpbC5oIgorI2luY2x1ZGUgImR2X3V0aWwuaCIKKyNpbmNsdWRlICJsaWJvZmZsb2FkX2Vycm9yX2NvZGVzLmgiCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworLy8gVGhlIGRlYnVnIHJvdXRpbmVzCisKKy8vIEhvc3QgY29uc29sZSBhbmQgZmlsZSBsb2dnaW5nCitleHRlcm4gaW50IGNvbnNvbGVfZW5hYmxlZDsKK2V4dGVybiBpbnQgb2ZmbG9hZF9yZXBvcnRfbGV2ZWw7CisKKyNkZWZpbmUgT0ZGTE9BRF9ET19UUkFDRSAob2ZmbG9hZF9yZXBvcnRfbGV2ZWwgPT0gMykKKworZXh0ZXJuIGNvbnN0IGNoYXIgKnByZWZpeDsKK2V4dGVybiBpbnQgb2ZmbG9hZF9udW1iZXI7CisjaWYgIUhPU1RfTElCUkFSWQorZXh0ZXJuIGludCBtaWNfaW5kZXg7CisjZW5kaWYKKworI2lmIEhPU1RfTElCUkFSWQordm9pZCBPZmZsb2FkX1JlcG9ydF9Qcm9sb2coT2ZmbG9hZEhvc3RUaW1lckRhdGEqIHRpbWVyX2RhdGEpOwordm9pZCBPZmZsb2FkX1JlcG9ydF9FcGlsb2coT2ZmbG9hZEhvc3RUaW1lckRhdGEqIHRpbWVyX2RhdGEpOwordm9pZCBvZmZsb2FkX3JlcG9ydF9mcmVlX2RhdGEoT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiB0aW1lcl9kYXRhKTsKK3ZvaWQgT2ZmbG9hZF9UaW1lcl9QcmludCh2b2lkKTsKKworI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgT0ZGTE9BRF9ERUJVR19JTkNSX09GTERfTlVNKCkgXAorICAgICAgICBfX3N5bmNfYWRkX2FuZF9mZXRjaCgmb2ZmbG9hZF9udW1iZXIsIDEpCisjZWxzZQorI2RlZmluZSBPRkZMT0FEX0RFQlVHX0lOQ1JfT0ZMRF9OVU0oKSBcCisgICAgICAgIF9JbnRlcmxvY2tlZEluY3JlbWVudChyZWludGVycHJldF9jYXN0PGxvbmcqPigmb2ZmbG9hZF9udW1iZXIpKQorI2VuZGlmCisKKyNkZWZpbmUgT0ZGTE9BRF9ERUJVR19QUklOVF9UQUdfUFJFRklYKCkgXAorICAgICAgICBwcmludGYoIiVzOiAgIiwgcHJlZml4KTsKKworI2RlZmluZSBPRkZMT0FEX0RFQlVHX1BSSU5UX1BSRUZJWCgpIFwKKyAgICAgICAgcHJpbnRmKCIlczogICIsIHByZWZpeCk7CisjZWxzZQorI2RlZmluZSBPRkZMT0FEX0RFQlVHX1BSSU5UX1BSRUZJWCgpIFwKKyAgICAgICAgcHJpbnRmKCIlcyVkOiAgIiwgcHJlZml4LCBtaWNfaW5kZXgpOworI2VuZGlmIC8vIEhPU1RfTElCUkFSWQorCisjZGVmaW5lIE9GRkxPQURfVFJBQ0UodHJhY2VfbGV2ZWwsIC4uLikgIFwKKyAgICBpZiAoY29uc29sZV9lbmFibGVkID49IHRyYWNlX2xldmVsKSB7IFwKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19QUklOVF9QUkVGSVgoKTsgXAorICAgICAgICBwcmludGYoX19WQV9BUkdTX18pOyBcCisgICAgICAgIGZmbHVzaChOVUxMKTsgXAorICAgIH0KKworI2lmIE9GRkxPQURfREVCVUcgPiAwCisKKyNkZWZpbmUgT0ZGTE9BRF9ERUJVR19UUkFDRShsZXZlbCwgLi4uKSBcCisgICAgT0ZGTE9BRF9UUkFDRShsZXZlbCwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgT0ZGTE9BRF9SRVBPUlQobGV2ZWwsIG9mZmxvYWRfbnVtYmVyLCBzdGFnZSwgLi4uKSBcCisgICAgaWYgKE9GRkxPQURfRE9fVFJBQ0UpIHsgXAorICAgICAgICBvZmZsb2FkX3N0YWdlX3ByaW50KHN0YWdlLCBvZmZsb2FkX251bWJlciwgX19WQV9BUkdTX18pOyBcCisgICAgICAgIGZmbHVzaChOVUxMKTsgXAorICAgIH0KKworI2RlZmluZSBPRkZMT0FEX0RFQlVHX1RSQUNFXzEobGV2ZWwsIG9mZmxvYWRfbnVtYmVyLCBzdGFnZSwgLi4uKSBcCisgICAgaWYgKE9GRkxPQURfRE9fVFJBQ0UpIHsgXAorICAgICAgICBvZmZsb2FkX3N0YWdlX3ByaW50KHN0YWdlLCBvZmZsb2FkX251bWJlciwgX19WQV9BUkdTX18pOyBcCisgICAgICAgIGZmbHVzaChOVUxMKTsgXAorICAgIH0gXAorICAgIGlmICghT0ZGTE9BRF9ET19UUkFDRSkgeyBcCisgICAgICAgIE9GRkxPQURfVFJBQ0UobGV2ZWwsIF9fVkFfQVJHU19fKSBcCisgICAgfQorCisjZGVmaW5lIE9GRkxPQURfREVCVUdfRFVNUF9CWVRFUyhsZXZlbCwgYSwgYikgXAorICAgIF9fZHVtcF9ieXRlcyhsZXZlbCwgYSwgYikKKworZXh0ZXJuIHZvaWQgX19kdW1wX2J5dGVzKAorICAgIGludCBsZXZlbCwKKyAgICBjb25zdCB2b2lkICpkYXRhLAorICAgIGludCBsZW4KKyk7CisKKyNlbHNlCisKKyNkZWZpbmUgT0ZGTE9BRF9ERUJVR19MT0cobGV2ZWwsIC4uLikKKyNkZWZpbmUgT0ZGTE9BRF9ERUJVR19EVU1QX0JZVEVTKGxldmVsLCBhLCBiKQorCisjZW5kaWYKKworLy8gUnVudGltZSBpbnRlcmZhY2UKKworI2RlZmluZSBPRkZMT0FEX1BSRUZJWChhKSBfX29mZmxvYWRfIyNhCisKKyNkZWZpbmUgT0ZGTE9BRF9NQUxMT0MgICAgICAgICAgICBPRkZMT0FEX1BSRUZJWChtYWxsb2MpCisjZGVmaW5lIE9GRkxPQURfRlJFRShhKSAgICAgICAgICAgX21tX2ZyZWUoYSkKKworLy8gRm9yd2FyZCBmdW5jdGlvbnMKKworZXh0ZXJuIHZvaWQgKk9GRkxPQURfTUFMTE9DKHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ24pOworCisvLyBUaGUgTWFyc2hhbGxlcgorCisvLyEgXGVudW0gSW5kaWNhdG9yIGZvciB0aGUgdHlwZSBvZiBlbnRyeSBvbiBhbiBvZmZsb2FkIGl0ZW0gbGlzdC4KK2VudW0gT2ZmbG9hZEl0ZW1UeXBlIHsKKyAgICBjX2RhdGEgPSAgIDEsICAgICAgIC8vITwgUGxhaW4gZGF0YQorICAgIGNfZGF0YV9wdHIsICAgICAgICAgLy8hPCBQb2ludGVyIGRhdGEKKyAgICBjX2Z1bmNfcHRyLCAgICAgICAgIC8vITwgRnVuY3Rpb24gcG9pbnRlcgorICAgIGNfdm9pZF9wdHIsICAgICAgICAgLy8hPCB2b2lkKgorICAgIGNfc3RyaW5nX3B0ciwgICAgICAgLy8hPCBDIHN0cmluZworICAgIGNfZHYsICAgICAgICAgICAgICAgLy8hPCBEb3BlIHZlY3RvciB2YXJpYWJsZQorICAgIGNfZHZfZGF0YSwgICAgICAgICAgLy8hPCBEb3BlLXZlY3RvciBkYXRhCisgICAgY19kdl9kYXRhX3NsaWNlLCAgICAvLyE8IERvcGUtdmVjdG9yIGRhdGEncyBzbGljZQorICAgIGNfZHZfcHRyLCAgICAgICAgICAgLy8hPCBEb3BlLXZlY3RvciB2YXJpYWJsZSBwb2ludGVyCisgICAgY19kdl9wdHJfZGF0YSwgICAgICAvLyE8IERvcGUtdmVjdG9yIHBvaW50ZXIgZGF0YQorICAgIGNfZHZfcHRyX2RhdGFfc2xpY2UsLy8hPCBEb3BlLXZlY3RvciBwb2ludGVyIGRhdGEncyBzbGljZQorICAgIGNfY2Vhbl92YXIsICAgICAgICAgLy8hPCBDRUFOIHZhcmlhYmxlCisgICAgY19jZWFuX3Zhcl9wdHIsICAgICAvLyE8IFBvaW50ZXIgdG8gQ0VBTiB2YXJpYWJsZQorICAgIGNfZGF0YV9wdHJfYXJyYXksICAgLy8hPCBQb2ludGVyIHRvIGRhdGEgcG9pbnRlciBhcnJheQorICAgIGNfZnVuY19wdHJfYXJyYXksICAgLy8hPCBQb2ludGVyIHRvIGZ1bmN0aW9uIHBvaW50ZXIgYXJyYXkKKyAgICBjX3ZvaWRfcHRyX2FycmF5LCAgIC8vITwgUG9pbnRlciB0byB2b2lkKiBwb2ludGVyIGFycmF5CisgICAgY19zdHJpbmdfcHRyX2FycmF5ICAvLyE8IFBvaW50ZXIgdG8gY2hhciogcG9pbnRlciBhcnJheQorfTsKKworI2RlZmluZSBWQVJfVFlQRV9JU19QVFIodCkgKCh0KSA9PSBjX3N0cmluZ19wdHIgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0KSA9PSBjX2RhdGFfcHRyIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodCkgPT0gY19jZWFuX3Zhcl9wdHIgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0KSA9PSBjX2R2X3B0cikKKworI2RlZmluZSBWQVJfVFlQRV9JU19TQ0FMQVIodCkgKCh0KSA9PSBjX2RhdGEgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0KSA9PSBjX3ZvaWRfcHRyIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodCkgPT0gY19jZWFuX3ZhciB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQpID09IGNfZHYpCisKKyNkZWZpbmUgVkFSX1RZUEVfSVNfRFZfREFUQSh0KSAoKHQpID09IGNfZHZfZGF0YSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0KSA9PSBjX2R2X3B0cl9kYXRhKQorCisjZGVmaW5lIFZBUl9UWVBFX0lTX0RWX0RBVEFfU0xJQ0UodCkgKCh0KSA9PSBjX2R2X2RhdGFfc2xpY2UgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodCkgPT0gY19kdl9wdHJfZGF0YV9zbGljZSkKKworCisvLyEgXGVudW0gU3BlY2lmeSBkaXJlY3Rpb24gdG8gY29weSBvZmZsb2FkZWQgdmFyaWFibGUuCitlbnVtIE9mZmxvYWRQYXJhbWV0ZXJUeXBlIHsKKyAgICBjX3BhcmFtZXRlcl91bmtub3duID0gLTEsIC8vITwgVW5rbm93biBjbGF1c2UKKyAgICBjX3BhcmFtZXRlcl9ub2NvcHksICAgICAgIC8vITwgVmFyaWFibGUgbGlzdGVkIGluICJub2NvcHkiIGNsYXVzZQorICAgIGNfcGFyYW1ldGVyX2luLCAgICAgICAgICAgLy8hPCBWYXJpYWJsZSBsaXN0ZWQgaW4gImluIiBjbGF1c2UKKyAgICBjX3BhcmFtZXRlcl9vdXQsICAgICAgICAgIC8vITwgVmFyaWFibGUgbGlzdGVkIGluICJvdXQiIGNsYXVzZQorICAgIGNfcGFyYW1ldGVyX2lub3V0ICAgICAgICAgLy8hPCBWYXJpYWJsZSBsaXN0ZWQgaW4gImlub3V0IiBjbGF1c2UKK307CisKKy8vISBBbiBPZmZsb2FkIFZhcmlhYmxlIGRlc2NyaXB0b3IKK3N0cnVjdCBWYXJEZXNjIHsKKyAgICAvLyEgT2ZmbG9hZEl0ZW1UeXBlcyBvZiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uCisgICAgdW5pb24geworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdWludDhfdCBkc3QgOiA0OyAvLyE8IE9mZmxvYWRJdGVtVHlwZSBvZiBkZXN0aW5hdGlvbgorICAgICAgICAgICAgdWludDhfdCBzcmMgOiA0OyAvLyE8IE9mZmxvYWRJdGVtVHlwZSBvZiBzb3VyY2UKKyAgICAgICAgfTsKKyAgICAgICAgdWludDhfdCBiaXRzOworICAgIH0gdHlwZTsKKworICAgIC8vISBPZmZsb2FkUGFyYW1ldGVyVHlwZSB0aGF0IGRlc2NyaWJlcyBkaXJlY3Rpb24gb2YgZGF0YSB0cmFuc2ZlcgorICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVpbnQ4X3QgaW4gIDogMTsgLy8hPCBTZXQgaWYgSU4gb3IgSU5PVVQKKyAgICAgICAgICAgIHVpbnQ4X3Qgb3V0IDogMTsgLy8hPCBTZXQgaWYgT1VUIG9yIElOT1VUCisgICAgICAgIH07CisgICAgICAgIHVpbnQ4X3QgYml0czsKKyAgICB9IGRpcmVjdGlvbjsKKworICAgIHVpbnQ4X3QgYWxsb2NfaWY7ICAgICAgICAvLyE8IGFsbG9jX2lmIG1vZGlmaWVyIHZhbHVlCisgICAgdWludDhfdCBmcmVlX2lmOyAgICAgICAgIC8vITwgZnJlZV9pZiBtb2RpZmllciB2YWx1ZQorICAgIHVpbnQzMl90IGFsaWduOyAgICAgICAgICAvLyE8IE1JQyBhbGlnbm1lbnQgcmVxdWVzdGVkIGZvciBwb2ludGVyIGRhdGEKKyAgICAvLyEgTm90IHVzZWQgYnkgY29tcGlsZXI7IHNldCB0byAwCisgICAgLyohIFVzZWQgYnkgcnVudGltZSBhcyBvZmZzZXQgdG8gZGF0YSBmcm9tIHN0YXJ0IG9mIE1JQyBidWZmZXIgKi8KKyAgICB1aW50MzJfdCBtaWNfb2Zmc2V0OworICAgIC8vISBGbGFncyBkZXNjcmliaW5nIHRoaXMgdmFyaWFibGUKKyAgICB1bmlvbiB7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAvLyEgc291cmNlIHZhcmlhYmxlIGhhcyBwZXJzaXN0ZW50IHN0b3JhZ2UKKyAgICAgICAgICAgIHVpbnQzMl90IGlzX3N0YXRpYyA6IDE7CisgICAgICAgICAgICAvLyEgZGVzdGluYXRpb24gdmFyaWFibGUgaGFzIHBlcnNpc3RlbnQgc3RvcmFnZQorICAgICAgICAgICAgdWludDMyX3QgaXNfc3RhdGljX2RzdG4gOiAxOworICAgICAgICAgICAgLy8hIGhhcyBsZW5ndGggZm9yIGNfZHYgJiYgY19kdl9wdHIKKyAgICAgICAgICAgIHVpbnQzMl90IGhhc19sZW5ndGggOiAxOworICAgICAgICAgICAgLy8hIHBlcnNpc3RlZCBsb2NhbCBzY2FsYXIgaXMgaW4gc3RhY2sgYnVmZmVyCisgICAgICAgICAgICB1aW50MzJfdCBpc19zdGFja19idWYgOiAxOworICAgICAgICAgICAgLy8hIGJ1ZmZlciBhZGRyZXNzIGlzIHNlbnQgaW4gZGF0YQorICAgICAgICAgICAgdWludDMyX3Qgc2lua19hZGRyIDogMTsKKyAgICAgICAgICAgIC8vISBhbGxvYyBkaXNwbGFjZW1lbnQgaXMgc2VudCBpbiBkYXRhCisgICAgICAgICAgICB1aW50MzJfdCBhbGxvY19kaXNwIDogMTsKKyAgICAgICAgICAgIC8vISBzb3VyY2UgZGF0YSBpcyBub25jb250aWd1b3VzCisgICAgICAgICAgICB1aW50MzJfdCBpc19ub25jb250X3NyYyA6IDE7CisgICAgICAgICAgICAvLyEgZGVzdGluYXRpb24gZGF0YSBpcyBub25jb250aWd1b3VzCisgICAgICAgICAgICB1aW50MzJfdCBpc19ub25jb250X2RzdCA6IDE7CisgICAgICAgIH07CisgICAgICAgIHVpbnQzMl90IGJpdHM7CisgICAgfSBmbGFnczsKKyAgICAvLyEgTm90IHVzZWQgYnkgY29tcGlsZXI7IHNldCB0byAwCisgICAgLyohIFVzZWQgYnkgcnVudGltZSBhcyBvZmZzZXQgdG8gYmFzZSBmcm9tIGRhdGEgc3RvcmVkIGluIGEgYnVmZmVyICovCisgICAgaW50NjRfdCBvZmZzZXQ7CisgICAgLy8hIEVsZW1lbnQgYnl0ZS1zaXplIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQKKyAgICAvKiEgRm9yIGRvcGUtdmVjdG9yLCB0aGUgc2l6ZSBvZiB0aGUgZG9wZS12ZWN0b3IgICAgICAqLworICAgIGludDY0X3Qgc2l6ZTsKKyAgICB1bmlvbiB7CisgICAgICAgIC8vISBTZXQgdG8gMCBmb3IgYXJyYXkgZXhwcmVzc2lvbnMgYW5kIGRvcGUtdmVjdG9ycworICAgICAgICAvKiEgU2V0IHRvIDEgZm9yIHNjYWxhcnMgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qISBTZXQgdG8gdmFsdWUgb2YgbGVuZ3RoIG1vZGlmaWVyIGZvciBwb2ludGVycyAgKi8KKyAgICAgICAgaW50NjRfdCBjb3VudDsKKyAgICAgICAgLy8hIERpc3BsYWNlbWVudCBub3QgdXNlZCBieSBjb21waWxlcgorICAgICAgICBpbnQ2NF90IGRpc3A7CisgICAgfTsKKworICAgIC8vISBUaGlzIGZpZWxkIG5vdCB1c2VkIGJ5IE9wZW5NUCA0LjAKKyAgICAvKiEgVGhlIGFsbG9jIHNlY3Rpb24gZXhwcmVzc2lvbiBpbiAjcHJhZ21hIG9mZmxvYWQgICAqLworICAgIHVuaW9uIHsKKyAgICAgICB2b2lkICphbGxvYzsKKyAgICAgICBpbnQ2NF90IHB0cl9hcnJfb2Zmc2V0OworICAgIH07CisKKyAgICAvLyEgVGhpcyBmaWVsZCBub3QgdXNlZCBieSBPcGVuTVAgNC4wCisgICAgLyohIFRoZSBpbnRvIHNlY3Rpb24gZXhwcmVzc2lvbiBpbiAjcHJhZ21hIG9mZmxvYWQgICAgKi8KKyAgICAvKiEgRm9yIGNfZGF0YV9wdHJfYXJyYXkgdGhpcyBpcyB0aGUgaW50byBwdHIgYXJyYXkgICAqLworICAgIHZvaWQgKmludG87CisKKyAgICAvLyEgRm9yIGFuIG9yZGluYXJ5IHZhcmlhYmxlLCBhZGRyZXNzIG9mIHRoZSB2YXJpYWJsZQorICAgIC8qISBGb3IgY19jZWFuX3ZhciAoQy9DKysgYXJyYXkgZXhwcmVzc2lvbiksCisgICAgICAgIHBvaW50ZXIgdG8gYXJyX2Rlc2MsIHdoaWNoIGlzIGFuIGFycmF5IGRlc2NyaXB0b3IuICovCisgICAgLyohIEZvciBjX2RhdGFfcHRyX2FycmF5IChhcnJheSBvZiBkYXRhIHBvaW50ZXJzKSwKKyAgICAgICAgcG9pbnRlciB0byBwdHJfYXJyYXlfZGVzY3JpcHRvciwKKyAgICAgICAgd2hpY2ggaXMgYSBkZXNjcmlwdG9yIGZvciBwb2ludGVyIGFycmF5IHRyYW5zZmVycy4gKi8KKyAgICB2b2lkICpwdHI7Cit9OworCisvLyEgQXV4aWxpYXJ5IHN0cnVjdCB1c2VkIHdoZW4gLWcgaXMgZW5hYmxlZCB0aGF0IGhvbGRzIHZhcmlhYmxlIG5hbWVzCitzdHJ1Y3QgVmFyRGVzYzIgeworICAgIGNvbnN0IGNoYXIgKnNuYW1lOyAvLyE8IFNvdXJjZSBuYW1lCisgICAgY29uc3QgY2hhciAqZG5hbWU7IC8vITwgRGVzdGluYXRpb24gbmFtZSAod2hlbiAiaW50byIgaXMgdXNlZCkKK307CisKKy8qISBXaGVuIHRoZSBPZmZsb2FkSXRlbVR5cGUgaXMgY19kYXRhX3B0cl9hcnJheQorICAgIHRoZSBwdHIgZmllbGQgb2YgdGhlIG1haW4gZGVzY3JpcHRvciBwb2ludHMgdG8gdGhpcyBzdHJ1Y3QuICAgICAgICAgICovCisvKiEgVGhlIHR5cGUgaW4gVmFyRGVzYzEgbWVyZWx5IHNheXMgY19jZWFuX2RhdGFfcHRyLCBidXQgdGhlIHBvaW50ZXIKKyAgICB0eXBlIGNhbiBiZSBjX2RhdGFfcHRyLCBjX2Z1bmNfcHRyLCBjX3ZvaWRfcHRyLCBvciBjX3N0cmluZ19wdHIuCisgICAgVGhlcmVmb3JlIHRoZSBhY3R1YWwgcG9pbnRlciB0eXBlIGlzIGluIHRoZSBmbGFncyBmaWVsZCBvZiBWYXJEZXNjMy4gKi8KKy8qISBJZiBmbGFnX2FsaWduX2lzX2FycmF5L2ZsYWdfYWxsb2NfaWZfaXNfYXJyYXkvZmxhZ19mcmVlX2lmX2lzX2FycmF5CisgICAgaXMgMCB0aGVuIGFsaWdubWVudC9hbGxvY19pZi9mcmVlX2lmIGFyZSBzcGVjaWZpZWQgaW4gVmFyRGVzYzEuICAgICAgKi8KKy8qISBJZiBmbGFnX2FsaWduX2lzX2FycmF5L2ZsYWdfYWxsb2NfaWZfaXNfYXJyYXkvZmxhZ19mcmVlX2lmX2lzX2FycmF5CisgICAgaXMgMSB0aGVuIGFsaWduX2FycmF5L2FsbG9jX2lmX2FycmF5L2ZyZWVfaWZfYXJyYXkgc3BlY2lmeQorICAgIHRoZSBzZXQgb2YgYWxpZ25tZW50L2FsbG9jX2lmL2ZyZWVfaWYgdmFsdWVzLiAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiEgRm9yIHRoZSBvdGhlciBmaWVsZHMsIGlmIG5laXRoZXIgdGhlIHNjYWxhciBub3IgdGhlIGFycmF5IGZsYWcKKyAgICBpcyBzZXQsIHRoZW4gdGhhdCBtb2RpZmllciB3YXMgbm90IHNwZWNpZmllZC4gSWYgdGhlIGJpdHMgYXJlIHNldAorICAgIHRoZXkgc3BlY2lmeSB3aGljaCBtb2RpZmllciB3YXMgc2V0IGFuZCB3aGV0aGVyIGl0IHdhcyBhCisgICAgc2NhbGFyIG9yIGFuIGFycmF5IGV4cHJlc3Npb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0cnVjdCBWYXJEZXNjMworeworICAgIHZvaWQgKnB0cl9hcnJheTsgICAgICAgIC8vITwgUG9pbnRlciB0byBhcnJfZGVzYyBvZiBhcnJheSBvZiBwb2ludGVycworICAgIHZvaWQgKmFsaWduX2FycmF5OyAgICAgIC8vITwgU2NhbGFyIHZhbHVlIG9yIHBvaW50ZXIgdG8gYXJyX2Rlc2MKKyAgICB2b2lkICphbGxvY19pZl9hcnJheTsgICAvLyE8IFNjYWxhciB2YWx1ZSBvciBwb2ludGVyIHRvIGFycl9kZXNjCisgICAgdm9pZCAqZnJlZV9pZl9hcnJheTsgICAgLy8hPCBTY2FsYXIgdmFsdWUgb3IgcG9pbnRlciB0byBhcnJfZGVzYworICAgIHZvaWQgKmV4dGVudF9zdGFydDsgICAgIC8vITwgU2NhbGFyIHZhbHVlIG9yIHBvaW50ZXIgdG8gYXJyX2Rlc2MKKyAgICB2b2lkICpleHRlbnRfZWxlbWVudHM7ICAvLyE8IFNjYWxhciB2YWx1ZSBvciBwb2ludGVyIHRvIGFycl9kZXNjCisgICAgdm9pZCAqaW50b19zdGFydDsgICAgICAgLy8hPCBTY2FsYXIgdmFsdWUgb3IgcG9pbnRlciB0byBhcnJfZGVzYworICAgIHZvaWQgKmludG9fZWxlbWVudHM7ICAgIC8vITwgU2NhbGFyIHZhbHVlIG9yIHBvaW50ZXIgdG8gYXJyX2Rlc2MKKyAgICB2b2lkICphbGxvY19zdGFydDsgICAgICAvLyE8IFNjYWxhciB2YWx1ZSBvciBwb2ludGVyIHRvIGFycl9kZXNjCisgICAgdm9pZCAqYWxsb2NfZWxlbWVudHM7ICAgLy8hPCBTY2FsYXIgdmFsdWUgb3IgcG9pbnRlciB0byBhcnJfZGVzYworICAgIC8qISBGbGFncyB0aGF0IGRlc2NyaWJlIHRoZSBwb2ludGVyIHR5cGUgYW5kIHdoZXRoZXIgZWFjaCBmaWVsZAorICAgICAgICBpcyBhIHNjYWxhciB2YWx1ZSBvciBhbiBhcnJheSBleHByZXNzaW9uLiAgICAgICAgKi8KKyAgICAvKiEgRmlyc3QgNiBiaXRzIGFyZSBwb2ludGVyIGFycmF5IGVsZW1lbnQgdHlwZToKKyAgICAgICAgY19kYXRhX3B0ciwgY19mdW5jX3B0ciwgY192b2lkX3B0ciwgY19zdHJpbmdfcHRyICovCisgICAgLyohIFRoZW4gc2luZ2xlIGJpdHMgc3BlY2lmeTogICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qISAgICAgYWxpZ25fYXJyYXkgaXMgYW4gYXJyYXkgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiEgICAgIGFsbG9jX2lmX2FycmF5IGlzIGFuIGFycmF5ICAgICAgICAgICAgICAgICAgICovCisgICAgLyohICAgICBmcmVlX2lmX2FycmF5IGlzIGFuIGFycmF5ICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qISAgICAgZXh0ZW50X3N0YXJ0IGlzIGEgc2NhbGFyIGV4cHJlc3Npb24gICAgICAgICAgKi8KKyAgICAvKiEgICAgIGV4dGVudF9zdGFydCBpcyBhbiBhcnJheSBleHByZXNzaW9uICAgICAgICAgICovCisgICAgLyohICAgICBleHRlbnRfZWxlbWVudHMgaXMgYSBzY2FsYXIgZXhwcmVzc2lvbiAgICAgICAqLworICAgIC8qISAgICAgZXh0ZW50X2VsZW1lbnRzIGlzIGFuIGFycmF5IGV4cHJlc3Npb24gICAgICAgKi8KKyAgICAvKiEgICAgIGludG9fc3RhcnQgaXMgYSBzY2FsYXIgZXhwcmVzc2lvbiAgICAgICAgICAgICovCisgICAgLyohICAgICBpbnRvX3N0YXJ0IGlzIGFuIGFycmF5IGV4cHJlc3Npb24gICAgICAgICAgICAqLworICAgIC8qISAgICAgaW50b19lbGVtZW50cyBpcyBhIHNjYWxhciBleHByZXNzaW9uICAgICAgICAgKi8KKyAgICAvKiEgICAgIGludG9fZWxlbWVudHMgaXMgYW4gYXJyYXkgZXhwcmVzc2lvbiAgICAgICAgICovCisgICAgLyohICAgICBhbGxvY19zdGFydCBpcyBhIHNjYWxhciBleHByZXNzaW9uICAgICAgICAgICAqLworICAgIC8qISAgICAgYWxsb2Nfc3RhcnQgaXMgYW4gYXJyYXkgZXhwcmVzc2lvbiAgICAgICAgICAgKi8KKyAgICAvKiEgICAgIGFsbG9jX2VsZW1lbnRzIGlzIGEgc2NhbGFyIGV4cHJlc3Npb24gICAgICAgICovCisgICAgLyohICAgICBhbGxvY19lbGVtZW50cyBpcyBhbiBhcnJheSBleHByZXNzaW9uICAgICAgICAqLworICAgIHVpbnQzMl90IGFycmF5X2ZpZWxkczsKK307Citjb25zdCBpbnQgZmxhZ19hbGlnbl9pc19hcnJheSA9IDY7Citjb25zdCBpbnQgZmxhZ19hbGxvY19pZl9pc19hcnJheSA9IDc7Citjb25zdCBpbnQgZmxhZ19mcmVlX2lmX2lzX2FycmF5ID0gODsKK2NvbnN0IGludCBmbGFnX2V4dGVudF9zdGFydF9pc19zY2FsYXIgPSA5OworY29uc3QgaW50IGZsYWdfZXh0ZW50X3N0YXJ0X2lzX2FycmF5ID0gMTA7Citjb25zdCBpbnQgZmxhZ19leHRlbnRfZWxlbWVudHNfaXNfc2NhbGFyID0gMTE7Citjb25zdCBpbnQgZmxhZ19leHRlbnRfZWxlbWVudHNfaXNfYXJyYXkgPSAxMjsKK2NvbnN0IGludCBmbGFnX2ludG9fc3RhcnRfaXNfc2NhbGFyID0gMTM7Citjb25zdCBpbnQgZmxhZ19pbnRvX3N0YXJ0X2lzX2FycmF5ID0gMTQ7Citjb25zdCBpbnQgZmxhZ19pbnRvX2VsZW1lbnRzX2lzX3NjYWxhciA9IDE1OworY29uc3QgaW50IGZsYWdfaW50b19lbGVtZW50c19pc19hcnJheSA9IDE2OworY29uc3QgaW50IGZsYWdfYWxsb2Nfc3RhcnRfaXNfc2NhbGFyID0gMTc7Citjb25zdCBpbnQgZmxhZ19hbGxvY19zdGFydF9pc19hcnJheSA9IDE4OworY29uc3QgaW50IGZsYWdfYWxsb2NfZWxlbWVudHNfaXNfc2NhbGFyID0gMTk7Citjb25zdCBpbnQgZmxhZ19hbGxvY19lbGVtZW50c19pc19hcnJheSA9IDIwOworCisvLyBUaGUgTWFyc2hhbGxlcgorY2xhc3MgTWFyc2hhbGxlcgoreworcHJpdmF0ZToKKyAgICAvLyBTdGFydCBhZGRyZXNzIG9mIGJ1ZmZlcgorICAgIGNoYXIgKmJ1ZmZlcl9zdGFydDsKKworICAgIC8vIEN1cnJlbnQgcG9pbnRlciB3aXRoaW4gYnVmZmVyCisgICAgY2hhciAqYnVmZmVyX3B0cjsKKworICAgIC8vIFBoeXNpY2FsIHNpemUgb2YgZGF0YSBzZW50IChpbmNsdWRpbmcgZmxhZ3MpCisgICAgbG9uZyBsb25nIGJ1ZmZlcl9zaXplOworCisgICAgLy8gVXNlciBkYXRhIHNlbnQvcmVjZWl2ZWQKKyAgICBsb25nIGxvbmcgdGZyX3NpemU7CisKK3B1YmxpYzoKKyAgICAvLyBDb25zdHJ1Y3RvcgorICAgIE1hcnNoYWxsZXIoKSA6CisgICAgICAgIGJ1ZmZlcl9zdGFydCgwKSwgYnVmZmVyX3B0cigwKSwKKyAgICAgICAgYnVmZmVyX3NpemUoMCksIHRmcl9zaXplKDApCisgICAgeworICAgIH0KKworICAgIC8vIFJldHVybiBjb3VudCBvZiB1c2VyIGRhdGEgc2VudC9yZWNlaXZlZAorICAgIGxvbmcgbG9uZyBnZXRfdGZyX3NpemUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHRmcl9zaXplOworICAgIH0KKworICAgIC8vIFJldHVybiBwb2ludGVyIHRvIGJ1ZmZlcgorICAgIGNoYXIgKmdldF9idWZmZXJfc3RhcnQoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlcl9zdGFydDsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gY3VycmVudCBzaXplIG9mIGRhdGEgaW4gYnVmZmVyCisgICAgbG9uZyBsb25nIGdldF9idWZmZXJfc2l6ZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gYnVmZmVyX3NpemU7CisgICAgfQorCisgICAgLy8gU2V0IGJ1ZmZlciBwb2ludGVyCisgICAgdm9pZCBpbml0X2J1ZmZlcigKKyAgICAgICAgY2hhciAqZCwKKyAgICAgICAgbG9uZyBsb25nIHMKKyAgICApCisgICAgeworICAgICAgICBidWZmZXJfc3RhcnQgPSBidWZmZXJfcHRyID0gZDsKKyAgICAgICAgYnVmZmVyX3NpemUgPSBzOworICAgIH0KKworICAgIC8vIFNlbmQgZGF0YQorICAgIHZvaWQgc2VuZF9kYXRhKAorICAgICAgICBjb25zdCB2b2lkICpkYXRhLAorICAgICAgICBpbnQ2NF90IGxlbmd0aAorICAgICk7CisKKyAgICAvLyBSZWNlaXZlIGRhdGEKKyAgICB2b2lkIHJlY2VpdmVfZGF0YSgKKyAgICAgICAgdm9pZCAqZGF0YSwKKyAgICAgICAgaW50NjRfdCBsZW5ndGgKKyAgICApOworCisgICAgLy8gU2VuZCBmdW5jdGlvbiBwb2ludGVyCisgICAgdm9pZCBzZW5kX2Z1bmNfcHRyKAorICAgICAgICBjb25zdCB2b2lkKiBkYXRhCisgICAgKTsKKworICAgIC8vIFJlY2VpdmUgZnVuY3Rpb24gcG9pbnRlcgorICAgIHZvaWQgcmVjZWl2ZV9mdW5jX3B0cigKKyAgICAgICAgY29uc3Qgdm9pZCoqIGRhdGEKKyAgICApOworfTsKKworLy8gRW5kIG9mIHRoZSBNYXJzaGFsbGVyCisKKy8vIFRoZSBvZmZsb2FkZWQgZnVuY3Rpb24gZGVzY3JpcHRvci4KKy8vIFNlbnQgZnJvbSBob3N0IHRvIHRhcmdldCB0byBzcGVjaWZ5IHdoaWNoIGZ1bmN0aW9uIHRvIHJ1bi4KKy8vIEFsc28sIHNldHMgY29uc29sZSBhbmQgZmlsZSB0cmFjaW5nIGxldmVscy4KK3N0cnVjdCBGdW5jdGlvbkRlc2NyaXB0b3IKK3sKKyAgICAvLyBJbnB1dCBkYXRhIHNpemUuCisgICAgbG9uZyBsb25nIGluX2RhdGFsZW47CisKKyAgICAvLyBPdXRwdXQgZGF0YSBzaXplLgorICAgIGxvbmcgbG9uZyBvdXRfZGF0YWxlbjsKKworICAgIC8vIFdoZXRoZXIgdHJhY2UgaXMgcmVxdWVzdGVkIG9uIGNvbnNvbGUuCisgICAgLy8gQSB2YWx1ZSBvZiAxIHByb2R1Y2VzIG9ubHkgZnVuY3Rpb24gbmFtZSBhbmQgZGF0YSBzZW50L3JlY2VpdmVkLgorICAgIC8vIFZhbHVlcyA+IDEgcHJvZHVjZSBjb3Bpb3VzIHRyYWNlIGluZm9ybWF0aW9uLgorICAgIHVpbnQ4X3QgY29uc29sZV9lbmFibGVkOworCisgICAgLy8gRmxhZyBjb250cm9sbGluZyB0aW1pbmcgb24gdGhlIHRhcmdldCBzaWRlLgorICAgIC8vIFZhbHVlcyA+IDAgZW5hYmxlIHRpbWluZyBvbiBzaW5rLgorICAgIHVpbnQ4X3QgdGltZXJfZW5hYmxlZDsKKworICAgIGludCBvZmZsb2FkX3JlcG9ydF9sZXZlbDsKKyAgICBpbnQgb2ZmbG9hZF9udW1iZXI7CisKKyAgICAvLyBudW1iZXIgb2YgdmFyaWFibGUgZGVzY3JpcHRvcnMKKyAgICBpbnQgdmFyc19udW07CisKKyAgICAvLyBpbm91dCBkYXRhIG9mZnNldCBpZiBkYXRhIGlzIHBhc3NlZCBhcyBtaXNjL3JldHVybiBkYXRhCisgICAgLy8gb3RoZXJ3aXNlIGl0IHNob3VsZCBiZSB6ZXJvLgorICAgIGludCBkYXRhX29mZnNldDsKKworICAgIC8vIFRoZSBuYW1lIG9mIHRoZSBvZmZsb2FkZWQgZnVuY3Rpb24KKyAgICBjaGFyIGRhdGFbXTsKK307CisKKy8vIHR5cGVkZWYgT0ZGTE9BRC4KKy8vIFBvaW50ZXIgdG8gT2ZmbG9hZERlc2NyaXB0b3IuCit0eXBlZGVmIHN0cnVjdCBPZmZsb2FkRGVzY3JpcHRvciAqT0ZGTE9BRDsKKworI2VuZGlmIC8vIE9GRkxPQURfQ09NTU9OX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfZW5naW5lLmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfZW5naW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjliNjA0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9lbmdpbmUuY3BwCkBAIC0wLDAgKzEsNTMxIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJvZmZsb2FkX2VuZ2luZS5oIgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAib2ZmbG9hZF9ob3N0LmgiCisjaW5jbHVkZSAib2ZmbG9hZF90YWJsZS5oIgorCitjb25zdCBjaGFyKiBFbmdpbmU6Om1fZnVuY19uYW1lc1tFbmdpbmU6OmNfZnVuY3NfdG90YWxdID0KK3sKKyAgICAic2VydmVyX2NvbXB1dGUiLAorI2lmZGVmIE1ZT19TVVBQT1JUCisgICAgInNlcnZlcl9teW9pbml0IiwKKyAgICAic2VydmVyX215b2ZpbmkiLAorI2VuZGlmIC8vIE1ZT19TVVBQT1JUCisgICAgInNlcnZlcl9pbml0IiwKKyAgICAic2VydmVyX3Zhcl90YWJsZV9zaXplIiwKKyAgICAic2VydmVyX3Zhcl90YWJsZV9jb3B5IgorfTsKKworLy8gU3ltYm9saWMgcmVwcmVzZW50YXRpb24gb2Ygc3lzdGVtIHNpZ25hbHMuIEZpeCBmb3IgQ1EyMzM1OTMKK2NvbnN0IGNoYXIqIEVuZ2luZTo6Y19zaWduYWxfbmFtZXNbRW5naW5lOjpjX3NpZ25hbF9tYXhdID0KK3sKKyAgICAiVW5rbm93biBTSUdOQUwiLAorICAgICJTSUdIVVAiLCAgICAvKiAgMSwgSGFuZ3VwIChQT1NJWCkuICAqLworICAgICJTSUdJTlQiLCAgICAvKiAgMiwgSW50ZXJydXB0IChBTlNJKS4gICovCisgICAgIlNJR1FVSVQiLCAgIC8qICAzLCBRdWl0IChQT1NJWCkuICAqLworICAgICJTSUdJTEwiLCAgICAvKiAgNCwgSWxsZWdhbCBpbnN0cnVjdGlvbiAoQU5TSSkuICAqLworICAgICJTSUdUUkFQIiwgICAvKiAgNSwgVHJhY2UgdHJhcCAoUE9TSVgpLiAgKi8KKyAgICAiU0lHQUJSVCIsICAgLyogIDYsIEFib3J0IChBTlNJKS4gICovCisgICAgIlNJR0JVUyIsICAgIC8qICA3LCBCVVMgZXJyb3IgKDQuMiBCU0QpLiAgKi8KKyAgICAiU0lHRlBFIiwgICAgLyogIDgsIEZsb2F0aW5nLXBvaW50IGV4Y2VwdGlvbiAoQU5TSSkuICAqLworICAgICJTSUdLSUxMIiwgICAvKiAgOSwgS2lsbCwgdW5ibG9ja2FibGUgKFBPU0lYKS4gICovCisgICAgIlNJR1VTUjEiLCAgIC8qIDEwLCBVc2VyLWRlZmluZWQgc2lnbmFsIDEgKFBPU0lYKS4gICovCisgICAgIlNJR1NFR1YiLCAgIC8qIDExLCBTZWdtZW50YXRpb24gdmlvbGF0aW9uIChBTlNJKS4gICovCisgICAgIlNJR1VTUjIiLCAgIC8qIDEyLCBVc2VyLWRlZmluZWQgc2lnbmFsIDIgKFBPU0lYKS4gICovCisgICAgIlNJR1BJUEUiLCAgIC8qIDEzLCBCcm9rZW4gcGlwZSAoUE9TSVgpLiAgKi8KKyAgICAiU0lHQUxSTSIsICAgLyogMTQsIEFsYXJtIGNsb2NrIChQT1NJWCkuICAqLworICAgICJTSUdURVJNIiwgICAvKiAxNSwgVGVybWluYXRpb24gKEFOU0kpLiAgKi8KKyAgICAiU0lHU1RLRkxUIiwgLyogMTYsIFN0YWNrIGZhdWx0LiAgKi8KKyAgICAiU0lHQ0hMRCIsICAgLyogMTcsIENoaWxkIHN0YXR1cyBoYXMgY2hhbmdlZCAoUE9TSVgpLiAgKi8KKyAgICAiU0lHQ09OVCIsICAgLyogMTgsIENvbnRpbnVlIChQT1NJWCkuICAqLworICAgICJTSUdTVE9QIiwgICAvKiAxOSwgU3RvcCwgdW5ibG9ja2FibGUgKFBPU0lYKS4gICovCisgICAgIlNJR1RTVFAiLCAgIC8qIDIwLCBLZXlib2FyZCBzdG9wIChQT1NJWCkuICAqLworICAgICJTSUdUVElOIiwgICAvKiAyMSwgQmFja2dyb3VuZCByZWFkIGZyb20gdHR5IChQT1NJWCkuICAqLworICAgICJTSUdUVE9VIiwgICAvKiAyMiwgQmFja2dyb3VuZCB3cml0ZSB0byB0dHkgKFBPU0lYKS4gICovCisgICAgIlNJR1VSRyIsICAgIC8qIDIzLCBVcmdlbnQgY29uZGl0aW9uIG9uIHNvY2tldCAoNC4yIEJTRCkuICAqLworICAgICJTSUdYQ1BVIiwgICAvKiAyNCwgQ1BVIGxpbWl0IGV4Y2VlZGVkICg0LjIgQlNEKS4gICovCisgICAgIlNJR1hGU1oiLCAgIC8qIDI1LCBGaWxlIHNpemUgbGltaXQgZXhjZWVkZWQgKDQuMiBCU0QpLiAgKi8KKyAgICAiU0lHVlRBTFJNIiwgLyogMjYsIFZpcnR1YWwgYWxhcm0gY2xvY2sgKDQuMiBCU0QpLiAgKi8KKyAgICAiU0lHUFJPRiIsICAgLyogMjcsIFByb2ZpbGluZyBhbGFybSBjbG9jayAoNC4yIEJTRCkuICAqLworICAgICJTSUdXSU5DSCIsICAvKiAyOCwgV2luZG93IHNpemUgY2hhbmdlICg0LjMgQlNELCBTdW4pLiAgKi8KKyAgICAiU0lHSU8iLCAgICAgLyogMjksIEkvTyBub3cgcG9zc2libGUgKDQuMiBCU0QpLiAgKi8KKyAgICAiU0lHUFdSIiwgICAgLyogMzAsIFBvd2VyIGZhaWx1cmUgcmVzdGFydCAoU3lzdGVtIFYpLiAgKi8KKyAgICAiU0lHU1lTIiAgICAgLyogMzEsIEJhZCBzeXN0ZW0gY2FsbC4gICovCit9OworCit2b2lkIEVuZ2luZTo6aW5pdCh2b2lkKQoreworICAgIGlmICghbV9yZWFkeSkgeworICAgICAgICBtdXRleF9sb2NrZXJfdCBsb2NrZXIobV9sb2NrKTsKKworICAgICAgICBpZiAoIW1fcmVhZHkpIHsKKyAgICAgICAgICAgIC8vIHN0YXJ0IHByb2Nlc3MgaWYgbm90IGRvbmUgeWV0CisgICAgICAgICAgICBpZiAobV9wcm9jZXNzID09IDApIHsKKyAgICAgICAgICAgICAgICBpbml0X3Byb2Nlc3MoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbG9hZCBwZW5naW5nIGltYWdlcworICAgICAgICAgICAgbG9hZF9saWJyYXJpZXMoKTsKKworICAgICAgICAgICAgLy8gYW5kIChyZSlidWlsZCBwb2ludGVyIHRhYmxlCisgICAgICAgICAgICBpbml0X3B0cl9kYXRhKCk7CisKKyAgICAgICAgICAgIC8vIGl0IGlzIHJlYWR5IG5vdworICAgICAgICAgICAgbV9yZWFkeSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgRW5naW5lOjppbml0X3Byb2Nlc3Modm9pZCkKK3sKKyAgICBDT0lFTkdJTkUgZW5naW5lOworICAgIENPSVJFU1VMVCByZXM7CisgICAgY29uc3QgY2hhciAqKmVudmlyb247CisKKyAgICAvLyBjcmVhdGUgZW52aXJvbm1lbnQgZm9yIHRoZSB0YXJnZXQgcHJvY2VzcworICAgIGVudmlyb24gPSAoY29uc3QgY2hhcioqKSBtaWNfZW52X3ZhcnMuY3JlYXRlX2Vudmlyb25fZm9yX2NhcmQobV9pbmRleCk7CisgICAgaWYgKGVudmlyb24gIT0gMCkgeworICAgICAgICBmb3IgKGNvbnN0IGNoYXIgKipwID0gZW52aXJvbjsgKnAgIT0gMDsgcCsrKSB7CisgICAgICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICJFbnYgVmFyIGZvciBjYXJkICVkOiAlc1xuIiwgbV9pbmRleCwgKnApOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGV4ZWN1dGlvbiBjb250ZXh0IGluIHRoZSBzcGVjaWZpZWQgZGV2aWNlCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiR2V0dGluZyBkZXZpY2UgJWQgKGVuZ2luZSAlZCkgaGFuZGxlXG4iLCBtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgbV9waHlzaWNhbF9pbmRleCk7CisgICAgcmVzID0gQ09JOjpFbmdpbmVHZXRIYW5kbGUoQ09JX0lTQV9LTkMsIG1fcGh5c2ljYWxfaW5kZXgsICZlbmdpbmUpOworICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfZ2V0X2VuZ2luZV9oYW5kbGUsIG1faW5kZXgsIHJlcyk7CisKKyAgICAvLyBUYXJnZXQgZXhlY3V0YWJsZSBzaG91bGQgYmUgYXZhaWxhYmxlIGJ5IHRoZSB0aW1lIHdoZW4gd2UKKyAgICAvLyBhdHRlbXB0IHRvIGluaXRpYWxpemUgdGhlIGRldmljZQorICAgIGlmIChfX3RhcmdldF9leGUgPT0gMCkgeworICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfbm9fdGFyZ2V0X2V4ZSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLAorICAgICAgICAiTG9hZGluZyB0YXJnZXQgZXhlY3V0YWJsZSBcIiVzXCIgZnJvbSAlcCwgc2l6ZSAlbGxkXG4iLAorICAgICAgICBfX3RhcmdldF9leGUtPm5hbWUsIF9fdGFyZ2V0X2V4ZS0+ZGF0YSwgX190YXJnZXRfZXhlLT5zaXplKTsKKworICAgIHJlcyA9IENPSTo6UHJvY2Vzc0NyZWF0ZUZyb21NZW1vcnkoCisgICAgICAgIGVuZ2luZSwgICAgICAgICAgICAgICAgIC8vIGluX0VuZ2luZQorICAgICAgICBfX3RhcmdldF9leGUtPm5hbWUsICAgICAvLyBpbl9wQmluYXJ5TmFtZQorICAgICAgICBfX3RhcmdldF9leGUtPmRhdGEsICAgICAvLyBpbl9wQmluYXJ5QnVmZmVyCisgICAgICAgIF9fdGFyZ2V0X2V4ZS0+c2l6ZSwgICAgIC8vIGluX0JpbmFyeUJ1ZmZlckxlbmd0aCwKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLy8gaW5fQXJnYworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvLyBpbl9wcEFyZ3YKKyAgICAgICAgZW52aXJvbiA9PSAwLCAgICAgICAgICAgLy8gaW5fRHVwRW52CisgICAgICAgIGVudmlyb24sICAgICAgICAgICAgICAgIC8vIGluX3BwQWRkaXRpb25hbEVudgorICAgICAgICBtaWNfcHJveHlfaW8sICAgICAgICAgICAvLyBpbl9Qcm94eUFjdGl2ZQorICAgICAgICBtaWNfcHJveHlfZnNfcm9vdCwgICAgICAvLyBpbl9Qcm94eWZzUm9vdAorICAgICAgICBtaWNfYnVmZmVyX3NpemUsICAgICAgICAvLyBpbl9CdWZmZXJTcGFjZQorICAgICAgICBtaWNfbGlicmFyeV9wYXRoLCAgICAgICAvLyBpbl9MaWJyYXJ5U2VhcmNoUGF0aAorICAgICAgICBfX3RhcmdldF9leGUtPm9yaWdpbiwgICAvLyBpbl9GaWxlT2ZPcmlnaW4KKyAgICAgICAgX190YXJnZXRfZXhlLT5vZmZzZXQsICAgLy8gaW5fRmlsZU9mT3JpZ2luT2Zmc2V0CisgICAgICAgICZtX3Byb2Nlc3MgICAgICAgICAgICAgIC8vIG91dF9wUHJvY2VzcworICAgICk7CisgICAgY2hlY2tfcmVzdWx0KHJlcywgY19wcm9jZXNzX2NyZWF0ZSwgbV9pbmRleCwgcmVzKTsKKworICAgIC8vIGdldCBmdW5jdGlvbiBoYW5kbGVzCisgICAgcmVzID0gQ09JOjpQcm9jZXNzR2V0RnVuY3Rpb25IYW5kbGVzKG1fcHJvY2VzcywgY19mdW5jc190b3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mdW5jX25hbWVzLCBtX2Z1bmNzKTsKKyAgICBjaGVja19yZXN1bHQocmVzLCBjX3Byb2Nlc3NfZ2V0X2Z1bmNfaGFuZGxlcywgbV9pbmRleCwgcmVzKTsKKworICAgIC8vIGluaXRpYWxpemUgZGV2aWNlIHNpZGUKKyAgICBwaWRfdCBwaWQgPSBpbml0X2RldmljZSgpOworCisgICAgLy8gRm9yIElEQgorICAgIGlmIChfX2RiZ19pc19hdHRhY2hlZCkgeworICAgICAgICAvLyBUT0RPOiB3ZSBoYXZlIGluLW1lbW9yeSBleGVjdXRhYmxlIG5vdy4KKyAgICAgICAgLy8gQ2hlY2sgd2l0aCBJREIgdGVhbSB3aGF0IHNob3VsZCB3ZSBwcm92aWRlIHRoZW0gbm93PworICAgICAgICBpZiAoc3RybGVuKF9fdGFyZ2V0X2V4ZS0+bmFtZSkgPCBNQVhfVEFSR0VUX05BTUUpIHsKKyAgICAgICAgICAgIHN0cmNweShfX2RiZ190YXJnZXRfZXhlX25hbWUsIF9fdGFyZ2V0X2V4ZS0+bmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgX19kYmdfdGFyZ2V0X3NvX3BpZCA9IHBpZDsKKyAgICAgICAgX19kYmdfdGFyZ2V0X2lkID0gbV9waHlzaWNhbF9pbmRleDsKKyAgICAgICAgX19kYmdfdGFyZ2V0X3NvX2xvYWRlZCgpOworICAgIH0KK30KKwordm9pZCBFbmdpbmU6OmZpbmlfcHJvY2Vzcyhib29sIHZlcmJvc2UpCit7CisgICAgaWYgKG1fcHJvY2VzcyAhPSAwKSB7CisgICAgICAgIHVpbnQzMl90IHNpZzsKKyAgICAgICAgaW50OF90IHJldDsKKworICAgICAgICAvLyBkZXN0cm95IHRhcmdldCBwcm9jZXNzCisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkRlc3Ryb3lpbmcgcHJvY2VzcyBvbiB0aGUgZGV2aWNlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5kZXgpOworCisgICAgICAgIENPSVJFU1VMVCByZXMgPSBDT0k6OlByb2Nlc3NEZXN0cm95KG1fcHJvY2VzcywgLTEsIDAsICZyZXQsICZzaWcpOworICAgICAgICBtX3Byb2Nlc3MgPSAwOworCisgICAgICAgIGlmIChyZXMgPT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIkRldmljZSBwcm9jZXNzOiBzaWduYWwgJWQsIGV4aXQgY29kZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnLCByZXQpOworICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2lnICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUigKKyAgICAgICAgICAgICAgICAgICAgICAgIGNfbWljX3Byb2Nlc3NfZXhpdF9zaWcsIG1faW5kZXgsIHNpZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNfc2lnbmFsX25hbWVzW3NpZyA+PSBjX3NpZ25hbF9tYXggPyAwIDogc2lnXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfbWljX3Byb2Nlc3NfZXhpdF9yZXQsIG1faW5kZXgsIHJldCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBmb3IgaWRiCisgICAgICAgICAgICBpZiAoX19kYmdfaXNfYXR0YWNoZWQpIHsKKyAgICAgICAgICAgICAgICBfX2RiZ190YXJnZXRfc29fdW5sb2FkZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX21pY19wcm9jZXNzX2V4aXQsIG1faW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEVuZ2luZTo6bG9hZF9saWJyYXJpZXMoKQoreworICAgIC8vIGxvYWQgbGlicmFyaWVzIGNvbGxlY3RlZCBzbyBmYXIKKyAgICBmb3IgKFRhcmdldEltYWdlTGlzdDo6aXRlcmF0b3IgaXQgPSBtX2ltYWdlcy5iZWdpbigpOworICAgICAgICAgaXQgIT0gbV9pbWFnZXMuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiTG9hZGluZyBsaWJyYXJ5IFwiJXNcIiBmcm9tICVwLCBzaXplICVsbHVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPm5hbWUsIGl0LT5kYXRhLCBpdC0+c2l6ZSk7CisKKyAgICAgICAgLy8gbG9hZCBsaWJyYXJ5IHRvIHRoZSBkZXZpY2UKKyAgICAgICAgQ09JTElCUkFSWSBsaWI7CisgICAgICAgIENPSVJFU1VMVCByZXM7CisgICAgICAgIHJlcyA9IENPSTo6UHJvY2Vzc0xvYWRMaWJyYXJ5RnJvbU1lbW9yeShtX3Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LT5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWNfbGlicmFyeV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPm9yaWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LT5vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfTE9BRExJQlJBUllfVjFfRkxBR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGliKTsKKworICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTICYmIHJlcyAhPSBDT0lfQUxSRUFEWV9FWElTVFMpIHsKKyAgICAgICAgICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfbG9hZF9saWJyYXJ5LCBtX2luZGV4LCByZXMpOworICAgICAgICB9CisgICAgfQorICAgIG1faW1hZ2VzLmNsZWFyKCk7Cit9CisKK3N0YXRpYyBib29sIHRhcmdldF9lbnRyeV9jbXAoCisgICAgY29uc3QgVmFyTGlzdDo6QnVmRW50cnkgJmwsCisgICAgY29uc3QgVmFyTGlzdDo6QnVmRW50cnkgJnIKKykKK3sKKyAgICBjb25zdCBjaGFyICpsX25hbWUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihsLm5hbWUpOworICAgIGNvbnN0IGNoYXIgKnJfbmFtZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHIubmFtZSk7CisgICAgcmV0dXJuIHN0cmNtcChsX25hbWUsIHJfbmFtZSkgPCAwOworfQorCitzdGF0aWMgYm9vbCBob3N0X2VudHJ5X2NtcCgKKyAgICBjb25zdCBWYXJUYWJsZTo6RW50cnkgKmwsCisgICAgY29uc3QgVmFyVGFibGU6OkVudHJ5ICpyCispCit7CisgICAgcmV0dXJuIHN0cmNtcChsLT5uYW1lLCByLT5uYW1lKSA8IDA7Cit9CisKK3ZvaWQgRW5naW5lOjppbml0X3B0cl9kYXRhKHZvaWQpCit7CisgICAgQ09JUkVTVUxUIHJlczsKKyAgICBDT0lFVkVOVCBldmVudDsKKworICAgIC8vIFByZXBhcmUgdGFibGUgb2YgaG9zdCBlbnRyaWVzCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgVmFyVGFibGU6OkVudHJ5Kj4gaG9zdF90YWJsZShfX29mZmxvYWRfdmFycy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19vZmZsb2FkX3ZhcnMuZW5kKCkpOworCisgICAgLy8gbm8gbmVlZCB0byBkbyBhbnl0aGluZyBmdXJ0aGVyIGlzIGhvc3QgdGFibGUgaXMgZW1wdHkKKyAgICBpZiAoaG9zdF90YWJsZS5zaXplKCkgPD0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gR2V0IHZhciB0YWJsZSBlbnRyaWVzIGZyb20gdGhlIHRhcmdldC4KKyAgICAvLyBGaXJzdCB3ZSBuZWVkIHRvIGdldCBzaXplIGZvciB0aGUgYnVmZmVyIHRvIGNvcHkgZGF0YQorICAgIHN0cnVjdCB7CisgICAgICAgIGludDY0X3QgbmVsZW1zOworICAgICAgICBpbnQ2NF90IGxlbmd0aDsKKyAgICB9IHBhcmFtczsKKworICAgIHJlcyA9IENPSTo6UGlwZWxpbmVSdW5GdW5jdGlvbihnZXRfcGlwZWxpbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mdW5jc1tjX2Z1bmNfdmFyX3RhYmxlX3NpemVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV2ZW50KTsKKyAgICBjaGVja19yZXN1bHQocmVzLCBjX3BpcGVsaW5lX3J1bl9mdW5jLCBtX2luZGV4LCByZXMpOworCisgICAgcmVzID0gQ09JOjpFdmVudFdhaXQoMSwgJmV2ZW50LCAtMSwgMSwgMCwgMCk7CisgICAgY2hlY2tfcmVzdWx0KHJlcywgY19ldmVudF93YWl0LCByZXMpOworCisgICAgaWYgKHBhcmFtcy5sZW5ndGggPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gY3JlYXRlIGJ1ZmZlciBmb3IgdGFyZ2V0IGVudHJpZXMgYW5kIGNvcHkgZGF0YSB0byBob3N0CisgICAgQ09JQlVGRkVSIGJ1ZmZlcjsKKyAgICByZXMgPSBDT0k6OkJ1ZmZlckNyZWF0ZShwYXJhbXMubGVuZ3RoLCBDT0lfQlVGRkVSX05PUk1BTCwgMCwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbV9wcm9jZXNzLCAmYnVmZmVyKTsKKyAgICBjaGVja19yZXN1bHQocmVzLCBjX2J1Zl9jcmVhdGUsIG1faW5kZXgsIHJlcyk7CisKKyAgICBDT0lfQUNDRVNTX0ZMQUdTIGZsYWdzID0gQ09JX1NJTktfV1JJVEU7CisgICAgcmVzID0gQ09JOjpQaXBlbGluZVJ1bkZ1bmN0aW9uKGdldF9waXBlbGluZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Z1bmNzW2NfZnVuY192YXJfdGFibGVfY29weV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsICZidWZmZXIsICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcy5uZWxlbXMsIHNpemVvZihwYXJhbXMubmVsZW1zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV2ZW50KTsKKyAgICBjaGVja19yZXN1bHQocmVzLCBjX3BpcGVsaW5lX3J1bl9mdW5jLCBtX2luZGV4LCByZXMpOworCisgICAgcmVzID0gQ09JOjpFdmVudFdhaXQoMSwgJmV2ZW50LCAtMSwgMSwgMCwgMCk7CisgICAgY2hlY2tfcmVzdWx0KHJlcywgY19ldmVudF93YWl0LCByZXMpOworCisgICAgLy8gcGF0Y2ggbmFtZXMgaW4gdGFyZ2V0IGRhdGEKKyAgICBWYXJMaXN0OjpCdWZFbnRyeSAqdGFyZ2V0X3RhYmxlOworICAgIENPSU1BUElOU1RBTkNFIG1hcF9pbnN0OworICAgIHJlcyA9IENPSTo6QnVmZmVyTWFwKGJ1ZmZlciwgMCwgcGFyYW1zLmxlbmd0aCwgQ09JX01BUF9SRUFEX09OTFksIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwgJm1hcF9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCoqPigmdGFyZ2V0X3RhYmxlKSk7CisgICAgY2hlY2tfcmVzdWx0KHJlcywgY19idWZfbWFwLCByZXMpOworCisgICAgVmFyTGlzdDo6dGFibGVfcGF0Y2hfbmFtZXModGFyZ2V0X3RhYmxlLCBwYXJhbXMubmVsZW1zKTsKKworICAgIC8vIGFuZCBzb3J0IGVudHJpZXMKKyAgICBzdGQ6OnNvcnQodGFyZ2V0X3RhYmxlLCB0YXJnZXRfdGFibGUgKyBwYXJhbXMubmVsZW1zLCB0YXJnZXRfZW50cnlfY21wKTsKKyAgICBzdGQ6OnNvcnQoaG9zdF90YWJsZS5iZWdpbigpLCBob3N0X3RhYmxlLmVuZCgpLCBob3N0X2VudHJ5X2NtcCk7CisKKyAgICAvLyBtZXJnZSBob3N0IGFuZCB0YXJnZXQgZW50cmllcyBhbmQgZW50ZXIgbWF0Y2hpbmcgdmFycyBtYXAKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBWYXJUYWJsZTo6RW50cnkqPjo6Y29uc3RfaXRlcmF0b3IgaGkgPQorICAgICAgICBob3N0X3RhYmxlLmJlZ2luKCk7CisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgVmFyVGFibGU6OkVudHJ5Kj46OmNvbnN0X2l0ZXJhdG9yIGhlID0KKyAgICAgICAgaG9zdF90YWJsZS5lbmQoKTsKKyAgICBjb25zdCBWYXJMaXN0OjpCdWZFbnRyeSAqdGkgPSB0YXJnZXRfdGFibGU7CisgICAgY29uc3QgVmFyTGlzdDo6QnVmRW50cnkgKnRlID0gdGFyZ2V0X3RhYmxlICsgcGFyYW1zLm5lbGVtczsKKworICAgIHdoaWxlIChoaSAhPSBoZSAmJiB0aSAhPSB0ZSkgeworICAgICAgICBpbnQgcmVzID0gc3RyY21wKCgqaGkpLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih0aS0+bmFtZSkpOworICAgICAgICBpZiAocmVzID09IDApIHsKKyAgICAgICAgICAgIC8vIGFkZCBtYXRjaGluZyBlbnRyeSB0byB2YXIgbWFwCisgICAgICAgICAgICBzdGQ6OnBhaXI8UHRyU2V0OjppdGVyYXRvciwgYm9vbD4gcmVzID0KKyAgICAgICAgICAgICAgICBtX3B0cl9zZXQuaW5zZXJ0KFB0ckRhdGEoKCpoaSktPmFkZHIsICgqaGkpLT5zaXplKSk7CisKKyAgICAgICAgICAgIC8vIHN0b3JlIGFkZHJlc3MgZm9yIG5ldyBlbnRyaWVzCisgICAgICAgICAgICBpZiAocmVzLnNlY29uZCkgeworICAgICAgICAgICAgICAgIFB0ckRhdGEgKnB0ciA9IGNvbnN0X2Nhc3Q8UHRyRGF0YSo+KHJlcy5maXJzdC5vcGVyYXRvci0+KCkpOworICAgICAgICAgICAgICAgIHB0ci0+bWljX2FkZHIgPSB0aS0+YWRkcjsKKyAgICAgICAgICAgICAgICBwdHItPmlzX3N0YXRpYyA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhpKys7CisgICAgICAgICAgICB0aSsrOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgICAgIGhpKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB0aSsrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gY2xlYW51cAorICAgIHJlcyA9IENPSTo6QnVmZmVyVW5tYXAobWFwX2luc3QsIDAsIDAsIDApOworICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfYnVmX3VubWFwLCByZXMpOworCisgICAgcmVzID0gQ09JOjpCdWZmZXJEZXN0cm95KGJ1ZmZlcik7CisgICAgY2hlY2tfcmVzdWx0KHJlcywgY19idWZfZGVzdHJveSwgcmVzKTsKK30KKworQ09JUkVTVUxUIEVuZ2luZTo6Y29tcHV0ZSgKKyAgICBjb25zdCBzdGQ6Omxpc3Q8Q09JQlVGRkVSPiAmYnVmZmVycywKKyAgICBjb25zdCB2b2lkKiAgICAgICAgIGRhdGEsCisgICAgdWludDE2X3QgICAgICAgICAgICBkYXRhX3NpemUsCisgICAgdm9pZCogICAgICAgICAgICAgICByZXQsCisgICAgdWludDE2X3QgICAgICAgICAgICByZXRfc2l6ZSwKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG51bV9kZXBzLAorICAgIGNvbnN0IENPSUVWRU5UKiAgICAgZGVwcywKKyAgICBDT0lFVkVOVCogICAgICAgICAgIGV2ZW50CispIC8qIGNvbnN0ICovCit7CisgICAgQ09JQlVGRkVSICpidWZzOworICAgIENPSV9BQ0NFU1NfRkxBR1MgKmZsYWdzOworICAgIENPSVJFU1VMVCByZXM7CisKKyAgICAvLyBjb252ZXJ0IGJ1ZmZlcnMgbGlzdCB0byBhcnJheQorICAgIGludCBudW1fYnVmcyA9IGJ1ZmZlcnMuc2l6ZSgpOworICAgIGlmIChudW1fYnVmcyA+IDApIHsKKyAgICAgICAgYnVmcyA9IChDT0lCVUZGRVIqKSBhbGxvY2EobnVtX2J1ZnMgKiBzaXplb2YoQ09JQlVGRkVSKSk7CisgICAgICAgIGZsYWdzID0gKENPSV9BQ0NFU1NfRkxBR1MqKSBhbGxvY2EobnVtX2J1ZnMgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihDT0lfQUNDRVNTX0ZMQUdTKSk7CisKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKHN0ZDo6bGlzdDxDT0lCVUZGRVI+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGJ1ZmZlcnMuYmVnaW4oKTsKKyAgICAgICAgICAgICBpdCAhPSBidWZmZXJzLmVuZCgpOyBpdCsrKSB7CisgICAgICAgICAgICBidWZzW2ldID0gKml0OworCisgICAgICAgICAgICAvLyBUT0RPOiB0aGlzIHNob3VsZCBiZSBmaXhlZAorICAgICAgICAgICAgZmxhZ3NbaSsrXSA9IENPSV9TSU5LX1dSSVRFOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBidWZzID0gMDsKKyAgICAgICAgZmxhZ3MgPSAwOworICAgIH0KKworICAgIC8vIHN0YXJ0IGNvbXB1dGF0aW9uCisgICAgcmVzID0gQ09JOjpQaXBlbGluZVJ1bkZ1bmN0aW9uKGdldF9waXBlbGluZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Z1bmNzW2NfZnVuY19jb21wdXRlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2J1ZnMsIGJ1ZnMsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fZGVwcywgZGVwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQsIHJldF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgcmV0dXJuIHJlczsKK30KKworcGlkX3QgRW5naW5lOjppbml0X2RldmljZSh2b2lkKQoreworICAgIHN0cnVjdCBpbml0X2RhdGEgeworICAgICAgICBpbnQgIGRldmljZV9pbmRleDsKKyAgICAgICAgaW50ICBkZXZpY2VzX3RvdGFsOworICAgICAgICBpbnQgIGNvbnNvbGVfbGV2ZWw7CisgICAgICAgIGludCAgb2ZmbG9hZF9yZXBvcnRfbGV2ZWw7CisgICAgfSBkYXRhOworICAgIENPSVJFU1VMVCByZXM7CisgICAgQ09JRVZFTlQgZXZlbnQ7CisgICAgcGlkX3QgcGlkOworCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDIsIDAsIGNfb2ZmbG9hZF9pbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5pdGlhbGl6aW5nIGRldmljZSB3aXRoIGxvZ2ljYWwgaW5kZXggJWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kIHBoeXNpY2FsIGluZGV4ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbmRleCwgbV9waHlzaWNhbF9pbmRleCk7CisKKyAgICAvLyBzZXR1cCBtaXNjIGRhdGEKKyAgICBkYXRhLmRldmljZV9pbmRleCA9IG1faW5kZXg7CisgICAgZGF0YS5kZXZpY2VzX3RvdGFsID0gbWljX2VuZ2luZXNfdG90YWw7CisgICAgZGF0YS5jb25zb2xlX2xldmVsID0gY29uc29sZV9lbmFibGVkOworICAgIGRhdGEub2ZmbG9hZF9yZXBvcnRfbGV2ZWwgPSBvZmZsb2FkX3JlcG9ydF9sZXZlbDsKKworICAgIHJlcyA9IENPSTo6UGlwZWxpbmVSdW5GdW5jdGlvbihnZXRfcGlwZWxpbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mdW5jc1tjX2Z1bmNfaW5pdF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLCBzaXplb2YoZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaWQsIHNpemVvZihwaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnQpOworICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfcGlwZWxpbmVfcnVuX2Z1bmMsIG1faW5kZXgsIHJlcyk7CisKKyAgICByZXMgPSBDT0k6OkV2ZW50V2FpdCgxLCAmZXZlbnQsIC0xLCAxLCAwLCAwKTsKKyAgICBjaGVja19yZXN1bHQocmVzLCBjX2V2ZW50X3dhaXQsIHJlcyk7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJEZXZpY2UgcHJvY2VzcyBwaWQgaXMgJWRcbiIsIHBpZCk7CisKKyAgICByZXR1cm4gcGlkOworfQorCisvLyBkYXRhIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHRocmVhZAorc3RydWN0IFRocmVhZCB7CisgICAgVGhyZWFkKGxvbmcqIGFkZHJfY29pcGlwZV9jb3VudGVyKSB7CisgICAgICAgIG1fYWRkcl9jb2lwaXBlX2NvdW50ZXIgPSBhZGRyX2NvaXBpcGVfY291bnRlcjsKKyAgICAgICAgbWVtc2V0KG1fcGlwZWxpbmVzLCAwLCBzaXplb2YobV9waXBlbGluZXMpKTsKKyAgICB9CisKKyAgICB+VGhyZWFkKCkgeworI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgX19zeW5jX3N1Yl9hbmRfZmV0Y2gobV9hZGRyX2NvaXBpcGVfY291bnRlciwgMSk7CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyAgICAgICAgX0ludGVybG9ja2VkRGVjcmVtZW50KG1fYWRkcl9jb2lwaXBlX2NvdW50ZXIpOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pY19lbmdpbmVzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtX3BpcGVsaW5lc1tpXSAhPSAwKSB7CisgICAgICAgICAgICAgICAgQ09JOjpQaXBlbGluZURlc3Ryb3kobV9waXBlbGluZXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQ09JUElQRUxJTkUgZ2V0X3BpcGVsaW5lKGludCBpbmRleCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9waXBlbGluZXNbaW5kZXhdOworICAgIH0KKworICAgIHZvaWQgc2V0X3BpcGVsaW5lKGludCBpbmRleCwgQ09JUElQRUxJTkUgcGlwZWxpbmUpIHsKKyAgICAgICAgbV9waXBlbGluZXNbaW5kZXhdID0gcGlwZWxpbmU7CisgICAgfQorCisgICAgQXV0b1NldCYgZ2V0X2F1dG9fdmFycygpIHsKKyAgICAgICAgcmV0dXJuIG1fYXV0b192YXJzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBsb25nKiAgICAgICBtX2FkZHJfY29pcGlwZV9jb3VudGVyOworICAgIEF1dG9TZXQgICAgIG1fYXV0b192YXJzOworICAgIENPSVBJUEVMSU5FIG1fcGlwZWxpbmVzW01JQ19FTkdJTkVTX01BWF07Cit9OworCitDT0lQSVBFTElORSBFbmdpbmU6OmdldF9waXBlbGluZSh2b2lkKQoreworICAgIFRocmVhZCogdGhyZWFkID0gKFRocmVhZCopIHRocmVhZF9nZXRzcGVjaWZpYyhtaWNfdGhyZWFkX2tleSk7CisgICAgaWYgKHRocmVhZCA9PSAwKSB7CisgICAgICAgIHRocmVhZCA9IG5ldyBUaHJlYWQoJm1fcHJvY19udW1iZXIpOworICAgICAgICB0aHJlYWRfc2V0c3BlY2lmaWMobWljX3RocmVhZF9rZXksIHRocmVhZCk7CisgICAgfQorCisgICAgQ09JUElQRUxJTkUgcGlwZWxpbmUgPSB0aHJlYWQtPmdldF9waXBlbGluZShtX2luZGV4KTsKKyAgICBpZiAocGlwZWxpbmUgPT0gMCkgeworICAgICAgICBDT0lSRVNVTFQgcmVzOworICAgICAgICBpbnQgcHJvY19udW07CisKKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIHByb2NfbnVtID0gX19zeW5jX2ZldGNoX2FuZF9hZGQoJm1fcHJvY19udW1iZXIsIDEpOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgIHByb2NfbnVtID0gX0ludGVybG9ja2VkSW5jcmVtZW50KCZtX3Byb2NfbnVtYmVyKTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworICAgICAgICBpZiAocHJvY19udW0gPiBDT0lfUElQRUxJTkVfTUFYX1BJUEVMSU5FUykgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2NvaXBpcGVfbWF4X251bWJlciwgQ09JX1BJUEVMSU5FX01BWF9QSVBFTElORVMpOworICAgICAgICAgICAgTElCT0ZGTE9BRF9BQk9SVDsKKyAgICAgICAgfQorICAgICAgICAvLyBjcmVhdGUgcGlwZWxpbmUgZm9yIHRoaXMgdGhyZWFkCisgICAgICAgIHJlcyA9IENPSTo6UGlwZWxpbmVDcmVhdGUobV9wcm9jZXNzLCAwLCBtaWNfc3RhY2tfc2l6ZSwgJnBpcGVsaW5lKTsKKyAgICAgICAgY2hlY2tfcmVzdWx0KHJlcywgY19waXBlbGluZV9jcmVhdGUsIG1faW5kZXgsIHJlcyk7CisKKyAgICAgICAgdGhyZWFkLT5zZXRfcGlwZWxpbmUobV9pbmRleCwgcGlwZWxpbmUpOworICAgIH0KKyAgICByZXR1cm4gcGlwZWxpbmU7Cit9CisKK0F1dG9TZXQmIEVuZ2luZTo6Z2V0X2F1dG9fdmFycyh2b2lkKQoreworICAgIFRocmVhZCogdGhyZWFkID0gKFRocmVhZCopIHRocmVhZF9nZXRzcGVjaWZpYyhtaWNfdGhyZWFkX2tleSk7CisgICAgaWYgKHRocmVhZCA9PSAwKSB7CisgICAgICAgIHRocmVhZCA9IG5ldyBUaHJlYWQoJm1fcHJvY19udW1iZXIpOworICAgICAgICB0aHJlYWRfc2V0c3BlY2lmaWMobWljX3RocmVhZF9rZXksIHRocmVhZCk7CisgICAgfQorCisgICAgcmV0dXJuIHRocmVhZC0+Z2V0X2F1dG9fdmFycygpOworfQorCit2b2lkIEVuZ2luZTo6ZGVzdHJveV90aHJlYWRfZGF0YSh2b2lkICpkYXRhKQoreworICAgIGRlbGV0ZSBzdGF0aWNfY2FzdDxUaHJlYWQqPihkYXRhKTsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfZW5naW5lLmggYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2VuZ2luZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYTk2MzEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2VuZ2luZS5oCkBAIC0wLDAgKzEsNDgyIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgT0ZGTE9BRF9FTkdJTkVfSF9JTkNMVURFRAorI2RlZmluZSBPRkZMT0FEX0VOR0lORV9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlICJvZmZsb2FkX2NvbW1vbi5oIgorI2luY2x1ZGUgImNvaS9jb2lfY2xpZW50LmgiCisKKy8vIEFkZHJlc3MgcmFuZ2UKK2NsYXNzIE1lbVJhbmdlIHsKK3B1YmxpYzoKKyAgICBNZW1SYW5nZSgpIDogbV9zdGFydCgwKSwgbV9sZW5ndGgoMCkge30KKyAgICBNZW1SYW5nZShjb25zdCB2b2lkICphZGRyLCB1aW50NjRfdCBsZW4pIDogbV9zdGFydChhZGRyKSwgbV9sZW5ndGgobGVuKSB7fQorCisgICAgY29uc3Qgdm9pZCogc3RhcnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3N0YXJ0OworICAgIH0KKworICAgIGNvbnN0IHZvaWQqIGVuZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihtX3N0YXJ0KSArIG1fbGVuZ3RoOworICAgIH0KKworICAgIHVpbnQ2NF90IGxlbmd0aCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fbGVuZ3RoOworICAgIH0KKworICAgIC8vIHJldHVybnMgdHJ1ZSBpZiBnaXZlbiByYW5nZSBvdmVybGFwcyB3aXRoIGFub3RoZXIgb25lCisgICAgYm9vbCBvdmVybGFwcyhjb25zdCBNZW1SYW5nZSAmbykgY29uc3QgeworICAgICAgICAvLyBUd28gYWRkcmVzcyByYW5nZXMgQVtzdGFydCwgZW5kKSBhbmQgQltzdGFydCxlbmQpIG92ZXJsYXAKKyAgICAgICAgLy8gaWYgQS5zdGFydCA8IEIuZW5kIGFuZCBBLmVuZCA+IEIuc3RhcnQuCisgICAgICAgIHJldHVybiBzdGFydCgpIDwgby5lbmQoKSAmJiBlbmQoKSA+IG8uc3RhcnQoKTsKKyAgICB9CisKKyAgICAvLyByZXR1cm5zIHRydWUgaWYgZ2l2ZW4gcmFuZ2UgY29udGFpbnMgdGhlIG90aGVyIHJhbmdlCisgICAgYm9vbCBjb250YWlucyhjb25zdCBNZW1SYW5nZSAmbykgY29uc3QgeworICAgICAgICByZXR1cm4gc3RhcnQoKSA8PSBvLnN0YXJ0KCkgJiYgby5lbmQoKSA8PSBlbmQoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgY29uc3Qgdm9pZCogbV9zdGFydDsKKyAgICB1aW50NjRfdCAgICBtX2xlbmd0aDsKK307CisKKy8vIERhdGEgYXNzb2NpYXRlZCB3aXRoIGEgcG9pbnRlciB2YXJpYWJsZQorY2xhc3MgUHRyRGF0YSB7CitwdWJsaWM6CisgICAgUHRyRGF0YShjb25zdCB2b2lkICphZGRyLCB1aW50NjRfdCBsZW4pIDoKKyAgICAgICAgY3B1X2FkZHIoYWRkciwgbGVuKSwgY3B1X2J1ZigwKSwKKyAgICAgICAgbWljX2FkZHIoMCksIGFsbG9jX2Rpc3AoMCksIG1pY19idWYoMCksIG1pY19vZmZzZXQoMCksCisgICAgICAgIHJlZl9jb3VudCgwKSwgaXNfc3RhdGljKGZhbHNlKQorICAgIHt9CisKKyAgICAvLworICAgIC8vIENvcHkgY29uc3RydWN0b3IKKyAgICAvLworICAgIFB0ckRhdGEoY29uc3QgUHRyRGF0YSYgcHRyKToKKyAgICAgICAgY3B1X2FkZHIocHRyLmNwdV9hZGRyKSwgY3B1X2J1ZihwdHIuY3B1X2J1ZiksCisgICAgICAgIG1pY19hZGRyKHB0ci5taWNfYWRkciksIGFsbG9jX2Rpc3AocHRyLmFsbG9jX2Rpc3ApLAorICAgICAgICBtaWNfYnVmKHB0ci5taWNfYnVmKSwgbWljX29mZnNldChwdHIubWljX29mZnNldCksCisgICAgICAgIHJlZl9jb3VudChwdHIucmVmX2NvdW50KSwgaXNfc3RhdGljKHB0ci5pc19zdGF0aWMpCisgICAge30KKworICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFB0ckRhdGEgJm8pIGNvbnN0IHsKKyAgICAgICAgLy8gVmFyaWFibGVzIGFyZSBzb3J0ZWQgYnkgdGhlIENQVSBzdGFydCBhZGRyZXNzLgorICAgICAgICAvLyBPdmVybGFwcGluZyBtZW1vcnkgcmFuZ2VzIGFyZSBjb25zaWRlcmVkIGVxdWFsLgorICAgICAgICByZXR1cm4gKGNwdV9hZGRyLnN0YXJ0KCkgPCBvLmNwdV9hZGRyLnN0YXJ0KCkpICYmCisgICAgICAgICAgICAgICAhY3B1X2FkZHIub3ZlcmxhcHMoby5jcHVfYWRkcik7CisgICAgfQorCisgICAgbG9uZyBhZGRfcmVmZXJlbmNlKCkgeworICAgICAgICBpZiAoaXNfc3RhdGljKSB7CisgICAgICAgICAgICByZXR1cm4gTE9OR19NQVg7CisgICAgICAgIH0KKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIHJldHVybiBfX3N5bmNfZmV0Y2hfYW5kX2FkZCgmcmVmX2NvdW50LCAxKTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgICAgICByZXR1cm4gX0ludGVybG9ja2VkSW5jcmVtZW50KCZyZWZfY291bnQpIC0gMTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyAgICB9CisKKyAgICBsb25nIHJlbW92ZV9yZWZlcmVuY2UoKSB7CisgICAgICAgIGlmIChpc19zdGF0aWMpIHsKKyAgICAgICAgICAgIHJldHVybiBMT05HX01BWDsKKyAgICAgICAgfQorI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgcmV0dXJuIF9fc3luY19zdWJfYW5kX2ZldGNoKCZyZWZfY291bnQsIDEpOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgIHJldHVybiBfSW50ZXJsb2NrZWREZWNyZW1lbnQoJnJlZl9jb3VudCk7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgfQorCisgICAgbG9uZyBnZXRfcmVmZXJlbmNlKCkgY29uc3QgeworICAgICAgICBpZiAoaXNfc3RhdGljKSB7CisgICAgICAgICAgICByZXR1cm4gTE9OR19NQVg7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlZl9jb3VudDsKKyAgICB9CisKK3B1YmxpYzoKKyAgICAvLyBDUFUgYWRkcmVzcyByYW5nZQorICAgIGNvbnN0IE1lbVJhbmdlICBjcHVfYWRkcjsKKworICAgIC8vIENQVSBhbmQgTUlDIGJ1ZmZlcnMKKyAgICBDT0lCVUZGRVIgICAgICAgY3B1X2J1ZjsKKyAgICBDT0lCVUZGRVIgICAgICAgbWljX2J1ZjsKKworICAgIC8vIHBsYWNlaG9sZGVyIGZvciBidWZmZXIgYWRkcmVzcyBvbiBtaWMKKyAgICB1aW50NjRfdCAgICAgICAgbWljX2FkZHI7CisKKyAgICB1aW50NjRfdCAgICAgICAgYWxsb2NfZGlzcDsKKworICAgIC8vIGFkZGl0aW9uYWwgb2Zmc2V0IHRvIHBvaW50ZXIgZGF0YSBvbiBNSUMgZm9yIGltcHJvdmluZyBiYW5kd2lkdGggZm9yCisgICAgLy8gZGF0YSB3aGljaCBpcyBub3QgNEsgYWxpZ25lZAorICAgIHVpbnQzMl90ICAgICAgICBtaWNfb2Zmc2V0OworCisgICAgLy8gaWYgdHJ1ZSBidWZmZXJzIGFyZSBjcmVhdGVkIGZyb20gc3RhdGljIG1lbW9yeQorICAgIGJvb2wgICAgICAgICAgICBpc19zdGF0aWM7CisgICAgbXV0ZXhfdCAgICAgICAgIGFsbG9jX3B0cl9kYXRhX2xvY2s7CisKK3ByaXZhdGU6CisgICAgLy8gcmVmZXJlbmNlIGNvdW50IGZvciB0aGUgZW50cnkKKyAgICBsb25nICAgICAgICAgICAgcmVmX2NvdW50OworfTsKKwordHlwZWRlZiBzdGQ6Omxpc3Q8UHRyRGF0YSo+IFB0ckRhdGFMaXN0OworCisvLyBEYXRhIGFzc29jaWF0ZWQgd2l0aCBhdXRvbWF0aWMgdmFyaWFibGUKK2NsYXNzIEF1dG9EYXRhIHsKK3B1YmxpYzoKKyAgICBBdXRvRGF0YShjb25zdCB2b2lkICphZGRyLCB1aW50NjRfdCBsZW4pIDoKKyAgICAgICAgY3B1X2FkZHIoYWRkciwgbGVuKSwgcmVmX2NvdW50KDApCisgICAge30KKworICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEF1dG9EYXRhICZvKSBjb25zdCB7CisgICAgICAgIC8vIFZhcmlhYmxlcyBhcmUgc29ydGVkIGJ5IHRoZSBDUFUgc3RhcnQgYWRkcmVzcy4KKyAgICAgICAgLy8gT3ZlcmxhcHBpbmcgbWVtb3J5IHJhbmdlcyBhcmUgY29uc2lkZXJlZCBlcXVhbC4KKyAgICAgICAgcmV0dXJuIChjcHVfYWRkci5zdGFydCgpIDwgby5jcHVfYWRkci5zdGFydCgpKSAmJgorICAgICAgICAgICAgICAgIWNwdV9hZGRyLm92ZXJsYXBzKG8uY3B1X2FkZHIpOworICAgIH0KKworICAgIGxvbmcgYWRkX3JlZmVyZW5jZSgpIHsKKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIHJldHVybiBfX3N5bmNfZmV0Y2hfYW5kX2FkZCgmcmVmX2NvdW50LCAxKTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgICAgICByZXR1cm4gX0ludGVybG9ja2VkSW5jcmVtZW50KCZyZWZfY291bnQpIC0gMTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyAgICB9CisKKyAgICBsb25nIHJlbW92ZV9yZWZlcmVuY2UoKSB7CisjaWZuZGVmIFRBUkdFVF9XSU5OVAorICAgICAgICByZXR1cm4gX19zeW5jX3N1Yl9hbmRfZmV0Y2goJnJlZl9jb3VudCwgMSk7CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyAgICAgICAgcmV0dXJuIF9JbnRlcmxvY2tlZERlY3JlbWVudCgmcmVmX2NvdW50KTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyAgICB9CisKKyAgICBsb25nIGdldF9yZWZlcmVuY2UoKSBjb25zdCB7CisgICAgICAgIHJldHVybiByZWZfY291bnQ7CisgICAgfQorCitwdWJsaWM6CisgICAgLy8gQ1BVIGFkZHJlc3MgcmFuZ2UKKyAgICBjb25zdCBNZW1SYW5nZSBjcHVfYWRkcjsKKworcHJpdmF0ZToKKyAgICAvLyByZWZlcmVuY2UgY291bnQgZm9yIHRoZSBlbnRyeQorICAgIGxvbmcgcmVmX2NvdW50OworfTsKKworLy8gU2V0IG9mIGF1dGltYXRpYyB2YXJpYWJsZXMKK3R5cGVkZWYgc3RkOjpzZXQ8QXV0b0RhdGE+IEF1dG9TZXQ7CisKKy8vIFRhcmdldCBpbWFnZSBkYXRhCitzdHJ1Y3QgVGFyZ2V0SW1hZ2UKK3sKKyAgICBUYXJnZXRJbWFnZShjb25zdCBjaGFyICpfbmFtZSwgY29uc3Qgdm9pZCAqX2RhdGEsIHVpbnQ2NF90IF9zaXplLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKl9vcmlnaW4sIHVpbnQ2NF90IF9vZmZzZXQpIDoKKyAgICAgICAgbmFtZShfbmFtZSksIGRhdGEoX2RhdGEpLCBzaXplKF9zaXplKSwKKyAgICAgICAgb3JpZ2luKF9vcmlnaW4pLCBvZmZzZXQoX29mZnNldCkKKyAgICB7fQorCisgICAgLy8gbGlicmFyeSBuYW1lCisgICAgY29uc3QgY2hhciogbmFtZTsKKworICAgIC8vIGNvbnRlbnRzIGFuZCBzaXplCisgICAgY29uc3Qgdm9pZCogZGF0YTsKKyAgICB1aW50NjRfdCAgICBzaXplOworCisgICAgLy8gZmlsZSBvZiBvcmlnaW4gYW5kIG9mZnNldCB3aXRoaW4gdGhhdCBmaWxlCisgICAgY29uc3QgY2hhciogb3JpZ2luOworICAgIHVpbnQ2NF90ICAgIG9mZnNldDsKK307CisKK3R5cGVkZWYgc3RkOjpsaXN0PFRhcmdldEltYWdlPiBUYXJnZXRJbWFnZUxpc3Q7CisKKy8vIERhdGEgYXNzb2NpYXRlZCB3aXRoIHBlcnNpc3RlbnQgYXV0byBvYmplY3RzCitzdHJ1Y3QgUGVyc2lzdERhdGEKK3sKKyAgICBQZXJzaXN0RGF0YShjb25zdCB2b2lkICphZGRyLCB1aW50NjRfdCByb3V0aW5lX251bSwgdWludDY0X3Qgc2l6ZSkgOgorICAgICAgICBzdGFja19jcHVfYWRkcihhZGRyKSwgcm91dGluZV9pZChyb3V0aW5lX251bSkKKyAgICB7CisgICAgICAgIHN0YWNrX3B0cl9kYXRhID0gbmV3IFB0ckRhdGEoMCwgc2l6ZSk7CisgICAgfQorICAgIC8vIDEtc3Qga2V5IHZhbHVlIC0gYmVnaW5uaW5nIG9mIHRoZSBzdGFjayBhdCBDUFUKKyAgICBjb25zdCB2b2lkICogICBzdGFja19jcHVfYWRkcjsKKyAgICAvLyAyLW5kIGtleSB2YWx1ZSAtIGlkZW50aWZpZXIgb2Ygcm91dGluZSBpbnZvY2F0aW9uIGF0IENQVQorICAgIHVpbnQ2NF90ICAgcm91dGluZV9pZDsKKyAgICAvLyBjb3JyZXNwb25kZWQgUHRyRGF0YTsgb25seSBzdGFja19wdHJfZGF0YS0+bWljX2J1ZiBpcyB1c2VkCisgICAgUHRyRGF0YSAqIHN0YWNrX3B0cl9kYXRhOworICAgIC8vIHVzZWQgdG8gZ2V0IG9mZnNldCBvZiB0aGUgdmFyaWFibGUgaW4gc3RhY2sgYnVmZmVyCisgICAgY2hhciAqIGNwdV9zdGFja19hZGRyOworfTsKKwordHlwZWRlZiBzdGQ6Omxpc3Q8UGVyc2lzdERhdGE+IFBlcnNpc3REYXRhTGlzdDsKKworLy8gY2xhc3MgcmVwcmVzZW50aW5nIGEgc2luZ2xlIGVuZ2luZQorc3RydWN0IEVuZ2luZSB7CisgICAgZnJpZW5kIHZvaWQgX19vZmZsb2FkX2luaXRfbGlicmFyeV9vbmNlKHZvaWQpOworICAgIGZyaWVuZCB2b2lkIF9fb2ZmbG9hZF9maW5pX2xpYnJhcnkodm9pZCk7CisKKyNkZWZpbmUgY2hlY2tfcmVzdWx0KHJlcywgdGFnLCAuLi4pIFwKKyAgICB7IFwKKyAgICAgICAgaWYgKHJlcyA9PSBDT0lfUFJPQ0VTU19ESUVEKSB7IFwKKyAgICAgICAgICAgIGZpbmlfcHJvY2Vzcyh0cnVlKTsgXAorICAgICAgICAgICAgZXhpdCgxKTsgXAorICAgICAgICB9IFwKKyAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeyBcCisgICAgICAgICAgICBfX2xpYm9mZmxvYWRfZXJyb3Jfc3VwcG9ydCh0YWcsIF9fVkFfQVJHU19fKTsgXAorICAgICAgICAgICAgZXhpdCgxKTsgXAorICAgICAgICB9IFwKKyAgICB9CisKKyAgICBpbnQgZ2V0X2xvZ2ljYWxfaW5kZXgoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX2luZGV4OworICAgIH0KKworICAgIGludCBnZXRfcGh5c2ljYWxfaW5kZXgoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3BoeXNpY2FsX2luZGV4OworICAgIH0KKworICAgIGNvbnN0IENPSVBST0NFU1MmIGdldF9wcm9jZXNzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9wcm9jZXNzOworICAgIH0KKworICAgIC8vIGluaXRpYWxpemUgZGV2aWNlCisgICAgdm9pZCBpbml0KHZvaWQpOworCisgICAgLy8gYWRkIG5ldyBsaWJyYXJ5CisgICAgdm9pZCBhZGRfbGliKGNvbnN0IFRhcmdldEltYWdlICZsaWIpCisgICAgeworICAgICAgICBtX2xvY2subG9jaygpOworICAgICAgICBtX3JlYWR5ID0gZmFsc2U7CisgICAgICAgIG1faW1hZ2VzLnB1c2hfYmFjayhsaWIpOworICAgICAgICBtX2xvY2sudW5sb2NrKCk7CisgICAgfQorCisgICAgQ09JUkVTVUxUIGNvbXB1dGUoCisgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxDT0lCVUZGRVI+ICZidWZmZXJzLAorICAgICAgICBjb25zdCB2b2lkKiAgICAgICAgIGRhdGEsCisgICAgICAgIHVpbnQxNl90ICAgICAgICAgICAgZGF0YV9zaXplLAorICAgICAgICB2b2lkKiAgICAgICAgICAgICAgIHJldCwKKyAgICAgICAgdWludDE2X3QgICAgICAgICAgICByZXRfc2l6ZSwKKyAgICAgICAgdWludDMyX3QgICAgICAgICAgICBudW1fZGVwcywKKyAgICAgICAgY29uc3QgQ09JRVZFTlQqICAgICBkZXBzLAorICAgICAgICBDT0lFVkVOVCogICAgICAgICAgIGV2ZW50CisgICAgKTsKKworI2lmZGVmIE1ZT19TVVBQT1JUCisgICAgLy8gdGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIGJsb2NraW5nIGJlaGF2aW9yIGZvciBteW9pTGliSW5pdC9GaW5pIGNhbGxzCisgICAgdm9pZCBpbml0X215byhDT0lFVkVOVCAqZXZlbnQpIHsKKyAgICAgICAgQ09JUkVTVUxUIHJlczsKKyAgICAgICAgcmVzID0gQ09JOjpQaXBlbGluZVJ1bkZ1bmN0aW9uKGdldF9waXBlbGluZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mdW5jc1tjX2Z1bmNfbXlvX2luaXRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgY2hlY2tfcmVzdWx0KHJlcywgY19waXBlbGluZV9ydW5fZnVuYywgbV9pbmRleCwgcmVzKTsKKyAgICB9CisKKyAgICB2b2lkIGZpbmlfbXlvKENPSUVWRU5UICpldmVudCkgeworICAgICAgICBDT0lSRVNVTFQgcmVzOworICAgICAgICByZXMgPSBDT0k6OlBpcGVsaW5lUnVuRnVuY3Rpb24oZ2V0X3BpcGVsaW5lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Z1bmNzW2NfZnVuY19teW9fZmluaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICBjaGVja19yZXN1bHQocmVzLCBjX3BpcGVsaW5lX3J1bl9mdW5jLCBtX2luZGV4LCByZXMpOworICAgIH0KKyNlbmRpZiAvLyBNWU9fU1VQUE9SVAorCisgICAgLy8KKyAgICAvLyBNZW1vcnkgYXNzb2NpYXRpb24gdGFibGUKKyAgICAvLworICAgIFB0ckRhdGEqIGZpbmRfcHRyX2RhdGEoY29uc3Qgdm9pZCAqcHRyKSB7CisgICAgICAgIG1fcHRyX2xvY2subG9jaygpOworICAgICAgICBQdHJTZXQ6Oml0ZXJhdG9yIHJlcyA9IG1fcHRyX3NldC5maW5kKFB0ckRhdGEocHRyLCAwKSk7CisgICAgICAgIG1fcHRyX2xvY2sudW5sb2NrKCk7CisgICAgICAgIGlmIChyZXMgPT0gbV9wdHJfc2V0LmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29uc3RfY2FzdDxQdHJEYXRhKj4ocmVzLm9wZXJhdG9yLT4oKSk7CisgICAgfQorCisgICAgUHRyRGF0YSogaW5zZXJ0X3B0cl9kYXRhKGNvbnN0IHZvaWQgKnB0ciwgdWludDY0X3QgbGVuLCBib29sICZpc19uZXcpIHsKKyAgICAgICAgbV9wdHJfbG9jay5sb2NrKCk7CisgICAgICAgIHN0ZDo6cGFpcjxQdHJTZXQ6Oml0ZXJhdG9yLCBib29sPiByZXMgPQorICAgICAgICAgICAgbV9wdHJfc2V0Lmluc2VydChQdHJEYXRhKHB0ciwgbGVuKSk7CisgICAgICAgIFB0ckRhdGEqIHB0cl9kYXRhID0gY29uc3RfY2FzdDxQdHJEYXRhKj4ocmVzLmZpcnN0Lm9wZXJhdG9yLT4oKSk7CisgICAgICAgIG1fcHRyX2xvY2sudW5sb2NrKCk7CisKKyAgICAgICAgaXNfbmV3ID0gcmVzLnNlY29uZDsKKyAgICAgICAgaWYgKGlzX25ldykgeworICAgICAgICAgICAgLy8gSXQncyBuZWNlc3NhcnkgdG8gbG9jayBhcyBzb29uIGFzIHBvc3NpYmxlLgorICAgICAgICAgICAgLy8gdW5sb2NrIG11c3QgYmUgZG9uZSBhdCBjYWxsIHNpdGUgb2YgaW5zZXJ0X3B0cl9kYXRhIGF0CisgICAgICAgICAgICAvLyBicmFuY2ggZm9yIGlzX25ldworICAgICAgICAgICAgcHRyX2RhdGEtPmFsbG9jX3B0cl9kYXRhX2xvY2subG9jaygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwdHJfZGF0YTsKKyAgICB9CisKKyAgICB2b2lkIHJlbW92ZV9wdHJfZGF0YShjb25zdCB2b2lkICpwdHIpIHsKKyAgICAgICAgbV9wdHJfbG9jay5sb2NrKCk7CisgICAgICAgIG1fcHRyX3NldC5lcmFzZShQdHJEYXRhKHB0ciwgMCkpOworICAgICAgICBtX3B0cl9sb2NrLnVubG9jaygpOworICAgIH0KKworICAgIC8vCisgICAgLy8gQXV0b21hdGljIHZhcmlhYmxlcworICAgIC8vCisgICAgQXV0b0RhdGEqIGZpbmRfYXV0b19kYXRhKGNvbnN0IHZvaWQgKnB0cikgeworICAgICAgICBBdXRvU2V0ICZhdXRvX3ZhcnMgPSBnZXRfYXV0b192YXJzKCk7CisgICAgICAgIEF1dG9TZXQ6Oml0ZXJhdG9yIHJlcyA9IGF1dG9fdmFycy5maW5kKEF1dG9EYXRhKHB0ciwgMCkpOworICAgICAgICBpZiAocmVzID09IGF1dG9fdmFycy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8QXV0b0RhdGEqPihyZXMub3BlcmF0b3ItPigpKTsKKyAgICB9CisKKyAgICBBdXRvRGF0YSogaW5zZXJ0X2F1dG9fZGF0YShjb25zdCB2b2lkICpwdHIsIHVpbnQ2NF90IGxlbikgeworICAgICAgICBBdXRvU2V0ICZhdXRvX3ZhcnMgPSBnZXRfYXV0b192YXJzKCk7CisgICAgICAgIHN0ZDo6cGFpcjxBdXRvU2V0OjppdGVyYXRvciwgYm9vbD4gcmVzID0KKyAgICAgICAgICAgIGF1dG9fdmFycy5pbnNlcnQoQXV0b0RhdGEocHRyLCBsZW4pKTsKKyAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8QXV0b0RhdGEqPihyZXMuZmlyc3Qub3BlcmF0b3ItPigpKTsKKyAgICB9CisKKyAgICB2b2lkIHJlbW92ZV9hdXRvX2RhdGEoY29uc3Qgdm9pZCAqcHRyKSB7CisgICAgICAgIGdldF9hdXRvX3ZhcnMoKS5lcmFzZShBdXRvRGF0YShwdHIsIDApKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFNpZ25hbHMKKyAgICAvLworICAgIHZvaWQgYWRkX3NpZ25hbChjb25zdCB2b2lkICpzaWduYWwsIE9mZmxvYWREZXNjcmlwdG9yICpkZXNjKSB7CisgICAgICAgIG1fc2lnbmFsX2xvY2subG9jaygpOworICAgICAgICBtX3NpZ25hbF9tYXBbc2lnbmFsXSA9IGRlc2M7CisgICAgICAgIG1fc2lnbmFsX2xvY2sudW5sb2NrKCk7CisgICAgfQorCisgICAgT2ZmbG9hZERlc2NyaXB0b3IqIGZpbmRfc2lnbmFsKGNvbnN0IHZvaWQgKnNpZ25hbCwgYm9vbCByZW1vdmUpIHsKKyAgICAgICAgT2ZmbG9hZERlc2NyaXB0b3IgKmRlc2MgPSAwOworCisgICAgICAgIG1fc2lnbmFsX2xvY2subG9jaygpOworICAgICAgICB7CisgICAgICAgICAgICBTaWduYWxNYXA6Oml0ZXJhdG9yIGl0ID0gbV9zaWduYWxfbWFwLmZpbmQoc2lnbmFsKTsKKyAgICAgICAgICAgIGlmIChpdCAhPSBtX3NpZ25hbF9tYXAuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBkZXNjID0gaXQtPnNlY29uZDsKKyAgICAgICAgICAgICAgICBpZiAocmVtb3ZlKSB7CisgICAgICAgICAgICAgICAgICAgIG1fc2lnbmFsX21hcC5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1fc2lnbmFsX2xvY2sudW5sb2NrKCk7CisKKyAgICAgICAgcmV0dXJuIGRlc2M7CisgICAgfQorCisgICAgLy8gc3RvcCBkZXZpY2UgcHJvY2VzcworICAgIHZvaWQgZmluaV9wcm9jZXNzKGJvb2wgdmVyYm9zZSk7CisKKyAgICAvLyBsaXN0IG9mIHN0YWNrcyBhY3RpdmUgYXQgdGhlIGVuZ2luZQorICAgIFBlcnNpc3REYXRhTGlzdCBtX3BlcnNpc3RfbGlzdDsKKworcHJpdmF0ZToKKyAgICBFbmdpbmUoKSA6IG1faW5kZXgoLTEpLCBtX3BoeXNpY2FsX2luZGV4KC0xKSwgbV9wcm9jZXNzKDApLCBtX3JlYWR5KGZhbHNlKSwKKyAgICAgICAgICAgICAgIG1fcHJvY19udW1iZXIoMCkKKyAgICB7fQorCisgICAgfkVuZ2luZSgpIHsKKyAgICAgICAgaWYgKG1fcHJvY2VzcyAhPSAwKSB7CisgICAgICAgICAgICBmaW5pX3Byb2Nlc3MoZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gc2V0IGluZGV4ZXMKKyAgICB2b2lkIHNldF9pbmRleGVzKGludCBsb2dpY2FsX2luZGV4LCBpbnQgcGh5c2ljYWxfaW5kZXgpIHsKKyAgICAgICAgbV9pbmRleCA9IGxvZ2ljYWxfaW5kZXg7CisgICAgICAgIG1fcGh5c2ljYWxfaW5kZXggPSBwaHlzaWNhbF9pbmRleDsKKyAgICB9CisKKyAgICAvLyBzdGFydCBwcm9jZXNzIG9uIGRldmljZQorICAgIHZvaWQgaW5pdF9wcm9jZXNzKCk7CisKKyAgICB2b2lkIGxvYWRfbGlicmFyaWVzKHZvaWQpOworICAgIHZvaWQgaW5pdF9wdHJfZGF0YSh2b2lkKTsKKworICAgIC8vIHBlcmZvcm1zIGxpYnJhcnkgaW50aWFsaXphdGlvbiBvbiB0aGUgZGV2aWNlIHNpZGUKKyAgICBwaWRfdCBpbml0X2RldmljZSh2b2lkKTsKKworcHJpdmF0ZToKKyAgICAvLyBnZXQgcGlwZWxpbmUgYXNzb2NpYXRlZCB3aXRoIGEgY2FsbGluZyB0aHJlYWQKKyAgICBDT0lQSVBFTElORSBnZXRfcGlwZWxpbmUodm9pZCk7CisKKyAgICAvLyBnZXQgYXV0b21hdGljIHZhcnMgc2V0IGFzc29jaWF0ZWQgd2l0aCB0aGUgY2FsbGluZyB0aHJlYWQKKyAgICBBdXRvU2V0JiBnZXRfYXV0b192YXJzKHZvaWQpOworCisgICAgLy8gZGVzdHJ1Y3RvciBmb3IgdGhyZWFkIGRhdGEKKyAgICBzdGF0aWMgdm9pZCBkZXN0cm95X3RocmVhZF9kYXRhKHZvaWQgKmRhdGEpOworCitwcml2YXRlOgorICAgIHR5cGVkZWYgc3RkOjpzZXQ8UHRyRGF0YT4gUHRyU2V0OworICAgIHR5cGVkZWYgc3RkOjptYXA8Y29uc3Qgdm9pZCosIE9mZmxvYWREZXNjcmlwdG9yKj4gU2lnbmFsTWFwOworCisgICAgLy8gZGV2aWNlIGluZGV4ZXMKKyAgICBpbnQgICAgICAgICBtX2luZGV4OworICAgIGludCAgICAgICAgIG1fcGh5c2ljYWxfaW5kZXg7CisKKyAgICAvLyBudW1iZXIgb2YgQ09JIHBpcGVzIGNyZWF0ZWQgZm9yIHRoZSBlbmdpbmUKKyAgICBsb25nICAgICAgICBtX3Byb2NfbnVtYmVyOworCisgICAgLy8gcHJvY2VzcyBoYW5kbGUKKyAgICBDT0lQUk9DRVNTICBtX3Byb2Nlc3M7CisKKyAgICAvLyBJZiBmYWxzZSwgZGV2aWNlIGVpdGhlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgb3IgbmV3IGxpYnJhcmllcworICAgIC8vIGhhdmUgYmVlbiBhZGRlZC4KKyAgICBib29sICAgICAgICBtX3JlYWR5OworICAgIG11dGV4X3QgICAgIG1fbG9jazsKKworICAgIC8vIExpc3Qgb2YgbGlicmFyaWVzIHRvIGJlIGxvYWRlZAorICAgIFRhcmdldEltYWdlTGlzdCBtX2ltYWdlczsKKworICAgIC8vIHZhciB0YWJsZQorICAgIFB0clNldCAgICAgIG1fcHRyX3NldDsKKyAgICBtdXRleF90ICAgICBtX3B0cl9sb2NrOworCisgICAgLy8gc2lnbmFscworICAgIFNpZ25hbE1hcCBtX3NpZ25hbF9tYXA7CisgICAgbXV0ZXhfdCAgIG1fc2lnbmFsX2xvY2s7CisKKyAgICAvLyBjb25zdGFudHMgZm9yIGFjY2Vzc2luZyBkZXZpY2UgZnVuY3Rpb24gaGFuZGxlcworICAgIGVudW0geworICAgICAgICBjX2Z1bmNfY29tcHV0ZSA9IDAsCisjaWZkZWYgTVlPX1NVUFBPUlQKKyAgICAgICAgY19mdW5jX215b19pbml0LAorICAgICAgICBjX2Z1bmNfbXlvX2ZpbmksCisjZW5kaWYgLy8gTVlPX1NVUFBPUlQKKyAgICAgICAgY19mdW5jX2luaXQsCisgICAgICAgIGNfZnVuY192YXJfdGFibGVfc2l6ZSwKKyAgICAgICAgY19mdW5jX3Zhcl90YWJsZV9jb3B5LAorICAgICAgICBjX2Z1bmNzX3RvdGFsCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogbV9mdW5jX25hbWVzW2NfZnVuY3NfdG90YWxdOworCisgICAgLy8gZGV2aWNlIGZ1bmN0aW9uIGhhbmRsZXMKKyAgICBDT0lGVU5DVElPTiBtX2Z1bmNzW2NfZnVuY3NfdG90YWxdOworCisgICAgLy8gaW50IC0+IG5hbWUgbWFwcGluZyBmb3IgZGV2aWNlIHNpZ25hbHMKKyAgICBzdGF0aWMgY29uc3QgaW50ICAgY19zaWduYWxfbWF4ID0gMzI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGNfc2lnbmFsX25hbWVzW2Nfc2lnbmFsX21heF07Cit9OworCisjZW5kaWYgLy8gT0ZGTE9BRF9FTkdJTkVfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9lbnYuY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9lbnYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMzczMzgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2Vudi5jcHAKQEAgLTAsMCArMSwzNTQgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgIm9mZmxvYWRfZW52LmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICJvZmZsb2FkX3V0aWwuaCIKKyNpbmNsdWRlICJsaWJvZmZsb2FkX2Vycm9yX2NvZGVzLmgiCisKKy8vIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdmFsaWQgb24gYWxsIGNhcmRzCitjb25zdCBpbnQgTWljRW52VmFyOjphbnlfY2FyZCA9IC0xOworCitNaWNFbnZWYXI6On5NaWNFbnZWYXIoKQoreworICAgIGZvciAoc3RkOjpsaXN0PE1pY0VudlZhcjo6Q2FyZEVudlZhcnMqPjo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgIGl0ID0gY2FyZF9zcGVjX2xpc3QuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IGNhcmRfc3BlY19saXN0LmVuZCgpOyBpdCsrKSB7CisgICAgICAgIENhcmRFbnZWYXJzICpjYXJkX2RhdGEgPSAqaXQ7CisgICAgICAgIGRlbGV0ZSBjYXJkX2RhdGE7CisgICAgfQorfQorCitNaWNFbnZWYXI6OlZhclZhbHVlOjp+VmFyVmFsdWUoKQoreworICAgIGZyZWUoZW52X3Zhcl92YWx1ZSk7Cit9CisKK01pY0VudlZhcjo6Q2FyZEVudlZhcnM6On5DYXJkRW52VmFycygpCit7CisgICAgZm9yIChzdGQ6Omxpc3Q8TWljRW52VmFyOjpWYXJWYWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGVudl92YXJzLmJlZ2luKCk7CisgICAgICAgIGl0ICE9IGVudl92YXJzLmVuZCgpOyBpdCsrKSB7CisgICAgICAgICAgICBWYXJWYWx1ZSAqdmFyX3ZhbHVlID0gKml0OworICAgICAgICAgICAgZGVsZXRlIHZhcl92YWx1ZTsKKyAgICB9Cit9CisKKy8vIFNlYXJjaGluZyBmb3IgY2FyZCBpbiAiY2FyZF9zcGVjX2xpc3QiIGxpc3Qgd2l0aCB0aGUgc2FtZSAibnVtYmVyIgorCitNaWNFbnZWYXI6OkNhcmRFbnZWYXJzKiBNaWNFbnZWYXI6OmdldF9jYXJkKGludCBudW1iZXIpCit7CisgICAgaWYgKG51bWJlciA9PSBhbnlfY2FyZCkgeworICAgICAgICByZXR1cm4gJmNvbW1vbl92YXJzOworICAgIH0KKyAgICBmb3IgKHN0ZDo6bGlzdDxNaWNFbnZWYXI6OkNhcmRFbnZWYXJzKj46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICBpdCA9IGNhcmRfc3BlY19saXN0LmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBjYXJkX3NwZWNfbGlzdC5lbmQoKTsgaXQrKykgeworICAgICAgICBDYXJkRW52VmFycyAqY2FyZF9kYXRhID0gKml0OworICAgICAgICBpZiAoY2FyZF9kYXRhLT5jYXJkX251bWJlciA9PSBudW1iZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBjYXJkX2RhdGE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8vIFNlYXJjaGluZyBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGUgaW4gImVudl92YXIiIGxpc3Qgd2l0aCB0aGUgc2FtZSBuYW1lCisKK01pY0VudlZhcjo6VmFyVmFsdWUqIE1pY0VudlZhcjo6Q2FyZEVudlZhcnM6OmZpbmRfdmFyKAorICAgIGNoYXIqIGVudl92YXJfbmFtZSwKKyAgICBpbnQgZW52X3Zhcl9uYW1lX2xlbmd0aAorKQoreworICAgIGZvciAoc3RkOjpsaXN0PE1pY0VudlZhcjo6VmFyVmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBlbnZfdmFycy5iZWdpbigpOworICAgICAgICBpdCAhPSBlbnZfdmFycy5lbmQoKTsgaXQrKykgeworICAgICAgICAgICAgVmFyVmFsdWUgKnZhcl92YWx1ZSA9ICppdDsKKyAgICAgICAgICAgIGlmICh2YXJfdmFsdWUtPmxlbmd0aCA9PSBlbnZfdmFyX25hbWVfbGVuZ3RoICYmCisgICAgICAgICAgICAgICAgIXN0cm5jbXAodmFyX3ZhbHVlLT5lbnZfdmFyLCBlbnZfdmFyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZW52X3Zhcl9uYW1lX2xlbmd0aCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFyX3ZhbHVlOworICAgICAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBNaWNFbnZWYXI6OmFuYWx5emVfZW52X3ZhcihjaGFyICplbnZfdmFyX3N0cmluZykKK3sKKyAgICBjaGFyICAgICAgICAgICplbnZfdmFyX25hbWU7CisgICAgY2hhciAgICAgICAgICAqZW52X3Zhcl9kZWY7CisgICAgaW50ICAgICAgICAgICBjYXJkX251bWJlcjsKKyAgICBpbnQgICAgICAgICAgIGVudl92YXJfbmFtZV9sZW5ndGg7CisgICAgTWljRW52VmFyS2luZCBlbnZfdmFyX2tpbmQ7CisKKyAgICBlbnZfdmFyX2tpbmQgPSBnZXRfZW52X3Zhcl9raW5kKGVudl92YXJfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhcmRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVudl92YXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbnZfdmFyX25hbWVfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVudl92YXJfZGVmKTsKKyAgICBzd2l0Y2ggKGVudl92YXJfa2luZCkgeworICAgICAgICBjYXNlIGNfbWljX3ZhcjoKKyAgICAgICAgY2FzZSBjX21pY19jYXJkX3ZhcjoKKyAgICAgICAgICAgIGFkZF9lbnZfdmFyKGNhcmRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgZW52X3Zhcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgZW52X3Zhcl9uYW1lX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudl92YXJfZGVmKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbWljX2NhcmRfZW52OgorICAgICAgICAgICAgbWljX3BhcnNlX2Vudl92YXJfbGlzdChjYXJkX251bWJlciwgZW52X3Zhcl9kZWYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19ub19taWM6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgTWljRW52VmFyOjphZGRfZW52X3ZhcigKKyAgICBpbnQgY2FyZF9udW1iZXIsCisgICAgY2hhciAqZW52X3Zhcl9uYW1lLAorICAgIGludCBlbnZfdmFyX25hbWVfbGVuZ3RoLAorICAgIGNoYXIgKmVudl92YXJfZGVmCispCit7CisgICAgVmFyVmFsdWUgKnZhcjsKKyAgICBDYXJkRW52VmFycyAqY2FyZDsKKworICAgIC8vIFRoZSBjYXNlIGNvcnJlc3BvbmRzIHRvIGNvbW1vbiBlbnYgdmFyIGRlZmluaXRpb24gb2Yga2luZAorICAgIC8vIDxtaWMtcHJlZml4Pl88dmFyPgorICAgIGlmIChjYXJkX251bWJlciA9PSBhbnlfY2FyZCkgeworICAgICAgICBjYXJkID0gJmNvbW1vbl92YXJzOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgY2FyZCA9IGdldF9jYXJkKGNhcmRfbnVtYmVyKTsKKyAgICAgICAgaWYgKCFjYXJkKSB7CisgICAgICAgICAgICAvLyBkZWZpbml0aW9uIGZvciBuZXcgY2FyZCBvY2N1cnJlZAorICAgICAgICAgICAgY2FyZCA9IG5ldyBDYXJkRW52VmFycyhjYXJkX251bWJlcik7CisgICAgICAgICAgICBjYXJkX3NwZWNfbGlzdC5wdXNoX2JhY2soY2FyZCk7CisgICAgICAgIH0KKworICAgIH0KKyAgICB2YXIgPSBjYXJkLT5maW5kX3ZhcihlbnZfdmFyX25hbWUsIGVudl92YXJfbmFtZV9sZW5ndGgpOworICAgIGlmICghdmFyKSB7CisgICAgICAgIC8vIHB1dCBuZXcgZW52IHZhciBkZWZpbml0aW9uIGluICJlbnZfdmFyIiBsaXN0CisgICAgICAgIHZhciA9IG5ldyBWYXJWYWx1ZShlbnZfdmFyX25hbWUsIGVudl92YXJfbmFtZV9sZW5ndGgsIGVudl92YXJfZGVmKTsKKyAgICAgICAgY2FyZC0+ZW52X3ZhcnMucHVzaF9iYWNrKHZhcik7CisgICAgfQorfQorCisvLyBUaGUgcm91dGluZSBhbmFseXNlcyBzdHJpbmcgcG9pbnRlZCBieSAiZW52X3Zhcl9zdHJpbmciIGFyZ3VtZW50CisvLyBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyBzeW50YXg6CisvLworLy8gU3BlY2lmaWNhdGlvbiBvZiBwcmVmaXggZm9yIE1JQyBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKy8vIE1JQ19FTlZfUFJFRklYPTxtaWMtcHJlZml4PgorLy8KKy8vIFNldHRpbmcgc2luZ2xlIE1JQyBlbnZpcm9ubWVudCB2YXJpYWJsZQorLy8gPG1pYy1wcmVmaXg+Xzx2YXI+PTx2YWx1ZT4KKy8vIDxtaWMtcHJlZml4Pl88Y2FyZC1udW1iZXI+Xzx2YXI+PTx2YWx1ZT4KKworLy8gU2V0dGluZyBtdWx0aXBsZSBNSUMgZW52aXJvbm1lbnQgdmFyaWFibGVzCisvLyA8bWljLXByZWZpeD5fPGNhcmQtbnVtYmVyPl9FTlY9PGVudi12YXJzPgorCitNaWNFbnZWYXJLaW5kIE1pY0VudlZhcjo6Z2V0X2Vudl92YXJfa2luZCgKKyAgICBjaGFyICplbnZfdmFyX3N0cmluZywKKyAgICBpbnQgKmNhcmRfbnVtYmVyLAorICAgIGNoYXIgKiplbnZfdmFyX25hbWUsCisgICAgaW50ICplbnZfdmFyX25hbWVfbGVuZ3RoLAorICAgIGNoYXIgKiplbnZfdmFyX2RlZgorKQoreworICAgIGludCBsZW4gPSBzdHJsZW4ocHJlZml4KTsKKyAgICBjaGFyICpjID0gZW52X3Zhcl9zdHJpbmc7CisgICAgaW50IG51bSA9IDA7CisgICAgYm9vbCBjYXJkX2lzX3NldCA9IGZhbHNlOworCisgICAgaWYgKHN0cm5jbXAoYywgcHJlZml4LCBsZW4pICE9IDAgfHwgY1tsZW5dICE9ICdfJykgeworICAgICAgICAgICAgcmV0dXJuIGNfbm9fbWljOworICAgIH0KKyAgICBjICs9IGxlbiArIDE7CisKKyAgICAqY2FyZF9udW1iZXIgPSBhbnlfY2FyZDsKKyAgICBpZiAoaXNkaWdpdCgqYykpIHsKKyAgICAgICAgd2hpbGUgKGlzZGlnaXQgKCpjKSkgeworICAgICAgICAgICAgbnVtID0gKCpjKysgLSAnMCcpICsgKG51bSAqIDEwKTsKKyAgICAgICAgfQorICAgIGlmICgqYyAhPSAnXycpIHsKKyAgICAgICAgcmV0dXJuIGNfbm9fbWljOworICAgIH0KKyAgICBjKys7CisgICAgICAgICpjYXJkX251bWJlciA9IG51bTsKKyAgICAgICAgY2FyZF9pc19zZXQgPSB0cnVlOworICAgIH0KKyAgICBpZiAoIWlzYWxwaGEoKmMpKSB7CisgICAgICAgIHJldHVybiBjX25vX21pYzsKKyAgICB9CisgICAgKmVudl92YXJfbmFtZSA9ICplbnZfdmFyX2RlZiA9IGM7CisgICAgaWYgKHN0cm5jbXAoYywgIkVOVj0iLCA0KSA9PSAwKSB7CisgICAgICAgIGlmICghY2FyZF9pc19zZXQpIHsKKyAgICAgICAgICAgICplbnZfdmFyX25hbWVfbGVuZ3RoID0gMzsKKyAgICAgICAgICAgICplbnZfdmFyX25hbWUgPSAqZW52X3Zhcl9kZWYgPSBjOworICAgICAgICAgICAgKmVudl92YXJfZGVmID0gc3RyZHVwKCplbnZfdmFyX2RlZik7CisgICAgICAgICAgICByZXR1cm4gIGNfbWljX3ZhcjsKKyAgICAgICAgfQorICAgICAgICAqZW52X3Zhcl9kZWYgPSBjICsgc3RybGVuKCJFTlY9Iik7CisgICAgICAgICplbnZfdmFyX2RlZiA9IHN0cmR1cCgqZW52X3Zhcl9kZWYpOworICAgICAgICByZXR1cm4gY19taWNfY2FyZF9lbnY7CisgICAgfQorICAgIGlmIChpc2FscGhhKCpjKSkgeworICAgICAgICAqZW52X3Zhcl9uYW1lX2xlbmd0aCA9IDA7CisgICAgICAgIHdoaWxlIChpc2FsbnVtKCpjKSB8fCAqYyA9PSAnXycpIHsKKyAgICAgICAgICAgIGMrKzsKKyAgICAgICAgICAgICgqZW52X3Zhcl9uYW1lX2xlbmd0aCkrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKmMgIT0gJz0nKSB7CisgICAgICAgIHJldHVybiBjX25vX21pYzsKKyAgICB9CisgICAgKmVudl92YXJfZGVmID0gc3RyZHVwKCplbnZfdmFyX2RlZik7CisgICAgcmV0dXJuIGNhcmRfaXNfc2V0PyBjX21pY19jYXJkX3ZhciA6IGNfbWljX3ZhcjsKK30KKworLy8gYW5hbHlzaW5nIDxlbnYtdmFycz4gaW4gZm9ybToKKy8vIDxtaWMtcHJlZml4Pl88Y2FyZC1udW1iZXI+X0VOVj08ZW52LXZhcnM+CisvLyB3aGVyZToKKy8vCisvLyA8ZW52LXZhcnM+OgorLy8gICAgICAgICAgICAgICAgPGVudi12YXI+CisvLyAgICAgICAgICAgICAgICA8ZW52LXZhcnM+IHwgPGVudi12YXI+CisvLworLy8gPGVudi12YXI+OgorLy8gICAgICAgICAgICAgICAgdmFyaWFibGU9dmFsdWUKKy8vICAgICAgICAgICAgICAgIHZhcmlhYmxlPSJ2YWx1ZSIKKy8vICAgICAgICAgICAgICAgIHZhcmlhYmxlPQorCit2b2lkIE1pY0VudlZhcjo6bWljX3BhcnNlX2Vudl92YXJfbGlzdCgKKyAgICBpbnQgY2FyZF9udW1iZXIsIGNoYXIgKmVudl92YXJzX2RlZl9saXN0KQoreworICAgIGNoYXIgKmMgPSBlbnZfdmFyc19kZWZfbGlzdDsKKyAgICBjaGFyICplbnZfdmFyX25hbWU7CisgICAgaW50ICBlbnZfdmFyX25hbWVfbGVuZ3RoOworICAgIGNoYXIgKmVudl92YXJfZGVmOworICAgIGJvb2wgdmFyX2lzX3F1b3RlZDsKKworICAgIGlmICgqYyA9PSAnIicpIHsKKyAgICAgICAgYysrOworICAgIH0KKyAgICB3aGlsZSAoKmMgIT0gMCkgeworICAgICAgICB2YXJfaXNfcXVvdGVkID0gZmFsc2U7CisgICAgICAgIGVudl92YXJfbmFtZSA9IGM7CisgICAgICAgIGVudl92YXJfbmFtZV9sZW5ndGggPSAwOworICAgICAgICBpZiAoaXNhbHBoYSgqYykpIHsKKyAgICAgICAgICAgIHdoaWxlIChpc2FsbnVtKCpjKSB8fCAqYyA9PSAnXycpIHsKKyAgICAgICAgICAgICAgICBjKys7CisgICAgICAgICAgICAgICAgZW52X3Zhcl9uYW1lX2xlbmd0aCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX21pY19wYXJzZV9lbnZfdmFyX2xpc3QxKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoKmMgIT0gJz0nKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfbWljX3BhcnNlX2Vudl92YXJfbGlzdDIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGMrKzsKKworICAgICAgICBpZiAoKmMgPT0gJyInKSB7CisgICAgICAgICAgICB2YXJfaXNfcXVvdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGMrKzsKKyAgICAgICAgfQorICAgICAgICAvLyBFbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZXMgdGhhdCBjb250YWluIHwgd2lsbCBuZWVkIHRvIGJlIGVzY2FwZWQuCisgICAgICAgIHdoaWxlICgqYyAhPSAwICYmICpjICE9ICd8JyAmJgorICAgICAgICAgICAgICAgKCF2YXJfaXNfcXVvdGVkIHx8ICpjICE9ICciJykpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHNraXAgZXNjYXBlZCBzeW1ib2wKKyAgICAgICAgICAgIGlmICgqYyA9PSAnXFwnKSB7CisgICAgICAgICAgICAgICAgYysrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYysrOworICAgICAgICB9CisgICAgICAgIGlmICh2YXJfaXNfcXVvdGVkKSB7CisgICAgICAgICAgICBjKys7IC8vIGZvciAiCisgICAgICAgICAgICB3aGlsZSAoKmMgIT0gMCAmJiAqYyAhPSAnfCcpIHsKKyAgICAgICAgICAgICAgICBjKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnQgc3ogPSBjIC0gZW52X3Zhcl9uYW1lOworICAgICAgICBlbnZfdmFyX2RlZiA9IChjaGFyKiltYWxsb2Moc3opOworICAgICAgICBtZW1jcHkoZW52X3Zhcl9kZWYsIGVudl92YXJfbmFtZSwgc3opOworICAgICAgICBlbnZfdmFyX2RlZltzel0gPSAwOworCisgICAgICAgIGlmICgqYyA9PSAnfCcpIHsKKyAgICAgICAgICAgIGMrKzsKKyAgICAgICAgICAgIHdoaWxlICgqYyAhPSAwICYmICpjID09ICcgJykgeworICAgICAgICAgICAgICAgIGMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhZGRfZW52X3ZhcihjYXJkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgZW52X3Zhcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICBlbnZfdmFyX25hbWVfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICBlbnZfdmFyX2RlZik7CisgICAgfQorfQorCisvLyBDb2xsZWN0IGFsbCBkZWZpbml0aW9ucyBmb3IgdGhlIGNhcmQgd2l0aCBudW1iZXIgImNhcmRfbnVtIi4KKy8vIFRoZSByZXR1cm5lZCByZXN1bHQgaXMgdmVjdG9yIG9mIHN0cmluZyBwb2ludGVycyBkZWZpbmluZyBvbmUKKy8vIGVudmlyb25tZW50IHZhcmlhYmxlLiBUaGUgdmVjdG9yIGlzIHRlcm1pbmF0ZWQgYnkgTlVMTCBwb2ludGVyLgorLy8gSW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgdmVjdG9yIHRoZXJlIGFyZSBlbnYgdmFycyBkZWZpbmVkIGFzCisvLyA8bWljLXByZWZpeD5fPGNhcmQtbnVtYmVyPl88dmFyPj08dmFsdWU+CisvLyBvcgorLy8gPG1pYy1wcmVmaXg+XzxjYXJkLW51bWJlcj5fRU5WPTxlbnYtdmFycz4KKy8vIHdoZXJlIDxjYXJkLW51bWJlcj4gaXMgZXF1YWwgdG8gImNhcmRfbnVtIgorLy8gVGhleSBhcmUgZm9sbG93ZWQgYnkgZGVmaW5pdGlvbnMgdmFsaWQgZm9yIGFueSBjYXJkCisvLyBhbmQgYWJzZW50IGluIHByZXZpb3VzIGRlZmluaXRpb25zLgorCitjaGFyKiogTWljRW52VmFyOjpjcmVhdGVfZW52aXJvbl9mb3JfY2FyZChpbnQgY2FyZF9udW0pCit7CisgICAgVmFyVmFsdWUgKnZhcl92YWx1ZTsKKyAgICBWYXJWYWx1ZSAqdmFyX3ZhbHVlX2ZpbmQ7CisgICAgQ2FyZEVudlZhcnMgKmNhcmRfZGF0YSA9IGdldF9jYXJkKGNhcmRfbnVtKTsKKyAgICBDYXJkRW52VmFycyAqY2FyZF9kYXRhX2NvbW1vbjsKKyAgICBzdGQ6Omxpc3Q8Y2hhcio+IG5ld19lbnY7CisgICAgY2hhciAqKnJlejsKKworICAgIGlmICghcHJlZml4KSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvLyBUaGVyZSBpcyBubyBwZXJzb25lbCBlbnYgdmFyIGRlZmluaXRpb25zIGZvciB0aGUgY2FyZCB3aXRoCisgICAgLy8gbnVtYmVyICJjYXJkX251bSIKKyAgICBpZiAoIWNhcmRfZGF0YSkgeworICAgICAgICByZXR1cm4gY3JlYXRlX2Vudmlyb25fZm9yX2NhcmQoYW55X2NhcmQpOworICAgIH0KKworICAgIGZvciAoc3RkOjpsaXN0PE1pY0VudlZhcjo6VmFyVmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgIGl0ID0gY2FyZF9kYXRhLT5lbnZfdmFycy5iZWdpbigpOworICAgICAgICAgaXQgIT0gY2FyZF9kYXRhLT5lbnZfdmFycy5lbmQoKTsgaXQrKykgeworICAgICAgICB2YXJfdmFsdWUgPSAqaXQ7CisgICAgICAgIG5ld19lbnYucHVzaF9iYWNrKHZhcl92YWx1ZS0+ZW52X3Zhcl92YWx1ZSk7CisgICAgfQorCisgICAgaWYgKGNhcmRfbnVtICE9IGFueV9jYXJkKSB7CisgICAgICAgIGNhcmRfZGF0YV9jb21tb24gPSBnZXRfY2FyZChhbnlfY2FyZCk7CisgICAgICAgIGZvciAoc3RkOjpsaXN0PE1pY0VudlZhcjo6VmFyVmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgICAgICBpdCA9IGNhcmRfZGF0YV9jb21tb24tPmVudl92YXJzLmJlZ2luKCk7CisgICAgICAgICAgICAgaXQgIT0gY2FyZF9kYXRhX2NvbW1vbi0+ZW52X3ZhcnMuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgICAgIHZhcl92YWx1ZSA9ICppdDsKKyAgICAgICAgICAgIHZhcl92YWx1ZV9maW5kID0gY2FyZF9kYXRhLT5maW5kX3Zhcih2YXJfdmFsdWUtPmVudl92YXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX3ZhbHVlLT5sZW5ndGgpOworICAgICAgICAgICAgaWYgKCF2YXJfdmFsdWVfZmluZCkgeworICAgICAgICAgICAgICAgIG5ld19lbnYucHVzaF9iYWNrKHZhcl92YWx1ZS0+ZW52X3Zhcl92YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQgbmV3X2Vudl9zaXplID0gbmV3X2Vudi5zaXplKCk7CisgICAgcmV6ID0gKGNoYXIqKikgbWFsbG9jKChuZXdfZW52X3NpemUgKyAxKSAqIHNpemVvZihjaGFyKikpOworICAgIHN0ZDo6Y29weShuZXdfZW52LmJlZ2luKCksIG5ld19lbnYuZW5kKCksIHJleik7CisgICAgcmV6W25ld19lbnZfc2l6ZV0gPSAwOworICAgIHJldHVybiByZXo7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX2Vudi5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9lbnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDM1ZmY2Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9lbnYuaApAQCAtMCwwICsxLDkxIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgT0ZGTE9BRF9FTlZfSF9JTkNMVURFRAorI2RlZmluZSBPRkZMT0FEX0VOVl9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxsaXN0PgorCisvLyBkYXRhIHN0cnVjdHVyZSBhbmQgcm91dGluZXMgdG8gcGFyc2UgTUlDIHVzZXIgZW52aXJvbm1lbnQgYW5kIHBhc3MgdG8gTUlDCisKK2VudW0gTWljRW52VmFyS2luZAoreworICAgIGNfbm9fbWljLCAgICAgICAgIC8vIG5vdCBNSUMgZW52IHZhcgorICAgIGNfbWljX3ZhciwgICAgICAgIC8vIGZvciA8bWljLXByZWZpeD5fPHZhcj4KKyAgICBjX21pY19jYXJkX3ZhciwgICAvLyBmb3IgPG1pYy1wcmVmaXg+XzxjYXJkLW51bWJlcj5fPHZhcj4KKyAgICBjX21pY19jYXJkX2VudiAgICAvLyBmb3IgPG1pYy1wcmVmaXg+XzxjYXJkLW51bWJlcj5fRU5WCit9OworCitzdHJ1Y3QgTWljRW52VmFyIHsKK3B1YmxpYzoKKyAgICBNaWNFbnZWYXIoKSA6IHByZWZpeCgwKSB7fQorICAgIH5NaWNFbnZWYXIoKTsKKworICAgIHZvaWQgYW5hbHl6ZV9lbnZfdmFyKGNoYXIgKmVudl92YXJfc3RyaW5nKTsKKyAgICBjaGFyKiogY3JlYXRlX2Vudmlyb25fZm9yX2NhcmQoaW50IGNhcmRfbnVtKTsKKyAgICBNaWNFbnZWYXJLaW5kIGdldF9lbnZfdmFyX2tpbmQoCisgICAgICAgIGNoYXIgKmVudl92YXJfc3RyaW5nLAorICAgICAgICBpbnQgKmNhcmRfbnVtYmVyLAorICAgICAgICBjaGFyICoqZW52X3Zhcl9uYW1lLAorICAgICAgICBpbnQgKmVudl92YXJfbmFtZV9sZW5ndGgsCisgICAgICAgIGNoYXIgKiplbnZfdmFyX2RlZgorICAgICk7CisgICAgdm9pZCBhZGRfZW52X3ZhcigKKyAgICAgICAgaW50IGNhcmRfbnVtYmVyLAorICAgICAgICBjaGFyICplbnZfdmFyX25hbWUsCisgICAgICAgIGludCBlbnZfdmFyX25hbWVfbGVuZ3RoLAorICAgICAgICBjaGFyICplbnZfdmFyX2RlZgorICAgICk7CisKKyAgICB2b2lkIHNldF9wcmVmaXgoY29uc3QgY2hhciAqcHJlZikgeworICAgICAgICBwcmVmaXggPSAocHJlZiAmJiAqcHJlZiAhPSAnXDAnKSA/IHByZWYgOiAwOworICAgIH0KKworICAgIHN0cnVjdCBWYXJWYWx1ZSB7CisgICAgcHVibGljOgorICAgICAgICBjaGFyKiBlbnZfdmFyOworICAgICAgICBpbnQgICBsZW5ndGg7CisgICAgICAgIGNoYXIqIGVudl92YXJfdmFsdWU7CisKKyAgICAgICAgVmFyVmFsdWUoY2hhciogdmFyLCBpbnQgbG4sIGNoYXIqIHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBlbnZfdmFyID0gdmFyOworICAgICAgICAgICAgbGVuZ3RoID0gbG47CisgICAgICAgICAgICBlbnZfdmFyX3ZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgflZhclZhbHVlKCk7CisgICAgfTsKKworICAgIHN0cnVjdCBDYXJkRW52VmFycyB7CisgICAgcHVibGljOgorCisgICAgICAgIGludCBjYXJkX251bWJlcjsKKyAgICAgICAgc3RkOjpsaXN0PHN0cnVjdCBWYXJWYWx1ZSo+IGVudl92YXJzOworCisgICAgICAgIENhcmRFbnZWYXJzKCkgeyBjYXJkX251bWJlciA9IGFueV9jYXJkOyB9CisgICAgICAgIENhcmRFbnZWYXJzKGludCBudW0pIHsgY2FyZF9udW1iZXIgPSBudW07IH0KKyAgICAgICAgfkNhcmRFbnZWYXJzKCk7CisKKyAgICAgICAgdm9pZCBhZGRfbmV3X2Vudl92YXIoaW50IG51bWJlciwgY2hhciAqZW52X3ZhciwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZW52X3Zhcl92YWx1ZSk7CisgICAgICAgIFZhclZhbHVlKiBmaW5kX3ZhcihjaGFyKiBlbnZfdmFyX25hbWUsIGludCBlbnZfdmFyX25hbWVfbGVuZ3RoKTsKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBpbnQgYW55X2NhcmQ7CisKK3ByaXZhdGU6CisgICAgdm9pZCAgICAgICAgIG1pY19wYXJzZV9lbnZfdmFyX2xpc3QoaW50IGNhcmRfbnVtYmVyLCBjaGFyICplbnZfdmFyX2RlZik7CisgICAgQ2FyZEVudlZhcnMqIGdldF9jYXJkKGludCBudW1iZXIpOworCisgICAgY29uc3QgY2hhciAqcHJlZml4OworICAgIHN0ZDo6bGlzdDxzdHJ1Y3QgQ2FyZEVudlZhcnMgKj4gY2FyZF9zcGVjX2xpc3Q7CisgICAgQ2FyZEVudlZhcnMgY29tbW9uX3ZhcnM7Cit9OworCisjZW5kaWYgLy8gT0ZGTE9BRF9FTlZfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9ob3N0LmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfaG9zdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhkNTEzOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfaG9zdC5jcHAKQEAgLTAsMCArMSw0MzYwIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8vIEZvcndhcmQgZGVjbGFyYXRpb24gYXMgdGhlIGZvbGxvd2luZyAyIGZ1bmN0aW9ucyBhcmUgZGVjbGFyZWQgYXMgZnJpZW5kIGluIG9mZmxvYWRfZW5naW5lLmgKKy8vIENMQU5HIGRvZXMgbm90IGxpa2Ugc3RhdGljIHRvIGJlZW4gYWZ0ZXIgZnJpZW5kIGRlY2xhcmF0aW9uLgorc3RhdGljIHZvaWQgX19vZmZsb2FkX2luaXRfbGlicmFyeV9vbmNlKHZvaWQpOworc3RhdGljIHZvaWQgX19vZmZsb2FkX2ZpbmlfbGlicmFyeSh2b2lkKTsKKworI2luY2x1ZGUgIm9mZmxvYWRfaG9zdC5oIgorI2lmZGVmIE1ZT19TVVBQT1JUCisjaW5jbHVkZSAib2ZmbG9hZF9teW9faG9zdC5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisjaW5jbHVkZSA8YWxsb2NhLmg+CisjaW5jbHVkZSA8ZWxmLmg+CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxiaXRzZXQ+CisKKyNpZiBkZWZpbmVkKEhPU1RfV0lOTlQpCisjZGVmaW5lIFBBVEhfU0VQQVJBVE9SICI7IgorI2Vsc2UKKyNkZWZpbmUgUEFUSF9TRVBBUkFUT1IgIjoiCisjZW5kaWYKKworI2RlZmluZSBHRVRfT0ZGTE9BRF9OVU1CRVIodGltZXJfZGF0YSkgXAorICAgIHRpbWVyX2RhdGE/IHRpbWVyX2RhdGEtPm9mZmxvYWRfbnVtYmVyIDogMAorCisjaWZkZWYgVEFSR0VUX1dJTk5UCisvLyBTbWFsbCBzdWJzZXQgb2YgRUxGIGRlY2xhcmF0aW9ucyBmb3IgV2luZG93cyB3aGljaCBpcyBuZWVkZWQgdG8gY29tcGlsZQorLy8gdGhpcyBmaWxlLiBFTEYgaGVhZGVyIGlzIHVzZWQgdG8gdW5kZXJzdGFuZCB3aGF0IGJpbmFyeSB0eXBlIGlzIGNvbnRhaW5lZAorLy8gaW4gdGhlIHRhcmdldCBpbWFnZSAtIHNoYXJlZCBsaWJyYXJ5IG9yIGV4ZWN1dGFibGUuCisKK3R5cGVkZWYgdWludDE2X3QgRWxmNjRfSGFsZjsKK3R5cGVkZWYgdWludDMyX3QgRWxmNjRfV29yZDsKK3R5cGVkZWYgdWludDY0X3QgRWxmNjRfQWRkcjsKK3R5cGVkZWYgdWludDY0X3QgRWxmNjRfT2ZmOworCisjZGVmaW5lIEVJX05JREVOVCAgIDE2CisKKyNkZWZpbmUgRVRfRVhFQyAgICAgMgorI2RlZmluZSBFVF9EWU4gICAgICAzCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdW5zaWduZWQgY2hhciBlX2lkZW50W0VJX05JREVOVF07CisgICAgRWxmNjRfSGFsZiAgICBlX3R5cGU7CisgICAgRWxmNjRfSGFsZiAgICBlX21hY2hpbmU7CisgICAgRWxmNjRfV29yZCAgICBlX3ZlcnNpb247CisgICAgRWxmNjRfQWRkciAgICBlX2VudHJ5OworICAgIEVsZjY0X09mZiAgICAgZV9waG9mZjsKKyAgICBFbGY2NF9PZmYgICAgIGVfc2hvZmY7CisgICAgRWxmNjRfV29yZCAgICBlX2ZsYWdzOworICAgIEVsZjY0X0hhbGYgICAgZV9laHNpemU7CisgICAgRWxmNjRfSGFsZiAgICBlX3BoZW50c2l6ZTsKKyAgICBFbGY2NF9IYWxmICAgIGVfcGhudW07CisgICAgRWxmNjRfSGFsZiAgICBlX3NoZW50c2l6ZTsKKyAgICBFbGY2NF9IYWxmICAgIGVfc2hudW07CisgICAgRWxmNjRfSGFsZiAgICBlX3Noc3RybmR4OworfSBFbGY2NF9FaGRyOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisvLyBIb3N0IGNvbnNvbGUgYW5kIGZpbGUgbG9nZ2luZworY29uc3QgY2hhciAqcHJlZml4OworaW50IGNvbnNvbGVfZW5hYmxlZCA9IDA7CitpbnQgb2ZmbG9hZF9udW1iZXIgPSAwOworCitzdGF0aWMgY29uc3QgY2hhciAqaHRyYWNlX2Vudm5hbWUgPSAiSF9UUkFDRSI7CitzdGF0aWMgY29uc3QgY2hhciAqb2ZmbG9hZF9yZXBvcnRfZW52bmFtZSA9ICJPRkZMT0FEX1JFUE9SVCI7CitzdGF0aWMgY2hhciAqdGltZXJfZW52bmFtZSA9ICJIX1RJTUUiOworCisvLyBUcmFjZSBpbmZvcm1hdGlvbgorc3RhdGljIGNvbnN0IGNoYXIqIHZhcmRlc2NfZGlyZWN0aW9uX2FzX3N0cmluZ1tdID0geworICAgICJOT0NPUFkiLAorICAgICJJTiIsCisgICAgIk9VVCIsCisgICAgIklOT1VUIgorfTsKK3N0YXRpYyBjb25zdCBjaGFyKiB2YXJkZXNjX3R5cGVfYXNfc3RyaW5nW10gPSB7CisgICAgInVua25vd24iLAorICAgICJkYXRhIiwKKyAgICAiZGF0YV9wdHIiLAorICAgICJmdW5jX3B0ciIsCisgICAgInZvaWRfcHRyIiwKKyAgICAic3RyaW5nX3B0ciIsCisgICAgImR2IiwKKyAgICAiZHZfZGF0YSIsCisgICAgImR2X2RhdGFfc2xpY2UiLAorICAgICJkdl9wdHIiLAorICAgICJkdl9wdHJfZGF0YSIsCisgICAgImR2X3B0cl9kYXRhX3NsaWNlIiwKKyAgICAiY2Vhbl92YXIiLAorICAgICJjZWFuX3Zhcl9wdHIiLAorICAgICJjX2RhdGFfcHRyX2FycmF5IiwKKyAgICAiY19mdW5jX3B0cl9hcnJheSIsCisgICAgImNfdm9pZF9wdHJfYXJyYXkiLAorICAgICJjX3N0cmluZ19wdHJfYXJyYXkiCit9OworCitFbmdpbmUqICAgICAgICAgbWljX2VuZ2luZXMgPSAwOwordWludDMyX3QgICAgICAgIG1pY19lbmdpbmVzX3RvdGFsID0gMDsKK3B0aHJlYWRfa2V5X3QgICBtaWNfdGhyZWFkX2tleTsKK01pY0VudlZhciAgICAgICBtaWNfZW52X3ZhcnM7Cit1aW50NjRfdCAgICAgICAgY3B1X2ZyZXF1ZW5jeSA9IDA7CisKKy8vIE1JQ19TVEFDS1NJWkUKK3VpbnQzMl90IG1pY19zdGFja19zaXplID0gMTIgKiAxMDI0ICogMTAyNDsKKworLy8gTUlDX0JVRkZFUlNJWkUKK3VpbnQ2NF90IG1pY19idWZmZXJfc2l6ZSA9IDA7CisKKy8vIE1JQ19MRF9MSUJSQVJZX1BBVEgKK2NoYXIqIG1pY19saWJyYXJ5X3BhdGggPSAwOworCisvLyBNSUNfUFJPWFlfSU8KK2Jvb2wgbWljX3Byb3h5X2lvID0gdHJ1ZTsKKworLy8gTUlDX1BST1hZX0ZTX1JPT1QKK2NoYXIqIG1pY19wcm94eV9mc19yb290ID0gMDsKKworLy8gVGhyZXNob2xkIGZvciBjcmVhdGluZyBidWZmZXJzIHdpdGggbGFyZ2UgcGFnZXMuIEJ1ZmZlciBpcyBjcmVhdGVkCisvLyB3aXRoIGxhcmdlIHBhZ2VzIGhpbnQgaWYgaXRzIHNpemUgZXhjZWVkcyB0aGUgdGhyZXNob2xkIHZhbHVlLgorLy8gQnkgZGVmYXVsdCBsYXJnZSBwYWdlcyBhcmUgZGlzYWJsZWQgcmlnaHQgbm93IChieSBzZXR0aW5nIGRlZmF1bHQKKy8vIHZhbHVlIGZvciB0aHJlc2hvbGQgdG8gTUFYKSBkdWUgdG8gSFNEIDQxMTQ2MjkuCit1aW50NjRfdCBfX29mZmxvYWRfdXNlXzJtYl9idWZmZXJzID0gMHhmZmZmZmZmZmZmZmZmZmZmVUxMOworc3RhdGljIGNvbnN0IGNoYXIgKm1pY191c2VfMm1iX2J1ZmZlcnNfZW52bmFtZSAgPQorICAgICJNSUNfVVNFXzJNQl9CVUZGRVJTIjsKKworc3RhdGljIHVpbnQ2NF90IF9fb2ZmbG9hZF91c2VfYXN5bmNfYnVmZmVyX3dyaXRlID0gMiAqIDEwMjQgKiAxMDI0Oworc3RhdGljIGNvbnN0IGNoYXIgKm1pY191c2VfYXN5bmNfYnVmZmVyX3dyaXRlX2Vudm5hbWUgID0KKyAgICAiTUlDX1VTRV9BU1lOQ19CVUZGRVJfV1JJVEUiOworCitzdGF0aWMgdWludDY0X3QgX19vZmZsb2FkX3VzZV9hc3luY19idWZmZXJfcmVhZCA9IDIgKiAxMDI0ICogMTAyNDsKK3N0YXRpYyBjb25zdCBjaGFyICptaWNfdXNlX2FzeW5jX2J1ZmZlcl9yZWFkX2Vudm5hbWUgID0KKyAgICAiTUlDX1VTRV9BU1lOQ19CVUZGRVJfUkVBRCI7CisKKy8vIGRldmljZSBpbml0aWFsaXphdGlvbiB0eXBlCitPZmZsb2FkSW5pdFR5cGUgX19vZmZsb2FkX2luaXRfdHlwZSA9IGNfaW5pdF9vbl9vZmZsb2FkX2FsbDsKK3N0YXRpYyBjb25zdCBjaGFyICpvZmZsb2FkX2luaXRfZW52bmFtZSA9ICJPRkZMT0FEX0lOSVQiOworCisvLyBhY3RpdmUgd2FpdAorc3RhdGljIGJvb2wgX19vZmZsb2FkX2FjdGl2ZV93YWl0ID0gdHJ1ZTsKK3N0YXRpYyBjb25zdCBjaGFyICpvZmZsb2FkX2FjdGl2ZV93YWl0X2Vudm5hbWUgPSAiT0ZGTE9BRF9BQ1RJVkVfV0FJVCI7CisKKy8vIE9NUF9ERUZBVUxUX0RFVklDRQoraW50IF9fb21wX2RldmljZV9udW0gPSAwOworc3RhdGljIGNvbnN0IGNoYXIgKm9tcF9kZXZpY2VfbnVtX2Vudm5hbWUgPSAiT01QX0RFRkFVTFRfREVWSUNFIjsKKworLy8gVGhlIGxpc3Qgb2YgcGVuZGluZyB0YXJnZXQgbGlicmFyaWVzCitzdGF0aWMgYm9vbCAgICAgICAgICAgIF9fdGFyZ2V0X2xpYnM7CitzdGF0aWMgVGFyZ2V0SW1hZ2VMaXN0IF9fdGFyZ2V0X2xpYnNfbGlzdDsKK3N0YXRpYyBtdXRleF90ICAgICAgICAgX190YXJnZXRfbGlic19sb2NrOworc3RhdGljIG11dGV4X3QgICAgICAgICBzdGFja19hbGxvY19sb2NrOworCisvLyBUYXJnZXQgZXhlY3V0YWJsZQorVGFyZ2V0SW1hZ2UqICAgICAgICAgICBfX3RhcmdldF9leGU7CisKK3N0YXRpYyBjaGFyICogb2ZmbG9hZF9nZXRfc3JjX2Jhc2Uodm9pZCAqIHB0ciwgdWludDhfdCB0eXBlKQoreworICAgIGNoYXIgKmJhc2U7CisgICAgaWYgKFZBUl9UWVBFX0lTX1BUUih0eXBlKSkgeworICAgICAgICBiYXNlID0gKnN0YXRpY19jYXN0PGNoYXIqKj4ocHRyKTsKKyAgICB9CisgICAgZWxzZSBpZiAoVkFSX1RZUEVfSVNfU0NBTEFSKHR5cGUpKSB7CisgICAgICAgIGJhc2UgPSBzdGF0aWNfY2FzdDxjaGFyKj4ocHRyKTsKKyAgICB9CisgICAgZWxzZSBpZiAoVkFSX1RZUEVfSVNfRFZfREFUQV9TTElDRSh0eXBlKSB8fCBWQVJfVFlQRV9JU19EVl9EQVRBKHR5cGUpKSB7CisgICAgICAgIEFyckRlc2MgKmR2cDsKKyAgICAgICAgaWYgKFZBUl9UWVBFX0lTX0RWX0RBVEFfU0xJQ0UodHlwZSkpIHsKKyAgICAgICAgICAgIGNvbnN0IGFycl9kZXNjICphcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4ocHRyKTsKKyAgICAgICAgICAgIGR2cCA9ICh0eXBlID09IGNfZHZfZGF0YV9zbGljZSkgPworICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxBcnJEZXNjKj4oYXAtPmJhc2UpIDoKKyAgICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PEFyckRlc2MqKj4oYXAtPmJhc2UpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZHZwID0gKHR5cGUgPT0gY19kdl9kYXRhKSA/CisgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBcnJEZXNjKj4ocHRyKSA6CisgICAgICAgICAgICAgICAgICAqc3RhdGljX2Nhc3Q8QXJyRGVzYyoqPihwdHIpOworICAgICAgICB9CisgICAgICAgIGJhc2UgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihkdnAtPkJhc2UpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYmFzZSA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiBiYXNlOworfQorCit2b2lkIE9mZmxvYWREZXNjcmlwdG9yOjpyZXBvcnRfY29pX2Vycm9yKGVycm9yX3R5cGVzIG1zZywgQ09JUkVTVUxUIHJlcykKK3sKKyAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHRoZSAncHJvY2VzcyBkaWVkJyBlcnJvcgorICAgIGlmIChyZXMgPT0gQ09JX1BST0NFU1NfRElFRCkgeworICAgICAgICBtX2RldmljZS5maW5pX3Byb2Nlc3ModHJ1ZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzd2l0Y2ggKG1zZykgeworICAgICAgICAgICAgY2FzZSBjX2J1Zl9jcmVhdGU6CisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBDT0lfT1VUX09GX01FTU9SWSkgeworICAgICAgICAgICAgICAgICAgICBtc2cgPSBjX2J1Zl9jcmVhdGVfb3V0X29mX21lbTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogZmFsbHRocnUgKi8KKworICAgICAgICAgICAgY2FzZSBjX2J1Zl9jcmVhdGVfZnJvbV9tZW06CisgICAgICAgICAgICBjYXNlIGNfYnVmX2dldF9hZGRyZXNzOgorICAgICAgICAgICAgY2FzZSBjX3BpcGVsaW5lX2NyZWF0ZToKKyAgICAgICAgICAgIGNhc2UgY19waXBlbGluZV9ydW5fZnVuYzoKKyAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKG1zZywgbV9kZXZpY2UuZ2V0X2xvZ2ljYWxfaW5kZXgoKSwgcmVzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2J1Zl9yZWFkOgorICAgICAgICAgICAgY2FzZSBjX2J1Zl93cml0ZToKKyAgICAgICAgICAgIGNhc2UgY19idWZfY29weToKKyAgICAgICAgICAgIGNhc2UgY19idWZfbWFwOgorICAgICAgICAgICAgY2FzZSBjX2J1Zl91bm1hcDoKKyAgICAgICAgICAgIGNhc2UgY19idWZfZGVzdHJveToKKyAgICAgICAgICAgIGNhc2UgY19idWZfc2V0X3N0YXRlOgorICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IobXNnLCByZXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgZXhpdCgxKTsKK30KKworX09mZmxvYWRfcmVzdWx0IE9mZmxvYWREZXNjcmlwdG9yOjp0cmFuc2xhdGVfY29pX2Vycm9yKENPSVJFU1VMVCByZXMpIGNvbnN0Cit7CisgICAgc3dpdGNoIChyZXMpIHsKKyAgICAgICAgY2FzZSBDT0lfU1VDQ0VTUzoKKyAgICAgICAgICAgIHJldHVybiBPRkZMT0FEX1NVQ0NFU1M7CisKKyAgICAgICAgY2FzZSBDT0lfUFJPQ0VTU19ESUVEOgorICAgICAgICAgICAgcmV0dXJuIE9GRkxPQURfUFJPQ0VTU19ESUVEOworCisgICAgICAgIGNhc2UgQ09JX09VVF9PRl9NRU1PUlk6CisgICAgICAgICAgICByZXR1cm4gT0ZGTE9BRF9PVVRfT0ZfTUVNT1JZOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gT0ZGTE9BRF9FUlJPUjsKKyAgICB9Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6OmFsbG9jX3B0cl9kYXRhKAorICAgIFB0ckRhdGEqICZwdHJfZGF0YSwKKyAgICB2b2lkICpiYXNlLAorICAgIGludDY0X3QgZGlzcCwKKyAgICBpbnQ2NF90IHNpemUsCisgICAgaW50NjRfdCBhbGxvY19kaXNwLAorICAgIGludCBhbGlnbgorKQoreworICAgIC8vIHRvdGFsIGxlbmd0aCBvZiBiYXNlCisgICAgaW50NjRfdCBsZW5ndGggPSBkaXNwICsgc2l6ZTsKKyAgICBib29sIGlzX25ldzsKKworICAgIE9GRkxPQURfVFJBQ0UoMywgIkNyZWF0aW5nIGFzc29jaWF0aW9uIGZvciBkYXRhOiBhZGRyICVwLCBsZW5ndGggJWxsZFxuIiwKKyAgICAgICAgICAgICAgICAgIGJhc2UsIGxlbmd0aCk7CisKKyAgICAvLyBhZGQgbmV3IGVudHJ5CisgICAgcHRyX2RhdGEgPSBtX2RldmljZS5pbnNlcnRfcHRyX2RhdGEoYmFzZSwgbGVuZ3RoLCBpc19uZXcpOworICAgIGlmIChpc19uZXcpIHsKKworICAgICAgICBPRkZMT0FEX1RSQUNFKDMsICJBZGRlZCBuZXcgYXNzb2NpYXRpb25cbiIpOworCisgICAgICAgIGlmIChsZW5ndGggPiAwKSB7CisgICAgICAgICAgICBPZmZsb2FkVGltZXIgdGltZXIoZ2V0X3RpbWVyX2RhdGEoKSwgY19vZmZsb2FkX2hvc3RfYWxsb2NfYnVmZmVycyk7CisgICAgICAgICAgICBDT0lSRVNVTFQgcmVzOworCisgICAgICAgICAgICAvLyBhbGlnbiBzaG91bGQgYmUgYSBwb3dlciBvZiAyCisgICAgICAgICAgICBpZiAoYWxpZ24gPiAwICYmIChhbGlnbiAmIChhbGlnbiAtIDEpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IHdpdGhpbiBtaWNfYnVmZmVyLiBDYW4gZG8gb2Zmc2V0IG9wdGltaXphdGlvbgorICAgICAgICAgICAgICAgIC8vIG9ubHkgd2hlbiBzb3VyY2UgYWRkcmVzcyBhbGlnbm1lbnQgc2F0aXNmaWVzIHJlcXVlc3RlZAorICAgICAgICAgICAgICAgIC8vIGFsaWdubWVudCBvbiB0aGUgdGFyZ2V0IChjcTE3MjczNikuCisgICAgICAgICAgICAgICAgaWYgKChyZWludGVycHJldF9jYXN0PGludHB0cl90PihiYXNlKSAmIChhbGlnbiAtIDEpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5taWNfb2Zmc2V0ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oYmFzZSkgJiA0MDk1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYnVmZmVyIHNpemUgYW5kIGZsYWdzCisgICAgICAgICAgICB1aW50NjRfdCBidWZmZXJfc2l6ZSA9IGxlbmd0aCArIHB0cl9kYXRhLT5taWNfb2Zmc2V0OworICAgICAgICAgICAgdWludDMyX3QgYnVmZmVyX2ZsYWdzID0gMDsKKworICAgICAgICAgICAgLy8gY3JlYXRlIGJ1ZmZlciB3aXRoIGxhcmdlIHBhZ2VzIGlmIGRhdGEgbGVuZ3RoIGV4Y2VlZHMKKyAgICAgICAgICAgIC8vIGxhcmdlIHBhZ2UgdGhyZXNob2xkCisgICAgICAgICAgICBpZiAobGVuZ3RoID49IF9fb2ZmbG9hZF91c2VfMm1iX2J1ZmZlcnMpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJfZmxhZ3MgPSBDT0lfT1BUSU1JWkVfSFVHRV9QQUdFX1NJWkU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBDUFUgYnVmZmVyCisgICAgICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX09GRkxPQURfTlVNQkVSKGdldF90aW1lcl9kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfY3JlYXRlX2J1Zl9ob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQ3JlYXRpbmcgYnVmZmVyIGZyb20gc291cmNlIG1lbW9yeSAlcCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAibGVuZ3RoICVsbGRcbiIsIGJhc2UsIGxlbmd0aCk7CisKKyAgICAgICAgICAgIC8vIHJlc3VsdCBpcyBub3QgY2hlY2tlZCBiZWNhdXNlIHdlIGNhbiBjb250aW51ZSB3aXRob3V0IGNwdQorICAgICAgICAgICAgLy8gYnVmZmVyLiBJbiB0aGlzIGNhc2Ugd2Ugd2lsbCB1c2UgQ09JQnVmZmVyUmVhZC9Xcml0ZSBpbnN0ZWFkCisgICAgICAgICAgICAvLyBvZiBDT0lCdWZmZXJDb3B5LgorICAgICAgICAgICAgQ09JOjpCdWZmZXJDcmVhdGVGcm9tTWVtb3J5KGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQlVGRkVSX05PUk1BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbV9kZXZpY2UuZ2V0X3Byb2Nlc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRyX2RhdGEtPmNwdV9idWYpOworCisgICAgICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX09GRkxPQURfTlVNQkVSKGdldF90aW1lcl9kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfY3JlYXRlX2J1Zl9taWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDcmVhdGluZyBidWZmZXIgZm9yIHNpbms6IHNpemUgJWxsZCwgb2Zmc2V0ICVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJmbGFncyA9MHgleFxuIiwgYnVmZmVyX3NpemUgLSBhbGxvY19kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+bWljX29mZnNldCwgYnVmZmVyX2ZsYWdzKTsKKworICAgICAgICAgICAgLy8gY3JlYXRlIE1JQyBidWZmZXIKKyAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyQ3JlYXRlKGJ1ZmZlcl9zaXplIC0gYWxsb2NfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9CVUZGRVJfTk9STUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbV9kZXZpY2UuZ2V0X3Byb2Nlc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwdHJfZGF0YS0+bWljX2J1Zik7CisgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobV9pc19tYW5kYXRvcnkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9jcmVhdGUsIHJlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5hbGxvY19wdHJfZGF0YV9sb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbWFrZSBidWZmZXIgdmFsaWQgb24gdGhlIGRldmljZS4KKyAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyU2V0U3RhdGUocHRyX2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZGV2aWNlLmdldF9wcm9jZXNzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9CVUZGRVJfVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9CVUZGRVJfTk9fTU9WRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCk7CisgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobV9pc19tYW5kYXRvcnkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9zZXRfc3RhdGUsIHJlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5hbGxvY19wdHJfZGF0YV9sb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJTZXRTdGF0ZShwdHJfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX1BST0NFU1NfU09VUkNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQlVGRkVSX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9CVUZGRVJfTk9fTU9WRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCk7CisgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobV9pc19tYW5kYXRvcnkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9zZXRfc3RhdGUsIHJlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5hbGxvY19wdHJfZGF0YV9sb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB0cl9kYXRhLT5hbGxvY19kaXNwID0gYWxsb2NfZGlzcDsKKyAgICAgICAgcHRyX2RhdGEtPmFsbG9jX3B0cl9kYXRhX2xvY2sudW5sb2NrKCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBtdXRleF9sb2NrZXJfdCBsb2NrZXIocHRyX2RhdGEtPmFsbG9jX3B0cl9kYXRhX2xvY2spOworCisgICAgICAgIE9GRkxPQURfVFJBQ0UoMywgIkZvdW5kIGV4aXN0aW5nIGFzc29jaWF0aW9uOiBhZGRyICVwLCBsZW5ndGggJWxsZCwgIgorICAgICAgICAgICAgICAgICAgICAgICJpc19zdGF0aWMgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCksIHB0cl9kYXRhLT5jcHVfYWRkci5sZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+aXNfc3RhdGljKTsKKworICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIG5ldyBlbnRyeS4gTWFrZSBzdXJlIHRoYXQgcHJvdmlkZWQgYWRkcmVzcyByYW5nZSBmaXRzCisgICAgICAgIC8vIGludG8gZXhpc3Rpbmcgb25lLgorICAgICAgICBNZW1SYW5nZSBhZGRyX3JhbmdlKGJhc2UsIGxlbmd0aCAtIHB0cl9kYXRhLT5hbGxvY19kaXNwKTsKKyAgICAgICAgaWYgKCFwdHJfZGF0YS0+Y3B1X2FkZHIuY29udGFpbnMoYWRkcl9yYW5nZSkpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19iYWRfcHRyX21lbV9yYW5nZSk7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgdGhlIGVudHJ5IGlzIGFzc29jaWF0ZWQgd2l0aCBzdGF0aWMgZGF0YSBpdCBtYXkgbm90IGhhdmUgYnVmZmVycworICAgICAgICAvLyBjcmVhdGVkIGJlY2F1c2UgdGhleSBhcmUgY3JlYXRlZCBvbiBkZW1hbmQuCisgICAgICAgIGlmIChwdHJfZGF0YS0+aXNfc3RhdGljICYmICFpbml0X3N0YXRpY19wdHJfZGF0YShwdHJfZGF0YSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjpmaW5kX3B0cl9kYXRhKAorICAgIFB0ckRhdGEqICZwdHJfZGF0YSwKKyAgICB2b2lkICpiYXNlLAorICAgIGludDY0X3QgZGlzcCwKKyAgICBpbnQ2NF90IHNpemUsCisgICAgYm9vbCByZXBvcnRfZXJyb3IKKykKK3sKKyAgICAvLyB0b3RhbCBsZW5ndGggb2YgYmFzZQorICAgIGludDY0X3QgbGVuZ3RoID0gZGlzcCArIHNpemU7CisKKyAgICBPRkZMT0FEX1RSQUNFKDMsICJMb29raW5nIGZvciBhc3NvY2lhdGlvbiBmb3IgZGF0YTogYWRkciAlcCwgIgorICAgICAgICAgICAgICAgICAgImxlbmd0aCAlbGxkXG4iLCBiYXNlLCBsZW5ndGgpOworCisgICAgLy8gZmluZCBleGlzdGluZyBhc3NvY2lhdGlvbiBpbiBwb2ludGVyIHRhYmxlCisgICAgcHRyX2RhdGEgPSBtX2RldmljZS5maW5kX3B0cl9kYXRhKGJhc2UpOworICAgIGlmIChwdHJfZGF0YSA9PSAwKSB7CisgICAgICAgIGlmIChyZXBvcnRfZXJyb3IpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19ub19wdHJfZGF0YSwgYmFzZSk7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICAgIE9GRkxPQURfVFJBQ0UoMywgIkFzc29jaWF0aW9uIGRvZXMgbm90IGV4aXN0XG4iKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgT0ZGTE9BRF9UUkFDRSgzLCAiRm91bmQgYXNzb2NpYXRpb246IGJhc2UgJXAsIGxlbmd0aCAlbGxkLCBpc19zdGF0aWMgJWRcbiIsCisgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKSwgcHRyX2RhdGEtPmNwdV9hZGRyLmxlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPmlzX3N0YXRpYyk7CisKKyAgICAvLyBtYWtlIHN1cmUgdGhhdCBwcm92aWRlZCBhZGRyZXNzIHJhbmdlIGZpdHMgaW50byBleGlzdGluZyBvbmUKKyAgICBNZW1SYW5nZSBhZGRyX3JhbmdlKGJhc2UsIGxlbmd0aCk7CisgICAgaWYgKCFwdHJfZGF0YS0+Y3B1X2FkZHIuY29udGFpbnMoYWRkcl9yYW5nZSkpIHsKKyAgICAgICAgaWYgKHJlcG9ydF9lcnJvcikgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2JhZF9wdHJfbWVtX3JhbmdlKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgT0ZGTE9BRF9UUkFDRSgzLCAiRXhpc3RpbmcgYXNzb2NpYXRpb24gcGFydGlhbGx5IG92ZXJsYXBzIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICJkYXRhIGFkZHJlc3MgcmFuZ2VcbiIpOworICAgICAgICBwdHJfZGF0YSA9IDA7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIGlmIHRoZSBlbnRyeSBpcyBhc3NvY2lhdGVkIHdpdGggc3RhdGljIGRhdGEgaXQgbWF5IG5vdCBoYXZlIGJ1ZmZlcnMKKyAgICAvLyBjcmVhdGVkIGJlY2F1c2UgdGhleSBhcmUgY3JlYXRlZCBvbiBkZW1hbmQuCisgICAgaWYgKHB0cl9kYXRhLT5pc19zdGF0aWMgJiYgIWluaXRfc3RhdGljX3B0cl9kYXRhKHB0cl9kYXRhKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6OmluaXRfc3RhdGljX3B0cl9kYXRhKFB0ckRhdGEgKnB0cl9kYXRhKQoreworICAgIE9mZmxvYWRUaW1lciB0aW1lcihnZXRfdGltZXJfZGF0YSgpLCBjX29mZmxvYWRfaG9zdF9hbGxvY19idWZmZXJzKTsKKworICAgIGlmIChwdHJfZGF0YS0+Y3B1X2J1ZiA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfVFJBQ0UoMywgIkNyZWF0aW5nIGJ1ZmZlciBmcm9tIHNvdXJjZSBtZW1vcnkgJWxseFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKSk7CisKKyAgICAgICAgQ09JUkVTVUxUIHJlcyA9IENPSTo6QnVmZmVyQ3JlYXRlRnJvbU1lbW9yeSgKKyAgICAgICAgICAgIHB0cl9kYXRhLT5jcHVfYWRkci5sZW5ndGgoKSwKKyAgICAgICAgICAgIENPSV9CVUZGRVJfTk9STUFMLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dm9pZCo+KHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpKSwKKyAgICAgICAgICAgIDEsICZtX2RldmljZS5nZXRfcHJvY2VzcygpLAorICAgICAgICAgICAgJnB0cl9kYXRhLT5jcHVfYnVmKTsKKworICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9jcmVhdGVfZnJvbV9tZW0sIHJlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocHRyX2RhdGEtPm1pY19idWYgPT0gMCkgeworICAgICAgICBPRkZMT0FEX1RSQUNFKDMsICJDcmVhdGluZyBidWZmZXIgZnJvbSBzaW5rIG1lbW9yeSAlbGx4XG4iLAorICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5taWNfYWRkcik7CisKKyAgICAgICAgQ09JUkVTVUxUIHJlcyA9IENPSTo6QnVmZmVyQ3JlYXRlRnJvbU1lbW9yeSgKKyAgICAgICAgICAgIHB0cl9kYXRhLT5jcHVfYWRkci5sZW5ndGgoKSwKKyAgICAgICAgICAgIENPSV9CVUZGRVJfTk9STUFMLAorICAgICAgICAgICAgQ09JX1NJTktfTUVNT1JZLAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4ocHRyX2RhdGEtPm1pY19hZGRyKSwKKyAgICAgICAgICAgIDEsICZtX2RldmljZS5nZXRfcHJvY2VzcygpLAorICAgICAgICAgICAgJnB0cl9kYXRhLT5taWNfYnVmKTsKKworICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9jcmVhdGVfZnJvbV9tZW0sIHJlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6aW5pdF9taWNfYWRkcmVzcyhQdHJEYXRhICpwdHJfZGF0YSkKK3sKKyAgICBpZiAocHRyX2RhdGEtPm1pY19idWYgIT0gMCAmJiBwdHJfZGF0YS0+bWljX2FkZHIgPT0gMCkgeworICAgICAgICBDT0lSRVNVTFQgcmVzID0gQ09JOjpCdWZmZXJHZXRTaW5rQWRkcmVzcyhwdHJfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB0cl9kYXRhLT5taWNfYWRkcik7CisgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKG1faXNfbWFuZGF0b3J5KSB7CisgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9nZXRfYWRkcmVzcywgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6bnVsbGlmeV90YXJnZXRfc3RhY2soCisgICAgQ09JQlVGRkVSIHRhcmdfYnVmLAorICAgIHVpbnQ2NF90IHNpemUKKykKK3sKKyAgICBjaGFyICogcHRyID0gKGNoYXIqKW1hbGxvYyhzaXplKTsKKyAgICBDT0lSRVNVTFQgcmVzOworCisgICAgbWVtc2V0KHB0ciwgMCwgc2l6ZSk7CisgICAgcmVzID0gQ09JOjpCdWZmZXJXcml0ZSgKKyAgICAgICAgdGFyZ19idWYsCisgICAgICAgIDAsCisgICAgICAgIHB0ciwKKyAgICAgICAgc2l6ZSwKKyAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgIDAsIDAsIDApOworICAgIGZyZWUocHRyKTsKKyAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfd3JpdGUsIHJlcyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjpvZmZsb2FkX3N0YWNrX21lbW9yeV9tYW5hZ2VyKAorICAgIGNvbnN0IHZvaWQgKiBzdGFja19iZWdpbiwKKyAgICBpbnQgIHJvdXRpbmVfaWQsCisgICAgaW50ICBidWZfc2l6ZSwKKyAgICBpbnQgIGFsaWduLAorICAgIGJvb2wgKmlzX25ldykKK3sKKyAgICBtdXRleF9sb2NrZXJfdCBsb2NrZXIoc3RhY2tfYWxsb2NfbG9jayk7CisKKyAgICBQZXJzaXN0RGF0YSAqIG5ld19lbDsKKyAgICBQZXJzaXN0RGF0YUxpc3Q6Oml0ZXJhdG9yIGl0X2JlZ2luID0gbV9kZXZpY2UubV9wZXJzaXN0X2xpc3QuYmVnaW4oKTsKKyAgICBQZXJzaXN0RGF0YUxpc3Q6Oml0ZXJhdG9yIGl0X2VuZDsKKyAgICBpbnQgZXJhc2UgPSAwOworCisgICAgKmlzX25ldyA9IGZhbHNlOworCisgICAgZm9yIChQZXJzaXN0RGF0YUxpc3Q6Oml0ZXJhdG9yIGl0ID0gbV9kZXZpY2UubV9wZXJzaXN0X2xpc3QuYmVnaW4oKTsKKyAgICAgICAgaXQgIT0gbV9kZXZpY2UubV9wZXJzaXN0X2xpc3QuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgUGVyc2lzdERhdGEgY3VyX2VsID0gKml0OworCisgICAgICAgIGlmIChzdGFja19iZWdpbiA+IGl0LT5zdGFja19jcHVfYWRkcikgeworICAgICAgICAgICAgLy8gdGhpcyBzdGFjayBkYXRhIG11c3QgYmUgZGVzdHJveWVkCisgICAgICAgICAgICBtX2Rlc3Ryb3lfc3RhY2sucHVzaF9mcm9udChjdXJfZWwuc3RhY2tfcHRyX2RhdGEpOworICAgICAgICAgICAgaXRfZW5kID0gaXQ7CisgICAgICAgICAgICBlcmFzZSsrOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHN0YWNrX2JlZ2luID09IGl0LT5zdGFja19jcHVfYWRkcikgeworICAgICAgICAgICAgaWYgKHJvdXRpbmVfaWQgIT0gaXQtPiByb3V0aW5lX2lkKSB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyBzdGFjayBkYXRhIG11c3QgYmUgZGVzdHJveWVkCisgICAgICAgICAgICAgICAgbV9kZXN0cm95X3N0YWNrLnB1c2hfZnJvbnQoY3VyX2VsLnN0YWNrX3B0cl9kYXRhKTsKKyAgICAgICAgICAgICAgICBpdF9lbmQgPSBpdDsKKyAgICAgICAgICAgICAgICBlcmFzZSsrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gc3RhY2sgZGF0YSBpcyByZXVzZWQKKyAgICAgICAgICAgICAgICBtX3N0YWNrX3B0cl9kYXRhID0gaXQtPnN0YWNrX3B0cl9kYXRhOworICAgICAgICAgICAgICAgIGlmIChlcmFzZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsIG9ic29sZXRlIHN0YWNrIHNlY3Rpb25zIG11c3QgYmUgZXJhc2VkIGZyb20gdGhlIGxpc3QKKyAgICAgICAgICAgICAgICAgICAgbV9kZXZpY2UubV9wZXJzaXN0X2xpc3QuZXJhc2UoaXRfYmVnaW4sICsraXRfZW5kKTsKKworICAgICAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gKz0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVyYXNlICogc2l6ZW9mKG5ld19lbC0+c3RhY2tfcHRyX2RhdGEtPm1pY19hZGRyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgT0ZGTE9BRF9UUkFDRSgzLCAiUmV1c2Ugb2Ygc3RhY2sgYnVmZmVyIHdpdGggYWRkciAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhY2tfcHRyX2RhdGEtPm1pY19hZGRyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzdGFja19iZWdpbiA8IGl0LT5zdGFja19jcHVfYWRkcikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZXJhc2UgPiAwKSB7CisgICAgICAgIC8vIGFsbCBvYnNvbGV0ZSBzdGFjayBzZWN0aW9ucyBtdXN0IGJlIGVyYXNlZCBmcm9tIHRoZSBsaXN0CisgICAgICAgIG1fZGV2aWNlLm1fcGVyc2lzdF9saXN0LmVyYXNlKGl0X2JlZ2luLCArK2l0X2VuZCk7CisgICAgICAgIG1faW5fZGF0YWxlbiArPSBlcmFzZSAqIHNpemVvZihuZXdfZWwtPnN0YWNrX3B0cl9kYXRhLT5taWNfYWRkcik7CisgICAgfQorICAgIC8vIG5ldyBzdGFjayB0YWJsZSBpcyBjcmVhdGVkCisgICAgbmV3X2VsID0gbmV3IFBlcnNpc3REYXRhKHN0YWNrX2JlZ2luLCByb3V0aW5lX2lkLCBidWZfc2l6ZSk7CisgICAgLy8gY3JlYXRlIE1JQyBidWZmZXIKKyAgICBDT0lSRVNVTFQgcmVzOworICAgIHVpbnQzMl90IGJ1ZmZlcl9mbGFncyA9IDA7CisKKyAgICAvLyBjcmVhdGUgYnVmZmVyIHdpdGggbGFyZ2UgcGFnZXMgaWYgZGF0YSBsZW5ndGggZXhjZWVkcworICAgIC8vIGxhcmdlIHBhZ2UgdGhyZXNob2xkCisgICAgaWYgKGJ1Zl9zaXplID49IF9fb2ZmbG9hZF91c2VfMm1iX2J1ZmZlcnMpIHsKKyAgICAgICAgYnVmZmVyX2ZsYWdzID0gQ09JX09QVElNSVpFX0hVR0VfUEFHRV9TSVpFOworICAgIH0KKyAgICByZXMgPSBDT0k6OkJ1ZmZlckNyZWF0ZShidWZfc2l6ZSwKKyAgICAgICAgQ09JX0JVRkZFUl9OT1JNQUwsCisgICAgICAgIGJ1ZmZlcl9mbGFncywKKyAgICAgICAgMCwKKyAgICAgICAgMSwKKyAgICAgICAgJm1fZGV2aWNlLmdldF9wcm9jZXNzKCksCisgICAgICAgICZuZXdfZWwtPnN0YWNrX3B0cl9kYXRhLT5taWNfYnVmKTsKKyAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG1faXNfbWFuZGF0b3J5KSB7CisgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2NyZWF0ZSwgcmVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIG1ha2UgYnVmZmVyIHZhbGlkIG9uIHRoZSBkZXZpY2UuCisgICAgcmVzID0gQ09JOjpCdWZmZXJTZXRTdGF0ZShuZXdfZWwtPnN0YWNrX3B0cl9kYXRhLT5taWNfYnVmLAorICAgICAgICBtX2RldmljZS5nZXRfcHJvY2VzcygpLAorICAgICAgICBDT0lfQlVGRkVSX1ZBTElELAorICAgICAgICBDT0lfQlVGRkVSX05PX01PVkUsCisgICAgICAgIDAsIDAsIDApOworICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobV9pc19tYW5kYXRvcnkpIHsKKyAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfc2V0X3N0YXRlLCByZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmVzID0gQ09JOjpCdWZmZXJTZXRTdGF0ZShuZXdfZWwtPnN0YWNrX3B0cl9kYXRhLT5taWNfYnVmLAorICAgICAgICBDT0lfUFJPQ0VTU19TT1VSQ0UsCisgICAgICAgIENPSV9CVUZGRVJfSU5WQUxJRCwKKyAgICAgICAgQ09JX0JVRkZFUl9OT19NT1ZFLAorICAgICAgICAwLCAwLCAwKTsKKyAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG1faXNfbWFuZGF0b3J5KSB7CisgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX3NldF9zdGF0ZSwgcmVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIHBlcnNpc3RlbmNlIGFsZ29yaXRobSByZXF1aXJlcyB0YXJnZXQgc3RhY2sgaW5pdGlhbHkgdG8gYmUgbnVsbGlmaWVkCisgICAgaWYgKCFudWxsaWZ5X3RhcmdldF9zdGFjayhuZXdfZWwtPnN0YWNrX3B0cl9kYXRhLT5taWNfYnVmLCBidWZfc2l6ZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fc3RhY2tfcHRyX2RhdGEgPSBuZXdfZWwtPnN0YWNrX3B0cl9kYXRhOworICAgIGluaXRfbWljX2FkZHJlc3MobV9zdGFja19wdHJfZGF0YSk7CisgICAgT0ZGTE9BRF9UUkFDRSgzLCAiQWxsb2NhdGluZyBzdGFjayBidWZmZXIgd2l0aCBhZGRyICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgIG1fc3RhY2tfcHRyX2RhdGEtPm1pY19hZGRyKTsKKyAgICBtX2RldmljZS5tX3BlcnNpc3RfbGlzdC5wdXNoX2Zyb250KCpuZXdfZWwpOworICAgIGluaXRfbWljX2FkZHJlc3MobmV3X2VsLT5zdGFja19wdHJfZGF0YSk7CisgICAgKmlzX25ldyA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6OnNldHVwX2Rlc2NyaXB0b3JzKAorICAgIFZhckRlc2MgKnZhcnMsCisgICAgVmFyRGVzYzIgKnZhcnMyLAorICAgIGludCB2YXJzX3RvdGFsLAorICAgIGludCBlbnRyeV9pZCwKKyAgICBjb25zdCB2b2lkICpzdGFja19hZGRyCispCit7CisgICAgQ09JUkVTVUxUIHJlczsKKworICAgIE9mZmxvYWRUaW1lciB0aW1lcihnZXRfdGltZXJfZGF0YSgpLCBjX29mZmxvYWRfaG9zdF9zZXR1cF9idWZmZXJzKTsKKworICAgIC8vIG1ha2UgYSBjb3B5IG9mIHZhcmlhYmxlIGRlc2NyaXB0b3JzCisgICAgbV92YXJzX3RvdGFsID0gdmFyc190b3RhbDsKKyAgICBpZiAodmFyc190b3RhbCA+IDApIHsKKyAgICAgICAgbV92YXJzID0gKFZhckRlc2MqKSBtYWxsb2MobV92YXJzX3RvdGFsICogc2l6ZW9mKFZhckRlc2MpKTsKKyAgICAgICAgbWVtY3B5KG1fdmFycywgdmFycywgbV92YXJzX3RvdGFsICogc2l6ZW9mKFZhckRlc2MpKTsKKyAgICAgICAgbV92YXJzX2V4dHJhID0gKFZhckV4dHJhKikgbWFsbG9jKG1fdmFyc190b3RhbCAqIHNpemVvZihWYXJFeHRyYSkpOworICAgIH0KKworICAgIC8vIGRlcGVuZGVuY2llcworICAgIG1faW5fZGVwcyA9IChDT0lFVkVOVCopIG1hbGxvYyhzaXplb2YoQ09JRVZFTlQpICogKG1fdmFyc190b3RhbCAgKyAxKSk7CisgICAgaWYgKG1fdmFyc190b3RhbCA+IDApIHsKKyAgICAgICAgbV9vdXRfZGVwcyA9IChDT0lFVkVOVCopIG1hbGxvYyhzaXplb2YoQ09JRVZFTlQpICogbV92YXJzX3RvdGFsKTsKKyAgICB9CisKKyAgICAvLyBjb3B5aW4vY29weW91dCBkYXRhIGxlbmd0aAorICAgIG1faW5fZGF0YWxlbiA9IDA7CisgICAgbV9vdXRfZGF0YWxlbiA9IDA7CisKKyAgICAvLyBGaXJzdCBwYXNzIG92ZXIgdmFyaWFibGUgZGVzY3JpcHRvcnMKKyAgICAvLyAtIENhbGN1bGF0ZSBzaXplIG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG5vbi1wb2ludGVyIGRhdGEKKyAgICAvLyAtIEFsbG9jYXRlIGJ1ZmZlcnMgZm9yIGlucHV0IGFuZCBvdXRwdXQgcG9pbnRlcnMKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fdmFyc190b3RhbDsgaSsrKSB7CisgICAgICAgIHZvaWQqICAgYWxsb2NfYmFzZSA9IE5VTEw7CisgICAgICAgIGludDY0X3QgYWxsb2NfZGlzcCA9IDA7CisgICAgICAgIGludDY0X3QgYWxsb2Nfc2l6ZTsKKyAgICAgICAgYm9vbCAgICBzcmNfaXNfZm9yX21pYyA9IChtX3ZhcnNbaV0uZGlyZWN0aW9uLm91dCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5pbnRvID09IE5VTEwpOworCisgICAgICAgIGNvbnN0IGNoYXIgKnZhcl9zbmFtZSA9ICIiOworICAgICAgICBpZiAodmFyczIgIT0gTlVMTCAmJiBpIDwgdmFyc190b3RhbCkgeworICAgICAgICAgICAgaWYgKHZhcnMyW2ldLnNuYW1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICB2YXJfc25hbWUgPSB2YXJzMltpXS5zbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBPRkZMT0FEX1RSQUNFKDIsICIgICBWYXJEZXNjICVkLCB2YXI9JXMsICVzLCAlc1xuIiwKKyAgICAgICAgICAgIGksIHZhcl9zbmFtZSwKKyAgICAgICAgICAgIHZhcmRlc2NfZGlyZWN0aW9uX2FzX3N0cmluZ1ttX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHNdLAorICAgICAgICAgICAgdmFyZGVzY190eXBlX2FzX3N0cmluZ1ttX3ZhcnNbaV0udHlwZS5zcmNdKTsKKyAgICAgICAgaWYgKHZhcnMyICE9IE5VTEwgJiYgaSA8IHZhcnNfdG90YWwgJiYgdmFyczJbaV0uZG5hbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgT0ZGTE9BRF9UUkFDRSgyLCAiICAgICAgICAgICAgICBpbnRvPSVzLCAlc1xuIiwgdmFyczJbaV0uZG5hbWUsCisgICAgICAgICAgICAgICAgdmFyZGVzY190eXBlX2FzX3N0cmluZ1ttX3ZhcnNbaV0udHlwZS5kc3RdKTsKKyAgICAgICAgfQorICAgICAgICBPRkZMT0FEX1RSQUNFKDIsCisgICAgICAgICAgICAiICAgICAgICAgICAgICB0eXBlX3NyYz0lZCwgdHlwZV9kc3RuPSVkLCBkaXJlY3Rpb249JWQsICIKKyAgICAgICAgICAgICJhbGxvY19pZj0lZCwgZnJlZV9pZj0lZCwgYWxpZ249JWQsIG1pY19vZmZzZXQ9JWQsIGZsYWdzPTB4JXgsICIKKyAgICAgICAgICAgICJvZmZzZXQ9JWxsZCwgc2l6ZT0lbGxkLCBjb3VudC9kaXNwPSVsbGQsIHB0cj0lcCwgaW50bz0lcFxuIiwKKyAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLnNyYywKKyAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLmRzdCwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cywKKyAgICAgICAgICAgIG1fdmFyc1tpXS5hbGxvY19pZiwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmLAorICAgICAgICAgICAgbV92YXJzW2ldLmFsaWduLAorICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQsCisgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuYml0cywKKyAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQsCisgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5jb3VudCwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5wdHIsCisgICAgICAgICAgICBtX3ZhcnNbaV0uaW50byk7CisKKyAgICAgICAgaWYgKG1fdmFyc1tpXS5hbGxvYyAhPSBOVUxMKSB7CisgICAgICAgICAgICAvLyBhcnJheSBkZXNjcmlwdG9yCisgICAgICAgICAgICBjb25zdCBhcnJfZGVzYyAqYXAgPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4obV92YXJzW2ldLmFsbG9jKTsKKworICAgICAgICAgICAgLy8gZGVidWcgZHVtcAorICAgICAgICAgICAgX19hcnJfZGVzY19kdW1wKCIgICAgIiwgIkFMTE9DIiwgYXAsIDApOworCisgICAgICAgICAgICBfX2Fycl9kYXRhX29mZnNldF9hbmRfbGVuZ3RoKGFwLCBhbGxvY19kaXNwLCBhbGxvY19zaXplKTsKKworICAgICAgICAgICAgYWxsb2NfYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGFwLT5iYXNlKTsKKyAgICAgICAgfQorCisgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcCA9IDA7CisgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfb2Zmc2V0ID0gMDsKKyAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhID0gMDsKKyAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYyA9IDA7CisgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QgPSAwOworICAgICAgICAvLyBmbGFnIGlzX2Fycl9wdHJfZWwgaXMgMSBvbmx5IGZvciB2YXJfZGVzY3MgZ2VuZXJhdGVkCisgICAgICAgIC8vIGZvciBjX2RhdGFfcHRyX2FycmF5IHR5cGUKKyAgICAgICAgaWYgKGkgPCB2YXJzX3RvdGFsKSB7CisgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uaXNfYXJyX3B0cl9lbCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKG1fdmFyc1tpXS50eXBlLnNyYykgeworICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyX2FycmF5OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyX2Rlc2MgKmFwOworICAgICAgICAgICAgICAgICAgICBjb25zdCBWYXJEZXNjMyAqdmQzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IFZhckRlc2MzKj4obV92YXJzW2ldLnB0cik7CisgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyA9IHZkMy0+YXJyYXlfZmllbGRzOworICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDIsCisgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICBwb2ludGVyIGFycmF5IGZsYWdzID0gJTA0eFxuIiwgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDIsCisgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICBwb2ludGVyIGFycmF5IHR5cGUgaXMgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICB2YXJkZXNjX3R5cGVfYXNfc3RyaW5nW2ZsYWdzICYgMHgzZl0pOworICAgICAgICAgICAgICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5wdHJfYXJyYXkpOworICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoIiAgICAgICAgICAgICAgIiwgInB0ciBhcnJheSIsIGFwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5pbnRvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4obV92YXJzW2ldLmludG8pOworICAgICAgICAgICAgICAgICAgICAgICAgX19hcnJfZGVzY19kdW1wKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICIsICJpbnRvIGFycmF5IiwgYXAsIDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19hbGlnbl9pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmFsaWduX2FycmF5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAiLCAiYWxpZ24gYXJyYXkiLCBhcCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2FsbG9jX2lmX2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+YWxsb2NfaWZfYXJyYXkpOworICAgICAgICAgICAgICAgICAgICAgICAgX19hcnJfZGVzY19kdW1wKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICIsICJhbGxvY19pZiBhcnJheSIsIGFwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfZnJlZV9pZl9pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmZyZWVfaWZfYXJyYXkpOworICAgICAgICAgICAgICAgICAgICAgICAgX19hcnJfZGVzY19kdW1wKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICIsICJmcmVlX2lmIGFycmF5IiwgYXAsIDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19leHRlbnRfc3RhcnRfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5leHRlbnRfc3RhcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgX19hcnJfZGVzY19kdW1wKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICIsICJleHRlbnRfc3RhcnQgYXJyYXkiLCBhcCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgICAgICgxPDxmbGFnX2V4dGVudF9zdGFydF9pc19zY2FsYXIpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgZXh0ZW50X3N0YXJ0IHNjYWxhciA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KXZkMy0+ZXh0ZW50X3N0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfZXh0ZW50X2VsZW1lbnRzX2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZkMy0+ZXh0ZW50X2VsZW1lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAiLCAiZXh0ZW50X2VsZW1lbnRzIGFycmF5IiwgYXAsIDApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICAoMTw8ZmxhZ19leHRlbnRfZWxlbWVudHNfaXNfc2NhbGFyKSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9UUkFDRSgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgIGV4dGVudF9lbGVtZW50cyBzY2FsYXIgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCl2ZDMtPmV4dGVudF9lbGVtZW50cyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2ludG9fc3RhcnRfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5pbnRvX3N0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAiLCAiaW50b19zdGFydCBhcnJheSIsIGFwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICAgICAgKDE8PGZsYWdfaW50b19zdGFydF9pc19zY2FsYXIpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgaW50b19zdGFydCBzY2FsYXIgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCl2ZDMtPmludG9fc3RhcnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19pbnRvX2VsZW1lbnRzX2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+aW50b19lbGVtZW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgIiwgImludG9fZWxlbWVudHMgYXJyYXkiLCBhcCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgICAgICgxPDxmbGFnX2ludG9fZWxlbWVudHNfaXNfc2NhbGFyKSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9UUkFDRSgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgIGludG9fZWxlbWVudHMgc2NhbGFyID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpdmQzLT5pbnRvX2VsZW1lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfYWxsb2Nfc3RhcnRfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5hbGxvY19zdGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgIiwgImFsbG9jX3N0YXJ0IGFycmF5IiwgYXAsIDApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICAoMTw8ZmxhZ19hbGxvY19zdGFydF9pc19zY2FsYXIpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgYWxsb2Nfc3RhcnQgc2NhbGFyID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpdmQzLT5hbGxvY19zdGFydCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2FsbG9jX2VsZW1lbnRzX2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+YWxsb2NfZWxlbWVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgX19hcnJfZGVzY19kdW1wKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICIsICJhbGxvY19lbGVtZW50cyBhcnJheSIsIGFwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICAgICAgKDE8PGZsYWdfYWxsb2NfZWxlbWVudHNfaXNfc2NhbGFyKSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9UUkFDRSgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgIGFsbG9jX2VsZW1lbnRzIHNjYWxhciA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KXZkMy0+YWxsb2NfZWxlbWVudHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZ2VuX3Zhcl9kZXNjc19mb3JfcG9pbnRlcl9hcnJheShpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY192b2lkX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19jZWFuX3ZhcjoKKyAgICAgICAgICAgICAgICAvLyBJbiBhbGwgdXNlcyBsYXRlcgorICAgICAgICAgICAgICAgIC8vIFZhckRlc2Muc2l6ZSB3aWxsIGhhdmUgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSB0byBiZQorICAgICAgICAgICAgICAgIC8vIHRyYW5zZmVycmVkCisgICAgICAgICAgICAgICAgLy8gVmFyRGVzYy5kaXNwIHdpbGwgaGF2ZSBhbiBvZmZzZXQgZnJvbSBiYXNlCisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS50eXBlLnNyYyA9PSBjX2NlYW5fdmFyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyX2Rlc2MgKmFwID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4obV92YXJzW2ldLnB0cik7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVidWcgZHVtcAorICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoIiIsICJJTi9PVVQiLCBhcCwgMCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IGFuZCBsZW5ndGggYXJlIGRlcml2ZWQgZnJvbSB0aGUgYXJyYXkgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICBfX2Fycl9kYXRhX29mZnNldF9hbmRfbGVuZ3RoKGFwLCBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNfYXJyX2Rlc2NfY29udGlndW91cyhhcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X3NyYyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X3JlYWRfcmFuZ2VzX2Fycl9kZXNjKGFwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBhbGwgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGFib3V0IGxlbmd0aCBhbmQgb2Zmc2V0IGlzCisgICAgICAgICAgICAgICAgICAgIC8vIHRyYW5zZmVycmVkIGluIHZhciBkZXNjcmlwdG9yLiBUaGVyZSBpcyBubyBuZWVkIHRvIHNlbmQKKyAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgZGVzY3JpcHRvciB0byB0aGUgdGFyZ2V0IHNpZGUuCisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5wdHIgPSByZWludGVycHJldF9jYXN0PHZvaWQqPihhcC0+YmFzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSAqPSBtX3ZhcnNbaV0uY291bnQ7CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXNwID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRyYW5zZmVyIHNpemUgPiAwCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uc2l6ZSA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfemVyb19vcl9uZWdfdHJhbnNmZXJfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEgKnB0cl9kYXRhOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbmRfcHRyX2RhdGEocHRyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IHRvIGJhc2UgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSBtX3ZhcnNbaV0ucHRyIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSBwdHJfZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmludG8gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljX2RzdG4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEgPSBwdHJfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChtX2lzX29wZW5tcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGF0aWMgZGF0YSBpcyB0cmFuc2ZlcnJlZCBvbmx5IGJ5IG9tcCB0YXJnZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgY29uc3RydWN0IHdoaWNoIHBhc3NlcyB6ZXJvcyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY19pZiBhbmQgZnJlZV9pZi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmFsbG9jX2lmIHx8IG1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX25vY29weTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRvRGF0YSAqYXV0b19kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uYWxsb2NfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b19kYXRhID0gbV9kZXZpY2UuaW5zZXJ0X2F1dG9fZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5wdHIsIG1fdmFyc1tpXS5zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b19kYXRhLT5hZGRfcmVmZXJlbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB3aGF0IHNob3VsZCBiZSBkb25lIGlmIHZhciBpcyBub3QgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRhYmxlPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvX2RhdGEgPSBtX2RldmljZS5maW5kX2F1dG9fZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5wdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBhdXRvbWF0aWMgdmFyaWFibGVzIGRhdGEgaXMgdHJhbnNmZXJyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGlmIGFsbG9jX2lmID09IDAgJiYgZnJlZV9pZiA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgcmVmZXJlbmNlIGNvdW50IGlzIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1fdmFyc1tpXS5hbGxvY19pZiB8fCBtX3ZhcnNbaV0uZnJlZV9pZikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b19kYXRhICE9IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b19kYXRhLT5nZXRfcmVmZXJlbmNlKCkgIT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9ub2NvcHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSBkYXRhIGZvciBsYXRlciB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uYXV0b19kYXRhID0gYXV0b19kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uaW4gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICFtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gKz0gbV92YXJzW2ldLnNpemU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBub24tc3RhdGljIHRhcmdldCBkZXN0aW5hdGlvbiBkZWZpbmVkIGFzIENFQU4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cHJlc3Npb24gd2UgcGFzcyB0byB0YXJnZXQgaXRzIHNpemUgYW5kIGRpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uaW50byA9PSBOVUxMICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuc3JjID09IGNfY2Vhbl92YXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gKz0gMiAqIHNpemVvZih1aW50NjRfdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtX25lZWRfcnVuZnVuY3Rpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLm91dCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIW1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fb3V0X2RhdGFsZW4gKz0gbV92YXJzW2ldLnNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBtX25lZWRfcnVuZnVuY3Rpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfZHY6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyB8fAorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYgfHwKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgQXJyRGVzYyAqZHZwID0gc3RhdGljX2Nhc3Q8QXJyRGVzYyo+KG1fdmFyc1tpXS5wdHIpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGRlYnVnIGR1bXAKKyAgICAgICAgICAgICAgICAgICAgX19kdl9kZXNjX2R1bXAoIklOL09VVCIsIGR2cCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCBkb3BlIHZlY3RvciBjb250ZW50cyBleGNsdWRpbmcgYmFzZQorICAgICAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gKz0gbV92YXJzW2ldLnNpemUgLSBzaXplb2YodWludDY0X3QpOworICAgICAgICAgICAgICAgICAgICBtX25lZWRfcnVuZnVuY3Rpb24gPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX3N0cmluZ19wdHI6CisgICAgICAgICAgICAgICAgaWYgKChtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgfHwKKyAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5hbGxvY19pZiB8fAorICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYpICYmCisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgPSAxOworICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uY291bnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKCpzdGF0aWNfY2FzdDxjaGFyKio+KG1fdmFyc1tpXS5wdHIpKSArIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIGZhbGx0aHJ1ICovCisKKyAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX3N0YWNrX2J1ZiAmJgorICAgICAgICAgICAgICAgICAgICAhbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzICYmCisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5hbGxvY19pZikgeworICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHZhcl9kZXNjIGlzIGZvciBzdGFjayBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19uZXc7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFvZmZsb2FkX3N0YWNrX21lbW9yeV9tYW5hZ2VyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrX2FkZHIsIGVudHJ5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5jb3VudCwgbV92YXJzW2ldLmFsaWduLCAmaXNfbmV3KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChpc19uZXcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fY29tcHV0ZV9idWZmZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YWNrX3B0cl9kYXRhLT5taWNfYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fZGV2aWNlLm1fcGVyc2lzdF9saXN0LmZyb250KCkuY3B1X3N0YWNrX2FkZHIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0ucHRyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9IHNpemVvZihtX3N0YWNrX3B0cl9kYXRhLT5taWNfYWRkcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgPSBtX2Rlc3Ryb3lfc3RhY2suc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEgPSBtX3N0YWNrX3B0cl9kYXRhOworICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGFkZCByZWZlcmVuY2UgZm9yIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICBtX25lZWRfcnVuZnVuY3Rpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogZmFsbHRocnUgKi8KKworICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHI6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS50eXBlLnNyYyA9PSBjX2NlYW5fdmFyX3B0cikgeworICAgICAgICAgICAgICAgICAgICAvLyBhcnJheSBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycl9kZXNjICphcCA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KG1fdmFyc1tpXS5wdHIpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGRlYnVnIGR1bXAKKyAgICAgICAgICAgICAgICAgICAgX19hcnJfZGVzY19kdW1wKCIiLCAiSU4vT1VUIiwgYXAsIDEpOworCisgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCBhbmQgbGVuZ3RoIGFyZSBkZXJpdmVkIGZyb20gdGhlIGFycmF5IGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgX19hcnJfZGF0YV9vZmZzZXRfYW5kX2xlbmd0aChhcCwgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUpOworCisgICAgICAgICAgICAgICAgICAgIGlmICghaXNfYXJyX2Rlc2NfY29udGlndW91cyhhcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X3NyYyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X3JlYWRfcmFuZ2VzX2Fycl9kZXNjKGFwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBhbGwgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGFib3V0IGxlbmd0aCBhbmQgb2Zmc2V0IGlzCisgICAgICAgICAgICAgICAgICAgIC8vIHRyYW5zZmVycmVkIGluIHZhciBkZXNjcmlwdG9yLiBUaGVyZSBpcyBubyBuZWVkIHRvIHNlbmQKKyAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgZGVzY3JpcHRvciB0byB0aGUgdGFyZ2V0IHNpZGUuCisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5wdHIgPSByZWludGVycHJldF9jYXN0PHZvaWQqPihhcC0+YmFzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1fdmFyc1tpXS50eXBlLnNyYyA9PSBjX2R2X3B0cikgeworICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIHNlbmQgRFYgdG8gdGhlIGRldmljZSB1bmxlc3MgaXQgaXMgJ25vY29weScKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICAgICAgQXJyRGVzYyAqZHZwID0gKnN0YXRpY19jYXN0PEFyckRlc2MqKj4obV92YXJzW2ldLnB0cik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlYnVnIGR1bXAKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZHZfZGVzY19kdW1wKCJJTi9PVVQiLCBkdnApOworCisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIG5vIGRpc3BsYWNlbWVudAorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlzcCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBjX2RhdGFfcHRyIG9yIGNfc3RyaW5nX3B0cgorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSAqPSBtX3ZhcnNbaV0uY291bnQ7CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXNwID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzIHx8CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5hbGxvY19pZiB8fAorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICBQdHJEYXRhICpwdHJfZGF0YTsKKworICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IGJ1ZmZlciBsZW5ndGggPj0gMAorICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmFsbG9jX2lmICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlzcCArIG1fdmFyc1tpXS5zaXplIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3plcm9fb3JfbmVnX3B0cl9sZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGJhc2UgYWRkcmVzcworICAgICAgICAgICAgICAgICAgICB2b2lkICpiYXNlID0gKnN0YXRpY19jYXN0PHZvaWQqKj4obV92YXJzW2ldLnB0cik7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGUgYnVmZmVyIGlmIHdlIGhhdmUgbm8gSU5UTyBhbmQgZG9uJ3QgbmVlZAorICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0aW9uIGZvciB0aGUgcHRyIGF0IHRhcmdldAorICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2lzX2Zvcl9taWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhY2tfYnVmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHN0YWNrIHBlcnNpc3RlbnQgb2JqZWN0cyBwdHIgZGF0YSBpcyBjcmVhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgdmFyX2Rlc2Mgd2l0aCBudW1iZXIgMC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdHMgcHRyX2RhdGEgaXMgc3RvcmVkIGF0IG1fc3RhY2tfcHRyX2RhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YSA9IG1fc3RhY2tfcHRyX2RhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkciA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtX3ZhcnNbaV0uYWxsb2NfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgbmV3IGVudHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhbGxvY19wdHJfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY19iYXNlICE9IE5VTEwpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19kaXNwIDogbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NfYmFzZSAhPSBOVUxMKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2Nfc2l6ZSA6IG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY19iYXNlICE9IE5VTEwpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDogbV92YXJzW2ldLmFsaWduKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhLT5hZGRfcmVmZXJlbmNlKCkgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+bWljX2J1ZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBidWZmZXIgdG8gdGhlIGxpc3Qgb2YgYnVmZmVycyB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSBwYXNzZWQgdG8gZGlzcGF0Y2ggY2FsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2NvbXB1dGVfYnVmZmVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+bWljX2J1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIHNlbmQgYnVmZmVyIGFkZHJlc3MgdG8gZGV2aWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHRyX2RhdGEtPmlzX3N0YXRpYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGFkZCByZWZlcmVuY2UgZm9yIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX25lZWRfcnVuZnVuY3Rpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXJyb3JfaWZfbm90X2ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pc19vcGVubXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIG9tcCB0YXJnZXQgdXBkYXRlIHZhcmlhYmxlIGlzIGlnbm9yZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgaXQgZG9lcyBub3QgZXhpc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbV92YXJzW2ldLmFsbG9jX2lmICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2lmX25vdF9mb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGV4aXN0aW5nIGFzc29jaWF0aW9uIGZyb20gcG9pbnRlciB0YWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmluZF9wdHJfZGF0YShwdHJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9pZl9ub3RfZm91bmQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pc19vcGVubXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSB2YXIgbm9jb3B5IGlmIGl0IGRvZXMgbm90IGV4aXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfcGFyYW1ldGVyX25vY29weTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9pc19vcGVubXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGF0YSBpcyB0cmFuc2ZlcnJlZCBvbmx5IGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jX2lmID09IDAgJiYgZnJlZV9pZiA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIHJlZmVyZW5jZSBjb3VudCBpcyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobV92YXJzW2ldLmFsbG9jX2lmIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+Z2V0X3JlZmVyZW5jZSgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19wYXJhbWV0ZXJfbm9jb3B5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhLT5hbGxvY19kaXNwICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmFsbG9jX2Rpc3AgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gKz0gc2l6ZW9mKGFsbG9jX2Rpc3ApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBidWZmZXJzJ3MgYWRkcmVzcyBvbiB0aGUgc2luaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWluaXRfbWljX2FkZHJlc3MocHRyX2RhdGEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gKz0gc2l6ZW9mKHB0cl9kYXRhLT5taWNfYWRkcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwdHJfZGF0YS0+aXNfc3RhdGljICYmIG1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gZGVjcmVtZW50IGJ1ZmZlciByZWZlcmVuY2Ugb24gdGFyZ2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbmVlZF9ydW5mdW5jdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IHRvIGJhc2UgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ID0gKGNoYXIqKSBiYXNlIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSBwdHJfZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgb3RoZXIgcG9pbnRlciBwcm9wZXJ0aWVzIHRvIHZhciBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgPSBwdHJfZGF0YS0+bWljX29mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljID0gcHRyX2RhdGEtPmlzX3N0YXRpYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmluZF9wdHJfZGF0YShwdHJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIGJhc2UgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSBwb2ludGVyIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhID0gcHRyX2RhdGE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfZnVuY19wdHI6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9IF9fb2ZmbG9hZF9mdW5jcy5tYXhfbmFtZV9sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0KSB7CisgICAgICAgICAgICAgICAgICAgIG1fb3V0X2RhdGFsZW4gKz0gX19vZmZsb2FkX2Z1bmNzLm1heF9uYW1lX2xlbmd0aCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtX25lZWRfcnVuZnVuY3Rpb24gPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfZHZfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHJfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhX3NsaWNlOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhX3NsaWNlOgorICAgICAgICAgICAgICAgIEFyckRlc2MgKmR2cDsKKyAgICAgICAgICAgICAgICBpZiAoVkFSX1RZUEVfSVNfRFZfREFUQV9TTElDRShtX3ZhcnNbaV0udHlwZS5zcmMpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycl9kZXNjICphcDsKKyAgICAgICAgICAgICAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KG1fdmFyc1tpXS5wdHIpOworCisgICAgICAgICAgICAgICAgICAgIGR2cCA9IChtX3ZhcnNbaV0udHlwZS5zcmMgPT0gY19kdl9kYXRhX3NsaWNlKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXJyRGVzYyo+KGFwLT5iYXNlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PEFyckRlc2MqKj4oYXAtPmJhc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZHZwID0gKG1fdmFyc1tpXS50eXBlLnNyYyA9PSBjX2R2X2RhdGEpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QXJyRGVzYyo+KG1fdmFyc1tpXS5wdHIpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0YXRpY19jYXN0PEFyckRlc2MqKj4obV92YXJzW2ldLnB0cik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gaWYgYWxsb2NhdGFibGUgZG9wZSB2ZWN0b3IgaXNuJ3QgYWxsb2NhdGVkIGRvbid0CisgICAgICAgICAgICAgICAgLy8gdHJhbnNmZXIgaXRzIGRhdGEKKyAgICAgICAgICAgICAgICBpZiAoIV9fZHZfaXNfYWxsb2NhdGVkKGR2cCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfbm9jb3B5OworICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYgPSAwOworICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZiA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgfHwKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmIHx8CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycl9kZXNjICphcDsKKworICAgICAgICAgICAgICAgICAgICBpZiAoVkFSX1RZUEVfSVNfRFZfREFUQV9TTElDRShtX3ZhcnNbaV0udHlwZS5zcmMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4obV92YXJzW2ldLnB0cik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlYnVnIGR1bXAKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgiIiwgIklOL09VVCIsIGFwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIV9fZHZfaXNfY29udGlndW91cyhkdnApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9zcmMgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9yZWFkX3Jhbmdlc19kdihkdnApOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc2l6ZSBhbmQgZGlzcGxhY2VtZW50CisgICAgICAgICAgICAgICAgICAgIGlmIChWQVJfVFlQRV9JU19EVl9EQVRBX1NMSUNFKG1fdmFyc1tpXS50eXBlLnNyYykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCBhbmQgbGVuZ3RoIGFyZSBkZXJpdmVkIGZyb20gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcnJheSBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Fycl9kYXRhX29mZnNldF9hbmRfbGVuZ3RoKGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNfYXJyX2Rlc2NfY29udGlndW91cyhhcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X3NyYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3NsaWNlX29mX25vbmNvbnRfYXJyYXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X3NyYyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9yZWFkX3Jhbmdlc19hcnJfZGVzYyhhcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5oYXNfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2R2X2RhdGFfbGVuZ3RoKGR2cCwgbV92YXJzW2ldLmNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplID0gX19kdl9kYXRhX2xlbmd0aChkdnApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpc3AgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCBsZW5ndGggPj0gMAorICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmFsbG9jX2lmICYmCisgICAgICAgICAgICAgICAgICAgICAgICAobV92YXJzW2ldLmRpc3AgKyBtX3ZhcnNbaV0uc2l6ZSA8IDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfemVyb19vcl9uZWdfcHRyX2xlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gYmFzZSBhZGRyZXNzCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJhc2UgPSByZWludGVycHJldF9jYXN0PHZvaWQqPihkdnAtPkJhc2UpOworICAgICAgICAgICAgICAgICAgICBQdHJEYXRhICpwdHJfZGF0YTsKKworICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZSBidWZmZXIgaWYgd2UgaGF2ZSBubyBJTlRPIGFuZCBkb24ndCBuZWVkCisgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRpb24gZm9yIHRoZSBwdHIgYXQgdGFyZ2V0CisgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfaXNfZm9yX21pYykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5hbGxvY19pZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBuZXcgZW50cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFsbG9jX3B0cl9kYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jX2Jhc2UgIT0gTlVMTCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX2Rpc3AgOiBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY19iYXNlICE9IE5VTEwpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19zaXplIDogbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jX2Jhc2UgIT0gTlVMTCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgOiBtX3ZhcnNbaV0uYWxpZ24pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEtPmFkZF9yZWZlcmVuY2UoKSA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5taWNfYnVmICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGJ1ZmZlciB0byB0aGUgbGlzdCBvZiBidWZmZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgYXJlIHBhc3NlZCB0byBkaXNwYXRjaCBjYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fY29tcHV0ZV9idWZmZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5taWNfYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgc2VuZCBidWZmZXIgYWRkcmVzcyB0byBkZXZpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkciA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwdHJfZGF0YS0+aXNfc3RhdGljKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gYWRkIHJlZmVyZW5jZSBmb3IgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbmVlZF9ydW5mdW5jdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlcnJvcl9pZl9ub3RfZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lzX29wZW5tcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3Igb21wIHRhcmdldCB1cGRhdGUgdmFyaWFibGUgaXMgaWdub3JlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBpdCBkb2VzIG5vdCBleGlzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtX3ZhcnNbaV0uYWxsb2NfaWYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfaWZfbm90X2ZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgZXhpc3RpbmcgYXNzb2NpYXRpb24gZnJvbSBwb2ludGVyIHRhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaW5kX3B0cl9kYXRhKHB0cl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2lmX25vdF9mb3VuZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lzX29wZW5tcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHZhciBub2NvcHkgaWYgaXQgZG9lcyBub3QgZXhpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19wYXJhbWV0ZXJfbm9jb3B5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byB1cGRhdGUgYmFzZSBpbiBkb3BlIHZlY3RvciBvbiBkZXZpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkciA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lzX29wZW5tcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIGlzIHRyYW5zZmVycmVkIG9ubHkgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NfaWYgPT0gMCAmJiBmcmVlX2lmID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgcmVmZXJlbmNlIGNvdW50IGlzIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtX3ZhcnNbaV0uYWxsb2NfaWYgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5nZXRfcmVmZXJlbmNlKCkgIT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3BhcmFtZXRlcl9ub2NvcHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEtPmFsbG9jX2Rpc3AgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuYWxsb2NfZGlzcCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSBzaXplb2YoYWxsb2NfZGlzcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGJ1ZmZlcnMncyBhZGRyZXNzIG9uIHRoZSBzaW5rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5pdF9taWNfYWRkcmVzcyhwdHJfZGF0YSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSBzaXplb2YocHRyX2RhdGEtPm1pY19hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXB0cl9kYXRhLT5pc19zdGF0aWMgJiYgbV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBkZWNyZW1lbnQgYnVmZmVyIHJlZmVyZW5jZSBvbiB0YXJnZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgdG8gYmFzZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lbW9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIGJhc2UgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29weSBvdGhlciBwb2ludGVyIHByb3BlcnRpZXMgdG8gdmFyIGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCA9IHB0cl9kYXRhLT5taWNfb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWMgPSBwdHJfZGF0YS0+aXNfc3RhdGljOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeyAvLyAhc3JjX2lzX2Zvcl9taWMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmluZF9wdHJfZGF0YShwdHJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgPSAhcHRyX2RhdGEgPyAwIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSBiYXNlIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSBwdHJfZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgcG9pbnRlciBkYXRhCisgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YSA9IHB0cl9kYXRhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfdW5rbm93bl92YXJfdHlwZSwgbV92YXJzW2ldLnR5cGUuc3JjKTsKKyAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgICAgICB9CisgICAgICAgIGlmIChtX3ZhcnNbaV0udHlwZS5zcmMgPT0gY19kYXRhX3B0cl9hcnJheSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3JjX2lzX2Zvcl9taWMgJiYgbV92YXJzW2ldLmZsYWdzLmlzX3N0YWNrX2J1ZikgeworICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCA9IHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0ucHRyKSAtCisgICAgICAgICAgICAgICAgbV9kZXZpY2UubV9wZXJzaXN0X2xpc3QuZnJvbnQoKS5jcHVfc3RhY2tfYWRkcjsKKyAgICAgICAgfQorICAgICAgICAvLyBpZiBzb3VyY2UgaXMgdXNlZCBhdCBDUFUgc2F2ZSBpdHMgb2Zmc2V0IGFuZCBkaXNwCisgICAgICAgIGlmIChtX3ZhcnNbaV0uaW50byA9PSBOVUxMIHx8IG1fdmFyc1tpXS5kaXJlY3Rpb24uaW4pIHsKKyAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfb2Zmc2V0ID0gbV92YXJzW2ldLm9mZnNldDsKKyAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcCAgID0gbV92YXJzW2ldLmRpc3A7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiAiaW50byIgaXMgZGVmaW5lIHdlIG5lZWQgdG8gZG8gdGhlIHNpbWlsYXIgd29yayBmb3IgaXQKKyAgICAgICAgaWYgKCFtX3ZhcnNbaV0uaW50bykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpbnQ2NF90IGludG9fZGlzcCA9MCwgaW50b19vZmZzZXQgPSAwOworCisgICAgICAgIHN3aXRjaCAobV92YXJzW2ldLnR5cGUuZHN0KSB7CisgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHJfYXJyYXk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGNfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY192b2lkX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19jZWFuX3ZhcjogeworICAgICAgICAgICAgICAgIGludDY0X3Qgc2l6ZSA9IG1fdmFyc1tpXS5zaXplOworCisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS50eXBlLmRzdCA9PSBjX2NlYW5fdmFyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyX2Rlc2MgKmFwID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4obV92YXJzW2ldLmludG8pOworCisgICAgICAgICAgICAgICAgICAgIC8vIGRlYnVnIGR1bXAKKyAgICAgICAgICAgICAgICAgICAgX19hcnJfZGVzY19kdW1wKCIgICAgIiwgIklOVE8iLCBhcCwgMCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IGFuZCBsZW5ndGggYXJlIGRlcml2ZWQgZnJvbSB0aGUgYXJyYXkgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICBfX2Fycl9kYXRhX29mZnNldF9hbmRfbGVuZ3RoKGFwLCBpbnRvX2Rpc3AsIHNpemUpOworCisgICAgICAgICAgICAgICAgICAgIGlmICghaXNfYXJyX2Rlc2NfY29udGlndW91cyhhcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X2RzdCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X3JlYWRfcmFuZ2VzX2Fycl9kZXNjKGFwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2Vhbl9yYW5nZXNfbWF0Y2goCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19yYW5nZXNfZG9udF9tYXRjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uaW50byA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGFwLT5iYXNlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHNpemVfc3JjID0gbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYyA/CisgICAgICAgICAgICAgICAgICAgIGNlYW5fZ2V0X3RyYW5zZl9zaXplKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMpIDoKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemU7CisgICAgICAgICAgICAgICAgaW50NjRfdCBzaXplX2RzdCA9IG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QgPworICAgICAgICAgICAgICAgICAgICBjZWFuX2dldF90cmFuc2Zfc2l6ZShtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0KSA6CisgICAgICAgICAgICAgICAgICAgIHNpemU7CisgICAgICAgICAgICAgICAgLy8gSXQncyBzdXBwb3NlZCB0aGF0ICJpbnRvIiBzaXplIG11c3QgYmUgbm90IGxlc3MKKyAgICAgICAgICAgICAgICAvLyB0aGFuIHNyYyBzaXplCisgICAgICAgICAgICAgICAgaWYgKHNpemVfc3JjID4gc2l6ZV9kc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2RpZmZlcmVudF9zcmNfYW5kX2RzdG5fc2l6ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9zcmMsIHNpemVfZHN0KTsKKyAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljX2RzdG4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEgKnB0cl9kYXRhOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbmRfcHRyX2RhdGEocHRyX2RhdGEsIG1fdmFyc1tpXS5pbnRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludG9fZGlzcCwgc2l6ZSwgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgdG8gYmFzZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lbW9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludG9fb2Zmc2V0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSBtX3ZhcnNbaV0uaW50byAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgcHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljX2RzdG4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5kc3RfZGF0YSA9IHB0cl9kYXRhOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uaW4gJiYKKyAgICAgICAgICAgICAgICAgICAgIW1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWNfZHN0bikgeworICAgICAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gKz0gbV92YXJzW2ldLnNpemU7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZm9yIG5vbi1zdGF0aWMgdGFyZ2V0IGRlc3RpbmF0aW9uIGRlZmluZWQgYXMgQ0VBTgorICAgICAgICAgICAgICAgICAgICAvLyBleHByZXNzaW9uIHdlIHBhc3MgdG8gdGFyZ2V0IGl0cyBzaXplIGFuZCBkaXN0CisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0udHlwZS5kc3QgPT0gY19jZWFuX3ZhcikgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9IDIgKiBzaXplb2YodWludDY0X3QpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1fbmVlZF9ydW5mdW5jdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIGNfZHY6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyB8fAorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYgfHwKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgQXJyRGVzYyAqZHZwID0gc3RhdGljX2Nhc3Q8QXJyRGVzYyo+KG1fdmFyc1tpXS5pbnRvKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1ZyBkdW1wCisgICAgICAgICAgICAgICAgICAgIF9fZHZfZGVzY19kdW1wKCJJTlRPIiwgZHZwKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBzZW5kIGRvcGUgdmVjdG9yIGNvbnRlbnRzIGV4Y2x1ZGluZyBiYXNlCisgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSBtX3ZhcnNbaV0uc2l6ZSAtIHNpemVvZih1aW50NjRfdCk7CisgICAgICAgICAgICAgICAgICAgIG1fbmVlZF9ydW5mdW5jdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfc3RyaW5nX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19jZWFuX3Zhcl9wdHI6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyOiB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBzaXplID0gbV92YXJzW2ldLnNpemU7CisKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLnR5cGUuZHN0ID09IGNfY2Vhbl92YXJfcHRyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyX2Rlc2MgKmFwID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4obV92YXJzW2ldLmludG8pOworCisgICAgICAgICAgICAgICAgICAgIC8vIGRlYnVnIGR1bXAKKyAgICAgICAgICAgICAgICAgICAgX19hcnJfZGVzY19kdW1wKCIgICAgIiwgIklOVE8iLCBhcCwgMSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IGFuZCBsZW5ndGggYXJlIGRlcml2ZWQgZnJvbSB0aGUgYXJyYXkgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICBfX2Fycl9kYXRhX29mZnNldF9hbmRfbGVuZ3RoKGFwLCBpbnRvX2Rpc3AsIHNpemUpOworCisgICAgICAgICAgICAgICAgICAgIGlmICghaXNfYXJyX2Rlc2NfY29udGlndW91cyhhcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X3NyYyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X3JlYWRfcmFuZ2VzX2Fycl9kZXNjKGFwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2Vhbl9yYW5nZXNfbWF0Y2goCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19yYW5nZXNfZG9udF9tYXRjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmludG8gPSByZWludGVycHJldF9jYXN0PGNoYXIqKj4oYXAtPmJhc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtX3ZhcnNbaV0udHlwZS5kc3QgPT0gY19kdl9wdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBzZW5kIERWIHRvIHRoZSBkZXZpY2UgdW5sZXNzIGl0IGlzICdub2NvcHknCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5hbGxvY19pZiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFyckRlc2MgKmR2cCA9ICpzdGF0aWNfY2FzdDxBcnJEZXNjKio+KG1fdmFyc1tpXS5pbnRvKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVidWcgZHVtcAorICAgICAgICAgICAgICAgICAgICAgICAgX19kdl9kZXNjX2R1bXAoIklOVE8iLCBkdnApOworCisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludDY0X3Qgc2l6ZV9zcmMgPSBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjID8KKyAgICAgICAgICAgICAgICAgICAgY2Vhbl9nZXRfdHJhbnNmX3NpemUobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYykgOgorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHNpemVfZHN0ID0gbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCA/CisgICAgICAgICAgICAgICAgICAgIGNlYW5fZ2V0X3RyYW5zZl9zaXplKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QpIDoKKyAgICAgICAgICAgICAgICAgICAgc2l6ZTsKKyAgICAgICAgICAgICAgICAvLyBJdCdzIHN1cHBvc2VkIHRoYXQgImludG8iIHNpemUgbXVzdCBiZSBub3QgbGVzcyB0aGFuCisgICAgICAgICAgICAgICAgLy8gc3JjIHNpemUKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZV9zcmMgPiBzaXplX2RzdCkgeworICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfZGlmZmVyZW50X3NyY19hbmRfZHN0bl9zaXplcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3NyYywgc2l6ZV9kc3QpOworICAgICAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSAqcHRyX2RhdGE7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gYmFzZSBhZGRyZXNzCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJhc2UgPSAqc3RhdGljX2Nhc3Q8dm9pZCoqPihtX3ZhcnNbaV0uaW50byk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19zdGFja19idWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3Igc3RhY2sgcGVyc2lzdGVudCBvYmplY3RzIHB0ciBkYXRhIGlzIGNyZWF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieSB2YXJfZGVzYyB3aXRoIG51bWJlciAwLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0cyBwdHJfZGF0YSBpcyBzdG9yZWQgYXQgbV9zdGFja19wdHJfZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhID0gbV9zdGFja19wdHJfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1fdmFyc1tpXS5hbGxvY19pZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBuZXcgZW50cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFsbG9jX3B0cl9kYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jX2Jhc2UgIT0gTlVMTCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX2Rpc3AgOiBpbnRvX2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NfYmFzZSAhPSBOVUxMKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2Nfc2l6ZSA6IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jX2Jhc2UgIT0gTlVMTCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgOiBtX3ZhcnNbaV0uYWxpZ24pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEtPmFkZF9yZWZlcmVuY2UoKSA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5taWNfYnVmICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGJ1ZmZlciB0byB0aGUgbGlzdCBvZiBidWZmZXJzIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJlIHBhc3NlZCB0byBkaXNwYXRjaCBjYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fY29tcHV0ZV9idWZmZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5taWNfYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgc2VuZCBidWZmZXIgYWRkcmVzcyB0byBkZXZpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkciA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwdHJfZGF0YS0+aXNfc3RhdGljKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gYWRkIHJlZmVyZW5jZSBmb3IgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbmVlZF9ydW5mdW5jdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGV4aXN0aW5nIGFzc29jaWF0aW9uIGZyb20gcG9pbnRlciB0YWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmluZF9wdHJfZGF0YShwdHJfZGF0YSwgYmFzZSwgaW50b19kaXNwLCBzaXplKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEtPmFsbG9jX2Rpc3AgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5hbGxvY19kaXNwID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gKz0gc2l6ZW9mKGFsbG9jX2Rpc3ApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBidWZmZXJzJ3MgYWRkcmVzcyBvbiB0aGUgc2luaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5pdF9taWNfYWRkcmVzcyhwdHJfZGF0YSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSBzaXplb2YocHRyX2RhdGEtPm1pY19hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwdHJfZGF0YS0+aXNfc3RhdGljICYmIG1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBkZWNyZW1lbnQgYnVmZmVyIHJlZmVyZW5jZSBvbiB0YXJnZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX25lZWRfcnVuZnVuY3Rpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IG90aGVyIHBvaW50ZXIgcHJvcGVydGllcyB0byB2YXIgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgPSBwdHJfZGF0YS0+bWljX29mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWNfZHN0biA9IHB0cl9kYXRhLT5pc19zdGF0aWM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbmRfcHRyX2RhdGEocHRyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvX2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50b19vZmZzZXQgPSBwdHJfZGF0YSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSBiYXNlIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgcG9pbnRlciBkYXRhCisgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5kc3RfZGF0YSA9IHB0cl9kYXRhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBjX2Z1bmNfcHRyOgorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfZHZfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHJfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhX3NsaWNlOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhX3NsaWNlOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgfHwKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmIHx8CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycl9kZXNjICphcDsKKyAgICAgICAgICAgICAgICAgICAgQXJyRGVzYyAqZHZwOworICAgICAgICAgICAgICAgICAgICBQdHJEYXRhICpwdHJfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkaXNwOworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHNpemU7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZBUl9UWVBFX0lTX0RWX0RBVEFfU0xJQ0UobV92YXJzW2ldLnR5cGUuZHN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KG1fdmFyc1tpXS5pbnRvKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVidWcgZHVtcAorICAgICAgICAgICAgICAgICAgICAgICAgX19hcnJfZGVzY19kdW1wKCIgICAgIiwgIklOVE8iLCBhcCwgMCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGR2cCA9IChtX3ZhcnNbaV0udHlwZS5kc3QgPT0gY19kdl9kYXRhX3NsaWNlKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEFyckRlc2MqPihhcC0+YmFzZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8QXJyRGVzYyoqPihhcC0+YmFzZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkdnAgPSAobV92YXJzW2ldLnR5cGUuZHN0ID09IGNfZHZfZGF0YSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QXJyRGVzYyo+KG1fdmFyc1tpXS5pbnRvKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RhdGljX2Nhc3Q8QXJyRGVzYyoqPihtX3ZhcnNbaV0uaW50byk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFfX2R2X2lzX2NvbnRpZ3VvdXMoZHZwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfZHN0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfcmVhZF9yYW5nZXNfZHYoZHZwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBzaXplIGFuZCBkaXNwbGFjZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZBUl9UWVBFX0lTX0RWX0RBVEFfU0xJQ0UobV92YXJzW2ldLnR5cGUuZHN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IGFuZCBsZW5ndGggYXJlIGRlcml2ZWQgZnJvbSB0aGUgYXJyYXkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYXJyX2RhdGFfb2Zmc2V0X2FuZF9sZW5ndGgoYXAsIGludG9fZGlzcCwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc19hcnJfZGVzY19jb250aWd1b3VzKGFwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfZHN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfc2xpY2Vfb2Zfbm9uY29udF9hcnJheSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfZHN0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X3JlYWRfcmFuZ2VzX2Fycl9kZXNjKGFwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjZWFuX3Jhbmdlc19tYXRjaCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3Jhbmdlc19kb250X21hdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaGFzX2xlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBfX2R2X2RhdGFfbGVuZ3RoKGR2cCwgbV92YXJzW2ldLmNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBfX2R2X2RhdGFfbGVuZ3RoKGR2cCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBkaXNwID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgc2l6ZV9zcmMgPQorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYyA/CisgICAgICAgICAgICAgICAgICAgICAgICBjZWFuX2dldF90cmFuc2Zfc2l6ZShtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzaXplX2RzdCA9CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0ID8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNlYW5fZ2V0X3RyYW5zZl9zaXplKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemU7CisgICAgICAgICAgICAgICAgICAgIC8vIEl0J3Mgc3VwcG9zZWQgdGhhdCAiaW50byIgc2l6ZSBtdXN0IGJlIG5vdCBsZXNzCisgICAgICAgICAgICAgICAgICAgIC8vIHRoYW4gc3JjIHNpemUKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNpemVfc3JjID4gc2l6ZV9kc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19kaWZmZXJlbnRfc3JjX2FuZF9kc3RuX3NpemVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfc3JjLCBzaXplX2RzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gYmFzZSBhZGRyZXNzCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJhc2UgPSByZWludGVycHJldF9jYXN0PHZvaWQqPihkdnAtPkJhc2UpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbikgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5hbGxvY19pZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBuZXcgZW50cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFsbG9jX3B0cl9kYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jX2Jhc2UgIT0gTlVMTCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX2Rpc3AgOiBpbnRvX2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NfYmFzZSAhPSBOVUxMKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2Nfc2l6ZSA6IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jX2Jhc2UgIT0gTlVMTCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgOiBtX3ZhcnNbaV0uYWxpZ24pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhLT5hZGRfcmVmZXJlbmNlKCkgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+bWljX2J1ZiAhPTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGJ1ZmZlciB0byB0aGUgbGlzdCBvZiBidWZmZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgYXJlIHBhc3NlZCB0byBkaXNwYXRjaCBjYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fY29tcHV0ZV9idWZmZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5taWNfYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgc2VuZCBidWZmZXIgYWRkcmVzcyB0byBkZXZpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkciA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwdHJfZGF0YS0+aXNfc3RhdGljKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gYWRkIHJlZmVyZW5jZSBmb3IgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbmVlZF9ydW5mdW5jdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGV4aXN0aW5nIGFzc29jaWF0aW9uIGZyb20gcG9pbnRlciB0YWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmluZF9wdHJfZGF0YShwdHJfZGF0YSwgYmFzZSwgaW50b19kaXNwLCBzaXplKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byB1cGRhdGUgYmFzZSBpbiBkb3BlIHZlY3RvciBvbiBkZXZpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhLT5hbGxvY19kaXNwICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuYWxsb2NfZGlzcCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9IHNpemVvZihhbGxvY19kaXNwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgYnVmZmVycydzIGFkZHJlc3Mgb24gdGhlIHNpbmsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWluaXRfbWljX2FkZHJlc3MocHRyX2RhdGEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9IHNpemVvZihwdHJfZGF0YS0+bWljX2FkZHIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXB0cl9kYXRhLT5pc19zdGF0aWMgJiYgbV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGRlY3JlbWVudCBidWZmZXIgcmVmZXJlbmNlIG9uIHRhcmdldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbmVlZF9ydW5mdW5jdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCB0byBiYXNlIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgICAgIGludG9fb2Zmc2V0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIGJhc2UgLSAoY2hhciopIHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IG90aGVyIHBvaW50ZXIgcHJvcGVydGllcyB0byB2YXIgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgPSBwdHJfZGF0YS0+bWljX29mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWNfZHN0biA9IHB0cl9kYXRhLT5pc19zdGF0aWM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7IC8vIHNyY19pc19mb3JfbWljCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbmRfcHRyX2RhdGEocHRyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvX2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRvX29mZnNldCA9ICFwdHJfZGF0YSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSBiYXNlIC0gKGNoYXIqKSBwdHJfZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgcG9pbnRlciBkYXRhCisgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5kc3RfZGF0YSA9IHB0cl9kYXRhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfdW5rbm93bl92YXJfdHlwZSwgbV92YXJzW2ldLnR5cGUuc3JjKTsKKyAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgICAgICB9CisgICAgICAgIC8vIGlmIGludG8gaXMgdXNlZCBhdCBDUFUgc2F2ZSBpdHMgb2Zmc2V0IGFuZCBkaXNwCisgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLm91dCkgeworICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9vZmZzZXQgPSBpbnRvX29mZnNldDsKKyAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcCAgID0gaW50b19kaXNwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19zdGFja19idWYpIHsKKyAgICAgICAgICAgICAgICBpbnRvX29mZnNldCA9IHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0uaW50bykgLQorICAgICAgICAgICAgICAgICAgICBtX2RldmljZS5tX3BlcnNpc3RfbGlzdC5mcm9udCgpLmNwdV9zdGFja19hZGRyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCA9IGludG9fb2Zmc2V0OworICAgICAgICAgICAgbV92YXJzW2ldLmRpc3AgICA9IGludG9fZGlzcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjpzZXR1cF9taXNjX2RhdGEoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBPZmZsb2FkVGltZXIgdGltZXIoZ2V0X3RpbWVyX2RhdGEoKSwgY19vZmZsb2FkX2hvc3Rfc2V0dXBfbWlzY19kYXRhKTsKKworICAgIC8vIHdlIGNhbiBza2lwIHJ1biBmdW5jdG9uIGNhbGwgdG9nZXRoZXIgd2l0aCB3YWl0IGlmIG9mZmxvYWRlZAorICAgIC8vIHJlZ2lvbiBpcyBlbXB0eSBhbmQgdGhlcmUgaXMgbm8gdXNlciBkZWZpbmVkIG5vbi1wb2ludGVyIElOL09VVCBkYXRhCisgICAgaWYgKG1fbmVlZF9ydW5mdW5jdGlvbikgeworICAgICAgICAvLyB2YXJpYWJsZSBkZXNjcmlwdG9ycyBhcmUgc2VudCBhcyBpbnB1dCBkYXRhCisgICAgICAgIG1faW5fZGF0YWxlbiArPSBtX3ZhcnNfdG90YWwgKiBzaXplb2YoVmFyRGVzYyk7CisKKyAgICAgICAgLy8gdGltZXIgZGF0YSBpcyBzZW50IGFzIGEgcGFydCBvZiB0aGUgb3V0cHV0IGRhdGEKKyAgICAgICAgbV9vdXRfZGF0YWxlbiArPSBPRkZMT0FEX1RJTUVSX0RBVEFMRU4oKTsKKworICAgICAgICAvLyBtYXggZnJvbSBpbnB1dCBkYXRhIGFuZCBvdXRwdXQgZGF0YSBsZW5ndGgKKyAgICAgICAgdWludDY0X3QgZGF0YV9sZW4gPSBtX2luX2RhdGFsZW4gPiBtX291dF9kYXRhbGVuID8gbV9pbl9kYXRhbGVuIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9vdXRfZGF0YWxlbjsKKworICAgICAgICAvLyBNaXNjIGRhdGEgaGFzIHRoZSBmb2xsb3dpbmcgbGF5b3V0CisgICAgICAgIC8vICAgICA8RnVuY3Rpb24gRGVzY3JpcHRvcj4KKyAgICAgICAgLy8gICAgIDxGdW5jdGlvbiBOYW1lPgorICAgICAgICAvLyAgICAgPEluL091dCBEYXRhPiAgICAgICAgICAgIChvcHRpb25hbCkKKyAgICAgICAgLy8KKyAgICAgICAgLy8gV2UgY2FuIHRyYW5zZmVyIGNvcHlpbi9jb3B5b3V0IGRhdGEgaW4gbWlzYy9yZXR1cm4gZGF0YSB3aGljaCBjYW4KKyAgICAgICAgLy8gYmUgcGFzc2VkIHRvIHJ1biBmdW5jdGlvbiBjYWxsIGlmIGl0cyBzaXplIGRvZXMgbm90IGV4Y2VlZAorICAgICAgICAvLyBDT0lfUElQRUxJTkVfTUFYX0lOX01JU0NfREFUQV9MRU4uIE90aGVyd2lzZSB3ZSBoYXZlIHRvIGFsbG9jYXRlCisgICAgICAgIC8vIGJ1ZmZlciBmb3IgaXQuCisKKyAgICAgICAgbV9mdW5jX2Rlc2Nfc2l6ZSA9IHNpemVvZihGdW5jdGlvbkRlc2NyaXB0b3IpICsgc3RybGVuKG5hbWUpICsgMTsKKyAgICAgICAgbV9mdW5jX2Rlc2Nfc2l6ZSA9IChtX2Z1bmNfZGVzY19zaXplICsgNykgJiB+NzsKKworICAgICAgICBpbnQgbWlzY19kYXRhX29mZnNldCA9IDA7CisgICAgICAgIGludCBtaXNjX2RhdGFfc2l6ZSA9IDA7CisgICAgICAgIGlmIChkYXRhX2xlbiA+IDApIHsKKyAgICAgICAgICAgIGlmIChtX2Z1bmNfZGVzY19zaXplICsKKyAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gPD0gQ09JX1BJUEVMSU5FX01BWF9JTl9NSVNDX0RBVEFfTEVOICYmCisgICAgICAgICAgICAgICAgbV9vdXRfZGF0YWxlbiA8PSBDT0lfUElQRUxJTkVfTUFYX0lOX01JU0NfREFUQV9MRU4pIHsKKyAgICAgICAgICAgICAgICAvLyB1c2UgbWlzYy9yZXR1cm4gZGF0YSBmb3IgY29weWluL2NvcHlvdXQKKyAgICAgICAgICAgICAgICBtaXNjX2RhdGFfb2Zmc2V0ID0gbV9mdW5jX2Rlc2Nfc2l6ZTsKKyAgICAgICAgICAgICAgICBtaXNjX2RhdGFfc2l6ZSA9IGRhdGFfbGVuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgT2ZmbG9hZFRpbWVyIHRpbWVyX2J1ZihnZXRfdGltZXJfZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX2hvc3RfYWxsb2NfZGF0YV9idWZmZXIpOworCisgICAgICAgICAgICAgICAgLy8gc2VuZC9yZWNlaXZlIGRhdGEgdXNpbmcgYnVmZmVyCisgICAgICAgICAgICAgICAgQ09JUkVTVUxUIHJlcyA9IENPSTo6QnVmZmVyQ3JlYXRlKGRhdGFfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQlVGRkVSX05PUk1BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgJm1fZGV2aWNlLmdldF9wcm9jZXNzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX2lub3V0X2J1Zik7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2NyZWF0ZSwgcmVzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtX2NvbXB1dGVfYnVmZmVycy5wdXNoX2JhY2sobV9pbm91dF9idWYpOworICAgICAgICAgICAgICAgIG1fZGVzdHJveV9idWZmZXJzLnB1c2hfYmFjayhtX2lub3V0X2J1Zik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBpbml0aWFsaXplIGZ1bmN0aW9uIGRlc2NyaXB0b3IKKyAgICAgICAgbV9mdW5jX2Rlc2MgPSAoRnVuY3Rpb25EZXNjcmlwdG9yKikgbWFsbG9jKG1fZnVuY19kZXNjX3NpemUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzY19kYXRhX3NpemUpOworICAgICAgICBtX2Z1bmNfZGVzYy0+Y29uc29sZV9lbmFibGVkID0gY29uc29sZV9lbmFibGVkOworICAgICAgICBtX2Z1bmNfZGVzYy0+dGltZXJfZW5hYmxlZCA9CisgICAgICAgICAgICB0aW1lcl9lbmFibGVkIHx8IChvZmZsb2FkX3JlcG9ydF9sZXZlbCAmJiBvZmZsb2FkX3JlcG9ydF9lbmFibGVkKTsKKyAgICAgICAgbV9mdW5jX2Rlc2MtPm9mZmxvYWRfcmVwb3J0X2xldmVsID0gb2ZmbG9hZF9yZXBvcnRfbGV2ZWw7CisgICAgICAgIG1fZnVuY19kZXNjLT5vZmZsb2FkX251bWJlciA9IEdFVF9PRkZMT0FEX05VTUJFUihnZXRfdGltZXJfZGF0YSgpKTsKKyAgICAgICAgbV9mdW5jX2Rlc2MtPmluX2RhdGFsZW4gPSBtX2luX2RhdGFsZW47CisgICAgICAgIG1fZnVuY19kZXNjLT5vdXRfZGF0YWxlbiA9IG1fb3V0X2RhdGFsZW47CisgICAgICAgIG1fZnVuY19kZXNjLT52YXJzX251bSA9IG1fdmFyc190b3RhbDsKKyAgICAgICAgbV9mdW5jX2Rlc2MtPmRhdGFfb2Zmc2V0ID0gbWlzY19kYXRhX29mZnNldDsKKworICAgICAgICAvLyBhcHBlbmQgZW50cnkgbmFtZQorICAgICAgICBzdHJjcHkobV9mdW5jX2Rlc2MtPmRhdGEsIG5hbWUpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjp3YWl0X2RlcGVuZGVuY2llcygKKyAgICBjb25zdCB2b2lkICoqd2FpdHMsCisgICAgaW50IG51bV93YWl0cworKQoreworICAgIE9mZmxvYWRUaW1lciB0aW1lcihnZXRfdGltZXJfZGF0YSgpLCBjX29mZmxvYWRfaG9zdF93YWl0X2RlcHMpOworICAgIGJvb2wgcmV0ID0gdHJ1ZTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX3dhaXRzOyBpKyspIHsKKworICAgICAgICBPZmZsb2FkRGVzY3JpcHRvciAqdGFzayA9IG1fZGV2aWNlLmZpbmRfc2lnbmFsKHdhaXRzW2ldLCB0cnVlKTsKKyAgICAgICAgaWYgKHRhc2sgPT0gMCkgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX29mZmxvYWQxLCBtX2RldmljZS5nZXRfbG9naWNhbF9pbmRleCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0c1tpXSk7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCF0YXNrLT5vZmZsb2FkX2ZpbmlzaCgpKSB7CisgICAgICAgICAgICByZXQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHRhc2stPmNsZWFudXAoKTsKKyAgICAgICAgZGVsZXRlIHRhc2s7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6b2ZmbG9hZCgKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIGJvb2wgaXNfZW1wdHksCisgICAgVmFyRGVzYyAqdmFycywKKyAgICBWYXJEZXNjMiAqdmFyczIsCisgICAgaW50IHZhcnNfdG90YWwsCisgICAgY29uc3Qgdm9pZCAqKndhaXRzLAorICAgIGludCBudW1fd2FpdHMsCisgICAgY29uc3Qgdm9pZCAqKnNpZ25hbCwKKyAgICBpbnQgZW50cnlfaWQsCisgICAgY29uc3Qgdm9pZCAqc3RhY2tfYWRkcgorKQoreworICAgIGlmIChzaWduYWwgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoMSwKKyAgICAgICAgICAgICAgICAgICAgICBHRVRfT0ZGTE9BRF9OVU1CRVIoZ2V0X3RpbWVyX2RhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX2luaXRfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAiT2ZmbG9hZCBmdW5jdGlvbiAlcywgaXNfZW1wdHk9JWQsICN2YXJEZXNjcz0lZCwgIgorICAgICAgICAgICAgICAgICAgICAgICIjd2FpdHM9JWQsIHNpZ25hbD1ub25lXG4iLAorICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGlzX2VtcHR5LCB2YXJzX3RvdGFsLCBudW1fd2FpdHMpOworICAgICAgICBPRkZMT0FEX1JFUE9SVCgzLCBHRVRfT0ZGTE9BRF9OVU1CRVIoZ2V0X3RpbWVyX2RhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX3NlbnRfcG9pbnRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICIjV2FpdCA6ICVkIFxuIiwgbnVtX3dhaXRzKTsKKyAgICAgICAgT0ZGTE9BRF9SRVBPUlQoMywgR0VUX09GRkxPQURfTlVNQkVSKGdldF90aW1lcl9kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF9zaWduYWwsCisgICAgICAgICAgICAgICAgICAgICAgIm5vbmUgJWRcbiIsIDApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDEsCisgICAgICAgICAgICAgICAgICAgICAgR0VUX09GRkxPQURfTlVNQkVSKGdldF90aW1lcl9kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF9pbml0X2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgIk9mZmxvYWQgZnVuY3Rpb24gJXMsIGlzX2VtcHR5PSVkLCAjdmFyRGVzY3M9JWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAiI3dhaXRzPSVkLCBzaWduYWw9JXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgaXNfZW1wdHksIHZhcnNfdG90YWwsIG51bV93YWl0cywKKyAgICAgICAgICAgICAgICAgICAgICAqc2lnbmFsKTsKKworICAgICAgICBPRkZMT0FEX1JFUE9SVCgzLCBHRVRfT0ZGTE9BRF9OVU1CRVIoZ2V0X3RpbWVyX2RhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX3NpZ25hbCwKKyAgICAgICAgICAgICAgICAgICAgICAiJWRcbiIsIHNpZ25hbCk7CisgICAgfQorICAgIE9GRkxPQURfUkVQT1JUKDMsIEdFVF9PRkZMT0FEX05VTUJFUihnZXRfdGltZXJfZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfd2FpdCwKKyAgICAgICAgICAgICAgICAgICAgICAiI1dhaXQgOiAlZCAgJXBcbiIsIG51bV93YWl0cywgd2FpdHMpOworCisgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IE9GRkxPQURfU1VDQ0VTUzsKKyAgICAgICAgbV9zdGF0dXMtPmRldmljZV9udW1iZXIgPSBtX2RldmljZS5nZXRfbG9naWNhbF9pbmRleCgpOworICAgIH0KKworICAgIG1fbmVlZF9ydW5mdW5jdGlvbiA9ICFpc19lbXB0eTsKKworICAgIC8vIHdhaXQgZm9yIGRlcGVuZGVuY2llcyB0byBmaW5pc2gKKyAgICBpZiAoIXdhaXRfZGVwZW5kZW5jaWVzKHdhaXRzLCBudW1fd2FpdHMpKSB7CisgICAgICAgIGNsZWFudXAoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIHNldHVwIGJ1ZmZlcnMKKyAgICBpZiAoIXNldHVwX2Rlc2NyaXB0b3JzKHZhcnMsIHZhcnMyLCB2YXJzX3RvdGFsLCBlbnRyeV9pZCwgc3RhY2tfYWRkcikpIHsKKyAgICAgICAgY2xlYW51cCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gaW5pdGlhdGUgc2VuZCBmb3IgcG9pbnRlcnMuIFdhbnQgdG8gZG8gaXQgYXMgZWFybHkgYXMgcG9zc2libGUuCisgICAgaWYgKCFzZW5kX3BvaW50ZXJfZGF0YShzaWduYWwgIT0gMCkpIHsKKyAgICAgICAgY2xlYW51cCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gc2V0dXAgbWlzYyBkYXRhIGZvciBydW4gZnVuY3Rpb24KKyAgICBpZiAoIXNldHVwX21pc2NfZGF0YShuYW1lKSkgeworICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBnYXRoZXIgY29weWluIGRhdGEgaW50byBidWZmZXIKKyAgICBpZiAoIWdhdGhlcl9jb3B5aW5fZGF0YSgpKSB7CisgICAgICAgIGNsZWFudXAoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFN0YXJ0IHRoZSBjb21wdXRhdGlvbgorICAgIGlmICghY29tcHV0ZSgpKSB7CisgICAgICAgIGNsZWFudXAoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIGluaXRpYXRlIHJlY2VpdmUgZm9yIHBvaW50ZXJzCisgICAgaWYgKCFyZWNlaXZlX3BvaW50ZXJfZGF0YShzaWduYWwgIT0gMCkpIHsKKyAgICAgICAgY2xlYW51cCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gaWYgdGhlcmUgaXMgYSBzaWduYWwgc2F2ZSBkZXNjcmlwdG9yIGZvciB0aGUgbGF0ZXIgdXNlLgorICAgIGlmIChzaWduYWwgIT0gMCkgeworICAgICAgICBtX2RldmljZS5hZGRfc2lnbmFsKCpzaWduYWwsIHRoaXMpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyB3YWl0IGZvciB0aGUgb2ZmbG9hZCB0byBmaW5pc2guCisgICAgaWYgKCFvZmZsb2FkX2ZpbmlzaCgpKSB7CisgICAgICAgIGNsZWFudXAoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNsZWFudXAoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6b2ZmbG9hZF9maW5pc2goKQoreworICAgIENPSVJFU1VMVCByZXM7CisKKyAgICAvLyB3YWl0IGZvciBjb21wdXRlIGRlcGVuZGVuY2llcyB0byBiZWNvbWUgc2lnbmFsZWQKKyAgICBpZiAobV9pbl9kZXBzX3RvdGFsID4gMCkgeworICAgICAgICBPZmZsb2FkVGltZXIgdGltZXIoZ2V0X3RpbWVyX2RhdGEoKSwgY19vZmZsb2FkX2hvc3Rfd2FpdF9jb21wdXRlKTsKKworICAgICAgICBpZiAoX19vZmZsb2FkX2FjdGl2ZV93YWl0KSB7CisgICAgICAgICAgICAvLyBrZWVwIENQVSBidXN5CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgcmVzID0gQ09JOjpFdmVudFdhaXQobV9pbl9kZXBzX3RvdGFsLCBtX2luX2RlcHMsIDAsIDEsIDAsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKHJlcyA9PSBDT0lfVElNRV9PVVRfUkVBQ0hFRCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXMgPSBDT0k6OkV2ZW50V2FpdChtX2luX2RlcHNfdG90YWwsIG1faW5fZGVwcywgLTEsIDEsIDAsIDApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19ldmVudF93YWl0LCByZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gc2NhdHRlciBjb3B5b3V0IGRhdGEgcmVjZWl2ZWQgZnJvbSB0YXJnZXQKKyAgICBpZiAoIXNjYXR0ZXJfY29weW91dF9kYXRhKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyB3YWl0IGZvciByZWNlaXZlIGRlcGVuZGVuY2llcyB0byBiZWNvbWUgc2lnbmFsZWQKKyAgICBpZiAobV9vdXRfZGVwc190b3RhbCA+IDApIHsKKyAgICAgICAgT2ZmbG9hZFRpbWVyIHRpbWVyKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X3dhaXRfYnVmZmVyc19yZWFkcyk7CisKKyAgICAgICAgaWYgKF9fb2ZmbG9hZF9hY3RpdmVfd2FpdCkgeworICAgICAgICAgICAgLy8ga2VlcCBDUFUgYnVzeQorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHJlcyA9IENPSTo6RXZlbnRXYWl0KG1fb3V0X2RlcHNfdG90YWwsIG1fb3V0X2RlcHMsIDAsIDEsIDAsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKHJlcyA9PSBDT0lfVElNRV9PVVRfUkVBQ0hFRCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXMgPSBDT0k6OkV2ZW50V2FpdChtX291dF9kZXBzX3RvdGFsLCBtX291dF9kZXBzLCAtMSwgMSwgMCwgMCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2V2ZW50X3dhaXQsIHJlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBkZXN0cm95IGJ1ZmZlcnMKKyAgICB7CisgICAgICAgIE9mZmxvYWRUaW1lciB0aW1lcihnZXRfdGltZXJfZGF0YSgpLCBjX29mZmxvYWRfaG9zdF9kZXN0cm95X2J1ZmZlcnMpOworCisgICAgICAgIGZvciAoQnVmZmVyTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2Rlc3Ryb3lfYnVmZmVycy5iZWdpbigpOworICAgICAgICAgICAgIGl0ICE9IG1fZGVzdHJveV9idWZmZXJzLmVuZCgpOyBpdCsrKSB7CisgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlckRlc3Ryb3koKml0KTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfZGVzdHJveSwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIE9mZmxvYWREZXNjcmlwdG9yOjpjbGVhbnVwKCkKK3sKKyAgICAvLyByZWxlYXNlIGRldmljZSBpbiBvcnNsCisgICAgT1JTTDo6cmVsZWFzZShtX2RldmljZS5nZXRfbG9naWNhbF9pbmRleCgpKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RPUChnZXRfdGltZXJfZGF0YSgpLCBjX29mZmxvYWRfaG9zdF90b3RhbF9vZmZsb2FkKTsKKworICAgIC8vIHJlcG9ydCBzdHVmZgorICAgIE9mZmxvYWRfUmVwb3J0X0VwaWxvZyhnZXRfdGltZXJfZGF0YSgpKTsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6aXNfc2lnbmFsZWQoKQoreworICAgIGJvb2wgc2lnbmFsZWQgPSB0cnVlOworICAgIENPSVJFU1VMVCByZXM7CisKKyAgICAvLyBjaGVjayBjb21wdXRlIGFuZCByZWNlaXZlIGRlcGVuZGVuY2llcworICAgIGlmIChtX2luX2RlcHNfdG90YWwgPiAwKSB7CisgICAgICAgIHJlcyA9IENPSTo6RXZlbnRXYWl0KG1faW5fZGVwc190b3RhbCwgbV9pbl9kZXBzLCAwLCAxLCAwLCAwKTsKKyAgICAgICAgc2lnbmFsZWQgPSBzaWduYWxlZCAmJiAocmVzID09IENPSV9TVUNDRVNTKTsKKyAgICB9CisgICAgaWYgKG1fb3V0X2RlcHNfdG90YWwgPiAwKSB7CisgICAgICAgIHJlcyA9IENPSTo6RXZlbnRXYWl0KG1fb3V0X2RlcHNfdG90YWwsIG1fb3V0X2RlcHMsIDAsIDEsIDAsIDApOworICAgICAgICBzaWduYWxlZCA9IHNpZ25hbGVkICYmIChyZXMgPT0gQ09JX1NVQ0NFU1MpOworICAgIH0KKworICAgIHJldHVybiBzaWduYWxlZDsKK30KKworLy8gU2VuZCBwb2ludGVyIGRhdGEgaWYgc291cmNlIG9yIGRlc3RpbmF0aW9uIG9yIGJvdGggb2YgdGhlbSBhcmUKKy8vIG5vbmNvbnRpZ3VvdXMuIFRoZXJlIGlzIGd1YXJhbnRlZSB0aGF0IGxlbmd0aCBvZiBkZXN0aW5hdGlvbiBlbm91Z2ggZm9yCisvLyB0cmFuc2ZlcnJlZCBkYXRhLgorYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6c2VuZF9ub25jb250aWd1b3VzX3BvaW50ZXJfZGF0YSgKKyAgICBpbnQgaSwKKyAgICBQdHJEYXRhKiBzcmNfZGF0YSwKKyAgICBQdHJEYXRhKiBkc3RfZGF0YSwKKyAgICBDT0lFVkVOVCAqZXZlbnQKKyAgICApCit7CisgICAgaW50NjRfdCBvZmZzZXRfc3JjLCBvZmZzZXRfZHN0OworICAgIGludDY0X3QgbGVuZ3RoX3NyYywgbGVuZ3RoX2RzdDsKKyAgICBpbnQ2NF90IGxlbmd0aF9zcmNfY3VyLCBsZW5ndGhfZHN0X2N1cjsKKyAgICBpbnQ2NF90IHNlbmRfc2l6ZSwgZGF0YV9zZW50ID0gMDsKKyAgICBDT0lSRVNVTFQgcmVzOworICAgIGJvb2wgZHN0X2lzX2VtcHR5ID0gdHJ1ZTsKKyAgICBib29sIHNyY19pc19lbXB0eSA9IHRydWU7CisKKyAgICAvLyBTZXQgbGVuZ3RoX3NyYyBhbmQgbGVuZ3RoX2RzdAorICAgIGxlbmd0aF9zcmMgPSAobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYykgPworICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjLT5yYW5nZV9zaXplIDogbV92YXJzW2ldLnNpemU7CisgICAgbGVuZ3RoX2RzdCA9ICFtX3ZhcnNbaV0uaW50byA/IGxlbmd0aF9zcmMgOgorICAgICAgICAgICAgICAgICAgICAgKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QpID8KKyAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QtPnJhbmdlX3NpemUgOiBtX3ZhcnNbaV0uc2l6ZTsKKyAgICBzZW5kX3NpemUgPSAobGVuZ3RoX3NyYyA8IGxlbmd0aF9kc3QpID8gbGVuZ3RoX3NyYyA6IGxlbmd0aF9kc3Q7CisKKyAgICAvLyBjb25zZXF1ZW50bHkgZ2V0IGNvbnRpZ3VvdXMgcmFuZ2VzLAorICAgIC8vIGRlZmluZSBjb3JyZXNwb25kZWQgZGVzdGluYXRpb24gb2Zmc2V0IGFuZCBzZW5kIGRhdGEKKyAgICBkbyB7CisgICAgICAgIGlmIChzcmNfaXNfZW1wdHkpIHsKKyAgICAgICAgICAgIGlmIChtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjKSB7CisgICAgICAgICAgICAgICAgaWYgKCFnZXRfbmV4dF9yYW5nZShtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXRfc3JjKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBzb3VyY2UgcmFuZ2VzIGFyZSBvdmVyIC0gbm90aGluZyB0byBzZW5kCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGRhdGFfc2VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgb2Zmc2V0X3NyYyA9IG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGVuZ3RoX3NyY19jdXIgPSBsZW5ndGhfc3JjOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gaWYgc291cmNlIGlzIGNvbnRpZ3VvdXMgb3IgaXRzIGNvbnRpZ3VvdXMgcmFuZ2UgaXMgZ3JlYXRlcgorICAgICAgICAgICAgLy8gdGhhbiBkZXN0aW5hdGlvbiBvbmUKKyAgICAgICAgICAgIG9mZnNldF9zcmMgKz0gc2VuZF9zaXplOworICAgICAgICB9CisgICAgICAgIGxlbmd0aF9zcmNfY3VyIC09IHNlbmRfc2l6ZTsKKyAgICAgICAgc3JjX2lzX2VtcHR5ID0gbGVuZ3RoX3NyY19jdXIgPT0gMDsKKworICAgICAgICBpZiAoZHN0X2lzX2VtcHR5KSB7CisgICAgICAgICAgICBpZiAobV92YXJzW2ldLmludG8pIHsKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWdldF9uZXh0X3JhbmdlKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXRfZHN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVzdGluYXRpb24gcmFuZ2VzIGFyZSBvdmVyCisgICAgICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfZGVzdGluYXRpb25faXNfb3Zlcik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gaW50byBpcyBjb250aWd1b3VzLgorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvZmZzZXRfZHN0ID0gbV92YXJzW2ldLmRpc3A7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxlbmd0aF9kc3RfY3VyID0gbGVuZ3RoX2RzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHNhbWUgYXMgc291cmNlCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBvZmZzZXRfZHN0ID0gb2Zmc2V0X3NyYzsKKyAgICAgICAgICAgICAgICBsZW5ndGhfZHN0X2N1ciA9IGxlbmd0aF9zcmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBpZiBkZXN0aW5hdGlvbiBpcyBjb250aWd1b3VzIG9yIGl0cyBjb250aWd1b3VzIHJhbmdlIGlzIGdyZWF0ZXIKKyAgICAgICAgICAgIC8vIHRoYW4gc291cmNlIG9uZQorICAgICAgICAgICAgb2Zmc2V0X2RzdCArPSBzZW5kX3NpemU7CisgICAgICAgIH0KKyAgICAgICAgbGVuZ3RoX2RzdF9jdXIgLT0gc2VuZF9zaXplOworICAgICAgICBkc3RfaXNfZW1wdHkgPSBsZW5ndGhfZHN0X2N1ciA9PSAwOworCisgICAgICAgIGlmIChzcmNfZGF0YSAhPSAwICYmIHNyY19kYXRhLT5jcHVfYnVmICE9IDApIHsKKyAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyQ29weSgKKyAgICAgICAgICAgICAgICBkc3RfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICBzcmNfZGF0YS0+Y3B1X2J1ZiwKKyAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCAtIGRzdF9kYXRhLT5hbGxvY19kaXNwICsKKyAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ICsgb2Zmc2V0X2RzdCwKKyAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X29mZnNldCArIG9mZnNldF9zcmMsCisgICAgICAgICAgICAgICAgc2VuZF9zaXplLAorICAgICAgICAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9jb3B5LCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY2hhciAqYmFzZSA9IG9mZmxvYWRfZ2V0X3NyY19iYXNlKG1fdmFyc1tpXS5wdHIsCisgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuc3JjKTsKKworICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJXcml0ZSgKKyAgICAgICAgICAgICAgICBkc3RfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCAtIGRzdF9kYXRhLT5hbGxvY19kaXNwICsKKyAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ICsgb2Zmc2V0X2RzdCwKKyAgICAgICAgICAgICAgICBiYXNlICsgb2Zmc2V0X3NyYywKKyAgICAgICAgICAgICAgICBzZW5kX3NpemUsCisgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX3dyaXRlLCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRhdGFfc2VudCArPSBsZW5ndGhfc3JjOworICAgIH0KKyAgICB3aGlsZSAodHJ1ZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6OnNlbmRfcG9pbnRlcl9kYXRhKGJvb2wgaXNfYXN5bmMpCit7CisgICAgT2ZmbG9hZFRpbWVyIHRpbWVyKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X3NlbmRfcG9pbnRlcnMpOworCisgICAgdWludDY0X3QgcHRyX3NlbnQgPSAwOworICAgIENPSVJFU1VMVCByZXM7CisKKyAgICAvLyBJbml0aWF0ZSBzZW5kIGZvciBwb2ludGVyIGRhdGEKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fdmFyc190b3RhbDsgaSsrKSB7CisgICAgICAgIHN3aXRjaCAobV92YXJzW2ldLnR5cGUuZHN0KSB7CisgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHJfYXJyYXk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGNfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY192b2lkX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19jZWFuX3ZhcjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbiAmJgorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljX2RzdG4pIHsKKyAgICAgICAgICAgICAgICAgICAgQ09JRVZFTlQgKmV2ZW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChpc19hc3luYyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplID49IF9fb2ZmbG9hZF91c2VfYXN5bmNfYnVmZmVyX3dyaXRlKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAmbV9pbl9kZXBzW21faW5fZGVwc190b3RhbCsrXSA6IDA7CisgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEqIGRzdF9kYXRhID0gbV92YXJzW2ldLmludG8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uZHN0X2RhdGEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGE7CisgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEqIHNyY19kYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFZBUl9UWVBFX0lTX1BUUihtX3ZhcnNbaV0udHlwZS5zcmMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBWQVJfVFlQRV9JU19TQ0FMQVIobV92YXJzW2ldLnR5cGUuc3JjKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYyA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEgOiAwOworCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9zcmMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X2RzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZW5kX25vbmNvbnRpZ3VvdXNfcG9pbnRlcl9kYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBzcmNfZGF0YSwgZHN0X2RhdGEsIGV2ZW50KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzcmNfZGF0YSAhPSAwICYmIHNyY19kYXRhLT5jcHVfYnVmICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyQ29weSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfZGF0YS0+Y3B1X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCAtIGRzdF9kYXRhLT5hbGxvY19kaXNwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ICsgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfY29weSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJhc2UgPSBvZmZsb2FkX2dldF9zcmNfYmFzZShtX3ZhcnNbaV0ucHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLnNyYyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlcldyaXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0IC0gZHN0X2RhdGEtPmFsbG9jX2Rpc3AgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlICsgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl93cml0ZSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdHJfc2VudCArPSBtX3ZhcnNbaV0uc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19zdHJpbmdfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHI6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uaW4gJiYgbV92YXJzW2ldLnNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIENPSUVWRU5UICpldmVudCA9CisgICAgICAgICAgICAgICAgICAgICAgICAoaXNfYXN5bmMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSA+PSBfX29mZmxvYWRfdXNlX2FzeW5jX2J1ZmZlcl93cml0ZSkgPworICAgICAgICAgICAgICAgICAgICAgICAgJm1faW5fZGVwc1ttX2luX2RlcHNfdG90YWwrK10gOiAwOworICAgICAgICAgICAgICAgICAgICBQdHJEYXRhKiBkc3RfZGF0YSA9IG1fdmFyc1tpXS5pbnRvID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhOworICAgICAgICAgICAgICAgICAgICBQdHJEYXRhKiBzcmNfZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICBWQVJfVFlQRV9JU19QVFIobV92YXJzW2ldLnR5cGUuc3JjKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgVkFSX1RZUEVfSVNfU0NBTEFSKG1fdmFyc1tpXS50eXBlLnNyYykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWMgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YSA6IDA7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X3NyYyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfZHN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX25vbmNvbnRpZ3VvdXNfcG9pbnRlcl9kYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHNyY19kYXRhLCBkc3RfZGF0YSwgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNyY19kYXRhICE9IDAgJiYgc3JjX2RhdGEtPmNwdV9idWYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJDb3B5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19kYXRhLT5jcHVfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0IC0gZHN0X2RhdGEtPmFsbG9jX2Rpc3AgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X29mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9jb3B5LCByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYmFzZSA9IG9mZmxvYWRfZ2V0X3NyY19iYXNlKG1fdmFyc1tpXS5wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuc3JjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyV3JpdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgLSBkc3RfZGF0YS0+YWxsb2NfZGlzcCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCArIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgKyBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX3dyaXRlLCByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcHRyX3NlbnQgKz0gbV92YXJzW2ldLnNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfZHZfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHJfZGF0YToKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbiAmJgorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSAqcHRyX2RhdGEgPSBtX3ZhcnNbaV0uaW50byA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGE7CisgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEqIHNyY19kYXRhID0gbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhOworCisgICAgICAgICAgICAgICAgICAgIENPSUVWRU5UICpldmVudCA9CisgICAgICAgICAgICAgICAgICAgICAgICAoaXNfYXN5bmMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSA+PSBfX29mZmxvYWRfdXNlX2FzeW5jX2J1ZmZlcl93cml0ZSkgPworICAgICAgICAgICAgICAgICAgICAgICAgJm1faW5fZGVwc1ttX2luX2RlcHNfdG90YWwrK10gOiAwOworCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9zcmMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X2RzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VuZF9ub25jb250aWd1b3VzX3BvaW50ZXJfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBzcmNfZGF0YSwgcHRyX2RhdGEsIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzcmNfZGF0YSAmJiBzcmNfZGF0YS0+Y3B1X2J1ZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlckNvcHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2RhdGEtPmNwdV9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCArIHB0cl9kYXRhLT5taWNfb2Zmc2V0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+YWxsb2NfZGlzcCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfY29weSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJhc2UgPSBvZmZsb2FkX2dldF9zcmNfYmFzZShtX3ZhcnNbaV0ucHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLnNyYyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlcldyaXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5taWNfb2Zmc2V0IC0gcHRyX2RhdGEtPmFsbG9jX2Rpc3AgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlICsgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl93cml0ZSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdHJfc2VudCArPSBtX3ZhcnNbaV0uc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhX3NsaWNlOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhX3NsaWNlOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmluICYmCisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplID4gMCkgeworICAgICAgICAgICAgICAgICAgICBQdHJEYXRhICpkc3RfZGF0YSA9IG1fdmFyc1tpXS5pbnRvID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uZHN0X2RhdGEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSogc3JjX2RhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgKFZBUl9UWVBFX0lTX1BUUihtX3ZhcnNbaV0udHlwZS5zcmMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBWQVJfVFlQRV9JU19EVl9EQVRBKG1fdmFyc1tpXS50eXBlLnNyYykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZBUl9UWVBFX0lTX0RWX0RBVEFfU0xJQ0UobV92YXJzW2ldLnR5cGUuc3JjKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgVkFSX1RZUEVfSVNfU0NBTEFSKG1fdmFyc1tpXS50eXBlLnNyYykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWMpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEgOiAwOworICAgICAgICAgICAgICAgICAgICBDT0lFVkVOVCAqZXZlbnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgKGlzX2FzeW5jIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgPj0gX19vZmZsb2FkX3VzZV9hc3luY19idWZmZXJfd3JpdGUpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICZtX2luX2RlcHNbbV9pbl9kZXBzX3RvdGFsKytdIDogMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X3NyYyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfZHN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX25vbmNvbnRpZ3VvdXNfcG9pbnRlcl9kYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHNyY19kYXRhLCBkc3RfZGF0YSwgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNyY19kYXRhICYmIHNyY19kYXRhLT5jcHVfYnVmICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyQ29weSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfZGF0YS0+Y3B1X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0IC0gZHN0X2RhdGEtPmFsbG9jX2Rpc3AgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9kYXRhLT5taWNfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X29mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9jb3B5LCByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYmFzZSA9IG9mZmxvYWRfZ2V0X3NyY19iYXNlKG1fdmFyc1tpXS5wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuc3JjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyV3JpdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2RhdGEtPm1pY19vZmZzZXQgLSBkc3RfZGF0YS0+YWxsb2NfZGlzcCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCArIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgKyBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX3dyaXRlLCByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcHRyX3NlbnQgKz0gbV92YXJzW2ldLnNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gYWxsb2MgZmllbGQgaXNuJ3QgdXNlZCBhdCB0YXJnZXQuCisgICAgICAgIC8vIFdlIGNhbiByZXVzZSBpdCBmb3Igb2Zmc2V0IG9mIGFycmF5IHBvaW50ZXJzLgorICAgICAgICBpZiAobV92YXJzX2V4dHJhW2ldLmlzX2Fycl9wdHJfZWwpIHsKKyAgICAgICAgICAgIG1fdmFyc1tpXS5wdHJfYXJyX29mZnNldCA9IG1fdmFyc19leHRyYVtpXS5wdHJfYXJyX29mZnNldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtX3N0YXR1cykgeworICAgICAgICBtX3N0YXR1cy0+ZGF0YV9zZW50ICs9IHB0cl9zZW50OworICAgIH0KKworICAgIE9GRkxPQURfVElNRVJfSE9TVF9TREFUQShnZXRfdGltZXJfZGF0YSgpLCBwdHJfc2VudCk7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDEsIEdFVF9PRkZMT0FEX05VTUJFUihnZXRfdGltZXJfZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF9zZW50X3BvaW50ZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICJUb3RhbCBwb2ludGVyIGRhdGEgc2VudCB0byB0YXJnZXQ6IFslbGxkXSBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgIHB0cl9zZW50KTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjpnYXRoZXJfY29weWluX2RhdGEoKQoreworICAgIE9mZmxvYWRUaW1lciB0aW1lcihnZXRfdGltZXJfZGF0YSgpLCBjX29mZmxvYWRfaG9zdF9nYXRoZXJfaW5wdXRzKTsKKworICAgIGlmIChtX25lZWRfcnVuZnVuY3Rpb24gJiYgbV9pbl9kYXRhbGVuID4gMCkgeworICAgICAgICBDT0lNQVBJTlNUQU5DRSBtYXBfaW5zdDsKKyAgICAgICAgY2hhciAqZGF0YTsKKworICAgICAgICAvLyBpbml0IG1hcnNoYWxsZXIKKyAgICAgICAgaWYgKG1faW5vdXRfYnVmICE9IDApIHsKKyAgICAgICAgICAgIE9mZmxvYWRUaW1lciB0aW1lcl9tYXAoZ2V0X3RpbWVyX2RhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX2hvc3RfbWFwX2luX2RhdGFfYnVmZmVyKTsKKworICAgICAgICAgICAgQ09JUkVTVUxUIHJlcyA9IENPSTo6QnVmZmVyTWFwKG1faW5vdXRfYnVmLCAwLCBtX2luX2RhdGFsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX01BUF9XUklURV9FTlRJUkVfQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsICZtYXBfaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqKj4oJmRhdGEpKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfbWFwLCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZGF0YSA9IChjaGFyKikgbV9mdW5jX2Rlc2MgKyBtX2Z1bmNfZGVzYy0+ZGF0YV9vZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBzZW5kIHZhcmlhYmxlIGRlc2NyaXB0b3JzCisgICAgICAgIG1lbWNweShkYXRhLCBtX3ZhcnMsIG1fdmFyc190b3RhbCAqIHNpemVvZihWYXJEZXNjKSk7CisgICAgICAgIGRhdGEgKz0gbV92YXJzX3RvdGFsICogc2l6ZW9mKFZhckRlc2MpOworCisgICAgICAgIC8vIGluaXQgbWFyc2hhbGxlcgorICAgICAgICBtX2luLmluaXRfYnVmZmVyKGRhdGEsIG1faW5fZGF0YWxlbik7CisKKyAgICAgICAgLy8gR2F0aGVyIGNvcHkgZGF0YSBpbnRvIGJ1ZmZlcgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fdmFyc190b3RhbDsgaSsrKSB7CisgICAgICAgICAgICBib29sIHNyY19pc19mb3JfbWljID0gKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5pbnRvID09IE5VTEwpOworICAgICAgICAgICAgUHRyRGF0YSogcHRyX2RhdGEgPSBzcmNfaXNfZm9yX21pYyA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5kc3RfZGF0YTsKKyAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuYWxsb2NfZGlzcCkgeworICAgICAgICAgICAgICAgIG1faW4uc2VuZF9kYXRhKCZwdHJfZGF0YS0+YWxsb2NfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocHRyX2RhdGEtPmFsbG9jX2Rpc3ApKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc2VuZCBzaW5rIGFkZHJlc3MgdG8gdGhlIHRhcmdldAorICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIpIHsKKyAgICAgICAgICAgICAgICBtX2luLnNlbmRfZGF0YSgmcHRyX2RhdGEtPm1pY19hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwdHJfZGF0YS0+bWljX2FkZHIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChtX3ZhcnNbaV0udHlwZS5kc3QpIHsKKyAgICAgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHJfYXJyYXk6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgY19kYXRhOgorICAgICAgICAgICAgICAgIGNhc2UgY192b2lkX3B0cjoKKyAgICAgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXI6CisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmluICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpY19kc3RuKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnB0ciA9IG9mZmxvYWRfZ2V0X3NyY19iYXNlKG1fdmFyc1tpXS5wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5zcmMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS50eXBlLmRzdCA9PSBjX2NlYW5fdmFyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IGFuZCBsZW5ndGggYXJlIGRlcml2ZWQgZnJvbSB0aGUgYXJyYXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzaXplID0gbV92YXJzW2ldLnNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkaXNwID0gbV92YXJzW2ldLmRpc3A7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbi5zZW5kX2RhdGEocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJnNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQ2NF90KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbi5zZW5kX2RhdGEocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmRpc3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQ2NF90KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1faW4uc2VuZF9kYXRhKHB0ciArIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgY19kdjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCBkb3BlIHZlY3RvciBleGNsdWRpbmcgYmFzZQorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcHRyID0gc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5wdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgbV9pbi5zZW5kX2RhdGEocHRyICsgc2l6ZW9mKHVpbnQ2NF90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplIC0gc2l6ZW9mKHVpbnQ2NF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHI6CisgICAgICAgICAgICAgICAgICAgIC8vIHNlbmQgdG8gdGFyZ2V0IGFkZHJlc3NlcyBvZiBvYnNvbGV0ZQorICAgICAgICAgICAgICAgICAgICAvLyBzdGFja3MgdG8gYmUgcmVsZWFzZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19zdGFja19idWYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICFtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5hbGxvY19pZiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChQdHJEYXRhTGlzdDo6aXRlcmF0b3IgaXQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZGVzdHJveV9zdGFjay5iZWdpbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IG1fZGVzdHJveV9zdGFjay5lbmQoKTsgaXQrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEgKiBwdHJfZGF0YSA9ICppdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luLnNlbmRfZGF0YSgmKHB0cl9kYXRhLT5taWNfYWRkciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwdHJfZGF0YS0+bWljX2FkZHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGNfZnVuY19wdHI6CisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmluKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2luLnNlbmRfZnVuY19wdHIoKigoY29uc3Qgdm9pZCoqKSBtX3ZhcnNbaV0ucHRyKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtX3N0YXR1cykgeworICAgICAgICAgICAgbV9zdGF0dXMtPmRhdGFfc2VudCArPSBtX2luLmdldF90ZnJfc2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1fZnVuY19kZXNjLT5kYXRhX29mZnNldCA9PSAwKSB7CisgICAgICAgICAgICBPZmZsb2FkVGltZXIgdGltZXJfdW5tYXAoZ2V0X3RpbWVyX2RhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfaG9zdF91bm1hcF9pbl9kYXRhX2J1ZmZlcik7CisgICAgICAgICAgICBDT0lSRVNVTFQgcmVzID0gQ09JOjpCdWZmZXJVbm1hcChtYXBfaW5zdCwgMCwgMCwgMCk7CisgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX3VubWFwLCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgT0ZGTE9BRF9USU1FUl9IT1NUX1NEQVRBKGdldF90aW1lcl9kYXRhKCksIG1faW4uZ2V0X3Rmcl9zaXplKCkpOworICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSgxLAorICAgICAgICAgICAgICAgICAgR0VUX09GRkxPQURfTlVNQkVSKGdldF90aW1lcl9kYXRhKCkpLCBjX29mZmxvYWRfY29weWluX2RhdGEsCisgICAgICAgICAgICAgICAgICAiVG90YWwgY29weWluIGRhdGEgc2VudCB0byB0YXJnZXQ6IFslbGxkXSBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgIG1faW4uZ2V0X3Rmcl9zaXplKCkpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6OmNvbXB1dGUoKQoreworICAgIE9mZmxvYWRUaW1lciB0aW1lcihnZXRfdGltZXJfZGF0YSgpLCBjX29mZmxvYWRfaG9zdF9zdGFydF9jb21wdXRlKTsKKworICAgIGlmIChtX25lZWRfcnVuZnVuY3Rpb24pIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDIsIEdFVF9PRkZMT0FEX05VTUJFUihnZXRfdGltZXJfZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF9jb21wdXRlLCAiQ29tcHV0ZSB0YXNrIG9uIE1JQ1xuIik7CisKKyAgICAgICAgdm9pZCogbWlzYyA9IG1fZnVuY19kZXNjOworICAgICAgICBpbnQgICBtaXNjX2xlbiA9IG1fZnVuY19kZXNjX3NpemU7CisgICAgICAgIHZvaWQqIHJldCA9IDA7CisgICAgICAgIGludCAgIHJldF9sZW4gPSAwOworCisgICAgICAgIGlmIChtX2Z1bmNfZGVzYy0+ZGF0YV9vZmZzZXQgIT0gMCkgeworICAgICAgICAgICAgbWlzY19sZW4gKz0gbV9pbl9kYXRhbGVuOworCisgICAgICAgICAgICBpZiAobV9vdXRfZGF0YWxlbiA+IDApIHsKKyAgICAgICAgICAgICAgICByZXQgPSAoY2hhciopIG1fZnVuY19kZXNjICsgbV9mdW5jX2Rlc2MtPmRhdGFfb2Zmc2V0OworICAgICAgICAgICAgICAgIHJldF9sZW4gPSBtX291dF9kYXRhbGVuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gZGlzcGF0Y2ggdGFzaworICAgICAgICBDT0lSRVNVTFQgcmVzOworICAgICAgICBDT0lFVkVOVCBldmVudDsKKyAgICAgICAgcmVzID0gbV9kZXZpY2UuY29tcHV0ZShtX2NvbXB1dGVfYnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNjLCBtaXNjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQsIHJldF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kZXBzX3RvdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCA+IDAgPyBtX2luX2RlcHMgOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZldmVudCk7CisgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfcGlwZWxpbmVfcnVuX2Z1bmMsIHJlcyk7CisgICAgICAgIH0KKworICAgICAgICBtX2luX2RlcHNfdG90YWwgPSAxOworICAgICAgICBtX2luX2RlcHNbMF0gPSBldmVudDsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gcmVjZWl2ZSBwb2ludGVyIGRhdGEgaWYgc291cmNlIG9yIGRlc3RpbmF0aW9uIG9yIGJvdGggb2YgdGhlbSBhcmUKKy8vIG5vbmNvbnRpZ3VvdXMuIFRoZXJlIGlzIGd1YXJhbnRlZSB0aGF0IGxlbmd0aCBvZiBkZXN0aW5hdGlvbiBlbm91Z2ggZm9yCisvLyB0cmFuc2ZlcnJlZCBkYXRhLgorYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6cmVjZWl2ZV9ub25jb250aWd1b3VzX3BvaW50ZXJfZGF0YSgKKyAgICBpbnQgaSwKKyAgICBjaGFyKiBiYXNlLAorICAgIENPSUJVRkZFUiBkc3RfYnVmLAorICAgIENPSUVWRU5UICpldmVudAorKQoreworICAgIGludDY0X3Qgb2Zmc2V0X3NyYywgb2Zmc2V0X2RzdDsKKyAgICBpbnQ2NF90IGxlbmd0aF9zcmMsIGxlbmd0aF9kc3Q7CisgICAgaW50NjRfdCBsZW5ndGhfc3JjX2N1ciwgbGVuZ3RoX2RzdF9jdXI7CisgICAgaW50NjRfdCByZWNlaXZlX3NpemUsIGRhdGFfcmVjZWl2ZWQgPSAwOworICAgIENPSVJFU1VMVCByZXM7CisgICAgYm9vbCBkc3RfaXNfZW1wdHkgPSB0cnVlOworICAgIGJvb2wgc3JjX2lzX2VtcHR5ID0gdHJ1ZTsKKworICAgIC8vIFNldCBsZW5ndGhfc3JjIGFuZCBsZW5ndGhfZHN0CisgICAgbGVuZ3RoX3NyYyA9IChtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjKSA/CisgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMtPnJhbmdlX3NpemUgOiBtX3ZhcnNbaV0uc2l6ZTsKKyAgICBsZW5ndGhfZHN0ID0gIW1fdmFyc1tpXS5pbnRvID8gbGVuZ3RoX3NyYyA6CisgICAgICAgICAgICAgICAgICAgICAobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCkgPworICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdC0+cmFuZ2Vfc2l6ZSA6IG1fdmFyc1tpXS5zaXplOworICAgIHJlY2VpdmVfc2l6ZSA9IChsZW5ndGhfc3JjIDwgbGVuZ3RoX2RzdCkgPyBsZW5ndGhfc3JjIDogbGVuZ3RoX2RzdDsKKworICAgIC8vIGNvbnNlcXVlbnRseSBnZXQgY29udGlndW91cyByYW5nZXMsCisgICAgLy8gZGVmaW5lIGNvcnJlc3BvbmRlZCBkZXN0aW5hdGlvbiBvZmZzZXQgYW5kIHJlY2VpdmUgZGF0YQorICAgIGRvIHsKKyAgICAgICAgLy8gZ2V0IHNvcmNlIG9mZnNldAorICAgICAgICBpZiAoc3JjX2lzX2VtcHR5KSB7CisgICAgICAgICAgICBpZiAobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYykgeworICAgICAgICAgICAgICAgIGlmICghZ2V0X25leHRfcmFuZ2UobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0X3NyYykpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc291cmNlIHJhbmdlcyBhcmUgb3ZlciAtIG5vdGhpbmcgdG8gc2VuZAorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChkYXRhX3JlY2VpdmVkID09IDApIHsKKyAgICAgICAgICAgICAgICBvZmZzZXRfc3JjID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGVuZ3RoX3NyY19jdXIgPSBsZW5ndGhfc3JjOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gaWYgc291cmNlIGlzIGNvbnRpZ3VvdXMgb3IgaXRzIGNvbnRpZ3VvdXMgcmFuZ2UgaXMgZ3JlYXRlcgorICAgICAgICAgICAgLy8gdGhhbiBkZXN0aW5hdGlvbiBvbmUKKyAgICAgICAgICAgIG9mZnNldF9zcmMgKz0gcmVjZWl2ZV9zaXplOworICAgICAgICB9CisgICAgICAgIGxlbmd0aF9zcmNfY3VyIC09IHJlY2VpdmVfc2l6ZTsKKyAgICAgICAgc3JjX2lzX2VtcHR5ID0gbGVuZ3RoX3NyY19jdXIgPT0gMDsKKworICAgICAgICAvLyBnZXQgZGVzdGluYXRpb24gb2Zmc2V0CisgICAgICAgIGlmIChkc3RfaXNfZW1wdHkpIHsKKyAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uaW50bykgeworICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghZ2V0X25leHRfcmFuZ2UobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldF9kc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXN0aW5hdGlvbiByYW5nZXMgYXJlIG92ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19kZXN0aW5hdGlvbl9pc19vdmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBkZXN0aW5hdGlvbiBpcyBjb250aWd1b3VzLgorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvZmZzZXRfZHN0ID0gbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsZW5ndGhfZHN0X2N1ciA9IGxlbmd0aF9kc3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBzYW1lIGFzIHNvdXJjZQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgb2Zmc2V0X2RzdCA9IG9mZnNldF9zcmM7CisgICAgICAgICAgICAgICAgbGVuZ3RoX2RzdF9jdXIgPSBsZW5ndGhfc3JjOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gaWYgZGVzdGluYXRpb24gaXMgY29udGlndW91cyBvciBpdHMgY29udGlndW91cyByYW5nZSBpcyBncmVhdGVyCisgICAgICAgICAgICAvLyB0aGFuIHNvdXJjZSBvbmUKKyAgICAgICAgICAgIG9mZnNldF9kc3QgKz0gcmVjZWl2ZV9zaXplOworICAgICAgICB9CisgICAgICAgIGxlbmd0aF9kc3RfY3VyIC09IHJlY2VpdmVfc2l6ZTsKKyAgICAgICAgZHN0X2lzX2VtcHR5ID0gbGVuZ3RoX2RzdF9jdXIgPT0gMDsKKworICAgICAgICBpZiAoZHN0X2J1ZiAhPSAwKSB7CisgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlckNvcHkoCisgICAgICAgICAgICAgICAgZHN0X2J1ZiwKKyAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9vZmZzZXQgKyBvZmZzZXRfZHN0LAorICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBvZmZzZXRfc3JjICsKKyAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCAtCisgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhLT5hbGxvY19kaXNwLAorICAgICAgICAgICAgICAgIHJlY2VpdmVfc2l6ZSwKKyAgICAgICAgICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwsCisgICAgICAgICAgICAgICAgbV9pbl9kZXBzX3RvdGFsID4gMCA/IG1faW5fZGVwcyA6IDAsCisgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9jb3B5LCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJSZWFkKAorICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ICsgb2Zmc2V0X3NyYyArCisgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgLQorICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YS0+YWxsb2NfZGlzcCwKKyAgICAgICAgICAgICAgICBiYXNlICsgb2Zmc2V0X2RzdCwKKyAgICAgICAgICAgICAgICByZWNlaXZlX3NpemUsCisgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgbV9pbl9kZXBzX3RvdGFsLAorICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCA+IDAgPyBtX2luX2RlcHMgOiAwLAorICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfcmVhZCwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkYXRhX3JlY2VpdmVkICs9IHJlY2VpdmVfc2l6ZTsKKyAgICB9CisgICAgd2hpbGUgKHRydWUpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjpyZWNlaXZlX3BvaW50ZXJfZGF0YShib29sIGlzX2FzeW5jKQoreworICAgIE9mZmxvYWRUaW1lciB0aW1lcihnZXRfdGltZXJfZGF0YSgpLCBjX29mZmxvYWRfaG9zdF9zdGFydF9idWZmZXJzX3JlYWRzKTsKKworICAgIHVpbnQ2NF90IHB0cl9yZWNlaXZlZCA9IDA7CisgICAgQ09JUkVTVUxUIHJlczsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV92YXJzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgc3dpdGNoIChtX3ZhcnNbaV0udHlwZS5zcmMpIHsKKyAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cl9hcnJheToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgY19kYXRhOgorICAgICAgICAgICAgY2FzZSBjX3ZvaWRfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLm91dCAmJgorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljKSB7CisgICAgICAgICAgICAgICAgICAgIENPSUVWRU5UICpldmVudCA9CisgICAgICAgICAgICAgICAgICAgICAgICAoaXNfYXN5bmMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwgPiAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgPj0gX19vZmZsb2FkX3VzZV9hc3luY19idWZmZXJfcmVhZCkgPworICAgICAgICAgICAgICAgICAgICAgICAgJm1fb3V0X2RlcHNbbV9vdXRfZGVwc190b3RhbCsrXSA6IDA7CisgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEgKnB0cl9kYXRhID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgQ09JQlVGRkVSIGRzdF9idWYgPSBOVUxMOyAvLyBidWZmZXIgYXQgaG9zdAorICAgICAgICAgICAgICAgICAgICBjaGFyICpiYXNlOworCisgICAgICAgICAgICAgICAgICAgIGlmIChWQVJfVFlQRV9JU19QVFIobV92YXJzW2ldLnR5cGUuZHN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEgPSBtX3ZhcnNbaV0uaW50byA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5kc3RfZGF0YSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChWQVJfVFlQRV9JU19TQ0FMQVIobV92YXJzW2ldLnR5cGUuZHN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWNfZHN0bikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhID0gbV92YXJzW2ldLmludG8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkc3RfYnVmID0gcHRyX2RhdGEgPyBwdHJfZGF0YS0+Y3B1X2J1ZiA6IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGlmIChkc3RfYnVmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgPSBvZmZsb2FkX2dldF9zcmNfYmFzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uaW50byA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5pbnRvKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5wdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLmRzdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfc3JjIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9kc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVfbm9uY29udGlndW91c19wb2ludGVyX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgYmFzZSwgZHN0X2J1ZiwgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRzdF9idWYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJDb3B5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCArIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwgPiAwID8gbV9pbl9kZXBzIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2NvcHksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyUmVhZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCArIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgKyBtX3ZhcnNfZXh0cmFbaV0uY3B1X29mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwgPiAwID8gbV9pbl9kZXBzIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX3JlYWQsIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHRyX3JlY2VpdmVkICs9IG1fdmFyc1tpXS5zaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX3N0cmluZ19wdHI6CisgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHI6CisgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXJfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfZHZfZGF0YV9zbGljZToKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHJfZGF0YV9zbGljZToKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHI6IHsKKyAgICAgICAgICAgICAgICBDT0lCVUZGRVIgZHN0X2J1ZiA9IE5VTEw7IC8vIGJ1ZmZlciBvbiBob3N0CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0ICYmIG1fdmFyc1tpXS5zaXplID4gMCkgeworICAgICAgICAgICAgICAgICAgICBDT0lFVkVOVCAqZXZlbnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgKGlzX2FzeW5jIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kZXBzX3RvdGFsID4gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplID49IF9fb2ZmbG9hZF91c2VfYXN5bmNfYnVmZmVyX3JlYWQpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICZtX291dF9kZXBzW21fb3V0X2RlcHNfdG90YWwrK10gOiAwOworCisgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGRzdF9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICBjaGFyICpiYXNlID0gc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5wdHIpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChWQVJfVFlQRV9JU19QVFIobV92YXJzW2ldLnR5cGUuZHN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSAqcHRyX2RhdGEgPSBtX3ZhcnNbaV0uaW50byA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5kc3RfZGF0YSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9idWYgPSBwdHJfZGF0YSA/IHB0cl9kYXRhLT5jcHVfYnVmIDogTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkc3RfYnVmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlID0gbV92YXJzW2ldLmludG8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RhdGljX2Nhc3Q8Y2hhcioqPihtX3ZhcnNbaV0uaW50bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RhdGljX2Nhc3Q8Y2hhcioqPihtX3ZhcnNbaV0ucHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9vZmZzZXQgPSBtX3ZhcnNfZXh0cmFbaV0uY3B1X29mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKFZBUl9UWVBFX0lTX1NDQUxBUihtX3ZhcnNbaV0udHlwZS5kc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpY19kc3RuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2J1ZiA9IG1fdmFyc1tpXS5pbnRvID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uZHN0X2RhdGEtPmNwdV9idWYgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YS0+Y3B1X2J1ZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkc3RfYnVmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlID0gb2ZmbG9hZF9nZXRfc3JjX2Jhc2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5pbnRvID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5pbnRvKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0ucHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuZHN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9vZmZzZXQgPSBtX3ZhcnNfZXh0cmFbaV0uY3B1X29mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKFZBUl9UWVBFX0lTX0RWX0RBVEEobV92YXJzW2ldLnR5cGUuZHN0KSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJfVFlQRV9JU19EVl9EQVRBX1NMSUNFKG1fdmFyc1tpXS50eXBlLmRzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEgKnB0cl9kYXRhID0gbV92YXJzW2ldLmludG8gIT0gMCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5kc3RfZGF0YSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9idWYgPSBwdHJfZGF0YSAhPSAwID8gcHRyX2RhdGEtPmNwdV9idWYgOiAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRzdF9idWYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgPSBvZmZsb2FkX2dldF9zcmNfYmFzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmludG8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLmludG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5wdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5kc3QpOworCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBkc3Rfb2Zmc2V0ID0gbV92YXJzX2V4dHJhW2ldLmNwdV9vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9zcmMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X2RzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9ub25jb250aWd1b3VzX3BvaW50ZXJfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBiYXNlLCBkc3RfYnVmLCBldmVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZHN0X2J1ZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlckNvcHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ICsgbV92YXJzW2ldLmRpc3AgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YS0+YWxsb2NfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kZXBzX3RvdGFsID4gMCA/IG1faW5fZGVwcyA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9jb3B5LCByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJSZWFkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ICsgbV92YXJzW2ldLmRpc3AgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YS0+YWxsb2NfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlICsgZHN0X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kZXBzX3RvdGFsID4gMCA/IG1faW5fZGVwcyA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9yZWFkLCByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB0cl9yZWNlaXZlZCArPSBtX3ZhcnNbaV0uc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBkZXN0cm95IGJ1ZmZlcnMgZm9yIG9ic29sZXRlIHN0YWNrcworICAgICAgICBpZiAobV9kZXN0cm95X3N0YWNrLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICBmb3IgKFB0ckRhdGFMaXN0OjppdGVyYXRvciBpdCA9IG1fZGVzdHJveV9zdGFjay5iZWdpbigpOworICAgICAgICAgICAgICAgIGl0ICE9IG1fZGVzdHJveV9zdGFjay5lbmQoKTsgaXQrKykgeworICAgICAgICAgICAgICAgIFB0ckRhdGEgKnB0cl9kYXRhID0gKml0OworICAgICAgICAgICAgICAgIG1fZGVzdHJveV9idWZmZXJzLnB1c2hfYmFjayhwdHJfZGF0YS0+bWljX2J1Zik7CisgICAgICAgICAgICAgICAgT0ZGTE9BRF9UUkFDRSgzLCAiUmVtb3Zpbmcgc3RhY2sgYnVmZmVyIHdpdGggYWRkciAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+bWljX2FkZHIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9kZXN0cm95X3N0YWNrLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAvLyByZW1vdmUgYXNzb2NpYXRpb24gZm9yIGF1dG9tYXRpYyB2YXJpYWJsZXMKKyAgICAgICAgICAgIGlmIChtX2lzX29wZW5tcCAmJiAhbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYyAmJgorICAgICAgICAgICAgICAgIChtX3ZhcnNbaV0udHlwZS5zcmMgPT0gY19kYXRhIHx8CisgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLnNyYyA9PSBjX3ZvaWRfcHRyIHx8CisgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLnNyYyA9PSBjX2NlYW5fdmFyKSkgeworICAgICAgICAgICAgICAgIEF1dG9EYXRhICphdXRvX2RhdGEgPSBtX3ZhcnNfZXh0cmFbaV0uYXV0b19kYXRhOworICAgICAgICAgICAgICAgIGlmIChhdXRvX2RhdGEgIT0gMCAmJiBhdXRvX2RhdGEtPnJlbW92ZV9yZWZlcmVuY2UoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1fZGV2aWNlLnJlbW92ZV9hdXRvX2RhdGEoYXV0b19kYXRhLT5jcHVfYWRkci5zdGFydCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGRlc3Ryb3kgYnVmZmVycworICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0IHx8IG1fdmFyc1tpXS5pbnRvID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoIVZBUl9UWVBFX0lTX1BUUihtX3ZhcnNbaV0udHlwZS5zcmMpICYmCisgICAgICAgICAgICAgICAgICAgICFWQVJfVFlQRV9JU19EVl9EQVRBX1NMSUNFKG1fdmFyc1tpXS50eXBlLnNyYykgJiYKKyAgICAgICAgICAgICAgICAgICAgIVZBUl9UWVBFX0lTX0RWX0RBVEEobV92YXJzW2ldLnR5cGUuc3JjKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBQdHJEYXRhICpwdHJfZGF0YSA9IG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YTsKKyAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEtPnJlbW92ZV9yZWZlcmVuY2UoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGRlc3Ryb3kgYnVmZmVycworICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEtPmNwdV9idWYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9kZXN0cm95X2J1ZmZlcnMucHVzaF9iYWNrKHB0cl9kYXRhLT5jcHVfYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEtPm1pY19idWYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9kZXN0cm95X2J1ZmZlcnMucHVzaF9iYWNrKHB0cl9kYXRhLT5taWNfYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDMsICJSZW1vdmluZyBhc3NvY2lhdGlvbiBmb3IgYWRkciAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGFzc29jaWF0aW9uIGZyb20gbWFwCisgICAgICAgICAgICAgICAgICAgIG1fZGV2aWNlLnJlbW92ZV9wdHJfZGF0YShwdHJfZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoVkFSX1RZUEVfSVNfUFRSKG1fdmFyc1tpXS50eXBlLmRzdCkgfHwKKyAgICAgICAgICAgICAgICAgICAgIFZBUl9UWVBFX0lTX0RWX0RBVEFfU0xJQ0UobV92YXJzW2ldLnR5cGUuZHN0KSB8fAorICAgICAgICAgICAgICAgICAgICAgVkFSX1RZUEVfSVNfRFZfREFUQShtX3ZhcnNbaV0udHlwZS5kc3QpKSB7CisgICAgICAgICAgICAgICAgUHRyRGF0YSAqcHRyX2RhdGEgPSBtX3ZhcnNfZXh0cmFbaV0uZHN0X2RhdGE7CisgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhLT5yZW1vdmVfcmVmZXJlbmNlKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBkZXN0cm95IGJ1ZmZlcnMKKyAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhLT5jcHVfYnVmICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fZGVzdHJveV9idWZmZXJzLnB1c2hfYmFjayhwdHJfZGF0YS0+Y3B1X2J1Zik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhLT5taWNfYnVmICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fZGVzdHJveV9idWZmZXJzLnB1c2hfYmFjayhwdHJfZGF0YS0+bWljX2J1Zik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9UUkFDRSgzLCAiUmVtb3ZpbmcgYXNzb2NpYXRpb24gZm9yIGFkZHIgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBhc3NvY2lhdGlvbiBmcm9tIG1hcAorICAgICAgICAgICAgICAgICAgICBtX2RldmljZS5yZW1vdmVfcHRyX2RhdGEocHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtX3N0YXR1cykgeworICAgICAgICBtX3N0YXR1cy0+ZGF0YV9yZWNlaXZlZCArPSBwdHJfcmVjZWl2ZWQ7CisgICAgfQorCisgICAgT0ZGTE9BRF9USU1FUl9IT1NUX1JEQVRBKGdldF90aW1lcl9kYXRhKCksIHB0cl9yZWNlaXZlZCk7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDEsIEdFVF9PRkZMT0FEX05VTUJFUihnZXRfdGltZXJfZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF9yZWNlaXZlZF9wb2ludGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAiVG90YWwgcG9pbnRlciBkYXRhIHJlY2VpdmVkIGZyb20gdGFyZ2V0OiBbJWxsZF0gYnl0ZXNcbiIsCisgICAgICAgICAgICAgICAgICBwdHJfcmVjZWl2ZWQpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6OnNjYXR0ZXJfY29weW91dF9kYXRhKCkKK3sKKyAgICBPZmZsb2FkVGltZXIgdGltZXIoZ2V0X3RpbWVyX2RhdGEoKSwgY19vZmZsb2FkX2hvc3Rfc2NhdHRlcl9vdXRwdXRzKTsKKworICAgIGlmIChtX25lZWRfcnVuZnVuY3Rpb24gJiYgbV9vdXRfZGF0YWxlbiA+IDApIHsKKworICAgICAgICAvLyB0b3RhbCBzaXplIHRoYXQgbmVlZCB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIHRhcmdldCB0byBob3N0CisgICAgICAgIENPSU1BUElOU1RBTkNFIG1hcF9pbnN0OworICAgICAgICBDT0lSRVNVTFQgcmVzOworICAgICAgICBjaGFyICpkYXRhOworCisgICAgICAgIC8vIG91dHB1dCBkYXRhIGJ1ZmZlcgorICAgICAgICBpZiAobV9mdW5jX2Rlc2MtPmRhdGFfb2Zmc2V0ID09IDApIHsKKyAgICAgICAgICAgIE9mZmxvYWRUaW1lciB0aW1lcl9tYXAoZ2V0X3RpbWVyX2RhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX2hvc3RfbWFwX291dF9kYXRhX2J1ZmZlcik7CisKKyAgICAgICAgICAgIENPSVJFU1VMVCByZXMgPSBDT0k6OkJ1ZmZlck1hcChtX2lub3V0X2J1ZiwgMCwgbV9vdXRfZGF0YWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfTUFQX1JFQURfT05MWSwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFwX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCoqPigmZGF0YSkpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9tYXAsIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBkYXRhID0gKGNoYXIqKSBtX2Z1bmNfZGVzYyArIG1fZnVuY19kZXNjLT5kYXRhX29mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGdldCB0aW1pbmcgZGF0YQorICAgICAgICBPRkZMT0FEX1RJTUVSX1RBUkdFVF9EQVRBKGdldF90aW1lcl9kYXRhKCksIGRhdGEpOworICAgICAgICBkYXRhICs9IE9GRkxPQURfVElNRVJfREFUQUxFTigpOworCisgICAgICAgIC8vIGluaXRpYWxpemUgb3V0cHV0IG1hcnNoYWxsZXIKKyAgICAgICAgbV9vdXQuaW5pdF9idWZmZXIoZGF0YSwgbV9vdXRfZGF0YWxlbik7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3ZhcnNfdG90YWw7IGkrKykgeworICAgICAgICAgICAgc3dpdGNoIChtX3ZhcnNbaV0udHlwZS5zcmMpIHsKKyAgICAgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHJfYXJyYXk6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgY19kYXRhOgorICAgICAgICAgICAgICAgIGNhc2UgY192b2lkX3B0cjoKKyAgICAgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXI6CisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLm91dCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIW1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWMpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5pbnRvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcHRyID0gb2ZmbG9hZF9nZXRfc3JjX2Jhc2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0uaW50byksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLmRzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9vdXQucmVjZWl2ZV9kYXRhKHB0ciArIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9vdXQucmVjZWl2ZV9kYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLnB0cikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIGNfZnVuY19wdHI6CisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLm91dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9vdXQucmVjZWl2ZV9mdW5jX3B0cigoY29uc3Qgdm9pZCoqKSBtX3ZhcnNbaV0ucHRyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1fc3RhdHVzKSB7CisgICAgICAgICAgICBtX3N0YXR1cy0+ZGF0YV9yZWNlaXZlZCArPSBtX291dC5nZXRfdGZyX3NpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtX2Z1bmNfZGVzYy0+ZGF0YV9vZmZzZXQgPT0gMCkgeworICAgICAgICAgICAgT2ZmbG9hZFRpbWVyIHRpbWVyX3VubWFwKGdldF90aW1lcl9kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX2hvc3RfdW5tYXBfb3V0X2RhdGFfYnVmZmVyKTsKKworICAgICAgICAgICAgQ09JUkVTVUxUIHJlcyA9IENPSTo6QnVmZmVyVW5tYXAobWFwX2luc3QsIDAsIDAsIDApOworICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl91bm1hcCwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIE9GRkxPQURfVElNRVJfSE9TVF9SREFUQShnZXRfdGltZXJfZGF0YSgpLCBtX291dC5nZXRfdGZyX3NpemUoKSk7CisgICAgT0ZGTE9BRF9UUkFDRSgxLCAiVG90YWwgY29weW91dCBkYXRhIHJlY2VpdmVkIGZyb20gdGFyZ2V0OiBbJWxsZF0gYnl0ZXNcbiIsCisgICAgICAgICAgICAgICAgICBtX291dC5nZXRfdGZyX3NpemUoKSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBnZXRfYXJyX2Rlc2NfbnVtYmVycygKKyAgICBjb25zdCBhcnJfZGVzYyAqYXAsCisgICAgaW50NjRfdCBlbF9zaXplLAorICAgIGludDY0X3QgJm9mZnNldCwKKyAgICBpbnQ2NF90ICZzaXplLAorICAgIGludCAgICAgJmVsX251bWJlciwKKyAgICBDZWFuUmVhZFJhbmdlcyogJnB0cl9yYW5nZXMKKykKK3sKKyAgICBpZiAoaXNfYXJyX2Rlc2NfY29udGlndW91cyhhcCkpIHsKKyAgICAgICAgcHRyX3JhbmdlcyA9IE5VTEw7CisgICAgICAgIF9fYXJyX2RhdGFfb2Zmc2V0X2FuZF9sZW5ndGgoYXAsIG9mZnNldCwgc2l6ZSk7CisgICAgICAgIGVsX251bWJlciA9IHNpemUgLyBlbF9zaXplOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcHRyX3JhbmdlcyA9IGluaXRfcmVhZF9yYW5nZXNfYXJyX2Rlc2MoYXApOworICAgICAgICBlbF9udW1iZXIgPSAocHRyX3Jhbmdlcy0+cmFuZ2Vfc2l6ZSAvIGVsX3NpemUpICoKKyAgICAgICAgICAgICAgICAgICAgcHRyX3Jhbmdlcy0+cmFuZ2VfbWF4X251bWJlcjsKKyAgICAgICAgc2l6ZSA9IHB0cl9yYW5nZXMtPnJhbmdlX3NpemU7CisgICAgfQorfQorCithcnJfZGVzYyAqIG1ha2VfYXJyX2Rlc2MoCisgICAgdm9pZCogICBwdHJfdmFsLAorICAgIGludDY0X3QgZXh0ZW50X3N0YXJ0X3ZhbCwKKyAgICBpbnQ2NF90IGV4dGVudF9lbGVtZW50c192YWwsCisgICAgaW50NjRfdCBzaXplCispCit7CisgICAgYXJyX2Rlc2MgKnJlczsKKyAgICByZXMgPSAoYXJyX2Rlc2MgKiltYWxsb2Moc2l6ZW9mKGFycl9kZXNjKSk7CisgICAgcmVzLT5iYXNlID0gcmVpbnRlcnByZXRfY2FzdDxpbnQ2NF90PihwdHJfdmFsKTsKKyAgICByZXMtPnJhbmsgPSAxOworICAgIHJlcy0+ZGltWzBdLnNpemUgPSBzaXplOworICAgIHJlcy0+ZGltWzBdLmxpbmRleCA9IDA7CisgICAgcmVzLT5kaW1bMF0ubG93ZXIgPSBleHRlbnRfc3RhcnRfdmFsOworICAgIHJlcy0+ZGltWzBdLnVwcGVyID0gZXh0ZW50X2VsZW1lbnRzX3ZhbCArIGV4dGVudF9zdGFydF92YWwgLSAxOworICAgIHJlcy0+ZGltWzBdLnN0cmlkZSA9IDE7CisgICAgcmV0dXJuIHJlczsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6Z2VuX3Zhcl9kZXNjc19mb3JfcG9pbnRlcl9hcnJheShpbnQgaSkKK3sKKyAgICBpbnQgICAgICAgICAgICAgcG9pbnRlcnNfbnVtYmVyOworICAgIGludCAgICAgICAgICAgICB0bXBfdmFsOworICAgIGludCAgICAgICAgICAgICBuZXdfaW5kZXggPSBtX3ZhcnNfdG90YWw7CisgICAgY29uc3QgYXJyX2Rlc2MgKmFwOworICAgIGNvbnN0IFZhckRlc2MzICp2ZDMgPSBzdGF0aWNfY2FzdDxjb25zdCBWYXJEZXNjMyo+KG1fdmFyc1tpXS5wdHIpOworICAgIGludCAgICAgICAgICAgICBmbGFncyA9IHZkMy0+YXJyYXlfZmllbGRzOworICAgIGJvb2wgICAgICAgICAgICBzcmNfaXNfZm9yX21pYyA9IChtX3ZhcnNbaV0uZGlyZWN0aW9uLm91dCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uaW50byA9PSBOVUxMKTsKKworICAgIFJlYWRBcnJFbGVtZW50czx2b2lkICo+ICBwdHI7CisgICAgUmVhZEFyckVsZW1lbnRzPHZvaWQgKj4gIGludG87CisgICAgUmVhZEFyckVsZW1lbnRzPGludDY0X3Q+IGV4dF9zdGFydDsKKyAgICBSZWFkQXJyRWxlbWVudHM8aW50NjRfdD4gZXh0X2VsZW1lbnRzOworICAgIFJlYWRBcnJFbGVtZW50czxpbnQ2NF90PiBhbGlnbjsKKyAgICBSZWFkQXJyRWxlbWVudHM8aW50NjRfdD4gYWxsb2NfaWY7CisgICAgUmVhZEFyckVsZW1lbnRzPGludDY0X3Q+IGZyZWVfaWY7CisgICAgUmVhZEFyckVsZW1lbnRzPGludDY0X3Q+IGludG9fc3RhcnQ7CisgICAgUmVhZEFyckVsZW1lbnRzPGludDY0X3Q+IGludG9fZWxlbTsKKyAgICBSZWFkQXJyRWxlbWVudHM8aW50NjRfdD4gYWxsb2Nfc3RhcnQ7CisgICAgUmVhZEFyckVsZW1lbnRzPGludDY0X3Q+IGFsbG9jX2VsZW07CisKKworICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPnB0cl9hcnJheSk7CisKKyAgICAvLyAicG9pbnRlcnNfbnVtYmVyIiBmb3IgdG90YWwgbnVtYmVyIG9mIHRyYW5zZmVycmVkIHBvaW50ZXJzLgorICAgIC8vIEZvciBlYWNoIG9mIHRoZW0gd2UgY3JlYXRlIG5ldyB2YXJfZGVzYyBhbmQgcHV0IGl0IGF0IHRoZSBib3R0b20KKyAgICAvLyBvZiB0aGUgdmFyX2Rlc2MncyBhcnJheQorICAgIGdldF9hcnJfZGVzY19udW1iZXJzKGFwLCBzaXplb2Yodm9pZCAqKSwgcHRyLm9mZnNldCwgcHRyLnNpemUsCisgICAgICAgIHBvaW50ZXJzX251bWJlciwgcHRyLnJhbmdlcyk7CisgICAgcHRyLmJhc2UgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihhcC0+YmFzZSk7CisKKyAgICAvLyAyLiBwcmVwYXJlIG1lbW9yeSBmb3IgbmV3IHZhcl9kZXNjcworICAgIG1fdmFyc190b3RhbCArPSBwb2ludGVyc19udW1iZXI7CisgICAgbV92YXJzICAgICAgID0gKFZhckRlc2MqKXJlYWxsb2MobV92YXJzLCBtX3ZhcnNfdG90YWwgKiBzaXplb2YoVmFyRGVzYykpOworICAgIG1fdmFyc19leHRyYSA9CisgICAgICAgIChWYXJFeHRyYSopcmVhbGxvYyhtX3ZhcnNfZXh0cmEsIG1fdmFyc190b3RhbCAqIHNpemVvZihWYXJFeHRyYSkpOworICAgIG1faW5fZGVwcyAgICA9CisgICAgICAgIChDT0lFVkVOVCopcmVhbGxvYyhtX2luX2RlcHMsIHNpemVvZihDT0lFVkVOVCkgKiAobV92YXJzX3RvdGFsICsgMSkpOworICAgIG1fb3V0X2RlcHMgICA9CisgICAgICAgIChDT0lFVkVOVCopcmVhbGxvYyhtX291dF9kZXBzLCBzaXplb2YoQ09JRVZFTlQpICogbV92YXJzX3RvdGFsKTsKKworICAgIC8vIDMuIFByZXBhcmUgZm9yIHJlYWRpbmcgbmV3IHZhcl9kZXNjJ3MgZmllbGRzCisgICAgLy8gICAgRVhURU5UIFNUQVJUCisgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2V4dGVudF9zdGFydF9pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+ZXh0ZW50X3N0YXJ0KTsKKyAgICAgICAgZ2V0X2Fycl9kZXNjX251bWJlcnMoYXAsIGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplLCBleHRfc3RhcnQub2Zmc2V0LAorICAgICAgICAgICAgZXh0X3N0YXJ0LnNpemUsIHRtcF92YWwsIGV4dF9zdGFydC5yYW5nZXMpOworICAgICAgICBleHRfc3RhcnQuYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGFwLT5iYXNlKTsKKyAgICAgICAgZXh0X3N0YXJ0LmVsX3NpemUgPSBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZTsKKworICAgICAgICBpZiAodG1wX3ZhbCA8IHBvaW50ZXJzX251bWJlcikgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJleHRlbnQgc3RhcnQiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19leHRlbnRfc3RhcnRfaXNfc2NhbGFyKSkgIT0gMCkgeworICAgICAgICBleHRfc3RhcnQudmFsID0gKGludDY0X3QpdmQzLT5leHRlbnRfc3RhcnQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBleHRfc3RhcnQudmFsID0gMDsKKyAgICB9CisKKyAgICAvLyAgICBFWFRFTlQgRUxFTUVOVFMgTlVNQkVSCisgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2V4dGVudF9lbGVtZW50c19pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+ZXh0ZW50X2VsZW1lbnRzKTsKKyAgICAgICAgZ2V0X2Fycl9kZXNjX251bWJlcnMoYXAsIGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplLAorICAgICAgICAgICAgZXh0X2VsZW1lbnRzLm9mZnNldCwgZXh0X2VsZW1lbnRzLnNpemUsCisgICAgICAgICAgICB0bXBfdmFsLCBleHRfZWxlbWVudHMucmFuZ2VzKTsKKyAgICAgICAgZXh0X2VsZW1lbnRzLmJhc2UgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihhcC0+YmFzZSk7CisgICAgICAgIGV4dF9lbGVtZW50cy5lbF9zaXplID0gYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemU7CisKKyAgICAgICAgaWYgKHRtcF92YWwgPCBwb2ludGVyc19udW1iZXIpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiZXh0ZW50IGVsZW1lbnRzIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoKGZsYWdzICYgKDE8PGZsYWdfZXh0ZW50X2VsZW1lbnRzX2lzX3NjYWxhcikpICE9IDApIHsKKyAgICAgICAgZXh0X2VsZW1lbnRzLnZhbCA9IChpbnQ2NF90KXZkMy0+ZXh0ZW50X2VsZW1lbnRzOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZXh0X2VsZW1lbnRzLnZhbCA9IG1fdmFyc1tpXS5jb3VudDsKKyAgICB9CisKKyAgICAvLyAgICBBTExPQ19JRgorICAgIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19hbGxvY19pZl9pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+YWxsb2NfaWZfYXJyYXkpOworICAgICAgICBnZXRfYXJyX2Rlc2NfbnVtYmVycyhhcCwgYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemUsIGFsbG9jX2lmLm9mZnNldCwKKyAgICAgICAgICAgIGFsbG9jX2lmLnNpemUsIHRtcF92YWwsIGFsbG9jX2lmLnJhbmdlcyk7CisgICAgICAgIGFsbG9jX2lmLmJhc2UgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihhcC0+YmFzZSk7CisgICAgICAgIGFsbG9jX2lmLmVsX3NpemUgPSBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZTsKKworICAgICAgICBpZiAodG1wX3ZhbCA8IHBvaW50ZXJzX251bWJlcikgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJhbGxvY19pZiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhbGxvY19pZi52YWwgPSBtX3ZhcnNbaV0uY291bnQ7CisgICAgfQorCisgICAgLy8gICAgRlJFRV9JRgorICAgIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19mcmVlX2lmX2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5mcmVlX2lmX2FycmF5KTsKKyAgICAgICAgZ2V0X2Fycl9kZXNjX251bWJlcnMoYXAsIGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplLCBmcmVlX2lmLm9mZnNldCwKKyAgICAgICAgICAgIGZyZWVfaWYuc2l6ZSwgdG1wX3ZhbCwgZnJlZV9pZi5yYW5nZXMpOworICAgICAgICBmcmVlX2lmLmJhc2UgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihhcC0+YmFzZSk7CisgICAgICAgIGZyZWVfaWYuZWxfc2l6ZSA9IGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplOworCisgICAgICAgIGlmICh0bXBfdmFsIDwgcG9pbnRlcnNfbnVtYmVyKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImZyZWVfaWYiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZnJlZV9pZi52YWwgPSBtX3ZhcnNbaV0uY291bnQ7CisgICAgfQorCisgICAgLy8gICAgQUxJR04KKworICAgIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19hbGlnbl9pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+YWxpZ25fYXJyYXkpOworICAgICAgICBnZXRfYXJyX2Rlc2NfbnVtYmVycyhhcCwgYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemUsIGFsaWduLm9mZnNldCwKKyAgICAgICAgICAgIGFsaWduLnNpemUsIHRtcF92YWwsIGFsaWduLnJhbmdlcyk7CisgICAgICAgIGFsaWduLmJhc2UgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihhcC0+YmFzZSk7CisgICAgICAgIGFsaWduLmVsX3NpemUgPSBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZTsKKworICAgICAgICBpZiAodG1wX3ZhbCA8IHBvaW50ZXJzX251bWJlcikgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJhbGlnbiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhbGlnbi52YWwgPSBtX3ZhcnNbaV0uYWxpZ247CisgICAgfQorCisgICAgLy8gMy4xIElOVE8KKworICAgIGlmIChtX3ZhcnNbaV0uaW50bykgeworICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4obV92YXJzW2ldLmludG8pOworICAgICAgICBnZXRfYXJyX2Rlc2NfbnVtYmVycyhhcCwgYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemUsIGludG8ub2Zmc2V0LAorICAgICAgICAgICAgaW50by5zaXplLCB0bXBfdmFsLCBpbnRvLnJhbmdlcyk7CisgICAgICAgIGludG8uYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGFwLT5iYXNlKTsKKworICAgICAgICBpZiAodG1wX3ZhbCA8IHBvaW50ZXJzX251bWJlcikgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJpbnRvIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAzLjIgSU5UT19TVEFSVAorCisgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2ludG9fc3RhcnRfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmludG9fc3RhcnQpOworICAgICAgICBnZXRfYXJyX2Rlc2NfbnVtYmVycyhhcCwgYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemUsIGludG9fc3RhcnQub2Zmc2V0LAorICAgICAgICAgICAgaW50b19zdGFydC5zaXplLCB0bXBfdmFsLCBpbnRvX3N0YXJ0LnJhbmdlcyk7CisgICAgICAgIGludG9fc3RhcnQuYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGFwLT5iYXNlKTsKKyAgICAgICAgaW50b19zdGFydC5lbF9zaXplID0gYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemU7CisKKyAgICAgICAgaWYgKHRtcF92YWwgPCBwb2ludGVyc19udW1iZXIpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiaW50b19leHRlbnQgc3RhcnQiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19pbnRvX3N0YXJ0X2lzX3NjYWxhcikpICE9IDApIHsKKyAgICAgICAgaW50b19zdGFydC52YWwgPSAoaW50NjRfdCl2ZDMtPmludG9fc3RhcnQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpbnRvX3N0YXJ0LnZhbCA9IDA7CisgICAgfQorCisgICAgLy8gMy4zIElOVE9fRUxFTUVOVFMKKworICAgIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19pbnRvX2VsZW1lbnRzX2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5pbnRvX2VsZW1lbnRzKTsKKyAgICAgICAgZ2V0X2Fycl9kZXNjX251bWJlcnMoYXAsIGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplLCBpbnRvX2VsZW0ub2Zmc2V0LAorICAgICAgICAgICAgaW50b19lbGVtLnNpemUsIHRtcF92YWwsIGludG9fZWxlbS5yYW5nZXMpOworICAgICAgICBpbnRvX2VsZW0uYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGFwLT5iYXNlKTsKKyAgICAgICAgaW50b19lbGVtLmVsX3NpemUgPSBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZTsKKworICAgICAgICBpZiAodG1wX3ZhbCA8IHBvaW50ZXJzX251bWJlcikgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJpbnRvX2V4dGVudCBlbGVtZW50cyIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChmbGFncyAmICgxPDxmbGFnX2ludG9fZWxlbWVudHNfaXNfc2NhbGFyKSkgIT0gMCkgeworICAgICAgICBpbnRvX2VsZW0udmFsID0gKGludDY0X3QpdmQzLT5pbnRvX2VsZW1lbnRzOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaW50b19lbGVtLnZhbCA9IG1fdmFyc1tpXS5jb3VudDsKKyAgICB9CisKKyAgICAvLyAgICBhbGxvY19zdGFydAorCisgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2FsbG9jX3N0YXJ0X2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5hbGxvY19zdGFydCk7CisgICAgICAgIGdldF9hcnJfZGVzY19udW1iZXJzKGFwLCBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZSwKKyAgICAgICAgICAgIGFsbG9jX3N0YXJ0Lm9mZnNldCwgYWxsb2Nfc3RhcnQuc2l6ZSwgdG1wX3ZhbCwKKyAgICAgICAgICAgIGFsbG9jX3N0YXJ0LnJhbmdlcyk7CisgICAgICAgIGFsbG9jX3N0YXJ0LmJhc2UgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihhcC0+YmFzZSk7CisgICAgICAgIGFsbG9jX3N0YXJ0LmVsX3NpemUgPSBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZTsKKworICAgICAgICBpZiAodG1wX3ZhbCA8IHBvaW50ZXJzX251bWJlcikgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJhbGxvY19leHRlbnQgc3RhcnQiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19hbGxvY19zdGFydF9pc19zY2FsYXIpKSAhPSAwKSB7CisgICAgICAgIGFsbG9jX3N0YXJ0LnZhbCA9IChpbnQ2NF90KXZkMy0+YWxsb2Nfc3RhcnQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhbGxvY19zdGFydC52YWwgPSAwOworICAgIH0KKworICAgIC8vICAgIGFsbG9jX2VsZW0KKworICAgIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19hbGxvY19lbGVtZW50c19pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+YWxsb2NfZWxlbWVudHMpOworICAgICAgICBnZXRfYXJyX2Rlc2NfbnVtYmVycyhhcCwgYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemUsIGFsbG9jX2VsZW0ub2Zmc2V0LAorICAgICAgICAgICAgYWxsb2NfZWxlbS5zaXplLCB0bXBfdmFsLCBhbGxvY19lbGVtLnJhbmdlcyk7CisgICAgICAgIGFsbG9jX2VsZW0uYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGFwLT5iYXNlKTsKKyAgICAgICAgYWxsb2NfZWxlbS5lbF9zaXplID0gYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemU7CisgICAgICAgIGlmICh0bXBfdmFsIDwgcG9pbnRlcnNfbnVtYmVyKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFsbG9jX2V4dGVudCBlbGVtZW50cyIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChmbGFncyAmICgxPDxmbGFnX2FsbG9jX2VsZW1lbnRzX2lzX3NjYWxhcikpICE9IDApIHsKKyAgICAgICAgYWxsb2NfZWxlbS52YWwgPSAoaW50NjRfdCl2ZDMtPmFsbG9jX2VsZW1lbnRzOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYWxsb2NfZWxlbS52YWwgPSAwOworICAgIH0KKworICAgIGZvciAoaW50IGsgPSAwOyBrIDwgcG9pbnRlcnNfbnVtYmVyOyBrKyspIHsKKyAgICAgICAgaW50IHR5cGUgPSBmbGFncyAmIDB4M2Y7CisgICAgICAgIGludCB0eXBlX3NyYywgdHlwZV9kc3Q7CisgICAgICAgIC8vICBHZXQgbmV3IHZhbHVlcworICAgICAgICAvLyB0eXBlX3NyYywgdHlwZV9kc3QKKyAgICAgICAgdHlwZV9zcmMgPSB0eXBlX2RzdCA9ICh0eXBlID09IGNfZGF0YV9wdHJfYXJyYXkpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfZGF0YV9wdHIgICA6ICh0eXBlID09IGNfZnVuY19wdHJfYXJyYXkpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfZnVuY19wdHIgICA6ICh0eXBlID09IGNfdm9pZF9wdHJfYXJyYXkpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfdm9pZF9wdHIgICA6ICh0eXBlID09IGNfc3RyaW5nX3B0cl9hcnJheSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19zdHJpbmdfcHRyIDogMDsKKworICAgICAgICAvLyBHZXQgcHRyIHZhbAorICAgICAgICBpZiAoIXB0ci5yZWFkX25leHQodHJ1ZSkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcHRyLnZhbCA9ICh2b2lkKikocHRyLmJhc2UgKyBwdHIub2Zmc2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vICEhISBJZiB3ZSBnb3QgZXJyb3IgYXQgcGhhc2Ugb2YgcmVhZGluZyAtIGl0J3MgYW4gaW50ZXJuYWwKKyAgICAgICAgLy8gISEhIGVycm9yLCBhcyB3ZSBtdXN0IGRldGVjdCBtaXNtYXRjaCBiZWZvcmUKKworICAgICAgICAvLyBHZXQgaW50byB2YWwKKyAgICAgICAgaWYgKG1fdmFyc1tpXS5pbnRvKSB7CisgICAgICAgICAgICBpZiAoIWludG8ucmVhZF9uZXh0KHRydWUpKSB7CisgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJpbnRvIik7CisgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9BQk9SVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGludG8udmFsID0gKHZvaWQqKShpbnRvLmJhc2UgKyBpbnRvLm9mZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBHZXQgb3RoZXIgY29tcG9uZW50cyBvZiB0aGUgY2xhdXNlCisgICAgICAgIGlmICghZXh0X3N0YXJ0LnJlYWRfbmV4dChmbGFncyAmICgxPDxmbGFnX2V4dGVudF9zdGFydF9pc19hcnJheSkpKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImV4dGVudCBzdGFydCIpOworICAgICAgICAgICAgTElCT0ZGTE9BRF9BQk9SVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWV4dF9lbGVtZW50cy5yZWFkX25leHQoCisgICAgICAgICAgICAgICAgZmxhZ3MgJiAoMTw8ZmxhZ19leHRlbnRfZWxlbWVudHNfaXNfYXJyYXkpKSkgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJleHRlbnQgZWxlbWVudHMiKTsKKyAgICAgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFhbGxvY19pZi5yZWFkX25leHQoZmxhZ3MgJiAoMTw8ZmxhZ19hbGxvY19pZl9pc19hcnJheSkpKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImFsbG9jX2lmIik7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgICAgICB9CisgICAgICAgIGlmICghZnJlZV9pZi5yZWFkX25leHQoZmxhZ3MgJiAoMTw8ZmxhZ19mcmVlX2lmX2lzX2FycmF5KSkpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiZnJlZV9pZiIpOworICAgICAgICAgICAgTElCT0ZGTE9BRF9BQk9SVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWFsaWduLnJlYWRfbmV4dChmbGFncyAmICgxPDxmbGFnX2FsaWduX2lzX2FycmF5KSkpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiYWxpZ24iKTsKKyAgICAgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpbnRvX3N0YXJ0LnJlYWRfbmV4dChmbGFncyAmICgxPDxmbGFnX2ludG9fc3RhcnRfaXNfYXJyYXkpKSkgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJpbnRvX2V4dGVudCBzdGFydCIpOworICAgICAgICAgICAgTElCT0ZGTE9BRF9BQk9SVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWludG9fZWxlbS5yZWFkX25leHQoZmxhZ3MgJiAoMTw8ZmxhZ19pbnRvX2VsZW1lbnRzX2lzX2FycmF5KSkpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiaW50b19leHRlbnQgZWxlbWVudHMiKTsKKyAgICAgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFhbGxvY19zdGFydC5yZWFkX25leHQoZmxhZ3MgJiAoMTw8ZmxhZ19hbGxvY19zdGFydF9pc19hcnJheSkpKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImFsbG9jX2V4dGVudCBzdGFydCIpOworICAgICAgICAgICAgTElCT0ZGTE9BRF9BQk9SVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWFsbG9jX2VsZW0ucmVhZF9uZXh0KAorICAgICAgICAgICAgICAgICBmbGFncyAmICgxPDxmbGFnX2FsbG9jX2VsZW1lbnRzX2lzX2FycmF5KSkpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiYWxsb2NfZXh0ZW50IGVsZW1lbnRzIik7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgICAgICB9CisKKyAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLmRpcmVjdGlvbi5iaXRzID0gbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzOworICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10uYWxsb2NfaWYgPSBhbGxvY19pZi52YWw7CisgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5mcmVlX2lmID0gZnJlZV9pZi52YWw7CisgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5hbGlnbiA9IGFsaWduLnZhbDsKKyAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLm1pY19vZmZzZXQgPSAwOworICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10uZmxhZ3MuYml0cyA9IG1fdmFyc1tpXS5mbGFncy5iaXRzOworICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10ub2Zmc2V0ID0gMDsKKyAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLnNpemUgPSBtX3ZhcnNbaV0uc2l6ZTsKKworICAgICAgICBpZiAoZXh0X3N0YXJ0LnZhbCA9PSAwKSB7CisgICAgICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10uY291bnQgPSBleHRfZWxlbWVudHMudmFsOworICAgICAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLnB0ciA9IHB0ci52YWw7CisgICAgICAgICAgICBpZiAodHlwZV9zcmMgPT0gY19zdHJpbmdfcHRyKSB7CisgICAgICAgICAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLnNpemUgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLmNvdW50ID0gMDsKKyAgICAgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5wdHIgPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHZvaWQqPihtYWtlX2Fycl9kZXNjKAorICAgICAgICAgICAgICAgIHB0ci52YWwsCisgICAgICAgICAgICAgICAgZXh0X3N0YXJ0LnZhbCwKKyAgICAgICAgICAgICAgICBleHRfZWxlbWVudHMudmFsLAorICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplKSk7CisKKyAgICAgICAgICAgIHR5cGVfc3JjID0gdHlwZV9zcmMgPT0gY19kYXRhX3B0ciA/IGNfY2Vhbl92YXJfcHRyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19zdHJpbmdfcHRyID8gY19jZWFuX3Zhcl9wdHIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX3NyYzsKKyAgICAgICAgICAgIGlmICghbV92YXJzW2ldLmludG8pIHsKKyAgICAgICAgICAgICAgICB0eXBlX2RzdCA9IHR5cGVfc3JjOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1fdmFyc1tpXS5pbnRvICYmIGludG9fZWxlbS52YWwgIT0gMCkgeworICAgICAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLmludG8gPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHZvaWQqPihtYWtlX2Fycl9kZXNjKAorICAgICAgICAgICAgICAgIGludG8udmFsLAorICAgICAgICAgICAgICAgIGludG9fc3RhcnQudmFsLAorICAgICAgICAgICAgICAgIGludG9fZWxlbS52YWwsCisgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUpKTsKKyAgICAgICAgICAgIHR5cGVfZHN0ID0gKHR5cGUgPT0gY19kYXRhX3B0cl9hcnJheSkgPyBjX2NlYW5fdmFyX3B0ciA6CisgICAgICAgICAgICAgICAgICAgICAgICh0eXBlID09IGNfc3RyaW5nX3B0cl9hcnJheSkgPyBjX2NlYW5fdmFyX3B0ciA6CisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX3NyYzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5pbnRvID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhbGxvY19lbGVtLnZhbCAhPSAwKSB7CisgICAgICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10uYWxsb2MgPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHZvaWQqPihtYWtlX2Fycl9kZXNjKAorICAgICAgICAgICAgICAgIHB0ci52YWwsCisgICAgICAgICAgICAgICAgYWxsb2Nfc3RhcnQudmFsLAorICAgICAgICAgICAgICAgIGFsbG9jX2VsZW0udmFsLAorICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10uYWxsb2MgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLnR5cGUuc3JjID0gdHlwZV9zcmM7CisgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS50eXBlLmRzdCA9IHR5cGVfZHN0OworCisgICAgICAgIG1fdmFyc19leHRyYVtuZXdfaW5kZXggKyBrXS5pc19hcnJfcHRyX2VsID0gMTsKKyAgICAgICAgbV92YXJzX2V4dHJhW25ld19pbmRleCArIGtdLnB0cl9hcnJfb2Zmc2V0ID0KKyAgICAgICAgICAgIHNyY19pc19mb3JfbWljID8gcHRyLm9mZnNldCA6IGludG8ub2Zmc2V0OworICAgIH0KKyAgICAvLyBjb3VudCBhbmQgYWxsb2MgZmllbGRzIGFyZSB1c2VsZXNzIGF0IHRhcmdldC4gVGhleSBjYW4gYmUgcmV1c2VkCisgICAgLy8gZm9yIHBvaW50ZXIgYXJyYXlzLgorICAgIG1fdmFyc1tpXS5jb3VudCA9IHBvaW50ZXJzX251bWJlcjsKKyAgICBtX3ZhcnNbaV0ucHRyX2Fycl9vZmZzZXQgPSBuZXdfaW5kZXg7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIF9fb2ZmbG9hZF9maW5pX2xpYnJhcnkodm9pZCkKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJDbGVhbnVwIG9mZmxvYWQgbGlicmFyeSAuLi5cbiIpOworICAgIGlmIChtaWNfZW5naW5lc190b3RhbCA+IDApIHsKKyAgICAgICAgZGVsZXRlW10gbWljX2VuZ2luZXM7CisKKyAgICAgICAgaWYgKG1pY19wcm94eV9mc19yb290ICE9IDApIHsKKyAgICAgICAgICAgIGZyZWUobWljX3Byb3h5X2ZzX3Jvb3QpOworICAgICAgICAgICAgbWljX3Byb3h5X2ZzX3Jvb3QgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1pY19saWJyYXJ5X3BhdGggIT0gMCkgeworICAgICAgICAgICAgZnJlZShtaWNfbGlicmFyeV9wYXRoKTsKKyAgICAgICAgICAgIG1pY19saWJyYXJ5X3BhdGggPSAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gZGVzdHJveSB0aHJlYWQga2V5CisgICAgICAgIHRocmVhZF9rZXlfZGVsZXRlKG1pY190aHJlYWRfa2V5KTsKKyAgICB9CisKKyAgICAvLyB1bmxvYWQgQ09JIGxpYnJhcnkKKyAgICBpZiAoQ09JOjppc19hdmFpbGFibGUpIHsKKyAgICAgICAgQ09JOjpmaW5pKCk7CisgICAgfQorCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiQ2xlYW51cCBvZmZsb2FkIGxpYnJhcnkgLi4uIGRvbmVcbiIpOworfQorCitzdGF0aWMgdm9pZCBfX29mZmxvYWRfaW5pdF9saWJyYXJ5X29uY2Uodm9pZCkKK3sKKyAgICBDT0lSRVNVTFQgcmVzOworICAgIHVpbnQzMl90IG51bV9kZXZpY2VzOworICAgIHN0ZDo6Yml0c2V0PE1JQ19FTkdJTkVTX01BWD4gZGV2aWNlczsKKworICAgIHByZWZpeCA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfaG9zdCk7CisKKyAgICAvLyBpbml0aWFsaXplIHRyYWNlCisgICAgY29uc3QgY2hhciAqZW52X3ZhciA9IGdldGVudihodHJhY2VfZW52bmFtZSk7CisgICAgaWYgKGVudl92YXIgIT0gMCAmJiAqZW52X3ZhciAhPSAnXDAnKSB7CisgICAgICAgIGludDY0X3QgbmV3X3ZhbDsKKyAgICAgICAgaWYgKF9fb2ZmbG9hZF9wYXJzZV9pbnRfc3RyaW5nKGVudl92YXIsIG5ld192YWwpKSB7CisgICAgICAgICAgICBjb25zb2xlX2VuYWJsZWQgPSBuZXdfdmFsICYgMHgwZjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVudl92YXIgPSBnZXRlbnYob2ZmbG9hZF9yZXBvcnRfZW52bmFtZSk7CisgICAgaWYgKGVudl92YXIgIT0gMCAmJiAqZW52X3ZhciAhPSAnXDAnKSB7CisgICAgICAgIGludDY0X3QgZW52X3ZhbDsKKyAgICAgICAgaWYgKF9fb2ZmbG9hZF9wYXJzZV9pbnRfc3RyaW5nKGVudl92YXIsIGVudl92YWwpKSB7CisgICAgICAgICAgICBpZiAoZW52X3ZhbCA9PSBPRkZMT0FEX1JFUE9SVF8xIHx8CisgICAgICAgICAgICAgICAgZW52X3ZhbCA9PSBPRkZMT0FEX1JFUE9SVF8yIHx8CisgICAgICAgICAgICAgICAgZW52X3ZhbCA9PSBPRkZMT0FEX1JFUE9SVF8zKSB7CisgICAgICAgICAgICAgICAgb2ZmbG9hZF9yZXBvcnRfbGV2ZWwgPSBlbnZfdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2ludmFsaWRfZW52X3JlcG9ydF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmxvYWRfcmVwb3J0X2Vudm5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2ludmFsaWRfZW52X3Zhcl9pbnRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmxvYWRfcmVwb3J0X2Vudm5hbWUpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCFvZmZsb2FkX3JlcG9ydF9sZXZlbCkgeworICAgICAgICBlbnZfdmFyID0gZ2V0ZW52KHRpbWVyX2Vudm5hbWUpOworICAgICAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgICAgIHRpbWVyX2VuYWJsZWQgPSBhdG9pKGVudl92YXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gaW5pdGlhbGl6ZSBDT0kKKyAgICBpZiAoIUNPSTo6aW5pdCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBnZXQgbnVtYmVyIG9mIGRldmljZXMgaW5zdGFsbGVkIGluIHRoZSBzeXN0ZW0KKyAgICByZXMgPSBDT0k6OkVuZ2luZUdldENvdW50KENPSV9JU0FfS05DLCAmbnVtX2RldmljZXMpOworICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChudW1fZGV2aWNlcyA+IE1JQ19FTkdJTkVTX01BWCkgeworICAgICAgICBudW1fZGV2aWNlcyA9IE1JQ19FTkdJTkVTX01BWDsKKyAgICB9CisKKyAgICAvLyBmaWxsIGluIHRoZSBsaXN0IG9mIGRldmljZXMgdGhhdCBjYW4gYmUgdXNlZCBmb3Igb2ZmbG9hZGluZworICAgIGVudl92YXIgPSBnZXRlbnYoIk9GRkxPQURfREVWSUNFUyIpOworICAgIGlmIChlbnZfdmFyICE9IDApIHsKKyAgICAgICAgaWYgKHN0cmNhc2VjbXAoZW52X3ZhciwgIm5vbmUiKSAhPSAwKSB7CisgICAgICAgICAgICAvLyB2YWx1ZSBpcyBjb21wb3NlZCBvZiBjb21tYSBzZXBhcmF0ZWQgcGh5c2ljYWwgZGV2aWNlIGluZGV4ZXMKKyAgICAgICAgICAgIGNoYXIgKmJ1ZiA9IHN0cmR1cChlbnZfdmFyKTsKKyAgICAgICAgICAgIGNoYXIgKnN0ciwgKnB0cjsKKyAgICAgICAgICAgIGZvciAoc3RyID0gc3RydG9rX3IoYnVmLCAiLCIsICZwdHIpOyBzdHIgIT0gMDsKKyAgICAgICAgICAgICAgICAgc3RyID0gc3RydG9rX3IoMCwgIiwiLCAmcHRyKSkgeworICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgc3RyaW5nIHRvIGFuIGludAorICAgICAgICAgICAgICAgIGludDY0X3QgbnVtOworICAgICAgICAgICAgICAgIGlmICghX19vZmZsb2FkX3BhcnNlX2ludF9zdHJpbmcoc3RyLCBudW0pKSB7CisgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19taWNfaW5pdDUpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGZhbGxiYWNrIHRvIHVzaW5nIGFsbCBpbnN0YWxsZWQgZGV2aWNlcworICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2RldmljZXM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlcy5zZXQoaSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChudW0gPCAwIHx8IG51bSA+PSBudW1fZGV2aWNlcykgeworICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfbWljX2luaXQ2LCBudW0pOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGV2aWNlcy5zZXQobnVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyZWUoYnVmKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8gdXNlIGFsbCBhdmFpbGFibGUgZGV2aWNlcworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9kZXZpY2VzOyBpKyspIHsKKyAgICAgICAgICAgIENPSUVOR0lORSBlbmdpbmU7CisgICAgICAgICAgICByZXMgPSBDT0k6OkVuZ2luZUdldEhhbmRsZShDT0lfSVNBX0tOQywgaSwgJmVuZ2luZSk7CisgICAgICAgICAgICBpZiAocmVzID09IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlcy5zZXQoaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtaWNfZW5naW5lc190b3RhbCA9IGRldmljZXMuY291bnQoKTsKKworICAgIC8vIG5vIG5lZWQgdG8gY29udGludWUgaWYgdGhlcmUgYXJlIG5vIGRldmljZXMgdG8gb2ZmbG9hZCB0bworICAgIGlmIChtaWNfZW5naW5lc190b3RhbCA8PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBpbml0aWFsaXplIGluZGV4ZXMgZm9yIGF2YWlsYWJsZSBkZXZpY2VzCisgICAgbWljX2VuZ2luZXMgPSBuZXcgRW5naW5lW21pY19lbmdpbmVzX3RvdGFsXTsKKyAgICBmb3IgKGludCBwX2lkeCA9IDAsIGxfaWR4ID0gMDsgcF9pZHggPCBudW1fZGV2aWNlczsgcF9pZHgrKykgeworICAgICAgICBpZiAoZGV2aWNlc1twX2lkeF0pIHsKKyAgICAgICAgICAgIG1pY19lbmdpbmVzW2xfaWR4XS5zZXRfaW5kZXhlcyhsX2lkeCwgcF9pZHgpOworICAgICAgICAgICAgbF9pZHgrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGxpYnJhcnkgc2VhcmNoIHBhdGggZm9yIGRldmljZSBiaW5hcmllcworICAgIGVudl92YXIgPSBnZXRlbnYoIk1JQ19MRF9MSUJSQVJZX1BBVEgiKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwKSB7CisgICAgICAgIG1pY19saWJyYXJ5X3BhdGggPSBzdHJkdXAoZW52X3Zhcik7CisgICAgfQorCisgICAgLy8gbWVtb3J5IHNpemUgcmVzZXJ2ZWQgZm9yIENPSSBidWZmZXJzCisgICAgZW52X3ZhciA9IGdldGVudigiTUlDX0JVRkZFUlNJWkUiKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwKSB7CisgICAgICAgIHVpbnQ2NF90IG5ld19zaXplOworICAgICAgICBpZiAoX19vZmZsb2FkX3BhcnNlX3NpemVfc3RyaW5nKGVudl92YXIsIG5ld19zaXplKSkgeworICAgICAgICAgICAgbWljX2J1ZmZlcl9zaXplID0gbmV3X3NpemU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfaW52YWxpZF9lbnZfdmFyX3ZhbHVlLCAiTUlDX0JVRkZFUlNJWkUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGRldGVybWluZSBzdGFja3NpemUgZm9yIHRoZSBwaXBlbGluZSBvbiB0aGUgZGV2aWNlCisgICAgZW52X3ZhciA9IGdldGVudigiTUlDX1NUQUNLU0laRSIpOworICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICB1aW50NjRfdCBuZXdfc2l6ZTsKKyAgICAgICAgaWYgKF9fb2ZmbG9hZF9wYXJzZV9zaXplX3N0cmluZyhlbnZfdmFyLCBuZXdfc2l6ZSkgJiYKKyAgICAgICAgICAgIChuZXdfc2l6ZSA+PSAxNjM4NCkgJiYgKChuZXdfc2l6ZSAmIDQwOTUpID09IDApKSB7CisgICAgICAgICAgICBtaWNfc3RhY2tfc2l6ZSA9IG5ld19zaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX21pY19pbml0Myk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBwcm94eSBJL08KKyAgICBlbnZfdmFyID0gZ2V0ZW52KCJNSUNfUFJPWFlfSU8iKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgaW50NjRfdCBuZXdfdmFsOworICAgICAgICBpZiAoX19vZmZsb2FkX3BhcnNlX2ludF9zdHJpbmcoZW52X3ZhciwgbmV3X3ZhbCkpIHsKKyAgICAgICAgICAgIG1pY19wcm94eV9pbyA9IG5ld192YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfaW52YWxpZF9lbnZfdmFyX2ludF92YWx1ZSwgIk1JQ19QUk9YWV9JTyIpOworICAgICAgICB9CisgICAgfQorICAgIGVudl92YXIgPSBnZXRlbnYoIk1JQ19QUk9YWV9GU19ST09UIik7CisgICAgaWYgKGVudl92YXIgIT0gMCAmJiAqZW52X3ZhciAhPSAnXDAnKSB7CisgICAgICAgIG1pY19wcm94eV9mc19yb290ID0gc3RyZHVwKGVudl92YXIpOworICAgIH0KKworICAgIC8vIFByZXBhcmUgZW52aXJvbm1lbnQgZm9yIHRoZSB0YXJnZXQgcHJvY2VzcyB1c2luZyB0aGUgZm9sbG93aW5nCisgICAgLy8gcnVsZXMKKyAgICAvLyAtIElmIE1JQ19FTlZfUFJFRklYIGlzIHNldCB0aGVuIGFueSBlbnZpcm9ubWVudCB2YXJpYWJsZSBvbiB0aGUKKyAgICAvLyAgIGhvc3Qgd2hpY2ggaGFzIHRoYXQgcHJlZml4IGFyZSBjb3BpZWQgdG8gdGhlIGRldmljZSB3aXRob3V0CisgICAgLy8gICB0aGUgcHJlZml4LgorICAgIC8vICAgQWxsIG90aGVyIGhvc3QgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBpZ25vcmVkLgorICAgIC8vIC0gSWYgTUlDX0VOVl9QUkVGSVggaXMgbm90IHNldCBvciBpZiBNSUNfRU5WX1BSRUZJWD0iIiB0aGVuIGhvc3QKKyAgICAvLyAgIGVudmlyb25tZW50IGlzIGR1cGxpY2F0ZWQuCisgICAgZW52X3ZhciA9IGdldGVudigiTUlDX0VOVl9QUkVGSVgiKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgbWljX2Vudl92YXJzLnNldF9wcmVmaXgoZW52X3Zhcik7CisKKyAgICAgICAgaW50IGxlbiA9IHN0cmxlbihlbnZfdmFyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGVudmlyb25baV0gIT0gMDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc3RybmNtcChlbnZpcm9uW2ldLCBlbnZfdmFyLCBsZW4pID09IDAgJiYKKyAgICAgICAgICAgICAgICBzdHJuY21wKGVudmlyb25baV0sICJNSUNfTERfTElCUkFSWV9QQVRIIiwgMTkpICE9IDAgJiYKKyAgICAgICAgICAgICAgICBlbnZpcm9uW2ldW2xlbl0gIT0gJz0nKSB7CisgICAgICAgICAgICAgICAgbWljX2Vudl92YXJzLmFuYWx5emVfZW52X3ZhcihlbnZpcm9uW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGNyZWF0ZSBrZXkgZm9yIHRocmVhZCBkYXRhCisgICAgaWYgKHRocmVhZF9rZXlfY3JlYXRlKCZtaWNfdGhyZWFkX2tleSwgRW5naW5lOjpkZXN0cm95X3RocmVhZF9kYXRhKSkgeworICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfbWljX2luaXQ0LCBlcnJubyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBjcHUgZnJlcXVlbmN5CisgICAgY3B1X2ZyZXF1ZW5jeSA9IENPSTo6UGVyZkdldEN5Y2xlRnJlcXVlbmN5KCk7CisKKyAgICBlbnZfdmFyID0gZ2V0ZW52KG1pY191c2VfMm1iX2J1ZmZlcnNfZW52bmFtZSk7CisgICAgaWYgKGVudl92YXIgIT0gMCAmJiAqZW52X3ZhciAhPSAnXDAnKSB7CisgICAgICAgIHVpbnQ2NF90IG5ld19zaXplOworICAgICAgICBpZiAoX19vZmZsb2FkX3BhcnNlX3NpemVfc3RyaW5nKGVudl92YXIsIG5ld19zaXplKSkgeworICAgICAgICAgICAgX19vZmZsb2FkX3VzZV8ybWJfYnVmZmVycyA9IG5ld19zaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2ludmFsaWRfZW52X3Zhcl92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWljX3VzZV8ybWJfYnVmZmVyc19lbnZuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVudl92YXIgPSBnZXRlbnYobWljX3VzZV9hc3luY19idWZmZXJfd3JpdGVfZW52bmFtZSk7CisgICAgaWYgKGVudl92YXIgIT0gMCAmJiAqZW52X3ZhciAhPSAnXDAnKSB7CisgICAgICAgIHVpbnQ2NF90IG5ld19zaXplOworICAgICAgICBpZiAoX19vZmZsb2FkX3BhcnNlX3NpemVfc3RyaW5nKGVudl92YXIsIG5ld19zaXplKSkgeworICAgICAgICAgICAgX19vZmZsb2FkX3VzZV9hc3luY19idWZmZXJfd3JpdGUgPSBuZXdfc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVudl92YXIgPSBnZXRlbnYobWljX3VzZV9hc3luY19idWZmZXJfcmVhZF9lbnZuYW1lKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgdWludDY0X3QgbmV3X3NpemU7CisgICAgICAgIGlmIChfX29mZmxvYWRfcGFyc2Vfc2l6ZV9zdHJpbmcoZW52X3ZhciwgbmV3X3NpemUpKSB7CisgICAgICAgICAgICBfX29mZmxvYWRfdXNlX2FzeW5jX2J1ZmZlcl9yZWFkID0gbmV3X3NpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBtaWMgaW5pdGlhbGl6YXRpb24gdHlwZQorICAgIGVudl92YXIgPSBnZXRlbnYob2ZmbG9hZF9pbml0X2Vudm5hbWUpOworICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICBpZiAoc3RyY21wKGVudl92YXIsICJvbl9vZmZsb2FkIikgPT0gMCkgeworICAgICAgICAgICAgX19vZmZsb2FkX2luaXRfdHlwZSA9IGNfaW5pdF9vbl9vZmZsb2FkOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcChlbnZfdmFyLCAib25fb2ZmbG9hZF9hbGwiKSA9PSAwKSB7CisgICAgICAgICAgICBfX29mZmxvYWRfaW5pdF90eXBlID0gY19pbml0X29uX29mZmxvYWRfYWxsOworICAgICAgICB9CisjaWZuZGVmIFRBUkdFVF9XSU5OVAorICAgICAgICBlbHNlIGlmIChzdHJjbXAoZW52X3ZhciwgIm9uX3N0YXJ0IikgPT0gMCkgeworICAgICAgICAgICAgX19vZmZsb2FkX2luaXRfdHlwZSA9IGNfaW5pdF9vbl9zdGFydDsKKyAgICAgICAgfQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19pbnZhbGlkX2Vudl92YXJfdmFsdWUsIG9mZmxvYWRfaW5pdF9lbnZuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGFjdGl2ZSB3YWl0CisgICAgZW52X3ZhciA9IGdldGVudihvZmZsb2FkX2FjdGl2ZV93YWl0X2Vudm5hbWUpOworICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICBpbnQ2NF90IG5ld192YWw7CisgICAgICAgIGlmIChfX29mZmxvYWRfcGFyc2VfaW50X3N0cmluZyhlbnZfdmFyLCBuZXdfdmFsKSkgeworICAgICAgICAgICAgX19vZmZsb2FkX2FjdGl2ZV93YWl0ID0gbmV3X3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19pbnZhbGlkX2Vudl92YXJfaW50X3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZsb2FkX2FjdGl2ZV93YWl0X2Vudm5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gb21wIGRldmljZSBudW0KKyAgICBlbnZfdmFyID0gZ2V0ZW52KG9tcF9kZXZpY2VfbnVtX2Vudm5hbWUpOworICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICBpbnQ2NF90IG5ld192YWw7CisgICAgICAgIGlmIChfX29mZmxvYWRfcGFyc2VfaW50X3N0cmluZyhlbnZfdmFyLCBuZXdfdmFsKSAmJiBuZXdfdmFsID49IDApIHsKKyAgICAgICAgICAgIF9fb21wX2RldmljZV9udW0gPSBuZXdfdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX29tcF9pbnZhbGlkX2RldmljZV9udW1fZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXBfZGV2aWNlX251bV9lbnZuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGluaXQgT1JTTAorICAgIE9SU0w6OmluaXQoKTsKK30KKworZXh0ZXJuIGludCBfX29mZmxvYWRfaW5pdF9saWJyYXJ5KHZvaWQpCit7CisgICAgLy8gZG8gb25lIHRpbWUgaW50aWFsaXphdGlvbgorICAgIHN0YXRpYyBPZmZsb2FkT25jZUNvbnRyb2wgY3RybCA9IE9GRkxPQURfT05DRV9DT05UUk9MX0lOSVQ7CisgICAgX19vZmZsb2FkX3J1bl9vbmNlKCZjdHJsLCBfX29mZmxvYWRfaW5pdF9saWJyYXJ5X29uY2UpOworCisgICAgLy8gb2ZmbG9hZCBpcyBhdmFpbGFibGUgaWYgQ09JIGlzIGF2YWlsYWJsZSBhbmQgdGhlIG51bWJlciBvZiBkZXZpY2VzID4gMAorICAgIGJvb2wgaXNfYXZhaWxhYmxlID0gQ09JOjppc19hdmFpbGFibGUgJiYgKG1pY19lbmdpbmVzX3RvdGFsID4gMCk7CisKKyAgICAvLyByZWdpc3RlciBwZW5kaW5nIGxpYnJhcmllcyBpZiB0aGVyZSBhcmUgYW55CisgICAgaWYgKGlzX2F2YWlsYWJsZSAmJiBfX3RhcmdldF9saWJzKSB7CisgICAgICAgIG11dGV4X2xvY2tlcl90IGxvY2tlcihfX3RhcmdldF9saWJzX2xvY2spOworCisgICAgICAgIGZvciAoVGFyZ2V0SW1hZ2VMaXN0OjppdGVyYXRvciBpdCA9IF9fdGFyZ2V0X2xpYnNfbGlzdC5iZWdpbigpOworICAgICAgICAgICAgIGl0ICE9IF9fdGFyZ2V0X2xpYnNfbGlzdC5lbmQoKTsgaXQrKykgeworICAgICAgICAgICAgLy8gUmVnaXN0ZXIgbGlicmFyeSBpbiBDT0kKKyAgICAgICAgICAgIENPSTo6UHJvY2Vzc1JlZ2lzdGVyTGlicmFyaWVzKDEsICZpdC0+ZGF0YSwgJml0LT5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0LT5vcmlnaW4sICZpdC0+b2Zmc2V0KTsKKworICAgICAgICAgICAgLy8gYWRkIGxpYiB0byBhbGwgZW5naW5lcworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaWNfZW5naW5lc190b3RhbDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbWljX2VuZ2luZXNbaV0uYWRkX2xpYigqaXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgX190YXJnZXRfbGlicyA9IGZhbHNlOworICAgICAgICBfX3RhcmdldF9saWJzX2xpc3QuY2xlYXIoKTsKKyAgICB9CisKKyAgICByZXR1cm4gaXNfYXZhaWxhYmxlOworfQorCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX3JlZ2lzdGVyX2ltYWdlKGNvbnN0IHZvaWQgKnRhcmdldF9pbWFnZSkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgSW1hZ2UgKmltYWdlID0gc3RhdGljX2Nhc3Q8Y29uc3Qgc3RydWN0IEltYWdlKj4odGFyZ2V0X2ltYWdlKTsKKworICAgIC8vIGRlY29kZSBpbWFnZQorICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBpbWFnZS0+ZGF0YTsKKyAgICBjb25zdCB2b2lkICpkYXRhID0gaW1hZ2UtPmRhdGEgKyBzdHJsZW4oaW1hZ2UtPmRhdGEpICsgMTsKKyAgICB1aW50NjRfdCAgICBzaXplID0gaW1hZ2UtPnNpemU7CisgICAgY29uc3QgY2hhciAqb3JpZ2luID0gMDsKKyAgICB1aW50NjRfdCAgICBvZmZzZXQgPSAwOworCisgICAgLy8gb3VyIGFjdGlvbnMgZGVwZW5kIG9uIHRoZSBpbWFnZSB0eXBlCisgICAgY29uc3QgRWxmNjRfRWhkciAqaGRyID0gc3RhdGljX2Nhc3Q8Y29uc3QgRWxmNjRfRWhkcio+KGRhdGEpOworICAgIHN3aXRjaCAoaGRyLT5lX3R5cGUpIHsKKyAgICAgICAgY2FzZSBFVF9FWEVDOgorICAgICAgICAgICAgLy8gRWFjaCBvZmZsb2FkIGFwcGxpY2F0aW9uIGlzIHN1cHBvc2VkIHRvIGhhdmUgb25seSBvbmUgdGFyZ2V0CisgICAgICAgICAgICAvLyBpbWFnZSByZXByZXNlbnRpbmcgdGFyZ2V0IGV4ZWN1dGFibGUuCisgICAgICAgICAgICAvLyBObyB0aHJlYWQgc3luY2hyb25pemF0aW9uIGlzIHJlcXVpcmVkIGhlcmUgYXMgdGhlIGluaXRpYWxpemF0aW9uCisgICAgICAgICAgICAvLyBjb2RlIGlzIGFsd2F5cyBleGVjdXRlZCBpbiBhIHNpbmdsZSB0aHJlYWQuCisgICAgICAgICAgICBpZiAoX190YXJnZXRfZXhlICE9IDApIHsKKyAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfbXVsdGlwbGVfdGFyZ2V0X2V4ZXMpOworICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX3RhcmdldF9leGUgPSBuZXcgVGFyZ2V0SW1hZ2UobmFtZSwgZGF0YSwgc2l6ZSwgb3JpZ2luLCBvZmZzZXQpOworCisgICAgICAgICAgICAvLyBSZWdpc3RyYXRpb24gY29kZSBmb3IgZXhlY3MgaXMgYWx3YXlzIGNhbGxlZCBmcm9tIHRoZSBjb250ZXh0CisgICAgICAgICAgICAvLyBvZiBtYWluIGFuZCB0aHVzIHdlIGNhbiBzYWZlbHkgY2FsbCBhbnkgZnVuY3Rpb24gaGVyZSwKKyAgICAgICAgICAgIC8vIGluY2x1ZGluZyBMb2FkTGlicmFyeSBBUEkgb24gd2luZG93cy4gVGhpcyBpcyB0aGUgcGxhY2Ugd2hlcmUKKyAgICAgICAgICAgIC8vIHdlIGRvIHRoZSBvZmZsb2FkIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24uCisgICAgICAgICAgICBpZiAoX19vZmZsb2FkX2luaXRfbGlicmFyeSgpKSB7CisgICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBlbmdpbmUgaWYgaW5pdF90eXBlIGlzIG9uX3N0YXJ0CisgICAgICAgICAgICAgICAgaWYgKF9fb2ZmbG9hZF9pbml0X3R5cGUgPT0gY19pbml0X29uX3N0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWljX2VuZ2luZXNfdG90YWw7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgbWljX2VuZ2luZXNbaV0uaW5pdCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFVF9EWU46CisgICAgICAgICAgICAvLyBSZWdpc3RyYXRpb24gY29kZSBmb3IgbGlicmFyaWVzIGlzIGNhbGxlZCBmcm9tIHRoZSBEbGxNYWluCisgICAgICAgICAgICAvLyBjb250ZXh0IChvbiB3aW5kb3dzKSBhbmQgdGh1cyB3ZSBjYW5ub3QgZG8gYW55dGhpbmcgdXNlZnVsCisgICAgICAgICAgICAvLyBoZXJlLiBTbyB3ZSBqdXN0IGFkZCBpdCB0byB0aGUgbGlzdCBvZiBwZW5kaW5nIGxpYnJhcmllcyBmb3IKKyAgICAgICAgICAgIC8vIHRoZSBsYXRlciB1c2UuCisgICAgICAgICAgICBfX3RhcmdldF9saWJzX2xvY2subG9jaygpOworICAgICAgICAgICAgX190YXJnZXRfbGlicyA9IHRydWU7CisgICAgICAgICAgICBfX3RhcmdldF9saWJzX2xpc3QucHVzaF9iYWNrKFRhcmdldEltYWdlKG5hbWUsIGRhdGEsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbiwgb2Zmc2V0KSk7CisgICAgICAgICAgICBfX3RhcmdldF9saWJzX2xvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gc29tZXRoaW5nIGlzIGRlZmluaXRlbHkgd3JvbmcsIGlzc3VlIGFuIGVycm9yIGFuZCBleGl0CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfdW5rbm93bl9iaW5hcnlfdHlwZSk7CisgICAgICAgICAgICBleGl0KDEpOworICAgIH0KK30KKworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF91bnJlZ2lzdGVyX2ltYWdlKGNvbnN0IHZvaWQgKnRhcmdldF9pbWFnZSkKK3sKKyAgICAvLyBUYXJnZXQgaW1hZ2UgaXMgcGFja2VkIGFzIGZvbGxvd3M6CisgICAgLy8gICAgICA4IGJ5dGVzICAgICAgICAgICAgICAgIC0gc2l6ZSBvZiB0aGUgdGFyZ2V0IGJpbmFyeQorICAgIC8vICAgICAgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyAtIGJpbmFyeSBuYW1lCisgICAgLy8gICAgICA8c2l6ZT4gYnl0ZXMgICAgICAgICAgIC0gYmluYXJ5IGNvbnRlbnRzCisgICAgY29uc3Qgc3RydWN0IEltYWdlIHsKKyAgICAgICAgIGludDY0X3Qgc2l6ZTsKKyAgICAgICAgIGNoYXIgZGF0YVtdOworICAgIH0gKmltYWdlID0gc3RhdGljX2Nhc3Q8Y29uc3Qgc3RydWN0IEltYWdlKj4odGFyZ2V0X2ltYWdlKTsKKworICAgIC8vIGRlY29kZSBpbWFnZQorICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBpbWFnZS0+ZGF0YTsKKyAgICBjb25zdCB2b2lkICpkYXRhID0gaW1hZ2UtPmRhdGEgKyBzdHJsZW4oaW1hZ2UtPmRhdGEpICsgMTsKKworICAgIC8vIG91ciBhY3Rpb25zIGRlcGVuZCBvbiB0aGUgaW1hZ2UgdHlwZQorICAgIGNvbnN0IEVsZjY0X0VoZHIgKmhkciA9IHN0YXRpY19jYXN0PGNvbnN0IEVsZjY0X0VoZHIqPihkYXRhKTsKKyAgICBpZiAoaGRyLT5lX3R5cGUgPT0gRVRfRVhFQykgeworICAgICAgICAvLyBXZSBhcmUgZXhlY3V0aW5nIGV4ZWMncyBkZXNjdHJ1Y3RvcnMuCisgICAgICAgIC8vIEl0IGlzIHRpbWUgdG8gZG8gYSBsaWJyYXJ5IGNsZWFudXAuCisgICAgICAgIGlmICh0aW1lcl9lbmFibGVkKSB7CisgICAgICAgICAgICBPZmZsb2FkX1RpbWVyX1ByaW50KCk7CisgICAgICAgIH0KKworI2lmZGVmIE1ZT19TVVBQT1JUCisgICAgICAgIF9fb2ZmbG9hZF9teW9GaW5pKCk7CisjZW5kaWYgLy8gTVlPX1NVUFBPUlQKKworICAgICAgICBfX29mZmxvYWRfZmluaV9saWJyYXJ5KCk7CisgICAgfQorfQorCisvLyBSdW50aW1lIHRyYWNlIGludGVyZmFjZSBmb3IgdXNlciBwcm9ncmFtcworCit2b2lkIF9fb2ZmbG9hZF9jb25zb2xlX3RyYWNlKGludCBsZXZlbCkKK3sKKyAgICBjb25zb2xlX2VuYWJsZWQgPSBsZXZlbDsKK30KKworLy8gVXNlci12aXNpYmxlIG9mZmxvYWQgQVBJCisKK2ludCBfT2ZmbG9hZF9udW1iZXJfb2ZfZGV2aWNlcyh2b2lkKQoreworICAgIF9fb2ZmbG9hZF9pbml0X2xpYnJhcnkoKTsKKyAgICByZXR1cm4gbWljX2VuZ2luZXNfdG90YWw7Cit9CisKK2ludCBfT2ZmbG9hZF9nZXRfZGV2aWNlX251bWJlcih2b2lkKQoreworICAgIHJldHVybiAtMTsKK30KKworaW50IF9PZmZsb2FkX2dldF9waHlzaWNhbF9kZXZpY2VfbnVtYmVyKHZvaWQpCit7CisgICAgcmV0dXJuIC0xOworfQorCitpbnQgX09mZmxvYWRfc2lnbmFsZWQoaW50IGluZGV4LCB2b2lkICpzaWduYWwpCit7CisgICAgX19vZmZsb2FkX2luaXRfbGlicmFyeSgpOworCisgICAgLy8gY2hlY2sgaW5kZXggdmFsdWUKKyAgICBpZiAoaW5kZXggPCAwIHx8IG1pY19lbmdpbmVzX3RvdGFsIDw9IDApIHsKKyAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX29mZmxvYWRfc2lnbmFsZWQxLCBpbmRleCk7CisgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgfQorCisgICAgLy8gZmluZCBhc3NvY2lhdGVkIGFzeW5jIHRhc2sKKyAgICBPZmZsb2FkRGVzY3JpcHRvciAqdGFzayA9CisgICAgICAgIG1pY19lbmdpbmVzW2luZGV4ICUgbWljX2VuZ2luZXNfdG90YWxdLmZpbmRfc2lnbmFsKHNpZ25hbCwgZmFsc2UpOworICAgIGlmICh0YXNrID09IDApIHsKKyAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX29mZmxvYWRfc2lnbmFsZWQyLCBzaWduYWwpOworICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgIH0KKworICAgIHJldHVybiB0YXNrLT5pc19zaWduYWxlZCgpOworfQorCit2b2lkIF9PZmZsb2FkX3JlcG9ydChpbnQgdmFsKQoreworICAgIGlmICh2YWwgPT0gT0ZGTE9BRF9SRVBPUlRfT04gfHwKKyAgICAgICAgdmFsID09IE9GRkxPQURfUkVQT1JUX09GRikgeworICAgICAgICBvZmZsb2FkX3JlcG9ydF9lbmFibGVkID0gdmFsOworICAgIH0KK30KKworLy8gSURCIHN1cHBvcnQKK2ludCAgIF9fZGJnX2lzX2F0dGFjaGVkID0gMDsKK2ludCAgIF9fZGJnX3RhcmdldF9pZCA9IC0xOworcGlkX3QgX19kYmdfdGFyZ2V0X3NvX3BpZCA9IC0xOworY2hhciAgX19kYmdfdGFyZ2V0X2V4ZV9uYW1lW01BWF9UQVJHRVRfTkFNRV0gPSB7MH07Citjb25zdCBpbnQgX19kYmdfYXBpX21ham9yX3ZlcnNpb24gPSAxOworY29uc3QgaW50IF9fZGJnX2FwaV9taW5vcl92ZXJzaW9uID0gMDsKKwordm9pZCBfX2RiZ190YXJnZXRfc29fbG9hZGVkKCkKK3sKK30KK3ZvaWQgX19kYmdfdGFyZ2V0X3NvX3VubG9hZGVkKCkKK3sKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfaG9zdC5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9ob3N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEyMzk5NgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfaG9zdC5oCkBAIC0wLDAgKzEsMzQzIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8qISBcZmlsZQorICAgIFxicmllZiBUaGUgcGFydHMgb2YgdGhlIHJ1bnRpbWUgbGlicmFyeSB1c2VkIG9ubHkgb24gdGhlIGhvc3QKKyovCisKKyNpZm5kZWYgT0ZGTE9BRF9IT1NUX0hfSU5DTFVERUQKKyNkZWZpbmUgT0ZGTE9BRF9IT1NUX0hfSU5DTFVERUQKKworI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyNpbmNsdWRlICJvZmZsb2FkX2NvbW1vbi5oIgorI2luY2x1ZGUgIm9mZmxvYWRfdXRpbC5oIgorI2luY2x1ZGUgIm9mZmxvYWRfZW5naW5lLmgiCisjaW5jbHVkZSAib2ZmbG9hZF9lbnYuaCIKKyNpbmNsdWRlICJvZmZsb2FkX29yc2wuaCIKKyNpbmNsdWRlICJjb2kvY29pX2NsaWVudC5oIgorCisvLyBNSUMgZW5naW5lcy4KK2V4dGVybiBFbmdpbmUqICBtaWNfZW5naW5lczsKK2V4dGVybiB1aW50MzJfdCBtaWNfZW5naW5lc190b3RhbDsKKworLy8hIFRoZSB0YXJnZXQgaW1hZ2UgaXMgcGFja2VkIGFzIGZvbGxvd3MuCisvKiEgICAgICAxLiA4IGJ5dGVzIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgdGhlIHRhcmdldCBiaW5hcnkgICAgICAgICAgKi8KKy8qISAgICAgIDIuIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyB3aGljaCBpcyB0aGUgYmluYXJ5IG5hbWUgICAgICAgICAqLworLyohICAgICAgMy4gPHNpemU+IG51bWJlciBvZiBieXRlcyB0aGF0IGFyZSB0aGUgY29udGVudHMgb2YgdGhlIGltYWdlICovCisvKiEgICAgICBUaGUgYWRkcmVzcyBvZiBzeW1ib2wgX19vZmZsb2FkX3RhcmdldF9pbWFnZQorICAgICAgICAgICAgIGlzIHRoZSBhZGRyZXNzIG9mIHRoaXMgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICovCitzdHJ1Y3QgSW1hZ2UgeworICAgICBpbnQ2NF90IHNpemU7IC8vITwgU2l6ZSBpbiBieXRlcyBvZiB0aGUgdGFyZ2V0IGJpbmFyeSBuYW1lIGFuZCBjb250ZW50cworICAgICBjaGFyIGRhdGFbXTsgIC8vITwgVGhlIG5hbWUgYW5kIGNvbnRlbnRzIG9mIHRoZSB0YXJnZXQgaW1hZ2UKK307CisKKy8vIFRoZSBvZmZsb2FkIGRlc2NyaXB0b3IuCitjbGFzcyBPZmZsb2FkRGVzY3JpcHRvcgoreworcHVibGljOgorICAgIE9mZmxvYWREZXNjcmlwdG9yKAorICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgIF9PZmZsb2FkX3N0YXR1cyAqc3RhdHVzLAorICAgICAgICBib29sIGlzX21hbmRhdG9yeSwKKyAgICAgICAgYm9vbCBpc19vcGVubXAsCisgICAgICAgIE9mZmxvYWRIb3N0VGltZXJEYXRhICogdGltZXJfZGF0YQorICAgICkgOgorICAgICAgICBtX2RldmljZShtaWNfZW5naW5lc1tpbmRleCAlIG1pY19lbmdpbmVzX3RvdGFsXSksCisgICAgICAgIG1faXNfbWFuZGF0b3J5KGlzX21hbmRhdG9yeSksCisgICAgICAgIG1faXNfb3Blbm1wKGlzX29wZW5tcCksCisgICAgICAgIG1faW5vdXRfYnVmKDApLAorICAgICAgICBtX2Z1bmNfZGVzYygwKSwKKyAgICAgICAgbV9mdW5jX2Rlc2Nfc2l6ZSgwKSwKKyAgICAgICAgbV9pbl9kZXBzKDApLAorICAgICAgICBtX2luX2RlcHNfdG90YWwoMCksCisgICAgICAgIG1fb3V0X2RlcHMoMCksCisgICAgICAgIG1fb3V0X2RlcHNfdG90YWwoMCksCisgICAgICAgIG1fdmFycygwKSwKKyAgICAgICAgbV92YXJzX2V4dHJhKDApLAorICAgICAgICBtX3N0YXR1cyhzdGF0dXMpLAorICAgICAgICBtX3RpbWVyX2RhdGEodGltZXJfZGF0YSkKKyAgICB7fQorCisgICAgfk9mZmxvYWREZXNjcmlwdG9yKCkKKyAgICB7CisgICAgICAgIGlmIChtX2luX2RlcHMgIT0gMCkgeworICAgICAgICAgICAgZnJlZShtX2luX2RlcHMpOworICAgICAgICB9CisgICAgICAgIGlmIChtX291dF9kZXBzICE9IDApIHsKKyAgICAgICAgICAgIGZyZWUobV9vdXRfZGVwcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fZnVuY19kZXNjICE9IDApIHsKKyAgICAgICAgICAgIGZyZWUobV9mdW5jX2Rlc2MpOworICAgICAgICB9CisgICAgICAgIGlmIChtX3ZhcnMgIT0gMCkgeworICAgICAgICAgICAgZnJlZShtX3ZhcnMpOworICAgICAgICAgICAgZnJlZShtX3ZhcnNfZXh0cmEpOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBvZmZsb2FkKGNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgaXNfZW1wdHksCisgICAgICAgICAgICAgICAgIFZhckRlc2MgKnZhcnMsIFZhckRlc2MyICp2YXJzMiwgaW50IHZhcnNfdG90YWwsCisgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKip3YWl0cywgaW50IG51bV93YWl0cywgY29uc3Qgdm9pZCAqKnNpZ25hbCwKKyAgICAgICAgICAgICAgICAgaW50IGVudHJ5X2lkLCBjb25zdCB2b2lkICpzdGFja19hZGRyKTsKKyAgICBib29sIG9mZmxvYWRfZmluaXNoKCk7CisKKyAgICBib29sIGlzX3NpZ25hbGVkKCk7CisKKyAgICBPZmZsb2FkSG9zdFRpbWVyRGF0YSogZ2V0X3RpbWVyX2RhdGEoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3RpbWVyX2RhdGE7CisgICAgfQorCitwcml2YXRlOgorICAgIGJvb2wgd2FpdF9kZXBlbmRlbmNpZXMoY29uc3Qgdm9pZCAqKndhaXRzLCBpbnQgbnVtX3dhaXRzKTsKKyAgICBib29sIHNldHVwX2Rlc2NyaXB0b3JzKFZhckRlc2MgKnZhcnMsIFZhckRlc2MyICp2YXJzMiwgaW50IHZhcnNfdG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW50cnlfaWQsIGNvbnN0IHZvaWQgKnN0YWNrX2FkZHIpOworICAgIGJvb2wgc2V0dXBfbWlzY19kYXRhKGNvbnN0IGNoYXIgKm5hbWUpOworICAgIGJvb2wgc2VuZF9wb2ludGVyX2RhdGEoYm9vbCBpc19hc3luYyk7CisgICAgYm9vbCBzZW5kX25vbmNvbnRpZ3VvdXNfcG9pbnRlcl9kYXRhKAorICAgICAgICBpbnQgaSwKKyAgICAgICAgUHRyRGF0YSogc3JjX2J1ZiwKKyAgICAgICAgUHRyRGF0YSogZHN0X2J1ZiwKKyAgICAgICAgQ09JRVZFTlQgKmV2ZW50KTsKKyAgICBib29sIHJlY2VpdmVfbm9uY29udGlndW91c19wb2ludGVyX2RhdGEoCisgICAgICAgIGludCBpLAorICAgICAgICBjaGFyKiBzcmNfZGF0YSwKKyAgICAgICAgQ09JQlVGRkVSIGRzdF9idWYsCisgICAgICAgIENPSUVWRU5UICpldmVudCk7CisKKyAgICBib29sIGdhdGhlcl9jb3B5aW5fZGF0YSgpOworCisgICAgYm9vbCBjb21wdXRlKCk7CisKKyAgICBib29sIHJlY2VpdmVfcG9pbnRlcl9kYXRhKGJvb2wgaXNfYXN5bmMpOworICAgIGJvb2wgc2NhdHRlcl9jb3B5b3V0X2RhdGEoKTsKKworICAgIHZvaWQgY2xlYW51cCgpOworCisgICAgYm9vbCBmaW5kX3B0cl9kYXRhKFB0ckRhdGEqICZwdHJfZGF0YSwgdm9pZCAqYmFzZSwgaW50NjRfdCBkaXNwLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGxlbmd0aCwgYm9vbCBlcnJvcl9kb2VzX25vdF9leGlzdCA9IHRydWUpOworICAgIGJvb2wgYWxsb2NfcHRyX2RhdGEoUHRyRGF0YSogJnB0cl9kYXRhLCB2b2lkICpiYXNlLCBpbnQ2NF90IGRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGxlbmd0aCwgaW50NjRfdCBhbGxvY19kaXNwLCBpbnQgYWxpZ24pOworICAgIGJvb2wgaW5pdF9zdGF0aWNfcHRyX2RhdGEoUHRyRGF0YSAqcHRyX2RhdGEpOworICAgIGJvb2wgaW5pdF9taWNfYWRkcmVzcyhQdHJEYXRhICpwdHJfZGF0YSk7CisgICAgYm9vbCBvZmZsb2FkX3N0YWNrX21lbW9yeV9tYW5hZ2VyKGNvbnN0IHZvaWQgKiBzdGFja19iZWdpbiwgaW50IHJvdXRpbmVfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZfc2l6ZSwgaW50IGFsaWduLCBib29sICppc19uZXcpOworICAgIGJvb2wgbnVsbGlmeV90YXJnZXRfc3RhY2soQ09JQlVGRkVSIHRhcmdfYnVmLCB1aW50NjRfdCBzaXplKTsKKworICAgIGJvb2wgZ2VuX3Zhcl9kZXNjc19mb3JfcG9pbnRlcl9hcnJheShpbnQgaSk7CisKKyAgICB2b2lkIHJlcG9ydF9jb2lfZXJyb3IoZXJyb3JfdHlwZXMgbXNnLCBDT0lSRVNVTFQgcmVzKTsKKyAgICBfT2ZmbG9hZF9yZXN1bHQgdHJhbnNsYXRlX2NvaV9lcnJvcihDT0lSRVNVTFQgcmVzKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIHN0ZDo6bGlzdDxDT0lCVUZGRVI+IEJ1ZmZlckxpc3Q7CisKKyAgICAvLyBleHRyYSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHZhcmlhYmxlIGRlc2NyaXB0b3IKKyAgICBzdHJ1Y3QgVmFyRXh0cmEgeworICAgICAgICBQdHJEYXRhKiBzcmNfZGF0YTsKKyAgICAgICAgUHRyRGF0YSogZHN0X2RhdGE7CisgICAgICAgIEF1dG9EYXRhKiBhdXRvX2RhdGE7CisgICAgICAgIGludDY0X3QgY3B1X2Rpc3A7CisgICAgICAgIGludDY0X3QgY3B1X29mZnNldDsKKyAgICAgICAgQ2VhblJlYWRSYW5nZXMgKnJlYWRfcm5nX3NyYzsKKyAgICAgICAgQ2VhblJlYWRSYW5nZXMgKnJlYWRfcm5nX2RzdDsKKyAgICAgICAgaW50NjRfdCBwdHJfYXJyX29mZnNldDsKKyAgICAgICAgYm9vbCBpc19hcnJfcHRyX2VsOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBSZWFkQXJyRWxlbWVudHMgeworICAgIHB1YmxpYzoKKyAgICAgICAgUmVhZEFyckVsZW1lbnRzKCk6CisgICAgICAgICAgICByYW5nZXMoTlVMTCksCisgICAgICAgICAgICBlbF9zaXplKHNpemVvZihUKSksCisgICAgICAgICAgICBvZmZzZXQoMCksCisgICAgICAgICAgICBjb3VudCgwKSwKKyAgICAgICAgICAgIGlzX2VtcHR5KHRydWUpLAorICAgICAgICAgICAgYmFzZShOVUxMKQorICAgICAgICB7fQorCisgICAgICAgIGJvb2wgcmVhZF9uZXh0KGJvb2wgZmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZsYWcgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChpc19lbXB0eSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWdldF9uZXh0X3JhbmdlKHJhbmdlcywgJm9mZnNldCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByYW5nZXMgYXJlIG92ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGNvbnRpZ3VvdXMgZWxlbWVudHMgYXJlIG92ZXIKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY291bnQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoX2N1ciA9IHNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gZWxfc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmFsID0gKFQpZ2V0X2VsX3ZhbHVlKGJhc2UsIG9mZnNldCwgZWxfc2l6ZSk7CisgICAgICAgICAgICAgICAgbGVuZ3RoX2N1ciAtPSBlbF9zaXplOworICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICAgICAgaXNfZW1wdHkgPSBsZW5ndGhfY3VyID09IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIHB1YmxpYzoKKyAgICAgICAgQ2VhblJlYWRSYW5nZXMgKiByYW5nZXM7CisgICAgICAgIFQgICAgICAgdmFsOworICAgICAgICBpbnQgICAgIGVsX3NpemU7CisgICAgICAgIGludDY0X3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgICAgbGVuZ3RoX2N1cjsKKyAgICAgICAgYm9vbCAgICBpc19lbXB0eTsKKyAgICAgICAgaW50ICAgICBjb3VudDsKKyAgICAgICAgY2hhciAgICpiYXNlOworICAgIH07CisKKyAgICAvLyBwdHJfZGF0YSBmb3IgcGVyc2lzdGVudCBhdXRvIG9iamVjdHMKKyAgICBQdHJEYXRhKiAgICBtX3N0YWNrX3B0cl9kYXRhOworICAgIFB0ckRhdGFMaXN0IG1fZGVzdHJveV9zdGFjazsKKworICAgIC8vIEVuZ2luZQorICAgIEVuZ2luZSYgbV9kZXZpY2U7CisKKyAgICAvLyBpZiB0cnVlIG9mZmxvYWQgaXMgbWFuZGF0b3J5CisgICAgYm9vbCBtX2lzX21hbmRhdG9yeTsKKworICAgIC8vIGlmIHRydWUgb2ZmbG9hZCBoYXMgb3Blbm1wIG9yaWdpbgorICAgIGNvbnN0IGJvb2wgbV9pc19vcGVubXA7CisKKyAgICAvLyBUaGUgTWFyc2hhbGxlciBmb3IgdGhlIGlucHV0cyBvZiB0aGUgb2ZmbG9hZGVkIHJlZ2lvbi4KKyAgICBNYXJzaGFsbGVyIG1faW47CisKKyAgICAvLyBUaGUgTWFyc2hhbGxlciBmb3IgdGhlIG91dHB1dHMgb2YgdGhlIG9mZmxvYWRlZCByZWdpb24uCisgICAgTWFyc2hhbGxlciBtX291dDsKKworICAgIC8vIExpc3Qgb2YgYnVmZmVycyB0aGF0IGFyZSBwYXNzZWQgdG8gZGlzcGF0Y2ggY2FsbAorICAgIEJ1ZmZlckxpc3QgbV9jb21wdXRlX2J1ZmZlcnM7CisKKyAgICAvLyBMaXN0IG9mIGJ1ZmZlcnMgdGhhdCBuZWVkIHRvIGJlIGRlc3Ryb3llZCBhdCB0aGUgZW5kIG9mIG9mZmxvYWQKKyAgICBCdWZmZXJMaXN0IG1fZGVzdHJveV9idWZmZXJzOworCisgICAgLy8gVmFyaWFibGUgZGVzY3JpcHRvcnMKKyAgICBWYXJEZXNjKiAgbV92YXJzOworICAgIFZhckV4dHJhKiBtX3ZhcnNfZXh0cmE7CisgICAgaW50ICAgICAgIG1fdmFyc190b3RhbDsKKworICAgIC8vIFBvaW50ZXIgdG8gYSB1c2VyLXNwZWNpZmllZCBzdGF0dXMgdmFyaWFibGUKKyAgICBfT2ZmbG9hZF9zdGF0dXMgKm1fc3RhdHVzOworCisgICAgLy8gRnVuY3Rpb24gZGVzY3JpcHRvcgorICAgIEZ1bmN0aW9uRGVzY3JpcHRvciogbV9mdW5jX2Rlc2M7CisgICAgdWludDMyX3QgICAgICAgICAgICBtX2Z1bmNfZGVzY19zaXplOworCisgICAgLy8gQnVmZmVyIGZvciB0cmFuc2ZlcnJpbmcgY29weWluL2NvcHlvdXQgZGF0YQorICAgIENPSUJVRkZFUiBtX2lub3V0X2J1ZjsKKworICAgIC8vIERlcGVuZGVuY2llcworICAgIENPSUVWRU5UICptX2luX2RlcHM7CisgICAgdWludDMyX3QgIG1faW5fZGVwc190b3RhbDsKKyAgICBDT0lFVkVOVCAqbV9vdXRfZGVwczsKKyAgICB1aW50MzJfdCAgbV9vdXRfZGVwc190b3RhbDsKKworICAgIC8vIFRpbWVyIGRhdGEKKyAgICBPZmZsb2FkSG9zdFRpbWVyRGF0YSAqbV90aW1lcl9kYXRhOworCisgICAgLy8gY29weWluL2NvcHlvdXQgZGF0YSBsZW5ndGgKKyAgICB1aW50NjRfdCBtX2luX2RhdGFsZW47CisgICAgdWludDY0X3QgbV9vdXRfZGF0YWxlbjsKKworICAgIC8vIGEgYm9vbGVhbiB2YWx1ZSBjYWxjdWxhdGVkIGluIHNldHVwX2Rlc2NyaXB0b3JzLiBJZiB0cnVlIHdlIG5lZWQgdG8gZG8KKyAgICAvLyBhIHJ1biBmdW5jdGlvbiBvbiB0aGUgdGFyZ2V0LiBPdGhlcndpc2UgaXQgbWF5IGJlIG9wdGltaXplZCBhd2F5LgorICAgIGJvb2wgbV9uZWVkX3J1bmZ1bmN0aW9uOworfTsKKworLy8gSW5pdGlhbGl6YXRpb24gdHlwZXMgZm9yIE1JQworZW51bSBPZmZsb2FkSW5pdFR5cGUgeworICAgIGNfaW5pdF9vbl9zdGFydCwgICAgICAgICAvLyBhbGwgZGV2aWNlcyBiZWZvcmUgZW50ZXJpbmcgbWFpbgorICAgIGNfaW5pdF9vbl9vZmZsb2FkLCAgICAgICAvLyBzaW5nbGUgZGV2aWNlIGJlZm9yZSBzdGFydGluZyB0aGUgZmlyc3Qgb2ZmbG9hZAorICAgIGNfaW5pdF9vbl9vZmZsb2FkX2FsbCAgICAvLyBhbGwgZGV2aWNlcyBiZWZvcmUgc3RhcnRpbmcgdGhlIGZpcnN0IG9mZmxvYWQKK307CisKKy8vIEluaXRpYWxpemVzIGxpYnJhcnkgYW5kIHJlZ2lzdGVycyBzcGVjaWZpZWQgb2ZmbG9hZCBpbWFnZS4KK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfcmVnaXN0ZXJfaW1hZ2UoY29uc3Qgdm9pZCogaW1hZ2UpOworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF91bnJlZ2lzdGVyX2ltYWdlKGNvbnN0IHZvaWQqIGltYWdlKTsKKworLy8gSW5pdGlhbGl6ZXMgb2ZmbG9hZCBydW50aW1lIGxpYnJhcnkuCitleHRlcm4gaW50IF9fb2ZmbG9hZF9pbml0X2xpYnJhcnkodm9pZCk7CisKKy8vIHRocmVhZCBkYXRhIGZvciBhc3NvY2lhdGluZyBwaXBlbGluZXMgd2l0aCB0aHJlYWRzCitleHRlcm4gcHRocmVhZF9rZXlfdCBtaWNfdGhyZWFkX2tleTsKKworLy8gRW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBkZXZpY2VzCitleHRlcm4gTWljRW52VmFyIG1pY19lbnZfdmFyczsKKworLy8gQ1BVIGZyZXF1ZW5jeQorZXh0ZXJuIHVpbnQ2NF90IGNwdV9mcmVxdWVuY3k7CisKKy8vIExEX0xJQlJBUllfUEFUSCBmb3IgTUlDIGxpYnJhcmllcworZXh0ZXJuIGNoYXIqIG1pY19saWJyYXJ5X3BhdGg7CisKKy8vIHN0YWNrIHNpemUgZm9yIHRhcmdldAorZXh0ZXJuIHVpbnQzMl90IG1pY19zdGFja19zaXplOworCisvLyBQcmVhbGxvY2F0ZWQgbWVtb3J5IHNpemUgZm9yIGJ1ZmZlcnMgb24gTUlDCitleHRlcm4gdWludDY0X3QgbWljX2J1ZmZlcl9zaXplOworCisvLyBTZXR0aW5nIGNvbnRyb2xsaW5nIGlub3V0IHByb3h5CitleHRlcm4gYm9vbCAgbWljX3Byb3h5X2lvOworZXh0ZXJuIGNoYXIqIG1pY19wcm94eV9mc19yb290OworCisvLyBUaHJlc2hvbGQgZm9yIGNyZWF0aW5nIGJ1ZmZlcnMgd2l0aCBsYXJnZSBwYWdlcworZXh0ZXJuIHVpbnQ2NF90IF9fb2ZmbG9hZF91c2VfMm1iX2J1ZmZlcnM7CisKKy8vIG9mZmxvYWQgaW5pdGlhbGl6YXRpb24gdHlwZQorZXh0ZXJuIE9mZmxvYWRJbml0VHlwZSBfX29mZmxvYWRfaW5pdF90eXBlOworCisvLyBEZXZpY2UgbnVtYmVyIHRvIG9mZmxvYWQgdG8gd2hlbiBkZXZpY2UgaXMgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkLgorZXh0ZXJuIGludCBfX29tcF9kZXZpY2VfbnVtOworCisvLyB0YXJnZXQgZXhlY3V0YWJsZQorZXh0ZXJuIFRhcmdldEltYWdlKiBfX3RhcmdldF9leGU7CisKKy8vIElEQiBzdXBwb3J0CisKKy8vIENhbGxlZCBieSB0aGUgb2ZmbG9hZCBydW50aW1lIGFmdGVyIGluaXRpYWxpemF0aW9uIG9mIG9mZmxvYWQgaW5mcmFzdHJ1Y3R1cmUKKy8vIGhhcyBiZWVuIGNvbXBsZXRlZC4KK2V4dGVybiAiQyIgdm9pZCAgX19kYmdfdGFyZ2V0X3NvX2xvYWRlZCgpOworCisvLyBDYWxsZWQgYnkgdGhlIG9mZmxvYWQgcnVudGltZSB3aGVuIHRoZSBvZmZsb2FkIGluZnJhc3RydWN0dXJlIGlzIGFib3V0IHRvIGJlCisvLyBzaHV0IGRvd24sIGN1cnJlbnRseSBhdCBhcHBsaWNhdGlvbiBleGl0LgorZXh0ZXJuICJDIiB2b2lkICBfX2RiZ190YXJnZXRfc29fdW5sb2FkZWQoKTsKKworLy8gTnVsbC10ZXJtaW5hdGVkIHN0cmluZyBjb250YWluaW5nIHBhdGggdG8gdGhlIHByb2Nlc3MgaW1hZ2Ugb2YgdGhlIGhvc3RpbmcKKy8vIGFwcGxpY2F0aW9uIChvZmZsb2FkX21haW4pCisjZGVmaW5lIE1BWF9UQVJHRVRfTkFNRSA1MTIKK2V4dGVybiAiQyIgY2hhciAgX19kYmdfdGFyZ2V0X2V4ZV9uYW1lW01BWF9UQVJHRVRfTkFNRV07CisKKy8vIEludGVnZXIgc3BlY2lmeWluZyB0aGUgcHJvY2VzcyBpZAorZXh0ZXJuICJDIiBwaWRfdCBfX2RiZ190YXJnZXRfc29fcGlkOworCisvLyBJbnRlZ2VyIHNwZWNpZnlpbmcgdGhlIDAtYmFzZWQgZGV2aWNlIG51bWJlcgorZXh0ZXJuICJDIiBpbnQgICBfX2RiZ190YXJnZXRfaWQ7CisKKy8vIFNldCB0byBub24temVybyBieSB0aGUgaG9zdC1zaWRlIGRlYnVnZ2VyIHRvIGVuYWJsZSBvZmZsb2FkIGRlYnVnZ2luZworLy8gc3VwcG9ydAorZXh0ZXJuICJDIiBpbnQgICBfX2RiZ19pc19hdHRhY2hlZDsKKworLy8gTWFqb3IgdmVyc2lvbiBvZiB0aGUgZGVidWdnZXIgc3VwcG9ydCBBUEkKK2V4dGVybiAiQyIgY29uc3QgaW50IF9fZGJnX2FwaV9tYWpvcl92ZXJzaW9uOworCisvLyBNaW5vciB2ZXJzaW9uIG9mIHRoZSBkZWJ1Z2dlciBzdXBwb3J0IEFQSQorZXh0ZXJuICJDIiBjb25zdCBpbnQgX19kYmdfYXBpX21pbm9yX3ZlcnNpb247CisKKyNlbmRpZiAvLyBPRkZMT0FEX0hPU1RfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9teW9faG9zdC5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX215b19ob3N0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTFjMTg2Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9teW9faG9zdC5jcHAKQEAgLTAsMCArMSw4MDUgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgIm9mZmxvYWRfbXlvX2hvc3QuaCIKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgIm9mZmxvYWRfaG9zdC5oIgorCisjaWYgZGVmaW5lZChMSU5VWCkgfHwgZGVmaW5lZChGUkVFQlNEKQorI2luY2x1ZGUgPG1tX21hbGxvYy5oPgorI2VuZGlmCisKKyNkZWZpbmUgTVlPX1ZFUlNJT04xICAgICJNWU9fMS4wIgorCitleHRlcm4gIkMiIHZvaWQgX19jaWxrcnRzX2NpbGtfZm9yXzMyKHZvaWQqLCB2b2lkKiwgdWludDMyX3QsIGludDMyX3QpOworZXh0ZXJuICJDIiB2b2lkIF9fY2lsa3J0c19jaWxrX2Zvcl82NCh2b2lkKiwgdm9pZCosIHVpbnQ2NF90LCBpbnQzMl90KTsKKworI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyNwcmFnbWEgd2VhayBfX2NpbGtydHNfY2lsa19mb3JfMzIKKyNwcmFnbWEgd2VhayBfX2NpbGtydHNfY2lsa19mb3JfNjQKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworI2lmZGVmIFRBUkdFVF9XSU5OVAorI2RlZmluZSBNWU9fVEFCTEVfRU5EX01BUktFUigpIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KC0xKQorI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisjZGVmaW5lIE1ZT19UQUJMRV9FTkRfTUFSS0VSKCkgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oMCkKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworY2xhc3MgTXlvV3JhcHBlciB7CitwdWJsaWM6CisgICAgTXlvV3JhcHBlcigpIDogbV9saWJfaGFuZGxlKDApLCBtX2lzX2F2YWlsYWJsZShmYWxzZSkKKyAgICB7fQorCisgICAgYm9vbCBpc19hdmFpbGFibGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX2lzX2F2YWlsYWJsZTsKKyAgICB9CisKKyAgICBib29sIExvYWRMaWJyYXJ5KHZvaWQpOworCisgICAgLy8gdW5sb2FkcyB0aGUgbGlicmFyeQorICAgIHZvaWQgVW5sb2FkTGlicmFyeSh2b2lkKSB7CisvLyAgICAgICAgaWYgKG1fbGliX2hhbmRsZSAhPSAwKSB7CisvLyAgICAgICAgICAgIERMX2Nsb3NlKG1fbGliX2hhbmRsZSk7CisvLyAgICAgICAgICAgIG1fbGliX2hhbmRsZSA9IDA7CisvLyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFdyYXBwZXJzIGZvciBNWU8gY2xpZW50IGZ1bmN0aW9ucworICAgIHZvaWQgTGliSW5pdCh2b2lkICphcmcsIHZvaWQgKmZ1bmMpIGNvbnN0IHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDQsIDAsIGNfb2ZmbG9hZF9teW9pbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCVwLCAlcClcbiIsIF9fZnVuY19fLCBhcmcsIGZ1bmMpOworICAgICAgICBDaGVja1Jlc3VsdChfX2Z1bmNfXywgbV9saWJfaW5pdChhcmcsIGZ1bmMpKTsKKyAgICB9CisKKyAgICB2b2lkIExpYkZpbmkodm9pZCkgY29uc3QgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoNCwgMCwgY19vZmZsb2FkX215b2ZpbmksICIlcygpXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgIG1fbGliX2ZpbmkoKTsKKyAgICB9CisKKyAgICB2b2lkKiBTaGFyZWRNYWxsb2Moc2l6ZV90IHNpemUpIGNvbnN0IHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDQsIDAsIGNfb2ZmbG9hZF9teW9zaGFyZWRtYWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoJWxsZClcbiIsIF9fZnVuY19fLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIG1fc2hhcmVkX21hbGxvYyhzaXplKTsKKyAgICB9CisKKyAgICB2b2lkIFNoYXJlZEZyZWUodm9pZCAqcHRyKSBjb25zdCB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSg0LCAwLCBjX29mZmxvYWRfbXlvc2hhcmVkZnJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyglcClcbiIsIF9fZnVuY19fLCBwdHIpOworICAgICAgICBtX3NoYXJlZF9mcmVlKHB0cik7CisgICAgfQorCisgICAgdm9pZCogU2hhcmVkQWxpZ25lZE1hbGxvYyhzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWduKSBjb25zdCB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSg0LCAwLCBjX29mZmxvYWRfbXlvc2hhcmVkYWxpZ25lZG1hbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyglbGxkLCAlbGxkKVxuIiwgX19mdW5jX18sIHNpemUsIGFsaWduKTsKKyAgICAgICAgcmV0dXJuIG1fc2hhcmVkX2FsaWduZWRfbWFsbG9jKHNpemUsIGFsaWduKTsKKyAgICB9CisKKyAgICB2b2lkIFNoYXJlZEFsaWduZWRGcmVlKHZvaWQgKnB0cikgY29uc3QgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoNCwgMCwgY19vZmZsb2FkX215b3NoYXJlZGFsaWduZWRmcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCVwKVxuIiwgX19mdW5jX18sIHB0cik7CisgICAgICAgIG1fc2hhcmVkX2FsaWduZWRfZnJlZShwdHIpOworICAgIH0KKworICAgIHZvaWQgQWNxdWlyZSh2b2lkKSBjb25zdCB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSg0LCAwLCBjX29mZmxvYWRfbXlvYWNxdWlyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcygpXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgIENoZWNrUmVzdWx0KF9fZnVuY19fLCBtX2FjcXVpcmUoKSk7CisgICAgfQorCisgICAgdm9pZCBSZWxlYXNlKHZvaWQpIGNvbnN0IHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDQsIDAsIGNfb2ZmbG9hZF9teW9yZWxlYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcygpXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgIENoZWNrUmVzdWx0KF9fZnVuY19fLCBtX3JlbGVhc2UoKSk7CisgICAgfQorCisgICAgdm9pZCBIb3N0VmFyVGFibGVQcm9wYWdhdGUodm9pZCAqdGFibGUsIGludCBudW1fZW50cmllcykgY29uc3QgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDQsICIlcyglcCwgJWQpXG4iLCBfX2Z1bmNfXywgdGFibGUsIG51bV9lbnRyaWVzKTsKKyAgICAgICAgQ2hlY2tSZXN1bHQoX19mdW5jX18sIG1faG9zdF92YXJfdGFibGVfcHJvcGFnYXRlKHRhYmxlLCBudW1fZW50cmllcykpOworICAgIH0KKworICAgIHZvaWQgSG9zdEZwdHJUYWJsZVJlZ2lzdGVyKHZvaWQgKnRhYmxlLCBpbnQgbnVtX2VudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9yZGVyZWQpIGNvbnN0IHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDQsIDAsIGNfb2ZmbG9hZF9teW9yZWdpc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoJXAsICVkLCAlZClcbiIsIF9fZnVuY19fLCB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fZW50cmllcywgb3JkZXJlZCk7CisgICAgICAgIENoZWNrUmVzdWx0KF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICBtX2hvc3RfZnB0cl90YWJsZV9yZWdpc3Rlcih0YWJsZSwgbnVtX2VudHJpZXMsIG9yZGVyZWQpKTsKKyAgICB9CisKKyAgICB2b2lkIFJlbW90ZVRodW5rQ2FsbCh2b2lkICp0aHVuaywgdm9pZCAqYXJncywgaW50IGRldmljZSkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDQsICIlcyglcCwgJXAsICVkKVxuIiwgX19mdW5jX18sIHRodW5rLCBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7CisgICAgICAgIENoZWNrUmVzdWx0KF9fZnVuY19fLCBtX3JlbW90ZV90aHVua19jYWxsKHRodW5rLCBhcmdzLCBkZXZpY2UpKTsKKyAgICB9CisKKyAgICBNeW9pUkZ1bmNDYWxsSGFuZGxlIFJlbW90ZUNhbGwoY2hhciAqZnVuYywgdm9pZCAqYXJncywgaW50IGRldmljZSkgY29uc3QgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDQsICIlcyglcywgJXAsICVkKVxuIiwgX19mdW5jX18sIGZ1bmMsIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKKyAgICAgICAgcmV0dXJuIG1fcmVtb3RlX2NhbGwoZnVuYywgYXJncywgZGV2aWNlKTsKKyAgICB9CisKKyAgICB2b2lkIEdldFJlc3VsdChNeW9pUkZ1bmNDYWxsSGFuZGxlIGhhbmRsZSkgY29uc3QgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDQsICIlcyglcClcbiIsIF9fZnVuY19fLCBoYW5kbGUpOworICAgICAgICBDaGVja1Jlc3VsdChfX2Z1bmNfXywgbV9nZXRfcmVzdWx0KGhhbmRsZSkpOworICAgIH0KKworcHJpdmF0ZToKKyAgICB2b2lkIENoZWNrUmVzdWx0KGNvbnN0IGNoYXIgKmZ1bmMsIE15b0Vycm9yIGVycm9yKSBjb25zdCB7CisgICAgICAgIGlmIChlcnJvciAhPSBNWU9fU1VDQ0VTUykgeworICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19teW93cmFwcGVyX2NoZWNrcmVzdWx0LCBmdW5jLCBlcnJvcik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIHZvaWQqIG1fbGliX2hhbmRsZTsKKyAgICBib29sICBtX2lzX2F2YWlsYWJsZTsKKworICAgIC8vIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBmcm9tIG15byBsaWJyYXJ5CisgICAgTXlvRXJyb3IgKCptX2xpYl9pbml0KSh2b2lkKiwgdm9pZCopOworICAgIHZvaWQgICAgICgqbV9saWJfZmluaSkodm9pZCk7CisgICAgdm9pZCogICAgKCptX3NoYXJlZF9tYWxsb2MpKHNpemVfdCk7CisgICAgdm9pZCAgICAgKCptX3NoYXJlZF9mcmVlKSh2b2lkKik7CisgICAgdm9pZCogICAgKCptX3NoYXJlZF9hbGlnbmVkX21hbGxvYykoc2l6ZV90LCBzaXplX3QpOworICAgIHZvaWQgICAgICgqbV9zaGFyZWRfYWxpZ25lZF9mcmVlKSh2b2lkKik7CisgICAgTXlvRXJyb3IgKCptX2FjcXVpcmUpKHZvaWQpOworICAgIE15b0Vycm9yICgqbV9yZWxlYXNlKSh2b2lkKTsKKyAgICBNeW9FcnJvciAoKm1faG9zdF92YXJfdGFibGVfcHJvcGFnYXRlKSh2b2lkKiwgaW50KTsKKyAgICBNeW9FcnJvciAoKm1faG9zdF9mcHRyX3RhYmxlX3JlZ2lzdGVyKSh2b2lkKiwgaW50LCBpbnQpOworICAgIE15b0Vycm9yICgqbV9yZW1vdGVfdGh1bmtfY2FsbCkodm9pZCosIHZvaWQqLCBpbnQpOworICAgIE15b2lSRnVuY0NhbGxIYW5kbGUgKCptX3JlbW90ZV9jYWxsKShjaGFyKiwgdm9pZCosIGludCk7CisgICAgTXlvRXJyb3IgKCptX2dldF9yZXN1bHQpKE15b2lSRnVuY0NhbGxIYW5kbGUpOworfTsKKworYm9vbCBNeW9XcmFwcGVyOjpMb2FkTGlicmFyeSh2b2lkKQoreworI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyAgICBjb25zdCBjaGFyICpsaWJfbmFtZSA9ICJsaWJteW8tY2xpZW50LnNvIjsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgIGNvbnN0IGNoYXIgKmxpYl9uYW1lID0gIm15by1jbGllbnQuZGxsIjsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkxvYWRpbmcgTVlPIGxpYnJhcnkgJXMgLi4uXG4iLCBsaWJfbmFtZSk7CisKKyAgICBtX2xpYl9oYW5kbGUgPSBETF9vcGVuKGxpYl9uYW1lKTsKKyAgICBpZiAobV9saWJfaGFuZGxlID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGxvYWQgdGhlIGxpYnJhcnkuIGVycm5vID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm8pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9saWJfaW5pdCA9IChNeW9FcnJvciAoKikodm9pZCosIHZvaWQqKSkKKyAgICAgICAgRExfc3ltKG1fbGliX2hhbmRsZSwgIm15b2lMaWJJbml0IiwgTVlPX1ZFUlNJT04xKTsKKyAgICBpZiAobV9saWJfaW5pdCA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIE1ZTyBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteW9pTGliSW5pdCIpOworICAgICAgICBVbmxvYWRMaWJyYXJ5KCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX2xpYl9maW5pID0gKHZvaWQgKCopKHZvaWQpKQorICAgICAgICBETF9zeW0obV9saWJfaGFuZGxlLCAibXlvaUxpYkZpbmkiLCBNWU9fVkVSU0lPTjEpOworICAgIGlmIChtX2xpYl9maW5pID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gTVlPIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15b2lMaWJGaW5pIik7CisgICAgICAgIFVubG9hZExpYnJhcnkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fc2hhcmVkX21hbGxvYyA9ICh2b2lkKiAoKikoc2l6ZV90KSkKKyAgICAgICAgRExfc3ltKG1fbGliX2hhbmRsZSwgIm15b1NoYXJlZE1hbGxvYyIsIE1ZT19WRVJTSU9OMSk7CisgICAgaWYgKG1fc2hhcmVkX21hbGxvYyA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIE1ZTyBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteW9TaGFyZWRNYWxsb2MiKTsKKyAgICAgICAgVW5sb2FkTGlicmFyeSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9zaGFyZWRfZnJlZSA9ICh2b2lkICgqKSh2b2lkKikpCisgICAgICAgIERMX3N5bShtX2xpYl9oYW5kbGUsICJteW9TaGFyZWRGcmVlIiwgTVlPX1ZFUlNJT04xKTsKKyAgICBpZiAobV9zaGFyZWRfZnJlZSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIE1ZTyBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteW9TaGFyZWRGcmVlIik7CisgICAgICAgIFVubG9hZExpYnJhcnkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fc2hhcmVkX2FsaWduZWRfbWFsbG9jID0gKHZvaWQqICgqKShzaXplX3QsIHNpemVfdCkpCisgICAgICAgIERMX3N5bShtX2xpYl9oYW5kbGUsICJteW9TaGFyZWRBbGlnbmVkTWFsbG9jIiwgTVlPX1ZFUlNJT04xKTsKKyAgICBpZiAobV9zaGFyZWRfYWxpZ25lZF9tYWxsb2MgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBNWU8gbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXlvU2hhcmVkQWxpZ25lZE1hbGxvYyIpOworICAgICAgICBVbmxvYWRMaWJyYXJ5KCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX3NoYXJlZF9hbGlnbmVkX2ZyZWUgPSAodm9pZCAoKikodm9pZCopKQorICAgICAgICBETF9zeW0obV9saWJfaGFuZGxlLCAibXlvU2hhcmVkQWxpZ25lZEZyZWUiLCBNWU9fVkVSU0lPTjEpOworICAgIGlmIChtX3NoYXJlZF9hbGlnbmVkX2ZyZWUgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBNWU8gbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXlvU2hhcmVkQWxpZ25lZEZyZWUiKTsKKyAgICAgICAgVW5sb2FkTGlicmFyeSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9hY3F1aXJlID0gKE15b0Vycm9yICgqKSh2b2lkKSkKKyAgICAgICAgRExfc3ltKG1fbGliX2hhbmRsZSwgIm15b0FjcXVpcmUiLCBNWU9fVkVSU0lPTjEpOworICAgIGlmIChtX2FjcXVpcmUgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBNWU8gbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXlvQWNxdWlyZSIpOworICAgICAgICBVbmxvYWRMaWJyYXJ5KCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX3JlbGVhc2UgPSAoTXlvRXJyb3IgKCopKHZvaWQpKQorICAgICAgICBETF9zeW0obV9saWJfaGFuZGxlLCAibXlvUmVsZWFzZSIsIE1ZT19WRVJTSU9OMSk7CisgICAgaWYgKG1fcmVsZWFzZSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIE1ZTyBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteW9SZWxlYXNlIik7CisgICAgICAgIFVubG9hZExpYnJhcnkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1faG9zdF92YXJfdGFibGVfcHJvcGFnYXRlID0gKE15b0Vycm9yICgqKSh2b2lkKiwgaW50KSkKKyAgICAgICAgRExfc3ltKG1fbGliX2hhbmRsZSwgIm15b2lIb3N0VmFyVGFibGVQcm9wYWdhdGUiLCBNWU9fVkVSU0lPTjEpOworICAgIGlmIChtX2hvc3RfdmFyX3RhYmxlX3Byb3BhZ2F0ZSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIE1ZTyBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteW9pSG9zdFZhclRhYmxlUHJvcGFnYXRlIik7CisgICAgICAgIFVubG9hZExpYnJhcnkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1faG9zdF9mcHRyX3RhYmxlX3JlZ2lzdGVyID0gKE15b0Vycm9yICgqKSh2b2lkKiwgaW50LCBpbnQpKQorICAgICAgICBETF9zeW0obV9saWJfaGFuZGxlLCAibXlvaUhvc3RGcHRyVGFibGVSZWdpc3RlciIsIE1ZT19WRVJTSU9OMSk7CisgICAgaWYgKG1faG9zdF9mcHRyX3RhYmxlX3JlZ2lzdGVyID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gTVlPIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15b2lIb3N0RnB0clRhYmxlUmVnaXN0ZXIiKTsKKyAgICAgICAgVW5sb2FkTGlicmFyeSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9yZW1vdGVfdGh1bmtfY2FsbCA9IChNeW9FcnJvciAoKikodm9pZCosIHZvaWQqLCBpbnQpKQorICAgICAgICBETF9zeW0obV9saWJfaGFuZGxlLCAibXlvaVJlbW90ZVRodW5rQ2FsbCIsIE1ZT19WRVJTSU9OMSk7CisgICAgaWYgKG1fcmVtb3RlX3RodW5rX2NhbGwgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBNWU8gbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXlvaVJlbW90ZVRodW5rQ2FsbCIpOworICAgICAgICBVbmxvYWRMaWJyYXJ5KCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX3JlbW90ZV9jYWxsID0gKE15b2lSRnVuY0NhbGxIYW5kbGUgKCopKGNoYXIqLCB2b2lkKiwgaW50KSkKKyAgICAgICAgRExfc3ltKG1fbGliX2hhbmRsZSwgIm15b2lSZW1vdGVDYWxsIiwgTVlPX1ZFUlNJT04xKTsKKyAgICBpZiAobV9yZW1vdGVfY2FsbCA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIE1ZTyBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteW9pUmVtb3RlQ2FsbCIpOworICAgICAgICBVbmxvYWRMaWJyYXJ5KCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX2dldF9yZXN1bHQgPSAoTXlvRXJyb3IgKCopKE15b2lSRnVuY0NhbGxIYW5kbGUpKQorICAgICAgICBETF9zeW0obV9saWJfaGFuZGxlLCAibXlvaUdldFJlc3VsdCIsIE1ZT19WRVJTSU9OMSk7CisgICAgaWYgKG1fZ2V0X3Jlc3VsdCA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIE1ZTyBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteW9pR2V0UmVzdWx0Iik7CisgICAgICAgIFVubG9hZExpYnJhcnkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIlRoZSBsaWJyYXJ5IHdhcyBzdWNjZXNzZnVsbHkgbG9hZGVkXG4iKTsKKworICAgIG1faXNfYXZhaWxhYmxlID0gdHJ1ZTsKKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBteW9faXNfYXZhaWxhYmxlOworc3RhdGljIE15b1dyYXBwZXIgbXlvX3dyYXBwZXI7CisKK3N0cnVjdCBNeW9UYWJsZQoreworICAgIE15b1RhYmxlKFNoYXJlZFRhYmxlRW50cnkgKnRhYiwgaW50IGxlbikgOiB2YXJfdGFiKHRhYiksIHZhcl90YWJfbGVuKGxlbikKKyAgICB7fQorCisgICAgU2hhcmVkVGFibGVFbnRyeSogICB2YXJfdGFiOworICAgIGludCAgICAgICAgICAgICAgICAgdmFyX3RhYl9sZW47Cit9OworCit0eXBlZGVmIHN0ZDo6bGlzdDxNeW9UYWJsZT4gTXlvVGFibGVMaXN0Oworc3RhdGljIE15b1RhYmxlTGlzdCBfX215b190YWJsZV9saXN0Oworc3RhdGljIG11dGV4X3QgICAgICBfX215b190YWJsZV9sb2NrOworc3RhdGljIGJvb2wgICAgICAgICBfX215b190YWJsZXMgPSBmYWxzZTsKKworc3RhdGljIHZvaWQgX19vZmZsb2FkX215b19zaGFyZWRfdGFibGVfcmVnaXN0ZXIoU2hhcmVkVGFibGVFbnRyeSAqZW50cnkpOworc3RhdGljIHZvaWQgX19vZmZsb2FkX215b19zaGFyZWRfaW5pdF90YWJsZV9yZWdpc3RlcihJbml0VGFibGVFbnRyeSogZW50cnkpOworc3RhdGljIHZvaWQgX19vZmZsb2FkX215b19mcHRyX3RhYmxlX3JlZ2lzdGVyKEZwdHJUYWJsZUVudHJ5ICplbnRyeSk7CisKK3N0YXRpYyB2b2lkIF9fb2ZmbG9hZF9teW9Mb2FkTGlicmFyeV9vbmNlKHZvaWQpCit7CisgICAgaWYgKF9fb2ZmbG9hZF9pbml0X2xpYnJhcnkoKSkgeworICAgICAgICBteW9fd3JhcHBlci5Mb2FkTGlicmFyeSgpOworICAgIH0KK30KKworc3RhdGljIGJvb2wgX19vZmZsb2FkX215b0xvYWRMaWJyYXJ5KHZvaWQpCit7CisgICAgc3RhdGljIE9mZmxvYWRPbmNlQ29udHJvbCBjdHJsID0gT0ZGTE9BRF9PTkNFX0NPTlRST0xfSU5JVDsKKyAgICBfX29mZmxvYWRfcnVuX29uY2UoJmN0cmwsIF9fb2ZmbG9hZF9teW9Mb2FkTGlicmFyeV9vbmNlKTsKKworICAgIHJldHVybiBteW9fd3JhcHBlci5pc19hdmFpbGFibGUoKTsKK30KKworc3RhdGljIHZvaWQgX19vZmZsb2FkX215b0luaXRfb25jZSh2b2lkKQoreworICAgIGlmICghX19vZmZsb2FkX215b0xvYWRMaWJyYXJ5KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGluaXRpYWxpemUgYWxsIGRldmljZXMKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pY19lbmdpbmVzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgbWljX2VuZ2luZXNbaV0uaW5pdCgpOworICAgIH0KKworICAgIC8vIGxvYWQgYW5kIGluaXRpYWxpemUgTVlPIGxpYnJhcnkKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJJbml0aWFsaXppbmcgTVlPIGxpYnJhcnkgLi4uXG4iKTsKKworICAgIENPSUVWRU5UIGV2ZW50c1tNSUNfRU5HSU5FU19NQVhdOworICAgIE15b2lVc2VyUGFyYW1zIHBhcmFtc1tNSUNfRU5HSU5FU19NQVgrMV07CisKKyAgICAvLyBsb2FkIHRhcmdldCBsaWJyYXJ5IHRvIGFsbCBkZXZpY2VzCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaWNfZW5naW5lc190b3RhbDsgaSsrKSB7CisgICAgICAgIG1pY19lbmdpbmVzW2ldLmluaXRfbXlvKCZldmVudHNbaV0pOworCisgICAgICAgIHBhcmFtc1tpXS50eXBlID0gTVlPSV9VU0VSUEFSQU1TX0RFVklEOworICAgICAgICBwYXJhbXNbaV0ubm9kZWlkID0gbWljX2VuZ2luZXNbaV0uZ2V0X3BoeXNpY2FsX2luZGV4KCkgKyAxOworICAgIH0KKworICAgIHBhcmFtc1ttaWNfZW5naW5lc190b3RhbF0udHlwZSA9IE1ZT0lfVVNFUlBBUkFNU19MQVNUX01TRzsKKworICAgIC8vIGluaXRpYWxpemUgbXlvIHJ1bnRpbWUgb24gaG9zdAorICAgIG15b193cmFwcGVyLkxpYkluaXQocGFyYW1zLCAwKTsKKworICAgIC8vIHdhaXQgZm9yIHRoZSB0YXJnZXQgaW5pdCBjYWxscyB0byBmaW5pc2gKKyAgICBDT0lSRVNVTFQgcmVzOworICAgIHJlcyA9IENPSTo6RXZlbnRXYWl0KG1pY19lbmdpbmVzX3RvdGFsLCBldmVudHMsIC0xLCAxLCAwLCAwKTsKKyAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19ldmVudF93YWl0LCByZXMpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIG15b19pc19hdmFpbGFibGUgPSB0cnVlOworCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiSW5pdGlhbGl6aW5nIE1ZTyBsaWJyYXJ5IC4uLiBkb25lXG4iKTsKK30KKworc3RhdGljIGJvb2wgX19vZmZsb2FkX215b0luaXQodm9pZCkKK3sKKyAgICBzdGF0aWMgT2ZmbG9hZE9uY2VDb250cm9sIGN0cmwgPSBPRkZMT0FEX09OQ0VfQ09OVFJPTF9JTklUOworICAgIF9fb2ZmbG9hZF9ydW5fb25jZSgmY3RybCwgX19vZmZsb2FkX215b0luaXRfb25jZSk7CisKKyAgICAvLyByZWdpc3RlciBwZW5kaW5nIHNoYXJlZCB2YXIgdGFibGVzCisgICAgaWYgKG15b19pc19hdmFpbGFibGUgJiYgX19teW9fdGFibGVzKSB7CisgICAgICAgIG11dGV4X2xvY2tlcl90IGxvY2tlcihfX215b190YWJsZV9sb2NrKTsKKworICAgICAgICBpZiAoX19teW9fdGFibGVzKSB7CisgICAgICAgICAgICAvLyAgUmVnaXN0ZXIgdGFibGVzIHdpdGggTVlPIHNvIGl0IGNhbiBwcm9wYWdhdGUgdG8gdGFyZ2V0LgorICAgICAgICAgICAgZm9yKE15b1RhYmxlTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBfX215b190YWJsZV9saXN0LmJlZ2luKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gX19teW9fdGFibGVfbGlzdC5lbmQoKTsgKytpdCkgeworI2lmZGVmIFRBUkdFVF9XSU5OVAorICAgICAgICAgICAgICAgIGZvciAoU2hhcmVkVGFibGVFbnRyeSAqZW50cnkgPSBpdC0+dmFyX3RhYjsKKyAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT52YXJOYW1lICE9IE1ZT19UQUJMRV9FTkRfTUFSS0VSKCk7IGVudHJ5KyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LT52YXJOYW1lID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG15b193cmFwcGVyLkhvc3RWYXJUYWJsZVByb3BhZ2F0ZShlbnRyeSwgMSk7CisgICAgICAgICAgICAgICAgfQorI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgICAgICAgICAgbXlvX3dyYXBwZXIuSG9zdFZhclRhYmxlUHJvcGFnYXRlKGl0LT52YXJfdGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC0+dmFyX3RhYl9sZW4pOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfX215b190YWJsZV9saXN0LmNsZWFyKCk7CisgICAgICAgICAgICBfX215b190YWJsZXMgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBteW9faXNfYXZhaWxhYmxlOworfQorCitzdGF0aWMgYm9vbCBzaGFyZWRfdGFibGVfZW50cmllcygKKyAgICBTaGFyZWRUYWJsZUVudHJ5ICplbnRyeQorKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVwKVxuIiwgX19mdW5jX18sIGVudHJ5KTsKKworICAgIGZvciAoOyBlbnRyeS0+dmFyTmFtZSAhPSBNWU9fVEFCTEVfRU5EX01BUktFUigpOyBlbnRyeSsrKSB7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIGlmIChlbnRyeS0+dmFyTmFtZSA9PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgZnB0cl90YWJsZV9lbnRyaWVzKAorICAgIEZwdHJUYWJsZUVudHJ5ICplbnRyeQorKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVwKVxuIiwgX19mdW5jX18sIGVudHJ5KTsKKworICAgIGZvciAoOyBlbnRyeS0+ZnVuY05hbWUgIT0gTVlPX1RBQkxFX0VORF9NQVJLRVIoKTsgZW50cnkrKykgeworI2lmZGVmIFRBUkdFVF9XSU5OVAorICAgICAgICBpZiAoZW50cnktPmZ1bmNOYW1lID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX215b1JlZ2lzdGVyVGFibGVzKAorICAgIEluaXRUYWJsZUVudHJ5KiBpbml0X3RhYmxlLAorICAgIFNoYXJlZFRhYmxlRW50cnkgKnNoYXJlZF90YWJsZSwKKyAgICBGcHRyVGFibGVFbnRyeSAqZnB0cl90YWJsZQorKQoreworICAgIC8vIGNoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byBpbml0aWFsaXplIE1ZTyBsaWJyYXJ5LiBJdCBpcworICAgIC8vIGluaXRpYWxpemVkIG9ubHkgaWYgYXQgbGVhc3Qgb25lIG15byB0YWJsZSBpcyBub3QgZW1wdHkKKyAgICBpZiAoc2hhcmVkX3RhYmxlX2VudHJpZXMoc2hhcmVkX3RhYmxlKSB8fCBmcHRyX3RhYmxlX2VudHJpZXMoZnB0cl90YWJsZSkpIHsKKyAgICAgICAgLy8gbWFrZSBzdXJlIG15byBsaWJyYXJ5IGlzIGxvYWRlZAorICAgICAgICBfX29mZmxvYWRfbXlvTG9hZExpYnJhcnkoKTsKKworICAgICAgICAvLyByZWdpc3RlciB0YWJsZXMKKyAgICAgICAgX19vZmZsb2FkX215b19zaGFyZWRfdGFibGVfcmVnaXN0ZXIoc2hhcmVkX3RhYmxlKTsKKyAgICAgICAgX19vZmZsb2FkX215b19mcHRyX3RhYmxlX3JlZ2lzdGVyKGZwdHJfdGFibGUpOworICAgICAgICBfX29mZmxvYWRfbXlvX3NoYXJlZF9pbml0X3RhYmxlX3JlZ2lzdGVyKGluaXRfdGFibGUpOworICAgIH0KK30KKwordm9pZCBfX29mZmxvYWRfbXlvRmluaSh2b2lkKQoreworICAgIGlmIChteW9faXNfYXZhaWxhYmxlKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKyAgICAgICAgQ09JRVZFTlQgZXZlbnRzW01JQ19FTkdJTkVTX01BWF07CisKKyAgICAgICAgLy8ga2ljayBvZmYgbXlvaUxpYkZpbmkgY2FsbHMgb24gYWxsIGRldmljZXMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaWNfZW5naW5lc190b3RhbDsgaSsrKSB7CisgICAgICAgICAgICBtaWNfZW5naW5lc1tpXS5maW5pX215bygmZXZlbnRzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNsZWFudXAgbXlvIHJ1bnRpbWUgb24gaG9zdAorICAgICAgICBteW9fd3JhcHBlci5MaWJGaW5pKCk7CisKKyAgICAgICAgLy8gd2FpdCBmb3IgdGhlIHRhcmdldCBmaW5pIGNhbGxzIHRvIGZpbmlzaAorICAgICAgICBDT0lSRVNVTFQgcmVzOworICAgICAgICByZXMgPSBDT0k6OkV2ZW50V2FpdChtaWNfZW5naW5lc190b3RhbCwgZXZlbnRzLCAtMSwgMSwgMCwgMCk7CisgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19ldmVudF93YWl0LCByZXMpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgX19vZmZsb2FkX215b19zaGFyZWRfdGFibGVfcmVnaXN0ZXIoCisgICAgU2hhcmVkVGFibGVFbnRyeSAqZW50cnkKKykKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcyglcClcbiIsIF9fZnVuY19fLCBlbnRyeSk7CisKKyAgICBTaGFyZWRUYWJsZUVudHJ5ICpzdGFydCA9IGVudHJ5OworICAgIGludCBlbnRyaWVzID0gMDsKKworICAgIC8vIGFsbG9jYXRlIHNoYXJlZCBtZW1vcnkgZm9yIHZhcnMKKyAgICBmb3IgKDsgZW50cnktPnZhck5hbWUgIT0gTVlPX1RBQkxFX0VORF9NQVJLRVIoKTsgZW50cnkrKykgeworI2lmZGVmIFRBUkdFVF9XSU5OVAorICAgICAgICBpZiAoZW50cnktPnZhck5hbWUgPT0gMCkgeworICAgICAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSg0LCAic2tpcCByZWdpc3RlcmluZyBhIE5VTEwgTXlvU2hhcmVkVGFibGUgZW50cnlcbiIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDQsICJyZWdpc3RlcmluZyBNeW9TaGFyZWRUYWJsZSBlbnRyeSBmb3IgJXMgQCVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT52YXJOYW1lLCBlbnRyeSk7CisKKyAgICAgICAgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiB0byBjcmVhdGUgc2hhcmVkIG1lbW9yeQorICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQoKikodm9pZCk+KGVudHJ5LT5zaGFyZWRBZGRyKSgpOworICAgICAgICBlbnRyaWVzKys7CisgICAgfQorCisgICAgLy8gYW5kIHRhYmxlIHRvIHRoZSBsaXN0IGlmIGl0IGlzIG5vdCBlbXB0eQorICAgIGlmIChlbnRyaWVzID4gMCkgeworICAgICAgICBtdXRleF9sb2NrZXJfdCBsb2NrZXIoX19teW9fdGFibGVfbG9jayk7CisgICAgICAgIF9fbXlvX3RhYmxlX2xpc3QucHVzaF9iYWNrKE15b1RhYmxlKHN0YXJ0LCBlbnRyaWVzKSk7CisgICAgICAgIF9fbXlvX3RhYmxlcyA9IHRydWU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfX29mZmxvYWRfbXlvX3NoYXJlZF9pbml0X3RhYmxlX3JlZ2lzdGVyKEluaXRUYWJsZUVudHJ5KiBlbnRyeSkKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcyglcClcbiIsIF9fZnVuY19fLCBlbnRyeSk7CisKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICBmb3IgKDsgZW50cnktPmZ1bmNOYW1lICE9IE1ZT19UQUJMRV9FTkRfTUFSS0VSKCk7IGVudHJ5KyspIHsKKyAgICAgICAgaWYgKGVudHJ5LT5mdW5jTmFtZSA9PSAwKSB7CisgICAgICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDQsICJza2lwIHJlZ2lzdGVyaW5nIGEgTlVMTCBNeW9TaGFyZWRJbml0IGVudHJ5XG4iKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gIEludm9rZSB0aGUgZnVuY3Rpb24gdG8gaW5pdCB0aGUgc2hhcmVkIG1lbW9yeQorICAgICAgICBlbnRyeS0+ZnVuYygpOworICAgIH0KKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgIGZvciAoOyBlbnRyeS0+ZnVuYyAhPSAwOyBlbnRyeSsrKSB7CisgICAgICAgIC8vIEludm9rZSB0aGUgZnVuY3Rpb24gdG8gaW5pdCB0aGUgc2hhcmVkIG1lbW9yeQorICAgICAgICBlbnRyeS0+ZnVuYygpOworICAgIH0KKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKK30KKworc3RhdGljIHZvaWQgX19vZmZsb2FkX215b19mcHRyX3RhYmxlX3JlZ2lzdGVyKAorICAgIEZwdHJUYWJsZUVudHJ5ICplbnRyeQorKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVwKVxuIiwgX19mdW5jX18sIGVudHJ5KTsKKworICAgIEZwdHJUYWJsZUVudHJ5ICpzdGFydCA9IGVudHJ5OworICAgIGludCBlbnRyaWVzID0gMDsKKworICAgIGZvciAoOyBlbnRyeS0+ZnVuY05hbWUgIT0gTVlPX1RBQkxFX0VORF9NQVJLRVIoKTsgZW50cnkrKykgeworI2lmZGVmIFRBUkdFVF9XSU5OVAorICAgICAgICBpZiAoZW50cnktPmZ1bmNOYW1lID09IDApIHsKKyAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoNCwgInNraXAgcmVnaXN0ZXJpbmcgYSBOVUxMIE15b0ZwdHJUYWJsZSBlbnRyeVxuIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisgICAgICAgIGlmICghbXlvX3dyYXBwZXIuaXNfYXZhaWxhYmxlKCkpIHsKKyAgICAgICAgICAgICooc3RhdGljX2Nhc3Q8dm9pZCoqPihlbnRyeS0+bG9jYWxUaHVua0FkZHIpKSA9IGVudHJ5LT5mdW5jQWRkcjsKKyAgICAgICAgfQorCisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoNCwgInJlZ2lzdGVyaW5nIE15b0ZwdHJUYWJsZSBlbnRyeSBmb3IgJXMgQCVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT5mdW5jTmFtZSwgZW50cnkpOworCisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIGlmIChteW9fd3JhcHBlci5pc19hdmFpbGFibGUoKSkgeworICAgICAgICAgICAgbXlvX3dyYXBwZXIuSG9zdEZwdHJUYWJsZVJlZ2lzdGVyKGVudHJ5LCAxLCBmYWxzZSk7CisgICAgICAgIH0KKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworICAgICAgICBlbnRyaWVzKys7CisgICAgfQorCisjaWZuZGVmIFRBUkdFVF9XSU5OVAorICAgIGlmIChteW9fd3JhcHBlci5pc19hdmFpbGFibGUoKSAmJiBlbnRyaWVzID4gMCkgeworICAgICAgICBteW9fd3JhcHBlci5Ib3N0RnB0clRhYmxlUmVnaXN0ZXIoc3RhcnQsIGVudHJpZXMsIGZhbHNlKTsKKyAgICB9CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCit9CisKK2V4dGVybiAiQyIgaW50IF9fb2ZmbG9hZF9teW9Jc0F2YWlsYWJsZShpbnQgdGFyZ2V0X251bWJlcikKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcyglZClcbiIsIF9fZnVuY19fLCB0YXJnZXRfbnVtYmVyKTsKKworICAgIGlmICh0YXJnZXRfbnVtYmVyID49IC0yKSB7CisgICAgICAgIGJvb2wgaXNfZGVmYXVsdF9udW1iZXIgPSAodGFyZ2V0X251bWJlciA9PSAtMik7CisKKyAgICAgICAgaWYgKF9fb2ZmbG9hZF9teW9Jbml0KCkpIHsKKyAgICAgICAgICAgIGlmICh0YXJnZXRfbnVtYmVyID49IDApIHsKKyAgICAgICAgICAgICAgICAvLyBVc2VyIHByb3ZpZGVkIHRoZSBkZXZpY2UgbnVtYmVyCisgICAgICAgICAgICAgICAgaW50IG51bSA9IHRhcmdldF9udW1iZXIgJSBtaWNfZW5naW5lc190b3RhbDsKKworICAgICAgICAgICAgICAgIC8vIHJlc2VydmUgZGV2aWNlIGluIE9SU0wKKyAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyID0gT1JTTDo6cmVzZXJ2ZShudW0pID8gbnVtIDogLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyB0cnkgdG8gdXNlIGRldmljZSAwCisgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciA9IE9SU0w6OnJlc2VydmUoMCkgPyAwIDogLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBkZXZpY2UgaXMgaW5pdGlhbGl6ZWQKKyAgICAgICAgICAgIGlmICh0YXJnZXRfbnVtYmVyID49IDApIHsKKyAgICAgICAgICAgICAgICBtaWNfZW5naW5lc1t0YXJnZXRfbnVtYmVyXS5pbml0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBmYWxsYmFjayB0byBDUFUKKyAgICAgICAgICAgIHRhcmdldF9udW1iZXIgPSAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0YXJnZXRfbnVtYmVyIDwgMCAmJiAhaXNfZGVmYXVsdF9udW1iZXIpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19kZXZpY2VfaXNfbm90X2F2YWlsYWJsZSk7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfaW52YWxpZF9kZXZpY2VfbnVtYmVyKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGFyZ2V0X251bWJlcjsKK30KKworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9teW9pUmVtb3RlSVRodW5rQ2FsbCgKKyAgICB2b2lkICp0aHVuaywKKyAgICB2b2lkICphcmcsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcyglcCwgJXAsICVkKVxuIiwgX19mdW5jX18sIHRodW5rLCBhcmcsCisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyKTsKKworICAgIG15b193cmFwcGVyLlJlbGVhc2UoKTsKKyAgICBteW9fd3JhcHBlci5SZW1vdGVUaHVua0NhbGwodGh1bmssIGFyZywgdGFyZ2V0X251bWJlcik7CisgICAgbXlvX3dyYXBwZXIuQWNxdWlyZSgpOworCisgICAgT1JTTDo6cmVsZWFzZSh0YXJnZXRfbnVtYmVyKTsKK30KKworZXh0ZXJuICJDIiB2b2lkKiBfT2ZmbG9hZF9zaGFyZWRfbWFsbG9jKHNpemVfdCBzaXplKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVsbGQpXG4iLCBfX2Z1bmNfXywgc2l6ZSk7CisKKyAgICBpZiAoX19vZmZsb2FkX215b0xvYWRMaWJyYXJ5KCkpIHsKKyAgICAgICAgcmV0dXJuIG15b193cmFwcGVyLlNoYXJlZE1hbGxvYyhzaXplKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBtYWxsb2Moc2l6ZSk7CisgICAgfQorfQorCitleHRlcm4gIkMiIHZvaWQgX09mZmxvYWRfc2hhcmVkX2ZyZWUodm9pZCAqcHRyKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVwKVxuIiwgX19mdW5jX18sIHB0cik7CisKKyAgICBpZiAoX19vZmZsb2FkX215b0xvYWRMaWJyYXJ5KCkpIHsKKyAgICAgICAgbXlvX3dyYXBwZXIuU2hhcmVkRnJlZShwdHIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZnJlZShwdHIpOworICAgIH0KK30KKworZXh0ZXJuICJDIiB2b2lkKiBfT2ZmbG9hZF9zaGFyZWRfYWxpZ25lZF9tYWxsb2Moc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbikKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcyglbGxkLCAlbGxkKVxuIiwgX19mdW5jX18sIHNpemUsIGFsaWduKTsKKworICAgIGlmIChfX29mZmxvYWRfbXlvTG9hZExpYnJhcnkoKSkgeworICAgICAgICByZXR1cm4gbXlvX3dyYXBwZXIuU2hhcmVkQWxpZ25lZE1hbGxvYyhzaXplLCBhbGlnbik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoYWxpZ24gPCBzaXplb2Yodm9pZCopKSB7CisgICAgICAgICAgICBhbGlnbiA9IHNpemVvZih2b2lkKik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9tbV9tYWxsb2Moc2l6ZSwgYWxpZ24pOworICAgIH0KK30KKworZXh0ZXJuICJDIiB2b2lkIF9PZmZsb2FkX3NoYXJlZF9hbGlnbmVkX2ZyZWUodm9pZCAqcHRyKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVwKVxuIiwgX19mdW5jX18sIHB0cik7CisKKyAgICBpZiAoX19vZmZsb2FkX215b0xvYWRMaWJyYXJ5KCkpIHsKKyAgICAgICAgbXlvX3dyYXBwZXIuU2hhcmVkQWxpZ25lZEZyZWUocHRyKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9tbV9mcmVlKHB0cik7CisgICAgfQorfQorCitleHRlcm4gIkMiIHZvaWQgX19pbnRlbF9jaWxrX2Zvcl8zMl9vZmZsb2FkKAorICAgIGludCBzaXplLAorICAgIHZvaWQgKCpjb3B5X2NvbnN0cnVjdG9yKSh2b2lkKiwgdm9pZCopLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIHZvaWQgKnJhZGRyLAorICAgIHZvaWQgKmNsb3N1cmVfb2JqZWN0LAorICAgIHVuc2lnbmVkIGludCBpdGVycywKKyAgICB1bnNpZ25lZCBpbnQgZ3JhaW5fc2l6ZSkKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlc1xuIiwgX19mdW5jX18pOworCisgICAgdGFyZ2V0X251bWJlciA9IF9fb2ZmbG9hZF9teW9Jc0F2YWlsYWJsZSh0YXJnZXRfbnVtYmVyKTsKKyAgICBpZiAodGFyZ2V0X251bWJlciA+PSAwKSB7CisgICAgICAgIHN0cnVjdCBTIHsKKyAgICAgICAgICAgIHZvaWQgKk0xOworICAgICAgICAgICAgdW5zaWduZWQgaW50IE0yOworICAgICAgICAgICAgdW5zaWduZWQgaW50IE0zOworICAgICAgICAgICAgY2hhciBjbG9zdXJlW107CisgICAgICAgIH0gKmFyZ3M7CisKKyAgICAgICAgYXJncyA9IChzdHJ1Y3QgUyopIF9PZmZsb2FkX3NoYXJlZF9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBTKSArIHNpemUpOworICAgICAgICBhcmdzLT5NMSA9IHJhZGRyOworICAgICAgICBhcmdzLT5NMiA9IGl0ZXJzOworICAgICAgICBhcmdzLT5NMyA9IGdyYWluX3NpemU7CisKKyAgICAgICAgaWYgKGNvcHlfY29uc3RydWN0b3IgPT0gMCkgeworICAgICAgICAgICAgbWVtY3B5KGFyZ3MtPmNsb3N1cmUsIGNsb3N1cmVfb2JqZWN0LCBzaXplKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNvcHlfY29uc3RydWN0b3IoYXJncy0+Y2xvc3VyZSwgY2xvc3VyZV9vYmplY3QpOworICAgICAgICB9CisKKyAgICAgICAgbXlvX3dyYXBwZXIuUmVsZWFzZSgpOworICAgICAgICBteW9fd3JhcHBlci5HZXRSZXN1bHQoCisgICAgICAgICAgICBteW9fd3JhcHBlci5SZW1vdGVDYWxsKCJfX2ludGVsX2NpbGtfZm9yXzMyX29mZmxvYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLCB0YXJnZXRfbnVtYmVyKQorICAgICAgICApOworICAgICAgICBteW9fd3JhcHBlci5BY3F1aXJlKCk7CisKKyAgICAgICAgX09mZmxvYWRfc2hhcmVkX2ZyZWUoYXJncyk7CisKKyAgICAgICAgT1JTTDo6cmVsZWFzZSh0YXJnZXRfbnVtYmVyKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fY2lsa3J0c19jaWxrX2Zvcl8zMihyYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3N1cmVfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFpbl9zaXplKTsKKyAgICB9Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfX2ludGVsX2NpbGtfZm9yXzY0X29mZmxvYWQoCisgICAgaW50IHNpemUsCisgICAgdm9pZCAoKmNvcHlfY29uc3RydWN0b3IpKHZvaWQqLCB2b2lkKiksCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgdm9pZCAqcmFkZHIsCisgICAgdm9pZCAqY2xvc3VyZV9vYmplY3QsCisgICAgdWludDY0X3QgaXRlcnMsCisgICAgdWludDY0X3QgZ3JhaW5fc2l6ZSkKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlc1xuIiwgX19mdW5jX18pOworCisgICAgdGFyZ2V0X251bWJlciA9IF9fb2ZmbG9hZF9teW9Jc0F2YWlsYWJsZSh0YXJnZXRfbnVtYmVyKTsKKyAgICBpZiAodGFyZ2V0X251bWJlciA+PSAwKSB7CisgICAgICAgIHN0cnVjdCBTIHsKKyAgICAgICAgICAgIHZvaWQgKk0xOworICAgICAgICAgICAgdWludDY0X3QgTTI7CisgICAgICAgICAgICB1aW50NjRfdCBNMzsKKyAgICAgICAgICAgIGNoYXIgY2xvc3VyZVtdOworICAgICAgICB9ICphcmdzOworCisgICAgICAgIGFyZ3MgPSAoc3RydWN0IFMqKSBfT2ZmbG9hZF9zaGFyZWRfbWFsbG9jKHNpemVvZihzdHJ1Y3QgUykgKyBzaXplKTsKKyAgICAgICAgYXJncy0+TTEgPSByYWRkcjsKKyAgICAgICAgYXJncy0+TTIgPSBpdGVyczsKKyAgICAgICAgYXJncy0+TTMgPSBncmFpbl9zaXplOworCisgICAgICAgIGlmIChjb3B5X2NvbnN0cnVjdG9yID09IDApIHsKKyAgICAgICAgICAgIG1lbWNweShhcmdzLT5jbG9zdXJlLCBjbG9zdXJlX29iamVjdCwgc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjb3B5X2NvbnN0cnVjdG9yKGFyZ3MtPmNsb3N1cmUsIGNsb3N1cmVfb2JqZWN0KTsKKyAgICAgICAgfQorCisgICAgICAgIG15b193cmFwcGVyLlJlbGVhc2UoKTsKKyAgICAgICAgbXlvX3dyYXBwZXIuR2V0UmVzdWx0KAorICAgICAgICAgICAgbXlvX3dyYXBwZXIuUmVtb3RlQ2FsbCgiX19pbnRlbF9jaWxrX2Zvcl82NF9vZmZsb2FkIiwgYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlcikKKyAgICAgICAgKTsKKyAgICAgICAgbXlvX3dyYXBwZXIuQWNxdWlyZSgpOworCisgICAgICAgIF9PZmZsb2FkX3NoYXJlZF9mcmVlKGFyZ3MpOworCisgICAgICAgIE9SU0w6OnJlbGVhc2UodGFyZ2V0X251bWJlcik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2NpbGtydHNfY2lsa19mb3JfNjQocmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zdXJlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhaW5fc2l6ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9teW9faG9zdC5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9teW9faG9zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYTYxZjQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX215b19ob3N0LmgKQEAgLTAsMCArMSw4MCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIE9GRkxPQURfTVlPX0hPU1RfSF9JTkNMVURFRAorI2RlZmluZSBPRkZMT0FEX01ZT19IT1NUX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPG15b3R5cGVzLmg+CisjaW5jbHVkZSA8bXlvaW1wbC5oPgorI2luY2x1ZGUgPG15by5oPgorI2luY2x1ZGUgIm9mZmxvYWQuaCIKKwordHlwZWRlZiBNeW9pU2hhcmVkVmFyRW50cnkgICAgICBTaGFyZWRUYWJsZUVudHJ5OworLy90eXBlZGVmIE15b2lIb3N0U2hhcmVkRnB0ckVudHJ5IEZwdHJUYWJsZUVudHJ5OwordHlwZWRlZiBzdHJ1Y3QgeworICAgIC8vISBGdW5jdGlvbiBOYW1lCisgICAgY29uc3QgY2hhciAqZnVuY05hbWU7CisgICAgLy8hIEZ1bmN0aW9uIEFkZHJlc3MKKyAgICB2b2lkICpmdW5jQWRkcjsKKyAgICAvLyEgTG9jYWwgVGh1bmsgQWRkcmVzcworICAgIHZvaWQgKmxvY2FsVGh1bmtBZGRyOworI2lmZGVmIFRBUkdFVF9XSU5OVAorICAgIC8vIER1bW15IHRvIHBhZCB1cCB0byAzMiBieXRlcworICAgIHZvaWQgKmR1bW15OworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorfSBGcHRyVGFibGVFbnRyeTsKKworc3RydWN0IEluaXRUYWJsZUVudHJ5IHsKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICAvLyBEdW1teSB0byBwYWQgdXAgdG8gMTYgYnl0ZXMKKyAgICAvLyBGdW5jdGlvbiBOYW1lCisgICAgY29uc3QgY2hhciAqZnVuY05hbWU7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgdm9pZCAoKmZ1bmMpKHZvaWQpOworfTsKKworI2lmZGVmIFRBUkdFVF9XSU5OVAorI2RlZmluZSBPRkZMT0FEX01ZT19TSEFSRURfVEFCTEVfU0VDVElPTl9TVEFSVCAgICAgICAgICAiLk15b1NoYXJlZFRhYmxlJGEiCisjZGVmaW5lIE9GRkxPQURfTVlPX1NIQVJFRF9UQUJMRV9TRUNUSU9OX0VORCAgICAgICAgICAgICIuTXlvU2hhcmVkVGFibGUkeiIKKworI2RlZmluZSBPRkZMT0FEX01ZT19TSEFSRURfSU5JVF9UQUJMRV9TRUNUSU9OX1NUQVJUICAgICAiLk15b1NoYXJlZEluaXRUYWJsZSRhIgorI2RlZmluZSBPRkZMT0FEX01ZT19TSEFSRURfSU5JVF9UQUJMRV9TRUNUSU9OX0VORCAgICAgICAiLk15b1NoYXJlZEluaXRUYWJsZSR6IgorCisjZGVmaW5lIE9GRkxPQURfTVlPX0ZQVFJfVEFCTEVfU0VDVElPTl9TVEFSVCAgICAgICAgICAgICIuTXlvRnB0clRhYmxlJGEiCisjZGVmaW5lIE9GRkxPQURfTVlPX0ZQVFJfVEFCTEVfU0VDVElPTl9FTkQgICAgICAgICAgICAgICIuTXlvRnB0clRhYmxlJHoiCisjZWxzZSAgLy8gVEFSR0VUX1dJTk5UCisjZGVmaW5lIE9GRkxPQURfTVlPX1NIQVJFRF9UQUJMRV9TRUNUSU9OX1NUQVJUICAgICAgICAgICIuTXlvU2hhcmVkVGFibGUuIgorI2RlZmluZSBPRkZMT0FEX01ZT19TSEFSRURfVEFCTEVfU0VDVElPTl9FTkQgICAgICAgICAgICAiLk15b1NoYXJlZFRhYmxlLiIKKworI2RlZmluZSBPRkZMT0FEX01ZT19TSEFSRURfSU5JVF9UQUJMRV9TRUNUSU9OX1NUQVJUICAgICAiLk15b1NoYXJlZEluaXRUYWJsZS4iCisjZGVmaW5lIE9GRkxPQURfTVlPX1NIQVJFRF9JTklUX1RBQkxFX1NFQ1RJT05fRU5EICAgICAgICIuTXlvU2hhcmVkSW5pdFRhYmxlLiIKKworI2RlZmluZSBPRkZMT0FEX01ZT19GUFRSX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgICAgICAgICAiLk15b0ZwdHJUYWJsZS4iCisjZGVmaW5lIE9GRkxPQURfTVlPX0ZQVFJfVEFCTEVfU0VDVElPTl9FTkQgICAgICAgICAgICAgICIuTXlvRnB0clRhYmxlLiIKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfTVlPX1NIQVJFRF9UQUJMRV9TRUNUSU9OX1NUQVJULCByZWFkLCB3cml0ZSkKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX01ZT19TSEFSRURfVEFCTEVfU0VDVElPTl9FTkQsIHJlYWQsIHdyaXRlKQorCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9NWU9fU0hBUkVEX0lOSVRfVEFCTEVfU0VDVElPTl9TVEFSVCwgcmVhZCwgd3JpdGUpCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9NWU9fU0hBUkVEX0lOSVRfVEFCTEVfU0VDVElPTl9FTkQsIHJlYWQsIHdyaXRlKQorCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX1NUQVJULCByZWFkLCB3cml0ZSkKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX01ZT19GUFRSX1RBQkxFX1NFQ1RJT05fRU5ELCByZWFkLCB3cml0ZSkKKworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9teW9SZWdpc3RlclRhYmxlcygKKyAgICBJbml0VGFibGVFbnRyeSAqaW5pdF90YWJsZSwKKyAgICBTaGFyZWRUYWJsZUVudHJ5ICpzaGFyZWRfdGFibGUsCisgICAgRnB0clRhYmxlRW50cnkgKmZwdHJfdGFibGUKKyk7CisKK2V4dGVybiB2b2lkIF9fb2ZmbG9hZF9teW9GaW5pKHZvaWQpOworCisjZW5kaWYgLy8gT0ZGTE9BRF9NWU9fSE9TVF9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX215b190YXJnZXQuY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9teW9fdGFyZ2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWIxYzRmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9teW9fdGFyZ2V0LmNwcApAQCAtMCwwICsxLDE4NCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAib2ZmbG9hZF9teW9fdGFyZ2V0LmgiCisjaW5jbHVkZSAib2ZmbG9hZF90YXJnZXQuaCIKKworZXh0ZXJuICJDIiB2b2lkIF9fY2lsa3J0c19jaWxrX2Zvcl8zMih2b2lkKiwgdm9pZCosIHVpbnQzMl90LCBpbnQzMl90KTsKK2V4dGVybiAiQyIgdm9pZCBfX2NpbGtydHNfY2lsa19mb3JfNjQodm9pZCosIHZvaWQqLCB1aW50NjRfdCwgaW50MzJfdCk7CisKKyNwcmFnbWEgd2VhayBfX2NpbGtydHNfY2lsa19mb3JfMzIKKyNwcmFnbWEgd2VhayBfX2NpbGtydHNfY2lsa19mb3JfNjQKKworc3RhdGljIHZvaWQgQ2hlY2tSZXN1bHQoY29uc3QgY2hhciAqZnVuYywgTXlvRXJyb3IgZXJyb3IpIHsKKyAgICBpZiAoZXJyb3IgIT0gTVlPX1NVQ0NFU1MpIHsKKyAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfbXlvdGFyZ2V0X2NoZWNrcmVzdWx0LCBmdW5jLCBlcnJvcik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfX29mZmxvYWRfbXlvX3NoYXJlZF90YWJsZV9yZWdpc3RlcihTaGFyZWRUYWJsZUVudHJ5ICplbnRyeSkKK3sKKyAgICBpbnQgZW50cmllcyA9IDA7CisgICAgU2hhcmVkVGFibGVFbnRyeSAqdF9zdGFydDsKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVwKVxuIiwgX19mdW5jX18sIGVudHJ5KTsKKworICAgIHRfc3RhcnQgPSBlbnRyeTsKKyAgICB3aGlsZSAodF9zdGFydC0+dmFyTmFtZSAhPSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSg0LCAwLCBjX29mZmxvYWRfbWljX215b19zaGFyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXlvIHNoYXJlZCBlbnRyeSBuYW1lID0gXCIlc1wiIGFkZHIgPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RhcnQtPnZhck5hbWUsIHRfc3RhcnQtPnNoYXJlZEFkZHIpOworICAgICAgICB0X3N0YXJ0Kys7CisgICAgICAgIGVudHJpZXMrKzsKKyAgICB9CisKKyAgICBpZiAoZW50cmllcyA+IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAibXlvaU1pY1ZhclRhYmxlUmVnaXN0ZXIoJXAsICVkKVxuIiwgZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcyk7CisgICAgICAgIENoZWNrUmVzdWx0KCJteW9pTWljVmFyVGFibGVSZWdpc3RlciIsCisgICAgICAgICAgICAgICAgICAgIG15b2lNaWNWYXJUYWJsZVJlZ2lzdGVyKGVudHJ5LCBlbnRyaWVzKSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfX29mZmxvYWRfbXlvX2ZwdHJfdGFibGVfcmVnaXN0ZXIoCisgICAgRnB0clRhYmxlRW50cnkgKmVudHJ5CispCit7CisgICAgaW50IGVudHJpZXMgPSAwOworICAgIEZwdHJUYWJsZUVudHJ5ICp0X3N0YXJ0OworCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgZW50cnkpOworCisgICAgdF9zdGFydCA9IGVudHJ5OworICAgIHdoaWxlICh0X3N0YXJ0LT5mdW5jTmFtZSAhPSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSg0LCAwLCBjX29mZmxvYWRfbWljX215b19mcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15byBmcHRyIGVudHJ5IG5hbWUgPSBcIiVzXCIgYWRkciA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdGFydC0+ZnVuY05hbWUsIHRfc3RhcnQtPmZ1bmNBZGRyKTsKKyAgICAgICAgdF9zdGFydCsrOworICAgICAgICBlbnRyaWVzKys7CisgICAgfQorCisgICAgaWYgKGVudHJpZXMgPiAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIm15b2lUYXJnZXRGcHRyVGFibGVSZWdpc3RlciglcCwgJWQsIDApXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LCBlbnRyaWVzKTsKKyAgICAgICAgQ2hlY2tSZXN1bHQoIm15b2lUYXJnZXRGcHRyVGFibGVSZWdpc3RlciIsCisgICAgICAgICAgICAgICAgICAgIG15b2lUYXJnZXRGcHRyVGFibGVSZWdpc3RlcihlbnRyeSwgZW50cmllcywgMCkpOworICAgIH0KK30KKworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9teW9BY3F1aXJlKHZvaWQpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXNcbiIsIF9fZnVuY19fKTsKKyAgICBDaGVja1Jlc3VsdCgibXlvQWNxdWlyZSIsIG15b0FjcXVpcmUoKSk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfbXlvUmVsZWFzZSh2b2lkKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzXG4iLCBfX2Z1bmNfXyk7CisgICAgQ2hlY2tSZXN1bHQoIm15b1JlbGVhc2UiLCBteW9SZWxlYXNlKCkpOworfQorCitleHRlcm4gIkMiIHZvaWQgX19pbnRlbF9jaWxrX2Zvcl8zMl9vZmZsb2FkX3dyYXBwZXIodm9pZCAqYXJnc18pCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXNcbiIsIF9fZnVuY19fKTsKKworICAgIHN0cnVjdCBTIHsKKyAgICAgICAgdm9pZCAqTTE7CisgICAgICAgIHVuc2lnbmVkIGludCBNMjsKKyAgICAgICAgdW5zaWduZWQgaW50IE0zOworICAgICAgICBjaGFyIGNsb3N1cmVbXTsKKyAgICB9ICphcmdzID0gKHN0cnVjdCBTKikgYXJnc187CisKKyAgICBfX2NpbGtydHNfY2lsa19mb3JfMzIoYXJncy0+TTEsIGFyZ3MtPmNsb3N1cmUsIGFyZ3MtPk0yLCBhcmdzLT5NMyk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfX2ludGVsX2NpbGtfZm9yXzY0X29mZmxvYWRfd3JhcHBlcih2b2lkICphcmdzXykKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlc1xuIiwgX19mdW5jX18pOworCisgICAgc3RydWN0IFMgeworICAgICAgICB2b2lkICpNMTsKKyAgICAgICAgdWludDY0X3QgTTI7CisgICAgICAgIHVpbnQ2NF90IE0zOworICAgICAgICBjaGFyIGNsb3N1cmVbXTsKKyAgICB9ICphcmdzID0gKHN0cnVjdCBTKikgYXJnc187CisKKyAgICBfX2NpbGtydHNfY2lsa19mb3JfNjQoYXJncy0+TTEsIGFyZ3MtPmNsb3N1cmUsIGFyZ3MtPk0yLCBhcmdzLT5NMyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fb2ZmbG9hZF9teW9fb25jZV9pbml0KHZvaWQpCit7CisgICAgQ2hlY2tSZXN1bHQoIm15b2lSZW1vdGVGdW5jUmVnaXN0ZXIiLAorICAgICAgICAgICAgICAgIG15b2lSZW1vdGVGdW5jUmVnaXN0ZXIoCisgICAgICAgICAgICAgICAgICAgIChNeW9pUmVtb3RlRnVuY1R5cGUpIF9faW50ZWxfY2lsa19mb3JfMzJfb2ZmbG9hZF93cmFwcGVyLAorICAgICAgICAgICAgICAgICAgICAiX19pbnRlbF9jaWxrX2Zvcl8zMl9vZmZsb2FkIikpOworICAgIENoZWNrUmVzdWx0KCJteW9pUmVtb3RlRnVuY1JlZ2lzdGVyIiwKKyAgICAgICAgICAgICAgICBteW9pUmVtb3RlRnVuY1JlZ2lzdGVyKAorICAgICAgICAgICAgICAgICAgICAoTXlvaVJlbW90ZUZ1bmNUeXBlKSBfX2ludGVsX2NpbGtfZm9yXzY0X29mZmxvYWRfd3JhcHBlciwKKyAgICAgICAgICAgICAgICAgICAgIl9faW50ZWxfY2lsa19mb3JfNjRfb2ZmbG9hZCIpKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9teW9SZWdpc3RlclRhYmxlcygKKyAgICBTaGFyZWRUYWJsZUVudHJ5ICpzaGFyZWRfdGFibGUsCisgICAgRnB0clRhYmxlRW50cnkgKmZwdHJfdGFibGUKKykKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlc1xuIiwgX19mdW5jX18pOworCisgICAgLy8gb25lIHRpbWUgcmVnaXN0cmF0aW9uIG9mIEludGVsKFIpIENpbGsoVE0pIGxhbmd1YWdlIGVudHJpZXMKKyAgICBzdGF0aWMgcHRocmVhZF9vbmNlX3Qgb25jZV9jb250cm9sID0gUFRIUkVBRF9PTkNFX0lOSVQ7CisgICAgcHRocmVhZF9vbmNlKCZvbmNlX2NvbnRyb2wsIF9fb2ZmbG9hZF9teW9fb25jZV9pbml0KTsKKworICAgIC8vIHJlZ2lzdGVyIG1vZHVsZSdzIHRhYmxlcworICAgIGlmIChzaGFyZWRfdGFibGUtPnZhck5hbWUgPT0gMCAmJiBmcHRyX3RhYmxlLT5mdW5jTmFtZSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBfX29mZmxvYWRfbXlvX3NoYXJlZF90YWJsZV9yZWdpc3RlcihzaGFyZWRfdGFibGUpOworICAgIF9fb2ZmbG9hZF9teW9fZnB0cl90YWJsZV9yZWdpc3RlcihmcHRyX3RhYmxlKTsKK30KKworZXh0ZXJuICJDIiB2b2lkKiBfT2ZmbG9hZF9zaGFyZWRfbWFsbG9jKHNpemVfdCBzaXplKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVsbGQpXG4iLCBfX2Z1bmNfXywgc2l6ZSk7CisgICAgcmV0dXJuIG15b1NoYXJlZE1hbGxvYyhzaXplKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIF9PZmZsb2FkX3NoYXJlZF9mcmVlKHZvaWQgKnB0cikKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcyglcClcbiIsIF9fZnVuY19fLCBwdHIpOworICAgIG15b1NoYXJlZEZyZWUocHRyKTsKK30KKworZXh0ZXJuICJDIiB2b2lkKiBfT2ZmbG9hZF9zaGFyZWRfYWxpZ25lZF9tYWxsb2Moc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbikKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcyglbGxkLCAlbGxkKVxuIiwgX19mdW5jX18sIHNpemUsIGFsaWduKTsKKyAgICByZXR1cm4gbXlvU2hhcmVkQWxpZ25lZE1hbGxvYyhzaXplLCBhbGlnbik7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfT2ZmbG9hZF9zaGFyZWRfYWxpZ25lZF9mcmVlKHZvaWQgKnB0cikKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcyglcClcbiIsIF9fZnVuY19fLCBwdHIpOworICAgIG15b1NoYXJlZEFsaWduZWRGcmVlKHB0cik7Cit9CisKKy8vIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBibG9ja2luZyBiZWhhdmlvciBvZiBteW9pTGliSW5pdC9GaW5pIGNhbGxzCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX215b0xpYkluaXQoKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKClcbiIsIF9fZnVuY19fKTsKKyAgICBDaGVja1Jlc3VsdCgibXlvaUxpYkluaXQiLCBteW9pTGliSW5pdCgwLCAwKSk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfbXlvTGliRmluaSgpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoKVxuIiwgX19mdW5jX18pOworICAgIG15b2lMaWJGaW5pKCk7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX215b190YXJnZXQuaCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfbXlvX3RhcmdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiN2Y3ODkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX215b190YXJnZXQuaApAQCAtMCwwICsxLDU0IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgT0ZGTE9BRF9NWU9fVEFSR0VUX0hfSU5DTFVERUQKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fVEFSR0VUX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPG15b3R5cGVzLmg+CisjaW5jbHVkZSA8bXlvaW1wbC5oPgorI2luY2x1ZGUgPG15by5oPgorI2luY2x1ZGUgIm9mZmxvYWQuaCIKKwordHlwZWRlZiBNeW9pU2hhcmVkVmFyRW50cnkgICAgICAgICAgU2hhcmVkVGFibGVFbnRyeTsKK3R5cGVkZWYgTXlvaVRhcmdldFNoYXJlZEZwdHJFbnRyeSAgIEZwdHJUYWJsZUVudHJ5OworCisjaWZkZWYgVEFSR0VUX1dJTk5UCisjZGVmaW5lIE9GRkxPQURfTVlPX1NIQVJFRF9UQUJMRV9TRUNUSU9OX1NUQVJUICAgICAgICAgICIuTXlvU2hhcmVkVGFibGUkYSIKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fRU5EICAgICAgICAgICAgIi5NeW9TaGFyZWRUYWJsZSR6IgorCisjZGVmaW5lIE9GRkxPQURfTVlPX0ZQVFJfVEFCTEVfU0VDVElPTl9TVEFSVCAgICAgICAgICAgICIuTXlvRnB0clRhYmxlJGEiCisjZGVmaW5lIE9GRkxPQURfTVlPX0ZQVFJfVEFCTEVfU0VDVElPTl9FTkQgICAgICAgICAgICAgICIuTXlvRnB0clRhYmxlJHoiCisjZWxzZSAgLy8gVEFSR0VUX1dJTk5UCisjZGVmaW5lIE9GRkxPQURfTVlPX1NIQVJFRF9UQUJMRV9TRUNUSU9OX1NUQVJUICAgICAgICAgICIuTXlvU2hhcmVkVGFibGUuIgorI2RlZmluZSBPRkZMT0FEX01ZT19TSEFSRURfVEFCTEVfU0VDVElPTl9FTkQgICAgICAgICAgICAiLk15b1NoYXJlZFRhYmxlLiIKKworI2RlZmluZSBPRkZMT0FEX01ZT19GUFRSX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgICAgICAgICAiLk15b0ZwdHJUYWJsZS4iCisjZGVmaW5lIE9GRkxPQURfTVlPX0ZQVFJfVEFCTEVfU0VDVElPTl9FTkQgICAgICAgICAgICAgICIuTXlvRnB0clRhYmxlLiIKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfTVlPX1NIQVJFRF9UQUJMRV9TRUNUSU9OX1NUQVJULCByZWFkLCB3cml0ZSkKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX01ZT19TSEFSRURfVEFCTEVfU0VDVElPTl9FTkQsIHJlYWQsIHdyaXRlKQorCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX1NUQVJULCByZWFkLCB3cml0ZSkKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX01ZT19GUFRSX1RBQkxFX1NFQ1RJT05fRU5ELCByZWFkLCB3cml0ZSkKKworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9teW9SZWdpc3RlclRhYmxlcygKKyAgICBTaGFyZWRUYWJsZUVudHJ5ICpzaGFyZWRfdGFibGUsCisgICAgRnB0clRhYmxlRW50cnkgKmZwdHJfdGFibGUKKyk7CisKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfbXlvQWNxdWlyZSh2b2lkKTsKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfbXlvUmVsZWFzZSh2b2lkKTsKKworLy8gdGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIGJsb2NraW5nIGJlaGF2aW9yIGZvciBteW9pTGliSW5pdC9GaW5pIGNhbGxzCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX215b0xpYkluaXQoKTsKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfbXlvTGliRmluaSgpOworCisjZW5kaWYgLy8gT0ZGTE9BRF9NWU9fVEFSR0VUX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfb21wX2hvc3QuY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9vbXBfaG9zdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRkNDQ0NQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfb21wX2hvc3QuY3BwCkBAIC0wLDAgKzEsODUxIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlIDxvbXAuaD4KKyNpbmNsdWRlICJvZmZsb2FkLmgiCisjaW5jbHVkZSAiY29tcGlsZXJfaWZfaG9zdC5oIgorCisvLyBPcGVuTVAgQVBJCisKK3ZvaWQgb21wX3NldF9kZWZhdWx0X2RldmljZShpbnQgbnVtKQoreworICAgIGlmIChudW0gPj0gMCkgeworICAgICAgICBfX29tcF9kZXZpY2VfbnVtID0gbnVtOworICAgIH0KK30KKworaW50IG9tcF9nZXRfZGVmYXVsdF9kZXZpY2Uodm9pZCkKK3sKKyAgICByZXR1cm4gX19vbXBfZGV2aWNlX251bTsKK30KKworaW50IG9tcF9nZXRfbnVtX2RldmljZXMoKQoreworICAgIF9fb2ZmbG9hZF9pbml0X2xpYnJhcnkoKTsKKyAgICByZXR1cm4gbWljX2VuZ2luZXNfdG90YWw7Cit9CisKKy8vIE9wZW5NUCBBUEkgd3JhcHBlcnMKKworc3RhdGljIHZvaWQgb21wX3NldF9pbnRfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBzZXR0aW5nLAorICAgIGNvbnN0IGNoYXIqIGZfbmFtZQorKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmX25hbWUsIDApOworICAgIGlmIChvZmxkKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSAmc2V0dGluZzsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgZl9uYW1lLCAwLCAxLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgb21wX2dldF9pbnRfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGNvbnN0IGNoYXIgKiBmX25hbWUKKykKK3sKKyAgICBpbnQgc2V0dGluZyA9IDA7CisKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZl9uYW1lLCAwKTsKKyAgICBpZiAob2ZsZCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9ICZzZXR0aW5nOworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCBmX25hbWUsIDAsIDEsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KKyAgICByZXR1cm4gc2V0dGluZzsKK30KKwordm9pZCBvbXBfc2V0X251bV90aHJlYWRzX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgbnVtX3RocmVhZHMKKykKK3sKKyAgICBvbXBfc2V0X2ludF90YXJnZXQodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIG51bV90aHJlYWRzLAorICAgICAgICAgICAgICAgICAgICAgICAib21wX3NldF9udW1fdGhyZWFkc190YXJnZXQiKTsKK30KKworaW50IG9tcF9nZXRfbWF4X3RocmVhZHNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIG9tcF9nZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbXBfZ2V0X21heF90aHJlYWRzX3RhcmdldCIpOworfQorCitpbnQgb21wX2dldF9udW1fcHJvY3NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIG9tcF9nZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbXBfZ2V0X251bV9wcm9jc190YXJnZXQiKTsKK30KKwordm9pZCBvbXBfc2V0X2R5bmFtaWNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBudW1fdGhyZWFkcworKQoreworICAgIG9tcF9zZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgbnVtX3RocmVhZHMsCisgICAgICAgICAgICAgICAgICAgICAgICJvbXBfc2V0X2R5bmFtaWNfdGFyZ2V0Iik7Cit9CisKK2ludCBvbXBfZ2V0X2R5bmFtaWNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIG9tcF9nZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbXBfZ2V0X2R5bmFtaWNfdGFyZ2V0Iik7Cit9CisKK3ZvaWQgb21wX3NldF9uZXN0ZWRfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBuZXN0ZWQKKykKK3sKKyAgICBvbXBfc2V0X2ludF90YXJnZXQodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIG5lc3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIm9tcF9zZXRfbmVzdGVkX3RhcmdldCIpOworfQorCitpbnQgb21wX2dldF9uZXN0ZWRfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIG9tcF9nZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbXBfZ2V0X25lc3RlZF90YXJnZXQiKTsKK30KKwordm9pZCBvbXBfc2V0X3NjaGVkdWxlX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfc2NoZWRfdCBraW5kLAorICAgIGludCBtb2RpZmllcgorKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMl0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2Yob21wX3NjaGVkX3QpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSAma2luZDsKKworICAgICAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgICAgIHZhcnNbMV0uc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICB2YXJzWzFdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1sxXS5wdHIgPSAmbW9kaWZpZXI7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJvbXBfc2V0X3NjaGVkdWxlX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAyLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQgb21wX2dldF9zY2hlZHVsZV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX3NjaGVkX3QgKmtpbmQsCisgICAgaW50ICptb2RpZmllcgorKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMl0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKG9tcF9zY2hlZF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0ga2luZDsKKworICAgICAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgICAgICB2YXJzWzFdLnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgdmFyc1sxXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMV0ucHRyID0gbW9kaWZpZXI7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJvbXBfZ2V0X3NjaGVkdWxlX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAyLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKKy8vIGxvY2sgQVBJIGZ1bmN0aW9ucworCit2b2lkIG9tcF9pbml0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2Yob21wX2xvY2tfdGFyZ2V0X3QpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSBsb2NrOworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAib21wX2luaXRfbG9ja190YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorfQorCit2b2lkIG9tcF9kZXN0cm95X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihvbXBfbG9ja190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9IGxvY2s7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJvbXBfZGVzdHJveV9sb2NrX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQgb21wX3NldF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2Yob21wX2xvY2tfdGFyZ2V0X3QpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSBsb2NrOworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAib21wX3NldF9sb2NrX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQgb21wX3Vuc2V0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihvbXBfbG9ja190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9IGxvY2s7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJvbXBfdW5zZXRfbG9ja190YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorfQorCitpbnQgb21wX3Rlc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKKyAgICBpbnQgcmVzdWx0ID0gMDsKKworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMl0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2Yob21wX2xvY2tfdGFyZ2V0X3QpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSBsb2NrOworCisgICAgICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMV0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgICAgIHZhcnNbMV0uc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICB2YXJzWzFdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1sxXS5wdHIgPSAmcmVzdWx0OworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAib21wX3Rlc3RfbG9ja190YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMiwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIG5lc3RlZCBsb2NrIEFQSSBmdW5jdGlvbnMKKwordm9pZCBvbXBfaW5pdF9uZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihvbXBfbmVzdF9sb2NrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbG9jazsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgIm9tcF9pbml0X25lc3RfbG9ja190YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorfQorCit2b2lkIG9tcF9kZXN0cm95X25lc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2Yob21wX25lc3RfbG9ja190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9IGxvY2s7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJvbXBfZGVzdHJveV9uZXN0X2xvY2tfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KK30KKwordm9pZCBvbXBfc2V0X25lc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2Yob21wX25lc3RfbG9ja190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9IGxvY2s7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJvbXBfc2V0X25lc3RfbG9ja190YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorfQorCit2b2lkIG9tcF91bnNldF9uZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSBsb2NrOworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAib21wX3Vuc2V0X25lc3RfbG9ja190YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorfQorCitpbnQgb21wX3Rlc3RfbmVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7CisgICAgaW50IHJlc3VsdCA9IDA7CisKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzJdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSBsb2NrOworCisgICAgICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMV0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgICAgIHZhcnNbMV0uc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICB2YXJzWzFdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1sxXS5wdHIgPSAmcmVzdWx0OworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAib21wX3Rlc3RfbmVzdF9sb2NrX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAyLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8ga21wIEFQSSBmdW5jdGlvbnMKKwordm9pZCBrbXBfc2V0X3N0YWNrc2l6ZV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHNpemUKKykKK3sKKyAgICBvbXBfc2V0X2ludF90YXJnZXQodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICJrbXBfc2V0X3N0YWNrc2l6ZV90YXJnZXQiKTsKK30KKworaW50IGttcF9nZXRfc3RhY2tzaXplX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiBvbXBfZ2V0X2ludF90YXJnZXQodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia21wX2dldF9zdGFja3NpemVfdGFyZ2V0Iik7Cit9CisKK3ZvaWQga21wX3NldF9zdGFja3NpemVfc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgc2l6ZV90IHNpemUKKykKK3sKKyAgICBvbXBfc2V0X2ludF90YXJnZXQodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICJrbXBfc2V0X3N0YWNrc2l6ZV9zX3RhcmdldCIpOworfQorCitzaXplX3Qga21wX2dldF9zdGFja3NpemVfc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gb21wX2dldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImttcF9nZXRfc3RhY2tzaXplX3NfdGFyZ2V0Iik7Cit9CisKK3ZvaWQga21wX3NldF9ibG9ja3RpbWVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCB0aW1lCispCit7CisgICAgb21wX3NldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAia21wX3NldF9ibG9ja3RpbWVfdGFyZ2V0Iik7Cit9CisKK2ludCBrbXBfZ2V0X2Jsb2NrdGltZV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gb21wX2dldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImttcF9nZXRfYmxvY2t0aW1lX3RhcmdldCIpOworfQorCit2b2lkIGttcF9zZXRfbGlicmFyeV9zZXJpYWxfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAia21wX3NldF9saWJyYXJ5X3NlcmlhbF90YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCk7CisgICAgfQorfQorCit2b2lkIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgImttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAia21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDApOworICAgIH0KK30KKwordm9pZCBrbXBfc2V0X2xpYnJhcnlfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBtb2RlCispCit7CisgICAgb21wX3NldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAia21wX3NldF9saWJyYXJ5X3RhcmdldCIpOworfQorCitpbnQga21wX2dldF9saWJyYXJ5X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiBvbXBfZ2V0X2ludF90YXJnZXQodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia21wX2dldF9saWJyYXJ5X3RhcmdldCIpOworfQorCit2b2lkIGttcF9zZXRfZGVmYXVsdHNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGNoYXIgY29uc3QgKmRlZmF1bHRzCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19zdHJpbmdfcHRyOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19zdHJpbmdfcHRyOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgICAgIHZhcnNbMF0uYWxsb2NfaWYgPSAxOworICAgICAgICB2YXJzWzBdLmZyZWVfaWYgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9ICZkZWZhdWx0czsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgImttcF9zZXRfZGVmYXVsdHNfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KK30KKworLy8gYWZmaW5pdHkgQVBJIGZ1bmN0aW9ucworCit2b2lkIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFza190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9IG1hc2s7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KK30KKwordm9pZCBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2Yoa21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSBtYXNrOworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAia21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza190YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorfQorCitpbnQga21wX3NldF9hZmZpbml0eV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKykKK3sKKyAgICBpbnQgcmVzdWx0ID0gMTsKKworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMl0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2Yoa21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSBtYXNrOworCisgICAgICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMV0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgICAgIHZhcnNbMV0uc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICB2YXJzWzFdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1sxXS5wdHIgPSAmcmVzdWx0OworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAia21wX3NldF9hZmZpbml0eV90YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMiwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBrbXBfZ2V0X2FmZmluaXR5X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKQoreworICAgIGludCByZXN1bHQgPSAxOworCisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1syXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9IG1hc2s7CisKKyAgICAgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICAgICAgdmFyc1sxXS5zaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgIHZhcnNbMV0uY291bnQgPSAxOworICAgICAgICB2YXJzWzFdLnB0ciA9ICZyZXN1bHQ7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJrbXBfZ2V0X2FmZmluaXR5X3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAyLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIG9tcF9nZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jX3RhcmdldCIpOworfQorCitpbnQga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBwcm9jLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispCit7CisgICAgaW50IHJlc3VsdCA9IDE7CisKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzNdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9ICZwcm9jOworCisgICAgICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMV0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICAgICAgdmFyc1sxXS5zaXplID0gc2l6ZW9mKGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1sxXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMV0ucHRyID0gbWFzazsKKworICAgICAgICB2YXJzWzJdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzJdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzJdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgICAgICB2YXJzWzJdLnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgdmFyc1syXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMl0ucHRyID0gJnJlc3VsdDsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgImttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAzLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBwcm9jLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispCit7CisgICAgaW50IHJlc3VsdCA9IDE7CisKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzNdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9ICZwcm9jOworCisgICAgICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMV0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICAgICAgdmFyc1sxXS5zaXplID0gc2l6ZW9mKGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1sxXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMV0ucHRyID0gbWFzazsKKworICAgICAgICB2YXJzWzJdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzJdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzJdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgICAgICB2YXJzWzJdLnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgdmFyc1syXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMl0ucHRyID0gJnJlc3VsdDsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgImttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDMsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitpbnQga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBwcm9jLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispCit7CisgICAgaW50IHJlc3VsdCA9IDE7CisKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzNdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9ICZwcm9jOworCisgICAgICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMV0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICAgICAgdmFyc1sxXS5zaXplID0gc2l6ZW9mKGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1sxXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMV0ucHRyID0gbWFzazsKKworICAgICAgICB2YXJzWzJdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzJdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzJdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgICAgICB2YXJzWzJdLnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgdmFyc1syXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMl0ucHRyID0gJnJlc3VsdDsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgImttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAzLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfb21wX3RhcmdldC5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX29tcF90YXJnZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMjA1MmEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX29tcF90YXJnZXQuY3BwCkBAIC0wLDAgKzEsMTAyMSBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSA8b21wLmg+CisjaW5jbHVkZSAib2ZmbG9hZC5oIgorI2luY2x1ZGUgImNvbXBpbGVyX2lmX3RhcmdldC5oIgorCisvLyBPcGVuTVAgQVBJCisKK3ZvaWQgb21wX3NldF9kZWZhdWx0X2RldmljZShpbnQgbnVtKQoreworfQorCitpbnQgb21wX2dldF9kZWZhdWx0X2RldmljZSh2b2lkKQoreworICAgIHJldHVybiBtaWNfaW5kZXg7Cit9CisKK2ludCBvbXBfZ2V0X251bV9kZXZpY2VzKCkKK3sKKyAgICByZXR1cm4gbWljX2VuZ2luZXNfdG90YWw7Cit9CisKKy8vIE9wZW5NUCBBUEkgd3JhcHBlcnMKKworc3RhdGljIHZvaWQgb21wX3NlbmRfaW50X3RvX2hvc3QoCisgICAgdm9pZCAqb2ZsZF8sCisgICAgaW50IHNldHRpbmcKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgdmFyc1swXS5wdHIgPSAmc2V0dGluZzsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDEsIHZhcnMsIE5VTEwpOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCitzdGF0aWMgaW50IG9tcF9nZXRfaW50X2Zyb21faG9zdCgKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisgICAgaW50IHNldHRpbmc7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgIHZhcnNbMF0ucHRyID0gJnNldHRpbmc7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAxLCB2YXJzLCBOVUxMKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKKworICAgIHJldHVybiBzZXR0aW5nOworfQorCit2b2lkIG9tcF9zZXRfbnVtX3RocmVhZHNfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgbnVtX3RocmVhZHM7CisKKyAgICBudW1fdGhyZWFkcyA9IG9tcF9nZXRfaW50X2Zyb21faG9zdChvZmxkKTsKKyAgICBvbXBfc2V0X251bV90aHJlYWRzKG51bV90aHJlYWRzKTsKK30KKwordm9pZCBvbXBfZ2V0X21heF90aHJlYWRzX2xyYigKKyAgICB2b2lkICpvZmxkCispCit7CisgICAgaW50IG51bV90aHJlYWRzOworCisgICAgbnVtX3RocmVhZHMgPSBvbXBfZ2V0X21heF90aHJlYWRzKCk7CisgICAgb21wX3NlbmRfaW50X3RvX2hvc3Qob2ZsZCwgbnVtX3RocmVhZHMpOworfQorCit2b2lkIG9tcF9nZXRfbnVtX3Byb2NzX2xyYigKKyAgICB2b2lkICpvZmxkCispCit7CisgICAgaW50IG51bV9wcm9jczsKKworICAgIG51bV9wcm9jcyA9IG9tcF9nZXRfbnVtX3Byb2NzKCk7CisgICAgb21wX3NlbmRfaW50X3RvX2hvc3Qob2ZsZCwgbnVtX3Byb2NzKTsKK30KKwordm9pZCBvbXBfc2V0X2R5bmFtaWNfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgZHluYW1pYzsKKworICAgIGR5bmFtaWMgPSBvbXBfZ2V0X2ludF9mcm9tX2hvc3Qob2ZsZCk7CisgICAgb21wX3NldF9keW5hbWljKGR5bmFtaWMpOworfQorCit2b2lkIG9tcF9nZXRfZHluYW1pY19scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBkeW5hbWljOworCisgICAgZHluYW1pYyA9IG9tcF9nZXRfZHluYW1pYygpOworICAgIG9tcF9zZW5kX2ludF90b19ob3N0KG9mbGQsIGR5bmFtaWMpOworfQorCit2b2lkIG9tcF9zZXRfbmVzdGVkX2xyYigKKyAgICB2b2lkICpvZmxkCispCit7CisgICAgaW50IG5lc3RlZDsKKworICAgIG5lc3RlZCA9IG9tcF9nZXRfaW50X2Zyb21faG9zdChvZmxkKTsKKyAgICBvbXBfc2V0X25lc3RlZChuZXN0ZWQpOworfQorCit2b2lkIG9tcF9nZXRfbmVzdGVkX2xyYigKKyAgICB2b2lkICpvZmxkCispCit7CisgICAgaW50IG5lc3RlZDsKKworICAgIG5lc3RlZCA9IG9tcF9nZXRfbmVzdGVkKCk7CisgICAgb21wX3NlbmRfaW50X3RvX2hvc3Qob2ZsZCwgbmVzdGVkKTsKK30KKwordm9pZCBvbXBfc2V0X3NjaGVkdWxlX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMl0gPSB7MH07CisgICAgb21wX3NjaGVkX3Qga2luZDsKKyAgICBpbnQgbW9kaWZpZXI7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgIHZhcnNbMF0ucHRyID0gJmtpbmQ7CisKKyAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMV0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgIHZhcnNbMV0ucHRyID0gJm1vZGlmaWVyOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMiwgdmFycywgTlVMTCk7CisgICAgb21wX3NldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcik7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQgb21wX2dldF9zY2hlZHVsZV9scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzJdID0gezB9OworICAgIG9tcF9zY2hlZF90IGtpbmQ7CisgICAgaW50IG1vZGlmaWVyOworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgdmFyc1swXS5wdHIgPSAma2luZDsKKworICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgIHZhcnNbMV0ucHRyID0gJm1vZGlmaWVyOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMiwgdmFycywgTlVMTCk7CisgICAgb21wX2dldF9zY2hlZHVsZSgma2luZCwgJm1vZGlmaWVyKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKworLy8gbG9jayBBUEkgZnVuY3Rpb25zCisKK3ZvaWQgb21wX2luaXRfbG9ja19scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworICAgIG9tcF9sb2NrX3RhcmdldF90IGxvY2s7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICB2YXJzWzBdLnB0ciA9ICZsb2NrOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMSwgdmFycywgTlVMTCk7CisgICAgb21wX2luaXRfbG9jaygmbG9jay5sb2NrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBvbXBfZGVzdHJveV9sb2NrX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisgICAgb21wX2xvY2tfdGFyZ2V0X3QgbG9jazsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgdmFyc1swXS5wdHIgPSAmbG9jazsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDEsIHZhcnMsIE5VTEwpOworICAgIG9tcF9kZXN0cm95X2xvY2soJmxvY2subG9jayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQgb21wX3NldF9sb2NrX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisgICAgb21wX2xvY2tfdGFyZ2V0X3QgbG9jazsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgdmFyc1swXS5wdHIgPSAmbG9jazsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDEsIHZhcnMsIE5VTEwpOworICAgIG9tcF9zZXRfbG9jaygmbG9jay5sb2NrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBvbXBfdW5zZXRfbG9ja19scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworICAgIG9tcF9sb2NrX3RhcmdldF90IGxvY2s7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgIHZhcnNbMF0ucHRyID0gJmxvY2s7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAxLCB2YXJzLCBOVUxMKTsKKyAgICBvbXBfdW5zZXRfbG9jaygmbG9jay5sb2NrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBvbXBfdGVzdF9sb2NrX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMl0gPSB7MH07CisgICAgb21wX2xvY2tfdGFyZ2V0X3QgbG9jazsKKyAgICBpbnQgcmVzdWx0OworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICB2YXJzWzBdLnB0ciA9ICZsb2NrOworCisgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgdmFyc1sxXS5wdHIgPSAmcmVzdWx0OworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMiwgdmFycywgTlVMTCk7CisgICAgcmVzdWx0ID0gb21wX3Rlc3RfbG9jaygmbG9jay5sb2NrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKworLy8gbmVzdGVkIGxvY2sgQVBJIGZ1bmN0aW9ucworCit2b2lkIG9tcF9pbml0X25lc3RfbG9ja19scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgbG9jazsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgIHZhcnNbMF0ucHRyID0gJmxvY2s7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAxLCB2YXJzLCBOVUxMKTsKKyAgICBvbXBfaW5pdF9uZXN0X2xvY2soJmxvY2subG9jayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCBsb2NrOworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICB2YXJzWzBdLnB0ciA9ICZsb2NrOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMSwgdmFycywgTlVMTCk7CisgICAgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKCZsb2NrLmxvY2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIG9tcF9zZXRfbmVzdF9sb2NrX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCBsb2NrOworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICB2YXJzWzBdLnB0ciA9ICZsb2NrOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMSwgdmFycywgTlVMTCk7CisgICAgb21wX3NldF9uZXN0X2xvY2soJmxvY2subG9jayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQgb21wX3Vuc2V0X25lc3RfbG9ja19scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgbG9jazsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgdmFyc1swXS5wdHIgPSAmbG9jazsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDEsIHZhcnMsIE5VTEwpOworICAgIG9tcF91bnNldF9uZXN0X2xvY2soJmxvY2subG9jayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQgb21wX3Rlc3RfbmVzdF9sb2NrX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMl0gPSB7MH07CisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCBsb2NrOworICAgIGludCByZXN1bHQ7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgIHZhcnNbMF0ucHRyID0gJmxvY2s7CisKKyAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMV0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICB2YXJzWzFdLnB0ciA9ICZyZXN1bHQ7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAyLCB2YXJzLCBOVUxMKTsKKyAgICByZXN1bHQgPSBvbXBfdGVzdF9uZXN0X2xvY2soJmxvY2subG9jayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKKy8vIGttcCBBUEkgZnVuY3Rpb25zCisKK3ZvaWQga21wX3NldF9zdGFja3NpemVfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgc2l6ZTsKKworICAgIHNpemUgPSBvbXBfZ2V0X2ludF9mcm9tX2hvc3Qob2ZsZCk7CisgICAga21wX3NldF9zdGFja3NpemUoc2l6ZSk7Cit9CisKK3ZvaWQga21wX2dldF9zdGFja3NpemVfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgc2l6ZTsKKworICAgIHNpemUgPSBrbXBfZ2V0X3N0YWNrc2l6ZSgpOworICAgIG9tcF9zZW5kX2ludF90b19ob3N0KG9mbGQsIHNpemUpOworfQorCit2b2lkIGttcF9zZXRfc3RhY2tzaXplX3NfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgc2l6ZTsKKworICAgIHNpemUgPSBvbXBfZ2V0X2ludF9mcm9tX2hvc3Qob2ZsZCk7CisgICAga21wX3NldF9zdGFja3NpemVfcyhzaXplKTsKK30KKwordm9pZCBrbXBfZ2V0X3N0YWNrc2l6ZV9zX2xyYigKKyAgICB2b2lkICpvZmxkCispCit7CisgICAgaW50IHNpemU7CisKKyAgICBzaXplID0ga21wX2dldF9zdGFja3NpemVfcygpOworICAgIG9tcF9zZW5kX2ludF90b19ob3N0KG9mbGQsIHNpemUpOworfQorCit2b2lkIGttcF9zZXRfYmxvY2t0aW1lX2xyYigKKyAgICB2b2lkICpvZmxkCispCit7CisgICAgaW50IHRpbWU7CisKKyAgICB0aW1lID0gb21wX2dldF9pbnRfZnJvbV9ob3N0KG9mbGQpOworICAgIGttcF9zZXRfYmxvY2t0aW1lKHRpbWUpOworfQorCit2b2lkIGttcF9nZXRfYmxvY2t0aW1lX2xyYigKKyAgICB2b2lkICpvZmxkCispCit7CisgICAgaW50IHRpbWU7CisKKyAgICB0aW1lID0ga21wX2dldF9ibG9ja3RpbWUoKTsKKyAgICBvbXBfc2VuZF9pbnRfdG9faG9zdChvZmxkLCB0aW1lKTsKK30KKwordm9pZCBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDAsIDAsIDApOworICAgIGttcF9zZXRfbGlicmFyeV9zZXJpYWwoKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF9scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAwLCAwLCAwKTsKKyAgICBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCgpOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0X2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDAsIDAsIDApOworICAgIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQga21wX3NldF9saWJyYXJ5X2xyYigKKyAgICB2b2lkICpvZmxkCispCit7CisgICAgaW50IG1vZGU7CisKKyAgICBtb2RlID0gb21wX2dldF9pbnRfZnJvbV9ob3N0KG9mbGQpOworICAgIGttcF9zZXRfbGlicmFyeShtb2RlKTsKK30KKwordm9pZCBrbXBfZ2V0X2xpYnJhcnlfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgbW9kZTsKKworICAgIG1vZGUgPSBrbXBfZ2V0X2xpYnJhcnkoKTsKKyAgICBvbXBfc2VuZF9pbnRfdG9faG9zdChvZmxkLCBtb2RlKTsKK30KKwordm9pZCBrbXBfc2V0X2RlZmF1bHRzX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisgICAgY2hhciAqZGVmYXVsdHMgPSAwOworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfc3RyaW5nX3B0cjsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19zdHJpbmdfcHRyOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICB2YXJzWzBdLnB0ciA9ICZkZWZhdWx0czsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDEsIHZhcnMsIE5VTEwpOworICAgIGttcF9zZXRfZGVmYXVsdHMoZGVmYXVsdHMpOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCisvLyBhZmZpbml0eSBBUEkgZnVuY3Rpb25zCisKK3ZvaWQga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgbWFzazsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgIHZhcnNbMF0ucHRyID0gJm1hc2s7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAxLCB2YXJzLCBOVUxMKTsKKyAgICBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2soJm1hc2subWFzayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza19scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90IG1hc2s7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgIHZhcnNbMF0ucHRyID0gJm1hc2s7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAxLCB2YXJzLCBOVUxMKTsKKyAgICBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrKCZtYXNrLm1hc2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIGttcF9zZXRfYWZmaW5pdHlfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1syXSA9IHswfTsKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCBtYXNrOworICAgIGludCByZXN1bHQ7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgIHZhcnNbMF0ucHRyID0gJm1hc2s7CisKKyAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMV0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICB2YXJzWzFdLnB0ciA9ICZyZXN1bHQ7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAyLCB2YXJzLCBOVUxMKTsKKyAgICByZXN1bHQgPSBrbXBfc2V0X2FmZmluaXR5KCZtYXNrLm1hc2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIGttcF9nZXRfYWZmaW5pdHlfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1syXSA9IHswfTsKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCBtYXNrOworICAgIGludCByZXN1bHQ7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgIHZhcnNbMF0ucHRyID0gJm1hc2s7CisKKyAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMV0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICB2YXJzWzFdLnB0ciA9ICZyZXN1bHQ7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAyLCB2YXJzLCBOVUxMKTsKKyAgICByZXN1bHQgPSBrbXBfZ2V0X2FmZmluaXR5KCZtYXNrLm1hc2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgbWF4X3Byb2M7CisKKyAgICBtYXhfcHJvYyA9IGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MoKTsKKyAgICBvbXBfc2VuZF9pbnRfdG9faG9zdChvZmxkLCBtYXhfcHJvYyk7Cit9CisKK3ZvaWQga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1szXSA9IHswfTsKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCBtYXNrOworICAgIGludCBwcm9jLCByZXN1bHQ7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgIHZhcnNbMF0ucHRyID0gJnByb2M7CisKKyAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMV0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgIHZhcnNbMV0ucHRyID0gJm1hc2s7CisKKyAgICB2YXJzWzJdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMl0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1syXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICB2YXJzWzJdLnB0ciA9ICZyZXN1bHQ7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAzLCB2YXJzLCBOVUxMKTsKKyAgICByZXN1bHQgPSBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCAmbWFzay5tYXNrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbM10gPSB7MH07CisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgbWFzazsKKyAgICBpbnQgcHJvYywgcmVzdWx0OworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICB2YXJzWzBdLnB0ciA9ICZwcm9jOworCisgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICB2YXJzWzFdLnB0ciA9ICZtYXNrOworCisgICAgdmFyc1syXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzJdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMl0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgdmFyc1syXS5wdHIgPSAmcmVzdWx0OworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMywgdmFycywgTlVMTCk7CisgICAgcmVzdWx0ID0ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCAmbWFzay5tYXNrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY19scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzNdID0gezB9OworICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90IG1hc2s7CisgICAgaW50IHByb2MsIHJlc3VsdDsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgdmFyc1swXS5wdHIgPSAmcHJvYzsKKworICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgdmFyc1sxXS5wdHIgPSAmbWFzazsKKworICAgIHZhcnNbMl0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1syXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzJdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgIHZhcnNbMl0ucHRyID0gJnJlc3VsdDsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDMsIHZhcnMsIE5VTEwpOworICAgIHJlc3VsdCA9IGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsICZtYXNrLm1hc2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCisvLyBUYXJnZXQtc2lkZSBzdHVicyBmb3IgdGhlIGhvc3QgZnVuY3Rpb25zICh0byBhdm9pZCB1bnJlc29sdmVkcykKKy8vIFRoZXNlIGFyZSBuZWVkZWQgZm9yIHRoZSBvZmZsb2FkbSB0YWJsZQorCit2b2lkIG9tcF9zZXRfbnVtX3RocmVhZHNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBudW1fdGhyZWFkcworKQoreworfQorCitpbnQgb21wX2dldF9tYXhfdGhyZWFkc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKworaW50IG9tcF9nZXRfbnVtX3Byb2NzX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiAwOworfQorCit2b2lkIG9tcF9zZXRfZHluYW1pY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG51bV90aHJlYWRzCispCit7Cit9CisKK2ludCBvbXBfZ2V0X2R5bmFtaWNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgb21wX3NldF9uZXN0ZWRfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBudW1fdGhyZWFkcworKQoreworfQorCitpbnQgb21wX2dldF9uZXN0ZWRfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgb21wX3NldF9zY2hlZHVsZV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX3NjaGVkX3Qga2luZCwKKyAgICBpbnQgbW9kaWZpZXIKKykKK3sKK30KKwordm9pZCBvbXBfZ2V0X3NjaGVkdWxlX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfc2NoZWRfdCAqa2luZCwKKyAgICBpbnQgKm1vZGlmaWVyCispCit7Cit9CisKK3ZvaWQgb21wX2luaXRfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKK30KKwordm9pZCBvbXBfZGVzdHJveV9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworfQorCit2b2lkIG9tcF9zZXRfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKK30KKwordm9pZCBvbXBfdW5zZXRfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKK30KKworaW50IG9tcF90ZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgb21wX2luaXRfbmVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7Cit9CisKK3ZvaWQgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7Cit9CisKK3ZvaWQgb21wX3NldF9uZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKK30KKwordm9pZCBvbXBfdW5zZXRfbmVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7Cit9CisKK2ludCBvbXBfdGVzdF9uZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBrbXBfc2V0X3N0YWNrc2l6ZV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHNpemUKKykKK3sKK30KKworaW50IGttcF9nZXRfc3RhY2tzaXplX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiAwOworfQorCit2b2lkIGttcF9zZXRfc3RhY2tzaXplX3NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIHNpemVfdCBzaXplCispCit7Cit9CisKK3NpemVfdCBrbXBfZ2V0X3N0YWNrc2l6ZV9zX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiAwOworfQorCit2b2lkIGttcF9zZXRfYmxvY2t0aW1lX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgdGltZQorKQoreworfQorCitpbnQga21wX2dldF9ibG9ja3RpbWVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQga21wX3NldF9saWJyYXJ5X3NlcmlhbF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKK30KKwordm9pZCBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKK30KKwordm9pZCBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKK30KKwordm9pZCBrbXBfc2V0X2xpYnJhcnlfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBtb2RlCispCit7Cit9CisKK2ludCBrbXBfZ2V0X2xpYnJhcnlfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQga21wX3NldF9kZWZhdWx0c190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgY2hhciBjb25zdCAqZGVmYXVsdHMKKykKK3sKK30KKwordm9pZCBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispCit7Cit9CisKK3ZvaWQga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKykKK3sKK30KKworaW50IGttcF9zZXRfYWZmaW5pdHlfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispCit7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBrbXBfZ2V0X2FmZmluaXR5X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKQoreworICAgIHJldHVybiAwOworfQorCitpbnQga21wX2dldF9hZmZpbml0eV9tYXhfcHJvY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKworaW50IGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgcHJvYywKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKQoreworICAgIHJldHVybiAwOworfQorCitpbnQga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHByb2MsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKworaW50IGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgcHJvYywKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKQoreworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9vcnNsLmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfb3JzbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE2MmY4YQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfb3JzbC5jcHAKQEAgLTAsMCArMSw4NCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAib2ZmbG9hZF9vcnNsLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAib2ZmbG9hZF9ob3N0LmgiCisjaW5jbHVkZSAib3JzbC1saXRlL2luY2x1ZGUvb3JzbC1saXRlLmgiCisKK25hbWVzcGFjZSBPUlNMIHsKKworc3RhdGljIGJvb2wgICAgICAgICAgICBpc19lbmFibGVkID0gZmFsc2U7CitzdGF0aWMgY29uc3QgT1JTTFRhZyAgIG15X3RhZyA9ICJPZmZsb2FkIjsKKwordm9pZCBpbml0KCkKK3sKKyAgICBjb25zdCBjaGFyICplbnZfdmFyID0gZ2V0ZW52KCJPRkZMT0FEX0VOQUJMRV9PUlNMIik7CisgICAgaWYgKGVudl92YXIgIT0gMCAmJiAqZW52X3ZhciAhPSAnXDAnKSB7CisgICAgICAgIGludDY0X3QgbmV3X3ZhbDsKKyAgICAgICAgaWYgKF9fb2ZmbG9hZF9wYXJzZV9pbnRfc3RyaW5nKGVudl92YXIsIG5ld192YWwpKSB7CisgICAgICAgICAgICBpc19lbmFibGVkID0gbmV3X3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19pbnZhbGlkX2Vudl92YXJfaW50X3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT0ZGTE9BRF9FTkFCTEVfT1JTTCIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGlzX2VuYWJsZWQpIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiT1JTTCBpcyBlbmFibGVkXG4iKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIk9SU0wgaXMgZGlzYWJsZWRcbiIpOworICAgIH0KK30KKworYm9vbCByZXNlcnZlKGludCBkZXZpY2UpCit7CisgICAgaWYgKGlzX2VuYWJsZWQpIHsKKyAgICAgICAgaW50IHBudW0gPSBtaWNfZW5naW5lc1tkZXZpY2VdLmdldF9waHlzaWNhbF9pbmRleCgpOworICAgICAgICBPUlNMQnVzeVNldCBic2V0OworCisgICAgICAgIGJzZXQudHlwZSA9IEJVU1lfU0VUX0ZVTEw7CisgICAgICAgIGlmIChPUlNMUmVzZXJ2ZSgxLCAmcG51bSwgJmJzZXQsIG15X3RhZykgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIHRyeV9yZXNlcnZlKGludCBkZXZpY2UpCit7CisgICAgaWYgKGlzX2VuYWJsZWQpIHsKKyAgICAgICAgaW50IHBudW0gPSBtaWNfZW5naW5lc1tkZXZpY2VdLmdldF9waHlzaWNhbF9pbmRleCgpOworICAgICAgICBPUlNMQnVzeVNldCBic2V0OworCisgICAgICAgIGJzZXQudHlwZSA9IEJVU1lfU0VUX0ZVTEw7CisgICAgICAgIGlmIChPUlNMVHJ5UmVzZXJ2ZSgxLCAmcG51bSwgJmJzZXQsIG15X3RhZykgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIHJlbGVhc2UoaW50IGRldmljZSkKK3sKKyAgICBpZiAoaXNfZW5hYmxlZCkgeworICAgICAgICBpbnQgcG51bSA9IG1pY19lbmdpbmVzW2RldmljZV0uZ2V0X3BoeXNpY2FsX2luZGV4KCk7CisgICAgICAgIE9SU0xCdXN5U2V0IGJzZXQ7CisKKyAgICAgICAgYnNldC50eXBlID0gQlVTWV9TRVRfRlVMTDsKKyAgICAgICAgaWYgKE9SU0xSZWxlYXNlKDEsICZwbnVtLCAmYnNldCwgbXlfdGFnKSAhPSAwKSB7CisgICAgICAgICAgICAvLyBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUKKyAgICAgICAgfQorICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgT1JTTApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9vcnNsLmggYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX29yc2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGI4NmY5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9vcnNsLmgKQEAgLTAsMCArMSwyNSBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIE9GRkxPQURfT1JTTF9IX0lOQ0xVREVECisjZGVmaW5lIE9GRkxPQURfT1JTTF9IX0lOQ0xVREVECisKKy8vIE9SU0wgaW50ZXJmYWNlCituYW1lc3BhY2UgT1JTTCB7CisKK2V4dGVybiB2b2lkIGluaXQoKTsKKworZXh0ZXJuIGJvb2wgcmVzZXJ2ZShpbnQgZGV2aWNlKTsKK2V4dGVybiBib29sIHRyeV9yZXNlcnZlKGludCBkZXZpY2UpOworZXh0ZXJuIHZvaWQgcmVsZWFzZShpbnQgZGV2aWNlKTsKKworfSAvLyBuYW1lc3BhY2UgT1JTTAorCisjZW5kaWYgLy8gT0ZGTE9BRF9PUlNMX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdGFibGUuY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YWJsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YxNjVkZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdGFibGUuY3BwCkBAIC0wLDAgKzEsMzc1IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJvZmZsb2FkX3RhYmxlLmgiCisjaW5jbHVkZSAib2ZmbG9hZF9jb21tb24uaCIKKworI2lmICFIT1NUX0xJQlJBUlkKKy8vIFByZWRlZmluZWQgb2ZmbG9hZCBlbnRyaWVzCitleHRlcm4gdm9pZCBvbXBfc2V0X251bV90aHJlYWRzX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBvbXBfZ2V0X21heF90aHJlYWRzX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBvbXBfZ2V0X251bV9wcm9jc19scmIodm9pZCopOworZXh0ZXJuIHZvaWQgb21wX3NldF9keW5hbWljX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBvbXBfZ2V0X2R5bmFtaWNfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF9zZXRfbmVzdGVkX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBvbXBfZ2V0X25lc3RlZF9scmIodm9pZCopOworZXh0ZXJuIHZvaWQgb21wX3NldF9zY2hlZHVsZV9scmIodm9pZCopOworZXh0ZXJuIHZvaWQgb21wX2dldF9zY2hlZHVsZV9scmIodm9pZCopOworCitleHRlcm4gdm9pZCBvbXBfaW5pdF9sb2NrX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBvbXBfZGVzdHJveV9sb2NrX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBvbXBfc2V0X2xvY2tfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF91bnNldF9sb2NrX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBvbXBfdGVzdF9sb2NrX2xyYih2b2lkKik7CisKK2V4dGVybiB2b2lkIG9tcF9pbml0X25lc3RfbG9ja19scmIodm9pZCopOworZXh0ZXJuIHZvaWQgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBvbXBfc2V0X25lc3RfbG9ja19scmIodm9pZCopOworZXh0ZXJuIHZvaWQgb21wX3Vuc2V0X25lc3RfbG9ja19scmIodm9pZCopOworZXh0ZXJuIHZvaWQgb21wX3Rlc3RfbmVzdF9sb2NrX2xyYih2b2lkKik7CisKK2V4dGVybiB2b2lkIGttcF9zZXRfc3RhY2tzaXplX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfZ2V0X3N0YWNrc2l6ZV9scmIodm9pZCopOworZXh0ZXJuIHZvaWQga21wX3NldF9zdGFja3NpemVfc19scmIodm9pZCopOworZXh0ZXJuIHZvaWQga21wX2dldF9zdGFja3NpemVfc19scmIodm9pZCopOworZXh0ZXJuIHZvaWQga21wX3NldF9ibG9ja3RpbWVfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9nZXRfYmxvY2t0aW1lX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF9scmIodm9pZCopOworZXh0ZXJuIHZvaWQga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9zZXRfbGlicmFyeV9scmIodm9pZCopOworZXh0ZXJuIHZvaWQga21wX2dldF9saWJyYXJ5X2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfc2V0X2RlZmF1bHRzX2xyYih2b2lkKik7CisKK2V4dGVybiB2b2lkIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFza19scmIodm9pZCopOworZXh0ZXJuIHZvaWQga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza19scmIodm9pZCopOworZXh0ZXJuIHZvaWQga21wX3NldF9hZmZpbml0eV9scmIodm9pZCopOworZXh0ZXJuIHZvaWQga21wX2dldF9hZmZpbml0eV9scmIodm9pZCopOworZXh0ZXJuIHZvaWQga21wX2dldF9hZmZpbml0eV9tYXhfcHJvY19scmIodm9pZCopOworZXh0ZXJuIHZvaWQga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jX2xyYih2b2lkKik7CisKKy8vIFByZWRlZmluZWQgZW50cmllcyBvbiB0aGUgdGFyZ2V0IHNpZGUKK3N0YXRpYyBGdW5jVGFibGU6OkVudHJ5IHByZWRlZmluZWRfZW50cmllc1tdID0geworICAgICJvbXBfc2V0X251bV90aHJlYWRzX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX3NldF9udW1fdGhyZWFkc19scmIsCisgICAgIm9tcF9nZXRfbWF4X3RocmVhZHNfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfZ2V0X21heF90aHJlYWRzX2xyYiwKKyAgICAib21wX2dldF9udW1fcHJvY3NfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfZ2V0X251bV9wcm9jc19scmIsCisgICAgIm9tcF9zZXRfZHluYW1pY190YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF9zZXRfZHluYW1pY19scmIsCisgICAgIm9tcF9nZXRfZHluYW1pY190YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF9nZXRfZHluYW1pY19scmIsCisgICAgIm9tcF9zZXRfbmVzdGVkX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX3NldF9uZXN0ZWRfbHJiLAorICAgICJvbXBfZ2V0X25lc3RlZF90YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF9nZXRfbmVzdGVkX2xyYiwKKyAgICAib21wX3NldF9zY2hlZHVsZV90YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF9zZXRfc2NoZWR1bGVfbHJiLAorICAgICJvbXBfZ2V0X3NjaGVkdWxlX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX2dldF9zY2hlZHVsZV9scmIsCisKKyAgICAib21wX2luaXRfbG9ja190YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF9pbml0X2xvY2tfbHJiLAorICAgICJvbXBfZGVzdHJveV9sb2NrX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX2Rlc3Ryb3lfbG9ja19scmIsCisgICAgIm9tcF9zZXRfbG9ja190YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF9zZXRfbG9ja19scmIsCisgICAgIm9tcF91bnNldF9sb2NrX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX3Vuc2V0X2xvY2tfbHJiLAorICAgICJvbXBfdGVzdF9sb2NrX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX3Rlc3RfbG9ja19scmIsCisKKyAgICAib21wX2luaXRfbmVzdF9sb2NrX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX2luaXRfbmVzdF9sb2NrX2xyYiwKKyAgICAib21wX2Rlc3Ryb3lfbmVzdF9sb2NrX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX2Rlc3Ryb3lfbmVzdF9sb2NrX2xyYiwKKyAgICAib21wX3NldF9uZXN0X2xvY2tfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfc2V0X25lc3RfbG9ja19scmIsCisgICAgIm9tcF91bnNldF9uZXN0X2xvY2tfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfdW5zZXRfbmVzdF9sb2NrX2xyYiwKKyAgICAib21wX3Rlc3RfbmVzdF9sb2NrX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX3Rlc3RfbmVzdF9sb2NrX2xyYiwKKworICAgICJrbXBfc2V0X3N0YWNrc2l6ZV90YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9zZXRfc3RhY2tzaXplX2xyYiwKKyAgICAia21wX2dldF9zdGFja3NpemVfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfZ2V0X3N0YWNrc2l6ZV9scmIsCisgICAgImttcF9zZXRfc3RhY2tzaXplX3NfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfc2V0X3N0YWNrc2l6ZV9zX2xyYiwKKyAgICAia21wX2dldF9zdGFja3NpemVfc190YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9nZXRfc3RhY2tzaXplX3NfbHJiLAorICAgICJrbXBfc2V0X2Jsb2NrdGltZV90YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9zZXRfYmxvY2t0aW1lX2xyYiwKKyAgICAia21wX2dldF9ibG9ja3RpbWVfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfZ2V0X2Jsb2NrdGltZV9scmIsCisgICAgImttcF9zZXRfbGlicmFyeV9zZXJpYWxfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfc2V0X2xpYnJhcnlfc2VyaWFsX2xyYiwKKyAgICAia21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF9scmIsCisgICAgImttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0X3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfbHJiLAorICAgICJrbXBfc2V0X2xpYnJhcnlfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfc2V0X2xpYnJhcnlfbHJiLAorICAgICJrbXBfZ2V0X2xpYnJhcnlfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfZ2V0X2xpYnJhcnlfbHJiLAorICAgICJrbXBfc2V0X2RlZmF1bHRzX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX3NldF9kZWZhdWx0c19scmIsCisKKyAgICAia21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrX2xyYiwKKyAgICAia21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza190YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfbHJiLAorICAgICJrbXBfc2V0X2FmZmluaXR5X3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX3NldF9hZmZpbml0eV9scmIsCisgICAgImttcF9nZXRfYWZmaW5pdHlfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfZ2V0X2FmZmluaXR5X2xyYiwKKyAgICAia21wX2dldF9hZmZpbml0eV9tYXhfcHJvY190YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfbHJiLAorICAgICJrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jX2xyYiwKKyAgICAia21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQiLAorICAgICh2b2lkKikgJmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfbHJiLAorICAgICJrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jX2xyYiwKKworICAgIChjb25zdCBjaGFyKikgLTEsCisgICAgKHZvaWQqKSAtMQorfTsKKworc3RhdGljIEZ1bmNMaXN0OjpOb2RlIHByZWRlZmluZWRfdGFibGUgPSB7CisgICAgeyBwcmVkZWZpbmVkX2VudHJpZXMsIC0xIH0sCisgICAgMCwgMAorfTsKKworLy8gRW50cnkgdGFibGUKK0Z1bmNMaXN0IF9fb2ZmbG9hZF9lbnRyaWVzKCZwcmVkZWZpbmVkX3RhYmxlKTsKKyNlbHNlCitGdW5jTGlzdCBfX29mZmxvYWRfZW50cmllczsKKyNlbmRpZiAvLyAhSE9TVF9MSUJSQVJZCisKKy8vIEZ1bmN0aW9uIHRhYmxlLiBObyBwcmVkZWZpbmVkIGVudHJpZXMuCitGdW5jTGlzdCBfX29mZmxvYWRfZnVuY3M7CisKKy8vIFZhciB0YWJsZQorVmFyTGlzdCAgX19vZmZsb2FkX3ZhcnM7CisKKy8vIEdpdmVuIHRoZSBmdW5jdGlvbiBuYW1lIHJldHVybnMgdGhlIGFzc29jaXRhdGVkIGZ1bmN0aW9uIHBvaW50ZXIKK2NvbnN0IHZvaWQqIEZ1bmNMaXN0OjpmaW5kX2FkZHIoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBjb25zdCB2b2lkKiBmdW5jID0gMDsKKworICAgIG1fbG9jay5sb2NrKCk7CisKKyAgICBmb3IgKE5vZGUgKm4gPSBtX2hlYWQ7IG4gIT0gMDsgbiA9IG4tPm5leHQpIHsKKyAgICAgICAgZm9yIChjb25zdCBUYWJsZTo6RW50cnkgKmUgPSBuLT50YWJsZS5lbnRyaWVzOworICAgICAgICAgICAgIGUtPm5hbWUgIT0gKGNvbnN0IGNoYXIqKSAtMTsgZSsrKSB7CisgICAgICAgICAgICBpZiAoZS0+bmFtZSAhPSAwICYmIHN0cmNtcChlLT5uYW1lLCBuYW1lKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZnVuYyA9IGUtPmZ1bmM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtX2xvY2sudW5sb2NrKCk7CisKKyAgICByZXR1cm4gZnVuYzsKK30KKworLy8gR2l2ZW4gdGhlIGZ1bmN0aW9uIHBvaW50ZXIgcmV0dXJucyB0aGUgYXNzb2NpdGF0ZWQgZnVuY3Rpb24gbmFtZQorY29uc3QgY2hhciogRnVuY0xpc3Q6OmZpbmRfbmFtZShjb25zdCB2b2lkICpmdW5jKQoreworICAgIGNvbnN0IGNoYXIqIG5hbWUgPSAwOworCisgICAgbV9sb2NrLmxvY2soKTsKKworICAgIGZvciAoTm9kZSAqbiA9IG1faGVhZDsgbiAhPSAwOyBuID0gbi0+bmV4dCkgeworICAgICAgICBmb3IgKGNvbnN0IFRhYmxlOjpFbnRyeSAqZSA9IG4tPnRhYmxlLmVudHJpZXM7CisgICAgICAgICAgICAgZS0+bmFtZSAhPSAoY29uc3QgY2hhciopIC0xOyBlKyspIHsKKyAgICAgICAgICAgIGlmIChlLT5mdW5jID09IGZ1bmMpIHsKKyAgICAgICAgICAgICAgICBuYW1lID0gZS0+bmFtZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG1fbG9jay51bmxvY2soKTsKKworICAgIHJldHVybiBuYW1lOworfQorCisvLyBSZXR1cm5zIG1heCBuYW1lIGxlbmd0aCBmcm9tIGFsbCB0YWJsZXMKK2ludDY0X3QgRnVuY0xpc3Q6Om1heF9uYW1lX2xlbmd0aCh2b2lkKQoreworICAgIGlmIChtX21heF9uYW1lX2xlbiA8IDApIHsKKyAgICAgICAgbV9sb2NrLmxvY2soKTsKKworICAgICAgICBtX21heF9uYW1lX2xlbiA9IDA7CisgICAgICAgIGZvciAoTm9kZSAqbiA9IG1faGVhZDsgbiAhPSAwOyBuID0gbi0+bmV4dCkgeworICAgICAgICAgICAgaWYgKG4tPnRhYmxlLm1heF9uYW1lX2xlbiA8IDApIHsKKyAgICAgICAgICAgICAgICBuLT50YWJsZS5tYXhfbmFtZV9sZW4gPSAwOworCisgICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIG1heCBuYW1lIGxlbmd0aCBpbiBhIHNpbmdsZSB0YWJsZQorICAgICAgICAgICAgICAgIGZvciAoY29uc3QgVGFibGU6OkVudHJ5ICplID0gbi0+dGFibGUuZW50cmllczsKKyAgICAgICAgICAgICAgICAgICAgIGUtPm5hbWUgIT0gKGNvbnN0IGNoYXIqKSAtMTsgZSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlLT5uYW1lICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4oZS0+bmFtZSkgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4tPnRhYmxlLm1heF9uYW1lX2xlbiA8IGxlbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4tPnRhYmxlLm1heF9uYW1lX2xlbiA9IGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc2VsZWN0IG1heCBmcm9tIGFsbCB0YWJsZXMKKyAgICAgICAgICAgIGlmIChtX21heF9uYW1lX2xlbiA8IG4tPnRhYmxlLm1heF9uYW1lX2xlbikgeworICAgICAgICAgICAgICAgIG1fbWF4X25hbWVfbGVuID0gbi0+dGFibGUubWF4X25hbWVfbGVuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbV9sb2NrLnVubG9jaygpOworICAgIH0KKyAgICByZXR1cm4gbV9tYXhfbmFtZV9sZW47Cit9CisKKy8vIERlYnVnZ2luZyBkdW1wCit2b2lkIEZ1bmNMaXN0OjpkdW1wKHZvaWQpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRnVuY3Rpb24gdGFibGU6XG4iKTsKKworICAgIG1fbG9jay5sb2NrKCk7CisKKyAgICBmb3IgKE5vZGUgKm4gPSBtX2hlYWQ7IG4gIT0gMDsgbiA9IG4tPm5leHQpIHsKKyAgICAgICAgZm9yIChjb25zdCBUYWJsZTo6RW50cnkgKmUgPSBuLT50YWJsZS5lbnRyaWVzOworICAgICAgICAgICAgIGUtPm5hbWUgIT0gKGNvbnN0IGNoYXIqKSAtMTsgZSsrKSB7CisgICAgICAgICAgICBpZiAoZS0+bmFtZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiJXAgJXNcbiIsIGUtPmZ1bmMsIGUtPm5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbV9sb2NrLnVubG9jaygpOworfQorCisvLyBEZWJ1Z2dpbmcgZHVtcAordm9pZCBWYXJMaXN0OjpkdW1wKHZvaWQpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiVmFyIHRhYmxlOlxuIik7CisKKyAgICBtX2xvY2subG9jaygpOworCisgICAgZm9yIChOb2RlICpuID0gbV9oZWFkOyBuICE9IDA7IG4gPSBuLT5uZXh0KSB7CisgICAgICAgIGZvciAoY29uc3QgVGFibGU6OkVudHJ5ICplID0gbi0+dGFibGUuZW50cmllczsKKyAgICAgICAgICAgICBlLT5uYW1lICE9IChjb25zdCBjaGFyKikgLTE7IGUrKykgeworICAgICAgICAgICAgaWYgKGUtPm5hbWUgIT0gMCkgeworI2lmIEhPU1RfTElCUkFSWQorICAgICAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIiVzICVwICVsZFxuIiwgZS0+bmFtZSwgZS0+YWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUtPnNpemUpOworI2Vsc2UgIC8vIEhPU1RfTElCUkFSWQorICAgICAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIiVzICVwXG4iLCBlLT5uYW1lLCBlLT5hZGRyKTsKKyNlbmRpZiAvLyBIT1NUX0xJQlJBUlkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG1fbG9jay51bmxvY2soKTsKK30KKworLy8KK2ludDY0X3QgVmFyTGlzdDo6dGFibGVfc2l6ZShpbnQ2NF90ICZuZWxlbXMpCit7CisgICAgaW50NjRfdCBsZW5ndGggPSAwOworCisgICAgbmVsZW1zID0gMDsKKworICAgIC8vIGNhbGN1bGF0ZSBzdHJpbmcgdGFibGUgc2l6ZSBhbmQgbnVtYmVyIG9mIGVsZW1lbnRzCisgICAgZm9yIChOb2RlICpuID0gbV9oZWFkOyBuICE9IDA7IG4gPSBuLT5uZXh0KSB7CisgICAgICAgIGZvciAoY29uc3QgVGFibGU6OkVudHJ5ICplID0gbi0+dGFibGUuZW50cmllczsKKyAgICAgICAgICAgICBlLT5uYW1lICE9IChjb25zdCBjaGFyKikgLTE7IGUrKykgeworICAgICAgICAgICAgaWYgKGUtPm5hbWUgIT0gMCkgeworICAgICAgICAgICAgICAgIGxlbmd0aCArPSBzdHJsZW4oZS0+bmFtZSkgKyAxOworICAgICAgICAgICAgICAgIG5lbGVtcysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG5lbGVtcyAqIHNpemVvZihCdWZFbnRyeSkgKyBsZW5ndGg7Cit9CisKKy8vIGNvcHkgdGFibGUgdG8gdGhlIGd2ZW4gYnVmZmVyCit2b2lkIFZhckxpc3Q6OnRhYmxlX2NvcHkodm9pZCAqYnVmLCBpbnQ2NF90IG5lbGVtcykKK3sKKyAgICBCdWZFbnRyeSogZWxlbXMgPSBzdGF0aWNfY2FzdDxCdWZFbnRyeSo+KGJ1Zik7CisgICAgY2hhciogICAgIG5hbWVzID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oZWxlbXMgKyBuZWxlbXMpOworCisgICAgLy8gY29weSBlbnRyaWVzIHRvIGJ1ZmZlcgorICAgIGZvciAoTm9kZSAqbiA9IG1faGVhZDsgbiAhPSAwOyBuID0gbi0+bmV4dCkgeworICAgICAgICBmb3IgKGNvbnN0IFRhYmxlOjpFbnRyeSAqZSA9IG4tPnRhYmxlLmVudHJpZXM7CisgICAgICAgICAgICAgZS0+bmFtZSAhPSAoY29uc3QgY2hhciopIC0xOyBlKyspIHsKKyAgICAgICAgICAgIGlmIChlLT5uYW1lICE9IDApIHsKKyAgICAgICAgICAgICAgICAvLyBuYW1lIGZpZWxkIGNvbnRhaW5zIG9mZnNldCB0byB0aGUgbmFtZSBmcm9tIHRoZSBiZWdpbm5pbmcKKyAgICAgICAgICAgICAgICAvLyBvZiB0aGUgYnVmZmVyCisgICAgICAgICAgICAgICAgZWxlbXMtPm5hbWUgPSBuYW1lcyAtIHN0YXRpY19jYXN0PGNoYXIqPihidWYpOworICAgICAgICAgICAgICAgIGVsZW1zLT5hZGRyID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oZS0+YWRkcik7CisKKyAgICAgICAgICAgICAgICAvLyBjb3B5IG5hbWUgdG8gc3RyaW5nIHRhYmxlCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSA9IGUtPm5hbWU7CisgICAgICAgICAgICAgICAgd2hpbGUgKCgqbmFtZXMrKyA9ICpuYW1lKyspICE9ICdcMCcpOworCisgICAgICAgICAgICAgICAgZWxlbXMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLy8gcGF0Y2ggbmFtZSBvZmZzZXRzIGluIGEgYnVmZmVyCit2b2lkIFZhckxpc3Q6OnRhYmxlX3BhdGNoX25hbWVzKHZvaWQgKmJ1ZiwgaW50NjRfdCBuZWxlbXMpCit7CisgICAgQnVmRW50cnkqIGVsZW1zID0gc3RhdGljX2Nhc3Q8QnVmRW50cnkqPihidWYpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmVsZW1zOyBpKyspIHsKKyAgICAgICAgZWxlbXNbaV0ubmFtZSArPSByZWludGVycHJldF9jYXN0PGludHB0cl90PihidWYpOworICAgIH0KK30KKworLy8gQWRkcyBnaXZlbiBsaXN0IGVsZW1lbnQgdG8gdGhlIGdsb2JhbCBsb29rdXAgdGFibGUgbGlzdAorZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9yZWdpc3Rlcl90YWJsZXMoCisgICAgRnVuY0xpc3Q6Ok5vZGUgKmVudHJ5X3RhYmxlLAorICAgIEZ1bmNMaXN0OjpOb2RlICpmdW5jX3RhYmxlLAorICAgIFZhckxpc3Q6Ok5vZGUgKnZhcl90YWJsZQorKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIlJlZ2lzdGVyaW5nIG9mZmxvYWQgZnVuY3Rpb24gZW50cnkgdGFibGUgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeV90YWJsZSk7CisgICAgX19vZmZsb2FkX2VudHJpZXMuYWRkX3RhYmxlKGVudHJ5X3RhYmxlKTsKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIlJlZ2lzdGVyaW5nIGZ1bmN0aW9uIHRhYmxlICVwXG4iLCBmdW5jX3RhYmxlKTsKKyAgICBfX29mZmxvYWRfZnVuY3MuYWRkX3RhYmxlKGZ1bmNfdGFibGUpOworCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiUmVnaXN0ZXJpbmcgdmFyIHRhYmxlICVwXG4iLCB2YXJfdGFibGUpOworICAgIF9fb2ZmbG9hZF92YXJzLmFkZF90YWJsZSh2YXJfdGFibGUpOworfQorCisvLyBSZW1vdmVzIGdpdmVuIGxpc3QgZWxlbWVudCBmcm9tIHRoZSBnbG9iYWwgbG9va3VwIHRhYmxlIGxpc3QKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfdW5yZWdpc3Rlcl90YWJsZXMoCisgICAgRnVuY0xpc3Q6Ok5vZGUgKmVudHJ5X3RhYmxlLAorICAgIEZ1bmNMaXN0OjpOb2RlICpmdW5jX3RhYmxlLAorICAgIFZhckxpc3Q6Ok5vZGUgKnZhcl90YWJsZQorKQoreworICAgIF9fb2ZmbG9hZF9lbnRyaWVzLnJlbW92ZV90YWJsZShlbnRyeV90YWJsZSk7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJVbnJlZ2lzdGVyaW5nIGZ1bmN0aW9uIHRhYmxlICVwXG4iLCBmdW5jX3RhYmxlKTsKKyAgICBfX29mZmxvYWRfZnVuY3MucmVtb3ZlX3RhYmxlKGZ1bmNfdGFibGUpOworCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiVW5yZWdpc3RlcmluZyB2YXIgdGFibGUgJXBcbiIsIHZhcl90YWJsZSk7CisgICAgX19vZmZsb2FkX3ZhcnMucmVtb3ZlX3RhYmxlKHZhcl90YWJsZSk7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RhYmxlLmggYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZjZWQzZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdGFibGUuaApAQCAtMCwwICsxLDMwMSBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvKiEgXGZpbGUKKyAgICBcYnJpZWYgRnVuY3Rpb24gYW5kIFZhcmlhYmxlIHRhYmxlcyB1c2VkIGJ5IHRoZSBydW50aW1lIGxpYnJhcnkKKyovCisKKyNpZm5kZWYgT0ZGTE9BRF9UQUJMRV9IX0lOQ0xVREVECisjZGVmaW5lIE9GRkxPQURfVEFCTEVfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSAib2ZmbG9hZF91dGlsLmgiCisKKy8vIFRlbXBsYXRlIHJlcHJlc2VudGluZyBkb3VibGUgbGlua2VkIGxpc3Qgb2YgdGFibGVzCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgVGFibGVMaXN0IHsKK3B1YmxpYzoKKyAgICAvLyB0YWJsZSB0eXBlCisgICAgdHlwZWRlZiBUIFRhYmxlOworCisgICAgLy8gTGlzdCBub2RlCisgICAgc3RydWN0IE5vZGUgeworICAgICAgICBUYWJsZSAgIHRhYmxlOworICAgICAgICBOb2RlKiAgIHByZXY7CisgICAgICAgIE5vZGUqICAgbmV4dDsKKyAgICB9OworCitwdWJsaWM6CisgICAgZXhwbGljaXQgVGFibGVMaXN0KE5vZGUgKm5vZGUgPSAwKSA6IG1faGVhZChub2RlKSB7fQorCisgICAgdm9pZCBhZGRfdGFibGUoTm9kZSAqbm9kZSkgeworICAgICAgICBtX2xvY2subG9jaygpOworCisgICAgICAgIGlmIChtX2hlYWQgIT0gMCkgeworICAgICAgICAgICAgbm9kZS0+bmV4dCA9IG1faGVhZDsKKyAgICAgICAgICAgIG1faGVhZC0+cHJldiA9IG5vZGU7CisgICAgICAgIH0KKyAgICAgICAgbV9oZWFkID0gbm9kZTsKKworICAgICAgICBtX2xvY2sudW5sb2NrKCk7CisgICAgfQorCisgICAgdm9pZCByZW1vdmVfdGFibGUoTm9kZSAqbm9kZSkgeworICAgICAgICBtX2xvY2subG9jaygpOworCisgICAgICAgIGlmIChub2RlLT5uZXh0ICE9IDApIHsKKyAgICAgICAgICAgIG5vZGUtPm5leHQtPnByZXYgPSBub2RlLT5wcmV2OworICAgICAgICB9CisgICAgICAgIGlmIChub2RlLT5wcmV2ICE9IDApIHsKKyAgICAgICAgICAgIG5vZGUtPnByZXYtPm5leHQgPSBub2RlLT5uZXh0OworICAgICAgICB9CisgICAgICAgIGlmIChtX2hlYWQgPT0gbm9kZSkgeworICAgICAgICAgICAgbV9oZWFkID0gbm9kZS0+bmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIG1fbG9jay51bmxvY2soKTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBOb2RlKiAgICAgICAgICAgbV9oZWFkOworICAgIG11dGV4X3QgICAgICAgICBtX2xvY2s7Cit9OworCisvLyBGdW5jdGlvbiBsb29rdXAgdGFibGUuCitzdHJ1Y3QgRnVuY1RhYmxlIHsKKyAgICAvLyEgRnVuY3Rpb24gdGFibGUgZW50cnkKKyAgICAvKiEgVGhpcyB0YWJsZSBjb250YWlucyBmdW5jdGlvbnMgY3JlYXRlZCBmcm9tIG9mZmxvYWQgcmVnaW9ucy4gICAqLworICAgIC8qISBFYWNoIGVudHJ5IGNvbnNpc3RzIG9mIGEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24ncyAia2V5IgorICAgICAgICBhbmQgdGhlIGZ1bmN0aW9uIGFkZHJlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyohIEVhY2ggc2hhcmVkIGxpYnJhcnkgb3IgZXhlY3V0YWJsZSBtYXkgY29udGFpbiBvbmUgc3VjaCB0YWJsZS4gKi8KKyAgICAvKiEgVGhlIGVuZCBvZiB0aGUgdGFibGUgaXMgbWFya2VkIHdpdGggYW4gZW50cnkgd2hvc2UgbmFtZSBmaWVsZAorICAgICAgICBoYXMgdmFsdWUgLTEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgc3RydWN0IEVudHJ5IHsKKyAgICAgICAgY29uc3QgY2hhciogbmFtZTsgLy8hPCBOYW1lIG9mIHRoZSBmdW5jdGlvbgorICAgICAgICB2b2lkKiAgICAgICBmdW5jOyAvLyE8IEFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uCisgICAgfTsKKworICAgIC8vIGVudHJpZXMKKyAgICBjb25zdCBFbnRyeSAqZW50cmllczsKKworICAgIC8vIG1heCBuYW1lIGxlbmd0aAorICAgIGludDY0X3QgbWF4X25hbWVfbGVuOworfTsKKworLy8gRnVuY3Rpb24gdGFibGUKK2NsYXNzIEZ1bmNMaXN0IDogcHVibGljIFRhYmxlTGlzdDxGdW5jVGFibGU+IHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBGdW5jTGlzdChOb2RlICpub2RlID0gMCkgOiBUYWJsZUxpc3Q8VGFibGU+KG5vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbWF4X25hbWVfbGVuKC0xKQorICAgIHt9CisKKyAgICAvLyBhZGQgdGFibGUgdG8gdGhlIGxpc3QKKyAgICB2b2lkIGFkZF90YWJsZShOb2RlICpub2RlKSB7CisgICAgICAgIC8vIHJlY2FsY3VsYXRlIG1heCBmdW5jdGlvbiBuYW1lIGxlbmd0aAorICAgICAgICBtX21heF9uYW1lX2xlbiA9IC0xOworCisgICAgICAgIC8vIGFkZCB0YWJsZQorICAgICAgICBUYWJsZUxpc3Q8VGFibGU+OjphZGRfdGFibGUobm9kZSk7CisgICAgfQorCisgICAgLy8gZmluZCBmdW5jdGlvbiBhZGRyZXNzIGZvciB0aGUgZ2l2ZW4gbmFtZQorICAgIGNvbnN0IHZvaWQqIGZpbmRfYWRkcihjb25zdCBjaGFyICpuYW1lKTsKKworICAgIC8vIGZpbmQgZnVuY3Rpb24gbmFtZSBmb3IgdGhlIGdpdmVuIGFkZHJlc3MKKyAgICBjb25zdCBjaGFyKiBmaW5kX25hbWUoY29uc3Qgdm9pZCAqYWRkcik7CisKKyAgICAvLyBtYXggbmFtZSBsZW5ndGggZnJvbSBhbGwgdGFibGVzIGluIHRoZSBsaXN0CisgICAgaW50NjRfdCBtYXhfbmFtZV9sZW5ndGgodm9pZCk7CisKKyAgICAvLyBkZWJ1ZyBkdW1wCisgICAgdm9pZCBkdW1wKHZvaWQpOworCitwcml2YXRlOgorICAgIC8vIG1heCBuYW1lIGxlbmd0aCB3aXRoaW4gZnJvbSBhbGwgdGFibGVzCisgICAgaW50NjRfdCBtX21heF9uYW1lX2xlbjsKK307CisKKy8vIFRhYmxlIGVudHJ5IGZvciBzdGF0aWMgdmFyaWFibGVzCitzdHJ1Y3QgVmFyVGFibGUgeworICAgIC8vISBWYXJpYWJsZSB0YWJsZSBlbnRyeQorICAgIC8qISBUaGlzIHRhYmxlIGNvbnRhaW5zIHN0YXRpY2FsbHkgYWxsb2NhdGVkIHZhcmlhYmxlcyBtYXJrZWQgd2l0aAorICAgICAgICBfX2RlY2xzcGVjKHRhcmdldChtaWMpIG9yICNwcmFnbWEgb21wIGRlY2xhcmUgdGFyZ2V0LiAgICAgICAgICAgKi8KKyAgICAvKiEgRWFjaCBlbnRyeSBjb25zaXN0cyBvZiBhIHBvaW50ZXIgdG8gdGhlIHZhcmlhYmxlJ3MgImtleSIsCisgICAgICAgIHRoZSB2YXJpYWJsZSBhZGRyZXNzIGFuZCBpdHMgc2l6ZSBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qISBCZWNhdXNlIG1lbW9yeSBhbGxvY2F0aW9uIGlzIGRvbmUgZnJvbSB0aGUgaG9zdCwKKyAgICAgICAgdGhlIE1JQyB0YWJsZSBkb2VzIG5vdCBuZWVkIHRoZSBzaXplIG9mIHRoZSB2YXJpYWJsZS4gICAgICAgICAgICovCisgICAgLyohIFBhZGRpbmcgdG8gbWFrZSB0aGUgdGFibGUgZW50cnkgc2l6ZSBhIHBvd2VyIG9mIDIgaXMgbmVjZXNzYXJ5CisgICAgICAgIHRvIGF2b2lkICJob2xlcyIgYmV0d2VlbiB0YWJsZSBjb250cmlidXRpb25zIGZyb20gZGlmZmVyZW50IG9iamVjdAorICAgICAgICBmaWxlcyBvbiBXaW5kb3dzIHdoZW4gZGVidWcgaW5mb3JtYXRpb24gaXMgc3BlY2lmaWVkIHdpdGggL1ppLiAgKi8KKyAgICBzdHJ1Y3QgRW50cnkgeworICAgICAgICBjb25zdCBjaGFyKiBuYW1lOyAvLyE8IE5hbWUgb2YgdGhlIHZhcmlhYmxlCisgICAgICAgIHZvaWQqICAgICAgIGFkZHI7IC8vITwgQWRkcmVzcyBvZiB0aGUgdmFyaWFibGUKKworI2lmIEhPU1RfTElCUkFSWQorICAgICAgICB1aW50NjRfdCAgICBzaXplOworCisjaWZkZWYgVEFSR0VUX1dJTk5UCisJCS8vIHBhZGRpbmcgdG8gbWFrZSBlbnRyeSBzaXplIGEgcG93ZXIgb2YgMgorICAgICAgICB1aW50NjRfdCAgICBwYWRkaW5nOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorI2VuZGlmCisgICAgfTsKKworICAgIC8vIFRhYmxlIHRlcm1pbmF0ZWQgYnkgYW4gZW50cnkgd2l0aCBuYW1lID09IC0xCisgICAgY29uc3QgRW50cnkgKmVudHJpZXM7Cit9OworCisvLyBMaXN0IG9mIHZhciB0YWJsZXMKK2NsYXNzIFZhckxpc3QgOiBwdWJsaWMgVGFibGVMaXN0PFZhclRhYmxlPiB7CitwdWJsaWM6CisgICAgVmFyTGlzdCgpIDogVGFibGVMaXN0PFRhYmxlPigpCisgICAge30KKworICAgIC8vIGRlYnVnIGR1bXAKKyAgICB2b2lkIGR1bXAoKTsKKworcHVibGljOgorICAgIC8vIHZhciB0YWJsZSBsaXN0IGl0ZXJhdG9yCisgICAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlOjpFbnRyeT4geworICAgIHB1YmxpYzoKKyAgICAgICAgSXRlcmF0b3IoKSA6IG1fbm9kZSgwKSwgbV9lbnRyeSgwKSB7fQorCisgICAgICAgIGV4cGxpY2l0IEl0ZXJhdG9yKE5vZGUgKm5vZGUpIHsKKyAgICAgICAgICAgIG5ld19ub2RlKG5vZGUpOworICAgICAgICB9CisKKyAgICAgICAgSXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7CisgICAgICAgICAgICBpZiAobV9lbnRyeSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbV9lbnRyeSsrOworICAgICAgICAgICAgICAgIHdoaWxlIChtX2VudHJ5LT5uYW1lID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbV9lbnRyeSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobV9lbnRyeS0+bmFtZSA9PSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigtMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3X25vZGUobV9ub2RlLT5uZXh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgSXRlcmF0b3IgJm90aGVyKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9lbnRyeSA9PSBvdGhlci5tX2VudHJ5OworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEl0ZXJhdG9yICZvdGhlcikgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fZW50cnkgIT0gb3RoZXIubV9lbnRyeTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IFRhYmxlOjpFbnRyeSogb3BlcmF0b3IqKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fZW50cnk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgbmV3X25vZGUoTm9kZSAqbm9kZSkgeworICAgICAgICAgICAgbV9ub2RlID0gbm9kZTsKKyAgICAgICAgICAgIG1fZW50cnkgPSAwOworICAgICAgICAgICAgd2hpbGUgKG1fbm9kZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbV9lbnRyeSA9IG1fbm9kZS0+dGFibGUuZW50cmllczsKKyAgICAgICAgICAgICAgICB3aGlsZSAobV9lbnRyeS0+bmFtZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1fZW50cnkrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1fZW50cnktPm5hbWUgIT0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oLTEpKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtX25vZGUgPSBtX25vZGUtPm5leHQ7CisgICAgICAgICAgICAgICAgbV9lbnRyeSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIE5vZGUgICAgICAgICAgICAgICAgKm1fbm9kZTsKKyAgICAgICAgY29uc3QgVGFibGU6OkVudHJ5ICAqbV9lbnRyeTsKKyAgICB9OworCisgICAgSXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBJdGVyYXRvcihtX2hlYWQpOworICAgIH0KKworICAgIEl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEl0ZXJhdG9yKCk7CisgICAgfQorCitwdWJsaWM6CisgICAgLy8gRW50cnkgcmVwcmVzZW50YXRpb24gaW4gYSBjb3B5IGJ1ZmZlcgorICAgIHN0cnVjdCBCdWZFbnRyeSB7CisgICAgICAgIGludHB0cl90IG5hbWU7CisgICAgICAgIGludHB0cl90IGFkZHI7CisgICAgfTsKKworICAgIC8vIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0YWJsZSBhbmQKKyAgICAvLyByZXR1cm5zIHRoZSBzaXplIG9mIGJ1ZmZlciBmb3IgdGhlIHRhYmxlCisgICAgaW50NjRfdCB0YWJsZV9zaXplKGludDY0X3QgJm5lbGVtcyk7CisKKyAgICAvLyBDb3B5IHRhYmxlIGNvbnRlbnRzIHRvIGdpdmVuIGJ1ZmZlci4gSXQgaXMgc3VwcG9zZWQgdG8gYmUgbGFyZ2UKKyAgICAvLyBlbm91Z2ggdG8gaG9sZCBhbGwgZWxlbWVudHMgYXMgc3RyaW5nIHRhYmxlLgorICAgIHZvaWQgdGFibGVfY29weSh2b2lkICpidWYsIGludDY0X3QgbmVsZW1zKTsKKworICAgIC8vIFBhdGNoIG5hbWUgb2Zmc2V0cyBpbiBhIHRhYmxlIGFmdGVyIGl0J3MgYmVlbiBjb3BpZWQgdG8gb3RoZXIgc2lkZQorICAgIHN0YXRpYyB2b2lkIHRhYmxlX3BhdGNoX25hbWVzKHZvaWQgKmJ1ZiwgaW50NjRfdCBuZWxlbXMpOworfTsKKworZXh0ZXJuIEZ1bmNMaXN0IF9fb2ZmbG9hZF9lbnRyaWVzOworZXh0ZXJuIEZ1bmNMaXN0IF9fb2ZmbG9hZF9mdW5jczsKK2V4dGVybiBWYXJMaXN0ICBfX29mZmxvYWRfdmFyczsKKworLy8gU2VjdGlvbiBuYW1lcyB3aGVyZSB0aGUgbG9va3VwIHRhYmxlcyBhcmUgc3RvcmVkCisjaWZkZWYgVEFSR0VUX1dJTk5UCisjZGVmaW5lIE9GRkxPQURfRU5UUllfVEFCTEVfU0VDVElPTl9TVEFSVCAgICIuT2ZmbG9hZEVudHJ5VGFibGUkYSIKKyNkZWZpbmUgT0ZGTE9BRF9FTlRSWV9UQUJMRV9TRUNUSU9OX0VORCAgICAgIi5PZmZsb2FkRW50cnlUYWJsZSR6IgorCisjZGVmaW5lIE9GRkxPQURfRlVOQ19UQUJMRV9TRUNUSU9OX1NUQVJUICAgICIuT2ZmbG9hZEZ1bmNUYWJsZSRhIgorI2RlZmluZSBPRkZMT0FEX0ZVTkNfVEFCTEVfU0VDVElPTl9FTkQgICAgICAiLk9mZmxvYWRGdW5jVGFibGUkeiIKKworI2RlZmluZSBPRkZMT0FEX1ZBUl9UQUJMRV9TRUNUSU9OX1NUQVJUICAgICAiLk9mZmxvYWRWYXJUYWJsZSRhIgorI2RlZmluZSBPRkZMT0FEX1ZBUl9UQUJMRV9TRUNUSU9OX0VORCAgICAgICAiLk9mZmxvYWRWYXJUYWJsZSR6IgorCisjZGVmaW5lIE9GRkxPQURfQ1JUSU5JVF9TRUNUSU9OX1NUQVJUICAgICAgICIuQ1JUJFhDVCIKKworI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfQ1JUSU5JVF9TRUNUSU9OX1NUQVJULCByZWFkKQorCisjZWxzZSAgLy8gVEFSR0VUX1dJTk5UCisKKyNkZWZpbmUgT0ZGTE9BRF9FTlRSWV9UQUJMRV9TRUNUSU9OX1NUQVJUICAgIi5PZmZsb2FkRW50cnlUYWJsZS4iCisjZGVmaW5lIE9GRkxPQURfRU5UUllfVEFCTEVfU0VDVElPTl9FTkQgICAgICIuT2ZmbG9hZEVudHJ5VGFibGUuIgorCisjZGVmaW5lIE9GRkxPQURfRlVOQ19UQUJMRV9TRUNUSU9OX1NUQVJUICAgICIuT2ZmbG9hZEZ1bmNUYWJsZS4iCisjZGVmaW5lIE9GRkxPQURfRlVOQ19UQUJMRV9TRUNUSU9OX0VORCAgICAgICIuT2ZmbG9hZEZ1bmNUYWJsZS4iCisKKyNkZWZpbmUgT0ZGTE9BRF9WQVJfVEFCTEVfU0VDVElPTl9TVEFSVCAgICAgIi5PZmZsb2FkVmFyVGFibGUuIgorI2RlZmluZSBPRkZMT0FEX1ZBUl9UQUJMRV9TRUNUSU9OX0VORCAgICAgICAiLk9mZmxvYWRWYXJUYWJsZS4iCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX0VOVFJZX1RBQkxFX1NFQ1RJT05fU1RBUlQsIHJlYWQsIHdyaXRlKQorI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfRU5UUllfVEFCTEVfU0VDVElPTl9FTkQsIHJlYWQsIHdyaXRlKQorCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9GVU5DX1RBQkxFX1NFQ1RJT05fU1RBUlQsIHJlYWQsIHdyaXRlKQorI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfRlVOQ19UQUJMRV9TRUNUSU9OX0VORCwgcmVhZCwgd3JpdGUpCisKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX1ZBUl9UQUJMRV9TRUNUSU9OX1NUQVJULCByZWFkLCB3cml0ZSkKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX1ZBUl9UQUJMRV9TRUNUSU9OX0VORCwgcmVhZCwgd3JpdGUpCisKKworLy8gcmVnaXN0ZXIvdW5yZWdpc3RlciBnaXZlbiB0YWJsZXMKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfcmVnaXN0ZXJfdGFibGVzKAorICAgIEZ1bmNMaXN0OjpOb2RlICplbnRyeV90YWJsZSwKKyAgICBGdW5jTGlzdDo6Tm9kZSAqZnVuY190YWJsZSwKKyAgICBWYXJMaXN0OjpOb2RlICp2YXJfdGFibGUKKyk7CisKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfdW5yZWdpc3Rlcl90YWJsZXMoCisgICAgRnVuY0xpc3Q6Ok5vZGUgKmVudHJ5X3RhYmxlLAorICAgIEZ1bmNMaXN0OjpOb2RlICpmdW5jX3RhYmxlLAorICAgIFZhckxpc3Q6Ok5vZGUgKnZhcl90YWJsZQorKTsKKyNlbmRpZiAgLy8gT0ZGTE9BRF9UQUJMRV9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RhcmdldC5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RhcmdldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZjMWIwNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdGFyZ2V0LmNwcApAQCAtMCwwICsxLDc1NCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAib2ZmbG9hZF90YXJnZXQuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpZmRlZiBTRVBfU1VQUE9SVAorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjZW5kaWYgLy8gU0VQX1NVUFBPUlQKKyNpbmNsdWRlIDxvbXAuaD4KKyNpbmNsdWRlIDxtYXA+CisKKy8vIHR5cGVkZWYgb2ZmbG9hZF9mdW5jX3dpdGhfcGFybXMuCisvLyBQb2ludGVyIHRvIGZ1bmN0aW9uIHRoYXQgcmVwcmVzZW50cyBhbiBvZmZsb2FkZWQgZW50cnkgcG9pbnQuCisvLyBUaGUgcGFyYW1ldGVycyBhcmUgYSB0ZW1wb3JhcnkgZml4IGZvciBwYXJhbWV0ZXJzIG9uIHRoZSBzdGFjay4KK3R5cGVkZWYgdm9pZCAoKm9mZmxvYWRfZnVuY193aXRoX3Bhcm1zKSh2b2lkICopOworCisvLyBUYXJnZXQgY29uc29sZSBhbmQgZmlsZSBsb2dnaW5nCitjb25zdCBjaGFyICpwcmVmaXg7CitpbnQgY29uc29sZV9lbmFibGVkID0gMDsKK2ludCBvZmZsb2FkX3JlcG9ydF9sZXZlbCA9IDA7CisKKy8vIFRyYWNlIGluZm9ybWF0aW9uCitzdGF0aWMgY29uc3QgY2hhciogdmFyZGVzY19kaXJlY3Rpb25fYXNfc3RyaW5nW10gPSB7CisgICAgIk5PQ09QWSIsCisgICAgIklOIiwKKyAgICAiT1VUIiwKKyAgICAiSU5PVVQiCit9Oworc3RhdGljIGNvbnN0IGNoYXIqIHZhcmRlc2NfdHlwZV9hc19zdHJpbmdbXSA9IHsKKyAgICAidW5rbm93biIsCisgICAgImRhdGEiLAorICAgICJkYXRhX3B0ciIsCisgICAgImZ1bmNfcHRyIiwKKyAgICAidm9pZF9wdHIiLAorICAgICJzdHJpbmdfcHRyIiwKKyAgICAiZHYiLAorICAgICJkdl9kYXRhIiwKKyAgICAiZHZfZGF0YV9zbGljZSIsCisgICAgImR2X3B0ciIsCisgICAgImR2X3B0cl9kYXRhIiwKKyAgICAiZHZfcHRyX2RhdGFfc2xpY2UiLAorICAgICJjZWFuX3ZhciIsCisgICAgImNlYW5fdmFyX3B0ciIsCisgICAgImNfZGF0YV9wdHJfYXJyYXkiCit9OworCitpbnQgbWljX2luZGV4ID0gLTE7CitpbnQgbWljX2VuZ2luZXNfdG90YWwgPSAtMTsKK3VpbnQ2NF90IG1pY19mcmVxdWVuY3kgPSAwOworaW50IG9mZmxvYWRfbnVtYmVyID0gMDsKK3N0YXRpYyBzdGQ6Om1hcDx2b2lkKiwgUmVmSW5mbyo+IHJlZl9kYXRhOworc3RhdGljIG11dGV4X3QgYWRkX3JlZl9sb2NrOworCisjaWZkZWYgU0VQX1NVUFBPUlQKK3N0YXRpYyBjb25zdCBjaGFyKiAgc2VwX21vbml0b3JfZW52ID0gIlNFUF9NT05JVE9SIjsKK3N0YXRpYyBib29sICAgICAgICAgc2VwX21vbml0b3IgPSBmYWxzZTsKK3N0YXRpYyBjb25zdCBjaGFyKiAgc2VwX2RldmljZV9lbnYgPSAiU0VQX0RFVklDRSI7CitzdGF0aWMgY29uc3QgY2hhciogIHNlcF9kZXZpY2UgPSAgIi9kZXYvc2VwMy44L2MiOworc3RhdGljIGludCAgICAgICAgICBzZXBfY291bnRlciA9IDA7CisKKyNkZWZpbmUgU0VQX0FQSV9JT0NfTUFHSUMgICA5OQorI2RlZmluZSBTRVBfSU9DVExfUEFVU0UgICAgIF9JTyAoU0VQX0FQSV9JT0NfTUFHSUMsIDMxKQorI2RlZmluZSBTRVBfSU9DVExfUkVTVU1FICAgIF9JTyAoU0VQX0FQSV9JT0NfTUFHSUMsIDMyKQorCitzdGF0aWMgdm9pZCBhZGRfcmVmX2NvdW50KHZvaWQgKiBidWYsIGJvb2wgY3JlYXRlZCkKK3sKKyAgICBtdXRleF9sb2NrZXJfdCBsb2NrZXIoYWRkX3JlZl9sb2NrKTsKKyAgICBSZWZJbmZvICogaW5mbyA9IHJlZl9kYXRhW2J1Zl07CisKKyAgICBpZiAoaW5mbykgeworICAgICAgICBpbmZvLT5jb3VudCsrOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaW5mbyA9IG5ldyBSZWZJbmZvKChpbnQpY3JlYXRlZCwobG9uZykxKTsKKyAgICB9CisgICAgaW5mby0+aXNfYWRkZWQgfD0gY3JlYXRlZDsKKyAgICByZWZfZGF0YVtidWZdID0gaW5mbzsKK30KKworc3RhdGljIHZvaWQgQnVmUmVsZWFzZVJlZih2b2lkICogYnVmKQoreworICAgIG11dGV4X2xvY2tlcl90IGxvY2tlcihhZGRfcmVmX2xvY2spOworICAgIFJlZkluZm8gKiBpbmZvID0gcmVmX2RhdGFbYnVmXTsKKworICAgIGlmIChpbmZvKSB7CisgICAgICAgIC0taW5mby0+Y291bnQ7CisgICAgICAgIGlmIChpbmZvLT5jb3VudCA9PSAwICYmIGluZm8tPmlzX2FkZGVkKSB7CisgICAgICAgICAgICBCdWZmZXJSZWxlYXNlUmVmKGJ1Zik7CisgICAgICAgICAgICBpbmZvLT5pc19hZGRlZCA9IDA7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgVlRQYXVzZVNhbXBsaW5nKHZvaWQpCit7CisgICAgaW50IHJldCA9IC0xOworICAgIGludCBoYW5kbGUgPSBvcGVuKHNlcF9kZXZpY2UsIE9fUkRXUik7CisgICAgaWYgKGhhbmRsZSA+IDApIHsKKyAgICAgICAgcmV0ID0gaW9jdGwoaGFuZGxlLCBTRVBfSU9DVExfUEFVU0UpOworICAgICAgICBjbG9zZShoYW5kbGUpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IFZUUmVzdW1lU2FtcGxpbmcodm9pZCkKK3sKKyAgICBpbnQgcmV0ID0gLTE7CisgICAgaW50IGhhbmRsZSA9IG9wZW4oc2VwX2RldmljZSwgT19SRFdSKTsKKyAgICBpZiAoaGFuZGxlID4gMCkgeworICAgICAgICByZXQgPSBpb2N0bChoYW5kbGUsIFNFUF9JT0NUTF9SRVNVTUUpOworICAgICAgICBjbG9zZShoYW5kbGUpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorI2VuZGlmIC8vIFNFUF9TVVBQT1JUCisKK3ZvaWQgT2ZmbG9hZERlc2NyaXB0b3I6Om9mZmxvYWQoCisgICAgdWludDMyX3QgIGJ1ZmZlcl9jb3VudCwKKyAgICB2b2lkKiogICAgYnVmZmVycywKKyAgICB2b2lkKiAgICAgbWlzY19kYXRhLAorICAgIHVpbnQxNl90ICBtaXNjX2RhdGFfbGVuLAorICAgIHZvaWQqICAgICByZXR1cm5fZGF0YSwKKyAgICB1aW50MTZfdCAgcmV0dXJuX2RhdGFfbGVuCispCit7CisgICAgRnVuY3Rpb25EZXNjcmlwdG9yICpmdW5jID0gKEZ1bmN0aW9uRGVzY3JpcHRvciopIG1pc2NfZGF0YTsKKyAgICBjb25zdCBjaGFyICpuYW1lID0gZnVuYy0+ZGF0YTsKKyAgICBPZmZsb2FkRGVzY3JpcHRvciBvZmxkOworICAgIGNoYXIgKmluX2RhdGEgPSAwOworICAgIGNoYXIgKm91dF9kYXRhID0gMDsKKyAgICBjaGFyICp0aW1lcl9kYXRhID0gMDsKKworICAgIGNvbnNvbGVfZW5hYmxlZCA9IGZ1bmMtPmNvbnNvbGVfZW5hYmxlZDsKKyAgICB0aW1lcl9lbmFibGVkID0gZnVuYy0+dGltZXJfZW5hYmxlZDsKKyAgICBvZmZsb2FkX3JlcG9ydF9sZXZlbCA9IGZ1bmMtPm9mZmxvYWRfcmVwb3J0X2xldmVsOworICAgIG9mZmxvYWRfbnVtYmVyID0gZnVuYy0+b2ZmbG9hZF9udW1iZXI7CisgICAgb2ZsZC5zZXRfb2ZmbG9hZF9udW1iZXIoZnVuYy0+b2ZmbG9hZF9udW1iZXIpOworCisjaWZkZWYgU0VQX1NVUFBPUlQKKyAgICBpZiAoc2VwX21vbml0b3IpIHsKKyAgICAgICAgaWYgKF9fc3luY19mZXRjaF9hbmRfYWRkKCZzZXBfY291bnRlciwgMSkgPT0gMCkgeworICAgICAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiVlRSZXN1bWVTYW1wbGluZ1xuIik7CisgICAgICAgICAgICBWVFJlc3VtZVNhbXBsaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLy8gU0VQX1NVUFBPUlQKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSgyLCBvZmxkLmdldF9vZmZsb2FkX251bWJlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfc3RhcnRfdGFyZ2V0X2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJPZmZsb2FkIFwiJXNcIiBzdGFydGVkXG4iLCBuYW1lKTsKKworICAgIC8vIGluaXRpYWxpemUgdGltZXIgZGF0YQorICAgIE9GRkxPQURfVElNRVJfSU5JVCgpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVEFSVChjX29mZmxvYWRfdGFyZ2V0X3RvdGFsX3RpbWUpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVEFSVChjX29mZmxvYWRfdGFyZ2V0X2Rlc2NyaXB0b3Jfc2V0dXApOworCisgICAgLy8gZ2V0IGlucHV0L291dHB1dCBidWZmZXIgYWRkcmVzc2VzCisgICAgaWYgKGZ1bmMtPmluX2RhdGFsZW4gPiAwIHx8IGZ1bmMtPm91dF9kYXRhbGVuID4gMCkgeworICAgICAgICBpZiAoZnVuYy0+ZGF0YV9vZmZzZXQgIT0gMCkgeworICAgICAgICAgICAgaW5fZGF0YSA9IChjaGFyKikgbWlzY19kYXRhICsgZnVuYy0+ZGF0YV9vZmZzZXQ7CisgICAgICAgICAgICBvdXRfZGF0YSA9IChjaGFyKikgcmV0dXJuX2RhdGE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjaGFyICppbm91dF9idWYgPSAoY2hhciopIGJ1ZmZlcnNbLS1idWZmZXJfY291bnRdOworICAgICAgICAgICAgaW5fZGF0YSA9IGlub3V0X2J1ZjsKKyAgICAgICAgICAgIG91dF9kYXRhID0gaW5vdXRfYnVmOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gYXNzaWduIHZhcmlhYmxlIGRlc2NyaXB0b3JzCisgICAgb2ZsZC5tX3ZhcnNfdG90YWwgPSBmdW5jLT52YXJzX251bTsKKyAgICBpZiAob2ZsZC5tX3ZhcnNfdG90YWwgPiAwKSB7CisgICAgICAgIHVpbnQ2NF90IHZhcl9kYXRhX2xlbiA9IG9mbGQubV92YXJzX3RvdGFsICogc2l6ZW9mKFZhckRlc2MpOworCisgICAgICAgIG9mbGQubV92YXJzID0gKFZhckRlc2MqKSBtYWxsb2ModmFyX2RhdGFfbGVuKTsKKyAgICAgICAgbWVtY3B5KG9mbGQubV92YXJzLCBpbl9kYXRhLCB2YXJfZGF0YV9sZW4pOworCisgICAgICAgIGluX2RhdGEgKz0gdmFyX2RhdGFfbGVuOworICAgICAgICBmdW5jLT5pbl9kYXRhbGVuIC09IHZhcl9kYXRhX2xlbjsKKyAgICB9CisKKyAgICAvLyB0aW1lciBkYXRhCisgICAgaWYgKGZ1bmMtPnRpbWVyX2VuYWJsZWQpIHsKKyAgICAgICAgdWludDY0X3QgdGltZXJfZGF0YV9sZW4gPSBPRkZMT0FEX1RJTUVSX0RBVEFMRU4oKTsKKworICAgICAgICB0aW1lcl9kYXRhID0gb3V0X2RhdGE7CisgICAgICAgIG91dF9kYXRhICs9IHRpbWVyX2RhdGFfbGVuOworICAgICAgICBmdW5jLT5vdXRfZGF0YWxlbiAtPSB0aW1lcl9kYXRhX2xlbjsKKyAgICB9CisKKyAgICAvLyBpbml0IE1hcnNoYWxsZXJzCisgICAgb2ZsZC5tX2luLmluaXRfYnVmZmVyKGluX2RhdGEsIGZ1bmMtPmluX2RhdGFsZW4pOworICAgIG9mbGQubV9vdXQuaW5pdF9idWZmZXIob3V0X2RhdGEsIGZ1bmMtPm91dF9kYXRhbGVuKTsKKworICAgIC8vIGNvcHkgYnVmZmVycyB0byBvZmZsb2FkIGRlc2NyaXB0b3IKKyAgICBzdGQ6OmNvcHkoYnVmZmVycywgYnVmZmVycyArIGJ1ZmZlcl9jb3VudCwKKyAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKG9mbGQubV9idWZmZXJzKSk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUT1AoY19vZmZsb2FkX3RhcmdldF9kZXNjcmlwdG9yX3NldHVwKTsKKworICAgIC8vIGZpbmQgb2ZmbG9hZCBlbnRyeSBhZGRyZXNzCisgICAgT0ZGTE9BRF9USU1FUl9TVEFSVChjX29mZmxvYWRfdGFyZ2V0X2Z1bmNfbG9va3VwKTsKKworICAgIG9mZmxvYWRfZnVuY193aXRoX3Bhcm1zIGVudHJ5ID0gKG9mZmxvYWRfZnVuY193aXRoX3Bhcm1zKQorICAgICAgICBfX29mZmxvYWRfZW50cmllcy5maW5kX2FkZHIobmFtZSk7CisKKyAgICBpZiAoZW50cnkgPT0gTlVMTCkgeworI2lmIE9GRkxPQURfREVCVUcgPiAwCisgICAgICAgIGlmIChjb25zb2xlX2VuYWJsZWQgPiAyKSB7CisgICAgICAgICAgICBfX29mZmxvYWRfZW50cmllcy5kdW1wKCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfb2ZmbG9hZF9kZXNjcmlwdG9yX29mZmxvYWQsIG5hbWUpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIE9GRkxPQURfVElNRVJfU1RPUChjX29mZmxvYWRfdGFyZ2V0X2Z1bmNfbG9va3VwKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RBUlQoY19vZmZsb2FkX3RhcmdldF9mdW5jX3RpbWUpOworCisgICAgLy8gZXhlY3V0ZSBvZmZsb2FkIGVudHJ5CisgICAgZW50cnkoJm9mbGQpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVE9QKGNfb2ZmbG9hZF90YXJnZXRfZnVuY190aW1lKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RPUChjX29mZmxvYWRfdGFyZ2V0X3RvdGFsX3RpbWUpOworCisgICAgLy8gY29weSB0aW1lciBkYXRhIHRvIHRoZSBidWZmZXIKKyAgICBPRkZMT0FEX1RJTUVSX1RBUkdFVF9EQVRBKHRpbWVyX2RhdGEpOworCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiT2ZmbG9hZCBcIiVzXCIgZmluaXNoZWRcbiIsIG5hbWUpOworCisjaWZkZWYgU0VQX1NVUFBPUlQKKyAgICBpZiAoc2VwX21vbml0b3IpIHsKKyAgICAgICAgaWYgKF9fc3luY19zdWJfYW5kX2ZldGNoKCZzZXBfY291bnRlciwgMSkgPT0gMCkgeworICAgICAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiVlRQYXVzZVNhbXBsaW5nXG4iKTsKKyAgICAgICAgICAgIFZUUGF1c2VTYW1wbGluZygpOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8vIFNFUF9TVVBQT1JUCit9CisKK3ZvaWQgT2ZmbG9hZERlc2NyaXB0b3I6Om1lcmdlX3Zhcl9kZXNjcygKKyAgICBWYXJEZXNjICp2YXJzLAorICAgIFZhckRlc2MyICp2YXJzMiwKKyAgICBpbnQgdmFyc190b3RhbAorKQoreworICAgIC8vIG51bWJlciBvZiB2YXJpYWJsZSBkZXNjcmlwdG9ycyByZWNlaXZlZCBmcm9tIGhvc3QgYW5kIGdlbmVyYXRlZAorICAgIC8vIGxvY2FsbHkgc2hvdWxkIG1hdGNoCisgICAgaWYgKG1fdmFyc190b3RhbCA8IHZhcnNfdG90YWwpIHsKKyAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX21lcmdlX3Zhcl9kZXNjczEpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV92YXJzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgaWYgKGkgPCB2YXJzX3RvdGFsKSB7CisgICAgICAgICAgICAvLyB2YXJpYWJsZSB0eXBlIG11c3QgbWF0Y2gKKyAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0udHlwZS5iaXRzICE9IHZhcnNbaV0udHlwZS5iaXRzKSB7CisgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX21lcmdlX3Zhcl9kZXNjczIpOworICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1fdmFyc1tpXS5wdHIgPSB2YXJzW2ldLnB0cjsKKyAgICAgICAgICAgIG1fdmFyc1tpXS5pbnRvID0gdmFyc1tpXS5pbnRvOworCisgICAgICAgICAgICBjb25zdCBjaGFyICp2YXJfc25hbWUgPSAiIjsKKyAgICAgICAgICAgIGlmICh2YXJzMiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKHZhcnMyW2ldLnNuYW1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyX3NuYW1lID0gdmFyczJbaV0uc25hbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDIsIGdldF9vZmZsb2FkX251bWJlcigpLCBjX29mZmxvYWRfdmFyLAorICAgICAgICAgICAgICAgICIgICBWYXJEZXNjICVkLCB2YXI9JXMsICVzLCAlc1xuIiwKKyAgICAgICAgICAgICAgICBpLCB2YXJfc25hbWUsCisgICAgICAgICAgICAgICAgdmFyZGVzY19kaXJlY3Rpb25fYXNfc3RyaW5nW21fdmFyc1tpXS5kaXJlY3Rpb24uYml0c10sCisgICAgICAgICAgICAgICAgdmFyZGVzY190eXBlX2FzX3N0cmluZ1ttX3ZhcnNbaV0udHlwZS5zcmNdKTsKKyAgICAgICAgICAgIGlmICh2YXJzMiAhPSBOVUxMICYmIHZhcnMyW2ldLmRuYW1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDIsICIgICAgICAgICAgICAgIGludG89JXMsICVzXG4iLCB2YXJzMltpXS5kbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgdmFyZGVzY190eXBlX2FzX3N0cmluZ1ttX3ZhcnNbaV0udHlwZS5kc3RdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBPRkZMT0FEX1RSQUNFKDIsCisgICAgICAgICAgICAiICAgICAgICAgICAgICB0eXBlX3NyYz0lZCwgdHlwZV9kc3RuPSVkLCBkaXJlY3Rpb249JWQsICIKKyAgICAgICAgICAgICJhbGxvY19pZj0lZCwgZnJlZV9pZj0lZCwgYWxpZ249JWQsIG1pY19vZmZzZXQ9JWQsIGZsYWdzPTB4JXgsICIKKyAgICAgICAgICAgICJvZmZzZXQ9JWxsZCwgc2l6ZT0lbGxkLCBjb3VudC9kaXNwPSVsbGQsIHB0cj0lcCBpbnRvPSVwXG4iLAorICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuc3JjLAorICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuZHN0LAorICAgICAgICAgICAgbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzLAorICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmLAorICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYsCisgICAgICAgICAgICBtX3ZhcnNbaV0uYWxpZ24sCisgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5iaXRzLAorICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgbV92YXJzW2ldLmNvdW50LAorICAgICAgICAgICAgbV92YXJzW2ldLnB0ciwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5pbnRvKTsKKyAgICB9Cit9CisKK3ZvaWQgT2ZmbG9hZERlc2NyaXB0b3I6OnNjYXR0ZXJfY29weWluX2RhdGEoKQoreworICAgIE9GRkxPQURfVElNRVJfU1RBUlQoY19vZmZsb2FkX3RhcmdldF9zY2F0dGVyX2lucHV0cyk7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJJTiAgYnVmZmVyIEAgJXAgc2l6ZSAlbGxkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbV9pbi5nZXRfYnVmZmVyX3N0YXJ0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBtX2luLmdldF9idWZmZXJfc2l6ZSgpKTsKKyAgICBPRkZMT0FEX0RFQlVHX0RVTVBfQllURVMoMiwgbV9pbi5nZXRfYnVmZmVyX3N0YXJ0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW4uZ2V0X2J1ZmZlcl9zaXplKCkpOworCisgICAgLy8gcmVjZWl2ZSBkYXRhCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3ZhcnNfdG90YWw7IGkrKykgeworICAgICAgICBib29sIHNyY19pc19mb3JfbWljID0gKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmludG8gPT0gTlVMTCk7CisgICAgICAgIHZvaWQqKiBwdHJfYWRkciA9IHNyY19pc19mb3JfbWljID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZCoqPihtX3ZhcnNbaV0ucHRyKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHZvaWQqKj4obV92YXJzW2ldLmludG8pOworICAgICAgICBpbnQgdHlwZSA9IHNyY19pc19mb3JfbWljID8gbV92YXJzW2ldLnR5cGUuc3JjIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLmRzdDsKKyAgICAgICAgYm9vbCBpc19zdGF0aWMgPSBzcmNfaXNfZm9yX21pYyA/CisgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpY19kc3RuOworICAgICAgICB2b2lkICpwdHIgPSBOVUxMOworCisgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuYWxsb2NfZGlzcCkgeworICAgICAgICAgICAgaW50NjRfdCBvZmZzZXQgPSAwOworICAgICAgICAgICAgbV9pbi5yZWNlaXZlX2RhdGEoJm9mZnNldCwgc2l6ZW9mKG9mZnNldCkpOworICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCA9IC1vZmZzZXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFZBUl9UWVBFX0lTX0RWX0RBVEFfU0xJQ0UodHlwZSkgfHwKKyAgICAgICAgICAgIFZBUl9UWVBFX0lTX0RWX0RBVEEodHlwZSkpIHsKKyAgICAgICAgICAgIEFyckRlc2MgKmR2cCA9ICh0eXBlID09IGNfZHZfZGF0YV9zbGljZSB8fCB0eXBlID09IGNfZHZfZGF0YSk/CisgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEFyckRlc2MqPihwdHJfYWRkcikgOgorICAgICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8QXJyRGVzYyoqPihwdHJfYWRkcik7CisgICAgICAgICAgICBwdHJfYWRkciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCoqPigmZHZwLT5CYXNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldCBwb2ludGVyIHZhbHVlcworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cl9hcnJheToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBqID0gbV92YXJzW2ldLnB0cl9hcnJfb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2VsID0gaiArIG1fdmFyc1tpXS5jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqZHN0X2Fycl9wdHIgPSAoc3JjX2lzX2Zvcl9taWMpPworICAgICAgICAgICAgICAgICAgICAgICAgKihyZWludGVycHJldF9jYXN0PGNoYXIqKj4obV92YXJzW2ldLnB0cikpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5pbnRvKTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKDsgaiA8IG1heF9lbDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2lzX2Zvcl9taWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbal0ucHRyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2Fycl9wdHIgKyBtX3ZhcnNbal0ucHRyX2Fycl9vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbal0uaW50byA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9hcnJfcHRyICsgbV92YXJzW2pdLnB0cl9hcnJfb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBjX2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfdm9pZF9wdHI6CisgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXI6CisgICAgICAgICAgICBjYXNlIGNfZHY6CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19zdHJpbmdfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHI6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5hbGxvY19pZikgeworICAgICAgICAgICAgICAgICAgICB2b2lkICpidWY7CisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2luLnJlY2VpdmVfZGF0YSgmYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYgPSBtX2J1ZmZlcnMuZnJvbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fYnVmZmVycy5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoYnVmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX3N0YXRpYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNyZW1lbnQgYnVmZmVyIHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKGNfb2ZmbG9hZF90YXJnZXRfYWRkX2J1ZmZlcl9yZWZzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyQWRkUmVmKGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVElNRVJfU1RPUChjX29mZmxvYWRfdGFyZ2V0X2FkZF9idWZmZXJfcmVmcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9yZWZfY291bnQoYnVmLCAwID09IG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gc3RhdGljX2Nhc3Q8Y2hhcio+KGJ1ZikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV92YXJzW2ldLmZsYWdzLmlzX3N0YWNrX2J1ZiA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgOiBtX3ZhcnNbaV0ub2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAqcHRyX2FkZHIgPSBwdHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIpIHsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmOworICAgICAgICAgICAgICAgICAgICBtX2luLnJlY2VpdmVfZGF0YSgmYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgKnB0ciA9IHN0YXRpY19jYXN0PGNoYXIqPihidWYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhY2tfYnVmID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDogbV92YXJzW2ldLm9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgICpwdHJfYWRkciA9IHB0cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19mdW5jX3B0cjoKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfZHZfZGF0YV9zbGljZToKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHJfZGF0YV9zbGljZToKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmFsbG9jX2lmKSB7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1faW4ucmVjZWl2ZV9kYXRhKCZidWYsIHNpemVvZihidWYpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA9IG1fYnVmZmVycy5mcm9udCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbV9idWZmZXJzLnBvcF9mcm9udCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChidWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNfc3RhdGljKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY3JlbWVudCBidWZmZXIgcmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVElNRVJfU1RBUlQoY19vZmZsb2FkX3RhcmdldF9hZGRfYnVmZmVyX3JlZnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJBZGRSZWYoYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9USU1FUl9TVE9QKGNfb2ZmbG9hZF90YXJnZXRfYWRkX2J1ZmZlcl9yZWZzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX3JlZl9jb3VudChidWYsIDAgPT0gbV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSBzdGF0aWNfY2FzdDxjaGFyKj4oYnVmKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgKyBtX3ZhcnNbaV0ub2Zmc2V0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICpwdHJfYWRkciA9IHB0cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkcikgeworICAgICAgICAgICAgICAgICAgICB2b2lkICpidWY7CisgICAgICAgICAgICAgICAgICAgIG1faW4ucmVjZWl2ZV9kYXRhKCZidWYsIHNpemVvZihidWYpKTsKKyAgICAgICAgICAgICAgICAgICAgcHRyID0gc3RhdGljX2Nhc3Q8Y2hhcio+KGJ1ZikgKworICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCArIG1fdmFyc1tpXS5vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICpwdHJfYWRkciA9IHB0cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3Vua25vd25fdmFyX3R5cGUsIHR5cGUpOworICAgICAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gUmVsZWFzZSBvYnNvbGV0ZSBidWZmZXJzIGZvciBzdGFjayBvZiBwZXJzaXN0ZW50IG9iamVjdHMKKyAgICAgICAgaWYgKHR5cGUgPSBjX2RhdGFfcHRyICYmCisgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhY2tfYnVmICYmCisgICAgICAgICAgICAhbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzICYmCisgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYgJiYKKyAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplICE9IDApIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqPTA7IGogPCBtX3ZhcnNbaV0uc2l6ZTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgbV9pbi5yZWNlaXZlX2RhdGEoJmJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgICAgICAgICBCdWZmZXJSZWxlYXNlUmVmKGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIHJlZl9kYXRhLmVyYXNlKGJ1Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIERvIGNvcHlpbgorICAgICAgICBzd2l0Y2ggKG1fdmFyc1tpXS50eXBlLmRzdCkgeworICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyX2FycmF5OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBjX2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfdm9pZF9wdHI6CisgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXI6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uaW4gJiYKKyAgICAgICAgICAgICAgICAgICAgIW1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWNfZHN0bikgeworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHNpemU7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZGlzcDsKKyAgICAgICAgICAgICAgICAgICAgY2hhciogcHRyID0gbV92YXJzW2ldLmludG8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5pbnRvKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLnB0cik7CisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0udHlwZS5kc3QgPT0gY19jZWFuX3ZhcikgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9pbi5yZWNlaXZlX2RhdGEoKCZzaXplKSwgc2l6ZW9mKGludDY0X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1faW4ucmVjZWl2ZV9kYXRhKCgmZGlzcCksIHNpemVvZihpbnQ2NF90KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gbV92YXJzW2ldLnNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXNwID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtX2luLnJlY2VpdmVfZGF0YShwdHIgKyBkaXNwLCBzaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19kdjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzIHx8CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5hbGxvY19pZiB8fAorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICBjaGFyKiBwdHIgPSBtX3ZhcnNbaV0uaW50byA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLmludG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0ucHRyKTsKKyAgICAgICAgICAgICAgICAgICAgbV9pbi5yZWNlaXZlX2RhdGEocHRyICsgc2l6ZW9mKHVpbnQ2NF90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgLSBzaXplb2YodWludDY0X3QpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19zdHJpbmdfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHI6CisgICAgICAgICAgICBjYXNlIGNfZHZfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHJfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhX3NsaWNlOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhX3NsaWNlOgorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfZnVuY19wdHI6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgbV9pbi5yZWNlaXZlX2Z1bmNfcHRyKChjb25zdCB2b2lkKiopIG1fdmFyc1tpXS5wdHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfdW5rbm93bl92YXJfdHlwZSwgbV92YXJzW2ldLnR5cGUuZHN0KTsKKyAgICAgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICB9CisgICAgfQorCisgICAgT0ZGTE9BRF9UUkFDRSgxLCAiVG90YWwgY29weWluIGRhdGEgcmVjZWl2ZWQgZnJvbSBob3N0OiBbJWxsZF0gYnl0ZXNcbiIsCisgICAgICAgICAgICAgICAgICBtX2luLmdldF90ZnJfc2l6ZSgpKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RPUChjX29mZmxvYWRfdGFyZ2V0X3NjYXR0ZXJfaW5wdXRzKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RBUlQoY19vZmZsb2FkX3RhcmdldF9jb21wdXRlKTsKK30KKwordm9pZCBPZmZsb2FkRGVzY3JpcHRvcjo6Z2F0aGVyX2NvcHlvdXRfZGF0YSgpCit7CisgICAgT0ZGTE9BRF9USU1FUl9TVE9QKGNfb2ZmbG9hZF90YXJnZXRfY29tcHV0ZSk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKGNfb2ZmbG9hZF90YXJnZXRfZ2F0aGVyX291dHB1dHMpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3ZhcnNfdG90YWw7IGkrKykgeworICAgICAgICBib29sIHNyY19pc19mb3JfbWljID0gKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmludG8gPT0gTlVMTCk7CisKKyAgICAgICAgc3dpdGNoIChtX3ZhcnNbaV0udHlwZS5zcmMpIHsKKyAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cl9hcnJheToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgY19kYXRhOgorICAgICAgICAgICAgY2FzZSBjX3ZvaWRfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLm91dCAmJgorICAgICAgICAgICAgICAgICAgICAhbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYykgeworICAgICAgICAgICAgICAgICAgICBtX291dC5zZW5kX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLnB0cikgKyBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19kdjoKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX3N0cmluZ19wdHI6CisgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHI6CisgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXJfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZyZWVfaWYgJiYKKyAgICAgICAgICAgICAgICAgICAgc3JjX2lzX2Zvcl9taWMgJiYKKyAgICAgICAgICAgICAgICAgICAgIW1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmID0gKnN0YXRpY19jYXN0PGNoYXIqKj4obV92YXJzW2ldLnB0cikgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1fdmFyc1tpXS5mbGFncy5pc19zdGFja19idWY/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA6IG1fdmFyc1tpXS5vZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBpZiAoYnVmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGRlY3JlbWVudCBidWZmZXIgcmVmZXJlbmNlIGNvdW50CisgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVElNRVJfU1RBUlQoY19vZmZsb2FkX3RhcmdldF9yZWxlYXNlX2J1ZmZlcl9yZWZzKTsKKyAgICAgICAgICAgICAgICAgICAgQnVmUmVsZWFzZVJlZihidWYpOworICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RJTUVSX1NUT1AoY19vZmZsb2FkX3RhcmdldF9yZWxlYXNlX2J1ZmZlcl9yZWZzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19mdW5jX3B0cjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgbV9vdXQuc2VuZF9mdW5jX3B0cigqKCh2b2lkKiopIG1fdmFyc1tpXS5wdHIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhOgorICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGFfc2xpY2U6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGFfc2xpY2U6CisgICAgICAgICAgICAgICAgaWYgKHNyY19pc19mb3JfbWljICYmCisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmICYmCisgICAgICAgICAgICAgICAgICAgICFtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljKSB7CisgICAgICAgICAgICAgICAgICAgIEFyckRlc2MgKmR2cCA9IChtX3ZhcnNbaV0udHlwZS5zcmMgPT0gY19kdl9kYXRhIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5zcmMgPT0gY19kdl9kYXRhX3NsaWNlKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBcnJEZXNjKj4obV92YXJzW2ldLnB0cikgOgorICAgICAgICAgICAgICAgICAgICAgICAgKnN0YXRpY19jYXN0PEFyckRlc2MqKj4obV92YXJzW2ldLnB0cik7CisKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oZHZwLT5CYXNlKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldDsKKworICAgICAgICAgICAgICAgICAgICBpZiAoYnVmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVjcmVtZW50IGJ1ZmZlciByZWZlcmVuY2UgY291bnQKKyAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9USU1FUl9TVEFSVChjX29mZmxvYWRfdGFyZ2V0X3JlbGVhc2VfYnVmZmVyX3JlZnMpOworICAgICAgICAgICAgICAgICAgICBCdWZSZWxlYXNlUmVmKGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVElNRVJfU1RPUChjX29mZmxvYWRfdGFyZ2V0X3JlbGVhc2VfYnVmZmVyX3JlZnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfdW5rbm93bl92YXJfdHlwZSwgbV92YXJzW2ldLnR5cGUuZHN0KTsKKyAgICAgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1fdmFyc1tpXS5pbnRvKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG1fdmFyc1tpXS50eXBlLmRzdCkgeworICAgICAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cl9hcnJheToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBjX2RhdGE6CisgICAgICAgICAgICAgICAgY2FzZSBjX3ZvaWRfcHRyOgorICAgICAgICAgICAgICAgIGNhc2UgY19jZWFuX3ZhcjoKKyAgICAgICAgICAgICAgICBjYXNlIGNfZHY6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBjX3N0cmluZ19wdHI6CisgICAgICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyOgorICAgICAgICAgICAgICAgIGNhc2UgY19jZWFuX3Zhcl9wdHI6CisgICAgICAgICAgICAgICAgY2FzZSBjX2R2X3B0cjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uaW4gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpY19kc3RuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWYgPSAqc3RhdGljX2Nhc3Q8Y2hhcioqPihtX3ZhcnNbaV0uaW50bykgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1fdmFyc1tpXS5mbGFncy5pc19zdGFja19idWY/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA6IG1fdmFyc1tpXS5vZmZzZXQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnVmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlY3JlbWVudCBidWZmZXIgcmVmZXJlbmNlIGNvdW50CisgICAgICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF90YXJnZXRfcmVsZWFzZV9idWZmZXJfcmVmcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBCdWZSZWxlYXNlUmVmKGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RJTUVSX1NUT1AoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX3RhcmdldF9yZWxlYXNlX2J1ZmZlcl9yZWZzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgY19mdW5jX3B0cjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIGNfZHZfZGF0YToKKyAgICAgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGE6CisgICAgICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGFfc2xpY2U6CisgICAgICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhX3NsaWNlOgorICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZyZWVfaWYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXJlY3Rpb24uaW4gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICFtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljX2RzdG4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFyckRlc2MgKmR2cCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1fdmFyc1tpXS50eXBlLmRzdCA9PSBjX2R2X2RhdGFfc2xpY2UgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuZHN0ID09IGNfZHZfZGF0YSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFyckRlc2MqPihtX3ZhcnNbaV0uaW50bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdGF0aWNfY2FzdDxBcnJEZXNjKio+KG1fdmFyc1tpXS5pbnRvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGR2cC0+QmFzZSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWNyZW1lbnQgYnVmZmVyIHJlZmVyZW5jZSBjb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9USU1FUl9TVEFSVCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfdGFyZ2V0X3JlbGVhc2VfYnVmZmVyX3JlZnMpOworICAgICAgICAgICAgICAgICAgICAgICAgQnVmUmVsZWFzZVJlZihidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9USU1FUl9TVE9QKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF90YXJnZXRfcmVsZWFzZV9idWZmZXJfcmVmcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfdW5rbm93bl92YXJfdHlwZSwgbV92YXJzW2ldLnR5cGUuZHN0KTsKKyAgICAgICAgICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIk9VVCBidWZmZXIgQCBwICVwIHNpemUgJWxsZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fb3V0LmdldF9idWZmZXJfc3RhcnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fb3V0LmdldF9idWZmZXJfc2l6ZSgpKTsKKworICAgIE9GRkxPQURfREVCVUdfRFVNUF9CWVRFUygyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX291dC5nZXRfYnVmZmVyX3N0YXJ0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fb3V0LmdldF9idWZmZXJfc2l6ZSgpKTsKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSgxLCBnZXRfb2ZmbG9hZF9udW1iZXIoKSwgY19vZmZsb2FkX2NvcHlvdXRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICJUb3RhbCBjb3B5b3V0IGRhdGEgc2VudCB0byBob3N0OiBbJWxsZF0gYnl0ZXNcbiIsCisgICAgICAgICAgICAgICAgICBtX291dC5nZXRfdGZyX3NpemUoKSk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUT1AoY19vZmZsb2FkX3RhcmdldF9nYXRoZXJfb3V0cHV0cyk7Cit9CisKK3ZvaWQgX19vZmZsb2FkX3RhcmdldF9pbml0KHZvaWQpCit7CisjaWZkZWYgU0VQX1NVUFBPUlQKKyAgICBjb25zdCBjaGFyKiBlbnZfdmFyID0gZ2V0ZW52KHNlcF9tb25pdG9yX2Vudik7CisgICAgaWYgKGVudl92YXIgIT0gMCAmJiAqZW52X3ZhciAhPSAnXDAnKSB7CisgICAgICAgIHNlcF9tb25pdG9yID0gYXRvaShlbnZfdmFyKTsKKyAgICB9CisgICAgZW52X3ZhciA9IGdldGVudihzZXBfZGV2aWNlX2Vudik7CisgICAgaWYgKGVudl92YXIgIT0gMCAmJiAqZW52X3ZhciAhPSAnXDAnKSB7CisgICAgICAgIHNlcF9kZXZpY2UgPSBlbnZfdmFyOworICAgIH0KKyNlbmRpZiAvLyBTRVBfU1VQUE9SVAorCisgICAgcHJlZml4ID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9taWMpOworCisgICAgLy8gaW5pdCBmcmVxdWVuY3kKKyAgICBtaWNfZnJlcXVlbmN5ID0gQ09JUGVyZkdldEN5Y2xlRnJlcXVlbmN5KCk7Cit9CisKKy8vIFVzZXItdmlzaWJsZSBvZmZsb2FkIEFQSQorCitpbnQgX09mZmxvYWRfbnVtYmVyX29mX2RldmljZXModm9pZCkKK3sKKyAgICByZXR1cm4gbWljX2VuZ2luZXNfdG90YWw7Cit9CisKK2ludCBfT2ZmbG9hZF9nZXRfZGV2aWNlX251bWJlcih2b2lkKQoreworICAgIHJldHVybiBtaWNfaW5kZXg7Cit9CisKK2ludCBfT2ZmbG9hZF9nZXRfcGh5c2ljYWxfZGV2aWNlX251bWJlcih2b2lkKQoreworICAgIHVpbnQzMl90IGluZGV4OworICAgIEVuZ2luZUdldEluZGV4KCZpbmRleCk7CisgICAgcmV0dXJuIGluZGV4OworfQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YXJnZXQuaCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdGFyZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RiMzE0NwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdGFyZ2V0LmgKQEAgLTAsMCArMSwxMDAgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLy8gVGhlIHBhcnRzIG9mIHRoZSBvZmZsb2FkIGxpYnJhcnkgdXNlZCBvbmx5IG9uIHRoZSB0YXJnZXQKKworI2lmbmRlZiBPRkZMT0FEX1RBUkdFVF9IX0lOQ0xVREVECisjZGVmaW5lIE9GRkxPQURfVEFSR0VUX0hfSU5DTFVERUQKKworI2luY2x1ZGUgIm9mZmxvYWRfY29tbW9uLmgiCisjaW5jbHVkZSAiY29pL2NvaV9zZXJ2ZXIuaCIKKworLy8gVGhlIG9mZmxvYWQgZGVzY3JpcHRvci4KK2NsYXNzIE9mZmxvYWREZXNjcmlwdG9yCit7CitwdWJsaWM6CisgICAgfk9mZmxvYWREZXNjcmlwdG9yKCkgeworICAgICAgICBpZiAobV92YXJzICE9IDApIHsKKyAgICAgICAgICAgIGZyZWUobV92YXJzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEVudHJ5IHBvaW50IGZvciBDT0kuIFN5bmNocm9ub3VzbHkgZXhlY3V0ZSBvZmZsb2FkZWQgcmVnaW9uIGdpdmVuCisgICAgLy8gdGhlIHByb3ZpZGVkIGJ1ZmZlcnMsIG1pc2MgYW5kIHJldHVybiBkYXRhLgorICAgIHN0YXRpYyB2b2lkIG9mZmxvYWQoCisgICAgICAgIHVpbnQzMl90ICBidWZmZXJfY291bnQsCisgICAgICAgIHZvaWQqKiAgICBidWZmZXJzLAorICAgICAgICB2b2lkKiAgICAgbWlzY19kYXRhLAorICAgICAgICB1aW50MTZfdCAgbWlzY19kYXRhX2xlbiwKKyAgICAgICAgdm9pZCogICAgIHJldHVybl9kYXRhLAorICAgICAgICB1aW50MTZfdCAgcmV0dXJuX2RhdGFfbGVuCisgICAgKTsKKworICAgIC8vIHNjYXR0ZXJzIGlucHV0IGRhdGEgZnJvbSBpbiBidWZmZXIgdG8gdGFyZ2V0IHZhcmlhYmxlcworICAgIHZvaWQgc2NhdHRlcl9jb3B5aW5fZGF0YSgpOworCisgICAgLy8gZ2F0aGVycyBvdXRwdXQgZGF0YSB0byB0aGUgYnVmZmVyCisgICAgdm9pZCBnYXRoZXJfY29weW91dF9kYXRhKCk7CisKKyAgICAvLyBtZXJnZXMgbG9jYWwgdmFyaWFibGUgZGVzY3JpcHRvcnMgd2l0aCB0aGUgZGVzY3JpcHRvcnMgcmVjZWl2ZWQgZnJvbQorICAgIC8vIGhvc3QKKyAgICB2b2lkIG1lcmdlX3Zhcl9kZXNjcyhWYXJEZXNjICp2YXJzLCBWYXJEZXNjMiAqdmFyczIsIGludCB2YXJzX3RvdGFsKTsKKworICAgIGludCBnZXRfb2ZmbG9hZF9udW1iZXIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX29mZmxvYWRfbnVtYmVyOworICAgIH0KKworICAgIHZvaWQgc2V0X29mZmxvYWRfbnVtYmVyKGludCBudW1iZXIpIHsKKyAgICAgICAgbV9vZmZsb2FkX251bWJlciA9IG51bWJlcjsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLy8gQ29uc3RydWN0b3IKKyAgICBPZmZsb2FkRGVzY3JpcHRvcigpIDogbV92YXJzKDApCisgICAge30KKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIHN0ZDo6bGlzdDx2b2lkKj4gQnVmZmVyTGlzdDsKKworICAgIC8vIFRoZSBNYXJzaGFsbGVyIGZvciB0aGUgaW5wdXRzIG9mIHRoZSBvZmZsb2FkZWQgcmVnaW9uLgorICAgIE1hcnNoYWxsZXIgbV9pbjsKKworICAgIC8vIFRoZSBNYXJzaGFsbGVyIGZvciB0aGUgb3V0cHV0cyBvZiB0aGUgb2ZmbG9hZGVkIHJlZ2lvbi4KKyAgICBNYXJzaGFsbGVyIG1fb3V0OworCisgICAgLy8gTGlzdCBvZiBidWZmZXJzIHRoYXQgYXJlIHBhc3NlZCB0byBkaXNwYXRjaCBjYWxsCisgICAgQnVmZmVyTGlzdCBtX2J1ZmZlcnM7CisKKyAgICAvLyBWYXJpYWJsZSBkZXNjcmlwdG9ycyByZWNlaXZlZCBmcm9tIGhvc3QKKyAgICBWYXJEZXNjKiBtX3ZhcnM7CisgICAgaW50ICAgICAgbV92YXJzX3RvdGFsOworICAgIGludCAgICAgIG1fb2ZmbG9hZF9udW1iZXI7Cit9OworCisvLyBvbmUgdGltZSB0YXJnZXQgaW5pdGlhbGl6YXRpb24gaW4gbWFpbgorZXh0ZXJuIHZvaWQgX19vZmZsb2FkX3RhcmdldF9pbml0KHZvaWQpOworCisvLyBsb2dpY2FsIGRldmljZSBpbmRleAorZXh0ZXJuIGludCBtaWNfaW5kZXg7CisKKy8vIHRvdGFsIG51bWJlciBvZiBhdmFpbGFibGUgbG9naWNhbCBkZXZpY2VzCitleHRlcm4gaW50IG1pY19lbmdpbmVzX3RvdGFsOworCisvLyBkZXZpY2UgZnJlcXVlbmN5IChmcm9tIENPSSkKK2V4dGVybiB1aW50NjRfdCBtaWNfZnJlcXVlbmN5OworCitzdHJ1Y3QgUmVmSW5mbyB7CisgICAgUmVmSW5mbyhib29sIGlzX2FkZCwgbG9uZyBhbW91bnQpOmlzX2FkZGVkKGlzX2FkZCksY291bnQoYW1vdW50KQorICAgIHt9CisgICAgYm9vbCBpc19hZGRlZDsKKyAgICBsb25nIGNvdW50OworfTsKKworI2VuZGlmIC8vIE9GRkxPQURfVEFSR0VUX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdGFyZ2V0X21haW4uY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YXJnZXRfbWFpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5MjFkMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdGFyZ2V0X21haW4uY3BwCkBAIC0wLDAgKzEsMTcgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF90YXJnZXRfbWFpbih2b2lkKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiogYXJndikKK3sKKyAgICBfX29mZmxvYWRfdGFyZ2V0X21haW4oKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdGltZXIuaCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mZmxvYWRfdGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDAxYTlkCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90aW1lci5oCkBAIC0wLDAgKzEsMTcyIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgT0ZGTE9BRF9USU1FUl9IX0lOQ0xVREVECisjZGVmaW5lIE9GRkxPQURfVElNRVJfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJsaWJvZmZsb2FkX2Vycm9yX2NvZGVzLmgiCisKK2V4dGVybiBpbnQgdGltZXJfZW5hYmxlZDsKKworI2lmZGVmIFRJTUlOR19TVVBQT1JUCisKK3N0cnVjdCBPZmZsb2FkVGFyZ2V0VGltZXJEYXRhIHsKKyAgICB1aW50NjRfdCBmcmVxdWVuY3k7CisgICAgc3RydWN0IHsKKyAgICAgICAgdWludDY0X3Qgc3RhcnQ7CisgICAgICAgIHVpbnQ2NF90IHRvdGFsOworICAgIH0gcGhhc2VzW2Nfb2ZmbG9hZF90YXJnZXRfbWF4X3BoYXNlXTsKK307CisKK3N0cnVjdCBPZmZsb2FkSG9zdFRpbWVyRGF0YSB7CisgICAgLy8gc291cmNlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIKKyAgICBjb25zdCBjaGFyKiBmaWxlOworICAgIGludCAgICAgICAgIGxpbmU7CisKKyAgICAvLyBob3N0IHRpbWVyIGRhdGEKKyAgICBzdHJ1Y3QgeworICAgICAgICB1aW50NjRfdCBzdGFydDsKKyAgICAgICAgdWludDY0X3QgdG90YWw7CisgICAgfSBwaGFzZXNbY19vZmZsb2FkX2hvc3RfbWF4X3BoYXNlXTsKKworICAgIHVpbnQ2NF90IHNlbnRfYnl0ZXM7CisgICAgdWludDY0X3QgcmVjZWl2ZWRfYnl0ZXM7CisgICAgaW50IGNhcmRfbnVtYmVyOworICAgIGludCBvZmZsb2FkX251bWJlcjsKKworICAgIC8vIHRhcmdldCB0aW1lciBkYXRhCisgICAgT2ZmbG9hZFRhcmdldFRpbWVyRGF0YSB0YXJnZXQ7CisKKyAgICAvLyBuZXh0IGVsZW1lbnQKKyAgICBPZmZsb2FkSG9zdFRpbWVyRGF0YSAqbmV4dDsKK307CisKKyNpZiBIT1NUX0xJQlJBUlkKKworZXh0ZXJuIGludCBvZmZsb2FkX3JlcG9ydF9sZXZlbDsKK2V4dGVybiBpbnQgb2ZmbG9hZF9yZXBvcnRfZW5hYmxlZDsKKyNkZWZpbmUgT0ZGTE9BRF9SRVBPUlRfMSAxCisjZGVmaW5lIE9GRkxPQURfUkVQT1JUXzIgMgorI2RlZmluZSBPRkZMT0FEX1JFUE9SVF8zIDMKKyNkZWZpbmUgT0ZGTE9BRF9SRVBPUlRfT04gMQorI2RlZmluZSBPRkZMT0FEX1JFUE9SVF9PRkYgMAorCisjZGVmaW5lIE9GRkxPQURfVElNRVJfREFUQUxFTigpIFwKKyAgICAoKHRpbWVyX2VuYWJsZWQgfHwgKG9mZmxvYWRfcmVwb3J0X2xldmVsICYmIG9mZmxvYWRfcmVwb3J0X2VuYWJsZWQpKSA/IFwKKyAgICAgKCgxICsgY19vZmZsb2FkX3RhcmdldF9tYXhfcGhhc2UpICogc2l6ZW9mKHVpbnQ2NF90KSkgOiAwKQorCisjZGVmaW5lIE9GRkxPQURfVElNRVJfU1RBUlQodGltZXJfZGF0YSwgcG5vZGUpIFwKKyAgICBpZiAodGltZXJfZW5hYmxlZCB8fCBcCisgICAgICAgIChvZmZsb2FkX3JlcG9ydF9sZXZlbCAmJiBvZmZsb2FkX3JlcG9ydF9lbmFibGVkKSkgeyBcCisgICAgICAgIG9mZmxvYWRfdGltZXJfc3RhcnQodGltZXJfZGF0YSwgcG5vZGUpOyBcCisgICAgfQorCisjZGVmaW5lIE9GRkxPQURfVElNRVJfU1RPUCh0aW1lcl9kYXRhLCBwbm9kZSkgXAorICAgIGlmICh0aW1lcl9lbmFibGVkIHx8IFwKKyAgICAgICAgKG9mZmxvYWRfcmVwb3J0X2xldmVsICYmIG9mZmxvYWRfcmVwb3J0X2VuYWJsZWQpKSB7IFwKKyAgICAgICAgb2ZmbG9hZF90aW1lcl9zdG9wKHRpbWVyX2RhdGEsIHBub2RlKTsgXAorICAgIH0KKworI2RlZmluZSBPRkZMT0FEX1RJTUVSX0lOSVQoZmlsZSwgbGluZSkgXAorICAgIG9mZmxvYWRfdGltZXJfaW5pdChmaWxlLCBsaW5lKTsKKworI2RlZmluZSBPRkZMT0FEX1RJTUVSX1RBUkdFVF9EQVRBKHRpbWVyX2RhdGEsIGRhdGEpIFwKKyAgICBpZiAodGltZXJfZW5hYmxlZCB8fCBcCisgICAgICAgIChvZmZsb2FkX3JlcG9ydF9sZXZlbCAmJiBvZmZsb2FkX3JlcG9ydF9lbmFibGVkKSkgeyBcCisgICAgICAgIG9mZmxvYWRfdGltZXJfZmlsbF90YXJnZXRfZGF0YSh0aW1lcl9kYXRhLCBkYXRhKTsgXAorICAgIH0KKworI2RlZmluZSBPRkZMT0FEX1RJTUVSX0hPU1RfU0RBVEEodGltZXJfZGF0YSwgZGF0YSkgXAorICAgIGlmIChvZmZsb2FkX3JlcG9ydF9sZXZlbCAmJiBvZmZsb2FkX3JlcG9ydF9lbmFibGVkKSB7IFwKKyAgICAgICAgb2ZmbG9hZF90aW1lcl9maWxsX2hvc3Rfc2RhdGEodGltZXJfZGF0YSwgZGF0YSk7IFwKKyAgICB9CisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9IT1NUX1JEQVRBKHRpbWVyX2RhdGEsIGRhdGEpIFwKKyAgICBpZiAob2ZmbG9hZF9yZXBvcnRfbGV2ZWwgJiYgb2ZmbG9hZF9yZXBvcnRfZW5hYmxlZCkgeyBcCisgICAgICAgIG9mZmxvYWRfdGltZXJfZmlsbF9ob3N0X3JkYXRhKHRpbWVyX2RhdGEsIGRhdGEpOyBcCisgICAgfQorCisjZGVmaW5lIE9GRkxPQURfVElNRVJfSE9TVF9NSUNfTlVNKHRpbWVyX2RhdGEsIGRhdGEpIFwKKyAgICBpZiAob2ZmbG9hZF9yZXBvcnRfbGV2ZWwgJiYgb2ZmbG9hZF9yZXBvcnRfZW5hYmxlZCkgeyBcCisgICAgICAgIG9mZmxvYWRfdGltZXJfZmlsbF9ob3N0X21pY19udW0odGltZXJfZGF0YSwgZGF0YSk7IFwKKyAgICB9CisKK2V4dGVybiB2b2lkIG9mZmxvYWRfdGltZXJfc3RhcnQoT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2ZmbG9hZEhvc3RQaGFzZSB0X25vZGUpOworZXh0ZXJuIHZvaWQgb2ZmbG9hZF90aW1lcl9zdG9wKE9mZmxvYWRIb3N0VGltZXJEYXRhICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2ZmbG9hZEhvc3RQaGFzZSB0X25vZGUpOworZXh0ZXJuIE9mZmxvYWRIb3N0VGltZXJEYXRhICogb2ZmbG9hZF90aW1lcl9pbml0KGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKTsKK2V4dGVybiB2b2lkIG9mZmxvYWRfdGltZXJfZmlsbF90YXJnZXRfZGF0YShPZmZsb2FkSG9zdFRpbWVyRGF0YSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpOworZXh0ZXJuIHZvaWQgb2ZmbG9hZF90aW1lcl9maWxsX2hvc3Rfc2RhdGEoT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNlbnRfYnl0ZXMpOworZXh0ZXJuIHZvaWQgb2ZmbG9hZF90aW1lcl9maWxsX2hvc3RfcmRhdGEoT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNlbnRfYnl0ZXMpOworZXh0ZXJuIHZvaWQgb2ZmbG9hZF90aW1lcl9maWxsX2hvc3RfbWljX251bShPZmZsb2FkSG9zdFRpbWVyRGF0YSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FyZF9udW1iZXIpOworCisvLyBVdGlsaXR5IHN0cnVjdHVyZSBmb3Igc3RhcnRpbmcvc3RvcHBpbmcgdGltZXIKK3N0cnVjdCBPZmZsb2FkVGltZXIgeworICAgIE9mZmxvYWRUaW1lcihPZmZsb2FkSG9zdFRpbWVyRGF0YSAqZGF0YSwgT2ZmbG9hZEhvc3RQaGFzZSBwaGFzZSkgOgorICAgICAgICBtX2RhdGEoZGF0YSksCisgICAgICAgIG1fcGhhc2UocGhhc2UpCisgICAgeworICAgICAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKG1fZGF0YSwgbV9waGFzZSk7CisgICAgfQorCisgICAgfk9mZmxvYWRUaW1lcigpCisgICAgeworICAgICAgICBPRkZMT0FEX1RJTUVSX1NUT1AobV9kYXRhLCBtX3BoYXNlKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgT2ZmbG9hZEhvc3RUaW1lckRhdGEqICAgbV9kYXRhOworICAgIE9mZmxvYWRIb3N0UGhhc2UgICAgICAgIG1fcGhhc2U7Cit9OworCisjZWxzZQorCisjZGVmaW5lIE9GRkxPQURfVElNRVJfREFUQUxFTigpIFwKKyAgICAoKHRpbWVyX2VuYWJsZWQpID8gXAorICAgICAoKDEgKyBjX29mZmxvYWRfdGFyZ2V0X21heF9waGFzZSkgKiBzaXplb2YodWludDY0X3QpKSA6IDApCisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9TVEFSVChwbm9kZSkgXAorICAgIGlmICh0aW1lcl9lbmFibGVkKSBvZmZsb2FkX3RpbWVyX3N0YXJ0KHBub2RlKTsKKworI2RlZmluZSBPRkZMT0FEX1RJTUVSX1NUT1AocG5vZGUpIFwKKyAgICBpZiAodGltZXJfZW5hYmxlZCkgb2ZmbG9hZF90aW1lcl9zdG9wKHBub2RlKTsKKworI2RlZmluZSBPRkZMT0FEX1RJTUVSX0lOSVQoKSBcCisgICAgaWYgKHRpbWVyX2VuYWJsZWQpIG9mZmxvYWRfdGltZXJfaW5pdCgpOworCisjZGVmaW5lIE9GRkxPQURfVElNRVJfVEFSR0VUX0RBVEEoZGF0YSkgXAorICAgIGlmICh0aW1lcl9lbmFibGVkKSBvZmZsb2FkX3RpbWVyX2ZpbGxfdGFyZ2V0X2RhdGEoZGF0YSk7CisKK2V4dGVybiB2b2lkIG9mZmxvYWRfdGltZXJfc3RhcnQoT2ZmbG9hZFRhcmdldFBoYXNlIHRfbm9kZSk7CitleHRlcm4gdm9pZCBvZmZsb2FkX3RpbWVyX3N0b3AoT2ZmbG9hZFRhcmdldFBoYXNlIHRfbm9kZSk7CitleHRlcm4gdm9pZCBvZmZsb2FkX3RpbWVyX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBvZmZsb2FkX3RpbWVyX2ZpbGxfdGFyZ2V0X2RhdGEodm9pZCAqZGF0YSk7CisKKyNlbmRpZiAvLyBIT1NUX0xJQlJBUlkKKworI2Vsc2UgLy8gVElNSU5HX1NVUFBPUlQKKworI2RlZmluZSBPRkZMT0FEX1RJTUVSX1NUQVJUKC4uLikKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9TVE9QKC4uLikKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9JTklUKC4uLikKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9UQVJHRVRfREFUQSguLi4pCisjZGVmaW5lIE9GRkxPQURfVElNRVJfREFUQUxFTiguLi4pICAgICAgKDApCisKKyNlbmRpZiAvLyBUSU1JTkdfU1VQUE9SVAorCisjZW5kaWYgLy8gT0ZGTE9BRF9USU1FUl9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RpbWVyX2hvc3QuY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90aW1lcl9ob3N0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjI3ZGIwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90aW1lcl9ob3N0LmNwcApAQCAtMCwwICsxLDM1OSBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAib2ZmbG9hZF90aW1lci5oIgorCisjaWZkZWYgX19JTlRFTF9DT01QSUxFUgorI2luY2x1ZGUgPGlhMzJpbnRyaW4uaD4KKyNlbHNlIC8vIF9fSU5URUxfQ09NUElMRVIKKyNpbmNsdWRlIDx4ODZpbnRyaW4uaD4KKyNlbmRpZiAvLyBfX0lOVEVMX0NPTVBJTEVSCisKKyNpbmNsdWRlICJvZmZsb2FkX2hvc3QuaCIKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisKK2ludCB0aW1lcl9lbmFibGVkID0gMDsKKworI2lmZGVmIFRJTUlOR19TVVBQT1JUCisKK2ludCBvZmZsb2FkX3JlcG9ydF9sZXZlbCA9IDA7CitpbnQgb2ZmbG9hZF9yZXBvcnRfZW5hYmxlZCA9IDE7CisKK3N0YXRpYyBjb25zdCBpbnQgaG9zdF90aW1lcl9wcmVmaXhfc3BhY2VzW10gPSB7CisgICAgLypjX29mZmxvYWRfaG9zdF9zZXR1cF9idWZmZXJzKi8gICAgICAgICAwLAorICAgIC8qY19vZmZsb2FkX2hvc3RfaW5pdGlhbGl6ZSovICAgICAgICAgICAgMiwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X3RhcmdldF9hY3F1aXJlKi8gICAgICAgIDIsCisgICAgLypjX29mZmxvYWRfaG9zdF93YWl0X2RlcHMqLyAgICAgICAgICAgICAyLAorICAgIC8qY19vZmZsb2FkX2hvc3Rfc2V0dXBfYnVmZmVycyovICAgICAgICAgMiwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X2FsbG9jX2J1ZmZlcnMqLyAgICAgICAgIDQsCisgICAgLypjX29mZmxvYWRfaG9zdF9zZXR1cF9taXNjX2RhdGEqLyAgICAgICAyLAorICAgIC8qY19vZmZsb2FkX2hvc3RfYWxsb2NfZGF0YV9idWZmZXIqLyAgICAgNCwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X3NlbmRfcG9pbnRlcnMqLyAgICAgICAgIDIsCisgICAgLypjX29mZmxvYWRfaG9zdF9nYXRoZXJfaW5wdXRzKi8gICAgICAgICAyLAorICAgIC8qY19vZmZsb2FkX2hvc3RfbWFwX2luX2RhdGFfYnVmZmVyKi8gICAgNCwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X3VubWFwX2luX2RhdGFfYnVmZmVyKi8gIDQsCisgICAgLypjX29mZmxvYWRfaG9zdF9zdGFydF9jb21wdXRlKi8gICAgICAgICAyLAorICAgIC8qY19vZmZsb2FkX2hvc3Rfd2FpdF9jb21wdXRlKi8gICAgICAgICAgMiwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X3N0YXJ0X2J1ZmZlcnNfcmVhZHMqLyAgIDIsCisgICAgLypjX29mZmxvYWRfaG9zdF9zY2F0dGVyX291dHB1dHMqLyAgICAgICAyLAorICAgIC8qY19vZmZsb2FkX2hvc3RfbWFwX291dF9kYXRhX2J1ZmZlciovICAgNCwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X3VubWFwX291dF9kYXRhX2J1ZmZlciovIDQsCisgICAgLypjX29mZmxvYWRfaG9zdF93YWl0X2J1ZmZlcnNfcmVhZHMqLyAgICAyLAorICAgIC8qY19vZmZsb2FkX2hvc3RfZGVzdHJveV9idWZmZXJzKi8gICAgICAgMgorfTsKKworY29uc3Qgc3RhdGljIGludCB0YXJnZXRfdGltZXJfcHJlZml4X3NwYWNlc1tdID0geworLypjX29mZmxvYWRfdGFyZ2V0X3RvdGFsX3RpbWUqLyAgICAgICAgICAwLAorLypjX29mZmxvYWRfdGFyZ2V0X2Rlc2NyaXB0b3Jfc2V0dXAqLyAgICAyLAorLypjX29mZmxvYWRfdGFyZ2V0X2Z1bmNfbG9va3VwKi8gICAgICAgICAyLAorLypjX29mZmxvYWRfdGFyZ2V0X2Z1bmNfdGltZSovICAgICAgICAgICAyLAorLypjX29mZmxvYWRfdGFyZ2V0X3NjYXR0ZXJfaW5wdXRzKi8gICAgICA0LAorLypjX29mZmxvYWRfdGFyZ2V0X2FkZF9idWZmZXJfcmVmcyovICAgICA2LAorLypjX29mZmxvYWRfdGFyZ2V0X2NvbXB1dGUqLyAgICAgICAgICAgICA0LAorLypjX29mZmxvYWRfdGFyZ2V0X2dhdGhlcl9vdXRwdXRzKi8gICAgICA0LAorLypjX29mZmxvYWRfdGFyZ2V0X3JlbGVhc2VfYnVmZmVyX3JlZnMqLyA2Cit9OworCitzdGF0aWMgT2ZmbG9hZEhvc3RUaW1lckRhdGEqIHRpbWVyX2RhdGFfaGVhZDsKK3N0YXRpYyBPZmZsb2FkSG9zdFRpbWVyRGF0YSogdGltZXJfZGF0YV90YWlsOworc3RhdGljIG11dGV4X3QgICAgICAgICAgICAgICB0aW1lcl9kYXRhX211dGV4OworCitzdGF0aWMgdm9pZCBvZmZsb2FkX2hvc3RfcGhhc2VfbmFtZShzdGQ6OnN0cmluZ3N0cmVhbSAmc3MsIGludCBwX25vZGUpOworc3RhdGljIHZvaWQgb2ZmbG9hZF90YXJnZXRfcGhhc2VfbmFtZShzdGQ6OnN0cmluZ3N0cmVhbSAmc3MsIGludCBwX25vZGUpOworCitleHRlcm4gdm9pZCBPZmZsb2FkX1RpbWVyX1ByaW50KHZvaWQpCit7CisgICAgc3RkOjpzdHJpbmcgICAgICAgYnVmOworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgIGNvbnN0IGNoYXIgKnN0YXJzID0KKyAgICAgICAgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIjsKKworICAgIHNzIDw8ICJcblxuIiA8PCBzdGFycyA8PCAiXG4iOworICAgIHNzIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7CisgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF90aXRsZSkgPDwgIlxuIjsKKyAgICBzcyA8PCBzdGFycyA8PCAiXG4iOworICAgIGRvdWJsZSBmcmVxdWVuY3kgPSBjcHVfZnJlcXVlbmN5OworCisgICAgZm9yIChPZmZsb2FkSG9zdFRpbWVyRGF0YSAqcG5vZGUgPSB0aW1lcl9kYXRhX2hlYWQ7CisgICAgICAgICBwbm9kZSAhPSAwOyBwbm9kZSA9IHBub2RlLT5uZXh0KSB7CisgICAgICAgIHNzIDw8ICIgICAgICAiOworICAgICAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2Zyb21fZmlsZSkgPDwgIiAiPDwgcG5vZGUtPmZpbGU7CisgICAgICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbGluZSkgPDwgIiAiIDw8IHBub2RlLT5saW5lOworICAgICAgICBzcyA8PCAiXG4iOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNfb2ZmbG9hZF9ob3N0X21heF9waGFzZSA7IGkrKykgeworICAgICAgICAgICAgc3MgPDwgIiAgICAgICAgICAiOworICAgICAgICAgICAgb2ZmbG9hZF9ob3N0X3BoYXNlX25hbWUoc3MsIGkpOworICAgICAgICAgICAgc3MgPDwgIiAgICIgPDwgc3RkOjpmaXhlZCA8PCBzdGQ6OnNldHByZWNpc2lvbig1KTsKKyAgICAgICAgICAgIHNzIDw8IChkb3VibGUpcG5vZGUtPnBoYXNlc1tpXS50b3RhbCAvIGZyZXF1ZW5jeSA8PCAiXG4iOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjX29mZmxvYWRfdGFyZ2V0X21heF9waGFzZSA7IGkrKykgeworICAgICAgICAgICAgZG91YmxlIHRpbWUgPSAwOworICAgICAgICAgICAgaWYgKHBub2RlLT50YXJnZXQuZnJlcXVlbmN5ICE9IDApIHsKKyAgICAgICAgICAgICAgICB0aW1lID0gKGRvdWJsZSkgcG5vZGUtPnRhcmdldC5waGFzZXNbaV0udG90YWwgLworICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKSBwbm9kZS0+dGFyZ2V0LmZyZXF1ZW5jeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNzIDw8ICIgICAgICAgICAgIjsKKyAgICAgICAgICAgIG9mZmxvYWRfdGFyZ2V0X3BoYXNlX25hbWUoc3MsIGkpOworICAgICAgICAgICAgc3MgPDwgIiAgICIgPDwgc3RkOjpmaXhlZCA8PCBzdGQ6OnNldHByZWNpc2lvbig1KTsKKyAgICAgICAgICAgIHNzIDw8IHRpbWUgPDwgIlxuIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJ1ZiA9IHNzLnN0cigpOworICAgIGZwcmludGYoc3Rkb3V0LCBidWYuZGF0YSgpKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKK30KKworZXh0ZXJuIHZvaWQgT2ZmbG9hZF9SZXBvcnRfUHJvbG9nKE9mZmxvYWRIb3N0VGltZXJEYXRhICpwbm9kZSkKK3sKKyAgICBkb3VibGUgZnJlcXVlbmN5ID0gY3B1X2ZyZXF1ZW5jeTsKKyAgICBzdGQ6OnN0cmluZyAgICAgICBidWY7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisKKyAgICBpZiAocG5vZGUpIHsKKyAgICAgICAgLy8gW09mZmxvYWRdIFtNaWMgMF0gW0ZpbGVdICAgICAgICAgIGZpbGUuYworICAgICAgICBzcyA8PCAiWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9vZmZsb2FkKSA8PCAiXSBbIjsKKyAgICAgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9taWMpIDw8ICIgIjsKKyAgICAgICAgc3MgPDwgcG5vZGUtPmNhcmRfbnVtYmVyIDw8ICJdIFsiOworICAgICAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2ZpbGUpOworICAgICAgICBzcyA8PCAiXSAgICAgICAgICAgICAgICAgICAgIiA8PCBwbm9kZS0+ZmlsZSA8PCAiXG4iOworCisgICAgICAgIC8vIFtPZmZsb2FkXSBbTWljIDBdIFtMaW5lXSAgICAgICAgICAxMjM0CisgICAgICAgIHNzIDw8ICJbIiA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X29mZmxvYWQpIDw8ICJdIFsiOworICAgICAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X21pYykgPDwgIiAiOworICAgICAgICBzcyA8PCBwbm9kZS0+Y2FyZF9udW1iZXIgPDwgIl0gWyI7CisgICAgICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbGluZSk7CisgICAgICAgIHNzIDw8ICJdICAgICAgICAgICAgICAgICAgICAiIDw8IHBub2RlLT5saW5lIDw8ICJcbiI7CisKKyAgICAgICAgLy8gW09mZmxvYWRdIFtNaWMgMF0gW1RhZ10gICAgICAgICAgVGFnIDEKKyAgICAgICAgc3MgPDwgIlsiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfb2ZmbG9hZCkgPDwgIl0gWyI7CisgICAgICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbWljKSA8PCAiICI7CisgICAgICAgIHNzIDw8IHBub2RlLT5jYXJkX251bWJlciA8PCAiXSBbIjsKKyAgICAgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF90YWcpOworICAgICAgICBzcyA8PCAiXSAgICAgICAgICAgICAgICAgICAgICIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF90YWcpOworICAgICAgICBzcyA8PCAiICIgPDwgcG5vZGUtPm9mZmxvYWRfbnVtYmVyIDw8ICJcbiI7CisKKyAgICAgICAgYnVmID0gc3Muc3RyKCk7CisgICAgICAgIGZwcmludGYoc3Rkb3V0LCBidWYuZGF0YSgpKTsKKyAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgfQorfQorCitleHRlcm4gdm9pZCBPZmZsb2FkX1JlcG9ydF9FcGlsb2coT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiB0aW1lcl9kYXRhKQoreworICAgIGRvdWJsZSBmcmVxdWVuY3kgPSBjcHVfZnJlcXVlbmN5OworICAgIHN0ZDo6c3RyaW5nICAgICAgIGJ1ZjsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKworICAgIE9mZmxvYWRIb3N0VGltZXJEYXRhICpwbm9kZSA9IHRpbWVyX2RhdGE7CisKKyAgICBpZiAoIXBub2RlKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3MgPDwgIlsiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfb2ZmbG9hZCkgPDwgIl0gWyI7CisgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9ob3N0KSA8PCAiXSAgWyI7CisgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF90YWcpIDw8ICAiICI7CisgICAgc3MgPDwgcG5vZGUtPm9mZmxvYWRfbnVtYmVyIDw8ICJdIFsiOworICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfY3B1X3RpbWUpIDw8ICJdICAgICAgICAiOworICAgIHNzIDw8IHN0ZDo6Zml4ZWQgPDwgc3RkOjpzZXRwcmVjaXNpb24oNik7CisgICAgc3MgPDwgKGRvdWJsZSkgcG5vZGUtPnBoYXNlc1swXS50b3RhbCAvIGZyZXF1ZW5jeTsKKyAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3NlY29uZHMpIDw8ICJcbiI7CisKKyAgICBpZiAob2ZmbG9hZF9yZXBvcnRfbGV2ZWwgPj0gT0ZGTE9BRF9SRVBPUlRfMikgeworICAgICAgICBzcyA8PCAiWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9vZmZsb2FkKSA8PCAiXSBbIjsKKyAgICAgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9taWMpOworICAgICAgICBzcyA8PCAiICIgPDwgcG5vZGUtPmNhcmRfbnVtYmVyOworICAgICAgICBzcyA8PCAiXSBbIiA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3RhZykgPDwgIiAiOworICAgICAgICBzcyA8PCAgcG5vZGUtPm9mZmxvYWRfbnVtYmVyIDw8ICJdIFsiOworICAgICAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2NwdV90b19taWNfZGF0YSkgPDwgIl0gICAiOworICAgICAgICBzcyA8PCBwbm9kZS0+c2VudF9ieXRlcyA8PCAiICI7CisgICAgICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfYnl0ZXMpIDw8ICJcbiI7CisgICAgfQorCisgICAgZG91YmxlIHRpbWUgPSAwOworICAgIGlmIChwbm9kZS0+dGFyZ2V0LmZyZXF1ZW5jeSAhPSAwKSB7CisgICAgICAgIHRpbWUgPSAoZG91YmxlKSBwbm9kZS0+dGFyZ2V0LnBoYXNlc1swXS50b3RhbCAvCisgICAgICAgICAgICAoZG91YmxlKSBwbm9kZS0+dGFyZ2V0LmZyZXF1ZW5jeTsKKyAgICB9CisgICAgc3MgPDwgIlsiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfb2ZmbG9hZCkgPDwgIl0gWyI7CisgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9taWMpIDw8ICIgIjsKKyAgICBzcyA8PCBwbm9kZS0+Y2FyZF9udW1iZXI8PCAiXSBbIjsKKyAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3RhZykgPDwgICIgIjsKKyAgICBzcyA8PCBwbm9kZS0+b2ZmbG9hZF9udW1iZXIgPDwgIl0gWyI7CisgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9taWNfdGltZSkgPDwgIl0gICAgICAgICI7CisgICAgc3MgPDwgc3RkOjpmaXhlZCA8PCBzdGQ6OnNldHByZWNpc2lvbig2KSA8PCB0aW1lOworICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc2Vjb25kcykgPDwgIlxuIjsKKworICAgIGlmIChvZmZsb2FkX3JlcG9ydF9sZXZlbCA+PSBPRkZMT0FEX1JFUE9SVF8yKSB7CisgICAgICAgIHNzIDw8ICJbIiA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X29mZmxvYWQpIDw8ICJdIFsiOworICAgICAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X21pYyk7CisgICAgICAgIHNzIDw8ICIgIiA8PCBwbm9kZS0+Y2FyZF9udW1iZXI7CisgICAgICAgIHNzIDw8ICJdIFsiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfdGFnKSA8PCAiICI7CisgICAgICAgIHNzIDw8ICBwbm9kZS0+b2ZmbG9hZF9udW1iZXIgPDwgIl0gWyI7CisgICAgICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbWljX3RvX2NwdV9kYXRhKSA8PCAiXSAgICI7CisgICAgICAgIHNzIDw8IHBub2RlLT5yZWNlaXZlZF9ieXRlcyA8PCAiICI7CisgICAgICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfYnl0ZXMpIDw8ICJcbiI7CisgICAgfQorICAgIHNzIDw8ICJcbiI7CisKKyAgICBidWYgPSBzcy5zdHIoKTsKKyAgICBmcHJpbnRmKHN0ZG91dCwgYnVmLmRhdGEoKSk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisKKyAgICBvZmZsb2FkX3JlcG9ydF9mcmVlX2RhdGEodGltZXJfZGF0YSk7Cit9CisKK2V4dGVybiB2b2lkIG9mZmxvYWRfcmVwb3J0X2ZyZWVfZGF0YShPZmZsb2FkSG9zdFRpbWVyRGF0YSAqIHRpbWVyX2RhdGEpCit7CisgICAgT2ZmbG9hZEhvc3RUaW1lckRhdGEgKnBub2RlX2xhc3QgPSBOVUxMOworCisgICAgZm9yIChPZmZsb2FkSG9zdFRpbWVyRGF0YSAqcG5vZGUgPSB0aW1lcl9kYXRhX2hlYWQ7CisgICAgICAgICBwbm9kZSAhPSAwOyBwbm9kZSA9IHBub2RlLT5uZXh0KSB7CisgICAgICAgIGlmICh0aW1lcl9kYXRhID09IHBub2RlKSB7CisgICAgICAgICAgICBpZiAocG5vZGVfbGFzdCkgeworICAgICAgICAgICAgICAgIHBub2RlX2xhc3QtPm5leHQgPSBwbm9kZS0+bmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHRpbWVyX2RhdGFfaGVhZCA9IHBub2RlLT5uZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgT0ZGTE9BRF9GUkVFKHBub2RlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHBub2RlX2xhc3QgPSBwbm9kZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfYnVmX3dpdGhfc3BhY2VzKHN0ZDo6c3RyaW5nc3RyZWFtICZzcywgaW50IG51bSkKK3sKKyAgICBmb3IgKDsgbnVtID4gMDsgbnVtLS0pIHsKKyAgICAgICAgc3MgPDwgIiAiOworICAgIH0KK30KKworc3RhdGljIHZvaWQgb2ZmbG9hZF9ob3N0X3BoYXNlX25hbWUoc3RkOjpzdHJpbmdzdHJlYW0gJnNzLCBpbnQgcF9ub2RlKQoreworICAgIGludCBwcmVmaXhfc3BhY2VzOworICAgIGludCBzdHJfbGVuZ3RoOworICAgIGludCB0YWlsX2xlbmd0aDsKKyAgICBjb25zdCBpbnQgbWVzc2FnZV9sZW5ndGggPSA0MDsKKyAgICBjaGFyIGNvbnN0ICpzdHI7CisKKyAgICBzdHIgPSByZXBvcnRfZ2V0X2hvc3Rfc3RhZ2Vfc3RyKHBfbm9kZSk7CisgICAgcHJlZml4X3NwYWNlcyA9IGhvc3RfdGltZXJfcHJlZml4X3NwYWNlc1twX25vZGVdOworICAgIGZpbGxfYnVmX3dpdGhfc3BhY2VzKHNzLCBwcmVmaXhfc3BhY2VzKTsKKyAgICBzdHJfbGVuZ3RoID0gc3RybGVuKHN0cik7CisgICAgc3MgPDwgc3RyOworICAgIHRhaWxfbGVuZ3RoID0gbWVzc2FnZV9sZW5ndGggLSBwcmVmaXhfc3BhY2VzIC0gc3RyX2xlbmd0aDsKKyAgICB0YWlsX2xlbmd0aCA9IHRhaWxfbGVuZ3RoID4gMD8gdGFpbF9sZW5ndGggOiAxOworICAgIGZpbGxfYnVmX3dpdGhfc3BhY2VzKHNzLCB0YWlsX2xlbmd0aCk7Cit9CisKK3N0YXRpYyB2b2lkIG9mZmxvYWRfdGFyZ2V0X3BoYXNlX25hbWUoc3RkOjpzdHJpbmdzdHJlYW0gJnNzLCBpbnQgcF9ub2RlKQoreworICAgIGludCBwcmVmaXhfc3BhY2VzOworICAgIGludCBzdHJfbGVuZ3RoOworICAgIGNvbnN0IGludCBtZXNzYWdlX2xlbmd0aCA9IDQwOworICAgIGludCB0YWlsX2xlbmd0aDsKKyAgICBjaGFyIGNvbnN0ICpzdHI7CisKKyAgICBzdHIgPSByZXBvcnRfZ2V0X3RhcmdldF9zdGFnZV9zdHIocF9ub2RlKTsKKyAgICBwcmVmaXhfc3BhY2VzID0gdGFyZ2V0X3RpbWVyX3ByZWZpeF9zcGFjZXNbcF9ub2RlXTsKKyAgICBmaWxsX2J1Zl93aXRoX3NwYWNlcyhzcywgcHJlZml4X3NwYWNlcyk7CisgICAgc3RyX2xlbmd0aCA9IHN0cmxlbihzdHIpOworICAgIHNzIDw8IHN0cjsKKyAgICB0YWlsX2xlbmd0aCA9IG1lc3NhZ2VfbGVuZ3RoIC0gcHJlZml4X3NwYWNlcyAtIHN0cl9sZW5ndGg7CisgICAgdGFpbF9sZW5ndGggPSAodGFpbF9sZW5ndGggPiAwKT8gdGFpbF9sZW5ndGggOiAxOworICAgIGZpbGxfYnVmX3dpdGhfc3BhY2VzKHNzLCB0YWlsX2xlbmd0aCk7Cit9CisKK3ZvaWQgb2ZmbG9hZF90aW1lcl9zdGFydChPZmZsb2FkSG9zdFRpbWVyRGF0YSAqIHRpbWVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgT2ZmbG9hZEhvc3RQaGFzZSBwX3R5cGUpCit7CisgICAgdGltZXJfZGF0YS0+cGhhc2VzW3BfdHlwZV0uc3RhcnQgPSBfcmR0c2MoKTsKK30KKwordm9pZCBvZmZsb2FkX3RpbWVyX3N0b3AoT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiB0aW1lcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgT2ZmbG9hZEhvc3RQaGFzZSBwX3R5cGUpCit7CisgICAgdGltZXJfZGF0YS0+cGhhc2VzW3BfdHlwZV0udG90YWwgKz0gX3JkdHNjKCkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVyX2RhdGEtPnBoYXNlc1twX3R5cGVdLnN0YXJ0OworfQorCit2b2lkIG9mZmxvYWRfdGltZXJfZmlsbF90YXJnZXRfZGF0YShPZmZsb2FkSG9zdFRpbWVyRGF0YSAqIHRpbWVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWYpCit7CisgICAgdWludDY0X3QgKmRhdGEgPSAodWludDY0X3QqKSBidWY7CisKKyAgICB0aW1lcl9kYXRhLT50YXJnZXQuZnJlcXVlbmN5ID0gKmRhdGErKzsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNfb2ZmbG9hZF90YXJnZXRfbWF4X3BoYXNlOyBpKyspIHsKKyAgICAgICAgdGltZXJfZGF0YS0+dGFyZ2V0LnBoYXNlc1tpXS50b3RhbCA9ICpkYXRhKys7CisgICAgfQorfQorCit2b2lkIG9mZmxvYWRfdGltZXJfZmlsbF9ob3N0X3NkYXRhKE9mZmxvYWRIb3N0VGltZXJEYXRhICogdGltZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc2VudF9ieXRlcykKK3sKKyAgICBpZiAodGltZXJfZGF0YSkgeworICAgICAgICB0aW1lcl9kYXRhLT5zZW50X2J5dGVzICs9IHNlbnRfYnl0ZXM7CisgICAgfQorfQorCit2b2lkIG9mZmxvYWRfdGltZXJfZmlsbF9ob3N0X3JkYXRhKE9mZmxvYWRIb3N0VGltZXJEYXRhICogdGltZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgcmVjZWl2ZWRfYnl0ZXMpCit7CisgICAgaWYgKHRpbWVyX2RhdGEpIHsKKyAgICAgICAgdGltZXJfZGF0YS0+cmVjZWl2ZWRfYnl0ZXMgKz0gcmVjZWl2ZWRfYnl0ZXM7CisgICAgfQorfQorCit2b2lkIG9mZmxvYWRfdGltZXJfZmlsbF9ob3N0X21pY19udW0oT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiB0aW1lcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYXJkX251bWJlcikKK3sKKyAgICBpZiAodGltZXJfZGF0YSkgeworICAgICAgICB0aW1lcl9kYXRhLT5jYXJkX251bWJlciA9IGNhcmRfbnVtYmVyOworICAgIH0KK30KKworT2ZmbG9hZEhvc3RUaW1lckRhdGEqIG9mZmxvYWRfdGltZXJfaW5pdChjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKK3sKKyAgICBzdGF0aWMgYm9vbCBmaXJzdF90aW1lID0gdHJ1ZTsKKyAgICBPZmZsb2FkSG9zdFRpbWVyRGF0YSogdGltZXJfZGF0YSA9IE5VTEw7CisKKyAgICB0aW1lcl9kYXRhX211dGV4LmxvY2soKTsKKyAgICB7CisgICAgICAgIGlmICh0aW1lcl9lbmFibGVkIHx8CisgICAgICAgICAgICAob2ZmbG9hZF9yZXBvcnRfbGV2ZWwgJiYgb2ZmbG9hZF9yZXBvcnRfZW5hYmxlZCkpIHsKKyAgICAgICAgICAgIHRpbWVyX2RhdGEgPSAoT2ZmbG9hZEhvc3RUaW1lckRhdGEqKQorICAgICAgICAgICAgICAgIE9GRkxPQURfTUFMTE9DKHNpemVvZihPZmZsb2FkSG9zdFRpbWVyRGF0YSksIDApOworICAgICAgICAgICAgbWVtc2V0KHRpbWVyX2RhdGEsIDAsIHNpemVvZihPZmZsb2FkSG9zdFRpbWVyRGF0YSkpOworCisgICAgICAgICAgICB0aW1lcl9kYXRhLT5vZmZsb2FkX251bWJlciA9IE9GRkxPQURfREVCVUdfSU5DUl9PRkxEX05VTSgpIC0gMTsKKworICAgICAgICAgICAgaWYgKHRpbWVyX2RhdGFfaGVhZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGltZXJfZGF0YV9oZWFkID0gdGltZXJfZGF0YTsKKyAgICAgICAgICAgICAgICB0aW1lcl9kYXRhX3RhaWwgPSB0aW1lcl9kYXRhOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdGltZXJfZGF0YV90YWlsLT5uZXh0ID0gdGltZXJfZGF0YTsKKyAgICAgICAgICAgICAgICB0aW1lcl9kYXRhX3RhaWwgPSB0aW1lcl9kYXRhOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aW1lcl9kYXRhLT5maWxlID0gZmlsZTsKKyAgICAgICAgICAgIHRpbWVyX2RhdGEtPmxpbmUgPSBsaW5lOworICAgICAgICB9CisgICAgfQorICAgIHRpbWVyX2RhdGFfbXV0ZXgudW5sb2NrKCk7CisgICAgcmV0dXJuIHRpbWVyX2RhdGE7Cit9CisKKyNlbmRpZiAvLyBUSU1JTkdfU1VQUE9SVApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90aW1lcl90YXJnZXQuY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90aW1lcl90YXJnZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYTRjOTEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RpbWVyX3RhcmdldC5jcHAKQEAgLTAsMCArMSw2NyBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAib2ZmbG9hZF90aW1lci5oIgorI2luY2x1ZGUgIm9mZmxvYWRfdGFyZ2V0LmgiCisKKyNpZmRlZiBfX0lOVEVMX0NPTVBJTEVSCisjaW5jbHVkZSA8aWEzMmludHJpbi5oPgorI2Vsc2UgLy8gX19JTlRFTF9DT01QSUxFUgorI2luY2x1ZGUgPHg4NmludHJpbi5oPgorI2VuZGlmIC8vIF9fSU5URUxfQ09NUElMRVIKKworCisKK2ludCB0aW1lcl9lbmFibGVkID0gMDsKKworI2lmZGVmIFRJTUlOR19TVVBQT1JUCisKKyNpZiBkZWZpbmVkKExJTlVYKSB8fCBkZWZpbmVkKEZSRUVCU0QpCitzdGF0aWMgX190aHJlYWQgT2ZmbG9hZFRhcmdldFRpbWVyRGF0YSB0aW1lcl9kYXRhOworI2Vsc2UgLy8gV0lOTlQKK3N0YXRpYyBfX2RlY2xzcGVjKHRocmVhZCkgT2ZmbG9hZFRhcmdldFRpbWVyRGF0YSB0aW1lcl9kYXRhOworI2VuZGlmIC8vIGRlZmluZWQoTElOVVgpIHx8IGRlZmluZWQoRlJFRUJTRCkKKworCit2b2lkIG9mZmxvYWRfdGltZXJfc3RhcnQoCisgICAgT2ZmbG9hZFRhcmdldFBoYXNlIHBfdHlwZQorKQoreworICAgIHRpbWVyX2RhdGEucGhhc2VzW3BfdHlwZV0uc3RhcnQgPSBfcmR0c2MoKTsKK30KKwordm9pZCBvZmZsb2FkX3RpbWVyX3N0b3AoCisgICAgT2ZmbG9hZFRhcmdldFBoYXNlIHBfdHlwZQorKQoreworICAgIHRpbWVyX2RhdGEucGhhc2VzW3BfdHlwZV0udG90YWwgKz0gX3JkdHNjKCkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXJfZGF0YS5waGFzZXNbcF90eXBlXS5zdGFydDsKK30KKwordm9pZCBvZmZsb2FkX3RpbWVyX2luaXQoKQoreworICAgIG1lbXNldCgmdGltZXJfZGF0YSwgMCwgc2l6ZW9mKE9mZmxvYWRUYXJnZXRUaW1lckRhdGEpKTsKK30KKwordm9pZCBvZmZsb2FkX3RpbWVyX2ZpbGxfdGFyZ2V0X2RhdGEoCisgICAgdm9pZCAqYnVmCispCit7CisgICAgdWludDY0X3QgKmRhdGEgPSAodWludDY0X3QqKSBidWY7CisKKyAgICB0aW1lcl9kYXRhLmZyZXF1ZW5jeSA9IG1pY19mcmVxdWVuY3k7CisgICAgbWVtY3B5KGRhdGErKywgJih0aW1lcl9kYXRhLmZyZXF1ZW5jeSksIHNpemVvZih1aW50NjRfdCkpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjX29mZmxvYWRfdGFyZ2V0X21heF9waGFzZTsgaSsrKSB7CisgICAgICAgIG1lbWNweShkYXRhKyssICYodGltZXJfZGF0YS5waGFzZXNbaV0udG90YWwpLCBzaXplb2YodWludDY0X3QpKTsKKyAgICB9Cit9CisKKyNlbmRpZiAvLyBUSU1JTkdfU1VQUE9SVApkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90cmFjZS5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RyYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTA2MjA0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90cmFjZS5jcHAKQEAgLTAsMCArMSwzMDkgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgIm9mZmxvYWRfdHJhY2UuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAibGlib2ZmbG9hZF9lcnJvcl9jb2Rlcy5oIgorCitleHRlcm4gY29uc3QgY2hhciAqcHJlZml4OworCisjaWYgIUhPU1RfTElCUkFSWQorZXh0ZXJuIGludCBtaWNfaW5kZXg7CisjZW5kaWYKKworLy8gVGhlIGRlYnVnIHJvdXRpbmVzCisKK3N0YXRpYyBjb25zdCBjaGFyICogb2ZmbG9hZF9zdGFnZShzdGQ6OnN0cmluZ3N0cmVhbSAmc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZmxvYWRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJpbnRfdGFnKQoreworICAgIHNzIDw8ICJbIiA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X29mZmxvYWQpIDw8ICJdIjsKKyNpZiBIT1NUX0xJQlJBUlkKKyAgICBzcyA8PCAiIFsiIDw8IHByZWZpeCA8PCAiXSI7CisgICAgaWYgKHByaW50X3RhZykgeworICAgICAgICBzcyA8PCAiICBbIiA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3RhZyk7CisgICAgICAgIHNzIDw8ICIgIiA8PCBvZmZsb2FkX251bWJlciA8PCAiXSI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzcyA8PCAiICAgICAgICAgIjsKKyAgICB9CisgICAgc3MgPDwgIiBbIiA8PCB0YWcgPDwgIl0iOworICAgIHNzIDw8ICIgICAgICAgICAgICIgPDwgdGV4dDsKKyNlbHNlCisgICAgc3MgPDwgIiBbIiA8PCBwcmVmaXggPDwgIiAiIDw8IG1pY19pbmRleCA8PCAiXSI7CisgICAgaWYgKHByaW50X3RhZykgeworICAgICAgICBzcyA8PCAiIFsiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfdGFnKTsKKyAgICAgICAgc3MgPDwgIiAiIDw8IG9mZmxvYWRfbnVtYmVyIDw8ICJdIjsKKyAgICB9CisgICAgc3MgPDwgIiBbIiA8PCB0YWcgPDwgIl0iOworICAgIHNzIDw8ICIgICAgICAgICAgICIgPDwgdGV4dDsKKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIG9mZmxvYWRfc2lnbmFsKHN0ZDo6c3RyaW5nc3RyZWFtICZzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2ZmbG9hZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRleHQpCit7CisgICAgc3MgPDwgIlsiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfb2ZmbG9hZCkgPDwgIl0iOworICAgIHNzIDw8ICIgWyIgPDwgcHJlZml4IDw8ICJdIjsKKyAgICBzcyA8PCAiICBbIiA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3RhZyk7CisgICAgc3MgPDwgIiAiIDw8IG9mZmxvYWRfbnVtYmVyIDw8ICJdIjsKKyAgICBzcyA8PCAiIFsiIDw8IHRhZyA8PCAiXSI7CisgICAgc3MgPDwgIiAgICAgICAgICAiIDw8IHRleHQ7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgb2ZmbG9hZF9zdGFnZV9wcmludChpbnQgc3RhZ2UsIGludCBvZmZsb2FkX251bWJlciwgLi4uKQoreworICAgIHN0ZDo6c3RyaW5nIGJ1ZjsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICBjaGFyIGNvbnN0ICpzdHIxOworICAgIGNoYXIgY29uc3QgKnN0cjI7CisgICAgdmFfbGlzdCB2YV9hcmdzOworICAgIHZhX3N0YXJ0KHZhX2FyZ3MsIG9mZmxvYWRfbnVtYmVyKTsKKyAgICB2YV9hcmcodmFfYXJncywgY2hhciopOworCisgICAgc3dpdGNoIChzdGFnZSkgeworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9zdGFydDoKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXJ0KTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCB0cnVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9pbml0OgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfaW5pdCk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgZmFsc2UpOworICAgICAgICAgICAgc3MgPDwgIiAiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbG9naWNhbF9jYXJkKTsKKyAgICAgICAgICAgIHNzIDw8ICIgIiA8PCB2YV9hcmcodmFfYXJncywgaW50KTsKKyAgICAgICAgICAgIHNzIDw8ICIgPSAiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfcGh5c2ljYWxfY2FyZCk7CisgICAgICAgICAgICBzcyA8PCAiICIgPDwgdmFfYXJnKHZhX2FyZ3MsIGludCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfcmVnaXN0ZXI6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9yZWdpc3Rlcik7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaW5pdF9mdW5jOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfaW5pdF9mdW5jKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCB0cnVlKTsKKyAgICAgICAgICAgIHNzIDw8ICI6ICIgPDwgdmFfYXJnKHZhX2FyZ3MsIGNoYXIqKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9jcmVhdGVfYnVmX2hvc3Q6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9jcmVhdGVfYnVmX2hvc3QpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgc3MgPDwgIjogYmFzZT0weCIgPDwgc3RkOjpoZXggPDwgdmFfYXJnKHZhX2FyZ3MsIHVpbnQ2NF90KTsKKyAgICAgICAgICAgIHNzIDw8ICIgbGVuZ3RoPSIgPDwgc3RkOjpkZWMgPDwgdmFfYXJnKHZhX2FyZ3MsIHVpbnQ2NF90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9jcmVhdGVfYnVmX21pYzoKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2NyZWF0ZV9idWZfbWljKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCB0cnVlKTsKKyAgICAgICAgICAgIHNzIDw8ICI6IHNpemU9IiA8PCB2YV9hcmcodmFfYXJncywgdWludDY0X3QpOworICAgICAgICAgICAgc3MgPDwgIiBvZmZzZXQ9IiA8PCB2YV9hcmcodmFfYXJncywgaW50KTsKKyAgICAgICAgICAgIGlmICh2YV9hcmcodmFfYXJncyxpbnQpKQorICAgICAgICAgICAgICAgc3MgPDwgIiAoMk0gcGFnZSkiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3NlbmRfcG9pbnRlcl9kYXRhOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc2VuZF9wb2ludGVyX2RhdGEpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3NlbnRfcG9pbnRlcl9kYXRhOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc2VudF9wb2ludGVyX2RhdGEpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgc3MgPDwgIiAiIDw8IHZhX2FyZyh2YV9hcmdzLCB1aW50NjRfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfZ2F0aGVyX2NvcHlpbl9kYXRhOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfZ2F0aGVyX2NvcHlpbl9kYXRhKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCB0cnVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9jb3B5aW5fZGF0YToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2NvcHlpbl9kYXRhKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCB0cnVlKTsKKyAgICAgICAgICAgIHNzIDw8ICIgIiA8PCB2YV9hcmcodmFfYXJncywgdWludDY0X3QpIDw8ICIgIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9jb21wdXRlOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfY29tcHV0ZSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfcmVjZWl2ZV9wb2ludGVyX2RhdGE6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9yZWNlaXZlX3BvaW50ZXJfZGF0YSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfcmVjZWl2ZWRfcG9pbnRlcl9kYXRhOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfcmVjZWl2ZWRfcG9pbnRlcl9kYXRhKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCB0cnVlKTsKKyAgICAgICAgICAgIHNzIDw8ICIgIiA8PCB2YV9hcmcodmFfYXJncywgdWludDY0X3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3N0YXJ0X3RhcmdldF9mdW5jOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhcnRfdGFyZ2V0X2Z1bmMpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgc3MgPDwgIjogIiA8PCB2YV9hcmcodmFfYXJncywgY2hhciopOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3ZhcjoKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3Zhcik7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgIiAgIiwgdHJ1ZSk7CisgICAgICAgICAgICB2YV9hcmcodmFfYXJncywgaW50KTsKKyAgICAgICAgICAgIHNzIDw8IHZhX2FyZyh2YV9hcmdzLCBjaGFyKik7CisgICAgICAgICAgICBzcyA8PCAiICIgPDwgIiAiIDw8IHZhX2FyZyh2YV9hcmdzLCBjaGFyKik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfc2NhdHRlcl9jb3B5aW5fZGF0YToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3NjYXR0ZXJfY29weWluX2RhdGEpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2dhdGhlcl9jb3B5b3V0X2RhdGE6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9nYXRoZXJfY29weW91dF9kYXRhKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCB0cnVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9zY2F0dGVyX2NvcHlvdXRfZGF0YToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3NjYXR0ZXJfY29weW91dF9kYXRhKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCB0cnVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9jb3B5b3V0X2RhdGE6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9jb3B5b3V0X2RhdGEpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgc3MgPDwgIiAgICIgPDwgdmFfYXJnKHZhX2FyZ3MsIHVpbnQ2NF90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9zaWduYWw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDY0X3QgICpzaWduYWw7CisgICAgICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGVfc2lnbmFsKTsKKyAgICAgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zaWduYWwpOworICAgICAgICAgICAgICAgIG9mZmxvYWRfc2lnbmFsKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMik7CisJICAgICAgICBzaWduYWwgPSB2YV9hcmcodmFfYXJncywgdWludDY0X3QqKTsKKwkgICAgICAgIGlmIChzaWduYWwpCisgICAgICAgICAgICAgICAgICAgc3MgPDwgIiAweCIgPDwgc3RkOjpoZXggPDwgKnNpZ25hbDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgc3MgPDwgIiBub25lIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF93YWl0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBjb3VudDsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCAgKipzaWduYWw7CisgICAgICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGVfc2lnbmFsKTsKKyAgICAgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF93YWl0KTsKKyAgICAgICAgICAgICAgICBvZmZsb2FkX3NpZ25hbChzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIpOworICAgICAgICAgICAgICAgIGNvdW50ID0gdmFfYXJnKHZhX2FyZ3MsIGludCk7CisgICAgICAgICAgICAgICAgc2lnbmFsID0gdmFfYXJnKHZhX2FyZ3MsIHVpbnQ2NF90KiopOworICAgICAgICAgICAgICAgIGlmIChjb3VudCkgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNzIDw8ICIgIiA8PCBzdGQ6OmhleCA8PCBzaWduYWxbY291bnQtMV07CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudC0tOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc3MgPDwgIiBub25lIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF91bnJlZ2lzdGVyOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfdW5yZWdpc3Rlcik7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2Rlc3Ryb3k6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9kZXN0cm95KTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCB0cnVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9teW9pbml0OgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbXlvaW5pdCk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX215b3JlZ2lzdGVyOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbXlvcmVnaXN0ZXIpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9teW9maW5pOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbXlvZmluaSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX21pY19teW9fc2hhcmVkOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbWljX215b19zaGFyZWQpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIGZhbHNlKTsKKyAgICAgICAgICAgIHNzIDw8ICIgIiA8PCB2YV9hcmcodmFfYXJncywgY2hhciopOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX21pY19teW9fZnB0cjoKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X21pY19teW9fZnB0cik7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgZmFsc2UpOworICAgICAgICAgICAgc3MgPDwgIiAiIDw8IHZhX2FyZyh2YV9hcmdzLCBjaGFyKik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfbXlvc2hhcmVkbWFsbG9jOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbXlvc2hhcmVkbWFsbG9jKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCBmYWxzZSk7CisgICAgICAgICAgICB2YV9hcmcodmFfYXJncywgY2hhciopOworICAgICAgICAgICAgc3MgPDwgIiAiIDw8IHZhX2FyZyh2YV9hcmdzLCBzaXplX3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX215b3NoYXJlZGZyZWU6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9teW9zaGFyZWRmcmVlKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCBmYWxzZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfbXlvc2hhcmVkYWxpZ25lZG1hbGxvYzoKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X215b3NoYXJlZGFsaWduZWRtYWxsb2MpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIGZhbHNlKTsKKyAgICAgICAgICAgIHZhX2FyZyh2YV9hcmdzLCBjaGFyKik7CisgICAgICAgICAgICBzcyA8PCAiICIgPDwgdmFfYXJnKHZhX2FyZ3MsIHNpemVfdCk7CisgICAgICAgICAgICBzcyA8PCAiICIgPDwgdmFfYXJnKHZhX2FyZ3MsIHNpemVfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfbXlvc2hhcmVkYWxpZ25lZGZyZWU6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9teW9zaGFyZWRhbGlnbmVkZnJlZSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX215b2FjcXVpcmU6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9teW9hY3F1aXJlKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCBmYWxzZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfbXlvcmVsZWFzZToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X215b3JlbGVhc2UpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3JlcG9ydF91bmtub3duX3RyYWNlX25vZGUpOworICAgICAgICAgICAgYWJvcnQoKTsKKyAgICB9CisgICAgc3MgPDwgIlxuIjsKKyAgICBidWYgPSBzcy5zdHIoKTsKKyAgICBmcHJpbnRmKHN0ZG91dCwgYnVmLmRhdGEoKSk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisKKyAgICB2YV9lbmQodmFfYXJncyk7CisgICAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90cmFjZS5oIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YzI4YTQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3RyYWNlLmgKQEAgLTAsMCArMSw1MiBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvLyBUaGUgcGFydHMgb2YgdGhlIG9mZmxvYWQgbGlicmFyeSBjb21tb24gdG8gaG9zdCBhbmQgdGFyZ2V0CisKK3ZvaWQgb2ZmbG9hZF9zdGFnZV9wcmludChpbnQgc3RhZ2UsIGludCBvZmZsb2FkX251bWJlciwgLi4uKTsKKworZW51bSBPZmZsb2FkVHJhY2VTdGFnZSB7CisgICAgLy8gVG90YWwgdGltZSBzcGVudCBvbiB0aGUgdGFyZ2V0CisgICAgY19vZmZsb2FkX3N0YXJ0ID0gMCwKKyAgICBjX29mZmxvYWRfaW5pdCwKKyAgICBjX29mZmxvYWRfcmVnaXN0ZXIsCisgICAgY19vZmZsb2FkX2luaXRfZnVuYywKKyAgICBjX29mZmxvYWRfY3JlYXRlX2J1Zl9ob3N0LAorICAgIGNfb2ZmbG9hZF9jcmVhdGVfYnVmX21pYywKKyAgICBjX29mZmxvYWRfc2VuZF9wb2ludGVyX2RhdGEsCisgICAgY19vZmZsb2FkX3NlbnRfcG9pbnRlcl9kYXRhLAorICAgIGNfb2ZmbG9hZF9nYXRoZXJfY29weWluX2RhdGEsCisgICAgY19vZmZsb2FkX2NvcHlpbl9kYXRhLAorICAgIGNfb2ZmbG9hZF9jb21wdXRlLAorICAgIGNfb2ZmbG9hZF9yZWNlaXZlX3BvaW50ZXJfZGF0YSwKKyAgICBjX29mZmxvYWRfcmVjZWl2ZWRfcG9pbnRlcl9kYXRhLAorICAgIGNfb2ZmbG9hZF9zdGFydF90YXJnZXRfZnVuYywKKyAgICBjX29mZmxvYWRfdmFyLAorICAgIGNfb2ZmbG9hZF9zY2F0dGVyX2NvcHlpbl9kYXRhLAorICAgIGNfb2ZmbG9hZF9nYXRoZXJfY29weW91dF9kYXRhLAorICAgIGNfb2ZmbG9hZF9zY2F0dGVyX2NvcHlvdXRfZGF0YSwKKyAgICBjX29mZmxvYWRfY29weW91dF9kYXRhLAorICAgIGNfb2ZmbG9hZF9zaWduYWwsCisgICAgY19vZmZsb2FkX3dhaXQsCisgICAgY19vZmZsb2FkX3VucmVnaXN0ZXIsCisgICAgY19vZmZsb2FkX2Rlc3Ryb3ksCisgICAgY19vZmZsb2FkX2ZpbmlzaCwKKyAgICBjX29mZmxvYWRfbXlvaW5pdCwKKyAgICBjX29mZmxvYWRfbXlvcmVnaXN0ZXIsCisgICAgY19vZmZsb2FkX21pY19teW9fc2hhcmVkLAorICAgIGNfb2ZmbG9hZF9taWNfbXlvX2ZwdHIsCisgICAgY19vZmZsb2FkX215b3NoYXJlZG1hbGxvYywKKyAgICBjX29mZmxvYWRfbXlvc2hhcmVkZnJlZSwKKyAgICBjX29mZmxvYWRfbXlvc2hhcmVkYWxpZ25lZG1hbGxvYywKKyAgICBjX29mZmxvYWRfbXlvc2hhcmVkYWxpZ25lZGZyZWUsCisgICAgY19vZmZsb2FkX215b2FjcXVpcmUsCisgICAgY19vZmZsb2FkX215b3JlbGVhc2UsCisgICAgY19vZmZsb2FkX215b2ZpbmkKK307CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3V0aWwuY3BwIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF91dGlsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODQ2MmM4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF91dGlsLmNwcApAQCAtMCwwICsxLDIwNiBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAib2ZmbG9hZF91dGlsLmgiCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlICJsaWJvZmZsb2FkX2Vycm9yX2NvZGVzLmgiCisKKyNpZmRlZiBUQVJHRVRfV0lOTlQKK3ZvaWQgKnRocmVhZF9nZXRzcGVjaWZpYyhwdGhyZWFkX2tleV90IGtleSkKK3sKKyAgICBpZiAoa2V5ID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gVGxzR2V0VmFsdWUoa2V5KTsKKyAgICB9Cit9CisKK2ludCB0aHJlYWRfc2V0c3BlY2lmaWMocHRocmVhZF9rZXlfdCBrZXksIGNvbnN0IHZvaWQgKnZhbHVlKQoreworICAgIHJldHVybiAoVGxzU2V0VmFsdWUoa2V5LCAoTFBWT0lEKXZhbHVlKSkgPyAwIDogR2V0TGFzdEVycm9yKCk7Cit9CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKK2Jvb2wgX19vZmZsb2FkX3BhcnNlX3NpemVfc3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgdWludDY0X3QgJm5ld19zaXplKQoreworICAgIHVpbnQ2NF90IHZhbDsKKyAgICBjaGFyICpzdWZmaXg7CisKKyAgICBlcnJubyA9IDA7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgdmFsID0gc3RydG91bChzdHIsICZzdWZmaXgsIDEwKTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgIHZhbCA9IHN0cnRvdWxsKHN0ciwgJnN1ZmZpeCwgMTApOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorICAgIGlmIChlcnJubyAhPSAwIHx8IHN1ZmZpeCA9PSBzdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChzdWZmaXhbMF0gPT0gJ1wwJykgeworICAgICAgICAvLyBkZWZhdWx0IGlzIEtpbG9ieXRlcworICAgICAgICBuZXdfc2l6ZSA9IHZhbCAqIDEwMjQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBlbHNlIGlmIChzdWZmaXhbMV0gPT0gJ1wwJykgeworICAgICAgICAvLyBPcHRpb25hbCBzdWZmaXhlczogQiAoYnl0ZXMpLCBLIChLaWxvYnl0ZXMpLCBNIChNZWdhYnl0ZXMpLAorICAgICAgICAvLyBHIChHaWdhYnl0ZXMpLCBvciBUIChUZXJhYnl0ZXMpIHNwZWNpZnkgdGhlIHVuaXRzLgorICAgICAgICBzd2l0Y2ggKHN1ZmZpeFswXSkgeworICAgICAgICAgICAgY2FzZSAnYic6CisgICAgICAgICAgICBjYXNlICdCJzoKKyAgICAgICAgICAgICAgICBuZXdfc2l6ZSA9IHZhbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAnayc6CisgICAgICAgICAgICBjYXNlICdLJzoKKyAgICAgICAgICAgICAgICBuZXdfc2l6ZSA9IHZhbCAqIDEwMjQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgJ20nOgorICAgICAgICAgICAgY2FzZSAnTSc6CisgICAgICAgICAgICAgICAgbmV3X3NpemUgPSB2YWwgKiAxMDI0ICogMTAyNDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAnZyc6CisgICAgICAgICAgICBjYXNlICdHJzoKKyAgICAgICAgICAgICAgICBuZXdfc2l6ZSA9IHZhbCAqIDEwMjQgKiAxMDI0ICogMTAyNDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAndCc6CisgICAgICAgICAgICBjYXNlICdUJzoKKyAgICAgICAgICAgICAgICBuZXdfc2l6ZSA9IHZhbCAqIDEwMjQgKiAxMDI0ICogMTAyNCAqIDEwMjQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBfX29mZmxvYWRfcGFyc2VfaW50X3N0cmluZyhjb25zdCBjaGFyICpzdHIsIGludDY0X3QgJnZhbHVlKQoreworICAgIGludDY0X3QgdmFsOworICAgIGNoYXIgKnN1ZmZpeDsKKworICAgIGVycm5vID0gMDsKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICB2YWwgPSBzdHJ0b2woc3RyLCAmc3VmZml4LCAwKTsKKyNlbHNlCisgICAgdmFsID0gc3RydG9sbChzdHIsICZzdWZmaXgsIDApOworI2VuZGlmCisgICAgaWYgKGVycm5vID09IDAgJiYgc3VmZml4ICE9IHN0ciAmJiAqc3VmZml4ID09ICdcMCcpIHsKKyAgICAgICAgdmFsdWUgPSB2YWw7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKyNpZmRlZiBUQVJHRVRfV0lOTlQKK2V4dGVybiB2b2lkKiBETF9vcGVuKGNvbnN0IGNoYXIgKnBhdGgpCit7CisgICAgdm9pZCAqaGFuZGxlOworICAgIGludCBlcnJvcl9tb2RlOworCisgICAgLyoKKyAgICAgKiBkbyBub3QgZGlzcGxheSBtZXNzYWdlIGJveCB3aXRoIGVycm9yIGlmIGl0IHRoZSBjYWxsIGJlbG93IGZhaWxzIHRvCisgICAgICogbG9hZCBkeW5hbWljIGxpYnJhcnkuCisgICAgICovCisgICAgZXJyb3JfbW9kZSA9IFNldEVycm9yTW9kZShTRU1fRkFJTENSSVRJQ0FMRVJST1JTIHwgU0VNX05PT1BFTkZJTEVFUlJPUkJPWCk7CisKKyAgICAvKiBsb2FkIGR5bmFtaWMgbGlicmFyeSAqLworICAgIGhhbmRsZSA9ICh2b2lkKikgTG9hZExpYnJhcnkocGF0aCk7CisKKyAgICAvKiByZXN0b3JlIGVycm9yIG1vZGUgKi8KKyAgICBTZXRFcnJvck1vZGUoZXJyb3JfbW9kZSk7CisKKyAgICByZXR1cm4gaGFuZGxlOworfQorCitleHRlcm4gaW50IERMX2FkZHIoY29uc3Qgdm9pZCAqYWRkciwgRGxfaW5mbyAqZGxfaW5mbykKK3sKKyAgICBNRU1PUllfQkFTSUNfSU5GT1JNQVRJT04gbWVtX2luZm87CisgICAgY2hhciBtb2RfbmFtZVtNQVhfUEFUSF07CisgICAgSE1PRFVMRSBtb2RfaGFuZGxlOworCisgICAgLyogRmlsbCBNRU1PUllfQkFTSUNfSU5GT1JNQVRJT04gc3RydWN0ICovCisgICAgaWYgKCFWaXJ0dWFsUXVlcnkoYWRkciwgJm1lbV9pbmZvLCBzaXplb2YobWVtX2luZm8pKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgbW9kX2hhbmRsZSA9IChITU9EVUxFKW1lbV9pbmZvLkFsbG9jYXRpb25CYXNlOworCisgICAgLyogQU5TSSBmaWxlIG5hbWUgZm9yIG1vZHVsZSAqLworICAgIGlmICghR2V0TW9kdWxlRmlsZU5hbWVBKG1vZF9oYW5kbGUsIChjaGFyKikgbW9kX25hbWUsIHNpemVvZihtb2RfbmFtZSkpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBzdHJjcHkoZGxfaW5mby0+ZGxpX2ZuYW1lLCBtb2RfbmFtZSk7CisgICAgZGxfaW5mby0+ZGxpX2ZiYXNlID0gbWVtX2luZm8uQmFzZUFkZHJlc3M7CisgICAgZGxfaW5mby0+ZGxpX3NhZGRyID0gYWRkcjsKKyAgICBzdHJjcHkoZGxfaW5mby0+ZGxpX3NuYW1lLCBtb2RfbmFtZSk7CisgICAgcmV0dXJuIDE7Cit9CisKKy8vIFJ1biBvbmNlCitzdGF0aWMgQk9PTCBDQUxMQkFDSyBfX29mZmxvYWRfcnVuX29uY2Vfd3JhcHBlcigKKyAgICBQSU5JVF9PTkNFIGluaXRPbmNlLAorICAgIFBWT0lEIHBhcmFtZXRlciwKKyAgICBQVk9JRCAqY29udGV4dAorKQoreworICAgIHZvaWQgKCppbml0X3JvdXRpbmUpKHZvaWQpID0gKHZvaWQoKikodm9pZCkpIHBhcmFtZXRlcjsKKyAgICBpbml0X3JvdXRpbmUoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBfX29mZmxvYWRfcnVuX29uY2UoT2ZmbG9hZE9uY2VDb250cm9sICpjdHJsLCB2b2lkICgqZnVuYykodm9pZCkpCit7CisgICAgSW5pdE9uY2VFeGVjdXRlT25jZShjdHJsLCBfX29mZmxvYWRfcnVuX29uY2Vfd3JhcHBlciwgKHZvaWQqKSBmdW5jLCAwKTsKK30KKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworLyogQVJHU1VTRUQgKi8gLy8gdmVyc2lvbiBpcyBub3QgdXNlZCBvbiB3aW5kb3dzCit2b2lkKiBETF9zeW0odm9pZCAqaGFuZGxlLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2ZXJzaW9uKQoreworI2lmZGVmIFRBUkdFVF9XSU5OVAorICAgIHJldHVybiBHZXRQcm9jQWRkcmVzcygoSE1PRFVMRSkgaGFuZGxlLCBuYW1lKTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgIGlmICh2ZXJzaW9uID09IDApIHsKKyAgICAgICAgcmV0dXJuIGRsc3ltKGhhbmRsZSwgbmFtZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gZGx2c3ltKGhhbmRsZSwgbmFtZSwgdmVyc2lvbik7CisgICAgfQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorfQorCitpbnQ2NF90IGdldF9lbF92YWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJhc2UsCisgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgc2l6ZSkKK3sKKyAgICBpbnQ2NF90IHZhbCA9IDA7CisgICAgc3dpdGNoIChzaXplKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHZhbCA9IHN0YXRpY19jYXN0PGludDY0X3Q+KCooKGNoYXIgKikoYmFzZSArIG9mZnNldCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICB2YWwgPSBzdGF0aWNfY2FzdDxpbnQ2NF90PigqKChzaG9ydCAqKShiYXNlICsgb2Zmc2V0KSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHZhbCA9IHN0YXRpY19jYXN0PGludDY0X3Q+KCooKGludCAqKShiYXNlICsgb2Zmc2V0KSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB2YWwgPSAqKChpbnQ2NF90ICopKGJhc2UgKyBvZmZzZXQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gdmFsOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF91dGlsLmggYi9maW5hbC9vZmZsb2FkL3NyYy9vZmZsb2FkX3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTBkNzdkCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvb2ZmbG9hZF91dGlsLmgKQEAgLTAsMCArMSwxNTMgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBPRkZMT0FEX1VUSUxfSF9JTkNMVURFRAorI2RlZmluZSBPRkZMT0FEX1VUSUxfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2lmZGVmIFRBUkdFVF9XSU5OVAorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxwcm9jZXNzLmg+CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworI2lmZGVmIFRBUkdFVF9XSU5OVAordHlwZWRlZiB1bnNpZ25lZCBwdGhyZWFkX2tleV90OwordHlwZWRlZiBpbnQgcGlkX3Q7CisKKyNkZWZpbmUgX19mdW5jX18gX19GVU5DVElPTl9fCisjZGVmaW5lIHN0cnRva19yKHMsZCxwKSBzdHJ0b2tfcyhzLGQscCkKKyNkZWZpbmUgc3RyY2FzZWNtcChhLGIpIHN0cmljbXAoYSxiKQorCisjZGVmaW5lIHRocmVhZF9rZXlfY3JlYXRlKGtleSwgZGVzdHJ1Y3RvcikgXAorICAgICgoKCprZXkgPSBUbHNBbGxvYygpKSA+IDApID8gMCA6IEdldExhc3RFcnJvcigpKQorI2RlZmluZSB0aHJlYWRfa2V5X2RlbGV0ZShrZXkpIFRsc0ZyZWUoa2V5KQorCisjaWZuZGVmIFNfSVNSRUcKKyNkZWZpbmUgU19JU1JFRyhtb2RlKSAgKCgobW9kZSkgJiBTX0lGTVQpID09IFNfSUZSRUcpCisjZW5kaWYKKwordm9pZCogICB0aHJlYWRfZ2V0c3BlY2lmaWMocHRocmVhZF9rZXlfdCBrZXkpOworaW50ICAgICB0aHJlYWRfc2V0c3BlY2lmaWMocHRocmVhZF9rZXlfdCBrZXksIGNvbnN0IHZvaWQgKnZhbHVlKTsKKyNlbHNlCisjZGVmaW5lIHRocmVhZF9rZXlfY3JlYXRlKGtleSwgZGVzdHJ1Y3RvcikgXAorICAgICAgICAgICAgcHRocmVhZF9rZXlfY3JlYXRlKChrZXkpLCAoZGVzdHJ1Y3RvcikpCisjZGVmaW5lIHRocmVhZF9rZXlfZGVsZXRlKGtleSkgIHB0aHJlYWRfa2V5X2RlbGV0ZShrZXkpCisjZGVmaW5lIHRocmVhZF9nZXRzcGVjaWZpYyhrZXkpIHB0aHJlYWRfZ2V0c3BlY2lmaWMoa2V5KQorI2RlZmluZSB0aHJlYWRfc2V0c3BlY2lmaWMoa2V5LCB2YWx1ZSkgcHRocmVhZF9zZXRzcGVjaWZpYyhrZXksIHZhbHVlKQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisvLyBNdXRleCBpbXBsZW1lbnRhdGlvbgorc3RydWN0IG11dGV4X3QgeworICAgIG11dGV4X3QoKSB7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oJm1fbG9jayk7CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyAgICAgICAgcHRocmVhZF9tdXRleF9pbml0KCZtX2xvY2ssIDApOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorICAgIH0KKworICAgIH5tdXRleF90KCkgeworI2lmZGVmIFRBUkdFVF9XSU5OVAorICAgICAgICBEZWxldGVDcml0aWNhbFNlY3Rpb24oJm1fbG9jayk7CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyAgICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtX2xvY2spOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorICAgIH0KKworICAgIHZvaWQgbG9jaygpIHsKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJm1fbG9jayk7CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX2xvY2spOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorICAgIH0KKworICAgIHZvaWQgdW5sb2NrKCkgeworI2lmZGVmIFRBUkdFVF9XSU5OVAorICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmbV9sb2NrKTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbV9sb2NrKTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyAgICB9CisKK3ByaXZhdGU6CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgQ1JJVElDQUxfU0VDVElPTiAgICBtX2xvY2s7CisjZWxzZQorICAgIHB0aHJlYWRfbXV0ZXhfdCAgICAgbV9sb2NrOworI2VuZGlmCit9OworCitzdHJ1Y3QgbXV0ZXhfbG9ja2VyX3QgeworICAgIG11dGV4X2xvY2tlcl90KG11dGV4X3QgJm11dGV4KSA6IG1fbXV0ZXgobXV0ZXgpIHsKKyAgICAgICAgbV9tdXRleC5sb2NrKCk7CisgICAgfQorCisgICAgfm11dGV4X2xvY2tlcl90KCkgeworICAgICAgICBtX211dGV4LnVubG9jaygpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBtdXRleF90ICZtX211dGV4OworfTsKKworLy8gRHluYW1pYyBsb2FkZXIgaW50ZXJmYWNlCisjaWZkZWYgVEFSR0VUX1dJTk5UCitzdHJ1Y3QgRGxfaW5mbworeworICAgIGNoYXIgICAgICAgIGRsaV9mbmFtZVtNQVhfUEFUSF07CisgICAgdm9pZCAgICAgICAqZGxpX2ZiYXNlOworICAgIGNoYXIgICAgICAgIGRsaV9zbmFtZVtNQVhfUEFUSF07CisgICAgY29uc3Qgdm9pZCAqZGxpX3NhZGRyOworfTsKKwordm9pZCogICBETF9vcGVuKGNvbnN0IGNoYXIgKnBhdGgpOworI2RlZmluZSBETF9jbG9zZShoYW5kbGUpICAgICAgICBGcmVlTGlicmFyeSgoSE1PRFVMRSkgKGhhbmRsZSkpCitpbnQgICAgIERMX2FkZHIoY29uc3Qgdm9pZCAqYWRkciwgRGxfaW5mbyAqaW5mbyk7CisjZWxzZQorI2RlZmluZSBETF9vcGVuKHBhdGgpICAgICAgICAgICBkbG9wZW4oKHBhdGgpLCBSVExEX05PVykKKyNkZWZpbmUgRExfY2xvc2UoaGFuZGxlKSAgICAgICAgZGxjbG9zZShoYW5kbGUpCisjZGVmaW5lIERMX2FkZHIoYWRkciwgaW5mbykgICAgIGRsYWRkcigoYWRkciksIChpbmZvKSkKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworZXh0ZXJuIHZvaWQqIERMX3N5bSh2b2lkICpoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZlcnNpb24pOworCisvLyBPbmUtdGltZSBpbml0aWFsaXphdGlvbiBBUEkKKyNpZmRlZiBUQVJHRVRfV0lOTlQKK3R5cGVkZWYgSU5JVF9PTkNFICAgICAgICAgICAgICAgICAgIE9mZmxvYWRPbmNlQ29udHJvbDsKKyNkZWZpbmUgT0ZGTE9BRF9PTkNFX0NPTlRST0xfSU5JVCAgIElOSVRfT05DRV9TVEFUSUNfSU5JVAorCitleHRlcm4gdm9pZCBfX29mZmxvYWRfcnVuX29uY2UoT2ZmbG9hZE9uY2VDb250cm9sICpjdHJsLCB2b2lkICgqZnVuYykodm9pZCkpOworI2Vsc2UKK3R5cGVkZWYgcHRocmVhZF9vbmNlX3QgICAgICAgICAgICAgIE9mZmxvYWRPbmNlQ29udHJvbDsKKyNkZWZpbmUgT0ZGTE9BRF9PTkNFX0NPTlRST0xfSU5JVCAgIFBUSFJFQURfT05DRV9JTklUCisKKyNkZWZpbmUgX19vZmZsb2FkX3J1bl9vbmNlKGN0cmwsIGZ1bmMpIHB0aHJlYWRfb25jZShjdHJsLCBmdW5jKQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisvLyBQYXJzZXMgc2l6ZSBzcGVjaWZpY2F0aW9uIHN0cmluZy4KK2V4dGVybiBib29sIF9fb2ZmbG9hZF9wYXJzZV9zaXplX3N0cmluZyhjb25zdCBjaGFyICpzdHIsIHVpbnQ2NF90ICZuZXdfc2l6ZSk7CisKKy8vIFBhcnNlcyBzdHJpbmcgd2l0aCBpbnRlZ2VyIHZhbHVlCitleHRlcm4gYm9vbCBfX29mZmxvYWRfcGFyc2VfaW50X3N0cmluZyhjb25zdCBjaGFyICpzdHIsIGludDY0X3QgJnZhbHVlKTsKKworLy8gZ2V0IHZhbHVlIGJ5IGl0cyBiYXNlLCBvZmZzZXQgYW5kIHNpemUKK2ludDY0X3QgZ2V0X2VsX3ZhbHVlKAorICAgIGNoYXIgICAqYmFzZSwKKyAgICBpbnQ2NF90IG9mZnNldCwKKyAgICBpbnQ2NF90IHNpemUKKyk7CisjZW5kaWYgLy8gT0ZGTE9BRF9VVElMX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29mbGRiZWdpbi5jcHAgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmxkYmVnaW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NWY5ODIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmxkYmVnaW4uY3BwCkBAIC0wLDAgKzEsMTY0IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZiBIT1NUX0xJQlJBUlkKKyNpbmNsdWRlICJvZmZsb2FkX2hvc3QuaCIKKyNpbmNsdWRlICJvZmZsb2FkX215b19ob3N0LmgiCisjZWxzZQorI2luY2x1ZGUgImNvbXBpbGVyX2lmX3RhcmdldC5oIgorI2luY2x1ZGUgIm9mZmxvYWRfdGFyZ2V0LmgiCisjaW5jbHVkZSAib2ZmbG9hZF9teW9fdGFyZ2V0LmgiCisjZW5kaWYKKworI2lmZGVmIFRBUkdFVF9XSU5OVAorI2RlZmluZSBBTExPQ0FURShuYW1lKSBfX2RlY2xzcGVjKGFsbG9jYXRlKG5hbWUpKQorI2RlZmluZSBETExfTE9DQUwKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorI2RlZmluZSBBTExPQ0FURShuYW1lKSBfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKG5hbWUpKSkKKyNkZWZpbmUgRExMX0xPQ0FMICBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyNpZiBIT1NUX0xJQlJBUlkKKy8vIHRoZSBob3N0IHByb2dyYW0vc2hhcmVkIGxpYnJhcnkgc2hvdWxkIGFsd2F5cyBoYXZlIF9fb2ZmbG9hZF90YXJnZXRfaW1hZ2UKKy8vIHN5bWJvbCBkZWZpbmVkLiBUaGlzIHN5bWJvbCBzcGVjaWZpZXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGFyZ2V0IHByb2dyYW0KKy8vIGltYWdlLgorZXh0ZXJuICJDIiBETExfTE9DQUwgY29uc3Qgdm9pZCogX19vZmZsb2FkX3RhcmdldF9pbWFnZTsKKyNlbHNlIC8vIEhPU1RfTElCUkFSWQorLy8gRGVmaW5lIGEgd2VhayBtYWluIHdoaWNoIHdvdWxkIGJlIHVzZWQgb24gdGFyZ2V0IHNpZGUgaW4gY2FzZSB1c2VyZSdzCisvLyBzb3VyY2UgZmlsZSBjb250YWluaW5nIG1haW4gZG9lcyBub3QgaGF2ZSBvZmZsb2FkIGNvZGUuCisjcHJhZ21hIHdlYWsgbWFpbgoraW50IG1haW4odm9pZCkKK3sKKyAgICBPRkZMT0FEX1RBUkdFVF9NQUlOKCk7CisgICAgcmV0dXJuIDA7Cit9CisKKyNwcmFnbWEgd2VhayBNQUlOX18KK2V4dGVybiAiQyIgaW50IE1BSU5fXyh2b2lkKQoreworICAgIE9GRkxPQURfVEFSR0VUX01BSU4oKTsKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZiAvLyBIT1NUX0xJQlJBUlkKKworLy8gb2ZmbG9hZCBzZWN0aW9uIHByb2xvZworQUxMT0NBVEUoT0ZGTE9BRF9FTlRSWV9UQUJMRV9TRUNUSU9OX1NUQVJUKQorI2lmZGVmIFRBUkdFVF9XSU5OVAorX19kZWNsc3BlYyhhbGlnbihzaXplb2YoRnVuY1RhYmxlOjpFbnRyeSkpKQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorc3RhdGljIEZ1bmNUYWJsZTo6RW50cnkgX19vZmZsb2FkX2VudHJ5X3RhYmxlX3N0YXJ0ID0geyAwIH07CisKKy8vIGxpc3QgZWxlbWVudCBmb3IgdGhlIGN1cnJlbnQgbW9kdWxlCitzdGF0aWMgRnVuY0xpc3Q6Ok5vZGUgX19vZmZsb2FkX2VudHJ5X25vZGUgPSB7CisgICAgeyAmX19vZmZsb2FkX2VudHJ5X3RhYmxlX3N0YXJ0ICsgMSwgLTEgfSwKKyAgICAwLCAwCit9OworCisvLyBvZmZsb2FkIGZwIHNlY3Rpb24gcHJvbG9nCitBTExPQ0FURShPRkZMT0FEX0ZVTkNfVEFCTEVfU0VDVElPTl9TVEFSVCkKKyNpZmRlZiBUQVJHRVRfV0lOTlQKK19fZGVjbHNwZWMoYWxpZ24oc2l6ZW9mKEZ1bmNUYWJsZTo6RW50cnkpKSkKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKK3N0YXRpYyBGdW5jVGFibGU6OkVudHJ5IF9fb2ZmbG9hZF9mdW5jX3RhYmxlX3N0YXJ0ID0geyAwIH07CisKKy8vIGxpc3QgZWxlbWVudCBmb3IgdGhlIGN1cnJlbnQgbW9kdWxlCitzdGF0aWMgRnVuY0xpc3Q6Ok5vZGUgX19vZmZsb2FkX2Z1bmNfbm9kZSA9IHsKKyAgICB7ICZfX29mZmxvYWRfZnVuY190YWJsZV9zdGFydCArIDEsIC0xIH0sCisgICAgMCwgMAorfTsKKworLy8gb2ZmbG9hZCBmcCBzZWN0aW9uIHByb2xvZworQUxMT0NBVEUoT0ZGTE9BRF9WQVJfVEFCTEVfU0VDVElPTl9TVEFSVCkKKyNpZmRlZiBUQVJHRVRfV0lOTlQKK19fZGVjbHNwZWMoYWxpZ24oc2l6ZW9mKFZhclRhYmxlOjpFbnRyeSkpKQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorc3RhdGljIFZhclRhYmxlOjpFbnRyeSBfX29mZmxvYWRfdmFyX3RhYmxlX3N0YXJ0ID0geyAwIH07CisKKy8vIGxpc3QgZWxlbWVudCBmb3IgdGhlIGN1cnJlbnQgbW9kdWxlCitzdGF0aWMgVmFyTGlzdDo6Tm9kZSBfX29mZmxvYWRfdmFyX25vZGUgPSB7CisgICAgeyAmX19vZmZsb2FkX3Zhcl90YWJsZV9zdGFydCArIDEgfSwKKyAgICAwLCAwCit9OworCisjaWZkZWYgTVlPX1NVUFBPUlQKKworLy8gb2ZmbG9hZCBteW8gc2hhcmVkIHZhciBzZWN0aW9uIHByb2xvZworQUxMT0NBVEUoT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fU1RBUlQpCisjaWZkZWYgVEFSR0VUX1dJTk5UCitfX2RlY2xzcGVjKGFsaWduKHNpemVvZihTaGFyZWRUYWJsZUVudHJ5KSkpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCitzdGF0aWMgU2hhcmVkVGFibGVFbnRyeSBfX29mZmxvYWRfbXlvX3NoYXJlZF90YWJsZV9zdGFydCA9IHsgMCB9OworCisjaWYgSE9TVF9MSUJSQVJZCisvLyBvZmZsb2FkIG15byBzaGFyZWQgdmFyIGluaXQgc2VjdGlvbiBwcm9sb2cKK0FMTE9DQVRFKE9GRkxPQURfTVlPX1NIQVJFRF9JTklUX1RBQkxFX1NFQ1RJT05fU1RBUlQpCisjaWZkZWYgVEFSR0VUX1dJTk5UCitfX2RlY2xzcGVjKGFsaWduKHNpemVvZihJbml0VGFibGVFbnRyeSkpKQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorc3RhdGljIEluaXRUYWJsZUVudHJ5IF9fb2ZmbG9hZF9teW9fc2hhcmVkX2luaXRfdGFibGVfc3RhcnQgPSB7IDAgfTsKKyNlbmRpZgorCisvLyBvZmZsb2FkIG15byBmcHRyIHNlY3Rpb24gcHJvbG9nCitBTExPQ0FURShPRkZMT0FEX01ZT19GUFRSX1RBQkxFX1NFQ1RJT05fU1RBUlQpCisjaWZkZWYgVEFSR0VUX1dJTk5UCitfX2RlY2xzcGVjKGFsaWduKHNpemVvZihGcHRyVGFibGVFbnRyeSkpKQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorc3RhdGljIEZwdHJUYWJsZUVudHJ5IF9fb2ZmbG9hZF9teW9fZnB0cl90YWJsZV9zdGFydCA9IHsgMCB9OworCisjZW5kaWYgLy8gTVlPX1NVUFBPUlQKKworLy8gaW5pdC9maW5pIGNvZGUgd2hpY2ggYWRkcy9yZW1vdmVzIGxvY2FsIGxvb2t1cCBkYXRhIHRvL2Zyb20gdGhlIGdsb2JhbCBsaXN0CisKK3N0YXRpYyB2b2lkIG9mZmxvYWRfZmluaSgpOworCisjaWZuZGVmIFRBUkdFVF9XSU5OVAorc3RhdGljIHZvaWQgb2ZmbG9hZF9pbml0KCkgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IoMTAxKSkpOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCitzdGF0aWMgdm9pZCBvZmZsb2FkX2luaXQoKTsKKworLy8gUGxhY2Ugb2ZmbG9hZCBpbml0aWFsaXphdGlvbiBiZWZvcmUgdXNlciBjb25zdHJ1Y3RvcnMKK0FMTE9DQVRFKE9GRkxPQURfQ1JUSU5JVF9TRUNUSU9OX1NUQVJUKQorc3RhdGljIHZvaWQgKCphZGRyZXNzb2Zfb2ZmbG9hZF9pbml0KSgpID0gb2ZmbG9hZF9pbml0OworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCitzdGF0aWMgdm9pZCBvZmZsb2FkX2luaXQoKQoreworICAgIC8vIHJlZ2lzdGVyIG9mZmxvYWQgdGFibGVzCisgICAgX19vZmZsb2FkX3JlZ2lzdGVyX3RhYmxlcygmX19vZmZsb2FkX2VudHJ5X25vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX19vZmZsb2FkX2Z1bmNfbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfX29mZmxvYWRfdmFyX25vZGUpOworCisjaWYgSE9TVF9MSUJSQVJZCisgICAgX19vZmZsb2FkX3JlZ2lzdGVyX2ltYWdlKCZfX29mZmxvYWRfdGFyZ2V0X2ltYWdlKTsKKyAgICBhdGV4aXQob2ZmbG9hZF9maW5pKTsKKyNlbmRpZiAvLyBIT1NUX0xJQlJBUlkKKworI2lmZGVmIE1ZT19TVVBQT1JUCisgICAgX19vZmZsb2FkX215b1JlZ2lzdGVyVGFibGVzKAorI2lmIEhPU1RfTElCUkFSWQorICAgICAgICAmX19vZmZsb2FkX215b19zaGFyZWRfaW5pdF90YWJsZV9zdGFydCArIDEsCisjZW5kaWYgLy8gSE9TVF9MSUJSQVJZCisgICAgICAgICZfX29mZmxvYWRfbXlvX3NoYXJlZF90YWJsZV9zdGFydCArIDEsCisgICAgICAgICZfX29mZmxvYWRfbXlvX2ZwdHJfdGFibGVfc3RhcnQgKyAxCisgICAgKTsKKyNlbmRpZiAvLyBNWU9fU1VQUE9SVAorfQorCitzdGF0aWMgdm9pZCBvZmZsb2FkX2ZpbmkoKQoreworI2lmIEhPU1RfTElCUkFSWQorICAgIF9fb2ZmbG9hZF91bnJlZ2lzdGVyX2ltYWdlKCZfX29mZmxvYWRfdGFyZ2V0X2ltYWdlKTsKKyNlbmRpZiAvLyBIT1NUX0xJQlJBUlkKKworICAgIC8vIHVucmVnaXN0ZXIgb2ZmbG9hZCB0YWJsZXMKKyAgICBfX29mZmxvYWRfdW5yZWdpc3Rlcl90YWJsZXMoJl9fb2ZmbG9hZF9lbnRyeV9ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX19vZmZsb2FkX2Z1bmNfbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9fb2ZmbG9hZF92YXJfbm9kZSk7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vZmxkZW5kLmNwcCBiL2ZpbmFsL29mZmxvYWQvc3JjL29mbGRlbmQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MWZlNTkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vZmxkZW5kLmNwcApAQCAtMCwwICsxLDc3IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZiBIT1NUX0xJQlJBUlkKKyNpbmNsdWRlICJvZmZsb2FkX2hvc3QuaCIKKyNpbmNsdWRlICJvZmZsb2FkX215b19ob3N0LmgiCisjZWxzZQorI2luY2x1ZGUgIm9mZmxvYWRfdGFyZ2V0LmgiCisjaW5jbHVkZSAib2ZmbG9hZF9teW9fdGFyZ2V0LmgiCisjZW5kaWYKKworI2lmZGVmIFRBUkdFVF9XSU5OVAorI2RlZmluZSBBTExPQ0FURShuYW1lKSBfX2RlY2xzcGVjKGFsbG9jYXRlKG5hbWUpKQorI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisjZGVmaW5lIEFMTE9DQVRFKG5hbWUpIF9fYXR0cmlidXRlX18oKHNlY3Rpb24obmFtZSkpKQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisvLyBvZmZsb2FkIGVudHJ5IHRhYmxlCitBTExPQ0FURShPRkZMT0FEX0VOVFJZX1RBQkxFX1NFQ1RJT05fRU5EKQorI2lmZGVmIFRBUkdFVF9XSU5OVAorX19kZWNsc3BlYyhhbGlnbihzaXplb2YoRnVuY1RhYmxlOjpFbnRyeSkpKQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorc3RhdGljIEZ1bmNUYWJsZTo6RW50cnkgX19vZmZsb2FkX2VudHJ5X3RhYmxlX2VuZCA9IHsgKGNvbnN0IGNoYXIqKS0xIH07CisKKy8vIG9mZmxvYWQgZnVuY3Rpb24gdGFibGUKK0FMTE9DQVRFKE9GRkxPQURfRlVOQ19UQUJMRV9TRUNUSU9OX0VORCkKKyNpZmRlZiBUQVJHRVRfV0lOTlQKK19fZGVjbHNwZWMoYWxpZ24oc2l6ZW9mKEZ1bmNUYWJsZTo6RW50cnkpKSkKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKK3N0YXRpYyBGdW5jVGFibGU6OkVudHJ5IF9fb2ZmbG9hZF9mdW5jX3RhYmxlX2VuZCA9IHsgKGNvbnN0IGNoYXIqKS0xIH07CisKKy8vIGRhdGEgdGFibGUKK0FMTE9DQVRFKE9GRkxPQURfVkFSX1RBQkxFX1NFQ1RJT05fRU5EKQorI2lmZGVmIFRBUkdFVF9XSU5OVAorX19kZWNsc3BlYyhhbGlnbihzaXplb2YoVmFyVGFibGU6OkVudHJ5KSkpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCitzdGF0aWMgVmFyVGFibGU6OkVudHJ5IF9fb2ZmbG9hZF92YXJfdGFibGVfZW5kID0geyAoY29uc3QgY2hhciopLTEgfTsKKworI2lmZGVmIE1ZT19TVVBQT1JUCisKKy8vIG9mZmxvYWQgbXlvIHNoYXJlZCB2YXIgc2VjdGlvbiBlcGlsb2cKK0FMTE9DQVRFKE9GRkxPQURfTVlPX1NIQVJFRF9UQUJMRV9TRUNUSU9OX0VORCkKKyNpZmRlZiBUQVJHRVRfV0lOTlQKK19fZGVjbHNwZWMoYWxpZ24oc2l6ZW9mKFNoYXJlZFRhYmxlRW50cnkpKSkKK3N0YXRpYyBTaGFyZWRUYWJsZUVudHJ5IF9fb2ZmbG9hZF9teW9fc2hhcmVkX3RhYmxlX2VuZCA9IHsgKGNvbnN0IGNoYXIqKS0xLCAwIH07CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKK3N0YXRpYyBTaGFyZWRUYWJsZUVudHJ5IF9fb2ZmbG9hZF9teW9fc2hhcmVkX3RhYmxlX2VuZCA9IHsgMCB9OworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisjaWYgSE9TVF9MSUJSQVJZCisvLyBvZmZsb2FkIG15byBzaGFyZWQgdmFyIGluaXQgc2VjdGlvbiBlcGlsb2cKK0FMTE9DQVRFKE9GRkxPQURfTVlPX1NIQVJFRF9JTklUX1RBQkxFX1NFQ1RJT05fRU5EKQorI2lmZGVmIFRBUkdFVF9XSU5OVAorX19kZWNsc3BlYyhhbGlnbihzaXplb2YoSW5pdFRhYmxlRW50cnkpKSkKK3N0YXRpYyBJbml0VGFibGVFbnRyeSBfX29mZmxvYWRfbXlvX3NoYXJlZF9pbml0X3RhYmxlX2VuZCA9IHsgKGNvbnN0IGNoYXIqKS0xLCAwIH07CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKK3N0YXRpYyBJbml0VGFibGVFbnRyeSBfX29mZmxvYWRfbXlvX3NoYXJlZF9pbml0X3RhYmxlX2VuZCA9IHsgMCB9OworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorI2VuZGlmIC8vIEhPU1RfTElCUkFSWQorCisvLyBvZmZsb2FkIG15byBmcHRyIHNlY3Rpb24gZXBpbG9nCitBTExPQ0FURShPRkZMT0FEX01ZT19GUFRSX1RBQkxFX1NFQ1RJT05fRU5EKQorI2lmZGVmIFRBUkdFVF9XSU5OVAorX19kZWNsc3BlYyhhbGlnbihzaXplb2YoRnB0clRhYmxlRW50cnkpKSkKK3N0YXRpYyBGcHRyVGFibGVFbnRyeSBfX29mZmxvYWRfbXlvX2ZwdHJfdGFibGVfZW5kID0geyAoY29uc3QgY2hhciopLTEsIDAsIDAgfTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorc3RhdGljIEZwdHJUYWJsZUVudHJ5IF9fb2ZmbG9hZF9teW9fZnB0cl90YWJsZV9lbmQgPSB7IDAgfTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworI2VuZGlmIC8vIE1ZT19TVVBQT1JUCmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy9vcnNsLWxpdGUvaW5jbHVkZS9vcnNsLWxpdGUuaCBiL2ZpbmFsL29mZmxvYWQvc3JjL29yc2wtbGl0ZS9pbmNsdWRlL29yc2wtbGl0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNmEzMzUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vcnNsLWxpdGUvaW5jbHVkZS9vcnNsLWxpdGUuaApAQCAtMCwwICsxLDIyMSBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIF9PUlNMX0xJVEVfSF8KKyNkZWZpbmUgX09SU0xfTElURV9IXworCisjaWZuZGVmIFRBUkdFVF9XSU5OVAorI2luY2x1ZGUgPHNjaGVkLmg+CisjZWxzZQorI2RlZmluZSBjcHVfc2V0X3QgaW50CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiogVHlwZSBvZiBhIE9SU0xCdXN5U2V0ICovCit0eXBlZGVmIGVudW0gT1JTTEJ1c3lTZXRUeXBlIHsKKyAgICBCVVNZX1NFVF9FTVBUWSA9IDAsICAgICAvKio8IEVtcHR5IHNldCAqLworICAgIEJVU1lfU0VUX1BBUlRJQUwgPSAxLCAgIC8qKjwgTm9uLWVtcHR5IHNldCB0aGF0IG9taXRzIHNvbWUgdGhyZWFkcyAqLworICAgIEJVU1lfU0VUX0ZVTEwgPSAyICAgICAgIC8qKjwgQSBzZXQgdGhhdCBpbmNsdWRlcyBhbGwgdGhyZWFkcyBvbiB0aGUgY2FyZCAqLworfSBCdXN5U2V0VHlwZTsKKworLyoqIE9SU0xCdXN5U2V0IGVuY2Fwc3VsYXRpb24gKi8KK3R5cGVkZWYgc3RydWN0IE9SU0xCdXN5U2V0IHsKKyAgICBCdXN5U2V0VHlwZSB0eXBlOyAgIC8qKjwgU2V0IHR5cGUgKi8KKyNpZmRlZiBfX2xpbnV4X18KKyAgICBjcHVfc2V0X3QgY3B1X3NldDsgIC8qKjwgQ1BVIG1hc2sgKHVudXNlZCBmb3IgQlVTWV9TRVRfRU1QVFkgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCVVNZX1NFVF9QQVJUSUFMIHNldHMpIHJlcHJlc2VudGVkIGJ5IHRoZSBzdGFuZGFyZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTGludXggQ1BVIHNldCB0eXBlIC0tIGNwdV9zZXRfdC4gVGhyZWFkcyBhcmUgbnVtYmVyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nIGZyb20gMC4gVGhlIG1heGltYWwgcG9zc2libGUgdGhyZWFkIG51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgc3lzdGVtLXNwZWNpZmljLiBTZWUgQ1BVX1NFVCgzKSBmYW1pbHkgb2YgbWFjcm9zCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbW9yZSBkZXRhaWxzLiBVbnVzZWQgaW4gT1JTTCBMaXRlLiAqLworI2VuZGlmCit9IE9SU0xCdXN5U2V0OworCisvKiogQ2xpZW50IHRhZyAqLwordHlwZWRlZiBjaGFyKiBPUlNMVGFnOworCisvKiogTWF4aW1hbCBsZW5ndGggb2YgdGFnIGluIGNoYXJhY3RlcnMgKi8KKyNkZWZpbmUgT1JTTF9NQVhfVEFHX0xFTiAxMjgKKworLyoqIE1heGltYWwgbnVtYmVyIG9mIGNhcmRzIHRoYXQgY2FuIGJlIG1hbmFnZWQgYnkgT1JTTCAqLworI2RlZmluZSBPUlNMX01BWF9DQVJEUyAzMgorCisvKiogUmVzZXJ2ZXMgY29tcHV0YXRpb25hbCByZXNvdXJjZXMgb24gYSBzZXQgb2YgY2FyZHMuIEJsb2Nrcy4KKyAqCisgKiBJZiBhbnkgb2YgdGhlIHJlc291cmNlcyBjYW5ub3QgYmUgcmVzZXJ2ZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCBibG9jayB1bnRpbAorICogdGhleSBiZWNvbWUgYXZhaWxhYmxlLiBSZXNlcnZhdGlvbiBjYW4gYmUgcmVjdXJzaXZlIGlmIHBlcmZvcm1lZCBieSB0aGUKKyAqIHNhbWUgdGFnLiBBIHJlY3Vyc2l2ZWx5IHJlc2VydmVkIHJlc291cmNlIG11c3QgYmUgcmVsZWFzZWQgdGhlIHNhbWUgbnVtYmVyCisgKiBvZiB0aW1lcyBpdCB3YXMgcmVzZXJ2ZWQuCisgKgorICogQHNlZSBPUlNMVHJ5UmVzZXJ2ZQorICoKKyAqIEBwYXJhbVtpbl0gIG4gICAgICBOdW1iZXIgb2YgY2FyZHMgdG8gcmVzZXJ2ZSByZXNvdXJjZXMgb24uIENhbm5vdCBiZSA8IDAKKyAqICAgICAgICAgICAgICAgICAgICBvciA+IE9SU0xfTUFYX0NBUkRTLgorICoKKyAqIEBwYXJhbVtpbl0gIGluZHMgICBJbmRpY2VzIG9mIHRoZSBjYXJkczogYW4gaW50ZWdlciBhcnJheSB3aXRoIG4gZWxlbWVudHMuCisgKiAgICAgICAgICAgICAgICAgICAgQ2Fubm90IGJlIE5VTEwgaWYgbiA+IDAuIFZhbGlkIGNhcmQgaW5kaWNlcyBhcmUgZnJvbSAwCisgKiAgICAgICAgICAgICAgICAgICAgdG8gT1JTTF9NQVhfQ0FSRFMtMS4gQ2Fubm90IGNvbnRhaW4gZHVwbGljYXRlIGVsZW1lbnRzLgorICoKKyAqIEBwYXJhbVtpbl0gIGJzZXRzICBSZXF1ZXN0ZWQgcmVzb3VyY2VzIG9uIGVhY2ggb2YgdGhlIGNhcmQuIENhbm5vdCBiZSBOVUxMCisgKiAgICAgICAgICAgICAgICAgICAgaWYgbiA+IDAuCisgKgorICogQHBhcmFtW2luXSAgdGFnICAgIE9SU0xUYWcgb2YgdGhlIGNhbGxpbmcgY2xpZW50LiBDYW5ub3QgYmUgTlVMTC4gTGVuZ3RoCisgKiAgICAgICAgICAgICAgICAgICAgbXVzdCBub3QgZXhlZWQgT1JTTF9NQVhfVEFHX0xFTi4KKyAqCisgKiBAcmV0dXJucyAgICAwICAgICAgaWYgdGhlIHJlc291cmNlcyB3ZXJlIHN1Y2Nlc3NmdWxseSByZXNlcnZlZAorICoKKyAqIEByZXR1cm5zICAgIEVJTlZBTCBpZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBpcyBpbnZhbGlkCisgKgorICogQHJldHVybnMgICAgRUFHQUlOIGxpbWl0IG9mIHJlY3Vyc2l2ZSByZXNlcnZhdGlvbnMgcmVhY2hlZAorICogICAgICAgICAgICAgICAgICAgIChub3QgaW4gT1JTTCBMaXRlKQorICoKKyAqIEByZXR1cm5zICAgIEVOT1NZUyAoaW4gT1JTTCBMaXRlKSBpZiB0eXBlIG9mIGFueSBvZiB0aGUgYnVzeSBzZXRzIGlzCisgKiAgICAgICAgICAgICAgICAgICAgZXF1YWwgdG8gQlVTWV9TRVRfUEFSVElBTAorICovCitpbnQgT1JTTFJlc2VydmUoY29uc3QgaW50IG4sIGNvbnN0IGludCAqX19yZXN0cmljdCBpbmRzLAorICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xCdXN5U2V0ICpfX3Jlc3RyaWN0IGJzZXRzLAorICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xUYWcgX19yZXN0cmljdCB0YWcpOworCisvKiogUmVzZXJ2ZXMgY29tcHV0YXRpb25hbCByZXNvdXJjZXMgb24gYSBzZXQgb2YgY2FyZHMuIERvZXMgbm90IGJsb2NrLgorICoKKyAqIElmIGFueSBvZiB0aGUgcmVzb3VyY2VzIGNhbm5vdCBiZSByZXNlcnZlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybgorICogaW1tZWRpYXRlbHkuIFJlc2VydmF0aW9uIGNhbiBiZSByZWN1cnNpdmUgaWYgcGVyZm9ybWVkIGJ5IHRoZSBzYW1lIHRhZy4KKyAqIEEgcmVjdXJzaXZlbHkgcmVzZXJ2ZWQgcmVzb3VyY2UgbXVzdCBiZSByZWxlYXNlZCB0aGUgc2FtZSBudW1iZXIgb2YgdGltZXMKKyAqIGl0IHdhcyByZXNlcnZlZC4KKyAqCisgKiBAc2VlIE9SU0xSZXNlcnZlCisgKgorICogQHBhcmFtW2luXSAgbiAgICAgIE51bWJlciBvZiBjYXJkcyB0byByZXNlcnZlIHJlc291cmNlcyBvbi4gQ2Fubm90IGJlIDwgMAorICogICAgICAgICAgICAgICAgICAgIG9yID4gT1JTTF9NQVhfQ0FSRFMuCisgKgorICogQHBhcmFtW2luXSAgaW5kcyAgICAgSW5kaWNlcyBvZiB0aGUgY2FyZHM6IGFuIGludGVnZXIgYXJyYXkgd2l0aCBuIGVsZW1lbnRzLgorICogICAgICAgICAgICAgICAgICAgICAgQ2Fubm90IGJlIE5VTEwgaWYgbiA+IDAuIFZhbGlkIGNhcmQgaW5kaWNlcyBhcmUgZnJvbSAwCisgKiAgICAgICAgICAgICAgICAgICAgICB0byBPUlNMX01BWF9DQVJEUy0xLiBDYW5ub3QgY29udGFpbiBkdXBsaWNhdGUgZWxlbWVudHMuCisgKgorICogQHBhcmFtW2lub3V0XSBic2V0cyAgUmVxdWVzdGVkIHJlc291cmNlcyBvbiBlYWNoIG9mIHRoZSBjYXJkLiBDYW5ub3QgYmUKKyAqICAgICAgICAgICAgICAgICAgICAgIE5VTEwgaWYgbiA+IDAuCisgKgorICogQHBhcmFtW2luXSAgICB0YWcgICAgT1JTTFRhZyBvZiB0aGUgY2FsbGluZyBjbGllbnQuIENhbm5vdCBiZSBOVUxMLiBMZW5ndGgKKyAqICAgICAgICAgICAgICAgICAgICAgIG11c3Qgbm90IGV4Y2VlZCBPUlNMX01BWF9UQUdfTEVOLgorICoKKyAqIEByZXR1cm5zICAgICAgMCAgICAgIGlmIHRoZSByZXNvdXJjZXMgd2VyZSBzdWNjZXNzZnVsbHkgcmVzZXJ2ZWQKKyAqCisgKiBAcmV0dXJucyAgICAgIEVCVVNZICBpZiBzb21lIG9mIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2VzIGFyZSBidXN5CisgKgorICogQHJldHVybnMgICAgICBFSU5WQUwgaWYgYW55IG9mIHRoZSBhcmd1bWVudHMgaXMgaW52YWxpZAorICoKKyAqIEByZXR1cm5zICAgICAgRUFHQUlOIGxpbWl0IG9mIHJlY3Vyc2l2ZSByZXNlcnZhdGlvbnMgcmVhY2hlZAorICogICAgICAgICAgICAgICAgICAgICAgKG5vdCBpbiBPUlNMIExpdGUpCisgKgorICogQHJldHVybnMgICAgICBFTk9TWVMgKGluIE9SU0wgTGl0ZSkgaWYgdHlwZSBvZiBhbnkgb2YgdGhlIGJ1c3kgc2V0cyBpcworICogICAgICAgICAgICAgICAgICAgICAgZXF1YWwgdG8gQlVTWV9TRVRfUEFSVElBTAorICovCitpbnQgT1JTTFRyeVJlc2VydmUoY29uc3QgaW50IG4sIGNvbnN0IGludCAqX19yZXN0cmljdCBpbmRzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xCdXN5U2V0ICpfX3Jlc3RyaWN0IGJzZXRzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xUYWcgX19yZXN0cmljdCB0YWcpOworCisvKiogR3JhbnVsYXJpZnkgb2YgcGFydGlhbCByZXNlcnZhdGlvbiAqLwordHlwZWRlZiBlbnVtIE9SU0xQYXJ0aWFsR3JhbnVsYXJpdHkgeworICAgIEdSQU5fQ0FSRCA9IDAsIC8qKjwgQ2FyZCBncmFudWxhcml0eSAqLworICAgIEdSQU5fVEhSRUFEID0gMSAvKio8IFRocmVhZCBncmFudWxhcml0eSAqLworfSBPUlNMUGFydGlhbEdyYW51bGFyaXR5OworCisvKiogUmVxdWVzdHMgcmVzZXJ2YXRpb24gb2Ygc29tZSBvZiBjb21wdXRhdGlvbmFsIHJlc291cmNlcyBvbiBhIHNldCBvZiBjYXJkcy4KKyAqIERvZXMgbm90IGJsb2NrLiBVcGRhdGVzIHVzZXItcHJvdmlkZWQgYnNldHMgdG8gaW5kaWNhdGUgd2hpY2ggcmVzb3VyY2VzCisgKiB3ZXJlIHJlc2VydmVkLgorICoKKyAqIElmIGFueSBvZiB0aGUgcmVzb3VyY2VzIGNhbm5vdCBiZSByZXNlcnZlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIHVwZGF0ZSBidXN5CisgKiBzZXRzIHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXIgdG8gcmVmbGVjdCB3aGF0IHJlc291cmNlcyB3ZXJlIGFjdHVhbGx5CisgKiByZXNlcnZlZC4gVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyB0d28gZ3JhbnVsYXJpdHkgbW9kZXM6ICdjYXJkJyBhbmQKKyAqICd0aHJlYWQnLiAgV2hlbiBncmFudWxhcml0eSBpcyBzZXQgdG8gJ2NhcmQnLCBhIGZhaWx1cmUgdG8gcmVzZXJ2ZSBhIHRocmVhZAorICogb24gdGhlIGNhcmQgd2lsbCBpbXBseSB0aGF0IHJlc2VydmF0aW9uIGhhcyBmYWlsZWQgZm9yIHRoZSB3aG9sZSBjYXJkLiBXaGVuCisgKiBncmFudWxhcml0eSBpcyBzZXQgdG8gJ3RocmVhZCcsIHJlc2VydmF0aW9uIG9uIGEgY2FyZCB3aWxsIGJlIGNvbnNpZGVyZWQKKyAqIHN1Y2Nlc3NmdWwgYXMgbG9uZyBhcyBhdCBsZWFzdCBvbmUgdGhyZWFkIG9uIHRoZSBjYXJkIHdhcyBzdWNjZXNzZnVsbHkKKyAqIHJlc2VydmVkLiBSZXNlcnZhdGlvbiBjYW4gYmUgcmVjdXJzaXZlIGlmIHBlcmZvcm1lZCBieSB0aGUgc2FtZSB0YWcuIEEKKyAqIHJlY3Vyc2l2ZWx5IHJlc2VydmVkIHJlc291cmNlIG11c3QgYmUgcmVsZWFzZWQgdGhlIHNhbWUgbnVtYmVyIG9mIHRpbWVzIGl0CisgKiB3YXMgcmVzZXJ2ZWQuCisgKgorICogQHBhcmFtW2luXSAgZ3JhbiAgIFJlc2VydmF0aW9uIGdyYW51bGFyaXR5CisgKgorICogQHBhcmFtW2luXSAgbiAgICAgIE51bWJlciBvZiBjYXJkcyB0byByZXNlcnZlIHJlc291cmNlcyBvbi4gQ2Fubm90IGJlIDwgMAorICogICAgICAgICAgICAgICAgICAgIG9yID4gT1JTTF9NQVhfQ0FSRFMuCisgKgorICogQHBhcmFtW2luXSAgaW5kcyAgIEluZGljZXMgb2YgdGhlIGNhcmRzOiBhbiBpbnRlZ2VyIGFycmF5IHdpdGggbiBlbGVtZW50cy4KKyAqICAgICAgICAgICAgICAgICAgICBDYW5ub3QgYmUgTlVMTCBpZiBuID4gMC4gVmFsaWQgY2FyZCBpbmRpY2VzIGFyZSBmcm9tIDAKKyAqICAgICAgICAgICAgICAgICAgICB0byBPUlNMX01BWF9DQVJEUy0xLiBDYW5ub3QgY29udGFpbiBkdXBsaWNhdGUgZWxlbWVudHMuCisgKgorICogQHBhcmFtW2luXSAgYnNldHMgIFJlcXVlc3RlZCByZXNvdXJjZXMgb24gZWFjaCBvZiB0aGUgY2FyZC4gQ2Fubm90IGJlIE5VTEwKKyAqICAgICAgICAgICAgICAgICAgICBpZiBuID4gMC4KKyAqCisgKiBAcGFyYW1baW5dICB0YWcgICAgT1JTTFRhZyBvZiB0aGUgY2FsbGluZyBjbGllbnQuIENhbm5vdCBiZSBOVUxMLiBMZW5ndGgKKyAqICAgICAgICAgICAgICAgICAgICBtdXN0IG5vdCBleGNlZWQgT1JTTF9NQVhfVEFHX0xFTi4KKyAqCisgKiBAcmV0dXJucyAgICAwICAgICAgaWYgYXQgbGVhc3Qgc29tZSBvZiB0aGUgcmVzb3VyY2VzIHdlcmUgc3VjY2Vzc2Z1bGx5CisgKiAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQKKyAqCisgKiBAcmV0dXJucyAgICBFQlVTWSAgaWYgYWxsIG9mIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2VzIGFyZSBidXN5CisgKgorICogQHJldHVybnMgICAgRUlOVkFMIGlmIGFueSBvZiB0aGUgYXJndW1lbnRzIGlzIGludmFsaWQKKyAqCisgKiBAcmV0dXJucyAgICBFQUdBSU4gbGltaXQgb2YgcmVjdXJzaXZlIHJlc2VydmF0aW9ucyByZWFjaGVkCisgKiAgICAgICAgICAgICAgICAgICAgKG5vdCBpbiBPUlNMIExpdGUpCisgKgorICogQHJldHVybnMgICAgRU5PU1lTIChpbiBPUlNMIExpdGUpIGlmIHR5cGUgb2YgYW55IG9mIHRoZSBidXN5IHNldHMgaXMKKyAqICAgICAgICAgICAgICAgICAgICBlcXVhbCB0byBCVVNZX1NFVF9QQVJUSUFMCisgKi8KK2ludCBPUlNMUmVzZXJ2ZVBhcnRpYWwoY29uc3QgT1JTTFBhcnRpYWxHcmFudWxhcml0eSBncmFuLCBjb25zdCBpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICpfX3Jlc3RyaWN0IGluZHMsCisgICAgICAgICAgICAgICAgICAgICAgIE9SU0xCdXN5U2V0ICpfX3Jlc3RyaWN0IGJzZXRzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUlNMVGFnIF9fcmVzdHJpY3QgdGFnKTsKKworLyoqIFJlbGVhc2VzIHByZXZpb3VzbHkgcmVzZXJ2ZWQgY29tcHV0YXRpb25hbCByZXNvdXJjZXMgb24gYSBzZXQgb2YgY2FyZHMuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGZhaWwgaWYgYW55IG9mIHRoZSByZXNvdXJjZXMgdG8gYmUgcmVsZWFzZWQgd2VyZSBub3QKKyAqIHJlc2VydmVkIGJ5IHRoZSBjYWxsaW5nIGNsaWVudC4KKyAqCisgKiBAc2VlIE9SU0xSZXNlcnZlCisgKiBAc2VlIE9SU0xUcnlSZXNlcnZlCisgKiBAc2VlIE9SU0xSZXNlcnZlUGFydGlhbAorICoKKyAqIEBwYXJhbVtpbl0gIG4gICAgICBOdW1iZXIgb2YgY2FyZHMgdG8gcmVzZXJ2ZSByZXNvdXJjZXMgb24uIENhbm5vdCBiZSA8IDAKKyAqICAgICAgICAgICAgICAgICAgICBvciA+IE9SU0xfTUFYX0NBUkRTLgorICoKKyAqIEBwYXJhbVtpbl0gIGluZHMgICBJbmRpY2VzIG9mIHRoZSBjYXJkczogYW4gaW50ZWdlciBhcnJheSB3aXRoIG4gZWxlbWVudHMuCisgKiAgICAgICAgICAgICAgICAgICAgQ2Fubm90IGJlIE5VTEwgaWYgbiA+IDAuIFZhbGlkIGNhcmQgaW5kaWNlcyBhcmUgZnJvbSAwCisgKiAgICAgICAgICAgICAgICAgICAgdG8gT1JTTF9NQVhfQ0FSRFMtMS4gQ2Fubm90IGNvbnRhaW4gZHVwbGljYXRlIGVsZW1lbnRzLgorICoKKyAqIEBwYXJhbVtpbl0gIGJzZXRzICBSZXF1ZXN0ZWQgcmVzb3VyY2VzIG9uIGVhY2ggb2YgdGhlIGNhcmQuIENhbm5vdCBiZSBOVUxMCisgKiAgICAgICAgICAgICAgICAgICAgaWYgbiA+IDAuCisgKgorICogQHBhcmFtW2luXSAgdGFnICAgIE9SU0xUYWcgb2YgdGhlIGNhbGxpbmcgY2xpZW50LiBDYW5ub3QgYmUgTlVMTC4gTGVuZ3RoCisgKiAgICAgICAgICAgICAgICAgICAgbXVzdCBub3QgZXhjZWVkIE9SU0xfTUFYX1RBR19MRU4uCisgKgorICogQHJldHVybnMgICAgMCAgICAgIGlmIHRoZSByZXNvdXJjZXMgd2VyZSBzdWNjZXNzZnVsbHkgcmVsZWFzZWQKKyAqCisgKiBAcmV0dXJucyAgICBFSU5WQUwgaWYgYW55IG9mIHRoZSBhcmd1bWVudHMgaXMgaW52YWxpZAorICoKKyAqIEByZXR1cm5zICAgIEVQRVJNICB0aGUgY2FsbGluZyBjbGllbnQgZGlkIG5vdCByZXNlcnZlIHNvbWUgb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzIGl0IGlzIHRyeWluZyB0byByZWxlYXNlLgorICoKKyAqIEByZXR1cm5zICAgIEVOT1NZUyAoaW4gT1JTTCBMaXRlKSBpZiB0eXBlIG9mIGFueSBvZiB0aGUgYnVzeSBzZXRzIGlzCisgKiAgICAgICAgICAgICAgICAgICAgZXF1YWwgdG8gQlVTWV9TRVRfUEFSVElBTAorICovCitpbnQgT1JTTFJlbGVhc2UoY29uc3QgaW50IG4sIGNvbnN0IGludCAqX19yZXN0cmljdCBpbmRzLAorICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xCdXN5U2V0ICpfX3Jlc3RyaWN0IGJzZXRzLAorICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xUYWcgX19yZXN0cmljdCB0YWcpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZpbmFsL29mZmxvYWQvc3JjL29yc2wtbGl0ZS9saWIvb3JzbC1saXRlLmMgYi9maW5hbC9vZmZsb2FkL3NyYy9vcnNsLWxpdGUvbGliL29yc2wtbGl0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMWNkYTcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vcnNsLWxpdGUvbGliL29yc2wtbGl0ZS5jCkBAIC0wLDAgKzEsMzM3IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSAib3JzbC1saXRlL2luY2x1ZGUvb3JzbC1saXRlLmgiCisKKyNkZWZpbmUgRElTQUJMRV9TWU1CT0xfVkVSU0lPTklORworCisjaWYgZGVmaW5lZChfX2xpbnV4X18pICYmICFkZWZpbmVkKERJU0FCTEVfU1lNQk9MX1ZFUlNJT05JTkcpCisjZGVmaW5lIHN5bXZlcihzcmMsIHRndCwgdmVyc3RyKSBfX2FzbV9fKCIuc3ltdmVyICIgI3NyYyAiLCIgI3RndCB2ZXJzdHIpCitzeW12ZXIoT1JTTFJlc2VydmUwLCBPUlNMUmVzZXJ2ZSwgIkBAT1JTTF8wLjAiKTsKK3N5bXZlcihPUlNMVHJ5UmVzZXJ2ZTAsIE9SU0xUcnlSZXNlcnZlLCAiQEBPUlNMXzAuMCIpOworc3ltdmVyKE9SU0xSZXNlcnZlUGFydGlhbDAsIE9SU0xSZXNlcnZlUGFydGlhbCwgIkBAT1JTTF8wLjAiKTsKK3N5bXZlcihPUlNMUmVsZWFzZTAsIE9SU0xSZWxlYXNlLCAiQEBPUlNMXzAuMCIpOworI2Vsc2UKKyNkZWZpbmUgT1JTTFJlc2VydmUwIE9SU0xSZXNlcnZlCisjZGVmaW5lIE9SU0xUcnlSZXNlcnZlMCBPUlNMVHJ5UmVzZXJ2ZQorI2RlZmluZSBPUlNMUmVzZXJ2ZVBhcnRpYWwwIE9SU0xSZXNlcnZlUGFydGlhbAorI2RlZmluZSBPUlNMUmVsZWFzZTAgT1JTTFJlbGVhc2UKKyNlbmRpZgorCisjaWZkZWYgX19saW51eF9fCisjaW5jbHVkZSA8cHRocmVhZC5oPgorc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBnbG9iYWxfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworc3RhdGljIHB0aHJlYWRfY29uZF90IHJlbGVhc2VfY29uZCA9IFBUSFJFQURfQ09ORF9JTklUSUFMSVpFUjsKKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8d2luZG93cy5oPgorI3ByYWdtYSBpbnRyaW5zaWMoX1JlYWRXcml0ZUJhcnJpZXIpCitzdGF0aWMgU1JXTE9DSyBnbG9iYWxfbXV0ZXggPSBTUldMT0NLX0lOSVQ7CitzdGF0aWMgdm9sYXRpbGUgaW50IHJlbGVhc2VfY29uZF9pbml0aWFsaXplZCA9IDA7CitzdGF0aWMgQ09ORElUSU9OX1ZBUklBQkxFIHJlbGVhc2VfY29uZDsKKworc3RhdGljIHZvaWQgc3RhdGVfbGF6eV9pbml0X3N5bmMoKQoreworICAgIGlmICghcmVsZWFzZV9jb25kX2luaXRpYWxpemVkKSB7CisgICAgICAgIEFjcXVpcmVTUldMb2NrRXhjbHVzaXZlKCZnbG9iYWxfbXV0ZXgpOworICAgICAgICBfUmVhZFdyaXRlQmFycmllcigpOworICAgICAgICBpZiAoIXJlbGVhc2VfY29uZF9pbml0aWFsaXplZCkgeworICAgICAgICAgICAgSW5pdGlhbGl6ZUNvbmRpdGlvblZhcmlhYmxlKCZyZWxlYXNlX2NvbmQpOworICAgICAgICAgICAgcmVsZWFzZV9jb25kX2luaXRpYWxpemVkID0gMTsKKyAgICAgICAgfQorICAgICAgICBSZWxlYXNlU1JXTG9ja0V4Y2x1c2l2ZSgmZ2xvYmFsX211dGV4KTsKKyAgICB9Cit9CisjZW5kaWYKKworc3RhdGljIGludCBzdGF0ZV9sb2NrKCkKK3sKKyNpZmRlZiBfX2xpbnV4X18KKyAgICByZXR1cm4gcHRocmVhZF9tdXRleF9sb2NrKCZnbG9iYWxfbXV0ZXgpOworI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKKyAgICBBY3F1aXJlU1JXTG9ja0V4Y2x1c2l2ZSgmZ2xvYmFsX211dGV4KTsKKyAgICByZXR1cm4gMDsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IHN0YXRlX3VubG9jaygpCit7CisjaWZkZWYgX19saW51eF9fCisgICAgcmV0dXJuIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnbG9iYWxfbXV0ZXgpOworI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKKyAgICBSZWxlYXNlU1JXTG9ja0V4Y2x1c2l2ZSgmZ2xvYmFsX211dGV4KTsKKyAgICByZXR1cm4gMDsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IHN0YXRlX3dhaXRfZm9yX3JlbGVhc2UoKQoreworI2lmZGVmIF9fbGludXhfXworICAgIHJldHVybiBwdGhyZWFkX2NvbmRfd2FpdCgmcmVsZWFzZV9jb25kLCAmZ2xvYmFsX211dGV4KTsKKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCisgICAgcmV0dXJuIFNsZWVwQ29uZGl0aW9uVmFyaWFibGVTUlcoJnJlbGVhc2VfY29uZCwKKyAgICAgICAgICAgICZnbG9iYWxfbXV0ZXgsIElORklOSVRFLCAwKSA9PSAwID8gMSA6IDA7CisjZW5kaWYKK30KKworc3RhdGljIGludCBzdGF0ZV9zaWduYWxfcmVsZWFzZSgpCit7CisjaWZkZWYgX19saW51eF9fCisgICAgcmV0dXJuIHB0aHJlYWRfY29uZF9zaWduYWwoJnJlbGVhc2VfY29uZCk7CisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorICAgIFdha2VDb25kaXRpb25WYXJpYWJsZSgmcmVsZWFzZV9jb25kKTsKKyAgICByZXR1cm4gMDsKKyNlbmRpZgorfQorCitzdGF0aWMgc3RydWN0IHsKKyAgICBjaGFyIG93bmVyW09SU0xfTUFYX1RBR19MRU4gKyAxXTsKKyAgICB1bnNpZ25lZCBsb25nIHJzcnZfY250OworfSByc3J2X2RhdGFbT1JTTF9NQVhfQ0FSRFNdOworCitzdGF0aWMgaW50IGNoZWNrX2FyZ3MoY29uc3QgaW50IG4sIGNvbnN0IGludCAqX19yZXN0cmljdCBpbmRzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xCdXN5U2V0ICpfX3Jlc3RyaWN0IGJzZXRzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xUYWcgX19yZXN0cmljdCB0YWcpCit7CisgICAgaW50IGk7CisgICAgaW50IGNhcmRfc3BlY2lmaWVkW09SU0xfTUFYX0NBUkRTXTsKKyAgICBpZiAodGFnID09IE5VTEwpIHJldHVybiAtMTsKKyAgICBpZiAoc3RybGVuKChjaGFyICopdGFnKSA+IE9SU0xfTUFYX1RBR19MRU4pIHJldHVybiAtMTsKKyAgICBpZiAobiA8IDAgfHwgbiA+PSBPUlNMX01BWF9DQVJEUykgcmV0dXJuIC0xOworICAgIGlmIChuICE9IDAgJiYgKGluZHMgPT0gTlVMTCB8fCBic2V0cyA9PSBOVUxMKSkgcmV0dXJuIC0xOworICAgIGZvciAoaSA9IDA7IGkgPCBPUlNMX01BWF9DQVJEUzsgaSsrKQorICAgICAgICBjYXJkX3NwZWNpZmllZFtpXSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBpbnQgaW5kID0gaW5kc1tpXTsKKyAgICAgICAgaWYgKGluZCA8IDAgfHwgaW5kID49IE9SU0xfTUFYX0NBUkRTKSByZXR1cm4gLTE7CisgICAgICAgIGlmIChjYXJkX3NwZWNpZmllZFtpbmRdKSByZXR1cm4gLTE7CisgICAgICAgIGNhcmRfc3BlY2lmaWVkW2luZF0gPSAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGVja19ic2V0cyhjb25zdCBpbnQgbiwgY29uc3QgT1JTTEJ1c3lTZXQgKmJzZXRzKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgIGlmIChic2V0c1tpXS50eXBlID09IEJVU1lfU0VUX1BBUlRJQUwpIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYW5fcmVzZXJ2ZV9jYXJkKGludCBjYXJkLCBjb25zdCBPUlNMQnVzeVNldCAqX19yZXN0cmljdCBic2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xUYWcgX19yZXN0cmljdCB0YWcpCit7CisgICAgYXNzZXJ0KHRhZyAhPSBOVUxMKTsKKyAgICBhc3NlcnQoYnNldCAhPSBOVUxMKTsKKyAgICBhc3NlcnQoc3RybGVuKChjaGFyICopdGFnKSA8IE9SU0xfTUFYX1RBR19MRU4pOworICAgIGFzc2VydChic2V0LT50eXBlICE9IEJVU1lfU0VUX1BBUlRJQUwpOworCisgICAgcmV0dXJuIChic2V0LT50eXBlID09IEJVU1lfU0VUX0VNUFRZIHx8CisgICAgICAgICAgICAoKHJzcnZfZGF0YVtjYXJkXS5yc3J2X2NudCA9PSAwIHx8CisgICAgICAgICAgICBzdHJuY21wKChjaGFyICopdGFnLAorICAgICAgICAgICAgICAgIHJzcnZfZGF0YVtjYXJkXS5vd25lciwgT1JTTF9NQVhfVEFHX0xFTikgPT0gMCkgJiYKKyAgICAgICAgICAgIHJzcnZfZGF0YVtjYXJkXS5yc3J2X2NudCA8IFVMT05HX01BWCkpID8gMCA6IC0gMTsKK30KKworc3RhdGljIHZvaWQgcmVzZXJ2ZV9jYXJkKGludCBjYXJkLCBjb25zdCBPUlNMQnVzeVNldCAqX19yZXN0cmljdCBic2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xUYWcgX19yZXN0cmljdCB0YWcpCit7CisgICAgYXNzZXJ0KHRhZyAhPSBOVUxMKTsKKyAgICBhc3NlcnQoYnNldCAhPSBOVUxMKTsKKyAgICBhc3NlcnQoc3RybGVuKChjaGFyICopdGFnKSA8IE9SU0xfTUFYX1RBR19MRU4pOworICAgIGFzc2VydChic2V0LT50eXBlICE9IEJVU1lfU0VUX1BBUlRJQUwpOworCisgICAgaWYgKGJzZXQtPnR5cGUgPT0gQlVTWV9TRVRfRU1QVFkpCisgICAgICAgIHJldHVybjsKKworICAgIGFzc2VydChyc3J2X2RhdGFbY2FyZF0ucnNydl9jbnQgPT0gMCB8fAorICAgICAgICAgICAgc3RybmNtcCgoY2hhciAqKXRhZywKKyAgICAgICAgICAgICAgICByc3J2X2RhdGFbY2FyZF0ub3duZXIsIE9SU0xfTUFYX1RBR19MRU4pID09IDApOworICAgIGFzc2VydChyc3J2X2RhdGFbY2FyZF0ucnNydl9jbnQgPCBVTE9OR19NQVgpOworCisgICAgaWYgKHJzcnZfZGF0YVtjYXJkXS5yc3J2X2NudCA9PSAwKQorICAgICAgICBzdHJuY3B5KHJzcnZfZGF0YVtjYXJkXS5vd25lciwgKGNoYXIgKil0YWcsIE9SU0xfTUFYX1RBR19MRU4pOworICAgIHJzcnZfZGF0YVtjYXJkXS5vd25lcltPUlNMX01BWF9UQUdfTEVOXSA9ICdcMCc7CisgICAgcnNydl9kYXRhW2NhcmRdLnJzcnZfY250Kys7Cit9CisKK3N0YXRpYyBpbnQgY2FuX3JlbGVhc2VfY2FyZChpbnQgY2FyZCwgY29uc3QgT1JTTEJ1c3lTZXQgKl9fcmVzdHJpY3QgYnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUlNMVGFnIF9fcmVzdHJpY3QgdGFnKQoreworICAgIGFzc2VydCh0YWcgIT0gTlVMTCk7CisgICAgYXNzZXJ0KGJzZXQgIT0gTlVMTCk7CisgICAgYXNzZXJ0KHN0cmxlbigoY2hhciAqKXRhZykgPCBPUlNMX01BWF9UQUdfTEVOKTsKKyAgICBhc3NlcnQoYnNldC0+dHlwZSAhPSBCVVNZX1NFVF9QQVJUSUFMKTsKKworICAgIHJldHVybiAoYnNldC0+dHlwZSA9PSBCVVNZX1NFVF9FTVBUWSB8fCAocnNydl9kYXRhW2NhcmRdLnJzcnZfY250ID4gMCAmJgorICAgICAgICAgICAgICAgIHN0cm5jbXAoKGNoYXIgKil0YWcsCisgICAgICAgICAgICAgICAgICAgIHJzcnZfZGF0YVtjYXJkXS5vd25lciwgT1JTTF9NQVhfVEFHX0xFTikgPT0gMCkpID8gMCA6IDE7Cit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfY2FyZChpbnQgY2FyZCwgY29uc3QgT1JTTEJ1c3lTZXQgKl9fcmVzdHJpY3QgYnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUlNMVGFnIF9fcmVzdHJpY3QgdGFnKQoreworICAgIGFzc2VydCh0YWcgIT0gTlVMTCk7CisgICAgYXNzZXJ0KGJzZXQgIT0gTlVMTCk7CisgICAgYXNzZXJ0KHN0cmxlbigoY2hhciAqKXRhZykgPCBPUlNMX01BWF9UQUdfTEVOKTsKKyAgICBhc3NlcnQoYnNldC0+dHlwZSAhPSBCVVNZX1NFVF9QQVJUSUFMKTsKKworICAgIGlmIChic2V0LT50eXBlID09IEJVU1lfU0VUX0VNUFRZKQorICAgICAgICByZXR1cm47CisKKyAgICBhc3NlcnQoc3RybmNtcCgoY2hhciAqKXRhZywKKyAgICAgICAgICAgICAgICByc3J2X2RhdGFbY2FyZF0ub3duZXIsIE9SU0xfTUFYX1RBR19MRU4pID09IDApOworICAgIGFzc2VydChyc3J2X2RhdGFbY2FyZF0ucnNydl9jbnQgPiAwKTsKKworICAgIHJzcnZfZGF0YVtjYXJkXS5yc3J2X2NudC0tOworfQorCitpbnQgT1JTTFJlc2VydmUwKGNvbnN0IGludCBuLCBjb25zdCBpbnQgKl9fcmVzdHJpY3QgaW5kcywKKyAgICAgICAgICAgICAgICBjb25zdCBPUlNMQnVzeVNldCAqX19yZXN0cmljdCBic2V0cywKKyAgICAgICAgICAgICAgICBjb25zdCBPUlNMVGFnIF9fcmVzdHJpY3QgdGFnKQoreworICAgIGludCBpLCBvazsKKworICAgIGlmIChuID09IDApIHJldHVybiAwOworICAgIGlmIChjaGVja19hcmdzKG4sIGluZHMsIGJzZXRzLCB0YWcpICE9IDApIHJldHVybiBFSU5WQUw7CisgICAgaWYgKGNoZWNrX2JzZXRzKG4sIGJzZXRzKSAhPSAwKSByZXR1cm4gRU5PU1lTOworCisgICAgc3RhdGVfbG9jaygpOworCisgICAgLyogTG9vcCB1bnRpbCB3ZSBmaW5kIHRoYXQgYWxsIHRoZSByZXNvdXJjZXMgd2Ugd2FudCBhcmUgYXZhaWxhYmxlICovCisgICAgZG8geworICAgICAgICBvayA9IDE7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgICAgICBpZiAoY2FuX3Jlc2VydmVfY2FyZChpbmRzW2ldLCAmYnNldHNbaV0sIHRhZykgIT0gMCkgeworICAgICAgICAgICAgICAgIG9rID0gMDsKKyAgICAgICAgICAgICAgICAvKiBXYWl0IGZvciBzb21lb25lIHRvIHJlbGVhc2Ugc29tZSByZXNvdXJjZXMgKi8KKyAgICAgICAgICAgICAgICBzdGF0ZV93YWl0X2Zvcl9yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgfSB3aGlsZSAoIW9rKTsKKworICAgIC8qIEF0IHRoaXMgcG9pbnQgd2UgYXJlIGdvb2QgdG8gcmVzZXJ2ZV9jYXJkIHRoZSByZXNvdXJjZXMgd2Ugd2FudCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgIHJlc2VydmVfY2FyZChpbmRzW2ldLCAmYnNldHNbaV0sIHRhZyk7CisKKyAgICBzdGF0ZV91bmxvY2soKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IE9SU0xUcnlSZXNlcnZlMChjb25zdCBpbnQgbiwgY29uc3QgaW50ICpfX3Jlc3RyaWN0IGluZHMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgT1JTTEJ1c3lTZXQgKl9fcmVzdHJpY3QgYnNldHMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgT1JTTFRhZyBfX3Jlc3RyaWN0IHRhZykKK3sKKyAgICBpbnQgaSwgcmMgPSBFQlVTWTsKKworICAgIGlmIChuID09IDApIHJldHVybiAwOworICAgIGlmIChjaGVja19hcmdzKG4sIGluZHMsIGJzZXRzLCB0YWcpICE9IDApIHJldHVybiBFSU5WQUw7CisgICAgaWYgKGNoZWNrX2JzZXRzKG4sIGJzZXRzKSAhPSAwKSByZXR1cm4gRU5PU1lTOworCisgICAgc3RhdGVfbG9jaygpOworCisgICAgLyogQ2hlY2sgcmVzb3VyY2UgYXZhaWxhYmlsaXR5IG9uY2UgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICBpZiAoY2FuX3Jlc2VydmVfY2FyZChpbmRzW2ldLCAmYnNldHNbaV0sIHRhZykgIT0gMCkKKyAgICAgICAgICAgIGdvdG8gYmFpbF9vdXQ7CisKKyAgICAvKiBBdCB0aGlzIHBvaW50IHdlIGFyZSBnb29kIHRvIHJlc2VydmUgdGhlIHJlc291cmNlcyB3ZSB3YW50ICovCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgcmVzZXJ2ZV9jYXJkKGluZHNbaV0sICZic2V0c1tpXSwgdGFnKTsKKworICAgIHJjID0gMDsKKworYmFpbF9vdXQ6CisgICAgc3RhdGVfdW5sb2NrKCk7CisgICAgcmV0dXJuIHJjOworfQorCitpbnQgT1JTTFJlc2VydmVQYXJ0aWFsMChjb25zdCBPUlNMUGFydGlhbEdyYW51bGFyaXR5IGdyYW4sIGNvbnN0IGludCBuLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKl9fcmVzdHJpY3QgaW5kcywgT1JTTEJ1c3lTZXQgKl9fcmVzdHJpY3QgYnNldHMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xUYWcgX19yZXN0cmljdCB0YWcpCit7CisgICAgaW50IHJjID0gRUJVU1k7CisgICAgaW50IGksIG51bV9hdmFpbCA9IG47CisKKyAgICBpZiAobiA9PSAwKSByZXR1cm4gMDsKKyAgICBpZiAoZ3JhbiAhPSBHUkFOX0NBUkQgJiYgZ3JhbiAhPSBHUkFOX1RIUkVBRCkgcmV0dXJuIEVJTlZBTDsKKyAgICBpZiAoZ3JhbiAhPSBHUkFOX0NBUkQpIHJldHVybiBFSU5WQUw7CisgICAgaWYgKGNoZWNrX2FyZ3MobiwgaW5kcywgYnNldHMsIHRhZykgIT0gMCkgcmV0dXJuIEVJTlZBTDsKKyAgICBpZiAoY2hlY2tfYnNldHMobiwgYnNldHMpICE9IDApIHJldHVybiBFTk9TWVM7CisKKyAgICBzdGF0ZV9sb2NrKCk7CisKKyAgICAvKiBDaGVjayByZXNvdXJjZSBhdmFpbGFiaWxpdHkgb25jZTsgcmVtb3ZlIHVuYXZhaWxhYmxlIHJlc291cmNlcyBmcm9tIHRoZQorICAgICAqIHVzZXItcHJvdmlkZWQgbGlzdCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgIGlmIChjYW5fcmVzZXJ2ZV9jYXJkKGluZHNbaV0sICZic2V0c1tpXSwgdGFnKSAhPSAwKSB7CisgICAgICAgICAgICBudW1fYXZhaWwtLTsKKyAgICAgICAgICAgIGJzZXRzW2ldLnR5cGUgPSBCVVNZX1NFVF9FTVBUWTsKKyAgICAgICAgfQorCisgICAgaWYgKG51bV9hdmFpbCA9PSAwKQorICAgICAgICBnb3RvIGJhaWxfb3V0OworCisgICAgLyogQXQgdGhpcyBwb2ludCB3ZSBhcmUgZ29vZCB0byByZXNlcnZlIHRoZSByZXNvdXJjZXMgd2Ugd2FudCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgIHJlc2VydmVfY2FyZChpbmRzW2ldLCAmYnNldHNbaV0sIHRhZyk7CisKKyAgICByYyA9IDA7CisKK2JhaWxfb3V0OgorICAgIHN0YXRlX3VubG9jaygpOworICAgIHJldHVybiByYzsKK30KKworaW50IE9SU0xSZWxlYXNlMChjb25zdCBpbnQgbiwgY29uc3QgaW50ICpfX3Jlc3RyaWN0IGluZHMsCisgICAgICAgICAgICAgICAgY29uc3QgT1JTTEJ1c3lTZXQgKl9fcmVzdHJpY3QgYnNldHMsCisgICAgICAgICAgICAgICAgY29uc3QgT1JTTFRhZyBfX3Jlc3RyaWN0IHRhZykKK3sKKyAgICBpbnQgaSwgcmMgPSBFUEVSTTsKKworICAgIGlmIChuID09IDApIHJldHVybiAwOworICAgIGlmIChjaGVja19hcmdzKG4sIGluZHMsIGJzZXRzLCB0YWcpICE9IDApIHJldHVybiBFSU5WQUw7CisgICAgaWYgKGNoZWNrX2JzZXRzKG4sIGJzZXRzKSAhPSAwKSByZXR1cm4gRU5PU1lTOworCisgICAgc3RhdGVfbG9jaygpOworCisgICAgLyogQ2hlY2sgdGhhdCB3ZSBjYW4gcmVsZWFzZSBhbGwgdGhlIHJlc291cmNlcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgIGlmIChjYW5fcmVsZWFzZV9jYXJkKGluZHNbaV0sICZic2V0c1tpXSwgdGFnKSAhPSAwKQorICAgICAgICAgICAgZ290byBiYWlsX291dDsKKworICAgIC8qIEF0IHRoaXMgcG9pbnQgd2UgYXJlIGdvb2QgdG8gcmVsZWFzZSB0aGUgcmVzb3VyY2VzIHdlIHdhbnQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICByZWxlYXNlX2NhcmQoaW5kc1tpXSwgJmJzZXRzW2ldLCB0YWcpOworCisgICAgc3RhdGVfc2lnbmFsX3JlbGVhc2UoKTsKKworICAgIHJjID0gMDsKKworYmFpbF9vdXQ6CisgICAgc3RhdGVfdW5sb2NrKCk7CisgICAgcmV0dXJuIHJjOworfQorCisvKiB2aW06c2V0IGV0OiAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvb3JzbC1saXRlL3ZlcnNpb24udHh0IGIvZmluYWwvb2ZmbG9hZC9zcmMvb3JzbC1saXRlL3ZlcnNpb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNWY1OTkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9vZmZsb2FkL3NyYy9vcnNsLWxpdGUvdmVyc2lvbi50eHQKQEAgLTAsMCArMSBAQAorT1JTTC1saXRlIDAuNwpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvcmR0c2MuaCBiL2ZpbmFsL29mZmxvYWQvc3JjL3JkdHNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE5MWQ3MQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL3JkdHNjLmgKQEAgLTAsMCArMSwxNyBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCit1aW50NjRfdCBfcmR0c2MoKQoreworICB1aW50MzJfdCBlYXgsIGVkeDsKKyAgYXNtIHZvbGF0aWxlICgicmR0c2MiIDogIj1hIiAoZWF4KSwgIj1kIiAoZWR4KSk7CisgIHJldHVybiAoKHVpbnQ2NF90KWVkeCA8PCAzMikgfCBlYXg7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9vZmZsb2FkL3NyYy91c2VfbXBzczIudHh0IGIvZmluYWwvb2ZmbG9hZC9zcmMvdXNlX21wc3MyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDhmNDgzCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvb2ZmbG9hZC9zcmMvdXNlX21wc3MyLnR4dApAQCAtMCwwICsxIEBACisyLjEuNjcyMC0xMwpkaWZmIC0tZ2l0IGEvZmluYWwvb2ZmbG9hZC9zcmMvdXNlX21wc3Nfd2luLnR4dCBiL2ZpbmFsL29mZmxvYWQvc3JjL3VzZV9tcHNzX3dpbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ4ZjQ4MwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL29mZmxvYWQvc3JjL3VzZV9tcHNzX3dpbi50eHQKQEAgLTAsMCArMSBAQAorMi4xLjY3MjAtMTMKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvLmNsYW5nLWZvcm1hdCBiL2ZpbmFsL3J1bnRpbWUvLmNsYW5nLWZvcm1hdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTVkZmU1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS8uY2xhbmctZm9ybWF0CkBAIC0wLDAgKzEsOTEgQEAKKy0tLQorQmFzZWRPblN0eWxlOiAgTExWTQorQWxpZ25UcmFpbGluZ0NvbW1lbnRzOiBmYWxzZQorU29ydEluY2x1ZGVzOiAgICBmYWxzZQorLS0tCisjIExhbmd1YWdlOiBDcHAKKyMgQWNjZXNzTW9kaWZpZXJPZmZzZXQ6IC0yCisjIEFsaWduQWZ0ZXJPcGVuQnJhY2tldDogQWxpZ24KKyMgQWxpZ25Db25zZWN1dGl2ZUFzc2lnbm1lbnRzOiBmYWxzZQorIyBBbGlnbkNvbnNlY3V0aXZlRGVjbGFyYXRpb25zOiBmYWxzZQorIyBBbGlnbkVzY2FwZWROZXdsaW5lc0xlZnQ6IGZhbHNlCisjIEFsaWduT3BlcmFuZHM6IGZhbHNlCisjIEFsaWduVHJhaWxpbmdDb21tZW50czogZmFsc2UKKyMgQWxsb3dBbGxQYXJhbWV0ZXJzT2ZEZWNsYXJhdGlvbk9uTmV4dExpbmU6IHRydWUKKyMgQWxsb3dTaG9ydEJsb2Nrc09uQVNpbmdsZUxpbmU6IGZhbHNlCisjIEFsbG93U2hvcnRDYXNlTGFiZWxzT25BU2luZ2xlTGluZTogZmFsc2UKKyMgQWxsb3dTaG9ydEZ1bmN0aW9uc09uQVNpbmdsZUxpbmU6IEFsbAorIyBBbGxvd1Nob3J0SWZTdGF0ZW1lbnRzT25BU2luZ2xlTGluZTogZmFsc2UKKyMgQWxsb3dTaG9ydExvb3BzT25BU2luZ2xlTGluZTogZmFsc2UKKyMgQWx3YXlzQnJlYWtBZnRlckRlZmluaXRpb25SZXR1cm5UeXBlOiBOb25lCisjIEFsd2F5c0JyZWFrQWZ0ZXJSZXR1cm5UeXBlOiBOb25lCisjIEFsd2F5c0JyZWFrQmVmb3JlTXVsdGlsaW5lU3RyaW5nczogZmFsc2UKKyMgQWx3YXlzQnJlYWtUZW1wbGF0ZURlY2xhcmF0aW9uczogZmFsc2UKKyMgQmluUGFja0FyZ3VtZW50czogdHJ1ZQorIyBCaW5QYWNrUGFyYW1ldGVyczogdHJ1ZQorIyBCcmFjZVdyYXBwaW5nOiAgIAorIyAgIEFmdGVyQ2xhc3M6ICAgICAgZmFsc2UKKyMgICBBZnRlckNvbnRyb2xTdGF0ZW1lbnQ6IGZhbHNlCisjICAgQWZ0ZXJFbnVtOiAgICAgICBmYWxzZQorIyAgIEFmdGVyRnVuY3Rpb246ICAgZmFsc2UKKyMgICBBZnRlck5hbWVzcGFjZTogIGZhbHNlCisjICAgQWZ0ZXJPYmpDRGVjbGFyYXRpb246IGZhbHNlCisjICAgQWZ0ZXJTdHJ1Y3Q6ICAgICBmYWxzZQorIyAgIEFmdGVyVW5pb246ICAgICAgZmFsc2UKKyMgICBCZWZvcmVDYXRjaDogICAgIGZhbHNlCisjICAgQmVmb3JlRWxzZTogICAgICBmYWxzZQorIyAgIEluZGVudEJyYWNlczogICAgZmFsc2UKKyMgIyBCcmVha0JlZm9yZUJpbmFyeU9wZXJhdG9yczogTm9uZQorIyBCcmVha0JlZm9yZUJyYWNlczogQXR0YWNoCisjIEJyZWFrQmVmb3JlVGVybmFyeU9wZXJhdG9yczogdHJ1ZQorIyBCcmVha0NvbnN0cnVjdG9ySW5pdGlhbGl6ZXJzQmVmb3JlQ29tbWE6IGZhbHNlCisjIENvbHVtbkxpbWl0OiAgICAgODAKKyMgQ29tbWVudFByYWdtYXM6ICAnXiBJV1lVIHByYWdtYTonCisjIENvbnN0cnVjdG9ySW5pdGlhbGl6ZXJBbGxPbk9uZUxpbmVPck9uZVBlckxpbmU6IGZhbHNlCisjIENvbnN0cnVjdG9ySW5pdGlhbGl6ZXJJbmRlbnRXaWR0aDogNAorIyBDb250aW51YXRpb25JbmRlbnRXaWR0aDogNAorIyBDcHAxMUJyYWNlZExpc3RTdHlsZTogdHJ1ZQorIyBEZXJpdmVQb2ludGVyQWxpZ25tZW50OiBmYWxzZQorIyBEaXNhYmxlRm9ybWF0OiAgIHRydWUKKyMgRXhwZXJpbWVudGFsQXV0b0RldGVjdEJpblBhY2tpbmc6IGZhbHNlCisjIEZvckVhY2hNYWNyb3M6ICAgWyBmb3JlYWNoLCBRX0ZPUkVBQ0gsIEJPT1NUX0ZPUkVBQ0ggXQorIyBJbmNsdWRlQ2F0ZWdvcmllczogCisjICAgLSBSZWdleDogICAgICAgICAgICdeIihsbHZtfGxsdm0tY3xjbGFuZ3xjbGFuZy1jKS8nCisjICAgICBQcmlvcml0eTogICAgICAgIDIKKyMgICAtIFJlZ2V4OiAgICAgICAgICAgJ14oPHwiKGd0ZXN0fGlzbHxqc29uKS8pJworIyAgICAgUHJpb3JpdHk6ICAgICAgICAzCisjICAgLSBSZWdleDogICAgICAgICAgICcuKicKKyMgICAgIFByaW9yaXR5OiAgICAgICAgMQorIyBJbmRlbnRDYXNlTGFiZWxzOiBmYWxzZQorIyBJbmRlbnRXaWR0aDogICAgIDIKKyMgSW5kZW50V3JhcHBlZEZ1bmN0aW9uTmFtZXM6IGZhbHNlCisjIEtlZXBFbXB0eUxpbmVzQXRUaGVTdGFydE9mQmxvY2tzOiBmYWxzZQorIyBNYWNyb0Jsb2NrQmVnaW46ICcnCisjIE1hY3JvQmxvY2tFbmQ6ICAgJycKKyMgTWF4RW1wdHlMaW5lc1RvS2VlcDogMgorIyBOYW1lc3BhY2VJbmRlbnRhdGlvbjogTm9uZQorIyBPYmpDQmxvY2tJbmRlbnRXaWR0aDogMgorIyBPYmpDU3BhY2VBZnRlclByb3BlcnR5OiBmYWxzZQorIyBPYmpDU3BhY2VCZWZvcmVQcm90b2NvbExpc3Q6IHRydWUKKyMgUGVuYWx0eUJyZWFrQmVmb3JlRmlyc3RDYWxsUGFyYW1ldGVyOiAxOQorIyBQZW5hbHR5QnJlYWtDb21tZW50OiAzMDAKKyMgUGVuYWx0eUJyZWFrRmlyc3RMZXNzTGVzczogMTIwCisjIFBlbmFsdHlCcmVha1N0cmluZzogMTAwMAorIyBQZW5hbHR5RXhjZXNzQ2hhcmFjdGVyOiAxMDAwMDAwCisjIFBlbmFsdHlSZXR1cm5UeXBlT25JdHNPd25MaW5lOiA2MAorIyBQb2ludGVyQWxpZ25tZW50OiBSaWdodAorIyBSZWZsb3dDb21tZW50czogIHRydWUKKyMgU3BhY2VBZnRlckNTdHlsZUNhc3Q6IGZhbHNlCisjIFNwYWNlQmVmb3JlQXNzaWdubWVudE9wZXJhdG9yczogdHJ1ZQorIyBTcGFjZUJlZm9yZVBhcmVuczogQ29udHJvbFN0YXRlbWVudHMKKyMgU3BhY2VJbkVtcHR5UGFyZW50aGVzZXM6IGZhbHNlCisjIFNwYWNlc0JlZm9yZVRyYWlsaW5nQ29tbWVudHM6IDEKKyMgU3BhY2VzSW5BbmdsZXM6ICBmYWxzZQorIyBTcGFjZXNJbkNvbnRhaW5lckxpdGVyYWxzOiB0cnVlCisjIFNwYWNlc0luQ1N0eWxlQ2FzdFBhcmVudGhlc2VzOiBmYWxzZQorIyBTcGFjZXNJblBhcmVudGhlc2VzOiBmYWxzZQorIyBTcGFjZXNJblNxdWFyZUJyYWNrZXRzOiBmYWxzZQorIyBTdGFuZGFyZDogICAgICAgIENwcDExCisjIFRhYldpZHRoOiAgICAgICAgOAorIyBVc2VUYWI6ICAgICAgICAgIE5ldmVyCisuLi4KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvQnVpbGRfV2l0aF9DTWFrZS50eHQgYi9maW5hbC9ydW50aW1lL0J1aWxkX1dpdGhfQ01ha2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMWQzYjUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL0J1aWxkX1dpdGhfQ01ha2UudHh0CkBAIC0wLDAgKzEsMjI5IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0hvdyB0byBCdWlsZCB0aGUgTExWTSogT3Blbk1QKiBSdW50aW1lIExpYnJhcnkgdXNpbmcgQ01ha2UKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworPT09PSBWZXJzaW9uIG9mIENNYWtlIHJlcXVpcmVkOiB2Mi44LjAgb3IgYWJvdmUgPT09PQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSG93IHRvIGNhbGwgY21ha2UgaW5pdGlhbGx5LCB0aGVuIHJlcGVhdGVkbHkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistIFdoZW4gY2FsbGluZyBjbWFrZSBmb3IgdGhlIGZpcnN0IHRpbWUsIGFsbCBuZWVkZWQgY29tcGlsZXIgb3B0aW9ucworICBtdXN0IGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgQWZ0ZXIgdGhpcyBpbml0aWFsIGNhbGwgdG8KKyAgY21ha2UsIHRoZSBjb21waWxlciBkZWZpbml0aW9ucyBtdXN0IG5vdCBiZSBpbmNsdWRlZCBmb3IgZnVydGhlciBjYWxscworICB0byBjbWFrZS4gIE90aGVyIG9wdGlvbnMgY2FuIGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIG11bHRpcGxlCisgIHRpbWVzIGluY2x1ZGluZyBhbGwgZGVmaW5pdGlvbnMgaW4gdGhlIEJ1aWxkIG9wdGlvbnMgc2VjdGlvbiBiZWxvdy4KKy0gRXhhbXBsZSBvZiBjb25maWd1cmluZywgYnVpbGRpbmcsIHJlY29uZmlndXJpbmcsIHJlYnVpbGRpbmc6CisgICQgbWtkaXIgYnVpbGQKKyAgJCBjZCBidWlsZAorICAkIGNtYWtlIC1EQ01BS0VfQ19DT01QSUxFUj1nY2MgLURDTUFLRV9DWFhfQ09NUElMRVI9ZysrIC1ETElCT01QX0FSQ0g9aTM4NiAuLiAgIyBJbml0aWFsIGNvbmZpZ3VyYXRpb24KKyAgJCBtYWtlCisgIC4uLgorICAkIG1ha2UgY2xlYW4KKyAgJCBjbWFrZSAtRExJQk9NUF9BUkNIPXg4Nl82NCAtRENNQUtFX0JVSUxEX1RZUEU9RGVidWcgLi4gICAgICAgICAgICAgICAgICAgICAgICMgU2Vjb25kIGNvbmZpZ3VyYXRpb24KKyAgJCBtYWtlCisgIC4uLgorICAkIHJtIC1yZiAqCisgICQgY21ha2UgLURDTUFLRV9DX0NPTVBJTEVSPWdjYyAtRENNQUtFX0NYWF9DT01QSUxFUj1nKysgLURMSUJPTVBfQVJDSD14ODZfNjQgLi4gIyBUaGlyZCBjb25maWd1cmF0aW9uCisgICQgbWFrZQorLSBOb3RpY2UgaW4gdGhlIGV4YW1wbGUgaG93IHRoZSBjb21waWxlciBkZWZpbml0aW9ucyBhcmUgb25seSBzcGVjaWZpZWQKKyAgZm9yIGFuIGVtcHR5IGJ1aWxkIGRpcmVjdG9yeSwgYnV0IG90aGVyIEJ1aWxkIG9wdGlvbnMgYXJlIHVzZWQgYXQgYW55IHRpbWUuCistIFRoZSBmaWxlIENNYWtlQ2FjaGUudHh0IHdoaWNoIGlzIGNyZWF0ZWQgYWZ0ZXIgdGhlIGZpcnN0IGNhbGwgdG8gY21ha2UKKyAgaXMgYSBjb25maWd1cmF0aW9uIGZpbGUgd2hpY2ggaG9sZHMgYWxsIHRoZSB2YWx1ZXMgZm9yIHRoZSBCdWlsZCBvcHRpb25zLgorICBUaGVzZSBjb25maWd1cmF0aW9uIHZhbHVlcyBjYW4gYmUgY2hhbmdlZCB1c2luZyBhIHRleHQgZWRpdG9yIHRvIG1vZGlmeQorICBDTWFrZUNhY2hlLnR4dCBhcyBvcHBvc2VkIHRvIHVzaW5nIGRlZmluaXRpb25zIG9uIHRoZSBjb21tYW5kIGxpbmUuCistIFRvIGhhdmUgY21ha2UgY3JlYXRlIGEgcGFydGljdWxhciB0eXBlIG9mIGJ1aWxkIGdlbmVyYXRvciBmaWxlIHNpbXBseQorICBpbmx1ZGUgdGhlIC1HIDxHZW5lcmF0b3IgbmFtZT4gb3B0aW9uOgorICAkIGNtYWtlIC1HICJVbml4IE1ha2VmaWxlcyIgLi4uCisgIFlvdSBjYW4gc2VlIGEgbGlzdCBvZiBnZW5lcmF0b3JzIGNtYWtlIHN1cHBvcnRzIGJ5IGV4ZWN1dGluZyBjbWFrZSB3aXRoCisgIG5vIGFyZ3VtZW50cyBhbmQgYSBsaXN0IHdpbGwgYmUgcHJpbnRlZC4KKworPT09PT09PT09PT09PT09PT09PT09CitJbnN0cnVjdGlvbnMgdG8gQnVpbGQKKz09PT09PT09PT09PT09PT09PT09PQorICQgY2QgbGlib21wX3RvcF9sZXZlbC8gWyBkaXJlY3Rvcnkgd2l0aCBzcmMvICwgZXhwb3J0cy8gLCB0b29scy8gLCBldGMuIF0KKyAkIG1rZGlyIGJ1aWxkCisgJCBjZCBidWlsZAorCisgWyBVbml4KiBMaWJyYXJpZXMgXQorICQgY21ha2UgLURDTUFLRV9DX0NPTVBJTEVSPTxDIENvbXBpbGVyPiAtRENNQUtFX0NYWF9DT01QSUxFUj08QysrIENvbXBpbGVyPiAuLgorCisgWyBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBMaWJyYXJ5IChJbnRlbChSKSBNSUMgTGlicmFyeSkgXQorICQgY21ha2UgLURDTUFLRV9DX0NPTVBJTEVSPTxDIENvbXBpbGVyPiAtRENNQUtFX0NYWF9DT01QSUxFUj08QysrIENvbXBpbGVyPiAtRExJQk9NUF9BUkNIPW1pYyAuLgorCisgWyBXaW5kb3dzIExpYnJhcmllcyBdCisgJCBjbWFrZSAtRyA8R2VuZXJhdG9yIFR5cGU+IC1EQ01BS0VfQ19DT01QSUxFUj08QyBDb21waWxlcj4gLURDTUFLRV9DWFhfQ09NUElMRVI9PEMrKyBDb21waWxlcj4gLURDTUFLRV9BU01fTUFTTV9DT01QSUxFUj1bbWwgfCBtbDY0XSAtRENNQUtFX0JVSUxEX1RZUEU9UmVsZWFzZSAuLgorCisgJCBtYWtlCisgJCBtYWtlIGluc3RhbGwKKworPT09PT09PT09PT09PT09PT09CitNYWMqIEZhdCBMaWJyYXJpZXMKKz09PT09PT09PT09PT09PT09PQorT24gT1MgWCogbWFjaGluZXMsIGl0IGlzIHBvc3NpYmxlIHRvIGJ1aWxkIHVuaXZlcnNhbCAob3IgZmF0KSBsaWJyYXJpZXMgd2hpY2gKK2luY2x1ZGUgYm90aCBpMzg2IGFuZCB4ODZfNjQgYXJjaGl0ZWN0dXJlIG9iamVjdHMgaW4gYQorc2luZ2xlIGFyY2hpdmUuCisgJCBjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9Y2xhbmcgLURDTUFLRV9DWFhfQ09NUElMRVI9Y2xhbmcrKyAtRENNQUtFX09TWF9BUkNISVRFQ1RVUkVTPSdpMzg2O3g4Nl82NCcgLi4KKyAkIG1ha2UKK1RoZXJlIGlzIGFsc28gYW4gb3B0aW9uIC1ETElCT01QX09TWF9BUkNISVRFQ1RVUkVTIHdoaWNoIGNhbiBiZSBzZXQgaW4gY2FzZQordGhpcyBpcyBhbiBMTFZNIHNvdXJjZSB0cmVlIGJ1aWxkIHdoaWNoIHdpbGwgb25seSBzZXQgdGhlIGxpYm9tcCBsaWJyYXJ5Cit0byBhIHVuaXZlcnNhbCBmYXQgbGlicmFyeSBhbmQgcHJldmVudCBoYXZpbmcgdGhlIGVudGlyZSBsbHZtL2NsYW5nIGJ1aWxkCitwcm9kdWNlIHVuaXZlcnNhbCBiaW5hcmllcy4KKworPT09PT09PT09PT0KK01pY3JvIHRlc3RzCis9PT09PT09PT09PQorQWZ0ZXIgdGhlIGxpYnJhcnkgaGFzIGJlZW4gYnVpbHQsIHRoZXJlIGFyZSBmaXZlIG9wdGlvbmFsIG1pY3JvdGVzdHMgdGhhdAorY2FuIGJlIHBlcmZvcm1lZC4gIFNvbWUgd2lsbCBiZSBza2lwcGVkIGJhc2VkIHVwb24gdGhlIHBsYXRmb3JtLgorVG8gcnVuIHRoZSB0ZXN0cywKKyQgbWFrZSBsaWJvbXAtbWljcm8tdGVzdHMKKworPT09PT09PT09PT09PQorQ01ha2Ugb3B0aW9ucworPT09PT09PT09PT09PQorLURDTUFLRV9DX0NPTVBJTEVSPTxDIGNvbXBpbGVyIG5hbWU+CitTcGVjaWZ5IHRoZSBDIGNvbXBpbGVyCisKKy1EQ01BS0VfQ1hYX0NPTVBJTEVSPTxDKysgY29tcGlsZXIgbmFtZT4KK1NwZWNpZnkgdGhlIEMrKyBjb21waWxlcgorCistRENNQUtFX0ZvcnRyYW5fQ09NUElMRVI9PEZvcnRyYW4gY29tcGlsZXIgbmFtZT4KK1RoaXMgb3B0aW9uIGlzIG9ubHkgbmVlZGVkIHdoZW4gLURMSUJPTVBfRk9SVFJBTl9NT0RVTEVTIGlzIG9uLgorU28gdHlwaWNhbGx5LCBhIEZvcnRyYW4gY29tcGlsZXIgaXMgbm90IG5lZWRlZCBkdXJpbmcgdGhlIGJ1aWxkLgorU3BlY2lmeSB0aGUgRm9ydHJhbiBjb21waWxlcgorCistRENNQUtFX0FTTV9NQVNNX0NPTVBJTEVSPVttbCB8IG1sNjQgXQorVGhpcyBvcHRpb24gaXMgV2luZG93cyogT25seQorCistRExJQk9NUF9BUkNIPWkzODZ8eDg2XzY0fGFybXxwcGM2NHxwcGM2NGxlfGFhcmNoNjR8bWljCitUaGUgZGVmYXVsdCBmb3IgdGhlIG9wdGlvbiBpcyBjaG9zZW4gYmFzZWQgb24gdGhlIHByb2JpbmcgdGhlIGNvbXBpbGVyIGZvcgorYXJjaGl0ZWN0dXJlIG1hY3JvcyAoZS5nLiwgaXMgX194ODZfNjRfXyBwcmVkZWZpbmVkIGJ5IGNvbXBpbGVyPykuCisKKz09PT0gRmlyc3QgdmFsdWVzIGxpc3RlZCBhcmUgdGhlIGRlZmF1bHQgdmFsdWUgPT09PQorLURMSUJPTVBfTElCX1RZUEU9bm9ybWFsfHByb2ZpbGV8c3R1YnMKK0xpYnJhcnkgdHlwZSBjYW4gYmUgbm9ybWFsLCBwcm9maWxlLCBvciBzdHVicy4KKworLURDTUFLRV9CVUlMRF9UWVBFPVJlbGVhc2V8RGVidWd8UmVsV2l0aERlYkluZm8KK0J1aWxkIHR5cGUgY2FuIGJlIFJlbGVhc2UsIERlYnVnLCBvciBSZWxXaXRoRGViSW5mby4KKworLURMSUJPTVBfT01QX1ZFUlNJT049NTB8NDV8NDB8MzAKK09wZW5NUCB2ZXJzaW9uIGNhbiBiZSBlaXRoZXIgNTAsIDQ1LCA0MCBvciAzMC4KKworLURMSUJPTVBfTUlDX0FSQ0g9a25jfGtuZgorVGhpcyB2YWx1ZSBpcyBpZ25vcmVkIGlmIExJQk9NUF9BUkNIICE9IG1pYworSW50ZWwoUikgTUlDIEFyY2hpdGVjdHVyZSwgY2FuIGJlIGtuZiBvciBrbmMuCisKKy1ETElCT01QX0ZPUlRSQU5fTU9EVUxFUz1vZmZ8b24KK1Nob3VsZCB0aGUgRm9ydHJhbiBtb2R1bGVzIGJlIGNyZWF0ZWQgKHJlcXVpcmVzIEZvcnRyYW4gY29tcGlsZXIpCisKKy1ETElCT01QX1VTRV9BREFQVElWRV9MT0NLUz1vbnxvZmYKK1Nob3VsZCBhZGFwdGl2ZSAoVFNYLWJhc2VkKSBsb2NrcyBiZSBpbmNsdWRlZD8KK1RoZXNlIGFyZSB4ODYgc3BlY2lmaWMuICBUaGlzIGZlYXR1cmUgaXMgdHVybmVkIG9uIGJ5IGRlZmF1bHQKK2ZvciBpMzg2IGFuZCB4ODZfNjQuICBPdGhlcndpc2UsIGl0IGlzIHR1cm5lZCBvZmYuCisKKy1ETElCT01QX1VTRV9JTlRFUk5PREVfQUxJR05NRU5UPW9mZnxvbgorU2hvdWxkIDQwOTYtYnl0ZSBhbGlnbm1lbnQgYmUgdXNlZCBmb3IgY2VydGFpbiBkYXRhIHN0cnVjdHVyZXM/CitUaGlzIG9wdGlvbiBpcyB1c2VmdWwgb24gbXVsdGlub2RlIHN5c3RlbXMgd2hlcmUgYSBzbWFsbCBDQUNIRV9MSU5FCitzZXR0aW5nIGxlYWRzIHRvIGZhbHNlIHNoYXJpbmcuICBUaGlzIG9wdGlvbiBpcyBvZmYgYnkgZGVmYXVsdC4KKworLURMSUJPTVBfVVNFX1ZFUlNJT05fU1lNQk9MUz1vbnxvZmYKK1Nob3VsZCB2ZXJzaW9uZWQgc3ltYm9scyBiZSB1c2VkIGZvciBidWlsZGluZyB0aGUgbGlicmFyeT8KK1RoaXMgb3B0aW9uIG9ubHkgbWFrZXMgc2Vuc2UgZm9yIEVMRiBiYXNlZCBsaWJyYXJpZXMgd2hlcmUgdmVyc2lvbgorc3ltYm9scyBhcmUgc3VwcG9ydGVkIChMaW51eCwgc29tZSBCU0QqIHZhcmlhbnRzKS4gIEl0IGlzIG9mZgorYnkgZGVmYXVsdCBmb3IgV2luZG93cyBhbmQgTWFjLCBidXQgb24gZm9yIG90aGVyIFVuaXggYmFzZWQgb3BlcmF0aW5nCitzeXN0ZW1zLgorCistRExJQk9NUF9FTkFCTEVfU0hBUkVEPW9ufG9mZgorU2hhcmVkIGxpYnJhcnkgaW5zdGVhZCBvZiBzdGF0aWMgbGlicmFyeT8gKE5vdGU6IHN0YXRpYyBsaWJyYXJpZXMgYXJlIG5vdAorc3VwcG9ydGVkIG9uIFdpbmRvd3MpLiBJZiBMSUJPTVBfRU5BQkxFX1NIQVJFRCBpcyBvZmYsIHRoZW4gc3RhdGljIE9wZW5NUAorbGlicmFyaWVzIHdpbGwgYmUgYnVpbHQgaW5zdGVhZCBvZiBkeW5hbWljIG9uZXMuCisKKy1ETElCT01QX09NUFRfU1VQUE9SVD1vZmZ8b24KK1Nob3VsZCBPTVBUIHN1cHBvcnQgYmUgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkPyAoTm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzKQorSWYgTElCT01QX09NUFRfU1VQUE9SVCBpcyBvZmYsIHRoZW4gYm90aCBvbXB0X2JsYW1lIGFuZCBvbXB0X3RyYWNlIGFyZSBpZ25vcmVkLgorCistRExJQk9NUF9PTVBUX0JMQU1FPW9ufG9mZgorU2hvdWxkIE9NUFQgYmxhbWUgZnVuY3Rpb25hbGl0eSBiZSBpbmNsdWRlZCBpbiB0aGUgYnVpbGQ/CisKKy1ETElCT01QX09NUFRfVFJBQ0U9b258b2ZmCitTaG91bGQgT01QVCB0cmFjZSBmdW5jdGlvbmFsaXR5IGJlIGluY2x1ZGVkIGluIHRoZSBidWlsZD8KKworLURMSUJPTVBfU1RBVFM9b2ZmfG9uCitTaG91bGQgaW5jbHVkZSBzdGF0cy1nYXRoZXJpbmcgY29kZSBiZSBpbmNsdWRlZCBpbiB0aGUgYnVpbGQ/CisKKy1ETElCT01QX1VTRV9ERUJVR0dFUj1vZmZ8b24KK1Nob3VsZCB0aGUgZnJpZW5kbHkgZGVidWdnZXIgaW50ZXJmYWNlIGJlIGluY2x1ZGVkIGluIHRoZSBidWlsZD8KKworLURMSUJPTVBfVVNFX0hXTE9DPW9mZnxvbgorU2hvdWxkIHRoZSBId2xvYyBsaWJyYXJ5IGJlIHVzZWQgZm9yIGFmZmluaXR5PworVGhpcyBvcHRpb24gaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzLgoraHR0cDovL3d3dy5vcGVuLW1waS5vcmcvcHJvamVjdHMvaHdsb2MKKworLURMSUJPTVBfSFdMT0NfSU5TVEFMTF9ESVI9L3BhdGgvdG8vaHdsb2MvaW5zdGFsbC9kaXIKK0RlZmF1bHQ6IC91c3IvbG9jYWwKK1RoaXMgb3B0aW9uIGlzIG9ubHkgdXNlZCBpZiBMSUJPTVBfVVNFX0hXTE9DIGlzIG9uLgorU3BlY2lmaWVzIGluc3RhbGwgbG9jYXRpb24gb2YgSHdsb2MuIFRoZSBjb25maWd1cmF0aW9uIHN5c3RlbSB3aWxsIGxvb2sgZm9yCitod2xvYy5oIGluICR7TElCT01QX0hXTE9DX0lOU1RBTExfRElSfS9pbmNsdWRlIGFuZCB0aGUgbGlicmFyeSBpbgorJHtMSUJPTVBfSFdMT0NfSU5TVEFMTF9ESVJ9L2xpYi4KKworLURMSUJPTVBfTExWTV9MSVRfRVhFQ1VUQUJMRT0vcGF0aC90by9sbHZtLWxpdAorRGVmYXVsdDogc2VhcmNoIGluIFBBVEgKK1NwZWNpZml5IGZ1bGwgcGF0aCB0byBsbHZtLWxpdCBleGVjdXRhYmxlIGZvciBydW5uaW5nIHRlc3RzLgorCistRE9QRU5NUF9MTFZNX1RPT0xTX0RJUj0vcGF0aC90by9idWlsdC9sbHZtL3Rvb2xzCitEZWZhdWx0OiBzZWFyY2ggZm9yIHRvb2xzIGluIHBhdGgKK0FkZGl0aW9uYWwgcGF0aCB0byBzZWFyY2ggZm9yIExMVk0gdG9vbHMgbmVlZGVkIGJ5IHRlc3RzLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSG93IHRvIGFwcGVuZCBmbGFncyB0byB0aGUgYnVpbGQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistIFRoZXNlIGZsYWdzIGFyZSAqYXBwZW5kZWQqLiAgVGhleSBkbyBub3QKKyAgb3ZlcndyaXRlIGFueSBvZiB0aGUgcHJlc2V0IGZsYWdzLgorLURMSUJPTVBfQ1BQRkxBR1M9PHNwYWNlLXNlcGFyYXRlZCBmbGFncz4gLS0gQWRkaXRpb25hbCBDIHByZXByb2Nlc3NvciBmbGFncworLURMSUJPTVBfQ0ZMQUdTPTxzcGFjZS1zZXBhcmF0ZWQgZmxhZ3M+ICAgLS0gQWRkaXRpb25hbCBDIGNvbXBpbGVyIGZsYWdzCistRExJQk9NUF9DWFhGTEFHUz08c3BhY2Utc2VwYXJhdGVkIGZsYWdzPiAtLSBBZGRpdGlvbmFsIEMrKyBjb21waWxlciBmbGFncworLURMSUJPTVBfQVNNRkxBR1M9PHNwYWNlLXNlcGFyYXRlZCBmbGFncz4gLS0gQWRkaXRpb25hbCBhc3NlbWJseSBmbGFncworLURMSUJPTVBfTERGTEFHUz08c3BhY2Utc2VwYXJhdGVkIGZsYWdzPiAgLS0gQWRkaXRpb25hbCBsaW5rZXIgZmxhZ3MKKy1ETElCT01QX0xJQkZMQUdTPTxzcGFjZS1zZXBhcmF0ZWQgZmxhZ3M+IC0tIEFkZGl0aW9uYWwgbGlicmFyaWVzIHRvIGxpbmsKKy1ETElCT01QX0ZGTEFHUz08c3BhY2Utc2VwYXJhdGVkIGZsYWdzPiAgIC0tIEFkZGl0aW9uYWwgRm9ydHJhbiBjb21waWxlciBmbGFncworCis9PT09PT09PT09PT09PT09PT09PT09PQorRXhhbXBsZSB1c2FnZXMgb2YgQ01ha2UKKz09PT09PT09PT09PT09PT09PT09PT09CistLS0tIFR5cGljYWwgdXNhZ2UgLS0tLQorY21ha2UgLURDTUFLRV9DX0NPTVBJTEVSPWljYyAtRENNQUtFX0NYWF9DT01QSUxFUj1pY3BjIC4uCitjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9Z2NjIC1EQ01BS0VfQ1hYX0NPTVBJTEVSPWcrKyAuLgorY21ha2UgLURDTUFLRV9DX0NPTVBJTEVSPWNsYW5nIC1EQ01BS0VfQ1hYX0NPTVBJTEVSPWNsYW5nKysgLi4KKworLS0tLSBXaXRoIFZhcmlvdXMgT3B0aW9ucyAtLS0tCistIEJ1aWxkIHRoZSBpMzg2IExpbnV4IGxpYnJhcnkgdXNpbmcgR0NDKgorY21ha2UgLURDTUFLRV9DX0NPTVBJTEVSPWdjYyAtRENNQUtFX0NYWF9DT01QSUxFUj1nKysgLURMSUJPTVBfQVJDSD1pMzg2IC4uCisKKy0gQnVpbGQgdGhlIHg4Nl82NCBkZWJ1ZyBNYWMgbGlicmFyeSB1c2luZyBDbGFuZyoKK2NtYWtlIC1EQ01BS0VfQ19DT01QSUxFUj1jbGFuZyAtRENNQUtFX0NYWF9DT01QSUxFUj1jbGFuZysrIC1ETElCT01QX0FSQ0g9eDg2XzY0IC1EQ01BS0VfQlVJTERfVFlQRT1EZWJ1ZyAuLgorCistIEJ1aWxkIHRoZSBsaWJyYXJ5IChhcmNoaXRlY3R1cmUgZGV0ZXJtaW5lZCBieSBwcm9iaW5nIGNvbXBpbGVyKSB1c2luZyB0aGUKKyAgSW50ZWwoUikgQyBDb21waWxlciBhbmQgdGhlIEludGVsKFIpIEMrKyBDb21waWxlci4gQWxzbywgY3JlYXRlIHRoZSBmb3J0cmFuIG1vZHVsZXMgdXNpbmcKKyAgdGhlIEludGVsKFIpIEZvcnRyYW4gQ29tcGlsZXIuCitjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9aWNjIC1EQ01BS0VfQ1hYX0NPTVBJTEVSPWljcGMgLURDTUFLRV9Gb3J0cmFuX0NPTVBJTEVSPWlmb3J0IC1ETElCT01QX0ZPUlRSQU5fTU9EVUxFUz1vbiAuLgorCistIEhhdmUgQ01ha2UgRmluZCB0aGUgQy9DKysgY29tcGlsZXIsIGFuZCBzcGVjaWZ5IGFkZGl0aW9uYWwgZmxhZ3MgZm9yIHRoZSBDIGNvbXBpbGVyLCBwcmVwcm9jZXNzb3IsIGFuZCBDKysgY29tcGlsZXIuCitjbWFrZSAtRExJQk9NUF9DRkxBR1M9Jy1zcGVjaWZpYy1mbGFnJyAtRExJQk9NUF9DUFBGTEFHUz0nLURORVdfRkVBVFVSRT0xIC1ET0xEX0ZFQVRVUkU9MCcgLURMSUJPTVBfQ1hYRkxBR1M9Jy0tb25lLXNwZWNpZmljLWZsYWcgLS10d28tc3BlY2lmaWMtZmxhZycgLi4KKworLS0tLSBCdWlsZCB0aGUgc3R1YnMgbGlicmFyeSAtLS0tCitjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9Z2NjIC1EQ01BS0VfQ1hYX0NPTVBJTEVSPWcrKyAtRExJQk9NUF9MSUJfVFlQRT1zdHVicyAuLgorCis9PT09PT09PT0KK0Zvb3Rub3RlcworPT09PT09PT09CitbKl0gT3RoZXIgbmFtZXMgYW5kIGJyYW5kcyBtYXkgYmUgY2xhaW1lZCBhcyB0aGUgcHJvcGVydHkgb2Ygb3RoZXJzLgpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9DTWFrZUxpc3RzLnR4dCBiL2ZpbmFsL3J1bnRpbWUvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU1ZmQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw0MDAgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyBDTUFLRSBsaWJvbXAKK2NtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjggRkFUQUxfRVJST1IpCisKKyMgQWRkIGNtYWtlIGRpcmVjdG9yeSB0byBzZWFyY2ggZm9yIGN1c3RvbSBjbWFrZSBmdW5jdGlvbnMKK3NldChDTUFLRV9NT0RVTEVfUEFUSCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY21ha2UgJHtDTUFLRV9NT0RVTEVfUEFUSH0pCisKKyMgU3RhbmRhbG9uZSBidWlsZCBvciBwYXJ0IG9mIExMVk0/CitzZXQoTElCT01QX1NUQU5EQUxPTkVfQlVJTEQgRkFMU0UpCitpZihPUEVOTVBfU1RBTkRBTE9ORV9CVUlMRCBPUgorICAgIiR7Q01BS0VfU09VUkNFX0RJUn0iIFNUUkVRVUFMICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0iIE9SCisgICAiJHtDTUFLRV9TT1VSQ0VfRElSfS9ydW50aW1lIiBTVFJFUVVBTCAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9IikKKyAgcHJvamVjdChsaWJvbXAgQyBDWFgpCisgIHNldChMSUJPTVBfU1RBTkRBTE9ORV9CVUlMRCBUUlVFKQorZW5kaWYoKQorCisjIFNldCBsaWJvbXAgdmVyc2lvbgorc2V0KExJQk9NUF9WRVJTSU9OX01BSk9SIDUpCitzZXQoTElCT01QX1ZFUlNJT05fTUlOT1IgMCkKKworIyBUaGVzZSBpbmNsdWRlIGZpbGVzIGFyZSBpbiB0aGUgY21ha2UvIHN1YmRpcmVjdG9yeQoraW5jbHVkZShMaWJvbXBVdGlscykKK2luY2x1ZGUoTGlib21wR2V0QXJjaGl0ZWN0dXJlKQoraW5jbHVkZShMaWJvbXBIYW5kbGVGbGFncykKK2luY2x1ZGUoTGlib21wRGVmaW5pdGlvbnMpCisKKyMgRGV0ZXJtaW5lIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlCitpZigke0xJQk9NUF9TVEFOREFMT05FX0JVSUxEfSkKKyAgIyBJZiBhZGRpbmcgYSBuZXcgYXJjaGl0ZWN0dXJlLCB0YWtlIGEgbG9vayBhdCBjbWFrZS9MaWJvbXBHZXRBcmNoaXRlY3R1cmUuY21ha2UKKyAgbGlib21wX2dldF9hcmNoaXRlY3R1cmUoTElCT01QX0RFVEVDVEVEX0FSQ0gpCisgIHNldChMSUJPTVBfQVJDSCAke0xJQk9NUF9ERVRFQ1RFRF9BUkNIfSBDQUNIRSBTVFJJTkcKKyAgICAiVGhlIGFyY2hpdGVjdHVyZSB0byBidWlsZCBmb3IgKHg4Nl82NC9pMzg2L2FybS9wcGM2NC9wcGM2NGxlL2FhcmNoNjQvbWljL21pcHMvbWlwczY0KS4iKQorICAjIEFsbG93IHVzZXIgdG8gY2hvb3NlIGEgc3VmZml4IGZvciB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KKyAgc2V0KExJQk9NUF9MSUJESVJfU1VGRklYICIiIENBQ0hFIFNUUklORworICAgICJzdWZmaXggb2YgbGliIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgZS5nLiwgNjQgPT4gbGliNjQiKQorICAjIFNob3VsZCBhc3NlcnRpb25zIGJlIGVuYWJsZWQ/ICBUaGV5IGFyZSBvbiBieSBkZWZhdWx0LgorICBzZXQoTElCT01QX0VOQUJMRV9BU1NFUlRJT05TIFRSVUUgQ0FDSEUgQk9PTAorICAgICJlbmFibGUgYXNzZXJ0aW9ucz8iKQorICBzZXQoTElCT01QX0VOQUJMRV9XRVJST1IgRkFMU0UgQ0FDSEUgQk9PTAorICAgICJFbmFibGUgLVdlcnJvciBmbGFncyB0byB0dXJuIHdhcm5pbmdzIGludG8gZXJyb3JzIGZvciBzdXBwb3J0aW5nIGNvbXBpbGVycy4iKQorICAjIENNQUtFX0JVSUxEX1RZUEUgd2FzIG5vdCBkZWZpbmVkLCBzZXQgZGVmYXVsdCB0byBSZWxlYXNlCisgIGlmKE5PVCBDTUFLRV9CVUlMRF9UWVBFKQorICAgIHNldChDTUFLRV9CVUlMRF9UWVBFIFJlbGVhc2UpCisgIGVuZGlmKCkKK2Vsc2UoKSAjIFBhcnQgb2YgTExWTSBidWlsZAorICAjIERldGVybWluZSB0aGUgbmF0aXZlIGFyY2hpdGVjdHVyZSBmcm9tIExMVk0uCisgIHN0cmluZyhUT0xPV0VSICIke0xMVk1fVEFSR0VUX0FSQ0h9IiBMSUJPTVBfTkFUSVZFX0FSQ0gpCisgIGlmKCBMSUJPTVBfTkFUSVZFX0FSQ0ggU1RSRVFVQUwgImhvc3QiICkKKyAgICBzdHJpbmcoUkVHRVggTUFUQ0ggIl5bXi1dKiIgTElCT01QX05BVElWRV9BUkNIICR7TExWTV9IT1NUX1RSSVBMRX0pCisgIGVuZGlmICgpCisgIGlmKExJQk9NUF9OQVRJVkVfQVJDSCBNQVRDSEVTICJpWzItNl04NiIpCisgICAgc2V0KExJQk9NUF9BUkNIIGkzODYpCisgIGVsc2VpZihMSUJPTVBfTkFUSVZFX0FSQ0ggU1RSRVFVQUwgIng4NiIpCisgICAgc2V0KExJQk9NUF9BUkNIIGkzODYpCisgIGVsc2VpZihMSUJPTVBfTkFUSVZFX0FSQ0ggU1RSRVFVQUwgImFtZDY0IikKKyAgICBzZXQoTElCT01QX0FSQ0ggeDg2XzY0KQorICBlbHNlaWYoTElCT01QX05BVElWRV9BUkNIIFNUUkVRVUFMICJ4ODZfNjQiKQorICAgIHNldChMSUJPTVBfQVJDSCB4ODZfNjQpCisgIGVsc2VpZihMSUJPTVBfTkFUSVZFX0FSQ0ggTUFUQ0hFUyAicG93ZXJwYzY0bGUiKQorICAgIHNldChMSUJPTVBfQVJDSCBwcGM2NGxlKQorICBlbHNlaWYoTElCT01QX05BVElWRV9BUkNIIE1BVENIRVMgInBvd2VycGMiKQorICAgIHNldChMSUJPTVBfQVJDSCBwcGM2NCkKKyAgZWxzZWlmKExJQk9NUF9OQVRJVkVfQVJDSCBNQVRDSEVTICJhYXJjaDY0IikKKyAgICBzZXQoTElCT01QX0FSQ0ggYWFyY2g2NCkKKyAgZWxzZWlmKExJQk9NUF9OQVRJVkVfQVJDSCBNQVRDSEVTICJhcm02NCIpCisgICAgc2V0KExJQk9NUF9BUkNIIGFhcmNoNjQpCisgIGVsc2VpZihMSUJPTVBfTkFUSVZFX0FSQ0ggTUFUQ0hFUyAiYXJtIikKKyAgICBzZXQoTElCT01QX0FSQ0ggYXJtKQorICBlbHNlKCkKKyAgICAjIGxhc3QgZGl0Y2ggZWZmb3J0CisgICAgbGlib21wX2dldF9hcmNoaXRlY3R1cmUoTElCT01QX0FSQ0gpCisgIGVuZGlmICgpCisgIHNldChMSUJPTVBfTElCRElSX1NVRkZJWCAke0xMVk1fTElCRElSX1NVRkZJWH0pCisgIHNldChMSUJPTVBfRU5BQkxFX0FTU0VSVElPTlMgJHtMTFZNX0VOQUJMRV9BU1NFUlRJT05TfSkKKyAgc2V0KExJQk9NUF9FTkFCTEVfV0VSUk9SICR7TExWTV9FTkFCTEVfV0VSUk9SfSkKK2VuZGlmKCkKK2xpYm9tcF9jaGVja192YXJpYWJsZShMSUJPTVBfQVJDSCAzMmUgeDg2XzY0IDMyIGkzODYgYXJtIHBwYzY0IHBwYzY0bGUgYWFyY2g2NCBtaWMgbWlwcyBtaXBzNjQpCisKK3NldChMSUJPTVBfTElCX1RZUEUgbm9ybWFsIENBQ0hFIFNUUklORworICAiUGVyZm9ybWFuY2UsUHJvZmlsaW5nLFN0dWJzIGxpYnJhcnkgKG5vcm1hbC9wcm9maWxlL3N0dWJzKSIpCitsaWJvbXBfY2hlY2tfdmFyaWFibGUoTElCT01QX0xJQl9UWVBFIG5vcm1hbCBwcm9maWxlIHN0dWJzKQorc2V0KExJQk9NUF9PTVBfVkVSU0lPTiA1MCBDQUNIRSBTVFJJTkcKKyAgIlRoZSBPcGVuTVAgdmVyc2lvbiAoNTAvNDUvNDAvMzApIikKK2xpYm9tcF9jaGVja192YXJpYWJsZShMSUJPTVBfT01QX1ZFUlNJT04gNTAgNDUgNDAgMzApCisjIFNldCB0aGUgT3Blbk1QIFllYXIgYW5kIE1vbnRoIGFzc2lvY2lhdGVkIHdpdGggdmVyc2lvbgoraWYoJHtMSUJPTVBfT01QX1ZFUlNJT059IEdSRUFURVIgNTAgT1IgJHtMSUJPTVBfT01QX1ZFUlNJT059IEVRVUFMIDUwKQorICBzZXQoTElCT01QX09NUF9ZRUFSX01PTlRIIDIwMTYxMSkKK2Vsc2VpZigke0xJQk9NUF9PTVBfVkVSU0lPTn0gR1JFQVRFUiA0NSBPUiAke0xJQk9NUF9PTVBfVkVSU0lPTn0gRVFVQUwgNDUpCisgIHNldChMSUJPTVBfT01QX1lFQVJfTU9OVEggMjAxNTExKQorZWxzZWlmKCR7TElCT01QX09NUF9WRVJTSU9OfSBHUkVBVEVSIDQwIE9SICR7TElCT01QX09NUF9WRVJTSU9OfSBFUVVBTCA0MCkKKyAgc2V0KExJQk9NUF9PTVBfWUVBUl9NT05USCAyMDEzMDcpCitlbHNlaWYoJHtMSUJPTVBfT01QX1ZFUlNJT059IEdSRUFURVIgMzAgT1IgJHtMSUJPTVBfT01QX1ZFUlNJT059IEVRVUFMIDMwKQorICBzZXQoTElCT01QX09NUF9ZRUFSX01PTlRIIDIwMTEwNykKK2Vsc2UoKQorICBzZXQoTElCT01QX09NUF9ZRUFSX01PTlRIIDIwMDUwNSkKK2VuZGlmKCkKK3NldChMSUJPTVBfTUlDX0FSQ0gga25jIENBQ0hFIFNUUklORworICAiSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlIChJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlKSAoa25mL2tuYykuICBJZ25vcmVkIGlmIG5vdCBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlIGJ1aWxkLiIpCitpZigiJHtMSUJPTVBfQVJDSH0iIFNUUkVRVUFMICJtaWMiKQorICBsaWJvbXBfY2hlY2tfdmFyaWFibGUoTElCT01QX01JQ19BUkNIIGtuZiBrbmMpCitlbmRpZigpCitzZXQoTElCT01QX0ZPUlRSQU5fTU9EVUxFUyBGQUxTRSBDQUNIRSBCT09MCisgICJDcmVhdGUgRm9ydHJhbiBtb2R1bGUgZmlsZXM/IChyZXF1aXJlcyBmb3J0cmFuIGNvbXBpbGVyKSIpCisKKyMgLSBTdXBwb3J0IGZvciB1bml2ZXJzYWwgZmF0IGJpbmFyeSBidWlsZHMgb24gTWFjCisjIC0gSGF2aW5nIHRoaXMgZXh0cmEgdmFyaWFibGUgYWxsb3dzIHBlb3BsZSB0byBidWlsZCB0aGlzIGxpYnJhcnkgYXMgYSB1bml2ZXJzYWwgbGlicmFyeQorIyAgIHdpdGhvdXQgZm9yY2luZyBhIHVuaXZlcnNhbCBidWlsZCBvZiB0aGUgbGx2bS9jbGFuZyBjb21waWxlci4KK3NldChMSUJPTVBfT1NYX0FSQ0hJVEVDVFVSRVMgIiR7Q01BS0VfT1NYX0FSQ0hJVEVDVFVSRVN9IiBDQUNIRSBTVFJJTkcKKyAgIkZvciBNYWMgYnVpbGRzLCBzZW1pY29sb24gc2VwYXJhdGVkIGxpc3Qgb2YgYXJjaGl0ZWN0dXJlcyB0byBidWlsZCBmb3IgdW5pdmVyc2FsIGZhdCBiaW5hcnkuIikKK3NldChDTUFLRV9PU1hfQVJDSElURUNUVVJFUyAke0xJQk9NUF9PU1hfQVJDSElURUNUVVJFU30pCisKKyMgU2hvdWxkIEBycGF0aCBiZSB1c2VkIGZvciBkeW5hbWljIGxpYnJhcmllcyBvbiBNYWM/CisjIFRoZSBpZihOT1QgREVGSU5FRCkgaXMgdGhlcmUgdG8gZ3VhcmQgYSBjYWNoZWQgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIGlmIG9uZQorIyBleGlzdHMgc28gdGhlcmUgaXMgbm8gaW50ZXJmZXJlbmNlIHdpdGggd2hhdCB0aGUgdXNlciB3YW50cy4gIEFsc28sIG5vIGNhY2hlIGVudHJ5CisjIGlzIGNyZWF0ZWQgc28gdGhlcmUgYXJlIG5vIGluYWR2ZXJ0YW50IGVmZmVjdHMgb24gb3RoZXIgcGFydHMgb2YgTExWTS4KK2lmKE5PVCBERUZJTkVEIENNQUtFX01BQ09TWF9SUEFUSCkKKyAgc2V0KENNQUtFX01BQ09TWF9SUEFUSCBUUlVFKQorZW5kaWYoKQorCisjIFVzZXIgc3BlY2lmaWVkIGZsYWdzLiAgVGhlc2UgYXJlIGFwcGVuZGVkIHRvIHRoZSBjb25maWd1cmVkIGZsYWdzLgorc2V0KExJQk9NUF9DRkxBR1MgIiIgQ0FDSEUgU1RSSU5HCisgICJBcHBlbmRlZCB1c2VyIHNwZWNpZmllZCBDIGNvbXBpbGVyIGZsYWdzLiIpCitzZXQoTElCT01QX0NYWEZMQUdTICIiIENBQ0hFIFNUUklORworICAiQXBwZW5kZWQgdXNlciBzcGVjaWZpZWQgQysrIGNvbXBpbGVyIGZsYWdzLiIpCitzZXQoTElCT01QX0NQUEZMQUdTICIiIENBQ0hFIFNUUklORworICAiQXBwZW5kZWQgdXNlciBzcGVjaWZpZWQgQyBwcmVwcm9jZXNzb3IgZmxhZ3MuIikKK3NldChMSUJPTVBfQVNNRkxBR1MgIiIgQ0FDSEUgU1RSSU5HCisgICJBcHBlbmRlZCB1c2VyIHNwZWNpZmllZCBhc3NlbWJsZXIgZmxhZ3MuIikKK3NldChMSUJPTVBfTERGTEFHUyAiIiBDQUNIRSBTVFJJTkcKKyAgIkFwcGVuZGVkIHVzZXIgc3BlY2lmaWVkIGxpbmtlciBmbGFncy4iKQorc2V0KExJQk9NUF9MSUJGTEFHUyAiIiBDQUNIRSBTVFJJTkcKKyAgIkFwcGVuZGVkIHVzZXIgc3BlY2lmaWVkIGxpbmtlZCBsaWJzIGZsYWdzLiAoZS5nLiwgLWxtKSIpCitzZXQoTElCT01QX0ZGTEFHUyAiIiBDQUNIRSBTVFJJTkcKKyAgIkFwcGVuZGVkIHVzZXIgc3BlY2lmaWVkIEZvcnRyYW4gY29tcGlsZXIgZmxhZ3MuICBUaGVzZSBhcmUgb25seSB1c2VkIGlmIExJQk9NUF9GT1JUUkFOX01PRFVMRVM9PVRSVUUuIikKKworIyBTaG91bGQgdGhlIGxpYm9tcCBsaWJyYXJ5IGFuZCBnZW5lcmF0ZWQgaGVhZGVycyBiZSBjb3BpZWQgaW50byB0aGUgb3JpZ2luYWwgc291cmNlIGV4cG9ydHMvIGRpcmVjdG9yeQorIyBUdXJuaW5nIHRoaXMgdG8gRkFMU0UgYWlkcyBwYXJhbGxlbCBidWlsZHMgdG8gbm90IGludGVyZmVyZSB3aXRoIGVhY2ggb3RoZXIuCisjIEN1cnJlbnRseSwgdGhlIHRlc3RzdWl0ZSBtb2R1bGUgZXhwZWN0cyB0aGUganVzdCBidWlsdCBPcGVuTVAgbGlicmFyeSB0byBiZSBsb2NhdGVkIGluc2lkZSB0aGUgZXhwb3J0cy8KKyMgZGlyZWN0b3J5LiAgVE9ETzogaGF2ZSB0ZXN0c3VpdGUgcnVuIHVuZGVyIGxsdm0tbGl0IGRpcmVjdGx5LiAgV2UgY2FuIHRoZW4gZ2V0IHJpZCBvZiBjb3B5aW5nIHRvIGV4cG9ydHMvCitzZXQoTElCT01QX0NPUFlfRVhQT1JUUyBUUlVFIENBQ0hFIFNUUklORworICAiU2hvdWxkIGV4cG9ydHMgYmUgY29waWVkIGludG8gc291cmNlIGV4cG9ydHMvIGRpcmVjdG9yeT8iKQorCisjIEhXTE9DLXN1cHBvcnQKK3NldChMSUJPTVBfVVNFX0hXTE9DIEZBTFNFIENBQ0hFIEJPT0wKKyAgIlVzZSBId2xvYyAoaHR0cDovL3d3dy5vcGVuLW1waS5vcmcvcHJvamVjdHMvaHdsb2MvKSBsaWJyYXJ5IGZvciBhZmZpbml0eT8iKQorc2V0KExJQk9NUF9IV0xPQ19JTlNUQUxMX0RJUiAvdXNyL2xvY2FsIENBQ0hFIFBBVEgKKyAgIkluc3RhbGwgcGF0aCBmb3IgaHdsb2MgbGlicmFyeSIpCisKKyMgR2V0IHRoZSBidWlsZCBudW1iZXIgZnJvbSBrbXBfdmVyc2lvbi5jcHAKK2xpYm9tcF9nZXRfYnVpbGRfbnVtYmVyKCIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0iIExJQk9NUF9WRVJTSU9OX0JVSUxEKQorbWF0aChFWFBSIExJQk9NUF9WRVJTSU9OX0JVSUxEX1lFQVIgIiR7TElCT01QX1ZFUlNJT05fQlVJTER9LzEwMDAwIikKK21hdGgoRVhQUiBMSUJPTVBfVkVSU0lPTl9CVUlMRF9NT05USF9EQVkgIiR7TElCT01QX1ZFUlNJT05fQlVJTER9JTEwMDAwIikKKworIyBDdXJyZW50bHkgZG9uJ3QgcmVjb3JkIGFueSB0aW1lc3RhbXBzCitzZXQoTElCT01QX0JVSUxEX0RBVEUgIk5vX1RpbWVzdGFtcCIpCisKKyMgQXJjaGl0ZWN0dXJlCitzZXQoSUEzMiBGQUxTRSkKK3NldChJTlRFTDY0IEZBTFNFKQorc2V0KEFSTSBGQUxTRSkKK3NldChBQVJDSDY0IEZBTFNFKQorc2V0KFBQQzY0QkUgRkFMU0UpCitzZXQoUFBDNjRMRSBGQUxTRSkKK3NldChQUEM2NCBGQUxTRSkKK3NldChNSUMgRkFMU0UpCitzZXQoTUlQUzY0IEZBTFNFKQorc2V0KE1JUFMgRkFMU0UpCitpZigiJHtMSUJPTVBfQVJDSH0iIFNUUkVRVUFMICJpMzg2IiBPUiAiJHtMSUJPTVBfQVJDSH0iIFNUUkVRVUFMICIzMiIpICAgICMgSUEtMzIgYXJjaGl0ZWN0dXJlCisgIHNldChJQTMyIFRSVUUpCitlbHNlaWYoIiR7TElCT01QX0FSQ0h9IiBTVFJFUVVBTCAieDg2XzY0IiBPUiAiJHtMSUJPTVBfQVJDSH0iIFNUUkVRVUFMICIzMmUiKSAjIEludGVsKFIpIDY0IGFyY2hpdGVjdHVyZQorICBzZXQoSU5URUw2NCBUUlVFKQorZWxzZWlmKCIke0xJQk9NUF9BUkNIfSIgU1RSRVFVQUwgImFybSIpICMgQVJNIGFyY2hpdGVjdHVyZQorICBzZXQoQVJNIFRSVUUpCitlbHNlaWYoIiR7TElCT01QX0FSQ0h9IiBTVFJFUVVBTCAicHBjNjQiKSAjIFBQQzY0QkUgYXJjaGl0ZWN0dXJlCisgIHNldChQUEM2NEJFIFRSVUUpCisgIHNldChQUEM2NCBUUlVFKQorZWxzZWlmKCIke0xJQk9NUF9BUkNIfSIgU1RSRVFVQUwgInBwYzY0bGUiKSAjIFBQQzY0TEUgYXJjaGl0ZWN0dXJlCisgIHNldChQUEM2NExFIFRSVUUpCisgIHNldChQUEM2NCBUUlVFKQorZWxzZWlmKCIke0xJQk9NUF9BUkNIfSIgU1RSRVFVQUwgImFhcmNoNjQiKSAjIEFBUkNINjQgYXJjaGl0ZWN0dXJlCisgIHNldChBQVJDSDY0IFRSVUUpCitlbHNlaWYoIiR7TElCT01QX0FSQ0h9IiBTVFJFUVVBTCAibWljIikgIyBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUKKyAgc2V0KE1JQyBUUlVFKQorZWxzZWlmKCIke0xJQk9NUF9BUkNIfSIgU1RSRVFVQUwgIm1pcHMiKSAjIE1JUFMgYXJjaGl0ZWN0dXJlCisgICAgc2V0KE1JUFMgVFJVRSkKK2Vsc2VpZigiJHtMSUJPTVBfQVJDSH0iIFNUUkVRVUFMICJtaXBzNjQiKSAjIE1JUFM2NCBhcmNoaXRlY3R1cmUKKyAgICBzZXQoTUlQUzY0IFRSVUUpCitlbmRpZigpCisKKyMgU2V0IHNvbWUgZmxhZ3MgYmFzZWQgb24gYnVpbGRfdHlwZQorc2V0KFJFTEVBU0VfQlVJTEQgRkFMU0UpCitzZXQoREVCVUdfQlVJTEQgRkFMU0UpCitzZXQoUkVMV0lUSERFQklORk9fQlVJTEQgRkFMU0UpCitzZXQoTUlOU0laRVJFTF9CVUlMRCBGQUxTRSkKK3N0cmluZyhUT0xPV0VSICIke0NNQUtFX0JVSUxEX1RZUEV9IiBsaWJvbXBfYnVpbGRfdHlwZV9sb3dlcmNhc2UpCitpZigiJHtsaWJvbXBfYnVpbGRfdHlwZV9sb3dlcmNhc2V9IiBTVFJFUVVBTCAicmVsZWFzZSIpCisgIHNldChSRUxFQVNFX0JVSUxEIFRSVUUpCitlbHNlaWYoIiR7bGlib21wX2J1aWxkX3R5cGVfbG93ZXJjYXNlfSIgU1RSRVFVQUwgImRlYnVnIikKKyAgc2V0KERFQlVHX0JVSUxEIFRSVUUpCitlbHNlaWYoIiR7bGlib21wX2J1aWxkX3R5cGVfbG93ZXJjYXNlfSIgU1RSRVFVQUwgInJlbHdpdGhkZWJpbmZvIikKKyAgc2V0KFJFTFdJVEhERUJJTkZPX0JVSUxEIFRSVUUpCitlbHNlaWYoIiR7bGlib21wX2J1aWxkX3R5cGVfbG93ZXJjYXNlfSIgU1RSRVFVQUwgIm1pbnNpemVyZWwiKQorICBzZXQoTUlOU0laRVJFTF9CVUlMRCBUUlVFKQorZW5kaWYoKQorCisjIEluY2x1ZGUgaXR0IG5vdGlmeSBpbnRlcmZhY2U/CitzZXQoTElCT01QX1VTRV9JVFRfTk9USUZZIFRSVUUgQ0FDSEUgQk9PTAorICAiRW5hYmxlIElUVCBub3RpZnk/IikKKworIyBub3JtYWwsIHByb2ZpbGUsIHN0dWJzIGxpYnJhcnkuCitzZXQoTk9STUFMX0xJQlJBUlkgRkFMU0UpCitzZXQoU1RVQlNfTElCUkFSWSBGQUxTRSkKK3NldChQUk9GSUxFX0xJQlJBUlkgRkFMU0UpCitpZigiJHtMSUJPTVBfTElCX1RZUEV9IiBTVFJFUVVBTCAibm9ybWFsIikKKyAgc2V0KE5PUk1BTF9MSUJSQVJZIFRSVUUpCitlbHNlaWYoIiR7TElCT01QX0xJQl9UWVBFfSIgU1RSRVFVQUwgInByb2ZpbGUiKQorICBzZXQoUFJPRklMRV9MSUJSQVJZIFRSVUUpCitlbHNlaWYoIiR7TElCT01QX0xJQl9UWVBFfSIgU1RSRVFVQUwgInN0dWJzIikKKyAgc2V0KFNUVUJTX0xJQlJBUlkgVFJVRSkKK2VuZGlmKCkKKworIyBTZXR0aW5nIGRpcmVjdG9yeSBuYW1lcworc2V0KExJQk9NUF9CQVNFX0RJUiAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0pCitzZXQoTElCT01QX1NSQ19ESVIgJHtMSUJPTVBfQkFTRV9ESVJ9L3NyYykKK3NldChMSUJPTVBfVE9PTFNfRElSICR7TElCT01QX0JBU0VfRElSfS90b29scykKK3NldChMSUJPTVBfSU5DX0RJUiAke0xJQk9NUF9TUkNfRElSfS9pbmNsdWRlLyR7TElCT01QX09NUF9WRVJTSU9OfSkKK3NldChMSUJPTVBfQklOQVJZX0RJUiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0pCisKKyMgRW5hYmxpbmcgRm9ydHJhbiBpZiBpdCBpcyBuZWVkZWQKK2lmKCR7TElCT01QX0ZPUlRSQU5fTU9EVUxFU30pCisgIGVuYWJsZV9sYW5ndWFnZShGb3J0cmFuKQorZW5kaWYoKQorIyBFbmFibGUgTUFTTSBDb21waWxlciBpZiBpdCBpcyBuZWVkZWQgKFdpbmRvd3Mgb25seSkKK2lmKFdJTjMyKQorICBlbmFibGVfbGFuZ3VhZ2UoQVNNX01BU00pCitlbmRpZigpCisKKyMgR2V0dGluZyBsZWdhbCB0eXBlL2FyY2gKK2xpYm9tcF9nZXRfbGVnYWxfdHlwZShMSUJPTVBfTEVHQUxfVFlQRSkKK2xpYm9tcF9nZXRfbGVnYWxfYXJjaChMSUJPTVBfTEVHQUxfQVJDSCkKKworIyBDb21waWxlciBmbGFnIGNoZWNrcywgbGlicmFyeSBjaGVja3MsIHRocmVhZGluZyBjaGVjaywgZXRjLgoraW5jbHVkZShjb25maWctaXgpCisKKyMgSXMgdGhlcmUgYSBxdWFkIHByZWNpc2lvbiBkYXRhIHR5cGUgYXZhaWxhYmxlPworIyBUT0RPOiBNYWtlIHRoaXMgYSByZWFsIGZlYXR1cmUgY2hlY2sKK3NldChMSUJPTVBfVVNFX1FVQURfUFJFQ0lTSU9OICIke0xJQk9NUF9IQVZFX1FVQURfUFJFQ0lTSU9OfSIgQ0FDSEUgQk9PTAorICAiU2hvdWxkIDEyOC1iaXQgcHJlY2lzaW9uIGVudHJ5IHBvaW50cyBiZSBidWlsdD8iKQoraWYoTElCT01QX1VTRV9RVUFEX1BSRUNJU0lPTiBBTkQgKE5PVCBMSUJPTVBfSEFWRV9RVUFEX1BSRUNJU0lPTikpCisgIGxpYm9tcF9lcnJvcl9zYXkoIjEyOC1iaXQgcXVhZCBwcmVjaXNpb24gZnVuY3Rpb25hbGl0eSByZXF1ZXN0ZWQgYnV0IG5vdCBhdmFpbGFibGUiKQorZW5kaWYoKQorCisjIGxpYmdvbXAgZHJvcC1pbiBjb21wYXRpYmlsaXR5IHJlcXVpcmVzIHZlcnNpb25lZCBzeW1ib2xzCitzZXQoTElCT01QX1VTRV9WRVJTSU9OX1NZTUJPTFMgIiR7TElCT01QX0hBVkVfVkVSU0lPTl9TWU1CT0xTfSIgQ0FDSEUgQk9PTAorICAiU2hvdWxkIHZlcnNpb24gc3ltYm9scyBiZSB1c2VkPyBUaGVzZSBwcm92aWRlIGJpbmFyeSBjb21wYXRpYmlsaXR5IHdpdGggbGliZ29tcC4iKQoraWYoTElCT01QX1VTRV9WRVJTSU9OX1NZTUJPTFMgQU5EIChOT1QgTElCT01QX0hBVkVfVkVSU0lPTl9TWU1CT0xTKSkKKyAgbGlib21wX2Vycm9yX3NheSgiVmVyc2lvbiBzeW1ib2xzIGZ1bmN0aW9uYWxpdHkgcmVxdWVzdGVkIGJ1dCBub3QgYXZhaWxhYmxlIikKK2VuZGlmKCkKKworIyBPbiBtdWx0aW5vZGUgc3lzdGVtcywgbGFyZ2VyIGFsaWdubWVudCBpcyBkZXNpcmVkIHRvIGF2b2lkIGZhbHNlIHNoYXJpbmcKK3NldChMSUJPTVBfVVNFX0lOVEVSTk9ERV9BTElHTk1FTlQgRkFMU0UgQ0FDSEUgQk9PTAorICAiU2hvdWxkIGxhcmdlciBhbGlnbm1lbnQgKDQwOTYgYnl0ZXMpIGJlIHVzZWQgZm9yIHNvbWUgbG9ja3MgYW5kIGRhdGEgc3RydWN0dXJlcz8iKQorCisjIEJ1aWxkIGNvZGUgdGhhdCBhbGxvd3MgdGhlIE9wZW5NUCBsaWJyYXJ5IHRvIGNvbnZlbmllbnRseSBpbnRlcmZhY2Ugd2l0aCBkZWJ1Z2dlcnMKK3NldChMSUJPTVBfVVNFX0RFQlVHR0VSIEZBTFNFIENBQ0hFIEJPT0wKKyAgIkVuYWJsZSBkZWJ1Z2dlciBpbnRlcmZhY2UgY29kZT8iKQorCisjIFNob3VsZCB3ZSBsaW5rIHRvIEMrKyBsaWJyYXJ5Pworc2V0KExJQk9NUF9VU0VfU1REQ1BQTElCIEZBTFNFIENBQ0hFIEJPT0wKKyAgIlNob3VsZCB3ZSBsaW5rIHRvIEMrKyBsaWJyYXJ5PyIpCisKKyMgVFNYICh4ODYpIGJhc2VkIGxvY2tzIGhhdmUgX19hc20gY29kZSB3aGljaCBjYW4gYmUgdHJvdWJsZXNvbWUgZm9yIHNvbWUgY29tcGlsZXJzLgorIyBUT0RPOiBNYWtlIHRoaXMgYSByZWFsIGZlYXR1cmUgY2hlY2sKK3NldChMSUJPTVBfVVNFX0FEQVBUSVZFX0xPQ0tTICIke0xJQk9NUF9IQVZFX0FEQVBUSVZFX0xPQ0tTfSIgQ0FDSEUgQk9PTAorICAiU2hvdWxkIFRTWC1iYXNlZCBsb2NrIGJlIGNvbXBpbGVkIChhZGFwdGl2ZSBsb2NrIGluIGttcF9sb2NrLmNwcCkuICBUaGVzZSBhcmUgeDg2IHNwZWNpZmljLiIpCitpZihMSUJPTVBfVVNFX0FEQVBUSVZFX0xPQ0tTIEFORCAoTk9UIExJQk9NUF9IQVZFX0FEQVBUSVZFX0xPQ0tTKSkKKyAgbGlib21wX2Vycm9yX3NheSgiQWRhcHRpdmUgbG9ja3MgKFRTWCkgZnVuY3Rpb25hbGl0eSByZXF1ZXN0ZWQgYnV0IG5vdCBhdmFpbGFibGUiKQorZW5kaWYoKQorCisjIC0gc3RhdHMtZ2F0aGVyaW5nIGVuYWJsZXMgT3Blbk1QIHN0YXRzIHdoZXJlIHRoaW5ncyBsaWtlIHRoZSBudW1iZXIgb2YKKyMgcGFyYWxsZWwgcmVnaW9ucywgY2xvY2sgdGlja3Mgc3BlbnQgaW4gcGFydGljdWxhciBvcGVubXAgcmVnaW9ucyBhcmUgcmVjb3JkZWQuCitzZXQoTElCT01QX1NUQVRTIEZBTFNFIENBQ0hFIEJPT0wKKyAgIlN0YXRzLUdhdGhlcmluZyBmdW5jdGlvbmFsaXR5PyIpCitpZihMSUJPTVBfU1RBVFMgQU5EIChOT1QgTElCT01QX0hBVkVfU1RBVFMpKQorICBsaWJvbXBfZXJyb3Jfc2F5KCJTdGF0cy1nYXRoZXJpbmcgZnVuY3Rpb25hbGl0eSByZXF1ZXN0ZWQgYnV0IG5vdCBhdmFpbGFibGUiKQorZW5kaWYoKQorIyBUaGUgc3RhdHMgZnVuY3Rpb25hbGl0eSByZXF1aXJlcyB0aGUgc3RkIGMrKyBsaWJyYXJ5CitpZihMSUJPTVBfU1RBVFMpCisgIHNldChMSUJPTVBfVVNFX1NURENQUExJQiBUUlVFKQorZW5kaWYoKQorCisjIFNoYXJlZCBsaWJyYXJ5IGNhbiBiZSBzd2l0Y2hlZCB0byBhIHN0YXRpYyBsaWJyYXJ5CitzZXQoTElCT01QX0VOQUJMRV9TSEFSRUQgVFJVRSBDQUNIRSBCT09MCisgICJTaGFyZWQgbGlicmFyeSBpbnN0ZWFkIG9mIHN0YXRpYyBsaWJyYXJ5PyIpCisKK2lmKFdJTjMyIEFORCBOT1QgTElCT01QX0VOQUJMRV9TSEFSRUQpCisgIGxpYm9tcF9lcnJvcl9zYXkoIlN0YXRpYyBsaWJyYXJpZXMgcmVxdWVzdGVkIGJ1dCBub3QgYXZhaWxhYmxlIG9uIFdpbmRvd3MiKQorZW5kaWYoKQorCitpZihMSUJPTVBfVVNFX0lUVF9OT1RJRlkgQU5EIE5PVCBMSUJPTVBfRU5BQkxFX1NIQVJFRCkKKyAgbWVzc2FnZShTVEFUVVMgIklUVCBOb3RpZnkgbm90IHN1cHBvcnRlZCBmb3Igc3RhdGljIGxpYnJhcmllcyAtIGZvcmNpbmcgSVRUIE5vdGlmeSBvZmYiKQorICBzZXQoTElCT01QX1VTRV9JVFRfTk9USUZZIEZBTFNFKQorZW5kaWYoKQorCisjIE9NUFQtc3VwcG9ydAorc2V0KExJQk9NUF9PTVBUX0RFQlVHIEZBTFNFIENBQ0hFIEJPT0wKKyAgIlRyYWNlIE9NUFQgaW5pdGlhbGl6YXRpb24/IikKK3NldChMSUJPTVBfT01QVF9TVVBQT1JUIEZBTFNFIENBQ0hFIEJPT0wKKyAgIk9NUFQtc3VwcG9ydD8iKQorc2V0KExJQk9NUF9PTVBUX0JMQU1FIFRSVUUgQ0FDSEUgQk9PTAorICAiT01QVC1ibGFtZT8iKQorc2V0KExJQk9NUF9PTVBUX1RSQUNFIFRSVUUgQ0FDSEUgQk9PTAorICAiT01QVC10cmFjZT8iKQoraWYoTElCT01QX09NUFRfU1VQUE9SVCBBTkQgKE5PVCBMSUJPTVBfSEFWRV9PTVBUX1NVUFBPUlQpKQorICBsaWJvbXBfZXJyb3Jfc2F5KCJPcGVuTVAgVG9vbHMgSW50ZXJmYWNlIHJlcXVlc3RlZCBidXQgbm90IGF2YWlsYWJsZSIpCitlbmRpZigpCisKKyMgVFNBTi1zdXBwb3J0CitzZXQoTElCT01QX1RTQU5fU1VQUE9SVCBGQUxTRSBDQUNIRSBCT09MCisgICJUU0FOLXN1cHBvcnQ/IikKK2lmKExJQk9NUF9UU0FOX1NVUFBPUlQgQU5EIChOT1QgTElCT01QX0hBVkVfVFNBTl9TVVBQT1JUKSkKKyAgbGlib21wX2Vycm9yX3NheSgiVFNBTiBmdW5jdGlvbmFsaXR5IHJlcXVlc3RlZCBidXQgbm90IGF2YWlsYWJsZSIpCitlbmRpZigpCisKKyMgRXJyb3IgY2hlY2sgaHdsb2Mgc3VwcG9ydCBhZnRlciBjb25maWctaXggaGFzIHJ1bgoraWYoTElCT01QX1VTRV9IV0xPQyBBTkQgKE5PVCBMSUJPTVBfSEFWRV9IV0xPQykpCisgIGxpYm9tcF9lcnJvcl9zYXkoIkh3bG9jIHJlcXVlc3RlZCBidXQgbm90IGF2YWlsYWJsZSIpCitlbmRpZigpCisKKyMgU2V0dGluZyBmaW5hbCBsaWJyYXJ5IG5hbWUKK3NldChMSUJPTVBfREVGQVVMVF9MSUJfTkFNRSBsaWJvbXApCitpZigke1BST0ZJTEVfTElCUkFSWX0pCisgIHNldChMSUJPTVBfREVGQVVMVF9MSUJfTkFNRSAke0xJQk9NUF9ERUZBVUxUX0xJQl9OQU1FfXByb2YpCitlbmRpZigpCitpZigke1NUVUJTX0xJQlJBUll9KQorICBzZXQoTElCT01QX0RFRkFVTFRfTElCX05BTUUgJHtMSUJPTVBfREVGQVVMVF9MSUJfTkFNRX1zdHVicykKK2VuZGlmKCkKK3NldChMSUJPTVBfTElCX05BTUUgJHtMSUJPTVBfREVGQVVMVF9MSUJfTkFNRX0gQ0FDSEUgU1RSSU5HICJCYXNlIE9NUCBsaWJyYXJ5IG5hbWUiKQorCitpZigke0xJQk9NUF9FTkFCTEVfU0hBUkVEfSkKKyAgc2V0KExJQk9NUF9MSUJSQVJZX1NVRkZJWCAke0NNQUtFX1NIQVJFRF9MSUJSQVJZX1NVRkZJWH0pCisgIHNldChMSUJPTVBfTElCUkFSWV9LSU5EIFNIQVJFRCkKKyAgc2V0KExJQk9NUF9JTlNUQUxMX0tJTkQgTElCUkFSWSkKK2Vsc2UoKQorICBzZXQoTElCT01QX0xJQlJBUllfU1VGRklYICR7Q01BS0VfU1RBVElDX0xJQlJBUllfU1VGRklYfSkKKyAgc2V0KExJQk9NUF9MSUJSQVJZX0tJTkQgU1RBVElDKQorICBzZXQoTElCT01QX0lOU1RBTExfS0lORCBBUkNISVZFKQorZW5kaWYoKQorCitzZXQoTElCT01QX0xJQl9GSUxFICR7TElCT01QX0xJQl9OQU1FfSR7TElCT01QX0xJQlJBUllfU1VGRklYfSkKKworIyBPcHRpb25hbCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBhbGlhc2VzLgorc2V0KExJQk9NUF9JTlNUQUxMX0FMSUFTRVMgVFJVRSBDQUNIRSBCT09MCisgICJJbnN0YWxsIGxpYmdvbXAgYW5kIGxpYmlvbXA1IGxpYnJhcnkgYWxpYXNlcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkiKQorCisjIFByaW50IGNvbmZpZ3VyYXRpb24gYWZ0ZXIgYWxsIHZhcmlhYmxlcyBhcmUgc2V0LgoraWYoJHtMSUJPTVBfU1RBTkRBTE9ORV9CVUlMRH0pCisgIGxpYm9tcF9zYXkoIk9wZXJhdGluZyBTeXN0ZW0gICAgIC0tICR7Q01BS0VfU1lTVEVNX05BTUV9IikKKyAgbGlib21wX3NheSgiVGFyZ2V0IEFyY2hpdGVjdHVyZSAgLS0gJHtMSUJPTVBfQVJDSH0iKQorICBpZigke01JQ30pCisgICAgbGlib21wX3NheSgiSW50ZWwoUikgTUlDIEFyY2hpdGVjdHVyZSAgICAtLSAke0xJQk9NUF9NSUNfQVJDSH0iKQorICBlbmRpZigpCisgIGxpYm9tcF9zYXkoIkJ1aWxkIFR5cGUgICAgICAgICAgIC0tICR7Q01BS0VfQlVJTERfVFlQRX0iKQorICBsaWJvbXBfc2F5KCJPcGVuTVAgVmVyc2lvbiAgICAgICAtLSAke0xJQk9NUF9PTVBfVkVSU0lPTn0iKQorICBsaWJvbXBfc2F5KCJMaWJyYXJ5IEtpbmQgICAgICAgICAtLSAke0xJQk9NUF9MSUJSQVJZX0tJTkR9IikKKyAgbGlib21wX3NheSgiTGlicmFyeSBUeXBlICAgICAgICAgLS0gJHtMSUJPTVBfTElCX1RZUEV9IikKKyAgbGlib21wX3NheSgiRm9ydHJhbiBNb2R1bGVzICAgICAgLS0gJHtMSUJPTVBfRk9SVFJBTl9NT0RVTEVTfSIpCisgICMgd2lsbCBzYXkgZGV2ZWxvcG1lbnQgaWYgYWxsIHplcm9zCisgIGlmKCR7TElCT01QX1ZFUlNJT05fQlVJTER9IFNUUkVRVUFMIDAwMDAwMDAwKQorICAgIHNldChMSUJPTVBfQlVJTEQgRGV2ZWxvcG1lbnQpCisgIGVsc2UoKQorICAgIHNldChMSUJPTVBfQlVJTEQgJHtMSUJPTVBfVkVSU0lPTl9CVUlMRH0pCisgIGVuZGlmKCkKKyAgbGlib21wX3NheSgiQnVpbGQgICAgICAgICAgICAgICAgLS0gJHtMSUJPTVBfQlVJTER9IikKKyAgbGlib21wX3NheSgiVXNlIFN0YXRzLWdhdGhlcmluZyAgLS0gJHtMSUJPTVBfU1RBVFN9IikKKyAgbGlib21wX3NheSgiVXNlIERlYnVnZ2VyLXN1cHBvcnQgLS0gJHtMSUJPTVBfVVNFX0RFQlVHR0VSfSIpCisgIGxpYm9tcF9zYXkoIlVzZSBJVFQgbm90aWZ5ICAgICAgIC0tICR7TElCT01QX1VTRV9JVFRfTk9USUZZfSIpCisgIGxpYm9tcF9zYXkoIlVzZSBPTVBULXN1cHBvcnQgICAgIC0tICR7TElCT01QX09NUFRfU1VQUE9SVH0iKQorICBpZigke0xJQk9NUF9PTVBUX1NVUFBPUlR9KQorICAgIGxpYm9tcF9zYXkoIlVzZSBPTVBULWJsYW1lICAgICAgIC0tICR7TElCT01QX09NUFRfQkxBTUV9IikKKyAgICBsaWJvbXBfc2F5KCJVc2UgT01QVC10cmFjZSAgICAgICAtLSAke0xJQk9NUF9PTVBUX1RSQUNFfSIpCisgIGVuZGlmKCkKKyAgbGlib21wX3NheSgiVXNlIEFkYXB0aXZlIGxvY2tzICAgLS0gJHtMSUJPTVBfVVNFX0FEQVBUSVZFX0xPQ0tTfSIpCisgIGxpYm9tcF9zYXkoIlVzZSBxdWFkIHByZWNpc2lvbiAgIC0tICR7TElCT01QX1VTRV9RVUFEX1BSRUNJU0lPTn0iKQorICBsaWJvbXBfc2F5KCJVc2UgVFNBTi1zdXBwb3J0ICAgICAtLSAke0xJQk9NUF9UU0FOX1NVUFBPUlR9IikKKyAgbGlib21wX3NheSgiVXNlIEh3bG9jIGxpYnJhcnkgICAgLS0gJHtMSUJPTVBfVVNFX0hXTE9DfSIpCitlbmRpZigpCisKK2FkZF9zdWJkaXJlY3Rvcnkoc3JjKQorYWRkX3N1YmRpcmVjdG9yeSh0ZXN0KQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9SRUFETUUudHh0IGIvZmluYWwvcnVudGltZS9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZTAxYjIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL1JFQURNRS50eHQKQEAgLTAsMCArMSwxMTYgQEAKKworICAgICAgICAgICAgICAgUkVBRE1FIGZvciB0aGUgTExWTSogT3Blbk1QKiBSdW50aW1lIExpYnJhcnkKKyAgICAgICAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0hvdyB0byBCdWlsZCBEb2N1bWVudGF0aW9uCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgbWFpbiBkb2N1bWVudGF0aW9uIGlzIGluIERveHlnZW4qIGZvcm1hdCwgYW5kIHRoaXMgZGlzdHJpYnV0aW9uCitzaG91bGQgY29tZSB3aXRoIHByZS1idWlsdCBQREYgZG9jdW1lbnRhdGlvbiBpbiBkb2MvUmVmZXJlbmNlLnBkZi4KK0hvd2V2ZXIsIGFuIEhUTUwgdmVyc2lvbiBjYW4gYmUgYnVpbHQgYnkgZXhlY3V0aW5nOgorCislIGRveHlnZW4gZG9jL2RveHlnZW4vY29uZmlnCisKK2luIHRoZSBydW50aW1lIGRpcmVjdG9yeS4KKworVGhhdCB3aWxsIHByb2R1Y2UgSFRNTCBkb2N1bWVudGF0aW9uIGluIHRoZSBkb2MvZG94eWdlbi9nZW5lcmF0ZWQKK2RpcmVjdG9yeSwgd2hpY2ggY2FuIGJlIGFjY2Vzc2VkIGJ5IHBvaW50aW5nIGEgd2ViIGJyb3dzZXIgYXQgdGhlCitpbmRleC5odG1sIGZpbGUgdGhlcmUuCisKK0lmIHlvdSBkb24ndCBoYXZlIERveHlnZW4gaW5zdGFsbGVkLCB5b3UgY2FuIGRvd25sb2FkIGl0IGZyb20KK3d3dy5kb3h5Z2VuLm9yZy4KKworCitIb3cgdG8gQnVpbGQgdGhlIExMVk0qIE9wZW5NUCogUnVudGltZSBMaWJyYXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJbi10cmVlIGJ1aWxkOgorCiskIGNkIHdoZXJlLXlvdS13YW50LXRvLWxpdmUKK0NoZWNrIG91dCBvcGVubXAgaW50byBsbHZtL3Byb2plY3RzCiskIGNkIHdoZXJlLXlvdS13YW50LXRvLWJ1aWxkCiskIG1rZGlyIGJ1aWxkICYmIGNkIGJ1aWxkCiskIGNtYWtlIHBhdGgvdG8vbGx2bSAtRENNQUtFX0NfQ09NUElMRVI9PEMgY29tcGlsZXI+IC1EQ01BS0VfQ1hYX0NPTVBJTEVSPTxDKysgY29tcGlsZXI+CiskIG1ha2Ugb21wCisKK091dC1vZi10cmVlIGJ1aWxkOgorCiskIGNkIHdoZXJlLXlvdS13YW50LXRvLWxpdmUKK0NoZWNrIG91dCBvcGVubXAKKyQgY2Qgd2hlcmUteW91LXdhbnQtdG8tbGl2ZS9vcGVubXAvcnVudGltZQorJCBta2RpciBidWlsZCAmJiBjZCBidWlsZAorJCBjbWFrZSBwYXRoL3RvL29wZW5tcCAtRENNQUtFX0NfQ09NUElMRVI9PEMgY29tcGlsZXI+IC1EQ01BS0VfQ1hYX0NPTVBJTEVSPTxDKysgY29tcGlsZXI+CiskIG1ha2UKKworRm9yIGRldGFpbHMgYWJvdXQgYnVpbGRpbmcsIHBsZWFzZSBsb29rIGF0IEJ1aWxkX1dpdGhfQ01ha2UudHh0CisKK0FyY2hpdGVjdHVyZXMgU3VwcG9ydGVkCis9PT09PT09PT09PT09PT09PT09PT09PQorKiBJQS0zMiBhcmNoaXRlY3R1cmUKKyogSW50ZWwoUikgNjQgYXJjaGl0ZWN0dXJlCisqIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZQorKiBBUk0qIGFyY2hpdGVjdHVyZQorKiBBYXJjaDY0ICg2NC1iaXQgQVJNKSBhcmNoaXRlY3R1cmUKKyogSUJNKFIpIFBvd2VyIGFyY2hpdGVjdHVyZSAoYmlnIGVuZGlhbikKKyogSUJNKFIpIFBvd2VyIGFyY2hpdGVjdHVyZSAobGl0dGxlIGVuZGlhbikKKyogTUlQUyBhbmQgTUlQUzY0IGFyY2hpdGVjdHVyZQorCitTdXBwb3J0ZWQgUlRMIEJ1aWxkIENvbmZpZ3VyYXRpb25zCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1N1cHBvcnRlZCBBcmNoaXRlY3R1cmVzOiBJQS0zMiBhcmNoaXRlY3R1cmUsIEludGVsKFIpIDY0LCBhbmQKK0ludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZQorCisgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgfCAgIGljYy9pY2wgICAgIHwgICAgZ2NjICAgICAgfCAgIGNsYW5nICAgICAgfAorLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IExpbnV4KiBPUyAgIHwgICBZZXMoMSw1KSAgICB8ICBZZXMoMiw0KSAgIHwgWWVzKDQsNiw3KSAgIHwKK3wgRnJlZUJTRCogICAgfCAgIE5vICAgICAgICAgIHwgIE5vICAgICAgICAgfCBZZXMoNCw2LDcsOCkgfAorfCBPUyBYKiAgICAgICB8ICAgWWVzKDEsMyw0KSAgfCAgTm8gICAgICAgICB8IFllcyg0LDYsNykgICB8Cit8IFdpbmRvd3MqIE9TIHwgICBZZXMoMSw0KSAgICB8ICBObyAgICAgICAgIHwgTm8gICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisoMSkgT24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbChSKSA2NCwgaWNjL2ljbCB2ZXJzaW9ucyAxMi54IGFyZQorICAgIHN1cHBvcnRlZCAoMTIuMSBpcyByZWNvbW1lbmRlZCkuCisoMikgR0NDKiB2ZXJzaW9uIDQuNyBpcyBzdXBwb3J0ZWQuCisoMykgRm9yIGljYyBvbiBPUyBYKiwgT1MgWCogdmVyc2lvbiAxMC41LjggaXMgc3VwcG9ydGVkLgorKDQpIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSBub3Qgc3VwcG9ydGVkLgorKDUpIE9uIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSwgaWNjL2ljbCB2ZXJzaW9ucyAxMy4wCisgICAgb3IgbGF0ZXIgYXJlIHJlcXVpcmVkLgorKDYpIENsYW5nKiB2ZXJzaW9uIDMuMyBpcyBzdXBwb3J0ZWQuCisoNykgQ2xhbmcqIGN1cnJlbnRseSBkb2VzIG5vdCBvZmZlciBhIHNvZnR3YXJlLWltcGxlbWVudGVkIDEyOCBiaXQgZXh0ZW5kZWQKKyAgICBwcmVjaXNpb24gdHlwZS4gIFRodXMsIGFsbCBlbnRyeSBwb2ludHMgcmVsaWFudCBvbiB0aGlzIHR5cGUgYXJlIHJlbW92ZWQKKyAgICBmcm9tIHRoZSBsaWJyYXJ5IGFuZCBjYW5ub3QgYmUgY2FsbGVkIGluIHRoZSB1c2VyIHByb2dyYW0uICBUaGUgZm9sbG93aW5nCisgICAgZnVuY3Rpb25zIGFyZSBub3QgYXZhaWxhYmxlOgorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl8qCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2XyoKKyAgICBfX2ttcGNfYXRvbWljXypfZnAKKyg4KSBDb21tdW5pdHkgY29udHJpYnV0aW9uIHByb3ZpZGVkIEFTIElTLCBub3QgdGVzdGVkIGJ5IEludGVsLgorCitTdXBwb3J0ZWQgQXJjaGl0ZWN0dXJlczogSUJNKFIpIFBvd2VyIDcgYW5kIFBvd2VyIDgKKworICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICB8ICAgZ2NjICAgICAgfCAgIGNsYW5nICAgICAgfAorLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tfAorfCBMaW51eCogT1MgICB8ICBZZXMoMSwyKSAgfCBZZXMoMyw0KSAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisoMSkgT24gUG93ZXIgNywgZ2NjIHZlcnNpb24gNC44LjIgaXMgc3VwcG9ydGVkLgorKDIpIE9uIFBvd2VyIDgsIGdjYyB2ZXJzaW9uIDQuOC4yIGlzIHN1cHBvcnRlZC4KKygzKSBPbiBQb3dlciA3LCBjbGFuZyB2ZXJzaW9uIDMuNyBpcyBzdXBwb3J0ZWQuCisoNCkgT24gUG93ZXIgOCwgY2xhbmcgdmVyc2lvbiAzLjcgaXMgc3VwcG9ydGVkLgorCisKK0Zyb250LWVuZCBDb21waWxlcnMgdGhhdCB3b3JrIHdpdGggdGhpcyBSVEwKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIGZvbGxvd2luZyBjb21waWxlcnMgYXJlIGtub3duIHRvIGRvIGNvbXBhdGlibGUgY29kZSBnZW5lcmF0aW9uIGZvcgordGhpcyBSVEw6IGNsYW5nIChmcm9tIHRoZSBPcGVuTVAgZGV2ZWxvcG1lbnQgYnJhbmNoIGF0CitodHRwOi8vY2xhbmctb21wLmdpdGh1Yi5pby8gKSwgSW50ZWwgY29tcGlsZXJzLCBHQ0MuICBTZWUgdGhlIGRvY3VtZW50YXRpb24KK2ZvciBtb3JlIGRldGFpbHMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05vdGljZXMKKz09PT09PT0KKworKk90aGVyIG5hbWVzIGFuZCBicmFuZHMgbWF5IGJlIGNsYWltZWQgYXMgdGhlIHByb3BlcnR5IG9mIG90aGVycy4KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvY21ha2UvTGlib21wQ2hlY2tGb3J0cmFuRmxhZy5jbWFrZSBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvTGlib21wQ2hlY2tGb3J0cmFuRmxhZy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzdiM2FkCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9jbWFrZS9MaWJvbXBDaGVja0ZvcnRyYW5GbGFnLmNtYWtlCkBAIC0wLDAgKzEsNzMgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyBDaGVja2luZyBhIGZvcnRyYW4gY29tcGlsZXIgZmxhZworIyBUaGVyZSBpcyBubyByZWFsIHRyaXZpYWwgd2F5IHRvIGRvIHRoaXMgaW4gQ01ha2UsIHNvIHdlIGltcGxlbWVudCBpdCBoZXJlCisjIHRoaXMgd2lsbCBoYXZlICR7Ym9vbGVhbn0gPSBUUlVFIGlmIHRoZSBmbGFnIHN1Y2NlZWRzLCBvdGhlcndpc2UgZmFsc2UuCitmdW5jdGlvbihsaWJvbXBfY2hlY2tfZm9ydHJhbl9mbGFnIGZsYWcgYm9vbGVhbikKKyAgaWYoTk9UIERFRklORUQgIiR7Ym9vbGVhbn0iKQorICAgIHNldChyZXR2YWwgVFJVRSkKKyAgICBzZXQoZm9ydHJhbl9zb3VyY2UKKyIgICAgICBwcm9ncmFtIGhlbGxvCisgICAgICAgICAgIHByaW50ICosIFwiSGVsbG8gV29ybGQhXCIKKyAgICAgIGVuZCBwcm9ncmFtIGhlbGxvIikKKworICBzZXQoZmFpbGVkX3JlZ2V4ZXMgIltFZV1ycm9yO1tVdV1ua25vd247W1NzXWtpcHBpbmciKQorICBpZihDTUFLRV9WRVJTSU9OIFZFUlNJT05fR1JFQVRFUiAzLjEgT1IgQ01BS0VfVkVSU0lPTiBWRVJTSU9OX0VRVUFMIDMuMSkKKyAgICBpbmNsdWRlKENoZWNrRm9ydHJhblNvdXJjZUNvbXBpbGVzKQorICAgIGNoZWNrX2ZvcnRyYW5fc291cmNlX2NvbXBpbGVzKCIke2ZvcnRyYW5fc291cmNlfSIgJHtib29sZWFufSBGQUlMX1JFR0VYICIke2ZhaWxlZF9yZWdleGVzfSIpCisgICAgc2V0KCR7Ym9vbGVhbn0gJHske2Jvb2xlYW59fSBQQVJFTlRfU0NPUEUpCisgICAgcmV0dXJuKCkKKyAgZWxzZSgpCisgICAgIyBPdXIgbWFudWFsIGNoZWNrIGZvciBjbWFrZSB2ZXJzaW9ucyB0aGF0IGRvbid0IGhhdmUgQ2hlY2tGb3J0cmFuU291cmNlQ29tcGlsZXMKKyAgICBzZXQoYmFzZV9kaXIgJHtDTUFLRV9CSU5BUllfRElSfSR7Q01BS0VfRklMRVNfRElSRUNUT1JZfS9DTWFrZVRtcC9mb3J0cmFuX2ZsYWdfY2hlY2spCisgICAgZmlsZShNQUtFX0RJUkVDVE9SWSAke2Jhc2VfZGlyfSkKKyAgICBmaWxlKFdSSVRFICR7YmFzZV9kaXJ9L2ZvcnRyYW5fc291cmNlLmYgIiR7Zm9ydHJhbl9zb3VyY2V9IikKKworICAgIG1lc3NhZ2UoU1RBVFVTICJQZXJmb3JtaW5nIFRlc3QgJHtib29sZWFufSIpCisgICAgZXhlY3V0ZV9wcm9jZXNzKAorICAgICAgQ09NTUFORCAke0NNQUtFX0ZvcnRyYW5fQ09NUElMRVJ9ICIke2ZsYWd9IiAke2Jhc2VfZGlyfS9mb3J0cmFuX3NvdXJjZS5mCisgICAgICBXT1JLSU5HX0RJUkVDVE9SWSAke2Jhc2VfZGlyfQorICAgICAgUkVTVUxUX1ZBUklBQkxFIGV4aXRfY29kZQorICAgICAgT1VUUFVUX1ZBUklBQkxFIE9VVFBVVAorICAgICAgRVJST1JfVkFSSUFCTEUgT1VUUFVUCisgICAgKQorCisgICAgaWYoJHtleGl0X2NvZGV9IEVRVUFMIDApCisgICAgICBmb3JlYWNoKHJlZ2V4IElOIExJU1RTIGZhaWxlZF9yZWdleGVzKQorICAgICAgICBpZigiJHtPVVRQVVR9IiBNQVRDSEVTICR7cmVnZXh9KQorICAgICAgICAgIHNldChyZXR2YWwgRkFMU0UpCisgICAgICAgIGVuZGlmKCkKKyAgICAgIGVuZGZvcmVhY2goKQorICAgIGVsc2UoKQorICAgICAgc2V0KHJldHZhbCBGQUxTRSkKKyAgICBlbmRpZigpCisKKyAgICBpZigke3JldHZhbH0pCisgICAgICBzZXQoJHtib29sZWFufSAxIENBQ0hFIElOVEVSTkFMICJUZXN0ICR7Ym9vbGVhbn0iKQorICAgICAgbWVzc2FnZShTVEFUVVMgIlBlcmZvcm1pbmcgVGVzdCAke2Jvb2xlYW59IC0gU3VjY2VzcyIpCisgICAgICBmaWxlKEFQUEVORCAke0NNQUtFX0JJTkFSWV9ESVJ9JHtDTUFLRV9GSUxFU19ESVJFQ1RPUll9L0NNYWtlT3V0cHV0LmxvZworICAgICAgICAiUGVyZm9ybWluZyBGb3J0cmFuIENvbXBpbGVyIEZsYWcgdGVzdCAke2Jvb2xlYW59IHN1Y2NlZWRlZCB3aXRoIHRoZSBmb2xsb3dpbmcgb3V0cHV0OlxuIgorICAgICAgICAiJHtPVVRQVVR9XG4iCisgICAgICAgICJTb3VyY2UgZmlsZSB3YXM6XG4ke2ZvcnRyYW5fc291cmNlfVxuIikKKyAgICBlbHNlKCkKKyAgICAgIHNldCgke2Jvb2xlYW59ICIiIENBQ0hFIElOVEVSTkFMICJUZXN0ICR7Ym9vbGVhbn0iKQorICAgICAgbWVzc2FnZShTVEFUVVMgIlBlcmZvcm1pbmcgVGVzdCAke2Jvb2xlYW59IC0gRmFpbGVkIikKKyAgICAgIGZpbGUoQVBQRU5EICR7Q01BS0VfQklOQVJZX0RJUn0ke0NNQUtFX0ZJTEVTX0RJUkVDVE9SWX0vQ01ha2VFcnJvci5sb2cKKyAgICAgICAgIlBlcmZvcm1pbmcgRm9ydHJhbiBDb21waWxlciBGbGFnIHRlc3QgJHtib29sZWFufSBmYWlsZWQgd2l0aCB0aGUgZm9sbG93aW5nIG91dHB1dDpcbiIKKyAgICAgICAgIiR7T1VUUFVUfVxuIgorICAgICAgICAiU291cmNlIGZpbGUgd2FzOlxuJHtmb3J0cmFuX3NvdXJjZX1cbiIpCisgICAgZW5kaWYoKQorICBlbmRpZigpCisKKyAgc2V0KCR7Ym9vbGVhbn0gJHtyZXR2YWx9IFBBUkVOVF9TQ09QRSkKKyAgZW5kaWYoKQorZW5kZnVuY3Rpb24oKQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9jbWFrZS9MaWJvbXBDaGVja0xpbmtlckZsYWcuY21ha2UgYi9maW5hbC9ydW50aW1lL2NtYWtlL0xpYm9tcENoZWNrTGlua2VyRmxhZy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWEzOGUzCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9jbWFrZS9MaWJvbXBDaGVja0xpbmtlckZsYWcuY21ha2UKQEAgLTAsMCArMSw2OCBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIENoZWNraW5nIGEgbGlua2VyIGZsYWcgdG8gYnVpbGQgYSBzaGFyZWQgbGlicmFyeQorIyBUaGVyZSBpcyBubyByZWFsIHRyaXZpYWwgd2F5IHRvIGRvIHRoaXMgaW4gQ01ha2UsIHNvIHdlIGltcGxlbWVudCBpdCBoZXJlCisjIHRoaXMgd2lsbCBoYXZlICR7Ym9vbGVhbn0gPSBUUlVFIGlmIHRoZSBmbGFnIHN1Y2NlZWRzLCBvdGhlcndpc2UgRkFMU0UuCitmdW5jdGlvbihsaWJvbXBfY2hlY2tfbGlua2VyX2ZsYWcgZmxhZyBib29sZWFuKQorICBpZihOT1QgREVGSU5FRCAiJHtib29sZWFufSIpCisgIHNldChyZXR2YWwgVFJVRSkKKyAgc2V0KGxpYnJhcnlfc291cmNlCisgICAgImludCBmb28oaW50IGEpIHsgcmV0dXJuIGEqYTsgfSIpCisgIHNldChjbWFrZV9zb3VyY2UKKyAgICAiY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOCkKKyAgICAgcHJvamVjdChmb28gQykKKyAgICAgc2V0KENNQUtFX1NIQVJFRF9MSU5LRVJfRkxBR1MgXCIke2ZsYWd9XCIpCisgICAgIGFkZF9saWJyYXJ5KGZvbyBTSEFSRUQgc3JjX3RvX2xpbmsuYykiKQorICBzZXQoZmFpbGVkX3JlZ2V4ZXMgIltFZV1ycm9yO1tVdV1ua25vd247W1NzXWtpcHBpbmc7TElOSyA6IHdhcm5pbmciKQorICBzZXQoYmFzZV9kaXIgJHtDTUFLRV9CSU5BUllfRElSfSR7Q01BS0VfRklMRVNfRElSRUNUT1JZfS9DTWFrZVRtcC9saW5rX2ZsYWdfY2hlY2tfJHtib29sZWFufSkKKyAgZmlsZShNQUtFX0RJUkVDVE9SWSAke2Jhc2VfZGlyfSkKKyAgZmlsZShNQUtFX0RJUkVDVE9SWSAke2Jhc2VfZGlyfS9idWlsZCkKKyAgZmlsZShXUklURSAke2Jhc2VfZGlyfS9zcmNfdG9fbGluay5jICIke2xpYnJhcnlfc291cmNlfSIpCisgIGZpbGUoV1JJVEUgJHtiYXNlX2Rpcn0vQ01ha2VMaXN0cy50eHQgIiR7Y21ha2Vfc291cmNlfSIpCisKKyAgbWVzc2FnZShTVEFUVVMgIlBlcmZvcm1pbmcgVGVzdCAke2Jvb2xlYW59IikKKyAgdHJ5X2NvbXBpbGUoCisgICAgdHJ5X2NvbXBpbGVfcmVzdWx0CisgICAgJHtiYXNlX2Rpcn0vYnVpbGQKKyAgICAke2Jhc2VfZGlyfQorICAgIGZvbworICAgIE9VVFBVVF9WQVJJQUJMRSBPVVRQVVQpCisKKyAgaWYodHJ5X2NvbXBpbGVfcmVzdWx0KQorICAgIGZvcmVhY2gocmVnZXggSU4gTElTVFMgZmFpbGVkX3JlZ2V4ZXMpCisgICAgICBpZigiJHtPVVRQVVR9IiBNQVRDSEVTICR7cmVnZXh9KQorICAgICAgICBzZXQocmV0dmFsIEZBTFNFKQorICAgICAgZW5kaWYoKQorICAgIGVuZGZvcmVhY2goKQorICBlbHNlKCkKKyAgICBzZXQocmV0dmFsIEZBTFNFKQorICBlbmRpZigpCisKKyAgaWYoJHtyZXR2YWx9KQorICAgIHNldCgke2Jvb2xlYW59IDEgQ0FDSEUgSU5URVJOQUwgIlRlc3QgJHtib29sZWFufSIpCisgICAgbWVzc2FnZShTVEFUVVMgIlBlcmZvcm1pbmcgVGVzdCAke2Jvb2xlYW59IC0gU3VjY2VzcyIpCisgICAgZmlsZShBUFBFTkQgJHtDTUFLRV9CSU5BUllfRElSfSR7Q01BS0VfRklMRVNfRElSRUNUT1JZfS9DTWFrZU91dHB1dC5sb2cKKyAgICAgICJQZXJmb3JtaW5nIEMgTGlua2VyIEZsYWcgdGVzdCAke2Jvb2xlYW59IHN1Y2NlZWRlZCB3aXRoIHRoZSBmb2xsb3dpbmcgb3V0cHV0OlxuIgorICAgICAgIiR7T1VUUFVUfVxuIgorICAgICAgIlNvdXJjZSBmaWxlIHdhczpcbiR7bGlicmFyeV9zb3VyY2V9XG4iKQorICBlbHNlKCkKKyAgICBzZXQoJHtib29sZWFufSAiIiBDQUNIRSBJTlRFUk5BTCAiVGVzdCAke2Jvb2xlYW59IikKKyAgICBtZXNzYWdlKFNUQVRVUyAiUGVyZm9ybWluZyBUZXN0ICR7Ym9vbGVhbn0gLSBGYWlsZWQiKQorICAgIGZpbGUoQVBQRU5EICR7Q01BS0VfQklOQVJZX0RJUn0ke0NNQUtFX0ZJTEVTX0RJUkVDVE9SWX0vQ01ha2VFcnJvci5sb2cKKyAgICAgICJQZXJmb3JtaW5nIEMgTGlua2VyIEZsYWcgdGVzdCAke2Jvb2xlYW59IGZhaWxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgb3V0cHV0OlxuIgorICAgICAgIiR7T1VUUFVUfVxuIgorICAgICAgIlNvdXJjZSBmaWxlIHdhczpcbiR7bGlicmFyeV9zb3VyY2V9XG4iKQorICBlbmRpZigpCisKKyAgc2V0KCR7Ym9vbGVhbn0gJHtyZXR2YWx9IFBBUkVOVF9TQ09QRSkKKyAgZW5kaWYoKQorZW5kZnVuY3Rpb24oKQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9jbWFrZS9MaWJvbXBEZWZpbml0aW9ucy5jbWFrZSBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvTGlib21wRGVmaW5pdGlvbnMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRjZmJiOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvTGlib21wRGVmaW5pdGlvbnMuY21ha2UKQEAgLTAsMCArMSwzMiBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCitmdW5jdGlvbihsaWJvbXBfZ2V0X2RlZmluaXRpb25zX2ZsYWdzIGNwcGZsYWdzKQorICBzZXQoY3BwZmxhZ3NfbG9jYWwpCisKKyAgaWYoV0lOMzIpCisgICAgbGlib21wX2FwcGVuZChjcHBmbGFnc19sb2NhbCAiLUQgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MiKQorICAgIGxpYm9tcF9hcHBlbmQoY3BwZmxhZ3NfbG9jYWwgIi1EIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSIpCisgICAgbGlib21wX2FwcGVuZChjcHBmbGFnc19sb2NhbCAiLUQgX1dJTkRPV1MiKQorICAgIGxpYm9tcF9hcHBlbmQoY3BwZmxhZ3NfbG9jYWwgIi1EIF9XSU5OVCIpCisgICAgbGlib21wX2FwcGVuZChjcHBmbGFnc19sb2NhbCAiLUQgX1dJTjMyX1dJTk5UPTB4MDUwMSIpCisgICAgbGlib21wX2FwcGVuZChjcHBmbGFnc19sb2NhbCAiLUQgX1VTUkRMTCIpCisgICAgbGlib21wX2FwcGVuZChjcHBmbGFnc19sb2NhbCAiLUQgX0lURVJBVE9SX0RFQlVHX0xFVkVMPTAiIElGX1RSVUUgREVCVUdfQlVJTEQpCisgICAgbGlib21wX2FwcGVuZChjcHBmbGFnc19sb2NhbCAiLUQgX0RFQlVHIiBJRl9UUlVFIERFQlVHX0JVSUxEKQorICBlbHNlKCkKKyAgICBsaWJvbXBfYXBwZW5kKGNwcGZsYWdzX2xvY2FsICItRCBfR05VX1NPVVJDRSIpCisgICAgbGlib21wX2FwcGVuZChjcHBmbGFnc19sb2NhbCAiLUQgX1JFRU5UUkFOVCIpCisgIGVuZGlmKCkKKworICAjIENNYWtlIGRvZXNuJ3QgaW5jbHVkZSBDUFBGTEFHUyBmcm9tIGVudmlyb25tZW50LCBidXQgd2Ugd2lsbC4KKyAgc2V0KCR7Y3BwZmxhZ3N9ICR7Y3BwZmxhZ3NfbG9jYWx9ICR7TElCT01QX0NQUEZMQUdTfSAkRU5We0NQUEZMQUdTfSBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvY21ha2UvTGlib21wRXhwb3J0cy5jbWFrZSBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvTGlib21wRXhwb3J0cy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGEzMTU5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9jbWFrZS9MaWJvbXBFeHBvcnRzLmNtYWtlCkBAIC0wLDAgKzEsMTAwIEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgTGlib21wRXhwb3J0cy5jbWFrZQorIyAgIENvcHkgbGlicmFyeSBhbmQgaGVhZGVyIGZpbGVzIGludG8gdGhlIGV4cG9ydHMvIHN1YmRpcmVjdG9yeSBhZnRlciBsaWJyYXJ5IGJ1aWxkCisKKyMgQ3JlYXRlIHRoZSBzdWZmaXggZm9yIHRoZSBleHBvcnQgZGlyZWN0b3J5CisjIC0gT25seSBhZGQgdG8gc3VmZml4IHdoZW4gbm90IGEgZGVmYXVsdCB2YWx1ZQorIyAtIEV4YW1wbGUgc3VmZml4OiAuZGViLjMwLnMxCisjICAgZmluYWwgZXhwb3J0IGRpcmVjdG9yeTogZXhwb3J0cy9saW5fMzJlLmRlYi4zMC5zMS9saWIKKyMgLSBUaGVzZSBzdWZmaXhlcyBpbXBseSB0aGUgYnVpbGQgaXMgYSBEZWJ1ZywgT3Blbk1QIDMuMCwgU3RhdHMtR2F0aGVyaW5nIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkKK3NldChsaWJvbXBfc3VmZml4KQorbGlib21wX2FwcGVuZChsaWJvbXBfc3VmZml4IC5kZWIgREVCVUdfQlVJTEQpCitsaWJvbXBfYXBwZW5kKGxpYm9tcF9zdWZmaXggLmRpYSBSRUxXSVRIREVCSU5GT19CVUlMRCkKK2xpYm9tcF9hcHBlbmQobGlib21wX3N1ZmZpeCAubWluIE1JTlNJWkVSRUxfQlVJTEQpCitpZihOT1QgIiR7TElCT01QX09NUF9WRVJTSU9OfSIgU1RSRVFVQUwgIjQ1IikKKyAgbGlib21wX2FwcGVuZChsaWJvbXBfc3VmZml4IC4ke0xJQk9NUF9PTVBfVkVSU0lPTn0pCitlbmRpZigpCitsaWJvbXBfYXBwZW5kKGxpYm9tcF9zdWZmaXggLnMxIExJQk9NUF9TVEFUUykKK2xpYm9tcF9hcHBlbmQobGlib21wX3N1ZmZpeCAub21wdCBMSUJPTVBfT01QVF9TVVBQT1JUKQoraWYoJHtMSUJPTVBfT01QVF9TVVBQT1JUfSkKKyAgbGlib21wX2FwcGVuZChsaWJvbXBfc3VmZml4IC5uby1vbXB0LWJsYW1lIElGX0ZBTFNFIExJQk9NUF9PTVBUX0JMQU1FKQorICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9zdWZmaXggLm5vLW9tcHQtdHJhY2UgSUZfRkFMU0UgTElCT01QX09NUFRfVFJBQ0UpCitlbmRpZigpCitzdHJpbmcoUkVQTEFDRSAiOyIgIiIgbGlib21wX3N1ZmZpeCAiJHtsaWJvbXBfc3VmZml4fSIpCisKKyMgU2V0IGV4cG9ydHMgbG9jYXRpb25zCitpZigke01JQ30pCisgIHNldChsaWJvbXBfcGxhdGZvcm0gIiR7TElCT01QX1BFUkxfU0NSSVBUX09TfV8ke0xJQk9NUF9NSUNfQVJDSH0iKSAjIGUuZy4sIGxpbl9rbmYsIGxpbl9rbmMKK2Vsc2UoKQorICBpZigke0lBMzJ9KQorICAgIHNldChsaWJvbXBfcGxhdGZvcm0gIiR7TElCT01QX1BFUkxfU0NSSVBUX09TfV8zMiIpCisgIGVsc2VpZigke0lOVEVMNjR9KQorICAgIHNldChsaWJvbXBfcGxhdGZvcm0gIiR7TElCT01QX1BFUkxfU0NSSVBUX09TfV8zMmUiKQorICBlbHNlKCkKKyAgICBzZXQobGlib21wX3BsYXRmb3JtICIke0xJQk9NUF9QRVJMX1NDUklQVF9PU31fJHtMSUJPTVBfQVJDSH0iKSAjIGUuZy4sIGxpbl9hcm0sIGxpbl9wcGM2NAorICBlbmRpZigpCitlbmRpZigpCitzZXQoTElCT01QX0VYUE9SVFNfRElSICIke0xJQk9NUF9CQVNFX0RJUn0vZXhwb3J0cyIpCitzZXQoTElCT01QX0VYUE9SVFNfUExBVEZPUk1fRElSICIke0xJQk9NUF9FWFBPUlRTX0RJUn0vJHtsaWJvbXBfcGxhdGZvcm19JHtsaWJvbXBfc3VmZml4fSIpCitzZXQoTElCT01QX0VYUE9SVFNfQ01OX0RJUiAiJHtMSUJPTVBfRVhQT1JUU19ESVJ9L2NvbW1vbiR7bGlib21wX3N1ZmZpeH0vaW5jbHVkZSIpCitzZXQoTElCT01QX0VYUE9SVFNfSU5DX0RJUiAiJHtMSUJPTVBfRVhQT1JUU19QTEFURk9STV9ESVJ9L2luY2x1ZGUiKQorc2V0KExJQk9NUF9FWFBPUlRTX01PRF9ESVIgIiR7TElCT01QX0VYUE9SVFNfUExBVEZPUk1fRElSfS9pbmNsdWRlX2NvbXBhdCIpCitzZXQoTElCT01QX0VYUE9SVFNfTElCX0RJUiAiJHtMSUJPTVBfRVhQT1JUU19ESVJ9LyR7bGlib21wX3BsYXRmb3JtfSR7bGlib21wX3N1ZmZpeH0vbGliIikKKworIyBQdXQgaGVhZGVycyBpbiBleHBvcnRzLyBkaXJlY3RvcnkgcG9zdCBidWlsZAorYWRkX2N1c3RvbV9jb21tYW5kKFRBUkdFVCBvbXAgUE9TVF9CVUlMRAorICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgbWFrZV9kaXJlY3RvcnkgJHtMSUJPTVBfRVhQT1JUU19DTU5fRElSfQorICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weSBvbXAuaCAke0xJQk9NUF9FWFBPUlRTX0NNTl9ESVJ9CispCitpZigke0xJQk9NUF9PTVBUX1NVUFBPUlR9KQorICBhZGRfY3VzdG9tX2NvbW1hbmQoVEFSR0VUIG9tcCBQT1NUX0JVSUxECisgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHkgb21wdC5oICR7TElCT01QX0VYUE9SVFNfQ01OX0RJUn0KKyAgKQorZW5kaWYoKQoraWYoJHtMSUJPTVBfRk9SVFJBTl9NT0RVTEVTfSkKKyAgYWRkX2N1c3RvbV9jb21tYW5kKFRBUkdFVCBsaWJvbXAtbW9kIFBPU1RfQlVJTEQKKyAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgbWFrZV9kaXJlY3RvcnkgJHtMSUJPTVBfRVhQT1JUU19NT0RfRElSfQorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5IG9tcF9saWIubW9kICR7TElCT01QX0VYUE9SVFNfTU9EX0RJUn0KKyAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weSBvbXBfbGliX2tpbmRzLm1vZCAke0xJQk9NUF9FWFBPUlRTX01PRF9ESVJ9CisgICkKKyAgYWRkX2N1c3RvbV9jb21tYW5kKFRBUkdFVCBvbXAgUE9TVF9CVUlMRAorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5IG9tcF9saWIuaCAke0xJQk9NUF9FWFBPUlRTX0NNTl9ESVJ9CisgICkKK2VuZGlmKCkKKworIyBDb3B5IE9wZW5NUCBsaWJyYXJ5IGludG8gZXhwb3J0cy8gZGlyZWN0b3J5IHBvc3QgYnVpbGQKK2lmKFdJTjMyKQorICBnZXRfdGFyZ2V0X3Byb3BlcnR5KExJQk9NUF9PVVRQVVRfRElSRUNUT1JZIG9tcCBSVU5USU1FX09VVFBVVF9ESVJFQ1RPUlkpCitlbHNlKCkKKyAgZ2V0X3RhcmdldF9wcm9wZXJ0eShMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWSBvbXAgTElCUkFSWV9PVVRQVVRfRElSRUNUT1JZKQorZW5kaWYoKQoraWYoTk9UIExJQk9NUF9PVVRQVVRfRElSRUNUT1JZKQorICBzZXQoTElCT01QX09VVFBVVF9ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9KQorZW5kaWYoKQorYWRkX2N1c3RvbV9jb21tYW5kKFRBUkdFVCBvbXAgUE9TVF9CVUlMRAorICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgbWFrZV9kaXJlY3RvcnkgJHtMSUJPTVBfRVhQT1JUU19MSUJfRElSfQorICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weSAke0xJQk9NUF9PVVRQVVRfRElSRUNUT1JZfS8ke0xJQk9NUF9MSUJfRklMRX0gJHtMSUJPTVBfRVhQT1JUU19MSUJfRElSfQorKQorCisjIENvcHkgV2luZG93cyBpbXBvcnQgbGlicmFyeSBpbnRvIGV4cG9ydHMvIGRpcmVjdG9yeSBwb3N0IGJ1aWxkCitpZihXSU4zMikKKyAgZ2V0X3RhcmdldF9wcm9wZXJ0eShMSUJPTVBJTVBfT1VUUFVUX0RJUkVDVE9SWSBvbXBpbXAgQVJDSElWRV9PVVRQVVRfRElSRUNUT1JZKQorICBpZihOT1QgTElCT01QSU1QX09VVFBVVF9ESVJFQ1RPUlkpCisgICAgc2V0KExJQk9NUElNUF9PVVRQVVRfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSkKKyAgZW5kaWYoKQorICBhZGRfY3VzdG9tX2NvbW1hbmQoVEFSR0VUIG9tcGltcCBQT1NUX0JVSUxECisgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIG1ha2VfZGlyZWN0b3J5ICR7TElCT01QX0VYUE9SVFNfTElCX0RJUn0KKyAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weSAke0xJQk9NUElNUF9PVVRQVVRfRElSRUNUT1JZfS8ke0xJQk9NUF9JTVBfTElCX0ZJTEV9ICR7TElCT01QX0VYUE9SVFNfTElCX0RJUn0KKyAgKQorZW5kaWYoKQorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL2NtYWtlL0xpYm9tcEdldEFyY2hpdGVjdHVyZS5jbWFrZSBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvTGlib21wR2V0QXJjaGl0ZWN0dXJlLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNmI0ODgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL2NtYWtlL0xpYm9tcEdldEFyY2hpdGVjdHVyZS5jbWFrZQpAQCAtMCwwICsxLDcwIEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgRGV0ZXJtaW5lIHRoZSBhcmNoaXRlY3R1cmUgZnJvbSBwcmVkZWZpbmVkIGNvbXBpbGVyIG1hY3JvcworIyBUaGUgYXJjaGl0ZWN0dXJlIG5hbWUgY2FuIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgdW5kZXJzY29yZXMgKGkuZS4sIEMgaWRlbnRpZmllcikKKworIyB2b2lkIGdldF9hcmNoaXRlY3R1cmUoc3RyaW5nKiByZXR1cm5fYXJjaCkKKyMgLSBSZXR1cm5zIHRoZSBhcmNoaXRlY3R1cmUgaW4gcmV0dXJuX2FyY2gKK2Z1bmN0aW9uKGxpYm9tcF9nZXRfYXJjaGl0ZWN0dXJlIHJldHVybl9hcmNoKQorICBzZXQoZGV0ZWN0X2FyY2hfc3JjX3R4dCAiCisgICAgI2lmIGRlZmluZWQoX19LTkNfXykKKyAgICAgICNlcnJvciBBUkNISVRFQ1RVUkU9bWljCisgICAgI2VsaWYgZGVmaW5lZChfX2FtZDY0X18pIHx8IGRlZmluZWQoX19hbWQ2NCkgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9feDg2XzY0KSB8fCBkZWZpbmVkKF9NX1g2NCkgfHwgZGVmaW5lZChfTV9BTUQ2NCkKKyAgICAgICNlcnJvciBBUkNISVRFQ1RVUkU9eDg2XzY0CisgICAgI2VsaWYgZGVmaW5lZChfX2kzODYpIHx8IGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19JQTMyX18pIHx8IGRlZmluZWQoX01fSTg2KSB8fCBkZWZpbmVkKF9NX0lYODYpIHx8IGRlZmluZWQoX19YODZfXykgfHwgZGVmaW5lZChfWDg2XykKKyAgICAgICNlcnJvciBBUkNISVRFQ1RVUkU9aTM4NgorICAgICNlbGlmIGRlZmluZWQoX19BUk1fQVJDSF83X18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF83Ul9fKSB8fCAgZGVmaW5lZChfX0FSTV9BUkNIXzdBX18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF83TV9fKSAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzdTX18pCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPWFybQorICAgICNlbGlmIGRlZmluZWQoX19BUk1fQVJDSF82X18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF82Sl9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNktfXykgIHx8IGRlZmluZWQoX19BUk1fQVJDSF82Wl9fKSAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZUMl9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNlpLX18pCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPWFybQorICAgICNlbGlmIGRlZmluZWQoX19BUk1fQVJDSF81X18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF81VF9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNUVfXykgIHx8IGRlZmluZWQoX19BUk1fQVJDSF81VEVfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzVURUpfXykKKyAgICAgICNlcnJvciBBUkNISVRFQ1RVUkU9YXJtCisgICAgI2VsaWYgZGVmaW5lZChfX0FSTV9BUkNIXzRfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzRUX18pCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPWFybQorICAgICNlbGlmIGRlZmluZWQoX19BUk1fQVJDSF8zX18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF8zTV9fKQorICAgICAgI2Vycm9yIEFSQ0hJVEVDVFVSRT1hcm0KKyAgICAjZWxpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfMl9fKQorICAgICAgI2Vycm9yIEFSQ0hJVEVDVFVSRT1hcm0KKyAgICAjZWxpZiBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX01fQVJNKSB8fCBkZWZpbmVkKF9BUk0pCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPWFybQorICAgICNlbGlmIGRlZmluZWQoX19hYXJjaDY0X18pCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPWFhcmNoNjQKKyAgICAjZWxpZiBkZWZpbmVkKF9fcG93ZXJwYzY0X18pICYmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX18pCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPXBwYzY0bGUKKyAgICAjZWxpZiBkZWZpbmVkKF9fcG93ZXJwYzY0X18pCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPXBwYzY0CisgICAgI2VsaWYgZGVmaW5lZChfX21pcHNfXykgJiYgZGVmaW5lZChfX21pcHM2NCkKKyAgICAgICNlcnJvciBBUkNISVRFQ1RVUkU9bWlwczY0CisgICAgI2VsaWYgZGVmaW5lZChfX21pcHNfXykgJiYgIWRlZmluZWQoX19taXBzNjQpCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPW1pcHMKKyAgICAjZWxzZQorICAgICAgI2Vycm9yIEFSQ0hJVEVDVFVSRT1Vbmtub3duQXJjaGl0ZWN0dXJlCisgICAgI2VuZGlmCisgICIpCisgICMgV3JpdGUgb3V0ICR7ZGV0ZWN0X2FyY2hfc3JjX3R4dH0gdG8gYSBmaWxlIHdpdGhpbiB0aGUgY21ha2UvIHN1YmRpcmVjdG9yeQorICBmaWxlKFdSSVRFICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vbGlib21wX2RldGVjdF9hcmNoLmMiICR7ZGV0ZWN0X2FyY2hfc3JjX3R4dH0pCisKKyAgIyBUcnkgdG8gY29tcGlsZSB1c2luZyB0aGUgQyBDb21waWxlci4gIEl0IHdpbGwgYWx3YXlzIGVycm9yIG91dCB3aXRoIGFuICNlcnJvciBkaXJlY3RpdmUsIHNvIHN0b3JlIGVycm9yIG91dHB1dCB0byAke2xvY2FsX2FyY2hpdGVjdHVyZX0KKyAgdHJ5X3J1bihydW5fZHVtbXkgY29tcGlsZV9kdW1teSAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9IiAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xpYm9tcF9kZXRlY3RfYXJjaC5jIiBDT01QSUxFX09VVFBVVF9WQVJJQUJMRSBsb2NhbF9hcmNoaXRlY3R1cmUpCisKKyAgIyBNYXRjaCB0aGUgaW1wb3J0YW50IGFyY2hpdGVjdHVyZSBsaW5lIGFuZCBzdG9yZSBvbmx5IHRoYXQgbWF0Y2hpbmcgc3RyaW5nIGluICR7bG9jYWxfYXJjaGl0ZWN0dXJlfQorICBzdHJpbmcoUkVHRVggTUFUQ0ggIkFSQ0hJVEVDVFVSRT0oW2EtekEtWjAtOV9dKykiIGxvY2FsX2FyY2hpdGVjdHVyZSAiJHtsb2NhbF9hcmNoaXRlY3R1cmV9IikKKworICAjIEdldCByaWQgb2YgdGhlIEFSQ0hJVEVDVFVSRT0gcGFydCBvZiB0aGUgc3RyaW5nCisgIHN0cmluZyhSRVBMQUNFICJBUkNISVRFQ1RVUkU9IiAiIiBsb2NhbF9hcmNoaXRlY3R1cmUgIiR7bG9jYWxfYXJjaGl0ZWN0dXJlfSIpCisKKyAgIyBzZXQgdGhlIHJldHVybiB2YWx1ZSB0byB0aGUgYXJjaGl0ZWN0dXJlIGRldGVjdGVkIChlLmcuLCAzMmUsIDMyLCBhcm0sIHBwYzY0LCBldGMuKQorICBzZXQoJHtyZXR1cm5fYXJjaH0gIiR7bG9jYWxfYXJjaGl0ZWN0dXJlfSIgUEFSRU5UX1NDT1BFKQorCisgICMgUmVtb3ZlICR7ZGV0ZWN0X2FyY2hfc3JjX3R4dH0gZnJvbSBjbWFrZS8gc3ViZGlyZWN0b3J5CisgIGZpbGUoUkVNT1ZFICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vbGlib21wX2RldGVjdF9hcmNoLmMiKQorZW5kZnVuY3Rpb24oKQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9jbWFrZS9MaWJvbXBIYW5kbGVGbGFncy5jbWFrZSBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvTGlib21wSGFuZGxlRmxhZ3MuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNhYTFkNQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvTGlib21wSGFuZGxlRmxhZ3MuY21ha2UKQEAgLTAsMCArMSwyMTEgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyBTZXR1cCB0aGUgZmxhZ3MgY29ycmVjdGx5IGZvciBjbWFrZSAoY292ZXJ0IHRvIHN0cmluZykKKyMgUHJldHR5IHRoZW0gdXAgKFNUUklQIGFueSBiZWdpbm5pbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UsCisjIHJlbW92ZSBkdXBsaWNhdGVzLCByZW1vdmUgZW1wdHkgZW50cmllcykKK21hY3JvKGxpYm9tcF9zZXR1cF9mbGFncyBmbGFncykKKyAgaWYoTk9UICIkeyR7ZmxhZ3N9fSIgU1RSRVFVQUwgIiIpICMgaWYgZmxhZ3MgYXJlIGVtcHR5LCBkb24ndCBkbyBhbnl0aGluZworICAgIHNldChmbGFnc19sb2NhbCkKKyAgICBsaXN0KFJFTU9WRV9EVVBMSUNBVEVTICR7ZmxhZ3N9KSAjIHJlbW92ZSBkdXBsaWNhdGVzCisgICAgbGlzdChSRU1PVkVfSVRFTSAke2ZsYWdzfSAiIikgIyByZW1vdmUgZW1wdHkgaXRlbXMKKyAgICBsaWJvbXBfbGlzdF90b19zdHJpbmcoIiR7JHtmbGFnc319IiBmbGFnc19sb2NhbCkKKyAgICBzdHJpbmcoU1RSSVAgIiR7ZmxhZ3NfbG9jYWx9IiBmbGFnc19sb2NhbCkKKyAgICBzZXQoJHtmbGFnc30gIiR7ZmxhZ3NfbG9jYWx9IikKKyAgZW5kaWYoKQorZW5kbWFjcm8oKQorCisjIEdldHMgZmxhZ3MgY29tbW9uIHRvIGJvdGggdGhlIEMgYW5kIEMrKyBjb21waWxlcgorZnVuY3Rpb24obGlib21wX2dldF9jX2FuZF9jeHhmbGFnc19jb21tb24gZmxhZ3MpCisgIHNldChmbGFnc19sb2NhbCkKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtc3RkPWMrKzExIExJQk9NUF9IQVZFX1NURF9DUFAxMV9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1mbm8tZXhjZXB0aW9ucyBMSUJPTVBfSEFWRV9GTk9fRVhDRVBUSU9OU19GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1mbm8tcnR0aSBMSUJPTVBfSEFWRV9GTk9fUlRUSV9GTEFHKQorICBpZigke0xJQk9NUF9FTkFCTEVfV0VSUk9SfSkKKyAgICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1XZXJyb3IgTElCT01QX0hBVkVfV0VSUk9SX0ZMQUcpCisgIGVuZGlmKCkKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtV25vLXNpZ24tY29tcGFyZSBMSUJPTVBfSEFWRV9XTk9fU0lHTl9DT01QQVJFX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVduby11bnVzZWQtZnVuY3Rpb24gTElCT01QX0hBVkVfV05PX1VOVVNFRF9GVU5DVElPTl9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tdW51c2VkLWxvY2FsLXR5cGVkZWYgTElCT01QX0hBVkVfV05PX1VOVVNFRF9MT0NBTF9UWVBFREVGX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVduby11bnVzZWQtdmFsdWUgTElCT01QX0hBVkVfV05PX1VOVVNFRF9WQUxVRV9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tdW51c2VkLXZhcmlhYmxlIExJQk9NUF9IQVZFX1dOT19VTlVTRURfVkFSSUFCTEVfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtV25vLXN3aXRjaCBMSUJPTVBfSEFWRV9XTk9fU1dJVENIX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVduby1jb3ZlcmVkLXN3aXRjaC1kZWZhdWx0IExJQk9NUF9IQVZFX1dOT19DT1ZFUkVEX1NXSVRDSF9ERUZBVUxUX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVduby1kZXByZWNhdGVkLXJlZ2lzdGVyIExJQk9NUF9IQVZFX1dOT19ERVBSRUNBVEVEX1JFR0lTVEVSX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVduby1nbnUtYW5vbnltb3VzLXN0cnVjdCBMSUJPTVBfSEFWRV9XTk9fR05VX0FOT05ZTU9VU19TVFJVQ1RfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtV25vLXVua25vd24tcHJhZ21hcyBMSUJPTVBfSEFWRV9XTk9fVU5LTk9XTl9QUkFHTUFTX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyBMSUJPTVBfSEFWRV9XTk9fTUlTU0lOR19GSUVMRF9JTklUSUFMSVpFUlNfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtV25vLW1pc3NpbmctYnJhY2VzIExJQk9NUF9IQVZFX1dOT19NSVNTSU5HX0JSQUNFU19GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tY29tbWVudCBMSUJPTVBfSEFWRV9XTk9fQ09NTUVOVF9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tc2VsZi1hc3NpZ24gTElCT01QX0hBVkVfV05PX1NFTEZfQVNTSUdOX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVduby12bGEtZXh0ZW5zaW9uIExJQk9NUF9IQVZFX1dOT19WTEFfRVhURU5TSU9OX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVduby1mb3JtYXQtcGVkYW50aWMgTElCT01QX0hBVkVfV05PX0ZPUk1BVF9QRURBTlRJQ19GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC9HUyBMSUJPTVBfSEFWRV9HU19GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC9FSHNjIExJQk9NUF9IQVZFX0VIU0NfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAvT3ktIExJQk9NUF9IQVZFX09ZX19GTEFHKQorICAjIEludGVsKFIpIEMgQ29tcGlsZXIgZmxhZ3MKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAvUXNhZmVzZWggTElCT01QX0hBVkVfUVNBRkVTRUhfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtUW9wdGlvbixjcHAsLS1leHRlbmRlZF9mbG9hdF90eXBlcyBMSUJPTVBfSEFWRV9FWFRFTkRFRF9GTE9BVF9UWVBFU19GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1RbG9uZ19kb3VibGUgTElCT01QX0hBVkVfTE9OR19ET1VCTEVfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtUWRpYWctZGlzYWJsZToxNzcgTElCT01QX0hBVkVfRElBR19ESVNBQkxFXzE3N19GTEFHKQorICBpZigke1JFTEVBU0VfQlVJTER9IE9SICR7UkVMV0lUSERFQklORk9fQlVJTER9KQorICAgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVFpbmxpbmUtbWluLXNpemU9MSBMSUJPTVBfSEFWRV9JTkxJTkVfTUlOX1NJWkVfRkxBRykKKyAgZW5kaWYoKQorICAjIEFyY2hpdGVjdHVyYWwgQyBhbmQgQysrIGZsYWdzCisgIGlmKCR7SUEzMn0pCisgICAgaWYoQ01BS0VfU0laRU9GX1ZPSURfUCBFUVVBTCA4KQorICAgICAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtbTMyIExJQk9NUF9IQVZFX00zMl9GTEFHKQorICAgIGVuZGlmKCkKKyAgICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC9hcmNoOlNTRTIgTElCT01QX0hBVkVfQVJDSF9TU0UyX0ZMQUcpCisgICAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtbXNzZTIgTElCT01QX0hBVkVfTVNTRTJfRkxBRykKKyAgICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1mYWxpZ24tc3RhY2s9bWFpbnRhaW4tMTYtYnl0ZSBMSUJPTVBfSEFWRV9GQUxJR05fU1RBQ0tfRkxBRykKKyAgZWxzZWlmKCR7TUlDfSkKKyAgICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1tbWljIExJQk9NUF9IQVZFX01NSUNfRkxBRykKKyAgICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1mdGxzLW1vZGVsPWluaXRpYWwtZXhlYyBMSUJPTVBfSEFWRV9GVExTX01PREVMX0ZMQUcpCisgICAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAiLW9wdC1zdHJlYW1pbmctc3RvcmVzIG5ldmVyIiBMSUJPTVBfSEFWRV9PUFRfU1RSRUFNSU5HX1NUT1JFU19GTEFHKQorICBlbmRpZigpCisgIHNldCgke2ZsYWdzfSAke2ZsYWdzX2xvY2FsfSBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMgQyBjb21waWxlciBmbGFncworZnVuY3Rpb24obGlib21wX2dldF9jZmxhZ3MgY2ZsYWdzKQorICBzZXQoY2ZsYWdzX2xvY2FsKQorICBsaWJvbXBfZ2V0X2NfYW5kX2N4eGZsYWdzX2NvbW1vbihjZmxhZ3NfbG9jYWwpCisgICMgZmxhZ3Mgb25seSBmb3IgdGhlIEMgQ29tcGlsZXIKKyAgbGlib21wX2FwcGVuZChjZmxhZ3NfbG9jYWwgL1RQIExJQk9NUF9IQVZFX1RQX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoY2ZsYWdzX2xvY2FsICIteCBjKysiIExJQk9NUF9IQVZFX1hfQ1BQX0ZMQUcpCisgIHNldChjZmxhZ3NfbG9jYWwgJHtjZmxhZ3NfbG9jYWx9ICR7TElCT01QX0NGTEFHU30pCisgIGxpYm9tcF9zZXR1cF9mbGFncyhjZmxhZ3NfbG9jYWwpCisgIHNldCgke2NmbGFnc30gJHtjZmxhZ3NfbG9jYWx9IFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKworIyBDKysgY29tcGlsZXIgZmxhZ3MKK2Z1bmN0aW9uKGxpYm9tcF9nZXRfY3h4ZmxhZ3MgY3h4ZmxhZ3MpCisgIHNldChjeHhmbGFnc19sb2NhbCkKKyAgbGlib21wX2dldF9jX2FuZF9jeHhmbGFnc19jb21tb24oY3h4ZmxhZ3NfbG9jYWwpCisgIHNldChjeHhmbGFnc19sb2NhbCAke2N4eGZsYWdzX2xvY2FsfSAke0xJQk9NUF9DWFhGTEFHU30pCisgIGxpYm9tcF9zZXR1cF9mbGFncyhjeHhmbGFnc19sb2NhbCkKKyAgc2V0KCR7Y3h4ZmxhZ3N9ICR7Y3h4ZmxhZ3NfbG9jYWx9IFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKworIyBBc3NlbWJsZXIgZmxhZ3MKK2Z1bmN0aW9uKGxpYm9tcF9nZXRfYXNtZmxhZ3MgYXNtZmxhZ3MpCisgIHNldChhc21mbGFnc19sb2NhbCkKKyAgbGlib21wX2FwcGVuZChhc21mbGFnc19sb2NhbCAiLXggYXNzZW1ibGVyLXdpdGgtY3BwIiBMSUJPTVBfSEFWRV9YX0FTU0VNQkxFUl9XSVRIX0NQUF9GTEFHKQorICAjIEFyY2hpdGVjdHVyYWwgYXNzZW1ibGVyIGZsYWdzCisgIGlmKCR7SUEzMn0pCisgICAgaWYoQ01BS0VfU0laRU9GX1ZPSURfUCBFUVVBTCA4KQorICAgICAgbGlib21wX2FwcGVuZChhc21mbGFnc19sb2NhbCAtbTMyIExJQk9NUF9IQVZFX00zMl9GTEFHKQorICAgIGVuZGlmKCkKKyAgICBsaWJvbXBfYXBwZW5kKGFzbWZsYWdzX2xvY2FsIC9zYWZlc2VoIExJQk9NUF9IQVZFX1NBRkVTRUhfTUFTTV9GTEFHKQorICAgIGxpYm9tcF9hcHBlbmQoYXNtZmxhZ3NfbG9jYWwgL2NvZmYgTElCT01QX0hBVkVfQ09GRl9NQVNNX0ZMQUcpCisgIGVsc2VpZigke01JQ30pCisgICAgbGlib21wX2FwcGVuZChhc21mbGFnc19sb2NhbCAtbW1pYyBMSUJPTVBfSEFWRV9NTUlDX0ZMQUcpCisgIGVuZGlmKCkKKyAgc2V0KGFzbWZsYWdzX2xvY2FsICR7YXNtZmxhZ3NfbG9jYWx9ICR7TElCT01QX0FTTUZMQUdTfSkKKyAgbGlib21wX3NldHVwX2ZsYWdzKGFzbWZsYWdzX2xvY2FsKQorICBzZXQoJHthc21mbGFnc30gJHthc21mbGFnc19sb2NhbH0gUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCisjIExpbmtlciBmbGFncworZnVuY3Rpb24obGlib21wX2dldF9sZGZsYWdzIGxkZmxhZ3MpCisgIHNldChsZGZsYWdzX2xvY2FsKQorICBsaWJvbXBfYXBwZW5kKGxkZmxhZ3NfbG9jYWwgIiR7Q01BS0VfTElOS19ERUZfRklMRV9GTEFHfSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8ke0xJQk9NUF9MSUJfTkFNRX0uZGVmIgorICAgIElGX0RFRklORUQgQ01BS0VfTElOS19ERUZfRklMRV9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGxkZmxhZ3NfbG9jYWwgIiR7Q01BS0VfQ19PU1hfQ1VSUkVOVF9WRVJTSU9OX0ZMQUd9JHtMSUJPTVBfVkVSU0lPTl9NQUpPUn0uJHtMSUJPTVBfVkVSU0lPTl9NSU5PUn0iCisgICAgSUZfREVGSU5FRCBDTUFLRV9DX09TWF9DVVJSRU5UX1ZFUlNJT05fRkxBRykKKyAgbGlib21wX2FwcGVuZChsZGZsYWdzX2xvY2FsICIke0NNQUtFX0NfT1NYX0NPTVBBVElCSUxJVFlfVkVSU0lPTl9GTEFHfSR7TElCT01QX1ZFUlNJT05fTUFKT1J9LiR7TElCT01QX1ZFUlNJT05fTUlOT1J9IgorICAgIElGX0RFRklORUQgQ01BS0VfQ19PU1hfQ09NUEFUSUJJTElUWV9WRVJTSU9OX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQobGRmbGFnc19sb2NhbCAtV2wsLS13YXJuLXNoYXJlZC10ZXh0cmVsIExJQk9NUF9IQVZFX1dBUk5fU0hBUkVEX1RFWFRSRUxfRkxBRykKKyAgbGlib21wX2FwcGVuZChsZGZsYWdzX2xvY2FsIC1XbCwtLWFzLW5lZWRlZCBMSUJPTVBfSEFWRV9BU19ORUVERURfRkxBRykKKyAgbGlib21wX2FwcGVuZChsZGZsYWdzX2xvY2FsICItV2wsLS12ZXJzaW9uLXNjcmlwdD0ke0xJQk9NUF9TUkNfRElSfS9leHBvcnRzX3NvLnR4dCIgTElCT01QX0hBVkVfVkVSU0lPTl9TQ1JJUFRfRkxBRykKKyAgbGlib21wX2FwcGVuZChsZGZsYWdzX2xvY2FsIC1zdGF0aWMtbGliZ2NjIExJQk9NUF9IQVZFX1NUQVRJQ19MSUJHQ0NfRkxBRykKKyAgbGlib21wX2FwcGVuZChsZGZsYWdzX2xvY2FsIC1XbCwteixub2V4ZWNzdGFjayBMSUJPTVBfSEFWRV9aX05PRVhFQ1NUQUNLX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQobGRmbGFnc19sb2NhbCAtV2wsLWZpbmk9X19rbXBfaW50ZXJuYWxfZW5kX2ZpbmkgTElCT01QX0hBVkVfRklOSV9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGxkZmxhZ3NfbG9jYWwgLW5vLWludGVsLWV4dGVuc2lvbnMgTElCT01QX0hBVkVfTk9fSU5URUxfRVhURU5TSU9OU19GTEFHKQorICBsaWJvbXBfYXBwZW5kKGxkZmxhZ3NfbG9jYWwgLXN0YXRpYy1pbnRlbCBMSUJPTVBfSEFWRV9TVEFUSUNfSU5URUxfRkxBRykKKyAgbGlib21wX2FwcGVuZChsZGZsYWdzX2xvY2FsIC9TQUZFU0VIIExJQk9NUF9IQVZFX1NBRkVTRUhfRkxBRykKKyAgIyBBcmNoaXRlY3R1cmFsIGxpbmtlciBmbGFncworICBpZigke0lBMzJ9KQorICAgIGlmKENNQUtFX1NJWkVPRl9WT0lEX1AgRVFVQUwgOCkKKyAgICAgIGxpYm9tcF9hcHBlbmQobGRmbGFnc19sb2NhbCAtbTMyIExJQk9NUF9IQVZFX00zMl9GTEFHKQorICAgIGVuZGlmKCkKKyAgICBsaWJvbXBfYXBwZW5kKGxkZmxhZ3NfbG9jYWwgLW1zc2UyIExJQk9NUF9IQVZFX01TU0UyX0ZMQUcpCisgIGVsc2VpZigke01JQ30pCisgICAgbGlib21wX2FwcGVuZChsZGZsYWdzX2xvY2FsIC1tbWljIExJQk9NUF9IQVZFX01NSUNfRkxBRykKKyAgICBsaWJvbXBfYXBwZW5kKGxkZmxhZ3NfbG9jYWwgLVdsLC14IExJQk9NUF9IQVZFX1hfRkxBRykKKyAgZW5kaWYoKQorICBzZXQobGRmbGFnc19sb2NhbCAke2xkZmxhZ3NfbG9jYWx9ICR7TElCT01QX0xERkxBR1N9KQorICBsaWJvbXBfc2V0dXBfZmxhZ3MobGRmbGFnc19sb2NhbCkKKyAgc2V0KCR7bGRmbGFnc30gJHtsZGZsYWdzX2xvY2FsfSBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMgTGlicmFyeSBmbGFncworZnVuY3Rpb24obGlib21wX2dldF9saWJmbGFncyBsaWJmbGFncykKKyAgc2V0KGxpYmZsYWdzX2xvY2FsKQorICBsaWJvbXBfYXBwZW5kKGxpYmZsYWdzX2xvY2FsICIke0NNQUtFX1RIUkVBRF9MSUJTX0lOSVR9IikKKyAgbGlib21wX2FwcGVuZChsaWJmbGFnc19sb2NhbCAiJHtMSUJPTVBfSFdMT0NfTElCUkFSWX0iIExJQk9NUF9VU0VfSFdMT0MpCisgIGlmKCR7SUEzMn0pCisgICAgbGlib21wX2FwcGVuZChsaWJmbGFnc19sb2NhbCAtbGlyY19waWMgTElCT01QX0hBVkVfSVJDX1BJQ19MSUJSQVJZKQorICBlbmRpZigpCisgIElGKCR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgIk5ldEJTRCIpCisgICAgbGlib21wX2FwcGVuZChsaWJmbGFnc19sb2NhbCAtbG0pCisgIEVORElGKCR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgIk5ldEJTRCIpCisgIHNldChsaWJmbGFnc19sb2NhbCAke2xpYmZsYWdzX2xvY2FsfSAke0xJQk9NUF9MSUJGTEFHU30pCisgIGxpYm9tcF9zZXR1cF9mbGFncyhsaWJmbGFnc19sb2NhbCkKKyAgc2V0KCR7bGliZmxhZ3N9ICR7bGliZmxhZ3NfbG9jYWx9IFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKworIyBGb3J0cmFuIGZsYWdzCitmdW5jdGlvbihsaWJvbXBfZ2V0X2ZmbGFncyBmZmxhZ3MpCisgIHNldChmZmxhZ3NfbG9jYWwpCisgIGlmKCR7SUEzMn0pCisgICAgbGlib21wX2FwcGVuZChmZmxhZ3NfbG9jYWwgLW0zMiBMSUJPTVBfSEFWRV9NMzJfRk9SVFJBTl9GTEFHKQorICBlbmRpZigpCisgIHNldChmZmxhZ3NfbG9jYWwgJHtmZmxhZ3NfbG9jYWx9ICR7TElCT01QX0ZGTEFHU30pCisgIGxpYm9tcF9zZXR1cF9mbGFncyhmZmxhZ3NfbG9jYWwpCisgIHNldCgke2ZmbGFnc30gJHtmZmxhZ3NfbG9jYWx9IFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKworIyBQZXJsIGdlbmVyYXRlLWRlZnMucGwgZmxhZ3MgKEZvciBXaW5kb3dzIG9ubHkpCitmdW5jdGlvbihsaWJvbXBfZ2V0X2dkZmxhZ3MgZ2RmbGFncykKKyAgc2V0KGdkZmxhZ3NfbG9jYWwpCisgIGlmKCR7SUEzMn0pCisgICAgc2V0KGxpYm9tcF9nZGZsYWdfYXJjaCBhcmNoXzMyKQorICBlbHNlaWYoJHtJTlRFTDY0fSkKKyAgICBzZXQobGlib21wX2dkZmxhZ19hcmNoIGFyY2hfMzJlKQorICBlbHNlKCkKKyAgICBzZXQobGlib21wX2dkZmxhZ19hcmNoIGFyY2hfJHtMSUJPTVBfQVJDSH0pCisgIGVuZGlmKCkKKyAgbGlib21wX2FwcGVuZChnZGZsYWdzX2xvY2FsICItRCAke2xpYm9tcF9nZGZsYWdfYXJjaH0iKQorICBsaWJvbXBfYXBwZW5kKGdkZmxhZ3NfbG9jYWwgIi1EIG1zdmNfY29tcGF0IikKKyAgbGlib21wX2FwcGVuZChnZGZsYWdzX2xvY2FsICItRCBub3JtIiBOT1JNQUxfTElCUkFSWSkKKyAgbGlib21wX2FwcGVuZChnZGZsYWdzX2xvY2FsICItRCBwcm9mIiBQUk9GSUxFX0xJQlJBUlkpCisgIGxpYm9tcF9hcHBlbmQoZ2RmbGFnc19sb2NhbCAiLUQgc3R1YiIgU1RVQlNfTElCUkFSWSkKKyAgbGlib21wX2FwcGVuZChnZGZsYWdzX2xvY2FsICItRCBIQVZFX1FVQUQiIExJQk9NUF9VU0VfUVVBRF9QUkVDSVNJT04pCisgIGxpYm9tcF9hcHBlbmQoZ2RmbGFnc19sb2NhbCAiLUQgVVNFX0RFQlVHR0VSIiBMSUJPTVBfVVNFX0RFQlVHR0VSKQorICBpZigke0xJQk9NUF9PTVBfVkVSU0lPTn0gR1JFQVRFUiA1MCBPUiAke0xJQk9NUF9PTVBfVkVSU0lPTn0gRVFVQUwgNTApCisgICAgbGlib21wX2FwcGVuZChnZGZsYWdzX2xvY2FsICItRCBPTVBfNTAiKQorICBlbmRpZigpCisgIGlmKCR7TElCT01QX09NUF9WRVJTSU9OfSBHUkVBVEVSIDQ1IE9SICR7TElCT01QX09NUF9WRVJTSU9OfSBFUVVBTCA0NSkKKyAgICBsaWJvbXBfYXBwZW5kKGdkZmxhZ3NfbG9jYWwgIi1EIE9NUF80NSIpCisgIGVuZGlmKCkKKyAgaWYoJHtMSUJPTVBfT01QX1ZFUlNJT059IEdSRUFURVIgNDAgT1IgJHtMSUJPTVBfT01QX1ZFUlNJT059IEVRVUFMIDQwKQorICAgIGxpYm9tcF9hcHBlbmQoZ2RmbGFnc19sb2NhbCAiLUQgT01QXzQwIikKKyAgZW5kaWYoKQorICBpZigke0xJQk9NUF9PTVBfVkVSU0lPTn0gR1JFQVRFUiAzMCBPUiAke0xJQk9NUF9PTVBfVkVSU0lPTn0gRVFVQUwgMzApCisgICAgbGlib21wX2FwcGVuZChnZGZsYWdzX2xvY2FsICItRCBPTVBfMzAiKQorICBlbmRpZigpCisgIGlmKCR7REVCVUdfQlVJTER9IE9SICR7UkVMV0lUSERFQklORk9fQlVJTER9KQorICAgIGxpYm9tcF9hcHBlbmQoZ2RmbGFnc19sb2NhbCAiLUQgS01QX0RFQlVHIikKKyAgZW5kaWYoKQorICBzZXQoJHtnZGZsYWdzfSAke2dkZmxhZ3NfbG9jYWx9IFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvY21ha2UvTGlib21wTWljcm9UZXN0cy5jbWFrZSBiL2ZpbmFsL3J1bnRpbWUvY21ha2UvTGlib21wTWljcm9UZXN0cy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTE4ZmRkCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9jbWFrZS9MaWJvbXBNaWNyb1Rlc3RzLmNtYWtlCkBAIC0wLDAgKzEsMjI4IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgVGhlIGZvbGxvd2luZyBtaWNyby10ZXN0cyBhcmUgc21hbGwgdGVzdHMgdG8gcGVyZm9ybSBvbiB0aGUgbGlicmFyeSBqdXN0IGNyZWF0ZWQuCisjIFRoZXJlIGFyZSBjdXJyZW50bHkgZml2ZSBtaWNyby10ZXN0czoKKyMgKDEpIHRlc3QtdG91Y2gKKyMgIC0gQ29tcGlsZSBhbmQgcnVuIGEgc21hbGwgcHJvZ3JhbSB1c2luZyBuZXdseSBjcmVhdGVkIGxpYm9tcCBsaWJyYXJ5CisjICAtIEZhaWxzIGlmIHRlc3QtdG91Y2guYyBkb2VzIG5vdCBjb21waWxlIG9yIGlmIHRlc3QtdG91Y2guYyBkb2VzIG5vdCBydW4gYWZ0ZXIgY29tcGlsYXRpb24KKyMgIC0gUHJvZ3JhbSBkZXBlbmRlbmNpZXM6IGdjYyBvciBnKyssIGdyZXAsIGJvdXJuZSBzaGVsbAorIyAgLSBBdmFpbGFibGUgZm9yIGFsbCBVbml4LE1hYyxXaW5kb3dzIGJ1aWxkcy4gIE5vdCBhdmFpbGFibGUgb24gSW50ZWwoUikgTUlDIEFyY2hpdGVjdHVyZSBidWlsZHMuCisjICgyKSB0ZXN0LXJlbG8KKyMgIC0gVGVzdHMgZHluYW1pYyBsaWJyYXJpZXMgZm9yIHBvc2l0aW9uLWRlcGVuZGVudCBjb2RlIChjYW4gbm90IGhhdmUgYW55IHBvc2l0aW9uIGRlcGVuZGVudCBjb2RlKQorIyAgLSBGYWlscyBpZiBURVhUUkVMIGlzIGluIG91dHB1dCBvZiByZWFkZWxmIC1kIGxpYm9tcC5zbyBjb21tYW5kCisjICAtIFByb2dyYW0gZGVwZW5kZW5jaWVzOiByZWFkZWxmLCBncmVwLCBib3VybmUgc2hlbGwKKyMgIC0gQXZhaWxhYmxlIGZvciBVbml4LCBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlIGR5bmFtaWMgbGlicmFyeSBidWlsZHMuIE5vdCBhdmFpbGFibGUgb3RoZXJ3aXNlLgorIyAoMykgdGVzdC1leGVjc3RhY2sKKyMgIC0gVGVzdHMgaWYgc3RhY2sgaXMgZXhlY3V0YWJsZQorIyAgLSBGYWlscyBpZiBzdGFjayBpcyBleGVjdXRhYmxlLiBTaG91bGQgb25seSBiZSByZWFkYWJsZSBhbmQgd3JpdGFibGUuIE5vdCBleGVjdHVhYmxlLgorIyAgLSBQcm9ncmFtIGRlcGVuZGVuY2llczogcGVybCwgcmVhZGVsZgorIyAgLSBBdmFpbGFibGUgZm9yIFVuaXggZHluYW1pYyBsaWJyYXJ5IGJ1aWxkcy4gTm90IGF2YWlsYWJsZSBvdGhlcndpc2UuCisjICg0KSB0ZXN0LWluc3RyIChJbnRlbChSKSBNSUMgQXJjaGl0ZWN1dHJlIG9ubHkpCisjICAtIFRlc3RzIEludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUgbGlicmFyaWVzIGZvciB2YWxpZCBpbnN0cnVjdGlvbiBzZXQKKyMgIC0gRmFpbHMgaWYgZmluZHMgaW52YWxpZCBpbnN0cnVjdGlvbiBmb3IgSW50ZWwoUikgTUlDIEFyY2hpdGVjdHVyZSAod2Fzbid0IGNvbXBpbGVkIHdpdGggY29ycmVjdCBmbGFncykKKyMgIC0gUHJvZ3JhbSBkZXBlbmRlbmNpZXM6IHBlcmwsIG9iamR1bXAKKyMgIC0gQXZhaWxhYmxlIGZvciBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlIGFuZCBpMzg2IGJ1aWxkcy4gTm90IGF2YWlsYWJsZSBvdGhlcndpc2UuCisjICg1KSB0ZXN0LWRlcHMKKyMgIC0gVGVzdHMgbmV3bHkgY3JlYXRlZCBsaWJvbXAgZm9yIGxpYnJhcnkgZGVwZW5kZW5jaWVzCisjICAtIEZhaWxzIGlmIHNlZXMgYSBkZXBlbmRlbmNlIG5vdCBsaXN0ZWQgaW4gdGRfZXhwIHZhcmlhYmxlIGJlbG93CisjICAtIFByb2dyYW0gZGVwZW5kZW5jaWVzOiBwZXJsLCAodW5peClyZWFkZWxmLCAobWFjKW90b29sWzY0XSwgKHdpbmRvd3MpbGluay5leGUKKyMgIC0gQXZhaWxhYmxlIGZvciBVbml4LE1hYyxXaW5kb3dzLCBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlIGR5bmFtaWMgYnVpbGRzIGFuZCBXaW5kb3dzCisjICAgIHN0YXRpYyBidWlsZHMuIE5vdCBhdmFpbGFibGUgb3RoZXJ3aXNlLgorCisjIGdldCBsaWJyYXJ5IGxvY2F0aW9uCitpZihXSU4zMikKKyAgZ2V0X3RhcmdldF9wcm9wZXJ0eShMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWSBvbXAgUlVOVElNRV9PVVRQVVRfRElSRUNUT1JZKQorICBnZXRfdGFyZ2V0X3Byb3BlcnR5KExJQk9NUElNUF9PVVRQVVRfRElSRUNUT1JZIG9tcGltcCBBUkNISVZFX09VVFBVVF9ESVJFQ1RPUlkpCisgIGlmKE5PVCBMSUJPTVBJTVBfT1VUUFVUX0RJUkVDVE9SWSkKKyAgICBzZXQoTElCT01QSU1QX09VVFBVVF9ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9KQorICBlbmRpZigpCitlbHNlKCkKKyAgZ2V0X3RhcmdldF9wcm9wZXJ0eShMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWSBvbXAgTElCUkFSWV9PVVRQVVRfRElSRUNUT1JZKQorZW5kaWYoKQoraWYoTk9UIExJQk9NUF9PVVRQVVRfRElSRUNUT1JZKQorICBzZXQoTElCT01QX09VVFBVVF9ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9KQorZW5kaWYoKQorCisjIHRlc3QtdG91Y2gKK2ZpbmRfcHJvZ3JhbShMSUJPTVBfU0hFTEwgc2gpCitpZihXSU4zMikKKyAgaWYoTElCT01QX1NIRUxMKQorICAgIHNldChsaWJvbXBfdGVzdF90b3VjaF90YXJnZXRzIHRlc3QtdG91Y2gtbWQvLnN1Y2Nlc3MgdGVzdC10b3VjaC1tdC8uc3VjY2VzcykKKyAgZW5kaWYoKQorICAjIHBpY2sgdGVzdC10b3VjaCBjb21waWxlcgorICBzZXQobGlib21wX3Rlc3RfdG91Y2hfY29tcGlsZXIgJHtDTUFLRV9DX0NPTVBJTEVSfSkKKyAgIyB0ZXN0LXRvdWNoIGNvbXBpbGF0aW9uIGZsYWdzCisgIGxpYm9tcF9hcHBlbmQobGlib21wX3Rlc3RfdG91Y2hfY2ZsYWdzIC9ub2xvZ28pCisgIGxpYm9tcF9hcHBlbmQobGlib21wX3Rlc3RfdG91Y2hfbGlicyAke0xJQk9NUElNUF9PVVRQVVRfRElSRUNUT1JZfS8ke0xJQk9NUF9JTVBfTElCX0ZJTEV9KQorICBpZigke0lBMzJ9KQorICAgIGxpYm9tcF9hcHBlbmQobGlib21wX3Rlc3RfdG91Y2hfbGRmbGFncyAvc2FmZXNlaCkKKyAgZW5kaWYoKQorZWxzZSgpICMgKFVuaXggYmFzZWQgc3lzdGVtcywgSW50ZWwoUikgTUlDIEFyY2hpdGVjdHVyZSwgYW5kIE1hYykKKyAgaWYoTElCT01QX1NIRUxMKQorICAgIHNldChsaWJvbXBfdGVzdF90b3VjaF90YXJnZXRzIHRlc3QtdG91Y2gtcnQvLnN1Y2Nlc3MpCisgIGVuZGlmKCkKKyAgIyBwaWNrIHRlc3QtdG91Y2ggY29tcGlsZXIKKyAgaWYoJHtMSUJPTVBfVVNFX1NURENQUExJQn0pCisgICAgc2V0KGxpYm9tcF90ZXN0X3RvdWNoX2NvbXBpbGVyICR7Q01BS0VfQ1hYX0NPTVBJTEVSfSkKKyAgZWxzZSgpCisgICAgc2V0KGxpYm9tcF90ZXN0X3RvdWNoX2NvbXBpbGVyICR7Q01BS0VfQ19DT01QSUxFUn0pCisgIGVuZGlmKCkKKyAgIyB0ZXN0LXRvdWNoIGNvbXBpbGF0aW9uIGZsYWdzCisgIGxpYm9tcF9hcHBlbmQobGlib21wX3Rlc3RfdG91Y2hfbGlicyAiJHtDTUFLRV9USFJFQURfTElCU19JTklUfSIpCisgIGlmKCR7SUEzMn0pCisgICAgbGlib21wX2FwcGVuZChsaWJvbXBfdGVzdF90b3VjaF9jZmxhZ3MgLW0zMiBMSUJPTVBfSEFWRV9NMzJfRkxBRykKKyAgZW5kaWYoKQorICBsaWJvbXBfYXBwZW5kKGxpYm9tcF90ZXN0X3RvdWNoX2xpYnMgJHtMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWX0vJHtMSUJPTVBfTElCX0ZJTEV9KQorICBsaWJvbXBfYXBwZW5kKGxpYm9tcF90ZXN0X3RvdWNoX2xpYnMgIiR7TElCT01QX0hXTE9DX0xJQlJBUll9IiBMSUJPTVBfVVNFX0hXTE9DKQorICBpZihBUFBMRSkKKyAgICBzZXQobGlib21wX3Rlc3RfdG91Y2hfZW52ICJEWUxEX0xJQlJBUllfUEFUSD0uOiR7TElCT01QX09VVFBVVF9ESVJFQ1RPUll9OiRFTlZ7RFlMRF9MSUJSQVJZX1BBVEh9IikKKyAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF90ZXN0X3RvdWNoX2xkZmxhZ3MgIi1XbCwtcnBhdGgsJHtMSUJPTVBfSFdMT0NfTElCUkFSWV9ESVJ9IiBMSUJPTVBfVVNFX0hXTE9DKQorICBlbHNlKCkKKyAgICBzZXQobGlib21wX3Rlc3RfdG91Y2hfZW52ICJMRF9MSUJSQVJZX1BBVEg9Ljoke0xJQk9NUF9PVVRQVVRfRElSRUNUT1JZfTokRU5We0xEX0xJQlJBUllfUEFUSH0iKQorICAgIGxpYm9tcF9hcHBlbmQobGlib21wX3Rlc3RfdG91Y2hfbGRmbGFncyAiLVdsLC1ycGF0aD0ke0xJQk9NUF9IV0xPQ19MSUJSQVJZX0RJUn0iIExJQk9NUF9VU0VfSFdMT0MpCisgIGVuZGlmKCkKK2VuZGlmKCkKK21hY3JvKGxpYm9tcF90ZXN0X3RvdWNoX3JlY2lwZSB0ZXN0X3RvdWNoX2RpcikKKyAgc2V0KGxpYm9tcF90ZXN0X3RvdWNoX2RlcGVuZGVuY2llcyAke0xJQk9NUF9TUkNfRElSfS90ZXN0LXRvdWNoLmMgb21wKQorICBzZXQobGlib21wX3Rlc3RfdG91Y2hfZXhlICR7dGVzdF90b3VjaF9kaXJ9L3Rlc3QtdG91Y2gke0NNQUtFX0VYRUNVVEFCTEVfU1VGRklYfSkKKyAgc2V0KGxpYm9tcF90ZXN0X3RvdWNoX29iaiAke3Rlc3RfdG91Y2hfZGlyfS90ZXN0LXRvdWNoJHtDTUFLRV9DX09VVFBVVF9FWFRFTlNJT059KQorICBpZihXSU4zMikKKyAgICBpZigke1JFTEVBU0VfQlVJTER9IE9SICR7UkVMV0lUSERFQklORk9fQlVJTER9KQorICAgICAgaWYoJHt0ZXN0X3RvdWNoX2Rpcn0gTUFUQ0hFUyAidGVzdC10b3VjaC1tdCIpCisgICAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX3Rlc3RfdG91Y2hfY2ZsYWdzIC9NVCkKKyAgICAgIGVsc2UoKQorICAgICAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF90ZXN0X3RvdWNoX2NmbGFncyAvTUQpCisgICAgICBlbmRpZigpCisgICAgZWxzZSgpCisgICAgICBpZigke3Rlc3RfdG91Y2hfZGlyfSBNQVRDSEVTICJ0ZXN0LXRvdWNoLW10IikKKyAgICAgICAgbGlib21wX2FwcGVuZChsaWJvbXBfdGVzdF90b3VjaF9jZmxhZ3MgL01UZCkKKyAgICAgIGVsc2UoKQorICAgICAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF90ZXN0X3RvdWNoX2NmbGFncyAvTURkKQorICAgICAgZW5kaWYoKQorICAgIGVuZGlmKCkKKyAgICBzZXQobGlib21wX3Rlc3RfdG91Y2hfb3V0X2ZsYWdzIC1GZSR7bGlib21wX3Rlc3RfdG91Y2hfZXhlfSAtRm8ke2xpYm9tcF90ZXN0X3RvdWNoX29ian0pCisgICAgbGlzdChBUFBFTkQgbGlib21wX3Rlc3RfdG91Y2hfZGVwZW5kZW5jaWVzIG9tcGltcCkKKyAgZWxzZSgpCisgICAgc2V0KGxpYm9tcF90ZXN0X3RvdWNoX291dF9mbGFncyAtbyAke2xpYm9tcF90ZXN0X3RvdWNoX2V4ZX0pCisgIGVuZGlmKCkKKyAgYWRkX2N1c3RvbV9jb21tYW5kKAorICAgIE9VVFBVVCAgJHt0ZXN0X3RvdWNoX2Rpcn0vLnN1Y2Nlc3MgJHtsaWJvbXBfdGVzdF90b3VjaF9leGV9ICR7bGlib21wX3Rlc3RfdG91Y2hfb2JqfQorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBtYWtlX2RpcmVjdG9yeSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vJHt0ZXN0X3RvdWNoX2Rpcn0KKyAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgcmVtb3ZlIC1mICR7dGVzdF90b3VjaF9kaXJ9LyoKKyAgICBDT01NQU5EICR7bGlib21wX3Rlc3RfdG91Y2hfY29tcGlsZXJ9ICR7bGlib21wX3Rlc3RfdG91Y2hfb3V0X2ZsYWdzfSAke2xpYm9tcF90ZXN0X3RvdWNoX2NmbGFnc30KKyAgICAgICR7TElCT01QX1NSQ19ESVJ9L3Rlc3QtdG91Y2guYyAke2xpYm9tcF90ZXN0X3RvdWNoX2xkZmxhZ3N9ICR7bGlib21wX3Rlc3RfdG91Y2hfbGlic30KKyAgICBDT01NQU5EICR7TElCT01QX1NIRUxMfSAtYyBcIiR7bGlib21wX3Rlc3RfdG91Y2hfZW52fSAke2xpYm9tcF90ZXN0X3RvdWNoX2V4ZX1cIgorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSB0b3VjaCAke3Rlc3RfdG91Y2hfZGlyfS8uc3VjY2VzcworICAgIERFUEVORFMgJHtsaWJvbXBfdGVzdF90b3VjaF9kZXBlbmRlbmNpZXN9CisgICkKK2VuZG1hY3JvKCkKK2xpYm9tcF9hcHBlbmQobGlib21wX3Rlc3RfdG91Y2hfZW52ICJLTVBfVkVSU0lPTj0xIikKK2FkZF9jdXN0b21fdGFyZ2V0KGxpYm9tcC10ZXN0LXRvdWNoIERFUEVORFMgJHtsaWJvbXBfdGVzdF90b3VjaF90YXJnZXRzfSkKK2lmKFdJTjMyKQorICBsaWJvbXBfdGVzdF90b3VjaF9yZWNpcGUodGVzdC10b3VjaC1tdCkKKyAgbGlib21wX3Rlc3RfdG91Y2hfcmVjaXBlKHRlc3QtdG91Y2gtbWQpCitlbHNlKCkKKyAgbGlib21wX3Rlc3RfdG91Y2hfcmVjaXBlKHRlc3QtdG91Y2gtcnQpCitlbmRpZigpCisKKyMgdGVzdC1yZWxvCithZGRfY3VzdG9tX3RhcmdldChsaWJvbXAtdGVzdC1yZWxvIERFUEVORFMgdGVzdC1yZWxvLy5zdWNjZXNzKQorYWRkX2N1c3RvbV9jb21tYW5kKAorICBPVVRQVVQgIHRlc3QtcmVsby8uc3VjY2VzcyB0ZXN0LXJlbG8vcmVhZGVsZi5sb2cKKyAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIG1ha2VfZGlyZWN0b3J5ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90ZXN0LXJlbG8KKyAgQ09NTUFORCByZWFkZWxmIC1kICR7TElCT01QX09VVFBVVF9ESVJFQ1RPUll9LyR7TElCT01QX0xJQl9GSUxFfSA+IHRlc3QtcmVsby9yZWFkZWxmLmxvZworICBDT01NQU5EIGdyZXAgLWUgVEVYVFJFTCB0ZXN0LXJlbG8vcmVhZGVsZi5sb2cgXDsgdGVzdCAkJD8gLWVxIDEKKyAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIHRvdWNoIHRlc3QtcmVsby8uc3VjY2VzcworICBERVBFTkRTIG9tcAorKQorCisjIHRlc3QtZXhlY3N0YWNrCithZGRfY3VzdG9tX3RhcmdldChsaWJvbXAtdGVzdC1leGVjc3RhY2sgREVQRU5EUyB0ZXN0LWV4ZWNzdGFjay8uc3VjY2VzcykKK2FkZF9jdXN0b21fY29tbWFuZCgKKyAgT1VUUFVUICB0ZXN0LWV4ZWNzdGFjay8uc3VjY2VzcworICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgbWFrZV9kaXJlY3RvcnkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3Rlc3QtZXhlY3N0YWNrCisgIENPTU1BTkQgJHtQRVJMX0VYRUNVVEFCTEV9ICR7TElCT01QX1RPT0xTX0RJUn0vY2hlY2stZXhlY3N0YWNrLnBsCisgICAgLS1hcmNoPSR7TElCT01QX1BFUkxfU0NSSVBUX0FSQ0h9ICR7TElCT01QX09VVFBVVF9ESVJFQ1RPUll9LyR7TElCT01QX0xJQl9GSUxFfQorICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgdG91Y2ggdGVzdC1leGVjc3RhY2svLnN1Y2Nlc3MKKyAgREVQRU5EUyBvbXAKKykKKworIyB0ZXN0LWluc3RyCithZGRfY3VzdG9tX3RhcmdldChsaWJvbXAtdGVzdC1pbnN0ciBERVBFTkRTIHRlc3QtaW5zdHIvLnN1Y2Nlc3MpCithZGRfY3VzdG9tX2NvbW1hbmQoCisgIE9VVFBVVCAgdGVzdC1pbnN0ci8uc3VjY2VzcworICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgbWFrZV9kaXJlY3RvcnkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3Rlc3QtaW5zdHIKKyAgQ09NTUFORCAke1BFUkxfRVhFQ1VUQUJMRX0gJHtMSUJPTVBfVE9PTFNfRElSfS9jaGVjay1pbnN0cnVjdGlvbi1zZXQucGwgLS1vcz0ke0xJQk9NUF9QRVJMX1NDUklQVF9PU30KKyAgICAtLWFyY2g9JHtMSUJPTVBfUEVSTF9TQ1JJUFRfQVJDSH0gLS1zaG93IC0tbWljLWFyY2g9JHtMSUJPTVBfTUlDX0FSQ0h9ICR7TElCT01QX09VVFBVVF9ESVJFQ1RPUll9LyR7TElCT01QX0xJQl9GSUxFfQorICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgdG91Y2ggdGVzdC1pbnN0ci8uc3VjY2VzcworICBERVBFTkRTIG9tcCAke0xJQk9NUF9UT09MU19ESVJ9L2NoZWNrLWluc3RydWN0aW9uLXNldC5wbAorKQorCisjIHRlc3QtZGVwcworYWRkX2N1c3RvbV90YXJnZXQobGlib21wLXRlc3QtZGVwcyBERVBFTkRTIHRlc3QtZGVwcy8uc3VjY2VzcykKK3NldChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzKQoraWYoQ01BS0VfU1lTVEVNX05BTUUgTUFUQ0hFUyAiRnJlZUJTRCIpCisgIHNldChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYmMuc28uNyBsaWJ0aHIuc28uMykKKyAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYmh3bG9jLnNvLjUgTElCT01QX1VTRV9IV0xPQykKK2Vsc2VpZihDTUFLRV9TWVNURU1fTkFNRSBNQVRDSEVTICJOZXRCU0QiKQorICBzZXQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJjLnNvLjEyIGxpYnB0aHJlYWQuc28uMSBsaWJtLnNvLjApCisgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJod2xvYy5zby41IExJQk9NUF9VU0VfSFdMT0MpCitlbHNlaWYoQVBQTEUpCisgIHNldChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIC91c3IvbGliL2xpYlN5c3RlbS5CLmR5bGliKQorZWxzZWlmKFdJTjMyKQorICBzZXQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBrZXJuZWwzMi5kbGwpCisgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBwc2FwaS5kbGwgTElCT01QX09NUFRfU1VQUE9SVCkKK2Vsc2UoKQorICBpZigke01JQ30pCisgICAgc2V0KGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGliYy5zby42IGxpYnB0aHJlYWQuc28uMCBsaWJkbC5zby4yKQorICAgIGlmKCIke0xJQk9NUF9NSUNfQVJDSH0iIFNUUkVRVUFMICJrbmYiKQorICAgICAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxkLWxpbnV4LWwxb20uc28uMikKKyAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJnY2Nfcy5zby4xKQorICAgIGVsc2VpZigiJHtMSUJPTVBfTUlDX0FSQ0h9IiBTVFJFUVVBTCAia25jIikKKyAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsZC1saW51eC1rMW9tLnNvLjIpCisgICAgZW5kaWYoKQorICBlbHNlKCkKKyAgICBzZXQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJkbC5zby4yIGxpYmdjY19zLnNvLjEpCisgICAgaWYoJHtJQTMyfSkKKyAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJjLnNvLjYpCisgICAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGQtbGludXguc28uMikKKyAgICBlbHNlaWYoJHtJTlRFTDY0fSkKKyAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJjLnNvLjYpCisgICAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGQtbGludXgteDg2LTY0LnNvLjIpCisgICAgZWxzZWlmKCR7QVJNfSkKKyAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJjLnNvLjYpCisgICAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGliZmZpLnNvLjYpCisgICAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGliZmZpLnNvLjUpCisgICAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGQtbGludXgtYXJtaGYuc28uMykKKyAgICBlbHNlaWYoJHtQUEM2NH0pCisgICAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGliYy5zby42KQorICAgICAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxkNjQuc28uMSkKKyAgICBlbHNlaWYoJHtNSVBTfSBPUiAke01JUFM2NH0pCisgICAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGliYy5zby42KQorICAgICAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxkLnNvLjEpCisgICAgZW5kaWYoKQorICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJwdGhyZWFkLnNvLjAgSUZfRkFMU0UgU1RVQlNfTElCUkFSWSkKKyAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGliaHdsb2Muc28uNSBMSUJPTVBfVVNFX0hXTE9DKQorICBlbmRpZigpCisgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJzdGRjKysuc28uNiBMSUJPTVBfVVNFX1NURENQUExJQikKKyAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYm0uc28uNiBMSUJPTVBfU1RBVFMpCitlbmRpZigpCisjIFBlcmwgc2NyaXB0IGV4cGVjdHMgY29tbWEgc2VwYXJhdGVkIGxpc3QKK3N0cmluZyhSRVBMQUNFICI7IiAiLCIgbGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyAiJHtsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzfSIpCithZGRfY3VzdG9tX2NvbW1hbmQoCisgIE9VVFBVVCAgdGVzdC1kZXBzLy5zdWNjZXNzCisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBtYWtlX2RpcmVjdG9yeSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGVzdC1kZXBzCisgIENPTU1BTkQgJHtQRVJMX0VYRUNVVEFCTEV9ICR7TElCT01QX1RPT0xTX0RJUn0vY2hlY2stZGVwZW5kcy5wbCAtLW9zPSR7TElCT01QX1BFUkxfU0NSSVBUX09TfQorICAgIC0tYXJjaD0ke0xJQk9NUF9QRVJMX1NDUklQVF9BUkNIfSAtLWV4cGVjdGVkPSIke2xpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHN9IiAke0xJQk9NUF9PVVRQVVRfRElSRUNUT1JZfS8ke0xJQk9NUF9MSUJfRklMRX0KKyAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIHRvdWNoIHRlc3QtZGVwcy8uc3VjY2VzcworICBERVBFTkRTIG9tcCAke0xJQk9NUF9UT09MU19ESVJ9L2NoZWNrLWRlcGVuZHMucGwKKykKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvY21ha2UvTGlib21wVXRpbHMuY21ha2UgYi9maW5hbC9ydW50aW1lL2NtYWtlL0xpYm9tcFV0aWxzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0Y2ZhOGMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL2NtYWtlL0xpYm9tcFV0aWxzLmNtYWtlCkBAIC0wLDAgKzEsMTk1IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgdm9pZCBsaWJvbXBfc2F5KHN0cmluZyBtZXNzYWdlX3RvX3VzZXIpOworIyAtIHByaW50cyBvdXQgbWVzc2FnZV90b191c2VyCittYWNybyhsaWJvbXBfc2F5IG1lc3NhZ2VfdG9fdXNlcikKKyAgbWVzc2FnZShTVEFUVVMgIkxJQk9NUDogJHttZXNzYWdlX3RvX3VzZXJ9IikKK2VuZG1hY3JvKCkKKworIyB2b2lkIGxpYm9tcF93YXJuaW5nX3NheShzdHJpbmcgbWVzc2FnZV90b191c2VyKTsKKyMgLSBwcmludHMgb3V0IG1lc3NhZ2VfdG9fdXNlciB3aXRoIGEgd2FybmluZworbWFjcm8obGlib21wX3dhcm5pbmdfc2F5IG1lc3NhZ2VfdG9fdXNlcikKKyAgbWVzc2FnZShXQVJOSU5HICJMSUJPTVA6ICR7bWVzc2FnZV90b191c2VyfSIpCitlbmRtYWNybygpCisKKyMgdm9pZCBsaWJvbXBfZXJyb3Jfc2F5KHN0cmluZyBtZXNzYWdlX3RvX3VzZXIpOworIyAtIHByaW50cyBvdXQgbWVzc2FnZV90b191c2VyIHdpdGggYW4gZXJyb3IgYW5kIGV4aXRzIGNtYWtlCittYWNybyhsaWJvbXBfZXJyb3Jfc2F5IG1lc3NhZ2VfdG9fdXNlcikKKyAgbWVzc2FnZShGQVRBTF9FUlJPUiAiTElCT01QOiAke21lc3NhZ2VfdG9fdXNlcn0iKQorZW5kbWFjcm8oKQorCisjIGxpYm9tcF9hcHBlbmQoPGZsYWc+IDxmbGFnc19saXN0PiBbKElGX1RSVUUgfCBJRl9GQUxTRSB8IElGX1RSVUVfMV8wICkgQk9PTEVBTl0pCisjCisjIGxpYm9tcF9hcHBlbmQoPGZsYWc+IDxmbGFnc19saXN0PikKKyMgICAtIHVuY29uZGl0aW9uYWxseSBhcHBlbmRzIDxmbGFnPiB0byB0aGUgbGlzdCBvZiBkZWZpbml0aW9ucworIworIyBsaWJvbXBfYXBwZW5kKDxmbGFnPiA8ZmxhZ3NfbGlzdD4gPEJPT0xFQU4+KQorIyAgIC0gYXBwZW5kcyA8ZmxhZz4gdG8gdGhlIGxpc3Qgb2YgZGVmaW5pdGlvbnMgaWYgQk9PTEVBTiBpcyB0cnVlCisjCisjIGxpYm9tcF9hcHBlbmQoPGZsYWc+IDxmbGFnc19saXN0PiBJRl9UUlVFIDxCT09MRUFOPikKKyMgICAtIGFwcGVuZHMgPGZsYWc+IHRvIHRoZSBsaXN0IG9mIGRlZmluaXRpb25zIGlmIEJPT0xFQU4gaXMgdHJ1ZQorIworIyBsaWJvbXBfYXBwZW5kKDxmbGFnPiA8ZmxhZ3NfbGlzdD4gSUZfRkFMU0UgPEJPT0xFQU4+KQorIyAgIC0gYXBwZW5kcyA8ZmxhZz4gdG8gdGhlIGxpc3Qgb2YgZGVmaW5pdGlvbnMgaWYgQk9PTEVBTiBpcyBmYWxzZQorIworIyBsaWJvbXBfYXBwZW5kKDxmbGFnPiA8ZmxhZ3NfbGlzdD4gSUZfREVGSU5FRCA8VkFSSUFCTEU+KQorIyAgIC0gYXBwZW5kcyA8ZmxhZz4gdG8gdGhlIGxpc3Qgb2YgZGVmaW5pdGlvbnMgaWYgVkFSSUFCTEUgaXMgZGVmaW5lZAorIworIyBsaWJvbXBfYXBwZW5kKDxmbGFnPiA8ZmxhZ3NfbGlzdD4gSUZfVFJVRV8xXzAgPEJPT0xFQU4+KQorIyAgIC0gYXBwZW5kcyA8ZmxhZz49MSB0byB0aGUgbGlzdCBvZiBkZWZpbml0aW9ucyBpZiA8Qk9PTEVBTj4gaXMgdHJ1ZSwgPGZsYWc+PTAgb3RoZXJ3aXNlCisjIGUuZy4sIGxpYm9tcF9hcHBlbmQoIi1EIFVTRV9GRUFUVVJFIiBJRl9UUlVFXzFfMCBIQVZFX0ZFQVRVUkUpCisjICAgICBhcHBlbmRzICItRCBVU0VfRkVBVFVSRT0xIiBpZiBIQVZFX0ZFQVRVUkUgaXMgdHJ1ZQorIyAgICAgb3IgIi1EIFVTRV9GRUFUVVJFPTAiIGlmIEhBVkVfRkVBVFVSRSBpcyBmYWxzZQorbWFjcm8obGlib21wX2FwcGVuZCBmbGFncyBmbGFnKQorICBpZihOT1QgKCR7QVJHQ30gRVFVQUwgMiBPUiAke0FSR0N9IEVRVUFMIDMgT1IgJHtBUkdDfSBFUVVBTCA0KSkKKyAgICBsaWJvbXBfZXJyb3Jfc2F5KCJsaWJvbXBfYXBwZW5kOiB0YWtlcyAyLCAzLCBvciA0IGFyZ3VtZW50cyIpCisgIGVuZGlmKCkKKyAgaWYoJHtBUkdDfSBFUVVBTCAyKQorICAgIGxpc3QoQVBQRU5EICR7ZmxhZ3N9ICIke2ZsYWd9IikKKyAgZWxzZWlmKCR7QVJHQ30gRVFVQUwgMykKKyAgICBpZigke0FSR1YyfSkKKyAgICAgIGxpc3QoQVBQRU5EICR7ZmxhZ3N9ICIke2ZsYWd9IikKKyAgICBlbmRpZigpCisgIGVsc2UoKQorICAgIGlmKCR7QVJHVjJ9IFNUUkVRVUFMICJJRl9UUlVFIikKKyAgICAgIGlmKCR7QVJHVjN9KQorICAgICAgICBsaXN0KEFQUEVORCAke2ZsYWdzfSAiJHtmbGFnfSIpCisgICAgICBlbmRpZigpCisgICAgZWxzZWlmKCR7QVJHVjJ9IFNUUkVRVUFMICJJRl9GQUxTRSIpCisgICAgICBpZihOT1QgJHtBUkdWM30pCisgICAgICAgIGxpc3QoQVBQRU5EICR7ZmxhZ3N9ICIke2ZsYWd9IikKKyAgICAgIGVuZGlmKCkKKyAgICBlbHNlaWYoJHtBUkdWMn0gU1RSRVFVQUwgIklGX0RFRklORUQiKQorICAgICAgaWYoREVGSU5FRCAke0FSR1YzfSkKKyAgICAgICAgbGlzdChBUFBFTkQgJHtmbGFnc30gIiR7ZmxhZ30iKQorICAgICAgZW5kaWYoKQorICAgIGVsc2VpZigke0FSR1YyfSBTVFJFUVVBTCAiSUZfVFJVRV8xXzAiKQorICAgICAgaWYoJHtBUkdWM30pCisgICAgICAgIGxpc3QoQVBQRU5EICR7ZmxhZ3N9ICIke2ZsYWd9PTEiKQorICAgICAgZWxzZSgpCisgICAgICAgIGxpc3QoQVBQRU5EICR7ZmxhZ3N9ICIke2ZsYWd9PTAiKQorICAgICAgZW5kaWYoKQorICAgIGVsc2UoKQorICAgICAgbGlib21wX2Vycm9yX3NheSgibGlib21wX2FwcGVuZDogdGhpcmQgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgSUZfVFJVRSwgSUZfRkFMU0UsIElGX0RFRklORUQsIElGX1RSVUVfMV8wIikKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKK2VuZG1hY3JvKCkKKworIyB2b2lkIGxpYm9tcF9nZXRfbGVnYWxfYXJjaChzdHJpbmcqIHJldHVybl9hcmNoX3N0cmluZyk7CisjIC0gcmV0dXJucyAodGhyb3VnaCByZXR1cm5fYXJjaF9zdHJpbmcpIHRoZSBmb3JtYWwgYXJjaGl0ZWN0dXJlCisjICAgc3RyaW5nIG9yIHdhcm5zIHVzZXIgb2YgdW5rbm93biBhcmNoaXRlY3R1cmUKK2Z1bmN0aW9uKGxpYm9tcF9nZXRfbGVnYWxfYXJjaCByZXR1cm5fYXJjaF9zdHJpbmcpCisgIGlmKCR7SUEzMn0pCisgICAgc2V0KCR7cmV0dXJuX2FyY2hfc3RyaW5nfSAiSUEtMzIiIFBBUkVOVF9TQ09QRSkKKyAgZWxzZWlmKCR7SU5URUw2NH0pCisgICAgc2V0KCR7cmV0dXJuX2FyY2hfc3RyaW5nfSAiSW50ZWwoUikgNjQiIFBBUkVOVF9TQ09QRSkKKyAgZWxzZWlmKCR7TUlDfSkKKyAgICBzZXQoJHtyZXR1cm5fYXJjaF9zdHJpbmd9ICJJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUiIFBBUkVOVF9TQ09QRSkKKyAgZWxzZWlmKCR7QVJNfSkKKyAgICBzZXQoJHtyZXR1cm5fYXJjaF9zdHJpbmd9ICJBUk0iIFBBUkVOVF9TQ09QRSkKKyAgZWxzZWlmKCR7UFBDNjRCRX0pCisgICAgc2V0KCR7cmV0dXJuX2FyY2hfc3RyaW5nfSAiUFBDNjRCRSIgUEFSRU5UX1NDT1BFKQorICBlbHNlaWYoJHtQUEM2NExFfSkKKyAgICBzZXQoJHtyZXR1cm5fYXJjaF9zdHJpbmd9ICJQUEM2NExFIiBQQVJFTlRfU0NPUEUpCisgIGVsc2VpZigke0FBUkNINjR9KQorICAgIHNldCgke3JldHVybl9hcmNoX3N0cmluZ30gIkFBUkNINjQiIFBBUkVOVF9TQ09QRSkKKyAgZWxzZWlmKCR7TUlQU30pCisgICAgc2V0KCR7cmV0dXJuX2FyY2hfc3RyaW5nfSAiTUlQUyIgUEFSRU5UX1NDT1BFKQorICBlbHNlaWYoJHtNSVBTNjR9KQorICAgIHNldCgke3JldHVybl9hcmNoX3N0cmluZ30gIk1JUFM2NCIgUEFSRU5UX1NDT1BFKQorICBlbHNlKCkKKyAgICBzZXQoJHtyZXR1cm5fYXJjaF9zdHJpbmd9ICIke0xJQk9NUF9BUkNIfSIgUEFSRU5UX1NDT1BFKQorICAgIGxpYm9tcF93YXJuaW5nX3NheSgibGlib21wX2dldF9sZWdhbF9hcmNoKCk6IFdhcm5pbmc6IFVua25vd24gYXJjaGl0ZWN0dXJlOiBVc2luZyAke0xJQk9NUF9BUkNIfSIpCisgIGVuZGlmKCkKK2VuZGZ1bmN0aW9uKCkKKworIyB2b2lkIGxpYm9tcF9jaGVja192YXJpYWJsZShzdHJpbmcgdmFyLCAuLi4pOworIyAtIHJ1bnMgdGhyb3VnaCBhbGwgdmFsdWVzIGNoZWNraW5nIGlmICR7dmFyfSA9PSB2YWx1ZQorIyAtIHVwcGVyY2FzZSBhbmQgbG93ZXJjYXNlIGRvIG5vdCBtYXR0ZXIKKyMgLSBpZiB0aGUgdmFyIGlzIGZvdW5kLCB0aGVuIGp1c3QgcHJpbnQgaXQgb3V0CisjIC0gaWYgdGhlIHZhciBpcyBub3QgZm91bmQsIHRoZW4gZXJyb3Igb3V0CitmdW5jdGlvbihsaWJvbXBfY2hlY2tfdmFyaWFibGUgdmFyKQorICBzZXQodmFsaWRfZmxhZyAwKQorICBzdHJpbmcoVE9MT1dFUiAiJHske3Zhcn19IiB2YXJfbG93ZXIpCisgIGZvcmVhY2godmFsdWUgSU4gTElTVFMgQVJHTikKKyAgICBzdHJpbmcoVE9MT1dFUiAiJHt2YWx1ZX0iIHZhbHVlX2xvd2VyKQorICAgIGlmKCIke3Zhcl9sb3dlcn0iIFNUUkVRVUFMICIke3ZhbHVlX2xvd2VyfSIpCisgICAgICBzZXQodmFsaWRfZmxhZyAxKQorICAgICAgc2V0KHRoZV92YWx1ZSAiJHt2YWx1ZX0iKQorICAgIGVuZGlmKCkKKyAgZW5kZm9yZWFjaCgpCisgIGlmKCR7dmFsaWRfZmxhZ30gRVFVQUwgMCkKKyAgICBsaWJvbXBfZXJyb3Jfc2F5KCJsaWJvbXBfY2hlY2tfdmFyaWFibGUoKTogJHt2YXJ9ID0gJHske3Zhcn19IGlzIHVua25vd24iKQorICBlbmRpZigpCitlbmRmdW5jdGlvbigpCisKKyMgdm9pZCBsaWJvbXBfZ2V0X2J1aWxkX251bWJlcihzdHJpbmcgc3JjX2Rpciwgc3RyaW5nKiByZXR1cm5fYnVpbGRfbnVtYmVyKTsKKyMgLSBncmFiIHRoZSBlaWdodCBkaWdpdCBidWlsZCBudW1iZXIgKG9yIDAwMDAwMDAwKSBmcm9tIGttcF92ZXJzaW9uLmNwcAorZnVuY3Rpb24obGlib21wX2dldF9idWlsZF9udW1iZXIgc3JjX2RpciByZXR1cm5fYnVpbGRfbnVtYmVyKQorICAjIHNldHMgZmlsZV9saW5lc19saXN0IHRvIGEgbGlzdCBvZiBhbGwgbGluZXMgaW4ga21wX3ZlcnNpb24uY3BwCisgIGZpbGUoU1RSSU5HUyAiJHtzcmNfZGlyfS9zcmMva21wX3ZlcnNpb24uY3BwIiBmaWxlX2xpbmVzX2xpc3QpCisKKyAgIyBydW5zIHRocm91Z2ggZWFjaCBsaW5lIGluIGttcF92ZXJzaW9uLmNwcAorICBmb3JlYWNoKGxpbmUgSU4gTElTVFMgZmlsZV9saW5lc19saXN0KQorICAgICMgaWYgdGhlIGxpbmUgYmVnaW5zIHdpdGggIiNkZWZpbmUgS01QX1ZFUlNJT05fQlVJTEQiIHRoZW4gd2UgdGFrZSBub3Qgb2YgdGhlIGJ1aWxkIG51bWJlcgorICAgIHN0cmluZyhSRUdFWCBNQVRDSCAiXlsgXHRdKiNkZWZpbmVbIFx0XStLTVBfVkVSU0lPTl9CVUlMRCIgdmFsaWQgIiR7bGluZX0iKQorICAgIGlmKE5PVCAiJHt2YWxpZH0iIFNUUkVRVUFMICIiKSAjIGlmIHdlIG1hdGNoZWQgIiNkZWZpbmUgS01QX1ZFUlNJT05fQlVJTEQiLCB0aGVuIGdyYWIgdGhlIGJ1aWxkIG51bWJlcgorICAgICAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIl5bIFx0XSojZGVmaW5lWyBcdF0rS01QX1ZFUlNJT05fQlVJTERbIFx0XSsoWzAtOV0rKSIgIlxcMSIKKyAgICAgICAgICAgYnVpbGRfbnVtYmVyICIke2xpbmV9IgorICAgICAgKQorICAgIGVuZGlmKCkKKyAgZW5kZm9yZWFjaCgpCisgIHNldCgke3JldHVybl9idWlsZF9udW1iZXJ9ICIke2J1aWxkX251bWJlcn0iIFBBUkVOVF9TQ09QRSkgIyByZXR1cm4gYnVpbGQgbnVtYmVyCitlbmRmdW5jdGlvbigpCisKKyMgdm9pZCBsaWJvbXBfZ2V0X2xlZ2FsX3R5cGUoc3RyaW5nKiByZXR1cm5fbGVnYWxfdHlwZSk7CisjIC0gc2V0IHRoZSBsZWdhbCB0eXBlIG5hbWUgUGVyZm9ybWFuY2UvUHJvZmlsaW5nL1N0dWIKK2Z1bmN0aW9uKGxpYm9tcF9nZXRfbGVnYWxfdHlwZSByZXR1cm5fbGVnYWxfdHlwZSkKKyAgaWYoJHtOT1JNQUxfTElCUkFSWX0pCisgICAgc2V0KCR7cmV0dXJuX2xlZ2FsX3R5cGV9ICJQZXJmb3JtYW5jZSIgUEFSRU5UX1NDT1BFKQorICBlbHNlaWYoJHtQUk9GSUxFX0xJQlJBUll9KQorICAgIHNldCgke3JldHVybl9sZWdhbF90eXBlfSAiUHJvZmlsaW5nIiBQQVJFTlRfU0NPUEUpCisgIGVsc2VpZigke1NUVUJTX0xJQlJBUll9KQorICAgIHNldCgke3JldHVybl9sZWdhbF90eXBlfSAiU3R1YiIgUEFSRU5UX1NDT1BFKQorICBlbmRpZigpCitlbmRmdW5jdGlvbigpCisKKyMgdm9pZCBsaWJvbXBfYWRkX3N1ZmZpeChzdHJpbmcgc3VmZml4LCBsaXN0PHN0cmluZz4qIGxpc3Rfb2ZfaXRlbXMpOworIyAtIHJldHVybnMgbGlzdF9vZl9pdGVtcyB3aXRoIHN1ZmZpeCBhcHBlbmRlZCB0byBhbGwgaXRlbXMKKyMgLSBvcmlnaW5hbCBsaXN0IGlzIG1vZGlmaWVkCitmdW5jdGlvbihsaWJvbXBfYWRkX3N1ZmZpeCBzdWZmaXggbGlzdF9vZl9pdGVtcykKKyAgc2V0KGxvY2FsX2xpc3QgIiIpCisgIGZvcmVhY2goaXRlbSBJTiBMSVNUUyAiJHtsaXN0X29mX2l0ZW1zfSIpCisgICAgaWYoTk9UICIke2l0ZW19IiBTVFJFUVVBTCAiIikKKyAgICAgIGxpc3QoQVBQRU5EIGxvY2FsX2xpc3QgIiR7aXRlbX0ke3N1ZmZpeH0iKQorICAgIGVuZGlmKCkKKyAgZW5kZm9yZWFjaCgpCisgIHNldCgke2xpc3Rfb2ZfaXRlbXN9ICIke2xvY2FsX2xpc3R9IiBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMgdm9pZCBsaWJvbXBfbGlzdF90b19zdHJpbmcobGlzdDxzdHJpbmc+IGxpc3Rfb2ZfdGhpbmdzLCBzdHJpbmcqIHJldHVybl9zdHJpbmcpOworIyAtIGNvbnZlcnRzIGEgbGlzdCB0byBhIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcKK2Z1bmN0aW9uKGxpYm9tcF9saXN0X3RvX3N0cmluZyBsaXN0X29mX3RoaW5ncyByZXR1cm5fc3RyaW5nKQorICBzdHJpbmcoUkVQTEFDRSAiOyIgIiAiIG91dHB1dF92YXJpYWJsZSAiJHtsaXN0X29mX3RoaW5nc30iKQorICBzZXQoJHtyZXR1cm5fc3RyaW5nfSAiJHtvdXRwdXRfdmFyaWFibGV9IiBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMgdm9pZCBsaWJvbXBfc3RyaW5nX3RvX2xpc3Qoc3RyaW5nIHN0ciwgbGlzdDxzdHJpbmc+KiByZXR1cm5fbGlzdCk7CisjIC0gY29udmVydHMgYSBzdHJpbmcgdG8gYSBzZW1pY29sb24gc2VwYXJhdGVkIGxpc3QKKyMgLSB3aGF0IGl0IHJlYWxseSBkb2VzIGlzIGp1c3Qgc3RyaW5nX3JlcGxhY2UgYWxsIHJ1bm5pbmcgd2hpdGVzcGFjZSB0byBhIHNlbWljb2xvbgorIyAtIGluIGNtYWtlLCBhIGxpc3QgaXMgc3RyaW5ncyBzZXBhcmF0ZWQgYnkgc2VtaWNvbG9uczogaS5lLiwgbGlzdCBvZiBmb3VyIGl0ZW1zLCBsaXN0ID0gIml0ZW0xO2l0ZW0yO2l0ZW0zO2l0ZW00IgorZnVuY3Rpb24obGlib21wX3N0cmluZ190b19saXN0IHN0ciByZXR1cm5fbGlzdCkKKyAgc2V0KG91dHN0cikKKyAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIlsgXHRdKyIgIjsiIG91dHN0ciAiJHtzdHJ9IikKKyAgc2V0KCR7cmV0dXJuX2xpc3R9ICIke291dHN0cn0iIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9jbWFrZS9jb25maWctaXguY21ha2UgYi9maW5hbC9ydW50aW1lL2NtYWtlL2NvbmZpZy1peC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzc1ZDIxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9jbWFrZS9jb25maWctaXguY21ha2UKQEAgLTAsMCArMSwyNzQgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworaW5jbHVkZShDaGVja0NDb21waWxlckZsYWcpCitpbmNsdWRlKENoZWNrQ1NvdXJjZUNvbXBpbGVzKQoraW5jbHVkZShDaGVja0NYWENvbXBpbGVyRmxhZykKK2luY2x1ZGUoQ2hlY2tJbmNsdWRlRmlsZSkKK2luY2x1ZGUoQ2hlY2tMaWJyYXJ5RXhpc3RzKQoraW5jbHVkZShDaGVja0luY2x1ZGVGaWxlcykKK2luY2x1ZGUoTGlib21wQ2hlY2tMaW5rZXJGbGFnKQoraW5jbHVkZShMaWJvbXBDaGVja0ZvcnRyYW5GbGFnKQorCisjIENoZWNrIGZvciB2ZXJzaW9uZWQgc3ltYm9scworZnVuY3Rpb24obGlib21wX2NoZWNrX3ZlcnNpb25fc3ltYm9scyByZXR2YWwpCisgIHNldChzb3VyY2VfY29kZQorICAgICIjaW5jbHVkZSA8c3RkaW8uaD4KKyAgICB2b2lkIGZ1bmMxKCkgeyBwcmludGYoXCJIZWxsb1wiKTsgfQorICAgIHZvaWQgZnVuYzIoKSB7IHByaW50ZihcIldvcmxkXCIpOyB9CisgICAgX19hc21fXyhcIi5zeW12ZXIgZnVuYzEsIGZ1bmNAVkVSMVwiKTsKKyAgICBfX2FzbV9fKFwiLnN5bXZlciBmdW5jMiwgZnVuY0BWRVIyXCIpOworICAgIGludCBtYWluKCkgeworICAgICAgZnVuYzEoKTsKKyAgICAgIGZ1bmMyKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9IikKKyAgc2V0KHZlcnNpb25fc2NyaXB0X3NvdXJjZSAiVkVSMSB7IH07IFZFUjIgeyB9IFZFUjE7IikKKyAgZmlsZShXUklURSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vX192ZXJzaW9uX3NjcmlwdC50eHQgIiR7dmVyc2lvbl9zY3JpcHRfc291cmNlfSIpCisgIHNldChDTUFLRV9SRVFVSVJFRF9GTEFHUyAtV2wsLS12ZXJzaW9uLXNjcmlwdD0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vX192ZXJzaW9uX3NjcmlwdC50eHQpCisgIGNoZWNrX2Nfc291cmNlX2NvbXBpbGVzKCIke3NvdXJjZV9jb2RlfSIgJHtyZXR2YWx9KQorICBzZXQoJHtyZXR2YWx9ICR7JHtyZXR2YWx9fSBQQVJFTlRfU0NPUEUpCisgIGZpbGUoUkVNT1ZFICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9fX3ZlcnNpb25fc2NyaXB0LnR4dCkKK2VuZGZ1bmN0aW9uKCkKKworIyBJbmNsdWRlcyB0aGUgYXJjaGl0ZWN0dXJlIGZsYWcgaW4gYm90aCBjb21waWxlIGFuZCBsaW5rIHBoYXNlCitmdW5jdGlvbihsaWJvbXBfY2hlY2tfYXJjaGl0ZWN0dXJlX2ZsYWcgZmxhZyByZXR2YWwpCisgIHNldChDTUFLRV9SRVFVSVJFRF9GTEFHUyAiJHtmbGFnfSIpCisgIGNoZWNrX2NfY29tcGlsZXJfZmxhZygiJHtmbGFnfSIgJHtyZXR2YWx9KQorICBzZXQoJHtyZXR2YWx9ICR7JHtyZXR2YWx9fSBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMgQ2hlY2tpbmcgQywgQ1hYLCBMaW5rZXIgRmxhZ3MKK2NoZWNrX2N4eF9jb21waWxlcl9mbGFnKC1zdGQ9YysrMTEgTElCT01QX0hBVkVfU1REX0NQUDExX0ZMQUcpCitjaGVja19jeHhfY29tcGlsZXJfZmxhZygtZm5vLWV4Y2VwdGlvbnMgTElCT01QX0hBVkVfRk5PX0VYQ0VQVElPTlNfRkxBRykKK2NoZWNrX2N4eF9jb21waWxlcl9mbGFnKC1mbm8tcnR0aSBMSUJPTVBfSEFWRV9GTk9fUlRUSV9GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKCIteCBjKysiIExJQk9NUF9IQVZFX1hfQ1BQX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoLVdlcnJvciBMSUJPTVBfSEFWRV9XRVJST1JfRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygtV3VudXNlZC1mdW5jdGlvbiBMSUJPTVBfSEFWRV9XTk9fVU5VU0VEX0ZVTkNUSU9OX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoLVd1bnVzZWQtbG9jYWwtdHlwZWRlZiBMSUJPTVBfSEFWRV9XTk9fVU5VU0VEX0xPQ0FMX1RZUEVERUZfRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygtV3VudXNlZC12YWx1ZSBMSUJPTVBfSEFWRV9XTk9fVU5VU0VEX1ZBTFVFX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoLVd1bnVzZWQtdmFyaWFibGUgTElCT01QX0hBVkVfV05PX1VOVVNFRF9WQVJJQUJMRV9GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1Xc3dpdGNoIExJQk9NUF9IQVZFX1dOT19TV0lUQ0hfRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygtV2NvdmVyZWQtc3dpdGNoLWRlZmF1bHQgTElCT01QX0hBVkVfV05PX0NPVkVSRURfU1dJVENIX0RFRkFVTFRfRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygtV2RlcHJlY2F0ZWQtcmVnaXN0ZXIgTElCT01QX0hBVkVfV05PX0RFUFJFQ0FURURfUkVHSVNURVJfRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygtV3NpZ24tY29tcGFyZSBMSUJPTVBfSEFWRV9XTk9fU0lHTl9DT01QQVJFX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoLVdnbnUtYW5vbnltb3VzLXN0cnVjdCBMSUJPTVBfSEFWRV9XTk9fR05VX0FOT05ZTU9VU19TVFJVQ1RfRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygtV3Vua25vd24tcHJhZ21hcyBMSUJPTVBfSEFWRV9XTk9fVU5LTk9XTl9QUkFHTUFTX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoLVdtaXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyBMSUJPTVBfSEFWRV9XTk9fTUlTU0lOR19GSUVMRF9JTklUSUFMSVpFUlNfRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygtV21pc3NpbmctYnJhY2VzIExJQk9NUF9IQVZFX1dOT19NSVNTSU5HX0JSQUNFU19GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1XY29tbWVudCBMSUJPTVBfSEFWRV9XTk9fQ09NTUVOVF9GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1Xc2VsZi1hc3NpZ24gTElCT01QX0hBVkVfV05PX1NFTEZfQVNTSUdOX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoLVd2bGEtZXh0ZW5zaW9uIExJQk9NUF9IQVZFX1dOT19WTEFfRVhURU5TSU9OX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoLVdmb3JtYXQtcGVkYW50aWMgTElCT01QX0hBVkVfV05PX0ZPUk1BVF9QRURBTlRJQ19GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1tc3NlMiBMSUJPTVBfSEFWRV9NU1NFMl9GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1mdGxzLW1vZGVsPWluaXRpYWwtZXhlYyBMSUJPTVBfSEFWRV9GVExTX01PREVMX0ZMQUcpCitsaWJvbXBfY2hlY2tfYXJjaGl0ZWN0dXJlX2ZsYWcoLW1taWMgTElCT01QX0hBVkVfTU1JQ19GTEFHKQorbGlib21wX2NoZWNrX2FyY2hpdGVjdHVyZV9mbGFnKC1tMzIgTElCT01QX0hBVkVfTTMyX0ZMQUcpCitpZihXSU4zMikKKyAgIyBDaGVjayBXaW5kb3dzIE1TVkMgc3R5bGUgZmxhZ3MuCisgIGNoZWNrX2NfY29tcGlsZXJfZmxhZygvVFAgTElCT01QX0hBVkVfVFBfRkxBRykKKyAgY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoL0VIc2MgTElCT01QX0hBVkVfRUhTQ19GTEFHKQorICBjaGVja19jeHhfY29tcGlsZXJfZmxhZygvR1MgTElCT01QX0hBVkVfR1NfRkxBRykKKyAgY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoL095LSBMSUJPTVBfSEFWRV9PeV9fRkxBRykKKyAgY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoL2FyY2g6U1NFMiBMSUJPTVBfSEFWRV9BUkNIX1NTRTJfRkxBRykKKyAgY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoL1FzYWZlc2VoIExJQk9NUF9IQVZFX1FTQUZFU0VIX0ZMQUcpCisgICMgSXQgaXMgZGlmZmljdWx0IHRvIGNyZWF0ZSBhIGR1bW15IG1hc20gYXNzZW1ibHkgZmlsZQorICAjIGFuZCB0aGVuIGNoZWNrIHRoZSBNQVNNIGFzc2VtYmxlciB0byBzZWUgaWYgdGhlc2UgZmxhZ3MgZXhpc3QgYW5kIHdvcmssCisgICMgc28gd2UgYXNzdW1lIHRoZXkgZG8gZm9yIFdpbmRvd3MuCisgIHNldChMSUJPTVBfSEFWRV9TQUZFU0VIX01BU01fRkxBRyBUUlVFKQorICBzZXQoTElCT01QX0hBVkVfQ09GRl9NQVNNX0ZMQUcgVFJVRSkKKyAgIyBDaGFuZ2UgV2luZG93cyBmbGFncyAvTUR4IHRvIC9NVHgKKyAgZm9yZWFjaChsaWJvbXBfbGFuZyBJTiBJVEVNUyBDIENYWCkKKyAgICBmb3JlYWNoKGxpYm9tcF9idHlwZSBJTiBJVEVNUyBERUJVRyBSRUxXSVRIREVCSU5GTyBSRUxFQVNFIE1JTlNJWkVSRUwpCisgICAgICBzdHJpbmcoUkVQTEFDRSAiL01EIiAiL01UIgorICAgICAgICBDTUFLRV8ke2xpYm9tcF9sYW5nfV9GTEFHU18ke2xpYm9tcF9idHlwZX0KKyAgICAgICAgIiR7Q01BS0VfJHtsaWJvbXBfbGFuZ31fRkxBR1NfJHtsaWJvbXBfYnR5cGV9fSIKKyAgICAgICkKKyAgICBlbmRmb3JlYWNoKCkKKyAgZW5kZm9yZWFjaCgpCitlbHNlKCkKKyAgIyBJdCBpcyBkaWZmaWN1bHQgdG8gY3JlYXRlIGEgZHVtbXkgYXNzZW1ibHkgZmlsZSB0aGF0IGNvbXBpbGVzIGludG8gYW4KKyAgIyBleGVjdHVhYmxlIGZvciBldmVyeSBhcmNoaXRlY3R1cmUgYW5kIHRoZW4gY2hlY2sgdGhlIEMgY29tcGlsZXIgdG8KKyAgIyBzZWUgaWYgLXggYXNzZW1ibGVyLXdpdGgtY3BwIGV4aXN0cyBhbmQgd29ya3MsIHNvIHdlIGFzc3VtZSBpdCBkb2VzIGZvciBub24tV2luZG93cy4KKyAgc2V0KExJQk9NUF9IQVZFX1hfQVNTRU1CTEVSX1dJVEhfQ1BQX0ZMQUcgVFJVRSkKK2VuZGlmKCkKK2lmKCR7TElCT01QX0ZPUlRSQU5fTU9EVUxFU30pCisgIGxpYm9tcF9jaGVja19mb3J0cmFuX2ZsYWcoLW0zMiBMSUJPTVBfSEFWRV9NMzJfRk9SVFJBTl9GTEFHKQorZW5kaWYoKQorCisjIENoZWNrIGxpbmtlciBmbGFncworaWYoV0lOMzIpCisgIGxpYm9tcF9jaGVja19saW5rZXJfZmxhZygvU0FGRVNFSCBMSUJPTVBfSEFWRV9TQUZFU0VIX0ZMQUcpCitlbHNlaWYoTk9UIEFQUExFKQorICBsaWJvbXBfY2hlY2tfbGlua2VyX2ZsYWcoLVdsLC14IExJQk9NUF9IQVZFX1hfRkxBRykKKyAgbGlib21wX2NoZWNrX2xpbmtlcl9mbGFnKC1XbCwtLXdhcm4tc2hhcmVkLXRleHRyZWwgTElCT01QX0hBVkVfV0FSTl9TSEFSRURfVEVYVFJFTF9GTEFHKQorICBsaWJvbXBfY2hlY2tfbGlua2VyX2ZsYWcoLVdsLC0tYXMtbmVlZGVkIExJQk9NUF9IQVZFX0FTX05FRURFRF9GTEFHKQorICBsaWJvbXBfY2hlY2tfbGlua2VyX2ZsYWcoIi1XbCwtLXZlcnNpb24tc2NyaXB0PSR7TElCT01QX1NSQ19ESVJ9L2V4cG9ydHNfc28udHh0IiBMSUJPTVBfSEFWRV9WRVJTSU9OX1NDUklQVF9GTEFHKQorICBsaWJvbXBfY2hlY2tfbGlua2VyX2ZsYWcoLXN0YXRpYy1saWJnY2MgTElCT01QX0hBVkVfU1RBVElDX0xJQkdDQ19GTEFHKQorICBsaWJvbXBfY2hlY2tfbGlua2VyX2ZsYWcoLVdsLC16LG5vZXhlY3N0YWNrIExJQk9NUF9IQVZFX1pfTk9FWEVDU1RBQ0tfRkxBRykKKyAgbGlib21wX2NoZWNrX2xpbmtlcl9mbGFnKC1XbCwtZmluaT1fX2ttcF9pbnRlcm5hbF9lbmRfZmluaSBMSUJPTVBfSEFWRV9GSU5JX0ZMQUcpCitlbmRpZigpCisKKyMgQ2hlY2sgSW50ZWwoUikgQyBDb21waWxlciBzcGVjaWZpYyBmbGFncworaWYoQ01BS0VfQ19DT01QSUxFUl9JRCBTVFJFUVVBTCAiSW50ZWwiKQorICBjaGVja19jeHhfY29tcGlsZXJfZmxhZygvUWxvbmdfZG91YmxlIExJQk9NUF9IQVZFX0xPTkdfRE9VQkxFX0ZMQUcpCisgIGNoZWNrX2N4eF9jb21waWxlcl9mbGFnKC9RZGlhZy1kaXNhYmxlOjE3NyBMSUJPTVBfSEFWRV9ESUFHX0RJU0FCTEVfMTc3X0ZMQUcpCisgIGNoZWNrX2N4eF9jb21waWxlcl9mbGFnKC9RaW5saW5lLW1pbi1zaXplPTEgTElCT01QX0hBVkVfSU5MSU5FX01JTl9TSVpFX0ZMQUcpCisgIGNoZWNrX2N4eF9jb21waWxlcl9mbGFnKC1Rb3B0aW9uLGNwcCwtLWV4dGVuZGVkX2Zsb2F0X3R5cGVzIExJQk9NUF9IQVZFX0VYVEVOREVEX0ZMT0FUX1RZUEVTX0ZMQUcpCisgIGNoZWNrX2N4eF9jb21waWxlcl9mbGFnKC1mYWxpZ24tc3RhY2s9bWFpbnRhaW4tMTYtYnl0ZSBMSUJPTVBfSEFWRV9GQUxJR05fU1RBQ0tfRkxBRykKKyAgY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoIi1vcHQtc3RyZWFtaW5nLXN0b3JlcyBuZXZlciIgTElCT01QX0hBVkVfT1BUX1NUUkVBTUlOR19TVE9SRVNfRkxBRykKKyAgbGlib21wX2NoZWNrX2xpbmtlcl9mbGFnKC1zdGF0aWMtaW50ZWwgTElCT01QX0hBVkVfU1RBVElDX0lOVEVMX0ZMQUcpCisgIGxpYm9tcF9jaGVja19saW5rZXJfZmxhZygtbm8taW50ZWwtZXh0ZW5zaW9ucyBMSUJPTVBfSEFWRV9OT19JTlRFTF9FWFRFTlNJT05TX0ZMQUcpCisgIGNoZWNrX2xpYnJhcnlfZXhpc3RzKGlyY19waWMgX2ludGVsX2Zhc3RfbWVtY3B5ICIiIExJQk9NUF9IQVZFX0lSQ19QSUNfTElCUkFSWSkKK2VuZGlmKCkKKworIyBDaGVja2luZyBUaHJlYWRpbmcgcmVxdWlyZW1lbnRzCitmaW5kX3BhY2thZ2UoVGhyZWFkcyBSRVFVSVJFRCkKK2lmKFdJTjMyKQorICBpZihOT1QgQ01BS0VfVVNFX1dJTjMyX1RIUkVBRFNfSU5JVCkKKyAgICBsaWJvbXBfZXJyb3Jfc2F5KCJOZWVkIFdpbjMyIHRocmVhZCBpbnRlcmZhY2Ugb24gV2luZG93cy4iKQorICBlbmRpZigpCitlbHNlKCkKKyAgaWYoTk9UIENNQUtFX1VTRV9QVEhSRUFEU19JTklUKQorICAgIGxpYm9tcF9lcnJvcl9zYXkoIk5lZWQgcHRocmVhZCBpbnRlcmZhY2Ugb24gVW5peC1saWtlIHN5c3RlbXMuIikKKyAgZW5kaWYoKQorZW5kaWYoKQorCisjIEZpbmQgcGVybCBleGVjdXRhYmxlCisjIFBlcmwgaXMgdXNlZCB0byBjcmVhdGUgb21wLmggKGFuZCBvdGhlciBoZWFkZXJzKSBhbG9uZyB3aXRoIGttcF9pMThuX2lkLmluYyBhbmQga21wX2kxOG5fZGVmYXVsdC5pbmMKK2ZpbmRfcGFja2FnZShQZXJsIFJFUVVJUkVEKQorIyBUaGUgcGVybCBzY3JpcHRzIHRha2UgdGhlIC0tb3M9Ly0tYXJjaD0gZmxhZ3Mgd2hpY2ggZXhwZWN0IGEgY2VydGFpbiBmb3JtYXQgZm9yIG9wZXJhdGluZyBzeXN0ZW1zIGFuZCBhcmNoJ3MuCisjIFVudGlsIHRoZSBwZXJsIHNjcmlwdHMgYXJlIHJlbW92ZWQsIHRoZSBtb3N0IHBvcnRhYmxlIHdheSB0byBoYW5kbGUgdGhpcyBpcyB0byBoYXZlIGFsbCBvcGVyYXRpbmcgc3lzdGVtcyB0aGF0CisjIGFyZSBuZWl0aGVyIFdpbmRvd3Mgbm9yIE1hYyAoTW9zdCBVbml4IGZsYXZvcnMpIGJlIGNvbnNpZGVyZWQgbGluIHRvIHRoZSBwZXJsIHNjcmlwdHMuICBUaGlzIGlzIHJvb3RlZAorIyBpbiB0aGF0IGFsbCB0aGUgUGVybCBzY3JpcHRzIGNoZWNrIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGFuZCB3aWxsIGZhaWwgaWYgaXQgaXNuJ3QgInZhbGlkIi4gIFRoaXMKKyMgdGVtcG9yYXJ5IHNvbHV0aW9uIGxldHMgdXMgYXZvaWQgdHJ5aW5nIHRvIGVudW1lcmF0ZSBhbGwgdGhlIHBvc3NpYmxlIE9TIHZhbHVlcyBpbnNpZGUgdGhlIFBlcmwgbW9kdWxlcy4KK2lmKFdJTjMyKQorICBzZXQoTElCT01QX1BFUkxfU0NSSVBUX09TIHdpbikKK2Vsc2VpZihBUFBMRSkKKyAgc2V0KExJQk9NUF9QRVJMX1NDUklQVF9PUyBtYWMpCitlbHNlKCkKKyAgc2V0KExJQk9NUF9QRVJMX1NDUklQVF9PUyBsaW4pCitlbmRpZigpCitpZihJQTMyKQorICBzZXQoTElCT01QX1BFUkxfU0NSSVBUX0FSQ0ggMzIpCitlbHNlaWYoTUlDKQorICBzZXQoTElCT01QX1BFUkxfU0NSSVBUX0FSQ0ggbWljKQorZWxzZWlmKElOVEVMNjQpCisgIHNldChMSUJPTVBfUEVSTF9TQ1JJUFRfQVJDSCAzMmUpCitlbHNlKCkKKyAgc2V0KExJQk9NUF9QRVJMX1NDUklQVF9BUkNIICR7TElCT01QX0FSQ0h9KQorZW5kaWYoKQorCisjIENoZWNraW5nIGZlYXR1cmVzCisjIENoZWNrIGlmIHZlcnNpb24gc3ltYm9sIGFzc2VtYmxlciBkaXJlY3RpdmVzIGFyZSBzdXBwb3J0ZWQKK2xpYm9tcF9jaGVja192ZXJzaW9uX3N5bWJvbHMoTElCT01QX0hBVkVfVkVSU0lPTl9TWU1CT0xTKQorCisjIENoZWNrIGlmIHF1YWQgcHJlY2lzaW9uIHR5cGVzIGFyZSBhdmFpbGFibGUKK2lmKENNQUtFX0NfQ09NUElMRVJfSUQgU1RSRVFVQUwgIkdOVSIpCisgIHNldChMSUJPTVBfSEFWRV9RVUFEX1BSRUNJU0lPTiBUUlVFKQorZWxzZWlmKENNQUtFX0NfQ09NUElMRVJfSUQgU1RSRVFVQUwgIkludGVsIikKKyAgaWYoTElCT01QX0hBVkVfRVhURU5ERURfRkxPQVRfVFlQRVNfRkxBRykKKyAgICBzZXQoTElCT01QX0hBVkVfUVVBRF9QUkVDSVNJT04gVFJVRSkKKyAgZWxzZSgpCisgICAgc2V0KExJQk9NUF9IQVZFX1FVQURfUFJFQ0lTSU9OIFRSVUUpCisgIGVuZGlmKCkKK2Vsc2UoKQorICBzZXQoTElCT01QX0hBVkVfUVVBRF9QUkVDSVNJT04gRkFMU0UpCitlbmRpZigpCisKKyMgQ2hlY2sgaWYgYWRhcHRpdmUgbG9ja3MgYXJlIGF2YWlsYWJsZQoraWYoKCR7SUEzMn0gT1IgJHtJTlRFTDY0fSkgQU5EIE5PVCBNU1ZDKQorICBzZXQoTElCT01QX0hBVkVfQURBUFRJVkVfTE9DS1MgVFJVRSkKK2Vsc2UoKQorICBzZXQoTElCT01QX0hBVkVfQURBUFRJVkVfTE9DS1MgRkFMU0UpCitlbmRpZigpCisKKyMgQ2hlY2sgaWYgc3RhdHMtZ2F0aGVyaW5nIGlzIGF2YWlsYWJsZQoraWYoJHtMSUJPTVBfU1RBVFN9KQorICBjaGVja19jX3NvdXJjZV9jb21waWxlcygKKyAgICAgIl9fdGhyZWFkIGludCB4OworICAgICBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCisgICAgIHsgeCA9IGFyZ2M7IHJldHVybiB4OyB9IgorICAgICBMSUJPTVBfSEFWRV9fX1RIUkVBRCkKKyAgY2hlY2tfY19zb3VyY2VfY29tcGlsZXMoCisgICAgICJpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCisgICAgIHsgdW5zaWduZWQgbG9uZyBsb25nIHQgPSBfX2J1aWx0aW5fcmVhZGN5Y2xlY291bnRlcigpOyByZXR1cm4gMDsgfSIKKyAgICAgTElCT01QX0hBVkVfX19CVUlMVElOX1JFQURDWUNMRUNPVU5URVIpCisgIGlmKE5PVCBMSUJPTVBfSEFWRV9fX0JVSUxUSU5fUkVBRENZQ0xFQ09VTlRFUikKKyAgICBpZigke0lBMzJ9IE9SICR7SU5URUw2NH0gT1IgJHtNSUN9KQorICAgICAgY2hlY2tfaW5jbHVkZV9maWxlKHg4NmludHJpbi5oIExJQk9NUF9IQVZFX1g4NklOVFJJTl9IKQorICAgICAgbGlib21wX2FwcGVuZChDTUFLRV9SRVFVSVJFRF9ERUZJTklUSU9OUyAtRExJQk9NUF9IQVZFX1g4NklOVFJJTl9IIExJQk9NUF9IQVZFX1g4NklOVFJJTl9IKQorICAgICAgY2hlY2tfY19zb3VyY2VfY29tcGlsZXMoCisgICAgICAgICIjaWZkZWYgTElCT01QX0hBVkVfWDg2SU5UUklOX0gKKyAgICAgICAgICMgaW5jbHVkZSA8eDg2aW50cmluLmg+CisgICAgICAgICAjZW5kaWYKKyAgICAgICAgIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeyB1bnNpZ25lZCBsb25nIGxvbmcgdCA9IF9fcmR0c2MoKTsgcmV0dXJuIDA7IH0iIExJQk9NUF9IQVZFX19fUkRUU0MpCisgICAgICBzZXQoQ01BS0VfUkVRVUlSRURfREVGSU5JVElPTlMpCisgICAgZW5kaWYoKQorICBlbmRpZigpCisgIGlmKExJQk9NUF9IQVZFX19fVEhSRUFEIEFORCAoTElCT01QX0hBVkVfX19SRFRTQyBPUiBMSUJPTVBfSEFWRV9fX0JVSUxUSU5fUkVBRENZQ0xFQ09VTlRFUikpCisgICAgc2V0KExJQk9NUF9IQVZFX1NUQVRTIFRSVUUpCisgIGVsc2UoKQorICAgIHNldChMSUJPTVBfSEFWRV9TVEFUUyBGQUxTRSkKKyAgZW5kaWYoKQorZW5kaWYoKQorCisjIENoZWNrIGlmIE9NUFQgc3VwcG9ydCBpcyBhdmFpbGFibGUKKyMgQ3VycmVudGx5LCBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygpIGlzIHJlcXVpcmVkIGZvciBPTVBUCisjIFdlYWsgYXR0cmlidXRlIGlzIHJlcXVpcmVkIGZvciBVbmljZXMsIExJQlBTQVBJIGlzIHVzZWQgZm9yIFdpbmRvd3MKK2NoZWNrX2Nfc291cmNlX2NvbXBpbGVzKCJpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgdm9pZCogcCA9IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApOworICByZXR1cm4gMDt9IiBMSUJPTVBfSEFWRV9fX0JVSUxUSU5fRlJBTUVfQUREUkVTUykKK2NoZWNrX2Nfc291cmNlX2NvbXBpbGVzKCJfX2F0dHJpYnV0ZV9fICgod2VhaykpIGludCBmb28oaW50IGEpIHsgcmV0dXJuIGEqYTsgfQorICBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgcmV0dXJuIGZvbyhhcmdjKTt9IiBMSUJPTVBfSEFWRV9XRUFLX0FUVFJJQlVURSkKK2NoZWNrX2luY2x1ZGVfZmlsZXMoIndpbmRvd3MuaDtwc2FwaS5oIiBMSUJPTVBfSEFWRV9QU0FQSV9IKQorY2hlY2tfbGlicmFyeV9leGlzdHMocHNhcGkgRW51bVByb2Nlc3NNb2R1bGVzICIiIExJQk9NUF9IQVZFX0xJQlBTQVBJKQoraWYoTElCT01QX0hBVkVfUFNBUElfSCBBTkQgTElCT01QX0hBVkVfTElCUFNBUEkpCisgIHNldChMSUJPTVBfSEFWRV9QU0FQSSBUUlVFKQorZW5kaWYoKQoraWYoTk9UIExJQk9NUF9IQVZFX19fQlVJTFRJTl9GUkFNRV9BRERSRVNTKQorICBzZXQoTElCT01QX0hBVkVfT01QVF9TVVBQT1JUIEZBTFNFKQorZWxzZSgpCisgIGlmKExJQk9NUF9IQVZFX1dFQUtfQVRUUklCVVRFIE9SIExJQk9NUF9IQVZFX1BTQVBJKQorICAgIHNldChMSUJPTVBfSEFWRV9PTVBUX1NVUFBPUlQgVFJVRSkKKyAgZWxzZSgpCisgICAgc2V0KExJQk9NUF9IQVZFX09NUFRfU1VQUE9SVCBGQUxTRSkKKyAgZW5kaWYoKQorZW5kaWYoKQorCisjIENoZWNrIGlmIEhXTE9DIHN1cHBvcnQgaXMgYXZhaWxhYmxlCitpZigke0xJQk9NUF9VU0VfSFdMT0N9KQorICBzZXQoQ01BS0VfUkVRVUlSRURfSU5DTFVERVMgJHtMSUJPTVBfSFdMT0NfSU5TVEFMTF9ESVJ9L2luY2x1ZGUpCisgIGNoZWNrX2luY2x1ZGVfZmlsZShod2xvYy5oIExJQk9NUF9IQVZFX0hXTE9DX0gpCisgIHNldChDTUFLRV9SRVFVSVJFRF9JTkNMVURFUykKKyAgZmluZF9saWJyYXJ5KExJQk9NUF9IV0xPQ19MSUJSQVJZCisgICAgTkFNRVMgaHdsb2MgbGliaHdsb2MKKyAgICBISU5UUyAke0xJQk9NUF9IV0xPQ19JTlNUQUxMX0RJUn0vbGliKQorICBpZihMSUJPTVBfSFdMT0NfTElCUkFSWSkKKyAgICBjaGVja19saWJyYXJ5X2V4aXN0cygke0xJQk9NUF9IV0xPQ19MSUJSQVJZfSBod2xvY190b3BvbG9neV9pbml0CisgICAgICAke0xJQk9NUF9IV0xPQ19JTlNUQUxMX0RJUn0vbGliIExJQk9NUF9IQVZFX0xJQkhXTE9DKQorICAgIGdldF9maWxlbmFtZV9jb21wb25lbnQoTElCT01QX0hXTE9DX0xJQlJBUllfRElSICR7TElCT01QX0hXTE9DX0xJQlJBUll9IFBBVEgpCisgIGVuZGlmKCkKKyAgaWYoTElCT01QX0hBVkVfSFdMT0NfSCBBTkQgTElCT01QX0hBVkVfTElCSFdMT0MgQU5EIExJQk9NUF9IV0xPQ19MSUJSQVJZKQorICAgIHNldChMSUJPTVBfSEFWRV9IV0xPQyBUUlVFKQorICBlbHNlKCkKKyAgICBzZXQoTElCT01QX0hBVkVfSFdMT0MgRkFMU0UpCisgICAgbGlib21wX3NheSgiQ291bGQgbm90IGZpbmQgaHdsb2MiKQorICBlbmRpZigpCitlbmRpZigpCisKKyMgQ2hlY2sgaWYgVGhyZWFkU2FuaXRpemVyIHN1cHBvcnQgaXMgYXZhaWxhYmxlCitpZigiJHtDTUFLRV9TWVNURU1fTkFNRX0iIE1BVENIRVMgIkxpbnV4IiBBTkQgJHtJTlRFTDY0fSkKKyAgc2V0KExJQk9NUF9IQVZFX1RTQU5fU1VQUE9SVCBUUlVFKQorZWxzZSgpCisgIHNldChMSUJPTVBfSEFWRV9UU0FOX1NVUFBPUlQgRkFMU0UpCitlbmRpZigpCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL2RvYy9SZWZlcmVuY2UucGRmIGIvZmluYWwvcnVudGltZS9kb2MvUmVmZXJlbmNlLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTdjNDBjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9kb2MvUmVmZXJlbmNlLnBkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL2RvYy9kb3h5Z2VuL2NvbmZpZyBiL2ZpbmFsL3J1bnRpbWUvZG9jL2RveHlnZW4vY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMmZkYmQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL2RvYy9kb3h5Z2VuL2NvbmZpZwpAQCAtMCwwICsxLDE4MjIgQEAKKyMgRG94eWZpbGUgMS5vOC4yDQorDQorIyBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBzZXR0aW5ncyB0byBiZSB1c2VkIGJ5IHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbQ0KKyMgZG94eWdlbiAod3d3LmRveHlnZW4ub3JnKSBmb3IgYSBwcm9qZWN0Lg0KKyMNCisjIEFsbCB0ZXh0IGFmdGVyIGEgaGFzaCAoIykgaXMgY29uc2lkZXJlZCBhIGNvbW1lbnQgYW5kIHdpbGwgYmUgaWdub3JlZC4NCisjIFRoZSBmb3JtYXQgaXM6DQorIyAgICAgICBUQUcgPSB2YWx1ZSBbdmFsdWUsIC4uLl0NCisjIEZvciBsaXN0cyBpdGVtcyBjYW4gYWxzbyBiZSBhcHBlbmRlZCB1c2luZzoNCisjICAgICAgIFRBRyArPSB2YWx1ZSBbdmFsdWUsIC4uLl0NCisjIFZhbHVlcyB0aGF0IGNvbnRhaW4gc3BhY2VzIHNob3VsZCBiZSBwbGFjZWQgYmV0d2VlbiBxdW90ZXMgKCIgIikuDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgUHJvamVjdCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIFRoaXMgdGFnIHNwZWNpZmllcyB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIGNvbmZpZyBmaWxlDQorIyB0aGF0IGZvbGxvdy4gVGhlIGRlZmF1bHQgaXMgVVRGLTggd2hpY2ggaXMgYWxzbyB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgYWxsDQorIyB0ZXh0IGJlZm9yZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGlzIHRhZy4gRG94eWdlbiB1c2VzIGxpYmljb252IChvciB0aGUNCisjIGljb252IGJ1aWx0IGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlDQorIyBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGliaWNvbnYgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGVuY29kaW5ncy4NCisNCitET1hZRklMRV9FTkNPRElORyAgICAgID0gVVRGLTgNCisNCisjIFRoZSBQUk9KRUNUX05BTUUgdGFnIGlzIGEgc2luZ2xlIHdvcmQgKG9yIHNlcXVlbmNlIG9mIHdvcmRzKSB0aGF0IHNob3VsZA0KKyMgaWRlbnRpZnkgdGhlIHByb2plY3QuIE5vdGUgdGhhdCBpZiB5b3UgZG8gbm90IHVzZSBEb3h5d2l6YXJkIHlvdSBuZWVkDQorIyB0byBwdXQgcXVvdGVzIGFyb3VuZCB0aGUgcHJvamVjdCBuYW1lIGlmIGl0IGNvbnRhaW5zIHNwYWNlcy4NCisNCitQUk9KRUNUX05BTUUgICAgICAgICAgID0gIkxMVk0gT3Blbk1QKiBSdW50aW1lIExpYnJhcnkiDQorDQorIyBUaGUgUFJPSkVDVF9OVU1CRVIgdGFnIGNhbiBiZSB1c2VkIHRvIGVudGVyIGEgcHJvamVjdCBvciByZXZpc2lvbiBudW1iZXIuDQorIyBUaGlzIGNvdWxkIGJlIGhhbmR5IGZvciBhcmNoaXZpbmcgdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIG9yDQorIyBpZiBzb21lIHZlcnNpb24gY29udHJvbCBzeXN0ZW0gaXMgdXNlZC4NCisNCitQUk9KRUNUX05VTUJFUiAgICAgICAgID0NCisNCisjIFVzaW5nIHRoZSBQUk9KRUNUX0JSSUVGIHRhZyBvbmUgY2FuIHByb3ZpZGUgYW4gb3B0aW9uYWwgb25lIGxpbmUgZGVzY3JpcHRpb24NCisjIGZvciBhIHByb2plY3QgdGhhdCBhcHBlYXJzIGF0IHRoZSB0b3Agb2YgZWFjaCBwYWdlIGFuZCBzaG91bGQgZ2l2ZSB2aWV3ZXINCisjIGEgcXVpY2sgaWRlYSBhYm91dCB0aGUgcHVycG9zZSBvZiB0aGUgcHJvamVjdC4gS2VlcCB0aGUgZGVzY3JpcHRpb24gc2hvcnQuDQorDQorUFJPSkVDVF9CUklFRiAgICAgICAgICA9DQorDQorIyBXaXRoIHRoZSBQUk9KRUNUX0xPR08gdGFnIG9uZSBjYW4gc3BlY2lmeSBhbiBsb2dvIG9yIGljb24gdGhhdCBpcw0KKyMgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uIFRoZSBtYXhpbXVtIGhlaWdodCBvZiB0aGUgbG9nbyBzaG91bGQgbm90DQorIyBleGNlZWQgNTUgcGl4ZWxzIGFuZCB0aGUgbWF4aW11bSB3aWR0aCBzaG91bGQgbm90IGV4Y2VlZCAyMDAgcGl4ZWxzLg0KKyMgRG94eWdlbiB3aWxsIGNvcHkgdGhlIGxvZ28gdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuDQorDQorUFJPSkVDVF9MT0dPICAgICAgICAgICA9DQorDQorIyBUaGUgT1VUUFVUX0RJUkVDVE9SWSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSAocmVsYXRpdmUgb3IgYWJzb2x1dGUpDQorIyBiYXNlIHBhdGggd2hlcmUgdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIHdpbGwgYmUgcHV0Lg0KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQsIGl0IHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uDQorIyB3aGVyZSBkb3h5Z2VuIHdhcyBzdGFydGVkLiBJZiBsZWZ0IGJsYW5rIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aWxsIGJlIHVzZWQuDQorDQorT1VUUFVUX0RJUkVDVE9SWSAgICAgICA9IGRvYy9kb3h5Z2VuL2dlbmVyYXRlZA0KKw0KKyMgSWYgdGhlIENSRUFURV9TVUJESVJTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCBjcmVhdGUNCisjIDQwOTYgc3ViLWRpcmVjdG9yaWVzIChpbiAyIGxldmVscykgdW5kZXIgdGhlIG91dHB1dCBkaXJlY3Rvcnkgb2YgZWFjaCBvdXRwdXQNCisjIGZvcm1hdCBhbmQgd2lsbCBkaXN0cmlidXRlIHRoZSBnZW5lcmF0ZWQgZmlsZXMgb3ZlciB0aGVzZSBkaXJlY3Rvcmllcy4NCisjIEVuYWJsaW5nIHRoaXMgb3B0aW9uIGNhbiBiZSB1c2VmdWwgd2hlbiBmZWVkaW5nIGRveHlnZW4gYSBodWdlIGFtb3VudCBvZg0KKyMgc291cmNlIGZpbGVzLCB3aGVyZSBwdXR0aW5nIGFsbCBnZW5lcmF0ZWQgZmlsZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IHdvdWxkDQorIyBvdGhlcndpc2UgY2F1c2UgcGVyZm9ybWFuY2UgcHJvYmxlbXMgZm9yIHRoZSBmaWxlIHN5c3RlbS4NCisNCitDUkVBVEVfU1VCRElSUyAgICAgICAgID0gTk8NCisNCisjIFRoZSBPVVRQVVRfTEFOR1VBR0UgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbGFuZ3VhZ2UgaW4gd2hpY2ggYWxsDQorIyBkb2N1bWVudGF0aW9uIGdlbmVyYXRlZCBieSBkb3h5Z2VuIGlzIHdyaXR0ZW4uIERveHlnZW4gd2lsbCB1c2UgdGhpcw0KKyMgaW5mb3JtYXRpb24gdG8gZ2VuZXJhdGUgYWxsIGNvbnN0YW50IG91dHB1dCBpbiB0aGUgcHJvcGVyIGxhbmd1YWdlLg0KKyMgVGhlIGRlZmF1bHQgbGFuZ3VhZ2UgaXMgRW5nbGlzaCwgb3RoZXIgc3VwcG9ydGVkIGxhbmd1YWdlcyBhcmU6DQorIyBBZnJpa2FhbnMsIEFyYWJpYywgQnJhemlsaWFuLCBDYXRhbGFuLCBDaGluZXNlLCBDaGluZXNlLVRyYWRpdGlvbmFsLA0KKyMgQ3JvYXRpYW4sIEN6ZWNoLCBEYW5pc2gsIER1dGNoLCBFc3BlcmFudG8sIEZhcnNpLCBGaW5uaXNoLCBGcmVuY2gsIEdlcm1hbiwNCisjIEdyZWVrLCBIdW5nYXJpYW4sIEl0YWxpYW4sIEphcGFuZXNlLCBKYXBhbmVzZS1lbiAoSmFwYW5lc2Ugd2l0aCBFbmdsaXNoDQorIyBtZXNzYWdlcyksIEtvcmVhbiwgS29yZWFuLWVuLCBMaXRodWFuaWFuLCBOb3J3ZWdpYW4sIE1hY2Vkb25pYW4sIFBlcnNpYW4sDQorIyBQb2xpc2gsIFBvcnR1Z3Vlc2UsIFJvbWFuaWFuLCBSdXNzaWFuLCBTZXJiaWFuLCBTZXJiaWFuLUN5cmlsbGljLCBTbG92YWssDQorIyBTbG92ZW5lLCBTcGFuaXNoLCBTd2VkaXNoLCBVa3JhaW5pYW4sIGFuZCBWaWV0bmFtZXNlLg0KKw0KK09VVFBVVF9MQU5HVUFHRSAgICAgICAgPSBFbmdsaXNoDQorDQorIyBJZiB0aGUgQlJJRUZfTUVNQkVSX0RFU0MgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwNCisjIGluY2x1ZGUgYnJpZWYgbWVtYmVyIGRlc2NyaXB0aW9ucyBhZnRlciB0aGUgbWVtYmVycyB0aGF0IGFyZSBsaXN0ZWQgaW4NCisjIHRoZSBmaWxlIGFuZCBjbGFzcyBkb2N1bWVudGF0aW9uIChzaW1pbGFyIHRvIEphdmFEb2MpLg0KKyMgU2V0IHRvIE5PIHRvIGRpc2FibGUgdGhpcy4NCisNCitCUklFRl9NRU1CRVJfREVTQyAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgUkVQRUFUX0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsIHByZXBlbmQNCisjIHRoZSBicmllZiBkZXNjcmlwdGlvbiBvZiBhIG1lbWJlciBvciBmdW5jdGlvbiBiZWZvcmUgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uLg0KKyMgTm90ZTogaWYgYm90aCBISURFX1VORE9DX01FTUJFUlMgYW5kIEJSSUVGX01FTUJFUl9ERVNDIGFyZSBzZXQgdG8gTk8sIHRoZQ0KKyMgYnJpZWYgZGVzY3JpcHRpb25zIHdpbGwgYmUgY29tcGxldGVseSBzdXBwcmVzc2VkLg0KKw0KK1JFUEVBVF9CUklFRiAgICAgICAgICAgPSBZRVMNCisNCisjIFRoaXMgdGFnIGltcGxlbWVudHMgYSBxdWFzaS1pbnRlbGxpZ2VudCBicmllZiBkZXNjcmlwdGlvbiBhYmJyZXZpYXRvcg0KKyMgdGhhdCBpcyB1c2VkIHRvIGZvcm0gdGhlIHRleHQgaW4gdmFyaW91cyBsaXN0aW5ncy4gRWFjaCBzdHJpbmcNCisjIGluIHRoaXMgbGlzdCwgaWYgZm91bmQgYXMgdGhlIGxlYWRpbmcgdGV4dCBvZiB0aGUgYnJpZWYgZGVzY3JpcHRpb24sIHdpbGwgYmUNCisjIHN0cmlwcGVkIGZyb20gdGhlIHRleHQgYW5kIHRoZSByZXN1bHQgYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgd2hvbGUgbGlzdCwgaXMNCisjIHVzZWQgYXMgdGhlIGFubm90YXRlZCB0ZXh0LiBPdGhlcndpc2UsIHRoZSBicmllZiBkZXNjcmlwdGlvbiBpcyB1c2VkIGFzLWlzLg0KKyMgSWYgbGVmdCBibGFuaywgdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHVzZWQgKCIkbmFtZSIgaXMgYXV0b21hdGljYWxseQ0KKyMgcmVwbGFjZWQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZW50aXR5KTogIlRoZSAkbmFtZSBjbGFzcyIgIlRoZSAkbmFtZSB3aWRnZXQiDQorIyAiVGhlICRuYW1lIGZpbGUiICJpcyIgInByb3ZpZGVzIiAic3BlY2lmaWVzIiAiY29udGFpbnMiDQorIyAicmVwcmVzZW50cyIgImEiICJhbiIgInRoZSINCisNCitBQkJSRVZJQVRFX0JSSUVGICAgICAgID0NCisNCisjIElmIHRoZSBBTFdBWVNfREVUQUlMRURfU0VDIGFuZCBSRVBFQVRfQlJJRUYgdGFncyBhcmUgYm90aCBzZXQgdG8gWUVTIHRoZW4NCisjIERveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGRldGFpbGVkIHNlY3Rpb24gZXZlbiBpZiB0aGVyZSBpcyBvbmx5IGEgYnJpZWYNCisjIGRlc2NyaXB0aW9uLg0KKw0KK0FMV0FZU19ERVRBSUxFRF9TRUMgICAgPSBOTw0KKw0KKyMgSWYgdGhlIElOTElORV9JTkhFUklURURfTUVNQiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHNob3cgYWxsDQorIyBpbmhlcml0ZWQgbWVtYmVycyBvZiBhIGNsYXNzIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoYXQgY2xhc3MgYXMgaWYgdGhvc2UNCisjIG1lbWJlcnMgd2VyZSBvcmRpbmFyeSBjbGFzcyBtZW1iZXJzLiBDb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzIGFuZCBhc3NpZ25tZW50DQorIyBvcGVyYXRvcnMgb2YgdGhlIGJhc2UgY2xhc3NlcyB3aWxsIG5vdCBiZSBzaG93bi4NCisNCitJTkxJTkVfSU5IRVJJVEVEX01FTUIgID0gTk8NCisNCisjIElmIHRoZSBGVUxMX1BBVEhfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBEb3h5Z2VuIHdpbGwgcHJlcGVuZCB0aGUgZnVsbA0KKyMgcGF0aCBiZWZvcmUgZmlsZXMgbmFtZSBpbiB0aGUgZmlsZSBsaXN0IGFuZCBpbiB0aGUgaGVhZGVyIGZpbGVzLiBJZiBzZXQNCisjIHRvIE5PIHRoZSBzaG9ydGVzdCBwYXRoIHRoYXQgbWFrZXMgdGhlIGZpbGUgbmFtZSB1bmlxdWUgd2lsbCBiZSB1c2VkLg0KKw0KK0ZVTExfUEFUSF9OQU1FUyAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIEZVTExfUEFUSF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBTVFJJUF9GUk9NX1BBVEggdGFnDQorIyBjYW4gYmUgdXNlZCB0byBzdHJpcCBhIHVzZXItZGVmaW5lZCBwYXJ0IG9mIHRoZSBwYXRoLiBTdHJpcHBpbmcgaXMNCisjIG9ubHkgZG9uZSBpZiBvbmUgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIG1hdGNoZXMgdGhlIGxlZnQtaGFuZCBwYXJ0IG9mDQorIyB0aGUgcGF0aC4gVGhlIHRhZyBjYW4gYmUgdXNlZCB0byBzaG93IHJlbGF0aXZlIHBhdGhzIGluIHRoZSBmaWxlIGxpc3QuDQorIyBJZiBsZWZ0IGJsYW5rIHRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCBkb3h5Z2VuIGlzIHJ1biBpcyB1c2VkIGFzIHRoZQ0KKyMgcGF0aCB0byBzdHJpcC4gTm90ZSB0aGF0IHlvdSBzcGVjaWZ5IGFic29sdXRlIHBhdGhzIGhlcmUsIGJ1dCBhbHNvDQorIyByZWxhdGl2ZSBwYXRocywgd2hpY2ggd2lsbCBiZSByZWxhdGl2ZSBmcm9tIHRoZSBkaXJlY3Rvcnkgd2hlcmUgZG94eWdlbiBpcw0KKyMgc3RhcnRlZC4NCisNCitTVFJJUF9GUk9NX1BBVEggICAgICAgID0NCisNCisjIFRoZSBTVFJJUF9GUk9NX0lOQ19QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzdHJpcCBhIHVzZXItZGVmaW5lZCBwYXJ0IG9mDQorIyB0aGUgcGF0aCBtZW50aW9uZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgYSBjbGFzcywgd2hpY2ggdGVsbHMNCisjIHRoZSByZWFkZXIgd2hpY2ggaGVhZGVyIGZpbGUgdG8gaW5jbHVkZSBpbiBvcmRlciB0byB1c2UgYSBjbGFzcy4NCisjIElmIGxlZnQgYmxhbmsgb25seSB0aGUgbmFtZSBvZiB0aGUgaGVhZGVyIGZpbGUgY29udGFpbmluZyB0aGUgY2xhc3MNCisjIGRlZmluaXRpb24gaXMgdXNlZC4gT3RoZXJ3aXNlIG9uZSBzaG91bGQgc3BlY2lmeSB0aGUgaW5jbHVkZSBwYXRocyB0aGF0DQorIyBhcmUgbm9ybWFsbHkgcGFzc2VkIHRvIHRoZSBjb21waWxlciB1c2luZyB0aGUgLUkgZmxhZy4NCisNCitTVFJJUF9GUk9NX0lOQ19QQVRIICAgID0NCisNCisjIElmIHRoZSBTSE9SVF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIG11Y2ggc2hvcnRlcg0KKyMgKGJ1dCBsZXNzIHJlYWRhYmxlKSBmaWxlIG5hbWVzLiBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91ciBmaWxlIHN5c3RlbQ0KKyMgZG9lc24ndCBzdXBwb3J0IGxvbmcgbmFtZXMgbGlrZSBvbiBET1MsIE1hYywgb3IgQ0QtUk9NLg0KKw0KK1NIT1JUX05BTUVTICAgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIEpBVkFET0NfQVVUT0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbg0KKyMgd2lsbCBpbnRlcnByZXQgdGhlIGZpcnN0IGxpbmUgKHVudGlsIHRoZSBmaXJzdCBkb3QpIG9mIGEgSmF2YURvYy1zdHlsZQ0KKyMgY29tbWVudCBhcyB0aGUgYnJpZWYgZGVzY3JpcHRpb24uIElmIHNldCB0byBOTywgdGhlIEphdmFEb2MNCisjIGNvbW1lbnRzIHdpbGwgYmVoYXZlIGp1c3QgbGlrZSByZWd1bGFyIFF0LXN0eWxlIGNvbW1lbnRzDQorIyAodGh1cyByZXF1aXJpbmcgYW4gZXhwbGljaXQgQGJyaWVmIGNvbW1hbmQgZm9yIGEgYnJpZWYgZGVzY3JpcHRpb24uKQ0KKw0KK0pBVkFET0NfQVVUT0JSSUVGICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIFFUX0FVVE9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4gd2lsbA0KKyMgaW50ZXJwcmV0IHRoZSBmaXJzdCBsaW5lICh1bnRpbCB0aGUgZmlyc3QgZG90KSBvZiBhIFF0LXN0eWxlDQorIyBjb21tZW50IGFzIHRoZSBicmllZiBkZXNjcmlwdGlvbi4gSWYgc2V0IHRvIE5PLCB0aGUgY29tbWVudHMNCisjIHdpbGwgYmVoYXZlIGp1c3QgbGlrZSByZWd1bGFyIFF0LXN0eWxlIGNvbW1lbnRzICh0aHVzIHJlcXVpcmluZw0KKyMgYW4gZXhwbGljaXQgXGJyaWVmIGNvbW1hbmQgZm9yIGEgYnJpZWYgZGVzY3JpcHRpb24uKQ0KKw0KK1FUX0FVVE9CUklFRiAgICAgICAgICAgPSBOTw0KKw0KKyMgVGhlIE1VTFRJTElORV9DUFBfSVNfQlJJRUYgdGFnIGNhbiBiZSBzZXQgdG8gWUVTIHRvIG1ha2UgRG94eWdlbg0KKyMgdHJlYXQgYSBtdWx0aS1saW5lIEMrKyBzcGVjaWFsIGNvbW1lbnQgYmxvY2sgKGkuZS4gYSBibG9jayBvZiAvLyEgb3IgLy8vDQorIyBjb21tZW50cykgYXMgYSBicmllZiBkZXNjcmlwdGlvbi4gVGhpcyB1c2VkIHRvIGJlIHRoZSBkZWZhdWx0IGJlaGF2aW91ci4NCisjIFRoZSBuZXcgZGVmYXVsdCBpcyB0byB0cmVhdCBhIG11bHRpLWxpbmUgQysrIGNvbW1lbnQgYmxvY2sgYXMgYSBkZXRhaWxlZA0KKyMgZGVzY3JpcHRpb24uIFNldCB0aGlzIHRhZyB0byBZRVMgaWYgeW91IHByZWZlciB0aGUgb2xkIGJlaGF2aW91ciBpbnN0ZWFkLg0KKw0KK01VTFRJTElORV9DUFBfSVNfQlJJRUYgPSBOTw0KKw0KKyMgSWYgdGhlIElOSEVSSVRfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gYW4gdW5kb2N1bWVudGVkDQorIyBtZW1iZXIgaW5oZXJpdHMgdGhlIGRvY3VtZW50YXRpb24gZnJvbSBhbnkgZG9jdW1lbnRlZCBtZW1iZXIgdGhhdCBpdA0KKyMgcmUtaW1wbGVtZW50cy4NCisNCitJTkhFUklUX0RPQ1MgICAgICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgU0VQQVJBVEVfTUVNQkVSX1BBR0VTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCBwcm9kdWNlDQorIyBhIG5ldyBwYWdlIGZvciBlYWNoIG1lbWJlci4gSWYgc2V0IHRvIE5PLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIG1lbWJlciB3aWxsDQorIyBiZSBwYXJ0IG9mIHRoZSBmaWxlL2NsYXNzL25hbWVzcGFjZSB0aGF0IGNvbnRhaW5zIGl0Lg0KKw0KK1NFUEFSQVRFX01FTUJFUl9QQUdFUyAgPSBOTw0KKw0KKyMgVGhlIFRBQl9TSVpFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG51bWJlciBvZiBzcGFjZXMgaW4gYSB0YWIuDQorIyBEb3h5Z2VuIHVzZXMgdGhpcyB2YWx1ZSB0byByZXBsYWNlIHRhYnMgYnkgc3BhY2VzIGluIGNvZGUgZnJhZ21lbnRzLg0KKw0KK1RBQl9TSVpFICAgICAgICAgICAgICAgPSA4DQorDQorIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIGFsaWFzZXMgdGhhdCBhY3RzDQorIyBhcyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gQW4gYWxpYXMgaGFzIHRoZSBmb3JtICJuYW1lPXZhbHVlIi4NCisjIEZvciBleGFtcGxlIGFkZGluZyAic2lkZWVmZmVjdD1ccGFyIFNpZGUgRWZmZWN0czpcbiIgd2lsbCBhbGxvdyB5b3UgdG8NCisjIHB1dCB0aGUgY29tbWFuZCBcc2lkZWVmZmVjdCAob3IgQHNpZGVlZmZlY3QpIGluIHRoZSBkb2N1bWVudGF0aW9uLCB3aGljaA0KKyMgd2lsbCByZXN1bHQgaW4gYSB1c2VyLWRlZmluZWQgcGFyYWdyYXBoIHdpdGggaGVhZGluZyAiU2lkZSBFZmZlY3RzOiIuDQorIyBZb3UgY2FuIHB1dCBcbidzIGluIHRoZSB2YWx1ZSBwYXJ0IG9mIGFuIGFsaWFzIHRvIGluc2VydCBuZXdsaW5lcy4NCisNCitBTElBU0VTICAgICAgICAgICAgICAgID0gIm90aGVyPTxzdXA+Kjwvc3VwPiINCisNCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBudW1iZXIgb2Ygd29yZC1rZXl3b3JkIG1hcHBpbmdzIChUQ0wgb25seSkuDQorIyBBIG1hcHBpbmcgaGFzIHRoZSBmb3JtICJuYW1lPXZhbHVlIi4gRm9yIGV4YW1wbGUgYWRkaW5nDQorIyAiY2xhc3M9aXRjbDo6Y2xhc3MiIHdpbGwgYWxsb3cgeW91IHRvIHVzZSB0aGUgY29tbWFuZCBjbGFzcyBpbiB0aGUNCisjIGl0Y2w6OmNsYXNzIG1lYW5pbmcuDQorDQorVENMX1NVQlNUICAgICAgICAgICAgICA9DQorDQorIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9GT1JfQyB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBDDQorIyBzb3VyY2VzIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQgZm9yIEMuDQorIyBGb3IgaW5zdGFuY2UsIHNvbWUgb2YgdGhlIG5hbWVzIHRoYXQgYXJlIHVzZWQgd2lsbCBiZSBkaWZmZXJlbnQuIFRoZSBsaXN0DQorIyBvZiBhbGwgbWVtYmVycyB3aWxsIGJlIG9taXR0ZWQsIGV0Yy4NCisNCitPUFRJTUlaRV9PVVRQVVRfRk9SX0MgID0gTk8NCisNCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX0pBVkEgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgSmF2YQ0KKyMgc291cmNlcyBvbmx5LiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyBtb3JlIHRhaWxvcmVkIGZvcg0KKyMgSmF2YS4gRm9yIGluc3RhbmNlLCBuYW1lc3BhY2VzIHdpbGwgYmUgcHJlc2VudGVkIGFzIHBhY2thZ2VzLCBxdWFsaWZpZWQNCisjIHNjb3BlcyB3aWxsIGxvb2sgZGlmZmVyZW50LCBldGMuDQorDQorT1BUSU1JWkVfT1VUUFVUX0pBVkEgICA9IE5PDQorDQorIyBTZXQgdGhlIE9QVElNSVpFX0ZPUl9GT1JUUkFOIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEZvcnRyYW4NCisjIHNvdXJjZXMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3INCisjIEZvcnRyYW4uDQorDQorT1BUSU1JWkVfRk9SX0ZPUlRSQU4gICA9IE5PDQorDQorIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9WSERMIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIFZIREwNCisjIHNvdXJjZXMuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIHRhaWxvcmVkIGZvcg0KKyMgVkhETC4NCisNCitPUFRJTUlaRV9PVVRQVVRfVkhETCAgID0gTk8NCisNCisjIERveHlnZW4gc2VsZWN0cyB0aGUgcGFyc2VyIHRvIHVzZSBkZXBlbmRpbmcgb24gdGhlIGV4dGVuc2lvbiBvZiB0aGUgZmlsZXMgaXQNCisjIHBhcnNlcy4gV2l0aCB0aGlzIHRhZyB5b3UgY2FuIGFzc2lnbiB3aGljaCBwYXJzZXIgdG8gdXNlIGZvciBhIGdpdmVuDQorIyBleHRlbnNpb24uIERveHlnZW4gaGFzIGEgYnVpbHQtaW4gbWFwcGluZywgYnV0IHlvdSBjYW4gb3ZlcnJpZGUgb3IgZXh0ZW5kIGl0DQorIyB1c2luZyB0aGlzIHRhZy4gVGhlIGZvcm1hdCBpcyBleHQ9bGFuZ3VhZ2UsIHdoZXJlIGV4dCBpcyBhIGZpbGUgZXh0ZW5zaW9uLA0KKyMgYW5kIGxhbmd1YWdlIGlzIG9uZSBvZiB0aGUgcGFyc2VycyBzdXBwb3J0ZWQgYnkgZG94eWdlbjogSURMLCBKYXZhLA0KKyMgSmF2YXNjcmlwdCwgQ1NoYXJwLCBDLCBDKyssIEQsIFBIUCwgT2JqZWN0aXZlLUMsIFB5dGhvbiwgRm9ydHJhbiwgVkhETCwgQywNCisjIEMrKy4gRm9yIGluc3RhbmNlIHRvIG1ha2UgZG94eWdlbiB0cmVhdCAuaW5jIGZpbGVzIGFzIEZvcnRyYW4gZmlsZXMgKGRlZmF1bHQNCisjIGlzIFBIUCksIGFuZCAuZiBmaWxlcyBhcyBDIChkZWZhdWx0IGlzIEZvcnRyYW4pLCB1c2U6IGluYz1Gb3J0cmFuIGY9Qy4gTm90ZQ0KKyMgdGhhdCBmb3IgY3VzdG9tIGV4dGVuc2lvbnMgeW91IGFsc28gbmVlZCB0byBzZXQgRklMRV9QQVRURVJOUyBvdGhlcndpc2UgdGhlDQorIyBmaWxlcyBhcmUgbm90IHJlYWQgYnkgZG94eWdlbi4NCisNCitFWFRFTlNJT05fTUFQUElORyAgICAgID0NCisNCisjIElmIE1BUktET1dOX1NVUFBPUlQgaXMgZW5hYmxlZCAodGhlIGRlZmF1bHQpIHRoZW4gZG94eWdlbiBwcmUtcHJvY2Vzc2VzIGFsbA0KKyMgY29tbWVudHMgYWNjb3JkaW5nIHRvIHRoZSBNYXJrZG93biBmb3JtYXQsIHdoaWNoIGFsbG93cyBmb3IgbW9yZSByZWFkYWJsZQ0KKyMgZG9jdW1lbnRhdGlvbi4gU2VlIGh0dHA6Ly9kYXJpbmdmaXJlYmFsbC5uZXQvcHJvamVjdHMvbWFya2Rvd24vIGZvciBkZXRhaWxzLg0KKyMgVGhlIG91dHB1dCBvZiBtYXJrZG93biBwcm9jZXNzaW5nIGlzIGZ1cnRoZXIgcHJvY2Vzc2VkIGJ5IGRveHlnZW4sIHNvIHlvdQ0KKyMgY2FuIG1peCBkb3h5Z2VuLCBIVE1MLCBhbmQgWE1MIGNvbW1hbmRzIHdpdGggTWFya2Rvd24gZm9ybWF0dGluZy4NCisjIERpc2FibGUgb25seSBpbiBjYXNlIG9mIGJhY2t3YXJkIGNvbXBhdGliaWxpdGllcyBpc3N1ZXMuDQorDQorTUFSS0RPV05fU1VQUE9SVCAgICAgICA9IFlFUw0KKw0KKyMgV2hlbiBlbmFibGVkIGRveHlnZW4gdHJpZXMgdG8gbGluayB3b3JkcyB0aGF0IGNvcnJlc3BvbmQgdG8gZG9jdW1lbnRlZCBjbGFzc2VzLA0KKyMgb3IgbmFtZXNwYWNlcyB0byB0aGVpciBjb3JyZXNwb25kaW5nIGRvY3VtZW50YXRpb24uIFN1Y2ggYSBsaW5rIGNhbiBiZQ0KKyMgcHJldmVudGVkIGluIGluZGl2aWR1YWwgY2FzZXMgYnkgYnkgcHV0dGluZyBhICUgc2lnbiBpbiBmcm9udCBvZiB0aGUgd29yZCBvcg0KKyMgZ2xvYmFsbHkgYnkgc2V0dGluZyBBVVRPTElOS19TVVBQT1JUIHRvIE5PLg0KKw0KK0FVVE9MSU5LX1NVUFBPUlQgICAgICAgPSBZRVMNCisNCisjIElmIHlvdSB1c2UgU1RMIGNsYXNzZXMgKGkuZS4gc3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yLCBldGMuKSBidXQgZG8gbm90IHdhbnQNCisjIHRvIGluY2x1ZGUgKGEgdGFnIGZpbGUgZm9yKSB0aGUgU1RMIHNvdXJjZXMgYXMgaW5wdXQsIHRoZW4geW91IHNob3VsZA0KKyMgc2V0IHRoaXMgdGFnIHRvIFlFUyBpbiBvcmRlciB0byBsZXQgZG94eWdlbiBtYXRjaCBmdW5jdGlvbnMgZGVjbGFyYXRpb25zIGFuZA0KKyMgZGVmaW5pdGlvbnMgd2hvc2UgYXJndW1lbnRzIGNvbnRhaW4gU1RMIGNsYXNzZXMgKGUuZy4gZnVuYyhzdGQ6OnN0cmluZyk7IHYucy4NCisjIGZ1bmMoc3RkOjpzdHJpbmcpIHt9KS4gVGhpcyBhbHNvIG1ha2VzIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbg0KKyMgZGlhZ3JhbXMgdGhhdCBpbnZvbHZlIFNUTCBjbGFzc2VzIG1vcmUgY29tcGxldGUgYW5kIGFjY3VyYXRlLg0KKw0KK0JVSUxUSU5fU1RMX1NVUFBPUlQgICAgPSBOTw0KKw0KKyMgSWYgeW91IHVzZSBNaWNyb3NvZnQncyBDKysvQ0xJIGxhbmd1YWdlLCB5b3Ugc2hvdWxkIHNldCB0aGlzIG9wdGlvbiB0byBZRVMgdG8NCisjIGVuYWJsZSBwYXJzaW5nIHN1cHBvcnQuDQorDQorQ1BQX0NMSV9TVVBQT1JUICAgICAgICA9IE5PDQorDQorIyBTZXQgdGhlIFNJUF9TVVBQT1JUIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIHNpcCBzb3VyY2VzIG9ubHkuDQorIyBEb3h5Z2VuIHdpbGwgcGFyc2UgdGhlbSBsaWtlIG5vcm1hbCBDKysgYnV0IHdpbGwgYXNzdW1lIGFsbCBjbGFzc2VzIHVzZSBwdWJsaWMNCisjIGluc3RlYWQgb2YgcHJpdmF0ZSBpbmhlcml0YW5jZSB3aGVuIG5vIGV4cGxpY2l0IHByb3RlY3Rpb24ga2V5d29yZCBpcyBwcmVzZW50Lg0KKw0KK1NJUF9TVVBQT1JUICAgICAgICAgICAgPSBOTw0KKw0KKyMgRm9yIE1pY3Jvc29mdCdzIElETCB0aGVyZSBhcmUgcHJvcGdldCBhbmQgcHJvcHB1dCBhdHRyaWJ1dGVzIHRvDQorIyBpbmRpY2F0ZSBnZXR0ZXIgYW5kIHNldHRlciBtZXRob2RzIGZvciBhIHByb3BlcnR5LiBTZXR0aW5nIHRoaXMNCisjIG9wdGlvbiB0byBZRVMgKHRoZSBkZWZhdWx0KSB3aWxsIG1ha2UgZG94eWdlbiByZXBsYWNlIHRoZSBnZXQgYW5kDQorIyBzZXQgbWV0aG9kcyBieSBhIHByb3BlcnR5IGluIHRoZSBkb2N1bWVudGF0aW9uLiBUaGlzIHdpbGwgb25seSB3b3JrDQorIyBpZiB0aGUgbWV0aG9kcyBhcmUgaW5kZWVkIGdldHRpbmcgb3Igc2V0dGluZyBhIHNpbXBsZSB0eXBlLiBJZiB0aGlzDQorIyBpcyBub3QgdGhlIGNhc2UsIG9yIHlvdSB3YW50IHRvIHNob3cgdGhlIG1ldGhvZHMgYW55d2F5LCB5b3Ugc2hvdWxkDQorIyBzZXQgdGhpcyBvcHRpb24gdG8gTk8uDQorDQorSURMX1BST1BFUlRZX1NVUFBPUlQgICA9IFlFUw0KKw0KKyMgSWYgbWVtYmVyIGdyb3VwaW5nIGlzIHVzZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kIHRoZSBESVNUUklCVVRFX0dST1VQX0RPQw0KKyMgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIHJldXNlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBmaXJzdA0KKyMgbWVtYmVyIGluIHRoZSBncm91cCAoaWYgYW55KSBmb3IgdGhlIG90aGVyIG1lbWJlcnMgb2YgdGhlIGdyb3VwLiBCeSBkZWZhdWx0DQorIyBhbGwgbWVtYmVycyBvZiBhIGdyb3VwIG11c3QgYmUgZG9jdW1lbnRlZCBleHBsaWNpdGx5Lg0KKw0KK0RJU1RSSUJVVEVfR1JPVVBfRE9DICAgPSBOTw0KKw0KKyMgU2V0IHRoZSBTVUJHUk9VUElORyB0YWcgdG8gWUVTICh0aGUgZGVmYXVsdCkgdG8gYWxsb3cgY2xhc3MgbWVtYmVyIGdyb3VwcyBvZg0KKyMgdGhlIHNhbWUgdHlwZSAoZm9yIGluc3RhbmNlIGEgZ3JvdXAgb2YgcHVibGljIGZ1bmN0aW9ucykgdG8gYmUgcHV0IGFzIGENCisjIHN1Ymdyb3VwIG9mIHRoYXQgdHlwZSAoZS5nLiB1bmRlciB0aGUgUHVibGljIEZ1bmN0aW9ucyBzZWN0aW9uKS4gU2V0IGl0IHRvDQorIyBOTyB0byBwcmV2ZW50IHN1Ymdyb3VwaW5nLiBBbHRlcm5hdGl2ZWx5LCB0aGlzIGNhbiBiZSBkb25lIHBlciBjbGFzcyB1c2luZw0KKyMgdGhlIFxub3N1Ymdyb3VwaW5nIGNvbW1hbmQuDQorDQorU1VCR1JPVVBJTkcgICAgICAgICAgICA9IFlFUw0KKw0KKyMgV2hlbiB0aGUgSU5MSU5FX0dST1VQRURfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgY2xhc3Nlcywgc3RydWN0cyBhbmQNCisjIHVuaW9ucyBhcmUgc2hvd24gaW5zaWRlIHRoZSBncm91cCBpbiB3aGljaCB0aGV5IGFyZSBpbmNsdWRlZCAoZS5nLiB1c2luZw0KKyMgQGluZ3JvdXApIGluc3RlYWQgb2Ygb24gYSBzZXBhcmF0ZSBwYWdlIChmb3IgSFRNTCBhbmQgTWFuIHBhZ2VzKSBvcg0KKyMgc2VjdGlvbiAoZm9yIExhVGVYIGFuZCBSVEYpLg0KKw0KK0lOTElORV9HUk9VUEVEX0NMQVNTRVMgPSBOTw0KKw0KKyMgV2hlbiB0aGUgSU5MSU5FX1NJTVBMRV9TVFJVQ1RTIHRhZyBpcyBzZXQgdG8gWUVTLCBzdHJ1Y3RzLCBjbGFzc2VzLCBhbmQNCisjIHVuaW9ucyB3aXRoIG9ubHkgcHVibGljIGRhdGEgZmllbGRzIHdpbGwgYmUgc2hvd24gaW5saW5lIGluIHRoZSBkb2N1bWVudGF0aW9uDQorIyBvZiB0aGUgc2NvcGUgaW4gd2hpY2ggdGhleSBhcmUgZGVmaW5lZCAoaS5lLiBmaWxlLCBuYW1lc3BhY2UsIG9yIGdyb3VwDQorIyBkb2N1bWVudGF0aW9uKSwgcHJvdmlkZWQgdGhpcyBzY29wZSBpcyBkb2N1bWVudGVkLiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSwNCisjIHN0cnVjdHMsIGNsYXNzZXMsIGFuZCB1bmlvbnMgYXJlIHNob3duIG9uIGEgc2VwYXJhdGUgcGFnZSAoZm9yIEhUTUwgYW5kIE1hbg0KKyMgcGFnZXMpIG9yIHNlY3Rpb24gKGZvciBMYVRlWCBhbmQgUlRGKS4NCisNCitJTkxJTkVfU0lNUExFX1NUUlVDVFMgID0gTk8NCisNCisjIFdoZW4gVFlQRURFRl9ISURFU19TVFJVQ1QgaXMgZW5hYmxlZCwgYSB0eXBlZGVmIG9mIGEgc3RydWN0LCB1bmlvbiwgb3IgZW51bQ0KKyMgaXMgZG9jdW1lbnRlZCBhcyBzdHJ1Y3QsIHVuaW9uLCBvciBlbnVtIHdpdGggdGhlIG5hbWUgb2YgdGhlIHR5cGVkZWYuIFNvDQorIyB0eXBlZGVmIHN0cnVjdCBUeXBlUyB7fSBUeXBlVCwgd2lsbCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXMgYSBzdHJ1Y3QNCisjIHdpdGggbmFtZSBUeXBlVC4gV2hlbiBkaXNhYmxlZCB0aGUgdHlwZWRlZiB3aWxsIGFwcGVhciBhcyBhIG1lbWJlciBvZiBhIGZpbGUsDQorIyBuYW1lc3BhY2UsIG9yIGNsYXNzLiBBbmQgdGhlIHN0cnVjdCB3aWxsIGJlIG5hbWVkIFR5cGVTLiBUaGlzIGNhbiB0eXBpY2FsbHkNCisjIGJlIHVzZWZ1bCBmb3IgQyBjb2RlIGluIGNhc2UgdGhlIGNvZGluZyBjb252ZW50aW9uIGRpY3RhdGVzIHRoYXQgYWxsIGNvbXBvdW5kDQorIyB0eXBlcyBhcmUgdHlwZWRlZidlZCBhbmQgb25seSB0aGUgdHlwZWRlZiBpcyByZWZlcmVuY2VkLCBuZXZlciB0aGUgdGFnIG5hbWUuDQorDQorVFlQRURFRl9ISURFU19TVFJVQ1QgICA9IE5PDQorDQorIyBUaGUgU1lNQk9MX0NBQ0hFX1NJWkUgZGV0ZXJtaW5lcyB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJuYWwgY2FjaGUgdXNlIHRvDQorIyBkZXRlcm1pbmUgd2hpY2ggc3ltYm9scyB0byBrZWVwIGluIG1lbW9yeSBhbmQgd2hpY2ggdG8gZmx1c2ggdG8gZGlzay4NCisjIFdoZW4gdGhlIGNhY2hlIGlzIGZ1bGwsIGxlc3Mgb2Z0ZW4gdXNlZCBzeW1ib2xzIHdpbGwgYmUgd3JpdHRlbiB0byBkaXNrLg0KKyMgRm9yIHNtYWxsIHRvIG1lZGl1bSBzaXplIHByb2plY3RzICg8MTAwMCBpbnB1dCBmaWxlcykgdGhlIGRlZmF1bHQgdmFsdWUgaXMNCisjIHByb2JhYmx5IGdvb2QgZW5vdWdoLiBGb3IgbGFyZ2VyIHByb2plY3RzIGEgdG9vIHNtYWxsIGNhY2hlIHNpemUgY2FuIGNhdXNlDQorIyBkb3h5Z2VuIHRvIGJlIGJ1c3kgc3dhcHBpbmcgc3ltYm9scyB0byBhbmQgZnJvbSBkaXNrIG1vc3Qgb2YgdGhlIHRpbWUNCisjIGNhdXNpbmcgYSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBwZW5hbHR5Lg0KKyMgSWYgdGhlIHN5c3RlbSBoYXMgZW5vdWdoIHBoeXNpY2FsIG1lbW9yeSBpbmNyZWFzaW5nIHRoZSBjYWNoZSB3aWxsIGltcHJvdmUgdGhlDQorIyBwZXJmb3JtYW5jZSBieSBrZWVwaW5nIG1vcmUgc3ltYm9scyBpbiBtZW1vcnkuIE5vdGUgdGhhdCB0aGUgdmFsdWUgd29ya3Mgb24NCisjIGEgbG9nYXJpdGhtaWMgc2NhbGUgc28gaW5jcmVhc2luZyB0aGUgc2l6ZSBieSBvbmUgd2lsbCByb3VnaGx5IGRvdWJsZSB0aGUNCisjIG1lbW9yeSB1c2FnZS4gVGhlIGNhY2hlIHNpemUgaXMgZ2l2ZW4gYnkgdGhpcyBmb3JtdWxhOg0KKyMgMl4oMTYrU1lNQk9MX0NBQ0hFX1NJWkUpLiBUaGUgdmFsaWQgcmFuZ2UgaXMgMC4uOSwgdGhlIGRlZmF1bHQgaXMgMCwNCisjIGNvcnJlc3BvbmRpbmcgdG8gYSBjYWNoZSBzaXplIG9mIDJeMTYgPSA2NTUzNiBzeW1ib2xzLg0KKw0KK1NZTUJPTF9DQUNIRV9TSVpFICAgICAgPSAwDQorDQorIyBTaW1pbGFyIHRvIHRoZSBTWU1CT0xfQ0FDSEVfU0laRSB0aGUgc2l6ZSBvZiB0aGUgc3ltYm9sIGxvb2t1cCBjYWNoZSBjYW4gYmUNCisjIHNldCB1c2luZyBMT09LVVBfQ0FDSEVfU0laRS4gVGhpcyBjYWNoZSBpcyB1c2VkIHRvIHJlc29sdmUgc3ltYm9scyBnaXZlbg0KKyMgdGhlaXIgbmFtZSBhbmQgc2NvcGUuIFNpbmNlIHRoaXMgY2FuIGJlIGFuIGV4cGVuc2l2ZSBwcm9jZXNzIGFuZCBvZnRlbiB0aGUNCisjIHNhbWUgc3ltYm9sIGFwcGVhciBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgY29kZSwgZG94eWdlbiBrZWVwcyBhIGNhY2hlIG9mDQorIyBwcmUtcmVzb2x2ZWQgc3ltYm9scy4gSWYgdGhlIGNhY2hlIGlzIHRvbyBzbWFsbCBkb3h5Z2VuIHdpbGwgYmVjb21lIHNsb3dlci4NCisjIElmIHRoZSBjYWNoZSBpcyB0b28gbGFyZ2UsIG1lbW9yeSBpcyB3YXN0ZWQuIFRoZSBjYWNoZSBzaXplIGlzIGdpdmVuIGJ5IHRoaXMNCisjIGZvcm11bGE6IDJeKDE2K0xPT0tVUF9DQUNIRV9TSVpFKS4gVGhlIHZhbGlkIHJhbmdlIGlzIDAuLjksIHRoZSBkZWZhdWx0IGlzIDAsDQorIyBjb3JyZXNwb25kaW5nIHRvIGEgY2FjaGUgc2l6ZSBvZiAyXjE2ID0gNjU1MzYgc3ltYm9scy4NCisNCitMT09LVVBfQ0FDSEVfU0laRSAgICAgID0gMA0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIEJ1aWxkIHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIEVYVFJBQ1RfQUxMIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBhc3N1bWUgYWxsIGVudGl0aWVzIGluDQorIyBkb2N1bWVudGF0aW9uIGFyZSBkb2N1bWVudGVkLCBldmVuIGlmIG5vIGRvY3VtZW50YXRpb24gd2FzIGF2YWlsYWJsZS4NCisjIFByaXZhdGUgY2xhc3MgbWVtYmVycyBhbmQgc3RhdGljIGZpbGUgbWVtYmVycyB3aWxsIGJlIGhpZGRlbiB1bmxlc3MNCisjIHRoZSBFWFRSQUNUX1BSSVZBVEUgYW5kIEVYVFJBQ1RfU1RBVElDIHRhZ3MgYXJlIHNldCB0byBZRVMNCisNCitFWFRSQUNUX0FMTCAgICAgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBFWFRSQUNUX1BSSVZBVEUgdGFnIGlzIHNldCB0byBZRVMgYWxsIHByaXZhdGUgbWVtYmVycyBvZiBhIGNsYXNzDQorIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLg0KKw0KK0VYVFJBQ1RfUFJJVkFURSAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBFWFRSQUNUX1BBQ0tBR0UgdGFnIGlzIHNldCB0byBZRVMgYWxsIG1lbWJlcnMgd2l0aCBwYWNrYWdlIG9yIGludGVybmFsDQorIyBzY29wZSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLg0KKw0KK0VYVFJBQ1RfUEFDS0FHRSAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIEVYVFJBQ1RfU1RBVElDIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBzdGF0aWMgbWVtYmVycyBvZiBhIGZpbGUNCisjIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uDQorDQorRVhUUkFDVF9TVEFUSUMgICAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIEVYVFJBQ1RfTE9DQUxfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUyBjbGFzc2VzIChhbmQgc3RydWN0cykNCisjIGRlZmluZWQgbG9jYWxseSBpbiBzb3VyY2UgZmlsZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4NCisjIElmIHNldCB0byBOTyBvbmx5IGNsYXNzZXMgZGVmaW5lZCBpbiBoZWFkZXIgZmlsZXMgYXJlIGluY2x1ZGVkLg0KKw0KK0VYVFJBQ1RfTE9DQUxfQ0xBU1NFUyAgPSBZRVMNCisNCisjIFRoaXMgZmxhZyBpcyBvbmx5IHVzZWZ1bCBmb3IgT2JqZWN0aXZlLUMgY29kZS4gV2hlbiBzZXQgdG8gWUVTIGxvY2FsDQorIyBtZXRob2RzLCB3aGljaCBhcmUgZGVmaW5lZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gc2VjdGlvbiBidXQgbm90IGluDQorIyB0aGUgaW50ZXJmYWNlIGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4NCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIG9ubHkgbWV0aG9kcyBpbiB0aGUgaW50ZXJmYWNlIGFyZSBpbmNsdWRlZC4NCisNCitFWFRSQUNUX0xPQ0FMX01FVEhPRFMgID0gTk8NCisNCisjIElmIHRoaXMgZmxhZyBpcyBzZXQgdG8gWUVTLCB0aGUgbWVtYmVycyBvZiBhbm9ueW1vdXMgbmFtZXNwYWNlcyB3aWxsIGJlDQorIyBleHRyYWN0ZWQgYW5kIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIG5hbWVzcGFjZSBjYWxsZWQNCisjICdhbm9ueW1vdXNfbmFtZXNwYWNle2ZpbGV9Jywgd2hlcmUgZmlsZSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIGJhc2UNCisjIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgYW5vbnltb3VzIG5hbWVzcGFjZS4gQnkgZGVmYXVsdA0KKyMgYW5vbnltb3VzIG5hbWVzcGFjZXMgYXJlIGhpZGRlbi4NCisNCitFWFRSQUNUX0FOT05fTlNQQUNFUyAgID0gTk8NCisNCisjIElmIHRoZSBISURFX1VORE9DX01FTUJFUlMgdGFnIGlzIHNldCB0byBZRVMsIERveHlnZW4gd2lsbCBoaWRlIGFsbA0KKyMgdW5kb2N1bWVudGVkIG1lbWJlcnMgb2YgZG9jdW1lbnRlZCBjbGFzc2VzLCBmaWxlcyBvciBuYW1lc3BhY2VzLg0KKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlc2UgbWVtYmVycyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZQ0KKyMgdmFyaW91cyBvdmVydmlld3MsIGJ1dCBubyBkb2N1bWVudGF0aW9uIHNlY3Rpb24gaXMgZ2VuZXJhdGVkLg0KKyMgVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBpZiBFWFRSQUNUX0FMTCBpcyBlbmFibGVkLg0KKw0KK0hJREVfVU5ET0NfTUVNQkVSUyAgICAgPSBZRVMNCisNCisjIElmIHRoZSBISURFX1VORE9DX0NMQVNTRVMgdGFnIGlzIHNldCB0byBZRVMsIERveHlnZW4gd2lsbCBoaWRlIGFsbA0KKyMgdW5kb2N1bWVudGVkIGNsYXNzZXMgdGhhdCBhcmUgbm9ybWFsbHkgdmlzaWJsZSBpbiB0aGUgY2xhc3MgaGllcmFyY2h5Lg0KKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlc2UgY2xhc3NlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSB2YXJpb3VzDQorIyBvdmVydmlld3MuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QgaWYgRVhUUkFDVF9BTEwgaXMgZW5hYmxlZC4NCisNCitISURFX1VORE9DX0NMQVNTRVMgICAgID0gWUVTDQorDQorIyBJZiB0aGUgSElERV9GUklFTkRfQ09NUE9VTkRTIHRhZyBpcyBzZXQgdG8gWUVTLCBEb3h5Z2VuIHdpbGwgaGlkZSBhbGwNCisjIGZyaWVuZCAoY2xhc3N8c3RydWN0fHVuaW9uKSBkZWNsYXJhdGlvbnMuDQorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBkZWNsYXJhdGlvbnMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUNCisjIGRvY3VtZW50YXRpb24uDQorDQorSElERV9GUklFTkRfQ09NUE9VTkRTICA9IE5PDQorDQorIyBJZiB0aGUgSElERV9JTl9CT0RZX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMsIERveHlnZW4gd2lsbCBoaWRlIGFueQ0KKyMgZG9jdW1lbnRhdGlvbiBibG9ja3MgZm91bmQgaW5zaWRlIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24uDQorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBibG9ja3Mgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUNCisjIGZ1bmN0aW9uJ3MgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBibG9jay4NCisNCitISURFX0lOX0JPRFlfRE9DUyAgICAgID0gTk8NCisNCisjIFRoZSBJTlRFUk5BTF9ET0NTIHRhZyBkZXRlcm1pbmVzIGlmIGRvY3VtZW50YXRpb24NCisjIHRoYXQgaXMgdHlwZWQgYWZ0ZXIgYSBcaW50ZXJuYWwgY29tbWFuZCBpcyBpbmNsdWRlZC4gSWYgdGhlIHRhZyBpcyBzZXQNCisjIHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlbiB0aGUgZG9jdW1lbnRhdGlvbiB3aWxsIGJlIGV4Y2x1ZGVkLg0KKyMgU2V0IGl0IHRvIFlFUyB0byBpbmNsdWRlIHRoZSBpbnRlcm5hbCBkb2N1bWVudGF0aW9uLg0KKw0KK0lOVEVSTkFMX0RPQ1MgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIENBU0VfU0VOU0VfTkFNRVMgdGFnIGlzIHNldCB0byBOTyB0aGVuIERveHlnZW4gd2lsbCBvbmx5IGdlbmVyYXRlDQorIyBmaWxlIG5hbWVzIGluIGxvd2VyLWNhc2UgbGV0dGVycy4gSWYgc2V0IHRvIFlFUyB1cHBlci1jYXNlIGxldHRlcnMgYXJlIGFsc28NCisjIGFsbG93ZWQuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBoYXZlIGNsYXNzZXMgb3IgZmlsZXMgd2hvc2UgbmFtZXMgb25seSBkaWZmZXINCisjIGluIGNhc2UgYW5kIGlmIHlvdXIgZmlsZSBzeXN0ZW0gc3VwcG9ydHMgY2FzZSBzZW5zaXRpdmUgZmlsZSBuYW1lcy4gV2luZG93cw0KKyMgYW5kIE1hYyB1c2VycyBhcmUgYWR2aXNlZCB0byBzZXQgdGhpcyBvcHRpb24gdG8gTk8uDQorDQorQ0FTRV9TRU5TRV9OQU1FUyAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIEhJREVfU0NPUEVfTkFNRVMgdGFnIGlzIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZW4gRG94eWdlbg0KKyMgd2lsbCBzaG93IG1lbWJlcnMgd2l0aCB0aGVpciBmdWxsIGNsYXNzIGFuZCBuYW1lc3BhY2Ugc2NvcGVzIGluIHRoZQ0KKyMgZG9jdW1lbnRhdGlvbi4gSWYgc2V0IHRvIFlFUyB0aGUgc2NvcGUgd2lsbCBiZSBoaWRkZW4uDQorDQorSElERV9TQ09QRV9OQU1FUyAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgU0hPV19JTkNMVURFX0ZJTEVTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBEb3h5Z2VuDQorIyB3aWxsIHB1dCBhIGxpc3Qgb2YgdGhlIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGJ5IGEgZmlsZSBpbiB0aGUgZG9jdW1lbnRhdGlvbg0KKyMgb2YgdGhhdCBmaWxlLg0KKw0KK1NIT1dfSU5DTFVERV9GSUxFUyAgICAgPSBZRVMNCisNCisjIElmIHRoZSBGT1JDRV9MT0NBTF9JTkNMVURFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4NCisjIHdpbGwgbGlzdCBpbmNsdWRlIGZpbGVzIHdpdGggZG91YmxlIHF1b3RlcyBpbiB0aGUgZG9jdW1lbnRhdGlvbg0KKyMgcmF0aGVyIHRoYW4gd2l0aCBzaGFycCBicmFja2V0cy4NCisNCitGT1JDRV9MT0NBTF9JTkNMVURFUyAgID0gTk8NCisNCisjIElmIHRoZSBJTkxJTkVfSU5GTyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gYSB0YWcgW2lubGluZV0NCisjIGlzIGluc2VydGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvciBpbmxpbmUgbWVtYmVycy4NCisNCitJTkxJTkVfSU5GTyAgICAgICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgU09SVF9NRU1CRVJfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gZG94eWdlbg0KKyMgd2lsbCBzb3J0IHRoZSAoZGV0YWlsZWQpIGRvY3VtZW50YXRpb24gb2YgZmlsZSBhbmQgY2xhc3MgbWVtYmVycw0KKyMgYWxwaGFiZXRpY2FsbHkgYnkgbWVtYmVyIG5hbWUuIElmIHNldCB0byBOTyB0aGUgbWVtYmVycyB3aWxsIGFwcGVhciBpbg0KKyMgZGVjbGFyYXRpb24gb3JkZXIuDQorDQorU09SVF9NRU1CRVJfRE9DUyAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIFNPUlRfQlJJRUZfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZQ0KKyMgYnJpZWYgZG9jdW1lbnRhdGlvbiBvZiBmaWxlLCBuYW1lc3BhY2UgYW5kIGNsYXNzIG1lbWJlcnMgYWxwaGFiZXRpY2FsbHkNCisjIGJ5IG1lbWJlciBuYW1lLiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGUgbWVtYmVycyB3aWxsIGFwcGVhciBpbg0KKyMgZGVjbGFyYXRpb24gb3JkZXIuDQorDQorU09SVF9CUklFRl9ET0NTICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgU09SVF9NRU1CRVJTX0NUT1JTXzFTVCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4NCisjIHdpbGwgc29ydCB0aGUgKGJyaWVmIGFuZCBkZXRhaWxlZCkgZG9jdW1lbnRhdGlvbiBvZiBjbGFzcyBtZW1iZXJzIHNvIHRoYXQNCisjIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYXJlIGxpc3RlZCBmaXJzdC4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkNCisjIHRoZSBjb25zdHJ1Y3RvcnMgd2lsbCBhcHBlYXIgaW4gdGhlIHJlc3BlY3RpdmUgb3JkZXJzIGRlZmluZWQgYnkNCisjIFNPUlRfTUVNQkVSX0RPQ1MgYW5kIFNPUlRfQlJJRUZfRE9DUy4NCisjIFRoaXMgdGFnIHdpbGwgYmUgaWdub3JlZCBmb3IgYnJpZWYgZG9jcyBpZiBTT1JUX0JSSUVGX0RPQ1MgaXMgc2V0IHRvIE5PDQorIyBhbmQgaWdub3JlZCBmb3IgZGV0YWlsZWQgZG9jcyBpZiBTT1JUX01FTUJFUl9ET0NTIGlzIHNldCB0byBOTy4NCisNCitTT1JUX01FTUJFUlNfQ1RPUlNfMVNUID0gTk8NCisNCisjIElmIHRoZSBTT1JUX0dST1VQX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlDQorIyBoaWVyYXJjaHkgb2YgZ3JvdXAgbmFtZXMgaW50byBhbHBoYWJldGljYWwgb3JkZXIuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpDQorIyB0aGUgZ3JvdXAgbmFtZXMgd2lsbCBhcHBlYXIgaW4gdGhlaXIgZGVmaW5lZCBvcmRlci4NCisNCitTT1JUX0dST1VQX05BTUVTICAgICAgID0gTk8NCisNCisjIElmIHRoZSBTT1JUX0JZX1NDT1BFX05BTUUgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBjbGFzcyBsaXN0IHdpbGwgYmUNCisjIHNvcnRlZCBieSBmdWxseS1xdWFsaWZpZWQgbmFtZXMsIGluY2x1ZGluZyBuYW1lc3BhY2VzLiBJZiBzZXQgdG8NCisjIE5PICh0aGUgZGVmYXVsdCksIHRoZSBjbGFzcyBsaXN0IHdpbGwgYmUgc29ydGVkIG9ubHkgYnkgY2xhc3MgbmFtZSwNCisjIG5vdCBpbmNsdWRpbmcgdGhlIG5hbWVzcGFjZSBwYXJ0Lg0KKyMgTm90ZTogVGhpcyBvcHRpb24gaXMgbm90IHZlcnkgdXNlZnVsIGlmIEhJREVfU0NPUEVfTkFNRVMgaXMgc2V0IHRvIFlFUy4NCisjIE5vdGU6IFRoaXMgb3B0aW9uIGFwcGxpZXMgb25seSB0byB0aGUgY2xhc3MgbGlzdCwgbm90IHRvIHRoZQ0KKyMgYWxwaGFiZXRpY2FsIGxpc3QuDQorDQorU09SVF9CWV9TQ09QRV9OQU1FICAgICA9IE5PDQorDQorIyBJZiB0aGUgU1RSSUNUX1BST1RPX01BVENISU5HIG9wdGlvbiBpcyBlbmFibGVkIGFuZCBkb3h5Z2VuIGZhaWxzIHRvDQorIyBkbyBwcm9wZXIgdHlwZSByZXNvbHV0aW9uIG9mIGFsbCBwYXJhbWV0ZXJzIG9mIGEgZnVuY3Rpb24gaXQgd2lsbCByZWplY3QgYQ0KKyMgbWF0Y2ggYmV0d2VlbiB0aGUgcHJvdG90eXBlIGFuZCB0aGUgaW1wbGVtZW50YXRpb24gb2YgYSBtZW1iZXIgZnVuY3Rpb24gZXZlbg0KKyMgaWYgdGhlcmUgaXMgb25seSBvbmUgY2FuZGlkYXRlIG9yIGl0IGlzIG9idmlvdXMgd2hpY2ggY2FuZGlkYXRlIHRvIGNob29zZQ0KKyMgYnkgZG9pbmcgYSBzaW1wbGUgc3RyaW5nIG1hdGNoLiBCeSBkaXNhYmxpbmcgU1RSSUNUX1BST1RPX01BVENISU5HIGRveHlnZW4NCisjIHdpbGwgc3RpbGwgYWNjZXB0IGEgbWF0Y2ggYmV0d2VlbiBwcm90b3R5cGUgYW5kIGltcGxlbWVudGF0aW9uIGluIHN1Y2ggY2FzZXMuDQorDQorU1RSSUNUX1BST1RPX01BVENISU5HICA9IE5PDQorDQorIyBUaGUgR0VORVJBVEVfVE9ET0xJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvcg0KKyMgZGlzYWJsZSAoTk8pIHRoZSB0b2RvIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXHRvZG8NCisjIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLg0KKw0KK0dFTkVSQVRFX1RPRE9MSVNUICAgICAgPSBZRVMNCisNCisjIFRoZSBHRU5FUkFURV9URVNUTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yDQorIyBkaXNhYmxlIChOTykgdGhlIHRlc3QgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcdGVzdA0KKyMgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uDQorDQorR0VORVJBVEVfVEVTVExJU1QgICAgICA9IFlFUw0KKw0KKyMgVGhlIEdFTkVSQVRFX0JVR0xJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvcg0KKyMgZGlzYWJsZSAoTk8pIHRoZSBidWcgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcYnVnDQorIyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4NCisNCitHRU5FUkFURV9CVUdMSVNUICAgICAgID0gWUVTDQorDQorIyBUaGUgR0VORVJBVEVfREVQUkVDQVRFRExJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvcg0KKyMgZGlzYWJsZSAoTk8pIHRoZSBkZXByZWNhdGVkIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcNCisjIFxkZXByZWNhdGVkIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLg0KKw0KK0dFTkVSQVRFX0RFUFJFQ0FURURMSVNUPSBZRVMNCisNCisjIFRoZSBFTkFCTEVEX1NFQ1RJT05TIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgY29uZGl0aW9uYWwNCisjIGRvY3VtZW50YXRpb24gc2VjdGlvbnMsIG1hcmtlZCBieSBcaWYgc2VjdGlvbm5hbWUgLi4uIFxlbmRpZi4NCisNCitFTkFCTEVEX1NFQ1RJT05TICAgICAgID0NCisNCisjIFRoZSBNQVhfSU5JVElBTElaRVJfTElORVMgdGFnIGRldGVybWluZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxpbmVzDQorIyB0aGUgaW5pdGlhbCB2YWx1ZSBvZiBhIHZhcmlhYmxlIG9yIG1hY3JvIGNvbnNpc3RzIG9mIGZvciBpdCB0byBhcHBlYXIgaW4NCisjIHRoZSBkb2N1bWVudGF0aW9uLiBJZiB0aGUgaW5pdGlhbGl6ZXIgY29uc2lzdHMgb2YgbW9yZSBsaW5lcyB0aGFuIHNwZWNpZmllZA0KKyMgaGVyZSBpdCB3aWxsIGJlIGhpZGRlbi4gVXNlIGEgdmFsdWUgb2YgMCB0byBoaWRlIGluaXRpYWxpemVycyBjb21wbGV0ZWx5Lg0KKyMgVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGluaXRpYWxpemVyIG9mIGluZGl2aWR1YWwgdmFyaWFibGVzIGFuZCBtYWNyb3MgaW4gdGhlDQorIyBkb2N1bWVudGF0aW9uIGNhbiBiZSBjb250cm9sbGVkIHVzaW5nIFxzaG93aW5pdGlhbGl6ZXIgb3IgXGhpZGVpbml0aWFsaXplcg0KKyMgY29tbWFuZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiByZWdhcmRsZXNzIG9mIHRoaXMgc2V0dGluZy4NCisNCitNQVhfSU5JVElBTElaRVJfTElORVMgID0gMzANCisNCisjIFNldCB0aGUgU0hPV19VU0VEX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBsaXN0IG9mIGZpbGVzIGdlbmVyYXRlZA0KKyMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBjbGFzc2VzIGFuZCBzdHJ1Y3RzLiBJZiBzZXQgdG8gWUVTIHRoZQ0KKyMgbGlzdCB3aWxsIG1lbnRpb24gdGhlIGZpbGVzIHRoYXQgd2VyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBkb2N1bWVudGF0aW9uLg0KKw0KK1NIT1dfVVNFRF9GSUxFUyAgICAgICAgPSBZRVMNCisNCisjIFNldCB0aGUgU0hPV19GSUxFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgRmlsZXMgcGFnZS4NCisjIFRoaXMgd2lsbCByZW1vdmUgdGhlIEZpbGVzIGVudHJ5IGZyb20gdGhlIFF1aWNrIEluZGV4IGFuZCBmcm9tIHRoZQ0KKyMgRm9sZGVyIFRyZWUgVmlldyAoaWYgc3BlY2lmaWVkKS4gVGhlIGRlZmF1bHQgaXMgWUVTLg0KKw0KKyMgV2UgcHJvYmFibHkgd2lsbCB3YW50IHRoaXMsIGJ1dCB3ZSBoYXZlIG5vIGZpbGUgZG9jdW1lbnRhdGlvbiB5ZXQgc28gaXQncyBzaW1wbGVyIHRvIHJlbW92ZQ0KKyMgaXQgZm9yIG5vdy4NCitTSE9XX0ZJTEVTICAgICAgICAgICAgID0gTk8NCisNCisjIFNldCB0aGUgU0hPV19OQU1FU1BBQ0VTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZQ0KKyMgTmFtZXNwYWNlcyBwYWdlLg0KKyMgVGhpcyB3aWxsIHJlbW92ZSB0aGUgTmFtZXNwYWNlcyBlbnRyeSBmcm9tIHRoZSBRdWljayBJbmRleA0KKyMgYW5kIGZyb20gdGhlIEZvbGRlciBUcmVlIFZpZXcgKGlmIHNwZWNpZmllZCkuIFRoZSBkZWZhdWx0IGlzIFlFUy4NCisNCitTSE9XX05BTUVTUEFDRVMgICAgICAgID0gWUVTDQorDQorIyBUaGUgRklMRV9WRVJTSU9OX0ZJTFRFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByb2dyYW0gb3Igc2NyaXB0IHRoYXQNCisjIGRveHlnZW4gc2hvdWxkIGludm9rZSB0byBnZXQgdGhlIGN1cnJlbnQgdmVyc2lvbiBmb3IgZWFjaCBmaWxlICh0eXBpY2FsbHkgZnJvbQ0KKyMgdGhlIHZlcnNpb24gY29udHJvbCBzeXN0ZW0pLiBEb3h5Z2VuIHdpbGwgaW52b2tlIHRoZSBwcm9ncmFtIGJ5IGV4ZWN1dGluZyAodmlhDQorIyBwb3BlbigpKSB0aGUgY29tbWFuZCA8Y29tbWFuZD4gPGlucHV0LWZpbGU+LCB3aGVyZSA8Y29tbWFuZD4gaXMgdGhlIHZhbHVlIG9mDQorIyB0aGUgRklMRV9WRVJTSU9OX0ZJTFRFUiB0YWcsIGFuZCA8aW5wdXQtZmlsZT4gaXMgdGhlIG5hbWUgb2YgYW4gaW5wdXQgZmlsZQ0KKyMgcHJvdmlkZWQgYnkgZG94eWdlbi4gV2hhdGV2ZXIgdGhlIHByb2dyYW0gd3JpdGVzIHRvIHN0YW5kYXJkIG91dHB1dA0KKyMgaXMgdXNlZCBhcyB0aGUgZmlsZSB2ZXJzaW9uLiBTZWUgdGhlIG1hbnVhbCBmb3IgZXhhbXBsZXMuDQorDQorRklMRV9WRVJTSU9OX0ZJTFRFUiAgICA9DQorDQorIyBUaGUgTEFZT1VUX0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsYXlvdXQgZmlsZSB3aGljaCB3aWxsIGJlIHBhcnNlZA0KKyMgYnkgZG94eWdlbi4gVGhlIGxheW91dCBmaWxlIGNvbnRyb2xzIHRoZSBnbG9iYWwgc3RydWN0dXJlIG9mIHRoZSBnZW5lcmF0ZWQNCisjIG91dHB1dCBmaWxlcyBpbiBhbiBvdXRwdXQgZm9ybWF0IGluZGVwZW5kZW50IHdheS4gVG8gY3JlYXRlIHRoZSBsYXlvdXQgZmlsZQ0KKyMgdGhhdCByZXByZXNlbnRzIGRveHlnZW4ncyBkZWZhdWx0cywgcnVuIGRveHlnZW4gd2l0aCB0aGUgLWwgb3B0aW9uLg0KKyMgWW91IGNhbiBvcHRpb25hbGx5IHNwZWNpZnkgYSBmaWxlIG5hbWUgYWZ0ZXIgdGhlIG9wdGlvbiwgaWYgb21pdHRlZA0KKyMgRG94eWdlbkxheW91dC54bWwgd2lsbCBiZSB1c2VkIGFzIHRoZSBuYW1lIG9mIHRoZSBsYXlvdXQgZmlsZS4NCisNCitMQVlPVVRfRklMRSAgICAgICAgICAgID0NCisNCisjIFRoZSBDSVRFX0JJQl9GSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBiaWIgZmlsZXMNCisjIGNvbnRhaW5pbmcgdGhlIHJlZmVyZW5jZXMgZGF0YS4gVGhpcyBtdXN0IGJlIGEgbGlzdCBvZiAuYmliIGZpbGVzLiBUaGUNCisjIC5iaWIgZXh0ZW5zaW9uIGlzIGF1dG9tYXRpY2FsbHkgYXBwZW5kZWQgaWYgb21pdHRlZC4gVXNpbmcgdGhpcyBjb21tYW5kDQorIyByZXF1aXJlcyB0aGUgYmlidGV4IHRvb2wgdG8gYmUgaW5zdGFsbGVkLiBTZWUgYWxzbw0KKyMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaWJUZVggZm9yIG1vcmUgaW5mby4gRm9yIExhVGVYIHRoZSBzdHlsZQ0KKyMgb2YgdGhlIGJpYmxpb2dyYXBoeSBjYW4gYmUgY29udHJvbGxlZCB1c2luZyBMQVRFWF9CSUJfU1RZTEUuIFRvIHVzZSB0aGlzDQorIyBmZWF0dXJlIHlvdSBuZWVkIGJpYnRleCBhbmQgcGVybCBhdmFpbGFibGUgaW4gdGhlIHNlYXJjaCBwYXRoLg0KKw0KK0NJVEVfQklCX0ZJTEVTICAgICAgICAgPQ0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHdhcm5pbmcgYW5kIHByb2dyZXNzIG1lc3NhZ2VzDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgVGhlIFFVSUVUIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgbWVzc2FnZXMgdGhhdCBhcmUgZ2VuZXJhdGVkDQorIyBieSBkb3h5Z2VuLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIFlFUyBhbmQgTk8uIElmIGxlZnQgYmxhbmsgTk8gaXMgdXNlZC4NCisNCitRVUlFVCAgICAgICAgICAgICAgICAgID0gTk8NCisNCisjIFRoZSBXQVJOSU5HUyB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIHdhcm5pbmcgbWVzc2FnZXMgdGhhdCBhcmUNCisjIGdlbmVyYXRlZCBieSBkb3h5Z2VuLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIFlFUyBhbmQgTk8uIElmIGxlZnQgYmxhbmsNCisjIE5PIGlzIHVzZWQuDQorDQorV0FSTklOR1MgICAgICAgICAgICAgICA9IFlFUw0KKw0KKyMgSWYgV0FSTl9JRl9VTkRPQ1VNRU5URUQgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgd2FybmluZ3MNCisjIGZvciB1bmRvY3VtZW50ZWQgbWVtYmVycy4gSWYgRVhUUkFDVF9BTEwgaXMgc2V0IHRvIFlFUyB0aGVuIHRoaXMgZmxhZyB3aWxsDQorIyBhdXRvbWF0aWNhbGx5IGJlIGRpc2FibGVkLg0KKw0KK1dBUk5fSUZfVU5ET0NVTUVOVEVEICAgPSBZRVMNCisNCisjIElmIFdBUk5fSUZfRE9DX0VSUk9SIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSB3YXJuaW5ncyBmb3INCisjIHBvdGVudGlhbCBlcnJvcnMgaW4gdGhlIGRvY3VtZW50YXRpb24sIHN1Y2ggYXMgbm90IGRvY3VtZW50aW5nIHNvbWUNCisjIHBhcmFtZXRlcnMgaW4gYSBkb2N1bWVudGVkIGZ1bmN0aW9uLCBvciBkb2N1bWVudGluZyBwYXJhbWV0ZXJzIHRoYXQNCisjIGRvbid0IGV4aXN0IG9yIHVzaW5nIG1hcmt1cCBjb21tYW5kcyB3cm9uZ2x5Lg0KKw0KK1dBUk5fSUZfRE9DX0VSUk9SICAgICAgPSBZRVMNCisNCisjIFRoZSBXQVJOX05PX1BBUkFNRE9DIG9wdGlvbiBjYW4gYmUgZW5hYmxlZCB0byBnZXQgd2FybmluZ3MgZm9yDQorIyBmdW5jdGlvbnMgdGhhdCBhcmUgZG9jdW1lbnRlZCwgYnV0IGhhdmUgbm8gZG9jdW1lbnRhdGlvbiBmb3IgdGhlaXIgcGFyYW1ldGVycw0KKyMgb3IgcmV0dXJuIHZhbHVlLiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSBkb3h5Z2VuIHdpbGwgb25seSB3YXJuIGFib3V0DQorIyB3cm9uZyBvciBpbmNvbXBsZXRlIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uLCBidXQgbm90IGFib3V0IHRoZSBhYnNlbmNlIG9mDQorIyBkb2N1bWVudGF0aW9uLg0KKw0KK1dBUk5fTk9fUEFSQU1ET0MgICAgICAgPSBOTw0KKw0KKyMgVGhlIFdBUk5fRk9STUFUIHRhZyBkZXRlcm1pbmVzIHRoZSBmb3JtYXQgb2YgdGhlIHdhcm5pbmcgbWVzc2FnZXMgdGhhdA0KKyMgZG94eWdlbiBjYW4gcHJvZHVjZS4gVGhlIHN0cmluZyBzaG91bGQgY29udGFpbiB0aGUgJGZpbGUsICRsaW5lLCBhbmQgJHRleHQNCisjIHRhZ3MsIHdoaWNoIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGZyb20gd2hpY2ggdGhlDQorIyB3YXJuaW5nIG9yaWdpbmF0ZWQgYW5kIHRoZSB3YXJuaW5nIHRleHQuIE9wdGlvbmFsbHkgdGhlIGZvcm1hdCBtYXkgY29udGFpbg0KKyMgJHZlcnNpb24sIHdoaWNoIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHZlcnNpb24gb2YgdGhlIGZpbGUgKGlmIGl0IGNvdWxkDQorIyBiZSBvYnRhaW5lZCB2aWEgRklMRV9WRVJTSU9OX0ZJTFRFUikNCisNCitXQVJOX0ZPUk1BVCAgICAgICAgICAgID0NCisNCisjIFRoZSBXQVJOX0xPR0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBmaWxlIHRvIHdoaWNoIHdhcm5pbmcNCisjIGFuZCBlcnJvciBtZXNzYWdlcyBzaG91bGQgYmUgd3JpdHRlbi4gSWYgbGVmdCBibGFuayB0aGUgb3V0cHV0IGlzIHdyaXR0ZW4NCisjIHRvIHN0ZGVyci4NCisNCitXQVJOX0xPR0ZJTEUgICAgICAgICAgID0NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgaW5wdXQgZmlsZXMNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBUaGUgSU5QVVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4NCisjIGRvY3VtZW50ZWQgc291cmNlIGZpbGVzLiBZb3UgbWF5IGVudGVyIGZpbGUgbmFtZXMgbGlrZSAibXlmaWxlLmNwcCIgb3INCisjIGRpcmVjdG9yaWVzIGxpa2UgIi91c3Ivc3JjL215cHJvamVjdCIuIFNlcGFyYXRlIHRoZSBmaWxlcyBvciBkaXJlY3Rvcmllcw0KKyMgd2l0aCBzcGFjZXMuDQorDQorSU5QVVQgICAgICAgICAgICAgICAgICA9IHNyYyAgZG9jL2RveHlnZW4vbGlib21wX2ludGVyZmFjZS5oDQorIyBUaGUgaXR0bm90aWZ5IGNvZGUgYWxzbyBoYXMgZG94eWdlbiBkb2N1bWVudGF0aW9uLCBidXQgaWYgd2UgaW5jbHVkZSBpdCBoZXJlDQorIyBpdCB0YWtlcyBvdmVyIGZyb20gdXMhDQorIyBzcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkNCisNCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBvZiB0aGUgc291cmNlIGZpbGVzDQorIyB0aGF0IGRveHlnZW4gcGFyc2VzLiBJbnRlcm5hbGx5IGRveHlnZW4gdXNlcyB0aGUgVVRGLTggZW5jb2RpbmcsIHdoaWNoIGlzDQorIyBhbHNvIHRoZSBkZWZhdWx0IGlucHV0IGVuY29kaW5nLiBEb3h5Z2VuIHVzZXMgbGliaWNvbnYgKG9yIHRoZSBpY29udiBidWlsdA0KKyMgaW50byBsaWJjKSBmb3IgdGhlIHRyYW5zY29kaW5nLiBTZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmljb252IGZvcg0KKyMgdGhlIGxpc3Qgb2YgcG9zc2libGUgZW5jb2RpbmdzLg0KKw0KK0lOUFVUX0VOQ09ESU5HICAgICAgICAgPSBVVEYtOA0KKw0KKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQ0KKyMgRklMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJuIChsaWtlICouY3BwDQorIyBhbmQgKi5oKSB0byBmaWx0ZXIgb3V0IHRoZSBzb3VyY2UtZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLiBJZiBsZWZ0DQorIyBibGFuayB0aGUgZm9sbG93aW5nIHBhdHRlcm5zIGFyZSB0ZXN0ZWQ6DQorIyAqLmMgKi5jYyAqLmN4eCAqLmNwcCAqLmMrKyAqLmQgKi5qYXZhICouaWkgKi5peHggKi5pcHAgKi5pKysgKi5pbmwgKi5oICouaGgNCisjICouaHh4ICouaHBwICouaCsrICouaWRsICoub2RsICouY3MgKi5waHAgKi5waHAzICouaW5jICoubSAqLm1tICouZG94ICoucHkNCisjICouZjkwICouZiAqLmZvciAqLnZoZCAqLnZoZGwNCisNCitGSUxFX1BBVFRFUk5TICAgICAgICAgID0gKi5jICouaCAqLmNwcA0KKyMgV2UgbWF5IGFsc28gd2FudCB0byBpbmNsdWRlIHRoZSBhc20gZmlsZXMgd2l0aCBhcHByb3ByaWF0ZSBpZmRlZiB0byBlbnN1cmUNCisjIGRveHlnZW4gZG9lc24ndCBzZWUgdGhlIGNvbnRlbnQsIGp1c3QgdGhlIGRvY3VtZW50YXRpb24uLi4NCisNCisjIFRoZSBSRUNVUlNJVkUgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gc3BlY2lmeSB3aGV0aGVyIG9yIG5vdCBzdWJkaXJlY3Rvcmllcw0KKyMgc2hvdWxkIGJlIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyBhcyB3ZWxsLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIFlFUyBhbmQgTk8uDQorIyBJZiBsZWZ0IGJsYW5rIE5PIGlzIHVzZWQuDQorDQorIyBPbmx5IGxvb2sgaW4gdGhlIG9uZSBkaXJlY3RvcnkuDQorUkVDVVJTSVZFICAgICAgICAgICAgICA9IE5PDQorDQorIyBUaGUgRVhDTFVERSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgYmUNCisjIGV4Y2x1ZGVkIGZyb20gdGhlIElOUFVUIHNvdXJjZSBmaWxlcy4gVGhpcyB3YXkgeW91IGNhbiBlYXNpbHkgZXhjbHVkZSBhDQorIyBzdWJkaXJlY3RvcnkgZnJvbSBhIGRpcmVjdG9yeSB0cmVlIHdob3NlIHJvb3QgaXMgc3BlY2lmaWVkIHdpdGggdGhlIElOUFVUIHRhZy4NCisjIE5vdGUgdGhhdCByZWxhdGl2ZSBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRveHlnZW4gaXMNCisjIHJ1bi4NCisNCitFWENMVURFICAgICAgICAgICAgICAgID0gc3JjL3Rlc3QtdG91Y2guYw0KKw0KKyMgVGhlIEVYQ0xVREVfU1lNTElOS1MgdGFnIGNhbiBiZSB1c2VkIHRvIHNlbGVjdCB3aGV0aGVyIG9yIG5vdCBmaWxlcyBvcg0KKyMgZGlyZWN0b3JpZXMgdGhhdCBhcmUgc3ltYm9saWMgbGlua3MgKGEgVW5peCBmaWxlIHN5c3RlbSBmZWF0dXJlKSBhcmUgZXhjbHVkZWQNCisjIGZyb20gdGhlIGlucHV0Lg0KKw0KK0VYQ0xVREVfU1lNTElOS1MgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQ0KKyMgRVhDTFVERV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJucyB0byBleGNsdWRlDQorIyBjZXJ0YWluIGZpbGVzIGZyb20gdGhvc2UgZGlyZWN0b3JpZXMuIE5vdGUgdGhhdCB0aGUgd2lsZGNhcmRzIGFyZSBtYXRjaGVkDQorIyBhZ2FpbnN0IHRoZSBmaWxlIHdpdGggYWJzb2x1dGUgcGF0aCwgc28gdG8gZXhjbHVkZSBhbGwgdGVzdCBkaXJlY3Rvcmllcw0KKyMgZm9yIGV4YW1wbGUgdXNlIHRoZSBwYXR0ZXJuICovdGVzdC8qDQorDQorRVhDTFVERV9QQVRURVJOUyAgICAgICA9DQorDQorIyBUaGUgRVhDTFVERV9TWU1CT0xTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHN5bWJvbCBuYW1lcw0KKyMgKG5hbWVzcGFjZXMsIGNsYXNzZXMsIGZ1bmN0aW9ucywgZXRjLikgdGhhdCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSB0aGUNCisjIG91dHB1dC4gVGhlIHN5bWJvbCBuYW1lIGNhbiBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLCBhIHdvcmQsIG9yIGlmIHRoZQ0KKyMgd2lsZGNhcmQgKiBpcyB1c2VkLCBhIHN1YnN0cmluZy4gRXhhbXBsZXM6IEFOYW1lc3BhY2UsIEFDbGFzcywNCisjIEFDbGFzczo6QU5hbWVzcGFjZSwgQU5hbWVzcGFjZTo6KlRlc3QNCisNCitFWENMVURFX1NZTUJPTFMgICAgICAgID0NCisNCisjIFRoZSBFWEFNUExFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3INCisjIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbiBleGFtcGxlIGNvZGUgZnJhZ21lbnRzIHRoYXQgYXJlIGluY2x1ZGVkIChzZWUNCisjIHRoZSBcaW5jbHVkZSBjb21tYW5kKS4NCisNCitFWEFNUExFX1BBVEggICAgICAgICAgID0NCisNCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgRVhBTVBMRV9QQVRIIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlDQorIyBFWEFNUExFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm4gKGxpa2UgKi5jcHANCisjIGFuZCAqLmgpIHRvIGZpbHRlciBvdXQgdGhlIHNvdXJjZS1maWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuIElmIGxlZnQNCisjIGJsYW5rIGFsbCBmaWxlcyBhcmUgaW5jbHVkZWQuDQorDQorRVhBTVBMRV9QQVRURVJOUyAgICAgICA9DQorDQorIyBJZiB0aGUgRVhBTVBMRV9SRUNVUlNJVkUgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBzdWJkaXJlY3RvcmllcyB3aWxsIGJlDQorIyBzZWFyY2hlZCBmb3IgaW5wdXQgZmlsZXMgdG8gYmUgdXNlZCB3aXRoIHRoZSBcaW5jbHVkZSBvciBcZG9udGluY2x1ZGUNCisjIGNvbW1hbmRzIGlycmVzcGVjdGl2ZSBvZiB0aGUgdmFsdWUgb2YgdGhlIFJFQ1VSU0lWRSB0YWcuDQorIyBQb3NzaWJsZSB2YWx1ZXMgYXJlIFlFUyBhbmQgTk8uIElmIGxlZnQgYmxhbmsgTk8gaXMgdXNlZC4NCisNCitFWEFNUExFX1JFQ1VSU0lWRSAgICAgID0gTk8NCisNCisjIFRoZSBJTUFHRV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIG9yDQorIyBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4gaW1hZ2UgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZQ0KKyMgdGhlIFxpbWFnZSBjb21tYW5kKS4NCisNCitJTUFHRV9QQVRIICAgICAgICAgICAgID0NCisNCisjIFRoZSBJTlBVVF9GSUxURVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwcm9ncmFtIHRoYXQgZG94eWdlbiBzaG91bGQNCisjIGludm9rZSB0byBmaWx0ZXIgZm9yIGVhY2ggaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgZmlsdGVyIHByb2dyYW0NCisjIGJ5IGV4ZWN1dGluZyAodmlhIHBvcGVuKCkpIHRoZSBjb21tYW5kIDxmaWx0ZXI+IDxpbnB1dC1maWxlPiwgd2hlcmUgPGZpbHRlcj4NCisjIGlzIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVRfRklMVEVSIHRhZywgYW5kIDxpbnB1dC1maWxlPiBpcyB0aGUgbmFtZSBvZiBhbg0KKyMgaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIHRoZW4gdXNlIHRoZSBvdXRwdXQgdGhhdCB0aGUgZmlsdGVyIHByb2dyYW0gd3JpdGVzDQorIyB0byBzdGFuZGFyZCBvdXRwdXQuDQorIyBJZiBGSUxURVJfUEFUVEVSTlMgaXMgc3BlY2lmaWVkLCB0aGlzIHRhZyB3aWxsIGJlDQorIyBpZ25vcmVkLg0KKw0KK0lOUFVUX0ZJTFRFUiAgICAgICAgICAgPQ0KKw0KKyMgVGhlIEZJTFRFUl9QQVRURVJOUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBmaWx0ZXJzIG9uIGEgcGVyIGZpbGUgcGF0dGVybg0KKyMgYmFzaXMuDQorIyBEb3h5Z2VuIHdpbGwgY29tcGFyZSB0aGUgZmlsZSBuYW1lIHdpdGggZWFjaCBwYXR0ZXJuIGFuZCBhcHBseSB0aGUNCisjIGZpbHRlciBpZiB0aGVyZSBpcyBhIG1hdGNoLg0KKyMgVGhlIGZpbHRlcnMgYXJlIGEgbGlzdCBvZiB0aGUgZm9ybToNCisjIHBhdHRlcm49ZmlsdGVyIChsaWtlICouY3BwPW15X2NwcF9maWx0ZXIpLiBTZWUgSU5QVVRfRklMVEVSIGZvciBmdXJ0aGVyDQorIyBpbmZvIG9uIGhvdyBmaWx0ZXJzIGFyZSB1c2VkLiBJZiBGSUxURVJfUEFUVEVSTlMgaXMgZW1wdHkgb3IgaWYNCisjIG5vbiBvZiB0aGUgcGF0dGVybnMgbWF0Y2ggdGhlIGZpbGUgbmFtZSwgSU5QVVRfRklMVEVSIGlzIGFwcGxpZWQuDQorDQorRklMVEVSX1BBVFRFUk5TICAgICAgICA9DQorDQorIyBJZiB0aGUgRklMVEVSX1NPVVJDRV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGlucHV0IGZpbHRlciAoaWYgc2V0IHVzaW5nDQorIyBJTlBVVF9GSUxURVIpIHdpbGwgYmUgdXNlZCB0byBmaWx0ZXIgdGhlIGlucHV0IGZpbGVzIHdoZW4gcHJvZHVjaW5nIHNvdXJjZQ0KKyMgZmlsZXMgdG8gYnJvd3NlIChpLmUuIHdoZW4gU09VUkNFX0JST1dTRVIgaXMgc2V0IHRvIFlFUykuDQorDQorRklMVEVSX1NPVVJDRV9GSUxFUyAgICA9IE5PDQorDQorIyBUaGUgRklMVEVSX1NPVVJDRV9QQVRURVJOUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBzb3VyY2UgZmlsdGVycyBwZXIgZmlsZQ0KKyMgcGF0dGVybi4gQSBwYXR0ZXJuIHdpbGwgb3ZlcnJpZGUgdGhlIHNldHRpbmcgZm9yIEZJTFRFUl9QQVRURVJOIChpZiBhbnkpDQorIyBhbmQgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBkaXNhYmxlIHNvdXJjZSBmaWx0ZXJpbmcgZm9yIGEgc3BlY2lmaWMgcGF0dGVybg0KKyMgdXNpbmcgKi5leHQ9IChzbyB3aXRob3V0IG5hbWluZyBhIGZpbHRlcikuIFRoaXMgb3B0aW9uIG9ubHkgaGFzIGVmZmVjdCB3aGVuDQorIyBGSUxURVJfU09VUkNFX0ZJTEVTIGlzIGVuYWJsZWQuDQorDQorRklMVEVSX1NPVVJDRV9QQVRURVJOUyA9DQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gc291cmNlIGJyb3dzaW5nDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIFNPVVJDRV9CUk9XU0VSIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gYSBsaXN0IG9mIHNvdXJjZSBmaWxlcyB3aWxsDQorIyBiZSBnZW5lcmF0ZWQuIERvY3VtZW50ZWQgZW50aXRpZXMgd2lsbCBiZSBjcm9zcy1yZWZlcmVuY2VkIHdpdGggdGhlc2Ugc291cmNlcy4NCisjIE5vdGU6IFRvIGdldCByaWQgb2YgYWxsIHNvdXJjZSBjb2RlIGluIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LCBtYWtlIHN1cmUgYWxzbw0KKyMgVkVSQkFUSU1fSEVBREVSUyBpcyBzZXQgdG8gTk8uDQorDQorU09VUkNFX0JST1dTRVIgICAgICAgICA9IFlFUw0KKw0KKyMgU2V0dGluZyB0aGUgSU5MSU5FX1NPVVJDRVMgdGFnIHRvIFlFUyB3aWxsIGluY2x1ZGUgdGhlIGJvZHkNCisjIG9mIGZ1bmN0aW9ucyBhbmQgY2xhc3NlcyBkaXJlY3RseSBpbiB0aGUgZG9jdW1lbnRhdGlvbi4NCisNCitJTkxJTkVfU09VUkNFUyAgICAgICAgID0gTk8NCisNCisjIFNldHRpbmcgdGhlIFNUUklQX0NPREVfQ09NTUVOVFMgdGFnIHRvIFlFUyAodGhlIGRlZmF1bHQpIHdpbGwgaW5zdHJ1Y3QNCisjIGRveHlnZW4gdG8gaGlkZSBhbnkgc3BlY2lhbCBjb21tZW50IGJsb2NrcyBmcm9tIGdlbmVyYXRlZCBzb3VyY2UgY29kZQ0KKyMgZnJhZ21lbnRzLiBOb3JtYWwgQywgQysrIGFuZCBGb3J0cmFuIGNvbW1lbnRzIHdpbGwgYWx3YXlzIHJlbWFpbiB2aXNpYmxlLg0KKw0KK1NUUklQX0NPREVfQ09NTUVOVFMgICAgPSBZRVMNCisNCisjIElmIHRoZSBSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OIHRhZyBpcyBzZXQgdG8gWUVTDQorIyB0aGVuIGZvciBlYWNoIGRvY3VtZW50ZWQgZnVuY3Rpb24gYWxsIGRvY3VtZW50ZWQNCisjIGZ1bmN0aW9ucyByZWZlcmVuY2luZyBpdCB3aWxsIGJlIGxpc3RlZC4NCisNCitSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OID0gWUVTDQorDQorIyBJZiB0aGUgUkVGRVJFTkNFU19SRUxBVElPTiB0YWcgaXMgc2V0IHRvIFlFUw0KKyMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkIGZ1bmN0aW9uIGFsbCBkb2N1bWVudGVkIGVudGl0aWVzDQorIyBjYWxsZWQvdXNlZCBieSB0aGF0IGZ1bmN0aW9uIHdpbGwgYmUgbGlzdGVkLg0KKw0KK1JFRkVSRU5DRVNfUkVMQVRJT04gICAgPSBOTw0KKw0KKyMgSWYgdGhlIFJFRkVSRU5DRVNfTElOS19TT1VSQ0UgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KQ0KKyMgYW5kIFNPVVJDRV9CUk9XU0VSIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIHRoZSBoeXBlcmxpbmtzIGZyb20NCisjIGZ1bmN0aW9ucyBpbiBSRUZFUkVOQ0VTX1JFTEFUSU9OIGFuZCBSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OIGxpc3RzIHdpbGwNCisjIGxpbmsgdG8gdGhlIHNvdXJjZSBjb2RlLg0KKyMgT3RoZXJ3aXNlIHRoZXkgd2lsbCBsaW5rIHRvIHRoZSBkb2N1bWVudGF0aW9uLg0KKw0KK1JFRkVSRU5DRVNfTElOS19TT1VSQ0UgPSBZRVMNCisNCisjIElmIHRoZSBVU0VfSFRBR1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgcmVmZXJlbmNlcyB0byBzb3VyY2UgY29kZQ0KKyMgd2lsbCBwb2ludCB0byB0aGUgSFRNTCBnZW5lcmF0ZWQgYnkgdGhlIGh0YWdzKDEpIHRvb2wgaW5zdGVhZCBvZiBkb3h5Z2VuDQorIyBidWlsdC1pbiBzb3VyY2UgYnJvd3Nlci4gVGhlIGh0YWdzIHRvb2wgaXMgcGFydCBvZiBHTlUncyBnbG9iYWwgc291cmNlDQorIyB0YWdnaW5nIHN5c3RlbSAoc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nbG9iYWwvZ2xvYmFsLmh0bWwpLiBZb3UNCisjIHdpbGwgbmVlZCB2ZXJzaW9uIDQuOC42IG9yIGhpZ2hlci4NCisNCitVU0VfSFRBR1MgICAgICAgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBWRVJCQVRJTV9IRUFERVJTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBEb3h5Z2VuDQorIyB3aWxsIGdlbmVyYXRlIGEgdmVyYmF0aW0gY29weSBvZiB0aGUgaGVhZGVyIGZpbGUgZm9yIGVhY2ggY2xhc3MgZm9yDQorIyB3aGljaCBhbiBpbmNsdWRlIGlzIHNwZWNpZmllZC4gU2V0IHRvIE5PIHRvIGRpc2FibGUgdGhpcy4NCisNCitWRVJCQVRJTV9IRUFERVJTICAgICAgID0gWUVTDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGFscGhhYmV0aWNhbCBjbGFzcyBpbmRleA0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIElmIHRoZSBBTFBIQUJFVElDQUxfSU5ERVggdGFnIGlzIHNldCB0byBZRVMsIGFuIGFscGhhYmV0aWNhbCBpbmRleA0KKyMgb2YgYWxsIGNvbXBvdW5kcyB3aWxsIGJlIGdlbmVyYXRlZC4gRW5hYmxlIHRoaXMgaWYgdGhlIHByb2plY3QNCisjIGNvbnRhaW5zIGEgbG90IG9mIGNsYXNzZXMsIHN0cnVjdHMsIHVuaW9ucyBvciBpbnRlcmZhY2VzLg0KKw0KK0FMUEhBQkVUSUNBTF9JTkRFWCAgICAgPSBZRVMNCisNCisjIElmIHRoZSBhbHBoYWJldGljYWwgaW5kZXggaXMgZW5hYmxlZCAoc2VlIEFMUEhBQkVUSUNBTF9JTkRFWCkgdGhlbg0KKyMgdGhlIENPTFNfSU5fQUxQSEFfSU5ERVggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIG51bWJlciBvZiBjb2x1bW5zDQorIyBpbiB3aGljaCB0aGlzIGxpc3Qgd2lsbCBiZSBzcGxpdCAoY2FuIGJlIGEgbnVtYmVyIGluIHRoZSByYW5nZSBbMS4uMjBdKQ0KKw0KK0NPTFNfSU5fQUxQSEFfSU5ERVggICAgPSA1DQorDQorIyBJbiBjYXNlIGFsbCBjbGFzc2VzIGluIGEgcHJvamVjdCBzdGFydCB3aXRoIGEgY29tbW9uIHByZWZpeCwgYWxsDQorIyBjbGFzc2VzIHdpbGwgYmUgcHV0IHVuZGVyIHRoZSBzYW1lIGhlYWRlciBpbiB0aGUgYWxwaGFiZXRpY2FsIGluZGV4Lg0KKyMgVGhlIElHTk9SRV9QUkVGSVggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgcHJlZml4ZXMgdGhhdA0KKyMgc2hvdWxkIGJlIGlnbm9yZWQgd2hpbGUgZ2VuZXJhdGluZyB0aGUgaW5kZXggaGVhZGVycy4NCisNCitJR05PUkVfUFJFRklYICAgICAgICAgID0NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgSFRNTCBvdXRwdXQNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgR0VORVJBVEVfSFRNTCB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbA0KKyMgZ2VuZXJhdGUgSFRNTCBvdXRwdXQuDQorDQorR0VORVJBVEVfSFRNTCAgICAgICAgICA9IFlFUw0KKw0KKyMgVGhlIEhUTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIEhUTUwgZG9jcyB3aWxsIGJlIHB1dC4NCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUNCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgaHRtbCcgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguDQorDQorSFRNTF9PVVRQVVQgICAgICAgICAgICA9DQorDQorIyBUaGUgSFRNTF9GSUxFX0VYVEVOU0lPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBleHRlbnNpb24gZm9yDQorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UgKGZvciBleGFtcGxlOiAuaHRtLC5waHAsLmFzcCkuIElmIGl0IGlzIGxlZnQgYmxhbmsNCisjIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBmaWxlcyB3aXRoIC5odG1sIGV4dGVuc2lvbi4NCisNCitIVE1MX0ZJTEVfRVhURU5TSU9OICAgID0gLmh0bWwNCisNCisjIFRoZSBIVE1MX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIEhUTUwgaGVhZGVyIGZvcg0KKyMgZWFjaCBnZW5lcmF0ZWQgSFRNTCBwYWdlLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhDQorIyBzdGFuZGFyZCBoZWFkZXIuIE5vdGUgdGhhdCB3aGVuIHVzaW5nIGEgY3VzdG9tIGhlYWRlciB5b3UgYXJlIHJlc3BvbnNpYmxlDQorIyAgZm9yIHRoZSBwcm9wZXIgaW5jbHVzaW9uIG9mIGFueSBzY3JpcHRzIGFuZCBzdHlsZSBzaGVldHMgdGhhdCBkb3h5Z2VuDQorIyBuZWVkcywgd2hpY2ggaXMgZGVwZW5kZW50IG9uIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdXNlZC4NCisjIEl0IGlzIGFkdmlzZWQgdG8gZ2VuZXJhdGUgYSBkZWZhdWx0IGhlYWRlciB1c2luZyAiZG94eWdlbiAtdyBodG1sDQorIyBoZWFkZXIuaHRtbCBmb290ZXIuaHRtbCBzdHlsZXNoZWV0LmNzcyBZb3VyQ29uZmlnRmlsZSIgYW5kIHRoZW4gbW9kaWZ5DQorIyB0aGF0IGhlYWRlci4gTm90ZSB0aGF0IHRoZSBoZWFkZXIgaXMgc3ViamVjdCB0byBjaGFuZ2Ugc28geW91IHR5cGljYWxseQ0KKyMgaGF2ZSB0byByZWRvIHRoaXMgd2hlbiB1cGdyYWRpbmcgdG8gYSBuZXdlciB2ZXJzaW9uIG9mIGRveHlnZW4gb3Igd2hlbg0KKyMgY2hhbmdpbmcgdGhlIHZhbHVlIG9mIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3Mgc3VjaCBhcyBHRU5FUkFURV9UUkVFVklFVyENCisNCitIVE1MX0hFQURFUiAgICAgICAgICAgID0NCisNCisjIFRoZSBIVE1MX0ZPT1RFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIEhUTUwgZm9vdGVyIGZvcg0KKyMgZWFjaCBnZW5lcmF0ZWQgSFRNTCBwYWdlLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhDQorIyBzdGFuZGFyZCBmb290ZXIuDQorDQorSFRNTF9GT09URVIgICAgICAgICAgICA9DQorDQorIyBUaGUgSFRNTF9TVFlMRVNIRUVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgdXNlci1kZWZpbmVkIGNhc2NhZGluZw0KKyMgc3R5bGUgc2hlZXQgdGhhdCBpcyB1c2VkIGJ5IGVhY2ggSFRNTCBwYWdlLiBJdCBjYW4gYmUgdXNlZCB0bw0KKyMgZmluZS10dW5lIHRoZSBsb29rIG9mIHRoZSBIVE1MIG91dHB1dC4gSWYgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwNCisjIGdlbmVyYXRlIGEgZGVmYXVsdCBzdHlsZSBzaGVldC4gTm90ZSB0aGF0IGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZQ0KKyMgSFRNTF9FWFRSQV9TVFlMRVNIRUVUIGluc3RlYWQgb2YgdGhpcyBvbmUsIGFzIGl0IGlzIG1vcmUgcm9idXN0IGFuZCB0aGlzDQorIyB0YWcgd2lsbCBpbiB0aGUgZnV0dXJlIGJlY29tZSBvYnNvbGV0ZS4NCisNCitIVE1MX1NUWUxFU0hFRVQgICAgICAgID0NCisNCisjIFRoZSBIVE1MX0VYVFJBX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4gYWRkaXRpb25hbA0KKyMgdXNlci1kZWZpbmVkIGNhc2NhZGluZyBzdHlsZSBzaGVldCB0aGF0IGlzIGluY2x1ZGVkIGFmdGVyIHRoZSBzdGFuZGFyZA0KKyMgc3R5bGUgc2hlZXRzIGNyZWF0ZWQgYnkgZG94eWdlbi4gVXNpbmcgdGhpcyBvcHRpb24gb25lIGNhbiBvdmVycnVsZQ0KKyMgY2VydGFpbiBzdHlsZSBhc3BlY3RzLiBUaGlzIGlzIHByZWZlcnJlZCBvdmVyIHVzaW5nIEhUTUxfU1RZTEVTSEVFVA0KKyMgc2luY2UgaXQgZG9lcyBub3QgcmVwbGFjZSB0aGUgc3RhbmRhcmQgc3R5bGUgc2hlZXQgYW5kIGlzIHRoZXJlZm9yIG1vcmUNCisjIHJvYnVzdCBhZ2FpbnN0IGZ1dHVyZSB1cGRhdGVzLiBEb3h5Z2VuIHdpbGwgY29weSB0aGUgc3R5bGUgc2hlZXQgZmlsZSB0bw0KKyMgdGhlIG91dHB1dCBkaXJlY3RvcnkuDQorDQorSFRNTF9FWFRSQV9TVFlMRVNIRUVUICA9DQorDQorIyBUaGUgSFRNTF9FWFRSQV9GSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBleHRyYSBpbWFnZXMgb3INCisjIG90aGVyIHNvdXJjZSBmaWxlcyB3aGljaCBzaG91bGQgYmUgY29waWVkIHRvIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIE5vdGUNCisjIHRoYXQgdGhlc2UgZmlsZXMgd2lsbCBiZSBjb3BpZWQgdG8gdGhlIGJhc2UgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LiBVc2UgdGhlDQorIyAkcmVscGF0aCQgbWFya2VyIGluIHRoZSBIVE1MX0hFQURFUiBhbmQvb3IgSFRNTF9GT09URVIgZmlsZXMgdG8gbG9hZCB0aGVzZQ0KKyMgZmlsZXMuIEluIHRoZSBIVE1MX1NUWUxFU0hFRVQgZmlsZSwgdXNlIHRoZSBmaWxlIG5hbWUgb25seS4gQWxzbyBub3RlIHRoYXQNCisjIHRoZSBmaWxlcyB3aWxsIGJlIGNvcGllZCBhcy1pczsgdGhlcmUgYXJlIG5vIGNvbW1hbmRzIG9yIG1hcmtlcnMgYXZhaWxhYmxlLg0KKw0KK0hUTUxfRVhUUkFfRklMRVMgICAgICAgPQ0KKw0KKyMgVGhlIEhUTUxfQ09MT1JTVFlMRV9IVUUgdGFnIGNvbnRyb2xzIHRoZSBjb2xvciBvZiB0aGUgSFRNTCBvdXRwdXQuDQorIyBEb3h5Z2VuIHdpbGwgYWRqdXN0IHRoZSBjb2xvcnMgaW4gdGhlIHN0eWxlIHNoZWV0IGFuZCBiYWNrZ3JvdW5kIGltYWdlcw0KKyMgYWNjb3JkaW5nIHRvIHRoaXMgY29sb3IuIEh1ZSBpcyBzcGVjaWZpZWQgYXMgYW4gYW5nbGUgb24gYSBjb2xvcndoZWVsLA0KKyMgc2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSHVlIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KKyMgRm9yIGluc3RhbmNlIHRoZSB2YWx1ZSAwIHJlcHJlc2VudHMgcmVkLCA2MCBpcyB5ZWxsb3csIDEyMCBpcyBncmVlbiwNCisjIDE4MCBpcyBjeWFuLCAyNDAgaXMgYmx1ZSwgMzAwIHB1cnBsZSwgYW5kIDM2MCBpcyByZWQgYWdhaW4uDQorIyBUaGUgYWxsb3dlZCByYW5nZSBpcyAwIHRvIDM1OS4NCisNCitIVE1MX0NPTE9SU1RZTEVfSFVFICAgID0gMjIwDQorDQorIyBUaGUgSFRNTF9DT0xPUlNUWUxFX1NBVCB0YWcgY29udHJvbHMgdGhlIHB1cml0eSAob3Igc2F0dXJhdGlvbikgb2YNCisjIHRoZSBjb2xvcnMgaW4gdGhlIEhUTUwgb3V0cHV0LiBGb3IgYSB2YWx1ZSBvZiAwIHRoZSBvdXRwdXQgd2lsbCB1c2UNCisjIGdyYXlzY2FsZXMgb25seS4gQSB2YWx1ZSBvZiAyNTUgd2lsbCBwcm9kdWNlIHRoZSBtb3N0IHZpdmlkIGNvbG9ycy4NCisNCitIVE1MX0NPTE9SU1RZTEVfU0FUICAgID0gMTAwDQorDQorIyBUaGUgSFRNTF9DT0xPUlNUWUxFX0dBTU1BIHRhZyBjb250cm9scyB0aGUgZ2FtbWEgY29ycmVjdGlvbiBhcHBsaWVkIHRvDQorIyB0aGUgbHVtaW5hbmNlIGNvbXBvbmVudCBvZiB0aGUgY29sb3JzIGluIHRoZSBIVE1MIG91dHB1dC4gVmFsdWVzIGJlbG93DQorIyAxMDAgZ3JhZHVhbGx5IG1ha2UgdGhlIG91dHB1dCBsaWdodGVyLCB3aGVyZWFzIHZhbHVlcyBhYm92ZSAxMDAgbWFrZQ0KKyMgdGhlIG91dHB1dCBkYXJrZXIuIFRoZSB2YWx1ZSBkaXZpZGVkIGJ5IDEwMCBpcyB0aGUgYWN0dWFsIGdhbW1hIGFwcGxpZWQsDQorIyBzbyA4MCByZXByZXNlbnRzIGEgZ2FtbWEgb2YgMC44LCBUaGUgdmFsdWUgMjIwIHJlcHJlc2VudHMgYSBnYW1tYSBvZiAyLjIsDQorIyBhbmQgMTAwIGRvZXMgbm90IGNoYW5nZSB0aGUgZ2FtbWEuDQorDQorSFRNTF9DT0xPUlNUWUxFX0dBTU1BICA9IDgwDQorDQorIyBJZiB0aGUgSFRNTF9USU1FU1RBTVAgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZm9vdGVyIG9mIGVhY2ggZ2VuZXJhdGVkIEhUTUwNCisjIHBhZ2Ugd2lsbCBjb250YWluIHRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIHBhZ2Ugd2FzIGdlbmVyYXRlZC4gU2V0dGluZw0KKyMgdGhpcyB0byBOTyBjYW4gaGVscCB3aGVuIGNvbXBhcmluZyB0aGUgb3V0cHV0IG9mIG11bHRpcGxlIHJ1bnMuDQorDQorSFRNTF9USU1FU1RBTVAgICAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIEhUTUxfRFlOQU1JQ19TRUNUSU9OUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBnZW5lcmF0ZWQgSFRNTA0KKyMgZG9jdW1lbnRhdGlvbiB3aWxsIGNvbnRhaW4gc2VjdGlvbnMgdGhhdCBjYW4gYmUgaGlkZGVuIGFuZCBzaG93biBhZnRlciB0aGUNCisjIHBhZ2UgaGFzIGxvYWRlZC4NCisNCitIVE1MX0RZTkFNSUNfU0VDVElPTlMgID0gTk8NCisNCisjIFdpdGggSFRNTF9JTkRFWF9OVU1fRU5UUklFUyBvbmUgY2FuIGNvbnRyb2wgdGhlIHByZWZlcnJlZCBudW1iZXIgb2YNCisjIGVudHJpZXMgc2hvd24gaW4gdGhlIHZhcmlvdXMgdHJlZSBzdHJ1Y3R1cmVkIGluZGljZXMgaW5pdGlhbGx5OyB0aGUgdXNlcg0KKyMgY2FuIGV4cGFuZCBhbmQgY29sbGFwc2UgZW50cmllcyBkeW5hbWljYWxseSBsYXRlciBvbi4gRG94eWdlbiB3aWxsIGV4cGFuZA0KKyMgdGhlIHRyZWUgdG8gc3VjaCBhIGxldmVsIHRoYXQgYXQgbW9zdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbnRyaWVzIGFyZQ0KKyMgdmlzaWJsZSAodW5sZXNzIGEgZnVsbHkgY29sbGFwc2VkIHRyZWUgYWxyZWFkeSBleGNlZWRzIHRoaXMgYW1vdW50KS4NCisjIFNvIHNldHRpbmcgdGhlIG51bWJlciBvZiBlbnRyaWVzIDEgd2lsbCBwcm9kdWNlIGEgZnVsbCBjb2xsYXBzZWQgdHJlZSBieQ0KKyMgZGVmYXVsdC4gMCBpcyBhIHNwZWNpYWwgdmFsdWUgcmVwcmVzZW50aW5nIGFuIGluZmluaXRlIG51bWJlciBvZiBlbnRyaWVzDQorIyBhbmQgd2lsbCByZXN1bHQgaW4gYSBmdWxsIGV4cGFuZGVkIHRyZWUgYnkgZGVmYXVsdC4NCisNCitIVE1MX0lOREVYX05VTV9FTlRSSUVTID0gMTAwDQorDQorIyBJZiB0aGUgR0VORVJBVEVfRE9DU0VUIHRhZyBpcyBzZXQgdG8gWUVTLCBhZGRpdGlvbmFsIGluZGV4IGZpbGVzDQorIyB3aWxsIGJlIGdlbmVyYXRlZCB0aGF0IGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciBBcHBsZSdzIFhjb2RlIDMNCisjIGludGVncmF0ZWQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIGludHJvZHVjZWQgd2l0aCBPU1ggMTAuNSAoTGVvcGFyZCkuDQorIyBUbyBjcmVhdGUgYSBkb2N1bWVudGF0aW9uIHNldCwgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgTWFrZWZpbGUgaW4gdGhlDQorIyBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFJ1bm5pbmcgbWFrZSB3aWxsIHByb2R1Y2UgdGhlIGRvY3NldCBpbiB0aGF0DQorIyBkaXJlY3RvcnkgYW5kIHJ1bm5pbmcgIm1ha2UgaW5zdGFsbCIgd2lsbCBpbnN0YWxsIHRoZSBkb2NzZXQgaW4NCisjIH4vTGlicmFyeS9EZXZlbG9wZXIvU2hhcmVkL0RvY3VtZW50YXRpb24vRG9jU2V0cyBzbyB0aGF0IFhjb2RlIHdpbGwgZmluZA0KKyMgaXQgYXQgc3RhcnR1cC4NCisjIFNlZSBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS90b29scy9jcmVhdGluZ2RvY3NldHN3aXRoZG94eWdlbi5odG1sDQorIyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCisNCitHRU5FUkFURV9ET0NTRVQgICAgICAgID0gTk8NCisNCisjIFdoZW4gR0VORVJBVEVfRE9DU0VUIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGlzIHRhZyBkZXRlcm1pbmVzIHRoZSBuYW1lIG9mIHRoZQ0KKyMgZmVlZC4gQSBkb2N1bWVudGF0aW9uIGZlZWQgcHJvdmlkZXMgYW4gdW1icmVsbGEgdW5kZXIgd2hpY2ggbXVsdGlwbGUNCisjIGRvY3VtZW50YXRpb24gc2V0cyBmcm9tIGEgc2luZ2xlIHByb3ZpZGVyIChzdWNoIGFzIGEgY29tcGFueSBvciBwcm9kdWN0IHN1aXRlKQ0KKyMgY2FuIGJlIGdyb3VwZWQuDQorDQorRE9DU0VUX0ZFRUROQU1FICAgICAgICA9ICJEb3h5Z2VuIGdlbmVyYXRlZCBkb2NzIg0KKw0KKyMgV2hlbiBHRU5FUkFURV9ET0NTRVQgdGFnIGlzIHNldCB0byBZRVMsIHRoaXMgdGFnIHNwZWNpZmllcyBhIHN0cmluZyB0aGF0DQorIyBzaG91bGQgdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGRvY3VtZW50YXRpb24gc2V0IGJ1bmRsZS4gVGhpcyBzaG91bGQgYmUgYQ0KKyMgcmV2ZXJzZSBkb21haW4tbmFtZSBzdHlsZSBzdHJpbmcsIGUuZy4gY29tLm15Y29tcGFueS5NeURvY1NldC4gRG94eWdlbg0KKyMgd2lsbCBhcHBlbmQgLmRvY3NldCB0byB0aGUgbmFtZS4NCisNCitET0NTRVRfQlVORExFX0lEICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdA0KKw0KKyMgV2hlbiBHRU5FUkFURV9QVUJMSVNIRVJfSUQgdGFnIHNwZWNpZmllcyBhIHN0cmluZyB0aGF0IHNob3VsZCB1bmlxdWVseQ0KKyMgaWRlbnRpZnkgdGhlIGRvY3VtZW50YXRpb24gcHVibGlzaGVyLiBUaGlzIHNob3VsZCBiZSBhIHJldmVyc2UgZG9tYWluLW5hbWUNCisjIHN0eWxlIHN0cmluZywgZS5nLiBjb20ubXljb21wYW55Lk15RG9jU2V0LmRvY3VtZW50YXRpb24uDQorDQorRE9DU0VUX1BVQkxJU0hFUl9JRCAgICA9IG9yZy5kb3h5Z2VuLlB1Ymxpc2hlcg0KKw0KKyMgVGhlIEdFTkVSQVRFX1BVQkxJU0hFUl9OQU1FIHRhZyBpZGVudGlmaWVzIHRoZSBkb2N1bWVudGF0aW9uIHB1Ymxpc2hlci4NCisNCitET0NTRVRfUFVCTElTSEVSX05BTUUgID0gUHVibGlzaGVyDQorDQorIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMNCisjIHdpbGwgYmUgZ2VuZXJhdGVkIHRoYXQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIHRvb2xzIGxpa2UgdGhlDQorIyBNaWNyb3NvZnQgSFRNTCBoZWxwIHdvcmtzaG9wIHRvIGdlbmVyYXRlIGEgY29tcGlsZWQgSFRNTCBoZWxwIGZpbGUgKC5jaG0pDQorIyBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4NCisNCitHRU5FUkFURV9IVE1MSEVMUCAgICAgID0gTk8NCisNCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIENITV9GSUxFIHRhZyBjYW4NCisjIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBuYW1lIG9mIHRoZSByZXN1bHRpbmcgLmNobSBmaWxlLiBZb3UNCisjIGNhbiBhZGQgYSBwYXRoIGluIGZyb250IG9mIHRoZSBmaWxlIGlmIHRoZSByZXN1bHQgc2hvdWxkIG5vdCBiZQ0KKyMgd3JpdHRlbiB0byB0aGUgaHRtbCBvdXRwdXQgZGlyZWN0b3J5Lg0KKw0KK0NITV9GSUxFICAgICAgICAgICAgICAgPQ0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgSEhDX0xPQ0FUSU9OIHRhZyBjYW4NCisjIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gKGFic29sdXRlIHBhdGggaW5jbHVkaW5nIGZpbGUgbmFtZSkgb2YNCisjIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgKGhoYy5leGUpLiBJZiBub24tZW1wdHkgZG94eWdlbiB3aWxsIHRyeSB0byBydW4NCisjIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgb24gdGhlIGdlbmVyYXRlZCBpbmRleC5oaHAuDQorDQorSEhDX0xPQ0FUSU9OICAgICAgICAgICA9DQorDQorIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBHRU5FUkFURV9DSEkgZmxhZw0KKyMgY29udHJvbHMgaWYgYSBzZXBhcmF0ZSAuY2hpIGluZGV4IGZpbGUgaXMgZ2VuZXJhdGVkIChZRVMpIG9yIHRoYXQNCisjIGl0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbWFzdGVyIC5jaG0gZmlsZSAoTk8pLg0KKw0KK0dFTkVSQVRFX0NISSAgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgQ0hNX0lOREVYX0VOQ09ESU5HDQorIyBpcyB1c2VkIHRvIGVuY29kZSBIdG1sSGVscCBpbmRleCAoaGhrKSwgY29udGVudCAoaGhjKSBhbmQgcHJvamVjdCBmaWxlDQorIyBjb250ZW50Lg0KKw0KK0NITV9JTkRFWF9FTkNPRElORyAgICAgPQ0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgQklOQVJZX1RPQyBmbGFnDQorIyBjb250cm9scyB3aGV0aGVyIGEgYmluYXJ5IHRhYmxlIG9mIGNvbnRlbnRzIGlzIGdlbmVyYXRlZCAoWUVTKSBvciBhDQorIyBub3JtYWwgdGFibGUgb2YgY29udGVudHMgKE5PKSBpbiB0aGUgLmNobSBmaWxlLg0KKw0KK0JJTkFSWV9UT0MgICAgICAgICAgICAgPSBOTw0KKw0KKyMgVGhlIFRPQ19FWFBBTkQgZmxhZyBjYW4gYmUgc2V0IHRvIFlFUyB0byBhZGQgZXh0cmEgaXRlbXMgZm9yIGdyb3VwIG1lbWJlcnMNCisjIHRvIHRoZSBjb250ZW50cyBvZiB0aGUgSFRNTCBoZWxwIGRvY3VtZW50YXRpb24gYW5kIHRvIHRoZSB0cmVlIHZpZXcuDQorDQorVE9DX0VYUEFORCAgICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgR0VORVJBVEVfUUhQIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBib3RoIFFIUF9OQU1FU1BBQ0UgYW5kDQorIyBRSFBfVklSVFVBTF9GT0xERVIgYXJlIHNldCwgYW4gYWRkaXRpb25hbCBpbmRleCBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkDQorIyB0aGF0IGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciBRdCdzIHFoZWxwZ2VuZXJhdG9yIHRvIGdlbmVyYXRlIGENCisjIFF0IENvbXByZXNzZWQgSGVscCAoLnFjaCkgb2YgdGhlIGdlbmVyYXRlZCBIVE1MIGRvY3VtZW50YXRpb24uDQorDQorR0VORVJBVEVfUUhQICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgUUhHX0xPQ0FUSU9OIHRhZyBpcyBzcGVjaWZpZWQsIHRoZSBRQ0hfRklMRSB0YWcgY2FuDQorIyBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgbmFtZSBvZiB0aGUgcmVzdWx0aW5nIC5xY2ggZmlsZS4NCisjIFRoZSBwYXRoIHNwZWNpZmllZCBpcyByZWxhdGl2ZSB0byB0aGUgSFRNTCBvdXRwdXQgZm9sZGVyLg0KKw0KK1FDSF9GSUxFICAgICAgICAgICAgICAgPQ0KKw0KKyMgVGhlIFFIUF9OQU1FU1BBQ0UgdGFnIHNwZWNpZmllcyB0aGUgbmFtZXNwYWNlIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcNCisjIFF0IEhlbHAgUHJvamVjdCBvdXRwdXQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUNCisjIGh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdGhlbHBwcm9qZWN0Lmh0bWwjbmFtZXNwYWNlDQorDQorUUhQX05BTUVTUEFDRSAgICAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QNCisNCisjIFRoZSBRSFBfVklSVFVBTF9GT0xERVIgdGFnIHNwZWNpZmllcyB0aGUgbmFtZXNwYWNlIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcNCisjIFF0IEhlbHAgUHJvamVjdCBvdXRwdXQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUNCisjIGh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdGhlbHBwcm9qZWN0Lmh0bWwjdmlydHVhbC1mb2xkZXJzDQorDQorUUhQX1ZJUlRVQUxfRk9MREVSICAgICA9IGRvYw0KKw0KKyMgSWYgUUhQX0NVU1RfRklMVEVSX05BTUUgaXMgc2V0LCBpdCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBjdXN0b20gZmlsdGVyIHRvDQorIyBhZGQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUNCisjIGh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdGhlbHBwcm9qZWN0Lmh0bWwjY3VzdG9tLWZpbHRlcnMNCisNCitRSFBfQ1VTVF9GSUxURVJfTkFNRSAgID0NCisNCisjIFRoZSBRSFBfQ1VTVF9GSUxUX0FUVFJTIHRhZyBzcGVjaWZpZXMgdGhlIGxpc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlDQorIyBjdXN0b20gZmlsdGVyIHRvIGFkZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZQ0KKyMgPGEgaHJlZj0iaHR0cDovL2RvYy50cm9sbHRlY2guY29tL3F0aGVscHByb2plY3QuaHRtbCNjdXN0b20tZmlsdGVycyI+DQorIyBRdCBIZWxwIFByb2plY3QgLyBDdXN0b20gRmlsdGVyczwvYT4uDQorDQorUUhQX0NVU1RfRklMVEVSX0FUVFJTICA9DQorDQorIyBUaGUgUUhQX1NFQ1RfRklMVEVSX0FUVFJTIHRhZyBzcGVjaWZpZXMgdGhlIGxpc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgdGhpcw0KKyMgcHJvamVjdCdzDQorIyBmaWx0ZXIgc2VjdGlvbiBtYXRjaGVzLg0KKyMgPGEgaHJlZj0iaHR0cDovL2RvYy50cm9sbHRlY2guY29tL3F0aGVscHByb2plY3QuaHRtbCNmaWx0ZXItYXR0cmlidXRlcyI+DQorIyBRdCBIZWxwIFByb2plY3QgLyBGaWx0ZXIgQXR0cmlidXRlczwvYT4uDQorDQorUUhQX1NFQ1RfRklMVEVSX0FUVFJTICA9DQorDQorIyBJZiB0aGUgR0VORVJBVEVfUUhQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgUUhHX0xPQ0FUSU9OIHRhZyBjYW4NCisjIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgUXQncyBxaGVscGdlbmVyYXRvci4NCisjIElmIG5vbi1lbXB0eSBkb3h5Z2VuIHdpbGwgdHJ5IHRvIHJ1biBxaGVscGdlbmVyYXRvciBvbiB0aGUgZ2VuZXJhdGVkDQorIyAucWhwIGZpbGUuDQorDQorUUhHX0xPQ0FUSU9OICAgICAgICAgICA9DQorDQorIyBJZiB0aGUgR0VORVJBVEVfRUNMSVBTRUhFTFAgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMNCisjICB3aWxsIGJlIGdlbmVyYXRlZCwgd2hpY2ggdG9nZXRoZXIgd2l0aCB0aGUgSFRNTCBmaWxlcywgZm9ybSBhbiBFY2xpcHNlIGhlbHANCisjIHBsdWdpbi4gVG8gaW5zdGFsbCB0aGlzIHBsdWdpbiBhbmQgbWFrZSBpdCBhdmFpbGFibGUgdW5kZXIgdGhlIGhlbHAgY29udGVudHMNCisjIG1lbnUgaW4gRWNsaXBzZSwgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgSFRNTCBhbmQgWE1MDQorIyBmaWxlcyBuZWVkcyB0byBiZSBjb3BpZWQgaW50byB0aGUgcGx1Z2lucyBkaXJlY3Rvcnkgb2YgZWNsaXBzZS4gVGhlIG5hbWUgb2YNCisjIHRoZSBkaXJlY3Rvcnkgd2l0aGluIHRoZSBwbHVnaW5zIGRpcmVjdG9yeSBzaG91bGQgYmUgdGhlIHNhbWUgYXMNCisjIHRoZSBFQ0xJUFNFX0RPQ19JRCB2YWx1ZS4gQWZ0ZXIgY29weWluZyBFY2xpcHNlIG5lZWRzIHRvIGJlIHJlc3RhcnRlZCBiZWZvcmUNCisjIHRoZSBoZWxwIGFwcGVhcnMuDQorDQorR0VORVJBVEVfRUNMSVBTRUhFTFAgICA9IE5PDQorDQorIyBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZWNsaXBzZSBoZWxwIHBsdWdpbi4gV2hlbiBpbnN0YWxsaW5nIHRoZSBwbHVnaW4NCisjIHRoZSBkaXJlY3RvcnkgbmFtZSBjb250YWluaW5nIHRoZSBIVE1MIGFuZCBYTUwgZmlsZXMgc2hvdWxkIGFsc28gaGF2ZQ0KKyMgdGhpcyBuYW1lLg0KKw0KK0VDTElQU0VfRE9DX0lEICAgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0DQorDQorIyBUaGUgRElTQUJMRV9JTkRFWCB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIGNvbmRlbnNlZCBpbmRleCAodGFicykNCisjIGF0IHRvcCBvZiBlYWNoIEhUTUwgcGFnZS4gVGhlIHZhbHVlIE5PICh0aGUgZGVmYXVsdCkgZW5hYmxlcyB0aGUgaW5kZXggYW5kDQorIyB0aGUgdmFsdWUgWUVTIGRpc2FibGVzIGl0LiBTaW5jZSB0aGUgdGFicyBoYXZlIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIHRoZQ0KKyMgbmF2aWdhdGlvbiB0cmVlIHlvdSBjYW4gc2V0IHRoaXMgb3B0aW9uIHRvIE5PIGlmIHlvdSBhbHJlYWR5IHNldA0KKyMgR0VORVJBVEVfVFJFRVZJRVcgdG8gWUVTLg0KKw0KK0RJU0FCTEVfSU5ERVggICAgICAgICAgPSBOTw0KKw0KKyMgVGhlIEdFTkVSQVRFX1RSRUVWSUVXIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciBhIHRyZWUtbGlrZSBpbmRleA0KKyMgc3RydWN0dXJlIHNob3VsZCBiZSBnZW5lcmF0ZWQgdG8gZGlzcGxheSBoaWVyYXJjaGljYWwgaW5mb3JtYXRpb24uDQorIyBJZiB0aGUgdGFnIHZhbHVlIGlzIHNldCB0byBZRVMsIGEgc2lkZSBwYW5lbCB3aWxsIGJlIGdlbmVyYXRlZA0KKyMgY29udGFpbmluZyBhIHRyZWUtbGlrZSBpbmRleCBzdHJ1Y3R1cmUgKGp1c3QgbGlrZSB0aGUgb25lIHRoYXQNCisjIGlzIGdlbmVyYXRlZCBmb3IgSFRNTCBIZWxwKS4gRm9yIHRoaXMgdG8gd29yayBhIGJyb3dzZXIgdGhhdCBzdXBwb3J0cw0KKyMgSmF2YVNjcmlwdCwgREhUTUwsIENTUyBhbmQgZnJhbWVzIGlzIHJlcXVpcmVkIChpLmUuIGFueSBtb2Rlcm4gYnJvd3NlcikuDQorIyBXaW5kb3dzIHVzZXJzIGFyZSBwcm9iYWJseSBiZXR0ZXIgb2ZmIHVzaW5nIHRoZSBIVE1MIGhlbHAgZmVhdHVyZS4NCisjIFNpbmNlIHRoZSB0cmVlIGJhc2ljYWxseSBoYXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgdGhlIHRhYiBpbmRleCB5b3UNCisjIGNvdWxkIGNvbnNpZGVyIHRvIHNldCBESVNBQkxFX0lOREVYIHRvIE5PIHdoZW4gZW5hYmxpbmcgdGhpcyBvcHRpb24uDQorDQorR0VORVJBVEVfVFJFRVZJRVcgICAgICA9IE5PDQorDQorIyBUaGUgRU5VTV9WQUxVRVNfUEVSX0xJTkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbnVtYmVyIG9mIGVudW0gdmFsdWVzDQorIyAocmFuZ2UgWzAsMS4uMjBdKSB0aGF0IGRveHlnZW4gd2lsbCBncm91cCBvbiBvbmUgbGluZSBpbiB0aGUgZ2VuZXJhdGVkIEhUTUwNCisjIGRvY3VtZW50YXRpb24uIE5vdGUgdGhhdCBhIHZhbHVlIG9mIDAgd2lsbCBjb21wbGV0ZWx5IHN1cHByZXNzIHRoZSBlbnVtDQorIyB2YWx1ZXMgZnJvbSBhcHBlYXJpbmcgaW4gdGhlIG92ZXJ2aWV3IHNlY3Rpb24uDQorDQorRU5VTV9WQUxVRVNfUEVSX0xJTkUgICA9IDQNCisNCisjIElmIHRoZSB0cmVldmlldyBpcyBlbmFibGVkIChzZWUgR0VORVJBVEVfVFJFRVZJRVcpIHRoZW4gdGhpcyB0YWcgY2FuIGJlDQorIyB1c2VkIHRvIHNldCB0aGUgaW5pdGlhbCB3aWR0aCAoaW4gcGl4ZWxzKSBvZiB0aGUgZnJhbWUgaW4gd2hpY2ggdGhlIHRyZWUNCisjIGlzIHNob3duLg0KKw0KK1RSRUVWSUVXX1dJRFRIICAgICAgICAgPSAyNTANCisNCisjIFdoZW4gdGhlIEVYVF9MSU5LU19JTl9XSU5ET1cgb3B0aW9uIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIG9wZW4NCisjIGxpbmtzIHRvIGV4dGVybmFsIHN5bWJvbHMgaW1wb3J0ZWQgdmlhIHRhZyBmaWxlcyBpbiBhIHNlcGFyYXRlIHdpbmRvdy4NCisNCitFWFRfTElOS1NfSU5fV0lORE9XICAgID0gTk8NCisNCisjIFVzZSB0aGlzIHRhZyB0byBjaGFuZ2UgdGhlIGZvbnQgc2l6ZSBvZiBMYXRleCBmb3JtdWxhcyBpbmNsdWRlZA0KKyMgYXMgaW1hZ2VzIGluIHRoZSBIVE1MIGRvY3VtZW50YXRpb24uIFRoZSBkZWZhdWx0IGlzIDEwLiBOb3RlIHRoYXQNCisjIHdoZW4geW91IGNoYW5nZSB0aGUgZm9udCBzaXplIGFmdGVyIGEgc3VjY2Vzc2Z1bCBkb3h5Z2VuIHJ1biB5b3UgbmVlZA0KKyMgdG8gbWFudWFsbHkgcmVtb3ZlIGFueSBmb3JtXyoucG5nIGltYWdlcyBmcm9tIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkNCisjIHRvIGZvcmNlIHRoZW0gdG8gYmUgcmVnZW5lcmF0ZWQuDQorDQorRk9STVVMQV9GT05UU0laRSAgICAgICA9IDEwDQorDQorIyBVc2UgdGhlIEZPUk1VTEFfVFJBTlBBUkVOVCB0YWcgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZSBpbWFnZXMNCisjIGdlbmVyYXRlZCBmb3IgZm9ybXVsYXMgYXJlIHRyYW5zcGFyZW50IFBOR3MuIFRyYW5zcGFyZW50IFBOR3MgYXJlDQorIyBub3Qgc3VwcG9ydGVkIHByb3Blcmx5IGZvciBJRSA2LjAsIGJ1dCBhcmUgc3VwcG9ydGVkIG9uIGFsbCBtb2Rlcm4gYnJvd3NlcnMuDQorIyBOb3RlIHRoYXQgd2hlbiBjaGFuZ2luZyB0aGlzIG9wdGlvbiB5b3UgbmVlZCB0byBkZWxldGUgYW55IGZvcm1fKi5wbmcgZmlsZXMNCisjIGluIHRoZSBIVE1MIG91dHB1dCBiZWZvcmUgdGhlIGNoYW5nZXMgaGF2ZSBlZmZlY3QuDQorDQorRk9STVVMQV9UUkFOU1BBUkVOVCAgICA9IFlFUw0KKw0KKyMgRW5hYmxlIHRoZSBVU0VfTUFUSEpBWCBvcHRpb24gdG8gcmVuZGVyIExhVGVYIGZvcm11bGFzIHVzaW5nIE1hdGhKYXgNCisjIChzZWUgaHR0cDovL3d3dy5tYXRoamF4Lm9yZykgd2hpY2ggdXNlcyBjbGllbnQgc2lkZSBKYXZhc2NyaXB0IGZvciB0aGUNCisjIHJlbmRlcmluZyBpbnN0ZWFkIG9mIHVzaW5nIHByZXJlbmRlcmVkIGJpdG1hcHMuIFVzZSB0aGlzIGlmIHlvdSBkbyBub3QNCisjIGhhdmUgTGFUZVggaW5zdGFsbGVkIG9yIGlmIHlvdSB3YW50IHRvIGZvcm11bGFzIGxvb2sgcHJldHRpZXIgaW4gdGhlIEhUTUwNCisjIG91dHB1dC4gV2hlbiBlbmFibGVkIHlvdSBtYXkgYWxzbyBuZWVkIHRvIGluc3RhbGwgTWF0aEpheCBzZXBhcmF0ZWx5IGFuZA0KKyMgY29uZmlndXJlIHRoZSBwYXRoIHRvIGl0IHVzaW5nIHRoZSBNQVRISkFYX1JFTFBBVEggb3B0aW9uLg0KKw0KK1VTRV9NQVRISkFYICAgICAgICAgICAgPSBOTw0KKw0KKyMgV2hlbiBNYXRoSmF4IGlzIGVuYWJsZWQgeW91IG5lZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlDQorIyBIVE1MIG91dHB1dCBkaXJlY3RvcnkgdXNpbmcgdGhlIE1BVEhKQVhfUkVMUEFUSCBvcHRpb24uIFRoZSBkZXN0aW5hdGlvbg0KKyMgZGlyZWN0b3J5IHNob3VsZCBjb250YWluIHRoZSBNYXRoSmF4LmpzIHNjcmlwdC4gRm9yIGluc3RhbmNlLCBpZiB0aGUgbWF0aGpheA0KKyMgZGlyZWN0b3J5IGlzIGxvY2F0ZWQgYXQgdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeSwgdGhlbg0KKyMgTUFUSEpBWF9SRUxQQVRIIHNob3VsZCBiZSAuLi9tYXRoamF4LiBUaGUgZGVmYXVsdCB2YWx1ZSBwb2ludHMgdG8NCisjIHRoZSBNYXRoSmF4IENvbnRlbnQgRGVsaXZlcnkgTmV0d29yayBzbyB5b3UgY2FuIHF1aWNrbHkgc2VlIHRoZSByZXN1bHQgd2l0aG91dA0KKyMgaW5zdGFsbGluZyBNYXRoSmF4Lg0KKyMgSG93ZXZlciwgaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gaW5zdGFsbCBhIGxvY2FsDQorIyBjb3B5IG9mIE1hdGhKYXggZnJvbSBodHRwOi8vd3d3Lm1hdGhqYXgub3JnIGJlZm9yZSBkZXBsb3ltZW50Lg0KKw0KK01BVEhKQVhfUkVMUEFUSCAgICAgICAgPSBodHRwOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0DQorDQorIyBUaGUgTUFUSEpBWF9FWFRFTlNJT05TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBNYXRoSmF4IGV4dGVuc2lvbg0KKyMgbmFtZXMgdGhhdCBzaG91bGQgYmUgZW5hYmxlZCBkdXJpbmcgTWF0aEpheCByZW5kZXJpbmcuDQorDQorTUFUSEpBWF9FWFRFTlNJT05TICAgICA9DQorDQorIyBXaGVuIHRoZSBTRUFSQ0hFTkdJTkUgdGFnIGlzIGVuYWJsZWQgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgc2VhcmNoIGJveA0KKyMgZm9yIHRoZSBIVE1MIG91dHB1dC4gVGhlIHVuZGVybHlpbmcgc2VhcmNoIGVuZ2luZSB1c2VzIGphdmFzY3JpcHQNCisjIGFuZCBESFRNTCBhbmQgc2hvdWxkIHdvcmsgb24gYW55IG1vZGVybiBicm93c2VyLiBOb3RlIHRoYXQgd2hlbiB1c2luZw0KKyMgSFRNTCBoZWxwIChHRU5FUkFURV9IVE1MSEVMUCksIFF0IGhlbHAgKEdFTkVSQVRFX1FIUCksIG9yIGRvY3NldHMNCisjIChHRU5FUkFURV9ET0NTRVQpIHRoZXJlIGlzIGFscmVhZHkgYSBzZWFyY2ggZnVuY3Rpb24gc28gdGhpcyBvbmUgc2hvdWxkDQorIyB0eXBpY2FsbHkgYmUgZGlzYWJsZWQuIEZvciBsYXJnZSBwcm9qZWN0cyB0aGUgamF2YXNjcmlwdCBiYXNlZCBzZWFyY2ggZW5naW5lDQorIyBjYW4gYmUgc2xvdywgdGhlbiBlbmFibGluZyBTRVJWRVJfQkFTRURfU0VBUkNIIG1heSBwcm92aWRlIGEgYmV0dGVyIHNvbHV0aW9uLg0KKw0KK1NFQVJDSEVOR0lORSAgICAgICAgICAgPSBZRVMNCisNCisjIFdoZW4gdGhlIFNFUlZFUl9CQVNFRF9TRUFSQ0ggdGFnIGlzIGVuYWJsZWQgdGhlIHNlYXJjaCBlbmdpbmUgd2lsbCBiZQ0KKyMgaW1wbGVtZW50ZWQgdXNpbmcgYSBQSFAgZW5hYmxlZCB3ZWIgc2VydmVyIGluc3RlYWQgb2YgYXQgdGhlIHdlYiBjbGllbnQNCisjIHVzaW5nIEphdmFzY3JpcHQuIERveHlnZW4gd2lsbCBnZW5lcmF0ZSB0aGUgc2VhcmNoIFBIUCBzY3JpcHQgYW5kIGluZGV4DQorIyBmaWxlIHRvIHB1dCBvbiB0aGUgd2ViIHNlcnZlci4gVGhlIGFkdmFudGFnZSBvZiB0aGUgc2VydmVyDQorIyBiYXNlZCBhcHByb2FjaCBpcyB0aGF0IGl0IHNjYWxlcyBiZXR0ZXIgdG8gbGFyZ2UgcHJvamVjdHMgYW5kIGFsbG93cw0KKyMgZnVsbCB0ZXh0IHNlYXJjaC4gVGhlIGRpc2FkdmFudGFnZXMgYXJlIHRoYXQgaXQgaXMgbW9yZSBkaWZmaWN1bHQgdG8gc2V0dXANCisjIGFuZCBkb2VzIG5vdCBoYXZlIGxpdmUgc2VhcmNoaW5nIGNhcGFiaWxpdGllcy4NCisNCitTRVJWRVJfQkFTRURfU0VBUkNIICAgID0gTk8NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgTGFUZVggb3V0cHV0DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsDQorIyBnZW5lcmF0ZSBMYXRleCBvdXRwdXQuDQorDQorR0VORVJBVEVfTEFURVggICAgICAgICA9IFlFUw0KKw0KKyMgVGhlIExBVEVYX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBMYVRlWCBkb2NzIHdpbGwgYmUgcHV0Lg0KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQ0KKyMgcHV0IGluIGZyb250IG9mIGl0LiBJZiBsZWZ0IGJsYW5rIGBsYXRleCcgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguDQorDQorTEFURVhfT1VUUFVUICAgICAgICAgICA9DQorDQorIyBUaGUgTEFURVhfQ01EX05BTUUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIExhVGVYIGNvbW1hbmQgbmFtZSB0byBiZQ0KKyMgaW52b2tlZC4gSWYgbGVmdCBibGFuayBgbGF0ZXgnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBjb21tYW5kIG5hbWUuDQorIyBOb3RlIHRoYXQgd2hlbiBlbmFibGluZyBVU0VfUERGTEFURVggdGhpcyBvcHRpb24gaXMgb25seSB1c2VkIGZvcg0KKyMgZ2VuZXJhdGluZyBiaXRtYXBzIGZvciBmb3JtdWxhcyBpbiB0aGUgSFRNTCBvdXRwdXQsIGJ1dCBub3QgaW4gdGhlDQorIyBNYWtlZmlsZSB0aGF0IGlzIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuDQorDQorTEFURVhfQ01EX05BTUUgICAgICAgICA9IGxhdGV4DQorDQorIyBUaGUgTUFLRUlOREVYX0NNRF9OQU1FIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjb21tYW5kIG5hbWUgdG8NCisjIGdlbmVyYXRlIGluZGV4IGZvciBMYVRlWC4gSWYgbGVmdCBibGFuayBgbWFrZWluZGV4JyB3aWxsIGJlIHVzZWQgYXMgdGhlDQorIyBkZWZhdWx0IGNvbW1hbmQgbmFtZS4NCisNCitNQUtFSU5ERVhfQ01EX05BTUUgICAgID0gbWFrZWluZGV4DQorDQorIyBJZiB0aGUgQ09NUEFDVF9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QNCisjIExhVGVYIGRvY3VtZW50cy4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBzbWFsbCBwcm9qZWN0cyBhbmQgbWF5IGhlbHAgdG8NCisjIHNhdmUgc29tZSB0cmVlcyBpbiBnZW5lcmFsLg0KKw0KK0NPTVBBQ1RfTEFURVggICAgICAgICAgPSBOTw0KKw0KKyMgVGhlIFBBUEVSX1RZUEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgcGFwZXIgdHlwZSB0aGF0IGlzIHVzZWQNCisjIGJ5IHRoZSBwcmludGVyLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBhNCwgbGV0dGVyLCBsZWdhbCBhbmQNCisjIGV4ZWN1dGl2ZS4gSWYgbGVmdCBibGFuayBhNHdpZGUgd2lsbCBiZSB1c2VkLg0KKw0KK1BBUEVSX1RZUEUgICAgICAgICAgICAgPSBhNHdpZGUNCisNCisjIFRoZSBFWFRSQV9QQUNLQUdFUyB0YWcgY2FuIGJlIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgbmFtZXMgb2YgTGFUZVgNCisjIHBhY2thZ2VzIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBMYVRlWCBvdXRwdXQuDQorDQorRVhUUkFfUEFDS0FHRVMgICAgICAgICA9DQorDQorIyBUaGUgTEFURVhfSEVBREVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgTGFUZVggaGVhZGVyIGZvcg0KKyMgdGhlIGdlbmVyYXRlZCBsYXRleCBkb2N1bWVudC4gVGhlIGhlYWRlciBzaG91bGQgY29udGFpbiBldmVyeXRoaW5nIHVudGlsDQorIyB0aGUgZmlyc3QgY2hhcHRlci4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQ0KKyMgc3RhbmRhcmQgaGVhZGVyLiBOb3RpY2U6IG9ubHkgdXNlIHRoaXMgdGFnIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyENCisNCitMQVRFWF9IRUFERVIgICAgICAgICAgID0gZG9jL2RveHlnZW4vaGVhZGVyLnRleA0KKw0KKyMgVGhlIExBVEVYX0ZPT1RFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIExhVGVYIGZvb3RlciBmb3INCisjIHRoZSBnZW5lcmF0ZWQgbGF0ZXggZG9jdW1lbnQuIFRoZSBmb290ZXIgc2hvdWxkIGNvbnRhaW4gZXZlcnl0aGluZyBhZnRlcg0KKyMgdGhlIGxhc3QgY2hhcHRlci4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQ0KKyMgc3RhbmRhcmQgZm9vdGVyLiBOb3RpY2U6IG9ubHkgdXNlIHRoaXMgdGFnIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyENCisNCitMQVRFWF9GT09URVIgICAgICAgICAgID0NCisNCisjIElmIHRoZSBQREZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIExhVGVYIHRoYXQgaXMgZ2VuZXJhdGVkDQorIyBpcyBwcmVwYXJlZCBmb3IgY29udmVyc2lvbiB0byBwZGYgKHVzaW5nIHBzMnBkZikuIFRoZSBwZGYgZmlsZSB3aWxsDQorIyBjb250YWluIGxpbmtzIChqdXN0IGxpa2UgdGhlIEhUTUwgb3V0cHV0KSBpbnN0ZWFkIG9mIHBhZ2UgcmVmZXJlbmNlcw0KKyMgVGhpcyBtYWtlcyB0aGUgb3V0cHV0IHN1aXRhYmxlIGZvciBvbmxpbmUgYnJvd3NpbmcgdXNpbmcgYSBwZGYgdmlld2VyLg0KKw0KK1BERl9IWVBFUkxJTktTICAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBVU0VfUERGTEFURVggdGFnIGlzIHNldCB0byBZRVMsIHBkZmxhdGV4IHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mDQorIyBwbGFpbiBsYXRleCBpbiB0aGUgZ2VuZXJhdGVkIE1ha2VmaWxlLiBTZXQgdGhpcyBvcHRpb24gdG8gWUVTIHRvIGdldCBhDQorIyBoaWdoZXIgcXVhbGl0eSBQREYgZG9jdW1lbnRhdGlvbi4NCisNCitVU0VfUERGTEFURVggICAgICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgTEFURVhfQkFUQ0hNT0RFIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgYWRkIHRoZSBcXGJhdGNobW9kZS4NCisjIGNvbW1hbmQgdG8gdGhlIGdlbmVyYXRlZCBMYVRlWCBmaWxlcy4gVGhpcyB3aWxsIGluc3RydWN0IExhVGVYIHRvIGtlZXANCisjIHJ1bm5pbmcgaWYgZXJyb3JzIG9jY3VyLCBpbnN0ZWFkIG9mIGFza2luZyB0aGUgdXNlciBmb3IgaGVscC4NCisjIFRoaXMgb3B0aW9uIGlzIGFsc28gdXNlZCB3aGVuIGdlbmVyYXRpbmcgZm9ybXVsYXMgaW4gSFRNTC4NCisNCitMQVRFWF9CQVRDSE1PREUgICAgICAgID0gTk8NCisNCisjIElmIExBVEVYX0hJREVfSU5ESUNFUyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIG5vdA0KKyMgaW5jbHVkZSB0aGUgaW5kZXggY2hhcHRlcnMgKHN1Y2ggYXMgRmlsZSBJbmRleCwgQ29tcG91bmQgSW5kZXgsIGV0Yy4pDQorIyBpbiB0aGUgb3V0cHV0Lg0KKw0KK0xBVEVYX0hJREVfSU5ESUNFUyAgICAgPSBOTw0KKw0KKyMgSWYgTEFURVhfU09VUkNFX0NPREUgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbmNsdWRlDQorIyBzb3VyY2UgY29kZSB3aXRoIHN5bnRheCBoaWdobGlnaHRpbmcgaW4gdGhlIExhVGVYIG91dHB1dC4NCisjIE5vdGUgdGhhdCB3aGljaCBzb3VyY2VzIGFyZSBzaG93biBhbHNvIGRlcGVuZHMgb24gb3RoZXIgc2V0dGluZ3MNCisjIHN1Y2ggYXMgU09VUkNFX0JST1dTRVIuDQorDQorTEFURVhfU09VUkNFX0NPREUgICAgICA9IE5PDQorDQorIyBUaGUgTEFURVhfQklCX1NUWUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBzdHlsZSB0byB1c2UgZm9yIHRoZQ0KKyMgYmlibGlvZ3JhcGh5LCBlLmcuIHBsYWlubmF0LCBvciBpZWVldHIuIFRoZSBkZWZhdWx0IHN0eWxlIGlzICJwbGFpbiIuIFNlZQ0KKyMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaWJUZVggZm9yIG1vcmUgaW5mby4NCisNCitMQVRFWF9CSUJfU1RZTEUgICAgICAgID0gcGxhaW4NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUlRGIG91dHB1dA0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIElmIHRoZSBHRU5FUkFURV9SVEYgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsIGdlbmVyYXRlIFJURiBvdXRwdXQNCisjIFRoZSBSVEYgb3V0cHV0IGlzIG9wdGltaXplZCBmb3IgV29yZCA5NyBhbmQgbWF5IG5vdCBsb29rIHZlcnkgcHJldHR5IHdpdGgNCisjIG90aGVyIFJURiByZWFkZXJzIG9yIGVkaXRvcnMuDQorDQorR0VORVJBVEVfUlRGICAgICAgICAgICA9IE5PDQorDQorIyBUaGUgUlRGX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBSVEYgZG9jcyB3aWxsIGJlIHB1dC4NCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUNCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgcnRmJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4NCisNCitSVEZfT1VUUFVUICAgICAgICAgICAgID0NCisNCisjIElmIHRoZSBDT01QQUNUX1JURiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QNCisjIFJURiBkb2N1bWVudHMuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3Igc21hbGwgcHJvamVjdHMgYW5kIG1heSBoZWxwIHRvDQorIyBzYXZlIHNvbWUgdHJlZXMgaW4gZ2VuZXJhbC4NCisNCitDT01QQUNUX1JURiAgICAgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBSVEZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIFJURiB0aGF0IGlzIGdlbmVyYXRlZA0KKyMgd2lsbCBjb250YWluIGh5cGVybGluayBmaWVsZHMuIFRoZSBSVEYgZmlsZSB3aWxsDQorIyBjb250YWluIGxpbmtzIChqdXN0IGxpa2UgdGhlIEhUTUwgb3V0cHV0KSBpbnN0ZWFkIG9mIHBhZ2UgcmVmZXJlbmNlcy4NCisjIFRoaXMgbWFrZXMgdGhlIG91dHB1dCBzdWl0YWJsZSBmb3Igb25saW5lIGJyb3dzaW5nIHVzaW5nIFdPUkQgb3Igb3RoZXINCisjIHByb2dyYW1zIHdoaWNoIHN1cHBvcnQgdGhvc2UgZmllbGRzLg0KKyMgTm90ZTogd29yZHBhZCAod3JpdGUpIGFuZCBvdGhlcnMgZG8gbm90IHN1cHBvcnQgbGlua3MuDQorDQorUlRGX0hZUEVSTElOS1MgICAgICAgICA9IE5PDQorDQorIyBMb2FkIHN0eWxlIHNoZWV0IGRlZmluaXRpb25zIGZyb20gZmlsZS4gU3ludGF4IGlzIHNpbWlsYXIgdG8gZG94eWdlbidzDQorIyBjb25maWcgZmlsZSwgaS5lLiBhIHNlcmllcyBvZiBhc3NpZ25tZW50cy4gWW91IG9ubHkgaGF2ZSB0byBwcm92aWRlDQorIyByZXBsYWNlbWVudHMsIG1pc3NpbmcgZGVmaW5pdGlvbnMgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0IHZhbHVlLg0KKw0KK1JURl9TVFlMRVNIRUVUX0ZJTEUgICAgPQ0KKw0KKyMgU2V0IG9wdGlvbmFsIHZhcmlhYmxlcyB1c2VkIGluIHRoZSBnZW5lcmF0aW9uIG9mIGFuIHJ0ZiBkb2N1bWVudC4NCisjIFN5bnRheCBpcyBzaW1pbGFyIHRvIGRveHlnZW4ncyBjb25maWcgZmlsZS4NCisNCitSVEZfRVhURU5TSU9OU19GSUxFICAgID0NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgbWFuIHBhZ2Ugb3V0cHV0DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX01BTiB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbA0KKyMgZ2VuZXJhdGUgbWFuIHBhZ2VzDQorDQorR0VORVJBVEVfTUFOICAgICAgICAgICA9IE5PDQorDQorIyBUaGUgTUFOX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBtYW4gcGFnZXMgd2lsbCBiZSBwdXQuDQorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlDQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYG1hbicgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguDQorDQorTUFOX09VVFBVVCAgICAgICAgICAgICA9DQorDQorIyBUaGUgTUFOX0VYVEVOU0lPTiB0YWcgZGV0ZXJtaW5lcyB0aGUgZXh0ZW5zaW9uIHRoYXQgaXMgYWRkZWQgdG8NCisjIHRoZSBnZW5lcmF0ZWQgbWFuIHBhZ2VzIChkZWZhdWx0IGlzIHRoZSBzdWJyb3V0aW5lJ3Mgc2VjdGlvbiAuMykNCisNCitNQU5fRVhURU5TSU9OICAgICAgICAgID0NCisNCisjIElmIHRoZSBNQU5fTElOS1MgdGFnIGlzIHNldCB0byBZRVMgYW5kIERveHlnZW4gZ2VuZXJhdGVzIG1hbiBvdXRwdXQsDQorIyB0aGVuIGl0IHdpbGwgZ2VuZXJhdGUgb25lIGFkZGl0aW9uYWwgbWFuIGZpbGUgZm9yIGVhY2ggZW50aXR5DQorIyBkb2N1bWVudGVkIGluIHRoZSByZWFsIG1hbiBwYWdlKHMpLiBUaGVzZSBhZGRpdGlvbmFsIGZpbGVzDQorIyBvbmx5IHNvdXJjZSB0aGUgcmVhbCBtYW4gcGFnZSwgYnV0IHdpdGhvdXQgdGhlbSB0aGUgbWFuIGNvbW1hbmQNCisjIHdvdWxkIGJlIHVuYWJsZSB0byBmaW5kIHRoZSBjb3JyZWN0IHBhZ2UuIFRoZSBkZWZhdWx0IGlzIE5PLg0KKw0KK01BTl9MSU5LUyAgICAgICAgICAgICAgPSBOTw0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBYTUwgb3V0cHV0DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX1hNTCB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwNCisjIGdlbmVyYXRlIGFuIFhNTCBmaWxlIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZg0KKyMgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLg0KKw0KK0dFTkVSQVRFX1hNTCAgICAgICAgICAgPSBOTw0KKw0KKyMgVGhlIFhNTF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgWE1MIHBhZ2VzIHdpbGwgYmUgcHV0Lg0KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQ0KKyMgcHV0IGluIGZyb250IG9mIGl0LiBJZiBsZWZ0IGJsYW5rIGB4bWwnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBwYXRoLg0KKw0KK1hNTF9PVVRQVVQgICAgICAgICAgICAgPSB4bWwNCisNCisjIFRoZSBYTUxfU0NIRU1BIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFuIFhNTCBzY2hlbWEsDQorIyB3aGljaCBjYW4gYmUgdXNlZCBieSBhIHZhbGlkYXRpbmcgWE1MIHBhcnNlciB0byBjaGVjayB0aGUNCisjIHN5bnRheCBvZiB0aGUgWE1MIGZpbGVzLg0KKw0KK1hNTF9TQ0hFTUEgICAgICAgICAgICAgPQ0KKw0KKyMgVGhlIFhNTF9EVEQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4gWE1MIERURCwNCisjIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGEgdmFsaWRhdGluZyBYTUwgcGFyc2VyIHRvIGNoZWNrIHRoZQ0KKyMgc3ludGF4IG9mIHRoZSBYTUwgZmlsZXMuDQorDQorWE1MX0RURCAgICAgICAgICAgICAgICA9DQorDQorIyBJZiB0aGUgWE1MX1BST0dSQU1MSVNUSU5HIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbA0KKyMgZHVtcCB0aGUgcHJvZ3JhbSBsaXN0aW5ncyAoaW5jbHVkaW5nIHN5bnRheCBoaWdobGlnaHRpbmcNCisjIGFuZCBjcm9zcy1yZWZlcmVuY2luZyBpbmZvcm1hdGlvbikgdG8gdGhlIFhNTCBvdXRwdXQuIE5vdGUgdGhhdA0KKyMgZW5hYmxpbmcgdGhpcyB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIFhNTCBvdXRwdXQuDQorDQorWE1MX1BST0dSQU1MSVNUSU5HICAgICA9IFlFUw0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIEF1dG9HZW4gRGVmaW5pdGlvbnMgb3V0cHV0DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX0FVVE9HRU5fREVGIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbA0KKyMgZ2VuZXJhdGUgYW4gQXV0b0dlbiBEZWZpbml0aW9ucyAoc2VlIGF1dG9nZW4uc2YubmV0KSBmaWxlDQorIyB0aGF0IGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbA0KKyMgZG9jdW1lbnRhdGlvbi4gTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcyBzdGlsbCBleHBlcmltZW50YWwNCisjIGFuZCBpbmNvbXBsZXRlIGF0IHRoZSBtb21lbnQuDQorDQorR0VORVJBVEVfQVVUT0dFTl9ERUYgICA9IE5PDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFBlcmwgbW9kdWxlIG91dHB1dA0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIElmIHRoZSBHRU5FUkFURV9QRVJMTU9EIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbA0KKyMgZ2VuZXJhdGUgYSBQZXJsIG1vZHVsZSBmaWxlIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZg0KKyMgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLiBOb3RlIHRoYXQgdGhpcw0KKyMgZmVhdHVyZSBpcyBzdGlsbCBleHBlcmltZW50YWwgYW5kIGluY29tcGxldGUgYXQgdGhlDQorIyBtb21lbnQuDQorDQorR0VORVJBVEVfUEVSTE1PRCAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgUEVSTE1PRF9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwgZ2VuZXJhdGUNCisjIHRoZSBuZWNlc3NhcnkgTWFrZWZpbGUgcnVsZXMsIFBlcmwgc2NyaXB0cyBhbmQgTGFUZVggY29kZSB0byBiZSBhYmxlDQorIyB0byBnZW5lcmF0ZSBQREYgYW5kIERWSSBvdXRwdXQgZnJvbSB0aGUgUGVybCBtb2R1bGUgb3V0cHV0Lg0KKw0KK1BFUkxNT0RfTEFURVggICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIFBFUkxNT0RfUFJFVFRZIHRhZyBpcyBzZXQgdG8gWUVTIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQgd2lsbCBiZQ0KKyMgbmljZWx5IGZvcm1hdHRlZCBzbyBpdCBjYW4gYmUgcGFyc2VkIGJ5IGEgaHVtYW4gcmVhZGVyLg0KKyMgVGhpcyBpcyB1c2VmdWwNCisjIGlmIHlvdSB3YW50IHRvIHVuZGVyc3RhbmQgd2hhdCBpcyBnb2luZyBvbi4NCisjIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGlzDQorIyB0YWcgaXMgc2V0IHRvIE5PIHRoZSBzaXplIG9mIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQgd2lsbCBiZSBtdWNoIHNtYWxsZXINCisjIGFuZCBQZXJsIHdpbGwgcGFyc2UgaXQganVzdCB0aGUgc2FtZS4NCisNCitQRVJMTU9EX1BSRVRUWSAgICAgICAgID0gWUVTDQorDQorIyBUaGUgbmFtZXMgb2YgdGhlIG1ha2UgdmFyaWFibGVzIGluIHRoZSBnZW5lcmF0ZWQgZG94eXJ1bGVzLm1ha2UgZmlsZQ0KKyMgYXJlIHByZWZpeGVkIHdpdGggdGhlIHN0cmluZyBjb250YWluZWQgaW4gUEVSTE1PRF9NQUtFVkFSX1BSRUZJWC4NCisjIFRoaXMgaXMgdXNlZnVsIHNvIGRpZmZlcmVudCBkb3h5cnVsZXMubWFrZSBmaWxlcyBpbmNsdWRlZCBieSB0aGUgc2FtZQ0KKyMgTWFrZWZpbGUgZG9uJ3Qgb3ZlcndyaXRlIGVhY2ggb3RoZXIncyB2YXJpYWJsZXMuDQorDQorUEVSTE1PRF9NQUtFVkFSX1BSRUZJWCA9DQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIHByZXByb2Nlc3Nvcg0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIElmIHRoZSBFTkFCTEVfUFJFUFJPQ0VTU0lORyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbA0KKyMgZXZhbHVhdGUgYWxsIEMtcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgZm91bmQgaW4gdGhlIHNvdXJjZXMgYW5kIGluY2x1ZGUNCisjIGZpbGVzLg0KKw0KK0VOQUJMRV9QUkVQUk9DRVNTSU5HICAgPSBZRVMNCisNCisjIElmIHRoZSBNQUNST19FWFBBTlNJT04gdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsIGV4cGFuZCBhbGwgbWFjcm8NCisjIG5hbWVzIGluIHRoZSBzb3VyY2UgY29kZS4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgb25seSBjb25kaXRpb25hbA0KKyMgY29tcGlsYXRpb24gd2lsbCBiZSBwZXJmb3JtZWQuIE1hY3JvIGV4cGFuc2lvbiBjYW4gYmUgZG9uZSBpbiBhIGNvbnRyb2xsZWQNCisjIHdheSBieSBzZXR0aW5nIEVYUEFORF9PTkxZX1BSRURFRiB0byBZRVMuDQorDQorTUFDUk9fRVhQQU5TSU9OICAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIEVYUEFORF9PTkxZX1BSRURFRiBhbmQgTUFDUk9fRVhQQU5TSU9OIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUw0KKyMgdGhlbiB0aGUgbWFjcm8gZXhwYW5zaW9uIGlzIGxpbWl0ZWQgdG8gdGhlIG1hY3JvcyBzcGVjaWZpZWQgd2l0aCB0aGUNCisjIFBSRURFRklORUQgYW5kIEVYUEFORF9BU19ERUZJTkVEIHRhZ3MuDQorDQorRVhQQU5EX09OTFlfUFJFREVGICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIFNFQVJDSF9JTkNMVURFUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZSBpbmNsdWRlcyBmaWxlcw0KKyMgcG9pbnRlZCB0byBieSBJTkNMVURFX1BBVEggd2lsbCBiZSBzZWFyY2hlZCB3aGVuIGEgI2luY2x1ZGUgaXMgZm91bmQuDQorDQorU0VBUkNIX0lOQ0xVREVTICAgICAgICA9IFlFUw0KKw0KKyMgVGhlIElOQ0xVREVfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0DQorIyBjb250YWluIGluY2x1ZGUgZmlsZXMgdGhhdCBhcmUgbm90IGlucHV0IGZpbGVzIGJ1dCBzaG91bGQgYmUgcHJvY2Vzc2VkIGJ5DQorIyB0aGUgcHJlcHJvY2Vzc29yLg0KKw0KK0lOQ0xVREVfUEFUSCAgICAgICAgICAgPQ0KKw0KKyMgWW91IGNhbiB1c2UgdGhlIElOQ0xVREVfRklMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZA0KKyMgcGF0dGVybnMgKGxpa2UgKi5oIGFuZCAqLmhwcCkgdG8gZmlsdGVyIG91dCB0aGUgaGVhZGVyLWZpbGVzIGluIHRoZQ0KKyMgZGlyZWN0b3JpZXMuIElmIGxlZnQgYmxhbmssIHRoZSBwYXR0ZXJucyBzcGVjaWZpZWQgd2l0aCBGSUxFX1BBVFRFUk5TIHdpbGwNCisjIGJlIHVzZWQuDQorDQorSU5DTFVERV9GSUxFX1BBVFRFUk5TICA9DQorDQorIyBUaGUgUFJFREVGSU5FRCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBtYWNybyBuYW1lcyB0aGF0DQorIyBhcmUgZGVmaW5lZCBiZWZvcmUgdGhlIHByZXByb2Nlc3NvciBpcyBzdGFydGVkIChzaW1pbGFyIHRvIHRoZSAtRCBvcHRpb24gb2YNCisjIGdjYykuIFRoZSBhcmd1bWVudCBvZiB0aGUgdGFnIGlzIGEgbGlzdCBvZiBtYWNyb3Mgb2YgdGhlIGZvcm06IG5hbWUNCisjIG9yIG5hbWU9ZGVmaW5pdGlvbiAobm8gc3BhY2VzKS4gSWYgdGhlIGRlZmluaXRpb24gYW5kIHRoZSA9IGFyZQ0KKyMgb21pdHRlZCA9MSBpcyBhc3N1bWVkLiBUbyBwcmV2ZW50IGEgbWFjcm8gZGVmaW5pdGlvbiBmcm9tIGJlaW5nDQorIyB1bmRlZmluZWQgdmlhICN1bmRlZiBvciByZWN1cnNpdmVseSBleHBhbmRlZCB1c2UgdGhlIDo9IG9wZXJhdG9yDQorIyBpbnN0ZWFkIG9mIHRoZSA9IG9wZXJhdG9yLg0KKw0KK1BSRURFRklORUQgICAgICAgICAgICAgPSBPTVBfMzBfRU5BQkxFRD0xLCBPTVBfNDBfRU5BQkxFRD0xLCBLTVBfU1RBVFNfRU5BQkxFRD0xDQorDQorIyBJZiB0aGUgTUFDUk9fRVhQQU5TSU9OIGFuZCBFWFBBTkRfT05MWV9QUkVERUYgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuDQorIyB0aGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZiBtYWNybyBuYW1lcyB0aGF0IHNob3VsZCBiZSBleHBhbmRlZC4NCisjIFRoZSBtYWNybyBkZWZpbml0aW9uIHRoYXQgaXMgZm91bmQgaW4gdGhlIHNvdXJjZXMgd2lsbCBiZSB1c2VkLg0KKyMgVXNlIHRoZSBQUkVERUZJTkVEIHRhZyBpZiB5b3Ugd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgbWFjcm8gZGVmaW5pdGlvbiB0aGF0DQorIyBvdmVycnVsZXMgdGhlIGRlZmluaXRpb24gZm91bmQgaW4gdGhlIHNvdXJjZSBjb2RlLg0KKw0KK0VYUEFORF9BU19ERUZJTkVEICAgICAgPQ0KKw0KKyMgSWYgdGhlIFNLSVBfRlVOQ1RJT05fTUFDUk9TIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbg0KKyMgZG94eWdlbidzIHByZXByb2Nlc3NvciB3aWxsIHJlbW92ZSBhbGwgcmVmZXJlbmNlcyB0byBmdW5jdGlvbi1saWtlIG1hY3Jvcw0KKyMgdGhhdCBhcmUgYWxvbmUgb24gYSBsaW5lLCBoYXZlIGFuIGFsbCB1cHBlcmNhc2UgbmFtZSwgYW5kIGRvIG5vdCBlbmQgd2l0aCBhDQorIyBzZW1pY29sb24sIGJlY2F1c2UgdGhlc2Ugd2lsbCBjb25mdXNlIHRoZSBwYXJzZXIgaWYgbm90IHJlbW92ZWQuDQorDQorU0tJUF9GVU5DVElPTl9NQUNST1MgICA9IFlFUw0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIENvbmZpZ3VyYXRpb246OmFkZGl0aW9ucyByZWxhdGVkIHRvIGV4dGVybmFsIHJlZmVyZW5jZXMNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBUaGUgVEFHRklMRVMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgdGFnZmlsZXMuIEZvciBlYWNoDQorIyB0YWcgZmlsZSB0aGUgbG9jYXRpb24gb2YgdGhlIGV4dGVybmFsIGRvY3VtZW50YXRpb24gc2hvdWxkIGJlIGFkZGVkLiBUaGUNCisjIGZvcm1hdCBvZiBhIHRhZyBmaWxlIHdpdGhvdXQgdGhpcyBsb2NhdGlvbiBpcyBhcyBmb2xsb3dzOg0KKyMNCisjIFRBR0ZJTEVTID0gZmlsZTEgZmlsZTIgLi4uDQorIyBBZGRpbmcgbG9jYXRpb24gZm9yIHRoZSB0YWcgZmlsZXMgaXMgZG9uZSBhcyBmb2xsb3dzOg0KKyMNCisjIFRBR0ZJTEVTID0gZmlsZTE9bG9jMSAiZmlsZTIgPSBsb2MyIiAuLi4NCisjIHdoZXJlICJsb2MxIiBhbmQgImxvYzIiIGNhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRocw0KKyMgb3IgVVJMcy4gTm90ZSB0aGF0IGVhY2ggdGFnIGZpbGUgbXVzdCBoYXZlIGEgdW5pcXVlIG5hbWUgKHdoZXJlIHRoZSBuYW1lIGRvZXMNCisjIE5PVCBpbmNsdWRlIHRoZSBwYXRoKS4gSWYgYSB0YWcgZmlsZSBpcyBub3QgbG9jYXRlZCBpbiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoDQorIyBkb3h5Z2VuIGlzIHJ1biwgeW91IG11c3QgYWxzbyBzcGVjaWZ5IHRoZSBwYXRoIHRvIHRoZSB0YWdmaWxlIGhlcmUuDQorDQorVEFHRklMRVMgICAgICAgICAgICAgICA9DQorDQorIyBXaGVuIGEgZmlsZSBuYW1lIGlzIHNwZWNpZmllZCBhZnRlciBHRU5FUkFURV9UQUdGSUxFLCBkb3h5Z2VuIHdpbGwgY3JlYXRlDQorIyBhIHRhZyBmaWxlIHRoYXQgaXMgYmFzZWQgb24gdGhlIGlucHV0IGZpbGVzIGl0IHJlYWRzLg0KKw0KK0dFTkVSQVRFX1RBR0ZJTEUgICAgICAgPQ0KKw0KKyMgSWYgdGhlIEFMTEVYVEVSTkFMUyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgZXh0ZXJuYWwgY2xhc3NlcyB3aWxsIGJlIGxpc3RlZA0KKyMgaW4gdGhlIGNsYXNzIGluZGV4LiBJZiBzZXQgdG8gTk8gb25seSB0aGUgaW5oZXJpdGVkIGV4dGVybmFsIGNsYXNzZXMNCisjIHdpbGwgYmUgbGlzdGVkLg0KKw0KK0FMTEVYVEVSTkFMUyAgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIEVYVEVSTkFMX0dST1VQUyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgZXh0ZXJuYWwgZ3JvdXBzIHdpbGwgYmUgbGlzdGVkDQorIyBpbiB0aGUgbW9kdWxlcyBpbmRleC4gSWYgc2V0IHRvIE5PLCBvbmx5IHRoZSBjdXJyZW50IHByb2plY3QncyBncm91cHMgd2lsbA0KKyMgYmUgbGlzdGVkLg0KKw0KK0VYVEVSTkFMX0dST1VQUyAgICAgICAgPSBZRVMNCisNCisjIFRoZSBQRVJMX1BBVEggc2hvdWxkIGJlIHRoZSBhYnNvbHV0ZSBwYXRoIGFuZCBuYW1lIG9mIHRoZSBwZXJsIHNjcmlwdA0KKyMgaW50ZXJwcmV0ZXIgKGkuZS4gdGhlIHJlc3VsdCBvZiBgd2hpY2ggcGVybCcpLg0KKw0KK1BFUkxfUEFUSCAgICAgICAgICAgICAgPQ0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBkb3QgdG9vbA0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIElmIHRoZSBDTEFTU19ESUFHUkFNUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbA0KKyMgZ2VuZXJhdGUgYSBpbmhlcml0YW5jZSBkaWFncmFtIChpbiBIVE1MLCBSVEYgYW5kIExhVGVYKSBmb3IgY2xhc3NlcyB3aXRoIGJhc2UNCisjIG9yIHN1cGVyIGNsYXNzZXMuIFNldHRpbmcgdGhlIHRhZyB0byBOTyB0dXJucyB0aGUgZGlhZ3JhbXMgb2ZmLiBOb3RlIHRoYXQNCisjIHRoaXMgb3B0aW9uIGFsc28gd29ya3Mgd2l0aCBIQVZFX0RPVCBkaXNhYmxlZCwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvDQorIyBpbnN0YWxsIGFuZCB1c2UgZG90LCBzaW5jZSBpdCB5aWVsZHMgbW9yZSBwb3dlcmZ1bCBncmFwaHMuDQorDQorQ0xBU1NfRElBR1JBTVMgICAgICAgICA9IFlFUw0KKw0KKyMgWW91IGNhbiBkZWZpbmUgbWVzc2FnZSBzZXF1ZW5jZSBjaGFydHMgd2l0aGluIGRveHlnZW4gY29tbWVudHMgdXNpbmcgdGhlIFxtc2MNCisjIGNvbW1hbmQuIERveHlnZW4gd2lsbCB0aGVuIHJ1biB0aGUgbXNjZ2VuIHRvb2wgKHNlZQ0KKyMgaHR0cDovL3d3dy5tY3Rlcm5hbi5tZS51ay9tc2NnZW4vKSB0byBwcm9kdWNlIHRoZSBjaGFydCBhbmQgaW5zZXJ0IGl0IGluIHRoZQ0KKyMgZG9jdW1lbnRhdGlvbi4gVGhlIE1TQ0dFTl9QQVRIIHRhZyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yeSB3aGVyZQ0KKyMgdGhlIG1zY2dlbiB0b29sIHJlc2lkZXMuIElmIGxlZnQgZW1wdHkgdGhlIHRvb2wgaXMgYXNzdW1lZCB0byBiZSBmb3VuZCBpbiB0aGUNCisjIGRlZmF1bHQgc2VhcmNoIHBhdGguDQorDQorTVNDR0VOX1BBVEggICAgICAgICAgICA9DQorDQorIyBJZiBzZXQgdG8gWUVTLCB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24gZ3JhcGhzIHdpbGwgaGlkZQ0KKyMgaW5oZXJpdGFuY2UgYW5kIHVzYWdlIHJlbGF0aW9ucyBpZiB0aGUgdGFyZ2V0IGlzIHVuZG9jdW1lbnRlZA0KKyMgb3IgaXMgbm90IGEgY2xhc3MuDQorDQorSElERV9VTkRPQ19SRUxBVElPTlMgICA9IFlFUw0KKw0KKyMgSWYgeW91IHNldCB0aGUgSEFWRV9ET1QgdGFnIHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBhc3N1bWUgdGhlIGRvdCB0b29sIGlzDQorIyBhdmFpbGFibGUgZnJvbSB0aGUgcGF0aC4gVGhpcyB0b29sIGlzIHBhcnQgb2YgR3JhcGh2aXosIGEgZ3JhcGggdmlzdWFsaXphdGlvbg0KKyMgdG9vbGtpdCBmcm9tIEFUJlQgYW5kIEx1Y2VudCBCZWxsIExhYnMuIFRoZSBvdGhlciBvcHRpb25zIGluIHRoaXMgc2VjdGlvbg0KKyMgaGF2ZSBubyBlZmZlY3QgaWYgdGhpcyBvcHRpb24gaXMgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkNCisNCitIQVZFX0RPVCAgICAgICAgICAgICAgID0gTk8NCisNCisjIFRoZSBET1RfTlVNX1RIUkVBRFMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZG90IGludm9jYXRpb25zIGRveHlnZW4gaXMNCisjIGFsbG93ZWQgdG8gcnVuIGluIHBhcmFsbGVsLiBXaGVuIHNldCB0byAwICh0aGUgZGVmYXVsdCkgZG94eWdlbiB3aWxsDQorIyBiYXNlIHRoaXMgb24gdGhlIG51bWJlciBvZiBwcm9jZXNzb3JzIGF2YWlsYWJsZSBpbiB0aGUgc3lzdGVtLiBZb3UgY2FuIHNldCBpdA0KKyMgZXhwbGljaXRseSB0byBhIHZhbHVlIGxhcmdlciB0aGFuIDAgdG8gZ2V0IGNvbnRyb2wgb3ZlciB0aGUgYmFsYW5jZQ0KKyMgYmV0d2VlbiBDUFUgbG9hZCBhbmQgcHJvY2Vzc2luZyBzcGVlZC4NCisNCitET1RfTlVNX1RIUkVBRFMgICAgICAgID0gMA0KKw0KKyMgQnkgZGVmYXVsdCBkb3h5Z2VuIHdpbGwgdXNlIHRoZSBIZWx2ZXRpY2EgZm9udCBmb3IgYWxsIGRvdCBmaWxlcyB0aGF0DQorIyBkb3h5Z2VuIGdlbmVyYXRlcy4gV2hlbiB5b3Ugd2FudCBhIGRpZmZlcmVudGx5IGxvb2tpbmcgZm9udCB5b3UgY2FuIHNwZWNpZnkNCisjIHRoZSBmb250IG5hbWUgdXNpbmcgRE9UX0ZPTlROQU1FLiBZb3UgbmVlZCB0byBtYWtlIHN1cmUgZG90IGlzIGFibGUgdG8gZmluZA0KKyMgdGhlIGZvbnQsIHdoaWNoIGNhbiBiZSBkb25lIGJ5IHB1dHRpbmcgaXQgaW4gYSBzdGFuZGFyZCBsb2NhdGlvbiBvciBieSBzZXR0aW5nDQorIyB0aGUgRE9URk9OVFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgYnkgc2V0dGluZyBET1RfRk9OVFBBVEggdG8gdGhlDQorIyBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZm9udC4NCisNCitET1RfRk9OVE5BTUUgICAgICAgICAgID0gSGVsdmV0aWNhDQorDQorIyBUaGUgRE9UX0ZPTlRTSVpFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIHNpemUgb2YgdGhlIGZvbnQgb2YgZG90IGdyYXBocy4NCisjIFRoZSBkZWZhdWx0IHNpemUgaXMgMTBwdC4NCisNCitET1RfRk9OVFNJWkUgICAgICAgICAgID0gMTANCisNCisjIEJ5IGRlZmF1bHQgZG94eWdlbiB3aWxsIHRlbGwgZG90IHRvIHVzZSB0aGUgSGVsdmV0aWNhIGZvbnQuDQorIyBJZiB5b3Ugc3BlY2lmeSBhIGRpZmZlcmVudCBmb250IHVzaW5nIERPVF9GT05UTkFNRSB5b3UgY2FuIHVzZSBET1RfRk9OVFBBVEggdG8NCisjIHNldCB0aGUgcGF0aCB3aGVyZSBkb3QgY2FuIGZpbmQgaXQuDQorDQorRE9UX0ZPTlRQQVRIICAgICAgICAgICA9DQorDQorIyBJZiB0aGUgQ0xBU1NfR1JBUEggYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuDQorIyB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBjbGFzcyBzaG93aW5nIHRoZSBkaXJlY3QgYW5kDQorIyBpbmRpcmVjdCBpbmhlcml0YW5jZSByZWxhdGlvbnMuIFNldHRpbmcgdGhpcyB0YWcgdG8gWUVTIHdpbGwgZm9yY2UgdGhlDQorIyBDTEFTU19ESUFHUkFNUyB0YWcgdG8gTk8uDQorDQorQ0xBU1NfR1JBUEggICAgICAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIENPTExBQk9SQVRJT05fR1JBUEggYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuDQorIyB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBjbGFzcyBzaG93aW5nIHRoZSBkaXJlY3QgYW5kDQorIyBpbmRpcmVjdCBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbmNpZXMgKGluaGVyaXRhbmNlLCBjb250YWlubWVudCwgYW5kDQorIyBjbGFzcyByZWZlcmVuY2VzIHZhcmlhYmxlcykgb2YgdGhlIGNsYXNzIHdpdGggb3RoZXIgZG9jdW1lbnRlZCBjbGFzc2VzLg0KKw0KK0NPTExBQk9SQVRJT05fR1JBUEggICAgPSBZRVMNCisNCisjIElmIHRoZSBHUk9VUF9HUkFQSFMgYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuDQorIyB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGdyb3Vwcywgc2hvd2luZyB0aGUgZGlyZWN0IGdyb3VwcyBkZXBlbmRlbmNpZXMNCisNCitHUk9VUF9HUkFQSFMgICAgICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgVU1MX0xPT0sgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGluaGVyaXRhbmNlIGFuZA0KKyMgY29sbGFib3JhdGlvbiBkaWFncmFtcyBpbiBhIHN0eWxlIHNpbWlsYXIgdG8gdGhlIE9NRydzIFVuaWZpZWQgTW9kZWxpbmcNCisjIExhbmd1YWdlLg0KKw0KK1VNTF9MT09LICAgICAgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIFVNTF9MT09LIHRhZyBpcyBlbmFibGVkLCB0aGUgZmllbGRzIGFuZCBtZXRob2RzIGFyZSBzaG93biBpbnNpZGUNCisjIHRoZSBjbGFzcyBub2RlLiBJZiB0aGVyZSBhcmUgbWFueSBmaWVsZHMgb3IgbWV0aG9kcyBhbmQgbWFueSBub2RlcyB0aGUNCisjIGdyYXBoIG1heSBiZWNvbWUgdG9vIGJpZyB0byBiZSB1c2VmdWwuIFRoZSBVTUxfTElNSVRfTlVNX0ZJRUxEUw0KKyMgdGhyZXNob2xkIGxpbWl0cyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGZvciBlYWNoIHR5cGUgdG8gbWFrZSB0aGUgc2l6ZSBtb3JlDQorIyBtYW5hZ2VhYmxlLiBTZXQgdGhpcyB0byAwIGZvciBubyBsaW1pdC4gTm90ZSB0aGF0IHRoZSB0aHJlc2hvbGQgbWF5IGJlDQorIyBleGNlZWRlZCBieSA1MCUgYmVmb3JlIHRoZSBsaW1pdCBpcyBlbmZvcmNlZC4NCisNCitVTUxfTElNSVRfTlVNX0ZJRUxEUyAgID0gMTANCisNCisjIElmIHNldCB0byBZRVMsIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbiBncmFwaHMgd2lsbCBzaG93IHRoZQ0KKyMgcmVsYXRpb25zIGJldHdlZW4gdGVtcGxhdGVzIGFuZCB0aGVpciBpbnN0YW5jZXMuDQorDQorVEVNUExBVEVfUkVMQVRJT05TICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HLCBTRUFSQ0hfSU5DTFVERVMsIElOQ0xVREVfR1JBUEgsIGFuZCBIQVZFX0RPVA0KKyMgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoIGRvY3VtZW50ZWQNCisjIGZpbGUgc2hvd2luZyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmNsdWRlIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSB3aXRoDQorIyBvdGhlciBkb2N1bWVudGVkIGZpbGVzLg0KKw0KK0lOQ0xVREVfR1JBUEggICAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBFTkFCTEVfUFJFUFJPQ0VTU0lORywgU0VBUkNIX0lOQ0xVREVTLCBJTkNMVURFRF9CWV9HUkFQSCwgYW5kDQorIyBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2gNCisjIGRvY3VtZW50ZWQgaGVhZGVyIGZpbGUgc2hvd2luZyB0aGUgZG9jdW1lbnRlZCBmaWxlcyB0aGF0IGRpcmVjdGx5IG9yDQorIyBpbmRpcmVjdGx5IGluY2x1ZGUgdGhpcyBmaWxlLg0KKw0KK0lOQ0xVREVEX0JZX0dSQVBIICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBDQUxMX0dSQVBIIGFuZCBIQVZFX0RPVCBvcHRpb25zIGFyZSBzZXQgdG8gWUVTIHRoZW4NCisjIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGNhbGwgZGVwZW5kZW5jeSBncmFwaCBmb3IgZXZlcnkgZ2xvYmFsIGZ1bmN0aW9uDQorIyBvciBjbGFzcyBtZXRob2QuIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UNCisjIHRoZSB0aW1lIG9mIGEgcnVuLiBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsIGdyYXBocw0KKyMgZm9yIHNlbGVjdGVkIGZ1bmN0aW9ucyBvbmx5IHVzaW5nIHRoZSBcY2FsbGdyYXBoIGNvbW1hbmQuDQorDQorQ0FMTF9HUkFQSCAgICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgQ0FMTEVSX0dSQVBIIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4NCisjIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGNhbGxlciBkZXBlbmRlbmN5IGdyYXBoIGZvciBldmVyeSBnbG9iYWwgZnVuY3Rpb24NCisjIG9yIGNsYXNzIG1ldGhvZC4gTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZQ0KKyMgdGhlIHRpbWUgb2YgYSBydW4uIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGxlcg0KKyMgZ3JhcGhzIGZvciBzZWxlY3RlZCBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxlcmdyYXBoIGNvbW1hbmQuDQorDQorQ0FMTEVSX0dSQVBIICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgR1JBUEhJQ0FMX0hJRVJBUkNIWSBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4NCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaGljYWwgaGllcmFyY2h5IG9mIGFsbCBjbGFzc2VzIGluc3RlYWQgb2YgYSB0ZXh0dWFsIG9uZS4NCisNCitHUkFQSElDQUxfSElFUkFSQ0hZICAgID0gWUVTDQorDQorIyBJZiB0aGUgRElSRUNUT1JZX0dSQVBIIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTDQorIyB0aGVuIGRveHlnZW4gd2lsbCBzaG93IHRoZSBkZXBlbmRlbmNpZXMgYSBkaXJlY3RvcnkgaGFzIG9uIG90aGVyIGRpcmVjdG9yaWVzDQorIyBpbiBhIGdyYXBoaWNhbCB3YXkuIFRoZSBkZXBlbmRlbmN5IHJlbGF0aW9ucyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgI2luY2x1ZGUNCisjIHJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBmaWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuDQorDQorRElSRUNUT1JZX0dSQVBIICAgICAgICA9IFlFUw0KKw0KKyMgVGhlIERPVF9JTUFHRV9GT1JNQVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgaW1hZ2UgZm9ybWF0IG9mIHRoZSBpbWFnZXMNCisjIGdlbmVyYXRlZCBieSBkb3QuIFBvc3NpYmxlIHZhbHVlcyBhcmUgc3ZnLCBwbmcsIGpwZywgb3IgZ2lmLg0KKyMgSWYgbGVmdCBibGFuayBwbmcgd2lsbCBiZSB1c2VkLiBJZiB5b3UgY2hvb3NlIHN2ZyB5b3UgbmVlZCB0byBzZXQNCisjIEhUTUxfRklMRV9FWFRFTlNJT04gdG8geGh0bWwgaW4gb3JkZXIgdG8gbWFrZSB0aGUgU1ZHIGZpbGVzDQorIyB2aXNpYmxlIGluIElFIDkrIChvdGhlciBicm93c2VycyBkbyBub3QgaGF2ZSB0aGlzIHJlcXVpcmVtZW50KS4NCisNCitET1RfSU1BR0VfRk9STUFUICAgICAgID0gcG5nDQorDQorIyBJZiBET1RfSU1BR0VfRk9STUFUIGlzIHNldCB0byBzdmcsIHRoZW4gdGhpcyBvcHRpb24gY2FuIGJlIHNldCB0byBZRVMgdG8NCisjIGVuYWJsZSBnZW5lcmF0aW9uIG9mIGludGVyYWN0aXZlIFNWRyBpbWFnZXMgdGhhdCBhbGxvdyB6b29taW5nIGFuZCBwYW5uaW5nLg0KKyMgTm90ZSB0aGF0IHRoaXMgcmVxdWlyZXMgYSBtb2Rlcm4gYnJvd3NlciBvdGhlciB0aGFuIEludGVybmV0IEV4cGxvcmVyLg0KKyMgVGVzdGVkIGFuZCB3b3JraW5nIGFyZSBGaXJlZm94LCBDaHJvbWUsIFNhZmFyaSwgYW5kIE9wZXJhLiBGb3IgSUUgOSsgeW91DQorIyBuZWVkIHRvIHNldCBIVE1MX0ZJTEVfRVhURU5TSU9OIHRvIHhodG1sIGluIG9yZGVyIHRvIG1ha2UgdGhlIFNWRyBmaWxlcw0KKyMgdmlzaWJsZS4gT2xkZXIgdmVyc2lvbnMgb2YgSUUgZG8gbm90IGhhdmUgU1ZHIHN1cHBvcnQuDQorDQorSU5URVJBQ1RJVkVfU1ZHICAgICAgICA9IE5PDQorDQorIyBUaGUgdGFnIERPVF9QQVRIIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHBhdGggd2hlcmUgdGhlIGRvdCB0b29sIGNhbiBiZQ0KKyMgZm91bmQuIElmIGxlZnQgYmxhbmssIGl0IGlzIGFzc3VtZWQgdGhlIGRvdCB0b29sIGNhbiBiZSBmb3VuZCBpbiB0aGUgcGF0aC4NCisNCitET1RfUEFUSCAgICAgICAgICAgICAgID0NCisNCisjIFRoZSBET1RGSUxFX0RJUlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdA0KKyMgY29udGFpbiBkb3QgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUNCisjIFxkb3RmaWxlIGNvbW1hbmQpLg0KKw0KK0RPVEZJTEVfRElSUyAgICAgICAgICAgPQ0KKw0KKyMgVGhlIE1TQ0ZJTEVfRElSUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0DQorIyBjb250YWluIG1zYyBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZQ0KKyMgXG1zY2ZpbGUgY29tbWFuZCkuDQorDQorTVNDRklMRV9ESVJTICAgICAgICAgICA9DQorDQorIyBUaGUgRE9UX0dSQVBIX01BWF9OT0RFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZg0KKyMgbm9kZXMgdGhhdCB3aWxsIGJlIHNob3duIGluIHRoZSBncmFwaC4gSWYgdGhlIG51bWJlciBvZiBub2RlcyBpbiBhIGdyYXBoDQorIyBiZWNvbWVzIGxhcmdlciB0aGFuIHRoaXMgdmFsdWUsIGRveHlnZW4gd2lsbCB0cnVuY2F0ZSB0aGUgZ3JhcGgsIHdoaWNoIGlzDQorIyB2aXN1YWxpemVkIGJ5IHJlcHJlc2VudGluZyBhIG5vZGUgYXMgYSByZWQgYm94LiBOb3RlIHRoYXQgZG94eWdlbiBpZiB0aGUNCisjIG51bWJlciBvZiBkaXJlY3QgY2hpbGRyZW4gb2YgdGhlIHJvb3Qgbm9kZSBpbiBhIGdyYXBoIGlzIGFscmVhZHkgbGFyZ2VyIHRoYW4NCisjIERPVF9HUkFQSF9NQVhfTk9ERVMgdGhlbiB0aGUgZ3JhcGggd2lsbCBub3QgYmUgc2hvd24gYXQgYWxsLiBBbHNvIG5vdGUNCisjIHRoYXQgdGhlIHNpemUgb2YgYSBncmFwaCBjYW4gYmUgZnVydGhlciByZXN0cmljdGVkIGJ5IE1BWF9ET1RfR1JBUEhfREVQVEguDQorDQorRE9UX0dSQVBIX01BWF9OT0RFUyAgICA9IDUwDQorDQorIyBUaGUgTUFYX0RPVF9HUkFQSF9ERVBUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBtYXhpbXVtIGRlcHRoIG9mIHRoZQ0KKyMgZ3JhcGhzIGdlbmVyYXRlZCBieSBkb3QuIEEgZGVwdGggdmFsdWUgb2YgMyBtZWFucyB0aGF0IG9ubHkgbm9kZXMgcmVhY2hhYmxlDQorIyBmcm9tIHRoZSByb290IGJ5IGZvbGxvd2luZyBhIHBhdGggdmlhIGF0IG1vc3QgMyBlZGdlcyB3aWxsIGJlIHNob3duLiBOb2Rlcw0KKyMgdGhhdCBsYXkgZnVydGhlciBmcm9tIHRoZSByb290IG5vZGUgd2lsbCBiZSBvbWl0dGVkLiBOb3RlIHRoYXQgc2V0dGluZyB0aGlzDQorIyBvcHRpb24gdG8gMSBvciAyIG1heSBncmVhdGx5IHJlZHVjZSB0aGUgY29tcHV0YXRpb24gdGltZSBuZWVkZWQgZm9yIGxhcmdlDQorIyBjb2RlIGJhc2VzLiBBbHNvIG5vdGUgdGhhdCB0aGUgc2l6ZSBvZiBhIGdyYXBoIGNhbiBiZSBmdXJ0aGVyIHJlc3RyaWN0ZWQgYnkNCisjIERPVF9HUkFQSF9NQVhfTk9ERVMuIFVzaW5nIGEgZGVwdGggb2YgMCBtZWFucyBubyBkZXB0aCByZXN0cmljdGlvbi4NCisNCitNQVhfRE9UX0dSQVBIX0RFUFRIICAgID0gMA0KKw0KKyMgU2V0IHRoZSBET1RfVFJBTlNQQVJFTlQgdGFnIHRvIFlFUyB0byBnZW5lcmF0ZSBpbWFnZXMgd2l0aCBhIHRyYW5zcGFyZW50DQorIyBiYWNrZ3JvdW5kLiBUaGlzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGJlY2F1c2UgZG90IG9uIFdpbmRvd3MgZG9lcyBub3QNCisjIHNlZW0gdG8gc3VwcG9ydCB0aGlzIG91dCBvZiB0aGUgYm94LiBXYXJuaW5nOiBEZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtIHVzZWQsDQorIyBlbmFibGluZyB0aGlzIG9wdGlvbiBtYXkgbGVhZCB0byBiYWRseSBhbnRpLWFsaWFzZWQgbGFiZWxzIG9uIHRoZSBlZGdlcyBvZg0KKyMgYSBncmFwaCAoaS5lLiB0aGV5IGJlY29tZSBoYXJkIHRvIHJlYWQpLg0KKw0KK0RPVF9UUkFOU1BBUkVOVCAgICAgICAgPSBOTw0KKw0KKyMgU2V0IHRoZSBET1RfTVVMVElfVEFSR0VUUyB0YWcgdG8gWUVTIGFsbG93IGRvdCB0byBnZW5lcmF0ZSBtdWx0aXBsZSBvdXRwdXQNCisjIGZpbGVzIGluIG9uZSBydW4gKGkuZS4gbXVsdGlwbGUgLW8gYW5kIC1UIG9wdGlvbnMgb24gdGhlIGNvbW1hbmQgbGluZSkuIFRoaXMNCisjIG1ha2VzIGRvdCBydW4gZmFzdGVyLCBidXQgc2luY2Ugb25seSBuZXdlciB2ZXJzaW9ucyBvZiBkb3QgKD4xLjguMTApDQorIyBzdXBwb3J0IHRoaXMsIHRoaXMgZmVhdHVyZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0Lg0KKw0KK0RPVF9NVUxUSV9UQVJHRVRTICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX0xFR0VORCB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbA0KKyMgZ2VuZXJhdGUgYSBsZWdlbmQgcGFnZSBleHBsYWluaW5nIHRoZSBtZWFuaW5nIG9mIHRoZSB2YXJpb3VzIGJveGVzIGFuZA0KKyMgYXJyb3dzIGluIHRoZSBkb3QgZ2VuZXJhdGVkIGdyYXBocy4NCisNCitHRU5FUkFURV9MRUdFTkQgICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgRE9UX0NMRUFOVVAgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwNCisjIHJlbW92ZSB0aGUgaW50ZXJtZWRpYXRlIGRvdCBmaWxlcyB0aGF0IGFyZSB1c2VkIHRvIGdlbmVyYXRlDQorIyB0aGUgdmFyaW91cyBncmFwaHMuDQorDQorRE9UX0NMRUFOVVAgICAgICAgICAgICA9IFlFUw0KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvZG9jL2RveHlnZW4vaGVhZGVyLnRleCBiL2ZpbmFsL3J1bnRpbWUvZG9jL2RveHlnZW4vaGVhZGVyLnRleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTllYTY3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9kb2MvZG94eWdlbi9oZWFkZXIudGV4CkBAIC0wLDAgKzEsNzcgQEAKKyUgTGF0ZXggaGVhZGVyIGZvciBkb3h5Z2VuIDEuOC4zLjEKK1xkb2N1bWVudGNsYXNze2Jvb2t9CitcdXNlcGFja2FnZVthNHBhcGVyLHRvcD0yLjVjbSxib3R0b209Mi41Y20sbGVmdD0yLjVjbSxyaWdodD0yLjVjbV17Z2VvbWV0cnl9CitcdXNlcGFja2FnZXttYWtlaWR4fQorXHVzZXBhY2thZ2V7bmF0YmlifQorXHVzZXBhY2thZ2V7Z3JhcGhpY3h9CitcdXNlcGFja2FnZXttdWx0aWNvbH0KK1x1c2VwYWNrYWdle2Zsb2F0fQorXHVzZXBhY2thZ2V7bGlzdGluZ3N9CitcdXNlcGFja2FnZXtjb2xvcn0KK1x1c2VwYWNrYWdle2lmdGhlbn0KK1x1c2VwYWNrYWdlW3RhYmxlXXt4Y29sb3J9CitcdXNlcGFja2FnZXt0ZXh0Y29tcH0KK1x1c2VwYWNrYWdle2FsbHR0fQorXHVzZXBhY2thZ2V7aWZwZGZ9CitcaWZwZGYKK1x1c2VwYWNrYWdlW3BkZnRleCwKKyAgICAgICAgICAgIHBhZ2ViYWNrcmVmPXRydWUsCisgICAgICAgICAgICBjb2xvcmxpbmtzPXRydWUsCisgICAgICAgICAgICBsaW5rY29sb3I9Ymx1ZSwKKyAgICAgICAgICAgIHVuaWNvZGUKKyAgICAgICAgICAgXXtoeXBlcnJlZn0KK1xlbHNlCitcdXNlcGFja2FnZVtwczJwZGYsCisgICAgICAgICAgICBwYWdlYmFja3JlZj10cnVlLAorICAgICAgICAgICAgY29sb3JsaW5rcz10cnVlLAorICAgICAgICAgICAgbGlua2NvbG9yPWJsdWUsCisgICAgICAgICAgICB1bmljb2RlCisgICAgICAgICAgIF17aHlwZXJyZWZ9CitcdXNlcGFja2FnZXtwc3BpY3R1cmV9CitcZmkKK1x1c2VwYWNrYWdlW3V0Zjhde2lucHV0ZW5jfQorXHVzZXBhY2thZ2V7bWF0aHB0bXh9CitcdXNlcGFja2FnZVtzY2FsZWQ9LjkwXXtoZWx2ZXR9CitcdXNlcGFja2FnZXtjb3VyaWVyfQorXHVzZXBhY2thZ2V7c2VjdHN0eX0KK1x1c2VwYWNrYWdle2Ftc3N5bWJ9CitcdXNlcGFja2FnZVt0aXRsZXNde3RvY2xvZnR9CitcdXNlcGFja2FnZXtkb3h5Z2VufQorXGxzdHNldHtsYW5ndWFnZT1DKyssaW5wdXRlbmNvZGluZz11dGY4LGJhc2ljc3R5bGU9XGZvb3Rub3Rlc2l6ZSxicmVha2xpbmVzPXRydWUsYnJlYWthdHdoaXRlc3BhY2U9dHJ1ZSx0YWJzaXplPTQsbnVtYmVycz1sZWZ0IH0KK1xtYWtlaW5kZXgKK1xzZXRjb3VudGVye3RvY2RlcHRofXszfQorXHJlbmV3Y29tbWFuZHtcZm9vdHJ1bGV3aWR0aH17MC40cHR9CitccmVuZXdjb21tYW5ke1xmYW1pbHlkZWZhdWx0fXtcc2ZkZWZhdWx0fQorXGhmdXp6PTE1cHQKK1xzZXRsZW5ndGh7XGVtZXJnZW5jeXN0cmV0Y2h9ezE1cHR9CitcaGJhZG5lc3M9NzUwCitcdG9sZXJhbmNlPTc1MAorXGJlZ2lue2RvY3VtZW50fQorXGh5cGVyc2V0dXB7cGFnZWFuY2hvcj1mYWxzZSxjaXRlY29sb3I9Ymx1ZX0KK1xiZWdpbnt0aXRsZXBhZ2V9CitcdnNwYWNlKns3Y219CitcYmVnaW57Y2VudGVyfQore1xMYXJnZSBMTFZNIE9wZW5NUFx0ZXh0c3VwZXJzY3JpcHR7Kn0gUnVudGltZSBMaWJyYXJ5IH1cXAorXHZzcGFjZSp7MWNtfQore1xsYXJnZSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAkZG94eWdlbnZlcnNpb24gfVxcCitcdnNwYWNlKnswLjVjbX0KK3tcc21hbGwgJGRhdGV0aW1lIH1cXAorXGVuZHtjZW50ZXJ9CitcZW5ke3RpdGxlcGFnZX0KKwore1xiZiBUcmFkZW1hcmtzfQorVGhlIE9wZW5NUCBuYW1lIGFuZCB0aGUgT3Blbk1QIGxvZ28gYXJlIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiB0aGUgT3Blbk1QIEFyY2hpdGVjdHVyZSBSZXZpZXcgQm9hcmQuCisKK0ludGVsLCBYZW9uLCBhbmQgSW50ZWwgWGVvbiBQaGkgYXJlIHRyYWRlbWFya3Mgb2YgSW50ZWwgQ29ycG9yYXRpb24gaW4gdGhlIFUuUy4gYW5kL29yIG90aGVyIGNvdW50cmllcy4KKworVGhpcyBkb2N1bWVudCBpcyBDb3B5cmlnaHQgXHRleHRjb3B5cmlnaHR+XHRoZVx5ZWFyIHRoZSBMTFZNIFByb2plY3QuIEl0IGlzCitzdWJqZWN0IHRvIHRoZSBzYW1lIGxpY2Vuc2UgdGVybXMgYXMgdGhlIExMVk0gT3Blbk1QIHJ1bnRpbWUuCisKK1x0ZXh0c3VwZXJzY3JpcHR7Kn0gT3RoZXIgbmFtZXMgYW5kIGJyYW5kcyBtYXkgYmUgY2xhaW1lZCBhcyB0aGUgcHJvcGVydHkgb2Ygb3RoZXJzLgorCitcY2xlYXJlbXB0eWRvdWJsZXBhZ2UKK1xwYWdlbnVtYmVyaW5ne3JvbWFufQorXHRhYmxlb2Zjb250ZW50cworXGNsZWFyZW1wdHlkb3VibGVwYWdlCitccGFnZW51bWJlcmluZ3thcmFiaWN9CitcaHlwZXJzZXR1cHtwYWdlYW5jaG9yPXRydWUsY2l0ZWNvbG9yPWJsdWV9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL2RvYy9kb3h5Z2VuL2xpYm9tcF9pbnRlcmZhY2UuaCBiL2ZpbmFsL3J1bnRpbWUvZG9jL2RveHlnZW4vbGlib21wX2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MWFlOTUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL2RvYy9kb3h5Z2VuL2xpYm9tcF9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDMzMyBAQAorLy8gVGhpcyBmaWxlIGRvZXMgbm90IGNvbnRhaW4gYW55IGNvZGU7IGl0IGp1c3QgY29udGFpbnMgYWRkaXRpb25hbCB0ZXh0IGFuZCBmb3JtYXR0aW5nDQorLy8gZm9yIGRveHlnZW4uDQorDQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisNCisvKiEgQG1haW5wYWdlIExMVk0mbmJzcDsgT3Blbk1QKiBSdW50aW1lIExpYnJhcnkgSW50ZXJmYWNlDQorQHNlY3Rpb24gc2VjX2ludHJvIEludHJvZHVjdGlvbg0KKw0KK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBpbnRlcmZhY2UgcHJvdmlkZWQgYnkgdGhlDQorTExWTSAmbmJzcDtPcGVuTVBcb3RoZXIgcnVudGltZSBsaWJyYXJ5IHRvIHRoZSBjb21waWxlci4NCitSb3V0aW5lcyB0aGF0IGFyZSBkaXJlY3RseSBjYWxsZWQgYXMgc2ltcGxlIGZ1bmN0aW9ucyBieSB1c2VyIGNvZGUgYXJlDQorbm90IGN1cnJlbnRseSBkZXNjcmliZWQgaGVyZSwgc2luY2UgdGhlaXIgZGVmaW5pdGlvbiBpcyBpbiB0aGUgT3Blbk1QDQorc3BlY2lmaWNhdGlvbiBhdmFpbGFibGUgZnJvbSBodHRwOi8vb3Blbm1wLm9yZw0KKw0KK1RoZSBhaW0gaGVyZSBpcyB0byBleHBsYWluIHRoZSBpbnRlcmZhY2UgZnJvbSB0aGUgY29tcGlsZXIgdG8gdGhlIHJ1bnRpbWUuDQorDQorVGhlIG92ZXJhbGwgZGVzaWduIGlzIGRlc2NyaWJlZCwgYW5kIGVhY2ggZnVuY3Rpb24gaW4gdGhlIGludGVyZmFjZQ0KK2hhcyBpdHMgb3duIGRlc2NyaXB0aW9uLiAoQXQgbGVhc3QsIHRoYXQncyB0aGUgYW1iaXRpb24sIHdlIG1heSBub3QgYmUgdGhlcmUgeWV0KS4NCisNCitAc2VjdGlvbiBzZWNfYnVpbGRpbmcgUXVpY2tseSBCdWlsZGluZyB0aGUgUnVudGltZQ0KK0ZvciB0aGUgaW1wYXRpZW50LCB3ZSBjb3ZlciBidWlsZGluZyB0aGUgcnVudGltZSBhcyB0aGUgZmlyc3QgdG9waWMgaGVyZS4NCisNCitDTWFrZSBpcyB1c2VkIHRvIGJ1aWxkIHRoZSBPcGVuTVAgcnVudGltZS4gIEZvciBkZXRhaWxzIGFuZCBhIGZ1bGwgbGlzdCBvZiBvcHRpb25zIGZvciB0aGUgQ01ha2UgYnVpbGQgc3lzdGVtLA0KK3NlZSA8dHQ+QnVpbGRfV2l0aF9DTWFrZS50eHQ8L3R0PiBpbnNpZGUgdGhlIDx0dD5ydW50aW1lLzwvdHQ+IHN1YmRpcmVjdG9yeS4gIFRoZXNlDQoraW5zdHJ1Y3Rpb25zIHdpbGwgcHJvdmlkZSB0aGUgbW9zdCB0eXBpY2FsIGJ1aWxkLg0KKw0KK0luLUxMVk0tdHJlZSBidWlsZDouDQorQGNvZGUNCiskIGNkIHdoZXJlLXlvdS13YW50LXRvLWxpdmUNCitDaGVjayBvdXQgb3Blbm1wIGludG8gbGx2bS9wcm9qZWN0cw0KKyQgY2Qgd2hlcmUteW91LXdhbnQtdG8tYnVpbGQNCiskIG1rZGlyIGJ1aWxkICYmIGNkIGJ1aWxkDQorJCBjbWFrZSBwYXRoL3RvL2xsdm0gLURDTUFLRV9DX0NPTVBJTEVSPTxDIGNvbXBpbGVyPiAtRENNQUtFX0NYWF9DT01QSUxFUj08QysrIGNvbXBpbGVyPg0KKyQgbWFrZSBvbXANCitAZW5kY29kZQ0KK091dC1vZi1MTFZNLXRyZWUgYnVpbGQ6DQorQGNvZGUNCiskIGNkIHdoZXJlLXlvdS13YW50LXRvLWxpdmUNCitDaGVjayBvdXQgb3Blbm1wDQorJCBjZCB3aGVyZS15b3Utd2FudC10by1saXZlL29wZW5tcC9ydW50aW1lDQorJCBta2RpciBidWlsZCAmJiBjZCBidWlsZA0KKyQgY21ha2UgcGF0aC90by9vcGVubXAgLURDTUFLRV9DX0NPTVBJTEVSPTxDIGNvbXBpbGVyPiAtRENNQUtFX0NYWF9DT01QSUxFUj08QysrIGNvbXBpbGVyPg0KKyQgbWFrZQ0KK0BlbmRjb2RlDQorDQorQHNlY3Rpb24gc2VjX3N1cHBvcnRlZCBTdXBwb3J0ZWQgUlRMIEJ1aWxkIENvbmZpZ3VyYXRpb25zDQorDQorVGhlIGFyY2hpdGVjdHVyZXMgc3VwcG9ydGVkIGFyZSBJQS0zMiBhcmNoaXRlY3R1cmUsIEludGVsJnJlZzsmbmJzcDsgNjQsIGFuZA0KK0ludGVsJnJlZzsmbmJzcDsgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlLiAgVGhlIGJ1aWxkIGNvbmZpZ3VyYXRpb25zDQorc3VwcG9ydGVkIGFyZSBzaG93biBpbiB0aGUgdGFibGUgYmVsb3cuDQorDQorPHRhYmxlIGJvcmRlcj0xPg0KKzx0cj48dGg+IDx0aD5pY2MvaWNsPHRoPmdjYzx0aD5jbGFuZw0KKzx0cj48dGQ+TGludXhcb3RoZXIgT1M8dGQ+WWVzKDEsNSk8dGQ+WWVzKDIsNCk8dGQ+WWVzKDQsNiw3KQ0KKzx0cj48dGQ+RnJlZUJTRFxvdGhlcjx0ZD5ZZXMoMSw1KTx0ZD5ZZXMoMiw0KTx0ZD5ZZXMoNCw2LDcsOCkNCis8dHI+PHRkPk9TIFhcb3RoZXI8dGQ+WWVzKDEsMyw0KTx0ZD5Obzx0ZD5ZZXMoNCw2LDcpDQorPHRyPjx0ZD5XaW5kb3dzXG90aGVyIE9TPHRkPlllcygxLDQpPHRkPk5vPHRkPk5vDQorPC90YWJsZT4NCisoMSkgT24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbCZyZWc7Jm5ic3A7IDY0LCBpY2MvaWNsIHZlcnNpb25zIDEyLnggDQorICAgIGFyZSBzdXBwb3J0ZWQgKDEyLjEgaXMgcmVjb21tZW5kZWQpLjxicj4NCisoMikgZ2NjIHZlcnNpb24gNC43IGlzIHN1cHBvcnRlZC48YnI+DQorKDMpIEZvciBpY2Mgb24gT1MgWFxvdGhlciwgT1MgWFxvdGhlciB2ZXJzaW9uIDEwLjUuOCBpcyBzdXBwb3J0ZWQuPGJyPg0KKyg0KSBJbnRlbCZyZWc7Jm5ic3A7IE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSBub3Qgc3VwcG9ydGVkLjxicj4NCisoNSkgT24gSW50ZWwmcmVnOyZuYnNwOyBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUsIGljYy9pY2wgdmVyc2lvbnMgMTMuMCBvciBsYXRlciBhcmUgcmVxdWlyZWQuPGJyPg0KKyg2KSBDbGFuZ1xvdGhlciB2ZXJzaW9uIDMuMyBpcyBzdXBwb3J0ZWQuPGJyPg0KKyg3KSBDbGFuZ1xvdGhlciBjdXJyZW50bHkgZG9lcyBub3Qgb2ZmZXIgYSBzb2Z0d2FyZS1pbXBsZW1lbnRlZCAxMjggYml0IGV4dGVuZGVkDQorICAgIHByZWNpc2lvbiB0eXBlLiAgVGh1cywgYWxsIGVudHJ5IHBvaW50cyByZWxpYW50IG9uIHRoaXMgdHlwZSBhcmUgcmVtb3ZlZA0KKyAgICBmcm9tIHRoZSBsaWJyYXJ5IGFuZCBjYW5ub3QgYmUgY2FsbGVkIGluIHRoZSB1c2VyIHByb2dyYW0uICBUaGUgZm9sbG93aW5nDQorICAgIGZ1bmN0aW9ucyBhcmUgbm90IGF2YWlsYWJsZToNCitAY29kZQ0KKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfKg0KKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfKg0KKyAgICBfX2ttcGNfYXRvbWljXypfZnANCitAZW5kY29kZQ0KKyg4KSBDb21tdW5pdHkgY29udHJpYnV0aW9uIHByb3ZpZGVkIEFTIElTLCBub3QgdGVzdGVkIGJ5IEludGVsLg0KKw0KK1N1cHBvcnRlZCBBcmNoaXRlY3R1cmVzOiBJQk0oUikgUG93ZXIgNyBhbmQgUG93ZXIgOA0KKzx0YWJsZSBib3JkZXI9MT4NCis8dHI+PHRoPiA8dGg+Z2NjPHRoPmNsYW5nDQorPHRyPjx0ZD5MaW51eFxvdGhlciBPUzx0ZD5ZZXMoMSwyKTx0ZD5ZZXMoMyw0KQ0KKzwvdGFibGU+DQorKDEpIE9uIFBvd2VyIDcsIGdjYyB2ZXJzaW9uIDQuOC4yIGlzIHN1cHBvcnRlZC48YnI+DQorKDIpIE9uIFBvd2VyIDgsIGdjYyB2ZXJzaW9uIDQuOC4yIGlzIHN1cHBvcnRlZC48YnI+DQorKDMpIE9uIFBvd2VyIDcsIGNsYW5nIHZlcnNpb24gMy43IGlzIHN1cHBvcnRlZC48YnI+DQorKDQpIE9uIFBvd2VyIDgsIGNsYW5nIHZlcnNpb24gMy43IGlzIHN1cHBvcnRlZC48YnI+DQorDQorQHNlY3Rpb24gc2VjX2Zyb250ZW5kIEZyb250LWVuZCBDb21waWxlcnMgdGhhdCB3b3JrIHdpdGggdGhpcyBSVEwNCisNCitUaGUgZm9sbG93aW5nIGNvbXBpbGVycyBhcmUga25vd24gdG8gZG8gY29tcGF0aWJsZSBjb2RlIGdlbmVyYXRpb24gZm9yDQordGhpcyBSVEw6IGljYy9pY2wsIGdjYy4gIENvZGUgZ2VuZXJhdGlvbiBpcyBkaXNjdXNzZWQgaW4gbW9yZSBkZXRhaWwNCitsYXRlciBpbiB0aGlzIGRvY3VtZW50Lg0KKw0KK0BzZWN0aW9uIHNlY19vdXRsaW5pbmcgT3V0bGluaW5nDQorDQorVGhlIHJ1bnRpbWUgaW50ZXJmYWNlIGlzIGJhc2VkIG9uIHRoZSBpZGVhIHRoYXQgdGhlIGNvbXBpbGVyDQorIm91dGxpbmVzIiBzZWN0aW9ucyBvZiBjb2RlIHRoYXQgYXJlIHRvIHJ1biBpbiBwYXJhbGxlbCBpbnRvIHNlcGFyYXRlDQorZnVuY3Rpb25zIHRoYXQgY2FuIHRoZW4gYmUgaW52b2tlZCBpbiBtdWx0aXBsZSB0aHJlYWRzLiAgRm9yIGluc3RhbmNlLA0KK3NpbXBsZSBjb2RlIGxpa2UgdGhpcw0KKw0KK0Bjb2RlDQordm9pZCBmb28oKQ0KK3sNCisjcHJhZ21hIG9tcCBwYXJhbGxlbA0KKyAgICB7DQorICAgICAgICAuLi4gZG8gc29tZXRoaW5nIC4uLg0KKyAgICB9DQorfQ0KK0BlbmRjb2RlDQoraXMgY29udmVydGVkIGludG8gc29tZXRoaW5nIHRoYXQgbG9va3MgY29uY2VwdHVhbGx5IGxpa2UgdGhpcyAod2hlcmUNCit0aGUgbmFtZXMgdXNlZCBhcmUgbWVyZWx5IGlsbHVzdHJhdGl2ZTsgdGhlIHJlYWwgbGlicmFyeSBmdW5jdGlvbg0KK25hbWVzIHdpbGwgYmUgdXNlZCBsYXRlciBhZnRlciB3ZSd2ZSBkaXNjdXNzZWQgc29tZSBtb3JlIGlzc3Vlcy4uLikNCisNCitAY29kZQ0KK3N0YXRpYyB2b2lkIG91dGxpbmVkRm9vQm9keSgpDQorew0KKyAgICAuLi4gZG8gc29tZXRoaW5nIC4uLg0KK30NCisNCit2b2lkIGZvbygpDQorew0KKyAgICBfX09NUF9ydW50aW1lX2Zvcmsob3V0bGluZWRGb29Cb2R5LCAodm9pZCopMCk7ICAgLy8gTm90IHRoZSByZWFsIGZ1bmN0aW9uIG5hbWUhDQorfQ0KK0BlbmRjb2RlDQorDQorQHN1YnNlY3Rpb24gU0VDX1NIQVJFRFZBUlMgQWRkcmVzc2luZyBzaGFyZWQgdmFyaWFibGVzDQorDQorSW4gcmVhbCB1c2VzIG9mIHRoZSBPcGVuTVBcb3RoZXIgQVBJIHRoZXJlIGFyZSBub3JtYWxseSByZWZlcmVuY2VzIA0KK2Zyb20gdGhlIG91dGxpbmVkIGNvZGUgIHRvIHNoYXJlZCB2YXJpYWJsZXMgdGhhdCBhcmUgaW4gc2NvcGUgaW4gdGhlIGNvbnRhaW5pbmcgZnVuY3Rpb24uIA0KK1RoZXJlZm9yZSB0aGUgY29udGFpbmluZyBmdW5jdGlvbiBtdXN0IGJlIGFibGUgdG8gYWRkcmVzcyANCit0aGVzZSB2YXJpYWJsZXMuIFRoZSBydW50aW1lIHN1cHBvcnRzIHR3byBhbHRlcm5hdGUgd2F5cyBvZiBkb2luZw0KK3RoaXMuDQorDQorQHN1YnN1YnNlY3Rpb24gU0VDX1NFQ19PVCBDdXJyZW50IFRlY2huaXF1ZQ0KK1RoZSB0ZWNobmlxdWUgY3VycmVudGx5IHN1cHBvcnRlZCBieSB0aGUgcnVudGltZSBsaWJyYXJ5IGlzIHRvIHJlY2VpdmUNCithIHNlcGFyYXRlIHBvaW50ZXIgdG8gZWFjaCBzaGFyZWQgdmFyaWFibGUgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZnJvbQ0KK3RoZSBvdXRsaW5lZCBmdW5jdGlvbi4gIFRoaXMgaXMgd2hhdCBpcyBzaG93biBpbiB0aGUgZXhhbXBsZSBiZWxvdy4NCisNCitXZSBob3BlIHNvb24gdG8gcHJvdmlkZSBhbiBhbHRlcm5hdGl2ZSBpbnRlcmZhY2UgdG8gc3VwcG9ydCB0aGUNCithbHRlcm5hdGUgaW1wbGVtZW50YXRpb24gZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uIFRoZQ0KK2FsdGVybmF0aXZlIGltcGxlbWVudGF0aW9uIGhhcyBwZXJmb3JtYW5jZSBhZHZhbnRhZ2VzIGZvciBzbWFsbA0KK3BhcmFsbGVsIHJlZ2lvbnMgdGhhdCBoYXZlIG1hbnkgc2hhcmVkIHZhcmlhYmxlcy4NCisNCitAc3Vic3Vic2VjdGlvbiBTRUNfU0VDX1BUIEZ1dHVyZSBUZWNobmlxdWUNCitUaGUgaWRlYSBpcyB0byB0cmVhdCB0aGUgb3V0bGluZWQgZnVuY3Rpb24gYXMgdGhvdWdoIGl0DQord2VyZSBhIGxleGljYWxseSBuZXN0ZWQgZnVuY3Rpb24sIGFuZCBwYXNzIGl0IGEgc2luZ2xlIGFyZ3VtZW50IHdoaWNoDQoraXMgdGhlIHBvaW50ZXIgdG8gdGhlIHBhcmVudCdzIHN0YWNrIGZyYW1lLiBQcm92aWRlZCB0aGF0IHRoZSBjb21waWxlcg0KK2tub3dzIHRoZSBsYXlvdXQgb2YgdGhlIHBhcmVudCBmcmFtZSB3aGVuIGl0IGlzIGdlbmVyYXRpbmcgdGhlIG91dGxpbmVkDQorZnVuY3Rpb24gaXQgY2FuIHRoZW4gYWNjZXNzIHRoZSB1cC1sZXZlbCB2YXJpYWJsZXMgYXQgYXBwcm9wcmlhdGUNCitvZmZzZXRzIGZyb20gdGhlIHBhcmVudCBmcmFtZS4gIFRoaXMgaXMgYSBjbGFzc2ljYWwgY29tcGlsZXIgdGVjaG5pcXVlDQorZnJvbSB0aGUgMTk2MHMgdG8gc3VwcG9ydCBsYW5ndWFnZXMgbGlrZSBBbGdvbCAoYW5kIGl0cyBkZXNjZW5kYW50cykNCit0aGF0IHN1cHBvcnQgbGV4aWNhbGx5IG5lc3RlZCBmdW5jdGlvbnMuDQorDQorVGhlIG1haW4gYmVuZWZpdCBvZiB0aGlzIHRlY2huaXF1ZSBpcyB0aGF0IHRoZXJlIGlzIG5vIGNvZGUgcmVxdWlyZWQNCithdCB0aGUgZm9yayBwb2ludCB0byBtYXJzaGFsIHRoZSBhcmd1bWVudHMgdG8gdGhlIG91dGxpbmVkIGZ1bmN0aW9uLg0KK1NpbmNlIHRoZSBydW50aW1lIGtub3dzIHN0YXRpY2FsbHkgaG93IG1hbnkgYXJndW1lbnRzIG11c3QgYmUgcGFzc2VkIHRvIHRoZQ0KK291dGxpbmVkIGZ1bmN0aW9uLCBpdCBjYW4gZWFzaWx5IGNvcHkgdGhlbSB0byB0aGUgdGhyZWFkJ3Mgc3RhY2sNCitmcmFtZS4gIFRoZXJlZm9yZSB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGZvcmsgY29kZSBpcyBpbmRlcGVuZGVudCBvZg0KK3RoZSBudW1iZXIgb2Ygc2hhcmVkIHZhcmlhYmxlcyB0aGF0IGFyZSBhY2Nlc3NlZCBieSB0aGUgb3V0bGluZWQNCitmdW5jdGlvbi4NCisNCitJZiBpdCBpcyBoYXJkIHRvIGRldGVybWluZSB0aGUgc3RhY2sgbGF5b3V0IG9mIHRoZSBwYXJlbnQgd2hpbGUgZ2VuZXJhdGluZyB0aGUNCitvdXRsaW5lZCBjb2RlLCBpdCBpcyBzdGlsbCBwb3NzaWJsZSB0byB1c2UgdGhpcyBhcHByb2FjaCBieSBjb2xsZWN0aW5nIGFsbCBvZg0KK3RoZSB2YXJpYWJsZXMgaW4gdGhlIHBhcmVudCB0aGF0IGFyZSBhY2Nlc3NlZCBmcm9tIG91dGxpbmVkIGZ1bmN0aW9ucyBpbnRvDQorYSBzaW5nbGUgYHN0cnVjdGAgd2hpY2ggaXMgcGxhY2VkIG9uIHRoZSBzdGFjaywgYW5kIHdob3NlIGFkZHJlc3MgaXMgcGFzc2VkDQordG8gdGhlIG91dGxpbmVkIGZ1bmN0aW9ucy4gSW4gdGhpcyB3YXkgdGhlIG9mZnNldHMgb2YgdGhlIHNoYXJlZCB2YXJpYWJsZXMNCithcmUga25vd24gKHNpbmNlIHRoZXkgYXJlIGluc2lkZSB0aGUgc3RydWN0KSB3aXRob3V0IG5lZWRpbmcgdG8ga25vdw0KK3RoZSBjb21wbGV0ZSBsYXlvdXQgb2YgdGhlIHBhcmVudCBzdGFjay1mcmFtZS4gRnJvbSB0aGUgcG9pbnQgb2Ygdmlldw0KK29mIHRoZSBydW50aW1lIGVpdGhlciBvZiB0aGVzZSB0ZWNobmlxdWVzIGlzIGVxdWl2YWxlbnQsIHNpbmNlIGluIGVpdGhlcg0KK2Nhc2UgaXQgb25seSBoYXMgdG8gcGFzcyBhIHNpbmdsZSBhcmd1bWVudCB0byB0aGUgb3V0bGluZWQgZnVuY3Rpb24gdG8gYWxsb3cgDQoraXQgdG8gYWNjZXNzIHNoYXJlZCB2YXJpYWJsZXMuDQorDQorQSBzY2hlbWUgbGlrZSB0aGlzIGlzIGhvdyBnY2Ncb3RoZXIgZ2VuZXJhdGVzIG91dGxpbmVkIGZ1bmN0aW9ucy4NCisNCitAc2VjdGlvbiBTRUNfSU5URVJGQUNFUyBMaWJyYXJ5IEludGVyZmFjZXMNCitUaGUgbGlicmFyeSBmdW5jdGlvbnMgdXNlZCBmb3Igc3BlY2lmaWMgcGFydHMgb2YgdGhlIE9wZW5NUFxvdGhlciBsYW5ndWFnZSBpbXBsZW1lbnRhdGlvbg0KK2FyZSBkb2N1bWVudGVkIGluIGRpZmZlcmVudCBtb2R1bGVzLg0KKw0KKyAtIEByZWYgQkFTSUNfVFlQRVMgZnVuZGFtZW50YWwgdHlwZXMgdXNlZCBieSB0aGUgcnVudGltZSBpbiBtYW55IHBsYWNlcw0KKyAtIEByZWYgREVQUkVDQVRFRCAgZnVuY3Rpb25zIHRoYXQgYXJlIGluIHRoZSBsaWJyYXJ5IGJ1dCBhcmUgbm8gbG9uZ2VyIHJlcXVpcmVkDQorIC0gQHJlZiBTVEFSVFVQX1NIVVRET1dOIGZ1bmN0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIGFuZCBmaW5hbGl6aW5nIHRoZSBydW50aW1lDQorIC0gQHJlZiBQQVJBTExFTCBmdW5jdGlvbnMgZm9yIGltcGxlbWVudGluZyBgb21wIHBhcmFsbGVsYA0KKyAtIEByZWYgVEhSRUFEX1NUQVRFUyBmdW5jdGlvbnMgZm9yIHN1cHBvcnRpbmcgdGhyZWFkIHN0YXRlIGlucXVpcmllcw0KKyAtIEByZWYgV09SS19TSEFSSU5HIGZ1bmN0aW9ucyBmb3Igd29yayBzaGFyaW5nIGNvbnN0cnVjdHMgc3VjaCBhcyBgb21wIGZvcmAsIGBvbXAgc2VjdGlvbnNgDQorIC0gQHJlZiBUSFJFQURQUklWQVRFIGZ1bmN0aW9ucyB0byBzdXBwb3J0IHRocmVhZCBwcml2YXRlIGRhdGEsIGNvcHlpbiBldGMNCisgLSBAcmVmIFNZTkNIUk9OSVpBVElPTiBmdW5jdGlvbnMgdG8gc3VwcG9ydCBgb21wIGNyaXRpY2FsYCwgYG9tcCBiYXJyaWVyYCwgYG9tcCBtYXN0ZXJgLCByZWR1Y3Rpb25zIGV0Yw0KKyAtIEByZWYgQVRPTUlDX09QUyBmdW5jdGlvbnMgdG8gc3VwcG9ydCBhdG9taWMgb3BlcmF0aW9ucw0KKyAtIEByZWYgU1RBVFNfR0FUSEVSSU5HIG1hY3JvcyB0byBzdXBwb3J0IGRldmVsb3BlciBwcm9maWxpbmcgb2YgbGlib21wDQorIC0gRG9jdW1lbnRhdGlvbiBvbiB0YXNraW5nIGhhcyBzdGlsbCB0byBiZSB3cml0dGVuLi4uDQorDQorQHNlY3Rpb24gU0VDX0VYQU1QTEVTIEV4YW1wbGVzDQorQHN1YnNlY3Rpb24gU0VDX1dPUktTSEFSSU5HX0VYQU1QTEUgV29yayBTaGFyaW5nIEV4YW1wbGUNCitUaGlzIGV4YW1wbGUgc2hvd3MgdGhlIGNvZGUgZ2VuZXJhdGVkIGZvciBhIHBhcmFsbGVsIGZvciB3aXRoIHJlZHVjdGlvbiBhbmQgZHluYW1pYyBzY2hlZHVsaW5nLg0KKw0KK0Bjb2RlDQorZXh0ZXJuIGZsb2F0IGZvbyggdm9pZCApOw0KKw0KK2ludCBtYWluICgpIHsNCisgICAgaW50IGk7IA0KKyAgICBmbG9hdCByID0gMC4wOyANCisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMpIHJlZHVjdGlvbigrOnIpIA0KKyAgICBmb3IgKCBpID0gMDsgaSA8IDEwOyBpICsrICkgew0KKyAgICAgICAgciArPSBmb28oKTsgDQorICAgIH0NCit9DQorQGVuZGNvZGUNCisNCitUaGUgdHJhbnNmb3JtZWQgY29kZSBsb29rcyBsaWtlIHRoaXMuDQorQGNvZGUNCitleHRlcm4gZmxvYXQgZm9vKCB2b2lkICk7IA0KKw0KK2ludCBtYWluICgpIHsNCisgICAgc3RhdGljIGludCB6ZXJvID0gMDsgDQorICAgIGF1dG8gaW50IGd0aWQ7IA0KKyAgICBhdXRvIGZsb2F0IHIgPSAwLjA7IA0KKyAgICBfX2ttcGNfYmVnaW4oICYgbG9jMywgMCApOyANCisgICAgLy8gVGhlIGd0aWQgaXMgbm90IGFjdHVhbGx5IHJlcXVpcmVkIGluIHRoaXMgZXhhbXBsZSBzbyBjb3VsZCBiZSBvbWl0dGVkOw0KKyAgICAvLyBXZSBzaG93IGl0cyBpbml0aWFsaXphdGlvbiBoZXJlIGJlY2F1c2UgaXQgaXMgb2Z0ZW4gcmVxdWlyZWQgZm9yIGNhbGxzIGludG8NCisgICAgLy8gdGhlIHJ1bnRpbWUgYW5kIHNob3VsZCBiZSBsb2NhbGx5IGNhY2hlZCBsaWtlIHRoaXMuDQorICAgIGd0aWQgPSBfX2ttcGNfZ2xvYmFsIHRocmVhZCBudW0oICYgbG9jMyApOyANCisgICAgX19rbXBjX2ZvcmsgY2FsbCggJiBsb2M3LCAxLCBtYWluXzdfcGFyYWxsZWxfMywgJiByICk7IA0KKyAgICBfX2ttcGNfZW5kKCAmIGxvYzAgKTsgDQorICAgIHJldHVybiAwOyANCit9DQorDQorc3RydWN0IG1haW5fMTBfcmVkdWN0aW9uX3RfNSB7IGZsb2F0IHJfMTBfcnByOyB9OyANCisNCitzdGF0aWMga21wX2NyaXRpY2FsX25hbWUgbGNrID0geyAwIH07DQorc3RhdGljIGlkZW50X3QgbG9jMTA7IC8vIGxvYzEwLmZsYWdzIHNob3VsZCBjb250YWluIEtNUF9JREVOVF9BVE9NSUNfUkVEVUNFIGJpdCBzZXQgDQorICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGNvbXBpbGVyIGhhcyBnZW5lcmF0ZWQgYW4gYXRvbWljIHJlZHVjdGlvbi4NCisNCit2b2lkIG1haW5fN19wYXJhbGxlbF8zKCBpbnQgKmd0aWQsIGludCAqYnRpZCwgZmxvYXQgKnJfN19zaHAgKSB7DQorICAgIGF1dG8gaW50IGlfN19wcjsgDQorICAgIGF1dG8gaW50IGxvd2VyLCB1cHBlciwgbGl0ZXIsIGluY3I7IA0KKyAgICBhdXRvIHN0cnVjdCBtYWluXzEwX3JlZHVjdGlvbl90XzUgcmVkdWNlOyANCisgICAgcmVkdWNlLnJfMTBfcnByID0gMC5GOyANCisgICAgbGl0ZXIgPSAwOyANCisgICAgX19rbXBjX2Rpc3BhdGNoX2luaXRfNCggJiBsb2M3LCpndGlkLCAzNSwgMCwgOSwgMSwgMSApOyANCisgICAgd2hpbGUgKCBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80KCAmIGxvYzcsICpndGlkLCAmIGxpdGVyLCAmIGxvd2VyLCAmIHVwcGVyLCAmIGluY3IgKSApIHsNCisgICAgICAgIGZvciggaV83X3ByID0gbG93ZXI7IHVwcGVyID49IGlfN19wcjsgaV83X3ByICsrICkgDQorICAgICAgICAgIHJlZHVjZS5yXzEwX3JwciArPSBmb28oKTsgDQorICAgIH0NCisgICAgc3dpdGNoKCBfX2ttcGNfcmVkdWNlX25vd2FpdCggJiBsb2MxMCwgKmd0aWQsIDEsIDQsICYgcmVkdWNlLCBtYWluXzEwX3JlZHVjZV81LCAmIGxjayApICkgew0KKyAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgICAgKnJfN19zaHAgKz0gcmVkdWNlLnJfMTBfcnByOw0KKyAgICAgICAgICAgX19rbXBjX2VuZF9yZWR1Y2Vfbm93YWl0KCAmIGxvYzEwLCAqZ3RpZCwgJiBsY2sgKTsNCisgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAyOg0KKyAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkKCAmIGxvYzEwLCAqZ3RpZCwgcl83X3NocCwgcmVkdWNlLnJfMTBfcnByICk7DQorICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6Ow0KKyAgICB9DQorfSANCisNCit2b2lkIG1haW5fMTBfcmVkdWNlXzUoIHN0cnVjdCBtYWluXzEwX3JlZHVjdGlvbl90XzUgKnJlZHVjZV9saHMsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1haW5fMTBfcmVkdWN0aW9uX3RfNSAqcmVkdWNlX3JocyApIA0KK3sgDQorICAgIHJlZHVjZV9saHMtPnJfMTBfcnByICs9IHJlZHVjZV9yaHMtPnJfMTBfcnByOyANCit9DQorQGVuZGNvZGUNCisNCitAZGVmZ3JvdXAgQkFTSUNfVFlQRVMgQmFzaWMgVHlwZXMNCitUeXBlcyB0aGF0IGFyZSB1c2VkIHRocm91Z2hvdXQgdGhlIHJ1bnRpbWUuDQorDQorQGRlZmdyb3VwIERFUFJFQ0FURUQgRGVwcmVjYXRlZCBGdW5jdGlvbnMNCitGdW5jdGlvbnMgaW4gdGhpcyBncm91cCBhcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG9ubHksIGFuZA0KK3Nob3VsZCBub3QgYmUgdXNlZCBpbiBuZXcgY29kZS4NCisNCitAZGVmZ3JvdXAgU1RBUlRVUF9TSFVURE9XTiBTdGFydHVwIGFuZCBTaHV0ZG93bg0KK1RoZXNlIGZ1bmN0aW9ucyBhcmUgZm9yIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gYW5kIHNodXRkb3duLg0KKw0KK0BkZWZncm91cCBQQVJBTExFTCBQYXJhbGxlbCAoZm9yay9qb2luKQ0KK1RoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCBmb3IgaW1wbGVtZW50aW5nIDx0dD5cI3ByYWdtYSBvbXAgcGFyYWxsZWw8L3R0Pi4NCisNCitAZGVmZ3JvdXAgVEhSRUFEX1NUQVRFUyBUaHJlYWQgSW5mb3JtYXRpb24NCitUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHRocmVhZC4NCisNCitAZGVmZ3JvdXAgV09SS19TSEFSSU5HIFdvcmsgU2hhcmluZw0KK1RoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCBmb3IgaW1wbGVtZW50aW5nIA0KKzx0dD5cI3ByYWdtYSBvbXAgZm9yPC90dD4sIDx0dD5cI3ByYWdtYSBvbXAgc2VjdGlvbnM8L3R0PiwgPHR0PlwjcHJhZ21hIG9tcCBzaW5nbGU8L3R0PiBhbmQgDQorPHR0PlwjcHJhZ21hIG9tcCBtYXN0ZXI8L3R0PiBjb25zdHJ1Y3RzLiANCisNCitXaGVuIGhhbmRsaW5nIGxvb3BzLCB0aGVyZSBhcmUgZGlmZmVyZW50IGZ1bmN0aW9ucyBmb3IgZWFjaCBvZiB0aGUgc2lnbmVkIGFuZCB1bnNpZ25lZCAzMiBhbmQgNjQgYml0IGludGVnZXIgdHlwZXMNCit3aGljaCBoYXZlIHRoZSBuYW1lIHN1ZmZpeGVzIGBfNGAsIGBfNHVgLCBgXzhgIGFuZCBgXzh1YC4gVGhlIHNlbWFudGljcyBvZiBlYWNoIG9mIHRoZSBmdW5jdGlvbnMgaXMgdGhlIHNhbWUsDQorc28gdGhleSBhcmUgb25seSBkZXNjcmliZWQgb25jZS4NCisNCitTdGF0aWMgbG9vcCBzY2hlZHVsaW5nIGlzIGhhbmRsZWQgYnkgIEByZWYgX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF80IGFuZCBmcmllbmRzLiBPbmx5IGEgc2luZ2xlIGNhbGwgaXMgbmVlZGVkLA0KK3NpbmNlIHRoZSBpdGVyYXRpb25zIHRvIGJlIGV4ZWN1dGVkIGJ5IGFueSBnaXZlIHRocmVhZCBjYW4gYmUgZGV0ZXJtaW5lZCBhcyBzb29uIGFzIHRoZSBsb29wIHBhcmFtZXRlcnMgYXJlIGtub3duLg0KKw0KK0R5bmFtaWMgc2NoZWR1bGluZyBpcyBoYW5kbGVkIGJ5IHRoZSBAcmVmIF9fa21wY19kaXNwYXRjaF9pbml0XzQgYW5kIEByZWYgX19rbXBjX2Rpc3BhdGNoX25leHRfNCBmdW5jdGlvbnMuIA0KK1RoZSBpbml0IGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGluIGVhY2ggdGhyZWFkIG91dHNpZGUgdGhlIGxvb3AsIHdoaWxlIHRoZSBuZXh0IGZ1bmN0aW9uIGlzIGNhbGxlZCBlYWNoDQordGltZSB0aGF0IHRoZSBwcmV2aW91cyBjaHVuayBvZiB3b3JrIGhhcyBiZWVuIGV4aGF1c3RlZC4gDQorDQorQGRlZmdyb3VwIFNZTkNIUk9OSVpBVElPTiBTeW5jaHJvbml6YXRpb24NCitUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgZm9yIGltcGxlbWVudGluZyBiYXJyaWVycy4NCisNCitAZGVmZ3JvdXAgVEhSRUFEUFJJVkFURSBUaHJlYWQgcHJpdmF0ZSBkYXRhIHN1cHBvcnQNCitUaGVzZSBmdW5jdGlvbnMgc3VwcG9ydCBjb3B5aW4vb3V0IGFuZCB0aHJlYWQgcHJpdmF0ZSBkYXRhLg0KKw0KK0BkZWZncm91cCBTVEFUU19HQVRIRVJJTkcgU3RhdGlzdGljcyBHYXRoZXJpbmcgZnJvbSBPTVBUQg0KK1RoZXNlIG1hY3JvcyBzdXBwb3J0IHByb2ZpbGluZyB0aGUgbGlib21wIGxpYnJhcnkuICBVc2UgLS1zdGF0cz1vbiB3aGVuIGJ1aWxkaW5nIHdpdGggYnVpbGQucGwgdG8gZW5hYmxlDQorYW5kIHRoZW4gdXNlIHRoZSBLTVBfKiBtYWNyb3MgdG8gcHJvZmlsZSAodGhyb3VnaCBjb3VudHMgb3IgY2xvY2sgdGlja3MpIGxpYm9tcCBkdXJpbmcgZXhlY3V0aW9uIG9mIGFuIE9wZW5NUCBwcm9ncmFtLg0KKw0KK0BzZWN0aW9uIHNlY19zdGF0c19lbnZfdmFycyBFbnZpcm9ubWVudCBWYXJpYWJsZXMNCisNCitUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVsZXZhbnQgdG8gc3RhdHMtZ2F0aGVyaW5nIGluIGxpYm9tcA0KKw0KK0Bjb2RlDQorS01QX1NUQVRTX0ZJTEUNCitAZW5kY29kZQ0KK1RoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0IHRvIGFuIG91dHB1dCBmaWxlbmFtZSB0aGF0IHdpbGwgYmUgYXBwZW5kZWQgKk5PVCBPVkVSV1JJVFRFTiogaWYgaXQgZXhpc3RzLiAgSWYgdGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyB1bmRlZmluZWQsIHRoZSBzdGF0aXN0aWNzIHdpbGwgYmUgb3V0cHV0IHRvIHN0ZGVycg0KKw0KK0Bjb2RlDQorS01QX1NUQVRTX1RIUkVBRFMNCitAZW5kY29kZQ0KK1RoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaW5kaWNhdGVzIHRvIHByaW50IHRocmVhZC1zcGVjaWZpYyBzdGF0aXN0aWNzIGFzIHdlbGwgYXMgYWdncmVnYXRlIHN0YXRpc3RpY3MuICBFYWNoIHRocmVhZCdzIHN0YXRpc3RpY3Mgd2lsbCBiZSBzaG93biBhcyB3ZWxsIGFzIHRoZSBjb2xsZWN0aXZlIHN1bSBvZiBhbGwgdGhyZWFkcy4gIFRoZSB2YWx1ZXMgInRydWUiLCAib24iLCAiMSIsICJ5ZXMiIHdpbGwgYWxsIGluZGljYXRlIHRvIHByaW50IHBlciB0aHJlYWQgc3RhdGlzdGljcy4NCisNCitAZGVmZ3JvdXAgVEFTS0lORyBUYXNraW5nIHN1cHBvcnQNCitUaGVzZSBmdW5jdGlvbnMgc3VwcG9ydCB0YXNraW5nIGNvbnN0cnVjdHMuDQorDQorQGRlZmdyb3VwIFVTRVIgVXNlciB2aXNpYmxlIGZ1bmN0aW9ucw0KK1RoZXNlIGZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IHRoZSB1c2VyLCBidXQgYXJlIHJ1bnRpbWUgbGlicmFyeSBzcGVjaWZpYywgcmF0aGVyIHRoYW4gYmVpbmcgT3Blbk1QIGludGVyZmFjZXMuDQorDQorKi8NCisNCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9DTWFrZUxpc3RzLnR4dCBiL2ZpbmFsL3J1bnRpbWUvc3JjL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YjU2ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDMzMiBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIENvbmZpZ3VyZSBvbXAuaCwga21wX2NvbmZpZy5oIGFuZCBvbXB0LmggaWYgbmVjZXNzYXJ5Citjb25maWd1cmVfZmlsZSgke0xJQk9NUF9JTkNfRElSfS9vbXAuaC52YXIgb21wLmggQE9OTFkpCitjb25maWd1cmVfZmlsZShrbXBfY29uZmlnLmguY21ha2Uga21wX2NvbmZpZy5oIEBPTkxZKQoraWYoJHtMSUJPTVBfT01QVF9TVVBQT1JUfSkKKyAgY29uZmlndXJlX2ZpbGUoJHtMSUJPTVBfSU5DX0RJUn0vb21wdC5oLnZhciBvbXB0LmggQE9OTFkpCitlbmRpZigpCisKKyMgR2VuZXJhdGUgbWVzc2FnZSBjYXRhbG9nIGZpbGVzOiBrbXBfaTE4bl9pZC5pbmMgYW5kIGttcF9pMThuX2RlZmF1bHQuaW5jCithZGRfY3VzdG9tX2NvbW1hbmQoCisgIE9VVFBVVCAga21wX2kxOG5faWQuaW5jCisgIENPTU1BTkQgJHtQRVJMX0VYRUNVVEFCTEV9ICR7TElCT01QX1RPT0xTX0RJUn0vbWVzc2FnZS1jb252ZXJ0ZXIucGwgLS1vcz0ke0xJQk9NUF9QRVJMX1NDUklQVF9PU30KKyAgICAtLXByZWZpeD1rbXBfaTE4biAtLWVudW09a21wX2kxOG5faWQuaW5jICR7TElCT01QX1NSQ19ESVJ9L2kxOG4vZW5fVVMudHh0CisgIERFUEVORFMgJHtMSUJPTVBfU1JDX0RJUn0vaTE4bi9lbl9VUy50eHQgJHtMSUJPTVBfVE9PTFNfRElSfS9tZXNzYWdlLWNvbnZlcnRlci5wbAorKQorYWRkX2N1c3RvbV9jb21tYW5kKAorICBPVVRQVVQgIGttcF9pMThuX2RlZmF1bHQuaW5jCisgIENPTU1BTkQgJHtQRVJMX0VYRUNVVEFCTEV9ICR7TElCT01QX1RPT0xTX0RJUn0vbWVzc2FnZS1jb252ZXJ0ZXIucGwgLS1vcz0ke0xJQk9NUF9QRVJMX1NDUklQVF9PU30KKyAgICAtLXByZWZpeD1rbXBfaTE4biAtLWRlZmF1bHQ9a21wX2kxOG5fZGVmYXVsdC5pbmMgJHtMSUJPTVBfU1JDX0RJUn0vaTE4bi9lbl9VUy50eHQKKyAgREVQRU5EUyAke0xJQk9NUF9TUkNfRElSfS9pMThuL2VuX1VTLnR4dCAke0xJQk9NUF9UT09MU19ESVJ9L21lc3NhZ2UtY29udmVydGVyLnBsCispCisKKyMgU2V0IHRoZSAtRCBkZWZpbml0aW9ucyBmb3IgYWxsIHNvdXJjZXMKKyMgVU5JQ09ERSBhbmQgX1VOSUNPREUgYXJlIHNldCBpbiBMTFZNJ3MgQ01ha2Ugc3lzdGVtLiAgVGhleSBhZmZlY3QgdGhlCisjIGl0dG5vdGlmeSBjb2RlIGFuZCBzaG91bGQgb25seSBiZSBzZXQgd2hlbiBjb21waWxpbmcgaXR0bm90aWZ5X3N0YXRpYy5jCisjIG9uIFdpbmRvd3MgKGRvbmUgYmVsb3cpLgorIyBUT0RPOiBGaXggdGhlIFVOSUNPREUgdXNhZ2UgaW4gaXR0bm90aWZ5IGNvZGUgZm9yIFdpbmRvd3MuCityZW1vdmVfZGVmaW5pdGlvbnMoLURVTklDT0RFIC1EX1VOSUNPREUpCitsaWJvbXBfZ2V0X2RlZmluaXRpb25zX2ZsYWdzKExJQk9NUF9DT05GSUdVUkVEX0RFRklOSVRJT05TX0ZMQUdTKQorYWRkX2RlZmluaXRpb25zKCR7TElCT01QX0NPTkZJR1VSRURfREVGSU5JVElPTlNfRkxBR1N9KQorCisjIFNldCB0aGUgLUkgaW5jbHVkZXMgZm9yIGFsbCBzb3VyY2VzCitpbmNsdWRlX2RpcmVjdG9yaWVzKAorICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKyAgJHtMSUJPTVBfU1JDX0RJUn0KKyAgJHtMSUJPTVBfU1JDX0RJUn0vaTE4bgorICAke0xJQk9NUF9JTkNfRElSfQorICAke0xJQk9NUF9TUkNfRElSfS90aGlyZHBhcnR5L2l0dG5vdGlmeQorKQoraWYoJHtMSUJPTVBfVVNFX0hXTE9DfSkKKyAgaW5jbHVkZV9kaXJlY3Rvcmllcygke0xJQk9NUF9IV0xPQ19JTlNUQUxMX0RJUn0vaW5jbHVkZSkKK2VuZGlmKCkKKworIyBHZXR0aW5nIGNvcnJlY3Qgc291cmNlIGZpbGVzIHRvIGJ1aWxkIGxpYnJhcnkKK3NldChMSUJPTVBfQ0ZJTEVTKQorc2V0KExJQk9NUF9DWFhGSUxFUykKK3NldChMSUJPTVBfQVNNRklMRVMpCitpZigke1NUVUJTX0xJQlJBUll9KQorICBzZXQoTElCT01QX0NGSUxFUyBrbXBfc3R1Yi5jcHApCitlbHNlKCkKKyAgIyBHZXQgQysrIGZpbGVzCisgIHNldChMSUJPTVBfQ1hYRklMRVMKKyAgICBrbXBfYWxsb2MuY3BwCisgICAga21wX2F0b21pYy5jcHAKKyAgICBrbXBfY3N1cHBvcnQuY3BwCisgICAga21wX2RlYnVnLmNwcAorICAgIGttcF9pdHQuY3BwCisgICAga21wX2Vudmlyb25tZW50LmNwcAorICAgIGttcF9lcnJvci5jcHAKKyAgICBrbXBfZ2xvYmFsLmNwcAorICAgIGttcF9pMThuLmNwcAorICAgIGttcF9pby5jcHAKKyAgICBrbXBfcnVudGltZS5jcHAKKyAgICBrbXBfc2V0dGluZ3MuY3BwCisgICAga21wX3N0ci5jcHAKKyAgICBrbXBfdGFza2luZy5jcHAKKyAgICBrbXBfdGFza3EuY3BwCisgICAga21wX3RocmVhZHByaXZhdGUuY3BwCisgICAga21wX3V0aWxpdHkuY3BwCisgICAga21wX2JhcnJpZXIuY3BwCisgICAga21wX3dhaXRfcmVsZWFzZS5jcHAKKyAgICBrbXBfYWZmaW5pdHkuY3BwCisgICAga21wX2Rpc3BhdGNoLmNwcAorICAgIGttcF9sb2NrLmNwcAorICAgIGttcF9zY2hlZC5jcHAKKyAgKQorICBpZihXSU4zMikKKyAgICAjIFdpbmRvd3Mgc3BlY2lmaWMgZmlsZXMKKyAgICBsaWJvbXBfYXBwZW5kKExJQk9NUF9DWFhGSUxFUyB6X1dpbmRvd3NfTlRfdXRpbC5jcHApCisgICAgbGlib21wX2FwcGVuZChMSUJPTVBfQ1hYRklMRVMgel9XaW5kb3dzX05ULTU4Nl91dGlsLmNwcCkKKyAgICBsaWJvbXBfYXBwZW5kKExJQk9NUF9BU01GSUxFUyB6X1dpbmRvd3NfTlQtNTg2X2FzbS5hc20pICMgV2luZG93cyBhc3NlbWJseSBmaWxlCisgIGVsc2UoKQorICAgICMgVW5peCBzcGVjaWZpYyBmaWxlcworICAgIGxpYm9tcF9hcHBlbmQoTElCT01QX0NYWEZJTEVTIHpfTGludXhfdXRpbC5jcHApCisgICAgbGlib21wX2FwcGVuZChMSUJPTVBfQ1hYRklMRVMga21wX2dzdXBwb3J0LmNwcCkKKyAgICBsaWJvbXBfYXBwZW5kKExJQk9NUF9BU01GSUxFUyB6X0xpbnV4X2FzbS5TKSAjIFVuaXggYXNzZW1ibHkgZmlsZQorICBlbmRpZigpCisgIGxpYm9tcF9hcHBlbmQoTElCT01QX0NGSUxFUyB0aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfc3RhdGljLmMgTElCT01QX1VTRV9JVFRfTk9USUZZKQorICBsaWJvbXBfYXBwZW5kKExJQk9NUF9DWFhGSUxFUyBrbXBfZGVidWdnZXIuY3BwIExJQk9NUF9VU0VfREVCVUdHRVIpCisgIGxpYm9tcF9hcHBlbmQoTElCT01QX0NYWEZJTEVTIGttcF9zdGF0cy5jcHAgTElCT01QX1NUQVRTKQorICBsaWJvbXBfYXBwZW5kKExJQk9NUF9DWFhGSUxFUyBrbXBfc3RhdHNfdGltaW5nLmNwcCBMSUJPTVBfU1RBVFMpCisgIGlmKCR7TElCT01QX09NUF9WRVJTSU9OfSBHUkVBVEVSIDQwIE9SICR7TElCT01QX09NUF9WRVJTSU9OfSBFUVVBTCA0MCkKKyAgICBsaWJvbXBfYXBwZW5kKExJQk9NUF9DWFhGSUxFUyBrbXBfdGFza2RlcHMuY3BwKQorICAgIGxpYm9tcF9hcHBlbmQoTElCT01QX0NYWEZJTEVTIGttcF9jYW5jZWwuY3BwKQorICBlbmRpZigpCitlbmRpZigpCisjIEZpbGVzIGNvbW1vbiB0byBzdHVicyBhbmQgbm9ybWFsIGxpYnJhcnkKK2xpYm9tcF9hcHBlbmQoTElCT01QX0NYWEZJTEVTIGttcF9mdG5fY2RlY2wuY3BwKQorbGlib21wX2FwcGVuZChMSUJPTVBfQ1hYRklMRVMga21wX2Z0bl9leHRyYS5jcHApCitsaWJvbXBfYXBwZW5kKExJQk9NUF9DWFhGSUxFUyBrbXBfdmVyc2lvbi5jcHApCitsaWJvbXBfYXBwZW5kKExJQk9NUF9DWFhGSUxFUyBvbXB0LWdlbmVyYWwuY3BwIElGX1RSVUUgTElCT01QX09NUFRfU1VQUE9SVCkKK2xpYm9tcF9hcHBlbmQoTElCT01QX0NYWEZJTEVTIHRzYW5fYW5ub3RhdGlvbnMuY3BwIElGX1RSVUUgTElCT01QX1RTQU5fU1VQUE9SVCkKKworc2V0KExJQk9NUF9TT1VSQ0VfRklMRVMgJHtMSUJPTVBfQ0ZJTEVTfSAke0xJQk9NUF9DWFhGSUxFU30gJHtMSUJPTVBfQVNNRklMRVN9KQorIyBGb3IgV2luZG93cywgdGhlcmUgaXMgYSByZXNvdXJjZSBmaWxlICgucmMgLT4gLnJlcykgdGhhdCBpcyBhbHNvIGNvbXBpbGVkCitsaWJvbXBfYXBwZW5kKExJQk9NUF9TT1VSQ0VfRklMRVMgbGlib21wLnJjIFdJTjMyKQorCisjIEdldCBjb21waWxlciBhbmQgYXNzZW1ibGVyIGZsYWdzCitsaWJvbXBfZ2V0X2NmbGFncyhMSUJPTVBfQ09ORklHVVJFRF9DRkxBR1MpCitsaWJvbXBfZ2V0X2N4eGZsYWdzKExJQk9NUF9DT05GSUdVUkVEX0NYWEZMQUdTKQorbGlib21wX2dldF9hc21mbGFncyhMSUJPTVBfQ09ORklHVVJFRF9BU01GTEFHUykKKyMgU2V0IHRoZSBjb21waWxlciBmbGFncyBmb3IgZWFjaCB0eXBlIG9mIHNvdXJjZQorc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKCR7TElCT01QX0NGSUxFU30gUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICIke0xJQk9NUF9DT05GSUdVUkVEX0NGTEFHU30iKQorc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKCR7TElCT01QX0NYWEZJTEVTfSBQUk9QRVJUSUVTIENPTVBJTEVfRkxBR1MgIiR7TElCT01QX0NPTkZJR1VSRURfQ1hYRkxBR1N9IikKK3NldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcygke0xJQk9NUF9BU01GSUxFU30gUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICIke0xJQk9NUF9DT05GSUdVUkVEX0FTTUZMQUdTfSIpCisjIExldCB0aGUgY29tcGlsZXIgaGFuZGxlIHRoZSBhc3NlbWJseSBmaWxlcyBvbiBVbml4LWxpa2Ugc3lzdGVtcworaWYoTk9UIFdJTjMyKQorICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtMSUJPTVBfQVNNRklMRVN9IFBST1BFUlRJRVMgTEFOR1VBR0UgQykKK2VuZGlmKCkKKworIyBSZW1vdmUgYW55IGNtYWtlLWF1dG9tYXRpYyBsaW5raW5nIG9mIHRoZSBzdGFuZGFyZCBDKysgbGlicmFyeS4KKyMgV2UgbmVpdGhlciBuZWVkIChub3Igd2FudCkgdGhlIHN0YW5kYXJkIEMrKyBsaWJyYXJ5IGRlcGVuZGVuY3kgZXZlbiB0aG91Z2ggd2UgY29tcGlsZSBjKysgZmlsZXMuCitpZihOT1QgJHtMSUJPTVBfVVNFX1NURENQUExJQn0pCisgIHNldChMSUJPTVBfTElOS0VSX0xBTkdVQUdFIEMpCisgIHNldChDTUFLRV9DWFhfSU1QTElDSVRfTElOS19MSUJSQVJJRVMpCitlbHNlKCkKKyAgc2V0KExJQk9NUF9MSU5LRVJfTEFOR1VBR0UgQ1hYKQorZW5kaWYoKQorCisjIEFkZCB0aGUgT3Blbk1QIGxpYnJhcnkKK2xpYm9tcF9nZXRfbGRmbGFncyhMSUJPTVBfQ09ORklHVVJFRF9MREZMQUdTKQorCithZGRfbGlicmFyeShvbXAgJHtMSUJPTVBfTElCUkFSWV9LSU5EfSAke0xJQk9NUF9TT1VSQ0VfRklMRVN9KQorCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXMob21wIFBST1BFUlRJRVMKKyAgUFJFRklYICIiIFNVRkZJWCAiIiBPVVRQVVRfTkFNRSAiJHtMSUJPTVBfTElCX0ZJTEV9IgorICBMSU5LX0ZMQUdTICIke0xJQk9NUF9DT05GSUdVUkVEX0xERkxBR1N9IgorICBMSU5LRVJfTEFOR1VBR0UgJHtMSUJPTVBfTElOS0VSX0xBTkdVQUdFfQorKQorCisjIEdldCB0aGUgbGlicmFyeSdzIGxvY2F0aW9uIHdpdGhpbiB0aGUgYnVpbGQgdHJlZSBmb3IgdGhlIHVuaXQgdGVzdGVyCitpZihOT1QgV0lOMzIpCisgIGdldF90YXJnZXRfcHJvcGVydHkoTElCT01QX0xJQlJBUllfRElSIG9tcCBMSUJSQVJZX09VVFBVVF9ESVJFQ1RPUlkpCitlbHNlKCkKKyAgZ2V0X3RhcmdldF9wcm9wZXJ0eShMSUJPTVBfTElCUkFSWV9ESVIgb21wIFJVTlRJTUVfT1VUUFVUX0RJUkVDVE9SWSkKK2VuZGlmKCkKK2lmKE5PVCBMSUJPTVBfTElCUkFSWV9ESVIpCisgIHNldChMSUJPTVBfTElCUkFSWV9ESVIgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9KQorICBzZXQoTElCT01QX0xJQlJBUllfRElSICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSBQQVJFTlRfU0NPUEUpCitlbHNlKCkKKyAgc2V0KExJQk9NUF9MSUJSQVJZX0RJUiAke0xJQk9NUF9MSUJSQVJZX0RJUn0gUEFSRU5UX1NDT1BFKQorZW5kaWYoKQorCisjIEFkZCBzeW1ib2xpYyBsaW5rcyB0byBsaWJvbXAKK2lmKE5PVCBXSU4zMikKKyAgYWRkX2N1c3RvbV9jb21tYW5kKFRBUkdFVCBvbXAgUE9TVF9CVUlMRAorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjcmVhdGVfc3ltbGluayAke0xJQk9NUF9MSUJfRklMRX0KKyAgICAgIGxpYmdvbXAke0xJQk9NUF9MSUJSQVJZX1NVRkZJWH0KKyAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY3JlYXRlX3N5bWxpbmsgJHtMSUJPTVBfTElCX0ZJTEV9CisgICAgICBsaWJpb21wNSR7TElCT01QX0xJQlJBUllfU1VGRklYfQorICAgIFdPUktJTkdfRElSRUNUT1JZICR7TElCT01QX0xJQlJBUllfRElSfQorICApCitlbmRpZigpCisKKyMgTGlua2luZyBjb21tYW5kIHdpbGwgaW5jbHVkZSBsaWJyYXJpZXMgaW4gTElCT01QX0NPTkZJR1VSRURfTElCRkxBR1MKK2xpYm9tcF9nZXRfbGliZmxhZ3MoTElCT01QX0NPTkZJR1VSRURfTElCRkxBR1MpCit0YXJnZXRfbGlua19saWJyYXJpZXMob21wICR7TElCT01QX0NPTkZJR1VSRURfTElCRkxBR1N9ICR7Q01BS0VfRExfTElCU30pCisKKyMgQ3JlYXRlICouaW5jIGJlZm9yZSBjb21waWxpbmcgYW55IHNvdXJjZXMKKyMgb2JqZWN0cyBkZXBlbmQgb24gOiAuaW5jIGZpbGVzCithZGRfY3VzdG9tX3RhcmdldChsaWJvbXAtbmVlZGVkLWhlYWRlcnMgREVQRU5EUyBrbXBfaTE4bl9pZC5pbmMga21wX2kxOG5fZGVmYXVsdC5pbmMpCithZGRfZGVwZW5kZW5jaWVzKG9tcCBsaWJvbXAtbmVlZGVkLWhlYWRlcnMpCisKKyMgV2luZG93cyBzcGVjaWZpYyBidWlsZCBydWxlcworaWYoV0lOMzIpCisgIGNvbmZpZ3VyZV9maWxlKGxpYm9tcC5yYy52YXIgbGlib21wLnJjIEBPTkxZKQorCisgICMgQ3JlYXRlIC5kZWYgYW5kIC5yYyBmaWxlIGJlZm9yZSBjb21waWxpbmcgYW55IHNvdXJjZXMKKyAgYWRkX2N1c3RvbV90YXJnZXQobGlib21wLW5lZWRlZC13aW5kb3dzLWZpbGVzIERFUEVORFMgJHtMSUJPTVBfTElCX05BTUV9LmRlZikKKyAgYWRkX2RlcGVuZGVuY2llcyhvbXAgbGlib21wLW5lZWRlZC13aW5kb3dzLWZpbGVzKQorICAjIHpfV2luZG93c19OVC01ODZfYXNtLmFzbSByZXF1aXJlcyBkZWZpbml0aW9ucyB0byBiZSBzZW50IHZpYSBjb21tYW5kIGxpbmUKKyAgIyBJdCBvbmx5IG5lZWRzIHRoZSBhcmNoaXRlY3V0cmUgbWFjcm8gYW5kIE9NUFRfU1VQUE9SVD0wfDEKKyAgbGlib21wX2FwcGVuZChMSUJPTVBfTUFTTV9ERUZJTklUSU9OUyAiLURfTV9JQTMyIiBJRl9UUlVFIElBMzIpCisgIGxpYm9tcF9hcHBlbmQoTElCT01QX01BU01fREVGSU5JVElPTlMgIi1EX01fQU1ENjQiIElGX1RSVUUgSU5URUw2NCkKKyAgbGlib21wX2FwcGVuZChMSUJPTVBfTUFTTV9ERUZJTklUSU9OUyAiLURPTVBUX1NVUFBPUlQiIElGX1RSVUVfMV8wIExJQk9NUF9PTVBUX1NVUFBPUlQpCisgIGxpYm9tcF9saXN0X3RvX3N0cmluZygiJHtMSUJPTVBfTUFTTV9ERUZJTklUSU9OU30iIExJQk9NUF9NQVNNX0RFRklOSVRJT05TKQorICBzZXRfcHJvcGVydHkoU09VUkNFIHpfV2luZG93c19OVC01ODZfYXNtLmFzbSBBUFBFTkRfU1RSSU5HIFBST1BFUlRZIENPTVBJTEVfRkxBR1MgIiAke0xJQk9NUF9NQVNNX0RFRklOSVRJT05TfSIpCisgIHNldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcyh0aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfc3RhdGljLmMgUFJPUEVSVElFUyBDT01QSUxFX0RFRklOSVRJT05TICJVTklDT0RFIikKKworICAjIENyZWF0ZSBXaW5kb3dzIGltcG9ydCBsaWJyYXJ5CisgICMgdGhlIGltcG9ydCBsaWJyYXJ5IGlzICJyZS1saW5rZWQiIHRvIGluY2x1ZGUga21wX2ltcG9ydC5jcHAgd2hpY2ggcHJldmVudHMKKyAgIyBsaW5raW5nIG9mIGJvdGggVmlzdWFsIFN0dWRpbyBPcGVuTVAgYW5kIG5ld2x5IGJ1aWx0IE9wZW5NUAorICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoa21wX2ltcG9ydC5jcHAgUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICIke0xJQk9NUF9DT05GSUdVUkVEX0NGTEFHU30iKQorICBzZXQoTElCT01QX0lNUF9MSUJfRklMRSAke0xJQk9NUF9MSUJfTkFNRX0ke0NNQUtFX1NUQVRJQ19MSUJSQVJZX1NVRkZJWH0pCisgIHNldChMSUJPTVBfR0VORVJBVEVEX0lNUF9MSUJfRklMRU5BTUUgJHtMSUJPTVBfTElCX0ZJTEV9JHtDTUFLRV9TVEFUSUNfTElCUkFSWV9TVUZGSVh9KQorICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMob21wIFBST1BFUlRJRVMKKyAgICBWRVJTSU9OICR7TElCT01QX1ZFUlNJT05fTUFKT1J9LiR7TElCT01QX1ZFUlNJT05fTUlOT1J9ICMgdXNlcyAvdmVyc2lvbiBmbGFnCisgICAgSU1QT1JUX1BSRUZJWCAiIiBJTVBPUlRfU1VGRklYICIiICMgY29udHJvbCBnZW5lcmF0ZWQgaW1wb3J0IGxpYnJhcnkgbmFtZSB3aGVuIGJ1aWxkaW5nIG9tcAorICAgIEFSQ0hJVkVfT1VUUFVUX05BTUUgJHtMSUJPTVBfR0VORVJBVEVEX0lNUF9MSUJfRklMRU5BTUV9CisgICkKKyAgIyBHZXQgZ2VuZXJhdGVkIGltcG9ydCBsaWJyYXJ5IGZyb20gY3JlYXRpbmcgb21wCisgIGdldF90YXJnZXRfcHJvcGVydHkoTElCT01QX0lNUE9SVF9MSUJfRElSRUNUT1JZIG9tcCBBUkNISVZFX09VVFBVVF9ESVJFQ1RPUlkpCisgIGlmKExJQk9NUF9JTVBPUlRfTElCX0RJUkVDVE9SWSkKKyAgICBzZXQoTElCT01QX0dFTkVSQVRFRF9JTVBfTElCICR7TElCT01QX0lNUE9SVF9MSUJfRElSRUNUT1JZfS8ke0xJQk9NUF9HRU5FUkFURURfSU1QX0xJQl9GSUxFTkFNRX0pCisgIGVsc2UoKQorICAgIHNldChMSUJPTVBfR0VORVJBVEVEX0lNUF9MSUIgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7TElCT01QX0dFTkVSQVRFRF9JTVBfTElCX0ZJTEVOQU1FfSkKKyAgZW5kaWYoKQorICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtMSUJPTVBfR0VORVJBVEVEX0lNUF9MSUJ9IFBST1BFUlRJRVMgR0VORVJBVEVEIFRSVUUgRVhURVJOQUxfT0JKRUNUIFRSVUUpCisgICMgQ3JlYXRlIG5ldyBpbXBvcnQgbGlicmFyeSB0aGF0IGlzIGp1c3QgdGhlIHByZXZpb3VzbHkgY3JlYXRlZCBvbmUgKyBrbXBfaW1wb3J0LmNwcAorICBhZGRfbGlicmFyeShvbXBpbXAgU1RBVElDICR7TElCT01QX0dFTkVSQVRFRF9JTVBfTElCfSBrbXBfaW1wb3J0LmNwcCkKKyAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKG9tcGltcCBQUk9QRVJUSUVTCisgICAgUFJFRklYICIiIFNVRkZJWCAiIiBPVVRQVVRfTkFNRSAiJHtMSUJPTVBfSU1QX0xJQl9GSUxFfSIKKyAgICBMSU5LRVJfTEFOR1VBR0UgQworICApCisgIGFkZF9kZXBlbmRlbmNpZXMob21waW1wIG9tcCkgIyBlbnN1cmUgZ2VuZXJhdGVkIGltcG9ydCBsaWJyYXJ5IGlzIGNyZWF0ZWQgZmlyc3QKKworICAjIENyZWF0ZSBkZWYgZmlsZSB0byBkZXNpZ25hdGUgZXhwb3J0ZWQgZnVuY3Rpb25zCisgIGxpYm9tcF9nZXRfZ2RmbGFncyhMSUJPTVBfR0RGTEFHUykgIyBnZW5lcmF0ZS1kZWYucGwgZmxhZ3MgKFdpbmRvd3Mgb25seSkKKyAgbGlib21wX3N0cmluZ190b19saXN0KCIke0xJQk9NUF9HREZMQUdTfSIgTElCT01QX0dERkxBR1MpCisgIGFkZF9jdXN0b21fY29tbWFuZCgKKyAgICBPVVRQVVQgICR7TElCT01QX0xJQl9OQU1FfS5kZWYKKyAgICBDT01NQU5EICR7UEVSTF9FWEVDVVRBQkxFfSAke0xJQk9NUF9UT09MU19ESVJ9L2dlbmVyYXRlLWRlZi5wbCAke0xJQk9NUF9HREZMQUdTfQorICAgICAgLW8gJHtMSUJPTVBfTElCX05BTUV9LmRlZiAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vZGxsZXhwb3J0cworICAgIERFUEVORFMgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2RsbGV4cG9ydHMgJHtMSUJPTVBfVE9PTFNfRElSfS9nZW5lcmF0ZS1kZWYucGwKKyAgKQorZW5kaWYoKQorCisjIEJ1aWxkaW5nIHRoZSBGb3J0cmFuIG1vZHVsZSBmaWxlcworIyBPbmUgY29tcGlsYXRpb24gc3RlcCBjcmVhdGVzIGJvdGggb21wX2xpYi5tb2QgYW5kIG9tcF9saWJfa2luZHMubW9kCitpZigke0xJQk9NUF9GT1JUUkFOX01PRFVMRVN9KQorICBjb25maWd1cmVfZmlsZSgke0xJQk9NUF9JTkNfRElSfS9vbXBfbGliLmgudmFyIG9tcF9saWIuaCBAT05MWSkKKyAgY29uZmlndXJlX2ZpbGUoJHtMSUJPTVBfSU5DX0RJUn0vb21wX2xpYi5mLnZhciBvbXBfbGliLmYgQE9OTFkpCisgIGNvbmZpZ3VyZV9maWxlKCR7TElCT01QX0lOQ19ESVJ9L29tcF9saWIuZjkwLnZhciBvbXBfbGliLmY5MCBAT05MWSkKKyAgYWRkX2N1c3RvbV90YXJnZXQobGlib21wLW1vZCBBTEwgREVQRU5EUyBvbXBfbGliLm1vZCBvbXBfbGliX2tpbmRzLm1vZCkKKyAgbGlib21wX2dldF9mZmxhZ3MoTElCT01QX0NPTkZJR1VSRURfRkZMQUdTKQorICBpZihDTUFLRV9Gb3J0cmFuX0NPTVBJTEVSX1NVUFBPUlRTX0Y5MCkKKyAgICBzZXQoTElCT01QX0ZPUlRSQU5fU09VUkNFX0ZJTEUgb21wX2xpYi5mOTApCisgIGVsc2UoKQorICAgIHNldChMSUJPTVBfRk9SVFJBTl9TT1VSQ0VfRklMRSBvbXBfbGliLmYpCisgIGVuZGlmKCkKKyAgYWRkX2N1c3RvbV9jb21tYW5kKAorICAgIE9VVFBVVCBvbXBfbGliLm1vZCBvbXBfbGliX2tpbmRzLm1vZAorICAgIENPTU1BTkQgJHtDTUFLRV9Gb3J0cmFuX0NPTVBJTEVSfSAtYyAke0xJQk9NUF9DT05GSUdVUkVEX0ZGTEFHU30gJHtMSUJPTVBfRk9SVFJBTl9TT1VSQ0VfRklMRX0KKyAgICBERVBFTkRTICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8ke0xJQk9NUF9GT1JUUkFOX1NPVVJDRV9GSUxFfQorICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L29tcF9saWIuaAorICApCisgIHNldF9kaXJlY3RvcnlfcHJvcGVydGllcyhQUk9QRVJUSUVTIEFERElUSU9OQUxfTUFLRV9DTEVBTl9GSUxFUyBvbXBfbGliJHtDTUFLRV9DX09VVFBVVF9FWFRFTlNJT059KQorZW5kaWYoKQorCisjIE1vdmUgZmlsZXMgdG8gZXhwb3J0cy8gZGlyZWN0b3J5IGlmIHJlcXVlc3RlZAoraWYoJHtMSUJPTVBfQ09QWV9FWFBPUlRTfSkKKyAgaW5jbHVkZShMaWJvbXBFeHBvcnRzKQorZW5kaWYoKQorCisjIE1pY3JvIHRlc3QgcnVsZXMgZm9yIGFmdGVyIGxpYnJhcnkgaGFzIGJlZW4gYnVpbHQgKGNtYWtlL0xpYm9tcE1pY3JvVGVzdHMuY21ha2UpCitpbmNsdWRlKExpYm9tcE1pY3JvVGVzdHMpCithZGRfY3VzdG9tX3RhcmdldChsaWJvbXAtbWljcm8tdGVzdHMpCitpZihOT1QgJHtNSUN9IEFORCBOT1QgQ01BS0VfQ1JPU1NDT01QSUxJTkcpCisgIGFkZF9kZXBlbmRlbmNpZXMobGlib21wLW1pY3JvLXRlc3RzIGxpYm9tcC10ZXN0LXRvdWNoKQorZW5kaWYoKQoraWYoTk9UIFdJTjMyIEFORCBOT1QgQVBQTEUpCisgIGFkZF9kZXBlbmRlbmNpZXMobGlib21wLW1pY3JvLXRlc3RzIGxpYm9tcC10ZXN0LXJlbG8pCitlbmRpZigpCitpZihOT1QgV0lOMzIgQU5EIE5PVCBBUFBMRSkKKyAgYWRkX2RlcGVuZGVuY2llcyhsaWJvbXAtbWljcm8tdGVzdHMgbGlib21wLXRlc3QtZXhlY3N0YWNrKQorZW5kaWYoKQoraWYoJHtNSUN9KQorICBhZGRfZGVwZW5kZW5jaWVzKGxpYm9tcC1taWNyby10ZXN0cyBsaWJvbXAtdGVzdC1pbnN0cikKK2VuZGlmKCkKK2FkZF9kZXBlbmRlbmNpZXMobGlib21wLW1pY3JvLXRlc3RzIGxpYm9tcC10ZXN0LWRlcHMpCisKKyMgSW5zdGFsbCBydWxlcworIyBXZSB3YW50IHRvIGluc3RhbGwgbGlib21wIGluIERFU1RESVIvQ01BS0VfSU5TVEFMTF9QUkVGSVgvbGliCisjIFdlIHdhbnQgdG8gaW5zdGFsbCBoZWFkZXJzIGluIERFU1RESVIvQ01BS0VfSU5TVEFMTF9QUkVGSVgvaW5jbHVkZQoraWYoJHtMSUJPTVBfU1RBTkRBTE9ORV9CVUlMRH0pCisgIHNldChMSUJPTVBfSEVBREVSU19JTlNUQUxMX1BBVEggaW5jbHVkZSkKK2Vsc2UoKQorICBzdHJpbmcoUkVHRVggTUFUQ0ggIlswLTldK1xcLlswLTldKyhcXC5bMC05XSspPyIgQ0xBTkdfVkVSU0lPTiAke1BBQ0tBR0VfVkVSU0lPTn0pCisgIHNldChMSUJPTVBfSEVBREVSU19JTlNUQUxMX1BBVEggbGliJHtMSUJPTVBfTElCRElSX1NVRkZJWH0vY2xhbmcvJHtDTEFOR19WRVJTSU9OfS9pbmNsdWRlKQorZW5kaWYoKQoraWYoV0lOMzIpCisgIGluc3RhbGwoVEFSR0VUUyBvbXAgUlVOVElNRSBERVNUSU5BVElPTiBiaW4pCisgIGluc3RhbGwoVEFSR0VUUyBvbXBpbXAgQVJDSElWRSBERVNUSU5BVElPTiBsaWIke0xJQk9NUF9MSUJESVJfU1VGRklYfSkKKyAgIyBDcmVhdGUgYWxpYXNlcyAocmVndWxhciBjb3BpZXMpIG9mIHRoZSBsaWJyYXJ5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorICBzZXQoTElCT01QX0FMSUFTRVMgImxpYmlvbXA1bWQiKQorICBmb3JlYWNoKGFsaWFzIElOIExJU1RTIExJQk9NUF9BTElBU0VTKQorICAgIGluc3RhbGwoQ09ERSAiZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgXCJcJHtDTUFLRV9DT01NQU5EfVwiIC1FIGNvcHkgXCIke0xJQk9NUF9MSUJfRklMRX1cIgorICAgICAgXCIke2FsaWFzfSR7TElCT01QX0xJQlJBUllfU1VGRklYfVwiIFdPUktJTkdfRElSRUNUT1JZIFwke0NNQUtFX0lOU1RBTExfUFJFRklYfS9iaW4pIikKKyAgICBpbnN0YWxsKENPREUgImV4ZWN1dGVfcHJvY2VzcyhDT01NQU5EIFwiXCR7Q01BS0VfQ09NTUFORH1cIiAtRSBjb3B5IFwiJHtMSUJPTVBfSU1QX0xJQl9GSUxFfVwiCisgICAgICBcIiR7YWxpYXN9JHtMSUJPTVBfTElCUkFSWV9TVUZGSVh9XCIgV09SS0lOR19ESVJFQ1RPUlkgXCR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9L2xpYiR7TElCT01QX0xJQkRJUl9TVUZGSVh9KSIpCisgIGVuZGZvcmVhY2goKQorZWxzZSgpCisKKyAgaW5zdGFsbChUQVJHRVRTIG9tcCAke0xJQk9NUF9JTlNUQUxMX0tJTkR9IERFU1RJTkFUSU9OIGxpYiR7TElCT01QX0xJQkRJUl9TVUZGSVh9KQorCisgIGlmKCR7TElCT01QX0lOU1RBTExfQUxJQVNFU30pCisgICAgIyBDcmVhdGUgYWxpYXNlcyAoc3ltbGlua3MpIG9mIHRoZSBsaWJyYXJ5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorICAgIHNldChMSUJPTVBfQUxJQVNFUyAibGliZ29tcDtsaWJpb21wNSIpCisgICAgZm9yZWFjaChhbGlhcyBJTiBMSVNUUyBMSUJPTVBfQUxJQVNFUykKKyAgICAgIGluc3RhbGwoQ09ERSAiZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgXCJcJHtDTUFLRV9DT01NQU5EfVwiIC1FIGNyZWF0ZV9zeW1saW5rIFwiJHtMSUJPTVBfTElCX0ZJTEV9XCIKKyAgICAgICAgXCIke2FsaWFzfSR7TElCT01QX0xJQlJBUllfU1VGRklYfVwiIFdPUktJTkdfRElSRUNUT1JZCisgICAgICAgIFwkRU5We0RFU1RESVJ9XCR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9L2xpYiR7TElCT01QX0xJQkRJUl9TVUZGSVh9KSIpCisgICAgZW5kZm9yZWFjaCgpCisgIGVuZGlmKCkKK2VuZGlmKCkKK2luc3RhbGwoCisgIEZJTEVTCisgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9vbXAuaAorICBERVNUSU5BVElPTiAke0xJQk9NUF9IRUFERVJTX0lOU1RBTExfUEFUSH0KKykKK2lmKCR7TElCT01QX09NUFRfU1VQUE9SVH0pCisgIGluc3RhbGwoRklMRVMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L29tcHQuaCBERVNUSU5BVElPTiAke0xJQk9NUF9IRUFERVJTX0lOU1RBTExfUEFUSH0pCitlbmRpZigpCitpZigke0xJQk9NUF9GT1JUUkFOX01PRFVMRVN9KQorICBpbnN0YWxsKEZJTEVTCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L29tcF9saWIuaAorICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9vbXBfbGliLm1vZAorICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9vbXBfbGliX2tpbmRzLm1vZAorICAgIERFU1RJTkFUSU9OICR7TElCT01QX0hFQURFUlNfSU5TVEFMTF9QQVRIfQorICApCitlbmRpZigpCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2RsbGV4cG9ydHMgYi9maW5hbC9ydW50aW1lL3NyYy9kbGxleHBvcnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZGVjMDkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9kbGxleHBvcnRzCkBAIC0wLDAgKzEsMTE4NyBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIERlcHJlY2F0ZWQgZW50cnkgcG9pbnRzIChudW1iZXJzIGFyZSByZXNlcnZlZCk6CistIF9fa21wY19iYXJyaWVyX3JlZHVjZV9tYXN0ZXIgICAgICAgICAgICAgIDEwOQorLSBfX2ttcGNfZW5kX2JhcnJpZXJfcmVkdWNlX21hc3RlciAgICAgICAgICAxMjIKKy0gX19rbXBjX2Zvcl9pbml0XzQgICAgICAgICAgICAgICAgICAgICAgICAgMTMxCistIF9fa21wY19mb3JfaW5pdF84ICAgICAgICAgICAgICAgICAgICAgICAgIDEzMgorLSBfX2ttcGNfZm9yX25leHRfNCAgICAgICAgICAgICAgICAgICAgICAgICAxMzMKKy0gX19rbXBjX2Zvcl9uZXh0XzggICAgICAgICAgICAgICAgICAgICAgICAgMTM0CistIF9fa21wY19mb3JrX2NhbGxfYm91bmQgICAgICAgICAgICAgICAgICAgIDEzOQorLSBfX2ttcGNfcmVkdWNlX21hc3Rlcl9ub3dhaXQgICAgICAgICAgICAgICAxNDkKKy0gX19rbXBjX29tcF90YXNrX2JlZ2luICAgICAgICAgICAgICAgICAgICAgMTk0CistIF9fa21wY19vbXBfdGFza19jb21wbGV0ZSAgICAgICAgICAgICAgICAgIDE5NQorLSBrbXBjX3NoYXJhYmxlX2NhbGxvYyAgICAgICAgICAgICAgICAgICAgICAyMTgKKy0ga21wY19zaGFyYWJsZV9mcmVlICAgICAgICAgICAgICAgICAgICAgICAgMjE5CistIGttcGNfc2hhcmFibGVfbWFsbG9jICAgICAgICAgICAgICAgICAgICAgIDIyMAorLSBrbXBjX3NoYXJhYmxlX3JlYWxsb2MgICAgICAgICAgICAgICAgICAgICAyMjEKKy0ga21wY19hbGlnbmVkX3NoYXJhYmxlX21hbGxvYyAgICAgICAgICAgICAgMjIzCistIG1wYWk0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwMAorLSBtcGFpOGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDEKKy0gbXBhcjRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTAyCistIG1wYXI4YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwMworLSBtcGF4NHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDQKKy0gbXBheDh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTA1CistIG1wb2JhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwNgorLSBtcG9lYnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDcKKy0gbXBvZm9yayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTA4CistIG1wb2ZyayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwOQorLSBtcG9qb2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTAKKy0gbXBveGJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTExCistIG1wcGFkaiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMgorLSBtcHBhZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTMKKy0gbXBwYmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTE0CistIG1wcGJlZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxNQorLSBtcHBkZW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTYKKy0gbXBwZG54ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTE3CistIG1wcGRueGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxOAorLSBtcHBkb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTkKKy0gbXBwZHhvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTIwCistIG1wcGViciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyMQorLSBtcHBlY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MjIKKy0gbXBwZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTIzCistIG1wcGVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyNAorLSBtcHBlbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MjUKKy0gbXBwZXBhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTI2CistIG1wcGVzcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyNworLSBtcHBma2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MjgKKy0gbXBwZmt0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTI5CistIG1wcGZvcmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzMAorLSBtcHBmcmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzEKKy0gbXBwaW9hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTMyCistIG1wcGl3cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzMworLSBtcHBqb2luICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzQKKy0gbXBwbnRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTM1CistIG1wcHBxYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzNgorLSBtcHBwcWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzcKKy0gbXBwcHFzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTM4CistIG1wcHRpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzOQorLSBtcHB0cGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NDAKKy0gbXBwdHBjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQxCistIG1wcHRweiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0MgorLSBtcHB2c3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NDMKKy0gbXBweGJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQ0CistIG1wcHhjcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0NQorLSBtcHB4bXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NDYKKy0gbXBweG5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQ3CistIG1wcHhwYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0OAorLSBtcHB4cHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NDkKKy0gbXBweHNwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTUwCistIG1wcHh0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU1MQorLSBtcHNiYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NTIKKy0gbXBzY3ByICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTk3CistIG1wc2ViciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU1MworLSBtcHNlcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NTQKKy0gbXBzZmQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTU1CistIG1wc2ZkOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU1NgorLSBtcHNpZDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NTcKKy0gbXBzaWQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTU4CistIG1wc25kNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU1OQorLSBtcHNuZDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NjAKKy0gbXBzb250ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTYxCistIG1wc3JlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2MgorLSBtcHN1bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NjMKKy0gbXBzeGJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTY0CistIG1wc3hyZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2NQorLSBtcHRhZGogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NjYKKy0gbXB0YWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTY3CistIG1wdGJhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2OAorLSBtcHRkZW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NjkKKy0gbXB0ZGluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTcwCistIG1wdGRpbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3MQorLSBtcHRkbnggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzIKKy0gbXB0ZG54ZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTczCistIG1wdGRvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3NAorLSBtcHRkeG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzUKKy0gbXB0ZWJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTc2CistIG1wdGVjcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3NworLSBtcHRlbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzgKKy0gbXB0ZW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTc5CistIG1wdGVwYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU4MAorLSBtcHRlc3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODEKKy0gbXB0ZmtkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTgyCistIG1wdHBwYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU4MworLSBtcHRwcGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODQKKy0gbXB0cHBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTg1CistIG1wdHRwYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU4NgorLSBtcHR0cGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODcKKy0gbXB0dHB6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTg4CistIG1wdHZzeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU4OQorLSBtcHR4YnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OTAKKy0gbXB0eGNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTkxCistIG1wdHhtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU5MgorLSBtcHR4bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OTMKKy0gbXB0eHBhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTk0CistIG1wdHhzcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU5NQorLSBtcHBjcHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OTYKKy0gZnRuX3NldF9saWJyYXJ5X2dhbmcgICAgICAgICAgICAgICAgICAgICAgNzM2CistIGttcF9zZXRfbGlicmFyeV9nYW5nCistIGttcF9zaGFyYWJsZV9jYWxsb2MgICAgICAgICAgICAgICAgICAgICAgIDc2MAorLSBrbXBfc2hhcmFibGVfZnJlZSAgICAgICAgICAgICAgICAgICAgICAgICA3NjEKKy0ga21wX3NoYXJhYmxlX21hbGxvYyAgICAgICAgICAgICAgICAgICAgICAgNzYyCistIGttcF9zaGFyYWJsZV9yZWFsbG9jICAgICAgICAgICAgICAgICAgICAgIDc2MworLSBrbXBfYWxpZ25lZF9zaGFyYWJsZV9tYWxsb2MgICAgICAgICAgICAgICA3NjQKKy0ga21wX2RlZmVycmVkX2F0b21pY19hZGRfaTQgICAgICAgICAgICAgICAgNzY1CistIGttcF9kZWZlcnJlZF9hdG9taWNfYWRkX2k4ICAgICAgICAgICAgICAgIDc2NgorLSBrbXBfZGVmZXJyZWRfYXRvbWljX2FkZF9yNCAgICAgICAgICAgICAgICA3NjcKKy0ga21wX2RlZmVycmVkX2F0b21pY19hZGRfcjggICAgICAgICAgICAgICAgNzY4CistIGttcF9sb2NrX2NvbmRfd2FpdCAgICAgICAgICAgICAgICAgICAgICAgIDc3MAorLSBrbXBfbG9ja19jb25kX3NpZ25hbCAgICAgICAgICAgICAgICAgICAgICA3NzEKKy0ga21wX2xvY2tfY29uZF9icm9hZGNhc3QgICAgICAgICAgICAgICAgICAgNzcyCistIGttcF9uZXN0X2xvY2tfY29uZF93YWl0ICAgICAgICAgICAgICAgICAgIDc3MworLSBrbXBfbmVzdF9sb2NrX2NvbmRfc2lnbmFsICAgICAgICAgICAgICAgICA3NzQKKy0ga21wX25lc3RfbG9ja19jb25kX2Jyb2FkY2FzdCAgICAgICAgICAgICAgNzc1CistIGttcF9nZXRfcHJvY2Vzc19udW0gICAgICAgICAgICAgICAgICAgICAgIDc4MQorLSBrbXBfZ2V0X251bV9wcm9jZXNzZXMgICAgICAgICAgICAgICAgICAgICA3ODIKKy0ga21wX2dldF9wcm9jZXNzX3RocmVhZF9udW0gICAgICAgICAgICAgICAgNzgzCistIGttcF9wcml2YXRlX21tYXAgICAgICAgICAgICAgICAgICAgICAgICAgIDc4NCAgICMgbm90IGltcGxlbWVudGVkPworLSBrbXBfc2hhcmFibGVfbW1hcCAgICAgICAgICAgICAgICAgICAgICAgICA3ODUgICAjIG5vdCBpbXBsZW1lbnRlZD8KKy0ga21wX3ByaXZhdGVfbXVubWFwICAgICAgICAgICAgICAgICAgICAgICAgNzg2ICAgIyBub3QgaW1wbGVtZW50ZWQ/CistIGttcF9zaGFyYWJsZV9tdW5tYXAgICAgICAgICAgICAgICAgICAgICAgIDc4NyAgICMgbm90IGltcGxlbWVudGVkPworLSBrbXBfaXNfc2hhcmFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICA3ODggICAjIG5vdCBpbXBsZW1lbnRlZD8KKworJWlmbmRlZiBzdHViCisKKworICAgICMKKyAgICAjIFRoZSBmb2xsb3dpbmcgZW50cnkgcG9pbnRzIGFyZSBhZGRlZCBzbyB0aGF0IHRoZSBiYWNrdHJhY2VzIGZyb20KKyAgICAjIHRoZSB0b29scyBjb250YWluIG1lYW5pbmdmdWwgbmFtZXMgZm9yIGFsbCB0aGUgZnVuY3Rpb25zIHRoYXQgbWlnaHQKKyAgICAjIGFwcGVhciBpbiBhIGJhY2t0cmFjZSBvZiBhIHRocmVhZCB3aGljaCBpcyBibG9ja2VkIGluIHRoZSBSVEwuCisgICAgIworCisgICAgIyBSZWd1bGFyIGVudHJ5IHBvaW50cworICAgICAgICBfX2ttcF93YWl0X3lpZWxkXzQKKyAgICAgICAgX19rbXBfZm9ya19jYWxsCisgICAgICAgIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKyAgICAlaWZkZWYgS01QX1VTRV9NT05JVE9SCisgICAgICAgIF9fa21wX2xhdW5jaF9tb25pdG9yCisgICAgICAgIF9fa21wX3JlYXBfbW9uaXRvcgorICAgICVlbmRpZgorICAgICAgICBfX2ttcF9sYXVuY2hfd29ya2VyCisgICAgICAgIF9fa21wX3JlYXBfd29ya2VyCisgICAgICAgIF9fa21wX2FjcXVpcmVfdGFzX2xvY2sKKyAgICAgICAgX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGFzX2xvY2sKKyAgICAgICAgX19rbXBfYWNxdWlyZV90aWNrZXRfbG9jaworICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF90aWNrZXRfbG9jaworICAgICAgICBfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9jaworICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF9xdWV1aW5nX2xvY2sKKyAgICAgICAgX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrCisgICAgICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX2RyZHBhX2xvY2sKKworICAgICVpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgIyBhbGxvd3MgY29uc29sZSBvdXRwdXQgY2FwYWJpbGl0eSBmb3IgYXBwbGljYXRpb25zIHRob3NlIGRvbid0IGhhdmUgaXQKKyAgICAgICAgX19rbXBfcHJpbnRmCisgICAgJWVuZGlmCisKKworICAgICVpZmRlZiBVU0VfREVCVUdHRVIKKyAgICAgICAgX19rbXBfZGVidWdnaW5nICAgICAgICAgICAgICAgICAgICAgICAgIERBVEEKKyAgICAgICAgX19rbXBfb21wX2RlYnVnX3N0cnVjdF9pbmZvICAgICAgICAgICAgIERBVEEKKyAgICAlZW5kaWYKKworICAgICMgU3ltYm9scyBmb3IgTVMgbXV0dWFsIGRldGVjdGlvbjoKKyAgICBfWW91X211c3RfbGlua193aXRoX2V4YWN0bHlfb25lX09wZW5NUF9saWJyYXJ5ICAgIERBVEEKKyAgICBfWW91X211c3RfbGlua193aXRoX0ludGVsX09wZW5NUF9saWJyYXJ5ICAgICAgICAgIERBVEEKKyAgICAlaWZkZWYgbXN2Y19jb21wYXQKKyAgICAgICAgX1lvdV9tdXN0X2xpbmtfd2l0aF9NaWNyb3NvZnRfT3Blbk1QX2xpYnJhcnkgIERBVEEKKyAgICAlZW5kaWYKKworICAgIF9fa21wX3dhaXRfNjQKKyAgICBfX2ttcF9yZWxlYXNlXzY0CisKKworIyAgICBWVF9nZXR0aGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorIyAgICB2dGd0aGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorCisgICAgX19rbXBjX2F0b21pY180ICAgICAgICAgICAgICAgICAgICAgICAgIDEwMAorICAgIF9fa21wY19hdG9taWNfOCAgICAgICAgICAgICAgICAgICAgICAgICAxMDEKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGQgICAgICAgICAgICAgICAgMTAyCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfYWRkICAgICAgICAgICAgICAgIDEwMworICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZCAgICAgICAgICAgICAgICAxMDQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGQgICAgICAgICAgICAgICAgMTA1CisgICAgX19rbXBjX2JhcnJpZXIgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNgorICAgIF9fa21wY19iYXJyaWVyX21hc3RlciAgICAgICAgICAgICAgICAgICAxMDcKKyAgICBfX2ttcGNfYmFycmllcl9tYXN0ZXJfbm93YWl0ICAgICAgICAgICAgMTA4CisgICAgX19rbXBjX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMAorICAgIF9fa21wY19ib3VuZF9udW1fdGhyZWFkcyAgICAgICAgICAgICAgICAxMTEKKyAgICBfX2ttcGNfYm91bmRfdGhyZWFkX251bSAgICAgICAgICAgICAgICAgMTEyCisgICAgX19rbXBjX2NyaXRpY2FsICAgICAgICAgICAgICAgICAgICAgICAgIDExMworICAgIF9fa21wY19kaXNwYXRjaF9maW5pXzQgICAgICAgICAgICAgICAgICAxMTQKKyAgICBfX2ttcGNfZGlzcGF0Y2hfZmluaV84ICAgICAgICAgICAgICAgICAgMTE1CisgICAgX19rbXBjX2Rpc3BhdGNoX2luaXRfNCAgICAgICAgICAgICAgICAgIDExNgorICAgIF9fa21wY19kaXNwYXRjaF9pbml0XzggICAgICAgICAgICAgICAgICAxMTcKKyAgICBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80ICAgICAgICAgICAgICAgICAgMTE4CisgICAgX19rbXBjX2Rpc3BhdGNoX25leHRfOCAgICAgICAgICAgICAgICAgIDExOQorICAgIF9fa21wY19lbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjAKKyAgICBfX2ttcGNfZW5kX2JhcnJpZXJfbWFzdGVyICAgICAgICAgICAgICAgMTIxCisgICAgX19rbXBjX2VuZF9jcml0aWNhbCAgICAgICAgICAgICAgICAgICAgIDEyMworICAgIF9fa21wY19lbmRfbWFzdGVyICAgICAgICAgICAgICAgICAgICAgICAxMjQKKyAgICBfX2ttcGNfZW5kX29yZGVyZWQgICAgICAgICAgICAgICAgICAgICAgMTI1CisgICAgX19rbXBjX2VuZF9zZXJpYWxpemVkX3BhcmFsbGVsICAgICAgICAgIDEyNgorICAgIF9fa21wY19lbmRfc2luZ2xlICAgICAgICAgICAgICAgICAgICAgICAxMjcKKyAgICBfX2ttcGNfZW5kX3Rhc2txICAgICAgICAgICAgICAgICAgICAgICAgMTI4CisgICAgX19rbXBjX2VuZF90YXNrcV90YXNrICAgICAgICAgICAgICAgICAgIDEyOQorICAgIF9fa21wY19mbHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzAKKyAgICBfX2ttcGNfZm9yX3N0YXRpY19maW5pICAgICAgICAgICAgICAgICAgMTM1CisgICAgX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF80ICAgICAgICAgICAgICAgIDEzNgorICAgIF9fa21wY19mb3Jfc3RhdGljX2luaXRfOCAgICAgICAgICAgICAgICAxMzcKKyAgICBfX2ttcGNfZm9ya19jYWxsICAgICAgICAgICAgICAgICAgICAgICAgMTM4CisgICAgX19rbXBjX2dsb2JhbF9udW1fdGhyZWFkcyAgICAgICAgICAgICAgIDE0MAorICAgIF9fa21wY19nbG9iYWxfdGhyZWFkX251bSAgICAgICAgICAgICAgICAxNDEKKyAgICBfX2ttcGNfaW5fcGFyYWxsZWwgICAgICAgICAgICAgICAgICAgICAgMTQyCisgICAgX19rbXBjX2ludm9rZV90YXNrX2Z1bmMgICAgICAgICAgICAgICAgIDE0MworICAgIF9fa21wY19tYXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQKKyAgICBfX2ttcGNfb2tfdG9fZm9yayAgICAgICAgICAgICAgICAgICAgICAgMTQ1CisgICAgX19rbXBjX29yZGVyZWQgICAgICAgICAgICAgICAgICAgICAgICAgIDE0NgorICAgIF9fa21wY19wb3BfbnVtX3RocmVhZHMgICAgICAgICAgICAgICAgICAxNDcKKyAgICBfX2ttcGNfcHVzaF9udW1fdGhyZWFkcyAgICAgICAgICAgICAgICAgMTQ4CisgICAgX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwgICAgICAgICAgICAgIDE1MAorICAgIF9fa21wY19zaW5nbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTEKKyAgICBfX2ttcGNfdGFzayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUyCisgICAgX19rbXBjX3Rhc2tfYnVmZmVyICAgICAgICAgICAgICAgICAgICAgIDE1MworICAgIF9fa21wY190YXNrcSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTQKKyAgICBfX2ttcGNfdGFza3FfdGFzayAgICAgICAgICAgICAgICAgICAgICAgMTU1CisgICAgX19rbXBjX3RocmVhZHByaXZhdGUgICAgICAgICAgICAgICAgICAgIDE1NgorICAgIF9fa21wY190aHJlYWRwcml2YXRlX2NhY2hlZCAgICAgICAgICAgICAxNTcKKyAgICBfX2ttcGNfdGhyZWFkcHJpdmF0ZV9yZWdpc3RlciAgICAgICAgICAgMTU4CisgICAgX19rbXBjX3RocmVhZHByaXZhdGVfcmVnaXN0ZXJfdmVjICAgICAgIDE1OQorIyAgICBfX2ttcGNfc3NwX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgMTYwCisjICAgIF9fa21wY19zc3BfZm9yayAgICAgICAgICAgICAgICAgICAgICAgICAxNjEKKyMgICAgX19rbXBjX3NzcF9lbmQgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MgorIyAgICBfX2ttcGNfc3NwX3Bvc3RfNCAgICAgICAgICAgICAgICAgICAgICAgMTYzCisjICAgIF9fa21wY19zc3BfcG9zdF84ICAgICAgICAgICAgICAgICAgICAgICAxNjQKKyMgICAgX19rbXBjX3NzcF93YWl0XzQgICAgICAgICAgICAgICAgICAgICAgIDE2NQorIyAgICBfX2ttcGNfc3NwX3dhaXRfOCAgICAgICAgICAgICAgICAgICAgICAgMTY2CisjICAgIF9fa21wY19zc3BfZGlzdGFuY2VfNCAgICAgICAgICAgICAgICAgICAxNjcKKyMgICAgX19rbXBjX3NzcF9kaXN0YW5jZV84ICAgICAgICAgICAgICAgICAgIDE2OAorIyAgICBfX2ttcGNfaW5fc3NwICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY5CisjICAgIF9fa21wY19zc3BfdGhyZWFkX251bSAgICAgICAgICAgICAgICAgICAxNzAKKyMgICAgX19rbXBjX3NzcF9udW1fdGhyZWFkcyAgICAgICAgICAgICAgICAgIDE3MQorICAgIF9fa21wY19jb3B5cHJpdmF0ZSAgICAgICAgICAgICAgICAgICAgICAxNzIKKyMgICAgX19rbXBjX3NzcF9nZXRfbWF4X3RocmVhZHMgICAgICAgICAgICAgIDE3MworIyAgICBfX2ttcGNfc3NwX3NldF9tYXhfdGhyZWFkcyAgICAgICAgICAgICAgMTc0CisgICAgX19rbXBjX2luaXRfbG9jayAgICAgICAgICAgICAgICAgICAgICAgIDE3NQorICAgIF9fa21wY19kZXN0cm95X2xvY2sgICAgICAgICAgICAgICAgICAgICAxNzYKKyAgICBfX2ttcGNfc2V0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAgMTc3CisgICAgX19rbXBjX3Vuc2V0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgIDE3OAorICAgIF9fa21wY190ZXN0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAxNzkKKyAgICBfX2ttcGNfaW5pdF9uZXN0X2xvY2sgICAgICAgICAgICAgICAgICAgMTgwCisgICAgX19rbXBjX2Rlc3Ryb3lfbmVzdF9sb2NrICAgICAgICAgICAgICAgIDE4MQorICAgIF9fa21wY19zZXRfbmVzdF9sb2NrICAgICAgICAgICAgICAgICAgICAxODIKKyAgICBfX2ttcGNfdW5zZXRfbmVzdF9sb2NrICAgICAgICAgICAgICAgICAgMTgzCisgICAgX19rbXBjX3Rlc3RfbmVzdF9sb2NrICAgICAgICAgICAgICAgICAgIDE4NAorIyAgICBfX2ttcGNfc3NwX2luaXRfdGhyZWFkICAgICAgICAgICAgICAgICAgMTg1CisjICAgIF9fa21wY19zc3Bfc2V0X2V2ZW50ICAgICAgICAgICAgICAgICAgICAxODYKKyAgICBfX2ttcGNfcmVkdWNlX25vd2FpdCAgICAgICAgICAgICAgICAgICAgMTg3CisgICAgX19rbXBjX2VuZF9yZWR1Y2Vfbm93YWl0ICAgICAgICAgICAgICAgIDE4OAorICAgIF9fa21wY19yZWR1Y2UgICAgICAgICAgICAgICAgICAgICAgICAgICAxODkKKyAgICBfX2ttcGNfZW5kX3JlZHVjZSAgICAgICAgICAgICAgICAgICAgICAgMTkwCisKKyMgT3Blbk1QIDMuMAorCislaWZkZWYgT01QXzMwCisgICAgX19rbXBjX29tcF90YXNrX2FsbG9jICAgICAgICAgICAgICAgICAgIDE5MQorICAgIF9fa21wY19vbXBfdGFzayAgICAgICAgICAgICAgICAgICAgICAgICAxOTIKKyAgICBfX2ttcGNfb21wX3Rhc2t3YWl0ICAgICAgICAgICAgICAgICAgICAgMTkzCisgICAgX19rbXBjX29tcF90YXNrX2JlZ2luX2lmMCAgICAgICAgICAgICAgIDE5NgorICAgIF9fa21wY19vbXBfdGFza19jb21wbGV0ZV9pZjAgICAgICAgICAgICAxOTcKKyAgICBfX2ttcGNfb21wX3Rhc2tfcGFydHMgICAgICAgICAgICAgICAgICAgMTk4CislZW5kaWYgIyBPTVBfMzAKKworIyAgIF9fb21wX2NvbGxlY3Rvcl9hcGkgICAgICAgICAgICAgICAgICAxOTkKKworICAgICMgVGhlc2UgZnVuY3Rpb25zIGFyZSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gVGhlcmUgaXMgbm8gbmVlZCBpbiBzdGFibGUgb3JkaW5hbCBudW1iZXI6CisgICAgX19rbXBfZ2V0X3JlZHVjZV9tZXRob2QKKworJWVuZGlmICAjIG5vdCBkZWZpbmVkIHN0dWIKKwora21wY19jYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAKK2ttcGNfZnJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAxCislaWZuZGVmIHN0dWIKKyAgICAjIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgZnJvbSBsaWJndWlkZSwgYnV0IGRlY2xhcmVkIG5laXRoZXIgaW4gb21wLmggbm90IGluIG9tcF9saWIuaC4KKyMgICAga21wY19nZXRfYmFubmVyICAgICAgICAgICAgICAgICAgICAgICAgIDIwMgorIyAgICBrbXBjX2dldF9wb29sbW9kZSAgICAgICAgICAgICAgICAgICAgICAgMjAzCisjICAgIGttcGNfZ2V0X3Bvb2xzaXplICAgICAgICAgICAgICAgICAgICAgICAyMDQKKyMgICAga21wY19nZXRfcG9vbHN0YXQgICAgICAgICAgICAgICAgICAgICAgIDIwNQorIyAgICBrbXBjX3Bvb2xwcmludCAgICAgICAgICAgICAgICAgICAgICAgICAgMjA3CisjICAgIGttcGNfcHJpbnRfYmFubmVyICAgICAgICAgICAgICAgICAgICAgICAyMDgKKyMgICAga21wY19zZXRfcG9vbG1vZGUgICAgICAgICAgICAgICAgICAgICAgIDIxNAorIyAgICBrbXBjX3NldF9wb29sc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgMjE1CislZW5kaWYKK2ttcGNfbWFsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA2CitrbXBjX3JlYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwOQora21wY19zZXRfYmxvY2t0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAyMTEKK2ttcGNfc2V0X2xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEyCisjIGttcGNfc2V0X3BhcmFsbGVsX25hbWUgICAgICAgICAgICAgICAgICAgICAgMjEzCitrbXBjX3NldF9zdGFja3NpemUgICAgICAgICAgICAgICAgICAgICAgICAgIDIxNgora21wY19zZXRfc3RhY2tzaXplX3MgICAgICAgICAgICAgICAgICAgICAgICAyMjIKKyMga21wY19zZXRfc3RhdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMTcKK2ttcGNfc2V0X2RlZmF1bHRzICAgICAgICAgICAgICAgICAgICAgICAgICAgMjI0CisKKyMgT01QIDMuMCBlbnRyeSBwb2ludHMgZm9yIHVuc2lnbmVkIGxvb3AgaXRlcmF0aW9uIHZhcmlhYmxlcworJWlmbmRlZiBzdHViCisgICAgJWlmZGVmIE9NUF8zMAorICAgICAgICBfX2ttcGNfZm9yX3N0YXRpY19pbml0Xzh1ICAgICAgICAgICAyMjUKKyAgICAgICAgX19rbXBjX2Rpc3BhdGNoX2luaXRfOHUgICAgICAgICAgICAgMjI2CisgICAgICAgIF9fa21wY19kaXNwYXRjaF9uZXh0Xzh1ICAgICAgICAgICAgIDIyNworICAgICAgICBfX2ttcGNfZGlzcGF0Y2hfZmluaV84dSAgICAgICAgICAgICAyMjgKKyAgICAgICAgX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF80dSAgICAgICAgICAgMjI5CisgICAgICAgIF9fa21wY19kaXNwYXRjaF9pbml0XzR1ICAgICAgICAgICAgIDIzMAorICAgICAgICBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80dSAgICAgICAgICAgICAyMzEKKyAgICAgICAgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfNHUgICAgICAgICAgICAgMjMyCisgICAgJWVuZGlmICMgT01QXzMwCislZW5kaWYKKworJWlmbmRlZiBzdHViCisgICAgX19rbXBjX2dldF90YXNraWQgICAgICAgICAgICAgICAgICAgICAgIDIzMworICAgIF9fa21wY19nZXRfcGFyZW50X3Rhc2tpZCAgICAgICAgICAgICAgICAyMzQKKyVlbmRpZgorCisjIE9wZW5NUCAzLjEgZW50cnkgcG9pbnRzCislaWZuZGVmIHN0dWIKKyAgICAlaWZkZWYgT01QXzMwCisgICAgICAgIF9fa21wY19vbXBfdGFza3lpZWxkICAgICAgICAgICAgICAgIDIzNQorICAgICVlbmRpZiAjIE9NUF8zMAorIyAgICBfX2ttcGNfcGxhY2VfdGhyZWFkcyAgICAgICAgICAgICAgICAgICAgMjM2CislZW5kaWYKKworIyBPcGVuTVAgNC4wIGVudHJ5IHBvaW50cworJWlmbmRlZiBzdHViCisgICAgJWlmZGVmIE9NUF80MAorICAgICAgICBfX2ttcGNfcHVzaF9wcm9jX2JpbmQgICAgICAgICAgICAgICAyMzcKKyAgICAgICAgX19rbXBjX3Rhc2tncm91cCAgICAgICAgICAgICAgICAgICAgMjM4CisgICAgICAgIF9fa21wY19lbmRfdGFza2dyb3VwICAgICAgICAgICAgICAgIDIzOQorICAgICAgICBfX2ttcGNfcHVzaF9udW1fdGVhbXMgICAgICAgICAgICAgICAyNDAKKyAgICAgICAgX19rbXBjX2ZvcmtfdGVhbXMgICAgICAgICAgICAgICAgICAgMjQxCisgICAgICAgIF9fa21wY19vbXBfdGFza193aXRoX2RlcHMgICAgICAgICAgIDI0MgorICAgICAgICBfX2ttcGNfb21wX3dhaXRfZGVwcyAgICAgICAgICAgICAgICAyNDMKKyAgICAgICAgX19rbXBjX2NhbmNlbCAgICAgICAgICAgICAgICAgICAgICAgMjQ0CisgICAgICAgIF9fa21wY19jYW5jZWxsYXRpb25wb2ludCAgICAgICAgICAgIDI0NQorICAgICAgICBfX2ttcGNfY2FuY2VsX2JhcnJpZXIgICAgICAgICAgICAgICAyNDYKKyAgICAgICAgX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0XzQgICAgICAgMjQ3CisgICAgICAgIF9fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdF80dSAgICAgIDI0OAorICAgICAgICBfX2ttcGNfZGlzdF9mb3Jfc3RhdGljX2luaXRfOCAgICAgICAyNDkKKyAgICAgICAgX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0Xzh1ICAgICAgMjUwCisgICAgICAgIF9fa21wY19kaXN0X2Rpc3BhdGNoX2luaXRfNCAgICAgICAgIDI1MQorICAgICAgICBfX2ttcGNfZGlzdF9kaXNwYXRjaF9pbml0XzR1ICAgICAgICAyNTIKKyAgICAgICAgX19rbXBjX2Rpc3RfZGlzcGF0Y2hfaW5pdF84ICAgICAgICAgMjUzCisgICAgICAgIF9fa21wY19kaXN0X2Rpc3BhdGNoX2luaXRfOHUgICAgICAgIDI1NAorICAgICAgICBfX2ttcGNfdGVhbV9zdGF0aWNfaW5pdF80ICAgICAgICAgICAyNTUKKyAgICAgICAgX19rbXBjX3RlYW1fc3RhdGljX2luaXRfNHUgICAgICAgICAgMjU2CisgICAgICAgIF9fa21wY190ZWFtX3N0YXRpY19pbml0XzggICAgICAgICAgIDI1NworICAgICAgICBfX2ttcGNfdGVhbV9zdGF0aWNfaW5pdF84dSAgICAgICAgICAyNTgKKyAgICAlZW5kaWYgIyBPTVBfNDAKKyVlbmRpZgorCisjIE9wZW5NUCA0LjUgZW50cnkgcG9pbnRzCislaWZuZGVmIHN0dWIKKyAgICAlaWZkZWYgT01QXzQ1CisgICAgICAgIF9fa21wY19wcm94eV90YXNrX2NvbXBsZXRlZCAgICAgICAgIDI1OQorICAgICAgICBfX2ttcGNfcHJveHlfdGFza19jb21wbGV0ZWRfb29vICAgICAyNjAKKyAgICAgICAgX19rbXBjX2RvYWNyb3NzX2luaXQgICAgICAgICAgICAgICAgMjYxCisgICAgICAgIF9fa21wY19kb2Fjcm9zc193YWl0ICAgICAgICAgICAgICAgIDI2MgorICAgICAgICBfX2ttcGNfZG9hY3Jvc3NfcG9zdCAgICAgICAgICAgICAgICAyNjMKKyAgICAgICAgX19rbXBjX2RvYWNyb3NzX2ZpbmkgICAgICAgICAgICAgICAgMjY0CisgICAgICAgIF9fa21wY190YXNrbG9vcCAgICAgICAgICAgICAgICAgICAgIDI2NgorICAgICVlbmRpZgorJWVuZGlmCitrbXBjX2FsaWduZWRfbWFsbG9jICAgICAgICAgICAgICAgICAgICAgICAgIDI2NQora21wY19zZXRfZGlzcF9udW1fYnVmZmVycyAgICAgICAgICAgICAgICAgICAyNjcKKworIyBPcGVuTVAgNS4wIGVudHJ5IHBvaW50cworIyBUT0RPOiBjaGFuZ2UgdG8gT01QXzUwIG9uY2UgaXQgaXMgaW1wbGVtZW50ZWQKKyVpZm5kZWYgc3R1YgorICAgICVpZmRlZiBPTVBfNDUKKyAgICAgICAgX19rbXBjX3Rhc2tfcmVkdWN0aW9uX2luaXQgICAgICAgICAgMjY4CisgICAgICAgIF9fa21wY190YXNrX3JlZHVjdGlvbl9nZXRfdGhfZGF0YSAgIDI2OQorICAgICVlbmRpZgorJWVuZGlmCisKKyMgVXNlciBBUEkgZW50cnkgcG9pbnRzIHRoYXQgaGF2ZSBib3RoIGxvd2VyLSBhbmQgdXBwZXItIGNhc2UgdmVyc2lvbnMgZm9yIEZvcnRyYW4uCisjIE51bWJlciBmb3IgbG93ZXJjYXNlIHZlcnNpb24gaXMgaW5kaWNhdGVkLiAgTnVtYmVyIGZvciB1cHBlcmNhc2UgaXMgb2J0YWluZWQgYnkgYWRkaW5nIDEwMDAuCisjIFVzZXIgQVBJIGVudHJ5IHBvaW50cyBhcmUgZW50cnkgcG9pbnRzIHRoYXQgc3RhcnQgd2l0aCAna21wXycgb3IgJ29tcF8nLgorCitvbXBfZGVzdHJveV9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcwMAorb21wX2Rlc3Ryb3lfbmVzdF9sb2NrICAgICAgICAgICAgICAgICAgICAgICA3MDEKK29tcF9nZXRfZHluYW1pYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzAyCitvbXBfZ2V0X21heF90aHJlYWRzICAgICAgICAgICAgICAgICAgICAgICAgIDcwMworb21wX2dldF9uZXN0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MDQKK29tcF9nZXRfbnVtX3Byb2NzICAgICAgICAgICAgICAgICAgICAgICAgICAgNzA1CitvbXBfZ2V0X251bV90aHJlYWRzICAgICAgICAgICAgICAgICAgICAgICAgIDcwNgorb21wX2dldF90aHJlYWRfbnVtICAgICAgICAgICAgICAgICAgICAgICAgICA3MDcKK29tcF9nZXRfd3RpY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzA4CitvbXBfZ2V0X3d0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcwOQorb21wX2luX3BhcmFsbGVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTAKK29tcF9pbml0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzExCitvbXBfaW5pdF9uZXN0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAgIDcxMgorb21wX3NldF9keW5hbWljICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTMKK29tcF9zZXRfbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzE0CitvbXBfc2V0X25lc3RfbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgIDcxNQorb21wX3NldF9uZXN0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTYKK29tcF9zZXRfbnVtX3RocmVhZHMgICAgICAgICAgICAgICAgICAgICAgICAgNzE3CitvbXBfdGVzdF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcxOAorb21wX3Rlc3RfbmVzdF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgICA3MTkKK29tcF91bnNldF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIwCitvbXBfdW5zZXRfbmVzdF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgIDcyMQorCitvbXBjX3NldF9keW5hbWljICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyMgorb21wY19zZXRfbmVzdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MjMKK29tcGNfc2V0X251bV90aHJlYWRzICAgICAgICAgICAgICAgICAgICAgICAgNzI0CisKK2ttcF9jYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzI1CitrbXBfZnJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyNgora21wX2dldF9ibG9ja3RpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICA3MjcKK2ttcF9nZXRfbGlicmFyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzI4CitrbXBfZ2V0X3N0YWNrc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyOQora21wX21hbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MzAKKyNrbXBfcHJpbnRfYmFubmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDczMQora21wX3JlYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MzIKK2ttcF9zZXRfYmxvY2t0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgNzM0CitrbXBfc2V0X2xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDczNQora21wX3NldF9saWJyYXJ5X3NlcmlhbCAgICAgICAgICAgICAgICAgICAgICA3MzcKK2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0ICAgICAgICAgICAgICAgICAgNzM4CitrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCAgICAgICAgICAgICAgICAgIDczOQorIyBrbXBfc2V0X3BhcmFsbGVsX25hbWUgICAgICAgICAgICAgICAgICAgICAgIDc0MAora21wX3NldF9zdGFja3NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICA3NDEKKyMga21wX3NldF9zdGF0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3NDIKK2ttcF9nZXRfbnVtX2tub3duX3RocmVhZHMgICAgICAgICAgICAgICAgICAgNzQzCitrbXBfc2V0X3N0YWNrc2l6ZV9zICAgICAgICAgICAgICAgICAgICAgICAgIDc0NAora21wX2dldF9zdGFja3NpemVfcyAgICAgICAgICAgICAgICAgICAgICAgICA3NDUKK2ttcF9zZXRfZGVmYXVsdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzQ2CitrbXBfYWxpZ25lZF9tYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgIDc0Nwora21wX3NldF93YXJuaW5nc19vbiAgICAgICAgICAgICAgICAgICAgICAgICA3NzkKK2ttcF9zZXRfd2FybmluZ3Nfb2ZmICAgICAgICAgICAgICAgICAgICAgICAgNzgwCisKKyVpZmRlZiBPTVBfMzAKKyAgICBvbXBfZ2V0X2FjdGl2ZV9sZXZlbCAgICAgICAgICAgICAgICAgICAgNzg5CisgICAgb21wX2dldF9sZXZlbCAgICAgICAgICAgICAgICAgICAgICAgICAgIDc5MAorICAgIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSAgICAgICAgICAgICA3OTEKKyAgICBvbXBfZ2V0X3RlYW1fc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgNzkyCisgICAgb21wX2dldF90aHJlYWRfbGltaXQgICAgICAgICAgICAgICAgICAgIDc5MworICAgIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMgICAgICAgICAgICAgICA3OTQKKyAgICBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzICAgICAgICAgICAgICAgNzk1CisgICAgb21wX2dldF9zY2hlZHVsZSAgICAgICAgICAgICAgICAgICAgICAgIDc5NgorICAgIG9tcF9zZXRfc2NoZWR1bGUgICAgICAgICAgICAgICAgICAgICAgICA3OTcKKyAgICBvbXBjX3NldF9tYXhfYWN0aXZlX2xldmVscyAgICAgICAgICAgICAgNzk4CisgICAgb21wY19zZXRfc2NoZWR1bGUgICAgICAgICAgICAgICAgICAgICAgIDc5OQorICAgIG9tcGNfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0gICAgICAgICAgICA4MDAKKyAgICBvbXBjX2dldF90ZWFtX3NpemUgICAgICAgICAgICAgICAgICAgICAgODAxCisgICAga21wX3NldF9hZmZpbml0eSAgICAgICAgICAgICAgICAgICAgICAgIDg1MAorICAgIGttcF9nZXRfYWZmaW5pdHkgICAgICAgICAgICAgICAgICAgICAgICA4NTEKKyAgICBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jICAgICAgICAgICAgICAgODUyCisgICAga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrICAgICAgICAgICAgICAgIDg1MworICAgIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sgICAgICAgICAgICAgICA4NTQKKyAgICBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyAgICAgICAgICAgICAgODU1CisgICAga21wY19zZXRfYWZmaW5pdHlfbWFza19wcm9jICAgICAgICAgICAgIDg1NgorICAgIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MgICAgICAgICAgICA4NTcKKyAgICBrbXBjX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyAgICAgICAgICAgODU4CisgICAga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MgICAgICAgICAgICAgIDg1OQorICAgIGttcGNfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyAgICAgICAgICAgICA4NjAKKyVlbmRpZiAjIE9NUF8zMAorCisjIE9wZW5NUCAzLjEKKworJWlmZGVmIE9NUF8zMAorICAgIG9tcF9pbl9maW5hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NjEKKyVlbmRpZiAjIE9NUF8zMAorCisjIE9wZW5NUCA0MAorCislaWZkZWYgT01QXzQwCisgICAgb21wX2dldF9wcm9jX2JpbmQgICAgICAgICAgICAgICAgICAgICAgIDg2MgorICAgI29tcF9zZXRfcHJvY19iaW5kICAgICAgICAgICAgICAgICAgICAgICA4NjMKKyAgICNvbXBfY3Vycl9wcm9jX2JpbmQgICAgICAgICAgICAgICAgICAgICAgODY0CisgICAgb21wX2dldF9udW1fdGVhbXMgICAgICAgICAgICAgICAgICAgICAgIDg2NQorICAgIG9tcF9nZXRfdGVhbV9udW0gICAgICAgICAgICAgICAgICAgICAgICA4NjYKKyAgICBvbXBfZ2V0X2NhbmNlbGxhdGlvbiAgICAgICAgICAgICAgICAgICAgODY3CisgICAga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzICAgICAgICAgICAgIDg2OAorICAgIG9tcF9pc19pbml0aWFsX2RldmljZSAgICAgICAgICAgICAgICAgICA4NjkKKyAgICBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlICAgICAgICAgICAgICAgICAgODc5CisgICAgb21wX2dldF9kZWZhdWx0X2RldmljZSAgICAgICAgICAgICAgICAgIDg4MAorICAgICVpZmRlZiBzdHViCisgICAgICAgIG9tcF9nZXRfbnVtX2RldmljZXMgICAgICAgICAgICAgICAgIDg4MQorICAgICVlbmRpZgorJWVuZGlmICMgT01QXzQwCisKKyMgT3Blbk1QIDQ1CisKKyVpZmRlZiBPTVBfNDUKKyAgICBvbXBfaW5pdF9sb2NrX3dpdGhfaGludCAgICAgICAgICAgICAgICAgODcwCisgICAgb21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludCAgICAgICAgICAgIDg3MQorICAgIG9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkgICAgICAgICAgICAgICA4NzIKKyAgICBvbXBfZ2V0X251bV9wbGFjZXMgICAgICAgICAgICAgICAgICAgICAgODczCisgICAgb21wX2dldF9wbGFjZV9udW1fcHJvY3MgICAgICAgICAgICAgICAgIDg3NAorICAgIG9tcF9nZXRfcGxhY2VfcHJvY19pZHMgICAgICAgICAgICAgICAgICA4NzUKKyAgICBvbXBfZ2V0X3BsYWNlX251bSAgICAgICAgICAgICAgICAgICAgICAgODc2CisgICAgb21wX2dldF9wYXJ0aXRpb25fbnVtX3BsYWNlcyAgICAgICAgICAgIDg3NworICAgIG9tcF9nZXRfcGFydGl0aW9uX3BsYWNlX251bXMgICAgICAgICAgICA4NzgKKyAgICAlaWZkZWYgc3R1YgorICAgICAgICBvbXBfZ2V0X2luaXRpYWxfZGV2aWNlICAgICAgICAgICAgICA4ODIKKyAgICAgICAgb21wX3RhcmdldF9hbGxvYyAgICAgICAgICAgICAgICAgICAgODgzCisgICAgICAgIG9tcF90YXJnZXRfZnJlZSAgICAgICAgICAgICAgICAgICAgIDg4NAorICAgICAgICBvbXBfdGFyZ2V0X2lzX3ByZXNlbnQgICAgICAgICAgICAgICA4ODUKKyAgICAgICAgb21wX3RhcmdldF9tZW1jcHkgICAgICAgICAgICAgICAgICAgODg2CisgICAgICAgIG9tcF90YXJnZXRfbWVtY3B5X3JlY3QgICAgICAgICAgICAgIDg4NworICAgICAgICBvbXBfdGFyZ2V0X2Fzc29jaWF0ZV9wdHIgICAgICAgICAgICA4ODgKKyAgICAgICAgb21wX3RhcmdldF9kaXNhc3NvY2lhdGVfcHRyICAgICAgICAgODg5CisgICAgJWVuZGlmCislZW5kaWYgIyBPTVBfNDUKKwora21wX3NldF9kaXNwX251bV9idWZmZXJzICAgICAgICAgICAgICAgICAgICA4OTAKKworJWlmbmRlZiBzdHViCisgICAgIyBPcmRpbmFscyBiZXR3ZWVuIDkwMCBhbmQgOTk5IGFyZSByZXNlcnZlZAorCisgICAgIyBPcmRpbmFscyBiZXR3ZWVuIDEwMDAgYW5kIDE5OTkgYXJlIHJlc2VydmVkCisgICAgIyBmb3IgdXNlci1jYWxsYWJsZSB1cHBlcmNhc2UgRm9ydHJhbiBlbnRyaWVzLgorCisKKyAgICAjIEFUT01JQyBlbnRyaWVzCisKKyAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2RpdiAgICAgICAgICAgICAgMjAwMAorICAgICVlbmRpZgorCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfYWRkICAgICAgICAgICAgICAgMjAwMQorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGIgICAgICAgICAgICAgIDIwMDIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXYgICAgICAgICAgICAgICAyMDAzCisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X2RpdiAgICAgICAgICAgICAgMjAwNAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX211bCAgICAgICAgICAgICAgIDIwMDUKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmIgICAgICAgICAgICAgICAyMDA2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hsICAgICAgICAgICAgICAgMjAwNworICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3NociAgICAgICAgICAgICAgIDIwMDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyICAgICAgICAgICAgICAyMDA5CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3ViICAgICAgICAgICAgICAgMjAxMAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3hvciAgICAgICAgICAgICAgIDIwMTEKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FkZCAgICAgICAgICAgICAgIDIwMTIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRiICAgICAgICAgICAgICAyMDEzCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2ICAgICAgICAgICAgICAgMjAxNAorICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXYgICAgICAgICAgICAgIDIwMTUKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWwgICAgICAgICAgICAgICAyMDE2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfb3JiICAgICAgICAgICAgICAgMjAxNworICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3NobCAgICAgICAgICAgICAgIDIwMTgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHIgICAgICAgICAgICAgICAyMDE5CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X3NociAgICAgICAgICAgICAgMjAyMAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1YiAgICAgICAgICAgICAgIDIwMjEKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl94b3IgICAgICAgICAgICAgICAyMDIyCisKKyAgICNfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGQgICAgICAgICAgICMgZGVjbGFyZWQgYWJvdmUgIzEwMgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1YiAgICAgICAgICAgICAgIDIwMjQKKyAgICNfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGQgICAgICAgICAgICMgZGVjbGFyZWQgYWJvdmUgIzEwNAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1YiAgICAgICAgICAgICAgIDIwMjYKKyAgICNfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGQgICAgICAgICAgICMgZGVjbGFyZWQgYWJvdmUgIzEwMworICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1YiAgICAgICAgICAgICAgIDIwMjgKKyAgICNfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGQgICAgICAgICAgICMgZGVjbGFyZWQgYWJvdmUgIzEwNQorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1YiAgICAgICAgICAgICAgIDIwMzAKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGIgICAgICAgICAgICAgIDIwMzEKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXYgICAgICAgICAgICAgICAyMDMyCisgICAgX19rbXBjX2F0b21pY19maXhlZDR1X2RpdiAgICAgICAgICAgICAgMjAzMworICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X211bCAgICAgICAgICAgICAgIDIwMzQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmIgICAgICAgICAgICAgICAyMDM1CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hsICAgICAgICAgICAgICAgMjAzNgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3NociAgICAgICAgICAgICAgIDIwMzcKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyICAgICAgICAgICAgICAyMDM4CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfeG9yICAgICAgICAgICAgICAgMjAzOQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGIgICAgICAgICAgICAgIDIwNDAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXYgICAgICAgICAgICAgICAyMDQxCisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2RpdiAgICAgICAgICAgICAgMjA0MgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X211bCAgICAgICAgICAgICAgIDIwNDMKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmIgICAgICAgICAgICAgICAyMDQ0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hsICAgICAgICAgICAgICAgMjA0NQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NociAgICAgICAgICAgICAgIDIwNDYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyICAgICAgICAgICAgICAyMDQ3CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfeG9yICAgICAgICAgICAgICAgMjA0OAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2RpdiAgICAgICAgICAgICAgIDIwNDkKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWwgICAgICAgICAgICAgICAyMDUwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2ICAgICAgICAgICAgICAgMjA1MQorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X211bCAgICAgICAgICAgICAgIDIwNTIKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGwgICAgICAgICAgICAgIDIwNTMKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmwgICAgICAgICAgICAgICAyMDU0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfYW5kbCAgICAgICAgICAgICAgMjA1NQorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX29ybCAgICAgICAgICAgICAgIDIwNTYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRsICAgICAgICAgICAgICAyMDU3CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfb3JsICAgICAgICAgICAgICAgMjA1OAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGwgICAgICAgICAgICAgIDIwNTkKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmwgICAgICAgICAgICAgICAyMDYwCisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tYXggICAgICAgICAgICAgICAyMDYxCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbWluICAgICAgICAgICAgICAgMjA2MgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21heCAgICAgICAgICAgICAgIDIwNjMKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9taW4gICAgICAgICAgICAgICAyMDY0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbWF4ICAgICAgICAgICAgICAgMjA2NQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X21pbiAgICAgICAgICAgICAgIDIwNjYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tYXggICAgICAgICAgICAgICAyMDY3CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbWluICAgICAgICAgICAgICAgMjA2OAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X21heCAgICAgICAgICAgICAgIDIwNjkKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9taW4gICAgICAgICAgICAgICAyMDcwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbWF4ICAgICAgICAgICAgICAgMjA3MQorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X21pbiAgICAgICAgICAgICAgIDIwNzIKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQxX25lcXYgICAgICAgICAgICAgIDIwNzMKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2ICAgICAgICAgICAgICAyMDc0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbmVxdiAgICAgICAgICAgICAgMjA3NQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X25lcXYgICAgICAgICAgICAgIDIwNzYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9lcXYgICAgICAgICAgICAgICAyMDc3CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZXF2ICAgICAgICAgICAgICAgMjA3OAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2VxdiAgICAgICAgICAgICAgIDIwNzkKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9lcXYgICAgICAgICAgICAgICAyMDgwCisKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkICAgICAgICAgICAgICAyMDgxCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1YiAgICAgICAgICAgICAgMjA4MgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWwgICAgICAgICAgICAgIDIwODMKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2ICAgICAgICAgICAgICAyMDg0CisKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGQgICAgICAgICAgICAgICAyMDg1CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3ViICAgICAgICAgICAgICAgMjA4NgorICAgIF9fa21wY19hdG9taWNfY21wbHg0X211bCAgICAgICAgICAgICAgIDIwODcKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXYgICAgICAgICAgICAgICAyMDg4CisgICAgX19rbXBjX2F0b21pY19jbXBseDhfYWRkICAgICAgICAgICAgICAgMjA4OQorICAgIF9fa21wY19hdG9taWNfY21wbHg4X3N1YiAgICAgICAgICAgICAgIDIwOTAKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWwgICAgICAgICAgICAgICAyMDkxCisgICAgX19rbXBjX2F0b21pY19jbXBseDhfZGl2ICAgICAgICAgICAgICAgMjA5MgorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9hZGQgICAgICAgICAgICAgIDIwOTMKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViICAgICAgICAgICAgICAyMDk0CisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX211bCAgICAgICAgICAgICAgMjA5NQorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXYgICAgICAgICAgICAgIDIwOTYKKyAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2FkZCAgICAgICAgICAgICAgMjA5NworICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWIgICAgICAgICAgICAgIDIwOTgKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsICAgICAgICAgICAgICAyMDk5CisgICAjX19rbXBjX2F0b21pY19jbXBseDE2X2RpdiAgICAgICAgICAgICAgMjAwMCAjIG1vdmVkIHVwIGJlY2F1c2Ugb2YgbWlzdGFrZSBpbiBudW1iZXIgKHN1cHBvc2VkIHRvIGJlIDIxMDApCisKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkICAgICAgICAgICAgICAyMTAxCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1YiAgICAgICAgICAgICAgMjEwMgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWwgICAgICAgICAgICAgIDIxMDMKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2ICAgICAgICAgICAgICAyMTA0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21heCAgICAgICAgICAgICAgMjEwNQorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9taW4gICAgICAgICAgICAgIDIxMDYKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FkZF9mcCAgICAgICAgICAgIDIxMDcKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfZnAgICAgICAgICAgICAyMTA4CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2ZwICAgICAgICAgICAgMjEwOQorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9mcCAgICAgICAgICAgIDIxMTAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2ZwICAgICAgICAgICAyMTExCisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGRfZnAgICAgICAgICAgICAyMTEyCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2ZwICAgICAgICAgICAgMjExMworICAgIF9fa21wY19hdG9taWNfZml4ZWQyX211bF9mcCAgICAgICAgICAgIDIxMTQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfZnAgICAgICAgICAgICAyMTE1CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9mcCAgICAgICAgICAgMjExNgorCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfYWRkX2ZwICAgICAgICAgICAgMjExNworICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9mcCAgICAgICAgICAgIDIxMTgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfZnAgICAgICAgICAgICAyMTE5CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2ZwICAgICAgICAgICAgMjEyMAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfZnAgICAgICAgICAgIDIxMjEKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZF9mcCAgICAgICAgICAgIDIxMjIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfZnAgICAgICAgICAgICAyMTIzCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbXVsX2ZwICAgICAgICAgICAgMjEyNAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9mcCAgICAgICAgICAgIDIxMjUKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X2ZwICAgICAgICAgICAyMTI2CisKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfZnAgICAgICAgICAgICAyMTI3CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2ZwICAgICAgICAgICAgMjEyOAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9mcCAgICAgICAgICAgIDIxMjkKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfZnAgICAgICAgICAgICAyMTMwCisKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfZnAgICAgICAgICAgICAyMTMxCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2ZwICAgICAgICAgICAgMjEzMgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X211bF9mcCAgICAgICAgICAgIDIxMzMKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfZnAgICAgICAgICAgICAyMTM0CisKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkX2ZwICAgICAgICAgICAyMTM1CisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9mcCAgICAgICAgICAgMjEzNgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWxfZnAgICAgICAgICAgIDIxMzcKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2ZwICAgICAgICAgICAyMTM4CisgICAgJWVuZGlmCisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWxfZmxvYXQ4ICAgICAgICAyMTY5CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2Zsb2F0OCAgICAgICAgMjE3MAorCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2Zsb2F0OCAgICAgICAgMjE3NAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9mbG9hdDggICAgICAgIDIxNzUKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9mbG9hdDggICAgICAgIDIxNzkKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfZmxvYXQ4ICAgICAgICAyMTgwCisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfZmxvYXQ4ICAgICAgICAyMTg0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2Zsb2F0OCAgICAgICAgMjE4NQorCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2Zsb2F0OCAgICAgICAgMjE4NworICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9mbG9hdDggICAgICAgIDIxODgKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfZmxvYXQ4ICAgICAgICAyMTg5CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2Zsb2F0OCAgICAgICAgMjE5MAorCisgICAgX19rbXBjX2F0b21pY19jbXBseDRfYWRkX2NtcGx4OCAgICAgICAgMjIzMQorICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jbXBseDggICAgICAgIDIyMzIKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWxfY21wbHg4ICAgICAgICAyMjMzCisgICAgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NtcGx4OCAgICAgICAgMjIzNAorCisgICAgX19rbXBjX2F0b21pY18xICAgICAgICAgICAgICAgICAgICAgICAgMjI0NworICAgIF9fa21wY19hdG9taWNfMiAgICAgICAgICAgICAgICAgICAgICAgIDIyNDgKKyAgICNfX2ttcGNfYXRvbWljXzQgICAgICAgICAgICAgICAgICAgICMgZGVjbGFyZWQgYWJvdmUgIzEwMAorICAgI19fa21wY19hdG9taWNfOCAgICAgICAgICAgICAgICAgICAgIyBkZWNsYXJlZCBhYm92ZSAjMTAxCisgICAgX19rbXBjX2F0b21pY18xMCAgICAgICAgICAgICAgICAgICAgICAgMjI1MQorICAgIF9fa21wY19hdG9taWNfMTYgICAgICAgICAgICAgICAgICAgICAgIDIyNTIKKyAgICBfX2ttcGNfYXRvbWljXzIwICAgICAgICAgICAgICAgICAgICAgICAyMjUzCisgICAgX19rbXBjX2F0b21pY18zMiAgICAgICAgICAgICAgICAgICAgICAgMjI1NAorCisgICAgJWlmZGVmIGFyY2hfMzIKKworICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfYTE2ICAgICAgMjI1NQorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2ExNiAgICAgIDIyNTYKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X211bF9hMTYgICAgICAyMjU3CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2ICAgICAgMjI1OAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4X2ExNiAgICAgIDIyNTkKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21pbl9hMTYgICAgICAyMjYwCisKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2FkZF9hMTYgICAgICAyMjYxCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2ICAgICAgMjI2MgorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2ExNiAgICAgIDIyNjMKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTYgICAgICAyMjY0CisgICAgICAgICVlbmRpZgorCisgICAgJWVuZGlmCisKKyAgICAlaWZuZGVmIGFyY2hfNjQKKworICAgICAgICAjIEFUT01JQyBleHRlbnNpb25zIGZvciBPcGVuTVAgMy4xIHNwZWMgKHg4NiBhbmQgeDY0IG9ubHkpCisKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfcmQgICAgICAgICAgICAgICAgMjI2NQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9yZCAgICAgICAgICAgICAgICAyMjY2CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3JkICAgICAgICAgICAgICAgIDIyNjcKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfcmQgICAgICAgICAgICAgICAgMjI2OAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9yZCAgICAgICAgICAgICAgICAyMjY5CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3JkICAgICAgICAgICAgICAgIDIyNzAKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3JkICAgICAgICAgICAgICAgMjI3MQorICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9yZCAgICAgICAgICAgICAgIDIyNzIKKyAgICAgICAgJWVuZGlmCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg0X3JkICAgICAgICAgICAgICAgIDIyNzMKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDhfcmQgICAgICAgICAgICAgICAgMjI3NAorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfcmQgICAgICAgICAgICAgICAyMjc1CisgICAgICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3JkICAgICAgICAgICAgICAgMjI3NgorICAgICAgICAgICAgJWlmZGVmIGFyY2hfMzIKKyAgICAgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYTE2X3JkICAgICAgIDIyNzcKKyAgICAgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3JkICAgICAgIDIyNzgKKyAgICAgICAgICAgICVlbmRpZgorICAgICAgICAlZW5kaWYKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfd3IgICAgICAgICAgICAgICAgMjI3OQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl93ciAgICAgICAgICAgICAgICAyMjgwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3dyICAgICAgICAgICAgICAgIDIyODEKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfd3IgICAgICAgICAgICAgICAgMjI4MgorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF93ciAgICAgICAgICAgICAgICAyMjgzCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3dyICAgICAgICAgICAgICAgIDIyODQKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3dyICAgICAgICAgICAgICAgMjI4NQorICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl93ciAgICAgICAgICAgICAgIDIyODYKKyAgICAgICAgJWVuZGlmCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg0X3dyICAgICAgICAgICAgICAgIDIyODcKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDhfd3IgICAgICAgICAgICAgICAgMjI4OAorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfd3IgICAgICAgICAgICAgICAyMjg5CisgICAgICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3dyICAgICAgICAgICAgICAgMjI5MAorICAgICAgICAlaWZkZWYgYXJjaF8zMgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2ExNl93ciAgICAgICAyMjkxCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3dyICAgICAgIDIyOTIKKyAgICAgICAgJWVuZGlmCisgICAgICAgICVlbmRpZgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hZGRfY3B0ICAgICAgICAgICAyMjkzCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGJfY3B0ICAgICAgICAgIDIyOTQKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2NwdCAgICAgICAgICAgMjI5NQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2NwdCAgICAgICAgICAyMjk2CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9jcHQgICAgICAgICAgIDIyOTcKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfb3JiX2NwdCAgICAgICAgICAgMjI5OAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGxfY3B0ICAgICAgICAgICAyMjk5CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3Nocl9jcHQgICAgICAgICAgIDIzMDAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDF1X3Nocl9jcHQgICAgICAgICAgMjMwMQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfY3B0ICAgICAgICAgICAyMzAyCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3hvcl9jcHQgICAgICAgICAgIDIzMDMKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfYWRkX2NwdCAgICAgICAgICAgMjMwNAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRiX2NwdCAgICAgICAgICAyMzA1CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9jcHQgICAgICAgICAgIDIzMDYKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9jcHQgICAgICAgICAgMjMwNworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfY3B0ICAgICAgICAgICAyMzA4CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX29yYl9jcHQgICAgICAgICAgIDIzMDkKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hsX2NwdCAgICAgICAgICAgMjMxMAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHJfY3B0ICAgICAgICAgICAyMzExCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHJfY3B0ICAgICAgICAgIDIzMTIKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2NwdCAgICAgICAgICAgMjMxMworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl94b3JfY3B0ICAgICAgICAgICAyMzE0CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZF9jcHQgICAgICAgICAgIDIzMTUKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2NwdCAgICAgICAgICAgMjMxNgorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfY3B0ICAgICAgICAgICAyMzE3CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHQgICAgICAgICAgIDIzMTgKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfYWRkX2NwdCAgICAgICAgICAgMjMxOQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfY3B0ICAgICAgICAgICAyMzIwCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZF9jcHQgICAgICAgICAgIDIzMjEKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdCAgICAgICAgICAgMjMyMgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRiX2NwdCAgICAgICAgICAyMzIzCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9jcHQgICAgICAgICAgIDIzMjQKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9jcHQgICAgICAgICAgMjMyNQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfY3B0ICAgICAgICAgICAyMzI2CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X29yYl9jcHQgICAgICAgICAgIDIzMjcKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hsX2NwdCAgICAgICAgICAgMjMyOAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfY3B0ICAgICAgICAgICAyMzI5CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfY3B0ICAgICAgICAgIDIzMzAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfeG9yX2NwdCAgICAgICAgICAgMjMzMQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRiX2NwdCAgICAgICAgICAyMzMyCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9jcHQgICAgICAgICAgIDIzMzMKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9jcHQgICAgICAgICAgMjMzNAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfY3B0ICAgICAgICAgICAyMzM1CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X29yYl9jcHQgICAgICAgICAgIDIzMzYKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hsX2NwdCAgICAgICAgICAgMjMzNworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfY3B0ICAgICAgICAgICAyMzM4CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfY3B0ICAgICAgICAgIDIzMzkKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfeG9yX2NwdCAgICAgICAgICAgMjM0MAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfY3B0ICAgICAgICAgICAyMzQxCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9jcHQgICAgICAgICAgIDIzNDIKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2NwdCAgICAgICAgICAgMjM0MworICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWxfY3B0ICAgICAgICAgICAyMzQ0CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGxfY3B0ICAgICAgICAgIDIzNDUKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfb3JsX2NwdCAgICAgICAgICAgMjM0NgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRsX2NwdCAgICAgICAgICAyMzQ3CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX29ybF9jcHQgICAgICAgICAgIDIzNDgKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfYW5kbF9jcHQgICAgICAgICAgMjM0OQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmxfY3B0ICAgICAgICAgICAyMzUwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGxfY3B0ICAgICAgICAgIDIzNTEKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfb3JsX2NwdCAgICAgICAgICAgMjM1MgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tYXhfY3B0ICAgICAgICAgICAyMzUzCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX21pbl9jcHQgICAgICAgICAgIDIzNTQKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfbWF4X2NwdCAgICAgICAgICAgMjM1NQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9taW5fY3B0ICAgICAgICAgICAyMzU2CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X21heF9jcHQgICAgICAgICAgIDIzNTcKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfbWluX2NwdCAgICAgICAgICAgMjM1OAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tYXhfY3B0ICAgICAgICAgICAyMzU5CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X21pbl9jcHQgICAgICAgICAgIDIzNjAKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbWF4X2NwdCAgICAgICAgICAgMjM2MQorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9taW5fY3B0ICAgICAgICAgICAyMzYyCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X21heF9jcHQgICAgICAgICAgIDIzNjMKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbWluX2NwdCAgICAgICAgICAgMjM2NAorICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXhfY3B0ICAgICAgICAgIDIzNjUKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21pbl9jcHQgICAgICAgICAgMjM2NgorICAgICAgICAlZW5kaWYKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfbmVxdl9jcHQgICAgICAgICAgMjM2NworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2X2NwdCAgICAgICAgICAyMzY4CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X25lcXZfY3B0ICAgICAgICAgIDIzNjkKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfbmVxdl9jcHQgICAgICAgICAgMjM3MAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9lcXZfY3B0ICAgICAgICAgICAyMzcxCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Vxdl9jcHQgICAgICAgICAgIDIzNzIKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfZXF2X2NwdCAgICAgICAgICAgMjM3MworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9lcXZfY3B0ICAgICAgICAgICAyMzc0CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9hZGRfY3B0ICAgICAgICAgIDIzNzUKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9jcHQgICAgICAgICAgMjM3NgorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsX2NwdCAgICAgICAgICAyMzc3CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfY3B0ICAgICAgICAgIDIzNzgKKyAgICAgICAgJWlmZGVmIEhBVkVfUVVBRAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkX2NwdCAgICAgICAgICAyMzc5CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfY3B0ICAgICAgICAgIDIzODAKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X211bF9jcHQgICAgICAgICAgMjM4MQorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2NwdCAgICAgICAgICAyMzgyCisgICAgICAgICVlbmRpZgorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGRfY3B0ICAgICAgICAgICAyMzgzCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jcHQgICAgICAgICAgIDIzODQKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDRfbXVsX2NwdCAgICAgICAgICAgMjM4NQorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY3B0ICAgICAgICAgICAyMzg2CisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg4X2FkZF9jcHQgICAgICAgICAgIDIzODcKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDhfc3ViX2NwdCAgICAgICAgICAgMjM4OAorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWxfY3B0ICAgICAgICAgICAyMzg5CisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9jcHQgICAgICAgICAgIDIzOTAKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDEwX2FkZF9jcHQgICAgICAgICAgMjM5MQorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViX2NwdCAgICAgICAgICAyMzkyCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9tdWxfY3B0ICAgICAgICAgIDIzOTMKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDEwX2Rpdl9jcHQgICAgICAgICAgMjM5NAorICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfY3B0ICAgICAgICAgIDIzOTUKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9jcHQgICAgICAgICAgMjM5NgorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2NwdCAgICAgICAgICAyMzk3CisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfY3B0ICAgICAgICAgIDIzOTgKKyAgICAgICAgJWVuZGlmCisgICAgICAgI19fa21wY19hdG9taWNfY21wbHg0X2FkZF9jcHRfdG1wICAgICAgICAgICAgMjQwOQorCisgICAgICAgICVpZmRlZiBhcmNoXzMyCisgICAgICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfYTE2X2NwdCAgMjM5OQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTZfY3B0ICAyNDAwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsX2ExNl9jcHQgIDI0MDEKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2X2NwdCAgMjQwMgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21heF9hMTZfY3B0ICAyNDAzCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWluX2ExNl9jcHQgIDI0MDQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfYTE2X2NwdCAgMjQwNQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9hMTZfY3B0ICAyNDA2CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2ExNl9jcHQgIDI0MDcKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfYTE2X2NwdCAgMjQwOAorICAgICAgICAlZW5kaWYKKyAgICAgICAgJWVuZGlmCisKKyAgICAgICAgX19rbXBjX2F0b21pY19zdGFydCAgICAgICAgICAgICAgICAgICAgMjQxMAorICAgICAgICBfX2ttcGNfYXRvbWljX2VuZCAgICAgICAgICAgICAgICAgICAgICAyNDExCisKKyAgICAgICAgJWlmZGVmIEhBVkVfUVVBRAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hZGRfY3B0X2ZwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9jcHRfZnAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2NwdF9mcAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfY3B0X2ZwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9hZGRfY3B0X2ZwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9zdWJfY3B0X2ZwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9tdWxfY3B0X2ZwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfY3B0X2ZwCisKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfYWRkX2NwdF9mcAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfY3B0X2ZwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX211bF9jcHRfZnAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2NwdF9mcAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfYWRkX2NwdF9mcAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc3ViX2NwdF9mcAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfbXVsX2NwdF9mcAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2NwdF9mcAorCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZF9jcHRfZnAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2NwdF9mcAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfY3B0X2ZwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9jcHRfZnAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDR1X2FkZF9jcHRfZnAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDR1X3N1Yl9jcHRfZnAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDR1X211bF9jcHRfZnAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9jcHRfZnAKKworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGRfY3B0X2ZwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9jcHRfZnAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfbXVsX2NwdF9mcAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfY3B0X2ZwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9hZGRfY3B0X2ZwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zdWJfY3B0X2ZwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9tdWxfY3B0X2ZwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfY3B0X2ZwCisKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2NwdF9mcAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfY3B0X2ZwCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9jcHRfZnAKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2NwdF9mcAorCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZF9jcHRfZnAKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdF9mcAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWxfY3B0X2ZwCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9jcHRfZnAKKworICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkX2NwdF9mcAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2NwdF9mcAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsX2NwdF9mcAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2NwdF9mcAorICAgICAgICAlZW5kaWYKKworICAgICAgICAlaWZkZWYgT01QXzQwCisKKyAgICAgICAgICAgICMgQVRPTUlDIGV4dGVuc2lvbnMgZm9yIE9wZW5NUCA0LjAgc3BlYyAoeDg2IGFuZCB4NjQgb25seSkKKworICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3dwICAgICAgICAgICAyNDEyCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zd3AgICAgICAgICAgIDI0MTMKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N3cCAgICAgICAgICAgMjQxNAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfc3dwICAgICAgICAgICAyNDE1CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zd3AgICAgICAgICAgIDI0MTYKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3N3cCAgICAgICAgICAgMjQxNworICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N3cCAgICAgICAgICAyNDE4CisgICAgICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zd3AgICAgICAgIDI0MTkKKyAgICAgICAgICAgICVlbmRpZgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3dwICAgICAgICAgICAyNDIwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9zd3AgICAgICAgICAgIDI0MjEKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9zd3AgICAgICAgICAgMjQyMgorICAgICAgICAgICAgJWlmZGVmIEhBVkVfUVVBRAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N3cCAgICAgICAgICAyNDIzCisKKyAgICAgICAgICAgICVpZmRlZiBhcmNoXzMyCisgICAgICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2ExNl9zd3AgIDI0MjQKKyAgICAgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3N3cCAgMjQyNQorICAgICAgICAgICAgJWVuZGlmCisgICAgICAgICAgICAlZW5kaWYKKworICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2NwdF9yZXYgICAyNDI2CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfY3B0X3JldiAgIDI0MjcKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfY3B0X3JldiAgMjQyOAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hsX2NwdF9yZXYgICAyNDI5CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfY3B0X3JldiAgIDI0MzAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfY3B0X3JldiAgMjQzMQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2NwdF9yZXYgICAyNDMyCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfY3B0X3JldiAgIDI0MzMKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfY3B0X3JldiAgMjQzNAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hsX2NwdF9yZXYgICAyNDM1CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHJfY3B0X3JldiAgIDI0MzYKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHJfY3B0X3JldiAgMjQzNworICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2NwdF9yZXYgICAyNDM4CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfY3B0X3JldiAgIDI0MzkKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfY3B0X3JldiAgMjQ0MAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hsX2NwdF9yZXYgICAyNDQxCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfY3B0X3JldiAgIDI0NDIKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfY3B0X3JldiAgMjQ0MworICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2NwdF9yZXYgICAyNDQ0CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfY3B0X3JldiAgIDI0NDUKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfY3B0X3JldiAgMjQ0NgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hsX2NwdF9yZXYgICAyNDQ3CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfY3B0X3JldiAgIDI0NDgKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfY3B0X3JldiAgMjQ0OQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2NwdF9yZXYgICAyNDUwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfY3B0X3JldiAgIDI0NTEKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9jcHRfcmV2ICAgMjQ1MgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2NwdF9yZXYgICAyNDUzCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2NwdF9yZXYgIDI0NTQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfY3B0X3JldiAgMjQ1NQorICAgICAgICAgICAgJWlmZGVmIEhBVkVfUVVBRAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9jcHRfcmV2ICAyNDU2CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2NwdF9yZXYgIDI0NTcKKyAgICAgICAgICAgICVlbmRpZgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NwdF9yZXYgICAyNDU4CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY3B0X3JldiAgIDI0NTkKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9jcHRfcmV2ICAgMjQ2MAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDhfZGl2X2NwdF9yZXYgICAyNDYxCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViX2NwdF9yZXYgIDI0NjIKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfY3B0X3JldiAgMjQ2MworICAgICAgICAgICAgJWlmZGVmIEhBVkVfUVVBRAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9jcHRfcmV2ICAyNDY0CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2NwdF9yZXYgIDI0NjUKKworICAgICAgICAgICAgJWlmZGVmIGFyY2hfMzIKKyAgICAgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2ExNl9jcHRfcmV2ICAyNDY2CisgICAgICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9hMTZfY3B0X3JldiAgMjQ2NworICAgICAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2X2NwdF9yZXYgIDI0NjgKKyAgICAgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2ExNl9jcHRfcmV2ICAyNDY5CisgICAgICAgICAgICAlZW5kaWYKKyAgICAgICAgICAgICVlbmRpZgorCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfcmV2ICAgMjQ3MAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X3JldiAgIDI0NzEKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfcmV2ICAyNDcyCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGxfcmV2ICAgMjQ3MworICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hyX3JldiAgIDI0NzQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfcmV2ICAyNDc1CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfcmV2ICAgMjQ3NgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X3JldiAgIDI0NzcKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfcmV2ICAyNDc4CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGxfcmV2ICAgMjQ3OQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hyX3JldiAgIDI0ODAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHJfcmV2ICAyNDgxCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfcmV2ICAgMjQ4MgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X3JldiAgIDI0ODMKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfcmV2ICAyNDg0CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGxfcmV2ICAgMjQ4NQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hyX3JldiAgIDI0ODYKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfcmV2ICAyNDg3CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfcmV2ICAgMjQ4OAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X3JldiAgIDI0ODkKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfcmV2ICAyNDkwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaGxfcmV2ICAgMjQ5MQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hyX3JldiAgIDI0OTIKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfcmV2ICAyNDkzCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfcmV2ICAgMjQ5NAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X3JldiAgIDI0OTUKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9yZXYgICAyNDk2CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfcmV2ICAgMjQ5NworICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9yZXYgIDI0OTgKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfcmV2ICAyNDk5CisgICAgICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX3JldiAgMjUwMAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9yZXYgIDI1MDEKKwkgICAgJWVuZGlmCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfcmV2ICAgMjUwMgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X3JldiAgIDI1MDMKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9yZXYgICAyNTA0CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXZfcmV2ICAgMjUwNQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3N1Yl9yZXYgIDI1MDYKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfcmV2ICAyNTA3CisgICAgICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX3JldiAgMjUwOAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9yZXYgIDI1MDkKKyAgICAgICAgICAgICVpZmRlZiBhcmNoXzMyCisgICAgICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTZfcmV2ICAyNTEwCisgICAgICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9hMTZfcmV2ICAyNTExCisgICAgICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9hMTZfcmV2ICAyNTEyCisgICAgICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTZfcmV2ICAyNTEzCisgICAgICAgICAgICAlZW5kaWYKKyAgICAgICAgICAgICVlbmRpZgorCisgICAgICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfcmV2X2ZwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc3ViX3Jldl9mcAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X3Jldl9mcAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9yZXZfZnAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9yZXZfZnAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9zdWJfcmV2X2ZwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfcmV2X2ZwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X3Jldl9mcAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX3Jldl9mcAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDR1X3N1Yl9yZXZfZnAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9yZXZfZnAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfcmV2X2ZwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfcmV2X2ZwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc3ViX3Jldl9mcAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X3Jldl9mcAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9yZXZfZnAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9yZXZfZnAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9yZXZfZnAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9yZXZfZnAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9yZXZfZnAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfcmV2X2ZwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X3Jldl9mcAorCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfY3B0X3Jldl9mcAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDF1X3N1Yl9jcHRfcmV2X2ZwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfY3B0X3Jldl9mcAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9jcHRfcmV2X2ZwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfY3B0X3Jldl9mcAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X3N1Yl9jcHRfcmV2X2ZwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfY3B0X3Jldl9mcAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9jcHRfcmV2X2ZwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfY3B0X3Jldl9mcAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDR1X3N1Yl9jcHRfcmV2X2ZwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfY3B0X3Jldl9mcAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9jcHRfcmV2X2ZwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfY3B0X3Jldl9mcAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDh1X3N1Yl9jcHRfcmV2X2ZwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfY3B0X3Jldl9mcAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9jcHRfcmV2X2ZwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfY3B0X3Jldl9mcAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2NwdF9yZXZfZnAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9jcHRfcmV2X2ZwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfY3B0X3Jldl9mcAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9jcHRfcmV2X2ZwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2NwdF9yZXZfZnAKKyAgICAgICAgICAgICVlbmRpZgorICAgICAgICAlZW5kaWYgICAjIE9NUF80MAorCisKKyAgICAlZW5kaWYgICAjIGFyY2hfNjQKKworICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfYWRkX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X3N1Yl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9tdWxfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfYWRkX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X3N1Yl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9tdWxfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfYWRkX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDR1X3N1Yl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9tdWxfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfYWRkX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X3N1Yl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9tdWxfZnAKKyAgICAlZW5kaWYKKworJWVuZGlmCisKKyMgZW5kIG9mIGZpbGUgIwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvZXhwb3J0c19zby50eHQgYi9maW5hbC9ydW50aW1lL3NyYy9leHBvcnRzX3NvLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWEwNjlmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvZXhwb3J0c19zby50eHQKQEAgLTAsMCArMSwxMzEgQEAKKyMgZXhwb3J0c19zby50eHQgIworCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgVGhpcyBpcyB2ZXJzaW9uIHNjcmlwdCBmb3IgT01QIFJUTCBzaGFyZWQgbGlicmFyeSAobGlib21wKi5zbykKKworVkVSU0lPTiB7CisKKyAgICBnbG9iYWw6ICMgRXhwb3J0ZWQgc3ltYm9scy4KKworICAgICAgICAjCisgICAgICAgICMgIk5vcm1hbCIgc3ltYm9scy4KKyAgICAgICAgIworICAgICAgICBvbXBfKjsgICAgICMgU3RhbmRhcmQgT3Blbk1QIGZ1bmN0aW9ucy4KKworICAgICAgICAjCisgICAgICAgICMgT01QVCBBUEkKKyAgICAgICAgIworICAgICAgICBvbXB0X3Rvb2w7ICAgICAgICAgICAjIE9NUFQgaW5pdGlhbGl6YXRpb24gaW50ZXJmYWNlCisgICAgICAgIG9tcHRfY29udHJvbDsgICAgICAgICMgT01QVCBjb250cm9sIGludGVyZmFjZQorCisgICAgICAgICMgaWNjIGRyb3BzIHdlYWsgYXR0cmlidXRlIGF0IGxpbmtpbmcgc3RlcCB3aXRob3V0IHRoZSBmb2xsb3dpbmcgbGluZToKKyAgICAgICAgQW5ub3RhdGUqOyAgICAgICAgICAgIyBUU0FOIGFubm90YXRpb24KKworICAgICAgICAjCisgICAgICAgICMgT01QVCBzdGF0ZSBwbGFjZWhvbGRlcnMKKyAgICAgICAgIworICAgICAgICBvbXB0X2lkbGU7CisgICAgICAgIG9tcHRfb3ZlcmhlYWQ7CisgICAgICAgIG9tcHRfYmFycmllcl93YWl0OworICAgICAgICBvbXB0X3Rhc2tfd2FpdDsKKyAgICAgICAgb21wdF9tdXRleF93YWl0OworCisgICAgICAgIG9tcGNfKjsgICAgIyBvbXAuaCByZW5hbWVzIHNvbWUgc3RhbmRhcmQgZnVuY3Rpb25zIHRvIG9tcGNfKi4KKyAgICAgICAga21wXyo7ICAgICAjIEludGVsIGV4dGVuc2lvbnMuCisgICAgICAgIGttcGNfKjsgICAgIyBJbnRlbCBleHRlbnNpb25zLgorICAgICAgICBfX2ttcGNfKjsgICMgRnVuY3Rpb25zIGNhbGxlZCBieSBjb21waWxlci1nZW5lcmF0ZWQgY29kZS4KKyAgICAgICAgR09NUF8qOyAgICAjIEdOVSBDIGNvbXBhdGliaWxpdHkgZnVuY3Rpb25zLgorCisgICAgICAgIF9Zb3VfbXVzdF9saW5rX3dpdGhfKjsgICAgICMgTXV0dWFsIGRldGVjdGlvbi9NUyBjb21wYXRpYmlsaXR5IHN5bWJvbHMuCisKKworICAgICAgICAjCisgICAgICAgICMgRGVidWdnZXIgc3VwcG9ydC4KKyAgICAgICAgIworI2lmIFVTRV9ERUJVR0dFUgorICAgICAgICBfX2ttcF9kZWJ1Z2dpbmc7CisgICAgICAgIF9fa21wX29tcF9kZWJ1Z19zdHJ1Y3RfaW5mbzsKKyNlbmRpZiAvKiBVU0VfREVCVUdHRVIgKi8KKworICAgICAgICAjCisgICAgICAgICMgSW50ZXJuYWwgZnVuY3Rpb25zIGV4cG9ydGVkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgorICAgICAgICAjCisgICAgICAgIF9fa21wX2dldF9yZWR1Y2VfbWV0aG9kOworICAgICAgICBfX19rbXBfYWxsb2NhdGU7CisgICAgICAgIF9fX2ttcF9mcmVlOworICAgICAgICBfX2ttcF90aHJlYWRfcG9vbDsKKyAgICAgICAgX19rbXBfdGhyZWFkX3Bvb2xfbnRoOworCisJX19rbXBfcmVzZXRfc3RhdHM7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICMKKyAgICAgICAgIyBJVFQgc3VwcG9ydC4KKyAgICAgICAgIworICAgICAgICAjIFRoZSBmb2xsb3dpbmcgZW50cnkgcG9pbnRzIGFyZSBhZGRlZCBzbyB0aGF0IHRoZSBiYWNrdHJhY2VzIGZyb20KKyAgICAgICAgIyB0aGUgdG9vbHMgY29udGFpbiBtZWFuaW5nZnVsIG5hbWVzIGZvciBhbGwgdGhlIGZ1bmN0aW9ucyB0aGF0IG1pZ2h0CisgICAgICAgICMgYXBwZWFyIGluIGEgYmFja3RyYWNlIG9mIGEgdGhyZWFkIHdoaWNoIGlzIGJsb2NrZWQgaW4gdGhlIFJUTC4KKyAgICAgICAgX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrOworICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF9kcmRwYV9sb2NrOworICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF9xdWV1aW5nX2xvY2s7CisgICAgICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX3Rhc19sb2NrOworICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF90aWNrZXRfbG9jazsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2s7CisgICAgICAgIF9fa21wX2FjcXVpcmVfdGFzX2xvY2s7CisgICAgICAgIF9fa21wX2FjcXVpcmVfdGlja2V0X2xvY2s7CisgICAgICAgIF9fa21wX2ZvcmtfY2FsbDsKKyAgICAgICAgX19rbXBfaW52b2tlX21pY3JvdGFzazsKKyNpZiBLTVBfVVNFX01PTklUT1IKKyAgICAgICAgX19rbXBfbGF1bmNoX21vbml0b3I7CisgICAgICAgIF9fa21wX3JlYXBfbW9uaXRvcjsKKyNlbmRpZgorICAgICAgICBfX2ttcF9sYXVuY2hfd29ya2VyOworICAgICAgICBfX2ttcF9yZWFwX3dvcmtlcjsKKyAgICAgICAgX19rbXBfcmVsZWFzZV82NDsKKyAgICAgICAgX19rbXBfd2FpdF82NDsKKyAgICAgICAgX19rbXBfd2FpdF95aWVsZF80OworCisgICAgICAgICMgaXR0bm90aWZ5IHN5bWJvbHMgdG8gYmUgdXNlZCBieSBkZWJ1Z2dlcgorICAgICAgICBfX2ttcF9pdHRfZmluaV9pdHRsaWI7CisgICAgICAgIF9fa21wX2l0dF9pbml0X2l0dGxpYjsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBsb2NhbDogIyBOb24tZXhwb3J0ZWQgc3ltYm9scy4KKworICAgICAgICAqOyAgICAgICAgICMgQWxsIG90aGVyIHN5bWJvbHMgYXJlIG5vdCBleHBvcnRlZC4KKworfTsgIyBWRVJTSU9OCisKKyMgc2V0cyB1cCBHQ0MgT01QXyB2ZXJzaW9uIGRlcGVuZGVuY3kgY2hhaW4KK09NUF8xLjAgeworfTsKK09NUF8yLjAgeworfSBPTVBfMS4wOworT01QXzMuMCB7Cit9IE9NUF8yLjA7CitPTVBfMy4xIHsKK30gT01QXzMuMDsKK09NUF80LjAgeworfSBPTVBfMy4xOworCisjIHNldHMgdXAgR0NDIEdPTVBfIHZlcnNpb24gZGVwZW5kZW5jeSBjaGFpbgorR09NUF8xLjAgeworfTsKK0dPTVBfMi4wIHsKK30gR09NUF8xLjA7CitHT01QXzMuMCB7Cit9IEdPTVBfMi4wOworR09NUF80LjAgeworfSBHT01QXzMuMDsKKworIyBlbmQgb2YgZmlsZSAjCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9leHRyYWN0RXh0ZXJuYWwuY3BwIGIvZmluYWwvcnVudGltZS9zcmMvZXh0cmFjdEV4dGVybmFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGM0OTAxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvZXh0cmFjdEV4dGVybmFsLmNwcApAQCAtMCwwICsxLDQ4NiBAQAorLyoKKyAqIGV4dHJhY3RFeHRlcm5hbC5jcHAKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3Ryc3RyZWFtPgorCisvKiBHaXZlbiBhIHNldCBvZiBuIG9iamVjdCBmaWxlcyBoICgnZXh0ZXJuYWwnIG9iamVjdCBmaWxlcykgYW5kIGEgc2V0IG9mIG0KKyAgIG9iamVjdCBmaWxlcyBvICgnaW50ZXJuYWwnIG9iamVjdCBmaWxlcyksCisgICAxLiBEZXRlcm1pbmVzIHIsIHRoZSBzdWJzZXQgb2YgaCB0aGF0IG8gZGVwZW5kcyBvbiwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseQorICAgMi4gUmVtb3ZlcyB0aGUgZmlsZXMgaW4gaCAtIHIgZnJvbSB0aGUgZmlsZSBzeXN0ZW0KKyAgIDMuIEZvciBlYWNoIGV4dGVybmFsIHN5bWJvbCBkZWZpbmVkIGluIHNvbWUgZmlsZSBpbiByLCByZW5hbWUgaXQgaW4gciBVIG8KKyAgICAgIGJ5IHByZWZpeGluZyBpdCB3aXRoICJfX2ttcF9leHRlcm5hbF8iCisgICBVc2FnZToKKyAgIGhpZGUuZXhlIDxuPiA8ZmlsZW5hbWVzIGZvciBoPiA8ZmlsZW5hbWVzIGZvciBvPgorCisgICBUaHVzLCB0aGUgcHJlZml4ZWQgc3ltYm9scyBiZWNvbWUgaGlkZGVuIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgbm93IGhhdmUgYQorICAgc3BlY2lhbCBwcmVmaXguCisqLworCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit2b2lkIHN0b3AoY2hhciAqZXJyb3JNc2cpIHsKKyAgcHJpbnRmKCIlc1xuIiwgZXJyb3JNc2cpOworICBleGl0KDEpOworfQorCisvLyBhbiBlbnRyeSBpbiB0aGUgc3ltYm9sIHRhYmxlIG9mIGEgLk9CSiBmaWxlCitjbGFzcyBTeW1ib2wgeworcHVibGljOgorICBfX2ludDY0IG5hbWU7CisgIHVuc2lnbmVkIHZhbHVlOworICB1bnNpZ25lZCBzaG9ydCBzZWN0aW9uTnVtLCB0eXBlOworICBjaGFyIHN0b3JhZ2VDbGFzcywgbkF1eDsKK307CisKK2NsYXNzIF9yc3RyZWFtIDogcHVibGljIGlzdHJzdHJlYW0geworcHJpdmF0ZToKKyAgY29uc3QgY2hhciAqYnVmOworCitwcm90ZWN0ZWQ6CisgIF9yc3RyZWFtKHBhaXI8Y29uc3QgY2hhciAqLCBzdHJlYW1zaXplPiBwKQorICAgICAgOiBpc3Ryc3RyZWFtKHAuZmlyc3QsIHAuc2Vjb25kKSwgYnVmKHAuZmlyc3QpIHt9CisgIH5fcnN0cmVhbSgpIHsgZGVsZXRlW10gYnVmOyB9Cit9OworCisvLyBBIHN0cmVhbSBlbmNhcHVzbGF0aW5nIHRoZSBjb250ZW50IG9mIGEgZmlsZSBvciB0aGUgY29udGVudCBvZiBhIHN0cmluZywKKy8vIG92ZXJyaWRpbmcgdGhlID4+IG9wZXJhdG9yIHRvIHJlYWQgdmFyaW91cyBpbnRlZ2VyIHR5cGVzIGluIGJpbmFyeSBmb3JtLAorLy8gYXMgd2VsbCBhcyBhIHN5bWJvbCB0YWJsZSBlbnRyeS4KK2NsYXNzIHJzdHJlYW0gOiBwdWJsaWMgX3JzdHJlYW0geworcHJpdmF0ZToKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSByc3RyZWFtICZkb1JlYWQoVCAmeCkgeworICAgIHJlYWQoKGNoYXIgKikmeCwgc2l6ZW9mKFQpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgc3RhdGljIHBhaXI8Y29uc3QgY2hhciAqLCBzdHJlYW1zaXplPiBnZXRCdWYoY29uc3QgY2hhciAqZmlsZU5hbWUpIHsKKyAgICBpZnN0cmVhbSByYXcoZmlsZU5hbWUsIGlvczo6YmluYXJ5IHwgaW9zOjppbik7CisgICAgaWYgKCFyYXcuaXNfb3BlbigpKQorICAgICAgc3RvcCgicnN0cmVhbS5nZXRCdWY6IEVycm9yIG9wZW5pbmcgZmlsZSIpOworICAgIHJhdy5zZWVrZygwLCBpb3M6OmVuZCk7CisgICAgc3RyZWFtcG9zIGZpbGVTaXplID0gcmF3LnRlbGxnKCk7CisgICAgaWYgKGZpbGVTaXplIDwgMCkKKyAgICAgIHN0b3AoInJzdHJlYW0uZ2V0QnVmOiBFcnJvciByZWFkaW5nIGZpbGUiKTsKKyAgICBjaGFyICpidWYgPSBuZXcgY2hhcltmaWxlU2l6ZV07CisgICAgcmF3LnNlZWtnKDAsIGlvczo6YmVnKTsKKyAgICByYXcucmVhZChidWYsIGZpbGVTaXplKTsKKyAgICByZXR1cm4gcGFpcjxjb25zdCBjaGFyICosIHN0cmVhbXNpemU+KGJ1ZiwgZmlsZVNpemUpOworICB9CisKK3B1YmxpYzoKKyAgLy8gY29uc3RydWN0IGZyb20gYSBzdHJpbmcKKyAgcnN0cmVhbShjb25zdCBjaGFyICpidWYsIHN0cmVhbXNpemUgc2l6ZSkKKyAgICAgIDogX3JzdHJlYW0ocGFpcjxjb25zdCBjaGFyICosIHN0cmVhbXNpemU+KGJ1Ziwgc2l6ZSkpIHt9CisgIC8vIGNvbnN0cnVjdCBmcm9tIGEgZmlsZSB3aG9sZSBjb250ZW50IGlzIGZ1bGx5IHJlYWQgb25jZSB0byBpbml0aWFsaXplIHRoZQorICAvLyBjb250ZW50IG9mIHRoaXMgc3RyZWFtCisgIHJzdHJlYW0oY29uc3QgY2hhciAqZmlsZU5hbWUpIDogX3JzdHJlYW0oZ2V0QnVmKGZpbGVOYW1lKSkge30KKyAgcnN0cmVhbSAmb3BlcmF0b3I+PihpbnQgJngpIHsgcmV0dXJuIGRvUmVhZCh4KTsgfQorICByc3RyZWFtICZvcGVyYXRvcj4+KHVuc2lnbmVkICZ4KSB7IHJldHVybiBkb1JlYWQoeCk7IH0KKyAgcnN0cmVhbSAmb3BlcmF0b3I+PihzaG9ydCAmeCkgeyByZXR1cm4gZG9SZWFkKHgpOyB9CisgIHJzdHJlYW0gJm9wZXJhdG9yPj4odW5zaWduZWQgc2hvcnQgJngpIHsgcmV0dXJuIGRvUmVhZCh4KTsgfQorICByc3RyZWFtICZvcGVyYXRvcj4+KFN5bWJvbCAmZSkgeworICAgIHJlYWQoKGNoYXIgKikmZSwgMTgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorfTsKKworLy8gc3RyaW5nIHRhYmxlIGluIGEgLk9CSiBmaWxlCitjbGFzcyBTdHJpbmdUYWJsZSB7Citwcml2YXRlOgorICBtYXA8c3RyaW5nLCB1bnNpZ25lZD4gZGlyZWN0b3J5OworICBzaXplX3QgbGVuZ3RoOworICBjaGFyICpkYXRhOworCisgIC8vIG1ha2UgPGRpcmVjdG9yeT4gZnJvbSA8bGVuZ3RoPiBieXRlcyBpbiA8ZGF0YT4KKyAgdm9pZCBtYWtlRGlyZWN0b3J5KHZvaWQpIHsKKyAgICB1bnNpZ25lZCBpID0gNDsKKyAgICB3aGlsZSAoaSA8IGxlbmd0aCkgeworICAgICAgc3RyaW5nIHMgPSBzdHJpbmcoZGF0YSArIGkpOworICAgICAgZGlyZWN0b3J5Lmluc2VydChtYWtlX3BhaXIocywgaSkpOworICAgICAgaSArPSBzLnNpemUoKSArIDE7CisgICAgfQorICB9CisgIC8vIGluaXRpYWxpemUgPGxlbmd0aD4gYW5kIDxkYXRhPiB3aXRoIGNvbnRlbnRzIHNwZWNpZmllZCBieSB0aGUgYXJndW1lbnRzCisgIHZvaWQgaW5pdChjb25zdCBjaGFyICpfZGF0YSkgeworICAgIHVuc2lnbmVkIF9sZW5ndGggPSAqKHVuc2lnbmVkICopX2RhdGE7CisKKyAgICBpZiAoX2xlbmd0aCA8IHNpemVvZih1bnNpZ25lZCkgfHwgX2xlbmd0aCAhPSAqKHVuc2lnbmVkICopX2RhdGEpCisgICAgICBzdG9wKCJTdHJpbmdUYWJsZS5pbml0OiBJbnZhbGlkIHN5bWJvbCB0YWJsZSIpOworICAgIGlmIChfZGF0YVtfbGVuZ3RoIC0gMV0pIHsKKyAgICAgIC8vIHRvIHByZXZlbnQgcnVuYXdheSBzdHJpbmdzLCBtYWtlIHN1cmUgdGhlIGRhdGEgZW5kcyB3aXRoIGEgemVybworICAgICAgZGF0YSA9IG5ldyBjaGFyW2xlbmd0aCA9IF9sZW5ndGggKyAxXTsKKyAgICAgIGRhdGFbX2xlbmd0aF0gPSAwOworICAgIH0gZWxzZSB7CisgICAgICBkYXRhID0gbmV3IGNoYXJbbGVuZ3RoID0gX2xlbmd0aF07CisgICAgfQorICAgICoodW5zaWduZWQgKilkYXRhID0gbGVuZ3RoOworICAgIEtNUF9NRU1DUFkoZGF0YSArIHNpemVvZih1bnNpZ25lZCksIF9kYXRhICsgc2l6ZW9mKHVuc2lnbmVkKSwKKyAgICAgICAgICAgICAgIGxlbmd0aCAtIHNpemVvZih1bnNpZ25lZCkpOworICAgIG1ha2VEaXJlY3RvcnkoKTsKKyAgfQorCitwdWJsaWM6CisgIFN0cmluZ1RhYmxlKHJzdHJlYW0gJmYpIHsKKyAgICAvLyBDb25zdHJ1Y3Qgc3RyaW5nIHRhYmxlIGJ5IHJlYWRpbmcgZnJvbSBmLgorICAgIHN0cmVhbXBvcyBzOworICAgIHVuc2lnbmVkIHN0clNpemU7CisgICAgY2hhciAqc3RyRGF0YTsKKworICAgIHMgPSBmLnRlbGxnKCk7CisgICAgZiA+PiBzdHJTaXplOworICAgIGlmIChzdHJTaXplIDwgc2l6ZW9mKHVuc2lnbmVkKSkKKyAgICAgIHN0b3AoIlN0cmluZ1RhYmxlOiBJbnZhbGlkIHN0cmluZyB0YWJsZSIpOworICAgIHN0ckRhdGEgPSBuZXcgY2hhcltzdHJTaXplXTsKKyAgICAqKHVuc2lnbmVkICopc3RyRGF0YSA9IHN0clNpemU7CisgICAgLy8gcmVhZCB0aGUgcmF3IGRhdGEgaW50byA8c3RyRGF0YT4KKyAgICBmLnJlYWQoc3RyRGF0YSArIHNpemVvZih1bnNpZ25lZCksIHN0clNpemUgLSBzaXplb2YodW5zaWduZWQpKTsKKyAgICBzID0gZi50ZWxsZygpIC0gczsKKyAgICBpZiAocyA8IHN0clNpemUpCisgICAgICBzdG9wKCJTdHJpbmdUYWJsZTogVW5leHBlY3RlZCBFT0YiKTsKKyAgICBpbml0KHN0ckRhdGEpOworICAgIGRlbGV0ZVtdIHN0ckRhdGE7CisgIH0KKyAgU3RyaW5nVGFibGUoY29uc3Qgc2V0PHN0cmluZz4gJnN0cmluZ3MpIHsKKyAgICAvLyBDb25zdHJ1Y3Qgc3RyaW5nIHRhYmxlIGZyb20gZ2l2ZW4gc3RyaW5ncy4KKyAgICBjaGFyICpwOworICAgIHNldDxzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdDsKKyAgICBzaXplX3QgczsKKworICAgIC8vIGNvdW50IHJlcXVpcmVkIHNpemUgZm9yIGRhdGEKKyAgICBmb3IgKGxlbmd0aCA9IHNpemVvZih1bnNpZ25lZCksIGl0ID0gc3RyaW5ncy5iZWdpbigpOyBpdCAhPSBzdHJpbmdzLmVuZCgpOworICAgICAgICAgKytpdCkgeworICAgICAgc2l6ZV90IGwgPSAoKml0KS5zaXplKCk7CisKKyAgICAgIGlmIChsID4gKHVuc2lnbmVkKTB4RkZGRkZGRkYpCisgICAgICAgIHN0b3AoIlN0cmluZ1RhYmxlOiBTdHJpbmcgdG9vIGxvbmciKTsKKyAgICAgIGlmIChsID4gOCkgeworICAgICAgICBsZW5ndGggKz0gbCArIDE7CisgICAgICAgIGlmIChsZW5ndGggPiAodW5zaWduZWQpMHhGRkZGRkZGRikKKyAgICAgICAgICBzdG9wKCJTdHJpbmdUYWJsZTogU3ltYm9sIHRhYmxlIHRvbyBsb25nIik7CisgICAgICB9CisgICAgfQorICAgIGRhdGEgPSBuZXcgY2hhcltsZW5ndGhdOworICAgICoodW5zaWduZWQgKilkYXRhID0gbGVuZ3RoOworICAgIC8vIHBvcHVsYXRlIGRhdGEgYW5kIGRpcmVjdG9yeQorICAgIGZvciAocCA9IGRhdGEgKyBzaXplb2YodW5zaWduZWQpLCBpdCA9IHN0cmluZ3MuYmVnaW4oKTsgaXQgIT0gc3RyaW5ncy5lbmQoKTsKKyAgICAgICAgICsraXQpIHsKKyAgICAgIGNvbnN0IHN0cmluZyAmc3RyID0gKml0OworICAgICAgc2l6ZV90IGwgPSBzdHIuc2l6ZSgpOworICAgICAgaWYgKGwgPiA4KSB7CisgICAgICAgIGRpcmVjdG9yeS5pbnNlcnQobWFrZV9wYWlyKHN0ciwgcCAtIGRhdGEpKTsKKyAgICAgICAgS01QX01FTUNQWShwLCBzdHIuY19zdHIoKSwgbCk7CisgICAgICAgIHBbbF0gPSAwOworICAgICAgICBwICs9IGwgKyAxOworICAgICAgfQorICAgIH0KKyAgfQorICB+U3RyaW5nVGFibGUoKSB7IGRlbGV0ZVtdIGRhdGE7IH0KKyAgLy8gUmV0dXJucyBlbmNvZGluZyBmb3IgZ2l2ZW4gc3RyaW5nIGJhc2VkIG9uIHRoaXMgc3RyaW5nIHRhYmxlLiBFcnJvciBpZgorICAvLyBzdHJpbmcgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiA4IGJ1dCBzdHJpbmcgaXMgbm90IGluIHRoZSBzdHJpbmcgdGFibGUKKyAgLy8gLS0gcmV0dXJucyAwLgorICBfX2ludDY0IGVuY29kZShjb25zdCBzdHJpbmcgJnN0cikgeworICAgIF9faW50NjQgcjsKKworICAgIGlmIChzdHIuc2l6ZSgpIDw9IDgpIHsKKyAgICAgIC8vIGVuY29kZWQgZGlyZWN0bHkKKyAgICAgICgoY2hhciAqKSZyKVs3XSA9IDA7CisgICAgICBLTVBfU1RSTkNQWV9TKChjaGFyICopJnIsIHNpemVvZihyKSwgc3RyLmNfc3RyKCksIDgpOworICAgICAgcmV0dXJuIHI7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIHJlcHJlc2VudGVkIGFzIGluZGV4IGludG8gdGFibGUKKyAgICAgIG1hcDxzdHJpbmcsIHVuc2lnbmVkPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBkaXJlY3RvcnkuZmluZChzdHIpOworICAgICAgaWYgKGl0ID09IGRpcmVjdG9yeS5lbmQoKSkKKyAgICAgICAgc3RvcCgiU3RyaW5nVGFibGU6OmVuY29kZTogU3RyaW5nIG5vdyBmb3VuZCBpbiBzdHJpbmcgdGFibGUiKTsKKyAgICAgICgodW5zaWduZWQgKikmcilbMF0gPSAwOworICAgICAgKCh1bnNpZ25lZCAqKSZyKVsxXSA9ICgqaXQpLnNlY29uZDsKKyAgICAgIHJldHVybiByOworICAgIH0KKyAgfQorICAvLyBSZXR1cm5zIHN0cmluZyByZXByZXNlbnRlZCBieSB4IGJhc2VkIG9uIHRoaXMgc3RyaW5nIHRhYmxlLiBFcnJvciBpZiB4CisgIC8vIHJlZmVyZW5jZXMgYW4gaW52YWxpZCBwb3NpdGlvbiBpbiB0aGUgdGFibGUtLXJldHVybnMgdGhlIGVtcHR5IHN0cmluZy4KKyAgc3RyaW5nIGRlY29kZShfX2ludDY0IHgpIGNvbnN0IHsKKyAgICBpZiAoKih1bnNpZ25lZCAqKSZ4ID09IDApIHsKKyAgICAgIC8vIHJlcHJlc2VudGVkIGFzIGluZGV4IGludG8gdGFibGUKKyAgICAgIHVuc2lnbmVkICZwID0gKCh1bnNpZ25lZCAqKSZ4KVsxXTsKKyAgICAgIGlmIChwID49IGxlbmd0aCkKKyAgICAgICAgc3RvcCgiU3RyaW5nVGFibGU6OmRlY29kZTogSW52YWxpZCBzdHJpbmcgdGFibGUgbG9va3VwIik7CisgICAgICByZXR1cm4gc3RyaW5nKGRhdGEgKyBwKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gZW5jb2RlZCBkaXJlY3RseQorICAgICAgY2hhciAqcCA9IChjaGFyICopJng7CisgICAgICBpbnQgaTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IDggJiYgcFtpXTsgKytpKQorICAgICAgICA7CisgICAgICByZXR1cm4gc3RyaW5nKHAsIGkpOworICAgIH0KKyAgfQorICB2b2lkIHdyaXRlKG9zdHJlYW0gJm9zKSB7IG9zLndyaXRlKGRhdGEsIGxlbmd0aCk7IH0KK307CisKKy8vIGZvciB0aGUgbmFtZWQgb2JqZWN0IGZpbGUsIGRldGVybWluZXMgdGhlIHNldCBvZiBkZWZpbmVkIHN5bWJvbHMgYW5kIHRoZSBzZXQKKy8vIG9mIHVuZGVmaW5lZCBleHRlcm5hbCBzeW1ib2xzIGFuZCB3cml0ZXMgdGhlbSB0byA8ZGVmaW5lZD4gYW5kIDx1bmRlZmluZWQ+CisvLyByZXNwZWN0aXZlbHkKK3ZvaWQgY29tcHV0ZUV4dGVybmFsU3ltYm9scyhjb25zdCBjaGFyICpmaWxlTmFtZSwgc2V0PHN0cmluZz4gKmRlZmluZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0PHN0cmluZz4gKnVuZGVmaW5lZCkgeworICBzdHJlYW1wb3MgZmlsZVNpemU7CisgIHNpemVfdCBzdHJUYWJTdGFydDsKKyAgdW5zaWduZWQgc3ltVGFiU3RhcnQsIHN5bU5FbnRyaWVzOworICByc3RyZWFtIGYoZmlsZU5hbWUpOworCisgIGYuc2Vla2coMCwgaW9zOjplbmQpOworICBmaWxlU2l6ZSA9IGYudGVsbGcoKTsKKworICBmLnNlZWtnKDgpOworICBmID4+IHN5bVRhYlN0YXJ0ID4+IHN5bU5FbnRyaWVzOworICAvLyBzZWVrIHRvIHRoZSBzdHJpbmcgdGFibGUKKyAgZi5zZWVrZyhzdHJUYWJTdGFydCA9IHN5bVRhYlN0YXJ0ICsgMTggKiAoc2l6ZV90KXN5bU5FbnRyaWVzKTsKKyAgaWYgKGYuZW9mKCkpIHsKKyAgICBwcmludGYoImNvbXB1dGVFeHRlcm5hbFN5bWJvbHM6IGZpbGVOYW1lPSclcycsIGZpbGVTaXplID0gJWx1LCBzeW1UYWJTdGFydCAiCisgICAgICAgICAgICI9ICV1LCBzeW1ORW50cmllcyA9ICV1XG4iLAorICAgICAgICAgICBmaWxlTmFtZSwgKHVuc2lnbmVkIGxvbmcpZmlsZVNpemUsIHN5bVRhYlN0YXJ0LCBzeW1ORW50cmllcyk7CisgICAgc3RvcCgiY29tcHV0ZUV4dGVybmFsU3ltYm9sczogVW5leHBlY3RlZCBFT0YgMSIpOworICB9CisgIFN0cmluZ1RhYmxlIHN0cmluZ1RhYmxlKGYpOyAvLyByZWFkIHRoZSBzdHJpbmcgdGFibGUKKyAgaWYgKGYudGVsbGcoKSAhPSBmaWxlU2l6ZSkKKyAgICBzdG9wKCJjb21wdXRlRXh0ZXJuYWxTeW1ib2xzOiBVbmV4cGVjdGVkIGRhdGEgYWZ0ZXIgc3RyaW5nIHRhYmxlIik7CisKKyAgZi5jbGVhcigpOworICBmLnNlZWtnKHN5bVRhYlN0YXJ0KTsgLy8gc2VlayB0byB0aGUgc3ltYm9sIHRhYmxlCisKKyAgZGVmaW5lZC0+Y2xlYXIoKTsKKyAgdW5kZWZpbmVkLT5jbGVhcigpOworICBmb3IgKGludCBpID0gMDsgaSA8IHN5bU5FbnRyaWVzOyArK2kpIHsKKyAgICAvLyBwcm9jZXNzIGVhY2ggZW50cnkKKyAgICBTeW1ib2wgZTsKKworICAgIGlmIChmLmVvZigpKQorICAgICAgc3RvcCgiY29tcHV0ZUV4dGVybmFsU3ltYm9sczogVW5leHBlY3RlZCBFT0YgMiIpOworICAgIGYgPj4gZTsKKyAgICBpZiAoZi5mYWlsKCkpCisgICAgICBzdG9wKCJjb21wdXRlRXh0ZXJuYWxTeW1ib2xzOiBGaWxlIHJlYWQgZXJyb3IiKTsKKyAgICBpZiAoZS5uQXV4KSB7IC8vIGF1eGlsaWFyeSBlbnRyeTogc2tpcAorICAgICAgZi5zZWVrZyhlLm5BdXggKiAxOCwgaW9zOjpjdXIpOworICAgICAgaSArPSBlLm5BdXg7CisgICAgfQorICAgIC8vIGlmIHN5bWJvbCBpcyBleHRlcm4gYW5kIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgZmlsZSwgaW5zZXJ0IGl0CisgICAgaWYgKGUuc3RvcmFnZUNsYXNzID09IDIpCisgICAgICBpZiAoZS5zZWN0aW9uTnVtKQorICAgICAgICBkZWZpbmVkLT5pbnNlcnQoc3RyaW5nVGFibGUuZGVjb2RlKGUubmFtZSkpOworICAgICAgZWxzZQorICAgICAgICB1bmRlZmluZWQtPmluc2VydChzdHJpbmdUYWJsZS5kZWNvZGUoZS5uYW1lKSk7CisgIH0KK30KKworLy8gRm9yIGVhY2ggb2NjdXJyZW5jZSBvZiBhbiBleHRlcm5hbCBzeW1ib2wgaW4gdGhlIG9iamVjdCBmaWxlIG5hbWVkIGJ5CisvLyBieSA8ZmlsZU5hbWU+IHRoYXQgaXMgYSBtZW1iZXIgb2YgPGhpZGU+LCByZW5hbWVzIGl0IGJ5IHByZWZpeGluZworLy8gd2l0aCAiX19rbXBfZXh0ZXJuYWxfIiwgd3JpdGluZyBiYWNrIHRoZSBmaWxlIGluLXBsYWNlCit2b2lkIGhpZGVTeW1ib2xzKGNoYXIgKmZpbGVOYW1lLCBjb25zdCBzZXQ8c3RyaW5nPiAmaGlkZSkgeworICBzdGF0aWMgY29uc3Qgc3RyaW5nIHByZWZpeCgiX19rbXBfZXh0ZXJuYWxfIik7CisgIHNldDxzdHJpbmc+IHN0cmluZ3M7IC8vIHNldCBvZiBhbGwgb2NjdXJyaW5nIHN5bWJvbHMsIGFwcHJvcHJpYXRlbHkgcHJlZml4ZWQKKyAgc3RyZWFtcG9zIGZpbGVTaXplOworICBzaXplX3Qgc3RyVGFiU3RhcnQ7CisgIHVuc2lnbmVkIHN5bVRhYlN0YXJ0LCBzeW1ORW50cmllczsKKyAgaW50IGk7CisgIHJzdHJlYW0gaW4oZmlsZU5hbWUpOworCisgIGluLnNlZWtnKDAsIGlvczo6ZW5kKTsKKyAgZmlsZVNpemUgPSBpbi50ZWxsZygpOworCisgIGluLnNlZWtnKDgpOworICBpbiA+PiBzeW1UYWJTdGFydCA+PiBzeW1ORW50cmllczsKKyAgaW4uc2Vla2coc3RyVGFiU3RhcnQgPSBzeW1UYWJTdGFydCArIDE4ICogKHNpemVfdClzeW1ORW50cmllcyk7CisgIGlmIChpbi5lb2YoKSkKKyAgICBzdG9wKCJoaWRlU3ltYm9sczogVW5leHBlY3RlZCBFT0YiKTsKKyAgU3RyaW5nVGFibGUgc3RyaW5nVGFibGVPbGQoaW4pOyAvLyByZWFkIG9yaWdpbmFsIHN0cmluZyB0YWJsZQorCisgIGlmIChpbi50ZWxsZygpICE9IGZpbGVTaXplKQorICAgIHN0b3AoImhpZGVTeW1ib2xzOiBVbmV4cGVjdGVkIGRhdGEgYWZ0ZXIgc3RyaW5nIHRhYmxlIik7CisKKyAgLy8gY29tcHV0ZSBzZXQgb2Ygb2NjdXJyaW5nIHN0cmluZ3Mgd2l0aCBwcmVmaXggYWRkZWQKKyAgZm9yIChpID0gMDsgaSA8IHN5bU5FbnRyaWVzOyArK2kpIHsKKyAgICBTeW1ib2wgZTsKKworICAgIGluLnNlZWtnKHN5bVRhYlN0YXJ0ICsgaSAqIDE4KTsKKyAgICBpZiAoaW4uZW9mKCkpCisgICAgICBzdG9wKCJoaWRlU3ltYm9sczogVW5leHBlY3RlZCBFT0YiKTsKKyAgICBpbiA+PiBlOworICAgIGlmIChpbi5mYWlsKCkpCisgICAgICBzdG9wKCJoaWRlU3ltYm9sczogRmlsZSByZWFkIGVycm9yIik7CisgICAgaWYgKGUubkF1eCkKKyAgICAgIGkgKz0gZS5uQXV4OworICAgIGNvbnN0IHN0cmluZyAmcyA9IHN0cmluZ1RhYmxlT2xkLmRlY29kZShlLm5hbWUpOworICAgIC8vIGlmIHN5bWJvbCBpcyBleHRlcm4gYW5kIGZvdW5kIGluIDxoaWRlPiwgcHJlZml4IGFuZCBpbnNlcnQgaW50byBzdHJpbmdzLAorICAgIC8vIG90aGVyd2lzZSwganVzdCBpbnNlcnQgaW50byBzdHJpbmdzIHdpdGhvdXQgcHJlZml4CisgICAgc3RyaW5ncy5pbnNlcnQoCisgICAgICAgIChlLnN0b3JhZ2VDbGFzcyA9PSAyICYmIGhpZGUuZmluZChzKSAhPSBoaWRlLmVuZCgpKSA/IHByZWZpeCArIHMgOiBzKTsKKyAgfQorCisgIG9mc3RyZWFtIG91dChmaWxlTmFtZSwgaW9zOjp0cnVuYyB8IGlvczo6b3V0IHwgaW9zOjpiaW5hcnkpOworICBpZiAoIW91dC5pc19vcGVuKCkpCisgICAgc3RvcCgiaGlkZVN5bWJvbHM6IEVycm9yIG9wZW5pbmcgb3V0cHV0IGZpbGUiKTsKKworICAvLyBtYWtlIG5ldyBzdHJpbmcgdGFibGUgZnJvbSBzdHJpbmcgc2V0CisgIFN0cmluZ1RhYmxlIHN0cmluZ1RhYmxlTmV3ID0gU3RyaW5nVGFibGUoc3RyaW5ncyk7CisKKyAgLy8gY29weSBpbnB1dCBmaWxlIHRvIG91dHB1dCBmaWxlIHVwIHRvIGp1c3QgYmVmb3JlIHRoZSBzeW1ib2wgdGFibGUKKyAgaW4uc2Vla2coMCk7CisgIGNoYXIgKmJ1ZiA9IG5ldyBjaGFyW3N5bVRhYlN0YXJ0XTsKKyAgaW4ucmVhZChidWYsIHN5bVRhYlN0YXJ0KTsKKyAgb3V0LndyaXRlKGJ1Ziwgc3ltVGFiU3RhcnQpOworICBkZWxldGVbXSBidWY7CisKKyAgLy8gY29weSBpbnB1dCBzeW1ib2wgdGFibGUgdG8gb3V0cHV0IHN5bWJvbCB0YWJsZSB3aXRoIG5hbWUgdHJhbnNsYXRpb24KKyAgZm9yIChpID0gMDsgaSA8IHN5bU5FbnRyaWVzOyArK2kpIHsKKyAgICBTeW1ib2wgZTsKKworICAgIGluLnNlZWtnKHN5bVRhYlN0YXJ0ICsgaSAqIDE4KTsKKyAgICBpZiAoaW4uZW9mKCkpCisgICAgICBzdG9wKCJoaWRlU3ltYm9sczogVW5leHBlY3RlZCBFT0YiKTsKKyAgICBpbiA+PiBlOworICAgIGlmIChpbi5mYWlsKCkpCisgICAgICBzdG9wKCJoaWRlU3ltYm9sczogRmlsZSByZWFkIGVycm9yIik7CisgICAgY29uc3Qgc3RyaW5nICZzID0gc3RyaW5nVGFibGVPbGQuZGVjb2RlKGUubmFtZSk7CisgICAgb3V0LnNlZWtwKHN5bVRhYlN0YXJ0ICsgaSAqIDE4KTsKKyAgICBlLm5hbWUgPSBzdHJpbmdUYWJsZU5ldy5lbmNvZGUoCisgICAgICAgIChlLnN0b3JhZ2VDbGFzcyA9PSAyICYmIGhpZGUuZmluZChzKSAhPSBoaWRlLmVuZCgpKSA/IHByZWZpeCArIHMgOiBzKTsKKyAgICBvdXQud3JpdGUoKGNoYXIgKikmZSwgMTgpOworICAgIGlmIChvdXQuZmFpbCgpKQorICAgICAgc3RvcCgiaGlkZVN5bWJvbHM6IEZpbGUgd3JpdGUgZXJyb3IiKTsKKyAgICBpZiAoZS5uQXV4KSB7CisgICAgICAvLyBjb3B5IGF1eGlsaWFyeSBzeW1ib2wgdGFibGUgZW50cmllcworICAgICAgaW50IG5BdXggPSBlLm5BdXg7CisgICAgICBmb3IgKGludCBqID0gMTsgaiA8PSBuQXV4OyArK2opIHsKKyAgICAgICAgaW4gPj4gZTsKKyAgICAgICAgb3V0LnNlZWtwKHN5bVRhYlN0YXJ0ICsgKGkgKyBqKSAqIDE4KTsKKyAgICAgICAgb3V0LndyaXRlKChjaGFyICopJmUsIDE4KTsKKyAgICAgIH0KKyAgICAgIGkgKz0gbkF1eDsKKyAgICB9CisgIH0KKyAgLy8gb3V0cHV0IHN0cmluZyB0YWJsZQorICBzdHJpbmdUYWJsZU5ldy53cml0ZShvdXQpOworfQorCisvLyByZXR1cm5zIHRydWUgaWZmIDxhPiBhbmQgPGI+IGhhdmUgbm8gY29tbW9uIGVsZW1lbnQKK3RlbXBsYXRlIDxjbGFzcyBUPiBib29sIGlzRGlzam9pbnQoY29uc3Qgc2V0PFQ+ICZhLCBjb25zdCBzZXQ8VD4gJmIpIHsKKyAgc2V0PFQ+Ojpjb25zdF9pdGVyYXRvciBpdGEsIGl0YjsKKworICBmb3IgKGl0YSA9IGEuYmVnaW4oKSwgaXRiID0gYi5iZWdpbigpOyBpdGEgIT0gYS5lbmQoKSAmJiBpdGIgIT0gYi5lbmQoKTspIHsKKyAgICBjb25zdCBUICZ0YSA9ICppdGEsICZ0YiA9ICppdGI7CisgICAgaWYgKHRhIDwgdGIpCisgICAgICArK2l0YTsKKyAgICBlbHNlIGlmICh0YiA8IHRhKQorICAgICAgKytpdGI7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLyBQUkU6IDxkZWZpbmVkPiBhbmQgPHVuZGVmaW5lZD4gYXJlIGFycmF5cyB3aXRoIDxuVG90YWw+IGVsZW1lbnRzIHdoZXJlCisvLyA8blRvdGFsPiA+PSA8bkV4dGVybmFsPi4gIFRoZSBmaXJzdCA8bkV4dGVybmFsPiBlbGVtZW50cyBjb3JyZXNwb25kIHRvIHRoZQorLy8gZXh0ZXJuYWwgb2JqZWN0IGZpbGVzIGFuZCB0aGUgcmVzdCBjb3JyZXNwb25kIHRvIHRoZSBpbnRlcm5hbCBvYmplY3QgZmlsZXMuCisvLyBQT1NUOiBmaWxlIHggaXMgc2FpZCB0byBkZXBlbmQgb24gZmlsZSB5IGlmIHVuZGVmaW5lZFt4XSBhbmQgZGVmaW5lZFt5XSBhcmUKKy8vIG5vdCBkaXNqb2ludC4gUmV0dXJucyB0aGUgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIHRoZSBzZXQgb2YgaW50ZXJuYWwgb2JqZWN0CisvLyBmaWxlcywgYXMgYSBzZXQgb2YgZmlsZSBpbmRleGVzLCB1bmRlciB0aGUgJ2RlcGVuZHMgb24nIHJlbGF0aW9uLCBtaW51cyB0aGUKKy8vIHNldCBvZiBpbnRlcm5hbCBvYmplY3QgZmlsZXMuCitzZXQ8aW50PiAqZmluZFJlcXVpcmVkRXh0ZXJuYWwoaW50IG5FeHRlcm5hbCwgaW50IG5Ub3RhbCwgc2V0PHN0cmluZz4gKmRlZmluZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0PHN0cmluZz4gKnVuZGVmaW5lZCkgeworICBzZXQ8aW50PiAqcmVxdWlyZWQgPSBuZXcgc2V0PGludD47CisgIHNldDxpbnQ+IGZyZXNoWzJdOworICBpbnQgaSwgY3VyID0gMDsKKyAgYm9vbCBjaGFuZ2VkOworCisgIGZvciAoaSA9IG5Ub3RhbCAtIDE7IGkgPj0gbkV4dGVybmFsOyAtLWkpCisgICAgZnJlc2hbY3VyXS5pbnNlcnQoaSk7CisgIGRvIHsKKyAgICBjaGFuZ2VkID0gZmFsc2U7CisgICAgZm9yIChzZXQ8aW50Pjo6aXRlcmF0b3IgaXQgPSBmcmVzaFtjdXJdLmJlZ2luKCk7IGl0ICE9IGZyZXNoW2N1cl0uZW5kKCk7CisgICAgICAgICArK2l0KSB7CisgICAgICBzZXQ8c3RyaW5nPiAmcyA9IHVuZGVmaW5lZFsqaXRdOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbkV4dGVybmFsOyArK2kpIHsKKyAgICAgICAgaWYgKHJlcXVpcmVkLT5maW5kKGkpID09IHJlcXVpcmVkLT5lbmQoKSkgeworICAgICAgICAgIGlmICghaXNEaXNqb2ludChkZWZpbmVkW2ldLCBzKSkgeworICAgICAgICAgICAgLy8gZm91bmQgYSBuZXcgcXVhbGlmeWluZyBlbGVtZW50CisgICAgICAgICAgICByZXF1aXJlZC0+aW5zZXJ0KGkpOworICAgICAgICAgICAgZnJlc2hbMSAtIGN1cl0uaW5zZXJ0KGkpOworICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGZyZXNoW2N1cl0uY2xlYXIoKTsKKyAgICBjdXIgPSAxIC0gY3VyOworICB9IHdoaWxlIChjaGFuZ2VkKTsKKyAgcmV0dXJuIHJlcXVpcmVkOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgaW50IG5FeHRlcm5hbCwgbkludGVybmFsLCBpOworICBzZXQ8c3RyaW5nPiAqZGVmaW5lZCwgKnVuZGVmaW5lZDsKKyAgc2V0PGludD46Oml0ZXJhdG9yIGl0OworCisgIGlmIChhcmdjIDwgMykKKyAgICBzdG9wKCJQbGVhc2Ugc3BlY2lmeSBhIHBvc2l0aXZlIGludGVnZXIgZm9sbG93ZWQgYnkgYSBsaXN0IG9mIG9iamVjdCAiCisgICAgICAgICAiZmlsZW5hbWVzIik7CisgIG5FeHRlcm5hbCA9IGF0b2koYXJndlsxXSk7CisgIGlmIChuRXh0ZXJuYWwgPD0gMCkKKyAgICBzdG9wKCJQbGVhc2Ugc3BlY2lmeSBhIHBvc2l0aXZlIGludGVnZXIgZm9sbG93ZWQgYnkgYSBsaXN0IG9mIG9iamVjdCAiCisgICAgICAgICAiZmlsZW5hbWVzIik7CisgIGlmIChuRXh0ZXJuYWwgKyAyID4gYXJnYykKKyAgICBzdG9wKCJUb28gZmV3IGV4dGVybmFsIG9iamVjdHMiKTsKKyAgbkludGVybmFsID0gYXJnYyAtIG5FeHRlcm5hbCAtIDI7CisgIGRlZmluZWQgPSBuZXcgc2V0PHN0cmluZz5bYXJnYyAtIDJdOworICB1bmRlZmluZWQgPSBuZXcgc2V0PHN0cmluZz5bYXJnYyAtIDJdOworCisgIC8vIGRldGVybWluZSB0aGUgc2V0IG9mIGRlZmluZWQgYW5kIHVuZGVmaW5lZCBleHRlcm5hbCBzeW1ib2xzCisgIGZvciAoaSA9IDI7IGkgPCBhcmdjOyArK2kpCisgICAgY29tcHV0ZUV4dGVybmFsU3ltYm9scyhhcmd2W2ldLCBkZWZpbmVkICsgaSAtIDIsIHVuZGVmaW5lZCArIGkgLSAyKTsKKworICAvLyBkZXRlcm1pbmUgdGhlIHNldCBvZiByZXF1aXJlZCBleHRlcm5hbCBmaWxlcworICBzZXQ8aW50PiAqcmVxdWlyZWRFeHRlcm5hbCA9CisgICAgICBmaW5kUmVxdWlyZWRFeHRlcm5hbChuRXh0ZXJuYWwsIGFyZ2MgLSAyLCBkZWZpbmVkLCB1bmRlZmluZWQpOworICBzZXQ8c3RyaW5nPiBoaWRlOworCisgIC8vIGRldGVybWluZSB0aGUgc2V0IG9mIHN5bWJvbHMgdG8gaGlkZS0tbmFtZWx5IGRlZmluZWQgZXh0ZXJuYWwgc3ltYm9scyBvZgorICAvLyB0aGUgcmVxdWlyZWQgZXh0ZXJuYWwgZmlsZXMKKyAgZm9yIChpdCA9IHJlcXVpcmVkRXh0ZXJuYWwtPmJlZ2luKCk7IGl0ICE9IHJlcXVpcmVkRXh0ZXJuYWwtPmVuZCgpOyArK2l0KSB7CisgICAgaW50IGlkeCA9ICppdDsKKyAgICBzZXQ8c3RyaW5nPjo6aXRlcmF0b3IgaXQyOworICAgIC8vIFdlIGhhdmUgdG8gaW5zZXJ0IG9uZSBlbGVtZW50IGF0IGEgdGltZSBpbnN0ZWFkIG9mIGluc2VydGluZyBhIHJhbmdlCisgICAgLy8gYmVjYXVzZSB0aGUgaW5zZXJ0IG1lbWJlciBmdW5jdGlvbiB0YWtpbmcgYSByYW5nZSBkb2Vzbid0IGV4aXN0IG9uCisgICAgLy8gV2luZG93cyogT1MsIGF0IGxlYXN0IGF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZy4KKyAgICBmb3IgKGl0MiA9IGRlZmluZWRbaWR4XS5iZWdpbigpOyBpdDIgIT0gZGVmaW5lZFtpZHhdLmVuZCgpOyArK2l0MikKKyAgICAgIGhpZGUuaW5zZXJ0KCppdDIpOworICB9CisKKyAgLy8gcHJvY2VzcyB0aGUgZXh0ZXJuYWwgZmlsZXMtLXJlbW92aW5nIHRob3NlIHRoYXQgYXJlIG5vdCByZXF1aXJlZCBhbmQgaGlkaW5nCisgIC8vICAgdGhlIGFwcHJvcHJpYXRlIHN5bWJvbHMgaW4gdGhlIG90aGVycworICBmb3IgKGkgPSAwOyBpIDwgbkV4dGVybmFsOyArK2kpCisgICAgaWYgKHJlcXVpcmVkRXh0ZXJuYWwtPmZpbmQoaSkgIT0gcmVxdWlyZWRFeHRlcm5hbC0+ZW5kKCkpCisgICAgICBoaWRlU3ltYm9scyhhcmd2WzIgKyBpXSwgaGlkZSk7CisgICAgZWxzZQorICAgICAgcmVtb3ZlKGFyZ3ZbMiArIGldKTsKKyAgLy8gaGlkZSB0aGUgYXBwcm9wcmlhdGUgc3ltYm9scyBpbiB0aGUgaW50ZXJuYWwgZmlsZXMKKyAgZm9yIChpID0gbkV4dGVybmFsICsgMjsgaSA8IGFyZ2M7ICsraSkKKyAgICBoaWRlU3ltYm9scyhhcmd2W2ldLCBoaWRlKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9pMThuL2VuX1VTLnR4dCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2kxOG4vZW5fVVMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNTUzMzcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9pMThuL2VuX1VTLnR4dApAQCAtMCwwICsxLDQ4MiBAQAorIyBlbl9VUy50eHQgIworCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgRGVmYXVsdCBtZXNzYWdlcywgZW1iZWRkZWQgaW50byB0aGUgT3Blbk1QIFJUTCwgYW5kIHNvdXJjZSBmb3IgRW5nbGlzaCBjYXRhbG9nLgorCisKKyMgQ29tcGF0aWJsZSBjaGFuZ2VzICh3aGljaCBkb2VzIG5vdCByZXF1aXJlIHZlcnNpb24gYnVtcGluZyk6CisjICAgICAqIEVkaXRpbmcgbWVzc2FnZSAobnVtYmVyIGFuZCB0eXBlIG9mIHBsYWNlaG9sZGVycyBtdXN0IHJlbWFpbiwgcmVsYXRpdmUgb3JkZXIgb2YKKyMgICAgICAgcGxhY2Vob2xkZXJzIG1heSBiZSBjaGFuZ2VkLCBlLmcuICJGaWxlICUxJHMgbGluZSAlMiRkIiBtYXkgYmUgc2FmZWx5IGVkaXRlZCB0bworIyAgICAgICAiTGluZSAlMiRkIGZpbGUgJTEkcyIpLgorIyAgICAgKiBBZGRpbmcgbmV3IG1lc3NhZ2UgdG8gdGhlIGVuZCBvZiBzZWN0aW9uLgorIyBJbmNvbXBhdGlibGUgY2hhbmdlcyAodmVyc2lvbiBtdXN0IGJlIGJ1bWJlZCBieSAxKToKKyMgICAgICogSW50cm9kdWNpbmcgbmV3IHBsYWNlaG9sZGVycyB0byBleGlzdGluZyBtZXNzYWdlcy4KKyMgICAgICogQ2hhbmdpbmcgdHlwZSBvZiBwbGFjZWhvbGRlcnMgKGUuZy4gImxpbmUgJTEkZCIgLT4gImxpbmUgJTEkcyIpLgorIyAgICAgKiBSZWFycmFuZ2luZyBvcmRlciBvZiBtZXNzYWdlcy4KKyMgICAgICogRGVsZXRpbmcgbWVzc2FnZXMuCisjIFVzZSBzcGVjaWFsICJPQlNPTEVURSIgcHNldWRvaWRlbnRpZmllciBmb3Igb2Jzb2xldGUgZW50cmllcywgd2hpY2ggaXMga2VwdCBvbmx5IGZvciBiYWNrd2FyZAorIyBjb21wYXRpYmlsaXR5LiBXaGVuIHZlcnNpb24gaXMgYnVtcGVkLCBkbyBub3QgZm9yZ2V0IHRvIGRlbGV0ZSBhbGwgb2Jzb2xldGUgZW50cmllcy4KKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistKi0gTUVUQSAtKi0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBNZXRhIGluZm9ybWF0aW9uIGFib3V0IG1lc3NhZ2UgY2F0YWxvZy4KKworTGFuZ3VhZ2UgIkVuZ2xpc2giCitDb3VudHJ5ICAiVVNBIgorTGFuZ0lkICAgIjEwMzMiCitWZXJzaW9uICAiMiIKK1JldmlzaW9uICIyMDE2MTIxNiIKKworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0qLSBTVFJJTkdTIC0qLQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFN0cmluZ3MgYXJlIG5vdCBjb21wbGV0ZSBtZXNzYWdlcywganVzdCBmcmFnbWVudHMuIFdlIG5lZWQgdG8gd29yayBvbiBpdCBhbmQgcmVkdWNlIG51bWJlciBvZgorIyBzdHJpbmdzICh0byB6ZXJvPykuCisKK0Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIgorVW5rbm93bkZpbGUgICAgICAgICAgICAgICAgICAiKHVua25vd24gZmlsZSkiCitOb3RBTnVtYmVyICAgICAgICAgICAgICAgICAgICJub3QgYSBudW1iZXIiCitCYWRVbml0ICAgICAgICAgICAgICAgICAgICAgICJiYWQgdW5pdCIKK0lsbGVnYWxDaGFyYWN0ZXJzICAgICAgICAgICAgImlsbGVnYWwgY2hhcmFjdGVycyIKK1ZhbHVlVG9vTGFyZ2UgICAgICAgICAgICAgICAgInZhbHVlIHRvbyBsYXJnZSIKK1ZhbHVlVG9vU21hbGwgICAgICAgICAgICAgICAgInZhbHVlIHRvbyBzbWFsbCIKK05vdE11bHRpcGxlNEsgICAgICAgICAgICAgICAgInZhbHVlIGlzIG5vdCBhIG11bHRpcGxlIG9mIDRrIgorVW5rbm93blRvcG9sb2d5ICAgICAgICAgICAgICAiVW5rbm93biBwcm9jZXNzb3IgdG9wb2xvZ3kiCitDYW50T3BlbkNwdWluZm8gICAgICAgICAgICAgICJDYW5ub3Qgb3BlbiAvcHJvYy9jcHVpbmZvIgorUHJvY0NwdWluZm8gICAgICAgICAgICAgICAgICAiL3Byb2MvY3B1aW5mbyIKK05vUHJvY1JlY29yZHMgICAgICAgICAgICAgICAgImNwdWluZm8gZmlsZSBpbnZhbGlkIChObyBwcm9jZXNzb3IgcmVjb3JkcykiCitUb29NYW55UHJvY1JlY29yZHMgICAgICAgICAgICJjcHVpbmZvIGZpbGUgaW52YWxpZCAoVG9vIG1hbnkgcHJvY2Vzc29yIHJlY29yZHMpIgorQ2FudFJld2luZENwdWluZm8gICAgICAgICAgICAiQ2Fubm90IHJld2luZCBjcHVpbmZvIGZpbGUiCitMb25nTGluZUNwdWluZm8gICAgICAgICAgICAgICJjcHVpbmZvIGZpbGUgaW52YWxpZCAobG9uZyBsaW5lKSIKK1Rvb01hbnlFbnRyaWVzICAgICAgICAgICAgICAgImNwdWluZm8gZmlsZSBjb250YWlucyB0b28gbWFueSBlbnRyaWVzIgorTWlzc2luZ1Byb2NGaWVsZCAgICAgICAgICAgICAiY3B1aW5mbyBmaWxlIG1pc3NpbmcgcHJvY2Vzc29yIGZpZWxkIgorTWlzc2luZ1BoeXNpY2FsSURGaWVsZCAgICAgICAiY3B1aW5mbyBmaWxlIG1pc3NpbmcgcGh5c2ljYWwgaWQgZmllbGQiCitNaXNzaW5nVmFsQ3B1aW5mbyAgICAgICAgICAgICJjcHVpbmZvIGZpbGUgaW52YWxpZCAobWlzc2luZyB2YWwpIgorRHVwbGljYXRlRmllbGRDcHVpbmZvICAgICAgICAiY3B1aW5mbyBmaWxlIGludmFsaWQgKGR1cGxpY2F0ZSBmaWVsZCkiCitQaHlzaWNhbElEc05vdFVuaXF1ZSAgICAgICAgICJQaHlzaWNhbCBub2RlL3BrZy9jb3JlL3RocmVhZCBpZHMgbm90IHVuaXF1ZSIKK0FwaWNOb3RQcmVzZW50ICAgICAgICAgICAgICAgIkFQSUMgbm90IHByZXNlbnQiCitJbnZhbGlkQ3B1aWRJbmZvICAgICAgICAgICAgICJJbnZhbGlkIGNwdWlkIGluZm8iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJBUElDIGlkcyBub3QgdW5pcXVlIgorSW5jb25zaXN0ZW50Q3B1aWRJbmZvICAgICAgICAiSW5jb25zaXN0ZW50IGNwdWlkIGluZm8iCitPdXRPZkhlYXBNZW1vcnkgICAgICAgICAgICAgICJPdXQgb2YgaGVhcCBtZW1vcnkiCitNZW1vcnlBbGxvY0ZhaWxlZCAgICAgICAgICAgICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiCitDb3JlICAgICAgICAgICAgICAgICAgICAgICAgICJjb3JlIgorVGhyZWFkICAgICAgICAgICAgICAgICAgICAgICAidGhyZWFkIgorUGFja2FnZSAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSIKK05vZGUgICAgICAgICAgICAgICAgICAgICAgICAgIm5vZGUiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICI8dW5kZWY+IgorRGVjb2RpbmdMZWdhY3lBUElDICAgICAgICAgICAiZGVjb2RpbmcgbGVnYWN5IEFQSUMgaWRzIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAicGFyc2luZyAvcHJvYy9jcHVpbmZvIgorTm90RGVmaW5lZCAgICAgICAgICAgICAgICAgICAidmFsdWUgaXMgbm90IGRlZmluZWQiCitFZmZlY3RpdmVTZXR0aW5ncyAgICAgICAgICAgICJFZmZlY3RpdmUgc2V0dGluZ3M6IgorVXNlclNldHRpbmdzICAgICAgICAgICAgICAgICAiVXNlciBzZXR0aW5nczoiCitTdG9yYWdlTWFwV2FybmluZyAgICAgICAgICAgICJ3YXJuaW5nOiBwb2ludGVycyBvciBzaXplIGRvbid0IG1ha2Ugc2Vuc2UiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJDUFUiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJUUFUiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJUUFVzIHBlciBwYWNrYWdlIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiSFQgZW5hYmxlZCIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIkhUIGRpc2FibGVkIgorRGVjb2Rpbmd4MkFQSUMgICAgICAgICAgICAgICAiZGVjb2RpbmcgeDJBUElDIGlkcyIKK05vTGVhZjExU3VwcG9ydCAgICAgICAgICAgICAgImNwdWlkIGxlYWYgMTEgbm90IHN1cHBvcnRlZCIKK05vTGVhZjRTdXBwb3J0ICAgICAgICAgICAgICAgImNwdWlkIGxlYWYgNCBub3Qgc3VwcG9ydGVkIgorVGhyZWFkSURzTm90VW5pcXVlICAgICAgICAgICAidGhyZWFkIGlkcyBub3QgdW5pcXVlIgorVXNpbmdQdGhyZWFkICAgICAgICAgICAgICAgICAidXNpbmcgcHRocmVhZCBpbmZvIgorTGVnYWN5QXBpY0lEc05vdFVuaXF1ZSAgICAgICAibGVnYWN5IEFQSUMgaWRzIG5vdCB1bmlxdWUiCit4MkFwaWNJRHNOb3RVbmlxdWUgICAgICAgICAgICJ4MkFQSUMgaWRzIG5vdCB1bmlxdWUiCitEaXNwbGF5RW52QmVnaW4JCSAgICAgIk9QRU5NUCBESVNQTEFZIEVOVklST05NRU5UIEJFR0lOIgorRGlzcGxheUVudkVuZAkJICAgICAiT1BFTk1QIERJU1BMQVkgRU5WSVJPTk1FTlQgRU5EIgorRGV2aWNlCQkJICAgICAiW2RldmljZV0iCitIb3N0CQkJICAgICAiW2hvc3RdIgorCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLSotIEZPUk1BVFMgLSotCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0luZm8gICAgICAgICAgICAgICAgICAgICAgICAgIk9NUDogSW5mbyAjJTEkZDogJTIkc1xuIgorV2FybmluZyAgICAgICAgICAgICAgICAgICAgICAiT01QOiBXYXJuaW5nICMlMSRkOiAlMiRzXG4iCitGYXRhbCAgICAgICAgICAgICAgICAgICAgICAgICJPTVA6IEVycm9yICMlMSRkOiAlMiRzXG4iCitTeXNFcnIgICAgICAgICAgICAgICAgICAgICAgICJPTVA6IFN5c3RlbSBlcnJvciAjJTEkZDogJTIkc1xuIgorSGludCAgICAgICAgICAgICAgICAgICAgICAgICAiT01QOiBIaW50OiAlMiRzXG4iCisKK1ByYWdtYSAgICAgICAgICAgICAgICAgICAgICAgIiUxJHMgcHJhZ21hIChhdCAlMiRzOiUzJHMoKTolNCRzKSIKKyAgICAjICUxIGlzIHByYWdtYSBuYW1lIChsaWtlICJwYXJhbGxlbCIgb3IgIm1hc3RlciIsCisgICAgIyAlMiBpcyBmaWxlIG5hbWUsCisgICAgIyAlMyBpcyBmdW5jdGlvbiAocm91dGluZSkgbmFtZSwKKyAgICAjICU0IGlzIHRoZSBsaW5lIG51bWJlciAoYXMgc3RyaW5nLCBzbyAicyIgdHlwZSBzcGVjaWZpZXIgc2hvdWxkIGJlIHVzZWQpLgorCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLSotIE1FU1NBR0VTIC0qLQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIE1lc3NhZ2VzIG9mIGFueSBzZXZlcml0eTogaW5mb3JtYXRpb25hbCwgd2FybmluZywgb3IgZmF0YWwuCisjIFRvIG1haW50YWluIG1lc3NhZ2UgbnVtYmVycyAodGhleSBhcmUgdmlzaWJsZSB0byBjdXN0b21lcnMpLCBhZGQgbmV3IG1lc3NhZ2VzIHRvIHRoZSBlbmQuCisKKyMgVXNlIGZvbGxvd2luZyBwcmVmaXhlcyBmb3IgbWVzc2FnZXMgYW5kIGhpbnRzIHdoZW4gYXBwcm9wcmlhdGU6CisjICAgIEFmZiAtLSBBZmZpbml0eSBtZXNzYWdlcy4KKyMgICAgQ25zIC0tIENvbnNpc3RlbmN5IGNoZWNrIGZhaWx1cmVzIChLTVBfQ09OU0lTVEVOQ1lfQ0hFQ0spLgorIyAgICBJdHQgLS0gSVRUIE5vdGlmeS1yZWxhdGVkIG1lc3NhZ2VzLgorCitMaWJyYXJ5SXNTZXJpYWwgICAgICAgICAgICAgICJMaWJyYXJ5IGlzIFwic2VyaWFsXCIuIgorQ2FudE9wZW5NZXNzYWdlQ2F0YWxvZyAgICAgICAiQ2Fubm90IG9wZW4gbWVzc2FnZSBjYXRhbG9nIFwiJTEkc1wiOiIKK1dpbGxVc2VEZWZhdWx0TWVzc2FnZXMgICAgICAgIkRlZmF1bHQgbWVzc2FnZXMgd2lsbCBiZSB1c2VkLiIKK0xvY2tJc1VuaW5pdGlhbGl6ZWQgICAgICAgICAgIiUxJHM6IExvY2sgaXMgdW5pbml0aWFsaXplZCIKK0xvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSAgICAgIiUxJHM6IExvY2sgd2FzIGluaXRpYWxpemVkIGFzIHNpbXBsZSwgYnV0IHVzZWQgYXMgbmVzdGFibGUiCitMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUgICAgICIlMSRzOiBMb2NrIHdhcyBpbml0aWFsaXplZCBhcyBuZXN0YWJsZSwgYnV0IHVzZWQgYXMgc2ltcGxlIgorTG9ja0lzQWxyZWFkeU93bmVkICAgICAgICAgICAiJTEkczogTG9jayBpcyBhbHJlYWR5IG93bmVkIGJ5IHJlcXVlc3RpbmcgdGhyZWFkIgorTG9ja1N0aWxsT3duZWQgICAgICAgICAgICAgICAiJTEkczogTG9jayBpcyBzdGlsbCBvd25lZCBieSBhIHRocmVhZCIKK0xvY2tVbnNldHRpbmdGcmVlICAgICAgICAgICAgIiUxJHM6IEF0dGVtcHQgdG8gcmVsZWFzZSBhIGxvY2sgbm90IG93bmVkIGJ5IGFueSB0aHJlYWQiCitMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyICAgICIlMSRzOiBBdHRlbXB0IHRvIHJlbGVhc2UgYSBsb2NrIG93bmVkIGJ5IGFub3RoZXIgdGhyZWFkIgorU3RhY2tPdmVyZmxvdyAgICAgICAgICAgICAgICAiU3RhY2sgb3ZlcmZsb3cgZGV0ZWN0ZWQgZm9yIE9wZW5NUCB0aHJlYWQgIyUxJGQiCitTdGFja092ZXJsYXAgICAgICAgICAgICAgICAgICJTdGFjayBvdmVybGFwIGRldGVjdGVkLiAiCitBc3NlcnRpb25GYWlsdXJlICAgICAgICAgICAgICJBc3NlcnRpb24gZmFpbHVyZSBhdCAlMSRzKCUyJGQpLiIKK0NhbnRSZWdpc3Rlck5ld1RocmVhZCAgICAgICAgIlVuYWJsZSB0byByZWdpc3RlciBhIG5ldyB1c2VyIHRocmVhZC4iCitEdXBsaWNhdGVMaWJyYXJ5ICAgICAgICAgICAgICJJbml0aWFsaXppbmcgJTEkcywgYnV0IGZvdW5kICUyJHMgYWxyZWFkeSBpbml0aWFsaXplZC4iCitDYW50T3BlbkZpbGVGb3JSZWFkaW5nICAgICAgICJDYW5ub3Qgb3BlbiBmaWxlIFwiJTEkc1wiIGZvciByZWFkaW5nOiIKK0NhbnRHZXRFbnZWYXIgICAgICAgICAgICAgICAgIkdldHRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgXCIlMSRzXCIgZmFpbGVkOiIKK0NhbnRTZXRFbnZWYXIgICAgICAgICAgICAgICAgIlNldHRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgXCIlMSRzXCIgZmFpbGVkOiIKK0NhbnRHZXRFbnZpcm9ubWVudCAgICAgICAgICAgIkdldHRpbmcgZW52aXJvbm1lbnQgZmFpbGVkOiIKK0JhZEJvb2xWYWx1ZSAgICAgICAgICAgICAgICAgIiUxJHM9XCIlMiRzXCI6IFdyb25nIHZhbHVlLCBib29sZWFuIGV4cGVjdGVkLiIKK1NTUE5vdEJ1aWx0SW4gICAgICAgICAgICAgICAgIk5vIEhlbHBlciBUaHJlYWQgc3VwcG9ydCBidWlsdCBpbiB0aGlzIE9NUCBsaWJyYXJ5LiIKK1NQUFNvdGZUZXJtaW5hdGVGYWlsZWQgICAgICAgIkhlbHBlciB0aHJlYWQgZmFpbGVkIHRvIHNvZnQgdGVybWluYXRlLiIKK0J1ZmZlck92ZXJmbG93ICAgICAgICAgICAgICAgIkJ1ZmZlciBvdmVyZmxvdyBkZXRlY3RlZC4iCitSZWFsVGltZVNjaGVkTm90U3VwcG9ydGVkICAgICJSZWFsLXRpbWUgc2NoZWR1bGluZyBwb2xpY3kgaXMgbm90IHN1cHBvcnRlZC4iCitSdW5uaW5nQXRNYXhQcmlvcml0eSAgICAgICAgICJPTVAgYXBwbGljYXRpb24gaXMgcnVubmluZyBhdCBtYXhpbXVtIHByaW9yaXR5IHdpdGggcmVhbC10aW1lIHNjaGVkdWxpbmcgcG9saWN5LiAiCitDYW50Q2hhbmdlTW9uaXRvclByaW9yaXR5ICAgICJDaGFuZ2luZyBwcmlvcml0eSBvZiB0aGUgbW9uaXRvciB0aHJlYWQgZmFpbGVkOiIKK01vbml0b3JXaWxsU3RhcnZlICAgICAgICAgICAgIkRlYWRsb2NrcyBhcmUgaGlnaGx5IHBvc3NpYmxlIGR1ZSB0byBtb25pdG9yIHRocmVhZCBzdGFydmF0aW9uLiIKK0NhbnRTZXRNb25pdG9yU3RhY2tTaXplICAgICAgIlVuYWJsZSB0byBzZXQgbW9uaXRvciB0aHJlYWQgc3RhY2sgc2l6ZSB0byAlMSRsdSBieXRlczoiCitDYW50U2V0V29ya2VyU3RhY2tTaXplICAgICAgICJVbmFibGUgdG8gc2V0IE9NUCB0aHJlYWQgc3RhY2sgc2l6ZSB0byAlMSRsdSBieXRlczoiCitDYW50SW5pdFRocmVhZEF0dHJzICAgICAgICAgICJUaHJlYWQgYXR0cmlidXRlIGluaXRpYWxpemF0aW9uIGZhaWxlZDoiCitDYW50RGVzdHJveVRocmVhZEF0dHJzICAgICAgICJUaHJlYWQgYXR0cmlidXRlIGRlc3Ryb3lpbmcgZmFpbGVkOiIKK0NhbnRTZXRXb3JrZXJTdGF0ZSAgICAgICAgICAgIk9NUCB0aHJlYWQgam9pbmFibGUgc3RhdGUgc2V0dGluZyBmYWlsZWQ6IgorQ2FudFNldE1vbml0b3JTdGF0ZSAgICAgICAgICAiTW9uaXRvciB0aHJlYWQgam9pbmFibGUgc3RhdGUgc2V0dGluZyBmYWlsZWQ6IgorTm9SZXNvdXJjZXNGb3JXb3JrZXJUaHJlYWQgICAiU3lzdGVtIHVuYWJsZSB0byBhbGxvY2F0ZSBuZWNlc3NhcnkgcmVzb3VyY2VzIGZvciBPTVAgdGhyZWFkOiIKK05vUmVzb3VyY2VzRm9yTW9uaXRvclRocmVhZCAgIlN5c3RlbSB1bmFibGUgdG8gYWxsb2NhdGUgbmVjZXNzYXJ5IHJlc291cmNlcyBmb3IgdGhlIG1vbml0b3IgdGhyZWFkOiIKK0NhbnRUZXJtaW5hdGVXb3JrZXJUaHJlYWQgICAgIlVuYWJsZSB0byB0ZXJtaW5hdGUgT01QIHRocmVhZDoiCitTY2hlZHVsZUtpbmRPdXRPZlJhbmdlICAgICAgICJXcm9uZyBzY2hlZHVsZSB0eXBlICUxJGQsIHNlZSA8b21wLmg+IG9yIDxvbXBfbGliLmg+IGZpbGUgZm9yIHRoZSBsaXN0IG9mIHZhbHVlcyBzdXBwb3J0ZWQuIgorVW5rbm93blNjaGVkdWxpbmdUeXBlICAgICAgICAiVW5rbm93biBzY2hlZHVsaW5nIHR5cGUgXCIlMSRkXCIuIgorSW52YWxpZFZhbHVlICAgICAgICAgICAgICAgICAiJTEkcyB2YWx1ZSBcIiUyJHNcIiBpcyBpbnZhbGlkLiIKK1NtYWxsVmFsdWUgICAgICAgICAgICAgICAgICAgIiUxJHMgdmFsdWUgXCIlMiRzXCIgaXMgdG9vIHNtYWxsLiIKK0xhcmdlVmFsdWUgICAgICAgICAgICAgICAgICAgIiUxJHMgdmFsdWUgXCIlMiRzXCIgaXMgdG9vIGxhcmdlLiIKK1N0Z0ludmFsaWRWYWx1ZSAgICAgICAgICAgICAgIiUxJHM6IFwiJTIkc1wiIGlzIGFuIGludmFsaWQgdmFsdWU7IGlnbm9yZWQuIgorQmFyclJlbGVhc2VWYWx1ZUludmFsaWQgICAgICAiJTEkcyByZWxlYXNlIHZhbHVlIFwiJTIkc1wiIGlzIGludmFsaWQuIgorQmFyckdhdGhlclZhbHVlSW52YWxpZCAgICAgICAiJTEkcyBnYXRoZXIgdmFsdWUgXCIlMiRzXCIgaXMgaW52YWxpZC4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzIHN1cHBvcnRlZCBvbmx5IG9uIGRlYnVnIGJ1aWxkczsgaWdub3JlZC4iCitQYXJSYW5nZVN5bnRheCAgICAgICAgICAgICAgICJTeW50YXggZXJyb3I6IFVzYWdlOiAlMSRzPVsgcm91dGluZT08ZnVuYz4gfCBmaWxlbmFtZT08ZmlsZT4gfCByYW5nZT08bGI+Ojx1Yj4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifCBleGNsX3JhbmdlPTxsYj46PHViPiBdLC4uLiIKK1VuYmFsYW5jZWRRdW90ZXMgICAgICAgICAgICAgIlVuYmFsYW5jZWQgcXVvdGVzIGluICUxJHMuIgorRW1wdHlTdHJpbmcgICAgICAgICAgICAgICAgICAiRW1wdHkgc3RyaW5nIHNwZWNpZmllZCBmb3IgJTEkczsgaWdub3JlZC4iCitMb25nVmFsdWUgICAgICAgICAgICAgICAgICAgICIlMSRzIHZhbHVlIGlzIHRvbyBsb25nOyBpZ25vcmVkLiIKK0ludmFsaWRDbGF1c2UgICAgICAgICAgICAgICAgIiUxJHM6IEludmFsaWQgY2xhdXNlIGluIFwiJTIkc1wiLiIKK0VtcHR5Q2xhdXNlICAgICAgICAgICAgICAgICAgIkVtcHR5IGNsYXVzZSBpbiAlMSRzLiIKK0ludmFsaWRDaHVuayAgICAgICAgICAgICAgICAgIiUxJHMgdmFsdWUgXCIlMiRzXCIgaXMgaW52YWxpZCBjaHVuayBzaXplLiIKK0xhcmdlQ2h1bmsgICAgICAgICAgICAgICAgICAgIiUxJHMgdmFsdWUgXCIlMiRzXCIgaXMgdG8gbGFyZ2UgY2h1bmsgc2l6ZS4iCitJZ25vcmVDaHVuayAgICAgICAgICAgICAgICAgICIlMSRzIHZhbHVlIFwiJTIkc1wiIGlzIGlnbm9yZWQuIgorQ2FudEdldFByb2NGcmVxICAgICAgICAgICAgICAiQ2Fubm90IGdldCBwcm9jZXNzb3IgZnJlcXVlbmN5LCB1c2luZyB6ZXJvIEtNUF9JVFRfUFJFUEFSRV9ERUxBWS4iCitFbnZQYXJhbGxlbFdhcm4gICAgICAgICAgICAgICIlMSRzIG11c3QgYmUgc2V0IHByaW9yIHRvIGZpcnN0IHBhcmFsbGVsIHJlZ2lvbjsgaWdub3JlZC4iCitBZmZQYXJhbURlZmluZWQgICAgICAgICAgICAgICIlMSRzOiBwYXJhbWV0ZXIgaGFzIGJlZW4gc3BlY2lmaWVkIGFscmVhZHksIGlnbm9yaW5nIFwiJTIkc1wiLiIKK0FmZkludmFsaWRQYXJhbSAgICAgICAgICAgICAgIiUxJHM6IHBhcmFtZXRlciBpbnZhbGlkLCBpZ25vcmluZyBcIiUyJHNcIi4iCitBZmZNYW55UGFyYW1zICAgICAgICAgICAgICAgICIlMSRzOiB0b28gbWFueSBpbnRlZ2VyIHBhcmFtZXRlcnMgc3BlY2lmaWVkLCBpZ25vcmluZyBcIiUyJHNcIi4iCitBZmZNYW55UGFyYW1zRm9yTG9naWMgICAgICAgICIlMSRzOiB0b28gbWFueSBpbnRlZ2VyIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGZvciBsb2dpY2FsIG9yIHBoeXNpY2FsIHR5cGUsIGlnbm9yaW5nIFwiJTIkZFwiLiIKK0FmZk5vUGFyYW0gICAgICAgICAgICAgICAgICAgIiUxJHM6ICclMiRzJyB0eXBlIGRvZXMgbm90IHRha2UgYW55IGludGVnZXIgcGFyYW1ldGVycywgaWdub3JpbmcgdGhlbS4iCitBZmZOb1Byb2NMaXN0ICAgICAgICAgICAgICAgICIlMSRzOiBwcm9jbGlzdCBub3Qgc3BlY2lmaWVkIHdpdGggZXhwbGljaXQgYWZmaW5pdHkgdHlwZSwgdXNpbmcgXCJub25lXCIuIgorQWZmUHJvY0xpc3ROb1R5cGUgICAgICAgICAgICAiJTEkczogcHJvY2xpc3Qgc3BlY2lmaWVkLCBzZXR0aW5nIGFmZmluaXR5IHR5cGUgdG8gXCJleHBsaWNpdFwiLiIKK0FmZlByb2NMaXN0Tm90RXhwbGljaXQgICAgICAgIiUxJHM6IHByb2NsaXN0IHNwZWNpZmllZCB3aXRob3V0IFwiZXhwbGljaXRcIiBhZmZpbml0eSB0eXBlLCBwcm9jbGlzdCBpZ25vcmVkLiIKK0FmZlN5bnRheEVycm9yICAgICAgICAgICAgICAgIiUxJHM6IHN5bnRheCBlcnJvciwgbm90IHVzaW5nIGFmZmluaXR5LiIKK0FmZlplcm9TdHJpZGUgICAgICAgICAgICAgICAgIiUxJHM6IHJhbmdlIGVycm9yICh6ZXJvIHN0cmlkZSksIG5vdCB1c2luZyBhZmZpbml0eS4iCitBZmZTdGFydEdyZWF0ZXJFbmQgICAgICAgICAgICIlMSRzOiByYW5nZSBlcnJvciAoJTIkZCA+ICUzJGQpLCBub3QgdXNpbmcgYWZmaW5pdHkuIgorQWZmU3RyaWRlTGVzc1plcm8gICAgICAgICAgICAiJTEkczogcmFuZ2UgZXJyb3IgKCUyJGQgPCAlMyRkICYgc3RyaWRlIDwgMCksIG5vdCB1c2luZyBhZmZpbml0eS4iCitBZmZSYW5nZVRvb0JpZyAgICAgICAgICAgICAgICIlMSRzOiByYW5nZSBlcnJvciAoKCUyJGQtJTMkZCkvJTQkZCB0b28gYmlnKSwgbm90IHVzaW5nIGFmZmluaXR5LiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6ICUyJHMgaXMgZGVmaW5lZC4gJTMkcyB3aWxsIGJlIGlnbm9yZWQuIgorQWZmTm90U3VwcG9ydGVkICAgICAgICAgICAgICAiJTEkczogYWZmaW5pdHkgbm90IHN1cHBvcnRlZCwgdXNpbmcgXCJkaXNhYmxlZFwiLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IGFmZmluaXR5IG9ubHkgc3VwcG9ydGVkIGZvciBJbnRlbChSKSBwcm9jZXNzb3JzLiIKK0dldEFmZlN5c0NhbGxOb3RTdXBwb3J0ZWQgICAgIiUxJHM6IGdldGFmZmluaXR5IHN5c3RlbSBjYWxsIG5vdCBzdXBwb3J0ZWQuIgorU2V0QWZmU3lzQ2FsbE5vdFN1cHBvcnRlZCAgICAiJTEkczogc2V0YWZmaW5pdHkgc3lzdGVtIGNhbGwgbm90IHN1cHBvcnRlZC4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBwdGhyZWFkX2FmZl9zZXRfbnAgY2FsbCBub3QgZm91bmQuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogcHRocmVhZF9nZXRfbnVtX3Jlc291cmNlc19ucCBjYWxsIG5vdCBmb3VuZC4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiB0aGUgT1Mga2VybmVsIGRvZXMgbm90IHN1cHBvcnQgYWZmaW5pdHkuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogcHRocmVhZF9nZXRfbnVtX3Jlc291cmNlc19ucCByZXR1cm5lZCAlMiRkLiIKK0FmZkNhbnRHZXRNYXNrU2l6ZSAgICAgICAgICAgIiUxJHM6IGNhbm5vdCBkZXRlcm1pbmUgcHJvcGVyIGFmZmluaXR5IG1hc2sgc2l6ZS4iCitQYXJzZVNpemVJbnRXYXJuICAgICAgICAgICAgICIlMSRzPVwiJTIkc1wiOiAlMyRzLiIKK1BhcnNlRXh0cmFDaGFyc1dhcm4gICAgICAgICAgIiUxJHM6IGV4dHJhIHRyYWlsaW5nIGNoYXJhY3RlcnMgaWdub3JlZDogXCIlMiRzXCIuIgorVW5rbm93bkZvcmNlUmVkdWN0aW9uICAgICAgICAiJTEkczogdW5rbm93biBtZXRob2QgXCIlMiRzXCIuIgorVGltZXJVc2VHZXR0aW1lb2ZkYXkgICAgICAgICAiS01QX1NUQVRTX1RJTUVSOiBjbG9ja19nZXR0aW1lIGlzIHVuZGVmaW5lZCwgdXNpbmcgZ2V0dGltZW9mZGF5LiIKK1RpbWVyTmVlZE1vcmVQYXJhbSAgICAgICAgICAgIktNUF9TVEFUU19USU1FUjogXCIlMSRzXCIgbmVlZHMgYWRkaXRpb25hbCBwYXJhbWV0ZXIsIGUuZy4gJ2Nsb2NrX2dldHRpbWUsMicuIFVzaW5nIGdldHRpbWVvZmRheS4iCitUaW1lckludmFsaWRQYXJhbSAgICAgICAgICAgICJLTVBfU1RBVFNfVElNRVI6IGNsb2NrX2dldHRpbWUgcGFyYW1ldGVyIFwiJTEkc1wiIGlzIGludmFsaWQsIHVzaW5nIGdldHRpbWVvZmRheS4iCitUaW1lckdldHRpbWVGYWlsZWQgICAgICAgICAgICJLTVBfU1RBVFNfVElNRVI6IGNsb2NrX2dldHRpbWUgZmFpbGVkLCB1c2luZyBnZXR0aW1lb2ZkYXkuIgorVGltZXJVbmtub3duRnVuY3Rpb24gICAgICAgICAiS01QX1NUQVRTX1RJTUVSOiBjbG9jayBmdW5jdGlvbiB1bmtub3duIChpZ25vcmluZyB2YWx1ZSBcIiUxJHNcIikuIgorVW5rbm93blNjaGVkVHlwZURldGVjdGVkICAgICAiVW5rbm93biBzY2hlZHVsaW5nIHR5cGUgZGV0ZWN0ZWQuIgorRGlzcGF0Y2hNYW55VGhyZWFkcyAgICAgICAgICAiVG9vIG1hbnkgdGhyZWFkcyB0byB1c2UgYW5hbHl0aWNhbCBndWlkZWQgc2NoZWR1bGluZyAtIHN3aXRjaGluZyB0byBpdGVyYXRpdmUgZ3VpZGVkIHNjaGVkdWxpbmcuIgorSXR0TG9va3VwRmFpbGVkICAgICAgICAgICAgICAiaXR0bm90aWZ5OiBMb29rdXAgb2YgXCIlMSRzXCIgZnVuY3Rpb24gaW4gXCIlMiRzXCIgbGlicmFyeSBmYWlsZWQuIgorSXR0TG9hZExpYkZhaWxlZCAgICAgICAgICAgICAiaXR0bm90aWZ5OiBMb2FkaW5nIFwiJTEkc1wiIGxpYnJhcnkgZmFpbGVkLiIKK0l0dEFsbE5vdGlmRGlzYWJsZWQgICAgICAgICAgIml0dG5vdGlmeTogQWxsIGl0dCBub3RpZmljYXRpb25zIGRpc2FibGVkLiIKK0l0dE9iak5vdGlmRGlzYWJsZWQgICAgICAgICAgIml0dG5vdGlmeTogT2JqZWN0IHN0YXRlIGl0dCBub3RpZmljYXRpb25zIGRpc2FibGVkLiIKK0l0dE1hcmtOb3RpZkRpc2FibGVkICAgICAgICAgIml0dG5vdGlmeTogTWFyayBpdHQgbm90aWZpY2F0aW9ucyBkaXNhYmxlZC4iCitJdHRVbmxvYWRMaWJGYWlsZWQgICAgICAgICAgICJpdHRub3RpZnk6IFVubG9hZGluZyBcIiUxJHNcIiBsaWJyYXJ5IGZhaWxlZC4iCitDYW50Rm9ybVRoclRlYW0gICAgICAgICAgICAgICJDYW5ub3QgZm9ybSBhIHRlYW0gd2l0aCAlMSRkIHRocmVhZHMsIHVzaW5nICUyJGQgaW5zdGVhZC4iCitBY3RpdmVMZXZlbHNOZWdhdGl2ZSAgICAgICAgICJSZXF1ZXN0ZWQgbnVtYmVyIG9mIGFjdGl2ZSBwYXJhbGxlbCBsZXZlbHMgXCIlMSRkXCIgaXMgbmVnYXRpdmU7IGlnbm9yZWQuIgorQWN0aXZlTGV2ZWxzRXhjZWVkTGltaXQgICAgICAiUmVxdWVzdGVkIG51bWJlciBvZiBhY3RpdmUgcGFyYWxsZWwgbGV2ZWxzIFwiJTEkZFwiIGV4Y2VlZHMgc3VwcG9ydGVkIGxpbWl0OyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgZm9sbG93aW5nIGxpbWl0IHZhbHVlIHdpbGwgYmUgdXNlZDogXCIlMSRkXCIuIgorU2V0TGlicmFyeUluY29ycmVjdENhbGwgICAgICAia21wX3NldF9saWJyYXJ5IG11c3Qgb25seSBiZSBjYWxsZWQgZnJvbSB0aGUgdG9wIGxldmVsIHNlcmlhbCB0aHJlYWQ7IGlnbm9yZWQuIgorRmF0YWxTeXNFcnJvciAgICAgICAgICAgICAgICAiRmF0YWwgc3lzdGVtIGVycm9yIGRldGVjdGVkLiIKK091dE9mSGVhcE1lbW9yeSAgICAgICAgICAgICAgIk91dCBvZiBoZWFwIG1lbW9yeS4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJDbGVhcmluZyBfX0tNUF9SRUdJU1RFUkVEX0xJQiBlbnYgdmFyIGZhaWxlZC4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJSZWdpc3RlcmluZyBsaWJyYXJ5IHdpdGggZW52IHZhciBmYWlsZWQuIgorVXNpbmdfaW50X1ZhbHVlICAgICAgICAgICAgICAiJTEkcyB2YWx1ZSBcIiUyJGRcIiB3aWxsIGJlIHVzZWQuIgorVXNpbmdfdWludF9WYWx1ZSAgICAgICAgICAgICAiJTEkcyB2YWx1ZSBcIiUyJHVcIiB3aWxsIGJlIHVzZWQuIgorVXNpbmdfdWludDY0X1ZhbHVlICAgICAgICAgICAiJTEkcyB2YWx1ZSBcIiUyJHNcIiB3aWxsIGJlIHVzZWQuIgorVXNpbmdfc3RyX1ZhbHVlICAgICAgICAgICAgICAiJTEkcyB2YWx1ZSBcIiUyJHNcIiB3aWxsIGJlIHVzZWQuIgorTWF4VmFsdWVVc2luZyAgICAgICAgICAgICAgICAiJTEkcyBtYXhpbXVtIHZhbHVlIFwiJTIkZFwiIHdpbGwgYmUgdXNlZC4iCitNaW5WYWx1ZVVzaW5nICAgICAgICAgICAgICAgICIlMSRzIG1pbmltdW0gdmFsdWUgXCIlMiRkXCIgd2lsbCBiZSB1c2VkLiIKK01lbW9yeUFsbG9jRmFpbGVkICAgICAgICAgICAgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4iCitGaWxlTmFtZVRvb0xvbmcgICAgICAgICAgICAgICJGaWxlIG5hbWUgdG9vIGxvbmcuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiTG9jayB0YWJsZSBvdmVyZmxvdy4iCitNYW55VGhyZWFkc0ZvclRQRGlyZWN0aXZlICAgICJUb28gbWFueSB0aHJlYWRzIHRvIHVzZSB0aHJlYWRwcml2YXRlIGRpcmVjdGl2ZS4iCitBZmZpbml0eUludmFsaWRNYXNrICAgICAgICAgICIlMSRzOiBpbnZhbGlkIG1hc2suIgorV3JvbmdEZWZpbml0aW9uICAgICAgICAgICAgICAiV3JvbmcgZGVmaW5pdGlvbi4iCitUTFNTZXRWYWx1ZUZhaWxlZCAgICAgICAgICAgICJXaW5kb3dzKiBPUzogVExTIFNldCBWYWx1ZSBmYWlsZWQuIgorVExTT3V0T2ZJbmRleGVzICAgICAgICAgICAgICAiV2luZG93cyogT1M6IFRMUyBvdXQgb2YgaW5kZXhlcy4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJQRE9ORSBkaXJlY3RpdmUgbXVzdCBiZSBuZXN0ZWQgd2l0aGluIGEgRE8gZGlyZWN0aXZlLiIKK0NhbnRHZXROdW1BdmFpbENQVSAgICAgICAgICAgIkNhbm5vdCBnZXQgbnVtYmVyIG9mIGF2YWlsYWJsZSBDUFVzLiIKK0Fzc3VtZWROdW1DUFUgICAgICAgICAgICAgICAgIkFzc3VtZWQgbnVtYmVyIG9mIENQVXMgaXMgMi4iCitFcnJvckluaXRpYWxpemVBZmZpbml0eSAgICAgICJFcnJvciBpbml0aWFsaXppbmcgYWZmaW5pdHkgLSBub3QgdXNpbmcgYWZmaW5pdHkuIgorQWZmVGhyZWFkc01heU1pZ3JhdGUgICAgICAgICAiVGhyZWFkcyBtYXkgbWlncmF0ZSBhY3Jvc3MgYWxsIGF2YWlsYWJsZSBPUyBwcm9jcyAoZ3JhbnVsYXJpdHkgc2V0dGluZyB0b28gY29hcnNlKS4iCitBZmZJZ25vcmVJbnZhbGlkUHJvY0lEICAgICAgICJJZ25vcmluZyBpbnZhbGlkIE9TIHByb2MgSUQgJTEkZC4iCitBZmZOb1ZhbGlkUHJvY0lEICAgICAgICAgICAgICJObyB2YWxpZCBPUyBwcm9jIElEcyBzcGVjaWZpZWQgLSBub3QgdXNpbmcgYWZmaW5pdHkuIgorVXNpbmdGbGF0T1MgICAgICAgICAgICAgICAgICAiJTEkcyAtIHVzaW5nIFwiZmxhdFwiIE9TIDwtPiBwaHlzaWNhbCBwcm9jIG1hcHBpbmcuIgorVXNpbmdGbGF0T1NGaWxlICAgICAgICAgICAgICAiJTEkczogJTIkcyAtIHVzaW5nIFwiZmxhdFwiIE9TIDwtPiBwaHlzaWNhbCBwcm9jIG1hcHBpbmcuIgorVXNpbmdGbGF0T1NGaWxlTGluZSAgICAgICAgICAiJTEkcywgbGluZSAlMiRkOiAlMyRzIC0gdXNpbmcgXCJmbGF0XCIgT1MgPC0+IHBoeXNpY2FsIHByb2MgbWFwcGluZy4iCitGaWxlTXNnRXhpdGluZyAgICAgICAgICAgICAgICIlMSRzOiAlMiRzIC0gZXhpdGluZy4iCitGaWxlTGluZU1zZ0V4aXRpbmcgICAgICAgICAgICIlMSRzLCBsaW5lICUyJGQ6ICUzJHMgLSBleGl0aW5nLiIKK0NvbnN0cnVjdElkZW50SW52YWxpZCAgICAgICAgIkNvbnN0cnVjdCBpZGVudGlmaWVyIGludmFsaWQuIgorVGhyZWFkSWRlbnRJbnZhbGlkICAgICAgICAgICAiVGhyZWFkIGlkZW50aWZpZXIgaW52YWxpZC4iCitSVExOb3RJbml0aWFsaXplZCAgICAgICAgICAgICJydW50aW1lIGxpYnJhcnkgbm90IGluaXRpYWxpemVkLiIKK1RQQ29tbW9uQmxvY2tzSW5jb25zaXN0ICAgICAgIkluY29uc2lzdGVudCBUSFJFQURQUklWQVRFIGNvbW1vbiBibG9jayBkZWNsYXJhdGlvbnMgYXJlIG5vbi1jb25mb3JtaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZCBhcmUgdW5zdXBwb3J0ZWQuIEVpdGhlciBhbGwgdGhyZWFkcHJpdmF0ZSBjb21tb24gYmxvY2tzIG11c3QgYmUgZGVjbGFyZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWRlbnRpY2FsbHksIG9yIHRoZSBsYXJnZXN0IGluc3RhbmNlIG9mIGVhY2ggdGhyZWFkcHJpdmF0ZSBjb21tb24gYmxvY2sgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXVzdCBiZSByZWZlcmVuY2VkIGZpcnN0IGR1cmluZyB0aGUgcnVuLiIKK0NhbnRTZXRUaHJlYWRBZmZNYXNrICAgICAgICAgIkNhbm5vdCBzZXQgdGhyZWFkIGFmZmluaXR5IG1hc2suIgorQ2FudFNldFRocmVhZFByaW9yaXR5ICAgICAgICAiQ2Fubm90IHNldCB0aHJlYWQgcHJpb3JpdHkuIgorQ2FudENyZWF0ZVRocmVhZCAgICAgICAgICAgICAiQ2Fubm90IGNyZWF0ZSB0aHJlYWQuIgorQ2FudENyZWF0ZUV2ZW50ICAgICAgICAgICAgICAiQ2Fubm90IGNyZWF0ZSBldmVudC4iCitDYW50U2V0RXZlbnQgICAgICAgICAgICAgICAgICJDYW5ub3Qgc2V0IGV2ZW50LiIKK0NhbnRDbG9zZUhhbmRsZSAgICAgICAgICAgICAgIkNhbm5vdCBjbG9zZSBoYW5kbGUuIgorVW5rbm93bkxpYnJhcnlUeXBlICAgICAgICAgICAiVW5rbm93biBsaWJyYXJ5IHR5cGU6ICUxJGQuIgorUmVhcE1vbml0b3JFcnJvciAgICAgICAgICAgICAiTW9uaXRvciBkaWQgbm90IHJlYXAgcHJvcGVybHkuIgorUmVhcFdvcmtlckVycm9yICAgICAgICAgICAgICAiV29ya2VyIHRocmVhZCBmYWlsZWQgdG8gam9pbi4iCitDaGFuZ2VUaHJlYWRBZmZNYXNrRXJyb3IgICAgICJDYW5ub3QgY2hhbmdlIHRocmVhZCBhZmZpbml0eSBtYXNrLiIKK1RocmVhZHNNaWdyYXRlICAgICAgICAgICAgICAgIiUxJHM6IFRocmVhZHMgbWF5IG1pZ3JhdGUgYWNyb3NzICUyJGQgaW5uZXJtb3N0IGxldmVscyBvZiBtYWNoaW5lIgorRGVjcmVhc2VUb1RocmVhZHMgICAgICAgICAgICAiJTEkczogZGVjcmVhc2UgdG8gJTIkZCB0aHJlYWRzIgorSW5jcmVhc2VUb1RocmVhZHMgICAgICAgICAgICAiJTEkczogaW5jcmVhc2UgdG8gJTIkZCB0aHJlYWRzIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogSW50ZXJuYWwgdGhyZWFkICUyJGQgYm91bmQgdG8gT1MgcHJvYyBzZXQgJTMkcyIKK0FmZkNhcGFibGVVc2VDcHVpbmZvICAgICAgICAgIiUxJHM6IEFmZmluaXR5IGNhcGFibGUsIHVzaW5nIGNwdWluZm8gZmlsZSIKK0FmZlVzZUdsb2JDcHVpZCAgICAgICAgICAgICAgIiUxJHM6IEFmZmluaXR5IGNhcGFibGUsIHVzaW5nIGdsb2JhbCBjcHVpZCBpbmZvIgorQWZmQ2FwYWJsZVVzZUZsYXQgICAgICAgICAgICAiJTEkczogQWZmaW5pdHkgY2FwYWJsZSwgdXNpbmcgZGVmYXVsdCBcImZsYXRcIiB0b3BvbG9neSIKK0FmZk5vdENhcGFibGVVc2VMb2NDcHVpZCAgICAgIiUxJHM6IEFmZmluaXR5IG5vdCBjYXBhYmxlLCB1c2luZyBsb2NhbCBjcHVpZCBpbmZvIgorQWZmTm90Q2FwYWJsZVVzZUNwdWluZm8gICAgICAiJTEkczogQWZmaW5pdHkgbm90IGNhcGFibGUsIHVzaW5nIGNwdWluZm8gZmlsZSIKK0FmZkZsYXRUb3BvbG9neSAgICAgICAgICAgICAgIiUxJHM6IEFmZmluaXR5IG5vdCBjYXBhYmxlLCBhc3N1bW1pbmcgXCJmbGF0XCIgdG9wb2xvZ3kiCitJbml0T1NQcm9jU2V0UmVzcGVjdCAgICAgICAgICIlMSRzOiBJbml0aWFsIE9TIHByb2Mgc2V0IHJlc3BlY3RlZDogJTIkcyIKK0luaXRPU1Byb2NTZXROb3RSZXNwZWN0ICAgICAgIiUxJHM6IEluaXRpYWwgT1MgcHJvYyBzZXQgbm90IHJlc3BlY3RlZDogJTIkcyIKK0F2YWlsYWJsZU9TUHJvYyAgICAgICAgICAgICAgIiUxJHM6ICUyJGQgYXZhaWxhYmxlIE9TIHByb2NzIgorVW5pZm9ybSAgICAgICAgICAgICAgICAgICAgICAiJTEkczogVW5pZm9ybSB0b3BvbG9neSIKK05vblVuaWZvcm0gICAgICAgICAgICAgICAgICAgIiUxJHM6IE5vbnVuaWZvcm0gdG9wb2xvZ3kiCitUb3BvbG9neSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiAlMiRkIHBhY2thZ2VzIHggJTMkZCBjb3Jlcy9wa2cgeCAlNCRkIHRocmVhZHMvY29yZSAoJTUkZCB0b3RhbCBjb3JlcykiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jIHRvIHBoeXNpY2FsIHRocmVhZCBtYXAgKFtdID0+IGxldmVsIG5vdCBpbiBtYXApOiIKK09TUHJvY1RvUGFja2FnZSAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgPG4+IG1hcHMgdG8gPG4+dGggcGFja2FnZSBjb3JlIDAiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBwYWNrYWdlICUzJGQgW2NvcmUgJTQkZF0gW3RocmVhZCAlNSRkXSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIFtwYWNrYWdlICUzJGRdIFtjb3JlICU0JGRdIFt0aHJlYWQgJTUkZF0iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBbcGFja2FnZSAlMyRkXSBbY29yZSAlNCRkXSB0aHJlYWQgJTUkZCIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIFtwYWNrYWdlICUzJGRdIGNvcmUgJTQkZCBbdGhyZWFkICU1JGRdIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gcGFja2FnZSAlMyRkIFtjb3JlICU0JGRdIFt0aHJlYWQgJTUkZF0iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBbcGFja2FnZSAlMyRkXSBjb3JlICU0JGQgdGhyZWFkICU1JGQiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBwYWNrYWdlICUzJGQgY29yZSAlNCRkIFt0aHJlYWQgJTUkZF0iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBwYWNrYWdlICUzJGQgW2NvcmUgJTQkZF0gdGhyZWFkICU1JGQiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBwYWNrYWdlICUzJGQgY29yZSAlNCRkIHRocmVhZCAlNSRkIgorT1NQcm9jTWFwVG9QYWNrICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gJTMkcyIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IEludGVybmFsIHRocmVhZCAlMiRkIGNoYW5nZWQgYWZmaW5pdHkgbWFzayBmcm9tICUzJHMgdG8gJTQkcyIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIHBhY2thZ2UgJTMkZCwgQ1BVICU0JGQsIFRQVSAlNSRkIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gcGFja2FnZSAlMyRkLCBDUFUgJTQkZCIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IEhUIGVuYWJsZWQ7ICUyJGQgcGFja2FnZXM7ICUzJGQgVFBVOyAlNCRkIFRQVXMgcGVyIHBhY2thZ2UiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBIVCBkaXNhYmxlZDsgJTIkZCBwYWNrYWdlcyIKK0JhcnJpZXJzSW5EaWZmZXJlbnRPcmRlciAgICAgIlRocmVhZHMgZW5jb3VudGVyZWQgYmFycmllcnMgaW4gZGlmZmVyZW50IG9yZGVyLiAiCitGdW5jdGlvbkVycm9yICAgICAgICAgICAgICAgICJGdW5jdGlvbiAlMSRzIGZhaWxlZDoiCitUb3BvbG9neUV4dHJhICAgICAgICAgICAgICAgICIlMSRzOiAlMiRzIHBhY2thZ2VzIHggJTMkZCBjb3Jlcy9wa2cgeCAlNCRkIHRocmVhZHMvY29yZSAoJTUkZCB0b3RhbCBjb3JlcykiCitXcm9uZ01lc3NhZ2VDYXRhbG9nICAgICAgICAgICJJbmNvbXBhdGlibGUgbWVzc2FnZSBjYXRhbG9nIFwiJTEkc1wiOiBWZXJzaW9uIFwiJTIkc1wiIGZvdW5kLCB2ZXJzaW9uIFwiJTMkc1wiIGV4cGVjdGVkLiIKK1N0Z0lnbm9yZWQgICAgICAgICAgICAgICAgICAgIiUxJHM6IGlnbm9yZWQgYmVjYXVzZSAlMiRzIGhhcyBiZWVuIGRlZmluZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICUxLCAtLSBuYW1lIG9mIGlnbm9yZWQgdmFyaWFibGUsICUyIC0tIG5hbWUgb2YgdmFyaWFibGUgd2l0aCBoaWdoZXIgcHJpb3JpdHkuCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBvdmVycmlkZXMgJTMkcyBzcGVjaWZpZWQgYmVmb3JlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAlMSwgJTIgLS0gbmFtZSBhbmQgdmFsdWUgb2YgdGhlIG92ZXJyaWRpbmcgdmFyaWFibGUsICUzIC0tIG5hbWUgb2Ygb3ZlcnJpZGVuIHZhcmlhYmxlLgorCisjIC0tLSBPcGVuTVAgZXJyb3JzIGRldGVjdGVkIGF0IHJ1bnRpbWUgLS0tCisjCisjICAgICUxIGlzIHRoZSBuYW1lIG9mIE9wZW5NUCBjb25zdHJ1Y3QgKGZvcm1hdHRlZCB3aXRoICJQcmFnbWEiIGZvcm1hdCkuCisjCitDbnNCb3VuZFRvV29ya3NoYXJpbmcgICAgICAgICIlMSRzIG11c3QgYmUgYm91bmQgdG8gYSB3b3JrLXNoYXJpbmcgb3Igd29yay1xdWV1aW5nIGNvbnN0cnVjdCB3aXRoIGFuIFwib3JkZXJlZFwiIGNsYXVzZSIKK0Nuc0RldGVjdGVkRW5kICAgICAgICAgICAgICAgIkRldGVjdGVkIGVuZCBvZiAlMSRzIHdpdGhvdXQgZmlyc3QgZXhlY3V0aW5nIGEgY29ycmVzcG9uZGluZyBiZWdpbm5pbmcuIgorQ25zSXRlcmF0aW9uUmFuZ2VUb29MYXJnZSAgICAiSXRlcmF0aW9uIHJhbmdlIHRvbyBsYXJnZSBpbiAlMSRzLiIKK0Nuc0xvb3BJbmNyWmVyb1Byb2hpYml0ZWQgICAgIiUxJHMgbXVzdCBub3QgaGF2ZSBhIGxvb3AgaW5jcmVtZW50IHRoYXQgZXZhbHVhdGVzIHRvIHplcm8uIgorIworIyAgICAlMSBpcyB0aGUgbmFtZSBvZiB0aGUgZmlyc3QgT3Blbk1QIGNvbnN0cnVjdCwgJTIgLS0gdGhlIG5hbWUgb2YgdGhlIHNlY29uZCBvbmUgKGJvdGggZm9ybWF0dGVkIHdpdGggIlByYWdtYSIgZm9ybWF0KS4KKyMKK0Nuc0V4cGVjdGVkRW5kICAgICAgICAgICAgICAgIkV4cGVjdGVkIGVuZCBvZiAlMSRzOyAlMiRzLCBob3dldmVyLCBoYXMgbW9zdCByZWNlbnRseSBiZWd1biBleGVjdXRpb24uIgorQ25zSW52YWxpZE5lc3RpbmcgICAgICAgICAgICAiJTEkcyBpcyBpbmNvcnJlY3RseSBuZXN0ZWQgd2l0aGluICUyJHMiCitDbnNNdWx0aXBsZU5lc3RpbmcgICAgICAgICAgICIlMSRzIGNhbm5vdCBiZSBleGVjdXRlZCBtdWx0aXBsZSB0aW1lcyBkdXJpbmcgZXhlY3V0aW9uIG9mIG9uZSBwYXJhbGxlbCBpdGVyYXRpb24vc2VjdGlvbiBvZiAlMiRzIgorQ25zTmVzdGluZ1NhbWVOYW1lICAgICAgICAgICAiJTEkcyBpcyBpbmNvcnJlY3RseSBuZXN0ZWQgd2l0aGluICUyJHMgb2YgdGhlIHNhbWUgbmFtZSIKK0Nuc05vT3JkZXJlZENsYXVzZSAgICAgICAgICAgIiUxJHMgaXMgaW5jb3JyZWN0bHkgbmVzdGVkIHdpdGhpbiAlMiRzIHRoYXQgZG9lcyBub3QgaGF2ZSBhbiBcIm9yZGVyZWRcIiBjbGF1c2UiCitDbnNOb3RJblRhc2tDb25zdHJ1Y3QgICAgICAgICIlMSRzIGlzIGluY29ycmVjdGx5IG5lc3RlZCB3aXRoaW4gJTIkcyBidXQgbm90IHdpdGhpbiBhbnkgb2YgaXRzIFwidGFza1wiIGNvbnN0cnVjdHMiCitDbnNUaHJlYWRzQXRCYXJyaWVyICAgICAgICAgICJPbmUgdGhyZWFkIGF0ICUxJHMgd2hpbGUgYW5vdGhlciB0aHJlYWQgaXMgYXQgJTIkcy4iCisKKyMgTmV3IGVycm9ycworQ2FudENvbm5lY3QgICAgICAgICAgICAgICAgICAiQ2Fubm90IGNvbm5lY3QgdG8gJTEkcyIKK0NhbnRDb25uZWN0VXNpbmcgICAgICAgICAgICAgIkNhbm5vdCBjb25uZWN0IHRvICUxJHMgLSBVc2luZyAlMiRzIgorTGliTm90U3VwcG9ydCAgICAgICAgICAgICAgICAiJTEkcyBkb2VzIG5vdCBzdXBwb3J0ICUyJHMuIENvbnRpbnVpbmcgd2l0aG91dCB1c2luZyAlMiRzLiIKK0xpYk5vdFN1cHBvcnRGb3IgICAgICAgICAgICAgIiUxJHMgZG9lcyBub3Qgc3VwcG9ydCAlMiRzIGZvciAlMyRzLiBDb250aW51aW5nIHdpdGhvdXQgdXNpbmcgJTIkcy4iCitTdGF0aWNMaWJOb3RTdXBwb3J0ICAgICAgICAgICJTdGF0aWMgJTEkcyBkb2VzIG5vdCBzdXBwb3J0ICUyJHMuIENvbnRpbnVpbmcgd2l0aG91dCB1c2luZyAlMiRzLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIktNUF9EWU5BTUlDX01PREU9aXJtbCBjYW5ub3QgYmUgdXNlZCB3aXRoIEtNUF9VU0VfSVJNTD0wIgorSXR0VW5rbm93bkdyb3VwICAgICAgICAgICAgICAiaXR0bm90aWZ5OiBVbmtub3duIGdyb3VwIFwiJTIkc1wiIHNwZWNpZmllZCBpbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBcIiUxJHNcIi4iCitJdHRFbnZWYXJUb29Mb25nICAgICAgICAgICAgICJpdHRub3RpZnk6IEVudmlyb25tZW50IHZhcmlhYmxlIFwiJTEkc1wiIHRvbyBsb25nOiBBY3R1YWwgbGVuZ3RocyBpcyAlMiRsdSwgbWF4IGFsbG93ZWQgbGVuZ3RoIGlzICUzJGx1LiIKK0FmZlVzZUdsb2JDcHVpZEwxMSAgICAgICAgICAgIiUxJHM6IEFmZmluaXR5IGNhcGFibGUsIHVzaW5nIGdsb2JhbCBjcHVpZCBsZWFmIDExIGluZm8iCitBZmZOb3RDYXBhYmxlVXNlTG9jQ3B1aWRMMTEgICIlMSRzOiBBZmZpbml0eSBub3QgY2FwYWJsZSwgdXNpbmcgbG9jYWwgY3B1aWQgbGVhZiAxMSBpbmZvIgorQWZmSW5mb1N0ciAgICAgICAgICAgICAgICAgICAiJTEkczogJTIkcy4iCitBZmZJbmZvU3RyU3RyICAgICAgICAgICAgICAgICIlMSRzOiAlMiRzIC0gJTMkcy4iCitPU1Byb2NUb1BoeXNpY2FsVGhyZWFkTWFwICAgICIlMSRzOiBPUyBwcm9jIHRvIHBoeXNpY2FsIHRocmVhZCBtYXA6IgorQWZmVXNpbmdGbGF0T1MgICAgICAgICAgICAgICAiJTEkczogdXNpbmcgXCJmbGF0XCIgT1MgPC0+IHBoeXNpY2FsIHByb2MgbWFwcGluZy4iCitBZmZQYXJzZUZpbGVuYW1lICAgICAgICAgICAgICIlMSRzOiBwYXJzaW5nICUyJHMuIgorTXNnRXhpdGluZyAgICAgICAgICAgICAgICAgICAiJTEkcyAtIGV4aXRpbmcuIgorSW5jb21wYXRpYmxlTGlicmFyeSAgICAgICAgICAiSW5jb21wYXRpYmxlICUxJHMgbGlicmFyeSB3aXRoIHZlcnNpb24gJTIkcyBmb3VuZC4iCitJdHRGdW5jdGlvbkVycm9yICAgICAgICAgICAgICJpdHRub3RpZnk6IEZ1bmN0aW9uICUxJHMgZmFpbGVkOiIKK0l0dFVua25vd25FcnJvciAgICAgICAgICAgICAgIml0dG5vZmlmeTogRXJyb3IgIyUxJGQuIgorRW52TWlkZGxlV2FybiAgICAgICAgICAgICAgICAiJTEkcyBtdXN0IGJlIHNldCBwcmlvciB0byBmaXJzdCBwYXJhbGxlbCByZWdpb24gb3IgY2VydGFpbiBBUEkgY2FsbHM7IGlnbm9yZWQuIgorQ25zTG9ja05vdERlc3Ryb3llZCAgICAgICAgICAiTG9jayBpbml0aWFsaXplZCBhdCAlMSRzKCUyJGQpIHdhcyBub3QgZGVzdHJveWVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAlMSwgJTIsICUzLCAlNCAtLSBmaWxlLCBsaW5lLCBmdW5jLCBjb2wKK0NhbnRMb2FkQmFsVXNpbmcgICAgICAgICAgICAgIkNhbm5vdCBkZXRlcm1pbmUgbWFjaGluZSBsb2FkIGJhbGFuY2UgLSBVc2luZyAlMSRzIgorQWZmTm90Q2FwYWJsZVVzZVB0aHJlYWQgICAgICAiJTEkczogQWZmaW5pdHkgbm90IGNhcGFibGUsIHVzaW5nIHB0aHJlYWQgaW5mbyIKK0FmZlVzZVB0aHJlYWQgICAgICAgICAgICAgICAgIiUxJHM6IEFmZmluaXR5IGNhcGFibGUsIHVzaW5nIHB0aHJlYWQgaW5mbyIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIkxvYWRpbmcgXCIlMSRzXCIgbGlicmFyeSBmYWlsZWQ6IgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiTG9va3VwIG9mIFwiJTEkc1wiIGZ1bmN0aW9uIGZhaWxlZDoiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJCdWZmZXIgdG9vIHNtYWxsLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIkVycm9yICMlMSRkLiIKK050aFN5bnRheEVycm9yICAgICAgICAgICAgICAgIiUxJHM6IEludmFsaWQgc3ltYm9scyBmb3VuZC4gQ2hlY2sgdGhlIHZhbHVlIFwiJTIkc1wiLiIKK050aFNwYWNlc05vdEFsbG93ZWQgICAgICAgICAgIiUxJHM6IFNwYWNlcyBiZXR3ZWVuIGRpZ2l0cyBhcmUgbm90IGFsbG93ZWQgXCIlMiRzXCIuIgorQWZmU3RyUGFyc2VGaWxlbmFtZSAgICAgICAgICAiJTEkczogJTIkcyAtIHBhcnNpbmcgJTMkcy4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzIGNhbm5vdCBiZSBzcGVjaWZpZWQgdmlhIGttcF9zZXRfZGVmYXVsdHMoKSBvbiB0aGlzIG1hY2hpbmUgYmVjYXVzZSBpdCBoYXMgbW9yZSB0aGFuIG9uZSBwcm9jZXNzb3IgZ3JvdXAuIgorQWZmVHlwZUNhbnRVc2VNdWx0R3JvdXBzICAgICAiQ2Fubm90IHVzZSBhZmZpbml0eSB0eXBlIFwiJTEkc1wiIHdpdGggbXVsdGlwbGUgV2luZG93cyogT1MgcHJvY2Vzc29yIGdyb3VwcywgdXNpbmcgXCIlMiRzXCIuIgorQWZmR3JhbkNhbnRVc2VNdWx0R3JvdXBzICAgICAiQ2Fubm90IHVzZSBhZmZpbml0eSBncmFudWxhcml0eSBcIiUxJHNcIiB3aXRoIG11bHRpcGxlIFdpbmRvd3MqIE9TIHByb2Nlc3NvciBncm91cHMsIHVzaW5nIFwiJTIkc1wiLiIKK0FmZldpbmRvd3NQcm9jR3JvdXBNYXAgICAgICAgIiUxJHM6IE1hcHBpbmcgV2luZG93cyogT1MgcHJvY2Vzc29yIGdyb3VwIDxpPiBwcm9jIDxqPiB0byBPUyBwcm9jIDY0KjxpPis8aj4uIgorQWZmT1NQcm9jVG9Hcm91cCAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gV2luZG93cyogT1MgcHJvY2Vzc29yIGdyb3VwICUzJGQgcHJvYyAlNCRkIgorQWZmQmFsYW5jZWROb3RBdmFpbCAgICAgICAgICAiJTEkczogQWZmaW5pdHkgYmFsYW5jZWQgaXMgbm90IGF2YWlsYWJsZS4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBncmFudWxhcml0eT1jb3JlIHdpbGwgYmUgdXNlZC4iCitFbnZMb2NrV2FybiAgICAgICAgICAgICAgICAgICIlMSRzIG11c3QgYmUgc2V0IHByaW9yIHRvIGZpcnN0IE9NUCBsb2NrIGNhbGwgb3IgY3JpdGljYWwgc2VjdGlvbjsgaWdub3JlZC4iCitGdXRleE5vdFN1cHBvcnRlZCAgICAgICAgICAgICJmdXRleCBzeXN0ZW0gY2FsbCBub3Qgc3VwcG9ydGVkOyAlMSRzPSUyJHMgaWdub3JlZC4iCitBZmZHcmFuVXNpbmcgICAgICAgICAgICAgICAgICIlMSRzOiBncmFudWxhcml0eT0lMiRzIHdpbGwgYmUgdXNlZC4iCitBZmZIV1N1YnNldEludmFsaWQgICAgICAgICAgICIlMSRzOiBpbnZhbGlkIHZhbHVlIFwiJTIkc1wiLCB2YWxpZCBmb3JtYXQgaXMgXCJOPGl0ZW0+W0BOXVssLi4uXVssTnRdICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIig8aXRlbT4gY2FuIGJlIFMsIE4sIEwyLCBDLCBUICBmb3IgU29ja2V0LCBOVU1BIE5vZGUsIEwyIENhY2hlLCBDb3JlLCBUaHJlYWQpXCIuIgorQWZmSFdTdWJzZXRVbnN1cHBvcnRlZCAgICAgICAiS01QX0hXX1NVQlNFVCBpZ25vcmVkOiB1bnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUuIgorQWZmSFdTdWJzZXRNYW55Q29yZXMgICAgICAgICAiS01QX0hXX1NVQlNFVCBpZ25vcmVkOiB0b28gbWFueSBjb3JlcyByZXF1ZXN0ZWQuIgorU3ludGF4RXJyb3JVc2luZyAgICAgICAgICAgICAiJTEkczogc3ludGF4IGVycm9yLCB1c2luZyAlMiRzLiIKK0FkYXB0aXZlTm90U3VwcG9ydGVkICAgICAgICAgIiUxJHM6IEFkYXB0aXZlIGxvY2tzIGFyZSBub3Qgc3VwcG9ydGVkOyB1c2luZyBxdWV1aW5nLiIKK0VudlN5bnRheEVycm9yICAgICAgICAgICAgICAgIiUxJHM6IEludmFsaWQgc3ltYm9scyBmb3VuZC4gQ2hlY2sgdGhlIHZhbHVlIFwiJTIkc1wiLiIKK0VudlNwYWNlc05vdEFsbG93ZWQgICAgICAgICAgIiUxJHM6IFNwYWNlcyBiZXR3ZWVuIGRpZ2l0cyBhcmUgbm90IGFsbG93ZWQgXCIlMiRzXCIuIgorQm91bmRUb09TUHJvY1NldCAgICAgICAgICAgICAiJTEkczogcGlkICUyJGQgdGlkICUzJGQgdGhyZWFkICU0JGQgYm91bmQgdG8gT1MgcHJvYyBzZXQgJTUkcyIKK0Nuc0xvb3BJbmNySWxsZWdhbCAgICAgICAgICAgIiUxJHMgZXJyb3I6IHBhcmFsbGVsIGxvb3AgaW5jcmVtZW50IGFuZCBjb25kaXRpb24gYXJlIGluY29uc2lzdGVudC4iCitOb0dvbXBDYW5jZWxsYXRpb24gICAgICAgICAgICJsaWJnb21wIGNhbmNlbGxhdGlvbiBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4iCitBZmZIV1N1YnNldE5vblVuaWZvcm0gICAgICAgICJLTVBfSFdfU1VCU0VUIGlnbm9yZWQ6IG5vbi11bmlmb3JtIHRvcG9sb2d5LiIKK0FmZkhXU3Vic2V0Tm9uVGhyZWVMZXZlbCAgICAgIktNUF9IV19TVUJTRVQgaWdub3JlZDogb25seSB0aHJlZS1sZXZlbCB0b3BvbG9neSBpcyBzdXBwb3J0ZWQuIgorQWZmR3JhblRvcEdyb3VwICAgICAgICAgICAgICAiJTEkczogZ3JhbnVsYXJpdHk9JTIkcyBpcyBub3Qgc3VwcG9ydGVkIHdpdGggS01QX1RPUE9MT0dZX01FVEhPRD1ncm91cC4gVXNpbmcgXCJncmFudWxhcml0eT1maW5lXCIuIgorQWZmR3Jhbkdyb3VwVHlwZSAgICAgICAgICAgICAiJTEkczogZ3JhbnVsYXJpdHk9Z3JvdXAgaXMgbm90IHN1cHBvcnRlZCB3aXRoIEtNUF9BRkZJTklUWT0lMiRzLiBVc2luZyBcImdyYW51bGFyaXR5PWNvcmVcIi4iCitBZmZIV1N1YnNldE1hbnlTb2NrZXRzICAgICAgICJLTVBfSFdfU1VCU0VUIGlnbm9yZWQ6IHRvbyBtYW55IHNvY2tldHMgcmVxdWVzdGVkLiIKK0FmZkhXU3Vic2V0RGVwcmVjYXRlZCAgICAgICAgIktNUF9IV19TVUJTRVQgXCJvXCIgb2Zmc2V0IGRlc2lnbmF0b3IgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSBAIHByZWZpeCBmb3Igb2Zmc2V0IHZhbHVlLiIKK0FmZlVzaW5nSHdsb2MgICAgICAgICAgICAgICAgIiUxJHM6IEFmZmluaXR5IGNhcGFibGUsIHVzaW5nIGh3bG9jLiIKK0FmZklnbm9yaW5nSHdsb2MgICAgICAgICAgICAgIiUxJHM6IElnbm9yaW5nIGh3bG9jIG1lY2hhbmlzbS4iCitBZmZId2xvY0Vycm9yT2NjdXJyZWQgICAgICAgICIlMSRzOiBId2xvYyBmYWlsZWQgaW4gJTIkcy4gUmVseWluZyBvbiBpbnRlcm5hbCBhZmZpbml0eSBtZWNoYW5pc21zLiIKK0VudlNlcmlhbFdhcm4gICAgICAgICAgICAgICAgIiUxJHMgbXVzdCBiZSBzZXQgcHJpb3IgdG8gT3Blbk1QIHJ1bnRpbWUgbGlicmFyeSBpbml0aWFsaXphdGlvbjsgaWdub3JlZC4iCitFbnZWYXJEZXByZWNhdGVkICAgICAgICAgICAgICIlMSRzIHZhcmlhYmxlIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgJTIkcyBpbnN0ZWFkLiIKK1JlZE1ldGhvZE5vdFN1cHBvcnRlZCAgICAgICAgIktNUF9GT1JDRV9SRURVQ1RJT046ICUxJHMgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQ7IHVzaW5nIGNyaXRpY2FsLiIKK0FmZkhXU3Vic2V0Tm9IV0xPQyAgICAgICAgICAgIktNUF9IV19TVUJTRVQgaWdub3JlZDogdW5zdXBwb3J0ZWQgaXRlbSByZXF1ZXN0ZWQgZm9yIG5vbi1IV0xPQyB0b3BvbG9neSBtZXRob2QgKEtNUF9UT1BPTE9HWV9NRVRIT0QpIgorQWZmSFdTdWJzZXRNYW55Tm9kZXMgICAgICAgICAiS01QX0hXX1NVQlNFVCBpZ25vcmVkOiB0b28gbWFueSBOVU1BIE5vZGVzIHJlcXVlc3RlZC4iCitBZmZIV1N1YnNldE1hbnlUaWxlcyAgICAgICAgICJLTVBfSFdfU1VCU0VUIGlnbm9yZWQ6IHRvbyBtYW55IEwyIENhY2hlcyByZXF1ZXN0ZWQuIgorQWZmSFdTdWJzZXRNYW55UHJvY3MgICAgICAgICAiS01QX0hXX1NVQlNFVCBpZ25vcmVkOiB0b28gbWFueSBQcm9jcyByZXF1ZXN0ZWQuIgorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0qLSBISU5UUyAtKi0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBIaW50cy4gSGludCBtYXkgYmUgcHJpbnRlZCBhZnRlciBhIG1lc3NhZ2UuIFVzdWFsbHkgaXQgaXMgbG9uZ2VyIGV4cGxhbmF0aW9uIHRleHQgb3Igc3VnZ2VzdGlvbi4KKyMgVG8gbWFpbnRhaW4gaGludCBudW1iZXJzICh0aGV5IGFyZSB2aXNpYmxlIHRvIGN1c3RvbWVycyksIGFkZCBuZXcgaGludHMgdG8gdGhlIGVuZC4KKworU3VibWl0QnVnUmVwb3J0ICAgICAgICAgICAgICAiUGxlYXNlIHN1Ym1pdCBhIGJ1ZyByZXBvcnQgd2l0aCB0aGlzIG1lc3NhZ2UsIGNvbXBpbGUgYW5kIHJ1biAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21tYW5kcyB1c2VkLCBhbmQgbWFjaGluZSBjb25maWd1cmF0aW9uIGluZm8gaW5jbHVkaW5nIG5hdGl2ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21waWxlciBhbmQgb3BlcmF0aW5nIHN5c3RlbSB2ZXJzaW9ucy4gRmFzdGVyIHJlc3BvbnNlIHdpbGwgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2J0YWluZWQgYnkgaW5jbHVkaW5nIGFsbCBwcm9ncmFtIHNvdXJjZXMuIEZvciBpbmZvcm1hdGlvbiBvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdWJtaXR0aW5nIHRoaXMgaXNzdWUsIHBsZWFzZSBzZWUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cHM6Ly9idWdzLmxsdm0ub3JnLy4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJDaGVjayBOTFNQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLCBpdHMgdmFsdWUgaXMgXCIlMSRzXCIuIgorQ2hhbmdlU3RhY2tMaW1pdCAgICAgICAgICAgICAiUGxlYXNlIHRyeSBjaGFuZ2luZyB0aGUgc2hlbGwgc3RhY2sgbGltaXQgb3IgYWRqdXN0aW5nIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPTVBfU1RBQ0tTSVpFIGVudmlyb25tZW50IHZhcmlhYmxlLiIKK1Vuc2V0X0FMTF9USFJFQURTICAgICAgICAgICAgIkNvbnNpZGVyIHVuc2V0dGluZyBLTVBfQUxMX1RIUkVBRFMgYW5kIE9NUF9USFJFQURfTElNSVQgKGlmIGVpdGhlciBpcyBzZXQpLiIKK1NldF9BTExfVEhSRUFEUFJJVkFURSAgICAgICAgIkNvbnNpZGVyIHNldHRpbmcgS01QX0FMTF9USFJFQURQUklWQVRFIHRvIGEgdmFsdWUgbGFyZ2VyIHRoYW4gJTEkZC4iCitQb3NzaWJsZVN5c3RlbUxpbWl0T25UaHJlYWRzICJUaGlzIGNvdWxkIGFsc28gYmUgZHVlIHRvIGEgc3lzdGVtLXJlbGF0ZWQgbGltaXQgb24gdGhlIG51bWJlciBvZiB0aHJlYWRzLiIKK0R1cGxpY2F0ZUxpYnJhcnkgICAgICAgICAgICAgIlRoaXMgbWVhbnMgdGhhdCBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIE9wZW5NUCBydW50aW1lIGhhdmUgYmVlbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaW5rZWQgaW50byB0aGUgcHJvZ3JhbS4gVGhhdCBpcyBkYW5nZXJvdXMsIHNpbmNlIGl0IGNhbiBkZWdyYWRlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBlcmZvcm1hbmNlIG9yIGNhdXNlIGluY29ycmVjdCByZXN1bHRzLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgYmVzdCB0aGluZyB0byBkbyBpcyB0byBlbnN1cmUgdGhhdCBvbmx5IGEgc2luZ2xlIE9wZW5NUCBydW50aW1lIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpbmtlZCBpbnRvIHRoZSBwcm9jZXNzLCBlLmcuIGJ5IGF2b2lkaW5nIHN0YXRpYyBsaW5raW5nIG9mIHRoZSBPcGVuTVAgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnVudGltZSBpbiBhbnkgbGlicmFyeS4gQXMgYW4gdW5zYWZlLCB1bnN1cHBvcnRlZCwgdW5kb2N1bWVudGVkIHdvcmthcm91bmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieW91IGNhbiBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEtNUF9EVVBMSUNBVEVfTElCX09LPVRSVUUgdG8gYWxsb3cgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHByb2dyYW0gdG8gY29udGludWUgdG8gZXhlY3V0ZSwgYnV0IHRoYXQgbWF5IGNhdXNlIGNyYXNoZXMgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2lsZW50bHkgcHJvZHVjZSBpbmNvcnJlY3QgcmVzdWx0cy4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBzZWUgaHR0cDovL29wZW5tcC5sbHZtLm9yZy8iCitOYW1lQ29tZXNGcm9tX0NQVUlORk9fRklMRSAgICJUaGlzIG5hbWUgaXMgc3BlY2lmaWVkIGluIGVudmlyb25tZW50IHZhcmlhYmxlIEtNUF9DUFVJTkZPX0ZJTEUuIgorTm90RW5vdWdoTWVtb3J5ICAgICAgICAgICAgICAiU2VlbXMgYXBwbGljYXRpb24gcmVxdWlyZWQgdG9vIG11Y2ggbWVtb3J5LiIKK1ZhbGlkQm9vbFZhbHVlcyAgICAgICAgICAgICAgIlVzZSBcIjBcIiwgXCJGQUxTRVwiLiBcIi5GLlwiLCBcIm9mZlwiLCBcIm5vXCIgYXMgZmFsc2UgdmFsdWVzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIjFcIiwgXCJUUlVFXCIsIFwiLlQuXCIsIFwib25cIiwgXCJ5ZXNcIiBhcyB0cnVlIHZhbHVlcy4iCitCdWZmZXJPdmVyZmxvdyAgICAgICAgICAgICAgICJQZXJoYXBzIHRvbyBtYW55IHRocmVhZHMuIgorUnVubmluZ0F0TWF4UHJpb3JpdHkgICAgICAgICAiRGVjcmVhc2UgcHJpb3JpdHkgb2YgYXBwbGljYXRpb24uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgd2lsbCBhbGxvdyB0aGUgbW9uaXRvciB0aHJlYWQgcnVuIGF0IGhpZ2hlciBwcmlvcml0eSB0aGFuIG90aGVyIHRocmVhZHMuIgorQ2hhbmdlTW9uaXRvclN0YWNrU2l6ZSAgICAgICAiVHJ5IGNoYW5naW5nIEtNUF9NT05JVE9SX1NUQUNLU0laRSBvciB0aGUgc2hlbGwgc3RhY2sgbGltaXQuIgorQ2hhbmdlV29ya2VyU3RhY2tTaXplICAgICAgICAiVHJ5IGNoYW5naW5nIE9NUF9TVEFDS1NJWkUgYW5kL29yIHRoZSBzaGVsbCBzdGFjayBsaW1pdC4iCitJbmNyZWFzZVdvcmtlclN0YWNrU2l6ZSAgICAgICJUcnkgaW5jcmVhc2luZyBPTVBfU1RBQ0tTSVpFIG9yIHRoZSBzaGVsbCBzdGFjayBsaW1pdC4iCitEZWNyZWFzZVdvcmtlclN0YWNrU2l6ZSAgICAgICJUcnkgZGVjcmVhc2luZyBPTVBfU1RBQ0tTSVpFLiIKK0RlY3JlYXNlX05VTV9USFJFQURTICAgICAgICAgIlRyeSBkZWNyZWFzaW5nIHRoZSB2YWx1ZSBvZiBPTVBfTlVNX1RIUkVBRFMuIgorSW5jcmVhc2VNb25pdG9yU3RhY2tTaXplICAgICAiVHJ5IGluY3JlYXNpbmcgS01QX01PTklUT1JfU1RBQ0tTSVpFLiIKK0RlY3JlYXNlTW9uaXRvclN0YWNrU2l6ZSAgICAgIlRyeSBkZWNyZWFzaW5nIEtNUF9NT05JVE9SX1NUQUNLU0laRS4iCitEZWNyZWFzZU51bWJlck9mVGhyZWFkc0luVXNlICJUcnkgZGVjcmVhc2luZyB0aGUgbnVtYmVyIG9mIHRocmVhZHMgaW4gdXNlIHNpbXVsdGFuZW91c2x5LiIKK0RlZmF1bHRTY2hlZHVsZUtpbmRVc2VkICAgICAgIldpbGwgdXNlIGRlZmF1bHQgc2NoZWR1bGUgdHlwZSAoJTEkcykuIgorR2V0TmV3ZXJMaWJyYXJ5ICAgICAgICAgICAgICAiSXQgY291bGQgYmUgYSByZXN1bHQgb2YgdXNpbmcgYW4gb2xkZXIgT01QIGxpYnJhcnkgd2l0aCBhIG5ld2VyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBpbGVyIG9yIG1lbW9yeSBjb3JydXB0aW9uLiBZb3UgbWF5IGNoZWNrIHRoZSBwcm9wZXIgT01QIGxpYnJhcnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXMgbGlua2VkIHRvIHRoZSBhcHBsaWNhdGlvbi4iCitDaGVja0VudlZhciAgICAgICAgICAgICAgICAgICJDaGVjayAlMSRzIGVudmlyb25tZW50IHZhcmlhYmxlLCBpdHMgdmFsdWUgaXMgXCIlMiRzXCIuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiWW91IG1heSB3YW50IHRvIHVzZSBhbiAlMSRzIGxpYnJhcnkgdGhhdCBzdXBwb3J0cyAlMiRzIGludGVyZmFjZSB3aXRoIHZlcnNpb24gJTMkcy4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJZb3UgbWF5IHdhbnQgdG8gdXNlIGFuICUxJHMgbGlicmFyeSB3aXRoIHZlcnNpb24gJTIkcy4iCitCYWRFeGVGb3JtYXQgICAgICAgICAgICAgICAgICJTeXN0ZW0gZXJyb3IgIzE5MyBpcyBcIkJhZCBmb3JtYXQgb2YgRVhFIG9yIERMTCBmaWxlXCIuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzdWFsbHkgaXQgbWVhbnMgdGhlIGZpbGUgaXMgZm91bmQsIGJ1dCBpdCBpcyBjb3JydXB0ZWQgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYSBmaWxlIGZvciBhbm90aGVyIGFyY2hpdGVjdHVyZS4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hlY2sgd2hldGhlciBcIiUxJHNcIiBpcyBhIGZpbGUgZm9yICUyJHMgYXJjaGl0ZWN0dXJlLiIKK1N5c3RlbUxpbWl0T25UaHJlYWRzICAgICAgICAgIlN5c3RlbS1yZWxhdGVkIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgdGhyZWFkcy4iCisKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGVuZCBvZiBmaWxlICMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXAuaC52YXIgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcC5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGJkODkwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXAuaC52YXIKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBpbmNsdWRlLzMwL29tcC5oLnZhcgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIF9fT01QX0gKKyMgICBkZWZpbmUgX19PTVBfSAorCisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX01BSk9SICAgIEBMSUJPTVBfVkVSU0lPTl9NQUpPUkAKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fTUlOT1IgICAgQExJQk9NUF9WRVJTSU9OX01JTk9SQAorIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9CVUlMRCAgICBATElCT01QX1ZFUlNJT05fQlVJTERACisjICAgZGVmaW5lIEtNUF9CVUlMRF9EQVRFICAgICAgICJATElCT01QX0JVSUxEX0RBVEVAIgorCisjICAgaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyMgICBlbmRpZgorCisjICAgICAgIGRlZmluZSBvbXBfc2V0X251bV90aHJlYWRzICAgICAgICAgIG9tcGNfc2V0X251bV90aHJlYWRzCisjICAgICAgIGRlZmluZSBvbXBfc2V0X2R5bmFtaWMgICAgICAgICAgICAgIG9tcGNfc2V0X2R5bmFtaWMKKyMgICAgICAgZGVmaW5lIG9tcF9zZXRfbmVzdGVkICAgICAgICAgICAgICAgb21wY19zZXRfbmVzdGVkCisjICAgICAgIGRlZmluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzICAgIG9tcGNfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisjICAgICAgIGRlZmluZSBvbXBfc2V0X3NjaGVkdWxlICAgICAgICAgICAgIG9tcGNfc2V0X3NjaGVkdWxlCisjICAgICAgIGRlZmluZSBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0gIG9tcGNfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyMgICAgICAgZGVmaW5lIG9tcF9nZXRfdGVhbV9zaXplICAgICAgICAgICAgb21wY19nZXRfdGVhbV9zaXplCisKKworIyAgICAgICBkZWZpbmUga21wX3NldF9zdGFja3NpemUgICAgICAgICAgICBrbXBjX3NldF9zdGFja3NpemUKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfc3RhY2tzaXplX3MgICAgICAgICAga21wY19zZXRfc3RhY2tzaXplX3MKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfYmxvY2t0aW1lICAgICAgICAgICAga21wY19zZXRfYmxvY2t0aW1lCisjICAgICAgIGRlZmluZSBrbXBfc2V0X2xpYnJhcnkgICAgICAgICAgICAgIGttcGNfc2V0X2xpYnJhcnkKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfZGVmYXVsdHMgICAgICAgICAgICAga21wY19zZXRfZGVmYXVsdHMKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jICAga21wY19zZXRfYWZmaW5pdHlfbWFza19wcm9jCisjICAgICAgIGRlZmluZSBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jIGttcGNfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisjICAgICAgIGRlZmluZSBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyAgIGttcGNfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworCisjICAgICAgIGRlZmluZSBrbXBfbWFsbG9jICAgICAgICAgICAgICAgICAgIGttcGNfbWFsbG9jCisjICAgICAgIGRlZmluZSBrbXBfY2FsbG9jICAgICAgICAgICAgICAgICAgIGttcGNfY2FsbG9jCisjICAgICAgIGRlZmluZSBrbXBfcmVhbGxvYyAgICAgICAgICAgICAgICAgIGttcGNfcmVhbGxvYworIyAgICAgICBkZWZpbmUga21wX2ZyZWUgICAgICAgICAgICAgICAgICAgICBrbXBjX2ZyZWUKKworCisjICAgaWYgZGVmaW5lZChfV0lOMzIpCisjICAgICAgIGRlZmluZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04gX19jZGVjbAorIyAgIGVsc2UKKyMgICAgICAgZGVmaW5lIF9fS0FJX0tNUENfQ09OVkVOVElPTgorIyAgIGVuZGlmCisKKyAgICAvKiBzY2hlZHVsZSBraW5kIGNvbnN0YW50cyAqLworICAgIHR5cGVkZWYgZW51bSBvbXBfc2NoZWRfdCB7CisJb21wX3NjaGVkX3N0YXRpYyAgPSAxLAorCW9tcF9zY2hlZF9keW5hbWljID0gMiwKKwlvbXBfc2NoZWRfZ3VpZGVkICA9IDMsCisJb21wX3NjaGVkX2F1dG8gICAgPSA0CisgICAgfSBvbXBfc2NoZWRfdDsKKworICAgIC8qIHNldCBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbnVtX3RocmVhZHMgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfZHluYW1pYyAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbmVzdGVkICAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfc2NoZWR1bGUgICAgICAgICAgKG9tcF9zY2hlZF90LCBpbnQpOworCisgICAgLyogcXVlcnkgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X251bV90aHJlYWRzICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfZHluYW1pYyAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9uZXN0ZWQgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X21heF90aHJlYWRzICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfdGhyZWFkX251bSAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9udW1fcHJvY3MgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5fcGFyYWxsZWwgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pbl9maW5hbCAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9hY3RpdmVfbGV2ZWwgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9sZXZlbCAgICAgICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtIChpbnQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RlYW1fc2l6ZSAgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfdGhyZWFkX2xpbWl0ICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfc2NoZWR1bGUgICAgICAgICAgICAob21wX3NjaGVkX3QgKiwgaW50ICopOworCisgICAgLyogbG9jayBBUEkgZnVuY3Rpb25zICovCisgICAgdHlwZWRlZiBzdHJ1Y3Qgb21wX2xvY2tfdCB7CisgICAgICAgIHZvaWQgKiBfbGs7CisgICAgfSBvbXBfbG9ja190OworCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pbml0X2xvY2sgICAgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbG9jayAgICAgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF91bnNldF9sb2NrICAgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9kZXN0cm95X2xvY2sgKG9tcF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF90ZXN0X2xvY2sgICAgKG9tcF9sb2NrX3QgKik7CisKKyAgICAvKiBuZXN0ZWQgbG9jayBBUEkgZnVuY3Rpb25zICovCisgICAgdHlwZWRlZiBzdHJ1Y3Qgb21wX25lc3RfbG9ja190IHsKKyAgICAgICAgdm9pZCAqIF9sazsKKyAgICB9IG9tcF9uZXN0X2xvY2tfdDsKKworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5pdF9uZXN0X2xvY2sgICAgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9uZXN0X2xvY2sgICAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF91bnNldF9uZXN0X2xvY2sgICAob21wX25lc3RfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZGVzdHJveV9uZXN0X2xvY2sgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3Rlc3RfbmVzdF9sb2NrICAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisKKyAgICAvKiB0aW1lIEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gZG91YmxlIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF93dGltZSAodm9pZCk7CisgICAgZXh0ZXJuIGRvdWJsZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfd3RpY2sgKHZvaWQpOworCisjICAgaW5jbHVkZSA8c3RkbGliLmg+CisgICAgLyoga21wIEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9zdGFja3NpemUgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3N0YWNrc2l6ZSAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gc2l6ZV90IF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9zdGFja3NpemVfcyAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3N0YWNrc2l6ZV9zICAgICAgICAoc2l6ZV90KTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9ibG9ja3RpbWUgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2xpYnJhcnkgICAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYmxvY2t0aW1lICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnkgICAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3NlcmlhbCAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0ICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9kZWZhdWx0cyAgICAgICAgICAgKGNoYXIgY29uc3QgKik7CisKKyAgICAvKiBhZmZpbml0eSBBUEkgZnVuY3Rpb25zICovCisgICAgdHlwZWRlZiB2b2lkICoga21wX2FmZmluaXR5X21hc2tfdDsKKworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2FmZmluaXR5ICAgICAgICAgICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2FmZmluaXR5ICAgICAgICAgICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrICAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MgICAoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jIChpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jICAgKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKKworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfbWFsbG9jICAoc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2FsaWduZWRfbWFsbG9jICAoc2l6ZV90LCBzaXplX3QpOworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfY2FsbG9jICAoc2l6ZV90LCBzaXplX3QpOworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfcmVhbGxvYyAodm9pZCAqLCBzaXplX3QpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZnJlZSAgICAodm9pZCAqKTsKKworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3dhcm5pbmdzX29uKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3dhcm5pbmdzX29mZih2b2lkKTsKKworIyAgIHVuZGVmIF9fS0FJX0tNUENfQ09OVkVOVElPTgorCisgICAgLyogV2FybmluZzoKKyAgICAgICBUaGUgZm9sbG93aW5nIHR5cGVkZWZzIGFyZSBub3Qgc3RhbmRhcmQsIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLgorICAgICovCisgICAgdHlwZWRlZiBpbnQgICAgIG9tcF9pbnRfdDsKKyAgICB0eXBlZGVmIGRvdWJsZSAgb21wX3d0aW1lX3Q7CisKKyMgICBpZmRlZiBfX2NwbHVzcGx1cworICAgIH0KKyMgICBlbmRpZgorCisjZW5kaWYgLyogX19PTVBfSCAqLworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcF9saWIuZi52YXIgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcF9saWIuZi52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk4ZGY4ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wX2xpYi5mLnZhcgpAQCAtMCwwICsxLDY0NCBAQAorISBpbmNsdWRlLzMwL29tcF9saWIuZi52YXIKKworIQorIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishLy8KKyEvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCishLy8KKyEvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCishLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCishLy8KKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIQorCishKioqCishKioqIFNvbWUgb2YgdGhlIGRpcmVjdGl2ZXMgZm9yIHRoZSBmb2xsb3dpbmcgcm91dGluZSBleHRlbmQgcGFzdCBjb2x1bW4gNzIsCishKioqIHNvIHByb2Nlc3MgdGhpcyBmaWxlIGluIDEzMi1jb2x1bW4gbW9kZS4KKyEqKioKKworIWRlYyQgZml4ZWRmb3JtbGluZXNpemU6MTMyCisKKyAgICAgIG1vZHVsZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9pbnRlZ2VyX2tpbmQgICAgICAgPSA0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9naWNhbF9raW5kICAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3JlYWxfa2luZCAgICAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2tpbmQgICAgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX25lc3RfbG9ja19raW5kICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfa2luZCAgICAgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3BvaW50ZXJfa2luZCAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9hZmZpbml0eV9tYXNrX2tpbmQgPSBpbnRfcHRyX2tpbmQoKQorCisgICAgICBlbmQgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgbW9kdWxlIG9tcF9saWIKKworICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9tYWpvciA9IEBMSUJPTVBfVkVSU0lPTl9NQUpPUkAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21pbm9yID0gQExJQk9NUF9WRVJTSU9OX01JTk9SQAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fYnVpbGQgPSBATElCT01QX1ZFUlNJT05fQlVJTERACisgICAgICAgIGNoYXJhY3RlcigqKSwgcGFyYW1ldGVyIDo6IGttcF9idWlsZF9kYXRlICAgID0gJ0BMSUJPTVBfQlVJTERfREFURUAnCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBvcGVubXBfdmVyc2lvbiAgICA9IEBMSUJPTVBfT01QX1lFQVJfTU9OVEhACisKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9zdGF0aWMgID0gMQorICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2R5bmFtaWMgPSAyCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZ3VpZGVkICA9IDMKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9hdXRvICAgID0gNAorCisgICAgICAgIGludGVyZmFjZQorCishICAgICAgICAgKioqCishICAgICAgICAgKioqIG9tcF8qIGVudHJ5IHBvaW50cworISAgICAgICAgICoqKgorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzKG50aHJlYWRzKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbnRocmVhZHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYyhlbmFibGUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBlbmFibGUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQoZW5hYmxlKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgZW5hYmxlCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3Byb2NzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX3BhcmFsbGVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9keW5hbWljKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfZHluYW1pYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfbmVzdGVkCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9saW1pdAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdAorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKG1heF9sZXZlbHMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtYXhfbGV2ZWxzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9sZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKGxldmVsKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbGV2ZWwKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUobGV2ZWwpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsZXZlbAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpIGtpbmQKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbW9kaWZpZXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtb2RpZmllcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUoKQorICAgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aW1lCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sgKCkKKyAgICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGljaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfdGVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfdGVzdF9uZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jaworCishICAgICAgICAgKioqCishICAgICAgICAgKioqIGttcF8qIGVudHJ5IHBvaW50cworISAgICAgICAgICoqKgorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZShzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3Moc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUobXNlYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1zZWMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsKCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kKCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCgpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5KGxpYm51bSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxpYm51bQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzKHN0cmluZykKKyAgICAgICAgICAgIGNoYXJhY3RlciooKikgc3RyaW5nCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYmxvY2t0aW1lCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9saWJyYXJ5CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eShtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkobWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHkKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sobWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayhtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9tYWxsb2Moc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9tYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9tYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9hbGlnbmVkX21hbGxvYyhzaXplLCBhbGlnbm1lbnQpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfYWxpZ25lZF9tYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgYWxpZ25tZW50CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9hbGlnbmVkX21hbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2NhbGxvYyhuZWxlbSwgZWxzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2NhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIG5lbGVtCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgZWxzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9jYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9yZWFsbG9jKHB0ciwgc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9yZWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIHB0cgorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3JlYWxsb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2ZyZWUocHRyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkgcHRyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2ZyZWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbigpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbgorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZigpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYKKworICAgICAgICBlbmQgaW50ZXJmYWNlCisKKyFkZWMkIGlmIGRlZmluZWQoX1dJTjMyKQorIWRlYyQgICBpZiBkZWZpbmVkKF9XSU42NCkgLm9yLiBkZWZpbmVkKF9NX0FNRDY0KQorCishKioqCishKioqIFRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBtdXN0IGJlIGluIHVwcGVyY2FzZSwgZXZlbiBpZiB0aGUgL1Fsb3dlcmNhc2UKKyEqKiogb3B0aW9uIGlzIHNwZWNpZmllZC4gIFRoZSBhbGlhcyBhdHRyaWJ1dGUgZW5zdXJlcyB0aGF0IHRoZSBzcGVjaWZpZWQKKyEqKiogc3RyaW5nIGlzIHVzZWQgYXMgdGhlIGVudHJ5IHBvaW50LgorISoqKgorISoqKiBPbiB0aGUgV2luZG93cyogT1MgSUEtMzIgYXJjaGl0ZWN0dXJlLCB0aGUgRm9ydHJhbiBlbnRyeSBwb2ludHMgaGF2ZSBhbgorISoqKiB1bmRlcnNjb3JlIHByZXBlbmRlZC4gIE9uIHRoZSBXaW5kb3dzKiBPUyBJbnRlbChSKSA2NAorISoqKiBhcmNoaXRlY3R1cmUsIG5vIHVuZGVyc2NvcmUgaXMgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX05VTV9USFJFQURTJyA6OiBvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX0RZTkFNSUMnIDo6IG9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9ORVNURUQnIDo6IG9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9USFJFQURTJyA6OiBvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX01BWF9USFJFQURTJyA6OiBvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RIUkVBRF9OVU0nIDo6IG9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9OVU1fUFJPQ1MnIDo6IG9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfSU5fUEFSQUxMRUwnIDo6IG9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9EWU5BTUlDJyA6OiBvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTkVTVEVEJyA6OiBvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9USFJFQURfTElNSVQnIDo6IG9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX01BWF9BQ1RJVkVfTEVWRUxTJyA6OiBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX01BWF9BQ1RJVkVfTEVWRUxTJyA6OiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0xFVkVMJyA6OiBvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0FDVElWRV9MRVZFTCcgOjogb21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTScgOjogb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RFQU1fU0laRScgOjogb21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfU0NIRURVTEUnIDo6IG9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfU0NIRURVTEUnIDo6IG9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfV1RJTUUnIDo6IG9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfV1RJQ0snIDo6IG9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9jaycgOjogb21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbG9jaycgOjogb21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9sb2NrJyA6OiBvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9sb2NrJyA6OiBvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbG9jaycgOjogb21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbmVzdF9sb2NrJyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X25lc3RfbG9jaycgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X25lc3RfbG9jaycgOjogb21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9uZXN0X2xvY2snIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X25lc3RfbG9jaycgOjogb21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfU1RBQ0tTSVpFJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfU1RBQ0tTSVpFX1MnOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0JMT0NLVElNRSc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfU0VSSUFMJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQnOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQnOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX1NUQUNLU0laRSc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX1NUQUNLU0laRV9TJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9CTE9DS1RJTUUnOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9MSUJSQVJZJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0FGRklOSVRZJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWSc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQUZGSU5JVFlfTUFYX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfQ1JFQVRFX0FGRklOSVRZX01BU0snOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9ERVNUUk9ZX0FGRklOSVRZX01BU0snOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX01BTExPQyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9BTElHTkVEX01BTExPQyc6OmttcF9hbGlnbmVkX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0NBTExPQyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9SRUFMTE9DJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9GUkVFJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9XQVJOSU5HU19PTic6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfV0FSTklOR1NfT0ZGJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgICBlbHNlCisKKyEqKioKKyEqKiogT24gV2luZG93cyogT1MgSUEtMzIgYXJjaGl0ZWN0dXJlLCB0aGUgRm9ydHJhbiBlbnRyeSBwb2ludHMgaGF2ZSBhbiB1bmRlcnNjb3JlIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX0RZTkFNSUMnIDo6IG9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfTkVTVEVEJyA6OiBvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX01BWF9USFJFQURTJyA6OiBvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9USFJFQURfTlVNJyA6OiBvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9QUk9DUycgOjogb21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfSU5fUEFSQUxMRUwnIDo6IG9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfRFlOQU1JQycgOjogb21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9ORVNURUQnIDo6IG9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9USFJFQURfTElNSVQnIDo6IG9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9NQVhfQUNUSVZFX0xFVkVMUycgOjogb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0xFVkVMJyA6OiBvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9BQ1RJVkVfTEVWRUwnIDo6IG9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNJyA6OiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RFQU1fU0laRScgOjogb21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX1NDSEVEVUxFJyA6OiBvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9TQ0hFRFVMRScgOjogb21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfV1RJTUUnIDo6IG9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1dUSUNLJyA6OiBvbXBfZ2V0X3d0aWNrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9sb2NrJyA6OiBvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbG9jaycgOjogb21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbG9jaycgOjogb21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X2xvY2snIDo6IG9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbG9jaycgOjogb21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X25lc3RfbG9jaycgOjogb21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbmVzdF9sb2NrJyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RfbG9jaycgOjogb21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbmVzdF9sb2NrJyA6OiBvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbmVzdF9sb2NrJyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfU1RBQ0tTSVpFJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1NUQUNLU0laRV9TJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQkxPQ0tUSU1FJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfU0VSSUFMJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5EJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfVEhST1VHSFBVVCc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9TVEFDS1NJWkUnOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfU1RBQ0tTSVpFX1MnOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9CTE9DS1RJTUUnOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfTElCUkFSWSc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQUZGSU5JVFknOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9BRkZJTklUWSc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0FGRklOSVRZX01BWF9QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9DUkVBVEVfQUZGSU5JVFlfTUFTSyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9ERVNUUk9ZX0FGRklOSVRZX01BU0snOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9NQUxMT0MnOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0FMSUdORURfTUFMTE9DJzo6a21wX2FsaWduZWRfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0NBTExPQyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfUkVBTExPQyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0ZSRUUnOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9XQVJOSU5HU19PTic6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1dBUk5JTkdTX09GRic6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkICAgZW5kaWYKKyFkZWMkIGVuZGlmCisKKyFkZWMkIGlmIGRlZmluZWQoX19saW51eCkKKworISoqKgorISoqKiBUaGUgTGludXgqIE9TIGVudHJ5IHBvaW50cyBhcmUgaW4gbG93ZXJjYXNlLCB3aXRoIGFuIHVuZGVyc2NvcmUgYXBwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbnVtX3RocmVhZHNfJzo6b21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9keW5hbWljXyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9uZXN0ZWRfJzo6b21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbnVtX3RocmVhZHNfJzo6b21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9tYXhfdGhyZWFkc18nOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RocmVhZF9udW1fJzo6b21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV9wcm9jc18nOjpvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luX3BhcmFsbGVsXyc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9keW5hbWljXyc6Om9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9uZXN0ZWRfJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGhyZWFkX2xpbWl0Xyc6Om9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9sZXZlbF8nOjpvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2FjdGl2ZV9sZXZlbF8nOjpvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtXyc6Om9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90ZWFtX3NpemVfJzo6b21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfc2NoZWR1bGVfJzo6b21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9zY2hlZHVsZV8nOjpvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3d0aW1lXyc6Om9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfd3RpY2tfJzo6b21wX2dldF93dGljaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9sb2NrXyc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9sb2NrXyc6Om9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X2xvY2tfJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X2xvY2tfJzo6b21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbmVzdF9sb2NrXyc6Om9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbmVzdF9sb2NrXyc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9uZXN0X2xvY2tfJzo6b21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9uZXN0X2xvY2tfJzo6b21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbmVzdF9sb2NrXyc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3N0YWNrc2l6ZV8nOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9zdGFja3NpemVfc18nOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2Jsb2NrdGltZV8nOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3NlcmlhbF8nOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF8nOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV8nOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfc3RhY2tzaXplXyc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYmxvY2t0aW1lXyc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2xpYnJhcnlfJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2FmZmluaXR5Xyc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9hZmZpbml0eV9tYXhfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrXyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfbWFsbG9jXyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9hbGlnbmVkX21hbGxvY18nOjprbXBfYWxpZ25lZF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9jYWxsb2NfJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3JlYWxsb2NfJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9mcmVlXyc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfd2FybmluZ3Nfb25fJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF93YXJuaW5nc19vZmZfJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgZW5kaWYKKworIWRlYyQgaWYgZGVmaW5lZChfX0FQUExFX18pCisKKyEqKioKKyEqKiogVGhlIE1hYyBlbnRyeSBwb2ludHMgYXJlIGluIGxvd2VyY2FzZSwgd2l0aCBhbiBib3RoIGFuIHVuZGVyc2NvcmUKKyEqKiogYXBwZW5kZWQgYW5kIGFuIHVuZGVyc2NvcmUgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9udW1fdGhyZWFkc18nOjpvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9keW5hbWljXyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdGVkXyc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9udW1fdGhyZWFkc18nOjpvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9tYXhfdGhyZWFkc18nOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90aHJlYWRfbnVtXyc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3Byb2NzXyc6Om9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luX3BhcmFsbGVsXyc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfZHluYW1pY18nOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X25lc3RlZF8nOjpvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGhyZWFkX2xpbWl0Xyc6Om9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9sZXZlbF8nOjpvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9hY3RpdmVfbGV2ZWxfJzo6b21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW1fJzo6b21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90ZWFtX3NpemVfJzo6b21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X3NjaGVkdWxlXyc6Om9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3NjaGVkdWxlXyc6Om9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3d0aW1lXyc6Om9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3d0aWNrXyc6Om9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X2xvY2tfJzo6b21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbG9ja18nOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbG9ja18nOjpvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X2xvY2tfJzo6b21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X25lc3RfbG9ja18nOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9uZXN0X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9uZXN0X2xvY2tfJzo6b21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbmVzdF9sb2NrXyc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9uZXN0X2xvY2tfJzo6b21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3N0YWNrc2l6ZV8nOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfc3RhY2tzaXplX3NfJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfYmxvY2t0aW1lXyc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3NlcmlhbF8nOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF8nOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV8nOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X3N0YWNrc2l6ZV8nOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfc3RhY2tzaXplX3NfJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYmxvY2t0aW1lXyc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9saWJyYXJ5Xyc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfYWZmaW5pdHlfJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYWZmaW5pdHlfJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9jcmVhdGVfYWZmaW5pdHlfbWFza18nOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrXyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX21hbGxvY18nOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2FsaWduZWRfbWFsbG9jXyc6OmttcF9hbGlnbmVkX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9jYWxsb2NfJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9yZWFsbG9jXyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2ZyZWVfJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfd2FybmluZ3Nfb25fJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfd2FybmluZ3Nfb2ZmXyc6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkIGVuZGlmCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYgorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcF9saWIuZjkwLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wX2xpYi5mOTAudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNTM5YTEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcF9saWIuZjkwLnZhcgpAQCAtMCwwICsxLDM2NSBAQAorISBpbmNsdWRlLzMwL29tcF9saWIuZjkwLnZhcgorCishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKyAgICAgIG1vZHVsZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgdXNlLCBpbnRyaW5zaWMgOjogaXNvX2NfYmluZGluZworCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfaW50ZWdlcl9raW5kICAgICAgID0gY19pbnQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2dpY2FsX2tpbmQgICAgICAgPSA0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcmVhbF9raW5kICAgICAgICAgID0gY19mbG9hdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2RvdWJsZV9raW5kICAgICAgICA9IGNfZG91YmxlCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9ja19raW5kICAgICAgICAgID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX25lc3RfbG9ja19raW5kICAgICA9IGNfaW50cHRyX3QKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9raW5kICAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3NpemVfdF9raW5kICAgICAgICA9IGNfc2l6ZV90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfYWZmaW5pdHlfbWFza19raW5kID0gY19pbnRwdHJfdAorCisgICAgICBlbmQgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgbW9kdWxlIG9tcF9saWIKKworICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBvcGVubXBfdmVyc2lvbiAgICA9IEBMSUJPTVBfT01QX1lFQVJfTU9OVEhACisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9tYWpvciA9IEBMSUJPTVBfVkVSU0lPTl9NQUpPUkAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21pbm9yID0gQExJQk9NUF9WRVJTSU9OX01JTk9SQAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fYnVpbGQgPSBATElCT01QX1ZFUlNJT05fQlVJTERACisgICAgICAgIGNoYXJhY3RlcigqKSAgICAgICAgICAgICAgIGttcF9idWlsZF9kYXRlCisgICAgICAgIHBhcmFtZXRlcigga21wX2J1aWxkX2RhdGUgPSAnQExJQk9NUF9CVUlMRF9EQVRFQCcgKQorCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfc3RhdGljICA9IDEKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9keW5hbWljID0gMgorICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2d1aWRlZCAgPSAzCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfYXV0byAgICA9IDQKKworICAgICAgICBpbnRlcmZhY2UKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBvbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcyhudGhyZWFkcykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG50aHJlYWRzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMoZW5hYmxlKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSwgdmFsdWUgOjogZW5hYmxlCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkKGVuYWJsZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCksIHZhbHVlIDo6IGVuYWJsZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0oKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3Byb2NzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fcGFyYWxsZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfaW5fZmluYWwoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fZmluYWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX2ZpbmFsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X2R5bmFtaWMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9keW5hbWljCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfbmVzdGVkCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMobWF4X2xldmVscykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG1heF9sZXZlbHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgOjogb21wX2dldF9sZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIDo6IG9tcF9nZXRfYWN0aXZlX2xldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0obGV2ZWwpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZShsZXZlbCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX3NpemUKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSwgdmFsdWUgOjoga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbW9kaWZpZXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSAgIDo6IGtpbmQKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgOjogbW9kaWZpZXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIHJlYWwgKGtpbmQ9a21wX2RvdWJsZV9raW5kKSBvbXBfZ2V0X3d0aW1lCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2soKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgcmVhbCAoa2luZD1rbXBfZG91YmxlX2tpbmQpIG9tcF9nZXRfd3RpY2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGljaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF90ZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfdGVzdF9uZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jaworCishICAgICAgICAgKioqCishICAgICAgICAgKioqIGttcF8qIGVudHJ5IHBvaW50cworISAgICAgICAgICoqKgorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZShzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3Moc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUobXNlYykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG1zZWMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQoKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQoKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5KGxpYm51bSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxpYm51bQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzKHN0cmluZykgYmluZChjKQorICAgICAgICAgICAgdXNlLCBpbnRyaW5zaWMgOjogaXNvX2NfYmluZGluZworICAgICAgICAgICAgY2hhcmFjdGVyIChraW5kPWNfY2hhcikgOjogc3RyaW5nKCopCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkga21wX2dldF9zdGFja3NpemVfcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYmxvY2t0aW1lCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5KG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHkKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5KG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHkKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayhtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sobWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9tYWxsb2Moc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9tYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9hbGlnbmVkX21hbGxvYyhzaXplLCBhbGlnbm1lbnQpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9hbGlnbmVkX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IGFsaWdubWVudAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfYWxpZ25lZF9tYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9jYWxsb2MobmVsZW0sIGVsc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2NhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBuZWxlbQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBlbHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2NhbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3JlYWxsb2MocHRyLCBzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfcmVhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSwgdmFsdWUgOjogcHRyCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3JlYWxsb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2ZyZWUocHRyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSwgdmFsdWUgOjogcHRyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2ZyZWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbigpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAgICAgZW5kIGludGVyZmFjZQorCisgICAgICBlbmQgbW9kdWxlIG9tcF9saWIKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wX2xpYi5oLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wX2xpYi5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODAwNjAyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXBfbGliLmgudmFyCkBAIC0wLDAgKzEsNjQ5IEBACishIGluY2x1ZGUvMzAvb21wX2xpYi5oLnZhcgorCishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKyEqKioKKyEqKiogU29tZSBvZiB0aGUgZGlyZWN0aXZlcyBmb3IgdGhlIGZvbGxvd2luZyByb3V0aW5lIGV4dGVuZCBwYXN0IGNvbHVtbiA3MiwKKyEqKiogc28gcHJvY2VzcyB0aGlzIGZpbGUgaW4gMTMyLWNvbHVtbiBtb2RlLgorISoqKgorCishZGVjJCBmaXhlZGZvcm1saW5lc2l6ZToxMzIKKworICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9pbnRlZ2VyX2tpbmQgICAgICAgPSA0CisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvZ2ljYWxfa2luZCAgICAgICA9IDQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcmVhbF9raW5kICAgICAgICAgID0gNAorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2tpbmQgICAgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9uZXN0X2xvY2tfa2luZCAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9raW5kICAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3BvaW50ZXJfa2luZCAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3NpemVfdF9raW5kICAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2FmZmluaXR5X21hc2tfa2luZCA9IGludF9wdHJfa2luZCgpCisKKyAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfc3RhdGljICA9IDEKKyAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZHluYW1pYyA9IDIKKyAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZ3VpZGVkICA9IDMKKyAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfYXV0byAgICA9IDQKKworICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gQExJQk9NUF9WRVJTSU9OX01BSk9SQAorICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21pbm9yID0gQExJQk9NUF9WRVJTSU9OX01JTk9SQAorICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX2J1aWxkID0gQExJQk9NUF9WRVJTSU9OX0JVSUxEQAorICAgICAgY2hhcmFjdGVyKCopICAgICAgICAgICAgICAga21wX2J1aWxkX2RhdGUKKyAgICAgIHBhcmFtZXRlcigga21wX2J1aWxkX2RhdGUgPSAnQExJQk9NUF9CVUlMRF9EQVRFQCcgKQorICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IG9wZW5tcF92ZXJzaW9uICAgID0gQExJQk9NUF9PTVBfWUVBUl9NT05USEAKKworICAgICAgaW50ZXJmYWNlCisKKyEgICAgICAgKioqCishICAgICAgICoqKiBvbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgKioqCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzKG50aHJlYWRzKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbnRocmVhZHMKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljKGVuYWJsZSkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIGVuYWJsZQorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkKGVuYWJsZSkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIGVuYWJsZQorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGhyZWFkcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfdGhyZWFkcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bSgpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3Byb2NzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbCgpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fcGFyYWxsZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9maW5hbCgpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fZmluYWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9maW5hbAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYygpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X2R5bmFtaWMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfbmVzdGVkCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0KCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdAorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyhtYXhfbGV2ZWxzKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbWF4X2xldmVscworICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscygpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9sZXZlbCgpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2xldmVsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hY3RpdmVfbGV2ZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKGxldmVsKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbGV2ZWwKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUobGV2ZWwpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsZXZlbAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX3NpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpIGtpbmQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1vZGlmaWVyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbW9kaWZpZXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUoKQorICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGltZQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGltZQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sgKCkKKyAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpY2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jaworCisgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF90ZXN0X2xvY2sKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jaworCisgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX3Rlc3RfbmVzdF9sb2NrCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jaworCishICAgICAgICoqKgorISAgICAgICAqKioga21wXyogZW50cnkgcG9pbnRzCishICAgICAgICoqKgorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUoc2l6ZSkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHNpemUKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3Moc2l6ZSkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZShtc2VjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbXNlYworICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbCgpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kKCkKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCkKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeShsaWJudW0pCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsaWJudW0KKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5CisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzKHN0cmluZykKKyAgICAgICAgICBjaGFyYWN0ZXIqKCopIHN0cmluZworICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcygpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZSgpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9saWJyYXJ5CisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkKKworICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5KG1hc2spCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5CisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eShtYXNrKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworCisgICAgICAgIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrKG1hc2spCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworCisgICAgICAgIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayhtYXNrKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBwcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX21hbGxvYyhzaXplKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX21hbGxvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfbWFsbG9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2FsaWduZWRfbWFsbG9jKHNpemUsIGFsaWdubWVudCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9hbGlnbmVkX21hbGxvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGFsaWdubWVudAorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2FsaWduZWRfbWFsbG9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2NhbGxvYyhuZWxlbSwgZWxzaXplKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2NhbGxvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBuZWxlbQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBlbHNpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9jYWxsb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfcmVhbGxvYyhwdHIsIHNpemUpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfcmVhbGxvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkgcHRyCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9yZWFsbG9jCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfZnJlZShwdHIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwdHIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2ZyZWUKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24oKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZigpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAgIGVuZCBpbnRlcmZhY2UKKworIWRlYyQgaWYgZGVmaW5lZChfV0lOMzIpCishZGVjJCAgIGlmIGRlZmluZWQoX1dJTjY0KSAub3IuIGRlZmluZWQoX01fQU1ENjQpCisKKyEqKioKKyEqKiogVGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIG11c3QgYmUgaW4gdXBwZXJjYXNlLCBldmVuIGlmIHRoZSAvUWxvd2VyY2FzZQorISoqKiBvcHRpb24gaXMgc3BlY2lmaWVkLiAgVGhlIGFsaWFzIGF0dHJpYnV0ZSBlbnN1cmVzIHRoYXQgdGhlIHNwZWNpZmllZAorISoqKiBzdHJpbmcgaXMgdXNlZCBhcyB0aGUgZW50cnkgcG9pbnQuCishKioqCishKioqIE9uIHRoZSBXaW5kb3dzKiBPUyBJQS0zMiBhcmNoaXRlY3R1cmUsIHRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBoYXZlIGFuCishKioqIHVuZGVyc2NvcmUgcHJlcGVuZGVkLiAgT24gdGhlIFdpbmRvd3MqIE9TIEludGVsKFIpIDY0CishKioqIGFyY2hpdGVjdHVyZSwgbm8gdW5kZXJzY29yZSBpcyBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTlVNX1RIUkVBRFMnOjpvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX0RZTkFNSUMnOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTkVTVEVEJzo6b21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX1RIUkVBRFMnOjpvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX01BWF9USFJFQURTJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9USFJFQURfTlVNJzo6b21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9QUk9DUyc6Om9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfSU5fUEFSQUxMRUwnOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9JTl9GSU5BTCc6Om9tcF9pbl9maW5hbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9EWU5BTUlDJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05FU1RFRCc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RIUkVBRF9MSU1JVCc6Om9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX01BWF9BQ1RJVkVfTEVWRUxTJzo6b21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9NQVhfQUNUSVZFX0xFVkVMUyc6Om9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTEVWRUwnOjpvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0FDVElWRV9MRVZFTCc6Om9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0nOjpvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEVBTV9TSVpFJzo6b21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfU0NIRURVTEUnOjpvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1NDSEVEVUxFJzo6b21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9XVElNRSc6Om9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfV1RJQ0snOjpvbXBfZ2V0X3d0aWNrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X2xvY2snOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9sb2NrJzo6b21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9sb2NrJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbG9jayc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9sb2NrJzo6b21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbmVzdF9sb2NrJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9uZXN0X2xvY2snOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdF9sb2NrJzo6b21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9uZXN0X2xvY2snOjpvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9uZXN0X2xvY2snOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9TVEFDS1NJWkUnOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9TVEFDS1NJWkVfUyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQkxPQ0tUSU1FJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9TRVJJQUwnOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfVFVSTkFST1VORCc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfVEhST1VHSFBVVCc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUlknOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfREVGQVVMVFMnOjprbXBfc2V0X2RlZmF1bHRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX1NUQUNLU0laRSc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX1NUQUNLU0laRV9TJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9CTE9DS1RJTUUnOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9MSUJSQVJZJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0FGRklOSVRZJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWSc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQUZGSU5JVFlfTUFYX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfQ1JFQVRFX0FGRklOSVRZX01BU0snOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9ERVNUUk9ZX0FGRklOSVRZX01BU0snOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX01BTExPQyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9BTElHTkVEX01BTExPQyc6OmttcF9hbGlnbmVkX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0NBTExPQyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9SRUFMTE9DJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9GUkVFJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9XQVJOSU5HU19PTic6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfV0FSTklOR1NfT0ZGJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgICBlbHNlCisKKyEqKioKKyEqKiogT24gV2luZG93cyogT1MgSUEtMzIgYXJjaGl0ZWN0dXJlLCB0aGUgRm9ydHJhbiBlbnRyeSBwb2ludHMgaGF2ZSBhbiB1bmRlcnNjb3JlIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfTlVNX1RIUkVBRFMnOjpvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9EWU5BTUlDJzo6b21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9ORVNURUQnOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX1RIUkVBRFMnOjpvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9NQVhfVEhSRUFEUyc6Om9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RIUkVBRF9OVU0nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9QUk9DUyc6Om9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0lOX1BBUkFMTEVMJzo6b21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0lOX0ZJTkFMJzo6b21wX2luX2ZpbmFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9EWU5BTUlDJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9ORVNURUQnOjpvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEhSRUFEX0xJTUlUJzo6b21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX01BWF9BQ1RJVkVfTEVWRUxTJzo6b21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTUFYX0FDVElWRV9MRVZFTFMnOjpvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9MRVZFTCc6Om9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0FDVElWRV9MRVZFTCc6Om9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNJzo6b21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9URUFNX1NJWkUnOjpvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfU0NIRURVTEUnOjpvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9TQ0hFRFVMRSc6Om9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1dUSU1FJzo6b21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfV1RJQ0snOjpvbXBfZ2V0X3d0aWNrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9sb2NrJzo6b21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X2xvY2snOjpvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9sb2NrJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X2xvY2snOjpvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X2xvY2snOjpvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbmVzdF9sb2NrJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbmVzdF9sb2NrJzo6b21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9uZXN0X2xvY2snOjpvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9uZXN0X2xvY2snOjpvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbmVzdF9sb2NrJzo6b21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1NUQUNLU0laRSc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9TVEFDS1NJWkVfUyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0JMT0NLVElNRSc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1NFUklBTCc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfVFVSTkFST1VORCc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQnOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWSc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfREVGQVVMVFMnOjprbXBfc2V0X2RlZmF1bHRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9TVEFDS1NJWkUnOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfU1RBQ0tTSVpFX1MnOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9CTE9DS1RJTUUnOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfTElCUkFSWSc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQUZGSU5JVFknOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9BRkZJTklUWSc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0FGRklOSVRZX01BWF9QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9DUkVBVEVfQUZGSU5JVFlfTUFTSyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9ERVNUUk9ZX0FGRklOSVRZX01BU0snOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9NQUxMT0MnOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0FMSUdORURfTUFMTE9DJzo6a21wX2FsaWduZWRfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0NBTExPQyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfUkVBTExPQyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0ZSRUUnOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9XQVJOSU5HU19PTic6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1dBUk5JTkdTX09GRic6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkICAgZW5kaWYKKyFkZWMkIGVuZGlmCisKKyFkZWMkIGlmIGRlZmluZWQoX19saW51eCkKKworISoqKgorISoqKiBUaGUgTGludXgqIE9TIGVudHJ5IHBvaW50cyBhcmUgaW4gbG93ZXJjYXNlLCB3aXRoIGFuIHVuZGVyc2NvcmUgYXBwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbnVtX3RocmVhZHNfJzo6b21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9keW5hbWljXyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9uZXN0ZWRfJzo6b21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbnVtX3RocmVhZHNfJzo6b21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9tYXhfdGhyZWFkc18nOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RocmVhZF9udW1fJzo6b21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV9wcm9jc18nOjpvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luX3BhcmFsbGVsXyc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luX2ZpbmFsXyc6Om9tcF9pbl9maW5hbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9keW5hbWljXyc6Om9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9uZXN0ZWRfJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGhyZWFkX2xpbWl0Xyc6Om9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9sZXZlbF8nOjpvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X2FjdGl2ZV9sZXZlbF8nOjpvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtXyc6Om9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90ZWFtX3NpemVfJzo6b21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfc2NoZWR1bGVfJzo6b21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9zY2hlZHVsZV8nOjpvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3d0aW1lXyc6Om9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfd3RpY2tfJzo6b21wX2dldF93dGljaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9sb2NrXyc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9sb2NrXyc6Om9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X2xvY2tfJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X2xvY2tfJzo6b21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbmVzdF9sb2NrXyc6Om9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbmVzdF9sb2NrXyc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9uZXN0X2xvY2tfJzo6b21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9uZXN0X2xvY2tfJzo6b21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbmVzdF9sb2NrXyc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3N0YWNrc2l6ZV8nOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9zdGFja3NpemVfc18nOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2Jsb2NrdGltZV8nOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3NlcmlhbF8nOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF8nOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV8nOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfZGVmYXVsdHNfJzo6a21wX3NldF9kZWZhdWx0cworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9zdGFja3NpemVfJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfc3RhY2tzaXplX3NfJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9ibG9ja3RpbWVfJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfbGlicmFyeV8nOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfYWZmaW5pdHlfJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9hZmZpbml0eV8nOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9jcmVhdGVfYWZmaW5pdHlfbWFza18nOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9tYWxsb2NfJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2FsaWduZWRfbWFsbG9jXyc6OmttcF9hbGlnbmVkX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2NhbGxvY18nOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfcmVhbGxvY18nOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2ZyZWVfJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF93YXJuaW5nc19vbl8nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3dhcm5pbmdzX29mZl8nOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCBlbmRpZgorCishZGVjJCBpZiBkZWZpbmVkKF9fQVBQTEVfXykKKworISoqKgorISoqKiBUaGUgTWFjIGVudHJ5IHBvaW50cyBhcmUgaW4gbG93ZXJjYXNlLCB3aXRoIGFuIGJvdGggYW4gdW5kZXJzY29yZQorISoqKiBhcHBlbmRlZCBhbmQgYW4gdW5kZXJzY29yZSBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X251bV90aHJlYWRzXyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2R5bmFtaWNfJzo6b21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9uZXN0ZWRfJzo6b21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X251bV90aHJlYWRzXyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X21heF90aHJlYWRzXyc6Om9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RocmVhZF9udW1fJzo6b21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9udW1fcHJvY3NfJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5fcGFyYWxsZWxfJzo6b21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luX2ZpbmFsXyc6Om9tcF9pbl9maW5hbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfZHluYW1pY18nOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X25lc3RlZF8nOjpvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGhyZWFkX2xpbWl0Xyc6Om9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9sZXZlbF8nOjpvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9hY3RpdmVfbGV2ZWxfJzo6b21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW1fJzo6b21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90ZWFtX3NpemVfJzo6b21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X3NjaGVkdWxlXyc6Om9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3NjaGVkdWxlXyc6Om9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3d0aW1lXyc6Om9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3d0aWNrXyc6Om9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X2xvY2tfJzo6b21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbG9ja18nOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbG9ja18nOjpvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X2xvY2tfJzo6b21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X25lc3RfbG9ja18nOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9uZXN0X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9uZXN0X2xvY2tfJzo6b21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbmVzdF9sb2NrXyc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9uZXN0X2xvY2tfJzo6b21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3N0YWNrc2l6ZV8nOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfc3RhY2tzaXplX3NfJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfYmxvY2t0aW1lXyc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3NlcmlhbF8nOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF8nOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV8nOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2RlZmF1bHRzXyc6OmttcF9zZXRfZGVmYXVsdHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X3N0YWNrc2l6ZV8nOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfc3RhY2tzaXplX3NfJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYmxvY2t0aW1lXyc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9saWJyYXJ5Xyc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfYWZmaW5pdHlfJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYWZmaW5pdHlfJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9jcmVhdGVfYWZmaW5pdHlfbWFza18nOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrXyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX21hbGxvY18nOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2FsaWduZWRfbWFsbG9jXyc6OmttcF9hbGlnbmVkX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9jYWxsb2NfJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9yZWFsbG9jXyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2ZyZWVfJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfd2FybmluZ3Nfb25fJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfd2FybmluZ3Nfb2ZmXyc6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkIGVuZGlmCisKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXB0LmgudmFyIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXB0LmgudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MDUwYzkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcHQuaC52YXIKQEAgLTAsMCArMSw0ODggQEAKKy8qCisgKiBpbmNsdWRlLzMwL29tcHQuaC52YXIKKyAqLworCisjaWZuZGVmIF9fT01QVF9fCisjZGVmaW5lIF9fT01QVF9fCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc3lzdGVtIGluY2x1ZGUgZmlsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBpdGVyYXRpb24gbWFjcm9zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRk9SRUFDSF9PTVBUX0lOUVVJUllfRk4obWFjcm8pICBcCisgICAgbWFjcm8gKG9tcHRfZW51bWVyYXRlX3N0YXRlKSAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zZXRfY2FsbGJhY2spICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X2NhbGxiYWNrKSAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfaWRsZV9mcmFtZSkgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3Rhc2tfZnJhbWUpICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfc3RhdGUpICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF9wYXJhbGxlbF9pZCkgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfcGFyYWxsZWxfdGVhbV9zaXplKSBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3Rhc2tfaWQpICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF90aHJlYWRfaWQpCisKKyNkZWZpbmUgRk9SRUFDSF9PTVBUX1BMQUNFSE9MREVSX0ZOKG1hY3JvKSAgXAorICAgIG1hY3JvIChvbXB0X2lkbGUpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfb3ZlcmhlYWQpICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9iYXJyaWVyX3dhaXQpICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3Rhc2tfd2FpdCkgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfbXV0ZXhfd2FpdCkKKworI2RlZmluZSBGT1JFQUNIX09NUFRfU1RBVEUobWFjcm8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIGZpcnN0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX2ZpcnN0LCAweDcxKSAgICAgICAgICAvKiBpbml0aWFsIGVudW1lcmF0aW9uIHN0YXRlICovICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIHdvcmsgc3RhdGVzICgwLi4xNSkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dvcmtfc2VyaWFsLCAweDAwKSAgICAvKiB3b3JraW5nIG91dHNpZGUgcGFyYWxsZWwgKi8gICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWwsIDB4MDEpICAvKiB3b3JraW5nIHdpdGhpbiBwYXJhbGxlbCAqLyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dvcmtfcmVkdWN0aW9uLCAweDAyKSAvKiBwZXJmb3JtaW5nIGEgcmVkdWN0aW9uICovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIGlkbGUgKDE2Li4zMSkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX2lkbGUsIDB4MTApICAgICAgICAgICAgLyogd2FpdGluZyBmb3Igd29yayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIG92ZXJoZWFkIHN0YXRlcyAoMzIuLjYzKSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX292ZXJoZWFkLCAweDIwKSAgICAgICAgLyogb3ZlcmhlYWQgZXhjbHVkaW5nIHdhaXQgc3RhdGVzICovICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIGJhcnJpZXIgd2FpdCBzdGF0ZXMgKDY0Li43OSkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfYmFycmllciwgMHg0MCkgICAgLyogd2FpdGluZyBhdCBhIGJhcnJpZXIgKi8gICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfYmFycmllcl9pbXBsaWNpdCwgMHg0MSkgICAgLyogaW1wbGljaXQgYmFycmllciAqLyAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfYmFycmllcl9leHBsaWNpdCwgMHg0MikgICAgLyogZXhwbGljaXQgYmFycmllciAqLyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIHRhc2sgd2FpdCBzdGF0ZXMgKDgwLi45NSkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfdGFza3dhaXQsIDB4NTApICAgLyogd2FpdGluZyBhdCBhIHRhc2t3YWl0ICovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfdGFza2dyb3VwLCAweDUxKSAgLyogd2FpdGluZyBhdCBhIHRhc2tncm91cCAqLyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIG11dGV4IHdhaXQgc3RhdGVzICg5Ni4uMTExKSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfbG9jaywgMHg2MCkgICAgICAgLyogd2FpdGluZyBmb3IgbG9jayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfbmVzdF9sb2NrLCAweDYxKSAgLyogd2FpdGluZyBmb3IgbmVzdCBsb2NrICovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfY3JpdGljYWwsIDB4NjIpICAgLyogd2FpdGluZyBmb3IgY3JpdGljYWwgKi8gICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfYXRvbWljLCAweDYzKSAgICAgLyogd2FpdGluZyBmb3IgYXRvbWljICovICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfb3JkZXJlZCwgMHg2NCkgICAgLyogd2FpdGluZyBmb3Igb3JkZXJlZCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3dhaXRfc2luZ2xlLCAweDZGKSAgICAgLyogd2FpdGluZyBmb3Igc2luZ2xlIHJlZ2lvbiAobm9uLXN0YW5kYXJkISkgKi8gICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIG1pc2MgKDExMi4uMTI3KSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X3N0YXRlX3VuZGVmaW5lZCwgMHg3MCkgICAgICAgLyogdW5kZWZpbmVkIHRocmVhZCBzdGF0ZSAqLworCisKKyNkZWZpbmUgRk9SRUFDSF9PTVBUX0VWRU5UKG1hY3JvKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qLS0tIE1hbmRhdG9yeSBFdmVudHMgLS0tKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbiwgICAgICAgICAgIG9tcHRfbmV3X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgMSkgLyogcGFyYWxsZWwgYmVnaW4gKi8gICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kLCAgICAgICAgICAgICBvbXB0X2VuZF9wYXJhbGxlbF9jYWxsYmFja190LCAgIDIpIC8qIHBhcmFsbGVsIGVuZCAqLyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrX2JlZ2luLCAgICAgICAgICAgICAgIG9tcHRfbmV3X3Rhc2tfY2FsbGJhY2tfdCwgICAgICAgMykgLyogdGFzayBiZWdpbiAqLyAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza19lbmQsICAgICAgICAgICAgICAgICBvbXB0X3Rhc2tfY2FsbGJhY2tfdCwgICAgICAgICAgIDQpIC8qIHRhc2sgZGVzdHJveSAqLyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90aHJlYWRfYmVnaW4sICAgICAgICAgICAgIG9tcHRfdGhyZWFkX3R5cGVfY2FsbGJhY2tfdCwgICAgNSkgLyogdGhyZWFkIGJlZ2luICovICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGhyZWFkX2VuZCwgICAgICAgICAgICAgICBvbXB0X3RocmVhZF90eXBlX2NhbGxiYWNrX3QsICAgIDYpIC8qIHRocmVhZCBlbmQgKi8gICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9jb250cm9sLCAgICAgICAgICAgICAgICAgIG9tcHRfY29udHJvbF9jYWxsYmFja190LCAgICAgICAgNykgLyogc3VwcG9ydCBjb250cm9sIGNhbGxzICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3J1bnRpbWVfc2h1dGRvd24sICAgICAgICAgb21wdF9jYWxsYmFja190LCAgICAgICAgICAgICAgICA4KSAvKiBydW50aW1lIHNodXRkb3duICovICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyotLS0gT3B0aW9uYWwgRXZlbnRzIChibGFtZSBzaGlmdGluZywgb21wdF9ldmVudF91bmltcGxlbWVudGVkKSAtLS0qLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2lkbGVfYmVnaW4sICAgICAgICAgICAgICAgb21wdF90aHJlYWRfY2FsbGJhY2tfdCwgICAgICAgICA5KSAvKiBiZWdpbiBpZGxlIHN0YXRlICovICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pZGxlX2VuZCwgICAgICAgICAgICAgICAgIG9tcHRfdGhyZWFkX2NhbGxiYWNrX3QsICAgICAgICAxMCkgLyogZW5kIGlkbGUgc3RhdGUgKi8gICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfYmFycmllcl9iZWdpbiwgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDExKSAvKiBiZWdpbiB3YWl0IGF0IGJhcnJpZXIgKi8gIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X2JhcnJpZXJfZW5kLCAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxMikgLyogZW5kIHdhaXQgYXQgYmFycmllciAqLyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfdGFza3dhaXRfYmVnaW4sICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDEzKSAvKiBiZWdpbiB3YWl0IGF0IHRhc2t3YWl0ICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X3Rhc2t3YWl0X2VuZCwgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxNCkgLyogZW5kIHdhaXQgYXQgdGFza3dhaXQgKi8gICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfdGFza2dyb3VwX2JlZ2luLCAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDE1KSAvKiBiZWdpbiB3YWl0IGF0IHRhc2tncm91cCAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X3Rhc2tncm91cF9lbmQsICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxNikgLyogZW5kIHdhaXQgYXQgdGFza2dyb3VwICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2VfbG9jaywgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDE3KSAvKiBsb2NrIHJlbGVhc2UgKi8gICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX25lc3RfbG9ja19sYXN0LCAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICAxOCkgLyogbGFzdCBuZXN0IGxvY2sgcmVsZWFzZSAqLyBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9jcml0aWNhbCwgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgMTkpIC8qIGNyaXRpY2FsIHJlbGVhc2UgKi8gICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX2F0b21pYywgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICAyMCkgLyogYXRvbWljIHJlbGVhc2UgKi8gICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2Vfb3JkZXJlZCwgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDIxKSAvKiBvcmRlcmVkIHJlbGVhc2UgKi8gICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyotLS0gT3B0aW9uYWwgRXZlbnRzIChzeW5jaHJvbm91cyBldmVudHMsIG9tcHRfZXZlbnRfdW5pbXBsZW1lbnRlZCkgLS0tICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW4sICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDIyKSAvKiBpbXBsaWNpdCB0YXNrIGJlZ2luICAgKi8gIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZCwgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyMykgLyogaW1wbGljaXQgdGFzayBlbmQgICovICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2luaXRpYWxfdGFza19iZWdpbiwgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDI0KSAvKiBpbml0aWFsIHRhc2sgYmVnaW4gICAqLyAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbml0aWFsX3Rhc2tfZW5kLCAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyNSkgLyogaW5pdGlhbCB0YXNrIGVuZCAgKi8gICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2tfc3dpdGNoLCAgICAgICAgICAgICAgb21wdF90YXNrX3BhaXJfY2FsbGJhY2tfdCwgICAgIDI2KSAvKiB0YXNrIHN3aXRjaCAqLyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfbG9vcF9iZWdpbiwgICAgICAgICAgICAgICBvbXB0X25ld193b3Jrc2hhcmVfY2FsbGJhY2tfdCwgMjcpIC8qIHRhc2sgYXQgbG9vcCBiZWdpbiAqLyAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2xvb3BfZW5kLCAgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDI4KSAvKiB0YXNrIGF0IGxvb3AgZW5kICovICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfc2VjdGlvbnNfYmVnaW4sICAgICAgICAgICBvbXB0X25ld193b3Jrc2hhcmVfY2FsbGJhY2tfdCwgMjkpIC8qIHRhc2sgYXQgc2VjdGlvbnMgYmVnaW4gICovXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NlY3Rpb25zX2VuZCwgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDMwKSAvKiB0YXNrIGF0IHNlY3Rpb25zIGVuZCAqLyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfc2luZ2xlX2luX2Jsb2NrX2JlZ2luLCAgICBvbXB0X25ld193b3Jrc2hhcmVfY2FsbGJhY2tfdCwgMzEpIC8qIHRhc2sgYXQgc2luZ2xlIGJlZ2luKi8gICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NpbmdsZV9pbl9ibG9ja19lbmQsICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDMyKSAvKiB0YXNrIGF0IHNpbmdsZSBlbmQgKi8gICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfc2luZ2xlX290aGVyc19iZWdpbiwgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMzMpIC8qIHRhc2sgYXQgc2luZ2xlIGJlZ2luICovICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NpbmdsZV9vdGhlcnNfZW5kLCAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDM0KSAvKiB0YXNrIGF0IHNpbmdsZSBlbmQgKi8gICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd29ya3NoYXJlX2JlZ2luLCAgICAgICAgICBvbXB0X25ld193b3Jrc2hhcmVfY2FsbGJhY2tfdCwgMzUpIC8qIHRhc2sgYXQgd29ya3NoYXJlIGJlZ2luICovXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dvcmtzaGFyZV9lbmQsICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDM2KSAvKiB0YXNrIGF0IHdvcmtzaGFyZSBlbmQgKi8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfbWFzdGVyX2JlZ2luLCAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMzcpIC8qIHRhc2sgYXQgbWFzdGVyIGJlZ2luICovICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X21hc3Rlcl9lbmQsICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDM4KSAvKiB0YXNrIGF0IG1hc3RlciBlbmQgKi8gICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbiwgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMzkpIC8qIHRhc2sgYXQgYmFycmllciBiZWdpbiAgKi8gXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2JhcnJpZXJfZW5kLCAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDQwKSAvKiB0YXNrIGF0IGJhcnJpZXIgZW5kICovICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza3dhaXRfYmVnaW4sICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgNDEpIC8qIHRhc2sgYXQgdGFza3dhaXQgYmVnaW4gKi8gXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2t3YWl0X2VuZCwgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDQyKSAvKiB0YXNrIGF0IHRhc2sgd2FpdCBlbmQgKi8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza2dyb3VwX2JlZ2luLCAgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgNDMpIC8qIHRhc2sgYXQgdGFza2dyb3VwIGJlZ2luICovXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2tncm91cF9lbmQsICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDQ0KSAvKiB0YXNrIGF0IHRhc2tncm91cCBlbmQgKi8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9uZXN0X2xvY2tfcHJldiwgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNDUpIC8qIHByZXYgbmVzdCBsb2NrIHJlbGVhc2UgKi8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X2xvY2ssICAgICAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA0NikgLyogbG9jayB3YWl0ICovICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9uZXN0X2xvY2ssICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNDcpIC8qIG5lc3QgbG9jayB3YWl0ICovICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfY3JpdGljYWwsICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDQ4KSAvKiBjcml0aWNhbCB3YWl0ICovICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X2F0b21pYywgICAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA0OSkgLyogYXRvbWljIHdhaXQgKi8gICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9vcmRlcmVkLCAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTApIC8qIG9yZGVyZWQgd2FpdCAqLyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9sb2NrLCAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1MSkgLyogbG9jayBhY3F1aXJlZCAqLyAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfbmVzdF9sb2NrX2ZpcnN0LCBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTIpIC8qIDFzdCBuZXN0IGxvY2sgYWNxdWlyZWQgKi8gXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX25lc3RfbG9ja19uZXh0LCAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDUzKSAvKiBuZXh0IG5lc3QgbG9jayBhY3F1aXJlZCovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9jcml0aWNhbCwgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1NCkgLyogY3JpdGljYWwgYWNxdWlyZWQgKi8gICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfYXRvbWljLCAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTUpIC8qIGF0b21pYyBhY3F1aXJlZCAqLyAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX29yZGVyZWQsICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU2KSAvKiBvcmRlcmVkIGFjcXVpcmVkICovICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaW5pdF9sb2NrLCAgICAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTcpIC8qIGxvY2sgaW5pdCAqLyAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2luaXRfbmVzdF9sb2NrLCAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU4KSAvKiBuZXN0IGxvY2sgaW5pdCAqLyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfZGVzdHJveV9sb2NrLCAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTkpIC8qIGxvY2sgZGVzdHJ1Y3Rpb24gKi8gICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2Rlc3Ryb3lfbmVzdF9sb2NrLCAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDYwKSAvKiBuZXN0IGxvY2sgZGVzdHJ1Y3Rpb24gKi8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfZmx1c2gsICAgICAgICAgICAgICAgICAgICBvbXB0X2NhbGxiYWNrX3QsICAgICAgICAgICAgICAgNjEpIC8qIGFmdGVyIGV4ZWN1dGluZyBmbHVzaCAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBkYXRhIHR5cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBpZGVudGlmaWVycworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHVpbnQ2NF90IG9tcHRfdGhyZWFkX2lkX3Q7CisjZGVmaW5lIG9tcHRfdGhyZWFkX2lkX25vbmUgKChvbXB0X3RocmVhZF9pZF90KSAwKSAgICAgLyogbm9uLXN0YW5kYXJkICovCisKK3R5cGVkZWYgdWludDY0X3Qgb21wdF90YXNrX2lkX3Q7CisjZGVmaW5lIG9tcHRfdGFza19pZF9ub25lICgob21wdF90YXNrX2lkX3QpIDApICAgICAgICAgLyogbm9uLXN0YW5kYXJkICovCisKK3R5cGVkZWYgdWludDY0X3Qgb21wdF9wYXJhbGxlbF9pZF90OworI2RlZmluZSBvbXB0X3BhcmFsbGVsX2lkX25vbmUgKChvbXB0X3BhcmFsbGVsX2lkX3QpIDApIC8qIG5vbi1zdGFuZGFyZCAqLworCit0eXBlZGVmIHVpbnQ2NF90IG9tcHRfd2FpdF9pZF90OworI2RlZmluZSBvbXB0X3dhaXRfaWRfbm9uZSAoKG9tcHRfd2FpdF9pZF90KSAwKSAgICAgICAgIC8qIG5vbi1zdGFuZGFyZCAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBvbXB0X2ZyYW1lX3QKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBzdHJ1Y3Qgb21wdF9mcmFtZV9zIHsKKyAgICB2b2lkICpleGl0X3J1bnRpbWVfZnJhbWU7ICAgIC8qIG5leHQgZnJhbWUgaXMgdXNlciBjb2RlICAgICAqLworICAgIHZvaWQgKnJlZW50ZXJfcnVudGltZV9mcmFtZTsgLyogcHJldmlvdXMgZnJhbWUgaXMgdXNlciBjb2RlICovCit9IG9tcHRfZnJhbWVfdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGVudW1lcmF0aW9ucyBmb3IgdGhyZWFkIHN0YXRlcyBhbmQgcnVudGltZSBldmVudHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJ1bnRpbWUgc3RhdGVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgZW51bSB7CisjZGVmaW5lIG9tcHRfc3RhdGVfbWFjcm8oc3RhdGUsIGNvZGUpIHN0YXRlID0gY29kZSwKKyAgICBGT1JFQUNIX09NUFRfU1RBVEUob21wdF9zdGF0ZV9tYWNybykKKyN1bmRlZiBvbXB0X3N0YXRlX21hY3JvCit9IG9tcHRfc3RhdGVfdDsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcnVudGltZSBldmVudHMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBlbnVtIHsKKyNkZWZpbmUgb21wdF9ldmVudF9tYWNybyhldmVudCwgY2FsbGJhY2ssIGV2ZW50aWQpIGV2ZW50ID0gZXZlbnRpZCwKKyAgICBGT1JFQUNIX09NUFRfRVZFTlQob21wdF9ldmVudF9tYWNybykKKyN1bmRlZiBvbXB0X2V2ZW50X21hY3JvCit9IG9tcHRfZXZlbnRfdDsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogc2V0IGNhbGxiYWNrIHJlc3VsdHMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgZW51bSB7CisgICAgb21wdF9zZXRfcmVzdWx0X3JlZ2lzdHJhdGlvbl9lcnJvciAgICAgICAgICAgICAgPSAwLAorICAgIG9tcHRfc2V0X3Jlc3VsdF9ldmVudF9tYXlfb2NjdXJfbm9fY2FsbGJhY2sgICAgID0gMSwKKyAgICBvbXB0X3NldF9yZXN1bHRfZXZlbnRfbmV2ZXJfb2NjdXJzICAgICAgICAgICAgICA9IDIsCisgICAgb21wdF9zZXRfcmVzdWx0X2V2ZW50X21heV9vY2N1cl9jYWxsYmFja19zb21lICAgPSAzLAorICAgIG9tcHRfc2V0X3Jlc3VsdF9ldmVudF9tYXlfb2NjdXJfY2FsbGJhY2tfYWx3YXlzID0gNCwKK30gb21wdF9zZXRfcmVzdWx0X3Q7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNhbGxiYWNrIHNpZ25hdHVyZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogaW5pdGlhbGl6YXRpb24gKi8KK3R5cGVkZWYgdm9pZCAoKm9tcHRfaW50ZXJmYWNlX2ZuX3QpKHZvaWQpOworCit0eXBlZGVmIG9tcHRfaW50ZXJmYWNlX2ZuX3QgKCpvbXB0X2Z1bmN0aW9uX2xvb2t1cF90KSgKKyAgICBjb25zdCBjaGFyICogICAgICAgICAgICAgICAgICAgICAgLyogZW50cnkgcG9pbnQgdG8gbG9vayB1cCAgICAgICAqLworKTsKKworLyogdGhyZWFkcyAqLwordHlwZWRlZiB2b2lkICgqb21wdF90aHJlYWRfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGhyZWFkX2lkX3QgdGhyZWFkX2lkICAgICAgICAvKiBJRCBvZiB0aHJlYWQgICAgICAgICAgICAgICAgICovCispOworCit0eXBlZGVmIGVudW0geworICAgIG9tcHRfdGhyZWFkX2luaXRpYWwgPSAxLCAvLyBzdGFydCB0aGUgZW51bWVyYXRpb24gYXQgMQorICAgIG9tcHRfdGhyZWFkX3dvcmtlciAgPSAyLAorICAgIG9tcHRfdGhyZWFkX290aGVyICAgPSAzCit9IG9tcHRfdGhyZWFkX3R5cGVfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBvbXB0X2ludm9rZXJfcHJvZ3JhbSA9IDAsICAgICAgICAgLyogcHJvZ3JhbSBpbnZva2VzIG1hc3RlciB0YXNrICAqLworICAgIG9tcHRfaW52b2tlcl9ydW50aW1lID0gMSAgICAgICAgICAvKiBydW50aW1lIGludm9rZXMgbWFzdGVyIHRhc2sgICovCit9IG9tcHRfaW52b2tlcl90OworCit0eXBlZGVmIHZvaWQgKCpvbXB0X3RocmVhZF90eXBlX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3RocmVhZF90eXBlX3QgdGhyZWFkX3R5cGUsICAgLyogdHlwZSBvZiB0aHJlYWQgICAgICAgICAgICAgICAqLworICAgIG9tcHRfdGhyZWFkX2lkX3QgdGhyZWFkX2lkICAgICAgICAvKiBJRCBvZiB0aHJlYWQgICAgICAgICAgICAgICAgICovCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X3dhaXRfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfd2FpdF9pZF90IHdhaXRfaWQgICAgICAgICAgICAvKiB3YWl0IGlkICAgICAgICAgICAgICAgICAgICAgICovCispOworCisvKiBwYXJhbGxlbCBhbmQgd29ya3NoYXJlcyAqLwordHlwZWRlZiB2b2lkICgqb21wdF9wYXJhbGxlbF9jYWxsYmFja190KSAoCisgICAgb21wdF9wYXJhbGxlbF9pZF90IHBhcmFsbGVsX2lkLCAgICAvKiBpZCBvZiBwYXJhbGxlbCByZWdpb24gICAgICAgKi8KKyAgICBvbXB0X3Rhc2tfaWRfdCB0YXNrX2lkICAgICAgICAgICAgIC8qIGlkIG9mIHRhc2sgICAgICAgICAgICAgICAgICAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsICAgLyogaWQgb2YgcGFyYWxsZWwgcmVnaW9uICAgICAgICAqLworICAgIG9tcHRfdGFza19pZF90IHBhcmVudF90YXNrX2lkLCAgICAvKiBpZCBvZiBwYXJlbnQgdGFzayAgICAgICAgICAgICovCisgICAgdm9pZCAqd29ya3NoYXJlX2Z1bmN0aW9uICAgICAgICAgIC8qIHBvaW50ZXIgdG8gb3V0bGluZWQgZnVuY3Rpb24gKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfbmV3X3BhcmFsbGVsX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3Rhc2tfaWRfdCBwYXJlbnRfdGFza19pZCwgICAgLyogaWQgb2YgcGFyZW50IHRhc2sgICAgICAgICAgICAqLworICAgIG9tcHRfZnJhbWVfdCAqcGFyZW50X3Rhc2tfZnJhbWUsICAvKiBmcmFtZSBkYXRhIG9mIHBhcmVudCB0YXNrICAgICovCisgICAgb21wdF9wYXJhbGxlbF9pZF90IHBhcmFsbGVsX2lkLCAgIC8qIGlkIG9mIHBhcmFsbGVsIHJlZ2lvbiAgICAgICAgKi8KKyAgICB1aW50MzJfdCByZXF1ZXN0ZWRfdGVhbV9zaXplLCAgICAgLyogbnVtYmVyIG9mIHRocmVhZHMgaW4gdGVhbSAgICAqLworICAgIHZvaWQgKnBhcmFsbGVsX2Z1bmN0aW9uLCAgICAgICAgICAvKiBwb2ludGVyIHRvIG91dGxpbmVkIGZ1bmN0aW9uICovCisgICAgb21wdF9pbnZva2VyX3QgaW52b2tlciAgICAgICAgICAgIC8qIHdobyBpbnZva2VzIG1hc3RlciB0YXNrPyAgICAgKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfZW5kX3BhcmFsbGVsX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsICAgLyogaWQgb2YgcGFyYWxsZWwgcmVnaW9uICAgICAgICovCisgICAgb21wdF90YXNrX2lkX3QgdGFza19pZCwgICAgICAgICAgIC8qIGlkIG9mIHRhc2sgICAgICAgICAgICAgICAgICAqLworICAgIG9tcHRfaW52b2tlcl90IGludm9rZXIgICAgICAgICAgICAvKiB3aG8gaW52b2tlcyBtYXN0ZXIgdGFzaz8gICAgKi8KKyk7CisKKy8qIHRhc2tzICovCit0eXBlZGVmIHZvaWQgKCpvbXB0X3Rhc2tfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGFza19pZF90IHRhc2tfaWQgICAgICAgICAgICAvKiBpZCBvZiB0YXNrICAgICAgICAgICAgICAgICAgICovCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X3Rhc2tfcGFpcl9jYWxsYmFja190KSAoCisgICAgb21wdF90YXNrX2lkX3QgZmlyc3RfdGFza19pZCwKKyAgICBvbXB0X3Rhc2tfaWRfdCBzZWNvbmRfdGFza19pZAorKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF9uZXdfdGFza19jYWxsYmFja190KSAoCisgICAgb21wdF90YXNrX2lkX3QgcGFyZW50X3Rhc2tfaWQsICAgIC8qIGlkIG9mIHBhcmVudCB0YXNrICAgICAgICAgICAgKi8KKyAgICBvbXB0X2ZyYW1lX3QgKnBhcmVudF90YXNrX2ZyYW1lLCAgLyogZnJhbWUgZGF0YSBmb3IgcGFyZW50IHRhc2sgICAqLworICAgIG9tcHRfdGFza19pZF90ICBuZXdfdGFza19pZCwgICAgICAvKiBpZCBvZiBjcmVhdGVkIHRhc2sgICAgICAgICAgICovCisgICAgdm9pZCAqdGFza19mdW5jdGlvbiAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gb3V0bGluZWQgZnVuY3Rpb24gKi8KKyk7CisKKy8qIHByb2dyYW0gKi8KK3R5cGVkZWYgdm9pZCAoKm9tcHRfY29udHJvbF9jYWxsYmFja190KSAoCisgICAgdWludDY0X3QgY29tbWFuZCwgICAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgb2YgY29udHJvbCBjYWxsICAgICAgKi8KKyAgICB1aW50NjRfdCBtb2RpZmllciAgICAgICAgICAgICAgICAgLyogbW9kaWZpZXIgb2YgY29udHJvbCBjYWxsICAgICAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF9jYWxsYmFja190KSh2b2lkKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogb21wdCBBUEkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgT01QVF9BUElfRk5UWVBFKGZuKSBmbiMjX3QKKworI2RlZmluZSBPTVBUX0FQSV9GVU5DVElPTihyZXR1cm5fdHlwZSwgZm4sIGFyZ3MpICBcCisgICAgdHlwZWRlZiByZXR1cm5fdHlwZSAoKk9NUFRfQVBJX0ZOVFlQRShmbikpIGFyZ3MKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTlFVSVJZIEZVTkNUSU9OUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogc3RhdGUgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKG9tcHRfc3RhdGVfdCwgb21wdF9nZXRfc3RhdGUsICgKKyAgICBvbXB0X3dhaXRfaWRfdCAqb21wdF93YWl0X2lkCispKTsKKworLyogdGhyZWFkICovCitPTVBUX0FQSV9GVU5DVElPTihvbXB0X3RocmVhZF9pZF90LCBvbXB0X2dldF90aHJlYWRfaWQsICh2b2lkKSk7CisKK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQgKiwgb21wdF9nZXRfaWRsZV9mcmFtZSwgKHZvaWQpKTsKKworLyogcGFyYWxsZWwgcmVnaW9uICovCitPTVBUX0FQSV9GVU5DVElPTihvbXB0X3BhcmFsbGVsX2lkX3QsIG9tcHRfZ2V0X3BhcmFsbGVsX2lkLCAoCisgICAgaW50IGFuY2VzdG9yX2xldmVsCispKTsKKworT01QVF9BUElfRlVOQ1RJT04oaW50LCBvbXB0X2dldF9wYXJhbGxlbF90ZWFtX3NpemUsICgKKyAgICBpbnQgYW5jZXN0b3JfbGV2ZWwKKykpOworCisvKiB0YXNrICovCitPTVBUX0FQSV9GVU5DVElPTihvbXB0X3Rhc2tfaWRfdCwgb21wdF9nZXRfdGFza19pZCwgKAorICAgIGludCBkZXB0aAorKSk7CisKK09NUFRfQVBJX0ZVTkNUSU9OKG9tcHRfZnJhbWVfdCAqLCBvbXB0X2dldF90YXNrX2ZyYW1lLCAoCisgICAgaW50IGRlcHRoCispKTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQTEFDRUhPTERFUlMgRk9SIFBFUkZPUk1BTkNFIFJFUE9SVElORworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogaWRsZSAqLworT01QVF9BUElfRlVOQ1RJT04odm9pZCwgb21wdF9pZGxlLCAoCisgICAgdm9pZAorKSk7CisKKy8qIG92ZXJoZWFkICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X292ZXJoZWFkLCAoCisgICAgdm9pZAorKSk7CisKKy8qIGJhcnJpZXIgd2FpdCAqLworT01QVF9BUElfRlVOQ1RJT04odm9pZCwgb21wdF9iYXJyaWVyX3dhaXQsICgKKyAgICB2b2lkCispKTsKKworLyogdGFzayB3YWl0ICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X3Rhc2tfd2FpdCwgKAorICAgIHZvaWQKKykpOworCisvKiBtdXRleCB3YWl0ICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X211dGV4X3dhaXQsICgKKyAgICB2b2lkCispKTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTklUSUFMSVpBVElPTiBGVU5DVElPTlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQsIG9tcHRfaW5pdGlhbGl6ZSwgKAorICAgIG9tcHRfZnVuY3Rpb25fbG9va3VwX3Qgb21wdF9mbl9sb29rdXAsCisgICAgY29uc3QgY2hhciAqcnVudGltZV92ZXJzaW9uLAorICAgIHVuc2lnbmVkIGludCBvbXB0X3ZlcnNpb24KKykpOworCisKKy8qIGluaXRpYWxpemF0aW9uIGludGVyZmFjZSB0byBiZSBkZWZpbmVkIGJ5IHRvb2wgKi8KK29tcHRfaW5pdGlhbGl6ZV90IG9tcHRfdG9vbCh2b2lkKTsKKwordHlwZWRlZiBlbnVtIG9wdF9pbml0X21vZGVfZSB7CisgICAgb21wdF9pbml0X21vZGVfbmV2ZXIgID0gMCwKKyAgICBvbXB0X2luaXRfbW9kZV9mYWxzZSAgPSAxLAorICAgIG9tcHRfaW5pdF9tb2RlX3RydWUgICA9IDIsCisgICAgb21wdF9pbml0X21vZGVfYWx3YXlzID0gMworfSBvbXB0X2luaXRfbW9kZV90OworCitPTVBUX0FQSV9GVU5DVElPTihpbnQsIG9tcHRfc2V0X2NhbGxiYWNrLCAoCisgICAgb21wdF9ldmVudF90IGV2ZW50LAorICAgIG9tcHRfY2FsbGJhY2tfdCBjYWxsYmFjaworKSk7CisKK3R5cGVkZWYgZW51bSBvbXB0X3NldF9jYWxsYmFja19yY19lIHsgIC8qIG5vbi1zdGFuZGFyZCAqLworICAgIG9tcHRfc2V0X2NhbGxiYWNrX2Vycm9yICAgICAgPSAwLAorICAgIG9tcHRfaGFzX2V2ZW50X25vX2NhbGxiYWNrICAgPSAxLAorICAgIG9tcHRfbm9fZXZlbnRfbm9fY2FsbGJhY2sgICAgPSAyLAorICAgIG9tcHRfaGFzX2V2ZW50X21heV9jYWxsYmFjayAgPSAzLAorICAgIG9tcHRfaGFzX2V2ZW50X211c3RfY2FsbGJhY2sgPSA0LAorfSBvbXB0X3NldF9jYWxsYmFja19yY190OworCisKK09NUFRfQVBJX0ZVTkNUSU9OKGludCwgb21wdF9nZXRfY2FsbGJhY2ssICgKKyAgICBvbXB0X2V2ZW50X3QgZXZlbnQsCisgICAgb21wdF9jYWxsYmFja190ICpjYWxsYmFjaworKSk7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTUlTQ0VMTEFORU9VUyBGVU5DVElPTlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGNvbnRyb2wgKi8KKy8vIEZJWE1FOiByZW1vdmUgd29ya2Fyb3VuZCBmb3IgY2xhbmcKKyNpZiAhZGVmaW5lZChfX2NsYW5nX18pICYmIGRlZmluZWQoX09QRU5NUCkgJiYgKF9PUEVOTVAgPj0gMjAxMzA3KQorI3ByYWdtYSBvbXAgZGVjbGFyZSB0YXJnZXQKKyNlbmRpZgordm9pZCBvbXB0X2NvbnRyb2woCisgICAgdWludDY0X3QgY29tbWFuZCwKKyAgICB1aW50NjRfdCBtb2RpZmllcgorKTsKKyNpZiAhZGVmaW5lZChfX2NsYW5nX18pICYmIGRlZmluZWQoX09QRU5NUCkgJiYgKF9PUEVOTVAgPj0gMjAxMzA3KQorI3ByYWdtYSBvbXAgZW5kIGRlY2xhcmUgdGFyZ2V0CisjZW5kaWYKKworLyogc3RhdGUgZW51bWVyYXRpb24gKi8KK09NUFRfQVBJX0ZVTkNUSU9OKGludCwgb21wdF9lbnVtZXJhdGVfc3RhdGUsICgKKyAgICBpbnQgY3VycmVudF9zdGF0ZSwKKyAgICBpbnQgKm5leHRfc3RhdGUsCisgICAgY29uc3QgY2hhciAqKm5leHRfc3RhdGVfbmFtZQorKSk7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK307CisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wLmgudmFyIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MC9vbXAuaC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAzMGRiZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wLmgudmFyCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogaW5jbHVkZS80MC9vbXAuaC52YXIKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBfX09NUF9ICisjICAgZGVmaW5lIF9fT01QX0gKKworIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9NQUpPUiAgICBATElCT01QX1ZFUlNJT05fTUFKT1JACisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX01JTk9SICAgIEBMSUJPTVBfVkVSU0lPTl9NSU5PUkAKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fQlVJTEQgICAgQExJQk9NUF9WRVJTSU9OX0JVSUxEQAorIyAgIGRlZmluZSBLTVBfQlVJTERfREFURSAgICAgICAiQExJQk9NUF9CVUlMRF9EQVRFQCIKKworIyAgIGlmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB7CisjICAgZW5kaWYKKworIyAgIGlmIGRlZmluZWQoX1dJTjMyKQorIyAgICAgICBkZWZpbmUgX19LQUlfS01QQ19DT05WRU5USU9OIF9fY2RlY2wKKyMgICBlbHNlCisjICAgICAgIGRlZmluZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04KKyMgICBlbmRpZgorCisgICAgLyogc2NoZWR1bGUga2luZCBjb25zdGFudHMgKi8KKyAgICB0eXBlZGVmIGVudW0gb21wX3NjaGVkX3QgeworCW9tcF9zY2hlZF9zdGF0aWMgID0gMSwKKwlvbXBfc2NoZWRfZHluYW1pYyA9IDIsCisJb21wX3NjaGVkX2d1aWRlZCAgPSAzLAorCW9tcF9zY2hlZF9hdXRvICAgID0gNAorICAgIH0gb21wX3NjaGVkX3Q7CisKKyAgICAvKiBzZXQgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X251bV90aHJlYWRzIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X2R5bmFtaWMgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X25lc3RlZCAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X3NjaGVkdWxlICAgICAgICAgIChvbXBfc2NoZWRfdCwgaW50KTsKKworICAgIC8qIHF1ZXJ5IEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9udW1fdGhyZWFkcyAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2R5bmFtaWMgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbmVzdGVkICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9tYXhfdGhyZWFkcyAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RocmVhZF9udW0gICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbnVtX3Byb2NzICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2luX3BhcmFsbGVsICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5fZmluYWwgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfYWN0aXZlX2xldmVsICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbGV2ZWwgICAgICAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSAoaW50KTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF90ZWFtX3NpemUgICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RocmVhZF9saW1pdCAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3NjaGVkdWxlICAgICAgICAgICAgKG9tcF9zY2hlZF90ICosIGludCAqKTsKKworICAgIC8qIGxvY2sgQVBJIGZ1bmN0aW9ucyAqLworICAgIHR5cGVkZWYgc3RydWN0IG9tcF9sb2NrX3QgeworICAgICAgICB2b2lkICogX2xrOworICAgIH0gb21wX2xvY2tfdDsKKworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5pdF9sb2NrICAgIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X2xvY2sgICAgIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdW5zZXRfbG9jayAgIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZGVzdHJveV9sb2NrIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdGVzdF9sb2NrICAgIChvbXBfbG9ja190ICopOworCisgICAgLyogbmVzdGVkIGxvY2sgQVBJIGZ1bmN0aW9ucyAqLworICAgIHR5cGVkZWYgc3RydWN0IG9tcF9uZXN0X2xvY2tfdCB7CisgICAgICAgIHZvaWQgKiBfbGs7CisgICAgfSBvbXBfbmVzdF9sb2NrX3Q7CisKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2luaXRfbmVzdF9sb2NrICAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbmVzdF9sb2NrICAgICAob21wX25lc3RfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdW5zZXRfbmVzdF9sb2NrICAgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF90ZXN0X25lc3RfbG9jayAgICAob21wX25lc3RfbG9ja190ICopOworCisgICAgLyogdGltZSBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIGRvdWJsZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfd3RpbWUgKHZvaWQpOworICAgIGV4dGVybiBkb3VibGUgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3d0aWNrICh2b2lkKTsKKworICAgIC8qIE9wZW5NUCA0LjAgKi8KKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UgKHZvaWQpOworICAgIGV4dGVybiB2b2lkIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9kZWZhdWx0X2RldmljZSAoaW50KTsKKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pc19pbml0aWFsX2RldmljZSAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X251bV9kZXZpY2VzICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbnVtX3RlYW1zICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfdGVhbV9udW0gKHZvaWQpOworICAgIGV4dGVybiBpbnQgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9jYW5jZWxsYXRpb24gKHZvaWQpOworCisjICAgaW5jbHVkZSA8c3RkbGliLmg+CisgICAgLyoga21wIEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9zdGFja3NpemUgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3N0YWNrc2l6ZSAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gc2l6ZV90IF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9zdGFja3NpemVfcyAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3N0YWNrc2l6ZV9zICAgICAgICAoc2l6ZV90KTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9ibG9ja3RpbWUgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2xpYnJhcnkgICAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYmxvY2t0aW1lICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnkgICAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3NlcmlhbCAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0ICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9kZWZhdWx0cyAgICAgICAgICAgKGNoYXIgY29uc3QgKik7CisKKyAgICAvKiBJbnRlbCBhZmZpbml0eSBBUEkgKi8KKyAgICB0eXBlZGVmIHZvaWQgKiBrbXBfYWZmaW5pdHlfbWFza190OworCisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYWZmaW5pdHkgICAgICAgICAgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYWZmaW5pdHkgICAgICAgICAgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sgICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyAgIChpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MgKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MgICAoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworCisgICAgLyogT3Blbk1QIDQuMCBhZmZpbml0eSBBUEkgKi8KKyAgICB0eXBlZGVmIGVudW0gb21wX3Byb2NfYmluZF90IHsKKyAgICAgICAgb21wX3Byb2NfYmluZF9mYWxzZSA9IDAsCisgICAgICAgIG9tcF9wcm9jX2JpbmRfdHJ1ZSA9IDEsCisgICAgICAgIG9tcF9wcm9jX2JpbmRfbWFzdGVyID0gMiwKKyAgICAgICAgb21wX3Byb2NfYmluZF9jbG9zZSA9IDMsCisgICAgICAgIG9tcF9wcm9jX2JpbmRfc3ByZWFkID0gNAorICAgIH0gb21wX3Byb2NfYmluZF90OworCisgICAgZXh0ZXJuIG9tcF9wcm9jX2JpbmRfdCBfX0tBSV9LTVBDX0NPTlZFTlRJT04gb21wX2dldF9wcm9jX2JpbmQgKHZvaWQpOworCisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9tYWxsb2MgIChzaXplX3QpOworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfYWxpZ25lZF9tYWxsb2MgIChzaXplX3QsIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9jYWxsb2MgIChzaXplX3QsIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9yZWFsbG9jICh2b2lkICosIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9mcmVlICAgICh2b2lkICopOworCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfd2FybmluZ3Nfb24odm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfd2FybmluZ3Nfb2ZmKHZvaWQpOworCisjICAgdW5kZWYgX19LQUlfS01QQ19DT05WRU5USU9OCisKKyAgICAvKiBXYXJuaW5nOgorICAgICAgIFRoZSBmb2xsb3dpbmcgdHlwZWRlZnMgYXJlIG5vdCBzdGFuZGFyZCwgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuCisgICAgKi8KKyAgICB0eXBlZGVmIGludCAgICAgb21wX2ludF90OworICAgIHR5cGVkZWYgZG91YmxlICBvbXBfd3RpbWVfdDsKKworIyAgIGlmZGVmIF9fY3BsdXNwbHVzCisgICAgfQorIyAgIGVuZGlmCisKKyNlbmRpZiAvKiBfX09NUF9IICovCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5mLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5mLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzM3MWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MC9vbXBfbGliLmYudmFyCkBAIC0wLDAgKzEsNzc0IEBACishIGluY2x1ZGUvNDAvb21wX2xpYi5mLnZhcgorCishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKyEqKioKKyEqKiogU29tZSBvZiB0aGUgZGlyZWN0aXZlcyBmb3IgdGhlIGZvbGxvd2luZyByb3V0aW5lIGV4dGVuZCBwYXN0IGNvbHVtbiA3MiwKKyEqKiogc28gcHJvY2VzcyB0aGlzIGZpbGUgaW4gMTMyLWNvbHVtbiBtb2RlLgorISoqKgorCishZGVjJCBmaXhlZGZvcm1saW5lc2l6ZToxMzIKKworICAgICAgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2ludGVnZXJfa2luZCAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2dpY2FsX2tpbmQgICAgICAgPSA0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcmVhbF9raW5kICAgICAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfa2luZCAgICAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbmVzdF9sb2NrX2tpbmQgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9raW5kICAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2tpbmQgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3BvaW50ZXJfa2luZCAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9hZmZpbml0eV9tYXNrX2tpbmQgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9raW5kICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliX2tpbmRzCisKKyAgICAgIG1vZHVsZSBvbXBfbGliCisKKyAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWFqb3IgPSBATElCT01QX1ZFUlNJT05fTUFKT1JACisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9taW5vciA9IEBMSUJPTVBfVkVSU0lPTl9NSU5PUkAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX2J1aWxkID0gQExJQk9NUF9WRVJTSU9OX0JVSUxEQAorICAgICAgICBjaGFyYWN0ZXIoKiksIHBhcmFtZXRlciA6OiBrbXBfYnVpbGRfZGF0ZSAgICA9ICdATElCT01QX0JVSUxEX0RBVEVAJworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjogb3Blbm1wX3ZlcnNpb24gICAgPSBATElCT01QX09NUF9ZRUFSX01PTlRIQAorCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfc3RhdGljICA9IDEKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9keW5hbWljID0gMgorICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2d1aWRlZCAgPSAzCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfYXV0byAgICA9IDQKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2ZhbHNlID0gMAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3RydWUgPSAxCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfbWFzdGVyID0gMgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2Nsb3NlID0gMworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3NwcmVhZCA9IDQKKworICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3BhcmFsbGVsID0gMQorICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX2xvb3AgPSAyCisgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfc2VjdGlvbnMgPSAzCisgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfdGFza2dyb3VwID0gNAorCisgICAgICAgIGludGVyZmFjZQorCishICAgICAgICAgKioqCishICAgICAgICAgKioqIG9tcF8qIGVudHJ5IHBvaW50cworISAgICAgICAgICoqKgorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzKG51bV90aHJlYWRzKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbnVtX3RocmVhZHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYyhkeW5hbWljX3RocmVhZHMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBkeW5hbWljX3RocmVhZHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQobmVzdGVkKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgbmVzdGVkCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3Byb2NzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX3BhcmFsbGVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2luX2ZpbmFsKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9maW5hbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fZmluYWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X2R5bmFtaWMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9keW5hbWljCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X25lc3RlZAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbGltaXQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyhtYXhfbGV2ZWxzKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbWF4X2xldmVscworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hY3RpdmVfbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bShsZXZlbCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxldmVsCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplKGxldmVsKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbGV2ZWwKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX3NpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZShraW5kLCBjaHVua19zaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpIGtpbmQKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgY2h1bmtfc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZShraW5kLCBjaHVua19zaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpIGtpbmQKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgY2h1bmtfc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfcHJvY19iaW5kKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCkgb21wX2dldF9wcm9jX2JpbmQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9wcm9jX2JpbmQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUoKQorICAgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aW1lCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sgKCkKKyAgICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGljaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9kZWZhdWx0X2RldmljZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlKGRldmljZV9udW0pCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBkZXZpY2VfbnVtCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9kZWZhdWx0X2RldmljZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fZGV2aWNlcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9kZXZpY2VzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX2RldmljZXMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RlYW1zKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RlYW1zCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RlYW1zCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9jYW5jZWxsYXRpb24oKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9jYW5jZWxsYXRpb24KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9jYW5jZWxsYXRpb24KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pc19pbml0aWFsX2RldmljZSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2lzX2luaXRpYWxfZGV2aWNlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2soc3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9pbml0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBzdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrKHN2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfZGVzdHJveV9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrKHN2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfc2V0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBzdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrKHN2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdW5zZXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbG9jayhzdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Rlc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF90ZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jayhudmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBudmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jayhudmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBudmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrKG52YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfc2V0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbnZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sobnZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sobnZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF90ZXN0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF90ZXN0X25lc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKioga21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplKHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcyhzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZShtc2VjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbXNlYworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkobGlibnVtKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbGlibnVtCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMoc3RyaW5nKQorICAgICAgICAgICAgY2hhcmFjdGVyKigqKSBzdHJpbmcKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9ibG9ja3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5KG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5CisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eShtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayhtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrKG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX21hbGxvYyhzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX21hbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2FsaWduZWRfbWFsbG9jKHNpemUsIGFsaWdubWVudCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9hbGlnbmVkX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBhbGlnbm1lbnQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2FsaWduZWRfbWFsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfY2FsbG9jKG5lbGVtLCBlbHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfY2FsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgbmVsZW0KKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBlbHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2NhbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3JlYWxsb2MocHRyLCBzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX3JlYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkgcHRyCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfcmVhbGxvYworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZnJlZShwdHIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwdHIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZnJlZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uKCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmKCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZgorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzKGNhbmNlbGtpbmQpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpIGNhbmNlbGtpbmQKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworCisgICAgICAgIGVuZCBpbnRlcmZhY2UKKworIWRlYyQgaWYgZGVmaW5lZChfV0lOMzIpCishZGVjJCAgIGlmIGRlZmluZWQoX1dJTjY0KSAub3IuIGRlZmluZWQoX01fQU1ENjQpCisKKyEqKioKKyEqKiogVGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIG11c3QgYmUgaW4gdXBwZXJjYXNlLCBldmVuIGlmIHRoZSAvUWxvd2VyY2FzZQorISoqKiBvcHRpb24gaXMgc3BlY2lmaWVkLiAgVGhlIGFsaWFzIGF0dHJpYnV0ZSBlbnN1cmVzIHRoYXQgdGhlIHNwZWNpZmllZAorISoqKiBzdHJpbmcgaXMgdXNlZCBhcyB0aGUgZW50cnkgcG9pbnQuCishKioqCishKioqIE9uIHRoZSBXaW5kb3dzKiBPUyBJQS0zMiBhcmNoaXRlY3R1cmUsIHRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBoYXZlIGFuCishKioqIHVuZGVyc2NvcmUgcHJlcGVuZGVkLiAgT24gdGhlIFdpbmRvd3MqIE9TIEludGVsKFIpIDY0CishKioqIGFyY2hpdGVjdHVyZSwgbm8gdW5kZXJzY29yZSBpcyBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfRFlOQU1JQycgOjogb21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX05FU1RFRCcgOjogb21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX1RIUkVBRFMnIDo6IG9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEhSRUFEX05VTScgOjogb21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9QUk9DUycgOjogb21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9JTl9QQVJBTExFTCcgOjogb21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0RZTkFNSUMnIDo6IG9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9ORVNURUQnIDo6IG9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RIUkVBRF9MSU1JVCcgOjogb21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTEVWRUwnIDo6IG9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfQUNUSVZFX0xFVkVMJyA6OiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNJyA6OiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEVBTV9TSVpFJyA6OiBvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9TQ0hFRFVMRScgOjogb21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9TQ0hFRFVMRScgOjogb21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9QUk9DX0JJTkQnIDo6IG9tcF9nZXRfcHJvY19iaW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1dUSU1FJyA6OiBvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1dUSUNLJyA6OiBvbXBfZ2V0X3d0aWNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0RFRkFVTFRfREVWSUNFJyA6OiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX0RFRkFVTFRfREVWSUNFJyA6OiBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9ERVZJQ0VTJyA6OiBvbXBfZ2V0X251bV9kZXZpY2VzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9URUFNUycgOjogb21wX2dldF9udW1fdGVhbXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEVBTV9OVU0nIDo6IG9tcF9nZXRfdGVhbV9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfQ0FOQ0VMTEFUSU9OJyA6OiBvbXBfZ2V0X2NhbmNlbGxhdGlvbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0lTX0lOSVRJQUxfREVWSUNFJyA6OiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9jaycgOjogb21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbG9jaycgOjogb21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9sb2NrJyA6OiBvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9sb2NrJyA6OiBvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbG9jaycgOjogb21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbmVzdF9sb2NrJyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X25lc3RfbG9jaycgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X25lc3RfbG9jaycgOjogb21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9uZXN0X2xvY2snIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X25lc3RfbG9jaycgOjogb21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfU1RBQ0tTSVpFJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfU1RBQ0tTSVpFX1MnOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0JMT0NLVElNRSc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfU0VSSUFMJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQnOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQnOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX1NUQUNLU0laRSc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX1NUQUNLU0laRV9TJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9CTE9DS1RJTUUnOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9MSUJSQVJZJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0FGRklOSVRZJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWSc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQUZGSU5JVFlfTUFYX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfQ1JFQVRFX0FGRklOSVRZX01BU0snOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9ERVNUUk9ZX0FGRklOSVRZX01BU0snOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX01BTExPQyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9BTElHTkVEX01BTExPQyc6OmttcF9hbGlnbmVkX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0NBTExPQyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9SRUFMTE9DJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9GUkVFJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9XQVJOSU5HU19PTic6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfV0FSTklOR1NfT0ZGJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9DQU5DRUxMQVRJT05fU1RBVFVTJyA6OiBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKworIWRlYyQgICBlbHNlCisKKyEqKioKKyEqKiogT24gV2luZG93cyogT1MgSUEtMzIgYXJjaGl0ZWN0dXJlLCB0aGUgRm9ydHJhbiBlbnRyeSBwb2ludHMgaGF2ZSBhbiB1bmRlcnNjb3JlIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX0RZTkFNSUMnIDo6IG9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfTkVTVEVEJyA6OiBvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX01BWF9USFJFQURTJyA6OiBvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9USFJFQURfTlVNJyA6OiBvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9QUk9DUycgOjogb21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfSU5fUEFSQUxMRUwnIDo6IG9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfRFlOQU1JQycgOjogb21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9ORVNURUQnIDo6IG9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9USFJFQURfTElNSVQnIDo6IG9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9NQVhfQUNUSVZFX0xFVkVMUycgOjogb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0xFVkVMJyA6OiBvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9BQ1RJVkVfTEVWRUwnIDo6IG9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNJyA6OiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RFQU1fU0laRScgOjogb21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX1NDSEVEVUxFJyA6OiBvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9TQ0hFRFVMRScgOjogb21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfUFJPQ19CSU5EJyA6OiBvbXBfZ2V0X3Byb2NfYmluZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfV1RJTUUnIDo6IG9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1dUSUNLJyA6OiBvbXBfZ2V0X3d0aWNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9ERUZBVUxUX0RFVklDRScgOjogb21wX2dldF9kZWZhdWx0X2RldmljZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfREVGQVVMVF9ERVZJQ0UnIDo6IG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9ERVZJQ0VTJyA6OiBvbXBfZ2V0X251bV9kZXZpY2VzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fVEVBTVMnIDo6IG9tcF9nZXRfbnVtX3RlYW1zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9URUFNX05VTScgOjogb21wX2dldF90ZWFtX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfQ0FOQ0VMTEFUSU9OJyA6OiBvbXBfZ2V0X2NhbmNlbGxhdGlvbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9JU19JTklUSUFMX0RFVklDRScgOjogb21wX2lzX2luaXRpYWxfZGV2aWNlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9sb2NrJyA6OiBvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbG9jaycgOjogb21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbG9jaycgOjogb21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X2xvY2snIDo6IG9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbG9jaycgOjogb21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X25lc3RfbG9jaycgOjogb21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbmVzdF9sb2NrJyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RfbG9jaycgOjogb21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbmVzdF9sb2NrJyA6OiBvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbmVzdF9sb2NrJyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfU1RBQ0tTSVpFJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1NUQUNLU0laRV9TJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQkxPQ0tUSU1FJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfU0VSSUFMJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5EJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfVEhST1VHSFBVVCc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9TVEFDS1NJWkUnOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfU1RBQ0tTSVpFX1MnOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9CTE9DS1RJTUUnOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfTElCUkFSWSc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQUZGSU5JVFknOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9BRkZJTklUWSc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0FGRklOSVRZX01BWF9QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9DUkVBVEVfQUZGSU5JVFlfTUFTSyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9ERVNUUk9ZX0FGRklOSVRZX01BU0snOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9NQUxMT0MnOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0FMSUdORURfTUFMTE9DJzo6a21wX2FsaWduZWRfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0NBTExPQyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfUkVBTExPQyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0ZSRUUnOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9XQVJOSU5HU19PTic6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1dBUk5JTkdTX09GRic6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0NBTkNFTExBVElPTl9TVEFUVVMnIDo6IGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworCishZGVjJCAgIGVuZGlmCishZGVjJCBlbmRpZgorCishZGVjJCBpZiBkZWZpbmVkKF9fbGludXgpCisKKyEqKioKKyEqKiogVGhlIExpbnV4KiBPUyBlbnRyeSBwb2ludHMgYXJlIGluIGxvd2VyY2FzZSwgd2l0aCBhbiB1bmRlcnNjb3JlIGFwcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X251bV90aHJlYWRzXyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfZHluYW1pY18nOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdGVkXyc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV90aHJlYWRzXyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbWF4X3RocmVhZHNfJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90aHJlYWRfbnVtXyc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fcHJvY3NfJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbl9wYXJhbGxlbF8nOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfZHluYW1pY18nOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbmVzdGVkXyc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RocmVhZF9saW1pdF8nOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbGV2ZWxfJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9hY3RpdmVfbGV2ZWxfJzo6b21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bV8nOjpvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGVhbV9zaXplXyc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X3NjaGVkdWxlXyc6Om9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfc2NoZWR1bGVfJzo6b21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9wcm9jX2JpbmRfJyA6OiBvbXBfZ2V0X3Byb2NfYmluZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF93dGltZV8nOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3d0aWNrXyc6Om9tcF9nZXRfd3RpY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfZGVmYXVsdF9kZXZpY2VfJzo6b21wX2dldF9kZWZhdWx0X2RldmljZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9kZWZhdWx0X2RldmljZV8nOjpvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV9kZXZpY2VzXyc6Om9tcF9nZXRfbnVtX2RldmljZXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbnVtX3RlYW1zXyc6Om9tcF9nZXRfbnVtX3RlYW1zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RlYW1fbnVtXyc6Om9tcF9nZXRfdGVhbV9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfY2FuY2VsbGF0aW9uXyc6Om9tcF9nZXRfY2FuY2VsbGF0aW9uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaXNfaW5pdGlhbF9kZXZpY2VfJzo6b21wX2lzX2luaXRpYWxfZGV2aWNlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X2xvY2tfJzo6b21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbG9ja18nOjpvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2xvY2tfJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbG9ja18nOjpvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbG9ja18nOjpvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9uZXN0X2xvY2tfJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9uZXN0X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X25lc3RfbG9ja18nOjpvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X25lc3RfbG9ja18nOjpvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9uZXN0X2xvY2tfJzo6b21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfc3RhY2tzaXplXyc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfYmxvY2t0aW1lXyc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfc2VyaWFsXyc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kXyc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF8nOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5Xyc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9zdGFja3NpemVfJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfc3RhY2tzaXplX3NfJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9ibG9ja3RpbWVfJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfbGlicmFyeV8nOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfYWZmaW5pdHlfJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9hZmZpbml0eV8nOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9jcmVhdGVfYWZmaW5pdHlfbWFza18nOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9tYWxsb2NfJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2FsaWduZWRfbWFsbG9jXyc6OmttcF9hbGlnbmVkX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2NhbGxvY18nOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfcmVhbGxvY18nOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2ZyZWVfJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF93YXJuaW5nc19vbl8nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3dhcm5pbmdzX29mZl8nOjprbXBfc2V0X3dhcm5pbmdzX29mZgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzXyc6OmttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworCishZGVjJCBlbmRpZgorCishZGVjJCBpZiBkZWZpbmVkKF9fQVBQTEVfXykKKworISoqKgorISoqKiBUaGUgTWFjIGVudHJ5IHBvaW50cyBhcmUgaW4gbG93ZXJjYXNlLCB3aXRoIGFuIGJvdGggYW4gdW5kZXJzY29yZQorISoqKiBhcHBlbmRlZCBhbmQgYW4gdW5kZXJzY29yZSBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X251bV90aHJlYWRzXyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2R5bmFtaWNfJzo6b21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9uZXN0ZWRfJzo6b21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X251bV90aHJlYWRzXyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X21heF90aHJlYWRzXyc6Om9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RocmVhZF9udW1fJzo6b21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9udW1fcHJvY3NfJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5fcGFyYWxsZWxfJzo6b21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9keW5hbWljXyc6Om9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbmVzdGVkXyc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90aHJlYWRfbGltaXRfJzo6b21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2xldmVsXyc6Om9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2FjdGl2ZV9sZXZlbF8nOjpvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bV8nOjpvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RlYW1fc2l6ZV8nOjpvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfc2NoZWR1bGVfJzo6b21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfc2NoZWR1bGVfJzo6b21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfcHJvY19iaW5kXycgOjogb21wX2dldF9wcm9jX2JpbmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3d0aW1lXyc6Om9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3d0aWNrXyc6Om9tcF9nZXRfd3RpY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X251bV90ZWFtc18nOjpvbXBfZ2V0X251bV90ZWFtcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGVhbV9udW1fJzo6b21wX2dldF90ZWFtX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfY2FuY2VsbGF0aW9uXyc6Om9tcF9nZXRfY2FuY2VsbGF0aW9uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2lzX2luaXRpYWxfZGV2aWNlXyc6Om9tcF9pc19pbml0aWFsX2RldmljZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbG9ja18nOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbG9ja18nOjpvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9sb2NrXyc6Om9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9sb2NrXyc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbG9ja18nOjpvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbmVzdF9sb2NrXyc6Om9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X25lc3RfbG9ja18nOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RfbG9ja18nOjpvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9uZXN0X2xvY2tfJzo6b21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X25lc3RfbG9ja18nOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfc3RhY2tzaXplXyc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9zdGFja3NpemVfc18nOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9ibG9ja3RpbWVfJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfc2VyaWFsXyc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF8nOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0Xyc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5Xyc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfc3RhY2tzaXplXyc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9zdGFja3NpemVfc18nOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9ibG9ja3RpbWVfJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2xpYnJhcnlfJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9hZmZpbml0eV8nOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9hZmZpbml0eV8nOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9hZmZpbml0eV9tYXhfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrXyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfbWFsbG9jXyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfYWxpZ25lZF9tYWxsb2NfJzo6a21wX2FsaWduZWRfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2NhbGxvY18nOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3JlYWxsb2NfJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZnJlZV8nOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF93YXJuaW5nc19vbl8nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF93YXJuaW5nc19vZmZfJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1c18nOjprbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKworIWRlYyQgZW5kaWYKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5mOTAudmFyIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MC9vbXBfbGliLmY5MC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU1YTIzYQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5mOTAudmFyCkBAIC0wLDAgKzEsNDU1IEBACishIGluY2x1ZGUvNDAvb21wX2xpYi5mOTAudmFyCisKKyEKKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIS8vCishLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIS8vCishLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIS8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIS8vCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEKKworICAgICAgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgICB1c2UsIGludHJpbnNpYyA6OiBpc29fY19iaW5kaW5nCisKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9pbnRlZ2VyX2tpbmQgICAgICAgPSBjX2ludAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvZ2ljYWxfa2luZCAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9yZWFsX2tpbmQgICAgICAgICAgPSBjX2Zsb2F0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfZG91YmxlX2tpbmQgICAgICAgID0gY19kb3VibGUKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2tpbmQgICAgICAgICAgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbmVzdF9sb2NrX2tpbmQgICAgID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2tpbmQgICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfa2luZCAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3NpemVfdF9raW5kICAgICAgICA9IGNfc2l6ZV90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfYWZmaW5pdHlfbWFza19raW5kID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9raW5kICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliX2tpbmRzCisKKyAgICAgIG1vZHVsZSBvbXBfbGliCisKKyAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjogb3Blbm1wX3ZlcnNpb24gICAgPSBATElCT01QX09NUF9ZRUFSX01PTlRIQAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWFqb3IgPSBATElCT01QX1ZFUlNJT05fTUFKT1JACisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9taW5vciA9IEBMSUJPTVBfVkVSU0lPTl9NSU5PUkAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX2J1aWxkID0gQExJQk9NUF9WRVJTSU9OX0JVSUxEQAorICAgICAgICBjaGFyYWN0ZXIoKikgICAgICAgICAgICAgICBrbXBfYnVpbGRfZGF0ZQorICAgICAgICBwYXJhbWV0ZXIoIGttcF9idWlsZF9kYXRlID0gJ0BMSUJPTVBfQlVJTERfREFURUAnICkKKworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX3N0YXRpYyAgPSAxCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZHluYW1pYyA9IDIKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9ndWlkZWQgID0gMworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2F1dG8gICAgPSA0CisKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2ZhbHNlID0gMAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3RydWUgPSAxCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfbWFzdGVyID0gMgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2Nsb3NlID0gMworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3NwcmVhZCA9IDQKKworICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3BhcmFsbGVsID0gMQorICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX2xvb3AgPSAyCisgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfc2VjdGlvbnMgPSAzCisgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfdGFza2dyb3VwID0gNAorCisgICAgICAgIGludGVyZmFjZQorCishICAgICAgICAgKioqCishICAgICAgICAgKioqIG9tcF8qIGVudHJ5IHBvaW50cworISAgICAgICAgICoqKgorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzKG51bV90aHJlYWRzKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbnVtX3RocmVhZHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYyhkeW5hbWljX3RocmVhZHMpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpLCB2YWx1ZSA6OiBkeW5hbWljX3RocmVhZHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQobmVzdGVkKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSwgdmFsdWUgOjogbmVzdGVkCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fcHJvY3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9wYXJhbGxlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9maW5hbCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9maW5hbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fZmluYWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfZHluYW1pYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9uZXN0ZWQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0KCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbGltaXQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyhtYXhfbGV2ZWxzKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbWF4X2xldmVscworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2xldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hY3RpdmVfbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bShsZXZlbCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplKGxldmVsKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fc2l6ZQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZShraW5kLCBjaHVua19zaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCksIHZhbHVlIDo6IGtpbmQKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGNodW5rX3NpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUoa2luZCwgY2h1bmtfc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpIGtpbmQKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgY2h1bmtfc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfcHJvY19iaW5kKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSBvbXBfZ2V0X3Byb2NfYmluZAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3Byb2NfYmluZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGltZSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICByZWFsIChraW5kPWttcF9kb3VibGVfa2luZCkgb21wX2dldF93dGltZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIHJlYWwgKGtpbmQ9a21wX2RvdWJsZV9raW5kKSBvbXBfZ2V0X3d0aWNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9kZWZhdWx0X2RldmljZShkZXZpY2VfbnVtKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogZGV2aWNlX251bQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX2RldmljZXMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9kZXZpY2VzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX2RldmljZXMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RlYW1zKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGVhbXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9udW0oKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfY2FuY2VsbGF0aW9uKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9jYW5jZWxsYXRpb24KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9jYW5jZWxsYXRpb24KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pc19pbml0aWFsX2RldmljZSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pc19pbml0aWFsX2RldmljZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jayhzdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfaW5pdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jayhzdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfZGVzdHJveV9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrKHN2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9zZXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2soc3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Vuc2V0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBzdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2soc3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Rlc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF90ZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jayhudmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKG52YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbnZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jayhudmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfc2V0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbnZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sobnZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbnZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jayhudmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfdGVzdF9uZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBudmFyCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jaworCishICAgICAgICAgKioqCishICAgICAgICAgKioqIGttcF8qIGVudHJ5IHBvaW50cworISAgICAgICAgICoqKgorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZShzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3Moc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUobXNlYykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG1zZWMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQoKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQoKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5KGxpYm51bSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxpYm51bQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzKHN0cmluZykgYmluZChjKQorICAgICAgICAgICAgdXNlLCBpbnRyaW5zaWMgOjogaXNvX2NfYmluZGluZworICAgICAgICAgICAgY2hhcmFjdGVyIChraW5kPWNfY2hhcikgOjogc3RyaW5nKCopCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkga21wX2dldF9zdGFja3NpemVfcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYmxvY2t0aW1lCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5KG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHkKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5KG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHkKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayhtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sobWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9tYWxsb2Moc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9tYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9hbGlnbmVkX21hbGxvYyhzaXplLCBhbGlnbm1lbnQpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9hbGlnbmVkX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IGFsaWdubWVudAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfYWxpZ25lZF9tYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9jYWxsb2MobmVsZW0sIGVsc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2NhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBuZWxlbQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBlbHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2NhbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3JlYWxsb2MocHRyLCBzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfcmVhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSwgdmFsdWUgOjogcHRyCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3JlYWxsb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2ZyZWUocHRyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSwgdmFsdWUgOjogcHRyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2ZyZWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbigpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMoY2FuY2Vsa2luZCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgdmFsdWUgOjogY2FuY2Vsa2luZAorICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisKKyAgICAgICAgZW5kIGludGVyZmFjZQorCisgICAgICBlbmQgbW9kdWxlIG9tcF9saWIKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5oLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzQ2MWE4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MC9vbXBfbGliLmgudmFyCkBAIC0wLDAgKzEsNTY3IEBACishIGluY2x1ZGUvNDAvb21wX2xpYi5oLnZhcgorCishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKyEqKioKKyEqKiogU29tZSBvZiB0aGUgZGlyZWN0aXZlcyBmb3IgdGhlIGZvbGxvd2luZyByb3V0aW5lIGV4dGVuZCBwYXN0IGNvbHVtbiA3MiwKKyEqKiogc28gcHJvY2VzcyB0aGlzIGZpbGUgaW4gMTMyLWNvbHVtbiBtb2RlLgorISoqKgorCishRElSJCBmaXhlZGZvcm1saW5lc2l6ZToxMzIKKworICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9pbnRlZ2VyX2tpbmQgICAgICAgPSA0CisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvZ2ljYWxfa2luZCAgICAgICA9IDQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcmVhbF9raW5kICAgICAgICAgID0gNAorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2tpbmQgICAgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9uZXN0X2xvY2tfa2luZCAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9raW5kICAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9raW5kICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfYWZmaW5pdHlfbWFza19raW5kID0gaW50X3B0cl9raW5kKCkKKworICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IG9wZW5tcF92ZXJzaW9uICAgID0gQExJQk9NUF9PTVBfWUVBUl9NT05USEAKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9tYWpvciA9IEBMSUJPTVBfVkVSU0lPTl9NQUpPUkAKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9taW5vciA9IEBMSUJPTVBfVkVSU0lPTl9NSU5PUkAKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9idWlsZCA9IEBMSUJPTVBfVkVSU0lPTl9CVUlMREAKKyAgICAgIGNoYXJhY3RlcigqKSAgICAgICAgICAgICAgIGttcF9idWlsZF9kYXRlCisgICAgICBwYXJhbWV0ZXIoIGttcF9idWlsZF9kYXRlID0gJ0BMSUJPTVBfQlVJTERfREFURUAnICkKKworICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9zdGF0aWMgID0gMQorICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9keW5hbWljID0gMgorICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9ndWlkZWQgID0gMworICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9hdXRvICAgID0gNAorCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2ZhbHNlID0gMAorICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF90cnVlID0gMQorICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9tYXN0ZXIgPSAyCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2Nsb3NlID0gMworICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9zcHJlYWQgPSA0CisKKyAgICAgIGludGVyZmFjZQorCishICAgICAgICoqKgorISAgICAgICAqKiogb21wXyogZW50cnkgcG9pbnRzCishICAgICAgICoqKgorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcyhudW1fdGhyZWFkcykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG51bV90aHJlYWRzCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYyhkeW5hbWljX3RocmVhZHMpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpLCB2YWx1ZSA6OiBkeW5hbWljX3RocmVhZHMKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZChuZXN0ZWQpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpLCB2YWx1ZSA6OiBuZXN0ZWQKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGhyZWFkcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF90aHJlYWRzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0KKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3Byb2NzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbCgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9wYXJhbGxlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2luX2ZpbmFsKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX2ZpbmFsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fZmluYWwKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X2R5bmFtaWMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9uZXN0ZWQKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9saW1pdAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMobWF4X2xldmVscykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG1heF9sZXZlbHMKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9sZXZlbCgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbGV2ZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbCgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYWN0aXZlX2xldmVsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bShsZXZlbCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGV2ZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplKGxldmVsKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fc2l6ZQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxldmVsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZQorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZShraW5kLCBjaHVua19zaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCksIHZhbHVlIDo6IGtpbmQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBjaHVua19zaXplCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUoa2luZCwgY2h1bmtfc2l6ZSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpIGtpbmQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGNodW5rX3NpemUKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfcHJvY19iaW5kKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSBvbXBfZ2V0X3Byb2NfYmluZAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9wcm9jX2JpbmQKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lKCkgYmluZChjKQorICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGltZQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGltZQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2soKSBiaW5kKGMpCisgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aWNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9kZWZhdWx0X2RldmljZSgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UoZGV2aWNlX251bSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGRldmljZV9udW0KKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9kZWZhdWx0X2RldmljZQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX2RldmljZXMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9kZXZpY2VzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90ZWFtcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX251bQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX251bQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9pc19pbml0aWFsX2RldmljZSgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pc19pbml0aWFsX2RldmljZQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2lzX2luaXRpYWxfZGV2aWNlCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrKHN2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9pbml0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBzdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2soc3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2Rlc3Ryb3lfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrKHN2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9zZXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jayhzdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdW5zZXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sKKworICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrKHN2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF90ZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfdGVzdF9sb2NrCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBzdmFyCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sobnZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBudmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKG52YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbnZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrKG52YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBudmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrKG52YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jaworCisgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jayhudmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfdGVzdF9uZXN0X2xvY2sKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbnZhcgorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrCisKKyEgICAgICAgKioqCishICAgICAgICoqKiBrbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgKioqCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZShzaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcyhzaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3MKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lKG1zZWMpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtc2VjCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsKCkgYmluZChjKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCgpIGJpbmQoYykKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCkgYmluZChjKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5KGxpYm51bSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxpYm51bQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMoc3RyaW5nKSBiaW5kKGMpCisgICAgICAgICAgY2hhcmFjdGVyIHN0cmluZygqKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkobWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkobWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sobWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sobWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX21hbGxvYyhzaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfbWFsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfbWFsbG9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2FsaWduZWRfbWFsbG9jKHNpemUsIGFsaWdubWVudCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2FsaWduZWRfbWFsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBhbGlnbm1lbnQKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9hbGlnbmVkX21hbGxvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF9jYWxsb2MobmVsZW0sIGVsc2l6ZSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2NhbGxvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogbmVsZW0KKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IGVsc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2NhbGxvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF9yZWFsbG9jKHB0ciwgc2l6ZSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX3JlYWxsb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpLCB2YWx1ZSA6OiBwdHIKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9yZWFsbG9jCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfZnJlZShwdHIpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpLCB2YWx1ZSA6OiBwdHIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2ZyZWUKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24oKSBiaW5kKGMpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24KKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmKCkgYmluZChjKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZgorCisgICAgICBlbmQgaW50ZXJmYWNlCisKKyFESVIkIElGIERFRklORUQgKF9fSU5URUxfT0ZGTE9BRCkKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9udW1fdGhyZWFkcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X2R5bmFtaWMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9uZXN0ZWQKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9udW1fdGhyZWFkcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X21heF90aHJlYWRzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfdGhyZWFkX251bQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X251bV9wcm9jcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaW5fcGFyYWxsZWwKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2luX2ZpbmFsCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfZHluYW1pYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X25lc3RlZAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3RocmVhZF9saW1pdAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9sZXZlbAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF90ZWFtX3NpemUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9zY2hlZHVsZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3NjaGVkdWxlCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfcHJvY19iaW5kCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfd3RpbWUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF93dGljaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2lzX2luaXRpYWxfZGV2aWNlCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbnVtX2RldmljZXMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9udW1fdGVhbXMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF90ZWFtX251bQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaW5pdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9kZXN0cm95X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF91bnNldF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF90ZXN0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2luaXRfbmVzdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X25lc3RfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfdW5zZXRfbmVzdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF90ZXN0X25lc3RfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X3N0YWNrc2l6ZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X3N0YWNrc2l6ZV9zCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfYmxvY2t0aW1lCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9saWJyYXJ5CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfZGVmYXVsdHMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9zdGFja3NpemUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9zdGFja3NpemVfcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZ2V0X2Jsb2NrdGltZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZ2V0X2xpYnJhcnkKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9hZmZpbml0eQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZ2V0X2FmZmluaXR5CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfbWFsbG9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9hbGlnbmVkX21hbGxvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfY2FsbG9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9yZWFsbG9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9mcmVlCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfd2FybmluZ3Nfb24KKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF93YXJuaW5nc19vZmYKKworIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9udW1fdGhyZWFkcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X2R5bmFtaWMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9uZXN0ZWQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9udW1fdGhyZWFkcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X21heF90aHJlYWRzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfdGhyZWFkX251bSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X251bV9wcm9jcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfaW5fcGFyYWxsZWwgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2luX2ZpbmFsICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfZHluYW1pYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X25lc3RlZCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3RocmVhZF9saW1pdCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9sZXZlbCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X2FjdGl2ZV9sZXZlbCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0gKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF90ZWFtX3NpemUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9zY2hlZHVsZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3NjaGVkdWxlICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfcHJvY19iaW5kICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfd3RpbWUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF93dGljayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2lzX2luaXRpYWxfZGV2aWNlICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbnVtX2RldmljZXMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9udW1fdGVhbXMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF90ZWFtX251bSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfaW5pdF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9kZXN0cm95X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF91bnNldF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF90ZXN0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2luaXRfbmVzdF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9kZXN0cm95X25lc3RfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X25lc3RfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfdW5zZXRfbmVzdF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF90ZXN0X25lc3RfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X3N0YWNrc2l6ZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X3N0YWNrc2l6ZV9zICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfYmxvY2t0aW1lICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfbGlicmFyeV9zZXJpYWwgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9saWJyYXJ5ICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfZGVmYXVsdHMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9zdGFja3NpemUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9zdGFja3NpemVfcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X2Jsb2NrdGltZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X2xpYnJhcnkgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9hZmZpbml0eSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X2FmZmluaXR5ICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfbWFsbG9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9hbGlnbmVkX21hbGxvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfY2FsbG9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9yZWFsbG9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9mcmVlICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfd2FybmluZ3Nfb24gKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF93YXJuaW5nc19vZmYgKQorIURJUiQgRU5ESUYKKyFESVIkIEVORElGCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wdC5oLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wdC5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmUwZGQxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80MC9vbXB0LmgudmFyCkBAIC0wLDAgKzEsNTE1IEBACisvKgorICogaW5jbHVkZS80MC9vbXB0LmgudmFyCisgKi8KKworI2lmbmRlZiBfX09NUFRfXworI2RlZmluZSBfX09NUFRfXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHN5c3RlbSBpbmNsdWRlIGZpbGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaXRlcmF0aW9uIG1hY3JvcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEZPUkVBQ0hfT01QVF9JTlFVSVJZX0ZOKG1hY3JvKSAgXAorICAgIG1hY3JvIChvbXB0X2VudW1lcmF0ZV9zdGF0ZSkgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc2V0X2NhbGxiYWNrKSAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF9jYWxsYmFjaykgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X2lkbGVfZnJhbWUpICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF90YXNrX2ZyYW1lKSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3N0YXRlKSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfcGFyYWxsZWxfaWQpICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3BhcmFsbGVsX3RlYW1fc2l6ZSkgXAorICAgIG1hY3JvIChvbXB0X2dldF90YXNrX2lkKSAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfdGhyZWFkX2lkKQorCisjZGVmaW5lIEZPUkVBQ0hfT01QVF9QTEFDRUhPTERFUl9GTihtYWNybykgIFwKKyAgICBtYWNybyAob21wdF9pZGxlKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X292ZXJoZWFkKSAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfYmFycmllcl93YWl0KSAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF90YXNrX3dhaXQpICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X211dGV4X3dhaXQpCisKKyNkZWZpbmUgRk9SRUFDSF9PTVBUX1NUQVRFKG1hY3JvKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBmaXJzdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV9maXJzdCwgMHg3MSkgICAgICAgICAgLyogaW5pdGlhbCBlbnVtZXJhdGlvbiBzdGF0ZSAqLyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiB3b3JrIHN0YXRlcyAoMC4uMTUpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93b3JrX3NlcmlhbCwgMHgwMCkgICAgLyogd29ya2luZyBvdXRzaWRlIHBhcmFsbGVsICovICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93b3JrX3BhcmFsbGVsLCAweDAxKSAgLyogd29ya2luZyB3aXRoaW4gcGFyYWxsZWwgKi8gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93b3JrX3JlZHVjdGlvbiwgMHgwMikgLyogcGVyZm9ybWluZyBhIHJlZHVjdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBpZGxlICgxNi4uMzEpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV9pZGxlLCAweDEwKSAgICAgICAgICAgIC8qIHdhaXRpbmcgZm9yIHdvcmsgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBvdmVyaGVhZCBzdGF0ZXMgKDMyLi42MykgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV9vdmVyaGVhZCwgMHgyMCkgICAgICAgIC8qIG92ZXJoZWFkIGV4Y2x1ZGluZyB3YWl0IHN0YXRlcyAqLyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBiYXJyaWVyIHdhaXQgc3RhdGVzICg2NC4uNzkpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2JhcnJpZXIsIDB4NDApICAgIC8qIHdhaXRpbmcgYXQgYSBiYXJyaWVyICovICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2JhcnJpZXJfaW1wbGljaXQsIDB4NDEpICAgIC8qIGltcGxpY2l0IGJhcnJpZXIgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2JhcnJpZXJfZXhwbGljaXQsIDB4NDIpICAgIC8qIGV4cGxpY2l0IGJhcnJpZXIgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiB0YXNrIHdhaXQgc3RhdGVzICg4MC4uOTUpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X3Rhc2t3YWl0LCAweDUwKSAgIC8qIHdhaXRpbmcgYXQgYSB0YXNrd2FpdCAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X3Rhc2tncm91cCwgMHg1MSkgIC8qIHdhaXRpbmcgYXQgYSB0YXNrZ3JvdXAgKi8gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBtdXRleCB3YWl0IHN0YXRlcyAoOTYuLjExMSkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2xvY2ssIDB4NjApICAgICAgIC8qIHdhaXRpbmcgZm9yIGxvY2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X25lc3RfbG9jaywgMHg2MSkgIC8qIHdhaXRpbmcgZm9yIG5lc3QgbG9jayAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2NyaXRpY2FsLCAweDYyKSAgIC8qIHdhaXRpbmcgZm9yIGNyaXRpY2FsICovICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2F0b21pYywgMHg2MykgICAgIC8qIHdhaXRpbmcgZm9yIGF0b21pYyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X29yZGVyZWQsIDB4NjQpICAgIC8qIHdhaXRpbmcgZm9yIG9yZGVyZWQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X3NpbmdsZSwgMHg2RikgICAgIC8qIHdhaXRpbmcgZm9yIHNpbmdsZSByZWdpb24gKG5vbi1zdGFuZGFyZCEpICovICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBtaXNjICgxMTIuLjEyNykgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV91bmRlZmluZWQsIDB4NzApICAgICAgIC8qIHVuZGVmaW5lZCB0aHJlYWQgc3RhdGUgKi8KKworCisjZGVmaW5lIEZPUkVBQ0hfT01QVF9FVkVOVChtYWNybykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKi0tLSBNYW5kYXRvcnkgRXZlbnRzIC0tLSovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcGFyYWxsZWxfYmVnaW4sICAgICAgICAgICBvbXB0X25ld19wYXJhbGxlbF9jYWxsYmFja190LCAgIDEpIC8qIHBhcmFsbGVsIGJlZ2luICovICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZCwgICAgICAgICAgICAgb21wdF9lbmRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAyKSAvKiBwYXJhbGxlbCBlbmQgKi8gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza19iZWdpbiwgICAgICAgICAgICAgICBvbXB0X25ld190YXNrX2NhbGxiYWNrX3QsICAgICAgIDMpIC8qIHRhc2sgYmVnaW4gKi8gICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2tfZW5kLCAgICAgICAgICAgICAgICAgb21wdF90YXNrX2NhbGxiYWNrX3QsICAgICAgICAgICA0KSAvKiB0YXNrIGRlc3Ryb3kgKi8gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGhyZWFkX2JlZ2luLCAgICAgICAgICAgICBvbXB0X3RocmVhZF90eXBlX2NhbGxiYWNrX3QsICAgIDUpIC8qIHRocmVhZCBiZWdpbiAqLyAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3RocmVhZF9lbmQsICAgICAgICAgICAgICAgb21wdF90aHJlYWRfdHlwZV9jYWxsYmFja190LCAgICA2KSAvKiB0aHJlYWQgZW5kICovICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfY29udHJvbCwgICAgICAgICAgICAgICAgICBvbXB0X2NvbnRyb2xfY2FsbGJhY2tfdCwgICAgICAgIDcpIC8qIHN1cHBvcnQgY29udHJvbCBjYWxscyAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9ydW50aW1lX3NodXRkb3duLCAgICAgICAgIG9tcHRfY2FsbGJhY2tfdCwgICAgICAgICAgICAgICAgOCkgLyogcnVudGltZSBzaHV0ZG93biAqLyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qLS0tIE9wdGlvbmFsIEV2ZW50cyAoYmxhbWUgc2hpZnRpbmcsIG9tcHRfZXZlbnRfdW5pbXBsZW1lbnRlZCkgLS0tKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pZGxlX2JlZ2luLCAgICAgICAgICAgICAgIG9tcHRfdGhyZWFkX2NhbGxiYWNrX3QsICAgICAgICAgOSkgLyogYmVnaW4gaWRsZSBzdGF0ZSAqLyAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaWRsZV9lbmQsICAgICAgICAgICAgICAgICBvbXB0X3RocmVhZF9jYWxsYmFja190LCAgICAgICAgMTApIC8qIGVuZCBpZGxlIHN0YXRlICovICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X2JhcnJpZXJfYmVnaW4sICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxMSkgLyogYmVnaW4gd2FpdCBhdCBiYXJyaWVyICovICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9iYXJyaWVyX2VuZCwgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTIpIC8qIGVuZCB3YWl0IGF0IGJhcnJpZXIgKi8gICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X3Rhc2t3YWl0X2JlZ2luLCAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxMykgLyogYmVnaW4gd2FpdCBhdCB0YXNrd2FpdCAqLyBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF90YXNrd2FpdF9lbmQsICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTQpIC8qIGVuZCB3YWl0IGF0IHRhc2t3YWl0ICovICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X3Rhc2tncm91cF9iZWdpbiwgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxNSkgLyogYmVnaW4gd2FpdCBhdCB0YXNrZ3JvdXAgKi9cCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF90YXNrZ3JvdXBfZW5kLCAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTYpIC8qIGVuZCB3YWl0IGF0IHRhc2tncm91cCAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX2xvY2ssICAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICAxNykgLyogbG9jayByZWxlYXNlICovICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9uZXN0X2xvY2tfbGFzdCwgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgMTgpIC8qIGxhc3QgbmVzdCBsb2NrIHJlbGVhc2UgKi8gXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2VfY3JpdGljYWwsICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDE5KSAvKiBjcml0aWNhbCByZWxlYXNlICovICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9hdG9taWMsICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgMjApIC8qIGF0b21pYyByZWxlYXNlICovICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX29yZGVyZWQsICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICAyMSkgLyogb3JkZXJlZCByZWxlYXNlICovICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qLS0tIE9wdGlvbmFsIEV2ZW50cyAoc3luY2hyb25vdXMgZXZlbnRzLCBvbXB0X2V2ZW50X3VuaW1wbGVtZW50ZWQpIC0tLSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luLCAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyMikgLyogaW1wbGljaXQgdGFzayBiZWdpbiAgICovICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQsICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMjMpIC8qIGltcGxpY2l0IHRhc2sgZW5kICAqLyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbml0aWFsX3Rhc2tfYmVnaW4sICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyNCkgLyogaW5pdGlhbCB0YXNrIGJlZ2luICAgKi8gICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaW5pdGlhbF90YXNrX2VuZCwgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMjUpIC8qIGluaXRpYWwgdGFzayBlbmQgICovICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrX3N3aXRjaCwgICAgICAgICAgICAgIG9tcHRfdGFza19wYWlyX2NhbGxiYWNrX3QsICAgICAyNikgLyogdGFzayBzd2l0Y2ggKi8gICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2xvb3BfYmVnaW4sICAgICAgICAgICAgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDI3KSAvKiB0YXNrIGF0IGxvb3AgYmVnaW4gKi8gICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9sb29wX2VuZCwgICAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyOCkgLyogdGFzayBhdCBsb29wIGVuZCAqLyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NlY3Rpb25zX2JlZ2luLCAgICAgICAgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDI5KSAvKiB0YXNrIGF0IHNlY3Rpb25zIGJlZ2luICAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF9zZWN0aW9uc19lbmQsICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzMCkgLyogdGFzayBhdCBzZWN0aW9ucyBlbmQgKi8gICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NpbmdsZV9pbl9ibG9ja19iZWdpbiwgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDMxKSAvKiB0YXNrIGF0IHNpbmdsZSBiZWdpbiovICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9zaW5nbGVfaW5fYmxvY2tfZW5kLCAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzMikgLyogdGFzayBhdCBzaW5nbGUgZW5kICovICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NpbmdsZV9vdGhlcnNfYmVnaW4sICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDMzKSAvKiB0YXNrIGF0IHNpbmdsZSBiZWdpbiAqLyAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9zaW5nbGVfb3RoZXJzX2VuZCwgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzNCkgLyogdGFzayBhdCBzaW5nbGUgZW5kICovICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dvcmtzaGFyZV9iZWdpbiwgICAgICAgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDM1KSAvKiB0YXNrIGF0IHdvcmtzaGFyZSBiZWdpbiAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF93b3Jrc2hhcmVfZW5kLCAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzNikgLyogdGFzayBhdCB3b3Jrc2hhcmUgZW5kICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X21hc3Rlcl9iZWdpbiwgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDM3KSAvKiB0YXNrIGF0IG1hc3RlciBiZWdpbiAqLyAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9tYXN0ZXJfZW5kLCAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzOCkgLyogdGFzayBhdCBtYXN0ZXIgZW5kICovICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW4sICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDM5KSAvKiB0YXNrIGF0IGJhcnJpZXIgYmVnaW4gICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9iYXJyaWVyX2VuZCwgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICA0MCkgLyogdGFzayBhdCBiYXJyaWVyIGVuZCAqLyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2t3YWl0X2JlZ2luLCAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDQxKSAvKiB0YXNrIGF0IHRhc2t3YWl0IGJlZ2luICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrd2FpdF9lbmQsICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICA0MikgLyogdGFzayBhdCB0YXNrIHdhaXQgZW5kICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2tncm91cF9iZWdpbiwgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDQzKSAvKiB0YXNrIGF0IHRhc2tncm91cCBiZWdpbiAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrZ3JvdXBfZW5kLCAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICA0NCkgLyogdGFzayBhdCB0YXNrZ3JvdXAgZW5kICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2VfbmVzdF9sb2NrX3ByZXYsICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDQ1KSAvKiBwcmV2IG5lc3QgbG9jayByZWxlYXNlICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9sb2NrLCAgICAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNDYpIC8qIGxvY2sgd2FpdCAqLyAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfbmVzdF9sb2NrLCAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDQ3KSAvKiBuZXN0IGxvY2sgd2FpdCAqLyAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X2NyaXRpY2FsLCAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA0OCkgLyogY3JpdGljYWwgd2FpdCAqLyAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9hdG9taWMsICAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNDkpIC8qIGF0b21pYyB3YWl0ICovICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfb3JkZXJlZCwgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDUwKSAvKiBvcmRlcmVkIHdhaXQgKi8gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfbG9jaywgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTEpIC8qIGxvY2sgYWNxdWlyZWQgKi8gICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX25lc3RfbG9ja19maXJzdCwgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDUyKSAvKiAxc3QgbmVzdCBsb2NrIGFjcXVpcmVkICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9uZXN0X2xvY2tfbmV4dCwgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1MykgLyogbmV4dCBuZXN0IGxvY2sgYWNxdWlyZWQqLyBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfY3JpdGljYWwsICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTQpIC8qIGNyaXRpY2FsIGFjcXVpcmVkICovICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX2F0b21pYywgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU1KSAvKiBhdG9taWMgYWNxdWlyZWQgKi8gICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9vcmRlcmVkLCAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1NikgLyogb3JkZXJlZCBhY3F1aXJlZCAqLyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2luaXRfbG9jaywgICAgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU3KSAvKiBsb2NrIGluaXQgKi8gICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbml0X25lc3RfbG9jaywgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1OCkgLyogbmVzdCBsb2NrIGluaXQgKi8gICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2Rlc3Ryb3lfbG9jaywgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU5KSAvKiBsb2NrIGRlc3RydWN0aW9uICovICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9kZXN0cm95X25lc3RfbG9jaywgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA2MCkgLyogbmVzdCBsb2NrIGRlc3RydWN0aW9uICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2ZsdXNoLCAgICAgICAgICAgICAgICAgICAgb21wdF9jYWxsYmFja190LCAgICAgICAgICAgICAgIDYxKSAvKiBhZnRlciBleGVjdXRpbmcgZmx1c2ggKi8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza19kZXBlbmRlbmNlcywgICAgICAgICBvbXB0X3Rhc2tfZGVwZW5kZW5jZXNfY2FsbGJhY2tfdCwgNjkpIC8qIHJlcG9ydCB0YXNrIGRlcGVuZGVuY2VzICAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrX2RlcGVuZGVuY2VfcGFpciwgICAgIG9tcHRfdGFza19wYWlyX2NhbGxiYWNrX3QsICAgICA3MCkgLyogcmVwb3J0IHRhc2sgZGVwZW5kZW5jZSBwYWlyICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGRhdGEgdHlwZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGlkZW50aWZpZXJzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgdWludDY0X3Qgb21wdF90aHJlYWRfaWRfdDsKKyNkZWZpbmUgb21wdF90aHJlYWRfaWRfbm9uZSAoKG9tcHRfdGhyZWFkX2lkX3QpIDApICAgICAvKiBub24tc3RhbmRhcmQgKi8KKwordHlwZWRlZiB1aW50NjRfdCBvbXB0X3Rhc2tfaWRfdDsKKyNkZWZpbmUgb21wdF90YXNrX2lkX25vbmUgKChvbXB0X3Rhc2tfaWRfdCkgMCkgICAgICAgICAvKiBub24tc3RhbmRhcmQgKi8KKwordHlwZWRlZiB1aW50NjRfdCBvbXB0X3BhcmFsbGVsX2lkX3Q7CisjZGVmaW5lIG9tcHRfcGFyYWxsZWxfaWRfbm9uZSAoKG9tcHRfcGFyYWxsZWxfaWRfdCkgMCkgLyogbm9uLXN0YW5kYXJkICovCisKK3R5cGVkZWYgdWludDY0X3Qgb21wdF93YWl0X2lkX3Q7CisjZGVmaW5lIG9tcHRfd2FpdF9pZF9ub25lICgob21wdF93YWl0X2lkX3QpIDApICAgICAgICAgLyogbm9uLXN0YW5kYXJkICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIG9tcHRfZnJhbWVfdAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHN0cnVjdCBvbXB0X2ZyYW1lX3MgeworICAgIHZvaWQgKmV4aXRfcnVudGltZV9mcmFtZTsgICAgLyogbmV4dCBmcmFtZSBpcyB1c2VyIGNvZGUgICAgICovCisgICAgdm9pZCAqcmVlbnRlcl9ydW50aW1lX2ZyYW1lOyAvKiBwcmV2aW91cyBmcmFtZSBpcyB1c2VyIGNvZGUgKi8KK30gb21wdF9mcmFtZV90OworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBkZXBlbmRlbmNlcyB0eXBlcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIGVudW0gb21wdF90YXNrX2RlcGVuZGVuY2VfZmxhZ19lIHsKKyAgICAvLyBhIHR3byBiaXQgZmllbGQgZm9yIHRoZSBkZXBlbmRlbmNlIHR5cGUKKyAgICBvbXB0X3Rhc2tfZGVwZW5kZW5jZV90eXBlX291dCAgID0gMSwKKyAgICBvbXB0X3Rhc2tfZGVwZW5kZW5jZV90eXBlX2luICAgID0gMiwKKyAgICBvbXB0X3Rhc2tfZGVwZW5kZW5jZV90eXBlX2lub3V0ID0gMywKK30gb21wdF90YXNrX2RlcGVuZGVuY2VfZmxhZ190OworCit0eXBlZGVmIHN0cnVjdCBvbXB0X3Rhc2tfZGVwZW5kZW5jZV9zIHsKKyAgICB2b2lkICp2YXJpYWJsZV9hZGRyOworICAgIHVpbnQzMl90ICBkZXBlbmRlbmNlX2ZsYWdzOworfSBvbXB0X3Rhc2tfZGVwZW5kZW5jZV90OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZW51bWVyYXRpb25zIGZvciB0aHJlYWQgc3RhdGVzIGFuZCBydW50aW1lIGV2ZW50cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcnVudGltZSBzdGF0ZXMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBlbnVtIHsKKyNkZWZpbmUgb21wdF9zdGF0ZV9tYWNybyhzdGF0ZSwgY29kZSkgc3RhdGUgPSBjb2RlLAorICAgIEZPUkVBQ0hfT01QVF9TVEFURShvbXB0X3N0YXRlX21hY3JvKQorI3VuZGVmIG9tcHRfc3RhdGVfbWFjcm8KK30gb21wdF9zdGF0ZV90OworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBydW50aW1lIGV2ZW50cworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIGVudW0geworI2RlZmluZSBvbXB0X2V2ZW50X21hY3JvKGV2ZW50LCBjYWxsYmFjaywgZXZlbnRpZCkgZXZlbnQgPSBldmVudGlkLAorICAgIEZPUkVBQ0hfT01QVF9FVkVOVChvbXB0X2V2ZW50X21hY3JvKQorI3VuZGVmIG9tcHRfZXZlbnRfbWFjcm8KK30gb21wdF9ldmVudF90OworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBzZXQgY2FsbGJhY2sgcmVzdWx0cworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtIHsKKyAgICBvbXB0X3NldF9yZXN1bHRfcmVnaXN0cmF0aW9uX2Vycm9yICAgICAgICAgICAgICA9IDAsCisgICAgb21wdF9zZXRfcmVzdWx0X2V2ZW50X21heV9vY2N1cl9ub19jYWxsYmFjayAgICAgPSAxLAorICAgIG9tcHRfc2V0X3Jlc3VsdF9ldmVudF9uZXZlcl9vY2N1cnMgICAgICAgICAgICAgID0gMiwKKyAgICBvbXB0X3NldF9yZXN1bHRfZXZlbnRfbWF5X29jY3VyX2NhbGxiYWNrX3NvbWUgICA9IDMsCisgICAgb21wdF9zZXRfcmVzdWx0X2V2ZW50X21heV9vY2N1cl9jYWxsYmFja19hbHdheXMgPSA0LAorfSBvbXB0X3NldF9yZXN1bHRfdDsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY2FsbGJhY2sgc2lnbmF0dXJlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBpbml0aWFsaXphdGlvbiAqLwordHlwZWRlZiB2b2lkICgqb21wdF9pbnRlcmZhY2VfZm5fdCkodm9pZCk7CisKK3R5cGVkZWYgb21wdF9pbnRlcmZhY2VfZm5fdCAoKm9tcHRfZnVuY3Rpb25fbG9va3VwX3QpKAorICAgIGNvbnN0IGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICAvKiBlbnRyeSBwb2ludCB0byBsb29rIHVwICAgICAgICovCispOworCisvKiB0aHJlYWRzICovCit0eXBlZGVmIHZvaWQgKCpvbXB0X3RocmVhZF9jYWxsYmFja190KSAoCisgICAgb21wdF90aHJlYWRfaWRfdCB0aHJlYWRfaWQgICAgICAgIC8qIElEIG9mIHRocmVhZCAgICAgICAgICAgICAgICAgKi8KKyk7CisKK3R5cGVkZWYgZW51bSB7CisgICAgb21wdF90aHJlYWRfaW5pdGlhbCA9IDEsIC8vIHN0YXJ0IHRoZSBlbnVtZXJhdGlvbiBhdCAxCisgICAgb21wdF90aHJlYWRfd29ya2VyICA9IDIsCisgICAgb21wdF90aHJlYWRfb3RoZXIgICA9IDMKK30gb21wdF90aHJlYWRfdHlwZV90OworCit0eXBlZGVmIGVudW0geworICAgIG9tcHRfaW52b2tlcl9wcm9ncmFtID0gMCwgICAgICAgICAvKiBwcm9ncmFtIGludm9rZXMgbWFzdGVyIHRhc2sgICovCisgICAgb21wdF9pbnZva2VyX3J1bnRpbWUgPSAxICAgICAgICAgIC8qIHJ1bnRpbWUgaW52b2tlcyBtYXN0ZXIgdGFzayAgKi8KK30gb21wdF9pbnZva2VyX3Q7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfdGhyZWFkX3R5cGVfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGhyZWFkX3R5cGVfdCB0aHJlYWRfdHlwZSwgICAvKiB0eXBlIG9mIHRocmVhZCAgICAgICAgICAgICAgICovCisgICAgb21wdF90aHJlYWRfaWRfdCB0aHJlYWRfaWQgICAgICAgIC8qIElEIG9mIHRocmVhZCAgICAgICAgICAgICAgICAgKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfd2FpdF9jYWxsYmFja190KSAoCisgICAgb21wdF93YWl0X2lkX3Qgd2FpdF9pZCAgICAgICAgICAgIC8qIHdhaXQgaWQgICAgICAgICAgICAgICAgICAgICAgKi8KKyk7CisKKy8qIHBhcmFsbGVsIGFuZCB3b3Jrc2hhcmVzICovCit0eXBlZGVmIHZvaWQgKCpvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsICAgIC8qIGlkIG9mIHBhcmFsbGVsIHJlZ2lvbiAgICAgICAqLworICAgIG9tcHRfdGFza19pZF90IHRhc2tfaWQgICAgICAgICAgICAgLyogaWQgb2YgdGFzayAgICAgICAgICAgICAgICAgICovCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X25ld193b3Jrc2hhcmVfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwgICAvKiBpZCBvZiBwYXJhbGxlbCByZWdpb24gICAgICAgICovCisgICAgb21wdF90YXNrX2lkX3QgcGFyZW50X3Rhc2tfaWQsICAgIC8qIGlkIG9mIHBhcmVudCB0YXNrICAgICAgICAgICAgKi8KKyAgICB2b2lkICp3b3Jrc2hhcmVfZnVuY3Rpb24gICAgICAgICAgLyogcG9pbnRlciB0byBvdXRsaW5lZCBmdW5jdGlvbiAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF9uZXdfcGFyYWxsZWxfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGFza19pZF90IHBhcmVudF90YXNrX2lkLCAgICAvKiBpZCBvZiBwYXJlbnQgdGFzayAgICAgICAgICAgICovCisgICAgb21wdF9mcmFtZV90ICpwYXJlbnRfdGFza19mcmFtZSwgIC8qIGZyYW1lIGRhdGEgb2YgcGFyZW50IHRhc2sgICAgKi8KKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsICAgLyogaWQgb2YgcGFyYWxsZWwgcmVnaW9uICAgICAgICAqLworICAgIHVpbnQzMl90IHJlcXVlc3RlZF90ZWFtX3NpemUsICAgICAvKiBudW1iZXIgb2YgdGhyZWFkcyBpbiB0ZWFtICAgICovCisgICAgdm9pZCAqcGFyYWxsZWxfZnVuY3Rpb24sICAgICAgICAgIC8qIHBvaW50ZXIgdG8gb3V0bGluZWQgZnVuY3Rpb24gKi8KKyAgICBvbXB0X2ludm9rZXJfdCBpbnZva2VyICAgICAgICAgICAgLyogd2hvIGludm9rZXMgbWFzdGVyIHRhc2s/ICAgICAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF9lbmRfcGFyYWxsZWxfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwgICAvKiBpZCBvZiBwYXJhbGxlbCByZWdpb24gICAgICAgKi8KKyAgICBvbXB0X3Rhc2tfaWRfdCB0YXNrX2lkLCAgICAgICAgICAgLyogaWQgb2YgdGFzayAgICAgICAgICAgICAgICAgICovCisgICAgb21wdF9pbnZva2VyX3QgaW52b2tlciAgICAgICAgICAgIC8qIHdobyBpbnZva2VzIG1hc3RlciB0YXNrPyAgICAqLworKTsKKworLyogdGFza3MgKi8KK3R5cGVkZWYgdm9pZCAoKm9tcHRfdGFza19jYWxsYmFja190KSAoCisgICAgb21wdF90YXNrX2lkX3QgdGFza19pZCAgICAgICAgICAgIC8qIGlkIG9mIHRhc2sgICAgICAgICAgICAgICAgICAgKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfdGFza19wYWlyX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3Rhc2tfaWRfdCBmaXJzdF90YXNrX2lkLAorICAgIG9tcHRfdGFza19pZF90IHNlY29uZF90YXNrX2lkCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X25ld190YXNrX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3Rhc2tfaWRfdCBwYXJlbnRfdGFza19pZCwgICAgLyogaWQgb2YgcGFyZW50IHRhc2sgICAgICAgICAgICAqLworICAgIG9tcHRfZnJhbWVfdCAqcGFyZW50X3Rhc2tfZnJhbWUsICAvKiBmcmFtZSBkYXRhIGZvciBwYXJlbnQgdGFzayAgICovCisgICAgb21wdF90YXNrX2lkX3QgIG5ld190YXNrX2lkLCAgICAgIC8qIGlkIG9mIGNyZWF0ZWQgdGFzayAgICAgICAgICAgKi8KKyAgICB2b2lkICp0YXNrX2Z1bmN0aW9uICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBvdXRsaW5lZCBmdW5jdGlvbiAqLworKTsKKworLyogdGFzayBkZXBlbmRlbmNlcyAqLwordHlwZWRlZiB2b2lkICgqb21wdF90YXNrX2RlcGVuZGVuY2VzX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3Rhc2tfaWRfdCB0YXNrX2lkLCAgICAgICAgICAgIC8qIElEIG9mIHRhc2sgd2l0aCBkZXBlbmRlbmNlcyAqLworICAgIGNvbnN0IG9tcHRfdGFza19kZXBlbmRlbmNlX3QgKmRlcHMsLyogdmVjdG9yIG9mIHRhc2sgZGVwZW5kZW5jZXMgICovCisgICAgaW50IG5kZXBzICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZGVwZW5kZW5jZXMgICAgICAgKi8KKyk7CisKKy8qIHByb2dyYW0gKi8KK3R5cGVkZWYgdm9pZCAoKm9tcHRfY29udHJvbF9jYWxsYmFja190KSAoCisgICAgdWludDY0X3QgY29tbWFuZCwgICAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgb2YgY29udHJvbCBjYWxsICAgICAgKi8KKyAgICB1aW50NjRfdCBtb2RpZmllciAgICAgICAgICAgICAgICAgLyogbW9kaWZpZXIgb2YgY29udHJvbCBjYWxsICAgICAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF9jYWxsYmFja190KSh2b2lkKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogb21wdCBBUEkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgT01QVF9BUElfRk5UWVBFKGZuKSBmbiMjX3QKKworI2RlZmluZSBPTVBUX0FQSV9GVU5DVElPTihyZXR1cm5fdHlwZSwgZm4sIGFyZ3MpICBcCisgICAgdHlwZWRlZiByZXR1cm5fdHlwZSAoKk9NUFRfQVBJX0ZOVFlQRShmbikpIGFyZ3MKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTlFVSVJZIEZVTkNUSU9OUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogc3RhdGUgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKG9tcHRfc3RhdGVfdCwgb21wdF9nZXRfc3RhdGUsICgKKyAgICBvbXB0X3dhaXRfaWRfdCAqb21wdF93YWl0X2lkCispKTsKKworLyogdGhyZWFkICovCitPTVBUX0FQSV9GVU5DVElPTihvbXB0X3RocmVhZF9pZF90LCBvbXB0X2dldF90aHJlYWRfaWQsICh2b2lkKSk7CisKK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQgKiwgb21wdF9nZXRfaWRsZV9mcmFtZSwgKHZvaWQpKTsKKworLyogcGFyYWxsZWwgcmVnaW9uICovCitPTVBUX0FQSV9GVU5DVElPTihvbXB0X3BhcmFsbGVsX2lkX3QsIG9tcHRfZ2V0X3BhcmFsbGVsX2lkLCAoCisgICAgaW50IGFuY2VzdG9yX2xldmVsCispKTsKKworT01QVF9BUElfRlVOQ1RJT04oaW50LCBvbXB0X2dldF9wYXJhbGxlbF90ZWFtX3NpemUsICgKKyAgICBpbnQgYW5jZXN0b3JfbGV2ZWwKKykpOworCisvKiB0YXNrICovCitPTVBUX0FQSV9GVU5DVElPTihvbXB0X3Rhc2tfaWRfdCwgb21wdF9nZXRfdGFza19pZCwgKAorICAgIGludCBkZXB0aAorKSk7CisKK09NUFRfQVBJX0ZVTkNUSU9OKG9tcHRfZnJhbWVfdCAqLCBvbXB0X2dldF90YXNrX2ZyYW1lLCAoCisgICAgaW50IGRlcHRoCispKTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQTEFDRUhPTERFUlMgRk9SIFBFUkZPUk1BTkNFIFJFUE9SVElORworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogaWRsZSAqLworT01QVF9BUElfRlVOQ1RJT04odm9pZCwgb21wdF9pZGxlLCAoCisgICAgdm9pZAorKSk7CisKKy8qIG92ZXJoZWFkICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X292ZXJoZWFkLCAoCisgICAgdm9pZAorKSk7CisKKy8qIGJhcnJpZXIgd2FpdCAqLworT01QVF9BUElfRlVOQ1RJT04odm9pZCwgb21wdF9iYXJyaWVyX3dhaXQsICgKKyAgICB2b2lkCispKTsKKworLyogdGFzayB3YWl0ICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X3Rhc2tfd2FpdCwgKAorICAgIHZvaWQKKykpOworCisvKiBtdXRleCB3YWl0ICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X211dGV4X3dhaXQsICgKKyAgICB2b2lkCispKTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTklUSUFMSVpBVElPTiBGVU5DVElPTlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQsIG9tcHRfaW5pdGlhbGl6ZSwgKAorICAgIG9tcHRfZnVuY3Rpb25fbG9va3VwX3Qgb21wdF9mbl9sb29rdXAsCisgICAgY29uc3QgY2hhciAqcnVudGltZV92ZXJzaW9uLAorICAgIHVuc2lnbmVkIGludCBvbXB0X3ZlcnNpb24KKykpOworCisKKy8qIGluaXRpYWxpemF0aW9uIGludGVyZmFjZSB0byBiZSBkZWZpbmVkIGJ5IHRvb2wgKi8KK29tcHRfaW5pdGlhbGl6ZV90IG9tcHRfdG9vbCh2b2lkKTsKKwordHlwZWRlZiBlbnVtIG9wdF9pbml0X21vZGVfZSB7CisgICAgb21wdF9pbml0X21vZGVfbmV2ZXIgID0gMCwKKyAgICBvbXB0X2luaXRfbW9kZV9mYWxzZSAgPSAxLAorICAgIG9tcHRfaW5pdF9tb2RlX3RydWUgICA9IDIsCisgICAgb21wdF9pbml0X21vZGVfYWx3YXlzID0gMworfSBvbXB0X2luaXRfbW9kZV90OworCitPTVBUX0FQSV9GVU5DVElPTihpbnQsIG9tcHRfc2V0X2NhbGxiYWNrLCAoCisgICAgb21wdF9ldmVudF90IGV2ZW50LAorICAgIG9tcHRfY2FsbGJhY2tfdCBjYWxsYmFjaworKSk7CisKK3R5cGVkZWYgZW51bSBvbXB0X3NldF9jYWxsYmFja19yY19lIHsgIC8qIG5vbi1zdGFuZGFyZCAqLworICAgIG9tcHRfc2V0X2NhbGxiYWNrX2Vycm9yICAgICAgPSAwLAorICAgIG9tcHRfaGFzX2V2ZW50X25vX2NhbGxiYWNrICAgPSAxLAorICAgIG9tcHRfbm9fZXZlbnRfbm9fY2FsbGJhY2sgICAgPSAyLAorICAgIG9tcHRfaGFzX2V2ZW50X21heV9jYWxsYmFjayAgPSAzLAorICAgIG9tcHRfaGFzX2V2ZW50X211c3RfY2FsbGJhY2sgPSA0LAorfSBvbXB0X3NldF9jYWxsYmFja19yY190OworCisKK09NUFRfQVBJX0ZVTkNUSU9OKGludCwgb21wdF9nZXRfY2FsbGJhY2ssICgKKyAgICBvbXB0X2V2ZW50X3QgZXZlbnQsCisgICAgb21wdF9jYWxsYmFja190ICpjYWxsYmFjaworKSk7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTUlTQ0VMTEFORU9VUyBGVU5DVElPTlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGNvbnRyb2wgKi8KKy8vIEZJWE1FOiByZW1vdmUgd29ya2Fyb3VuZCBmb3IgY2xhbmcKKyNpZiAhZGVmaW5lZChfX2NsYW5nX18pICYmIGRlZmluZWQoX09QRU5NUCkgJiYgKF9PUEVOTVAgPj0gMjAxMzA3KQorI3ByYWdtYSBvbXAgZGVjbGFyZSB0YXJnZXQKKyNlbmRpZgordm9pZCBvbXB0X2NvbnRyb2woCisgICAgdWludDY0X3QgY29tbWFuZCwKKyAgICB1aW50NjRfdCBtb2RpZmllcgorKTsKKyNpZiAhZGVmaW5lZChfX2NsYW5nX18pICYmIGRlZmluZWQoX09QRU5NUCkgJiYgKF9PUEVOTVAgPj0gMjAxMzA3KQorI3ByYWdtYSBvbXAgZW5kIGRlY2xhcmUgdGFyZ2V0CisjZW5kaWYKKworLyogc3RhdGUgZW51bWVyYXRpb24gKi8KK09NUFRfQVBJX0ZVTkNUSU9OKGludCwgb21wdF9lbnVtZXJhdGVfc3RhdGUsICgKKyAgICBpbnQgY3VycmVudF9zdGF0ZSwKKyAgICBpbnQgKm5leHRfc3RhdGUsCisgICAgY29uc3QgY2hhciAqKm5leHRfc3RhdGVfbmFtZQorKSk7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK307CisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDUvb21wLmgudmFyIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80NS9vbXAuaC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIyMmZmZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDUvb21wLmgudmFyCkBAIC0wLDAgKzEsMTk4IEBACisvKgorICogaW5jbHVkZS80NS9vbXAuaC52YXIKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBfX09NUF9ICisjICAgZGVmaW5lIF9fT01QX0gKKworIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9NQUpPUiAgICBATElCT01QX1ZFUlNJT05fTUFKT1JACisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX01JTk9SICAgIEBMSUJPTVBfVkVSU0lPTl9NSU5PUkAKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fQlVJTEQgICAgQExJQk9NUF9WRVJTSU9OX0JVSUxEQAorIyAgIGRlZmluZSBLTVBfQlVJTERfREFURSAgICAgICAiQExJQk9NUF9CVUlMRF9EQVRFQCIKKworIyAgIGlmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB7CisjICAgZW5kaWYKKworIyAgIGlmIGRlZmluZWQoX1dJTjMyKQorIyAgICAgICBkZWZpbmUgX19LQUlfS01QQ19DT05WRU5USU9OIF9fY2RlY2wKKyMgICBlbHNlCisjICAgICAgIGRlZmluZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04KKyMgICBlbmRpZgorCisgICAgLyogc2NoZWR1bGUga2luZCBjb25zdGFudHMgKi8KKyAgICB0eXBlZGVmIGVudW0gb21wX3NjaGVkX3QgeworCW9tcF9zY2hlZF9zdGF0aWMgID0gMSwKKwlvbXBfc2NoZWRfZHluYW1pYyA9IDIsCisJb21wX3NjaGVkX2d1aWRlZCAgPSAzLAorCW9tcF9zY2hlZF9hdXRvICAgID0gNAorICAgIH0gb21wX3NjaGVkX3Q7CisKKyAgICAvKiBzZXQgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X251bV90aHJlYWRzIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X2R5bmFtaWMgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X25lc3RlZCAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X3NjaGVkdWxlICAgICAgICAgIChvbXBfc2NoZWRfdCwgaW50KTsKKworICAgIC8qIHF1ZXJ5IEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9udW1fdGhyZWFkcyAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2R5bmFtaWMgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbmVzdGVkICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9tYXhfdGhyZWFkcyAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RocmVhZF9udW0gICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbnVtX3Byb2NzICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2luX3BhcmFsbGVsICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5fZmluYWwgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfYWN0aXZlX2xldmVsICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbGV2ZWwgICAgICAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSAoaW50KTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF90ZWFtX3NpemUgICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RocmVhZF9saW1pdCAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3NjaGVkdWxlICAgICAgICAgICAgKG9tcF9zY2hlZF90ICosIGludCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9tYXhfdGFza19wcmlvcml0eSAgICh2b2lkKTsKKworICAgIC8qIGxvY2sgQVBJIGZ1bmN0aW9ucyAqLworICAgIHR5cGVkZWYgc3RydWN0IG9tcF9sb2NrX3QgeworICAgICAgICB2b2lkICogX2xrOworICAgIH0gb21wX2xvY2tfdDsKKworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5pdF9sb2NrICAgIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X2xvY2sgICAgIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdW5zZXRfbG9jayAgIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZGVzdHJveV9sb2NrIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdGVzdF9sb2NrICAgIChvbXBfbG9ja190ICopOworCisgICAgLyogbmVzdGVkIGxvY2sgQVBJIGZ1bmN0aW9ucyAqLworICAgIHR5cGVkZWYgc3RydWN0IG9tcF9uZXN0X2xvY2tfdCB7CisgICAgICAgIHZvaWQgKiBfbGs7CisgICAgfSBvbXBfbmVzdF9sb2NrX3Q7CisKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2luaXRfbmVzdF9sb2NrICAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbmVzdF9sb2NrICAgICAob21wX25lc3RfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdW5zZXRfbmVzdF9sb2NrICAgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF90ZXN0X25lc3RfbG9jayAgICAob21wX25lc3RfbG9ja190ICopOworCisgICAgLyogbG9jayBoaW50IHR5cGUgZm9yIGR5bmFtaWMgdXNlciBsb2NrICovCisgICAgdHlwZWRlZiBlbnVtIG9tcF9sb2NrX2hpbnRfdCB7CisgICAgICAgIG9tcF9sb2NrX2hpbnRfbm9uZSAgICAgICAgICAgPSAwLAorICAgICAgICBvbXBfbG9ja19oaW50X3VuY29udGVuZGVkICAgID0gMSwKKyAgICAgICAgb21wX2xvY2tfaGludF9jb250ZW5kZWQgICAgICA9ICgxPDwxICksCisgICAgICAgIG9tcF9sb2NrX2hpbnRfbm9uc3BlY3VsYXRpdmUgPSAoMTw8MiApLAorICAgICAgICBvbXBfbG9ja19oaW50X3NwZWN1bGF0aXZlICAgID0gKDE8PDMgKSwKKyAgICAgICAga21wX2xvY2tfaGludF9obGUgICAgICAgICAgICA9ICgxPDwxNiksCisgICAgICAgIGttcF9sb2NrX2hpbnRfcnRtICAgICAgICAgICAgPSAoMTw8MTcpLAorICAgICAgICBrbXBfbG9ja19oaW50X2FkYXB0aXZlICAgICAgID0gKDE8PDE4KQorICAgIH0gb21wX2xvY2tfaGludF90OworCisgICAgLyogaGludGVkIGxvY2sgaW5pdGlhbGl6ZXJzICovCisgICAgZXh0ZXJuIHZvaWQgX19LQUlfS01QQ19DT05WRU5USU9OIG9tcF9pbml0X2xvY2tfd2l0aF9oaW50KG9tcF9sb2NrX3QgKiwgb21wX2xvY2tfaGludF90KTsKKyAgICBleHRlcm4gdm9pZCBfX0tBSV9LTVBDX0NPTlZFTlRJT04gb21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludChvbXBfbmVzdF9sb2NrX3QgKiwgb21wX2xvY2tfaGludF90KTsKKworICAgIC8qIHRpbWUgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiBkb3VibGUgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3d0aW1lICh2b2lkKTsKKyAgICBleHRlcm4gZG91YmxlIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF93dGljayAodm9pZCk7CisKKyAgICAvKiBPcGVuTVAgNC4wICovCisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UgKGludCk7CisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaXNfaW5pdGlhbF9kZXZpY2UgKHZvaWQpOworICAgIGV4dGVybiBpbnQgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9udW1fZGV2aWNlcyAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X251bV90ZWFtcyAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RlYW1fbnVtICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfY2FuY2VsbGF0aW9uICh2b2lkKTsKKworIyAgIGluY2x1ZGUgPHN0ZGxpYi5oPgorICAgIC8qIE9wZW5NUCA0LjUgKi8KKyAgICBleHRlcm4gaW50ICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2luaXRpYWxfZGV2aWNlICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCogX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdGFyZ2V0X2FsbG9jKHNpemVfdCwgaW50KTsKKyAgICBleHRlcm4gdm9pZCAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdGFyZ2V0X2ZyZWUodm9pZCAqLCBpbnQpOworICAgIGV4dGVybiBpbnQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF90YXJnZXRfaXNfcHJlc2VudCh2b2lkICosIGludCk7CisgICAgZXh0ZXJuIGludCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3RhcmdldF9tZW1jcHkodm9pZCAqLCB2b2lkICosIHNpemVfdCwgc2l6ZV90LCBzaXplX3QsIGludCwgaW50KTsKKyAgICBleHRlcm4gaW50ICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdGFyZ2V0X21lbWNweV9yZWN0KHZvaWQgKiwgdm9pZCAqLCBzaXplX3QsIGludCwgY29uc3Qgc2l6ZV90ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCAqLCBjb25zdCBzaXplX3QgKiwgY29uc3Qgc2l6ZV90ICosIGNvbnN0IHNpemVfdCAqLCBpbnQsIGludCk7CisgICAgZXh0ZXJuIGludCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3RhcmdldF9hc3NvY2lhdGVfcHRyKHZvaWQgKiwgdm9pZCAqLCBzaXplX3QsIHNpemVfdCwgaW50KTsKKyAgICBleHRlcm4gaW50ICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdGFyZ2V0X2Rpc2Fzc29jaWF0ZV9wdHIodm9pZCAqLCBpbnQpOworCisgICAgLyoga21wIEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9zdGFja3NpemUgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3N0YWNrc2l6ZSAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gc2l6ZV90IF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9zdGFja3NpemVfcyAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3N0YWNrc2l6ZV9zICAgICAgICAoc2l6ZV90KTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9ibG9ja3RpbWUgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2xpYnJhcnkgICAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYmxvY2t0aW1lICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnkgICAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3NlcmlhbCAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0ICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9kZWZhdWx0cyAgICAgICAgICAgKGNoYXIgY29uc3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfZGlzcF9udW1fYnVmZmVycyAgIChpbnQpOworCisgICAgLyogSW50ZWwgYWZmaW5pdHkgQVBJICovCisgICAgdHlwZWRlZiB2b2lkICoga21wX2FmZmluaXR5X21hc2tfdDsKKworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2FmZmluaXR5ICAgICAgICAgICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2FmZmluaXR5ICAgICAgICAgICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrICAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MgICAoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jIChpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jICAgKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKKworICAgIC8qIE9wZW5NUCA0LjAgYWZmaW5pdHkgQVBJICovCisgICAgdHlwZWRlZiBlbnVtIG9tcF9wcm9jX2JpbmRfdCB7CisgICAgICAgIG9tcF9wcm9jX2JpbmRfZmFsc2UgPSAwLAorICAgICAgICBvbXBfcHJvY19iaW5kX3RydWUgPSAxLAorICAgICAgICBvbXBfcHJvY19iaW5kX21hc3RlciA9IDIsCisgICAgICAgIG9tcF9wcm9jX2JpbmRfY2xvc2UgPSAzLAorICAgICAgICBvbXBfcHJvY19iaW5kX3NwcmVhZCA9IDQKKyAgICB9IG9tcF9wcm9jX2JpbmRfdDsKKworICAgIGV4dGVybiBvbXBfcHJvY19iaW5kX3QgX19LQUlfS01QQ19DT05WRU5USU9OIG9tcF9nZXRfcHJvY19iaW5kICh2b2lkKTsKKworICAgIC8qIE9wZW5NUCA0LjUgYWZmaW5pdHkgQVBJICovCisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OIG9tcF9nZXRfbnVtX3BsYWNlcyAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OIG9tcF9nZXRfcGxhY2VfbnVtX3Byb2NzIChpbnQpOworICAgIGV4dGVybiB2b2lkIF9fS0FJX0tNUENfQ09OVkVOVElPTiBvbXBfZ2V0X3BsYWNlX3Byb2NfaWRzIChpbnQsIGludCAqKTsKKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gb21wX2dldF9wbGFjZV9udW0gKHZvaWQpOworICAgIGV4dGVybiBpbnQgIF9fS0FJX0tNUENfQ09OVkVOVElPTiBvbXBfZ2V0X3BhcnRpdGlvbl9udW1fcGxhY2VzICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCBfX0tBSV9LTVBDX0NPTlZFTlRJT04gb21wX2dldF9wYXJ0aXRpb25fcGxhY2VfbnVtcyAoaW50ICopOworCisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9tYWxsb2MgIChzaXplX3QpOworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfYWxpZ25lZF9tYWxsb2MgIChzaXplX3QsIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9jYWxsb2MgIChzaXplX3QsIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9yZWFsbG9jICh2b2lkICosIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9mcmVlICAgICh2b2lkICopOworCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfd2FybmluZ3Nfb24odm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfd2FybmluZ3Nfb2ZmKHZvaWQpOworCisjICAgdW5kZWYgX19LQUlfS01QQ19DT05WRU5USU9OCisKKyAgICAvKiBXYXJuaW5nOgorICAgICAgIFRoZSBmb2xsb3dpbmcgdHlwZWRlZnMgYXJlIG5vdCBzdGFuZGFyZCwgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuCisgICAgKi8KKyAgICB0eXBlZGVmIGludCAgICAgb21wX2ludF90OworICAgIHR5cGVkZWYgZG91YmxlICBvbXBfd3RpbWVfdDsKKworIyAgIGlmZGVmIF9fY3BsdXNwbHVzCisgICAgfQorIyAgIGVuZGlmCisKKyNlbmRpZiAvKiBfX09NUF9IICovCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDUvb21wX2xpYi5mLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDUvb21wX2xpYi5mLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2ZmMDMxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80NS9vbXBfbGliLmYudmFyCkBAIC0wLDAgKzEsODU1IEBACishIGluY2x1ZGUvNDUvb21wX2xpYi5mLnZhcgorCishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKyEqKioKKyEqKiogU29tZSBvZiB0aGUgZGlyZWN0aXZlcyBmb3IgdGhlIGZvbGxvd2luZyByb3V0aW5lIGV4dGVuZCBwYXN0IGNvbHVtbiA3MiwKKyEqKiogc28gcHJvY2VzcyB0aGlzIGZpbGUgaW4gMTMyLWNvbHVtbiBtb2RlLgorISoqKgorCishZGVjJCBmaXhlZGZvcm1saW5lc2l6ZToxMzIKKworICAgICAgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2ludGVnZXJfa2luZCAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2dpY2FsX2tpbmQgICAgICAgPSA0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcmVhbF9raW5kICAgICAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfa2luZCAgICAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbmVzdF9sb2NrX2tpbmQgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9raW5kICAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2tpbmQgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3BvaW50ZXJfa2luZCAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9hZmZpbml0eV9tYXNrX2tpbmQgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9raW5kICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfa2luZCAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICBtb2R1bGUgb21wX2xpYgorCisgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gQExJQk9NUF9WRVJTSU9OX01BSk9SQAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSBATElCT01QX1ZFUlNJT05fTUlOT1JACisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9idWlsZCA9IEBMSUJPTVBfVkVSU0lPTl9CVUlMREAKKyAgICAgICAgY2hhcmFjdGVyKCopLCBwYXJhbWV0ZXIgOjoga21wX2J1aWxkX2RhdGUgICAgPSAnQExJQk9NUF9CVUlMRF9EQVRFQCcKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IG9wZW5tcF92ZXJzaW9uICAgID0gQExJQk9NUF9PTVBfWUVBUl9NT05USEAKKworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX3N0YXRpYyAgPSAxCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZHluYW1pYyA9IDIKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9ndWlkZWQgID0gMworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2F1dG8gICAgPSA0CisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9mYWxzZSA9IDAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF90cnVlID0gMQorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX21hc3RlciA9IDIKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9jbG9zZSA9IDMKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9zcHJlYWQgPSA0CisKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9wYXJhbGxlbCA9IDEKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9sb29wID0gMgorICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3NlY3Rpb25zID0gMworICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3Rhc2tncm91cCA9IDQKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X25vbmUgICAgICAgICAgID0gMAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X3VuY29udGVuZGVkICAgID0gMQorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X2NvbnRlbmRlZCAgICAgID0gMgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X25vbnNwZWN1bGF0aXZlID0gNAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X3NwZWN1bGF0aXZlICAgID0gOAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfbG9ja19oaW50X2hsZSAgICAgICAgICAgID0gNjU1MzYKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2xvY2tfaGludF9ydG0gICAgICAgICAgICA9IDEzMTA3MgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfbG9ja19oaW50X2FkYXB0aXZlICAgICAgID0gMjYyMTQ0CisKKyAgICAgICAgaW50ZXJmYWNlCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKiogb21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMobnVtX3RocmVhZHMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBudW1fdGhyZWFkcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljKGR5bmFtaWNfdGhyZWFkcykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIGR5bmFtaWNfdGhyZWFkcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZChuZXN0ZWQpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBuZXN0ZWQKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0oKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fcHJvY3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fcGFyYWxsZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfaW5fZmluYWwoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX2ZpbmFsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9maW5hbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9keW5hbWljKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfZHluYW1pYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfbmVzdGVkCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9saW1pdAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdAorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKG1heF9sZXZlbHMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtYXhfbGV2ZWxzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9sZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKGxldmVsKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbGV2ZWwKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUobGV2ZWwpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsZXZlbAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlKGtpbmQsIGNodW5rX3NpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBjaHVua19zaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlKGtpbmQsIGNodW5rX3NpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBjaHVua19zaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9wcm9jX2JpbmQoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSBvbXBfZ2V0X3Byb2NfYmluZAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3Byb2NfYmluZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcGxhY2VzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3BsYWNlcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9wbGFjZXMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfcGxhY2VfbnVtX3Byb2NzKHBsYWNlX251bSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHBsYWNlX251bQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3BsYWNlX251bV9wcm9jcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3BsYWNlX251bV9wcm9jcworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZ2V0X3BsYWNlX3Byb2NfaWRzKHBsYWNlX251bSwgaWRzKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcGxhY2VfbnVtCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGlkcygqKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9nZXRfcGxhY2VfcHJvY19pZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfcGxhY2VfbnVtKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfcGxhY2VfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfcGxhY2VfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3BhcnRpdGlvbl9udW1fcGxhY2VzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfcGFydGl0aW9uX251bV9wbGFjZXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9wYXJ0aXRpb25fbnVtX3BsYWNlcworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZ2V0X3BhcnRpdGlvbl9wbGFjZV9udW1zKHBsYWNlX251bXMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwbGFjZV9udW1zKCopCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9wYXJ0aXRpb25fcGxhY2VfbnVtcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGltZSgpCisgICAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGltZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGljayAoKQorICAgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aWNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9kZWZhdWx0X2RldmljZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UoZGV2aWNlX251bSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGRldmljZV9udW0KKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX2RldmljZXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fZGV2aWNlcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGVhbXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9udW0oKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2NhbmNlbGxhdGlvbigpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2NhbmNlbGxhdGlvbgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2NhbmNlbGxhdGlvbgorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2lzX2luaXRpYWxfZGV2aWNlKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pc19pbml0aWFsX2RldmljZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfaW5pdGlhbF9kZXZpY2UoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9pbml0aWFsX2RldmljZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2luaXRpYWxfZGV2aWNlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2soc3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9pbml0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBzdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrKHN2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfZGVzdHJveV9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrKHN2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfc2V0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBzdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrKHN2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdW5zZXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbG9jayhzdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Rlc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF90ZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jayhudmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBudmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jayhudmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBudmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrKG52YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfc2V0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbnZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sobnZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sobnZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF90ZXN0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF90ZXN0X25lc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF90YXNrX3ByaW9yaXR5KCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfdGFza19wcmlvcml0eQorCishICAgICAgICAgKioqCishICAgICAgICAgKioqIGttcF8qIGVudHJ5IHBvaW50cworISAgICAgICAgICoqKgorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZShzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3Moc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUobXNlYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1zZWMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsKCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kKCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCgpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5KGxpYm51bSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxpYm51bQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzKHN0cmluZykKKyAgICAgICAgICAgIGNoYXJhY3RlciooKikgc3RyaW5nCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYmxvY2t0aW1lCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9saWJyYXJ5CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Rpc3BfbnVtX2J1ZmZlcnMobnVtKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbnVtCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9kaXNwX251bV9idWZmZXJzCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5KG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5CisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eShtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayhtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrKG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX21hbGxvYyhzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX21hbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2FsaWduZWRfbWFsbG9jKHNpemUsIGFsaWdubWVudCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9hbGlnbmVkX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBhbGlnbm1lbnQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2FsaWduZWRfbWFsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfY2FsbG9jKG5lbGVtLCBlbHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfY2FsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgbmVsZW0KKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBlbHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2NhbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3JlYWxsb2MocHRyLCBzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX3JlYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkgcHRyCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfcmVhbGxvYworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZnJlZShwdHIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwdHIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZnJlZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uKCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmKCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZgorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzKGNhbmNlbGtpbmQpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpIGNhbmNlbGtpbmQKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrX3dpdGhfaGludChzdmFyLCBoaW50KQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpIGhpbnQKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrX3dpdGhfaGludAorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50KG52YXIsIGhpbnQpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSBoaW50CisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludAorCisgICAgICAgIGVuZCBpbnRlcmZhY2UKKworIWRlYyQgaWYgZGVmaW5lZChfV0lOMzIpCishZGVjJCAgIGlmIGRlZmluZWQoX1dJTjY0KSAub3IuIGRlZmluZWQoX01fQU1ENjQpCisKKyEqKioKKyEqKiogVGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIG11c3QgYmUgaW4gdXBwZXJjYXNlLCBldmVuIGlmIHRoZSAvUWxvd2VyY2FzZQorISoqKiBvcHRpb24gaXMgc3BlY2lmaWVkLiAgVGhlIGFsaWFzIGF0dHJpYnV0ZSBlbnN1cmVzIHRoYXQgdGhlIHNwZWNpZmllZAorISoqKiBzdHJpbmcgaXMgdXNlZCBhcyB0aGUgZW50cnkgcG9pbnQuCishKioqCishKioqIE9uIHRoZSBXaW5kb3dzKiBPUyBJQS0zMiBhcmNoaXRlY3R1cmUsIHRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBoYXZlIGFuCishKioqIHVuZGVyc2NvcmUgcHJlcGVuZGVkLiAgT24gdGhlIFdpbmRvd3MqIE9TIEludGVsKFIpIDY0CishKioqIGFyY2hpdGVjdHVyZSwgbm8gdW5kZXJzY29yZSBpcyBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfRFlOQU1JQycgOjogb21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX05FU1RFRCcgOjogb21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX1RIUkVBRFMnIDo6IG9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEhSRUFEX05VTScgOjogb21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9QUk9DUycgOjogb21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9JTl9QQVJBTExFTCcgOjogb21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0RZTkFNSUMnIDo6IG9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9ORVNURUQnIDo6IG9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RIUkVBRF9MSU1JVCcgOjogb21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTEVWRUwnIDo6IG9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfQUNUSVZFX0xFVkVMJyA6OiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNJyA6OiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEVBTV9TSVpFJyA6OiBvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9TQ0hFRFVMRScgOjogb21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9TQ0hFRFVMRScgOjogb21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9QUk9DX0JJTkQnIDo6IG9tcF9nZXRfcHJvY19iaW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1dUSU1FJyA6OiBvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1dUSUNLJyA6OiBvbXBfZ2V0X3d0aWNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0RFRkFVTFRfREVWSUNFJyA6OiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX0RFRkFVTFRfREVWSUNFJyA6OiBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9ERVZJQ0VTJyA6OiBvbXBfZ2V0X251bV9kZXZpY2VzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9URUFNUycgOjogb21wX2dldF9udW1fdGVhbXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEVBTV9OVU0nIDo6IG9tcF9nZXRfdGVhbV9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfQ0FOQ0VMTEFUSU9OJyA6OiBvbXBfZ2V0X2NhbmNlbGxhdGlvbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0lTX0lOSVRJQUxfREVWSUNFJyA6OiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX1RBU0tfUFJJT1JJVFknIDo6IG9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9jaycgOjogb21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9ja193aXRoX2hpbnQnIDo6IG9tcF9pbml0X2xvY2tfd2l0aF9oaW50CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9sb2NrJyA6OiBvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2xvY2snIDo6IG9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X2xvY2snIDo6IG9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9sb2NrJyA6OiBvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9uZXN0X2xvY2snIDo6IG9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludCcgOjogb21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbmVzdF9sb2NrJyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdF9sb2NrJyA6OiBvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X25lc3RfbG9jaycgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbmVzdF9sb2NrJyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9TVEFDS1NJWkUnOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9TVEFDS1NJWkVfUyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQkxPQ0tUSU1FJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9TRVJJQUwnOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfVFVSTkFST1VORCc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfVEhST1VHSFBVVCc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUlknOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfU1RBQ0tTSVpFJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfU1RBQ0tTSVpFX1MnOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0JMT0NLVElNRSc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0xJQlJBUlknOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQUZGSU5JVFknOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0FGRklOSVRZJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWV9NQVhfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9DUkVBVEVfQUZGSU5JVFlfTUFTSyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0RFU1RST1lfQUZGSU5JVFlfTUFTSyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfTUFMTE9DJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0FMSUdORURfTUFMTE9DJzo6a21wX2FsaWduZWRfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfQ0FMTE9DJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1JFQUxMT0MnOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0ZSRUUnOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1dBUk5JTkdTX09OJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9XQVJOSU5HU19PRkYnOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0NBTkNFTExBVElPTl9TVEFUVVMnIDo6IGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworCishZGVjJCAgIGVsc2UKKworISoqKgorISoqKiBPbiBXaW5kb3dzKiBPUyBJQS0zMiBhcmNoaXRlY3R1cmUsIHRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBoYXZlIGFuIHVuZGVyc2NvcmUgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9OVU1fVEhSRUFEUycgOjogb21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfRFlOQU1JQycgOjogb21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9ORVNURUQnIDo6IG9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fVEhSRUFEUycgOjogb21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTUFYX1RIUkVBRFMnIDo6IG9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RIUkVBRF9OVU0nIDo6IG9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX1BST0NTJyA6OiBvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9JTl9QQVJBTExFTCcgOjogb21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9EWU5BTUlDJyA6OiBvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05FU1RFRCcgOjogb21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RIUkVBRF9MSU1JVCcgOjogb21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX01BWF9BQ1RJVkVfTEVWRUxTJyA6OiBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9NQVhfQUNUSVZFX0xFVkVMUycgOjogb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTEVWRUwnIDo6IG9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0FDVElWRV9MRVZFTCcgOjogb21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0nIDo6IG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEVBTV9TSVpFJyA6OiBvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfU0NIRURVTEUnIDo6IG9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1NDSEVEVUxFJyA6OiBvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9QUk9DX0JJTkQnIDo6IG9tcF9nZXRfcHJvY19iaW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9XVElNRScgOjogb21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfV1RJQ0snIDo6IG9tcF9nZXRfd3RpY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0RFRkFVTFRfREVWSUNFJyA6OiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9ERUZBVUxUX0RFVklDRScgOjogb21wX3NldF9kZWZhdWx0X2RldmljZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX0RFVklDRVMnIDo6IG9tcF9nZXRfbnVtX2RldmljZXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9URUFNUycgOjogb21wX2dldF9udW1fdGVhbXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RFQU1fTlVNJyA6OiBvbXBfZ2V0X3RlYW1fbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9DQU5DRUxMQVRJT04nIDo6IG9tcF9nZXRfY2FuY2VsbGF0aW9uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0lTX0lOSVRJQUxfREVWSUNFJyA6OiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX01BWF9UQVNLX1BSSU9SVFknIDo6IG9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X2xvY2snIDo6IG9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9sb2NrX3dpdGhfaGludCcgOjogb21wX2luaXRfbG9ja193aXRoX2hpbnQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9sb2NrJyA6OiBvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9sb2NrJyA6OiBvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbG9jaycgOjogb21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9sb2NrJyA6OiBvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbmVzdF9sb2NrJyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50JyA6OiBvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbmVzdF9sb2NrJyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RfbG9jaycgOjogb21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbmVzdF9sb2NrJyA6OiBvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbmVzdF9sb2NrJyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfU1RBQ0tTSVpFJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1NUQUNLU0laRV9TJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQkxPQ0tUSU1FJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfU0VSSUFMJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5EJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfVEhST1VHSFBVVCc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9TVEFDS1NJWkUnOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfU1RBQ0tTSVpFX1MnOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9CTE9DS1RJTUUnOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfTElCUkFSWSc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQUZGSU5JVFknOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9BRkZJTklUWSc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0FGRklOSVRZX01BWF9QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9DUkVBVEVfQUZGSU5JVFlfTUFTSyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9ERVNUUk9ZX0FGRklOSVRZX01BU0snOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9NQUxMT0MnOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0FMSUdORURfTUFMTE9DJzo6a21wX2FsaWduZWRfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0NBTExPQyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfUkVBTExPQyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0ZSRUUnOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9XQVJOSU5HU19PTic6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1dBUk5JTkdTX09GRic6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0NBTkNFTExBVElPTl9TVEFUVVMnIDo6IGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworCishZGVjJCAgIGVuZGlmCishZGVjJCBlbmRpZgorCishZGVjJCBpZiBkZWZpbmVkKF9fbGludXgpCisKKyEqKioKKyEqKiogVGhlIExpbnV4KiBPUyBlbnRyeSBwb2ludHMgYXJlIGluIGxvd2VyY2FzZSwgd2l0aCBhbiB1bmRlcnNjb3JlIGFwcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X251bV90aHJlYWRzXyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfZHluYW1pY18nOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdGVkXyc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV90aHJlYWRzXyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbWF4X3RocmVhZHNfJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90aHJlYWRfbnVtXyc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fcHJvY3NfJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbl9wYXJhbGxlbF8nOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfZHluYW1pY18nOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbmVzdGVkXyc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RocmVhZF9saW1pdF8nOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbGV2ZWxfJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9hY3RpdmVfbGV2ZWxfJzo6b21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bV8nOjpvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGVhbV9zaXplXyc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X3NjaGVkdWxlXyc6Om9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfc2NoZWR1bGVfJzo6b21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9wcm9jX2JpbmRfJyA6OiBvbXBfZ2V0X3Byb2NfYmluZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF93dGltZV8nOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3d0aWNrXyc6Om9tcF9nZXRfd3RpY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfZGVmYXVsdF9kZXZpY2VfJzo6b21wX2dldF9kZWZhdWx0X2RldmljZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9kZWZhdWx0X2RldmljZV8nOjpvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV9kZXZpY2VzXyc6Om9tcF9nZXRfbnVtX2RldmljZXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbnVtX3RlYW1zXyc6Om9tcF9nZXRfbnVtX3RlYW1zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RlYW1fbnVtXyc6Om9tcF9nZXRfdGVhbV9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfY2FuY2VsbGF0aW9uXyc6Om9tcF9nZXRfY2FuY2VsbGF0aW9uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaXNfaW5pdGlhbF9kZXZpY2VfJzo6b21wX2lzX2luaXRpYWxfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X21heF90YXNrX3ByaW9yaXR5Xyc6Om9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9ja18nOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9sb2NrX3dpdGhfaGludF8nOjpvbXBfaW5pdF9sb2NrX3dpdGhfaGludAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbG9ja18nOjpvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2xvY2tfJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbG9ja18nOjpvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbG9ja18nOjpvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9uZXN0X2xvY2tfJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50Xyc6Om9tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X25lc3RfbG9ja18nOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbmVzdF9sb2NrXyc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X25lc3RfbG9ja18nOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfc3RhY2tzaXplX3NfJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9ibG9ja3RpbWVfJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0Xyc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X3N0YWNrc2l6ZV8nOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9zdGFja3NpemVfc18nOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2Jsb2NrdGltZV8nOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9saWJyYXJ5Xyc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9hZmZpbml0eV8nOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5Xyc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrXyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza18nOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX21hbGxvY18nOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfYWxpZ25lZF9tYWxsb2NfJzo6a21wX2FsaWduZWRfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfY2FsbG9jXyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9yZWFsbG9jXyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZnJlZV8nOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3dhcm5pbmdzX29uXyc6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfd2FybmluZ3Nfb2ZmXyc6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXNfJzo6a21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisKKyFkZWMkIGVuZGlmCisKKyFkZWMkIGlmIGRlZmluZWQoX19BUFBMRV9fKQorCishKioqCishKioqIFRoZSBNYWMgZW50cnkgcG9pbnRzIGFyZSBpbiBsb3dlcmNhc2UsIHdpdGggYW4gYm90aCBhbiB1bmRlcnNjb3JlCishKioqIGFwcGVuZGVkIGFuZCBhbiB1bmRlcnNjb3JlIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbnVtX3RocmVhZHNfJzo6b21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfZHluYW1pY18nOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RlZF8nOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3RocmVhZHNfJzo6b21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbWF4X3RocmVhZHNfJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGhyZWFkX251bV8nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X251bV9wcm9jc18nOjpvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbl9wYXJhbGxlbF8nOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2R5bmFtaWNfJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9uZXN0ZWRfJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RocmVhZF9saW1pdF8nOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbGV2ZWxfJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfYWN0aXZlX2xldmVsXyc6Om9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtXyc6Om9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGVhbV9zaXplXyc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9zY2hlZHVsZV8nOjpvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9zY2hlZHVsZV8nOjpvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9wcm9jX2JpbmRfJyA6OiBvbXBfZ2V0X3Byb2NfYmluZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfd3RpbWVfJzo6b21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfd3RpY2tfJzo6b21wX2dldF93dGljaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3RlYW1zXyc6Om9tcF9nZXRfbnVtX3RlYW1zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90ZWFtX251bV8nOjpvbXBfZ2V0X3RlYW1fbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9jYW5jZWxsYXRpb25fJzo6b21wX2dldF9jYW5jZWxsYXRpb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaXNfaW5pdGlhbF9kZXZpY2VfJzo6b21wX2lzX2luaXRpYWxfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9tYXhfdGFza19wcmlvcnR5Xyc6Om9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X2xvY2tfJzo6b21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X2xvY2tfd2l0aF9oaW50Xyc6Om9tcF9pbml0X2xvY2tfd2l0aF9oaW50CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbG9ja18nOjpvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9sb2NrXyc6Om9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9sb2NrXyc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbG9ja18nOjpvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbmVzdF9sb2NrXyc6Om9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnRfJzo6b21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X25lc3RfbG9ja18nOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RfbG9ja18nOjpvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9uZXN0X2xvY2tfJzo6b21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X25lc3RfbG9ja18nOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfc3RhY2tzaXplXyc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9zdGFja3NpemVfc18nOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9ibG9ja3RpbWVfJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfc2VyaWFsXyc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF8nOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0Xyc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5Xyc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfc3RhY2tzaXplXyc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9zdGFja3NpemVfc18nOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9ibG9ja3RpbWVfJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2xpYnJhcnlfJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9hZmZpbml0eV8nOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9hZmZpbml0eV8nOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9hZmZpbml0eV9tYXhfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrXyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfbWFsbG9jXyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfYWxpZ25lZF9tYWxsb2NfJzo6a21wX2FsaWduZWRfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2NhbGxvY18nOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3JlYWxsb2NfJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZnJlZV8nOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF93YXJuaW5nc19vbl8nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF93YXJuaW5nc19vZmZfJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1c18nOjprbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKworIWRlYyQgZW5kaWYKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDUvb21wX2xpYi5mOTAudmFyIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80NS9vbXBfbGliLmY5MC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU5N2Q1NwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDUvb21wX2xpYi5mOTAudmFyCkBAIC0wLDAgKzEsNTI0IEBACishIGluY2x1ZGUvNDUvb21wX2xpYi5mOTAudmFyCisKKyEKKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIS8vCishLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIS8vCishLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIS8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIS8vCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEKKworICAgICAgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgICB1c2UsIGludHJpbnNpYyA6OiBpc29fY19iaW5kaW5nCisKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9pbnRlZ2VyX2tpbmQgICAgICAgPSBjX2ludAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvZ2ljYWxfa2luZCAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9yZWFsX2tpbmQgICAgICAgICAgPSBjX2Zsb2F0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfZG91YmxlX2tpbmQgICAgICAgID0gY19kb3VibGUKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2tpbmQgICAgICAgICAgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbmVzdF9sb2NrX2tpbmQgICAgID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2tpbmQgICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfa2luZCAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3NpemVfdF9raW5kICAgICAgICA9IGNfc2l6ZV90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfYWZmaW5pdHlfbWFza19raW5kID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9raW5kICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfa2luZCAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICBtb2R1bGUgb21wX2xpYgorCisgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IG9wZW5tcF92ZXJzaW9uICAgID0gQExJQk9NUF9PTVBfWUVBUl9NT05USEAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gQExJQk9NUF9WRVJTSU9OX01BSk9SQAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSBATElCT01QX1ZFUlNJT05fTUlOT1JACisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9idWlsZCA9IEBMSUJPTVBfVkVSU0lPTl9CVUlMREAKKyAgICAgICAgY2hhcmFjdGVyKCopICAgICAgICAgICAgICAga21wX2J1aWxkX2RhdGUKKyAgICAgICAgcGFyYW1ldGVyKCBrbXBfYnVpbGRfZGF0ZSA9ICdATElCT01QX0JVSUxEX0RBVEVAJyApCisKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9zdGF0aWMgID0gMQorICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2R5bmFtaWMgPSAyCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZ3VpZGVkICA9IDMKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9hdXRvICAgID0gNAorCisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9mYWxzZSA9IDAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF90cnVlID0gMQorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX21hc3RlciA9IDIKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9jbG9zZSA9IDMKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9zcHJlYWQgPSA0CisKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9wYXJhbGxlbCA9IDEKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9sb29wID0gMgorICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3NlY3Rpb25zID0gMworICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3Rhc2tncm91cCA9IDQKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X25vbmUgICAgICAgICAgID0gMAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X3VuY29udGVuZGVkICAgID0gMQorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X2NvbnRlbmRlZCAgICAgID0gMgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X25vbnNwZWN1bGF0aXZlID0gNAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X3NwZWN1bGF0aXZlICAgID0gOAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfbG9ja19oaW50X2hsZSAgICAgICAgICAgID0gNjU1MzYKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2xvY2tfaGludF9ydG0gICAgICAgICAgICA9IDEzMTA3MgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfbG9ja19oaW50X2FkYXB0aXZlICAgICAgID0gMjYyMTQ0CisKKyAgICAgICAgaW50ZXJmYWNlCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKiogb21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMobnVtX3RocmVhZHMpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBudW1fdGhyZWFkcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljKGR5bmFtaWNfdGhyZWFkcykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCksIHZhbHVlIDo6IGR5bmFtaWNfdGhyZWFkcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZChuZXN0ZWQpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpLCB2YWx1ZSA6OiBuZXN0ZWQKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9wcm9jcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX3BhcmFsbGVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2luX2ZpbmFsKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX2ZpbmFsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9maW5hbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9keW5hbWljKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9keW5hbWljCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X25lc3RlZAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9saW1pdAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdAorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKG1heF9sZXZlbHMpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtYXhfbGV2ZWxzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9sZXZlbCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKGxldmVsKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUobGV2ZWwpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9zaXplCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlKGtpbmQsIGNodW5rX3NpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSwgdmFsdWUgOjoga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogY2h1bmtfc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZShraW5kLCBjaHVua19zaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBjaHVua19zaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9wcm9jX2JpbmQoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpIG9tcF9nZXRfcHJvY19iaW5kCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfcHJvY19iaW5kCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9wbGFjZXMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9wbGFjZXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcGxhY2VzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3BsYWNlX251bV9wcm9jcyhwbGFjZV9udW0pIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwbGFjZV9udW0KKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9wbGFjZV9udW1fcHJvY3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9wbGFjZV9udW1fcHJvY3MKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9wbGFjZV9wcm9jX2lkcyhwbGFjZV9udW0sIGlkcykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHBsYWNlX251bQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBpZHMoKikKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZ2V0X3BsYWNlX3Byb2NfaWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3BsYWNlX251bSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfcGxhY2VfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfcGxhY2VfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3BhcnRpdGlvbl9udW1fcGxhY2VzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9wYXJ0aXRpb25fbnVtX3BsYWNlcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3BhcnRpdGlvbl9udW1fcGxhY2VzCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9nZXRfcGFydGl0aW9uX3BsYWNlX251bXMocGxhY2VfbnVtcykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkgcGxhY2VfbnVtcygqKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9nZXRfcGFydGl0aW9uX3BsYWNlX251bXMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgcmVhbCAoa2luZD1rbXBfZG91YmxlX2tpbmQpIG9tcF9nZXRfd3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGltZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGljaygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICByZWFsIChraW5kPWttcF9kb3VibGVfa2luZCkgb21wX2dldF93dGljaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9kZWZhdWx0X2RldmljZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UoZGV2aWNlX251bSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGRldmljZV9udW0KKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fZGV2aWNlcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90ZWFtcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RlYW1zCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RlYW1zCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2NhbmNlbGxhdGlvbigpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfY2FuY2VsbGF0aW9uCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfY2FuY2VsbGF0aW9uCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2lzX2luaXRpYWxfZGV2aWNlCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2luaXRpYWxfZGV2aWNlKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9pbml0aWFsX2RldmljZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2luaXRpYWxfZGV2aWNlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2soc3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2soc3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2Rlc3Ryb3lfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jayhzdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfc2V0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBzdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrKHN2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrKHN2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF90ZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfdGVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sobnZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBudmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jayhudmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sobnZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3NldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrKG52YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sobnZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Rlc3RfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX3Rlc3RfbmVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbnZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF90YXNrX3ByaW9yaXR5CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBrbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUoc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zKHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lKG1zZWMpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtc2VjCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbCgpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeShsaWJudW0pIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsaWJudW0KKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cyhzdHJpbmcpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSwgaW50cmluc2ljIDo6IGlzb19jX2JpbmRpbmcKKyAgICAgICAgICAgIGNoYXJhY3RlciAoa2luZD1jX2NoYXIpIDo6IHN0cmluZygqKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5KCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9saWJyYXJ5CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Rpc3BfbnVtX2J1ZmZlcnMobnVtKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbnVtCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9kaXNwX251bV9idWZmZXJzCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5KG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHkKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5KG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHkKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayhtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sobWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9tYWxsb2Moc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9tYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9hbGlnbmVkX21hbGxvYyhzaXplLCBhbGlnbm1lbnQpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9hbGlnbmVkX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IGFsaWdubWVudAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfYWxpZ25lZF9tYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9jYWxsb2MobmVsZW0sIGVsc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2NhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBuZWxlbQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBlbHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2NhbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3JlYWxsb2MocHRyLCBzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfcmVhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSwgdmFsdWUgOjogcHRyCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3JlYWxsb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2ZyZWUocHRyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSwgdmFsdWUgOjogcHRyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2ZyZWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbigpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMoY2FuY2Vsa2luZCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgdmFsdWUgOjogY2FuY2Vsa2luZAorICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2tfd2l0aF9oaW50KHN2YXIsIGhpbnQpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgdmFsdWUgOjogaGludAorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2tfd2l0aF9oaW50CisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQobnZhciwgaGludCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBudmFyCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHZhbHVlIDo6IGhpbnQKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50CisKKyAgICAgICAgZW5kIGludGVyZmFjZQorCisgICAgICBlbmQgbW9kdWxlIG9tcF9saWIKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDUvb21wX2xpYi5oLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDUvb21wX2xpYi5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjI4NGYyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80NS9vbXBfbGliLmgudmFyCkBAIC0wLDAgKzEsNjQ0IEBACishIGluY2x1ZGUvNDUvb21wX2xpYi5oLnZhcgorCishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKyEqKioKKyEqKiogU29tZSBvZiB0aGUgZGlyZWN0aXZlcyBmb3IgdGhlIGZvbGxvd2luZyByb3V0aW5lIGV4dGVuZCBwYXN0IGNvbHVtbiA3MiwKKyEqKiogc28gcHJvY2VzcyB0aGlzIGZpbGUgaW4gMTMyLWNvbHVtbiBtb2RlLgorISoqKgorCishRElSJCBmaXhlZGZvcm1saW5lc2l6ZToxMzIKKworICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9pbnRlZ2VyX2tpbmQgICAgICAgPSA0CisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvZ2ljYWxfa2luZCAgICAgICA9IDQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcmVhbF9raW5kICAgICAgICAgID0gNAorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2tpbmQgICAgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9uZXN0X2xvY2tfa2luZCAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9raW5kICAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9raW5kICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfYWZmaW5pdHlfbWFza19raW5kID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X2tpbmQgICAgID0gb21wX2ludGVnZXJfa2luZAorCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjogb3Blbm1wX3ZlcnNpb24gICAgPSBATElCT01QX09NUF9ZRUFSX01PTlRIQAorICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gQExJQk9NUF9WRVJTSU9OX01BSk9SQAorICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21pbm9yID0gQExJQk9NUF9WRVJTSU9OX01JTk9SQAorICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX2J1aWxkID0gQExJQk9NUF9WRVJTSU9OX0JVSUxEQAorICAgICAgY2hhcmFjdGVyKCopICAgICAgICAgICAgICAga21wX2J1aWxkX2RhdGUKKyAgICAgIHBhcmFtZXRlcigga21wX2J1aWxkX2RhdGUgPSAnQExJQk9NUF9CVUlMRF9EQVRFQCcgKQorCisgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX3N0YXRpYyAgPSAxCisgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2R5bmFtaWMgPSAyCisgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2d1aWRlZCAgPSAzCisgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2F1dG8gICAgPSA0CisKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfZmFsc2UgPSAwCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3RydWUgPSAxCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX21hc3RlciA9IDIKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfY2xvc2UgPSAzCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3NwcmVhZCA9IDQKKworICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfaGludF9ub25lICAgICAgICAgICA9IDAKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfdW5jb250ZW5kZWQgICAgPSAxCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X2NvbnRlbmRlZCAgICAgID0gMgorICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfaGludF9ub25zcGVjdWxhdGl2ZSA9IDQKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfc3BlY3VsYXRpdmUgICAgPSA4CisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfbG9ja19oaW50X2hsZSAgICAgICAgICAgID0gNjU1MzYKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9sb2NrX2hpbnRfcnRtICAgICAgICAgICAgPSAxMzEwNzIKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9sb2NrX2hpbnRfYWRhcHRpdmUgICAgICAgPSAyNjIxNDQKKworICAgICAgaW50ZXJmYWNlCisKKyEgICAgICAgKioqCishICAgICAgICoqKiBvbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgKioqCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzKG51bV90aHJlYWRzKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbnVtX3RocmVhZHMKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljKGR5bmFtaWNfdGhyZWFkcykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCksIHZhbHVlIDo6IGR5bmFtaWNfdGhyZWFkcworICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkKG5lc3RlZCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCksIHZhbHVlIDo6IG5lc3RlZAorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X3RocmVhZHMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0oKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fcHJvY3MKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX3BhcmFsbGVsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwKKworICAgICAgICBmdW5jdGlvbiBvbXBfaW5fZmluYWwoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fZmluYWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9maW5hbAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfZHluYW1pYworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9keW5hbWljCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X25lc3RlZAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdCgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdAorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyhtYXhfbGV2ZWxzKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbWF4X2xldmVscworICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9sZXZlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9sZXZlbAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hY3RpdmVfbGV2ZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKGxldmVsKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsZXZlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUobGV2ZWwpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9zaXplCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGV2ZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlKGtpbmQsIGNodW5rX3NpemUpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSwgdmFsdWUgOjoga2luZAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGNodW5rX3NpemUKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZQorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZShraW5kLCBjaHVua19zaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgY2h1bmtfc2l6ZQorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9wcm9jX2JpbmQoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpIG9tcF9nZXRfcHJvY19iaW5kCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3Byb2NfYmluZAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3BsYWNlcygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3BsYWNlcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcGxhY2VzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9wbGFjZV9udW1fcHJvY3MocGxhY2VfbnVtKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcGxhY2VfbnVtCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3BsYWNlX251bV9wcm9jcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9wbGFjZV9udW1fcHJvY3MKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9nZXRfcGxhY2VfcHJvY19pZHMocGxhY2VfbnVtLCBpZHMpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwbGFjZV9udW0KKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGlkcygqKQorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZ2V0X3BsYWNlX3Byb2NfaWRzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9wbGFjZV9udW0oKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3BsYWNlX251bQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9wbGFjZV9udW0KKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3BhcnRpdGlvbl9udW1fcGxhY2VzKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9wYXJ0aXRpb25fbnVtX3BsYWNlcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9wYXJ0aXRpb25fbnVtX3BsYWNlcworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9wYXJ0aXRpb25fcGxhY2VfbnVtcyhwbGFjZV9udW1zKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwbGFjZV9udW1zKCopCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9nZXRfcGFydGl0aW9uX3BsYWNlX251bXMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lKCkgYmluZChjKQorICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGltZQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGltZQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2soKSBiaW5kKGMpCisgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aWNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9kZWZhdWx0X2RldmljZSgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UoZGV2aWNlX251bSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGRldmljZV9udW0KKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9kZWZhdWx0X2RldmljZQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX2RldmljZXMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9kZXZpY2VzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90ZWFtcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX251bQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX251bQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9pc19pbml0aWFsX2RldmljZSgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pc19pbml0aWFsX2RldmljZQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2lzX2luaXRpYWxfZGV2aWNlCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9pbml0aWFsX2RldmljZSgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfaW5pdGlhbF9kZXZpY2UKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfaW5pdGlhbF9kZXZpY2UKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2soc3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jayhzdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfZGVzdHJveV9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2xvY2soc3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3NldF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrKHN2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jaworCisgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2soc3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Rlc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF90ZXN0X2xvY2sKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jayhudmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sobnZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBudmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sobnZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3NldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sobnZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbnZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrKG52YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF90ZXN0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF90ZXN0X25lc3RfbG9jaworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBudmFyCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF90YXNrX3ByaW9yaXR5KCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfdGFza19wcmlvcml0eQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfdGFza19wcmlvcml0eQorCishICAgICAgICoqKgorISAgICAgICAqKioga21wXyogZW50cnkgcG9pbnRzCishICAgICAgICoqKgorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUoc2l6ZSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3Moc2l6ZSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZShtc2VjKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbXNlYworICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbCgpIGJpbmQoYykKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbAorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQoKSBiaW5kKGMpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCgpIGJpbmQoYykKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeShsaWJudW0pIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsaWJudW0KKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5CisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzKHN0cmluZykgYmluZChjKQorICAgICAgICAgIGNoYXJhY3RlciBzdHJpbmcoKikKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cworCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkga21wX2dldF9zdGFja3NpemVfcworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcworCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9ibG9ja3RpbWUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5KCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9saWJyYXJ5CisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGlzcF9udW1fYnVmZmVycyhudW0pIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBudW0KKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9kaXNwX251bV9idWZmZXJzCisKKyAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eShtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5CisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eShtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5CisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayhtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworCisgICAgICAgIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayhtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKworICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfbWFsbG9jKHNpemUpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9tYWxsb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9tYWxsb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfYWxpZ25lZF9tYWxsb2Moc2l6ZSwgYWxpZ25tZW50KSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfYWxpZ25lZF9tYWxsb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IGFsaWdubWVudAorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2FsaWduZWRfbWFsbG9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2NhbGxvYyhuZWxlbSwgZWxzaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfY2FsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBuZWxlbQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogZWxzaXplCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfY2FsbG9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX3JlYWxsb2MocHRyLCBzaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfcmVhbGxvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCksIHZhbHVlIDo6IHB0cgorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3JlYWxsb2MKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9mcmVlKHB0cikgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCksIHZhbHVlIDo6IHB0cgorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZnJlZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbigpIGJpbmQoYykKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbgorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYoKSBiaW5kKGMpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrX3dpdGhfaGludChzdmFyLCBoaW50KSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBzdmFyCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCB2YWx1ZSA6OiBoaW50CisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2tfd2l0aF9oaW50CisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50KG52YXIsIGhpbnQpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbnZhcgorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgdmFsdWUgOjogaGludAorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50CisKKyAgICAgIGVuZCBpbnRlcmZhY2UKKworIURJUiQgSUYgREVGSU5FRCAoX19JTlRFTF9PRkZMT0FEKQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X251bV90aHJlYWRzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfZHluYW1pYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X25lc3RlZAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X251bV90aHJlYWRzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbWF4X3RocmVhZHMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF90aHJlYWRfbnVtCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbnVtX3Byb2NzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9pbl9wYXJhbGxlbAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaW5fZmluYWwKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9keW5hbWljCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbmVzdGVkCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfdGhyZWFkX2xpbWl0CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X2xldmVsCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfYWN0aXZlX2xldmVsCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3RlYW1fc2l6ZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X3NjaGVkdWxlCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfc2NoZWR1bGUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9wcm9jX2JpbmQKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF93dGltZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3d0aWNrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9kZWZhdWx0X2RldmljZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9udW1fZGV2aWNlcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X251bV90ZWFtcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3RlYW1fbnVtCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9pbml0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2Rlc3Ryb3lfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3Vuc2V0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3Rlc3RfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3Rlc3RfbmVzdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9zdGFja3NpemUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9zdGFja3NpemVfcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2Jsb2NrdGltZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfbGlicmFyeQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2RlZmF1bHRzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfc3RhY2tzaXplCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfc3RhY2tzaXplX3MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9ibG9ja3RpbWUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9saWJyYXJ5CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfZGlzcF9udW1fYnVmZmVycworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2FmZmluaXR5CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfYWZmaW5pdHkKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9tYWxsb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2FsaWduZWRfbWFsbG9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9jYWxsb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3JlYWxsb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2ZyZWUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF93YXJuaW5nc19vbgorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X3dhcm5pbmdzX29mZgorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaW5pdF9sb2NrX3dpdGhfaGludAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50CisKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfbnVtX3RocmVhZHMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9keW5hbWljICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfbmVzdGVkICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbnVtX3RocmVhZHMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9tYXhfdGhyZWFkcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3RocmVhZF9udW0gKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9udW1fcHJvY3MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2luX3BhcmFsbGVsICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pbl9maW5hbCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X2R5bmFtaWMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9uZXN0ZWQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF90aHJlYWRfbGltaXQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9tYXhfYWN0aXZlX2xldmVscyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbGV2ZWwgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9hY3RpdmVfbGV2ZWwgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfdGVhbV9zaXplICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfc2NoZWR1bGUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9zY2hlZHVsZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3Byb2NfYmluZCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3d0aW1lICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfd3RpY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9kZWZhdWx0X2RldmljZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X2RlZmF1bHRfZGV2aWNlICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pc19pbml0aWFsX2RldmljZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X251bV9kZXZpY2VzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbnVtX3RlYW1zICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfdGVhbV9udW0gKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2luaXRfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZGVzdHJveV9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfdW5zZXRfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfdGVzdF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pbml0X25lc3RfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZGVzdHJveV9uZXN0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9uZXN0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3Vuc2V0X25lc3RfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfdGVzdF9uZXN0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9tYXhfdGFza19wcmlvcml0eSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X3N0YWNrc2l6ZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X3N0YWNrc2l6ZV9zICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfYmxvY2t0aW1lICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfbGlicmFyeV9zZXJpYWwgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9saWJyYXJ5ICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfZGVmYXVsdHMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9zdGFja3NpemUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9zdGFja3NpemVfcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X2Jsb2NrdGltZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X2xpYnJhcnkgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9kaXNwX251bV9idWZmZXJzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfYWZmaW5pdHkgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9hZmZpbml0eSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX21hbGxvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfYWxpZ25lZF9tYWxsb2MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2NhbGxvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfcmVhbGxvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZnJlZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X3dhcm5pbmdzX29uICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfd2FybmluZ3Nfb2ZmICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pbml0X2xvY2tfd2l0aF9oaW50ICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQgKQorIURJUiQgRU5ESUYKKyFESVIkIEVORElGCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDUvb21wdC5oLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDUvb21wdC5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjcxOGM1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS80NS9vbXB0LmgudmFyCkBAIC0wLDAgKzEsNTE1IEBACisvKgorICogaW5jbHVkZS80NS9vbXB0LmgudmFyCisgKi8KKworI2lmbmRlZiBfX09NUFRfXworI2RlZmluZSBfX09NUFRfXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHN5c3RlbSBpbmNsdWRlIGZpbGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaXRlcmF0aW9uIG1hY3JvcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEZPUkVBQ0hfT01QVF9JTlFVSVJZX0ZOKG1hY3JvKSAgXAorICAgIG1hY3JvIChvbXB0X2VudW1lcmF0ZV9zdGF0ZSkgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc2V0X2NhbGxiYWNrKSAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF9jYWxsYmFjaykgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X2lkbGVfZnJhbWUpICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF90YXNrX2ZyYW1lKSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3N0YXRlKSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfcGFyYWxsZWxfaWQpICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3BhcmFsbGVsX3RlYW1fc2l6ZSkgXAorICAgIG1hY3JvIChvbXB0X2dldF90YXNrX2lkKSAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfdGhyZWFkX2lkKQorCisjZGVmaW5lIEZPUkVBQ0hfT01QVF9QTEFDRUhPTERFUl9GTihtYWNybykgIFwKKyAgICBtYWNybyAob21wdF9pZGxlKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X292ZXJoZWFkKSAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfYmFycmllcl93YWl0KSAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF90YXNrX3dhaXQpICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X211dGV4X3dhaXQpCisKKyNkZWZpbmUgRk9SRUFDSF9PTVBUX1NUQVRFKG1hY3JvKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBmaXJzdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV9maXJzdCwgMHg3MSkgICAgICAgICAgLyogaW5pdGlhbCBlbnVtZXJhdGlvbiBzdGF0ZSAqLyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiB3b3JrIHN0YXRlcyAoMC4uMTUpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93b3JrX3NlcmlhbCwgMHgwMCkgICAgLyogd29ya2luZyBvdXRzaWRlIHBhcmFsbGVsICovICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93b3JrX3BhcmFsbGVsLCAweDAxKSAgLyogd29ya2luZyB3aXRoaW4gcGFyYWxsZWwgKi8gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93b3JrX3JlZHVjdGlvbiwgMHgwMikgLyogcGVyZm9ybWluZyBhIHJlZHVjdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBpZGxlICgxNi4uMzEpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV9pZGxlLCAweDEwKSAgICAgICAgICAgIC8qIHdhaXRpbmcgZm9yIHdvcmsgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBvdmVyaGVhZCBzdGF0ZXMgKDMyLi42MykgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV9vdmVyaGVhZCwgMHgyMCkgICAgICAgIC8qIG92ZXJoZWFkIGV4Y2x1ZGluZyB3YWl0IHN0YXRlcyAqLyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBiYXJyaWVyIHdhaXQgc3RhdGVzICg2NC4uNzkpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2JhcnJpZXIsIDB4NDApICAgIC8qIHdhaXRpbmcgYXQgYSBiYXJyaWVyICovICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2JhcnJpZXJfaW1wbGljaXQsIDB4NDEpICAgIC8qIGltcGxpY2l0IGJhcnJpZXIgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2JhcnJpZXJfZXhwbGljaXQsIDB4NDIpICAgIC8qIGV4cGxpY2l0IGJhcnJpZXIgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiB0YXNrIHdhaXQgc3RhdGVzICg4MC4uOTUpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X3Rhc2t3YWl0LCAweDUwKSAgIC8qIHdhaXRpbmcgYXQgYSB0YXNrd2FpdCAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X3Rhc2tncm91cCwgMHg1MSkgIC8qIHdhaXRpbmcgYXQgYSB0YXNrZ3JvdXAgKi8gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBtdXRleCB3YWl0IHN0YXRlcyAoOTYuLjExMSkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2xvY2ssIDB4NjApICAgICAgIC8qIHdhaXRpbmcgZm9yIGxvY2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X25lc3RfbG9jaywgMHg2MSkgIC8qIHdhaXRpbmcgZm9yIG5lc3QgbG9jayAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2NyaXRpY2FsLCAweDYyKSAgIC8qIHdhaXRpbmcgZm9yIGNyaXRpY2FsICovICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2F0b21pYywgMHg2MykgICAgIC8qIHdhaXRpbmcgZm9yIGF0b21pYyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X29yZGVyZWQsIDB4NjQpICAgIC8qIHdhaXRpbmcgZm9yIG9yZGVyZWQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X3NpbmdsZSwgMHg2RikgICAgIC8qIHdhaXRpbmcgZm9yIHNpbmdsZSByZWdpb24gKG5vbi1zdGFuZGFyZCEpICovICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBtaXNjICgxMTIuLjEyNykgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV91bmRlZmluZWQsIDB4NzApICAgICAgIC8qIHVuZGVmaW5lZCB0aHJlYWQgc3RhdGUgKi8KKworCisjZGVmaW5lIEZPUkVBQ0hfT01QVF9FVkVOVChtYWNybykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKi0tLSBNYW5kYXRvcnkgRXZlbnRzIC0tLSovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcGFyYWxsZWxfYmVnaW4sICAgICAgICAgICBvbXB0X25ld19wYXJhbGxlbF9jYWxsYmFja190LCAgIDEpIC8qIHBhcmFsbGVsIGJlZ2luICovICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZCwgICAgICAgICAgICAgb21wdF9lbmRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAyKSAvKiBwYXJhbGxlbCBlbmQgKi8gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza19iZWdpbiwgICAgICAgICAgICAgICBvbXB0X25ld190YXNrX2NhbGxiYWNrX3QsICAgICAgIDMpIC8qIHRhc2sgYmVnaW4gKi8gICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2tfZW5kLCAgICAgICAgICAgICAgICAgb21wdF90YXNrX2NhbGxiYWNrX3QsICAgICAgICAgICA0KSAvKiB0YXNrIGRlc3Ryb3kgKi8gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGhyZWFkX2JlZ2luLCAgICAgICAgICAgICBvbXB0X3RocmVhZF90eXBlX2NhbGxiYWNrX3QsICAgIDUpIC8qIHRocmVhZCBiZWdpbiAqLyAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3RocmVhZF9lbmQsICAgICAgICAgICAgICAgb21wdF90aHJlYWRfdHlwZV9jYWxsYmFja190LCAgICA2KSAvKiB0aHJlYWQgZW5kICovICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfY29udHJvbCwgICAgICAgICAgICAgICAgICBvbXB0X2NvbnRyb2xfY2FsbGJhY2tfdCwgICAgICAgIDcpIC8qIHN1cHBvcnQgY29udHJvbCBjYWxscyAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9ydW50aW1lX3NodXRkb3duLCAgICAgICAgIG9tcHRfY2FsbGJhY2tfdCwgICAgICAgICAgICAgICAgOCkgLyogcnVudGltZSBzaHV0ZG93biAqLyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qLS0tIE9wdGlvbmFsIEV2ZW50cyAoYmxhbWUgc2hpZnRpbmcsIG9tcHRfZXZlbnRfdW5pbXBsZW1lbnRlZCkgLS0tKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pZGxlX2JlZ2luLCAgICAgICAgICAgICAgIG9tcHRfdGhyZWFkX2NhbGxiYWNrX3QsICAgICAgICAgOSkgLyogYmVnaW4gaWRsZSBzdGF0ZSAqLyAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaWRsZV9lbmQsICAgICAgICAgICAgICAgICBvbXB0X3RocmVhZF9jYWxsYmFja190LCAgICAgICAgMTApIC8qIGVuZCBpZGxlIHN0YXRlICovICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X2JhcnJpZXJfYmVnaW4sICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxMSkgLyogYmVnaW4gd2FpdCBhdCBiYXJyaWVyICovICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9iYXJyaWVyX2VuZCwgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTIpIC8qIGVuZCB3YWl0IGF0IGJhcnJpZXIgKi8gICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X3Rhc2t3YWl0X2JlZ2luLCAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxMykgLyogYmVnaW4gd2FpdCBhdCB0YXNrd2FpdCAqLyBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF90YXNrd2FpdF9lbmQsICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTQpIC8qIGVuZCB3YWl0IGF0IHRhc2t3YWl0ICovICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X3Rhc2tncm91cF9iZWdpbiwgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxNSkgLyogYmVnaW4gd2FpdCBhdCB0YXNrZ3JvdXAgKi9cCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF90YXNrZ3JvdXBfZW5kLCAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTYpIC8qIGVuZCB3YWl0IGF0IHRhc2tncm91cCAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX2xvY2ssICAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICAxNykgLyogbG9jayByZWxlYXNlICovICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9uZXN0X2xvY2tfbGFzdCwgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgMTgpIC8qIGxhc3QgbmVzdCBsb2NrIHJlbGVhc2UgKi8gXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2VfY3JpdGljYWwsICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDE5KSAvKiBjcml0aWNhbCByZWxlYXNlICovICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9hdG9taWMsICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgMjApIC8qIGF0b21pYyByZWxlYXNlICovICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX29yZGVyZWQsICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICAyMSkgLyogb3JkZXJlZCByZWxlYXNlICovICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qLS0tIE9wdGlvbmFsIEV2ZW50cyAoc3luY2hyb25vdXMgZXZlbnRzLCBvbXB0X2V2ZW50X3VuaW1wbGVtZW50ZWQpIC0tLSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luLCAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyMikgLyogaW1wbGljaXQgdGFzayBiZWdpbiAgICovICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQsICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMjMpIC8qIGltcGxpY2l0IHRhc2sgZW5kICAqLyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbml0aWFsX3Rhc2tfYmVnaW4sICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyNCkgLyogaW5pdGlhbCB0YXNrIGJlZ2luICAgKi8gICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaW5pdGlhbF90YXNrX2VuZCwgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMjUpIC8qIGluaXRpYWwgdGFzayBlbmQgICovICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrX3N3aXRjaCwgICAgICAgICAgICAgIG9tcHRfdGFza19wYWlyX2NhbGxiYWNrX3QsICAgICAyNikgLyogdGFzayBzd2l0Y2ggKi8gICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2xvb3BfYmVnaW4sICAgICAgICAgICAgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDI3KSAvKiB0YXNrIGF0IGxvb3AgYmVnaW4gKi8gICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9sb29wX2VuZCwgICAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyOCkgLyogdGFzayBhdCBsb29wIGVuZCAqLyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NlY3Rpb25zX2JlZ2luLCAgICAgICAgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDI5KSAvKiB0YXNrIGF0IHNlY3Rpb25zIGJlZ2luICAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF9zZWN0aW9uc19lbmQsICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzMCkgLyogdGFzayBhdCBzZWN0aW9ucyBlbmQgKi8gICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NpbmdsZV9pbl9ibG9ja19iZWdpbiwgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDMxKSAvKiB0YXNrIGF0IHNpbmdsZSBiZWdpbiovICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9zaW5nbGVfaW5fYmxvY2tfZW5kLCAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzMikgLyogdGFzayBhdCBzaW5nbGUgZW5kICovICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NpbmdsZV9vdGhlcnNfYmVnaW4sICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDMzKSAvKiB0YXNrIGF0IHNpbmdsZSBiZWdpbiAqLyAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9zaW5nbGVfb3RoZXJzX2VuZCwgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzNCkgLyogdGFzayBhdCBzaW5nbGUgZW5kICovICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dvcmtzaGFyZV9iZWdpbiwgICAgICAgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDM1KSAvKiB0YXNrIGF0IHdvcmtzaGFyZSBiZWdpbiAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF93b3Jrc2hhcmVfZW5kLCAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzNikgLyogdGFzayBhdCB3b3Jrc2hhcmUgZW5kICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X21hc3Rlcl9iZWdpbiwgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDM3KSAvKiB0YXNrIGF0IG1hc3RlciBiZWdpbiAqLyAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9tYXN0ZXJfZW5kLCAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzOCkgLyogdGFzayBhdCBtYXN0ZXIgZW5kICovICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW4sICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDM5KSAvKiB0YXNrIGF0IGJhcnJpZXIgYmVnaW4gICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9iYXJyaWVyX2VuZCwgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICA0MCkgLyogdGFzayBhdCBiYXJyaWVyIGVuZCAqLyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2t3YWl0X2JlZ2luLCAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDQxKSAvKiB0YXNrIGF0IHRhc2t3YWl0IGJlZ2luICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrd2FpdF9lbmQsICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICA0MikgLyogdGFzayBhdCB0YXNrIHdhaXQgZW5kICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2tncm91cF9iZWdpbiwgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDQzKSAvKiB0YXNrIGF0IHRhc2tncm91cCBiZWdpbiAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrZ3JvdXBfZW5kLCAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICA0NCkgLyogdGFzayBhdCB0YXNrZ3JvdXAgZW5kICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2VfbmVzdF9sb2NrX3ByZXYsICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDQ1KSAvKiBwcmV2IG5lc3QgbG9jayByZWxlYXNlICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9sb2NrLCAgICAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNDYpIC8qIGxvY2sgd2FpdCAqLyAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfbmVzdF9sb2NrLCAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDQ3KSAvKiBuZXN0IGxvY2sgd2FpdCAqLyAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X2NyaXRpY2FsLCAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA0OCkgLyogY3JpdGljYWwgd2FpdCAqLyAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9hdG9taWMsICAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNDkpIC8qIGF0b21pYyB3YWl0ICovICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfb3JkZXJlZCwgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDUwKSAvKiBvcmRlcmVkIHdhaXQgKi8gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfbG9jaywgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTEpIC8qIGxvY2sgYWNxdWlyZWQgKi8gICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX25lc3RfbG9ja19maXJzdCwgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDUyKSAvKiAxc3QgbmVzdCBsb2NrIGFjcXVpcmVkICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9uZXN0X2xvY2tfbmV4dCwgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1MykgLyogbmV4dCBuZXN0IGxvY2sgYWNxdWlyZWQqLyBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfY3JpdGljYWwsICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTQpIC8qIGNyaXRpY2FsIGFjcXVpcmVkICovICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX2F0b21pYywgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU1KSAvKiBhdG9taWMgYWNxdWlyZWQgKi8gICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9vcmRlcmVkLCAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1NikgLyogb3JkZXJlZCBhY3F1aXJlZCAqLyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2luaXRfbG9jaywgICAgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU3KSAvKiBsb2NrIGluaXQgKi8gICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbml0X25lc3RfbG9jaywgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1OCkgLyogbmVzdCBsb2NrIGluaXQgKi8gICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2Rlc3Ryb3lfbG9jaywgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU5KSAvKiBsb2NrIGRlc3RydWN0aW9uICovICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9kZXN0cm95X25lc3RfbG9jaywgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA2MCkgLyogbmVzdCBsb2NrIGRlc3RydWN0aW9uICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2ZsdXNoLCAgICAgICAgICAgICAgICAgICAgb21wdF9jYWxsYmFja190LCAgICAgICAgICAgICAgIDYxKSAvKiBhZnRlciBleGVjdXRpbmcgZmx1c2ggKi8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza19kZXBlbmRlbmNlcywgICAgICAgICBvbXB0X3Rhc2tfZGVwZW5kZW5jZXNfY2FsbGJhY2tfdCwgNjkpIC8qIHJlcG9ydCB0YXNrIGRlcGVuZGVuY2VzICAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrX2RlcGVuZGVuY2VfcGFpciwgICAgIG9tcHRfdGFza19wYWlyX2NhbGxiYWNrX3QsICAgICA3MCkgLyogcmVwb3J0IHRhc2sgZGVwZW5kZW5jZSBwYWlyICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGRhdGEgdHlwZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGlkZW50aWZpZXJzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgdWludDY0X3Qgb21wdF90aHJlYWRfaWRfdDsKKyNkZWZpbmUgb21wdF90aHJlYWRfaWRfbm9uZSAoKG9tcHRfdGhyZWFkX2lkX3QpIDApICAgICAvKiBub24tc3RhbmRhcmQgKi8KKwordHlwZWRlZiB1aW50NjRfdCBvbXB0X3Rhc2tfaWRfdDsKKyNkZWZpbmUgb21wdF90YXNrX2lkX25vbmUgKChvbXB0X3Rhc2tfaWRfdCkgMCkgICAgICAgICAvKiBub24tc3RhbmRhcmQgKi8KKwordHlwZWRlZiB1aW50NjRfdCBvbXB0X3BhcmFsbGVsX2lkX3Q7CisjZGVmaW5lIG9tcHRfcGFyYWxsZWxfaWRfbm9uZSAoKG9tcHRfcGFyYWxsZWxfaWRfdCkgMCkgLyogbm9uLXN0YW5kYXJkICovCisKK3R5cGVkZWYgdWludDY0X3Qgb21wdF93YWl0X2lkX3Q7CisjZGVmaW5lIG9tcHRfd2FpdF9pZF9ub25lICgob21wdF93YWl0X2lkX3QpIDApICAgICAgICAgLyogbm9uLXN0YW5kYXJkICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIG9tcHRfZnJhbWVfdAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHN0cnVjdCBvbXB0X2ZyYW1lX3MgeworICAgIHZvaWQgKmV4aXRfcnVudGltZV9mcmFtZTsgICAgLyogbmV4dCBmcmFtZSBpcyB1c2VyIGNvZGUgICAgICovCisgICAgdm9pZCAqcmVlbnRlcl9ydW50aW1lX2ZyYW1lOyAvKiBwcmV2aW91cyBmcmFtZSBpcyB1c2VyIGNvZGUgKi8KK30gb21wdF9mcmFtZV90OworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBkZXBlbmRlbmNlcyB0eXBlcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIGVudW0gb21wdF90YXNrX2RlcGVuZGVuY2VfZmxhZ19lIHsKKyAgICAvLyBhIHR3byBiaXQgZmllbGQgZm9yIHRoZSBkZXBlbmRlbmNlIHR5cGUKKyAgICBvbXB0X3Rhc2tfZGVwZW5kZW5jZV90eXBlX291dCAgID0gMSwKKyAgICBvbXB0X3Rhc2tfZGVwZW5kZW5jZV90eXBlX2luICAgID0gMiwKKyAgICBvbXB0X3Rhc2tfZGVwZW5kZW5jZV90eXBlX2lub3V0ID0gMywKK30gb21wdF90YXNrX2RlcGVuZGVuY2VfZmxhZ190OworCit0eXBlZGVmIHN0cnVjdCBvbXB0X3Rhc2tfZGVwZW5kZW5jZV9zIHsKKyAgICB2b2lkICp2YXJpYWJsZV9hZGRyOworICAgIHVpbnQzMl90ICBkZXBlbmRlbmNlX2ZsYWdzOworfSBvbXB0X3Rhc2tfZGVwZW5kZW5jZV90OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZW51bWVyYXRpb25zIGZvciB0aHJlYWQgc3RhdGVzIGFuZCBydW50aW1lIGV2ZW50cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcnVudGltZSBzdGF0ZXMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBlbnVtIHsKKyNkZWZpbmUgb21wdF9zdGF0ZV9tYWNybyhzdGF0ZSwgY29kZSkgc3RhdGUgPSBjb2RlLAorICAgIEZPUkVBQ0hfT01QVF9TVEFURShvbXB0X3N0YXRlX21hY3JvKQorI3VuZGVmIG9tcHRfc3RhdGVfbWFjcm8KK30gb21wdF9zdGF0ZV90OworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBydW50aW1lIGV2ZW50cworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIGVudW0geworI2RlZmluZSBvbXB0X2V2ZW50X21hY3JvKGV2ZW50LCBjYWxsYmFjaywgZXZlbnRpZCkgZXZlbnQgPSBldmVudGlkLAorICAgIEZPUkVBQ0hfT01QVF9FVkVOVChvbXB0X2V2ZW50X21hY3JvKQorI3VuZGVmIG9tcHRfZXZlbnRfbWFjcm8KK30gb21wdF9ldmVudF90OworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBzZXQgY2FsbGJhY2sgcmVzdWx0cworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtIHsKKyAgICBvbXB0X3NldF9yZXN1bHRfcmVnaXN0cmF0aW9uX2Vycm9yICAgICAgICAgICAgICA9IDAsCisgICAgb21wdF9zZXRfcmVzdWx0X2V2ZW50X21heV9vY2N1cl9ub19jYWxsYmFjayAgICAgPSAxLAorICAgIG9tcHRfc2V0X3Jlc3VsdF9ldmVudF9uZXZlcl9vY2N1cnMgICAgICAgICAgICAgID0gMiwKKyAgICBvbXB0X3NldF9yZXN1bHRfZXZlbnRfbWF5X29jY3VyX2NhbGxiYWNrX3NvbWUgICA9IDMsCisgICAgb21wdF9zZXRfcmVzdWx0X2V2ZW50X21heV9vY2N1cl9jYWxsYmFja19hbHdheXMgPSA0LAorfSBvbXB0X3NldF9yZXN1bHRfdDsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY2FsbGJhY2sgc2lnbmF0dXJlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBpbml0aWFsaXphdGlvbiAqLwordHlwZWRlZiB2b2lkICgqb21wdF9pbnRlcmZhY2VfZm5fdCkodm9pZCk7CisKK3R5cGVkZWYgb21wdF9pbnRlcmZhY2VfZm5fdCAoKm9tcHRfZnVuY3Rpb25fbG9va3VwX3QpKAorICAgIGNvbnN0IGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICAvKiBlbnRyeSBwb2ludCB0byBsb29rIHVwICAgICAgICovCispOworCisvKiB0aHJlYWRzICovCit0eXBlZGVmIHZvaWQgKCpvbXB0X3RocmVhZF9jYWxsYmFja190KSAoCisgICAgb21wdF90aHJlYWRfaWRfdCB0aHJlYWRfaWQgICAgICAgIC8qIElEIG9mIHRocmVhZCAgICAgICAgICAgICAgICAgKi8KKyk7CisKK3R5cGVkZWYgZW51bSB7CisgICAgb21wdF90aHJlYWRfaW5pdGlhbCA9IDEsIC8vIHN0YXJ0IHRoZSBlbnVtZXJhdGlvbiBhdCAxCisgICAgb21wdF90aHJlYWRfd29ya2VyICA9IDIsCisgICAgb21wdF90aHJlYWRfb3RoZXIgICA9IDMKK30gb21wdF90aHJlYWRfdHlwZV90OworCit0eXBlZGVmIGVudW0geworICAgIG9tcHRfaW52b2tlcl9wcm9ncmFtID0gMCwgICAgICAgICAvKiBwcm9ncmFtIGludm9rZXMgbWFzdGVyIHRhc2sgICovCisgICAgb21wdF9pbnZva2VyX3J1bnRpbWUgPSAxICAgICAgICAgIC8qIHJ1bnRpbWUgaW52b2tlcyBtYXN0ZXIgdGFzayAgKi8KK30gb21wdF9pbnZva2VyX3Q7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfdGhyZWFkX3R5cGVfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGhyZWFkX3R5cGVfdCB0aHJlYWRfdHlwZSwgICAvKiB0eXBlIG9mIHRocmVhZCAgICAgICAgICAgICAgICovCisgICAgb21wdF90aHJlYWRfaWRfdCB0aHJlYWRfaWQgICAgICAgIC8qIElEIG9mIHRocmVhZCAgICAgICAgICAgICAgICAgKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfd2FpdF9jYWxsYmFja190KSAoCisgICAgb21wdF93YWl0X2lkX3Qgd2FpdF9pZCAgICAgICAgICAgIC8qIHdhaXQgaWQgICAgICAgICAgICAgICAgICAgICAgKi8KKyk7CisKKy8qIHBhcmFsbGVsIGFuZCB3b3Jrc2hhcmVzICovCit0eXBlZGVmIHZvaWQgKCpvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsICAgIC8qIGlkIG9mIHBhcmFsbGVsIHJlZ2lvbiAgICAgICAqLworICAgIG9tcHRfdGFza19pZF90IHRhc2tfaWQgICAgICAgICAgICAgLyogaWQgb2YgdGFzayAgICAgICAgICAgICAgICAgICovCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X25ld193b3Jrc2hhcmVfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwgICAvKiBpZCBvZiBwYXJhbGxlbCByZWdpb24gICAgICAgICovCisgICAgb21wdF90YXNrX2lkX3QgcGFyZW50X3Rhc2tfaWQsICAgIC8qIGlkIG9mIHBhcmVudCB0YXNrICAgICAgICAgICAgKi8KKyAgICB2b2lkICp3b3Jrc2hhcmVfZnVuY3Rpb24gICAgICAgICAgLyogcG9pbnRlciB0byBvdXRsaW5lZCBmdW5jdGlvbiAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF9uZXdfcGFyYWxsZWxfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGFza19pZF90IHBhcmVudF90YXNrX2lkLCAgICAvKiBpZCBvZiBwYXJlbnQgdGFzayAgICAgICAgICAgICovCisgICAgb21wdF9mcmFtZV90ICpwYXJlbnRfdGFza19mcmFtZSwgIC8qIGZyYW1lIGRhdGEgb2YgcGFyZW50IHRhc2sgICAgKi8KKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsICAgLyogaWQgb2YgcGFyYWxsZWwgcmVnaW9uICAgICAgICAqLworICAgIHVpbnQzMl90IHJlcXVlc3RlZF90ZWFtX3NpemUsICAgICAvKiBudW1iZXIgb2YgdGhyZWFkcyBpbiB0ZWFtICAgICovCisgICAgdm9pZCAqcGFyYWxsZWxfZnVuY3Rpb24sICAgICAgICAgIC8qIHBvaW50ZXIgdG8gb3V0bGluZWQgZnVuY3Rpb24gKi8KKyAgICBvbXB0X2ludm9rZXJfdCBpbnZva2VyICAgICAgICAgICAgLyogd2hvIGludm9rZXMgbWFzdGVyIHRhc2s/ICAgICAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF9lbmRfcGFyYWxsZWxfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwgICAvKiBpZCBvZiBwYXJhbGxlbCByZWdpb24gICAgICAgKi8KKyAgICBvbXB0X3Rhc2tfaWRfdCB0YXNrX2lkLCAgICAgICAgICAgLyogaWQgb2YgdGFzayAgICAgICAgICAgICAgICAgICovCisgICAgb21wdF9pbnZva2VyX3QgaW52b2tlciAgICAgICAgICAgIC8qIHdobyBpbnZva2VzIG1hc3RlciB0YXNrPyAgICAqLworKTsKKworLyogdGFza3MgKi8KK3R5cGVkZWYgdm9pZCAoKm9tcHRfdGFza19jYWxsYmFja190KSAoCisgICAgb21wdF90YXNrX2lkX3QgdGFza19pZCAgICAgICAgICAgIC8qIGlkIG9mIHRhc2sgICAgICAgICAgICAgICAgICAgKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfdGFza19wYWlyX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3Rhc2tfaWRfdCBmaXJzdF90YXNrX2lkLAorICAgIG9tcHRfdGFza19pZF90IHNlY29uZF90YXNrX2lkCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X25ld190YXNrX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3Rhc2tfaWRfdCBwYXJlbnRfdGFza19pZCwgICAgLyogaWQgb2YgcGFyZW50IHRhc2sgICAgICAgICAgICAqLworICAgIG9tcHRfZnJhbWVfdCAqcGFyZW50X3Rhc2tfZnJhbWUsICAvKiBmcmFtZSBkYXRhIGZvciBwYXJlbnQgdGFzayAgICovCisgICAgb21wdF90YXNrX2lkX3QgIG5ld190YXNrX2lkLCAgICAgIC8qIGlkIG9mIGNyZWF0ZWQgdGFzayAgICAgICAgICAgKi8KKyAgICB2b2lkICp0YXNrX2Z1bmN0aW9uICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBvdXRsaW5lZCBmdW5jdGlvbiAqLworKTsKKworLyogdGFzayBkZXBlbmRlbmNlcyAqLwordHlwZWRlZiB2b2lkICgqb21wdF90YXNrX2RlcGVuZGVuY2VzX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3Rhc2tfaWRfdCB0YXNrX2lkLCAgICAgICAgICAgIC8qIElEIG9mIHRhc2sgd2l0aCBkZXBlbmRlbmNlcyAqLworICAgIGNvbnN0IG9tcHRfdGFza19kZXBlbmRlbmNlX3QgKmRlcHMsLyogdmVjdG9yIG9mIHRhc2sgZGVwZW5kZW5jZXMgICovCisgICAgaW50IG5kZXBzICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZGVwZW5kZW5jZXMgICAgICAgKi8KKyk7CisKKy8qIHByb2dyYW0gKi8KK3R5cGVkZWYgdm9pZCAoKm9tcHRfY29udHJvbF9jYWxsYmFja190KSAoCisgICAgdWludDY0X3QgY29tbWFuZCwgICAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgb2YgY29udHJvbCBjYWxsICAgICAgKi8KKyAgICB1aW50NjRfdCBtb2RpZmllciAgICAgICAgICAgICAgICAgLyogbW9kaWZpZXIgb2YgY29udHJvbCBjYWxsICAgICAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF9jYWxsYmFja190KSh2b2lkKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogb21wdCBBUEkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgT01QVF9BUElfRk5UWVBFKGZuKSBmbiMjX3QKKworI2RlZmluZSBPTVBUX0FQSV9GVU5DVElPTihyZXR1cm5fdHlwZSwgZm4sIGFyZ3MpICBcCisgICAgdHlwZWRlZiByZXR1cm5fdHlwZSAoKk9NUFRfQVBJX0ZOVFlQRShmbikpIGFyZ3MKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTlFVSVJZIEZVTkNUSU9OUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogc3RhdGUgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKG9tcHRfc3RhdGVfdCwgb21wdF9nZXRfc3RhdGUsICgKKyAgICBvbXB0X3dhaXRfaWRfdCAqb21wdF93YWl0X2lkCispKTsKKworLyogdGhyZWFkICovCitPTVBUX0FQSV9GVU5DVElPTihvbXB0X3RocmVhZF9pZF90LCBvbXB0X2dldF90aHJlYWRfaWQsICh2b2lkKSk7CisKK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQgKiwgb21wdF9nZXRfaWRsZV9mcmFtZSwgKHZvaWQpKTsKKworLyogcGFyYWxsZWwgcmVnaW9uICovCitPTVBUX0FQSV9GVU5DVElPTihvbXB0X3BhcmFsbGVsX2lkX3QsIG9tcHRfZ2V0X3BhcmFsbGVsX2lkLCAoCisgICAgaW50IGFuY2VzdG9yX2xldmVsCispKTsKKworT01QVF9BUElfRlVOQ1RJT04oaW50LCBvbXB0X2dldF9wYXJhbGxlbF90ZWFtX3NpemUsICgKKyAgICBpbnQgYW5jZXN0b3JfbGV2ZWwKKykpOworCisvKiB0YXNrICovCitPTVBUX0FQSV9GVU5DVElPTihvbXB0X3Rhc2tfaWRfdCwgb21wdF9nZXRfdGFza19pZCwgKAorICAgIGludCBkZXB0aAorKSk7CisKK09NUFRfQVBJX0ZVTkNUSU9OKG9tcHRfZnJhbWVfdCAqLCBvbXB0X2dldF90YXNrX2ZyYW1lLCAoCisgICAgaW50IGRlcHRoCispKTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQTEFDRUhPTERFUlMgRk9SIFBFUkZPUk1BTkNFIFJFUE9SVElORworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogaWRsZSAqLworT01QVF9BUElfRlVOQ1RJT04odm9pZCwgb21wdF9pZGxlLCAoCisgICAgdm9pZAorKSk7CisKKy8qIG92ZXJoZWFkICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X292ZXJoZWFkLCAoCisgICAgdm9pZAorKSk7CisKKy8qIGJhcnJpZXIgd2FpdCAqLworT01QVF9BUElfRlVOQ1RJT04odm9pZCwgb21wdF9iYXJyaWVyX3dhaXQsICgKKyAgICB2b2lkCispKTsKKworLyogdGFzayB3YWl0ICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X3Rhc2tfd2FpdCwgKAorICAgIHZvaWQKKykpOworCisvKiBtdXRleCB3YWl0ICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X211dGV4X3dhaXQsICgKKyAgICB2b2lkCispKTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTklUSUFMSVpBVElPTiBGVU5DVElPTlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQsIG9tcHRfaW5pdGlhbGl6ZSwgKAorICAgIG9tcHRfZnVuY3Rpb25fbG9va3VwX3Qgb21wdF9mbl9sb29rdXAsCisgICAgY29uc3QgY2hhciAqcnVudGltZV92ZXJzaW9uLAorICAgIHVuc2lnbmVkIGludCBvbXB0X3ZlcnNpb24KKykpOworCisKKy8qIGluaXRpYWxpemF0aW9uIGludGVyZmFjZSB0byBiZSBkZWZpbmVkIGJ5IHRvb2wgKi8KK29tcHRfaW5pdGlhbGl6ZV90IG9tcHRfdG9vbCh2b2lkKTsKKwordHlwZWRlZiBlbnVtIG9wdF9pbml0X21vZGVfZSB7CisgICAgb21wdF9pbml0X21vZGVfbmV2ZXIgID0gMCwKKyAgICBvbXB0X2luaXRfbW9kZV9mYWxzZSAgPSAxLAorICAgIG9tcHRfaW5pdF9tb2RlX3RydWUgICA9IDIsCisgICAgb21wdF9pbml0X21vZGVfYWx3YXlzID0gMworfSBvbXB0X2luaXRfbW9kZV90OworCitPTVBUX0FQSV9GVU5DVElPTihpbnQsIG9tcHRfc2V0X2NhbGxiYWNrLCAoCisgICAgb21wdF9ldmVudF90IGV2ZW50LAorICAgIG9tcHRfY2FsbGJhY2tfdCBjYWxsYmFjaworKSk7CisKK3R5cGVkZWYgZW51bSBvbXB0X3NldF9jYWxsYmFja19yY19lIHsgIC8qIG5vbi1zdGFuZGFyZCAqLworICAgIG9tcHRfc2V0X2NhbGxiYWNrX2Vycm9yICAgICAgPSAwLAorICAgIG9tcHRfaGFzX2V2ZW50X25vX2NhbGxiYWNrICAgPSAxLAorICAgIG9tcHRfbm9fZXZlbnRfbm9fY2FsbGJhY2sgICAgPSAyLAorICAgIG9tcHRfaGFzX2V2ZW50X21heV9jYWxsYmFjayAgPSAzLAorICAgIG9tcHRfaGFzX2V2ZW50X211c3RfY2FsbGJhY2sgPSA0LAorfSBvbXB0X3NldF9jYWxsYmFja19yY190OworCisKK09NUFRfQVBJX0ZVTkNUSU9OKGludCwgb21wdF9nZXRfY2FsbGJhY2ssICgKKyAgICBvbXB0X2V2ZW50X3QgZXZlbnQsCisgICAgb21wdF9jYWxsYmFja190ICpjYWxsYmFjaworKSk7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTUlTQ0VMTEFORU9VUyBGVU5DVElPTlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGNvbnRyb2wgKi8KKy8vIEZJWE1FOiByZW1vdmUgd29ya2Fyb3VuZCBmb3IgY2xhbmcKKyNpZiAhZGVmaW5lZChfX2NsYW5nX18pICYmIGRlZmluZWQoX09QRU5NUCkgJiYgKF9PUEVOTVAgPj0gMjAxMzA3KQorI3ByYWdtYSBvbXAgZGVjbGFyZSB0YXJnZXQKKyNlbmRpZgordm9pZCBvbXB0X2NvbnRyb2woCisgICAgdWludDY0X3QgY29tbWFuZCwKKyAgICB1aW50NjRfdCBtb2RpZmllcgorKTsKKyNpZiAhZGVmaW5lZChfX2NsYW5nX18pICYmIGRlZmluZWQoX09QRU5NUCkgJiYgKF9PUEVOTVAgPj0gMjAxMzA3KQorI3ByYWdtYSBvbXAgZW5kIGRlY2xhcmUgdGFyZ2V0CisjZW5kaWYKKworLyogc3RhdGUgZW51bWVyYXRpb24gKi8KK09NUFRfQVBJX0ZVTkNUSU9OKGludCwgb21wdF9lbnVtZXJhdGVfc3RhdGUsICgKKyAgICBpbnQgY3VycmVudF9zdGF0ZSwKKyAgICBpbnQgKm5leHRfc3RhdGUsCisgICAgY29uc3QgY2hhciAqKm5leHRfc3RhdGVfbmFtZQorKSk7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK307CisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNTAvb21wLmgudmFyIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS81MC9vbXAuaC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM2ZGE2ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNTAvb21wLmgudmFyCkBAIC0wLDAgKzEsMTk4IEBACisvKgorICogaW5jbHVkZS81MC9vbXAuaC52YXIKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBfX09NUF9ICisjICAgZGVmaW5lIF9fT01QX0gKKworIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9NQUpPUiAgICBATElCT01QX1ZFUlNJT05fTUFKT1JACisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX01JTk9SICAgIEBMSUJPTVBfVkVSU0lPTl9NSU5PUkAKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fQlVJTEQgICAgQExJQk9NUF9WRVJTSU9OX0JVSUxEQAorIyAgIGRlZmluZSBLTVBfQlVJTERfREFURSAgICAgICAiQExJQk9NUF9CVUlMRF9EQVRFQCIKKworIyAgIGlmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB7CisjICAgZW5kaWYKKworIyAgIGlmIGRlZmluZWQoX1dJTjMyKQorIyAgICAgICBkZWZpbmUgX19LQUlfS01QQ19DT05WRU5USU9OIF9fY2RlY2wKKyMgICBlbHNlCisjICAgICAgIGRlZmluZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04KKyMgICBlbmRpZgorCisgICAgLyogc2NoZWR1bGUga2luZCBjb25zdGFudHMgKi8KKyAgICB0eXBlZGVmIGVudW0gb21wX3NjaGVkX3QgeworCW9tcF9zY2hlZF9zdGF0aWMgID0gMSwKKwlvbXBfc2NoZWRfZHluYW1pYyA9IDIsCisJb21wX3NjaGVkX2d1aWRlZCAgPSAzLAorCW9tcF9zY2hlZF9hdXRvICAgID0gNAorICAgIH0gb21wX3NjaGVkX3Q7CisKKyAgICAvKiBzZXQgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X251bV90aHJlYWRzIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X2R5bmFtaWMgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X25lc3RlZCAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X3NjaGVkdWxlICAgICAgICAgIChvbXBfc2NoZWRfdCwgaW50KTsKKworICAgIC8qIHF1ZXJ5IEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9udW1fdGhyZWFkcyAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2R5bmFtaWMgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbmVzdGVkICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9tYXhfdGhyZWFkcyAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RocmVhZF9udW0gICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbnVtX3Byb2NzICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2luX3BhcmFsbGVsICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5fZmluYWwgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfYWN0aXZlX2xldmVsICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbGV2ZWwgICAgICAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSAoaW50KTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF90ZWFtX3NpemUgICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RocmVhZF9saW1pdCAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3NjaGVkdWxlICAgICAgICAgICAgKG9tcF9zY2hlZF90ICosIGludCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9tYXhfdGFza19wcmlvcml0eSAgICh2b2lkKTsKKworICAgIC8qIGxvY2sgQVBJIGZ1bmN0aW9ucyAqLworICAgIHR5cGVkZWYgc3RydWN0IG9tcF9sb2NrX3QgeworICAgICAgICB2b2lkICogX2xrOworICAgIH0gb21wX2xvY2tfdDsKKworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5pdF9sb2NrICAgIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X2xvY2sgICAgIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdW5zZXRfbG9jayAgIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZGVzdHJveV9sb2NrIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdGVzdF9sb2NrICAgIChvbXBfbG9ja190ICopOworCisgICAgLyogbmVzdGVkIGxvY2sgQVBJIGZ1bmN0aW9ucyAqLworICAgIHR5cGVkZWYgc3RydWN0IG9tcF9uZXN0X2xvY2tfdCB7CisgICAgICAgIHZvaWQgKiBfbGs7CisgICAgfSBvbXBfbmVzdF9sb2NrX3Q7CisKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2luaXRfbmVzdF9sb2NrICAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbmVzdF9sb2NrICAgICAob21wX25lc3RfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdW5zZXRfbmVzdF9sb2NrICAgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF90ZXN0X25lc3RfbG9jayAgICAob21wX25lc3RfbG9ja190ICopOworCisgICAgLyogbG9jayBoaW50IHR5cGUgZm9yIGR5bmFtaWMgdXNlciBsb2NrICovCisgICAgdHlwZWRlZiBlbnVtIG9tcF9sb2NrX2hpbnRfdCB7CisgICAgICAgIG9tcF9sb2NrX2hpbnRfbm9uZSAgICAgICAgICAgPSAwLAorICAgICAgICBvbXBfbG9ja19oaW50X3VuY29udGVuZGVkICAgID0gMSwKKyAgICAgICAgb21wX2xvY2tfaGludF9jb250ZW5kZWQgICAgICA9ICgxPDwxICksCisgICAgICAgIG9tcF9sb2NrX2hpbnRfbm9uc3BlY3VsYXRpdmUgPSAoMTw8MiApLAorICAgICAgICBvbXBfbG9ja19oaW50X3NwZWN1bGF0aXZlICAgID0gKDE8PDMgKSwKKyAgICAgICAga21wX2xvY2tfaGludF9obGUgICAgICAgICAgICA9ICgxPDwxNiksCisgICAgICAgIGttcF9sb2NrX2hpbnRfcnRtICAgICAgICAgICAgPSAoMTw8MTcpLAorICAgICAgICBrbXBfbG9ja19oaW50X2FkYXB0aXZlICAgICAgID0gKDE8PDE4KQorICAgIH0gb21wX2xvY2tfaGludF90OworCisgICAgLyogaGludGVkIGxvY2sgaW5pdGlhbGl6ZXJzICovCisgICAgZXh0ZXJuIHZvaWQgX19LQUlfS01QQ19DT05WRU5USU9OIG9tcF9pbml0X2xvY2tfd2l0aF9oaW50KG9tcF9sb2NrX3QgKiwgb21wX2xvY2tfaGludF90KTsKKyAgICBleHRlcm4gdm9pZCBfX0tBSV9LTVBDX0NPTlZFTlRJT04gb21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludChvbXBfbmVzdF9sb2NrX3QgKiwgb21wX2xvY2tfaGludF90KTsKKworICAgIC8qIHRpbWUgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiBkb3VibGUgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3d0aW1lICh2b2lkKTsKKyAgICBleHRlcm4gZG91YmxlIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF93dGljayAodm9pZCk7CisKKyAgICAvKiBPcGVuTVAgNC4wICovCisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UgKGludCk7CisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaXNfaW5pdGlhbF9kZXZpY2UgKHZvaWQpOworICAgIGV4dGVybiBpbnQgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9udW1fZGV2aWNlcyAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X251bV90ZWFtcyAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RlYW1fbnVtICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfY2FuY2VsbGF0aW9uICh2b2lkKTsKKworIyAgIGluY2x1ZGUgPHN0ZGxpYi5oPgorICAgIC8qIE9wZW5NUCA0LjUgKi8KKyAgICBleHRlcm4gaW50ICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2luaXRpYWxfZGV2aWNlICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCogX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdGFyZ2V0X2FsbG9jKHNpemVfdCwgaW50KTsKKyAgICBleHRlcm4gdm9pZCAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdGFyZ2V0X2ZyZWUodm9pZCAqLCBpbnQpOworICAgIGV4dGVybiBpbnQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF90YXJnZXRfaXNfcHJlc2VudCh2b2lkICosIGludCk7CisgICAgZXh0ZXJuIGludCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3RhcmdldF9tZW1jcHkodm9pZCAqLCB2b2lkICosIHNpemVfdCwgc2l6ZV90LCBzaXplX3QsIGludCwgaW50KTsKKyAgICBleHRlcm4gaW50ICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdGFyZ2V0X21lbWNweV9yZWN0KHZvaWQgKiwgdm9pZCAqLCBzaXplX3QsIGludCwgY29uc3Qgc2l6ZV90ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCAqLCBjb25zdCBzaXplX3QgKiwgY29uc3Qgc2l6ZV90ICosIGNvbnN0IHNpemVfdCAqLCBpbnQsIGludCk7CisgICAgZXh0ZXJuIGludCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3RhcmdldF9hc3NvY2lhdGVfcHRyKHZvaWQgKiwgdm9pZCAqLCBzaXplX3QsIHNpemVfdCwgaW50KTsKKyAgICBleHRlcm4gaW50ICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdGFyZ2V0X2Rpc2Fzc29jaWF0ZV9wdHIodm9pZCAqLCBpbnQpOworCisgICAgLyoga21wIEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9zdGFja3NpemUgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3N0YWNrc2l6ZSAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gc2l6ZV90IF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9zdGFja3NpemVfcyAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3N0YWNrc2l6ZV9zICAgICAgICAoc2l6ZV90KTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9ibG9ja3RpbWUgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2xpYnJhcnkgICAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYmxvY2t0aW1lICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnkgICAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3NlcmlhbCAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0ICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9kZWZhdWx0cyAgICAgICAgICAgKGNoYXIgY29uc3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfZGlzcF9udW1fYnVmZmVycyAgIChpbnQpOworCisgICAgLyogSW50ZWwgYWZmaW5pdHkgQVBJICovCisgICAgdHlwZWRlZiB2b2lkICoga21wX2FmZmluaXR5X21hc2tfdDsKKworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2FmZmluaXR5ICAgICAgICAgICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2FmZmluaXR5ICAgICAgICAgICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrICAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MgICAoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jIChpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jICAgKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKKworICAgIC8qIE9wZW5NUCA0LjAgYWZmaW5pdHkgQVBJICovCisgICAgdHlwZWRlZiBlbnVtIG9tcF9wcm9jX2JpbmRfdCB7CisgICAgICAgIG9tcF9wcm9jX2JpbmRfZmFsc2UgPSAwLAorICAgICAgICBvbXBfcHJvY19iaW5kX3RydWUgPSAxLAorICAgICAgICBvbXBfcHJvY19iaW5kX21hc3RlciA9IDIsCisgICAgICAgIG9tcF9wcm9jX2JpbmRfY2xvc2UgPSAzLAorICAgICAgICBvbXBfcHJvY19iaW5kX3NwcmVhZCA9IDQKKyAgICB9IG9tcF9wcm9jX2JpbmRfdDsKKworICAgIGV4dGVybiBvbXBfcHJvY19iaW5kX3QgX19LQUlfS01QQ19DT05WRU5USU9OIG9tcF9nZXRfcHJvY19iaW5kICh2b2lkKTsKKworICAgIC8qIE9wZW5NUCA0LjUgYWZmaW5pdHkgQVBJICovCisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OIG9tcF9nZXRfbnVtX3BsYWNlcyAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OIG9tcF9nZXRfcGxhY2VfbnVtX3Byb2NzIChpbnQpOworICAgIGV4dGVybiB2b2lkIF9fS0FJX0tNUENfQ09OVkVOVElPTiBvbXBfZ2V0X3BsYWNlX3Byb2NfaWRzIChpbnQsIGludCAqKTsKKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gb21wX2dldF9wbGFjZV9udW0gKHZvaWQpOworICAgIGV4dGVybiBpbnQgIF9fS0FJX0tNUENfQ09OVkVOVElPTiBvbXBfZ2V0X3BhcnRpdGlvbl9udW1fcGxhY2VzICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCBfX0tBSV9LTVBDX0NPTlZFTlRJT04gb21wX2dldF9wYXJ0aXRpb25fcGxhY2VfbnVtcyAoaW50ICopOworCisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9tYWxsb2MgIChzaXplX3QpOworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfYWxpZ25lZF9tYWxsb2MgIChzaXplX3QsIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9jYWxsb2MgIChzaXplX3QsIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9yZWFsbG9jICh2b2lkICosIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9mcmVlICAgICh2b2lkICopOworCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfd2FybmluZ3Nfb24odm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfd2FybmluZ3Nfb2ZmKHZvaWQpOworCisjICAgdW5kZWYgX19LQUlfS01QQ19DT05WRU5USU9OCisKKyAgICAvKiBXYXJuaW5nOgorICAgICAgIFRoZSBmb2xsb3dpbmcgdHlwZWRlZnMgYXJlIG5vdCBzdGFuZGFyZCwgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuCisgICAgKi8KKyAgICB0eXBlZGVmIGludCAgICAgb21wX2ludF90OworICAgIHR5cGVkZWYgZG91YmxlICBvbXBfd3RpbWVfdDsKKworIyAgIGlmZGVmIF9fY3BsdXNwbHVzCisgICAgfQorIyAgIGVuZGlmCisKKyNlbmRpZiAvKiBfX09NUF9IICovCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNTAvb21wX2xpYi5mLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNTAvb21wX2xpYi5mLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGE4NzUxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS81MC9vbXBfbGliLmYudmFyCkBAIC0wLDAgKzEsODU1IEBACishIGluY2x1ZGUvNTAvb21wX2xpYi5mLnZhcgorCishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKyEqKioKKyEqKiogU29tZSBvZiB0aGUgZGlyZWN0aXZlcyBmb3IgdGhlIGZvbGxvd2luZyByb3V0aW5lIGV4dGVuZCBwYXN0IGNvbHVtbiA3MiwKKyEqKiogc28gcHJvY2VzcyB0aGlzIGZpbGUgaW4gMTMyLWNvbHVtbiBtb2RlLgorISoqKgorCishZGVjJCBmaXhlZGZvcm1saW5lc2l6ZToxMzIKKworICAgICAgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2ludGVnZXJfa2luZCAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2dpY2FsX2tpbmQgICAgICAgPSA0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcmVhbF9raW5kICAgICAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfa2luZCAgICAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbmVzdF9sb2NrX2tpbmQgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9raW5kICAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2tpbmQgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3BvaW50ZXJfa2luZCAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9hZmZpbml0eV9tYXNrX2tpbmQgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9raW5kICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfa2luZCAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICBtb2R1bGUgb21wX2xpYgorCisgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gQExJQk9NUF9WRVJTSU9OX01BSk9SQAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSBATElCT01QX1ZFUlNJT05fTUlOT1JACisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9idWlsZCA9IEBMSUJPTVBfVkVSU0lPTl9CVUlMREAKKyAgICAgICAgY2hhcmFjdGVyKCopLCBwYXJhbWV0ZXIgOjoga21wX2J1aWxkX2RhdGUgICAgPSAnQExJQk9NUF9CVUlMRF9EQVRFQCcKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IG9wZW5tcF92ZXJzaW9uICAgID0gQExJQk9NUF9PTVBfWUVBUl9NT05USEAKKworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX3N0YXRpYyAgPSAxCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZHluYW1pYyA9IDIKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9ndWlkZWQgID0gMworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2F1dG8gICAgPSA0CisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9mYWxzZSA9IDAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF90cnVlID0gMQorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX21hc3RlciA9IDIKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9jbG9zZSA9IDMKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9zcHJlYWQgPSA0CisKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9wYXJhbGxlbCA9IDEKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9sb29wID0gMgorICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3NlY3Rpb25zID0gMworICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3Rhc2tncm91cCA9IDQKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X25vbmUgICAgICAgICAgID0gMAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X3VuY29udGVuZGVkICAgID0gMQorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X2NvbnRlbmRlZCAgICAgID0gMgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X25vbnNwZWN1bGF0aXZlID0gNAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X3NwZWN1bGF0aXZlICAgID0gOAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfbG9ja19oaW50X2hsZSAgICAgICAgICAgID0gNjU1MzYKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2xvY2tfaGludF9ydG0gICAgICAgICAgICA9IDEzMTA3MgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfbG9ja19oaW50X2FkYXB0aXZlICAgICAgID0gMjYyMTQ0CisKKyAgICAgICAgaW50ZXJmYWNlCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKiogb21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMobnVtX3RocmVhZHMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBudW1fdGhyZWFkcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljKGR5bmFtaWNfdGhyZWFkcykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIGR5bmFtaWNfdGhyZWFkcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZChuZXN0ZWQpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBuZXN0ZWQKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0oKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fcHJvY3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fcGFyYWxsZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfaW5fZmluYWwoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX2ZpbmFsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9maW5hbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9keW5hbWljKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfZHluYW1pYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfbmVzdGVkCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9saW1pdAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdAorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKG1heF9sZXZlbHMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtYXhfbGV2ZWxzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9sZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKGxldmVsKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbGV2ZWwKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUobGV2ZWwpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsZXZlbAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlKGtpbmQsIGNodW5rX3NpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBjaHVua19zaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlKGtpbmQsIGNodW5rX3NpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBjaHVua19zaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9wcm9jX2JpbmQoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSBvbXBfZ2V0X3Byb2NfYmluZAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3Byb2NfYmluZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcGxhY2VzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3BsYWNlcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9wbGFjZXMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfcGxhY2VfbnVtX3Byb2NzKHBsYWNlX251bSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHBsYWNlX251bQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3BsYWNlX251bV9wcm9jcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3BsYWNlX251bV9wcm9jcworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZ2V0X3BsYWNlX3Byb2NfaWRzKHBsYWNlX251bSwgaWRzKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcGxhY2VfbnVtCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGlkcygqKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9nZXRfcGxhY2VfcHJvY19pZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfcGxhY2VfbnVtKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfcGxhY2VfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfcGxhY2VfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3BhcnRpdGlvbl9udW1fcGxhY2VzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfcGFydGl0aW9uX251bV9wbGFjZXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9wYXJ0aXRpb25fbnVtX3BsYWNlcworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZ2V0X3BhcnRpdGlvbl9wbGFjZV9udW1zKHBsYWNlX251bXMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwbGFjZV9udW1zKCopCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9wYXJ0aXRpb25fcGxhY2VfbnVtcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGltZSgpCisgICAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGltZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGljayAoKQorICAgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aWNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9kZWZhdWx0X2RldmljZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UoZGV2aWNlX251bSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGRldmljZV9udW0KKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX2RldmljZXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fZGV2aWNlcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGVhbXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9udW0oKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2NhbmNlbGxhdGlvbigpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2NhbmNlbGxhdGlvbgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2NhbmNlbGxhdGlvbgorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2lzX2luaXRpYWxfZGV2aWNlKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pc19pbml0aWFsX2RldmljZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfaW5pdGlhbF9kZXZpY2UoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9pbml0aWFsX2RldmljZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2luaXRpYWxfZGV2aWNlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2soc3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9pbml0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBzdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrKHN2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfZGVzdHJveV9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrKHN2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfc2V0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBzdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrKHN2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdW5zZXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbG9jayhzdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Rlc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF90ZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jayhudmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBudmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jayhudmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBudmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrKG52YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfc2V0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbnZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sobnZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sobnZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF90ZXN0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF90ZXN0X25lc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF90YXNrX3ByaW9yaXR5KCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfdGFza19wcmlvcml0eQorCishICAgICAgICAgKioqCishICAgICAgICAgKioqIGttcF8qIGVudHJ5IHBvaW50cworISAgICAgICAgICoqKgorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZShzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3Moc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUobXNlYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1zZWMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsKCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kKCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCgpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5KGxpYm51bSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxpYm51bQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzKHN0cmluZykKKyAgICAgICAgICAgIGNoYXJhY3RlciooKikgc3RyaW5nCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYmxvY2t0aW1lCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9saWJyYXJ5CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Rpc3BfbnVtX2J1ZmZlcnMobnVtKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbnVtCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9kaXNwX251bV9idWZmZXJzCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5KG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5CisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eShtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayhtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrKG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX21hbGxvYyhzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX21hbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2FsaWduZWRfbWFsbG9jKHNpemUsIGFsaWdubWVudCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9hbGlnbmVkX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBhbGlnbm1lbnQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2FsaWduZWRfbWFsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfY2FsbG9jKG5lbGVtLCBlbHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfY2FsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgbmVsZW0KKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBlbHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2NhbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3JlYWxsb2MocHRyLCBzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX3JlYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkgcHRyCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfcmVhbGxvYworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZnJlZShwdHIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwdHIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZnJlZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uKCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmKCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZgorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzKGNhbmNlbGtpbmQpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpIGNhbmNlbGtpbmQKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrX3dpdGhfaGludChzdmFyLCBoaW50KQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpIGhpbnQKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrX3dpdGhfaGludAorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50KG52YXIsIGhpbnQpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSBoaW50CisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludAorCisgICAgICAgIGVuZCBpbnRlcmZhY2UKKworIWRlYyQgaWYgZGVmaW5lZChfV0lOMzIpCishZGVjJCAgIGlmIGRlZmluZWQoX1dJTjY0KSAub3IuIGRlZmluZWQoX01fQU1ENjQpCisKKyEqKioKKyEqKiogVGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIG11c3QgYmUgaW4gdXBwZXJjYXNlLCBldmVuIGlmIHRoZSAvUWxvd2VyY2FzZQorISoqKiBvcHRpb24gaXMgc3BlY2lmaWVkLiAgVGhlIGFsaWFzIGF0dHJpYnV0ZSBlbnN1cmVzIHRoYXQgdGhlIHNwZWNpZmllZAorISoqKiBzdHJpbmcgaXMgdXNlZCBhcyB0aGUgZW50cnkgcG9pbnQuCishKioqCishKioqIE9uIHRoZSBXaW5kb3dzKiBPUyBJQS0zMiBhcmNoaXRlY3R1cmUsIHRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBoYXZlIGFuCishKioqIHVuZGVyc2NvcmUgcHJlcGVuZGVkLiAgT24gdGhlIFdpbmRvd3MqIE9TIEludGVsKFIpIDY0CishKioqIGFyY2hpdGVjdHVyZSwgbm8gdW5kZXJzY29yZSBpcyBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfRFlOQU1JQycgOjogb21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX05FU1RFRCcgOjogb21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX1RIUkVBRFMnIDo6IG9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEhSRUFEX05VTScgOjogb21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9QUk9DUycgOjogb21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9JTl9QQVJBTExFTCcgOjogb21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0RZTkFNSUMnIDo6IG9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9ORVNURUQnIDo6IG9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RIUkVBRF9MSU1JVCcgOjogb21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTEVWRUwnIDo6IG9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfQUNUSVZFX0xFVkVMJyA6OiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNJyA6OiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEVBTV9TSVpFJyA6OiBvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9TQ0hFRFVMRScgOjogb21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9TQ0hFRFVMRScgOjogb21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9QUk9DX0JJTkQnIDo6IG9tcF9nZXRfcHJvY19iaW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1dUSU1FJyA6OiBvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1dUSUNLJyA6OiBvbXBfZ2V0X3d0aWNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0RFRkFVTFRfREVWSUNFJyA6OiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX0RFRkFVTFRfREVWSUNFJyA6OiBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9ERVZJQ0VTJyA6OiBvbXBfZ2V0X251bV9kZXZpY2VzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9URUFNUycgOjogb21wX2dldF9udW1fdGVhbXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEVBTV9OVU0nIDo6IG9tcF9nZXRfdGVhbV9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfQ0FOQ0VMTEFUSU9OJyA6OiBvbXBfZ2V0X2NhbmNlbGxhdGlvbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0lTX0lOSVRJQUxfREVWSUNFJyA6OiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX1RBU0tfUFJJT1JJVFknIDo6IG9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9jaycgOjogb21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9ja193aXRoX2hpbnQnIDo6IG9tcF9pbml0X2xvY2tfd2l0aF9oaW50CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9sb2NrJyA6OiBvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2xvY2snIDo6IG9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X2xvY2snIDo6IG9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9sb2NrJyA6OiBvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9uZXN0X2xvY2snIDo6IG9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludCcgOjogb21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbmVzdF9sb2NrJyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdF9sb2NrJyA6OiBvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X25lc3RfbG9jaycgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbmVzdF9sb2NrJyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9TVEFDS1NJWkUnOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9TVEFDS1NJWkVfUyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQkxPQ0tUSU1FJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9TRVJJQUwnOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfVFVSTkFST1VORCc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfVEhST1VHSFBVVCc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUlknOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfU1RBQ0tTSVpFJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfU1RBQ0tTSVpFX1MnOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0JMT0NLVElNRSc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0xJQlJBUlknOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQUZGSU5JVFknOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0FGRklOSVRZJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWV9NQVhfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9DUkVBVEVfQUZGSU5JVFlfTUFTSyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0RFU1RST1lfQUZGSU5JVFlfTUFTSyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfTUFMTE9DJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0FMSUdORURfTUFMTE9DJzo6a21wX2FsaWduZWRfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfQ0FMTE9DJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1JFQUxMT0MnOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0ZSRUUnOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1dBUk5JTkdTX09OJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9XQVJOSU5HU19PRkYnOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0NBTkNFTExBVElPTl9TVEFUVVMnIDo6IGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworCishZGVjJCAgIGVsc2UKKworISoqKgorISoqKiBPbiBXaW5kb3dzKiBPUyBJQS0zMiBhcmNoaXRlY3R1cmUsIHRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBoYXZlIGFuIHVuZGVyc2NvcmUgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9OVU1fVEhSRUFEUycgOjogb21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfRFlOQU1JQycgOjogb21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9ORVNURUQnIDo6IG9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fVEhSRUFEUycgOjogb21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTUFYX1RIUkVBRFMnIDo6IG9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RIUkVBRF9OVU0nIDo6IG9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX1BST0NTJyA6OiBvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9JTl9QQVJBTExFTCcgOjogb21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9EWU5BTUlDJyA6OiBvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05FU1RFRCcgOjogb21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RIUkVBRF9MSU1JVCcgOjogb21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX01BWF9BQ1RJVkVfTEVWRUxTJyA6OiBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9NQVhfQUNUSVZFX0xFVkVMUycgOjogb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTEVWRUwnIDo6IG9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0FDVElWRV9MRVZFTCcgOjogb21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0nIDo6IG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEVBTV9TSVpFJyA6OiBvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfU0NIRURVTEUnIDo6IG9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1NDSEVEVUxFJyA6OiBvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9QUk9DX0JJTkQnIDo6IG9tcF9nZXRfcHJvY19iaW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9XVElNRScgOjogb21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfV1RJQ0snIDo6IG9tcF9nZXRfd3RpY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0RFRkFVTFRfREVWSUNFJyA6OiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9ERUZBVUxUX0RFVklDRScgOjogb21wX3NldF9kZWZhdWx0X2RldmljZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX0RFVklDRVMnIDo6IG9tcF9nZXRfbnVtX2RldmljZXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9URUFNUycgOjogb21wX2dldF9udW1fdGVhbXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RFQU1fTlVNJyA6OiBvbXBfZ2V0X3RlYW1fbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9DQU5DRUxMQVRJT04nIDo6IG9tcF9nZXRfY2FuY2VsbGF0aW9uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0lTX0lOSVRJQUxfREVWSUNFJyA6OiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX01BWF9UQVNLX1BSSU9SVFknIDo6IG9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X2xvY2snIDo6IG9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9sb2NrX3dpdGhfaGludCcgOjogb21wX2luaXRfbG9ja193aXRoX2hpbnQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9sb2NrJyA6OiBvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9sb2NrJyA6OiBvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbG9jaycgOjogb21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9sb2NrJyA6OiBvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbmVzdF9sb2NrJyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50JyA6OiBvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbmVzdF9sb2NrJyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RfbG9jaycgOjogb21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbmVzdF9sb2NrJyA6OiBvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbmVzdF9sb2NrJyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfU1RBQ0tTSVpFJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1NUQUNLU0laRV9TJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQkxPQ0tUSU1FJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfU0VSSUFMJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5EJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfVEhST1VHSFBVVCc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9TVEFDS1NJWkUnOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfU1RBQ0tTSVpFX1MnOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9CTE9DS1RJTUUnOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfTElCUkFSWSc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQUZGSU5JVFknOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9BRkZJTklUWSc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0FGRklOSVRZX01BWF9QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9DUkVBVEVfQUZGSU5JVFlfTUFTSyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9ERVNUUk9ZX0FGRklOSVRZX01BU0snOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9NQUxMT0MnOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0FMSUdORURfTUFMTE9DJzo6a21wX2FsaWduZWRfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0NBTExPQyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfUkVBTExPQyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0ZSRUUnOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9XQVJOSU5HU19PTic6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1dBUk5JTkdTX09GRic6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0NBTkNFTExBVElPTl9TVEFUVVMnIDo6IGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworCishZGVjJCAgIGVuZGlmCishZGVjJCBlbmRpZgorCishZGVjJCBpZiBkZWZpbmVkKF9fbGludXgpCisKKyEqKioKKyEqKiogVGhlIExpbnV4KiBPUyBlbnRyeSBwb2ludHMgYXJlIGluIGxvd2VyY2FzZSwgd2l0aCBhbiB1bmRlcnNjb3JlIGFwcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X251bV90aHJlYWRzXyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfZHluYW1pY18nOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdGVkXyc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV90aHJlYWRzXyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbWF4X3RocmVhZHNfJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90aHJlYWRfbnVtXyc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fcHJvY3NfJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbl9wYXJhbGxlbF8nOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfZHluYW1pY18nOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbmVzdGVkXyc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RocmVhZF9saW1pdF8nOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbGV2ZWxfJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9hY3RpdmVfbGV2ZWxfJzo6b21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bV8nOjpvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGVhbV9zaXplXyc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X3NjaGVkdWxlXyc6Om9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfc2NoZWR1bGVfJzo6b21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9wcm9jX2JpbmRfJyA6OiBvbXBfZ2V0X3Byb2NfYmluZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF93dGltZV8nOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3d0aWNrXyc6Om9tcF9nZXRfd3RpY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfZGVmYXVsdF9kZXZpY2VfJzo6b21wX2dldF9kZWZhdWx0X2RldmljZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9kZWZhdWx0X2RldmljZV8nOjpvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV9kZXZpY2VzXyc6Om9tcF9nZXRfbnVtX2RldmljZXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbnVtX3RlYW1zXyc6Om9tcF9nZXRfbnVtX3RlYW1zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RlYW1fbnVtXyc6Om9tcF9nZXRfdGVhbV9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfY2FuY2VsbGF0aW9uXyc6Om9tcF9nZXRfY2FuY2VsbGF0aW9uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaXNfaW5pdGlhbF9kZXZpY2VfJzo6b21wX2lzX2luaXRpYWxfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X21heF90YXNrX3ByaW9yaXR5Xyc6Om9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9ja18nOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9sb2NrX3dpdGhfaGludF8nOjpvbXBfaW5pdF9sb2NrX3dpdGhfaGludAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbG9ja18nOjpvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2xvY2tfJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbG9ja18nOjpvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbG9ja18nOjpvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9uZXN0X2xvY2tfJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50Xyc6Om9tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X25lc3RfbG9ja18nOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbmVzdF9sb2NrXyc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X25lc3RfbG9ja18nOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfc3RhY2tzaXplX3NfJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9ibG9ja3RpbWVfJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0Xyc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X3N0YWNrc2l6ZV8nOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9zdGFja3NpemVfc18nOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2Jsb2NrdGltZV8nOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9saWJyYXJ5Xyc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9hZmZpbml0eV8nOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5Xyc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrXyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza18nOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX21hbGxvY18nOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfYWxpZ25lZF9tYWxsb2NfJzo6a21wX2FsaWduZWRfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfY2FsbG9jXyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9yZWFsbG9jXyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZnJlZV8nOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3dhcm5pbmdzX29uXyc6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfd2FybmluZ3Nfb2ZmXyc6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXNfJzo6a21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisKKyFkZWMkIGVuZGlmCisKKyFkZWMkIGlmIGRlZmluZWQoX19BUFBMRV9fKQorCishKioqCishKioqIFRoZSBNYWMgZW50cnkgcG9pbnRzIGFyZSBpbiBsb3dlcmNhc2UsIHdpdGggYW4gYm90aCBhbiB1bmRlcnNjb3JlCishKioqIGFwcGVuZGVkIGFuZCBhbiB1bmRlcnNjb3JlIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbnVtX3RocmVhZHNfJzo6b21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfZHluYW1pY18nOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RlZF8nOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3RocmVhZHNfJzo6b21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbWF4X3RocmVhZHNfJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGhyZWFkX251bV8nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X251bV9wcm9jc18nOjpvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbl9wYXJhbGxlbF8nOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2R5bmFtaWNfJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9uZXN0ZWRfJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RocmVhZF9saW1pdF8nOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbGV2ZWxfJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfYWN0aXZlX2xldmVsXyc6Om9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtXyc6Om9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGVhbV9zaXplXyc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9zY2hlZHVsZV8nOjpvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9zY2hlZHVsZV8nOjpvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9wcm9jX2JpbmRfJyA6OiBvbXBfZ2V0X3Byb2NfYmluZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfd3RpbWVfJzo6b21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfd3RpY2tfJzo6b21wX2dldF93dGljaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3RlYW1zXyc6Om9tcF9nZXRfbnVtX3RlYW1zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90ZWFtX251bV8nOjpvbXBfZ2V0X3RlYW1fbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9jYW5jZWxsYXRpb25fJzo6b21wX2dldF9jYW5jZWxsYXRpb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaXNfaW5pdGlhbF9kZXZpY2VfJzo6b21wX2lzX2luaXRpYWxfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9tYXhfdGFza19wcmlvcnR5Xyc6Om9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X2xvY2tfJzo6b21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X2xvY2tfd2l0aF9oaW50Xyc6Om9tcF9pbml0X2xvY2tfd2l0aF9oaW50CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbG9ja18nOjpvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9sb2NrXyc6Om9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9sb2NrXyc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbG9ja18nOjpvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbmVzdF9sb2NrXyc6Om9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnRfJzo6b21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X25lc3RfbG9ja18nOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RfbG9ja18nOjpvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9uZXN0X2xvY2tfJzo6b21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X25lc3RfbG9ja18nOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfc3RhY2tzaXplXyc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9zdGFja3NpemVfc18nOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9ibG9ja3RpbWVfJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfc2VyaWFsXyc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF8nOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0Xyc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5Xyc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfc3RhY2tzaXplXyc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9zdGFja3NpemVfc18nOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9ibG9ja3RpbWVfJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2xpYnJhcnlfJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9hZmZpbml0eV8nOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9hZmZpbml0eV8nOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9hZmZpbml0eV9tYXhfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrXyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfbWFsbG9jXyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfYWxpZ25lZF9tYWxsb2NfJzo6a21wX2FsaWduZWRfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2NhbGxvY18nOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3JlYWxsb2NfJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZnJlZV8nOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF93YXJuaW5nc19vbl8nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF93YXJuaW5nc19vZmZfJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1c18nOjprbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKworIWRlYyQgZW5kaWYKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNTAvb21wX2xpYi5mOTAudmFyIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS81MC9vbXBfbGliLmY5MC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNkYzViNwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNTAvb21wX2xpYi5mOTAudmFyCkBAIC0wLDAgKzEsNTI0IEBACishIGluY2x1ZGUvNTAvb21wX2xpYi5mOTAudmFyCisKKyEKKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIS8vCishLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIS8vCishLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIS8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIS8vCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEKKworICAgICAgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgICB1c2UsIGludHJpbnNpYyA6OiBpc29fY19iaW5kaW5nCisKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9pbnRlZ2VyX2tpbmQgICAgICAgPSBjX2ludAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvZ2ljYWxfa2luZCAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9yZWFsX2tpbmQgICAgICAgICAgPSBjX2Zsb2F0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfZG91YmxlX2tpbmQgICAgICAgID0gY19kb3VibGUKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2tpbmQgICAgICAgICAgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbmVzdF9sb2NrX2tpbmQgICAgID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2tpbmQgICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfa2luZCAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3NpemVfdF9raW5kICAgICAgICA9IGNfc2l6ZV90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfYWZmaW5pdHlfbWFza19raW5kID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9raW5kICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfa2luZCAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICBtb2R1bGUgb21wX2xpYgorCisgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IG9wZW5tcF92ZXJzaW9uICAgID0gQExJQk9NUF9PTVBfWUVBUl9NT05USEAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gQExJQk9NUF9WRVJTSU9OX01BSk9SQAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSBATElCT01QX1ZFUlNJT05fTUlOT1JACisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9idWlsZCA9IEBMSUJPTVBfVkVSU0lPTl9CVUlMREAKKyAgICAgICAgY2hhcmFjdGVyKCopICAgICAgICAgICAgICAga21wX2J1aWxkX2RhdGUKKyAgICAgICAgcGFyYW1ldGVyKCBrbXBfYnVpbGRfZGF0ZSA9ICdATElCT01QX0JVSUxEX0RBVEVAJyApCisKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9zdGF0aWMgID0gMQorICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2R5bmFtaWMgPSAyCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZ3VpZGVkICA9IDMKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9hdXRvICAgID0gNAorCisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9mYWxzZSA9IDAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF90cnVlID0gMQorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX21hc3RlciA9IDIKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9jbG9zZSA9IDMKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9zcHJlYWQgPSA0CisKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9wYXJhbGxlbCA9IDEKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9sb29wID0gMgorICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3NlY3Rpb25zID0gMworICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3Rhc2tncm91cCA9IDQKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X25vbmUgICAgICAgICAgID0gMAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X3VuY29udGVuZGVkICAgID0gMQorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X2NvbnRlbmRlZCAgICAgID0gMgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X25vbnNwZWN1bGF0aXZlID0gNAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X3NwZWN1bGF0aXZlICAgID0gOAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfbG9ja19oaW50X2hsZSAgICAgICAgICAgID0gNjU1MzYKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2xvY2tfaGludF9ydG0gICAgICAgICAgICA9IDEzMTA3MgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfbG9ja19oaW50X2FkYXB0aXZlICAgICAgID0gMjYyMTQ0CisKKyAgICAgICAgaW50ZXJmYWNlCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKiogb21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMobnVtX3RocmVhZHMpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBudW1fdGhyZWFkcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljKGR5bmFtaWNfdGhyZWFkcykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCksIHZhbHVlIDo6IGR5bmFtaWNfdGhyZWFkcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZChuZXN0ZWQpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpLCB2YWx1ZSA6OiBuZXN0ZWQKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9wcm9jcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX3BhcmFsbGVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2luX2ZpbmFsKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX2ZpbmFsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9maW5hbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9keW5hbWljKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9keW5hbWljCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X25lc3RlZAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9saW1pdAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdAorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKG1heF9sZXZlbHMpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtYXhfbGV2ZWxzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9sZXZlbCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKGxldmVsKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUobGV2ZWwpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9zaXplCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlKGtpbmQsIGNodW5rX3NpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSwgdmFsdWUgOjoga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogY2h1bmtfc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZShraW5kLCBjaHVua19zaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBjaHVua19zaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9wcm9jX2JpbmQoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpIG9tcF9nZXRfcHJvY19iaW5kCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfcHJvY19iaW5kCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9wbGFjZXMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9wbGFjZXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcGxhY2VzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3BsYWNlX251bV9wcm9jcyhwbGFjZV9udW0pIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwbGFjZV9udW0KKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9wbGFjZV9udW1fcHJvY3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9wbGFjZV9udW1fcHJvY3MKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9wbGFjZV9wcm9jX2lkcyhwbGFjZV9udW0sIGlkcykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHBsYWNlX251bQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBpZHMoKikKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZ2V0X3BsYWNlX3Byb2NfaWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3BsYWNlX251bSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfcGxhY2VfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfcGxhY2VfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3BhcnRpdGlvbl9udW1fcGxhY2VzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9wYXJ0aXRpb25fbnVtX3BsYWNlcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3BhcnRpdGlvbl9udW1fcGxhY2VzCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9nZXRfcGFydGl0aW9uX3BsYWNlX251bXMocGxhY2VfbnVtcykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkgcGxhY2VfbnVtcygqKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9nZXRfcGFydGl0aW9uX3BsYWNlX251bXMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgcmVhbCAoa2luZD1rbXBfZG91YmxlX2tpbmQpIG9tcF9nZXRfd3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGltZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGljaygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICByZWFsIChraW5kPWttcF9kb3VibGVfa2luZCkgb21wX2dldF93dGljaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9kZWZhdWx0X2RldmljZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UoZGV2aWNlX251bSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGRldmljZV9udW0KKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fZGV2aWNlcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90ZWFtcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RlYW1zCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RlYW1zCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2NhbmNlbGxhdGlvbigpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfY2FuY2VsbGF0aW9uCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfY2FuY2VsbGF0aW9uCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2lzX2luaXRpYWxfZGV2aWNlCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2luaXRpYWxfZGV2aWNlKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9pbml0aWFsX2RldmljZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2luaXRpYWxfZGV2aWNlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2soc3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2soc3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2Rlc3Ryb3lfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jayhzdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfc2V0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBzdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrKHN2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrKHN2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF90ZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfdGVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sobnZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBudmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jayhudmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sobnZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3NldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrKG52YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sobnZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Rlc3RfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX3Rlc3RfbmVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbnZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF90YXNrX3ByaW9yaXR5CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBrbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUoc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zKHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lKG1zZWMpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtc2VjCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbCgpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeShsaWJudW0pIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsaWJudW0KKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cyhzdHJpbmcpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSwgaW50cmluc2ljIDo6IGlzb19jX2JpbmRpbmcKKyAgICAgICAgICAgIGNoYXJhY3RlciAoa2luZD1jX2NoYXIpIDo6IHN0cmluZygqKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5KCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9saWJyYXJ5CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Rpc3BfbnVtX2J1ZmZlcnMobnVtKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbnVtCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9kaXNwX251bV9idWZmZXJzCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5KG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHkKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5KG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHkKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayhtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sobWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9tYWxsb2Moc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9tYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9hbGlnbmVkX21hbGxvYyhzaXplLCBhbGlnbm1lbnQpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9hbGlnbmVkX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IGFsaWdubWVudAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfYWxpZ25lZF9tYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9jYWxsb2MobmVsZW0sIGVsc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2NhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBuZWxlbQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBlbHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2NhbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3JlYWxsb2MocHRyLCBzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfcmVhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSwgdmFsdWUgOjogcHRyCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3JlYWxsb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2ZyZWUocHRyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSwgdmFsdWUgOjogcHRyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2ZyZWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbigpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMoY2FuY2Vsa2luZCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgdmFsdWUgOjogY2FuY2Vsa2luZAorICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2tfd2l0aF9oaW50KHN2YXIsIGhpbnQpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgdmFsdWUgOjogaGludAorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2tfd2l0aF9oaW50CisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQobnZhciwgaGludCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBudmFyCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHZhbHVlIDo6IGhpbnQKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50CisKKyAgICAgICAgZW5kIGludGVyZmFjZQorCisgICAgICBlbmQgbW9kdWxlIG9tcF9saWIKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNTAvb21wX2xpYi5oLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNTAvb21wX2xpYi5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjMzMjUxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS81MC9vbXBfbGliLmgudmFyCkBAIC0wLDAgKzEsNjQ0IEBACishIGluY2x1ZGUvNTAvb21wX2xpYi5oLnZhcgorCishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKyEqKioKKyEqKiogU29tZSBvZiB0aGUgZGlyZWN0aXZlcyBmb3IgdGhlIGZvbGxvd2luZyByb3V0aW5lIGV4dGVuZCBwYXN0IGNvbHVtbiA3MiwKKyEqKiogc28gcHJvY2VzcyB0aGlzIGZpbGUgaW4gMTMyLWNvbHVtbiBtb2RlLgorISoqKgorCishRElSJCBmaXhlZGZvcm1saW5lc2l6ZToxMzIKKworICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9pbnRlZ2VyX2tpbmQgICAgICAgPSA0CisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvZ2ljYWxfa2luZCAgICAgICA9IDQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcmVhbF9raW5kICAgICAgICAgID0gNAorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2tpbmQgICAgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9uZXN0X2xvY2tfa2luZCAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9raW5kICAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9raW5kICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfYWZmaW5pdHlfbWFza19raW5kID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X2tpbmQgICAgID0gb21wX2ludGVnZXJfa2luZAorCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjogb3Blbm1wX3ZlcnNpb24gICAgPSBATElCT01QX09NUF9ZRUFSX01PTlRIQAorICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gQExJQk9NUF9WRVJTSU9OX01BSk9SQAorICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21pbm9yID0gQExJQk9NUF9WRVJTSU9OX01JTk9SQAorICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX2J1aWxkID0gQExJQk9NUF9WRVJTSU9OX0JVSUxEQAorICAgICAgY2hhcmFjdGVyKCopICAgICAgICAgICAgICAga21wX2J1aWxkX2RhdGUKKyAgICAgIHBhcmFtZXRlcigga21wX2J1aWxkX2RhdGUgPSAnQExJQk9NUF9CVUlMRF9EQVRFQCcgKQorCisgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX3N0YXRpYyAgPSAxCisgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2R5bmFtaWMgPSAyCisgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2d1aWRlZCAgPSAzCisgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2F1dG8gICAgPSA0CisKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfZmFsc2UgPSAwCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3RydWUgPSAxCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX21hc3RlciA9IDIKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfY2xvc2UgPSAzCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3NwcmVhZCA9IDQKKworICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfaGludF9ub25lICAgICAgICAgICA9IDAKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfdW5jb250ZW5kZWQgICAgPSAxCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X2NvbnRlbmRlZCAgICAgID0gMgorICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfaGludF9ub25zcGVjdWxhdGl2ZSA9IDQKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfc3BlY3VsYXRpdmUgICAgPSA4CisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfbG9ja19oaW50X2hsZSAgICAgICAgICAgID0gNjU1MzYKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9sb2NrX2hpbnRfcnRtICAgICAgICAgICAgPSAxMzEwNzIKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9sb2NrX2hpbnRfYWRhcHRpdmUgICAgICAgPSAyNjIxNDQKKworICAgICAgaW50ZXJmYWNlCisKKyEgICAgICAgKioqCishICAgICAgICoqKiBvbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgKioqCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzKG51bV90aHJlYWRzKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbnVtX3RocmVhZHMKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljKGR5bmFtaWNfdGhyZWFkcykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCksIHZhbHVlIDo6IGR5bmFtaWNfdGhyZWFkcworICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkKG5lc3RlZCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCksIHZhbHVlIDo6IG5lc3RlZAorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X3RocmVhZHMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0oKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fcHJvY3MKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX3BhcmFsbGVsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwKKworICAgICAgICBmdW5jdGlvbiBvbXBfaW5fZmluYWwoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fZmluYWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9maW5hbAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfZHluYW1pYworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9keW5hbWljCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X25lc3RlZAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdCgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdAorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyhtYXhfbGV2ZWxzKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbWF4X2xldmVscworICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9sZXZlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9sZXZlbAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hY3RpdmVfbGV2ZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKGxldmVsKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsZXZlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUobGV2ZWwpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9zaXplCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGV2ZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlKGtpbmQsIGNodW5rX3NpemUpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSwgdmFsdWUgOjoga2luZAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGNodW5rX3NpemUKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZQorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZShraW5kLCBjaHVua19zaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgY2h1bmtfc2l6ZQorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9wcm9jX2JpbmQoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpIG9tcF9nZXRfcHJvY19iaW5kCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3Byb2NfYmluZAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3BsYWNlcygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3BsYWNlcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcGxhY2VzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9wbGFjZV9udW1fcHJvY3MocGxhY2VfbnVtKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcGxhY2VfbnVtCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3BsYWNlX251bV9wcm9jcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9wbGFjZV9udW1fcHJvY3MKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9nZXRfcGxhY2VfcHJvY19pZHMocGxhY2VfbnVtLCBpZHMpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwbGFjZV9udW0KKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGlkcygqKQorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZ2V0X3BsYWNlX3Byb2NfaWRzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9wbGFjZV9udW0oKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3BsYWNlX251bQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9wbGFjZV9udW0KKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3BhcnRpdGlvbl9udW1fcGxhY2VzKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9wYXJ0aXRpb25fbnVtX3BsYWNlcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9wYXJ0aXRpb25fbnVtX3BsYWNlcworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9wYXJ0aXRpb25fcGxhY2VfbnVtcyhwbGFjZV9udW1zKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwbGFjZV9udW1zKCopCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9nZXRfcGFydGl0aW9uX3BsYWNlX251bXMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lKCkgYmluZChjKQorICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGltZQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGltZQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2soKSBiaW5kKGMpCisgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aWNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9kZWZhdWx0X2RldmljZSgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UoZGV2aWNlX251bSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGRldmljZV9udW0KKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9kZWZhdWx0X2RldmljZQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX2RldmljZXMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9kZXZpY2VzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90ZWFtcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX251bQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX251bQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9pc19pbml0aWFsX2RldmljZSgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pc19pbml0aWFsX2RldmljZQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2lzX2luaXRpYWxfZGV2aWNlCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9pbml0aWFsX2RldmljZSgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfaW5pdGlhbF9kZXZpY2UKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfaW5pdGlhbF9kZXZpY2UKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2soc3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jayhzdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfZGVzdHJveV9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2xvY2soc3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3NldF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrKHN2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jaworCisgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2soc3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Rlc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF90ZXN0X2xvY2sKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jayhudmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sobnZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBudmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sobnZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3NldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sobnZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbnZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrKG52YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF90ZXN0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF90ZXN0X25lc3RfbG9jaworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBudmFyCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF90YXNrX3ByaW9yaXR5KCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfdGFza19wcmlvcml0eQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfdGFza19wcmlvcml0eQorCishICAgICAgICoqKgorISAgICAgICAqKioga21wXyogZW50cnkgcG9pbnRzCishICAgICAgICoqKgorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUoc2l6ZSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3Moc2l6ZSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZShtc2VjKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbXNlYworICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbCgpIGJpbmQoYykKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbAorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQoKSBiaW5kKGMpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCgpIGJpbmQoYykKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeShsaWJudW0pIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsaWJudW0KKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5CisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzKHN0cmluZykgYmluZChjKQorICAgICAgICAgIGNoYXJhY3RlciBzdHJpbmcoKikKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cworCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkga21wX2dldF9zdGFja3NpemVfcworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcworCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9ibG9ja3RpbWUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5KCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9saWJyYXJ5CisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGlzcF9udW1fYnVmZmVycyhudW0pIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBudW0KKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9kaXNwX251bV9idWZmZXJzCisKKyAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eShtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5CisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eShtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5CisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayhtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworCisgICAgICAgIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayhtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKworICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfbWFsbG9jKHNpemUpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9tYWxsb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9tYWxsb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfYWxpZ25lZF9tYWxsb2Moc2l6ZSwgYWxpZ25tZW50KSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfYWxpZ25lZF9tYWxsb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IGFsaWdubWVudAorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2FsaWduZWRfbWFsbG9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2NhbGxvYyhuZWxlbSwgZWxzaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfY2FsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBuZWxlbQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogZWxzaXplCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfY2FsbG9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX3JlYWxsb2MocHRyLCBzaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfcmVhbGxvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCksIHZhbHVlIDo6IHB0cgorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3JlYWxsb2MKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9mcmVlKHB0cikgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCksIHZhbHVlIDo6IHB0cgorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZnJlZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbigpIGJpbmQoYykKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbgorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYoKSBiaW5kKGMpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrX3dpdGhfaGludChzdmFyLCBoaW50KSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBzdmFyCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCB2YWx1ZSA6OiBoaW50CisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2tfd2l0aF9oaW50CisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50KG52YXIsIGhpbnQpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbnZhcgorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgdmFsdWUgOjogaGludAorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50CisKKyAgICAgIGVuZCBpbnRlcmZhY2UKKworIURJUiQgSUYgREVGSU5FRCAoX19JTlRFTF9PRkZMT0FEKQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X251bV90aHJlYWRzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfZHluYW1pYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X25lc3RlZAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X251bV90aHJlYWRzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbWF4X3RocmVhZHMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF90aHJlYWRfbnVtCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbnVtX3Byb2NzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9pbl9wYXJhbGxlbAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaW5fZmluYWwKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9keW5hbWljCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbmVzdGVkCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfdGhyZWFkX2xpbWl0CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X2xldmVsCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfYWN0aXZlX2xldmVsCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3RlYW1fc2l6ZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X3NjaGVkdWxlCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfc2NoZWR1bGUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9wcm9jX2JpbmQKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF93dGltZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3d0aWNrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9kZWZhdWx0X2RldmljZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9udW1fZGV2aWNlcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X251bV90ZWFtcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3RlYW1fbnVtCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9pbml0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2Rlc3Ryb3lfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3Vuc2V0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3Rlc3RfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3Rlc3RfbmVzdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9zdGFja3NpemUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9zdGFja3NpemVfcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2Jsb2NrdGltZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfbGlicmFyeQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2RlZmF1bHRzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfc3RhY2tzaXplCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfc3RhY2tzaXplX3MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9ibG9ja3RpbWUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9saWJyYXJ5CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfZGlzcF9udW1fYnVmZmVycworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2FmZmluaXR5CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfYWZmaW5pdHkKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9tYWxsb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2FsaWduZWRfbWFsbG9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9jYWxsb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3JlYWxsb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2ZyZWUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF93YXJuaW5nc19vbgorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X3dhcm5pbmdzX29mZgorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaW5pdF9sb2NrX3dpdGhfaGludAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50CisKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfbnVtX3RocmVhZHMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9keW5hbWljICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfbmVzdGVkICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbnVtX3RocmVhZHMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9tYXhfdGhyZWFkcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3RocmVhZF9udW0gKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9udW1fcHJvY3MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2luX3BhcmFsbGVsICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pbl9maW5hbCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X2R5bmFtaWMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9uZXN0ZWQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF90aHJlYWRfbGltaXQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9tYXhfYWN0aXZlX2xldmVscyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbGV2ZWwgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9hY3RpdmVfbGV2ZWwgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfdGVhbV9zaXplICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfc2NoZWR1bGUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9zY2hlZHVsZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3Byb2NfYmluZCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3d0aW1lICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfd3RpY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9kZWZhdWx0X2RldmljZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X2RlZmF1bHRfZGV2aWNlICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pc19pbml0aWFsX2RldmljZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X251bV9kZXZpY2VzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbnVtX3RlYW1zICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfdGVhbV9udW0gKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2luaXRfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZGVzdHJveV9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfdW5zZXRfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfdGVzdF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pbml0X25lc3RfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZGVzdHJveV9uZXN0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9uZXN0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3Vuc2V0X25lc3RfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfdGVzdF9uZXN0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9tYXhfdGFza19wcmlvcml0eSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X3N0YWNrc2l6ZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X3N0YWNrc2l6ZV9zICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfYmxvY2t0aW1lICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfbGlicmFyeV9zZXJpYWwgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9saWJyYXJ5ICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfZGVmYXVsdHMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9zdGFja3NpemUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9zdGFja3NpemVfcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X2Jsb2NrdGltZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X2xpYnJhcnkgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9kaXNwX251bV9idWZmZXJzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfYWZmaW5pdHkgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9hZmZpbml0eSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX21hbGxvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfYWxpZ25lZF9tYWxsb2MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2NhbGxvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfcmVhbGxvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZnJlZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X3dhcm5pbmdzX29uICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfd2FybmluZ3Nfb2ZmICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pbml0X2xvY2tfd2l0aF9oaW50ICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQgKQorIURJUiQgRU5ESUYKKyFESVIkIEVORElGCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNTAvb21wdC5oLnZhciBiL2ZpbmFsL3J1bnRpbWUvc3JjL2luY2x1ZGUvNTAvb21wdC5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWE2NDJlCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvaW5jbHVkZS81MC9vbXB0LmgudmFyCkBAIC0wLDAgKzEsNTE1IEBACisvKgorICogaW5jbHVkZS81MC9vbXB0LmgudmFyCisgKi8KKworI2lmbmRlZiBfX09NUFRfXworI2RlZmluZSBfX09NUFRfXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHN5c3RlbSBpbmNsdWRlIGZpbGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaXRlcmF0aW9uIG1hY3JvcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEZPUkVBQ0hfT01QVF9JTlFVSVJZX0ZOKG1hY3JvKSAgXAorICAgIG1hY3JvIChvbXB0X2VudW1lcmF0ZV9zdGF0ZSkgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc2V0X2NhbGxiYWNrKSAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF9jYWxsYmFjaykgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X2lkbGVfZnJhbWUpICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF90YXNrX2ZyYW1lKSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3N0YXRlKSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfcGFyYWxsZWxfaWQpICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3BhcmFsbGVsX3RlYW1fc2l6ZSkgXAorICAgIG1hY3JvIChvbXB0X2dldF90YXNrX2lkKSAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfdGhyZWFkX2lkKQorCisjZGVmaW5lIEZPUkVBQ0hfT01QVF9QTEFDRUhPTERFUl9GTihtYWNybykgIFwKKyAgICBtYWNybyAob21wdF9pZGxlKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X292ZXJoZWFkKSAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfYmFycmllcl93YWl0KSAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF90YXNrX3dhaXQpICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X211dGV4X3dhaXQpCisKKyNkZWZpbmUgRk9SRUFDSF9PTVBUX1NUQVRFKG1hY3JvKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBmaXJzdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV9maXJzdCwgMHg3MSkgICAgICAgICAgLyogaW5pdGlhbCBlbnVtZXJhdGlvbiBzdGF0ZSAqLyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiB3b3JrIHN0YXRlcyAoMC4uMTUpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93b3JrX3NlcmlhbCwgMHgwMCkgICAgLyogd29ya2luZyBvdXRzaWRlIHBhcmFsbGVsICovICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93b3JrX3BhcmFsbGVsLCAweDAxKSAgLyogd29ya2luZyB3aXRoaW4gcGFyYWxsZWwgKi8gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93b3JrX3JlZHVjdGlvbiwgMHgwMikgLyogcGVyZm9ybWluZyBhIHJlZHVjdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBpZGxlICgxNi4uMzEpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV9pZGxlLCAweDEwKSAgICAgICAgICAgIC8qIHdhaXRpbmcgZm9yIHdvcmsgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBvdmVyaGVhZCBzdGF0ZXMgKDMyLi42MykgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV9vdmVyaGVhZCwgMHgyMCkgICAgICAgIC8qIG92ZXJoZWFkIGV4Y2x1ZGluZyB3YWl0IHN0YXRlcyAqLyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBiYXJyaWVyIHdhaXQgc3RhdGVzICg2NC4uNzkpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2JhcnJpZXIsIDB4NDApICAgIC8qIHdhaXRpbmcgYXQgYSBiYXJyaWVyICovICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2JhcnJpZXJfaW1wbGljaXQsIDB4NDEpICAgIC8qIGltcGxpY2l0IGJhcnJpZXIgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2JhcnJpZXJfZXhwbGljaXQsIDB4NDIpICAgIC8qIGV4cGxpY2l0IGJhcnJpZXIgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiB0YXNrIHdhaXQgc3RhdGVzICg4MC4uOTUpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X3Rhc2t3YWl0LCAweDUwKSAgIC8qIHdhaXRpbmcgYXQgYSB0YXNrd2FpdCAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X3Rhc2tncm91cCwgMHg1MSkgIC8qIHdhaXRpbmcgYXQgYSB0YXNrZ3JvdXAgKi8gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBtdXRleCB3YWl0IHN0YXRlcyAoOTYuLjExMSkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2xvY2ssIDB4NjApICAgICAgIC8qIHdhaXRpbmcgZm9yIGxvY2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X25lc3RfbG9jaywgMHg2MSkgIC8qIHdhaXRpbmcgZm9yIG5lc3QgbG9jayAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2NyaXRpY2FsLCAweDYyKSAgIC8qIHdhaXRpbmcgZm9yIGNyaXRpY2FsICovICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2F0b21pYywgMHg2MykgICAgIC8qIHdhaXRpbmcgZm9yIGF0b21pYyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X29yZGVyZWQsIDB4NjQpICAgIC8qIHdhaXRpbmcgZm9yIG9yZGVyZWQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X3NpbmdsZSwgMHg2RikgICAgIC8qIHdhaXRpbmcgZm9yIHNpbmdsZSByZWdpb24gKG5vbi1zdGFuZGFyZCEpICovICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBtaXNjICgxMTIuLjEyNykgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV91bmRlZmluZWQsIDB4NzApICAgICAgIC8qIHVuZGVmaW5lZCB0aHJlYWQgc3RhdGUgKi8KKworCisjZGVmaW5lIEZPUkVBQ0hfT01QVF9FVkVOVChtYWNybykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKi0tLSBNYW5kYXRvcnkgRXZlbnRzIC0tLSovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcGFyYWxsZWxfYmVnaW4sICAgICAgICAgICBvbXB0X25ld19wYXJhbGxlbF9jYWxsYmFja190LCAgIDEpIC8qIHBhcmFsbGVsIGJlZ2luICovICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZCwgICAgICAgICAgICAgb21wdF9lbmRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAyKSAvKiBwYXJhbGxlbCBlbmQgKi8gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza19iZWdpbiwgICAgICAgICAgICAgICBvbXB0X25ld190YXNrX2NhbGxiYWNrX3QsICAgICAgIDMpIC8qIHRhc2sgYmVnaW4gKi8gICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2tfZW5kLCAgICAgICAgICAgICAgICAgb21wdF90YXNrX2NhbGxiYWNrX3QsICAgICAgICAgICA0KSAvKiB0YXNrIGRlc3Ryb3kgKi8gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGhyZWFkX2JlZ2luLCAgICAgICAgICAgICBvbXB0X3RocmVhZF90eXBlX2NhbGxiYWNrX3QsICAgIDUpIC8qIHRocmVhZCBiZWdpbiAqLyAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3RocmVhZF9lbmQsICAgICAgICAgICAgICAgb21wdF90aHJlYWRfdHlwZV9jYWxsYmFja190LCAgICA2KSAvKiB0aHJlYWQgZW5kICovICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfY29udHJvbCwgICAgICAgICAgICAgICAgICBvbXB0X2NvbnRyb2xfY2FsbGJhY2tfdCwgICAgICAgIDcpIC8qIHN1cHBvcnQgY29udHJvbCBjYWxscyAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9ydW50aW1lX3NodXRkb3duLCAgICAgICAgIG9tcHRfY2FsbGJhY2tfdCwgICAgICAgICAgICAgICAgOCkgLyogcnVudGltZSBzaHV0ZG93biAqLyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qLS0tIE9wdGlvbmFsIEV2ZW50cyAoYmxhbWUgc2hpZnRpbmcsIG9tcHRfZXZlbnRfdW5pbXBsZW1lbnRlZCkgLS0tKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pZGxlX2JlZ2luLCAgICAgICAgICAgICAgIG9tcHRfdGhyZWFkX2NhbGxiYWNrX3QsICAgICAgICAgOSkgLyogYmVnaW4gaWRsZSBzdGF0ZSAqLyAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaWRsZV9lbmQsICAgICAgICAgICAgICAgICBvbXB0X3RocmVhZF9jYWxsYmFja190LCAgICAgICAgMTApIC8qIGVuZCBpZGxlIHN0YXRlICovICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X2JhcnJpZXJfYmVnaW4sICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxMSkgLyogYmVnaW4gd2FpdCBhdCBiYXJyaWVyICovICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9iYXJyaWVyX2VuZCwgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTIpIC8qIGVuZCB3YWl0IGF0IGJhcnJpZXIgKi8gICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X3Rhc2t3YWl0X2JlZ2luLCAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxMykgLyogYmVnaW4gd2FpdCBhdCB0YXNrd2FpdCAqLyBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF90YXNrd2FpdF9lbmQsICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTQpIC8qIGVuZCB3YWl0IGF0IHRhc2t3YWl0ICovICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X3Rhc2tncm91cF9iZWdpbiwgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxNSkgLyogYmVnaW4gd2FpdCBhdCB0YXNrZ3JvdXAgKi9cCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF90YXNrZ3JvdXBfZW5kLCAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTYpIC8qIGVuZCB3YWl0IGF0IHRhc2tncm91cCAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX2xvY2ssICAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICAxNykgLyogbG9jayByZWxlYXNlICovICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9uZXN0X2xvY2tfbGFzdCwgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgMTgpIC8qIGxhc3QgbmVzdCBsb2NrIHJlbGVhc2UgKi8gXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2VfY3JpdGljYWwsICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDE5KSAvKiBjcml0aWNhbCByZWxlYXNlICovICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9hdG9taWMsICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgMjApIC8qIGF0b21pYyByZWxlYXNlICovICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX29yZGVyZWQsICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICAyMSkgLyogb3JkZXJlZCByZWxlYXNlICovICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qLS0tIE9wdGlvbmFsIEV2ZW50cyAoc3luY2hyb25vdXMgZXZlbnRzLCBvbXB0X2V2ZW50X3VuaW1wbGVtZW50ZWQpIC0tLSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luLCAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyMikgLyogaW1wbGljaXQgdGFzayBiZWdpbiAgICovICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQsICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMjMpIC8qIGltcGxpY2l0IHRhc2sgZW5kICAqLyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbml0aWFsX3Rhc2tfYmVnaW4sICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyNCkgLyogaW5pdGlhbCB0YXNrIGJlZ2luICAgKi8gICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaW5pdGlhbF90YXNrX2VuZCwgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMjUpIC8qIGluaXRpYWwgdGFzayBlbmQgICovICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrX3N3aXRjaCwgICAgICAgICAgICAgIG9tcHRfdGFza19wYWlyX2NhbGxiYWNrX3QsICAgICAyNikgLyogdGFzayBzd2l0Y2ggKi8gICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2xvb3BfYmVnaW4sICAgICAgICAgICAgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDI3KSAvKiB0YXNrIGF0IGxvb3AgYmVnaW4gKi8gICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9sb29wX2VuZCwgICAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyOCkgLyogdGFzayBhdCBsb29wIGVuZCAqLyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NlY3Rpb25zX2JlZ2luLCAgICAgICAgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDI5KSAvKiB0YXNrIGF0IHNlY3Rpb25zIGJlZ2luICAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF9zZWN0aW9uc19lbmQsICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzMCkgLyogdGFzayBhdCBzZWN0aW9ucyBlbmQgKi8gICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NpbmdsZV9pbl9ibG9ja19iZWdpbiwgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDMxKSAvKiB0YXNrIGF0IHNpbmdsZSBiZWdpbiovICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9zaW5nbGVfaW5fYmxvY2tfZW5kLCAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzMikgLyogdGFzayBhdCBzaW5nbGUgZW5kICovICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NpbmdsZV9vdGhlcnNfYmVnaW4sICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDMzKSAvKiB0YXNrIGF0IHNpbmdsZSBiZWdpbiAqLyAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9zaW5nbGVfb3RoZXJzX2VuZCwgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzNCkgLyogdGFzayBhdCBzaW5nbGUgZW5kICovICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dvcmtzaGFyZV9iZWdpbiwgICAgICAgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDM1KSAvKiB0YXNrIGF0IHdvcmtzaGFyZSBiZWdpbiAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF93b3Jrc2hhcmVfZW5kLCAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzNikgLyogdGFzayBhdCB3b3Jrc2hhcmUgZW5kICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X21hc3Rlcl9iZWdpbiwgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDM3KSAvKiB0YXNrIGF0IG1hc3RlciBiZWdpbiAqLyAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9tYXN0ZXJfZW5kLCAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzOCkgLyogdGFzayBhdCBtYXN0ZXIgZW5kICovICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW4sICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDM5KSAvKiB0YXNrIGF0IGJhcnJpZXIgYmVnaW4gICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9iYXJyaWVyX2VuZCwgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICA0MCkgLyogdGFzayBhdCBiYXJyaWVyIGVuZCAqLyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2t3YWl0X2JlZ2luLCAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDQxKSAvKiB0YXNrIGF0IHRhc2t3YWl0IGJlZ2luICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrd2FpdF9lbmQsICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICA0MikgLyogdGFzayBhdCB0YXNrIHdhaXQgZW5kICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2tncm91cF9iZWdpbiwgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDQzKSAvKiB0YXNrIGF0IHRhc2tncm91cCBiZWdpbiAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrZ3JvdXBfZW5kLCAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICA0NCkgLyogdGFzayBhdCB0YXNrZ3JvdXAgZW5kICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2VfbmVzdF9sb2NrX3ByZXYsICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDQ1KSAvKiBwcmV2IG5lc3QgbG9jayByZWxlYXNlICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9sb2NrLCAgICAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNDYpIC8qIGxvY2sgd2FpdCAqLyAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfbmVzdF9sb2NrLCAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDQ3KSAvKiBuZXN0IGxvY2sgd2FpdCAqLyAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X2NyaXRpY2FsLCAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA0OCkgLyogY3JpdGljYWwgd2FpdCAqLyAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9hdG9taWMsICAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNDkpIC8qIGF0b21pYyB3YWl0ICovICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfb3JkZXJlZCwgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDUwKSAvKiBvcmRlcmVkIHdhaXQgKi8gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfbG9jaywgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTEpIC8qIGxvY2sgYWNxdWlyZWQgKi8gICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX25lc3RfbG9ja19maXJzdCwgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDUyKSAvKiAxc3QgbmVzdCBsb2NrIGFjcXVpcmVkICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9uZXN0X2xvY2tfbmV4dCwgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1MykgLyogbmV4dCBuZXN0IGxvY2sgYWNxdWlyZWQqLyBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfY3JpdGljYWwsICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTQpIC8qIGNyaXRpY2FsIGFjcXVpcmVkICovICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX2F0b21pYywgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU1KSAvKiBhdG9taWMgYWNxdWlyZWQgKi8gICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9vcmRlcmVkLCAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1NikgLyogb3JkZXJlZCBhY3F1aXJlZCAqLyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2luaXRfbG9jaywgICAgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU3KSAvKiBsb2NrIGluaXQgKi8gICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbml0X25lc3RfbG9jaywgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1OCkgLyogbmVzdCBsb2NrIGluaXQgKi8gICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2Rlc3Ryb3lfbG9jaywgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU5KSAvKiBsb2NrIGRlc3RydWN0aW9uICovICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9kZXN0cm95X25lc3RfbG9jaywgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA2MCkgLyogbmVzdCBsb2NrIGRlc3RydWN0aW9uICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2ZsdXNoLCAgICAgICAgICAgICAgICAgICAgb21wdF9jYWxsYmFja190LCAgICAgICAgICAgICAgIDYxKSAvKiBhZnRlciBleGVjdXRpbmcgZmx1c2ggKi8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza19kZXBlbmRlbmNlcywgICAgICAgICBvbXB0X3Rhc2tfZGVwZW5kZW5jZXNfY2FsbGJhY2tfdCwgNjkpIC8qIHJlcG9ydCB0YXNrIGRlcGVuZGVuY2VzICAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrX2RlcGVuZGVuY2VfcGFpciwgICAgIG9tcHRfdGFza19wYWlyX2NhbGxiYWNrX3QsICAgICA3MCkgLyogcmVwb3J0IHRhc2sgZGVwZW5kZW5jZSBwYWlyICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGRhdGEgdHlwZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGlkZW50aWZpZXJzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgdWludDY0X3Qgb21wdF90aHJlYWRfaWRfdDsKKyNkZWZpbmUgb21wdF90aHJlYWRfaWRfbm9uZSAoKG9tcHRfdGhyZWFkX2lkX3QpIDApICAgICAvKiBub24tc3RhbmRhcmQgKi8KKwordHlwZWRlZiB1aW50NjRfdCBvbXB0X3Rhc2tfaWRfdDsKKyNkZWZpbmUgb21wdF90YXNrX2lkX25vbmUgKChvbXB0X3Rhc2tfaWRfdCkgMCkgICAgICAgICAvKiBub24tc3RhbmRhcmQgKi8KKwordHlwZWRlZiB1aW50NjRfdCBvbXB0X3BhcmFsbGVsX2lkX3Q7CisjZGVmaW5lIG9tcHRfcGFyYWxsZWxfaWRfbm9uZSAoKG9tcHRfcGFyYWxsZWxfaWRfdCkgMCkgLyogbm9uLXN0YW5kYXJkICovCisKK3R5cGVkZWYgdWludDY0X3Qgb21wdF93YWl0X2lkX3Q7CisjZGVmaW5lIG9tcHRfd2FpdF9pZF9ub25lICgob21wdF93YWl0X2lkX3QpIDApICAgICAgICAgLyogbm9uLXN0YW5kYXJkICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIG9tcHRfZnJhbWVfdAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHN0cnVjdCBvbXB0X2ZyYW1lX3MgeworICAgIHZvaWQgKmV4aXRfcnVudGltZV9mcmFtZTsgICAgLyogbmV4dCBmcmFtZSBpcyB1c2VyIGNvZGUgICAgICovCisgICAgdm9pZCAqcmVlbnRlcl9ydW50aW1lX2ZyYW1lOyAvKiBwcmV2aW91cyBmcmFtZSBpcyB1c2VyIGNvZGUgKi8KK30gb21wdF9mcmFtZV90OworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBkZXBlbmRlbmNlcyB0eXBlcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIGVudW0gb21wdF90YXNrX2RlcGVuZGVuY2VfZmxhZ19lIHsKKyAgICAvLyBhIHR3byBiaXQgZmllbGQgZm9yIHRoZSBkZXBlbmRlbmNlIHR5cGUKKyAgICBvbXB0X3Rhc2tfZGVwZW5kZW5jZV90eXBlX291dCAgID0gMSwKKyAgICBvbXB0X3Rhc2tfZGVwZW5kZW5jZV90eXBlX2luICAgID0gMiwKKyAgICBvbXB0X3Rhc2tfZGVwZW5kZW5jZV90eXBlX2lub3V0ID0gMywKK30gb21wdF90YXNrX2RlcGVuZGVuY2VfZmxhZ190OworCit0eXBlZGVmIHN0cnVjdCBvbXB0X3Rhc2tfZGVwZW5kZW5jZV9zIHsKKyAgICB2b2lkICp2YXJpYWJsZV9hZGRyOworICAgIHVpbnQzMl90ICBkZXBlbmRlbmNlX2ZsYWdzOworfSBvbXB0X3Rhc2tfZGVwZW5kZW5jZV90OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZW51bWVyYXRpb25zIGZvciB0aHJlYWQgc3RhdGVzIGFuZCBydW50aW1lIGV2ZW50cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcnVudGltZSBzdGF0ZXMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBlbnVtIHsKKyNkZWZpbmUgb21wdF9zdGF0ZV9tYWNybyhzdGF0ZSwgY29kZSkgc3RhdGUgPSBjb2RlLAorICAgIEZPUkVBQ0hfT01QVF9TVEFURShvbXB0X3N0YXRlX21hY3JvKQorI3VuZGVmIG9tcHRfc3RhdGVfbWFjcm8KK30gb21wdF9zdGF0ZV90OworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBydW50aW1lIGV2ZW50cworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIGVudW0geworI2RlZmluZSBvbXB0X2V2ZW50X21hY3JvKGV2ZW50LCBjYWxsYmFjaywgZXZlbnRpZCkgZXZlbnQgPSBldmVudGlkLAorICAgIEZPUkVBQ0hfT01QVF9FVkVOVChvbXB0X2V2ZW50X21hY3JvKQorI3VuZGVmIG9tcHRfZXZlbnRfbWFjcm8KK30gb21wdF9ldmVudF90OworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBzZXQgY2FsbGJhY2sgcmVzdWx0cworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtIHsKKyAgICBvbXB0X3NldF9yZXN1bHRfcmVnaXN0cmF0aW9uX2Vycm9yICAgICAgICAgICAgICA9IDAsCisgICAgb21wdF9zZXRfcmVzdWx0X2V2ZW50X21heV9vY2N1cl9ub19jYWxsYmFjayAgICAgPSAxLAorICAgIG9tcHRfc2V0X3Jlc3VsdF9ldmVudF9uZXZlcl9vY2N1cnMgICAgICAgICAgICAgID0gMiwKKyAgICBvbXB0X3NldF9yZXN1bHRfZXZlbnRfbWF5X29jY3VyX2NhbGxiYWNrX3NvbWUgICA9IDMsCisgICAgb21wdF9zZXRfcmVzdWx0X2V2ZW50X21heV9vY2N1cl9jYWxsYmFja19hbHdheXMgPSA0LAorfSBvbXB0X3NldF9yZXN1bHRfdDsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY2FsbGJhY2sgc2lnbmF0dXJlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBpbml0aWFsaXphdGlvbiAqLwordHlwZWRlZiB2b2lkICgqb21wdF9pbnRlcmZhY2VfZm5fdCkodm9pZCk7CisKK3R5cGVkZWYgb21wdF9pbnRlcmZhY2VfZm5fdCAoKm9tcHRfZnVuY3Rpb25fbG9va3VwX3QpKAorICAgIGNvbnN0IGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICAvKiBlbnRyeSBwb2ludCB0byBsb29rIHVwICAgICAgICovCispOworCisvKiB0aHJlYWRzICovCit0eXBlZGVmIHZvaWQgKCpvbXB0X3RocmVhZF9jYWxsYmFja190KSAoCisgICAgb21wdF90aHJlYWRfaWRfdCB0aHJlYWRfaWQgICAgICAgIC8qIElEIG9mIHRocmVhZCAgICAgICAgICAgICAgICAgKi8KKyk7CisKK3R5cGVkZWYgZW51bSB7CisgICAgb21wdF90aHJlYWRfaW5pdGlhbCA9IDEsIC8vIHN0YXJ0IHRoZSBlbnVtZXJhdGlvbiBhdCAxCisgICAgb21wdF90aHJlYWRfd29ya2VyICA9IDIsCisgICAgb21wdF90aHJlYWRfb3RoZXIgICA9IDMKK30gb21wdF90aHJlYWRfdHlwZV90OworCit0eXBlZGVmIGVudW0geworICAgIG9tcHRfaW52b2tlcl9wcm9ncmFtID0gMCwgICAgICAgICAvKiBwcm9ncmFtIGludm9rZXMgbWFzdGVyIHRhc2sgICovCisgICAgb21wdF9pbnZva2VyX3J1bnRpbWUgPSAxICAgICAgICAgIC8qIHJ1bnRpbWUgaW52b2tlcyBtYXN0ZXIgdGFzayAgKi8KK30gb21wdF9pbnZva2VyX3Q7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfdGhyZWFkX3R5cGVfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGhyZWFkX3R5cGVfdCB0aHJlYWRfdHlwZSwgICAvKiB0eXBlIG9mIHRocmVhZCAgICAgICAgICAgICAgICovCisgICAgb21wdF90aHJlYWRfaWRfdCB0aHJlYWRfaWQgICAgICAgIC8qIElEIG9mIHRocmVhZCAgICAgICAgICAgICAgICAgKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfd2FpdF9jYWxsYmFja190KSAoCisgICAgb21wdF93YWl0X2lkX3Qgd2FpdF9pZCAgICAgICAgICAgIC8qIHdhaXQgaWQgICAgICAgICAgICAgICAgICAgICAgKi8KKyk7CisKKy8qIHBhcmFsbGVsIGFuZCB3b3Jrc2hhcmVzICovCit0eXBlZGVmIHZvaWQgKCpvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsICAgIC8qIGlkIG9mIHBhcmFsbGVsIHJlZ2lvbiAgICAgICAqLworICAgIG9tcHRfdGFza19pZF90IHRhc2tfaWQgICAgICAgICAgICAgLyogaWQgb2YgdGFzayAgICAgICAgICAgICAgICAgICovCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X25ld193b3Jrc2hhcmVfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwgICAvKiBpZCBvZiBwYXJhbGxlbCByZWdpb24gICAgICAgICovCisgICAgb21wdF90YXNrX2lkX3QgcGFyZW50X3Rhc2tfaWQsICAgIC8qIGlkIG9mIHBhcmVudCB0YXNrICAgICAgICAgICAgKi8KKyAgICB2b2lkICp3b3Jrc2hhcmVfZnVuY3Rpb24gICAgICAgICAgLyogcG9pbnRlciB0byBvdXRsaW5lZCBmdW5jdGlvbiAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF9uZXdfcGFyYWxsZWxfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGFza19pZF90IHBhcmVudF90YXNrX2lkLCAgICAvKiBpZCBvZiBwYXJlbnQgdGFzayAgICAgICAgICAgICovCisgICAgb21wdF9mcmFtZV90ICpwYXJlbnRfdGFza19mcmFtZSwgIC8qIGZyYW1lIGRhdGEgb2YgcGFyZW50IHRhc2sgICAgKi8KKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsICAgLyogaWQgb2YgcGFyYWxsZWwgcmVnaW9uICAgICAgICAqLworICAgIHVpbnQzMl90IHJlcXVlc3RlZF90ZWFtX3NpemUsICAgICAvKiBudW1iZXIgb2YgdGhyZWFkcyBpbiB0ZWFtICAgICovCisgICAgdm9pZCAqcGFyYWxsZWxfZnVuY3Rpb24sICAgICAgICAgIC8qIHBvaW50ZXIgdG8gb3V0bGluZWQgZnVuY3Rpb24gKi8KKyAgICBvbXB0X2ludm9rZXJfdCBpbnZva2VyICAgICAgICAgICAgLyogd2hvIGludm9rZXMgbWFzdGVyIHRhc2s/ICAgICAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF9lbmRfcGFyYWxsZWxfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwgICAvKiBpZCBvZiBwYXJhbGxlbCByZWdpb24gICAgICAgKi8KKyAgICBvbXB0X3Rhc2tfaWRfdCB0YXNrX2lkLCAgICAgICAgICAgLyogaWQgb2YgdGFzayAgICAgICAgICAgICAgICAgICovCisgICAgb21wdF9pbnZva2VyX3QgaW52b2tlciAgICAgICAgICAgIC8qIHdobyBpbnZva2VzIG1hc3RlciB0YXNrPyAgICAqLworKTsKKworLyogdGFza3MgKi8KK3R5cGVkZWYgdm9pZCAoKm9tcHRfdGFza19jYWxsYmFja190KSAoCisgICAgb21wdF90YXNrX2lkX3QgdGFza19pZCAgICAgICAgICAgIC8qIGlkIG9mIHRhc2sgICAgICAgICAgICAgICAgICAgKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfdGFza19wYWlyX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3Rhc2tfaWRfdCBmaXJzdF90YXNrX2lkLAorICAgIG9tcHRfdGFza19pZF90IHNlY29uZF90YXNrX2lkCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X25ld190YXNrX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3Rhc2tfaWRfdCBwYXJlbnRfdGFza19pZCwgICAgLyogaWQgb2YgcGFyZW50IHRhc2sgICAgICAgICAgICAqLworICAgIG9tcHRfZnJhbWVfdCAqcGFyZW50X3Rhc2tfZnJhbWUsICAvKiBmcmFtZSBkYXRhIGZvciBwYXJlbnQgdGFzayAgICovCisgICAgb21wdF90YXNrX2lkX3QgIG5ld190YXNrX2lkLCAgICAgIC8qIGlkIG9mIGNyZWF0ZWQgdGFzayAgICAgICAgICAgKi8KKyAgICB2b2lkICp0YXNrX2Z1bmN0aW9uICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBvdXRsaW5lZCBmdW5jdGlvbiAqLworKTsKKworLyogdGFzayBkZXBlbmRlbmNlcyAqLwordHlwZWRlZiB2b2lkICgqb21wdF90YXNrX2RlcGVuZGVuY2VzX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3Rhc2tfaWRfdCB0YXNrX2lkLCAgICAgICAgICAgIC8qIElEIG9mIHRhc2sgd2l0aCBkZXBlbmRlbmNlcyAqLworICAgIGNvbnN0IG9tcHRfdGFza19kZXBlbmRlbmNlX3QgKmRlcHMsLyogdmVjdG9yIG9mIHRhc2sgZGVwZW5kZW5jZXMgICovCisgICAgaW50IG5kZXBzICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZGVwZW5kZW5jZXMgICAgICAgKi8KKyk7CisKKy8qIHByb2dyYW0gKi8KK3R5cGVkZWYgdm9pZCAoKm9tcHRfY29udHJvbF9jYWxsYmFja190KSAoCisgICAgdWludDY0X3QgY29tbWFuZCwgICAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgb2YgY29udHJvbCBjYWxsICAgICAgKi8KKyAgICB1aW50NjRfdCBtb2RpZmllciAgICAgICAgICAgICAgICAgLyogbW9kaWZpZXIgb2YgY29udHJvbCBjYWxsICAgICAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF9jYWxsYmFja190KSh2b2lkKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogb21wdCBBUEkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgT01QVF9BUElfRk5UWVBFKGZuKSBmbiMjX3QKKworI2RlZmluZSBPTVBUX0FQSV9GVU5DVElPTihyZXR1cm5fdHlwZSwgZm4sIGFyZ3MpICBcCisgICAgdHlwZWRlZiByZXR1cm5fdHlwZSAoKk9NUFRfQVBJX0ZOVFlQRShmbikpIGFyZ3MKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTlFVSVJZIEZVTkNUSU9OUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogc3RhdGUgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKG9tcHRfc3RhdGVfdCwgb21wdF9nZXRfc3RhdGUsICgKKyAgICBvbXB0X3dhaXRfaWRfdCAqb21wdF93YWl0X2lkCispKTsKKworLyogdGhyZWFkICovCitPTVBUX0FQSV9GVU5DVElPTihvbXB0X3RocmVhZF9pZF90LCBvbXB0X2dldF90aHJlYWRfaWQsICh2b2lkKSk7CisKK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQgKiwgb21wdF9nZXRfaWRsZV9mcmFtZSwgKHZvaWQpKTsKKworLyogcGFyYWxsZWwgcmVnaW9uICovCitPTVBUX0FQSV9GVU5DVElPTihvbXB0X3BhcmFsbGVsX2lkX3QsIG9tcHRfZ2V0X3BhcmFsbGVsX2lkLCAoCisgICAgaW50IGFuY2VzdG9yX2xldmVsCispKTsKKworT01QVF9BUElfRlVOQ1RJT04oaW50LCBvbXB0X2dldF9wYXJhbGxlbF90ZWFtX3NpemUsICgKKyAgICBpbnQgYW5jZXN0b3JfbGV2ZWwKKykpOworCisvKiB0YXNrICovCitPTVBUX0FQSV9GVU5DVElPTihvbXB0X3Rhc2tfaWRfdCwgb21wdF9nZXRfdGFza19pZCwgKAorICAgIGludCBkZXB0aAorKSk7CisKK09NUFRfQVBJX0ZVTkNUSU9OKG9tcHRfZnJhbWVfdCAqLCBvbXB0X2dldF90YXNrX2ZyYW1lLCAoCisgICAgaW50IGRlcHRoCispKTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQTEFDRUhPTERFUlMgRk9SIFBFUkZPUk1BTkNFIFJFUE9SVElORworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogaWRsZSAqLworT01QVF9BUElfRlVOQ1RJT04odm9pZCwgb21wdF9pZGxlLCAoCisgICAgdm9pZAorKSk7CisKKy8qIG92ZXJoZWFkICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X292ZXJoZWFkLCAoCisgICAgdm9pZAorKSk7CisKKy8qIGJhcnJpZXIgd2FpdCAqLworT01QVF9BUElfRlVOQ1RJT04odm9pZCwgb21wdF9iYXJyaWVyX3dhaXQsICgKKyAgICB2b2lkCispKTsKKworLyogdGFzayB3YWl0ICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X3Rhc2tfd2FpdCwgKAorICAgIHZvaWQKKykpOworCisvKiBtdXRleCB3YWl0ICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X211dGV4X3dhaXQsICgKKyAgICB2b2lkCispKTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTklUSUFMSVpBVElPTiBGVU5DVElPTlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQsIG9tcHRfaW5pdGlhbGl6ZSwgKAorICAgIG9tcHRfZnVuY3Rpb25fbG9va3VwX3Qgb21wdF9mbl9sb29rdXAsCisgICAgY29uc3QgY2hhciAqcnVudGltZV92ZXJzaW9uLAorICAgIHVuc2lnbmVkIGludCBvbXB0X3ZlcnNpb24KKykpOworCisKKy8qIGluaXRpYWxpemF0aW9uIGludGVyZmFjZSB0byBiZSBkZWZpbmVkIGJ5IHRvb2wgKi8KK29tcHRfaW5pdGlhbGl6ZV90IG9tcHRfdG9vbCh2b2lkKTsKKwordHlwZWRlZiBlbnVtIG9wdF9pbml0X21vZGVfZSB7CisgICAgb21wdF9pbml0X21vZGVfbmV2ZXIgID0gMCwKKyAgICBvbXB0X2luaXRfbW9kZV9mYWxzZSAgPSAxLAorICAgIG9tcHRfaW5pdF9tb2RlX3RydWUgICA9IDIsCisgICAgb21wdF9pbml0X21vZGVfYWx3YXlzID0gMworfSBvbXB0X2luaXRfbW9kZV90OworCitPTVBUX0FQSV9GVU5DVElPTihpbnQsIG9tcHRfc2V0X2NhbGxiYWNrLCAoCisgICAgb21wdF9ldmVudF90IGV2ZW50LAorICAgIG9tcHRfY2FsbGJhY2tfdCBjYWxsYmFjaworKSk7CisKK3R5cGVkZWYgZW51bSBvbXB0X3NldF9jYWxsYmFja19yY19lIHsgIC8qIG5vbi1zdGFuZGFyZCAqLworICAgIG9tcHRfc2V0X2NhbGxiYWNrX2Vycm9yICAgICAgPSAwLAorICAgIG9tcHRfaGFzX2V2ZW50X25vX2NhbGxiYWNrICAgPSAxLAorICAgIG9tcHRfbm9fZXZlbnRfbm9fY2FsbGJhY2sgICAgPSAyLAorICAgIG9tcHRfaGFzX2V2ZW50X21heV9jYWxsYmFjayAgPSAzLAorICAgIG9tcHRfaGFzX2V2ZW50X211c3RfY2FsbGJhY2sgPSA0LAorfSBvbXB0X3NldF9jYWxsYmFja19yY190OworCisKK09NUFRfQVBJX0ZVTkNUSU9OKGludCwgb21wdF9nZXRfY2FsbGJhY2ssICgKKyAgICBvbXB0X2V2ZW50X3QgZXZlbnQsCisgICAgb21wdF9jYWxsYmFja190ICpjYWxsYmFjaworKSk7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTUlTQ0VMTEFORU9VUyBGVU5DVElPTlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGNvbnRyb2wgKi8KKy8vIEZJWE1FOiByZW1vdmUgd29ya2Fyb3VuZCBmb3IgY2xhbmcKKyNpZiAhZGVmaW5lZChfX2NsYW5nX18pICYmIGRlZmluZWQoX09QRU5NUCkgJiYgKF9PUEVOTVAgPj0gMjAxMzA3KQorI3ByYWdtYSBvbXAgZGVjbGFyZSB0YXJnZXQKKyNlbmRpZgordm9pZCBvbXB0X2NvbnRyb2woCisgICAgdWludDY0X3QgY29tbWFuZCwKKyAgICB1aW50NjRfdCBtb2RpZmllcgorKTsKKyNpZiAhZGVmaW5lZChfX2NsYW5nX18pICYmIGRlZmluZWQoX09QRU5NUCkgJiYgKF9PUEVOTVAgPj0gMjAxMzA3KQorI3ByYWdtYSBvbXAgZW5kIGRlY2xhcmUgdGFyZ2V0CisjZW5kaWYKKworLyogc3RhdGUgZW51bWVyYXRpb24gKi8KK09NUFRfQVBJX0ZVTkNUSU9OKGludCwgb21wdF9lbnVtZXJhdGVfc3RhdGUsICgKKyAgICBpbnQgY3VycmVudF9zdGF0ZSwKKyAgICBpbnQgKm5leHRfc3RhdGUsCisgICAgY29uc3QgY2hhciAqKm5leHRfc3RhdGVfbmFtZQorKSk7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK307CisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcC5oIGIvZmluYWwvcnVudGltZS9zcmMva21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBkNjViOAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcC5oCkBAIC0wLDAgKzEsMzg0MSBAQAorLyohIFxmaWxlICovCisvKgorICoga21wLmggLS0gS1BUUyBydW50aW1lIGhlYWRlciBmaWxlLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9ICisjZGVmaW5lIEtNUF9ICisKKyNpbmNsdWRlICJrbXBfY29uZmlnLmgiCisKKy8qICNkZWZpbmUgQlVJTERfUEFSQUxMRUxfT1JERVJFRCAxICovCisKKy8qIFRoaXMgZml4IHJlcGxhY2VzIGdldHRpbWVvZmRheSB3aXRoIGNsb2NrX2dldHRpbWUgZm9yIGJldHRlciBzY2FsYWJpbGl0eSBvbgorICAgdGhlIEFsdGl4LiAgUmVxdWlyZXMgdXNlciBjb2RlIHRvIGJlIGxpbmtlZCB3aXRoIC1scnQuICovCisvLyNkZWZpbmUgRklYX1NHSV9DTE9DSworCisvKiBEZWZpbmVzIGZvciBPcGVuTVAgMy4wIHRhc2tpbmcgYW5kIGF1dG8gc2NoZWR1bGluZyAqLworCisjaWZuZGVmIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRAorI2RlZmluZSBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQgMQorI2VuZGlmCisKKyNkZWZpbmUgVEFTS19DVVJSRU5UX05PVF9RVUVVRUQgMAorI2RlZmluZSBUQVNLX0NVUlJFTlRfUVVFVUVEIDEKKworI2lmZGVmIEJVSUxEX1RJRURfVEFTS19TVEFDSworI2RlZmluZSBUQVNLX1NUQUNLX0VNUFRZIDAgLy8gZW50cmllcyB3aGVuIHRoZSBzdGFjayBpcyBlbXB0eQorI2RlZmluZSBUQVNLX1NUQUNLX0JMT0NLX0JJVFMgNSAvLyBVc2VkIGluIFRBU0tfU1RBQ0tfU0laRSBhbmQgVEFTS19TVEFDS19NQVNLCisvLyBOdW1iZXIgb2YgZW50cmllcyBpbiBlYWNoIHRhc2sgc3RhY2sgYXJyYXkKKyNkZWZpbmUgVEFTS19TVEFDS19CTE9DS19TSVpFICgxIDw8IFRBU0tfU1RBQ0tfQkxPQ0tfQklUUykKKy8vIE1hc2sgZm9yIGRldGVybWluaW5nIGluZGV4IGludG8gc3RhY2sgYmxvY2sKKyNkZWZpbmUgVEFTS19TVEFDS19JTkRFWF9NQVNLIChUQVNLX1NUQUNLX0JMT0NLX1NJWkUgLSAxKQorI2VuZGlmIC8vIEJVSUxEX1RJRURfVEFTS19TVEFDSworCisjZGVmaW5lIFRBU0tfTk9UX1BVU0hFRCAxCisjZGVmaW5lIFRBU0tfU1VDQ0VTU0ZVTExZX1BVU0hFRCAwCisjZGVmaW5lIFRBU0tfVElFRCAxCisjZGVmaW5lIFRBU0tfVU5USUVEIDAKKyNkZWZpbmUgVEFTS19FWFBMSUNJVCAxCisjZGVmaW5lIFRBU0tfSU1QTElDSVQgMAorI2RlZmluZSBUQVNLX1BST1hZIDEKKyNkZWZpbmUgVEFTS19GVUxMIDAKKworI2RlZmluZSBLTVBfQ0FOQ0VMX1RIUkVBRFMKKyNkZWZpbmUgS01QX1RIUkVBRF9BVFRSCisKKy8vIEFuZHJvaWQgZG9lcyBub3QgaGF2ZSBwdGhyZWFkX2NhbmNlbC4gIFVuZGVmaW5lIEtNUF9DQU5DRUxfVEhSRUFEUyBpZiBiZWluZworLy8gYnVpbHQgb24gQW5kcm9pZAorI2lmIGRlZmluZWQoX19BTkRST0lEX18pCisjdW5kZWYgS01QX0NBTkNFTF9USFJFQURTCisjZW5kaWYKKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisvKiBpbmNsdWRlIDxjdHlwZS5oPiBkb24ndCB1c2U7IHByb2JsZW1zIHdpdGggL01EIG9uIFdpbmRvd3MqIE9TIE5UIGR1ZSB0byBiYWQKKyAgIE1pY3Jvc29mdCBsaWJyYXJ5LiBTb21lIG1hY3JvcyBwcm92aWRlZCBiZWxvdyB0byByZXBsYWNlIHRoZXNlIGZ1bmN0aW9ucyAgKi8KKyNpZm5kZWYgX19BQlNPRlRfV0lOCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAia21wX29zLmgiCisKKyNpbmNsdWRlICJrbXBfc2FmZV9jX2FwaS5oIgorCisjaWYgS01QX1NUQVRTX0VOQUJMRUQKK2NsYXNzIGttcF9zdGF0c19saXN0OworI2VuZGlmCisKKyNpZiBLTVBfVVNFX0hXTE9DICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyNpbmNsdWRlICJod2xvYy5oIgorI2lmbmRlZiBIV0xPQ19PQkpfTlVNQU5PREUKKyNkZWZpbmUgSFdMT0NfT0JKX05VTUFOT0RFIEhXTE9DX09CSl9OT0RFCisjZW5kaWYKKyNpZm5kZWYgSFdMT0NfT0JKX1BBQ0tBR0UKKyNkZWZpbmUgSFdMT0NfT0JKX1BBQ0tBR0UgSFdMT0NfT0JKX1NPQ0tFVAorI2VuZGlmCisjZW5kaWYKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyNpbmNsdWRlIDx4bW1pbnRyaW4uaD4KKyNlbmRpZgorCisjaW5jbHVkZSAia21wX2RlYnVnLmgiCisjaW5jbHVkZSAia21wX2xvY2suaCIKKyNpbmNsdWRlICJrbXBfdmVyc2lvbi5oIgorI2lmIFVTRV9ERUJVR0dFUgorI2luY2x1ZGUgImttcF9kZWJ1Z2dlci5oIgorI2VuZGlmCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKworI2RlZmluZSBLTVBfSEFORExFX1NJR05BTFMgKEtNUF9PU19VTklYIHx8IEtNUF9PU19XSU5ET1dTKQorCisjaW5jbHVkZSAia21wX3dyYXBwZXJfbWFsbG9jLmgiCisjaWYgS01QX09TX1VOSVgKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpZiAhZGVmaW5lZCBOU0lHICYmIGRlZmluZWQgX05TSUcKKyNkZWZpbmUgTlNJRyBfTlNJRworI2VuZGlmCisjZW5kaWYKKworI2lmIEtNUF9PU19MSU5VWAorI3ByYWdtYSB3ZWFrIGNsb2NrX2dldHRpbWUKKyNlbmRpZgorCisjaWYgT01QVF9TVVBQT1JUCisjaW5jbHVkZSAib21wdC1pbnRlcm5hbC5oIgorI2VuZGlmCisKKy8qU2VsZWN0IGRhdGEgcGxhY2VtZW50IGluIE5VTUEgbWVtb3J5ICovCisjZGVmaW5lIE5PX0ZJUlNUX1RPVUNIIDAKKyNkZWZpbmUgRklSU1RfVE9VQ0ggMSAvKiBFeHBsb2l0IFNHSSdzIGZpcnN0IHRvdWNoIHBhZ2UgcGxhY2VtZW50IGFsZ28gKi8KKworLyogSWYgbm90IHNwZWNpZmllZCBvbiBjb21waWxlIGNvbW1hbmQgbGluZSwgYXNzdW1lIG5vIGZpcnN0IHRvdWNoICovCisjaWZuZGVmIEJVSUxEX01FTU9SWQorI2RlZmluZSBCVUlMRF9NRU1PUlkgTk9fRklSU1RfVE9VQ0gKKyNlbmRpZgorCisvLyAwIC0gbm8gZmFzdCBtZW1vcnkgYWxsb2NhdGlvbiwgYWxpZ25tZW50OiA4LWJ5dGUgb24geDg2LCAxNi1ieXRlIG9uIHg2NC4KKy8vIDMgLSBmYXN0IGFsbG9jYXRpb24gdXNpbmcgc3luYywgbm9uLXN5bmMgZnJlZSBsaXN0cyBvZiBhbnkgc2l6ZSwgbm9uLXNlbGYKKy8vIGZyZWUgbGlzdHMgb2YgbGltaXRlZCBzaXplLgorI2lmbmRlZiBVU0VfRkFTVF9NRU1PUlkKKyNkZWZpbmUgVVNFX0ZBU1RfTUVNT1JZIDMKKyNlbmRpZgorCisjaWZuZGVmIEtNUF9ORVNURURfSE9UX1RFQU1TCisjZGVmaW5lIEtNUF9ORVNURURfSE9UX1RFQU1TIDAKKyNkZWZpbmUgVVNFX05FU1RFRF9IT1RfQVJHKHgpCisjZWxzZQorI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisjaWYgT01QXzQwX0VOQUJMRUQKKyNkZWZpbmUgVVNFX05FU1RFRF9IT1RfQVJHKHgpICwgeAorI2Vsc2UKKy8vIE5lc3RlZCBob3QgdGVhbXMgZmVhdHVyZSBkZXBlbmRzIG9uIG9tcCA0LjAsIGRpc2FibGUgaXQgZm9yIGVhcmxpZXIgdmVyc2lvbnMKKyN1bmRlZiBLTVBfTkVTVEVEX0hPVF9URUFNUworI2RlZmluZSBLTVBfTkVTVEVEX0hPVF9URUFNUyAwCisjZGVmaW5lIFVTRV9ORVNURURfSE9UX0FSRyh4KQorI2VuZGlmCisjZWxzZQorI2RlZmluZSBVU0VfTkVTVEVEX0hPVF9BUkcoeCkKKyNlbmRpZgorI2VuZGlmCisKKy8vIEFzc3VtZSB1c2luZyBCR0VUIGNvbXBhcmVfZXhjaGFuZ2UgaW5zdHJ1Y3Rpb24gaW5zdGVhZCBvZiBsb2NrIGJ5IGRlZmF1bHQuCisjaWZuZGVmIFVTRV9DTVBfWENIR19GT1JfQkdFVAorI2RlZmluZSBVU0VfQ01QX1hDSEdfRk9SX0JHRVQgMQorI2VuZGlmCisKKy8vIFRlc3QgdG8gc2VlIGlmIHF1ZXVpbmcgbG9jayBpcyBiZXR0ZXIgdGhhbiBib290c3RyYXAgbG9jayBmb3IgYmdldAorLy8gI2lmbmRlZiBVU0VfUVVFVUlOR19MT0NLX0ZPUl9CR0VUCisvLyAjZGVmaW5lIFVTRV9RVUVVSU5HX0xPQ0tfRk9SX0JHRVQKKy8vICNlbmRpZgorCisjZGVmaW5lIEtNUF9OU0VDX1BFUl9TRUMgMTAwMDAwMDAwMEwKKyNkZWZpbmUgS01QX1VTRUNfUEVSX1NFQyAxMDAwMDAwTAorCisvKiEKK0Bpbmdyb3VwIEJBU0lDX1RZUEVTCitAeworKi8KKworLy8gRklYTUUgRE9YWUdFTi4uLiBuZWVkIHRvIGdyb3VwIHRoZXNlIGZsYWdzIHNvbWVob3cgKE1ha2luZyB0aGVtIGFuIGFub255bW91cworLy8gZW51bSB3b3VsZCBkbyBpdC4uLikKKy8qIQorVmFsdWVzIGZvciBiaXQgZmxhZ3MgdXNlZCBpbiB0aGUgaWRlbnRfdCB0byBkZXNjcmliZSB0aGUgZmllbGRzLgorKi8KKy8qISBVc2UgdHJhbXBvbGluZSBmb3IgaW50ZXJuYWwgbWljcm90YXNrcyAqLworI2RlZmluZSBLTVBfSURFTlRfSU1CIDB4MDEKKy8qISBVc2UgYy1zdHlsZSBpZGVudCBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgS01QX0lERU5UX0tNUEMgMHgwMgorLyogMHgwNCBpcyBubyBsb25nZXIgdXNlZCAqLworLyohIEVudHJ5IHBvaW50IGdlbmVyYXRlZCBieSBhdXRvLXBhcmFsbGVsaXphdGlvbiAqLworI2RlZmluZSBLTVBfSURFTlRfQVVUT1BBUiAweDA4CisvKiEgQ29tcGlsZXIgZ2VuZXJhdGVzIGF0b21pYyByZWR1Y3Rpb24gb3B0aW9uIGZvciBrbXBjX3JlZHVjZSogKi8KKyNkZWZpbmUgS01QX0lERU5UX0FUT01JQ19SRURVQ0UgMHgxMAorLyohIFRvIG1hcmsgYSAnYmFycmllcicgZGlyZWN0aXZlIGluIHVzZXIgY29kZSAqLworI2RlZmluZSBLTVBfSURFTlRfQkFSUklFUl9FWFBMIDB4MjAKKy8qISBUbyBNYXJrIGltcGxpY2l0IGJhcnJpZXJzLiAqLworI2RlZmluZSBLTVBfSURFTlRfQkFSUklFUl9JTVBMIDB4MDA0MAorI2RlZmluZSBLTVBfSURFTlRfQkFSUklFUl9JTVBMX01BU0sgMHgwMUMwCisjZGVmaW5lIEtNUF9JREVOVF9CQVJSSUVSX0lNUExfRk9SIDB4MDA0MAorI2RlZmluZSBLTVBfSURFTlRfQkFSUklFUl9JTVBMX1NFQ1RJT05TIDB4MDBDMAorCisjZGVmaW5lIEtNUF9JREVOVF9CQVJSSUVSX0lNUExfU0lOR0xFIDB4MDE0MAorI2RlZmluZSBLTVBfSURFTlRfQkFSUklFUl9JTVBMX1dPUktTSEFSRSAweDAxQzAKKworLyohCisgKiBUaGUgaWRlbnQgc3RydWN0dXJlIHRoYXQgZGVzY3JpYmVzIGEgc291cmNlIGxvY2F0aW9uLgorICovCit0eXBlZGVmIHN0cnVjdCBpZGVudCB7CisgIGttcF9pbnQzMiByZXNlcnZlZF8xOyAvKio8ICBtaWdodCBiZSB1c2VkIGluIEZvcnRyYW47IHNlZSBhYm92ZSAgKi8KKyAga21wX2ludDMyIGZsYWdzOyAvKio8ICBhbHNvIGYuZmxhZ3M7IEtNUF9JREVOVF94eHggZmxhZ3M7IEtNUF9JREVOVF9LTVBDCisgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcyB0aGlzIHVuaW9uIG1lbWJlciAgKi8KKyAga21wX2ludDMyIHJlc2VydmVkXzI7IC8qKjwgIG5vdCByZWFsbHkgdXNlZCBpbiBGb3J0cmFuIGFueSBtb3JlOyBzZWUgYWJvdmUgKi8KKyNpZiBVU0VfSVRUX0JVSUxECisvKiAgYnV0IGN1cnJlbnRseSB1c2VkIGZvciBzdG9yaW5nIHJlZ2lvbi1zcGVjaWZpYyBJVFQgKi8KKy8qICBjb250ZXh0dWFsIGluZm9ybWF0aW9uLiAqLworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAga21wX2ludDMyIHJlc2VydmVkXzM7IC8qKjwgc291cmNlWzRdIGluIEZvcnRyYW4sIGRvIG5vdCB1c2UgZm9yIEMrKyAgKi8KKyAgY2hhciBjb25zdCAqcHNvdXJjZTsgLyoqPCBTdHJpbmcgZGVzY3JpYmluZyB0aGUgc291cmNlIGxvY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICBUaGUgc3RyaW5nIGlzIGNvbXBvc2VkIG9mIHNlbWktY29sb24gc2VwYXJhdGVkIGZpZWxkcworICAgICAgICAgICAgICAgICAgICAgICB3aGljaCBkZXNjcmliZSB0aGUgc291cmNlIGZpbGUsIHRoZSBmdW5jdGlvbiBhbmQgYSBwYWlyCisgICAgICAgICAgICAgICAgICAgICAgIG9mIGxpbmUgbnVtYmVycyB0aGF0IGRlbGltaXQgdGhlIGNvbnN0cnVjdC4gKi8KK30gaWRlbnRfdDsKKy8qIQorQH0KKyovCisKKy8vIFNvbWUgZm9yd2FyZCBkZWNsYXJhdGlvbnMuCit0eXBlZGVmIHVuaW9uIGttcF90ZWFtIGttcF90ZWFtX3Q7Cit0eXBlZGVmIHN0cnVjdCBrbXBfdGFza2RhdGEga21wX3Rhc2tkYXRhX3Q7Cit0eXBlZGVmIHVuaW9uIGttcF90YXNrX3RlYW0ga21wX3Rhc2tfdGVhbV90OwordHlwZWRlZiB1bmlvbiBrbXBfdGVhbSBrbXBfdGVhbV9wOwordHlwZWRlZiB1bmlvbiBrbXBfaW5mbyBrbXBfaW5mb19wOwordHlwZWRlZiB1bmlvbiBrbXBfcm9vdCBrbXBfcm9vdF9wOworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBQYWNrIHR3byAzMi1iaXQgc2lnbmVkIGludGVnZXJzIGludG8gYSA2NC1iaXQgc2lnbmVkIGludGVnZXIgKi8KKy8qIFRvRG86IEZpeCB3b3JkIG9yZGVyaW5nIGZvciBiaWctZW5kaWFuIG1hY2hpbmVzLiAqLworI2RlZmluZSBLTVBfUEFDS182NChISUdIXzMyLCBMT1dfMzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChrbXBfaW50NjQpKCgoKGttcF91aW50NjQpKEhJR0hfMzIpKSA8PCAzMikgfCAoa21wX3VpbnQ2NCkoTE9XXzMyKSkpCisKKy8vIEdlbmVyaWMgc3RyaW5nIG1hbmlwdWxhdGlvbiBtYWNyb3MuIEFzc3VtZSB0aGF0IF94IGlzIG9mIHR5cGUgY2hhciAqCisjZGVmaW5lIFNLSVBfV1MoX3gpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3aGlsZSAoKihfeCkgPT0gJyAnIHx8ICooX3gpID09ICdcdCcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoX3gpKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZGVmaW5lIFNLSVBfRElHSVRTKF94KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3aGlsZSAoKihfeCkgPj0gJzAnICYmICooX3gpIDw9ICc5JykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoX3gpKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZGVmaW5lIFNLSVBfVE8oX3gsIF9jKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3aGlsZSAoKihfeCkgIT0gJ1wwJyAmJiAqKF94KSAhPSAoX2MpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoX3gpKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEtNUF9NQVgoeCwgeSkgKCh4KSA+ICh5KSA/ICh4KSA6ICh5KSkKKyNkZWZpbmUgS01QX01JTih4LCB5KSAoKHgpIDwgKHkpID8gKHgpIDogKHkpKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEVudW1lcmF0aW9uIHR5cGVzICovCisKK2VudW0ga21wX3N0YXRlX3RpbWVyIHsKKyAgdHNfc3RvcCwKKyAgdHNfc3RhcnQsCisgIHRzX3BhdXNlLAorCisgIHRzX2xhc3Rfc3RhdGUKK307CisKK2VudW0gZHluYW1pY19tb2RlIHsKKyAgZHluYW1pY19kZWZhdWx0LAorI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKKyAgZHluYW1pY19sb2FkX2JhbGFuY2UsCisjZW5kaWYgLyogVVNFX0xPQURfQkFMQU5DRSAqLworICBkeW5hbWljX3JhbmRvbSwKKyAgZHluYW1pY190aHJlYWRfbGltaXQsCisgIGR5bmFtaWNfbWF4Cit9OworCisvKiBleHRlcm5hbCBzY2hlZHVsZSBjb25zdGFudHMsIGR1cGxpY2F0ZSBlbnVtIG9tcF9zY2hlZCBpbiBvbXAuaCBpbiBvcmRlciB0bworICogbm90IGluY2x1ZGUgaXQgaGVyZSAqLworI2lmbmRlZiBLTVBfU0NIRURfVFlQRV9ERUZJTkVECisjZGVmaW5lIEtNUF9TQ0hFRF9UWVBFX0RFRklORUQKK3R5cGVkZWYgZW51bSBrbXBfc2NoZWQgeworICBrbXBfc2NoZWRfbG93ZXIgPSAwLCAvLyBsb3dlciBhbmQgdXBwZXIgYm91bmRzIGFyZSBmb3Igcm91dGluZSBwYXJhbWV0ZXIgY2hlY2sKKyAgLy8gTm90ZTogbmVlZCB0byBhZGp1c3QgX19rbXBfc2NoX21hcCBnbG9iYWwgYXJyYXkgaW4gY2FzZSBlbnVtIGlzIGNoYW5nZWQKKyAga21wX3NjaGVkX3N0YXRpYyA9IDEsIC8vIG1hcHBlZCB0byBrbXBfc2NoX3N0YXRpY19jaHVua2VkICAgICAgICAgICAoMzMpCisgIGttcF9zY2hlZF9keW5hbWljID0gMiwgLy8gbWFwcGVkIHRvIGttcF9zY2hfZHluYW1pY19jaHVua2VkICAgICAgICAgICgzNSkKKyAga21wX3NjaGVkX2d1aWRlZCA9IDMsIC8vIG1hcHBlZCB0byBrbXBfc2NoX2d1aWRlZF9jaHVua2VkICAgICAgICAgICAoMzYpCisgIGttcF9zY2hlZF9hdXRvID0gNCwgLy8gbWFwcGVkIHRvIGttcF9zY2hfYXV0byAgICAgICAgICAgICAgICAgICAgICgzOCkKKyAga21wX3NjaGVkX3VwcGVyX3N0ZCA9IDUsIC8vIHVwcGVyIGJvdW5kIGZvciBzdGFuZGFyZCBzY2hlZHVsZXMKKyAga21wX3NjaGVkX2xvd2VyX2V4dCA9IDEwMCwgLy8gbG93ZXIgYm91bmQgb2YgSW50ZWwgZXh0ZW5zaW9uIHNjaGVkdWxlcworICBrbXBfc2NoZWRfdHJhcGV6b2lkYWwgPSAxMDEsIC8vIG1hcHBlZCB0byBrbXBfc2NoX3RyYXBlem9pZGFsICgzOSkKKyNpZiBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQKKyAga21wX3NjaGVkX3N0YXRpY19zdGVhbCA9IDEwMiwgLy8gbWFwcGVkIHRvIGttcF9zY2hfc3RhdGljX3N0ZWFsICg0NCkKKyNlbmRpZgorICBrbXBfc2NoZWRfdXBwZXIsCisgIGttcF9zY2hlZF9kZWZhdWx0ID0ga21wX3NjaGVkX3N0YXRpYyAvLyBkZWZhdWx0IHNjaGVkdWxpbmcKK30ga21wX3NjaGVkX3Q7CisjZW5kaWYKKworLyohCisgQGluZ3JvdXAgV09SS19TSEFSSU5HCisgKiBEZXNjcmliZXMgdGhlIGxvb3Agc2NoZWR1bGUgdG8gYmUgdXNlZCBmb3IgYSBwYXJhbGxlbCBmb3IgbG9vcC4KKyAqLworZW51bSBzY2hlZF90eXBlIHsKKyAga21wX3NjaF9sb3dlciA9IDMyLCAvKio8IGxvd2VyIGJvdW5kIGZvciB1bm9yZGVyZWQgdmFsdWVzICovCisgIGttcF9zY2hfc3RhdGljX2NodW5rZWQgPSAzMywKKyAga21wX3NjaF9zdGF0aWMgPSAzNCwgLyoqPCBzdGF0aWMgdW5zcGVjaWFsaXplZCAqLworICBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCA9IDM1LAorICBrbXBfc2NoX2d1aWRlZF9jaHVua2VkID0gMzYsIC8qKjwgZ3VpZGVkIHVuc3BlY2lhbGl6ZWQgKi8KKyAga21wX3NjaF9ydW50aW1lID0gMzcsCisgIGttcF9zY2hfYXV0byA9IDM4LCAvKio8IGF1dG8gKi8KKyAga21wX3NjaF90cmFwZXpvaWRhbCA9IDM5LAorCisgIC8qIGFjY2Vzc2libGUgb25seSB0aHJvdWdoIEtNUF9TQ0hFRFVMRSBlbnZpcm9ubWVudCB2YXJpYWJsZSAqLworICBrbXBfc2NoX3N0YXRpY19ncmVlZHkgPSA0MCwKKyAga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQgPSA0MSwKKyAgLyogYWNjZXNzaWJsZSBvbmx5IHRocm91Z2ggS01QX1NDSEVEVUxFIGVudmlyb25tZW50IHZhcmlhYmxlICovCisgIGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkID0gNDIsCisgIGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZCA9IDQzLAorICAvKiBhY2Nlc3NpYmxlIG9ubHkgdGhyb3VnaCBLTVBfU0NIRURVTEUgZW52aXJvbm1lbnQgdmFyaWFibGUgKi8KKyAga21wX3NjaF9zdGF0aWNfc3RlYWwgPSA0NCwKKworI2lmIE9NUF80NV9FTkFCTEVECisgIC8qIHN0YXRpYyB3aXRoIGNodW5rIGFkanVzdG1lbnQgKGUuZy4sIHNpbWQpICovCisgIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkX2NodW5rZWQgPSA0NSwKKyAga21wX3NjaF9ndWlkZWRfc2ltZCA9IDQ2LCAvKio8IGd1aWRlZCB3aXRoIGNodW5rIGFkanVzdG1lbnQgKi8KKyAga21wX3NjaF9ydW50aW1lX3NpbWQgPSA0NywgLyoqPCBydW50aW1lIHdpdGggY2h1bmsgYWRqdXN0bWVudCAqLworI2VuZGlmCisKKyAgLyogYWNjZXNzaWJsZSBvbmx5IHRocm91Z2ggS01QX1NDSEVEVUxFIGVudmlyb25tZW50IHZhcmlhYmxlICovCisgIGttcF9zY2hfdXBwZXIgPSA0OCwgLyoqPCB1cHBlciBib3VuZCBmb3IgdW5vcmRlcmVkIHZhbHVlcyAqLworCisgIGttcF9vcmRfbG93ZXIgPSA2NCwgLyoqPCBsb3dlciBib3VuZCBmb3Igb3JkZXJlZCB2YWx1ZXMsIG11c3QgYmUgcG93ZXIgb2YgMiAqLworICBrbXBfb3JkX3N0YXRpY19jaHVua2VkID0gNjUsCisgIGttcF9vcmRfc3RhdGljID0gNjYsIC8qKjwgb3JkZXJlZCBzdGF0aWMgdW5zcGVjaWFsaXplZCAqLworICBrbXBfb3JkX2R5bmFtaWNfY2h1bmtlZCA9IDY3LAorICBrbXBfb3JkX2d1aWRlZF9jaHVua2VkID0gNjgsCisgIGttcF9vcmRfcnVudGltZSA9IDY5LAorICBrbXBfb3JkX2F1dG8gPSA3MCwgLyoqPCBvcmRlcmVkIGF1dG8gKi8KKyAga21wX29yZF90cmFwZXpvaWRhbCA9IDcxLAorICBrbXBfb3JkX3VwcGVyID0gNzIsIC8qKjwgdXBwZXIgYm91bmQgZm9yIG9yZGVyZWQgdmFsdWVzICovCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAvKiBTY2hlZHVsZXMgZm9yIERpc3RyaWJ1dGUgY29uc3RydWN0ICovCisgIGttcF9kaXN0cmlidXRlX3N0YXRpY19jaHVua2VkID0gOTEsIC8qKjwgZGlzdHJpYnV0ZSBzdGF0aWMgY2h1bmtlZCAqLworICBrbXBfZGlzdHJpYnV0ZV9zdGF0aWMgPSA5MiwgLyoqPCBkaXN0cmlidXRlIHN0YXRpYyB1bnNwZWNpYWxpemVkICovCisjZW5kaWYKKworICAvKiBGb3IgdGhlICJub21lcmdlIiB2ZXJzaW9ucywga21wX2Rpc3BhdGNoX25leHQqKCkgd2lsbCBhbHdheXMgcmV0dXJuIGEKKyAgICAgc2luZ2xlIGl0ZXJhdGlvbi9jaHVuaywgZXZlbiBpZiB0aGUgbG9vcCBpcyBzZXJpYWxpemVkLiBGb3IgdGhlIHNjaGVkdWxlCisgICAgIHR5cGVzIGxpc3RlZCBhYm92ZSwgdGhlIGVudGlyZSBpdGVyYXRpb24gdmVjdG9yIGlzIHJldHVybmVkIGlmIHRoZSBsb29wIGlzCisgICAgIHNlcmlhbGl6ZWQuIFRoaXMgZG9lc24ndCB3b3JrIGZvciBnY2MvZ2NvbXAgc2VjdGlvbnMuICovCisgIGttcF9ubV9sb3dlciA9IDE2MCwgLyoqPCBsb3dlciBib3VuZCBmb3Igbm9tZXJnZSB2YWx1ZXMgKi8KKworICBrbXBfbm1fc3RhdGljX2NodW5rZWQgPQorICAgICAgKGttcF9zY2hfc3RhdGljX2NodW5rZWQgLSBrbXBfc2NoX2xvd2VyICsga21wX25tX2xvd2VyKSwKKyAga21wX25tX3N0YXRpYyA9IDE2MiwgLyoqPCBzdGF0aWMgdW5zcGVjaWFsaXplZCAqLworICBrbXBfbm1fZHluYW1pY19jaHVua2VkID0gMTYzLAorICBrbXBfbm1fZ3VpZGVkX2NodW5rZWQgPSAxNjQsIC8qKjwgZ3VpZGVkIHVuc3BlY2lhbGl6ZWQgKi8KKyAga21wX25tX3J1bnRpbWUgPSAxNjUsCisgIGttcF9ubV9hdXRvID0gMTY2LCAvKio8IGF1dG8gKi8KKyAga21wX25tX3RyYXBlem9pZGFsID0gMTY3LAorCisgIC8qIGFjY2Vzc2libGUgb25seSB0aHJvdWdoIEtNUF9TQ0hFRFVMRSBlbnZpcm9ubWVudCB2YXJpYWJsZSAqLworICBrbXBfbm1fc3RhdGljX2dyZWVkeSA9IDE2OCwKKyAga21wX25tX3N0YXRpY19iYWxhbmNlZCA9IDE2OSwKKyAgLyogYWNjZXNzaWJsZSBvbmx5IHRocm91Z2ggS01QX1NDSEVEVUxFIGVudmlyb25tZW50IHZhcmlhYmxlICovCisgIGttcF9ubV9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQgPSAxNzAsCisgIGttcF9ubV9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkID0gMTcxLAorICBrbXBfbm1fc3RhdGljX3N0ZWFsID0KKyAgICAgIDE3MiwgLyogYWNjZXNzaWJsZSBvbmx5IHRocm91Z2ggT01QX1NDSEVEVUxFIGVudmlyb25tZW50IHZhcmlhYmxlICovCisKKyAga21wX25tX29yZF9zdGF0aWNfY2h1bmtlZCA9IDE5MywKKyAga21wX25tX29yZF9zdGF0aWMgPSAxOTQsIC8qKjwgb3JkZXJlZCBzdGF0aWMgdW5zcGVjaWFsaXplZCAqLworICBrbXBfbm1fb3JkX2R5bmFtaWNfY2h1bmtlZCA9IDE5NSwKKyAga21wX25tX29yZF9ndWlkZWRfY2h1bmtlZCA9IDE5NiwKKyAga21wX25tX29yZF9ydW50aW1lID0gMTk3LAorICBrbXBfbm1fb3JkX2F1dG8gPSAxOTgsIC8qKjwgYXV0byAqLworICBrbXBfbm1fb3JkX3RyYXBlem9pZGFsID0gMTk5LAorICBrbXBfbm1fdXBwZXIgPSAyMDAsIC8qKjwgdXBwZXIgYm91bmQgZm9yIG5vbWVyZ2UgdmFsdWVzICovCisKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAvKiBTdXBwb3J0IGZvciBPcGVuTVAgNC41IG1vbm90b25pYyBhbmQgbm9ubW9ub3RvbmljIHNjaGVkdWxlIG1vZGlmaWVycy4gU2luY2UKKyAgICAgd2UgbmVlZCB0byBkaXN0aW5ndWlzaCB0aGUgdGhyZWUgcG9zc2libGUgY2FzZXMgKG5vIG1vZGlmaWVyLCBtb25vdG9uaWMKKyAgICAgbW9kaWZpZXIsIG5vbm1vbm90b25pYyBtb2RpZmllciksIHdlIG5lZWQgc2VwYXJhdGUgYml0cyBmb3IgZWFjaCBtb2RpZmllci4KKyAgICAgVGhlIGFic2VuY2Ugb2YgbW9ub3RvbmljIGRvZXMgbm90IGltcGx5IG5vbm1vbm90b25pYywgZXNwZWNpYWxseSBzaW5jZSA0LjUKKyAgICAgc2F5cyB0aGF0IHRoZSBiZWhhdmlvdXIgb2YgdGhlICJubyBtb2RpZmllciIgY2FzZSBpcyBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkCisgICAgIGluIDQuNSwgYnV0IHdpbGwgYmVjb21lICJub25tb25vdG9uaWMiIGluIDUuMC4KKworICAgICBTaW5jZSB3ZSdyZSBwYXNzaW5nIGEgZnVsbCAzMiBiaXQgdmFsdWUsIHdlIGNhbiB1c2UgYSBjb3VwbGUgb2YgaGlnaCBiaXRzCisgICAgIGZvciB0aGVzZSBmbGFnczsgb3V0IG9mIHBhcmFub2lhIHdlIGF2b2lkIHRoZSBzaWduIGJpdC4KKworICAgICBUaGVzZSBtb2RpZmllcnMgY2FuIGJlIG9yLWVkIGludG8gbm9uLXN0YXRpYyBzY2hlZHVsZXMgYnkgdGhlIGNvbXBpbGVyIHRvCisgICAgIHBhc3MgdGhlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uIFRoZXkgd2lsbCBiZSBzdHJpcHBlZCBlYXJseSBpbiB0aGUKKyAgICAgcHJvY2Vzc2luZyBpbiBfX2ttcF9kaXNwYXRjaF9pbml0IHdoZW4gc2V0dGluZyB1cCBzY2hlZHVsZXMsIHNvIG1vc3Qgb2YgdGhlCisgICAgIGNvZGUgd29uJ3QgZXZlciBzZWUgc2NoZWR1bGVzIHdpdGggdGhlc2UgYml0cyBzZXQuICAqLworICBrbXBfc2NoX21vZGlmaWVyX21vbm90b25pYyA9CisgICAgICAoMSA8PCAyOSksIC8qKjwgU2V0IGlmIHRoZSBtb25vdG9uaWMgc2NoZWR1bGUgbW9kaWZpZXIgd2FzIHByZXNlbnQgKi8KKyAga21wX3NjaF9tb2RpZmllcl9ub25tb25vdG9uaWMgPQorICAgICAgKDEgPDwgMzApLCAvKio8IFNldCBpZiB0aGUgbm9ubW9ub3RvbmljIHNjaGVkdWxlIG1vZGlmaWVyIHdhcyBwcmVzZW50ICovCisKKyNkZWZpbmUgU0NIRURVTEVfV0lUSE9VVF9NT0RJRklFUlMocykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChlbnVtIHNjaGVkX3R5cGUpKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKHMpICYgfihrbXBfc2NoX21vZGlmaWVyX25vbm1vbm90b25pYyB8IGttcF9zY2hfbW9kaWZpZXJfbW9ub3RvbmljKSkKKyNkZWZpbmUgU0NIRURVTEVfSEFTX01PTk9UT05JQyhzKSAoKChzKSZrbXBfc2NoX21vZGlmaWVyX21vbm90b25pYykgIT0gMCkKKyNkZWZpbmUgU0NIRURVTEVfSEFTX05PTk1PTk9UT05JQyhzKSAoKChzKSZrbXBfc2NoX21vZGlmaWVyX25vbm1vbm90b25pYykgIT0gMCkKKyNkZWZpbmUgU0NIRURVTEVfSEFTX05PX01PRElGSUVSUyhzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKHMpICYgKGttcF9zY2hfbW9kaWZpZXJfbm9ubW9ub3RvbmljIHwga21wX3NjaF9tb2RpZmllcl9tb25vdG9uaWMpKSA9PSAwKQorI2Vsc2UKKy8qIEJ5IGRvaW5nIHRoaXMgd2UgaG9wZSB0byBhdm9pZCBtdWx0aXBsZSB0ZXN0cyBvbiBPTVBfNDVfRU5BQkxFRC4gQ29tcGlsZXJzCisgICBjYW4gbm93IGVsaW1pbmF0ZSB0ZXN0cyBvbiBjb21waWxlIHRpbWUgY29uc3RhbnRzIGFuZCBkZWFkIGNvZGUgdGhhdCByZXN1bHRzCisgICBmcm9tIHRoZW0sIHNvIHdlIGNhbiBsZWF2ZSBjb2RlIGd1YXJkZWQgYnkgc3VjaCBhbiBpZiBpbiBwbGFjZS4gICovCisjZGVmaW5lIFNDSEVEVUxFX1dJVEhPVVRfTU9ESUZJRVJTKHMpIChzKQorI2RlZmluZSBTQ0hFRFVMRV9IQVNfTU9OT1RPTklDKHMpIGZhbHNlCisjZGVmaW5lIFNDSEVEVUxFX0hBU19OT05NT05PVE9OSUMocykgZmFsc2UKKyNkZWZpbmUgU0NIRURVTEVfSEFTX05PX01PRElGSUVSUyhzKSB0cnVlCisjZW5kaWYKKworICBrbXBfc2NoX2RlZmF1bHQgPSBrbXBfc2NoX3N0YXRpYyAvKio8IGRlZmF1bHQgc2NoZWR1bGluZyBhbGdvcml0aG0gKi8KK307CisKKy8qIFR5cGUgdG8ga2VlcCBydW50aW1lIHNjaGVkdWxlIHNldCB2aWEgT01QX1NDSEVEVUxFIG9yIG9tcF9zZXRfc2NoZWR1bGUoKSAqLwordHlwZWRlZiBzdHJ1Y3Qga21wX3Jfc2NoZWQgeworICBlbnVtIHNjaGVkX3R5cGUgcl9zY2hlZF90eXBlOworICBpbnQgY2h1bms7Cit9IGttcF9yX3NjaGVkX3Q7CisKK2V4dGVybiBlbnVtIHNjaGVkX3R5cGUgX19rbXBfc2NoX21hcFtdOyAvLyBtYXAgT01QIDMuMCBzY2hlZHVsZSB0eXBlcyB3aXRoIG91cgorLy8gaW50ZXJuYWwgc2NoZWR1bGUgdHlwZXMKKworZW51bSBsaWJyYXJ5X3R5cGUgeworICBsaWJyYXJ5X25vbmUsCisgIGxpYnJhcnlfc2VyaWFsLAorICBsaWJyYXJ5X3R1cm5hcm91bmQsCisgIGxpYnJhcnlfdGhyb3VnaHB1dAorfTsKKworI2lmIEtNUF9PU19MSU5VWAorZW51bSBjbG9ja19mdW5jdGlvbl90eXBlIHsKKyAgY2xvY2tfZnVuY3Rpb25fZ2V0dGltZW9mZGF5LAorICBjbG9ja19mdW5jdGlvbl9jbG9ja19nZXR0aW1lCit9OworI2VuZGlmIC8qIEtNUF9PU19MSU5VWCAqLworCisjaWYgS01QX01JQ19TVVBQT1JURUQKK2VudW0gbWljX3R5cGUgeyBub25fbWljLCBtaWMxLCBtaWMyLCBtaWMzLCBkdW1teSB9OworI2VuZGlmCisKKy8qIC0tIGZhc3QgcmVkdWN0aW9uIHN0dWZmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjdW5kZWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyNkZWZpbmUgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIgMQorCisjdW5kZWYgS01QX0ZBU1RfUkVEVUNUSU9OX0NPUkVfRFVPCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorI2RlZmluZSBLTVBfRkFTVF9SRURVQ1RJT05fQ09SRV9EVU8gMQorI2VuZGlmCisKK2VudW0gX3JlZHVjdGlvbl9tZXRob2QgeworICByZWR1Y3Rpb25fbWV0aG9kX25vdF9kZWZpbmVkID0gMCwKKyAgY3JpdGljYWxfcmVkdWNlX2Jsb2NrID0gKDEgPDwgOCksCisgIGF0b21pY19yZWR1Y2VfYmxvY2sgPSAoMiA8PCA4KSwKKyAgdHJlZV9yZWR1Y2VfYmxvY2sgPSAoMyA8PCA4KSwKKyAgZW1wdHlfcmVkdWNlX2Jsb2NrID0gKDQgPDwgOCkKK307CisKKy8vIERlc2NyaXB0aW9uIG9mIHRoZSBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCB2YXJpYWJsZToKKy8vIFRoZSBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCB2YXJpYWJsZSBjb25zaXN0cyBvZiB0d28gZW51bSB0eXBlcyB2YXJpYWJsZXMKKy8vIHRoYXQgYXJlIHBhY2tlZCB0b2dldGhlciBpbnRvIDAtdGggYnl0ZSBhbmQgMS1zdCBieXRlOgorLy8gMDogKHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICYgMHgwMDAwMDBGRikgaXMgYSAnZW51bSBiYXJyaWVyX3R5cGUnIHZhbHVlIG9mCisvLyBiYXJyaWVyIHRoYXQgd2lsbCBiZSB1c2VkIGluIGZhc3QgcmVkdWN0aW9uOiBic19wbGFpbl9iYXJyaWVyIG9yCisvLyBic19yZWR1Y3Rpb25fYmFycmllcgorLy8gMTogKHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICYgMHgwMDAwRkYwMCkgaXMgYSByZWR1Y3Rpb24gbWV0aG9kIHRoYXQgd2lsbAorLy8gYmUgdXNlZCBpbiBmYXN0IHJlZHVjdGlvbjsKKy8vIFJlZHVjdGlvbiBtZXRob2QgaXMgb2YgJ2VudW0gX3JlZHVjdGlvbl9tZXRob2QnIHR5cGUgYW5kIGl0J3MgZGVmaW5lZCB0aGUgd2F5CisvLyBzbyB0aGF0IHRoZSBiaXRzIG9mIDAtdGggYnl0ZSBhcmUgZW1wdHksIHNvIG5vIG5lZWQgdG8gZXhlY3V0ZSBhIHNoaWZ0CisvLyBpbnN0cnVjdGlvbiB3aGlsZSBwYWNraW5nL3VucGFja2luZworCisjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyNkZWZpbmUgUEFDS19SRURVQ1RJT05fTUVUSE9EX0FORF9CQVJSSUVSKHJlZHVjdGlvbl9tZXRob2QsIGJhcnJpZXJfdHlwZSkgICAgICBcCisgICgocmVkdWN0aW9uX21ldGhvZCkgfCAoYmFycmllcl90eXBlKSkKKworI2RlZmluZSBVTlBBQ0tfUkVEVUNUSU9OX01FVEhPRChwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChlbnVtIF9yZWR1Y3Rpb25fbWV0aG9kKSgocGFja2VkX3JlZHVjdGlvbl9tZXRob2QpICYgKDB4MDAwMEZGMDApKSkKKworI2RlZmluZSBVTlBBQ0tfUkVEVUNUSU9OX0JBUlJJRVIocGFja2VkX3JlZHVjdGlvbl9tZXRob2QpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChlbnVtIGJhcnJpZXJfdHlwZSkoKHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kKSAmICgweDAwMDAwMEZGKSkpCisjZWxzZQorI2RlZmluZSBQQUNLX1JFRFVDVElPTl9NRVRIT0RfQU5EX0JBUlJJRVIocmVkdWN0aW9uX21ldGhvZCwgYmFycmllcl90eXBlKSAgICAgIFwKKyAgKHJlZHVjdGlvbl9tZXRob2QpCisKKyNkZWZpbmUgVU5QQUNLX1JFRFVDVElPTl9NRVRIT0QocGFja2VkX3JlZHVjdGlvbl9tZXRob2QpICAgICAgICAgICAgICAgICAgICAgICBcCisgIChwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCkKKworI2RlZmluZSBVTlBBQ0tfUkVEVUNUSU9OX0JBUlJJRVIocGFja2VkX3JlZHVjdGlvbl9tZXRob2QpIChic19wbGFpbl9iYXJyaWVyKQorI2VuZGlmCisKKyNkZWZpbmUgVEVTVF9SRURVQ1RJT05fTUVUSE9EKHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kLCB3aGljaF9yZWR1Y3Rpb25fYmxvY2spICBcCisgICgoVU5QQUNLX1JFRFVDVElPTl9NRVRIT0QocGFja2VkX3JlZHVjdGlvbl9tZXRob2QpKSA9PSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKHdoaWNoX3JlZHVjdGlvbl9ibG9jaykpCisKKyNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorI2RlZmluZSBUUkVFX1JFRFVDRV9CTE9DS19XSVRIX1JFRFVDVElPTl9CQVJSSUVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFBBQ0tfUkVEVUNUSU9OX01FVEhPRF9BTkRfQkFSUklFUih0cmVlX3JlZHVjZV9ibG9jaywgYnNfcmVkdWN0aW9uX2JhcnJpZXIpKQorCisjZGVmaW5lIFRSRUVfUkVEVUNFX0JMT0NLX1dJVEhfUExBSU5fQkFSUklFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoUEFDS19SRURVQ1RJT05fTUVUSE9EX0FORF9CQVJSSUVSKHRyZWVfcmVkdWNlX2Jsb2NrLCBic19wbGFpbl9iYXJyaWVyKSkKKyNlbmRpZgorCit0eXBlZGVmIGludCBQQUNLRURfUkVEVUNUSU9OX01FVEhPRF9UOworCisvKiAtLSBlbmQgb2YgZmFzdCByZWR1Y3Rpb24gc3R1ZmYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9PU19XSU5ET1dTCisjZGVmaW5lIFVTRV9DQkxLREFUQQorI3ByYWdtYSB3YXJuaW5nKHB1c2gpCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDI3MSAzMTApCisjaW5jbHVkZSA8d2luZG93cy5oPgorI3ByYWdtYSB3YXJuaW5nKHBvcCkKKyNlbmRpZgorCisjaWYgS01QX09TX1VOSVgKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNlbmRpZgorCisvKiBPbmx5IExpbnV4KiBPUyBhbmQgV2luZG93cyogT1Mgc3VwcG9ydCB0aHJlYWQgYWZmaW5pdHkuICovCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorCisvLyBHUk9VUF9BRkZJTklUWSBpcyBhbHJlYWR5IGRlZmluZWQgZm9yIF9NU0NfVkVSPj0xNjAwIChWUzIwMTAgYW5kIGxhdGVyKS4KKyNpZiBLTVBfT1NfV0lORE9XUworI2lmIF9NU0NfVkVSIDwgMTYwMAordHlwZWRlZiBzdHJ1Y3QgR1JPVVBfQUZGSU5JVFkgeworICBLQUZGSU5JVFkgTWFzazsKKyAgV09SRCBHcm91cDsKKyAgV09SRCBSZXNlcnZlZFszXTsKK30gR1JPVVBfQUZGSU5JVFk7CisjZW5kaWYgLyogX01TQ19WRVIgPCAxNjAwICovCisjaWYgS01QX0dST1VQX0FGRklOSVRZCitleHRlcm4gaW50IF9fa21wX251bV9wcm9jX2dyb3VwczsKKyNlbHNlCitzdGF0aWMgY29uc3QgaW50IF9fa21wX251bV9wcm9jX2dyb3VwcyA9IDE7CisjZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCit0eXBlZGVmIERXT1JEICgqa21wX0dldEFjdGl2ZVByb2Nlc3NvckNvdW50X3QpKFdPUkQpOworZXh0ZXJuIGttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudF90IF9fa21wX0dldEFjdGl2ZVByb2Nlc3NvckNvdW50OworCit0eXBlZGVmIFdPUkQgKCprbXBfR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudF90KSh2b2lkKTsKK2V4dGVybiBrbXBfR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudF90IF9fa21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnQ7CisKK3R5cGVkZWYgQk9PTCAoKmttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5X3QpKEhBTkRMRSwgR1JPVVBfQUZGSU5JVFkgKik7CitleHRlcm4ga21wX0dldFRocmVhZEdyb3VwQWZmaW5pdHlfdCBfX2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5OworCit0eXBlZGVmIEJPT0wgKCprbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eV90KShIQU5ETEUsIGNvbnN0IEdST1VQX0FGRklOSVRZICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUk9VUF9BRkZJTklUWSAqKTsKK2V4dGVybiBrbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eV90IF9fa21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHk7CisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKworI2lmIEtNUF9VU0VfSFdMT0MKK2V4dGVybiBod2xvY190b3BvbG9neV90IF9fa21wX2h3bG9jX3RvcG9sb2d5OworZXh0ZXJuIGludCBfX2ttcF9od2xvY19lcnJvcjsKKyNlbmRpZgorCitleHRlcm4gc2l6ZV90IF9fa21wX2FmZmluX21hc2tfc2l6ZTsKKyNkZWZpbmUgS01QX0FGRklOSVRZX0NBUEFCTEUoKSAoX19rbXBfYWZmaW5fbWFza19zaXplID4gMCkKKyNkZWZpbmUgS01QX0FGRklOSVRZX0RJU0FCTEUoKSAoX19rbXBfYWZmaW5fbWFza19zaXplID0gMCkKKyNkZWZpbmUgS01QX0FGRklOSVRZX0VOQUJMRShtYXNrX3NpemUpIChfX2ttcF9hZmZpbl9tYXNrX3NpemUgPSBtYXNrX3NpemUpCisjZGVmaW5lIEtNUF9DUFVfU0VUX0lURVJBVEUoaSwgbWFzaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGkgPSAobWFzayktPmJlZ2luKCk7IGkgIT0gKG1hc2spLT5lbmQoKTsgaSA9IChtYXNrKS0+bmV4dChpKSkKKyNkZWZpbmUgS01QX0NQVV9TRVQoaSwgbWFzaykgKG1hc2spLT5zZXQoaSkKKyNkZWZpbmUgS01QX0NQVV9JU1NFVChpLCBtYXNrKSAobWFzayktPmlzX3NldChpKQorI2RlZmluZSBLTVBfQ1BVX0NMUihpLCBtYXNrKSAobWFzayktPmNsZWFyKGkpCisjZGVmaW5lIEtNUF9DUFVfWkVSTyhtYXNrKSAobWFzayktPnplcm8oKQorI2RlZmluZSBLTVBfQ1BVX0NPUFkoZGVzdCwgc3JjKSAoZGVzdCktPmNvcHkoc3JjKQorI2RlZmluZSBLTVBfQ1BVX0FORChkZXN0LCBzcmMpIChkZXN0KS0+Yml0d2lzZV9hbmQoc3JjKQorI2RlZmluZSBLTVBfQ1BVX0NPTVBMRU1FTlQobWF4X2JpdF9udW1iZXIsIG1hc2spIChtYXNrKS0+Yml0d2lzZV9ub3QoKQorI2RlZmluZSBLTVBfQ1BVX1VOSU9OKGRlc3QsIHNyYykgKGRlc3QpLT5iaXR3aXNlX29yKHNyYykKKyNkZWZpbmUgS01QX0NQVV9BTExPQyhwdHIpIChwdHIgPSBfX2ttcF9hZmZpbml0eV9kaXNwYXRjaC0+YWxsb2NhdGVfbWFzaygpKQorI2RlZmluZSBLTVBfQ1BVX0ZSRUUocHRyKSBfX2ttcF9hZmZpbml0eV9kaXNwYXRjaC0+ZGVhbGxvY2F0ZV9tYXNrKHB0cikKKyNkZWZpbmUgS01QX0NQVV9BTExPQ19PTl9TVEFDSyhwdHIpIEtNUF9DUFVfQUxMT0MocHRyKQorI2RlZmluZSBLTVBfQ1BVX0ZSRUVfRlJPTV9TVEFDSyhwdHIpIEtNUF9DUFVfRlJFRShwdHIpCisjZGVmaW5lIEtNUF9DUFVfSU5URVJOQUxfQUxMT0MocHRyKSBLTVBfQ1BVX0FMTE9DKHB0cikKKyNkZWZpbmUgS01QX0NQVV9JTlRFUk5BTF9GUkVFKHB0cikgS01QX0NQVV9GUkVFKHB0cikKKyNkZWZpbmUgS01QX0NQVV9JTkRFWChhcnIsIGkpIF9fa21wX2FmZmluaXR5X2Rpc3BhdGNoLT5pbmRleF9tYXNrX2FycmF5KGFyciwgaSkKKyNkZWZpbmUgS01QX0NQVV9BTExPQ19BUlJBWShhcnIsIG4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChhcnIgPSBfX2ttcF9hZmZpbml0eV9kaXNwYXRjaC0+YWxsb2NhdGVfbWFza19hcnJheShuKSkKKyNkZWZpbmUgS01QX0NQVV9GUkVFX0FSUkFZKGFyciwgbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX2FmZmluaXR5X2Rpc3BhdGNoLT5kZWFsbG9jYXRlX21hc2tfYXJyYXkoYXJyKQorI2RlZmluZSBLTVBfQ1BVX0lOVEVSTkFMX0FMTE9DX0FSUkFZKGFyciwgbikgS01QX0NQVV9BTExPQ19BUlJBWShhcnIsIG4pCisjZGVmaW5lIEtNUF9DUFVfSU5URVJOQUxfRlJFRV9BUlJBWShhcnIsIG4pIEtNUF9DUFVfRlJFRV9BUlJBWShhcnIsIG4pCisjZGVmaW5lIF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkobWFzaywgYWJvcnRfYm9vbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAobWFzayktPmdldF9zeXN0ZW1fYWZmaW5pdHkoYWJvcnRfYm9vbCkKKyNkZWZpbmUgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eShtYXNrLCBhYm9ydF9ib29sKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChtYXNrKS0+c2V0X3N5c3RlbV9hZmZpbml0eShhYm9ydF9ib29sKQorI2RlZmluZSBfX2ttcF9nZXRfcHJvY19ncm91cChtYXNrKSAobWFzayktPmdldF9wcm9jX2dyb3VwKCkKKworY2xhc3MgS01QQWZmaW5pdHkgeworcHVibGljOgorICBjbGFzcyBNYXNrIHsKKyAgcHVibGljOgorICAgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3Qgbik7CisgICAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqcCk7CisgICAgdm9pZCAqb3BlcmF0b3IgbmV3W10oc2l6ZV90IG4pOworICAgIHZvaWQgb3BlcmF0b3IgZGVsZXRlW10odm9pZCAqcCk7CisgICAgdmlydHVhbCB+TWFzaygpIHt9CisgICAgLy8gU2V0IGJpdCBpIHRvIDEKKyAgICB2aXJ0dWFsIHZvaWQgc2V0KGludCBpKSB7fQorICAgIC8vIFJldHVybiBiaXQgaQorICAgIHZpcnR1YWwgYm9vbCBpc19zZXQoaW50IGkpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgLy8gU2V0IGJpdCBpIHRvIDAKKyAgICB2aXJ0dWFsIHZvaWQgY2xlYXIoaW50IGkpIHt9CisgICAgLy8gWmVybyBvdXQgZW50aXJlIG1hc2sKKyAgICB2aXJ0dWFsIHZvaWQgemVybygpIHt9CisgICAgLy8gQ29weSBzcmMgaW50byB0aGlzIG1hc2sKKyAgICB2aXJ0dWFsIHZvaWQgY29weShjb25zdCBNYXNrICpzcmMpIHt9CisgICAgLy8gdGhpcyAmPSByaHMKKyAgICB2aXJ0dWFsIHZvaWQgYml0d2lzZV9hbmQoY29uc3QgTWFzayAqcmhzKSB7fQorICAgIC8vIHRoaXMgfD0gcmhzCisgICAgdmlydHVhbCB2b2lkIGJpdHdpc2Vfb3IoY29uc3QgTWFzayAqcmhzKSB7fQorICAgIC8vIHRoaXMgPSB+dGhpcworICAgIHZpcnR1YWwgdm9pZCBiaXR3aXNlX25vdCgpIHt9CisgICAgLy8gQVBJIGZvciBpdGVyYXRpbmcgb3ZlciBhbiBhZmZpbml0eSBtYXNrCisgICAgLy8gZm9yIChpbnQgaSA9IG1hc2stPmJlZ2luKCk7IGkgIT0gbWFzay0+ZW5kKCk7IGkgPSBtYXNrLT5uZXh0KGkpKQorICAgIHZpcnR1YWwgaW50IGJlZ2luKCkgY29uc3QgeyByZXR1cm4gMDsgfQorICAgIHZpcnR1YWwgaW50IGVuZCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFsIGludCBuZXh0KGludCBwcmV2aW91cykgY29uc3QgeyByZXR1cm4gMDsgfQorICAgIC8vIFNldCB0aGUgc3lzdGVtJ3MgYWZmaW5pdHkgdG8gdGhpcyBhZmZpbml0eSBtYXNrJ3MgdmFsdWUKKyAgICB2aXJ0dWFsIGludCBzZXRfc3lzdGVtX2FmZmluaXR5KGJvb2wgYWJvcnRfb25fZXJyb3IpIGNvbnN0IHsgcmV0dXJuIC0xOyB9CisgICAgLy8gU2V0IHRoaXMgYWZmaW5pdHkgbWFzayB0byB0aGUgY3VycmVudCBzeXN0ZW0gYWZmaW5pdHkKKyAgICB2aXJ0dWFsIGludCBnZXRfc3lzdGVtX2FmZmluaXR5KGJvb2wgYWJvcnRfb25fZXJyb3IpIHsgcmV0dXJuIC0xOyB9CisgICAgLy8gT25seSAxIERXT1JEIGluIHRoZSBtYXNrIHNob3VsZCBoYXZlIGFueSBwcm9jcyBzZXQuCisgICAgLy8gUmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBpbmRleCwgb3IgLTEgZm9yIGFuIGludmFsaWQgbWFzay4KKyAgICB2aXJ0dWFsIGludCBnZXRfcHJvY19ncm91cCgpIGNvbnN0IHsgcmV0dXJuIC0xOyB9CisgIH07CisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3Qgbik7CisgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKnApOworICAvLyBOZWVkIHZpcnR1YWwgZGVzdHJ1Y3RvcgorICB2aXJ0dWFsIH5LTVBBZmZpbml0eSgpID0gZGVmYXVsdDsKKyAgLy8gRGV0ZXJtaW5lIGlmIGFmZmluaXR5IGlzIGNhcGFibGUKKyAgdmlydHVhbCB2b2lkIGRldGVybWluZV9jYXBhYmxlKGNvbnN0IGNoYXIgKmVudl92YXIpIHt9CisgIC8vIEJpbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHRvIG9zIHByb2MKKyAgdmlydHVhbCB2b2lkIGJpbmRfdGhyZWFkKGludCBwcm9jKSB7fQorICAvLyBGYWN0b3J5IGZ1bmN0aW9ucyB0byBhbGxvY2F0ZS9kZWFsbG9jYXRlIGEgbWFzaworICB2aXJ0dWFsIE1hc2sgKmFsbG9jYXRlX21hc2soKSB7IHJldHVybiBudWxscHRyOyB9CisgIHZpcnR1YWwgdm9pZCBkZWFsbG9jYXRlX21hc2soTWFzayAqbSkge30KKyAgdmlydHVhbCBNYXNrICphbGxvY2F0ZV9tYXNrX2FycmF5KGludCBudW0pIHsgcmV0dXJuIG51bGxwdHI7IH0KKyAgdmlydHVhbCB2b2lkIGRlYWxsb2NhdGVfbWFza19hcnJheShNYXNrICptKSB7fQorICB2aXJ0dWFsIE1hc2sgKmluZGV4X21hc2tfYXJyYXkoTWFzayAqbSwgaW50IGluZGV4KSB7IHJldHVybiBudWxscHRyOyB9CisgIHN0YXRpYyB2b2lkIHBpY2tfYXBpKCk7CisgIHN0YXRpYyB2b2lkIGRlc3Ryb3lfYXBpKCk7CisgIGVudW0gYXBpX3R5cGUgeworICAgIE5BVElWRV9PUworI2lmIEtNUF9VU0VfSFdMT0MKKyAgICAsCisgICAgSFdMT0MKKyNlbmRpZgorICB9OworICB2aXJ0dWFsIGFwaV90eXBlIGdldF9hcGlfdHlwZSgpIGNvbnN0IHsKKyAgICBLTVBfQVNTRVJUKDApOworICAgIHJldHVybiBOQVRJVkVfT1M7CisgIH07CisKK3ByaXZhdGU6CisgIHN0YXRpYyBib29sIHBpY2tlZF9hcGk7Cit9OworCit0eXBlZGVmIEtNUEFmZmluaXR5OjpNYXNrIGttcF9hZmZpbl9tYXNrX3Q7CitleHRlcm4gS01QQWZmaW5pdHkgKl9fa21wX2FmZmluaXR5X2Rpc3BhdGNoOworCisvLyBEZWNsYXJlIGxvY2FsIGNoYXIgYnVmZmVycyB3aXRoIHRoaXMgc2l6ZSBmb3IgcHJpbnRpbmcgZGVidWcgYW5kIGluZm8KKy8vIG1lc3NhZ2VzLCB1c2luZyBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKCkuCisjZGVmaW5lIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiAxMDI0CisKK2VudW0gYWZmaW5pdHlfdHlwZSB7CisgIGFmZmluaXR5X25vbmUgPSAwLAorICBhZmZpbml0eV9waHlzaWNhbCwKKyAgYWZmaW5pdHlfbG9naWNhbCwKKyAgYWZmaW5pdHlfY29tcGFjdCwKKyAgYWZmaW5pdHlfc2NhdHRlciwKKyAgYWZmaW5pdHlfZXhwbGljaXQsCisgIGFmZmluaXR5X2JhbGFuY2VkLAorICBhZmZpbml0eV9kaXNhYmxlZCwgLy8gbm90IHVzZWQgb3V0c2l6ZSB0aGUgZW52IHZhciBwYXJzZXIKKyAgYWZmaW5pdHlfZGVmYXVsdAorfTsKKworZW51bSBhZmZpbml0eV9ncmFuIHsKKyAgYWZmaW5pdHlfZ3Jhbl9maW5lID0gMCwKKyAgYWZmaW5pdHlfZ3Jhbl90aHJlYWQsCisgIGFmZmluaXR5X2dyYW5fY29yZSwKKyAgYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlLAorICBhZmZpbml0eV9ncmFuX25vZGUsCisjaWYgS01QX0dST1VQX0FGRklOSVRZCisgIC8vIFRoZSAiZ3JvdXAiIGdyYW51bGFyaXR5IGlzbid0IG5lY2Vzc3NhcmlseSBjb2Fyc2VyIHRoYW4gYWxsIG9mIHRoZQorICAvLyBvdGhlciBsZXZlbHMsIGJ1dCB3ZSBwdXQgaXQgbGFzdCBpbiB0aGUgZW51bS4KKyAgYWZmaW5pdHlfZ3Jhbl9ncm91cCwKKyNlbmRpZiAvKiBLTVBfR1JPVVBfQUZGSU5JVFkgKi8KKyAgYWZmaW5pdHlfZ3Jhbl9kZWZhdWx0Cit9OworCitlbnVtIGFmZmluaXR5X3RvcF9tZXRob2QgeworICBhZmZpbml0eV90b3BfbWV0aG9kX2FsbCA9IDAsIC8vIHRyeSBhbGwgKHN1cHBvcnRlZCkgbWV0aG9kcywgaW4gb3JkZXIKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgIGFmZmluaXR5X3RvcF9tZXRob2RfYXBpY2lkLAorICBhZmZpbml0eV90b3BfbWV0aG9kX3gyYXBpY2lkLAorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKyAgYWZmaW5pdHlfdG9wX21ldGhvZF9jcHVpbmZvLCAvLyBLTVBfQ1BVSU5GT19GSUxFIGlzIHVzYWJsZSBvbiBXaW5kb3dzKiBPUywgdG9vCisjaWYgS01QX0dST1VQX0FGRklOSVRZCisgIGFmZmluaXR5X3RvcF9tZXRob2RfZ3JvdXAsCisjZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisgIGFmZmluaXR5X3RvcF9tZXRob2RfZmxhdCwKKyNpZiBLTVBfVVNFX0hXTE9DCisgIGFmZmluaXR5X3RvcF9tZXRob2RfaHdsb2MsCisjZW5kaWYKKyAgYWZmaW5pdHlfdG9wX21ldGhvZF9kZWZhdWx0Cit9OworCisjZGVmaW5lIGFmZmluaXR5X3Jlc3BlY3RfbWFza19kZWZhdWx0ICgtMSkKKworZXh0ZXJuIGVudW0gYWZmaW5pdHlfdHlwZSBfX2ttcF9hZmZpbml0eV90eXBlOyAvKiBBZmZpbml0eSB0eXBlICovCitleHRlcm4gZW51bSBhZmZpbml0eV9ncmFuIF9fa21wX2FmZmluaXR5X2dyYW47IC8qIEFmZmluaXR5IGdyYW51bGFyaXR5ICovCitleHRlcm4gaW50IF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzOyAvKiBjb3JyZXNwb25kaW5nIGludCB2YWx1ZSAqLworZXh0ZXJuIGludCBfX2ttcF9hZmZpbml0eV9kdXBzOyAvKiBBZmZpbml0eSBkdXBsaWNhdGUgbWFza3MgKi8KK2V4dGVybiBlbnVtIGFmZmluaXR5X3RvcF9tZXRob2QgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZDsKK2V4dGVybiBpbnQgX19rbXBfYWZmaW5pdHlfY29tcGFjdDsgLyogQWZmaW5pdHkgJ2NvbXBhY3QnIHZhbHVlICovCitleHRlcm4gaW50IF9fa21wX2FmZmluaXR5X29mZnNldDsgLyogQWZmaW5pdHkgb2Zmc2V0IHZhbHVlICAqLworZXh0ZXJuIGludCBfX2ttcF9hZmZpbml0eV92ZXJib3NlOyAvKiBXYXMgdmVyYm9zZSBzcGVjaWZpZWQgZm9yIEtNUF9BRkZJTklUWT8gKi8KK2V4dGVybiBpbnQgX19rbXBfYWZmaW5pdHlfd2FybmluZ3M7IC8qIEtNUF9BRkZJTklUWSB3YXJuaW5ncyBlbmFibGVkID8gKi8KK2V4dGVybiBpbnQgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrOyAvLyBSZXNwZWN0IHByb2Nlc3MnIGluaXQgYWZmaW5pdHkgbWFzaz8KK2V4dGVybiBjaGFyICpfX2ttcF9hZmZpbml0eV9wcm9jbGlzdDsgLyogcHJvYyBJRCBsaXN0ICovCitleHRlcm4ga21wX2FmZmluX21hc2tfdCAqX19rbXBfYWZmaW5pdHlfbWFza3M7CitleHRlcm4gdW5zaWduZWQgX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzOworZXh0ZXJuIHZvaWQgX19rbXBfYWZmaW5pdHlfYmluZF90aHJlYWQoaW50IHdoaWNoKTsKKworZXh0ZXJuIGttcF9hZmZpbl9tYXNrX3QgKl9fa21wX2FmZmluX2Z1bGxNYXNrOworZXh0ZXJuIGNoYXIgY29uc3QgKl9fa21wX2NwdWluZm9fZmlsZTsKKworI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8vIFRoaXMgbmVlZHMgdG8gYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIHZhbHVlcyBpbiBvbXAuaCAhISEKK3R5cGVkZWYgZW51bSBrbXBfcHJvY19iaW5kX3QgeworICBwcm9jX2JpbmRfZmFsc2UgPSAwLAorICBwcm9jX2JpbmRfdHJ1ZSwKKyAgcHJvY19iaW5kX21hc3RlciwKKyAgcHJvY19iaW5kX2Nsb3NlLAorICBwcm9jX2JpbmRfc3ByZWFkLAorICBwcm9jX2JpbmRfaW50ZWwsIC8vIHVzZSBLTVBfQUZGSU5JVFkgaW50ZXJmYWNlCisgIHByb2NfYmluZF9kZWZhdWx0Cit9IGttcF9wcm9jX2JpbmRfdDsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX25lc3RlZF9wcm9jX2JpbmRfdCB7CisgIGttcF9wcm9jX2JpbmRfdCAqYmluZF90eXBlczsKKyAgaW50IHNpemU7CisgIGludCB1c2VkOworfSBrbXBfbmVzdGVkX3Byb2NfYmluZF90OworCitleHRlcm4ga21wX25lc3RlZF9wcm9jX2JpbmRfdCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kOworCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyNkZWZpbmUgS01QX1BMQUNFX0FMTCAoLTEpCisjZGVmaW5lIEtNUF9QTEFDRV9VTkRFRklORUQgKC0yKQorI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworZXh0ZXJuIGludCBfX2ttcF9hZmZpbml0eV9udW1fcGxhY2VzOworCisjaWYgT01QXzQwX0VOQUJMRUQKK3R5cGVkZWYgZW51bSBrbXBfY2FuY2VsX2tpbmRfdCB7CisgIGNhbmNlbF9ub3JlcSA9IDAsCisgIGNhbmNlbF9wYXJhbGxlbCA9IDEsCisgIGNhbmNlbF9sb29wID0gMiwKKyAgY2FuY2VsX3NlY3Rpb25zID0gMywKKyAgY2FuY2VsX3Rhc2tncm91cCA9IDQKK30ga21wX2NhbmNlbF9raW5kX3Q7CisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworLy8gS01QX0hXX1NVQlNFVCBzdXBwb3J0OgordHlwZWRlZiBzdHJ1Y3Qga21wX2h3c19pdGVtIHsKKyAgaW50IG51bTsKKyAgaW50IG9mZnNldDsKK30ga21wX2h3c19pdGVtX3Q7CisKK2V4dGVybiBrbXBfaHdzX2l0ZW1fdCBfX2ttcF9od3Nfc29ja2V0OworZXh0ZXJuIGttcF9od3NfaXRlbV90IF9fa21wX2h3c19ub2RlOworZXh0ZXJuIGttcF9od3NfaXRlbV90IF9fa21wX2h3c190aWxlOworZXh0ZXJuIGttcF9od3NfaXRlbV90IF9fa21wX2h3c19jb3JlOworZXh0ZXJuIGttcF9od3NfaXRlbV90IF9fa21wX2h3c19wcm9jOworZXh0ZXJuIGludCBfX2ttcF9od3NfcmVxdWVzdGVkOworZXh0ZXJuIGludCBfX2ttcF9od3NfYWJzX2ZsYWc7IC8vIGFic29sdXRlIG9yIHBlci1pdGVtIG51bWJlciByZXF1ZXN0ZWQKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgS01QX1BBRCh0eXBlLCBzeikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChzaXplb2YodHlwZSkgKyAoc3ogLSAoKHNpemVvZih0eXBlKSAtIDEpICUgKHN6KSkgLSAxKSkKKworLy8gV2UgbmVlZCB0byBhdm9pZCB1c2luZyAtMSBhcyBhIEdUSUQgYXMgKzEgaXMgYWRkZWQgdG8gdGhlIGd0aWQKKy8vIHdoZW4gc3RvcmluZyBpdCBpbiBhIGxvY2ssIGFuZCB0aGUgdmFsdWUgMCBpcyByZXNlcnZlZC4KKyNkZWZpbmUgS01QX0dUSURfRE5FICgtMikgLyogRG9lcyBub3QgZXhpc3QgKi8KKyNkZWZpbmUgS01QX0dUSURfU0hVVERPV04gKC0zKSAvKiBMaWJyYXJ5IGlzIHNodXR0aW5nIGRvd24gKi8KKyNkZWZpbmUgS01QX0dUSURfTU9OSVRPUiAoLTQpIC8qIE1vbml0b3IgdGhyZWFkIElEICovCisjZGVmaW5lIEtNUF9HVElEX1VOS05PV04gKC01KSAvKiBJcyBub3Qga25vd24gKi8KKyNkZWZpbmUgS01QX0dUSURfTUlOICgtNikgLyogTWluaW1hbCBndGlkIGZvciBsb3cgYm91bmQgY2hlY2sgaW4gREVCVUcgKi8KKworI2RlZmluZSBfX2ttcF9nZXRfZ3RpZCgpIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkKCkKKyNkZWZpbmUgX19rbXBfZW50cnlfZ3RpZCgpIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkX3JlZygpCisKKyNkZWZpbmUgX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChLTVBfREVCVUdfQVNTRVJUKChndGlkKSA+PSAwKSwgX19rbXBfdGhyZWFkc1soZ3RpZCldLT50aC50aF9pbmZvLmRzLmRzX3RpZCkKKworI2RlZmluZSBfX2ttcF9nZXRfdGlkKCkgKF9fa21wX3RpZF9mcm9tX2d0aWQoX19rbXBfZ2V0X2d0aWQoKSkpCisjZGVmaW5lIF9fa21wX2d0aWRfZnJvbV90aWQodGlkLCB0ZWFtKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoS01QX0RFQlVHX0FTU0VSVCgodGlkKSA+PSAwICYmICh0ZWFtKSAhPSBOVUxMKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHRlYW0tPnQudF90aHJlYWRzWyh0aWQpXS0+dGgudGhfaW5mby5kcy5kc19ndGlkKQorCisjZGVmaW5lIF9fa21wX2dldF90ZWFtKCkgKF9fa21wX3RocmVhZHNbKF9fa21wX2dldF9ndGlkKCkpXS0+dGgudGhfdGVhbSkKKyNkZWZpbmUgX19rbXBfdGVhbV9mcm9tX2d0aWQoZ3RpZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChLTVBfREVCVUdfQVNTRVJUKChndGlkKSA+PSAwKSwgX19rbXBfdGhyZWFkc1soZ3RpZCldLT50aC50aF90ZWFtKQorCisjZGVmaW5lIF9fa21wX3RocmVhZF9mcm9tX2d0aWQoZ3RpZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoS01QX0RFQlVHX0FTU0VSVCgoZ3RpZCkgPj0gMCksIF9fa21wX3RocmVhZHNbKGd0aWQpXSkKKyNkZWZpbmUgX19rbXBfZ2V0X3RocmVhZCgpIChfX2ttcF90aHJlYWRfZnJvbV9ndGlkKF9fa21wX2dldF9ndGlkKCkpKQorCisvLyBSZXR1cm5zIGN1cnJlbnQgdGhyZWFkIChwb2ludGVyIHRvIGttcF9pbmZvX3QpLiBJbiBjb250cmFzdCB0bworLy8gX19rbXBfZ2V0X3RocmVhZCgpLCBpdCB3b3JrcyB3aXRoIHJlZ2lzdGVyZWQgYW5kIG5vdC15ZXQtcmVnaXN0ZXJlZCB0aHJlYWRzLgorI2RlZmluZSBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRocikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEtNUF9ERUJVR19BU1NFUlQoKHRocikgIT0gTlVMTCksICh0aHIpLT50aC50aF9pbmZvLmRzLmRzX2d0aWQpCisKKy8vIEFUOiBXaGljaCB3YXkgaXMgY29ycmVjdD8KKy8vIEFUOiAxLiBucHJvYyA9IF9fa21wX3RocmVhZHNbICggZ3RpZCApIF0gLT4gdGgudGhfdGVhbSAtPiB0LnRfbnByb2M7CisvLyBBVDogMi4gbnByb2MgPSBfX2ttcF90aHJlYWRzWyAoIGd0aWQgKSBdIC0+IHRoLnRoX3RlYW1fbnByb2M7CisjZGVmaW5lIF9fa21wX2dldF90ZWFtX251bV90aHJlYWRzKGd0aWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoX19rbXBfdGhyZWFkc1soZ3RpZCldLT50aC50aF90ZWFtLT50LnRfbnByb2MpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEtNUF9VSU5UNjRfTUFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAofigoa21wX3VpbnQ2NCkxIDw8ICgoc2l6ZW9mKGttcF91aW50NjQpICogKDEgPDwgMykpIC0gMSkpKQorCisjZGVmaW5lIEtNUF9NSU5fTlRIIDEKKworI2lmbmRlZiBLTVBfTUFYX05USAorI2lmIGRlZmluZWQoUFRIUkVBRF9USFJFQURTX01BWCkgJiYgUFRIUkVBRF9USFJFQURTX01BWCA8IElOVF9NQVgKKyNkZWZpbmUgS01QX01BWF9OVEggUFRIUkVBRF9USFJFQURTX01BWAorI2Vsc2UKKyNkZWZpbmUgS01QX01BWF9OVEggSU5UX01BWAorI2VuZGlmCisjZW5kaWYgLyogS01QX01BWF9OVEggKi8KKworI2lmZGVmIFBUSFJFQURfU1RBQ0tfTUlOCisjZGVmaW5lIEtNUF9NSU5fU1RLU0laRSBQVEhSRUFEX1NUQUNLX01JTgorI2Vsc2UKKyNkZWZpbmUgS01QX01JTl9TVEtTSVpFICgoc2l6ZV90KSgzMiAqIDEwMjQpKQorI2VuZGlmCisKKyNkZWZpbmUgS01QX01BWF9TVEtTSVpFICh+KChzaXplX3QpMSA8PCAoKHNpemVvZihzaXplX3QpICogKDEgPDwgMykpIC0gMSkpKQorCisjaWYgS01QX0FSQ0hfWDg2CisjZGVmaW5lIEtNUF9ERUZBVUxUX1NUS1NJWkUgKChzaXplX3QpKDIgKiAxMDI0ICogMTAyNCkpCisjZWxpZiBLTVBfQVJDSF9YODZfNjQKKyNkZWZpbmUgS01QX0RFRkFVTFRfU1RLU0laRSAoKHNpemVfdCkoNCAqIDEwMjQgKiAxMDI0KSkKKyNkZWZpbmUgS01QX0JBQ0tVUF9TVEtTSVpFICgoc2l6ZV90KSgyICogMTAyNCAqIDEwMjQpKQorI2Vsc2UKKyNkZWZpbmUgS01QX0RFRkFVTFRfU1RLU0laRSAoKHNpemVfdCkoMTAyNCAqIDEwMjQpKQorI2VuZGlmCisKKyNkZWZpbmUgS01QX0RFRkFVTFRfTUFMTE9DX1BPT0xfSU5DUiAoKHNpemVfdCkoMTAyNCAqIDEwMjQpKQorI2RlZmluZSBLTVBfTUlOX01BTExPQ19QT09MX0lOQ1IgKChzaXplX3QpKDQgKiAxMDI0KSkKKyNkZWZpbmUgS01QX01BWF9NQUxMT0NfUE9PTF9JTkNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICh+KChzaXplX3QpMSA8PCAoKHNpemVvZihzaXplX3QpICogKDEgPDwgMykpIC0gMSkpKQorCisjZGVmaW5lIEtNUF9NSU5fU1RLT0ZGU0VUICgwKQorI2RlZmluZSBLTVBfTUFYX1NUS09GRlNFVCBLTVBfTUFYX1NUS1NJWkUKKyNpZiBLTVBfT1NfREFSV0lOCisjZGVmaW5lIEtNUF9ERUZBVUxUX1NUS09GRlNFVCBLTVBfTUlOX1NUS09GRlNFVAorI2Vsc2UKKyNkZWZpbmUgS01QX0RFRkFVTFRfU1RLT0ZGU0VUIENBQ0hFX0xJTkUKKyNlbmRpZgorCisjZGVmaW5lIEtNUF9NSU5fU1RLUEFERElORyAoMCkKKyNkZWZpbmUgS01QX01BWF9TVEtQQURESU5HICgyICogMTAyNCAqIDEwMjQpCisKKyNkZWZpbmUgS01QX0JMT0NLVElNRV9NVUxUSVBMSUVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgxMDAwKSAvKiBudW1iZXIgb2YgYmxvY2t0aW1lIHVuaXRzIHBlciBzZWNvbmQgKi8KKyNkZWZpbmUgS01QX01JTl9CTE9DS1RJTUUgKDApCisjZGVmaW5lIEtNUF9NQVhfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoSU5UX01BWCkgLyogTXVzdCBiZSB0aGlzIGZvciAiaW5maW5pdGUiIHNldHRpbmcgdGhlIHdvcmsgKi8KKyNkZWZpbmUgS01QX0RFRkFVTFRfQkxPQ0tUSU1FICgyMDApIC8qICBfX2ttcF9ibG9ja3RpbWUgaXMgaW4gbWlsbGlzZWNvbmRzICAqLworCisjaWYgS01QX1VTRV9NT05JVE9SCisjZGVmaW5lIEtNUF9ERUZBVUxUX01PTklUT1JfU1RLU0laRSAoKHNpemVfdCkoNjQgKiAxMDI0KSkKKyNkZWZpbmUgS01QX01JTl9NT05JVE9SX1dBS0VVUFMgKDEpIC8vIG1pbiB0aW1lcyBtb25pdG9yIHdha2VzIHVwIHBlciBzZWNvbmQKKyNkZWZpbmUgS01QX01BWF9NT05JVE9SX1dBS0VVUFMgKDEwMDApIC8vIG1heCB0aW1lcyBtb25pdG9yIGNhbiB3YWtlIHVwIHBlciBzZWMKKworLyogQ2FsY3VsYXRlIG5ldyBudW1iZXIgb2YgbW9uaXRvciB3YWtldXBzIGZvciBhIHNwZWNpZmljIGJsb2NrIHRpbWUgYmFzZWQgb24KKyAgIHByZXZpb3VzIG1vbml0b3Jfd2FrZXVwcy4gT25seSBhbGxvdyBpbmNyZWFzaW5nIG51bWJlciBvZiB3YWtldXBzICovCisjZGVmaW5lIEtNUF9XQUtFVVBTX0ZST01fQkxPQ0tUSU1FKGJsb2NrdGltZSwgbW9uaXRvcl93YWtldXBzKSAgICAgICAgICAgICAgICAgXAorICAoKChibG9ja3RpbWUpID09IEtNUF9NQVhfQkxPQ0tUSU1FKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA/IChtb25pdG9yX3dha2V1cHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgOiAoKGJsb2NrdGltZSkgPT0gS01QX01JTl9CTE9DS1RJTUUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgID8gS01QX01BWF9NT05JVE9SX1dBS0VVUFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICA6ICgobW9uaXRvcl93YWtldXBzKSA+IChLTVBfQkxPQ0tUSU1FX01VTFRJUExJRVIgLyAoYmxvY2t0aW1lKSkpICBcCisgICAgICAgICAgICAgICAgICAgPyAobW9uaXRvcl93YWtldXBzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIDogKEtNUF9CTE9DS1RJTUVfTVVMVElQTElFUikgLyAoYmxvY2t0aW1lKSkKKworLyogQ2FsY3VsYXRlIG51bWJlciBvZiBpbnRlcnZhbHMgZm9yIGEgc3BlY2lmaWMgYmxvY2sgdGltZSBiYXNlZCBvbgorICAgbW9uaXRvcl93YWtldXBzICovCisjZGVmaW5lIEtNUF9JTlRFUlZBTFNfRlJPTV9CTE9DS1RJTUUoYmxvY2t0aW1lLCBtb25pdG9yX3dha2V1cHMpICAgICAgICAgICAgICAgXAorICAoKChibG9ja3RpbWUpICsgKEtNUF9CTE9DS1RJTUVfTVVMVElQTElFUiAvIChtb25pdG9yX3dha2V1cHMpKSAtIDEpIC8gICAgICAgIFwKKyAgIChLTVBfQkxPQ0tUSU1FX01VTFRJUExJRVIgLyAobW9uaXRvcl93YWtldXBzKSkpCisjZWxzZQorI2lmIEtNUF9PU19VTklYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0KQorLy8gSFcgVFNDIGlzIHVzZWQgdG8gcmVkdWNlIG92ZXJoZWFkIChjbG9jayB0aWNrIGluc3RlYWQgb2YgbmFub3NlY29uZCkuCitleHRlcm4ga21wX3VpbnQ2NCBfX2ttcF90aWNrc19wZXJfbXNlYzsKKyNpZiBLTVBfQ09NUElMRVJfSUNDCisjZGVmaW5lIEtNUF9OT1coKSBfcmR0c2MoKQorI2Vsc2UKKyNkZWZpbmUgS01QX05PVygpIF9fa21wX2hhcmR3YXJlX3RpbWVzdGFtcCgpCisjZW5kaWYKKyNkZWZpbmUgS01QX05PV19NU0VDKCkgKEtNUF9OT1coKSAvIF9fa21wX3RpY2tzX3Blcl9tc2VjKQorI2RlZmluZSBLTVBfQkxPQ0tUSU1FX0lOVEVSVkFMKCkgKF9fa21wX2RmbHRfYmxvY2t0aW1lICogX19rbXBfdGlja3NfcGVyX21zZWMpCisjZGVmaW5lIEtNUF9CTE9DS0lORyhnb2FsLCBjb3VudCkgKChnb2FsKSA+IEtNUF9OT1coKSkKKyNlbHNlCisvLyBTeXN0ZW0gdGltZSBpcyByZXRyaWV2ZWQgc3BvcmFkaWNhbGx5IHdoaWxlIGJsb2NraW5nLgorZXh0ZXJuIGttcF91aW50NjQgX19rbXBfbm93X25zZWMoKTsKKyNkZWZpbmUgS01QX05PVygpIF9fa21wX25vd19uc2VjKCkKKyNkZWZpbmUgS01QX05PV19NU0VDKCkgKEtNUF9OT1coKSAvIEtNUF9VU0VDX1BFUl9TRUMpCisjZGVmaW5lIEtNUF9CTE9DS1RJTUVfSU5URVJWQUwoKSAoX19rbXBfZGZsdF9ibG9ja3RpbWUgKiBLTVBfVVNFQ19QRVJfU0VDKQorI2RlZmluZSBLTVBfQkxPQ0tJTkcoZ29hbCwgY291bnQpICgoY291bnQpICUgMTAwMCAhPSAwIHx8IChnb2FsKSA+IEtNUF9OT1coKSkKKyNlbmRpZgorI2RlZmluZSBLTVBfWUlFTERfTk9XKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEtNUF9OT1dfTVNFQygpIC8gS01QX01BWChfX2ttcF9kZmx0X2Jsb2NrdGltZSwgMSkgJSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKF9fa21wX3lpZWxkX29uX2NvdW50ICsgX19rbXBfeWllbGRfb2ZmX2NvdW50KSA8ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKGttcF91aW50MzIpX19rbXBfeWllbGRfb25fY291bnQpCisjZW5kaWYgLy8gS01QX1VTRV9NT05JVE9SCisKKyNkZWZpbmUgS01QX01JTl9TVEFUU0NPTFMgNDAKKyNkZWZpbmUgS01QX01BWF9TVEFUU0NPTFMgNDA5NgorI2RlZmluZSBLTVBfREVGQVVMVF9TVEFUU0NPTFMgODAKKworI2RlZmluZSBLTVBfTUlOX0lOVEVSVkFMIDAKKyNkZWZpbmUgS01QX01BWF9JTlRFUlZBTCAoSU5UX01BWCAtIDEpCisjZGVmaW5lIEtNUF9ERUZBVUxUX0lOVEVSVkFMIDAKKworI2RlZmluZSBLTVBfTUlOX0NIVU5LIDEKKyNkZWZpbmUgS01QX01BWF9DSFVOSyAoSU5UX01BWCAtIDEpCisjZGVmaW5lIEtNUF9ERUZBVUxUX0NIVU5LIDEKKworI2RlZmluZSBLTVBfTUlOX0lOSVRfV0FJVCAxCisjZGVmaW5lIEtNUF9NQVhfSU5JVF9XQUlUIChJTlRfTUFYIC8gMikKKyNkZWZpbmUgS01QX0RFRkFVTFRfSU5JVF9XQUlUIDIwNDhVCisKKyNkZWZpbmUgS01QX01JTl9ORVhUX1dBSVQgMQorI2RlZmluZSBLTVBfTUFYX05FWFRfV0FJVCAoSU5UX01BWCAvIDIpCisjZGVmaW5lIEtNUF9ERUZBVUxUX05FWFRfV0FJVCAxMDI0VQorCisjZGVmaW5lIEtNUF9ERkxUX0RJU1BfTlVNX0JVRkYgNworI2RlZmluZSBLTVBfTUFYX09SREVSRUQgOAorCisjZGVmaW5lIEtNUF9NQVhfRklFTERTIDMyCisKKyNkZWZpbmUgS01QX01BWF9CUkFOQ0hfQklUUyAzMQorCisjZGVmaW5lIEtNUF9NQVhfQUNUSVZFX0xFVkVMU19MSU1JVCBJTlRfTUFYCisKKyNkZWZpbmUgS01QX01BWF9ERUZBVUxUX0RFVklDRV9MSU1JVCBJTlRfTUFYCisKKyNkZWZpbmUgS01QX01BWF9UQVNLX1BSSU9SSVRZX0xJTUlUIElOVF9NQVgKKworLyogTWluaW11bSBudW1iZXIgb2YgdGhyZWFkcyBiZWZvcmUgc3dpdGNoIHRvIFRMUyBndGlkIChleHBlcmltZW50YWxseQorICAgZGV0ZXJtaW5lZCkgKi8KKy8qIGpvc2ggVE9ETzogd2hhdCBhYm91dCBPUyBYKiB0dW5pbmc/ICovCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorI2RlZmluZSBLTVBfVExTX0dUSURfTUlOIDUKKyNlbHNlCisjZGVmaW5lIEtNUF9UTFNfR1RJRF9NSU4gSU5UX01BWAorI2VuZGlmCisKKyNkZWZpbmUgS01QX01BU1RFUl9USUQodGlkKSAoKHRpZCkgPT0gMCkKKyNkZWZpbmUgS01QX1dPUktFUl9USUQodGlkKSAoKHRpZCkgIT0gMCkKKworI2RlZmluZSBLTVBfTUFTVEVSX0dUSUQoZ3RpZCkgKF9fa21wX3RpZF9mcm9tX2d0aWQoKGd0aWQpKSA9PSAwKQorI2RlZmluZSBLTVBfV09SS0VSX0dUSUQoZ3RpZCkgKF9fa21wX3RpZF9mcm9tX2d0aWQoKGd0aWQpKSAhPSAwKQorI2RlZmluZSBLTVBfVUJFUl9HVElEKGd0aWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEtNUF9ERUJVR19BU1NFUlQoKGd0aWQpID49IEtNUF9HVElEX01JTiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBLTVBfREVCVUdfQVNTRVJUKChndGlkKSA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKGd0aWQpID49IDAgJiYgX19rbXBfcm9vdFsoZ3RpZCldICYmIF9fa21wX3RocmVhZHNbKGd0aWQpXSAmJiAgICAgICAgICAgICAgIFwKKyAgICAgICAoX19rbXBfdGhyZWFkc1soZ3RpZCldID09IF9fa21wX3Jvb3RbKGd0aWQpXS0+ci5yX3ViZXJfdGhyZWFkKSkKKyNkZWZpbmUgS01QX0lOSVRJQUxfR1RJRChndGlkKSAoKGd0aWQpID09IDApCisKKyNpZm5kZWYgVFJVRQorI2RlZmluZSBGQUxTRSAwCisjZGVmaW5lIFRSVUUgKCFGQUxTRSkKKyNlbmRpZgorCisvKiBOT1RFOiBhbGwgb2YgdGhlIGZvbGxvd2luZyBjb25zdGFudHMgbXVzdCBiZSBldmVuICovCisKKyNpZiBLTVBfT1NfV0lORE9XUworI2RlZmluZSBLTVBfSU5JVF9XQUlUIDY0VSAvKiBpbml0aWFsIG51bWJlciBvZiBzcGluLXRlc3RzICAgKi8KKyNkZWZpbmUgS01QX05FWFRfV0FJVCAzMlUgLyogc3VzZXF1ZW50IG51bWJlciBvZiBzcGluLXRlc3RzICovCisjZWxpZiBLTVBfT1NfQ05LCisjZGVmaW5lIEtNUF9JTklUX1dBSVQgMTZVIC8qIGluaXRpYWwgbnVtYmVyIG9mIHNwaW4tdGVzdHMgICAqLworI2RlZmluZSBLTVBfTkVYVF9XQUlUIDhVIC8qIHN1c2VxdWVudCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAqLworI2VsaWYgS01QX09TX0xJTlVYCisjZGVmaW5lIEtNUF9JTklUX1dBSVQgMTAyNFUgLyogaW5pdGlhbCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAgICovCisjZGVmaW5lIEtNUF9ORVhUX1dBSVQgNTEyVSAvKiBzdXNlcXVlbnQgbnVtYmVyIG9mIHNwaW4tdGVzdHMgKi8KKyNlbGlmIEtNUF9PU19EQVJXSU4KKy8qIFRPRE86IHR1bmUgZm9yIEtNUF9PU19EQVJXSU4gKi8KKyNkZWZpbmUgS01QX0lOSVRfV0FJVCAxMDI0VSAvKiBpbml0aWFsIG51bWJlciBvZiBzcGluLXRlc3RzICAgKi8KKyNkZWZpbmUgS01QX05FWFRfV0FJVCA1MTJVIC8qIHN1c2VxdWVudCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAqLworI2VsaWYgS01QX09TX0ZSRUVCU0QKKy8qIFRPRE86IHR1bmUgZm9yIEtNUF9PU19GUkVFQlNEICovCisjZGVmaW5lIEtNUF9JTklUX1dBSVQgMTAyNFUgLyogaW5pdGlhbCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAgICovCisjZGVmaW5lIEtNUF9ORVhUX1dBSVQgNTEyVSAvKiBzdXNlcXVlbnQgbnVtYmVyIG9mIHNwaW4tdGVzdHMgKi8KKyNlbGlmIEtNUF9PU19ORVRCU0QKKy8qIFRPRE86IHR1bmUgZm9yIEtNUF9PU19ORVRCU0QgKi8KKyNkZWZpbmUgS01QX0lOSVRfV0FJVCAxMDI0VSAvKiBpbml0aWFsIG51bWJlciBvZiBzcGluLXRlc3RzICAgKi8KKyNkZWZpbmUgS01QX05FWFRfV0FJVCA1MTJVIC8qIHN1c2VxdWVudCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAqLworI2VuZGlmCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0Cit0eXBlZGVmIHN0cnVjdCBrbXBfY3B1aWQgeworICBrbXBfdWludDMyIGVheDsKKyAga21wX3VpbnQzMiBlYng7CisgIGttcF91aW50MzIgZWN4OworICBrbXBfdWludDMyIGVkeDsKK30ga21wX2NwdWlkX3Q7CitleHRlcm4gdm9pZCBfX2ttcF94ODZfY3B1aWQoaW50IG1vZGUsIGludCBtb2RlMiwgc3RydWN0IGttcF9jcHVpZCAqcCk7CisjaWYgS01QX0FSQ0hfWDg2CitleHRlcm4gdm9pZCBfX2ttcF94ODZfcGF1c2Uodm9pZCk7CisjZWxpZiBLTVBfTUlDCisvLyBQZXJmb3JtYW5jZSB0ZXN0aW5nIG9uIEtOQyAoQzBRUy03MTIwIFAvQS9YL0QsIDYxLWNvcmUsIDE2IEdCIE1lbW9yeSkgc2hvd2VkCisvLyByZWdyZXNzaW9uIGFmdGVyIHJlbW92YWwgb2YgZXh0cmEgUEFVU0UgZnJvbSBLTVBfWUlFTERfU1BJTigpLiBDaGFuZ2luZworLy8gdGhlIGRlbGF5IGZyb20gMTAwIHRvIDMwMCBzaG93ZWQgZXZlbiBiZXR0ZXIgcGVyZm9ybWFuY2UgdGhhbiBkb3VibGUgUEFVU0UKKy8vIG9uIFNwZWMgT01QMjAwMSBhbmQgTENQQyB0YXNraW5nIHRlc3RzLCBubyByZWdyZXNzaW9ucyBvbiBFUENDLgorc3RhdGljIHZvaWQgX19rbXBfeDg2X3BhdXNlKHZvaWQpIHsgX21tX2RlbGF5XzMyKDMwMCk7IH0KKyNlbHNlCitzdGF0aWMgdm9pZCBfX2ttcF94ODZfcGF1c2Uodm9pZCkgeyBfbW1fcGF1c2UoKTsgfQorI2VuZGlmCisjZGVmaW5lIEtNUF9DUFVfUEFVU0UoKSBfX2ttcF94ODZfcGF1c2UoKQorI2VsaWYgS01QX0FSQ0hfUFBDNjQKKyNkZWZpbmUgS01QX1BQQzY0X1BSSV9MT1coKSBfX2FzbV9fIHZvbGF0aWxlKCJvciAxLCAxLCAxIikKKyNkZWZpbmUgS01QX1BQQzY0X1BSSV9NRUQoKSBfX2FzbV9fIHZvbGF0aWxlKCJvciAyLCAyLCAyIikKKyNkZWZpbmUgS01QX1BQQzY0X1BSSV9MT0NfTUIoKSBfX2FzbV9fIHZvbGF0aWxlKCIiIDogOiA6ICJtZW1vcnkiKQorI2RlZmluZSBLTVBfQ1BVX1BBVVNFKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX1BQQzY0X1BSSV9MT1coKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9QUEM2NF9QUklfTUVEKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfUFBDNjRfUFJJX0xPQ19NQigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBLTVBfQ1BVX1BBVVNFKCkgLyogbm90aGluZyB0byBkbyAqLworI2VuZGlmCisKKyNkZWZpbmUgS01QX0lOSVRfWUlFTEQoY291bnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgKGNvdW50KSA9IF9fa21wX3lpZWxkX2luaXQ7IH0KKworI2RlZmluZSBLTVBfWUlFTEQoY29uZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0NQVV9QQVVTRSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX3lpZWxkKChjb25kKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisvLyBOb3RlIHRoZSBkZWNyZW1lbnQgb2YgMiBpbiB0aGUgZm9sbG93aW5nIE1hY3Jvcy4gV2l0aCBLTVBfTElCUkFSWT10dXJuYXJvdW5kLAorLy8gdGhlcmUgc2hvdWxkIGJlIG5vIHlpZWxkaW5nIHNpbmNlIGluaXRpYWwgdmFsdWUgZnJvbSBLTVBfSU5JVF9ZSUVMRCgpIGlzIG9kZC4KKworI2RlZmluZSBLTVBfWUlFTERfV0hFTihjb25kLCBjb3VudCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0NQVV9QQVVTRSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChjb3VudCkgLT0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIShjb3VudCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBfX2ttcF95aWVsZChjb25kKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKGNvdW50KSA9IF9fa21wX3lpZWxkX25leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNkZWZpbmUgS01QX1lJRUxEX1NQSU4oY291bnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9DUFVfUEFVU0UoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoY291bnQpIC09IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCEoY291bnQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX19rbXBfeWllbGQoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChjb3VudCkgPSBfX2ttcF95aWVsZF9uZXh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogU3VwcG9ydCBkYXRhdHlwZXMgZm9yIHRoZSBvcnBoYW5lZCBjb25zdHJ1Y3QgbmVzdGluZyBjaGVja3MuICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZW51bSBjb25zX3R5cGUgeworICBjdF9ub25lLAorICBjdF9wYXJhbGxlbCwKKyAgY3RfcGRvLAorICBjdF9wZG9fb3JkZXJlZCwKKyAgY3RfcHNlY3Rpb25zLAorICBjdF9wc2luZ2xlLAorCisgIC8qIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSBsZWZ0IGluIG9yZGVyIGFuZCBub3Qgc3BsaXQgdXAgKi8KKyAgY3RfdGFza3EsCisgIGN0X3Rhc2ssIC8vIHJlYWxseSB0YXNrIGluc2lkZSBub24tb3JkZXJlZCB0YXNrcSwgY29uc2lkZXJlZCB3b3Jrc2hhcmluZyB0eXBlCisgIGN0X3Rhc2tfb3JkZXJlZCwgLyogcmVhbGx5IHRhc2sgaW5zaWRlIG9yZGVyZWQgdGFza3EsIGNvbnNpZGVyZWQgYSB3b3Jrc2hhcmluZworICAgICAgICAgICAgICAgICAgICAgIHR5cGUgKi8KKyAgLyogdGhlIHByZWNlZGluZyBtdXN0IGJlIGxlZnQgaW4gb3JkZXIgYW5kIG5vdCBzcGxpdCB1cCAqLworCisgIGN0X2NyaXRpY2FsLAorICBjdF9vcmRlcmVkX2luX3BhcmFsbGVsLAorICBjdF9vcmRlcmVkX2luX3BkbywKKyAgY3Rfb3JkZXJlZF9pbl90YXNrcSwKKyAgY3RfbWFzdGVyLAorICBjdF9yZWR1Y2UsCisgIGN0X2JhcnJpZXIKK307CisKKy8qIHRlc3QgdG8gc2VlIGlmIHdlIGFyZSBpbiBhIHRhc2txIGNvbnN0cnVjdCAqLworI2RlZmluZSBJU19DT05TX1RZUEVfVEFTS1EoY3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoaW50KShjdCkpID49ICgoaW50KWN0X3Rhc2txKSAmJiAoKGludCkoY3QpKSA8PSAoKGludCljdF90YXNrX29yZGVyZWQpKQorI2RlZmluZSBJU19DT05TX1RZUEVfT1JERVJFRChjdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChjdCkgPT0gY3RfcGRvX29yZGVyZWQgfHwgKGN0KSA9PSBjdF90YXNrX29yZGVyZWQpCisKK3N0cnVjdCBjb25zX2RhdGEgeworICBpZGVudF90IGNvbnN0ICppZGVudDsKKyAgZW51bSBjb25zX3R5cGUgdHlwZTsKKyAgaW50IHByZXY7CisgIGttcF91c2VyX2xvY2tfcAorICAgICAgbmFtZTsgLyogYWRkcmVzcyBleGNsdXNpdmVseSBmb3IgY3JpdGljYWwgc2VjdGlvbiBuYW1lIGNvbXBhcmlzb24gKi8KK307CisKK3N0cnVjdCBjb25zX2hlYWRlciB7CisgIGludCBwX3RvcCwgd190b3AsIHNfdG9wOworICBpbnQgc3RhY2tfc2l6ZSwgc3RhY2tfdG9wOworICBzdHJ1Y3QgY29uc19kYXRhICpzdGFja19kYXRhOworfTsKKworc3RydWN0IGttcF9yZWdpb25faW5mbyB7CisgIGNoYXIgKnRleHQ7CisgIGludCBvZmZzZXRbS01QX01BWF9GSUVMRFNdOworICBpbnQgbGVuZ3RoW0tNUF9NQVhfRklFTERTXTsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9PU19XSU5ET1dTCit0eXBlZGVmIEhBTkRMRSBrbXBfdGhyZWFkX3Q7Cit0eXBlZGVmIERXT1JEIGttcF9rZXlfdDsKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworCisjaWYgS01QX09TX1VOSVgKK3R5cGVkZWYgcHRocmVhZF90IGttcF90aHJlYWRfdDsKK3R5cGVkZWYgcHRocmVhZF9rZXlfdCBrbXBfa2V5X3Q7CisjZW5kaWYKKworZXh0ZXJuIGttcF9rZXlfdCBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5OworCit0eXBlZGVmIHN0cnVjdCBrbXBfc3lzX2luZm8geworICBsb25nIG1heHJzczsgLyogdGhlIG1heGltdW0gcmVzaWRlbnQgc2V0IHNpemUgdXRpbGl6ZWQgKGluIGtpbG9ieXRlcykgICAgICovCisgIGxvbmcgbWluZmx0OyAvKiB0aGUgbnVtYmVyIG9mIHBhZ2UgZmF1bHRzIHNlcnZpY2VkIHdpdGhvdXQgYW55IEkvTyAgICAgICAgKi8KKyAgbG9uZyBtYWpmbHQ7IC8qIHRoZSBudW1iZXIgb2YgcGFnZSBmYXVsdHMgc2VydmljZWQgdGhhdCByZXF1aXJlZCBJL08gICAgICAqLworICBsb25nIG5zd2FwOyAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgcHJvY2VzcyB3YXMgInN3YXBwZWQiIG91dCBvZiBtZW1vcnkgKi8KKyAgbG9uZyBpbmJsb2NrOyAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBmaWxlIHN5c3RlbSBoYWQgdG8gcGVyZm9ybSBpbnB1dCAgKi8KKyAgbG9uZyBvdWJsb2NrOyAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBmaWxlIHN5c3RlbSBoYWQgdG8gcGVyZm9ybSBvdXRwdXQgKi8KKyAgbG9uZyBudmNzdzsgLyogdGhlIG51bWJlciBvZiB0aW1lcyBhIGNvbnRleHQgc3dpdGNoIHdhcyB2b2x1bnRhcmlseSAgICAgICovCisgIGxvbmcgbml2Y3N3OyAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgY29udGV4dCBzd2l0Y2ggd2FzIGZvcmNlZCAgICAgICAgICAgKi8KK30ga21wX3N5c19pbmZvX3Q7CisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0Cit0eXBlZGVmIHN0cnVjdCBrbXBfY3B1aW5mbyB7CisgIGludCBpbml0aWFsaXplZDsgLy8gSWYgMCwgb3RoZXIgZmllbGRzIGFyZSBub3QgaW5pdGlhbGl6ZWQuCisgIGludCBzaWduYXR1cmU7IC8vIENQVUlEKDEpLkVBWAorICBpbnQgZmFtaWx5OyAvLyBDUFVJRCgxKS5FQVhbMjc6MjBdK0NQVUlEKDEpLkVBWFsxMTo4XSAoRXh0ZW5kZWQgRmFtaWx5K0ZhbWlseSkKKyAgaW50IG1vZGVsOyAvLyAoIENQVUlEKDEpLkVBWFsxOToxNl0gPDwgNCApICsgQ1BVSUQoMSkuRUFYWzc6NF0gKCAoIEV4dGVuZGVkCisgIC8vIE1vZGVsIDw8IDQgKSArIE1vZGVsKQorICBpbnQgc3RlcHBpbmc7IC8vIENQVUlEKDEpLkVBWFszOjBdICggU3RlcHBpbmcgKQorICBpbnQgc3NlMjsgLy8gMCBpZiBTU0UyIGluc3RydWN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCwgMSBvdGhlcndpc2UuCisgIGludCBydG07IC8vIDAgaWYgUlRNIGluc3RydWN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCwgMSBvdGhlcndpc2UuCisgIGludCBjcHVfc3RhY2tvZmZzZXQ7CisgIGludCBhcGljX2lkOworICBpbnQgcGh5c2ljYWxfaWQ7CisgIGludCBsb2dpY2FsX2lkOworICBrbXBfdWludDY0IGZyZXF1ZW5jeTsgLy8gTm9taW5hbCBDUFUgZnJlcXVlbmN5IGluIEh6LgorICBjaGFyIG5hbWVbMyAqIHNpemVvZihrbXBfY3B1aWRfdCldOyAvLyBDUFVJRCgweDgwMDAwMDAyLDB4ODAwMDAwMDMsMHg4MDAwMDAwNCkKK30ga21wX2NwdWluZm9fdDsKKyNlbmRpZgorCisjaWZkZWYgQlVJTERfVFYKKworc3RydWN0IHR2X3RocmVhZHByaXZhdGUgeworICAvKiBSZWNvcmQgdHlwZSAjMSAqLworICB2b2lkICpnbG9iYWxfYWRkcjsKKyAgdm9pZCAqdGhyZWFkX2FkZHI7Cit9OworCitzdHJ1Y3QgdHZfZGF0YSB7CisgIHN0cnVjdCB0dl9kYXRhICpuZXh0OworICB2b2lkICp0eXBlOworICB1bmlvbiB0dl91bmlvbiB7CisgICAgc3RydWN0IHR2X3RocmVhZHByaXZhdGUgdHA7CisgIH0gdTsKK307CisKK2V4dGVybiBrbXBfa2V5X3QgX19rbXBfdHZfa2V5OworCisjZW5kaWYgLyogQlVJTERfVFYgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBVU0VfSVRUX0JVSUxECisvLyBXZSBjYW5ub3QgaW5jbHVkZSAia21wX2l0dC5oIiBkdWUgdG8gY2lyY3VsYXIgZGVwZW5kZW5jeS4gRGVjbGFyZSB0aGUgb25seQorLy8gcmVxdWlyZWQgdHlwZSBoZXJlLiBMYXRlciB3ZSB3aWxsIGNoZWNrIHRoZSB0eXBlIG1lZXRzIHJlcXVpcmVtZW50cy4KK3R5cGVkZWYgaW50IGttcF9pdHRfbWFya190OworI2RlZmluZSBLTVBfSVRUX0RFQlVHIDAKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKy8qIFRhc2txIGRhdGEgc3RydWN0dXJlcyAqLworCisjZGVmaW5lIEhJR0hfV0FURVJfTUFSSyhuc2xvdHMpICgoKG5zbG90cykqMykgLyA0KQorLy8gbnVtIHRodW5rcyB0aGF0IGVhY2ggdGhyZWFkIGNhbiBzaW11bHRhbmVvdXNseSBleGVjdXRlIGZyb20gYSB0YXNrIHF1ZXVlCisjZGVmaW5lIF9fS01QX1RBU0tRX1RIVU5LU19QRVJfVEggMQorCisvKiBmbGFncyBmb3IgdGFza3FfZ2xvYmFsX2ZsYWdzLCBrbXBfdGFza19xdWV1ZV90IHRxX2ZsYWdzLCBrbXBjX3RodW5rX3QKKyAgIHRoX2ZsYWdzICAqLworCisjZGVmaW5lIFRRRl9JU19PUkRFUkVEIDB4MDAwMSAvLyBfX2ttcGNfdGFza3EgaW50ZXJmYWNlLCB0YXNrcSBvcmRlcmVkCisvLyAgX19rbXBjX3Rhc2txIGludGVyZmFjZSwgdGFza3Egd2l0aCBsYXN0cHJpdmF0ZSBsaXN0CisjZGVmaW5lIFRRRl9JU19MQVNUUFJJVkFURSAweDAwMDIKKyNkZWZpbmUgVFFGX0lTX05PV0FJVCAweDAwMDQgLy8gX19rbXBjX3Rhc2txIGludGVyZmFjZSwgZW5kIHRhc2txIG5vd2FpdAorLy8gX19rbXBjX3Rhc2txIGludGVyZmFjZSwgdXNlIGhldXJpc3RpY3MgdG8gZGVjaWRlIHRhc2sgcXVldWUgc2l6ZQorI2RlZmluZSBUUUZfSEVVUklTVElDUyAweDAwMDgKKworLy8gX19rbXBjX3Rhc2txIGludGVyZmFjZSwgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKKyNkZWZpbmUgVFFGX0lOVEVSRkFDRV9SRVNFUlZFRDEgMHgwMDEwCisvLyBfX2ttcGNfdGFza3EgaW50ZXJmYWNlLCByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQorI2RlZmluZSBUUUZfSU5URVJGQUNFX1JFU0VSVkVEMiAweDAwMjAKKy8vIF9fa21wY190YXNrcSBpbnRlcmZhY2UsIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlCisjZGVmaW5lIFRRRl9JTlRFUkZBQ0VfUkVTRVJWRUQzIDB4MDA0MAorLy8gX19rbXBjX3Rhc2txIGludGVyZmFjZSwgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKKyNkZWZpbmUgVFFGX0lOVEVSRkFDRV9SRVNFUlZFRDQgMHgwMDgwCisKKyNkZWZpbmUgVFFGX0lOVEVSRkFDRV9GTEFHUyAweDAwZmYgLy8gYWxsIHRoZSBfX2ttcGNfdGFza3EgaW50ZXJmYWNlIGZsYWdzCisvLyBpbnRlcm5hbC9yZWFkIGJ5IGluc3RydW1lbnRhdGlvbjsgb25seSB1c2VkIHdpdGggVFFGX0lTX0xBU1RQUklWQVRFCisjZGVmaW5lIFRRRl9JU19MQVNUX1RBU0sgMHgwMTAwCisvLyBpbnRlcm5hbCB1c2Ugb25seTsgdGhpcyB0aHVuay0+dGhfdGFzayBpcyB0aGUgdGFza3FfdGFzaworI2RlZmluZSBUUUZfVEFTS1FfVEFTSyAweDAyMDAKKy8vIGludGVybmFsIHVzZSBvbmx5OyBtdXN0IHJlbGVhc2Ugd29ya2VyIHRocmVhZHMgb25jZSBBTlkgcXVldWVkIHRhc2sKKy8vIGV4aXN0cyAoZ2xvYmFsKQorI2RlZmluZSBUUUZfUkVMRUFTRV9XT1JLRVJTIDB4MDQwMAorLy8gaW50ZXJuYWwgdXNlIG9ubHk7IG5vdGlmeSB3b3JrZXJzIHRoYXQgbWFzdGVyIGhhcyBmaW5pc2hlZCBlbnF1ZXVpbmcgdGFza3MKKyNkZWZpbmUgVFFGX0FMTF9UQVNLU19RVUVVRUQgMHgwODAwCisvLyBpbnRlcm5hbCB1c2Ugb25seTogdGhpcyBxdWV1ZSBlbmNvdW50ZXJlZCBpbiBwYXJhbGxlbCBjb250ZXh0OiBub3Qgc2VyaWFsaXplZAorI2RlZmluZSBUUUZfUEFSQUxMRUxfQ09OVEVYVCAweDEwMDAKKy8vIGludGVybmFsIHVzZSBvbmx5OyB0aGlzIHF1ZXVlIGlzIG9uIHRoZSBmcmVlbGlzdCBhbmQgbm90IGluIHVzZQorI2RlZmluZSBUUUZfREVBTExPQ0FURUQgMHgyMDAwCisKKyNkZWZpbmUgVFFGX0lOVEVSTkFMX0ZMQUdTIDB4M2YwMCAvLyBhbGwgdGhlIGludGVybmFsIHVzZSBvbmx5IGZsYWdzCisKK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBrbXBjX2FsaWduZWRfaW50MzJfdCB7CisgIGttcF9pbnQzMiBhaV9kYXRhOworfSBrbXBjX2FsaWduZWRfaW50MzJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGttcGNfYWxpZ25lZF9xdWV1ZV9zbG90X3QgeworICBzdHJ1Y3Qga21wY190aHVua190ICpxc190aHVuazsKK30ga21wY19hbGlnbmVkX3F1ZXVlX3Nsb3RfdDsKKwordHlwZWRlZiBzdHJ1Y3Qga21wY190YXNrX3F1ZXVlX3QgeworICAvKiB0YXNrIHF1ZXVlIGxpbmthZ2UgZmllbGRzIGZvciBuLWFyeSB0cmVlIG9mIHF1ZXVlcyAobG9ja2VkIHdpdGggZ2xvYmFsCisgICAgIHRhc2txX3RyZWVfbGNrKSAqLworICBrbXBfbG9ja190IHRxX2xpbmtfbGNrOyAvKiBsb2NrIGZvciBjaGlsZCBsaW5rLCBjaGlsZCBuZXh0L3ByZXYgbGlua3MgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkIHJlZiBjb3VudHMgKi8KKyAgdW5pb24geworICAgIHN0cnVjdCBrbXBjX3Rhc2tfcXVldWVfdCAqdHFfcGFyZW50OyAvLyBwb2ludGVyIHRvIHBhcmVudCB0YXNrcSwgbm90IGxvY2tlZAorICAgIC8vIGZvciB0YXNrcSBpbnRlcm5hbCBmcmVlbGlzdHMsIGxvY2tlZCB3aXRoIGdsb2JhbCB0YXNrcV9mcmVlbGlzdF9sY2sKKyAgICBzdHJ1Y3Qga21wY190YXNrX3F1ZXVlX3QgKnRxX25leHRfZnJlZTsKKyAgfSB0cTsKKyAgLy8gcG9pbnRlciB0byBsaW5rZWQtbGlzdCBvZiBjaGlsZHJlbiwgbG9ja2VkIGJ5IHRxJ3MgdHFfbGlua19sY2sKKyAgdm9sYXRpbGUgc3RydWN0IGttcGNfdGFza19xdWV1ZV90ICp0cV9maXJzdF9jaGlsZDsKKyAgLy8gbmV4dCBjaGlsZCBpbiBsaW5rZWQtbGlzdCwgbG9ja2VkIGJ5IHBhcmVudCB0cSdzIHRxX2xpbmtfbGNrCisgIHN0cnVjdCBrbXBjX3Rhc2tfcXVldWVfdCAqdHFfbmV4dF9jaGlsZDsKKyAgLy8gcHJldmlvdXMgY2hpbGQgaW4gbGlua2VkLWxpc3QsIGxvY2tlZCBieSBwYXJlbnQgdHEncyB0cV9saW5rX2xjaworICBzdHJ1Y3Qga21wY190YXNrX3F1ZXVlX3QgKnRxX3ByZXZfY2hpbGQ7CisgIC8vIHJlZmVyZW5jZSBjb3VudCBvZiB0aHJlYWRzIHdpdGggYWNjZXNzIHRvIHRoaXMgdGFzayBxdWV1ZQorICB2b2xhdGlsZSBrbXBfaW50MzIgdHFfcmVmX2NvdW50OworICAvKiAob3RoZXIgdGhhbiB0aGUgdGhyZWFkIGV4ZWN1dGluZyB0aGUga21wY19lbmRfdGFza3EgY2FsbCkgKi8KKyAgLyogbG9ja2VkIGJ5IHBhcmVudCB0cSdzIHRxX2xpbmtfbGNrICovCisKKyAgLyogc2hhcmVkIGRhdGEgZm9yIHRhc2sgcXVldWUgKi8KKyAgLyogcGVyLXRocmVhZCBhcnJheSBvZiBwb2ludGVycyB0byBzaGFyZWQgdmFyaWFibGUgc3RydWN0dXJlcyAqLworICBzdHJ1Y3Qga21wY19hbGlnbmVkX3NoYXJlZF92YXJzX3QgKnRxX3NoYXJlZHM7CisgIC8qIG9ubHkgb25lIGFycmF5IGVsZW1lbnQgZXhpc3RzIGZvciBhbGwgYnV0IG91dGVybW9zdCB0YXNrcSAqLworCisgIC8qIGJvb2trZWVwaW5nIGZvciBvcmRlcmVkIHRhc2sgcXVldWUgKi8KKyAga21wX3VpbnQzMiB0cV90YXNrbnVtX3F1ZXVpbmc7IC8vIG9yZGVyZWQgdGFzayAjIGFzc2lnbmVkIHdoaWxlIHF1ZXVpbmcgdGFza3MKKyAgLy8gb3JkZXJlZCBudW1iZXIgb2YgbmV4dCB0YXNrIHRvIGJlIHNlcnZlZCAoZXhlY3V0ZWQpCisgIHZvbGF0aWxlIGttcF91aW50MzIgdHFfdGFza251bV9zZXJ2aW5nOworCisgIC8qIHRodW5rIHN0b3JhZ2UgbWFuYWdlbWVudCBmb3IgdGFzayBxdWV1ZSAqLworICBrbXBfbG9ja190IHRxX2ZyZWVfdGh1bmtzX2xjazsgLyogbG9jayBmb3IgdGh1bmsgZnJlZWxpc3QgbWFuaXB1bGF0aW9uICovCisgIC8vIHRodW5rIGZyZWVsaXN0LCBjaGFpbmVkIHZpYSB0aC50aF9uZXh0X2ZyZWUKKyAgc3RydWN0IGttcGNfdGh1bmtfdCAqdHFfZnJlZV90aHVua3M7CisgIC8vIHNwYWNlIGFsbG9jYXRlZCBmb3IgdGh1bmtzIGZvciB0aGlzIHRhc2sgcXVldWUKKyAgc3RydWN0IGttcGNfdGh1bmtfdCAqdHFfdGh1bmtfc3BhY2U7CisKKyAgLyogZGF0YSBmaWVsZHMgZm9yIHF1ZXVlIGl0c2VsZiAqLworICBrbXBfbG9ja190IHRxX3F1ZXVlX2xjazsgLyogbG9jayBmb3IgW2RlXWVucXVldWUgb3BlcmF0aW9uczogdHFfcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cV9oZWFkLCB0cV90YWlsLCB0cV9uZnVsbCAqLworICAvKiBhcnJheSBvZiBxdWV1ZSBzbG90cyB0byBob2xkIHRodW5rcyBmb3IgdGFza3MgKi8KKyAga21wY19hbGlnbmVkX3F1ZXVlX3Nsb3RfdCAqdHFfcXVldWU7CisgIHZvbGF0aWxlIHN0cnVjdCBrbXBjX3RodW5rX3QgKnRxX3Rhc2txX3Nsb3Q7IC8qIHNwZWNpYWwgc2xvdCBmb3IgdGFza3EgdGFzaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHVuaywgb2NjdXBpZWQgaWYgbm90IE5VTEwgKi8KKyAga21wX2ludDMyIHRxX25zbG90czsgLyogIyBvZiB0cV90aHVua19zcGFjZSB0aHVua3MgYWxsb2MnZCAobm90IGluY2wuCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRxX3Rhc2txX3Nsb3Qgc3BhY2UpICAqLworICBrbXBfaW50MzIgdHFfaGVhZDsgLy8gZW5xdWV1ZSBwdXRzIGl0ZW0gaGVyZSAoaW5kZXggaW50byB0cV9xdWV1ZSBhcnJheSkKKyAga21wX2ludDMyIHRxX3RhaWw7IC8vIGRlcXVldWUgdGFrZXMgaXRlbSBmcm9tIGhlcmUgKGluZGV4IGludG8gdHFfcXVldWUgYXJyYXkpCisgIHZvbGF0aWxlIGttcF9pbnQzMiB0cV9uZnVsbDsgLy8gIyBvZiBvY2N1cGllZCBlbnRyaWVzIGluIHRhc2sgcXVldWUgcmlnaHQgbm93CisgIGttcF9pbnQzMiB0cV9oaXdhdDsgLyogaGlnaC13YXRlciBtYXJrIGZvciB0cV9uZnVsbCBhbmQgcXVldWUgc2NoZWR1bGluZyAgKi8KKyAgdm9sYXRpbGUga21wX2ludDMyIHRxX2ZsYWdzOyAvKiAgVFFGX3h4eCAgKi8KKworICAvKiBib29ra2VlcGluZyBmb3Igb3V0c3RhbmRpbmcgdGh1bmtzICovCisKKyAgLyogcGVyLXRocmVhZCBhcnJheSBmb3IgIyBvZiByZWd1bGFyIHRodW5rcyBjdXJyZW50bHkgYmVpbmcgZXhlY3V0ZWQgKi8KKyAgc3RydWN0IGttcGNfYWxpZ25lZF9pbnQzMl90ICp0cV90aF90aHVua3M7CisgIGttcF9pbnQzMiB0cV9ucHJvYzsgLyogbnVtYmVyIG9mIHRodW5rcyBpbiB0aGUgdGhfdGh1bmtzIGFycmF5ICovCisKKyAgLyogc3RhdGlzdGljcyBsaWJyYXJ5IGJvb2trZWVwaW5nICovCisgIGlkZW50X3QgKnRxX2xvYzsgLyogIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGFza3EgZGlyZWN0aXZlICovCit9IGttcGNfdGFza19xdWV1ZV90OworCit0eXBlZGVmIHZvaWQgKCprbXBjX3Rhc2tfdCkoa21wX2ludDMyIGdsb2JhbF90aWQsIHN0cnVjdCBrbXBjX3RodW5rX3QgKnRodW5rKTsKKworLyogIHNpemVvZl9zaGFyZWRzIHBhc3NlZCBhcyBhcmcgdG8gX19rbXBjX3Rhc2txIGNhbGwgICovCit0eXBlZGVmIHN0cnVjdCBrbXBjX3NoYXJlZF92YXJzX3QgeyAvKiBhbGlnbmVkIGR1cmluZyBkeW5hbWljIGFsbG9jYXRpb24gKi8KKyAga21wY190YXNrX3F1ZXVlX3QgKnN2X3F1ZXVlOyAvKiAocG9pbnRlcnMgdG8pIHNoYXJlZCB2YXJzICovCit9IGttcGNfc2hhcmVkX3ZhcnNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGttcGNfYWxpZ25lZF9zaGFyZWRfdmFyc190IHsKKyAgdm9sYXRpbGUgc3RydWN0IGttcGNfc2hhcmVkX3ZhcnNfdCAqYWlfZGF0YTsKK30ga21wY19hbGlnbmVkX3NoYXJlZF92YXJzX3Q7CisKKy8qIHNpemVvZl90aHVuayBwYXNzZWQgYXMgYXJnIHRvIGttcGNfdGFza3EgY2FsbCAqLwordHlwZWRlZiBzdHJ1Y3Qga21wY190aHVua190IHsgLyogYWxpZ25lZCBkdXJpbmcgZHluYW1pYyBhbGxvY2F0aW9uICovCisgIHVuaW9uIHsgLyogZmllbGQgdXNlZCBmb3IgaW50ZXJuYWwgZnJlZWxpc3RzIHRvbyAqLworICAgIGttcGNfc2hhcmVkX3ZhcnNfdCAqdGhfc2hhcmVkczsKKyAgICBzdHJ1Y3Qga21wY190aHVua190ICp0aF9uZXh0X2ZyZWU7IC8qIGZyZWVsaXN0IG9mIGluZGl2aWR1YWwgdGh1bmtzIHdpdGhpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUsIGhlYWQgYXQgdHFfZnJlZV90aHVua3MgKi8KKyAgfSB0aDsKKyAga21wY190YXNrX3QgdGhfdGFzazsgLyogdGFza3FfdGFzayBpZiBmbGFncyAmIFRRRl9UQVNLUV9UQVNLICovCisgIHN0cnVjdCBrbXBjX3RodW5rX3QgKnRoX2VuY2xfdGh1bms7IC8qIHBvaW50ZXIgdG8gZHluYW1pY2FsbHkgZW5jbG9zaW5nIHRodW5rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHRoaXMgdGhyZWFkJ3MgY2FsbCBzdGFjayAqLworICAvLyBUUUZfeHh4KHRxX2ZsYWdzIGludGVyZmFjZSBwbHVzIHBvc3NpYmxlIGludGVybmFsIGZsYWdzKQorICBrbXBfaW50MzIgdGhfZmxhZ3M7CisKKyAga21wX2ludDMyIHRoX3N0YXR1czsKKyAga21wX3VpbnQzMiB0aF90YXNrbnVtOyAvKiB0YXNrIG51bWJlciBhc3NpZ25lZCBpbiBvcmRlciBvZiBxdWV1aW5nLCB1c2VkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyZWQgc2VjdGlvbnMgKi8KKyAgLyogcHJpdmF0ZSB2YXJzICovCit9IGttcGNfdGh1bmtfdDsKKwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGttcF90YXNrcSB7CisgIGludCB0cV9jdXJyX3RodW5rX2NhcGFjaXR5OworCisgIGttcGNfdGFza19xdWV1ZV90ICp0cV9yb290OworICBrbXBfaW50MzIgdHFfZ2xvYmFsX2ZsYWdzOworCisgIGttcF9sb2NrX3QgdHFfZnJlZWxpc3RfbGNrOworICBrbXBjX3Rhc2tfcXVldWVfdCAqdHFfZnJlZWxpc3Q7CisKKyAga21wY190aHVua190ICoqdHFfY3Vycl90aHVuazsKK30ga21wX3Rhc2txX3Q7CisKKy8qIEVORCBUYXNrcSBkYXRhIHN0cnVjdHVyZXMgKi8KKwordHlwZWRlZiBrbXBfaW50MzIga21wX2NyaXRpY2FsX25hbWVbOF07CisKKy8qIQorQGluZ3JvdXAgUEFSQUxMRUwKK1RoZSB0eXBlIGZvciBhIG1pY3JvdGFzayB3aGljaCBnZXRzIHBhc3NlZCB0byBAcmVmIF9fa21wY19mb3JrX2NhbGwoKS4KK1RoZSBhcmd1bWVudHMgdG8gdGhlIG91dGxpbmVkIGZ1bmN0aW9uIGFyZQorQHBhcmFtIGdsb2JhbF90aWQgdGhlIGdsb2JhbCB0aHJlYWQgaWRlbnRpdHkgb2YgdGhlIHRocmVhZCBleGVjdXRpbmcgdGhlCitmdW5jdGlvbi4KK0BwYXJhbSBib3VuZF90aWQgIHRoZSBsb2NhbCBpZGVudGl0aXkgb2YgdGhlIHRocmVhZCBleGVjdXRpbmcgdGhlIGZ1bmN0aW9uCitAcGFyYW0gLi4uIHBvaW50ZXJzIHRvIHNoYXJlZCB2YXJpYWJsZXMgYWNjZXNzZWQgYnkgdGhlIGZ1bmN0aW9uLgorKi8KK3R5cGVkZWYgdm9pZCAoKmttcGNfbWljcm8pKGttcF9pbnQzMiAqZ2xvYmFsX3RpZCwga21wX2ludDMyICpib3VuZF90aWQsIC4uLik7Cit0eXBlZGVmIHZvaWQgKCprbXBjX21pY3JvX2JvdW5kKShrbXBfaW50MzIgKmJvdW5kX3RpZCwga21wX2ludDMyICpib3VuZF9udGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pOworCisvKiEKK0Bpbmdyb3VwIFRIUkVBRFBSSVZBVEUKK0B7CisqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qIFRocmVhZHByaXZhdGUgaW5pdGlhbGl6YXRpb24vZmluYWxpemF0aW9uIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAqLworCisvKiAgZm9yIG5vbi1hcnJheSBvYmplY3RzOiAgX19rbXBjX3RocmVhZHByaXZhdGVfcmVnaXN0ZXIoKSAgKi8KKworLyohCisgUG9pbnRlciB0byB0aGUgY29uc3RydWN0b3IgZnVuY3Rpb24uCisgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSA8dHQ+dGhpczwvdHQ+IHBvaW50ZXIKKyovCit0eXBlZGVmIHZvaWQgKigqa21wY19jdG9yKSh2b2lkICopOworCisvKiEKKyBQb2ludGVyIHRvIHRoZSBkZXN0cnVjdG9yIGZ1bmN0aW9uLgorIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgPHR0PnRoaXM8L3R0PiBwb2ludGVyCisqLwordHlwZWRlZiB2b2lkICgqa21wY19kdG9yKSgKKyAgICB2b2lkICogLyosIHNpemVfdCAqLyk7IC8qIDJuZCBhcmc6IG1hZ2ljIG51bWJlciBmb3IgS0NDIHVudXNlZCBieSBJbnRlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZXIgKi8KKy8qIQorIFBvaW50ZXIgdG8gYW4gYWx0ZXJuYXRlIGNvbnN0cnVjdG9yLgorIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgPHR0PnRoaXM8L3R0PiBwb2ludGVyLgorKi8KK3R5cGVkZWYgdm9pZCAqKCprbXBjX2NjdG9yKSh2b2lkICosIHZvaWQgKik7CisKKy8qIGZvciBhcnJheSBvYmplY3RzOiBfX2ttcGNfdGhyZWFkcHJpdmF0ZV9yZWdpc3Rlcl92ZWMoKSAqLworLyogRmlyc3QgYXJnOiAidGhpcyIgcG9pbnRlciAqLworLyogTGFzdCBhcmc6IG51bWJlciBvZiBhcnJheSBlbGVtZW50cyAqLworLyohCisgQXJyYXkgY29uc3RydWN0b3IuCisgRmlyc3QgYXJndW1lbnQgaXMgdGhlIDx0dD50aGlzPC90dD4gcG9pbnRlcgorIFNlY29uZCBhcmd1bWVudCB0aGUgbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzLgorKi8KK3R5cGVkZWYgdm9pZCAqKCprbXBjX2N0b3JfdmVjKSh2b2lkICosIHNpemVfdCk7CisvKiEKKyBQb2ludGVyIHRvIHRoZSBhcnJheSBkZXN0cnVjdG9yIGZ1bmN0aW9uLgorIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgPHR0PnRoaXM8L3R0PiBwb2ludGVyCisgU2Vjb25kIGFyZ3VtZW50IHRoZSBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMuCisqLwordHlwZWRlZiB2b2lkICgqa21wY19kdG9yX3ZlYykodm9pZCAqLCBzaXplX3QpOworLyohCisgQXJyYXkgY29uc3RydWN0b3IuCisgRmlyc3QgYXJndW1lbnQgaXMgdGhlIDx0dD50aGlzPC90dD4gcG9pbnRlcgorIFRoaXJkIGFyZ3VtZW50IHRoZSBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMuCisqLwordHlwZWRlZiB2b2lkICooKmttcGNfY2N0b3JfdmVjKSh2b2lkICosIHZvaWQgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KTsgLyogZnVuY3Rpb24gdW51c2VkIGJ5IGNvbXBpbGVyICovCisKKy8qIQorQH0KKyovCisKKy8qIGtlZXBzIHRyYWNrZWQgb2YgdGhyZWFkcHJpdmF0ZSBjYWNoZSBhbGxvY2F0aW9ucyBmb3IgY2xlYW51cCBsYXRlciAqLwordHlwZWRlZiBzdHJ1Y3Qga21wX2NhY2hlZF9hZGRyIHsKKyAgdm9pZCAqKmFkZHI7IC8qIGFkZHJlc3Mgb2YgYWxsb2NhdGVkIGNhY2hlICovCisgIHN0cnVjdCBrbXBfY2FjaGVkX2FkZHIgKm5leHQ7IC8qIHBvaW50ZXIgdG8gbmV4dCBjYWNoZWQgYWRkcmVzcyAqLworfSBrbXBfY2FjaGVkX2FkZHJfdDsKKworc3RydWN0IHByaXZhdGVfZGF0YSB7CisgIHN0cnVjdCBwcml2YXRlX2RhdGEgKm5leHQ7IC8qIFRoZSBuZXh0IGRlc2NyaXB0b3IgaW4gdGhlIGxpc3QgICAgICAqLworICB2b2lkICpkYXRhOyAvKiBUaGUgZGF0YSBidWZmZXIgZm9yIHRoaXMgZGVzY3JpcHRvciAgKi8KKyAgaW50IG1vcmU7IC8qIFRoZSByZXBlYXQgY291bnQgZm9yIHRoaXMgZGVzY3JpcHRvciAqLworICBzaXplX3Qgc2l6ZTsgLyogVGhlIGRhdGEgc2l6ZSBmb3IgdGhpcyBkZXNjcmlwdG9yICAgICovCit9OworCitzdHJ1Y3QgcHJpdmF0ZV9jb21tb24geworICBzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gKm5leHQ7CisgIHN0cnVjdCBwcml2YXRlX2NvbW1vbiAqbGluazsKKyAgdm9pZCAqZ2JsX2FkZHI7CisgIHZvaWQgKnBhcl9hZGRyOyAvKiBwYXJfYWRkciA9PSBnYmxfYWRkciBmb3IgTUFTVEVSIHRocmVhZCAqLworICBzaXplX3QgY21uX3NpemU7Cit9OworCitzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiB7CisgIHN0cnVjdCBzaGFyZWRfY29tbW9uICpuZXh0OworICBzdHJ1Y3QgcHJpdmF0ZV9kYXRhICpwb2RfaW5pdDsKKyAgdm9pZCAqb2JqX2luaXQ7CisgIHZvaWQgKmdibF9hZGRyOworICB1bmlvbiB7CisgICAga21wY19jdG9yIGN0b3I7CisgICAga21wY19jdG9yX3ZlYyBjdG9ydjsKKyAgfSBjdDsKKyAgdW5pb24geworICAgIGttcGNfY2N0b3IgY2N0b3I7CisgICAga21wY19jY3Rvcl92ZWMgY2N0b3J2OworICB9IGNjdDsKKyAgdW5pb24geworICAgIGttcGNfZHRvciBkdG9yOworICAgIGttcGNfZHRvcl92ZWMgZHRvcnY7CisgIH0gZHQ7CisgIHNpemVfdCB2ZWNfbGVuOworICBpbnQgaXNfdmVjOworICBzaXplX3QgY21uX3NpemU7Cit9OworCisjZGVmaW5lIEtNUF9IQVNIX1RBQkxFX0xPRzIgOSAvKiBsb2cyIG9mIHRoZSBoYXNoIHRhYmxlIHNpemUgKi8KKyNkZWZpbmUgS01QX0hBU0hfVEFCTEVfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgxIDw8IEtNUF9IQVNIX1RBQkxFX0xPRzIpIC8qIHNpemUgb2YgdGhlIGhhc2ggdGFibGUgKi8KKyNkZWZpbmUgS01QX0hBU0hfU0hJRlQgMyAvKiB0aHJvdyBhd2F5IHRoaXMgbWFueSBsb3cgYml0cyBmcm9tIHRoZSBhZGRyZXNzICovCisjZGVmaW5lIEtNUF9IQVNIKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCgoa21wX3VpbnRwdHJfdCl4KSA+PiBLTVBfSEFTSF9TSElGVCkgJiAoS01QX0hBU0hfVEFCTEVfU0laRSAtIDEpKQorCitzdHJ1Y3QgY29tbW9uX3RhYmxlIHsKKyAgc3RydWN0IHByaXZhdGVfY29tbW9uICpkYXRhW0tNUF9IQVNIX1RBQkxFX1NJWkVdOworfTsKKworc3RydWN0IHNoYXJlZF90YWJsZSB7CisgIHN0cnVjdCBzaGFyZWRfY29tbW9uICpkYXRhW0tNUF9IQVNIX1RBQkxFX1NJWkVdOworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQKK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBkaXNwYXRjaF9wcml2YXRlX2luZm8zMiB7CisgIGttcF9pbnQzMiBjb3VudDsKKyAga21wX2ludDMyIHViOworICAvKiBBZGRpbmcgS01QX0FMSUdOX0NBQ0hFIGhlcmUgZG9lc24ndCBoZWxwIC8gY2FuIGh1cnQgcGVyZm9ybWFuY2UgKi8KKyAga21wX2ludDMyIGxiOworICBrbXBfaW50MzIgc3Q7CisgIGttcF9pbnQzMiB0YzsKKyAga21wX2ludDMyIHN0YXRpY19zdGVhbF9jb3VudGVyOyAvKiBmb3Igc3RhdGljX3N0ZWFsIG9ubHk7IG1heWJlIGJldHRlciB0byBwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlciB1YiAqLworCisgIC8vIEtNUF9BTElHTiggMTYgKSBlbnN1cmVzICggaWYgdGhlIEtNUF9BTElHTiBtYWNybyBpcyB0dXJuZWQgb24gKQorICAvLyAgICBhKSBwYXJtMyBpcyBwcm9wZXJseSBhbGlnbmVkIGFuZAorICAvLyAgICBiKSBhbGwgcGFybTEtNCBhcmUgaW4gdGhlIHNhbWUgY2FjaGUgbGluZS4KKyAgLy8gQmVjYXVzZSBvZiBwYXJtMS00IGFyZSB1c2VkIHRvZ2V0aGVyLCBwZXJmb3JtYW5jZSBzZWVtcyB0byBiZSBiZXR0ZXIKKyAgLy8gaWYgdGhleSBhcmUgaW4gdGhlIHNhbWUgbGluZSAobm90IG1lYXN1cmVkIHRob3VnaCkuCisKKyAgc3RydWN0IEtNUF9BTElHTigzMikgeyAvLyBBQzogY2hhbmdlZCAxNiB0byAzMiBpbiBvcmRlciB0byBzaW1wbGlmeSB0ZW1wbGF0ZQorICAgIGttcF9pbnQzMiBwYXJtMTsgLy8gICAgIHN0cnVjdHVyZXMgaW4ga21wX2Rpc3BhdGNoLmNwcC4gVGhpcyBzaG91bGQKKyAgICBrbXBfaW50MzIgcGFybTI7IC8vICAgICBtYWtlIG5vIHJlYWwgY2hhbmdlIGF0IGxlYXN0IHdoaWxlIHBhZGRpbmcgaXMgb2ZmLgorICAgIGttcF9pbnQzMiBwYXJtMzsKKyAgICBrbXBfaW50MzIgcGFybTQ7CisgIH07CisKKyAga21wX3VpbnQzMiBvcmRlcmVkX2xvd2VyOworICBrbXBfdWludDMyIG9yZGVyZWRfdXBwZXI7CisjaWYgS01QX09TX1dJTkRPV1MKKyAgLy8gVGhpcyB2YXIgY2FuIGJlIHBsYWNlZCBpbiB0aGUgaG9sZSBiZXR3ZWVuICd0YycgYW5kICdwYXJtMScsIGluc3RlYWQgb2YKKyAgLy8gJ3N0YXRpY19zdGVhbF9jb3VudGVyJy4gSXQgd291bGQgYmUgbmljZSB0byBtZWFzdXJlIGV4ZWN1dGlvbiB0aW1lcy4KKyAgLy8gQ29uZGl0aW9uYWwgaWYvZW5kaWYgY2FuIGJlIHJlbW92ZWQgYXQgYWxsLgorICBrbXBfaW50MzIgbGFzdF91cHBlcjsKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworfSBkaXNwYXRjaF9wcml2YXRlX2luZm8zMl90OworCit0eXBlZGVmIHN0cnVjdCBLTVBfQUxJR05fQ0FDSEUgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvNjQgeworICBrbXBfaW50NjQgY291bnQ7IC8vIGN1cnJlbnQgY2h1bmsgbnVtYmVyIGZvciBzdGF0aWMgJiBzdGF0aWMtc3RlYWwgc2NoZWR1bGluZworICBrbXBfaW50NjQgdWI7IC8qIHVwcGVyLWJvdW5kICovCisgIC8qIEFkZGluZyBLTVBfQUxJR05fQ0FDSEUgaGVyZSBkb2Vzbid0IGhlbHAgLyBjYW4gaHVydCBwZXJmb3JtYW5jZSAqLworICBrbXBfaW50NjQgbGI7IC8qIGxvd2VyLWJvdW5kICovCisgIGttcF9pbnQ2NCBzdDsgLyogc3RyaWRlICovCisgIGttcF9pbnQ2NCB0YzsgLyogdHJpcCBjb3VudCAobnVtYmVyIG9mIGl0ZXJhdGlvbnMpICovCisgIGttcF9pbnQ2NCBzdGF0aWNfc3RlYWxfY291bnRlcjsgLyogZm9yIHN0YXRpY19zdGVhbCBvbmx5OyBtYXliZSBiZXR0ZXIgdG8gcHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgdWIgKi8KKworICAvKiBwYXJtWzEtNF0gYXJlIHVzZWQgaW4gZGlmZmVyZW50IHdheXMgYnkgZGlmZmVyZW50IHNjaGVkdWxpbmcgYWxnb3JpdGhtcyAqLworCisgIC8vIEtNUF9BTElHTiggMzIgKSBlbnN1cmVzICggaWYgdGhlIEtNUF9BTElHTiBtYWNybyBpcyB0dXJuZWQgb24gKQorICAvLyAgICBhKSBwYXJtMyBpcyBwcm9wZXJseSBhbGlnbmVkIGFuZAorICAvLyAgICBiKSBhbGwgcGFybTEtNCBhcmUgaW4gdGhlIHNhbWUgY2FjaGUgbGluZS4KKyAgLy8gQmVjYXVzZSBvZiBwYXJtMS00IGFyZSB1c2VkIHRvZ2V0aGVyLCBwZXJmb3JtYW5jZSBzZWVtcyB0byBiZSBiZXR0ZXIKKyAgLy8gaWYgdGhleSBhcmUgaW4gdGhlIHNhbWUgbGluZSAobm90IG1lYXN1cmVkIHRob3VnaCkuCisKKyAgc3RydWN0IEtNUF9BTElHTigzMikgeworICAgIGttcF9pbnQ2NCBwYXJtMTsKKyAgICBrbXBfaW50NjQgcGFybTI7CisgICAga21wX2ludDY0IHBhcm0zOworICAgIGttcF9pbnQ2NCBwYXJtNDsKKyAgfTsKKworICBrbXBfdWludDY0IG9yZGVyZWRfbG93ZXI7CisgIGttcF91aW50NjQgb3JkZXJlZF91cHBlcjsKKyNpZiBLTVBfT1NfV0lORE9XUworICAvLyBUaGlzIHZhciBjYW4gYmUgcGxhY2VkIGluIHRoZSBob2xlIGJldHdlZW4gJ3RjJyBhbmQgJ3Bhcm0xJywgaW5zdGVhZCBvZgorICAvLyAnc3RhdGljX3N0ZWFsX2NvdW50ZXInLiBJdCB3b3VsZCBiZSBuaWNlIHRvIG1lYXN1cmUgZXhlY3V0aW9uIHRpbWVzLgorICAvLyBDb25kaXRpb25hbCBpZi9lbmRpZiBjYW4gYmUgcmVtb3ZlZCBhdCBhbGwuCisgIGttcF9pbnQ2NCBsYXN0X3VwcGVyOworI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCit9IGRpc3BhdGNoX3ByaXZhdGVfaW5mbzY0X3Q7CisjZWxzZSAvKiBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQgKi8KK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBkaXNwYXRjaF9wcml2YXRlX2luZm8zMiB7CisgIGttcF9pbnQzMiBsYjsKKyAga21wX2ludDMyIHViOworICBrbXBfaW50MzIgc3Q7CisgIGttcF9pbnQzMiB0YzsKKworICBrbXBfaW50MzIgcGFybTE7CisgIGttcF9pbnQzMiBwYXJtMjsKKyAga21wX2ludDMyIHBhcm0zOworICBrbXBfaW50MzIgcGFybTQ7CisKKyAga21wX2ludDMyIGNvdW50OworCisgIGttcF91aW50MzIgb3JkZXJlZF9sb3dlcjsKKyAga21wX3VpbnQzMiBvcmRlcmVkX3VwcGVyOworI2lmIEtNUF9PU19XSU5ET1dTCisgIGttcF9pbnQzMiBsYXN0X3VwcGVyOworI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCit9IGRpc3BhdGNoX3ByaXZhdGVfaW5mbzMyX3Q7CisKK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBkaXNwYXRjaF9wcml2YXRlX2luZm82NCB7CisgIGttcF9pbnQ2NCBsYjsgLyogbG93ZXItYm91bmQgKi8KKyAga21wX2ludDY0IHViOyAvKiB1cHBlci1ib3VuZCAqLworICBrbXBfaW50NjQgc3Q7IC8qIHN0cmlkZSAqLworICBrbXBfaW50NjQgdGM7IC8qIHRyaXAgY291bnQgKG51bWJlciBvZiBpdGVyYXRpb25zKSAqLworCisgIC8qIHBhcm1bMS00XSBhcmUgdXNlZCBpbiBkaWZmZXJlbnQgd2F5cyBieSBkaWZmZXJlbnQgc2NoZWR1bGluZyBhbGdvcml0aG1zICovCisgIGttcF9pbnQ2NCBwYXJtMTsKKyAga21wX2ludDY0IHBhcm0yOworICBrbXBfaW50NjQgcGFybTM7CisgIGttcF9pbnQ2NCBwYXJtNDsKKworICBrbXBfaW50NjQgY291bnQ7IC8qIGN1cnJlbnQgY2h1bmsgbnVtYmVyIGZvciBzdGF0aWMgc2NoZWR1bGluZyAqLworCisgIGttcF91aW50NjQgb3JkZXJlZF9sb3dlcjsKKyAga21wX3VpbnQ2NCBvcmRlcmVkX3VwcGVyOworI2lmIEtNUF9PU19XSU5ET1dTCisgIGttcF9pbnQ2NCBsYXN0X3VwcGVyOworI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCit9IGRpc3BhdGNoX3ByaXZhdGVfaW5mbzY0X3Q7CisjZW5kaWYgLyogS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEICovCisKK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBkaXNwYXRjaF9wcml2YXRlX2luZm8geworICB1bmlvbiBwcml2YXRlX2luZm8geworICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mbzMyX3QgcDMyOworICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mbzY0X3QgcDY0OworICB9IHU7CisgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZTsgLyogc2NoZWR1bGluZyBhbGdvcml0aG0gKi8KKyAga21wX2ludDMyIG9yZGVyZWQ7IC8qIG9yZGVyZWQgY2xhdXNlIHNwZWNpZmllZCAqLworICBrbXBfaW50MzIgb3JkZXJlZF9idW1wZWQ7CisgIC8vIFRvIHJldGFpbiB0aGUgc3RydWN0dXJlIHNpemUgYWZ0ZXIgbWFraW5nIG9yZGVyZWRfaXRlcmF0aW9uIHNjYWxhcgorICBrbXBfaW50MzIgb3JkZXJlZF9kdW1teVtLTVBfTUFYX09SREVSRUQgLSAzXTsKKyAgLy8gU3RhY2sgb2YgYnVmZmVycyBmb3IgbmVzdCBvZiBzZXJpYWwgcmVnaW9ucworICBzdHJ1Y3QgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvICpuZXh0OworICBrbXBfaW50MzIgbm9tZXJnZTsgLyogZG9uJ3QgbWVyZ2UgaXRlcnMgaWYgc2VyaWFsaXplZCAqLworICBrbXBfaW50MzIgdHlwZV9zaXplOyAvKiB0aGUgc2l6ZSBvZiB0eXBlcyBpbiBwcml2YXRlX2luZm8gKi8KKyAgZW51bSBjb25zX3R5cGUgcHVzaGVkX3dzOworfSBkaXNwYXRjaF9wcml2YXRlX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgZGlzcGF0Y2hfc2hhcmVkX2luZm8zMiB7CisgIC8qIGNodW5rIGluZGV4IHVuZGVyIGR5bmFtaWMsIG51bWJlciBvZiBpZGxlIHRocmVhZHMgdW5kZXIgc3RhdGljLXN0ZWFsOworICAgICBpdGVyYXRpb24gaW5kZXggb3RoZXJ3aXNlICovCisgIHZvbGF0aWxlIGttcF91aW50MzIgaXRlcmF0aW9uOworICB2b2xhdGlsZSBrbXBfdWludDMyIG51bV9kb25lOworICB2b2xhdGlsZSBrbXBfdWludDMyIG9yZGVyZWRfaXRlcmF0aW9uOworICAvLyBEdW1teSB0byByZXRhaW4gdGhlIHN0cnVjdHVyZSBzaXplIGFmdGVyIG1ha2luZyBvcmRlcmVkX2l0ZXJhdGlvbiBzY2FsYXIKKyAga21wX2ludDMyIG9yZGVyZWRfZHVtbXlbS01QX01BWF9PUkRFUkVEIC0gMV07Cit9IGRpc3BhdGNoX3NoYXJlZF9pbmZvMzJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZGlzcGF0Y2hfc2hhcmVkX2luZm82NCB7CisgIC8qIGNodW5rIGluZGV4IHVuZGVyIGR5bmFtaWMsIG51bWJlciBvZiBpZGxlIHRocmVhZHMgdW5kZXIgc3RhdGljLXN0ZWFsOworICAgICBpdGVyYXRpb24gaW5kZXggb3RoZXJ3aXNlICovCisgIHZvbGF0aWxlIGttcF91aW50NjQgaXRlcmF0aW9uOworICB2b2xhdGlsZSBrbXBfdWludDY0IG51bV9kb25lOworICB2b2xhdGlsZSBrbXBfdWludDY0IG9yZGVyZWRfaXRlcmF0aW9uOworICAvLyBEdW1teSB0byByZXRhaW4gdGhlIHN0cnVjdHVyZSBzaXplIGFmdGVyIG1ha2luZyBvcmRlcmVkX2l0ZXJhdGlvbiBzY2FsYXIKKyAga21wX2ludDY0IG9yZGVyZWRfZHVtbXlbS01QX01BWF9PUkRFUkVEIC0gM107Cit9IGRpc3BhdGNoX3NoYXJlZF9pbmZvNjRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZGlzcGF0Y2hfc2hhcmVkX2luZm8geworICB1bmlvbiBzaGFyZWRfaW5mbyB7CisgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm8zMl90IHMzMjsKKyAgICBkaXNwYXRjaF9zaGFyZWRfaW5mbzY0X3QgczY0OworICB9IHU7CisgIHZvbGF0aWxlIGttcF91aW50MzIgYnVmZmVyX2luZGV4OworI2lmIE9NUF80NV9FTkFCTEVECisgIHZvbGF0aWxlIGttcF9pbnQzMiBkb2Fjcm9zc19idWZfaWR4OyAvLyB0ZWFtd2lzZSBpbmRleAorICB2b2xhdGlsZSBrbXBfdWludDMyICpkb2Fjcm9zc19mbGFnczsgLy8gc2hhcmVkIGFycmF5IG9mIGl0ZXJhdGlvbiBmbGFncyAoMC8xKQorICBrbXBfaW50MzIgZG9hY3Jvc3NfbnVtX2RvbmU7IC8vIGNvdW50IGZpbmlzaGVkIHRocmVhZHMKKyNlbmRpZgorI2lmIEtNUF9VU0VfSFdMT0MKKyAgLy8gV2hlbiBsaW5raW5nIHdpdGggbGliaHdsb2MsIHRoZSBPUkRFUkVEIEVQQ0MgdGVzdCBzbG93cyBkb3duIG9uIGJpZworICAvLyBtYWNoaW5lcyAoPiA0OCBjb3JlcykuIFBlcmZvcm1hbmNlIGFuYWx5c2lzIHNob3dlZCB0aGF0IGEgY2FjaGUgdGhyYXNoCisgIC8vIHdhcyBvY2N1cnJpbmcgYW5kIHRoaXMgcGFkZGluZyBoZWxwcyBhbGxldmlhdGUgdGhlIHByb2JsZW0uCisgIGNoYXIgcGFkZGluZ1s2NF07CisjZW5kaWYKK30gZGlzcGF0Y2hfc2hhcmVkX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Rpc3AgeworICAvKiBWZWN0b3IgZm9yIE9SREVSRUQgU0VDVElPTiAqLworICB2b2lkICgqdGhfZGVvX2ZjbikoaW50ICpndGlkLCBpbnQgKmNpZCwgaWRlbnRfdCAqKTsKKyAgLyogVmVjdG9yIGZvciBFTkQgT1JERVJFRCBTRUNUSU9OICovCisgIHZvaWQgKCp0aF9keG9fZmNuKShpbnQgKmd0aWQsIGludCAqY2lkLCBpZGVudF90ICopOworCisgIGRpc3BhdGNoX3NoYXJlZF9pbmZvX3QgKnRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQ7CisgIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ICp0aF9kaXNwYXRjaF9wcl9jdXJyZW50OworCisgIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ICp0aF9kaXNwX2J1ZmZlcjsKKyAga21wX2ludDMyIHRoX2Rpc3BfaW5kZXg7CisjaWYgT01QXzQ1X0VOQUJMRUQKKyAga21wX2ludDMyIHRoX2RvYWNyb3NzX2J1Zl9pZHg7IC8vIHRocmVhZCdzIGRvYWNyb3NzIGJ1ZmZlciBpbmRleAorICB2b2xhdGlsZSBrbXBfdWludDMyICp0aF9kb2Fjcm9zc19mbGFnczsgLy8gcG9pbnRlciB0byBzaGFyZWQgYXJyYXkgb2YgZmxhZ3MKKyAgdW5pb24geyAvLyB3ZSBjYW4gdXNlIHVuaW9uIGhlcmUgYmVjYXVzZSBkb2Fjcm9zcyBjYW5ub3QgYmUgdXNlZCBpbgorICAgIC8vIG5vbm1vbm90b25pYyBsb29wcworICAgIGttcF9pbnQ2NCAqdGhfZG9hY3Jvc3NfaW5mbzsgLy8gaW5mbyBvbiBsb29wIGJvdW5kcworICAgIGttcF9sb2NrX3QgKnRoX3N0ZWFsX2xvY2s7IC8vIGxvY2sgdXNlZCBmb3IgY2h1bmsgc3RlYWxpbmcgKDgtYnl0ZSB2YXJpYWJsZSkKKyAgfTsKKyNlbHNlCisjaWYgS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVECisgIGttcF9sb2NrX3QgKnRoX3N0ZWFsX2xvY2s7IC8vIGxvY2sgdXNlZCBmb3IgY2h1bmsgc3RlYWxpbmcgKDgtYnl0ZSB2YXJpYWJsZSkKKyAgdm9pZCAqZHVtbXlfcGFkZGluZ1sxXTsgLy8gbWFrZSBpdCA2NCBieXRlcyBvbiBJbnRlbChSKSA2NAorI2Vsc2UKKyAgdm9pZCAqZHVtbXlfcGFkZGluZ1syXTsgLy8gbWFrZSBpdCA2NCBieXRlcyBvbiBJbnRlbChSKSA2NAorI2VuZGlmCisjZW5kaWYKKyNpZiBLTVBfVVNFX0lOVEVSTk9ERV9BTElHTk1FTlQKKyAgY2hhciBtb3JlX3BhZGRpbmdbSU5URVJOT0RFX0NBQ0hFX0xJTkVdOworI2VuZGlmCit9IGttcF9kaXNwX3Q7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogQmFycmllciBzdHVmZiAqLworCisvKiBjb25zdGFudHMgZm9yIGJhcnJpZXIgc3RhdGUgdXBkYXRlICovCisjZGVmaW5lIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUgMCAvKiBzaG91bGQgcHJvYmFibHkgc3RhcnQgZnJvbSB6ZXJvICovCisjZGVmaW5lIEtNUF9CQVJSSUVSX1NMRUVQX0JJVCAwIC8qIGJpdCB1c2VkIGZvciBzdXNwZW5kL3NsZWVwIHBhcnQgb2Ygc3RhdGUgKi8KKyNkZWZpbmUgS01QX0JBUlJJRVJfVU5VU0VEX0JJVCAxIC8vIGJpdCB0aGF0IG11c3QgbmV2ZXIgYmUgc2V0IGZvciB2YWxpZCBzdGF0ZQorI2RlZmluZSBLTVBfQkFSUklFUl9CVU1QX0JJVCAyIC8qIGxzYiB1c2VkIGZvciBidW1wIG9mIGdvL2Fycml2ZWQgc3RhdGUgKi8KKworI2RlZmluZSBLTVBfQkFSUklFUl9TTEVFUF9TVEFURSAoMSA8PCBLTVBfQkFSUklFUl9TTEVFUF9CSVQpCisjZGVmaW5lIEtNUF9CQVJSSUVSX1VOVVNFRF9TVEFURSAoMSA8PCBLTVBfQkFSUklFUl9VTlVTRURfQklUKQorI2RlZmluZSBLTVBfQkFSUklFUl9TVEFURV9CVU1QICgxIDw8IEtNUF9CQVJSSUVSX0JVTVBfQklUKQorCisjaWYgKEtNUF9CQVJSSUVSX1NMRUVQX0JJVCA+PSBLTVBfQkFSUklFUl9CVU1QX0JJVCkKKyNlcnJvciAiQmFycmllciBzbGVlcCBiaXQgbXVzdCBiZSBzbWFsbGVyIHRoYW4gYmFycmllciBidW1wIGJpdCIKKyNlbmRpZgorI2lmIChLTVBfQkFSUklFUl9VTlVTRURfQklUID49IEtNUF9CQVJSSUVSX0JVTVBfQklUKQorI2Vycm9yICJCYXJyaWVyIHVudXNlZCBiaXQgbXVzdCBiZSBzbWFsbGVyIHRoYW4gYmFycmllciBidW1wIGJpdCIKKyNlbmRpZgorCisvLyBDb25zdGFudHMgZm9yIHJlbGVhc2UgYmFycmllciB3YWl0IHN0YXRlOiBjdXJyZW50bHksIGhpZXJhcmNoaWNhbCBvbmx5CisjZGVmaW5lIEtNUF9CQVJSSUVSX05PVF9XQUlUSU5HIDAgLy8gTm9ybWFsIHN0YXRlOyB3b3JrZXIgbm90IGluIHdhaXRfc2xlZXAKKyNkZWZpbmUgS01QX0JBUlJJRVJfT1dOX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDEgLy8gTm9ybWFsIHN0YXRlOyB3b3JrZXIgd2FpdGluZyBvbiBvd24gYl9nbyBmbGFnIGluIHJlbGVhc2UKKyNkZWZpbmUgS01QX0JBUlJJRVJfUEFSRU5UX0ZMQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDIgLy8gU3BlY2lhbCBzdGF0ZTsgd29ya2VyIHdhaXRpbmcgb24gcGFyZW50J3MgYl9nbyBmbGFnIGluIHJlbGVhc2UKKyNkZWZpbmUgS01QX0JBUlJJRVJfU1dJVENIX1RPX09XTl9GTEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDMgLy8gU3BlY2lhbCBzdGF0ZTsgdGVsbHMgd29ya2VyIHRvIHNoaWZ0IGZyb20gcGFyZW50IHRvIG93biBiX2dvCisjZGVmaW5lIEtNUF9CQVJSSUVSX1NXSVRDSElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICA0IC8vIFNwZWNpYWwgc3RhdGU7IHdvcmtlciByZXNldHMgYXBwcm9wcmlhdGUgZmxhZyBvbiB3YWtlLXVwCisKKyNkZWZpbmUgS01QX05PVF9TQUZFX1RPX1JFQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDAgLy8gVGhyZWFkIHRoX3JlYXBfc3RhdGU6IG5vdCBzYWZlIHRvIHJlYXAgKHRhc2tpbmcpCisjZGVmaW5lIEtNUF9TQUZFX1RPX1JFQVAgMSAvLyBUaHJlYWQgdGhfcmVhcF9zdGF0ZTogc2FmZSB0byByZWFwIChub3QgdGFza2luZykKKworZW51bSBiYXJyaWVyX3R5cGUgeworICBic19wbGFpbl9iYXJyaWVyID0gMCwgLyogMCwgQWxsIG5vbi1mb3JrL2pvaW4gYmFycmllcnMgKGV4Y2VwdCByZWR1Y3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhcnJpZXJzIGlmIGVuYWJsZWQpICovCisgIGJzX2Zvcmtqb2luX2JhcnJpZXIsIC8qIDEsIEFsbCBmb3JrL2pvaW4gKHBhcmFsbGVsIHJlZ2lvbikgYmFycmllcnMgKi8KKyNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICBic19yZWR1Y3Rpb25fYmFycmllciwgLyogMiwgQWxsIGJhcnJpZXJzIHRoYXQgYXJlIHVzZWQgaW4gcmVkdWN0aW9uICovCisjZW5kaWYgLy8gS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgYnNfbGFzdF9iYXJyaWVyIC8qIEp1c3QgYSBwbGFjZWhvbGRlciB0byBtYXJrIHRoZSBlbmQgKi8KK307CisKKy8vIHRvIHdvcmsgd2l0aCByZWR1Y3Rpb24gYmFycmllcnMganVzdCBsaWtlIHdpdGggcGxhaW4gYmFycmllcnMKKyNpZiAhS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyNkZWZpbmUgYnNfcmVkdWN0aW9uX2JhcnJpZXIgYnNfcGxhaW5fYmFycmllcgorI2VuZGlmIC8vIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisKK3R5cGVkZWYgZW51bSBrbXBfYmFyX3BhdCB7IC8qIEJhcnJpZXIgY29tbXVuaWNhdGlvbiBwYXR0ZXJucyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgYnBfbGluZWFyX2JhciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogU2luZ2xlIGxldmVsIChkZWdlbmVyYXRlKSB0cmVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBicF90cmVlX2JhciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgLyogQmFsYW5jZWQgdHJlZSB3aXRoIGJyYW5jaGluZyBmYWN0b3IgMl5uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBicF9oeXBlcl9iYXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIC8qIEh5cGVyY3ViZS1lbWJlZGRlZCB0cmVlIHdpdGggbWluIGJyYW5jaGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvciAyXm4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwX2hpZXJhcmNoaWNhbF9iYXIgPSAzLCAvKiBNYWNoaW5lIGhpZXJhcmNoeSB0cmVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBicF9sYXN0X2JhciA9IDQgLyogUGxhY2Vob2xkZXIgdG8gbWFyayB0aGUgZW5kICovCit9IGttcF9iYXJfcGF0X2U7CisKKyNkZWZpbmUgS01QX0JBUlJJRVJfSUNWX1BVU0ggMQorCisvKiBSZWNvcmQgZm9yIGhvbGRpbmcgdGhlIHZhbHVlcyBvZiB0aGUgaW50ZXJuYWwgY29udHJvbHMgc3RhY2sgcmVjb3JkcyAqLwordHlwZWRlZiBzdHJ1Y3Qga21wX2ludGVybmFsX2NvbnRyb2wgeworICBpbnQgc2VyaWFsX25lc3RpbmdfbGV2ZWw7IC8qIGNvcnJlc3BvbmRzIHRvIHRoZSB2YWx1ZSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aF90ZWFtX3NlcmlhbGl6ZWQgZmllbGQgKi8KKyAga21wX2ludDggbmVzdGVkOyAvKiBpbnRlcm5hbCBjb250cm9sIGZvciBuZXN0ZWQgcGFyYWxsZWxpc20gKHBlciB0aHJlYWQpICovCisgIGttcF9pbnQ4IGR5bmFtaWM7IC8qIGludGVybmFsIGNvbnRyb2wgZm9yIGR5bmFtaWMgYWRqdXN0bWVudCBvZiB0aHJlYWRzIChwZXIKKyAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkKSAqLworICBrbXBfaW50OAorICAgICAgYnRfc2V0OyAvKiBpbnRlcm5hbCBjb250cm9sIGZvciB3aGV0aGVyIGJsb2NrdGltZSBpcyBleHBsaWNpdGx5IHNldCAqLworICBpbnQgYmxvY2t0aW1lOyAvKiBpbnRlcm5hbCBjb250cm9sIGZvciBibG9ja3RpbWUgKi8KKyNpZiBLTVBfVVNFX01PTklUT1IKKyAgaW50IGJ0X2ludGVydmFsczsgLyogaW50ZXJuYWwgY29udHJvbCBmb3IgYmxvY2t0aW1lIGludGVydmFscyAqLworI2VuZGlmCisgIGludCBucHJvYzsgLyogaW50ZXJuYWwgY29udHJvbCBmb3IgI3RocmVhZHMgZm9yIG5leHQgcGFyYWxsZWwgcmVnaW9uIChwZXIKKyAgICAgICAgICAgICAgICB0aHJlYWQpICovCisgIGludCBtYXhfYWN0aXZlX2xldmVsczsgLyogaW50ZXJuYWwgY29udHJvbCBmb3IgbWF4X2FjdGl2ZV9sZXZlbHMgKi8KKyAga21wX3Jfc2NoZWRfdAorICAgICAgc2NoZWQ7IC8qIGludGVybmFsIGNvbnRyb2wgZm9yIHJ1bnRpbWUgc2NoZWR1bGUge3NjaGVkLGNodW5rfSBwYWlyICovCisjaWYgT01QXzQwX0VOQUJMRUQKKyAga21wX3Byb2NfYmluZF90IHByb2NfYmluZDsgLyogaW50ZXJuYWwgY29udHJvbCBmb3IgYWZmaW5pdHkgICovCisgIGttcF9pbnQzMiBkZWZhdWx0X2RldmljZTsgLyogaW50ZXJuYWwgY29udHJvbCBmb3IgZGVmYXVsdCBkZXZpY2UgKi8KKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorICBzdHJ1Y3Qga21wX2ludGVybmFsX2NvbnRyb2wgKm5leHQ7Cit9IGttcF9pbnRlcm5hbF9jb250cm9sX3Q7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X2ljdnMoa21wX2ludGVybmFsX2NvbnRyb2xfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90ICpzcmMpIHsKKyAgKmRzdCA9ICpzcmM7Cit9CisKKy8qIFRocmVhZCBiYXJyaWVyIG5lZWRzIHZvbGF0aWxlIGJhcnJpZXIgZmllbGRzICovCit0eXBlZGVmIHN0cnVjdCBLTVBfQUxJR05fQ0FDSEUga21wX2JzdGF0ZSB7CisgIC8vIHRoX2ZpeGVkX2ljdnMgaXMgYWxpZ25lZCBieSB2aXJ0dWUgb2Yga21wX2JzdGF0ZSBiZWluZyBhbGlnbmVkIChhbmQgYWxsCisgIC8vIHVzZXMgb2YgaXQpLiBJdCBpcyBub3QgZXhwbGljaXRseSBhbGlnbmVkIGJlbG93LCBiZWNhdXNlIHdlICpkb24ndCogd2FudAorICAvLyBpdCB0byBiZSBwYWRkZWQgLS0gaW5zdGVhZCwgd2UgZml0IGJfZ28gaW50byB0aGUgc2FtZSBjYWNoZSBsaW5lIHdpdGgKKyAgLy8gdGhfZml4ZWRfaWN2cywgZW5hYmxpbmcgTkdPIGNhY2hlIGxpbmVzIHN0b3JlcyBpbiB0aGUgaGllcmFyY2hpY2FsIGJhcnJpZXIuCisgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgdGhfZml4ZWRfaWN2czsgLy8gSW5pdGlhbCBJQ1ZzIGZvciB0aGUgdGhyZWFkCisgIC8vIFR1Y2sgYl9nbyBpbnRvIGVuZCBvZiB0aF9maXhlZF9pY3ZzIGNhY2hlIGxpbmUsIHNvIGl0IGNhbiBiZSBzdG9yZWQgd2l0aAorICAvLyBzYW1lIE5HTyBzdG9yZQorICB2b2xhdGlsZSBrbXBfdWludDY0IGJfZ287IC8vIFNUQVRFID0+IHRhc2sgc2hvdWxkIHByb2NlZWQgKGhpZXJhcmNoaWNhbCkKKyAgS01QX0FMSUdOX0NBQ0hFIHZvbGF0aWxlIGttcF91aW50NjQKKyAgICAgIGJfYXJyaXZlZDsgLy8gU1RBVEUgPT4gdGFzayByZWFjaGVkIHN5bmNoIHBvaW50LgorICBrbXBfdWludDMyICpza2lwX3Blcl9sZXZlbDsKKyAga21wX3VpbnQzMiBteV9sZXZlbDsKKyAga21wX2ludDMyIHBhcmVudF90aWQ7CisgIGttcF9pbnQzMiBvbGRfdGlkOworICBrbXBfdWludDMyIGRlcHRoOworICBzdHJ1Y3Qga21wX2JzdGF0ZSAqcGFyZW50X2JhcjsKKyAga21wX3RlYW1fdCAqdGVhbTsKKyAga21wX3VpbnQ2NCBsZWFmX3N0YXRlOworICBrbXBfdWludDMyIG5wcm9jOworICBrbXBfdWludDggYmFzZV9sZWFmX2tpZHM7CisgIGttcF91aW50OCBsZWFmX2tpZHM7CisgIGttcF91aW50OCBvZmZzZXQ7CisgIGttcF91aW50OCB3YWl0X2ZsYWc7CisgIGttcF91aW50OCB1c2Vfb25jb3JlX2JhcnJpZXI7CisjaWYgVVNFX0RFQlVHR0VSCisgIC8vIFRoZSBmb2xsb3dpbmcgZmllbGQgaXMgaW50ZW5kZWQgZm9yIHRoZSBkZWJ1Z2dlciBzb2xlbHkuIE9ubHkgdGhlIHdvcmtlcgorICAvLyB0aHJlYWQgaXRzZWxmIGFjY2Vzc2VzIHRoaXMgZmllbGQ6IHRoZSB3b3JrZXIgaW5jcmVhc2VzIGl0IGJ5IDEgd2hlbiBpdAorICAvLyBhcnJpdmVzIHRvIGEgYmFycmllci4KKyAgS01QX0FMSUdOX0NBQ0hFIGttcF91aW50IGJfd29ya2VyX2Fycml2ZWQ7CisjZW5kaWYgLyogVVNFX0RFQlVHR0VSICovCit9IGttcF9ic3RhdGVfdDsKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9iYXJyaWVyX3VuaW9uIHsKKyAgZG91YmxlIGJfYWxpZ247IC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICBjaGFyIGJfcGFkW0tNUF9QQUQoa21wX2JzdGF0ZV90LCBDQUNIRV9MSU5FKV07CisgIGttcF9ic3RhdGVfdCBiYjsKK307CisKK3R5cGVkZWYgdW5pb24ga21wX2JhcnJpZXJfdW5pb24ga21wX2JhbGlnbl90OworCisvKiBUZWFtIGJhcnJpZXIgbmVlZHMgb25seSBub24tdm9sYXRpbGUgYXJyaXZlZCBjb3VudGVyICovCit1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX2JhcnJpZXJfdGVhbV91bmlvbiB7CisgIGRvdWJsZSBiX2FsaWduOyAvKiB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQgKi8KKyAgY2hhciBiX3BhZFtDQUNIRV9MSU5FXTsKKyAgc3RydWN0IHsKKyAgICBrbXBfdWludDY0IGJfYXJyaXZlZDsgLyogU1RBVEUgPT4gdGFzayByZWFjaGVkIHN5bmNoIHBvaW50LiAqLworI2lmIFVTRV9ERUJVR0dFUgorICAgIC8vIFRoZSBmb2xsb3dpbmcgdHdvIGZpZWxkcyBhcmUgaW5kZW5kZWQgZm9yIHRoZSBkZWJ1Z2dlciBzb2xlbHkuIE9ubHkKKyAgICAvLyBtYXN0ZXIgb2YgdGhlIHRlYW0gYWNjZXNzZXMgdGhlc2UgZmllbGRzOiB0aGUgZmlyc3Qgb25lIGlzIGluY3JlYXNlZCBieQorICAgIC8vIDEgd2hlbiBtYXN0ZXIgYXJyaXZlcyB0byBhIGJhcnJpZXIsIHRoZSBzZWNvbmQgb25lIGlzIGluY3JlYXNlZCBieSBvbmUKKyAgICAvLyB3aGVuIGFsbCB0aGUgdGhyZWFkcyBhcnJpdmVkLgorICAgIGttcF91aW50IGJfbWFzdGVyX2Fycml2ZWQ7CisgICAga21wX3VpbnQgYl90ZWFtX2Fycml2ZWQ7CisjZW5kaWYKKyAgfTsKK307CisKK3R5cGVkZWYgdW5pb24ga21wX2JhcnJpZXJfdGVhbV91bmlvbiBrbXBfYmFsaWduX3RlYW1fdDsKKworLyogUGFkZGluZyBmb3IgTGludXgqIE9TIHB0aHJlYWRzIGNvbmRpdGlvbiB2YXJpYWJsZXMgYW5kIG11dGV4ZXMgdXNlZCB0byBzaWduYWwKKyAgIHRocmVhZHMgd2hlbiBhIGNvbmRpdGlvbiBjaGFuZ2VzLiAgVGhpcyBpcyB0byB3b3JrYXJvdW5kIGFuIE5QVEwgYnVnIHdoZXJlCisgICBwYWRkaW5nIHdhcyBhZGRlZCB0byBwdGhyZWFkX2NvbmRfdCB3aGljaCBjYXVzZWQgdGhlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUKKyAgIHRvIHdyaXRlIG91dHNpZGUgb2YgdGhlIHN0cnVjdHVyZSBpZiBjb21waWxlZCBvbiBwcmUtTlBUTCB0aHJlYWRzLiAgKi8KKyNpZiBLTVBfT1NfV0lORE9XUwordHlwZWRlZiBzdHJ1Y3Qga21wX3dpbjMyX211dGV4IHsKKyAgLyogVGhlIExvY2sgKi8KKyAgQ1JJVElDQUxfU0VDVElPTiBjczsKK30ga21wX3dpbjMyX211dGV4X3Q7CisKK3R5cGVkZWYgc3RydWN0IGttcF93aW4zMl9jb25kIHsKKyAgLyogQ291bnQgb2YgdGhlIG51bWJlciBvZiB3YWl0ZXJzLiAqLworICBpbnQgd2FpdGVyc19jb3VudF87CisKKyAgLyogU2VyaWFsaXplIGFjY2VzcyB0byA8d2FpdGVyc19jb3VudF8+ICovCisgIGttcF93aW4zMl9tdXRleF90IHdhaXRlcnNfY291bnRfbG9ja187CisKKyAgLyogTnVtYmVyIG9mIHRocmVhZHMgdG8gcmVsZWFzZSB2aWEgYSA8Y29uZF9icm9hZGNhc3Q+IG9yIGEgPGNvbmRfc2lnbmFsPiAqLworICBpbnQgcmVsZWFzZV9jb3VudF87CisKKyAgLyogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgImdlbmVyYXRpb24iIHNvIHRoYXQgd2UgZG9uJ3QgYWxsb3cgKi8KKyAgLyogb25lIHRocmVhZCB0byBzdGVhbCBhbGwgdGhlICJyZWxlYXNlcyIgZnJvbSB0aGUgYnJvYWRjYXN0LiAqLworICBpbnQgd2FpdF9nZW5lcmF0aW9uX2NvdW50XzsKKworICAvKiBBIG1hbnVhbC1yZXNldCBldmVudCB0aGF0J3MgdXNlZCB0byBibG9jayBhbmQgcmVsZWFzZSB3YWl0aW5nIHRocmVhZHMuICovCisgIEhBTkRMRSBldmVudF87Cit9IGttcF93aW4zMl9jb25kX3Q7CisjZW5kaWYKKworI2lmIEtNUF9PU19VTklYCisKK3VuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfY29uZF91bmlvbiB7CisgIGRvdWJsZSBjX2FsaWduOworICBjaGFyIGNfcGFkW0NBQ0hFX0xJTkVdOworICBwdGhyZWFkX2NvbmRfdCBjX2NvbmQ7Cit9OworCit0eXBlZGVmIHVuaW9uIGttcF9jb25kX3VuaW9uIGttcF9jb25kX2FsaWduX3Q7CisKK3VuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfbXV0ZXhfdW5pb24geworICBkb3VibGUgbV9hbGlnbjsKKyAgY2hhciBtX3BhZFtDQUNIRV9MSU5FXTsKKyAgcHRocmVhZF9tdXRleF90IG1fbXV0ZXg7Cit9OworCit0eXBlZGVmIHVuaW9uIGttcF9tdXRleF91bmlvbiBrbXBfbXV0ZXhfYWxpZ25fdDsKKworI2VuZGlmIC8qIEtNUF9PU19VTklYICovCisKK3R5cGVkZWYgc3RydWN0IGttcF9kZXNjX2Jhc2UgeworICB2b2lkICpkc19zdGFja2Jhc2U7CisgIHNpemVfdCBkc19zdGFja3NpemU7CisgIGludCBkc19zdGFja2dyb3c7CisgIGttcF90aHJlYWRfdCBkc190aHJlYWQ7CisgIHZvbGF0aWxlIGludCBkc190aWQ7CisgIGludCBkc19ndGlkOworI2lmIEtNUF9PU19XSU5ET1dTCisgIHZvbGF0aWxlIGludCBkc19hbGl2ZTsKKyAgRFdPUkQgZHNfdGhyZWFkX2lkOworLyogZHNfdGhyZWFkIGtlZXBzIHRocmVhZCBoYW5kbGUgb24gV2luZG93cyogT1MuIEl0IGlzIGVub3VnaCBmb3IgUlRMIHB1cnBvc2VzLgorICAgSG93ZXZlciwgZGVidWdnZXIgc3VwcG9ydCAobGlib21wX2RiKSBjYW5ub3Qgd29yayB3aXRoIGhhbmRsZXMsIGJlY2F1c2UgdGhleQorICAgdW5jb21wYXJhYmxlLiBGb3IgZXhhbXBsZSwgZGVidWdnZXIgcmVxdWVzdHMgaW5mbyBhYm91dCB0aHJlYWQgd2l0aCBoYW5kbGUgaC4KKyAgIGggaXMgdmFsaWQgd2l0aGluIGRlYnVnZ2VyIHByb2Nlc3MsIGFuZCBtZWFuaW5nbGVzcyB3aXRoaW4gZGVidWdlZSBwcm9jZXNzLgorICAgRXZlbiBpZiBoIGlzIGR1cGVkIGJ5IGNhbGwgdG8gRHVwbGljYXRlSGFuZGxlKCksIHNvIHRoZSByZXN1bHQgaCcgaXMgdmFsaWQKKyAgIHdpdGhpbiBkZWJ1Z2VlIHByb2Nlc3MsIGJ1dCBpdCBpcyBhICpuZXcqIGhhbmRsZSB3aGljaCBkb2VzICpub3QqIGVxdWFsIHRvCisgICBhbnkgb3RoZXIgaGFuZGxlIGluIGRlYnVnZWUuLi4gVGhlIG9ubHkgd2F5IHRvIGNvbXBhcmUgaGFuZGxlcyBpcyBjb252ZXJ0CisgICB0aGVtIHRvIHN5c3RlbS13aWRlIGlkcy4gR2V0VGhyZWFkSWQoKSBmdW5jdGlvbiBpcyBhdmFpbGFibGUgb25seSBpbgorICAgTG9uZ2hvcm4gYW5kIFNlcnZlciAyMDAzLiA6LSggSW4gY29udHJhc3QsIEdldEN1cnJlbnRUaHJlYWRJZCgpIGlzIGF2YWlsYWJsZQorICAgb24gYWxsIFdpbmRvd3MqIE9TIGZsYXZvdXJzIChpbmNsdWRpbmcgV2luZG93cyogOTUpLiBUaHVzLCB3ZSBoYXZlIHRvIGdldAorICAgdGhyZWFkIGlkIGJ5IGNhbGwgdG8gR2V0Q3VycmVudFRocmVhZElkKCkgZnJvbSB3aXRoaW4gdGhlIHRocmVhZCBhbmQgc2F2ZSBpdAorICAgdG8gbGV0IGxpYm9tcF9kYiBpZGVudGlmeSB0aHJlYWRzLiAgKi8KKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworfSBrbXBfZGVzY19iYXNlX3Q7CisKK3R5cGVkZWYgdW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9kZXNjIHsKKyAgZG91YmxlIGRzX2FsaWduOyAvKiB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQgKi8KKyAgY2hhciBkc19wYWRbS01QX1BBRChrbXBfZGVzY19iYXNlX3QsIENBQ0hFX0xJTkUpXTsKKyAga21wX2Rlc2NfYmFzZV90IGRzOworfSBrbXBfZGVzY190OworCit0eXBlZGVmIHN0cnVjdCBrbXBfbG9jYWwgeworICB2b2xhdGlsZSBpbnQgdGhpc19jb25zdHJ1Y3Q7IC8qIGNvdW50IG9mIHNpbmdsZSdzIGVuY291bnRlcmVkIGJ5IHRocmVhZCAqLworICB2b2lkICpyZWR1Y2VfZGF0YTsKKyNpZiBLTVBfVVNFX0JHRVQKKyAgdm9pZCAqYmdldF9kYXRhOworICB2b2lkICpiZ2V0X2xpc3Q7CisjaWYgIVVTRV9DTVBfWENIR19GT1JfQkdFVAorI2lmZGVmIFVTRV9RVUVVSU5HX0xPQ0tfRk9SX0JHRVQKKyAga21wX2xvY2tfdCBiZ2V0X2xvY2s7IC8qIExvY2sgZm9yIGFjY2Vzc2luZyBiZ2V0IGZyZWUgbGlzdCAqLworI2Vsc2UKKyAga21wX2Jvb3RzdHJhcF9sb2NrX3QgYmdldF9sb2NrOyAvLyBMb2NrIGZvciBhY2Nlc3NpbmcgYmdldCBmcmVlIGxpc3QuIE11c3QgYmUKKy8vIGJvb3RzdHJhcCBsb2NrIHNvIHdlIGNhbiB1c2UgaXQgYXQgbGlicmFyeQorLy8gc2h1dGRvd24uCisjZW5kaWYgLyogVVNFX0xPQ0tfRk9SX0JHRVQgKi8KKyNlbmRpZiAvKiAhIFVTRV9DTVBfWENIR19GT1JfQkdFVCAqLworI2VuZGlmIC8qIEtNUF9VU0VfQkdFVCAqLworCisjaWZkZWYgQlVJTERfVFYKKyAgc3RydWN0IHR2X2RhdGEgKnR2X2RhdGE7CisjZW5kaWYKKworICBQQUNLRURfUkVEVUNUSU9OX01FVEhPRF9UCisgIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kOyAvKiBzdG9yZWQgYnkgX19rbXBjX3JlZHVjZSooKSwgdXNlZCBieQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBjX2VuZF9yZWR1Y2UqKCkgKi8KKworfSBrbXBfbG9jYWxfdDsKKworI2RlZmluZSBLTVBfQ0hFQ0tfVVBEQVRFKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKChhKSAhPSAoYikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChhKSA9IChiKQorI2RlZmluZSBLTVBfQ0hFQ0tfVVBEQVRFX1NZTkMoYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKChhKSAhPSAoYikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRDV19TWU5DX1BUUigoYSksIChiKSkKKworI2RlZmluZSBnZXRfX2Jsb2NrdGltZSh4dGVhbSwgeHRpZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCh4dGVhbSktPnQudF90aHJlYWRzWyh4dGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5ibG9ja3RpbWUpCisjZGVmaW5lIGdldF9fYnRfc2V0KHh0ZWFtLCB4dGlkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKHh0ZWFtKS0+dC50X3RocmVhZHNbKHh0aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLmJ0X3NldCkKKyNpZiBLTVBfVVNFX01PTklUT1IKKyNkZWZpbmUgZ2V0X19idF9pbnRlcnZhbHMoeHRlYW0sIHh0aWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoeHRlYW0pLT50LnRfdGhyZWFkc1soeHRpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuYnRfaW50ZXJ2YWxzKQorI2VuZGlmCisKKyNkZWZpbmUgZ2V0X19uZXN0ZWRfMih4dGVhbSwgeHRpZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoeHRlYW0pLT50LnRfdGhyZWFkc1soeHRpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubmVzdGVkKQorI2RlZmluZSBnZXRfX2R5bmFtaWNfMih4dGVhbSwgeHRpZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCh4dGVhbSktPnQudF90aHJlYWRzWyh4dGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5keW5hbWljKQorI2RlZmluZSBnZXRfX25wcm9jXzIoeHRlYW0sIHh0aWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCh4dGVhbSktPnQudF90aHJlYWRzWyh4dGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5ucHJvYykKKyNkZWZpbmUgZ2V0X19zY2hlZF8yKHh0ZWFtLCB4dGlkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoeHRlYW0pLT50LnRfdGhyZWFkc1soeHRpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuc2NoZWQpCisKKyNkZWZpbmUgc2V0X19ibG9ja3RpbWVfdGVhbSh4dGVhbSwgeHRpZCwgeHZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKHh0ZWFtKS0+dC50X3RocmVhZHNbKHh0aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLmJsb2NrdGltZSkgPSAgICAgXAorICAgICAgICh4dmFsKSkKKworI2lmIEtNUF9VU0VfTU9OSVRPUgorI2RlZmluZSBzZXRfX2J0X2ludGVydmFsc190ZWFtKHh0ZWFtLCB4dGlkLCB4dmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoeHRlYW0pLT50LnRfdGhyZWFkc1soeHRpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuYnRfaW50ZXJ2YWxzKSA9ICBcCisgICAgICAgKHh2YWwpKQorI2VuZGlmCisKKyNkZWZpbmUgc2V0X19idF9zZXRfdGVhbSh4dGVhbSwgeHRpZCwgeHZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKHh0ZWFtKS0+dC50X3RocmVhZHNbKHh0aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLmJ0X3NldCkgPSAoeHZhbCkpCisKKyNkZWZpbmUgc2V0X19uZXN0ZWQoeHRocmVhZCwgeHZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKHh0aHJlYWQpLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubmVzdGVkKSA9ICh4dmFsKSkKKyNkZWZpbmUgZ2V0X19uZXN0ZWQoeHRocmVhZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKHh0aHJlYWQpLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubmVzdGVkKSA/IChGVE5fVFJVRSkgOiAoRlROX0ZBTFNFKSkKKworI2RlZmluZSBzZXRfX2R5bmFtaWMoeHRocmVhZCwgeHZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoeHRocmVhZCktPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5keW5hbWljKSA9ICh4dmFsKSkKKyNkZWZpbmUgZ2V0X19keW5hbWljKHh0aHJlYWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKHh0aHJlYWQpLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuZHluYW1pYykgPyAoRlROX1RSVUUpIDogKEZUTl9GQUxTRSkpCisKKyNkZWZpbmUgc2V0X19ucHJvYyh4dGhyZWFkLCB4dmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoKHh0aHJlYWQpLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubnByb2MpID0gKHh2YWwpKQorCisjZGVmaW5lIHNldF9fbWF4X2FjdGl2ZV9sZXZlbHMoeHRocmVhZCwgeHZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCh4dGhyZWFkKS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm1heF9hY3RpdmVfbGV2ZWxzKSA9ICh4dmFsKSkKKworI2RlZmluZSBzZXRfX3NjaGVkKHh0aHJlYWQsIHh2YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCgoeHRocmVhZCktPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5zY2hlZCkgPSAoeHZhbCkpCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCisjZGVmaW5lIHNldF9fcHJvY19iaW5kKHh0aHJlYWQsIHh2YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKCh4dGhyZWFkKS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnByb2NfYmluZCkgPSAoeHZhbCkpCisjZGVmaW5lIGdldF9fcHJvY19iaW5kKHh0aHJlYWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKHh0aHJlYWQpLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMucHJvY19iaW5kKQorCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworLy8gT3Blbk1QIHRhc2tpbmcgZGF0YSBzdHJ1Y3R1cmVzCisKK3R5cGVkZWYgZW51bSBrbXBfdGFza2luZ19tb2RlIHsKKyAgdHNrbV9pbW1lZGlhdGVfZXhlYyA9IDAsCisgIHRza21fZXh0cmFfYmFycmllciA9IDEsCisgIHRza21fdGFza190ZWFtcyA9IDIsCisgIHRza21fbWF4ID0gMgorfSBrbXBfdGFza2luZ19tb2RlX3Q7CisKK2V4dGVybiBrbXBfdGFza2luZ19tb2RlX3QKKyAgICBfX2ttcF90YXNraW5nX21vZGU7IC8qIGRldGVybWluZXMgaG93L3doZW4gdG8gZXhlY3V0ZSB0YXNrcyAqLworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF90YXNrX3N0ZWFsaW5nX2NvbnN0cmFpbnQ7CisjaWYgT01QXzQwX0VOQUJMRUQKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfZGVmYXVsdF9kZXZpY2U7IC8vIFNldCB2aWEgT01QX0RFRkFVTFRfREVWSUNFIGlmCisvLyBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIDAgb3RoZXJ3aXNlCisjZW5kaWYKKyNpZiBPTVBfNDVfRU5BQkxFRAorLy8gU2V0IHZpYSBPTVBfTUFYX1RBU0tfUFJJT1JJVFkgaWYgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byAwIG90aGVyd2lzZQorZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF9tYXhfdGFza19wcmlvcml0eTsKKy8vIFNldCB2aWEgS01QX1RBU0tMT09QX01JTl9UQVNLUyBpZiBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIDAgb3RoZXJ3aXNlCitleHRlcm4ga21wX3VpbnQ2NCBfX2ttcF90YXNrbG9vcF9taW5fdGFza3M7CisjZW5kaWYKKworLyogTk9URToga21wX3Rhc2tkYXRhX3QgYW5kIGttcF90YXNrX3Qgc3RydWN0dXJlcyBhbGxvY2F0ZWQgaW4gc2luZ2xlIGJsb2NrIHdpdGgKKyAgIHRhc2tkYXRhIGZpcnN0ICovCisjZGVmaW5lIEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spICgoKGttcF90YXNrZGF0YV90ICopdGFzaykgLSAxKQorI2RlZmluZSBLTVBfVEFTS0RBVEFfVE9fVEFTSyh0YXNrZGF0YSkgKGttcF90YXNrX3QgKikodGFza2RhdGEgKyAxKQorCisvLyBUaGUgdHRfZm91bmRfdGFza3MgZmxhZyBpcyBhIHNpZ25hbCB0byBhbGwgdGhyZWFkcyBpbiB0aGUgdGVhbSB0aGF0IHRhc2tzCisvLyB3ZXJlIHNwYXduZWQgYW5kIHF1ZXVlZCBzaW5jZSB0aGUgcHJldmlvdXMgYmFycmllciByZWxlYXNlLgorI2RlZmluZSBLTVBfVEFTS0lOR19FTkFCTEVEKHRhc2tfdGVhbSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFRDUl9TWU5DXzQoKHRhc2tfdGVhbSktPnR0LnR0X2ZvdW5kX3Rhc2tzKSA9PSBUUlVFKQorLyohCitAaW5ncm91cCBCQVNJQ19UWVBFUworQHsKKyovCisKKy8qIQorICovCit0eXBlZGVmIGttcF9pbnQzMiAoKmttcF9yb3V0aW5lX2VudHJ5X3QpKGttcF9pbnQzMiwgdm9pZCAqKTsKKworI2lmIE9NUF80MF9FTkFCTEVEIHx8IE9NUF80NV9FTkFCTEVECit0eXBlZGVmIHVuaW9uIGttcF9jbXBscmRhdGEgeworI2lmIE9NUF80NV9FTkFCTEVECisgIGttcF9pbnQzMiBwcmlvcml0eTsgLyoqPCBwcmlvcml0eSBzcGVjaWZpZWQgYnkgdXNlciBmb3IgdGhlIHRhc2sgKi8KKyNlbmRpZiAvLyBPTVBfNDVfRU5BQkxFRAorI2lmIE9NUF80MF9FTkFCTEVECisgIGttcF9yb3V0aW5lX2VudHJ5X3QKKyAgICAgIGRlc3RydWN0b3JzOyAvKiBwb2ludGVyIHRvIGZ1bmN0aW9uIHRvIGludm9rZSBkZWNvbnN0cnVjdG9ycyBvZgorICAgICAgICAgICAgICAgICAgICAgIGZpcnN0cHJpdmF0ZSBDKysgb2JqZWN0cyAqLworI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVECisgIC8qIGZ1dHVyZSBkYXRhICovCit9IGttcF9jbXBscmRhdGFfdDsKKyNlbmRpZgorCisvKiAgc2l6ZW9mX2ttcF90YXNrX3QgcGFzc2VkIGFzIGFyZyB0byBrbXBjX29tcF90YXNrIGNhbGwgICovCisvKiEKKyAqLwordHlwZWRlZiBzdHJ1Y3Qga21wX3Rhc2sgeyAvKiBHRUg6IFNob3VsZG4ndCB0aGlzIGJlIGFsaWduZWQgc29tZWhvdz8gKi8KKyAgdm9pZCAqc2hhcmVkczsgLyoqPCBwb2ludGVyIHRvIGJsb2NrIG9mIHBvaW50ZXJzIHRvIHNoYXJlZCB2YXJzICAgKi8KKyAga21wX3JvdXRpbmVfZW50cnlfdAorICAgICAgcm91dGluZTsgLyoqPCBwb2ludGVyIHRvIHJvdXRpbmUgdG8gY2FsbCBmb3IgZXhlY3V0aW5nIHRhc2sgKi8KKyAga21wX2ludDMyIHBhcnRfaWQ7IC8qKjwgcGFydCBpZCBmb3IgdGhlIHRhc2sgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWYgT01QXzQwX0VOQUJMRUQgfHwgT01QXzQ1X0VOQUJMRUQKKyAga21wX2NtcGxyZGF0YV90CisgICAgICBkYXRhMTsgLyogVHdvIGtub3duIG9wdGlvbmFsIGFkZGl0aW9uczogZGVzdHJ1Y3RvcnMgYW5kIHByaW9yaXR5ICovCisgIGttcF9jbXBscmRhdGFfdCBkYXRhMjsgLyogUHJvY2VzcyBkZXN0cnVjdG9ycyBmaXJzdCwgcHJpb3JpdHkgc2Vjb25kICovCisvKiBmdXR1cmUgZGF0YSAqLworI2VuZGlmCisgIC8qICBwcml2YXRlIHZhcnMgICovCit9IGttcF90YXNrX3Q7CisKKy8qIQorQH0KKyovCisKKyNpZiBPTVBfNDBfRU5BQkxFRAordHlwZWRlZiBzdHJ1Y3Qga21wX3Rhc2tncm91cCB7CisgIGttcF9pbnQzMiBjb3VudDsgLy8gbnVtYmVyIG9mIGFsbG9jYXRlZCBhbmQgbm90IHlldCBjb21wbGV0ZSB0YXNrcworICBrbXBfaW50MzIgY2FuY2VsX3JlcXVlc3Q7IC8vIHJlcXVlc3QgZm9yIGNhbmNlbGxhdGlvbiBvZiB0aGlzIHRhc2tncm91cAorICBzdHJ1Y3Qga21wX3Rhc2tncm91cCAqcGFyZW50OyAvLyBwYXJlbnQgdGFza2dyb3VwCisvLyBUT0RPOiBjaGFuZ2UgdG8gT01QXzUwX0VOQUJMRUQsIG5lZWQgdG8gY2hhbmdlIGJ1aWxkIHRvb2xzIGZvciB0aGlzIHRvIHdvcmsKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAvLyBCbG9jayBvZiBkYXRhIHRvIHBlcmZvcm0gdGFzayByZWR1Y3Rpb24KKyAgdm9pZCAqcmVkdWNlX2RhdGE7IC8vIHJlZHVjdGlvbiByZWxhdGVkIGluZm8KKyAga21wX2ludDMyIHJlZHVjZV9udW1fZGF0YTsgLy8gbnVtYmVyIG9mIGRhdGEgaXRlbXMgdG8gcmVkdWNlCisjZW5kaWYKK30ga21wX3Rhc2tncm91cF90OworCisvLyBmb3J3YXJkIGRlY2xhcmF0aW9ucwordHlwZWRlZiB1bmlvbiBrbXBfZGVwbm9kZSBrbXBfZGVwbm9kZV90OwordHlwZWRlZiBzdHJ1Y3Qga21wX2RlcG5vZGVfbGlzdCBrbXBfZGVwbm9kZV9saXN0X3Q7Cit0eXBlZGVmIHN0cnVjdCBrbXBfZGVwaGFzaF9lbnRyeSBrbXBfZGVwaGFzaF9lbnRyeV90OworCit0eXBlZGVmIHN0cnVjdCBrbXBfZGVwZW5kX2luZm8geworICBrbXBfaW50cHRyX3QgYmFzZV9hZGRyOworICBzaXplX3QgbGVuOworICBzdHJ1Y3QgeworICAgIGJvb2wgaW4gOiAxOworICAgIGJvb2wgb3V0IDogMTsKKyAgfSBmbGFnczsKK30ga21wX2RlcGVuZF9pbmZvX3Q7CisKK3N0cnVjdCBrbXBfZGVwbm9kZV9saXN0IHsKKyAga21wX2RlcG5vZGVfdCAqbm9kZTsKKyAga21wX2RlcG5vZGVfbGlzdF90ICpuZXh0OworfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfZGVwbm9kZSB7CisgIGttcF9kZXBub2RlX2xpc3RfdCAqc3VjY2Vzc29yczsKKyAga21wX3Rhc2tfdCAqdGFzazsKKworICBrbXBfbG9ja190IGxvY2s7CisKKyNpZiBLTVBfU1VQUE9SVF9HUkFQSF9PVVRQVVQKKyAga21wX3VpbnQzMiBpZDsKKyNlbmRpZgorCisgIHZvbGF0aWxlIGttcF9pbnQzMiBucHJlZGVjZXNzb3JzOworICB2b2xhdGlsZSBrbXBfaW50MzIgbnJlZnM7Cit9IGttcF9iYXNlX2RlcG5vZGVfdDsKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9kZXBub2RlIHsKKyAgZG91YmxlIGRuX2FsaWduOyAvKiB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQgKi8KKyAgY2hhciBkbl9wYWRbS01QX1BBRChrbXBfYmFzZV9kZXBub2RlX3QsIENBQ0hFX0xJTkUpXTsKKyAga21wX2Jhc2VfZGVwbm9kZV90IGRuOworfTsKKworc3RydWN0IGttcF9kZXBoYXNoX2VudHJ5IHsKKyAga21wX2ludHB0cl90IGFkZHI7CisgIGttcF9kZXBub2RlX3QgKmxhc3Rfb3V0OworICBrbXBfZGVwbm9kZV9saXN0X3QgKmxhc3RfaW5zOworICBrbXBfZGVwaGFzaF9lbnRyeV90ICpuZXh0X2luX2J1Y2tldDsKK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9kZXBoYXNoIHsKKyAga21wX2RlcGhhc2hfZW50cnlfdCAqKmJ1Y2tldHM7CisgIHNpemVfdCBzaXplOworI2lmZGVmIEtNUF9ERUJVRworICBrbXBfdWludDMyIG5lbGVtZW50czsKKyAga21wX3VpbnQzMiBuY29uZmxpY3RzOworI2VuZGlmCit9IGttcF9kZXBoYXNoX3Q7CisKKyNlbmRpZgorCisjaWZkZWYgQlVJTERfVElFRF9UQVNLX1NUQUNLCisKKy8qIFRpZWQgVGFzayBzdGFjayBkZWZpbml0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3Qga21wX3N0YWNrX2Jsb2NrIHsKKyAga21wX3Rhc2tkYXRhX3QgKnNiX2Jsb2NrW1RBU0tfU1RBQ0tfQkxPQ0tfU0laRV07CisgIHN0cnVjdCBrbXBfc3RhY2tfYmxvY2sgKnNiX25leHQ7CisgIHN0cnVjdCBrbXBfc3RhY2tfYmxvY2sgKnNiX3ByZXY7Cit9IGttcF9zdGFja19ibG9ja190OworCit0eXBlZGVmIHN0cnVjdCBrbXBfdGFza19zdGFjayB7CisgIGttcF9zdGFja19ibG9ja190IHRzX2ZpcnN0X2Jsb2NrOyAvLyBmaXJzdCBibG9jayBvZiBzdGFjayBlbnRyaWVzCisgIGttcF90YXNrZGF0YV90ICoqdHNfdG9wOyAvLyBwb2ludGVyIHRvIHRoZSB0b3Agb2Ygc3RhY2sKKyAga21wX2ludDMyIHRzX2VudHJpZXM7IC8vIG51bWJlciBvZiBlbnRyaWVzIG9uIHRoZSBzdGFjaworfSBrbXBfdGFza19zdGFja190OworCisjZW5kaWYgLy8gQlVJTERfVElFRF9UQVNLX1NUQUNLCisKK3R5cGVkZWYgc3RydWN0IGttcF90YXNraW5nX2ZsYWdzIHsgLyogVG90YWwgc3RydWN0IG11c3QgYmUgZXhhY3RseSAzMiBiaXRzICovCisgIC8qIENvbXBpbGVyIGZsYWdzICovIC8qIFRvdGFsIGNvbXBpbGVyIGZsYWdzIG11c3QgYmUgMTYgYml0cyAqLworICB1bnNpZ25lZCB0aWVkbmVzcyA6IDE7IC8qIHRhc2sgaXMgZWl0aGVyIHRpZWQgKDEpIG9yIHVudGllZCAoMCkgKi8KKyAgdW5zaWduZWQgZmluYWwgOiAxOyAvKiB0YXNrIGlzIGZpbmFsKDEpIHNvIGV4ZWN1dGUgaW1tZWRpYXRlbHkgKi8KKyAgdW5zaWduZWQgbWVyZ2VkX2lmMCA6IDE7IC8qIG5vIF9fa21wY190YXNrX3tiZWdpbi9jb21wbGV0ZX1faWYwIGNhbGxzIGluIGlmMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSBwYXRoICovCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgdW5zaWduZWQgZGVzdHJ1Y3RvcnNfdGh1bmsgOiAxOyAvKiBzZXQgaWYgdGhlIGNvbXBpbGVyIGNyZWF0ZXMgYSB0aHVuayB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludm9rZSBkZXN0cnVjdG9ycyBmcm9tIHRoZSBydW50aW1lICovCisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgdW5zaWduZWQgcHJveHkgOiAxOyAvKiB0YXNrIGlzIGEgcHJveHkgdGFzayAoaXQgd2lsbCBiZSBleGVjdXRlZCBvdXRzaWRlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQgb2YgdGhlIFJUTCkgKi8KKyAgdW5zaWduZWQgcHJpb3JpdHlfc3BlY2lmaWVkIDogMTsgLyogc2V0IGlmIHRoZSBjb21waWxlciBwcm92aWRlcyBwcmlvcml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nIGZvciB0aGUgdGFzayAqLworICB1bnNpZ25lZCByZXNlcnZlZCA6IDEwOyAvKiByZXNlcnZlZCBmb3IgY29tcGlsZXIgdXNlICovCisjZWxzZQorICB1bnNpZ25lZCByZXNlcnZlZCA6IDEyOyAvKiByZXNlcnZlZCBmb3IgY29tcGlsZXIgdXNlICovCisjZW5kaWYKKyNlbHNlIC8vIE9NUF80MF9FTkFCTEVECisgIHVuc2lnbmVkIHJlc2VydmVkIDogMTM7IC8qIHJlc2VydmVkIGZvciBjb21waWxlciB1c2UgKi8KKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisgIC8qIExpYnJhcnkgZmxhZ3MgKi8gLyogVG90YWwgbGlicmFyeSBmbGFncyBtdXN0IGJlIDE2IGJpdHMgKi8KKyAgdW5zaWduZWQgdGFza3R5cGUgOiAxOyAvKiB0YXNrIGlzIGVpdGhlciBleHBsaWNpdCgxKSBvciBpbXBsaWNpdCAoMCkgKi8KKyAgdW5zaWduZWQgdGFza19zZXJpYWwgOiAxOyAvLyB0YXNrIGlzIGV4ZWN1dGVkIGltbWVkaWF0ZWx5ICgxKSBvciBkZWZlcnJlZCAoMCkKKyAgdW5zaWduZWQgdGFza2luZ19zZXIgOiAxOyAvLyBhbGwgdGFza3MgaW4gdGVhbSBhcmUgZWl0aGVyIGV4ZWN1dGVkIGltbWVkaWF0ZWx5CisgIC8vICgxKSBvciBtYXkgYmUgZGVmZXJyZWQgKDApCisgIHVuc2lnbmVkIHRlYW1fc2VyaWFsIDogMTsgLy8gZW50aXJlIHRlYW0gaXMgc2VyaWFsICgxKSBbMSB0aHJlYWRdIG9yIHBhcmFsbGVsCisgIC8vICgwKSBbPj0gMiB0aHJlYWRzXQorICAvKiBJZiBlaXRoZXIgdGVhbV9zZXJpYWwgb3IgdGFza2luZ19zZXIgaXMgc2V0LCB0YXNrIHRlYW0gbWF5IGJlIE5VTEwgKi8KKyAgLyogVGFzayBTdGF0ZSBGbGFnczogKi8KKyAgdW5zaWduZWQgc3RhcnRlZCA6IDE7IC8qIDE9PXN0YXJ0ZWQsIDA9PW5vdCBzdGFydGVkICAgICAqLworICB1bnNpZ25lZCBleGVjdXRpbmcgOiAxOyAvKiAxPT1leGVjdXRpbmcsIDA9PW5vdCBleGVjdXRpbmcgKi8KKyAgdW5zaWduZWQgY29tcGxldGUgOiAxOyAvKiAxPT1jb21wbGV0ZSwgMD09bm90IGNvbXBsZXRlICAgKi8KKyAgdW5zaWduZWQgZnJlZWQgOiAxOyAvKiAxPT1mcmVlZCwgMD09YWxsb2NhdGVlZCAgICAgICAgKi8KKyAgdW5zaWduZWQgbmF0aXZlIDogMTsgLyogMT09Z2NjLWNvbXBpbGVkIHRhc2ssIDA9PWludGVsICovCisgIHVuc2lnbmVkIHJlc2VydmVkMzEgOiA3OyAvKiByZXNlcnZlZCBmb3IgbGlicmFyeSB1c2UgKi8KKworfSBrbXBfdGFza2luZ19mbGFnc190OworCitzdHJ1Y3Qga21wX3Rhc2tkYXRhIHsgLyogYWxpZ25lZCBkdXJpbmcgZHluYW1pYyBhbGxvY2F0aW9uICAgICAgICovCisgIGttcF9pbnQzMiB0ZF90YXNrX2lkOyAvKiBpZCwgYXNzaWduZWQgYnkgZGVidWdnZXIgICAgICAgICAgICAgICAgKi8KKyAga21wX3Rhc2tpbmdfZmxhZ3NfdCB0ZF9mbGFnczsgLyogdGFzayBmbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIGttcF90ZWFtX3QgKnRkX3RlYW07IC8qIHRlYW0gZm9yIHRoaXMgdGFzayAgICAgICAgICAgICAgICAgICAgICAqLworICBrbXBfaW5mb19wICp0ZF9hbGxvY190aHJlYWQ7IC8qIHRocmVhZCB0aGF0IGFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZXMgICAqLworICAvKiBDdXJyZW50bHkgbm90IHVzZWQgZXhjZXB0IGZvciBwZXJoYXBzIElEQiAqLworICBrbXBfdGFza2RhdGFfdCAqdGRfcGFyZW50OyAvKiBwYXJlbnQgdGFzayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAga21wX2ludDMyIHRkX2xldmVsOyAvKiB0YXNrIG5lc3RpbmcgbGV2ZWwgICAgICAgICAgICAgICAgICAgICAgKi8KKyAga21wX2ludDMyIHRkX3VudGllZF9jb3VudDsgLyogdW50aWVkIHRhc2sgYWN0aXZlIHBhcnRzIGNvdW50ZXIgICAgICAgICovCisgIGlkZW50X3QgKnRkX2lkZW50OyAvKiB0YXNrIGlkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLy8gVGFza3dhaXQgZGF0YS4KKyAgaWRlbnRfdCAqdGRfdGFza3dhaXRfaWRlbnQ7CisgIGttcF91aW50MzIgdGRfdGFza3dhaXRfY291bnRlcjsKKyAga21wX2ludDMyIHRkX3Rhc2t3YWl0X3RocmVhZDsgLyogZ3RpZCArIDEgb2YgdGhyZWFkIGVuY291bnRlcmVkIHRhc2t3YWl0ICovCisgIEtNUF9BTElHTl9DQUNIRSBrbXBfaW50ZXJuYWxfY29udHJvbF90CisgICAgICB0ZF9pY3ZzOyAvKiBJbnRlcm5hbCBjb250cm9sIHZhcmlhYmxlcyBmb3IgdGhlIHRhc2sgKi8KKyAgS01QX0FMSUdOX0NBQ0hFIHZvbGF0aWxlIGttcF9pbnQzMgorICAgICAgdGRfYWxsb2NhdGVkX2NoaWxkX3Rhc2tzOyAvKiBDaGlsZCB0YXNrcyAoKyBjdXJyZW50IHRhc2spIG5vdCB5ZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVhbGxvY2F0ZWQgKi8KKyAgdm9sYXRpbGUga21wX2ludDMyCisgICAgICB0ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzOyAvKiBDaGlsZCB0YXNrcyBub3QgeWV0IGNvbXBsZXRlICovCisjaWYgT01QXzQwX0VOQUJMRUQKKyAga21wX3Rhc2tncm91cF90CisgICAgICAqdGRfdGFza2dyb3VwOyAvLyBFYWNoIHRhc2sga2VlcHMgcG9pbnRlciB0byBpdHMgY3VycmVudCB0YXNrZ3JvdXAKKyAga21wX2RlcGhhc2hfdAorICAgICAgKnRkX2RlcGhhc2g7IC8vIERlcGVuZGVuY2llcyBmb3IgY2hpbGRyZW4gdGFza3MgYXJlIHRyYWNrZWQgZnJvbSBoZXJlCisgIGttcF9kZXBub2RlX3QKKyAgICAgICp0ZF9kZXBub2RlOyAvLyBQb2ludGVyIHRvIGdyYXBoIG5vZGUgaWYgdGhpcyB0YXNrIGhhcyBkZXBlbmRlbmNpZXMKKyNlbmRpZgorI2lmIE9NUFRfU1VQUE9SVAorICBvbXB0X3Rhc2tfaW5mb190IG9tcHRfdGFza19pbmZvOworI2VuZGlmCisjaWYgT01QXzQ1X0VOQUJMRUQKKyAga21wX3Rhc2tfdGVhbV90ICp0ZF90YXNrX3RlYW07CisgIGttcF9pbnQzMiB0ZF9zaXplX2FsbG9jOyAvLyBUaGUgc2l6ZSBvZiB0YXNrIHN0cnVjdHVyZSwgaW5jbHVkaW5nIHNoYXJlZHMgZXRjLgorI2VuZGlmCit9OyAvLyBzdHJ1Y3Qga21wX3Rhc2tkYXRhCisKKy8vIE1ha2Ugc3VyZSBwYWRkaW5nIGFib3ZlIHdvcmtlZAorS01QX0JVSUxEX0FTU0VSVChzaXplb2Yoa21wX3Rhc2tkYXRhX3QpICUgc2l6ZW9mKHZvaWQgKikgPT0gMCk7CisKKy8vIERhdGEgZm9yIHRhc2sgdGVhbSBidXQgcGVyIHRocmVhZAordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfdGhyZWFkX2RhdGEgeworICBrbXBfaW5mb19wICp0ZF90aHI7IC8vIFBvaW50ZXIgYmFjayB0byB0aHJlYWQgaW5mbworICAvLyBVc2VkIG9ubHkgaW4gX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZSwgbWF5YmUgbm90IGF2YWlsIHVudGlsIHRhc2sgaXMKKyAgLy8gcXVldWVkPworICBrbXBfYm9vdHN0cmFwX2xvY2tfdCB0ZF9kZXF1ZV9sb2NrOyAvLyBMb2NrIGZvciBhY2Nlc3NpbmcgZGVxdWUKKyAga21wX3Rhc2tkYXRhX3QgKgorICAgICAgKnRkX2RlcXVlOyAvLyBEZXF1ZSBvZiB0YXNrcyBlbmNvdW50ZXJlZCBieSB0ZF90aHIsIGR5bmFtaWNhbGx5IGFsbG9jYXRlZAorICBrbXBfaW50MzIgdGRfZGVxdWVfc2l6ZTsgLy8gU2l6ZSBvZiBkZWNrCisgIGttcF91aW50MzIgdGRfZGVxdWVfaGVhZDsgLy8gSGVhZCBvZiBkZXF1ZSAod2lsbCB3cmFwKQorICBrbXBfdWludDMyIHRkX2RlcXVlX3RhaWw7IC8vIFRhaWwgb2YgZGVxdWUgKHdpbGwgd3JhcCkKKyAga21wX2ludDMyIHRkX2RlcXVlX250YXNrczsgLy8gTnVtYmVyIG9mIHRhc2tzIGluIGRlcXVlCisgIC8vIEdFSDogc2hvdWxkbid0IHRoaXMgYmUgdm9sYXRpbGUgc2luY2UgdXNlZCBpbiB3aGlsZS1zcGluPworICBrbXBfaW50MzIgdGRfZGVxdWVfbGFzdF9zdG9sZW47IC8vIFRocmVhZCBudW1iZXIgb2YgbGFzdCBzdWNjZXNzZnVsIHN0ZWFsCisjaWZkZWYgQlVJTERfVElFRF9UQVNLX1NUQUNLCisgIGttcF90YXNrX3N0YWNrX3QgdGRfc3VzcF90aWVkX3Rhc2tzOyAvLyBTdGFjayBvZiBzdXNwZW5kZWQgdGllZCB0YXNrcyBmb3IgdGFzaworLy8gc2NoZWR1bGluZyBjb25zdHJhaW50CisjZW5kaWYgLy8gQlVJTERfVElFRF9UQVNLX1NUQUNLCit9IGttcF9iYXNlX3RocmVhZF9kYXRhX3Q7CisKKyNkZWZpbmUgVEFTS19ERVFVRV9CSVRTIDggLy8gVXNlZCBzb2xlbHkgdG8gZGVmaW5lIElOSVRJQUxfVEFTS19ERVFVRV9TSVpFCisjZGVmaW5lIElOSVRJQUxfVEFTS19ERVFVRV9TSVpFICgxIDw8IFRBU0tfREVRVUVfQklUUykKKworI2RlZmluZSBUQVNLX0RFUVVFX1NJWkUodGQpICgodGQpLnRkX2RlcXVlX3NpemUpCisjZGVmaW5lIFRBU0tfREVRVUVfTUFTSyh0ZCkgKCh0ZCkudGRfZGVxdWVfc2l6ZSAtIDEpCisKK3R5cGVkZWYgdW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF90aHJlYWRfZGF0YSB7CisgIGttcF9iYXNlX3RocmVhZF9kYXRhX3QgdGQ7CisgIGRvdWJsZSB0ZF9hbGlnbjsgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgIGNoYXIgdGRfcGFkW0tNUF9QQUQoa21wX2Jhc2VfdGhyZWFkX2RhdGFfdCwgQ0FDSEVfTElORSldOworfSBrbXBfdGhyZWFkX2RhdGFfdDsKKworLy8gRGF0YSBmb3IgdGFzayB0ZWFtcyB3aGljaCBhcmUgdXNlZCB3aGVuIHRhc2tpbmcgaXMgZW5hYmxlZCBmb3IgdGhlIHRlYW0KK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX3Rhc2tfdGVhbSB7CisgIGttcF9ib290c3RyYXBfbG9ja190CisgICAgICB0dF90aHJlYWRzX2xvY2s7IC8qIExvY2sgdXNlZCB0byBhbGxvY2F0ZSBwZXItdGhyZWFkIHBhcnQgb2YgdGFzayB0ZWFtICovCisgIC8qIG11c3QgYmUgYm9vdHN0cmFwIGxvY2sgc2luY2UgdXNlZCBhdCBsaWJyYXJ5IHNodXRkb3duKi8KKyAga21wX3Rhc2tfdGVhbV90ICp0dF9uZXh0OyAvKiBGb3IgbGlua2luZyB0aGUgdGFzayB0ZWFtIGZyZWUgbGlzdCAqLworICBrbXBfdGhyZWFkX2RhdGFfdAorICAgICAgKnR0X3RocmVhZHNfZGF0YTsgLyogQXJyYXkgb2YgcGVyLXRocmVhZCBzdHJ1Y3R1cmVzIGZvciB0YXNrIHRlYW0gKi8KKyAgLyogRGF0YSBzdXJ2aXZlcyB0YXNrIHRlYW0gZGVhbGxvY2F0aW9uICovCisgIGttcF9pbnQzMiB0dF9mb3VuZF90YXNrczsgLyogSGF2ZSB3ZSBmb3VuZCB0YXNrcyBhbmQgcXVldWVkIHRoZW0gd2hpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpbmcgdGhpcyB0ZWFtPyAqLworICAvKiBUUlVFIG1lYW5zIHR0X3RocmVhZHNfZGF0YSBpcyBzZXQgdXAgYW5kIGluaXRpYWxpemVkICovCisgIGttcF9pbnQzMiB0dF9ucHJvYzsgLyogI3RocmVhZHMgaW4gdGVhbSAgICAgICAgICAgKi8KKyAga21wX2ludDMyCisgICAgICB0dF9tYXhfdGhyZWFkczsgLyogbnVtYmVyIG9mIGVudHJpZXMgYWxsb2NhdGVkIGZvciB0aHJlYWRzX2RhdGEgYXJyYXkgKi8KKyNpZiBPTVBfNDVfRU5BQkxFRAorICBrbXBfaW50MzIKKyAgICAgIHR0X2ZvdW5kX3Byb3h5X3Rhc2tzOyAvKiBIYXZlIHdlIGZvdW5kIHByb3h5IHRhc2tzIHNpbmNlIGxhc3QgYmFycmllciAqLworI2VuZGlmCisKKyAgS01QX0FMSUdOX0NBQ0hFCisgIHZvbGF0aWxlIGttcF9pbnQzMiB0dF91bmZpbmlzaGVkX3RocmVhZHM7IC8qICN0aHJlYWRzIHN0aWxsIGFjdGl2ZSAgICAgICovCisKKyAgS01QX0FMSUdOX0NBQ0hFCisgIHZvbGF0aWxlIGttcF91aW50MzIKKyAgICAgIHR0X2FjdGl2ZTsgLyogaXMgdGhlIHRlYW0gc3RpbGwgYWN0aXZlbHkgZXhlY3V0aW5nIHRhc2tzICovCit9IGttcF9iYXNlX3Rhc2tfdGVhbV90OworCit1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX3Rhc2tfdGVhbSB7CisgIGttcF9iYXNlX3Rhc2tfdGVhbV90IHR0OworICBkb3VibGUgdHRfYWxpZ247IC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICBjaGFyIHR0X3BhZFtLTVBfUEFEKGttcF9iYXNlX3Rhc2tfdGVhbV90LCBDQUNIRV9MSU5FKV07Cit9OworCisjaWYgKFVTRV9GQVNUX01FTU9SWSA9PSAzKSB8fCAoVVNFX0ZBU1RfTUVNT1JZID09IDUpCisvLyBGcmVlIGxpc3RzIGtlZXAgc2FtZS1zaXplIGZyZWUgbWVtb3J5IHNsb3RzIGZvciBmYXN0IG1lbW9yeSBhbGxvY2F0aW9uCisvLyByb3V0aW5lcwordHlwZWRlZiBzdHJ1Y3Qga21wX2ZyZWVfbGlzdCB7CisgIHZvaWQgKnRoX2ZyZWVfbGlzdF9zZWxmOyAvLyBTZWxmLWFsbG9jYXRlZCB0YXNrcyBmcmVlIGxpc3QKKyAgdm9pZCAqdGhfZnJlZV9saXN0X3N5bmM7IC8vIFNlbGYtYWxsb2NhdGVkIHRhc2tzIHN0b2xlbi9yZXR1cm5lZCBieSBvdGhlcgorICAvLyB0aHJlYWRzCisgIHZvaWQgKnRoX2ZyZWVfbGlzdF9vdGhlcjsgLy8gTm9uLXNlbGYgZnJlZSBsaXN0ICh0byBiZSByZXR1cm5lZCB0byBvd25lcidzCisgIC8vIHN5bmMgbGlzdCkKK30ga21wX2ZyZWVfbGlzdF90OworI2VuZGlmCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKy8vIEhvdCB0ZWFtcyBhcnJheSBrZWVwcyBob3QgdGVhbXMgYW5kIHRoZWlyIHNpemVzIGZvciBnaXZlbiB0aHJlYWQuIEhvdCB0ZWFtcworLy8gYXJlIG5vdCBwdXQgaW4gdGVhbXMgcG9vbCwgYW5kIHRoZXkgZG9uJ3QgcHV0IHRocmVhZHMgaW4gdGhyZWFkcyBwb29sLgordHlwZWRlZiBzdHJ1Y3Qga21wX2hvdF90ZWFtX3B0ciB7CisgIGttcF90ZWFtX3AgKmhvdF90ZWFtOyAvLyBwb2ludGVyIHRvIGhvdF90ZWFtIG9mIGdpdmVuIG5lc3RpbmcgbGV2ZWwKKyAga21wX2ludDMyIGhvdF90ZWFtX250aDsgLy8gbnVtYmVyIG9mIHRocmVhZHMgYWxsb2NhdGVkIGZvciB0aGUgaG90X3RlYW0KK30ga21wX2hvdF90ZWFtX3B0cl90OworI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQKK3R5cGVkZWYgc3RydWN0IGttcF90ZWFtc19zaXplIHsKKyAga21wX2ludDMyIG50ZWFtczsgLy8gbnVtYmVyIG9mIHRlYW1zIGluIGEgbGVhZ3VlCisgIGttcF9pbnQzMiBudGg7IC8vIG51bWJlciBvZiB0aHJlYWRzIGluIGVhY2ggdGVhbSBvZiB0aGUgbGVhZ3VlCit9IGttcF90ZWFtc19zaXplX3Q7CisjZW5kaWYKKworLy8gT3Blbk1QIHRocmVhZCBkYXRhIHN0cnVjdHVyZXMKKwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGttcF9iYXNlX2luZm8geworICAvKiBTdGFydCB3aXRoIHRoZSByZWFkb25seSBkYXRhIHdoaWNoIGlzIGNhY2hlIGFsaWduZWQgYW5kIHBhZGRlZC4gVGhpcyBpcworICAgICB3cml0dGVuIGJlZm9yZSB0aGUgdGhyZWFkIHN0YXJ0cyB3b3JraW5nIGJ5IHRoZSBtYXN0ZXIuIFViZXIgbWFzdGVycyBtYXkKKyAgICAgdXBkYXRlIHRoZW1zZWx2ZXMgbGF0ZXIuIFVzYWdlIGRvZXMgbm90IGNvbnNpZGVyIHNlcmlhbGl6ZWQgcmVnaW9ucy4gICovCisgIGttcF9kZXNjX3QgdGhfaW5mbzsKKyAga21wX3RlYW1fcCAqdGhfdGVhbTsgLyogdGVhbSB3ZSBiZWxvbmcgdG8gKi8KKyAga21wX3Jvb3RfcCAqdGhfcm9vdDsgLyogcG9pbnRlciB0byByb290IG9mIHRhc2sgaGllcmFyY2h5ICovCisgIGttcF9pbmZvX3AgKnRoX25leHRfcG9vbDsgLyogbmV4dCBhdmFpbGFibGUgdGhyZWFkIGluIHRoZSBwb29sICovCisgIGttcF9kaXNwX3QgKnRoX2Rpc3BhdGNoOyAvKiB0aHJlYWQncyBkaXNwYXRjaCBkYXRhICovCisgIGludCB0aF9pbl9wb29sOyAvKiBpbiB0aHJlYWQgcG9vbCAoMzIgYml0cyBmb3IgVENSL1RDVykgKi8KKworICAvKiBUaGUgZm9sbG93aW5nIGFyZSBjYWNoZWQgZnJvbSB0aGUgdGVhbSBpbmZvIHN0cnVjdHVyZSAqLworICAvKiBUT0RPIHVzZSB0aGVzZSBpbiBtb3JlIHBsYWNlcyBhcyBkZXRlcm1pbmVkIHRvIGJlIG5lZWRlZCB2aWEgcHJvZmlsaW5nICovCisgIGludCB0aF90ZWFtX25wcm9jOyAvKiBudW1iZXIgb2YgdGhyZWFkcyBpbiBhIHRlYW0gKi8KKyAga21wX2luZm9fcCAqdGhfdGVhbV9tYXN0ZXI7IC8qIHRoZSB0ZWFtJ3MgbWFzdGVyIHRocmVhZCAqLworICBpbnQgdGhfdGVhbV9zZXJpYWxpemVkOyAvKiB0ZWFtIGlzIHNlcmlhbGl6ZWQgKi8KKyNpZiBPTVBfNDBfRU5BQkxFRAorICBtaWNyb3Rhc2tfdCB0aF90ZWFtc19taWNyb3Rhc2s7IC8qIHNhdmUgZW50cnkgYWRkcmVzcyBmb3IgdGVhbXMgY29uc3RydWN0ICovCisgIGludCB0aF90ZWFtc19sZXZlbDsgLyogc2F2ZSBpbml0aWFsIGxldmVsIG9mIHRlYW1zIGNvbnN0cnVjdCAqLworLyogaXQgaXMgMCBvbiBkZXZpY2UgYnV0IG1heSBiZSBhbnkgb24gaG9zdCAqLworI2VuZGlmCisKKy8qIFRoZSBibG9ja3RpbWUgaW5mbyBpcyBjb3BpZWQgZnJvbSB0aGUgdGVhbSBzdHJ1Y3QgdG8gdGhlIHRocmVhZCBzcnVjdCAqLworLyogYXQgdGhlIHN0YXJ0IG9mIGEgYmFycmllciwgYW5kIHRoZSB2YWx1ZXMgc3RvcmVkIGluIHRoZSB0ZWFtIGFyZSB1c2VkICovCisvKiBhdCBwb2ludHMgaW4gdGhlIGNvZGUgd2hlcmUgdGhlIHRlYW0gc3RydWN0IGlzIG5vIGxvbmdlciBndWFyYW50ZWVkICAgKi8KKy8qIHRvIGV4aXN0IChmcm9tIHRoZSBQT1Ygb2Ygd29ya2VyIHRocmVhZHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmIEtNUF9VU0VfTU9OSVRPUgorICBpbnQgdGhfdGVhbV9idF9pbnRlcnZhbHM7CisgIGludCB0aF90ZWFtX2J0X3NldDsKKyNlbHNlCisgIGttcF91aW50NjQgdGhfdGVhbV9idF9pbnRlcnZhbHM7CisjZW5kaWYKKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAga21wX2FmZmluX21hc2tfdCAqdGhfYWZmaW5fbWFzazsgLyogdGhyZWFkJ3MgY3VycmVudCBhZmZpbml0eSBtYXNrICovCisjZW5kaWYKKworICAvKiBUaGUgZGF0YSBzZXQgYnkgdGhlIG1hc3RlciBhdCByZWluaXQsIHRoZW4gUi9XIGJ5IHRoZSB3b3JrZXIgKi8KKyAgS01QX0FMSUdOX0NBQ0hFIGludAorICAgICAgdGhfc2V0X25wcm9jOyAvKiBpZiA+IDAsIHRoZW4gb25seSB1c2UgdGhpcyByZXF1ZXN0IGZvciB0aGUgbmV4dCBmb3JrICovCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAga21wX2hvdF90ZWFtX3B0cl90ICp0aF9ob3RfdGVhbXM7IC8qIGFycmF5IG9mIGhvdCB0ZWFtcyAqLworI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAga21wX3Byb2NfYmluZF90CisgICAgICB0aF9zZXRfcHJvY19iaW5kOyAvKiBpZiAhPSBwcm9jX2JpbmRfZGVmYXVsdCwgdXNlIHJlcXVlc3QgZm9yIG5leHQgZm9yayAqLworICBrbXBfdGVhbXNfc2l6ZV90CisgICAgICB0aF90ZWFtc19zaXplOyAvKiBudW1iZXIgb2YgdGVhbXMvdGhyZWFkcyBpbiB0ZWFtcyBjb25zdHJ1Y3QgKi8KKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgIGludCB0aF9jdXJyZW50X3BsYWNlOyAvKiBwbGFjZSBjdXJyZW50bHkgYm91bmQgdG8gKi8KKyAgaW50IHRoX25ld19wbGFjZTsgLyogcGxhY2UgdG8gYmluZCB0byBpbiBwYXIgcmVnICovCisgIGludCB0aF9maXJzdF9wbGFjZTsgLyogZmlyc3QgcGxhY2UgaW4gcGFydGl0aW9uICovCisgIGludCB0aF9sYXN0X3BsYWNlOyAvKiBsYXN0IHBsYWNlIGluIHBhcnRpdGlvbiAqLworI2VuZGlmCisjZW5kaWYKKyNpZiBVU0VfSVRUX0JVSUxECisgIGttcF91aW50NjQgdGhfYmFyX2Fycml2ZV90aW1lOyAvKiBhcnJpdmFsIHRvIGJhcnJpZXIgdGltZXN0YW1wICovCisgIGttcF91aW50NjQgdGhfYmFyX21pbl90aW1lOyAvKiBtaW5pbXVtIGFycml2YWwgdGltZSBhdCB0aGUgYmFycmllciAqLworICBrbXBfdWludDY0IHRoX2ZyYW1lX3RpbWU7IC8qIGZyYW1lIHRpbWVzdGFtcCAqLworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAga21wX2xvY2FsX3QgdGhfbG9jYWw7CisgIHN0cnVjdCBwcml2YXRlX2NvbW1vbiAqdGhfcHJpX2hlYWQ7CisKKyAgLyogTm93IHRoZSBkYXRhIG9ubHkgdXNlZCBieSB0aGUgd29ya2VyIChhZnRlciBpbml0aWFsIGFsbG9jYXRpb24pICovCisgIC8qIFRPRE8gdGhlIGZpcnN0IHNlcmlhbCB0ZWFtIHNob3VsZCBhY3R1YWxseSBiZSBzdG9yZWQgaW4gdGhlIGluZm9fdAorICAgICBzdHJ1Y3R1cmUuICB0aGlzIHdpbGwgaGVscCByZWR1Y2UgaW5pdGlhbCBhbGxvY2F0aW9uIG92ZXJoZWFkICovCisgIEtNUF9BTElHTl9DQUNIRSBrbXBfdGVhbV9wCisgICAgICAqdGhfc2VyaWFsX3RlYW07IC8qc2VyaWFsaXplZCB0ZWFtIGhlbGQgaW4gcmVzZXJ2ZSovCisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgb21wdF90aHJlYWRfaW5mb190IG9tcHRfdGhyZWFkX2luZm87CisjZW5kaWYKKworICAvKiBUaGUgZm9sbG93aW5nIGFyZSBhbHNvIHJlYWQgYnkgdGhlIG1hc3RlciBkdXJpbmcgcmVpbml0ICovCisgIHN0cnVjdCBjb21tb25fdGFibGUgKnRoX3ByaV9jb21tb247CisKKyAgdm9sYXRpbGUga21wX3VpbnQzMiB0aF9zcGluX2hlcmU7IC8qIHRocmVhZC1sb2NhbCBsb2NhdGlvbiBmb3Igc3Bpbm5pbmcgKi8KKyAgLyogd2hpbGUgYXdhaXRpbmcgcXVldWluZyBsb2NrIGFjcXVpcmUgKi8KKworICB2b2xhdGlsZSB2b2lkICp0aF9zbGVlcF9sb2M7IC8vIHRoaXMgcG9pbnRzIGF0IGEga21wX2ZsYWc8VD4KKworICBpZGVudF90ICp0aF9pZGVudDsKKyAgdW5zaWduZWQgdGhfeDsgLy8gUmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZGF0YQorICB1bnNpZ25lZCB0aF9hOyAvLyBSYW5kb20gbnVtYmVyIGdlbmVyYXRvciBkYXRhCisKKyAgLyogVGFza2luZy1yZWxhdGVkIGRhdGEgZm9yIHRoZSB0aHJlYWQgKi8KKyAga21wX3Rhc2tfdGVhbV90ICp0aF90YXNrX3RlYW07IC8vIFRhc2sgdGVhbSBzdHJ1Y3QKKyAga21wX3Rhc2tkYXRhX3QgKnRoX2N1cnJlbnRfdGFzazsgLy8gSW5uZXJtb3N0IFRhc2sgYmVpbmcgZXhlY3V0ZWQKKyAga21wX3VpbnQ4IHRoX3Rhc2tfc3RhdGU7IC8vIGFsdGVybmF0aW5nIDAvMSBmb3IgdGFzayB0ZWFtIGlkZW50aWZpY2F0aW9uCisgIGttcF91aW50OCAqdGhfdGFza19zdGF0ZV9tZW1vX3N0YWNrOyAvLyBTdGFjayBob2xkaW5nIG1lbW9zIG9mIHRoX3Rhc2tfc3RhdGUKKyAgLy8gYXQgbmVzdGVkIGxldmVscworICBrbXBfdWludDMyIHRoX3Rhc2tfc3RhdGVfdG9wOyAvLyBUb3AgZWxlbWVudCBvZiB0aF90YXNrX3N0YXRlX21lbW9fc3RhY2sKKyAga21wX3VpbnQzMiB0aF90YXNrX3N0YXRlX3N0YWNrX3N6OyAvLyBTaXplIG9mIHRoX3Rhc2tfc3RhdGVfbWVtb19zdGFjaworICBrbXBfdWludDMyIHRoX3JlYXBfc3RhdGU7IC8vIE5vbi16ZXJvIGluZGljYXRlcyB0aHJlYWQgaXMgbm90CisgIC8vIHRhc2tpbmcsIHRodXMgc2FmZSB0byByZWFwCisKKyAgLyogTW9yZSBzdHVmZiBmb3Iga2VlcGluZyB0cmFjayBvZiBhY3RpdmUvc2xlZXBpbmcgdGhyZWFkcyAodGhpcyBwYXJ0IGlzCisgICAgIHdyaXR0ZW4gYnkgdGhlIHdvcmtlciB0aHJlYWQpICovCisgIGttcF91aW50OCB0aF9hY3RpdmVfaW5fcG9vbDsgLy8gaW5jbHVkZWQgaW4gY291bnQgb2YgI2FjdGl2ZSB0aHJlYWRzIGluIHBvb2wKKyAgaW50IHRoX2FjdGl2ZTsgLy8gISBzbGVlcGluZzsgMzIgYml0cyBmb3IgVENSL1RDVworICBzdHJ1Y3QgY29uc19oZWFkZXIgKnRoX2NvbnM7IC8vIHVzZWQgZm9yIGNvbnNpc3RlbmN5IGNoZWNrCisKKyAgLyogQWRkIHRoZSBzeW5jcm9uaXppbmcgZGF0YSB3aGljaCBpcyBjYWNoZSBhbGlnbmVkIGFuZCBwYWRkZWQuICovCisgIEtNUF9BTElHTl9DQUNIRSBrbXBfYmFsaWduX3QgdGhfYmFyW2JzX2xhc3RfYmFycmllcl07CisKKyAgS01QX0FMSUdOX0NBQ0hFIHZvbGF0aWxlIGttcF9pbnQzMgorICAgICAgdGhfbmV4dF93YWl0aW5nOyAvKiBndGlkKzEgb2YgbmV4dCB0aHJlYWQgb24gbG9jayB3YWl0IHF1ZXVlLCAwIGlmIG5vbmUgKi8KKworI2lmIChVU0VfRkFTVF9NRU1PUlkgPT0gMykgfHwgKFVTRV9GQVNUX01FTU9SWSA9PSA1KQorI2RlZmluZSBOVU1fTElTVFMgNAorICBrbXBfZnJlZV9saXN0X3QgdGhfZnJlZV9saXN0c1tOVU1fTElTVFNdOyAvLyBGcmVlIGxpc3RzIGZvciBmYXN0IG1lbW9yeQorLy8gYWxsb2NhdGlvbiByb3V0aW5lcworI2VuZGlmCisKKyNpZiBLTVBfT1NfV0lORE9XUworICBrbXBfd2luMzJfY29uZF90IHRoX3N1c3BlbmRfY3Y7CisgIGttcF93aW4zMl9tdXRleF90IHRoX3N1c3BlbmRfbXg7CisgIGludCB0aF9zdXNwZW5kX2luaXQ7CisjZW5kaWYKKyNpZiBLTVBfT1NfVU5JWAorICBrbXBfY29uZF9hbGlnbl90IHRoX3N1c3BlbmRfY3Y7CisgIGttcF9tdXRleF9hbGlnbl90IHRoX3N1c3BlbmRfbXg7CisgIGludCB0aF9zdXNwZW5kX2luaXRfY291bnQ7CisjZW5kaWYKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAga21wX2l0dF9tYXJrX3QgdGhfaXR0X21hcmtfc2luZ2xlOworLy8gYWxpZ25tZW50ID8/PworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyNpZiBLTVBfU1RBVFNfRU5BQkxFRAorICBrbXBfc3RhdHNfbGlzdCAqdGhfc3RhdHM7CisjZW5kaWYKK30ga21wX2Jhc2VfaW5mb190OworCit0eXBlZGVmIHVuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfaW5mbyB7CisgIGRvdWJsZSB0aF9hbGlnbjsgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgIGNoYXIgdGhfcGFkW0tNUF9QQUQoa21wX2Jhc2VfaW5mb190LCBDQUNIRV9MSU5FKV07CisgIGttcF9iYXNlX2luZm9fdCB0aDsKK30ga21wX2luZm9fdDsKKworLy8gT3Blbk1QIHRocmVhZCB0ZWFtIGRhdGEgc3RydWN0dXJlcworCit0eXBlZGVmIHN0cnVjdCBrbXBfYmFzZV9kYXRhIHsgdm9sYXRpbGUga21wX3VpbnQzMiB0X3ZhbHVlOyB9IGttcF9iYXNlX2RhdGFfdDsKKwordHlwZWRlZiB1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX3NsZWVwX3RlYW0geworICBkb3VibGUgZHRfYWxpZ247IC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICBjaGFyIGR0X3BhZFtLTVBfUEFEKGttcF9iYXNlX2RhdGFfdCwgQ0FDSEVfTElORSldOworICBrbXBfYmFzZV9kYXRhX3QgZHQ7Cit9IGttcF9zbGVlcF90ZWFtX3Q7CisKK3R5cGVkZWYgdW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9vcmRlcmVkX3RlYW0geworICBkb3VibGUgZHRfYWxpZ247IC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICBjaGFyIGR0X3BhZFtLTVBfUEFEKGttcF9iYXNlX2RhdGFfdCwgQ0FDSEVfTElORSldOworICBrbXBfYmFzZV9kYXRhX3QgZHQ7Cit9IGttcF9vcmRlcmVkX3RlYW1fdDsKKwordHlwZWRlZiBpbnQgKCpsYXVuY2hfdCkoaW50IGd0aWQpOworCisvKiBNaW5pbXVtIG51bWJlciBvZiBBUkdWIGVudHJpZXMgdG8gbWFsbG9jIGlmIG5lY2Vzc2FyeSAqLworI2RlZmluZSBLTVBfTUlOX01BTExPQ19BUkdWX0VOVFJJRVMgMTAwCisKKy8vIFNldCB1cCBob3cgbWFueSBhcmd2IHBvaW50ZXJzIHdpbGwgZml0IGluIGNhY2hlIGxpbmVzIGNvbnRhaW5pbmcKKy8vIHRfaW5saW5lX2FyZ3YuIEhpc3RvcmljYWxseSwgd2UgaGF2ZSBzdXBwb3J0ZWQgYXQgbGVhc3QgOTYgYnl0ZXMuIFVzaW5nIGEKKy8vIGxhcmdlciB2YWx1ZSBmb3IgbW9yZSBzcGFjZSBiZXR3ZWVuIHRoZSBtYXN0ZXIgd3JpdGUvd29ya2VyIHJlYWQgc2VjdGlvbiBhbmQKKy8vIHJlYWQvd3JpdGUgYnkgYWxsIHNlY3Rpb24gc2VlbXMgdG8gYnV5IG1vcmUgcGVyZm9ybWFuY2Ugb24gRVBDQyBQQVJBTExFTC4KKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisjZGVmaW5lIEtNUF9JTkxJTkVfQVJHVl9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoNCAqIENBQ0hFX0xJTkUgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICgoMyAqIEtNUF9QVFJfU0tJUCArIDIgKiBzaXplb2YoaW50KSArIDIgKiBzaXplb2Yoa21wX2ludDgpICsgICAgICAgICAgICAgICBcCisgICAgIHNpemVvZihrbXBfaW50MTYpICsgc2l6ZW9mKGttcF91aW50MzIpKSAlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENBQ0hFX0xJTkUpKQorI2Vsc2UKKyNkZWZpbmUgS01QX0lOTElORV9BUkdWX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgyICogQ0FDSEVfTElORSAtICgoMyAqIEtNUF9QVFJfU0tJUCArIDIgKiBzaXplb2YoaW50KSkgJSBDQUNIRV9MSU5FKSkKKyNlbmRpZgorI2RlZmluZSBLTVBfSU5MSU5FX0FSR1ZfRU5UUklFUyAoaW50KShLTVBfSU5MSU5FX0FSR1ZfQllURVMgLyBLTVBfUFRSX1NLSVApCisKK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBrbXBfYmFzZV90ZWFtIHsKKyAgLy8gU3luY2hyb25pemF0aW9uIERhdGEKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEtNUF9BTElHTl9DQUNIRSBrbXBfb3JkZXJlZF90ZWFtX3QgdF9vcmRlcmVkOworICBrbXBfYmFsaWduX3RlYW1fdCB0X2Jhcltic19sYXN0X2JhcnJpZXJdOworICB2b2xhdGlsZSBpbnQgdF9jb25zdHJ1Y3Q7IC8vIGNvdW50IG9mIHNpbmdsZSBkaXJlY3RpdmUgZW5jb3VudGVyZWQgYnkgdGVhbQorICBrbXBfbG9ja190IHRfc2luZ2xlX2xvY2s7IC8vIHRlYW0gc3BlY2lmaWMgbG9jaworCisgIC8vIE1hc3RlciBvbmx5CisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBLTVBfQUxJR05fQ0FDSEUgaW50IHRfbWFzdGVyX3RpZDsgLy8gdGlkIG9mIG1hc3RlciBpbiBwYXJlbnQgdGVhbQorICBpbnQgdF9tYXN0ZXJfdGhpc19jb25zOyAvLyAidGhpc19jb25zdHJ1Y3QiIHNpbmdsZSBjb3VudGVyIG9mIG1hc3RlciBpbiBwYXJlbnQKKyAgLy8gdGVhbQorICBpZGVudF90ICp0X2lkZW50OyAvLyBpZiB2b2xhdGlsZSwgaGF2ZSB0byBjaGFuZ2UgdG9vIG11Y2ggb3RoZXIgY3J1ZCB0bworICAvLyB2b2xhdGlsZSB0b28KKyAga21wX3RlYW1fcCAqdF9wYXJlbnQ7IC8vIHBhcmVudCB0ZWFtCisgIGttcF90ZWFtX3AgKnRfbmV4dF9wb29sOyAvLyBuZXh0IGZyZWUgdGVhbSBpbiB0aGUgdGVhbSBwb29sCisgIGttcF9kaXNwX3QgKnRfZGlzcGF0Y2g7IC8vIHRocmVhZCdzIGRpc3BhdGNoIGRhdGEKKyAga21wX3Rhc2tfdGVhbV90ICp0X3Rhc2tfdGVhbVsyXTsgLy8gVGFzayB0ZWFtIHN0cnVjdDsgc3dpdGNoIGJldHdlZW4gMgorI2lmIE9NUF80MF9FTkFCTEVECisgIGttcF9wcm9jX2JpbmRfdCB0X3Byb2NfYmluZDsgLy8gYmluZCB0eXBlIGZvciBwYXIgcmVnaW9uCisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKyNpZiBVU0VfSVRUX0JVSUxECisgIGttcF91aW50NjQgdF9yZWdpb25fdGltZTsgLy8gcmVnaW9uIGJlZ2luIHRpbWVzdGFtcAorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAvLyBNYXN0ZXIgd3JpdGUsIHdvcmtlcnMgcmVhZAorICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBLTVBfQUxJR05fQ0FDSEUgdm9pZCAqKnRfYXJndjsKKyAgaW50IHRfYXJnYzsKKyAgaW50IHRfbnByb2M7IC8vIG51bWJlciBvZiB0aHJlYWRzIGluIHRlYW0KKyAgbWljcm90YXNrX3QgdF9wa2ZuOworICBsYXVuY2hfdCB0X2ludm9rZTsgLy8gcHJvY2VkdXJlIHRvIGxhdW5jaCB0aGUgbWljcm90YXNrCisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgb21wdF90ZWFtX2luZm9fdCBvbXB0X3RlYW1faW5mbzsKKyAgb21wdF9sd190YXNrdGVhbV90ICpvbXB0X3NlcmlhbGl6ZWRfdGVhbV9pbmZvOworI2VuZGlmCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgIGttcF9pbnQ4IHRfZnBfY29udHJvbF9zYXZlZDsKKyAga21wX2ludDggdF9wYWQyYjsKKyAga21wX2ludDE2IHRfeDg3X2ZwdV9jb250cm9sX3dvcmQ7IC8vIEZQIGNvbnRyb2wgcmVncworICBrbXBfdWludDMyIHRfbXhjc3I7CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisgIHZvaWQgKnRfaW5saW5lX2FyZ3ZbS01QX0lOTElORV9BUkdWX0VOVFJJRVNdOworCisgIEtNUF9BTElHTl9DQUNIRSBrbXBfaW5mb190ICoqdF90aHJlYWRzOworICBrbXBfdGFza2RhdGFfdAorICAgICAgKnRfaW1wbGljaXRfdGFza190YXNrZGF0YTsgLy8gVGFza2RhdGEgZm9yIHRoZSB0aHJlYWQncyBpbXBsaWNpdCB0YXNrCisgIGludCB0X2xldmVsOyAvLyBuZXN0ZWQgcGFyYWxsZWwgbGV2ZWwKKworICBLTVBfQUxJR05fQ0FDSEUgaW50IHRfbWF4X2FyZ2M7CisgIGludCB0X21heF9ucHJvYzsgLy8gbWF4IHRocmVhZHMgdGhpcyB0ZWFtIGNhbiBoYW5kbGUgKGR5bmFtaWNseSBleHBhbmRhYmxlKQorICBpbnQgdF9zZXJpYWxpemVkOyAvLyBsZXZlbHMgZGVlcCBvZiBzZXJpYWxpemVkIHRlYW1zCisgIGRpc3BhdGNoX3NoYXJlZF9pbmZvX3QgKnRfZGlzcF9idWZmZXI7IC8vIGJ1ZmZlcnMgZm9yIGRpc3BhdGNoIHN5c3RlbQorICBpbnQgdF9pZDsgLy8gdGVhbSdzIGlkLCBhc3NpZ25lZCBieSBkZWJ1Z2dlci4KKyAgaW50IHRfYWN0aXZlX2xldmVsOyAvLyBuZXN0ZWQgYWN0aXZlIHBhcmFsbGVsIGxldmVsCisgIGttcF9yX3NjaGVkX3QgdF9zY2hlZDsgLy8gcnVuLXRpbWUgc2NoZWR1bGUgZm9yIHRoZSB0ZWFtCisjaWYgT01QXzQwX0VOQUJMRUQgJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICBpbnQgdF9maXJzdF9wbGFjZTsgLy8gZmlyc3QgJiBsYXN0IHBsYWNlIGluIHBhcmVudCB0aHJlYWQncyBwYXJ0aXRpb24uCisgIGludCB0X2xhc3RfcGxhY2U7IC8vIFJlc3RvcmUgdGhlc2UgdmFsdWVzIHRvIG1hc3RlciBhZnRlciBwYXIgcmVnaW9uLgorI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVEICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgaW50IHRfc2l6ZV9jaGFuZ2VkOyAvLyB0ZWFtIHNpemUgd2FzIGNoYW5nZWQ/OiAwOiBubywgMTogeWVzLCAtMTogY2hhbmdlZCB2aWEKKy8vIG9tcF9zZXRfbnVtX3RocmVhZHMoKSBjYWxsCisKKy8vIFJlYWQvd3JpdGUgYnkgd29ya2VycyBhcyB3ZWxsCisjaWYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpCisgIC8vIFVzaW5nIENBQ0hFX0xJTkU9NjQgcmVkdWNlcyBtZW1vcnkgZm9vdHByaW50LCBidXQgY2F1c2VzIGEgYmlnIHBlcmYKKyAgLy8gcmVncmVzc2lvbiBvZiBlcGNjICdwYXJhbGxlbCcgYW5kICdiYXJyaWVyJyBvbiBmeGUyNTZsaW4wMS4gVGhpcyBleHRyYQorICAvLyBwYWRkaW5nIHNlcnZlcyB0byBmaXggdGhlIHBlcmZvcm1hbmNlIG9mIGVwY2MgJ3BhcmFsbGVsJyBhbmQgJ2JhcnJpZXInIHdoZW4KKyAgLy8gQ0FDSEVfTElORT02NC4gVE9ETzogaW52ZXN0aWdhdGUgbW9yZSBhbmQgZ2V0IHJpZCBpZiB0aGlzIHBhZGRpbmcuCisgIGNoYXIgZHVtbXlfcGFkZGluZ1sxMDI0XTsKKyNlbmRpZgorICAvLyBJbnRlcm5hbCBjb250cm9sIHN0YWNrIGZvciBhZGRpdGlvbmFsIG5lc3RlZCB0ZWFtcy4KKyAgS01QX0FMSUdOX0NBQ0hFIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKnRfY29udHJvbF9zdGFja190b3A7CisvLyBmb3IgU0VSSUFMSVpFRCB0ZWFtcyBuZXN0ZWQgMiBvciBtb3JlIGxldmVscyBkZWVwCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgLy8gdHlwZWQgZmxhZyB0byBzdG9yZSByZXF1ZXN0IHN0YXRlIG9mIGNhbmNlbGxhdGlvbgorICBrbXBfaW50MzIgdF9jYW5jZWxfcmVxdWVzdDsKKyNlbmRpZgorICBpbnQgdF9tYXN0ZXJfYWN0aXZlOyAvLyBzYXZlIG9uIGZvcmssIHJlc3RvcmUgb24gam9pbgorICBrbXBfdGFza3FfdCB0X3Rhc2txOyAvLyB0aGlzIHRlYW0ncyB0YXNrIHF1ZXVlCisgIHZvaWQgKnRfY29weXByaXZfZGF0YTsgLy8gdGVhbSBzcGVjaWZpYyBwb2ludGVyIHRvIGNvcHlwcml2YXRlIGRhdGEgYXJyYXkKKyAga21wX3VpbnQzMiB0X2NvcHlpbl9jb3VudGVyOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgdm9pZCAqdF9zdGFja19pZDsgLy8gdGVhbSBzcGVjaWZpYyBzdGFjayBzdGl0Y2hpbmcgaWQgKGZvciBpdHRub3RpZnkpCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworfSBrbXBfYmFzZV90ZWFtX3Q7CisKK3VuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfdGVhbSB7CisgIGttcF9iYXNlX3RlYW1fdCB0OworICBkb3VibGUgdF9hbGlnbjsgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgIGNoYXIgdF9wYWRbS01QX1BBRChrbXBfYmFzZV90ZWFtX3QsIENBQ0hFX0xJTkUpXTsKK307CisKK3R5cGVkZWYgdW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF90aW1lX2dsb2JhbCB7CisgIGRvdWJsZSBkdF9hbGlnbjsgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgIGNoYXIgZHRfcGFkW0tNUF9QQUQoa21wX2Jhc2VfZGF0YV90LCBDQUNIRV9MSU5FKV07CisgIGttcF9iYXNlX2RhdGFfdCBkdDsKK30ga21wX3RpbWVfZ2xvYmFsX3Q7CisKK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX2dsb2JhbCB7CisgIC8qIGNhY2hlLWFsaWduZWQgKi8KKyAga21wX3RpbWVfZ2xvYmFsX3QgZ190aW1lOworCisgIC8qIG5vbiBjYWNoZS1hbGlnbmVkICovCisgIHZvbGF0aWxlIGludCBnX2Fib3J0OworICB2b2xhdGlsZSBpbnQgZ19kb25lOworCisgIGludCBnX2R5bmFtaWM7CisgIGVudW0gZHluYW1pY19tb2RlIGdfZHluYW1pY19tb2RlOworfSBrbXBfYmFzZV9nbG9iYWxfdDsKKwordHlwZWRlZiB1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX2dsb2JhbCB7CisgIGttcF9iYXNlX2dsb2JhbF90IGc7CisgIGRvdWJsZSBnX2FsaWduOyAvKiB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQgKi8KKyAgY2hhciBnX3BhZFtLTVBfUEFEKGttcF9iYXNlX2dsb2JhbF90LCBDQUNIRV9MSU5FKV07Cit9IGttcF9nbG9iYWxfdDsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2Vfcm9vdCB7CisgIC8vIFRPRE86IEdFSCAtIGNvbWJpbmUgcl9hY3RpdmUgd2l0aCByX2luX3BhcmFsbGVsIHRoZW4gcl9hY3RpdmUgPT0KKyAgLy8gKHJfaW5fcGFyYWxsZWw+PSAwKQorICAvLyBUT0RPOiBHRUggLSB0aGVuIHJlcGxhY2Ugcl9hY3RpdmUgd2l0aCB0X2FjdGl2ZV9sZXZlbHMgaWYgd2UgY2FuIHRvIHJlZHVjZQorICAvLyB0aGUgc3luY2ggb3ZlcmhlYWQgb3Iga2VlcGluZyByX2FjdGl2ZQorICB2b2xhdGlsZSBpbnQgcl9hY3RpdmU7IC8qIFRSVUUgaWYgc29tZSByZWdpb24gaW4gYSBuZXN0IGhhcyA+IDEgdGhyZWFkICovCisgIC8vIEdFSDogVGhpcyBpcyBtaXNuYW1lZCwgc2hvdWxkIGJlIHJfaW5fcGFyYWxsZWwKKyAgdm9sYXRpbGUgaW50IHJfbmVzdGVkOyAvLyBUT0RPOiBHRUggLSBUaGlzIGlzIHVudXNlZCwganVzdCByZW1vdmUgaXQgZW50aXJlbHkuCisgIGludCByX2luX3BhcmFsbGVsOyAvKiBrZWVwcyBhIGNvdW50IG9mIGFjdGl2ZSBwYXJhbGxlbCByZWdpb25zIHBlciByb290ICovCisgIC8vIEdFSDogVGhpcyBpcyBtaXNuYW1lZCwgc2hvdWxkIGJlIHJfYWN0aXZlX2xldmVscworICBrbXBfdGVhbV90ICpyX3Jvb3RfdGVhbTsKKyAga21wX3RlYW1fdCAqcl9ob3RfdGVhbTsKKyAga21wX2luZm9fdCAqcl91YmVyX3RocmVhZDsKKyAga21wX2xvY2tfdCByX2JlZ2luX2xvY2s7CisgIHZvbGF0aWxlIGludCByX2JlZ2luOworICBpbnQgcl9ibG9ja3RpbWU7IC8qIGJsb2NrdGltZSBmb3IgdGhpcyByb290IGFuZCBkZXNjZW5kYW50cyAqLworfSBrbXBfYmFzZV9yb290X3Q7CisKK3R5cGVkZWYgdW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9yb290IHsKKyAga21wX2Jhc2Vfcm9vdF90IHI7CisgIGRvdWJsZSByX2FsaWduOyAvKiB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQgKi8KKyAgY2hhciByX3BhZFtLTVBfUEFEKGttcF9iYXNlX3Jvb3RfdCwgQ0FDSEVfTElORSldOworfSBrbXBfcm9vdF90OworCitzdHJ1Y3QgZm9ydHJhbl9pbnhfaW5mbyB7CisgIGttcF9pbnQzMiBkYXRhOworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2V4dGVybiBpbnQgX19rbXBfc2V0dGluZ3M7CitleHRlcm4gaW50IF9fa21wX2R1cGxpY2F0ZV9saWJyYXJ5X29rOworI2lmIFVTRV9JVFRfQlVJTEQKK2V4dGVybiBpbnQgX19rbXBfZm9ya2pvaW5fZnJhbWVzOworZXh0ZXJuIGludCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZTsKKyNlbmRpZgorZXh0ZXJuIFBBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QgX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZDsKK2V4dGVybiBpbnQgX19rbXBfZGV0ZXJtX3JlZDsKKworI2lmZGVmIEtNUF9ERUJVRworZXh0ZXJuIGludCBrbXBfYV9kZWJ1ZzsKK2V4dGVybiBpbnQga21wX2JfZGVidWc7CitleHRlcm4gaW50IGttcF9jX2RlYnVnOworZXh0ZXJuIGludCBrbXBfZF9kZWJ1ZzsKK2V4dGVybiBpbnQga21wX2VfZGVidWc7CitleHRlcm4gaW50IGttcF9mX2RlYnVnOworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisvKiBGb3IgZGVidWcgaW5mb3JtYXRpb24gbG9nZ2luZyB1c2luZyByb3RhdGluZyBidWZmZXIgKi8KKyNkZWZpbmUgS01QX0RFQlVHX0JVRl9MSU5FU19JTklUIDUxMgorI2RlZmluZSBLTVBfREVCVUdfQlVGX0xJTkVTX01JTiAxCisKKyNkZWZpbmUgS01QX0RFQlVHX0JVRl9DSEFSU19JTklUIDEyOAorI2RlZmluZSBLTVBfREVCVUdfQlVGX0NIQVJTX01JTiAyCisKK2V4dGVybiBpbnQKKyAgICBfX2ttcF9kZWJ1Z19idWY7IC8qIFRSVUUgbWVhbnMgdXNlIGJ1ZmZlciwgRkFMU0UgbWVhbnMgcHJpbnQgdG8gc3RkZXJyICovCitleHRlcm4gaW50IF9fa21wX2RlYnVnX2J1Zl9saW5lczsgLyogSG93IG1hbnkgbGluZXMgb2YgZGVidWcgc3RvcmVkIGluIGJ1ZmZlciAqLworZXh0ZXJuIGludAorICAgIF9fa21wX2RlYnVnX2J1Zl9jaGFyczsgLyogSG93IG1hbnkgY2hhcmFjdGVycyBhbGxvd2VkIHBlciBsaW5lIGluIGJ1ZmZlciAqLworZXh0ZXJuIGludCBfX2ttcF9kZWJ1Z19idWZfYXRvbWljOyAvKiBUUlVFIG1lYW5zIHVzZSBhdG9taWMgdXBkYXRlIG9mIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSBwb2ludGVyICovCisKK2V4dGVybiBjaGFyICpfX2ttcF9kZWJ1Z19idWZmZXI7IC8qIERlYnVnIGJ1ZmZlciBpdHNlbGYgKi8KK2V4dGVybiBpbnQgX19rbXBfZGVidWdfY291bnQ7IC8qIENvdW50ZXIgZm9yIG51bWJlciBvZiBsaW5lcyBwcmludGVkIGluIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gZmFyICovCitleHRlcm4gaW50IF9fa21wX2RlYnVnX2J1Zl93YXJuX2NoYXJzOyAvKiBLZWVwIHRyYWNrIG9mIGNoYXIgaW5jcmVhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29tbWVuZGVkIGluIHdhcm5pbmdzICovCisvKiBlbmQgcm90YXRpbmcgZGVidWcgYnVmZmVyICovCisKKyNpZmRlZiBLTVBfREVCVUcKK2V4dGVybiBpbnQgX19rbXBfcGFyX3JhbmdlOyAvKiArMSA9PiBvbmx5IGdvIHBhciBmb3IgY29uc3RydWN0cyBpbiByYW5nZSAqLworCisjZGVmaW5lIEtNUF9QQVJfUkFOR0VfUk9VVElORV9MRU4gMTAyNAorZXh0ZXJuIGNoYXIgX19rbXBfcGFyX3JhbmdlX3JvdXRpbmVbS01QX1BBUl9SQU5HRV9ST1VUSU5FX0xFTl07CisjZGVmaW5lIEtNUF9QQVJfUkFOR0VfRklMRU5BTUVfTEVOIDEwMjQKK2V4dGVybiBjaGFyIF9fa21wX3Bhcl9yYW5nZV9maWxlbmFtZVtLTVBfUEFSX1JBTkdFX0ZJTEVOQU1FX0xFTl07CitleHRlcm4gaW50IF9fa21wX3Bhcl9yYW5nZV9sYjsKK2V4dGVybiBpbnQgX19rbXBfcGFyX3JhbmdlX3ViOworI2VuZGlmCisKKy8qIEZvciBwcmludGluZyBvdXQgZHluYW1pYyBzdG9yYWdlIG1hcCBmb3IgdGhyZWFkcyBhbmQgdGVhbXMgKi8KK2V4dGVybiBpbnQKKyAgICBfX2ttcF9zdG9yYWdlX21hcDsgLyogVHJ1ZSBtZWFucyBwcmludCBzdG9yYWdlIG1hcCBmb3IgdGhyZWFkcyBhbmQgdGVhbXMgKi8KK2V4dGVybiBpbnQgX19rbXBfc3RvcmFnZV9tYXBfdmVyYm9zZTsgLyogVHJ1ZSBtZWFucyBzdG9yYWdlIG1hcCBpbmNsdWRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZW1lbnQgaW5mbyAqLworZXh0ZXJuIGludCBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlX3NwZWNpZmllZDsKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKK2V4dGVybiBrbXBfY3B1aW5mb190IF9fa21wX2NwdWluZm87CisjZW5kaWYKKworZXh0ZXJuIHZvbGF0aWxlIGludCBfX2ttcF9pbml0X3NlcmlhbDsKK2V4dGVybiB2b2xhdGlsZSBpbnQgX19rbXBfaW5pdF9ndGlkOworZXh0ZXJuIHZvbGF0aWxlIGludCBfX2ttcF9pbml0X2NvbW1vbjsKK2V4dGVybiB2b2xhdGlsZSBpbnQgX19rbXBfaW5pdF9taWRkbGU7CitleHRlcm4gdm9sYXRpbGUgaW50IF9fa21wX2luaXRfcGFyYWxsZWw7CisjaWYgS01QX1VTRV9NT05JVE9SCitleHRlcm4gdm9sYXRpbGUgaW50IF9fa21wX2luaXRfbW9uaXRvcjsKKyNlbmRpZgorZXh0ZXJuIHZvbGF0aWxlIGludCBfX2ttcF9pbml0X3VzZXJfbG9ja3M7CitleHRlcm4gaW50IF9fa21wX2luaXRfY291bnRlcjsKK2V4dGVybiBpbnQgX19rbXBfcm9vdF9jb3VudGVyOworZXh0ZXJuIGludCBfX2ttcF92ZXJzaW9uOworCisvKiBsaXN0IG9mIGFkZHJlc3Mgb2YgYWxsb2NhdGVkIGNhY2hlcyBmb3IgY29tbW9ucyAqLworZXh0ZXJuIGttcF9jYWNoZWRfYWRkcl90ICpfX2ttcF90aHJlYWRwcml2X2NhY2hlX2xpc3Q7CisKKy8qIEJhcnJpZXIgYWxnb3JpdGhtIHR5cGVzIGFuZCBvcHRpb25zICovCitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF9iYXJyaWVyX2dhdGhlcl9iYl9kZmx0OworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfYmFycmllcl9yZWxlYXNlX2JiX2RmbHQ7CitleHRlcm4ga21wX2Jhcl9wYXRfZSBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXRfZGZsdDsKK2V4dGVybiBrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXRfZGZsdDsKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzW2JzX2xhc3RfYmFycmllcl07CitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbYnNfbGFzdF9iYXJyaWVyXTsKK2V4dGVybiBrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm5bYnNfbGFzdF9iYXJyaWVyXTsKK2V4dGVybiBrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuW2JzX2xhc3RfYmFycmllcl07CitleHRlcm4gY2hhciBjb25zdCAqX19rbXBfYmFycmllcl9icmFuY2hfYml0X2Vudl9uYW1lW2JzX2xhc3RfYmFycmllcl07CitleHRlcm4gY2hhciBjb25zdCAqX19rbXBfYmFycmllcl9wYXR0ZXJuX2Vudl9uYW1lW2JzX2xhc3RfYmFycmllcl07CitleHRlcm4gY2hhciBjb25zdCAqX19rbXBfYmFycmllcl90eXBlX25hbWVbYnNfbGFzdF9iYXJyaWVyXTsKK2V4dGVybiBjaGFyIGNvbnN0ICpfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZVticF9sYXN0X2Jhcl07CisKKy8qIEdsb2JhbCBMb2NrcyAqLworZXh0ZXJuIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2luaXR6X2xvY2s7IC8qIGNvbnRyb2wgaW5pdGlhbGl6YXRpb24gKi8KK2V4dGVybiBrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9mb3Jram9pbl9sb2NrOyAvKiBjb250cm9sIGZvcmsvam9pbiBhY2Nlc3MgKi8KK2V4dGVybiBrbXBfYm9vdHN0cmFwX2xvY2tfdAorICAgIF9fa21wX2V4aXRfbG9jazsgLyogZXhpdCgpIGlzIG5vdCBhbHdheXMgdGhyZWFkLXNhZmUgKi8KKyNpZiBLTVBfVVNFX01PTklUT1IKK2V4dGVybiBrbXBfYm9vdHN0cmFwX2xvY2tfdAorICAgIF9fa21wX21vbml0b3JfbG9jazsgLyogY29udHJvbCBtb25pdG9yIHRocmVhZCBjcmVhdGlvbiAqLworI2VuZGlmCitleHRlcm4ga21wX2Jvb3RzdHJhcF9sb2NrX3QKKyAgICBfX2ttcF90cF9jYWNoZWRfbG9jazsgLyogdXNlZCBmb3IgdGhlIGhhY2sgdG8gYWxsb3cgdGhyZWFkcHJpdmF0ZSBjYWNoZSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfdGhyZWFkcyBleHBhbnNpb24gdG8gY28tZXhpc3QgKi8KKworZXh0ZXJuIGttcF9sb2NrX3QgX19rbXBfZ2xvYmFsX2xvY2s7IC8qIGNvbnRyb2wgT1MvZ2xvYmFsIGFjY2VzcyAgKi8KK2V4dGVybiBrbXBfcXVldWluZ19sb2NrX3QgX19rbXBfZGlzcGF0Y2hfbG9jazsgLyogY29udHJvbCBkaXNwYXRjaCBhY2Nlc3MgICovCitleHRlcm4ga21wX2xvY2tfdCBfX2ttcF9kZWJ1Z19sb2NrOyAvKiBjb250cm9sIEkvTyBhY2Nlc3MgZm9yIEtNUF9ERUJVRyAqLworCisvKiB1c2VkIGZvciB5aWVsZGluZyBzcGluLXdhaXRzICovCitleHRlcm4gdW5zaWduZWQgaW50IF9fa21wX2luaXRfd2FpdDsgLyogaW5pdGlhbCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAgICovCitleHRlcm4gdW5zaWduZWQgaW50IF9fa21wX25leHRfd2FpdDsgLyogc3VzZXF1ZW50IG51bWJlciBvZiBzcGluLXRlc3RzICovCisKK2V4dGVybiBlbnVtIGxpYnJhcnlfdHlwZSBfX2ttcF9saWJyYXJ5OworCitleHRlcm4gZW51bSBzY2hlZF90eXBlIF9fa21wX3NjaGVkOyAvKiBkZWZhdWx0IHJ1bnRpbWUgc2NoZWR1bGluZyAqLworZXh0ZXJuIGVudW0gc2NoZWRfdHlwZSBfX2ttcF9zdGF0aWM7IC8qIGRlZmF1bHQgc3RhdGljIHNjaGVkdWxpbmcgbWV0aG9kICovCitleHRlcm4gZW51bSBzY2hlZF90eXBlIF9fa21wX2d1aWRlZDsgLyogZGVmYXVsdCBndWlkZWQgc2NoZWR1bGluZyBtZXRob2QgKi8KK2V4dGVybiBlbnVtIHNjaGVkX3R5cGUgX19rbXBfYXV0bzsgLyogZGVmYXVsdCBhdXRvIHNjaGVkdWxpbmcgbWV0aG9kICovCitleHRlcm4gaW50IF9fa21wX2NodW5rOyAvKiBkZWZhdWx0IHJ1bnRpbWUgY2h1bmsgc2l6ZSAqLworCitleHRlcm4gc2l6ZV90IF9fa21wX3N0a3NpemU7IC8qIHN0YWNrIHNpemUgcGVyIHRocmVhZCAgICAgICAgICovCisjaWYgS01QX1VTRV9NT05JVE9SCitleHRlcm4gc2l6ZV90IF9fa21wX21vbml0b3Jfc3Rrc2l6ZTsgLyogc3RhY2sgc2l6ZSBmb3IgbW9uaXRvciB0aHJlYWQgKi8KKyNlbmRpZgorZXh0ZXJuIHNpemVfdCBfX2ttcF9zdGtvZmZzZXQ7IC8qIHN0YWNrIG9mZnNldCBwZXIgdGhyZWFkICAgICAgICovCitleHRlcm4gaW50IF9fa21wX3N0a3BhZGRpbmc7IC8qIFNob3VsZCB3ZSBwYWQgcm9vdCB0aHJlYWQocykgc3RhY2sgKi8KKworZXh0ZXJuIHNpemVfdAorICAgIF9fa21wX21hbGxvY19wb29sX2luY3I7IC8qIGluY3JlbWVudGFsIHNpemUgb2YgcG9vbCBmb3Iga21wX21hbGxvYygpICovCitleHRlcm4gaW50IF9fa21wX2Vudl9jaHVuazsgLyogd2FzIEtNUF9DSFVOSyBzcGVjaWZpZWQ/ICAgICAqLworZXh0ZXJuIGludCBfX2ttcF9lbnZfc3Rrc2l6ZTsgLyogd2FzIEtNUF9TVEFDS1NJWkUgc3BlY2lmaWVkPyAqLworZXh0ZXJuIGludCBfX2ttcF9lbnZfb21wX3N0a3NpemU7IC8qIHdhcyBPTVBfU1RBQ0tTSVpFIHNwZWNpZmllZD8gKi8KK2V4dGVybiBpbnQgX19rbXBfZW52X2FsbF90aHJlYWRzOyAvKiB3YXMgS01QX0FMTF9USFJFQURTIG9yIEtNUF9NQVhfVEhSRUFEUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZD8gKi8KK2V4dGVybiBpbnQgX19rbXBfZW52X29tcF9hbGxfdGhyZWFkczsgLyogd2FzIE9NUF9USFJFQURfTElNSVQgc3BlY2lmaWVkPyAqLworZXh0ZXJuIGludCBfX2ttcF9lbnZfYmxvY2t0aW1lOyAvKiB3YXMgS01QX0JMT0NLVElNRSBzcGVjaWZpZWQ/ICovCitleHRlcm4gaW50IF9fa21wX2Vudl9jaGVja3M7IC8qIHdhcyBLTVBfQ0hFQ0tTIHNwZWNpZmllZD8gICAgKi8KK2V4dGVybiBpbnQKKyAgICBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2s7IC8qIHdhcyBLTVBfQ09OU0lTVEVOQ1lfQ0hFQ0sgc3BlY2lmaWVkPyAgICAqLworZXh0ZXJuIGludCBfX2ttcF9nZW5lcmF0ZV93YXJuaW5nczsgLyogc2hvdWxkIHdlIGlzc3VlIHdhcm5pbmdzPyAqLworZXh0ZXJuIGludCBfX2ttcF9yZXNlcnZlX3dhcm47IC8qIGhhdmUgd2UgaXNzdWVkIHJlc2VydmVfdGhyZWFkcyB3YXJuaW5nPyAqLworCisjaWZkZWYgREVCVUdfU1VTUEVORAorZXh0ZXJuIGludCBfX2ttcF9zdXNwZW5kX2NvdW50OyAvKiBjb3VudCBpbnNpZGUgX19rbXBfc3VzcGVuZF90ZW1wbGF0ZSgpICovCisjZW5kaWYKKworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfeWllbGRfaW5pdDsKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX3lpZWxkX25leHQ7CisKKyNpZiBLTVBfVVNFX01PTklUT1IKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX3lpZWxkaW5nX29uOworI2VuZGlmCitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF95aWVsZF9jeWNsZTsKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfeWllbGRfb25fY291bnQ7CitleHRlcm4ga21wX2ludDMyIF9fa21wX3lpZWxkX29mZl9jb3VudDsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworZXh0ZXJuIGludCBfX2ttcF9hbGxUaHJlYWRzU3BlY2lmaWVkOworCitleHRlcm4gc2l6ZV90IF9fa21wX2FsaWduX2FsbG9jOworLyogZm9sbG93aW5nIGRhdGEgcHJvdGVjdGVkIGJ5IGluaXRpYWxpemF0aW9uIHJvdXRpbmVzICovCitleHRlcm4gaW50IF9fa21wX3hwcm9jOyAvKiBudW1iZXIgb2YgcHJvY2Vzc29ycyBpbiB0aGUgc3lzdGVtICovCitleHRlcm4gaW50IF9fa21wX2F2YWlsX3Byb2M7IC8qIG51bWJlciBvZiBwcm9jZXNzb3JzIGF2YWlsYWJsZSB0byB0aGUgcHJvY2VzcyAqLworZXh0ZXJuIHNpemVfdCBfX2ttcF9zeXNfbWluX3N0a3NpemU7IC8qIHN5c3RlbS1kZWZpbmVkIG1pbmltdW0gc3RhY2sgc2l6ZSAqLworZXh0ZXJuIGludCBfX2ttcF9zeXNfbWF4X250aDsgLyogc3lzdGVtLWltcG9zZWQgbWF4aW11bSBudW1iZXIgb2YgdGhyZWFkcyAqLworZXh0ZXJuIGludAorICAgIF9fa21wX21heF9udGg7IC8qIG1heGltdW0gdG90YWwgbnVtYmVyIG9mIGNvbmN1cnJlbnRseS1leGlzdGluZyB0aHJlYWRzICovCitleHRlcm4gaW50IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7IC8qIGNhcGFjaXR5IG9mIHRoZSBhcnJheXMgX19rbXBfdGhyZWFkcyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfcm9vdCAqLworZXh0ZXJuIGludCBfX2ttcF9kZmx0X3RlYW1fbnRoOyAvKiBkZWZhdWx0IG51bWJlciBvZiB0aHJlYWRzIGluIGEgcGFyYWxsZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uIGEgbGEgT01QX05VTV9USFJFQURTICovCitleHRlcm4gaW50IF9fa21wX2RmbHRfdGVhbV9udGhfdWI7IC8qIHVwcGVyIGJvdW5kIG9uICIiIGRldGVybWluZWQgYXQgc2VyaWFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uICovCitleHRlcm4gaW50IF9fa21wX3RwX2NhcGFjaXR5OyAvKiBjYXBhY2l0eSBvZiBfX2ttcF90aHJlYWRzIGlmIHRocmVhZHByaXZhdGUgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgKGZpeGVkKSAqLworZXh0ZXJuIGludCBfX2ttcF90cF9jYWNoZWQ7IC8qIHdoZXRoZXIgdGhyZWFkcHJpdmF0ZSBjYWNoZSBoYXMgYmVlbiBjcmVhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fa21wY190aHJlYWRwcml2YXRlX2NhY2hlZCgpKSAqLworZXh0ZXJuIGludCBfX2ttcF9kZmx0X25lc3RlZDsgLyogbmVzdGVkIHBhcmFsbGVsaXNtIGVuYWJsZWQgYnkgZGVmYXVsdCBhIGxhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVBfTkVTVEVEICovCitleHRlcm4gaW50IF9fa21wX2RmbHRfYmxvY2t0aW1lOyAvKiBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja2luZyAoZW52IHNldHRpbmcpICovCisjaWYgS01QX1VTRV9NT05JVE9SCitleHRlcm4gaW50CisgICAgX19rbXBfbW9uaXRvcl93YWtldXBzOyAvKiBudW1iZXIgb2YgdGltZXMgbW9uaXRvciB3YWtlcyB1cCBwZXIgc2Vjb25kICovCitleHRlcm4gaW50IF9fa21wX2J0X2ludGVydmFsczsgLyogbnVtYmVyIG9mIG1vbml0b3IgdGltZXN0YW1wIGludGVydmFscyBiZWZvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja2luZyAqLworI2VuZGlmCisjaWZkZWYgS01QX0FESlVTVF9CTE9DS1RJTUUKK2V4dGVybiBpbnQgX19rbXBfemVyb19idDsgLyogd2hldGhlciBibG9ja3RpbWUgaGFzIGJlZW4gZm9yY2VkIHRvIHplcm8gKi8KKyNlbmRpZiAvKiBLTVBfQURKVVNUX0JMT0NLVElNRSAqLworI2lmZGVmIEtNUF9ERkxUX05USF9DT1JFUworZXh0ZXJuIGludCBfX2ttcF9uY29yZXM7IC8qIFRvdGFsIG51bWJlciBvZiBjb3JlcyBmb3IgdGhyZWFkcyBwbGFjZW1lbnQgKi8KKyNlbmRpZgorZXh0ZXJuIGludAorICAgIF9fa21wX2Fib3J0X2RlbGF5OyAvKiBOdW1iZXIgb2YgbWlsbGlzZWNzIHRvIGRlbGF5IG9uIGFib3J0IGZvciBWVHVuZSAqLworCitleHRlcm4gaW50IF9fa21wX25lZWRfcmVnaXN0ZXJfYXRmb3JrX3NwZWNpZmllZDsKK2V4dGVybiBpbnQKKyAgICBfX2ttcF9uZWVkX3JlZ2lzdGVyX2F0Zm9yazsgLyogQXQgaW5pdGlhbGl6YXRpb24sIGNhbGwgcHRocmVhZF9hdGZvcmsgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbCBmb3JrIGhhbmRsZXIgKi8KK2V4dGVybiBpbnQgX19rbXBfZ3RpZF9tb2RlOyAvKiBNZXRob2Qgb2YgZ2V0dGluZyBndGlkLCB2YWx1ZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAtIG5vdCBzZXQsIHdpbGwgYmUgc2V0IGF0IHJ1bnRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC0gdXNpbmcgc3RhY2sgc2VhcmNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAtIGR5bmFtaWMgVExTIChwdGhyZWFkX2dldHNwZWNpZmljKExpbnV4KiBPUy9PUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYKikgb3IgVGxzR2V0VmFsdWUoV2luZG93cyogT1MpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgLSBzdGF0aWMgVExTIChfX2RlY2xzcGVjKHRocmVhZCkgX19rbXBfZ3RpZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbnV4KiBPUyAuc28gb25seS4gICovCitleHRlcm4gaW50CisgICAgX19rbXBfYWRqdXN0X2d0aWRfbW9kZTsgLyogSWYgdHJ1ZSwgYWRqdXN0IG1ldGhvZCBiYXNlZCBvbiAjdGhyZWFkcyAqLworI2lmZGVmIEtNUF9UREFUQV9HVElECisjaWYgS01QX09TX1dJTkRPV1MKK2V4dGVybiBfX2RlY2xzcGVjKAorICAgIHRocmVhZCkgaW50IF9fa21wX2d0aWQ7IC8qIFRoaXMgdGhyZWFkJ3MgZ3RpZCwgaWYgX19rbXBfZ3RpZF9tb2RlID09IDMgKi8KKyNlbHNlCitleHRlcm4gX190aHJlYWQgaW50IF9fa21wX2d0aWQ7CisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgLSB3b3JrYXJvdW5kIGJlY2F1c2UgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgICAgXAorICAgICAgICAgIGNvbXBpbGVyIDIwMTEwMzE2IGRvZXNuJ3QgYWNjZXB0IF9fZGVjbHNwZWMgKi8KKyNlbmRpZgorZXh0ZXJuIGludCBfX2ttcF90bHNfZ3RpZF9taW47IC8qICN0aHJlYWRzIGJlbG93IHdoaWNoIHVzZSBzcCBzZWFyY2ggZm9yIGd0aWQgKi8KK2V4dGVybiBpbnQgX19rbXBfZm9yZWlnbl90cDsgLy8gSWYgdHJ1ZSwgc2VwYXJhdGUgVFAgdmFyIGZvciBlYWNoIGZvcmVpZ24gdGhyZWFkCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorZXh0ZXJuIGludCBfX2ttcF9pbmhlcml0X2ZwX2NvbnRyb2w7IC8vIGNvcHkgZnAgY3JlZyhzKSBwYXJlbnQtPndvcmtlcnMgYXQgZm9yaworZXh0ZXJuIGttcF9pbnQxNiBfX2ttcF9pbml0X3g4N19mcHVfY29udHJvbF93b3JkOyAvLyBpbml0IHRocmVhZCdzIEZQIGN0cmwgcmVnCitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF9pbml0X214Y3NyOyAvKiBpbml0IHRocmVhZCdzIG14c2NyICovCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCitleHRlcm4gaW50IF9fa21wX2RmbHRfbWF4X2FjdGl2ZV9sZXZlbHM7IC8qIG1heF9hY3RpdmVfbGV2ZWxzIGZvciBuZXN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYWxsZWxpc20gZW5hYmxlZCBieSBkZWZhdWx0IHZpYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVBfTUFYX0FDVElWRV9MRVZFTFMgKi8KK2V4dGVybiBpbnQgX19rbXBfZGlzcGF0Y2hfbnVtX2J1ZmZlcnM7IC8qIG1heCBwb3NzaWJsZSBkeW5hbWljIGxvb3BzIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jdXJyZW50IGV4ZWN1dGlvbiBwZXIgdGVhbSAqLworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCitleHRlcm4gaW50IF9fa21wX2hvdF90ZWFtc19tb2RlOworZXh0ZXJuIGludCBfX2ttcF9ob3RfdGVhbXNfbWF4X2xldmVsOworI2VuZGlmCisKKyNpZiBLTVBfT1NfTElOVVgKK2V4dGVybiBlbnVtIGNsb2NrX2Z1bmN0aW9uX3R5cGUgX19rbXBfY2xvY2tfZnVuY3Rpb247CitleHRlcm4gaW50IF9fa21wX2Nsb2NrX2Z1bmN0aW9uX3BhcmFtOworI2VuZGlmIC8qIEtNUF9PU19MSU5VWCAqLworCisjaWYgS01QX01JQ19TVVBQT1JURUQKK2V4dGVybiBlbnVtIG1pY190eXBlIF9fa21wX21pY190eXBlOworI2VuZGlmCisKKyNpZmRlZiBVU0VfTE9BRF9CQUxBTkNFCitleHRlcm4gZG91YmxlIF9fa21wX2xvYWRfYmFsYW5jZV9pbnRlcnZhbDsgLy8gbG9hZCBiYWxhbmNlIGFsZ29yaXRobSBpbnRlcnZhbAorI2VuZGlmIC8qIFVTRV9MT0FEX0JBTEFOQ0UgKi8KKworLy8gT3Blbk1QIDMuMSAtIE5lc3RlZCBudW0gdGhyZWFkcyBhcnJheQordHlwZWRlZiBzdHJ1Y3Qga21wX25lc3RlZF9udGhyZWFkc190IHsKKyAgaW50ICpudGg7CisgIGludCBzaXplOworICBpbnQgdXNlZDsKK30ga21wX25lc3RlZF9udGhyZWFkc190OworCitleHRlcm4ga21wX25lc3RlZF9udGhyZWFkc190IF9fa21wX25lc3RlZF9udGg7CisKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKy8vIFBhcmFtZXRlcnMgZm9yIHRoZSBzcGVjdWxhdGl2ZSBsb2NrIGJhY2tvZmYgc3lzdGVtLgorc3RydWN0IGttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtc190IHsKKyAgLy8gTnVtYmVyIG9mIHNvZnQgcmV0cmllcyBiZWZvcmUgaXQgY291bnRzIGFzIGEgaGFyZCByZXRyeS4KKyAga21wX3VpbnQzMiBtYXhfc29mdF9yZXRyaWVzOworICAvLyBCYWRuZXNzIGlzIGEgYml0IG1hc2sgOiAwLDEsMyw3LDE1LC4uLiBvbiBlYWNoIGhhcmQgZmFpbHVyZSB3ZSBtb3ZlIG9uZSB0bworICAvLyB0aGUgcmlnaHQKKyAga21wX3VpbnQzMiBtYXhfYmFkbmVzczsKK307CisKK2V4dGVybiBrbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXNfdCBfX2ttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtczsKKworI2lmIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUworZXh0ZXJuIGNoYXIgKl9fa21wX3NwZWN1bGF0aXZlX3N0YXRzZmlsZTsKKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworCisjaWYgT01QXzQwX0VOQUJMRUQKK2V4dGVybiBpbnQgX19rbXBfZGlzcGxheV9lbnY7IC8qIFRSVUUgb3IgRkFMU0UgKi8KK2V4dGVybiBpbnQgX19rbXBfZGlzcGxheV9lbnZfdmVyYm9zZTsgLyogVFJVRSBpZiBPTVBfRElTUExBWV9FTlY9VkVSQk9TRSAqLworZXh0ZXJuIGludCBfX2ttcF9vbXBfY2FuY2VsbGF0aW9uOyAvKiBUUlVFIG9yIEZBTFNFICovCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiB0aGUgZm9sbG93aW5nIGFyZSBwcm90ZWN0ZWQgYnkgdGhlIGZvcmsvam9pbiBsb2NrICovCisvKiB3cml0ZTogbG9jayAgcmVhZDogYW55dGltZSAqLworZXh0ZXJuIGttcF9pbmZvX3QgKipfX2ttcF90aHJlYWRzOyAvKiBEZXNjcmlwdG9ycyBmb3IgdGhlIHRocmVhZHMgKi8KKy8qIHJlYWQvd3JpdGU6IGxvY2sgKi8KK2V4dGVybiB2b2xhdGlsZSBrbXBfdGVhbV90ICpfX2ttcF90ZWFtX3Bvb2w7CitleHRlcm4gdm9sYXRpbGUga21wX2luZm9fdCAqX19rbXBfdGhyZWFkX3Bvb2w7CisKKy8vIHRvdGFsIG51bSB0aHJlYWRzIHJlYWNoYWJsZSBmcm9tIHNvbWUgcm9vdCB0aHJlYWQgaW5jbHVkaW5nIGFsbCByb290IHRocmVhZHMKK2V4dGVybiB2b2xhdGlsZSBpbnQgX19rbXBfbnRoOworLyogdG90YWwgbnVtYmVyIG9mIHRocmVhZHMgcmVhY2hhYmxlIGZyb20gc29tZSByb290IHRocmVhZCBpbmNsdWRpbmcgYWxsIHJvb3QKKyAgIHRocmVhZHMsIGFuZCB0aG9zZSBpbiB0aGUgdGhyZWFkIHBvb2wgKi8KK2V4dGVybiB2b2xhdGlsZSBpbnQgX19rbXBfYWxsX250aDsKK2V4dGVybiBpbnQgX19rbXBfdGhyZWFkX3Bvb2xfbnRoOworZXh0ZXJuIHZvbGF0aWxlIGludCBfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoOworCitleHRlcm4ga21wX3Jvb3RfdCAqKl9fa21wX3Jvb3Q7IC8qIHJvb3Qgb2YgdGhyZWFkIGhpZXJhcmNoeSAqLworLyogZW5kIGRhdGEgcHJvdGVjdGVkIGJ5IGZvcmsvam9pbiBsb2NrICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2V4dGVybiBrbXBfZ2xvYmFsX3QgX19rbXBfZ2xvYmFsOyAvKiBnbG9iYWwgc3RhdHVzICovCisKK2V4dGVybiBrbXBfaW5mb190IF9fa21wX21vbml0b3I7CitleHRlcm4gdm9sYXRpbGUga21wX3VpbnQzMiBfX2ttcF90ZWFtX2NvdW50ZXI7IC8vIEZvciBEZWJ1Z2dpbmcgU3VwcG9ydCBMaWJyYXJ5CitleHRlcm4gdm9sYXRpbGUga21wX3VpbnQzMiBfX2ttcF90YXNrX2NvdW50ZXI7IC8vIEZvciBEZWJ1Z2dpbmcgU3VwcG9ydCBMaWJyYXJ5CisKKyNpZiBVU0VfREVCVUdHRVIKKworI2RlZmluZSBfS01QX0dFTl9JRChjb3VudGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKF9fa21wX2RlYnVnZ2luZyA/IEtNUF9URVNUX1RIRU5fSU5DMzIoKHZvbGF0aWxlIGttcF9pbnQzMiAqKSZjb3VudGVyKSArIDEgICBcCisgICAgICAgICAgICAgICAgICAgOiB+MCkKKyNlbHNlCisjZGVmaW5lIF9LTVBfR0VOX0lEKGNvdW50ZXIpICh+MCkKKyNlbmRpZiAvKiBVU0VfREVCVUdHRVIgKi8KKworI2RlZmluZSBLTVBfR0VOX1RBU0tfSUQoKSBfS01QX0dFTl9JRChfX2ttcF90YXNrX2NvdW50ZXIpCisjZGVmaW5lIEtNUF9HRU5fVEVBTV9JRCgpIF9LTVBfR0VOX0lEKF9fa21wX3RlYW1fY291bnRlcikKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2V4dGVybiB2b2lkIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoaW50IGd0aWQsIHZvaWQgKnAxLCB2b2lkICpwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsIGNoYXIgY29uc3QgKmZvcm1hdCwgLi4uKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfc2VyaWFsX2luaXRpYWxpemUodm9pZCk7CitleHRlcm4gdm9pZCBfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSh2b2lkKTsKK2V4dGVybiB2b2lkIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUodm9pZCk7CisKK2V4dGVybiB2b2lkIF9fa21wX2ludGVybmFsX2JlZ2luKHZvaWQpOworZXh0ZXJuIHZvaWQgX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnkoaW50IGd0aWQpOworZXh0ZXJuIHZvaWQgX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZChpbnQgZ3RpZCk7CitleHRlcm4gdm9pZCBfX2ttcF9pbnRlcm5hbF9lbmRfYXRleGl0KHZvaWQpOworZXh0ZXJuIHZvaWQgX19rbXBfaW50ZXJuYWxfZW5kX2Zpbmkodm9pZCk7CitleHRlcm4gdm9pZCBfX2ttcF9pbnRlcm5hbF9lbmRfZHRvcih2b2lkKTsKK2V4dGVybiB2b2lkIF9fa21wX2ludGVybmFsX2VuZF9kZXN0KHZvaWQgKik7CisKK2V4dGVybiBpbnQgX19rbXBfcmVnaXN0ZXJfcm9vdChpbnQgaW5pdGlhbF90aHJlYWQpOworZXh0ZXJuIHZvaWQgX19rbXBfdW5yZWdpc3Rlcl9yb290KGludCBndGlkKTsKKworZXh0ZXJuIGludCBfX2ttcF9pZ25vcmVfbXBwYmVnKHZvaWQpOworZXh0ZXJuIGludCBfX2ttcF9pZ25vcmVfbXBwZW5kKHZvaWQpOworCitleHRlcm4gaW50IF9fa21wX2VudGVyX3NpbmdsZShpbnQgZ3RpZCwgaWRlbnRfdCAqaWRfcmVmLCBpbnQgcHVzaF93cyk7CitleHRlcm4gdm9pZCBfX2ttcF9leGl0X3NpbmdsZShpbnQgZ3RpZCk7CisKK2V4dGVybiB2b2lkIF9fa21wX3BhcmFsbGVsX2RlbyhpbnQgKmd0aWRfcmVmLCBpbnQgKmNpZF9yZWYsIGlkZW50X3QgKmxvY19yZWYpOworZXh0ZXJuIHZvaWQgX19rbXBfcGFyYWxsZWxfZHhvKGludCAqZ3RpZF9yZWYsIGludCAqY2lkX3JlZiwgaWRlbnRfdCAqbG9jX3JlZik7CisKKyNpZmRlZiBVU0VfTE9BRF9CQUxBTkNFCitleHRlcm4gaW50IF9fa21wX2dldF9sb2FkX2JhbGFuY2UoaW50KTsKKyNlbmRpZgorCisjaWZkZWYgQlVJTERfVFYKK2V4dGVybiB2b2lkIF9fa21wX3R2X3RocmVhZHByaXZhdGVfc3RvcmUoa21wX2luZm9fdCAqdGgsIHZvaWQgKmdsb2JhbF9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp0aHJlYWRfYWRkcik7CisjZW5kaWYKKworZXh0ZXJuIGludCBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZCh2b2lkKTsKK2V4dGVybiBpbnQgX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWRfcmVnKHZvaWQpOworZXh0ZXJuIHZvaWQgX19rbXBfZXhpdF90aHJlYWQoaW50IGV4aXRfc3RhdHVzKTsKK2V4dGVybiB2b2lkIF9fa21wX2Fib3J0KGNoYXIgY29uc3QgKmZvcm1hdCwgLi4uKTsKK2V4dGVybiB2b2lkIF9fa21wX2Fib3J0X3RocmVhZCh2b2lkKTsKK2V4dGVybiB2b2lkIF9fa21wX2Fib3J0X3Byb2Nlc3Modm9pZCk7CitleHRlcm4gdm9pZCBfX2ttcF93YXJuKGNoYXIgY29uc3QgKmZvcm1hdCwgLi4uKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfc2V0X251bV90aHJlYWRzKGludCBuZXdfbnRoLCBpbnQgZ3RpZCk7CisKKy8vIFJldHVybnMgY3VycmVudCB0aHJlYWQgKHBvaW50ZXIgdG8ga21wX2luZm9fdCkuIEN1cnJlbnQgdGhyZWFkICptdXN0KiBiZQorLy8gcmVnaXN0ZXJlZC4KK3N0YXRpYyBpbmxpbmUga21wX2luZm9fdCAqX19rbXBfZW50cnlfdGhyZWFkKCkgeworICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKworICByZXR1cm4gX19rbXBfdGhyZWFkc1tndGlkXTsKK30KKworZXh0ZXJuIHZvaWQgX19rbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKGludCBndGlkLCBpbnQgbmV3X21heF9hY3RpdmVfbGV2ZWxzKTsKK2V4dGVybiBpbnQgX19rbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzKGludCBndGlkKTsKK2V4dGVybiBpbnQgX19rbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0oaW50IGd0aWQsIGludCBsZXZlbCk7CitleHRlcm4gaW50IF9fa21wX2dldF90ZWFtX3NpemUoaW50IGd0aWQsIGludCBsZXZlbCk7CitleHRlcm4gdm9pZCBfX2ttcF9zZXRfc2NoZWR1bGUoaW50IGd0aWQsIGttcF9zY2hlZF90IG5ld19zY2hlZCwgaW50IGNodW5rKTsKK2V4dGVybiB2b2lkIF9fa21wX2dldF9zY2hlZHVsZShpbnQgZ3RpZCwga21wX3NjaGVkX3QgKnNjaGVkLCBpbnQgKmNodW5rKTsKKworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IF9fa21wX2dldF9yYW5kb20oa21wX2luZm9fdCAqdGhyZWFkKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfcmFuZG9tKGttcF9pbmZvX3QgKnRocmVhZCk7CisKK2V4dGVybiBrbXBfcl9zY2hlZF90IF9fa21wX2dldF9zY2hlZHVsZV9nbG9iYWwodm9pZCk7CitleHRlcm4gdm9pZCBfX2ttcF9hZGp1c3RfbnVtX3RocmVhZHMoaW50IG5ld19ucHJvYyk7CisKK2V4dGVybiB2b2lkICpfX19rbXBfYWxsb2NhdGUoc2l6ZV90IHNpemUgS01QX1NSQ19MT0NfREVDTCk7CitleHRlcm4gdm9pZCAqX19fa21wX3BhZ2VfYWxsb2NhdGUoc2l6ZV90IHNpemUgS01QX1NSQ19MT0NfREVDTCk7CitleHRlcm4gdm9pZCBfX19rbXBfZnJlZSh2b2lkICpwdHIgS01QX1NSQ19MT0NfREVDTCk7CisjZGVmaW5lIF9fa21wX2FsbG9jYXRlKHNpemUpIF9fX2ttcF9hbGxvY2F0ZSgoc2l6ZSlLTVBfU1JDX0xPQ19DVVJSKQorI2RlZmluZSBfX2ttcF9wYWdlX2FsbG9jYXRlKHNpemUpIF9fX2ttcF9wYWdlX2FsbG9jYXRlKChzaXplKUtNUF9TUkNfTE9DX0NVUlIpCisjZGVmaW5lIF9fa21wX2ZyZWUocHRyKSBfX19rbXBfZnJlZSgocHRyKUtNUF9TUkNfTE9DX0NVUlIpCisKKyNpZiBVU0VfRkFTVF9NRU1PUlkKK2V4dGVybiB2b2lkICpfX19rbXBfZmFzdF9hbGxvY2F0ZShrbXBfaW5mb190ICp0aGlzX3RociwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSBLTVBfU1JDX0xPQ19ERUNMKTsKK2V4dGVybiB2b2lkIF9fX2ttcF9mYXN0X2ZyZWUoa21wX2luZm9fdCAqdGhpc190aHIsIHZvaWQgKnB0ciBLTVBfU1JDX0xPQ19ERUNMKTsKK2V4dGVybiB2b2lkIF9fa21wX2ZyZWVfZmFzdF9tZW1vcnkoa21wX2luZm9fdCAqdGhpc190aHIpOworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdGlhbGl6ZV9mYXN0X21lbW9yeShrbXBfaW5mb190ICp0aGlzX3Rocik7CisjZGVmaW5lIF9fa21wX2Zhc3RfYWxsb2NhdGUodGhpc190aHIsIHNpemUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX19rbXBfZmFzdF9hbGxvY2F0ZSgodGhpc190aHIpLCAoc2l6ZSlLTVBfU1JDX0xPQ19DVVJSKQorI2RlZmluZSBfX2ttcF9mYXN0X2ZyZWUodGhpc190aHIsIHB0cikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19fa21wX2Zhc3RfZnJlZSgodGhpc190aHIpLCAocHRyKUtNUF9TUkNfTE9DX0NVUlIpCisjZW5kaWYKKworZXh0ZXJuIHZvaWQgKl9fX2ttcF90aHJlYWRfbWFsbG9jKGttcF9pbmZvX3QgKnRoLCBzaXplX3Qgc2l6ZSBLTVBfU1JDX0xPQ19ERUNMKTsKK2V4dGVybiB2b2lkICpfX19rbXBfdGhyZWFkX2NhbGxvYyhrbXBfaW5mb190ICp0aCwgc2l6ZV90IG5lbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBlbHNpemUgS01QX1NSQ19MT0NfREVDTCk7CitleHRlcm4gdm9pZCAqX19fa21wX3RocmVhZF9yZWFsbG9jKGttcF9pbmZvX3QgKnRoLCB2b2lkICpwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplIEtNUF9TUkNfTE9DX0RFQ0wpOworZXh0ZXJuIHZvaWQgX19fa21wX3RocmVhZF9mcmVlKGttcF9pbmZvX3QgKnRoLCB2b2lkICpwdHIgS01QX1NSQ19MT0NfREVDTCk7CisjZGVmaW5lIF9fa21wX3RocmVhZF9tYWxsb2ModGgsIHNpemUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX19rbXBfdGhyZWFkX21hbGxvYygodGgpLCAoc2l6ZSlLTVBfU1JDX0xPQ19DVVJSKQorI2RlZmluZSBfX2ttcF90aHJlYWRfY2FsbG9jKHRoLCBuZWxlbSwgZWxzaXplKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19fa21wX3RocmVhZF9jYWxsb2MoKHRoKSwgKG5lbGVtKSwgKGVsc2l6ZSlLTVBfU1JDX0xPQ19DVVJSKQorI2RlZmluZSBfX2ttcF90aHJlYWRfcmVhbGxvYyh0aCwgcHRyLCBzaXplKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19fa21wX3RocmVhZF9yZWFsbG9jKCh0aCksIChwdHIpLCAoc2l6ZSlLTVBfU1JDX0xPQ19DVVJSKQorI2RlZmluZSBfX2ttcF90aHJlYWRfZnJlZSh0aCwgcHRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19fa21wX3RocmVhZF9mcmVlKCh0aCksIChwdHIpS01QX1NSQ19MT0NfQ1VSUikKKworI2RlZmluZSBLTVBfSU5URVJOQUxfTUFMTE9DKHN6KSBtYWxsb2Moc3opCisjZGVmaW5lIEtNUF9JTlRFUk5BTF9GUkVFKHApIGZyZWUocCkKKyNkZWZpbmUgS01QX0lOVEVSTkFMX1JFQUxMT0MocCwgc3opIHJlYWxsb2MoKHApLCAoc3opKQorI2RlZmluZSBLTVBfSU5URVJOQUxfQ0FMTE9DKG4sIHN6KSBjYWxsb2MoKG4pLCAoc3opKQorCitleHRlcm4gdm9pZCBfX2ttcF9wdXNoX251bV90aHJlYWRzKGlkZW50X3QgKmxvYywgaW50IGd0aWQsIGludCBudW1fdGhyZWFkcyk7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorZXh0ZXJuIHZvaWQgX19rbXBfcHVzaF9wcm9jX2JpbmQoaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9wcm9jX2JpbmRfdCBwcm9jX2JpbmQpOworZXh0ZXJuIHZvaWQgX19rbXBfcHVzaF9udW1fdGVhbXMoaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwgaW50IG51bV90ZWFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fdGhyZWFkcyk7CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgX19rbXBfeWllbGQoaW50IGNvbmQpOworCitleHRlcm4gdm9pZCBfX2ttcGNfZGlzcGF0Y2hfaW5pdF80KGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwga21wX2ludDMyIGxiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgdWIsIGttcF9pbnQzMiBzdCwga21wX2ludDMyIGNodW5rKTsKK2V4dGVybiB2b2lkIF9fa21wY19kaXNwYXRjaF9pbml0XzR1KGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsIGttcF91aW50MzIgbGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDMyIHViLCBrbXBfaW50MzIgc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgY2h1bmspOworZXh0ZXJuIHZvaWQgX19rbXBjX2Rpc3BhdGNoX2luaXRfOChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsIGttcF9pbnQ2NCBsYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IHViLCBrbXBfaW50NjQgc3QsIGttcF9pbnQ2NCBjaHVuayk7CitleHRlcm4gdm9pZCBfX2ttcGNfZGlzcGF0Y2hfaW5pdF84dShpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLCBrbXBfdWludDY0IGxiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQ2NCB1Yiwga21wX2ludDY0IHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IGNodW5rKTsKKworZXh0ZXJuIGludCBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80KGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyICpwX2xhc3QsIGttcF9pbnQzMiAqcF9sYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgKnBfdWIsIGttcF9pbnQzMiAqcF9zdCk7CitleHRlcm4gaW50IF9fa21wY19kaXNwYXRjaF9uZXh0XzR1KGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiAqcF9sYXN0LCBrbXBfdWludDMyICpwX2xiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDMyICpwX3ViLCBrbXBfaW50MzIgKnBfc3QpOworZXh0ZXJuIGludCBfX2ttcGNfZGlzcGF0Y2hfbmV4dF84KGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyICpwX2xhc3QsIGttcF9pbnQ2NCAqcF9sYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgKnBfdWIsIGttcF9pbnQ2NCAqcF9zdCk7CitleHRlcm4gaW50IF9fa21wY19kaXNwYXRjaF9uZXh0Xzh1KGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiAqcF9sYXN0LCBrbXBfdWludDY0ICpwX2xiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDY0ICpwX3ViLCBrbXBfaW50NjQgKnBfc3QpOworCitleHRlcm4gdm9pZCBfX2ttcGNfZGlzcGF0Y2hfZmluaV80KGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQpOworZXh0ZXJuIHZvaWQgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfOChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkKTsKK2V4dGVybiB2b2lkIF9fa21wY19kaXNwYXRjaF9maW5pXzR1KGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQpOworZXh0ZXJuIHZvaWQgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfOHUoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKworZXh0ZXJuIHZvaWQgX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfNChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsIGttcF9pbnQzMiBsYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIHViLCBrbXBfaW50MzIgc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBjaHVuaywgaW50IHB1c2hfd3MpOworZXh0ZXJuIHZvaWQgX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfNHUoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwga21wX3VpbnQzMiBsYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50MzIgdWIsIGttcF9pbnQzMiBzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBjaHVuaywgaW50IHB1c2hfd3MpOworZXh0ZXJuIHZvaWQgX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfOChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsIGttcF9pbnQ2NCBsYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IHViLCBrbXBfaW50NjQgc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCBjaHVuaywgaW50IHB1c2hfd3MpOworZXh0ZXJuIHZvaWQgX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfOHUoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwga21wX3VpbnQ2NCBsYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgdWIsIGttcF9pbnQ2NCBzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCBjaHVuaywgaW50IHB1c2hfd3MpOworZXh0ZXJuIHZvaWQgX19rbXBfYXV4X2Rpc3BhdGNoX2ZpbmlfY2h1bmtfNChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkKTsKK2V4dGVybiB2b2lkIF9fa21wX2F1eF9kaXNwYXRjaF9maW5pX2NodW5rXzgoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua180dShpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkKTsKK2V4dGVybiB2b2lkIF9fa21wX2F1eF9kaXNwYXRjaF9maW5pX2NodW5rXzh1KGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQpOworCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX2VxXzQoa21wX3VpbnQzMiB2YWx1ZSwga21wX3VpbnQzMiBjaGVja2VyKTsKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX25lcV80KGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlcik7CitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF9sdF80KGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlcik7CitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF9nZV80KGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlcik7CitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF9sZV80KGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlcik7CitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF93YWl0X3lpZWxkXzQoa21wX3VpbnQzMiB2b2xhdGlsZSAqc3Bpbm5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDMyIGNoZWNrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiAoKnByZWQpKGttcF91aW50MzIsIGttcF91aW50MzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm9iaik7CitleHRlcm4gdm9pZCBfX2ttcF93YWl0X3lpZWxkXzRfcHRyKHZvaWQgKnNwaW5uZXIsIGttcF91aW50MzIgY2hlY2tlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiAoKnByZWQpKHZvaWQgKiwga21wX3VpbnQzMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm9iaik7CisKK2NsYXNzIGttcF9mbGFnXzMyOworY2xhc3Mga21wX2ZsYWdfNjQ7CitjbGFzcyBrbXBfZmxhZ19vbmNvcmU7CitleHRlcm4gdm9pZCBfX2ttcF93YWl0XzY0KGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfZmxhZ182NCAqZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbmFsX3NwaW4KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqaXR0X3N5bmNfb2JqCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKK2V4dGVybiB2b2lkIF9fa21wX3JlbGVhc2VfNjQoa21wX2ZsYWdfNjQgKmZsYWcpOworCitleHRlcm4gdm9pZCBfX2ttcF9pbmZpbml0ZV9sb29wKHZvaWQpOworCitleHRlcm4gdm9pZCBfX2ttcF9jbGVhbnVwKHZvaWQpOworCisjaWYgS01QX0hBTkRMRV9TSUdOQUxTCitleHRlcm4gaW50IF9fa21wX2hhbmRsZV9zaWduYWxzOworZXh0ZXJuIHZvaWQgX19rbXBfaW5zdGFsbF9zaWduYWxzKGludCBwYXJhbGxlbF9pbml0KTsKK2V4dGVybiB2b2lkIF9fa21wX3JlbW92ZV9zaWduYWxzKHZvaWQpOworI2VuZGlmCisKK2V4dGVybiB2b2lkIF9fa21wX2NsZWFyX3N5c3RlbV90aW1lKHZvaWQpOworZXh0ZXJuIHZvaWQgX19rbXBfcmVhZF9zeXN0ZW1fdGltZShkb3VibGUgKmRlbHRhKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcChrbXBfaW5mb190ICp0aHIpOworCitleHRlcm4gdm9pZCBfX2ttcF9leHBhbmRfaG9zdF9uYW1lKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOworZXh0ZXJuIHZvaWQgX19rbXBfZXhwYW5kX2ZpbGVfbmFtZShjaGFyICpyZXN1bHQsIHNpemVfdCBybGVuLCBjaGFyICpwYXR0ZXJuKTsKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKK2V4dGVybiB2b2lkCitfX2ttcF9pbml0aWFsaXplX3N5c3RlbV90aWNrKHZvaWQpOyAvKiBJbml0aWFsaXplIHRpbWVyIHRpY2sgdmFsdWUgKi8KKyNlbmRpZgorCitleHRlcm4gdm9pZAorX19rbXBfcnVudGltZV9pbml0aWFsaXplKHZvaWQpOyAvKiBtYWNoaW5lIHNwZWNpZmljIGluaXRpYWxpemF0aW9uICovCitleHRlcm4gdm9pZCBfX2ttcF9ydW50aW1lX2Rlc3Ryb3kodm9pZCk7CisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECitleHRlcm4gY2hhciAqX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhjaGFyICpidWYsIGludCBidWZfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2FmZmluX21hc2tfdCAqbWFzayk7CitleHRlcm4gdm9pZCBfX2ttcF9hZmZpbml0eV9pbml0aWFsaXplKHZvaWQpOworZXh0ZXJuIHZvaWQgX19rbXBfYWZmaW5pdHlfdW5pbml0aWFsaXplKHZvaWQpOworZXh0ZXJuIHZvaWQgX19rbXBfYWZmaW5pdHlfc2V0X2luaXRfbWFzaygKKyAgICBpbnQgZ3RpZCwgaW50IGlzYV9yb290KTsgLyogc2V0IGFmZmluaXR5IGFjY29yZGluZyB0byBLTVBfQUZGSU5JVFkgKi8KKyNpZiBPTVBfNDBfRU5BQkxFRAorZXh0ZXJuIHZvaWQgX19rbXBfYWZmaW5pdHlfc2V0X3BsYWNlKGludCBndGlkKTsKKyNlbmRpZgorZXh0ZXJuIHZvaWQgX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGUoY29uc3QgY2hhciAqZW52X3Zhcik7CitleHRlcm4gaW50IF9fa21wX2F1eF9zZXRfYWZmaW5pdHkodm9pZCAqKm1hc2spOworZXh0ZXJuIGludCBfX2ttcF9hdXhfZ2V0X2FmZmluaXR5KHZvaWQgKiptYXNrKTsKK2V4dGVybiBpbnQgX19rbXBfYXV4X2dldF9hZmZpbml0eV9tYXhfcHJvYygpOworZXh0ZXJuIGludCBfX2ttcF9hdXhfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhpbnQgcHJvYywgdm9pZCAqKm1hc2spOworZXh0ZXJuIGludCBfX2ttcF9hdXhfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKGludCBwcm9jLCB2b2lkICoqbWFzayk7CitleHRlcm4gaW50IF9fa21wX2F1eF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKGludCBwcm9jLCB2b2lkICoqbWFzayk7CitleHRlcm4gdm9pZCBfX2ttcF9iYWxhbmNlZF9hZmZpbml0eShpbnQgdGlkLCBpbnQgdGVhbV9zaXplKTsKKyNpZiBLTVBfT1NfTElOVVgKK2V4dGVybiBpbnQga21wX3NldF90aHJlYWRfYWZmaW5pdHlfbWFza19pbml0aWFsKHZvaWQpOworI2VuZGlmCisjZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworCitleHRlcm4gdm9pZCBfX2ttcF9jbGVhbnVwX2hpZXJhcmNoeSgpOworZXh0ZXJuIHZvaWQgX19rbXBfZ2V0X2hpZXJhcmNoeShrbXBfdWludDMyIG5wcm9jLCBrbXBfYnN0YXRlX3QgKnRocl9iYXIpOworCisjaWYgS01QX1VTRV9GVVRFWAorCitleHRlcm4gaW50IF9fa21wX2Z1dGV4X2RldGVybWluZV9jYXBhYmxlKHZvaWQpOworCisjZW5kaWYgLy8gS01QX1VTRV9GVVRFWAorCitleHRlcm4gdm9pZCBfX2ttcF9ndGlkX3NldF9zcGVjaWZpYyhpbnQgZ3RpZCk7CitleHRlcm4gaW50IF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKHZvaWQpOworCitleHRlcm4gZG91YmxlIF9fa21wX3JlYWRfY3B1X3RpbWUodm9pZCk7CisKK2V4dGVybiBpbnQgX19rbXBfcmVhZF9zeXN0ZW1faW5mbyhzdHJ1Y3Qga21wX3N5c19pbmZvICppbmZvKTsKKworI2lmIEtNUF9VU0VfTU9OSVRPUgorZXh0ZXJuIHZvaWQgX19rbXBfY3JlYXRlX21vbml0b3Ioa21wX2luZm9fdCAqdGgpOworI2VuZGlmCisKK2V4dGVybiB2b2lkICpfX2ttcF9sYXVuY2hfdGhyZWFkKGttcF9pbmZvX3QgKnRocik7CisKK2V4dGVybiB2b2lkIF9fa21wX2NyZWF0ZV93b3JrZXIoaW50IGd0aWQsIGttcF9pbmZvX3QgKnRoLCBzaXplX3Qgc3RhY2tfc2l6ZSk7CisKKyNpZiBLTVBfT1NfV0lORE9XUworZXh0ZXJuIGludCBfX2ttcF9zdGlsbF9ydW5uaW5nKGttcF9pbmZvX3QgKnRoKTsKK2V4dGVybiBpbnQgX19rbXBfaXNfdGhyZWFkX2FsaXZlKGttcF9pbmZvX3QgKnRoLCBEV09SRCAqZXhpdF92YWwpOworZXh0ZXJuIHZvaWQgX19rbXBfZnJlZV9oYW5kbGUoa21wX3RocmVhZF90IHRIYW5kbGUpOworI2VuZGlmCisKKyNpZiBLTVBfVVNFX01PTklUT1IKK2V4dGVybiB2b2lkIF9fa21wX3JlYXBfbW9uaXRvcihrbXBfaW5mb190ICp0aCk7CisjZW5kaWYKK2V4dGVybiB2b2lkIF9fa21wX3JlYXBfd29ya2VyKGttcF9pbmZvX3QgKnRoKTsKK2V4dGVybiB2b2lkIF9fa21wX3Rlcm1pbmF0ZV90aHJlYWQoaW50IGd0aWQpOworCitleHRlcm4gdm9pZCBfX2ttcF9zdXNwZW5kXzMyKGludCB0aF9ndGlkLCBrbXBfZmxhZ18zMiAqZmxhZyk7CitleHRlcm4gdm9pZCBfX2ttcF9zdXNwZW5kXzY0KGludCB0aF9ndGlkLCBrbXBfZmxhZ182NCAqZmxhZyk7CitleHRlcm4gdm9pZCBfX2ttcF9zdXNwZW5kX29uY29yZShpbnQgdGhfZ3RpZCwga21wX2ZsYWdfb25jb3JlICpmbGFnKTsKK2V4dGVybiB2b2lkIF9fa21wX3Jlc3VtZV8zMihpbnQgdGFyZ2V0X2d0aWQsIGttcF9mbGFnXzMyICpmbGFnKTsKK2V4dGVybiB2b2lkIF9fa21wX3Jlc3VtZV82NChpbnQgdGFyZ2V0X2d0aWQsIGttcF9mbGFnXzY0ICpmbGFnKTsKK2V4dGVybiB2b2lkIF9fa21wX3Jlc3VtZV9vbmNvcmUoaW50IHRhcmdldF9ndGlkLCBrbXBfZmxhZ19vbmNvcmUgKmZsYWcpOworCitleHRlcm4gdm9pZCBfX2ttcF9lbGFwc2VkKGRvdWJsZSAqKTsKK2V4dGVybiB2b2lkIF9fa21wX2VsYXBzZWRfdGljayhkb3VibGUgKik7CisKK2V4dGVybiB2b2lkIF9fa21wX2VuYWJsZShpbnQgb2xkX3N0YXRlKTsKK2V4dGVybiB2b2lkIF9fa21wX2Rpc2FibGUoaW50ICpvbGRfc3RhdGUpOworCitleHRlcm4gdm9pZCBfX2ttcF90aHJlYWRfc2xlZXAoaW50IG1pbGxpcyk7CisKK2V4dGVybiB2b2lkIF9fa21wX2NvbW1vbl9pbml0aWFsaXplKHZvaWQpOworZXh0ZXJuIHZvaWQgX19rbXBfY29tbW9uX2Rlc3Ryb3kodm9pZCk7CitleHRlcm4gdm9pZCBfX2ttcF9jb21tb25fZGVzdHJveV9ndGlkKGludCBndGlkKTsKKworI2lmIEtNUF9PU19VTklYCitleHRlcm4gdm9pZCBfX2ttcF9yZWdpc3Rlcl9hdGZvcmsodm9pZCk7CisjZW5kaWYKK2V4dGVybiB2b2lkIF9fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZSh2b2lkKTsKK2V4dGVybiB2b2lkIF9fa21wX3N1c3BlbmRfdW5pbml0aWFsaXplX3RocmVhZChrbXBfaW5mb190ICp0aCk7CisKK2V4dGVybiBrbXBfaW5mb190ICpfX2ttcF9hbGxvY2F0ZV90aHJlYWQoa21wX3Jvb3RfdCAqcm9vdCwga21wX3RlYW1fdCAqdGVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpZCk7CisjaWYgT01QXzQwX0VOQUJMRUQKK2V4dGVybiBrbXBfdGVhbV90ICoKK19fa21wX2FsbG9jYXRlX3RlYW0oa21wX3Jvb3RfdCAqcm9vdCwgaW50IG5ld19ucHJvYywgaW50IG1heF9ucHJvYywKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZF90IG9tcHRfcGFyYWxsZWxfaWQsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAga21wX3Byb2NfYmluZF90IHByb2NfYmluZCwga21wX2ludGVybmFsX2NvbnRyb2xfdCAqbmV3X2ljdnMsCisgICAgICAgICAgICAgICAgICAgIGludCBhcmdjIFVTRV9ORVNURURfSE9UX0FSRyhrbXBfaW5mb190ICp0aHIpKTsKKyNlbHNlCitleHRlcm4ga21wX3RlYW1fdCAqCitfX2ttcF9hbGxvY2F0ZV90ZWFtKGttcF9yb290X3QgKnJvb3QsIGludCBuZXdfbnByb2MsIGludCBtYXhfbnByb2MsCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBvbXB0X3BhcmFsbGVsX2lkLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKm5ld19pY3ZzLAorICAgICAgICAgICAgICAgICAgICBpbnQgYXJnYyBVU0VfTkVTVEVEX0hPVF9BUkcoa21wX2luZm9fdCAqdGhyKSk7CisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKK2V4dGVybiB2b2lkIF9fa21wX2ZyZWVfdGhyZWFkKGttcF9pbmZvX3QgKik7CitleHRlcm4gdm9pZCBfX2ttcF9mcmVlX3RlYW0oa21wX3Jvb3RfdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF90ZWFtX3QgKlVTRV9ORVNURURfSE9UX0FSRyhrbXBfaW5mb190ICopKTsKK2V4dGVybiBrbXBfdGVhbV90ICpfX2ttcF9yZWFwX3RlYW0oa21wX3RlYW1fdCAqKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2V4dGVybiB2b2lkIF9fa21wX2luaXRpYWxpemVfYmdldChrbXBfaW5mb190ICp0aCk7CitleHRlcm4gdm9pZCBfX2ttcF9maW5hbGl6ZV9iZ2V0KGttcF9pbmZvX3QgKnRoKTsKKworS01QX0VYUE9SVCB2b2lkICprbXBjX21hbGxvYyhzaXplX3Qgc2l6ZSk7CitLTVBfRVhQT1JUIHZvaWQgKmttcGNfYWxpZ25lZF9tYWxsb2Moc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbm1lbnQpOworS01QX0VYUE9SVCB2b2lkICprbXBjX2NhbGxvYyhzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUpOworS01QX0VYUE9SVCB2b2lkICprbXBjX3JlYWxsb2Modm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSk7CitLTVBfRVhQT1JUIHZvaWQga21wY19mcmVlKHZvaWQgKnB0cik7CisKKy8qIGRlY2xhcmF0aW9ucyBmb3IgaW50ZXJuYWwgdXNlICovCisKK2V4dGVybiBpbnQgX19rbXBfYmFycmllcihlbnVtIGJhcnJpZXJfdHlwZSBidCwgaW50IGd0aWQsIGludCBpc19zcGxpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmVkdWNlX3NpemUsIHZvaWQgKnJlZHVjZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpyZWR1Y2UpKHZvaWQgKiwgdm9pZCAqKSk7CitleHRlcm4gdm9pZCBfX2ttcF9lbmRfc3BsaXRfYmFycmllcihlbnVtIGJhcnJpZXJfdHlwZSBidCwgaW50IGd0aWQpOworCisvKiEKKyAqIFRlbGwgdGhlIGZvcmsgY2FsbCB3aGljaCBjb21waWxlciBnZW5lcmF0ZWQgdGhlIGZvcmsgY2FsbCwgYW5kIHRoZXJlZm9yZSBob3cKKyAqIHRvIGRlYWwgd2l0aCB0aGUgY2FsbC4KKyAqLworZW51bSBmb3JrX2NvbnRleHRfZSB7CisgIGZvcmtfY29udGV4dF9nbnUsIC8qKjwgQ2FsbGVkIGZyb20gR05VIGdlbmVyYXRlZCBjb2RlLCBzbyBtdXN0IG5vdCBpbnZva2UgdGhlCisgICAgICAgICAgICAgICAgICAgICAgIG1pY3JvdGFzayBpbnRlcm5hbGx5LiAqLworICBmb3JrX2NvbnRleHRfaW50ZWwsIC8qKjwgQ2FsbGVkIGZyb20gSW50ZWwgZ2VuZXJhdGVkIGNvZGUuICAqLworICBmb3JrX2NvbnRleHRfbGFzdAorfTsKK2V4dGVybiBpbnQgX19rbXBfZm9ya19jYWxsKGlkZW50X3QgKmxvYywgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGZvcmtfY29udGV4dF9lIGZvcmtfY29udGV4dCwga21wX2ludDMyIGFyZ2MsCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1bndyYXBwZWRfdGFzaywKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWljcm90YXNrX3QgbWljcm90YXNrLCBsYXVuY2hfdCBpbnZva2VyLAorLyogVE9ETzogcmV2ZXJ0IHdvcmthcm91bmQgZm9yIEludGVsKFIpIDY0IHRyYWNrZXIgIzk2ICovCisjaWYgKEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQUFSQ0g2NCkgJiYgS01QX09TX0xJTlVYCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0ICphcAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXAKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfam9pbl9jYWxsKGlkZW50X3QgKmxvYywgaW50IGd0aWQKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBmb3JrX2NvbnRleHRfZSBmb3JrX2NvbnRleHQKKyNlbmRpZgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleGl0X3RlYW1zID0gMAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfc2VyaWFsaXplZF9wYXJhbGxlbChpZGVudF90ICppZCwga21wX2ludDMyIGd0aWQpOworZXh0ZXJuIHZvaWQgX19rbXBfaW50ZXJuYWxfZm9yayhpZGVudF90ICppZCwgaW50IGd0aWQsIGttcF90ZWFtX3QgKnRlYW0pOworZXh0ZXJuIHZvaWQgX19rbXBfaW50ZXJuYWxfam9pbihpZGVudF90ICppZCwgaW50IGd0aWQsIGttcF90ZWFtX3QgKnRlYW0pOworZXh0ZXJuIGludCBfX2ttcF9pbnZva2VfdGFza19mdW5jKGludCBndGlkKTsKK2V4dGVybiB2b2lkIF9fa21wX3J1bl9iZWZvcmVfaW52b2tlZF90YXNrKGludCBndGlkLCBpbnQgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2luZm9fdCAqdGhpc190aHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdGVhbV90ICp0ZWFtKTsKK2V4dGVybiB2b2lkIF9fa21wX3J1bl9hZnRlcl9pbnZva2VkX3Rhc2soaW50IGd0aWQsIGludCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdGVhbV90ICp0ZWFtKTsKKworLy8gc2hvdWxkIG5ldmVyIGhhdmUgYmVlbiBleHBvcnRlZAorS01QX0VYUE9SVCBpbnQgX19rbXBjX2ludm9rZV90YXNrX2Z1bmMoaW50IGd0aWQpOworI2lmIE9NUF80MF9FTkFCTEVECitleHRlcm4gaW50IF9fa21wX2ludm9rZV90ZWFtc19tYXN0ZXIoaW50IGd0aWQpOworZXh0ZXJuIHZvaWQgX19rbXBfdGVhbXNfbWFzdGVyKGludCBndGlkKTsKKyNlbmRpZgorZXh0ZXJuIHZvaWQgX19rbXBfc2F2ZV9pbnRlcm5hbF9jb250cm9scyhrbXBfaW5mb190ICp0aHJlYWQpOworZXh0ZXJuIHZvaWQgX19rbXBfdXNlcl9zZXRfbGlicmFyeShlbnVtIGxpYnJhcnlfdHlwZSBhcmcpOworZXh0ZXJuIHZvaWQgX19rbXBfYXV4X3NldF9saWJyYXJ5KGVudW0gbGlicmFyeV90eXBlIGFyZyk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfc2V0X3N0YWNrc2l6ZShzaXplX3QgYXJnKTsKK2V4dGVybiB2b2lkIF9fa21wX2F1eF9zZXRfYmxvY2t0aW1lKGludCBhcmcsIGttcF9pbmZvX3QgKnRocmVhZCwgaW50IHRpZCk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfc2V0X2RlZmF1bHRzKGNoYXIgY29uc3QgKnN0ciwgaW50IGxlbik7CisKKy8qIEZ1bmN0aW9ucyBjYWxsZWQgZnJvbSBfX2ttcF9hdXhfZW52X2luaXRpYWxpemUoKSBpbiBrbXBfc2V0dGluZ3MuY3BwICovCit2b2lkIGttcGNfc2V0X2Jsb2NrdGltZShpbnQgYXJnKTsKK3ZvaWQgb21wY19zZXRfbmVzdGVkKGludCBmbGFnKTsKK3ZvaWQgb21wY19zZXRfZHluYW1pYyhpbnQgZmxhZyk7Cit2b2lkIG9tcGNfc2V0X251bV90aHJlYWRzKGludCBhcmcpOworCitleHRlcm4gdm9pZCBfX2ttcF9wdXNoX2N1cnJlbnRfdGFza190b190aHJlYWQoa21wX2luZm9fdCAqdGhpc190aHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3RlYW1fdCAqdGVhbSwgaW50IHRpZCk7CitleHRlcm4gdm9pZCBfX2ttcF9wb3BfY3VycmVudF90YXNrX2Zyb21fdGhyZWFkKGttcF9pbmZvX3QgKnRoaXNfdGhyKTsKK2V4dGVybiBrbXBfdGFza190ICpfX2ttcF90YXNrX2FsbG9jKGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3Rhc2tpbmdfZmxhZ3NfdCAqZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZW9mX2ttcF90YXNrX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZW9mX3NoYXJlZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfcm91dGluZV9lbnRyeV90IHRhc2tfZW50cnkpOworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKGlkZW50X3QgKmxvY19yZWYsIGttcF9pbmZvX3QgKnRoaXNfdGhyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF90ZWFtX3QgKnRlYW0sIGludCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNldF9jdXJyX3Rhc2spOworZXh0ZXJuIHZvaWQgX19rbXBfZmluaXNoX2ltcGxpY2l0X3Rhc2soa21wX2luZm9fdCAqdGhpc190aHIpOworZXh0ZXJuIHZvaWQgX19rbXBfZnJlZV9pbXBsaWNpdF90YXNrKGttcF9pbmZvX3QgKnRoaXNfdGhyKTsKK2ludCBfX2ttcF9leGVjdXRlX3Rhc2tzXzMyKGttcF9pbmZvX3QgKnRocmVhZCwga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfZmxhZ18zMiAqZmxhZywgaW50IGZpbmFsX3NwaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnRocmVhZF9maW5pc2hlZCwKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICppdHRfc3luY19vYmosCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGlzX2NvbnN0cmFpbmVkKTsKK2ludCBfX2ttcF9leGVjdXRlX3Rhc2tzXzY0KGttcF9pbmZvX3QgKnRocmVhZCwga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfZmxhZ182NCAqZmxhZywgaW50IGZpbmFsX3NwaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnRocmVhZF9maW5pc2hlZCwKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICppdHRfc3luY19vYmosCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGlzX2NvbnN0cmFpbmVkKTsKK2ludCBfX2ttcF9leGVjdXRlX3Rhc2tzX29uY29yZShrbXBfaW5mb190ICp0aHJlYWQsIGttcF9pbnQzMiBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9mbGFnX29uY29yZSAqZmxhZywgaW50IGZpbmFsX3NwaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp0aHJlYWRfZmluaXNoZWQsCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKml0dF9zeW5jX29iaiwKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGlzX2NvbnN0cmFpbmVkKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfZnJlZV90YXNrX3RlYW0oa21wX2luZm9fdCAqdGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0pOworZXh0ZXJuIHZvaWQgX19rbXBfcmVhcF90YXNrX3RlYW1zKHZvaWQpOworZXh0ZXJuIHZvaWQgX19rbXBfd2FpdF90b191bnJlZl90YXNrX3RlYW1zKHZvaWQpOworZXh0ZXJuIHZvaWQgX19rbXBfdGFza190ZWFtX3NldHVwKGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfdGVhbV90ICp0ZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHdheXMpOworZXh0ZXJuIHZvaWQgX19rbXBfdGFza190ZWFtX3N5bmMoa21wX2luZm9fdCAqdGhpc190aHIsIGttcF90ZWFtX3QgKnRlYW0pOworZXh0ZXJuIHZvaWQgX19rbXBfdGFza190ZWFtX3dhaXQoa21wX2luZm9fdCAqdGhpc190aHIsIGttcF90ZWFtX3QgKnRlYW0KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICppdHRfc3luY19vYmoKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2FpdCA9IDEpOworZXh0ZXJuIHZvaWQgX19rbXBfdGFza2luZ19iYXJyaWVyKGttcF90ZWFtX3QgKnRlYW0sIGttcF9pbmZvX3QgKnRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3RpZCk7CisKK2V4dGVybiBpbnQgX19rbXBfaXNfYWRkcmVzc19tYXBwZWQodm9pZCAqYWRkcik7CitleHRlcm4ga21wX3VpbnQ2NCBfX2ttcF9oYXJkd2FyZV90aW1lc3RhbXAodm9pZCk7CisKKyNpZiBLTVBfT1NfVU5JWAorZXh0ZXJuIGludCBfX2ttcF9yZWFkX2Zyb21fZmlsZShjaGFyIGNvbnN0ICpwYXRoLCBjaGFyIGNvbnN0ICpmb3JtYXQsIC4uLik7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvLworLy8gQXNzZW1ibHkgcm91dGluZXMgdGhhdCBoYXZlIG5vIGNvbXBpbGVyIGludHJpbnNpYyByZXBsYWNlbWVudAorLy8KKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworZXh0ZXJuIHZvaWQgX19rbXBfcXVlcnlfY3B1aWQoa21wX2NwdWluZm9fdCAqcCk7CisKKyNkZWZpbmUgX19rbXBfbG9hZF9teGNzcihwKSBfbW1fc2V0Y3NyKCoocCkpCitzdGF0aWMgaW5saW5lIHZvaWQgX19rbXBfc3RvcmVfbXhjc3Ioa21wX3VpbnQzMiAqcCkgeyAqcCA9IF9tbV9nZXRjc3IoKTsgfQorCitleHRlcm4gdm9pZCBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkKGttcF9pbnQxNiAqcCk7CitleHRlcm4gdm9pZCBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZChrbXBfaW50MTYgKnApOworZXh0ZXJuIHZvaWQgX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCgpOworI2RlZmluZSBLTVBfWDg2X01YQ1NSX01BU0sgMHhmZmZmZmZjMCAvKiBpZ25vcmUgc3RhdHVzIGZsYWdzICg2IGxzYikgKi8KKworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworZXh0ZXJuIGludCBfX2ttcF9pbnZva2VfbWljcm90YXNrKG1pY3JvdGFza190IHBrZm4sIGludCBndGlkLCBpbnQgbnByLCBpbnQgYXJnYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmd2W10KKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmV4aXRfZnJhbWVfcHRyCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworS01QX0VYUE9SVCB2b2lkIF9fa21wY19iZWdpbihpZGVudF90ICosIGttcF9pbnQzMiBmbGFncyk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2VuZChpZGVudF90ICopOworCitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3RocmVhZHByaXZhdGVfcmVnaXN0ZXJfdmVjKGlkZW50X3QgKiwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wY19jdG9yX3ZlYyBjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBjX2NjdG9yX3ZlYyBjY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wY19kdG9yX3ZlYyBkdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmVjdG9yX2xlbmd0aCk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3RocmVhZHByaXZhdGVfcmVnaXN0ZXIoaWRlbnRfdCAqLCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcGNfY3RvciBjdG9yLCBrbXBjX2NjdG9yIGNjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcGNfZHRvciBkdG9yKTsKK0tNUF9FWFBPUlQgdm9pZCAqX19rbXBjX3RocmVhZHByaXZhdGUoaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCitLTVBfRVhQT1JUIGttcF9pbnQzMiBfX2ttcGNfZ2xvYmFsX3RocmVhZF9udW0oaWRlbnRfdCAqKTsKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY19nbG9iYWxfbnVtX3RocmVhZHMoaWRlbnRfdCAqKTsKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY19ib3VuZF90aHJlYWRfbnVtKGlkZW50X3QgKik7CitLTVBfRVhQT1JUIGttcF9pbnQzMiBfX2ttcGNfYm91bmRfbnVtX3RocmVhZHMoaWRlbnRfdCAqKTsKKworS01QX0VYUE9SVCBrbXBfaW50MzIgX19rbXBjX29rX3RvX2ZvcmsoaWRlbnRfdCAqKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZm9ya19jYWxsKGlkZW50X3QgKiwga21wX2ludDMyIG5hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wY19taWNybyBtaWNyb3Rhc2ssIC4uLik7CisKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfc2VyaWFsaXplZF9wYXJhbGxlbChpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZW5kX3NlcmlhbGl6ZWRfcGFyYWxsZWwoaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCk7CisKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZmx1c2goaWRlbnRfdCAqKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfYmFycmllcihpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkKTsKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY19tYXN0ZXIoaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2VuZF9tYXN0ZXIoaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX29yZGVyZWQoaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2VuZF9vcmRlcmVkKGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQpOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19jcml0aWNhbChpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY3JpdGljYWxfbmFtZSAqKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZW5kX2NyaXRpY2FsKGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY3JpdGljYWxfbmFtZSAqKTsKKworI2lmIE9NUF80NV9FTkFCTEVECitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2NyaXRpY2FsX3dpdGhfaGludChpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NyaXRpY2FsX25hbWUgKiwgdWludHB0cl90IGhpbnQpOworI2VuZGlmCisKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY19iYXJyaWVyX21hc3RlcihpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZW5kX2JhcnJpZXJfbWFzdGVyKGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQpOworCitLTVBfRVhQT1JUIGttcF9pbnQzMiBfX2ttcGNfYmFycmllcl9tYXN0ZXJfbm93YWl0KGlkZW50X3QgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGdsb2JhbF90aWQpOworCitLTVBfRVhQT1JUIGttcF9pbnQzMiBfX2ttcGNfc2luZ2xlKGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQpOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19lbmRfc2luZ2xlKGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQpOworCitLTVBfRVhQT1JUIHZvaWQgS01QQ19GT1JfU1RBVElDX0lOSVQoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgc2NoZWR0eXBlLCBrbXBfaW50MzIgKnBsYXN0aXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50ICpwbG93ZXIsIGttcF9pbnQgKnB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50ICpwc3RyaWRlLCBrbXBfaW50IGluY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludCBjaHVuayk7CisKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZm9yX3N0YXRpY19maW5pKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQpOworCitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2NvcHlwcml2YXRlKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjcHlfc2l6ZSwgdm9pZCAqY3B5X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpjcHlfZnVuYykodm9pZCAqLCB2b2lkICopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgZGlkaXQpOworCitleHRlcm4gdm9pZCBLTVBDX1NFVF9OVU1fVEhSRUFEUyhpbnQgYXJnKTsKK2V4dGVybiB2b2lkIEtNUENfU0VUX0RZTkFNSUMoaW50IGZsYWcpOworZXh0ZXJuIHZvaWQgS01QQ19TRVRfTkVTVEVEKGludCBmbGFnKTsKKworLyogVGFza3EgaW50ZXJmYWNlIHJvdXRpbmVzICovCitLTVBfRVhQT1JUIGttcGNfdGh1bmtfdCAqX19rbXBjX3Rhc2txKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcGNfdGFza190IHRhc2txX3Rhc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplb2ZfdGh1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplb2Zfc2hhcmVkcywga21wX2ludDMyIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBjX3NoYXJlZF92YXJzX3QgKipzaGFyZWRzKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZW5kX3Rhc2txKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBjX3RodW5rX3QgKnRodW5rKTsKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY190YXNrKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBjX3RodW5rX3QgKnRodW5rKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfdGFza3FfdGFzayhpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcGNfdGh1bmtfdCAqdGh1bmssIGttcF9pbnQzMiBzdGF0dXMpOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19lbmRfdGFza3FfdGFzayhpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBjX3RodW5rX3QgKnRodW5rKTsKK0tNUF9FWFBPUlQga21wY190aHVua190ICpfX2ttcGNfdGFza19idWZmZXIoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wY190aHVua190ICp0YXNrcV90aHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wY190YXNrX3QgdGFzayk7CisKKy8qIE9NUCAzLjAgdGFza2luZyBpbnRlcmZhY2Ugcm91dGluZXMgKi8KK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY19vbXBfdGFzayhpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdGFza190ICpuZXdfdGFzayk7CitLTVBfRVhQT1JUIGttcF90YXNrX3QgKl9fa21wY19vbXBfdGFza19hbGxvYyhpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplb2Zfa21wX3Rhc2tfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplb2Zfc2hhcmVkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9yb3V0aW5lX2VudHJ5X3QgdGFza19lbnRyeSk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX29tcF90YXNrX2JlZ2luX2lmMChpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF90YXNrX3QgKnRhc2spOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19vbXBfdGFza19jb21wbGV0ZV9pZjAoaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdGFza190ICp0YXNrKTsKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY19vbXBfdGFza19wYXJ0cyhpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdGFza190ICpuZXdfdGFzayk7CitLTVBfRVhQT1JUIGttcF9pbnQzMiBfX2ttcGNfb21wX3Rhc2t3YWl0KGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkKTsKKworS01QX0VYUE9SVCBrbXBfaW50MzIgX19rbXBjX29tcF90YXNreWllbGQoaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW5kX3BhcnQpOworCisjaWYgVEFTS19VTlVTRUQKK3ZvaWQgX19rbXBjX29tcF90YXNrX2JlZ2luKGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICp0YXNrKTsKK3ZvaWQgX19rbXBjX29tcF90YXNrX2NvbXBsZXRlKGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3Rhc2tfdCAqdGFzayk7CisjZW5kaWYgLy8gVEFTS19VTlVTRUQKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3Rhc2tncm91cChpZGVudF90ICpsb2MsIGludCBndGlkKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZW5kX3Rhc2tncm91cChpZGVudF90ICpsb2MsIGludCBndGlkKTsKKworS01QX0VYUE9SVCBrbXBfaW50MzIgX19rbXBjX29tcF90YXNrX3dpdGhfZGVwcygKKyAgICBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqbmV3X3Rhc2ssIGttcF9pbnQzMiBuZGVwcywKKyAgICBrbXBfZGVwZW5kX2luZm9fdCAqZGVwX2xpc3QsIGttcF9pbnQzMiBuZGVwc19ub2FsaWFzLAorICAgIGttcF9kZXBlbmRfaW5mb190ICpub2FsaWFzX2RlcF9saXN0KTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfb21wX3dhaXRfZGVwcyhpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbmRlcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2RlcGVuZF9pbmZvX3QgKmRlcF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBuZGVwc19ub2FsaWFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9kZXBlbmRfaW5mb190ICpub2FsaWFzX2RlcF9saXN0KTsKK2V4dGVybiB2b2lkIF9fa21wX3JlbGVhc2VfZGVwcyhrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tkYXRhX3QgKnRhc2spOworZXh0ZXJuIHZvaWQgX19rbXBfZGVwaGFzaF9mcmVlX2VudHJpZXMoa21wX2luZm9fdCAqdGhyZWFkLCBrbXBfZGVwaGFzaF90ICpoKTsKK2V4dGVybiB2b2lkIF9fa21wX2RlcGhhc2hfZnJlZShrbXBfaW5mb190ICp0aHJlYWQsIGttcF9kZXBoYXNoX3QgKmgpOworCitleHRlcm4ga21wX2ludDMyIF9fa21wX29tcF90YXNrKGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICpuZXdfdGFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzZXJpYWxpemVfaW1tZWRpYXRlKTsKKworS01QX0VYUE9SVCBrbXBfaW50MzIgX19rbXBjX2NhbmNlbChpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGNuY2xfa2luZCk7CitLTVBfRVhQT1JUIGttcF9pbnQzMiBfX2ttcGNfY2FuY2VsbGF0aW9ucG9pbnQoaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGNuY2xfa2luZCk7CitLTVBfRVhQT1JUIGttcF9pbnQzMiBfX2ttcGNfY2FuY2VsX2JhcnJpZXIoaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQpOworS01QX0VYUE9SVCBpbnQgX19rbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMoaW50IGNhbmNlbF9raW5kKTsKKworI2lmIE9NUF80NV9FTkFCTEVECisKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfcHJveHlfdGFza19jb21wbGV0ZWQoa21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKnB0YXNrKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfcHJveHlfdGFza19jb21wbGV0ZWRfb29vKGttcF90YXNrX3QgKnB0YXNrKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfdGFza2xvb3AoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqdGFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGlmX3ZhbCwga21wX3VpbnQ2NCAqbGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgKnViLCBrbXBfaW50NjQgc3QsIGttcF9pbnQzMiBub2dyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgc2NoZWQsIGttcF91aW50NjQgZ3JhaW5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp0YXNrX2R1cCk7CisjZW5kaWYKKy8vIFRPRE86IGNoYW5nZSB0byBPTVBfNTBfRU5BQkxFRCwgbmVlZCB0byBjaGFuZ2UgYnVpbGQgdG9vbHMgZm9yIHRoaXMgdG8gd29yaworI2lmIE9NUF80NV9FTkFCTEVECitLTVBfRVhQT1JUIHZvaWQgKl9fa21wY190YXNrX3JlZHVjdGlvbl9pbml0KGludCBndGlkLCBpbnQgbnVtX2RhdGEsIHZvaWQgKmRhdGEpOworS01QX0VYUE9SVCB2b2lkICpfX2ttcGNfdGFza19yZWR1Y3Rpb25fZ2V0X3RoX2RhdGEoaW50IGd0aWQsIHZvaWQgKnRnLCB2b2lkICpkKTsKKyNlbmRpZgorCisjZW5kaWYKKworLyogTG9jayBpbnRlcmZhY2Ugcm91dGluZXMgKGZhc3QgdmVyc2lvbnMgd2l0aCBndGlkIHBhc3NlZCBpbikgKi8KK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfaW5pdF9sb2NrKGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqdXNlcl9sb2NrKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfaW5pdF9uZXN0X2xvY2soaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKnVzZXJfbG9jayk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2Rlc3Ryb3lfbG9jayhpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKnVzZXJfbG9jayk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2Rlc3Ryb3lfbmVzdF9sb2NrKGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKip1c2VyX2xvY2spOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19zZXRfbG9jayhpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfc2V0X25lc3RfbG9jayhpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKip1c2VyX2xvY2spOworS01QX0VYUE9SVCB2b2lkIF9fa21wY191bnNldF9sb2NrKGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKnVzZXJfbG9jayk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3Vuc2V0X25lc3RfbG9jayhpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKnVzZXJfbG9jayk7CitLTVBfRVhQT1JUIGludCBfX2ttcGNfdGVzdF9sb2NrKGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2spOworS01QX0VYUE9SVCBpbnQgX19rbXBjX3Rlc3RfbmVzdF9sb2NrKGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKnVzZXJfbG9jayk7CisKKyNpZiBPTVBfNDVfRU5BQkxFRAorS01QX0VYUE9SVCB2b2lkIF9fa21wY19pbml0X2xvY2tfd2l0aF9oaW50KGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKnVzZXJfbG9jaywgdWludHB0cl90IGhpbnQpOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19pbml0X25lc3RfbG9ja193aXRoX2hpbnQoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKip1c2VyX2xvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgaGludCk7CisjZW5kaWYKKworLyogSW50ZXJmYWNlIHRvIGZhc3Qgc2NhbGFibGUgcmVkdWNlIG1ldGhvZHMgcm91dGluZXMgKi8KKworS01QX0VYUE9SVCBrbXBfaW50MzIgX19rbXBjX3JlZHVjZV9ub3dhaXQoCisgICAgaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2ludDMyIG51bV92YXJzLCBzaXplX3QgcmVkdWNlX3NpemUsCisgICAgdm9pZCAqcmVkdWNlX2RhdGEsIHZvaWQgKCpyZWR1Y2VfZnVuYykodm9pZCAqbGhzX2RhdGEsIHZvaWQgKnJoc19kYXRhKSwKKyAgICBrbXBfY3JpdGljYWxfbmFtZSAqbGNrKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZW5kX3JlZHVjZV9ub3dhaXQoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NyaXRpY2FsX25hbWUgKmxjayk7CitLTVBfRVhQT1JUIGttcF9pbnQzMiBfX2ttcGNfcmVkdWNlKAorICAgIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9pbnQzMiBudW1fdmFycywgc2l6ZV90IHJlZHVjZV9zaXplLAorICAgIHZvaWQgKnJlZHVjZV9kYXRhLCB2b2lkICgqcmVkdWNlX2Z1bmMpKHZvaWQgKmxoc19kYXRhLCB2b2lkICpyaHNfZGF0YSksCisgICAga21wX2NyaXRpY2FsX25hbWUgKmxjayk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2VuZF9yZWR1Y2UoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY3JpdGljYWxfbmFtZSAqbGNrKTsKKworLyogSW50ZXJuYWwgZmFzdCByZWR1Y3Rpb24gcm91dGluZXMgKi8KKworZXh0ZXJuIFBBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QgX19rbXBfZGV0ZXJtaW5lX3JlZHVjdGlvbl9tZXRob2QoCisgICAgaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2ludDMyIG51bV92YXJzLCBzaXplX3QgcmVkdWNlX3NpemUsCisgICAgdm9pZCAqcmVkdWNlX2RhdGEsIHZvaWQgKCpyZWR1Y2VfZnVuYykodm9pZCAqbGhzX2RhdGEsIHZvaWQgKnJoc19kYXRhKSwKKyAgICBrbXBfY3JpdGljYWxfbmFtZSAqbGNrKTsKKworLy8gdGhpcyBmdW5jdGlvbiBpcyBmb3IgdGVzdGluZyBzZXQvZ2V0L2RldGVybWluZSByZWR1Y2UgbWV0aG9kCitLTVBfRVhQT1JUIGttcF9pbnQzMiBfX2ttcF9nZXRfcmVkdWNlX21ldGhvZCh2b2lkKTsKKworS01QX0VYUE9SVCBrbXBfdWludDY0IF9fa21wY19nZXRfdGFza2lkKCk7CitLTVBfRVhQT1JUIGttcF91aW50NjQgX19rbXBjX2dldF9wYXJlbnRfdGFza2lkKCk7CisKKy8vIEMrKyBwb3J0CisvLyBtaXNzaW5nICdleHRlcm4gIkMiJyBkZWNsYXJhdGlvbnMKKworS01QX0VYUE9SVCBrbXBfaW50MzIgX19rbXBjX2luX3BhcmFsbGVsKGlkZW50X3QgKmxvYyk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3BvcF9udW1fdGhyZWFkcyhpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfcHVzaF9udW1fdGhyZWFkcyhpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBudW1fdGhyZWFkcyk7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorS01QX0VYUE9SVCB2b2lkIF9fa21wY19wdXNoX3Byb2NfYmluZChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJvY19iaW5kKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfcHVzaF9udW1fdGVhbXMoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIG51bV90ZWFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIG51bV90aHJlYWRzKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZm9ya190ZWFtcyhpZGVudF90ICpsb2MsIGttcF9pbnQzMiBhcmdjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcGNfbWljcm8gbWljcm90YXNrLCAuLi4pOworI2VuZGlmCisjaWYgT01QXzQ1X0VOQUJMRUQKK3N0cnVjdCBrbXBfZGltIHsgLy8gbG9vcCBib3VuZHMgaW5mbyBjYXN0ZWQgdG8ga21wX2ludDY0CisgIGttcF9pbnQ2NCBsbzsgLy8gbG93ZXIKKyAga21wX2ludDY0IHVwOyAvLyB1cHBlcgorICBrbXBfaW50NjQgc3Q7IC8vIHN0cmlkZQorfTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZG9hY3Jvc3NfaW5pdChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBudW1fZGltcywgc3RydWN0IGttcF9kaW0gKmRpbXMpOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19kb2Fjcm9zc193YWl0KGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0ICp2ZWMpOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19kb2Fjcm9zc19wb3N0KGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0ICp2ZWMpOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19kb2Fjcm9zc19maW5pKGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQpOworI2VuZGlmCisKK0tNUF9FWFBPUlQgdm9pZCAqX19rbXBjX3RocmVhZHByaXZhdGVfY2FjaGVkKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKioqY2FjaGUpOworCisvLyBTeW1ib2xzIGZvciBNUyBtdXR1YWwgZGV0ZWN0aW9uLgorZXh0ZXJuIGludCBfWW91X211c3RfbGlua193aXRoX2V4YWN0bHlfb25lX09wZW5NUF9saWJyYXJ5OworZXh0ZXJuIGludCBfWW91X211c3RfbGlua193aXRoX0ludGVsX09wZW5NUF9saWJyYXJ5OworI2lmIEtNUF9PU19XSU5ET1dTICYmIChLTVBfVkVSU0lPTl9NQUpPUiA+IDQpCitleHRlcm4gaW50IF9Zb3VfbXVzdF9saW5rX3dpdGhfTWljcm9zb2Z0X09wZW5NUF9saWJyYXJ5OworI2VuZGlmCisKKy8vIFRoZSByb3V0aW5lcyBiZWxvdyBhcmUgbm90IGV4cG9ydGVkLgorLy8gQ29uc2lkZXIgbWFraW5nIHRoZW0gJ3N0YXRpYycgaW4gY29ycmVzcG9uZGluZyBzb3VyY2UgZmlsZXMuCit2b2lkIGttcF90aHJlYWRwcml2YXRlX2luc2VydF9wcml2YXRlX2RhdGEoaW50IGd0aWQsIHZvaWQgKnBjX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YV9hZGRyLCBzaXplX3QgcGNfc2l6ZSk7CitzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gKmttcF90aHJlYWRwcml2YXRlX2luc2VydChpbnQgZ3RpZCwgdm9pZCAqcGNfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGFfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwY19zaXplKTsKKworLy8gb21wY18sIGttcGNfIGVudHJpZXMgbW92ZWQgZnJvbSBvbXAuaC4KKyNpZiBLTVBfT1NfV0lORE9XUworI2RlZmluZSBLTVBDX0NPTlZFTlRJT04gX19jZGVjbAorI2Vsc2UKKyNkZWZpbmUgS01QQ19DT05WRU5USU9OCisjZW5kaWYKKworI2lmbmRlZiBfX09NUF9ICit0eXBlZGVmIGVudW0gb21wX3NjaGVkX3QgeworICBvbXBfc2NoZWRfc3RhdGljID0gMSwKKyAgb21wX3NjaGVkX2R5bmFtaWMgPSAyLAorICBvbXBfc2NoZWRfZ3VpZGVkID0gMywKKyAgb21wX3NjaGVkX2F1dG8gPSA0Cit9IG9tcF9zY2hlZF90OwordHlwZWRlZiB2b2lkICprbXBfYWZmaW5pdHlfbWFza190OworI2VuZGlmCisKK0tNUF9FWFBPUlQgdm9pZCBLTVBDX0NPTlZFTlRJT04gb21wY19zZXRfbWF4X2FjdGl2ZV9sZXZlbHMoaW50KTsKK0tNUF9FWFBPUlQgdm9pZCBLTVBDX0NPTlZFTlRJT04gb21wY19zZXRfc2NoZWR1bGUob21wX3NjaGVkX3QsIGludCk7CitLTVBfRVhQT1JUIGludCBLTVBDX0NPTlZFTlRJT04gb21wY19nZXRfYW5jZXN0b3JfdGhyZWFkX251bShpbnQpOworS01QX0VYUE9SVCBpbnQgS01QQ19DT05WRU5USU9OIG9tcGNfZ2V0X3RlYW1fc2l6ZShpbnQpOworS01QX0VYUE9SVCBpbnQgS01QQ19DT05WRU5USU9OCitrbXBjX3NldF9hZmZpbml0eV9tYXNrX3Byb2MoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworS01QX0VYUE9SVCBpbnQgS01QQ19DT05WRU5USU9OCitrbXBjX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CitLTVBfRVhQT1JUIGludCBLTVBDX0NPTlZFTlRJT04KK2ttcGNfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisKK0tNUF9FWFBPUlQgdm9pZCBLTVBDX0NPTlZFTlRJT04ga21wY19zZXRfc3RhY2tzaXplKGludCk7CitLTVBfRVhQT1JUIHZvaWQgS01QQ19DT05WRU5USU9OIGttcGNfc2V0X3N0YWNrc2l6ZV9zKHNpemVfdCk7CitLTVBfRVhQT1JUIHZvaWQgS01QQ19DT05WRU5USU9OIGttcGNfc2V0X2xpYnJhcnkoaW50KTsKK0tNUF9FWFBPUlQgdm9pZCBLTVBDX0NPTlZFTlRJT04ga21wY19zZXRfZGVmYXVsdHMoY2hhciBjb25zdCAqKTsKK0tNUF9FWFBPUlQgdm9pZCBLTVBDX0NPTlZFTlRJT04ga21wY19zZXRfZGlzcF9udW1fYnVmZmVycyhpbnQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogS01QX0ggKi8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9hZmZpbml0eS5jcHAgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfYWZmaW5pdHkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMzY4ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfYWZmaW5pdHkuY3BwCkBAIC0wLDAgKzEsNTAzNiBAQAorLyoKKyAqIGttcF9hZmZpbml0eS5jcHAgLS0gYWZmaW5pdHkgbWFuYWdlbWVudAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2FmZmluaXR5LmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisjaW5jbHVkZSAia21wX3dyYXBwZXJfZ2V0cGlkLmgiCisKKy8vIFN0b3JlIHRoZSByZWFsIG9yIGltYWdpbmVkIG1hY2hpbmUgaGllcmFyY2h5IGhlcmUKK3N0YXRpYyBoaWVyYXJjaHlfaW5mbyBtYWNoaW5lX2hpZXJhcmNoeTsKKwordm9pZCBfX2ttcF9jbGVhbnVwX2hpZXJhcmNoeSgpIHsgbWFjaGluZV9oaWVyYXJjaHkuZmluaSgpOyB9CisKKwordm9pZCBfX2ttcF9nZXRfaGllcmFyY2h5KGttcF91aW50MzIgbnByb2MsIGttcF9ic3RhdGVfdCAqdGhyX2JhcikgeworICBrbXBfdWludDMyIGRlcHRoOworICAvLyBUaGUgdGVzdCBiZWxvdyBpcyB0cnVlIGlmIGFmZmluaXR5IGlzIGF2YWlsYWJsZSwgYnV0IHNldCB0byAibm9uZSIuIE5lZWQgdG8KKyAgLy8gaW5pdCBvbiBmaXJzdCB1c2Ugb2YgaGllcmFyY2hpY2FsIGJhcnJpZXIuCisgIGlmIChUQ1JfMShtYWNoaW5lX2hpZXJhcmNoeS51bmluaXRpYWxpemVkKSkKKyAgICBtYWNoaW5lX2hpZXJhcmNoeS5pbml0KE5VTEwsIG5wcm9jKTsKKworICAvLyBBZGp1c3QgdGhlIGhpZXJhcmNoeSBpbiBjYXNlIG51bSB0aHJlYWRzIGV4Y2VlZHMgb3JpZ2luYWwKKyAgaWYgKG5wcm9jID4gbWFjaGluZV9oaWVyYXJjaHkuYmFzZV9udW1fdGhyZWFkcykKKyAgICBtYWNoaW5lX2hpZXJhcmNoeS5yZXNpemUobnByb2MpOworCisgIGRlcHRoID0gbWFjaGluZV9oaWVyYXJjaHkuZGVwdGg7CisgIEtNUF9ERUJVR19BU1NFUlQoZGVwdGggPiAwKTsKKworICB0aHJfYmFyLT5kZXB0aCA9IGRlcHRoOworICB0aHJfYmFyLT5iYXNlX2xlYWZfa2lkcyA9IChrbXBfdWludDgpbWFjaGluZV9oaWVyYXJjaHkubnVtUGVyTGV2ZWxbMF0gLSAxOworICB0aHJfYmFyLT5za2lwX3Blcl9sZXZlbCA9IG1hY2hpbmVfaGllcmFyY2h5LnNraXBQZXJMZXZlbDsKK30KKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKworYm9vbCBLTVBBZmZpbml0eTo6cGlja2VkX2FwaSA9IGZhbHNlOworCit2b2lkICpLTVBBZmZpbml0eTo6TWFzazo6b3BlcmF0b3IgbmV3KHNpemVfdCBuKSB7IHJldHVybiBfX2ttcF9hbGxvY2F0ZShuKTsgfQordm9pZCAqS01QQWZmaW5pdHk6Ok1hc2s6Om9wZXJhdG9yIG5ld1tdKHNpemVfdCBuKSB7IHJldHVybiBfX2ttcF9hbGxvY2F0ZShuKTsgfQordm9pZCBLTVBBZmZpbml0eTo6TWFzazo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKnApIHsgX19rbXBfZnJlZShwKTsgfQordm9pZCBLTVBBZmZpbml0eTo6TWFzazo6b3BlcmF0b3IgZGVsZXRlW10odm9pZCAqcCkgeyBfX2ttcF9mcmVlKHApOyB9Cit2b2lkICpLTVBBZmZpbml0eTo6b3BlcmF0b3IgbmV3KHNpemVfdCBuKSB7IHJldHVybiBfX2ttcF9hbGxvY2F0ZShuKTsgfQordm9pZCBLTVBBZmZpbml0eTo6b3BlcmF0b3IgZGVsZXRlKHZvaWQgKnApIHsgX19rbXBfZnJlZShwKTsgfQorCit2b2lkIEtNUEFmZmluaXR5OjpwaWNrX2FwaSgpIHsKKyAgS01QQWZmaW5pdHkgKmFmZmluaXR5X2Rpc3BhdGNoOworICBpZiAocGlja2VkX2FwaSkKKyAgICByZXR1cm47CisjaWYgS01QX1VTRV9IV0xPQworICAvLyBPbmx5IHVzZSBId2xvYyBpZiBhZmZpbml0eSBpc24ndCBleHBsaWNpdGx5IGRpc2FibGVkIGFuZAorICAvLyB1c2VyIHJlcXVlc3RzIEh3bG9jIHRvcG9sb2d5IG1ldGhvZAorICBpZiAoX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX2h3bG9jICYmCisgICAgICBfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2Rpc2FibGVkKSB7CisgICAgYWZmaW5pdHlfZGlzcGF0Y2ggPSBuZXcgS01QSHdsb2NBZmZpbml0eSgpOworICB9IGVsc2UKKyNlbmRpZgorICB7CisgICAgYWZmaW5pdHlfZGlzcGF0Y2ggPSBuZXcgS01QTmF0aXZlQWZmaW5pdHkoKTsKKyAgfQorICBfX2ttcF9hZmZpbml0eV9kaXNwYXRjaCA9IGFmZmluaXR5X2Rpc3BhdGNoOworICBwaWNrZWRfYXBpID0gdHJ1ZTsKK30KKwordm9pZCBLTVBBZmZpbml0eTo6ZGVzdHJveV9hcGkoKSB7CisgIGlmIChfX2ttcF9hZmZpbml0eV9kaXNwYXRjaCAhPSBOVUxMKSB7CisgICAgZGVsZXRlIF9fa21wX2FmZmluaXR5X2Rpc3BhdGNoOworICAgIF9fa21wX2FmZmluaXR5X2Rpc3BhdGNoID0gTlVMTDsKKyAgICBwaWNrZWRfYXBpID0gZmFsc2U7CisgIH0KK30KKworLy8gUHJpbnQgdGhlIGFmZmluaXR5IG1hc2sgdG8gdGhlIGNoYXJhY3RlciBhcnJheSBpbiBhIHByZXR0eSBmb3JtYXQuCitjaGFyICpfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGNoYXIgKmJ1ZiwgaW50IGJ1Zl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgKm1hc2spIHsKKyAgS01QX0FTU0VSVChidWZfbGVuID49IDQwKTsKKyAgY2hhciAqc2NhbiA9IGJ1ZjsKKyAgY2hhciAqZW5kID0gYnVmICsgYnVmX2xlbiAtIDE7CisKKyAgLy8gRmluZCBmaXJzdCBlbGVtZW50IC8gY2hlY2sgZm9yIGVtcHR5IHNldC4KKyAgc2l6ZV90IGk7CisgIGkgPSBtYXNrLT5iZWdpbigpOworICBpZiAoaSA9PSBtYXNrLT5lbmQoKSkgeworICAgIEtNUF9TTlBSSU5URihzY2FuLCBlbmQgLSBzY2FuICsgMSwgIns8ZW1wdHk+fSIpOworICAgIHdoaWxlICgqc2NhbiAhPSAnXDAnKQorICAgICAgc2NhbisrOworICAgIEtNUF9BU1NFUlQoc2NhbiA8PSBlbmQpOworICAgIHJldHVybiBidWY7CisgIH0KKworICBLTVBfU05QUklOVEYoc2NhbiwgZW5kIC0gc2NhbiArIDEsICJ7JWxkIiwgKGxvbmcpaSk7CisgIHdoaWxlICgqc2NhbiAhPSAnXDAnKQorICAgIHNjYW4rKzsKKyAgaSsrOworICBmb3IgKDsgaSAhPSBtYXNrLT5lbmQoKTsgaSA9IG1hc2stPm5leHQoaSkpIHsKKyAgICBpZiAoIUtNUF9DUFVfSVNTRVQoaSwgbWFzaykpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIENoZWNrIGZvciBidWZmZXIgb3ZlcmZsb3cuICBBIHN0cmluZyBvZiB0aGUgZm9ybSAiLDxuPiIgd2lsbCBoYXZlIGF0IG1vc3QKKyAgICAvLyAxMCBjaGFyYWN0ZXJzLCBwbHVzIHdlIHdhbnQgdG8gbGVhdmUgcm9vbSB0byBwcmludCAiLC4uLn0iIGlmIHRoZSBzZXQgaXMKKyAgICAvLyB0b28gbGFyZ2UgdG8gcHJpbnQgZm9yIGEgdG90YWwgb2YgMTUgY2hhcmFjdGVycy4gV2UgYWxyZWFkeSBsZWZ0IHJvb20gZm9yCisgICAgLy8gJ1wwJyBpbiBzZXR0aW5nIGVuZC4KKyAgICBpZiAoZW5kIC0gc2NhbiA8IDE1KSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgS01QX1NOUFJJTlRGKHNjYW4sIGVuZCAtIHNjYW4gKyAxLCAiLCUtbGQiLCAobG9uZylpKTsKKyAgICB3aGlsZSAoKnNjYW4gIT0gJ1wwJykKKyAgICAgIHNjYW4rKzsKKyAgfQorICBpZiAoaSAhPSBtYXNrLT5lbmQoKSkgeworICAgIEtNUF9TTlBSSU5URihzY2FuLCBlbmQgLSBzY2FuICsgMSwgIiwuLi4iKTsKKyAgICB3aGlsZSAoKnNjYW4gIT0gJ1wwJykKKyAgICAgIHNjYW4rKzsKKyAgfQorICBLTVBfU05QUklOVEYoc2NhbiwgZW5kIC0gc2NhbiArIDEsICJ9Iik7CisgIHdoaWxlICgqc2NhbiAhPSAnXDAnKQorICAgIHNjYW4rKzsKKyAgS01QX0FTU0VSVChzY2FuIDw9IGVuZCk7CisgIHJldHVybiBidWY7Cit9CisKK3ZvaWQgX19rbXBfYWZmaW5pdHlfZW50aXJlX21hY2hpbmVfbWFzayhrbXBfYWZmaW5fbWFza190ICptYXNrKSB7CisgIEtNUF9DUFVfWkVSTyhtYXNrKTsKKworI2lmIEtNUF9HUk9VUF9BRkZJTklUWQorCisgIGlmIChfX2ttcF9udW1fcHJvY19ncm91cHMgPiAxKSB7CisgICAgaW50IGdyb3VwOworICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnQgIT0gTlVMTCk7CisgICAgZm9yIChncm91cCA9IDA7IGdyb3VwIDwgX19rbXBfbnVtX3Byb2NfZ3JvdXBzOyBncm91cCsrKSB7CisgICAgICBpbnQgaTsKKyAgICAgIGludCBudW0gPSBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudChncm91cCk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKyAgICAgICAgS01QX0NQVV9TRVQoaSArIGdyb3VwICogKENIQVJfQklUICogc2l6ZW9mKERXT1JEX1BUUikpLCBtYXNrKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZQorCisjZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisKKyAgeworICAgIGludCBwcm9jOworICAgIGZvciAocHJvYyA9IDA7IHByb2MgPCBfX2ttcF94cHJvYzsgcHJvYysrKSB7CisgICAgICBLTVBfQ1BVX1NFVChwcm9jLCBtYXNrKTsKKyAgICB9CisgIH0KK30KKworLy8gV2hlbiBzb3J0aW5nIGJ5IGxhYmVscywgX19rbXBfYWZmaW5pdHlfYXNzaWduX2NoaWxkX251bXMoKSBtdXN0IGZpcnN0IGJlCisvLyBjYWxsZWQgdG8gcmVudW1iZXIgdGhlIGxhYmVscyBmcm9tIFswLi5uXSBhbmQgcGxhY2UgdGhlbSBpbnRvIHRoZSBjaGlsZF9udW0KKy8vIHZlY3RvciBvZiB0aGUgYWRkcmVzcyBvYmplY3QuICBUaGlzIGlzIGRvbmUgaW4gY2FzZSB0aGUgbGFiZWxzIHVzZWQgZm9yCisvLyB0aGUgY2hpbGRyZW4gYXQgb25lIG5vZGUgb2YgdGhlIGhpZXJhcmNoeSBkaWZmZXIgZnJvbSB0aG9zZSB1c2VkIGZvcgorLy8gYW5vdGhlciBub2RlIGF0IHRoZSBzYW1lIGxldmVsLiAgRXhhbXBsZTogIHN1cHBvc2UgdGhlIG1hY2hpbmUgaGFzIDIgbm9kZXMKKy8vIHdpdGggMiBwYWNrYWdlcyBlYWNoLiAgVGhlIGZpcnN0IG5vZGUgY29udGFpbnMgcGFja2FnZXMgNjAxIGFuZCA2MDIsIGFuZAorLy8gc2Vjb25kIG5vZGUgY29udGFpbnMgcGFja2FnZXMgNjAzIGFuZCA2MDQuICBJZiB3ZSB0cnkgdG8gc29ydCB0aGUgdGFibGUKKy8vIGZvciAic2NhdHRlciIgYWZmaW5pdHksIHRoZSB0YWJsZSB3aWxsIHN0aWxsIGJlIHNvcnRlZCA2MDEsIDYwMiwgNjAzLCA2MDQKKy8vIGJlY2F1c2Ugd2UgYXJlIHBheWluZyBhdHRlbnRpb24gdG8gdGhlIGxhYmVscyB0aGVtc2VsdmVzLCBub3QgdGhlIG9yZGluYWwKKy8vIGNoaWxkIG51bWJlcnMuICBCeSB1c2luZyB0aGUgY2hpbGQgbnVtYmVycyBpbiB0aGUgc29ydCwgdGhlIHJlc3VsdCBpcworLy8gezAsMH09NjAxLCB7MCwxfT02MDMsIHsxLDB9PTYwMiwgezEsMX09NjA0Lgorc3RhdGljIHZvaWQgX19rbXBfYWZmaW5pdHlfYXNzaWduX2NoaWxkX251bXMoQWRkclVuc1BhaXIgKmFkZHJlc3Myb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtQWRkcnMpIHsKKyAgS01QX0RFQlVHX0FTU0VSVChudW1BZGRycyA+IDApOworICBpbnQgZGVwdGggPSBhZGRyZXNzMm9zLT5maXJzdC5kZXB0aDsKKyAgdW5zaWduZWQgKmNvdW50cyA9ICh1bnNpZ25lZCAqKV9fa21wX2FsbG9jYXRlKGRlcHRoICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgIHVuc2lnbmVkICpsYXN0TGFiZWwgPSAodW5zaWduZWQgKilfX2ttcF9hbGxvY2F0ZShkZXB0aCAqIHNpemVvZih1bnNpZ25lZCkpOworICBpbnQgbGFiQ3Q7CisgIGZvciAobGFiQ3QgPSAwOyBsYWJDdCA8IGRlcHRoOyBsYWJDdCsrKSB7CisgICAgYWRkcmVzczJvc1swXS5maXJzdC5jaGlsZE51bXNbbGFiQ3RdID0gY291bnRzW2xhYkN0XSA9IDA7CisgICAgbGFzdExhYmVsW2xhYkN0XSA9IGFkZHJlc3Myb3NbMF0uZmlyc3QubGFiZWxzW2xhYkN0XTsKKyAgfQorICBpbnQgaTsKKyAgZm9yIChpID0gMTsgaSA8IG51bUFkZHJzOyBpKyspIHsKKyAgICBmb3IgKGxhYkN0ID0gMDsgbGFiQ3QgPCBkZXB0aDsgbGFiQ3QrKykgeworICAgICAgaWYgKGFkZHJlc3Myb3NbaV0uZmlyc3QubGFiZWxzW2xhYkN0XSAhPSBsYXN0TGFiZWxbbGFiQ3RdKSB7CisgICAgICAgIGludCBsYWJDdDI7CisgICAgICAgIGZvciAobGFiQ3QyID0gbGFiQ3QgKyAxOyBsYWJDdDIgPCBkZXB0aDsgbGFiQ3QyKyspIHsKKyAgICAgICAgICBjb3VudHNbbGFiQ3QyXSA9IDA7CisgICAgICAgICAgbGFzdExhYmVsW2xhYkN0Ml0gPSBhZGRyZXNzMm9zW2ldLmZpcnN0LmxhYmVsc1tsYWJDdDJdOworICAgICAgICB9CisgICAgICAgIGNvdW50c1tsYWJDdF0rKzsKKyAgICAgICAgbGFzdExhYmVsW2xhYkN0XSA9IGFkZHJlc3Myb3NbaV0uZmlyc3QubGFiZWxzW2xhYkN0XTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGZvciAobGFiQ3QgPSAwOyBsYWJDdCA8IGRlcHRoOyBsYWJDdCsrKSB7CisgICAgICBhZGRyZXNzMm9zW2ldLmZpcnN0LmNoaWxkTnVtc1tsYWJDdF0gPSBjb3VudHNbbGFiQ3RdOworICAgIH0KKyAgICBmb3IgKDsgbGFiQ3QgPCAoaW50KUFkZHJlc3M6Om1heERlcHRoOyBsYWJDdCsrKSB7CisgICAgICBhZGRyZXNzMm9zW2ldLmZpcnN0LmNoaWxkTnVtc1tsYWJDdF0gPSAwOworICAgIH0KKyAgfQorICBfX2ttcF9mcmVlKGxhc3RMYWJlbCk7CisgIF9fa21wX2ZyZWUoY291bnRzKTsKK30KKworLy8gQWxsIG9mIHRoZSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfKl9tYXAoKSByb3V0aW5lcyBzaG91bGQgc2V0CisvLyBfX2ttcF9hZmZpbml0eV9tYXNrcyB0byBhIHZlY3RvciBvZiBhZmZpbml0eSBtYXNrIG9iamVjdHMgb2YgbGVuZ3RoCisvLyBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MsIGlmIF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSwgYW5kIHJldHVybgorLy8gdGhlIG51bWJlciBvZiBsZXZlbHMgaW4gdGhlIG1hY2hpbmUgdG9wb2xvZ3kgdHJlZSAoemVybyBpZgorLy8gX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKS4KKy8vCisvLyBBbGwgb2YgdGhlIF9fa21wX2FmZmluaXR5X2NyZWF0ZV8qX21hcCgpIHJvdXRpbmVzIHNob3VsZCBzZXQKKy8vICpfX2ttcF9hZmZpbl9mdWxsTWFzayB0byB0aGUgYWZmaW5pdHkgbWFzayBmb3IgdGhlIGluaXRpYWxpemF0aW9uIHRocmVhZC4KKy8vIFRoZXkgbmVlZCB0byBzYXZlIGFuZCByZXN0b3JlIHRoZSBtYXNrLCBhbmQgaXQgY291bGQgYmUgbmVlZGVkIGxhdGVyLCBzbworLy8gc2F2aW5nIGl0IGlzIGp1c3QgYW4gb3B0aW1pemF0aW9uIHRvIGF2b2lkIGNhbGxpbmcga21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoKQorLy8gYWdhaW4uCitrbXBfYWZmaW5fbWFza190ICpfX2ttcF9hZmZpbl9mdWxsTWFzayA9IE5VTEw7CisKK3N0YXRpYyBpbnQgbkNvcmVzUGVyUGtnLCBuUGFja2FnZXM7CitzdGF0aWMgaW50IF9fa21wX25UaHJlYWRzUGVyQ29yZTsKKyNpZm5kZWYgS01QX0RGTFRfTlRIX0NPUkVTCitzdGF0aWMgaW50IF9fa21wX25jb3JlczsKKyNlbmRpZgorc3RhdGljIGludCAqX19rbXBfcHVfb3NfaWR4ID0gTlVMTDsKKworLy8gX19rbXBfYWZmaW5pdHlfdW5pZm9ybV90b3BvbG9neSgpIGRvZXNuJ3Qgd29yayB3aGVuIGNhbGxlZCBmcm9tCisvLyBwbGFjZXMgd2hpY2ggc3VwcG9ydCBhcmJpdHJhcmlseSBtYW55IGxldmVscyBpbiB0aGUgbWFjaGluZSB0b3BvbG9neQorLy8gbWFwLCBpLmUuIHRoZSBub24tZGVmYXVsdCBjYXNlcyBpbiBfX2ttcF9hZmZpbml0eV9jcmVhdGVfY3B1aW5mb19tYXAoKQorLy8gX19rbXBfYWZmaW5pdHlfY3JlYXRlX3gyYXBpY2lkX21hcCgpLgoraW5saW5lIHN0YXRpYyBib29sIF9fa21wX2FmZmluaXR5X3VuaWZvcm1fdG9wb2xvZ3koKSB7CisgIHJldHVybiBfX2ttcF9hdmFpbF9wcm9jID09IChfX2ttcF9uVGhyZWFkc1BlckNvcmUgKiBuQ29yZXNQZXJQa2cgKiBuUGFja2FnZXMpOworfQorCisvLyBQcmludCBvdXQgdGhlIGRldGFpbGVkIG1hY2hpbmUgdG9wb2xvZ3kgbWFwLCBpLmUuIHRoZSBwaHlzaWNhbCBsb2NhdGlvbnMKKy8vIG9mIGVhY2ggT1MgcHJvYy4KK3N0YXRpYyB2b2lkIF9fa21wX2FmZmluaXR5X3ByaW50X3RvcG9sb2d5KEFkZHJVbnNQYWlyICphZGRyZXNzMm9zLCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlcHRoLCBpbnQgcGtnTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29yZUxldmVsLCBpbnQgdGhyZWFkTGV2ZWwpIHsKKyAgaW50IHByb2M7CisKKyAgS01QX0lORk9STShPU1Byb2NUb1BoeXNpY2FsVGhyZWFkTWFwLCAiS01QX0FGRklOSVRZIik7CisgIGZvciAocHJvYyA9IDA7IHByb2MgPCBsZW47IHByb2MrKykgeworICAgIGludCBsZXZlbDsKKyAgICBrbXBfc3RyX2J1Zl90IGJ1ZjsKKyAgICBfX2ttcF9zdHJfYnVmX2luaXQoJmJ1Zik7CisgICAgZm9yIChsZXZlbCA9IDA7IGxldmVsIDwgZGVwdGg7IGxldmVsKyspIHsKKyAgICAgIGlmIChsZXZlbCA9PSB0aHJlYWRMZXZlbCkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIlcyAiLCBLTVBfSTE4Tl9TVFIoVGhyZWFkKSk7CisgICAgICB9IGVsc2UgaWYgKGxldmVsID09IGNvcmVMZXZlbCkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIlcyAiLCBLTVBfSTE4Tl9TVFIoQ29yZSkpOworICAgICAgfSBlbHNlIGlmIChsZXZlbCA9PSBwa2dMZXZlbCkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIlcyAiLCBLTVBfSTE4Tl9TVFIoUGFja2FnZSkpOworICAgICAgfSBlbHNlIGlmIChsZXZlbCA+IHBrZ0xldmVsKSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIiVzXyVkICIsIEtNUF9JMThOX1NUUihOb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCAtIHBrZ0xldmVsIC0gMSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICJMJWQgIiwgbGV2ZWwpOworICAgICAgfQorICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJWQgIiwgYWRkcmVzczJvc1twcm9jXS5maXJzdC5sYWJlbHNbbGV2ZWxdKTsKKyAgICB9CisgICAgS01QX0lORk9STShPU1Byb2NNYXBUb1BhY2ssICJLTVBfQUZGSU5JVFkiLCBhZGRyZXNzMm9zW3Byb2NdLnNlY29uZCwKKyAgICAgICAgICAgICAgIGJ1Zi5zdHIpOworICAgIF9fa21wX3N0cl9idWZfZnJlZSgmYnVmKTsKKyAgfQorfQorCisjaWYgS01QX1VTRV9IV0xPQworCisvLyBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgdGhlIHRvcG9sb2d5IGxldmVscyB0aGF0IGFyZSByYWRpeCAxIGFuZCBkb24ndCBvZmZlcgorLy8gZnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdG9wb2xvZ3kuICBUaGUgbW9zdCBjb21tb24gZXhhbXBsZSBpcyB3aGVuIHlvdQorLy8gaGF2ZSBvbmUgdGhyZWFkIGNvbnRleHQgcGVyIGNvcmUsIHdlIGRvbid0IHdhbnQgdGhlIGV4dHJhIHRocmVhZCBjb250ZXh0CisvLyBsZXZlbCBpZiBpdCBvZmZlcnMgbm8gdW5pcXVlIGxhYmVscy4gIFNvIHRoZXkgYXJlIHJlbW92ZWQuCisvLyByZXR1cm4gdmFsdWU6IHRoZSBuZXcgZGVwdGggb2YgYWRkcmVzczJvcworc3RhdGljIGludCBfX2ttcF9hZmZpbml0eV9yZW1vdmVfcmFkaXhfb25lX2xldmVscyhBZGRyVW5zUGFpciAqYWRkcmVzczJvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5BY3RpdmVUaHJlYWRzLCBpbnQgZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcGtnTGV2ZWwsIGludCAqY29yZUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnRocmVhZExldmVsKSB7CisgIGludCBsZXZlbDsKKyAgaW50IGk7CisgIGludCByYWRpeDFfZGV0ZWN0ZWQ7CisKKyAgZm9yIChsZXZlbCA9IGRlcHRoIC0gMTsgbGV2ZWwgPj0gMDsgLS1sZXZlbCkgeworICAgIC8vIEFsd2F5cyBrZWVwIHRoZSBwYWNrYWdlIGxldmVsCisgICAgaWYgKGxldmVsID09ICpwa2dMZXZlbCkKKyAgICAgIGNvbnRpbnVlOworICAgIC8vIERldGVjdCBpZiB0aGlzIGxldmVsIGlzIHJhZGl4IDEKKyAgICByYWRpeDFfZGV0ZWN0ZWQgPSAxOworICAgIGZvciAoaSA9IDE7IGkgPCBuQWN0aXZlVGhyZWFkczsgKytpKSB7CisgICAgICBpZiAoYWRkcmVzczJvc1swXS5maXJzdC5sYWJlbHNbbGV2ZWxdICE9CisgICAgICAgICAgYWRkcmVzczJvc1tpXS5maXJzdC5sYWJlbHNbbGV2ZWxdKSB7CisgICAgICAgIC8vIFRoZXJlIGFyZSBkaWZmZXJpbmcgbGFiZWwgdmFsdWVzIGZvciB0aGlzIGxldmVsIHNvIGl0IHN0YXlzCisgICAgICAgIHJhZGl4MV9kZXRlY3RlZCA9IDA7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIXJhZGl4MV9kZXRlY3RlZCkKKyAgICAgIGNvbnRpbnVlOworICAgIC8vIFJhZGl4IDEgd2FzIGRldGVjdGVkCisgICAgaWYgKGxldmVsID09ICp0aHJlYWRMZXZlbCkgeworICAgICAgLy8gSWYgb25seSBvbmUgdGhyZWFkIHBlciBjb3JlLCB0aGVuIGp1c3QgZGVjcmVtZW50CisgICAgICAvLyB0aGUgZGVwdGggd2hpY2ggcmVtb3ZlcyB0aGUgdGhyZWFkbGV2ZWwgZnJvbSBhZGRyZXNzMm9zCisgICAgICBmb3IgKGkgPSAwOyBpIDwgbkFjdGl2ZVRocmVhZHM7ICsraSkgeworICAgICAgICBhZGRyZXNzMm9zW2ldLmZpcnN0LmRlcHRoLS07CisgICAgICB9CisgICAgICAqdGhyZWFkTGV2ZWwgPSAtMTsKKyAgICB9IGVsc2UgaWYgKGxldmVsID09ICpjb3JlTGV2ZWwpIHsKKyAgICAgIC8vIEZvciBjb3JlIGxldmVsLCB3ZSBtb3ZlIHRoZSB0aHJlYWQgbGFiZWxzIG92ZXIgaWYgdGhleSBhcmUgc3RpbGwKKyAgICAgIC8vIHZhbGlkICgqdGhyZWFkTGV2ZWwgIT0gLTEpLCBhbmQgYWxzbyByZWR1Y2UgdGhlIGRlcHRoIGFub3RoZXIgbGV2ZWwKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuQWN0aXZlVGhyZWFkczsgKytpKSB7CisgICAgICAgIGlmICgqdGhyZWFkTGV2ZWwgIT0gLTEpIHsKKyAgICAgICAgICBhZGRyZXNzMm9zW2ldLmZpcnN0LmxhYmVsc1sqY29yZUxldmVsXSA9CisgICAgICAgICAgICAgIGFkZHJlc3Myb3NbaV0uZmlyc3QubGFiZWxzWyp0aHJlYWRMZXZlbF07CisgICAgICAgIH0KKyAgICAgICAgYWRkcmVzczJvc1tpXS5maXJzdC5kZXB0aC0tOworICAgICAgfQorICAgICAgKmNvcmVMZXZlbCA9IC0xOworICAgIH0KKyAgfQorICByZXR1cm4gYWRkcmVzczJvc1swXS5maXJzdC5kZXB0aDsKK30KKworLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIG9iamVjdHMgb2YgdHlwZSAndHlwZScgYmVsb3cgJ29iaicgd2l0aGluIHRoZSB0b3BvbG9neQorLy8gdHJlZSBzdHJ1Y3R1cmUuIGUuZy4sIGlmIG9iaiBpcyBhIEhXTE9DX09CSl9QQUNLQUdFIG9iamVjdCwgYW5kIHR5cGUgaXMKKy8vIEhXTE9DX09CSl9QVSwgdGhlbiB0aGlzIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2YgUFUncyB1bmRlciB0aGUgU09DS0VUCisvLyBvYmplY3QuCitzdGF0aWMgaW50IF9fa21wX2h3bG9jX2dldF9ub2Jqc191bmRlcl9vYmooaHdsb2Nfb2JqX3Qgb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3bG9jX29ial90eXBlX3QgdHlwZSkgeworICBpbnQgcmV0dmFsID0gMDsKKyAgaHdsb2Nfb2JqX3QgZmlyc3Q7CisgIGZvciAoZmlyc3QgPSBod2xvY19nZXRfb2JqX2JlbG93X2J5X3R5cGUoX19rbXBfaHdsb2NfdG9wb2xvZ3ksIG9iai0+dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmotPmxvZ2ljYWxfaW5kZXgsIHR5cGUsIDApOworICAgICAgIGZpcnN0ICE9IE5VTEwgJiYKKyAgICAgICBod2xvY19nZXRfYW5jZXN0b3Jfb2JqX2J5X3R5cGUoX19rbXBfaHdsb2NfdG9wb2xvZ3ksIG9iai0+dHlwZSwgZmlyc3QpID09CisgICAgICAgICAgIG9iajsKKyAgICAgICBmaXJzdCA9IGh3bG9jX2dldF9uZXh0X29ial9ieV90eXBlKF9fa21wX2h3bG9jX3RvcG9sb2d5LCBmaXJzdC0+dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0KSkgeworICAgICsrcmV0dmFsOworICB9CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgX19rbXBfYWZmaW5pdHlfY3JlYXRlX2h3bG9jX21hcChBZGRyVW5zUGFpciAqKmFkZHJlc3Myb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2kxOG5faWRfdCAqY29uc3QgbXNnX2lkKSB7CisgICphZGRyZXNzMm9zID0gTlVMTDsKKyAgKm1zZ19pZCA9IGttcF9pMThuX251bGw7CisKKyAgLy8gU2F2ZSB0aGUgYWZmaW5pdHkgbWFzayBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgorICBrbXBfYWZmaW5fbWFza190ICpvbGRNYXNrOworICBLTVBfQ1BVX0FMTE9DKG9sZE1hc2spOworICBfX2ttcF9nZXRfc3lzdGVtX2FmZmluaXR5KG9sZE1hc2ssIFRSVUUpOworCisgIGludCBkZXB0aCA9IDM7CisgIGludCBwa2dMZXZlbCA9IDA7CisgIGludCBjb3JlTGV2ZWwgPSAxOworICBpbnQgdGhyZWFkTGV2ZWwgPSAyOworCisgIGlmICghS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgIC8vIEhhY2sgdG8gdHJ5IGFuZCBpbmZlciB0aGUgbWFjaGluZSB0b3BvbG9neSB1c2luZyBvbmx5IHRoZSBkYXRhCisgICAgLy8gYXZhaWxhYmxlIGZyb20gY3B1aWQgb24gdGhlIGN1cnJlbnQgdGhyZWFkLCBhbmQgX19rbXBfeHByb2MuCisgICAgS01QX0FTU0VSVChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpOworCisgICAgbkNvcmVzUGVyUGtnID0gX19rbXBfaHdsb2NfZ2V0X25vYmpzX3VuZGVyX29iaigKKyAgICAgICAgaHdsb2NfZ2V0X29ial9ieV90eXBlKF9fa21wX2h3bG9jX3RvcG9sb2d5LCBIV0xPQ19PQkpfUEFDS0FHRSwgMCksCisgICAgICAgIEhXTE9DX09CSl9DT1JFKTsKKyAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBfX2ttcF9od2xvY19nZXRfbm9ianNfdW5kZXJfb2JqKAorICAgICAgICBod2xvY19nZXRfb2JqX2J5X3R5cGUoX19rbXBfaHdsb2NfdG9wb2xvZ3ksIEhXTE9DX09CSl9DT1JFLCAwKSwKKyAgICAgICAgSFdMT0NfT0JKX1BVKTsKKyAgICBfX2ttcF9uY29yZXMgPSBfX2ttcF94cHJvYyAvIF9fa21wX25UaHJlYWRzUGVyQ29yZTsKKyAgICBuUGFja2FnZXMgPSAoX19rbXBfeHByb2MgKyBuQ29yZXNQZXJQa2cgLSAxKSAvIG5Db3Jlc1BlclBrZzsKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgS01QX0lORk9STShBZmZOb3RDYXBhYmxlVXNlTG9jQ3B1aWRMMTEsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdW5pZm9ybV90b3BvbG9neSgpKSB7CisgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0lORk9STShOb25Vbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICB9CisgICAgICBLTVBfSU5GT1JNKFRvcG9sb2d5LCAiS01QX0FGRklOSVRZIiwgblBhY2thZ2VzLCBuQ29yZXNQZXJQa2csCisgICAgICAgICAgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgX19rbXBfbmNvcmVzKTsKKyAgICB9CisgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gQWxsb2NhdGUgdGhlIGRhdGEgc3RydWN0dXJlIHRvIGJlIHJldHVybmVkLgorICBBZGRyVW5zUGFpciAqcmV0dmFsID0KKyAgICAgIChBZGRyVW5zUGFpciAqKV9fa21wX2FsbG9jYXRlKHNpemVvZihBZGRyVW5zUGFpcikgKiBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgX19rbXBfcHVfb3NfaWR4ID0gKGludCAqKV9fa21wX2FsbG9jYXRlKHNpemVvZihpbnQpICogX19rbXBfYXZhaWxfcHJvYyk7CisKKyAgLy8gV2hlbiBhZmZpbml0eSBpcyBvZmYsIHRoaXMgcm91dGluZSB3aWxsIHN0aWxsIGJlIGNhbGxlZCB0byBzZXQKKyAgLy8gX19rbXBfbmNvcmVzLCBhcyB3ZWxsIGFzIF9fa21wX25UaHJlYWRzUGVyQ29yZSwKKyAgLy8gbkNvcmVzUGVyUGtnLCAmIG5QYWNrYWdlcy4gIE1ha2Ugc3VyZSBhbGwgdGhlc2UgdmFycyBhcmUgc2V0CisgIC8vIGNvcnJlY3RseSwgYW5kIHJldHVybiBpZiBhZmZpbml0eSBpcyBub3QgZW5hYmxlZC4KKworICBod2xvY19vYmpfdCBwdTsKKyAgaHdsb2Nfb2JqX3QgY29yZTsKKyAgaHdsb2Nfb2JqX3Qgc29ja2V0OworICBpbnQgbkFjdGl2ZVRocmVhZHMgPSAwOworICBpbnQgc29ja2V0X2lkZW50aWZpZXIgPSAwOworICAvLyByZS1jYWxjdWxhdGUgZ2xvYmFscyB0byBjb3VudCBvbmx5IGFjY2Vzc2libGUgcmVzb3VyY2VzCisgIF9fa21wX25jb3JlcyA9IG5QYWNrYWdlcyA9IG5Db3Jlc1BlclBrZyA9IF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IDA7CisgIGZvciAoc29ja2V0ID0KKyAgICAgICAgICAgaHdsb2NfZ2V0X29ial9ieV90eXBlKF9fa21wX2h3bG9jX3RvcG9sb2d5LCBIV0xPQ19PQkpfUEFDS0FHRSwgMCk7CisgICAgICAgc29ja2V0ICE9IE5VTEw7IHNvY2tldCA9IGh3bG9jX2dldF9uZXh0X29ial9ieV90eXBlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfaHdsb2NfdG9wb2xvZ3ksIEhXTE9DX09CSl9QQUNLQUdFLCBzb2NrZXQpLAorICAgICAgc29ja2V0X2lkZW50aWZpZXIrKykgeworICAgIGludCBjb3JlX2lkZW50aWZpZXIgPSAwOworICAgIGludCBudW1fYWN0aXZlX2NvcmVzID0gMDsKKyAgICBmb3IgKGNvcmUgPSBod2xvY19nZXRfb2JqX2JlbG93X2J5X3R5cGUoX19rbXBfaHdsb2NfdG9wb2xvZ3ksIHNvY2tldC0+dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LT5sb2dpY2FsX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIV0xPQ19PQkpfQ09SRSwgMCk7CisgICAgICAgICBjb3JlICE9IE5VTEwgJiYKKyAgICAgICAgIGh3bG9jX2dldF9hbmNlc3Rvcl9vYmpfYnlfdHlwZShfX2ttcF9od2xvY190b3BvbG9neSwgc29ja2V0LT50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmUpID09IHNvY2tldDsKKyAgICAgICAgIGNvcmUgPSBod2xvY19nZXRfbmV4dF9vYmpfYnlfdHlwZShfX2ttcF9od2xvY190b3BvbG9neSwgSFdMT0NfT0JKX0NPUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZSksCisgICAgICAgIGNvcmVfaWRlbnRpZmllcisrKSB7CisgICAgICBpbnQgcHVfaWRlbnRpZmllciA9IDA7CisgICAgICBpbnQgbnVtX2FjdGl2ZV90aHJlYWRzID0gMDsKKyAgICAgIGZvciAocHUgPSBod2xvY19nZXRfb2JqX2JlbG93X2J5X3R5cGUoX19rbXBfaHdsb2NfdG9wb2xvZ3ksIGNvcmUtPnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmUtPmxvZ2ljYWxfaW5kZXgsIEhXTE9DX09CSl9QVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgIHB1ICE9IE5VTEwgJiYKKyAgICAgICAgICAgaHdsb2NfZ2V0X2FuY2VzdG9yX29ial9ieV90eXBlKF9fa21wX2h3bG9jX3RvcG9sb2d5LCBjb3JlLT50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHUpID09IGNvcmU7CisgICAgICAgICAgIHB1ID0gaHdsb2NfZ2V0X25leHRfb2JqX2J5X3R5cGUoX19rbXBfaHdsb2NfdG9wb2xvZ3ksIEhXTE9DX09CSl9QVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdSksCisgICAgICAgICAgcHVfaWRlbnRpZmllcisrKSB7CisgICAgICAgIEFkZHJlc3MgYWRkcigzKTsKKyAgICAgICAgaWYgKCFLTVBfQ1BVX0lTU0VUKHB1LT5vc19pbmRleCwgX19rbXBfYWZmaW5fZnVsbE1hc2spKQorICAgICAgICAgIGNvbnRpbnVlOyAvLyBza2lwIGluYWN0aXZlIChpbmFjY2Vzc2libGUpIHVuaXQKKyAgICAgICAgS0FfVFJBQ0UoMjAsCisgICAgICAgICAgICAgICAgICgiSHdsb2MgaW5zZXJ0aW5nICVkICglZCkgJWQgKCVkKSAlZCAoJWQpIGludG8gYWRkcmVzczJvc1xuIiwKKyAgICAgICAgICAgICAgICAgIHNvY2tldC0+b3NfaW5kZXgsIHNvY2tldC0+bG9naWNhbF9pbmRleCwgY29yZS0+b3NfaW5kZXgsCisgICAgICAgICAgICAgICAgICBjb3JlLT5sb2dpY2FsX2luZGV4LCBwdS0+b3NfaW5kZXgsIHB1LT5sb2dpY2FsX2luZGV4KSk7CisgICAgICAgIGFkZHIubGFiZWxzWzBdID0gc29ja2V0X2lkZW50aWZpZXI7IC8vIHBhY2thZ2UKKyAgICAgICAgYWRkci5sYWJlbHNbMV0gPSBjb3JlX2lkZW50aWZpZXI7IC8vIGNvcmUKKyAgICAgICAgYWRkci5sYWJlbHNbMl0gPSBwdV9pZGVudGlmaWVyOyAvLyBwdQorICAgICAgICByZXR2YWxbbkFjdGl2ZVRocmVhZHNdID0gQWRkclVuc1BhaXIoYWRkciwgcHUtPm9zX2luZGV4KTsKKyAgICAgICAgX19rbXBfcHVfb3NfaWR4W25BY3RpdmVUaHJlYWRzXSA9CisgICAgICAgICAgICBwdS0+b3NfaW5kZXg7IC8vIGtlZXAgb3MgaW5kZXggZm9yIGVhY2ggYWN0aXZlIHB1CisgICAgICAgIG5BY3RpdmVUaHJlYWRzKys7CisgICAgICAgICsrbnVtX2FjdGl2ZV90aHJlYWRzOyAvLyBjb3VudCBhY3RpdmUgdGhyZWFkcyBwZXIgY29yZQorICAgICAgfQorICAgICAgaWYgKG51bV9hY3RpdmVfdGhyZWFkcykgeyAvLyB3ZXJlIHRoZXJlIGFueSBhY3RpdmUgdGhyZWFkcyBvbiB0aGUgY29yZT8KKyAgICAgICAgKytfX2ttcF9uY29yZXM7IC8vIGNvdW50IHRvdGFsIGFjdGl2ZSBjb3JlcworICAgICAgICArK251bV9hY3RpdmVfY29yZXM7IC8vIGNvdW50IGFjdGl2ZSBjb3JlcyBwZXIgc29ja2V0CisgICAgICAgIGlmIChudW1fYWN0aXZlX3RocmVhZHMgPiBfX2ttcF9uVGhyZWFkc1BlckNvcmUpCisgICAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gbnVtX2FjdGl2ZV90aHJlYWRzOyAvLyBjYWxjIG1heGltdW0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG51bV9hY3RpdmVfY29yZXMpIHsgLy8gd2VyZSB0aGVyZSBhbnkgYWN0aXZlIGNvcmVzIG9uIHRoZSBzb2NrZXQ/CisgICAgICArK25QYWNrYWdlczsgLy8gY291bnQgdG90YWwgYWN0aXZlIHBhY2thZ2VzCisgICAgICBpZiAobnVtX2FjdGl2ZV9jb3JlcyA+IG5Db3Jlc1BlclBrZykKKyAgICAgICAgbkNvcmVzUGVyUGtnID0gbnVtX2FjdGl2ZV9jb3JlczsgLy8gY2FsYyBtYXhpbXVtCisgICAgfQorICB9CisKKyAgLy8gSWYgdGhlcmUncyBvbmx5IG9uZSB0aHJlYWQgY29udGV4dCB0byBiaW5kIHRvLCByZXR1cm4gbm93LgorICBLTVBfREVCVUdfQVNTRVJUKG5BY3RpdmVUaHJlYWRzID09IF9fa21wX2F2YWlsX3Byb2MpOworICBLTVBfQVNTRVJUKG5BY3RpdmVUaHJlYWRzID4gMCk7CisgIGlmIChuQWN0aXZlVGhyZWFkcyA9PSAxKSB7CisgICAgX19rbXBfbmNvcmVzID0gblBhY2thZ2VzID0gMTsKKyAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBuQ29yZXNQZXJQa2cgPSAxOworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgb2xkTWFzayk7CisKKyAgICAgIEtNUF9JTkZPUk0oQWZmVXNpbmdId2xvYywgIktNUF9BRkZJTklUWSIpOworICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaykgeworICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXRSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgfQorICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgS01QX0lORk9STShUb3BvbG9neSwgIktNUF9BRkZJTklUWSIsIG5QYWNrYWdlcywgbkNvcmVzUGVyUGtnLAorICAgICAgICAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIF9fa21wX25jb3Jlcyk7CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSkgeworICAgICAgX19rbXBfZnJlZShyZXR2YWwpOworICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gRm9ybSBhbiBBZGRyZXNzIG9iamVjdCB3aGljaCBvbmx5IGluY2x1ZGVzIHRoZSBwYWNrYWdlIGxldmVsLgorICAgIEFkZHJlc3MgYWRkcigxKTsKKyAgICBhZGRyLmxhYmVsc1swXSA9IHJldHZhbFswXS5maXJzdC5sYWJlbHNbcGtnTGV2ZWxdOworICAgIHJldHZhbFswXS5maXJzdCA9IGFkZHI7CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPCAwKSB7CisgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA9IDA7CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X3RvcG9sb2d5KHJldHZhbCwgMSwgMSwgMCwgLTEsIC0xKTsKKyAgICB9CisKKyAgICAqYWRkcmVzczJvcyA9IHJldHZhbDsKKyAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICAvLyBTb3J0IHRoZSB0YWJsZSBieSBwaHlzaWNhbCBJZC4KKyAgcXNvcnQocmV0dmFsLCBuQWN0aXZlVGhyZWFkcywgc2l6ZW9mKCpyZXR2YWwpLAorICAgICAgICBfX2ttcF9hZmZpbml0eV9jbXBfQWRkcmVzc19sYWJlbHMpOworCisgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbWFjaGluZSB0b3BvbG9neSBpcyB1bmlmb3JtCisgIHVuc2lnbmVkIHVuaWZvcm0gPQorICAgICAgKG5QYWNrYWdlcyAqIG5Db3Jlc1BlclBrZyAqIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9PSBuQWN0aXZlVGhyZWFkcyk7CisKKyAgLy8gUHJpbnQgdGhlIG1hY2hpbmUgdG9wb2xvZ3kgc3VtbWFyeS4KKyAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICBjaGFyIG1hc2tbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKG1hc2ssIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgb2xkTWFzayk7CisKKyAgICBLTVBfSU5GT1JNKEFmZlVzaW5nSHdsb2MsICJLTVBfQUZGSU5JVFkiKTsKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrKSB7CisgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXRSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgbWFzayk7CisgICAgfSBlbHNlIHsKKyAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBtYXNrKTsKKyAgICB9CisgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICBpZiAodW5pZm9ybSkgeworICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgfSBlbHNlIHsKKyAgICAgIEtNUF9JTkZPUk0oTm9uVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgIH0KKworICAgIGttcF9zdHJfYnVmX3QgYnVmOworICAgIF9fa21wX3N0cl9idWZfaW5pdCgmYnVmKTsKKworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIiVkIiwgblBhY2thZ2VzKTsKKyAgICAvLyBmb3IgKGxldmVsID0gMTsgbGV2ZWwgPD0gcGtnTGV2ZWw7IGxldmVsKyspIHsKKyAgICAvLyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIgeCAlZCIsIG1heEN0W2xldmVsXSk7CisgICAgLy8gfQorICAgIEtNUF9JTkZPUk0oVG9wb2xvZ3lFeHRyYSwgIktNUF9BRkZJTklUWSIsIGJ1Zi5zdHIsIG5Db3Jlc1BlclBrZywKKyAgICAgICAgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgX19rbXBfbmNvcmVzKTsKKworICAgIF9fa21wX3N0cl9idWZfZnJlZSgmYnVmKTsKKyAgfQorCisgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHsKKyAgICBfX2ttcF9mcmVlKHJldHZhbCk7CisgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gRmluZCBhbnkgbGV2ZWxzIHdpdGggcmFkaWl4IDEsIGFuZCByZW1vdmUgdGhlbSBmcm9tIHRoZSBtYXAKKyAgLy8gKGV4Y2VwdCBmb3IgdGhlIHBhY2thZ2UgbGV2ZWwpLgorICBkZXB0aCA9IF9fa21wX2FmZmluaXR5X3JlbW92ZV9yYWRpeF9vbmVfbGV2ZWxzKAorICAgICAgcmV0dmFsLCBuQWN0aXZlVGhyZWFkcywgZGVwdGgsICZwa2dMZXZlbCwgJmNvcmVMZXZlbCwgJnRocmVhZExldmVsKTsKKworICBpZiAoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPCAwKSB7CisgICAgLy8gU2V0IHRoZSBncmFudWxhcml0eSBsZXZlbCBiYXNlZCBvbiB3aGF0IGxldmVscyBhcmUgbW9kZWxlZAorICAgIC8vIGluIHRoZSBtYWNoaW5lIHRvcG9sb2d5IG1hcC4KKyAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA9IDA7CisgICAgaWYgKCh0aHJlYWRMZXZlbCA+PSAwKSAmJiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA+IGFmZmluaXR5X2dyYW5fdGhyZWFkKSkgeworICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICB9CisgICAgaWYgKChjb3JlTGV2ZWwgPj0gMCkgJiYgKF9fa21wX2FmZmluaXR5X2dyYW4gPiBhZmZpbml0eV9ncmFuX2NvcmUpKSB7CisgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgIH0KKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA+IGFmZmluaXR5X2dyYW5fcGFja2FnZSkgeworICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICB9CisgIH0KKworICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgIF9fa21wX2FmZmluaXR5X3ByaW50X3RvcG9sb2d5KHJldHZhbCwgbkFjdGl2ZVRocmVhZHMsIGRlcHRoLCBwa2dMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlTGV2ZWwsIHRocmVhZExldmVsKTsKKyAgfQorCisgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgKmFkZHJlc3Myb3MgPSByZXR2YWw7CisgIHJldHVybiBkZXB0aDsKK30KKyNlbmRpZiAvLyBLTVBfVVNFX0hXTE9DCisKKy8vIElmIHdlIGRvbid0IGtub3cgaG93IHRvIHJldHJpZXZlIHRoZSBtYWNoaW5lJ3MgcHJvY2Vzc29yIHRvcG9sb2d5LCBvcgorLy8gZW5jb3VudGVyIGFuIGVycm9yIGluIGRvaW5nIHNvLCB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGZvcm0gYSAiZmxhdCIKKy8vIG1hcHBpbmcgb2Ygb3MgdGhyZWFkIGlkJ3MgPC0+IHByb2Nlc3NvciBpZCdzLgorc3RhdGljIGludCBfX2ttcF9hZmZpbml0eV9jcmVhdGVfZmxhdF9tYXAoQWRkclVuc1BhaXIgKiphZGRyZXNzMm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2kxOG5faWRfdCAqY29uc3QgbXNnX2lkKSB7CisgICphZGRyZXNzMm9zID0gTlVMTDsKKyAgKm1zZ19pZCA9IGttcF9pMThuX251bGw7CisKKyAgLy8gRXZlbiBpZiBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUsIHRoaXMgcm91dGluZSBtaWdodCBzdGlsbAorICAvLyBjYWxsZWQgdG8gc2V0IF9fa21wX25jb3JlcywgYXMgd2VsbCBhcworICAvLyBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIG5Db3Jlc1BlclBrZywgJiBuUGFja2FnZXMuCisgIGlmICghS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKTsKKyAgICBfX2ttcF9uY29yZXMgPSBuUGFja2FnZXMgPSBfX2ttcF94cHJvYzsKKyAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBuQ29yZXNQZXJQa2cgPSAxOworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICBLTVBfSU5GT1JNKEFmZkZsYXRUb3BvbG9neSwgIktNUF9BRkZJTklUWSIpOworICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgS01QX0lORk9STShUb3BvbG9neSwgIktNUF9BRkZJTklUWSIsIG5QYWNrYWdlcywgbkNvcmVzUGVyUGtnLAorICAgICAgICAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIF9fa21wX25jb3Jlcyk7CisgICAgfQorICAgIHJldHVybiAwOworICB9CisKKyAgLy8gV2hlbiBhZmZpbml0eSBpcyBvZmYsIHRoaXMgcm91dGluZSB3aWxsIHN0aWxsIGJlIGNhbGxlZCB0byBzZXQKKyAgLy8gX19rbXBfbmNvcmVzLCBhcyB3ZWxsIGFzIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgbkNvcmVzUGVyUGtnLCAmIG5QYWNrYWdlcy4KKyAgLy8gTWFrZSBzdXJlIGFsbCB0aGVzZSB2YXJzIGFyZSBzZXQgY29ycmVjdGx5LCBhbmQgcmV0dXJuIG5vdyBpZiBhZmZpbml0eSBpcworICAvLyBub3QgZW5hYmxlZC4KKyAgX19rbXBfbmNvcmVzID0gblBhY2thZ2VzID0gX19rbXBfYXZhaWxfcHJvYzsKKyAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gbkNvcmVzUGVyUGtnID0gMTsKKyAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbl9mdWxsTWFzayk7CisKKyAgICBLTVBfSU5GT1JNKEFmZkNhcGFibGVVc2VGbGF0LCAiS01QX0FGRklOSVRZIik7CisgICAgaWYgKF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaykgeworICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgfSBlbHNlIHsKKyAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgIH0KKyAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgIEtNUF9JTkZPUk0oVG9wb2xvZ3ksICJLTVBfQUZGSU5JVFkiLCBuUGFja2FnZXMsIG5Db3Jlc1BlclBrZywKKyAgICAgICAgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgX19rbXBfbmNvcmVzKTsKKyAgfQorICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX3B1X29zX2lkeCA9PSBOVUxMKTsKKyAgX19rbXBfcHVfb3NfaWR4ID0gKGludCAqKV9fa21wX2FsbG9jYXRlKHNpemVvZihpbnQpICogX19rbXBfYXZhaWxfcHJvYyk7CisgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHsKKyAgICBpbnQgYXZhaWxfY3QgPSAwOworICAgIGludCBpOworICAgIEtNUF9DUFVfU0VUX0lURVJBVEUoaSwgX19rbXBfYWZmaW5fZnVsbE1hc2spIHsKKyAgICAgIGlmICghS01QX0NQVV9JU1NFVChpLCBfX2ttcF9hZmZpbl9mdWxsTWFzaykpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgX19rbXBfcHVfb3NfaWR4W2F2YWlsX2N0KytdID0gaTsgLy8gc3VwcG9zZSBpbmRpY2VzIGFyZSBmbGF0CisgICAgfQorICAgIHJldHVybiAwOworICB9CisKKyAgLy8gQ29udHJ1Y3QgdGhlIGRhdGEgc3RydWN0dXJlIHRvIGJlIHJldHVybmVkLgorICAqYWRkcmVzczJvcyA9CisgICAgICAoQWRkclVuc1BhaXIgKilfX2ttcF9hbGxvY2F0ZShzaXplb2YoKiphZGRyZXNzMm9zKSAqIF9fa21wX2F2YWlsX3Byb2MpOworICBpbnQgYXZhaWxfY3QgPSAwOworICB1bnNpZ25lZCBpbnQgaTsKKyAgS01QX0NQVV9TRVRfSVRFUkFURShpLCBfX2ttcF9hZmZpbl9mdWxsTWFzaykgeworICAgIC8vIFNraXAgdGhpcyBwcm9jIGlmIGl0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgbWFjaGluZSBtb2RlbC4KKyAgICBpZiAoIUtNUF9DUFVfSVNTRVQoaSwgX19rbXBfYWZmaW5fZnVsbE1hc2spKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgX19rbXBfcHVfb3NfaWR4W2F2YWlsX2N0XSA9IGk7IC8vIHN1cHBvc2UgaW5kaWNlcyBhcmUgZmxhdAorICAgIEFkZHJlc3MgYWRkcigxKTsKKyAgICBhZGRyLmxhYmVsc1swXSA9IGk7CisgICAgKCphZGRyZXNzMm9zKVthdmFpbF9jdCsrXSA9IEFkZHJVbnNQYWlyKGFkZHIsIGkpOworICB9CisgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgS01QX0lORk9STShPU1Byb2NUb1BhY2thZ2UsICJLTVBfQUZGSU5JVFkiKTsKKyAgfQorCisgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA8IDApIHsKKyAgICAvLyBPbmx5IHRoZSBwYWNrYWdlIGxldmVsIGlzIG1vZGVsZWQgaW4gdGhlIG1hY2hpbmUgdG9wb2xvZ3kgbWFwLAorICAgIC8vIHNvIHRoZSAjbGV2ZWxzIG9mIGdyYW51bGFyaXR5IGlzIGVpdGhlciAwIG9yIDEuCisgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW4gPiBhZmZpbml0eV9ncmFuX3BhY2thZ2UpIHsKKyAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAwOworICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworI2lmIEtNUF9HUk9VUF9BRkZJTklUWQorCisvLyBJZiBtdWx0aXBsZSBXaW5kb3dzKiBPUyBwcm9jZXNzb3IgZ3JvdXBzIGV4aXN0LCB3ZSBjYW4gY3JlYXRlIGEgMi1sZXZlbAorLy8gdG9wb2xvZ3kgbWFwIHdpdGggdGhlIGdyb3VwcyBhdCBsZXZlbCAwIGFuZCB0aGUgaW5kaXZpZHVhbCBwcm9jcyBhdCBsZXZlbCAxLgorLy8gVGhpcyBmYWNpbGl0YXRlcyBsZXR0aW5nIHRoZSB0aHJlYWRzIGZsb2F0IGFtb25nIGFsbCBwcm9jcyBpbiBhIGdyb3VwLAorLy8gaWYgZ3JhbnVsYXJpdHk9Z3JvdXAgKHRoZSBkZWZhdWx0IHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGdyb3VwcykuCitzdGF0aWMgaW50IF9fa21wX2FmZmluaXR5X2NyZWF0ZV9wcm9jX2dyb3VwX21hcChBZGRyVW5zUGFpciAqKmFkZHJlc3Myb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaTE4bl9pZF90ICpjb25zdCBtc2dfaWQpIHsKKyAgKmFkZHJlc3Myb3MgPSBOVUxMOworICAqbXNnX2lkID0ga21wX2kxOG5fbnVsbDsKKworICAvLyBJZiB3ZSBhcmVuJ3QgYWZmaW5pdHkgY2FwYWJsZSwgdGhlbiByZXR1cm4gbm93LgorICAvLyBUaGUgZmxhdCBtYXBwaW5nIHdpbGwgYmUgdXNlZC4KKyAgaWYgKCFLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgLy8gRklYTUUgc2V0ICptc2dfaWQKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvLyBDb250cnVjdCB0aGUgZGF0YSBzdHJ1Y3R1cmUgdG8gYmUgcmV0dXJuZWQuCisgICphZGRyZXNzMm9zID0KKyAgICAgIChBZGRyVW5zUGFpciAqKV9fa21wX2FsbG9jYXRlKHNpemVvZigqKmFkZHJlc3Myb3MpICogX19rbXBfYXZhaWxfcHJvYyk7CisgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfcHVfb3NfaWR4ID09IE5VTEwpOworICBfX2ttcF9wdV9vc19pZHggPSAoaW50ICopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKGludCkgKiBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgaW50IGF2YWlsX2N0ID0gMDsKKyAgaW50IGk7CisgIEtNUF9DUFVfU0VUX0lURVJBVEUoaSwgX19rbXBfYWZmaW5fZnVsbE1hc2spIHsKKyAgICAvLyBTa2lwIHRoaXMgcHJvYyBpZiBpdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIG1hY2hpbmUgbW9kZWwuCisgICAgaWYgKCFLTVBfQ1BVX0lTU0VUKGksIF9fa21wX2FmZmluX2Z1bGxNYXNrKSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIF9fa21wX3B1X29zX2lkeFthdmFpbF9jdF0gPSBpOyAvLyBzdXBwb3NlIGluZGljZXMgYXJlIGZsYXQKKyAgICBBZGRyZXNzIGFkZHIoMik7CisgICAgYWRkci5sYWJlbHNbMF0gPSBpIC8gKENIQVJfQklUICogc2l6ZW9mKERXT1JEX1BUUikpOworICAgIGFkZHIubGFiZWxzWzFdID0gaSAlIChDSEFSX0JJVCAqIHNpemVvZihEV09SRF9QVFIpKTsKKyAgICAoKmFkZHJlc3Myb3MpW2F2YWlsX2N0KytdID0gQWRkclVuc1BhaXIoYWRkciwgaSk7CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgS01QX0lORk9STShBZmZPU1Byb2NUb0dyb3VwLCAiS01QX0FGRklOSVRZIiwgaSwgYWRkci5sYWJlbHNbMF0sCisgICAgICAgICAgICAgICAgIGFkZHIubGFiZWxzWzFdKTsKKyAgICB9CisgIH0KKworICBpZiAoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPCAwKSB7CisgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9ncm91cCkgeworICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAxOworICAgIH0gZWxzZSBpZiAoKF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9maW5lKSB8fAorICAgICAgICAgICAgICAgKF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl90aHJlYWQpKSB7CisgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IGNoYXIgKmdyYW5fc3RyID0gTlVMTDsKKyAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fY29yZSkgeworICAgICAgICBncmFuX3N0ciA9ICJjb3JlIjsKKyAgICAgIH0gZWxzZSBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX3BhY2thZ2UpIHsKKyAgICAgICAgZ3Jhbl9zdHIgPSAicGFja2FnZSI7CisgICAgICB9IGVsc2UgaWYgKF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9ub2RlKSB7CisgICAgICAgIGdyYW5fc3RyID0gIm5vZGUiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0FTU0VSVCgwKTsKKyAgICAgIH0KKworICAgICAgLy8gV2FybmluZzogY2FuJ3QgdXNlIGFmZmluaXR5IGdyYW51bGFyaXR5IFwiZ3JhblwiIHdpdGggZ3JvdXAgdG9wb2xvZ3kKKyAgICAgIC8vIG1ldGhvZCwgdXNpbmcgInRocmVhZCIKKyAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDI7Cit9CisKKyNlbmRpZiAvKiBLTVBfR1JPVVBfQUZGSU5JVFkgKi8KKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworc3RhdGljIGludCBfX2ttcF9jcHVpZF9tYXNrX3dpZHRoKGludCBjb3VudCkgeworICBpbnQgciA9IDA7CisKKyAgd2hpbGUgKCgxIDw8IHIpIDwgY291bnQpCisgICAgKytyOworICByZXR1cm4gcjsKK30KKworY2xhc3MgYXBpY1RocmVhZEluZm8geworcHVibGljOgorICB1bnNpZ25lZCBvc0lkOyAvLyBwYXJhbSB0byBfX2ttcF9hZmZpbml0eV9iaW5kX3RocmVhZAorICB1bnNpZ25lZCBhcGljSWQ7IC8vIGZyb20gY3B1aWQgYWZ0ZXIgYmluZGluZworICB1bnNpZ25lZCBtYXhDb3Jlc1BlclBrZzsgLy8gICAgICAiIgorICB1bnNpZ25lZCBtYXhUaHJlYWRzUGVyUGtnOyAvLyAgICAgICIiCisgIHVuc2lnbmVkIHBrZ0lkOyAvLyBpbmZlcnJlZCBmcm9tIGFib3ZlIHZhbHVlcworICB1bnNpZ25lZCBjb3JlSWQ7IC8vICAgICAgIiIKKyAgdW5zaWduZWQgdGhyZWFkSWQ7IC8vICAgICAgIiIKK307CisKK3N0YXRpYyBpbnQgX19rbXBfYWZmaW5pdHlfY21wX2FwaWNUaHJlYWRJbmZvX29zX2lkKGNvbnN0IHZvaWQgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpiKSB7CisgIGNvbnN0IGFwaWNUaHJlYWRJbmZvICphYSA9IChjb25zdCBhcGljVGhyZWFkSW5mbyAqKWE7CisgIGNvbnN0IGFwaWNUaHJlYWRJbmZvICpiYiA9IChjb25zdCBhcGljVGhyZWFkSW5mbyAqKWI7CisgIGlmIChhYS0+b3NJZCA8IGJiLT5vc0lkKQorICAgIHJldHVybiAtMTsKKyAgaWYgKGFhLT5vc0lkID4gYmItPm9zSWQpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fa21wX2FmZmluaXR5X2NtcF9hcGljVGhyZWFkSW5mb19waHlzX2lkKGNvbnN0IHZvaWQgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmIpIHsKKyAgY29uc3QgYXBpY1RocmVhZEluZm8gKmFhID0gKGNvbnN0IGFwaWNUaHJlYWRJbmZvICopYTsKKyAgY29uc3QgYXBpY1RocmVhZEluZm8gKmJiID0gKGNvbnN0IGFwaWNUaHJlYWRJbmZvICopYjsKKyAgaWYgKGFhLT5wa2dJZCA8IGJiLT5wa2dJZCkKKyAgICByZXR1cm4gLTE7CisgIGlmIChhYS0+cGtnSWQgPiBiYi0+cGtnSWQpCisgICAgcmV0dXJuIDE7CisgIGlmIChhYS0+Y29yZUlkIDwgYmItPmNvcmVJZCkKKyAgICByZXR1cm4gLTE7CisgIGlmIChhYS0+Y29yZUlkID4gYmItPmNvcmVJZCkKKyAgICByZXR1cm4gMTsKKyAgaWYgKGFhLT50aHJlYWRJZCA8IGJiLT50aHJlYWRJZCkKKyAgICByZXR1cm4gLTE7CisgIGlmIChhYS0+dGhyZWFkSWQgPiBiYi0+dGhyZWFkSWQpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCisvLyBPbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0IGFyY2hpdGVjdHVyZSwgd2UgYXR0ZW1wdCB0byB1c2UKKy8vIGFuIGFsZ29yaXRobSB3aGljaCBjeWNsZXMgdGhyb3VnaCB0aGUgYXZhaWxhYmxlIG9zIHRocmVhZHMsIHNldHRpbmcKKy8vIHRoZSBjdXJyZW50IHRocmVhZCdzIGFmZmluaXR5IG1hc2sgdG8gdGhhdCB0aHJlYWQsIGFuZCB0aGVuIHJldHJpZXZlcworLy8gdGhlIEFwaWMgSWQgZm9yIGVhY2ggdGhyZWFkIGNvbnRleHQgdXNpbmcgdGhlIGNwdWlkIGluc3RydWN0aW9uLgorc3RhdGljIGludCBfX2ttcF9hZmZpbml0eV9jcmVhdGVfYXBpY2lkX21hcChBZGRyVW5zUGFpciAqKmFkZHJlc3Myb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pMThuX2lkX3QgKmNvbnN0IG1zZ19pZCkgeworICBrbXBfY3B1aWQgYnVmOworICBpbnQgcmM7CisgICphZGRyZXNzMm9zID0gTlVMTDsKKyAgKm1zZ19pZCA9IGttcF9pMThuX251bGw7CisKKyAgLy8gQ2hlY2sgaWYgY3B1aWQgbGVhZiA0IGlzIHN1cHBvcnRlZC4KKyAgX19rbXBfeDg2X2NwdWlkKDAsIDAsICZidWYpOworICBpZiAoYnVmLmVheCA8IDQpIHsKKyAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX05vTGVhZjRTdXBwb3J0OworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8vIFRoZSBhbGdvcml0aG0gdXNlZCBzdGFydHMgYnkgc2V0dGluZyB0aGUgYWZmaW5pdHkgdG8gZWFjaCBhdmFpbGFibGUgdGhyZWFkCisgIC8vIGFuZCByZXRyaWV2aW5nIGluZm8gZnJvbSB0aGUgY3B1aWQgaW5zdHJ1Y3Rpb24sIHNvIGlmIHdlIGFyZSBub3QgY2FwYWJsZSBvZgorICAvLyBjYWxsaW5nIF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoKSBhbmQgX2ttcF9nZXRfc3lzdGVtX2FmZmluaXR5KCksIHRoZW4gd2UKKyAgLy8gbmVlZCB0byBkbyBzb21ldGhpbmcgZWxzZSAtIHVzZSB0aGUgZGVmYXVsdHMgdGhhdCB3ZSBjYWxjdWxhdGVkIGZyb20KKyAgLy8gaXNzdWluZyBjcHVpZCB3aXRob3V0IGJpbmRpbmcgdG8gZWFjaCBwcm9jLgorICBpZiAoIUtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICAvLyBIYWNrIHRvIHRyeSBhbmQgaW5mZXIgdGhlIG1hY2hpbmUgdG9wb2xvZ3kgdXNpbmcgb25seSB0aGUgZGF0YQorICAgIC8vIGF2YWlsYWJsZSBmcm9tIGNwdWlkIG9uIHRoZSBjdXJyZW50IHRocmVhZCwgYW5kIF9fa21wX3hwcm9jLgorICAgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKTsKKworICAgIC8vIEdldCBhbiB1cHBlciBib3VuZCBvbiB0aGUgbnVtYmVyIG9mIHRocmVhZHMgcGVyIHBhY2thZ2UgdXNpbmcgY3B1aWQoMSkuCisgICAgLy8gT24gc29tZSBPUy9jaHBzIGNvbWJpbmF0aW9ucyB3aGVyZSBIVCBpcyBzdXBwb3J0ZWQgYnkgdGhlIGNoaXAgYnV0IGlzCisgICAgLy8gZGlzYWJsZWQsIHRoaXMgdmFsdWUgd2lsbCBiZSAyIG9uIGEgc2luZ2xlIGNvcmUgY2hpcC4gVXN1YWxseSwgaXQgd2lsbCBiZQorICAgIC8vIDIgaWYgSFQgaXMgZW5hYmxlZCBhbmQgMSBpZiBIVCBpcyBkaXNhYmxlZC4KKyAgICBfX2ttcF94ODZfY3B1aWQoMSwgMCwgJmJ1Zik7CisgICAgaW50IG1heFRocmVhZHNQZXJQa2cgPSAoYnVmLmVieCA+PiAxNikgJiAweGZmOworICAgIGlmIChtYXhUaHJlYWRzUGVyUGtnID09IDApIHsKKyAgICAgIG1heFRocmVhZHNQZXJQa2cgPSAxOworICAgIH0KKworICAgIC8vIFRoZSBudW0gY29yZXMgcGVyIHBrZyBjb21lcyBmcm9tIGNwdWlkKDQpLiAxIG11c3QgYmUgYWRkZWQgdG8gdGhlIGVuY29kZWQKKyAgICAvLyB2YWx1ZS4KKyAgICAvLworICAgIC8vIFRoZSBhdXRob3Igb2YgY3B1X2NvdW50LmNwcCB0cmVhdGVkIHRoaXMgb25seSBhbiB1cHBlciBib3VuZCBvbiB0aGUKKyAgICAvLyBudW1iZXIgb2YgY29yZXMsIGJ1dCBJIGhhdmVuJ3Qgc2VlbiBhbnkgY2FzZXMgd2hlcmUgaXQgd2FzIGdyZWF0ZXIgdGhhbgorICAgIC8vIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGNvcmVzLCBzbyB3ZSB3aWxsIHRyZWF0IGl0IGFzIGV4YWN0IGluIHRoaXMgYmxvY2sgb2YKKyAgICAvLyBjb2RlLgorICAgIC8vCisgICAgLy8gRmlyc3QsIHdlIG5lZWQgdG8gY2hlY2sgaWYgY3B1aWQoNCkgaXMgc3VwcG9ydGVkIG9uIHRoaXMgY2hpcC4gVG8gc2VlIGlmCisgICAgLy8gY3B1aWQobikgaXMgc3VwcG9ydGVkLCBpc3N1ZSBjcHVpZCgwKSBhbmQgY2hlY2sgaWYgZWF4IGhhcyB0aGUgdmFsdWUgbiBvcgorICAgIC8vIGdyZWF0ZXIuCisgICAgX19rbXBfeDg2X2NwdWlkKDAsIDAsICZidWYpOworICAgIGlmIChidWYuZWF4ID49IDQpIHsKKyAgICAgIF9fa21wX3g4Nl9jcHVpZCg0LCAwLCAmYnVmKTsKKyAgICAgIG5Db3Jlc1BlclBrZyA9ICgoYnVmLmVheCA+PiAyNikgJiAweDNmKSArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIG5Db3Jlc1BlclBrZyA9IDE7CisgICAgfQorCisgICAgLy8gVGhlcmUgaXMgbm8gd2F5IHRvIHJlbGlhYmx5IHRlbGwgaWYgSFQgaXMgZW5hYmxlZCB3aXRob3V0IGlzc3VpbmcgdGhlCisgICAgLy8gY3B1aWQgaW5zdHJ1Y3Rpb24gZnJvbSBldmVyeSB0aHJlYWQsIGNhbiBjb3JyZWxhdGluZyB0aGUgY3B1aWQgaW5mbywgc28KKyAgICAvLyBpZiB0aGUgbWFjaGluZSBpcyBub3QgYWZmaW5pdHkgY2FwYWJsZSwgd2UgYXNzdW1lIHRoYXQgSFQgaXMgb2ZmLiBXZSBoYXZlCisgICAgLy8gc2VlbiBxdWl0ZSBhIGZldyBtYWNoaW5lcyB3aGVyZSBtYXhUaHJlYWRzUGVyUGtnIGlzIDIsIHlldCB0aGUgbWFjaGluZQorICAgIC8vIGRvZXMgbm90IHN1cHBvcnQgSFQuCisgICAgLy8KKyAgICAvLyAtIE9sZGVyIE9TZXMgYXJlIHVzdWFsbHkgZm91bmQgb24gbWFjaGluZXMgd2l0aCBvbGRlciBjaGlwcywgd2hpY2ggZG8gbm90CisgICAgLy8gICBzdXBwb3J0IEhULgorICAgIC8vIC0gVGhlIHBlcmZvcm1hbmNlIHBlbmFsdHkgZm9yIG1pc3Rha2VubHkgaWRlbnRpZnlpbmcgYSBtYWNoaW5lIGFzIEhUIHdoZW4KKyAgICAvLyAgIGl0IGlzbid0ICh3aGljaCByZXN1bHRzIGluIGJsb2NrdGltZSBiZWluZyBpbmNvcnJlY2x5IHNldCB0byAwKSBpcworICAgIC8vICAgZ3JlYXRlciB0aGFuIHRoZSBwZW5hbHR5IHdoZW4gZm9yIG1pc3Rha2VubHkgaWRlbnRpZnlpbmcgYSBtYWNoaW5lIGFzCisgICAgLy8gICBiZWluZyAxIHRocmVhZC9jb3JlIHdoZW4gaXQgaXMgcmVhbGx5IEhUIGVuYWJsZWQgKHdoaWNoIHJlc3VsdHMgaW4KKyAgICAvLyAgIGJsb2NrdGltZSBiZWluZyBpbmNvcnJlY3RseSBzZXQgdG8gYSBwb3NpdGl2ZSB2YWx1ZSkuCisgICAgX19rbXBfbmNvcmVzID0gX19rbXBfeHByb2M7CisgICAgblBhY2thZ2VzID0gKF9fa21wX3hwcm9jICsgbkNvcmVzUGVyUGtnIC0gMSkgLyBuQ29yZXNQZXJQa2c7CisgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gMTsKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgS01QX0lORk9STShBZmZOb3RDYXBhYmxlVXNlTG9jQ3B1aWQsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdW5pZm9ybV90b3BvbG9neSgpKSB7CisgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0lORk9STShOb25Vbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICB9CisgICAgICBLTVBfSU5GT1JNKFRvcG9sb2d5LCAiS01QX0FGRklOSVRZIiwgblBhY2thZ2VzLCBuQ29yZXNQZXJQa2csCisgICAgICAgICAgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgX19rbXBfbmNvcmVzKTsKKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBGcm9tIGhlcmUgb24sIHdlIGNhbiBhc3N1bWUgdGhhdCBpdCBpcyBzYWZlIHRvIGNhbGwKKyAgLy8gX19rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eSgpIGFuZCBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KCksIGV2ZW4gaWYKKyAgLy8gX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmUuCisKKyAgLy8gU2F2ZSB0aGUgYWZmaW5pdHkgbWFzayBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgorICBrbXBfYWZmaW5fbWFza190ICpvbGRNYXNrOworICBLTVBfQ1BVX0FMTE9DKG9sZE1hc2spOworICBLTVBfQVNTRVJUKG9sZE1hc2sgIT0gTlVMTCk7CisgIF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkob2xkTWFzaywgVFJVRSk7CisKKyAgLy8gUnVuIHRocm91Z2ggZWFjaCBvZiB0aGUgYXZhaWxhYmxlIGNvbnRleHRzLCBiaW5kaW5nIHRoZSBjdXJyZW50IHRocmVhZAorICAvLyB0byBpdCwgYW5kIG9idGFpbmluZyB0aGUgcGVydGluZW50IGluZm9ybWF0aW9uIHVzaW5nIHRoZSBjcHVpZCBpbnN0ci4KKyAgLy8KKyAgLy8gVGhlIHJlbGV2YW50IGluZm9ybWF0aW9uIGlzOgorICAvLyAtIEFwaWMgSWQ6IEJpdHMgMjQ6MzEgb2YgZWJ4IGFmdGVyIGlzc3VpbmcgY3B1aWQoMSkgLSBlYWNoIHRocmVhZCBjb250ZXh0CisgIC8vICAgICBoYXMgYSB1bmlxaWUgQXBpYyBJZCwgd2hpY2ggaXMgb2YgdGhlIGZvcm0gcGtnIyA6IGNvcmUjIDogdGhyZWFkIy4KKyAgLy8gLSBNYXggVGhyZWFkcyBQZXIgUGtnOiBCaXRzIDE2OjIzIG9mIGVieCBhZnRlciBpc3N1aW5nIGNwdWlkKDEpLiBUaGUgdmFsdWUKKyAgLy8gICAgIG9mIHRoaXMgZmllbGQgZGV0ZXJtaW5lcyB0aGUgd2lkdGggb2YgdGhlIGNvcmUjICsgdGhyZWFkIyBmaWVsZHMgaW4gdGhlCisgIC8vICAgICBBcGljIElkLiBJdCBpcyBhbHNvIGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBwZXIKKyAgLy8gICAgIHBhY2thZ2UsIGJ1dCBpdCBoYXMgYmVlbiB2ZXJpZmllZCB0aGF0IHNpdHVhdGlvbnMgaGFwcGVuIHdlcmUgaXQgaXMgbm90CisgIC8vICAgICBleGFjdC4gSW4gcGFydGljdWxhciwgb24gY2VydGFpbiBPUy9jaGlwIGNvbWJpbmF0aW9ucyB3aGVyZSBJbnRlbChSKQorICAvLyAgICAgSHlwZXItVGhyZWFkaW5nIFRlY2hub2xvZ3kgaXMgc3VwcG9ydGVkIGJ5IHRoZSBjaGlwIGJ1dCBoYXMgYmVlbgorICAvLyAgICAgZGlzYWJsZWQsIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIHdpbGwgYmUgMiAoZm9yIGEgc2luZ2xlIGNvcmUgY2hpcCkuCisgIC8vICAgICBPbiBvdGhlciBPUy9jaGlwIGNvbWJpbmF0aW9ucyBzdXBwb3J0aW5nIEludGVsKFIpIEh5cGVyLVRocmVhZGluZworICAvLyAgICAgVGVjaG5vbG9neSwgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgd2lsbCBiZSAxIHdoZW4gSW50ZWwoUikKKyAgLy8gICAgIEh5cGVyLVRocmVhZGluZyBUZWNobm9sb2d5IGlzIGRpc2FibGVkIGFuZCAyIHdoZW4gaXQgaXMgZW5hYmxlZC4KKyAgLy8gLSBNYXggQ29yZXMgUGVyIFBrZzogIEJpdHMgMjY6MzEgb2YgZWF4IGFmdGVyIGlzc3VpbmcgY3B1aWQoNCkuIFRoZSB2YWx1ZQorICAvLyAgICAgb2YgdGhpcyBmaWVsZCAoKzEpIGRldGVybWluZXMgdGhlIHdpZHRoIG9mIHRoZSBjb3JlIyBmaWVsZCBpbiB0aGUgQXBpYworICAvLyAgICAgSWQuIFRoZSBjb21tZW50cyBpbiAiY3B1Y291bnQuY3BwIiBzYXkgdGhhdCB0aGlzIHZhbHVlIGlzIGFuIHVwcGVyCisgIC8vICAgICBib3VuZCwgYnV0IHRoZSBJQS0zMiBhcmNoaXRlY3R1cmUgbWFudWFsIHNheXMgdGhhdCBpdCBpcyBleGFjdGx5IHRoZQorICAvLyAgICAgbnVtYmVyIG9mIGNvcmVzIHBlciBwYWNrYWdlLCBhbmQgSSBoYXZlbid0IHNlZW4gYW55IGNhc2Ugd2hlcmUgaXQKKyAgLy8gICAgIHdhc24ndC4KKyAgLy8KKyAgLy8gRnJvbSB0aGlzIGluZm9ybWF0aW9uLCBkZWR1Y2UgdGhlIHBhY2thZ2UgSWQsIGNvcmUgSWQsIGFuZCB0aHJlYWQgSWQsCisgIC8vIGFuZCBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGRzIGluIHRoZSBhcGljVGhyZWFkSW5mbyBzdHJ1Y3QuCisgIHVuc2lnbmVkIGk7CisgIGFwaWNUaHJlYWRJbmZvICp0aHJlYWRJbmZvID0gKGFwaWNUaHJlYWRJbmZvICopX19rbXBfYWxsb2NhdGUoCisgICAgICBfX2ttcF9hdmFpbF9wcm9jICogc2l6ZW9mKGFwaWNUaHJlYWRJbmZvKSk7CisgIHVuc2lnbmVkIG5BcGljcyA9IDA7CisgIEtNUF9DUFVfU0VUX0lURVJBVEUoaSwgX19rbXBfYWZmaW5fZnVsbE1hc2spIHsKKyAgICAvLyBTa2lwIHRoaXMgcHJvYyBpZiBpdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIG1hY2hpbmUgbW9kZWwuCisgICAgaWYgKCFLTVBfQ1BVX0lTU0VUKGksIF9fa21wX2FmZmluX2Z1bGxNYXNrKSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoKGludCluQXBpY3MgPCBfX2ttcF9hdmFpbF9wcm9jKTsKKworICAgIF9fa21wX2FmZmluaXR5X2Rpc3BhdGNoLT5iaW5kX3RocmVhZChpKTsKKyAgICB0aHJlYWRJbmZvW25BcGljc10ub3NJZCA9IGk7CisKKyAgICAvLyBUaGUgYXBpYyBpZCBhbmQgbWF4IHRocmVhZHMgcGVyIHBrZyBjb21lIGZyb20gY3B1aWQoMSkuCisgICAgX19rbXBfeDg2X2NwdWlkKDEsIDAsICZidWYpOworICAgIGlmICgoKGJ1Zi5lZHggPj4gOSkgJiAxKSA9PSAwKSB7CisgICAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KG9sZE1hc2ssIFRSVUUpOworICAgICAgX19rbXBfZnJlZSh0aHJlYWRJbmZvKTsKKyAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfQXBpY05vdFByZXNlbnQ7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHRocmVhZEluZm9bbkFwaWNzXS5hcGljSWQgPSAoYnVmLmVieCA+PiAyNCkgJiAweGZmOworICAgIHRocmVhZEluZm9bbkFwaWNzXS5tYXhUaHJlYWRzUGVyUGtnID0gKGJ1Zi5lYnggPj4gMTYpICYgMHhmZjsKKyAgICBpZiAodGhyZWFkSW5mb1tuQXBpY3NdLm1heFRocmVhZHNQZXJQa2cgPT0gMCkgeworICAgICAgdGhyZWFkSW5mb1tuQXBpY3NdLm1heFRocmVhZHNQZXJQa2cgPSAxOworICAgIH0KKworICAgIC8vIE1heCBjb3JlcyBwZXIgcGtnIGNvbWVzIGZyb20gY3B1aWQoNCkuIDEgbXVzdCBiZSBhZGRlZCB0byB0aGUgZW5jb2RlZAorICAgIC8vIHZhbHVlLgorICAgIC8vCisgICAgLy8gRmlyc3QsIHdlIG5lZWQgdG8gY2hlY2sgaWYgY3B1aWQoNCkgaXMgc3VwcG9ydGVkIG9uIHRoaXMgY2hpcC4gVG8gc2VlIGlmCisgICAgLy8gY3B1aWQobikgaXMgc3VwcG9ydGVkLCBpc3N1ZSBjcHVpZCgwKSBhbmQgY2hlY2sgaWYgZWF4IGhhcyB0aGUgdmFsdWUgbgorICAgIC8vIG9yIGdyZWF0ZXIuCisgICAgX19rbXBfeDg2X2NwdWlkKDAsIDAsICZidWYpOworICAgIGlmIChidWYuZWF4ID49IDQpIHsKKyAgICAgIF9fa21wX3g4Nl9jcHVpZCg0LCAwLCAmYnVmKTsKKyAgICAgIHRocmVhZEluZm9bbkFwaWNzXS5tYXhDb3Jlc1BlclBrZyA9ICgoYnVmLmVheCA+PiAyNikgJiAweDNmKSArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocmVhZEluZm9bbkFwaWNzXS5tYXhDb3Jlc1BlclBrZyA9IDE7CisgICAgfQorCisgICAgLy8gSW5mZXIgdGhlIHBrZ0lkIC8gY29yZUlkIC8gdGhyZWFkSWQgdXNpbmcgb25seSB0aGUgaW5mbyBvYnRhaW5lZCBsb2NhbGx5LgorICAgIGludCB3aWR0aENUID0gX19rbXBfY3B1aWRfbWFza193aWR0aCh0aHJlYWRJbmZvW25BcGljc10ubWF4VGhyZWFkc1BlclBrZyk7CisgICAgdGhyZWFkSW5mb1tuQXBpY3NdLnBrZ0lkID0gdGhyZWFkSW5mb1tuQXBpY3NdLmFwaWNJZCA+PiB3aWR0aENUOworCisgICAgaW50IHdpZHRoQyA9IF9fa21wX2NwdWlkX21hc2tfd2lkdGgodGhyZWFkSW5mb1tuQXBpY3NdLm1heENvcmVzUGVyUGtnKTsKKyAgICBpbnQgd2lkdGhUID0gd2lkdGhDVCAtIHdpZHRoQzsKKyAgICBpZiAod2lkdGhUIDwgMCkgeworICAgICAgLy8gSSd2ZSBuZXZlciBzZWVuIHRoaXMgb25lIGhhcHBlbiwgYnV0IEkgc3VwcG9zZSBpdCBjb3VsZCwgaWYgdGhlIGNwdWlkCisgICAgICAvLyBpbnN0cnVjdGlvbiBvbiBhIGNoaXAgd2FzIHJlYWxseSBzY3Jld2VkIHVwLiBNYWtlIHN1cmUgdG8gcmVzdG9yZSB0aGUKKyAgICAgIC8vIGFmZmluaXR5IG1hc2sgYmVmb3JlIHRoZSB0YWlsIGNhbGwuCisgICAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KG9sZE1hc2ssIFRSVUUpOworICAgICAgX19rbXBfZnJlZSh0aHJlYWRJbmZvKTsKKyAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfSW52YWxpZENwdWlkSW5mbzsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpbnQgbWFza0MgPSAoMSA8PCB3aWR0aEMpIC0gMTsKKyAgICB0aHJlYWRJbmZvW25BcGljc10uY29yZUlkID0gKHRocmVhZEluZm9bbkFwaWNzXS5hcGljSWQgPj4gd2lkdGhUKSAmIG1hc2tDOworCisgICAgaW50IG1hc2tUID0gKDEgPDwgd2lkdGhUKSAtIDE7CisgICAgdGhyZWFkSW5mb1tuQXBpY3NdLnRocmVhZElkID0gdGhyZWFkSW5mb1tuQXBpY3NdLmFwaWNJZCAmIG1hc2tUOworCisgICAgbkFwaWNzKys7CisgIH0KKworICAvLyBXZSd2ZSBjb2xsZWN0ZWQgYWxsIHRoZSBpbmZvIHdlIG5lZWQuCisgIC8vIFJlc3RvcmUgdGhlIG9sZCBhZmZpbml0eSBtYXNrIGZvciB0aGlzIHRocmVhZC4KKyAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eShvbGRNYXNrLCBUUlVFKTsKKworICAvLyBJZiB0aGVyZSdzIG9ubHkgb25lIHRocmVhZCBjb250ZXh0IHRvIGJpbmQgdG8sIGZvcm0gYW4gQWRkcmVzcyBvYmplY3QKKyAgLy8gd2l0aCBkZXB0aCAxIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkgKG9yLCBpZiBhZmZpbml0eSBpcyBvZmYsIHNldAorICAvLyBhZGRyZXNzMm9zIHRvIE5VTEwgYW5kIHJldHVybikuCisgIC8vCisgIC8vIElmIGl0IGlzIGNvbmZpZ3VyZWQgdG8gb21pdCB0aGUgcGFja2FnZSBsZXZlbCB3aGVuIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUKKyAgLy8gcGFja2FnZSwgdGhlIGxvZ2ljIGF0IHRoZSBlbmQgb2YgdGhpcyByb3V0aW5lIHdvbid0IHdvcmsgaWYgdGhlcmUgaXMgb25seQorICAvLyBhIHNpbmdsZSB0aHJlYWQgLSBpdCB3b3VsZCB0cnkgdG8gZm9ybSBhbiBBZGRyZXNzIG9iamVjdCB3aXRoIGRlcHRoIDAuCisgIEtNUF9BU1NFUlQobkFwaWNzID4gMCk7CisgIGlmIChuQXBpY3MgPT0gMSkgeworICAgIF9fa21wX25jb3JlcyA9IG5QYWNrYWdlcyA9IDE7CisgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gbkNvcmVzUGVyUGtnID0gMTsKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sIG9sZE1hc2spOworCisgICAgICBLTVBfSU5GT1JNKEFmZlVzZUdsb2JDcHVpZCwgIktNUF9BRkZJTklUWSIpOworICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaykgeworICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXRSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgfQorICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgS01QX0lORk9STShUb3BvbG9neSwgIktNUF9BRkZJTklUWSIsIG5QYWNrYWdlcywgbkNvcmVzUGVyUGtnLAorICAgICAgICAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIF9fa21wX25jb3Jlcyk7CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSkgeworICAgICAgX19rbXBfZnJlZSh0aHJlYWRJbmZvKTsKKyAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgICphZGRyZXNzMm9zID0gKEFkZHJVbnNQYWlyICopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKEFkZHJVbnNQYWlyKSk7CisgICAgQWRkcmVzcyBhZGRyKDEpOworICAgIGFkZHIubGFiZWxzWzBdID0gdGhyZWFkSW5mb1swXS5wa2dJZDsKKyAgICAoKmFkZHJlc3Myb3MpWzBdID0gQWRkclVuc1BhaXIoYWRkciwgdGhyZWFkSW5mb1swXS5vc0lkKTsKKworICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA8IDApIHsKKyAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMDsKKyAgICB9CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfdG9wb2xvZ3koKmFkZHJlc3Myb3MsIDEsIDEsIDAsIC0xLCAtMSk7CisgICAgfQorCisgICAgX19rbXBfZnJlZSh0aHJlYWRJbmZvKTsKKyAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICAvLyBTb3J0IHRoZSB0aHJlYWRJbmZvIHRhYmxlIGJ5IHBoeXNpY2FsIElkLgorICBxc29ydCh0aHJlYWRJbmZvLCBuQXBpY3MsIHNpemVvZigqdGhyZWFkSW5mbyksCisgICAgICAgIF9fa21wX2FmZmluaXR5X2NtcF9hcGljVGhyZWFkSW5mb19waHlzX2lkKTsKKworICAvLyBUaGUgdGFibGUgaXMgbm93IHNvcnRlZCBieSBwa2dJZCAvIGNvcmVJZCAvIHRocmVhZElkLCBidXQgd2UgcmVhbGx5IGRvbid0CisgIC8vIGtub3cgdGhlIHJhZGl4IG9mIGFueSBvZiB0aGUgZmllbGRzLiBwa2dJZCdzIG1heSBiZSBzcGFyc2VseSBhc3NpZ25lZCBhbW9uZworICAvLyB0aGUgY2hpcHMgb24gYSBzeXN0ZW0uIEFsdGhvdWdoIGNvcmVJZCdzIGFyZSB1c3VhbGx5IGFzc2lnbmVkCisgIC8vIFswIC4uIGNvcmVzUGVyUGtnLTFdIGFuZCB0aHJlYWRJZCdzIGFyZSB1c3VhbGx5IGFzc2lnbmVkCisgIC8vIFswLi50aHJlYWRzUGVyQ29yZS0xXSwgd2UgZG9uJ3Qgd2FudCB0byBtYWtlIGFueSBzdWNoIGFzc3VtcHRpb25zLgorICAvLworICAvLyBGb3IgdGhhdCBtYXR0ZXIsIHdlIGRvbid0IGtub3cgd2hhdCBjb3Jlc1BlclBrZyBhbmQgdGhyZWFkc1BlckNvcmUgKG9yIHRoZQorICAvLyB0b3RhbCAjIHBhY2thZ2VzKSBhcmUgYXQgdGhpcyBwb2ludCAtIHdlIHdhbnQgdG8gZGV0ZXJtaW5lIHRoYXQgbm93LiBXZQorICAvLyBvbmx5IGhhdmUgYW4gdXBwZXIgYm91bmQgb24gdGhlIGZpcnN0IHR3byBmaWd1cmVzLgorICAvLworICAvLyBXZSBhbHNvIHBlcmZvcm0gYSBjb25zaXN0ZW5jeSBjaGVjayBhdCB0aGlzIHBvaW50OiB0aGUgdmFsdWVzIHJldHVybmVkIGJ5CisgIC8vIHRoZSBjcHVpZCBpbnN0cnVjdGlvbiBmb3IgYW55IHRocmVhZCBib3VuZCB0byBhIGdpdmVuIHBhY2thZ2UgaGFkIGJldHRlcgorICAvLyByZXR1cm4gdGhlIHNhbWUgaW5mbyBmb3IgbWF4VGhyZWFkc1BlclBrZyBhbmQgbWF4Q29yZXNQZXJQa2cuCisgIG5QYWNrYWdlcyA9IDE7CisgIG5Db3Jlc1BlclBrZyA9IDE7CisgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IDE7CisgIHVuc2lnbmVkIG5Db3JlcyA9IDE7CisKKyAgdW5zaWduZWQgcGtnQ3QgPSAxOyAvLyB0byBkZXRlcm1pbmUgcmFkaWkKKyAgdW5zaWduZWQgbGFzdFBrZ0lkID0gdGhyZWFkSW5mb1swXS5wa2dJZDsKKyAgdW5zaWduZWQgY29yZUN0ID0gMTsKKyAgdW5zaWduZWQgbGFzdENvcmVJZCA9IHRocmVhZEluZm9bMF0uY29yZUlkOworICB1bnNpZ25lZCB0aHJlYWRDdCA9IDE7CisgIHVuc2lnbmVkIGxhc3RUaHJlYWRJZCA9IHRocmVhZEluZm9bMF0udGhyZWFkSWQ7CisKKyAgLy8gaW50cmEtcGtnIGNvbnNpc3QgY2hlY2tzCisgIHVuc2lnbmVkIHByZXZNYXhDb3Jlc1BlclBrZyA9IHRocmVhZEluZm9bMF0ubWF4Q29yZXNQZXJQa2c7CisgIHVuc2lnbmVkIHByZXZNYXhUaHJlYWRzUGVyUGtnID0gdGhyZWFkSW5mb1swXS5tYXhUaHJlYWRzUGVyUGtnOworCisgIGZvciAoaSA9IDE7IGkgPCBuQXBpY3M7IGkrKykgeworICAgIGlmICh0aHJlYWRJbmZvW2ldLnBrZ0lkICE9IGxhc3RQa2dJZCkgeworICAgICAgbkNvcmVzKys7CisgICAgICBwa2dDdCsrOworICAgICAgbGFzdFBrZ0lkID0gdGhyZWFkSW5mb1tpXS5wa2dJZDsKKyAgICAgIGlmICgoaW50KWNvcmVDdCA+IG5Db3Jlc1BlclBrZykKKyAgICAgICAgbkNvcmVzUGVyUGtnID0gY29yZUN0OworICAgICAgY29yZUN0ID0gMTsKKyAgICAgIGxhc3RDb3JlSWQgPSB0aHJlYWRJbmZvW2ldLmNvcmVJZDsKKyAgICAgIGlmICgoaW50KXRocmVhZEN0ID4gX19rbXBfblRocmVhZHNQZXJDb3JlKQorICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSB0aHJlYWRDdDsKKyAgICAgIHRocmVhZEN0ID0gMTsKKyAgICAgIGxhc3RUaHJlYWRJZCA9IHRocmVhZEluZm9baV0udGhyZWFkSWQ7CisKKyAgICAgIC8vIFRoaXMgaXMgYSBkaWZmZXJlbnQgcGFja2FnZSwgc28gZ28gb24gdG8gdGhlIG5leHQgaXRlcmF0aW9uIHdpdGhvdXQKKyAgICAgIC8vIGRvaW5nIGFueSBjb25zaXN0ZW5jeSBjaGVja3MuIFJlc2V0IHRoZSBjb25zaXN0ZW5jeSBjaGVjayB2YXJzLCB0aG91Z2guCisgICAgICBwcmV2TWF4Q29yZXNQZXJQa2cgPSB0aHJlYWRJbmZvW2ldLm1heENvcmVzUGVyUGtnOworICAgICAgcHJldk1heFRocmVhZHNQZXJQa2cgPSB0aHJlYWRJbmZvW2ldLm1heFRocmVhZHNQZXJQa2c7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAodGhyZWFkSW5mb1tpXS5jb3JlSWQgIT0gbGFzdENvcmVJZCkgeworICAgICAgbkNvcmVzKys7CisgICAgICBjb3JlQ3QrKzsKKyAgICAgIGxhc3RDb3JlSWQgPSB0aHJlYWRJbmZvW2ldLmNvcmVJZDsKKyAgICAgIGlmICgoaW50KXRocmVhZEN0ID4gX19rbXBfblRocmVhZHNQZXJDb3JlKQorICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSB0aHJlYWRDdDsKKyAgICAgIHRocmVhZEN0ID0gMTsKKyAgICAgIGxhc3RUaHJlYWRJZCA9IHRocmVhZEluZm9baV0udGhyZWFkSWQ7CisgICAgfSBlbHNlIGlmICh0aHJlYWRJbmZvW2ldLnRocmVhZElkICE9IGxhc3RUaHJlYWRJZCkgeworICAgICAgdGhyZWFkQ3QrKzsKKyAgICAgIGxhc3RUaHJlYWRJZCA9IHRocmVhZEluZm9baV0udGhyZWFkSWQ7CisgICAgfSBlbHNlIHsKKyAgICAgIF9fa21wX2ZyZWUodGhyZWFkSW5mbyk7CisgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0xlZ2FjeUFwaWNJRHNOb3RVbmlxdWU7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8gQ2hlY2sgdG8gbWFrZSBjZXJ0YWluIHRoYXQgdGhlIG1heENvcmVzUGVyUGtnIGFuZCBtYXhUaHJlYWRzUGVyUGtnCisgICAgLy8gZmllbGRzIGFncmVlIGJldHdlZW4gYWxsIHRoZSB0aHJlYWRzIGJvdW5kcyB0byBhIGdpdmVuIHBhY2thZ2UuCisgICAgaWYgKChwcmV2TWF4Q29yZXNQZXJQa2cgIT0gdGhyZWFkSW5mb1tpXS5tYXhDb3Jlc1BlclBrZykgfHwKKyAgICAgICAgKHByZXZNYXhUaHJlYWRzUGVyUGtnICE9IHRocmVhZEluZm9baV0ubWF4VGhyZWFkc1BlclBrZykpIHsKKyAgICAgIF9fa21wX2ZyZWUodGhyZWFkSW5mbyk7CisgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0luY29uc2lzdGVudENwdWlkSW5mbzsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKyAgblBhY2thZ2VzID0gcGtnQ3Q7CisgIGlmICgoaW50KWNvcmVDdCA+IG5Db3Jlc1BlclBrZykKKyAgICBuQ29yZXNQZXJQa2cgPSBjb3JlQ3Q7CisgIGlmICgoaW50KXRocmVhZEN0ID4gX19rbXBfblRocmVhZHNQZXJDb3JlKQorICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IHRocmVhZEN0OworCisgIC8vIFdoZW4gYWZmaW5pdHkgaXMgb2ZmLCB0aGlzIHJvdXRpbmUgd2lsbCBzdGlsbCBiZSBjYWxsZWQgdG8gc2V0CisgIC8vIF9fa21wX25jb3JlcywgYXMgd2VsbCBhcyBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIG5Db3Jlc1BlclBrZywgJiBuUGFja2FnZXMuCisgIC8vIE1ha2Ugc3VyZSBhbGwgdGhlc2UgdmFycyBhcmUgc2V0IGNvcnJlY3RseSwgYW5kIHJldHVybiBub3cgaWYgYWZmaW5pdHkgaXMKKyAgLy8gbm90IGVuYWJsZWQuCisgIF9fa21wX25jb3JlcyA9IG5Db3JlczsKKyAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sIG9sZE1hc2spOworCisgICAgS01QX0lORk9STShBZmZVc2VHbG9iQ3B1aWQsICJLTVBfQUZGSU5JVFkiKTsKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrKSB7CisgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXRSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICB9IGVsc2UgeworICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0Tm90UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgfQorICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgaWYgKF9fa21wX2FmZmluaXR5X3VuaWZvcm1fdG9wb2xvZ3koKSkgeworICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgfSBlbHNlIHsKKyAgICAgIEtNUF9JTkZPUk0oTm9uVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgIH0KKyAgICBLTVBfSU5GT1JNKFRvcG9sb2d5LCAiS01QX0FGRklOSVRZIiwgblBhY2thZ2VzLCBuQ29yZXNQZXJQa2csCisgICAgICAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIF9fa21wX25jb3Jlcyk7CisgIH0KKyAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9wdV9vc19pZHggPT0gTlVMTCk7CisgIEtNUF9ERUJVR19BU1NFUlQobkFwaWNzID09IF9fa21wX2F2YWlsX3Byb2MpOworICBfX2ttcF9wdV9vc19pZHggPSAoaW50ICopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKGludCkgKiBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgZm9yIChpID0gMDsgaSA8IG5BcGljczsgKytpKSB7CisgICAgX19rbXBfcHVfb3NfaWR4W2ldID0gdGhyZWFkSW5mb1tpXS5vc0lkOworICB9CisgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHsKKyAgICBfX2ttcF9mcmVlKHRocmVhZEluZm8pOworICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIE5vdyB0aGF0IHdlJ3ZlIGRldGVybWluZWQgdGhlIG51bWJlciBvZiBwYWNrYWdlcywgdGhlIG51bWJlciBvZiBjb3JlcyBwZXIKKyAgLy8gcGFja2FnZSwgYW5kIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBwZXIgY29yZSwgd2UgY2FuIGNvbnN0cnVjdCB0aGUgZGF0YQorICAvLyBzdHJ1Y3R1cmUgdGhhdCBpcyB0byBiZSByZXR1cm5lZC4KKyAgaW50IHBrZ0xldmVsID0gMDsKKyAgaW50IGNvcmVMZXZlbCA9IChuQ29yZXNQZXJQa2cgPD0gMSkgPyAtMSA6IDE7CisgIGludCB0aHJlYWRMZXZlbCA9CisgICAgICAoX19rbXBfblRocmVhZHNQZXJDb3JlIDw9IDEpID8gLTEgOiAoKGNvcmVMZXZlbCA+PSAwKSA/IDIgOiAxKTsKKyAgdW5zaWduZWQgZGVwdGggPSAocGtnTGV2ZWwgPj0gMCkgKyAoY29yZUxldmVsID49IDApICsgKHRocmVhZExldmVsID49IDApOworCisgIEtNUF9BU1NFUlQoZGVwdGggPiAwKTsKKyAgKmFkZHJlc3Myb3MgPSAoQWRkclVuc1BhaXIgKilfX2ttcF9hbGxvY2F0ZShzaXplb2YoQWRkclVuc1BhaXIpICogbkFwaWNzKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbkFwaWNzOyArK2kpIHsKKyAgICBBZGRyZXNzIGFkZHIoZGVwdGgpOworICAgIHVuc2lnbmVkIG9zID0gdGhyZWFkSW5mb1tpXS5vc0lkOworICAgIGludCBkID0gMDsKKworICAgIGlmIChwa2dMZXZlbCA+PSAwKSB7CisgICAgICBhZGRyLmxhYmVsc1tkKytdID0gdGhyZWFkSW5mb1tpXS5wa2dJZDsKKyAgICB9CisgICAgaWYgKGNvcmVMZXZlbCA+PSAwKSB7CisgICAgICBhZGRyLmxhYmVsc1tkKytdID0gdGhyZWFkSW5mb1tpXS5jb3JlSWQ7CisgICAgfQorICAgIGlmICh0aHJlYWRMZXZlbCA+PSAwKSB7CisgICAgICBhZGRyLmxhYmVsc1tkKytdID0gdGhyZWFkSW5mb1tpXS50aHJlYWRJZDsKKyAgICB9CisgICAgKCphZGRyZXNzMm9zKVtpXSA9IEFkZHJVbnNQYWlyKGFkZHIsIG9zKTsKKyAgfQorCisgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA8IDApIHsKKyAgICAvLyBTZXQgdGhlIGdyYW51bGFyaXR5IGxldmVsIGJhc2VkIG9uIHdoYXQgbGV2ZWxzIGFyZSBtb2RlbGVkIGluIHRoZSBtYWNoaW5lCisgICAgLy8gdG9wb2xvZ3kgbWFwLgorICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMDsKKyAgICBpZiAoKHRocmVhZExldmVsID49IDApICYmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl90aHJlYWQpKSB7CisgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgIH0KKyAgICBpZiAoKGNvcmVMZXZlbCA+PSAwKSAmJiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA+IGFmZmluaXR5X2dyYW5fY29yZSkpIHsKKyAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzKys7CisgICAgfQorICAgIGlmICgocGtnTGV2ZWwgPj0gMCkgJiYgKF9fa21wX2FmZmluaXR5X2dyYW4gPiBhZmZpbml0eV9ncmFuX3BhY2thZ2UpKSB7CisgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgIH0KKyAgfQorCisgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfdG9wb2xvZ3koKmFkZHJlc3Myb3MsIG5BcGljcywgZGVwdGgsIHBrZ0xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVMZXZlbCwgdGhyZWFkTGV2ZWwpOworICB9CisKKyAgX19rbXBfZnJlZSh0aHJlYWRJbmZvKTsKKyAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICByZXR1cm4gZGVwdGg7Cit9CisKKy8vIEludGVsKFIpIG1pY3JvYXJjaGl0ZWN0dXJlIGNvZGUgbmFtZSBOZWhhbGVtLCBEdW5uaW5ndG9uIGFuZCBsYXRlcgorLy8gYXJjaGl0ZWN0dXJlcyBzdXBwb3J0IGEgbmV3ZXIgaW50ZXJmYWNlIGZvciBzcGVjaWZ5aW5nIHRoZSB4MkFQSUMgSWRzLAorLy8gYmFzZWQgb24gY3B1aWQgbGVhZiAxMS4KK3N0YXRpYyBpbnQgX19rbXBfYWZmaW5pdHlfY3JlYXRlX3gyYXBpY2lkX21hcChBZGRyVW5zUGFpciAqKmFkZHJlc3Myb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2kxOG5faWRfdCAqY29uc3QgbXNnX2lkKSB7CisgIGttcF9jcHVpZCBidWY7CisgICphZGRyZXNzMm9zID0gTlVMTDsKKyAgKm1zZ19pZCA9IGttcF9pMThuX251bGw7CisKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIGNwdWlkIGxlYWYgMTEgaXMgc3VwcG9ydGVkLgorICBfX2ttcF94ODZfY3B1aWQoMCwgMCwgJmJ1Zik7CisgIGlmIChidWYuZWF4IDwgMTEpIHsKKyAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX05vTGVhZjExU3VwcG9ydDsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgX19rbXBfeDg2X2NwdWlkKDExLCAwLCAmYnVmKTsKKyAgaWYgKGJ1Zi5lYnggPT0gMCkgeworICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfTm9MZWFmMTFTdXBwb3J0OworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8vIEZpbmQgdGhlIG51bWJlciBvZiBsZXZlbHMgaW4gdGhlIG1hY2hpbmUgdG9wb2xvZ3kuIFdoaWxlIHdlJ3JlIGF0IGl0LCBnZXQKKyAgLy8gdGhlIGRlZmF1bHQgdmFsdWVzIGZvciBfX2ttcF9uVGhyZWFkc1BlckNvcmUgJiBuQ29yZXNQZXJQa2cuIFdlIHdpbGwgdHJ5IHRvCisgIC8vIGdldCBtb3JlIGFjY3VyYXRlIHZhbHVlcyBsYXRlciBieSBleHBsaWNpdGx5IGNvdW50aW5nIHRoZW0sIGJ1dCBnZXQKKyAgLy8gcmVhc29uYWJsZSBkZWZhdWx0cyBub3csIGluIGNhc2Ugd2UgcmV0dXJuIGVhcmx5LgorICBpbnQgbGV2ZWw7CisgIGludCB0aHJlYWRMZXZlbCA9IC0xOworICBpbnQgY29yZUxldmVsID0gLTE7CisgIGludCBwa2dMZXZlbCA9IC0xOworICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBuQ29yZXNQZXJQa2cgPSBuUGFja2FnZXMgPSAxOworCisgIGZvciAobGV2ZWwgPSAwOzsgbGV2ZWwrKykgeworICAgIGlmIChsZXZlbCA+IDMxKSB7CisgICAgICAvLyBGSVhNRTogSGFjayBmb3IgRFBEMjAwMTYzMTgwCisgICAgICAvLworICAgICAgLy8gSWYgbGV2ZWwgaXMgYmlnIHRoZW4gc29tZXRoaW5nIHdlbnQgd3JvbmcgLT4gZXhpdGluZworICAgICAgLy8KKyAgICAgIC8vIFRoZXJlIGNvdWxkIGFjdHVhbGx5IGJlIDMyIHZhbGlkIGxldmVscyBpbiB0aGUgbWFjaGluZSB0b3BvbG9neSwgYnV0IHNvCisgICAgICAvLyBmYXIsIHRoZSBvbmx5IG1hY2hpbmUgd2UgaGF2ZSBzZWVuIHdoaWNoIGRvZXMgbm90IGV4aXQgdGhpcyBsb29wIGJlZm9yZQorICAgICAgLy8gaXRlcmF0aW9uIDMyIGhhcyBmdWJhciB4MkFQSUMgc2V0dGluZ3MuCisgICAgICAvLworICAgICAgLy8gRm9yIG5vdywganVzdCByZWplY3QgdGhpcyBjYXNlIGJhc2VkIHVwb24gbG9vcCB0cmlwIGNvdW50LgorICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9JbnZhbGlkQ3B1aWRJbmZvOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBfX2ttcF94ODZfY3B1aWQoMTEsIGxldmVsLCAmYnVmKTsKKyAgICBpZiAoYnVmLmVieCA9PSAwKSB7CisgICAgICBpZiAocGtnTGV2ZWwgPCAwKSB7CisgICAgICAgIC8vIFdpbGwgaW5mZXIgblBhY2thZ2VzIGZyb20gX19rbXBfeHByb2MKKyAgICAgICAgcGtnTGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgbGV2ZWwrKzsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpbnQga2luZCA9IChidWYuZWN4ID4+IDgpICYgMHhmZjsKKyAgICBpZiAoa2luZCA9PSAxKSB7CisgICAgICAvLyBTTVQgbGV2ZWwKKyAgICAgIHRocmVhZExldmVsID0gbGV2ZWw7CisgICAgICBjb3JlTGV2ZWwgPSAtMTsKKyAgICAgIHBrZ0xldmVsID0gLTE7CisgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBidWYuZWJ4ICYgMHhmZmZmOworICAgICAgaWYgKF9fa21wX25UaHJlYWRzUGVyQ29yZSA9PSAwKSB7CisgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfSW52YWxpZENwdWlkSW5mbzsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoa2luZCA9PSAyKSB7CisgICAgICAvLyBjb3JlIGxldmVsCisgICAgICBjb3JlTGV2ZWwgPSBsZXZlbDsKKyAgICAgIHBrZ0xldmVsID0gLTE7CisgICAgICBuQ29yZXNQZXJQa2cgPSBidWYuZWJ4ICYgMHhmZmZmOworICAgICAgaWYgKG5Db3Jlc1BlclBrZyA9PSAwKSB7CisgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfSW52YWxpZENwdWlkSW5mbzsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAobGV2ZWwgPD0gMCkgeworICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0ludmFsaWRDcHVpZEluZm87CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGlmIChwa2dMZXZlbCA+PSAwKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgcGtnTGV2ZWwgPSBsZXZlbDsKKyAgICAgIG5QYWNrYWdlcyA9IGJ1Zi5lYnggJiAweGZmZmY7CisgICAgICBpZiAoblBhY2thZ2VzID09IDApIHsKKyAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9JbnZhbGlkQ3B1aWRJbmZvOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgfQorICB9CisgIGludCBkZXB0aCA9IGxldmVsOworCisgIC8vIEluIHRoZSBhYm92ZSBsb29wLCAibGV2ZWwiIHdhcyBjb3VudGVkIGZyb20gdGhlIGZpbmVzdCBsZXZlbCAodXN1YWxseQorICAvLyB0aHJlYWQpIHRvIHRoZSBjb2Fyc2VzdC4gIFRoZSBjYWxsZXIgZXhwZWN0cyB0aGF0IHdlIHdpbGwgcGxhY2UgdGhlIGxhYmVscworICAvLyBpbiAoKmFkZHJlc3Myb3MpW10uZmlyc3QubGFiZWxzW10gaW4gdGhlIGludmVyc2Ugb3JkZXIsIHNvIHdlIG5lZWQgdG8KKyAgLy8gaW52ZXJ0IHRoZSB2YXJzIHNheWluZyB3aGljaCBsZXZlbCBtZWFucyB3aGF0LgorICBpZiAodGhyZWFkTGV2ZWwgPj0gMCkgeworICAgIHRocmVhZExldmVsID0gZGVwdGggLSB0aHJlYWRMZXZlbCAtIDE7CisgIH0KKyAgaWYgKGNvcmVMZXZlbCA+PSAwKSB7CisgICAgY29yZUxldmVsID0gZGVwdGggLSBjb3JlTGV2ZWwgLSAxOworICB9CisgIEtNUF9ERUJVR19BU1NFUlQocGtnTGV2ZWwgPj0gMCk7CisgIHBrZ0xldmVsID0gZGVwdGggLSBwa2dMZXZlbCAtIDE7CisKKyAgLy8gVGhlIGFsZ29yaXRobSB1c2VkIHN0YXJ0cyBieSBzZXR0aW5nIHRoZSBhZmZpbml0eSB0byBlYWNoIGF2YWlsYWJsZSB0aHJlYWQKKyAgLy8gYW5kIHJldHJpZXZpbmcgaW5mbyBmcm9tIHRoZSBjcHVpZCBpbnN0cnVjdGlvbiwgc28gaWYgd2UgYXJlIG5vdCBjYXBhYmxlIG9mCisgIC8vIGNhbGxpbmcgX19rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eSgpIGFuZCBfa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoKSwgdGhlbiB3ZQorICAvLyBuZWVkIHRvIGRvIHNvbWV0aGluZyBlbHNlIC0gdXNlIHRoZSBkZWZhdWx0cyB0aGF0IHdlIGNhbGN1bGF0ZWQgZnJvbQorICAvLyBpc3N1aW5nIGNwdWlkIHdpdGhvdXQgYmluZGluZyB0byBlYWNoIHByb2MuCisgIGlmICghS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgIC8vIEhhY2sgdG8gdHJ5IGFuZCBpbmZlciB0aGUgbWFjaGluZSB0b3BvbG9neSB1c2luZyBvbmx5IHRoZSBkYXRhCisgICAgLy8gYXZhaWxhYmxlIGZyb20gY3B1aWQgb24gdGhlIGN1cnJlbnQgdGhyZWFkLCBhbmQgX19rbXBfeHByb2MuCisgICAgS01QX0FTU0VSVChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpOworCisgICAgX19rbXBfbmNvcmVzID0gX19rbXBfeHByb2MgLyBfX2ttcF9uVGhyZWFkc1BlckNvcmU7CisgICAgblBhY2thZ2VzID0gKF9fa21wX3hwcm9jICsgbkNvcmVzUGVyUGtnIC0gMSkgLyBuQ29yZXNQZXJQa2c7CisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgIEtNUF9JTkZPUk0oQWZmTm90Q2FwYWJsZVVzZUxvY0NwdWlkTDExLCAiS01QX0FGRklOSVRZIik7CisgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3VuaWZvcm1fdG9wb2xvZ3koKSkgeworICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9JTkZPUk0oTm9uVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgfQorICAgICAgS01QX0lORk9STShUb3BvbG9neSwgIktNUF9BRkZJTklUWSIsIG5QYWNrYWdlcywgbkNvcmVzUGVyUGtnLAorICAgICAgICAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIF9fa21wX25jb3Jlcyk7CisgICAgfQorICAgIHJldHVybiAwOworICB9CisKKyAgLy8gRnJvbSBoZXJlIG9uLCB3ZSBjYW4gYXNzdW1lIHRoYXQgaXQgaXMgc2FmZSB0byBjYWxsCisgIC8vIF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoKSBhbmQgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSgpLCBldmVuIGlmCisgIC8vIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lLgorCisgIC8vIFNhdmUgdGhlIGFmZmluaXR5IG1hc2sgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KKyAga21wX2FmZmluX21hc2tfdCAqb2xkTWFzazsKKyAgS01QX0NQVV9BTExPQyhvbGRNYXNrKTsKKyAgX19rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eShvbGRNYXNrLCBUUlVFKTsKKworICAvLyBBbGxvY2F0ZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgdG8gYmUgcmV0dXJuZWQuCisgIEFkZHJVbnNQYWlyICpyZXR2YWwgPQorICAgICAgKEFkZHJVbnNQYWlyICopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKEFkZHJVbnNQYWlyKSAqIF9fa21wX2F2YWlsX3Byb2MpOworCisgIC8vIFJ1biB0aHJvdWdoIGVhY2ggb2YgdGhlIGF2YWlsYWJsZSBjb250ZXh0cywgYmluZGluZyB0aGUgY3VycmVudCB0aHJlYWQKKyAgLy8gdG8gaXQsIGFuZCBvYnRhaW5pbmcgdGhlIHBlcnRpbmVudCBpbmZvcm1hdGlvbiB1c2luZyB0aGUgY3B1aWQgaW5zdHIuCisgIHVuc2lnbmVkIGludCBwcm9jOworICBpbnQgbkFwaWNzID0gMDsKKyAgS01QX0NQVV9TRVRfSVRFUkFURShwcm9jLCBfX2ttcF9hZmZpbl9mdWxsTWFzaykgeworICAgIC8vIFNraXAgdGhpcyBwcm9jIGlmIGl0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgbWFjaGluZSBtb2RlbC4KKyAgICBpZiAoIUtNUF9DUFVfSVNTRVQocHJvYywgX19rbXBfYWZmaW5fZnVsbE1hc2spKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVChuQXBpY3MgPCBfX2ttcF9hdmFpbF9wcm9jKTsKKworICAgIF9fa21wX2FmZmluaXR5X2Rpc3BhdGNoLT5iaW5kX3RocmVhZChwcm9jKTsKKworICAgIC8vIEV4dHJhY3QgbGFiZWxzIGZvciBlYWNoIGxldmVsIGluIHRoZSBtYWNoaW5lIHRvcG9sb2d5IG1hcCBmcm9tIEFwaWMgSUQuCisgICAgQWRkcmVzcyBhZGRyKGRlcHRoKTsKKyAgICBpbnQgcHJldl9zaGlmdCA9IDA7CisKKyAgICBmb3IgKGxldmVsID0gMDsgbGV2ZWwgPCBkZXB0aDsgbGV2ZWwrKykgeworICAgICAgX19rbXBfeDg2X2NwdWlkKDExLCBsZXZlbCwgJmJ1Zik7CisgICAgICB1bnNpZ25lZCBhcGljSWQgPSBidWYuZWR4OworICAgICAgaWYgKGJ1Zi5lYnggPT0gMCkgeworICAgICAgICBpZiAobGV2ZWwgIT0gZGVwdGggLSAxKSB7CisgICAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfSW5jb25zaXN0ZW50Q3B1aWRJbmZvOworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBhZGRyLmxhYmVsc1tkZXB0aCAtIGxldmVsIC0gMV0gPSBhcGljSWQgPj4gcHJldl9zaGlmdDsKKyAgICAgICAgbGV2ZWwrKzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpbnQgc2hpZnQgPSBidWYuZWF4ICYgMHgxZjsKKyAgICAgIGludCBtYXNrID0gKDEgPDwgc2hpZnQpIC0gMTsKKyAgICAgIGFkZHIubGFiZWxzW2RlcHRoIC0gbGV2ZWwgLSAxXSA9IChhcGljSWQgJiBtYXNrKSA+PiBwcmV2X3NoaWZ0OworICAgICAgcHJldl9zaGlmdCA9IHNoaWZ0OworICAgIH0KKyAgICBpZiAobGV2ZWwgIT0gZGVwdGgpIHsKKyAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfSW5jb25zaXN0ZW50Q3B1aWRJbmZvOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHZhbFtuQXBpY3NdID0gQWRkclVuc1BhaXIoYWRkciwgcHJvYyk7CisgICAgbkFwaWNzKys7CisgIH0KKworICAvLyBXZSd2ZSBjb2xsZWN0ZWQgYWxsIHRoZSBpbmZvIHdlIG5lZWQuCisgIC8vIFJlc3RvcmUgdGhlIG9sZCBhZmZpbml0eSBtYXNrIGZvciB0aGlzIHRocmVhZC4KKyAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eShvbGRNYXNrLCBUUlVFKTsKKworICAvLyBJZiB0aGVyZSdzIG9ubHkgb25lIHRocmVhZCBjb250ZXh0IHRvIGJpbmQgdG8sIHJldHVybiBub3cuCisgIEtNUF9BU1NFUlQobkFwaWNzID4gMCk7CisgIGlmIChuQXBpY3MgPT0gMSkgeworICAgIF9fa21wX25jb3JlcyA9IG5QYWNrYWdlcyA9IDE7CisgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gbkNvcmVzUGVyUGtnID0gMTsKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sIG9sZE1hc2spOworCisgICAgICBLTVBfSU5GT1JNKEFmZlVzZUdsb2JDcHVpZEwxMSwgIktNUF9BRkZJTklUWSIpOworICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaykgeworICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXRSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgfQorICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgS01QX0lORk9STShUb3BvbG9neSwgIktNUF9BRkZJTklUWSIsIG5QYWNrYWdlcywgbkNvcmVzUGVyUGtnLAorICAgICAgICAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIF9fa21wX25jb3Jlcyk7CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSkgeworICAgICAgX19rbXBfZnJlZShyZXR2YWwpOworICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gRm9ybSBhbiBBZGRyZXNzIG9iamVjdCB3aGljaCBvbmx5IGluY2x1ZGVzIHRoZSBwYWNrYWdlIGxldmVsLgorICAgIEFkZHJlc3MgYWRkcigxKTsKKyAgICBhZGRyLmxhYmVsc1swXSA9IHJldHZhbFswXS5maXJzdC5sYWJlbHNbcGtnTGV2ZWxdOworICAgIHJldHZhbFswXS5maXJzdCA9IGFkZHI7CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPCAwKSB7CisgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA9IDA7CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X3RvcG9sb2d5KHJldHZhbCwgMSwgMSwgMCwgLTEsIC0xKTsKKyAgICB9CisKKyAgICAqYWRkcmVzczJvcyA9IHJldHZhbDsKKyAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICAvLyBTb3J0IHRoZSB0YWJsZSBieSBwaHlzaWNhbCBJZC4KKyAgcXNvcnQocmV0dmFsLCBuQXBpY3MsIHNpemVvZigqcmV0dmFsKSwgX19rbXBfYWZmaW5pdHlfY21wX0FkZHJlc3NfbGFiZWxzKTsKKworICAvLyBGaW5kIHRoZSByYWRpeCBhdCBlYWNoIG9mIHRoZSBsZXZlbHMuCisgIHVuc2lnbmVkICp0b3RhbHMgPSAodW5zaWduZWQgKilfX2ttcF9hbGxvY2F0ZShkZXB0aCAqIHNpemVvZih1bnNpZ25lZCkpOworICB1bnNpZ25lZCAqY291bnRzID0gKHVuc2lnbmVkICopX19rbXBfYWxsb2NhdGUoZGVwdGggKiBzaXplb2YodW5zaWduZWQpKTsKKyAgdW5zaWduZWQgKm1heEN0ID0gKHVuc2lnbmVkICopX19rbXBfYWxsb2NhdGUoZGVwdGggKiBzaXplb2YodW5zaWduZWQpKTsKKyAgdW5zaWduZWQgKmxhc3QgPSAodW5zaWduZWQgKilfX2ttcF9hbGxvY2F0ZShkZXB0aCAqIHNpemVvZih1bnNpZ25lZCkpOworICBmb3IgKGxldmVsID0gMDsgbGV2ZWwgPCBkZXB0aDsgbGV2ZWwrKykgeworICAgIHRvdGFsc1tsZXZlbF0gPSAxOworICAgIG1heEN0W2xldmVsXSA9IDE7CisgICAgY291bnRzW2xldmVsXSA9IDE7CisgICAgbGFzdFtsZXZlbF0gPSByZXR2YWxbMF0uZmlyc3QubGFiZWxzW2xldmVsXTsKKyAgfQorCisgIC8vIEZyb20gaGVyZSBvbiwgdGhlIGl0ZXJhdGlvbiB2YXJpYWJsZSAibGV2ZWwiIHJ1bnMgZnJvbSB0aGUgZmluZXN0IGxldmVsIHRvCisgIC8vIHRoZSBjb2Fyc2VzdCwgaS5lLiB3ZSBpdGVyYXRlIGZvcndhcmQgdGhyb3VnaAorICAvLyAoKmFkZHJlc3Myb3MpW10uZmlyc3QubGFiZWxzW10gLSBpbiB0aGUgcHJldmlvdXMgbG9vcHMsIHdlIGl0ZXJhdGVkCisgIC8vIGJhY2t3YXJkcy4KKyAgZm9yIChwcm9jID0gMTsgKGludClwcm9jIDwgbkFwaWNzOyBwcm9jKyspIHsKKyAgICBpbnQgbGV2ZWw7CisgICAgZm9yIChsZXZlbCA9IDA7IGxldmVsIDwgZGVwdGg7IGxldmVsKyspIHsKKyAgICAgIGlmIChyZXR2YWxbcHJvY10uZmlyc3QubGFiZWxzW2xldmVsXSAhPSBsYXN0W2xldmVsXSkgeworICAgICAgICBpbnQgajsKKyAgICAgICAgZm9yIChqID0gbGV2ZWwgKyAxOyBqIDwgZGVwdGg7IGorKykgeworICAgICAgICAgIHRvdGFsc1tqXSsrOworICAgICAgICAgIGNvdW50c1tqXSA9IDE7CisgICAgICAgICAgLy8gVGhlIGxpbmUgYmVsb3cgY2F1c2VzIHByaW50aW5nIGluY29ycmVjdCB0b3BvbG9neSBpbmZvcm1hdGlvbiBpbgorICAgICAgICAgIC8vIGNhc2UgdGhlIG1heCB2YWx1ZSBmb3Igc29tZSBsZXZlbCAobWF4Q3RbbGV2ZWxdKSBpcyBlbmNvdW50ZXJlZAorICAgICAgICAgIC8vIGVhcmxpZXIgdGhhbiBzb21lIGxlc3MgdmFsdWUgd2hpbGUgZ29pbmcgdGhyb3VnaCB0aGUgYXJyYXkuIEZvcgorICAgICAgICAgIC8vIGV4YW1wbGUsIGxldCBwa2cwIGhhcyA0IGNvcmVzIGFuZCBwa2cxIGhhcyAyIGNvcmVzLiBUaGVuCisgICAgICAgICAgLy8gbWF4Q3RbMV0gPT0gMgorICAgICAgICAgIC8vIHdoZXJlYXMgaXQgbXVzdCBiZSA0LgorICAgICAgICAgIC8vIFRPRE8hISEgQ2hlY2sgaWYgaXQgY2FuIGJlIGNvbW1lbnRlZCBzYWZlbHkKKyAgICAgICAgICAvLyBtYXhDdFtqXSA9IDE7CisgICAgICAgICAgbGFzdFtqXSA9IHJldHZhbFtwcm9jXS5maXJzdC5sYWJlbHNbal07CisgICAgICAgIH0KKyAgICAgICAgdG90YWxzW2xldmVsXSsrOworICAgICAgICBjb3VudHNbbGV2ZWxdKys7CisgICAgICAgIGlmIChjb3VudHNbbGV2ZWxdID4gbWF4Q3RbbGV2ZWxdKSB7CisgICAgICAgICAgbWF4Q3RbbGV2ZWxdID0gY291bnRzW2xldmVsXTsKKyAgICAgICAgfQorICAgICAgICBsYXN0W2xldmVsXSA9IHJldHZhbFtwcm9jXS5maXJzdC5sYWJlbHNbbGV2ZWxdOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSBpZiAobGV2ZWwgPT0gZGVwdGggLSAxKSB7CisgICAgICAgIF9fa21wX2ZyZWUobGFzdCk7CisgICAgICAgIF9fa21wX2ZyZWUobWF4Q3QpOworICAgICAgICBfX2ttcF9mcmVlKGNvdW50cyk7CisgICAgICAgIF9fa21wX2ZyZWUodG90YWxzKTsKKyAgICAgICAgX19rbXBfZnJlZShyZXR2YWwpOworICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfeDJBcGljSURzTm90VW5pcXVlOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gV2hlbiBhZmZpbml0eSBpcyBvZmYsIHRoaXMgcm91dGluZSB3aWxsIHN0aWxsIGJlIGNhbGxlZCB0byBzZXQKKyAgLy8gX19rbXBfbmNvcmVzLCBhcyB3ZWxsIGFzIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgbkNvcmVzUGVyUGtnLCAmIG5QYWNrYWdlcy4KKyAgLy8gTWFrZSBzdXJlIGFsbCB0aGVzZSB2YXJzIGFyZSBzZXQgY29ycmVjdGx5LCBhbmQgcmV0dXJuIGlmIGFmZmluaXR5IGlzIG5vdAorICAvLyBlbmFibGVkLgorICBpZiAodGhyZWFkTGV2ZWwgPj0gMCkgeworICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IG1heEN0W3RocmVhZExldmVsXTsKKyAgfSBlbHNlIHsKKyAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSAxOworICB9CisgIG5QYWNrYWdlcyA9IHRvdGFsc1twa2dMZXZlbF07CisKKyAgaWYgKGNvcmVMZXZlbCA+PSAwKSB7CisgICAgX19rbXBfbmNvcmVzID0gdG90YWxzW2NvcmVMZXZlbF07CisgICAgbkNvcmVzUGVyUGtnID0gbWF4Q3RbY29yZUxldmVsXTsKKyAgfSBlbHNlIHsKKyAgICBfX2ttcF9uY29yZXMgPSBuUGFja2FnZXM7CisgICAgbkNvcmVzUGVyUGtnID0gMTsKKyAgfQorCisgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbWFjaGluZSB0b3BvbG9neSBpcyB1bmlmb3JtCisgIHVuc2lnbmVkIHByb2QgPSBtYXhDdFswXTsKKyAgZm9yIChsZXZlbCA9IDE7IGxldmVsIDwgZGVwdGg7IGxldmVsKyspIHsKKyAgICBwcm9kICo9IG1heEN0W2xldmVsXTsKKyAgfQorICBib29sIHVuaWZvcm0gPSAocHJvZCA9PSB0b3RhbHNbbGV2ZWwgLSAxXSk7CisKKyAgLy8gUHJpbnQgdGhlIG1hY2hpbmUgdG9wb2xvZ3kgc3VtbWFyeS4KKyAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICBjaGFyIG1hc2tbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKG1hc2ssIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgb2xkTWFzayk7CisKKyAgICBLTVBfSU5GT1JNKEFmZlVzZUdsb2JDcHVpZEwxMSwgIktNUF9BRkZJTklUWSIpOworICAgIGlmIChfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2spIHsKKyAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBtYXNrKTsKKyAgICB9IGVsc2UgeworICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0Tm90UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIG1hc2spOworICAgIH0KKyAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgIGlmICh1bmlmb3JtKSB7CisgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICB9IGVsc2UgeworICAgICAgS01QX0lORk9STShOb25Vbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgfQorCisgICAga21wX3N0cl9idWZfdCBidWY7CisgICAgX19rbXBfc3RyX2J1Zl9pbml0KCZidWYpOworCisgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJWQiLCB0b3RhbHNbMF0pOworICAgIGZvciAobGV2ZWwgPSAxOyBsZXZlbCA8PSBwa2dMZXZlbDsgbGV2ZWwrKykgeworICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiIHggJWQiLCBtYXhDdFtsZXZlbF0pOworICAgIH0KKyAgICBLTVBfSU5GT1JNKFRvcG9sb2d5RXh0cmEsICJLTVBfQUZGSU5JVFkiLCBidWYuc3RyLCBuQ29yZXNQZXJQa2csCisgICAgICAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIF9fa21wX25jb3Jlcyk7CisKKyAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoJmJ1Zik7CisgIH0KKyAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9wdV9vc19pZHggPT0gTlVMTCk7CisgIEtNUF9ERUJVR19BU1NFUlQobkFwaWNzID09IF9fa21wX2F2YWlsX3Byb2MpOworICBfX2ttcF9wdV9vc19pZHggPSAoaW50ICopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKGludCkgKiBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgZm9yIChwcm9jID0gMDsgKGludClwcm9jIDwgbkFwaWNzOyArK3Byb2MpIHsKKyAgICBfX2ttcF9wdV9vc19pZHhbcHJvY10gPSByZXR2YWxbcHJvY10uc2Vjb25kOworICB9CisgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHsKKyAgICBfX2ttcF9mcmVlKGxhc3QpOworICAgIF9fa21wX2ZyZWUobWF4Q3QpOworICAgIF9fa21wX2ZyZWUoY291bnRzKTsKKyAgICBfX2ttcF9mcmVlKHRvdGFscyk7CisgICAgX19rbXBfZnJlZShyZXR2YWwpOworICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIEZpbmQgYW55IGxldmVscyB3aXRoIHJhZGlpeCAxLCBhbmQgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgbWFwCisgIC8vIChleGNlcHQgZm9yIHRoZSBwYWNrYWdlIGxldmVsKS4KKyAgaW50IG5ld19kZXB0aCA9IDA7CisgIGZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IGRlcHRoOyBsZXZlbCsrKSB7CisgICAgaWYgKChtYXhDdFtsZXZlbF0gPT0gMSkgJiYgKGxldmVsICE9IHBrZ0xldmVsKSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIG5ld19kZXB0aCsrOworICB9CisKKyAgLy8gSWYgd2UgYXJlIHJlbW92aW5nIGFueSBsZXZlbHMsIGFsbG9jYXRlIGEgbmV3IHZlY3RvciB0byByZXR1cm4sCisgIC8vIGFuZCBjb3B5IHRoZSByZWxldmFudCBpbmZvcm1hdGlvbiB0byBpdC4KKyAgaWYgKG5ld19kZXB0aCAhPSBkZXB0aCkgeworICAgIEFkZHJVbnNQYWlyICpuZXdfcmV0dmFsID0KKyAgICAgICAgKEFkZHJVbnNQYWlyICopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKEFkZHJVbnNQYWlyKSAqIG5BcGljcyk7CisgICAgZm9yIChwcm9jID0gMDsgKGludClwcm9jIDwgbkFwaWNzOyBwcm9jKyspIHsKKyAgICAgIEFkZHJlc3MgYWRkcihuZXdfZGVwdGgpOworICAgICAgbmV3X3JldHZhbFtwcm9jXSA9IEFkZHJVbnNQYWlyKGFkZHIsIHJldHZhbFtwcm9jXS5zZWNvbmQpOworICAgIH0KKyAgICBpbnQgbmV3X2xldmVsID0gMDsKKyAgICBpbnQgbmV3UGtnTGV2ZWwgPSAtMTsKKyAgICBpbnQgbmV3Q29yZUxldmVsID0gLTE7CisgICAgaW50IG5ld1RocmVhZExldmVsID0gLTE7CisgICAgaW50IGk7CisgICAgZm9yIChsZXZlbCA9IDA7IGxldmVsIDwgZGVwdGg7IGxldmVsKyspIHsKKyAgICAgIGlmICgobWF4Q3RbbGV2ZWxdID09IDEpICYmIChsZXZlbCAhPSBwa2dMZXZlbCkpIHsKKyAgICAgICAgLy8gUmVtb3ZlIHRoaXMgbGV2ZWwuIE5ldmVyIHJlbW92ZSB0aGUgcGFja2FnZSBsZXZlbAorICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChsZXZlbCA9PSBwa2dMZXZlbCkgeworICAgICAgICBuZXdQa2dMZXZlbCA9IGxldmVsOworICAgICAgfQorICAgICAgaWYgKGxldmVsID09IGNvcmVMZXZlbCkgeworICAgICAgICBuZXdDb3JlTGV2ZWwgPSBsZXZlbDsKKyAgICAgIH0KKyAgICAgIGlmIChsZXZlbCA9PSB0aHJlYWRMZXZlbCkgeworICAgICAgICBuZXdUaHJlYWRMZXZlbCA9IGxldmVsOworICAgICAgfQorICAgICAgZm9yIChwcm9jID0gMDsgKGludClwcm9jIDwgbkFwaWNzOyBwcm9jKyspIHsKKyAgICAgICAgbmV3X3JldHZhbFtwcm9jXS5maXJzdC5sYWJlbHNbbmV3X2xldmVsXSA9CisgICAgICAgICAgICByZXR2YWxbcHJvY10uZmlyc3QubGFiZWxzW2xldmVsXTsKKyAgICAgIH0KKyAgICAgIG5ld19sZXZlbCsrOworICAgIH0KKworICAgIF9fa21wX2ZyZWUocmV0dmFsKTsKKyAgICByZXR2YWwgPSBuZXdfcmV0dmFsOworICAgIGRlcHRoID0gbmV3X2RlcHRoOworICAgIHBrZ0xldmVsID0gbmV3UGtnTGV2ZWw7CisgICAgY29yZUxldmVsID0gbmV3Q29yZUxldmVsOworICAgIHRocmVhZExldmVsID0gbmV3VGhyZWFkTGV2ZWw7CisgIH0KKworICBpZiAoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPCAwKSB7CisgICAgLy8gU2V0IHRoZSBncmFudWxhcml0eSBsZXZlbCBiYXNlZCBvbiB3aGF0IGxldmVscyBhcmUgbW9kZWxlZAorICAgIC8vIGluIHRoZSBtYWNoaW5lIHRvcG9sb2d5IG1hcC4KKyAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA9IDA7CisgICAgaWYgKCh0aHJlYWRMZXZlbCA+PSAwKSAmJiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA+IGFmZmluaXR5X2dyYW5fdGhyZWFkKSkgeworICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICB9CisgICAgaWYgKChjb3JlTGV2ZWwgPj0gMCkgJiYgKF9fa21wX2FmZmluaXR5X2dyYW4gPiBhZmZpbml0eV9ncmFuX2NvcmUpKSB7CisgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgIH0KKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA+IGFmZmluaXR5X2dyYW5fcGFja2FnZSkgeworICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICB9CisgIH0KKworICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgIF9fa21wX2FmZmluaXR5X3ByaW50X3RvcG9sb2d5KHJldHZhbCwgbkFwaWNzLCBkZXB0aCwgcGtnTGV2ZWwsIGNvcmVMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRMZXZlbCk7CisgIH0KKworICBfX2ttcF9mcmVlKGxhc3QpOworICBfX2ttcF9mcmVlKG1heEN0KTsKKyAgX19rbXBfZnJlZShjb3VudHMpOworICBfX2ttcF9mcmVlKHRvdGFscyk7CisgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgKmFkZHJlc3Myb3MgPSByZXR2YWw7CisgIHJldHVybiBkZXB0aDsKK30KKworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworI2RlZmluZSBvc0lkSW5kZXggMAorI2RlZmluZSB0aHJlYWRJZEluZGV4IDEKKyNkZWZpbmUgY29yZUlkSW5kZXggMgorI2RlZmluZSBwa2dJZEluZGV4IDMKKyNkZWZpbmUgbm9kZUlkSW5kZXggNAorCit0eXBlZGVmIHVuc2lnbmVkICpQcm9jQ3B1SW5mbzsKK3N0YXRpYyB1bnNpZ25lZCBtYXhJbmRleCA9IHBrZ0lkSW5kZXg7CisKK3N0YXRpYyBpbnQgX19rbXBfYWZmaW5pdHlfY21wX1Byb2NDcHVJbmZvX29zX2lkKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpIHsKKyAgY29uc3QgdW5zaWduZWQgKmFhID0gKGNvbnN0IHVuc2lnbmVkICopYTsKKyAgY29uc3QgdW5zaWduZWQgKmJiID0gKGNvbnN0IHVuc2lnbmVkICopYjsKKyAgaWYgKGFhW29zSWRJbmRleF0gPCBiYltvc0lkSW5kZXhdKQorICAgIHJldHVybiAtMTsKKyAgaWYgKGFhW29zSWRJbmRleF0gPiBiYltvc0lkSW5kZXhdKQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK307CisKK3N0YXRpYyBpbnQgX19rbXBfYWZmaW5pdHlfY21wX1Byb2NDcHVJbmZvX3BoeXNfaWQoY29uc3Qgdm9pZCAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYikgeworICB1bnNpZ25lZCBpOworICBjb25zdCB1bnNpZ25lZCAqYWEgPSAqKHVuc2lnbmVkICpjb25zdCAqKWE7CisgIGNvbnN0IHVuc2lnbmVkICpiYiA9ICoodW5zaWduZWQgKmNvbnN0ICopYjsKKyAgZm9yIChpID0gbWF4SW5kZXg7OyBpLS0pIHsKKyAgICBpZiAoYWFbaV0gPCBiYltpXSkKKyAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoYWFbaV0gPiBiYltpXSkKKyAgICAgIHJldHVybiAxOworICAgIGlmIChpID09IG9zSWRJbmRleCkKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiAwOworfQorCisvLyBQYXJzZSAvcHJvYy9jcHVpbmZvIChvciBhbiBhbHRlcm5hdGUgZmlsZSBpbiB0aGUgc2FtZSBmb3JtYXQpIHRvIG9idGFpbiB0aGUKKy8vIGFmZmluaXR5IG1hcC4KK3N0YXRpYyBpbnQgX19rbXBfYWZmaW5pdHlfY3JlYXRlX2NwdWluZm9fbWFwKEFkZHJVbnNQYWlyICoqYWRkcmVzczJvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pMThuX2lkX3QgKmNvbnN0IG1zZ19pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEUgKmYpIHsKKyAgKmFkZHJlc3Myb3MgPSBOVUxMOworICAqbXNnX2lkID0ga21wX2kxOG5fbnVsbDsKKworICAvLyBTY2FuIG9mIHRoZSBmaWxlLCBhbmQgY291bnQgdGhlIG51bWJlciBvZiAicHJvY2Vzc29yIiAob3NJZCkgZmllbGRzLAorICAvLyBhbmQgZmluZCB0aGUgaGlnaGVzdCB2YWx1ZSBvZiA8bj4gZm9yIGEgbm9kZV88bj4gZmllbGQuCisgIGNoYXIgYnVmWzI1Nl07CisgIHVuc2lnbmVkIG51bV9yZWNvcmRzID0gMDsKKyAgd2hpbGUgKCFmZW9mKGYpKSB7CisgICAgYnVmW3NpemVvZihidWYpIC0gMV0gPSAxOworICAgIGlmICghZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZikpIHsKKyAgICAgIC8vIFJlYWQgZXJyb3JzIHByZXN1bWFibHkgYmVjYXVzZSBvZiBFT0YKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNoYXIgczFbXSA9ICJwcm9jZXNzb3IiOworICAgIGlmIChzdHJuY21wKGJ1ZiwgczEsIHNpemVvZihzMSkgLSAxKSA9PSAwKSB7CisgICAgICBudW1fcmVjb3JkcysrOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gRklYTUUgLSB0aGlzIHdpbGwgbWF0Y2ggIm5vZGVfPG4+IDxnYXJiYWdlPiIKKyAgICB1bnNpZ25lZCBsZXZlbDsKKyAgICBpZiAoS01QX1NTQ0FORihidWYsICJub2RlXyV1IGlkIiwgJmxldmVsKSA9PSAxKSB7CisgICAgICBpZiAobm9kZUlkSW5kZXggKyBsZXZlbCA+PSBtYXhJbmRleCkgeworICAgICAgICBtYXhJbmRleCA9IG5vZGVJZEluZGV4ICsgbGV2ZWw7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisgIH0KKworICAvLyBDaGVjayBmb3IgZW1wdHkgZmlsZSAvIG5vIHZhbGlkIHByb2Nlc3NvciByZWNvcmRzLCBvciB0b28gbWFueS4gVGhlIG51bWJlcgorICAvLyBvZiByZWNvcmRzIGNhbid0IGV4Y2VlZCB0aGUgbnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gdGhlIGFmZmluaXR5IG1hc2suCisgIGlmIChudW1fcmVjb3JkcyA9PSAwKSB7CisgICAgKmxpbmUgPSAwOworICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfTm9Qcm9jUmVjb3JkczsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYgKG51bV9yZWNvcmRzID4gKHVuc2lnbmVkKV9fa21wX3hwcm9jKSB7CisgICAgKmxpbmUgPSAwOworICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfVG9vTWFueVByb2NSZWNvcmRzOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8vIFNldCB0aGUgZmlsZSBwb2ludGVyIGJhY2sgdG8gdGhlIGJlZ2dpbm5pbmcsIHNvIHRoYXQgd2UgY2FuIHNjYW4gdGhlIGZpbGUKKyAgLy8gYWdhaW4sIHRoaXMgdGltZSBwZXJmb3JtaW5nIGEgZnVsbCBwYXJzZSBvZiB0aGUgZGF0YS4gQWxsb2NhdGUgYSB2ZWN0b3Igb2YKKyAgLy8gUHJvY0NwdUluZm8gb2JqZWN0LCB3aGVyZSB3ZSB3aWxsIHBsYWNlIHRoZSBkYXRhLiBBZGRpbmcgYW4gZXh0cmEgZWxlbWVudAorICAvLyBhdCB0aGUgZW5kIGFsbG93cyB1cyB0byByZW1vdmUgYSBsb3Qgb2YgZXh0cmEgY2hlY2tzIGZvciB0ZXJtaW5hdGlvbgorICAvLyBjb25kaXRpb25zLgorICBpZiAoZnNlZWsoZiwgMCwgU0VFS19TRVQpICE9IDApIHsKKyAgICAqbGluZSA9IDA7CisgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9DYW50UmV3aW5kQ3B1aW5mbzsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvLyBBbGxvY2F0ZSB0aGUgYXJyYXkgb2YgcmVjb3JkcyB0byBzdG9yZSB0aGUgcHJvYyBpbmZvIGluLiAgVGhlIGR1bW15CisgIC8vIGVsZW1lbnQgYXQgdGhlIGVuZCBtYWtlcyB0aGUgbG9naWMgaW4gZmlsbGluZyB0aGVtIG91dCBlYXNpZXIgdG8gY29kZS4KKyAgdW5zaWduZWQgKip0aHJlYWRJbmZvID0KKyAgICAgICh1bnNpZ25lZCAqKilfX2ttcF9hbGxvY2F0ZSgobnVtX3JlY29yZHMgKyAxKSAqIHNpemVvZih1bnNpZ25lZCAqKSk7CisgIHVuc2lnbmVkIGk7CisgIGZvciAoaSA9IDA7IGkgPD0gbnVtX3JlY29yZHM7IGkrKykgeworICAgIHRocmVhZEluZm9baV0gPQorICAgICAgICAodW5zaWduZWQgKilfX2ttcF9hbGxvY2F0ZSgobWF4SW5kZXggKyAxKSAqIHNpemVvZih1bnNpZ25lZCkpOworICB9CisKKyNkZWZpbmUgQ0xFQU5VUF9USFJFQURfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoaSA9IDA7IGkgPD0gbnVtX3JlY29yZHM7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2ZyZWUodGhyZWFkSW5mb1tpXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX2ZyZWUodGhyZWFkSW5mbyk7CisKKyAgLy8gQSB2YWx1ZSBvZiBVSU5UX01BWCBtZWFucyB0aGF0IHdlIGRpZG4ndCBmaW5kIHRoZSBmaWVsZAorICB1bnNpZ25lZCBfX2luZGV4OworCisjZGVmaW5lIElOSVRfUFJPQ19JTkZPKHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKF9faW5kZXggPSAwOyBfX2luZGV4IDw9IG1heEluZGV4OyBfX2luZGV4KyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAocClbX19pbmRleF0gPSBVSU5UX01BWDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworICBmb3IgKGkgPSAwOyBpIDw9IG51bV9yZWNvcmRzOyBpKyspIHsKKyAgICBJTklUX1BST0NfSU5GTyh0aHJlYWRJbmZvW2ldKTsKKyAgfQorCisgIHVuc2lnbmVkIG51bV9hdmFpbCA9IDA7CisgICpsaW5lID0gMDsKKyAgd2hpbGUgKCFmZW9mKGYpKSB7CisgICAgLy8gQ3JlYXRlIGFuIGlubmVyIHNjb3BpbmcgbGV2ZWwsIHNvIHRoYXQgYWxsIHRoZSBnb3RvIHRhcmdldHMgYXQgdGhlIGVuZCBvZgorICAgIC8vIHRoZSBsb29wIGFwcGVhciBpbiBhbiBvdXRlciBzY29waW5nIGxldmVsLiBUaGlzIGF2b2lkcyB3YXJuaW5ncyBhYm91dAorICAgIC8vIGp1bXBpbmcgcGFzdCBhbiBpbml0aWFsaXphdGlvbiB0byBhIHRhcmdldCBpbiB0aGUgc2FtZSBibG9jay4KKyAgICB7CisgICAgICBidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9IDE7CisgICAgICBib29sIGxvbmdfbGluZSA9IGZhbHNlOworICAgICAgaWYgKCFmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmKSkgeworICAgICAgICAvLyBSZWFkIGVycm9ycyBwcmVzdW1hYmx5IGJlY2F1c2Ugb2YgRU9GCisgICAgICAgIC8vIElmIHRoZXJlIGlzIHZhbGlkIGRhdGEgaW4gdGhyZWFkSW5mb1tudW1fYXZhaWxdLCB0aGVuIGZha2UKKyAgICAgICAgLy8gYSBibGFuayBsaW5lIGluIGVuc3VyZSB0aGF0IHRoZSBsYXN0IGFkZHJlc3MgZ2V0cyBwYXJzZWQuCisgICAgICAgIGJvb2wgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8PSBtYXhJbmRleDsgaSsrKSB7CisgICAgICAgICAgaWYgKHRocmVhZEluZm9bbnVtX2F2YWlsXVtpXSAhPSBVSU5UX01BWCkgeworICAgICAgICAgICAgdmFsaWQgPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXZhbGlkKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnVmWzBdID0gMDsKKyAgICAgIH0gZWxzZSBpZiAoIWJ1ZltzaXplb2YoYnVmKSAtIDFdKSB7CisgICAgICAgIC8vIFRoZSBsaW5lIGlzIGxvbmdlciB0aGFuIHRoZSBidWZmZXIuICBTZXQgYSBmbGFnIGFuZCBkb24ndAorICAgICAgICAvLyBlbWl0IGFuIGVycm9yIGlmIHdlIHdlcmUgZ29pbmcgdG8gaWdub3JlIHRoZSBsaW5lLCBhbnl3YXkuCisgICAgICAgIGxvbmdfbGluZSA9IHRydWU7CisKKyNkZWZpbmUgQ0hFQ0tfTElORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChsb25nX2xpbmUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENMRUFOVVBfVEhSRUFEX0lORk87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0xvbmdMaW5lQ3B1aW5mbzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisgICAgICB9CisgICAgICAoKmxpbmUpKys7CisKKyAgICAgIGNoYXIgczFbXSA9ICJwcm9jZXNzb3IiOworICAgICAgaWYgKHN0cm5jbXAoYnVmLCBzMSwgc2l6ZW9mKHMxKSAtIDEpID09IDApIHsKKyAgICAgICAgQ0hFQ0tfTElORTsKKyAgICAgICAgY2hhciAqcCA9IHN0cmNocihidWYgKyBzaXplb2YoczEpIC0gMSwgJzonKTsKKyAgICAgICAgdW5zaWduZWQgdmFsOworICAgICAgICBpZiAoKHAgPT0gTlVMTCkgfHwgKEtNUF9TU0NBTkYocCArIDEsICIldVxuIiwgJnZhbCkgIT0gMSkpCisgICAgICAgICAgZ290byBub192YWw7CisgICAgICAgIGlmICh0aHJlYWRJbmZvW251bV9hdmFpbF1bb3NJZEluZGV4XSAhPSBVSU5UX01BWCkKKyAgICAgICAgICBnb3RvIGR1cF9maWVsZDsKKyAgICAgICAgdGhyZWFkSW5mb1tudW1fYXZhaWxdW29zSWRJbmRleF0gPSB2YWw7CisjaWYgS01QX09TX0xJTlVYICYmIFVTRV9TWVNGU19JTkZPCisgICAgICAgIGNoYXIgcGF0aFsyNTZdOworICAgICAgICBLTVBfU05QUklOVEYoCisgICAgICAgICAgICBwYXRoLCBzaXplb2YocGF0aCksCisgICAgICAgICAgICAiL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1JXUvdG9wb2xvZ3kvcGh5c2ljYWxfcGFja2FnZV9pZCIsCisgICAgICAgICAgICB0aHJlYWRJbmZvW251bV9hdmFpbF1bb3NJZEluZGV4XSk7CisgICAgICAgIF9fa21wX3JlYWRfZnJvbV9maWxlKHBhdGgsICIldSIsICZ0aHJlYWRJbmZvW251bV9hdmFpbF1bcGtnSWRJbmRleF0pOworCisgICAgICAgIEtNUF9TTlBSSU5URihwYXRoLCBzaXplb2YocGF0aCksCisgICAgICAgICAgICAgICAgICAgICAiL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1JXUvdG9wb2xvZ3kvY29yZV9pZCIsCisgICAgICAgICAgICAgICAgICAgICB0aHJlYWRJbmZvW251bV9hdmFpbF1bb3NJZEluZGV4XSk7CisgICAgICAgIF9fa21wX3JlYWRfZnJvbV9maWxlKHBhdGgsICIldSIsICZ0aHJlYWRJbmZvW251bV9hdmFpbF1bY29yZUlkSW5kZXhdKTsKKyAgICAgICAgY29udGludWU7CisjZWxzZQorICAgICAgfQorICAgICAgY2hhciBzMltdID0gInBoeXNpY2FsIGlkIjsKKyAgICAgIGlmIChzdHJuY21wKGJ1ZiwgczIsIHNpemVvZihzMikgLSAxKSA9PSAwKSB7CisgICAgICAgIENIRUNLX0xJTkU7CisgICAgICAgIGNoYXIgKnAgPSBzdHJjaHIoYnVmICsgc2l6ZW9mKHMyKSAtIDEsICc6Jyk7CisgICAgICAgIHVuc2lnbmVkIHZhbDsKKyAgICAgICAgaWYgKChwID09IE5VTEwpIHx8IChLTVBfU1NDQU5GKHAgKyAxLCAiJXVcbiIsICZ2YWwpICE9IDEpKQorICAgICAgICAgIGdvdG8gbm9fdmFsOworICAgICAgICBpZiAodGhyZWFkSW5mb1tudW1fYXZhaWxdW3BrZ0lkSW5kZXhdICE9IFVJTlRfTUFYKQorICAgICAgICAgIGdvdG8gZHVwX2ZpZWxkOworICAgICAgICB0aHJlYWRJbmZvW251bV9hdmFpbF1bcGtnSWRJbmRleF0gPSB2YWw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgY2hhciBzM1tdID0gImNvcmUgaWQiOworICAgICAgaWYgKHN0cm5jbXAoYnVmLCBzMywgc2l6ZW9mKHMzKSAtIDEpID09IDApIHsKKyAgICAgICAgQ0hFQ0tfTElORTsKKyAgICAgICAgY2hhciAqcCA9IHN0cmNocihidWYgKyBzaXplb2YoczMpIC0gMSwgJzonKTsKKyAgICAgICAgdW5zaWduZWQgdmFsOworICAgICAgICBpZiAoKHAgPT0gTlVMTCkgfHwgKEtNUF9TU0NBTkYocCArIDEsICIldVxuIiwgJnZhbCkgIT0gMSkpCisgICAgICAgICAgZ290byBub192YWw7CisgICAgICAgIGlmICh0aHJlYWRJbmZvW251bV9hdmFpbF1bY29yZUlkSW5kZXhdICE9IFVJTlRfTUFYKQorICAgICAgICAgIGdvdG8gZHVwX2ZpZWxkOworICAgICAgICB0aHJlYWRJbmZvW251bV9hdmFpbF1bY29yZUlkSW5kZXhdID0gdmFsOworICAgICAgICBjb250aW51ZTsKKyNlbmRpZiAvLyBLTVBfT1NfTElOVVggJiYgVVNFX1NZU0ZTX0lORk8KKyAgICAgIH0KKyAgICAgIGNoYXIgczRbXSA9ICJ0aHJlYWQgaWQiOworICAgICAgaWYgKHN0cm5jbXAoYnVmLCBzNCwgc2l6ZW9mKHM0KSAtIDEpID09IDApIHsKKyAgICAgICAgQ0hFQ0tfTElORTsKKyAgICAgICAgY2hhciAqcCA9IHN0cmNocihidWYgKyBzaXplb2YoczQpIC0gMSwgJzonKTsKKyAgICAgICAgdW5zaWduZWQgdmFsOworICAgICAgICBpZiAoKHAgPT0gTlVMTCkgfHwgKEtNUF9TU0NBTkYocCArIDEsICIldVxuIiwgJnZhbCkgIT0gMSkpCisgICAgICAgICAgZ290byBub192YWw7CisgICAgICAgIGlmICh0aHJlYWRJbmZvW251bV9hdmFpbF1bdGhyZWFkSWRJbmRleF0gIT0gVUlOVF9NQVgpCisgICAgICAgICAgZ290byBkdXBfZmllbGQ7CisgICAgICAgIHRocmVhZEluZm9bbnVtX2F2YWlsXVt0aHJlYWRJZEluZGV4XSA9IHZhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICB1bnNpZ25lZCBsZXZlbDsKKyAgICAgIGlmIChLTVBfU1NDQU5GKGJ1ZiwgIm5vZGVfJWQgaWQiLCAmbGV2ZWwpID09IDEpIHsKKyAgICAgICAgQ0hFQ0tfTElORTsKKyAgICAgICAgY2hhciAqcCA9IHN0cmNocihidWYgKyBzaXplb2YoczQpIC0gMSwgJzonKTsKKyAgICAgICAgdW5zaWduZWQgdmFsOworICAgICAgICBpZiAoKHAgPT0gTlVMTCkgfHwgKEtNUF9TU0NBTkYocCArIDEsICIldVxuIiwgJnZhbCkgIT0gMSkpCisgICAgICAgICAgZ290byBub192YWw7CisgICAgICAgIEtNUF9BU1NFUlQobm9kZUlkSW5kZXggKyBsZXZlbCA8PSBtYXhJbmRleCk7CisgICAgICAgIGlmICh0aHJlYWRJbmZvW251bV9hdmFpbF1bbm9kZUlkSW5kZXggKyBsZXZlbF0gIT0gVUlOVF9NQVgpCisgICAgICAgICAgZ290byBkdXBfZmllbGQ7CisgICAgICAgIHRocmVhZEluZm9bbnVtX2F2YWlsXVtub2RlSWRJbmRleCArIGxldmVsXSA9IHZhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIFdlIGRpZG4ndCByZWNvZ25pemUgdGhlIGxlYWRpbmcgdG9rZW4gb24gdGhlIGxpbmUuIFRoZXJlIGFyZSBsb3RzIG9mCisgICAgICAvLyBsZWFkaW5nIHRva2VucyB0aGF0IHdlIGRvbid0IHJlY29nbml6ZSAtIGlmIHRoZSBsaW5lIGlzbid0IGVtcHR5LCBnbyBvbgorICAgICAgLy8gdG8gdGhlIG5leHQgbGluZS4KKyAgICAgIGlmICgoKmJ1ZiAhPSAwKSAmJiAoKmJ1ZiAhPSAnXG4nKSkgeworICAgICAgICAvLyBJZiB0aGUgbGluZSBpcyBsb25nZXIgdGhhbiB0aGUgYnVmZmVyLCByZWFkIGNoYXJhY3RlcnMKKyAgICAgICAgLy8gdW50aWwgd2UgZmluZCBhIG5ld2xpbmUuCisgICAgICAgIGlmIChsb25nX2xpbmUpIHsKKyAgICAgICAgICBpbnQgY2g7CisgICAgICAgICAgd2hpbGUgKCgoY2ggPSBmZ2V0YyhmKSkgIT0gRU9GKSAmJiAoY2ggIT0gJ1xuJykpCisgICAgICAgICAgICA7CisgICAgICAgIH0KKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIEEgbmV3bGluZSBoYXMgc2lnbmFsbGVkIHRoZSBlbmQgb2YgdGhlIHByb2Nlc3NvciByZWNvcmQuCisgICAgICAvLyBDaGVjayB0aGF0IHRoZXJlIGFyZW4ndCB0b28gbWFueSBwcm9jcyBzcGVjaWZpZWQuCisgICAgICBpZiAoKGludCludW1fYXZhaWwgPT0gX19rbXBfeHByb2MpIHsKKyAgICAgICAgQ0xFQU5VUF9USFJFQURfSU5GTzsKKyAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9Ub29NYW55RW50cmllczsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorCisgICAgICAvLyBDaGVjayBmb3IgbWlzc2luZyBmaWVsZHMuICBUaGUgb3NJZCBmaWVsZCBtdXN0IGJlIHRoZXJlLCBhbmQgd2UKKyAgICAgIC8vIGN1cnJlbnRseSByZXF1aXJlIHRoYXQgdGhlIHBoeXNpY2FsIGlkIGZpZWxkIGlzIHNwZWNpZmllZCwgYWxzby4KKyAgICAgIGlmICh0aHJlYWRJbmZvW251bV9hdmFpbF1bb3NJZEluZGV4XSA9PSBVSU5UX01BWCkgeworICAgICAgICBDTEVBTlVQX1RIUkVBRF9JTkZPOworICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX01pc3NpbmdQcm9jRmllbGQ7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGlmICh0aHJlYWRJbmZvWzBdW3BrZ0lkSW5kZXhdID09IFVJTlRfTUFYKSB7CisgICAgICAgIENMRUFOVVBfVEhSRUFEX0lORk87CisgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfTWlzc2luZ1BoeXNpY2FsSURGaWVsZDsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorCisgICAgICAvLyBTa2lwIHRoaXMgcHJvYyBpZiBpdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIG1hY2hpbmUgbW9kZWwuCisgICAgICBpZiAoIUtNUF9DUFVfSVNTRVQodGhyZWFkSW5mb1tudW1fYXZhaWxdW29zSWRJbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5fZnVsbE1hc2spKSB7CisgICAgICAgIElOSVRfUFJPQ19JTkZPKHRocmVhZEluZm9bbnVtX2F2YWlsXSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBXZSBoYXZlIGEgc3VjY2Vzc2Z1bCBwYXJzZSBvZiB0aGlzIHByb2MncyBpbmZvLgorICAgICAgLy8gSW5jcmVtZW50IHRoZSBjb3VudGVyLCBhbmQgcHJlcGFyZSBmb3IgdGhlIG5leHQgcHJvYy4KKyAgICAgIG51bV9hdmFpbCsrOworICAgICAgS01QX0FTU0VSVChudW1fYXZhaWwgPD0gbnVtX3JlY29yZHMpOworICAgICAgSU5JVF9QUk9DX0lORk8odGhyZWFkSW5mb1tudW1fYXZhaWxdKTsKKyAgICB9CisgICAgY29udGludWU7CisKKyAgbm9fdmFsOgorICAgIENMRUFOVVBfVEhSRUFEX0lORk87CisgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9NaXNzaW5nVmFsQ3B1aW5mbzsKKyAgICByZXR1cm4gLTE7CisKKyAgZHVwX2ZpZWxkOgorICAgIENMRUFOVVBfVEhSRUFEX0lORk87CisgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9EdXBsaWNhdGVGaWVsZENwdWluZm87CisgICAgcmV0dXJuIC0xOworICB9CisgICpsaW5lID0gMDsKKworI2lmIEtNUF9NSUMgJiYgUkVEVUNFX1RFQU1fU0laRQorICB1bnNpZ25lZCB0ZWFtU2l6ZSA9IDA7CisjZW5kaWYgLy8gS01QX01JQyAmJiBSRURVQ0VfVEVBTV9TSVpFCisKKyAgLy8gY2hlY2sgZm9yIG51bV9yZWNvcmRzID09IF9fa21wX3hwcm9jID8/PworCisgIC8vIElmIHRoZXJlJ3Mgb25seSBvbmUgdGhyZWFkIGNvbnRleHQgdG8gYmluZCB0bywgZm9ybSBhbiBBZGRyZXNzIG9iamVjdCB3aXRoCisgIC8vIGRlcHRoIDEgYW5kIHJldHVybiBpbW1lZGlhdGVseSAob3IsIGlmIGFmZmluaXR5IGlzIG9mZiwgc2V0IGFkZHJlc3Myb3MgdG8KKyAgLy8gTlVMTCBhbmQgcmV0dXJuKS4KKyAgLy8KKyAgLy8gSWYgaXQgaXMgY29uZmlndXJlZCB0byBvbWl0IHRoZSBwYWNrYWdlIGxldmVsIHdoZW4gdGhlcmUgaXMgb25seSBhIHNpbmdsZQorICAvLyBwYWNrYWdlLCB0aGUgbG9naWMgYXQgdGhlIGVuZCBvZiB0aGlzIHJvdXRpbmUgd29uJ3Qgd29yayBpZiB0aGVyZSBpcyBvbmx5IGEKKyAgLy8gc2luZ2xlIHRocmVhZCAtIGl0IHdvdWxkIHRyeSB0byBmb3JtIGFuIEFkZHJlc3Mgb2JqZWN0IHdpdGggZGVwdGggMC4KKyAgS01QX0FTU0VSVChudW1fYXZhaWwgPiAwKTsKKyAgS01QX0FTU0VSVChudW1fYXZhaWwgPD0gbnVtX3JlY29yZHMpOworICBpZiAobnVtX2F2YWlsID09IDEpIHsKKyAgICBfX2ttcF9uY29yZXMgPSAxOworICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IG5Db3Jlc1BlclBrZyA9IG5QYWNrYWdlcyA9IDE7CisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgIGlmICghS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgICAgICBLTVBfSU5GT1JNKEFmZk5vdENhcGFibGVVc2VDcHVpbmZvLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbl9mdWxsTWFzayk7CisgICAgICAgIEtNUF9JTkZPUk0oQWZmQ2FwYWJsZVVzZUNwdWluZm8sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaykgeworICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICB9CisgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgfQorICAgICAgaW50IGluZGV4OworICAgICAga21wX3N0cl9idWZfdCBidWY7CisgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoJmJ1Zik7CisgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIxIik7CisgICAgICBmb3IgKGluZGV4ID0gbWF4SW5kZXggLSAxOyBpbmRleCA+IHBrZ0lkSW5kZXg7IGluZGV4LS0pIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiIHggMSIpOworICAgICAgfQorICAgICAgS01QX0lORk9STShUb3BvbG9neUV4dHJhLCAiS01QX0FGRklOSVRZIiwgYnVmLnN0ciwgMSwgMSwgMSk7CisgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoJmJ1Zik7CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSkgeworICAgICAgQ0xFQU5VUF9USFJFQURfSU5GTzsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgICphZGRyZXNzMm9zID0gKEFkZHJVbnNQYWlyICopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKEFkZHJVbnNQYWlyKSk7CisgICAgQWRkcmVzcyBhZGRyKDEpOworICAgIGFkZHIubGFiZWxzWzBdID0gdGhyZWFkSW5mb1swXVtwa2dJZEluZGV4XTsKKyAgICAoKmFkZHJlc3Myb3MpWzBdID0gQWRkclVuc1BhaXIoYWRkciwgdGhyZWFkSW5mb1swXVtvc0lkSW5kZXhdKTsKKworICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA8IDApIHsKKyAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMDsKKyAgICB9CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfdG9wb2xvZ3koKmFkZHJlc3Myb3MsIDEsIDEsIDAsIC0xLCAtMSk7CisgICAgfQorCisgICAgQ0xFQU5VUF9USFJFQURfSU5GTzsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIC8vIFNvcnQgdGhlIHRocmVhZEluZm8gdGFibGUgYnkgcGh5c2ljYWwgSWQuCisgIHFzb3J0KHRocmVhZEluZm8sIG51bV9hdmFpbCwgc2l6ZW9mKCp0aHJlYWRJbmZvKSwKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfY21wX1Byb2NDcHVJbmZvX3BoeXNfaWQpOworCisgIC8vIFRoZSB0YWJsZSBpcyBub3cgc29ydGVkIGJ5IHBrZ0lkIC8gY29yZUlkIC8gdGhyZWFkSWQsIGJ1dCB3ZSByZWFsbHkgZG9uJ3QKKyAgLy8ga25vdyB0aGUgcmFkaXggb2YgYW55IG9mIHRoZSBmaWVsZHMuIHBrZ0lkJ3MgbWF5IGJlIHNwYXJzZWx5IGFzc2lnbmVkIGFtb25nCisgIC8vIHRoZSBjaGlwcyBvbiBhIHN5c3RlbS4gQWx0aG91Z2ggY29yZUlkJ3MgYXJlIHVzdWFsbHkgYXNzaWduZWQKKyAgLy8gWzAgLi4gY29yZXNQZXJQa2ctMV0gYW5kIHRocmVhZElkJ3MgYXJlIHVzdWFsbHkgYXNzaWduZWQKKyAgLy8gWzAuLnRocmVhZHNQZXJDb3JlLTFdLCB3ZSBkb24ndCB3YW50IHRvIG1ha2UgYW55IHN1Y2ggYXNzdW1wdGlvbnMuCisgIC8vCisgIC8vIEZvciB0aGF0IG1hdHRlciwgd2UgZG9uJ3Qga25vdyB3aGF0IGNvcmVzUGVyUGtnIGFuZCB0aHJlYWRzUGVyQ29yZSAob3IgdGhlCisgIC8vIHRvdGFsICMgcGFja2FnZXMpIGFyZSBhdCB0aGlzIHBvaW50IC0gd2Ugd2FudCB0byBkZXRlcm1pbmUgdGhhdCBub3cuIFdlCisgIC8vIG9ubHkgaGF2ZSBhbiB1cHBlciBib3VuZCBvbiB0aGUgZmlyc3QgdHdvIGZpZ3VyZXMuCisgIHVuc2lnbmVkICpjb3VudHMgPQorICAgICAgKHVuc2lnbmVkICopX19rbXBfYWxsb2NhdGUoKG1heEluZGV4ICsgMSkgKiBzaXplb2YodW5zaWduZWQpKTsKKyAgdW5zaWduZWQgKm1heEN0ID0KKyAgICAgICh1bnNpZ25lZCAqKV9fa21wX2FsbG9jYXRlKChtYXhJbmRleCArIDEpICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgIHVuc2lnbmVkICp0b3RhbHMgPQorICAgICAgKHVuc2lnbmVkICopX19rbXBfYWxsb2NhdGUoKG1heEluZGV4ICsgMSkgKiBzaXplb2YodW5zaWduZWQpKTsKKyAgdW5zaWduZWQgKmxhc3RJZCA9CisgICAgICAodW5zaWduZWQgKilfX2ttcF9hbGxvY2F0ZSgobWF4SW5kZXggKyAxKSAqIHNpemVvZih1bnNpZ25lZCkpOworCisgIGJvb2wgYXNzaWduX3RocmVhZF9pZHMgPSBmYWxzZTsKKyAgdW5zaWduZWQgdGhyZWFkSWRDdDsKKyAgdW5zaWduZWQgaW5kZXg7CisKK3Jlc3RhcnRfcmFkaXhfY2hlY2s6CisgIHRocmVhZElkQ3QgPSAwOworCisgIC8vIEluaXRpYWxpemUgdGhlIGNvdW50ZXIgYXJyYXlzIHdpdGggZGF0YSBmcm9tIHRocmVhZEluZm9bMF0uCisgIGlmIChhc3NpZ25fdGhyZWFkX2lkcykgeworICAgIGlmICh0aHJlYWRJbmZvWzBdW3RocmVhZElkSW5kZXhdID09IFVJTlRfTUFYKSB7CisgICAgICB0aHJlYWRJbmZvWzBdW3RocmVhZElkSW5kZXhdID0gdGhyZWFkSWRDdCsrOworICAgIH0gZWxzZSBpZiAodGhyZWFkSWRDdCA8PSB0aHJlYWRJbmZvWzBdW3RocmVhZElkSW5kZXhdKSB7CisgICAgICB0aHJlYWRJZEN0ID0gdGhyZWFkSW5mb1swXVt0aHJlYWRJZEluZGV4XSArIDE7CisgICAgfQorICB9CisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8PSBtYXhJbmRleDsgaW5kZXgrKykgeworICAgIGNvdW50c1tpbmRleF0gPSAxOworICAgIG1heEN0W2luZGV4XSA9IDE7CisgICAgdG90YWxzW2luZGV4XSA9IDE7CisgICAgbGFzdElkW2luZGV4XSA9IHRocmVhZEluZm9bMF1baW5kZXhdOworICAgIDsKKyAgfQorCisgIC8vIFJ1biB0aHJvdWdoIHRoZSByZXN0IG9mIHRoZSBPUyBwcm9jcy4KKyAgZm9yIChpID0gMTsgaSA8IG51bV9hdmFpbDsgaSsrKSB7CisgICAgLy8gRmluZCB0aGUgbW9zdCBzaWduaWZpY2FudCBpbmRleCB3aG9zZSBpZCBkaWZmZXJzIGZyb20gdGhlIGlkIGZvciB0aGUKKyAgICAvLyBwcmV2aW91cyBPUyBwcm9jLgorICAgIGZvciAoaW5kZXggPSBtYXhJbmRleDsgaW5kZXggPj0gdGhyZWFkSWRJbmRleDsgaW5kZXgtLSkgeworICAgICAgaWYgKGFzc2lnbl90aHJlYWRfaWRzICYmIChpbmRleCA9PSB0aHJlYWRJZEluZGV4KSkgeworICAgICAgICAvLyBBdXRvLWFzc2lnbiB0aGUgdGhyZWFkIGlkIGZpZWxkIGlmIGl0IHdhc24ndCBzcGVjaWZpZWQuCisgICAgICAgIGlmICh0aHJlYWRJbmZvW2ldW3RocmVhZElkSW5kZXhdID09IFVJTlRfTUFYKSB7CisgICAgICAgICAgdGhyZWFkSW5mb1tpXVt0aHJlYWRJZEluZGV4XSA9IHRocmVhZElkQ3QrKzsKKyAgICAgICAgfQorICAgICAgICAvLyBBcHBhcmVudGx5IHRoZSB0aHJlYWQgaWQgZmllbGQgd2FzIHNwZWNpZmllZCBmb3Igc29tZSBlbnRyaWVzIGFuZCBub3QKKyAgICAgICAgLy8gb3RoZXJzLiBTdGFydCB0aGUgdGhyZWFkIGlkIGNvdW50ZXIgb2ZmIGF0IHRoZSBuZXh0IGhpZ2hlciB0aHJlYWQgaWQuCisgICAgICAgIGVsc2UgaWYgKHRocmVhZElkQ3QgPD0gdGhyZWFkSW5mb1tpXVt0aHJlYWRJZEluZGV4XSkgeworICAgICAgICAgIHRocmVhZElkQ3QgPSB0aHJlYWRJbmZvW2ldW3RocmVhZElkSW5kZXhdICsgMTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHRocmVhZEluZm9baV1baW5kZXhdICE9IGxhc3RJZFtpbmRleF0pIHsKKyAgICAgICAgLy8gUnVuIHRocm91Z2ggYWxsIGluZGljZXMgd2hpY2ggYXJlIGxlc3Mgc2lnbmlmaWNhbnQsIGFuZCByZXNldCB0aGUKKyAgICAgICAgLy8gY291bnRzIHRvIDEuIEF0IGFsbCBsZXZlbHMgdXAgdG8gYW5kIGluY2x1ZGluZyBpbmRleCwgd2UgbmVlZCB0bworICAgICAgICAvLyBpbmNyZW1lbnQgdGhlIHRvdGFscyBhbmQgcmVjb3JkIHRoZSBsYXN0IGlkLgorICAgICAgICB1bnNpZ25lZCBpbmRleDI7CisgICAgICAgIGZvciAoaW5kZXgyID0gdGhyZWFkSWRJbmRleDsgaW5kZXgyIDwgaW5kZXg7IGluZGV4MisrKSB7CisgICAgICAgICAgdG90YWxzW2luZGV4Ml0rKzsKKyAgICAgICAgICBpZiAoY291bnRzW2luZGV4Ml0gPiBtYXhDdFtpbmRleDJdKSB7CisgICAgICAgICAgICBtYXhDdFtpbmRleDJdID0gY291bnRzW2luZGV4Ml07CisgICAgICAgICAgfQorICAgICAgICAgIGNvdW50c1tpbmRleDJdID0gMTsKKyAgICAgICAgICBsYXN0SWRbaW5kZXgyXSA9IHRocmVhZEluZm9baV1baW5kZXgyXTsKKyAgICAgICAgfQorICAgICAgICBjb3VudHNbaW5kZXhdKys7CisgICAgICAgIHRvdGFsc1tpbmRleF0rKzsKKyAgICAgICAgbGFzdElkW2luZGV4XSA9IHRocmVhZEluZm9baV1baW5kZXhdOworCisgICAgICAgIGlmIChhc3NpZ25fdGhyZWFkX2lkcyAmJiAoaW5kZXggPiB0aHJlYWRJZEluZGV4KSkgeworCisjaWYgS01QX01JQyAmJiBSRURVQ0VfVEVBTV9TSVpFCisgICAgICAgICAgLy8gVGhlIGRlZmF1bHQgdGVhbSBzaXplIGlzIHRoZSB0b3RhbCAjdGhyZWFkcyBpbiB0aGUgbWFjaGluZQorICAgICAgICAgIC8vIG1pbnVzIDEgdGhyZWFkIGZvciBldmVyeSBjb3JlIHRoYXQgaGFzIDMgb3IgbW9yZSB0aHJlYWRzLgorICAgICAgICAgIHRlYW1TaXplICs9ICh0aHJlYWRJZEN0IDw9IDIpID8gKHRocmVhZElkQ3QpIDogKHRocmVhZElkQ3QgLSAxKTsKKyNlbmRpZiAvLyBLTVBfTUlDICYmIFJFRFVDRV9URUFNX1NJWkUKKworICAgICAgICAgIC8vIFJlc3RhcnQgdGhlIHRocmVhZCBjb3VudGVyLCBhcyB3ZSBhcmUgb24gYSBuZXcgY29yZS4KKyAgICAgICAgICB0aHJlYWRJZEN0ID0gMDsKKworICAgICAgICAgIC8vIEF1dG8tYXNzaWduIHRoZSB0aHJlYWQgaWQgZmllbGQgaWYgaXQgd2Fzbid0IHNwZWNpZmllZC4KKyAgICAgICAgICBpZiAodGhyZWFkSW5mb1tpXVt0aHJlYWRJZEluZGV4XSA9PSBVSU5UX01BWCkgeworICAgICAgICAgICAgdGhyZWFkSW5mb1tpXVt0aHJlYWRJZEluZGV4XSA9IHRocmVhZElkQ3QrKzsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyBBcGFycmVudGx5IHRoZSB0aHJlYWQgaWQgZmllbGQgd2FzIHNwZWNpZmllZCBmb3Igc29tZSBlbnRyaWVzIGFuZAorICAgICAgICAgIC8vIG5vdCBvdGhlcnMuIFN0YXJ0IHRoZSB0aHJlYWQgaWQgY291bnRlciBvZmYgYXQgdGhlIG5leHQgaGlnaGVyCisgICAgICAgICAgLy8gdGhyZWFkIGlkLgorICAgICAgICAgIGVsc2UgaWYgKHRocmVhZElkQ3QgPD0gdGhyZWFkSW5mb1tpXVt0aHJlYWRJZEluZGV4XSkgeworICAgICAgICAgICAgdGhyZWFkSWRDdCA9IHRocmVhZEluZm9baV1bdGhyZWFkSWRJbmRleF0gKyAxOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGluZGV4IDwgdGhyZWFkSWRJbmRleCkgeworICAgICAgLy8gSWYgdGhyZWFkIGlkcyB3ZXJlIHNwZWNpZmllZCwgaXQgaXMgYW4gZXJyb3IgaWYgdGhleSBhcmUgbm90IHVuaXF1ZS4KKyAgICAgIC8vIEFsc28sIGNoZWNrIHRoYXQgd2Ugd2F2ZW4ndCBhbHJlYWR5IHJlc3RhcnRlZCB0aGUgbG9vcCAodG8gYmUgc2FmZSAtCisgICAgICAvLyBzaG91bGRuJ3QgbmVlZCB0bykuCisgICAgICBpZiAoKHRocmVhZEluZm9baV1bdGhyZWFkSWRJbmRleF0gIT0gVUlOVF9NQVgpIHx8IGFzc2lnbl90aHJlYWRfaWRzKSB7CisgICAgICAgIF9fa21wX2ZyZWUobGFzdElkKTsKKyAgICAgICAgX19rbXBfZnJlZSh0b3RhbHMpOworICAgICAgICBfX2ttcF9mcmVlKG1heEN0KTsKKyAgICAgICAgX19rbXBfZnJlZShjb3VudHMpOworICAgICAgICBDTEVBTlVQX1RIUkVBRF9JTkZPOworICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX1BoeXNpY2FsSURzTm90VW5pcXVlOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisKKyAgICAgIC8vIElmIHRoZSB0aHJlYWQgaWRzIHdlcmUgbm90IHNwZWNpZmllZCBhbmQgd2Ugc2VlIGVudHJpZXMgZW50cmllcyB0aGF0CisgICAgICAvLyBhcmUgZHVwbGljYXRlcywgc3RhcnQgdGhlIGxvb3Agb3ZlciBhbmQgYXNzaWduIHRoZSB0aHJlYWQgaWRzIG1hbnVhbGx5LgorICAgICAgYXNzaWduX3RocmVhZF9pZHMgPSB0cnVlOworICAgICAgZ290byByZXN0YXJ0X3JhZGl4X2NoZWNrOworICAgIH0KKyAgfQorCisjaWYgS01QX01JQyAmJiBSRURVQ0VfVEVBTV9TSVpFCisgIC8vIFRoZSBkZWZhdWx0IHRlYW0gc2l6ZSBpcyB0aGUgdG90YWwgI3RocmVhZHMgaW4gdGhlIG1hY2hpbmUKKyAgLy8gbWludXMgMSB0aHJlYWQgZm9yIGV2ZXJ5IGNvcmUgdGhhdCBoYXMgMyBvciBtb3JlIHRocmVhZHMuCisgIHRlYW1TaXplICs9ICh0aHJlYWRJZEN0IDw9IDIpID8gKHRocmVhZElkQ3QpIDogKHRocmVhZElkQ3QgLSAxKTsKKyNlbmRpZiAvLyBLTVBfTUlDICYmIFJFRFVDRV9URUFNX1NJWkUKKworICBmb3IgKGluZGV4ID0gdGhyZWFkSWRJbmRleDsgaW5kZXggPD0gbWF4SW5kZXg7IGluZGV4KyspIHsKKyAgICBpZiAoY291bnRzW2luZGV4XSA+IG1heEN0W2luZGV4XSkgeworICAgICAgbWF4Q3RbaW5kZXhdID0gY291bnRzW2luZGV4XTsKKyAgICB9CisgIH0KKworICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBtYXhDdFt0aHJlYWRJZEluZGV4XTsKKyAgbkNvcmVzUGVyUGtnID0gbWF4Q3RbY29yZUlkSW5kZXhdOworICBuUGFja2FnZXMgPSB0b3RhbHNbcGtnSWRJbmRleF07CisKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtYWNoaW5lIHRvcG9sb2d5IGlzIHVuaWZvcm0KKyAgdW5zaWduZWQgcHJvZCA9IHRvdGFsc1ttYXhJbmRleF07CisgIGZvciAoaW5kZXggPSB0aHJlYWRJZEluZGV4OyBpbmRleCA8IG1heEluZGV4OyBpbmRleCsrKSB7CisgICAgcHJvZCAqPSBtYXhDdFtpbmRleF07CisgIH0KKyAgYm9vbCB1bmlmb3JtID0gKHByb2QgPT0gdG90YWxzW3RocmVhZElkSW5kZXhdKTsKKworICAvLyBXaGVuIGFmZmluaXR5IGlzIG9mZiwgdGhpcyByb3V0aW5lIHdpbGwgc3RpbGwgYmUgY2FsbGVkIHRvIHNldAorICAvLyBfX2ttcF9uY29yZXMsIGFzIHdlbGwgYXMgX19rbXBfblRocmVhZHNQZXJDb3JlLCBuQ29yZXNQZXJQa2csICYgblBhY2thZ2VzLgorICAvLyBNYWtlIHN1cmUgYWxsIHRoZXNlIHZhcnMgYXJlIHNldCBjb3JyZWN0bHksIGFuZCByZXR1cm4gbm93IGlmIGFmZmluaXR5IGlzCisgIC8vIG5vdCBlbmFibGVkLgorICBfX2ttcF9uY29yZXMgPSB0b3RhbHNbY29yZUlkSW5kZXhdOworCisgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgaWYgKCFLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICBLTVBfSU5GT1JNKEFmZk5vdENhcGFibGVVc2VDcHVpbmZvLCAiS01QX0FGRklOSVRZIik7CisgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgaWYgKHVuaWZvcm0pIHsKKyAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBLTVBfSU5GT1JNKE5vblVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluX2Z1bGxNYXNrKTsKKyAgICAgIEtNUF9JTkZPUk0oQWZmQ2FwYWJsZVVzZUNwdWluZm8sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2spIHsKKyAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgICB9IGVsc2UgeworICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXROb3RSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgIH0KKyAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICBpZiAodW5pZm9ybSkgeworICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9JTkZPUk0oTm9uVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgfQorICAgIH0KKyAgICBrbXBfc3RyX2J1Zl90IGJ1ZjsKKyAgICBfX2ttcF9zdHJfYnVmX2luaXQoJmJ1Zik7CisKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIlZCIsIHRvdGFsc1ttYXhJbmRleF0pOworICAgIGZvciAoaW5kZXggPSBtYXhJbmRleCAtIDE7IGluZGV4ID49IHBrZ0lkSW5kZXg7IGluZGV4LS0pIHsKKyAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIiB4ICVkIiwgbWF4Q3RbaW5kZXhdKTsKKyAgICB9CisgICAgS01QX0lORk9STShUb3BvbG9neUV4dHJhLCAiS01QX0FGRklOSVRZIiwgYnVmLnN0ciwgbWF4Q3RbY29yZUlkSW5kZXhdLAorICAgICAgICAgICAgICAgbWF4Q3RbdGhyZWFkSWRJbmRleF0sIF9fa21wX25jb3Jlcyk7CisKKyAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoJmJ1Zik7CisgIH0KKworI2lmIEtNUF9NSUMgJiYgUkVEVUNFX1RFQU1fU0laRQorICAvLyBTZXQgdGhlIGRlZmF1bHQgdGVhbSBzaXplLgorICBpZiAoKF9fa21wX2RmbHRfdGVhbV9udGggPT0gMCkgJiYgKHRlYW1TaXplID4gMCkpIHsKKyAgICBfX2ttcF9kZmx0X3RlYW1fbnRoID0gdGVhbVNpemU7CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfYWZmaW5pdHlfY3JlYXRlX2NwdWluZm9fbWFwOiBzZXR0aW5nICIKKyAgICAgICAgICAgICAgICAgICJfX2ttcF9kZmx0X3RlYW1fbnRoID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoKSk7CisgIH0KKyNlbmRpZiAvLyBLTVBfTUlDICYmIFJFRFVDRV9URUFNX1NJWkUKKworICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX3B1X29zX2lkeCA9PSBOVUxMKTsKKyAgS01QX0RFQlVHX0FTU0VSVChudW1fYXZhaWwgPT0gX19rbXBfYXZhaWxfcHJvYyk7CisgIF9fa21wX3B1X29zX2lkeCA9IChpbnQgKilfX2ttcF9hbGxvY2F0ZShzaXplb2YoaW50KSAqIF9fa21wX2F2YWlsX3Byb2MpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2F2YWlsOyArK2kpIHsgLy8gZmlsbCB0aGUgb3MgaW5kaWNlcworICAgIF9fa21wX3B1X29zX2lkeFtpXSA9IHRocmVhZEluZm9baV1bb3NJZEluZGV4XTsKKyAgfQorCisgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHsKKyAgICBfX2ttcF9mcmVlKGxhc3RJZCk7CisgICAgX19rbXBfZnJlZSh0b3RhbHMpOworICAgIF9fa21wX2ZyZWUobWF4Q3QpOworICAgIF9fa21wX2ZyZWUoY291bnRzKTsKKyAgICBDTEVBTlVQX1RIUkVBRF9JTkZPOworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gQ291bnQgdGhlIG51bWJlciBvZiBsZXZlbHMgd2hpY2ggaGF2ZSBtb3JlIG5vZGVzIGF0IHRoYXQgbGV2ZWwgdGhhbiBhdCB0aGUKKyAgLy8gcGFyZW50J3MgbGV2ZWwgKHdpdGggdGhlcmUgYmVpbmcgYW4gaW1wbGljaXQgcm9vdCBub2RlIG9mIHRoZSB0b3AgbGV2ZWwpLgorICAvLyBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gc2F5aW5nIHRoYXQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIG5vZGUgYXQgdGhpcyBsZXZlbAorICAvLyB3aGljaCBoYXMgYSBzaWJsaW5nLiBUaGVzZSBsZXZlbHMgYXJlIGluIHRoZSBtYXAsIGFuZCB0aGUgcGFja2FnZSBsZXZlbCBpcworICAvLyBhbHdheXMgaW4gdGhlIG1hcC4KKyAgYm9vbCAqaW5NYXAgPSAoYm9vbCAqKV9fa21wX2FsbG9jYXRlKChtYXhJbmRleCArIDEpICogc2l6ZW9mKGJvb2wpKTsKKyAgaW50IGxldmVsID0gMDsKKyAgZm9yIChpbmRleCA9IHRocmVhZElkSW5kZXg7IGluZGV4IDwgbWF4SW5kZXg7IGluZGV4KyspIHsKKyAgICBLTVBfQVNTRVJUKHRvdGFsc1tpbmRleF0gPj0gdG90YWxzW2luZGV4ICsgMV0pOworICAgIGluTWFwW2luZGV4XSA9ICh0b3RhbHNbaW5kZXhdID4gdG90YWxzW2luZGV4ICsgMV0pOworICB9CisgIGluTWFwW21heEluZGV4XSA9ICh0b3RhbHNbbWF4SW5kZXhdID4gMSk7CisgIGluTWFwW3BrZ0lkSW5kZXhdID0gdHJ1ZTsKKworICBpbnQgZGVwdGggPSAwOworICBmb3IgKGluZGV4ID0gdGhyZWFkSWRJbmRleDsgaW5kZXggPD0gbWF4SW5kZXg7IGluZGV4KyspIHsKKyAgICBpZiAoaW5NYXBbaW5kZXhdKSB7CisgICAgICBkZXB0aCsrOworICAgIH0KKyAgfQorICBLTVBfQVNTRVJUKGRlcHRoID4gMCk7CisKKyAgLy8gQ29uc3RydWN0IHRoZSBkYXRhIHN0cnVjdHVyZSB0aGF0IGlzIHRvIGJlIHJldHVybmVkLgorICAqYWRkcmVzczJvcyA9IChBZGRyVW5zUGFpciAqKV9fa21wX2FsbG9jYXRlKHNpemVvZihBZGRyVW5zUGFpcikgKiBudW1fYXZhaWwpOworICBpbnQgcGtnTGV2ZWwgPSAtMTsKKyAgaW50IGNvcmVMZXZlbCA9IC0xOworICBpbnQgdGhyZWFkTGV2ZWwgPSAtMTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2F2YWlsOyArK2kpIHsKKyAgICBBZGRyZXNzIGFkZHIoZGVwdGgpOworICAgIHVuc2lnbmVkIG9zID0gdGhyZWFkSW5mb1tpXVtvc0lkSW5kZXhdOworICAgIGludCBzcmNfaW5kZXg7CisgICAgaW50IGRzdF9pbmRleCA9IDA7CisKKyAgICBmb3IgKHNyY19pbmRleCA9IG1heEluZGV4OyBzcmNfaW5kZXggPj0gdGhyZWFkSWRJbmRleDsgc3JjX2luZGV4LS0pIHsKKyAgICAgIGlmICghaW5NYXBbc3JjX2luZGV4XSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGFkZHIubGFiZWxzW2RzdF9pbmRleF0gPSB0aHJlYWRJbmZvW2ldW3NyY19pbmRleF07CisgICAgICBpZiAoc3JjX2luZGV4ID09IHBrZ0lkSW5kZXgpIHsKKyAgICAgICAgcGtnTGV2ZWwgPSBkc3RfaW5kZXg7CisgICAgICB9IGVsc2UgaWYgKHNyY19pbmRleCA9PSBjb3JlSWRJbmRleCkgeworICAgICAgICBjb3JlTGV2ZWwgPSBkc3RfaW5kZXg7CisgICAgICB9IGVsc2UgaWYgKHNyY19pbmRleCA9PSB0aHJlYWRJZEluZGV4KSB7CisgICAgICAgIHRocmVhZExldmVsID0gZHN0X2luZGV4OworICAgICAgfQorICAgICAgZHN0X2luZGV4Kys7CisgICAgfQorICAgICgqYWRkcmVzczJvcylbaV0gPSBBZGRyVW5zUGFpcihhZGRyLCBvcyk7CisgIH0KKworICBpZiAoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPCAwKSB7CisgICAgLy8gU2V0IHRoZSBncmFudWxhcml0eSBsZXZlbCBiYXNlZCBvbiB3aGF0IGxldmVscyBhcmUgbW9kZWxlZAorICAgIC8vIGluIHRoZSBtYWNoaW5lIHRvcG9sb2d5IG1hcC4KKyAgICB1bnNpZ25lZCBzcmNfaW5kZXg7CisgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAwOworICAgIGZvciAoc3JjX2luZGV4ID0gdGhyZWFkSWRJbmRleDsgc3JjX2luZGV4IDw9IG1heEluZGV4OyBzcmNfaW5kZXgrKykgeworICAgICAgaWYgKCFpbk1hcFtzcmNfaW5kZXhdKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgc3dpdGNoIChzcmNfaW5kZXgpIHsKKyAgICAgIGNhc2UgdGhyZWFkSWRJbmRleDoKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW4gPiBhZmZpbml0eV9ncmFuX3RocmVhZCkgeworICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzKys7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgY29yZUlkSW5kZXg6CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl9jb3JlKSB7CisgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBwa2dJZEluZGV4OgorICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA+IGFmZmluaXR5X2dyYW5fcGFja2FnZSkgeworICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzKys7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICBfX2ttcF9hZmZpbml0eV9wcmludF90b3BvbG9neSgqYWRkcmVzczJvcywgbnVtX2F2YWlsLCBkZXB0aCwgcGtnTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZUxldmVsLCB0aHJlYWRMZXZlbCk7CisgIH0KKworICBfX2ttcF9mcmVlKGluTWFwKTsKKyAgX19rbXBfZnJlZShsYXN0SWQpOworICBfX2ttcF9mcmVlKHRvdGFscyk7CisgIF9fa21wX2ZyZWUobWF4Q3QpOworICBfX2ttcF9mcmVlKGNvdW50cyk7CisgIENMRUFOVVBfVEhSRUFEX0lORk87CisgIHJldHVybiBkZXB0aDsKK30KKworLy8gQ3JlYXRlIGFuZCByZXR1cm4gYSB0YWJsZSBvZiBhZmZpbml0eSBtYXNrcywgaW5kZXhlZCBieSBPUyB0aHJlYWQgSUQuCisvLyBUaGlzIHJvdXRpbmUgaGFuZGxlcyBPUidpbmcgdG9nZXRoZXIgYWxsIHRoZSBhZmZpbml0eSBtYXNrcyBvZiB0aHJlYWRzCisvLyB0aGF0IGFyZSBzdWZmaWNpZW50bHkgY2xvc2UsIGlmIGdyYW51bGFyaXR5ID4gZmluZS4KK3N0YXRpYyBrbXBfYWZmaW5fbWFza190ICpfX2ttcF9jcmVhdGVfbWFza3ModW5zaWduZWQgKm1heEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqbnVtVW5pcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyVW5zUGFpciAqYWRkcmVzczJvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtQWRkcnMpIHsKKyAgLy8gRmlyc3QgZm9ybSBhIHRhYmxlIG9mIGFmZmluaXR5IG1hc2tzIGluIG9yZGVyIG9mIE9TIHRocmVhZCBpZC4KKyAgdW5zaWduZWQgZGVwdGg7CisgIHVuc2lnbmVkIG1heE9zSWQ7CisgIHVuc2lnbmVkIGk7CisKKyAgS01QX0FTU0VSVChudW1BZGRycyA+IDApOworICBkZXB0aCA9IGFkZHJlc3Myb3NbMF0uZmlyc3QuZGVwdGg7CisKKyAgbWF4T3NJZCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBudW1BZGRyczsgaSsrKSB7CisgICAgdW5zaWduZWQgb3NJZCA9IGFkZHJlc3Myb3NbaV0uc2Vjb25kOworICAgIGlmIChvc0lkID4gbWF4T3NJZCkgeworICAgICAgbWF4T3NJZCA9IG9zSWQ7CisgICAgfQorICB9CisgIGttcF9hZmZpbl9tYXNrX3QgKm9zSWQyTWFzazsKKyAgS01QX0NQVV9BTExPQ19BUlJBWShvc0lkMk1hc2ssIChtYXhPc0lkICsgMSkpOworCisgIC8vIFNvcnQgdGhlIGFkZHJlc3Myb3MgdGFibGUgYWNjb3JkaW5nIHRvIHBoeXNpY2FsIG9yZGVyLiBEb2luZyBzbyB3aWxsIHB1dAorICAvLyBhbGwgdGhyZWFkcyBvbiB0aGUgc2FtZSBjb3JlL3BhY2thZ2Uvbm9kZSBpbiBjb25zZWN1dGl2ZSBsb2NhdGlvbnMuCisgIHFzb3J0KGFkZHJlc3Myb3MsIG51bUFkZHJzLCBzaXplb2YoKmFkZHJlc3Myb3MpLAorICAgICAgICBfX2ttcF9hZmZpbml0eV9jbXBfQWRkcmVzc19sYWJlbHMpOworCisgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPj0gMCk7CisgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlICYmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA+IDApKSB7CisgICAgS01QX0lORk9STShUaHJlYWRzTWlncmF0ZSwgIktNUF9BRkZJTklUWSIsIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzKTsKKyAgfQorICBpZiAoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPj0gKGludClkZXB0aCkgeworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8CisgICAgICAgIChfX2ttcF9hZmZpbml0eV93YXJuaW5ncyAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKSkpIHsKKyAgICAgIEtNUF9XQVJOSU5HKEFmZlRocmVhZHNNYXlNaWdyYXRlKTsKKyAgICB9CisgIH0KKworICAvLyBSdW4gdGhyb3VnaCB0aGUgdGFibGUsIGZvcm1pbmcgdGhlIG1hc2tzIGZvciBhbGwgdGhyZWFkcyBvbiBlYWNoIGNvcmUuCisgIC8vIFRocmVhZHMgb24gdGhlIHNhbWUgY29yZSB3aWxsIGhhdmUgaWRlbnRpY2FsICJBZGRyZXNzIiBvYmplY3RzLCBub3QKKyAgLy8gY29uc2lkZXJpbmcgdGhlIGxhc3QgbGV2ZWwsIHdoaWNoIG11c3QgYmUgdGhlIHRocmVhZCBpZC4gQWxsIHRocmVhZHMgb24gYQorICAvLyBjb3JlIHdpbGwgYXBwZWFyIGNvbnNlY3V0aXZlbHkuCisgIHVuc2lnbmVkIHVuaXF1ZSA9IDA7CisgIHVuc2lnbmVkIGogPSAwOyAvLyBpbmRleCBvZiAxc3QgdGhyZWFkIG9uIGNvcmUKKyAgdW5zaWduZWQgbGVhZGVyID0gMDsKKyAgQWRkcmVzcyAqbGVhZGVyQWRkciA9ICYoYWRkcmVzczJvc1swXS5maXJzdCk7CisgIGttcF9hZmZpbl9tYXNrX3QgKnN1bTsKKyAgS01QX0NQVV9BTExPQ19PTl9TVEFDSyhzdW0pOworICBLTVBfQ1BVX1pFUk8oc3VtKTsKKyAgS01QX0NQVV9TRVQoYWRkcmVzczJvc1swXS5zZWNvbmQsIHN1bSk7CisgIGZvciAoaSA9IDE7IGkgPCBudW1BZGRyczsgaSsrKSB7CisgICAgLy8gSWYgdGhpcyB0aHJlYWQgaXMgc3VmZmljaWVudGx5IGNsb3NlIHRvIHRoZSBsZWFkZXIgKHdpdGhpbiB0aGUKKyAgICAvLyBncmFudWxhcml0eSBzZXR0aW5nKSwgdGhlbiBzZXQgdGhlIGJpdCBmb3IgdGhpcyBvcyB0aHJlYWQgaW4gdGhlCisgICAgLy8gYWZmaW5pdHkgbWFzayBmb3IgdGhpcyBncm91cCwgYW5kIGdvIG9uIHRvIHRoZSBuZXh0IHRocmVhZC4KKyAgICBpZiAobGVhZGVyQWRkci0+aXNDbG9zZShhZGRyZXNzMm9zW2ldLmZpcnN0LCBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscykpIHsKKyAgICAgIEtNUF9DUFVfU0VUKGFkZHJlc3Myb3NbaV0uc2Vjb25kLCBzdW0pOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gRm9yIGV2ZXJ5IHRocmVhZCBpbiB0aGlzIGdyb3VwLCBjb3B5IHRoZSBtYXNrIHRvIHRoZSB0aHJlYWQncyBlbnRyeSBpbgorICAgIC8vIHRoZSBvc0lkMk1hc2sgdGFibGUuICBNYXJrIHRoZSBmaXJzdCBhZGRyZXNzIGFzIGEgbGVhZGVyLgorICAgIGZvciAoOyBqIDwgaTsgaisrKSB7CisgICAgICB1bnNpZ25lZCBvc0lkID0gYWRkcmVzczJvc1tqXS5zZWNvbmQ7CisgICAgICBLTVBfREVCVUdfQVNTRVJUKG9zSWQgPD0gbWF4T3NJZCk7CisgICAgICBrbXBfYWZmaW5fbWFza190ICptYXNrID0gS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIG9zSWQpOworICAgICAgS01QX0NQVV9DT1BZKG1hc2ssIHN1bSk7CisgICAgICBhZGRyZXNzMm9zW2pdLmZpcnN0LmxlYWRlciA9IChqID09IGxlYWRlcik7CisgICAgfQorICAgIHVuaXF1ZSsrOworCisgICAgLy8gU3RhcnQgYSBuZXcgbWFzay4KKyAgICBsZWFkZXIgPSBpOworICAgIGxlYWRlckFkZHIgPSAmKGFkZHJlc3Myb3NbaV0uZmlyc3QpOworICAgIEtNUF9DUFVfWkVSTyhzdW0pOworICAgIEtNUF9DUFVfU0VUKGFkZHJlc3Myb3NbaV0uc2Vjb25kLCBzdW0pOworICB9CisKKyAgLy8gRm9yIGV2ZXJ5IHRocmVhZCBpbiBsYXN0IGdyb3VwLCBjb3B5IHRoZSBtYXNrIHRvIHRoZSB0aHJlYWQncworICAvLyBlbnRyeSBpbiB0aGUgb3NJZDJNYXNrIHRhYmxlLgorICBmb3IgKDsgaiA8IGk7IGorKykgeworICAgIHVuc2lnbmVkIG9zSWQgPSBhZGRyZXNzMm9zW2pdLnNlY29uZDsKKyAgICBLTVBfREVCVUdfQVNTRVJUKG9zSWQgPD0gbWF4T3NJZCk7CisgICAga21wX2FmZmluX21hc2tfdCAqbWFzayA9IEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBvc0lkKTsKKyAgICBLTVBfQ1BVX0NPUFkobWFzaywgc3VtKTsKKyAgICBhZGRyZXNzMm9zW2pdLmZpcnN0LmxlYWRlciA9IChqID09IGxlYWRlcik7CisgIH0KKyAgdW5pcXVlKys7CisgIEtNUF9DUFVfRlJFRV9GUk9NX1NUQUNLKHN1bSk7CisKKyAgKm1heEluZGV4ID0gbWF4T3NJZDsKKyAgKm51bVVuaXF1ZSA9IHVuaXF1ZTsKKyAgcmV0dXJuIG9zSWQyTWFzazsKK30KKworLy8gU3R1ZmYgZm9yIHRoZSBhZmZpbml0eSBwcm9jbGlzdCBwYXJzZXJzLiAgSXQncyBlYXNpZXIgdG8gZGVjbGFyZSB0aGVzZSB2YXJzCisvLyBhcyBmaWxlLXN0YXRpYyB0aGFuIHRvIHRyeSBhbmQgcGFzcyB0aGVtIHRocm91Z2ggdGhlIGNhbGxpbmcgc2VxdWVuY2Ugb2YKKy8vIHRoZSByZWN1cnNpdmUtZGVzY2VudCBPTVBfUExBQ0VTIHBhcnNlci4KK3N0YXRpYyBrbXBfYWZmaW5fbWFza190ICpuZXdNYXNrczsKK3N0YXRpYyBpbnQgbnVtTmV3TWFza3M7CitzdGF0aWMgaW50IG5leHROZXdNYXNrOworCisjZGVmaW5lIEFERF9NQVNLKF9tYXNrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAobmV4dE5ld01hc2sgPj0gbnVtTmV3TWFza3MpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbnVtTmV3TWFza3MgKj0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGttcF9hZmZpbl9tYXNrX3QgKnRlbXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBLTVBfQ1BVX0lOVEVSTkFMX0FMTE9DX0FSUkFZKHRlbXAsIG51bU5ld01hc2tzKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZm9yIChpID0gMDsgaSA8IG51bU5ld01hc2tzIC8gMjsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAga21wX2FmZmluX21hc2tfdCAqc3JjID0gS01QX0NQVV9JTkRFWChuZXdNYXNrcywgaSk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgKmRlc3QgPSBLTVBfQ1BVX0lOREVYKHRlbXAsIGkpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ1BVX0NPUFkoZGVzdCwgc3JjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBLTVBfQ1BVX0lOVEVSTkFMX0ZSRUVfQVJSQVkobmV3TWFza3MsIG51bU5ld01hc2tzIC8gMik7ICAgICAgICAgICAgICAgICAgXAorICAgICAgbmV3TWFza3MgPSB0ZW1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0NQVV9DT1BZKEtNUF9DUFVfSU5ERVgobmV3TWFza3MsIG5leHROZXdNYXNrKSwgKF9tYXNrKSk7ICAgICAgICAgICAgICAgXAorICAgIG5leHROZXdNYXNrKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIEFERF9NQVNLX09TSUQoX29zSWQsIF9vc0lkMk1hc2ssIF9tYXhPc0lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKChfb3NJZCkgPiBfbWF4T3NJZCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICghS01QX0NQVV9JU1NFVCgoX29zSWQpLCBLTVBfQ1BVX0lOREVYKChfb3NJZDJNYXNrKSwgKF9vc0lkKSkpKSkgeyAgICAgXAorICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfV0FSTklORyhBZmZJZ25vcmVJbnZhbGlkUHJvY0lELCBfb3NJZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQUREX01BU0soS01QX0NQVV9JTkRFWChfb3NJZDJNYXNrLCAoX29zSWQpKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworLy8gUmUtcGFyc2UgdGhlIHByb2NsaXN0IChmb3IgdGhlIGV4cGxpY2l0IGFmZmluaXR5IHR5cGUpLCBhbmQgZm9ybSB0aGUgbGlzdAorLy8gb2YgYWZmaW5pdHkgbmV3TWFza3MgaW5kZXhlZCBieSBndGlkLgorc3RhdGljIHZvaWQgX19rbXBfYWZmaW5pdHlfcHJvY2Vzc19wcm9jbGlzdChrbXBfYWZmaW5fbWFza190ICoqb3V0X21hc2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm91dF9udW1NYXNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHJvY2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgKm9zSWQyTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heE9zSWQpIHsKKyAgaW50IGk7CisgIGNvbnN0IGNoYXIgKnNjYW4gPSBwcm9jbGlzdDsKKyAgY29uc3QgY2hhciAqbmV4dCA9IHByb2NsaXN0OworCisgIC8vIFdlIHVzZSBtYWxsb2MoKSBmb3IgdGhlIHRlbXBvcmFyeSBtYXNrIHZlY3Rvciwgc28gdGhhdCB3ZSBjYW4gdXNlCisgIC8vIHJlYWxsb2MoKSB0byBleHRlbmQgaXQuCisgIG51bU5ld01hc2tzID0gMjsKKyAgS01QX0NQVV9JTlRFUk5BTF9BTExPQ19BUlJBWShuZXdNYXNrcywgbnVtTmV3TWFza3MpOworICBuZXh0TmV3TWFzayA9IDA7CisgIGttcF9hZmZpbl9tYXNrX3QgKnN1bU1hc2s7CisgIEtNUF9DUFVfQUxMT0Moc3VtTWFzayk7CisgIGludCBzZXRTaXplID0gMDsKKworICBmb3IgKDs7KSB7CisgICAgaW50IHN0YXJ0LCBlbmQsIHN0cmlkZTsKKworICAgIFNLSVBfV1Moc2Nhbik7CisgICAgbmV4dCA9IHNjYW47CisgICAgaWYgKCpuZXh0ID09ICdcMCcpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICgqbmV4dCA9PSAneycpIHsKKyAgICAgIGludCBudW07CisgICAgICBzZXRTaXplID0gMDsKKyAgICAgIG5leHQrKzsgLy8gc2tpcCAneycKKyAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICBzY2FuID0gbmV4dDsKKworICAgICAgLy8gUmVhZCB0aGUgZmlyc3QgaW50ZWdlciBpbiB0aGUgc2V0LgorICAgICAgS01QX0FTU0VSVDIoKCpuZXh0ID49ICcwJykgJiYgKCpuZXh0IDw9ICc5JyksICJiYWQgcHJvY2xpc3QiKTsKKyAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgbnVtID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgICBLTVBfQVNTRVJUMihudW0gPj0gMCwgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKworICAgICAgLy8gQ29weSB0aGUgbWFzayBmb3IgdGhhdCBvc0lkIHRvIHRoZSBzdW0gKHVuaW9uKSBtYXNrLgorICAgICAgaWYgKChudW0gPiBtYXhPc0lkKSB8fAorICAgICAgICAgICghS01QX0NQVV9JU1NFVChudW0sIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBudW0pKSkpIHsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwKKyAgICAgICAgICAgIChfX2ttcF9hZmZpbml0eV93YXJuaW5ncyAmJgorICAgICAgICAgICAgIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeworICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZklnbm9yZUludmFsaWRQcm9jSUQsIG51bSk7CisgICAgICAgIH0KKyAgICAgICAgS01QX0NQVV9aRVJPKHN1bU1hc2spOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0NQVV9DT1BZKHN1bU1hc2ssIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBudW0pKTsKKyAgICAgICAgc2V0U2l6ZSA9IDE7CisgICAgICB9CisKKyAgICAgIGZvciAoOzspIHsKKyAgICAgICAgLy8gQ2hlY2sgZm9yIGVuZCBvZiBzZXQuCisgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgIGlmICgqbmV4dCA9PSAnfScpIHsKKyAgICAgICAgICBuZXh0Kys7IC8vIHNraXAgJ30nCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBTa2lwIG9wdGlvbmFsIGNvbW1hLgorICAgICAgICBpZiAoKm5leHQgPT0gJywnKSB7CisgICAgICAgICAgbmV4dCsrOworICAgICAgICB9CisgICAgICAgIFNLSVBfV1MobmV4dCk7CisKKyAgICAgICAgLy8gUmVhZCB0aGUgbmV4dCBpbnRlZ2VyIGluIHRoZSBzZXQuCisgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICBLTVBfQVNTRVJUMigoKm5leHQgPj0gJzAnKSAmJiAoKm5leHQgPD0gJzknKSwgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgbnVtID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQyKG51bSA+PSAwLCAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworCisgICAgICAgIC8vIEFkZCB0aGUgbWFzayBmb3IgdGhhdCBvc0lkIHRvIHRoZSBzdW0gbWFzay4KKyAgICAgICAgaWYgKChudW0gPiBtYXhPc0lkKSB8fAorICAgICAgICAgICAgKCFLTVBfQ1BVX0lTU0VUKG51bSwgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIG51bSkpKSkgeworICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8CisgICAgICAgICAgICAgIChfX2ttcF9hZmZpbml0eV93YXJuaW5ncyAmJgorICAgICAgICAgICAgICAgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZJZ25vcmVJbnZhbGlkUHJvY0lELCBudW0pOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBLTVBfQ1BVX1VOSU9OKHN1bU1hc2ssIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBudW0pKTsKKyAgICAgICAgICBzZXRTaXplKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChzZXRTaXplID4gMCkgeworICAgICAgICBBRERfTUFTSyhzdW1NYXNrKTsKKyAgICAgIH0KKworICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgIGlmICgqbmV4dCA9PSAnLCcpIHsKKyAgICAgICAgbmV4dCsrOworICAgICAgfQorICAgICAgc2NhbiA9IG5leHQ7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBSZWFkIHRoZSBmaXJzdCBpbnRlZ2VyLgorICAgIEtNUF9BU1NFUlQyKCgqbmV4dCA+PSAnMCcpICYmICgqbmV4dCA8PSAnOScpLCAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgIHN0YXJ0ID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgS01QX0FTU0VSVDIoc3RhcnQgPj0gMCwgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKyAgICBTS0lQX1dTKG5leHQpOworCisgICAgLy8gSWYgdGhpcyBpc24ndCBhIHJhbmdlLCB0aGVuIGFkZCBhIG1hc2sgdG8gdGhlIGxpc3QgYW5kIGdvIG9uLgorICAgIGlmICgqbmV4dCAhPSAnLScpIHsKKyAgICAgIEFERF9NQVNLX09TSUQoc3RhcnQsIG9zSWQyTWFzaywgbWF4T3NJZCk7CisKKyAgICAgIC8vIFNraXAgb3B0aW9uYWwgY29tbWEuCisgICAgICBpZiAoKm5leHQgPT0gJywnKSB7CisgICAgICAgIG5leHQrKzsKKyAgICAgIH0KKyAgICAgIHNjYW4gPSBuZXh0OworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gVGhpcyBpcyBhIHJhbmdlLiAgU2tpcCBvdmVyIHRoZSAnLScgYW5kIHJlYWQgaW4gdGhlIDJuZCBpbnQuCisgICAgbmV4dCsrOyAvLyBza2lwICctJworICAgIFNLSVBfV1MobmV4dCk7CisgICAgc2NhbiA9IG5leHQ7CisgICAgS01QX0FTU0VSVDIoKCpuZXh0ID49ICcwJykgJiYgKCpuZXh0IDw9ICc5JyksICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgZW5kID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgS01QX0FTU0VSVDIoZW5kID49IDAsICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisKKyAgICAvLyBDaGVjayBmb3IgYSBzdHJpZGUgcGFyYW1ldGVyCisgICAgc3RyaWRlID0gMTsKKyAgICBTS0lQX1dTKG5leHQpOworICAgIGlmICgqbmV4dCA9PSAnOicpIHsKKyAgICAgIC8vIEEgc3RyaWRlIGlzIHNwZWNpZmllZC4gIFNraXAgb3ZlciB0aGUgJzoiIGFuZCByZWFkIHRoZSAzcmQgaW50LgorICAgICAgaW50IHNpZ24gPSArMTsKKyAgICAgIG5leHQrKzsgLy8gc2tpcCAnOicKKyAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICBzY2FuID0gbmV4dDsKKyAgICAgIGlmICgqbmV4dCA9PSAnLScpIHsKKyAgICAgICAgc2lnbiA9IC0xOworICAgICAgICBuZXh0Kys7CisgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgfQorICAgICAgS01QX0FTU0VSVDIoKCpuZXh0ID49ICcwJykgJiYgKCpuZXh0IDw9ICc5JyksICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgIHN0cmlkZSA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgS01QX0FTU0VSVDIoc3RyaWRlID49IDAsICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisgICAgICBzdHJpZGUgKj0gc2lnbjsKKyAgICB9CisKKyAgICAvLyBEbyBzb21lIHJhbmdlIGNoZWNrcy4KKyAgICBLTVBfQVNTRVJUMihzdHJpZGUgIT0gMCwgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKyAgICBpZiAoc3RyaWRlID4gMCkgeworICAgICAgS01QX0FTU0VSVDIoc3RhcnQgPD0gZW5kLCAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworICAgIH0gZWxzZSB7CisgICAgICBLTVBfQVNTRVJUMihzdGFydCA+PSBlbmQsICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisgICAgfQorICAgIEtNUF9BU1NFUlQyKChlbmQgLSBzdGFydCkgLyBzdHJpZGUgPD0gNjU1MzYsICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisKKyAgICAvLyBBZGQgdGhlIG1hc2sgZm9yIGVhY2ggT1MgcHJvYyAjIHRvIHRoZSBsaXN0LgorICAgIGlmIChzdHJpZGUgPiAwKSB7CisgICAgICBkbyB7CisgICAgICAgIEFERF9NQVNLX09TSUQoc3RhcnQsIG9zSWQyTWFzaywgbWF4T3NJZCk7CisgICAgICAgIHN0YXJ0ICs9IHN0cmlkZTsKKyAgICAgIH0gd2hpbGUgKHN0YXJ0IDw9IGVuZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGRvIHsKKyAgICAgICAgQUREX01BU0tfT1NJRChzdGFydCwgb3NJZDJNYXNrLCBtYXhPc0lkKTsKKyAgICAgICAgc3RhcnQgKz0gc3RyaWRlOworICAgICAgfSB3aGlsZSAoc3RhcnQgPj0gZW5kKTsKKyAgICB9CisKKyAgICAvLyBTa2lwIG9wdGlvbmFsIGNvbW1hLgorICAgIFNLSVBfV1MobmV4dCk7CisgICAgaWYgKCpuZXh0ID09ICcsJykgeworICAgICAgbmV4dCsrOworICAgIH0KKyAgICBzY2FuID0gbmV4dDsKKyAgfQorCisgICpvdXRfbnVtTWFza3MgPSBuZXh0TmV3TWFzazsKKyAgaWYgKG5leHROZXdNYXNrID09IDApIHsKKyAgICAqb3V0X21hc2tzID0gTlVMTDsKKyAgICBLTVBfQ1BVX0lOVEVSTkFMX0ZSRUVfQVJSQVkobmV3TWFza3MsIG51bU5ld01hc2tzKTsKKyAgICByZXR1cm47CisgIH0KKyAgS01QX0NQVV9BTExPQ19BUlJBWSgoKm91dF9tYXNrcyksIG5leHROZXdNYXNrKTsKKyAgZm9yIChpID0gMDsgaSA8IG5leHROZXdNYXNrOyBpKyspIHsKKyAgICBrbXBfYWZmaW5fbWFza190ICpzcmMgPSBLTVBfQ1BVX0lOREVYKG5ld01hc2tzLCBpKTsKKyAgICBrbXBfYWZmaW5fbWFza190ICpkZXN0ID0gS01QX0NQVV9JTkRFWCgoKm91dF9tYXNrcyksIGkpOworICAgIEtNUF9DUFVfQ09QWShkZXN0LCBzcmMpOworICB9CisgIEtNUF9DUFVfSU5URVJOQUxfRlJFRV9BUlJBWShuZXdNYXNrcywgbnVtTmV3TWFza3MpOworICBLTVBfQ1BVX0ZSRUUoc3VtTWFzayk7Cit9CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZS1wYXJzZSB0aGUgT01QX1BMQUNFUyBwcm9jIGlkIGxpc3QsIGZvcm1pbmcgdGhlIG5ld01hc2tzIGZvciB0aGUgZGlmZmVyZW50CitwbGFjZXMuICBBZ2FpbiwgSGVyZSBpcyB0aGUgZ3JhbW1hcjoKKworcGxhY2VfbGlzdCA6PSBwbGFjZQorcGxhY2VfbGlzdCA6PSBwbGFjZSAsIHBsYWNlX2xpc3QKK3BsYWNlIDo9IG51bQorcGxhY2UgOj0gcGxhY2UgOiBudW0KK3BsYWNlIDo9IHBsYWNlIDogbnVtIDogc2lnbmVkCitwbGFjZSA6PSB7IHN1YnBsYWNlbGlzdCB9CitwbGFjZSA6PSAhIHBsYWNlICAgICAgICAgICAgICAgICAgLy8gKGxvd2VzdCBwcmlvcml0eSkKK3N1YnBsYWNlX2xpc3QgOj0gc3VicGxhY2UKK3N1YnBsYWNlX2xpc3QgOj0gc3VicGxhY2UgLCBzdWJwbGFjZV9saXN0CitzdWJwbGFjZSA6PSBudW0KK3N1YnBsYWNlIDo9IG51bSA6IG51bQorc3VicGxhY2UgOj0gbnVtIDogbnVtIDogc2lnbmVkCitzaWduZWQgOj0gbnVtCitzaWduZWQgOj0gKyBzaWduZWQKK3NpZ25lZCA6PSAtIHNpZ25lZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBfX2ttcF9wcm9jZXNzX3N1YnBsYWNlX2xpc3QoY29uc3QgY2hhciAqKnNjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2FmZmluX21hc2tfdCAqb3NJZDJNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhPc0lkLCBrbXBfYWZmaW5fbWFza190ICp0ZW1wTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNldFNpemUpIHsKKyAgY29uc3QgY2hhciAqbmV4dDsKKworICBmb3IgKDs7KSB7CisgICAgaW50IHN0YXJ0LCBjb3VudCwgc3RyaWRlLCBpOworCisgICAgLy8gUmVhZCBpbiB0aGUgc3RhcnRpbmcgcHJvYyBpZAorICAgIFNLSVBfV1MoKnNjYW4pOworICAgIEtNUF9BU1NFUlQyKCgqKnNjYW4gPj0gJzAnKSAmJiAoKipzY2FuIDw9ICc5JyksICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICBuZXh0ID0gKnNjYW47CisgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgc3RhcnQgPSBfX2ttcF9zdHJfdG9faW50KCpzY2FuLCAqbmV4dCk7CisgICAgS01QX0FTU0VSVChzdGFydCA+PSAwKTsKKyAgICAqc2NhbiA9IG5leHQ7CisKKyAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnICc6JyBhbmQgJ30nCisgICAgU0tJUF9XUygqc2Nhbik7CisgICAgaWYgKCoqc2NhbiA9PSAnfScgfHwgKipzY2FuID09ICcsJykgeworICAgICAgaWYgKChzdGFydCA+IG1heE9zSWQpIHx8CisgICAgICAgICAgKCFLTVBfQ1BVX0lTU0VUKHN0YXJ0LCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgc3RhcnQpKSkpIHsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwKKyAgICAgICAgICAgIChfX2ttcF9hZmZpbml0eV93YXJuaW5ncyAmJgorICAgICAgICAgICAgIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeworICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZklnbm9yZUludmFsaWRQcm9jSUQsIHN0YXJ0KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0NQVV9VTklPTih0ZW1wTWFzaywgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIHN0YXJ0KSk7CisgICAgICAgICgqc2V0U2l6ZSkrKzsKKyAgICAgIH0KKyAgICAgIGlmICgqKnNjYW4gPT0gJ30nKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgKCpzY2FuKSsrOyAvLyBza2lwICcsJworICAgICAgY29udGludWU7CisgICAgfQorICAgIEtNUF9BU1NFUlQyKCoqc2NhbiA9PSAnOicsICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICAoKnNjYW4pKys7IC8vIHNraXAgJzonCisKKyAgICAvLyBSZWFkIGNvdW50IHBhcmFtZXRlcgorICAgIFNLSVBfV1MoKnNjYW4pOworICAgIEtNUF9BU1NFUlQyKCgqKnNjYW4gPj0gJzAnKSAmJiAoKipzY2FuIDw9ICc5JyksICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICBuZXh0ID0gKnNjYW47CisgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgY291bnQgPSBfX2ttcF9zdHJfdG9faW50KCpzY2FuLCAqbmV4dCk7CisgICAgS01QX0FTU0VSVChjb3VudCA+PSAwKTsKKyAgICAqc2NhbiA9IG5leHQ7CisKKyAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnICc6JyBhbmQgJ30nCisgICAgU0tJUF9XUygqc2Nhbik7CisgICAgaWYgKCoqc2NhbiA9PSAnfScgfHwgKipzY2FuID09ICcsJykgeworICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKChzdGFydCA+IG1heE9zSWQpIHx8CisgICAgICAgICAgICAoIUtNUF9DUFVfSVNTRVQoc3RhcnQsIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBzdGFydCkpKSkgeworICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8CisgICAgICAgICAgICAgIChfX2ttcF9hZmZpbml0eV93YXJuaW5ncyAmJgorICAgICAgICAgICAgICAgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZJZ25vcmVJbnZhbGlkUHJvY0lELCBzdGFydCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOyAvLyBkb24ndCBwcm9saWZlcmF0ZSB3YXJuaW5ncyBmb3IgbGFyZ2UgY291bnQKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBLTVBfQ1BVX1VOSU9OKHRlbXBNYXNrLCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgc3RhcnQpKTsKKyAgICAgICAgICBzdGFydCsrOworICAgICAgICAgICgqc2V0U2l6ZSkrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCoqc2NhbiA9PSAnfScpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAoKnNjYW4pKys7IC8vIHNraXAgJywnCisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgS01QX0FTU0VSVDIoKipzY2FuID09ICc6JywgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgICgqc2NhbikrKzsgLy8gc2tpcCAnOicKKworICAgIC8vIFJlYWQgc3RyaWRlIHBhcmFtZXRlcgorICAgIGludCBzaWduID0gKzE7CisgICAgZm9yICg7OykgeworICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICBpZiAoKipzY2FuID09ICcrJykgeworICAgICAgICAoKnNjYW4pKys7IC8vIHNraXAgJysnCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKCoqc2NhbiA9PSAnLScpIHsKKyAgICAgICAgc2lnbiAqPSAtMTsKKyAgICAgICAgKCpzY2FuKSsrOyAvLyBza2lwICctJworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICBLTVBfQVNTRVJUMigoKipzY2FuID49ICcwJykgJiYgKCoqc2NhbiA8PSAnOScpLCAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgbmV4dCA9ICpzY2FuOworICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgIHN0cmlkZSA9IF9fa21wX3N0cl90b19pbnQoKnNjYW4sICpuZXh0KTsKKyAgICBLTVBfQVNTRVJUKHN0cmlkZSA+PSAwKTsKKyAgICAqc2NhbiA9IG5leHQ7CisgICAgc3RyaWRlICo9IHNpZ247CisKKyAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnIGFuZCAnfScKKyAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICBpZiAoKipzY2FuID09ICd9JyB8fCAqKnNjYW4gPT0gJywnKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBpZiAoKHN0YXJ0ID4gbWF4T3NJZCkgfHwKKyAgICAgICAgICAgICghS01QX0NQVV9JU1NFVChzdGFydCwgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIHN0YXJ0KSkpKSB7CisgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwKKyAgICAgICAgICAgICAgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzICYmCisgICAgICAgICAgICAgICAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKSkpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZklnbm9yZUludmFsaWRQcm9jSUQsIHN0YXJ0KTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7IC8vIGRvbid0IHByb2xpZmVyYXRlIHdhcm5pbmdzIGZvciBsYXJnZSBjb3VudAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEtNUF9DUFVfVU5JT04odGVtcE1hc2ssIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBzdGFydCkpOworICAgICAgICAgIHN0YXJ0ICs9IHN0cmlkZTsKKyAgICAgICAgICAoKnNldFNpemUpKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICgqKnNjYW4gPT0gJ30nKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgKCpzY2FuKSsrOyAvLyBza2lwICcsJworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgS01QX0FTU0VSVDIoMCwgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIF9fa21wX3Byb2Nlc3NfcGxhY2UoY29uc3QgY2hhciAqKnNjYW4sIGttcF9hZmZpbl9tYXNrX3QgKm9zSWQyTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heE9zSWQsIGttcF9hZmZpbl9tYXNrX3QgKnRlbXBNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNldFNpemUpIHsKKyAgY29uc3QgY2hhciAqbmV4dDsKKworICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJ3snICchJyBhbmQgbnVtCisgIFNLSVBfV1MoKnNjYW4pOworICBpZiAoKipzY2FuID09ICd7JykgeworICAgICgqc2NhbikrKzsgLy8gc2tpcCAneycKKyAgICBfX2ttcF9wcm9jZXNzX3N1YnBsYWNlX2xpc3Qoc2Nhbiwgb3NJZDJNYXNrLCBtYXhPc0lkLCB0ZW1wTWFzaywgc2V0U2l6ZSk7CisgICAgS01QX0FTU0VSVDIoKipzY2FuID09ICd9JywgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgICgqc2NhbikrKzsgLy8gc2tpcCAnfScKKyAgfSBlbHNlIGlmICgqKnNjYW4gPT0gJyEnKSB7CisgICAgKCpzY2FuKSsrOyAvLyBza2lwICchJworICAgIF9fa21wX3Byb2Nlc3NfcGxhY2Uoc2Nhbiwgb3NJZDJNYXNrLCBtYXhPc0lkLCB0ZW1wTWFzaywgc2V0U2l6ZSk7CisgICAgS01QX0NQVV9DT01QTEVNRU5UKG1heE9zSWQsIHRlbXBNYXNrKTsKKyAgfSBlbHNlIGlmICgoKipzY2FuID49ICcwJykgJiYgKCoqc2NhbiA8PSAnOScpKSB7CisgICAgbmV4dCA9ICpzY2FuOworICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgIGludCBudW0gPSBfX2ttcF9zdHJfdG9faW50KCpzY2FuLCAqbmV4dCk7CisgICAgS01QX0FTU0VSVChudW0gPj0gMCk7CisgICAgaWYgKChudW0gPiBtYXhPc0lkKSB8fAorICAgICAgICAoIUtNUF9DUFVfSVNTRVQobnVtLCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgbnVtKSkpKSB7CisgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fAorICAgICAgICAgIChfX2ttcF9hZmZpbml0eV93YXJuaW5ncyAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKSkpIHsKKyAgICAgICAgS01QX1dBUk5JTkcoQWZmSWdub3JlSW52YWxpZFByb2NJRCwgbnVtKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgS01QX0NQVV9VTklPTih0ZW1wTWFzaywgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIG51bSkpOworICAgICAgKCpzZXRTaXplKSsrOworICAgIH0KKyAgICAqc2NhbiA9IG5leHQ7IC8vIHNraXAgbnVtCisgIH0gZWxzZSB7CisgICAgS01QX0FTU0VSVDIoMCwgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICB9Cit9CisKKy8vIHN0YXRpYyB2b2lkCit2b2lkIF9fa21wX2FmZmluaXR5X3Byb2Nlc3NfcGxhY2VsaXN0KGttcF9hZmZpbl9tYXNrX3QgKipvdXRfbWFza3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqb3V0X251bU1hc2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwbGFjZWxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgKm9zSWQyTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heE9zSWQpIHsKKyAgaW50IGksIGosIGNvdW50LCBzdHJpZGUsIHNpZ247CisgIGNvbnN0IGNoYXIgKnNjYW4gPSBwbGFjZWxpc3Q7CisgIGNvbnN0IGNoYXIgKm5leHQgPSBwbGFjZWxpc3Q7CisKKyAgbnVtTmV3TWFza3MgPSAyOworICBLTVBfQ1BVX0lOVEVSTkFMX0FMTE9DX0FSUkFZKG5ld01hc2tzLCBudW1OZXdNYXNrcyk7CisgIG5leHROZXdNYXNrID0gMDsKKworICAvLyB0ZW1wTWFzayBpcyBtb2RpZmllZCBiYXNlZCBvbiB0aGUgcHJldmlvdXMgb3IgaW5pdGlhbAorICAvLyAgIHBsYWNlIHRvIGZvcm0gdGhlIGN1cnJlbnQgcGxhY2UKKyAgLy8gcHJldmlvdXNNYXNrIGNvbnRhaW5zIHRoZSBwcmV2aW91cyBwbGFjZQorICBrbXBfYWZmaW5fbWFza190ICp0ZW1wTWFzazsKKyAga21wX2FmZmluX21hc2tfdCAqcHJldmlvdXNNYXNrOworICBLTVBfQ1BVX0FMTE9DKHRlbXBNYXNrKTsKKyAgS01QX0NQVV9aRVJPKHRlbXBNYXNrKTsKKyAgS01QX0NQVV9BTExPQyhwcmV2aW91c01hc2spOworICBLTVBfQ1BVX1pFUk8ocHJldmlvdXNNYXNrKTsKKyAgaW50IHNldFNpemUgPSAwOworCisgIGZvciAoOzspIHsKKyAgICBfX2ttcF9wcm9jZXNzX3BsYWNlKCZzY2FuLCBvc0lkMk1hc2ssIG1heE9zSWQsIHRlbXBNYXNrLCAmc2V0U2l6ZSk7CisKKyAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnICc6JyBhbmQgRU9MCisgICAgU0tJUF9XUyhzY2FuKTsKKyAgICBpZiAoKnNjYW4gPT0gJ1wwJyB8fCAqc2NhbiA9PSAnLCcpIHsKKyAgICAgIGlmIChzZXRTaXplID4gMCkgeworICAgICAgICBBRERfTUFTSyh0ZW1wTWFzayk7CisgICAgICB9CisgICAgICBLTVBfQ1BVX1pFUk8odGVtcE1hc2spOworICAgICAgc2V0U2l6ZSA9IDA7CisgICAgICBpZiAoKnNjYW4gPT0gJ1wwJykgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHNjYW4rKzsgLy8gc2tpcCAnLCcKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIEtNUF9BU1NFUlQyKCpzY2FuID09ICc6JywgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgIHNjYW4rKzsgLy8gc2tpcCAnOicKKworICAgIC8vIFJlYWQgY291bnQgcGFyYW1ldGVyCisgICAgU0tJUF9XUyhzY2FuKTsKKyAgICBLTVBfQVNTRVJUMigoKnNjYW4gPj0gJzAnKSAmJiAoKnNjYW4gPD0gJzknKSwgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgIG5leHQgPSBzY2FuOworICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgIGNvdW50ID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgS01QX0FTU0VSVChjb3VudCA+PSAwKTsKKyAgICBzY2FuID0gbmV4dDsKKworICAgIC8vIHZhbGlkIGZvbGxvdyBzZXRzIGFyZSAnLCcgJzonIGFuZCBFT0wKKyAgICBTS0lQX1dTKHNjYW4pOworICAgIGlmICgqc2NhbiA9PSAnXDAnIHx8ICpzY2FuID09ICcsJykgeworICAgICAgc3RyaWRlID0gKzE7CisgICAgfSBlbHNlIHsKKyAgICAgIEtNUF9BU1NFUlQyKCpzY2FuID09ICc6JywgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgICAgc2NhbisrOyAvLyBza2lwICc6JworCisgICAgICAvLyBSZWFkIHN0cmlkZSBwYXJhbWV0ZXIKKyAgICAgIHNpZ24gPSArMTsKKyAgICAgIGZvciAoOzspIHsKKyAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgaWYgKCpzY2FuID09ICcrJykgeworICAgICAgICAgIHNjYW4rKzsgLy8gc2tpcCAnKycKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKnNjYW4gPT0gJy0nKSB7CisgICAgICAgICAgc2lnbiAqPSAtMTsKKyAgICAgICAgICBzY2FuKys7IC8vIHNraXAgJy0nCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgS01QX0FTU0VSVDIoKCpzY2FuID49ICcwJykgJiYgKCpzY2FuIDw9ICc5JyksICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICAgIG5leHQgPSBzY2FuOworICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICBzdHJpZGUgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgIEtNUF9ERUJVR19BU1NFUlQoc3RyaWRlID49IDApOworICAgICAgc2NhbiA9IG5leHQ7CisgICAgICBzdHJpZGUgKj0gc2lnbjsKKyAgICB9CisKKyAgICAvLyBBZGQgcGxhY2VzIGRldGVybWluZWQgYnkgaW5pdGlhbF9wbGFjZSA6IGNvdW50IDogc3RyaWRlCisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgIGlmIChzZXRTaXplID09IDApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAvLyBBZGQgdGhlIGN1cnJlbnQgcGxhY2UsIHRoZW4gYnVpbGQgdGhlIG5leHQgcGxhY2UgKHRlbXBNYXNrKSBmcm9tIHRoYXQKKyAgICAgIEtNUF9DUFVfQ09QWShwcmV2aW91c01hc2ssIHRlbXBNYXNrKTsKKyAgICAgIEFERF9NQVNLKHByZXZpb3VzTWFzayk7CisgICAgICBLTVBfQ1BVX1pFUk8odGVtcE1hc2spOworICAgICAgc2V0U2l6ZSA9IDA7CisgICAgICBLTVBfQ1BVX1NFVF9JVEVSQVRFKGosIHByZXZpb3VzTWFzaykgeworICAgICAgICBpZiAoIUtNUF9DUFVfSVNTRVQoaiwgcHJldmlvdXNNYXNrKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICgoaiArIHN0cmlkZSA+IG1heE9zSWQpIHx8IChqICsgc3RyaWRlIDwgMCkgfHwKKyAgICAgICAgICAgICghS01QX0NQVV9JU1NFVChqLCBfX2ttcF9hZmZpbl9mdWxsTWFzaykpIHx8CisgICAgICAgICAgICAoIUtNUF9DUFVfSVNTRVQoaiArIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgaiArIHN0cmlkZSkpKSkgeworICAgICAgICAgIGlmICgoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fAorICAgICAgICAgICAgICAgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzICYmCisgICAgICAgICAgICAgICAgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSAmJgorICAgICAgICAgICAgICBpIDwgY291bnQgLSAxKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZJZ25vcmVJbnZhbGlkUHJvY0lELCBqICsgc3RyaWRlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgS01QX0NQVV9TRVQoaiArIHN0cmlkZSwgdGVtcE1hc2spOworICAgICAgICBzZXRTaXplKys7CisgICAgICB9CisgICAgfQorICAgIEtNUF9DUFVfWkVSTyh0ZW1wTWFzayk7CisgICAgc2V0U2l6ZSA9IDA7CisKKyAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnIGFuZCBFT0wKKyAgICBTS0lQX1dTKHNjYW4pOworICAgIGlmICgqc2NhbiA9PSAnXDAnKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCpzY2FuID09ICcsJykgeworICAgICAgc2NhbisrOyAvLyBza2lwICcsJworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgS01QX0FTU0VSVDIoMCwgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICB9CisKKyAgKm91dF9udW1NYXNrcyA9IG5leHROZXdNYXNrOworICBpZiAobmV4dE5ld01hc2sgPT0gMCkgeworICAgICpvdXRfbWFza3MgPSBOVUxMOworICAgIEtNUF9DUFVfSU5URVJOQUxfRlJFRV9BUlJBWShuZXdNYXNrcywgbnVtTmV3TWFza3MpOworICAgIHJldHVybjsKKyAgfQorICBLTVBfQ1BVX0FMTE9DX0FSUkFZKCgqb3V0X21hc2tzKSwgbmV4dE5ld01hc2spOworICBLTVBfQ1BVX0ZSRUUodGVtcE1hc2spOworICBLTVBfQ1BVX0ZSRUUocHJldmlvdXNNYXNrKTsKKyAgZm9yIChpID0gMDsgaSA8IG5leHROZXdNYXNrOyBpKyspIHsKKyAgICBrbXBfYWZmaW5fbWFza190ICpzcmMgPSBLTVBfQ1BVX0lOREVYKG5ld01hc2tzLCBpKTsKKyAgICBrbXBfYWZmaW5fbWFza190ICpkZXN0ID0gS01QX0NQVV9JTkRFWCgoKm91dF9tYXNrcyksIGkpOworICAgIEtNUF9DUFVfQ09QWShkZXN0LCBzcmMpOworICB9CisgIEtNUF9DUFVfSU5URVJOQUxfRlJFRV9BUlJBWShuZXdNYXNrcywgbnVtTmV3TWFza3MpOworfQorCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworI3VuZGVmIEFERF9NQVNLCisjdW5kZWYgQUREX01BU0tfT1NJRAorCisjaWYgS01QX1VTRV9IV0xPQworc3RhdGljIGludCBfX2ttcF9od2xvY19jb3VudF9jaGlsZHJlbl9ieV90eXBlKGh3bG9jX3RvcG9sb2d5X3QgdCwgaHdsb2Nfb2JqX3QgbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBod2xvY19vYmpfdHlwZV90IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHdsb2Nfb2JqX3QgKmYpIHsKKyAgaWYgKCFod2xvY19jb21wYXJlX3R5cGVzKG8tPnR5cGUsIHR5cGUpKSB7CisgICAgaWYgKCpmID09IE5VTEwpCisgICAgICAqZiA9IG87IC8vIG91dHB1dCBmaXJzdCBkZXNjZW5kYW50IGZvdW5kCisgICAgcmV0dXJuIDE7CisgIH0KKyAgaW50IHN1bSA9IDA7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBvLT5hcml0eTsgaSsrKQorICAgIHN1bSArPSBfX2ttcF9od2xvY19jb3VudF9jaGlsZHJlbl9ieV90eXBlKHQsIG8tPmNoaWxkcmVuW2ldLCB0eXBlLCBmKTsKKyAgcmV0dXJuIHN1bTsgLy8gd2lsbCBiZSAwIGlmIG5vIG9uZSBmb3VuZCAoYXMgUFUgYXJpdHkgaXMgMCkKK30KKworc3RhdGljIGludCBfX2ttcF9od2xvY19jb3VudF9jaGlsZHJlbl9ieV9kZXB0aChod2xvY190b3BvbG9neV90IHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3bG9jX29ial90IG8sIHVuc2lnbmVkIGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBod2xvY19vYmpfdCAqZikgeworICBpZiAoby0+ZGVwdGggPT0gZGVwdGgpIHsKKyAgICBpZiAoKmYgPT0gTlVMTCkKKyAgICAgICpmID0gbzsgLy8gb3V0cHV0IGZpcnN0IGRlc2NlbmRhbnQgZm91bmQKKyAgICByZXR1cm4gMTsKKyAgfQorICBpbnQgc3VtID0gMDsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG8tPmFyaXR5OyBpKyspCisgICAgc3VtICs9IF9fa21wX2h3bG9jX2NvdW50X2NoaWxkcmVuX2J5X2RlcHRoKHQsIG8tPmNoaWxkcmVuW2ldLCBkZXB0aCwgZik7CisgIHJldHVybiBzdW07IC8vIHdpbGwgYmUgMCBpZiBubyBvbmUgZm91bmQgKGFzIFBVIGFyaXR5IGlzIDApCit9CisKK3N0YXRpYyBpbnQgX19rbXBfaHdsb2Nfc2tpcF9QVXNfb2JqKGh3bG9jX3RvcG9sb2d5X3QgdCwgaHdsb2Nfb2JqX3QgbykgeworICAvLyBza2lwIFBVcyBkZXNjZW5kYW50cyBvZiB0aGUgb2JqZWN0IG8KKyAgaW50IHNraXBwZWQgPSAwOworICBod2xvY19vYmpfdCBoVCA9IE5VTEw7CisgIGludCBOID0gX19rbXBfaHdsb2NfY291bnRfY2hpbGRyZW5fYnlfdHlwZSh0LCBvLCBIV0xPQ19PQkpfUFUsICZoVCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgKytpKSB7CisgICAgS01QX0RFQlVHX0FTU0VSVChoVCk7CisgICAgdW5zaWduZWQgaWR4ID0gaFQtPm9zX2luZGV4OworICAgIGlmIChLTVBfQ1BVX0lTU0VUKGlkeCwgX19rbXBfYWZmaW5fZnVsbE1hc2spKSB7CisgICAgICBLTVBfQ1BVX0NMUihpZHgsIF9fa21wX2FmZmluX2Z1bGxNYXNrKTsKKyAgICAgIEtDX1RSQUNFKDIwMCwgKCJLTVBfSFdfU1VCU0VUOiBza2lwcGVkIHByb2MgJWRcbiIsIGlkeCkpOworICAgICAgKytza2lwcGVkOworICAgIH0KKyAgICBoVCA9IGh3bG9jX2dldF9uZXh0X29ial9ieV90eXBlKHQsIEhXTE9DX09CSl9QVSwgaFQpOworICB9CisgIHJldHVybiBza2lwcGVkOyAvLyBjb3VudCBudW1iZXIgb2Ygc2tpcHBlZCB1bml0cworfQorCitzdGF0aWMgaW50IF9fa21wX2h3bG9jX29ial9oYXNfUFVzKGh3bG9jX3RvcG9sb2d5X3QgdCwgaHdsb2Nfb2JqX3QgbykgeworICAvLyBjaGVjayBpZiBvYmogaGFzIFBVcyBwcmVzZW50IGluIGZ1bGxNYXNrCisgIGh3bG9jX29ial90IGhUID0gTlVMTDsKKyAgaW50IE4gPSBfX2ttcF9od2xvY19jb3VudF9jaGlsZHJlbl9ieV90eXBlKHQsIG8sIEhXTE9DX09CSl9QVSwgJmhUKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyArK2kpIHsKKyAgICBLTVBfREVCVUdfQVNTRVJUKGhUKTsKKyAgICB1bnNpZ25lZCBpZHggPSBoVC0+b3NfaW5kZXg7CisgICAgaWYgKEtNUF9DUFVfSVNTRVQoaWR4LCBfX2ttcF9hZmZpbl9mdWxsTWFzaykpCisgICAgICByZXR1cm4gMTsgLy8gZm91bmQgUFUKKyAgICBoVCA9IGh3bG9jX2dldF9uZXh0X29ial9ieV90eXBlKHQsIEhXTE9DX09CSl9QVSwgaFQpOworICB9CisgIHJldHVybiAwOyAvLyBubyBQVXMgZm91bmQKK30KKyNlbmRpZiAvLyBLTVBfVVNFX0hXTE9DCisKK3N0YXRpYyB2b2lkIF9fa21wX2FwcGx5X3RocmVhZF9wbGFjZXMoQWRkclVuc1BhaXIgKipwQWRkciwgaW50IGRlcHRoKSB7CisgIEFkZHJVbnNQYWlyICpuZXdBZGRyOworICBpZiAoX19rbXBfaHdzX3JlcXVlc3RlZCA9PSAwKQorICAgIGdvdG8gX2V4aXQ7IC8vIG5vIHRvcG9sb2d5IGxpbWl0aW5nIGFjdGlvbnMgcmVxdWVzdGVkLCBleGl0CisjaWYgS01QX1VTRV9IV0xPQworICBpZiAoX19rbXBfYWZmaW5pdHlfZGlzcGF0Y2gtPmdldF9hcGlfdHlwZSgpID09IEtNUEFmZmluaXR5OjpIV0xPQykgeworICAgIC8vIE51bWJlciBvZiBzdWJvYmplY3RzIGNhbGN1bGF0ZWQgZHluYW1pY2FsbHksIHRoaXMgd29ya3MgZmluZSBmb3IKKyAgICAvLyBhbnkgbm9uLXVuaWZvcm0gdG9wb2xvZ3kuCisgICAgLy8gTDIgY2FjaGUgb2JqZWN0cyBhcmUgZGV0ZXJtaW5lZCBieSBkZXB0aCwgb3RoZXIgb2JqZWN0cyAtIGJ5IHR5cGUuCisgICAgaHdsb2NfdG9wb2xvZ3lfdCB0cCA9IF9fa21wX2h3bG9jX3RvcG9sb2d5OworICAgIGludCBuUyA9IDAsIG5OID0gMCwgbkwgPSAwLCBuQyA9IDAsCisgICAgICAgIG5UID0gMDsgLy8gbG9naWNhbCBpbmRleCBpbmNsdWRpbmcgc2tpcHBlZAorICAgIGludCBuQ3IgPSAwLCBuVHIgPSAwOyAvLyBudW1iZXIgb2YgcmVxdWVzdGVkIHVuaXRzCisgICAgaW50IG5Qa2cgPSAwLCBuQ28gPSAwLCBuX25ldyA9IDAsIG5fb2xkID0gMCwgbkNwUCA9IDAsIG5UcEMgPSAwOyAvLyBjb3VudGVycworICAgIGh3bG9jX29ial90IGhULCBoQywgaEwsIGhOLCBoUzsgLy8gaHdsb2Mgb2JqZWN0cyAocG9pbnRlcnMgdG8pCisgICAgaW50IEwyZGVwdGgsIGlkeDsKKworICAgIC8vIGNoZWNrIHN1cHBvcnQgb2YgZXh0ZW5zaW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgaW50IG51bWFfc3VwcG9ydCA9IDAsIHRpbGVfc3VwcG9ydCA9IDA7CisgICAgaWYgKF9fa21wX3B1X29zX2lkeCkKKyAgICAgIGhUID0gaHdsb2NfZ2V0X3B1X29ial9ieV9vc19pbmRleCh0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9wdV9vc19pZHhbX19rbXBfYXZhaWxfcHJvYyAtIDFdKTsKKyAgICBlbHNlCisgICAgICBoVCA9IGh3bG9jX2dldF9vYmpfYnlfdHlwZSh0cCwgSFdMT0NfT0JKX1BVLCBfX2ttcF9hdmFpbF9wcm9jIC0gMSk7CisgICAgaWYgKGhUID09IE5VTEwpIHsgLy8gc29tZXRoaW5nJ3MgZ29uZSB3cm9uZworICAgICAgS01QX1dBUk5JTkcoQWZmSFdTdWJzZXRVbnN1cHBvcnRlZCk7CisgICAgICBnb3RvIF9leGl0OworICAgIH0KKyAgICAvLyBjaGVjayBOVU1BIG5vZGUKKyAgICBoTiA9IGh3bG9jX2dldF9hbmNlc3Rvcl9vYmpfYnlfdHlwZSh0cCwgSFdMT0NfT0JKX05VTUFOT0RFLCBoVCk7CisgICAgaFMgPSBod2xvY19nZXRfYW5jZXN0b3Jfb2JqX2J5X3R5cGUodHAsIEhXTE9DX09CSl9QQUNLQUdFLCBoVCk7CisgICAgaWYgKGhOICE9IE5VTEwgJiYgaE4tPmRlcHRoID4gaFMtPmRlcHRoKSB7CisgICAgICBudW1hX3N1cHBvcnQgPSAxOyAvLyAxIGluIGNhc2Ugc29ja2V0IGluY2x1ZGVzIG5vZGUocykKKyAgICB9IGVsc2UgaWYgKF9fa21wX2h3c19ub2RlLm51bSA+IDApIHsKKyAgICAgIC8vIGRvbid0IHN1cHBvcnQgc29ja2V0cyBpbnNpZGUgTlVNQSBub2RlIChubyBzdWNoIEhXIGZvdW5kIGZvciB0ZXN0aW5nKQorICAgICAgS01QX1dBUk5JTkcoQWZmSFdTdWJzZXRVbnN1cHBvcnRlZCk7CisgICAgICBnb3RvIF9leGl0OworICAgIH0KKyAgICAvLyBjaGVjayBMMiBjYWhjZSwgZ2V0IG9iamVjdCBieSBkZXB0aCBiZWNhdXNlIG9mIG11bHRpcGxlIGNhY2hlcworICAgIEwyZGVwdGggPSBod2xvY19nZXRfY2FjaGVfdHlwZV9kZXB0aCh0cCwgMiwgSFdMT0NfT0JKX0NBQ0hFX1VOSUZJRUQpOworICAgIGhMID0gaHdsb2NfZ2V0X2FuY2VzdG9yX29ial9ieV9kZXB0aCh0cCwgTDJkZXB0aCwgaFQpOworICAgIGlmIChoTCAhPSBOVUxMICYmCisgICAgICAgIF9fa21wX2h3bG9jX2NvdW50X2NoaWxkcmVuX2J5X3R5cGUodHAsIGhMLCBIV0xPQ19PQkpfQ09SRSwgJmhDKSA+IDEpIHsKKyAgICAgIHRpbGVfc3VwcG9ydCA9IDE7IC8vIG5vIHNlbnNlIHRvIGNvdW50IEwyIGlmIGl0IGluY2x1ZGVzIHNpbmdsZSBjb3JlCisgICAgfSBlbHNlIGlmIChfX2ttcF9od3NfdGlsZS5udW0gPiAwKSB7CisgICAgICBpZiAoX19rbXBfaHdzX2NvcmUubnVtID09IDApIHsKKyAgICAgICAgX19rbXBfaHdzX2NvcmUgPSBfX2ttcF9od3NfdGlsZTsgLy8gcmVwbGFjZSBMMiB3aXRoIGNvcmUKKyAgICAgICAgX19rbXBfaHdzX3RpbGUubnVtID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEwyIGFuZCBjb3JlIGFyZSBib3RoIHJlcXVlc3RlZCwgYnV0IHJlcHJlc2VudCBzYW1lIG9iamVjdAorICAgICAgICBLTVBfV0FSTklORyhBZmZIV1N1YnNldEludmFsaWQpOworICAgICAgICBnb3RvIF9leGl0OworICAgICAgfQorICAgIH0KKyAgICAvLyBlbmQgb2YgY2hlY2sgb2YgZXh0ZW5zaW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8gZmlsbCBpbiB1bnNldCBpdGVtcywgdmFsaWRhdGUgc2V0dGluZ3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBpZiAoX19rbXBfaHdzX3NvY2tldC5udW0gPT0gMCkKKyAgICAgIF9fa21wX2h3c19zb2NrZXQubnVtID0gblBhY2thZ2VzOyAvLyB1c2UgYWxsIGF2YWlsYWJsZSBzb2NrZXRzCisgICAgaWYgKF9fa21wX2h3c19zb2NrZXQub2Zmc2V0ID49IG5QYWNrYWdlcykgeworICAgICAgS01QX1dBUk5JTkcoQWZmSFdTdWJzZXRNYW55U29ja2V0cyk7CisgICAgICBnb3RvIF9leGl0OworICAgIH0KKyAgICBpZiAobnVtYV9zdXBwb3J0KSB7CisgICAgICBpbnQgTk4gPSBfX2ttcF9od2xvY19jb3VudF9jaGlsZHJlbl9ieV90eXBlKHRwLCBoUywgSFdMT0NfT0JKX05VTUFOT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaE4pOyAvLyBudW0gbm9kZXMgaW4gc29ja2V0CisgICAgICBpZiAoX19rbXBfaHdzX25vZGUubnVtID09IDApCisgICAgICAgIF9fa21wX2h3c19ub2RlLm51bSA9IE5OOyAvLyB1c2UgYWxsIGF2YWlsYWJsZSBub2RlcworICAgICAgaWYgKF9fa21wX2h3c19ub2RlLm9mZnNldCA+PSBOTikgeworICAgICAgICBLTVBfV0FSTklORyhBZmZIV1N1YnNldE1hbnlOb2Rlcyk7CisgICAgICAgIGdvdG8gX2V4aXQ7CisgICAgICB9CisgICAgICBpZiAodGlsZV9zdXBwb3J0KSB7CisgICAgICAgIC8vIGdldCBudW0gdGlsZXMgaW4gbm9kZQorICAgICAgICBpbnQgTkwgPSBfX2ttcF9od2xvY19jb3VudF9jaGlsZHJlbl9ieV9kZXB0aCh0cCwgaE4sIEwyZGVwdGgsICZoTCk7CisgICAgICAgIGlmIChfX2ttcF9od3NfdGlsZS5udW0gPT0gMCkgeworICAgICAgICAgIF9fa21wX2h3c190aWxlLm51bSA9IE5MICsgMTsKKyAgICAgICAgfSAvLyB1c2UgYWxsIGF2YWlsYWJsZSB0aWxlcywgc29tZSBub2RlIG1heSBoYXZlIG1vcmUgdGlsZXMsIHRodXMgKzEKKyAgICAgICAgaWYgKF9fa21wX2h3c190aWxlLm9mZnNldCA+PSBOTCkgeworICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZkhXU3Vic2V0TWFueVRpbGVzKTsKKyAgICAgICAgICBnb3RvIF9leGl0OworICAgICAgICB9CisgICAgICAgIGludCBOQyA9IF9fa21wX2h3bG9jX2NvdW50X2NoaWxkcmVuX2J5X3R5cGUodHAsIGhMLCBIV0xPQ19PQkpfQ09SRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEMpOyAvLyBudW0gY29yZXMgaW4gdGlsZQorICAgICAgICBpZiAoX19rbXBfaHdzX2NvcmUubnVtID09IDApCisgICAgICAgICAgX19rbXBfaHdzX2NvcmUubnVtID0gTkM7IC8vIHVzZSBhbGwgYXZhaWxhYmxlIGNvcmVzCisgICAgICAgIGlmIChfX2ttcF9od3NfY29yZS5vZmZzZXQgPj0gTkMpIHsKKyAgICAgICAgICBLTVBfV0FSTklORyhBZmZIV1N1YnNldE1hbnlDb3Jlcyk7CisgICAgICAgICAgZ290byBfZXhpdDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsgLy8gdGlsZV9zdXBwb3J0CisgICAgICAgIGludCBOQyA9IF9fa21wX2h3bG9jX2NvdW50X2NoaWxkcmVuX2J5X3R5cGUodHAsIGhOLCBIV0xPQ19PQkpfQ09SRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEMpOyAvLyBudW0gY29yZXMgaW4gbm9kZQorICAgICAgICBpZiAoX19rbXBfaHdzX2NvcmUubnVtID09IDApCisgICAgICAgICAgX19rbXBfaHdzX2NvcmUubnVtID0gTkM7IC8vIHVzZSBhbGwgYXZhaWxhYmxlIGNvcmVzCisgICAgICAgIGlmIChfX2ttcF9od3NfY29yZS5vZmZzZXQgPj0gTkMpIHsKKyAgICAgICAgICBLTVBfV0FSTklORyhBZmZIV1N1YnNldE1hbnlDb3Jlcyk7CisgICAgICAgICAgZ290byBfZXhpdDsKKyAgICAgICAgfQorICAgICAgfSAvLyB0aWxlX3N1cHBvcnQKKyAgICB9IGVsc2UgeyAvLyBudW1hX3N1cHBvcnQKKyAgICAgIGlmICh0aWxlX3N1cHBvcnQpIHsKKyAgICAgICAgLy8gZ2V0IG51bSB0aWxlcyBpbiBzb2NrZXQKKyAgICAgICAgaW50IE5MID0gX19rbXBfaHdsb2NfY291bnRfY2hpbGRyZW5fYnlfZGVwdGgodHAsIGhTLCBMMmRlcHRoLCAmaEwpOworICAgICAgICBpZiAoX19rbXBfaHdzX3RpbGUubnVtID09IDApCisgICAgICAgICAgX19rbXBfaHdzX3RpbGUubnVtID0gTkw7IC8vIHVzZSBhbGwgYXZhaWxhYmxlIHRpbGVzCisgICAgICAgIGlmIChfX2ttcF9od3NfdGlsZS5vZmZzZXQgPj0gTkwpIHsKKyAgICAgICAgICBLTVBfV0FSTklORyhBZmZIV1N1YnNldE1hbnlUaWxlcyk7CisgICAgICAgICAgZ290byBfZXhpdDsKKyAgICAgICAgfQorICAgICAgICBpbnQgTkMgPSBfX2ttcF9od2xvY19jb3VudF9jaGlsZHJlbl9ieV90eXBlKHRwLCBoTCwgSFdMT0NfT0JKX0NPUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhDKTsgLy8gbnVtIGNvcmVzIGluIHRpbGUKKyAgICAgICAgaWYgKF9fa21wX2h3c19jb3JlLm51bSA9PSAwKQorICAgICAgICAgIF9fa21wX2h3c19jb3JlLm51bSA9IE5DOyAvLyB1c2UgYWxsIGF2YWlsYWJsZSBjb3JlcworICAgICAgICBpZiAoX19rbXBfaHdzX2NvcmUub2Zmc2V0ID49IE5DKSB7CisgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSFdTdWJzZXRNYW55Q29yZXMpOworICAgICAgICAgIGdvdG8gX2V4aXQ7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7IC8vIHRpbGVfc3VwcG9ydAorICAgICAgICBpbnQgTkMgPSBfX2ttcF9od2xvY19jb3VudF9jaGlsZHJlbl9ieV90eXBlKHRwLCBoUywgSFdMT0NfT0JKX0NPUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhDKTsgLy8gbnVtIGNvcmVzIGluIHNvY2tldAorICAgICAgICBpZiAoX19rbXBfaHdzX2NvcmUubnVtID09IDApCisgICAgICAgICAgX19rbXBfaHdzX2NvcmUubnVtID0gTkM7IC8vIHVzZSBhbGwgYXZhaWxhYmxlIGNvcmVzCisgICAgICAgIGlmIChfX2ttcF9od3NfY29yZS5vZmZzZXQgPj0gTkMpIHsKKyAgICAgICAgICBLTVBfV0FSTklORyhBZmZIV1N1YnNldE1hbnlDb3Jlcyk7CisgICAgICAgICAgZ290byBfZXhpdDsKKyAgICAgICAgfQorICAgICAgfSAvLyB0aWxlX3N1cHBvcnQKKyAgICB9CisgICAgaWYgKF9fa21wX2h3c19wcm9jLm51bSA9PSAwKQorICAgICAgX19rbXBfaHdzX3Byb2MubnVtID0gX19rbXBfblRocmVhZHNQZXJDb3JlOyAvLyB1c2UgYWxsIGF2YWlsYWJsZSBwcm9jcworICAgIGlmIChfX2ttcF9od3NfcHJvYy5vZmZzZXQgPj0gX19rbXBfblRocmVhZHNQZXJDb3JlKSB7CisgICAgICBLTVBfV0FSTklORyhBZmZIV1N1YnNldE1hbnlQcm9jcyk7CisgICAgICBnb3RvIF9leGl0OworICAgIH0KKyAgICAvLyBlbmQgb2YgdmFsaWRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgaWYgKHBBZGRyKSAvLyBwQWRkciBpcyBOVUxMIGluIGNhc2Ugb2YgYWZmaW5pdHlfbm9uZQorICAgICAgbmV3QWRkciA9IChBZGRyVW5zUGFpciAqKV9fa21wX2FsbG9jYXRlKHNpemVvZihBZGRyVW5zUGFpcikgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2F2YWlsX3Byb2MpOyAvLyBtYXggc2l6ZQorICAgIC8vIG1haW4gbG9vcCB0byBmb3JtIEhXIHN1YnNldCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgaFMgPSBOVUxMOworICAgIGludCBOUCA9IGh3bG9jX2dldF9uYm9ianNfYnlfdHlwZSh0cCwgSFdMT0NfT0JKX1BBQ0tBR0UpOworICAgIGZvciAoaW50IHMgPSAwOyBzIDwgTlA7ICsrcykgeworICAgICAgLy8gQ2hlY2sgU29ja2V0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICBoUyA9IGh3bG9jX2dldF9uZXh0X29ial9ieV90eXBlKHRwLCBIV0xPQ19PQkpfUEFDS0FHRSwgaFMpOworICAgICAgaWYgKCFfX2ttcF9od2xvY19vYmpfaGFzX1BVcyh0cCwgaFMpKQorICAgICAgICBjb250aW51ZTsgLy8gc2tpcCBzb2NrZXQgaWYgYWxsIFBVcyBhcmUgb3V0IG9mIGZ1bGxNYXNrCisgICAgICArK25TOyAvLyBvbmx5IGNvdW50IG9iamVjdHMgdGhvc2UgaGF2ZSBQVXMgaW4gYWZmaW5pdHkgbWFzaworICAgICAgaWYgKG5TIDw9IF9fa21wX2h3c19zb2NrZXQub2Zmc2V0IHx8CisgICAgICAgICAgblMgPiBfX2ttcF9od3Nfc29ja2V0Lm51bSArIF9fa21wX2h3c19zb2NrZXQub2Zmc2V0KSB7CisgICAgICAgIG5fb2xkICs9IF9fa21wX2h3bG9jX3NraXBfUFVzX29iaih0cCwgaFMpOyAvLyBza2lwIHNvY2tldAorICAgICAgICBjb250aW51ZTsgLy8gbW92ZSB0byBuZXh0IHNvY2tldAorICAgICAgfQorICAgICAgbkNyID0gMDsgLy8gY291bnQgbnVtYmVyIG9mIGNvcmVzIHBlciBzb2NrZXQKKyAgICAgIC8vIHNvY2tldCByZXF1ZXN0ZWQsIGdvIGRvd24gdGhlIHRvcG9sb2d5IHRyZWUKKyAgICAgIC8vIGNoZWNrIDQgY2FzZXM6ICgrTlVNQStUaWxlKSwgKCtOVU1BLVRpbGUpLCAoLU5VTUErVGlsZSksICgtTlVNQS1UaWxlKQorICAgICAgaWYgKG51bWFfc3VwcG9ydCkgeworICAgICAgICBuTiA9IDA7CisgICAgICAgIGhOID0gTlVMTDsKKyAgICAgICAgLy8gbnVtIG5vZGVzIGluIGN1cnJlbnQgc29ja2V0CisgICAgICAgIGludCBOTiA9CisgICAgICAgICAgICBfX2ttcF9od2xvY19jb3VudF9jaGlsZHJlbl9ieV90eXBlKHRwLCBoUywgSFdMT0NfT0JKX05VTUFOT0RFLCAmaE4pOworICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IE5OOyArK24pIHsKKyAgICAgICAgICAvLyBDaGVjayBOVU1BIE5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgIGlmICghX19rbXBfaHdsb2Nfb2JqX2hhc19QVXModHAsIGhOKSkgeworICAgICAgICAgICAgaE4gPSBod2xvY19nZXRfbmV4dF9vYmpfYnlfdHlwZSh0cCwgSFdMT0NfT0JKX05VTUFOT0RFLCBoTik7CisgICAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcCBub2RlIGlmIGFsbCBQVXMgYXJlIG91dCBvZiBmdWxsTWFzaworICAgICAgICAgIH0KKyAgICAgICAgICArK25OOworICAgICAgICAgIGlmIChuTiA8PSBfX2ttcF9od3Nfbm9kZS5vZmZzZXQgfHwKKyAgICAgICAgICAgICAgbk4gPiBfX2ttcF9od3Nfbm9kZS5udW0gKyBfX2ttcF9od3Nfbm9kZS5vZmZzZXQpIHsKKyAgICAgICAgICAgIC8vIHNraXAgbm9kZSBhcyBub3QgcmVxdWVzdGVkCisgICAgICAgICAgICBuX29sZCArPSBfX2ttcF9od2xvY19za2lwX1BVc19vYmoodHAsIGhOKTsgLy8gc2tpcCBub2RlCisgICAgICAgICAgICBoTiA9IGh3bG9jX2dldF9uZXh0X29ial9ieV90eXBlKHRwLCBIV0xPQ19PQkpfTlVNQU5PREUsIGhOKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBtb3ZlIHRvIG5leHQgbm9kZQorICAgICAgICAgIH0KKyAgICAgICAgICAvLyBub2RlIHJlcXVlc3RlZCwgZ28gZG93biB0aGUgdG9wb2xvZ3kgdHJlZQorICAgICAgICAgIGlmICh0aWxlX3N1cHBvcnQpIHsKKyAgICAgICAgICAgIG5MID0gMDsKKyAgICAgICAgICAgIGhMID0gTlVMTDsKKyAgICAgICAgICAgIGludCBOTCA9IF9fa21wX2h3bG9jX2NvdW50X2NoaWxkcmVuX2J5X2RlcHRoKHRwLCBoTiwgTDJkZXB0aCwgJmhMKTsKKyAgICAgICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgTkw7ICsrbCkgeworICAgICAgICAgICAgICAvLyBDaGVjayBMMiAodGlsZSkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgIGlmICghX19rbXBfaHdsb2Nfb2JqX2hhc19QVXModHAsIGhMKSkgeworICAgICAgICAgICAgICAgIGhMID0gaHdsb2NfZ2V0X25leHRfb2JqX2J5X2RlcHRoKHRwLCBMMmRlcHRoLCBoTCk7CisgICAgICAgICAgICAgICAgY29udGludWU7IC8vIHNraXAgdGlsZSBpZiBhbGwgUFVzIGFyZSBvdXQgb2YgZnVsbE1hc2sKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICArK25MOworICAgICAgICAgICAgICBpZiAobkwgPD0gX19rbXBfaHdzX3RpbGUub2Zmc2V0IHx8CisgICAgICAgICAgICAgICAgICBuTCA+IF9fa21wX2h3c190aWxlLm51bSArIF9fa21wX2h3c190aWxlLm9mZnNldCkgeworICAgICAgICAgICAgICAgIC8vIHNraXAgdGlsZSBhcyBub3QgcmVxdWVzdGVkCisgICAgICAgICAgICAgICAgbl9vbGQgKz0gX19rbXBfaHdsb2Nfc2tpcF9QVXNfb2JqKHRwLCBoTCk7IC8vIHNraXAgdGlsZQorICAgICAgICAgICAgICAgIGhMID0gaHdsb2NfZ2V0X25leHRfb2JqX2J5X2RlcHRoKHRwLCBMMmRlcHRoLCBoTCk7CisgICAgICAgICAgICAgICAgY29udGludWU7IC8vIG1vdmUgdG8gbmV4dCB0aWxlCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgLy8gdGlsZSByZXF1ZXN0ZWQsIGdvIGRvd24gdGhlIHRvcG9sb2d5IHRyZWUKKyAgICAgICAgICAgICAgbkMgPSAwOworICAgICAgICAgICAgICBoQyA9IE5VTEw7CisgICAgICAgICAgICAgIC8vIG51bSBjb3JlcyBpbiBjdXJyZW50IHRpbGUKKyAgICAgICAgICAgICAgaW50IE5DID0gX19rbXBfaHdsb2NfY291bnRfY2hpbGRyZW5fYnlfdHlwZSh0cCwgaEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFdMT0NfT0JKX0NPUkUsICZoQyk7CisgICAgICAgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgTkM7ICsrYykgeworICAgICAgICAgICAgICAgIC8vIENoZWNrIENvcmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgaWYgKCFfX2ttcF9od2xvY19vYmpfaGFzX1BVcyh0cCwgaEMpKSB7CisgICAgICAgICAgICAgICAgICBoQyA9IGh3bG9jX2dldF9uZXh0X29ial9ieV90eXBlKHRwLCBIV0xPQ19PQkpfQ09SRSwgaEMpOworICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIHNraXAgY29yZSBpZiBhbGwgUFVzIGFyZSBvdXQgb2YgZnVsbE1hc2sKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKytuQzsKKyAgICAgICAgICAgICAgICBpZiAobkMgPD0gX19rbXBfaHdzX2NvcmUub2Zmc2V0IHx8CisgICAgICAgICAgICAgICAgICAgIG5DID4gX19rbXBfaHdzX2NvcmUubnVtICsgX19rbXBfaHdzX2NvcmUub2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAvLyBza2lwIG5vZGUgYXMgbm90IHJlcXVlc3RlZAorICAgICAgICAgICAgICAgICAgbl9vbGQgKz0gX19rbXBfaHdsb2Nfc2tpcF9QVXNfb2JqKHRwLCBoQyk7IC8vIHNraXAgY29yZQorICAgICAgICAgICAgICAgICAgaEMgPSBod2xvY19nZXRfbmV4dF9vYmpfYnlfdHlwZSh0cCwgSFdMT0NfT0JKX0NPUkUsIGhDKTsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBtb3ZlIHRvIG5leHQgbm9kZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBjb3JlIHJlcXVlc3RlZCwgZ28gZG93biB0byBQVXMKKyAgICAgICAgICAgICAgICBuVCA9IDA7CisgICAgICAgICAgICAgICAgblRyID0gMDsKKyAgICAgICAgICAgICAgICBoVCA9IE5VTEw7CisgICAgICAgICAgICAgICAgLy8gbnVtIHByb2NzIGluIGN1cnJlbnQgY29yZQorICAgICAgICAgICAgICAgIGludCBOVCA9IF9fa21wX2h3bG9jX2NvdW50X2NoaWxkcmVuX2J5X3R5cGUodHAsIGhDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFdMT0NfT0JKX1BVLCAmaFQpOworICAgICAgICAgICAgICAgIGZvciAoaW50IHQgPSAwOyB0IDwgTlQ7ICsrdCkgeworICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgUFUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICBpZHggPSBoVC0+b3NfaW5kZXg7CisgICAgICAgICAgICAgICAgICBpZiAoIUtNUF9DUFVfSVNTRVQoaWR4LCBfX2ttcF9hZmZpbl9mdWxsTWFzaykpIHsKKyAgICAgICAgICAgICAgICAgICAgaFQgPSBod2xvY19nZXRfbmV4dF9vYmpfYnlfdHlwZSh0cCwgSFdMT0NfT0JKX1BVLCBoVCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBza2lwIFBVIGlmIG5vdCBpbiBmdWxsTWFzaworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgKytuVDsKKyAgICAgICAgICAgICAgICAgIGlmIChuVCA8PSBfX2ttcF9od3NfcHJvYy5vZmZzZXQgfHwKKyAgICAgICAgICAgICAgICAgICAgICBuVCA+IF9fa21wX2h3c19wcm9jLm51bSArIF9fa21wX2h3c19wcm9jLm9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICAvLyBza2lwIFBVCisgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfQ0xSKGlkeCwgX19rbXBfYWZmaW5fZnVsbE1hc2spOworICAgICAgICAgICAgICAgICAgICArK25fb2xkOworICAgICAgICAgICAgICAgICAgICBLQ19UUkFDRSgyMDAsICgiS01QX0hXX1NVQlNFVDogc2tpcHBlZCBwcm9jICVkXG4iLCBpZHgpKTsKKyAgICAgICAgICAgICAgICAgICAgaFQgPSBod2xvY19nZXRfbmV4dF9vYmpfYnlfdHlwZSh0cCwgSFdMT0NfT0JKX1BVLCBoVCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBtb3ZlIHRvIG5leHQgbm9kZQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgKytuVHI7CisgICAgICAgICAgICAgICAgICBpZiAocEFkZHIpIC8vIGNvbGxlY3QgcmVxdWVzdGVkIHRocmVhZCdzIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgbmV3QWRkcltuX25ld10gPSAoKnBBZGRyKVtuX29sZF07CisgICAgICAgICAgICAgICAgICArK25fbmV3OworICAgICAgICAgICAgICAgICAgKytuX29sZDsKKyAgICAgICAgICAgICAgICAgIGhUID0gaHdsb2NfZ2V0X25leHRfb2JqX2J5X3R5cGUodHAsIEhXTE9DX09CSl9QVSwgaFQpOworICAgICAgICAgICAgICAgIH0gLy8gdGhyZWFkcyBsb29wCisgICAgICAgICAgICAgICAgaWYgKG5UciA+IDApIHsKKyAgICAgICAgICAgICAgICAgICsrbkNyOyAvLyBudW0gY29yZXMgcGVyIHNvY2tldAorICAgICAgICAgICAgICAgICAgKytuQ287IC8vIHRvdGFsIG51bSBjb3JlcworICAgICAgICAgICAgICAgICAgaWYgKG5UciA+IG5UcEMpCisgICAgICAgICAgICAgICAgICAgIG5UcEMgPSBuVHI7IC8vIGNhbGMgbWF4IHRocmVhZHMgcGVyIGNvcmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaEMgPSBod2xvY19nZXRfbmV4dF9vYmpfYnlfdHlwZSh0cCwgSFdMT0NfT0JKX0NPUkUsIGhDKTsKKyAgICAgICAgICAgICAgfSAvLyBjb3JlcyBsb29wCisgICAgICAgICAgICAgIGhMID0gaHdsb2NfZ2V0X25leHRfb2JqX2J5X2RlcHRoKHRwLCBMMmRlcHRoLCBoTCk7CisgICAgICAgICAgICB9IC8vIHRpbGVzIGxvb3AKKyAgICAgICAgICB9IGVsc2UgeyAvLyB0aWxlX3N1cHBvcnQKKyAgICAgICAgICAgIC8vIG5vIHRpbGVzLCBjaGVjayBjb3JlcworICAgICAgICAgICAgbkMgPSAwOworICAgICAgICAgICAgaEMgPSBOVUxMOworICAgICAgICAgICAgLy8gbnVtIGNvcmVzIGluIGN1cnJlbnQgbm9kZQorICAgICAgICAgICAgaW50IE5DID0KKyAgICAgICAgICAgICAgICBfX2ttcF9od2xvY19jb3VudF9jaGlsZHJlbl9ieV90eXBlKHRwLCBoTiwgSFdMT0NfT0JKX0NPUkUsICZoQyk7CisgICAgICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IE5DOyArK2MpIHsKKyAgICAgICAgICAgICAgLy8gQ2hlY2sgQ29yZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgaWYgKCFfX2ttcF9od2xvY19vYmpfaGFzX1BVcyh0cCwgaEMpKSB7CisgICAgICAgICAgICAgICAgaEMgPSBod2xvY19nZXRfbmV4dF9vYmpfYnlfdHlwZSh0cCwgSFdMT0NfT0JKX0NPUkUsIGhDKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcCBjb3JlIGlmIGFsbCBQVXMgYXJlIG91dCBvZiBmdWxsTWFzaworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICsrbkM7CisgICAgICAgICAgICAgIGlmIChuQyA8PSBfX2ttcF9od3NfY29yZS5vZmZzZXQgfHwKKyAgICAgICAgICAgICAgICAgIG5DID4gX19rbXBfaHdzX2NvcmUubnVtICsgX19rbXBfaHdzX2NvcmUub2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgLy8gc2tpcCBub2RlIGFzIG5vdCByZXF1ZXN0ZWQKKyAgICAgICAgICAgICAgICBuX29sZCArPSBfX2ttcF9od2xvY19za2lwX1BVc19vYmoodHAsIGhDKTsgLy8gc2tpcCBjb3JlCisgICAgICAgICAgICAgICAgaEMgPSBod2xvY19nZXRfbmV4dF9vYmpfYnlfdHlwZSh0cCwgSFdMT0NfT0JKX0NPUkUsIGhDKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gbW92ZSB0byBuZXh0IG5vZGUKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAvLyBjb3JlIHJlcXVlc3RlZCwgZ28gZG93biB0byBQVXMKKyAgICAgICAgICAgICAgblQgPSAwOworICAgICAgICAgICAgICBuVHIgPSAwOworICAgICAgICAgICAgICBoVCA9IE5VTEw7CisgICAgICAgICAgICAgIGludCBOVCA9CisgICAgICAgICAgICAgICAgICBfX2ttcF9od2xvY19jb3VudF9jaGlsZHJlbl9ieV90eXBlKHRwLCBoQywgSFdMT0NfT0JKX1BVLCAmaFQpOworICAgICAgICAgICAgICBmb3IgKGludCB0ID0gMDsgdCA8IE5UOyArK3QpIHsKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBQVSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICBpZHggPSBoVC0+b3NfaW5kZXg7CisgICAgICAgICAgICAgICAgaWYgKCFLTVBfQ1BVX0lTU0VUKGlkeCwgX19rbXBfYWZmaW5fZnVsbE1hc2spKSB7CisgICAgICAgICAgICAgICAgICBoVCA9IGh3bG9jX2dldF9uZXh0X29ial9ieV90eXBlKHRwLCBIV0xPQ19PQkpfUFUsIGhUKTsKKyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBza2lwIFBVIGlmIG5vdCBpbiBmdWxsTWFzaworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK25UOworICAgICAgICAgICAgICAgIGlmIChuVCA8PSBfX2ttcF9od3NfcHJvYy5vZmZzZXQgfHwKKyAgICAgICAgICAgICAgICAgICAgblQgPiBfX2ttcF9od3NfcHJvYy5udW0gKyBfX2ttcF9od3NfcHJvYy5vZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgIC8vIHNraXAgUFUKKyAgICAgICAgICAgICAgICAgIEtNUF9DUFVfQ0xSKGlkeCwgX19rbXBfYWZmaW5fZnVsbE1hc2spOworICAgICAgICAgICAgICAgICAgKytuX29sZDsKKyAgICAgICAgICAgICAgICAgIEtDX1RSQUNFKDIwMCwgKCJLTVBfSFdfU1VCU0VUOiBza2lwcGVkIHByb2MgJWRcbiIsIGlkeCkpOworICAgICAgICAgICAgICAgICAgaFQgPSBod2xvY19nZXRfbmV4dF9vYmpfYnlfdHlwZSh0cCwgSFdMT0NfT0JKX1BVLCBoVCk7CisgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gbW92ZSB0byBuZXh0IG5vZGUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKytuVHI7CisgICAgICAgICAgICAgICAgaWYgKHBBZGRyKSAvLyBjb2xsZWN0IHJlcXVlc3RlZCB0aHJlYWQncyBkYXRhCisgICAgICAgICAgICAgICAgICBuZXdBZGRyW25fbmV3XSA9ICgqcEFkZHIpW25fb2xkXTsKKyAgICAgICAgICAgICAgICArK25fbmV3OworICAgICAgICAgICAgICAgICsrbl9vbGQ7CisgICAgICAgICAgICAgICAgaFQgPSBod2xvY19nZXRfbmV4dF9vYmpfYnlfdHlwZSh0cCwgSFdMT0NfT0JKX1BVLCBoVCk7CisgICAgICAgICAgICAgIH0gLy8gdGhyZWFkcyBsb29wCisgICAgICAgICAgICAgIGlmIChuVHIgPiAwKSB7CisgICAgICAgICAgICAgICAgKytuQ3I7IC8vIG51bSBjb3JlcyBwZXIgc29ja2V0CisgICAgICAgICAgICAgICAgKytuQ287IC8vIHRvdGFsIG51bSBjb3JlcworICAgICAgICAgICAgICAgIGlmIChuVHIgPiBuVHBDKQorICAgICAgICAgICAgICAgICAgblRwQyA9IG5UcjsgLy8gY2FsYyBtYXggdGhyZWFkcyBwZXIgY29yZQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGhDID0gaHdsb2NfZ2V0X25leHRfb2JqX2J5X3R5cGUodHAsIEhXTE9DX09CSl9DT1JFLCBoQyk7CisgICAgICAgICAgICB9IC8vIGNvcmVzIGxvb3AKKyAgICAgICAgICB9IC8vIHRpbGVzIHN1cHBvcnQKKyAgICAgICAgICBoTiA9IGh3bG9jX2dldF9uZXh0X29ial9ieV90eXBlKHRwLCBIV0xPQ19PQkpfTlVNQU5PREUsIGhOKTsKKyAgICAgICAgfSAvLyBub2RlcyBsb29wCisgICAgICB9IGVsc2UgeyAvLyBudW1hX3N1cHBvcnQKKyAgICAgICAgLy8gbm8gTlVNQSBzdXBwb3J0CisgICAgICAgIGlmICh0aWxlX3N1cHBvcnQpIHsKKyAgICAgICAgICBuTCA9IDA7CisgICAgICAgICAgaEwgPSBOVUxMOworICAgICAgICAgIC8vIG51bSB0aWxlcyBpbiBjdXJyZW50IHNvY2tldAorICAgICAgICAgIGludCBOTCA9IF9fa21wX2h3bG9jX2NvdW50X2NoaWxkcmVuX2J5X2RlcHRoKHRwLCBoUywgTDJkZXB0aCwgJmhMKTsKKyAgICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IE5MOyArK2wpIHsKKyAgICAgICAgICAgIC8vIENoZWNrIEwyICh0aWxlKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIGlmICghX19rbXBfaHdsb2Nfb2JqX2hhc19QVXModHAsIGhMKSkgeworICAgICAgICAgICAgICBoTCA9IGh3bG9jX2dldF9uZXh0X29ial9ieV9kZXB0aCh0cCwgTDJkZXB0aCwgaEwpOworICAgICAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcCB0aWxlIGlmIGFsbCBQVXMgYXJlIG91dCBvZiBmdWxsTWFzaworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytuTDsKKyAgICAgICAgICAgIGlmIChuTCA8PSBfX2ttcF9od3NfdGlsZS5vZmZzZXQgfHwKKyAgICAgICAgICAgICAgICBuTCA+IF9fa21wX2h3c190aWxlLm51bSArIF9fa21wX2h3c190aWxlLm9mZnNldCkgeworICAgICAgICAgICAgICAvLyBza2lwIHRpbGUgYXMgbm90IHJlcXVlc3RlZAorICAgICAgICAgICAgICBuX29sZCArPSBfX2ttcF9od2xvY19za2lwX1BVc19vYmoodHAsIGhMKTsgLy8gc2tpcCB0aWxlCisgICAgICAgICAgICAgIGhMID0gaHdsb2NfZ2V0X25leHRfb2JqX2J5X2RlcHRoKHRwLCBMMmRlcHRoLCBoTCk7CisgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBtb3ZlIHRvIG5leHQgdGlsZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gdGlsZSByZXF1ZXN0ZWQsIGdvIGRvd24gdGhlIHRvcG9sb2d5IHRyZWUKKyAgICAgICAgICAgIG5DID0gMDsKKyAgICAgICAgICAgIGhDID0gTlVMTDsKKyAgICAgICAgICAgIC8vIG51bSBjb3JlcyBwZXIgdGlsZQorICAgICAgICAgICAgaW50IE5DID0KKyAgICAgICAgICAgICAgICBfX2ttcF9od2xvY19jb3VudF9jaGlsZHJlbl9ieV90eXBlKHRwLCBoTCwgSFdMT0NfT0JKX0NPUkUsICZoQyk7CisgICAgICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IE5DOyArK2MpIHsKKyAgICAgICAgICAgICAgLy8gQ2hlY2sgQ29yZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgaWYgKCFfX2ttcF9od2xvY19vYmpfaGFzX1BVcyh0cCwgaEMpKSB7CisgICAgICAgICAgICAgICAgaEMgPSBod2xvY19nZXRfbmV4dF9vYmpfYnlfdHlwZSh0cCwgSFdMT0NfT0JKX0NPUkUsIGhDKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcCBjb3JlIGlmIGFsbCBQVXMgYXJlIG91dCBvZiBmdWxsTWFzaworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICsrbkM7CisgICAgICAgICAgICAgIGlmIChuQyA8PSBfX2ttcF9od3NfY29yZS5vZmZzZXQgfHwKKyAgICAgICAgICAgICAgICAgIG5DID4gX19rbXBfaHdzX2NvcmUubnVtICsgX19rbXBfaHdzX2NvcmUub2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgLy8gc2tpcCBub2RlIGFzIG5vdCByZXF1ZXN0ZWQKKyAgICAgICAgICAgICAgICBuX29sZCArPSBfX2ttcF9od2xvY19za2lwX1BVc19vYmoodHAsIGhDKTsgLy8gc2tpcCBjb3JlCisgICAgICAgICAgICAgICAgaEMgPSBod2xvY19nZXRfbmV4dF9vYmpfYnlfdHlwZSh0cCwgSFdMT0NfT0JKX0NPUkUsIGhDKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gbW92ZSB0byBuZXh0IG5vZGUKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAvLyBjb3JlIHJlcXVlc3RlZCwgZ28gZG93biB0byBQVXMKKyAgICAgICAgICAgICAgblQgPSAwOworICAgICAgICAgICAgICBuVHIgPSAwOworICAgICAgICAgICAgICBoVCA9IE5VTEw7CisgICAgICAgICAgICAgIC8vIG51bSBwcm9jcyBwZXIgY29yZQorICAgICAgICAgICAgICBpbnQgTlQgPQorICAgICAgICAgICAgICAgICAgX19rbXBfaHdsb2NfY291bnRfY2hpbGRyZW5fYnlfdHlwZSh0cCwgaEMsIEhXTE9DX09CSl9QVSwgJmhUKTsKKyAgICAgICAgICAgICAgZm9yIChpbnQgdCA9IDA7IHQgPCBOVDsgKyt0KSB7CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgUFUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgaWR4ID0gaFQtPm9zX2luZGV4OworICAgICAgICAgICAgICAgIGlmICghS01QX0NQVV9JU1NFVChpZHgsIF9fa21wX2FmZmluX2Z1bGxNYXNrKSkgeworICAgICAgICAgICAgICAgICAgaFQgPSBod2xvY19nZXRfbmV4dF9vYmpfYnlfdHlwZSh0cCwgSFdMT0NfT0JKX1BVLCBoVCk7CisgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcCBQVSBpZiBub3QgaW4gZnVsbE1hc2sKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKytuVDsKKyAgICAgICAgICAgICAgICBpZiAoblQgPD0gX19rbXBfaHdzX3Byb2Mub2Zmc2V0IHx8CisgICAgICAgICAgICAgICAgICAgIG5UID4gX19rbXBfaHdzX3Byb2MubnVtICsgX19rbXBfaHdzX3Byb2Mub2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAvLyBza2lwIFBVCisgICAgICAgICAgICAgICAgICBLTVBfQ1BVX0NMUihpZHgsIF9fa21wX2FmZmluX2Z1bGxNYXNrKTsKKyAgICAgICAgICAgICAgICAgICsrbl9vbGQ7CisgICAgICAgICAgICAgICAgICBLQ19UUkFDRSgyMDAsICgiS01QX0hXX1NVQlNFVDogc2tpcHBlZCBwcm9jICVkXG4iLCBpZHgpKTsKKyAgICAgICAgICAgICAgICAgIGhUID0gaHdsb2NfZ2V0X25leHRfb2JqX2J5X3R5cGUodHAsIEhXTE9DX09CSl9QVSwgaFQpOworICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIG1vdmUgdG8gbmV4dCBub2RlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICsrblRyOworICAgICAgICAgICAgICAgIGlmIChwQWRkcikgLy8gY29sbGVjdCByZXF1ZXN0ZWQgdGhyZWFkJ3MgZGF0YQorICAgICAgICAgICAgICAgICAgbmV3QWRkcltuX25ld10gPSAoKnBBZGRyKVtuX29sZF07CisgICAgICAgICAgICAgICAgKytuX25ldzsKKyAgICAgICAgICAgICAgICArK25fb2xkOworICAgICAgICAgICAgICAgIGhUID0gaHdsb2NfZ2V0X25leHRfb2JqX2J5X3R5cGUodHAsIEhXTE9DX09CSl9QVSwgaFQpOworICAgICAgICAgICAgICB9IC8vIHRocmVhZHMgbG9vcAorICAgICAgICAgICAgICBpZiAoblRyID4gMCkgeworICAgICAgICAgICAgICAgICsrbkNyOyAvLyBudW0gY29yZXMgcGVyIHNvY2tldAorICAgICAgICAgICAgICAgICsrbkNvOyAvLyB0b3RhbCBudW0gY29yZXMKKyAgICAgICAgICAgICAgICBpZiAoblRyID4gblRwQykKKyAgICAgICAgICAgICAgICAgIG5UcEMgPSBuVHI7IC8vIGNhbGMgbWF4IHRocmVhZHMgcGVyIGNvcmUKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBoQyA9IGh3bG9jX2dldF9uZXh0X29ial9ieV90eXBlKHRwLCBIV0xPQ19PQkpfQ09SRSwgaEMpOworICAgICAgICAgICAgfSAvLyBjb3JlcyBsb29wCisgICAgICAgICAgICBoTCA9IGh3bG9jX2dldF9uZXh0X29ial9ieV9kZXB0aCh0cCwgTDJkZXB0aCwgaEwpOworICAgICAgICAgIH0gLy8gdGlsZXMgbG9vcAorICAgICAgICB9IGVsc2UgeyAvLyB0aWxlX3N1cHBvcnQKKyAgICAgICAgICAvLyBubyB0aWxlcywgY2hlY2sgY29yZXMKKyAgICAgICAgICBuQyA9IDA7CisgICAgICAgICAgaEMgPSBOVUxMOworICAgICAgICAgIC8vIG51bSBjb3JlcyBpbiBzb2NrZXQKKyAgICAgICAgICBpbnQgTkMgPQorICAgICAgICAgICAgICBfX2ttcF9od2xvY19jb3VudF9jaGlsZHJlbl9ieV90eXBlKHRwLCBoUywgSFdMT0NfT0JKX0NPUkUsICZoQyk7CisgICAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBOQzsgKytjKSB7CisgICAgICAgICAgICAvLyBDaGVjayBDb3JlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgIGlmICghX19rbXBfaHdsb2Nfb2JqX2hhc19QVXModHAsIGhDKSkgeworICAgICAgICAgICAgICBoQyA9IGh3bG9jX2dldF9uZXh0X29ial9ieV90eXBlKHRwLCBIV0xPQ19PQkpfQ09SRSwgaEMpOworICAgICAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcCBjb3JlIGlmIGFsbCBQVXMgYXJlIG91dCBvZiBmdWxsTWFzaworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytuQzsKKyAgICAgICAgICAgIGlmIChuQyA8PSBfX2ttcF9od3NfY29yZS5vZmZzZXQgfHwKKyAgICAgICAgICAgICAgICBuQyA+IF9fa21wX2h3c19jb3JlLm51bSArIF9fa21wX2h3c19jb3JlLm9mZnNldCkgeworICAgICAgICAgICAgICAvLyBza2lwIG5vZGUgYXMgbm90IHJlcXVlc3RlZAorICAgICAgICAgICAgICBuX29sZCArPSBfX2ttcF9od2xvY19za2lwX1BVc19vYmoodHAsIGhDKTsgLy8gc2tpcCBjb3JlCisgICAgICAgICAgICAgIGhDID0gaHdsb2NfZ2V0X25leHRfb2JqX2J5X3R5cGUodHAsIEhXTE9DX09CSl9DT1JFLCBoQyk7CisgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBtb3ZlIHRvIG5leHQgbm9kZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gY29yZSByZXF1ZXN0ZWQsIGdvIGRvd24gdG8gUFVzCisgICAgICAgICAgICBuVCA9IDA7CisgICAgICAgICAgICBuVHIgPSAwOworICAgICAgICAgICAgaFQgPSBOVUxMOworICAgICAgICAgICAgLy8gbnVtIHByb2NzIHBlciBjb3JlCisgICAgICAgICAgICBpbnQgTlQgPQorICAgICAgICAgICAgICAgIF9fa21wX2h3bG9jX2NvdW50X2NoaWxkcmVuX2J5X3R5cGUodHAsIGhDLCBIV0xPQ19PQkpfUFUsICZoVCk7CisgICAgICAgICAgICBmb3IgKGludCB0ID0gMDsgdCA8IE5UOyArK3QpIHsKKyAgICAgICAgICAgICAgLy8gQ2hlY2sgUFUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgIGlkeCA9IGhULT5vc19pbmRleDsKKyAgICAgICAgICAgICAgaWYgKCFLTVBfQ1BVX0lTU0VUKGlkeCwgX19rbXBfYWZmaW5fZnVsbE1hc2spKSB7CisgICAgICAgICAgICAgICAgaFQgPSBod2xvY19nZXRfbmV4dF9vYmpfYnlfdHlwZSh0cCwgSFdMT0NfT0JKX1BVLCBoVCk7CisgICAgICAgICAgICAgICAgY29udGludWU7IC8vIHNraXAgUFUgaWYgbm90IGluIGZ1bGxNYXNrCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgKytuVDsKKyAgICAgICAgICAgICAgaWYgKG5UIDw9IF9fa21wX2h3c19wcm9jLm9mZnNldCB8fAorICAgICAgICAgICAgICAgICAgblQgPiBfX2ttcF9od3NfcHJvYy5udW0gKyBfX2ttcF9od3NfcHJvYy5vZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAvLyBza2lwIFBVCisgICAgICAgICAgICAgICAgS01QX0NQVV9DTFIoaWR4LCBfX2ttcF9hZmZpbl9mdWxsTWFzayk7CisgICAgICAgICAgICAgICAgKytuX29sZDsKKyAgICAgICAgICAgICAgICBLQ19UUkFDRSgyMDAsICgiS01QX0hXX1NVQlNFVDogc2tpcHBlZCBwcm9jICVkXG4iLCBpZHgpKTsKKyAgICAgICAgICAgICAgICBoVCA9IGh3bG9jX2dldF9uZXh0X29ial9ieV90eXBlKHRwLCBIV0xPQ19PQkpfUFUsIGhUKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gbW92ZSB0byBuZXh0IG5vZGUKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICArK25UcjsKKyAgICAgICAgICAgICAgaWYgKHBBZGRyKSAvLyBjb2xsZWN0IHJlcXVlc3RlZCB0aHJlYWQncyBkYXRhCisgICAgICAgICAgICAgICAgbmV3QWRkcltuX25ld10gPSAoKnBBZGRyKVtuX29sZF07CisgICAgICAgICAgICAgICsrbl9uZXc7CisgICAgICAgICAgICAgICsrbl9vbGQ7CisgICAgICAgICAgICAgIGhUID0gaHdsb2NfZ2V0X25leHRfb2JqX2J5X3R5cGUodHAsIEhXTE9DX09CSl9QVSwgaFQpOworICAgICAgICAgICAgfSAvLyB0aHJlYWRzIGxvb3AKKyAgICAgICAgICAgIGlmIChuVHIgPiAwKSB7CisgICAgICAgICAgICAgICsrbkNyOyAvLyBudW0gY29yZXMgcGVyIHNvY2tldAorICAgICAgICAgICAgICArK25DbzsgLy8gdG90YWwgbnVtIGNvcmVzCisgICAgICAgICAgICAgIGlmIChuVHIgPiBuVHBDKQorICAgICAgICAgICAgICAgIG5UcEMgPSBuVHI7IC8vIGNhbGMgbWF4IHRocmVhZHMgcGVyIGNvcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhDID0gaHdsb2NfZ2V0X25leHRfb2JqX2J5X3R5cGUodHAsIEhXTE9DX09CSl9DT1JFLCBoQyk7CisgICAgICAgICAgfSAvLyBjb3JlcyBsb29wCisgICAgICAgIH0gLy8gdGlsZXMgc3VwcG9ydAorICAgICAgfSAvLyBudW1hX3N1cHBvcnQKKyAgICAgIGlmIChuQ3IgPiAwKSB7IC8vIGZvdW5kIGNvcmVzPworICAgICAgICArK25Qa2c7IC8vIG51bSBzb2NrZXRzCisgICAgICAgIGlmIChuQ3IgPiBuQ3BQKQorICAgICAgICAgIG5DcFAgPSBuQ3I7IC8vIGNhbGMgbWF4IGNvcmVzIHBlciBzb2NrZXQKKyAgICAgIH0KKyAgICB9IC8vIHNvY2tldHMgbG9vcAorCisgICAgLy8gY2hlY2sgdGhlIHN1YnNldCBpcyB2YWxpZAorICAgIEtNUF9ERUJVR19BU1NFUlQobl9vbGQgPT0gX19rbXBfYXZhaWxfcHJvYyk7CisgICAgS01QX0RFQlVHX0FTU0VSVChuUGtnID4gMCk7CisgICAgS01QX0RFQlVHX0FTU0VSVChuQ3BQID4gMCk7CisgICAgS01QX0RFQlVHX0FTU0VSVChuVHBDID4gMCk7CisgICAgS01QX0RFQlVHX0FTU0VSVChuQ28gPiAwKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKG5Qa2cgPD0gblBhY2thZ2VzKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKG5DcFAgPD0gbkNvcmVzUGVyUGtnKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKG5UcEMgPD0gX19rbXBfblRocmVhZHNQZXJDb3JlKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKG5DbyA8PSBfX2ttcF9uY29yZXMpOworCisgICAgblBhY2thZ2VzID0gblBrZzsgLy8gY29ycmVjdCBudW0gc29ja2V0cworICAgIG5Db3Jlc1BlclBrZyA9IG5DcFA7IC8vIGNvcnJlY3QgbnVtIGNvcmVzIHBlciBzb2NrZXQKKyAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBuVHBDOyAvLyBjb3JyZWN0IG51bSB0aHJlYWRzIHBlciBjb3JlCisgICAgX19rbXBfYXZhaWxfcHJvYyA9IG5fbmV3OyAvLyBjb3JyZWN0IG51bSBwcm9jcworICAgIF9fa21wX25jb3JlcyA9IG5DbzsgLy8gY29ycmVjdCBudW0gY29yZXMKKyAgICAvLyBod2xvYyB0b3BvbG9neSBtZXRob2QgZW5kCisgIH0gZWxzZQorI2VuZGlmIC8vIEtNUF9VU0VfSFdMT0MKKyAgeworICAgIGludCBuX29sZCA9IDAsIG5fbmV3ID0gMCwgcHJvY19udW0gPSAwOworICAgIGlmIChfX2ttcF9od3Nfbm9kZS5udW0gPiAwIHx8IF9fa21wX2h3c190aWxlLm51bSA+IDApIHsKKyAgICAgIEtNUF9XQVJOSU5HKEFmZkhXU3Vic2V0Tm9IV0xPQyk7CisgICAgICBnb3RvIF9leGl0OworICAgIH0KKyAgICBpZiAoX19rbXBfaHdzX3NvY2tldC5udW0gPT0gMCkKKyAgICAgIF9fa21wX2h3c19zb2NrZXQubnVtID0gblBhY2thZ2VzOyAvLyB1c2UgYWxsIGF2YWlsYWJsZSBzb2NrZXRzCisgICAgaWYgKF9fa21wX2h3c19jb3JlLm51bSA9PSAwKQorICAgICAgX19rbXBfaHdzX2NvcmUubnVtID0gbkNvcmVzUGVyUGtnOyAvLyB1c2UgYWxsIGF2YWlsYWJsZSBjb3JlcworICAgIGlmIChfX2ttcF9od3NfcHJvYy5udW0gPT0gMCB8fCBfX2ttcF9od3NfcHJvYy5udW0gPiBfX2ttcF9uVGhyZWFkc1BlckNvcmUpCisgICAgICBfX2ttcF9od3NfcHJvYy5udW0gPSBfX2ttcF9uVGhyZWFkc1BlckNvcmU7IC8vIHVzZSBhbGwgSFcgY29udGV4dHMKKyAgICBpZiAoIV9fa21wX2FmZmluaXR5X3VuaWZvcm1fdG9wb2xvZ3koKSkgeworICAgICAgS01QX1dBUk5JTkcoQWZmSFdTdWJzZXROb25Vbmlmb3JtKTsKKyAgICAgIGdvdG8gX2V4aXQ7IC8vIGRvbid0IHN1cHBvcnQgbm9uLXVuaWZvcm0gdG9wb2xvZ3kKKyAgICB9CisgICAgaWYgKGRlcHRoID4gMykgeworICAgICAgS01QX1dBUk5JTkcoQWZmSFdTdWJzZXROb25UaHJlZUxldmVsKTsKKyAgICAgIGdvdG8gX2V4aXQ7IC8vIGRvbid0IHN1cHBvcnQgbm90LTMtbGV2ZWwgdG9wb2xvZ3kKKyAgICB9CisgICAgaWYgKF9fa21wX2h3c19zb2NrZXQub2Zmc2V0ICsgX19rbXBfaHdzX3NvY2tldC5udW0gPiBuUGFja2FnZXMpIHsKKyAgICAgIEtNUF9XQVJOSU5HKEFmZkhXU3Vic2V0TWFueVNvY2tldHMpOworICAgICAgZ290byBfZXhpdDsKKyAgICB9CisgICAgaWYgKF9fa21wX2h3c19jb3JlLm9mZnNldCArIF9fa21wX2h3c19jb3JlLm51bSA+IG5Db3Jlc1BlclBrZykgeworICAgICAgS01QX1dBUk5JTkcoQWZmSFdTdWJzZXRNYW55Q29yZXMpOworICAgICAgZ290byBfZXhpdDsKKyAgICB9CisgICAgLy8gRm9ybSB0aGUgcmVxdWVzdGVkIHN1YnNldAorICAgIGlmIChwQWRkcikgLy8gcEFkZHIgaXMgTlVMTCBpbiBjYXNlIG9mIGFmZmluaXR5X25vbmUKKyAgICAgIG5ld0FkZHIgPSAoQWRkclVuc1BhaXIgKilfX2ttcF9hbGxvY2F0ZSgKKyAgICAgICAgICBzaXplb2YoQWRkclVuc1BhaXIpICogX19rbXBfaHdzX3NvY2tldC5udW0gKiBfX2ttcF9od3NfY29yZS5udW0gKgorICAgICAgICAgIF9fa21wX2h3c19wcm9jLm51bSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuUGFja2FnZXM7ICsraSkgeworICAgICAgaWYgKGkgPCBfX2ttcF9od3Nfc29ja2V0Lm9mZnNldCB8fAorICAgICAgICAgIGkgPj0gX19rbXBfaHdzX3NvY2tldC5vZmZzZXQgKyBfX2ttcF9od3Nfc29ja2V0Lm51bSkgeworICAgICAgICAvLyBza2lwIG5vdC1yZXF1ZXN0ZWQgc29ja2V0CisgICAgICAgIG5fb2xkICs9IG5Db3Jlc1BlclBrZyAqIF9fa21wX25UaHJlYWRzUGVyQ29yZTsKKyAgICAgICAgaWYgKF9fa21wX3B1X29zX2lkeCAhPSBOVUxMKSB7CisgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIHNraXBwZWQgc29ja2V0CisgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuQ29yZXNQZXJQa2c7ICsraikgeworICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBfX2ttcF9uVGhyZWFkc1BlckNvcmU7ICsraykgeworICAgICAgICAgICAgICBLTVBfQ1BVX0NMUihfX2ttcF9wdV9vc19pZHhbcHJvY19udW1dLCBfX2ttcF9hZmZpbl9mdWxsTWFzayk7CisgICAgICAgICAgICAgICsrcHJvY19udW07CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyB3YWxrIHRocm91Z2ggcmVxdWVzdGVkIHNvY2tldAorICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG5Db3Jlc1BlclBrZzsgKytqKSB7CisgICAgICAgICAgaWYgKGogPCBfX2ttcF9od3NfY29yZS5vZmZzZXQgfHwKKyAgICAgICAgICAgICAgaiA+PSBfX2ttcF9od3NfY29yZS5vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9od3NfY29yZS5udW0pIHsgLy8gc2tpcCBub3QtcmVxdWVzdGVkIGNvcmUKKyAgICAgICAgICAgIG5fb2xkICs9IF9fa21wX25UaHJlYWRzUGVyQ29yZTsKKyAgICAgICAgICAgIGlmIChfX2ttcF9wdV9vc19pZHggIT0gTlVMTCkgeworICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IF9fa21wX25UaHJlYWRzUGVyQ29yZTsgKytrKSB7CisgICAgICAgICAgICAgICAgS01QX0NQVV9DTFIoX19rbXBfcHVfb3NfaWR4W3Byb2NfbnVtXSwgX19rbXBfYWZmaW5fZnVsbE1hc2spOworICAgICAgICAgICAgICAgICsrcHJvY19udW07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gd2FsayB0aHJvdWdoIHJlcXVlc3RlZCBjb3JlCisgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IF9fa21wX25UaHJlYWRzUGVyQ29yZTsgKytrKSB7CisgICAgICAgICAgICAgIGlmIChrIDwgX19rbXBfaHdzX3Byb2MubnVtKSB7CisgICAgICAgICAgICAgICAgaWYgKHBBZGRyKSAvLyBjb2xsZWN0IHJlcXVlc3RlZCB0aHJlYWQncyBkYXRhCisgICAgICAgICAgICAgICAgICBuZXdBZGRyW25fbmV3XSA9ICgqcEFkZHIpW25fb2xkXTsKKyAgICAgICAgICAgICAgICBuX25ldysrOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChfX2ttcF9wdV9vc19pZHggIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgIEtNUF9DUFVfQ0xSKF9fa21wX3B1X29zX2lkeFtwcm9jX251bV0sIF9fa21wX2FmZmluX2Z1bGxNYXNrKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBuX29sZCsrOworICAgICAgICAgICAgICArK3Byb2NfbnVtOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKG5fb2xkID09IG5QYWNrYWdlcyAqIG5Db3Jlc1BlclBrZyAqIF9fa21wX25UaHJlYWRzUGVyQ29yZSk7CisgICAgS01QX0RFQlVHX0FTU0VSVChuX25ldyA9PQorICAgICAgICAgICAgICAgICAgICAgX19rbXBfaHdzX3NvY2tldC5udW0gKiBfX2ttcF9od3NfY29yZS5udW0gKgorICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2h3c19wcm9jLm51bSk7CisgICAgblBhY2thZ2VzID0gX19rbXBfaHdzX3NvY2tldC5udW07IC8vIGNvcnJlY3QgblBhY2thZ2VzCisgICAgbkNvcmVzUGVyUGtnID0gX19rbXBfaHdzX2NvcmUubnVtOyAvLyBjb3JyZWN0IG5Db3Jlc1BlclBrZworICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IF9fa21wX2h3c19wcm9jLm51bTsgLy8gY29ycmVjdCBfX2ttcF9uVGhyZWFkc1BlckNvcmUKKyAgICBfX2ttcF9hdmFpbF9wcm9jID0gbl9uZXc7IC8vIGNvcnJlY3QgYXZhaWxfcHJvYworICAgIF9fa21wX25jb3JlcyA9IG5QYWNrYWdlcyAqIF9fa21wX2h3c19jb3JlLm51bTsgLy8gY29ycmVjdCBuY29yZXMKKyAgfSAvLyBub24taHdsb2MgdG9wb2xvZ3kgbWV0aG9kCisgIGlmIChwQWRkcikgeworICAgIF9fa21wX2ZyZWUoKnBBZGRyKTsKKyAgICAqcEFkZHIgPSBuZXdBZGRyOyAvLyByZXBsYWNlIG9sZCB0b3BvbG9neSB3aXRoIG5ldyBvbmUKKyAgfQorICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgIGNoYXIgbVtLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2sobSwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5fZnVsbE1hc2spOworICAgIGlmIChfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2spIHsKKyAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldFJlc3BlY3QsICJLTVBfSFdfU1VCU0VUIiwgbSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QsICJLTVBfSFdfU1VCU0VUIiwgbSk7CisgICAgfQorICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0hXX1NVQlNFVCIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgIGttcF9zdHJfYnVmX3QgYnVmOworICAgIF9fa21wX3N0cl9idWZfaW5pdCgmYnVmKTsKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIlZCIsIG5QYWNrYWdlcyk7CisgICAgS01QX0lORk9STShUb3BvbG9neUV4dHJhLCAiS01QX0hXX1NVQlNFVCIsIGJ1Zi5zdHIsIG5Db3Jlc1BlclBrZywKKyAgICAgICAgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgX19rbXBfbmNvcmVzKTsKKyAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoJmJ1Zik7CisgIH0KK19leGl0OgorICBpZiAoX19rbXBfcHVfb3NfaWR4ICE9IE5VTEwpIHsKKyAgICBfX2ttcF9mcmVlKF9fa21wX3B1X29zX2lkeCk7CisgICAgX19rbXBfcHVfb3NfaWR4ID0gTlVMTDsKKyAgfQorfQorCisvLyBUaGlzIGZ1bmN0aW9uIGZpZ3VyZXMgb3V0IHRoZSBkZWVwZXN0IGxldmVsIGF0IHdoaWNoIHRoZXJlIGlzIGF0IGxlYXN0IG9uZQorLy8gY2x1c3Rlci9jb3JlIHdpdGggbW9yZSB0aGFuIG9uZSBwcm9jZXNzaW5nIHVuaXQgYm91bmQgdG8gaXQuCitzdGF0aWMgaW50IF9fa21wX2FmZmluaXR5X2ZpbmRfY29yZV9sZXZlbChjb25zdCBBZGRyVW5zUGFpciAqYWRkcmVzczJvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBucHJvY3MsIGludCBib3R0b21fbGV2ZWwpIHsKKyAgaW50IGNvcmVfbGV2ZWwgPSAwOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbnByb2NzOyBpKyspIHsKKyAgICBmb3IgKGludCBqID0gYm90dG9tX2xldmVsOyBqID4gMDsgai0tKSB7CisgICAgICBpZiAoYWRkcmVzczJvc1tpXS5maXJzdC5sYWJlbHNbal0gPiAwKSB7CisgICAgICAgIGlmIChjb3JlX2xldmVsIDwgKGogLSAxKSkgeworICAgICAgICAgIGNvcmVfbGV2ZWwgPSBqIC0gMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gY29yZV9sZXZlbDsKK30KKworLy8gVGhpcyBmdW5jdGlvbiBjb3VudHMgbnVtYmVyIG9mIGNsdXN0ZXJzL2NvcmVzIGF0IGdpdmVuIGxldmVsLgorc3RhdGljIGludCBfX2ttcF9hZmZpbml0eV9jb21wdXRlX25jb3Jlcyhjb25zdCBBZGRyVW5zUGFpciAqYWRkcmVzczJvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5wcm9jcywgaW50IGJvdHRvbV9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvcmVfbGV2ZWwpIHsKKyAgaW50IG5jb3JlcyA9IDA7CisgIGludCBpLCBqOworCisgIGogPSBib3R0b21fbGV2ZWw7CisgIGZvciAoaSA9IDA7IGkgPCBucHJvY3M7IGkrKykgeworICAgIGZvciAoaiA9IGJvdHRvbV9sZXZlbDsgaiA+IGNvcmVfbGV2ZWw7IGotLSkgeworICAgICAgaWYgKChpICsgMSkgPCBucHJvY3MpIHsKKyAgICAgICAgaWYgKGFkZHJlc3Myb3NbaSArIDFdLmZpcnN0LmxhYmVsc1tqXSA+IDApIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoaiA9PSBjb3JlX2xldmVsKSB7CisgICAgICBuY29yZXMrKzsKKyAgICB9CisgIH0KKyAgaWYgKGogPiBjb3JlX2xldmVsKSB7CisgICAgLy8gSW4gY2FzZSBvZiAoIG5wcm9jcyA8IF9fa21wX2F2YWlsX3Byb2MgKSB3ZSBtYXkgZW5kIHRvbyBkZWVwIGFuZCBtaXNzIG9uZQorICAgIC8vIGNvcmUuIE1heSBvY2N1ciB3aGVuIGNhbGxlZCBmcm9tIF9fa21wX2FmZmluaXR5X2ZpbmRfY29yZSgpLgorICAgIG5jb3JlcysrOworICB9CisgIHJldHVybiBuY29yZXM7Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gZmluZHMgdG8gd2hpY2ggY2x1c3Rlci9jb3JlIGdpdmVuIHByb2Nlc3NpbmcgdW5pdCBpcyBib3VuZC4KK3N0YXRpYyBpbnQgX19rbXBfYWZmaW5pdHlfZmluZF9jb3JlKGNvbnN0IEFkZHJVbnNQYWlyICphZGRyZXNzMm9zLCBpbnQgcHJvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBib3R0b21fbGV2ZWwsIGludCBjb3JlX2xldmVsKSB7CisgIHJldHVybiBfX2ttcF9hZmZpbml0eV9jb21wdXRlX25jb3JlcyhhZGRyZXNzMm9zLCBwcm9jICsgMSwgYm90dG9tX2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZV9sZXZlbCkgLQorICAgICAgICAgMTsKK30KKworLy8gVGhpcyBmdW5jdGlvbiBmaW5kcyBtYXhpbWFsIG51bWJlciBvZiBwcm9jZXNzaW5nIHVuaXRzIGJvdW5kIHRvIGEKKy8vIGNsdXN0ZXIvY29yZSBhdCBnaXZlbiBsZXZlbC4KK3N0YXRpYyBpbnQgX19rbXBfYWZmaW5pdHlfbWF4X3Byb2NfcGVyX2NvcmUoY29uc3QgQWRkclVuc1BhaXIgKmFkZHJlc3Myb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBucHJvY3MsIGludCBib3R0b21fbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3JlX2xldmVsKSB7CisgIGludCBtYXhwcm9jcGVyY29yZSA9IDA7CisKKyAgaWYgKGNvcmVfbGV2ZWwgPCBib3R0b21fbGV2ZWwpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5wcm9jczsgaSsrKSB7CisgICAgICBpbnQgcGVyY29yZSA9IGFkZHJlc3Myb3NbaV0uZmlyc3QubGFiZWxzW2NvcmVfbGV2ZWwgKyAxXSArIDE7CisKKyAgICAgIGlmIChwZXJjb3JlID4gbWF4cHJvY3BlcmNvcmUpIHsKKyAgICAgICAgbWF4cHJvY3BlcmNvcmUgPSBwZXJjb3JlOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBtYXhwcm9jcGVyY29yZSA9IDE7CisgIH0KKyAgcmV0dXJuIG1heHByb2NwZXJjb3JlOworfQorCitzdGF0aWMgQWRkclVuc1BhaXIgKmFkZHJlc3Myb3MgPSBOVUxMOworc3RhdGljIGludCAqcHJvY2FyciA9IE5VTEw7CitzdGF0aWMgaW50IF9fa21wX2FmZl9kZXB0aCA9IDA7CisKKyNkZWZpbmUgS01QX0VYSVRfQUZGX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBLTVBfQVNTRVJUKGFkZHJlc3Myb3MgPT0gTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfYXBwbHlfdGhyZWFkX3BsYWNlcyhOVUxMLCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJldHVybjsKKworc3RhdGljIGludCBfX2ttcF9hZmZpbml0eV9jbXBfQWRkcmVzc19jaGlsZF9udW0oY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikgeworICBjb25zdCBBZGRyZXNzICphYSA9ICYoKChjb25zdCBBZGRyVW5zUGFpciAqKWEpLT5maXJzdCk7CisgIGNvbnN0IEFkZHJlc3MgKmJiID0gJigoKGNvbnN0IEFkZHJVbnNQYWlyICopYiktPmZpcnN0KTsKKyAgdW5zaWduZWQgZGVwdGggPSBhYS0+ZGVwdGg7CisgIHVuc2lnbmVkIGk7CisgIEtNUF9ERUJVR19BU1NFUlQoZGVwdGggPT0gYmItPmRlcHRoKTsKKyAgS01QX0RFQlVHX0FTU0VSVCgodW5zaWduZWQpX19rbXBfYWZmaW5pdHlfY29tcGFjdCA8PSBkZXB0aCk7CisgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfYWZmaW5pdHlfY29tcGFjdCA+PSAwKTsKKyAgZm9yIChpID0gMDsgaSA8ICh1bnNpZ25lZClfX2ttcF9hZmZpbml0eV9jb21wYWN0OyBpKyspIHsKKyAgICBpbnQgaiA9IGRlcHRoIC0gaSAtIDE7CisgICAgaWYgKGFhLT5jaGlsZE51bXNbal0gPCBiYi0+Y2hpbGROdW1zW2pdKQorICAgICAgcmV0dXJuIC0xOworICAgIGlmIChhYS0+Y2hpbGROdW1zW2pdID4gYmItPmNoaWxkTnVtc1tqXSkKKyAgICAgIHJldHVybiAxOworICB9CisgIGZvciAoOyBpIDwgZGVwdGg7IGkrKykgeworICAgIGludCBqID0gaSAtIF9fa21wX2FmZmluaXR5X2NvbXBhY3Q7CisgICAgaWYgKGFhLT5jaGlsZE51bXNbal0gPCBiYi0+Y2hpbGROdW1zW2pdKQorICAgICAgcmV0dXJuIC0xOworICAgIGlmIChhYS0+Y2hpbGROdW1zW2pdID4gYmItPmNoaWxkTnVtc1tqXSkKKyAgICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2ttcF9hdXhfYWZmaW5pdHlfaW5pdGlhbGl6ZSh2b2lkKSB7CisgIGlmIChfX2ttcF9hZmZpbml0eV9tYXNrcyAhPSBOVUxMKSB7CisgICAgS01QX0FTU0VSVChfX2ttcF9hZmZpbl9mdWxsTWFzayAhPSBOVUxMKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBDcmVhdGUgdGhlICJmdWxsIiBtYXNrIC0gdGhpcyBkZWZpbmVzIGFsbCBvZiB0aGUgcHJvY2Vzc29ycyB0aGF0IHdlCisgIC8vIGNvbnNpZGVyIHRvIGJlIGluIHRoZSBtYWNoaW5lIG1vZGVsLiBJZiByZXNwZWN0IGlzIHNldCwgdGhlbiBpdCBpcyB0aGUKKyAgLy8gaW5pdGlhbGl6YXRpb24gdGhyZWFkJ3MgYWZmaW5pdHkgbWFzay4gT3RoZXJ3aXNlLCBpdCBpcyBhbGwgcHJvY2Vzc29ycyB0aGF0CisgIC8vIHdlIGtub3cgYWJvdXQgb24gdGhlIG1hY2hpbmUuCisgIGlmIChfX2ttcF9hZmZpbl9mdWxsTWFzayA9PSBOVUxMKSB7CisgICAgS01QX0NQVV9BTExPQyhfX2ttcF9hZmZpbl9mdWxsTWFzayk7CisgIH0KKyAgaWYgKEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrKSB7CisgICAgICBfX2ttcF9nZXRfc3lzdGVtX2FmZmluaXR5KF9fa21wX2FmZmluX2Z1bGxNYXNrLCBUUlVFKTsKKworICAgICAgLy8gQ291bnQgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgcHJvY2Vzc29ycy4KKyAgICAgIHVuc2lnbmVkIGk7CisgICAgICBfX2ttcF9hdmFpbF9wcm9jID0gMDsKKyAgICAgIEtNUF9DUFVfU0VUX0lURVJBVEUoaSwgX19rbXBfYWZmaW5fZnVsbE1hc2spIHsKKyAgICAgICAgaWYgKCFLTVBfQ1BVX0lTU0VUKGksIF9fa21wX2FmZmluX2Z1bGxNYXNrKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIF9fa21wX2F2YWlsX3Byb2MrKzsKKyAgICAgIH0KKyAgICAgIGlmIChfX2ttcF9hdmFpbF9wcm9jID4gX19rbXBfeHByb2MpIHsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwKKyAgICAgICAgICAgIChfX2ttcF9hZmZpbml0eV93YXJuaW5ncyAmJgorICAgICAgICAgICAgIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeworICAgICAgICAgIEtNUF9XQVJOSU5HKEVycm9ySW5pdGlhbGl6ZUFmZmluaXR5KTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfbm9uZTsKKyAgICAgICAgS01QX0FGRklOSVRZX0RJU0FCTEUoKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBfX2ttcF9hZmZpbml0eV9lbnRpcmVfbWFjaGluZV9tYXNrKF9fa21wX2FmZmluX2Z1bGxNYXNrKTsKKyAgICAgIF9fa21wX2F2YWlsX3Byb2MgPSBfX2ttcF94cHJvYzsKKyAgICB9CisgIH0KKworICBpbnQgZGVwdGggPSAtMTsKKyAga21wX2kxOG5faWRfdCBtc2dfaWQgPSBrbXBfaTE4bl9udWxsOworCisgIC8vIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBzZXR0aW5nIEtNUF9DUFVJTkZPX0ZJTEUgPT4KKyAgLy8gS01QX1RPUE9MT0dZX01FVEhPRD1jcHVpbmZvCisgIGlmICgoX19rbXBfY3B1aW5mb19maWxlICE9IE5VTEwpICYmCisgICAgICAoX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX2FsbCkpIHsKKyAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9jcHVpbmZvOworICB9CisKKyAgaWYgKF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPT0gYWZmaW5pdHlfdG9wX21ldGhvZF9hbGwpIHsKKyAgICAvLyBJbiB0aGUgZGVmYXVsdCBjb2RlIHBhdGgsIGVycm9ycyBhcmUgbm90IGZhdGFsIC0gd2UganVzdCB0cnkgdXNpbmcKKyAgICAvLyBhbm90aGVyIG1ldGhvZC4gV2Ugb25seSBlbWl0IGEgd2FybmluZyBtZXNzYWdlIGlmIGFmZmluaXR5IGlzIG9uLCBvciB0aGUKKyAgICAvLyB2ZXJib3NlIGZsYWcgaXMgc2V0LCBhbiB0aGUgbm93YXJuaW5ncyBmbGFnIHdhcyBub3Qgc2V0LgorICAgIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSA9IE5VTEw7CisgICAgaW50IGxpbmUgPSAwOworI2lmIEtNUF9VU0VfSFdMT0MKKyAgICBpZiAoZGVwdGggPCAwICYmCisgICAgICAgIF9fa21wX2FmZmluaXR5X2Rpc3BhdGNoLT5nZXRfYXBpX3R5cGUoKSA9PSBLTVBBZmZpbml0eTo6SFdMT0MpIHsKKyAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIEtNUF9JTkZPUk0oQWZmVXNpbmdId2xvYywgIktNUF9BRkZJTklUWSIpOworICAgICAgfQorICAgICAgaWYgKCFfX2ttcF9od2xvY19lcnJvcikgeworICAgICAgICBkZXB0aCA9IF9fa21wX2FmZmluaXR5X2NyZWF0ZV9od2xvY19tYXAoJmFkZHJlc3Myb3MsICZtc2dfaWQpOworICAgICAgICBpZiAoZGVwdGggPT0gMCkgeworICAgICAgICAgIEtNUF9FWElUX0FGRl9OT05FOworICAgICAgICB9IGVsc2UgaWYgKGRlcHRoIDwgMCAmJiBfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgS01QX0lORk9STShBZmZJZ25vcmluZ0h3bG9jLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICBLTVBfSU5GT1JNKEFmZklnbm9yaW5nSHdsb2MsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgIH0KKyAgICB9CisjZW5kaWYKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworICAgIGlmIChkZXB0aCA8IDApIHsKKyAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIEtNUF9JTkZPUk0oQWZmSW5mb1N0ciwgIktNUF9BRkZJTklUWSIsIEtNUF9JMThOX1NUUihEZWNvZGluZ3gyQVBJQykpOworICAgICAgfQorCisgICAgICBmaWxlX25hbWUgPSBOVUxMOworICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfeDJhcGljaWRfbWFwKCZhZGRyZXNzMm9zLCAmbXNnX2lkKTsKKyAgICAgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgICAgIEtNUF9FWElUX0FGRl9OT05FOworICAgICAgfQorCisgICAgICBpZiAoZGVwdGggPCAwKSB7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgaWYgKG1zZ19pZCAhPSBrbXBfaTE4bl9udWxsKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZkluZm9TdHJTdHIsICJLTVBfQUZGSU5JVFkiLAorICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgS01QX0kxOE5fU1RSKERlY29kaW5nTGVnYWN5QVBJQykpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZkluZm9TdHIsICJLTVBfQUZGSU5JVFkiLAorICAgICAgICAgICAgICAgICAgICAgICBLTVBfSTE4Tl9TVFIoRGVjb2RpbmdMZWdhY3lBUElDKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmlsZV9uYW1lID0gTlVMTDsKKyAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfYXBpY2lkX21hcCgmYWRkcmVzczJvcywgJm1zZ19pZCk7CisgICAgICAgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgICAgICAgS01QX0VYSVRfQUZGX05PTkU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyNpZiBLTVBfT1NfTElOVVgKKworICAgIGlmIChkZXB0aCA8IDApIHsKKyAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIGlmIChtc2dfaWQgIT0ga21wX2kxOG5fbnVsbCkgeworICAgICAgICAgIEtNUF9JTkZPUk0oQWZmU3RyUGFyc2VGaWxlbmFtZSwgIktNUF9BRkZJTklUWSIsCisgICAgICAgICAgICAgICAgICAgICBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSwgIi9wcm9jL2NwdWluZm8iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBLTVBfSU5GT1JNKEFmZlBhcnNlRmlsZW5hbWUsICJLTVBfQUZGSU5JVFkiLCAiL3Byb2MvY3B1aW5mbyIpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIEZJTEUgKmYgPSBmb3BlbigiL3Byb2MvY3B1aW5mbyIsICJyIik7CisgICAgICBpZiAoZiA9PSBOVUxMKSB7CisgICAgICAgIG1zZ19pZCA9IGttcF9pMThuX3N0cl9DYW50T3BlbkNwdWluZm87CisgICAgICB9IGVsc2UgeworICAgICAgICBmaWxlX25hbWUgPSAiL3Byb2MvY3B1aW5mbyI7CisgICAgICAgIGRlcHRoID0KKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2NyZWF0ZV9jcHVpbmZvX21hcCgmYWRkcmVzczJvcywgJmxpbmUsICZtc2dfaWQsIGYpOworICAgICAgICBmY2xvc2UoZik7CisgICAgICAgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgICAgICAgS01QX0VYSVRfQUZGX05PTkU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyNlbmRpZiAvKiBLTVBfT1NfTElOVVggKi8KKworI2lmIEtNUF9HUk9VUF9BRkZJTklUWQorCisgICAgaWYgKChkZXB0aCA8IDApICYmIChfX2ttcF9udW1fcHJvY19ncm91cHMgPiAxKSkgeworICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgS01QX0lORk9STShBZmZXaW5kb3dzUHJvY0dyb3VwTWFwLCAiS01QX0FGRklOSVRZIik7CisgICAgICB9CisKKyAgICAgIGRlcHRoID0gX19rbXBfYWZmaW5pdHlfY3JlYXRlX3Byb2NfZ3JvdXBfbWFwKCZhZGRyZXNzMm9zLCAmbXNnX2lkKTsKKyAgICAgIEtNUF9BU1NFUlQoZGVwdGggIT0gMCk7CisgICAgfQorCisjZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisKKyAgICBpZiAoZGVwdGggPCAwKSB7CisgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSAmJiAobXNnX2lkICE9IGttcF9pMThuX251bGwpKSB7CisgICAgICAgIGlmIChmaWxlX25hbWUgPT0gTlVMTCkgeworICAgICAgICAgIEtNUF9JTkZPUk0oVXNpbmdGbGF0T1MsIF9fa21wX2kxOG5fY2F0Z2V0cyhtc2dfaWQpKTsKKyAgICAgICAgfSBlbHNlIGlmIChsaW5lID09IDApIHsKKyAgICAgICAgICBLTVBfSU5GT1JNKFVzaW5nRmxhdE9TRmlsZSwgZmlsZV9uYW1lLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgS01QX0lORk9STShVc2luZ0ZsYXRPU0ZpbGVMaW5lLCBmaWxlX25hbWUsIGxpbmUsCisgICAgICAgICAgICAgICAgICAgICBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIEZJWE1FIC0gcHJpbnQgbXNnIGlmIG1zZ19pZCA9IGttcF9pMThuX251bGwgPz8/CisKKyAgICAgIGZpbGVfbmFtZSA9ICIiOworICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfZmxhdF9tYXAoJmFkZHJlc3Myb3MsICZtc2dfaWQpOworICAgICAgaWYgKGRlcHRoID09IDApIHsKKyAgICAgICAgS01QX0VYSVRfQUZGX05PTkU7CisgICAgICB9CisgICAgICBLTVBfQVNTRVJUKGRlcHRoID4gMCk7CisgICAgICBLTVBfQVNTRVJUKGFkZHJlc3Myb3MgIT0gTlVMTCk7CisgICAgfQorICB9CisKKy8vIElmIHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgdGhhdCBhIHBhcmljdWxhciB0b3BvbG9neSBkaXNjb3ZlcnkgbWV0aG9kIGlzIHRvIGJlCisvLyB1c2VkLCB0aGVuIHdlIGFib3J0IGlmIHRoYXQgbWV0aG9kIGZhaWxzLiBUaGUgZXhjZXB0aW9uIGlzIGdyb3VwIGFmZmluaXR5LAorLy8gd2hpY2ggbWlnaHQgaGF2ZSBiZWVuIGltcGxpY2l0bHkgc2V0LgorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisgIGVsc2UgaWYgKF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPT0gYWZmaW5pdHlfdG9wX21ldGhvZF94MmFwaWNpZCkgeworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICBLTVBfSU5GT1JNKEFmZkluZm9TdHIsICJLTVBfQUZGSU5JVFkiLCBLTVBfSTE4Tl9TVFIoRGVjb2Rpbmd4MkFQSUMpKTsKKyAgICB9CisKKyAgICBkZXB0aCA9IF9fa21wX2FmZmluaXR5X2NyZWF0ZV94MmFwaWNpZF9tYXAoJmFkZHJlc3Myb3MsICZtc2dfaWQpOworICAgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgICBLTVBfRVhJVF9BRkZfTk9ORTsKKyAgICB9CisgICAgaWYgKGRlcHRoIDwgMCkgeworICAgICAgS01QX0FTU0VSVChtc2dfaWQgIT0ga21wX2kxOG5fbnVsbCk7CisgICAgICBLTVBfRkFUQUwoTXNnRXhpdGluZywgX19rbXBfaTE4bl9jYXRnZXRzKG1zZ19pZCkpOworICAgIH0KKyAgfSBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfYXBpY2lkKSB7CisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgIEtNUF9JTkZPUk0oQWZmSW5mb1N0ciwgIktNUF9BRkZJTklUWSIsIEtNUF9JMThOX1NUUihEZWNvZGluZ0xlZ2FjeUFQSUMpKTsKKyAgICB9CisKKyAgICBkZXB0aCA9IF9fa21wX2FmZmluaXR5X2NyZWF0ZV9hcGljaWRfbWFwKCZhZGRyZXNzMm9zLCAmbXNnX2lkKTsKKyAgICBpZiAoZGVwdGggPT0gMCkgeworICAgICAgS01QX0VYSVRfQUZGX05PTkU7CisgICAgfQorICAgIGlmIChkZXB0aCA8IDApIHsKKyAgICAgIEtNUF9BU1NFUlQobXNnX2lkICE9IGttcF9pMThuX251bGwpOworICAgICAgS01QX0ZBVEFMKE1zZ0V4aXRpbmcsIF9fa21wX2kxOG5fY2F0Z2V0cyhtc2dfaWQpKTsKKyAgICB9CisgIH0KKworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworICBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfY3B1aW5mbykgeworICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOworICAgIGlmIChfX2ttcF9jcHVpbmZvX2ZpbGUgIT0gTlVMTCkgeworICAgICAgZmlsZW5hbWUgPSBfX2ttcF9jcHVpbmZvX2ZpbGU7CisgICAgfSBlbHNlIHsKKyAgICAgIGZpbGVuYW1lID0gIi9wcm9jL2NwdWluZm8iOworICAgIH0KKworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICBLTVBfSU5GT1JNKEFmZlBhcnNlRmlsZW5hbWUsICJLTVBfQUZGSU5JVFkiLCBmaWxlbmFtZSk7CisgICAgfQorCisgICAgRklMRSAqZiA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOworICAgIGlmIChmID09IE5VTEwpIHsKKyAgICAgIGludCBjb2RlID0gZXJybm87CisgICAgICBpZiAoX19rbXBfY3B1aW5mb19maWxlICE9IE5VTEwpIHsKKyAgICAgICAgX19rbXBfbXNnKGttcF9tc19mYXRhbCwgS01QX01TRyhDYW50T3BlbkZpbGVGb3JSZWFkaW5nLCBmaWxlbmFtZSksCisgICAgICAgICAgICAgICAgICBLTVBfRVJSKGNvZGUpLCBLTVBfSE5UKE5hbWVDb21lc0Zyb21fQ1BVSU5GT19GSUxFKSwKKyAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX21zZyhrbXBfbXNfZmF0YWwsIEtNUF9NU0coQ2FudE9wZW5GaWxlRm9yUmVhZGluZywgZmlsZW5hbWUpLAorICAgICAgICAgICAgICAgICAgS01QX0VSUihjb2RlKSwgX19rbXBfbXNnX251bGwpOworICAgICAgfQorICAgIH0KKyAgICBpbnQgbGluZSA9IDA7CisgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfY3B1aW5mb19tYXAoJmFkZHJlc3Myb3MsICZsaW5lLCAmbXNnX2lkLCBmKTsKKyAgICBmY2xvc2UoZik7CisgICAgaWYgKGRlcHRoIDwgMCkgeworICAgICAgS01QX0FTU0VSVChtc2dfaWQgIT0ga21wX2kxOG5fbnVsbCk7CisgICAgICBpZiAobGluZSA+IDApIHsKKyAgICAgICAgS01QX0ZBVEFMKEZpbGVMaW5lTXNnRXhpdGluZywgZmlsZW5hbWUsIGxpbmUsCisgICAgICAgICAgICAgICAgICBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBLTVBfRkFUQUwoRmlsZU1zZ0V4aXRpbmcsIGZpbGVuYW1lLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSk7CisgICAgICB9CisgICAgfQorICAgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHsKKyAgICAgIEtNUF9BU1NFUlQoZGVwdGggPT0gMCk7CisgICAgICBLTVBfRVhJVF9BRkZfTk9ORTsKKyAgICB9CisgIH0KKworI2lmIEtNUF9HUk9VUF9BRkZJTklUWQorCisgIGVsc2UgaWYgKF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPT0gYWZmaW5pdHlfdG9wX21ldGhvZF9ncm91cCkgeworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICBLTVBfSU5GT1JNKEFmZldpbmRvd3NQcm9jR3JvdXBNYXAsICJLTVBfQUZGSU5JVFkiKTsKKyAgICB9CisKKyAgICBkZXB0aCA9IF9fa21wX2FmZmluaXR5X2NyZWF0ZV9wcm9jX2dyb3VwX21hcCgmYWRkcmVzczJvcywgJm1zZ19pZCk7CisgICAgS01QX0FTU0VSVChkZXB0aCAhPSAwKTsKKyAgICBpZiAoZGVwdGggPCAwKSB7CisgICAgICBLTVBfQVNTRVJUKG1zZ19pZCAhPSBrbXBfaTE4bl9udWxsKTsKKyAgICAgIEtNUF9GQVRBTChNc2dFeGl0aW5nLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSk7CisgICAgfQorICB9CisKKyNlbmRpZiAvKiBLTVBfR1JPVVBfQUZGSU5JVFkgKi8KKworICBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfZmxhdCkgeworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICBLTVBfSU5GT1JNKEFmZlVzaW5nRmxhdE9TLCAiS01QX0FGRklOSVRZIik7CisgICAgfQorCisgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfZmxhdF9tYXAoJmFkZHJlc3Myb3MsICZtc2dfaWQpOworICAgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgICBLTVBfRVhJVF9BRkZfTk9ORTsKKyAgICB9CisgICAgLy8gc2hvdWxkIG5vdCBmYWlsCisgICAgS01QX0FTU0VSVChkZXB0aCA+IDApOworICAgIEtNUF9BU1NFUlQoYWRkcmVzczJvcyAhPSBOVUxMKTsKKyAgfQorCisjaWYgS01QX1VTRV9IV0xPQworICBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfaHdsb2MpIHsKKyAgICBLTVBfQVNTRVJUKF9fa21wX2FmZmluaXR5X2Rpc3BhdGNoLT5nZXRfYXBpX3R5cGUoKSA9PSBLTVBBZmZpbml0eTo6SFdMT0MpOworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICBLTVBfSU5GT1JNKEFmZlVzaW5nSHdsb2MsICJLTVBfQUZGSU5JVFkiKTsKKyAgICB9CisgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfaHdsb2NfbWFwKCZhZGRyZXNzMm9zLCAmbXNnX2lkKTsKKyAgICBpZiAoZGVwdGggPT0gMCkgeworICAgICAgS01QX0VYSVRfQUZGX05PTkU7CisgICAgfQorICB9CisjZW5kaWYgLy8gS01QX1VTRV9IV0xPQworCisgIGlmIChhZGRyZXNzMm9zID09IE5VTEwpIHsKKyAgICBpZiAoS01QX0FGRklOSVRZX0NBUEFCTEUoKSAmJgorICAgICAgICAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fAorICAgICAgICAgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkpIHsKKyAgICAgIEtNUF9XQVJOSU5HKEVycm9ySW5pdGlhbGl6ZUFmZmluaXR5KTsKKyAgICB9CisgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmU7CisgICAgS01QX0FGRklOSVRZX0RJU0FCTEUoKTsKKyAgICByZXR1cm47CisgIH0KKworICBfX2ttcF9hcHBseV90aHJlYWRfcGxhY2VzKCZhZGRyZXNzMm9zLCBkZXB0aCk7CisKKyAgLy8gQ3JlYXRlIHRoZSB0YWJsZSBvZiBtYXNrcywgaW5kZXhlZCBieSB0aHJlYWQgSWQuCisgIHVuc2lnbmVkIG1heEluZGV4OworICB1bnNpZ25lZCBudW1VbmlxdWU7CisgIGttcF9hZmZpbl9tYXNrX3QgKm9zSWQyTWFzayA9CisgICAgICBfX2ttcF9jcmVhdGVfbWFza3MoJm1heEluZGV4LCAmbnVtVW5pcXVlLCBhZGRyZXNzMm9zLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID09IDApIHsKKyAgICBLTVBfREVCVUdfQVNTRVJUKChpbnQpbnVtVW5pcXVlID09IF9fa21wX2F2YWlsX3Byb2MpOworICB9CisKKyAgLy8gU2V0IHRoZSBjaGlsZE51bXMgdmVjdG9yIGluIGFsbCBBZGRyZXNzIG9iamVjdHMuIFRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZQorICAvLyB3ZSBjYW4gc29ydCB1c2luZyBfX2ttcF9hZmZpbml0eV9jbXBfQWRkcmVzc19jaGlsZF9udW0oKSwgd2hpY2ggdGFrZXMgaW50bworICAvLyBhY2NvdW50IHRoZSBzZXR0aW5nIG9mIF9fa21wX2FmZmluaXR5X2NvbXBhY3QuCisgIF9fa21wX2FmZmluaXR5X2Fzc2lnbl9jaGlsZF9udW1zKGFkZHJlc3Myb3MsIF9fa21wX2F2YWlsX3Byb2MpOworCisgIHN3aXRjaCAoX19rbXBfYWZmaW5pdHlfdHlwZSkgeworCisgIGNhc2UgYWZmaW5pdHlfZXhwbGljaXQ6CisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCAhPSBOVUxMKTsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmIChfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPT0gcHJvY19iaW5kX2ludGVsKQorI2VuZGlmCisgICAgeworICAgICAgX19rbXBfYWZmaW5pdHlfcHJvY2Vzc19wcm9jbGlzdCgKKyAgICAgICAgICAmX19rbXBfYWZmaW5pdHlfbWFza3MsICZfX2ttcF9hZmZpbml0eV9udW1fbWFza3MsCisgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QsIG9zSWQyTWFzaywgbWF4SW5kZXgpOworICAgIH0KKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGVsc2UgeworICAgICAgX19rbXBfYWZmaW5pdHlfcHJvY2Vzc19wbGFjZWxpc3QoCisgICAgICAgICAgJl9fa21wX2FmZmluaXR5X21hc2tzLCAmX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzLAorICAgICAgICAgIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0LCBvc0lkMk1hc2ssIG1heEluZGV4KTsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzID09IDApIHsKKyAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8CisgICAgICAgICAgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeworICAgICAgICBLTVBfV0FSTklORyhBZmZOb1ZhbGlkUHJvY0lEKTsKKyAgICAgIH0KKyAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBicmVhazsKKworICAvLyBUaGUgb3RoZXIgYWZmaW5pdHkgdHlwZXMgcmVseSBvbiBzb3J0aW5nIHRoZSBBZGRyZXNzZXMgYWNjb3JkaW5nIHRvIHNvbWUKKyAgLy8gcGVybXV0YXRpb24gb2YgdGhlIG1hY2hpbmUgdG9wb2xvZ3kgdHJlZS4gU2V0IF9fa21wX2FmZmluaXR5X2NvbXBhY3QgYW5kCisgIC8vIF9fa21wX2FmZmluaXR5X29mZnNldCBhcHByb3ByaWF0ZWx5LCB0aGVuIGp1bXAgdG8gYSBjb21tb24gY29kZSBmcmFnbWVudAorICAvLyB0byBkbyB0aGUgc29ydCBhbmQgY3JlYXRlIHRoZSBhcnJheSBvZiBhZmZpbml0eSBtYXNrcy4KKworICBjYXNlIGFmZmluaXR5X2xvZ2ljYWw6CisgICAgX19rbXBfYWZmaW5pdHlfY29tcGFjdCA9IDA7CisgICAgaWYgKF9fa21wX2FmZmluaXR5X29mZnNldCkgeworICAgICAgX19rbXBfYWZmaW5pdHlfb2Zmc2V0ID0KKyAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgKiBfX2ttcF9hZmZpbml0eV9vZmZzZXQgJSBfX2ttcF9hdmFpbF9wcm9jOworICAgIH0KKyAgICBnb3RvIHNvcnRBZGRyZXNzZXM7CisKKyAgY2FzZSBhZmZpbml0eV9waHlzaWNhbDoKKyAgICBpZiAoX19rbXBfblRocmVhZHNQZXJDb3JlID4gMSkgeworICAgICAgX19rbXBfYWZmaW5pdHlfY29tcGFjdCA9IDE7CisgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfY29tcGFjdCA+PSBkZXB0aCkgeworICAgICAgICBfX2ttcF9hZmZpbml0eV9jb21wYWN0ID0gMDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgX19rbXBfYWZmaW5pdHlfY29tcGFjdCA9IDA7CisgICAgfQorICAgIGlmIChfX2ttcF9hZmZpbml0eV9vZmZzZXQpIHsKKyAgICAgIF9fa21wX2FmZmluaXR5X29mZnNldCA9CisgICAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlICogX19rbXBfYWZmaW5pdHlfb2Zmc2V0ICUgX19rbXBfYXZhaWxfcHJvYzsKKyAgICB9CisgICAgZ290byBzb3J0QWRkcmVzc2VzOworCisgIGNhc2UgYWZmaW5pdHlfc2NhdHRlcjoKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfY29tcGFjdCA+PSBkZXB0aCkgeworICAgICAgX19rbXBfYWZmaW5pdHlfY29tcGFjdCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIF9fa21wX2FmZmluaXR5X2NvbXBhY3QgPSBkZXB0aCAtIDEgLSBfX2ttcF9hZmZpbml0eV9jb21wYWN0OworICAgIH0KKyAgICBnb3RvIHNvcnRBZGRyZXNzZXM7CisKKyAgY2FzZSBhZmZpbml0eV9jb21wYWN0OgorICAgIGlmIChfX2ttcF9hZmZpbml0eV9jb21wYWN0ID49IGRlcHRoKSB7CisgICAgICBfX2ttcF9hZmZpbml0eV9jb21wYWN0ID0gZGVwdGggLSAxOworICAgIH0KKyAgICBnb3RvIHNvcnRBZGRyZXNzZXM7CisKKyAgY2FzZSBhZmZpbml0eV9iYWxhbmNlZDoKKyAgICBpZiAoZGVwdGggPD0gMSkgeworICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgX19rbXBfYWZmaW5pdHlfd2FybmluZ3MpIHsKKyAgICAgICAgS01QX1dBUk5JTkcoQWZmQmFsYW5jZWROb3RBdmFpbCwgIktNUF9BRkZJTklUWSIpOworICAgICAgfQorICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmU7CisgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV91bmlmb3JtX3RvcG9sb2d5KCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7IC8vIE5vbi11bmlmb3JtIHRvcG9sb2d5CisKKyAgICAgIC8vIFNhdmUgdGhlIGRlcHRoIGZvciBmdXJ0aGVyIHVzYWdlCisgICAgICBfX2ttcF9hZmZfZGVwdGggPSBkZXB0aDsKKworICAgICAgaW50IGNvcmVfbGV2ZWwgPSBfX2ttcF9hZmZpbml0eV9maW5kX2NvcmVfbGV2ZWwoCisgICAgICAgICAgYWRkcmVzczJvcywgX19rbXBfYXZhaWxfcHJvYywgZGVwdGggLSAxKTsKKyAgICAgIGludCBuY29yZXMgPSBfX2ttcF9hZmZpbml0eV9jb21wdXRlX25jb3JlcyhhZGRyZXNzMm9zLCBfX2ttcF9hdmFpbF9wcm9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoIC0gMSwgY29yZV9sZXZlbCk7CisgICAgICBpbnQgbWF4cHJvY3BlcmNvcmUgPSBfX2ttcF9hZmZpbml0eV9tYXhfcHJvY19wZXJfY29yZSgKKyAgICAgICAgICBhZGRyZXNzMm9zLCBfX2ttcF9hdmFpbF9wcm9jLCBkZXB0aCAtIDEsIGNvcmVfbGV2ZWwpOworCisgICAgICBpbnQgbnByb2MgPSBuY29yZXMgKiBtYXhwcm9jcGVyY29yZTsKKyAgICAgIGlmICgobnByb2MgPCAyKSB8fCAobnByb2MgPCBfX2ttcF9hdmFpbF9wcm9jKSkgeworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCBfX2ttcF9hZmZpbml0eV93YXJuaW5ncykgeworICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZkJhbGFuY2VkTm90QXZhaWwsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfbm9uZTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBwcm9jYXJyID0gKGludCAqKV9fa21wX2FsbG9jYXRlKHNpemVvZihpbnQpICogbnByb2MpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBucHJvYzsgaSsrKSB7CisgICAgICAgIHByb2NhcnJbaV0gPSAtMTsKKyAgICAgIH0KKworICAgICAgaW50IGxhc3Rjb3JlID0gLTE7CisgICAgICBpbnQgaW5sYXN0Y29yZSA9IDA7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9fa21wX2F2YWlsX3Byb2M7IGkrKykgeworICAgICAgICBpbnQgcHJvYyA9IGFkZHJlc3Myb3NbaV0uc2Vjb25kOworICAgICAgICBpbnQgY29yZSA9CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9maW5kX2NvcmUoYWRkcmVzczJvcywgaSwgZGVwdGggLSAxLCBjb3JlX2xldmVsKTsKKworICAgICAgICBpZiAoY29yZSA9PSBsYXN0Y29yZSkgeworICAgICAgICAgIGlubGFzdGNvcmUrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbmxhc3Rjb3JlID0gMDsKKyAgICAgICAgfQorICAgICAgICBsYXN0Y29yZSA9IGNvcmU7CisKKyAgICAgICAgcHJvY2Fycltjb3JlICogbWF4cHJvY3BlcmNvcmUgKyBpbmxhc3Rjb3JlXSA9IHByb2M7CisgICAgICB9CisKKyAgICAgIGJyZWFrOworICAgIH0KKworICBzb3J0QWRkcmVzc2VzOgorICAgIC8vIEFsbG9jYXRlIHRoZSBndGlkLT5hZmZpbml0eSBtYXNrIHRhYmxlLgorICAgIGlmIChfX2ttcF9hZmZpbml0eV9kdXBzKSB7CisgICAgICBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgPSBfX2ttcF9hdmFpbF9wcm9jOworICAgIH0gZWxzZSB7CisgICAgICBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgPSBudW1VbmlxdWU7CisgICAgfQorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAoKF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSAhPSBwcm9jX2JpbmRfaW50ZWwpICYmCisgICAgICAgIChfX2ttcF9hZmZpbml0eV9udW1fcGxhY2VzID4gMCkgJiYKKyAgICAgICAgKCh1bnNpZ25lZClfX2ttcF9hZmZpbml0eV9udW1fcGxhY2VzIDwgX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzKSkgeworICAgICAgX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzID0gX19rbXBfYWZmaW5pdHlfbnVtX3BsYWNlczsKKyAgICB9CisjZW5kaWYKKworICAgIEtNUF9DUFVfQUxMT0NfQVJSQVkoX19rbXBfYWZmaW5pdHlfbWFza3MsIF9fa21wX2FmZmluaXR5X251bV9tYXNrcyk7CisKKyAgICAvLyBTb3J0IHRoZSBhZGRyZXNzMm9zIHRhYmxlIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBzZXR0aW5nIG9mCisgICAgLy8gX19rbXBfYWZmaW5pdHlfY29tcGFjdCwgdGhlbiBmaWxsIG91dCBfX2ttcF9hZmZpbml0eV9tYXNrcy4KKyAgICBxc29ydChhZGRyZXNzMm9zLCBfX2ttcF9hdmFpbF9wcm9jLCBzaXplb2YoKmFkZHJlc3Myb3MpLAorICAgICAgICAgIF9fa21wX2FmZmluaXR5X2NtcF9BZGRyZXNzX2NoaWxkX251bSk7CisgICAgeworICAgICAgaW50IGk7CisgICAgICB1bnNpZ25lZCBqOworICAgICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBfX2ttcF9hdmFpbF9wcm9jOyBpKyspIHsKKyAgICAgICAgaWYgKCghX19rbXBfYWZmaW5pdHlfZHVwcykgJiYgKCFhZGRyZXNzMm9zW2ldLmZpcnN0LmxlYWRlcikpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICB1bnNpZ25lZCBvc0lkID0gYWRkcmVzczJvc1tpXS5zZWNvbmQ7CisgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgKnNyYyA9IEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBvc0lkKTsKKyAgICAgICAga21wX2FmZmluX21hc2tfdCAqZGVzdCA9IEtNUF9DUFVfSU5ERVgoX19rbXBfYWZmaW5pdHlfbWFza3MsIGopOworICAgICAgICBLTVBfQVNTRVJUKEtNUF9DUFVfSVNTRVQob3NJZCwgc3JjKSk7CisgICAgICAgIEtNUF9DUFVfQ09QWShkZXN0LCBzcmMpOworICAgICAgICBpZiAoKytqID49IF9fa21wX2FmZmluaXR5X251bV9tYXNrcykgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBLTVBfREVCVUdfQVNTRVJUKGogPT0gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzKTsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICBLTVBfQVNTRVJUMigwLCAiVW5leHBlY3RlZCBhZmZpbml0eSBzZXR0aW5nIik7CisgIH0KKworICBLTVBfQ1BVX0ZSRUVfQVJSQVkob3NJZDJNYXNrLCBtYXhJbmRleCArIDEpOworICBtYWNoaW5lX2hpZXJhcmNoeS5pbml0KGFkZHJlc3Myb3MsIF9fa21wX2F2YWlsX3Byb2MpOworfQorI3VuZGVmIEtNUF9FWElUX0FGRl9OT05FCisKK3ZvaWQgX19rbXBfYWZmaW5pdHlfaW5pdGlhbGl6ZSh2b2lkKSB7CisgIC8vIE11Y2ggb2YgdGhlIGNvZGUgYWJvdmUgd2FzIHdyaXR0ZW4gYXNzdW1taW5nIHRoYXQgaWYgYSBtYWNoaW5lIHdhcyBub3QKKyAgLy8gYWZmaW5pdHkgY2FwYWJsZSwgdGhlbiBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUuICBXZSBub3cKKyAgLy8gZXhwbGljaXRseSByZXByZXNlbnQgdGhpcyBhcyBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2Rpc2FibGVkLgorICAvLyBUaGVyZSBhcmUgdG9vIG1hbnkgY2hlY2tzIGZvciBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUKKyAgLy8gaW4gdGhpcyBjb2RlLiAgSW5zdGVhZCBvZiB0cnlpbmcgdG8gY2hhbmdlIHRoZW0gYWxsLCBjaGVjayBpZgorICAvLyBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2Rpc2FibGVkLCBhbmQgaWYgc28sIHNsYW0gaXQgd2l0aAorICAvLyBhZmZpbml0eV9ub25lLCBjYWxsIHRoZSByZWFsIGluaXRpYWxpemF0aW9uIHJvdXRpbmUsIHRoZW4gcmVzdG9yZQorICAvLyBfX2ttcF9hZmZpbml0eV90eXBlIHRvIGFmZmluaXR5X2Rpc2FibGVkLgorICBpbnQgZGlzYWJsZWQgPSAoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9kaXNhYmxlZCk7CisgIGlmICghS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgIEtNUF9BU1NFUlQoZGlzYWJsZWQpOworICB9CisgIGlmIChkaXNhYmxlZCkgeworICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lOworICB9CisgIF9fa21wX2F1eF9hZmZpbml0eV9pbml0aWFsaXplKCk7CisgIGlmIChkaXNhYmxlZCkgeworICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9kaXNhYmxlZDsKKyAgfQorfQorCit2b2lkIF9fa21wX2FmZmluaXR5X3VuaW5pdGlhbGl6ZSh2b2lkKSB7CisgIGlmIChfX2ttcF9hZmZpbml0eV9tYXNrcyAhPSBOVUxMKSB7CisgICAgS01QX0NQVV9GUkVFX0FSUkFZKF9fa21wX2FmZmluaXR5X21hc2tzLCBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MpOworICAgIF9fa21wX2FmZmluaXR5X21hc2tzID0gTlVMTDsKKyAgfQorICBpZiAoX19rbXBfYWZmaW5fZnVsbE1hc2sgIT0gTlVMTCkgeworICAgIEtNUF9DUFVfRlJFRShfX2ttcF9hZmZpbl9mdWxsTWFzayk7CisgICAgX19rbXBfYWZmaW5fZnVsbE1hc2sgPSBOVUxMOworICB9CisgIF9fa21wX2FmZmluaXR5X251bV9tYXNrcyA9IDA7CisgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9kZWZhdWx0OworI2lmIE9NUF80MF9FTkFCTEVECisgIF9fa21wX2FmZmluaXR5X251bV9wbGFjZXMgPSAwOworI2VuZGlmCisgIGlmIChfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCAhPSBOVUxMKSB7CisgICAgX19rbXBfZnJlZShfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCk7CisgICAgX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QgPSBOVUxMOworICB9CisgIGlmIChhZGRyZXNzMm9zICE9IE5VTEwpIHsKKyAgICBfX2ttcF9mcmVlKGFkZHJlc3Myb3MpOworICAgIGFkZHJlc3Myb3MgPSBOVUxMOworICB9CisgIGlmIChwcm9jYXJyICE9IE5VTEwpIHsKKyAgICBfX2ttcF9mcmVlKHByb2NhcnIpOworICAgIHByb2NhcnIgPSBOVUxMOworICB9CisjaWYgS01QX1VTRV9IV0xPQworICBpZiAoX19rbXBfaHdsb2NfdG9wb2xvZ3kgIT0gTlVMTCkgeworICAgIGh3bG9jX3RvcG9sb2d5X2Rlc3Ryb3koX19rbXBfaHdsb2NfdG9wb2xvZ3kpOworICAgIF9fa21wX2h3bG9jX3RvcG9sb2d5ID0gTlVMTDsKKyAgfQorI2VuZGlmCisgIEtNUEFmZmluaXR5OjpkZXN0cm95X2FwaSgpOworfQorCit2b2lkIF9fa21wX2FmZmluaXR5X3NldF9pbml0X21hc2soaW50IGd0aWQsIGludCBpc2Ffcm9vdCkgeworICBpZiAoIUtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBrbXBfaW5mb190ICp0aCA9IChrbXBfaW5mb190ICopVENSX1NZTkNfUFRSKF9fa21wX3RocmVhZHNbZ3RpZF0pOworICBpZiAodGgtPnRoLnRoX2FmZmluX21hc2sgPT0gTlVMTCkgeworICAgIEtNUF9DUFVfQUxMT0ModGgtPnRoLnRoX2FmZmluX21hc2spOworICB9IGVsc2UgeworICAgIEtNUF9DUFVfWkVSTyh0aC0+dGgudGhfYWZmaW5fbWFzayk7CisgIH0KKworICAvLyBDb3B5IHRoZSB0aHJlYWQgbWFzayB0byB0aGUga21wX2luZm9fdCBzdHJ1Y3V0dXJlLiBJZgorICAvLyBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUsIGNvcHkgdGhlICJmdWxsIiBtYXNrLCBpLmUuIG9uZSB0aGF0CisgIC8vIGhhcyBhbGwgb2YgdGhlIE9TIHByb2MgaWRzIHNldCwgb3IgaWYgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrIGlzIHNldCwKKyAgLy8gdGhlbiB0aGUgZnVsbCBtYXNrIGlzIHRoZSBzYW1lIGFzIHRoZSBtYXNrIG9mIHRoZSBpbml0aWFsaXphdGlvbiB0aHJlYWQuCisgIGttcF9hZmZpbl9tYXNrX3QgKm1hc2s7CisgIGludCBpOworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgaWYgKF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9PSBwcm9jX2JpbmRfaW50ZWwpCisjZW5kaWYKKyAgeworICAgIGlmICgoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKSB8fAorICAgICAgICAoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9iYWxhbmNlZCkpIHsKKyNpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKyAgICAgIGlmIChfX2ttcF9udW1fcHJvY19ncm91cHMgPiAxKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyNlbmRpZgorICAgICAgS01QX0FTU0VSVChfX2ttcF9hZmZpbl9mdWxsTWFzayAhPSBOVUxMKTsKKyAgICAgIGkgPSBLTVBfUExBQ0VfQUxMOworICAgICAgbWFzayA9IF9fa21wX2FmZmluX2Z1bGxNYXNrOworICAgIH0gZWxzZSB7CisgICAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2FmZmluaXR5X251bV9tYXNrcyA+IDApOworICAgICAgaSA9IChndGlkICsgX19rbXBfYWZmaW5pdHlfb2Zmc2V0KSAlIF9fa21wX2FmZmluaXR5X251bV9tYXNrczsKKyAgICAgIG1hc2sgPSBLTVBfQ1BVX0lOREVYKF9fa21wX2FmZmluaXR5X21hc2tzLCBpKTsKKyAgICB9CisgIH0KKyNpZiBPTVBfNDBfRU5BQkxFRAorICBlbHNlIHsKKyAgICBpZiAoKCFpc2Ffcm9vdCkgfHwKKyAgICAgICAgKF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9PSBwcm9jX2JpbmRfZmFsc2UpKSB7CisjaWYgS01QX0dST1VQX0FGRklOSVRZCisgICAgICBpZiAoX19rbXBfbnVtX3Byb2NfZ3JvdXBzID4gMSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisjZW5kaWYKKyAgICAgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5fZnVsbE1hc2sgIT0gTlVMTCk7CisgICAgICBpID0gS01QX1BMQUNFX0FMTDsKKyAgICAgIG1hc2sgPSBfX2ttcF9hZmZpbl9mdWxsTWFzazsKKyAgICB9IGVsc2UgeworICAgICAgLy8gaW50IGkgPSBzb21lIGhhc2ggZnVuY3Rpb24gb3IganVzdCBhIGNvdW50ZXIgdGhhdCBkb2Vzbid0CisgICAgICAvLyBhbHdheXMgc3RhcnQgYXQgMC4gIFVzZSBndGlkIGZvciBub3cuCisgICAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2FmZmluaXR5X251bV9tYXNrcyA+IDApOworICAgICAgaSA9IChndGlkICsgX19rbXBfYWZmaW5pdHlfb2Zmc2V0KSAlIF9fa21wX2FmZmluaXR5X251bV9tYXNrczsKKyAgICAgIG1hc2sgPSBLTVBfQ1BVX0lOREVYKF9fa21wX2FmZmluaXR5X21hc2tzLCBpKTsKKyAgICB9CisgIH0KKyNlbmRpZgorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgdGgtPnRoLnRoX2N1cnJlbnRfcGxhY2UgPSBpOworICBpZiAoaXNhX3Jvb3QpIHsKKyAgICB0aC0+dGgudGhfbmV3X3BsYWNlID0gaTsKKyAgICB0aC0+dGgudGhfZmlyc3RfcGxhY2UgPSAwOworICAgIHRoLT50aC50aF9sYXN0X3BsYWNlID0gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gMTsKKyAgfQorCisgIGlmIChpID09IEtNUF9QTEFDRV9BTEwpIHsKKyAgICBLQV9UUkFDRSgxMDAsICgiX19rbXBfYWZmaW5pdHlfc2V0X2luaXRfbWFzazogYmluZGluZyBUIyVkIHRvIGFsbCBwbGFjZXNcbiIsCisgICAgICAgICAgICAgICAgICAgZ3RpZCkpOworICB9IGVsc2UgeworICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF9hZmZpbml0eV9zZXRfaW5pdF9tYXNrOiBiaW5kaW5nIFQjJWQgdG8gcGxhY2UgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgZ3RpZCwgaSkpOworICB9CisjZWxzZQorICBpZiAoaSA9PSAtMSkgeworICAgIEtBX1RSQUNFKAorICAgICAgICAxMDAsCisgICAgICAgICgiX19rbXBfYWZmaW5pdHlfc2V0X2luaXRfbWFzazogYmluZGluZyBUIyVkIHRvIF9fa21wX2FmZmluX2Z1bGxNYXNrXG4iLAorICAgICAgICAgZ3RpZCkpOworICB9IGVsc2UgeworICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF9hZmZpbml0eV9zZXRfaW5pdF9tYXNrOiBiaW5kaW5nIFQjJWQgdG8gbWFzayAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBndGlkLCBpKSk7CisgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgIEtNUF9DUFVfQ09QWSh0aC0+dGgudGhfYWZmaW5fbWFzaywgbWFzayk7CisKKyAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfYWZmaW5fbWFzayk7CisgICAgS01QX0lORk9STShCb3VuZFRvT1NQcm9jU2V0LCAiS01QX0FGRklOSVRZIiwgKGttcF9pbnQzMilnZXRwaWQoKSwKKyAgICAgICAgICAgICAgIF9fa21wX2dldHRpZCgpLCBndGlkLCBidWYpOworICB9CisKKyNpZiBLTVBfT1NfV0lORE9XUworICAvLyBPbiBXaW5kb3dzKiBPUywgdGhlIHByb2Nlc3MgYWZmaW5pdHkgbWFzayBtaWdodCBoYXZlIGNoYW5nZWQuIElmIHRoZSB1c2VyCisgIC8vIGRpZG4ndCByZXF1ZXN0IGFmZmluaXR5IGFuZCB0aGlzIGNhbGwgZmFpbHMsIGp1c3QgY29udGludWUgc2lsZW50bHkuCisgIC8vIFNlZSBDUTE3MTM5My4KKyAgaWYgKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSkgeworICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkodGgtPnRoLnRoX2FmZmluX21hc2ssIEZBTFNFKTsKKyAgfSBlbHNlCisjZW5kaWYKKyAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KHRoLT50aC50aF9hZmZpbl9tYXNrLCBUUlVFKTsKK30KKworI2lmIE9NUF80MF9FTkFCTEVECisKK3ZvaWQgX19rbXBfYWZmaW5pdHlfc2V0X3BsYWNlKGludCBndGlkKSB7CisgIGludCByZXR2YWw7CisKKyAgaWYgKCFLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAga21wX2luZm9fdCAqdGggPSAoa21wX2luZm9fdCAqKVRDUl9TWU5DX1BUUihfX2ttcF90aHJlYWRzW2d0aWRdKTsKKworICBLQV9UUkFDRSgxMDAsICgiX19rbXBfYWZmaW5pdHlfc2V0X3BsYWNlOiBiaW5kaW5nIFQjJWQgdG8gcGxhY2UgJWQgKGN1cnJlbnQgIgorICAgICAgICAgICAgICAgICAicGxhY2UgPSAlZClcbiIsCisgICAgICAgICAgICAgICAgIGd0aWQsIHRoLT50aC50aF9uZXdfcGxhY2UsIHRoLT50aC50aF9jdXJyZW50X3BsYWNlKSk7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgbmV3IHBsYWNlIGlzIHdpdGhpbiB0aGlzIHRocmVhZCdzIHBhcnRpdGlvbi4KKyAgS01QX0RFQlVHX0FTU0VSVCh0aC0+dGgudGhfYWZmaW5fbWFzayAhPSBOVUxMKTsKKyAgS01QX0FTU0VSVCh0aC0+dGgudGhfbmV3X3BsYWNlID49IDApOworICBLTVBfQVNTRVJUKCh1bnNpZ25lZCl0aC0+dGgudGhfbmV3X3BsYWNlIDw9IF9fa21wX2FmZmluaXR5X251bV9tYXNrcyk7CisgIGlmICh0aC0+dGgudGhfZmlyc3RfcGxhY2UgPD0gdGgtPnRoLnRoX2xhc3RfcGxhY2UpIHsKKyAgICBLTVBfQVNTRVJUKCh0aC0+dGgudGhfbmV3X3BsYWNlID49IHRoLT50aC50aF9maXJzdF9wbGFjZSkgJiYKKyAgICAgICAgICAgICAgICh0aC0+dGgudGhfbmV3X3BsYWNlIDw9IHRoLT50aC50aF9sYXN0X3BsYWNlKSk7CisgIH0gZWxzZSB7CisgICAgS01QX0FTU0VSVCgodGgtPnRoLnRoX25ld19wbGFjZSA8PSB0aC0+dGgudGhfZmlyc3RfcGxhY2UpIHx8CisgICAgICAgICAgICAgICAodGgtPnRoLnRoX25ld19wbGFjZSA+PSB0aC0+dGgudGhfbGFzdF9wbGFjZSkpOworICB9CisKKyAgLy8gQ29weSB0aGUgdGhyZWFkIG1hc2sgdG8gdGhlIGttcF9pbmZvX3Qgc3RydWN1dHVyZSwKKyAgLy8gYW5kIHNldCB0aGlzIHRocmVhZCdzIGFmZmluaXR5LgorICBrbXBfYWZmaW5fbWFza190ICptYXNrID0KKyAgICAgIEtNUF9DUFVfSU5ERVgoX19rbXBfYWZmaW5pdHlfbWFza3MsIHRoLT50aC50aF9uZXdfcGxhY2UpOworICBLTVBfQ1BVX0NPUFkodGgtPnRoLnRoX2FmZmluX21hc2ssIG1hc2spOworICB0aC0+dGgudGhfY3VycmVudF9wbGFjZSA9IHRoLT50aC50aF9uZXdfcGxhY2U7CisKKyAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfYWZmaW5fbWFzayk7CisgICAgS01QX0lORk9STShCb3VuZFRvT1NQcm9jU2V0LCAiT01QX1BST0NfQklORCIsIChrbXBfaW50MzIpZ2V0cGlkKCksCisgICAgICAgICAgICAgICBfX2ttcF9nZXR0aWQoKSwgZ3RpZCwgYnVmKTsKKyAgfQorICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KHRoLT50aC50aF9hZmZpbl9tYXNrLCBUUlVFKTsKK30KKworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKK2ludCBfX2ttcF9hdXhfc2V0X2FmZmluaXR5KHZvaWQgKiptYXNrKSB7CisgIGludCBndGlkOworICBrbXBfaW5mb190ICp0aDsKKyAgaW50IHJldHZhbDsKKworICBpZiAoIUtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICBLQV9UUkFDRSgxMDAwLCA7IHsKKyAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpOworICAgIF9fa21wX2RlYnVnX3ByaW50ZigKKyAgICAgICAgImttcF9zZXRfYWZmaW5pdHk6IHNldHRpbmcgYWZmaW5pdHkgbWFzayBmb3IgdGhyZWFkICVkID0gJXNcbiIsIGd0aWQsCisgICAgICAgIGJ1Zik7CisgIH0pOworCisgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICBpZiAoKG1hc2sgPT0gTlVMTCkgfHwgKCptYXNrID09IE5VTEwpKSB7CisgICAgICBLTVBfRkFUQUwoQWZmaW5pdHlJbnZhbGlkTWFzaywgImttcF9zZXRfYWZmaW5pdHkiKTsKKyAgICB9IGVsc2UgeworICAgICAgdW5zaWduZWQgcHJvYzsKKyAgICAgIGludCBudW1fcHJvY3MgPSAwOworCisgICAgICBLTVBfQ1BVX1NFVF9JVEVSQVRFKHByb2MsICgoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpKSB7CisgICAgICAgIGlmICghS01QX0NQVV9JU1NFVChwcm9jLCBfX2ttcF9hZmZpbl9mdWxsTWFzaykpIHsKKyAgICAgICAgICBLTVBfRkFUQUwoQWZmaW5pdHlJbnZhbGlkTWFzaywgImttcF9zZXRfYWZmaW5pdHkiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUtNUF9DUFVfSVNTRVQocHJvYywgKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG51bV9wcm9jcysrOworICAgICAgfQorICAgICAgaWYgKG51bV9wcm9jcyA9PSAwKSB7CisgICAgICAgIEtNUF9GQVRBTChBZmZpbml0eUludmFsaWRNYXNrLCAia21wX3NldF9hZmZpbml0eSIpOworICAgICAgfQorCisjaWYgS01QX0dST1VQX0FGRklOSVRZCisgICAgICBpZiAoX19rbXBfZ2V0X3Byb2NfZ3JvdXAoKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spKSA8IDApIHsKKyAgICAgICAgS01QX0ZBVEFMKEFmZmluaXR5SW52YWxpZE1hc2ssICJrbXBfc2V0X2FmZmluaXR5Iik7CisgICAgICB9CisjZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisgICAgfQorICB9CisKKyAgdGggPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICBLTVBfREVCVUdfQVNTRVJUKHRoLT50aC50aF9hZmZpbl9tYXNrICE9IE5VTEwpOworICByZXR2YWwgPSBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSwgRkFMU0UpOworICBpZiAocmV0dmFsID09IDApIHsKKyAgICBLTVBfQ1BVX0NPUFkodGgtPnRoLnRoX2FmZmluX21hc2ssIChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSk7CisgIH0KKworI2lmIE9NUF80MF9FTkFCTEVECisgIHRoLT50aC50aF9jdXJyZW50X3BsYWNlID0gS01QX1BMQUNFX1VOREVGSU5FRDsKKyAgdGgtPnRoLnRoX25ld19wbGFjZSA9IEtNUF9QTEFDRV9VTkRFRklORUQ7CisgIHRoLT50aC50aF9maXJzdF9wbGFjZSA9IDA7CisgIHRoLT50aC50aF9sYXN0X3BsYWNlID0gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gMTsKKworICAvLyBUdXJuIG9mZiA0LjAgYWZmaW5pdHkgZm9yIHRoZSBjdXJyZW50IHRyZWFkIGF0IHRoaXMgcGFyYWxsZWwgbGV2ZWwuCisgIHRoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMucHJvY19iaW5kID0gcHJvY19iaW5kX2ZhbHNlOworI2VuZGlmCisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworaW50IF9fa21wX2F1eF9nZXRfYWZmaW5pdHkodm9pZCAqKm1hc2spIHsKKyAgaW50IGd0aWQ7CisgIGludCByZXR2YWw7CisgIGttcF9pbmZvX3QgKnRoOworCisgIGlmICghS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgIHRoID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgS01QX0RFQlVHX0FTU0VSVCh0aC0+dGgudGhfYWZmaW5fbWFzayAhPSBOVUxMKTsKKworICBLQV9UUkFDRSgxMDAwLCA7IHsKKyAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfYWZmaW5fbWFzayk7CisgICAgX19rbXBfcHJpbnRmKCJrbXBfZ2V0X2FmZmluaXR5OiBzdG9yZWQgYWZmaW5pdHkgbWFzayBmb3IgdGhyZWFkICVkID0gJXNcbiIsCisgICAgICAgICAgICAgICAgIGd0aWQsIGJ1Zik7CisgIH0pOworCisgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICBpZiAoKG1hc2sgPT0gTlVMTCkgfHwgKCptYXNrID09IE5VTEwpKSB7CisgICAgICBLTVBfRkFUQUwoQWZmaW5pdHlJbnZhbGlkTWFzaywgImttcF9nZXRfYWZmaW5pdHkiKTsKKyAgICB9CisgIH0KKworI2lmICFLTVBfT1NfV0lORE9XUworCisgIHJldHZhbCA9IF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spLCBGQUxTRSk7CisgIEtBX1RSQUNFKDEwMDAsIDsgeworICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSk7CisgICAgX19rbXBfcHJpbnRmKCJrbXBfZ2V0X2FmZmluaXR5OiBzeXN0ZW0gYWZmaW5pdHkgbWFzayBmb3IgdGhyZWFkICVkID0gJXNcbiIsCisgICAgICAgICAgICAgICAgIGd0aWQsIGJ1Zik7CisgIH0pOworICByZXR1cm4gcmV0dmFsOworCisjZWxzZQorCisgIEtNUF9DUFVfQ09QWSgoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzayksIHRoLT50aC50aF9hZmZpbl9tYXNrKTsKKyAgcmV0dXJuIDA7CisKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworfQorCitpbnQgX19rbXBfYXV4X2dldF9hZmZpbml0eV9tYXhfcHJvYygpIHsKKyAgaWYgKCFLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyNpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKyAgaWYgKF9fa21wX251bV9wcm9jX2dyb3VwcyA+IDEpIHsKKyAgICByZXR1cm4gKGludCkoX19rbXBfbnVtX3Byb2NfZ3JvdXBzICogc2l6ZW9mKERXT1JEX1BUUikgKiBDSEFSX0JJVCk7CisgIH0KKyNlbmRpZgorICByZXR1cm4gX19rbXBfeHByb2M7Cit9CisKK2ludCBfX2ttcF9hdXhfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhpbnQgcHJvYywgdm9pZCAqKm1hc2spIHsKKyAgaW50IHJldHZhbDsKKworICBpZiAoIUtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBLQV9UUkFDRSgxMDAwLCA7IHsKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpOworICAgIF9fa21wX2RlYnVnX3ByaW50Zigia21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2M6IHNldHRpbmcgcHJvYyAlZCBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICJhZmZpbml0eSBtYXNrIGZvciB0aHJlYWQgJWQgPSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcHJvYywgZ3RpZCwgYnVmKTsKKyAgfSk7CisKKyAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgIGlmICgobWFzayA9PSBOVUxMKSB8fCAoKm1hc2sgPT0gTlVMTCkpIHsKKyAgICAgIEtNUF9GQVRBTChBZmZpbml0eUludmFsaWRNYXNrLCAia21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MiKTsKKyAgICB9CisgIH0KKworICBpZiAoKHByb2MgPCAwKSB8fCAocHJvYyA+PSBfX2ttcF9hdXhfZ2V0X2FmZmluaXR5X21heF9wcm9jKCkpKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmICghS01QX0NQVV9JU1NFVChwcm9jLCBfX2ttcF9hZmZpbl9mdWxsTWFzaykpIHsKKyAgICByZXR1cm4gLTI7CisgIH0KKworICBLTVBfQ1BVX1NFVChwcm9jLCAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpOworICByZXR1cm4gMDsKK30KKworaW50IF9fa21wX2F1eF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MoaW50IHByb2MsIHZvaWQgKiptYXNrKSB7CisgIGludCByZXR2YWw7CisKKyAgaWYgKCFLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgS0FfVFJBQ0UoMTAwMCwgOyB7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spKTsKKyAgICBfX2ttcF9kZWJ1Z19wcmludGYoImttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2M6IHVuc2V0dGluZyBwcm9jICVkIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgImFmZmluaXR5IG1hc2sgZm9yIHRocmVhZCAlZCA9ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBwcm9jLCBndGlkLCBidWYpOworICB9KTsKKworICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgaWYgKChtYXNrID09IE5VTEwpIHx8ICgqbWFzayA9PSBOVUxMKSkgeworICAgICAgS01QX0ZBVEFMKEFmZmluaXR5SW52YWxpZE1hc2ssICJrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jIik7CisgICAgfQorICB9CisKKyAgaWYgKChwcm9jIDwgMCkgfHwgKHByb2MgPj0gX19rbXBfYXV4X2dldF9hZmZpbml0eV9tYXhfcHJvYygpKSkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoIUtNUF9DUFVfSVNTRVQocHJvYywgX19rbXBfYWZmaW5fZnVsbE1hc2spKSB7CisgICAgcmV0dXJuIC0yOworICB9CisKKyAgS01QX0NQVV9DTFIocHJvYywgKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBfX2ttcF9hdXhfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhpbnQgcHJvYywgdm9pZCAqKm1hc2spIHsKKyAgaW50IHJldHZhbDsKKworICBpZiAoIUtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBLQV9UUkFDRSgxMDAwLCA7IHsKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpOworICAgIF9fa21wX2RlYnVnX3ByaW50Zigia21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2M6IGdldHRpbmcgcHJvYyAlZCBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICJhZmZpbml0eSBtYXNrIGZvciB0aHJlYWQgJWQgPSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcHJvYywgZ3RpZCwgYnVmKTsKKyAgfSk7CisKKyAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgIGlmICgobWFzayA9PSBOVUxMKSB8fCAoKm1hc2sgPT0gTlVMTCkpIHsKKyAgICAgIEtNUF9GQVRBTChBZmZpbml0eUludmFsaWRNYXNrLCAia21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MiKTsKKyAgICB9CisgIH0KKworICBpZiAoKHByb2MgPCAwKSB8fCAocHJvYyA+PSBfX2ttcF9hdXhfZ2V0X2FmZmluaXR5X21heF9wcm9jKCkpKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmICghS01QX0NQVV9JU1NFVChwcm9jLCBfX2ttcF9hZmZpbl9mdWxsTWFzaykpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiBLTVBfQ1BVX0lTU0VUKHByb2MsIChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSk7Cit9CisKKy8vIER5bmFtaWMgYWZmaW5pdHkgc2V0dGluZ3MgLSBBZmZpbml0eSBiYWxhbmNlZAordm9pZCBfX2ttcF9iYWxhbmNlZF9hZmZpbml0eShpbnQgdGlkLCBpbnQgbnRocmVhZHMpIHsKKyAgYm9vbCBmaW5lX2dyYW4gPSB0cnVlOworCisgIHN3aXRjaCAoX19rbXBfYWZmaW5pdHlfZ3JhbikgeworICBjYXNlIGFmZmluaXR5X2dyYW5fZmluZToKKyAgY2FzZSBhZmZpbml0eV9ncmFuX3RocmVhZDoKKyAgICBicmVhazsKKyAgY2FzZSBhZmZpbml0eV9ncmFuX2NvcmU6CisgICAgaWYgKF9fa21wX25UaHJlYWRzUGVyQ29yZSA+IDEpIHsKKyAgICAgIGZpbmVfZ3JhbiA9IGZhbHNlOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBhZmZpbml0eV9ncmFuX3BhY2thZ2U6CisgICAgaWYgKG5Db3Jlc1BlclBrZyA+IDEpIHsKKyAgICAgIGZpbmVfZ3JhbiA9IGZhbHNlOworICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBmaW5lX2dyYW4gPSBmYWxzZTsKKyAgfQorCisgIGlmIChfX2ttcF9hZmZpbml0eV91bmlmb3JtX3RvcG9sb2d5KCkpIHsKKyAgICBpbnQgY29yZUlEOworICAgIGludCB0aHJlYWRJRDsKKyAgICAvLyBOdW1iZXIgb2YgaHlwZXIgdGhyZWFkcyBwZXIgY29yZSBpbiBIVCBtYWNoaW5lCisgICAgaW50IF9fa21wX250aF9wZXJfY29yZSA9IF9fa21wX2F2YWlsX3Byb2MgLyBfX2ttcF9uY29yZXM7CisgICAgLy8gTnVtYmVyIG9mIGNvcmVzCisgICAgaW50IG5jb3JlcyA9IF9fa21wX25jb3JlczsKKyAgICBpZiAoKG5QYWNrYWdlcyA+IDEpICYmIChfX2ttcF9udGhfcGVyX2NvcmUgPD0gMSkpIHsKKyAgICAgIF9fa21wX250aF9wZXJfY29yZSA9IF9fa21wX2F2YWlsX3Byb2MgLyBuUGFja2FnZXM7CisgICAgICBuY29yZXMgPSBuUGFja2FnZXM7CisgICAgfQorICAgIC8vIEhvdyBtYW55IHRocmVhZHMgd2lsbCBiZSBib3VuZCB0byBlYWNoIGNvcmUKKyAgICBpbnQgY2h1bmsgPSBudGhyZWFkcyAvIG5jb3JlczsKKyAgICAvLyBIb3cgbWFueSBjb3JlcyB3aWxsIGhhdmUgYW4gYWRkaXRpb25hbCB0aHJlYWQgYm91bmQgdG8gaXQgLSAiYmlnIGNvcmVzIgorICAgIGludCBiaWdfY29yZXMgPSBudGhyZWFkcyAlIG5jb3JlczsKKyAgICAvLyBOdW1iZXIgb2YgdGhyZWFkcyBvbiB0aGUgYmlnIGNvcmVzCisgICAgaW50IGJpZ19udGggPSAoY2h1bmsgKyAxKSAqIGJpZ19jb3JlczsKKyAgICBpZiAodGlkIDwgYmlnX250aCkgeworICAgICAgY29yZUlEID0gdGlkIC8gKGNodW5rICsgMSk7CisgICAgICB0aHJlYWRJRCA9ICh0aWQgJSAoY2h1bmsgKyAxKSkgJSBfX2ttcF9udGhfcGVyX2NvcmU7CisgICAgfSBlbHNlIHsgLy8gdGlkID49IGJpZ19udGgKKyAgICAgIGNvcmVJRCA9ICh0aWQgLSBiaWdfY29yZXMpIC8gY2h1bms7CisgICAgICB0aHJlYWRJRCA9ICgodGlkIC0gYmlnX2NvcmVzKSAlIGNodW5rKSAlIF9fa21wX250aF9wZXJfY29yZTsKKyAgICB9CisKKyAgICBLTVBfREVCVUdfQVNTRVJUMihLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpLAorICAgICAgICAgICAgICAgICAgICAgICJJbGxlZ2FsIHNldCBhZmZpbml0eSBvcGVyYXRpb24gd2hlbiBub3QgY2FwYWJsZSIpOworCisgICAga21wX2FmZmluX21hc2tfdCAqbWFzazsKKyAgICBLTVBfQ1BVX0FMTE9DX09OX1NUQUNLKG1hc2spOworICAgIEtNUF9DUFVfWkVSTyhtYXNrKTsKKworICAgIGlmIChmaW5lX2dyYW4pIHsKKyAgICAgIGludCBvc0lEID0gYWRkcmVzczJvc1tjb3JlSUQgKiBfX2ttcF9udGhfcGVyX2NvcmUgKyB0aHJlYWRJRF0uc2Vjb25kOworICAgICAgS01QX0NQVV9TRVQob3NJRCwgbWFzayk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX19rbXBfbnRoX3Blcl9jb3JlOyBpKyspIHsKKyAgICAgICAgaW50IG9zSUQ7CisgICAgICAgIG9zSUQgPSBhZGRyZXNzMm9zW2NvcmVJRCAqIF9fa21wX250aF9wZXJfY29yZSArIGldLnNlY29uZDsKKyAgICAgICAgS01QX0NQVV9TRVQob3NJRCwgbWFzayk7CisgICAgICB9CisgICAgfQorICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgbWFzayk7CisgICAgICBLTVBfSU5GT1JNKEJvdW5kVG9PU1Byb2NTZXQsICJLTVBfQUZGSU5JVFkiLCAoa21wX2ludDMyKWdldHBpZCgpLAorICAgICAgICAgICAgICAgICBfX2ttcF9nZXR0aWQoKSwgdGlkLCBidWYpOworICAgIH0KKyAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KG1hc2ssIFRSVUUpOworICAgIEtNUF9DUFVfRlJFRV9GUk9NX1NUQUNLKG1hc2spOworICB9IGVsc2UgeyAvLyBOb24tdW5pZm9ybSB0b3BvbG9neQorCisgICAga21wX2FmZmluX21hc2tfdCAqbWFzazsKKyAgICBLTVBfQ1BVX0FMTE9DX09OX1NUQUNLKG1hc2spOworICAgIEtNUF9DUFVfWkVSTyhtYXNrKTsKKworICAgIGludCBjb3JlX2xldmVsID0gX19rbXBfYWZmaW5pdHlfZmluZF9jb3JlX2xldmVsKAorICAgICAgICBhZGRyZXNzMm9zLCBfX2ttcF9hdmFpbF9wcm9jLCBfX2ttcF9hZmZfZGVwdGggLSAxKTsKKyAgICBpbnQgbmNvcmVzID0gX19rbXBfYWZmaW5pdHlfY29tcHV0ZV9uY29yZXMoYWRkcmVzczJvcywgX19rbXBfYXZhaWxfcHJvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmX2RlcHRoIC0gMSwgY29yZV9sZXZlbCk7CisgICAgaW50IG50aF9wZXJfY29yZSA9IF9fa21wX2FmZmluaXR5X21heF9wcm9jX3Blcl9jb3JlKAorICAgICAgICBhZGRyZXNzMm9zLCBfX2ttcF9hdmFpbF9wcm9jLCBfX2ttcF9hZmZfZGVwdGggLSAxLCBjb3JlX2xldmVsKTsKKworICAgIC8vIEZvciBwZXJmb3JtYW5jZSBnYWluIGNvbnNpZGVyIHRoZSBzcGVjaWFsIGNhc2UgbnRocmVhZHMgPT0KKyAgICAvLyBfX2ttcF9hdmFpbF9wcm9jCisgICAgaWYgKG50aHJlYWRzID09IF9fa21wX2F2YWlsX3Byb2MpIHsKKyAgICAgIGlmIChmaW5lX2dyYW4pIHsKKyAgICAgICAgaW50IG9zSUQgPSBhZGRyZXNzMm9zW3RpZF0uc2Vjb25kOworICAgICAgICBLTVBfQ1BVX1NFVChvc0lELCBtYXNrKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludCBjb3JlID0gX19rbXBfYWZmaW5pdHlfZmluZF9jb3JlKGFkZHJlc3Myb3MsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmX2RlcHRoIC0gMSwgY29yZV9sZXZlbCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX19rbXBfYXZhaWxfcHJvYzsgaSsrKSB7CisgICAgICAgICAgaW50IG9zSUQgPSBhZGRyZXNzMm9zW2ldLnNlY29uZDsKKyAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZmluZF9jb3JlKGFkZHJlc3Myb3MsIGksIF9fa21wX2FmZl9kZXB0aCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlX2xldmVsKSA9PSBjb3JlKSB7CisgICAgICAgICAgICBLTVBfQ1BVX1NFVChvc0lELCBtYXNrKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG50aHJlYWRzIDw9IG5jb3JlcykgeworCisgICAgICBpbnQgY29yZSA9IDA7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5jb3JlczsgaSsrKSB7CisgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgY29yZSBmcm9tIHByb2NhcnJbXSBpcyBpbiB0aGUgbWFzaworICAgICAgICBpbnQgaW5fbWFzayA9IDA7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbnRoX3Blcl9jb3JlOyBqKyspIHsKKyAgICAgICAgICBpZiAocHJvY2FycltpICogbnRoX3Blcl9jb3JlICsgal0gIT0gLTEpIHsKKyAgICAgICAgICAgIGluX21hc2sgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpbl9tYXNrKSB7CisgICAgICAgICAgaWYgKHRpZCA9PSBjb3JlKSB7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG50aF9wZXJfY29yZTsgaisrKSB7CisgICAgICAgICAgICAgIGludCBvc0lEID0gcHJvY2FycltpICogbnRoX3Blcl9jb3JlICsgal07CisgICAgICAgICAgICAgIGlmIChvc0lEICE9IC0xKSB7CisgICAgICAgICAgICAgICAgS01QX0NQVV9TRVQob3NJRCwgbWFzayk7CisgICAgICAgICAgICAgICAgLy8gRm9yIGZpbmUgZ3JhbnVsYXJpdHkgaXQgaXMgZW5vdWdoIHRvIHNldCB0aGUgZmlyc3QgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgLy8gb3NJRCBmb3IgdGhpcyBjb3JlCisgICAgICAgICAgICAgICAgaWYgKGZpbmVfZ3JhbikgeworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29yZSsrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7IC8vIG50aHJlYWRzID4gbmNvcmVzCisgICAgICAvLyBBcnJheSB0byBzYXZlIHRoZSBudW1iZXIgb2YgcHJvY2Vzc29ycyBhdCBlYWNoIGNvcmUKKyAgICAgIGludCAqbnByb2NfYXRfY29yZSA9IChpbnQgKilLTVBfQUxMT0NBKHNpemVvZihpbnQpICogbmNvcmVzKTsKKyAgICAgIC8vIEFycmF5IHRvIHNhdmUgdGhlIG51bWJlciBvZiBjb3JlcyB3aXRoICJ4IiBhdmFpbGFibGUgcHJvY2Vzc29yczsKKyAgICAgIGludCAqbmNvcmVzX3dpdGhfeF9wcm9jcyA9CisgICAgICAgICAgKGludCAqKUtNUF9BTExPQ0Eoc2l6ZW9mKGludCkgKiAobnRoX3Blcl9jb3JlICsgMSkpOworICAgICAgLy8gQXJyYXkgdG8gc2F2ZSB0aGUgbnVtYmVyIG9mIGNvcmVzIHdpdGggIyBwcm9jcyBmcm9tIHggdG8gbnRoX3Blcl9jb3JlCisgICAgICBpbnQgKm5jb3Jlc193aXRoX3hfdG9fbWF4X3Byb2NzID0KKyAgICAgICAgICAoaW50ICopS01QX0FMTE9DQShzaXplb2YoaW50KSAqIChudGhfcGVyX2NvcmUgKyAxKSk7CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IG50aF9wZXJfY29yZTsgaSsrKSB7CisgICAgICAgIG5jb3Jlc193aXRoX3hfcHJvY3NbaV0gPSAwOworICAgICAgICBuY29yZXNfd2l0aF94X3RvX21heF9wcm9jc1tpXSA9IDA7CisgICAgICB9CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmNvcmVzOyBpKyspIHsKKyAgICAgICAgaW50IGNudCA9IDA7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbnRoX3Blcl9jb3JlOyBqKyspIHsKKyAgICAgICAgICBpZiAocHJvY2FycltpICogbnRoX3Blcl9jb3JlICsgal0gIT0gLTEpIHsKKyAgICAgICAgICAgIGNudCsrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBucHJvY19hdF9jb3JlW2ldID0gY250OworICAgICAgICBuY29yZXNfd2l0aF94X3Byb2NzW2NudF0rKzsKKyAgICAgIH0KKworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gbnRoX3Blcl9jb3JlOyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQgaiA9IGk7IGogPD0gbnRoX3Blcl9jb3JlOyBqKyspIHsKKyAgICAgICAgICBuY29yZXNfd2l0aF94X3RvX21heF9wcm9jc1tpXSArPSBuY29yZXNfd2l0aF94X3Byb2NzW2pdOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIE1heCBudW1iZXIgb2YgcHJvY2Vzc29ycworICAgICAgaW50IG5wcm9jID0gbnRoX3Blcl9jb3JlICogbmNvcmVzOworICAgICAgLy8gQW4gYXJyYXkgdG8ga2VlcCBudW1iZXIgb2YgdGhyZWFkcyBwZXIgZWFjaCBjb250ZXh0CisgICAgICBpbnQgKm5ld2FyciA9IChpbnQgKilfX2ttcF9hbGxvY2F0ZShzaXplb2YoaW50KSAqIG5wcm9jKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnByb2M7IGkrKykgeworICAgICAgICBuZXdhcnJbaV0gPSAwOworICAgICAgfQorCisgICAgICBpbnQgbnRoID0gbnRocmVhZHM7CisgICAgICBpbnQgZmxhZyA9IDA7CisgICAgICB3aGlsZSAobnRoID4gMCkgeworICAgICAgICBmb3IgKGludCBqID0gMTsgaiA8PSBudGhfcGVyX2NvcmU7IGorKykgeworICAgICAgICAgIGludCBjbnQgPSBuY29yZXNfd2l0aF94X3RvX21heF9wcm9jc1tqXTsKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5jb3JlczsgaSsrKSB7CisgICAgICAgICAgICAvLyBTa2lwIHRoZSBjb3JlIHdpdGggMCBwcm9jZXNzb3JzCisgICAgICAgICAgICBpZiAobnByb2NfYXRfY29yZVtpXSA9PSAwKSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBudGhfcGVyX2NvcmU7IGsrKykgeworICAgICAgICAgICAgICBpZiAocHJvY2FycltpICogbnRoX3Blcl9jb3JlICsga10gIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBpZiAobmV3YXJyW2kgKiBudGhfcGVyX2NvcmUgKyBrXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICBuZXdhcnJbaSAqIG50aF9wZXJfY29yZSArIGtdID0gMTsKKyAgICAgICAgICAgICAgICAgIGNudC0tOworICAgICAgICAgICAgICAgICAgbnRoLS07CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgaWYgKGZsYWcgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBuZXdhcnJbaSAqIG50aF9wZXJfY29yZSArIGtdKys7CisgICAgICAgICAgICAgICAgICAgIGNudC0tOworICAgICAgICAgICAgICAgICAgICBudGgtLTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY250ID09IDAgfHwgbnRoID09IDApIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChudGggPT0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZsYWcgPSAxOworICAgICAgfQorICAgICAgaW50IHN1bSA9IDA7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5wcm9jOyBpKyspIHsKKyAgICAgICAgc3VtICs9IG5ld2FycltpXTsKKyAgICAgICAgaWYgKHN1bSA+IHRpZCkgeworICAgICAgICAgIGlmIChmaW5lX2dyYW4pIHsKKyAgICAgICAgICAgIGludCBvc0lEID0gcHJvY2FycltpXTsKKyAgICAgICAgICAgIEtNUF9DUFVfU0VUKG9zSUQsIG1hc2spOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgY29yZUlEID0gaSAvIG50aF9wZXJfY29yZTsKKyAgICAgICAgICAgIGZvciAoaW50IGlpID0gMDsgaWkgPCBudGhfcGVyX2NvcmU7IGlpKyspIHsKKyAgICAgICAgICAgICAgaW50IG9zSUQgPSBwcm9jYXJyW2NvcmVJRCAqIG50aF9wZXJfY29yZSArIGlpXTsKKyAgICAgICAgICAgICAgaWYgKG9zSUQgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBLTVBfQ1BVX1NFVChvc0lELCBtYXNrKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgX19rbXBfZnJlZShuZXdhcnIpOworICAgIH0KKworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgbWFzayk7CisgICAgICBLTVBfSU5GT1JNKEJvdW5kVG9PU1Byb2NTZXQsICJLTVBfQUZGSU5JVFkiLCAoa21wX2ludDMyKWdldHBpZCgpLAorICAgICAgICAgICAgICAgICBfX2ttcF9nZXR0aWQoKSwgdGlkLCBidWYpOworICAgIH0KKyAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KG1hc2ssIFRSVUUpOworICAgIEtNUF9DUFVfRlJFRV9GUk9NX1NUQUNLKG1hc2spOworICB9Cit9CisKKyNpZiBLTVBfT1NfTElOVVgKKy8vIFdlIGRvbid0IG5lZWQgdGhpcyBlbnRyeSBmb3IgV2luZG93cyBiZWNhdXNlCisvLyB0aGVyZSBpcyBHZXRQcm9jZXNzQWZmaW5pdHlNYXNrKCkgYXBpCisvLworLy8gVGhlIGludGVuZGVkIHVzYWdlIGlzIGluZGljYXRlZCBieSB0aGVzZSBzdGVwczoKKy8vIDEpIFRoZSB1c2VyIGdldHMgdGhlIGN1cnJlbnQgYWZmaW5pdHkgbWFzaworLy8gMikgVGhlbiBzZXRzIHRoZSBhZmZpbml0eSBieSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KKy8vIDMpIEVycm9yIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUKKy8vIDQpIFVzZSBub24tT3Blbk1QIHBhcmFsbGVsaXphdGlvbgorLy8gNSkgUmVzZXQgdGhlIGFmZmluaXR5IHRvIHdoYXQgd2FzIHN0b3JlZCBpbiBzdGVwIDEpCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorICAgIGludAorICAgIGttcF9zZXRfdGhyZWFkX2FmZmluaXR5X21hc2tfaW5pdGlhbCgpCisvLyB0aGUgZnVuY3Rpb24gcmV0dXJucyAwIG9uIHN1Y2Nlc3MsCisvLyAgIC0xIGlmIHdlIGNhbm5vdCBiaW5kIHRocmVhZAorLy8gICA+MCAoZXJybm8pIGlmIGFuIGVycm9yIGhhcHBlbmVkIGR1cmluZyBiaW5kaW5nCit7CisgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgaWYgKGd0aWQgPCAwKSB7CisgICAgLy8gRG8gbm90IHRvdWNoIG5vbi1vbXAgdGhyZWFkcworICAgIEtBX1RSQUNFKDMwLCAoImttcF9zZXRfdGhyZWFkX2FmZmluaXR5X21hc2tfaW5pdGlhbDogIgorICAgICAgICAgICAgICAgICAgIm5vbi1vbXAgdGhyZWFkLCByZXR1cm5pbmdcbiIpKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYgKCFLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpIHx8ICFfX2ttcF9pbml0X21pZGRsZSkgeworICAgIEtBX1RSQUNFKDMwLCAoImttcF9zZXRfdGhyZWFkX2FmZmluaXR5X21hc2tfaW5pdGlhbDogIgorICAgICAgICAgICAgICAgICAgImFmZmluaXR5IG5vdCBpbml0aWFsaXplZCwgcmV0dXJuaW5nXG4iKSk7CisgICAgcmV0dXJuIC0xOworICB9CisgIEtBX1RSQUNFKDMwLCAoImttcF9zZXRfdGhyZWFkX2FmZmluaXR5X21hc2tfaW5pdGlhbDogIgorICAgICAgICAgICAgICAgICJzZXQgZnVsbCBtYXNrIGZvciB0aHJlYWQgJWRcbiIsCisgICAgICAgICAgICAgICAgZ3RpZCkpOworICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2FmZmluX2Z1bGxNYXNrICE9IE5VTEwpOworICByZXR1cm4gX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eShfX2ttcF9hZmZpbl9mdWxsTWFzaywgRkFMU0UpOworfQorI2VuZGlmCisKKyNlbmRpZiAvLyBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfYWZmaW5pdHkuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9hZmZpbml0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MDQ1NzMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfYWZmaW5pdHkuaApAQCAtMCwwICsxLDgzOSBAQAorLyoKKyAqIGttcF9hZmZpbml0eS5oIC0tIGhlYWRlciBmb3IgYWZmaW5pdHkgbWFuYWdlbWVudAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9BRkZJTklUWV9ICisjZGVmaW5lIEtNUF9BRkZJTklUWV9ICisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfb3MuaCIKKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyNpZiBLTVBfVVNFX0hXTE9DCitjbGFzcyBLTVBId2xvY0FmZmluaXR5IDogcHVibGljIEtNUEFmZmluaXR5IHsKK3B1YmxpYzoKKyAgY2xhc3MgTWFzayA6IHB1YmxpYyBLTVBBZmZpbml0eTo6TWFzayB7CisgICAgaHdsb2NfY3B1c2V0X3QgbWFzazsKKworICBwdWJsaWM6CisgICAgTWFzaygpIHsKKyAgICAgIG1hc2sgPSBod2xvY19iaXRtYXBfYWxsb2MoKTsKKyAgICAgIHRoaXMtPnplcm8oKTsKKyAgICB9CisgICAgfk1hc2soKSB7IGh3bG9jX2JpdG1hcF9mcmVlKG1hc2spOyB9CisgICAgdm9pZCBzZXQoaW50IGkpIG92ZXJyaWRlIHsgaHdsb2NfYml0bWFwX3NldChtYXNrLCBpKTsgfQorICAgIGJvb2wgaXNfc2V0KGludCBpKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBod2xvY19iaXRtYXBfaXNzZXQobWFzaywgaSk7IH0KKyAgICB2b2lkIGNsZWFyKGludCBpKSBvdmVycmlkZSB7IGh3bG9jX2JpdG1hcF9jbHIobWFzaywgaSk7IH0KKyAgICB2b2lkIHplcm8oKSBvdmVycmlkZSB7IGh3bG9jX2JpdG1hcF96ZXJvKG1hc2spOyB9CisgICAgdm9pZCBjb3B5KGNvbnN0IEtNUEFmZmluaXR5OjpNYXNrICpzcmMpIG92ZXJyaWRlIHsKKyAgICAgIGNvbnN0IE1hc2sgKmNvbnZlcnQgPSBzdGF0aWNfY2FzdDxjb25zdCBNYXNrICo+KHNyYyk7CisgICAgICBod2xvY19iaXRtYXBfY29weShtYXNrLCBjb252ZXJ0LT5tYXNrKTsKKyAgICB9CisgICAgdm9pZCBiaXR3aXNlX2FuZChjb25zdCBLTVBBZmZpbml0eTo6TWFzayAqcmhzKSBvdmVycmlkZSB7CisgICAgICBjb25zdCBNYXNrICpjb252ZXJ0ID0gc3RhdGljX2Nhc3Q8Y29uc3QgTWFzayAqPihyaHMpOworICAgICAgaHdsb2NfYml0bWFwX2FuZChtYXNrLCBtYXNrLCBjb252ZXJ0LT5tYXNrKTsKKyAgICB9CisgICAgdm9pZCBiaXR3aXNlX29yKGNvbnN0IEtNUEFmZmluaXR5OjpNYXNrICpyaHMpIG92ZXJyaWRlIHsKKyAgICAgIGNvbnN0IE1hc2sgKmNvbnZlcnQgPSBzdGF0aWNfY2FzdDxjb25zdCBNYXNrICo+KHJocyk7CisgICAgICBod2xvY19iaXRtYXBfb3IobWFzaywgbWFzaywgY29udmVydC0+bWFzayk7CisgICAgfQorICAgIHZvaWQgYml0d2lzZV9ub3QoKSBvdmVycmlkZSB7IGh3bG9jX2JpdG1hcF9ub3QobWFzaywgbWFzayk7IH0KKyAgICBpbnQgYmVnaW4oKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBod2xvY19iaXRtYXBfZmlyc3QobWFzayk7IH0KKyAgICBpbnQgZW5kKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gLTE7IH0KKyAgICBpbnQgbmV4dChpbnQgcHJldmlvdXMpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiBod2xvY19iaXRtYXBfbmV4dChtYXNrLCBwcmV2aW91cyk7CisgICAgfQorICAgIGludCBnZXRfc3lzdGVtX2FmZmluaXR5KGJvb2wgYWJvcnRfb25fZXJyb3IpIG92ZXJyaWRlIHsKKyAgICAgIEtNUF9BU1NFUlQyKEtNUF9BRkZJTklUWV9DQVBBQkxFKCksCisgICAgICAgICAgICAgICAgICAiSWxsZWdhbCBnZXQgYWZmaW5pdHkgb3BlcmF0aW9uIHdoZW4gbm90IGNhcGFibGUiKTsKKyAgICAgIGludCByZXR2YWwgPQorICAgICAgICAgIGh3bG9jX2dldF9jcHViaW5kKF9fa21wX2h3bG9jX3RvcG9sb2d5LCBtYXNrLCBIV0xPQ19DUFVCSU5EX1RIUkVBRCk7CisgICAgICBpZiAocmV0dmFsID49IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICAgIGlmIChhYm9ydF9vbl9lcnJvcikgeworICAgICAgICBfX2ttcF9tc2coa21wX21zX2ZhdGFsLCBLTVBfTVNHKEZhdGFsU3lzRXJyb3IpLCBLTVBfRVJSKGVycm9yKSwKKyAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBlcnJvcjsKKyAgICB9CisgICAgaW50IHNldF9zeXN0ZW1fYWZmaW5pdHkoYm9vbCBhYm9ydF9vbl9lcnJvcikgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgS01QX0FTU0VSVDIoS01QX0FGRklOSVRZX0NBUEFCTEUoKSwKKyAgICAgICAgICAgICAgICAgICJJbGxlZ2FsIGdldCBhZmZpbml0eSBvcGVyYXRpb24gd2hlbiBub3QgY2FwYWJsZSIpOworICAgICAgaW50IHJldHZhbCA9CisgICAgICAgICAgaHdsb2Nfc2V0X2NwdWJpbmQoX19rbXBfaHdsb2NfdG9wb2xvZ3ksIG1hc2ssIEhXTE9DX0NQVUJJTkRfVEhSRUFEKTsKKyAgICAgIGlmIChyZXR2YWwgPj0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGludCBlcnJvciA9IGVycm5vOworICAgICAgaWYgKGFib3J0X29uX2Vycm9yKSB7CisgICAgICAgIF9fa21wX21zZyhrbXBfbXNfZmF0YWwsIEtNUF9NU0coRmF0YWxTeXNFcnJvciksIEtNUF9FUlIoZXJyb3IpLAorICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwpOworICAgICAgfQorICAgICAgcmV0dXJuIGVycm9yOworICAgIH0KKyAgICBpbnQgZ2V0X3Byb2NfZ3JvdXAoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICBpbnQgaTsKKyAgICAgIGludCBncm91cCA9IC0xOworI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICBpZiAoX19rbXBfbnVtX3Byb2NfZ3JvdXBzID09IDEpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICBmb3IgKGkgPSAwOyBpIDwgX19rbXBfbnVtX3Byb2NfZ3JvdXBzOyBpKyspIHsKKyAgICAgICAgLy8gT24gd2luZG93cywgdGhlIGxvbmcgdHlwZSBpcyBhbHdheXMgMzIgYml0cworICAgICAgICB1bnNpZ25lZCBsb25nIGZpcnN0XzMyX2JpdHMgPSBod2xvY19iaXRtYXBfdG9faXRoX3Vsb25nKG1hc2ssIGkgKiAyKTsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBzZWNvbmRfMzJfYml0cyA9CisgICAgICAgICAgICBod2xvY19iaXRtYXBfdG9faXRoX3Vsb25nKG1hc2ssIGkgKiAyICsgMSk7CisgICAgICAgIGlmIChmaXJzdF8zMl9iaXRzID09IDAgJiYgc2Vjb25kXzMyX2JpdHMgPT0gMCkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChncm91cCA+PSAwKSB7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGdyb3VwID0gaTsKKyAgICAgIH0KKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworICAgICAgcmV0dXJuIGdyb3VwOworICAgIH0KKyAgfTsKKyAgdm9pZCBkZXRlcm1pbmVfY2FwYWJsZShjb25zdCBjaGFyICp2YXIpIG92ZXJyaWRlIHsKKyAgICBjb25zdCBod2xvY190b3BvbG9neV9zdXBwb3J0ICp0b3BvbG9neV9zdXBwb3J0OworICAgIGlmIChfX2ttcF9od2xvY190b3BvbG9neSA9PSBOVUxMKSB7CisgICAgICBpZiAoaHdsb2NfdG9wb2xvZ3lfaW5pdCgmX19rbXBfaHdsb2NfdG9wb2xvZ3kpIDwgMCkgeworICAgICAgICBfX2ttcF9od2xvY19lcnJvciA9IFRSVUU7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKQorICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZkh3bG9jRXJyb3JPY2N1cnJlZCwgdmFyLCAiaHdsb2NfdG9wb2xvZ3lfaW5pdCgpIik7CisgICAgICB9CisgICAgICBpZiAoaHdsb2NfdG9wb2xvZ3lfbG9hZChfX2ttcF9od2xvY190b3BvbG9neSkgPCAwKSB7CisgICAgICAgIF9fa21wX2h3bG9jX2Vycm9yID0gVFJVRTsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpCisgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSHdsb2NFcnJvck9jY3VycmVkLCB2YXIsICJod2xvY190b3BvbG9neV9sb2FkKCkiKTsKKyAgICAgIH0KKyAgICB9CisgICAgdG9wb2xvZ3lfc3VwcG9ydCA9IGh3bG9jX3RvcG9sb2d5X2dldF9zdXBwb3J0KF9fa21wX2h3bG9jX3RvcG9sb2d5KTsKKyAgICAvLyBJcyB0aGUgc3lzdGVtIGNhcGFibGUgb2Ygc2V0dGluZy9nZXR0aW5nIHRoaXMgdGhyZWFkJ3MgYWZmaW5pdHk/CisgICAgLy8gQWxzbywgaXMgdG9wb2xvZ3kgZGlzY292ZXJ5IHBvc3NpYmxlPyAocHUgaW5kaWNhdGVzIGFiaWxpdHkgdG8gZGlzY292ZXIKKyAgICAvLyBwcm9jZXNzaW5nIHVuaXRzKS4gQW5kIGZpbmFsbHksIHdlcmUgdGhlcmUgbm8gZXJyb3JzIHdoZW4gY2FsbGluZyBhbnkKKyAgICAvLyBod2xvY18qIEFQSSBmdW5jdGlvbnM/CisgICAgaWYgKHRvcG9sb2d5X3N1cHBvcnQgJiYgdG9wb2xvZ3lfc3VwcG9ydC0+Y3B1YmluZC0+c2V0X3RoaXN0aHJlYWRfY3B1YmluZCAmJgorICAgICAgICB0b3BvbG9neV9zdXBwb3J0LT5jcHViaW5kLT5nZXRfdGhpc3RocmVhZF9jcHViaW5kICYmCisgICAgICAgIHRvcG9sb2d5X3N1cHBvcnQtPmRpc2NvdmVyeS0+cHUgJiYgIV9fa21wX2h3bG9jX2Vycm9yKSB7CisgICAgICAvLyBlbmFibGVzIGFmZmluaXR5IGFjY29yZGluZyB0byBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpIG1hY3JvCisgICAgICBLTVBfQUZGSU5JVFlfRU5BQkxFKFRSVUUpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBpbmRpY2F0ZSB0aGF0IGh3bG9jIGRpZG4ndCB3b3JrIGFuZCBkaXNhYmxlIGFmZmluaXR5CisgICAgICBfX2ttcF9od2xvY19lcnJvciA9IFRSVUU7CisgICAgICBLTVBfQUZGSU5JVFlfRElTQUJMRSgpOworICAgIH0KKyAgfQorICB2b2lkIGJpbmRfdGhyZWFkKGludCB3aGljaCkgb3ZlcnJpZGUgeworICAgIEtNUF9BU1NFUlQyKEtNUF9BRkZJTklUWV9DQVBBQkxFKCksCisgICAgICAgICAgICAgICAgIklsbGVnYWwgc2V0IGFmZmluaXR5IG9wZXJhdGlvbiB3aGVuIG5vdCBjYXBhYmxlIik7CisgICAgS01QQWZmaW5pdHk6Ok1hc2sgKm1hc2s7CisgICAgS01QX0NQVV9BTExPQ19PTl9TVEFDSyhtYXNrKTsKKyAgICBLTVBfQ1BVX1pFUk8obWFzayk7CisgICAgS01QX0NQVV9TRVQod2hpY2gsIG1hc2spOworICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkobWFzaywgVFJVRSk7CisgICAgS01QX0NQVV9GUkVFX0ZST01fU1RBQ0sobWFzayk7CisgIH0KKyAgS01QQWZmaW5pdHk6Ok1hc2sgKmFsbG9jYXRlX21hc2soKSBvdmVycmlkZSB7IHJldHVybiBuZXcgTWFzaygpOyB9CisgIHZvaWQgZGVhbGxvY2F0ZV9tYXNrKEtNUEFmZmluaXR5OjpNYXNrICptKSBvdmVycmlkZSB7IGRlbGV0ZSBtOyB9CisgIEtNUEFmZmluaXR5OjpNYXNrICphbGxvY2F0ZV9tYXNrX2FycmF5KGludCBudW0pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gbmV3IE1hc2tbbnVtXTsKKyAgfQorICB2b2lkIGRlYWxsb2NhdGVfbWFza19hcnJheShLTVBBZmZpbml0eTo6TWFzayAqYXJyYXkpIG92ZXJyaWRlIHsKKyAgICBNYXNrICpod2xvY19hcnJheSA9IHN0YXRpY19jYXN0PE1hc2sgKj4oYXJyYXkpOworICAgIGRlbGV0ZVtdIGh3bG9jX2FycmF5OworICB9CisgIEtNUEFmZmluaXR5OjpNYXNrICppbmRleF9tYXNrX2FycmF5KEtNUEFmZmluaXR5OjpNYXNrICphcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBvdmVycmlkZSB7CisgICAgTWFzayAqaHdsb2NfYXJyYXkgPSBzdGF0aWNfY2FzdDxNYXNrICo+KGFycmF5KTsKKyAgICByZXR1cm4gJihod2xvY19hcnJheVtpbmRleF0pOworICB9CisgIGFwaV90eXBlIGdldF9hcGlfdHlwZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIEhXTE9DOyB9Cit9OworI2VuZGlmIC8qIEtNUF9VU0VfSFdMT0MgKi8KKworI2lmIEtNUF9PU19MSU5VWAorLyogT24gc29tZSBvZiB0aGUgb2xkZXIgT1MncyB0aGF0IHdlIGJ1aWxkIG9uLCB0aGVzZSBjb25zdGFudHMgYXJlbid0IHByZXNlbnQKKyAgIGluIDxhc20vdW5pc3RkLmg+ICNpbmNsdWRlZCBmcm9tIDxzeXMuc3lzY2FsbC5oPi4gVGhleSBtdXN0IGJlIHRoZSBzYW1lIG9uCisgICBhbGwgc3lzdGVtcyBvZiB0aGUgc2FtZSBhcmNoIHdoZXJlIHRoZXkgYXJlIGRlZmluZWQsIGFuZCB0aGV5IGNhbm5vdCBjaGFuZ2UuCisgICBzdG9uZSBmb3JldmVyLiAqLworI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX0FSTQorI2lmbmRlZiBfX05SX3NjaGVkX3NldGFmZmluaXR5CisjZGVmaW5lIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgMjQxCisjZWxpZiBfX05SX3NjaGVkX3NldGFmZmluaXR5ICE9IDI0MQorI2Vycm9yIFdyb25nIGNvZGUgZm9yIHNldGFmZmluaXR5IHN5c3RlbSBjYWxsLgorI2VuZGlmIC8qIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgKi8KKyNpZm5kZWYgX19OUl9zY2hlZF9nZXRhZmZpbml0eQorI2RlZmluZSBfX05SX3NjaGVkX2dldGFmZmluaXR5IDI0MgorI2VsaWYgX19OUl9zY2hlZF9nZXRhZmZpbml0eSAhPSAyNDIKKyNlcnJvciBXcm9uZyBjb2RlIGZvciBnZXRhZmZpbml0eSBzeXN0ZW0gY2FsbC4KKyNlbmRpZiAvKiBfX05SX3NjaGVkX2dldGFmZmluaXR5ICovCisjZWxpZiBLTVBfQVJDSF9BQVJDSDY0CisjaWZuZGVmIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkKKyNkZWZpbmUgX19OUl9zY2hlZF9zZXRhZmZpbml0eSAxMjIKKyNlbGlmIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgIT0gMTIyCisjZXJyb3IgV3JvbmcgY29kZSBmb3Igc2V0YWZmaW5pdHkgc3lzdGVtIGNhbGwuCisjZW5kaWYgLyogX19OUl9zY2hlZF9zZXRhZmZpbml0eSAqLworI2lmbmRlZiBfX05SX3NjaGVkX2dldGFmZmluaXR5CisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgMTIzCisjZWxpZiBfX05SX3NjaGVkX2dldGFmZmluaXR5ICE9IDEyMworI2Vycm9yIFdyb25nIGNvZGUgZm9yIGdldGFmZmluaXR5IHN5c3RlbSBjYWxsLgorI2VuZGlmIC8qIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgKi8KKyNlbGlmIEtNUF9BUkNIX1g4Nl82NAorI2lmbmRlZiBfX05SX3NjaGVkX3NldGFmZmluaXR5CisjZGVmaW5lIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgMjAzCisjZWxpZiBfX05SX3NjaGVkX3NldGFmZmluaXR5ICE9IDIwMworI2Vycm9yIFdyb25nIGNvZGUgZm9yIHNldGFmZmluaXR5IHN5c3RlbSBjYWxsLgorI2VuZGlmIC8qIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgKi8KKyNpZm5kZWYgX19OUl9zY2hlZF9nZXRhZmZpbml0eQorI2RlZmluZSBfX05SX3NjaGVkX2dldGFmZmluaXR5IDIwNAorI2VsaWYgX19OUl9zY2hlZF9nZXRhZmZpbml0eSAhPSAyMDQKKyNlcnJvciBXcm9uZyBjb2RlIGZvciBnZXRhZmZpbml0eSBzeXN0ZW0gY2FsbC4KKyNlbmRpZiAvKiBfX05SX3NjaGVkX2dldGFmZmluaXR5ICovCisjZWxpZiBLTVBfQVJDSF9QUEM2NAorI2lmbmRlZiBfX05SX3NjaGVkX3NldGFmZmluaXR5CisjZGVmaW5lIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgMjIyCisjZWxpZiBfX05SX3NjaGVkX3NldGFmZmluaXR5ICE9IDIyMgorI2Vycm9yIFdyb25nIGNvZGUgZm9yIHNldGFmZmluaXR5IHN5c3RlbSBjYWxsLgorI2VuZGlmIC8qIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgKi8KKyNpZm5kZWYgX19OUl9zY2hlZF9nZXRhZmZpbml0eQorI2RlZmluZSBfX05SX3NjaGVkX2dldGFmZmluaXR5IDIyMworI2VsaWYgX19OUl9zY2hlZF9nZXRhZmZpbml0eSAhPSAyMjMKKyNlcnJvciBXcm9uZyBjb2RlIGZvciBnZXRhZmZpbml0eSBzeXN0ZW0gY2FsbC4KKyNlbmRpZiAvKiBfX05SX3NjaGVkX2dldGFmZmluaXR5ICovCisjZWxpZiBLTVBfQVJDSF9NSVBTCisjaWZuZGVmIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkKKyNkZWZpbmUgX19OUl9zY2hlZF9zZXRhZmZpbml0eSA0MjM5CisjZWxpZiBfX05SX3NjaGVkX3NldGFmZmluaXR5ICE9IDQyMzkKKyNlcnJvciBXcm9uZyBjb2RlIGZvciBzZXRhZmZpbml0eSBzeXN0ZW0gY2FsbC4KKyNlbmRpZiAvKiBfX05SX3NjaGVkX3NldGFmZmluaXR5ICovCisjaWZuZGVmIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkKKyNkZWZpbmUgX19OUl9zY2hlZF9nZXRhZmZpbml0eSA0MjQwCisjZWxpZiBfX05SX3NjaGVkX2dldGFmZmluaXR5ICE9IDQyNDAKKyNlcnJvciBXcm9uZyBjb2RlIGZvciBnZXRhZmZpbml0eSBzeXN0ZW0gY2FsbC4KKyNlbmRpZiAvKiBfX05SX3NjaGVkX2dldGFmZmluaXR5ICovCisjZWxpZiBLTVBfQVJDSF9NSVBTNjQKKyNpZm5kZWYgX19OUl9zY2hlZF9zZXRhZmZpbml0eQorI2RlZmluZSBfX05SX3NjaGVkX3NldGFmZmluaXR5IDUxOTUKKyNlbGlmIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgIT0gNTE5NQorI2Vycm9yIFdyb25nIGNvZGUgZm9yIHNldGFmZmluaXR5IHN5c3RlbSBjYWxsLgorI2VuZGlmIC8qIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgKi8KKyNpZm5kZWYgX19OUl9zY2hlZF9nZXRhZmZpbml0eQorI2RlZmluZSBfX05SX3NjaGVkX2dldGFmZmluaXR5IDUxOTYKKyNlbGlmIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgIT0gNTE5NgorI2Vycm9yIFdyb25nIGNvZGUgZm9yIGdldGFmZmluaXR5IHN5c3RlbSBjYWxsLgorI2VuZGlmIC8qIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgKi8KKyNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZQorI2VuZGlmIC8qIEtNUF9BUkNIXyogKi8KK2NsYXNzIEtNUE5hdGl2ZUFmZmluaXR5IDogcHVibGljIEtNUEFmZmluaXR5IHsKKyAgY2xhc3MgTWFzayA6IHB1YmxpYyBLTVBBZmZpbml0eTo6TWFzayB7CisgICAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyIG1hc2tfdDsKKyAgICBzdGF0aWMgY29uc3QgaW50IEJJVFNfUEVSX01BU0tfVCA9IHNpemVvZihtYXNrX3QpICogQ0hBUl9CSVQ7CisKKyAgcHVibGljOgorICAgIG1hc2tfdCAqbWFzazsKKyAgICBNYXNrKCkgeyBtYXNrID0gKG1hc2tfdCAqKV9fa21wX2FsbG9jYXRlKF9fa21wX2FmZmluX21hc2tfc2l6ZSk7IH0KKyAgICB+TWFzaygpIHsKKyAgICAgIGlmIChtYXNrKQorICAgICAgICBfX2ttcF9mcmVlKG1hc2spOworICAgIH0KKyAgICB2b2lkIHNldChpbnQgaSkgb3ZlcnJpZGUgeworICAgICAgbWFza1tpIC8gQklUU19QRVJfTUFTS19UXSB8PSAoKG1hc2tfdCkxIDw8IChpICUgQklUU19QRVJfTUFTS19UKSk7CisgICAgfQorICAgIGJvb2wgaXNfc2V0KGludCBpKSBjb25zdCBvdmVycmlkZSB7CisgICAgICByZXR1cm4gKG1hc2tbaSAvIEJJVFNfUEVSX01BU0tfVF0gJiAoKG1hc2tfdCkxIDw8IChpICUgQklUU19QRVJfTUFTS19UKSkpOworICAgIH0KKyAgICB2b2lkIGNsZWFyKGludCBpKSBvdmVycmlkZSB7CisgICAgICBtYXNrW2kgLyBCSVRTX1BFUl9NQVNLX1RdICY9IH4oKG1hc2tfdCkxIDw8IChpICUgQklUU19QRVJfTUFTS19UKSk7CisgICAgfQorICAgIHZvaWQgemVybygpIG92ZXJyaWRlIHsKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgX19rbXBfYWZmaW5fbWFza19zaXplOyArK2kpCisgICAgICAgIG1hc2tbaV0gPSAwOworICAgIH0KKyAgICB2b2lkIGNvcHkoY29uc3QgS01QQWZmaW5pdHk6Ok1hc2sgKnNyYykgb3ZlcnJpZGUgeworICAgICAgY29uc3QgTWFzayAqY29udmVydCA9IHN0YXRpY19jYXN0PGNvbnN0IE1hc2sgKj4oc3JjKTsKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgX19rbXBfYWZmaW5fbWFza19zaXplOyArK2kpCisgICAgICAgIG1hc2tbaV0gPSBjb252ZXJ0LT5tYXNrW2ldOworICAgIH0KKyAgICB2b2lkIGJpdHdpc2VfYW5kKGNvbnN0IEtNUEFmZmluaXR5OjpNYXNrICpyaHMpIG92ZXJyaWRlIHsKKyAgICAgIGNvbnN0IE1hc2sgKmNvbnZlcnQgPSBzdGF0aWNfY2FzdDxjb25zdCBNYXNrICo+KHJocyk7CisgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IF9fa21wX2FmZmluX21hc2tfc2l6ZTsgKytpKQorICAgICAgICBtYXNrW2ldICY9IGNvbnZlcnQtPm1hc2tbaV07CisgICAgfQorICAgIHZvaWQgYml0d2lzZV9vcihjb25zdCBLTVBBZmZpbml0eTo6TWFzayAqcmhzKSBvdmVycmlkZSB7CisgICAgICBjb25zdCBNYXNrICpjb252ZXJ0ID0gc3RhdGljX2Nhc3Q8Y29uc3QgTWFzayAqPihyaHMpOworICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBfX2ttcF9hZmZpbl9tYXNrX3NpemU7ICsraSkKKyAgICAgICAgbWFza1tpXSB8PSBjb252ZXJ0LT5tYXNrW2ldOworICAgIH0KKyAgICB2b2lkIGJpdHdpc2Vfbm90KCkgb3ZlcnJpZGUgeworICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBfX2ttcF9hZmZpbl9tYXNrX3NpemU7ICsraSkKKyAgICAgICAgbWFza1tpXSA9IH4obWFza1tpXSk7CisgICAgfQorICAgIGludCBiZWdpbigpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgIGludCByZXR2YWwgPSAwOworICAgICAgd2hpbGUgKHJldHZhbCA8IGVuZCgpICYmICFpc19zZXQocmV0dmFsKSkKKyAgICAgICAgKytyZXR2YWw7CisgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKyAgICBpbnQgZW5kKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gX19rbXBfYWZmaW5fbWFza19zaXplICogQklUU19QRVJfTUFTS19UOyB9CisgICAgaW50IG5leHQoaW50IHByZXZpb3VzKSBjb25zdCBvdmVycmlkZSB7CisgICAgICBpbnQgcmV0dmFsID0gcHJldmlvdXMgKyAxOworICAgICAgd2hpbGUgKHJldHZhbCA8IGVuZCgpICYmICFpc19zZXQocmV0dmFsKSkKKyAgICAgICAgKytyZXR2YWw7CisgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKyAgICBpbnQgZ2V0X3N5c3RlbV9hZmZpbml0eShib29sIGFib3J0X29uX2Vycm9yKSBvdmVycmlkZSB7CisgICAgICBLTVBfQVNTRVJUMihLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpLAorICAgICAgICAgICAgICAgICAgIklsbGVnYWwgZ2V0IGFmZmluaXR5IG9wZXJhdGlvbiB3aGVuIG5vdCBjYXBhYmxlIik7CisgICAgICBpbnQgcmV0dmFsID0KKyAgICAgICAgICBzeXNjYWxsKF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHksIDAsIF9fa21wX2FmZmluX21hc2tfc2l6ZSwgbWFzayk7CisgICAgICBpZiAocmV0dmFsID49IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICAgIGlmIChhYm9ydF9vbl9lcnJvcikgeworICAgICAgICBfX2ttcF9tc2coa21wX21zX2ZhdGFsLCBLTVBfTVNHKEZhdGFsU3lzRXJyb3IpLCBLTVBfRVJSKGVycm9yKSwKKyAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBlcnJvcjsKKyAgICB9CisgICAgaW50IHNldF9zeXN0ZW1fYWZmaW5pdHkoYm9vbCBhYm9ydF9vbl9lcnJvcikgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgS01QX0FTU0VSVDIoS01QX0FGRklOSVRZX0NBUEFCTEUoKSwKKyAgICAgICAgICAgICAgICAgICJJbGxlZ2FsIGdldCBhZmZpbml0eSBvcGVyYXRpb24gd2hlbiBub3QgY2FwYWJsZSIpOworICAgICAgaW50IHJldHZhbCA9CisgICAgICAgICAgc3lzY2FsbChfX05SX3NjaGVkX3NldGFmZmluaXR5LCAwLCBfX2ttcF9hZmZpbl9tYXNrX3NpemUsIG1hc2spOworICAgICAgaWYgKHJldHZhbCA+PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgaW50IGVycm9yID0gZXJybm87CisgICAgICBpZiAoYWJvcnRfb25fZXJyb3IpIHsKKyAgICAgICAgX19rbXBfbXNnKGttcF9tc19mYXRhbCwgS01QX01TRyhGYXRhbFN5c0Vycm9yKSwgS01QX0VSUihlcnJvciksCisgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCk7CisgICAgICB9CisgICAgICByZXR1cm4gZXJyb3I7CisgICAgfQorICB9OworICB2b2lkIGRldGVybWluZV9jYXBhYmxlKGNvbnN0IGNoYXIgKmVudl92YXIpIG92ZXJyaWRlIHsKKyAgICBfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZShlbnZfdmFyKTsKKyAgfQorICB2b2lkIGJpbmRfdGhyZWFkKGludCB3aGljaCkgb3ZlcnJpZGUgeyBfX2ttcF9hZmZpbml0eV9iaW5kX3RocmVhZCh3aGljaCk7IH0KKyAgS01QQWZmaW5pdHk6Ok1hc2sgKmFsbG9jYXRlX21hc2soKSBvdmVycmlkZSB7CisgICAgS01QTmF0aXZlQWZmaW5pdHk6Ok1hc2sgKnJldHZhbCA9IG5ldyBNYXNrKCk7CisgICAgcmV0dXJuIHJldHZhbDsKKyAgfQorICB2b2lkIGRlYWxsb2NhdGVfbWFzayhLTVBBZmZpbml0eTo6TWFzayAqbSkgb3ZlcnJpZGUgeworICAgIEtNUE5hdGl2ZUFmZmluaXR5OjpNYXNrICpuYXRpdmVfbWFzayA9CisgICAgICAgIHN0YXRpY19jYXN0PEtNUE5hdGl2ZUFmZmluaXR5OjpNYXNrICo+KG0pOworICAgIGRlbGV0ZSBtOworICB9CisgIEtNUEFmZmluaXR5OjpNYXNrICphbGxvY2F0ZV9tYXNrX2FycmF5KGludCBudW0pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gbmV3IE1hc2tbbnVtXTsKKyAgfQorICB2b2lkIGRlYWxsb2NhdGVfbWFza19hcnJheShLTVBBZmZpbml0eTo6TWFzayAqYXJyYXkpIG92ZXJyaWRlIHsKKyAgICBNYXNrICpsaW51eF9hcnJheSA9IHN0YXRpY19jYXN0PE1hc2sgKj4oYXJyYXkpOworICAgIGRlbGV0ZVtdIGxpbnV4X2FycmF5OworICB9CisgIEtNUEFmZmluaXR5OjpNYXNrICppbmRleF9tYXNrX2FycmF5KEtNUEFmZmluaXR5OjpNYXNrICphcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBvdmVycmlkZSB7CisgICAgTWFzayAqbGludXhfYXJyYXkgPSBzdGF0aWNfY2FzdDxNYXNrICo+KGFycmF5KTsKKyAgICByZXR1cm4gJihsaW51eF9hcnJheVtpbmRleF0pOworICB9CisgIGFwaV90eXBlIGdldF9hcGlfdHlwZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIE5BVElWRV9PUzsgfQorfTsKKyNlbmRpZiAvKiBLTVBfT1NfTElOVVggKi8KKworI2lmIEtNUF9PU19XSU5ET1dTCitjbGFzcyBLTVBOYXRpdmVBZmZpbml0eSA6IHB1YmxpYyBLTVBBZmZpbml0eSB7CisgIGNsYXNzIE1hc2sgOiBwdWJsaWMgS01QQWZmaW5pdHk6Ok1hc2sgeworICAgIHR5cGVkZWYgVUxPTkdfUFRSIG1hc2tfdDsKKyAgICBzdGF0aWMgY29uc3QgaW50IEJJVFNfUEVSX01BU0tfVCA9IHNpemVvZihtYXNrX3QpICogQ0hBUl9CSVQ7CisgICAgbWFza190ICptYXNrOworCisgIHB1YmxpYzoKKyAgICBNYXNrKCkgeworICAgICAgbWFzayA9IChtYXNrX3QgKilfX2ttcF9hbGxvY2F0ZShzaXplb2YobWFza190KSAqIF9fa21wX251bV9wcm9jX2dyb3Vwcyk7CisgICAgfQorICAgIH5NYXNrKCkgeworICAgICAgaWYgKG1hc2spCisgICAgICAgIF9fa21wX2ZyZWUobWFzayk7CisgICAgfQorICAgIHZvaWQgc2V0KGludCBpKSBvdmVycmlkZSB7CisgICAgICBtYXNrW2kgLyBCSVRTX1BFUl9NQVNLX1RdIHw9ICgobWFza190KTEgPDwgKGkgJSBCSVRTX1BFUl9NQVNLX1QpKTsKKyAgICB9CisgICAgYm9vbCBpc19zZXQoaW50IGkpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiAobWFza1tpIC8gQklUU19QRVJfTUFTS19UXSAmICgobWFza190KTEgPDwgKGkgJSBCSVRTX1BFUl9NQVNLX1QpKSk7CisgICAgfQorICAgIHZvaWQgY2xlYXIoaW50IGkpIG92ZXJyaWRlIHsKKyAgICAgIG1hc2tbaSAvIEJJVFNfUEVSX01BU0tfVF0gJj0gfigobWFza190KTEgPDwgKGkgJSBCSVRTX1BFUl9NQVNLX1QpKTsKKyAgICB9CisgICAgdm9pZCB6ZXJvKCkgb3ZlcnJpZGUgeworICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBfX2ttcF9udW1fcHJvY19ncm91cHM7ICsraSkKKyAgICAgICAgbWFza1tpXSA9IDA7CisgICAgfQorICAgIHZvaWQgY29weShjb25zdCBLTVBBZmZpbml0eTo6TWFzayAqc3JjKSBvdmVycmlkZSB7CisgICAgICBjb25zdCBNYXNrICpjb252ZXJ0ID0gc3RhdGljX2Nhc3Q8Y29uc3QgTWFzayAqPihzcmMpOworICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBfX2ttcF9udW1fcHJvY19ncm91cHM7ICsraSkKKyAgICAgICAgbWFza1tpXSA9IGNvbnZlcnQtPm1hc2tbaV07CisgICAgfQorICAgIHZvaWQgYml0d2lzZV9hbmQoY29uc3QgS01QQWZmaW5pdHk6Ok1hc2sgKnJocykgb3ZlcnJpZGUgeworICAgICAgY29uc3QgTWFzayAqY29udmVydCA9IHN0YXRpY19jYXN0PGNvbnN0IE1hc2sgKj4ocmhzKTsKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgX19rbXBfbnVtX3Byb2NfZ3JvdXBzOyArK2kpCisgICAgICAgIG1hc2tbaV0gJj0gY29udmVydC0+bWFza1tpXTsKKyAgICB9CisgICAgdm9pZCBiaXR3aXNlX29yKGNvbnN0IEtNUEFmZmluaXR5OjpNYXNrICpyaHMpIG92ZXJyaWRlIHsKKyAgICAgIGNvbnN0IE1hc2sgKmNvbnZlcnQgPSBzdGF0aWNfY2FzdDxjb25zdCBNYXNrICo+KHJocyk7CisgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IF9fa21wX251bV9wcm9jX2dyb3VwczsgKytpKQorICAgICAgICBtYXNrW2ldIHw9IGNvbnZlcnQtPm1hc2tbaV07CisgICAgfQorICAgIHZvaWQgYml0d2lzZV9ub3QoKSBvdmVycmlkZSB7CisgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IF9fa21wX251bV9wcm9jX2dyb3VwczsgKytpKQorICAgICAgICBtYXNrW2ldID0gfihtYXNrW2ldKTsKKyAgICB9CisgICAgaW50IGJlZ2luKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgaW50IHJldHZhbCA9IDA7CisgICAgICB3aGlsZSAocmV0dmFsIDwgZW5kKCkgJiYgIWlzX3NldChyZXR2YWwpKQorICAgICAgICArK3JldHZhbDsKKyAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorICAgIGludCBlbmQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBfX2ttcF9udW1fcHJvY19ncm91cHMgKiBCSVRTX1BFUl9NQVNLX1Q7IH0KKyAgICBpbnQgbmV4dChpbnQgcHJldmlvdXMpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgIGludCByZXR2YWwgPSBwcmV2aW91cyArIDE7CisgICAgICB3aGlsZSAocmV0dmFsIDwgZW5kKCkgJiYgIWlzX3NldChyZXR2YWwpKQorICAgICAgICArK3JldHZhbDsKKyAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorICAgIGludCBzZXRfc3lzdGVtX2FmZmluaXR5KGJvb2wgYWJvcnRfb25fZXJyb3IpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgIGlmIChfX2ttcF9udW1fcHJvY19ncm91cHMgPiAxKSB7CisgICAgICAgIC8vIENoZWNrIGZvciBhIHZhbGlkIG1hc2suCisgICAgICAgIEdST1VQX0FGRklOSVRZIGdhOworICAgICAgICBpbnQgZ3JvdXAgPSBnZXRfcHJvY19ncm91cCgpOworICAgICAgICBpZiAoZ3JvdXAgPCAwKSB7CisgICAgICAgICAgaWYgKGFib3J0X29uX2Vycm9yKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoQWZmaW5pdHlJbnZhbGlkTWFzaywgImttcF9zZXRfYWZmaW5pdHkiKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIC8vIFRyYW5zZm9ybSB0aGUgYml0IHZlY3RvciBpbnRvIGEgR1JPVVBfQUZGSU5JVFkgc3RydWN0CisgICAgICAgIC8vIGFuZCBtYWtlIHRoZSBzeXN0ZW0gY2FsbCB0byBzZXQgYWZmaW5pdHkuCisgICAgICAgIGdhLkdyb3VwID0gZ3JvdXA7CisgICAgICAgIGdhLk1hc2sgPSBtYXNrW2dyb3VwXTsKKyAgICAgICAgZ2EuUmVzZXJ2ZWRbMF0gPSBnYS5SZXNlcnZlZFsxXSA9IGdhLlJlc2VydmVkWzJdID0gMDsKKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHkgIT0gTlVMTCk7CisgICAgICAgIGlmIChfX2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5KEdldEN1cnJlbnRUaHJlYWQoKSwgJmdhLCBOVUxMKSA9PSAwKSB7CisgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICBpZiAoYWJvcnRfb25fZXJyb3IpIHsKKyAgICAgICAgICAgIF9fa21wX21zZyhrbXBfbXNfZmF0YWwsIEtNUF9NU0coQ2FudFNldFRocmVhZEFmZk1hc2spLAorICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoZXJyb3IpLCBfX2ttcF9tc2dfbnVsbCk7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFTZXRUaHJlYWRBZmZpbml0eU1hc2soR2V0Q3VycmVudFRocmVhZCgpLCAqbWFzaykpIHsKKyAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgIGlmIChhYm9ydF9vbl9lcnJvcikgeworICAgICAgICAgICAgX19rbXBfbXNnKGttcF9tc19mYXRhbCwgS01QX01TRyhDYW50U2V0VGhyZWFkQWZmTWFzayksCisgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUihlcnJvciksIF9fa21wX21zZ19udWxsKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW50IGdldF9zeXN0ZW1fYWZmaW5pdHkoYm9vbCBhYm9ydF9vbl9lcnJvcikgb3ZlcnJpZGUgeworICAgICAgaWYgKF9fa21wX251bV9wcm9jX2dyb3VwcyA+IDEpIHsKKyAgICAgICAgdGhpcy0+emVybygpOworICAgICAgICBHUk9VUF9BRkZJTklUWSBnYTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5ICE9IE5VTEwpOworICAgICAgICBpZiAoX19rbXBfR2V0VGhyZWFkR3JvdXBBZmZpbml0eShHZXRDdXJyZW50VGhyZWFkKCksICZnYSkgPT0gMCkgeworICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgaWYgKGFib3J0X29uX2Vycm9yKSB7CisgICAgICAgICAgICBfX2ttcF9tc2coa21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coRnVuY3Rpb25FcnJvciwgIkdldFRocmVhZEdyb3VwQWZmaW5pdHkoKSIpLAorICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoZXJyb3IpLCBfX2ttcF9tc2dfbnVsbCk7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGdhLkdyb3VwIDwgMCkgfHwgKGdhLkdyb3VwID4gX19rbXBfbnVtX3Byb2NfZ3JvdXBzKSB8fAorICAgICAgICAgICAgKGdhLk1hc2sgPT0gMCkpIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgbWFza1tnYS5Hcm91cF0gPSBnYS5NYXNrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWFza190IG5ld01hc2ssIHN5c01hc2ssIHJldHZhbDsKKyAgICAgICAgaWYgKCFHZXRQcm9jZXNzQWZmaW5pdHlNYXNrKEdldEN1cnJlbnRQcm9jZXNzKCksICZuZXdNYXNrLCAmc3lzTWFzaykpIHsKKyAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgIGlmIChhYm9ydF9vbl9lcnJvcikgeworICAgICAgICAgICAgX19rbXBfbXNnKGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKEZ1bmN0aW9uRXJyb3IsICJHZXRQcm9jZXNzQWZmaW5pdHlNYXNrKCkiKSwKKyAgICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKGVycm9yKSwgX19rbXBfbXNnX251bGwpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgcmV0dmFsID0gU2V0VGhyZWFkQWZmaW5pdHlNYXNrKEdldEN1cnJlbnRUaHJlYWQoKSwgbmV3TWFzayk7CisgICAgICAgIGlmICghcmV0dmFsKSB7CisgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICBpZiAoYWJvcnRfb25fZXJyb3IpIHsKKyAgICAgICAgICAgIF9fa21wX21zZyhrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyhGdW5jdGlvbkVycm9yLCAiU2V0VGhyZWFkQWZmaW5pdHlNYXNrKCkiKSwKKyAgICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKGVycm9yKSwgX19rbXBfbXNnX251bGwpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgbmV3TWFzayA9IFNldFRocmVhZEFmZmluaXR5TWFzayhHZXRDdXJyZW50VGhyZWFkKCksIHJldHZhbCk7CisgICAgICAgIGlmICghbmV3TWFzaykgeworICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgaWYgKGFib3J0X29uX2Vycm9yKSB7CisgICAgICAgICAgICBfX2ttcF9tc2coa21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coRnVuY3Rpb25FcnJvciwgIlNldFRocmVhZEFmZmluaXR5TWFzaygpIiksCisgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUihlcnJvciksIF9fa21wX21zZ19udWxsKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKm1hc2sgPSByZXR2YWw7CisgICAgICB9CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW50IGdldF9wcm9jX2dyb3VwKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgaW50IGdyb3VwID0gLTE7CisgICAgICBpZiAoX19rbXBfbnVtX3Byb2NfZ3JvdXBzID09IDEpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9fa21wX251bV9wcm9jX2dyb3VwczsgaSsrKSB7CisgICAgICAgIGlmIChtYXNrW2ldID09IDApCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChncm91cCA+PSAwKQorICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgZ3JvdXAgPSBpOworICAgICAgfQorICAgICAgcmV0dXJuIGdyb3VwOworICAgIH0KKyAgfTsKKyAgdm9pZCBkZXRlcm1pbmVfY2FwYWJsZShjb25zdCBjaGFyICplbnZfdmFyKSBvdmVycmlkZSB7CisgICAgX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGUoZW52X3Zhcik7CisgIH0KKyAgdm9pZCBiaW5kX3RocmVhZChpbnQgd2hpY2gpIG92ZXJyaWRlIHsgX19rbXBfYWZmaW5pdHlfYmluZF90aHJlYWQod2hpY2gpOyB9CisgIEtNUEFmZmluaXR5OjpNYXNrICphbGxvY2F0ZV9tYXNrKCkgb3ZlcnJpZGUgeyByZXR1cm4gbmV3IE1hc2soKTsgfQorICB2b2lkIGRlYWxsb2NhdGVfbWFzayhLTVBBZmZpbml0eTo6TWFzayAqbSkgb3ZlcnJpZGUgeyBkZWxldGUgbTsgfQorICBLTVBBZmZpbml0eTo6TWFzayAqYWxsb2NhdGVfbWFza19hcnJheShpbnQgbnVtKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIG5ldyBNYXNrW251bV07CisgIH0KKyAgdm9pZCBkZWFsbG9jYXRlX21hc2tfYXJyYXkoS01QQWZmaW5pdHk6Ok1hc2sgKmFycmF5KSBvdmVycmlkZSB7CisgICAgTWFzayAqd2luZG93c19hcnJheSA9IHN0YXRpY19jYXN0PE1hc2sgKj4oYXJyYXkpOworICAgIGRlbGV0ZVtdIHdpbmRvd3NfYXJyYXk7CisgIH0KKyAgS01QQWZmaW5pdHk6Ok1hc2sgKmluZGV4X21hc2tfYXJyYXkoS01QQWZmaW5pdHk6Ok1hc2sgKmFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIG92ZXJyaWRlIHsKKyAgICBNYXNrICp3aW5kb3dzX2FycmF5ID0gc3RhdGljX2Nhc3Q8TWFzayAqPihhcnJheSk7CisgICAgcmV0dXJuICYod2luZG93c19hcnJheVtpbmRleF0pOworICB9CisgIGFwaV90eXBlIGdldF9hcGlfdHlwZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIE5BVElWRV9PUzsgfQorfTsKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworY2xhc3MgQWRkcmVzcyB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBtYXhEZXB0aCA9IDMyOworICB1bnNpZ25lZCBsYWJlbHNbbWF4RGVwdGhdOworICB1bnNpZ25lZCBjaGlsZE51bXNbbWF4RGVwdGhdOworICB1bnNpZ25lZCBkZXB0aDsKKyAgdW5zaWduZWQgbGVhZGVyOworICBBZGRyZXNzKHVuc2lnbmVkIF9kZXB0aCkgOiBkZXB0aChfZGVwdGgpLCBsZWFkZXIoRkFMU0UpIHt9CisgIEFkZHJlc3MgJm9wZXJhdG9yPShjb25zdCBBZGRyZXNzICZiKSB7CisgICAgZGVwdGggPSBiLmRlcHRoOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBkZXB0aDsgaSsrKSB7CisgICAgICBsYWJlbHNbaV0gPSBiLmxhYmVsc1tpXTsKKyAgICAgIGNoaWxkTnVtc1tpXSA9IGIuY2hpbGROdW1zW2ldOworICAgIH0KKyAgICBsZWFkZXIgPSBGQUxTRTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEFkZHJlc3MgJmIpIGNvbnN0IHsKKyAgICBpZiAoZGVwdGggIT0gYi5kZXB0aCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZGVwdGg7IGkrKykKKyAgICAgIGlmIChsYWJlbHNbaV0gIT0gYi5sYWJlbHNbaV0pCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBib29sIGlzQ2xvc2UoY29uc3QgQWRkcmVzcyAmYiwgaW50IGxldmVsKSBjb25zdCB7CisgICAgaWYgKGRlcHRoICE9IGIuZGVwdGgpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCh1bnNpZ25lZClsZXZlbCA+PSBkZXB0aCkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCAoZGVwdGggLSBsZXZlbCk7IGkrKykKKyAgICAgIGlmIChsYWJlbHNbaV0gIT0gYi5sYWJlbHNbaV0pCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgQWRkcmVzcyAmYikgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yPT0oYik7IH0KKyAgdm9pZCBwcmludCgpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBpOworICAgIHByaW50ZigiRGVwdGg6ICV1IC0tLSAiLCBkZXB0aCk7CisgICAgZm9yIChpID0gMDsgaSA8IGRlcHRoOyBpKyspIHsKKyAgICAgIHByaW50ZigiJXUgIiwgbGFiZWxzW2ldKTsKKyAgICB9CisgIH0KK307CisKK2NsYXNzIEFkZHJVbnNQYWlyIHsKK3B1YmxpYzoKKyAgQWRkcmVzcyBmaXJzdDsKKyAgdW5zaWduZWQgc2Vjb25kOworICBBZGRyVW5zUGFpcihBZGRyZXNzIF9maXJzdCwgdW5zaWduZWQgX3NlY29uZCkKKyAgICAgIDogZmlyc3QoX2ZpcnN0KSwgc2Vjb25kKF9zZWNvbmQpIHt9CisgIEFkZHJVbnNQYWlyICZvcGVyYXRvcj0oY29uc3QgQWRkclVuc1BhaXIgJmIpIHsKKyAgICBmaXJzdCA9IGIuZmlyc3Q7CisgICAgc2Vjb25kID0gYi5zZWNvbmQ7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIHZvaWQgcHJpbnQoKSBjb25zdCB7CisgICAgcHJpbnRmKCJmaXJzdCA9ICIpOworICAgIGZpcnN0LnByaW50KCk7CisgICAgcHJpbnRmKCIgLS0tIHNlY29uZCA9ICV1Iiwgc2Vjb25kKTsKKyAgfQorICBib29sIG9wZXJhdG9yPT0oY29uc3QgQWRkclVuc1BhaXIgJmIpIGNvbnN0IHsKKyAgICBpZiAoZmlyc3QgIT0gYi5maXJzdCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoc2Vjb25kICE9IGIuc2Vjb25kKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworICB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBZGRyVW5zUGFpciAmYikgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yPT0oYik7IH0KK307CisKK3N0YXRpYyBpbnQgX19rbXBfYWZmaW5pdHlfY21wX0FkZHJlc3NfbGFiZWxzKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpIHsKKyAgY29uc3QgQWRkcmVzcyAqYWEgPSAmKCgoY29uc3QgQWRkclVuc1BhaXIgKilhKS0+Zmlyc3QpOworICBjb25zdCBBZGRyZXNzICpiYiA9ICYoKChjb25zdCBBZGRyVW5zUGFpciAqKWIpLT5maXJzdCk7CisgIHVuc2lnbmVkIGRlcHRoID0gYWEtPmRlcHRoOworICB1bnNpZ25lZCBpOworICBLTVBfREVCVUdfQVNTRVJUKGRlcHRoID09IGJiLT5kZXB0aCk7CisgIGZvciAoaSA9IDA7IGkgPCBkZXB0aDsgaSsrKSB7CisgICAgaWYgKGFhLT5sYWJlbHNbaV0gPCBiYi0+bGFiZWxzW2ldKQorICAgICAgcmV0dXJuIC0xOworICAgIGlmIChhYS0+bGFiZWxzW2ldID4gYmItPmxhYmVsc1tpXSkKKyAgICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCisvKiBBIHN0cnVjdHVyZSBmb3IgaG9sZGluZyBtYWNoaW5lLXNwZWNpZmljIGhpZXJhcmNoeSBpbmZvIHRvIGJlIGNvbXB1dGVkIG9uY2UKKyAgIGF0IGluaXQuIFRoaXMgc3RydWN0dXJlIHJlcHJlc2VudHMgYSBtYXBwaW5nIG9mIHRocmVhZHMgdG8gdGhlIGFjdHVhbCBtYWNoaW5lCisgICBoaWVyYXJjaHksIG9yIHRvIG91ciBiZXN0IGd1ZXNzIGF0IHdoYXQgdGhlIGhpZXJhcmNoeSBtaWdodCBiZSwgZm9yIHRoZQorICAgcHVycG9zZSBvZiBwZXJmb3JtaW5nIGFuIGVmZmljaWVudCBiYXJyaWVyLiBJbiB0aGUgd29yc3QgY2FzZSwgd2hlbiB0aGVyZSBpcworICAgbm8gbWFjaGluZSBoaWVyYXJjaHkgaW5mb3JtYXRpb24sIGl0IHByb2R1Y2VzIGEgdHJlZSBzdWl0YWJsZSBmb3IgYSBiYXJyaWVyLAorICAgc2ltaWxhciB0byB0aGUgdHJlZSB1c2VkIGluIHRoZSBoeXBlciBiYXJyaWVyLiAqLworY2xhc3MgaGllcmFyY2h5X2luZm8geworcHVibGljOgorICAvKiBHb29kIGRlZmF1bHQgdmFsdWVzIGZvciBudW1iZXIgb2YgbGVhdmVzIGFuZCBicmFuY2hpbmcgZmFjdG9yLCBnaXZlbiBubworICAgICBhZmZpbml0eSBpbmZvcm1hdGlvbi4gQmVoYXZlcyBhIGJpdCBsaWtlIGh5cGVyIGJhcnJpZXIuICovCisgIHN0YXRpYyBjb25zdCBrbXBfdWludDMyIG1heExlYXZlcyA9IDQ7CisgIHN0YXRpYyBjb25zdCBrbXBfdWludDMyIG1pbkJyYW5jaCA9IDQ7CisgIC8qKiBOdW1iZXIgb2YgbGV2ZWxzIGluIHRoZSBoaWVyYXJjaHkuIFR5cGljYWwgbGV2ZWxzIGFyZSB0aHJlYWRzL2NvcmUsCisgICAgICBjb3Jlcy9wYWNrYWdlIG9yIHNvY2tldCwgcGFja2FnZXMvbm9kZSwgbm9kZXMvbWFjaGluZSwgZXRjLiBXZSBkb24ndCB3YW50CisgICAgICB0byBnZXQgc3BlY2lmaWMgd2l0aCBub21lbmNsYXR1cmUuIFdoZW4gdGhlIG1hY2hpbmUgaXMgb3ZlcnN1YnNjcmliZWQgd2UKKyAgICAgIGFkZCBsZXZlbHMgdG8gZHVwbGljYXRlIHRoZSBoaWVyYXJjaHksIGRvdWJsaW5nIHRoZSB0aHJlYWQgY2FwYWNpdHkgb2YgdGhlCisgICAgICBoaWVyYXJjaHkgZWFjaCB0aW1lIHdlIGFkZCBhIGxldmVsLiAqLworICBrbXBfdWludDMyIG1heExldmVsczsKKworICAvKiogVGhpcyBpcyBzcGVjaWZpY2FsbHkgdGhlIGRlcHRoIG9mIHRoZSBtYWNoaW5lIGNvbmZpZ3VyYXRpb24gaGllcmFyY2h5LCBpbgorICAgICAgdGVybXMgb2YgdGhlIG51bWJlciBvZiBsZXZlbHMgYWxvbmcgdGhlIGxvbmdlc3QgcGF0aCBmcm9tIHJvb3QgdG8gYW55CisgICAgICBsZWFmLiBJdCBjb3JyZXNwb25kcyB0byB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gbnVtUGVyTGV2ZWwgaWYgd2UgZXhjbHVkZQorICAgICAgYWxsIGJ1dCBvbmUgdHJhaWxpbmcgMS4gKi8KKyAga21wX3VpbnQzMiBkZXB0aDsKKyAga21wX3VpbnQzMiBiYXNlX251bV90aHJlYWRzOworICBlbnVtIGluaXRfc3RhdHVzIHsgaW5pdGlhbGl6ZWQgPSAwLCBub3RfaW5pdGlhbGl6ZWQgPSAxLCBpbml0aWFsaXppbmcgPSAyIH07CisgIHZvbGF0aWxlIGttcF9pbnQ4IHVuaW5pdGlhbGl6ZWQ7IC8vIDA9aW5pdGlhbGl6ZWQsIDE9bm90IGluaXRpYWxpemVkLAorICAvLyAyPWluaXRpYWxpemF0aW9uIGluIHByb2dyZXNzCisgIHZvbGF0aWxlIGttcF9pbnQ4IHJlc2l6aW5nOyAvLyAwPW5vdCByZXNpemluZywgMT1yZXNpemluZworCisgIC8qKiBMZXZlbCAwIGNvcnJlc3BvbmRzIHRvIGxlYXZlcy4gbnVtUGVyTGV2ZWxbaV0gaXMgdGhlIG51bWJlciBvZiBjaGlsZHJlbgorICAgICAgdGhlIHBhcmVudCBvZiBhIG5vZGUgYXQgbGV2ZWwgaSBoYXMuIEZvciBleGFtcGxlLCBpZiB3ZSBoYXZlIGEgbWFjaGluZQorICAgICAgd2l0aCA0IHBhY2thZ2VzLCA0IGNvcmVzL3BhY2thZ2UgYW5kIDIgSFQgcGVyIGNvcmUsIHRoZW4gbnVtUGVyTGV2ZWwgPQorICAgICAgezIsIDQsIDQsIDEsIDF9LiBBbGwgZW1wdHkgbGV2ZWxzIGFyZSBzZXQgdG8gMS4gKi8KKyAga21wX3VpbnQzMiAqbnVtUGVyTGV2ZWw7CisgIGttcF91aW50MzIgKnNraXBQZXJMZXZlbDsKKworICB2b2lkIGRlcml2ZUxldmVscyhBZGRyVW5zUGFpciAqYWRyMm9zLCBpbnQgbnVtX2FkZHJzKSB7CisgICAgaW50IGhpZXJfZGVwdGggPSBhZHIyb3NbMF0uZmlyc3QuZGVwdGg7CisgICAgaW50IGxldmVsID0gMDsKKyAgICBmb3IgKGludCBpID0gaGllcl9kZXB0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICBpbnQgbWF4ID0gLTE7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG51bV9hZGRyczsgKytqKSB7CisgICAgICAgIGludCBuZXh0ID0gYWRyMm9zW2pdLmZpcnN0LmNoaWxkTnVtc1tpXTsKKyAgICAgICAgaWYgKG5leHQgPiBtYXgpCisgICAgICAgICAgbWF4ID0gbmV4dDsKKyAgICAgIH0KKyAgICAgIG51bVBlckxldmVsW2xldmVsXSA9IG1heCArIDE7CisgICAgICArK2xldmVsOworICAgIH0KKyAgfQorCisgIGhpZXJhcmNoeV9pbmZvKCkKKyAgICAgIDogbWF4TGV2ZWxzKDcpLCBkZXB0aCgxKSwgdW5pbml0aWFsaXplZChub3RfaW5pdGlhbGl6ZWQpLCByZXNpemluZygwKSB7fQorCisgIHZvaWQgZmluaSgpIHsKKyAgICBpZiAoIXVuaW5pdGlhbGl6ZWQgJiYgbnVtUGVyTGV2ZWwpIHsKKyAgICAgIF9fa21wX2ZyZWUobnVtUGVyTGV2ZWwpOworICAgICAgbnVtUGVyTGV2ZWwgPSBOVUxMOworICAgICAgdW5pbml0aWFsaXplZCA9IG5vdF9pbml0aWFsaXplZDsKKyAgICB9CisgIH0KKworICB2b2lkIGluaXQoQWRkclVuc1BhaXIgKmFkcjJvcywgaW50IG51bV9hZGRycykgeworICAgIGttcF9pbnQ4IGJvb2xfcmVzdWx0ID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTgoCisgICAgICAgICZ1bmluaXRpYWxpemVkLCBub3RfaW5pdGlhbGl6ZWQsIGluaXRpYWxpemluZyk7CisgICAgaWYgKGJvb2xfcmVzdWx0ID09IDApIHsgLy8gV2FpdCBmb3IgaW5pdGlhbGl6YXRpb24KKyAgICAgIHdoaWxlIChUQ1JfMSh1bmluaXRpYWxpemVkKSAhPSBpbml0aWFsaXplZCkKKyAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKGJvb2xfcmVzdWx0ID09IDEpOworCisgICAgLyogQWRkZWQgZXhwbGljaXQgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGRhdGEgZmllbGRzIGhlcmUgdG8gcHJldmVudCB1c2FnZSBvZgorICAgICAgIGRpcnR5IHZhbHVlIG9ic2VydmVkIHdoZW4gc3RhdGljIGxpYnJhcnkgaXMgcmUtaW5pdGlhbGl6ZWQgbXVsdGlwbGUgdGltZXMKKyAgICAgICAoZS5nLiB3aGVuIG5vbi1PcGVuTVAgdGhyZWFkIHJlcGVhdGVkbHkgbGF1bmNoZXMvam9pbnMgdGhyZWFkIHRoYXQgdXNlcworICAgICAgIE9wZW5NUCkuICovCisgICAgZGVwdGggPSAxOworICAgIHJlc2l6aW5nID0gMDsKKyAgICBtYXhMZXZlbHMgPSA3OworICAgIG51bVBlckxldmVsID0KKyAgICAgICAgKGttcF91aW50MzIgKilfX2ttcF9hbGxvY2F0ZShtYXhMZXZlbHMgKiAyICogc2l6ZW9mKGttcF91aW50MzIpKTsKKyAgICBza2lwUGVyTGV2ZWwgPSAmKG51bVBlckxldmVsW21heExldmVsc10pOworICAgIGZvciAoa21wX3VpbnQzMiBpID0gMDsgaSA8IG1heExldmVsczsKKyAgICAgICAgICsraSkgeyAvLyBpbml0IG51bVBlckxldmVsWypdIHRvIDEgaXRlbSBwZXIgbGV2ZWwKKyAgICAgIG51bVBlckxldmVsW2ldID0gMTsKKyAgICAgIHNraXBQZXJMZXZlbFtpXSA9IDE7CisgICAgfQorCisgICAgLy8gU29ydCB0YWJsZSBieSBwaHlzaWNhbCBJRAorICAgIGlmIChhZHIyb3MpIHsKKyAgICAgIHFzb3J0KGFkcjJvcywgbnVtX2FkZHJzLCBzaXplb2YoKmFkcjJvcyksCisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9jbXBfQWRkcmVzc19sYWJlbHMpOworICAgICAgZGVyaXZlTGV2ZWxzKGFkcjJvcywgbnVtX2FkZHJzKTsKKyAgICB9IGVsc2UgeworICAgICAgbnVtUGVyTGV2ZWxbMF0gPSBtYXhMZWF2ZXM7CisgICAgICBudW1QZXJMZXZlbFsxXSA9IG51bV9hZGRycyAvIG1heExlYXZlczsKKyAgICAgIGlmIChudW1fYWRkcnMgJSBtYXhMZWF2ZXMpCisgICAgICAgIG51bVBlckxldmVsWzFdKys7CisgICAgfQorCisgICAgYmFzZV9udW1fdGhyZWFkcyA9IG51bV9hZGRyczsKKyAgICBmb3IgKGludCBpID0gbWF4TGV2ZWxzIC0gMTsgaSA+PSAwOworICAgICAgICAgLS1pKSAvLyBjb3VudCBub24tZW1wdHkgbGV2ZWxzIHRvIGdldCBkZXB0aAorICAgICAgaWYgKG51bVBlckxldmVsW2ldICE9IDEgfHwgZGVwdGggPiAxKSAvLyBvbmx5IGNvdW50IG9uZSB0b3AtbGV2ZWwgJzEnCisgICAgICAgIGRlcHRoKys7CisKKyAgICBrbXBfdWludDMyIGJyYW5jaCA9IG1pbkJyYW5jaDsKKyAgICBpZiAobnVtUGVyTGV2ZWxbMF0gPT0gMSkKKyAgICAgIGJyYW5jaCA9IG51bV9hZGRycyAvIG1heExlYXZlczsKKyAgICBpZiAoYnJhbmNoIDwgbWluQnJhbmNoKQorICAgICAgYnJhbmNoID0gbWluQnJhbmNoOworICAgIGZvciAoa21wX3VpbnQzMiBkID0gMDsgZCA8IGRlcHRoIC0gMTsgKytkKSB7IC8vIG9wdGltaXplIGhpZXJhcmNoeSB3aWR0aAorICAgICAgd2hpbGUgKG51bVBlckxldmVsW2RdID4gYnJhbmNoIHx8CisgICAgICAgICAgICAgKGQgPT0gMCAmJiBudW1QZXJMZXZlbFtkXSA+IG1heExlYXZlcykpIHsgLy8gbWF4IDQgb24gbGV2ZWwgMCEKKyAgICAgICAgaWYgKG51bVBlckxldmVsW2RdICYgMSkKKyAgICAgICAgICBudW1QZXJMZXZlbFtkXSsrOworICAgICAgICBudW1QZXJMZXZlbFtkXSA9IG51bVBlckxldmVsW2RdID4+IDE7CisgICAgICAgIGlmIChudW1QZXJMZXZlbFtkICsgMV0gPT0gMSkKKyAgICAgICAgICBkZXB0aCsrOworICAgICAgICBudW1QZXJMZXZlbFtkICsgMV0gPSBudW1QZXJMZXZlbFtkICsgMV0gPDwgMTsKKyAgICAgIH0KKyAgICAgIGlmIChudW1QZXJMZXZlbFswXSA9PSAxKSB7CisgICAgICAgIGJyYW5jaCA9IGJyYW5jaCA+PiAxOworICAgICAgICBpZiAoYnJhbmNoIDwgNCkKKyAgICAgICAgICBicmFuY2ggPSBtaW5CcmFuY2g7CisgICAgICB9CisgICAgfQorCisgICAgZm9yIChrbXBfdWludDMyIGkgPSAxOyBpIDwgZGVwdGg7ICsraSkKKyAgICAgIHNraXBQZXJMZXZlbFtpXSA9IG51bVBlckxldmVsW2kgLSAxXSAqIHNraXBQZXJMZXZlbFtpIC0gMV07CisgICAgLy8gRmlsbCBpbiBoaWVyYXJjaHkgaW4gdGhlIGNhc2Ugb2Ygb3ZlcnN1YnNjcmlwdGlvbgorICAgIGZvciAoa21wX3VpbnQzMiBpID0gZGVwdGg7IGkgPCBtYXhMZXZlbHM7ICsraSkKKyAgICAgIHNraXBQZXJMZXZlbFtpXSA9IDIgKiBza2lwUGVyTGV2ZWxbaSAtIDFdOworCisgICAgdW5pbml0aWFsaXplZCA9IGluaXRpYWxpemVkOyAvLyBPbmUgd3JpdGVyCisgIH0KKworICAvLyBSZXNpemUgdGhlIGhpZXJhcmNoeSBpZiBucHJvYyBjaGFuZ2VzIHRvIHNvbWV0aGluZyBsYXJnZXIgdGhhbiBiZWZvcmUKKyAgdm9pZCByZXNpemUoa21wX3VpbnQzMiBucHJvYykgeworICAgIGttcF9pbnQ4IGJvb2xfcmVzdWx0ID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTgoJnJlc2l6aW5nLCAwLCAxKTsKKyAgICB3aGlsZSAoYm9vbF9yZXN1bHQgPT0gMCkgeyAvLyBzb21lb25lIGVsc2UgaXMgdHJ5aW5nIHRvIHJlc2l6ZQorICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgaWYgKG5wcm9jIDw9IGJhc2VfbnVtX3RocmVhZHMpIC8vIGhhcHB5IHdpdGggb3RoZXIgdGhyZWFkJ3MgcmVzaXplCisgICAgICAgIHJldHVybjsKKyAgICAgIGVsc2UgLy8gdHJ5IHRvIHJlc2l6ZQorICAgICAgICBib29sX3Jlc3VsdCA9IEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E4KCZyZXNpemluZywgMCwgMSk7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoYm9vbF9yZXN1bHQgIT0gMCk7CisgICAgaWYgKG5wcm9jIDw9IGJhc2VfbnVtX3RocmVhZHMpCisgICAgICByZXR1cm47IC8vIGhhcHB5IHdpdGggb3RoZXIgdGhyZWFkJ3MgcmVzaXplCisKKyAgICAvLyBDYWxjdWxhdGUgbmV3IG1heExldmVscworICAgIGttcF91aW50MzIgb2xkX3N6ID0gc2tpcFBlckxldmVsW2RlcHRoIC0gMV07CisgICAga21wX3VpbnQzMiBpbmNzID0gMCwgb2xkX21heExldmVscyA9IG1heExldmVsczsKKyAgICAvLyBGaXJzdCBzZWUgaWYgb2xkIG1heExldmVscyBpcyBlbm91Z2ggdG8gY29udGFpbiBuZXcgc2l6ZQorICAgIGZvciAoa21wX3VpbnQzMiBpID0gZGVwdGg7IGkgPCBtYXhMZXZlbHMgJiYgbnByb2MgPiBvbGRfc3o7ICsraSkgeworICAgICAgc2tpcFBlckxldmVsW2ldID0gMiAqIHNraXBQZXJMZXZlbFtpIC0gMV07CisgICAgICBudW1QZXJMZXZlbFtpIC0gMV0gKj0gMjsKKyAgICAgIG9sZF9zeiAqPSAyOworICAgICAgZGVwdGgrKzsKKyAgICB9CisgICAgaWYgKG5wcm9jID4gb2xkX3N6KSB7IC8vIE5vdCBlbm91Z2ggc3BhY2UsIG5lZWQgdG8gZXhwYW5kIGhpZXJhcmNoeQorICAgICAgd2hpbGUgKG5wcm9jID4gb2xkX3N6KSB7CisgICAgICAgIG9sZF9zeiAqPSAyOworICAgICAgICBpbmNzKys7CisgICAgICAgIGRlcHRoKys7CisgICAgICB9CisgICAgICBtYXhMZXZlbHMgKz0gaW5jczsKKworICAgICAgLy8gUmVzaXplIGFycmF5cworICAgICAga21wX3VpbnQzMiAqb2xkX251bVBlckxldmVsID0gbnVtUGVyTGV2ZWw7CisgICAgICBrbXBfdWludDMyICpvbGRfc2tpcFBlckxldmVsID0gc2tpcFBlckxldmVsOworICAgICAgbnVtUGVyTGV2ZWwgPSBza2lwUGVyTGV2ZWwgPSBOVUxMOworICAgICAgbnVtUGVyTGV2ZWwgPQorICAgICAgICAgIChrbXBfdWludDMyICopX19rbXBfYWxsb2NhdGUobWF4TGV2ZWxzICogMiAqIHNpemVvZihrbXBfdWludDMyKSk7CisgICAgICBza2lwUGVyTGV2ZWwgPSAmKG51bVBlckxldmVsW21heExldmVsc10pOworCisgICAgICAvLyBDb3B5IG9sZCBlbGVtZW50cyBmcm9tIG9sZCBhcnJheXMKKyAgICAgIGZvciAoa21wX3VpbnQzMiBpID0gMDsgaSA8IG9sZF9tYXhMZXZlbHM7CisgICAgICAgICAgICsraSkgeyAvLyBpbml0IG51bVBlckxldmVsWypdIHRvIDEgaXRlbSBwZXIgbGV2ZWwKKyAgICAgICAgbnVtUGVyTGV2ZWxbaV0gPSBvbGRfbnVtUGVyTGV2ZWxbaV07CisgICAgICAgIHNraXBQZXJMZXZlbFtpXSA9IG9sZF9za2lwUGVyTGV2ZWxbaV07CisgICAgICB9CisKKyAgICAgIC8vIEluaXQgbmV3IGVsZW1lbnRzIGluIGFycmF5cyB0byAxCisgICAgICBmb3IgKGttcF91aW50MzIgaSA9IG9sZF9tYXhMZXZlbHM7IGkgPCBtYXhMZXZlbHM7CisgICAgICAgICAgICsraSkgeyAvLyBpbml0IG51bVBlckxldmVsWypdIHRvIDEgaXRlbSBwZXIgbGV2ZWwKKyAgICAgICAgbnVtUGVyTGV2ZWxbaV0gPSAxOworICAgICAgICBza2lwUGVyTGV2ZWxbaV0gPSAxOworICAgICAgfQorCisgICAgICAvLyBGcmVlIG9sZCBhcnJheXMKKyAgICAgIF9fa21wX2ZyZWUob2xkX251bVBlckxldmVsKTsKKyAgICB9CisKKyAgICAvLyBGaWxsIGluIG92ZXJzdWJzY3JpcHRpb24gbGV2ZWxzIG9mIGhpZXJhcmNoeQorICAgIGZvciAoa21wX3VpbnQzMiBpID0gb2xkX21heExldmVsczsgaSA8IG1heExldmVsczsgKytpKQorICAgICAgc2tpcFBlckxldmVsW2ldID0gMiAqIHNraXBQZXJMZXZlbFtpIC0gMV07CisKKyAgICBiYXNlX251bV90aHJlYWRzID0gbnByb2M7CisgICAgcmVzaXppbmcgPSAwOyAvLyBPbmUgd3JpdGVyCisgIH0KK307CisjZW5kaWYgLy8gS01QX0FGRklOSVRZX0gKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9hbGxvYy5jcHAgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfYWxsb2MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZDQ3MzIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfYWxsb2MuY3BwCkBAIC0wLDAgKzEsMTkwMyBAQAorLyoKKyAqIGttcF9hbGxvYy5jcHAgLS0gcHJpdmF0ZS9zaGFyZWQgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgbWFuYWdlbWVudAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2lvLmgiCisjaW5jbHVkZSAia21wX3dyYXBwZXJfbWFsbG9jLmgiCisKKy8vIERpc2FibGUgYmdldCB3aGVuIGl0IGlzIG5vdCB1c2VkCisjaWYgS01QX1VTRV9CR0VUCisKKy8qIFRocmVhZCBwcml2YXRlIGJ1ZmZlciBtYW5hZ2VtZW50IGNvZGUgKi8KKwordHlwZWRlZiBpbnQgKCpiZ2V0X2NvbXBhY3RfdCkoc2l6ZV90LCBpbnQpOwordHlwZWRlZiB2b2lkICooKmJnZXRfYWNxdWlyZV90KShzaXplX3QpOwordHlwZWRlZiB2b2lkICgqYmdldF9yZWxlYXNlX3QpKHZvaWQgKik7CisKKy8qIE5PVEU6IGJ1ZnNpemUgbXVzdCBiZSBhIHNpZ25lZCBkYXRhdHlwZSAqLworCisjaWYgS01QX09TX1dJTkRPV1MKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfQVJNCit0eXBlZGVmIGttcF9pbnQzMiBidWZzaXplOworI2Vsc2UKK3R5cGVkZWYga21wX2ludDY0IGJ1ZnNpemU7CisjZW5kaWYKKyNlbHNlCit0eXBlZGVmIHNzaXplX3QgYnVmc2l6ZTsKKyNlbmRpZgorCisvKiBUaGUgdGhyZWUgbW9kZXMgb2Ygb3BlcmF0aW9uIGFyZSwgZmlmbyBzZWFyY2gsIGxpZm8gc2VhcmNoLCBhbmQgYmVzdC1maXQgKi8KKwordHlwZWRlZiBlbnVtIGJnZXRfbW9kZSB7CisgIGJnZXRfbW9kZV9maWZvID0gMCwKKyAgYmdldF9tb2RlX2xpZm8gPSAxLAorICBiZ2V0X21vZGVfYmVzdCA9IDIKK30gYmdldF9tb2RlX3Q7CisKK3N0YXRpYyB2b2lkIGJwb29sKGttcF9pbmZvX3QgKnRoLCB2b2lkICpidWZmZXIsIGJ1ZnNpemUgbGVuKTsKK3N0YXRpYyB2b2lkICpiZ2V0KGttcF9pbmZvX3QgKnRoLCBidWZzaXplIHNpemUpOworc3RhdGljIHZvaWQgKmJnZXR6KGttcF9pbmZvX3QgKnRoLCBidWZzaXplIHNpemUpOworc3RhdGljIHZvaWQgKmJnZXRyKGttcF9pbmZvX3QgKnRoLCB2b2lkICpidWZmZXIsIGJ1ZnNpemUgbmV3c2l6ZSk7CitzdGF0aWMgdm9pZCBicmVsKGttcF9pbmZvX3QgKnRoLCB2b2lkICpidWYpOworc3RhdGljIHZvaWQgYmVjdGwoa21wX2luZm9fdCAqdGgsIGJnZXRfY29tcGFjdF90IGNvbXBhY3QsCisgICAgICAgICAgICAgICAgICBiZ2V0X2FjcXVpcmVfdCBhY3F1aXJlLCBiZ2V0X3JlbGVhc2VfdCByZWxlYXNlLAorICAgICAgICAgICAgICAgICAgYnVmc2l6ZSBwb29sX2luY3IpOworCisjaWZkZWYgS01QX0RFQlVHCitzdGF0aWMgdm9pZCBic3RhdHMoa21wX2luZm9fdCAqdGgsIGJ1ZnNpemUgKmN1cmFsbG9jLCBidWZzaXplICp0b3RmcmVlLAorICAgICAgICAgICAgICAgICAgIGJ1ZnNpemUgKm1heGZyZWUsIGxvbmcgKm5nZXQsIGxvbmcgKm5yZWwpOworc3RhdGljIHZvaWQgYnN0YXRzZShrbXBfaW5mb190ICp0aCwgYnVmc2l6ZSAqcG9vbF9pbmNyLCBsb25nICpucG9vbCwKKyAgICAgICAgICAgICAgICAgICAgbG9uZyAqbnBnZXQsIGxvbmcgKm5wcmVsLCBsb25nICpuZGdldCwgbG9uZyAqbmRyZWwpOworc3RhdGljIHZvaWQgYnVmZHVtcChrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmKTsKK3N0YXRpYyB2b2lkIGJwb29sZChrbXBfaW5mb190ICp0aCwgdm9pZCAqcG9vbCwgaW50IGR1bXBhbGxvYywgaW50IGR1bXBmcmVlKTsKK3N0YXRpYyBpbnQgYnBvb2x2KGttcF9pbmZvX3QgKnRoLCB2b2lkICpwb29sKTsKKyNlbmRpZgorCisvKiBCR0VUIENPTkZJR1VSQVRJT04gKi8KKy8qIEJ1ZmZlciBhbGxvY2F0aW9uIHNpemUgcXVhbnR1bTogYWxsIGJ1ZmZlcnMgYWxsb2NhdGVkIGFyZSBhCisgICBtdWx0aXBsZSBvZiB0aGlzIHNpemUuICBUaGlzIE1VU1QgYmUgYSBwb3dlciBvZiB0d28uICovCisKKy8qIE9uIElBLTMyIGFyY2hpdGVjdHVyZSB3aXRoICBMaW51eCogT1MsIG1hbGxvYygpIGRvZXMgbm90CisgICBlbnN1cmUgMTYgYnl0ZSBhbGlnbm1uZW50ICovCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgIUtNUF9IQVZFX1FVQUQKKworI2RlZmluZSBTaXplUXVhbnQgOAorI2RlZmluZSBBbGlnblR5cGUgZG91YmxlCisKKyNlbHNlCisKKyNkZWZpbmUgU2l6ZVF1YW50IDE2CisjZGVmaW5lIEFsaWduVHlwZSBfUXVhZAorCisjZW5kaWYKKworLy8gRGVmaW5lIHRoaXMgc3ltYm9sIHRvIGVuYWJsZSB0aGUgYnN0YXRzKCkgZnVuY3Rpb24gd2hpY2ggY2FsY3VsYXRlcyB0aGUKKy8vIHRvdGFsIGZyZWUgc3BhY2UgaW4gdGhlIGJ1ZmZlciBwb29sLCB0aGUgbGFyZ2VzdCBhdmFpbGFibGUgYnVmZmVyLCBhbmQgdGhlCisvLyB0b3RhbCBzcGFjZSBjdXJyZW50bHkgYWxsb2NhdGVkLgorI2RlZmluZSBCdWZTdGF0cyAxCisKKyNpZmRlZiBLTVBfREVCVUcKKworLy8gRGVmaW5lIHRoaXMgc3ltYm9sIHRvIGVuYWJsZSB0aGUgYnBvb2xkKCkgZnVuY3Rpb24gd2hpY2ggZHVtcHMgdGhlIGJ1ZmZlcnMKKy8vIGluIGEgYnVmZmVyIHBvb2wuCisjZGVmaW5lIEJ1ZkR1bXAgMQorCisvLyBEZWZpbmUgdGhpcyBzeW1ib2wgdG8gZW5hYmxlIHRoZSBicG9vbHYoKSBmdW5jdGlvbiBmb3IgdmFsaWRhdGluZyBhIGJ1ZmZlcgorLy8gcG9vbC4KKyNkZWZpbmUgQnVmVmFsaWQgMQorCisvLyBEZWZpbmUgdGhpcyBzeW1ib2wgdG8gZW5hYmxlIHRoZSBidWZkdW1wKCkgZnVuY3Rpb24gd2hpY2ggYWxsb3dzIGR1bXBpbmcgdGhlCisvLyBjb250ZW50cyBvZiBhbiBhbGxvY2F0ZWQgb3IgZnJlZSBidWZmZXIuCisjZGVmaW5lIER1bXBEYXRhIDEKKworI2lmZGVmIE5PVF9VU0VEX05PVworCisvLyBXaXBlIGZyZWUgYnVmZmVycyB0byBhIGd1YXJhbnRlZWQgcGF0dGVybiBvZiBnYXJiYWdlIHRvIHRyaXAgdXAgbWlzY3JlYW50cworLy8gd2hvIGF0dGVtcHQgdG8gdXNlIHBvaW50ZXJzIGludG8gcmVsZWFzZWQgYnVmZmVycy4KKyNkZWZpbmUgRnJlZVdpcGUgMQorCisvLyBVc2UgYSBiZXN0IGZpdCBhbGdvcml0aG0gd2hlbiBzZWFyY2hpbmcgZm9yIHNwYWNlIGZvciBhbiBhbGxvY2F0aW9uIHJlcXVlc3QuCisvLyBUaGlzIHVzZXMgbWVtb3J5IG1vcmUgZWZmaWNpZW50bHksIGJ1dCBhbGxvY2F0aW9uIHdpbGwgYmUgbXVjaCBzbG93ZXIuCisjZGVmaW5lIEJlc3RGaXQgMQorCisjZW5kaWYgLyogTk9UX1VTRURfTk9XICovCisjZW5kaWYgLyogS01QX0RFQlVHICovCisKK3N0YXRpYyBidWZzaXplIGJnZXRfYmluX3NpemVbXSA9IHsKKyAgICAwLAorICAgIC8vICAgIDEgPDwgNiwgICAgLyogLjUgQ2FjaGUgbGluZSAqLworICAgIDEgPDwgNywgLyogMSBDYWNoZSBsaW5lLCBuZXcgKi8KKyAgICAxIDw8IDgsIC8qIDIgQ2FjaGUgbGluZXMgKi8KKyAgICAxIDw8IDksIC8qIDQgQ2FjaGUgbGluZXMsIG5ldyAqLworICAgIDEgPDwgMTAsIC8qIDggQ2FjaGUgbGluZXMgKi8KKyAgICAxIDw8IDExLCAvKiAxNiBDYWNoZSBsaW5lcywgbmV3ICovCisgICAgMSA8PCAxMiwgMSA8PCAxMywgLyogbmV3ICovCisgICAgMSA8PCAxNCwgMSA8PCAxNSwgLyogbmV3ICovCisgICAgMSA8PCAxNiwgMSA8PCAxNywgMSA8PCAxOCwgMSA8PCAxOSwgMSA8PCAyMCwgLyogIDFNQiAqLworICAgIDEgPDwgMjEsIC8qICAyTUIgKi8KKyAgICAxIDw8IDIyLCAvKiAgNE1CICovCisgICAgMSA8PCAyMywgLyogIDhNQiAqLworICAgIDEgPDwgMjQsIC8qIDE2TUIgKi8KKyAgICAxIDw8IDI1LCAvKiAzMk1CICovCit9OworCisjZGVmaW5lIE1BWF9CR0VUX0JJTlMgKGludCkoc2l6ZW9mKGJnZXRfYmluX3NpemUpIC8gc2l6ZW9mKGJ1ZnNpemUpKQorCitzdHJ1Y3QgYmZoZWFkOworCisvLyAgRGVjbGFyZSB0aGUgaW50ZXJmYWNlLCBpbmNsdWRpbmcgdGhlIHJlcXVlc3RlZCBidWZmZXIgc2l6ZSB0eXBlLCBidWZzaXplLgorCisvKiBRdWV1ZSBsaW5rcyAqLwordHlwZWRlZiBzdHJ1Y3QgcWxpbmtzIHsKKyAgc3RydWN0IGJmaGVhZCAqZmxpbms7IC8qIEZvcndhcmQgbGluayAqLworICBzdHJ1Y3QgYmZoZWFkICpibGluazsgLyogQmFja3dhcmQgbGluayAqLworfSBxbGlua3NfdDsKKworLyogSGVhZGVyIGluIGFsbG9jYXRlZCBhbmQgZnJlZSBidWZmZXJzICovCit0eXBlZGVmIHN0cnVjdCBiaGVhZDIgeworICBrbXBfaW5mb190ICpidGhyOyAvKiBUaGUgdGhyZWFkIHdoaWNoIG93bnMgdGhlIGJ1ZmZlciBwb29sICovCisgIGJ1ZnNpemUgcHJldmZyZWU7IC8qIFJlbGF0aXZlIGxpbmsgYmFjayB0byBwcmV2aW91cyBmcmVlIGJ1ZmZlciBpbiBtZW1vcnkgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgMCBpZiBwcmV2aW91cyBidWZmZXIgaXMgYWxsb2NhdGVkLiAgKi8KKyAgYnVmc2l6ZSBic2l6ZTsgLyogQnVmZmVyIHNpemU6IHBvc2l0aXZlIGlmIGZyZWUsIG5lZ2F0aXZlIGlmIGFsbG9jYXRlZC4gKi8KK30gYmhlYWQyX3Q7CisKKy8qIE1ha2Ugc3VyZSB0aGUgYmhlYWQgc3RydWN0dXJlIGlzIGEgbXVsdGlwbGUgb2YgU2l6ZVF1YW50IGluIHNpemUuICovCit0eXBlZGVmIHVuaW9uIGJoZWFkIHsKKyAgS01QX0FMSUdOKFNpemVRdWFudCkKKyAgQWxpZ25UeXBlIGJfYWxpZ247CisgIGNoYXIgYl9wYWRbc2l6ZW9mKGJoZWFkMl90KSArIChTaXplUXVhbnQgLSAoc2l6ZW9mKGJoZWFkMl90KSAlIFNpemVRdWFudCkpXTsKKyAgYmhlYWQyX3QgYmI7Cit9IGJoZWFkX3Q7CisjZGVmaW5lIEJIKHApICgoYmhlYWRfdCAqKShwKSkKKworLyogIEhlYWRlciBpbiBkaXJlY3RseSBhbGxvY2F0ZWQgYnVmZmVycyAoYnkgYWNxZmNuKSAqLwordHlwZWRlZiBzdHJ1Y3QgYmRoZWFkIHsKKyAgYnVmc2l6ZSB0c2l6ZTsgLyogVG90YWwgc2l6ZSwgaW5jbHVkaW5nIG92ZXJoZWFkICovCisgIGJoZWFkX3QgYmg7IC8qIENvbW1vbiBoZWFkZXIgKi8KK30gYmRoZWFkX3Q7CisjZGVmaW5lIEJESChwKSAoKGJkaGVhZF90ICopKHApKQorCisvKiBIZWFkZXIgaW4gZnJlZSBidWZmZXJzICovCit0eXBlZGVmIHN0cnVjdCBiZmhlYWQgeworICBiaGVhZF90IGJoOyAvKiBDb21tb24gYWxsb2NhdGVkL2ZyZWUgaGVhZGVyICovCisgIHFsaW5rc190IHFsOyAvKiBMaW5rcyBvbiBmcmVlIGxpc3QgKi8KK30gYmZoZWFkX3Q7CisjZGVmaW5lIEJGSChwKSAoKGJmaGVhZF90ICopKHApKQorCit0eXBlZGVmIHN0cnVjdCB0aHJfZGF0YSB7CisgIGJmaGVhZF90IGZyZWVsaXN0W01BWF9CR0VUX0JJTlNdOworI2lmIEJ1ZlN0YXRzCisgIHNpemVfdCB0b3RhbGxvYzsgLyogVG90YWwgc3BhY2UgY3VycmVudGx5IGFsbG9jYXRlZCAqLworICBsb25nIG51bWdldCwgbnVtcmVsOyAvKiBOdW1iZXIgb2YgYmdldCgpIGFuZCBicmVsKCkgY2FsbHMgKi8KKyAgbG9uZyBudW1wYmxrOyAvKiBOdW1iZXIgb2YgcG9vbCBibG9ja3MgKi8KKyAgbG9uZyBudW1wZ2V0LCBudW1wcmVsOyAvKiBOdW1iZXIgb2YgYmxvY2sgZ2V0cyBhbmQgcmVscyAqLworICBsb25nIG51bWRnZXQsIG51bWRyZWw7IC8qIE51bWJlciBvZiBkaXJlY3QgZ2V0cyBhbmQgcmVscyAqLworI2VuZGlmIC8qIEJ1ZlN0YXRzICovCisKKyAgLyogQXV0b21hdGljIGV4cGFuc2lvbiBibG9jayBtYW5hZ2VtZW50IGZ1bmN0aW9ucyAqLworICBiZ2V0X2NvbXBhY3RfdCBjb21wZmNuOworICBiZ2V0X2FjcXVpcmVfdCBhY3FmY247CisgIGJnZXRfcmVsZWFzZV90IHJlbGZjbjsKKworICBiZ2V0X21vZGVfdCBtb2RlOyAvKiB3aGF0IGFsbG9jYXRpb24gbW9kZSB0byB1c2U/ICovCisKKyAgYnVmc2l6ZSBleHBfaW5jcjsgLyogRXhwYW5zaW9uIGJsb2NrIHNpemUgKi8KKyAgYnVmc2l6ZSBwb29sX2xlbjsgLyogMDogbm8gYnBvb2wgY2FsbHMgaGF2ZSBiZWVuIG1hZGUKKyAgICAgICAgICAgICAgICAgICAgICAgLTE6IG5vdCBhbGwgcG9vbCBibG9ja3MgYXJlIHRoZSBzYW1lIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgPjA6IChjb21tb24pIGJsb2NrIHNpemUgZm9yIGFsbCBicG9vbCBjYWxscyBtYWRlIHNvIGZhcgorICAgICAgICAgICAgICAgICAgICAqLworICBiZmhlYWRfdCAqbGFzdF9wb29sOyAvKiBMYXN0IHBvb2wgb3duZWQgYnkgdGhpcyB0aHJlYWQgKGRlbGF5IGRlYWxvY2F0aW9uKSAqLworfSB0aHJfZGF0YV90OworCisvKiAgTWluaW11bSBhbGxvY2F0aW9uIHF1YW50dW06ICovCisjZGVmaW5lIFFMU2l6ZSAoc2l6ZW9mKHFsaW5rc190KSkKKyNkZWZpbmUgU2l6ZVEgKChTaXplUXVhbnQgPiBRTFNpemUpID8gU2l6ZVF1YW50IDogUUxTaXplKQorI2RlZmluZSBNYXhTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKGJ1ZnNpemUpKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB+KCgoYnVmc2l6ZSkoMSkgPDwgKHNpemVvZihidWZzaXplKSAqIENIQVJfQklUIC0gMSkpIHwgKFNpemVRdWFudCAtIDEpKSkKKy8vIE1heGltdW4gZm9yIHRoZSByZXF1ZXN0ZWQgc2l6ZS4KKworLyogRW5kIHNlbnRpbmVsOiB2YWx1ZSBwbGFjZWQgaW4gYnNpemUgZmllbGQgb2YgZHVtbXkgYmxvY2sgZGVsaW1pdGluZworICAgZW5kIG9mIHBvb2wgYmxvY2suICBUaGUgbW9zdCBuZWdhdGl2ZSBudW1iZXIgd2hpY2ggd2lsbCAgZml0ICBpbiAgYQorICAgYnVmc2l6ZSwgZGVmaW5lZCBpbiBhIHdheSB0aGF0IHRoZSBjb21waWxlciB3aWxsIGFjY2VwdC4gKi8KKworI2RlZmluZSBFU2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChidWZzaXplKSgtKCgoKChidWZzaXplKTEpIDw8ICgoaW50KXNpemVvZihidWZzaXplKSAqIDggLSAyKSkgLSAxKSAqIDIpIC0gMikpCisKKy8qIFRocmVhZCBEYXRhIG1hbmFnZW1lbnQgcm91dGluZXMgKi8KK3N0YXRpYyBpbnQgYmdldF9nZXRfYmluKGJ1ZnNpemUgc2l6ZSkgeworICAvLyBiaW5hcnkgY2hvcCBiaW5zCisgIGludCBsbyA9IDAsIGhpID0gTUFYX0JHRVRfQklOUyAtIDE7CisKKyAgS01QX0RFQlVHX0FTU0VSVChzaXplID4gMCk7CisKKyAgd2hpbGUgKChoaSAtIGxvKSA+IDEpIHsKKyAgICBpbnQgbWlkID0gKGxvICsgaGkpID4+IDE7CisgICAgaWYgKHNpemUgPCBiZ2V0X2Jpbl9zaXplW21pZF0pCisgICAgICBoaSA9IG1pZCAtIDE7CisgICAgZWxzZQorICAgICAgbG8gPSBtaWQ7CisgIH0KKworICBLTVBfREVCVUdfQVNTRVJUKChsbyA+PSAwKSAmJiAobG8gPCBNQVhfQkdFVF9CSU5TKSk7CisKKyAgcmV0dXJuIGxvOworfQorCitzdGF0aWMgdm9pZCBzZXRfdGhyX2RhdGEoa21wX2luZm9fdCAqdGgpIHsKKyAgaW50IGk7CisgIHRocl9kYXRhX3QgKmRhdGE7CisKKyAgZGF0YSA9ICh0aHJfZGF0YV90ICopKCghdGgtPnRoLnRoX2xvY2FsLmJnZXRfZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF9fa21wX2FsbG9jYXRlKHNpemVvZigqZGF0YSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aC0+dGgudGhfbG9jYWwuYmdldF9kYXRhKTsKKworICBtZW1zZXQoZGF0YSwgJ1wwJywgc2l6ZW9mKCpkYXRhKSk7CisKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9CR0VUX0JJTlM7ICsraSkgeworICAgIGRhdGEtPmZyZWVsaXN0W2ldLnFsLmZsaW5rID0gJmRhdGEtPmZyZWVsaXN0W2ldOworICAgIGRhdGEtPmZyZWVsaXN0W2ldLnFsLmJsaW5rID0gJmRhdGEtPmZyZWVsaXN0W2ldOworICB9CisKKyAgdGgtPnRoLnRoX2xvY2FsLmJnZXRfZGF0YSA9IGRhdGE7CisgIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xpc3QgPSAwOworI2lmICFVU0VfQ01QX1hDSEdfRk9SX0JHRVQKKyNpZmRlZiBVU0VfUVVFVUlOR19MT0NLX0ZPUl9CR0VUCisgIF9fa21wX2luaXRfbG9jaygmdGgtPnRoLnRoX2xvY2FsLmJnZXRfbG9jayk7CisjZWxzZQorICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCZ0aC0+dGgudGhfbG9jYWwuYmdldF9sb2NrKTsKKyNlbmRpZiAvKiBVU0VfTE9DS19GT1JfQkdFVCAqLworI2VuZGlmIC8qICEgVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUICovCit9CisKK3N0YXRpYyB0aHJfZGF0YV90ICpnZXRfdGhyX2RhdGEoa21wX2luZm9fdCAqdGgpIHsKKyAgdGhyX2RhdGFfdCAqZGF0YTsKKworICBkYXRhID0gKHRocl9kYXRhX3QgKil0aC0+dGgudGhfbG9jYWwuYmdldF9kYXRhOworCisgIEtNUF9ERUJVR19BU1NFUlQoZGF0YSAhPSAwKTsKKworICByZXR1cm4gZGF0YTsKK30KKworI2lmZGVmIEtNUF9ERUJVRworCitzdGF0aWMgdm9pZCBfX2ttcF9iZ2V0X3ZhbGlkYXRlX3F1ZXVlKGttcF9pbmZvX3QgKnRoKSB7CisgIC8qIE5PVEU6IGFzc3VtZSB0aGF0IHRoZSBnbG9iYWxfbG9jayBpcyBoZWxkICovCisKKyAgdm9pZCAqcCA9ICh2b2lkICopdGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdDsKKworICB3aGlsZSAocCAhPSAwKSB7CisgICAgYmZoZWFkX3QgKmIgPSBCRkgoKChjaGFyICopcCkgLSBzaXplb2YoYmhlYWRfdCkpOworCisgICAgS01QX0RFQlVHX0FTU0VSVChiLT5iaC5iYi5ic2l6ZSAhPSAwKTsKKyAgICBwID0gKHZvaWQgKiliLT5xbC5mbGluazsKKyAgfQorfQorCisjZW5kaWYKKworLyogV2FsayB0aGUgZnJlZSBsaXN0IGFuZCByZWxlYXNlIHRoZSBlbnF1ZXVlZCBidWZmZXJzICovCitzdGF0aWMgdm9pZCBfX2ttcF9iZ2V0X2RlcXVldWUoa21wX2luZm9fdCAqdGgpIHsKKyAgdm9pZCAqcCA9IFRDUl9TWU5DX1BUUih0aC0+dGgudGhfbG9jYWwuYmdldF9saXN0KTsKKworICBpZiAocCAhPSAwKSB7CisjaWYgVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUCisgICAgeworICAgICAgdm9sYXRpbGUgdm9pZCAqb2xkX3ZhbHVlID0gVENSX1NZTkNfUFRSKHRoLT50aC50aF9sb2NhbC5iZ2V0X2xpc3QpOworICAgICAgd2hpbGUgKCFLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKCZ0aC0+dGgudGhfbG9jYWwuYmdldF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDQVNUKHZvaWQgKiwgb2xkX3ZhbHVlKSwgbnVsbHB0cikpIHsKKyAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfU1lOQ19QVFIodGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCk7CisgICAgICB9CisgICAgICBwID0gQ0NBU1Qodm9pZCAqLCBvbGRfdmFsdWUpOworICAgIH0KKyNlbHNlIC8qICEgVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUICovCisjaWZkZWYgVVNFX1FVRVVJTkdfTE9DS19GT1JfQkdFVAorICAgIF9fa21wX2FjcXVpcmVfbG9jaygmdGgtPnRoLnRoX2xvY2FsLmJnZXRfbG9jaywgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aCkpOworI2Vsc2UKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCZ0aC0+dGgudGhfbG9jYWwuYmdldF9sb2NrKTsKKyNlbmRpZiAvKiBVU0VfUVVFVUlOR19MT0NLX0ZPUl9CR0VUICovCisKKyAgICBwID0gKHZvaWQgKil0aC0+dGgudGhfbG9jYWwuYmdldF9saXN0OworICAgIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xpc3QgPSAwOworCisjaWZkZWYgVVNFX1FVRVVJTkdfTE9DS19GT1JfQkdFVAorICAgIF9fa21wX3JlbGVhc2VfbG9jaygmdGgtPnRoLnRoX2xvY2FsLmJnZXRfbG9jaywgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aCkpOworI2Vsc2UKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCZ0aC0+dGgudGhfbG9jYWwuYmdldF9sb2NrKTsKKyNlbmRpZgorI2VuZGlmIC8qIFVTRV9DTVBfWENIR19GT1JfQkdFVCAqLworCisgICAgLyogQ2hlY2sgYWdhaW4gdG8gbWFrZSBzdXJlIHRoZSBsaXN0IGlzIG5vdCBlbXB0eSAqLworICAgIHdoaWxlIChwICE9IDApIHsKKyAgICAgIHZvaWQgKmJ1ZiA9IHA7CisgICAgICBiZmhlYWRfdCAqYiA9IEJGSCgoKGNoYXIgKilwKSAtIHNpemVvZihiaGVhZF90KSk7CisKKyAgICAgIEtNUF9ERUJVR19BU1NFUlQoYi0+YmguYmIuYnNpemUgIT0gMCk7CisgICAgICBLTVBfREVCVUdfQVNTRVJUKCgoa21wX3VpbnRwdHJfdClUQ1JfUFRSKGItPmJoLmJiLmJ0aHIpICYgfjEpID09CisgICAgICAgICAgICAgICAgICAgICAgIChrbXBfdWludHB0cl90KXRoKTsgLy8gY2xlYXIgcG9zc2libGUgbWFyaworICAgICAgS01QX0RFQlVHX0FTU0VSVChiLT5xbC5ibGluayA9PSAwKTsKKworICAgICAgcCA9ICh2b2lkICopYi0+cWwuZmxpbms7CisKKyAgICAgIGJyZWwodGgsIGJ1Zik7CisgICAgfQorICB9Cit9CisKKy8qIENoYWluIHRvZ2V0aGVyIHRoZSBmcmVlIGJ1ZmZlcnMgYnkgdXNpbmcgdGhlIHRocmVhZCBvd25lciBmaWVsZCAqLworc3RhdGljIHZvaWQgX19rbXBfYmdldF9lbnF1ZXVlKGttcF9pbmZvX3QgKnRoLCB2b2lkICpidWYKKyNpZmRlZiBVU0VfUVVFVUlOR19MT0NLX0ZPUl9CR0VUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiByZWxfZ3RpZAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7CisgIGJmaGVhZF90ICpiID0gQkZIKCgoY2hhciAqKWJ1ZikgLSBzaXplb2YoYmhlYWRfdCkpOworCisgIEtNUF9ERUJVR19BU1NFUlQoYi0+YmguYmIuYnNpemUgIT0gMCk7CisgIEtNUF9ERUJVR19BU1NFUlQoKChrbXBfdWludHB0cl90KVRDUl9QVFIoYi0+YmguYmIuYnRocikgJiB+MSkgPT0KKyAgICAgICAgICAgICAgICAgICAoa21wX3VpbnRwdHJfdCl0aCk7IC8vIGNsZWFyIHBvc3NpYmxlIG1hcmsKKworICBiLT5xbC5ibGluayA9IDA7CisKKyAgS0NfVFJBQ0UoMTAsICgiX19rbXBfYmdldF9lbnF1ZXVlOiBtb3ZpbmcgYnVmZmVyIHRvIFQjJWQgbGlzdFxuIiwKKyAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRoKSkpOworCisjaWYgVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUCisgIHsKKyAgICB2b2xhdGlsZSB2b2lkICpvbGRfdmFsdWUgPSBUQ1JfUFRSKHRoLT50aC50aF9sb2NhbC5iZ2V0X2xpc3QpOworICAgIC8qIHRoZSBuZXh0IHBvaW50ZXIgbXVzdCBiZSBzZXQgYmVmb3JlIHNldHRpbmcgYmdldF9saXN0IHRvIGJ1ZiB0byBhdm9pZAorICAgICAgIGV4cG9zaW5nIGEgYnJva2VuIGxpc3QgdG8gb3RoZXIgdGhyZWFkcywgZXZlbiBmb3IgYW4gaW5zdGFudC4gKi8KKyAgICBiLT5xbC5mbGluayA9IEJGSChDQ0FTVCh2b2lkICosIG9sZF92YWx1ZSkpOworCisgICAgd2hpbGUgKCFLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKCZ0aC0+dGgudGhfbG9jYWwuYmdldF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ0FTVCh2b2lkICosIG9sZF92YWx1ZSksIGJ1ZikpIHsKKyAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgIG9sZF92YWx1ZSA9IFRDUl9QVFIodGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCk7CisgICAgICAvKiB0aGUgbmV4dCBwb2ludGVyIG11c3QgYmUgc2V0IGJlZm9yZSBzZXR0aW5nIGJnZXRfbGlzdCB0byBidWYgdG8gYXZvaWQKKyAgICAgICAgIGV4cG9zaW5nIGEgYnJva2VuIGxpc3QgdG8gb3RoZXIgdGhyZWFkcywgZXZlbiBmb3IgYW4gaW5zdGFudC4gKi8KKyAgICAgIGItPnFsLmZsaW5rID0gQkZIKENDQVNUKHZvaWQgKiwgb2xkX3ZhbHVlKSk7CisgICAgfQorICB9CisjZWxzZSAvKiAhIFVTRV9DTVBfWENIR19GT1JfQkdFVCAqLworI2lmZGVmIFVTRV9RVUVVSU5HX0xPQ0tfRk9SX0JHRVQKKyAgX19rbXBfYWNxdWlyZV9sb2NrKCZ0aC0+dGgudGhfbG9jYWwuYmdldF9sb2NrLCByZWxfZ3RpZCk7CisjZWxzZQorICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCZ0aC0+dGgudGhfbG9jYWwuYmdldF9sb2NrKTsKKyNlbmRpZgorCisgIGItPnFsLmZsaW5rID0gQkZIKHRoLT50aC50aF9sb2NhbC5iZ2V0X2xpc3QpOworICB0aC0+dGgudGhfbG9jYWwuYmdldF9saXN0ID0gKHZvaWQgKilidWY7CisKKyNpZmRlZiBVU0VfUVVFVUlOR19MT0NLX0ZPUl9CR0VUCisgIF9fa21wX3JlbGVhc2VfbG9jaygmdGgtPnRoLnRoX2xvY2FsLmJnZXRfbG9jaywgcmVsX2d0aWQpOworI2Vsc2UKKyAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jaygmdGgtPnRoLnRoX2xvY2FsLmJnZXRfbG9jayk7CisjZW5kaWYKKyNlbmRpZiAvKiBVU0VfQ01QX1hDSEdfRk9SX0JHRVQgKi8KK30KKworLyogaW5zZXJ0IGJ1ZmZlciBiYWNrIG9udG8gYSBuZXcgZnJlZWxpc3QgKi8KK3N0YXRpYyB2b2lkIF9fa21wX2JnZXRfaW5zZXJ0X2ludG9fZnJlZWxpc3QodGhyX2RhdGFfdCAqdGhyLCBiZmhlYWRfdCAqYikgeworICBpbnQgYmluOworCisgIEtNUF9ERUJVR19BU1NFUlQoKChzaXplX3QpYikgJSBTaXplUXVhbnQgPT0gMCk7CisgIEtNUF9ERUJVR19BU1NFUlQoYi0+YmguYmIuYnNpemUgJSBTaXplUXVhbnQgPT0gMCk7CisKKyAgYmluID0gYmdldF9nZXRfYmluKGItPmJoLmJiLmJzaXplKTsKKworICBLTVBfREVCVUdfQVNTRVJUKHRoci0+ZnJlZWxpc3RbYmluXS5xbC5ibGluay0+cWwuZmxpbmsgPT0KKyAgICAgICAgICAgICAgICAgICAmdGhyLT5mcmVlbGlzdFtiaW5dKTsKKyAgS01QX0RFQlVHX0FTU0VSVCh0aHItPmZyZWVsaXN0W2Jpbl0ucWwuZmxpbmstPnFsLmJsaW5rID09CisgICAgICAgICAgICAgICAgICAgJnRoci0+ZnJlZWxpc3RbYmluXSk7CisKKyAgYi0+cWwuZmxpbmsgPSAmdGhyLT5mcmVlbGlzdFtiaW5dOworICBiLT5xbC5ibGluayA9IHRoci0+ZnJlZWxpc3RbYmluXS5xbC5ibGluazsKKworICB0aHItPmZyZWVsaXN0W2Jpbl0ucWwuYmxpbmsgPSBiOworICBiLT5xbC5ibGluay0+cWwuZmxpbmsgPSBiOworfQorCisvKiB1bmxpbmsgdGhlIGJ1ZmZlciBmcm9tIHRoZSBvbGQgZnJlZWxpc3QgKi8KK3N0YXRpYyB2b2lkIF9fa21wX2JnZXRfcmVtb3ZlX2Zyb21fZnJlZWxpc3QoYmZoZWFkX3QgKmIpIHsKKyAgS01QX0RFQlVHX0FTU0VSVChiLT5xbC5ibGluay0+cWwuZmxpbmsgPT0gYik7CisgIEtNUF9ERUJVR19BU1NFUlQoYi0+cWwuZmxpbmstPnFsLmJsaW5rID09IGIpOworCisgIGItPnFsLmJsaW5rLT5xbC5mbGluayA9IGItPnFsLmZsaW5rOworICBiLT5xbC5mbGluay0+cWwuYmxpbmsgPSBiLT5xbC5ibGluazsKK30KKworLyogIEdFVCBTVEFUUyAtLSBjaGVjayBpbmZvIG9uIGZyZWUgbGlzdCAqLworc3RhdGljIHZvaWQgYmNoZWNrKGttcF9pbmZvX3QgKnRoLCBidWZzaXplICptYXhfZnJlZSwgYnVmc2l6ZSAqdG90YWxfZnJlZSkgeworICB0aHJfZGF0YV90ICp0aHIgPSBnZXRfdGhyX2RhdGEodGgpOworICBpbnQgYmluOworCisgICp0b3RhbF9mcmVlID0gKm1heF9mcmVlID0gMDsKKworICBmb3IgKGJpbiA9IDA7IGJpbiA8IE1BWF9CR0VUX0JJTlM7ICsrYmluKSB7CisgICAgYmZoZWFkX3QgKmIsICpiZXN0OworCisgICAgYmVzdCA9ICZ0aHItPmZyZWVsaXN0W2Jpbl07CisgICAgYiA9IGJlc3QtPnFsLmZsaW5rOworCisgICAgd2hpbGUgKGIgIT0gJnRoci0+ZnJlZWxpc3RbYmluXSkgeworICAgICAgKnRvdGFsX2ZyZWUgKz0gKGItPmJoLmJiLmJzaXplIC0gc2l6ZW9mKGJoZWFkX3QpKTsKKyAgICAgIGlmICgoYmVzdCA9PSAmdGhyLT5mcmVlbGlzdFtiaW5dKSB8fCAoYi0+YmguYmIuYnNpemUgPCBiZXN0LT5iaC5iYi5ic2l6ZSkpCisgICAgICAgIGJlc3QgPSBiOworCisgICAgICAvKiBMaW5rIHRvIG5leHQgYnVmZmVyICovCisgICAgICBiID0gYi0+cWwuZmxpbms7CisgICAgfQorCisgICAgaWYgKCptYXhfZnJlZSA8IGJlc3QtPmJoLmJiLmJzaXplKQorICAgICAgKm1heF9mcmVlID0gYmVzdC0+YmguYmIuYnNpemU7CisgIH0KKworICBpZiAoKm1heF9mcmVlID4gKGJ1ZnNpemUpc2l6ZW9mKGJoZWFkX3QpKQorICAgICptYXhfZnJlZSAtPSBzaXplb2YoYmhlYWRfdCk7Cit9CisKKy8qICBCR0VUICAtLSAgQWxsb2NhdGUgYSBidWZmZXIuICAqLworc3RhdGljIHZvaWQgKmJnZXQoa21wX2luZm9fdCAqdGgsIGJ1ZnNpemUgcmVxdWVzdGVkX3NpemUpIHsKKyAgdGhyX2RhdGFfdCAqdGhyID0gZ2V0X3Rocl9kYXRhKHRoKTsKKyAgYnVmc2l6ZSBzaXplID0gcmVxdWVzdGVkX3NpemU7CisgIGJmaGVhZF90ICpiOworICB2b2lkICpidWY7CisgIGludCBjb21wYWN0c2VxID0gMDsKKyAgaW50IHVzZV9ibGluayA9IDA7CisgIC8qIEZvciBCZXN0Rml0ICovCisgIGJmaGVhZF90ICpiZXN0OworCisgIGlmIChzaXplIDwgMCB8fCBzaXplICsgc2l6ZW9mKGJoZWFkX3QpID4gTWF4U2l6ZSkgeworICAgIHJldHVybiBOVUxMOworICB9OyAvLyBpZgorCisgIF9fa21wX2JnZXRfZGVxdWV1ZSh0aCk7IC8qIFJlbGVhc2UgYW55IHF1ZXVlZCBidWZmZXJzICovCisKKyAgaWYgKHNpemUgPCAoYnVmc2l6ZSlTaXplUSkgeyAvLyBOZWVkIGF0IGxlYXN0IHJvb20gZm9yIHRoZSBxdWV1ZSBsaW5rcy4KKyAgICBzaXplID0gU2l6ZVE7CisgIH0KKyNpZiBkZWZpbmVkKFNpemVRdWFudCkgJiYgKFNpemVRdWFudCA+IDEpCisgIHNpemUgPSAoc2l6ZSArIChTaXplUXVhbnQgLSAxKSkgJiAofihTaXplUXVhbnQgLSAxKSk7CisjZW5kaWYKKworICBzaXplICs9IHNpemVvZihiaGVhZF90KTsgLy8gQWRkIG92ZXJoZWFkIGluIGFsbG9jYXRlZCBidWZmZXIgdG8gc2l6ZSByZXF1aXJlZC4KKyAgS01QX0RFQlVHX0FTU0VSVChzaXplID49IDApOworICBLTVBfREVCVUdfQVNTRVJUKHNpemUgJSBTaXplUXVhbnQgPT0gMCk7CisKKyAgdXNlX2JsaW5rID0gKHRoci0+bW9kZSA9PSBiZ2V0X21vZGVfbGlmbyk7CisKKyAgLyogSWYgYSBjb21wYWN0IGZ1bmN0aW9uIHdhcyBwcm92aWRlZCBpbiB0aGUgY2FsbCB0byBiZWN0bCgpLCB3cmFwCisgICAgIGEgbG9vcCBhcm91bmQgdGhlIGFsbG9jYXRpb24gcHJvY2VzcyAgdG8gIGFsbG93ICBjb21wYWN0aW9uICB0bworICAgICBpbnRlcnZlbmUgaW4gY2FzZSB3ZSBkb24ndCBmaW5kIGEgc3VpdGFibGUgYnVmZmVyIGluIHRoZSBjaGFpbi4gKi8KKworICBmb3IgKDs7KSB7CisgICAgaW50IGJpbjsKKworICAgIGZvciAoYmluID0gYmdldF9nZXRfYmluKHNpemUpOyBiaW4gPCBNQVhfQkdFVF9CSU5TOyArK2JpbikgeworICAgICAgLyogTGluayB0byBuZXh0IGJ1ZmZlciAqLworICAgICAgYiA9ICh1c2VfYmxpbmsgPyB0aHItPmZyZWVsaXN0W2Jpbl0ucWwuYmxpbmsKKyAgICAgICAgICAgICAgICAgICAgIDogdGhyLT5mcmVlbGlzdFtiaW5dLnFsLmZsaW5rKTsKKworICAgICAgaWYgKHRoci0+bW9kZSA9PSBiZ2V0X21vZGVfYmVzdCkgeworICAgICAgICBiZXN0ID0gJnRoci0+ZnJlZWxpc3RbYmluXTsKKworICAgICAgICAvKiBTY2FuIHRoZSBmcmVlIGxpc3Qgc2VhcmNoaW5nIGZvciB0aGUgZmlyc3QgYnVmZmVyIGJpZyBlbm91Z2gKKyAgICAgICAgICAgdG8gaG9sZCB0aGUgcmVxdWVzdGVkIHNpemUgYnVmZmVyLiAqLworICAgICAgICB3aGlsZSAoYiAhPSAmdGhyLT5mcmVlbGlzdFtiaW5dKSB7CisgICAgICAgICAgaWYgKGItPmJoLmJiLmJzaXplID49IChidWZzaXplKXNpemUpIHsKKyAgICAgICAgICAgIGlmICgoYmVzdCA9PSAmdGhyLT5mcmVlbGlzdFtiaW5dKSB8fAorICAgICAgICAgICAgICAgIChiLT5iaC5iYi5ic2l6ZSA8IGJlc3QtPmJoLmJiLmJzaXplKSkgeworICAgICAgICAgICAgICBiZXN0ID0gYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBMaW5rIHRvIG5leHQgYnVmZmVyICovCisgICAgICAgICAgYiA9ICh1c2VfYmxpbmsgPyBiLT5xbC5ibGluayA6IGItPnFsLmZsaW5rKTsKKyAgICAgICAgfQorICAgICAgICBiID0gYmVzdDsKKyAgICAgIH0KKworICAgICAgd2hpbGUgKGIgIT0gJnRoci0+ZnJlZWxpc3RbYmluXSkgeworICAgICAgICBpZiAoKGJ1ZnNpemUpYi0+YmguYmIuYnNpemUgPj0gKGJ1ZnNpemUpc2l6ZSkgeworCisgICAgICAgICAgLy8gQnVmZmVyIGlzIGJpZyBlbm91Z2ggdG8gc2F0aXNmeSB0aGUgcmVxdWVzdC4gQWxsb2NhdGUgaXQgdG8gdGhlCisgICAgICAgICAgLy8gY2FsbGVyLiBXZSBtdXN0IGRlY2lkZSB3aGV0aGVyIHRoZSBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoIHRvIHNwbGl0CisgICAgICAgICAgLy8gaW50byB0aGUgcGFydCBnaXZlbiB0byB0aGUgY2FsbGVyIGFuZCBhIGZyZWUgYnVmZmVyIHRoYXQgcmVtYWlucworICAgICAgICAgIC8vIG9uIHRoZSBmcmVlIGxpc3QsIG9yIHdoZXRoZXIgdGhlIGVudGlyZSBidWZmZXIgc2hvdWxkIGJlIHJlbW92ZWQKKyAgICAgICAgICAvLyBmcm9tIHRoZSBmcmVlIGxpc3QgYW5kIGdpdmVuIHRvIHRoZSBjYWxsZXIgaW4gaXRzIGVudGlyZXR5LiBXZQorICAgICAgICAgIC8vIG9ubHkgc3BsaXQgdGhlIGJ1ZmZlciBpZiBlbm91Z2ggcm9vbSByZW1haW5zIGZvciBhIGhlYWRlciBwbHVzIHRoZQorICAgICAgICAgIC8vIG1pbmltdW0gcXVhbnR1bSBvZiBhbGxvY2F0aW9uLgorICAgICAgICAgIGlmICgoYi0+YmguYmIuYnNpemUgLSAoYnVmc2l6ZSlzaXplKSA+CisgICAgICAgICAgICAgIChidWZzaXplKShTaXplUSArIChzaXplb2YoYmhlYWRfdCkpKSkgeworICAgICAgICAgICAgYmhlYWRfdCAqYmEsICpibjsKKworICAgICAgICAgICAgYmEgPSBCSCgoKGNoYXIgKiliKSArIChiLT5iaC5iYi5ic2l6ZSAtIChidWZzaXplKXNpemUpKTsKKyAgICAgICAgICAgIGJuID0gQkgoKChjaGFyICopYmEpICsgc2l6ZSk7CisKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYm4tPmJiLnByZXZmcmVlID09IGItPmJoLmJiLmJzaXplKTsKKworICAgICAgICAgICAgLyogU3VidHJhY3Qgc2l6ZSBmcm9tIGxlbmd0aCBvZiBmcmVlIGJsb2NrLiAqLworICAgICAgICAgICAgYi0+YmguYmIuYnNpemUgLT0gKGJ1ZnNpemUpc2l6ZTsKKworICAgICAgICAgICAgLyogTGluayBhbGxvY2F0ZWQgYnVmZmVyIHRvIHRoZSBwcmV2aW91cyBmcmVlIGJ1ZmZlci4gKi8KKyAgICAgICAgICAgIGJhLT5iYi5wcmV2ZnJlZSA9IGItPmJoLmJiLmJzaXplOworCisgICAgICAgICAgICAvKiBQbHVnIG5lZ2F0aXZlIHNpemUgaW50byB1c2VyIGJ1ZmZlci4gKi8KKyAgICAgICAgICAgIGJhLT5iYi5ic2l6ZSA9IC1zaXplOworCisgICAgICAgICAgICAvKiBNYXJrIHRoaXMgYnVmZmVyIGFzIG93bmVkIGJ5IHRoaXMgdGhyZWFkLiAqLworICAgICAgICAgICAgVENXX1BUUihiYS0+YmIuYnRociwKKyAgICAgICAgICAgICAgICAgICAgdGgpOyAvLyBub3QgYW4gYWxsb2NhdGVkIGFkZHJlc3MgKGRvIG5vdCBtYXJrIGl0KQorICAgICAgICAgICAgLyogTWFyayBidWZmZXIgYWZ0ZXIgdGhpcyBvbmUgbm90IHByZWNlZGVkIGJ5IGZyZWUgYmxvY2suICovCisgICAgICAgICAgICBibi0+YmIucHJldmZyZWUgPSAwOworCisgICAgICAgICAgICAvLyB1bmxpbmsgYnVmZmVyIGZyb20gb2xkIGZyZWVsaXN0LCBhbmQgcmVpbnNlcnQgaW50byBuZXcgZnJlZWxpc3QKKyAgICAgICAgICAgIF9fa21wX2JnZXRfcmVtb3ZlX2Zyb21fZnJlZWxpc3QoYik7CisgICAgICAgICAgICBfX2ttcF9iZ2V0X2luc2VydF9pbnRvX2ZyZWVsaXN0KHRociwgYik7CisjaWYgQnVmU3RhdHMKKyAgICAgICAgICAgIHRoci0+dG90YWxsb2MgKz0gKHNpemVfdClzaXplOworICAgICAgICAgICAgdGhyLT5udW1nZXQrKzsgLyogSW5jcmVtZW50IG51bWJlciBvZiBiZ2V0KCkgY2FsbHMgKi8KKyNlbmRpZgorICAgICAgICAgICAgYnVmID0gKHZvaWQgKikoKCgoY2hhciAqKWJhKSArIHNpemVvZihiaGVhZF90KSkpOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgoKHNpemVfdClidWYpICUgU2l6ZVF1YW50ID09IDApOworICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYmhlYWRfdCAqYmE7CisKKyAgICAgICAgICAgIGJhID0gQkgoKChjaGFyICopYikgKyBiLT5iaC5iYi5ic2l6ZSk7CisKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYmEtPmJiLnByZXZmcmVlID09IGItPmJoLmJiLmJzaXplKTsKKworICAgICAgICAgICAgLyogVGhlIGJ1ZmZlciBpc24ndCBiaWcgZW5vdWdoIHRvIHNwbGl0LiAgR2l2ZSAgdGhlICB3aG9sZQorICAgICAgICAgICAgICAgc2hlYmFuZyB0byB0aGUgY2FsbGVyIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgZnJlZSBsaXN0LiAqLworCisgICAgICAgICAgICBfX2ttcF9iZ2V0X3JlbW92ZV9mcm9tX2ZyZWVsaXN0KGIpOworI2lmIEJ1ZlN0YXRzCisgICAgICAgICAgICB0aHItPnRvdGFsbG9jICs9IChzaXplX3QpYi0+YmguYmIuYnNpemU7CisgICAgICAgICAgICB0aHItPm51bWdldCsrOyAvKiBJbmNyZW1lbnQgbnVtYmVyIG9mIGJnZXQoKSBjYWxscyAqLworI2VuZGlmCisgICAgICAgICAgICAvKiBOZWdhdGUgc2l6ZSB0byBtYXJrIGJ1ZmZlciBhbGxvY2F0ZWQuICovCisgICAgICAgICAgICBiLT5iaC5iYi5ic2l6ZSA9IC0oYi0+YmguYmIuYnNpemUpOworCisgICAgICAgICAgICAvKiBNYXJrIHRoaXMgYnVmZmVyIGFzIG93bmVkIGJ5IHRoaXMgdGhyZWFkLiAqLworICAgICAgICAgICAgVENXX1BUUihiYS0+YmIuYnRociwgdGgpOyAvLyBub3QgYW4gYWxsb2NhdGVkIGFkZHJlc3MgKGRvIG5vdCBtYXJrKQorICAgICAgICAgICAgLyogWmVybyB0aGUgYmFjayBwb2ludGVyIGluIHRoZSBuZXh0IGJ1ZmZlciBpbiBtZW1vcnkKKyAgICAgICAgICAgICAgIHRvIGluZGljYXRlIHRoYXQgdGhpcyBidWZmZXIgaXMgYWxsb2NhdGVkLiAqLworICAgICAgICAgICAgYmEtPmJiLnByZXZmcmVlID0gMDsKKworICAgICAgICAgICAgLyogR2l2ZSB1c2VyIGJ1ZmZlciBzdGFydGluZyBhdCBxdWV1ZSBsaW5rcy4gKi8KKyAgICAgICAgICAgIGJ1ZiA9ICh2b2lkICopJihiLT5xbCk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCgoc2l6ZV90KWJ1ZikgJSBTaXplUXVhbnQgPT0gMCk7CisgICAgICAgICAgICByZXR1cm4gYnVmOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIExpbmsgdG8gbmV4dCBidWZmZXIgKi8KKyAgICAgICAgYiA9ICh1c2VfYmxpbmsgPyBiLT5xbC5ibGluayA6IGItPnFsLmZsaW5rKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBXZSBmYWlsZWQgdG8gZmluZCBhIGJ1ZmZlci4gSWYgdGhlcmUncyBhIGNvbXBhY3QgZnVuY3Rpb24gZGVmaW5lZCwKKyAgICAgICBub3RpZnkgaXQgb2YgdGhlIHNpemUgcmVxdWVzdGVkLiBJZiBpdCByZXR1cm5zIFRSVUUsIHRyeSB0aGUgYWxsb2NhdGlvbgorICAgICAgIGFnYWluLiAqLworCisgICAgaWYgKCh0aHItPmNvbXBmY24gPT0gMCkgfHwgKCEoKnRoci0+Y29tcGZjbikoc2l6ZSwgKytjb21wYWN0c2VxKSkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8qIE5vIGJ1ZmZlciBhdmFpbGFibGUgd2l0aCByZXF1ZXN0ZWQgc2l6ZSBmcmVlLiAqLworCisgIC8qIERvbid0IGdpdmUgdXAgeWV0IC0tIGxvb2sgaW4gdGhlIHJlc2VydmUgc3VwcGx5LiAqLworICBpZiAodGhyLT5hY3FmY24gIT0gMCkgeworICAgIGlmIChzaXplID4gKGJ1ZnNpemUpKHRoci0+ZXhwX2luY3IgLSBzaXplb2YoYmhlYWRfdCkpKSB7CisgICAgICAvKiBSZXF1ZXN0IGlzIHRvbyBsYXJnZSB0byBmaXQgaW4gYSBzaW5nbGUgZXhwYW5zaW9uIGJsb2NrLgorICAgICAgICAgVHJ5IHRvIHNhdGlzeSBpdCBieSBhIGRpcmVjdCBidWZmZXIgYWNxdWlzaXRpb24uICovCisgICAgICBiZGhlYWRfdCAqYmRoOworCisgICAgICBzaXplICs9IHNpemVvZihiZGhlYWRfdCkgLSBzaXplb2YoYmhlYWRfdCk7CisKKyAgICAgIEtFX1RSQUNFKDEwLCAoIiUlJSUlJSBNQUxMT0MoICVkIClcbiIsIChpbnQpc2l6ZSkpOworCisgICAgICAvKiByaWNocnlhbiAqLworICAgICAgYmRoID0gQkRIKCgqdGhyLT5hY3FmY24pKChidWZzaXplKXNpemUpKTsKKyAgICAgIGlmIChiZGggIT0gTlVMTCkgeworCisgICAgICAgIC8vIE1hcmsgdGhlIGJ1ZmZlciBzcGVjaWFsIGJ5IHNldHRpbmcgc2l6ZSBmaWVsZCBvZiBpdHMgaGVhZGVyIHRvIHplcm8uCisgICAgICAgIGJkaC0+YmguYmIuYnNpemUgPSAwOworCisgICAgICAgIC8qIE1hcmsgdGhpcyBidWZmZXIgYXMgb3duZWQgYnkgdGhpcyB0aHJlYWQuICovCisgICAgICAgIFRDV19QVFIoYmRoLT5iaC5iYi5idGhyLCB0aCk7IC8vIGRvbid0IG1hcmsgYnVmZmVyIGFzIGFsbG9jYXRlZCwKKyAgICAgICAgLy8gYmVjYXVzZSBkaXJlY3QgYnVmZmVyIG5ldmVyIGdvZXMgdG8gZnJlZSBsaXN0CisgICAgICAgIGJkaC0+YmguYmIucHJldmZyZWUgPSAwOworICAgICAgICBiZGgtPnRzaXplID0gc2l6ZTsKKyNpZiBCdWZTdGF0cworICAgICAgICB0aHItPnRvdGFsbG9jICs9IChzaXplX3Qpc2l6ZTsKKyAgICAgICAgdGhyLT5udW1nZXQrKzsgLyogSW5jcmVtZW50IG51bWJlciBvZiBiZ2V0KCkgY2FsbHMgKi8KKyAgICAgICAgdGhyLT5udW1kZ2V0Kys7IC8qIERpcmVjdCBiZ2V0KCkgY2FsbCBjb3VudCAqLworI2VuZGlmCisgICAgICAgIGJ1ZiA9ICh2b2lkICopKGJkaCArIDEpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCgoc2l6ZV90KWJ1ZikgJSBTaXplUXVhbnQgPT0gMCk7CisgICAgICAgIHJldHVybiBidWY7CisgICAgICB9CisKKyAgICB9IGVsc2UgeworCisgICAgICAvKiAgVHJ5IHRvIG9idGFpbiBhIG5ldyBleHBhbnNpb24gYmxvY2sgKi8KKyAgICAgIHZvaWQgKm5ld3Bvb2w7CisKKyAgICAgIEtFX1RSQUNFKDEwLCAoIiUlJSUlJSBNQUxMT0NCKCAlZCApXG4iLCAoaW50KXRoci0+ZXhwX2luY3IpKTsKKworICAgICAgLyogcmljaHJ5YW4gKi8KKyAgICAgIG5ld3Bvb2wgPSAoKnRoci0+YWNxZmNuKSgoYnVmc2l6ZSl0aHItPmV4cF9pbmNyKTsKKyAgICAgIEtNUF9ERUJVR19BU1NFUlQoKChzaXplX3QpbmV3cG9vbCkgJSBTaXplUXVhbnQgPT0gMCk7CisgICAgICBpZiAobmV3cG9vbCAhPSBOVUxMKSB7CisgICAgICAgIGJwb29sKHRoLCBuZXdwb29sLCB0aHItPmV4cF9pbmNyKTsKKyAgICAgICAgYnVmID0gYmdldCgKKyAgICAgICAgICAgIHRoLCByZXF1ZXN0ZWRfc2l6ZSk7IC8qIFRoaXMgY2FuJ3QsIEkgc2F5LCBjYW4ndCBnZXQgaW50byBhIGxvb3AuICovCisgICAgICAgIHJldHVybiBidWY7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogIFN0aWxsIG5vIGJ1ZmZlciBhdmFpbGFibGUgKi8KKworICByZXR1cm4gTlVMTDsKK30KKworLyogIEJHRVRaICAtLSAgQWxsb2NhdGUgYSBidWZmZXIgYW5kIGNsZWFyIGl0cyBjb250ZW50cyB0byB6ZXJvLiAgV2UgY2xlYXIKKyAgICAgICAgICAgICAgIHRoZSAgZW50aXJlICBjb250ZW50cyAgb2YgIHRoZSBidWZmZXIgdG8gemVybywgbm90IGp1c3QgdGhlCisgICAgICAgICAgICAgICByZWdpb24gcmVxdWVzdGVkIGJ5IHRoZSBjYWxsZXIuICovCisKK3N0YXRpYyB2b2lkICpiZ2V0eihrbXBfaW5mb190ICp0aCwgYnVmc2l6ZSBzaXplKSB7CisgIGNoYXIgKmJ1ZiA9IChjaGFyICopYmdldCh0aCwgc2l6ZSk7CisKKyAgaWYgKGJ1ZiAhPSBOVUxMKSB7CisgICAgYmhlYWRfdCAqYjsKKyAgICBidWZzaXplIHJzaXplOworCisgICAgYiA9IEJIKGJ1ZiAtIHNpemVvZihiaGVhZF90KSk7CisgICAgcnNpemUgPSAtKGItPmJiLmJzaXplKTsKKyAgICBpZiAocnNpemUgPT0gMCkgeworICAgICAgYmRoZWFkX3QgKmJkOworCisgICAgICBiZCA9IEJESChidWYgLSBzaXplb2YoYmRoZWFkX3QpKTsKKyAgICAgIHJzaXplID0gYmQtPnRzaXplIC0gKGJ1ZnNpemUpc2l6ZW9mKGJkaGVhZF90KTsKKyAgICB9IGVsc2UgeworICAgICAgcnNpemUgLT0gc2l6ZW9mKGJoZWFkX3QpOworICAgIH0KKworICAgIEtNUF9ERUJVR19BU1NFUlQocnNpemUgPj0gc2l6ZSk7CisKKyAgICAodm9pZCltZW1zZXQoYnVmLCAwLCAoYnVmc2l6ZSlyc2l6ZSk7CisgIH0KKyAgcmV0dXJuICgodm9pZCAqKWJ1Zik7Cit9CisKKy8qICBCR0VUUiAgLS0gIFJlYWxsb2NhdGUgYSBidWZmZXIuICBUaGlzIGlzIGEgbWluaW1hbCBpbXBsZW1lbnRhdGlvbiwKKyAgICAgICAgICAgICAgIHNpbXBseSBpbiB0ZXJtcyBvZiBicmVsKCkgIGFuZCAgYmdldCgpLiAgIEl0ICBjb3VsZCAgYmUKKyAgICAgICAgICAgICAgIGVuaGFuY2VkIHRvIGFsbG93IHRoZSBidWZmZXIgdG8gZ3JvdyBpbnRvIGFkamFjZW50IGZyZWUKKyAgICAgICAgICAgICAgIGJsb2NrcyBhbmQgdG8gYXZvaWQgbW92aW5nIGRhdGEgdW5uZWNlc3NhcmlseS4gICovCisKK3N0YXRpYyB2b2lkICpiZ2V0cihrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmLCBidWZzaXplIHNpemUpIHsKKyAgdm9pZCAqbmJ1ZjsKKyAgYnVmc2l6ZSBvc2l6ZTsgLyogT2xkIHNpemUgb2YgYnVmZmVyICovCisgIGJoZWFkX3QgKmI7CisKKyAgbmJ1ZiA9IGJnZXQodGgsIHNpemUpOworICBpZiAobmJ1ZiA9PSBOVUxMKSB7IC8qIEFjcXVpcmUgbmV3IGJ1ZmZlciAqLworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChidWYgPT0gTlVMTCkgeworICAgIHJldHVybiBuYnVmOworICB9CisgIGIgPSBCSCgoKGNoYXIgKilidWYpIC0gc2l6ZW9mKGJoZWFkX3QpKTsKKyAgb3NpemUgPSAtYi0+YmIuYnNpemU7CisgIGlmIChvc2l6ZSA9PSAwKSB7CisgICAgLyogIEJ1ZmZlciBhY3F1aXJlZCBkaXJlY3RseSB0aHJvdWdoIGFjcWZjbi4gKi8KKyAgICBiZGhlYWRfdCAqYmQ7CisKKyAgICBiZCA9IEJESCgoKGNoYXIgKilidWYpIC0gc2l6ZW9mKGJkaGVhZF90KSk7CisgICAgb3NpemUgPSBiZC0+dHNpemUgLSAoYnVmc2l6ZSlzaXplb2YoYmRoZWFkX3QpOworICB9IGVsc2UgeworICAgIG9zaXplIC09IHNpemVvZihiaGVhZF90KTsKKyAgfTsKKworICBLTVBfREVCVUdfQVNTRVJUKG9zaXplID4gMCk7CisKKyAgKHZvaWQpS01QX01FTUNQWSgoY2hhciAqKW5idWYsIChjaGFyICopYnVmLCAvKiBDb3B5IHRoZSBkYXRhICovCisgICAgICAgICAgICAgICAgICAgKHNpemVfdCkoKHNpemUgPCBvc2l6ZSkgPyBzaXplIDogb3NpemUpKTsKKyAgYnJlbCh0aCwgYnVmKTsKKworICByZXR1cm4gbmJ1ZjsKK30KKworLyogIEJSRUwgIC0tICBSZWxlYXNlIGEgYnVmZmVyLiAgKi8KK3N0YXRpYyB2b2lkIGJyZWwoa21wX2luZm9fdCAqdGgsIHZvaWQgKmJ1ZikgeworICB0aHJfZGF0YV90ICp0aHIgPSBnZXRfdGhyX2RhdGEodGgpOworICBiZmhlYWRfdCAqYiwgKmJuOworICBrbXBfaW5mb190ICpidGg7CisKKyAgS01QX0RFQlVHX0FTU0VSVChidWYgIT0gTlVMTCk7CisgIEtNUF9ERUJVR19BU1NFUlQoKChzaXplX3QpYnVmKSAlIFNpemVRdWFudCA9PSAwKTsKKworICBiID0gQkZIKCgoY2hhciAqKWJ1ZikgLSBzaXplb2YoYmhlYWRfdCkpOworCisgIGlmIChiLT5iaC5iYi5ic2l6ZSA9PSAwKSB7IC8qIERpcmVjdGx5LWFjcXVpcmVkIGJ1ZmZlcj8gKi8KKyAgICBiZGhlYWRfdCAqYmRoOworCisgICAgYmRoID0gQkRIKCgoY2hhciAqKWJ1ZikgLSBzaXplb2YoYmRoZWFkX3QpKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKGItPmJoLmJiLnByZXZmcmVlID09IDApOworI2lmIEJ1ZlN0YXRzCisgICAgdGhyLT50b3RhbGxvYyAtPSAoc2l6ZV90KWJkaC0+dHNpemU7CisgICAgdGhyLT5udW1kcmVsKys7IC8qIE51bWJlciBvZiBkaXJlY3QgcmVsZWFzZXMgKi8KKyAgICB0aHItPm51bXJlbCsrOyAvKiBJbmNyZW1lbnQgbnVtYmVyIG9mIGJyZWwoKSBjYWxscyAqLworI2VuZGlmIC8qIEJ1ZlN0YXRzICovCisjaWZkZWYgRnJlZVdpcGUKKyAgICAodm9pZCltZW1zZXQoKGNoYXIgKilidWYsIDB4NTUsIChzaXplX3QpKGJkaC0+dHNpemUgLSBzaXplb2YoYmRoZWFkX3QpKSk7CisjZW5kaWYgLyogRnJlZVdpcGUgKi8KKworICAgIEtFX1RSQUNFKDEwLCAoIiUlJSUlJSBGUkVFKCAlcCApXG4iLCAodm9pZCAqKWJkaCkpOworCisgICAgS01QX0RFQlVHX0FTU0VSVCh0aHItPnJlbGZjbiAhPSAwKTsKKyAgICAoKnRoci0+cmVsZmNuKSgodm9pZCAqKWJkaCk7IC8qIFJlbGVhc2UgaXQgZGlyZWN0bHkuICovCisgICAgcmV0dXJuOworICB9CisKKyAgYnRoID0gKGttcF9pbmZvX3QgKikoKGttcF91aW50cHRyX3QpVENSX1BUUihiLT5iaC5iYi5idGhyKSAmCisgICAgICAgICAgICAgICAgICAgICAgIH4xKTsgLy8gY2xlYXIgcG9zc2libGUgbWFyayBiZWZvcmUgY29tcGFyaXNvbgorICBpZiAoYnRoICE9IHRoKSB7CisgICAgLyogQWRkIHRoaXMgYnVmZmVyIHRvIGJlIHJlbGVhc2VkIGJ5IHRoZSBvd25pbmcgdGhyZWFkIGxhdGVyICovCisgICAgX19rbXBfYmdldF9lbnF1ZXVlKGJ0aCwgYnVmCisjaWZkZWYgVVNFX1FVRVVJTkdfTE9DS19GT1JfQkdFVAorICAgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGgpCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogQnVmZmVyIHNpemUgbXVzdCBiZSBuZWdhdGl2ZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBidWZmZXIgaXMgYWxsb2NhdGVkLiAqLworICBpZiAoYi0+YmguYmIuYnNpemUgPj0gMCkgeworICAgIGJuID0gTlVMTDsKKyAgfQorICBLTVBfREVCVUdfQVNTRVJUKGItPmJoLmJiLmJzaXplIDwgMCk7CisKKyAgLyogIEJhY2sgcG9pbnRlciBpbiBuZXh0IGJ1ZmZlciBtdXN0IGJlIHplcm8sIGluZGljYXRpbmcgdGhlIHNhbWUgdGhpbmc6ICovCisKKyAgS01QX0RFQlVHX0FTU0VSVChCSCgoY2hhciAqKWIgLSBiLT5iaC5iYi5ic2l6ZSktPmJiLnByZXZmcmVlID09IDApOworCisjaWYgQnVmU3RhdHMKKyAgdGhyLT5udW1yZWwrKzsgLyogSW5jcmVtZW50IG51bWJlciBvZiBicmVsKCkgY2FsbHMgKi8KKyAgdGhyLT50b3RhbGxvYyArPSAoc2l6ZV90KWItPmJoLmJiLmJzaXplOworI2VuZGlmCisKKyAgLyogSWYgdGhlIGJhY2sgbGluayBpcyBub256ZXJvLCB0aGUgcHJldmlvdXMgYnVmZmVyIGlzIGZyZWUuICAqLworCisgIGlmIChiLT5iaC5iYi5wcmV2ZnJlZSAhPSAwKSB7CisgICAgLyogVGhlIHByZXZpb3VzIGJ1ZmZlciBpcyBmcmVlLiBDb25zb2xpZGF0ZSB0aGlzIGJ1ZmZlciB3aXRoIGl0IGJ5IGFkZGluZworICAgICAgIHRoZSBsZW5ndGggb2YgdGhpcyBidWZmZXIgdG8gdGhlIHByZXZpb3VzIGZyZWUgYnVmZmVyLiBOb3RlIHRoYXQgd2UKKyAgICAgICBzdWJ0cmFjdCB0aGUgc2l6ZSBpbiB0aGUgYnVmZmVyIGJlaW5nIHJlbGVhc2VkLCBzaW5jZSBpdCdzIG5lZ2F0aXZlIHRvCisgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgYnVmZmVyIGlzIGFsbG9jYXRlZC4gKi8KKyAgICBidWZzaXplIHNpemUgPSBiLT5iaC5iYi5ic2l6ZTsKKworICAgIC8qIE1ha2UgdGhlIHByZXZpb3VzIGJ1ZmZlciB0aGUgb25lIHdlJ3JlIHdvcmtpbmcgb24uICovCisgICAgS01QX0RFQlVHX0FTU0VSVChCSCgoY2hhciAqKWIgLSBiLT5iaC5iYi5wcmV2ZnJlZSktPmJiLmJzaXplID09CisgICAgICAgICAgICAgICAgICAgICBiLT5iaC5iYi5wcmV2ZnJlZSk7CisgICAgYiA9IEJGSCgoKGNoYXIgKiliKSAtIGItPmJoLmJiLnByZXZmcmVlKTsKKyAgICBiLT5iaC5iYi5ic2l6ZSAtPSBzaXplOworCisgICAgLyogdW5saW5rIHRoZSBidWZmZXIgZnJvbSB0aGUgb2xkIGZyZWVsaXN0ICovCisgICAgX19rbXBfYmdldF9yZW1vdmVfZnJvbV9mcmVlbGlzdChiKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBUaGUgcHJldmlvdXMgYnVmZmVyIGlzbid0IGFsbG9jYXRlZC4gTWFyayB0aGlzIGJ1ZmZlciBzaXplIGFzIHBvc2l0aXZlCisgICAgICAgKGkuZS4gZnJlZSkgYW5kIGZhbGwgdGhyb3VnaCB0byBwbGFjZSB0aGUgYnVmZmVyIG9uIHRoZSBmcmVlIGxpc3QgYXMgYW4KKyAgICAgICBpc29sYXRlZCBmcmVlIGJsb2NrLiAqLworICAgIGItPmJoLmJiLmJzaXplID0gLWItPmJoLmJiLmJzaXplOworICB9CisKKyAgLyogaW5zZXJ0IGJ1ZmZlciBiYWNrIG9udG8gYSBuZXcgZnJlZWxpc3QgKi8KKyAgX19rbXBfYmdldF9pbnNlcnRfaW50b19mcmVlbGlzdCh0aHIsIGIpOworCisgIC8qIE5vdyB3ZSBsb29rIGF0IHRoZSBuZXh0IGJ1ZmZlciBpbiBtZW1vcnksIGxvY2F0ZWQgYnkgYWR2YW5jaW5nIGZyb20KKyAgICAgdGhlICBzdGFydCAgb2YgIHRoaXMgIGJ1ZmZlciAgYnkgaXRzIHNpemUsIHRvIHNlZSBpZiB0aGF0IGJ1ZmZlciBpcworICAgICBmcmVlLiAgSWYgaXQgaXMsIHdlIGNvbWJpbmUgIHRoaXMgIGJ1ZmZlciAgd2l0aCAgdGhlICBuZXh0ICBvbmUgIGluCisgICAgIG1lbW9yeSwgZGVjaGFpbmluZyB0aGUgc2Vjb25kIGJ1ZmZlciBmcm9tIHRoZSBmcmVlIGxpc3QuICovCisgIGJuID0gQkZIKCgoY2hhciAqKWIpICsgYi0+YmguYmIuYnNpemUpOworICBpZiAoYm4tPmJoLmJiLmJzaXplID4gMCkgeworCisgICAgLyogVGhlIGJ1ZmZlciBpcyBmcmVlLiAgUmVtb3ZlIGl0IGZyb20gdGhlIGZyZWUgbGlzdCBhbmQgYWRkCisgICAgICAgaXRzIHNpemUgdG8gdGhhdCBvZiBvdXIgYnVmZmVyLiAqLworICAgIEtNUF9ERUJVR19BU1NFUlQoQkgoKGNoYXIgKilibiArIGJuLT5iaC5iYi5ic2l6ZSktPmJiLnByZXZmcmVlID09CisgICAgICAgICAgICAgICAgICAgICBibi0+YmguYmIuYnNpemUpOworCisgICAgX19rbXBfYmdldF9yZW1vdmVfZnJvbV9mcmVlbGlzdChibik7CisKKyAgICBiLT5iaC5iYi5ic2l6ZSArPSBibi0+YmguYmIuYnNpemU7CisKKyAgICAvKiB1bmxpbmsgdGhlIGJ1ZmZlciBmcm9tIHRoZSBvbGQgZnJlZWxpc3QsIGFuZCByZWluc2VydCBpdCBpbnRvIHRoZSBuZXcKKyAgICAgKiBmcmVlbGlzdCAqLworICAgIF9fa21wX2JnZXRfcmVtb3ZlX2Zyb21fZnJlZWxpc3QoYik7CisgICAgX19rbXBfYmdldF9pbnNlcnRfaW50b19mcmVlbGlzdCh0aHIsIGIpOworCisgICAgLyogRmluYWxseSwgIGFkdmFuY2UgIHRvICAgdGhlICBidWZmZXIgIHRoYXQgICBmb2xsb3dzICB0aGUgIG5ld2x5CisgICAgICAgY29uc29saWRhdGVkIGZyZWUgYmxvY2suICBXZSBtdXN0IHNldCBpdHMgIGJhY2twb2ludGVyICB0byAgdGhlCisgICAgICAgaGVhZCAgb2YgIHRoZSAgY29uc29saWRhdGVkIGZyZWUgYmxvY2suICBXZSBrbm93IHRoZSBuZXh0IGJsb2NrCisgICAgICAgbXVzdCBiZSBhbiBhbGxvY2F0ZWQgYmxvY2sgYmVjYXVzZSB0aGUgcHJvY2VzcyBvZiByZWNvbWJpbmF0aW9uCisgICAgICAgZ3VhcmFudGVlcyAgdGhhdCAgdHdvICBmcmVlICBibG9ja3Mgd2lsbCBuZXZlciBiZSBjb250aWd1b3VzIGluCisgICAgICAgbWVtb3J5LiAgKi8KKyAgICBibiA9IEJGSCgoKGNoYXIgKiliKSArIGItPmJoLmJiLmJzaXplKTsKKyAgfQorI2lmZGVmIEZyZWVXaXBlCisgICh2b2lkKW1lbXNldCgoKGNoYXIgKiliKSArIHNpemVvZihiZmhlYWRfdCksIDB4NTUsCisgICAgICAgICAgICAgICAoc2l6ZV90KShiLT5iaC5iYi5ic2l6ZSAtIHNpemVvZihiZmhlYWRfdCkpKTsKKyNlbmRpZgorICBLTVBfREVCVUdfQVNTRVJUKGJuLT5iaC5iYi5ic2l6ZSA8IDApOworCisgIC8qIFRoZSBuZXh0IGJ1ZmZlciBpcyBhbGxvY2F0ZWQuICBTZXQgdGhlIGJhY2twb2ludGVyIGluIGl0ICB0byAgcG9pbnQKKyAgICAgdG8gdGhpcyBidWZmZXI7IHRoZSBwcmV2aW91cyBmcmVlIGJ1ZmZlciBpbiBtZW1vcnkuICovCisKKyAgYm4tPmJoLmJiLnByZXZmcmVlID0gYi0+YmguYmIuYnNpemU7CisKKyAgLyogIElmICBhICBibG9jay1yZWxlYXNlIGZ1bmN0aW9uIGlzIGRlZmluZWQsIGFuZCB0aGlzIGZyZWUgYnVmZmVyCisgICAgICBjb25zdGl0dXRlcyB0aGUgZW50aXJlIGJsb2NrLCByZWxlYXNlIGl0LiAgTm90ZSB0aGF0ICBwb29sX2xlbgorICAgICAgaXMgIGRlZmluZWQgIGluICBzdWNoIGEgd2F5IHRoYXQgdGhlIHRlc3Qgd2lsbCBmYWlsIHVubGVzcyBhbGwKKyAgICAgIHBvb2wgYmxvY2tzIGFyZSB0aGUgc2FtZSBzaXplLiAgKi8KKyAgaWYgKHRoci0+cmVsZmNuICE9IDAgJiYKKyAgICAgIGItPmJoLmJiLmJzaXplID09IChidWZzaXplKSh0aHItPnBvb2xfbGVuIC0gc2l6ZW9mKGJoZWFkX3QpKSkgeworI2lmIEJ1ZlN0YXRzCisgICAgaWYgKHRoci0+bnVtcGJsayAhPQorICAgICAgICAxKSB7IC8qIERvIG5vdCByZWxlYXNlIHRoZSBsYXN0IGJ1ZmZlciB1bnRpbCBmaW5hbGl6YXRpb24gdGltZSAqLworI2VuZGlmCisKKyAgICAgIEtNUF9ERUJVR19BU1NFUlQoYi0+YmguYmIucHJldmZyZWUgPT0gMCk7CisgICAgICBLTVBfREVCVUdfQVNTRVJUKEJIKChjaGFyICopYiArIGItPmJoLmJiLmJzaXplKS0+YmIuYnNpemUgPT0gRVNlbnQpOworICAgICAgS01QX0RFQlVHX0FTU0VSVChCSCgoY2hhciAqKWIgKyBiLT5iaC5iYi5ic2l6ZSktPmJiLnByZXZmcmVlID09CisgICAgICAgICAgICAgICAgICAgICAgIGItPmJoLmJiLmJzaXplKTsKKworICAgICAgLyogIFVubGluayB0aGUgYnVmZmVyIGZyb20gdGhlIGZyZWUgbGlzdCAgKi8KKyAgICAgIF9fa21wX2JnZXRfcmVtb3ZlX2Zyb21fZnJlZWxpc3QoYik7CisKKyAgICAgIEtFX1RSQUNFKDEwLCAoIiUlJSUlJSBGUkVFKCAlcCApXG4iLCAodm9pZCAqKWIpKTsKKworICAgICAgKCp0aHItPnJlbGZjbikoYik7CisjaWYgQnVmU3RhdHMKKyAgICAgIHRoci0+bnVtcHJlbCsrOyAvKiBOciBvZiBleHBhbnNpb24gYmxvY2sgcmVsZWFzZXMgKi8KKyAgICAgIHRoci0+bnVtcGJsay0tOyAvKiBUb3RhbCBudW1iZXIgb2YgYmxvY2tzICovCisgICAgICBLTVBfREVCVUdfQVNTRVJUKHRoci0+bnVtcGJsayA9PSB0aHItPm51bXBnZXQgLSB0aHItPm51bXByZWwpOworCisgICAgICAvLyBhdm9pZCBsZWF2aW5nIHN0YWxlIGxhc3RfcG9vbCBwb2ludGVyIGFyb3VuZCBpZiBpdCBpcyBiZWluZyBkZWFsbG9jZWQKKyAgICAgIGlmICh0aHItPmxhc3RfcG9vbCA9PSBiKQorICAgICAgICB0aHItPmxhc3RfcG9vbCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoci0+bGFzdF9wb29sID0gYjsKKyAgICB9CisjZW5kaWYgLyogQnVmU3RhdHMgKi8KKyAgfQorfQorCisvKiAgQkVDVEwgIC0tICBFc3RhYmxpc2ggYXV0b21hdGljIHBvb2wgZXhwYW5zaW9uIGNvbnRyb2wgICovCitzdGF0aWMgdm9pZCBiZWN0bChrbXBfaW5mb190ICp0aCwgYmdldF9jb21wYWN0X3QgY29tcGFjdCwKKyAgICAgICAgICAgICAgICAgIGJnZXRfYWNxdWlyZV90IGFjcXVpcmUsIGJnZXRfcmVsZWFzZV90IHJlbGVhc2UsCisgICAgICAgICAgICAgICAgICBidWZzaXplIHBvb2xfaW5jcikgeworICB0aHJfZGF0YV90ICp0aHIgPSBnZXRfdGhyX2RhdGEodGgpOworCisgIHRoci0+Y29tcGZjbiA9IGNvbXBhY3Q7CisgIHRoci0+YWNxZmNuID0gYWNxdWlyZTsKKyAgdGhyLT5yZWxmY24gPSByZWxlYXNlOworICB0aHItPmV4cF9pbmNyID0gcG9vbF9pbmNyOworfQorCisvKiAgQlBPT0wgIC0tICBBZGQgYSByZWdpb24gb2YgbWVtb3J5IHRvIHRoZSBidWZmZXIgcG9vbC4gICovCitzdGF0aWMgdm9pZCBicG9vbChrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmLCBidWZzaXplIGxlbikgeworICAvKiAgICBpbnQgYmluID0gMDsgKi8KKyAgdGhyX2RhdGFfdCAqdGhyID0gZ2V0X3Rocl9kYXRhKHRoKTsKKyAgYmZoZWFkX3QgKmIgPSBCRkgoYnVmKTsKKyAgYmhlYWRfdCAqYm47CisKKyAgX19rbXBfYmdldF9kZXF1ZXVlKHRoKTsgLyogUmVsZWFzZSBhbnkgcXVldWVkIGJ1ZmZlcnMgKi8KKworI2lmZGVmIFNpemVRdWFudAorICBsZW4gJj0gfihTaXplUXVhbnQgLSAxKTsKKyNlbmRpZgorICBpZiAodGhyLT5wb29sX2xlbiA9PSAwKSB7CisgICAgdGhyLT5wb29sX2xlbiA9IGxlbjsKKyAgfSBlbHNlIGlmIChsZW4gIT0gdGhyLT5wb29sX2xlbikgeworICAgIHRoci0+cG9vbF9sZW4gPSAtMTsKKyAgfQorI2lmIEJ1ZlN0YXRzCisgIHRoci0+bnVtcGdldCsrOyAvKiBOdW1iZXIgb2YgYmxvY2sgYWNxdWlzaXRpb25zICovCisgIHRoci0+bnVtcGJsaysrOyAvKiBOdW1iZXIgb2YgYmxvY2tzIHRvdGFsICovCisgIEtNUF9ERUJVR19BU1NFUlQodGhyLT5udW1wYmxrID09IHRoci0+bnVtcGdldCAtIHRoci0+bnVtcHJlbCk7CisjZW5kaWYgLyogQnVmU3RhdHMgKi8KKworICAvKiBTaW5jZSB0aGUgYmxvY2sgaXMgaW5pdGlhbGx5IG9jY3VwaWVkIGJ5IGEgc2luZ2xlIGZyZWUgIGJ1ZmZlciwKKyAgICAgaXQgIGhhZCAgYmV0dGVyICBub3QgIGJlICAobXVjaCkgbGFyZ2VyIHRoYW4gdGhlIGxhcmdlc3QgYnVmZmVyCisgICAgIHdob3NlIHNpemUgd2UgY2FuIHN0b3JlIGluIGJoZWFkLmJiLmJzaXplLiAqLworICBLTVBfREVCVUdfQVNTRVJUKGxlbiAtIHNpemVvZihiaGVhZF90KSA8PSAtKChidWZzaXplKUVTZW50ICsgMSkpOworCisgIC8qIENsZWFyICB0aGUgIGJhY2twb2ludGVyIGF0ICB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrIHRvIGluZGljYXRlIHRoYXQKKyAgICAgdGhlcmUgIGlzICBubyAgZnJlZSAgYmxvY2sgIHByaW9yICB0byAgdGhpcyAgIG9uZS4gICAgVGhhdCAgIGJsb2NrcworICAgICByZWNvbWJpbmF0aW9uIHdoZW4gdGhlIGZpcnN0IGJsb2NrIGluIG1lbW9yeSBpcyByZWxlYXNlZC4gKi8KKyAgYi0+YmguYmIucHJldmZyZWUgPSAwOworCisgIC8qIENyZWF0ZSBhIGR1bW15IGFsbG9jYXRlZCBidWZmZXIgYXQgdGhlIGVuZCBvZiB0aGUgcG9vbC4gIFRoaXMgZHVtbXkKKyAgICAgYnVmZmVyIGlzIHNlZW4gd2hlbiBhIGJ1ZmZlciBhdCB0aGUgZW5kIG9mIHRoZSBwb29sIGlzIHJlbGVhc2VkIGFuZAorICAgICBibG9ja3MgIHJlY29tYmluYXRpb24gIG9mICB0aGUgbGFzdCBidWZmZXIgd2l0aCB0aGUgZHVtbXkgYnVmZmVyIGF0CisgICAgIHRoZSBlbmQuICBUaGUgbGVuZ3RoIGluIHRoZSBkdW1teSBidWZmZXIgIGlzICBzZXQgIHRvICB0aGUgIGxhcmdlc3QKKyAgICAgbmVnYXRpdmUgIG51bWJlciAgdG8gIGRlbm90ZSAgdGhlICBlbmQgIG9mICB0aGUgcG9vbCBmb3IgZGlhZ25vc3RpYworICAgICByb3V0aW5lcyAodGhpcyBzcGVjaWZpYyB2YWx1ZSBpcyAgbm90ICBjb3VudGVkICBvbiAgYnkgIHRoZSAgYWN0dWFsCisgICAgIGFsbG9jYXRpb24gYW5kIHJlbGVhc2UgZnVuY3Rpb25zKS4gKi8KKyAgbGVuIC09IHNpemVvZihiaGVhZF90KTsKKyAgYi0+YmguYmIuYnNpemUgPSAoYnVmc2l6ZSlsZW47CisgIC8qIFNldCB0aGUgb3duZXIgb2YgdGhpcyBidWZmZXIgKi8KKyAgVENXX1BUUihiLT5iaC5iYi5idGhyLAorICAgICAgICAgIChrbXBfaW5mb190ICopKChrbXBfdWludHB0cl90KXRoIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAxKSk7IC8vIG1hcmsgdGhlIGJ1ZmZlciBhcyBhbGxvY2F0ZWQgYWRkcmVzcworCisgIC8qIENoYWluIHRoZSBuZXcgYmxvY2sgdG8gdGhlIGZyZWUgbGlzdC4gKi8KKyAgX19rbXBfYmdldF9pbnNlcnRfaW50b19mcmVlbGlzdCh0aHIsIGIpOworCisjaWZkZWYgRnJlZVdpcGUKKyAgKHZvaWQpbWVtc2V0KCgoY2hhciAqKWIpICsgc2l6ZW9mKGJmaGVhZF90KSwgMHg1NSwKKyAgICAgICAgICAgICAgIChzaXplX3QpKGxlbiAtIHNpemVvZihiZmhlYWRfdCkpKTsKKyNlbmRpZgorICBibiA9IEJIKCgoY2hhciAqKWIpICsgbGVuKTsKKyAgYm4tPmJiLnByZXZmcmVlID0gKGJ1ZnNpemUpbGVuOworICAvKiBEZWZpbml0aW9uIG9mIEVTZW50IGFzc3VtZXMgdHdvJ3MgY29tcGxlbWVudCEgKi8KKyAgS01QX0RFQlVHX0FTU0VSVCgofjApID09IC0xICYmIChibiAhPSAwKSk7CisKKyAgYm4tPmJiLmJzaXplID0gRVNlbnQ7Cit9CisKKy8qICBCRlJFRUQgIC0tICBEdW1wIHRoZSBmcmVlIGxpc3RzIGZvciB0aGlzIHRocmVhZC4gKi8KK3N0YXRpYyB2b2lkIGJmcmVlZChrbXBfaW5mb190ICp0aCkgeworICBpbnQgYmluID0gMCwgY291bnQgPSAwOworICBpbnQgZ3RpZCA9IF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGgpOworICB0aHJfZGF0YV90ICp0aHIgPSBnZXRfdGhyX2RhdGEodGgpOworCisjaWYgQnVmU3RhdHMKKyAgX19rbXBfcHJpbnRmX25vX2xvY2soIl9fa21wX3ByaW50cG9vbDogVCMlZCB0b3RhbD0lIiBLTVBfVUlOVDY0X1NQRUMKKyAgICAgICAgICAgICAgICAgICAgICAgIiBnZXQ9JSIgS01QX0lOVDY0X1NQRUMgIiByZWw9JSIgS01QX0lOVDY0X1NQRUMKKyAgICAgICAgICAgICAgICAgICAgICAgIiBwYmxrPSUiIEtNUF9JTlQ2NF9TUEVDICIgcGdldD0lIiBLTVBfSU5UNjRfU1BFQworICAgICAgICAgICAgICAgICAgICAgICAiIHByZWw9JSIgS01QX0lOVDY0X1NQRUMgIiBkZ2V0PSUiIEtNUF9JTlQ2NF9TUEVDCisgICAgICAgICAgICAgICAgICAgICAgICIgZHJlbD0lIiBLTVBfSU5UNjRfU1BFQyAiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBndGlkLCAoa21wX3VpbnQ2NCl0aHItPnRvdGFsbG9jLCAoa21wX2ludDY0KXRoci0+bnVtZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAoa21wX2ludDY0KXRoci0+bnVtcmVsLCAoa21wX2ludDY0KXRoci0+bnVtcGJsaywKKyAgICAgICAgICAgICAgICAgICAgICAgKGttcF9pbnQ2NCl0aHItPm51bXBnZXQsIChrbXBfaW50NjQpdGhyLT5udW1wcmVsLAorICAgICAgICAgICAgICAgICAgICAgICAoa21wX2ludDY0KXRoci0+bnVtZGdldCwgKGttcF9pbnQ2NCl0aHItPm51bWRyZWwpOworI2VuZGlmCisKKyAgZm9yIChiaW4gPSAwOyBiaW4gPCBNQVhfQkdFVF9CSU5TOyArK2JpbikgeworICAgIGJmaGVhZF90ICpiOworCisgICAgZm9yIChiID0gdGhyLT5mcmVlbGlzdFtiaW5dLnFsLmZsaW5rOyBiICE9ICZ0aHItPmZyZWVsaXN0W2Jpbl07CisgICAgICAgICBiID0gYi0+cWwuZmxpbmspIHsKKyAgICAgIGJ1ZnNpemUgYnMgPSBiLT5iaC5iYi5ic2l6ZTsKKworICAgICAgS01QX0RFQlVHX0FTU0VSVChiLT5xbC5ibGluay0+cWwuZmxpbmsgPT0gYik7CisgICAgICBLTVBfREVCVUdfQVNTRVJUKGItPnFsLmZsaW5rLT5xbC5ibGluayA9PSBiKTsKKyAgICAgIEtNUF9ERUJVR19BU1NFUlQoYnMgPiAwKTsKKworICAgICAgY291bnQgKz0gMTsKKworICAgICAgX19rbXBfcHJpbnRmX25vX2xvY2soCisgICAgICAgICAgIl9fa21wX3ByaW50cG9vbDogVCMlZCBGcmVlIGJsb2NrOiAweCVwIHNpemUgJTZsZCBieXRlcy5cbiIsIGd0aWQsIGIsCisgICAgICAgICAgKGxvbmcpYnMpOworI2lmZGVmIEZyZWVXaXBlCisgICAgICB7CisgICAgICAgIGNoYXIgKmxlcnIgPSAoKGNoYXIgKiliKSArIHNpemVvZihiZmhlYWRfdCk7CisgICAgICAgIGlmICgoYnMgPiBzaXplb2YoYmZoZWFkX3QpKSAmJgorICAgICAgICAgICAgKCgqbGVyciAhPSAweDU1KSB8fAorICAgICAgICAgICAgIChtZW1jbXAobGVyciwgbGVyciArIDEsIChzaXplX3QpKGJzIC0gKHNpemVvZihiZmhlYWRfdCkgKyAxKSkpICE9CisgICAgICAgICAgICAgIDApKSkgeworICAgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCJfX2ttcF9wcmludHBvb2w6IFQjJWQgICAgIChDb250ZW50cyBvZiBhYm92ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZyZWUgYmxvY2sgaGF2ZSBiZWVuIG92ZXJzdG9yZWQuKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkKTsKKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmCisgICAgfQorICB9CisKKyAgaWYgKGNvdW50ID09IDApCisgICAgX19rbXBfcHJpbnRmX25vX2xvY2soIl9fa21wX3ByaW50cG9vbDogVCMlZCBObyBmcmVlIGJsb2Nrc1xuIiwgZ3RpZCk7Cit9CisKKyNpZmRlZiBLTVBfREVCVUcKKworI2lmIEJ1ZlN0YXRzCisKKy8qICBCU1RBVFMgIC0tICBSZXR1cm4gYnVmZmVyIGFsbG9jYXRpb24gZnJlZSBzcGFjZSBzdGF0aXN0aWNzLiAgKi8KK3N0YXRpYyB2b2lkIGJzdGF0cyhrbXBfaW5mb190ICp0aCwgYnVmc2l6ZSAqY3VyYWxsb2MsIGJ1ZnNpemUgKnRvdGZyZWUsCisgICAgICAgICAgICAgICAgICAgYnVmc2l6ZSAqbWF4ZnJlZSwgbG9uZyAqbmdldCwgbG9uZyAqbnJlbCkgeworICBpbnQgYmluID0gMDsKKyAgdGhyX2RhdGFfdCAqdGhyID0gZ2V0X3Rocl9kYXRhKHRoKTsKKworICAqbmdldCA9IHRoci0+bnVtZ2V0OworICAqbnJlbCA9IHRoci0+bnVtcmVsOworICAqY3VyYWxsb2MgPSAoYnVmc2l6ZSl0aHItPnRvdGFsbG9jOworICAqdG90ZnJlZSA9IDA7CisgICptYXhmcmVlID0gLTE7CisKKyAgZm9yIChiaW4gPSAwOyBiaW4gPCBNQVhfQkdFVF9CSU5TOyArK2JpbikgeworICAgIGJmaGVhZF90ICpiID0gdGhyLT5mcmVlbGlzdFtiaW5dLnFsLmZsaW5rOworCisgICAgd2hpbGUgKGIgIT0gJnRoci0+ZnJlZWxpc3RbYmluXSkgeworICAgICAgS01QX0RFQlVHX0FTU0VSVChiLT5iaC5iYi5ic2l6ZSA+IDApOworICAgICAgKnRvdGZyZWUgKz0gYi0+YmguYmIuYnNpemU7CisgICAgICBpZiAoYi0+YmguYmIuYnNpemUgPiAqbWF4ZnJlZSkgeworICAgICAgICAqbWF4ZnJlZSA9IGItPmJoLmJiLmJzaXplOworICAgICAgfQorICAgICAgYiA9IGItPnFsLmZsaW5rOyAvKiBMaW5rIHRvIG5leHQgYnVmZmVyICovCisgICAgfQorICB9Cit9CisKKy8qICBCU1RBVFNFICAtLSAgUmV0dXJuIGV4dGVuZGVkIHN0YXRpc3RpY3MgICovCitzdGF0aWMgdm9pZCBic3RhdHNlKGttcF9pbmZvX3QgKnRoLCBidWZzaXplICpwb29sX2luY3IsIGxvbmcgKm5wb29sLAorICAgICAgICAgICAgICAgICAgICBsb25nICpucGdldCwgbG9uZyAqbnByZWwsIGxvbmcgKm5kZ2V0LCBsb25nICpuZHJlbCkgeworICB0aHJfZGF0YV90ICp0aHIgPSBnZXRfdGhyX2RhdGEodGgpOworCisgICpwb29sX2luY3IgPSAodGhyLT5wb29sX2xlbiA8IDApID8gLXRoci0+ZXhwX2luY3IgOiB0aHItPmV4cF9pbmNyOworICAqbnBvb2wgPSB0aHItPm51bXBibGs7CisgICpucGdldCA9IHRoci0+bnVtcGdldDsKKyAgKm5wcmVsID0gdGhyLT5udW1wcmVsOworICAqbmRnZXQgPSB0aHItPm51bWRnZXQ7CisgICpuZHJlbCA9IHRoci0+bnVtZHJlbDsKK30KKworI2VuZGlmIC8qIEJ1ZlN0YXRzICovCisKKy8qICBCVUZEVU1QICAtLSAgRHVtcCB0aGUgZGF0YSBpbiBhIGJ1ZmZlci4gIFRoaXMgaXMgY2FsbGVkIHdpdGggdGhlICB1c2VyCisgICAgICAgICAgICAgICAgIGRhdGEgcG9pbnRlciwgYW5kIGJhY2tzIHVwIHRvIHRoZSBidWZmZXIgaGVhZGVyLiAgSXQgd2lsbAorICAgICAgICAgICAgICAgICBkdW1wIGVpdGhlciBhIGZyZWUgYmxvY2sgb3IgYW4gYWxsb2NhdGVkIG9uZS4gICovCitzdGF0aWMgdm9pZCBidWZkdW1wKGttcF9pbmZvX3QgKnRoLCB2b2lkICpidWYpIHsKKyAgYmZoZWFkX3QgKmI7CisgIHVuc2lnbmVkIGNoYXIgKmJkdW1wOworICBidWZzaXplIGJkbGVuOworCisgIGIgPSBCRkgoKChjaGFyICopYnVmKSAtIHNpemVvZihiaGVhZF90KSk7CisgIEtNUF9ERUJVR19BU1NFUlQoYi0+YmguYmIuYnNpemUgIT0gMCk7CisgIGlmIChiLT5iaC5iYi5ic2l6ZSA8IDApIHsKKyAgICBiZHVtcCA9ICh1bnNpZ25lZCBjaGFyICopYnVmOworICAgIGJkbGVuID0gKC1iLT5iaC5iYi5ic2l6ZSkgLSAoYnVmc2l6ZSlzaXplb2YoYmhlYWRfdCk7CisgIH0gZWxzZSB7CisgICAgYmR1bXAgPSAodW5zaWduZWQgY2hhciAqKSgoKGNoYXIgKiliKSArIHNpemVvZihiZmhlYWRfdCkpOworICAgIGJkbGVuID0gYi0+YmguYmIuYnNpemUgLSAoYnVmc2l6ZSlzaXplb2YoYmZoZWFkX3QpOworICB9CisKKyAgd2hpbGUgKGJkbGVuID4gMCkgeworICAgIGludCBpLCBkdXBlcyA9IDA7CisgICAgYnVmc2l6ZSBsID0gYmRsZW47CisgICAgY2hhciBiaGV4WzUwXSwgYmFzY2lpWzIwXTsKKworICAgIGlmIChsID4gMTYpIHsKKyAgICAgIGwgPSAxNjsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7CisgICAgICAodm9pZClLTVBfU05QUklOVEYoYmhleCArIGkgKiAzLCBzaXplb2YoYmhleCkgLSBpICogMywgIiUwMlggIiwgYmR1bXBbaV0pOworICAgICAgaWYgKGJkdW1wW2ldID4gMHgyMCAmJiBiZHVtcFtpXSA8IDB4N0YpCisgICAgICAgIGJhc2NpaVtpXSA9IGJkdW1wW2ldOworICAgICAgZWxzZQorICAgICAgICBiYXNjaWlbaV0gPSAnICc7CisgICAgfQorICAgIGJhc2NpaVtpXSA9IDA7CisgICAgKHZvaWQpX19rbXBfcHJpbnRmX25vX2xvY2soIiUtNDhzICAgJXNcbiIsIGJoZXgsIGJhc2NpaSk7CisgICAgYmR1bXAgKz0gbDsKKyAgICBiZGxlbiAtPSBsOworICAgIHdoaWxlICgoYmRsZW4gPiAxNikgJiYKKyAgICAgICAgICAgKG1lbWNtcCgoY2hhciAqKShiZHVtcCAtIDE2KSwgKGNoYXIgKiliZHVtcCwgMTYpID09IDApKSB7CisgICAgICBkdXBlcysrOworICAgICAgYmR1bXAgKz0gMTY7CisgICAgICBiZGxlbiAtPSAxNjsKKyAgICB9CisgICAgaWYgKGR1cGVzID4gMSkgeworICAgICAgKHZvaWQpX19rbXBfcHJpbnRmX25vX2xvY2soCisgICAgICAgICAgIiAgICAgKCVkIGxpbmVzIFslZCBieXRlc10gaWRlbnRpY2FsIHRvIGFib3ZlIGxpbmUgc2tpcHBlZClcbiIsIGR1cGVzLAorICAgICAgICAgIGR1cGVzICogMTYpOworICAgIH0gZWxzZSBpZiAoZHVwZXMgPT0gMSkgeworICAgICAgYmR1bXAgLT0gMTY7CisgICAgICBiZGxlbiArPSAxNjsKKyAgICB9CisgIH0KK30KKworLyogIEJQT09MRCAgLS0gIER1bXAgYSBidWZmZXIgcG9vbC4gIFRoZSBidWZmZXIgaGVhZGVycyBhcmUgYWx3YXlzIGxpc3RlZC4KKyAgICAgICAgICAgICAgICBJZiBEVU1QQUxMT0MgaXMgbm9uemVybywgdGhlIGNvbnRlbnRzIG9mIGFsbG9jYXRlZCBidWZmZXJzCisgICAgICAgICAgICAgICAgYXJlICBkdW1wZWQuICAgSWYgIERVTVBGUkVFICBpcyAgbm9uemVybywgIGZyZWUgYmxvY2tzIGFyZQorICAgICAgICAgICAgICAgIGR1bXBlZCBhcyB3ZWxsLiAgSWYgRnJlZVdpcGUgIGNoZWNraW5nICBpcyAgZW5hYmxlZCwgIGZyZWUKKyAgICAgICAgICAgICAgICBibG9ja3MgIHdoaWNoICBoYXZlICBiZWVuIGNsb2JiZXJlZCB3aWxsIGFsd2F5cyBiZSBkdW1wZWQuICovCitzdGF0aWMgdm9pZCBicG9vbGQoa21wX2luZm9fdCAqdGgsIHZvaWQgKmJ1ZiwgaW50IGR1bXBhbGxvYywgaW50IGR1bXBmcmVlKSB7CisgIGJmaGVhZF90ICpiID0gQkZIKChjaGFyICopYnVmIC0gc2l6ZW9mKGJoZWFkX3QpKTsKKworICB3aGlsZSAoYi0+YmguYmIuYnNpemUgIT0gRVNlbnQpIHsKKyAgICBidWZzaXplIGJzID0gYi0+YmguYmIuYnNpemU7CisKKyAgICBpZiAoYnMgPCAwKSB7CisgICAgICBicyA9IC1iczsKKyAgICAgICh2b2lkKV9fa21wX3ByaW50Zl9ub19sb2NrKCJBbGxvY2F0ZWQgYnVmZmVyOiBzaXplICU2bGQgYnl0ZXMuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpYnMpOworICAgICAgaWYgKGR1bXBhbGxvYykgeworICAgICAgICBidWZkdW1wKHRoLCAodm9pZCAqKSgoKGNoYXIgKiliKSArIHNpemVvZihiaGVhZF90KSkpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBjb25zdCBjaGFyICpsZXJyID0gIiI7CisKKyAgICAgIEtNUF9ERUJVR19BU1NFUlQoYnMgPiAwKTsKKyAgICAgIGlmICgoYi0+cWwuYmxpbmstPnFsLmZsaW5rICE9IGIpIHx8IChiLT5xbC5mbGluay0+cWwuYmxpbmsgIT0gYikpIHsKKyAgICAgICAgbGVyciA9ICIgIChCYWQgZnJlZSBsaXN0IGxpbmtzKSI7CisgICAgICB9CisgICAgICAodm9pZClfX2ttcF9wcmludGZfbm9fbG9jaygiRnJlZSBibG9jazogICAgICAgc2l6ZSAlNmxkIGJ5dGVzLiVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpYnMsIGxlcnIpOworI2lmZGVmIEZyZWVXaXBlCisgICAgICBsZXJyID0gKChjaGFyICopYikgKyBzaXplb2YoYmZoZWFkX3QpOworICAgICAgaWYgKChicyA+IHNpemVvZihiZmhlYWRfdCkpICYmCisgICAgICAgICAgKCgqbGVyciAhPSAweDU1KSB8fAorICAgICAgICAgICAobWVtY21wKGxlcnIsIGxlcnIgKyAxLCAoc2l6ZV90KShicyAtIChzaXplb2YoYmZoZWFkX3QpICsgMSkpKSAhPQorICAgICAgICAgICAgMCkpKSB7CisgICAgICAgICh2b2lkKV9fa21wX3ByaW50Zl9ub19sb2NrKAorICAgICAgICAgICAgIihDb250ZW50cyBvZiBhYm92ZSBmcmVlIGJsb2NrIGhhdmUgYmVlbiBvdmVyc3RvcmVkLilcbiIpOworICAgICAgICBidWZkdW1wKHRoLCAodm9pZCAqKSgoKGNoYXIgKiliKSArIHNpemVvZihiaGVhZF90KSkpOworICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgICBpZiAoZHVtcGZyZWUpIHsKKyAgICAgICAgYnVmZHVtcCh0aCwgKHZvaWQgKikoKChjaGFyICopYikgKyBzaXplb2YoYmhlYWRfdCkpKTsKKyAgICAgIH0KKyAgICB9CisgICAgYiA9IEJGSCgoKGNoYXIgKiliKSArIGJzKTsKKyAgfQorfQorCisvKiAgQlBPT0xWICAtLSAgVmFsaWRhdGUgYSBidWZmZXIgcG9vbC4gKi8KK3N0YXRpYyBpbnQgYnBvb2x2KGttcF9pbmZvX3QgKnRoLCB2b2lkICpidWYpIHsKKyAgYmZoZWFkX3QgKmIgPSBCRkgoYnVmKTsKKworICB3aGlsZSAoYi0+YmguYmIuYnNpemUgIT0gRVNlbnQpIHsKKyAgICBidWZzaXplIGJzID0gYi0+YmguYmIuYnNpemU7CisKKyAgICBpZiAoYnMgPCAwKSB7CisgICAgICBicyA9IC1iczsKKyAgICB9IGVsc2UgeworI2lmZGVmIEZyZWVXaXBlCisgICAgICBjaGFyICpsZXJyID0gIiI7CisjZW5kaWYKKworICAgICAgS01QX0RFQlVHX0FTU0VSVChicyA+IDApOworICAgICAgaWYgKGJzIDw9IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBpZiAoKGItPnFsLmJsaW5rLT5xbC5mbGluayAhPSBiKSB8fCAoYi0+cWwuZmxpbmstPnFsLmJsaW5rICE9IGIpKSB7CisgICAgICAgICh2b2lkKV9fa21wX3ByaW50Zl9ub19sb2NrKAorICAgICAgICAgICAgIkZyZWUgYmxvY2s6IHNpemUgJTZsZCBieXRlcy4gIChCYWQgZnJlZSBsaXN0IGxpbmtzKVxuIiwgKGxvbmcpYnMpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKDApOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyNpZmRlZiBGcmVlV2lwZQorICAgICAgbGVyciA9ICgoY2hhciAqKWIpICsgc2l6ZW9mKGJmaGVhZF90KTsKKyAgICAgIGlmICgoYnMgPiBzaXplb2YoYmZoZWFkX3QpKSAmJgorICAgICAgICAgICgoKmxlcnIgIT0gMHg1NSkgfHwKKyAgICAgICAgICAgKG1lbWNtcChsZXJyLCBsZXJyICsgMSwgKHNpemVfdCkoYnMgLSAoc2l6ZW9mKGJmaGVhZF90KSArIDEpKSkgIT0KKyAgICAgICAgICAgIDApKSkgeworICAgICAgICAodm9pZClfX2ttcF9wcmludGZfbm9fbG9jaygKKyAgICAgICAgICAgICIoQ29udGVudHMgb2YgYWJvdmUgZnJlZSBibG9jayBoYXZlIGJlZW4gb3ZlcnN0b3JlZC4pXG4iKTsKKyAgICAgICAgYnVmZHVtcCh0aCwgKHZvaWQgKikoKChjaGFyICopYikgKyBzaXplb2YoYmhlYWRfdCkpKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgwKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisjZW5kaWYgLyogRnJlZVdpcGUgKi8KKyAgICB9CisgICAgYiA9IEJGSCgoKGNoYXIgKiliKSArIGJzKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCit2b2lkIF9fa21wX2luaXRpYWxpemVfYmdldChrbXBfaW5mb190ICp0aCkgeworICBLTVBfREVCVUdfQVNTRVJUKFNpemVRdWFudCA+PSBzaXplb2Yodm9pZCAqKSAmJiAodGggIT0gMCkpOworCisgIHNldF90aHJfZGF0YSh0aCk7CisKKyAgYmVjdGwodGgsIChiZ2V0X2NvbXBhY3RfdCkwLCAoYmdldF9hY3F1aXJlX3QpbWFsbG9jLCAoYmdldF9yZWxlYXNlX3QpZnJlZSwKKyAgICAgICAgKGJ1ZnNpemUpX19rbXBfbWFsbG9jX3Bvb2xfaW5jcik7Cit9CisKK3ZvaWQgX19rbXBfZmluYWxpemVfYmdldChrbXBfaW5mb190ICp0aCkgeworICB0aHJfZGF0YV90ICp0aHI7CisgIGJmaGVhZF90ICpiOworCisgIEtNUF9ERUJVR19BU1NFUlQodGggIT0gMCk7CisKKyNpZiBCdWZTdGF0cworICB0aHIgPSAodGhyX2RhdGFfdCAqKXRoLT50aC50aF9sb2NhbC5iZ2V0X2RhdGE7CisgIEtNUF9ERUJVR19BU1NFUlQodGhyICE9IE5VTEwpOworICBiID0gdGhyLT5sYXN0X3Bvb2w7CisKKyAgLyogIElmIGEgYmxvY2stcmVsZWFzZSBmdW5jdGlvbiBpcyBkZWZpbmVkLCBhbmQgdGhpcyBmcmVlIGJ1ZmZlciBjb25zdGl0dXRlcworICAgICAgdGhlIGVudGlyZSBibG9jaywgcmVsZWFzZSBpdC4gTm90ZSB0aGF0IHBvb2xfbGVuIGlzIGRlZmluZWQgaW4gc3VjaCBhIHdheQorICAgICAgdGhhdCB0aGUgdGVzdCB3aWxsIGZhaWwgdW5sZXNzIGFsbCBwb29sIGJsb2NrcyBhcmUgdGhlIHNhbWUgc2l6ZS4gICovCisKKyAgLy8gRGVhbGxvY2F0ZSB0aGUgbGFzdCBwb29sIGlmIG9uZSBleGlzdHMgYmVjYXVzZSB3ZSBubyBsb25nZXIgZG8gaXQgaW4gYnJlbCgpCisgIGlmICh0aHItPnJlbGZjbiAhPSAwICYmIGIgIT0gMCAmJiB0aHItPm51bXBibGsgIT0gMCAmJgorICAgICAgYi0+YmguYmIuYnNpemUgPT0gKGJ1ZnNpemUpKHRoci0+cG9vbF9sZW4gLSBzaXplb2YoYmhlYWRfdCkpKSB7CisgICAgS01QX0RFQlVHX0FTU0VSVChiLT5iaC5iYi5wcmV2ZnJlZSA9PSAwKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKEJIKChjaGFyICopYiArIGItPmJoLmJiLmJzaXplKS0+YmIuYnNpemUgPT0gRVNlbnQpOworICAgIEtNUF9ERUJVR19BU1NFUlQoQkgoKGNoYXIgKiliICsgYi0+YmguYmIuYnNpemUpLT5iYi5wcmV2ZnJlZSA9PQorICAgICAgICAgICAgICAgICAgICAgYi0+YmguYmIuYnNpemUpOworCisgICAgLyogIFVubGluayB0aGUgYnVmZmVyIGZyb20gdGhlIGZyZWUgbGlzdCAgKi8KKyAgICBfX2ttcF9iZ2V0X3JlbW92ZV9mcm9tX2ZyZWVsaXN0KGIpOworCisgICAgS0VfVFJBQ0UoMTAsICgiJSUlJSUlIEZSRUUoICVwIClcbiIsICh2b2lkICopYikpOworCisgICAgKCp0aHItPnJlbGZjbikoYik7CisgICAgdGhyLT5udW1wcmVsKys7IC8qIE5yIG9mIGV4cGFuc2lvbiBibG9jayByZWxlYXNlcyAqLworICAgIHRoci0+bnVtcGJsay0tOyAvKiBUb3RhbCBudW1iZXIgb2YgYmxvY2tzICovCisgICAgS01QX0RFQlVHX0FTU0VSVCh0aHItPm51bXBibGsgPT0gdGhyLT5udW1wZ2V0IC0gdGhyLT5udW1wcmVsKTsKKyAgfQorI2VuZGlmIC8qIEJ1ZlN0YXRzICovCisKKyAgLyogRGVhbGxvY2F0ZSBiZ2V0X2RhdGEgKi8KKyAgaWYgKHRoLT50aC50aF9sb2NhbC5iZ2V0X2RhdGEgIT0gTlVMTCkgeworICAgIF9fa21wX2ZyZWUodGgtPnRoLnRoX2xvY2FsLmJnZXRfZGF0YSk7CisgICAgdGgtPnRoLnRoX2xvY2FsLmJnZXRfZGF0YSA9IE5VTEw7CisgIH07IC8vIGlmCit9CisKK3ZvaWQga21wY19zZXRfcG9vbHNpemUoc2l6ZV90IHNpemUpIHsKKyAgYmVjdGwoX19rbXBfZ2V0X3RocmVhZCgpLCAoYmdldF9jb21wYWN0X3QpMCwgKGJnZXRfYWNxdWlyZV90KW1hbGxvYywKKyAgICAgICAgKGJnZXRfcmVsZWFzZV90KWZyZWUsIChidWZzaXplKXNpemUpOworfQorCitzaXplX3Qga21wY19nZXRfcG9vbHNpemUodm9pZCkgeworICB0aHJfZGF0YV90ICpwOworCisgIHAgPSBnZXRfdGhyX2RhdGEoX19rbXBfZ2V0X3RocmVhZCgpKTsKKworICByZXR1cm4gcC0+ZXhwX2luY3I7Cit9CisKK3ZvaWQga21wY19zZXRfcG9vbG1vZGUoaW50IG1vZGUpIHsKKyAgdGhyX2RhdGFfdCAqcDsKKworICBpZiAobW9kZSA9PSBiZ2V0X21vZGVfZmlmbyB8fCBtb2RlID09IGJnZXRfbW9kZV9saWZvIHx8CisgICAgICBtb2RlID09IGJnZXRfbW9kZV9iZXN0KSB7CisgICAgcCA9IGdldF90aHJfZGF0YShfX2ttcF9nZXRfdGhyZWFkKCkpOworICAgIHAtPm1vZGUgPSAoYmdldF9tb2RlX3QpbW9kZTsKKyAgfQorfQorCitpbnQga21wY19nZXRfcG9vbG1vZGUodm9pZCkgeworICB0aHJfZGF0YV90ICpwOworCisgIHAgPSBnZXRfdGhyX2RhdGEoX19rbXBfZ2V0X3RocmVhZCgpKTsKKworICByZXR1cm4gcC0+bW9kZTsKK30KKwordm9pZCBrbXBjX2dldF9wb29sc3RhdChzaXplX3QgKm1heG1lbSwgc2l6ZV90ICphbGxtZW0pIHsKKyAga21wX2luZm9fdCAqdGggPSBfX2ttcF9nZXRfdGhyZWFkKCk7CisgIGJ1ZnNpemUgYSwgYjsKKworICBfX2ttcF9iZ2V0X2RlcXVldWUodGgpOyAvKiBSZWxlYXNlIGFueSBxdWV1ZWQgYnVmZmVycyAqLworCisgIGJjaGVjayh0aCwgJmEsICZiKTsKKworICAqbWF4bWVtID0gYTsKKyAgKmFsbG1lbSA9IGI7Cit9CisKK3ZvaWQga21wY19wb29scHJpbnQodm9pZCkgeworICBrbXBfaW5mb190ICp0aCA9IF9fa21wX2dldF90aHJlYWQoKTsKKworICBfX2ttcF9iZ2V0X2RlcXVldWUodGgpOyAvKiBSZWxlYXNlIGFueSBxdWV1ZWQgYnVmZmVycyAqLworCisgIGJmcmVlZCh0aCk7Cit9CisKKyNlbmRpZiAvLyAjaWYgS01QX1VTRV9CR0VUCisKK3ZvaWQgKmttcGNfbWFsbG9jKHNpemVfdCBzaXplKSB7CisgIHZvaWQgKnB0cjsKKyAgcHRyID0gYmdldChfX2ttcF9lbnRyeV90aHJlYWQoKSwgKGJ1ZnNpemUpKHNpemUgKyBzaXplb2YocHRyKSkpOworICBpZiAocHRyICE9IE5VTEwpIHsKKyAgICAvLyBzYXZlIGFsbG9jYXRlZCBwb2ludGVyIGp1c3QgYmVmb3JlIG9uZSByZXR1cm5lZCB0byB1c2VyCisgICAgKih2b2lkICoqKXB0ciA9IHB0cjsKKyAgICBwdHIgPSAodm9pZCAqKilwdHIgKyAxOworICB9CisgIHJldHVybiBwdHI7Cit9CisKKyNkZWZpbmUgSVNfUE9XRVJfT0ZfVFdPKG4pICgoKG4pICYgKChuKS0xKSkgPT0gMCkKKwordm9pZCAqa21wY19hbGlnbmVkX21hbGxvYyhzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWdubWVudCkgeworICB2b2lkICpwdHI7CisgIHZvaWQgKnB0cl9hbGxvY2F0ZWQ7CisgIEtNUF9ERUJVR19BU1NFUlQoYWxpZ25tZW50IDwgMzIgKiAxMDI0KTsgLy8gQWxpZ25tZW50IHNob3VsZCBub3QgYmUgdG9vIGJpZworICBpZiAoIUlTX1BPV0VSX09GX1RXTyhhbGlnbm1lbnQpKSB7CisgICAgLy8gQUM6IGRvIHdlIG5lZWQgdG8gaXNzdWUgYSB3YXJuaW5nIGhlcmU/CisgICAgZXJybm8gPSBFSU5WQUw7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgc2l6ZSA9IHNpemUgKyBzaXplb2Yodm9pZCAqKSArIGFsaWdubWVudDsKKyAgcHRyX2FsbG9jYXRlZCA9IGJnZXQoX19rbXBfZW50cnlfdGhyZWFkKCksIChidWZzaXplKXNpemUpOworICBpZiAocHRyX2FsbG9jYXRlZCAhPSBOVUxMKSB7CisgICAgLy8gc2F2ZSBhbGxvY2F0ZWQgcG9pbnRlciBqdXN0IGJlZm9yZSBvbmUgcmV0dXJuZWQgdG8gdXNlcgorICAgIHB0ciA9ICh2b2lkICopKCgoa21wX3VpbnRwdHJfdClwdHJfYWxsb2NhdGVkICsgc2l6ZW9mKHZvaWQgKikgKyBhbGlnbm1lbnQpICYKKyAgICAgICAgICAgICAgICAgICB+KGFsaWdubWVudCAtIDEpKTsKKyAgICAqKCh2b2lkICoqKXB0ciAtIDEpID0gcHRyX2FsbG9jYXRlZDsKKyAgfSBlbHNlIHsKKyAgICBwdHIgPSBOVUxMOworICB9CisgIHJldHVybiBwdHI7Cit9CisKK3ZvaWQgKmttcGNfY2FsbG9jKHNpemVfdCBuZWxlbSwgc2l6ZV90IGVsc2l6ZSkgeworICB2b2lkICpwdHI7CisgIHB0ciA9IGJnZXR6KF9fa21wX2VudHJ5X3RocmVhZCgpLCAoYnVmc2l6ZSkobmVsZW0gKiBlbHNpemUgKyBzaXplb2YocHRyKSkpOworICBpZiAocHRyICE9IE5VTEwpIHsKKyAgICAvLyBzYXZlIGFsbG9jYXRlZCBwb2ludGVyIGp1c3QgYmVmb3JlIG9uZSByZXR1cm5lZCB0byB1c2VyCisgICAgKih2b2lkICoqKXB0ciA9IHB0cjsKKyAgICBwdHIgPSAodm9pZCAqKilwdHIgKyAxOworICB9CisgIHJldHVybiBwdHI7Cit9CisKK3ZvaWQgKmttcGNfcmVhbGxvYyh2b2lkICpwdHIsIHNpemVfdCBzaXplKSB7CisgIHZvaWQgKnJlc3VsdCA9IE5VTEw7CisgIGlmIChwdHIgPT0gTlVMTCkgeworICAgIC8vIElmIHBvaW50ZXIgaXMgTlVMTCwgcmVhbGxvYyBiZWhhdmVzIGxpa2UgbWFsbG9jLgorICAgIHJlc3VsdCA9IGJnZXQoX19rbXBfZW50cnlfdGhyZWFkKCksIChidWZzaXplKShzaXplICsgc2l6ZW9mKHB0cikpKTsKKyAgICAvLyBzYXZlIGFsbG9jYXRlZCBwb2ludGVyIGp1c3QgYmVmb3JlIG9uZSByZXR1cm5lZCB0byB1c2VyCisgICAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7CisgICAgICAqKHZvaWQgKiopcmVzdWx0ID0gcmVzdWx0OworICAgICAgcmVzdWx0ID0gKHZvaWQgKiopcmVzdWx0ICsgMTsKKyAgICB9CisgIH0gZWxzZSBpZiAoc2l6ZSA9PSAwKSB7CisgICAgLy8gSWYgc2l6ZSBpcyAwLCByZWFsbG9jIGJlaGF2ZXMgbGlrZSBmcmVlLgorICAgIC8vIFRoZSB0aHJlYWQgbXVzdCBiZSByZWdpc3RlcmVkIGJ5IHRoZSBjYWxsIHRvIGttcGNfbWFsbG9jKCkgb3IKKyAgICAvLyBrbXBjX2NhbGxvYygpIGJlZm9yZS4KKyAgICAvLyBTbyBpdCBzaG91bGQgYmUgc2FmZSB0byBjYWxsIF9fa21wX2dldF90aHJlYWQoKSwgbm90CisgICAgLy8gX19rbXBfZW50cnlfdGhyZWFkKCkuCisgICAgS01QX0FTU0VSVCgqKCh2b2lkICoqKXB0ciAtIDEpKTsKKyAgICBicmVsKF9fa21wX2dldF90aHJlYWQoKSwgKigodm9pZCAqKilwdHIgLSAxKSk7CisgIH0gZWxzZSB7CisgICAgcmVzdWx0ID0gYmdldHIoX19rbXBfZW50cnlfdGhyZWFkKCksICooKHZvaWQgKiopcHRyIC0gMSksCisgICAgICAgICAgICAgICAgICAgKGJ1ZnNpemUpKHNpemUgKyBzaXplb2YocHRyKSkpOworICAgIGlmIChyZXN1bHQgIT0gTlVMTCkgeworICAgICAgKih2b2lkICoqKXJlc3VsdCA9IHJlc3VsdDsKKyAgICAgIHJlc3VsdCA9ICh2b2lkICoqKXJlc3VsdCArIDE7CisgICAgfQorICB9OyAvLyBpZgorICByZXR1cm4gcmVzdWx0OworfQorCisvLyBOT1RFOiB0aGUgbGlicmFyeSBtdXN0IGhhdmUgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIGJ5IGEgcHJldmlvdXMgYWxsb2NhdGUKK3ZvaWQga21wY19mcmVlKHZvaWQgKnB0cikgeworICBpZiAoIV9fa21wX2luaXRfc2VyaWFsKSB7CisgICAgcmV0dXJuOworICB9OyAvLyBpZgorICBpZiAocHRyICE9IE5VTEwpIHsKKyAgICBrbXBfaW5mb190ICp0aCA9IF9fa21wX2dldF90aHJlYWQoKTsKKyAgICBfX2ttcF9iZ2V0X2RlcXVldWUodGgpOyAvKiBSZWxlYXNlIGFueSBxdWV1ZWQgYnVmZmVycyAqLworICAgIC8vIGV4dHJhY3QgYWxsb2NhdGVkIHBvaW50ZXIgYW5kIGZyZWUgaXQKKyAgICBLTVBfQVNTRVJUKCooKHZvaWQgKiopcHRyIC0gMSkpOworICAgIGJyZWwodGgsICooKHZvaWQgKiopcHRyIC0gMSkpOworICB9OworfQorCit2b2lkICpfX19rbXBfdGhyZWFkX21hbGxvYyhrbXBfaW5mb190ICp0aCwgc2l6ZV90IHNpemUgS01QX1NSQ19MT0NfREVDTCkgeworICB2b2lkICpwdHI7CisgIEtFX1RSQUNFKDMwLCAoIi0+IF9fa21wX3RocmVhZF9tYWxsb2MoICVwLCAlZCApIGNhbGxlZCBmcm9tICVzOiVkXG4iLCB0aCwKKyAgICAgICAgICAgICAgICAoaW50KXNpemUgS01QX1NSQ19MT0NfUEFSTSkpOworICBwdHIgPSBiZ2V0KHRoLCAoYnVmc2l6ZSlzaXplKTsKKyAgS0VfVFJBQ0UoMzAsICgiPC0gX19rbXBfdGhyZWFkX21hbGxvYygpIHJldHVybnMgJXBcbiIsIHB0cikpOworICByZXR1cm4gcHRyOworfQorCit2b2lkICpfX19rbXBfdGhyZWFkX2NhbGxvYyhrbXBfaW5mb190ICp0aCwgc2l6ZV90IG5lbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGVsc2l6ZSBLTVBfU1JDX0xPQ19ERUNMKSB7CisgIHZvaWQgKnB0cjsKKyAgS0VfVFJBQ0UoMzAsICgiLT4gX19rbXBfdGhyZWFkX2NhbGxvYyggJXAsICVkLCAlZCApIGNhbGxlZCBmcm9tICVzOiVkXG4iLCB0aCwKKyAgICAgICAgICAgICAgICAoaW50KW5lbGVtLCAoaW50KWVsc2l6ZSBLTVBfU1JDX0xPQ19QQVJNKSk7CisgIHB0ciA9IGJnZXR6KHRoLCAoYnVmc2l6ZSkobmVsZW0gKiBlbHNpemUpKTsKKyAgS0VfVFJBQ0UoMzAsICgiPC0gX19rbXBfdGhyZWFkX2NhbGxvYygpIHJldHVybnMgJXBcbiIsIHB0cikpOworICByZXR1cm4gcHRyOworfQorCit2b2lkICpfX19rbXBfdGhyZWFkX3JlYWxsb2Moa21wX2luZm9fdCAqdGgsIHZvaWQgKnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSBLTVBfU1JDX0xPQ19ERUNMKSB7CisgIEtFX1RSQUNFKDMwLCAoIi0+IF9fa21wX3RocmVhZF9yZWFsbG9jKCAlcCwgJXAsICVkICkgY2FsbGVkIGZyb20gJXM6JWRcbiIsIHRoLAorICAgICAgICAgICAgICAgIHB0ciwgKGludClzaXplIEtNUF9TUkNfTE9DX1BBUk0pKTsKKyAgcHRyID0gYmdldHIodGgsIHB0ciwgKGJ1ZnNpemUpc2l6ZSk7CisgIEtFX1RSQUNFKDMwLCAoIjwtIF9fa21wX3RocmVhZF9yZWFsbG9jKCkgcmV0dXJucyAlcFxuIiwgcHRyKSk7CisgIHJldHVybiBwdHI7Cit9CisKK3ZvaWQgX19fa21wX3RocmVhZF9mcmVlKGttcF9pbmZvX3QgKnRoLCB2b2lkICpwdHIgS01QX1NSQ19MT0NfREVDTCkgeworICBLRV9UUkFDRSgzMCwgKCItPiBfX2ttcF90aHJlYWRfZnJlZSggJXAsICVwICkgY2FsbGVkIGZyb20gJXM6JWRcbiIsIHRoLAorICAgICAgICAgICAgICAgIHB0ciBLTVBfU1JDX0xPQ19QQVJNKSk7CisgIGlmIChwdHIgIT0gTlVMTCkgeworICAgIF9fa21wX2JnZXRfZGVxdWV1ZSh0aCk7IC8qIFJlbGVhc2UgYW55IHF1ZXVlZCBidWZmZXJzICovCisgICAgYnJlbCh0aCwgcHRyKTsKKyAgfQorICBLRV9UUkFDRSgzMCwgKCI8LSBfX2ttcF90aHJlYWRfZnJlZSgpXG4iKSk7Cit9CisKKy8qIElmIExFQUtfTUVNT1JZIGlzIGRlZmluZWQsIF9fa21wX2ZyZWUoKSB3aWxsICpub3QqIGZyZWUgbWVtb3J5LiBJdCBjYXVzZXMKKyAgIG1lbW9yeSBsZWFrcywgYnV0IGl0IG1heSBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBtZW1vcnkgY29ycnVwdGlvbnMsIHVzZWQKKyAgIGZyZWVkIHBvaW50ZXJzLCBldGMuICovCisvKiAjZGVmaW5lIExFQUtfTUVNT1JZICovCitzdHJ1Y3Qga21wX21lbV9kZXNjciB7IC8vIE1lbW9yeSBibG9jayBkZXNjcmlwdG9yLgorICB2b2lkICpwdHJfYWxsb2NhdGVkOyAvLyBQb2ludGVyIHJldHVybmVkIGJ5IG1hbGxvYygpLCBzdWJqZWN0IGZvciBmcmVlKCkuCisgIHNpemVfdCBzaXplX2FsbG9jYXRlZDsgLy8gU2l6ZSBvZiBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrLgorICB2b2lkICpwdHJfYWxpZ25lZDsgLy8gUG9pbnRlciB0byBhbGlnbmVkIG1lbW9yeSwgdG8gYmUgdXNlZCBieSBjbGllbnQgY29kZS4KKyAgc2l6ZV90IHNpemVfYWxpZ25lZDsgLy8gU2l6ZSBvZiBhbGlnbmVkIG1lbW9yeSBibG9jay4KK307Cit0eXBlZGVmIHN0cnVjdCBrbXBfbWVtX2Rlc2NyIGttcF9tZW1fZGVzY3JfdDsKKworLyogQWxsb2NhdGUgbWVtb3J5IG9uIHJlcXVlc3RlZCBib3VuZGFyeSwgZmlsbCBhbGxvY2F0ZWQgbWVtb3J5IHdpdGggMHgwMC4KKyAgIE5VTEwgaXMgTkVWRVIgcmV0dXJuZWQsIF9fa21wX2Fib3J0KCkgaXMgY2FsbGVkIGluIGNhc2Ugb2YgbWVtb3J5IGFsbG9jYXRpb24KKyAgIGVycm9yLiBNdXN0IHVzZSBfX2ttcF9mcmVlIHdoZW4gZnJlZWluZyBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoaXMgcm91dGluZSEgKi8KK3N0YXRpYyB2b2lkICpfX19rbXBfYWxsb2NhdGVfYWxpZ24oc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBhbGlnbm1lbnQgS01QX1NSQ19MT0NfREVDTCkgeworICAvKiBfX2ttcF9hbGxvY2F0ZSgpIGFsbG9jYXRlcyAoYnkgY2FsbCB0byBtYWxsb2MoKSkgYmlnZ2VyIG1lbW9yeSBibG9jayB0aGFuCisgICAgIHJlcXVlc3RlZCB0byByZXR1cm4gcHJvcGVybHkgYWxpZ25lZCBwb2ludGVyLiBPcmlnaW5hbCBwb2ludGVyIHJldHVybmVkCisgICAgIGJ5IG1hbGxvYygpIGFuZCBzaXplIG9mIGFsbG9jYXRlZCBibG9jayBpcyBzYXZlZCBpbiBkZXNjcmlwdG9yIGp1c3QKKyAgICAgYmVmb3JlIHRoZSBhbGlnbmVkIHBvaW50ZXIuIFRoaXMgaW5mb3JtYXRpb24gdXNlZCBieSBfX2ttcF9mcmVlKCkgLS0gaXQKKyAgICAgaGFzIHRvIHBhc3MgdG8gZnJlZSgpIG9yaWdpbmFsIHBvaW50ZXIsIG5vdCBhbGlnbmVkIG9uZS4KKworICAgICAgICAgICstLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKKyAgICAgICAgICB8IHBhZGRpbmcgfCBkZXNjcmlwdG9yIHwgICAgICAgICAgIGFsaWduZWQgYmxvY2sgICAgICAgICAgIHwgcGFkZGluZyB8CisgICAgICAgICAgKy0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKworICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgICAgXgorICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgKy0gQWxpZ25lZCBwb2ludGVyIHJldHVybmVkIHRvIGNhbGxlcgorICAgICAgICAgICstIFBvaW50ZXIgcmV0dXJuZWQgYnkgbWFsbG9jKCkKKworICAgICAgQWxpZ25lZCBibG9jayBpcyBmaWxsZWQgd2l0aCB6ZXJvcywgcGFkZGluZ3MgYXJlIGZpbGxlZCB3aXRoIDB4RUYuICovCisKKyAga21wX21lbV9kZXNjcl90IGRlc2NyOworICBrbXBfdWludHB0cl90IGFkZHJfYWxsb2NhdGVkOyAvLyBBZGRyZXNzIHJldHVybmVkIGJ5IG1hbGxvYygpLgorICBrbXBfdWludHB0cl90IGFkZHJfYWxpZ25lZDsgLy8gQWxpZ25lZCBhZGRyZXNzIHRvIHJldHVybiB0byBjYWxsZXIuCisgIGttcF91aW50cHRyX3QgYWRkcl9kZXNjcjsgLy8gQWRkcmVzcyBvZiBtZW1vcnkgYmxvY2sgZGVzY3JpcHRvci4KKworICBLRV9UUkFDRSgyNSwgKCItPiBfX19rbXBfYWxsb2NhdGVfYWxpZ24oICVkLCAlZCApIGNhbGxlZCBmcm9tICVzOiVkXG4iLAorICAgICAgICAgICAgICAgIChpbnQpc2l6ZSwgKGludClhbGlnbm1lbnQgS01QX1NSQ19MT0NfUEFSTSkpOworCisgIEtNUF9ERUJVR19BU1NFUlQoYWxpZ25tZW50IDwgMzIgKiAxMDI0KTsgLy8gQWxpZ25tZW50IHNob3VsZCBub3QgYmUgdG9vCisgIEtNUF9ERUJVR19BU1NFUlQoc2l6ZW9mKHZvaWQgKikgPD0gc2l6ZW9mKGttcF91aW50cHRyX3QpKTsKKyAgLy8gTWFrZSBzdXJlIGttcF91aW50cHRyX3QgaXMgZW5vdWdoIHRvIHN0b3JlIGFkZHJlc3Nlcy4KKworICBkZXNjci5zaXplX2FsaWduZWQgPSBzaXplOworICBkZXNjci5zaXplX2FsbG9jYXRlZCA9CisgICAgICBkZXNjci5zaXplX2FsaWduZWQgKyBzaXplb2Yoa21wX21lbV9kZXNjcl90KSArIGFsaWdubWVudDsKKworI2lmIEtNUF9ERUJVRworICBkZXNjci5wdHJfYWxsb2NhdGVkID0gX21hbGxvY19zcmNfbG9jKGRlc2NyLnNpemVfYWxsb2NhdGVkLCBfZmlsZV8sIF9saW5lXyk7CisjZWxzZQorICBkZXNjci5wdHJfYWxsb2NhdGVkID0gbWFsbG9jX3NyY19sb2MoZGVzY3Iuc2l6ZV9hbGxvY2F0ZWQgS01QX1NSQ19MT0NfUEFSTSk7CisjZW5kaWYKKyAgS0VfVFJBQ0UoMTAsICgiICAgbWFsbG9jKCAlZCApIHJldHVybmVkICVwXG4iLCAoaW50KWRlc2NyLnNpemVfYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgIGRlc2NyLnB0cl9hbGxvY2F0ZWQpKTsKKyAgaWYgKGRlc2NyLnB0cl9hbGxvY2F0ZWQgPT0gTlVMTCkgeworICAgIEtNUF9GQVRBTChPdXRPZkhlYXBNZW1vcnkpOworICB9OworCisgIGFkZHJfYWxsb2NhdGVkID0gKGttcF91aW50cHRyX3QpZGVzY3IucHRyX2FsbG9jYXRlZDsKKyAgYWRkcl9hbGlnbmVkID0KKyAgICAgIChhZGRyX2FsbG9jYXRlZCArIHNpemVvZihrbXBfbWVtX2Rlc2NyX3QpICsgYWxpZ25tZW50KSAmIH4oYWxpZ25tZW50IC0gMSk7CisgIGFkZHJfZGVzY3IgPSBhZGRyX2FsaWduZWQgLSBzaXplb2Yoa21wX21lbV9kZXNjcl90KTsKKworICBkZXNjci5wdHJfYWxpZ25lZCA9ICh2b2lkICopYWRkcl9hbGlnbmVkOworCisgIEtFX1RSQUNFKDI2LCAoIiAgIF9fX2ttcF9hbGxvY2F0ZV9hbGlnbjogIgorICAgICAgICAgICAgICAgICJwdHJfYWxsb2NhdGVkPSVwLCBzaXplX2FsbG9jYXRlZD0lZCwgIgorICAgICAgICAgICAgICAgICJwdHJfYWxpZ25lZD0lcCwgc2l6ZV9hbGlnbmVkPSVkXG4iLAorICAgICAgICAgICAgICAgIGRlc2NyLnB0cl9hbGxvY2F0ZWQsIChpbnQpZGVzY3Iuc2l6ZV9hbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgZGVzY3IucHRyX2FsaWduZWQsIChpbnQpZGVzY3Iuc2l6ZV9hbGlnbmVkKSk7CisKKyAgS01QX0RFQlVHX0FTU0VSVChhZGRyX2FsbG9jYXRlZCA8PSBhZGRyX2Rlc2NyKTsKKyAgS01QX0RFQlVHX0FTU0VSVChhZGRyX2Rlc2NyICsgc2l6ZW9mKGttcF9tZW1fZGVzY3JfdCkgPT0gYWRkcl9hbGlnbmVkKTsKKyAgS01QX0RFQlVHX0FTU0VSVChhZGRyX2FsaWduZWQgKyBkZXNjci5zaXplX2FsaWduZWQgPD0KKyAgICAgICAgICAgICAgICAgICBhZGRyX2FsbG9jYXRlZCArIGRlc2NyLnNpemVfYWxsb2NhdGVkKTsKKyAgS01QX0RFQlVHX0FTU0VSVChhZGRyX2FsaWduZWQgJSBhbGlnbm1lbnQgPT0gMCk7CisjaWZkZWYgS01QX0RFQlVHCisgIG1lbXNldChkZXNjci5wdHJfYWxsb2NhdGVkLCAweEVGLCBkZXNjci5zaXplX2FsbG9jYXRlZCk7CisvLyBGaWxsIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2sgd2l0aCAweEVGLgorI2VuZGlmCisgIG1lbXNldChkZXNjci5wdHJfYWxpZ25lZCwgMHgwMCwgZGVzY3Iuc2l6ZV9hbGlnbmVkKTsKKyAgLy8gRmlsbCB0aGUgYWxpZ25lZCBtZW1vcnkgYmxvY2sgKHdoaWNoIGlzIGludGVuZGVkIGZvciB1c2luZyBieSBjYWxsZXIpIHdpdGgKKyAgLy8gMHgwMC4gRG8gbm90CisgIC8vIHB1dCB0aGlzIGZpbGxpbmcgdW5kZXIgS01QX0RFQlVHIGNvbmRpdGlvbiEgTWFueSBjYWxsZXJzIGV4cGVjdCB6ZXJvZWQKKyAgLy8gbWVtb3J5LiAoUGFkZGluZworICAvLyBieXRlcyByZW1haW4gZmlsbGVkIHdpdGggMHhFRiBpbiBkZWJ1Z2dpbmcgbGlicmFyeS4pCisgICooKGttcF9tZW1fZGVzY3JfdCAqKWFkZHJfZGVzY3IpID0gZGVzY3I7CisKKyAgS01QX01CKCk7CisKKyAgS0VfVFJBQ0UoMjUsICgiPC0gX19fa21wX2FsbG9jYXRlX2FsaWduKCkgcmV0dXJucyAlcFxuIiwgZGVzY3IucHRyX2FsaWduZWQpKTsKKyAgcmV0dXJuIGRlc2NyLnB0cl9hbGlnbmVkOworfSAvLyBmdW5jIF9fX2ttcF9hbGxvY2F0ZV9hbGlnbgorCisvKiBBbGxvY2F0ZSBtZW1vcnkgb24gY2FjaGUgbGluZSBib3VuZGFyeSwgZmlsbCBhbGxvY2F0ZWQgbWVtb3J5IHdpdGggMHgwMC4KKyAgIERvIG5vdCBjYWxsIHRoaXMgZnVuYyBkaXJlY3RseSEgVXNlIF9fa21wX2FsbG9jYXRlIG1hY3JvIGluc3RlYWQuCisgICBOVUxMIGlzIE5FVkVSIHJldHVybmVkLCBfX2ttcF9hYm9ydCgpIGlzIGNhbGxlZCBpbiBjYXNlIG9mIG1lbW9yeSBhbGxvY2F0aW9uCisgICBlcnJvci4gTXVzdCB1c2UgX19rbXBfZnJlZSB3aGVuIGZyZWVpbmcgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGlzIHJvdXRpbmUhICovCit2b2lkICpfX19rbXBfYWxsb2NhdGUoc2l6ZV90IHNpemUgS01QX1NSQ19MT0NfREVDTCkgeworICB2b2lkICpwdHI7CisgIEtFX1RSQUNFKDI1LCAoIi0+IF9fa21wX2FsbG9jYXRlKCAlZCApIGNhbGxlZCBmcm9tICVzOiVkXG4iLAorICAgICAgICAgICAgICAgIChpbnQpc2l6ZSBLTVBfU1JDX0xPQ19QQVJNKSk7CisgIHB0ciA9IF9fX2ttcF9hbGxvY2F0ZV9hbGlnbihzaXplLCBfX2ttcF9hbGlnbl9hbGxvYyBLTVBfU1JDX0xPQ19QQVJNKTsKKyAgS0VfVFJBQ0UoMjUsICgiPC0gX19rbXBfYWxsb2NhdGUoKSByZXR1cm5zICVwXG4iLCBwdHIpKTsKKyAgcmV0dXJuIHB0cjsKK30gLy8gZnVuYyBfX19rbXBfYWxsb2NhdGUKKworI2lmIChCVUlMRF9NRU1PUlkgPT0gRklSU1RfVE9VQ0gpCit2b2lkICpfX2ttcF9mdF9wYWdlX2FsbG9jYXRlKHNpemVfdCBzaXplKSB7CisgIHZvaWQgKmFkciwgKmFhZHI7CisKKyAgY29uc3QgaW50IHBhZ2Vfc2l6ZSA9IEtNUF9HRVRfUEFHRV9TSVpFKCk7CisKKyAgYWRyID0gKHZvaWQgKilfX2ttcF90aHJlYWRfbWFsbG9jKF9fa21wX2dldF90aHJlYWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgKyBwYWdlX3NpemUgKyBLTVBfUFRSX1NLSVApOworICBpZiAoYWRyID09IDApCisgICAgS01QX0ZBVEFMKE91dE9mSGVhcE1lbW9yeSk7CisKKyAgLyogY2hlY2sgdG8gc2VlIGlmIGFkciBpcyBvbiBhIHBhZ2UgYm91bmRhcnkuICovCisgIGlmICgoKGttcF91aW50cHRyX3QpYWRyICYgKHBhZ2Vfc2l6ZSAtIDEpKSA9PSAwKQorICAgIC8qIG5vdGhpbmcgdG8gZG8gaWYgYWRyIGlzIGFscmVhZHkgb24gYSBwYWdlIGJvdW5kYXJ5LiAqLworICAgIGFhZHIgPSBhZHI7CisgIGVsc2UKKyAgICAvKiBlbHNlIHNldCBhYWRyIHRvIHRoZSBmaXJzdCBwYWdlIGJvdW5kYXJ5IGluIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LiAqLworICAgIGFhZHIgPSAodm9pZCAqKSgoKGttcF91aW50cHRyX3QpYWRyICsgcGFnZV9zaXplKSAmIH4ocGFnZV9zaXplIC0gMSkpOworCisgIC8qIHRoZSBmaXJzdCB0b3VjaCBieSB0aGUgb3duZXIgdGhyZWFkLiAqLworICAqKCh2b2lkICoqKWFhZHIpID0gYWRyOworCisgIC8qIHNraXAgdGhlIG1lbW9yeSBzcGFjZSB1c2VkIGZvciBzdG9yaW5nIGFkciBhYm92ZS4gKi8KKyAgcmV0dXJuICh2b2lkICopKChjaGFyICopYWFkciArIEtNUF9QVFJfU0tJUCk7Cit9CisjZW5kaWYKKworLyogQWxsb2NhdGUgbWVtb3J5IG9uIHBhZ2UgYm91bmRhcnksIGZpbGwgYWxsb2NhdGVkIG1lbW9yeSB3aXRoIDB4MDAuCisgICBEb2VzIG5vdCBjYWxsIHRoaXMgZnVuYyBkaXJlY3RseSEgVXNlIF9fa21wX3BhZ2VfYWxsb2NhdGUgbWFjcm8gaW5zdGVhZC4KKyAgIE5VTEwgaXMgTkVWRVIgcmV0dXJuZWQsIF9fa21wX2Fib3J0KCkgaXMgY2FsbGVkIGluIGNhc2Ugb2YgbWVtb3J5IGFsbG9jYXRpb24KKyAgIGVycm9yLiBNdXN0IHVzZSBfX2ttcF9mcmVlIHdoZW4gZnJlZWluZyBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoaXMgcm91dGluZSEgKi8KK3ZvaWQgKl9fX2ttcF9wYWdlX2FsbG9jYXRlKHNpemVfdCBzaXplIEtNUF9TUkNfTE9DX0RFQ0wpIHsKKyAgaW50IHBhZ2Vfc2l6ZSA9IDggKiAxMDI0OworICB2b2lkICpwdHI7CisKKyAgS0VfVFJBQ0UoMjUsICgiLT4gX19rbXBfcGFnZV9hbGxvY2F0ZSggJWQgKSBjYWxsZWQgZnJvbSAlczolZFxuIiwKKyAgICAgICAgICAgICAgICAoaW50KXNpemUgS01QX1NSQ19MT0NfUEFSTSkpOworICBwdHIgPSBfX19rbXBfYWxsb2NhdGVfYWxpZ24oc2l6ZSwgcGFnZV9zaXplIEtNUF9TUkNfTE9DX1BBUk0pOworICBLRV9UUkFDRSgyNSwgKCI8LSBfX2ttcF9wYWdlX2FsbG9jYXRlKCAlZCApIHJldHVybnMgJXBcbiIsIChpbnQpc2l6ZSwgcHRyKSk7CisgIHJldHVybiBwdHI7Cit9IC8vIF9fX2ttcF9wYWdlX2FsbG9jYXRlCisKKy8qIEZyZWUgbWVtb3J5IGFsbG9jYXRlZCBieSBfX2ttcF9hbGxvY2F0ZSgpIGFuZCBfX2ttcF9wYWdlX2FsbG9jYXRlKCkuCisgICBJbiBkZWJ1ZyBtb2RlLCBmaWxsIHRoZSBtZW1vcnkgYmxvY2sgd2l0aCAweEVGIGJlZm9yZSBjYWxsIHRvIGZyZWUoKS4gKi8KK3ZvaWQgX19fa21wX2ZyZWUodm9pZCAqcHRyIEtNUF9TUkNfTE9DX0RFQ0wpIHsKKyAga21wX21lbV9kZXNjcl90IGRlc2NyOworICBrbXBfdWludHB0cl90IGFkZHJfYWxsb2NhdGVkOyAvLyBBZGRyZXNzIHJldHVybmVkIGJ5IG1hbGxvYygpLgorICBrbXBfdWludHB0cl90IGFkZHJfYWxpZ25lZDsgLy8gQWxpZ25lZCBhZGRyZXNzIHBhc3NlZCBieSBjYWxsZXIuCisKKyAgS0VfVFJBQ0UoMjUsCisgICAgICAgICAgICgiLT4gX19rbXBfZnJlZSggJXAgKSBjYWxsZWQgZnJvbSAlczolZFxuIiwgcHRyIEtNUF9TUkNfTE9DX1BBUk0pKTsKKyAgS01QX0FTU0VSVChwdHIgIT0gTlVMTCk7CisKKyAgZGVzY3IgPSAqKGttcF9tZW1fZGVzY3JfdCAqKSgoa21wX3VpbnRwdHJfdClwdHIgLSBzaXplb2Yoa21wX21lbV9kZXNjcl90KSk7CisKKyAgS0VfVFJBQ0UoMjYsICgiICAgX19rbXBfZnJlZTogICAgICIKKyAgICAgICAgICAgICAgICAicHRyX2FsbG9jYXRlZD0lcCwgc2l6ZV9hbGxvY2F0ZWQ9JWQsICIKKyAgICAgICAgICAgICAgICAicHRyX2FsaWduZWQ9JXAsIHNpemVfYWxpZ25lZD0lZFxuIiwKKyAgICAgICAgICAgICAgICBkZXNjci5wdHJfYWxsb2NhdGVkLCAoaW50KWRlc2NyLnNpemVfYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgIGRlc2NyLnB0cl9hbGlnbmVkLCAoaW50KWRlc2NyLnNpemVfYWxpZ25lZCkpOworCisgIGFkZHJfYWxsb2NhdGVkID0gKGttcF91aW50cHRyX3QpZGVzY3IucHRyX2FsbG9jYXRlZDsKKyAgYWRkcl9hbGlnbmVkID0gKGttcF91aW50cHRyX3QpZGVzY3IucHRyX2FsaWduZWQ7CisKKyAgS01QX0RFQlVHX0FTU0VSVChhZGRyX2FsaWduZWQgJSBDQUNIRV9MSU5FID09IDApOworICBLTVBfREVCVUdfQVNTRVJUKGRlc2NyLnB0cl9hbGlnbmVkID09IHB0cik7CisgIEtNUF9ERUJVR19BU1NFUlQoYWRkcl9hbGxvY2F0ZWQgKyBzaXplb2Yoa21wX21lbV9kZXNjcl90KSA8PSBhZGRyX2FsaWduZWQpOworICBLTVBfREVCVUdfQVNTRVJUKGRlc2NyLnNpemVfYWxpZ25lZCA8IGRlc2NyLnNpemVfYWxsb2NhdGVkKTsKKyAgS01QX0RFQlVHX0FTU0VSVChhZGRyX2FsaWduZWQgKyBkZXNjci5zaXplX2FsaWduZWQgPD0KKyAgICAgICAgICAgICAgICAgICBhZGRyX2FsbG9jYXRlZCArIGRlc2NyLnNpemVfYWxsb2NhdGVkKTsKKworI2lmZGVmIEtNUF9ERUJVRworICBtZW1zZXQoZGVzY3IucHRyX2FsbG9jYXRlZCwgMHhFRiwgZGVzY3Iuc2l6ZV9hbGxvY2F0ZWQpOworLy8gRmlsbCBtZW1vcnkgYmxvY2sgd2l0aCAweEVGLCBpdCBoZWxwcyBjYXRjaCB1c2luZyBmcmVlZCBtZW1vcnkuCisjZW5kaWYKKworI2lmbmRlZiBMRUFLX01FTU9SWQorICBLRV9UUkFDRSgxMCwgKCIgICBmcmVlKCAlcCApXG4iLCBkZXNjci5wdHJfYWxsb2NhdGVkKSk7CisjaWZkZWYgS01QX0RFQlVHCisgIF9mcmVlX3NyY19sb2MoZGVzY3IucHRyX2FsbG9jYXRlZCwgX2ZpbGVfLCBfbGluZV8pOworI2Vsc2UKKyAgZnJlZV9zcmNfbG9jKGRlc2NyLnB0cl9hbGxvY2F0ZWQgS01QX1NSQ19MT0NfUEFSTSk7CisjZW5kaWYKKyNlbmRpZgorICBLTVBfTUIoKTsKKyAgS0VfVFJBQ0UoMjUsICgiPC0gX19rbXBfZnJlZSgpIHJldHVybnNcbiIpKTsKK30gLy8gZnVuYyBfX19rbXBfZnJlZQorCisjaWYgVVNFX0ZBU1RfTUVNT1JZID09IDMKKy8vIEFsbG9jYXRlIGZhc3QgbWVtb3J5IGJ5IGZpcnN0IHNjYW5uaW5nIHRoZSB0aHJlYWQncyBmcmVlIGxpc3RzCisvLyBJZiBhIGNodW5rIHRoZSByaWdodCBzaXplIGV4aXN0cywgZ3JhYiBpdCBvZmYgdGhlIGZyZWUgbGlzdC4KKy8vIE90aGVyd2lzZSBhbGxvY2F0ZSBub3JtYWxseSB1c2luZyBrbXBfdGhyZWFkX21hbGxvYy4KKworLy8gQUM6IEhvdyB0byBjaG9vc2UgdGhlIGxpbWl0PyBKdXN0IGdldCAxNiBmb3Igbm93Li4uCisjZGVmaW5lIEtNUF9GUkVFX0xJU1RfTElNSVQgMTYKKworLy8gQWx3YXlzIHVzZSAxMjggYnl0ZXMgZm9yIGRldGVybWluaW5nIGJ1Y2tldHMgZm9yIGNhY2hpbmcgbWVtb3J5IGJsb2NrcworI2RlZmluZSBEQ0FDSEVfTElORSAxMjgKKwordm9pZCAqX19fa21wX2Zhc3RfYWxsb2NhdGUoa21wX2luZm9fdCAqdGhpc190aHIsIHNpemVfdCBzaXplIEtNUF9TUkNfTE9DX0RFQ0wpIHsKKyAgdm9pZCAqcHRyOworICBpbnQgbnVtX2xpbmVzOworICBpbnQgaWR4OworICBpbnQgaW5kZXg7CisgIHZvaWQgKmFsbG9jX3B0cjsKKyAgc2l6ZV90IGFsbG9jX3NpemU7CisgIGttcF9tZW1fZGVzY3JfdCAqZGVzY3I7CisKKyAgS0VfVFJBQ0UoMjUsICgiLT4gX19rbXBfZmFzdF9hbGxvY2F0ZSggVCMlZCwgJWQgKSBjYWxsZWQgZnJvbSAlczolZFxuIiwKKyAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRoaXNfdGhyKSwgKGludClzaXplIEtNUF9TUkNfTE9DX1BBUk0pKTsKKworICBudW1fbGluZXMgPSAoc2l6ZSArIERDQUNIRV9MSU5FIC0gMSkgLyBEQ0FDSEVfTElORTsKKyAgaWR4ID0gbnVtX2xpbmVzIC0gMTsKKyAgS01QX0RFQlVHX0FTU0VSVChpZHggPj0gMCk7CisgIGlmIChpZHggPCAyKSB7CisgICAgaW5kZXggPSAwOyAvLyBpZHggaXMgWyAwLCAxIF0sIHVzZSBmaXJzdCBmcmVlIGxpc3QKKyAgICBudW1fbGluZXMgPSAyOyAvLyAxLCAyIGNhY2hlIGxpbmVzIG9yIGxlc3MgdGhhbiBjYWNoZSBsaW5lCisgIH0gZWxzZSBpZiAoKGlkeCA+Pj0gMikgPT0gMCkgeworICAgIGluZGV4ID0gMTsgLy8gaWR4IGlzIFsgMiwgMyBdLCB1c2Ugc2Vjb25kIGZyZWUgbGlzdAorICAgIG51bV9saW5lcyA9IDQ7IC8vIDMsIDQgY2FjaGUgbGluZXMKKyAgfSBlbHNlIGlmICgoaWR4ID4+PSAyKSA9PSAwKSB7CisgICAgaW5kZXggPSAyOyAvLyBpZHggaXMgWyA0LCAxNSBdLCB1c2UgdGhpcmQgZnJlZSBsaXN0CisgICAgbnVtX2xpbmVzID0gMTY7IC8vIDUsIDYsIC4uLiwgMTYgY2FjaGUgbGluZXMKKyAgfSBlbHNlIGlmICgoaWR4ID4+PSAyKSA9PSAwKSB7CisgICAgaW5kZXggPSAzOyAvLyBpZHggaXMgWyAxNiwgNjMgXSwgdXNlIGZvdXJ0aCBmcmVlIGxpc3QKKyAgICBudW1fbGluZXMgPSA2NDsgLy8gMTcsIDE4LCAuLi4sIDY0IGNhY2hlIGxpbmVzCisgIH0gZWxzZSB7CisgICAgZ290byBhbGxvY19jYWxsOyAvLyA2NSBvciBtb3JlIGNhY2hlIGxpbmVzICggPiA4S0IgKSwgZG9uJ3QgdXNlIGZyZWUgbGlzdHMKKyAgfQorCisgIHB0ciA9IHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfc2VsZjsKKyAgaWYgKHB0ciAhPSBOVUxMKSB7CisgICAgLy8gcG9wIHRoZSBoZWFkIG9mIG5vLXN5bmMgZnJlZSBsaXN0CisgICAgdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9zZWxmID0gKigodm9pZCAqKilwdHIpOworICAgIEtNUF9ERUJVR19BU1NFUlQoCisgICAgICAgIHRoaXNfdGhyID09CisgICAgICAgICgoa21wX21lbV9kZXNjcl90ICopKChrbXBfdWludHB0cl90KXB0ciAtIHNpemVvZihrbXBfbWVtX2Rlc2NyX3QpKSkKKyAgICAgICAgICAgIC0+cHRyX2FsaWduZWQpOworICAgIGdvdG8gZW5kOworICB9OworICBwdHIgPSBUQ1JfU1lOQ19QVFIodGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9zeW5jKTsKKyAgaWYgKHB0ciAhPSBOVUxMKSB7CisgICAgLy8gbm8tc3luYyBmcmVlIGxpc3QgaXMgZW1wdHksIHVzZSBzeW5jIGZyZWUgbGlzdCAoZmlsbGVkIGluIGJ5IG90aGVyCisgICAgLy8gdGhyZWFkcyBvbmx5KQorICAgIC8vIHBvcCB0aGUgaGVhZCBvZiB0aGUgc3luYyBmcmVlIGxpc3QsIHB1c2ggTlVMTCBpbnN0ZWFkCisgICAgd2hpbGUgKCFLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKAorICAgICAgICAmdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9zeW5jLCBwdHIsIG51bGxwdHIpKSB7CisgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICBwdHIgPSBUQ1JfU1lOQ19QVFIodGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9zeW5jKTsKKyAgICB9CisgICAgLy8gcHVzaCB0aGUgcmVzdCBvZiBjaGFpbiBpbnRvIG5vLXN5bmMgZnJlZSBsaXN0IChjYW4gYmUgTlVMTCBpZiB0aGVyZSB3YXMKKyAgICAvLyB0aGUgb25seSBibG9jaykKKyAgICB0aGlzX3Roci0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X3NlbGYgPSAqKCh2b2lkICoqKXB0cik7CisgICAgS01QX0RFQlVHX0FTU0VSVCgKKyAgICAgICAgdGhpc190aHIgPT0KKyAgICAgICAgKChrbXBfbWVtX2Rlc2NyX3QgKikoKGttcF91aW50cHRyX3QpcHRyIC0gc2l6ZW9mKGttcF9tZW1fZGVzY3JfdCkpKQorICAgICAgICAgICAgLT5wdHJfYWxpZ25lZCk7CisgICAgZ290byBlbmQ7CisgIH0KKworYWxsb2NfY2FsbDoKKyAgLy8gaGF2ZW4ndCBmb3VuZCBibG9jayBpbiB0aGUgZnJlZSBsaXN0cywgdGh1cyBhbGxvY2F0ZSBpdAorICBzaXplID0gbnVtX2xpbmVzICogRENBQ0hFX0xJTkU7CisKKyAgYWxsb2Nfc2l6ZSA9IHNpemUgKyBzaXplb2Yoa21wX21lbV9kZXNjcl90KSArIERDQUNIRV9MSU5FOworICBLRV9UUkFDRSgyNSwgKCJfX2ttcF9mYXN0X2FsbG9jYXRlOiBUIyVkIENhbGxpbmcgX19rbXBfdGhyZWFkX21hbGxvYyB3aXRoICIKKyAgICAgICAgICAgICAgICAiYWxsb2Nfc2l6ZSAlZFxuIiwKKyAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRoaXNfdGhyKSwgYWxsb2Nfc2l6ZSkpOworICBhbGxvY19wdHIgPSBiZ2V0KHRoaXNfdGhyLCAoYnVmc2l6ZSlhbGxvY19zaXplKTsKKworICAvLyBhbGlnbiBwdHIgdG8gRENBQ0hFX0xJTkUKKyAgcHRyID0gKHZvaWQgKikoKCgoa21wX3VpbnRwdHJfdClhbGxvY19wdHIpICsgc2l6ZW9mKGttcF9tZW1fZGVzY3JfdCkgKworICAgICAgICAgICAgICAgICAgRENBQ0hFX0xJTkUpICYKKyAgICAgICAgICAgICAgICAgfihEQ0FDSEVfTElORSAtIDEpKTsKKyAgZGVzY3IgPSAoa21wX21lbV9kZXNjcl90ICopKCgoa21wX3VpbnRwdHJfdClwdHIpIC0gc2l6ZW9mKGttcF9tZW1fZGVzY3JfdCkpOworCisgIGRlc2NyLT5wdHJfYWxsb2NhdGVkID0gYWxsb2NfcHRyOyAvLyByZW1lbWJlciBhbGxvY2F0ZWQgcG9pbnRlcgorICAvLyB3ZSBkb24ndCBuZWVkIHNpemVfYWxsb2NhdGVkCisgIGRlc2NyLT5wdHJfYWxpZ25lZCA9ICh2b2lkICopdGhpc190aHI7IC8vIHJlbWVtYmVyIGFsbG9jYXRpbmcgdGhyZWFkCisgIC8vIChpdCBpcyBhbHJlYWR5IHNhdmVkIGluIGJnZXQgYnVmZmVyLAorICAvLyBidXQgd2UgbWF5IHdhbnQgdG8gdXNlIGFub3RoZXIgYWxsb2NhdG9yIGluIGZ1dHVyZSkKKyAgZGVzY3ItPnNpemVfYWxpZ25lZCA9IHNpemU7CisKK2VuZDoKKyAgS0VfVFJBQ0UoMjUsICgiPC0gX19rbXBfZmFzdF9hbGxvY2F0ZSggVCMlZCApIHJldHVybnMgJXBcbiIsCisgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aGlzX3RociksIHB0cikpOworICByZXR1cm4gcHRyOworfSAvLyBmdW5jIF9fa21wX2Zhc3RfYWxsb2NhdGUKKworLy8gRnJlZSBmYXN0IG1lbW9yeSBhbmQgcGxhY2UgaXQgb24gdGhlIHRocmVhZCdzIGZyZWUgbGlzdCBpZiBpdCBpcyBvZgorLy8gdGhlIGNvcnJlY3Qgc2l6ZS4KK3ZvaWQgX19fa21wX2Zhc3RfZnJlZShrbXBfaW5mb190ICp0aGlzX3Rociwgdm9pZCAqcHRyIEtNUF9TUkNfTE9DX0RFQ0wpIHsKKyAga21wX21lbV9kZXNjcl90ICpkZXNjcjsKKyAga21wX2luZm9fdCAqYWxsb2NfdGhyOworICBzaXplX3Qgc2l6ZTsKKyAgc2l6ZV90IGlkeDsKKyAgaW50IGluZGV4OworCisgIEtFX1RSQUNFKDI1LCAoIi0+IF9fa21wX2Zhc3RfZnJlZSggVCMlZCwgJXAgKSBjYWxsZWQgZnJvbSAlczolZFxuIiwKKyAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRoaXNfdGhyKSwgcHRyIEtNUF9TUkNfTE9DX1BBUk0pKTsKKyAgS01QX0FTU0VSVChwdHIgIT0gTlVMTCk7CisKKyAgZGVzY3IgPSAoa21wX21lbV9kZXNjcl90ICopKCgoa21wX3VpbnRwdHJfdClwdHIpIC0gc2l6ZW9mKGttcF9tZW1fZGVzY3JfdCkpOworCisgIEtFX1RSQUNFKDI2LCAoIiAgIF9fa21wX2Zhc3RfZnJlZTogICAgIHNpemVfYWxpZ25lZD0lZFxuIiwKKyAgICAgICAgICAgICAgICAoaW50KWRlc2NyLT5zaXplX2FsaWduZWQpKTsKKworICBzaXplID0gZGVzY3ItPnNpemVfYWxpZ25lZDsgLy8gMiwgNCwgMTYsIDY0LCA2NSwgNjYsIC4uLiBjYWNoZSBsaW5lcworCisgIGlkeCA9IERDQUNIRV9MSU5FICogMjsgLy8gMiBjYWNoZSBsaW5lcyBpcyBtaW5pbWFsIHNpemUgb2YgYmxvY2sKKyAgaWYgKGlkeCA9PSBzaXplKSB7CisgICAgaW5kZXggPSAwOyAvLyAyIGNhY2hlIGxpbmVzCisgIH0gZWxzZSBpZiAoKGlkeCA8PD0gMSkgPT0gc2l6ZSkgeworICAgIGluZGV4ID0gMTsgLy8gNCBjYWNoZSBsaW5lcworICB9IGVsc2UgaWYgKChpZHggPDw9IDIpID09IHNpemUpIHsKKyAgICBpbmRleCA9IDI7IC8vIDE2IGNhY2hlIGxpbmVzCisgIH0gZWxzZSBpZiAoKGlkeCA8PD0gMikgPT0gc2l6ZSkgeworICAgIGluZGV4ID0gMzsgLy8gNjQgY2FjaGUgbGluZXMKKyAgfSBlbHNlIHsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHNpemUgPiBEQ0FDSEVfTElORSAqIDY0KTsKKyAgICBnb3RvIGZyZWVfY2FsbDsgLy8gNjUgb3IgbW9yZSBjYWNoZSBsaW5lcyAoID4gOEtCICkKKyAgfQorCisgIGFsbG9jX3RociA9IChrbXBfaW5mb190ICopZGVzY3ItPnB0cl9hbGlnbmVkOyAvLyBnZXQgdGhyZWFkIG93bmluZyB0aGUgYmxvY2sKKyAgaWYgKGFsbG9jX3RociA9PSB0aGlzX3RocikgeworICAgIC8vIHB1c2ggYmxvY2sgdG8gc2VsZiBuby1zeW5jIGZyZWUgbGlzdCwgbGlua2luZyBwcmV2aW91cyBoZWFkIChMSUZPKQorICAgICooKHZvaWQgKiopcHRyKSA9IHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfc2VsZjsKKyAgICB0aGlzX3Roci0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X3NlbGYgPSBwdHI7CisgIH0gZWxzZSB7CisgICAgdm9pZCAqaGVhZCA9IHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfb3RoZXI7CisgICAgaWYgKGhlYWQgPT0gTlVMTCkgeworICAgICAgLy8gQ3JlYXRlIG5ldyBmcmVlIGxpc3QKKyAgICAgIHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfb3RoZXIgPSBwdHI7CisgICAgICAqKCh2b2lkICoqKXB0cikgPSBOVUxMOyAvLyBtYXJrIHRoZSB0YWlsIG9mIHRoZSBsaXN0CisgICAgICBkZXNjci0+c2l6ZV9hbGxvY2F0ZWQgPSAoc2l6ZV90KTE7IC8vIGhlYWQgb2YgdGhlIGxpc3Qga2VlcHMgaXRzIGxlbmd0aAorICAgIH0gZWxzZSB7CisgICAgICAvLyBuZWVkIHRvIGNoZWNrIGV4aXN0ZWQgIm90aGVyIiBsaXN0J3Mgb3duZXIgdGhyZWFkIGFuZCBzaXplIG9mIHF1ZXVlCisgICAgICBrbXBfbWVtX2Rlc2NyX3QgKmRzYyA9CisgICAgICAgICAgKGttcF9tZW1fZGVzY3JfdCAqKSgoY2hhciAqKWhlYWQgLSBzaXplb2Yoa21wX21lbV9kZXNjcl90KSk7CisgICAgICAvLyBhbGxvY2F0aW5nIHRocmVhZCwgc2FtZSBmb3IgYWxsIHF1ZXVlIG5vZGVzCisgICAgICBrbXBfaW5mb190ICpxX3RoID0gKGttcF9pbmZvX3QgKikoZHNjLT5wdHJfYWxpZ25lZCk7CisgICAgICBzaXplX3QgcV9zeiA9CisgICAgICAgICAgZHNjLT5zaXplX2FsbG9jYXRlZCArIDE7IC8vIG5ldyBzaXplIGluIGNhc2Ugd2UgYWRkIGN1cnJlbnQgdGFzaworICAgICAgaWYgKHFfdGggPT0gYWxsb2NfdGhyICYmIHFfc3ogPD0gS01QX0ZSRUVfTElTVF9MSU1JVCkgeworICAgICAgICAvLyB3ZSBjYW4gYWRkIGN1cnJlbnQgdGFzayB0byAib3RoZXIiIGxpc3QsIG5vIHN5bmMgbmVlZGVkCisgICAgICAgICooKHZvaWQgKiopcHRyKSA9IGhlYWQ7CisgICAgICAgIGRlc2NyLT5zaXplX2FsbG9jYXRlZCA9IHFfc3o7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfb3RoZXIgPSBwdHI7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBlaXRoZXIgcXVldWUgYmxvY2tzIG93bmVyIGlzIGNoYW5naW5nIG9yIHNpemUgbGltaXQgZXhjZWVkZWQKKyAgICAgICAgLy8gcmV0dXJuIG9sZCBxdWV1ZSB0byBhbGxvY2F0aW5nIHRocmVhZCAocV90aCkgc3luY2hyb25lb3VzbHksCisgICAgICAgIC8vIGFuZCBzdGFydCBuZXcgbGlzdCBmb3IgYWxsb2NfdGhyJ3MgdGFza3MKKyAgICAgICAgdm9pZCAqb2xkX3B0cjsKKyAgICAgICAgdm9pZCAqdGFpbCA9IGhlYWQ7CisgICAgICAgIHZvaWQgKm5leHQgPSAqKCh2b2lkICoqKWhlYWQpOworICAgICAgICB3aGlsZSAobmV4dCAhPSBOVUxMKSB7CisgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgKKyAgICAgICAgICAgICAgLy8gcXVldWUgc2l6ZSBzaG91bGQgZGVjcmVhc2UgYnkgMSBlYWNoIHN0ZXAgdGhyb3VnaCB0aGUgbGlzdAorICAgICAgICAgICAgICAoKGttcF9tZW1fZGVzY3JfdCAqKSgoY2hhciAqKW5leHQgLSBzaXplb2Yoa21wX21lbV9kZXNjcl90KSkpCisgICAgICAgICAgICAgICAgICAgICAgLT5zaXplX2FsbG9jYXRlZCArCisgICAgICAgICAgICAgICAgICAxID09CisgICAgICAgICAgICAgICgoa21wX21lbV9kZXNjcl90ICopKChjaGFyICopdGFpbCAtIHNpemVvZihrbXBfbWVtX2Rlc2NyX3QpKSkKKyAgICAgICAgICAgICAgICAgIC0+c2l6ZV9hbGxvY2F0ZWQpOworICAgICAgICAgIHRhaWwgPSBuZXh0OyAvLyByZW1lbWJlciB0YWlsIG5vZGUKKyAgICAgICAgICBuZXh0ID0gKigodm9pZCAqKiluZXh0KTsKKyAgICAgICAgfQorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHFfdGggIT0gTlVMTCk7CisgICAgICAgIC8vIHB1c2ggYmxvY2sgdG8gb3duZXIncyBzeW5jIGZyZWUgbGlzdAorICAgICAgICBvbGRfcHRyID0gVENSX1BUUihxX3RoLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfc3luYyk7CisgICAgICAgIC8qIHRoZSBuZXh0IHBvaW50ZXIgbXVzdCBiZSBzZXQgYmVmb3JlIHNldHRpbmcgZnJlZV9saXN0IHRvIHB0ciB0byBhdm9pZAorICAgICAgICAgICBleHBvc2luZyBhIGJyb2tlbiBsaXN0IHRvIG90aGVyIHRocmVhZHMsIGV2ZW4gZm9yIGFuIGluc3RhbnQuICovCisgICAgICAgICooKHZvaWQgKiopdGFpbCkgPSBvbGRfcHRyOworCisgICAgICAgIHdoaWxlICghS01QX0NPTVBBUkVfQU5EX1NUT1JFX1BUUigKKyAgICAgICAgICAgICZxX3RoLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfc3luYywgb2xkX3B0ciwgaGVhZCkpIHsKKyAgICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgICAgb2xkX3B0ciA9IFRDUl9QVFIocV90aC0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X3N5bmMpOworICAgICAgICAgICooKHZvaWQgKiopdGFpbCkgPSBvbGRfcHRyOworICAgICAgICB9CisKKyAgICAgICAgLy8gc3RhcnQgbmV3IGxpc3Qgb2Ygbm90LXNlbHQgdGFza3MKKyAgICAgICAgdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9vdGhlciA9IHB0cjsKKyAgICAgICAgKigodm9pZCAqKilwdHIpID0gTlVMTDsKKyAgICAgICAgZGVzY3ItPnNpemVfYWxsb2NhdGVkID0gKHNpemVfdCkxOyAvLyBoZWFkIG9mIHF1ZXVlIGtlZXBzIGl0cyBsZW5ndGgKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZ290byBlbmQ7CisKK2ZyZWVfY2FsbDoKKyAgS0VfVFJBQ0UoMjUsICgiX19rbXBfZmFzdF9mcmVlOiBUIyVkIENhbGxpbmcgX19rbXBfdGhyZWFkX2ZyZWUgZm9yIHNpemUgJWRcbiIsCisgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aGlzX3RociksIHNpemUpKTsKKyAgX19rbXBfYmdldF9kZXF1ZXVlKHRoaXNfdGhyKTsgLyogUmVsZWFzZSBhbnkgcXVldWVkIGJ1ZmZlcnMgKi8KKyAgYnJlbCh0aGlzX3RociwgZGVzY3ItPnB0cl9hbGxvY2F0ZWQpOworCitlbmQ6CisgIEtFX1RSQUNFKDI1LCAoIjwtIF9fa21wX2Zhc3RfZnJlZSgpIHJldHVybnNcbiIpKTsKKworfSAvLyBmdW5jIF9fa21wX2Zhc3RfZnJlZQorCisvLyBJbml0aWFsaXplIHRoZSB0aHJlYWQgZnJlZSBsaXN0cyByZWxhdGVkIHRvIGZhc3QgbWVtb3J5CisvLyBPbmx5IGRvIHRoaXMgd2hlbiBhIHRocmVhZCBpcyBpbml0aWFsbHkgY3JlYXRlZC4KK3ZvaWQgX19rbXBfaW5pdGlhbGl6ZV9mYXN0X21lbW9yeShrbXBfaW5mb190ICp0aGlzX3RocikgeworICBLRV9UUkFDRSgxMCwgKCJfX2ttcF9pbml0aWFsaXplX2Zhc3RfbWVtb3J5OiBDYWxsZWQgZnJvbSB0aCAlcFxuIiwgdGhpc190aHIpKTsKKworICBtZW1zZXQodGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHMsIDAsIE5VTV9MSVNUUyAqIHNpemVvZihrbXBfZnJlZV9saXN0X3QpKTsKK30KKworLy8gRnJlZSB0aGUgbWVtb3J5IGluIHRoZSB0aHJlYWQgZnJlZSBsaXN0cyByZWxhdGVkIHRvIGZhc3QgbWVtb3J5CisvLyBPbmx5IGRvIHRoaXMgd2hlbiBhIHRocmVhZCBpcyBiZWluZyByZWFwZWQgKGRlc3Ryb3llZCkuCit2b2lkIF9fa21wX2ZyZWVfZmFzdF9tZW1vcnkoa21wX2luZm9fdCAqdGgpIHsKKyAgLy8gU3VwcG9zZSB3ZSB1c2UgQkdFVCB1bmRlcmx5aW5nIGFsbG9jYXRvciwgd2FsayB0aHJvdWdoIGl0cyBzdHJ1Y3R1cmVzLi4uCisgIGludCBiaW47CisgIHRocl9kYXRhX3QgKnRociA9IGdldF90aHJfZGF0YSh0aCk7CisgIHZvaWQgKipsc3QgPSBOVUxMOworCisgIEtFX1RSQUNFKAorICAgICAgNSwgKCJfX2ttcF9mcmVlX2Zhc3RfbWVtb3J5OiBDYWxsZWQgVCMlZFxuIiwgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aCkpKTsKKworICBfX2ttcF9iZ2V0X2RlcXVldWUodGgpOyAvLyBSZWxlYXNlIGFueSBxdWV1ZWQgYnVmZmVycworCisgIC8vIERpZyB0aHJvdWdoIGZyZWUgbGlzdHMgYW5kIGV4dHJhY3QgYWxsIGFsbG9jYXRlZCBibG9ja3MKKyAgZm9yIChiaW4gPSAwOyBiaW4gPCBNQVhfQkdFVF9CSU5TOyArK2JpbikgeworICAgIGJmaGVhZF90ICpiID0gdGhyLT5mcmVlbGlzdFtiaW5dLnFsLmZsaW5rOworICAgIHdoaWxlIChiICE9ICZ0aHItPmZyZWVsaXN0W2Jpbl0pIHsKKyAgICAgIGlmICgoa21wX3VpbnRwdHJfdCliLT5iaC5iYi5idGhyICYgMSkgeyAvLyB0aGUgYnVmZmVyIGlzIGFsbG9jYXRlZCBhZGRyZXNzCisgICAgICAgICooKHZvaWQgKiopYikgPQorICAgICAgICAgICAgbHN0OyAvLyBsaW5rIHRoZSBsaXN0IChvdmVycmlkZSBidGhyLCBidXQga2VlcCBmbGluayB5ZXQpCisgICAgICAgIGxzdCA9ICh2b2lkICoqKWI7IC8vIHB1c2ggYiBpbnRvIGxzdAorICAgICAgfQorICAgICAgYiA9IGItPnFsLmZsaW5rOyAvLyBnZXQgbmV4dCBidWZmZXIKKyAgICB9CisgIH0KKyAgd2hpbGUgKGxzdCAhPSBOVUxMKSB7CisgICAgdm9pZCAqbmV4dCA9ICpsc3Q7CisgICAgS0VfVFJBQ0UoMTAsICgiX19rbXBfZnJlZV9mYXN0X21lbW9yeTogZnJlZWluZyAlcCwgbmV4dD0lcCB0aCAlcCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgbHN0LCBuZXh0LCB0aCwgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aCkpKTsKKyAgICAoKnRoci0+cmVsZmNuKShsc3QpOworI2lmIEJ1ZlN0YXRzCisgICAgLy8gY291bnQgYmxvY2tzIHRvIHByZXZlbnQgcHJvYmxlbXMgaW4gX19rbXBfZmluYWxpemVfYmdldCgpCisgICAgdGhyLT5udW1wcmVsKys7IC8qIE5yIG9mIGV4cGFuc2lvbiBibG9jayByZWxlYXNlcyAqLworICAgIHRoci0+bnVtcGJsay0tOyAvKiBUb3RhbCBudW1iZXIgb2YgYmxvY2tzICovCisjZW5kaWYKKyAgICBsc3QgPSAodm9pZCAqKiluZXh0OworICB9CisKKyAgS0VfVFJBQ0UoCisgICAgICA1LCAoIl9fa21wX2ZyZWVfZmFzdF9tZW1vcnk6IEZyZWVkIFQjJWRcbiIsIF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGgpKSk7Cit9CisKKyNlbmRpZiAvLyBVU0VfRkFTVF9NRU1PUlkKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9hdG9taWMuY3BwIGIvZmluYWwvcnVudGltZS9zcmMva21wX2F0b21pYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYwY2UyMQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9hdG9taWMuY3BwCkBAIC0wLDAgKzEsMzYzNCBAQAorLyoKKyAqIGttcF9hdG9taWMuY3BwIC0tIEFUT01JQyBpbXBsZW1lbnRhdGlvbiByb3V0aW5lcworICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wX2F0b21pYy5oIgorI2luY2x1ZGUgImttcC5oIiAvLyBUUlVFLCBhc20gcm91dGluZXMgcHJvdG90eXBlcworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWNoYXI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVzaG9ydDsKKworLyohCitAZGVmZ3JvdXAgQVRPTUlDX09QUyBBdG9taWMgT3BlcmF0aW9ucworVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIGZvciBpbXBsZW1lbnRpbmcgdGhlIG1hbnkgZGlmZmVyZW50IHZhcmlldGllcyBvZiBhdG9taWMKK29wZXJhdGlvbnMuCisKK1RoZSBjb21waWxlciBpcyBhdCBsaWJlcnR5IHRvIGlubGluZSBhdG9taWMgb3BlcmF0aW9ucyB0aGF0IGFyZSBuYXR1cmFsbHkKK3N1cHBvcnRlZCBieSB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4gRm9yIGluc3RhbmNlIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBhbgorYXRvbWljIGxpa2UgdGhpcyBjYW4gYmUgaW5saW5lZAorQGNvZGUKK3N0YXRpYyBpbnQgcyA9IDA7CisjcHJhZ21hIG9tcCBhdG9taWMKKyAgICBzKys7CitAZW5kY29kZQordXNpbmcgdGhlIHNpbmdsZSBpbnN0cnVjdGlvbjogYGxvY2s7IGluY2wgc2AKKworSG93ZXZlciB0aGUgcnVudGltZSBkb2VzIHByb3ZpZGUgZW50cnlwb2ludHMgZm9yIHRoZXNlIG9wZXJhdGlvbnMgdG8gc3VwcG9ydAorY29tcGlsZXJzIHRoYXQgY2hvb3NlIG5vdCB0byBpbmxpbmUgdGhlbS4gKEZvciBpbnN0YW5jZSwKK2BfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGRgIGNvdWxkIGJlIHVzZWQgdG8gcGVyZm9ybSB0aGUgaW5jcmVtZW50IGFib3ZlLikKKworVGhlIG5hbWVzIG9mIHRoZSBmdW5jdGlvbnMgYXJlIGVuY29kZWQgYnkgdXNpbmcgdGhlIGRhdGEgdHlwZSBuYW1lIGFuZCB0aGUKK29wZXJhdGlvbiBuYW1lLCBhcyBpbiB0aGVzZSB0YWJsZXMuCisKK0RhdGEgVHlwZSAgfCBEYXRhIHR5cGUgZW5jb2RpbmcKKy0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLQoraW50OF90ICAgICB8IGBmaXhlZDFgCit1aW50OF90ICAgIHwgYGZpeGVkMXVgCitpbnQxNl90ICAgIHwgYGZpeGVkMmAKK3VpbnQxNl90ICAgfCBgZml4ZWQydWAKK2ludDMyX3QgICAgfCBgZml4ZWQ0YAordWludDMyX3QgICB8IGBmaXhlZDR1YAoraW50MzJfdCAgICB8IGBmaXhlZDhgCit1aW50MzJfdCAgIHwgYGZpeGVkOHVgCitmbG9hdCAgICAgIHwgYGZsb2F0NGAKK2RvdWJsZSAgICAgfCBgZmxvYXQ4YAorZmxvYXQgMTAgKDgwODcgZWlnaHR5IGJpdCBmbG9hdCkgIHwgYGZsb2F0MTBgCitjb21wbGV4PGZsb2F0PiAgIHwgIGBjbXBseDRgCitjb21wbGV4PGRvdWJsZT4gIHwgYGNtcGx4OGAKK2NvbXBsZXg8ZmxvYXQxMD4gfCBgY21wbHgxMGAKKzxicj4KKworT3BlcmF0aW9uIHwgT3BlcmF0aW9uIGVuY29kaW5nCistLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0KKysgfCBhZGQKKy0gfCBzdWIKK1wqIHwgbXVsCisvIHwgZGl2CismIHwgYW5kYgorPDwgfCBzaGwKK1w+XD4gfCBzaHIKK1x8IHwgb3JiCiteICB8IHhvcgorJiYgfCBhbmRsCitcfFx8IHwgb3JsCittYXhpbXVtIHwgbWF4CittaW5pbXVtIHwgbWluCisuZXF2LiAgIHwgZXF2CisubmVxdi4gIHwgbmVxdgorCis8YnI+CitGb3Igbm9uLWNvbW11dGF0aXZlIG9wZXJhdGlvbnMsIGBfcmV2YCBjYW4gYWxzbyBiZSBhZGRlZCBmb3IgdGhlIHJldmVyc2VkCitvcGVyYXRpb24uIEZvciB0aGUgZnVuY3Rpb25zIHRoYXQgY2FwdHVyZSB0aGUgcmVzdWx0LCB0aGUgc3VmZml4IGBfY3B0YCBpcworYWRkZWQuCisKK1VwZGF0ZSBGdW5jdGlvbnMKKz09PT09PT09PT09PT09PT0KK1RoZSBnZW5lcmFsIGZvcm0gb2YgYW4gYXRvbWljIGZ1bmN0aW9uIHRoYXQganVzdCBwZXJmb3JtcyBhbiB1cGRhdGUgKHdpdGhvdXQgYQorYGNhcHR1cmVgKQorQGNvZGUKK3ZvaWQgX19rbXBjX2F0b21pY188ZGF0YXR5cGU+XzxvcGVyYXRpb24+KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICoKK2xocywgVFlQRSByaHMgKTsKK0BlbmRjb2RlCitAcGFyYW0gaWRlbnRfdCAgYSBwb2ludGVyIHRvIHNvdXJjZSBsb2NhdGlvbgorQHBhcmFtIGd0aWQgIHRoZSBnbG9iYWwgdGhyZWFkIGlkCitAcGFyYW0gbGhzICAgYSBwb2ludGVyIHRvIHRoZSBsZWZ0IG9wZXJhbmQKK0BwYXJhbSByaHMgICB0aGUgcmlnaHQgb3BlcmFuZAorCitgY2FwdHVyZWAgZnVuY3Rpb25zCis9PT09PT09PT09PT09PT09PT09CitUaGUgY2FwdHVyZSBmdW5jdGlvbnMgcGVyZm9ybSBhbiBhdG9taWMgdXBkYXRlIGFuZCByZXR1cm4gYSByZXN1bHQsIHdoaWNoIGlzCitlaXRoZXIgdGhlIHZhbHVlIGJlZm9yZSB0aGUgY2FwdHVyZSwgb3IgdGhhdCBhZnRlci4gVGhleSB0YWtlIGFuIGFkZGl0aW9uYWwKK2FyZ3VtZW50IHRvIGRldGVybWluZSB3aGljaCByZXN1bHQgaXMgcmV0dXJuZWQuCitUaGVpciBnZW5lcmFsIGZvcm0gaXMgdGhlcmVmb3JlCitAY29kZQorVFlQRSBfX2ttcGNfYXRvbWljXzxkYXRhdHlwZT5fPG9wZXJhdGlvbj5fY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICoKK2xocywgVFlQRSByaHMsIGludCBmbGFnICk7CitAZW5kY29kZQorQHBhcmFtIGlkZW50X3QgIGEgcG9pbnRlciB0byBzb3VyY2UgbG9jYXRpb24KK0BwYXJhbSBndGlkICB0aGUgZ2xvYmFsIHRocmVhZCBpZAorQHBhcmFtIGxocyAgIGEgcG9pbnRlciB0byB0aGUgbGVmdCBvcGVyYW5kCitAcGFyYW0gcmhzICAgdGhlIHJpZ2h0IG9wZXJhbmQKK0BwYXJhbSBmbGFnICBvbmUgaWYgdGhlIHJlc3VsdCBpcyB0byBiZSBjYXB0dXJlZCAqYWZ0ZXIqIHRoZSBvcGVyYXRpb24sIHplcm8gaWYKK2NhcHR1cmVkICpiZWZvcmUqLgorCitUaGUgb25lIHNldCBvZiBleGNlcHRpb25zIHRvIHRoaXMgaXMgdGhlIGBjb21wbGV4PGZsb2F0PmAgdHlwZSB3aGVyZSB0aGUgdmFsdWUKK2lzIG5vdCByZXR1cm5lZCwgcmF0aGVyIGFuIGV4dHJhIGFyZ3VtZW50IHBvaW50ZXIgaXMgcGFzc2VkLgorCitUaGV5IGxvb2sgbGlrZQorQGNvZGUKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfPG9wPl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqCitsaHMsIGttcF9jbXBseDMyIHJocywga21wX2NtcGx4MzIgKiBvdXQsIGludCBmbGFnICk7CitAZW5kY29kZQorCitSZWFkIGFuZCBXcml0ZSBPcGVyYXRpb25zCis9PT09PT09PT09PT09PT09PT09PT09PT09CitUaGUgT3Blbk1QPHN1cD4qPC9zdXA+IHN0YW5kYXJkIG5vdyBzdXBwb3J0cyBhdG9taWMgb3BlcmF0aW9ucyB0aGF0IHNpbXBseQorZW5zdXJlIHRoYXQgdGhlIHZhbHVlIGlzIHJlYWQgb3Igd3JpdHRlbiBhdG9taWNhbGx5LCB3aXRoIG5vIG1vZGlmaWNhdGlvbgorcGVyZm9ybWVkLiBJbiBtYW55IGNhc2VzIG9uIElBLTMyIGFyY2hpdGVjdHVyZSB0aGVzZSBvcGVyYXRpb25zIGNhbiBiZSBpbmxpbmVkCitzaW5jZSB0aGUgYXJjaGl0ZWN0dXJlIGd1YXJhbnRlZXMgdGhhdCBubyB0ZWFyaW5nIG9jY3VycyBvbiBhbGlnbmVkIG9iamVjdHMKK2FjY2Vzc2VkIHdpdGggYSBzaW5nbGUgbWVtb3J5IG9wZXJhdGlvbiBvZiB1cCB0byA2NCBiaXRzIGluIHNpemUuCisKK1RoZSBnZW5lcmFsIGZvcm0gb2YgdGhlIHJlYWQgb3BlcmF0aW9ucyBpcworQGNvZGUKK1RZUEUgX19rbXBjX2F0b21pY188dHlwZT5fcmQgKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICogbG9jICk7CitAZW5kY29kZQorCitGb3IgdGhlIHdyaXRlIG9wZXJhdGlvbnMgdGhlIGZvcm0gaXMKK0Bjb2RlCit2b2lkIF9fa21wY19hdG9taWNfPHR5cGU+X3dyICggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxocywgVFlQRSByaHMKKyk7CitAZW5kY29kZQorCitGdWxsIGxpc3Qgb2YgZnVuY3Rpb25zCis9PT09PT09PT09PT09PT09PT09PT09CitUaGlzIGxlYWRzIHRvIHRoZSBnZW5lcmF0aW9uIG9mIDM3NiBhdG9taWMgZnVuY3Rpb25zLCBhcyBmb2xsb3dzLgorCitGdW5jdG9ucyBmb3IgaW50ZWdlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlcmUgYXJlIHZlcnNpb25zIGhlcmUgZm9yIGludGVnZXJzIG9mIHNpemUgMSwyLDQgYW5kIDggYnl0ZXMgYm90aCBzaWduZWQgYW5kCit1bnNpZ25lZCAod2hlcmUgdGhhdCBtYXR0ZXJzKS4KK0Bjb2RlCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfYWRkCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FkZF9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRiX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2RpdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfZXF2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfZXF2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX21heAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX21heF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9taW4KKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9taW5fY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbXVsCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWxfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9uZXF2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbmVxdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfb3JsCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfb3JsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3JkCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hsCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3NobF9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hsX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3NocgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3Nocl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3Nocl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3dwCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfd3IKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV94b3IKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV94b3JfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X2FkZF9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9zdWJfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfbXVsX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X2RpdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X3NocgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X3Nocl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X3Nocl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGRfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfYWRkX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfYW5kYgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfYW5kbAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2Zsb2F0OAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9lcXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9lcXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbWF4CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbWF4X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21pbgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21pbl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2Zsb2F0OAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX211bF9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX25lcXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX29yYgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX29yYl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfcmQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hsX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGxfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hyCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hyX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3Nocl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hyX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1YgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zd3AKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl93cgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3hvcgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3hvcl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfYWRkX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X3N1Yl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9tdWxfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyCisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGRfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRiCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfYW5kYl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRsCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfYW5kbF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfZmxvYXQ4CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2VxdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Vxdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tYXgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tYXhfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbWluCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbWluX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X211bAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfZmxvYXQ4CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbXVsX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbmVxdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X25lcXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfb3JiCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfb3JiX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X29ybAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X29ybF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9yZAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGxfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hyX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N3cAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3dyCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfeG9yCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfeG9yX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9hZGRfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc3ViX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDR1X211bF9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfYWRkCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZF9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRiX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2RpdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfZXF2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfZXF2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X21heAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X21heF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9taW4KKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9taW5fY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbXVsCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9uZXF2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbmVxdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfb3JsCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfb3JsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3JkCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hsCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hsX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NocgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3Nocl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3Nocl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc3dwCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfd3IKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF94b3IKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF94b3JfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2FkZF9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zdWJfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfbXVsX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2RpdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X3NocgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X3Nocl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X3Nocl9yZXYKK0BlbmRjb2RlCisKK0Z1bmN0aW9ucyBmb3IgZmxvYXRpbmcgcG9pbnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZXJlIGFyZSB2ZXJzaW9ucyBoZXJlIGZvciBmbG9hdGluZyBwb2ludCBudW1iZXJzIG9mIHNpemUgNCwgOCwgMTAgYW5kIDE2CitieXRlcy4gKFRlbiBieXRlIGZsb2F0cyBhcmUgdXNlZCBieSBYODcsIGJ1dCBhcmUgbm93IHJhcmUpLgorQGNvZGUKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2Zsb2F0OAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZF9mcAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2RpdgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbWF4CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbWF4X2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X21pbgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X21pbl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbXVsX2Zsb2F0OAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9mcAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3JkCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2Zsb2F0OAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9mcAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zd3AKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF93cgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbWF4CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbWF4X2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X21pbgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X21pbl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbXVsX2ZwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfcmQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3dwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfd3IKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkX2ZwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX2RpdgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9mcAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX211bAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX211bF9mcAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9yZAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9zd3AKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfd3IKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXgKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4X2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9taW4KKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWluX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9yZAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N3cAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl93cgorQGVuZGNvZGUKKworRnVuY3Rpb25zIGZvciBDb21wbGV4IHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0Z1bmN0aW9ucyBmb3IgY29tcGxleCB0eXBlcyB3aG9zZSBjb21wb25lbnQgZmxvYXRpbmcgcG9pbnQgdmFyaWFibGVzIGFyZSBvZiBzaXplCis0LDgsMTAgb3IgMTYgYnl0ZXMuIFRoZSBuYW1lcyBoZXJlIGFyZSBiYXNlZCBvbiB0aGUgc2l6ZSBvZiB0aGUgY29tcG9uZW50IGZsb2F0LAorKm5vdCogdGhlIHNpemUgb2YgdGhlIGNvbXBsZXggdHlwZS4gU28gYF9fa21wY19hdG9tY19jbXBseDhfYWRkYCBpcyBhbiBvcGVyYXRpb24KK29uIGEgYGNvbXBsZXg8ZG91YmxlPmAgb3IgYGNvbXBsZXgoa2luZD04KWAsICpub3QqIGBjb21wbGV4PGZsb2F0PmAuCisKK0Bjb2RlCisgICAgX19rbXBjX2F0b21pY19jbXBseDRfYWRkCisgICAgX19rbXBjX2F0b21pY19jbXBseDRfYWRkX2NtcGx4OAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY21wbHg4CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHg0X211bAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X211bF9jbXBseDgKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfcmQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfY21wbHg4CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3ViX3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N3cAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X3dyCisgICAgX19rbXBjX2F0b21pY19jbXBseDhfYWRkCisgICAgX19rbXBjX2F0b21pY19jbXBseDhfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHg4X2RpdgorICAgIF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDhfcmQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDhfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDhfc3dwCisgICAgX19rbXBjX2F0b21pY19jbXBseDhfd3IKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfYWRkCisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2CisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9yZAorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3N3cAorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF93cgorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X211bAorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3JkCisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N1YgorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N3cAorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl93cgorQGVuZGNvZGUKKyovCisKKy8qIQorQGluZ3JvdXAgQVRPTUlDX09QUworQHsKKyovCisKKy8qCisgKiBHbG9iYWwgdmFycworICovCisKKyNpZm5kZWYgS01QX0dPTVBfQ09NUEFUCitpbnQgX19rbXBfYXRvbWljX21vZGUgPSAxOyAvLyBJbnRlbCBwZXJmCisjZWxzZQoraW50IF9fa21wX2F0b21pY19tb2RlID0gMjsgLy8gR09NUCBjb21wYXRpYmlsaXR5CisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKK0tNUF9BTElHTigxMjgpCisKKy8vIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgaW4gR251IGNvbXBhdCBtb2RlCitrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9jazsKKy8vIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIDEtYnl0ZSBmaXhlZCBkYXRhIHR5cGVzCitrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja18xaTsKKy8vIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIDItYnl0ZSBmaXhlZCBkYXRhIHR5cGVzCitrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja18yaTsKKy8vIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIDQtYnl0ZSBmaXhlZCBkYXRhIHR5cGVzCitrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja180aTsKKy8vIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIGttcF9yZWFsMzIgZGF0YSB0eXBlCitrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja180cjsKKy8vIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIDgtYnl0ZSBmaXhlZCBkYXRhIHR5cGVzCitrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja184aTsKKy8vIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIGttcF9yZWFsNjQgZGF0YSB0eXBlCitrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja184cjsKKy8vIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIGNvbXBsZXggYnl0ZSBkYXRhIHR5cGUKK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzhjOworLy8gQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgbG9uZyBkb3VibGUgZGF0YSB0eXBlCitrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja18xMHI7CisvLyBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBfUXVhZCBkYXRhIHR5cGUKK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzE2cjsKKy8vIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIGRvdWJsZSBjb21wbGV4IGRhdGEgdHlwZQora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMTZjOworLy8gQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgbG9uZyBkb3VibGUgY29tcGxleCB0eXBlCitrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja18yMGM7CisvLyBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBfUXVhZCBjb21wbGV4IGRhdGEgdHlwZQora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMzJjOworCisvKiAyMDA3LTAzLTAyOgorICAgV2l0aG91dCAidm9sYXRpbGUiIHNwZWNpZmllciBpbiBPUF9DTVBYQ0hHIGFuZCBNSU5fTUFYX0NNUFhDSEcgd2UgaGF2ZSBhIGJ1ZworICAgb24gKl8zMiBhbmQgKl8zMmUuIFRoaXMgaXMganVzdCBhIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciB0aGUgcHJvYmxlbS4gSXQKKyAgIHNlZW1zIHRoZSByaWdodCBzb2x1dGlvbiBpcyB3cml0aW5nIE9QX0NNUFhDSEcgYW5kIE1JTl9NQVhfQ01QWENIRyByb3V0aW5lcworICAgaW4gYXNzZW1ibGVyIGxhbmd1YWdlLiAqLworI2RlZmluZSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHZvbGF0aWxlCisKKyNpZiAoS01QX0FSQ0hfWDg2KSAmJiBLTVBfSEFWRV9RVUFECisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvcis9KFF1YWRfYTRfdCAmbGhzLCBRdWFkX2E0X3QgJnJocykgeworICBsaHMucSArPSByaHMucTsKK307CitzdGF0aWMgaW5saW5lIHZvaWQgb3BlcmF0b3ItPShRdWFkX2E0X3QgJmxocywgUXVhZF9hNF90ICZyaHMpIHsKKyAgbGhzLnEgLT0gcmhzLnE7Cit9Oworc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yKj0oUXVhZF9hNF90ICZsaHMsIFF1YWRfYTRfdCAmcmhzKSB7CisgIGxocy5xICo9IHJocy5xOworfTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvci89KFF1YWRfYTRfdCAmbGhzLCBRdWFkX2E0X3QgJnJocykgeworICBsaHMucSAvPSByaHMucTsKK307CitzdGF0aWMgaW5saW5lIGJvb2wgb3BlcmF0b3I8KFF1YWRfYTRfdCAmbGhzLCBRdWFkX2E0X3QgJnJocykgeworICByZXR1cm4gbGhzLnEgPCByaHMucTsKK30KK3N0YXRpYyBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oUXVhZF9hNF90ICZsaHMsIFF1YWRfYTRfdCAmcmhzKSB7CisgIHJldHVybiBsaHMucSA+IHJocy5xOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb3BlcmF0b3IrPShRdWFkX2ExNl90ICZsaHMsIFF1YWRfYTE2X3QgJnJocykgeworICBsaHMucSArPSByaHMucTsKK307CitzdGF0aWMgaW5saW5lIHZvaWQgb3BlcmF0b3ItPShRdWFkX2ExNl90ICZsaHMsIFF1YWRfYTE2X3QgJnJocykgeworICBsaHMucSAtPSByaHMucTsKK307CitzdGF0aWMgaW5saW5lIHZvaWQgb3BlcmF0b3IqPShRdWFkX2ExNl90ICZsaHMsIFF1YWRfYTE2X3QgJnJocykgeworICBsaHMucSAqPSByaHMucTsKK307CitzdGF0aWMgaW5saW5lIHZvaWQgb3BlcmF0b3IvPShRdWFkX2ExNl90ICZsaHMsIFF1YWRfYTE2X3QgJnJocykgeworICBsaHMucSAvPSByaHMucTsKK307CitzdGF0aWMgaW5saW5lIGJvb2wgb3BlcmF0b3I8KFF1YWRfYTE2X3QgJmxocywgUXVhZF9hMTZfdCAmcmhzKSB7CisgIHJldHVybiBsaHMucSA8IHJocy5xOworfQorc3RhdGljIGlubGluZSBib29sIG9wZXJhdG9yPihRdWFkX2ExNl90ICZsaHMsIFF1YWRfYTE2X3QgJnJocykgeworICByZXR1cm4gbGhzLnEgPiByaHMucTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yKz0oa21wX2NtcGx4MTI4X2E0X3QgJmxocywga21wX2NtcGx4MTI4X2E0X3QgJnJocykgeworICBsaHMucSArPSByaHMucTsKK307CitzdGF0aWMgaW5saW5lIHZvaWQgb3BlcmF0b3ItPShrbXBfY21wbHgxMjhfYTRfdCAmbGhzLCBrbXBfY21wbHgxMjhfYTRfdCAmcmhzKSB7CisgIGxocy5xIC09IHJocy5xOworfTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvcio9KGttcF9jbXBseDEyOF9hNF90ICZsaHMsIGttcF9jbXBseDEyOF9hNF90ICZyaHMpIHsKKyAgbGhzLnEgKj0gcmhzLnE7Cit9Oworc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yLz0oa21wX2NtcGx4MTI4X2E0X3QgJmxocywga21wX2NtcGx4MTI4X2E0X3QgJnJocykgeworICBsaHMucSAvPSByaHMucTsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvcis9KGttcF9jbXBseDEyOF9hMTZfdCAmbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NtcGx4MTI4X2ExNl90ICZyaHMpIHsKKyAgbGhzLnEgKz0gcmhzLnE7Cit9Oworc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yLT0oa21wX2NtcGx4MTI4X2ExNl90ICZsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY21wbHgxMjhfYTE2X3QgJnJocykgeworICBsaHMucSAtPSByaHMucTsKK307CitzdGF0aWMgaW5saW5lIHZvaWQgb3BlcmF0b3IqPShrbXBfY21wbHgxMjhfYTE2X3QgJmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jbXBseDEyOF9hMTZfdCAmcmhzKSB7CisgIGxocy5xICo9IHJocy5xOworfTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvci89KGttcF9jbXBseDEyOF9hMTZfdCAmbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NtcGx4MTI4X2ExNl90ICZyaHMpIHsKKyAgbGhzLnEgLz0gcmhzLnE7Cit9OworCisjZW5kaWYKKworLy8gQVRPTUlDIGltcGxlbWVudGF0aW9uIHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPbmUgcm91dGluZSBmb3IgZWFjaCBvcGVyYXRpb24gYW5kIG9wZXJhbmQgdHlwZS4KKy8vIEFsbCByb3V0aW5lcyBkZWNsYXJhdGlvbnMgbG9va3MgbGlrZQorLy8gdm9pZCBfX2ttcGNfYXRvbWljX1JUWVBFX09QKCBpZGVudF90KiwgaW50LCBUWVBFICpsaHMsIFRZUEUgcmhzICk7CisKKyNkZWZpbmUgS01QX0NIRUNLX0dUSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChndGlkID09IEtNUF9HVElEX1VOS05PV04pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAvLyBjaGVjayBhbmQgZ2V0IGd0aWQgd2hlbiBuZWVkZWQKKworLy8gQmVnaW5uaW5nIG9mIGEgZGVmaW5pdGlvbiAocHJvdmlkZXMgbmFtZSwgcGFyYW1ldGVycywgZ2VidWcgdHJhY2UpCisvLyAgICAgVFlQRV9JRCAtIG9wZXJhbmRzIHR5cGUgYW5kIHNpemUgKGZpeGVkKiwgZml4ZWQqdSBmb3Igc2lnbmVkLCB1bnNpZ25lZAorLy8gICAgIGZpeGVkKQorLy8gICAgIE9QX0lEICAgLSBvcGVyYXRpb24gaWRlbnRpZmllciAoYWRkLCBzdWIsIG11bCwgLi4uKQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorI2RlZmluZSBBVE9NSUNfQkVHSU4oVFlQRV9JRCwgT1BfSUQsIFRZUEUsIFJFVF9UWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgUkVUX1RZUEUgX19rbXBjX2F0b21pY18jI1RZUEVfSUQjI18jI09QX0lEKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFICpsaHMsIFRZUEUgcmhzKSB7ICAgICAgICAgICAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfaW5pdF9zZXJpYWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLQV9UUkFDRSgxMDAsICgiX19rbXBjX2F0b21pY18iICNUWVBFX0lEICJfIiAjT1BfSUQgIjogVCMlZFxuIiwgZ3RpZCkpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIExvY2sgdmFyaWFibGVzIHVzZWQgZm9yIGNyaXRpY2FsIHNlY3Rpb25zIGZvciB2YXJpb3VzIHNpemUgb3BlcmFuZHMKKyNkZWZpbmUgQVRPTUlDX0xPQ0swIF9fa21wX2F0b21pY19sb2NrIC8vIGFsbCB0eXBlcywgZm9yIEdudSBjb21wYXQKKyNkZWZpbmUgQVRPTUlDX0xPQ0sxaSBfX2ttcF9hdG9taWNfbG9ja18xaSAvLyBjaGFyCisjZGVmaW5lIEFUT01JQ19MT0NLMmkgX19rbXBfYXRvbWljX2xvY2tfMmkgLy8gc2hvcnQKKyNkZWZpbmUgQVRPTUlDX0xPQ0s0aSBfX2ttcF9hdG9taWNfbG9ja180aSAvLyBsb25nIGludAorI2RlZmluZSBBVE9NSUNfTE9DSzRyIF9fa21wX2F0b21pY19sb2NrXzRyIC8vIGZsb2F0CisjZGVmaW5lIEFUT01JQ19MT0NLOGkgX19rbXBfYXRvbWljX2xvY2tfOGkgLy8gbG9uZyBsb25nIGludAorI2RlZmluZSBBVE9NSUNfTE9DSzhyIF9fa21wX2F0b21pY19sb2NrXzhyIC8vIGRvdWJsZQorI2RlZmluZSBBVE9NSUNfTE9DSzhjIF9fa21wX2F0b21pY19sb2NrXzhjIC8vIGZsb2F0IGNvbXBsZXgKKyNkZWZpbmUgQVRPTUlDX0xPQ0sxMHIgX19rbXBfYXRvbWljX2xvY2tfMTByIC8vIGxvbmcgZG91YmxlCisjZGVmaW5lIEFUT01JQ19MT0NLMTZyIF9fa21wX2F0b21pY19sb2NrXzE2ciAvLyBfUXVhZAorI2RlZmluZSBBVE9NSUNfTE9DSzE2YyBfX2ttcF9hdG9taWNfbG9ja18xNmMgLy8gZG91YmxlIGNvbXBsZXgKKyNkZWZpbmUgQVRPTUlDX0xPQ0syMGMgX19rbXBfYXRvbWljX2xvY2tfMjBjIC8vIGxvbmcgZG91YmxlIGNvbXBsZXgKKyNkZWZpbmUgQVRPTUlDX0xPQ0szMmMgX19rbXBfYXRvbWljX2xvY2tfMzJjIC8vIF9RdWFkIGNvbXBsZXgKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIGJvdW5kIGJ5IGNyaXRpY2FsIHNlY3Rpb24KKy8vICAgICBPUCAgICAgLSBvcGVyYXRvciAoaXQncyBzdXBwb3NlZCB0byBjb250YWluIGFuIGFzc2lnbm1lbnQpCisvLyAgICAgTENLX0lEIC0gbG9jayBpZGVudGlmaWVyCisvLyBOb3RlOiBkb24ndCBjaGVjayBndGlkIGFzIGl0IHNob3VsZCBhbHdheXMgYmUgdmFsaWQKKy8vIDEsIDItYnl0ZSAtIGV4cGVjdCB2YWxpZCBwYXJhbWV0ZXIsIG90aGVyIC0gY2hlY2sgYmVmb3JlIHRoaXMgbWFjcm8KKyNkZWZpbmUgT1BfQ1JJVElDQUwoT1AsIExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soJkFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCpsaHMpIE9QKHJocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCZBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGb3IgR05VIGNvbXBhdGliaWxpdHksIHdlIG1heSBuZWVkIHRvIHVzZSBhIGNyaXRpY2FsIHNlY3Rpb24sCisvLyBldmVuIHRob3VnaCBpdCBpcyBub3QgcmVxdWlyZWQgYnkgdGhlIElTQS4KKy8vCisvLyBPbiBJQS0zMiBhcmNoaXRlY3R1cmUsIGFsbCBhdG9taWMgb3BlcmF0aW9ucyBleGNlcHQgZm9yIGZpeGVkIDQgYnl0ZSBhZGQsCisvLyBzdWIsIGFuZCBiaXR3aXNlIGxvZ2ljYWwgb3BzLCBhbmQgMSAmIDIgYnl0ZSBsb2dpY2FsIG9wcyB1c2UgYSBjb21tb24KKy8vIGNyaXRpY2FsIHNlY3Rpb24uICBPbiBJbnRlbChSKSA2NCwgYWxsIGF0b21pYyBvcGVyYXRpb25zIGFyZSBkb25lIHdpdGggZmV0Y2gKKy8vIGFuZCBhZGQgb3IgY29tcGFyZSBhbmQgZXhjaGFuZ2UuICBUaGVyZWZvcmUsIHRoZSBGTEFHIHBhcmFtZXRlciB0byB0aGlzCisvLyBtYWNybyBpcyBlaXRoZXIgS01QX0FSQ0hfWDg2IG9yIDAgKG9yIDEsIGZvciBJbnRlbC1zcGVjaWZpYyBleHRlbnNpb24gd2hpY2gKKy8vIHJlcXVpcmUgYSBjcml0aWNhbCBzZWN0aW9uLCB3aGVyZSB3ZSBwcmVkaWN0IHRoYXQgdGhleSB3aWxsIGJlIGltcGxlbWVudGVkCisvLyBpbiB0aGUgR251IGNvZGVnZW4gYnkgY2FsbGluZyBHT01QX2F0b21pY19zdGFydCgpIC8gR09NUF9hdG9taWNfZW5kKCkpLgorLy8KKy8vIFdoZW4gdGhlIE9QX0dPTVBfQ1JJVElDQUwgbWFjcm8gaXMgdXNlZCBpbiBhICpDUklUSUNBTCogbWFjcm8gY29uc3RydWN0LAorLy8gdGhlIEZMQUcgcGFyYW1ldGVyIHNob3VsZCBhbHdheXMgYmUgMS4gIElmIHdlIGtub3cgdGhhdCB3ZSB3aWxsIGJlIHVzaW5nCisvLyBhIGNyaXRpY2FsIHNlY3Rpb24sIHRoZW4gd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4gdGhhdCB3ZSB1c2UgdGhlIGdlbmVyaWMKKy8vIGxvY2sgX19rbXBfYXRvbWljX2xvY2sgdG8gcHJvdGVjdCB0aGUgYXRvbWljIHVwZGF0ZSwgYW5kIG5vdCBvZiBvZiB0aGUKKy8vIGxvY2tzIHRoYXQgYXJlIHNwZWNpYWxpemVkIGJhc2VkIHVwb24gdGhlIHNpemUgb3IgdHlwZSBvZiB0aGUgZGF0YS4KKy8vCisvLyBJZiBGTEFHIGlzIDAsIHRoZW4gd2UgYXJlIHJlbHlpbmcgb24gZGVhZCBjb2RlIGVsaW1pbmF0aW9uIGJ5IHRoZSBidWlsZAorLy8gY29tcGlsZXIgdG8gZ2V0IHJpZCBvZiB0aGUgdXNlbGVzcyBibG9jayBvZiBjb2RlLCBhbmQgc2F2ZSBhIG5lZWRsZXNzCisvLyBicmFuY2ggYXQgcnVudGltZS4KKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMKE9QLCBGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMKE9QLCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNlbHNlCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUwoT1AsIEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKyNpZiBLTVBfTUlDCisjZGVmaW5lIEtNUF9ET19QQVVTRSBfbW1fZGVsYXlfMzIoMSkKKyNlbHNlCisjZGVmaW5lIEtNUF9ET19QQVVTRSBLTVBfQ1BVX1BBVVNFKCkKKyNlbmRpZiAvKiBLTVBfTUlDICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3BlcmF0aW9uIG9uICpsaHMsIHJocyB1c2luZyAiY29tcGFyZV9hbmRfc3RvcmUiIHJvdXRpbmUKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZHMnIHR5cGUKKy8vICAgICBCSVRTICAgIC0gc2l6ZSBpbiBiaXRzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIGxvdyBsZXZlbCBjYWxscworLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorI2RlZmluZSBPUF9DTVBYQ0hHKFRZUEUsIEJJVFMsIE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBvbGRfdmFsdWUsIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG9sZF92YWx1ZSA9ICooVFlQRSB2b2xhdGlsZSAqKWxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKCFLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRIyNCSVRTKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoa21wX2ludCMjQklUUyAqKWxocywgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmIG9sZF92YWx1ZSwgICAgIFwKKyAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmIG5ld192YWx1ZSkpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBLTVBfRE9fUEFVU0U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG9sZF92YWx1ZSA9ICooVFlQRSB2b2xhdGlsZSAqKWxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjaWYgVVNFX0NNUFhDSEdfRklYCisvLyAyMDA3LTA2LTI1OgorLy8gd29ya2Fyb3VuZCBmb3IgQzc4Mjg3IChjb21wbGV4KGtpbmQ9NCkgZGF0YSB0eXBlKS4gbGluXzMyLCBsaW5fMzJlLCB3aW5fMzIKKy8vIGFuZCB3aW5fMzJlIGFyZSBhZmZlY3RlZCAoSSB2ZXJpZmllZCB0aGUgYXNtKS4gQ29tcGlsZXIgaWdub3JlcyB0aGUgdm9sYXRpbGUKKy8vIHF1YWxpZmllciBvZiB0aGUgdGVtcF92YWwgaW4gdGhlIE9QX0NNUFhDSEcgbWFjcm8uIFRoaXMgaXMgYSBwcm9ibGVtIG9mIHRoZQorLy8gY29tcGlsZXIuIFJlbGF0ZWQgdHJhY2tlciBpcyBDNzYwMDUsIHRhcmdldGVkIHRvIDExLjAuIEkgdmVyaWZpZWQgdGhlIGFzbSBvZgorLy8gdGhlIHdvcmthcm91bmQuCisjZGVmaW5lIE9QX0NNUFhDSEdfV09SS0FST1VORChUWVBFLCBCSVRTLCBPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdHJ1Y3QgX3NzcyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBUWVBFIGNtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAga21wX2ludCMjQklUUyAqdnZ2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RydWN0IF9zc3Mgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG9sZF92YWx1ZS52dnYgPSAoa21wX2ludCMjQklUUyAqKSZvbGRfdmFsdWUuY21wOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBuZXdfdmFsdWUudnZ2ID0gKGttcF9pbnQjI0JJVFMgKikmbmV3X3ZhbHVlLmNtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKm9sZF92YWx1ZS52dnYgPSAqKHZvbGF0aWxlIGttcF9pbnQjI0JJVFMgKilsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5ld192YWx1ZS5jbXAgPSBvbGRfdmFsdWUuY21wIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3aGlsZSAoIUtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EjI0JJVFMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChrbXBfaW50IyNCSVRTICopbGhzLCAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopIG9sZF92YWx1ZS52dnYsICAgXAorICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopIG5ld192YWx1ZS52dnYpKSB7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEtNUF9ET19QQVVTRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKm9sZF92YWx1ZS52dnYgPSAqKHZvbGF0aWxlIGttcF9pbnQjI0JJVFMgKilsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG5ld192YWx1ZS5jbXAgPSBvbGRfdmFsdWUuY21wIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisvLyBlbmQgb2YgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHdvcmthcm91bmQgZm9yIEM3ODI4NworI2VuZGlmIC8vIFVTRV9DTVBYQ0hHX0ZJWAorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFg4NiBvciBYODZfNjQ6IG5vIGFsaWdubWVudCBwcm9ibGVtcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgQVRPTUlDX0ZJWEVEX0FERChUWVBFX0lELCBPUF9JRCwgVFlQRSwgQklUUywgT1AsIExDS19JRCwgTUFTSywgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBVE9NSUNfQkVHSU4oVFlQRV9JRCwgT1BfSUQsIFRZUEUsIHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT1BfR09NUF9DUklUSUNBTChPUCMjID0sIEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIE9QIHVzZWQgYXMgYSBzaWduIGZvciBzdWJ0cmFjdGlvbjogKGxocy1yaHMpIC0tPiAobGhzKy1yaHMpICovICAgICAgICAgICAgXAorICBLTVBfVEVTVF9USEVOX0FERCMjQklUUyhsaHMsIE9QIHJocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ01QWENIRyhUWVBFX0lELCBPUF9JRCwgVFlQRSwgQklUUywgT1AsIExDS19JRCwgTUFTSywgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFUT01JQ19CRUdJTihUWVBFX0lELCBPUF9JRCwgVFlQRSwgdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBPUF9HT01QX0NSSVRJQ0FMKE9QIyMgPSwgR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT1BfQ01QWENIRyhUWVBFLCBCSVRTLCBPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNpZiBVU0VfQ01QWENIR19GSVgKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHdvcmthcm91bmQgZm9yIEM3ODI4NyAoY29tcGxleChraW5kPTQpIGRhdGEgdHlwZSkKKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfV09SS0FST1VORChUWVBFX0lELCBPUF9JRCwgVFlQRSwgQklUUywgT1AsIExDS19JRCwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFTSywgR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBVE9NSUNfQkVHSU4oVFlQRV9JRCwgT1BfSUQsIFRZUEUsIHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT1BfR09NUF9DUklUSUNBTChPUCMjID0sIEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE9QX0NNUFhDSEdfV09SS0FST1VORChUWVBFLCBCSVRTLCBPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisvLyBlbmQgb2YgdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSB3b3JrYXJvdW5kIGZvciBDNzgyODcKKyNlbmRpZgorCisjZWxzZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29kZSBmb3Igb3RoZXIgYXJjaGl0ZWN0dXJlcyB0aGF0IGRvbid0IGhhbmRsZSB1bmFsaWduZWQgYWNjZXNzZXMuCisjZGVmaW5lIEFUT01JQ19GSVhFRF9BREQoVFlQRV9JRCwgT1BfSUQsIFRZUEUsIEJJVFMsIE9QLCBMQ0tfSUQsIE1BU0ssICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQVRPTUlDX0JFR0lOKFRZUEVfSUQsIE9QX0lELCBUWVBFLCB2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIyA9LCBHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoISgoa21wX3VpbnRwdHJfdClsaHMgJiAweCMjTUFTSykpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBPUCB1c2VkIGFzIGEgc2lnbiBmb3Igc3VidHJhY3Rpb246IChsaHMtcmhzKSAtLT4gKGxocystcmhzKSAqLyAgICAgICAgICBcCisgICAgS01QX1RFU1RfVEhFTl9BREQjI0JJVFMobGhzLCBPUCByaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ1JJVElDQUwoT1AjIyA9LCBMQ0tfSUQpIC8qIHVuYWxpZ25lZCBhZGRyZXNzIC0gdXNlIGNyaXRpY2FsICovICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ01QWENIRyhUWVBFX0lELCBPUF9JRCwgVFlQRSwgQklUUywgT1AsIExDS19JRCwgTUFTSywgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFUT01JQ19CRUdJTihUWVBFX0lELCBPUF9JRCwgVFlQRSwgdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBPUF9HT01QX0NSSVRJQ0FMKE9QIyMgPSwgR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKCEoKGttcF91aW50cHRyX3QpbGhzICYgMHgjI01BU0spKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIRyhUWVBFLCBCSVRTLCBPUCkgLyogYWxpZ25lZCBhZGRyZXNzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ1JJVElDQUwoT1AjIyA9LCBMQ0tfSUQpIC8qIHVuYWxpZ25lZCBhZGRyZXNzIC0gdXNlIGNyaXRpY2FsICovICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorI2lmIFVTRV9DTVBYQ0hHX0ZJWAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gd29ya2Fyb3VuZCBmb3IgQzc4Mjg3IChjb21wbGV4KGtpbmQ9NCkgZGF0YSB0eXBlKQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19XT1JLQVJPVU5EKFRZUEVfSUQsIE9QX0lELCBUWVBFLCBCSVRTLCBPUCwgTENLX0lELCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVNLLCBHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFUT01JQ19CRUdJTihUWVBFX0lELCBPUF9JRCwgVFlQRSwgdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBPUF9HT01QX0NSSVRJQ0FMKE9QIyMgPSwgR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKCEoKGttcF91aW50cHRyX3QpbGhzICYgMHgjI01BU0spKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIRyhUWVBFLCBCSVRTLCBPUCkgLyogYWxpZ25lZCBhZGRyZXNzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ1JJVElDQUwoT1AjIyA9LCBMQ0tfSUQpIC8qIHVuYWxpZ25lZCBhZGRyZXNzIC0gdXNlIGNyaXRpY2FsICovICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorLy8gZW5kIG9mIHRoZSBzZWNvbmQgcGFydCBvZiB0aGUgd29ya2Fyb3VuZCBmb3IgQzc4Mjg3CisjZW5kaWYgLy8gVVNFX0NNUFhDSEdfRklYCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisvLyBSb3V0aW5lcyBmb3IgQVRPTUlDIDQtYnl0ZSBvcGVyYW5kcyBhZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24KK0FUT01JQ19GSVhFRF9BREQoZml4ZWQ0LCBhZGQsIGttcF9pbnQzMiwgMzIsICssIDRpLCAzLAorICAgICAgICAgICAgICAgICAwKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGQKK0FUT01JQ19GSVhFRF9BREQoZml4ZWQ0LCBzdWIsIGttcF9pbnQzMiwgMzIsIC0sIDRpLCAzLAorICAgICAgICAgICAgICAgICAwKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWIKKworQVRPTUlDX0NNUFhDSEcoZmxvYXQ0LCBhZGQsIGttcF9yZWFsMzIsIDMyLCArLCA0ciwgMywKKyAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfYWRkCitBVE9NSUNfQ01QWENIRyhmbG9hdDQsIHN1Yiwga21wX3JlYWwzMiwgMzIsIC0sIDRyLCAzLAorICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWIKKworLy8gUm91dGluZXMgZm9yIEFUT01JQyA4LWJ5dGUgb3BlcmFuZHMgYWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uCitBVE9NSUNfRklYRURfQUREKGZpeGVkOCwgYWRkLCBrbXBfaW50NjQsIDY0LCArLCA4aSwgNywKKyAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGQKK0FUT01JQ19GSVhFRF9BREQoZml4ZWQ4LCBzdWIsIGttcF9pbnQ2NCwgNjQsIC0sIDhpLCA3LAorICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1YgorCitBVE9NSUNfQ01QWENIRyhmbG9hdDgsIGFkZCwga21wX3JlYWw2NCwgNjQsICssIDhyLCA3LAorICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGQKK0FUT01JQ19DTVBYQ0hHKGZsb2F0OCwgc3ViLCBrbXBfcmVhbDY0LCA2NCwgLSwgOHIsIDcsCisgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1YgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJpZXMgZGVmaW5pdGlvbiBmb3IgaW50ZWdlciBvcGVyYW5kcworLy8gICAgIFRZUEVfSUQgLSBvcGVyYW5kcyB0eXBlIGFuZCBzaXplIChmaXhlZDQsIGZsb2F0NCkKKy8vICAgICBPUF9JRCAgIC0gb3BlcmF0aW9uIGlkZW50aWZpZXIgKGFkZCwgc3ViLCBtdWwsIC4uLikKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZCB0eXBlCisvLyAgICAgQklUUyAgICAtIHNpemUgaW4gYml0cywgdXNlZCB0byBkaXN0aW5ndWlzaCBsb3cgbGV2ZWwgY2FsbHMKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IgKHVzZWQgaW4gY3JpdGljYWwgc2VjdGlvbikKKy8vICAgICBMQ0tfSUQgIC0gbG9jayBpZGVudGlmaWVyLCB1c2VkIHRvIHBvc3NpYmx5IGRpc3Rpbmd1aXNoIGxvY2sgdmFyaWFibGUKKy8vICAgICBNQVNLICAgIC0gdXNlZCBmb3IgYWxpZ25tZW50IGNoZWNrCisKKy8vICAgICAgICAgICAgICAgVFlQRV9JRCxPUF9JRCwgIFRZUEUsICAgQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZXMgZm9yIEFUT01JQyBpbnRlZ2VyIG9wZXJhbmRzLCBvdGhlciBvcGVyYXRvcnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgICAgICAgIFRZUEVfSUQsT1BfSUQsIFRZUEUsICAgICAgICAgIE9QLCBMQ0tfSUQsIEdPTVBfRkxBRworQVRPTUlDX0NNUFhDSEcoZml4ZWQxLCBhZGQsIGttcF9pbnQ4LCA4LCArLCAxaSwgMCwKKyAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDFfYWRkCitBVE9NSUNfQ01QWENIRyhmaXhlZDEsIGFuZGIsIGttcF9pbnQ4LCA4LCAmLCAxaSwgMCwKKyAgICAgICAgICAgICAgIDApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGIKK0FUT01JQ19DTVBYQ0hHKGZpeGVkMSwgZGl2LCBrbXBfaW50OCwgOCwgLywgMWksIDAsCisgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2RpdgorQVRPTUlDX0NNUFhDSEcoZml4ZWQxdSwgZGl2LCBrbXBfdWludDgsIDgsIC8sIDFpLCAwLAorICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2CitBVE9NSUNfQ01QWENIRyhmaXhlZDEsIG11bCwga21wX2ludDgsIDgsICosIDFpLCAwLAorICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWwKK0FUT01JQ19DTVBYQ0hHKGZpeGVkMSwgb3JiLCBrbXBfaW50OCwgOCwgfCwgMWksIDAsCisgICAgICAgICAgICAgICAwKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmIKK0FUT01JQ19DTVBYQ0hHKGZpeGVkMSwgc2hsLCBrbXBfaW50OCwgOCwgPDwsIDFpLCAwLAorICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGwKK0FUT01JQ19DTVBYQ0hHKGZpeGVkMSwgc2hyLCBrbXBfaW50OCwgOCwgPj4sIDFpLCAwLAorICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHIKK0FUT01JQ19DTVBYQ0hHKGZpeGVkMXUsIHNociwga21wX3VpbnQ4LCA4LCA+PiwgMWksIDAsCisgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHIKK0FUT01JQ19DTVBYQ0hHKGZpeGVkMSwgc3ViLCBrbXBfaW50OCwgOCwgLSwgMWksIDAsCisgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3N1YgorQVRPTUlDX0NNUFhDSEcoZml4ZWQxLCB4b3IsIGttcF9pbnQ4LCA4LCBeLCAxaSwgMCwKKyAgICAgICAgICAgICAgIDApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3hvcgorQVRPTUlDX0NNUFhDSEcoZml4ZWQyLCBhZGQsIGttcF9pbnQxNiwgMTYsICssIDJpLCAxLAorICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGQKK0FUT01JQ19DTVBYQ0hHKGZpeGVkMiwgYW5kYiwga21wX2ludDE2LCAxNiwgJiwgMmksIDEsCisgICAgICAgICAgICAgICAwKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRiCitBVE9NSUNfQ01QWENIRyhmaXhlZDIsIGRpdiwga21wX2ludDE2LCAxNiwgLywgMmksIDEsCisgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2RpdgorQVRPTUlDX0NNUFhDSEcoZml4ZWQydSwgZGl2LCBrbXBfdWludDE2LCAxNiwgLywgMmksIDEsCisgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXYKK0FUT01JQ19DTVBYQ0hHKGZpeGVkMiwgbXVsLCBrbXBfaW50MTYsIDE2LCAqLCAyaSwgMSwKKyAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDJfbXVsCitBVE9NSUNfQ01QWENIRyhmaXhlZDIsIG9yYiwga21wX2ludDE2LCAxNiwgfCwgMmksIDEsCisgICAgICAgICAgICAgICAwKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmIKK0FUT01JQ19DTVBYQ0hHKGZpeGVkMiwgc2hsLCBrbXBfaW50MTYsIDE2LCA8PCwgMmksIDEsCisgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3NobAorQVRPTUlDX0NNUFhDSEcoZml4ZWQyLCBzaHIsIGttcF9pbnQxNiwgMTYsID4+LCAyaSwgMSwKKyAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc2hyCitBVE9NSUNfQ01QWENIRyhmaXhlZDJ1LCBzaHIsIGttcF91aW50MTYsIDE2LCA+PiwgMmksIDEsCisgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHIKK0FUT01JQ19DTVBYQ0hHKGZpeGVkMiwgc3ViLCBrbXBfaW50MTYsIDE2LCAtLCAyaSwgMSwKKyAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc3ViCitBVE9NSUNfQ01QWENIRyhmaXhlZDIsIHhvciwga21wX2ludDE2LCAxNiwgXiwgMmksIDEsCisgICAgICAgICAgICAgICAwKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl94b3IKK0FUT01JQ19DTVBYQ0hHKGZpeGVkNCwgYW5kYiwga21wX2ludDMyLCAzMiwgJiwgNGksIDMsCisgICAgICAgICAgICAgICAwKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRiCitBVE9NSUNfQ01QWENIRyhmaXhlZDQsIGRpdiwga21wX2ludDMyLCAzMiwgLywgNGksIDMsCisgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2RpdgorQVRPTUlDX0NNUFhDSEcoZml4ZWQ0dSwgZGl2LCBrbXBfdWludDMyLCAzMiwgLywgNGksIDMsCisgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXYKK0FUT01JQ19DTVBYQ0hHKGZpeGVkNCwgbXVsLCBrbXBfaW50MzIsIDMyLCAqLCA0aSwgMywKKyAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDRfbXVsCitBVE9NSUNfQ01QWENIRyhmaXhlZDQsIG9yYiwga21wX2ludDMyLCAzMiwgfCwgNGksIDMsCisgICAgICAgICAgICAgICAwKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmIKK0FUT01JQ19DTVBYQ0hHKGZpeGVkNCwgc2hsLCBrbXBfaW50MzIsIDMyLCA8PCwgNGksIDMsCisgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobAorQVRPTUlDX0NNUFhDSEcoZml4ZWQ0LCBzaHIsIGttcF9pbnQzMiwgMzIsID4+LCA0aSwgMywKKyAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc2hyCitBVE9NSUNfQ01QWENIRyhmaXhlZDR1LCBzaHIsIGttcF91aW50MzIsIDMyLCA+PiwgNGksIDMsCisgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHIKK0FUT01JQ19DTVBYQ0hHKGZpeGVkNCwgeG9yLCBrbXBfaW50MzIsIDMyLCBeLCA0aSwgMywKKyAgICAgICAgICAgICAgIDApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3hvcgorQVRPTUlDX0NNUFhDSEcoZml4ZWQ4LCBhbmRiLCBrbXBfaW50NjQsIDY0LCAmLCA4aSwgNywKKyAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDhfYW5kYgorQVRPTUlDX0NNUFhDSEcoZml4ZWQ4LCBkaXYsIGttcF9pbnQ2NCwgNjQsIC8sIDhpLCA3LAorICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXYKK0FUT01JQ19DTVBYQ0hHKGZpeGVkOHUsIGRpdiwga21wX3VpbnQ2NCwgNjQsIC8sIDhpLCA3LAorICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2CitBVE9NSUNfQ01QWENIRyhmaXhlZDgsIG11bCwga21wX2ludDY0LCA2NCwgKiwgOGksIDcsCisgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X211bAorQVRPTUlDX0NNUFhDSEcoZml4ZWQ4LCBvcmIsIGttcF9pbnQ2NCwgNjQsIHwsIDhpLCA3LAorICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmIKK0FUT01JQ19DTVBYQ0hHKGZpeGVkOCwgc2hsLCBrbXBfaW50NjQsIDY0LCA8PCwgOGksIDcsCisgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobAorQVRPTUlDX0NNUFhDSEcoZml4ZWQ4LCBzaHIsIGttcF9pbnQ2NCwgNjQsID4+LCA4aSwgNywKKyAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc2hyCitBVE9NSUNfQ01QWENIRyhmaXhlZDh1LCBzaHIsIGttcF91aW50NjQsIDY0LCA+PiwgOGksIDcsCisgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHIKK0FUT01JQ19DTVBYQ0hHKGZpeGVkOCwgeG9yLCBrbXBfaW50NjQsIDY0LCBeLCA4aSwgNywKKyAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDhfeG9yCitBVE9NSUNfQ01QWENIRyhmbG9hdDQsIGRpdiwga21wX3JlYWwzMiwgMzIsIC8sIDRyLCAzLAorICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXYKK0FUT01JQ19DTVBYQ0hHKGZsb2F0NCwgbXVsLCBrbXBfcmVhbDMyLCAzMiwgKiwgNHIsIDMsCisgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X211bAorQVRPTUlDX0NNUFhDSEcoZmxvYXQ4LCBkaXYsIGttcF9yZWFsNjQsIDY0LCAvLCA4ciwgNywKKyAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfZGl2CitBVE9NSUNfQ01QWENIRyhmbG9hdDgsIG11bCwga21wX3JlYWw2NCwgNjQsICosIDhyLCA3LAorICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWwKKy8vICAgICAgICAgICAgICBUWVBFX0lELE9QX0lELCBUWVBFLCAgICAgICAgICBPUCwgTENLX0lELCBHT01QX0ZMQUcKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBSb3V0aW5lcyBmb3IgQy9DKysgUmVkdWN0aW9uIG9wZXJhdG9ycyAmJiBhbmQgfHwgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOZWVkIHNlcGFyYXRlIG1hY3JvcyBmb3IgJiYsIHx8IGJlY2F1c2UgdGhlcmUgaXMgbm8gY29tYmluZWQgYXNzaWdubWVudAorLy8gICBUT0RPOiBlbGltaW5hdGUgQVRPTUlDX0NSSVRfe0wsRVFWfSBtYWNyb3MgYXMgbm90IHVzZWQKKyNkZWZpbmUgQVRPTUlDX0NSSVRfTChUWVBFX0lELCBPUF9JRCwgVFlQRSwgT1AsIExDS19JRCwgR09NUF9GTEFHKSAgICAgICAgICAgICBcCisgIEFUT01JQ19CRUdJTihUWVBFX0lELCBPUF9JRCwgVFlQRSwgdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBPUF9HT01QX0NSSVRJQ0FMKD0gKmxocyBPUCwgR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT1BfQ1JJVElDQUwoPSAqbGhzIE9QLCBMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBYODYgb3IgWDg2XzY0OiBubyBhbGlnbm1lbnQgcHJvYmxlbXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgQVRPTUlDX0NNUFhfTChUWVBFX0lELCBPUF9JRCwgVFlQRSwgQklUUywgT1AsIExDS19JRCwgTUFTSywgR09NUF9GTEFHKSBcCisgIEFUT01JQ19CRUdJTihUWVBFX0lELCBPUF9JRCwgVFlQRSwgdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBPUF9HT01QX0NSSVRJQ0FMKD0gKmxocyBPUCwgR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT1BfQ01QWENIRyhUWVBFLCBCSVRTLCBPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2Vsc2UKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29kZSBmb3Igb3RoZXIgYXJjaGl0ZWN0dXJlcyB0aGF0IGRvbid0IGhhbmRsZSB1bmFsaWduZWQgYWNjZXNzZXMuCisjZGVmaW5lIEFUT01JQ19DTVBYX0woVFlQRV9JRCwgT1BfSUQsIFRZUEUsIEJJVFMsIE9QLCBMQ0tfSUQsIE1BU0ssIEdPTVBfRkxBRykgXAorICBBVE9NSUNfQkVHSU4oVFlQRV9JRCwgT1BfSUQsIFRZUEUsIHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT1BfR09NUF9DUklUSUNBTCg9ICpsaHMgT1AsIEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICghKChrbXBfdWludHB0cl90KWxocyAmIDB4IyNNQVNLKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEcoVFlQRSwgQklUUywgT1ApIC8qIGFsaWduZWQgYWRkcmVzcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMKD0gKmxocyBPUCwgTENLX0lEKSAvKiB1bmFsaWduZWQgLSB1c2UgY3JpdGljYWwgKi8gICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKK0FUT01JQ19DTVBYX0woZml4ZWQxLCBhbmRsLCBjaGFyLCA4LCAmJiwgMWksIDAsCisgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDFfYW5kbAorQVRPTUlDX0NNUFhfTChmaXhlZDEsIG9ybCwgY2hhciwgOCwgfHwsIDFpLCAwLAorICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX29ybAorQVRPTUlDX0NNUFhfTChmaXhlZDIsIGFuZGwsIHNob3J0LCAxNiwgJiYsIDJpLCAxLAorICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGwKK0FUT01JQ19DTVBYX0woZml4ZWQyLCBvcmwsIHNob3J0LCAxNiwgfHwsIDJpLCAxLAorICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX29ybAorQVRPTUlDX0NNUFhfTChmaXhlZDQsIGFuZGwsIGttcF9pbnQzMiwgMzIsICYmLCA0aSwgMywKKyAgICAgICAgICAgICAgMCkgLy8gX19rbXBjX2F0b21pY19maXhlZDRfYW5kbAorQVRPTUlDX0NNUFhfTChmaXhlZDQsIG9ybCwga21wX2ludDMyLCAzMiwgfHwsIDRpLCAzLAorICAgICAgICAgICAgICAwKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmwKK0FUT01JQ19DTVBYX0woZml4ZWQ4LCBhbmRsLCBrbXBfaW50NjQsIDY0LCAmJiwgOGksIDcsCisgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDhfYW5kbAorQVRPTUlDX0NNUFhfTChmaXhlZDgsIG9ybCwga21wX2ludDY0LCA2NCwgfHwsIDhpLCA3LAorICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X29ybAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBSb3V0aW5lcyBmb3IgRm9ydHJhbiBvcGVyYXRvcnMgdGhhdCBtYXRjaGVkIG5vIG9uZSBpbiBDOiAgICAgICAgICAgICAgICAgICovCisvKiBNQVgsIE1JTiwgLkVRVi4sIC5ORVFWLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVyYXRvcnMgLkFORC4sIC5PUi4gYXJlIGNvdmVyZWQgYnkgX19rbXBjX2F0b21pY18qX3thbmRsLG9ybH0gICAgICAgICAgICovCisvKiBJbnRyaW5zaWNzIElBTkQsIElPUiwgSUVPUiBhcmUgY292ZXJlZCBieSBfX2ttcGNfYXRvbWljXypfe2FuZGIsb3JiLHhvcn0gICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1JTiBhbmQgTUFYIG5lZWQgc2VwYXJhdGUgbWFjcm9zCisvLyBPUCAtIG9wZXJhdG9yIHRvIGNoZWNrIGlmIHdlIG5lZWQgYW55IGFjdGlvbnM/CisjZGVmaW5lIE1JTl9NQVhfQ1JJVFNFQ1QoT1AsIExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCZBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICgqbGhzIE9QIHJocykgeyAvKiBzdGlsbCBuZWVkIGFjdGlvbnM/ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICpsaHMgPSByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soJkFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIEdPTVBfTUlOX01BWF9DUklUU0VDVChPUCwgRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTUlOX01BWF9DUklUU0VDVChPUCwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorI2Vsc2UKKyNkZWZpbmUgR09NUF9NSU5fTUFYX0NSSVRTRUNUKE9QLCBGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIE1JTl9NQVhfQ01QWENIRyhUWVBFLCBCSVRTLCBPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIEtNUF9BVE9NSUNfVk9MQVRJTEUgdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKG9sZF92YWx1ZSBPUCByaHMgJiYgLyogc3RpbGwgbmVlZCBhY3Rpb25zPyAqLyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAhS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUSMjQklUUyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIChrbXBfaW50IyNCSVRTICopbGhzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICYgb2xkX3ZhbHVlLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmIHJocykpIHsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEtNUF9DUFVfUEFVU0UoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gMS1ieXRlLCAyLWJ5dGUgb3BlcmFuZHMgLSB1c2UgY3JpdGljYWwgc2VjdGlvbgorI2RlZmluZSBNSU5fTUFYX0NSSVRJQ0FMKFRZUEVfSUQsIE9QX0lELCBUWVBFLCBPUCwgTENLX0lELCBHT01QX0ZMQUcpICAgICAgICAgIFwKKyAgQVRPTUlDX0JFR0lOKFRZUEVfSUQsIE9QX0lELCBUWVBFLCB2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICgqbGhzIE9QIHJocykgeyAvKiBuZWVkIGFjdGlvbnM/ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdPTVBfTUlOX01BWF9DUklUU0VDVChPUCwgR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNSU5fTUFYX0NSSVRTRUNUKE9QLCBMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFg4NiBvciBYODZfNjQ6IG5vIGFsaWdubWVudCBwcm9ibGVtcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgTUlOX01BWF9DT01QWENIRyhUWVBFX0lELCBPUF9JRCwgVFlQRSwgQklUUywgT1AsIExDS19JRCwgTUFTSywgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBVE9NSUNfQkVHSU4oVFlQRV9JRCwgT1BfSUQsIFRZUEUsIHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKCpsaHMgT1AgcmhzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR09NUF9NSU5fTUFYX0NSSVRTRUNUKE9QLCBHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1JTl9NQVhfQ01QWENIRyhUWVBFLCBCSVRTLCBPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2Vsc2UKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvZGUgZm9yIG90aGVyIGFyY2hpdGVjdHVyZXMgdGhhdCBkb24ndCBoYW5kbGUgdW5hbGlnbmVkIGFjY2Vzc2VzLgorI2RlZmluZSBNSU5fTUFYX0NPTVBYQ0hHKFRZUEVfSUQsIE9QX0lELCBUWVBFLCBCSVRTLCBPUCwgTENLX0lELCBNQVNLLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFUT01JQ19CRUdJTihUWVBFX0lELCBPUF9JRCwgVFlQRSwgdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoKmxocyBPUCByaHMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHT01QX01JTl9NQVhfQ1JJVFNFQ1QoT1AsIEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCEoKGttcF91aW50cHRyX3QpbGhzICYgMHgjI01BU0spKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgTUlOX01BWF9DTVBYQ0hHKFRZUEUsIEJJVFMsIE9QKSAvKiBhbGlnbmVkIGFkZHJlc3MgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgTUlOX01BWF9DUklUU0VDVChPUCwgTENLX0lEKSAvKiB1bmFsaWduZWQgYWRkcmVzcyAqLyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCitNSU5fTUFYX0NPTVBYQ0hHKGZpeGVkMSwgbWF4LCBjaGFyLCA4LCA8LCAxaSwgMCwKKyAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tYXgKK01JTl9NQVhfQ09NUFhDSEcoZml4ZWQxLCBtaW4sIGNoYXIsIDgsID4sIDFpLCAwLAorICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX21pbgorTUlOX01BWF9DT01QWENIRyhmaXhlZDIsIG1heCwgc2hvcnQsIDE2LCA8LCAyaSwgMSwKKyAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tYXgKK01JTl9NQVhfQ09NUFhDSEcoZml4ZWQyLCBtaW4sIHNob3J0LCAxNiwgPiwgMmksIDEsCisgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDJfbWluCitNSU5fTUFYX0NPTVBYQ0hHKGZpeGVkNCwgbWF4LCBrbXBfaW50MzIsIDMyLCA8LCA0aSwgMywKKyAgICAgICAgICAgICAgICAgMCkgLy8gX19rbXBjX2F0b21pY19maXhlZDRfbWF4CitNSU5fTUFYX0NPTVBYQ0hHKGZpeGVkNCwgbWluLCBrbXBfaW50MzIsIDMyLCA+LCA0aSwgMywKKyAgICAgICAgICAgICAgICAgMCkgLy8gX19rbXBjX2F0b21pY19maXhlZDRfbWluCitNSU5fTUFYX0NPTVBYQ0hHKGZpeGVkOCwgbWF4LCBrbXBfaW50NjQsIDY0LCA8LCA4aSwgNywKKyAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tYXgKK01JTl9NQVhfQ09NUFhDSEcoZml4ZWQ4LCBtaW4sIGttcF9pbnQ2NCwgNjQsID4sIDhpLCA3LAorICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X21pbgorTUlOX01BWF9DT01QWENIRyhmbG9hdDQsIG1heCwga21wX3JlYWwzMiwgMzIsIDwsIDRyLCAzLAorICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X21heAorTUlOX01BWF9DT01QWENIRyhmbG9hdDQsIG1pbiwga21wX3JlYWwzMiwgMzIsID4sIDRyLCAzLAorICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X21pbgorTUlOX01BWF9DT01QWENIRyhmbG9hdDgsIG1heCwga21wX3JlYWw2NCwgNjQsIDwsIDhyLCA3LAorICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X21heAorTUlOX01BWF9DT01QWENIRyhmbG9hdDgsIG1pbiwga21wX3JlYWw2NCwgNjQsID4sIDhyLCA3LAorICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X21pbgorI2lmIEtNUF9IQVZFX1FVQUQKK01JTl9NQVhfQ1JJVElDQUwoZmxvYXQxNiwgbWF4LCBRVUFEX0xFR0FDWSwgPCwgMTZyLAorICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4CitNSU5fTUFYX0NSSVRJQ0FMKGZsb2F0MTYsIG1pbiwgUVVBRF9MRUdBQ1ksID4sIDE2ciwKKyAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X21pbgorI2lmIChLTVBfQVJDSF9YODYpCitNSU5fTUFYX0NSSVRJQ0FMKGZsb2F0MTYsIG1heF9hMTYsIFF1YWRfYTE2X3QsIDwsIDE2ciwKKyAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X21heF9hMTYKK01JTl9NQVhfQ1JJVElDQUwoZmxvYXQxNiwgbWluX2ExNiwgUXVhZF9hMTZfdCwgPiwgMTZyLAorICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWluX2ExNgorI2VuZGlmCisjZW5kaWYKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTmVlZCBzZXBhcmF0ZSBtYWNyb3MgZm9yIC5FUVYuIGJlY2F1c2Ugb2YgdGhlIG5lZWQgb2YgY29tcGxlbWVudCAofikKKy8vIE9QIGlnbm9yZWQgZm9yIGNyaXRpY2FsIHNlY3Rpb25zLCBePX4gdXNlZCBpbnN0ZWFkCisjZGVmaW5lIEFUT01JQ19DUklUX0VRVihUWVBFX0lELCBPUF9JRCwgVFlQRSwgT1AsIExDS19JRCwgR09NUF9GTEFHKSAgICAgICAgICAgXAorICBBVE9NSUNfQkVHSU4oVFlQRV9JRCwgT1BfSUQsIFRZUEUsIHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT1BfR09NUF9DUklUSUNBTChePSB+LCBHT01QX0ZMQUcpIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgICAgICAgICAgICAgICBcCisgIE9QX0NSSVRJQ0FMKF49IH4sIExDS19JRCkgLyogc2VuZCBhc3NpZ25tZW50IGFuZCBjb21wbGVtZW50ICovICAgICAgICAgICAgICAgXAorICB9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gWDg2IG9yIFg4Nl82NDogbm8gYWxpZ25tZW50IHByb2JsZW1zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIEFUT01JQ19DTVBYX0VRVihUWVBFX0lELCBPUF9JRCwgVFlQRSwgQklUUywgT1AsIExDS19JRCwgTUFTSywgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQVRPTUlDX0JFR0lOKFRZUEVfSUQsIE9QX0lELCBUWVBFLCB2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE9QX0dPTVBfQ1JJVElDQUwoXj0gfiwgR09NUF9GTEFHKSAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICAgICAgICAgICAgXAorICBPUF9DTVBYQ0hHKFRZUEUsIEJJVFMsIE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxzZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2RlIGZvciBvdGhlciBhcmNoaXRlY3R1cmVzIHRoYXQgZG9uJ3QgaGFuZGxlIHVuYWxpZ25lZCBhY2Nlc3Nlcy4KKyNkZWZpbmUgQVRPTUlDX0NNUFhfRVFWKFRZUEVfSUQsIE9QX0lELCBUWVBFLCBCSVRTLCBPUCwgTENLX0lELCBNQVNLLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBVE9NSUNfQkVHSU4oVFlQRV9JRCwgT1BfSUQsIFRZUEUsIHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT1BfR09NUF9DUklUSUNBTChePSB+LCBHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICghKChrbXBfdWludHB0cl90KWxocyAmIDB4IyNNQVNLKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEcoVFlQRSwgQklUUywgT1ApIC8qIGFsaWduZWQgYWRkcmVzcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMKF49IH4sIExDS19JRCkgLyogdW5hbGlnbmVkIGFkZHJlc3MgLSB1c2UgY3JpdGljYWwgKi8gICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKK0FUT01JQ19DTVBYQ0hHKGZpeGVkMSwgbmVxdiwga21wX2ludDgsIDgsIF4sIDFpLCAwLAorICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9uZXF2CitBVE9NSUNfQ01QWENIRyhmaXhlZDIsIG5lcXYsIGttcF9pbnQxNiwgMTYsIF4sIDJpLCAxLAorICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2CitBVE9NSUNfQ01QWENIRyhmaXhlZDQsIG5lcXYsIGttcF9pbnQzMiwgMzIsIF4sIDRpLCAzLAorICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9uZXF2CitBVE9NSUNfQ01QWENIRyhmaXhlZDgsIG5lcXYsIGttcF9pbnQ2NCwgNjQsIF4sIDhpLCA3LAorICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9uZXF2CitBVE9NSUNfQ01QWF9FUVYoZml4ZWQxLCBlcXYsIGttcF9pbnQ4LCA4LCBefiwgMWksIDAsCisgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9lcXYKK0FUT01JQ19DTVBYX0VRVihmaXhlZDIsIGVxdiwga21wX2ludDE2LCAxNiwgXn4sIDJpLCAxLAorICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDJfZXF2CitBVE9NSUNfQ01QWF9FUVYoZml4ZWQ0LCBlcXYsIGttcF9pbnQzMiwgMzIsIF5+LCA0aSwgMywKKyAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2VxdgorQVRPTUlDX0NNUFhfRVFWKGZpeGVkOCwgZXF2LCBrbXBfaW50NjQsIDY0LCBefiwgOGksIDcsCisgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9lcXYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3V0aW5lcyBmb3IgRXh0ZW5kZWQgdHlwZXM6IGxvbmcgZG91YmxlLCBfUXVhZCwgY29tcGxleCBmbGF2b3VycyAodXNlCisvLyBjcml0aWNhbCBzZWN0aW9uKQorLy8gICAgIFRZUEVfSUQsIE9QX0lELCBUWVBFIC0gZGV0YWlsZWQgYWJvdmUKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IKKy8vICAgICBMQ0tfSUQgIC0gbG9jayBpZGVudGlmaWVyLCB1c2VkIHRvIHBvc3NpYmx5IGRpc3Rpbmd1aXNoIGxvY2sgdmFyaWFibGUKKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMKFRZUEVfSUQsIE9QX0lELCBUWVBFLCBPUCwgTENLX0lELCBHT01QX0ZMQUcpICAgICAgICAgICBcCisgIEFUT01JQ19CRUdJTihUWVBFX0lELCBPUF9JRCwgVFlQRSwgdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBPUF9HT01QX0NSSVRJQ0FMKE9QIyMgPSwgR09NUF9GTEFHKSAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgT1BfQ1JJVElDQUwoT1AjIyA9LCBMQ0tfSUQpIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLy8gcm91dGluZXMgZm9yIGxvbmcgZG91YmxlIHR5cGUKK0FUT01JQ19DUklUSUNBTChmbG9hdDEwLCBhZGQsIGxvbmcgZG91YmxlLCArLCAxMHIsCisgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX2FkZAorQVRPTUlDX0NSSVRJQ0FMKGZsb2F0MTAsIHN1YiwgbG9uZyBkb3VibGUsIC0sIDEwciwKKyAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViCitBVE9NSUNfQ1JJVElDQUwoZmxvYXQxMCwgbXVsLCBsb25nIGRvdWJsZSwgKiwgMTByLAorICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWwKK0FUT01JQ19DUklUSUNBTChmbG9hdDEwLCBkaXYsIGxvbmcgZG91YmxlLCAvLCAxMHIsCisgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX2RpdgorI2lmIEtNUF9IQVZFX1FVQUQKKy8vIHJvdXRpbmVzIGZvciBfUXVhZCB0eXBlCitBVE9NSUNfQ1JJVElDQUwoZmxvYXQxNiwgYWRkLCBRVUFEX0xFR0FDWSwgKywgMTZyLAorICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGQKK0FUT01JQ19DUklUSUNBTChmbG9hdDE2LCBzdWIsIFFVQURfTEVHQUNZLCAtLCAxNnIsCisgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X3N1YgorQVRPTUlDX0NSSVRJQ0FMKGZsb2F0MTYsIG11bCwgUVVBRF9MRUdBQ1ksICosIDE2ciwKKyAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsCitBVE9NSUNfQ1JJVElDQUwoZmxvYXQxNiwgZGl2LCBRVUFEX0xFR0FDWSwgLywgMTZyLAorICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXYKKyNpZiAoS01QX0FSQ0hfWDg2KQorQVRPTUlDX0NSSVRJQ0FMKGZsb2F0MTYsIGFkZF9hMTYsIFF1YWRfYTE2X3QsICssIDE2ciwKKyAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkX2ExNgorQVRPTUlDX0NSSVRJQ0FMKGZsb2F0MTYsIHN1Yl9hMTYsIFF1YWRfYTE2X3QsIC0sIDE2ciwKKyAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2ExNgorQVRPTUlDX0NSSVRJQ0FMKGZsb2F0MTYsIG11bF9hMTYsIFF1YWRfYTE2X3QsICosIDE2ciwKKyAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsX2ExNgorQVRPTUlDX0NSSVRJQ0FMKGZsb2F0MTYsIGRpdl9hMTYsIFF1YWRfYTE2X3QsIC8sIDE2ciwKKyAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2ExNgorI2VuZGlmCisjZW5kaWYKKy8vIHJvdXRpbmVzIGZvciBjb21wbGV4IHR5cGVzCisKKyNpZiBVU0VfQ01QWENIR19GSVgKKy8vIHdvcmthcm91bmQgZm9yIEM3ODI4NyAoY29tcGxleChraW5kPTQpIGRhdGEgdHlwZSkKK0FUT01JQ19DTVBYQ0hHX1dPUktBUk9VTkQoY21wbHg0LCBhZGQsIGttcF9jbXBseDMyLCA2NCwgKywgOGMsIDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfY21wbHg0X2FkZAorQVRPTUlDX0NNUFhDSEdfV09SS0FST1VORChjbXBseDQsIHN1Yiwga21wX2NtcGx4MzIsIDY0LCAtLCA4YywgNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDRfc3ViCitBVE9NSUNfQ01QWENIR19XT1JLQVJPVU5EKGNtcGx4NCwgbXVsLCBrbXBfY21wbHgzMiwgNjQsICosIDhjLCA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWwKK0FUT01JQ19DTVBYQ0hHX1dPUktBUk9VTkQoY21wbHg0LCBkaXYsIGttcF9jbXBseDMyLCA2NCwgLywgOGMsIDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfY21wbHg0X2RpdgorLy8gZW5kIG9mIHRoZSB3b3JrYXJvdW5kIGZvciBDNzgyODcKKyNlbHNlCitBVE9NSUNfQ1JJVElDQUwoY21wbHg0LCBhZGQsIGttcF9jbXBseDMyLCArLCA4YywgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDRfYWRkCitBVE9NSUNfQ1JJVElDQUwoY21wbHg0LCBzdWIsIGttcF9jbXBseDMyLCAtLCA4YywgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDRfc3ViCitBVE9NSUNfQ1JJVElDQUwoY21wbHg0LCBtdWwsIGttcF9jbXBseDMyLCAqLCA4YywgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDRfbXVsCitBVE9NSUNfQ1JJVElDQUwoY21wbHg0LCBkaXYsIGttcF9jbXBseDMyLCAvLCA4YywgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDRfZGl2CisjZW5kaWYgLy8gVVNFX0NNUFhDSEdfRklYCisKK0FUT01JQ19DUklUSUNBTChjbXBseDgsIGFkZCwga21wX2NtcGx4NjQsICssIDE2YywgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDhfYWRkCitBVE9NSUNfQ1JJVElDQUwoY21wbHg4LCBzdWIsIGttcF9jbXBseDY0LCAtLCAxNmMsIDEpIC8vIF9fa21wY19hdG9taWNfY21wbHg4X3N1YgorQVRPTUlDX0NSSVRJQ0FMKGNtcGx4OCwgbXVsLCBrbXBfY21wbHg2NCwgKiwgMTZjLCAxKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWwKK0FUT01JQ19DUklUSUNBTChjbXBseDgsIGRpdiwga21wX2NtcGx4NjQsIC8sIDE2YywgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDhfZGl2CitBVE9NSUNfQ1JJVElDQUwoY21wbHgxMCwgYWRkLCBrbXBfY21wbHg4MCwgKywgMjBjLAorICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9hZGQKK0FUT01JQ19DUklUSUNBTChjbXBseDEwLCBzdWIsIGttcF9jbXBseDgwLCAtLCAyMGMsCisgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX3N1YgorQVRPTUlDX0NSSVRJQ0FMKGNtcGx4MTAsIG11bCwga21wX2NtcGx4ODAsICosIDIwYywKKyAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfbXVsCitBVE9NSUNfQ1JJVElDQUwoY21wbHgxMCwgZGl2LCBrbXBfY21wbHg4MCwgLywgMjBjLAorICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXYKKyNpZiBLTVBfSEFWRV9RVUFECitBVE9NSUNfQ1JJVElDQUwoY21wbHgxNiwgYWRkLCBDUExYMTI4X0xFRywgKywgMzJjLAorICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGQKK0FUT01JQ19DUklUSUNBTChjbXBseDE2LCBzdWIsIENQTFgxMjhfTEVHLCAtLCAzMmMsCisgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X3N1YgorQVRPTUlDX0NSSVRJQ0FMKGNtcGx4MTYsIG11bCwgQ1BMWDEyOF9MRUcsICosIDMyYywKKyAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsCitBVE9NSUNfQ1JJVElDQUwoY21wbHgxNiwgZGl2LCBDUExYMTI4X0xFRywgLywgMzJjLAorICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXYKKyNpZiAoS01QX0FSQ0hfWDg2KQorQVRPTUlDX0NSSVRJQ0FMKGNtcGx4MTYsIGFkZF9hMTYsIGttcF9jbXBseDEyOF9hMTZfdCwgKywgMzJjLAorICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfYTE2CitBVE9NSUNfQ1JJVElDQUwoY21wbHgxNiwgc3ViX2ExNiwga21wX2NtcGx4MTI4X2ExNl90LCAtLCAzMmMsCisgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9hMTYKK0FUT01JQ19DUklUSUNBTChjbXBseDE2LCBtdWxfYTE2LCBrbXBfY21wbHgxMjhfYTE2X3QsICosIDMyYywKKyAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2ExNgorQVRPTUlDX0NSSVRJQ0FMKGNtcGx4MTYsIGRpdl9hMTYsIGttcF9jbXBseDEyOF9hMTZfdCwgLywgMzJjLAorICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfYTE2CisjZW5kaWYKKyNlbmRpZgorCisjaWYgT01QXzQwX0VOQUJMRUQKKworLy8gT3Blbk1QIDQuMDogeCA9IGV4cHIgYmlub3AgeCBmb3Igbm9uLWNvbW11dGF0aXZlIG9wZXJhdGlvbnMuCisvLyBTdXBwb3J0ZWQgb25seSBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0CisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgYm91bmQgYnkgY3JpdGljYWwgc2VjdGlvbgorLy8gICAgIE9QICAgICAtIG9wZXJhdG9yIChpdCdzIHN1cHBvc2VkIHRvIGNvbnRhaW4gYW4gYXNzaWdubWVudCkKKy8vICAgICBMQ0tfSUQgLSBsb2NrIGlkZW50aWZpZXIKKy8vIE5vdGU6IGRvbid0IGNoZWNrIGd0aWQgYXMgaXQgc2hvdWxkIGFsd2F5cyBiZSB2YWxpZAorLy8gMSwgMi1ieXRlIC0gZXhwZWN0IHZhbGlkIHBhcmFtZXRlciwgb3RoZXIgLSBjaGVjayBiZWZvcmUgdGhpcyBtYWNybworI2RlZmluZSBPUF9DUklUSUNBTF9SRVYoT1AsIExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jaygmQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKmxocykgPSAocmhzKU9QKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soJkFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQpOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfUkVWKE9QLCBGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ1JJVElDQUxfUkVWKE9QLCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorI2Vsc2UKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9SRVYoT1AsIEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKy8vIEJlZ2lubmluZyBvZiBhIGRlZmluaXRpb24gKHByb3ZpZGVzIG5hbWUsIHBhcmFtZXRlcnMsIGdlYnVnIHRyYWNlKQorLy8gICAgIFRZUEVfSUQgLSBvcGVyYW5kcyB0eXBlIGFuZCBzaXplIChmaXhlZCosIGZpeGVkKnUgZm9yIHNpZ25lZCwgdW5zaWduZWQKKy8vICAgICBmaXhlZCkKKy8vICAgICBPUF9JRCAgIC0gb3BlcmF0aW9uIGlkZW50aWZpZXIgKGFkZCwgc3ViLCBtdWwsIC4uLikKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZHMnIHR5cGUKKyNkZWZpbmUgQVRPTUlDX0JFR0lOX1JFVihUWVBFX0lELCBPUF9JRCwgVFlQRSwgUkVUX1RZUEUpICAgICAgICAgICAgICAgICAgICAgICBcCisgIFJFVF9UWVBFIF9fa21wY19hdG9taWNfIyNUWVBFX0lEIyNfIyNPUF9JRCMjX3JldihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRSAqbGhzLCBUWVBFIHJocykgeyAgICAgIFwKKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2luaXRfc2VyaWFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS0FfVFJBQ0UoMTAwLCAoIl9fa21wY19hdG9taWNfIiAjVFlQRV9JRCAiXyIgI09QX0lEICJfcmV2OiBUIyVkXG4iLCBndGlkKSk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3BlcmF0aW9uIG9uICpsaHMsIHJocyB1c2luZyAiY29tcGFyZV9hbmRfc3RvcmUiIHJvdXRpbmUKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZHMnIHR5cGUKKy8vICAgICBCSVRTICAgIC0gc2l6ZSBpbiBiaXRzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIGxvdyBsZXZlbCBjYWxscworLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorLy8gTm90ZTogdGVtcF92YWwgaW50cm9kdWNlZCBpbiBvcmRlciB0byBmb3JjZSB0aGUgY29tcGlsZXIgdG8gcmVhZAorLy8gICAgICAgKmxocyBvbmx5IG9uY2UgKHcvbyBpdCB0aGUgY29tcGlsZXIgcmVhZHMgKmxocyB0d2ljZSkKKyNkZWZpbmUgT1BfQ01QWENIR19SRVYoVFlQRSwgQklUUywgT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgS01QX0FUT01JQ19WT0xBVElMRSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBuZXdfdmFsdWUgPSByaHMgT1Agb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKCFLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRIyNCSVRTKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoa21wX2ludCMjQklUUyAqKWxocywgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmIG9sZF92YWx1ZSwgICAgIFwKKyAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmIG5ld192YWx1ZSkpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBLTVBfRE9fUEFVU0U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbmV3X3ZhbHVlID0gcmhzIE9QIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19SRVYoVFlQRV9JRCwgT1BfSUQsIFRZUEUsIEJJVFMsIE9QLCBMQ0tfSUQsIEdPTVBfRkxBRykgIFwKKyAgQVRPTUlDX0JFR0lOX1JFVihUWVBFX0lELCBPUF9JRCwgVFlQRSwgdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE9QX0dPTVBfQ1JJVElDQUxfUkVWKE9QLCBHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBPUF9DTVBYQ0hHX1JFVihUWVBFLCBCSVRTLCBPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJpZXMgZGVmaW5pdGlvbiBmb3IgaW50ZWdlciBvcGVyYW5kcworLy8gICAgIFRZUEVfSUQgLSBvcGVyYW5kcyB0eXBlIGFuZCBzaXplIChmaXhlZDQsIGZsb2F0NCkKKy8vICAgICBPUF9JRCAgIC0gb3BlcmF0aW9uIGlkZW50aWZpZXIgKGFkZCwgc3ViLCBtdWwsIC4uLikKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZCB0eXBlCisvLyAgICAgQklUUyAgICAtIHNpemUgaW4gYml0cywgdXNlZCB0byBkaXN0aW5ndWlzaCBsb3cgbGV2ZWwgY2FsbHMKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IgKHVzZWQgaW4gY3JpdGljYWwgc2VjdGlvbikKKy8vICAgICBMQ0tfSUQgIC0gbG9jayBpZGVudGlmaWVyLCB1c2VkIHRvIHBvc3NpYmx5IGRpc3Rpbmd1aXNoIGxvY2sgdmFyaWFibGUKKworLy8gICAgICAgICAgICAgICBUWVBFX0lELE9QX0lELCAgVFlQRSwgICBCSVRTLE9QLExDS19JRCxHT01QX0ZMQUcKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZXMgZm9yIEFUT01JQyBpbnRlZ2VyIG9wZXJhbmRzLCBvdGhlciBvcGVyYXRvcnMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgICAgICAgICAgICBUWVBFX0lELE9QX0lELCBUWVBFLCAgICBCSVRTLCBPUCwgTENLX0lELCBHT01QX0ZMQUcKK0FUT01JQ19DTVBYQ0hHX1JFVihmaXhlZDEsIGRpdiwga21wX2ludDgsIDgsIC8sIDFpLAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDFfZGl2X3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKGZpeGVkMXUsIGRpdiwga21wX3VpbnQ4LCA4LCAvLCAxaSwKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoZml4ZWQxLCBzaGwsIGttcF9pbnQ4LCA4LCA8PCwgMWksCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGxfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoZml4ZWQxLCBzaHIsIGttcF9pbnQ4LCA4LCA+PiwgMWksCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoZml4ZWQxdSwgc2hyLCBrbXBfdWludDgsIDgsID4+LCAxaSwKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoZml4ZWQxLCBzdWIsIGttcF9pbnQ4LCA4LCAtLCAxaSwKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9yZXYKKworQVRPTUlDX0NNUFhDSEdfUkVWKGZpeGVkMiwgZGl2LCBrbXBfaW50MTYsIDE2LCAvLCAyaSwKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFVihmaXhlZDJ1LCBkaXYsIGttcF91aW50MTYsIDE2LCAvLCAyaSwKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoZml4ZWQyLCBzaGwsIGttcF9pbnQxNiwgMTYsIDw8LCAyaSwKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3NobF9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFVihmaXhlZDIsIHNociwga21wX2ludDE2LCAxNiwgPj4sIDJpLAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc2hyX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKGZpeGVkMnUsIHNociwga21wX3VpbnQxNiwgMTYsID4+LCAyaSwKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHJfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoZml4ZWQyLCBzdWIsIGttcF9pbnQxNiwgMTYsIC0sIDJpLAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc3ViX3JldgorCitBVE9NSUNfQ01QWENIR19SRVYoZml4ZWQ0LCBkaXYsIGttcF9pbnQzMiwgMzIsIC8sIDRpLAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDRfZGl2X3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKGZpeGVkNHUsIGRpdiwga21wX3VpbnQzMiwgMzIsIC8sIDRpLAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFVihmaXhlZDQsIHNobCwga21wX2ludDMyLCAzMiwgPDwsIDRpLAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc2hsX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKGZpeGVkNCwgc2hyLCBrbXBfaW50MzIsIDMyLCA+PiwgNGksCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoZml4ZWQ0dSwgc2hyLCBrbXBfdWludDMyLCAzMiwgPj4sIDRpLAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X3Nocl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFVihmaXhlZDQsIHN1Yiwga21wX2ludDMyLCAzMiwgLSwgNGksCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfcmV2CisKK0FUT01JQ19DTVBYQ0hHX1JFVihmaXhlZDgsIGRpdiwga21wX2ludDY0LCA2NCwgLywgOGksCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoZml4ZWQ4dSwgZGl2LCBrbXBfdWludDY0LCA2NCwgLywgOGksCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKGZpeGVkOCwgc2hsLCBrbXBfaW50NjQsIDY0LCA8PCwgOGksCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaGxfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoZml4ZWQ4LCBzaHIsIGttcF9pbnQ2NCwgNjQsID4+LCA4aSwKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3Nocl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFVihmaXhlZDh1LCBzaHIsIGttcF91aW50NjQsIDY0LCA+PiwgOGksCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKGZpeGVkOCwgc3ViLCBrbXBfaW50NjQsIDY0LCAtLCA4aSwKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9yZXYKKworQVRPTUlDX0NNUFhDSEdfUkVWKGZsb2F0NCwgZGl2LCBrbXBfcmVhbDMyLCAzMiwgLywgNHIsCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoZmxvYXQ0LCBzdWIsIGttcF9yZWFsMzIsIDMyLCAtLCA0ciwKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9yZXYKKworQVRPTUlDX0NNUFhDSEdfUkVWKGZsb2F0OCwgZGl2LCBrbXBfcmVhbDY0LCA2NCwgLywgOHIsCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoZmxvYXQ4LCBzdWIsIGttcF9yZWFsNjQsIDY0LCAtLCA4ciwKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9yZXYKKy8vICAgICAgICAgICAgICAgICAgVFlQRV9JRCxPUF9JRCwgVFlQRSwgICAgIEJJVFMsT1AsTENLX0lELCBHT01QX0ZMQUcKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3V0aW5lcyBmb3IgRXh0ZW5kZWQgdHlwZXM6IGxvbmcgZG91YmxlLCBfUXVhZCwgY29tcGxleCBmbGF2b3VycyAodXNlCisvLyBjcml0aWNhbCBzZWN0aW9uKQorLy8gICAgIFRZUEVfSUQsIE9QX0lELCBUWVBFIC0gZGV0YWlsZWQgYWJvdmUKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IKKy8vICAgICBMQ0tfSUQgIC0gbG9jayBpZGVudGlmaWVyLCB1c2VkIHRvIHBvc3NpYmx5IGRpc3Rpbmd1aXNoIGxvY2sgdmFyaWFibGUKKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMX1JFVihUWVBFX0lELCBPUF9JRCwgVFlQRSwgT1AsIExDS19JRCwgR09NUF9GTEFHKSAgICAgICBcCisgIEFUT01JQ19CRUdJTl9SRVYoVFlQRV9JRCwgT1BfSUQsIFRZUEUsIHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBPUF9HT01QX0NSSVRJQ0FMX1JFVihPUCwgR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT1BfQ1JJVElDQUxfUkVWKE9QLCBMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLy8gcm91dGluZXMgZm9yIGxvbmcgZG91YmxlIHR5cGUKK0FUT01JQ19DUklUSUNBTF9SRVYoZmxvYXQxMCwgc3ViLCBsb25nIGRvdWJsZSwgLSwgMTByLAorICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX3JldgorQVRPTUlDX0NSSVRJQ0FMX1JFVihmbG9hdDEwLCBkaXYsIGxvbmcgZG91YmxlLCAvLCAxMHIsCisgICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfcmV2CisjaWYgS01QX0hBVkVfUVVBRAorLy8gcm91dGluZXMgZm9yIF9RdWFkIHR5cGUKK0FUT01JQ19DUklUSUNBTF9SRVYoZmxvYXQxNiwgc3ViLCBRVUFEX0xFR0FDWSwgLSwgMTZyLAorICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX3JldgorQVRPTUlDX0NSSVRJQ0FMX1JFVihmbG9hdDE2LCBkaXYsIFFVQURfTEVHQUNZLCAvLCAxNnIsCisgICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfcmV2CisjaWYgKEtNUF9BUkNIX1g4NikKK0FUT01JQ19DUklUSUNBTF9SRVYoZmxvYXQxNiwgc3ViX2ExNiwgUXVhZF9hMTZfdCwgLSwgMTZyLAorICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2ExNl9yZXYKK0FUT01JQ19DUklUSUNBTF9SRVYoZmxvYXQxNiwgZGl2X2ExNiwgUXVhZF9hMTZfdCwgLywgMTZyLAorICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2ExNl9yZXYKKyNlbmRpZgorI2VuZGlmCisKKy8vIHJvdXRpbmVzIGZvciBjb21wbGV4IHR5cGVzCitBVE9NSUNfQ1JJVElDQUxfUkVWKGNtcGx4NCwgc3ViLCBrbXBfY21wbHgzMiwgLSwgOGMsCisgICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9yZXYKK0FUT01JQ19DUklUSUNBTF9SRVYoY21wbHg0LCBkaXYsIGttcF9jbXBseDMyLCAvLCA4YywKKyAgICAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDRfZGl2X3JldgorQVRPTUlDX0NSSVRJQ0FMX1JFVihjbXBseDgsIHN1Yiwga21wX2NtcGx4NjQsIC0sIDE2YywKKyAgICAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDhfc3ViX3JldgorQVRPTUlDX0NSSVRJQ0FMX1JFVihjbXBseDgsIGRpdiwga21wX2NtcGx4NjQsIC8sIDE2YywKKyAgICAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDhfZGl2X3JldgorQVRPTUlDX0NSSVRJQ0FMX1JFVihjbXBseDEwLCBzdWIsIGttcF9jbXBseDgwLCAtLCAyMGMsCisgICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWJfcmV2CitBVE9NSUNfQ1JJVElDQUxfUkVWKGNtcGx4MTAsIGRpdiwga21wX2NtcGx4ODAsIC8sIDIwYywKKyAgICAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX2Rpdl9yZXYKKyNpZiBLTVBfSEFWRV9RVUFECitBVE9NSUNfQ1JJVElDQUxfUkVWKGNtcGx4MTYsIHN1YiwgQ1BMWDEyOF9MRUcsIC0sIDMyYywKKyAgICAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9yZXYKK0FUT01JQ19DUklUSUNBTF9SRVYoY21wbHgxNiwgZGl2LCBDUExYMTI4X0xFRywgLywgMzJjLAorICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X3JldgorI2lmIChLTVBfQVJDSF9YODYpCitBVE9NSUNfQ1JJVElDQUxfUkVWKGNtcGx4MTYsIHN1Yl9hMTYsIGttcF9jbXBseDEyOF9hMTZfdCwgLSwgMzJjLAorICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNl9yZXYKK0FUT01JQ19DUklUSUNBTF9SRVYoY21wbHgxNiwgZGl2X2ExNiwga21wX2NtcGx4MTI4X2ExNl90LCAvLCAzMmMsCisgICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfYTE2X3JldgorI2VuZGlmCisjZW5kaWYKKworI2VuZGlmIC8vIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKy8vIEVuZCBvZiBPcGVuTVAgNC4wOiB4ID0gZXhwciBiaW5vcCB4IGZvciBub24tY29tbXV0YXRpdmUgb3BlcmF0aW9ucy4KKworI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVECisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogUm91dGluZXMgZm9yIG1peGVkIHR5cGVzIG9mIExIUyBhbmQgUkhTLCB3aGVuIFJIUyBpcyAibGFyZ2VyIiAgICAgICAgICAgICovCisvKiBOb3RlOiBpbiBvcmRlciB0byByZWR1Y2UgdGhlIHRvdGFsIG51bWJlciBvZiB0eXBlcyBjb21iaW5hdGlvbnMgICAgICAgICAgKi8KKy8qICAgICAgIGl0IGlzIHN1cHBvc2VkIHRoYXQgY29tcGlsZXIgY29udmVydHMgUkhTIHRvIGxvbmdlc3QgZmxvYXRpbmcgdHlwZSwqLworLyogICAgICAgdGhhdCBpcyBfUXVhZCwgYmVmb3JlIGNhbGwgdG8gYW55IG9mIHRoZXNlIHJvdXRpbmVzICAgICAgICAgICAgICAgICovCisvKiBDb252ZXJzaW9uIHRvIF9RdWFkIHdpbGwgYmUgZG9uZSBieSB0aGUgY29tcGlsZXIgZHVyaW5nIGNhbGN1bGF0aW9uLCAgICAgKi8KKy8qICAgIGNvbnZlcnNpb24gYmFjayB0byBUWVBFIC0gYmVmb3JlIHRoZSBhc3NpZ25tZW50LCBsaWtlOiAgICAgICAgICAgICAgICAqLworLyogICAgKmxocyA9IChUWVBFKSggKF9RdWFkKSgqbGhzKSBPUCByaHMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQZXJmb3JtYW5jZSBwZW5hbHR5IGV4cGVjdGVkIGJlY2F1c2Ugb2YgU1cgZW11bGF0aW9uIHVzZSAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEFUT01JQ19CRUdJTl9NSVgoVFlQRV9JRCwgVFlQRSwgT1BfSUQsIFJUWVBFX0lELCBSVFlQRSkgICAgICAgICAgICAgICAgXAorICB2b2lkIF9fa21wY19hdG9taWNfIyNUWVBFX0lEIyNfIyNPUF9JRCMjXyMjUlRZUEVfSUQoICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKmxocywgUlRZUEUgcmhzKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9pbml0X3NlcmlhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtBX1RSQUNFKDEwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAoIl9fa21wY19hdG9taWNfIiAjVFlQRV9JRCAiXyIgI09QX0lEICJfIiAjUlRZUEVfSUQgIjogVCMlZFxuIiwgICBcCisgICAgICAgICAgICAgIGd0aWQpKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfRlAoVFlQRV9JRCwgVFlQRSwgT1BfSUQsIE9QLCBSVFlQRV9JRCwgUlRZUEUsIExDS19JRCwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFUT01JQ19CRUdJTl9NSVgoVFlQRV9JRCwgVFlQRSwgT1BfSUQsIFJUWVBFX0lELCBSVFlQRSkgICAgICAgICAgICAgICAgICAgICAgXAorICBPUF9HT01QX0NSSVRJQ0FMKE9QIyMgPSwgR09NUF9GTEFHKSAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgT1BfQ1JJVElDQUwoT1AjIyA9LCBMQ0tfSUQpIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFg4NiBvciBYODZfNjQ6IG5vIGFsaWdubWVudCBwcm9ibGVtcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfTUlYKFRZUEVfSUQsIFRZUEUsIE9QX0lELCBCSVRTLCBPUCwgUlRZUEVfSUQsIFJUWVBFLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMQ0tfSUQsIE1BU0ssIEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBVE9NSUNfQkVHSU5fTUlYKFRZUEVfSUQsIFRZUEUsIE9QX0lELCBSVFlQRV9JRCwgUlRZUEUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT1BfR09NUF9DUklUSUNBTChPUCMjID0sIEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE9QX0NNUFhDSEcoVFlQRSwgQklUUywgT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZWxzZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2RlIGZvciBvdGhlciBhcmNoaXRlY3R1cmVzIHRoYXQgZG9uJ3QgaGFuZGxlIHVuYWxpZ25lZCBhY2Nlc3Nlcy4KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfTUlYKFRZUEVfSUQsIFRZUEUsIE9QX0lELCBCSVRTLCBPUCwgUlRZUEVfSUQsIFJUWVBFLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMQ0tfSUQsIE1BU0ssIEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBVE9NSUNfQkVHSU5fTUlYKFRZUEVfSUQsIFRZUEUsIE9QX0lELCBSVFlQRV9JRCwgUlRZUEUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT1BfR09NUF9DUklUSUNBTChPUCMjID0sIEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICghKChrbXBfdWludHB0cl90KWxocyAmIDB4IyNNQVNLKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEcoVFlQRSwgQklUUywgT1ApIC8qIGFsaWduZWQgYWRkcmVzcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMKE9QIyMgPSwgTENLX0lEKSAvKiB1bmFsaWduZWQgYWRkcmVzcyAtIHVzZSBjcml0aWNhbCAqLyAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX1JFVl9NSVgoVFlQRV9JRCwgVFlQRSwgT1BfSUQsIEJJVFMsIE9QLCBSVFlQRV9JRCwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUWVBFLCBMQ0tfSUQsIE1BU0ssIEdPTVBfRkxBRykgICAgICAgICAgICAgICAgIFwKKyAgQVRPTUlDX0JFR0lOX01JWChUWVBFX0lELCBUWVBFLCBPUF9JRCwgUlRZUEVfSUQsIFJUWVBFKSAgICAgICAgICAgICAgICAgICAgICBcCisgIE9QX0dPTVBfQ1JJVElDQUxfUkVWKE9QLCBHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBPUF9DTVBYQ0hHX1JFVihUWVBFLCBCSVRTLCBPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfUkVWX0ZQKFRZUEVfSUQsIFRZUEUsIE9QX0lELCBPUCwgUlRZUEVfSUQsIFJUWVBFLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQ0tfSUQsIEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFUT01JQ19CRUdJTl9NSVgoVFlQRV9JRCwgVFlQRSwgT1BfSUQsIFJUWVBFX0lELCBSVFlQRSkgICAgICAgICAgICAgICAgICAgICAgXAorICBPUF9HT01QX0NSSVRJQ0FMX1JFVihPUCwgR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT1BfQ1JJVElDQUxfUkVWKE9QLCBMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKy8vIFJIUz1mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWChmaXhlZDEsIGNoYXIsIG11bCwgOCwgKiwgZmxvYXQ4LCBrbXBfcmVhbDY0LCAxaSwgMCwKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWChmaXhlZDEsIGNoYXIsIGRpdiwgOCwgLywgZmxvYXQ4LCBrbXBfcmVhbDY0LCAxaSwgMCwKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWChmaXhlZDIsIHNob3J0LCBtdWwsIDE2LCAqLCBmbG9hdDgsIGttcF9yZWFsNjQsIDJpLCAxLAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2Zsb2F0OAorQVRPTUlDX0NNUFhDSEdfTUlYKGZpeGVkMiwgc2hvcnQsIGRpdiwgMTYsIC8sIGZsb2F0OCwga21wX3JlYWw2NCwgMmksIDEsCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfZmxvYXQ4CitBVE9NSUNfQ01QWENIR19NSVgoZml4ZWQ0LCBrbXBfaW50MzIsIG11bCwgMzIsICosIGZsb2F0OCwga21wX3JlYWw2NCwgNGksIDMsCisgICAgICAgICAgICAgICAgICAgMCkgLy8gX19rbXBjX2F0b21pY19maXhlZDRfbXVsX2Zsb2F0OAorQVRPTUlDX0NNUFhDSEdfTUlYKGZpeGVkNCwga21wX2ludDMyLCBkaXYsIDMyLCAvLCBmbG9hdDgsIGttcF9yZWFsNjQsIDRpLCAzLAorICAgICAgICAgICAgICAgICAgIDApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWChmaXhlZDgsIGttcF9pbnQ2NCwgbXVsLCA2NCwgKiwgZmxvYXQ4LCBrbXBfcmVhbDY0LCA4aSwgNywKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWChmaXhlZDgsIGttcF9pbnQ2NCwgZGl2LCA2NCwgLywgZmxvYXQ4LCBrbXBfcmVhbDY0LCA4aSwgNywKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWChmbG9hdDQsIGttcF9yZWFsMzIsIGFkZCwgMzIsICssIGZsb2F0OCwga21wX3JlYWw2NCwgNHIsIDMsCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfZmxvYXQ4CitBVE9NSUNfQ01QWENIR19NSVgoZmxvYXQ0LCBrbXBfcmVhbDMyLCBzdWIsIDMyLCAtLCBmbG9hdDgsIGttcF9yZWFsNjQsIDRyLCAzLAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2Zsb2F0OAorQVRPTUlDX0NNUFhDSEdfTUlYKGZsb2F0NCwga21wX3JlYWwzMiwgbXVsLCAzMiwgKiwgZmxvYXQ4LCBrbXBfcmVhbDY0LCA0ciwgMywKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWChmbG9hdDQsIGttcF9yZWFsMzIsIGRpdiwgMzIsIC8sIGZsb2F0OCwga21wX3JlYWw2NCwgNHIsIDMsCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfZmxvYXQ4CisKKy8vIFJIUz1mbG9hdDE2IChkZXByZWNhdGVkLCB0byBiZSByZW1vdmVkIHdoZW4gd2UgYXJlIHN1cmUgdGhlIGNvbXBpbGVyIGRvZXMgbm90CisvLyB1c2UgdGhlbSkKKyNpZiBLTVBfSEFWRV9RVUFECitBVE9NSUNfQ01QWENIR19NSVgoZml4ZWQxLCBjaGFyLCBhZGQsIDgsICssIGZwLCBfUXVhZCwgMWksIDAsCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hZGRfZnAKK0FUT01JQ19DTVBYQ0hHX01JWChmaXhlZDF1LCB1Y2hhciwgYWRkLCA4LCArLCBmcCwgX1F1YWQsIDFpLCAwLAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDF1X2FkZF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKGZpeGVkMSwgY2hhciwgc3ViLCA4LCAtLCBmcCwgX1F1YWQsIDFpLCAwLAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoZml4ZWQxdSwgdWNoYXIsIHN1YiwgOCwgLSwgZnAsIF9RdWFkLCAxaSwgMCwKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9zdWJfZnAKK0FUT01JQ19DTVBYQ0hHX01JWChmaXhlZDEsIGNoYXIsIG11bCwgOCwgKiwgZnAsIF9RdWFkLCAxaSwgMCwKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKGZpeGVkMXUsIHVjaGFyLCBtdWwsIDgsICosIGZwLCBfUXVhZCwgMWksIDAsCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfbXVsX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoZml4ZWQxLCBjaGFyLCBkaXYsIDgsIC8sIGZwLCBfUXVhZCwgMWksIDAsCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfZnAKK0FUT01JQ19DTVBYQ0hHX01JWChmaXhlZDF1LCB1Y2hhciwgZGl2LCA4LCAvLCBmcCwgX1F1YWQsIDFpLCAwLAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9mcAorCitBVE9NSUNfQ01QWENIR19NSVgoZml4ZWQyLCBzaG9ydCwgYWRkLCAxNiwgKywgZnAsIF9RdWFkLCAyaSwgMSwKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2FkZF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKGZpeGVkMnUsIHVzaG9ydCwgYWRkLCAxNiwgKywgZnAsIF9RdWFkLCAyaSwgMSwKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQydV9hZGRfZnAKK0FUT01JQ19DTVBYQ0hHX01JWChmaXhlZDIsIHNob3J0LCBzdWIsIDE2LCAtLCBmcCwgX1F1YWQsIDJpLCAxLAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoZml4ZWQydSwgdXNob3J0LCBzdWIsIDE2LCAtLCBmcCwgX1F1YWQsIDJpLCAxLAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X3N1Yl9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKGZpeGVkMiwgc2hvcnQsIG11bCwgMTYsICosIGZwLCBfUXVhZCwgMmksIDEsCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfZnAKK0FUT01JQ19DTVBYQ0hHX01JWChmaXhlZDJ1LCB1c2hvcnQsIG11bCwgMTYsICosIGZwLCBfUXVhZCwgMmksIDEsCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfbXVsX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoZml4ZWQyLCBzaG9ydCwgZGl2LCAxNiwgLywgZnAsIF9RdWFkLCAyaSwgMSwKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKGZpeGVkMnUsIHVzaG9ydCwgZGl2LCAxNiwgLywgZnAsIF9RdWFkLCAyaSwgMSwKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfZnAKKworQVRPTUlDX0NNUFhDSEdfTUlYKGZpeGVkNCwga21wX2ludDMyLCBhZGQsIDMyLCArLCBmcCwgX1F1YWQsIDRpLCAzLAorICAgICAgICAgICAgICAgICAgIDApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKGZpeGVkNHUsIGttcF91aW50MzIsIGFkZCwgMzIsICssIGZwLCBfUXVhZCwgNGksIDMsCisgICAgICAgICAgICAgICAgICAgMCkgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X2FkZF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKGZpeGVkNCwga21wX2ludDMyLCBzdWIsIDMyLCAtLCBmcCwgX1F1YWQsIDRpLCAzLAorICAgICAgICAgICAgICAgICAgIDApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKGZpeGVkNHUsIGttcF91aW50MzIsIHN1YiwgMzIsIC0sIGZwLCBfUXVhZCwgNGksIDMsCisgICAgICAgICAgICAgICAgICAgMCkgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X3N1Yl9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKGZpeGVkNCwga21wX2ludDMyLCBtdWwsIDMyLCAqLCBmcCwgX1F1YWQsIDRpLCAzLAorICAgICAgICAgICAgICAgICAgIDApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKGZpeGVkNHUsIGttcF91aW50MzIsIG11bCwgMzIsICosIGZwLCBfUXVhZCwgNGksIDMsCisgICAgICAgICAgICAgICAgICAgMCkgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X211bF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKGZpeGVkNCwga21wX2ludDMyLCBkaXYsIDMyLCAvLCBmcCwgX1F1YWQsIDRpLCAzLAorICAgICAgICAgICAgICAgICAgIDApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKGZpeGVkNHUsIGttcF91aW50MzIsIGRpdiwgMzIsIC8sIGZwLCBfUXVhZCwgNGksIDMsCisgICAgICAgICAgICAgICAgICAgMCkgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9mcAorCitBVE9NSUNfQ01QWENIR19NSVgoZml4ZWQ4LCBrbXBfaW50NjQsIGFkZCwgNjQsICssIGZwLCBfUXVhZCwgOGksIDcsCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGRfZnAKK0FUT01JQ19DTVBYQ0hHX01JWChmaXhlZDh1LCBrbXBfdWludDY0LCBhZGQsIDY0LCArLCBmcCwgX1F1YWQsIDhpLCA3LAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDh1X2FkZF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKGZpeGVkOCwga21wX2ludDY0LCBzdWIsIDY0LCAtLCBmcCwgX1F1YWQsIDhpLCA3LAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoZml4ZWQ4dSwga21wX3VpbnQ2NCwgc3ViLCA2NCwgLSwgZnAsIF9RdWFkLCA4aSwgNywKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zdWJfZnAKK0FUT01JQ19DTVBYQ0hHX01JWChmaXhlZDgsIGttcF9pbnQ2NCwgbXVsLCA2NCwgKiwgZnAsIF9RdWFkLCA4aSwgNywKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKGZpeGVkOHUsIGttcF91aW50NjQsIG11bCwgNjQsICosIGZwLCBfUXVhZCwgOGksIDcsCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfbXVsX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoZml4ZWQ4LCBrbXBfaW50NjQsIGRpdiwgNjQsIC8sIGZwLCBfUXVhZCwgOGksIDcsCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfZnAKK0FUT01JQ19DTVBYQ0hHX01JWChmaXhlZDh1LCBrbXBfdWludDY0LCBkaXYsIDY0LCAvLCBmcCwgX1F1YWQsIDhpLCA3LAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9mcAorCitBVE9NSUNfQ01QWENIR19NSVgoZmxvYXQ0LCBrbXBfcmVhbDMyLCBhZGQsIDMyLCArLCBmcCwgX1F1YWQsIDRyLCAzLAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoZmxvYXQ0LCBrbXBfcmVhbDMyLCBzdWIsIDMyLCAtLCBmcCwgX1F1YWQsIDRyLCAzLAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoZmxvYXQ0LCBrbXBfcmVhbDMyLCBtdWwsIDMyLCAqLCBmcCwgX1F1YWQsIDRyLCAzLAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfbXVsX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoZmxvYXQ0LCBrbXBfcmVhbDMyLCBkaXYsIDMyLCAvLCBmcCwgX1F1YWQsIDRyLCAzLAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2ZwCisKK0FUT01JQ19DTVBYQ0hHX01JWChmbG9hdDgsIGttcF9yZWFsNjQsIGFkZCwgNjQsICssIGZwLCBfUXVhZCwgOHIsIDcsCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfZnAKK0FUT01JQ19DTVBYQ0hHX01JWChmbG9hdDgsIGttcF9yZWFsNjQsIHN1YiwgNjQsIC0sIGZwLCBfUXVhZCwgOHIsIDcsCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfZnAKK0FUT01JQ19DTVBYQ0hHX01JWChmbG9hdDgsIGttcF9yZWFsNjQsIG11bCwgNjQsICosIGZwLCBfUXVhZCwgOHIsIDcsCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWxfZnAKK0FUT01JQ19DTVBYQ0hHX01JWChmbG9hdDgsIGttcF9yZWFsNjQsIGRpdiwgNjQsIC8sIGZwLCBfUXVhZCwgOHIsIDcsCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfZnAKKworQVRPTUlDX0NSSVRJQ0FMX0ZQKGZsb2F0MTAsIGxvbmcgZG91YmxlLCBhZGQsICssIGZwLCBfUXVhZCwgMTByLAorICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9hZGRfZnAKK0FUT01JQ19DUklUSUNBTF9GUChmbG9hdDEwLCBsb25nIGRvdWJsZSwgc3ViLCAtLCBmcCwgX1F1YWQsIDEwciwKKyAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2ZwCitBVE9NSUNfQ1JJVElDQUxfRlAoZmxvYXQxMCwgbG9uZyBkb3VibGUsIG11bCwgKiwgZnAsIF9RdWFkLCAxMHIsCisgICAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX211bF9mcAorQVRPTUlDX0NSSVRJQ0FMX0ZQKGZsb2F0MTAsIGxvbmcgZG91YmxlLCBkaXYsIC8sIGZwLCBfUXVhZCwgMTByLAorICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfZnAKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKy8vIFJldmVyc2Ugb3BlcmF0aW9ucworQVRPTUlDX0NNUFhDSEdfUkVWX01JWChmaXhlZDEsIGNoYXIsIHN1Yl9yZXYsIDgsIC0sIGZwLCBfUXVhZCwgMWksIDAsCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc3ViX3Jldl9mcAorQVRPTUlDX0NNUFhDSEdfUkVWX01JWChmaXhlZDF1LCB1Y2hhciwgc3ViX3JldiwgOCwgLSwgZnAsIF9RdWFkLCAxaSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc3ViX3Jldl9mcAorQVRPTUlDX0NNUFhDSEdfUkVWX01JWChmaXhlZDEsIGNoYXIsIGRpdl9yZXYsIDgsIC8sIGZwLCBfUXVhZCwgMWksIDAsCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDFfZGl2X3Jldl9mcAorQVRPTUlDX0NNUFhDSEdfUkVWX01JWChmaXhlZDF1LCB1Y2hhciwgZGl2X3JldiwgOCwgLywgZnAsIF9RdWFkLCAxaSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X3Jldl9mcAorCitBVE9NSUNfQ01QWENIR19SRVZfTUlYKGZpeGVkMiwgc2hvcnQsIHN1Yl9yZXYsIDE2LCAtLCBmcCwgX1F1YWQsIDJpLCAxLAorICAgICAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9yZXZfZnAKK0FUT01JQ19DTVBYQ0hHX1JFVl9NSVgoZml4ZWQydSwgdXNob3J0LCBzdWJfcmV2LCAxNiwgLSwgZnAsIF9RdWFkLCAyaSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc3ViX3Jldl9mcAorQVRPTUlDX0NNUFhDSEdfUkVWX01JWChmaXhlZDIsIHNob3J0LCBkaXZfcmV2LCAxNiwgLywgZnAsIF9RdWFkLCAyaSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfcmV2X2ZwCitBVE9NSUNfQ01QWENIR19SRVZfTUlYKGZpeGVkMnUsIHVzaG9ydCwgZGl2X3JldiwgMTYsIC8sIGZwLCBfUXVhZCwgMmksIDEsCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9yZXZfZnAKKworQVRPTUlDX0NNUFhDSEdfUkVWX01JWChmaXhlZDQsIGttcF9pbnQzMiwgc3ViX3JldiwgMzIsIC0sIGZwLCBfUXVhZCwgNGksIDMsCisgICAgICAgICAgICAgICAgICAgICAgIDApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9yZXZfZnAKK0FUT01JQ19DTVBYQ0hHX1JFVl9NSVgoZml4ZWQ0dSwga21wX3VpbnQzMiwgc3ViX3JldiwgMzIsIC0sIGZwLCBfUXVhZCwgNGksIDMsCisgICAgICAgICAgICAgICAgICAgICAgIDApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zdWJfcmV2X2ZwCitBVE9NSUNfQ01QWENIR19SRVZfTUlYKGZpeGVkNCwga21wX2ludDMyLCBkaXZfcmV2LCAzMiwgLywgZnAsIF9RdWFkLCA0aSwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgMCkgLy8gX19rbXBjX2F0b21pY19maXhlZDRfZGl2X3Jldl9mcAorQVRPTUlDX0NNUFhDSEdfUkVWX01JWChmaXhlZDR1LCBrbXBfdWludDMyLCBkaXZfcmV2LCAzMiwgLywgZnAsIF9RdWFkLCA0aSwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgMCkgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9yZXZfZnAKKworQVRPTUlDX0NNUFhDSEdfUkVWX01JWChmaXhlZDgsIGttcF9pbnQ2NCwgc3ViX3JldiwgNjQsIC0sIGZwLCBfUXVhZCwgOGksIDcsCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc3ViX3Jldl9mcAorQVRPTUlDX0NNUFhDSEdfUkVWX01JWChmaXhlZDh1LCBrbXBfdWludDY0LCBzdWJfcmV2LCA2NCwgLSwgZnAsIF9RdWFkLCA4aSwgNywKKyAgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc3ViX3Jldl9mcAorQVRPTUlDX0NNUFhDSEdfUkVWX01JWChmaXhlZDgsIGttcF9pbnQ2NCwgZGl2X3JldiwgNjQsIC8sIGZwLCBfUXVhZCwgOGksIDcsCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDhfZGl2X3Jldl9mcAorQVRPTUlDX0NNUFhDSEdfUkVWX01JWChmaXhlZDh1LCBrbXBfdWludDY0LCBkaXZfcmV2LCA2NCwgLywgZnAsIF9RdWFkLCA4aSwgNywKKyAgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X3Jldl9mcAorCitBVE9NSUNfQ01QWENIR19SRVZfTUlYKGZsb2F0NCwga21wX3JlYWwzMiwgc3ViX3JldiwgMzIsIC0sIGZwLCBfUXVhZCwgNHIsIDMsCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX3Jldl9mcAorQVRPTUlDX0NNUFhDSEdfUkVWX01JWChmbG9hdDQsIGttcF9yZWFsMzIsIGRpdl9yZXYsIDMyLCAvLCBmcCwgX1F1YWQsIDRyLCAzLAorICAgICAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9yZXZfZnAKKworQVRPTUlDX0NNUFhDSEdfUkVWX01JWChmbG9hdDgsIGttcF9yZWFsNjQsIHN1Yl9yZXYsIDY0LCAtLCBmcCwgX1F1YWQsIDhyLCA3LAorICAgICAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9yZXZfZnAKK0FUT01JQ19DTVBYQ0hHX1JFVl9NSVgoZmxvYXQ4LCBrbXBfcmVhbDY0LCBkaXZfcmV2LCA2NCwgLywgZnAsIF9RdWFkLCA4ciwgNywKKyAgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfcmV2X2ZwCisKK0FUT01JQ19DUklUSUNBTF9SRVZfRlAoZmxvYXQxMCwgbG9uZyBkb3VibGUsIHN1Yl9yZXYsIC0sIGZwLCBfUXVhZCwgMTByLAorICAgICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX3Jldl9mcAorQVRPTUlDX0NSSVRJQ0FMX1JFVl9GUChmbG9hdDEwLCBsb25nIGRvdWJsZSwgZGl2X3JldiwgLywgZnAsIF9RdWFkLCAxMHIsCisgICAgICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfcmV2X2ZwCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisjZW5kaWYKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gWDg2IG9yIFg4Nl82NDogbm8gYWxpZ25tZW50IHByb2JsZW1zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2lmIFVTRV9DTVBYQ0hHX0ZJWAorLy8gd29ya2Fyb3VuZCBmb3IgQzc4Mjg3IChjb21wbGV4KGtpbmQ9NCkgZGF0YSB0eXBlKQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19DTVBMWChUWVBFX0lELCBUWVBFLCBPUF9JRCwgQklUUywgT1AsIFJUWVBFX0lELCBSVFlQRSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTENLX0lELCBNQVNLLCBHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFUT01JQ19CRUdJTl9NSVgoVFlQRV9JRCwgVFlQRSwgT1BfSUQsIFJUWVBFX0lELCBSVFlQRSkgICAgICAgICAgICAgICAgICAgICAgXAorICBPUF9HT01QX0NSSVRJQ0FMKE9QIyMgPSwgR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT1BfQ01QWENIR19XT1JLQVJPVU5EKFRZUEUsIEJJVFMsIE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKy8vIGVuZCBvZiB0aGUgc2Vjb25kIHBhcnQgb2YgdGhlIHdvcmthcm91bmQgZm9yIEM3ODI4NworI2Vsc2UKKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfQ01QTFgoVFlQRV9JRCwgVFlQRSwgT1BfSUQsIEJJVFMsIE9QLCBSVFlQRV9JRCwgUlRZUEUsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExDS19JRCwgTUFTSywgR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBVE9NSUNfQkVHSU5fTUlYKFRZUEVfSUQsIFRZUEUsIE9QX0lELCBSVFlQRV9JRCwgUlRZUEUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT1BfR09NUF9DUklUSUNBTChPUCMjID0sIEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE9QX0NNUFhDSEcoVFlQRSwgQklUUywgT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZW5kaWYgLy8gVVNFX0NNUFhDSEdfRklYCisjZWxzZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2RlIGZvciBvdGhlciBhcmNoaXRlY3R1cmVzIHRoYXQgZG9uJ3QgaGFuZGxlIHVuYWxpZ25lZCBhY2Nlc3Nlcy4KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfQ01QTFgoVFlQRV9JRCwgVFlQRSwgT1BfSUQsIEJJVFMsIE9QLCBSVFlQRV9JRCwgUlRZUEUsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExDS19JRCwgTUFTSywgR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBVE9NSUNfQkVHSU5fTUlYKFRZUEVfSUQsIFRZUEUsIE9QX0lELCBSVFlQRV9JRCwgUlRZUEUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT1BfR09NUF9DUklUSUNBTChPUCMjID0sIEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICghKChrbXBfdWludHB0cl90KWxocyAmIDB4IyNNQVNLKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEcoVFlQRSwgQklUUywgT1ApIC8qIGFsaWduZWQgYWRkcmVzcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMKE9QIyMgPSwgTENLX0lEKSAvKiB1bmFsaWduZWQgYWRkcmVzcyAtIHVzZSBjcml0aWNhbCAqLyAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKK0FUT01JQ19DTVBYQ0hHX0NNUExYKGNtcGx4NCwga21wX2NtcGx4MzIsIGFkZCwgNjQsICssIGNtcGx4OCwga21wX2NtcGx4NjQsIDhjLAorICAgICAgICAgICAgICAgICAgICAgNywgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGRfY21wbHg4CitBVE9NSUNfQ01QWENIR19DTVBMWChjbXBseDQsIGttcF9jbXBseDMyLCBzdWIsIDY0LCAtLCBjbXBseDgsIGttcF9jbXBseDY0LCA4YywKKyAgICAgICAgICAgICAgICAgICAgIDcsIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NtcGx4OAorQVRPTUlDX0NNUFhDSEdfQ01QTFgoY21wbHg0LCBrbXBfY21wbHgzMiwgbXVsLCA2NCwgKiwgY21wbHg4LCBrbXBfY21wbHg2NCwgOGMsCisgICAgICAgICAgICAgICAgICAgICA3LCBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfY21wbHg0X211bF9jbXBseDgKK0FUT01JQ19DTVBYQ0hHX0NNUExYKGNtcGx4NCwga21wX2NtcGx4MzIsIGRpdiwgNjQsIC8sIGNtcGx4OCwga21wX2NtcGx4NjQsIDhjLAorICAgICAgICAgICAgICAgICAgICAgNywgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY21wbHg4CisKKy8vIFJFQUQsIFdSSVRFLCBDQVBUVVJFIGFyZSBzdXBwb3J0ZWQgb25seSBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0CisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEF0b21pYyBSRUFEIHJvdXRpbmVzCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQmVnaW5uaW5nIG9mIGEgZGVmaW5pdGlvbiAocHJvdmlkZXMgbmFtZSwgcGFyYW1ldGVycywgZ2VidWcgdHJhY2UpCisvLyAgICAgVFlQRV9JRCAtIG9wZXJhbmRzIHR5cGUgYW5kIHNpemUgKGZpeGVkKiwgZml4ZWQqdSBmb3Igc2lnbmVkLCB1bnNpZ25lZAorLy8gICAgIGZpeGVkKQorLy8gICAgIE9QX0lEICAgLSBvcGVyYXRpb24gaWRlbnRpZmllciAoYWRkLCBzdWIsIG11bCwgLi4uKQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorI2RlZmluZSBBVE9NSUNfQkVHSU5fUkVBRChUWVBFX0lELCBPUF9JRCwgVFlQRSwgUkVUX1RZUEUpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgUkVUX1RZUEUgX19rbXBjX2F0b21pY18jI1RZUEVfSUQjI18jI09QX0lEKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFICpsb2MpIHsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfaW5pdF9zZXJpYWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLQV9UUkFDRSgxMDAsICgiX19rbXBjX2F0b21pY18iICNUWVBFX0lEICJfIiAjT1BfSUQgIjogVCMlZFxuIiwgZ3RpZCkpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgdXNpbmcgImNvbXBhcmVfYW5kX3N0b3JlX3JldCIgcm91dGluZQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorLy8gICAgIEJJVFMgICAgLSBzaXplIGluIGJpdHMsIHVzZWQgdG8gZGlzdGluZ3Vpc2ggbG93IGxldmVsIGNhbGxzCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyBOb3RlOiB0ZW1wX3ZhbCBpbnRyb2R1Y2VkIGluIG9yZGVyIHRvIGZvcmNlIHRoZSBjb21waWxlciB0byByZWFkCisvLyAgICAgICAqbGhzIG9ubHkgb25jZSAody9vIGl0IHRoZSBjb21waWxlciByZWFkcyAqbGhzIHR3aWNlKQorLy8gVE9ETzogY2hlY2sgaWYgaXQgaXMgc3RpbGwgbmVjZXNzYXJ5CisvLyBSZXR1cm4gb2xkIHZhbHVlIHJlZ2FyZGxlc3Mgb2YgdGhlIHJlc3VsdCBvZiAiY29tcGFyZSAmIHN3YXAjIG9wZXJhdGlvbgorI2RlZmluZSBPUF9DTVBYQ0hHX1JFQUQoVFlQRSwgQklUUywgT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVuaW9uIGZfaV91bmlvbiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFRZUEUgZl92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBrbXBfaW50IyNCSVRTIGlfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1bmlvbiBmX2lfdW5pb24gb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcF92YWwgPSAqbG9jOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG9sZF92YWx1ZS5mX3ZhbCA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvbGRfdmFsdWUuaV92YWwgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUIyNCSVRTKCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChrbXBfaW50IyNCSVRTICopbG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICYgb2xkX3ZhbHVlLmlfdmFsLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmIG9sZF92YWx1ZS5pX3ZhbCk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlLmZfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIGJvdW5kIGJ5IGNyaXRpY2FsIHNlY3Rpb24KKy8vICAgICBPUCAgICAgLSBvcGVyYXRvciAoaXQncyBzdXBwb3NlZCB0byBjb250YWluIGFuIGFzc2lnbm1lbnQpCisvLyAgICAgTENLX0lEIC0gbG9jayBpZGVudGlmaWVyCisvLyBOb3RlOiBkb24ndCBjaGVjayBndGlkIGFzIGl0IHNob3VsZCBhbHdheXMgYmUgdmFsaWQKKy8vIDEsIDItYnl0ZSAtIGV4cGVjdCB2YWxpZCBwYXJhbWV0ZXIsIG90aGVyIC0gY2hlY2sgYmVmb3JlIHRoaXMgbWFjcm8KKyNkZWZpbmUgT1BfQ1JJVElDQUxfUkVBRChPUCwgTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soJkFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbmV3X3ZhbHVlID0gKCpsb2MpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCZBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX1JFQUQoT1AsIEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMX1JFQUQoT1AsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNlbHNlCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfUkVBRChPUCwgRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfRklYRURfUkVBRChUWVBFX0lELCBPUF9JRCwgVFlQRSwgQklUUywgT1AsIEdPTVBfRkxBRykgICAgICAgICAgIFwKKyAgQVRPTUlDX0JFR0lOX1JFQUQoVFlQRV9JRCwgT1BfSUQsIFRZUEUsIFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRZUEUgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBPUF9HT01QX0NSSVRJQ0FMX1JFQUQoT1AjIyA9LCBHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbmV3X3ZhbHVlID0gS01QX1RFU1RfVEhFTl9BREQjI0JJVFMobG9jLCBPUCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJldHVybiBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX1JFQUQoVFlQRV9JRCwgT1BfSUQsIFRZUEUsIEJJVFMsIE9QLCBHT01QX0ZMQUcpICAgICAgICAgXAorICBBVE9NSUNfQkVHSU5fUkVBRChUWVBFX0lELCBPUF9JRCwgVFlQRSwgVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVFlQRSBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE9QX0dPTVBfQ1JJVElDQUxfUkVBRChPUCMjID0sIEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBPUF9DTVBYQ0hHX1JFQUQoVFlQRSwgQklUUywgT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3V0aW5lcyBmb3IgRXh0ZW5kZWQgdHlwZXM6IGxvbmcgZG91YmxlLCBfUXVhZCwgY29tcGxleCBmbGF2b3VycyAodXNlCisvLyBjcml0aWNhbCBzZWN0aW9uKQorLy8gICAgIFRZUEVfSUQsIE9QX0lELCBUWVBFIC0gZGV0YWlsZWQgYWJvdmUKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IKKy8vICAgICBMQ0tfSUQgIC0gbG9jayBpZGVudGlmaWVyLCB1c2VkIHRvIHBvc3NpYmx5IGRpc3Rpbmd1aXNoIGxvY2sgdmFyaWFibGUKKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMX1JFQUQoVFlQRV9JRCwgT1BfSUQsIFRZUEUsIE9QLCBMQ0tfSUQsIEdPTVBfRkxBRykgICAgICBcCisgIEFUT01JQ19CRUdJTl9SRUFEKFRZUEVfSUQsIE9QX0lELCBUWVBFLCBUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUWVBFIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT1BfR09NUF9DUklUSUNBTF9SRUFEKE9QIyMgPSwgR09NUF9GTEFHKSAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICAgICBcCisgIE9QX0NSSVRJQ0FMX1JFQUQoT1AsIExDS19JRCkgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZpeCBmb3IgY21wbHg0IHJlYWQgKENRMjIwMzYxKSBvbiBXaW5kb3dzKiBPUy4gUmVndWxhciByb3V0aW5lIHdpdGggcmV0dXJuCisvLyB2YWx1ZSBkb2Vzbid0IHdvcmsuCisvLyBMZXQncyByZXR1cm4gdGhlIHJlYWQgdmFsdWUgdGhyb3VnaCB0aGUgYWRkaXRpb25hbCBwYXJhbWV0ZXIuCisjaWYgKEtNUF9PU19XSU5ET1dTKQorCisjZGVmaW5lIE9QX0NSSVRJQ0FMX1JFQURfV1JLKE9QLCBMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCZBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgqb3V0KSA9ICgqbG9jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jaygmQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCk7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9SRUFEX1dSSyhPUCwgRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICgoRkxBRykgJiYgKF9fa21wX2F0b21pY19tb2RlID09IDIpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DUklUSUNBTF9SRUFEX1dSSyhPUCwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNlbHNlCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfUkVBRF9XUksoT1AsIEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0JFR0lOX1JFQURfV1JLKFRZUEVfSUQsIE9QX0lELCBUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgX19rbXBjX2F0b21pY18jI1RZUEVfSUQjI18jI09QX0lEKFRZUEUgKm91dCwgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFICpsb2MpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2luaXRfc2VyaWFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS0FfVFJBQ0UoMTAwLCAoIl9fa21wY19hdG9taWNfIiAjVFlQRV9JRCAiXyIgI09QX0lEICI6IFQjJWRcbiIsIGd0aWQpKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9SRUFEX1dSSyhUWVBFX0lELCBPUF9JRCwgVFlQRSwgT1AsIExDS19JRCwgR09NUF9GTEFHKSAgXAorICBBVE9NSUNfQkVHSU5fUkVBRF9XUksoVFlQRV9JRCwgT1BfSUQsIFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT1BfR09NUF9DUklUSUNBTF9SRUFEX1dSSyhPUCMjID0sIEdPTVBfRkxBRykgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgICBcCisgIE9QX0NSSVRJQ0FMX1JFQURfV1JLKE9QLCBMQ0tfSUQpIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNlbmRpZiAvLyBLTVBfT1NfV0lORE9XUworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgICAgICAgICAgICAgVFlQRV9JRCxPUF9JRCwgVFlQRSwgICAgICBPUCwgR09NUF9GTEFHCitBVE9NSUNfRklYRURfUkVBRChmaXhlZDQsIHJkLCBrbXBfaW50MzIsIDMyLCArLCAwKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9yZAorQVRPTUlDX0ZJWEVEX1JFQUQoZml4ZWQ4LCByZCwga21wX2ludDY0LCA2NCwgKywKKyAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDhfcmQKK0FUT01JQ19DTVBYQ0hHX1JFQUQoZmxvYXQ0LCByZCwga21wX3JlYWwzMiwgMzIsICssCisgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfcmQKK0FUT01JQ19DTVBYQ0hHX1JFQUQoZmxvYXQ4LCByZCwga21wX3JlYWw2NCwgNjQsICssCisgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfcmQKKworLy8gISEhIFRPRE86IFJlbW92ZSBsb2NrIG9wZXJhdGlvbnMgZm9yICJjaGFyIiBzaW5jZSBpdCBjYW4ndCBiZSBub24tYXRvbWljCitBVE9NSUNfQ01QWENIR19SRUFEKGZpeGVkMSwgcmQsIGttcF9pbnQ4LCA4LCArLAorICAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3JkCitBVE9NSUNfQ01QWENIR19SRUFEKGZpeGVkMiwgcmQsIGttcF9pbnQxNiwgMTYsICssCisgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDJfcmQKKworQVRPTUlDX0NSSVRJQ0FMX1JFQUQoZmxvYXQxMCwgcmQsIGxvbmcgZG91YmxlLCArLCAxMHIsCisgICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfcmQKKyNpZiBLTVBfSEFWRV9RVUFECitBVE9NSUNfQ1JJVElDQUxfUkVBRChmbG9hdDE2LCByZCwgUVVBRF9MRUdBQ1ksICssIDE2ciwKKyAgICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9yZAorI2VuZGlmIC8vIEtNUF9IQVZFX1FVQUQKKworLy8gRml4IGZvciBDUTIyMDM2MSBvbiBXaW5kb3dzKiBPUworI2lmIChLTVBfT1NfV0lORE9XUykKK0FUT01JQ19DUklUSUNBTF9SRUFEX1dSSyhjbXBseDQsIHJkLCBrbXBfY21wbHgzMiwgKywgOGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDRfcmQKKyNlbHNlCitBVE9NSUNfQ1JJVElDQUxfUkVBRChjbXBseDQsIHJkLCBrbXBfY21wbHgzMiwgKywgOGMsCisgICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9yZAorI2VuZGlmCitBVE9NSUNfQ1JJVElDQUxfUkVBRChjbXBseDgsIHJkLCBrbXBfY21wbHg2NCwgKywgMTZjLAorICAgICAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDhfcmQKK0FUT01JQ19DUklUSUNBTF9SRUFEKGNtcGx4MTAsIHJkLCBrbXBfY21wbHg4MCwgKywgMjBjLAorICAgICAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX3JkCisjaWYgS01QX0hBVkVfUVVBRAorQVRPTUlDX0NSSVRJQ0FMX1JFQUQoY21wbHgxNiwgcmQsIENQTFgxMjhfTEVHLCArLCAzMmMsCisgICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfcmQKKyNpZiAoS01QX0FSQ0hfWDg2KQorQVRPTUlDX0NSSVRJQ0FMX1JFQUQoZmxvYXQxNiwgYTE2X3JkLCBRdWFkX2ExNl90LCArLCAxNnIsCisgICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYTE2X3JkCitBVE9NSUNfQ1JJVElDQUxfUkVBRChjbXBseDE2LCBhMTZfcmQsIGttcF9jbXBseDEyOF9hMTZfdCwgKywgMzJjLAorICAgICAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2ExNl9yZAorI2VuZGlmCisjZW5kaWYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBdG9taWMgV1JJVEUgcm91dGluZXMKKworI2RlZmluZSBBVE9NSUNfWENIR19XUihUWVBFX0lELCBPUF9JRCwgVFlQRSwgQklUUywgT1AsIEdPTVBfRkxBRykgICAgICAgICAgICAgIFwKKyAgQVRPTUlDX0JFR0lOKFRZUEVfSUQsIE9QX0lELCBUWVBFLCB2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE9QX0dPTVBfQ1JJVElDQUwoT1AsIEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBLTVBfWENIR19GSVhFRCMjQklUUyhsaHMsIHJocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19YQ0hHX0ZMT0FUX1dSKFRZUEVfSUQsIE9QX0lELCBUWVBFLCBCSVRTLCBPUCwgR09NUF9GTEFHKSAgICAgICAgXAorICBBVE9NSUNfQkVHSU4oVFlQRV9JRCwgT1BfSUQsIFRZUEUsIHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT1BfR09NUF9DUklUSUNBTChPUCwgR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEtNUF9YQ0hHX1JFQUwjI0JJVFMobGhzLCByaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3BlcmF0aW9uIG9uICpsaHMsIHJocyB1c2luZyAiY29tcGFyZV9hbmRfc3RvcmUiIHJvdXRpbmUKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZHMnIHR5cGUKKy8vICAgICBCSVRTICAgIC0gc2l6ZSBpbiBiaXRzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIGxvdyBsZXZlbCBjYWxscworLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorLy8gTm90ZTogdGVtcF92YWwgaW50cm9kdWNlZCBpbiBvcmRlciB0byBmb3JjZSB0aGUgY29tcGlsZXIgdG8gcmVhZAorLy8gICAgICAgKmxocyBvbmx5IG9uY2UgKHcvbyBpdCB0aGUgY29tcGlsZXIgcmVhZHMgKmxocyB0d2ljZSkKKyNkZWZpbmUgT1BfQ01QWENIR19XUihUWVBFLCBCSVRTLCBPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgS01QX0FUT01JQ19WT0xBVElMRSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBuZXdfdmFsdWUgPSByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKCFLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRIyNCSVRTKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoa21wX2ludCMjQklUUyAqKWxocywgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmIG9sZF92YWx1ZSwgICAgIFwKKyAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmIG5ld192YWx1ZSkpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBLTVBfQ1BVX1BBVVNFKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbmV3X3ZhbHVlID0gcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19XUihUWVBFX0lELCBPUF9JRCwgVFlQRSwgQklUUywgT1AsIEdPTVBfRkxBRykgICAgICAgICAgIFwKKyAgQVRPTUlDX0JFR0lOKFRZUEVfSUQsIE9QX0lELCBUWVBFLCB2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE9QX0dPTVBfQ1JJVElDQUwoT1AsIEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBPUF9DTVBYQ0hHX1dSKFRZUEUsIEJJVFMsIE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBFeHRlbmRlZCB0eXBlczogbG9uZyBkb3VibGUsIF9RdWFkLCBjb21wbGV4IGZsYXZvdXJzICh1c2UKKy8vIGNyaXRpY2FsIHNlY3Rpb24pCisvLyAgICAgVFlQRV9JRCwgT1BfSUQsIFRZUEUgLSBkZXRhaWxlZCBhYm92ZQorLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorLy8gICAgIExDS19JRCAgLSBsb2NrIGlkZW50aWZpZXIsIHVzZWQgdG8gcG9zc2libHkgZGlzdGluZ3Vpc2ggbG9jayB2YXJpYWJsZQorI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfV1IoVFlQRV9JRCwgT1BfSUQsIFRZUEUsIE9QLCBMQ0tfSUQsIEdPTVBfRkxBRykgICAgICAgIFwKKyAgQVRPTUlDX0JFR0lOKFRZUEVfSUQsIE9QX0lELCBUWVBFLCB2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE9QX0dPTVBfQ1JJVElDQUwoT1AsIEdPTVBfRkxBRykgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgICAgICAgICAgICAgICAgXAorICBPUF9DUklUSUNBTChPUCwgTENLX0lEKSAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBVE9NSUNfWENIR19XUihmaXhlZDEsIHdyLCBrbXBfaW50OCwgOCwgPSwKKyAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDFfd3IKK0FUT01JQ19YQ0hHX1dSKGZpeGVkMiwgd3IsIGttcF9pbnQxNiwgMTYsID0sCisgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3dyCitBVE9NSUNfWENIR19XUihmaXhlZDQsIHdyLCBrbXBfaW50MzIsIDMyLCA9LAorICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF93cgorI2lmIChLTVBfQVJDSF9YODYpCitBVE9NSUNfQ01QWENIR19XUihmaXhlZDgsIHdyLCBrbXBfaW50NjQsIDY0LCA9LAorICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF93cgorI2Vsc2UKK0FUT01JQ19YQ0hHX1dSKGZpeGVkOCwgd3IsIGttcF9pbnQ2NCwgNjQsID0sCisgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3dyCisjZW5kaWYKKworQVRPTUlDX1hDSEdfRkxPQVRfV1IoZmxvYXQ0LCB3ciwga21wX3JlYWwzMiwgMzIsID0sCisgICAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X3dyCisjaWYgKEtNUF9BUkNIX1g4NikKK0FUT01JQ19DTVBYQ0hHX1dSKGZsb2F0OCwgd3IsIGttcF9yZWFsNjQsIDY0LCA9LAorICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF93cgorI2Vsc2UKK0FUT01JQ19YQ0hHX0ZMT0FUX1dSKGZsb2F0OCwgd3IsIGttcF9yZWFsNjQsIDY0LCA9LAorICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF93cgorI2VuZGlmCisKK0FUT01JQ19DUklUSUNBTF9XUihmbG9hdDEwLCB3ciwgbG9uZyBkb3VibGUsID0sIDEwciwKKyAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfd3IKKyNpZiBLTVBfSEFWRV9RVUFECitBVE9NSUNfQ1JJVElDQUxfV1IoZmxvYXQxNiwgd3IsIFFVQURfTEVHQUNZLCA9LCAxNnIsCisgICAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X3dyCisjZW5kaWYKK0FUT01JQ19DUklUSUNBTF9XUihjbXBseDQsIHdyLCBrbXBfY21wbHgzMiwgPSwgOGMsIDEpIC8vIF9fa21wY19hdG9taWNfY21wbHg0X3dyCitBVE9NSUNfQ1JJVElDQUxfV1IoY21wbHg4LCB3ciwga21wX2NtcGx4NjQsID0sIDE2YywKKyAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF93cgorQVRPTUlDX0NSSVRJQ0FMX1dSKGNtcGx4MTAsIHdyLCBrbXBfY21wbHg4MCwgPSwgMjBjLAorICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF93cgorI2lmIEtNUF9IQVZFX1FVQUQKK0FUT01JQ19DUklUSUNBTF9XUihjbXBseDE2LCB3ciwgQ1BMWDEyOF9MRUcsID0sIDMyYywKKyAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfd3IKKyNpZiAoS01QX0FSQ0hfWDg2KQorQVRPTUlDX0NSSVRJQ0FMX1dSKGZsb2F0MTYsIGExNl93ciwgUXVhZF9hMTZfdCwgPSwgMTZyLAorICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9hMTZfd3IKK0FUT01JQ19DUklUSUNBTF9XUihjbXBseDE2LCBhMTZfd3IsIGttcF9jbXBseDEyOF9hMTZfdCwgPSwgMzJjLAorICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9hMTZfd3IKKyNlbmRpZgorI2VuZGlmCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQXRvbWljIENBUFRVUkUgcm91dGluZXMKKworLy8gQmVnaW5uaW5nIG9mIGEgZGVmaW5pdGlvbiAocHJvdmlkZXMgbmFtZSwgcGFyYW1ldGVycywgZ2VidWcgdHJhY2UpCisvLyAgICAgVFlQRV9JRCAtIG9wZXJhbmRzIHR5cGUgYW5kIHNpemUgKGZpeGVkKiwgZml4ZWQqdSBmb3Igc2lnbmVkLCB1bnNpZ25lZAorLy8gICAgIGZpeGVkKQorLy8gICAgIE9QX0lEICAgLSBvcGVyYXRpb24gaWRlbnRpZmllciAoYWRkLCBzdWIsIG11bCwgLi4uKQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorI2RlZmluZSBBVE9NSUNfQkVHSU5fQ1BUKFRZUEVfSUQsIE9QX0lELCBUWVBFLCBSRVRfVFlQRSkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgUkVUX1RZUEUgX19rbXBjX2F0b21pY18jI1RZUEVfSUQjI18jI09QX0lEKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFICpsaHMsIFRZUEUgcmhzLCBpbnQgZmxhZykgeyAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfaW5pdF9zZXJpYWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLQV9UUkFDRSgxMDAsICgiX19rbXBjX2F0b21pY18iICNUWVBFX0lEICJfIiAjT1BfSUQgIjogVCMlZFxuIiwgZ3RpZCkpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIGJvdW5kIGJ5IGNyaXRpY2FsIHNlY3Rpb24KKy8vICAgICBPUCAgICAgLSBvcGVyYXRvciAoaXQncyBzdXBwb3NlZCB0byBjb250YWluIGFuIGFzc2lnbm1lbnQpCisvLyAgICAgTENLX0lEIC0gbG9jayBpZGVudGlmaWVyCisvLyBOb3RlOiBkb24ndCBjaGVjayBndGlkIGFzIGl0IHNob3VsZCBhbHdheXMgYmUgdmFsaWQKKy8vIDEsIDItYnl0ZSAtIGV4cGVjdCB2YWxpZCBwYXJhbWV0ZXIsIG90aGVyIC0gY2hlY2sgYmVmb3JlIHRoaXMgbWFjcm8KKyNkZWZpbmUgT1BfQ1JJVElDQUxfQ1BUKE9QLCBMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soJkFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGZsYWcpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCpsaHMpIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5ld192YWx1ZSA9ICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbmV3X3ZhbHVlID0gKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgqbGhzKSBPUCByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCZBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuIG5ld192YWx1ZTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfQ1BUKE9QLCBGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ1JJVElDQUxfQ1BUKE9QIyMgPSwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZWxzZQorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0NQVChPUCwgRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIHVzaW5nICJjb21wYXJlX2FuZF9zdG9yZSIgcm91dGluZQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorLy8gICAgIEJJVFMgICAgLSBzaXplIGluIGJpdHMsIHVzZWQgdG8gZGlzdGluZ3Vpc2ggbG93IGxldmVsIGNhbGxzCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyBOb3RlOiB0ZW1wX3ZhbCBpbnRyb2R1Y2VkIGluIG9yZGVyIHRvIGZvcmNlIHRoZSBjb21waWxlciB0byByZWFkCisvLyAgICAgICAqbGhzIG9ubHkgb25jZSAody9vIGl0IHRoZSBjb21waWxlciByZWFkcyAqbGhzIHR3aWNlKQorI2RlZmluZSBPUF9DTVBYQ0hHX0NQVChUWVBFLCBCSVRTLCBPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSBPUCByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3aGlsZSAoIUtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EjI0JJVFMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChrbXBfaW50IyNCSVRTICopbGhzLCAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICYgb2xkX3ZhbHVlLCAgICAgXAorICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICYgbmV3X3ZhbHVlKSkgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEtNUF9DUFVfUEFVU0UoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZmxhZykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19DUFQoVFlQRV9JRCwgT1BfSUQsIFRZUEUsIEJJVFMsIE9QLCBHT01QX0ZMQUcpICAgICAgICAgIFwKKyAgQVRPTUlDX0JFR0lOX0NQVChUWVBFX0lELCBPUF9JRCwgVFlQRSwgVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRZUEUgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBPUF9HT01QX0NSSVRJQ0FMX0NQVChPUCwgR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT1BfQ01QWENIR19DUFQoVFlQRSwgQklUUywgT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfRklYRURfQUREX0NQVChUWVBFX0lELCBPUF9JRCwgVFlQRSwgQklUUywgT1AsIEdPTVBfRkxBRykgICAgICAgIFwKKyAgQVRPTUlDX0JFR0lOX0NQVChUWVBFX0lELCBPUF9JRCwgVFlQRSwgVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRZUEUgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBPUF9HT01QX0NSSVRJQ0FMX0NQVChPUCwgR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogT1AgdXNlZCBhcyBhIHNpZ24gZm9yIHN1YnRyYWN0aW9uOiAobGhzLXJocykgLS0+IChsaHMrLXJocykgKi8gICAgICAgICAgICBcCisgIG9sZF92YWx1ZSA9IEtNUF9URVNUX1RIRU5fQUREIyNCSVRTKGxocywgT1AgcmhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoZmxhZykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gb2xkX3ZhbHVlIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBVE9NSUNfRklYRURfQUREX0NQVChmaXhlZDQsIGFkZF9jcHQsIGttcF9pbnQzMiwgMzIsICssCisgICAgICAgICAgICAgICAgICAgICAwKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGRfY3B0CitBVE9NSUNfRklYRURfQUREX0NQVChmaXhlZDQsIHN1Yl9jcHQsIGttcF9pbnQzMiwgMzIsIC0sCisgICAgICAgICAgICAgICAgICAgICAwKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfY3B0CitBVE9NSUNfRklYRURfQUREX0NQVChmaXhlZDgsIGFkZF9jcHQsIGttcF9pbnQ2NCwgNjQsICssCisgICAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZF9jcHQKK0FUT01JQ19GSVhFRF9BRERfQ1BUKGZpeGVkOCwgc3ViX2NwdCwga21wX2ludDY0LCA2NCwgLSwKKyAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2NwdAorCitBVE9NSUNfQ01QWENIR19DUFQoZmxvYXQ0LCBhZGRfY3B0LCBrbXBfcmVhbDMyLCAzMiwgKywKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZF9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVChmbG9hdDQsIHN1Yl9jcHQsIGttcF9yZWFsMzIsIDMyLCAtLAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKGZsb2F0OCwgYWRkX2NwdCwga21wX3JlYWw2NCwgNjQsICssCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoZmxvYXQ4LCBzdWJfY3B0LCBrbXBfcmVhbDY0LCA2NCwgLSwKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9jcHQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyaWVzIGRlZmluaXRpb24gZm9yIGludGVnZXIgb3BlcmFuZHMKKy8vICAgICBUWVBFX0lEIC0gb3BlcmFuZHMgdHlwZSBhbmQgc2l6ZSAoZml4ZWQ0LCBmbG9hdDQpCisvLyAgICAgT1BfSUQgICAtIG9wZXJhdGlvbiBpZGVudGlmaWVyIChhZGQsIHN1YiwgbXVsLCAuLi4pCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmQgdHlwZQorLy8gICAgIEJJVFMgICAgLSBzaXplIGluIGJpdHMsIHVzZWQgdG8gZGlzdGluZ3Vpc2ggbG93IGxldmVsIGNhbGxzCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yICh1c2VkIGluIGNyaXRpY2FsIHNlY3Rpb24pCisvLyAgICAgICAgICAgICAgIFRZUEVfSUQsT1BfSUQsICBUWVBFLCAgIEJJVFMsT1AsR09NUF9GTEFHCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBBVE9NSUMgaW50ZWdlciBvcGVyYW5kcywgb3RoZXIgb3BlcmF0b3JzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgICAgICAgICBUWVBFX0lELE9QX0lELCBUWVBFLCAgICAgICAgICBPUCwgIEdPTVBfRkxBRworQVRPTUlDX0NNUFhDSEdfQ1BUKGZpeGVkMSwgYWRkX2NwdCwga21wX2ludDgsIDgsICssCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hZGRfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoZml4ZWQxLCBhbmRiX2NwdCwga21wX2ludDgsIDgsICYsCisgICAgICAgICAgICAgICAgICAgMCkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfYW5kYl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVChmaXhlZDEsIGRpdl9jcHQsIGttcF9pbnQ4LCA4LCAvLAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKGZpeGVkMXUsIGRpdl9jcHQsIGttcF91aW50OCwgOCwgLywKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoZml4ZWQxLCBtdWxfY3B0LCBrbXBfaW50OCwgOCwgKiwKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVChmaXhlZDEsIG9yYl9jcHQsIGttcF9pbnQ4LCA4LCB8LAorICAgICAgICAgICAgICAgICAgIDApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX29yYl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVChmaXhlZDEsIHNobF9jcHQsIGttcF9pbnQ4LCA4LCA8PCwKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3NobF9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVChmaXhlZDEsIHNocl9jcHQsIGttcF9pbnQ4LCA4LCA+PiwKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3Nocl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVChmaXhlZDF1LCBzaHJfY3B0LCBrbXBfdWludDgsIDgsID4+LAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDF1X3Nocl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVChmaXhlZDEsIHN1Yl9jcHQsIGttcF9pbnQ4LCA4LCAtLAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKGZpeGVkMSwgeG9yX2NwdCwga21wX2ludDgsIDgsIF4sCisgICAgICAgICAgICAgICAgICAgMCkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfeG9yX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKGZpeGVkMiwgYWRkX2NwdCwga21wX2ludDE2LCAxNiwgKywKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2FkZF9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVChmaXhlZDIsIGFuZGJfY3B0LCBrbXBfaW50MTYsIDE2LCAmLAorICAgICAgICAgICAgICAgICAgIDApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoZml4ZWQyLCBkaXZfY3B0LCBrbXBfaW50MTYsIDE2LCAvLAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKGZpeGVkMnUsIGRpdl9jcHQsIGttcF91aW50MTYsIDE2LCAvLAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVChmaXhlZDIsIG11bF9jcHQsIGttcF9pbnQxNiwgMTYsICosCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoZml4ZWQyLCBvcmJfY3B0LCBrbXBfaW50MTYsIDE2LCB8LAorICAgICAgICAgICAgICAgICAgIDApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX29yYl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVChmaXhlZDIsIHNobF9jcHQsIGttcF9pbnQxNiwgMTYsIDw8LAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc2hsX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKGZpeGVkMiwgc2hyX2NwdCwga21wX2ludDE2LCAxNiwgPj4sCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoZml4ZWQydSwgc2hyX2NwdCwga21wX3VpbnQxNiwgMTYsID4+LAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVChmaXhlZDIsIHN1Yl9jcHQsIGttcF9pbnQxNiwgMTYsIC0sCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoZml4ZWQyLCB4b3JfY3B0LCBrbXBfaW50MTYsIDE2LCBeLAorICAgICAgICAgICAgICAgICAgIDApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3hvcl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVChmaXhlZDQsIGFuZGJfY3B0LCBrbXBfaW50MzIsIDMyLCAmLAorICAgICAgICAgICAgICAgICAgIDApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoZml4ZWQ0LCBkaXZfY3B0LCBrbXBfaW50MzIsIDMyLCAvLAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKGZpeGVkNHUsIGRpdl9jcHQsIGttcF91aW50MzIsIDMyLCAvLAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVChmaXhlZDQsIG11bF9jcHQsIGttcF9pbnQzMiwgMzIsICosCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoZml4ZWQ0LCBvcmJfY3B0LCBrbXBfaW50MzIsIDMyLCB8LAorICAgICAgICAgICAgICAgICAgIDApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X29yYl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVChmaXhlZDQsIHNobF9jcHQsIGttcF9pbnQzMiwgMzIsIDw8LAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc2hsX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKGZpeGVkNCwgc2hyX2NwdCwga21wX2ludDMyLCAzMiwgPj4sCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoZml4ZWQ0dSwgc2hyX2NwdCwga21wX3VpbnQzMiwgMzIsID4+LAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X3Nocl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVChmaXhlZDQsIHhvcl9jcHQsIGttcF9pbnQzMiwgMzIsIF4sCisgICAgICAgICAgICAgICAgICAgMCkgLy8gX19rbXBjX2F0b21pY19maXhlZDRfeG9yX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKGZpeGVkOCwgYW5kYl9jcHQsIGttcF9pbnQ2NCwgNjQsICYsCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRiX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKGZpeGVkOCwgZGl2X2NwdCwga21wX2ludDY0LCA2NCwgLywKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVChmaXhlZDh1LCBkaXZfY3B0LCBrbXBfdWludDY0LCA2NCwgLywKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoZml4ZWQ4LCBtdWxfY3B0LCBrbXBfaW50NjQsIDY0LCAqLAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDhfbXVsX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKGZpeGVkOCwgb3JiX2NwdCwga21wX2ludDY0LCA2NCwgfCwKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X29yYl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVChmaXhlZDgsIHNobF9jcHQsIGttcF9pbnQ2NCwgNjQsIDw8LAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc2hsX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKGZpeGVkOCwgc2hyX2NwdCwga21wX2ludDY0LCA2NCwgPj4sCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoZml4ZWQ4dSwgc2hyX2NwdCwga21wX3VpbnQ2NCwgNjQsID4+LAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDh1X3Nocl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVChmaXhlZDgsIHhvcl9jcHQsIGttcF9pbnQ2NCwgNjQsIF4sCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF94b3JfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoZmxvYXQ0LCBkaXZfY3B0LCBrbXBfcmVhbDMyLCAzMiwgLywKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVChmbG9hdDQsIG11bF9jcHQsIGttcF9yZWFsMzIsIDMyLCAqLAorICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfbXVsX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKGZsb2F0OCwgZGl2X2NwdCwga21wX3JlYWw2NCwgNjQsIC8sCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoZmxvYXQ4LCBtdWxfY3B0LCBrbXBfcmVhbDY0LCA2NCwgKiwKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X211bF9jcHQKKy8vICAgICAgICAgICAgICBUWVBFX0lELE9QX0lELCBUWVBFLCAgICAgICAgICBPUCwgIEdPTVBfRkxBRworCisvLyBDQVBUVVJFIHJvdXRpbmVzIGZvciBtaXhlZCB0eXBlcyBSSFM9ZmxvYXQxNgorI2lmIEtNUF9IQVZFX1FVQUQKKworLy8gQmVnaW5uaW5nIG9mIGEgZGVmaW5pdGlvbiAocHJvdmlkZXMgbmFtZSwgcGFyYW1ldGVycywgZ2VidWcgdHJhY2UpCisvLyAgICAgVFlQRV9JRCAtIG9wZXJhbmRzIHR5cGUgYW5kIHNpemUgKGZpeGVkKiwgZml4ZWQqdSBmb3Igc2lnbmVkLCB1bnNpZ25lZAorLy8gICAgIGZpeGVkKQorLy8gICAgIE9QX0lEICAgLSBvcGVyYXRpb24gaWRlbnRpZmllciAoYWRkLCBzdWIsIG11bCwgLi4uKQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorI2RlZmluZSBBVE9NSUNfQkVHSU5fQ1BUX01JWChUWVBFX0lELCBPUF9JRCwgVFlQRSwgUlRZUEVfSUQsIFJUWVBFKSAgICAgICAgICAgIFwKKyAgVFlQRSBfX2ttcGNfYXRvbWljXyMjVFlQRV9JRCMjXyMjT1BfSUQjI18jI1JUWVBFX0lEKCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICpsaHMsIFJUWVBFIHJocywgaW50IGZsYWcpIHsgICAgICAgICAgICAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfaW5pdF9zZXJpYWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLQV9UUkFDRSgxMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKCJfX2ttcGNfYXRvbWljXyIgI1RZUEVfSUQgIl8iICNPUF9JRCAiXyIgI1JUWVBFX0lEICI6IFQjJWRcbiIsICAgXAorICAgICAgICAgICAgICBndGlkKSk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfQ1BUX01JWChUWVBFX0lELCBUWVBFLCBPUF9JRCwgQklUUywgT1AsIFJUWVBFX0lELCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRZUEUsIExDS19JRCwgTUFTSywgR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgXAorICBBVE9NSUNfQkVHSU5fQ1BUX01JWChUWVBFX0lELCBPUF9JRCwgVFlQRSwgUlRZUEVfSUQsIFJUWVBFKSAgICAgICAgICAgICAgICAgIFwKKyAgVFlQRSBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE9QX0dPTVBfQ1JJVElDQUxfQ1BUKE9QLCBHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBPUF9DTVBYQ0hHX0NQVChUWVBFLCBCSVRTLCBPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9DUFRfTUlYKFRZUEVfSUQsIFRZUEUsIE9QX0lELCBPUCwgUlRZUEVfSUQsIFJUWVBFLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQ0tfSUQsIEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQVRPTUlDX0JFR0lOX0NQVF9NSVgoVFlQRV9JRCwgT1BfSUQsIFRZUEUsIFJUWVBFX0lELCBSVFlQRSkgICAgICAgICAgICAgICAgICBcCisgIFRZUEUgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBPUF9HT01QX0NSSVRJQ0FMX0NQVChPUCwgR09NUF9GTEFHKSAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgT1BfQ1JJVElDQUxfQ1BUKE9QIyMgPSwgTENLX0lEKSAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworQVRPTUlDX0NNUFhDSEdfQ1BUX01JWChmaXhlZDEsIGNoYXIsIGFkZF9jcHQsIDgsICssIGZwLCBfUXVhZCwgMWksIDAsCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDFfYWRkX2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWChmaXhlZDF1LCB1Y2hhciwgYWRkX2NwdCwgOCwgKywgZnAsIF9RdWFkLCAxaSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfYWRkX2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWChmaXhlZDEsIGNoYXIsIHN1Yl9jcHQsIDgsIC0sIGZwLCBfUXVhZCwgMWksIDAsCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWChmaXhlZDF1LCB1Y2hhciwgc3ViX2NwdCwgOCwgLSwgZnAsIF9RdWFkLCAxaSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc3ViX2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWChmaXhlZDEsIGNoYXIsIG11bF9jcHQsIDgsICosIGZwLCBfUXVhZCwgMWksIDAsCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWChmaXhlZDF1LCB1Y2hhciwgbXVsX2NwdCwgOCwgKiwgZnAsIF9RdWFkLCAxaSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfbXVsX2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWChmaXhlZDEsIGNoYXIsIGRpdl9jcHQsIDgsIC8sIGZwLCBfUXVhZCwgMWksIDAsCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWChmaXhlZDF1LCB1Y2hhciwgZGl2X2NwdCwgOCwgLywgZnAsIF9RdWFkLCAxaSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2NwdF9mcAorCitBVE9NSUNfQ01QWENIR19DUFRfTUlYKGZpeGVkMiwgc2hvcnQsIGFkZF9jcHQsIDE2LCArLCBmcCwgX1F1YWQsIDJpLCAxLAorICAgICAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2FkZF9jcHRfZnAKK0FUT01JQ19DTVBYQ0hHX0NQVF9NSVgoZml4ZWQydSwgdXNob3J0LCBhZGRfY3B0LCAxNiwgKywgZnAsIF9RdWFkLCAyaSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfYWRkX2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWChmaXhlZDIsIHNob3J0LCBzdWJfY3B0LCAxNiwgLSwgZnAsIF9RdWFkLCAyaSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfY3B0X2ZwCitBVE9NSUNfQ01QWENIR19DUFRfTUlYKGZpeGVkMnUsIHVzaG9ydCwgc3ViX2NwdCwgMTYsIC0sIGZwLCBfUXVhZCwgMmksIDEsCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X3N1Yl9jcHRfZnAKK0FUT01JQ19DTVBYQ0hHX0NQVF9NSVgoZml4ZWQyLCBzaG9ydCwgbXVsX2NwdCwgMTYsICosIGZwLCBfUXVhZCwgMmksIDEsCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWChmaXhlZDJ1LCB1c2hvcnQsIG11bF9jcHQsIDE2LCAqLCBmcCwgX1F1YWQsIDJpLCAxLAorICAgICAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQydV9tdWxfY3B0X2ZwCitBVE9NSUNfQ01QWENIR19DUFRfTUlYKGZpeGVkMiwgc2hvcnQsIGRpdl9jcHQsIDE2LCAvLCBmcCwgX1F1YWQsIDJpLCAxLAorICAgICAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9jcHRfZnAKK0FUT01JQ19DTVBYQ0hHX0NQVF9NSVgoZml4ZWQydSwgdXNob3J0LCBkaXZfY3B0LCAxNiwgLywgZnAsIF9RdWFkLCAyaSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2NwdF9mcAorCitBVE9NSUNfQ01QWENIR19DUFRfTUlYKGZpeGVkNCwga21wX2ludDMyLCBhZGRfY3B0LCAzMiwgKywgZnAsIF9RdWFkLCA0aSwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgMCkgLy8gX19rbXBjX2F0b21pY19maXhlZDRfYWRkX2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWChmaXhlZDR1LCBrbXBfdWludDMyLCBhZGRfY3B0LCAzMiwgKywgZnAsIF9RdWFkLCA0aSwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgMCkgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X2FkZF9jcHRfZnAKK0FUT01JQ19DTVBYQ0hHX0NQVF9NSVgoZml4ZWQ0LCBrbXBfaW50MzIsIHN1Yl9jcHQsIDMyLCAtLCBmcCwgX1F1YWQsIDRpLCAzLAorICAgICAgICAgICAgICAgICAgICAgICAwKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfY3B0X2ZwCitBVE9NSUNfQ01QWENIR19DUFRfTUlYKGZpeGVkNHUsIGttcF91aW50MzIsIHN1Yl9jcHQsIDMyLCAtLCBmcCwgX1F1YWQsIDRpLCAzLAorICAgICAgICAgICAgICAgICAgICAgICAwKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc3ViX2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWChmaXhlZDQsIGttcF9pbnQzMiwgbXVsX2NwdCwgMzIsICosIGZwLCBfUXVhZCwgNGksIDMsCisgICAgICAgICAgICAgICAgICAgICAgIDApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9jcHRfZnAKK0FUT01JQ19DTVBYQ0hHX0NQVF9NSVgoZml4ZWQ0dSwga21wX3VpbnQzMiwgbXVsX2NwdCwgMzIsICosIGZwLCBfUXVhZCwgNGksIDMsCisgICAgICAgICAgICAgICAgICAgICAgIDApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0dV9tdWxfY3B0X2ZwCitBVE9NSUNfQ01QWENIR19DUFRfTUlYKGZpeGVkNCwga21wX2ludDMyLCBkaXZfY3B0LCAzMiwgLywgZnAsIF9RdWFkLCA0aSwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgMCkgLy8gX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWChmaXhlZDR1LCBrbXBfdWludDMyLCBkaXZfY3B0LCAzMiwgLywgZnAsIF9RdWFkLCA0aSwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgMCkgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9jcHRfZnAKKworQVRPTUlDX0NNUFhDSEdfQ1BUX01JWChmaXhlZDgsIGttcF9pbnQ2NCwgYWRkX2NwdCwgNjQsICssIGZwLCBfUXVhZCwgOGksIDcsCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDhfYWRkX2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWChmaXhlZDh1LCBrbXBfdWludDY0LCBhZGRfY3B0LCA2NCwgKywgZnAsIF9RdWFkLCA4aSwgNywKKyAgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfYWRkX2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWChmaXhlZDgsIGttcF9pbnQ2NCwgc3ViX2NwdCwgNjQsIC0sIGZwLCBfUXVhZCwgOGksIDcsCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWChmaXhlZDh1LCBrbXBfdWludDY0LCBzdWJfY3B0LCA2NCwgLSwgZnAsIF9RdWFkLCA4aSwgNywKKyAgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc3ViX2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWChmaXhlZDgsIGttcF9pbnQ2NCwgbXVsX2NwdCwgNjQsICosIGZwLCBfUXVhZCwgOGksIDcsCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDhfbXVsX2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWChmaXhlZDh1LCBrbXBfdWludDY0LCBtdWxfY3B0LCA2NCwgKiwgZnAsIF9RdWFkLCA4aSwgNywKKyAgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfbXVsX2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWChmaXhlZDgsIGttcF9pbnQ2NCwgZGl2X2NwdCwgNjQsIC8sIGZwLCBfUXVhZCwgOGksIDcsCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWChmaXhlZDh1LCBrbXBfdWludDY0LCBkaXZfY3B0LCA2NCwgLywgZnAsIF9RdWFkLCA4aSwgNywKKyAgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X2NwdF9mcAorCitBVE9NSUNfQ01QWENIR19DUFRfTUlYKGZsb2F0NCwga21wX3JlYWwzMiwgYWRkX2NwdCwgMzIsICssIGZwLCBfUXVhZCwgNHIsIDMsCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWChmbG9hdDQsIGttcF9yZWFsMzIsIHN1Yl9jcHQsIDMyLCAtLCBmcCwgX1F1YWQsIDRyLCAzLAorICAgICAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHRfZnAKK0FUT01JQ19DTVBYQ0hHX0NQVF9NSVgoZmxvYXQ0LCBrbXBfcmVhbDMyLCBtdWxfY3B0LCAzMiwgKiwgZnAsIF9RdWFkLCA0ciwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfY3B0X2ZwCitBVE9NSUNfQ01QWENIR19DUFRfTUlYKGZsb2F0NCwga21wX3JlYWwzMiwgZGl2X2NwdCwgMzIsIC8sIGZwLCBfUXVhZCwgNHIsIDMsCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2NwdF9mcAorCitBVE9NSUNfQ01QWENIR19DUFRfTUlYKGZsb2F0OCwga21wX3JlYWw2NCwgYWRkX2NwdCwgNjQsICssIGZwLCBfUXVhZCwgOHIsIDcsCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfYWRkX2NwdF9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX01JWChmbG9hdDgsIGttcF9yZWFsNjQsIHN1Yl9jcHQsIDY0LCAtLCBmcCwgX1F1YWQsIDhyLCA3LAorICAgICAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9jcHRfZnAKK0FUT01JQ19DTVBYQ0hHX0NQVF9NSVgoZmxvYXQ4LCBrbXBfcmVhbDY0LCBtdWxfY3B0LCA2NCwgKiwgZnAsIF9RdWFkLCA4ciwgNywKKyAgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWxfY3B0X2ZwCitBVE9NSUNfQ01QWENIR19DUFRfTUlYKGZsb2F0OCwga21wX3JlYWw2NCwgZGl2X2NwdCwgNjQsIC8sIGZwLCBfUXVhZCwgOHIsIDcsCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2NwdF9mcAorCitBVE9NSUNfQ1JJVElDQUxfQ1BUX01JWChmbG9hdDEwLCBsb25nIGRvdWJsZSwgYWRkX2NwdCwgKywgZnAsIF9RdWFkLCAxMHIsCisgICAgICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkX2NwdF9mcAorQVRPTUlDX0NSSVRJQ0FMX0NQVF9NSVgoZmxvYXQxMCwgbG9uZyBkb3VibGUsIHN1Yl9jcHQsIC0sIGZwLCBfUXVhZCwgMTByLAorICAgICAgICAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9jcHRfZnAKK0FUT01JQ19DUklUSUNBTF9DUFRfTUlYKGZsb2F0MTAsIGxvbmcgZG91YmxlLCBtdWxfY3B0LCAqLCBmcCwgX1F1YWQsIDEwciwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWxfY3B0X2ZwCitBVE9NSUNfQ1JJVElDQUxfQ1BUX01JWChmbG9hdDEwLCBsb25nIGRvdWJsZSwgZGl2X2NwdCwgLywgZnAsIF9RdWFkLCAxMHIsCisgICAgICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2NwdF9mcAorCisjZW5kaWYgLy8gS01QX0hBVkVfUVVBRAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBDL0MrKyBSZWR1Y3Rpb24gb3BlcmF0b3JzICYmIGFuZCB8fAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIGJvdW5kIGJ5IGNyaXRpY2FsIHNlY3Rpb24KKy8vICAgICBPUCAgICAgLSBvcGVyYXRvciAoaXQncyBzdXBwb3NlZCB0byBjb250YWluIGFuIGFzc2lnbm1lbnQpCisvLyAgICAgTENLX0lEIC0gbG9jayBpZGVudGlmaWVyCisvLyBOb3RlOiBkb24ndCBjaGVjayBndGlkIGFzIGl0IHNob3VsZCBhbHdheXMgYmUgdmFsaWQKKy8vIDEsIDItYnl0ZSAtIGV4cGVjdCB2YWxpZCBwYXJhbWV0ZXIsIG90aGVyIC0gY2hlY2sgYmVmb3JlIHRoaXMgbWFjcm8KKyNkZWZpbmUgT1BfQ1JJVElDQUxfTF9DUFQoT1AsIExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soJkFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGZsYWcpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbmV3X3ZhbHVlIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBuZXdfdmFsdWUgPSAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCZBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfTF9DUFQoT1AsIEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ1JJVElDQUxfTF9DUFQoT1AsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorI2Vsc2UKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9MX0NQVChPUCwgRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOZWVkIHNlcGFyYXRlIG1hY3JvcyBmb3IgJiYsIHx8IGJlY2F1c2UgdGhlcmUgaXMgbm8gY29tYmluZWQgYXNzaWdubWVudAorI2RlZmluZSBBVE9NSUNfQ01QWF9MX0NQVChUWVBFX0lELCBPUF9JRCwgVFlQRSwgQklUUywgT1AsIEdPTVBfRkxBRykgICAgICAgICAgIFwKKyAgQVRPTUlDX0JFR0lOX0NQVChUWVBFX0lELCBPUF9JRCwgVFlQRSwgVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRZUEUgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBPUF9HT01QX0NSSVRJQ0FMX0xfQ1BUKD0gKmxocyBPUCwgR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT1BfQ01QWENIR19DUFQoVFlQRSwgQklUUywgT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworQVRPTUlDX0NNUFhfTF9DUFQoZml4ZWQxLCBhbmRsX2NwdCwgY2hhciwgOCwgJiYsCisgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGxfY3B0CitBVE9NSUNfQ01QWF9MX0NQVChmaXhlZDEsIG9ybF9jcHQsIGNoYXIsIDgsIHx8LAorICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmxfY3B0CitBVE9NSUNfQ01QWF9MX0NQVChmaXhlZDIsIGFuZGxfY3B0LCBzaG9ydCwgMTYsICYmLAorICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRsX2NwdAorQVRPTUlDX0NNUFhfTF9DUFQoZml4ZWQyLCBvcmxfY3B0LCBzaG9ydCwgMTYsIHx8LAorICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmxfY3B0CitBVE9NSUNfQ01QWF9MX0NQVChmaXhlZDQsIGFuZGxfY3B0LCBrbXBfaW50MzIsIDMyLCAmJiwKKyAgICAgICAgICAgICAgICAgIDApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGxfY3B0CitBVE9NSUNfQ01QWF9MX0NQVChmaXhlZDQsIG9ybF9jcHQsIGttcF9pbnQzMiwgMzIsIHx8LAorICAgICAgICAgICAgICAgICAgMCkgLy8gX19rbXBjX2F0b21pY19maXhlZDRfb3JsX2NwdAorQVRPTUlDX0NNUFhfTF9DUFQoZml4ZWQ4LCBhbmRsX2NwdCwga21wX2ludDY0LCA2NCwgJiYsCisgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGxfY3B0CitBVE9NSUNfQ01QWF9MX0NQVChmaXhlZDgsIG9ybF9jcHQsIGttcF9pbnQ2NCwgNjQsIHx8LAorICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmxfY3B0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBGb3J0cmFuIG9wZXJhdG9ycyB0aGF0IG1hdGNoZWQgbm8gb25lIGluIEM6CisvLyBNQVgsIE1JTiwgLkVRVi4sIC5ORVFWLgorLy8gT3BlcmF0b3JzIC5BTkQuLCAuT1IuIGFyZSBjb3ZlcmVkIGJ5IF9fa21wY19hdG9taWNfKl97YW5kbCxvcmx9X2NwdAorLy8gSW50cmluc2ljcyBJQU5ELCBJT1IsIElFT1IgYXJlIGNvdmVyZWQgYnkgX19rbXBjX2F0b21pY18qX3thbmRiLG9yYix4b3J9X2NwdAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNSU4gYW5kIE1BWCBuZWVkIHNlcGFyYXRlIG1hY3JvcworLy8gT1AgLSBvcGVyYXRvciB0byBjaGVjayBpZiB3ZSBuZWVkIGFueSBhY3Rpb25zPworI2RlZmluZSBNSU5fTUFYX0NSSVRTRUNUX0NQVChPUCwgTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jaygmQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoKmxocyBPUCByaHMpIHsgLyogc3RpbGwgbmVlZCBhY3Rpb25zPyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvbGRfdmFsdWUgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKmxocyA9IHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmbGFnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG5ld192YWx1ZSA9IHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soJkFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gbmV3X3ZhbHVlOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIEdPTVBfTUlOX01BWF9DUklUU0VDVF9DUFQoT1AsIEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTUlOX01BWF9DUklUU0VDVF9DUFQoT1AsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZWxzZQorI2RlZmluZSBHT01QX01JTl9NQVhfQ1JJVFNFQ1RfQ1BUKE9QLCBGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIE1JTl9NQVhfQ01QWENIR19DUFQoVFlQRSwgQklUUywgT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIEtNUF9BVE9NSUNfVk9MQVRJTEUgdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLypUWVBFIG9sZF92YWx1ZTsgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKG9sZF92YWx1ZSBPUCByaHMgJiYgLyogc3RpbGwgbmVlZCBhY3Rpb25zPyAqLyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAhS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUSMjQklUUyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIChrbXBfaW50IyNCSVRTICopbGhzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICYgb2xkX3ZhbHVlLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmIHJocykpIHsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEtNUF9DUFVfUEFVU0UoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZsYWcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIDEtYnl0ZSwgMi1ieXRlIG9wZXJhbmRzIC0gdXNlIGNyaXRpY2FsIHNlY3Rpb24KKyNkZWZpbmUgTUlOX01BWF9DUklUSUNBTF9DUFQoVFlQRV9JRCwgT1BfSUQsIFRZUEUsIE9QLCBMQ0tfSUQsIEdPTVBfRkxBRykgICAgICBcCisgIEFUT01JQ19CRUdJTl9DUFQoVFlQRV9JRCwgT1BfSUQsIFRZUEUsIFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUWVBFIG5ld192YWx1ZSwgb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKCpsaHMgT1AgcmhzKSB7IC8qIG5lZWQgYWN0aW9ucz8gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR09NUF9NSU5fTUFYX0NSSVRTRUNUX0NQVChPUCwgR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1JTl9NQVhfQ1JJVFNFQ1RfQ1BUKE9QLCBMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJldHVybiAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgTUlOX01BWF9DT01QWENIR19DUFQoVFlQRV9JRCwgT1BfSUQsIFRZUEUsIEJJVFMsIE9QLCBHT01QX0ZMQUcpICAgICAgICBcCisgIEFUT01JQ19CRUdJTl9DUFQoVFlQRV9JRCwgT1BfSUQsIFRZUEUsIFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUWVBFIG5ld192YWx1ZSwgb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKCpsaHMgT1AgcmhzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR09NUF9NSU5fTUFYX0NSSVRTRUNUX0NQVChPUCwgR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1JTl9NQVhfQ01QWENIR19DUFQoVFlQRSwgQklUUywgT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJldHVybiAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKGZpeGVkMSwgbWF4X2NwdCwgY2hhciwgOCwgPCwKKyAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDFfbWF4X2NwdAorTUlOX01BWF9DT01QWENIR19DUFQoZml4ZWQxLCBtaW5fY3B0LCBjaGFyLCA4LCA+LAorICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9taW5fY3B0CitNSU5fTUFYX0NPTVBYQ0hHX0NQVChmaXhlZDIsIG1heF9jcHQsIHNob3J0LCAxNiwgPCwKKyAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDJfbWF4X2NwdAorTUlOX01BWF9DT01QWENIR19DUFQoZml4ZWQyLCBtaW5fY3B0LCBzaG9ydCwgMTYsID4sCisgICAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX21pbl9jcHQKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKGZpeGVkNCwgbWF4X2NwdCwga21wX2ludDMyLCAzMiwgPCwKKyAgICAgICAgICAgICAgICAgICAgIDApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X21heF9jcHQKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKGZpeGVkNCwgbWluX2NwdCwga21wX2ludDMyLCAzMiwgPiwKKyAgICAgICAgICAgICAgICAgICAgIDApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X21pbl9jcHQKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKGZpeGVkOCwgbWF4X2NwdCwga21wX2ludDY0LCA2NCwgPCwKKyAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDhfbWF4X2NwdAorTUlOX01BWF9DT01QWENIR19DUFQoZml4ZWQ4LCBtaW5fY3B0LCBrbXBfaW50NjQsIDY0LCA+LAorICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9taW5fY3B0CitNSU5fTUFYX0NPTVBYQ0hHX0NQVChmbG9hdDQsIG1heF9jcHQsIGttcF9yZWFsMzIsIDMyLCA8LAorICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tYXhfY3B0CitNSU5fTUFYX0NPTVBYQ0hHX0NQVChmbG9hdDQsIG1pbl9jcHQsIGttcF9yZWFsMzIsIDMyLCA+LAorICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9taW5fY3B0CitNSU5fTUFYX0NPTVBYQ0hHX0NQVChmbG9hdDgsIG1heF9jcHQsIGttcF9yZWFsNjQsIDY0LCA8LAorICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tYXhfY3B0CitNSU5fTUFYX0NPTVBYQ0hHX0NQVChmbG9hdDgsIG1pbl9jcHQsIGttcF9yZWFsNjQsIDY0LCA+LAorICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9taW5fY3B0CisjaWYgS01QX0hBVkVfUVVBRAorTUlOX01BWF9DUklUSUNBTF9DUFQoZmxvYXQxNiwgbWF4X2NwdCwgUVVBRF9MRUdBQ1ksIDwsIDE2ciwKKyAgICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXhfY3B0CitNSU5fTUFYX0NSSVRJQ0FMX0NQVChmbG9hdDE2LCBtaW5fY3B0LCBRVUFEX0xFR0FDWSwgPiwgMTZyLAorICAgICAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X21pbl9jcHQKKyNpZiAoS01QX0FSQ0hfWDg2KQorTUlOX01BWF9DUklUSUNBTF9DUFQoZmxvYXQxNiwgbWF4X2ExNl9jcHQsIFF1YWRfYTE2X3QsIDwsIDE2ciwKKyAgICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXhfYTE2X2NwdAorTUlOX01BWF9DUklUSUNBTF9DUFQoZmxvYXQxNiwgbWluX2ExNl9jcHQsIFF1YWRfYTE2X3QsID4sIDE2ciwKKyAgICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9taXhfYTE2X2NwdAorI2VuZGlmCisjZW5kaWYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfRVFWX0NQVChPUCwgRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ1JJVElDQUxfQ1BUKE9QLCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZWxzZQorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0VRVl9DUFQoT1AsIEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0NNUFhfRVFWX0NQVChUWVBFX0lELCBPUF9JRCwgVFlQRSwgQklUUywgT1AsIEdPTVBfRkxBRykgICAgICAgICBcCisgIEFUT01JQ19CRUdJTl9DUFQoVFlQRV9JRCwgT1BfSUQsIFRZUEUsIFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUWVBFIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT1BfR09NUF9DUklUSUNBTF9FUVZfQ1BUKF49IH4sIEdPTVBfRkxBRykgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgICAgICBcCisgIE9QX0NNUFhDSEdfQ1BUKFRZUEUsIEJJVFMsIE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBVE9NSUNfQ01QWENIR19DUFQoZml4ZWQxLCBuZXF2X2NwdCwga21wX2ludDgsIDgsIF4sCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9uZXF2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKGZpeGVkMiwgbmVxdl9jcHQsIGttcF9pbnQxNiwgMTYsIF4sCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKGZpeGVkNCwgbmVxdl9jcHQsIGttcF9pbnQzMiwgMzIsIF4sCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9uZXF2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKGZpeGVkOCwgbmVxdl9jcHQsIGttcF9pbnQ2NCwgNjQsIF4sCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9uZXF2X2NwdAorQVRPTUlDX0NNUFhfRVFWX0NQVChmaXhlZDEsIGVxdl9jcHQsIGttcF9pbnQ4LCA4LCBefiwKKyAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9lcXZfY3B0CitBVE9NSUNfQ01QWF9FUVZfQ1BUKGZpeGVkMiwgZXF2X2NwdCwga21wX2ludDE2LCAxNiwgXn4sCisgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDJfZXF2X2NwdAorQVRPTUlDX0NNUFhfRVFWX0NQVChmaXhlZDQsIGVxdl9jcHQsIGttcF9pbnQzMiwgMzIsIF5+LAorICAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2Vxdl9jcHQKK0FUT01JQ19DTVBYX0VRVl9DUFQoZml4ZWQ4LCBlcXZfY3B0LCBrbXBfaW50NjQsIDY0LCBefiwKKyAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9lcXZfY3B0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZXMgZm9yIEV4dGVuZGVkIHR5cGVzOiBsb25nIGRvdWJsZSwgX1F1YWQsIGNvbXBsZXggZmxhdm91cnMgKHVzZQorLy8gY3JpdGljYWwgc2VjdGlvbikKKy8vICAgICBUWVBFX0lELCBPUF9JRCwgVFlQRSAtIGRldGFpbGVkIGFib3ZlCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyAgICAgTENLX0lEICAtIGxvY2sgaWRlbnRpZmllciwgdXNlZCB0byBwb3NzaWJseSBkaXN0aW5ndWlzaCBsb2NrIHZhcmlhYmxlCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9DUFQoVFlQRV9JRCwgT1BfSUQsIFRZUEUsIE9QLCBMQ0tfSUQsIEdPTVBfRkxBRykgICAgICAgXAorICBBVE9NSUNfQkVHSU5fQ1BUKFRZUEVfSUQsIE9QX0lELCBUWVBFLCBUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVFlQRSBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE9QX0dPTVBfQ1JJVElDQUxfQ1BUKE9QLCBHT01QX0ZMQUcpIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgICAgICAgICAgICAgXAorICBPUF9DUklUSUNBTF9DUFQoT1AjIyA9LCBMQ0tfSUQpIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFdvcmthcm91bmQgZm9yIGNtcGx4NC4gUmVndWxhciByb3V0aW5lcyB3aXRoIHJldHVybiB2YWx1ZSBkb24ndCB3b3JrCisvLyBvbiBXaW5fMzJlLiBMZXQncyByZXR1cm4gY2FwdHVyZWQgdmFsdWVzIHRocm91Z2ggdGhlIGFkZGl0aW9uYWwgcGFyYW1ldGVyLgorI2RlZmluZSBPUF9DUklUSUNBTF9DUFRfV1JLKE9QLCBMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jaygmQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoZmxhZykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKmxocykgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCpvdXQpID0gKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKm91dCkgPSAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCpsaHMpIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soJkFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm47CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0NQVF9XUksoT1AsIEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMX0NQVF9XUksoT1AjIyA9LCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorI2Vsc2UKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9DUFRfV1JLKE9QLCBGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgQVRPTUlDX0JFR0lOX1dSSyhUWVBFX0lELCBPUF9JRCwgVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgX19rbXBjX2F0b21pY18jI1RZUEVfSUQjI18jI09QX0lEKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKmxocywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFIHJocywgVFlQRSAqb3V0LCBpbnQgZmxhZykgeyAgICAgIFwKKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2luaXRfc2VyaWFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS0FfVFJBQ0UoMTAwLCAoIl9fa21wY19hdG9taWNfIiAjVFlQRV9JRCAiXyIgI09QX0lEICI6IFQjJWRcbiIsIGd0aWQpKTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9DUFRfV1JLKFRZUEVfSUQsIE9QX0lELCBUWVBFLCBPUCwgTENLX0lELCBHT01QX0ZMQUcpICAgXAorICBBVE9NSUNfQkVHSU5fV1JLKFRZUEVfSUQsIE9QX0lELCBUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT1BfR09NUF9DUklUSUNBTF9DUFRfV1JLKE9QLCBHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE9QX0NSSVRJQ0FMX0NQVF9XUksoT1AjIyA9LCBMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisvLyBUaGUgZW5kIG9mIHdvcmthcm91bmQgZm9yIGNtcGx4NAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvLyByb3V0aW5lcyBmb3IgbG9uZyBkb3VibGUgdHlwZQorQVRPTUlDX0NSSVRJQ0FMX0NQVChmbG9hdDEwLCBhZGRfY3B0LCBsb25nIGRvdWJsZSwgKywgMTByLAorICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVChmbG9hdDEwLCBzdWJfY3B0LCBsb25nIGRvdWJsZSwgLSwgMTByLAorICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVChmbG9hdDEwLCBtdWxfY3B0LCBsb25nIGRvdWJsZSwgKiwgMTByLAorICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVChmbG9hdDEwLCBkaXZfY3B0LCBsb25nIGRvdWJsZSwgLywgMTByLAorICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2NwdAorI2lmIEtNUF9IQVZFX1FVQUQKKy8vIHJvdXRpbmVzIGZvciBfUXVhZCB0eXBlCitBVE9NSUNfQ1JJVElDQUxfQ1BUKGZsb2F0MTYsIGFkZF9jcHQsIFFVQURfTEVHQUNZLCArLCAxNnIsCisgICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKGZsb2F0MTYsIHN1Yl9jcHQsIFFVQURfTEVHQUNZLCAtLCAxNnIsCisgICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKGZsb2F0MTYsIG11bF9jcHQsIFFVQURfTEVHQUNZLCAqLCAxNnIsCisgICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWxfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKGZsb2F0MTYsIGRpdl9jcHQsIFFVQURfTEVHQUNZLCAvLCAxNnIsCisgICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfY3B0CisjaWYgKEtNUF9BUkNIX1g4NikKK0FUT01JQ19DUklUSUNBTF9DUFQoZmxvYXQxNiwgYWRkX2ExNl9jcHQsIFF1YWRfYTE2X3QsICssIDE2ciwKKyAgICAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2FkZF9hMTZfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKGZsb2F0MTYsIHN1Yl9hMTZfY3B0LCBRdWFkX2ExNl90LCAtLCAxNnIsCisgICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfYTE2X2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVChmbG9hdDE2LCBtdWxfYTE2X2NwdCwgUXVhZF9hMTZfdCwgKiwgMTZyLAorICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsX2ExNl9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoZmxvYXQxNiwgZGl2X2ExNl9jcHQsIFF1YWRfYTE2X3QsIC8sIDE2ciwKKyAgICAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9hMTZfY3B0CisjZW5kaWYKKyNlbmRpZgorCisvLyByb3V0aW5lcyBmb3IgY29tcGxleCB0eXBlcworCisvLyBjbXBseDQgcm91dGluZXMgdG8gcmV0dXJuIHZvaWQKK0FUT01JQ19DUklUSUNBTF9DUFRfV1JLKGNtcGx4NCwgYWRkX2NwdCwga21wX2NtcGx4MzIsICssIDhjLAorICAgICAgICAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDRfYWRkX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVF9XUksoY21wbHg0LCBzdWJfY3B0LCBrbXBfY21wbHgzMiwgLSwgOGMsCisgICAgICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUX1dSSyhjbXBseDQsIG11bF9jcHQsIGttcF9jbXBseDMyLCAqLCA4YywKKyAgICAgICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfY21wbHg0X211bF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFRfV1JLKGNtcGx4NCwgZGl2X2NwdCwga21wX2NtcGx4MzIsIC8sIDhjLAorICAgICAgICAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NwdAorCitBVE9NSUNfQ1JJVElDQUxfQ1BUKGNtcGx4OCwgYWRkX2NwdCwga21wX2NtcGx4NjQsICssIDE2YywKKyAgICAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDhfYWRkX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVChjbXBseDgsIHN1Yl9jcHQsIGttcF9jbXBseDY0LCAtLCAxNmMsCisgICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoY21wbHg4LCBtdWxfY3B0LCBrbXBfY21wbHg2NCwgKiwgMTZjLAorICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWxfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKGNtcGx4OCwgZGl2X2NwdCwga21wX2NtcGx4NjQsIC8sIDE2YywKKyAgICAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDhfZGl2X2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVChjbXBseDEwLCBhZGRfY3B0LCBrbXBfY21wbHg4MCwgKywgMjBjLAorICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfYWRkX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVChjbXBseDEwLCBzdWJfY3B0LCBrbXBfY21wbHg4MCwgLSwgMjBjLAorICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVChjbXBseDEwLCBtdWxfY3B0LCBrbXBfY21wbHg4MCwgKiwgMjBjLAorICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfbXVsX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVChjbXBseDEwLCBkaXZfY3B0LCBrbXBfY21wbHg4MCwgLywgMjBjLAorICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X2NwdAorI2lmIEtNUF9IQVZFX1FVQUQKK0FUT01JQ19DUklUSUNBTF9DUFQoY21wbHgxNiwgYWRkX2NwdCwgQ1BMWDEyOF9MRUcsICssIDMyYywKKyAgICAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2FkZF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoY21wbHgxNiwgc3ViX2NwdCwgQ1BMWDEyOF9MRUcsIC0sIDMyYywKKyAgICAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoY21wbHgxNiwgbXVsX2NwdCwgQ1BMWDEyOF9MRUcsICosIDMyYywKKyAgICAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X211bF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoY21wbHgxNiwgZGl2X2NwdCwgQ1BMWDEyOF9MRUcsIC8sIDMyYywKKyAgICAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9jcHQKKyNpZiAoS01QX0FSQ0hfWDg2KQorQVRPTUlDX0NSSVRJQ0FMX0NQVChjbXBseDE2LCBhZGRfYTE2X2NwdCwga21wX2NtcGx4MTI4X2ExNl90LCArLCAzMmMsCisgICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfYTE2X2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVChjbXBseDE2LCBzdWJfYTE2X2NwdCwga21wX2NtcGx4MTI4X2ExNl90LCAtLCAzMmMsCisgICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2X2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVChjbXBseDE2LCBtdWxfYTE2X2NwdCwga21wX2NtcGx4MTI4X2ExNl90LCAqLCAzMmMsCisgICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9tdWxfYTE2X2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVChjbXBseDE2LCBkaXZfYTE2X2NwdCwga21wX2NtcGx4MTI4X2ExNl90LCAvLCAzMmMsCisgICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfYTE2X2NwdAorI2VuZGlmCisjZW5kaWYKKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8vIE9wZW5NUCA0LjA6IHYgPSB4ID0gZXhwciBiaW5vcCB4OyB7IHYgPSB4OyB4ID0gZXhwciBiaW5vcCB4OyB9IHsgeCA9IGV4cHIKKy8vIGJpbm9wIHg7IHYgPSB4OyB9ICBmb3Igbm9uLWNvbW11dGF0aXZlIG9wZXJhdGlvbnMuCisvLyBTdXBwb3J0ZWQgb25seSBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgYm91bmQgYnkgY3JpdGljYWwgc2VjdGlvbgorLy8gICAgIE9QICAgICAtIG9wZXJhdG9yIChpdCdzIHN1cHBvc2VkIHRvIGNvbnRhaW4gYW4gYXNzaWdubWVudCkKKy8vICAgICBMQ0tfSUQgLSBsb2NrIGlkZW50aWZpZXIKKy8vIE5vdGU6IGRvbid0IGNoZWNrIGd0aWQgYXMgaXQgc2hvdWxkIGFsd2F5cyBiZSB2YWxpZAorLy8gMSwgMi1ieXRlIC0gZXhwZWN0IHZhbGlkIHBhcmFtZXRlciwgb3RoZXIgLSBjaGVjayBiZWZvcmUgdGhpcyBtYWNybworI2RlZmluZSBPUF9DUklUSUNBTF9DUFRfUkVWKE9QLCBMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jaygmQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoZmxhZykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKnRlbXBfdmFsID0gKCpsaHMpOyovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCpsaHMpID0gKHJocylPUCgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5ld192YWx1ZSA9ICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbmV3X3ZhbHVlID0gKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgqbGhzKSA9IChyaHMpT1AoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soJkFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gbmV3X3ZhbHVlOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9DUFRfUkVWKE9QLCBGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICgoRkxBRykgJiYgKF9fa21wX2F0b21pY19tb2RlID09IDIpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DUklUSUNBTF9DUFRfUkVWKE9QLCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNlbHNlCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfQ1BUX1JFVihPUCwgRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIHVzaW5nICJjb21wYXJlX2FuZF9zdG9yZSIgcm91dGluZQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorLy8gICAgIEJJVFMgICAgLSBzaXplIGluIGJpdHMsIHVzZWQgdG8gZGlzdGluZ3Vpc2ggbG93IGxldmVsIGNhbGxzCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyBOb3RlOiB0ZW1wX3ZhbCBpbnRyb2R1Y2VkIGluIG9yZGVyIHRvIGZvcmNlIHRoZSBjb21waWxlciB0byByZWFkCisvLyAgICAgICAqbGhzIG9ubHkgb25jZSAody9vIGl0IHRoZSBjb21waWxlciByZWFkcyAqbGhzIHR3aWNlKQorI2RlZmluZSBPUF9DTVBYQ0hHX0NQVF9SRVYoVFlQRSwgQklUUywgT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5ld192YWx1ZSA9IHJocyBPUCBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3aGlsZSAoIUtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EjI0JJVFMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChrbXBfaW50IyNCSVRTICopbGhzLCAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICYgb2xkX3ZhbHVlLCAgICAgXAorICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICYgbmV3X3ZhbHVlKSkgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEtNUF9DUFVfUEFVU0UoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBuZXdfdmFsdWUgPSByaHMgT1Agb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZmxhZykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19DUFRfUkVWKFRZUEVfSUQsIE9QX0lELCBUWVBFLCBCSVRTLCBPUCwgR09NUF9GTEFHKSAgICAgIFwKKyAgQVRPTUlDX0JFR0lOX0NQVChUWVBFX0lELCBPUF9JRCwgVFlQRSwgVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRZUEUgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUWVBFIEtNUF9BVE9NSUNfVk9MQVRJTEUgdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT1BfR09NUF9DUklUSUNBTF9DUFRfUkVWKE9QLCBHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE9QX0NNUFhDSEdfQ1BUX1JFVihUWVBFLCBCSVRTLCBPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoZml4ZWQxLCBkaXZfY3B0X3Jldiwga21wX2ludDgsIDgsIC8sCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoZml4ZWQxdSwgZGl2X2NwdF9yZXYsIGttcF91aW50OCwgOCwgLywKKyAgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoZml4ZWQxLCBzaGxfY3B0X3Jldiwga21wX2ludDgsIDgsIDw8LAorICAgICAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3NobF9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKGZpeGVkMSwgc2hyX2NwdF9yZXYsIGttcF9pbnQ4LCA4LCA+PiwKKyAgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFVihmaXhlZDF1LCBzaHJfY3B0X3Jldiwga21wX3VpbnQ4LCA4LCA+PiwKKyAgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoZml4ZWQxLCBzdWJfY3B0X3Jldiwga21wX2ludDgsIDgsIC0sCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoZml4ZWQyLCBkaXZfY3B0X3Jldiwga21wX2ludDE2LCAxNiwgLywKKyAgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFVihmaXhlZDJ1LCBkaXZfY3B0X3Jldiwga21wX3VpbnQxNiwgMTYsIC8sCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKGZpeGVkMiwgc2hsX2NwdF9yZXYsIGttcF9pbnQxNiwgMTYsIDw8LAorICAgICAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3NobF9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKGZpeGVkMiwgc2hyX2NwdF9yZXYsIGttcF9pbnQxNiwgMTYsID4+LAorICAgICAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3Nocl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKGZpeGVkMnUsIHNocl9jcHRfcmV2LCBrbXBfdWludDE2LCAxNiwgPj4sCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKGZpeGVkMiwgc3ViX2NwdF9yZXYsIGttcF9pbnQxNiwgMTYsIC0sCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoZml4ZWQ0LCBkaXZfY3B0X3Jldiwga21wX2ludDMyLCAzMiwgLywKKyAgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFVihmaXhlZDR1LCBkaXZfY3B0X3Jldiwga21wX3VpbnQzMiwgMzIsIC8sCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKGZpeGVkNCwgc2hsX2NwdF9yZXYsIGttcF9pbnQzMiwgMzIsIDw8LAorICAgICAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobF9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKGZpeGVkNCwgc2hyX2NwdF9yZXYsIGttcF9pbnQzMiwgMzIsID4+LAorICAgICAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3Nocl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKGZpeGVkNHUsIHNocl9jcHRfcmV2LCBrbXBfdWludDMyLCAzMiwgPj4sCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X3Nocl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKGZpeGVkNCwgc3ViX2NwdF9yZXYsIGttcF9pbnQzMiwgMzIsIC0sCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoZml4ZWQ4LCBkaXZfY3B0X3Jldiwga21wX2ludDY0LCA2NCwgLywKKyAgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFVihmaXhlZDh1LCBkaXZfY3B0X3Jldiwga21wX3VpbnQ2NCwgNjQsIC8sCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKGZpeGVkOCwgc2hsX2NwdF9yZXYsIGttcF9pbnQ2NCwgNjQsIDw8LAorICAgICAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKGZpeGVkOCwgc2hyX2NwdF9yZXYsIGttcF9pbnQ2NCwgNjQsID4+LAorICAgICAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3Nocl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKGZpeGVkOHUsIHNocl9jcHRfcmV2LCBrbXBfdWludDY0LCA2NCwgPj4sCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDh1X3Nocl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKGZpeGVkOCwgc3ViX2NwdF9yZXYsIGttcF9pbnQ2NCwgNjQsIC0sCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoZmxvYXQ0LCBkaXZfY3B0X3Jldiwga21wX3JlYWwzMiwgMzIsIC8sCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoZmxvYXQ0LCBzdWJfY3B0X3Jldiwga21wX3JlYWwzMiwgMzIsIC0sCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoZmxvYXQ4LCBkaXZfY3B0X3Jldiwga21wX3JlYWw2NCwgNjQsIC8sCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoZmxvYXQ4LCBzdWJfY3B0X3Jldiwga21wX3JlYWw2NCwgNjQsIC0sCisgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdF9yZXYKKy8vICAgICAgICAgICAgICBUWVBFX0lELE9QX0lELCBUWVBFLCAgICAgICAgICBPUCwgIEdPTVBfRkxBRworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBFeHRlbmRlZCB0eXBlczogbG9uZyBkb3VibGUsIF9RdWFkLCBjb21wbGV4IGZsYXZvdXJzICh1c2UKKy8vIGNyaXRpY2FsIHNlY3Rpb24pCisvLyAgICAgVFlQRV9JRCwgT1BfSUQsIFRZUEUgLSBkZXRhaWxlZCBhYm92ZQorLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorLy8gICAgIExDS19JRCAgLSBsb2NrIGlkZW50aWZpZXIsIHVzZWQgdG8gcG9zc2libHkgZGlzdGluZ3Vpc2ggbG9jayB2YXJpYWJsZQorI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFVihUWVBFX0lELCBPUF9JRCwgVFlQRSwgT1AsIExDS19JRCwgR09NUF9GTEFHKSAgIFwKKyAgQVRPTUlDX0JFR0lOX0NQVChUWVBFX0lELCBPUF9JRCwgVFlQRSwgVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRZUEUgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUWVBFIEtNUF9BVE9NSUNfVk9MQVRJTEUgdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLypwcmludGYoIl9fa21wX2F0b21pY19tb2RlID0gJWRcbiIsIF9fa21wX2F0b21pY19tb2RlKTsqLyAgICAgICAgICAgICAgICAgICBcCisgIE9QX0dPTVBfQ1JJVElDQUxfQ1BUX1JFVihPUCwgR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBPUF9DUklUSUNBTF9DUFRfUkVWKE9QLCBMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvLyByb3V0aW5lcyBmb3IgbG9uZyBkb3VibGUgdHlwZQorQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoZmxvYXQxMCwgc3ViX2NwdF9yZXYsIGxvbmcgZG91YmxlLCAtLCAxMHIsCisgICAgICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2NwdF9yZXYKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWKGZsb2F0MTAsIGRpdl9jcHRfcmV2LCBsb25nIGRvdWJsZSwgLywgMTByLAorICAgICAgICAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9jcHRfcmV2CisjaWYgS01QX0hBVkVfUVVBRAorLy8gcm91dGluZXMgZm9yIF9RdWFkIHR5cGUKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWKGZsb2F0MTYsIHN1Yl9jcHRfcmV2LCBRVUFEX0xFR0FDWSwgLSwgMTZyLAorICAgICAgICAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9jcHRfcmV2CitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFVihmbG9hdDE2LCBkaXZfY3B0X3JldiwgUVVBRF9MRUdBQ1ksIC8sIDE2ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfY3B0X3JldgorI2lmIChLTVBfQVJDSF9YODYpCitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFVihmbG9hdDE2LCBzdWJfYTE2X2NwdF9yZXYsIFF1YWRfYTE2X3QsIC0sIDE2ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfYTE2X2NwdF9yZXYKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWKGZsb2F0MTYsIGRpdl9hMTZfY3B0X3JldiwgUXVhZF9hMTZfdCwgLywgMTZyLAorICAgICAgICAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9hMTZfY3B0X3JldgorI2VuZGlmCisjZW5kaWYKKworLy8gcm91dGluZXMgZm9yIGNvbXBsZXggdHlwZXMKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBXb3JrYXJvdW5kIGZvciBjbXBseDQuIFJlZ3VsYXIgcm91dGluZXMgd2l0aCByZXR1cm4gdmFsdWUgZG9uJ3Qgd29yaworLy8gb24gV2luXzMyZS4gTGV0J3MgcmV0dXJuIGNhcHR1cmVkIHZhbHVlcyB0aHJvdWdoIHRoZSBhZGRpdGlvbmFsIHBhcmFtZXRlci4KKyNkZWZpbmUgT1BfQ1JJVElDQUxfQ1BUX1JFVl9XUksoT1AsIExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soJkFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGZsYWcpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCpsaHMpID0gKHJocylPUCgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgqb3V0KSA9ICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCpvdXQpID0gKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgqbGhzKSA9IChyaHMpT1AoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCZBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuOworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9DUFRfUkVWX1dSSyhPUCwgRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICgoRkxBRykgJiYgKF9fa21wX2F0b21pY19tb2RlID09IDIpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DUklUSUNBTF9DUFRfUkVWX1dSSyhPUCwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNlbHNlCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfQ1BUX1JFVl9XUksoT1AsIEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFVl9XUksoVFlQRV9JRCwgT1BfSUQsIFRZUEUsIE9QLCBMQ0tfSUQsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFUT01JQ19CRUdJTl9XUksoVFlQRV9JRCwgT1BfSUQsIFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBPUF9HT01QX0NSSVRJQ0FMX0NQVF9SRVZfV1JLKE9QLCBHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT1BfQ1JJVElDQUxfQ1BUX1JFVl9XUksoT1AsIExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKy8vIFRoZSBlbmQgb2Ygd29ya2Fyb3VuZCBmb3IgY21wbHg0CisKKy8vICEhISBUT0RPOiBjaGVjayBpZiB3ZSBuZWVkIHRvIHJldHVybiB2b2lkIGZvciBjbXBseDQgcm91dGluZXMKKy8vIGNtcGx4NCByb3V0aW5lcyB0byByZXR1cm4gdm9pZAorQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVZfV1JLKGNtcGx4NCwgc3ViX2NwdF9yZXYsIGttcF9jbXBseDMyLCAtLCA4YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfY3B0X3JldgorQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVZfV1JLKGNtcGx4NCwgZGl2X2NwdF9yZXYsIGttcF9jbXBseDMyLCAvLCA4YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY3B0X3JldgorCitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFVihjbXBseDgsIHN1Yl9jcHRfcmV2LCBrbXBfY21wbHg2NCwgLSwgMTZjLAorICAgICAgICAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDhfc3ViX2NwdF9yZXYKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWKGNtcGx4OCwgZGl2X2NwdF9yZXYsIGttcF9jbXBseDY0LCAvLCAxNmMsCisgICAgICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXZfY3B0X3JldgorQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoY21wbHgxMCwgc3ViX2NwdF9yZXYsIGttcF9jbXBseDgwLCAtLCAyMGMsCisgICAgICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViX2NwdF9yZXYKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWKGNtcGx4MTAsIGRpdl9jcHRfcmV2LCBrbXBfY21wbHg4MCwgLywgMjBjLAorICAgICAgICAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX2Rpdl9jcHRfcmV2CisjaWYgS01QX0hBVkVfUVVBRAorQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoY21wbHgxNiwgc3ViX2NwdF9yZXYsIENQTFgxMjhfTEVHLCAtLCAzMmMsCisgICAgICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2NwdF9yZXYKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWKGNtcGx4MTYsIGRpdl9jcHRfcmV2LCBDUExYMTI4X0xFRywgLywgMzJjLAorICAgICAgICAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9jcHRfcmV2CisjaWYgKEtNUF9BUkNIX1g4NikKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWKGNtcGx4MTYsIHN1Yl9hMTZfY3B0X3Jldiwga21wX2NtcGx4MTI4X2ExNl90LCAtLCAzMmMsCisgICAgICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNl9jcHRfcmV2CitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFVihjbXBseDE2LCBkaXZfYTE2X2NwdF9yZXYsIGttcF9jbXBseDEyOF9hMTZfdCwgLywgMzJjLAorICAgICAgICAgICAgICAgICAgICAgICAgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTZfY3B0X3JldgorI2VuZGlmCisjZW5kaWYKKworLy8gQ2FwdHVyZSByZXZlcnNlIGZvciBtaXhlZCB0eXBlOiBSSFM9ZmxvYXQxNgorI2lmIEtNUF9IQVZFX1FVQUQKKworLy8gQmVnaW5uaW5nIG9mIGEgZGVmaW5pdGlvbiAocHJvdmlkZXMgbmFtZSwgcGFyYW1ldGVycywgZ2VidWcgdHJhY2UpCisvLyAgICAgVFlQRV9JRCAtIG9wZXJhbmRzIHR5cGUgYW5kIHNpemUgKGZpeGVkKiwgZml4ZWQqdSBmb3Igc2lnbmVkLCB1bnNpZ25lZAorLy8gICAgIGZpeGVkKQorLy8gICAgIE9QX0lEICAgLSBvcGVyYXRpb24gaWRlbnRpZmllciAoYWRkLCBzdWIsIG11bCwgLi4uKQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19DUFRfUkVWX01JWChUWVBFX0lELCBUWVBFLCBPUF9JRCwgQklUUywgT1AsIFJUWVBFX0lELCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRZUEUsIExDS19JRCwgTUFTSywgR09NUF9GTEFHKSAgICAgICAgICAgICBcCisgIEFUT01JQ19CRUdJTl9DUFRfTUlYKFRZUEVfSUQsIE9QX0lELCBUWVBFLCBSVFlQRV9JRCwgUlRZUEUpICAgICAgICAgICAgICAgICAgXAorICBUWVBFIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT1BfR09NUF9DUklUSUNBTF9DUFRfUkVWKE9QLCBHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE9QX0NNUFhDSEdfQ1BUX1JFVihUWVBFLCBCSVRTLCBPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVZfTUlYKFRZUEVfSUQsIFRZUEUsIE9QX0lELCBPUCwgUlRZUEVfSUQsIFJUWVBFLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQ0tfSUQsIEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBVE9NSUNfQkVHSU5fQ1BUX01JWChUWVBFX0lELCBPUF9JRCwgVFlQRSwgUlRZUEVfSUQsIFJUWVBFKSAgICAgICAgICAgICAgICAgIFwKKyAgVFlQRSBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIE9QX0dPTVBfQ1JJVElDQUxfQ1BUX1JFVihPUCwgR09NUF9GTEFHKSAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICAgICAgXAorICBPUF9DUklUSUNBTF9DUFRfUkVWKE9QLCBMQ0tfSUQpIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCitBVE9NSUNfQ01QWENIR19DUFRfUkVWX01JWChmaXhlZDEsIGNoYXIsIHN1Yl9jcHRfcmV2LCA4LCAtLCBmcCwgX1F1YWQsIDFpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfY3B0X3Jldl9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFVl9NSVgoZml4ZWQxdSwgdWNoYXIsIHN1Yl9jcHRfcmV2LCA4LCAtLCBmcCwgX1F1YWQsIDFpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc3ViX2NwdF9yZXZfZnAKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVZfTUlYKGZpeGVkMSwgY2hhciwgZGl2X2NwdF9yZXYsIDgsIC8sIGZwLCBfUXVhZCwgMWksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9jcHRfcmV2X2ZwCitBVE9NSUNfQ01QWENIR19DUFRfUkVWX01JWChmaXhlZDF1LCB1Y2hhciwgZGl2X2NwdF9yZXYsIDgsIC8sIGZwLCBfUXVhZCwgMWksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfY3B0X3Jldl9mcAorCitBVE9NSUNfQ01QWENIR19DUFRfUkVWX01JWChmaXhlZDIsIHNob3J0LCBzdWJfY3B0X3JldiwgMTYsIC0sIGZwLCBfUXVhZCwgMmksIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9jcHRfcmV2X2ZwCitBVE9NSUNfQ01QWENIR19DUFRfUkVWX01JWChmaXhlZDJ1LCB1c2hvcnQsIHN1Yl9jcHRfcmV2LCAxNiwgLSwgZnAsIF9RdWFkLCAyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQydV9zdWJfY3B0X3Jldl9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFVl9NSVgoZml4ZWQyLCBzaG9ydCwgZGl2X2NwdF9yZXYsIDE2LCAvLCBmcCwgX1F1YWQsIDJpLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfY3B0X3Jldl9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFVl9NSVgoZml4ZWQydSwgdXNob3J0LCBkaXZfY3B0X3JldiwgMTYsIC8sIGZwLCBfUXVhZCwgMmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2NwdF9yZXZfZnAKKworQVRPTUlDX0NNUFhDSEdfQ1BUX1JFVl9NSVgoZml4ZWQ0LCBrbXBfaW50MzIsIHN1Yl9jcHRfcmV2LCAzMiwgLSwgZnAsIF9RdWFkLCA0aSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsIDApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9jcHRfcmV2X2ZwCitBVE9NSUNfQ01QWENIR19DUFRfUkVWX01JWChmaXhlZDR1LCBrbXBfdWludDMyLCBzdWJfY3B0X3JldiwgMzIsIC0sIGZwLCBfUXVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDRpLCAzLCAwKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc3ViX2NwdF9yZXZfZnAKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVZfTUlYKGZpeGVkNCwga21wX2ludDMyLCBkaXZfY3B0X3JldiwgMzIsIC8sIGZwLCBfUXVhZCwgNGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAzLCAwKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfY3B0X3Jldl9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFVl9NSVgoZml4ZWQ0dSwga21wX3VpbnQzMiwgZGl2X2NwdF9yZXYsIDMyLCAvLCBmcCwgX1F1YWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICA0aSwgMywgMCkgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9jcHRfcmV2X2ZwCisKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVZfTUlYKGZpeGVkOCwga21wX2ludDY0LCBzdWJfY3B0X3JldiwgNjQsIC0sIGZwLCBfUXVhZCwgOGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfY3B0X3Jldl9mcAorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFVl9NSVgoZml4ZWQ4dSwga21wX3VpbnQ2NCwgc3ViX2NwdF9yZXYsIDY0LCAtLCBmcCwgX1F1YWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICA4aSwgNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDh1X3N1Yl9jcHRfcmV2X2ZwCitBVE9NSUNfQ01QWENIR19DUFRfUkVWX01JWChmaXhlZDgsIGttcF9pbnQ2NCwgZGl2X2NwdF9yZXYsIDY0LCAvLCBmcCwgX1F1YWQsIDhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2NwdF9yZXZfZnAKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVZfTUlYKGZpeGVkOHUsIGttcF91aW50NjQsIGRpdl9jcHRfcmV2LCA2NCwgLywgZnAsIF9RdWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOGksIDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfY3B0X3Jldl9mcAorCitBVE9NSUNfQ01QWENIR19DUFRfUkVWX01JWChmbG9hdDQsIGttcF9yZWFsMzIsIHN1Yl9jcHRfcmV2LCAzMiwgLSwgZnAsIF9RdWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgNHIsIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHRfcmV2X2ZwCitBVE9NSUNfQ01QWENIR19DUFRfUkVWX01JWChmbG9hdDQsIGttcF9yZWFsMzIsIGRpdl9jcHRfcmV2LCAzMiwgLywgZnAsIF9RdWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgNHIsIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9jcHRfcmV2X2ZwCisKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVZfTUlYKGZsb2F0OCwga21wX3JlYWw2NCwgc3ViX2NwdF9yZXYsIDY0LCAtLCBmcCwgX1F1YWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICA4ciwgNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdF9yZXZfZnAKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVZfTUlYKGZsb2F0OCwga21wX3JlYWw2NCwgZGl2X2NwdF9yZXYsIDY0LCAvLCBmcCwgX1F1YWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICA4ciwgNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2NwdF9yZXZfZnAKKworQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVZfTUlYKGZsb2F0MTAsIGxvbmcgZG91YmxlLCBzdWJfY3B0X3JldiwgLSwgZnAsIF9RdWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwciwgMSkgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9jcHRfcmV2X2ZwCitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFVl9NSVgoZmxvYXQxMCwgbG9uZyBkb3VibGUsIGRpdl9jcHRfcmV2LCAvLCBmcCwgX1F1YWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTByLCAxKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2NwdF9yZXZfZnAKKworI2VuZGlmIC8vIEtNUF9IQVZFX1FVQUQKKworLy8gICBPcGVuTVAgNC4wIENhcHR1cmUtd3JpdGUgKHN3YXApOiB7diA9IHg7IHggPSBleHByO30KKworI2RlZmluZSBBVE9NSUNfQkVHSU5fU1dQKFRZUEVfSUQsIFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVFlQRSBfX2ttcGNfYXRvbWljXyMjVFlQRV9JRCMjX3N3cChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICpsaHMsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRSByaHMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfaW5pdF9zZXJpYWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLQV9UUkFDRSgxMDAsICgiX19rbXBjX2F0b21pY18iICNUWVBFX0lEICJfc3dwOiBUIyVkXG4iLCBndGlkKSk7CisKKyNkZWZpbmUgQ1JJVElDQUxfU1dQKExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soJkFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb2xkX3ZhbHVlID0gKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgqbGhzKSA9IHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jaygmQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJldHVybiBvbGRfdmFsdWU7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBHT01QX0NSSVRJQ0FMX1NXUChGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENSSVRJQ0FMX1NXUCgwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorI2Vsc2UKKyNkZWZpbmUgR09NUF9DUklUSUNBTF9TV1AoRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworI2RlZmluZSBBVE9NSUNfWENIR19TV1AoVFlQRV9JRCwgVFlQRSwgQklUUywgR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQVRPTUlDX0JFR0lOX1NXUChUWVBFX0lELCBUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRZUEUgb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHT01QX0NSSVRJQ0FMX1NXUChHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb2xkX3ZhbHVlID0gS01QX1hDSEdfRklYRUQjI0JJVFMobGhzLCByaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJldHVybiBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX1hDSEdfRkxPQVRfU1dQKFRZUEVfSUQsIFRZUEUsIEJJVFMsIEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICBcCisgIEFUT01JQ19CRUdJTl9TV1AoVFlQRV9JRCwgVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUWVBFIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR09NUF9DUklUSUNBTF9TV1AoR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG9sZF92YWx1ZSA9IEtNUF9YQ0hHX1JFQUwjI0JJVFMobGhzLCByaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQ01QWENIR19TV1AoVFlQRSwgQklUUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgS01QX0FUT01JQ19WT0xBVElMRSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBuZXdfdmFsdWUgPSByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKCFLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRIyNCSVRTKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoa21wX2ludCMjQklUUyAqKWxocywgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmIG9sZF92YWx1ZSwgICAgIFwKKyAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmIG5ld192YWx1ZSkpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBLTVBfQ1BVX1BBVVNFKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbmV3X3ZhbHVlID0gcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfU1dQKFRZUEVfSUQsIFRZUEUsIEJJVFMsIEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICBcCisgIEFUT01JQ19CRUdJTl9TV1AoVFlQRV9JRCwgVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUWVBFIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR09NUF9DUklUSUNBTF9TV1AoR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIENNUFhDSEdfU1dQKFRZUEUsIEJJVFMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKK0FUT01JQ19YQ0hHX1NXUChmaXhlZDEsIGttcF9pbnQ4LCA4LCBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3N3cAorQVRPTUlDX1hDSEdfU1dQKGZpeGVkMiwga21wX2ludDE2LCAxNiwgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zd3AKK0FUT01JQ19YQ0hHX1NXUChmaXhlZDQsIGttcF9pbnQzMiwgMzIsIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc3dwCisKK0FUT01JQ19YQ0hHX0ZMT0FUX1NXUChmbG9hdDQsIGttcF9yZWFsMzIsIDMyLAorICAgICAgICAgICAgICAgICAgICAgIEtNUF9BUkNIX1g4NikgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfc3dwCisKKyNpZiAoS01QX0FSQ0hfWDg2KQorQVRPTUlDX0NNUFhDSEdfU1dQKGZpeGVkOCwga21wX2ludDY0LCA2NCwKKyAgICAgICAgICAgICAgICAgICBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3N3cAorQVRPTUlDX0NNUFhDSEdfU1dQKGZsb2F0OCwga21wX3JlYWw2NCwgNjQsCisgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zd3AKKyNlbHNlCitBVE9NSUNfWENIR19TV1AoZml4ZWQ4LCBrbXBfaW50NjQsIDY0LCBLTVBfQVJDSF9YODYpIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3N3cAorQVRPTUlDX1hDSEdfRkxPQVRfU1dQKGZsb2F0OCwga21wX3JlYWw2NCwgNjQsCisgICAgICAgICAgICAgICAgICAgICAgS01QX0FSQ0hfWDg2KSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zd3AKKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBFeHRlbmRlZCB0eXBlczogbG9uZyBkb3VibGUsIF9RdWFkLCBjb21wbGV4IGZsYXZvdXJzICh1c2UKKy8vIGNyaXRpY2FsIHNlY3Rpb24pCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9TV1AoVFlQRV9JRCwgVFlQRSwgTENLX0lELCBHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgXAorICBBVE9NSUNfQkVHSU5fU1dQKFRZUEVfSUQsIFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVFlQRSBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEdPTVBfQ1JJVElDQUxfU1dQKEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBDUklUSUNBTF9TV1AoTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICEhISBUT0RPOiBjaGVjayBpZiB3ZSBuZWVkIHRvIHJldHVybiB2b2lkIGZvciBjbXBseDQgcm91dGluZXMKKy8vIFdvcmthcm91bmQgZm9yIGNtcGx4NC4gUmVndWxhciByb3V0aW5lcyB3aXRoIHJldHVybiB2YWx1ZSBkb24ndCB3b3JrCisvLyBvbiBXaW5fMzJlLiBMZXQncyByZXR1cm4gY2FwdHVyZWQgdmFsdWVzIHRocm91Z2ggdGhlIGFkZGl0aW9uYWwgcGFyYW1ldGVyLgorCisjZGVmaW5lIEFUT01JQ19CRUdJTl9TV1BfV1JLKFRZUEVfSUQsIFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIF9fa21wY19hdG9taWNfIyNUWVBFX0lEIyNfc3dwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKmxocywgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFIHJocywgVFlQRSAqb3V0KSB7ICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9pbml0X3NlcmlhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcGNfYXRvbWljXyIgI1RZUEVfSUQgIl9zd3A6IFQjJWRcbiIsIGd0aWQpKTsKKworI2RlZmluZSBDUklUSUNBTF9TV1BfV1JLKExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jaygmQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0bXAgPSAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCpsaHMpID0gKHJocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgqb3V0KSA9IHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCZBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuOworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyNkZWZpbmUgR09NUF9DUklUSUNBTF9TV1BfV1JLKEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICgoRkxBRykgJiYgKF9fa21wX2F0b21pY19tb2RlID09IDIpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDUklUSUNBTF9TV1BfV1JLKDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNlbHNlCisjZGVmaW5lIEdPTVBfQ1JJVElDQUxfU1dQX1dSSyhGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMX1NXUF9XUksoVFlQRV9JRCwgVFlQRSwgTENLX0lELCBHT01QX0ZMQUcpICAgICAgICAgICAgICBcCisgIEFUT01JQ19CRUdJTl9TV1BfV1JLKFRZUEVfSUQsIFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUWVBFIHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR09NUF9DUklUSUNBTF9TV1BfV1JLKEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIENSSVRJQ0FMX1NXUF9XUksoTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisvLyBUaGUgZW5kIG9mIHdvcmthcm91bmQgZm9yIGNtcGx4NAorCitBVE9NSUNfQ1JJVElDQUxfU1dQKGZsb2F0MTAsIGxvbmcgZG91YmxlLCAxMHIsIDEpIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9zd3AKKyNpZiBLTVBfSEFWRV9RVUFECitBVE9NSUNfQ1JJVElDQUxfU1dQKGZsb2F0MTYsIFFVQURfTEVHQUNZLCAxNnIsIDEpIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9zd3AKKyNlbmRpZgorLy8gY21wbHg0IHJvdXRpbmUgdG8gcmV0dXJuIHZvaWQKK0FUT01JQ19DUklUSUNBTF9TV1BfV1JLKGNtcGx4NCwga21wX2NtcGx4MzIsIDhjLCAxKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9zd3AKKworLy8gQVRPTUlDX0NSSVRJQ0FMX1NXUCggY21wbHg0LCBrbXBfY21wbHgzMiwgIDhjLCAgIDEgKSAgICAgICAgICAgLy8KKy8vIF9fa21wY19hdG9taWNfY21wbHg0X3N3cAorCitBVE9NSUNfQ1JJVElDQUxfU1dQKGNtcGx4OCwga21wX2NtcGx4NjQsIDE2YywgMSkgLy8gX19rbXBjX2F0b21pY19jbXBseDhfc3dwCitBVE9NSUNfQ1JJVElDQUxfU1dQKGNtcGx4MTAsIGttcF9jbXBseDgwLCAyMGMsIDEpIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9zd3AKKyNpZiBLTVBfSEFWRV9RVUFECitBVE9NSUNfQ1JJVElDQUxfU1dQKGNtcGx4MTYsIENQTFgxMjhfTEVHLCAzMmMsIDEpIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9zd3AKKyNpZiAoS01QX0FSQ0hfWDg2KQorQVRPTUlDX0NSSVRJQ0FMX1NXUChmbG9hdDE2X2ExNiwgUXVhZF9hMTZfdCwgMTZyLAorICAgICAgICAgICAgICAgICAgICAxKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYTE2X3N3cAorQVRPTUlDX0NSSVRJQ0FMX1NXUChjbXBseDE2X2ExNiwga21wX2NtcGx4MTI4X2ExNl90LCAzMmMsCisgICAgICAgICAgICAgICAgICAgIDEpIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9hMTZfc3dwCisjZW5kaWYKKyNlbmRpZgorCisvLyBFbmQgb2YgT3Blbk1QIDQuMCBDYXB0dXJlCisKKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisjZW5kaWYgLy8gS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisjdW5kZWYgT1BfQ1JJVElDQUwKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBHZW5lcmljIGF0b21pYyByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwordm9pZCBfX2ttcGNfYXRvbWljXzEoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCAqbGhzLCB2b2lkICpyaHMsCisgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZikodm9pZCAqLCB2b2lkICosIHZvaWQgKikpIHsKKyAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9pbml0X3NlcmlhbCk7CisKKyAgaWYgKAorI2lmIEtNUF9BUkNIX1g4NiAmJiBkZWZpbmVkKEtNUF9HT01QX0NPTVBBVCkKKyAgICAgIEZBTFNFIC8qIG11c3QgdXNlIGxvY2sgKi8KKyNlbHNlCisgICAgICBUUlVFCisjZW5kaWYKKyAgICAgICkgeworICAgIGttcF9pbnQ4IG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgICAgb2xkX3ZhbHVlID0gKihrbXBfaW50OCAqKWxoczsKKyAgICAoKmYpKCZuZXdfdmFsdWUsICZvbGRfdmFsdWUsIHJocyk7CisKKyAgICAvKiBUT0RPOiBTaG91bGQgdGhpcyBiZSBhY3F1aXJlIG9yIHJlbGVhc2U/ICovCisgICAgd2hpbGUgKCFLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNROCgoa21wX2ludDggKilsaHMsICooa21wX2ludDggKikmb2xkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihrbXBfaW50OCAqKSZuZXdfdmFsdWUpKSB7CisgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisKKyAgICAgIG9sZF92YWx1ZSA9ICooa21wX2ludDggKilsaHM7CisgICAgICAoKmYpKCZuZXdfdmFsdWUsICZvbGRfdmFsdWUsIHJocyk7CisgICAgfQorCisgICAgcmV0dXJuOworICB9IGVsc2UgeworLy8gQWxsIDEtYnl0ZSBkYXRhIGlzIG9mIGludGVnZXIgZGF0YSB0eXBlLgorCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgaWYgKF9fa21wX2F0b21pY19tb2RlID09IDIpIHsKKyAgICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soJl9fa21wX2F0b21pY19sb2NrLCBndGlkKTsKKyAgICB9IGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyAgICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soJl9fa21wX2F0b21pY19sb2NrXzFpLCBndGlkKTsKKworICAgICgqZikobGhzLCBsaHMsIHJocyk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICBpZiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgeworICAgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jaygmX19rbXBfYXRvbWljX2xvY2ssIGd0aWQpOworICAgIH0gZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworICAgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jaygmX19rbXBfYXRvbWljX2xvY2tfMWksIGd0aWQpOworICB9Cit9CisKK3ZvaWQgX19rbXBjX2F0b21pY18yKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQgKmxocywgdm9pZCAqcmhzLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmYpKHZvaWQgKiwgdm9pZCAqLCB2b2lkICopKSB7CisgIGlmICgKKyNpZiBLTVBfQVJDSF9YODYgJiYgZGVmaW5lZChLTVBfR09NUF9DT01QQVQpCisgICAgICBGQUxTRSAvKiBtdXN0IHVzZSBsb2NrICovCisjZWxpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgICBUUlVFIC8qIG5vIGFsaWdubWVudCBwcm9ibGVtcyAqLworI2Vsc2UKKyAgICAgICEoKGttcF91aW50cHRyX3QpbGhzICYgMHgxKSAvKiBtYWtlIHN1cmUgYWRkcmVzcyBpcyAyLWJ5dGUgYWxpZ25lZCAqLworI2VuZGlmCisgICAgICApIHsKKyAgICBrbXBfaW50MTYgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSAqKGttcF9pbnQxNiAqKWxoczsKKyAgICAoKmYpKCZuZXdfdmFsdWUsICZvbGRfdmFsdWUsIHJocyk7CisKKyAgICAvKiBUT0RPOiBTaG91bGQgdGhpcyBiZSBhY3F1aXJlIG9yIHJlbGVhc2U/ICovCisgICAgd2hpbGUgKCFLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMTYoCisgICAgICAgIChrbXBfaW50MTYgKilsaHMsICooa21wX2ludDE2ICopJm9sZF92YWx1ZSwgKihrbXBfaW50MTYgKikmbmV3X3ZhbHVlKSkgeworICAgICAgS01QX0NQVV9QQVVTRSgpOworCisgICAgICBvbGRfdmFsdWUgPSAqKGttcF9pbnQxNiAqKWxoczsKKyAgICAgICgqZikoJm5ld192YWx1ZSwgJm9sZF92YWx1ZSwgcmhzKTsKKyAgICB9CisKKyAgICByZXR1cm47CisgIH0gZWxzZSB7CisvLyBBbGwgMi1ieXRlIGRhdGEgaXMgb2YgaW50ZWdlciBkYXRhIHR5cGUuCisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICBpZiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgeworICAgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jaygmX19rbXBfYXRvbWljX2xvY2ssIGd0aWQpOworICAgIH0gZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworICAgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jaygmX19rbXBfYXRvbWljX2xvY2tfMmksIGd0aWQpOworCisgICAgKCpmKShsaHMsIGxocywgcmhzKTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgIGlmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSB7CisgICAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCZfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCk7CisgICAgfSBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisgICAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCZfX2ttcF9hdG9taWNfbG9ja18yaSwgZ3RpZCk7CisgIH0KK30KKwordm9pZCBfX2ttcGNfYXRvbWljXzQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCAqbGhzLCB2b2lkICpyaHMsCisgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZikodm9pZCAqLCB2b2lkICosIHZvaWQgKikpIHsKKyAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9pbml0X3NlcmlhbCk7CisKKyAgaWYgKAorLy8gRklYTUU6IE9uIElBLTMyIGFyY2hpdGVjdHVyZSwgZ2NjIHVzZXMgY21weGNoZyBvbmx5IGZvciA0LWJ5dGUgaW50cy4KKy8vIEdvbXAgY29tcGF0aWJpbGl0eSBpcyBicm9rZW4gaWYgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmb3IgZmxvYXRzLgorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICAgIFRSVUUgLyogbm8gYWxpZ25tZW50IHByb2JsZW1zICovCisjZWxzZQorICAgICAgISgoa21wX3VpbnRwdHJfdClsaHMgJiAweDMpIC8qIG1ha2Ugc3VyZSBhZGRyZXNzIGlzIDQtYnl0ZSBhbGlnbmVkICovCisjZW5kaWYKKyAgICAgICkgeworICAgIGttcF9pbnQzMiBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9ICooa21wX2ludDMyICopbGhzOworICAgICgqZikoJm5ld192YWx1ZSwgJm9sZF92YWx1ZSwgcmhzKTsKKworICAgIC8qIFRPRE86IFNob3VsZCB0aGlzIGJlIGFjcXVpcmUgb3IgcmVsZWFzZT8gKi8KKyAgICB3aGlsZSAoIUtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMigKKyAgICAgICAgKGttcF9pbnQzMiAqKWxocywgKihrbXBfaW50MzIgKikmb2xkX3ZhbHVlLCAqKGttcF9pbnQzMiAqKSZuZXdfdmFsdWUpKSB7CisgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisKKyAgICAgIG9sZF92YWx1ZSA9ICooa21wX2ludDMyICopbGhzOworICAgICAgKCpmKSgmbmV3X3ZhbHVlLCAmb2xkX3ZhbHVlLCByaHMpOworICAgIH0KKworICAgIHJldHVybjsKKyAgfSBlbHNlIHsKKy8vIFVzZSBfX2ttcF9hdG9taWNfbG9ja180aSBmb3IgYWxsIDQtYnl0ZSBkYXRhLAorLy8gZXZlbiBpZiBpdCBpc24ndCBvZiBpbnRlZ2VyIGRhdGEgdHlwZS4KKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgIGlmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSB7CisgICAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCZfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCk7CisgICAgfSBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisgICAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCZfX2ttcF9hdG9taWNfbG9ja180aSwgZ3RpZCk7CisKKyAgICAoKmYpKGxocywgbGhzLCByaHMpOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgaWYgKF9fa21wX2F0b21pY19tb2RlID09IDIpIHsKKyAgICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soJl9fa21wX2F0b21pY19sb2NrLCBndGlkKTsKKyAgICB9IGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyAgICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soJl9fa21wX2F0b21pY19sb2NrXzRpLCBndGlkKTsKKyAgfQorfQorCit2b2lkIF9fa21wY19hdG9taWNfOChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkICpsaHMsIHZvaWQgKnJocywKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpmKSh2b2lkICosIHZvaWQgKiwgdm9pZCAqKSkgeworICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2luaXRfc2VyaWFsKTsKKyAgaWYgKAorCisjaWYgS01QX0FSQ0hfWDg2ICYmIGRlZmluZWQoS01QX0dPTVBfQ09NUEFUKQorICAgICAgRkFMU0UgLyogbXVzdCB1c2UgbG9jayAqLworI2VsaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAgICAgVFJVRSAvKiBubyBhbGlnbm1lbnQgcHJvYmxlbXMgKi8KKyNlbHNlCisgICAgICAhKChrbXBfdWludHB0cl90KWxocyAmIDB4NykgLyogbWFrZSBzdXJlIGFkZHJlc3MgaXMgOC1ieXRlIGFsaWduZWQgKi8KKyNlbmRpZgorICAgICAgKSB7CisgICAga21wX2ludDY0IG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgICAgb2xkX3ZhbHVlID0gKihrbXBfaW50NjQgKilsaHM7CisgICAgKCpmKSgmbmV3X3ZhbHVlLCAmb2xkX3ZhbHVlLCByaHMpOworICAgIC8qIFRPRE86IFNob3VsZCB0aGlzIGJlIGFjcXVpcmUgb3IgcmVsZWFzZT8gKi8KKyAgICB3aGlsZSAoIUtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E2NCgKKyAgICAgICAgKGttcF9pbnQ2NCAqKWxocywgKihrbXBfaW50NjQgKikmb2xkX3ZhbHVlLCAqKGttcF9pbnQ2NCAqKSZuZXdfdmFsdWUpKSB7CisgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisKKyAgICAgIG9sZF92YWx1ZSA9ICooa21wX2ludDY0ICopbGhzOworICAgICAgKCpmKSgmbmV3X3ZhbHVlLCAmb2xkX3ZhbHVlLCByaHMpOworICAgIH0KKworICAgIHJldHVybjsKKyAgfSBlbHNlIHsKKy8vIFVzZSBfX2ttcF9hdG9taWNfbG9ja184aSBmb3IgYWxsIDgtYnl0ZSBkYXRhLAorLy8gZXZlbiBpZiBpdCBpc24ndCBvZiBpbnRlZ2VyIGRhdGEgdHlwZS4KKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgIGlmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSB7CisgICAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCZfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCk7CisgICAgfSBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisgICAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCZfX2ttcF9hdG9taWNfbG9ja184aSwgZ3RpZCk7CisKKyAgICAoKmYpKGxocywgbGhzLCByaHMpOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgaWYgKF9fa21wX2F0b21pY19tb2RlID09IDIpIHsKKyAgICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soJl9fa21wX2F0b21pY19sb2NrLCBndGlkKTsKKyAgICB9IGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyAgICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soJl9fa21wX2F0b21pY19sb2NrXzhpLCBndGlkKTsKKyAgfQorfQorCit2b2lkIF9fa21wY19hdG9taWNfMTAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCAqbGhzLCB2b2lkICpyaHMsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmYpKHZvaWQgKiwgdm9pZCAqLCB2b2lkICopKSB7CisgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfaW5pdF9zZXJpYWwpOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgIGlmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSB7CisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jaygmX19rbXBfYXRvbWljX2xvY2ssIGd0aWQpOworICB9IGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCZfX2ttcF9hdG9taWNfbG9ja18xMHIsIGd0aWQpOworCisgICgqZikobGhzLCBsaHMsIHJocyk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgaWYgKF9fa21wX2F0b21pY19tb2RlID09IDIpIHsKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCZfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCk7CisgIH0gZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soJl9fa21wX2F0b21pY19sb2NrXzEwciwgZ3RpZCk7Cit9CisKK3ZvaWQgX19rbXBjX2F0b21pY18xNihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkICpsaHMsIHZvaWQgKnJocywKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZikodm9pZCAqLCB2b2lkICosIHZvaWQgKikpIHsKKyAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9pbml0X3NlcmlhbCk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgaWYgKF9fa21wX2F0b21pY19tb2RlID09IDIpIHsKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCZfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCk7CisgIH0gZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soJl9fa21wX2F0b21pY19sb2NrXzE2YywgZ3RpZCk7CisKKyAgKCpmKShsaHMsIGxocywgcmhzKTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICBpZiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgeworICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soJl9fa21wX2F0b21pY19sb2NrLCBndGlkKTsKKyAgfSBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jaygmX19rbXBfYXRvbWljX2xvY2tfMTZjLCBndGlkKTsKK30KKwordm9pZCBfX2ttcGNfYXRvbWljXzIwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQgKmxocywgdm9pZCAqcmhzLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpmKSh2b2lkICosIHZvaWQgKiwgdm9pZCAqKSkgeworICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2luaXRfc2VyaWFsKTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICBpZiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgeworICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soJl9fa21wX2F0b21pY19sb2NrLCBndGlkKTsKKyAgfSBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jaygmX19rbXBfYXRvbWljX2xvY2tfMjBjLCBndGlkKTsKKworICAoKmYpKGxocywgbGhzLCByaHMpOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgIGlmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSB7CisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jaygmX19rbXBfYXRvbWljX2xvY2ssIGd0aWQpOworICB9IGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCZfX2ttcF9hdG9taWNfbG9ja18yMGMsIGd0aWQpOworfQorCit2b2lkIF9fa21wY19hdG9taWNfMzIoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCAqbGhzLCB2b2lkICpyaHMsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmYpKHZvaWQgKiwgdm9pZCAqLCB2b2lkICopKSB7CisgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfaW5pdF9zZXJpYWwpOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgIGlmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSB7CisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jaygmX19rbXBfYXRvbWljX2xvY2ssIGd0aWQpOworICB9IGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCZfX2ttcF9hdG9taWNfbG9ja18zMmMsIGd0aWQpOworCisgICgqZikobGhzLCBsaHMsIHJocyk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgaWYgKF9fa21wX2F0b21pY19tb2RlID09IDIpIHsKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCZfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCk7CisgIH0gZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soJl9fa21wX2F0b21pY19sb2NrXzMyYywgZ3RpZCk7Cit9CisKKy8vIEFDOiBzYW1lIHR3byByb3V0aW5lcyBhcyBHT01QX2F0b21pY19zdGFydC9lbmQsIGJ1dCB3aWxsIGJlIGNhbGxlZCBieSBvdXIKKy8vIGNvbXBpbGVyOyBkdXBsaWNhdGVkIGluIG9yZGVyIHRvIG5vdCB1c2UgMy1wYXJ0eSBuYW1lcyBpbiBwdXJlIEludGVsIGNvZGUKKy8vIFRPRE86IGNvbnNpZGVyIGFkZGluZyBHVElEIHBhcmFtZXRlciBhZnRlciBjb25zdWx0YXRpb24gd2l0aCBFcm5lc3RvL1hpbm1pbi4KK3ZvaWQgX19rbXBjX2F0b21pY19zdGFydCh2b2lkKSB7CisgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICBLQV9UUkFDRSgyMCwgKCJfX2ttcGNfYXRvbWljX3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soJl9fa21wX2F0b21pY19sb2NrLCBndGlkKTsKK30KKwordm9pZCBfX2ttcGNfYXRvbWljX2VuZCh2b2lkKSB7CisgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgS0FfVFJBQ0UoMjAsICgiX19rbXBjX2F0b21pY19lbmQ6IFQjJWRcbiIsIGd0aWQpKTsKKyAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jaygmX19rbXBfYXRvbWljX2xvY2ssIGd0aWQpOworfQorCisvKiEKK0B9CisqLworCisvLyBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2F0b21pYy5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX2F0b21pYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YWQzYWUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfYXRvbWljLmgKQEAgLTAsMCArMSwxNzc3IEBACisvKgorICoga21wX2F0b21pYy5oIC0gQVRPTUlDIGhlYWRlciBmaWxlCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0FUT01JQ19ICisjZGVmaW5lIEtNUF9BVE9NSUNfSAorCisjaW5jbHVkZSAia21wX2xvY2suaCIKKyNpbmNsdWRlICJrbXBfb3MuaCIKKworI2lmIE9NUFRfU1VQUE9SVAorI2luY2x1ZGUgIm9tcHQtc3BlY2lmaWMuaCIKKyNlbmRpZgorCisvLyBDKysgYnVpbGQgcG9ydC4KKy8vIEludGVsIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgX0NvbXBsZXggZGF0YXR5cGUgb24gd2luLgorLy8gSW50ZWwgY29tcGlsZXIgc3VwcG9ydHMgX0NvbXBsZXggZGF0YXR5cGUgb24gbGluIGFuZCBtYWMuCisvLyBPbiB0aGUgb3RoZXIgc2lkZSwgdGhlcmUgaXMgYSBwcm9ibGVtIG9mIHN0YWNrIGFsaWdubWVudCBvbiBsaW5fMzIgYW5kIG1hY18zMgorLy8gaWYgdGhlIHJocyBpcyBjbXBseDgwIG9yIGNtcGx4MTI4IHR5cGVkZWYnZWQgZGF0YXR5cGUuCisvLyBUaGUgZGVjaXNpb24gaXM6IHRvIHVzZSBjb21waWxlciBzdXBwb3J0ZWQgX0NvbXBsZXggdHlwZSBvbiBsaW4gYW5kIG1hYywKKy8vICAgICAgICAgICAgICAgICAgdG8gdXNlIHR5cGVkZWYnZWQgdHlwZXMgb24gd2luLgorLy8gQ29uZGl0aW9uIGZvciBXSU42NCB3YXMgbW9kaWZpZWQgaW4gYW50aWNpcGF0aW9uIG9mIDEwLjEgYnVpbGQgY29tcGlsZXIuCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiAoS01QX09TX1dJTkRPV1MpCisvLyBjcmVhdGUgc2hvcnRjdXRzIGZvciBjOTkgY29tcGxleCB0eXBlcworCisvLyBWaXN1YWwgU3R1ZGlvIGNhbm5vdCBoYXZlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgdGhhdCBoYXZlIHRoZQorLy8gYWxpZ24gX19kZWNsc3BlYyBhdHRyaWJ1dGUsIHNvIHdlIG11c3QgcmVtb3ZlIGl0LiAoQ29tcGlsZXIgRXJyb3IgQzI3MTkpCisjaWYgS01QX0NPTVBJTEVSX01TVkMKKyN1bmRlZiBLTVBfRE9fQUxJR04KKyNkZWZpbmUgS01QX0RPX0FMSUdOKGFsaWdubWVudCkgLyogTm90aGluZyAqLworI2VuZGlmCisKKyNpZiAoX01TQ19WRVIgPCAxNjAwKSAmJiBkZWZpbmVkKF9ERUJVRykKKy8vIFdvcmthcm91bmQgZm9yIHRoZSBwcm9ibGVtIG9mIF9EZWJ1Z0hlYXBUYWcgdW5yZXNvbHZlZCBleHRlcm5hbC4KKy8vIFRoaXMgcHJvYmxlbSBwcmV2ZW50ZWQgdG8gdXNlIG91ciBzdGF0aWMgZGVidWcgbGlicmFyeSBmb3IgQyB0ZXN0cworLy8gY29tcGlsZWQgd2l0aCAvTURkIG9wdGlvbiAodGhlIGxpYnJhcnkgaXRzZWxmIGJ1aWx0IHdpdGggL01UZCksCisjdW5kZWYgX0RFQlVHCisjZGVmaW5lIF9ERUJVR19URU1QT1JBUklMWV9VTlNFVF8KKyNlbmRpZgorCisjaW5jbHVkZSA8Y29tcGxleD4KKwordGVtcGxhdGUgPHR5cGVuYW1lIHR5cGVfbGhzLCB0eXBlbmFtZSB0eXBlX3Jocz4KK3N0ZDo6Y29tcGxleDx0eXBlX2xocz4gX19rbXBfbGhzX2Rpdl9yaHMoY29uc3Qgc3RkOjpjb21wbGV4PHR5cGVfbGhzPiAmbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmNvbXBsZXg8dHlwZV9yaHM+ICZyaHMpIHsKKyAgdHlwZV9saHMgYSA9IGxocy5yZWFsKCk7CisgIHR5cGVfbGhzIGIgPSBsaHMuaW1hZygpOworICB0eXBlX3JocyBjID0gcmhzLnJlYWwoKTsKKyAgdHlwZV9yaHMgZCA9IHJocy5pbWFnKCk7CisgIHR5cGVfcmhzIGRlbiA9IGMgKiBjICsgZCAqIGQ7CisgIHR5cGVfcmhzIHIgPSAoYSAqIGMgKyBiICogZCk7CisgIHR5cGVfcmhzIGkgPSAoYiAqIGMgLSBhICogZCk7CisgIHN0ZDo6Y29tcGxleDx0eXBlX2xocz4gcmV0KHIgLyBkZW4sIGkgLyBkZW4pOworICByZXR1cm4gcmV0OworfQorCisvLyBjb21wbGV4OAorc3RydWN0IF9fa21wX2NtcGx4NjRfdCA6IHN0ZDo6Y29tcGxleDxkb3VibGU+IHsKKworICBfX2ttcF9jbXBseDY0X3QoKSA6IHN0ZDo6Y29tcGxleDxkb3VibGU+KCkge30KKworICBfX2ttcF9jbXBseDY0X3QoY29uc3Qgc3RkOjpjb21wbGV4PGRvdWJsZT4gJmNkKSA6IHN0ZDo6Y29tcGxleDxkb3VibGU+KGNkKSB7fQorCisgIHZvaWQgb3BlcmF0b3IvPShjb25zdCBfX2ttcF9jbXBseDY0X3QgJnJocykgeworICAgIHN0ZDo6Y29tcGxleDxkb3VibGU+IGxocyA9ICp0aGlzOworICAgICp0aGlzID0gX19rbXBfbGhzX2Rpdl9yaHMobGhzLCByaHMpOworICB9CisKKyAgX19rbXBfY21wbHg2NF90IG9wZXJhdG9yLyhjb25zdCBfX2ttcF9jbXBseDY0X3QgJnJocykgeworICAgIHN0ZDo6Y29tcGxleDxkb3VibGU+IGxocyA9ICp0aGlzOworICAgIHJldHVybiBfX2ttcF9saHNfZGl2X3JocyhsaHMsIHJocyk7CisgIH0KK307Cit0eXBlZGVmIHN0cnVjdCBfX2ttcF9jbXBseDY0X3Qga21wX2NtcGx4NjQ7CisKKy8vIGNvbXBsZXg0CitzdHJ1Y3QgX19rbXBfY21wbHgzMl90IDogc3RkOjpjb21wbGV4PGZsb2F0PiB7CisKKyAgX19rbXBfY21wbHgzMl90KCkgOiBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KCkge30KKworICBfX2ttcF9jbXBseDMyX3QoY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiAmY2YpIDogc3RkOjpjb21wbGV4PGZsb2F0PihjZikge30KKworICBfX2ttcF9jbXBseDMyX3Qgb3BlcmF0b3IrKGNvbnN0IF9fa21wX2NtcGx4MzJfdCAmYikgeworICAgIHN0ZDo6Y29tcGxleDxmbG9hdD4gbGhzID0gKnRoaXM7CisgICAgc3RkOjpjb21wbGV4PGZsb2F0PiByaHMgPSBiOworICAgIHJldHVybiAobGhzICsgcmhzKTsKKyAgfQorICBfX2ttcF9jbXBseDMyX3Qgb3BlcmF0b3ItKGNvbnN0IF9fa21wX2NtcGx4MzJfdCAmYikgeworICAgIHN0ZDo6Y29tcGxleDxmbG9hdD4gbGhzID0gKnRoaXM7CisgICAgc3RkOjpjb21wbGV4PGZsb2F0PiByaHMgPSBiOworICAgIHJldHVybiAobGhzIC0gcmhzKTsKKyAgfQorICBfX2ttcF9jbXBseDMyX3Qgb3BlcmF0b3IqKGNvbnN0IF9fa21wX2NtcGx4MzJfdCAmYikgeworICAgIHN0ZDo6Y29tcGxleDxmbG9hdD4gbGhzID0gKnRoaXM7CisgICAgc3RkOjpjb21wbGV4PGZsb2F0PiByaHMgPSBiOworICAgIHJldHVybiAobGhzICogcmhzKTsKKyAgfQorCisgIF9fa21wX2NtcGx4MzJfdCBvcGVyYXRvcisoY29uc3Qga21wX2NtcGx4NjQgJmIpIHsKKyAgICBrbXBfY21wbHg2NCB0ID0ga21wX2NtcGx4NjQoKnRoaXMpICsgYjsKKyAgICBzdGQ6OmNvbXBsZXg8ZG91YmxlPiBkKHQpOworICAgIHN0ZDo6Y29tcGxleDxmbG9hdD4gZihkKTsKKyAgICBfX2ttcF9jbXBseDMyX3QgcihmKTsKKyAgICByZXR1cm4gcjsKKyAgfQorICBfX2ttcF9jbXBseDMyX3Qgb3BlcmF0b3ItKGNvbnN0IGttcF9jbXBseDY0ICZiKSB7CisgICAga21wX2NtcGx4NjQgdCA9IGttcF9jbXBseDY0KCp0aGlzKSAtIGI7CisgICAgc3RkOjpjb21wbGV4PGRvdWJsZT4gZCh0KTsKKyAgICBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IGYoZCk7CisgICAgX19rbXBfY21wbHgzMl90IHIoZik7CisgICAgcmV0dXJuIHI7CisgIH0KKyAgX19rbXBfY21wbHgzMl90IG9wZXJhdG9yKihjb25zdCBrbXBfY21wbHg2NCAmYikgeworICAgIGttcF9jbXBseDY0IHQgPSBrbXBfY21wbHg2NCgqdGhpcykgKiBiOworICAgIHN0ZDo6Y29tcGxleDxkb3VibGU+IGQodCk7CisgICAgc3RkOjpjb21wbGV4PGZsb2F0PiBmKGQpOworICAgIF9fa21wX2NtcGx4MzJfdCByKGYpOworICAgIHJldHVybiByOworICB9CisKKyAgdm9pZCBvcGVyYXRvci89KGNvbnN0IF9fa21wX2NtcGx4MzJfdCAmcmhzKSB7CisgICAgc3RkOjpjb21wbGV4PGZsb2F0PiBsaHMgPSAqdGhpczsKKyAgICAqdGhpcyA9IF9fa21wX2xoc19kaXZfcmhzKGxocywgcmhzKTsKKyAgfQorCisgIF9fa21wX2NtcGx4MzJfdCBvcGVyYXRvci8oY29uc3QgX19rbXBfY21wbHgzMl90ICZyaHMpIHsKKyAgICBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IGxocyA9ICp0aGlzOworICAgIHJldHVybiBfX2ttcF9saHNfZGl2X3JocyhsaHMsIHJocyk7CisgIH0KKworICB2b2lkIG9wZXJhdG9yLz0oY29uc3Qga21wX2NtcGx4NjQgJnJocykgeworICAgIHN0ZDo6Y29tcGxleDxmbG9hdD4gbGhzID0gKnRoaXM7CisgICAgKnRoaXMgPSBfX2ttcF9saHNfZGl2X3JocyhsaHMsIHJocyk7CisgIH0KKworICBfX2ttcF9jbXBseDMyX3Qgb3BlcmF0b3IvKGNvbnN0IGttcF9jbXBseDY0ICZyaHMpIHsKKyAgICBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IGxocyA9ICp0aGlzOworICAgIHJldHVybiBfX2ttcF9saHNfZGl2X3JocyhsaHMsIHJocyk7CisgIH0KK307Cit0eXBlZGVmIHN0cnVjdCBfX2ttcF9jbXBseDMyX3Qga21wX2NtcGx4MzI7CisKKy8vIGNvbXBsZXgxMAorc3RydWN0IEtNUF9ET19BTElHTigxNikgX19rbXBfY21wbHg4MF90IDogc3RkOjpjb21wbGV4PGxvbmcgZG91YmxlPiB7CisKKyAgX19rbXBfY21wbHg4MF90KCkgOiBzdGQ6OmNvbXBsZXg8bG9uZyBkb3VibGU+KCkge30KKworICBfX2ttcF9jbXBseDgwX3QoY29uc3Qgc3RkOjpjb21wbGV4PGxvbmcgZG91YmxlPiAmY2xkKQorICAgICAgOiBzdGQ6OmNvbXBsZXg8bG9uZyBkb3VibGU+KGNsZCkge30KKworICB2b2lkIG9wZXJhdG9yLz0oY29uc3QgX19rbXBfY21wbHg4MF90ICZyaHMpIHsKKyAgICBzdGQ6OmNvbXBsZXg8bG9uZyBkb3VibGU+IGxocyA9ICp0aGlzOworICAgICp0aGlzID0gX19rbXBfbGhzX2Rpdl9yaHMobGhzLCByaHMpOworICB9CisKKyAgX19rbXBfY21wbHg4MF90IG9wZXJhdG9yLyhjb25zdCBfX2ttcF9jbXBseDgwX3QgJnJocykgeworICAgIHN0ZDo6Y29tcGxleDxsb25nIGRvdWJsZT4gbGhzID0gKnRoaXM7CisgICAgcmV0dXJuIF9fa21wX2xoc19kaXZfcmhzKGxocywgcmhzKTsKKyAgfQorfTsKK3R5cGVkZWYgS01QX0RPX0FMSUdOKDE2KSBzdHJ1Y3QgX19rbXBfY21wbHg4MF90IGttcF9jbXBseDgwOworCisvLyBjb21wbGV4MTYKKyNpZiBLTVBfSEFWRV9RVUFECitzdHJ1Y3QgX19rbXBfY21wbHgxMjhfdCA6IHN0ZDo6Y29tcGxleDxfUXVhZD4geworCisgIF9fa21wX2NtcGx4MTI4X3QoKSA6IHN0ZDo6Y29tcGxleDxfUXVhZD4oKSB7fQorCisgIF9fa21wX2NtcGx4MTI4X3QoY29uc3Qgc3RkOjpjb21wbGV4PF9RdWFkPiAmY3EpIDogc3RkOjpjb21wbGV4PF9RdWFkPihjcSkge30KKworICB2b2lkIG9wZXJhdG9yLz0oY29uc3QgX19rbXBfY21wbHgxMjhfdCAmcmhzKSB7CisgICAgc3RkOjpjb21wbGV4PF9RdWFkPiBsaHMgPSAqdGhpczsKKyAgICAqdGhpcyA9IF9fa21wX2xoc19kaXZfcmhzKGxocywgcmhzKTsKKyAgfQorCisgIF9fa21wX2NtcGx4MTI4X3Qgb3BlcmF0b3IvKGNvbnN0IF9fa21wX2NtcGx4MTI4X3QgJnJocykgeworICAgIHN0ZDo6Y29tcGxleDxfUXVhZD4gbGhzID0gKnRoaXM7CisgICAgcmV0dXJuIF9fa21wX2xoc19kaXZfcmhzKGxocywgcmhzKTsKKyAgfQorfTsKK3R5cGVkZWYgc3RydWN0IF9fa21wX2NtcGx4MTI4X3Qga21wX2NtcGx4MTI4OworI2VuZGlmIC8qIEtNUF9IQVZFX1FVQUQgKi8KKworI2lmZGVmIF9ERUJVR19URU1QT1JBUklMWV9VTlNFVF8KKyN1bmRlZiBfREVCVUdfVEVNUE9SQVJJTFlfVU5TRVRfCisvLyBTZXQgaXQgYmFjayBub3cKKyNkZWZpbmUgX0RFQlVHIDEKKyNlbmRpZgorCisjZWxzZQorLy8gY3JlYXRlIHNob3J0Y3V0cyBmb3IgYzk5IGNvbXBsZXggdHlwZXMKK3R5cGVkZWYgZmxvYXQgX0NvbXBsZXgga21wX2NtcGx4MzI7Cit0eXBlZGVmIGRvdWJsZSBfQ29tcGxleCBrbXBfY21wbHg2NDsKK3R5cGVkZWYgbG9uZyBkb3VibGUgX0NvbXBsZXgga21wX2NtcGx4ODA7CisjaWYgS01QX0hBVkVfUVVBRAordHlwZWRlZiBfUXVhZCBfQ29tcGxleCBrbXBfY21wbHgxMjg7CisjZW5kaWYKKyNlbmRpZgorCisvLyBDb21waWxlciAxMi4wIGNoYW5nZWQgYWxpZ25tZW50IG9mIDE2IGFuZCAzMi1ieXRlIGFyZ3VtZW50cyAobGlrZSBfUXVhZAorLy8gYW5kIGttcF9jbXBseDEyOCkgb24gSUEtMzIgYXJjaGl0ZWN0dXJlLiBUaGUgZm9sbG93aW5nIGFsaWduZWQgc3RydWN0dXJlcworLy8gYXJlIGltcGxlbWVudGVkIHRvIHN1cHBvcnQgdGhlIG9sZCBhbGlnbm1lbnQgaW4gMTAuMSwgMTEuMCwgMTEuMSBhbmQKKy8vIGludHJvZHVjZSB0aGUgbmV3IGFsaWdubWVudCBpbiAxMi4wLiBTZWUgQ1E4ODQwNS4KKyNpZiBLTVBfQVJDSF9YODYgJiYgS01QX0hBVkVfUVVBRAorCisvLyA0LWJ5dGUgYWxpZ25lZCBzdHJ1Y3R1cmVzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorCisjcHJhZ21hIHBhY2socHVzaCwgNCkKKworc3RydWN0IEtNUF9ET19BTElHTig0KSBRdWFkX2E0X3QgeworICBfUXVhZCBxOworCisgIFF1YWRfYTRfdCgpIDogcSgpIHt9CisgIFF1YWRfYTRfdChjb25zdCBfUXVhZCAmY3EpIDogcShjcSkge30KKworICBRdWFkX2E0X3Qgb3BlcmF0b3IrKGNvbnN0IFF1YWRfYTRfdCAmYikgeworICAgIF9RdWFkIGxocyA9ICgqdGhpcykucTsKKyAgICBfUXVhZCByaHMgPSBiLnE7CisgICAgcmV0dXJuIChRdWFkX2E0X3QpKGxocyArIHJocyk7CisgIH0KKworICBRdWFkX2E0X3Qgb3BlcmF0b3ItKGNvbnN0IFF1YWRfYTRfdCAmYikgeworICAgIF9RdWFkIGxocyA9ICgqdGhpcykucTsKKyAgICBfUXVhZCByaHMgPSBiLnE7CisgICAgcmV0dXJuIChRdWFkX2E0X3QpKGxocyAtIHJocyk7CisgIH0KKyAgUXVhZF9hNF90IG9wZXJhdG9yKihjb25zdCBRdWFkX2E0X3QgJmIpIHsKKyAgICBfUXVhZCBsaHMgPSAoKnRoaXMpLnE7CisgICAgX1F1YWQgcmhzID0gYi5xOworICAgIHJldHVybiAoUXVhZF9hNF90KShsaHMgKiByaHMpOworICB9CisKKyAgUXVhZF9hNF90IG9wZXJhdG9yLyhjb25zdCBRdWFkX2E0X3QgJmIpIHsKKyAgICBfUXVhZCBsaHMgPSAoKnRoaXMpLnE7CisgICAgX1F1YWQgcmhzID0gYi5xOworICAgIHJldHVybiAoUXVhZF9hNF90KShsaHMgLyByaHMpOworICB9Cit9OworCitzdHJ1Y3QgS01QX0RPX0FMSUdOKDQpIGttcF9jbXBseDEyOF9hNF90IHsKKyAga21wX2NtcGx4MTI4IHE7CisKKyAga21wX2NtcGx4MTI4X2E0X3QoKSA6IHEoKSB7fQorCisgIGttcF9jbXBseDEyOF9hNF90KGNvbnN0IGttcF9jbXBseDEyOCAmYzEyOCkgOiBxKGMxMjgpIHt9CisKKyAga21wX2NtcGx4MTI4X2E0X3Qgb3BlcmF0b3IrKGNvbnN0IGttcF9jbXBseDEyOF9hNF90ICZiKSB7CisgICAga21wX2NtcGx4MTI4IGxocyA9ICgqdGhpcykucTsKKyAgICBrbXBfY21wbHgxMjggcmhzID0gYi5xOworICAgIHJldHVybiAoa21wX2NtcGx4MTI4X2E0X3QpKGxocyArIHJocyk7CisgIH0KKyAga21wX2NtcGx4MTI4X2E0X3Qgb3BlcmF0b3ItKGNvbnN0IGttcF9jbXBseDEyOF9hNF90ICZiKSB7CisgICAga21wX2NtcGx4MTI4IGxocyA9ICgqdGhpcykucTsKKyAgICBrbXBfY21wbHgxMjggcmhzID0gYi5xOworICAgIHJldHVybiAoa21wX2NtcGx4MTI4X2E0X3QpKGxocyAtIHJocyk7CisgIH0KKyAga21wX2NtcGx4MTI4X2E0X3Qgb3BlcmF0b3IqKGNvbnN0IGttcF9jbXBseDEyOF9hNF90ICZiKSB7CisgICAga21wX2NtcGx4MTI4IGxocyA9ICgqdGhpcykucTsKKyAgICBrbXBfY21wbHgxMjggcmhzID0gYi5xOworICAgIHJldHVybiAoa21wX2NtcGx4MTI4X2E0X3QpKGxocyAqIHJocyk7CisgIH0KKworICBrbXBfY21wbHgxMjhfYTRfdCBvcGVyYXRvci8oY29uc3Qga21wX2NtcGx4MTI4X2E0X3QgJmIpIHsKKyAgICBrbXBfY21wbHgxMjggbGhzID0gKCp0aGlzKS5xOworICAgIGttcF9jbXBseDEyOCByaHMgPSBiLnE7CisgICAgcmV0dXJuIChrbXBfY21wbHgxMjhfYTRfdCkobGhzIC8gcmhzKTsKKyAgfQorfTsKKworI3ByYWdtYSBwYWNrKHBvcCkKKworLy8gTmV3IDE2LWJ5dGUgYWxpZ25lZCBzdHJ1Y3R1cmVzIGZvciAxMi4wIGNvbXBpbGVyLgorc3RydWN0IEtNUF9ET19BTElHTigxNikgUXVhZF9hMTZfdCB7CisgIF9RdWFkIHE7CisKKyAgUXVhZF9hMTZfdCgpIDogcSgpIHt9CisgIFF1YWRfYTE2X3QoY29uc3QgX1F1YWQgJmNxKSA6IHEoY3EpIHt9CisKKyAgUXVhZF9hMTZfdCBvcGVyYXRvcisoY29uc3QgUXVhZF9hMTZfdCAmYikgeworICAgIF9RdWFkIGxocyA9ICgqdGhpcykucTsKKyAgICBfUXVhZCByaHMgPSBiLnE7CisgICAgcmV0dXJuIChRdWFkX2ExNl90KShsaHMgKyByaHMpOworICB9CisKKyAgUXVhZF9hMTZfdCBvcGVyYXRvci0oY29uc3QgUXVhZF9hMTZfdCAmYikgeworICAgIF9RdWFkIGxocyA9ICgqdGhpcykucTsKKyAgICBfUXVhZCByaHMgPSBiLnE7CisgICAgcmV0dXJuIChRdWFkX2ExNl90KShsaHMgLSByaHMpOworICB9CisgIFF1YWRfYTE2X3Qgb3BlcmF0b3IqKGNvbnN0IFF1YWRfYTE2X3QgJmIpIHsKKyAgICBfUXVhZCBsaHMgPSAoKnRoaXMpLnE7CisgICAgX1F1YWQgcmhzID0gYi5xOworICAgIHJldHVybiAoUXVhZF9hMTZfdCkobGhzICogcmhzKTsKKyAgfQorCisgIFF1YWRfYTE2X3Qgb3BlcmF0b3IvKGNvbnN0IFF1YWRfYTE2X3QgJmIpIHsKKyAgICBfUXVhZCBsaHMgPSAoKnRoaXMpLnE7CisgICAgX1F1YWQgcmhzID0gYi5xOworICAgIHJldHVybiAoUXVhZF9hMTZfdCkobGhzIC8gcmhzKTsKKyAgfQorfTsKKworc3RydWN0IEtNUF9ET19BTElHTigxNikga21wX2NtcGx4MTI4X2ExNl90IHsKKyAga21wX2NtcGx4MTI4IHE7CisKKyAga21wX2NtcGx4MTI4X2ExNl90KCkgOiBxKCkge30KKworICBrbXBfY21wbHgxMjhfYTE2X3QoY29uc3Qga21wX2NtcGx4MTI4ICZjMTI4KSA6IHEoYzEyOCkge30KKworICBrbXBfY21wbHgxMjhfYTE2X3Qgb3BlcmF0b3IrKGNvbnN0IGttcF9jbXBseDEyOF9hMTZfdCAmYikgeworICAgIGttcF9jbXBseDEyOCBsaHMgPSAoKnRoaXMpLnE7CisgICAga21wX2NtcGx4MTI4IHJocyA9IGIucTsKKyAgICByZXR1cm4gKGttcF9jbXBseDEyOF9hMTZfdCkobGhzICsgcmhzKTsKKyAgfQorICBrbXBfY21wbHgxMjhfYTE2X3Qgb3BlcmF0b3ItKGNvbnN0IGttcF9jbXBseDEyOF9hMTZfdCAmYikgeworICAgIGttcF9jbXBseDEyOCBsaHMgPSAoKnRoaXMpLnE7CisgICAga21wX2NtcGx4MTI4IHJocyA9IGIucTsKKyAgICByZXR1cm4gKGttcF9jbXBseDEyOF9hMTZfdCkobGhzIC0gcmhzKTsKKyAgfQorICBrbXBfY21wbHgxMjhfYTE2X3Qgb3BlcmF0b3IqKGNvbnN0IGttcF9jbXBseDEyOF9hMTZfdCAmYikgeworICAgIGttcF9jbXBseDEyOCBsaHMgPSAoKnRoaXMpLnE7CisgICAga21wX2NtcGx4MTI4IHJocyA9IGIucTsKKyAgICByZXR1cm4gKGttcF9jbXBseDEyOF9hMTZfdCkobGhzICogcmhzKTsKKyAgfQorCisgIGttcF9jbXBseDEyOF9hMTZfdCBvcGVyYXRvci8oY29uc3Qga21wX2NtcGx4MTI4X2ExNl90ICZiKSB7CisgICAga21wX2NtcGx4MTI4IGxocyA9ICgqdGhpcykucTsKKyAgICBrbXBfY21wbHgxMjggcmhzID0gYi5xOworICAgIHJldHVybiAoa21wX2NtcGx4MTI4X2ExNl90KShsaHMgLyByaHMpOworICB9Cit9OworCisjZW5kaWYKKworI2lmIChLTVBfQVJDSF9YODYpCisjZGVmaW5lIFFVQURfTEVHQUNZIFF1YWRfYTRfdAorI2RlZmluZSBDUExYMTI4X0xFRyBrbXBfY21wbHgxMjhfYTRfdAorI2Vsc2UKKyNkZWZpbmUgUVVBRF9MRUdBQ1kgX1F1YWQKKyNkZWZpbmUgQ1BMWDEyOF9MRUcga21wX2NtcGx4MTI4CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitleHRlcm4gaW50IF9fa21wX2F0b21pY19tb2RlOworCisvLyBBdG9taWMgbG9ja3MgY2FuIGVhc2lseSBiZWNvbWUgY29udGVuZGVkLCBzbyB3ZSB1c2UgcXVldWluZyBsb2NrcyBmb3IgdGhlbS4KK3R5cGVkZWYga21wX3F1ZXVpbmdfbG9ja190IGttcF9hdG9taWNfbG9ja190OworCitzdGF0aWMgaW5saW5lIHZvaWQgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayhrbXBfYXRvbWljX2xvY2tfdCAqbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGd0aWQpIHsKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICBpZiAob21wdF9lbmFibGVkICYmIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF93YWl0X2F0b21pYykpIHsKKyAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfd2FpdF9hdG9taWMpKChvbXB0X3dhaXRfaWRfdClsY2spOworICB9CisjZW5kaWYKKworICBfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9jayhsY2ssIGd0aWQpOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2FjcXVpcmVkX2F0b21pYykpIHsKKyAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYWNxdWlyZWRfYXRvbWljKSgKKyAgICAgICAgKG9tcHRfd2FpdF9pZF90KWxjayk7CisgIH0KKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIGludCBfX2ttcF90ZXN0X2F0b21pY19sb2NrKGttcF9hdG9taWNfbG9ja190ICpsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKSB7CisgIHJldHVybiBfX2ttcF90ZXN0X3F1ZXVpbmdfbG9jayhsY2ssIGd0aWQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayhrbXBfYXRvbWljX2xvY2tfdCAqbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGd0aWQpIHsKKyAgX19rbXBfcmVsZWFzZV9xdWV1aW5nX2xvY2sobGNrLCBndGlkKTsKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9CTEFNRQorICBpZiAob21wdF9lbmFibGVkICYmIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9yZWxlYXNlX2F0b21pYykpIHsKKyAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcmVsZWFzZV9hdG9taWMpKAorICAgICAgICAob21wdF93YWl0X2lkX3QpbGNrKTsKKyAgfQorI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2ttcF9pbml0X2F0b21pY19sb2NrKGttcF9hdG9taWNfbG9ja190ICpsY2spIHsKKyAgX19rbXBfaW5pdF9xdWV1aW5nX2xvY2sobGNrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fa21wX2Rlc3Ryb3lfYXRvbWljX2xvY2soa21wX2F0b21pY19sb2NrX3QgKmxjaykgeworICBfX2ttcF9kZXN0cm95X3F1ZXVpbmdfbG9jayhsY2spOworfQorCisvLyBHbG9iYWwgTG9ja3MKK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9jazsgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRvbWljcyBpbiBHbnUgY29tcGF0IG1vZGUgICAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzFpOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlZCBhdG9taWNzIGZvciAxLWJ5dGUgZml4ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSB0eXBlcyAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzJpOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlZCBhdG9taWNzIGZvciAyLWJ5dGUgZml4ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSB0eXBlcyAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzRpOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlZCBhdG9taWNzIGZvciA0LWJ5dGUgZml4ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSB0eXBlcyAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzRyOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlZCBhdG9taWNzIGZvciBrbXBfcmVhbDMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgdHlwZSAgICAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzhpOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlZCBhdG9taWNzIGZvciA4LWJ5dGUgZml4ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSB0eXBlcyAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzhyOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlZCBhdG9taWNzIGZvciBrbXBfcmVhbDY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgdHlwZSAgICAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190CisgICAgX19rbXBfYXRvbWljX2xvY2tfOGM7IC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXggYnl0ZSBkYXRhIHR5cGUgICovCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QKKyAgICBfX2ttcF9hdG9taWNfbG9ja18xMHI7IC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIGxvbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkYXRhIHR5cGUgICAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzE2cjsgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVkIGF0b21pY3MgZm9yIF9RdWFkIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgICAgICAgICAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzE2YzsgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVkIGF0b21pY3MgZm9yIGRvdWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxleCBkYXRhIHR5cGUqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190CisgICAgX19rbXBfYXRvbWljX2xvY2tfMjBjOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBsb25nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgY29tcGxleCB0eXBlKi8KK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja18zMmM7IC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlZCBhdG9taWNzIGZvciBfUXVhZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxleCBkYXRhIHR5cGUgKi8KKworLy8gIEJlbG93IHJvdXRpbmVzIGZvciBhdG9taWMgVVBEQVRFIGFyZSBsaXN0ZWQKKworLy8gMS1ieXRlCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX2FkZChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICpsaHMsIGNoYXIgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfYW5kYihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICpsaHMsIGNoYXIgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfZGl2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKmxocywgY2hhciByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIGNoYXIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX211bChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICpsaHMsIGNoYXIgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfb3JiKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKmxocywgY2hhciByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGwoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqbGhzLCBjaGFyIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX3NocihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICpsaHMsIGNoYXIgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDF1X3NocihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBjaGFyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWIoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqbGhzLCBjaGFyIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX3hvcihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICpsaHMsIGNoYXIgcmhzKTsKKy8vIDItYnl0ZQordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKmxocywgc2hvcnQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfYW5kYihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX2RpdihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqbGhzLCBzaG9ydCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIHNob3J0ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfbXVsKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICpsaHMsIHNob3J0IHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX29yYihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqbGhzLCBzaG9ydCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGwoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKmxocywgc2hvcnQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfc2hyKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICpsaHMsIHNob3J0IHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHIoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgc2hvcnQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWIoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKmxocywgc2hvcnQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfeG9yKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICpsaHMsIHNob3J0IHJocyk7CisvLyA0LWJ5dGUgYWRkIC8gc3ViIGZpeGVkCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWIoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgcmhzKTsKKy8vIDQtYnl0ZSBhZGQgLyBzdWIgZmxvYXQKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9yZWFsMzIgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9yZWFsMzIgcmhzKTsKKy8vIDgtYnl0ZSBhZGQgLyBzdWIgZml4ZWQKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfYWRkKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1YihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCByaHMpOworLy8gOC1ieXRlIGFkZCAvIHN1YiBmbG9hdAordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3JlYWw2NCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWIoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3JlYWw2NCByaHMpOworLy8gNC1ieXRlIGZpeGVkCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGIoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X2RpdihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50MzIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDMyIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X211bChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmIoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfc2hsKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X3NocihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50MzIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDMyIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X3hvcihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiByaHMpOworLy8gOC1ieXRlIGZpeGVkCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGIoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X2RpdihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50NjQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDY0IHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X211bChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmIoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfc2hsKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X3NocihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50NjQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDY0IHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X3hvcihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCByaHMpOworLy8gNC1ieXRlIGZsb2F0Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X2RpdihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfcmVhbDMyIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X211bChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfcmVhbDMyIHJocyk7CisvLyA4LWJ5dGUgZmxvYXQKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9yZWFsNjQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfbXVsKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9yZWFsNjQgcmhzKTsKKy8vIDEtLCAyLSwgNC0sIDgtYnl0ZSBsb2dpY2FsICgmJiwgfHwpCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGwoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqbGhzLCBjaGFyIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX29ybChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICpsaHMsIGNoYXIgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfYW5kbChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX29ybChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqbGhzLCBzaG9ydCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRsKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmwoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfYW5kbChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfb3JsKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IHJocyk7CisvLyBNSU4gLyBNQVgKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfbWF4KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKmxocywgY2hhciByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9taW4oaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqbGhzLCBjaGFyIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX21heChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqbGhzLCBzaG9ydCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9taW4oaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKmxocywgc2hvcnQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfbWF4KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X21pbihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tYXgoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfbWluKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X21heChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfcmVhbDMyIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X21pbihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfcmVhbDMyIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X21heChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfcmVhbDY0IHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X21pbihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfcmVhbDY0IHJocyk7CisjaWYgS01QX0hBVkVfUVVBRAordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVBRF9MRUdBQ1kgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X21pbihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVQURfTEVHQUNZIHJocyk7CisjaWYgKEtNUF9BUkNIX1g4NikKKy8vIFJvdXRpbmVzIHdpdGggMTYtYnl0ZSBhcmd1bWVudHMgYWxpZ25lZCB0byAxNi1ieXRlIGJvdW5kYXJ5OyBJQS0zMgorLy8gYXJjaGl0ZWN0dXJlIG9ubHkKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X21heF9hMTYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFkX2ExNl90IHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9taW5fYTE2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhZF9hMTZfdCByaHMpOworI2VuZGlmCisjZW5kaWYKKy8vIC5ORVFWLiAoc2FtZSBhcyB4b3IpCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX25lcXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqbGhzLCBjaGFyIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX25lcXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9uZXF2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9uZXF2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCByaHMpOworLy8gLkVRVi4gKHNhbWUgYXMgfnhvcikKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfZXF2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKmxocywgY2hhciByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9lcXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKmxocywgc2hvcnQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfZXF2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X2VxdihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCByaHMpOworLy8gbG9uZyBkb3VibGUgdHlwZQordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBkb3VibGUgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1YihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZG91YmxlIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWwoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGRvdWJsZSByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBkb3VibGUgcmhzKTsKKy8vIF9RdWFkIHR5cGUKKyNpZiBLTVBfSEFWRV9RVUFECit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUFEX0xFR0FDWSByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVBRF9MRUdBQ1kgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X211bChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVQURfTEVHQUNZIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUFEX0xFR0FDWSByaHMpOworI2lmIChLTVBfQVJDSF9YODYpCisvLyBSb3V0aW5lcyB3aXRoIDE2LWJ5dGUgYXJndW1lbnRzIGFsaWduZWQgdG8gMTYtYnl0ZSBib3VuZGFyeQordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkX2ExNihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWRfYTE2X3QgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFkX2ExNl90IHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWxfYTE2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhZF9hMTZfdCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2ExNihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWRfYTE2X3QgcmhzKTsKKyNlbmRpZgorI2VuZGlmCisvLyByb3V0aW5lcyBmb3IgY29tcGxleCB0eXBlcwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jbXBseDMyIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X3N1YihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NtcGx4MzIgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfbXVsKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY21wbHgzMiByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jbXBseDMyIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg4X2FkZChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NtcGx4NjQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDhfc3ViKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY21wbHg2NCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWwoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4NjQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jbXBseDY0IHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg4X2RpdihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NtcGx4NjQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDEwX2FkZChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jbXBseDgwIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWIoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY21wbHg4MCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTBfbXVsKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDgwICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NtcGx4ODAgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDEwX2RpdihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jbXBseDgwIHJocyk7CisjaWYgS01QX0hBVkVfUVVBRAordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYWRkKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BMWDEyOF9MRUcgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X3N1YihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQTFgxMjhfTEVHIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9tdWwoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUExYMTI4X0xFRyByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BMWDEyOF9MRUcgcmhzKTsKKyNpZiAoS01QX0FSQ0hfWDg2KQorLy8gUm91dGluZXMgd2l0aCAxNi1ieXRlIGFyZ3VtZW50cyBhbGlnbmVkIHRvIDE2LWJ5dGUgYm91bmRhcnkKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X2FkZF9hMTYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NtcGx4MTI4X2ExNl90ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jbXBseDEyOF9hMTZfdCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNihpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY21wbHgxMjhfYTE2X3QgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NtcGx4MTI4X2ExNl90IHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9tdWxfYTE2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jbXBseDEyOF9hMTZfdCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY21wbHgxMjhfYTE2X3QgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NtcGx4MTI4X2ExNl90ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jbXBseDEyOF9hMTZfdCByaHMpOworI2VuZGlmCisjZW5kaWYKKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8vIE9wZW5NUCA0LjA6IHggPSBleHByIGJpbm9wIHggZm9yIG5vbi1jb21tdXRhdGl2ZSBvcGVyYXRpb25zLgorLy8gU3VwcG9ydGVkIG9ubHkgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbChSKSA2NAorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfcmV2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9yZXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9yZXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqbGhzLCB1bnNpZ25lZCBjaGFyIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX3NobF9yZXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfc2hyX3JldihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyX3JldihpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpsaHMsIHVuc2lnbmVkIGNoYXIgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfc3ViX3JldihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9yZXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X3JldihpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqbGhzLCB1bnNpZ25lZCBzaG9ydCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGxfcmV2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfc2hyX3JldihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHJfcmV2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICpsaHMsIHVuc2lnbmVkIHNob3J0IHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9yZXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9yZXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfcmV2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50MzIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGxfcmV2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfcmV2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyX3JldihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50MzIgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfc3ViX3JldihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X3JldihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9yZXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQ2NCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDY0IHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9yZXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X3Nocl9yZXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfcmV2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50NjQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQ2NCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfcmV2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGZsb2F0ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X3JldihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBmbG9hdCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9yZXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZG91YmxlICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9yZXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZG91YmxlICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfcmV2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZG91YmxlIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfcmV2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZG91YmxlIHJocyk7CisjaWYgS01QX0hBVkVfUVVBRAordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX3JldihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUFEX0xFR0FDWSByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X3JldihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUFEX0xFR0FDWSByaHMpOworI2VuZGlmCit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9yZXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY21wbHgzMiByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfcmV2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NtcGx4MzIgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDhfc3ViX3JldihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jbXBseDY0IHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9yZXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4NjQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY21wbHg2NCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViX3JldihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY21wbHg4MCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X3JldihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY21wbHg4MCByaHMpOworI2lmIEtNUF9IQVZFX1FVQUQKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9yZXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BMWDEyOF9MRUcgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9yZXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BMWDEyOF9MRUcgcmhzKTsKKyNpZiAoS01QX0FSQ0hfWDg2KQorLy8gUm91dGluZXMgd2l0aCAxNi1ieXRlIGFyZ3VtZW50cyBhbGlnbmVkIHRvIDE2LWJ5dGUgYm91bmRhcnkKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTZfcmV2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFkX2ExNl90ICpsaHMsIFF1YWRfYTE2X3QgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9hMTZfcmV2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFkX2ExNl90ICpsaHMsIFF1YWRfYTE2X3QgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9hMTZfcmV2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY21wbHgxMjhfYTE2X3QgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jbXBseDEyOF9hMTZfdCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2ExNl9yZXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jbXBseDEyOF9hMTZfdCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NtcGx4MTI4X2ExNl90IHJocyk7CisjZW5kaWYKKyNlbmRpZiAvLyBLTVBfSEFWRV9RVUFECisKKyNlbmRpZiAvLyBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisvLyByb3V0aW5lcyBmb3IgbWl4ZWQgdHlwZXMKKworLy8gUkhTPWZsb2F0OAordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWxfZmxvYXQ4KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfcmVhbDY0IHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9mbG9hdDgoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9yZWFsNjQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2Zsb2F0OChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9yZWFsNjQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2Zsb2F0OChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9yZWFsNjQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfbXVsX2Zsb2F0OChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfcmVhbDY0IHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9mbG9hdDgoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3JlYWw2NCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfZmxvYXQ4KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9yZWFsNjQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2Zsb2F0OChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfcmVhbDY0IHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZF9mbG9hdDgoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9yZWFsNjQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2Zsb2F0OChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3JlYWw2NCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfZmxvYXQ4KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfcmVhbDY0IHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9mbG9hdDgoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9yZWFsNjQgcmhzKTsKKworLy8gUkhTPWZsb2F0MTYgKGRlcHJlY2F0ZWQsIHRvIGJlIHJlbW92ZWQgd2hlbiB3ZSBhcmUgc3VyZSB0aGUgY29tcGlsZXIgZG9lcyBub3QKKy8vIHVzZSB0aGVtKQorI2lmIEtNUF9IQVZFX1FVQUQKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfYWRkX2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9RdWFkIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxdV9hZGRfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgY2hhciAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9RdWFkIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9mcChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUXVhZCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc3ViX2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIGNoYXIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUXVhZCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWxfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1F1YWQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDF1X211bF9mcChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBjaGFyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1F1YWQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9RdWFkIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgY2hhciAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9RdWFkIHJocyk7CisKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfYWRkX2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUXVhZCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfYWRkX2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKmxocywgX1F1YWQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUXVhZCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc3ViX2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKmxocywgX1F1YWQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUXVhZCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfbXVsX2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKmxocywgX1F1YWQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUXVhZCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKmxocywgX1F1YWQgcmhzKTsKKwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGRfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUXVhZCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfYWRkX2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50MzIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUXVhZCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUXVhZCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc3ViX2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50MzIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUXVhZCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUXVhZCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfbXVsX2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50MzIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUXVhZCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUXVhZCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50MzIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUXVhZCByaHMpOworCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZF9mcChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9RdWFkIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4dV9hZGRfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQ2NCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9RdWFkIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9mcChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9RdWFkIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zdWJfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQ2NCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9RdWFkIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9mcChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9RdWFkIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4dV9tdWxfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQ2NCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9RdWFkIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9mcChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9RdWFkIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQ2NCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9RdWFkIHJocyk7CisKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9RdWFkIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9mcChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUXVhZCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1F1YWQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9RdWFkIHJocyk7CisKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfYWRkX2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9RdWFkIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9mcChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUXVhZCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWxfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1F1YWQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9RdWFkIHJocyk7CisKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDEwX2FkZF9mcChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9RdWFkIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUXVhZCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsX2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1F1YWQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9mcChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9RdWFkIHJocyk7CisKKy8vIFJldmVyc2Ugb3BlcmF0aW9ucwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfcmV2X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUXVhZCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc3ViX3Jldl9mcChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpsaHMsIF9RdWFkIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9yZXZfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9RdWFkIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfcmV2X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmxocywgX1F1YWQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfc3ViX3Jldl9mcChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9RdWFkIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQydV9zdWJfcmV2X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICpsaHMsIF9RdWFkIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9yZXZfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUXVhZCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X3Jldl9mcChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqbGhzLCBfUXVhZCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfcmV2X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9RdWFkIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zdWJfcmV2X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50MzIgKmxocywgX1F1YWQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X3Jldl9mcChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUXVhZCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X3Jldl9mcChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDMyICpsaHMsIF9RdWFkIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9yZXZfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1F1YWQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDh1X3N1Yl9yZXZfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQ2NCAqbGhzLCBfUXVhZCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfcmV2X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9RdWFkIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfcmV2X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgKmxocywgX1F1YWQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX3Jldl9mcChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBmbG9hdCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9RdWFkIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9yZXZfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZmxvYXQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUXVhZCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfcmV2X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGRvdWJsZSAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9RdWFkIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9yZXZfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZG91YmxlICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1F1YWQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9yZXZfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBkb3VibGUgKmxocywgX1F1YWQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9yZXZfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBkb3VibGUgKmxocywgX1F1YWQgcmhzKTsKKworI2VuZGlmIC8vIEtNUF9IQVZFX1FVQUQKKworLy8gUkhTPWNtcGx4OAordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGRfY21wbHg4KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NtcGx4MzIgKmxocywga21wX2NtcGx4NjQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NtcGx4OChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jbXBseDMyICpsaHMsIGttcF9jbXBseDY0IHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X211bF9jbXBseDgoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY21wbHgzMiAqbGhzLCBrbXBfY21wbHg2NCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY21wbHg4KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NtcGx4MzIgKmxocywga21wX2NtcGx4NjQgcmhzKTsKKworLy8gZ2VuZXJpYyBhdG9taWMgcm91dGluZXMKK3ZvaWQgX19rbXBjX2F0b21pY18xKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQgKmxocywgdm9pZCAqcmhzLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmYpKHZvaWQgKiwgdm9pZCAqLCB2b2lkICopKTsKK3ZvaWQgX19rbXBjX2F0b21pY18yKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQgKmxocywgdm9pZCAqcmhzLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmYpKHZvaWQgKiwgdm9pZCAqLCB2b2lkICopKTsKK3ZvaWQgX19rbXBjX2F0b21pY180KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQgKmxocywgdm9pZCAqcmhzLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmYpKHZvaWQgKiwgdm9pZCAqLCB2b2lkICopKTsKK3ZvaWQgX19rbXBjX2F0b21pY184KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQgKmxocywgdm9pZCAqcmhzLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmYpKHZvaWQgKiwgdm9pZCAqLCB2b2lkICopKTsKK3ZvaWQgX19rbXBjX2F0b21pY18xMChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkICpsaHMsIHZvaWQgKnJocywKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZikodm9pZCAqLCB2b2lkICosIHZvaWQgKikpOwordm9pZCBfX2ttcGNfYXRvbWljXzE2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQgKmxocywgdm9pZCAqcmhzLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpmKSh2b2lkICosIHZvaWQgKiwgdm9pZCAqKSk7Cit2b2lkIF9fa21wY19hdG9taWNfMjAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCAqbGhzLCB2b2lkICpyaHMsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmYpKHZvaWQgKiwgdm9pZCAqLCB2b2lkICopKTsKK3ZvaWQgX19rbXBjX2F0b21pY18zMihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkICpsaHMsIHZvaWQgKnJocywKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZikodm9pZCAqLCB2b2lkICosIHZvaWQgKikpOworCisvLyBSRUFELCBXUklURSwgQ0FQVFVSRSBhcmUgc3VwcG9ydGVkIG9ubHkgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbChSKSA2NAorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworLy8gIEJlbG93IHJvdXRpbmVzIGZvciBhdG9taWMgUkVBRCBhcmUgbGlzdGVkCitjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxX3JkKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKmxvYyk7CitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9yZChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqbG9jKTsKK2ttcF9pbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNF9yZChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKmxvYyk7CitrbXBfaW50NjQgX19rbXBjX2F0b21pY19maXhlZDhfcmQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICpsb2MpOwora21wX3JlYWwzMiBfX2ttcGNfYXRvbWljX2Zsb2F0NF9yZChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICpsb2MpOwora21wX3JlYWw2NCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9yZChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICpsb2MpOworbG9uZyBkb3VibGUgX19rbXBjX2F0b21pY19mbG9hdDEwX3JkKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBkb3VibGUgKmxvYyk7CisjaWYgS01QX0hBVkVfUVVBRAorUVVBRF9MRUdBQ1kgX19rbXBjX2F0b21pY19mbG9hdDE2X3JkKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVBRF9MRUdBQ1kgKmxvYyk7CisjZW5kaWYKKy8vIEZpeCBmb3IgQ1EyMjAzNjE6IGNtcGx4NCBSRUFEIHdpbGwgcmV0dXJuIHZvaWQgb24gV2luZG93cyogT1M7IHJlYWQgdmFsdWUKKy8vIHdpbGwgYmUgcmV0dXJuZWQgdGhyb3VnaCBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlcgorI2lmIChLTVBfT1NfV0lORE9XUykKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfcmQoa21wX2NtcGx4MzIgKm91dCwgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NtcGx4MzIgKmxvYyk7CisjZWxzZQora21wX2NtcGx4MzIgX19rbXBjX2F0b21pY19jbXBseDRfcmQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jbXBseDMyICpsb2MpOworI2VuZGlmCitrbXBfY21wbHg2NCBfX2ttcGNfYXRvbWljX2NtcGx4OF9yZChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NtcGx4NjQgKmxvYyk7CitrbXBfY21wbHg4MCBfX2ttcGNfYXRvbWljX2NtcGx4MTBfcmQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY21wbHg4MCAqbG9jKTsKKyNpZiBLTVBfSEFWRV9RVUFECitDUExYMTI4X0xFRyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfcmQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUExYMTI4X0xFRyAqbG9jKTsKKyNpZiAoS01QX0FSQ0hfWDg2KQorLy8gUm91dGluZXMgd2l0aCAxNi1ieXRlIGFyZ3VtZW50cyBhbGlnbmVkIHRvIDE2LWJ5dGUgYm91bmRhcnkKK1F1YWRfYTE2X3QgX19rbXBjX2F0b21pY19mbG9hdDE2X2ExNl9yZChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWRfYTE2X3QgKmxvYyk7CitrbXBfY21wbHgxMjhfYTE2X3QgX19rbXBjX2F0b21pY19jbXBseDE2X2ExNl9yZChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NtcGx4MTI4X2ExNl90ICpsb2MpOworI2VuZGlmCisjZW5kaWYKKworLy8gIEJlbG93IHJvdXRpbmVzIGZvciBhdG9taWMgV1JJVEUgYXJlIGxpc3RlZAordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV93cihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICpsaHMsIGNoYXIgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfd3IoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKmxocywgc2hvcnQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfd3IoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF93cihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X3dyKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3JlYWwzMiByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF93cihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9yZWFsNjQgcmhzKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDEwX3dyKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGRvdWJsZSByaHMpOworI2lmIEtNUF9IQVZFX1FVQUQKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X3dyKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUFEX0xFR0FDWSByaHMpOworI2VuZGlmCit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X3dyKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jbXBseDMyIHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg4X3dyKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jbXBseDY0IHJocyk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxMF93cihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NtcGx4ODAgcmhzKTsKKyNpZiBLTVBfSEFWRV9RVUFECit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl93cihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BMWDEyOF9MRUcgcmhzKTsKKyNpZiAoS01QX0FSQ0hfWDg2KQorLy8gUm91dGluZXMgd2l0aCAxNi1ieXRlIGFyZ3VtZW50cyBhbGlnbmVkIHRvIDE2LWJ5dGUgYm91bmRhcnkKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X2ExNl93cihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhZF9hMTZfdCByaHMpOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3dyKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NtcGx4MTI4X2ExNl90ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NtcGx4MTI4X2ExNl90IHJocyk7CisjZW5kaWYKKyNlbmRpZgorCisvLyAgQmVsb3cgcm91dGluZXMgZm9yIGF0b21pYyBDQVBUVVJFIGFyZSBsaXN0ZWQKKworLy8gMS1ieXRlCitjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxX2FkZF9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgcmhzLCBpbnQgZmxhZyk7CitjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGJfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciByaHMsIGludCBmbGFnKTsKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciByaHMsIGludCBmbGFnKTsKK3Vuc2lnbmVkIGNoYXIgX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHJocywgaW50IGZsYWcpOworY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWxfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHJocywgaW50IGZsYWcpOworY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmJfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHJocywgaW50IGZsYWcpOworY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGxfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHJocywgaW50IGZsYWcpOworY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHJocywgaW50IGZsYWcpOwordW5zaWduZWQgY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyX2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgcmhzLCBpbnQgZmxhZyk7CitjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgcmhzLCBpbnQgZmxhZyk7CitjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxX3hvcl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgcmhzLCBpbnQgZmxhZyk7CisvLyAyLWJ5dGUKK3Nob3J0IF9fa21wY19hdG9taWNfZml4ZWQyX2FkZF9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRiX2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHJocywgaW50IGZsYWcpOwordW5zaWduZWQgc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCByaHMsIGludCBmbGFnKTsKK3Nob3J0IF9fa21wY19hdG9taWNfZml4ZWQyX211bF9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmJfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHJocywgaW50IGZsYWcpOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfc2hsX2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCByaHMsIGludCBmbGFnKTsKK3Nob3J0IF9fa21wY19hdG9taWNfZml4ZWQyX3Nocl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgcmhzLCBpbnQgZmxhZyk7Cit1bnNpZ25lZCBzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyX2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHJocywgaW50IGZsYWcpOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCByaHMsIGludCBmbGFnKTsKK3Nob3J0IF9fa21wY19hdG9taWNfZml4ZWQyX3hvcl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgcmhzLCBpbnQgZmxhZyk7CisvLyA0LWJ5dGUgYWRkIC8gc3ViIGZpeGVkCitrbXBfaW50MzIgX19rbXBjX2F0b21pY19maXhlZDRfYWRkX2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyICpsaHMsIGttcF9pbnQzMiByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgKmxocywga21wX2ludDMyIHJocywgaW50IGZsYWcpOworLy8gNC1ieXRlIGFkZCAvIHN1YiBmbG9hdAora21wX3JlYWwzMiBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3JlYWwzMiAqbGhzLCBrbXBfcmVhbDMyIHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7CitrbXBfcmVhbDMyIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfcmVhbDMyICpsaHMsIGttcF9yZWFsMzIgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKKy8vIDgtYnl0ZSBhZGQgLyBzdWIgZml4ZWQKK2ttcF9pbnQ2NCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGRfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgKmxocywga21wX2ludDY0IHJocywgaW50IGZsYWcpOwora21wX2ludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCAqbGhzLCBrbXBfaW50NjQgcmhzLCBpbnQgZmxhZyk7CisvLyA4LWJ5dGUgYWRkIC8gc3ViIGZsb2F0CitrbXBfcmVhbDY0IF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZF9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfcmVhbDY0ICpsaHMsIGttcF9yZWFsNjQgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK2ttcF9yZWFsNjQgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9yZWFsNjQgKmxocywga21wX3JlYWw2NCByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWcpOworLy8gNC1ieXRlIGZpeGVkCitrbXBfaW50MzIgX19rbXBjX2F0b21pY19maXhlZDRfYW5kYl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgKmxocywga21wX2ludDMyIHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7CitrbXBfaW50MzIgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyICpsaHMsIGttcF9pbnQzMiByaHMsIGludCBmbGFnKTsKK2ttcF91aW50MzIgX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiAqbGhzLCBrbXBfdWludDMyIHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWcpOwora21wX2ludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiAqbGhzLCBrbXBfaW50MzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50MzIgX19rbXBjX2F0b21pY19maXhlZDRfb3JiX2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyICpsaHMsIGttcF9pbnQzMiByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGxfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgKmxocywga21wX2ludDMyIHJocywgaW50IGZsYWcpOwora21wX2ludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0X3Nocl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiAqbGhzLCBrbXBfaW50MzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfdWludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50MzIgKmxocywga21wX3VpbnQzMiByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK2ttcF9pbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNF94b3JfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgKmxocywga21wX2ludDMyIHJocywgaW50IGZsYWcpOworLy8gOC1ieXRlIGZpeGVkCitrbXBfaW50NjQgX19rbXBjX2F0b21pY19maXhlZDhfYW5kYl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgKmxocywga21wX2ludDY0IHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7CitrbXBfaW50NjQgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0ICpsaHMsIGttcF9pbnQ2NCByaHMsIGludCBmbGFnKTsKK2ttcF91aW50NjQgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQ2NCAqbGhzLCBrbXBfdWludDY0IHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWcpOwora21wX2ludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCAqbGhzLCBrbXBfaW50NjQgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50NjQgX19rbXBjX2F0b21pY19maXhlZDhfb3JiX2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0ICpsaHMsIGttcF9pbnQ2NCByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaGxfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgKmxocywga21wX2ludDY0IHJocywgaW50IGZsYWcpOwora21wX2ludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4X3Nocl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCAqbGhzLCBrbXBfaW50NjQgcmhzLCBpbnQgZmxhZyk7CitrbXBfdWludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgKmxocywga21wX3VpbnQ2NCByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK2ttcF9pbnQ2NCBfX2ttcGNfYXRvbWljX2ZpeGVkOF94b3JfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgKmxocywga21wX2ludDY0IHJocywgaW50IGZsYWcpOworLy8gNC1ieXRlIGZsb2F0CitrbXBfcmVhbDMyIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfcmVhbDMyICpsaHMsIGttcF9yZWFsMzIgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK2ttcF9yZWFsMzIgX19rbXBjX2F0b21pY19mbG9hdDRfbXVsX2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9yZWFsMzIgKmxocywga21wX3JlYWwzMiByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWcpOworLy8gOC1ieXRlIGZsb2F0CitrbXBfcmVhbDY0IF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfcmVhbDY0ICpsaHMsIGttcF9yZWFsNjQgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK2ttcF9yZWFsNjQgX19rbXBjX2F0b21pY19mbG9hdDhfbXVsX2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9yZWFsNjQgKmxocywga21wX3JlYWw2NCByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWcpOworLy8gMS0sIDItLCA0LSwgOC1ieXRlIGxvZ2ljYWwgKCYmLCB8fCkKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfYW5kbF9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHJocywgaW50IGZsYWcpOworY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmxfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHJocywgaW50IGZsYWcpOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfYW5kbF9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHJocywgaW50IGZsYWcpOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfb3JsX2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRsX2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiAqbGhzLCBrbXBfaW50MzIgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK2ttcF9pbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmxfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgKmxocywga21wX2ludDMyIHJocywgaW50IGZsYWcpOwora21wX2ludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGxfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0ICpsaHMsIGttcF9pbnQ2NCByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWcpOwora21wX2ludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4X29ybF9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCAqbGhzLCBrbXBfaW50NjQgcmhzLCBpbnQgZmxhZyk7CisvLyBNSU4gLyBNQVgKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfbWF4X2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciByaHMsIGludCBmbGFnKTsKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfbWluX2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciByaHMsIGludCBmbGFnKTsKK3Nob3J0IF9fa21wY19hdG9taWNfZml4ZWQyX21heF9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9taW5fY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHJocywgaW50IGZsYWcpOwora21wX2ludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0X21heF9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiAqbGhzLCBrbXBfaW50MzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50MzIgX19rbXBjX2F0b21pY19maXhlZDRfbWluX2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyICpsaHMsIGttcF9pbnQzMiByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tYXhfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgKmxocywga21wX2ludDY0IHJocywgaW50IGZsYWcpOwora21wX2ludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4X21pbl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCAqbGhzLCBrbXBfaW50NjQgcmhzLCBpbnQgZmxhZyk7CitrbXBfcmVhbDMyIF9fa21wY19hdG9taWNfZmxvYXQ0X21heF9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfcmVhbDMyICpsaHMsIGttcF9yZWFsMzIgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK2ttcF9yZWFsMzIgX19rbXBjX2F0b21pY19mbG9hdDRfbWluX2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9yZWFsMzIgKmxocywga21wX3JlYWwzMiByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWcpOwora21wX3JlYWw2NCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tYXhfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3JlYWw2NCAqbGhzLCBrbXBfcmVhbDY0IHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7CitrbXBfcmVhbDY0IF9fa21wY19hdG9taWNfZmxvYXQ4X21pbl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfcmVhbDY0ICpsaHMsIGttcF9yZWFsNjQgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKKyNpZiBLTVBfSEFWRV9RVUFECitRVUFEX0xFR0FDWSBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4X2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVBRF9MRUdBQ1kgKmxocywgUVVBRF9MRUdBQ1kgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWcpOworUVVBRF9MRUdBQ1kgX19rbXBjX2F0b21pY19mbG9hdDE2X21pbl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVQURfTEVHQUNZICpsaHMsIFFVQURfTEVHQUNZIHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKKyNlbmRpZgorLy8gLk5FUVYuIChzYW1lIGFzIHhvcikKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfbmVxdl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHJocywgaW50IGZsYWcpOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfbmVxdl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHJocywgaW50IGZsYWcpOwora21wX2ludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0X25lcXZfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyICpsaHMsIGttcF9pbnQzMiByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWcpOwora21wX2ludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4X25lcXZfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0ICpsaHMsIGttcF9pbnQ2NCByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWcpOworLy8gLkVRVi4gKHNhbWUgYXMgfnhvcikKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfZXF2X2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciByaHMsIGludCBmbGFnKTsKK3Nob3J0IF9fa21wY19hdG9taWNfZml4ZWQyX2Vxdl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50MzIgX19rbXBjX2F0b21pY19maXhlZDRfZXF2X2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyICpsaHMsIGttcF9pbnQzMiByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9lcXZfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgKmxocywga21wX2ludDY0IHJocywgaW50IGZsYWcpOworLy8gbG9uZyBkb3VibGUgdHlwZQorbG9uZyBkb3VibGUgX19rbXBjX2F0b21pY19mbG9hdDEwX2FkZF9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZG91YmxlICpsaHMsIGxvbmcgZG91YmxlIHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK2xvbmcgZG91YmxlIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGRvdWJsZSAqbGhzLCBsb25nIGRvdWJsZSByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7Citsb25nIGRvdWJsZSBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsX2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBkb3VibGUgKmxocywgbG9uZyBkb3VibGUgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWcpOworbG9uZyBkb3VibGUgX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZG91YmxlICpsaHMsIGxvbmcgZG91YmxlIHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKKyNpZiBLTVBfSEFWRV9RVUFECisvLyBfUXVhZCB0eXBlCitRVUFEX0xFR0FDWSBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkX2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVBRF9MRUdBQ1kgKmxocywgUVVBRF9MRUdBQ1kgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWcpOworUVVBRF9MRUdBQ1kgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVQURfTEVHQUNZICpsaHMsIFFVQURfTEVHQUNZIHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK1FVQURfTEVHQUNZIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWxfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUFEX0xFR0FDWSAqbGhzLCBRVUFEX0xFR0FDWSByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7CitRVUFEX0xFR0FDWSBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVBRF9MRUdBQ1kgKmxocywgUVVBRF9MRUdBQ1kgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWcpOworI2VuZGlmCisvLyByb3V0aW5lcyBmb3IgY29tcGxleCB0eXBlcworLy8gV29ya2Fyb3VuZCBmb3IgY21wbHg0IHJvdXRpbmVzIC0gcmV0dXJuIHZvaWQ7IGNhcHR1cmVkIHZhbHVlIGlzIHJldHVybmVkIHZpYQorLy8gdGhlIGFyZ3VtZW50Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X2FkZF9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY21wbHgzMiByaHMsIGttcF9jbXBseDMyICpvdXQsIGludCBmbGFnKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jbXBseDMyIHJocywga21wX2NtcGx4MzIgKm91dCwgaW50IGZsYWcpOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWxfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NtcGx4MzIgcmhzLCBrbXBfY21wbHgzMiAqb3V0LCBpbnQgZmxhZyk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X2Rpdl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY21wbHgzMiByaHMsIGttcF9jbXBseDMyICpvdXQsIGludCBmbGFnKTsKKwora21wX2NtcGx4NjQgX19rbXBjX2F0b21pY19jbXBseDhfYWRkX2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY21wbHg2NCAqbGhzLCBrbXBfY21wbHg2NCByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK2ttcF9jbXBseDY0IF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NtcGx4NjQgKmxocywga21wX2NtcGx4NjQgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7CitrbXBfY21wbHg2NCBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWxfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jbXBseDY0ICpsaHMsIGttcF9jbXBseDY0IHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWcpOwora21wX2NtcGx4NjQgX19rbXBjX2F0b21pY19jbXBseDhfZGl2X2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY21wbHg2NCAqbGhzLCBrbXBfY21wbHg2NCByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK2ttcF9jbXBseDgwIF9fa21wY19hdG9taWNfY21wbHgxMF9hZGRfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY21wbHg4MCAqbGhzLCBrbXBfY21wbHg4MCByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7CitrbXBfY21wbHg4MCBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViX2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NtcGx4ODAgKmxocywga21wX2NtcGx4ODAgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWcpOwora21wX2NtcGx4ODAgX19rbXBjX2F0b21pY19jbXBseDEwX211bF9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jbXBseDgwICpsaHMsIGttcF9jbXBseDgwIHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK2ttcF9jbXBseDgwIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY21wbHg4MCAqbGhzLCBrbXBfY21wbHg4MCByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7CisjaWYgS01QX0hBVkVfUVVBRAorQ1BMWDEyOF9MRUcgX19rbXBjX2F0b21pY19jbXBseDE2X2FkZF9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQTFgxMjhfTEVHICpsaHMsIENQTFgxMjhfTEVHIHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK0NQTFgxMjhfTEVHIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUExYMTI4X0xFRyAqbGhzLCBDUExYMTI4X0xFRyByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7CitDUExYMTI4X0xFRyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BMWDEyOF9MRUcgKmxocywgQ1BMWDEyOF9MRUcgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWcpOworQ1BMWDEyOF9MRUcgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQTFgxMjhfTEVHICpsaHMsIENQTFgxMjhfTEVHIHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKKyNpZiAoS01QX0FSQ0hfWDg2KQorLy8gUm91dGluZXMgd2l0aCAxNi1ieXRlIGFyZ3VtZW50cyBhbGlnbmVkIHRvIDE2LWJ5dGUgYm91bmRhcnkKK1F1YWRfYTE2X3QgX19rbXBjX2F0b21pY19mbG9hdDE2X2FkZF9hMTZfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFkX2ExNl90ICpsaHMsIFF1YWRfYTE2X3QgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWcpOworUXVhZF9hMTZfdCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2ExNl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWRfYTE2X3QgKmxocywgUXVhZF9hMTZfdCByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7CitRdWFkX2ExNl90IF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWxfYTE2X2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhZF9hMTZfdCAqbGhzLCBRdWFkX2ExNl90IHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK1F1YWRfYTE2X3QgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9hMTZfY3B0KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFkX2ExNl90ICpsaHMsIFF1YWRfYTE2X3QgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWcpOworUXVhZF9hMTZfdCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4X2ExNl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWRfYTE2X3QgKmxocywgUXVhZF9hMTZfdCByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7CitRdWFkX2ExNl90IF9fa21wY19hdG9taWNfZmxvYXQxNl9taW5fYTE2X2NwdChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhZF9hMTZfdCAqbGhzLCBRdWFkX2ExNl90IHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK2ttcF9jbXBseDEyOF9hMTZfdCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYWRkX2ExNl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NtcGx4MTI4X2ExNl90ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jbXBseDEyOF9hMTZfdCByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK2ttcF9jbXBseDEyOF9hMTZfdCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NtcGx4MTI4X2ExNl90ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jbXBseDEyOF9hMTZfdCByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK2ttcF9jbXBseDEyOF9hMTZfdCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2ExNl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NtcGx4MTI4X2ExNl90ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jbXBseDEyOF9hMTZfdCByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK2ttcF9jbXBseDEyOF9hMTZfdCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2ExNl9jcHQoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NtcGx4MTI4X2ExNl90ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jbXBseDEyOF9hMTZfdCByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKKyNlbmRpZgorI2VuZGlmCisKK3ZvaWQgX19rbXBjX2F0b21pY19zdGFydCh2b2lkKTsKK3ZvaWQgX19rbXBjX2F0b21pY19lbmQodm9pZCk7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCisvLyBPcGVuTVAgNC4wOiB2ID0geCA9IGV4cHIgYmlub3AgeDsgeyB2ID0geDsgeCA9IGV4cHIgYmlub3AgeDsgfSB7IHggPSBleHByCisvLyBiaW5vcCB4OyB2ID0geDsgfSAgZm9yIG5vbi1jb21tdXRhdGl2ZSBvcGVyYXRpb25zLgorCitjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9jcHRfcmV2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciByaHMsIGludCBmbGFnKTsKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2NwdF9yZXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHJocywgaW50IGZsYWcpOwordW5zaWduZWQgY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2NwdF9yZXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgcmhzLCBpbnQgZmxhZyk7CitjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxX3NobF9jcHRfcmV2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciByaHMsIGludCBmbGFnKTsKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfc2hyX2NwdF9yZXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHJocywgaW50IGZsYWcpOwordW5zaWduZWQgY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyX2NwdF9yZXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfY3B0X3JldihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfY3B0X3JldihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgcmhzLCBpbnQgZmxhZyk7Cit1bnNpZ25lZCBzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2NwdF9yZXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHJocywgaW50IGZsYWcpOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfc2hsX2NwdF9yZXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHJocywgaW50IGZsYWcpOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfc2hyX2NwdF9yZXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHJocywgaW50IGZsYWcpOwordW5zaWduZWQgc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9jcHRfcmV2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfY3B0X3JldihpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiAqbGhzLCBrbXBfaW50MzIgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK2ttcF9pbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfY3B0X3JldihpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiAqbGhzLCBrbXBfaW50MzIgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK2ttcF91aW50MzIgX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9jcHRfcmV2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDMyICpsaHMsIGttcF91aW50MzIgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWcpOwora21wX2ludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobF9jcHRfcmV2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyICpsaHMsIGttcF9pbnQzMiByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWcpOwora21wX2ludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0X3Nocl9jcHRfcmV2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyICpsaHMsIGttcF9pbnQzMiByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWcpOwora21wX3VpbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyX2NwdF9yZXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50MzIgKmxocywga21wX3VpbnQzMiByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7CitrbXBfaW50NjQgX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2NwdF9yZXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgKmxocywga21wX2ludDY0IHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7CitrbXBfaW50NjQgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2NwdF9yZXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgKmxocywga21wX2ludDY0IHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7CitrbXBfdWludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfY3B0X3JldihpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQ2NCAqbGhzLCBrbXBfdWludDY0IHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK2ttcF9pbnQ2NCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaGxfY3B0X3JldihpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCAqbGhzLCBrbXBfaW50NjQgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK2ttcF9pbnQ2NCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfY3B0X3JldihpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCAqbGhzLCBrbXBfaW50NjQgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK2ttcF91aW50NjQgX19rbXBjX2F0b21pY19maXhlZDh1X3Nocl9jcHRfcmV2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDY0ICpsaHMsIGttcF91aW50NjQgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWcpOworZmxvYXQgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2NwdF9yZXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZmxvYXQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJocywgaW50IGZsYWcpOworZmxvYXQgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2NwdF9yZXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZmxvYXQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJocywgaW50IGZsYWcpOworZG91YmxlIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9jcHRfcmV2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGRvdWJsZSAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSByaHMsIGludCBmbGFnKTsKK2RvdWJsZSBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfY3B0X3JldihpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBkb3VibGUgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcmhzLCBpbnQgZmxhZyk7Citsb25nIGRvdWJsZSBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2NwdF9yZXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGRvdWJsZSAqbGhzLCBsb25nIGRvdWJsZSByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWcpOworbG9uZyBkb3VibGUgX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9jcHRfcmV2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBkb3VibGUgKmxocywgbG9uZyBkb3VibGUgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKKyNpZiBLTVBfSEFWRV9RVUFECitRVUFEX0xFR0FDWSBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2NwdF9yZXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUFEX0xFR0FDWSAqbGhzLCBRVUFEX0xFR0FDWSByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWcpOworUVVBRF9MRUdBQ1kgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9jcHRfcmV2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVBRF9MRUdBQ1kgKmxocywgUVVBRF9MRUdBQ1kgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKKyNlbmRpZgorLy8gV29ya2Fyb3VuZCBmb3IgY21wbHg0IHJvdXRpbmVzIC0gcmV0dXJuIHZvaWQ7IGNhcHR1cmVkIHZhbHVlIGlzIHJldHVybmVkIHZpYQorLy8gdGhlIGFyZ3VtZW50Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jcHRfcmV2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jbXBseDMyICpsaHMsIGttcF9jbXBseDMyIHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NtcGx4MzIgKm91dCwgaW50IGZsYWcpOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY3B0X3JldihpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY21wbHgzMiAqbGhzLCBrbXBfY21wbHgzMiByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jbXBseDMyICpvdXQsIGludCBmbGFnKTsKK2ttcF9jbXBseDY0IF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9jcHRfcmV2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY21wbHg2NCAqbGhzLCBrbXBfY21wbHg2NCByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7CitrbXBfY21wbHg2NCBfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXZfY3B0X3JldihpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NtcGx4NjQgKmxocywga21wX2NtcGx4NjQgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWcpOwora21wX2NtcGx4ODAgX19rbXBjX2F0b21pY19jbXBseDEwX3N1Yl9jcHRfcmV2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NtcGx4ODAgKmxocywga21wX2NtcGx4ODAgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK2ttcF9jbXBseDgwIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfY3B0X3JldihpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jbXBseDgwICpsaHMsIGttcF9jbXBseDgwIHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7CisjaWYgS01QX0hBVkVfUVVBRAorQ1BMWDEyOF9MRUcgX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9jcHRfcmV2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BMWDEyOF9MRUcgKmxocywgQ1BMWDEyOF9MRUcgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK0NQTFgxMjhfTEVHIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfY3B0X3JldihpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQTFgxMjhfTEVHICpsaHMsIENQTFgxMjhfTEVHIHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7CisjaWYgKEtNUF9BUkNIX1g4NikKK1F1YWRfYTE2X3QgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTZfY3B0X3JldihpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWRfYTE2X3QgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFkX2ExNl90IHJocywgaW50IGZsYWcpOworUXVhZF9hMTZfdCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2ExNl9jcHRfcmV2KGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhZF9hMTZfdCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1YWRfYTE2X3QgcmhzLCBpbnQgZmxhZyk7CitrbXBfY21wbHgxMjhfYTE2X3QKK19fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2X2NwdF9yZXYoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NtcGx4MTI4X2ExNl90ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jbXBseDEyOF9hMTZfdCByaHMsIGludCBmbGFnKTsKK2ttcF9jbXBseDEyOF9hMTZfdAorX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTZfY3B0X3JldihpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY21wbHgxMjhfYTE2X3QgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NtcGx4MTI4X2ExNl90IHJocywgaW50IGZsYWcpOworI2VuZGlmCisjZW5kaWYKKworLy8gICBPcGVuTVAgNC4wIENhcHR1cmUtd3JpdGUgKHN3YXApOiB7diA9IHg7IHggPSBleHByO30KK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfc3dwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKmxocywgY2hhciByaHMpOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfc3dwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgcmhzKTsKK2ttcF9pbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zd3AoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiByaHMpOwora21wX2ludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4X3N3cChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IHJocyk7CitmbG9hdCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zd3AoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZmxvYXQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByaHMpOworZG91YmxlIF9fa21wY19hdG9taWNfZmxvYXQ4X3N3cChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBkb3VibGUgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJocyk7Citsb25nIGRvdWJsZSBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3dwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZG91YmxlICpsaHMsIGxvbmcgZG91YmxlIHJocyk7CisjaWYgS01QX0hBVkVfUVVBRAorUVVBRF9MRUdBQ1kgX19rbXBjX2F0b21pY19mbG9hdDE2X3N3cChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUFEX0xFR0FDWSAqbGhzLCBRVUFEX0xFR0FDWSByaHMpOworI2VuZGlmCisvLyAhISEgVE9ETzogY2hlY2sgaWYgd2UgbmVlZCBhIHdvcmthcm91bmQgaGVyZQordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9zd3AoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jbXBseDMyIHJocywga21wX2NtcGx4MzIgKm91dCk7CisvLyBrbXBfY21wbHgzMiAgIAlfX2ttcGNfYXRvbWljX2NtcGx4NF9zd3AoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorLy8ga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDMyIHJocyApOworCitrbXBfY21wbHg2NCBfX2ttcGNfYXRvbWljX2NtcGx4OF9zd3AoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY21wbHg2NCAqbGhzLCBrbXBfY21wbHg2NCByaHMpOwora21wX2NtcGx4ODAgX19rbXBjX2F0b21pY19jbXBseDEwX3N3cChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY21wbHg4MCAqbGhzLCBrbXBfY21wbHg4MCByaHMpOworI2lmIEtNUF9IQVZFX1FVQUQKK0NQTFgxMjhfTEVHIF9fa21wY19hdG9taWNfY21wbHgxNl9zd3AoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BMWDEyOF9MRUcgKmxocywgQ1BMWDEyOF9MRUcgcmhzKTsKKyNpZiAoS01QX0FSQ0hfWDg2KQorUXVhZF9hMTZfdCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYTE2X3N3cChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWFkX2ExNl90ICpsaHMsIFF1YWRfYTE2X3QgcmhzKTsKK2ttcF9jbXBseDEyOF9hMTZfdCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3N3cChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jbXBseDEyOF9hMTZfdCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jbXBseDEyOF9hMTZfdCByaHMpOworI2VuZGlmCisjZW5kaWYKKworLy8gQ2FwdHVyZSByb3V0aW5lcyBmb3IgbWl4ZWQgdHlwZXMgKFJIUz1mbG9hdDE2KQorI2lmIEtNUF9IQVZFX1FVQUQKKworY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hZGRfY3B0X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUXVhZCByaHMsIGludCBmbGFnKTsKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2NwdF9mcChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1F1YWQgcmhzLCBpbnQgZmxhZyk7CitjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9jcHRfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9RdWFkIHJocywgaW50IGZsYWcpOworY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfY3B0X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUXVhZCByaHMsIGludCBmbGFnKTsKK3Vuc2lnbmVkIGNoYXIgX19rbXBjX2F0b21pY19maXhlZDF1X2FkZF9jcHRfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqbGhzLCBfUXVhZCByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK3Vuc2lnbmVkIGNoYXIgX19rbXBjX2F0b21pY19maXhlZDF1X3N1Yl9jcHRfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqbGhzLCBfUXVhZCByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK3Vuc2lnbmVkIGNoYXIgX19rbXBjX2F0b21pY19maXhlZDF1X211bF9jcHRfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqbGhzLCBfUXVhZCByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK3Vuc2lnbmVkIGNoYXIgX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9jcHRfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqbGhzLCBfUXVhZCByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKKworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfYWRkX2NwdF9mcChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUXVhZCByaHMsIGludCBmbGFnKTsKK3Nob3J0IF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9jcHRfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKmxocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1F1YWQgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfY3B0X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9RdWFkIHJocywgaW50IGZsYWcpOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2NwdF9mcChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUXVhZCByaHMsIGludCBmbGFnKTsKK3Vuc2lnbmVkIHNob3J0IF9fa21wY19hdG9taWNfZml4ZWQydV9hZGRfY3B0X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqbGhzLCBfUXVhZCByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7Cit1bnNpZ25lZCBzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc3ViX2NwdF9mcChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKmxocywgX1F1YWQgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWcpOwordW5zaWduZWQgc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJ1X211bF9jcHRfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICpsaHMsIF9RdWFkIHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK3Vuc2lnbmVkIHNob3J0IF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfY3B0X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqbGhzLCBfUXVhZCByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7CisKK2ttcF9pbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGRfY3B0X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgKmxocywgX1F1YWQgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50MzIgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2NwdF9mcChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyICpsaHMsIF9RdWFkIHJocywgaW50IGZsYWcpOwora21wX2ludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9jcHRfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiAqbGhzLCBfUXVhZCByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfY3B0X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgKmxocywgX1F1YWQgcmhzLCBpbnQgZmxhZyk7CitrbXBfdWludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0dV9hZGRfY3B0X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50MzIgKmxocywgX1F1YWQgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7CitrbXBfdWludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zdWJfY3B0X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50MzIgKmxocywgX1F1YWQgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7CitrbXBfdWludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0dV9tdWxfY3B0X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50MzIgKmxocywgX1F1YWQgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7CitrbXBfdWludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfY3B0X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50MzIgKmxocywgX1F1YWQgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7CisKK2ttcF9pbnQ2NCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGRfY3B0X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgKmxocywgX1F1YWQgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50NjQgX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2NwdF9mcChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0ICpsaHMsIF9RdWFkIHJocywgaW50IGZsYWcpOwora21wX2ludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9jcHRfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCAqbGhzLCBfUXVhZCByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfY3B0X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgKmxocywgX1F1YWQgcmhzLCBpbnQgZmxhZyk7CitrbXBfdWludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4dV9hZGRfY3B0X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgKmxocywgX1F1YWQgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7CitrbXBfdWludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4dV9zdWJfY3B0X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgKmxocywgX1F1YWQgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7CitrbXBfdWludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4dV9tdWxfY3B0X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgKmxocywgX1F1YWQgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7CitrbXBfdWludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfY3B0X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgKmxocywgX1F1YWQgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7CisKK2Zsb2F0IF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZF9jcHRfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3JlYWwzMiAqbGhzLCBfUXVhZCByaHMsIGludCBmbGFnKTsKK2Zsb2F0IF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHRfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3JlYWwzMiAqbGhzLCBfUXVhZCByaHMsIGludCBmbGFnKTsKK2Zsb2F0IF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9jcHRfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3JlYWwzMiAqbGhzLCBfUXVhZCByaHMsIGludCBmbGFnKTsKK2Zsb2F0IF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9jcHRfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3JlYWwzMiAqbGhzLCBfUXVhZCByaHMsIGludCBmbGFnKTsKKworZG91YmxlIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZF9jcHRfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9yZWFsNjQgKmxocywgX1F1YWQgcmhzLCBpbnQgZmxhZyk7Citkb3VibGUgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdF9mcChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3JlYWw2NCAqbGhzLCBfUXVhZCByaHMsIGludCBmbGFnKTsKK2RvdWJsZSBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWxfY3B0X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfcmVhbDY0ICpsaHMsIF9RdWFkIHJocywgaW50IGZsYWcpOworZG91YmxlIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9jcHRfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9yZWFsNjQgKmxocywgX1F1YWQgcmhzLCBpbnQgZmxhZyk7CisKK2xvbmcgZG91YmxlIF9fa21wY19hdG9taWNfZmxvYXQxMF9hZGRfY3B0X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGRvdWJsZSAqbGhzLCBfUXVhZCByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7Citsb25nIGRvdWJsZSBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2NwdF9mcChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBkb3VibGUgKmxocywgX1F1YWQgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWcpOworbG9uZyBkb3VibGUgX19rbXBjX2F0b21pY19mbG9hdDEwX211bF9jcHRfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZG91YmxlICpsaHMsIF9RdWFkIHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK2xvbmcgZG91YmxlIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfY3B0X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGRvdWJsZSAqbGhzLCBfUXVhZCByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7CisKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2NwdF9yZXZfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUXVhZCByaHMsIGludCBmbGFnKTsKK3Vuc2lnbmVkIGNoYXIgX19rbXBjX2F0b21pY19maXhlZDF1X3N1Yl9jcHRfcmV2X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUXVhZCByaHMsIGludCBmbGFnKTsKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2NwdF9yZXZfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUXVhZCByaHMsIGludCBmbGFnKTsKK3Vuc2lnbmVkIGNoYXIgX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9jcHRfcmV2X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUXVhZCByaHMsIGludCBmbGFnKTsKK3Nob3J0IF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9jcHRfcmV2X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUXVhZCByaHMsIGludCBmbGFnKTsKK3Vuc2lnbmVkIHNob3J0IF9fa21wY19hdG9taWNfZml4ZWQydV9zdWJfY3B0X3Jldl9mcChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICpsaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1F1YWQgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfY3B0X3Jldl9mcChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1F1YWQgcmhzLCBpbnQgZmxhZyk7Cit1bnNpZ25lZCBzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2NwdF9yZXZfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9RdWFkIHJocywgaW50IGZsYWcpOwora21wX2ludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9jcHRfcmV2X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyICpsaHMsIF9RdWFkIHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7CitrbXBfdWludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zdWJfY3B0X3Jldl9mcChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiAqbGhzLCBfUXVhZCByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7CitrbXBfaW50MzIgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2NwdF9yZXZfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgKmxocywgX1F1YWQgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK2ttcF91aW50MzIgX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9jcHRfcmV2X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDMyICpsaHMsIF9RdWFkIHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKK2ttcF9pbnQ2NCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfY3B0X3Jldl9mcChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCAqbGhzLCBfUXVhZCByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWcpOwora21wX3VpbnQ2NCBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc3ViX2NwdF9yZXZfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgKmxocywgX1F1YWQgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWcpOwora21wX2ludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9jcHRfcmV2X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0ICpsaHMsIF9RdWFkIHJocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7CitrbXBfdWludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfY3B0X3Jldl9mcChpZGVudF90ICppZF9yZWYsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQ2NCAqbGhzLCBfUXVhZCByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZyk7CitmbG9hdCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfY3B0X3Jldl9mcChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBmbG9hdCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1F1YWQgcmhzLCBpbnQgZmxhZyk7CitmbG9hdCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfY3B0X3Jldl9mcChpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBmbG9hdCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1F1YWQgcmhzLCBpbnQgZmxhZyk7Citkb3VibGUgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdF9yZXZfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgKmxocywgX1F1YWQgcmhzLCBpbnQgZmxhZyk7Citkb3VibGUgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2NwdF9yZXZfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgKmxocywgX1F1YWQgcmhzLCBpbnQgZmxhZyk7Citsb25nIGRvdWJsZSBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2NwdF9yZXZfZnAoaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGRvdWJsZSAqbGhzLCBfUXVhZCByaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWcpOworbG9uZyBkb3VibGUgX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9jcHRfcmV2X2ZwKGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBkb3VibGUgKmxocywgX1F1YWQgcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnKTsKKworI2VuZGlmIC8vIEtNUF9IQVZFX1FVQUQKKworLy8gRW5kIG9mIE9wZW5NUCA0LjAgY2FwdHVyZQorCisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworI2VuZGlmIC8vIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmIC8qIEtNUF9BVE9NSUNfSCAqLworCisvLyBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2JhcnJpZXIuY3BwIGIvZmluYWwvcnVudGltZS9zcmMva21wX2JhcnJpZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2OGUwMTUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfYmFycmllci5jcHAKQEAgLTAsMCArMSwyMDA4IEBACisvKgorICoga21wX2JhcnJpZXIuY3BwCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfd2FpdF9yZWxlYXNlLmgiCisjaW5jbHVkZSAia21wX2l0dC5oIgorI2luY2x1ZGUgImttcF9vcy5oIgorI2luY2x1ZGUgImttcF9zdGF0cy5oIgorCisKKyNpZiBLTVBfTUlDCisjaW5jbHVkZSA8aW1taW50cmluLmg+CisjZGVmaW5lIFVTRV9OR09fU1RPUkVTIDEKKyNlbmRpZiAvLyBLTVBfTUlDCisKKyNpbmNsdWRlICJ0c2FuX2Fubm90YXRpb25zLmgiCisKKyNpZiBLTVBfTUlDICYmIFVTRV9OR09fU1RPUkVTCisvLyBJQ1YgY29weWluZworI2RlZmluZSBuZ29fbG9hZChzcmMpIF9fbTUxMmQgVnQgPSBfbW01MTJfbG9hZF9wZCgodm9pZCAqKShzcmMpKQorI2RlZmluZSBuZ29fc3RvcmVfaWN2cyhkc3QsIHNyYykgX21tNTEyX3N0b3JlbnJuZ29fcGQoKHZvaWQgKikoZHN0KSwgVnQpCisjZGVmaW5lIG5nb19zdG9yZV9nbyhkc3QsIHNyYykgX21tNTEyX3N0b3JlbnJuZ29fcGQoKHZvaWQgKikoZHN0KSwgVnQpCisjZGVmaW5lIG5nb19zeW5jKCkgX19hc21fXyB2b2xhdGlsZSgibG9jazsgYWRkbCAkMCwwKCUlcnNwKSIgOjo6ICJtZW1vcnkiKQorI2Vsc2UKKyNkZWZpbmUgbmdvX2xvYWQoc3JjKSAoKHZvaWQpMCkKKyNkZWZpbmUgbmdvX3N0b3JlX2ljdnMoZHN0LCBzcmMpIGNvcHlfaWN2cygoZHN0KSwgKHNyYykpCisjZGVmaW5lIG5nb19zdG9yZV9nbyhkc3QsIHNyYykgS01QX01FTUNQWSgoZHN0KSwgKHNyYyksIENBQ0hFX0xJTkUpCisjZGVmaW5lIG5nb19zeW5jKCkgKCh2b2lkKTApCisjZW5kaWYgLyogS01QX01JQyAmJiBVU0VfTkdPX1NUT1JFUyAqLworCit2b2lkIF9fa21wX3ByaW50X3N0cnVjdHVyZSh2b2lkKTsgLy8gRm9yd2FyZCBkZWNsYXJhdGlvbgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJhcnJpZXIgQWxnb3JpdGhtcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIExpbmVhciBCYXJyaWVyCitzdGF0aWMgdm9pZCBfX2ttcF9saW5lYXJfYmFycmllcl9nYXRoZXIoCisgICAgZW51bSBiYXJyaWVyX3R5cGUgYnQsIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBpbnQgZ3RpZCwgaW50IHRpZCwKKyAgICB2b2lkICgqcmVkdWNlKSh2b2lkICosIHZvaWQgKikgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqaXR0X3N5bmNfb2JqKSkgeworICBLTVBfVElNRV9ERVZFTE9QRVJfUEFSVElUSU9ORURfQkxPQ0soS01QX2xpbmVhcl9nYXRoZXIpOworICBrbXBfdGVhbV90ICp0ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgIGttcF9ic3RhdGVfdCAqdGhyX2JhciA9ICZ0aGlzX3Roci0+dGgudGhfYmFyW2J0XS5iYjsKKyAga21wX2luZm9fdCAqKm90aGVyX3RocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKworICBLQV9UUkFDRSgKKyAgICAgIDIwLAorICAgICAgKCJfX2ttcF9saW5lYXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIGVudGVyIGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7CisgIEtNUF9ERUJVR19BU1NFUlQodGhpc190aHIgPT0gb3RoZXJfdGhyZWFkc1t0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc190aWRdKTsKKworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgLy8gQmFycmllciBpbWJhbGFuY2UgLSBzYXZlIGFycml2ZSB0aW1lIHRvIHRoZSB0aHJlYWQKKyAgaWYgKF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDMgfHwgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMikgeworICAgIHRoaXNfdGhyLT50aC50aF9iYXJfYXJyaXZlX3RpbWUgPSB0aGlzX3Roci0+dGgudGhfYmFyX21pbl90aW1lID0KKyAgICAgICAgX19pdHRfZ2V0X3RpbWVzdGFtcCgpOworICB9CisjZW5kaWYKKyAgLy8gV2Ugbm93IHBlcmZvcm0gYSBsaW5lYXIgcmVkdWN0aW9uIHRvIHNpZ25hbCB0aGF0IGFsbCBvZiB0aGUgdGhyZWFkcyBoYXZlCisgIC8vIGFycml2ZWQuCisgIGlmICghS01QX01BU1RFUl9USUQodGlkKSkgeworICAgIEtBX1RSQUNFKDIwLAorICAgICAgICAgICAgICgiX19rbXBfbGluZWFyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSByZWxlYXNpbmcgVCMlZCglZDolZCkiCisgICAgICAgICAgICAgICJhcnJpdmVkKCVwKTogJWxsdSA9PiAlbGx1XG4iLAorICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgX19rbXBfZ3RpZF9mcm9tX3RpZCgwLCB0ZWFtKSwKKyAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCAwLCAmdGhyX2Jhci0+Yl9hcnJpdmVkLCB0aHJfYmFyLT5iX2Fycml2ZWQsCisgICAgICAgICAgICAgIHRocl9iYXItPmJfYXJyaXZlZCArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKyAgICAvLyBNYXJrIGFycml2YWwgdG8gbWFzdGVyIHRocmVhZAorICAgIC8qIEFmdGVyIHBlcmZvcm1pbmcgdGhpcyB3cml0ZSwgYSB3b3JrZXIgdGhyZWFkIG1heSBub3QgYXNzdW1lIHRoYXQgdGhlIHRlYW0KKyAgICAgICBpcyB2YWxpZCBhbnkgbW9yZSAtIGl0IGNvdWxkIGJlIGRlYWxsb2NhdGVkIGJ5IHRoZSBtYXN0ZXIgdGhyZWFkIGF0IGFueQorICAgICAgIHRpbWUuICovCisgICAgQU5OT1RBVEVfQkFSUklFUl9CRUdJTih0aGlzX3Rocik7CisgICAga21wX2ZsYWdfNjQgZmxhZygmdGhyX2Jhci0+Yl9hcnJpdmVkLCBvdGhlcl90aHJlYWRzWzBdKTsKKyAgICBmbGFnLnJlbGVhc2UoKTsKKyAgfSBlbHNlIHsKKyAgICBrbXBfYmFsaWduX3RlYW1fdCAqdGVhbV9iYXIgPSAmdGVhbS0+dC50X2JhcltidF07CisgICAgaW50IG5wcm9jID0gdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2M7CisgICAgaW50IGk7CisgICAgLy8gRG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzbGVlcCBiaXQgaGVyZSBvciBhdG9taWMgc2luY2UgdGVhbSBzZXR0aW5nCisgICAga21wX3VpbnQ2NCBuZXdfc3RhdGUgPQorICAgICAgICB0ZWFtX2Jhci0+Yl9hcnJpdmVkICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUDsKKworICAgIC8vIENvbGxlY3QgYWxsIHRoZSB3b3JrZXIgdGVhbSBtZW1iZXIgdGhyZWFkcy4KKyAgICBmb3IgKGkgPSAxOyBpIDwgbnByb2M7ICsraSkgeworI2lmIEtNUF9DQUNIRV9NQU5BR0UKKyAgICAgIC8vIFByZWZldGNoIG5leHQgdGhyZWFkJ3MgYXJyaXZlZCBjb3VudAorICAgICAgaWYgKGkgKyAxIDwgbnByb2MpCisgICAgICAgIEtNUF9DQUNIRV9QUkVGRVRDSCgmb3RoZXJfdGhyZWFkc1tpICsgMV0tPnRoLnRoX2JhcltidF0uYmIuYl9hcnJpdmVkKTsKKyNlbmRpZiAvKiBLTVBfQ0FDSEVfTUFOQUdFICovCisgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9saW5lYXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIHdhaXQgVCMlZCglZDolZCkgIgorICAgICAgICAgICAgICAgICAgICAiYXJyaXZlZCglcCkgPT0gJWxsdVxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIF9fa21wX2d0aWRfZnJvbV90aWQoaSwgdGVhbSksCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgaSwKKyAgICAgICAgICAgICAgICAgICAgJm90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2JhcltidF0uYmIuYl9hcnJpdmVkLCBuZXdfc3RhdGUpKTsKKworICAgICAgLy8gV2FpdCBmb3Igd29ya2VyIHRocmVhZCB0byBhcnJpdmUKKyAgICAgIGttcF9mbGFnXzY0IGZsYWcoJm90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2JhcltidF0uYmIuYl9hcnJpdmVkLAorICAgICAgICAgICAgICAgICAgICAgICBuZXdfc3RhdGUpOworICAgICAgZmxhZy53YWl0KHRoaXNfdGhyLCBGQUxTRSBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopKTsKKyAgICAgIEFOTk9UQVRFX0JBUlJJRVJfRU5EKG90aGVyX3RocmVhZHNbaV0pOworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAgIC8vIEJhcnJpZXIgaW1iYWxhbmNlIC0gd3JpdGUgbWluIG9mIHRoZSB0aHJlYWQgdGltZSBhbmQgdGhlIG90aGVyIHRocmVhZAorICAgICAgLy8gdGltZSB0byB0aGUgdGhyZWFkLgorICAgICAgaWYgKF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDIpIHsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX2Jhcl9taW5fdGltZSA9IEtNUF9NSU4oCisgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfYmFyX21pbl90aW1lLCBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9iYXJfbWluX3RpbWUpOworICAgICAgfQorI2VuZGlmCisgICAgICBpZiAocmVkdWNlKSB7CisgICAgICAgIEtBX1RSQUNFKDEwMCwKKyAgICAgICAgICAgICAgICAgKCJfX2ttcF9saW5lYXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpICs9IFQjJWQoJWQ6JWQpXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIF9fa21wX2d0aWRfZnJvbV90aWQoaSwgdGVhbSksCisgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIGkpKTsKKyAgICAgICAgQU5OT1RBVEVfUkVEVUNFX0FGVEVSKHJlZHVjZSk7CisgICAgICAgICgqcmVkdWNlKSh0aGlzX3Roci0+dGgudGhfbG9jYWwucmVkdWNlX2RhdGEsCisgICAgICAgICAgICAgICAgICBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSk7CisgICAgICAgIEFOTk9UQVRFX1JFRFVDRV9CRUZPUkUocmVkdWNlKTsKKyAgICAgICAgQU5OT1RBVEVfUkVEVUNFX0JFRk9SRSgmdGVhbS0+dC50X2Jhcik7CisgICAgICB9CisgICAgfQorICAgIC8vIERvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgc2xlZXAgYml0IGhlcmUgb3IgYXRvbWljIHNpbmNlIHRlYW0gc2V0dGluZworICAgIHRlYW1fYmFyLT5iX2Fycml2ZWQgPSBuZXdfc3RhdGU7CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfbGluZWFyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSBzZXQgdGVhbSAlZCAiCisgICAgICAgICAgICAgICAgICAiYXJyaXZlZCglcCkgPSAlbGx1XG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIHRlYW0tPnQudF9pZCwgJnRlYW1fYmFyLT5iX2Fycml2ZWQsCisgICAgICAgICAgICAgICAgICBuZXdfc3RhdGUpKTsKKyAgfQorICBLQV9UUkFDRSgKKyAgICAgIDIwLAorICAgICAgKCJfX2ttcF9saW5lYXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIGV4aXQgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKK30KKworc3RhdGljIHZvaWQgX19rbXBfbGluZWFyX2JhcnJpZXJfcmVsZWFzZSgKKyAgICBlbnVtIGJhcnJpZXJfdHlwZSBidCwga21wX2luZm9fdCAqdGhpc190aHIsIGludCBndGlkLCBpbnQgdGlkLAorICAgIGludCBwcm9wYWdhdGVfaWN2cyBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICppdHRfc3luY19vYmopKSB7CisgIEtNUF9USU1FX0RFVkVMT1BFUl9QQVJUSVRJT05FRF9CTE9DSyhLTVBfbGluZWFyX3JlbGVhc2UpOworICBrbXBfYnN0YXRlX3QgKnRocl9iYXIgPSAmdGhpc190aHItPnRoLnRoX2JhcltidF0uYmI7CisgIGttcF90ZWFtX3QgKnRlYW07CisKKyAgaWYgKEtNUF9NQVNURVJfVElEKHRpZCkpIHsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICBrbXBfdWludDMyIG5wcm9jID0gdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2M7CisgICAga21wX2luZm9fdCAqKm90aGVyX3RocmVhZHM7CisKKyAgICB0ZWFtID0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0gIT0gTlVMTCk7CisgICAgb3RoZXJfdGhyZWFkcyA9IHRlYW0tPnQudF90aHJlYWRzOworCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfbGluZWFyX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgbWFzdGVyIGVudGVyIGZvciAiCisgICAgICAgICAgICAgICAgICAiYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7CisKKyAgICBpZiAobnByb2MgPiAxKSB7CisjaWYgS01QX0JBUlJJRVJfSUNWX1BVU0gKKyAgICAgIHsKKyAgICAgICAgS01QX1RJTUVfREVWRUxPUEVSX1BBUlRJVElPTkVEX0JMT0NLKFVTRVJfaWN2X2NvcHkpOworICAgICAgICBpZiAocHJvcGFnYXRlX2ljdnMpIHsKKyAgICAgICAgICBuZ29fbG9hZCgmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbMF0udGRfaWN2cyk7CisgICAgICAgICAgZm9yIChpID0gMTsgaSA8IG5wcm9jOyArK2kpIHsKKyAgICAgICAgICAgIF9fa21wX2luaXRfaW1wbGljaXRfdGFzayh0ZWFtLT50LnRfaWRlbnQsIHRlYW0tPnQudF90aHJlYWRzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0sIGksIEZBTFNFKTsKKyAgICAgICAgICAgIG5nb19zdG9yZV9pY3ZzKCZ0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVtpXS50ZF9pY3ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWzBdLnRkX2ljdnMpOworICAgICAgICAgIH0KKyAgICAgICAgICBuZ29fc3luYygpOworICAgICAgICB9CisgICAgICB9CisjZW5kaWYgLy8gS01QX0JBUlJJRVJfSUNWX1BVU0gKKworICAgICAgLy8gTm93LCByZWxlYXNlIGFsbCBvZiB0aGUgd29ya2VyIHRocmVhZHMKKyAgICAgIGZvciAoaSA9IDE7IGkgPCBucHJvYzsgKytpKSB7CisjaWYgS01QX0NBQ0hFX01BTkFHRQorICAgICAgICAvLyBQcmVmZXRjaCBuZXh0IHRocmVhZCdzIGdvIGZsYWcKKyAgICAgICAgaWYgKGkgKyAxIDwgbnByb2MpCisgICAgICAgICAgS01QX0NBQ0hFX1BSRUZFVENIKCZvdGhlcl90aHJlYWRzW2kgKyAxXS0+dGgudGhfYmFyW2J0XS5iYi5iX2dvKTsKKyNlbmRpZiAvKiBLTVBfQ0FDSEVfTUFOQUdFICovCisgICAgICAgIEtBX1RSQUNFKAorICAgICAgICAgICAgMjAsCisgICAgICAgICAgICAoIl9fa21wX2xpbmVhcl9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpIHJlbGVhc2luZyBUIyVkKCVkOiVkKSAiCisgICAgICAgICAgICAgImdvKCVwKTogJXUgPT4gJXVcbiIsCisgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCwKKyAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIGksICZvdGhlcl90aHJlYWRzW2ldLT50aC50aF9iYXJbYnRdLmJiLmJfZ28sCisgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyW2J0XS5iYi5iX2dvLAorICAgICAgICAgICAgIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2JhcltidF0uYmIuYl9nbyArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKyAgICAgICAgQU5OT1RBVEVfQkFSUklFUl9CRUdJTihvdGhlcl90aHJlYWRzW2ldKTsKKyAgICAgICAga21wX2ZsYWdfNjQgZmxhZygmb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyW2J0XS5iYi5iX2dvLAorICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX3RocmVhZHNbaV0pOworICAgICAgICBmbGFnLnJlbGVhc2UoKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7IC8vIFdhaXQgZm9yIHRoZSBNQVNURVIgdGhyZWFkIHRvIHJlbGVhc2UgdXMKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9saW5lYXJfYmFycmllcl9yZWxlYXNlOiBUIyVkIHdhaXQgZ28oJXApID09ICV1XG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgJnRocl9iYXItPmJfZ28sIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKyAgICBrbXBfZmxhZ182NCBmbGFnKCZ0aHJfYmFyLT5iX2dvLCBLTVBfQkFSUklFUl9TVEFURV9CVU1QKTsKKyAgICBmbGFnLndhaXQodGhpc190aHIsIFRSVUUgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSk7CisgICAgQU5OT1RBVEVfQkFSUklFUl9FTkQodGhpc190aHIpOworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoKF9faXR0X3N5bmNfY3JlYXRlX3B0ciAmJiBpdHRfc3luY19vYmogPT0gTlVMTCkgfHwgS01QX0lUVF9ERUJVRykgeworICAgICAgLy8gSW4gYSBmb3JrIGJhcnJpZXI7IGNhbm5vdCBnZXQgdGhlIG9iamVjdCByZWxpYWJseSAob3IgSVRUTk9USUZZIGlzCisgICAgICAvLyBkaXNhYmxlZCkKKyAgICAgIGl0dF9zeW5jX29iaiA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdChndGlkLCBic19mb3Jram9pbl9iYXJyaWVyLCAwLCAtMSk7CisgICAgICAvLyBDYW5jZWwgd2FpdCBvbiBwcmV2aW91cyBwYXJhbGxlbCByZWdpb24uLi4KKyAgICAgIF9fa21wX2l0dF90YXNrX3N0YXJ0aW5nKGl0dF9zeW5jX29iaik7CisKKyAgICAgIGlmIChidCA9PSBic19mb3Jram9pbl9iYXJyaWVyICYmIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkpCisgICAgICAgIHJldHVybjsKKworICAgICAgaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KGd0aWQsIGJzX2Zvcmtqb2luX2JhcnJpZXIpOworICAgICAgaWYgKGl0dF9zeW5jX29iaiAhPSBOVUxMKQorICAgICAgICAvLyBDYWxsIHByZXBhcmUgYXMgZWFybHkgYXMgcG9zc2libGUgZm9yICJuZXciIGJhcnJpZXIKKyAgICAgICAgX19rbXBfaXR0X3Rhc2tfZmluaXNoZWQoaXR0X3N5bmNfb2JqKTsKKyAgICB9IGVsc2UKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZICovCisgICAgICAgIC8vIEVhcmx5IGV4aXQgZm9yIHJlYXBpbmcgdGhyZWFkcyByZWxlYXNpbmcgZm9ya2pvaW4gYmFycmllcgorICAgICAgICBpZiAoYnQgPT0gYnNfZm9ya2pvaW5fYmFycmllciAmJiBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpKQorICAgICAgcmV0dXJuOworLy8gVGhlIHdvcmtlciB0aHJlYWQgbWF5IG5vdyBhc3N1bWUgdGhhdCB0aGUgdGVhbSBpcyB2YWxpZC4KKyNpZmRlZiBLTVBfREVCVUcKKyAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworICAgIHRlYW0gPSBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF90ZWFtOworI2VuZGlmCisgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtICE9IE5VTEwpOworICAgIFRDV180KHRocl9iYXItPmJfZ28sIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUpOworICAgIEtBX1RSQUNFKDIwLAorICAgICAgICAgICAgICgiX19rbXBfbGluZWFyX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgc2V0IGdvKCVwKSA9ICV1XG4iLAorICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgJnRocl9iYXItPmJfZ28sIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUpKTsKKyAgICBLTVBfTUIoKTsgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICB9CisgIEtBX1RSQUNFKAorICAgICAgMjAsCisgICAgICAoIl9fa21wX2xpbmVhcl9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpIGV4aXQgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKK30KKworLy8gVHJlZSBiYXJyaWVyCitzdGF0aWMgdm9pZAorX19rbXBfdHJlZV9iYXJyaWVyX2dhdGhlcihlbnVtIGJhcnJpZXJfdHlwZSBidCwga21wX2luZm9fdCAqdGhpc190aHIsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlkLCB2b2lkICgqcmVkdWNlKSh2b2lkICosIHZvaWQgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKml0dF9zeW5jX29iaikpIHsKKyAgS01QX1RJTUVfREVWRUxPUEVSX1BBUlRJVElPTkVEX0JMT0NLKEtNUF90cmVlX2dhdGhlcik7CisgIGttcF90ZWFtX3QgKnRlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAga21wX2JzdGF0ZV90ICp0aHJfYmFyID0gJnRoaXNfdGhyLT50aC50aF9iYXJbYnRdLmJiOworICBrbXBfaW5mb190ICoqb3RoZXJfdGhyZWFkcyA9IHRlYW0tPnQudF90aHJlYWRzOworICBrbXBfdWludDMyIG5wcm9jID0gdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2M7CisgIGttcF91aW50MzIgYnJhbmNoX2JpdHMgPSBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1tidF07CisgIGttcF91aW50MzIgYnJhbmNoX2ZhY3RvciA9IDEgPDwgYnJhbmNoX2JpdHM7CisgIGttcF91aW50MzIgY2hpbGQ7CisgIGttcF91aW50MzIgY2hpbGRfdGlkOworICBrbXBfdWludDY0IG5ld19zdGF0ZTsKKworICBLQV9UUkFDRSgKKyAgICAgIDIwLCAoIl9fa21wX3RyZWVfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIGVudGVyIGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCkpOworICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyID09IG90aGVyX3RocmVhZHNbdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfdGlkXSk7CisKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgIC8vIEJhcnJpZXIgaW1iYWxhbmNlIC0gc2F2ZSBhcnJpdmUgdGltZSB0byB0aGUgdGhyZWFkCisgIGlmIChfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAzIHx8IF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDIpIHsKKyAgICB0aGlzX3Roci0+dGgudGhfYmFyX2Fycml2ZV90aW1lID0gdGhpc190aHItPnRoLnRoX2Jhcl9taW5fdGltZSA9CisgICAgICAgIF9faXR0X2dldF90aW1lc3RhbXAoKTsKKyAgfQorI2VuZGlmCisgIC8vIFBlcmZvcm0gdHJlZSBnYXRoZXIgdG8gd2FpdCB1bnRpbCBhbGwgdGhyZWFkcyBoYXZlIGFycml2ZWQ7IHJlZHVjZSBhbnkKKyAgLy8gcmVxdWlyZWQgZGF0YSBhcyB3ZSBnbworICBjaGlsZF90aWQgPSAodGlkIDw8IGJyYW5jaF9iaXRzKSArIDE7CisgIGlmIChjaGlsZF90aWQgPCBucHJvYykgeworICAgIC8vIFBhcmVudCB0aHJlYWRzIHdhaXQgZm9yIGFsbCB0aGVpciBjaGlsZHJlbiB0byBhcnJpdmUKKyAgICBuZXdfc3RhdGUgPSB0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQgKyBLTVBfQkFSUklFUl9TVEFURV9CVU1QOworICAgIGNoaWxkID0gMTsKKyAgICBkbyB7CisgICAgICBrbXBfaW5mb190ICpjaGlsZF90aHIgPSBvdGhlcl90aHJlYWRzW2NoaWxkX3RpZF07CisgICAgICBrbXBfYnN0YXRlX3QgKmNoaWxkX2JhciA9ICZjaGlsZF90aHItPnRoLnRoX2JhcltidF0uYmI7CisjaWYgS01QX0NBQ0hFX01BTkFHRQorICAgICAgLy8gUHJlZmV0Y2ggbmV4dCB0aHJlYWQncyBhcnJpdmVkIGNvdW50CisgICAgICBpZiAoY2hpbGQgKyAxIDw9IGJyYW5jaF9mYWN0b3IgJiYgY2hpbGRfdGlkICsgMSA8IG5wcm9jKQorICAgICAgICBLTVBfQ0FDSEVfUFJFRkVUQ0goCisgICAgICAgICAgICAmb3RoZXJfdGhyZWFkc1tjaGlsZF90aWQgKyAxXS0+dGgudGhfYmFyW2J0XS5iYi5iX2Fycml2ZWQpOworI2VuZGlmIC8qIEtNUF9DQUNIRV9NQU5BR0UgKi8KKyAgICAgIEtBX1RSQUNFKDIwLAorICAgICAgICAgICAgICAgKCJfX2ttcF90cmVlX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSB3YWl0IFQjJWQoJWQ6JXUpICIKKyAgICAgICAgICAgICAgICAiYXJyaXZlZCglcCkgPT0gJWxsdVxuIiwKKyAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgX19rbXBfZ3RpZF9mcm9tX3RpZChjaGlsZF90aWQsIHRlYW0pLAorICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgY2hpbGRfdGlkLCAmY2hpbGRfYmFyLT5iX2Fycml2ZWQsIG5ld19zdGF0ZSkpOworICAgICAgLy8gV2FpdCBmb3IgY2hpbGQgdG8gYXJyaXZlCisgICAgICBrbXBfZmxhZ182NCBmbGFnKCZjaGlsZF9iYXItPmJfYXJyaXZlZCwgbmV3X3N0YXRlKTsKKyAgICAgIGZsYWcud2FpdCh0aGlzX3RociwgRkFMU0UgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSk7CisgICAgICBBTk5PVEFURV9CQVJSSUVSX0VORChjaGlsZF90aHIpOworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAgIC8vIEJhcnJpZXIgaW1iYWxhbmNlIC0gd3JpdGUgbWluIG9mIHRoZSB0aHJlYWQgdGltZSBhbmQgYSBjaGlsZCB0aW1lIHRvCisgICAgICAvLyB0aGUgdGhyZWFkLgorICAgICAgaWYgKF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDIpIHsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX2Jhcl9taW5fdGltZSA9IEtNUF9NSU4odGhpc190aHItPnRoLnRoX2Jhcl9taW5fdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfdGhyLT50aC50aF9iYXJfbWluX3RpbWUpOworICAgICAgfQorI2VuZGlmCisgICAgICBpZiAocmVkdWNlKSB7CisgICAgICAgIEtBX1RSQUNFKDEwMCwKKyAgICAgICAgICAgICAgICAgKCJfX2ttcF90cmVlX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSArPSBUIyVkKCVkOiV1KVxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksCisgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIGNoaWxkX3RpZCkpOworICAgICAgICBBTk5PVEFURV9SRURVQ0VfQUZURVIocmVkdWNlKTsKKyAgICAgICAgKCpyZWR1Y2UpKHRoaXNfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSwKKyAgICAgICAgICAgICAgICAgIGNoaWxkX3Roci0+dGgudGhfbG9jYWwucmVkdWNlX2RhdGEpOworICAgICAgICBBTk5PVEFURV9SRURVQ0VfQkVGT1JFKHJlZHVjZSk7CisgICAgICAgIEFOTk9UQVRFX1JFRFVDRV9CRUZPUkUoJnRlYW0tPnQudF9iYXIpOworICAgICAgfQorICAgICAgY2hpbGQrKzsKKyAgICAgIGNoaWxkX3RpZCsrOworICAgIH0gd2hpbGUgKGNoaWxkIDw9IGJyYW5jaF9mYWN0b3IgJiYgY2hpbGRfdGlkIDwgbnByb2MpOworICB9CisKKyAgaWYgKCFLTVBfTUFTVEVSX1RJRCh0aWQpKSB7IC8vIFdvcmtlciB0aHJlYWRzCisgICAga21wX2ludDMyIHBhcmVudF90aWQgPSAodGlkIC0gMSkgPj4gYnJhbmNoX2JpdHM7CisKKyAgICBLQV9UUkFDRSgyMCwKKyAgICAgICAgICAgICAoIl9fa21wX3RyZWVfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIHJlbGVhc2luZyBUIyVkKCVkOiVkKSAiCisgICAgICAgICAgICAgICJhcnJpdmVkKCVwKTogJWxsdSA9PiAlbGx1XG4iLAorICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgX19rbXBfZ3RpZF9mcm9tX3RpZChwYXJlbnRfdGlkLCB0ZWFtKSwKKyAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBwYXJlbnRfdGlkLCAmdGhyX2Jhci0+Yl9hcnJpdmVkLCB0aHJfYmFyLT5iX2Fycml2ZWQsCisgICAgICAgICAgICAgIHRocl9iYXItPmJfYXJyaXZlZCArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKworICAgIC8vIE1hcmsgYXJyaXZhbCB0byBwYXJlbnQgdGhyZWFkCisgICAgLyogQWZ0ZXIgcGVyZm9ybWluZyB0aGlzIHdyaXRlLCBhIHdvcmtlciB0aHJlYWQgbWF5IG5vdCBhc3N1bWUgdGhhdCB0aGUgdGVhbQorICAgICAgIGlzIHZhbGlkIGFueSBtb3JlIC0gaXQgY291bGQgYmUgZGVhbGxvY2F0ZWQgYnkgdGhlIG1hc3RlciB0aHJlYWQgYXQgYW55CisgICAgICAgdGltZS4gICovCisgICAgQU5OT1RBVEVfQkFSUklFUl9CRUdJTih0aGlzX3Rocik7CisgICAga21wX2ZsYWdfNjQgZmxhZygmdGhyX2Jhci0+Yl9hcnJpdmVkLCBvdGhlcl90aHJlYWRzW3BhcmVudF90aWRdKTsKKyAgICBmbGFnLnJlbGVhc2UoKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBOZWVkIHRvIHVwZGF0ZSB0aGUgdGVhbSBhcnJpdmVkIHBvaW50ZXIgaWYgd2UgYXJlIHRoZSBtYXN0ZXIgdGhyZWFkCisgICAgaWYgKG5wcm9jID4gMSkgLy8gTmV3IHZhbHVlIHdhcyBhbHJlYWR5IGNvbXB1dGVkIGFib3ZlCisgICAgICB0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQgPSBuZXdfc3RhdGU7CisgICAgZWxzZQorICAgICAgdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkICs9IEtNUF9CQVJSSUVSX1NUQVRFX0JVTVA7CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdHJlZV9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgc2V0IHRlYW0gJWQgIgorICAgICAgICAgICAgICAgICAgImFycml2ZWQoJXApID0gJWxsdVxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCB0ZWFtLT50LnRfaWQsCisgICAgICAgICAgICAgICAgICAmdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkLCB0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQpKTsKKyAgfQorICBLQV9UUkFDRSgyMCwKKyAgICAgICAgICAgKCJfX2ttcF90cmVlX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSBleGl0IGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKK30KKworc3RhdGljIHZvaWQgX19rbXBfdHJlZV9iYXJyaWVyX3JlbGVhc2UoCisgICAgZW51bSBiYXJyaWVyX3R5cGUgYnQsIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBpbnQgZ3RpZCwgaW50IHRpZCwKKyAgICBpbnQgcHJvcGFnYXRlX2ljdnMgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqaXR0X3N5bmNfb2JqKSkgeworICBLTVBfVElNRV9ERVZFTE9QRVJfUEFSVElUSU9ORURfQkxPQ0soS01QX3RyZWVfcmVsZWFzZSk7CisgIGttcF90ZWFtX3QgKnRlYW07CisgIGttcF9ic3RhdGVfdCAqdGhyX2JhciA9ICZ0aGlzX3Roci0+dGgudGhfYmFyW2J0XS5iYjsKKyAga21wX3VpbnQzMiBucHJvYzsKKyAga21wX3VpbnQzMiBicmFuY2hfYml0cyA9IF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1tidF07CisgIGttcF91aW50MzIgYnJhbmNoX2ZhY3RvciA9IDEgPDwgYnJhbmNoX2JpdHM7CisgIGttcF91aW50MzIgY2hpbGQ7CisgIGttcF91aW50MzIgY2hpbGRfdGlkOworCisgIC8vIFBlcmZvcm0gYSB0cmVlIHJlbGVhc2UgZm9yIGFsbCBvZiB0aGUgdGhyZWFkcyB0aGF0IGhhdmUgYmVlbiBnYXRoZXJlZAorICBpZiAoIUtNUF9NQVNURVJfVElEKAorICAgICAgICAgIHRpZCkpIHsgLy8gSGFuZGxlIGZvcmsgYmFycmllciB3b3JrZXJzIHdobyBhcmVuJ3QgcGFydCBvZiBhIHRlYW0geWV0CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdHJlZV9iYXJyaWVyX3JlbGVhc2U6IFQjJWQgd2FpdCBnbyglcCkgPT0gJXVcbiIsIGd0aWQsCisgICAgICAgICAgICAgICAgICAmdGhyX2Jhci0+Yl9nbywgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCkpOworICAgIC8vIFdhaXQgZm9yIHBhcmVudCB0aHJlYWQgdG8gcmVsZWFzZSB1cworICAgIGttcF9mbGFnXzY0IGZsYWcoJnRocl9iYXItPmJfZ28sIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApOworICAgIGZsYWcud2FpdCh0aGlzX3RociwgVFJVRSBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopKTsKKyAgICBBTk5PVEFURV9CQVJSSUVSX0VORCh0aGlzX3Rocik7CisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgIGlmICgoX19pdHRfc3luY19jcmVhdGVfcHRyICYmIGl0dF9zeW5jX29iaiA9PSBOVUxMKSB8fCBLTVBfSVRUX0RFQlVHKSB7CisgICAgICAvLyBJbiBmb3JrIGJhcnJpZXIgd2hlcmUgd2UgY291bGQgbm90IGdldCB0aGUgb2JqZWN0IHJlbGlhYmx5IChvcgorICAgICAgLy8gSVRUTk9USUZZIGlzIGRpc2FibGVkKQorICAgICAgaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KGd0aWQsIGJzX2Zvcmtqb2luX2JhcnJpZXIsIDAsIC0xKTsKKyAgICAgIC8vIENhbmNlbCB3YWl0IG9uIHByZXZpb3VzIHBhcmFsbGVsIHJlZ2lvbi4uLgorICAgICAgX19rbXBfaXR0X3Rhc2tfc3RhcnRpbmcoaXR0X3N5bmNfb2JqKTsKKworICAgICAgaWYgKGJ0ID09IGJzX2Zvcmtqb2luX2JhcnJpZXIgJiYgVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgICBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllcik7CisgICAgICBpZiAoaXR0X3N5bmNfb2JqICE9IE5VTEwpCisgICAgICAgIC8vIENhbGwgcHJlcGFyZSBhcyBlYXJseSBhcyBwb3NzaWJsZSBmb3IgIm5ldyIgYmFycmllcgorICAgICAgICBfX2ttcF9pdHRfdGFza19maW5pc2hlZChpdHRfc3luY19vYmopOworICAgIH0gZWxzZQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkgKi8KKyAgICAgICAgLy8gRWFybHkgZXhpdCBmb3IgcmVhcGluZyB0aHJlYWRzIHJlbGVhc2luZyBmb3Jram9pbiBiYXJyaWVyCisgICAgICAgIGlmIChidCA9PSBic19mb3Jram9pbl9iYXJyaWVyICYmIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkpCisgICAgICByZXR1cm47CisKKyAgICAvLyBUaGUgd29ya2VyIHRocmVhZCBtYXkgbm93IGFzc3VtZSB0aGF0IHRoZSB0ZWFtIGlzIHZhbGlkLgorICAgIHRlYW0gPSBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF90ZWFtOworICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbSAhPSBOVUxMKTsKKyAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworCisgICAgVENXXzQodGhyX2Jhci0+Yl9nbywgS01QX0lOSVRfQkFSUklFUl9TVEFURSk7CisgICAgS0FfVFJBQ0UoMjAsCisgICAgICAgICAgICAgKCJfX2ttcF90cmVlX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgc2V0IGdvKCVwKSA9ICV1XG4iLCBndGlkLAorICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIHRpZCwgJnRocl9iYXItPmJfZ28sIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUpKTsKKyAgICBLTVBfTUIoKTsgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICB9IGVsc2UgeworICAgIHRlYW0gPSBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF90ZWFtOworICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbSAhPSBOVUxMKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90cmVlX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgbWFzdGVyIGVudGVyIGZvciAiCisgICAgICAgICAgICAgICAgICAiYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7CisgIH0KKyAgbnByb2MgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYzsKKyAgY2hpbGRfdGlkID0gKHRpZCA8PCBicmFuY2hfYml0cykgKyAxOworCisgIGlmIChjaGlsZF90aWQgPCBucHJvYykgeworICAgIGttcF9pbmZvX3QgKipvdGhlcl90aHJlYWRzID0gdGVhbS0+dC50X3RocmVhZHM7CisgICAgY2hpbGQgPSAxOworICAgIC8vIFBhcmVudCB0aHJlYWRzIHJlbGVhc2UgYWxsIHRoZWlyIGNoaWxkcmVuCisgICAgZG8geworICAgICAga21wX2luZm9fdCAqY2hpbGRfdGhyID0gb3RoZXJfdGhyZWFkc1tjaGlsZF90aWRdOworICAgICAga21wX2JzdGF0ZV90ICpjaGlsZF9iYXIgPSAmY2hpbGRfdGhyLT50aC50aF9iYXJbYnRdLmJiOworI2lmIEtNUF9DQUNIRV9NQU5BR0UKKyAgICAgIC8vIFByZWZldGNoIG5leHQgdGhyZWFkJ3MgZ28gY291bnQKKyAgICAgIGlmIChjaGlsZCArIDEgPD0gYnJhbmNoX2ZhY3RvciAmJiBjaGlsZF90aWQgKyAxIDwgbnByb2MpCisgICAgICAgIEtNUF9DQUNIRV9QUkVGRVRDSCgKKyAgICAgICAgICAgICZvdGhlcl90aHJlYWRzW2NoaWxkX3RpZCArIDFdLT50aC50aF9iYXJbYnRdLmJiLmJfZ28pOworI2VuZGlmIC8qIEtNUF9DQUNIRV9NQU5BR0UgKi8KKworI2lmIEtNUF9CQVJSSUVSX0lDVl9QVVNICisgICAgICB7CisgICAgICAgIEtNUF9USU1FX0RFVkVMT1BFUl9QQVJUSVRJT05FRF9CTE9DSyhVU0VSX2ljdl9jb3B5KTsKKyAgICAgICAgaWYgKHByb3BhZ2F0ZV9pY3ZzKSB7CisgICAgICAgICAgX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKHRlYW0tPnQudF9pZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbY2hpbGRfdGlkXSwgdGVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfdGlkLCBGQUxTRSk7CisgICAgICAgICAgY29weV9pY3ZzKCZ0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVtjaGlsZF90aWRdLnRkX2ljdnMsCisgICAgICAgICAgICAgICAgICAgICZ0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVswXS50ZF9pY3ZzKTsKKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmIC8vIEtNUF9CQVJSSUVSX0lDVl9QVVNICisgICAgICBLQV9UUkFDRSgyMCwKKyAgICAgICAgICAgICAgICgiX19rbXBfdHJlZV9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpIHJlbGVhc2luZyBUIyVkKCVkOiV1KSIKKyAgICAgICAgICAgICAgICAiZ28oJXApOiAldSA9PiAldVxuIiwKKyAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgX19rbXBfZ3RpZF9mcm9tX3RpZChjaGlsZF90aWQsIHRlYW0pLAorICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgY2hpbGRfdGlkLCAmY2hpbGRfYmFyLT5iX2dvLCBjaGlsZF9iYXItPmJfZ28sCisgICAgICAgICAgICAgICAgY2hpbGRfYmFyLT5iX2dvICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCkpOworICAgICAgLy8gUmVsZWFzZSBjaGlsZCBmcm9tIGJhcnJpZXIKKyAgICAgIEFOTk9UQVRFX0JBUlJJRVJfQkVHSU4oY2hpbGRfdGhyKTsKKyAgICAgIGttcF9mbGFnXzY0IGZsYWcoJmNoaWxkX2Jhci0+Yl9nbywgY2hpbGRfdGhyKTsKKyAgICAgIGZsYWcucmVsZWFzZSgpOworICAgICAgY2hpbGQrKzsKKyAgICAgIGNoaWxkX3RpZCsrOworICAgIH0gd2hpbGUgKGNoaWxkIDw9IGJyYW5jaF9mYWN0b3IgJiYgY2hpbGRfdGlkIDwgbnByb2MpOworICB9CisgIEtBX1RSQUNFKAorICAgICAgMjAsICgiX19rbXBfdHJlZV9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpIGV4aXQgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7Cit9CisKKy8vIEh5cGVyIEJhcnJpZXIKK3N0YXRpYyB2b2lkCitfX2ttcF9oeXBlcl9iYXJyaWVyX2dhdGhlcihlbnVtIGJhcnJpZXJfdHlwZSBidCwga21wX2luZm9fdCAqdGhpc190aHIsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpZCwgdm9pZCAoKnJlZHVjZSkodm9pZCAqLCB2b2lkICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqaXR0X3N5bmNfb2JqKSkgeworICBLTVBfVElNRV9ERVZFTE9QRVJfUEFSVElUSU9ORURfQkxPQ0soS01QX2h5cGVyX2dhdGhlcik7CisgIGttcF90ZWFtX3QgKnRlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAga21wX2JzdGF0ZV90ICp0aHJfYmFyID0gJnRoaXNfdGhyLT50aC50aF9iYXJbYnRdLmJiOworICBrbXBfaW5mb190ICoqb3RoZXJfdGhyZWFkcyA9IHRlYW0tPnQudF90aHJlYWRzOworICBrbXBfdWludDY0IG5ld19zdGF0ZSA9IEtNUF9CQVJSSUVSX1VOVVNFRF9TVEFURTsKKyAga21wX3VpbnQzMiBudW1fdGhyZWFkcyA9IHRoaXNfdGhyLT50aC50aF90ZWFtX25wcm9jOworICBrbXBfdWludDMyIGJyYW5jaF9iaXRzID0gX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHNbYnRdOworICBrbXBfdWludDMyIGJyYW5jaF9mYWN0b3IgPSAxIDw8IGJyYW5jaF9iaXRzOworICBrbXBfdWludDMyIG9mZnNldDsKKyAga21wX3VpbnQzMiBsZXZlbDsKKworICBLQV9UUkFDRSgKKyAgICAgIDIwLAorICAgICAgKCJfX2ttcF9oeXBlcl9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgZW50ZXIgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKKyAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3RociA9PSBvdGhlcl90aHJlYWRzW3RoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3RpZF0pOworCisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAvLyBCYXJyaWVyIGltYmFsYW5jZSAtIHNhdmUgYXJyaXZlIHRpbWUgdG8gdGhlIHRocmVhZAorICBpZiAoX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMyB8fCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAyKSB7CisgICAgdGhpc190aHItPnRoLnRoX2Jhcl9hcnJpdmVfdGltZSA9IHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUgPQorICAgICAgICBfX2l0dF9nZXRfdGltZXN0YW1wKCk7CisgIH0KKyNlbmRpZgorICAvKiBQZXJmb3JtIGEgaHlwZXJjdWJlLWVtYmVkZGVkIHRyZWUgZ2F0aGVyIHRvIHdhaXQgdW50aWwgYWxsIG9mIHRoZSB0aHJlYWRzCisgICAgIGhhdmUgYXJyaXZlZCwgYW5kIHJlZHVjZSBhbnkgcmVxdWlyZWQgZGF0YSBhcyB3ZSBnby4gICovCisgIGttcF9mbGFnXzY0IHBfZmxhZygmdGhyX2Jhci0+Yl9hcnJpdmVkKTsKKyAgZm9yIChsZXZlbCA9IDAsIG9mZnNldCA9IDE7IG9mZnNldCA8IG51bV90aHJlYWRzOworICAgICAgIGxldmVsICs9IGJyYW5jaF9iaXRzLCBvZmZzZXQgPDw9IGJyYW5jaF9iaXRzKSB7CisgICAga21wX3VpbnQzMiBjaGlsZDsKKyAgICBrbXBfdWludDMyIGNoaWxkX3RpZDsKKworICAgIGlmICgoKHRpZCA+PiBsZXZlbCkgJiAoYnJhbmNoX2ZhY3RvciAtIDEpKSAhPSAwKSB7CisgICAgICBrbXBfaW50MzIgcGFyZW50X3RpZCA9IHRpZCAmIH4oKDEgPDwgKGxldmVsICsgYnJhbmNoX2JpdHMpKSAtIDEpOworCisgICAgICBLQV9UUkFDRSgyMCwKKyAgICAgICAgICAgICAgICgiX19rbXBfaHlwZXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIHJlbGVhc2luZyBUIyVkKCVkOiVkKSAiCisgICAgICAgICAgICAgICAgImFycml2ZWQoJXApOiAlbGx1ID0+ICVsbHVcbiIsCisgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIF9fa21wX2d0aWRfZnJvbV90aWQocGFyZW50X3RpZCwgdGVhbSksCisgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBwYXJlbnRfdGlkLCAmdGhyX2Jhci0+Yl9hcnJpdmVkLAorICAgICAgICAgICAgICAgIHRocl9iYXItPmJfYXJyaXZlZCwKKyAgICAgICAgICAgICAgICB0aHJfYmFyLT5iX2Fycml2ZWQgKyBLTVBfQkFSUklFUl9TVEFURV9CVU1QKSk7CisgICAgICAvLyBNYXJrIGFycml2YWwgdG8gcGFyZW50IHRocmVhZAorICAgICAgLyogQWZ0ZXIgcGVyZm9ybWluZyB0aGlzIHdyaXRlIChpbiB0aGUgbGFzdCBpdGVyYXRpb24gb2YgdGhlIGVuY2xvc2luZyBmb3IKKyAgICAgICAgIGxvb3ApLCBhIHdvcmtlciB0aHJlYWQgbWF5IG5vdCBhc3N1bWUgdGhhdCB0aGUgdGVhbSBpcyB2YWxpZCBhbnkgbW9yZQorICAgICAgICAgLSBpdCBjb3VsZCBiZSBkZWFsbG9jYXRlZCBieSB0aGUgbWFzdGVyIHRocmVhZCBhdCBhbnkgdGltZS4gICovCisgICAgICBBTk5PVEFURV9CQVJSSUVSX0JFR0lOKHRoaXNfdGhyKTsKKyAgICAgIHBfZmxhZy5zZXRfd2FpdGVyKG90aGVyX3RocmVhZHNbcGFyZW50X3RpZF0pOworICAgICAgcF9mbGFnLnJlbGVhc2UoKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIFBhcmVudCB0aHJlYWRzIHdhaXQgZm9yIGNoaWxkcmVuIHRvIGFycml2ZQorICAgIGlmIChuZXdfc3RhdGUgPT0gS01QX0JBUlJJRVJfVU5VU0VEX1NUQVRFKQorICAgICAgbmV3X3N0YXRlID0gdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUDsKKyAgICBmb3IgKGNoaWxkID0gMSwgY2hpbGRfdGlkID0gdGlkICsgKDEgPDwgbGV2ZWwpOworICAgICAgICAgY2hpbGQgPCBicmFuY2hfZmFjdG9yICYmIGNoaWxkX3RpZCA8IG51bV90aHJlYWRzOworICAgICAgICAgY2hpbGQrKywgY2hpbGRfdGlkICs9ICgxIDw8IGxldmVsKSkgeworICAgICAga21wX2luZm9fdCAqY2hpbGRfdGhyID0gb3RoZXJfdGhyZWFkc1tjaGlsZF90aWRdOworICAgICAga21wX2JzdGF0ZV90ICpjaGlsZF9iYXIgPSAmY2hpbGRfdGhyLT50aC50aF9iYXJbYnRdLmJiOworI2lmIEtNUF9DQUNIRV9NQU5BR0UKKyAgICAgIGttcF91aW50MzIgbmV4dF9jaGlsZF90aWQgPSBjaGlsZF90aWQgKyAoMSA8PCBsZXZlbCk7CisgICAgICAvLyBQcmVmZXRjaCBuZXh0IHRocmVhZCdzIGFycml2ZWQgY291bnQKKyAgICAgIGlmIChjaGlsZCArIDEgPCBicmFuY2hfZmFjdG9yICYmIG5leHRfY2hpbGRfdGlkIDwgbnVtX3RocmVhZHMpCisgICAgICAgIEtNUF9DQUNIRV9QUkVGRVRDSCgKKyAgICAgICAgICAgICZvdGhlcl90aHJlYWRzW25leHRfY2hpbGRfdGlkXS0+dGgudGhfYmFyW2J0XS5iYi5iX2Fycml2ZWQpOworI2VuZGlmIC8qIEtNUF9DQUNIRV9NQU5BR0UgKi8KKyAgICAgIEtBX1RSQUNFKDIwLAorICAgICAgICAgICAgICAgKCJfX2ttcF9oeXBlcl9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgd2FpdCBUIyVkKCVkOiV1KSAiCisgICAgICAgICAgICAgICAgImFycml2ZWQoJXApID09ICVsbHVcbiIsCisgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIF9fa21wX2d0aWRfZnJvbV90aWQoY2hpbGRfdGlkLCB0ZWFtKSwKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIGNoaWxkX3RpZCwgJmNoaWxkX2Jhci0+Yl9hcnJpdmVkLCBuZXdfc3RhdGUpKTsKKyAgICAgIC8vIFdhaXQgZm9yIGNoaWxkIHRvIGFycml2ZQorICAgICAga21wX2ZsYWdfNjQgY19mbGFnKCZjaGlsZF9iYXItPmJfYXJyaXZlZCwgbmV3X3N0YXRlKTsKKyAgICAgIGNfZmxhZy53YWl0KHRoaXNfdGhyLCBGQUxTRSBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopKTsKKyAgICAgIEFOTk9UQVRFX0JBUlJJRVJfRU5EKGNoaWxkX3Rocik7CisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgICAgLy8gQmFycmllciBpbWJhbGFuY2UgLSB3cml0ZSBtaW4gb2YgdGhlIHRocmVhZCB0aW1lIGFuZCBhIGNoaWxkIHRpbWUgdG8KKyAgICAgIC8vIHRoZSB0aHJlYWQuCisgICAgICBpZiAoX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMikgeworICAgICAgICB0aGlzX3Roci0+dGgudGhfYmFyX21pbl90aW1lID0gS01QX01JTih0aGlzX3Roci0+dGgudGhfYmFyX21pbl90aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZF90aHItPnRoLnRoX2Jhcl9taW5fdGltZSk7CisgICAgICB9CisjZW5kaWYKKyAgICAgIGlmIChyZWR1Y2UpIHsKKyAgICAgICAgS0FfVFJBQ0UoMTAwLAorICAgICAgICAgICAgICAgICAoIl9fa21wX2h5cGVyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSArPSBUIyVkKCVkOiV1KVxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksCisgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIGNoaWxkX3RpZCkpOworICAgICAgICBBTk5PVEFURV9SRURVQ0VfQUZURVIocmVkdWNlKTsKKyAgICAgICAgKCpyZWR1Y2UpKHRoaXNfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSwKKyAgICAgICAgICAgICAgICAgIGNoaWxkX3Roci0+dGgudGhfbG9jYWwucmVkdWNlX2RhdGEpOworICAgICAgICBBTk5PVEFURV9SRURVQ0VfQkVGT1JFKHJlZHVjZSk7CisgICAgICAgIEFOTk9UQVRFX1JFRFVDRV9CRUZPUkUoJnRlYW0tPnQudF9iYXIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChLTVBfTUFTVEVSX1RJRCh0aWQpKSB7CisgICAgLy8gTmVlZCB0byB1cGRhdGUgdGhlIHRlYW0gYXJyaXZlZCBwb2ludGVyIGlmIHdlIGFyZSB0aGUgbWFzdGVyIHRocmVhZAorICAgIGlmIChuZXdfc3RhdGUgPT0gS01QX0JBUlJJRVJfVU5VU0VEX1NUQVRFKQorICAgICAgdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkICs9IEtNUF9CQVJSSUVSX1NUQVRFX0JVTVA7CisgICAgZWxzZQorICAgICAgdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkID0gbmV3X3N0YXRlOworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2h5cGVyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSBzZXQgdGVhbSAlZCAiCisgICAgICAgICAgICAgICAgICAiYXJyaXZlZCglcCkgPSAlbGx1XG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIHRlYW0tPnQudF9pZCwKKyAgICAgICAgICAgICAgICAgICZ0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQsIHRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCkpOworICB9CisgIEtBX1RSQUNFKAorICAgICAgMjAsICgiX19rbXBfaHlwZXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIGV4aXQgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7Cit9CisKKy8vIFRoZSByZXZlcnNlIHZlcnNpb25zIHNlZW0gdG8gYmVhdCB0aGUgZm9yd2FyZCB2ZXJzaW9ucyBvdmVyYWxsCisjZGVmaW5lIEtNUF9SRVZFUlNFX0hZUEVSX0JBUgorc3RhdGljIHZvaWQgX19rbXBfaHlwZXJfYmFycmllcl9yZWxlYXNlKAorICAgIGVudW0gYmFycmllcl90eXBlIGJ0LCBrbXBfaW5mb190ICp0aGlzX3RociwgaW50IGd0aWQsIGludCB0aWQsCisgICAgaW50IHByb3BhZ2F0ZV9pY3ZzIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKml0dF9zeW5jX29iaikpIHsKKyAgS01QX1RJTUVfREVWRUxPUEVSX1BBUlRJVElPTkVEX0JMT0NLKEtNUF9oeXBlcl9yZWxlYXNlKTsKKyAga21wX3RlYW1fdCAqdGVhbTsKKyAga21wX2JzdGF0ZV90ICp0aHJfYmFyID0gJnRoaXNfdGhyLT50aC50aF9iYXJbYnRdLmJiOworICBrbXBfaW5mb190ICoqb3RoZXJfdGhyZWFkczsKKyAga21wX3VpbnQzMiBudW1fdGhyZWFkczsKKyAga21wX3VpbnQzMiBicmFuY2hfYml0cyA9IF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1tidF07CisgIGttcF91aW50MzIgYnJhbmNoX2ZhY3RvciA9IDEgPDwgYnJhbmNoX2JpdHM7CisgIGttcF91aW50MzIgY2hpbGQ7CisgIGttcF91aW50MzIgY2hpbGRfdGlkOworICBrbXBfdWludDMyIG9mZnNldDsKKyAga21wX3VpbnQzMiBsZXZlbDsKKworICAvKiBQZXJmb3JtIGEgaHlwZXJjdWJlLWVtYmVkZGVkIHRyZWUgcmVsZWFzZSBmb3IgYWxsIG9mIHRoZSB0aHJlYWRzIHRoYXQgaGF2ZQorICAgICBiZWVuIGdhdGhlcmVkLiBJZiBLTVBfUkVWRVJTRV9IWVBFUl9CQVIgaXMgZGVmaW5lZCAoZGVmYXVsdCkgdGhlIHRocmVhZHMKKyAgICAgYXJlIHJlbGVhc2VkIGluIHRoZSByZXZlcnNlIG9yZGVyIG9mIHRoZSBjb3JyZXNwb25kaW5nIGdhdGhlciwgb3RoZXJ3aXNlCisgICAgIHRocmVhZHMgYXJlIHJlbGVhc2VkIGluIHRoZSBzYW1lIG9yZGVyLiAqLworICBpZiAoS01QX01BU1RFUl9USUQodGlkKSkgeyAvLyBtYXN0ZXIKKyAgICB0ZWFtID0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0gIT0gTlVMTCk7CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaHlwZXJfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBtYXN0ZXIgZW50ZXIgZm9yICIKKyAgICAgICAgICAgICAgICAgICJiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKKyNpZiBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorICAgIGlmIChwcm9wYWdhdGVfaWN2cykgeyAvLyBtYXN0ZXIgYWxyZWFkeSBoYXMgSUNWcyBpbiBmaW5hbCBkZXN0aW5hdGlvbjsgY29weQorICAgICAgY29weV9pY3ZzKCZ0aHJfYmFyLT50aF9maXhlZF9pY3ZzLAorICAgICAgICAgICAgICAgICZ0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX2ljdnMpOworICAgIH0KKyNlbmRpZgorICB9IGVsc2UgeyAvLyBIYW5kbGUgZm9yayBiYXJyaWVyIHdvcmtlcnMgd2hvIGFyZW4ndCBwYXJ0IG9mIGEgdGVhbSB5ZXQKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oeXBlcl9iYXJyaWVyX3JlbGVhc2U6IFQjJWQgd2FpdCBnbyglcCkgPT0gJXVcbiIsIGd0aWQsCisgICAgICAgICAgICAgICAgICAmdGhyX2Jhci0+Yl9nbywgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCkpOworICAgIC8vIFdhaXQgZm9yIHBhcmVudCB0aHJlYWQgdG8gcmVsZWFzZSB1cworICAgIGttcF9mbGFnXzY0IGZsYWcoJnRocl9iYXItPmJfZ28sIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApOworICAgIGZsYWcud2FpdCh0aGlzX3RociwgVFJVRSBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopKTsKKyAgICBBTk5PVEFURV9CQVJSSUVSX0VORCh0aGlzX3Rocik7CisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgIGlmICgoX19pdHRfc3luY19jcmVhdGVfcHRyICYmIGl0dF9zeW5jX29iaiA9PSBOVUxMKSB8fCBLTVBfSVRUX0RFQlVHKSB7CisgICAgICAvLyBJbiBmb3JrIGJhcnJpZXIgd2hlcmUgd2UgY291bGQgbm90IGdldCB0aGUgb2JqZWN0IHJlbGlhYmx5CisgICAgICBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllciwgMCwgLTEpOworICAgICAgLy8gQ2FuY2VsIHdhaXQgb24gcHJldmlvdXMgcGFyYWxsZWwgcmVnaW9uLi4uCisgICAgICBfX2ttcF9pdHRfdGFza19zdGFydGluZyhpdHRfc3luY19vYmopOworCisgICAgICBpZiAoYnQgPT0gYnNfZm9ya2pvaW5fYmFycmllciAmJiBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpKQorICAgICAgICByZXR1cm47CisKKyAgICAgIGl0dF9zeW5jX29iaiA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdChndGlkLCBic19mb3Jram9pbl9iYXJyaWVyKTsKKyAgICAgIGlmIChpdHRfc3luY19vYmogIT0gTlVMTCkKKyAgICAgICAgLy8gQ2FsbCBwcmVwYXJlIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGZvciAibmV3IiBiYXJyaWVyCisgICAgICAgIF9fa21wX2l0dF90YXNrX2ZpbmlzaGVkKGl0dF9zeW5jX29iaik7CisgICAgfSBlbHNlCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWSAqLworICAgICAgICAvLyBFYXJseSBleGl0IGZvciByZWFwaW5nIHRocmVhZHMgcmVsZWFzaW5nIGZvcmtqb2luIGJhcnJpZXIKKyAgICAgICAgaWYgKGJ0ID09IGJzX2Zvcmtqb2luX2JhcnJpZXIgJiYgVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSkKKyAgICAgIHJldHVybjsKKworICAgIC8vIFRoZSB3b3JrZXIgdGhyZWFkIG1heSBub3cgYXNzdW1lIHRoYXQgdGhlIHRlYW0gaXMgdmFsaWQuCisgICAgdGVhbSA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3RlYW07CisgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtICE9IE5VTEwpOworICAgIHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCk7CisKKyAgICBUQ1dfNCh0aHJfYmFyLT5iX2dvLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFKTsKKyAgICBLQV9UUkFDRSgyMCwKKyAgICAgICAgICAgICAoIl9fa21wX2h5cGVyX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgc2V0IGdvKCVwKSA9ICV1XG4iLAorICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgJnRocl9iYXItPmJfZ28sIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUpKTsKKyAgICBLTVBfTUIoKTsgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICB9CisgIG51bV90aHJlYWRzID0gdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2M7CisgIG90aGVyX3RocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKworI2lmZGVmIEtNUF9SRVZFUlNFX0hZUEVSX0JBUgorICAvLyBDb3VudCB1cCB0byBjb3JyZWN0IGxldmVsIGZvciBwYXJlbnQKKyAgZm9yIChsZXZlbCA9IDAsIG9mZnNldCA9IDE7CisgICAgICAgb2Zmc2V0IDwgbnVtX3RocmVhZHMgJiYgKCgodGlkID4+IGxldmVsKSAmIChicmFuY2hfZmFjdG9yIC0gMSkpID09IDApOworICAgICAgIGxldmVsICs9IGJyYW5jaF9iaXRzLCBvZmZzZXQgPDw9IGJyYW5jaF9iaXRzKQorICAgIDsKKworICAvLyBOb3cgZ28gZG93biBmcm9tIHRoZXJlCisgIGZvciAobGV2ZWwgLT0gYnJhbmNoX2JpdHMsIG9mZnNldCA+Pj0gYnJhbmNoX2JpdHM7IG9mZnNldCAhPSAwOworICAgICAgIGxldmVsIC09IGJyYW5jaF9iaXRzLCBvZmZzZXQgPj49IGJyYW5jaF9iaXRzKQorI2Vsc2UKKyAgLy8gR28gZG93biB0aGUgdHJlZSwgbGV2ZWwgYnkgbGV2ZWwKKyAgZm9yIChsZXZlbCA9IDAsIG9mZnNldCA9IDE7IG9mZnNldCA8IG51bV90aHJlYWRzOworICAgICAgIGxldmVsICs9IGJyYW5jaF9iaXRzLCBvZmZzZXQgPDw9IGJyYW5jaF9iaXRzKQorI2VuZGlmIC8vIEtNUF9SRVZFUlNFX0hZUEVSX0JBUgorICB7CisjaWZkZWYgS01QX1JFVkVSU0VfSFlQRVJfQkFSCisgICAgLyogTm93IGdvIGluIHJldmVyc2Ugb3JkZXIgdGhyb3VnaCB0aGUgY2hpbGRyZW4sIGhpZ2hlc3QgdG8gbG93ZXN0LgorICAgICAgIEluaXRpYWwgc2V0dGluZyBvZiBjaGlsZCBpcyBjb25zZXJ2YXRpdmUgaGVyZS4gKi8KKyAgICBjaGlsZCA9IG51bV90aHJlYWRzID4+ICgobGV2ZWwgPT0gMCkgPyBsZXZlbCA6IGxldmVsIC0gMSk7CisgICAgZm9yIChjaGlsZCA9IChjaGlsZCA8IGJyYW5jaF9mYWN0b3IgLSAxKSA/IGNoaWxkIDogYnJhbmNoX2ZhY3RvciAtIDEsCisgICAgICAgIGNoaWxkX3RpZCA9IHRpZCArIChjaGlsZCA8PCBsZXZlbCk7CisgICAgICAgICBjaGlsZCA+PSAxOyBjaGlsZC0tLCBjaGlsZF90aWQgLT0gKDEgPDwgbGV2ZWwpKQorI2Vsc2UKKyAgICBpZiAoKCh0aWQgPj4gbGV2ZWwpICYgKGJyYW5jaF9mYWN0b3IgLSAxKSkgIT0gMCkKKyAgICAgIC8vIE5vIG5lZWQgdG8gZ28gbG93ZXIgdGhhbiB0aGlzLCBzaW5jZSB0aGlzIGlzIHRoZSBsZXZlbCBwYXJlbnQgd291bGQgYmUKKyAgICAgIC8vIG5vdGlmaWVkCisgICAgICBicmVhazsKKyAgICAvLyBJdGVyYXRlIHRocm91Z2ggY2hpbGRyZW4gb24gdGhpcyBsZXZlbCBvZiB0aGUgdHJlZQorICAgIGZvciAoY2hpbGQgPSAxLCBjaGlsZF90aWQgPSB0aWQgKyAoMSA8PCBsZXZlbCk7CisgICAgICAgICBjaGlsZCA8IGJyYW5jaF9mYWN0b3IgJiYgY2hpbGRfdGlkIDwgbnVtX3RocmVhZHM7CisgICAgICAgICBjaGlsZCsrLCBjaGlsZF90aWQgKz0gKDEgPDwgbGV2ZWwpKQorI2VuZGlmIC8vIEtNUF9SRVZFUlNFX0hZUEVSX0JBUgorICAgIHsKKyAgICAgIGlmIChjaGlsZF90aWQgPj0gbnVtX3RocmVhZHMpCisgICAgICAgIGNvbnRpbnVlOyAvLyBDaGlsZCBkb2Vzbid0IGV4aXN0IHNvIGtlZXAgZ29pbmcKKyAgICAgIGVsc2UgeworICAgICAgICBrbXBfaW5mb190ICpjaGlsZF90aHIgPSBvdGhlcl90aHJlYWRzW2NoaWxkX3RpZF07CisgICAgICAgIGttcF9ic3RhdGVfdCAqY2hpbGRfYmFyID0gJmNoaWxkX3Roci0+dGgudGhfYmFyW2J0XS5iYjsKKyNpZiBLTVBfQ0FDSEVfTUFOQUdFCisgICAgICAgIGttcF91aW50MzIgbmV4dF9jaGlsZF90aWQgPSBjaGlsZF90aWQgLSAoMSA8PCBsZXZlbCk7CisvLyBQcmVmZXRjaCBuZXh0IHRocmVhZCdzIGdvIGNvdW50CisjaWZkZWYgS01QX1JFVkVSU0VfSFlQRVJfQkFSCisgICAgICAgIGlmIChjaGlsZCAtIDEgPj0gMSAmJiBuZXh0X2NoaWxkX3RpZCA8IG51bV90aHJlYWRzKQorI2Vsc2UKKyAgICAgICAgaWYgKGNoaWxkICsgMSA8IGJyYW5jaF9mYWN0b3IgJiYgbmV4dF9jaGlsZF90aWQgPCBudW1fdGhyZWFkcykKKyNlbmRpZiAvLyBLTVBfUkVWRVJTRV9IWVBFUl9CQVIKKyAgICAgICAgICBLTVBfQ0FDSEVfUFJFRkVUQ0goCisgICAgICAgICAgICAgICZvdGhlcl90aHJlYWRzW25leHRfY2hpbGRfdGlkXS0+dGgudGhfYmFyW2J0XS5iYi5iX2dvKTsKKyNlbmRpZiAvKiBLTVBfQ0FDSEVfTUFOQUdFICovCisKKyNpZiBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorICAgICAgICBpZiAocHJvcGFnYXRlX2ljdnMpIC8vIHB1c2ggbXkgZml4ZWQgSUNWcyB0byBteSBjaGlsZAorICAgICAgICAgIGNvcHlfaWN2cygmY2hpbGRfYmFyLT50aF9maXhlZF9pY3ZzLCAmdGhyX2Jhci0+dGhfZml4ZWRfaWN2cyk7CisjZW5kaWYgLy8gS01QX0JBUlJJRVJfSUNWX1BVU0gKKworICAgICAgICBLQV9UUkFDRSgKKyAgICAgICAgICAgIDIwLAorICAgICAgICAgICAgKCJfX2ttcF9oeXBlcl9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpIHJlbGVhc2luZyBUIyVkKCVkOiV1KSIKKyAgICAgICAgICAgICAiZ28oJXApOiAldSA9PiAldVxuIiwKKyAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgX19rbXBfZ3RpZF9mcm9tX3RpZChjaGlsZF90aWQsIHRlYW0pLAorICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgY2hpbGRfdGlkLCAmY2hpbGRfYmFyLT5iX2dvLCBjaGlsZF9iYXItPmJfZ28sCisgICAgICAgICAgICAgY2hpbGRfYmFyLT5iX2dvICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCkpOworICAgICAgICAvLyBSZWxlYXNlIGNoaWxkIGZyb20gYmFycmllcgorICAgICAgICBBTk5PVEFURV9CQVJSSUVSX0JFR0lOKGNoaWxkX3Rocik7CisgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJmNoaWxkX2Jhci0+Yl9nbywgY2hpbGRfdGhyKTsKKyAgICAgICAgZmxhZy5yZWxlYXNlKCk7CisgICAgICB9CisgICAgfQorICB9CisjaWYgS01QX0JBUlJJRVJfSUNWX1BVU0gKKyAgaWYgKHByb3BhZ2F0ZV9pY3ZzICYmCisgICAgICAhS01QX01BU1RFUl9USUQodGlkKSkgeyAvLyBjb3B5IElDVnMgbG9jYWxseSB0byBmaW5hbCBkZXN0CisgICAgX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKHRlYW0tPnQudF9pZGVudCwgdGVhbS0+dC50X3RocmVhZHNbdGlkXSwgdGVhbSwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CisgICAgY29weV9pY3ZzKCZ0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX2ljdnMsCisgICAgICAgICAgICAgICZ0aHJfYmFyLT50aF9maXhlZF9pY3ZzKTsKKyAgfQorI2VuZGlmCisgIEtBX1RSQUNFKAorICAgICAgMjAsCisgICAgICAoIl9fa21wX2h5cGVyX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgZXhpdCBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCkpOworfQorCisvLyBIaWVyYXJjaGljYWwgQmFycmllcgorCisvLyBJbml0aWFsaXplIHRocmVhZCBiYXJyaWVyIGRhdGEKKy8qIEluaXRpYWxpemVzL3JlLWluaXRpYWxpemVzIHRoZSBoaWVyYXJjaGljYWwgYmFycmllciBkYXRhIHN0b3JlZCBvbiBhIHRocmVhZC4KKyAgIFBlcmZvcm1zIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBpbml0aWFsaXphdGlvbiByZXF1aXJlZCBiYXNlZCBvbiBob3cgdGhlIHRlYW0KKyAgIGhhcyBjaGFuZ2VkLiBSZXR1cm5zIHRydWUgaWYgbGVhZiBjaGlsZHJlbiB3aWxsIHJlcXVpcmUgYm90aCBvbi1jb3JlIGFuZAorICAgdHJhZGl0aW9uYWwgd2FrZS11cCBtZWNoYW5pc21zLiBGb3IgZXhhbXBsZSwgaWYgdGhlIHRlYW0gc2l6ZSBpbmNyZWFzZXMsCisgICB0aHJlYWRzIGFscmVhZHkgaW4gdGhlIHRlYW0gd2lsbCByZXNwb25kIHRvIG9uLWNvcmUgd2FrZXVwIG9uIHRoZWlyIHBhcmVudAorICAgdGhyZWFkLCBidXQgdGhyZWFkcyBuZXdseSBhZGRlZCB0byB0aGUgdGVhbSB3aWxsIG9ubHkgYmUgbGlzdGVuaW5nIG9uIHRoZQorICAgdGhlaXIgbG9jYWwgYl9nby4gKi8KK3N0YXRpYyBib29sIF9fa21wX2luaXRfaGllcmFyY2hpY2FsX2JhcnJpZXJfdGhyZWFkKGVudW0gYmFycmllcl90eXBlIGJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2JzdGF0ZV90ICp0aHJfYmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiBucHJvYywgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlkLCBrbXBfdGVhbV90ICp0ZWFtKSB7CisgIC8vIENoZWNrcyB0byBkZXRlcm1pbmUgaWYgKHJlLSlpbml0aWFsaXphdGlvbiBpcyBuZWVkZWQKKyAgYm9vbCB1bmluaXRpYWxpemVkID0gdGhyX2Jhci0+dGVhbSA9PSBOVUxMOworICBib29sIHRlYW1fY2hhbmdlZCA9IHRlYW0gIT0gdGhyX2Jhci0+dGVhbTsKKyAgYm9vbCB0ZWFtX3N6X2NoYW5nZWQgPSBucHJvYyAhPSB0aHJfYmFyLT5ucHJvYzsKKyAgYm9vbCB0aWRfY2hhbmdlZCA9IHRpZCAhPSB0aHJfYmFyLT5vbGRfdGlkOworICBib29sIHJldHZhbCA9IGZhbHNlOworCisgIGlmICh1bmluaXRpYWxpemVkIHx8IHRlYW1fc3pfY2hhbmdlZCkgeworICAgIF9fa21wX2dldF9oaWVyYXJjaHkobnByb2MsIHRocl9iYXIpOworICB9CisKKyAgaWYgKHVuaW5pdGlhbGl6ZWQgfHwgdGVhbV9zel9jaGFuZ2VkIHx8IHRpZF9jaGFuZ2VkKSB7CisgICAgdGhyX2Jhci0+bXlfbGV2ZWwgPSB0aHJfYmFyLT5kZXB0aCAtIDE7IC8vIGRlZmF1bHQgZm9yIG1hc3RlcgorICAgIHRocl9iYXItPnBhcmVudF90aWQgPSAtMTsgLy8gZGVmYXVsdCBmb3IgbWFzdGVyCisgICAgaWYgKCFLTVBfTUFTVEVSX1RJRCgKKyAgICAgICAgICAgIHRpZCkpIHsgLy8gaWYgbm90IG1hc3RlciwgZmluZCBwYXJlbnQgdGhyZWFkIGluIGhpZXJhcmNoeQorICAgICAga21wX3VpbnQzMiBkID0gMDsKKyAgICAgIHdoaWxlIChkIDwgdGhyX2Jhci0+ZGVwdGgpIHsgLy8gZmluZCBwYXJlbnQgYmFzZWQgb24gbGV2ZWwgb2YgdGhyZWFkIGluCisgICAgICAgIC8vIGhpZXJhcmNoeSwgYW5kIG5vdGUgbGV2ZWwKKyAgICAgICAga21wX3VpbnQzMiByZW07CisgICAgICAgIGlmIChkID09IHRocl9iYXItPmRlcHRoIC0gMikgeyAvLyByZWFjaGVkIGxldmVsIHJpZ2h0IGJlbG93IHRoZSBtYXN0ZXIKKyAgICAgICAgICB0aHJfYmFyLT5wYXJlbnRfdGlkID0gMDsKKyAgICAgICAgICB0aHJfYmFyLT5teV9sZXZlbCA9IGQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoKHJlbSA9IHRpZCAlIHRocl9iYXItPnNraXBfcGVyX2xldmVsW2QgKyAxXSkgIT0KKyAgICAgICAgICAgICAgICAgICAwKSB7IC8vIFRPRE86IGNhbiB3ZSBtYWtlIHRoaXMgb3AgZmFzdGVyPworICAgICAgICAgIC8vIHRocmVhZCBpcyBub3QgYSBzdWJ0cmVlIHJvb3QgYXQgbmV4dCBsZXZlbCwgc28gdGhpcyBpcyBtYXgKKyAgICAgICAgICB0aHJfYmFyLT5wYXJlbnRfdGlkID0gdGlkIC0gcmVtOworICAgICAgICAgIHRocl9iYXItPm15X2xldmVsID0gZDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICArK2Q7CisgICAgICB9CisgICAgfQorICAgIHRocl9iYXItPm9mZnNldCA9IDcgLSAodGlkIC0gdGhyX2Jhci0+cGFyZW50X3RpZCAtIDEpOworICAgIHRocl9iYXItPm9sZF90aWQgPSB0aWQ7CisgICAgdGhyX2Jhci0+d2FpdF9mbGFnID0gS01QX0JBUlJJRVJfTk9UX1dBSVRJTkc7CisgICAgdGhyX2Jhci0+dGVhbSA9IHRlYW07CisgICAgdGhyX2Jhci0+cGFyZW50X2JhciA9CisgICAgICAgICZ0ZWFtLT50LnRfdGhyZWFkc1t0aHJfYmFyLT5wYXJlbnRfdGlkXS0+dGgudGhfYmFyW2J0XS5iYjsKKyAgfQorICBpZiAodW5pbml0aWFsaXplZCB8fCB0ZWFtX2NoYW5nZWQgfHwgdGlkX2NoYW5nZWQpIHsKKyAgICB0aHJfYmFyLT50ZWFtID0gdGVhbTsKKyAgICB0aHJfYmFyLT5wYXJlbnRfYmFyID0KKyAgICAgICAgJnRlYW0tPnQudF90aHJlYWRzW3Rocl9iYXItPnBhcmVudF90aWRdLT50aC50aF9iYXJbYnRdLmJiOworICAgIHJldHZhbCA9IHRydWU7CisgIH0KKyAgaWYgKHVuaW5pdGlhbGl6ZWQgfHwgdGVhbV9zel9jaGFuZ2VkIHx8IHRpZF9jaGFuZ2VkKSB7CisgICAgdGhyX2Jhci0+bnByb2MgPSBucHJvYzsKKyAgICB0aHJfYmFyLT5sZWFmX2tpZHMgPSB0aHJfYmFyLT5iYXNlX2xlYWZfa2lkczsKKyAgICBpZiAodGhyX2Jhci0+bXlfbGV2ZWwgPT0gMCkKKyAgICAgIHRocl9iYXItPmxlYWZfa2lkcyA9IDA7CisgICAgaWYgKHRocl9iYXItPmxlYWZfa2lkcyAmJiAoa21wX3VpbnQzMil0aWQgKyB0aHJfYmFyLT5sZWFmX2tpZHMgKyAxID4gbnByb2MpCisgICAgICB0aHJfYmFyLT5sZWFmX2tpZHMgPSBucHJvYyAtIHRpZCAtIDE7CisgICAgdGhyX2Jhci0+bGVhZl9zdGF0ZSA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJfYmFyLT5sZWFmX2tpZHM7ICsraSkKKyAgICAgICgoY2hhciAqKSYodGhyX2Jhci0+bGVhZl9zdGF0ZSkpWzcgLSBpXSA9IDE7CisgIH0KKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfZ2F0aGVyKAorICAgIGVudW0gYmFycmllcl90eXBlIGJ0LCBrbXBfaW5mb190ICp0aGlzX3RociwgaW50IGd0aWQsIGludCB0aWQsCisgICAgdm9pZCAoKnJlZHVjZSkodm9pZCAqLCB2b2lkICopIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKml0dF9zeW5jX29iaikpIHsKKyAgS01QX1RJTUVfREVWRUxPUEVSX1BBUlRJVElPTkVEX0JMT0NLKEtNUF9oaWVyX2dhdGhlcik7CisgIGttcF90ZWFtX3QgKnRlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAga21wX2JzdGF0ZV90ICp0aHJfYmFyID0gJnRoaXNfdGhyLT50aC50aF9iYXJbYnRdLmJiOworICBrbXBfdWludDMyIG5wcm9jID0gdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2M7CisgIGttcF9pbmZvX3QgKipvdGhlcl90aHJlYWRzID0gdGVhbS0+dC50X3RocmVhZHM7CisgIGttcF91aW50NjQgbmV3X3N0YXRlOworCisgIGludCBsZXZlbCA9IHRlYW0tPnQudF9sZXZlbDsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICBpZiAob3RoZXJfdGhyZWFkc1swXQorICAgICAgICAgIC0+dGgudGhfdGVhbXNfbWljcm90YXNrKSAvLyBhcmUgd2UgaW5zaWRlIHRoZSB0ZWFtcyBjb25zdHJ1Y3Q/CisgICAgaWYgKHRoaXNfdGhyLT50aC50aF90ZWFtc19zaXplLm50ZWFtcyA+IDEpCisgICAgICArK2xldmVsOyAvLyBsZXZlbCB3YXMgbm90IGluY3JlYXNlZCBpbiB0ZWFtcyBjb25zdHJ1Y3QgZm9yIHRlYW1fb2ZfbWFzdGVycworI2VuZGlmCisgIGlmIChsZXZlbCA9PSAxKQorICAgIHRocl9iYXItPnVzZV9vbmNvcmVfYmFycmllciA9IDE7CisgIGVsc2UKKyAgICB0aHJfYmFyLT51c2Vfb25jb3JlX2JhcnJpZXIgPSAwOyAvLyBEbyBub3QgdXNlIG9uY29yZSBiYXJyaWVyIHdoZW4gbmVzdGVkCisKKyAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSBlbnRlciBmb3IgIgorICAgICAgICAgICAgICAgICJiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7CisgIEtNUF9ERUJVR19BU1NFUlQodGhpc190aHIgPT0gb3RoZXJfdGhyZWFkc1t0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc190aWRdKTsKKworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgLy8gQmFycmllciBpbWJhbGFuY2UgLSBzYXZlIGFycml2ZSB0aW1lIHRvIHRoZSB0aHJlYWQKKyAgaWYgKF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDMgfHwgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMikgeworICAgIHRoaXNfdGhyLT50aC50aF9iYXJfYXJyaXZlX3RpbWUgPSBfX2l0dF9nZXRfdGltZXN0YW1wKCk7CisgIH0KKyNlbmRpZgorCisgICh2b2lkKV9fa21wX2luaXRfaGllcmFyY2hpY2FsX2JhcnJpZXJfdGhyZWFkKGJ0LCB0aHJfYmFyLCBucHJvYywgZ3RpZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtKTsKKworICBpZiAodGhyX2Jhci0+bXlfbGV2ZWwpIHsgLy8gbm90IGEgbGVhZiAobXlfbGV2ZWw9PTAgbWVhbnMgbGVhZikKKyAgICBrbXBfaW50MzIgY2hpbGRfdGlkOworICAgIG5ld19zdGF0ZSA9CisgICAgICAgIChrbXBfdWludDY0KXRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVA7CisgICAgaWYgKF9fa21wX2RmbHRfYmxvY2t0aW1lID09IEtNUF9NQVhfQkxPQ0tUSU1FICYmCisgICAgICAgIHRocl9iYXItPnVzZV9vbmNvcmVfYmFycmllcikgeworICAgICAgaWYgKHRocl9iYXItPmxlYWZfa2lkcykgeworICAgICAgICAvLyBGaXJzdCwgd2FpdCBmb3IgbGVhZiBjaGlsZHJlbiB0byBjaGVjay1pbiBvbiBteSBiX2Fycml2ZWQgZmxhZworICAgICAgICBrbXBfdWludDY0IGxlYWZfc3RhdGUgPQorICAgICAgICAgICAgS01QX01BU1RFUl9USUQodGlkKQorICAgICAgICAgICAgICAgID8gdGhyX2Jhci0+Yl9hcnJpdmVkIHwgdGhyX2Jhci0+bGVhZl9zdGF0ZQorICAgICAgICAgICAgICAgIDogdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkIHwgdGhyX2Jhci0+bGVhZl9zdGF0ZTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSB3YWl0aW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAiZm9yIGxlYWYga2lkc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCkpOworICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZ0aHJfYmFyLT5iX2Fycml2ZWQsIGxlYWZfc3RhdGUpOworICAgICAgICBmbGFnLndhaXQodGhpc190aHIsIEZBTFNFIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikpOworICAgICAgICBpZiAocmVkdWNlKSB7CisgICAgICAgICAgQU5OT1RBVEVfUkVEVUNFX0FGVEVSKHJlZHVjZSk7CisgICAgICAgICAgZm9yIChjaGlsZF90aWQgPSB0aWQgKyAxOyBjaGlsZF90aWQgPD0gdGlkICsgdGhyX2Jhci0+bGVhZl9raWRzOworICAgICAgICAgICAgICAgKytjaGlsZF90aWQpIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpICs9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJUIyVkKCVkOiVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZChjaGlsZF90aWQsIHRlYW0pLCB0ZWFtLT50LnRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZF90aWQpKTsKKyAgICAgICAgICAgIEFOTk9UQVRFX0JBUlJJRVJfRU5EKG90aGVyX3RocmVhZHNbY2hpbGRfdGlkXSk7CisgICAgICAgICAgICAoKnJlZHVjZSkodGhpc190aHItPnRoLnRoX2xvY2FsLnJlZHVjZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgIG90aGVyX3RocmVhZHNbY2hpbGRfdGlkXS0+dGgudGhfbG9jYWwucmVkdWNlX2RhdGEpOworICAgICAgICAgIH0KKyAgICAgICAgICBBTk5PVEFURV9SRURVQ0VfQkVGT1JFKHJlZHVjZSk7CisgICAgICAgICAgQU5OT1RBVEVfUkVEVUNFX0JFRk9SRSgmdGVhbS0+dC50X2Jhcik7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2xlYXIgbGVhZl9zdGF0ZSBiaXRzCisgICAgICAgIEtNUF9URVNUX1RIRU5fQU5ENjQoJnRocl9iYXItPmJfYXJyaXZlZCwgfih0aHJfYmFyLT5sZWFmX3N0YXRlKSk7CisgICAgICB9CisgICAgICAvLyBOZXh0LCB3YWl0IGZvciBoaWdoZXIgbGV2ZWwgY2hpbGRyZW4gb24gZWFjaCBjaGlsZCdzIGJfYXJyaXZlZCBmbGFnCisgICAgICBmb3IgKGttcF91aW50MzIgZCA9IDE7IGQgPCB0aHJfYmFyLT5teV9sZXZlbDsKKyAgICAgICAgICAgKytkKSB7IC8vIGdhdGhlciBsb3dlc3QgbGV2ZWwgdGhyZWFkcyBmaXJzdCwgYnV0IHNraXAgMAorICAgICAgICBrbXBfdWludDMyIGxhc3QgPSB0aWQgKyB0aHJfYmFyLT5za2lwX3Blcl9sZXZlbFtkICsgMV0sCisgICAgICAgICAgICAgICAgICAgc2tpcCA9IHRocl9iYXItPnNraXBfcGVyX2xldmVsW2RdOworICAgICAgICBpZiAobGFzdCA+IG5wcm9jKQorICAgICAgICAgIGxhc3QgPSBucHJvYzsKKyAgICAgICAgZm9yIChjaGlsZF90aWQgPSB0aWQgKyBza2lwOyBjaGlsZF90aWQgPCAoaW50KWxhc3Q7IGNoaWxkX3RpZCArPSBza2lwKSB7CisgICAgICAgICAga21wX2luZm9fdCAqY2hpbGRfdGhyID0gb3RoZXJfdGhyZWFkc1tjaGlsZF90aWRdOworICAgICAgICAgIGttcF9ic3RhdGVfdCAqY2hpbGRfYmFyID0gJmNoaWxkX3Roci0+dGgudGhfYmFyW2J0XS5iYjsKKyAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIHdhaXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgIlQjJWQoJWQ6JWQpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJhcnJpdmVkKCVwKSA9PSAlbGx1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksIHRlYW0tPnQudF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX3RpZCwgJmNoaWxkX2Jhci0+Yl9hcnJpdmVkLCBuZXdfc3RhdGUpKTsKKyAgICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZjaGlsZF9iYXItPmJfYXJyaXZlZCwgbmV3X3N0YXRlKTsKKyAgICAgICAgICBmbGFnLndhaXQodGhpc190aHIsIEZBTFNFIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikpOworICAgICAgICAgIEFOTk9UQVRFX0JBUlJJRVJfRU5EKGNoaWxkX3Rocik7CisgICAgICAgICAgaWYgKHJlZHVjZSkgeworICAgICAgICAgICAgS0FfVFJBQ0UoMTAwLCAoIl9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgKz0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlQjJWQoJWQ6JWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksIHRlYW0tPnQudF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX3RpZCkpOworICAgICAgICAgICAgQU5OT1RBVEVfUkVEVUNFX0FGVEVSKHJlZHVjZSk7CisgICAgICAgICAgICAoKnJlZHVjZSkodGhpc190aHItPnRoLnRoX2xvY2FsLnJlZHVjZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX3Roci0+dGgudGhfbG9jYWwucmVkdWNlX2RhdGEpOworICAgICAgICAgICAgQU5OT1RBVEVfUkVEVUNFX0JFRk9SRShyZWR1Y2UpOworICAgICAgICAgICAgQU5OT1RBVEVfUkVEVUNFX0JFRk9SRSgmdGVhbS0+dC50X2Jhcik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsgLy8gQmxvY2t0aW1lIGlzIG5vdCBpbmZpbml0ZQorICAgICAgZm9yIChrbXBfdWludDMyIGQgPSAwOyBkIDwgdGhyX2Jhci0+bXlfbGV2ZWw7CisgICAgICAgICAgICsrZCkgeyAvLyBHYXRoZXIgbG93ZXN0IGxldmVsIHRocmVhZHMgZmlyc3QKKyAgICAgICAga21wX3VpbnQzMiBsYXN0ID0gdGlkICsgdGhyX2Jhci0+c2tpcF9wZXJfbGV2ZWxbZCArIDFdLAorICAgICAgICAgICAgICAgICAgIHNraXAgPSB0aHJfYmFyLT5za2lwX3Blcl9sZXZlbFtkXTsKKyAgICAgICAgaWYgKGxhc3QgPiBucHJvYykKKyAgICAgICAgICBsYXN0ID0gbnByb2M7CisgICAgICAgIGZvciAoY2hpbGRfdGlkID0gdGlkICsgc2tpcDsgY2hpbGRfdGlkIDwgKGludClsYXN0OyBjaGlsZF90aWQgKz0gc2tpcCkgeworICAgICAgICAgIGttcF9pbmZvX3QgKmNoaWxkX3RociA9IG90aGVyX3RocmVhZHNbY2hpbGRfdGlkXTsKKyAgICAgICAgICBrbXBfYnN0YXRlX3QgKmNoaWxkX2JhciA9ICZjaGlsZF90aHItPnRoLnRoX2JhcltidF0uYmI7CisgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSB3YWl0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJUIyVkKCVkOiVkKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiYXJyaXZlZCglcCkgPT0gJWxsdVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZChjaGlsZF90aWQsIHRlYW0pLCB0ZWFtLT50LnRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZF90aWQsICZjaGlsZF9iYXItPmJfYXJyaXZlZCwgbmV3X3N0YXRlKSk7CisgICAgICAgICAga21wX2ZsYWdfNjQgZmxhZygmY2hpbGRfYmFyLT5iX2Fycml2ZWQsIG5ld19zdGF0ZSk7CisgICAgICAgICAgZmxhZy53YWl0KHRoaXNfdGhyLCBGQUxTRSBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopKTsKKyAgICAgICAgICBBTk5PVEFURV9CQVJSSUVSX0VORChjaGlsZF90aHIpOworICAgICAgICAgIGlmIChyZWR1Y2UpIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpICs9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJUIyVkKCVkOiVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZChjaGlsZF90aWQsIHRlYW0pLCB0ZWFtLT50LnRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZF90aWQpKTsKKyAgICAgICAgICAgIEFOTk9UQVRFX1JFRFVDRV9BRlRFUihyZWR1Y2UpOworICAgICAgICAgICAgKCpyZWR1Y2UpKHRoaXNfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBjaGlsZF90aHItPnRoLnRoX2xvY2FsLnJlZHVjZV9kYXRhKTsKKyAgICAgICAgICAgIEFOTk9UQVRFX1JFRFVDRV9CRUZPUkUocmVkdWNlKTsKKyAgICAgICAgICAgIEFOTk9UQVRFX1JFRFVDRV9CRUZPUkUoJnRlYW0tPnQudF9iYXIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICAvLyBBbGwgc3Vib3JkaW5hdGVzIGFyZSBnYXRoZXJlZDsgbm93IHJlbGVhc2UgcGFyZW50IGlmIG5vdCBtYXN0ZXIgdGhyZWFkCisKKyAgaWYgKCFLTVBfTUFTVEVSX1RJRCh0aWQpKSB7IC8vIHdvcmtlciB0aHJlYWRzIHJlbGVhc2UgcGFyZW50IGluIGhpZXJhcmNoeQorICAgIEtBX1RSQUNFKAorICAgICAgICAyMCwKKyAgICAgICAgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIHJlbGVhc2luZyBUIyVkKCVkOiVkKSAiCisgICAgICAgICAiYXJyaXZlZCglcCk6ICVsbHUgPT4gJWxsdVxuIiwKKyAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLAorICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZCh0aHJfYmFyLT5wYXJlbnRfdGlkLCB0ZWFtKSwgdGVhbS0+dC50X2lkLAorICAgICAgICAgdGhyX2Jhci0+cGFyZW50X3RpZCwgJnRocl9iYXItPmJfYXJyaXZlZCwgdGhyX2Jhci0+Yl9hcnJpdmVkLAorICAgICAgICAgdGhyX2Jhci0+Yl9hcnJpdmVkICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCkpOworICAgIC8qIE1hcmsgYXJyaXZhbCB0byBwYXJlbnQ6IEFmdGVyIHBlcmZvcm1pbmcgdGhpcyB3cml0ZSwgYSB3b3JrZXIgdGhyZWFkIG1heQorICAgICAgIG5vdCBhc3N1bWUgdGhhdCB0aGUgdGVhbSBpcyB2YWxpZCBhbnkgbW9yZSAtIGl0IGNvdWxkIGJlIGRlYWxsb2NhdGVkIGJ5CisgICAgICAgdGhlIG1hc3RlciB0aHJlYWQgYXQgYW55IHRpbWUuICovCisgICAgaWYgKHRocl9iYXItPm15X2xldmVsIHx8IF9fa21wX2RmbHRfYmxvY2t0aW1lICE9IEtNUF9NQVhfQkxPQ0tUSU1FIHx8CisgICAgICAgICF0aHJfYmFyLT51c2Vfb25jb3JlX2JhcnJpZXIpIHsgLy8gUGFyZW50IGlzIHdhaXRpbmcgb24gbXkgYl9hcnJpdmVkCisgICAgICAvLyBmbGFnOyByZWxlYXNlIGl0CisgICAgICBBTk5PVEFURV9CQVJSSUVSX0JFR0lOKHRoaXNfdGhyKTsKKyAgICAgIGttcF9mbGFnXzY0IGZsYWcoJnRocl9iYXItPmJfYXJyaXZlZCwgb3RoZXJfdGhyZWFkc1t0aHJfYmFyLT5wYXJlbnRfdGlkXSk7CisgICAgICBmbGFnLnJlbGVhc2UoKTsKKyAgICB9IGVsc2UgeyAvLyBMZWFmIGRvZXMgc3BlY2lhbCByZWxlYXNlIG9uIHRoZSAib2Zmc2V0IiBiaXRzIG9mIHBhcmVudCdzCisgICAgICAvLyBiX2Fycml2ZWQgZmxhZworICAgICAgdGhyX2Jhci0+Yl9hcnJpdmVkID0gdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUDsKKyAgICAgIGttcF9mbGFnX29uY29yZSBmbGFnKCZ0aHJfYmFyLT5wYXJlbnRfYmFyLT5iX2Fycml2ZWQsIHRocl9iYXItPm9mZnNldCk7CisgICAgICBmbGFnLnNldF93YWl0ZXIob3RoZXJfdGhyZWFkc1t0aHJfYmFyLT5wYXJlbnRfdGlkXSk7CisgICAgICBmbGFnLnJlbGVhc2UoKTsKKyAgICB9CisgIH0gZWxzZSB7IC8vIE1hc3RlciB0aHJlYWQgbmVlZHMgdG8gdXBkYXRlIHRoZSB0ZWFtJ3MgYl9hcnJpdmVkIHZhbHVlCisgICAgdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkID0gbmV3X3N0YXRlOworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgc2V0IHRlYW0gJWQgIgorICAgICAgICAgICAgICAgICAgImFycml2ZWQoJXApID0gJWxsdVxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCB0ZWFtLT50LnRfaWQsCisgICAgICAgICAgICAgICAgICAmdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkLCB0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQpKTsKKyAgfQorICAvLyBJcyB0aGUgdGVhbSBhY2Nlc3MgYmVsb3cgdW5zYWZlIG9yIGp1c3QgdGVjaG5pY2FsbHkgaW52YWxpZD8KKyAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSBleGl0IGZvciAiCisgICAgICAgICAgICAgICAgImJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKK30KKworc3RhdGljIHZvaWQgX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfcmVsZWFzZSgKKyAgICBlbnVtIGJhcnJpZXJfdHlwZSBidCwga21wX2luZm9fdCAqdGhpc190aHIsIGludCBndGlkLCBpbnQgdGlkLAorICAgIGludCBwcm9wYWdhdGVfaWN2cyBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICppdHRfc3luY19vYmopKSB7CisgIEtNUF9USU1FX0RFVkVMT1BFUl9QQVJUSVRJT05FRF9CTE9DSyhLTVBfaGllcl9yZWxlYXNlKTsKKyAga21wX3RlYW1fdCAqdGVhbTsKKyAga21wX2JzdGF0ZV90ICp0aHJfYmFyID0gJnRoaXNfdGhyLT50aC50aF9iYXJbYnRdLmJiOworICBrbXBfdWludDMyIG5wcm9jOworICBib29sIHRlYW1fY2hhbmdlID0gZmFsc2U7IC8vIGluZGljYXRlcyBvbi1jb3JlIGJhcnJpZXIgc2hvdWxkbid0IGJlIHVzZWQKKworICBpZiAoS01QX01BU1RFUl9USUQodGlkKSkgeworICAgIHRlYW0gPSBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF90ZWFtOworICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbSAhPSBOVUxMKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBtYXN0ZXIgIgorICAgICAgICAgICAgICAgICAgImVudGVyZWQgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7CisgIH0gZWxzZSB7IC8vIFdvcmtlciB0aHJlYWRzCisgICAgLy8gV2FpdCBmb3IgcGFyZW50IHRocmVhZCB0byByZWxlYXNlIG1lCisgICAgaWYgKCF0aHJfYmFyLT51c2Vfb25jb3JlX2JhcnJpZXIgfHwKKyAgICAgICAgX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUgfHwgdGhyX2Jhci0+bXlfbGV2ZWwgIT0gMCB8fAorICAgICAgICB0aHJfYmFyLT50ZWFtID09IE5VTEwpIHsKKyAgICAgIC8vIFVzZSB0cmFkaXRpb25hbCBtZXRob2Qgb2Ygd2FpdGluZyBvbiBteSBvd24gYl9nbyBmbGFnCisgICAgICB0aHJfYmFyLT53YWl0X2ZsYWcgPSBLTVBfQkFSUklFUl9PV05fRkxBRzsKKyAgICAgIGttcF9mbGFnXzY0IGZsYWcoJnRocl9iYXItPmJfZ28sIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApOworICAgICAgZmxhZy53YWl0KHRoaXNfdGhyLCBUUlVFIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikpOworICAgICAgQU5OT1RBVEVfQkFSUklFUl9FTkQodGhpc190aHIpOworICAgICAgVENXXzgodGhyX2Jhci0+Yl9nbywKKyAgICAgICAgICAgIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUpOyAvLyBSZXNldCBteSBiX2dvIGZsYWcgZm9yIG5leHQgdGltZQorICAgIH0gZWxzZSB7IC8vIFRocmVhZCBiYXJyaWVyIGRhdGEgaXMgaW5pdGlhbGl6ZWQsIHRoaXMgaXMgYSBsZWFmLCBibG9ja3RpbWUgaXMKKyAgICAgIC8vIGluZmluaXRlLCBub3QgbmVzdGVkCisgICAgICAvLyBXYWl0IG9uIG15ICJvZmZzZXQiIGJpdHMgb24gcGFyZW50J3MgYl9nbyBmbGFnCisgICAgICB0aHJfYmFyLT53YWl0X2ZsYWcgPSBLTVBfQkFSUklFUl9QQVJFTlRfRkxBRzsKKyAgICAgIGttcF9mbGFnX29uY29yZSBmbGFnKCZ0aHJfYmFyLT5wYXJlbnRfYmFyLT5iX2dvLCBLTVBfQkFSUklFUl9TVEFURV9CVU1QLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyX2Jhci0+b2Zmc2V0LCBidCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfdGhyIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikpOworICAgICAgZmxhZy53YWl0KHRoaXNfdGhyLCBUUlVFKTsKKyAgICAgIGlmICh0aHJfYmFyLT53YWl0X2ZsYWcgPT0KKyAgICAgICAgICBLTVBfQkFSUklFUl9TV0lUQ0hJTkcpIHsgLy8gVGhyZWFkIHdhcyBzd2l0Y2hlZCB0byBvd24gYl9nbworICAgICAgICBUQ1dfOCh0aHJfYmFyLT5iX2dvLAorICAgICAgICAgICAgICBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFKTsgLy8gUmVzZXQgbXkgYl9nbyBmbGFnIGZvciBuZXh0IHRpbWUKKyAgICAgIH0gZWxzZSB7IC8vIFJlc2V0IG15IGJpdHMgb24gcGFyZW50J3MgYl9nbyBmbGFnCisgICAgICAgIChSQ0FTVCh2b2xhdGlsZSBjaGFyICosCisgICAgICAgICAgICAgICAmKHRocl9iYXItPnBhcmVudF9iYXItPmJfZ28pKSlbdGhyX2Jhci0+b2Zmc2V0XSA9IDA7CisgICAgICB9CisgICAgfQorICAgIHRocl9iYXItPndhaXRfZmxhZyA9IEtNUF9CQVJSSUVSX05PVF9XQUlUSU5HOworICAgIC8vIEVhcmx5IGV4aXQgZm9yIHJlYXBpbmcgdGhyZWFkcyByZWxlYXNpbmcgZm9ya2pvaW4gYmFycmllcgorICAgIGlmIChidCA9PSBic19mb3Jram9pbl9iYXJyaWVyICYmIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkpCisgICAgICByZXR1cm47CisgICAgLy8gVGhlIHdvcmtlciB0aHJlYWQgbWF5IG5vdyBhc3N1bWUgdGhhdCB0aGUgdGVhbSBpcyB2YWxpZC4KKyAgICB0ZWFtID0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0gIT0gTlVMTCk7CisgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKworICAgIEtBX1RSQUNFKAorICAgICAgICAyMCwKKyAgICAgICAgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBzZXQgZ28oJXApID0gJXVcbiIsCisgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgJnRocl9iYXItPmJfZ28sIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUpKTsKKyAgICBLTVBfTUIoKTsgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICB9CisKKyAgbnByb2MgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYzsKKyAgaW50IGxldmVsID0gdGVhbS0+dC50X2xldmVsOworI2lmIE9NUF80MF9FTkFCTEVECisgIGlmICh0ZWFtLT50LnRfdGhyZWFkc1swXQorICAgICAgICAgIC0+dGgudGhfdGVhbXNfbWljcm90YXNrKSB7IC8vIGFyZSB3ZSBpbnNpZGUgdGhlIHRlYW1zIGNvbnN0cnVjdD8KKyAgICBpZiAodGVhbS0+dC50X3BrZm4gIT0gKG1pY3JvdGFza190KV9fa21wX3RlYW1zX21hc3RlciAmJgorICAgICAgICB0aGlzX3Roci0+dGgudGhfdGVhbXNfbGV2ZWwgPT0gbGV2ZWwpCisgICAgICArK2xldmVsOyAvLyBsZXZlbCB3YXMgbm90IGluY3JlYXNlZCBpbiB0ZWFtcyBjb25zdHJ1Y3QgZm9yIHRlYW1fb2Zfd29ya2VycworICAgIGlmICh0aGlzX3Roci0+dGgudGhfdGVhbXNfc2l6ZS5udGVhbXMgPiAxKQorICAgICAgKytsZXZlbDsgLy8gbGV2ZWwgd2FzIG5vdCBpbmNyZWFzZWQgaW4gdGVhbXMgY29uc3RydWN0IGZvciB0ZWFtX29mX21hc3RlcnMKKyAgfQorI2VuZGlmCisgIGlmIChsZXZlbCA9PSAxKQorICAgIHRocl9iYXItPnVzZV9vbmNvcmVfYmFycmllciA9IDE7CisgIGVsc2UKKyAgICB0aHJfYmFyLT51c2Vfb25jb3JlX2JhcnJpZXIgPSAwOyAvLyBEbyBub3QgdXNlIG9uY29yZSBiYXJyaWVyIHdoZW4gbmVzdGVkCisKKyAgLy8gSWYgdGhlIHRlYW0gc2l6ZSBoYXMgaW5jcmVhc2VkLCB3ZSBzdGlsbCBjb21tdW5pY2F0ZSB3aXRoIG9sZCBsZWF2ZXMgdmlhCisgIC8vIG9uY29yZSBiYXJyaWVyLgorICB1bnNpZ25lZCBzaG9ydCBpbnQgb2xkX2xlYWZfa2lkcyA9IHRocl9iYXItPmxlYWZfa2lkczsKKyAga21wX3VpbnQ2NCBvbGRfbGVhZl9zdGF0ZSA9IHRocl9iYXItPmxlYWZfc3RhdGU7CisgIHRlYW1fY2hhbmdlID0gX19rbXBfaW5pdF9oaWVyYXJjaGljYWxfYmFycmllcl90aHJlYWQoYnQsIHRocl9iYXIsIG5wcm9jLCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZCwgdGVhbSk7CisgIC8vIEJ1dCBpZiB0aGUgZW50aXJlIHRlYW0gY2hhbmdlcywgd2Ugd29uJ3QgdXNlIG9uY29yZSBiYXJyaWVyIGF0IGFsbAorICBpZiAodGVhbV9jaGFuZ2UpCisgICAgb2xkX2xlYWZfa2lkcyA9IDA7CisKKyNpZiBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorICBpZiAocHJvcGFnYXRlX2ljdnMpIHsKKyAgICBfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2sodGVhbS0+dC50X2lkZW50LCB0ZWFtLT50LnRfdGhyZWFkc1t0aWRdLCB0ZWFtLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFKTsKKyAgICBpZiAoS01QX01BU1RFUl9USUQoCisgICAgICAgICAgICB0aWQpKSB7IC8vIG1hc3RlciBhbHJlYWR5IGhhcyBjb3B5IGluIGZpbmFsIGRlc3RpbmF0aW9uOyBjb3B5CisgICAgICBjb3B5X2ljdnMoJnRocl9iYXItPnRoX2ZpeGVkX2ljdnMsCisgICAgICAgICAgICAgICAgJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cyk7CisgICAgfSBlbHNlIGlmIChfX2ttcF9kZmx0X2Jsb2NrdGltZSA9PSBLTVBfTUFYX0JMT0NLVElNRSAmJgorICAgICAgICAgICAgICAgdGhyX2Jhci0+dXNlX29uY29yZV9iYXJyaWVyKSB7IC8vIG9wdGltaXphdGlvbiBmb3IgaW5mIGJsb2NrdGltZQorICAgICAgaWYgKCF0aHJfYmFyLT5teV9sZXZlbCkgLy8gSSdtIGEgbGVhZiBpbiB0aGUgaGllcmFyY2h5IChteV9sZXZlbD09MCkKKyAgICAgICAgLy8gbGVhdmVzIChvbi1jb3JlIGNoaWxkcmVuKSBwdWxsIHBhcmVudCdzIGZpeGVkIElDVnMgZGlyZWN0bHkgdG8gbG9jYWwKKyAgICAgICAgLy8gSUNWIHN0b3JlCisgICAgICAgIGNvcHlfaWN2cygmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9pY3ZzLAorICAgICAgICAgICAgICAgICAgJnRocl9iYXItPnBhcmVudF9iYXItPnRoX2ZpeGVkX2ljdnMpOworICAgICAgLy8gbm9uLWxlYXZlcyB3aWxsIGdldCBJQ1ZzIHBpZ2d5YmFja2VkIHdpdGggYl9nbyB2aWEgTkdPIHN0b3JlCisgICAgfSBlbHNlIHsgLy8gYmxvY2t0aW1lIGlzIG5vdCBpbmZpbml0ZTsgcHVsbCBJQ1ZzIGZyb20gcGFyZW50J3MgZml4ZWQgSUNWcworICAgICAgaWYgKHRocl9iYXItPm15X2xldmVsKSAvLyBub3QgYSBsZWFmOyBjb3B5IElDVnMgdG8gbXkgZml4ZWQgSUNWcyBjaGlsZCBjYW4KKyAgICAgICAgLy8gYWNjZXNzCisgICAgICAgIGNvcHlfaWN2cygmdGhyX2Jhci0+dGhfZml4ZWRfaWN2cywgJnRocl9iYXItPnBhcmVudF9iYXItPnRoX2ZpeGVkX2ljdnMpOworICAgICAgZWxzZSAvLyBsZWF2ZXMgY29weSBwYXJlbnQncyBmaXhlZCBJQ1ZzIGRpcmVjdGx5IHRvIGxvY2FsIElDViBzdG9yZQorICAgICAgICBjb3B5X2ljdnMoJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cywKKyAgICAgICAgICAgICAgICAgICZ0aHJfYmFyLT5wYXJlbnRfYmFyLT50aF9maXhlZF9pY3ZzKTsKKyAgICB9CisgIH0KKyNlbmRpZiAvLyBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorCisgIC8vIE5vdywgcmVsZWFzZSBteSBjaGlsZHJlbgorICBpZiAodGhyX2Jhci0+bXlfbGV2ZWwpIHsgLy8gbm90IGEgbGVhZgorICAgIGttcF9pbnQzMiBjaGlsZF90aWQ7CisgICAga21wX3VpbnQzMiBsYXN0OworICAgIGlmIChfX2ttcF9kZmx0X2Jsb2NrdGltZSA9PSBLTVBfTUFYX0JMT0NLVElNRSAmJgorICAgICAgICB0aHJfYmFyLT51c2Vfb25jb3JlX2JhcnJpZXIpIHsKKyAgICAgIGlmIChLTVBfTUFTVEVSX1RJRCh0aWQpKSB7IC8vIGRvIGEgZmxhdCByZWxlYXNlCisgICAgICAgIC8vIFNldCBsb2NhbCBiX2dvIHRvIGJ1bXAgY2hpbGRyZW4gdmlhIE5HTyBzdG9yZSBvZiB0aGUgY2FjaGUgbGluZQorICAgICAgICAvLyBjb250YWluaW5nIElWQ3MgYW5kIGJfZ28uCisgICAgICAgIHRocl9iYXItPmJfZ28gPSBLTVBfQkFSUklFUl9TVEFURV9CVU1QOworICAgICAgICAvLyBVc2UgbmdvIHN0b3JlcyBpZiBhdmFpbGFibGU7IGJfZ28gcGlnZ3liYWNrcyBpbiB0aGUgbGFzdCA4IGJ5dGVzIG9mCisgICAgICAgIC8vIHRoZSBjYWNoZSBsaW5lCisgICAgICAgIG5nb19sb2FkKCZ0aHJfYmFyLT50aF9maXhlZF9pY3ZzKTsKKyAgICAgICAgLy8gVGhpcyBsb29wcyBvdmVyIGFsbCB0aGUgdGhyZWFkcyBza2lwcGluZyBvbmx5IHRoZSBsZWFmIG5vZGVzIGluIHRoZQorICAgICAgICAvLyBoaWVyYXJjaHkKKyAgICAgICAgZm9yIChjaGlsZF90aWQgPSB0aHJfYmFyLT5za2lwX3Blcl9sZXZlbFsxXTsgY2hpbGRfdGlkIDwgKGludClucHJvYzsKKyAgICAgICAgICAgICBjaGlsZF90aWQgKz0gdGhyX2Jhci0+c2tpcF9wZXJfbGV2ZWxbMV0pIHsKKyAgICAgICAgICBrbXBfYnN0YXRlX3QgKmNoaWxkX2JhciA9CisgICAgICAgICAgICAgICZ0ZWFtLT50LnRfdGhyZWFkc1tjaGlsZF90aWRdLT50aC50aF9iYXJbYnRdLmJiOworICAgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZWxlYXNpbmcgVCMlZCglZDolZCkiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGdvKCVwKTogJXUgPT4gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aWQoY2hpbGRfdGlkLCB0ZWFtKSwgdGVhbS0+dC50X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfdGlkLCAmY2hpbGRfYmFyLT5iX2dvLCBjaGlsZF9iYXItPmJfZ28sCisgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZF9iYXItPmJfZ28gKyBLTVBfQkFSUklFUl9TVEFURV9CVU1QKSk7CisgICAgICAgICAgLy8gVXNlIG5nbyBzdG9yZSAoaWYgYXZhaWxhYmxlKSB0byBib3RoIHN0b3JlIElDVnMgYW5kIHJlbGVhc2UgY2hpbGQKKyAgICAgICAgICAvLyB2aWEgY2hpbGQncyBiX2dvCisgICAgICAgICAgbmdvX3N0b3JlX2dvKCZjaGlsZF9iYXItPnRoX2ZpeGVkX2ljdnMsICZ0aHJfYmFyLT50aF9maXhlZF9pY3ZzKTsKKyAgICAgICAgfQorICAgICAgICBuZ29fc3luYygpOworICAgICAgfQorICAgICAgVENXXzgodGhyX2Jhci0+Yl9nbywKKyAgICAgICAgICAgIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUpOyAvLyBSZXNldCBteSBiX2dvIGZsYWcgZm9yIG5leHQgdGltZQorICAgICAgLy8gTm93LCByZWxlYXNlIGxlYWYgY2hpbGRyZW4KKyAgICAgIGlmICh0aHJfYmFyLT5sZWFmX2tpZHMpIHsgLy8gaWYgdGhlcmUgYXJlIGFueQorICAgICAgICAvLyBXZSB0ZXN0IHRlYW1fY2hhbmdlIG9uIHRoZSBvZmYtY2hhbmNlIHRoYXQgdGhlIGxldmVsIDEgdGVhbSBjaGFuZ2VkLgorICAgICAgICBpZiAodGVhbV9jaGFuZ2UgfHwKKyAgICAgICAgICAgIG9sZF9sZWFmX2tpZHMgPCB0aHJfYmFyLT5sZWFmX2tpZHMpIHsgLy8gc29tZSBvbGQsIHNvbWUgbmV3CisgICAgICAgICAgaWYgKG9sZF9sZWFmX2tpZHMpIHsgLy8gcmVsZWFzZSBvbGQgbGVhZiBraWRzCisgICAgICAgICAgICB0aHJfYmFyLT5iX2dvIHw9IG9sZF9sZWFmX3N0YXRlOworICAgICAgICAgIH0KKyAgICAgICAgICAvLyBSZWxlYXNlIG5ldyBsZWFmIGtpZHMKKyAgICAgICAgICBsYXN0ID0gdGlkICsgdGhyX2Jhci0+c2tpcF9wZXJfbGV2ZWxbMV07CisgICAgICAgICAgaWYgKGxhc3QgPiBucHJvYykKKyAgICAgICAgICAgIGxhc3QgPSBucHJvYzsKKyAgICAgICAgICBmb3IgKGNoaWxkX3RpZCA9IHRpZCArIDEgKyBvbGRfbGVhZl9raWRzOyBjaGlsZF90aWQgPCAoaW50KWxhc3Q7CisgICAgICAgICAgICAgICArK2NoaWxkX3RpZCkgeyAvLyBza2lwX3Blcl9sZXZlbFswXT0xCisgICAgICAgICAgICBrbXBfaW5mb190ICpjaGlsZF90aHIgPSB0ZWFtLT50LnRfdGhyZWFkc1tjaGlsZF90aWRdOworICAgICAgICAgICAga21wX2JzdGF0ZV90ICpjaGlsZF9iYXIgPSAmY2hpbGRfdGhyLT50aC50aF9iYXJbYnRdLmJiOworICAgICAgICAgICAgS0FfVFJBQ0UoCisgICAgICAgICAgICAgICAgMjAsCisgICAgICAgICAgICAgICAgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSByZWxlYXNpbmciCisgICAgICAgICAgICAgICAgICIgVCMlZCglZDolZCkgZ28oJXApOiAldSA9PiAldVxuIiwKKyAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIF9fa21wX2d0aWRfZnJvbV90aWQoY2hpbGRfdGlkLCB0ZWFtKSwKKyAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBjaGlsZF90aWQsICZjaGlsZF9iYXItPmJfZ28sIGNoaWxkX2Jhci0+Yl9nbywKKyAgICAgICAgICAgICAgICAgY2hpbGRfYmFyLT5iX2dvICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCkpOworICAgICAgICAgICAgLy8gUmVsZWFzZSBjaGlsZCB1c2luZyBjaGlsZCdzIGJfZ28gZmxhZworICAgICAgICAgICAgQU5OT1RBVEVfQkFSUklFUl9CRUdJTihjaGlsZF90aHIpOworICAgICAgICAgICAga21wX2ZsYWdfNjQgZmxhZygmY2hpbGRfYmFyLT5iX2dvLCBjaGlsZF90aHIpOworICAgICAgICAgICAgZmxhZy5yZWxlYXNlKCk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAvLyBSZWxlYXNlIGFsbCBjaGlsZHJlbiBhdCBvbmNlIHdpdGggbGVhZl9zdGF0ZSBiaXRzIG9uIG15IG93bgorICAgICAgICAgIC8vIGJfZ28gZmxhZworICAgICAgICAgIHRocl9iYXItPmJfZ28gfD0gdGhyX2Jhci0+bGVhZl9zdGF0ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7IC8vIEJsb2NrdGltZSBpcyBub3QgaW5maW5pdGU7IGRvIGEgc2ltcGxlIGhpZXJhcmNoaWNhbCByZWxlYXNlCisgICAgICBmb3IgKGludCBkID0gdGhyX2Jhci0+bXlfbGV2ZWwgLSAxOyBkID49IDA7CisgICAgICAgICAgIC0tZCkgeyAvLyBSZWxlYXNlIGhpZ2hlc3QgbGV2ZWwgdGhyZWFkcyBmaXJzdAorICAgICAgICBsYXN0ID0gdGlkICsgdGhyX2Jhci0+c2tpcF9wZXJfbGV2ZWxbZCArIDFdOworICAgICAgICBrbXBfdWludDMyIHNraXAgPSB0aHJfYmFyLT5za2lwX3Blcl9sZXZlbFtkXTsKKyAgICAgICAgaWYgKGxhc3QgPiBucHJvYykKKyAgICAgICAgICBsYXN0ID0gbnByb2M7CisgICAgICAgIGZvciAoY2hpbGRfdGlkID0gdGlkICsgc2tpcDsgY2hpbGRfdGlkIDwgKGludClsYXN0OyBjaGlsZF90aWQgKz0gc2tpcCkgeworICAgICAgICAgIGttcF9pbmZvX3QgKmNoaWxkX3RociA9IHRlYW0tPnQudF90aHJlYWRzW2NoaWxkX3RpZF07CisgICAgICAgICAga21wX2JzdGF0ZV90ICpjaGlsZF9iYXIgPSAmY2hpbGRfdGhyLT50aC50aF9iYXJbYnRdLmJiOworICAgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZWxlYXNpbmcgVCMlZCglZDolZCkgZ28oJXApOiAldSA9PiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZChjaGlsZF90aWQsIHRlYW0pLCB0ZWFtLT50LnRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZF90aWQsICZjaGlsZF9iYXItPmJfZ28sIGNoaWxkX2Jhci0+Yl9nbywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX2Jhci0+Yl9nbyArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKyAgICAgICAgICAvLyBSZWxlYXNlIGNoaWxkIHVzaW5nIGNoaWxkJ3MgYl9nbyBmbGFnCisgICAgICAgICAgQU5OT1RBVEVfQkFSUklFUl9CRUdJTihjaGlsZF90aHIpOworICAgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJmNoaWxkX2Jhci0+Yl9nbywgY2hpbGRfdGhyKTsKKyAgICAgICAgICBmbGFnLnJlbGVhc2UoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyNpZiBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorICAgIGlmIChwcm9wYWdhdGVfaWN2cyAmJiAhS01QX01BU1RFUl9USUQodGlkKSkKKyAgICAgIC8vIG5vbi1sZWF2ZXMgY29weSBJQ1ZzIGZyb20gZml4ZWQgSUNWcyB0byBsb2NhbCBkZXN0CisgICAgICBjb3B5X2ljdnMoJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cywKKyAgICAgICAgICAgICAgICAmdGhyX2Jhci0+dGhfZml4ZWRfaWN2cyk7CisjZW5kaWYgLy8gS01QX0JBUlJJRVJfSUNWX1BVU0gKKyAgfQorICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBleGl0IGZvciAiCisgICAgICAgICAgICAgICAgImJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKK30KKworLy8gRW5kIG9mIEJhcnJpZXIgQWxnb3JpdGhtcworCisvLyBJbnRlcm5hbCBmdW5jdGlvbiB0byBkbyBhIGJhcnJpZXIuCisvKiBJZiBpc19zcGxpdCBpcyB0cnVlLCBkbyBhIHNwbGl0IGJhcnJpZXIsIG90aGVyd2lzZSwgZG8gYSBwbGFpbiBiYXJyaWVyCisgICBJZiByZWR1Y2UgaXMgbm9uLU5VTEwsIGRvIGEgc3BsaXQgcmVkdWN0aW9uIGJhcnJpZXIsIG90aGVyd2lzZSwgZG8gYSBzcGxpdAorICAgYmFycmllcgorICAgUmV0dXJucyAwIGlmIG1hc3RlciB0aHJlYWQsIDEgaWYgd29ya2VyIHRocmVhZC4gICovCitpbnQgX19rbXBfYmFycmllcihlbnVtIGJhcnJpZXJfdHlwZSBidCwgaW50IGd0aWQsIGludCBpc19zcGxpdCwKKyAgICAgICAgICAgICAgICAgIHNpemVfdCByZWR1Y2Vfc2l6ZSwgdm9pZCAqcmVkdWNlX2RhdGEsCisgICAgICAgICAgICAgICAgICB2b2lkICgqcmVkdWNlKSh2b2lkICosIHZvaWQgKikpIHsKKyAgS01QX1RJTUVfUEFSVElUSU9ORURfQkxPQ0soT01QX3BsYWluX2JhcnJpZXIpOworICBLTVBfU0VUX1RIUkVBRF9TVEFURV9CTE9DSyhQTEFJTl9CQVJSSUVSKTsKKyAgaW50IHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCk7CisgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAga21wX3RlYW1fdCAqdGVhbSA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworICBpbnQgc3RhdHVzID0gMDsKKyAgaWRlbnRfdCAqbG9jID0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfaWRlbnQ7CisjaWYgT01QVF9TVVBQT1JUCisgIG9tcHRfdGFza19pZF90IG15X3Rhc2tfaWQ7CisgIG9tcHRfcGFyYWxsZWxfaWRfdCBteV9wYXJhbGxlbF9pZDsKKyNlbmRpZgorCisgIEtBX1RSQUNFKDE1LCAoIl9fa21wX2JhcnJpZXI6IFQjJWQoJWQ6JWQpIGhhcyBhcnJpdmVkXG4iLCBndGlkLAorICAgICAgICAgICAgICAgIF9fa21wX3RlYW1fZnJvbV9ndGlkKGd0aWQpLT50LnRfaWQsIF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCkpKTsKKworICBBTk5PVEFURV9CQVJSSUVSX0JFR0lOKCZ0ZWFtLT50LnRfYmFyKTsKKyNpZiBPTVBUX1NVUFBPUlQKKyAgaWYgKG9tcHRfZW5hYmxlZCkgeworI2lmIE9NUFRfQkxBTUUKKyAgICBteV90YXNrX2lkID0gdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS5vbXB0X3Rhc2tfaW5mby50YXNrX2lkOworICAgIG15X3BhcmFsbGVsX2lkID0gdGVhbS0+dC5vbXB0X3RlYW1faW5mby5wYXJhbGxlbF9pZDsKKworI2lmIE9NUFRfVFJBQ0UKKyAgICBpZiAodGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPT0gb21wdF9zdGF0ZV93YWl0X3NpbmdsZSkgeworICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9zaW5nbGVfb3RoZXJzX2VuZCkpIHsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3NpbmdsZV9vdGhlcnNfZW5kKSgKKyAgICAgICAgICAgIG15X3BhcmFsbGVsX2lkLCBteV90YXNrX2lkKTsKKyAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW4pKSB7CisgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbikobXlfcGFyYWxsZWxfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlfdGFza19pZCk7CisgICAgfQorI2VuZGlmCisgICAgLy8gSXQgaXMgT0sgdG8gcmVwb3J0IHRoZSBiYXJyaWVyIHN0YXRlIGFmdGVyIHRoZSBiYXJyaWVyIGJlZ2luIGNhbGxiYWNrLgorICAgIC8vIEFjY29yZGluZyB0byB0aGUgT01QVCBzcGVjaWZpY2F0aW9uLCBhIGNvbXBsaWFudCBpbXBsZW1lbnRhdGlvbiBtYXkKKyAgICAvLyBldmVuIGRlbGF5IHJlcG9ydGluZyB0aGlzIHN0YXRlIHVudGlsIHRoZSBiYXJyaWVyIGJlZ2lucyB0byB3YWl0LgorICAgIHRoaXNfdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV93YWl0X2JhcnJpZXI7CisgIH0KKyNlbmRpZgorCisgIGlmICghdGVhbS0+dC50X3NlcmlhbGl6ZWQpIHsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgLy8gVGhpcyB2YWx1ZSB3aWxsIGJlIHVzZWQgaW4gaXR0IG5vdGlmeSBldmVudHMgYmVsb3cuCisgICAgdm9pZCAqaXR0X3N5bmNfb2JqID0gTlVMTDsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmIChfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRykKKyAgICAgIGl0dF9zeW5jX29iaiA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdChndGlkLCBidCwgMSk7CisjZW5kaWYKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgaWYgKF9fa21wX3Rhc2tpbmdfbW9kZSA9PSB0c2ttX2V4dHJhX2JhcnJpZXIpIHsKKyAgICAgIF9fa21wX3Rhc2tpbmdfYmFycmllcih0ZWFtLCB0aGlzX3RociwgZ3RpZCk7CisgICAgICBLQV9UUkFDRSgxNSwKKyAgICAgICAgICAgICAgICgiX19rbXBfYmFycmllcjogVCMlZCglZDolZCkgcGFzdCB0YXNraW5nIGJhcnJpZXJcbiIsIGd0aWQsCisgICAgICAgICAgICAgICAgX19rbXBfdGVhbV9mcm9tX2d0aWQoZ3RpZCktPnQudF9pZCwgX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKSkpOworICAgIH0KKworICAgIC8qIENvcHkgdGhlIGJsb2NrdGltZSBpbmZvIHRvIHRoZSB0aHJlYWQsIHdoZXJlIF9fa21wX3dhaXRfdGVtcGxhdGUoKSBjYW4KKyAgICAgICBhY2Nlc3MgaXQgd2hlbiB0aGUgdGVhbSBzdHJ1Y3QgaXMgbm90IGd1YXJhbnRlZWQgdG8gZXhpc3QuICovCisgICAgLy8gU2VlIG5vdGUgYWJvdXQgdGhlIGNvcnJlc3BvbmRpbmcgY29kZSBpbiBfX2ttcF9qb2luX2JhcnJpZXIoKSBiZWluZworICAgIC8vIHBlcmZvcm1hbmNlLWNyaXRpY2FsLgorICAgIGlmIChfX2ttcF9kZmx0X2Jsb2NrdGltZSAhPSBLTVBfTUFYX0JMT0NLVElNRSkgeworI2lmIEtNUF9VU0VfTU9OSVRPUgorICAgICAgdGhpc190aHItPnRoLnRoX3RlYW1fYnRfaW50ZXJ2YWxzID0KKyAgICAgICAgICB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX2ljdnMuYnRfaW50ZXJ2YWxzOworICAgICAgdGhpc190aHItPnRoLnRoX3RlYW1fYnRfc2V0ID0KKyAgICAgICAgICB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX2ljdnMuYnRfc2V0OworI2Vsc2UKKyAgICAgIHRoaXNfdGhyLT50aC50aF90ZWFtX2J0X2ludGVydmFscyA9IEtNUF9CTE9DS1RJTUVfSU5URVJWQUwoKTsKKyNlbmRpZgorICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBpZiAoX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcpCisgICAgICBfX2ttcF9pdHRfYmFycmllcl9zdGFydGluZyhndGlkLCBpdHRfc3luY19vYmopOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyNpZiBVU0VfREVCVUdHRVIKKyAgICAvLyBMZXQgdGhlIGRlYnVnZ2VyIGtub3c6IHRoZSB0aHJlYWQgYXJyaXZlZCB0byB0aGUgYmFycmllciBhbmQgd2FpdGluZy4KKyAgICBpZiAoS01QX01BU1RFUl9USUQodGlkKSkgeyAvLyBNYXN0ZXIgY291bnRlciBpcyBzdG9yZWQgaW4gdGVhbSBzdHJ1Y3R1cmUuCisgICAgICB0ZWFtLT50LnRfYmFyW2J0XS5iX21hc3Rlcl9hcnJpdmVkICs9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXNfdGhyLT50aC50aF9iYXJbYnRdLmJiLmJfd29ya2VyX2Fycml2ZWQgKz0gMTsKKyAgICB9IC8vIGlmCisjZW5kaWYgLyogVVNFX0RFQlVHR0VSICovCisgICAgaWYgKHJlZHVjZSAhPSBOVUxMKSB7CisgICAgICAvLyBLTVBfREVCVUdfQVNTRVJUKCBpc19zcGxpdCA9PSBUUlVFICk7ICAvLyAjQzY5OTU2CisgICAgICB0aGlzX3Roci0+dGgudGhfbG9jYWwucmVkdWNlX2RhdGEgPSByZWR1Y2VfZGF0YTsKKyAgICB9CisKKyAgICBpZiAoS01QX01BU1RFUl9USUQodGlkKSAmJiBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYykKKyAgICAgIF9fa21wX3Rhc2tfdGVhbV9zZXR1cCgKKyAgICAgICAgICB0aGlzX3RociwgdGVhbSwKKyAgICAgICAgICAwKTsgLy8gdXNlIDAgdG8gb25seSBzZXR1cCB0aGUgY3VycmVudCB0ZWFtIGlmIG50aHJlYWRzID4gMQorCisgICAgc3dpdGNoIChfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXR0ZXJuW2J0XSkgeworICAgIGNhc2UgYnBfaHlwZXJfYmFyOiB7CisgICAgICBLTVBfQVNTRVJUKF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzW2J0XSk7IC8vIGRvbid0IHNldCBicmFuY2ggYml0cworICAgICAgLy8gdG8gMDsgdXNlIGxpbmVhcgorICAgICAgX19rbXBfaHlwZXJfYmFycmllcl9nYXRoZXIoYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWR1Y2UgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBicF9oaWVyYXJjaGljYWxfYmFyOiB7CisgICAgICBfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXIoYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkdWNlIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgYnBfdHJlZV9iYXI6IHsKKyAgICAgIEtNUF9BU1NFUlQoX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHNbYnRdKTsgLy8gZG9uJ3Qgc2V0IGJyYW5jaCBiaXRzCisgICAgICAvLyB0byAwOyB1c2UgbGluZWFyCisgICAgICBfX2ttcF90cmVlX2JhcnJpZXJfZ2F0aGVyKGJ0LCB0aGlzX3RociwgZ3RpZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWR1Y2UgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgX19rbXBfbGluZWFyX2JhcnJpZXJfZ2F0aGVyKGJ0LCB0aGlzX3RociwgZ3RpZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZHVjZSBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopKTsKKyAgICB9CisgICAgfQorCisgICAgS01QX01CKCk7CisKKyAgICBpZiAoS01QX01BU1RFUl9USUQodGlkKSkgeworICAgICAgc3RhdHVzID0gMDsKKyAgICAgIGlmIChfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYykgeworICAgICAgICBfX2ttcF90YXNrX3RlYW1fd2FpdCh0aGlzX3RociwgdGVhbSBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopKTsKKyAgICAgIH0KKyNpZiBVU0VfREVCVUdHRVIKKyAgICAgIC8vIExldCB0aGUgZGVidWdnZXIga25vdzogQWxsIHRocmVhZHMgYXJlIGFycml2ZWQgYW5kIHN0YXJ0aW5nIGxlYXZpbmcgdGhlCisgICAgICAvLyBiYXJyaWVyLgorICAgICAgdGVhbS0+dC50X2JhcltidF0uYl90ZWFtX2Fycml2ZWQgKz0gMTsKKyNlbmRpZgorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgIC8vIFJlc2V0IGNhbmNlbGxhdGlvbiBmbGFnIGZvciB3b3Jrc2hhcmluZyBjb25zdHJ1Y3RzCisgICAgICBpZiAodGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0ID09IGNhbmNlbF9sb29wIHx8CisgICAgICAgICAgdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0ID09IGNhbmNlbF9zZWN0aW9ucykgeworICAgICAgICB0ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QgPSBjYW5jZWxfbm9yZXE7CisgICAgICB9CisjZW5kaWYKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAvKiBUT0RPOiBJbiBjYXNlIG9mIHNwbGl0IHJlZHVjdGlvbiBiYXJyaWVyLCBtYXN0ZXIgdGhyZWFkIG1heSBzZW5kCisgICAgICAgICBhY3F1aXJlZCBldmVudCBlYXJseSwgYmVmb3JlIHRoZSBmaW5hbCBzdW1tYXRpb24gaW50byB0aGUgc2hhcmVkCisgICAgICAgICB2YXJpYWJsZSBpcyBkb25lIChmaW5hbCBzdW1tYXRpb24gY2FuIGJlIGEgbG9uZyBvcGVyYXRpb24gZm9yIGFycmF5CisgICAgICAgICByZWR1Y3Rpb25zKS4gICovCisgICAgICBpZiAoX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcpCisgICAgICAgIF9fa21wX2l0dF9iYXJyaWVyX21pZGRsZShndGlkLCBpdHRfc3luY19vYmopOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAvLyBCYXJyaWVyIC0gcmVwb3J0IGZyYW1lIGVuZCAob25seSBpZiBhY3RpdmVfbGV2ZWwgPT0gMSkKKyAgICAgIGlmICgoX19pdHRfZnJhbWVfc3VibWl0X3YzX3B0ciB8fCBLTVBfSVRUX0RFQlVHKSAmJgorICAgICAgICAgIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlICYmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICB0aGlzX3Roci0+dGgudGhfdGVhbXNfbWljcm90YXNrID09IE5VTEwgJiYKKyNlbmRpZgorICAgICAgICAgIHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwgPT0gMSkgeworICAgICAgICBrbXBfdWludDY0IGN1cl90aW1lID0gX19pdHRfZ2V0X3RpbWVzdGFtcCgpOworICAgICAgICBrbXBfaW5mb190ICoqb3RoZXJfdGhyZWFkcyA9IHRlYW0tPnQudF90aHJlYWRzOworICAgICAgICBpbnQgbnByb2MgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYzsKKyAgICAgICAgaW50IGk7CisgICAgICAgIHN3aXRjaCAoX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgIF9fa21wX2l0dF9mcmFtZV9zdWJtaXQoZ3RpZCwgdGhpc190aHItPnRoLnRoX2ZyYW1lX3RpbWUsIGN1cl90aW1lLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jLCBucHJvYyk7CisgICAgICAgICAgdGhpc190aHItPnRoLnRoX2ZyYW1lX3RpbWUgPSBjdXJfdGltZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOiAvLyBBQyAyMDE1LTAxLTE5OiBjdXJyZW50bHkgZG9lcyBub3Qgd29yayBmb3IgaGllcmFyY2hpY2FsICh0bworICAgICAgICAgIC8vIGJlIGZpeGVkKQorICAgICAgICAgIF9fa21wX2l0dF9mcmFtZV9zdWJtaXQoZ3RpZCwgdGhpc190aHItPnRoLnRoX2Jhcl9taW5fdGltZSwgY3VyX3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBsb2MsIG5wcm9jKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgIGlmIChfX2l0dF9tZXRhZGF0YV9hZGRfcHRyKSB7CisgICAgICAgICAgICAvLyBJbml0aWFsaXplIHdpdGggbWFzdGVyJ3Mgd2FpdCB0aW1lCisgICAgICAgICAgICBrbXBfdWludDY0IGRlbHRhID0gY3VyX3RpbWUgLSB0aGlzX3Roci0+dGgudGhfYmFyX2Fycml2ZV90aW1lOworICAgICAgICAgICAgLy8gU2V0IGFycml2ZSB0aW1lIHRvIHplcm8gdG8gYmUgYWJsZSB0byBjaGVjayBpdCBpbgorICAgICAgICAgICAgLy8gX19rbXBfaW52b2tlX3Rhc2soKTsgdGhlIHNhbWUgaXMgZG9uZSBpbnNpZGUgdGhlIGxvb3AgYmVsb3cKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9iYXJfYXJyaXZlX3RpbWUgPSAwOworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IG5wcm9jOyArK2kpIHsKKyAgICAgICAgICAgICAgZGVsdGEgKz0gKGN1cl90aW1lIC0gb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyX2Fycml2ZV90aW1lKTsKKyAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyX2Fycml2ZV90aW1lID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX2l0dF9tZXRhZGF0YV9pbWJhbGFuY2UoZ3RpZCwgdGhpc190aHItPnRoLnRoX2ZyYW1lX3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl90aW1lLCBkZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGttcF91aW50NjQpKHJlZHVjZSAhPSBOVUxMKSk7CisgICAgICAgICAgfQorICAgICAgICAgIF9fa21wX2l0dF9mcmFtZV9zdWJtaXQoZ3RpZCwgdGhpc190aHItPnRoLnRoX2ZyYW1lX3RpbWUsIGN1cl90aW1lLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jLCBucHJvYyk7CisgICAgICAgICAgdGhpc190aHItPnRoLnRoX2ZyYW1lX3RpbWUgPSBjdXJfdGltZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICB9IGVsc2UgeworICAgICAgc3RhdHVzID0gMTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICBpZiAoX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcpCisgICAgICAgIF9fa21wX2l0dF9iYXJyaWVyX21pZGRsZShndGlkLCBpdHRfc3luY19vYmopOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICB9CisgICAgaWYgKHN0YXR1cyA9PSAxIHx8ICFpc19zcGxpdCkgeworICAgICAgc3dpdGNoIChfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0dGVybltidF0pIHsKKyAgICAgIGNhc2UgYnBfaHlwZXJfYmFyOiB7CisgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzW2J0XSk7CisgICAgICAgIF9fa21wX2h5cGVyX2JhcnJpZXJfcmVsZWFzZShidCwgdGhpc190aHIsIGd0aWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgYnBfaGllcmFyY2hpY2FsX2JhcjogeworICAgICAgICBfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9yZWxlYXNlKAorICAgICAgICAgICAgYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsIEZBTFNFIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgYnBfdHJlZV9iYXI6IHsKKyAgICAgICAgS01QX0FTU0VSVChfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbYnRdKTsKKyAgICAgICAgX19rbXBfdHJlZV9iYXJyaWVyX3JlbGVhc2UoYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgX19rbXBfbGluZWFyX2JhcnJpZXJfcmVsZWFzZShidCwgdGhpc190aHIsIGd0aWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopKTsKKyAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYykgeworICAgICAgICBfX2ttcF90YXNrX3RlYW1fc3luYyh0aGlzX3RociwgdGVhbSk7CisgICAgICB9CisgICAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIC8qIEdFSDogVE9ETzogTW92ZSB0aGlzIHVuZGVyIGlmLWNvbmRpdGlvbiBhYm92ZSBhbmQgYWxzbyBpbmNsdWRlIGluCisgICAgICAgX19rbXBfZW5kX3NwbGl0X2JhcnJpZXIoKS4gVGhpcyB3aWxsIG1vcmUgYWNjdXJhdGVseSByZXByZXNlbnQgdGhlIGFjdHVhbAorICAgICAgIHJlbGVhc2UgdGltZSBvZiB0aGUgdGhyZWFkcyBmb3Igc3BsaXQgYmFycmllcnMuICAqLworICAgIGlmIChfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRykKKyAgICAgIF9fa21wX2l0dF9iYXJyaWVyX2ZpbmlzaGVkKGd0aWQsIGl0dF9zeW5jX29iaik7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICB9IGVsc2UgeyAvLyBUZWFtIGlzIHNlcmlhbGl6ZWQuCisgICAgc3RhdHVzID0gMDsKKyAgICBpZiAoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgICAgaWYgKHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0gIT0gTlVMTCkgeworICAgICAgICB2b2lkICppdHRfc3luY19vYmogPSBOVUxMOworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIGlmIChfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRykgeworICAgICAgICAgIGl0dF9zeW5jX29iaiA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdChndGlkLCBidCwgMSk7CisgICAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfc3RhcnRpbmcoZ3RpZCwgaXR0X3N5bmNfb2JqKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3Roci0+dGgudGhfdGFza190ZWFtLT50dC50dF9mb3VuZF9wcm94eV90YXNrcyA9PQorICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUpOworICAgICAgICBfX2ttcF90YXNrX3RlYW1fd2FpdCh0aGlzX3RociwgdGVhbSBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopKTsKKyAgICAgICAgX19rbXBfdGFza190ZWFtX3NldHVwKHRoaXNfdGhyLCB0ZWFtLCAwKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKQorICAgICAgICAgIF9fa21wX2l0dF9iYXJyaWVyX2ZpbmlzaGVkKGd0aWQsIGl0dF9zeW5jX29iaik7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgfQorI2Vsc2UKKyAgICAgIC8vIFRoZSB0YXNrIHRlYW0gc2hvdWxkIGJlIE5VTEwgZm9yIHNlcmlhbGl6ZWQgY29kZSAodGFza3Mgd2lsbCBiZQorICAgICAgLy8gZXhlY3V0ZWQgaW1tZWRpYXRlbHkpCisgICAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0tPnQudF90YXNrX3RlYW1bdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGVdID09IE5VTEwpOworICAgICAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3Roci0+dGgudGhfdGFza190ZWFtID09IE5VTEwpOworI2VuZGlmCisgICAgfQorICB9CisgIEtBX1RSQUNFKDE1LCAoIl9fa21wX2JhcnJpZXI6IFQjJWQoJWQ6JWQpIGlzIGxlYXZpbmcgd2l0aCByZXR1cm4gdmFsdWUgJWRcbiIsCisgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfdGVhbV9mcm9tX2d0aWQoZ3RpZCktPnQudF9pZCwKKyAgICAgICAgICAgICAgICBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpLCBzdGF0dXMpKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICBpZiAob21wdF9lbmFibGVkKSB7CisjaWYgT01QVF9CTEFNRQorICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYmFycmllcl9lbmQpKSB7CisgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYmFycmllcl9lbmQpKG15X3BhcmFsbGVsX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteV90YXNrX2lkKTsKKyAgICB9CisjZW5kaWYKKyAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd29ya19wYXJhbGxlbDsKKyAgfQorI2VuZGlmCisgIEFOTk9UQVRFX0JBUlJJRVJfRU5EKCZ0ZWFtLT50LnRfYmFyKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkIF9fa21wX2VuZF9zcGxpdF9iYXJyaWVyKGVudW0gYmFycmllcl90eXBlIGJ0LCBpbnQgZ3RpZCkgeworICBLTVBfVElNRV9ERVZFTE9QRVJfUEFSVElUSU9ORURfQkxPQ0soS01QX2VuZF9zcGxpdF9iYXJyaWVyKTsKKyAgS01QX1NFVF9USFJFQURfU1RBVEVfQkxPQ0soUExBSU5fQkFSUklFUik7CisgIGludCB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgIGttcF90ZWFtX3QgKnRlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKworICBBTk5PVEFURV9CQVJSSUVSX0JFR0lOKCZ0ZWFtLT50LnRfYmFyKTsKKyAgaWYgKCF0ZWFtLT50LnRfc2VyaWFsaXplZCkgeworICAgIGlmIChLTVBfTUFTVEVSX0dUSUQoZ3RpZCkpIHsKKyAgICAgIHN3aXRjaCAoX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm5bYnRdKSB7CisgICAgICBjYXNlIGJwX2h5cGVyX2JhcjogeworICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1tidF0pOworICAgICAgICBfX2ttcF9oeXBlcl9iYXJyaWVyX3JlbGVhc2UoYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSBVU0VfSVRUX0JVSUxEX0FSRyhOVUxMKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBicF9oaWVyYXJjaGljYWxfYmFyOiB7CisgICAgICAgIF9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX3JlbGVhc2UoYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UgVVNFX0lUVF9CVUlMRF9BUkcoTlVMTCkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgYnBfdHJlZV9iYXI6IHsKKyAgICAgICAgS01QX0FTU0VSVChfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbYnRdKTsKKyAgICAgICAgX19rbXBfdHJlZV9iYXJyaWVyX3JlbGVhc2UoYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIFVTRV9JVFRfQlVJTERfQVJHKE5VTEwpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OiB7CisgICAgICAgIF9fa21wX2xpbmVhcl9iYXJyaWVyX3JlbGVhc2UoYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UgVVNFX0lUVF9CVUlMRF9BUkcoTlVMTCkpOworICAgICAgfQorICAgICAgfQorICAgICAgaWYgKF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjKSB7CisgICAgICAgIF9fa21wX3Rhc2tfdGVhbV9zeW5jKHRoaXNfdGhyLCB0ZWFtKTsKKyAgICAgIH0gLy8gaWYKKyAgICB9CisgIH0KKyAgQU5OT1RBVEVfQkFSUklFUl9FTkQoJnRlYW0tPnQudF9iYXIpOworfQorCit2b2lkIF9fa21wX2pvaW5fYmFycmllcihpbnQgZ3RpZCkgeworICBLTVBfVElNRV9QQVJUSVRJT05FRF9CTE9DSyhPTVBfam9pbl9iYXJyaWVyKTsKKyAgS01QX1NFVF9USFJFQURfU1RBVEVfQkxPQ0soRk9SS19KT0lOX0JBUlJJRVIpOworICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgIGttcF90ZWFtX3QgKnRlYW07CisgIGttcF91aW50IG5wcm9jOworICBrbXBfaW5mb190ICptYXN0ZXJfdGhyZWFkOworICBpbnQgdGlkOworI2lmZGVmIEtNUF9ERUJVRworICBpbnQgdGVhbV9pZDsKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKyNpZiBVU0VfSVRUX0JVSUxECisgIHZvaWQgKml0dF9zeW5jX29iaiA9IE5VTEw7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKSAvLyBEb24ndCBjYWxsIHJvdXRpbmUgd2l0aG91dCBuZWVkCisgICAgLy8gR2V0IG9iamVjdCBjcmVhdGVkIGF0IGZvcmtfYmFycmllcgorICAgIGl0dF9zeW5jX29iaiA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdChndGlkLCBic19mb3Jram9pbl9iYXJyaWVyKTsKKyNlbmRpZgorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgS01QX01CKCk7CisKKyAgLy8gR2V0IGN1cnJlbnQgaW5mbworICB0ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgIG5wcm9jID0gdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2M7CisgIEtNUF9ERUJVR19BU1NFUlQoKGludClucHJvYyA9PSB0ZWFtLT50LnRfbnByb2MpOworICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworI2lmZGVmIEtNUF9ERUJVRworICB0ZWFtX2lkID0gdGVhbS0+dC50X2lkOworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworICBtYXN0ZXJfdGhyZWFkID0gdGhpc190aHItPnRoLnRoX3RlYW1fbWFzdGVyOworI2lmZGVmIEtNUF9ERUJVRworICBpZiAobWFzdGVyX3RocmVhZCAhPSB0ZWFtLT50LnRfdGhyZWFkc1swXSkgeworICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZSgpOworICB9CisjZW5kaWYgLyogS01QX0RFQlVHICovCisgIEtNUF9ERUJVR19BU1NFUlQobWFzdGVyX3RocmVhZCA9PSB0ZWFtLT50LnRfdGhyZWFkc1swXSk7CisgIEtNUF9NQigpOworCisgIC8vIFZlcmlmeSBzdGF0ZQorICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX3RocmVhZHMgJiYgX19rbXBfdGhyZWFkc1tndGlkXSk7CisgIEtNUF9ERUJVR19BU1NFUlQoVENSX1BUUih0aGlzX3Roci0+dGgudGhfdGVhbSkpOworICBLTVBfREVCVUdfQVNTRVJUKFRDUl9QVFIodGhpc190aHItPnRoLnRoX3Jvb3QpKTsKKyAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3RociA9PSB0ZWFtLT50LnRfdGhyZWFkc1t0aWRdKTsKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBfam9pbl9iYXJyaWVyOiBUIyVkKCVkOiVkKSBhcnJpdmVkIGF0IGpvaW4gYmFycmllclxuIiwKKyAgICAgICAgICAgICAgICBndGlkLCB0ZWFtX2lkLCB0aWQpKTsKKworICBBTk5PVEFURV9CQVJSSUVSX0JFR0lOKCZ0ZWFtLT50LnRfYmFyKTsKKyNpZiBPTVBUX1NVUFBPUlQKKyNpZiBPTVBUX1RSQUNFCisgIGlmIChvbXB0X2VuYWJsZWQgJiYgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW4pKSB7CisgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW4pKAorICAgICAgICB0ZWFtLT50Lm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkLAorICAgICAgICB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLm9tcHRfdGFza19pbmZvLnRhc2tfaWQpOworICB9CisjZW5kaWYKKyAgdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3dhaXRfYmFycmllcjsKKyNlbmRpZgorCisgIGlmIChfX2ttcF90YXNraW5nX21vZGUgPT0gdHNrbV9leHRyYV9iYXJyaWVyKSB7CisgICAgX19rbXBfdGFza2luZ19iYXJyaWVyKHRlYW0sIHRoaXNfdGhyLCBndGlkKTsKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9qb2luX2JhcnJpZXI6IFQjJWQoJWQ6JWQpIHBhc3QgdGFraW5nIGJhcnJpZXJcbiIsIGd0aWQsCisgICAgICAgICAgICAgICAgICB0ZWFtX2lkLCB0aWQpKTsKKyAgfQorI2lmZGVmIEtNUF9ERUJVRworICBpZiAoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9qb2luX2JhcnJpZXI6IFQjJWQsIG9sZCB0ZWFtID0gJWQsIG9sZCB0YXNrX3RlYW0gPSAiCisgICAgICAgICAgICAgICAgICAiJXAsIHRoX3Rhc2tfdGVhbSA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aGlzX3RociksIHRlYW1faWQsCisgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGFza190ZWFtW3RoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlXSwKKyAgICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0pKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0gPT0KKyAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF90YXNrX3RlYW1bdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGVdKTsKKyAgfQorI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgIC8qIENvcHkgdGhlIGJsb2NrdGltZSBpbmZvIHRvIHRoZSB0aHJlYWQsIHdoZXJlIF9fa21wX3dhaXRfdGVtcGxhdGUoKSBjYW4KKyAgICAgYWNjZXNzIGl0IHdoZW4gdGhlIHRlYW0gc3RydWN0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGV4aXN0LiBEb2luZyB0aGVzZQorICAgICBsb2FkcyBjYXVzZXMgYSBjYWNoZSBtaXNzIHNsb3dzIGRvd24gRVBDQyBwYXJhbGxlbCBieSAyeC4gQXMgYSB3b3JrYXJvdW5kLAorICAgICB3ZSBkbyBub3QgcGVyZm9ybSB0aGUgY29weSBpZiBibG9ja3RpbWU9aW5maW5pdGUsIHNpbmNlIHRoZSB2YWx1ZXMgYXJlIG5vdAorICAgICB1c2VkIGJ5IF9fa21wX3dhaXRfdGVtcGxhdGUoKSBpbiB0aGF0IGNhc2UuICovCisgIGlmIChfX2ttcF9kZmx0X2Jsb2NrdGltZSAhPSBLTVBfTUFYX0JMT0NLVElNRSkgeworI2lmIEtNUF9VU0VfTU9OSVRPUgorICAgIHRoaXNfdGhyLT50aC50aF90ZWFtX2J0X2ludGVydmFscyA9CisgICAgICAgIHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cy5idF9pbnRlcnZhbHM7CisgICAgdGhpc190aHItPnRoLnRoX3RlYW1fYnRfc2V0ID0KKyAgICAgICAgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9pY3ZzLmJ0X3NldDsKKyNlbHNlCisgICAgdGhpc190aHItPnRoLnRoX3RlYW1fYnRfaW50ZXJ2YWxzID0gS01QX0JMT0NLVElNRV9JTlRFUlZBTCgpOworI2VuZGlmCisgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKQorICAgIF9fa21wX2l0dF9iYXJyaWVyX3N0YXJ0aW5nKGd0aWQsIGl0dF9zeW5jX29iaik7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgIHN3aXRjaCAoX19rbXBfYmFycmllcl9nYXRoZXJfcGF0dGVybltic19mb3Jram9pbl9iYXJyaWVyXSkgeworICBjYXNlIGJwX2h5cGVyX2JhcjogeworICAgIEtNUF9BU1NFUlQoX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHNbYnNfZm9ya2pvaW5fYmFycmllcl0pOworICAgIF9fa21wX2h5cGVyX2JhcnJpZXJfZ2F0aGVyKGJzX2Zvcmtqb2luX2JhcnJpZXIsIHRoaXNfdGhyLCBndGlkLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGJwX2hpZXJhcmNoaWNhbF9iYXI6IHsKKyAgICBfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXIoYnNfZm9ya2pvaW5fYmFycmllciwgdGhpc190aHIsIGd0aWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGJwX3RyZWVfYmFyOiB7CisgICAgS01QX0FTU0VSVChfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1tic19mb3Jram9pbl9iYXJyaWVyXSk7CisgICAgX19rbXBfdHJlZV9iYXJyaWVyX2dhdGhlcihic19mb3Jram9pbl9iYXJyaWVyLCB0aGlzX3RociwgZ3RpZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopKTsKKyAgICBicmVhazsKKyAgfQorICBkZWZhdWx0OiB7CisgICAgX19rbXBfbGluZWFyX2JhcnJpZXJfZ2F0aGVyKGJzX2Zvcmtqb2luX2JhcnJpZXIsIHRoaXNfdGhyLCBndGlkLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSk7CisgIH0KKyAgfQorCisgIC8qIEZyb20gdGhpcyBwb2ludCBvbiwgdGhlIHRlYW0gZGF0YSBzdHJ1Y3R1cmUgbWF5IGJlIGRlYWxsb2NhdGVkIGF0IGFueSB0aW1lCisgICAgIGJ5IHRoZSBtYXN0ZXIgdGhyZWFkIC0gaXQgaXMgdW5zYWZlIHRvIHJlZmVyZW5jZSBpdCBpbiBhbnkgb2YgdGhlIHdvcmtlcgorICAgICB0aHJlYWRzLiBBbnkgcGVyLXRlYW0gZGF0YSBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgcmVmZXJlbmNlZCBiZWZvcmUgdGhlCisgICAgIGVuZCBvZiB0aGUgYmFycmllciBzaG91bGQgYmUgbW92ZWQgdG8gdGhlIGttcF90YXNrX3RlYW1fdCBzdHJ1Y3RzLiAgKi8KKyAgaWYgKEtNUF9NQVNURVJfVElEKHRpZCkpIHsKKyAgICBpZiAoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyAgICAgIF9fa21wX3Rhc2tfdGVhbV93YWl0KHRoaXNfdGhyLCB0ZWFtIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikpOworICAgIH0KKyNpZiBLTVBfU1RBVFNfRU5BQkxFRAorICAgIC8vIEhhdmUgbWFzdGVyIHRocmVhZCBmbGFnIHRoZSB3b3JrZXJzIHRvIGluZGljYXRlIHRoZXkgYXJlIG5vdyB3YWl0aW5nIGZvcgorICAgIC8vIG5leHQgcGFyYWxsZWwgcmVnaW9uLCBBbHNvIHdha2UgdGhlbSB1cCBzbyB0aGV5IHN3aXRjaCB0aGVpciB0aW1lcnMgdG8KKyAgICAvLyBpZGxlLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVhbS0+dC50X25wcm9jOyArK2kpIHsKKyAgICAgIGttcF9pbmZvX3QgKnRlYW1fdGhyZWFkID0gdGVhbS0+dC50X3RocmVhZHNbaV07CisgICAgICBpZiAodGVhbV90aHJlYWQgPT0gdGhpc190aHIpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgdGVhbV90aHJlYWQtPnRoLnRoX3N0YXRzLT5zZXRJZGxlRmxhZygpOworICAgICAgaWYgKF9fa21wX2RmbHRfYmxvY2t0aW1lICE9IEtNUF9NQVhfQkxPQ0tUSU1FICYmCisgICAgICAgICAgdGVhbV90aHJlYWQtPnRoLnRoX3NsZWVwX2xvYyAhPSBOVUxMKQorICAgICAgICBfX2ttcF9udWxsX3Jlc3VtZV93cmFwcGVyKF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGVhbV90aHJlYWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW1fdGhyZWFkLT50aC50aF9zbGVlcF9sb2MpOworICAgIH0KKyNlbmRpZgorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBpZiAoX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcpCisgICAgICBfX2ttcF9pdHRfYmFycmllcl9taWRkbGUoZ3RpZCwgaXR0X3N5bmNfb2JqKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgLy8gSm9pbiBiYXJyaWVyIC0gcmVwb3J0IGZyYW1lIGVuZAorICAgIGlmICgoX19pdHRfZnJhbWVfc3VibWl0X3YzX3B0ciB8fCBLTVBfSVRUX0RFQlVHKSAmJgorICAgICAgICBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSAmJgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgIHRoaXNfdGhyLT50aC50aF90ZWFtc19taWNyb3Rhc2sgPT0gTlVMTCAmJgorI2VuZGlmCisgICAgICAgIHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwgPT0gMSkgeworICAgICAga21wX3VpbnQ2NCBjdXJfdGltZSA9IF9faXR0X2dldF90aW1lc3RhbXAoKTsKKyAgICAgIGlkZW50X3QgKmxvYyA9IHRlYW0tPnQudF9pZGVudDsKKyAgICAgIGttcF9pbmZvX3QgKipvdGhlcl90aHJlYWRzID0gdGVhbS0+dC50X3RocmVhZHM7CisgICAgICBpbnQgbnByb2MgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYzsKKyAgICAgIGludCBpOworICAgICAgc3dpdGNoIChfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSkgeworICAgICAgY2FzZSAxOgorICAgICAgICBfX2ttcF9pdHRfZnJhbWVfc3VibWl0KGd0aWQsIHRoaXNfdGhyLT50aC50aF9mcmFtZV90aW1lLCBjdXJfdGltZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MsIG5wcm9jKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIF9fa21wX2l0dF9mcmFtZV9zdWJtaXQoZ3RpZCwgdGhpc190aHItPnRoLnRoX2Jhcl9taW5fdGltZSwgY3VyX3RpbWUsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jLCBucHJvYyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOgorICAgICAgICBpZiAoX19pdHRfbWV0YWRhdGFfYWRkX3B0cikgeworICAgICAgICAgIC8vIEluaXRpYWxpemUgd2l0aCBtYXN0ZXIncyB3YWl0IHRpbWUKKyAgICAgICAgICBrbXBfdWludDY0IGRlbHRhID0gY3VyX3RpbWUgLSB0aGlzX3Roci0+dGgudGhfYmFyX2Fycml2ZV90aW1lOworICAgICAgICAgIC8vIFNldCBhcnJpdmUgdGltZSB0byB6ZXJvIHRvIGJlIGFibGUgdG8gY2hlY2sgaXQgaW4KKyAgICAgICAgICAvLyBfX2ttcF9pbnZva2VfdGFzaygpOyB0aGUgc2FtZSBpcyBkb25lIGluc2lkZSB0aGUgbG9vcCBiZWxvdworICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9iYXJfYXJyaXZlX3RpbWUgPSAwOworICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBucHJvYzsgKytpKSB7CisgICAgICAgICAgICBkZWx0YSArPSAoY3VyX3RpbWUgLSBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9iYXJfYXJyaXZlX3RpbWUpOworICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyX2Fycml2ZV90aW1lID0gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgX19rbXBfaXR0X21ldGFkYXRhX2ltYmFsYW5jZShndGlkLCB0aGlzX3Roci0+dGgudGhfZnJhbWVfdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl90aW1lLCBkZWx0YSwgMCk7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfaXR0X2ZyYW1lX3N1Ym1pdChndGlkLCB0aGlzX3Roci0+dGgudGhfZnJhbWVfdGltZSwgY3VyX3RpbWUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jLCBucHJvYyk7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9mcmFtZV90aW1lID0gY3VyX3RpbWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgIH0KKyNpZiBVU0VfSVRUX0JVSUxECisgIGVsc2UgeworICAgIGlmIChfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRykKKyAgICAgIF9fa21wX2l0dF9iYXJyaWVyX21pZGRsZShndGlkLCBpdHRfc3luY19vYmopOworICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisjaWYgS01QX0RFQlVHCisgIGlmIChLTVBfTUFTVEVSX1RJRCh0aWQpKSB7CisgICAgS0FfVFJBQ0UoCisgICAgICAgIDE1LAorICAgICAgICAoIl9fa21wX2pvaW5fYmFycmllcjogVCMlZCglZDolZCkgc2F5cyBhbGwgJWQgdGVhbSB0aHJlYWRzIGFycml2ZWRcbiIsCisgICAgICAgICBndGlkLCB0ZWFtX2lkLCB0aWQsIG5wcm9jKSk7CisgIH0KKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworICAvLyBUT0RPIG5vdywgbWFyayB3b3JrZXIgdGhyZWFkcyBhcyBkb25lIHNvIHRoZXkgbWF5IGJlIGRpc2JhbmRlZAorICBLTVBfTUIoKTsgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICBLQV9UUkFDRSgxMCwKKyAgICAgICAgICAgKCJfX2ttcF9qb2luX2JhcnJpZXI6IFQjJWQoJWQ6JWQpIGxlYXZpbmdcbiIsIGd0aWQsIHRlYW1faWQsIHRpZCkpOworCisjaWYgT01QVF9TVVBQT1JUCisgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyNpZiBPTVBUX0JMQU1FCisgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9iYXJyaWVyX2VuZCkpIHsKKyAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9iYXJyaWVyX2VuZCkoCisgICAgICAgICAgdGVhbS0+dC5vbXB0X3RlYW1faW5mby5wYXJhbGxlbF9pZCwKKyAgICAgICAgICB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLm9tcHRfdGFza19pbmZvLnRhc2tfaWQpOworICAgIH0KKyNlbmRpZgorCisgICAgLy8gcmV0dXJuIHRvIGRlZmF1bHQgc3RhdGUKKyAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfb3ZlcmhlYWQ7CisgIH0KKyNlbmRpZgorICBBTk5PVEFURV9CQVJSSUVSX0VORCgmdGVhbS0+dC50X2Jhcik7Cit9CisKKy8vIFRPRE8gcmVsZWFzZSB3b3JrZXIgdGhyZWFkcycgZm9yayBiYXJyaWVycyBhcyB3ZSBhcmUgcmVhZHkgaW5zdGVhZCBvZiBhbGwgYXQKKy8vIG9uY2UKK3ZvaWQgX19rbXBfZm9ya19iYXJyaWVyKGludCBndGlkLCBpbnQgdGlkKSB7CisgIEtNUF9USU1FX1BBUlRJVElPTkVEX0JMT0NLKE9NUF9mb3JrX2JhcnJpZXIpOworICBLTVBfU0VUX1RIUkVBRF9TVEFURV9CTE9DSyhGT1JLX0pPSU5fQkFSUklFUik7CisgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAga21wX3RlYW1fdCAqdGVhbSA9ICh0aWQgPT0gMCkgPyB0aGlzX3Roci0+dGgudGhfdGVhbSA6IE5VTEw7CisjaWYgVVNFX0lUVF9CVUlMRAorICB2b2lkICppdHRfc3luY19vYmogPSBOVUxMOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgaWYgKHRlYW0pCisgICAgQU5OT1RBVEVfQkFSUklFUl9FTkQoJnRlYW0tPnQudF9iYXIpOworCisgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2ZvcmtfYmFycmllcjogVCMlZCglZDolZCkgaGFzIGFycml2ZWRcbiIsIGd0aWQsCisgICAgICAgICAgICAgICAgKHRlYW0gIT0gTlVMTCkgPyB0ZWFtLT50LnRfaWQgOiAtMSwgdGlkKSk7CisKKyAgLy8gdGhfdGVhbSBwb2ludGVyIG9ubHkgdmFsaWQgZm9yIG1hc3RlciB0aHJlYWQgaGVyZQorICBpZiAoS01QX01BU1RFUl9USUQodGlkKSkgeworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcpIHsKKyAgICAgIC8vIENyZWF0ZSBpdHQgYmFycmllciBvYmplY3QKKyAgICAgIGl0dF9zeW5jX29iaiA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdChndGlkLCBic19mb3Jram9pbl9iYXJyaWVyLCAxKTsKKyAgICAgIF9fa21wX2l0dF9iYXJyaWVyX21pZGRsZShndGlkLCBpdHRfc3luY19vYmopOyAvLyBDYWxsIGFjcXVpcmVkL3JlbGVhc2luZworICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZICovCisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBrbXBfaW5mb190ICoqb3RoZXJfdGhyZWFkcyA9IHRlYW0tPnQudF90aHJlYWRzOworICAgIGludCBpOworCisgICAgLy8gVmVyaWZ5IHN0YXRlCisgICAgS01QX01CKCk7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgdGVhbS0+dC50X25wcm9jOyArK2kpIHsKKyAgICAgIEtBX1RSQUNFKDUwMCwKKyAgICAgICAgICAgICAgICgiX19rbXBfZm9ya19iYXJyaWVyOiBUIyVkKCVkOjApIGNoZWNraW5nIFQjJWQoJWQ6JWQpIGZvcmsgZ28gIgorICAgICAgICAgICAgICAgICI9PSAldS5cbiIsCisgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9pbmZvLmRzLmRzX2d0aWQsCisgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9pbmZvLmRzLmRzX3RpZCwKKyAgICAgICAgICAgICAgICBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9iYXJbYnNfZm9ya2pvaW5fYmFycmllcl0uYmIuYl9nbykpOworICAgICAgS01QX0RFQlVHX0FTU0VSVCgKKyAgICAgICAgICAoVENSXzQob3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyW2JzX2Zvcmtqb2luX2JhcnJpZXJdLmJiLmJfZ28pICYKKyAgICAgICAgICAgfihLTVBfQkFSUklFUl9TTEVFUF9TVEFURSkpID09IEtNUF9JTklUX0JBUlJJRVJfU1RBVEUpOworICAgICAgS01QX0RFQlVHX0FTU0VSVChvdGhlcl90aHJlYWRzW2ldLT50aC50aF90ZWFtID09IHRlYW0pOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjKSB7CisgICAgICAvLyAwIGluZGljYXRlcyBzZXR1cCBjdXJyZW50IHRhc2sgdGVhbSBpZiBudGhyZWFkcyA+IDEKKyAgICAgIF9fa21wX3Rhc2tfdGVhbV9zZXR1cCh0aGlzX3RociwgdGVhbSwgMCk7CisgICAgfQorCisgICAgLyogVGhlIG1hc3RlciB0aHJlYWQgbWF5IGhhdmUgY2hhbmdlZCBpdHMgYmxvY2t0aW1lIGJldHdlZW4gdGhlIGpvaW4gYmFycmllcgorICAgICAgIGFuZCB0aGUgZm9yayBiYXJyaWVyLiBDb3B5IHRoZSBibG9ja3RpbWUgaW5mbyB0byB0aGUgdGhyZWFkLCB3aGVyZQorICAgICAgIF9fa21wX3dhaXRfdGVtcGxhdGUoKSBjYW4gYWNjZXNzIGl0IHdoZW4gdGhlIHRlYW0gc3RydWN0IGlzIG5vdAorICAgICAgIGd1YXJhbnRlZWQgdG8gZXhpc3QuICovCisgICAgLy8gU2VlIG5vdGUgYWJvdXQgdGhlIGNvcnJlc3BvbmRpbmcgY29kZSBpbiBfX2ttcF9qb2luX2JhcnJpZXIoKSBiZWluZworICAgIC8vIHBlcmZvcm1hbmNlLWNyaXRpY2FsCisgICAgaWYgKF9fa21wX2RmbHRfYmxvY2t0aW1lICE9IEtNUF9NQVhfQkxPQ0tUSU1FKSB7CisjaWYgS01QX1VTRV9NT05JVE9SCisgICAgICB0aGlzX3Roci0+dGgudGhfdGVhbV9idF9pbnRlcnZhbHMgPQorICAgICAgICAgIHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cy5idF9pbnRlcnZhbHM7CisgICAgICB0aGlzX3Roci0+dGgudGhfdGVhbV9idF9zZXQgPQorICAgICAgICAgIHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cy5idF9zZXQ7CisjZWxzZQorICAgICAgdGhpc190aHItPnRoLnRoX3RlYW1fYnRfaW50ZXJ2YWxzID0gS01QX0JMT0NLVElNRV9JTlRFUlZBTCgpOworI2VuZGlmCisgICAgfQorICB9IC8vIG1hc3RlcgorCisgIHN3aXRjaCAoX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm5bYnNfZm9ya2pvaW5fYmFycmllcl0pIHsKKyAgY2FzZSBicF9oeXBlcl9iYXI6IHsKKyAgICBLTVBfQVNTRVJUKF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1tic19mb3Jram9pbl9iYXJyaWVyXSk7CisgICAgX19rbXBfaHlwZXJfYmFycmllcl9yZWxlYXNlKGJzX2Zvcmtqb2luX2JhcnJpZXIsIHRoaXNfdGhyLCBndGlkLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSk7CisgICAgYnJlYWs7CisgIH0KKyAgY2FzZSBicF9oaWVyYXJjaGljYWxfYmFyOiB7CisgICAgX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfcmVsZWFzZShic19mb3Jram9pbl9iYXJyaWVyLCB0aGlzX3RociwgZ3RpZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopKTsKKyAgICBicmVhazsKKyAgfQorICBjYXNlIGJwX3RyZWVfYmFyOiB7CisgICAgS01QX0FTU0VSVChfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbYnNfZm9ya2pvaW5fYmFycmllcl0pOworICAgIF9fa21wX3RyZWVfYmFycmllcl9yZWxlYXNlKGJzX2Zvcmtqb2luX2JhcnJpZXIsIHRoaXNfdGhyLCBndGlkLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopKTsKKyAgICBicmVhazsKKyAgfQorICBkZWZhdWx0OiB7CisgICAgX19rbXBfbGluZWFyX2JhcnJpZXJfcmVsZWFzZShic19mb3Jram9pbl9iYXJyaWVyLCB0aGlzX3RociwgZ3RpZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopKTsKKyAgfQorICB9CisKKyAgLy8gRWFybHkgZXhpdCBmb3IgcmVhcGluZyB0aHJlYWRzIHJlbGVhc2luZyBmb3Jram9pbiBiYXJyaWVyCisgIGlmIChUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpKSB7CisgICAgdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSA9IE5VTEw7CisKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKSB7CisgICAgICBpZiAoIUtNUF9NQVNURVJfVElEKHRpZCkpIHsKKyAgICAgICAgaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KGd0aWQsIGJzX2Zvcmtqb2luX2JhcnJpZXIpOworICAgICAgICBpZiAoaXR0X3N5bmNfb2JqKQorICAgICAgICAgIF9fa21wX2l0dF9iYXJyaWVyX2ZpbmlzaGVkKGd0aWQsIGl0dF9zeW5jX29iaik7CisgICAgICB9CisgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkgKi8KKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9mb3JrX2JhcnJpZXI6IFQjJWQgaXMgbGVhdmluZyBlYXJseVxuIiwgZ3RpZCkpOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIFdlIGNhbiBub3cgYXNzdW1lIHRoYXQgYSB2YWxpZCB0ZWFtIHN0cnVjdHVyZSBoYXMgYmVlbiBhbGxvY2F0ZWQgYnkgdGhlCisgICAgIG1hc3RlciBhbmQgcHJvcGFnYXRlZCB0byBhbGwgd29ya2VyIHRocmVhZHMuIFRoZSBjdXJyZW50IHRocmVhZCwgaG93ZXZlciwKKyAgICAgbWF5IG5vdCBiZSBwYXJ0IG9mIHRoZSB0ZWFtLCBzbyB3ZSBjYW4ndCBibGluZGx5IGFzc3VtZSB0aGF0IHRoZSB0ZWFtCisgICAgIHBvaW50ZXIgaXMgbm9uLW51bGwuICAqLworICB0ZWFtID0gKGttcF90ZWFtX3QgKilUQ1JfUFRSKHRoaXNfdGhyLT50aC50aF90ZWFtKTsKKyAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtICE9IE5VTEwpOworICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworCisjaWYgS01QX0JBUlJJRVJfSUNWX1BVTEwKKyAgLyogTWFzdGVyIHRocmVhZCdzIGNvcHkgb2YgdGhlIElDVnMgd2FzIHNldCB1cCBvbiB0aGUgaW1wbGljaXQgdGFza2RhdGEgaW4KKyAgICAgX19rbXBfcmVpbml0aWFsaXplX3RlYW0uIF9fa21wX2ZvcmtfY2FsbCgpIGFzc3VtZXMgdGhlIG1hc3RlciB0aHJlYWQncworICAgICBpbXBsaWNpdCB0YXNrIGhhcyB0aGlzIGRhdGEgYmVmb3JlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiBXZSBjYW5ub3QKKyAgICAgbW9kaWZ5IF9fa21wX2ZvcmtfY2FsbCgpIHRvIGxvb2sgYXQgdGhlIGZpeGVkIElDVnMgaW4gdGhlIG1hc3RlcidzIHRocmVhZAorICAgICBzdHJ1Y3QsIGJlY2F1c2UgaXQgaXMgbm90IGFsd2F5cyB0aGUgY2FzZSB0aGF0IHRoZSB0aHJlYWRzIGFycmF5cyBoYXZlCisgICAgIGJlZW4gYWxsb2NhdGVkIHdoZW4gX19rbXBfZm9ya19jYWxsKCkgaXMgZXhlY3V0ZWQuICovCisgIHsKKyAgICBLTVBfVElNRV9ERVZFTE9QRVJfUEFSVElUSU9ORURfQkxPQ0soVVNFUl9pY3ZfY29weSk7CisgICAgaWYgKCFLTVBfTUFTVEVSX1RJRCh0aWQpKSB7IC8vIG1hc3RlciB0aHJlYWQgYWxyZWFkeSBoYXMgSUNWcworICAgICAgLy8gQ29weSB0aGUgaW5pdGlhbCBJQ1ZzIGZyb20gdGhlIG1hc3RlcidzIHRocmVhZCBzdHJ1Y3QgdG8gdGhlIGltcGxpY2l0CisgICAgICAvLyB0YXNrIGZvciB0aGlzIHRpZC4KKyAgICAgIEtBX1RSQUNFKDEwLAorICAgICAgICAgICAgICAgKCJfX2ttcF9mb3JrX2JhcnJpZXI6IFQjJWQoJWQpIGlzIFBVTExpbmcgSUNWc1xuIiwgZ3RpZCwgdGlkKSk7CisgICAgICBfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2sodGVhbS0+dC50X2lkZW50LCB0ZWFtLT50LnRfdGhyZWFkc1t0aWRdLCB0ZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZCwgRkFMU0UpOworICAgICAgY29weV9pY3ZzKCZ0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX2ljdnMsCisgICAgICAgICAgICAgICAgJnRlYW0tPnQudF90aHJlYWRzWzBdCisgICAgICAgICAgICAgICAgICAgICAtPnRoLnRoX2Jhcltic19mb3Jram9pbl9iYXJyaWVyXQorICAgICAgICAgICAgICAgICAgICAgLmJiLnRoX2ZpeGVkX2ljdnMpOworICAgIH0KKyAgfQorI2VuZGlmIC8vIEtNUF9CQVJSSUVSX0lDVl9QVUxMCisKKyAgaWYgKF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjKSB7CisgICAgX19rbXBfdGFza190ZWFtX3N5bmModGhpc190aHIsIHRlYW0pOworICB9CisKKyNpZiBPTVBfNDBfRU5BQkxFRCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgIGttcF9wcm9jX2JpbmRfdCBwcm9jX2JpbmQgPSB0ZWFtLT50LnRfcHJvY19iaW5kOworICBpZiAocHJvY19iaW5kID09IHByb2NfYmluZF9pbnRlbCkgeworI2VuZGlmCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIC8vIENhbGwgZHluYW1pYyBhZmZpbml0eSBzZXR0aW5ncworICAgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2JhbGFuY2VkICYmIHRlYW0tPnQudF9zaXplX2NoYW5nZWQpIHsKKyAgICAgIF9fa21wX2JhbGFuY2VkX2FmZmluaXR5KHRpZCwgdGVhbS0+dC50X25wcm9jKTsKKyAgICB9CisjZW5kaWYgLy8gS01QX0FGRklOSVRZX1NVUFBPUlRFRAorI2lmIE9NUF80MF9FTkFCTEVEICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgfSBlbHNlIGlmIChwcm9jX2JpbmQgIT0gcHJvY19iaW5kX2ZhbHNlKSB7CisgICAgaWYgKHRoaXNfdGhyLT50aC50aF9uZXdfcGxhY2UgPT0gdGhpc190aHItPnRoLnRoX2N1cnJlbnRfcGxhY2UpIHsKKyAgICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF9mb3JrX2JhcnJpZXI6IFQjJWQgYWxyZWFkeSBpbiBjb3JyZWN0IHBsYWNlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aGlzX3RociksCisgICAgICAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfY3VycmVudF9wbGFjZSkpOworICAgIH0gZWxzZSB7CisgICAgICBfX2ttcF9hZmZpbml0eV9zZXRfcGxhY2UoZ3RpZCk7CisgICAgfQorICB9CisjZW5kaWYKKworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKSB7CisgICAgaWYgKCFLTVBfTUFTVEVSX1RJRCh0aWQpKSB7CisgICAgICAvLyBHZXQgY29ycmVjdCBiYXJyaWVyIG9iamVjdAorICAgICAgaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KGd0aWQsIGJzX2Zvcmtqb2luX2JhcnJpZXIpOworICAgICAgX19rbXBfaXR0X2JhcnJpZXJfZmluaXNoZWQoZ3RpZCwgaXR0X3N5bmNfb2JqKTsgLy8gV29ya2VycyBjYWxsIGFjcXVpcmVkCisgICAgfSAvLyAocHJlcGFyZSBjYWxsZWQgaW5zaWRlIGJhcnJpZXJfcmVsZWFzZSkKKyAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkgKi8KKyAgQU5OT1RBVEVfQkFSUklFUl9FTkQoJnRlYW0tPnQudF9iYXIpOworICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9mb3JrX2JhcnJpZXI6IFQjJWQoJWQ6JWQpIGlzIGxlYXZpbmdcbiIsIGd0aWQsCisgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCB0aWQpKTsKK30KKwordm9pZCBfX2ttcF9zZXR1cF9pY3ZfY29weShrbXBfdGVhbV90ICp0ZWFtLCBpbnQgbmV3X25wcm9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90ICpuZXdfaWN2cywgaWRlbnRfdCAqbG9jKSB7CisgIEtNUF9USU1FX0RFVkVMT1BFUl9QQVJUSVRJT05FRF9CTE9DSyhLTVBfc2V0dXBfaWN2X2NvcHkpOworCisgIEtNUF9ERUJVR19BU1NFUlQodGVhbSAmJiBuZXdfbnByb2MgJiYgbmV3X2ljdnMpOworICBLTVBfREVCVUdfQVNTRVJUKCghVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkpIHx8IG5ld19pY3ZzLT5ucHJvYyk7CisKKy8qIE1hc3RlciB0aHJlYWQncyBjb3B5IG9mIHRoZSBJQ1ZzIHdhcyBzZXQgdXAgb24gdGhlIGltcGxpY2l0IHRhc2tkYXRhIGluCisgICBfX2ttcF9yZWluaXRpYWxpemVfdGVhbS4gX19rbXBfZm9ya19jYWxsKCkgYXNzdW1lcyB0aGUgbWFzdGVyIHRocmVhZCdzCisgICBpbXBsaWNpdCB0YXNrIGhhcyB0aGlzIGRhdGEgYmVmb3JlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiAqLworI2lmIEtNUF9CQVJSSUVSX0lDVl9QVUxMCisgIC8qIENvcHkgSUNWcyB0byBtYXN0ZXIncyB0aHJlYWQgc3RydWN0dXJlIGludG8gdGhfZml4ZWRfaWN2cyAod2hpY2ggcmVtYWlucworICAgICB1bnRvdWNoZWQpLCB3aGVyZSBhbGwgb2YgdGhlIHdvcmtlciB0aHJlYWRzIGNhbiBhY2Nlc3MgdGhlbSBhbmQgbWFrZSB0aGVpcgorICAgICBvd24gY29waWVzIGFmdGVyIHRoZSBiYXJyaWVyLiAqLworICBLTVBfREVCVUdfQVNTRVJUKHRlYW0tPnQudF90aHJlYWRzWzBdKTsgLy8gVGhlIHRocmVhZHMgYXJyYXlzIHNob3VsZCBiZQorICAvLyBhbGxvY2F0ZWQgYXQgdGhpcyBwb2ludAorICBjb3B5X2ljdnMoCisgICAgICAmdGVhbS0+dC50X3RocmVhZHNbMF0tPnRoLnRoX2Jhcltic19mb3Jram9pbl9iYXJyaWVyXS5iYi50aF9maXhlZF9pY3ZzLAorICAgICAgbmV3X2ljdnMpOworICBLRl9UUkFDRSgxMCwgKCJfX2ttcF9zZXR1cF9pY3ZfY29weTogUFVMTDogVCMlZCB0aGlzX3RocmVhZD0lcCB0ZWFtPSVwXG4iLCAwLAorICAgICAgICAgICAgICAgIHRlYW0tPnQudF90aHJlYWRzWzBdLCB0ZWFtKSk7CisjZWxpZiBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorICAvLyBUaGUgSUNWcyB3aWxsIGJlIHByb3BhZ2F0ZWQgaW4gdGhlIGZvcmsgYmFycmllciwgc28gbm90aGluZyBuZWVkcyB0byBiZQorICAvLyBkb25lIGhlcmUuCisgIEtGX1RSQUNFKDEwLCAoIl9fa21wX3NldHVwX2ljdl9jb3B5OiBQVVNIOiBUIyVkIHRoaXNfdGhyZWFkPSVwIHRlYW09JXBcbiIsIDAsCisgICAgICAgICAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbMF0sIHRlYW0pKTsKKyNlbHNlCisgIC8vIENvcHkgdGhlIElDVnMgdG8gZWFjaCBvZiB0aGUgbm9uLW1hc3RlciB0aHJlYWRzLiAgVGhpcyB0YWtlcyBPKG50aHJlYWRzKQorICAvLyB0aW1lLgorICBuZ29fbG9hZChuZXdfaWN2cyk7CisgIEtNUF9ERUJVR19BU1NFUlQodGVhbS0+dC50X3RocmVhZHNbMF0pOyAvLyBUaGUgdGhyZWFkcyBhcnJheXMgc2hvdWxkIGJlCisgIC8vIGFsbG9jYXRlZCBhdCB0aGlzIHBvaW50CisgIGZvciAoaW50IGYgPSAxOyBmIDwgbmV3X25wcm9jOyArK2YpIHsgLy8gU2tpcCB0aGUgbWFzdGVyIHRocmVhZAorICAgIC8vIFRPRE86IEdFSCAtIHBhc3MgaW4gYmV0dGVyIHNvdXJjZSBsb2NhdGlvbiBpbmZvIHNpbmNlIHVzdWFsbHkgTlVMTCBoZXJlCisgICAgS0ZfVFJBQ0UoMTAsICgiX19rbXBfc2V0dXBfaWN2X2NvcHk6IExJTkVBUjogVCMlZCB0aGlzX3RocmVhZD0lcCB0ZWFtPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZiwgdGVhbS0+dC50X3RocmVhZHNbZl0sIHRlYW0pKTsKKyAgICBfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2sobG9jLCB0ZWFtLT50LnRfdGhyZWFkc1tmXSwgdGVhbSwgZiwgRkFMU0UpOworICAgIG5nb19zdG9yZV9pY3ZzKCZ0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVtmXS50ZF9pY3ZzLCBuZXdfaWN2cyk7CisgICAgS0ZfVFJBQ0UoMTAsICgiX19rbXBfc2V0dXBfaWN2X2NvcHk6IExJTkVBUjogVCMlZCB0aGlzX3RocmVhZD0lcCB0ZWFtPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZiwgdGVhbS0+dC50X3RocmVhZHNbZl0sIHRlYW0pKTsKKyAgfQorICBuZ29fc3luYygpOworI2VuZGlmIC8vIEtNUF9CQVJSSUVSX0lDVl9QVUxMCit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfY2FuY2VsLmNwcCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9jYW5jZWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ODBkMWEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfY2FuY2VsLmNwcApAQCAtMCwwICsxLDI4MiBAQAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pby5oIgorI2luY2x1ZGUgImttcF9zdHIuaCIKKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8qIQorQGluZ3JvdXAgQ0FOQ0VMTEFUSU9OCitAcGFyYW0gbG9jX3JlZiBsb2NhdGlvbiBvZiB0aGUgb3JpZ2luYWwgdGFzayBkaXJlY3RpdmUKK0BwYXJhbSBndGlkIEdsb2JhbCB0aHJlYWQgSUQgb2YgZW5jb3VudGVyaW5nIHRocmVhZAorQHBhcmFtIGNuY2xfa2luZCBDYW5jZWxsYXRpb24ga2luZCAocGFyYWxsZWwsIGZvciwgc2VjdGlvbnMsIHRhc2tncm91cCkKKworQHJldHVybiByZXR1cm5zIHRydWUgaWYgdGhlIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGhhcyBiZWVuIGFjdGl2YXRlZCBhbmQgdGhlCitleGVjdXRpb24gdGhyZWFkIG5lZWRzIHRvIHByb2NlZWQgdG8gdGhlIGVuZCBvZiB0aGUgY2FuY2VsZWQgcmVnaW9uLgorCitSZXF1ZXN0IGNhbmNlbGxhdGlvbiBvZiB0aGUgYmluZGluZyBPcGVuTVAgcmVnaW9uLgorKi8KK2ttcF9pbnQzMiBfX2ttcGNfY2FuY2VsKGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgY25jbF9raW5kKSB7CisgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKworICBLQ19UUkFDRSgxMCwgKCJfX2ttcGNfY2FuY2VsOiBUIyVkIHJlcXVlc3QgJWQgT01QX0NBTkNFTExBVElPTj0lZFxuIiwgZ3RpZCwKKyAgICAgICAgICAgICAgICBjbmNsX2tpbmQsIF9fa21wX29tcF9jYW5jZWxsYXRpb24pKTsKKworICBLTVBfREVCVUdfQVNTRVJUKGNuY2xfa2luZCAhPSBjYW5jZWxfbm9yZXEpOworICBLTVBfREVCVUdfQVNTRVJUKGNuY2xfa2luZCA9PSBjYW5jZWxfcGFyYWxsZWwgfHwgY25jbF9raW5kID09IGNhbmNlbF9sb29wIHx8CisgICAgICAgICAgICAgICAgICAgY25jbF9raW5kID09IGNhbmNlbF9zZWN0aW9ucyB8fAorICAgICAgICAgICAgICAgICAgIGNuY2xfa2luZCA9PSBjYW5jZWxfdGFza2dyb3VwKTsKKyAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9nZXRfZ3RpZCgpID09IGd0aWQpOworCisgIGlmIChfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKSB7CisgICAgc3dpdGNoIChjbmNsX2tpbmQpIHsKKyAgICBjYXNlIGNhbmNlbF9wYXJhbGxlbDoKKyAgICBjYXNlIGNhbmNlbF9sb29wOgorICAgIGNhc2UgY2FuY2VsX3NlY3Rpb25zOgorICAgICAgLy8gY2FuY2VsbGF0aW9uIHJlcXVlc3RzIGZvciBwYXJhbGxlbCBhbmQgd29ya3NoYXJpbmcgY29uc3RydWN0cworICAgICAgLy8gYXJlIGhhbmRsZWQgdGhyb3VnaCB0aGUgdGVhbSBzdHJ1Y3R1cmUKKyAgICAgIHsKKyAgICAgICAga21wX3RlYW1fdCAqdGhpc190ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGhpc190ZWFtKTsKKyAgICAgICAga21wX2ludDMyIG9sZCA9IEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQzMigKKyAgICAgICAgICAgICYodGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QpLCBjYW5jZWxfbm9yZXEsIGNuY2xfa2luZCk7CisgICAgICAgIGlmIChvbGQgPT0gY2FuY2VsX25vcmVxIHx8IG9sZCA9PSBjbmNsX2tpbmQpIHsKKyAgICAgICAgICAvLyBwcmludGYoIl9fa21wY19jYW5jZWw6IHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0PSVkIEAgJXBcbiIsCisgICAgICAgICAgLy8gICAgICAgdGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QsCisgICAgICAgICAgLy8gICAgICAgJih0aGlzX3RlYW0tPnQudF9jYW5jZWxfcmVxdWVzdCkpOworICAgICAgICAgIC8vIHdlIGRvIG5vdCBoYXZlIGEgY2FuY2VsbGF0aW9uIHJlcXVlc3QgaW4gdGhpcyB0ZWFtIG9yIHdlIGRvIGhhdmUKKyAgICAgICAgICAvLyBvbmUgdGhhdCBtYXRjaGVzIHRoZSBjdXJyZW50IHJlcXVlc3QgLT4gY2FuY2VsCisgICAgICAgICAgcmV0dXJuIDEgLyogdHJ1ZSAqLzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIGNhbmNlbF90YXNrZ3JvdXA6CisgICAgICAvLyBjYW5jZWxsYXRpb24gcmVxdWVzdHMgZm9yIGEgdGFzayBncm91cAorICAgICAgLy8gYXJlIGhhbmRsZWQgdGhyb3VnaCB0aGUgdGFza2dyb3VwIHN0cnVjdHVyZQorICAgICAgeworICAgICAgICBrbXBfdGFza2RhdGFfdCAqdGFzazsKKyAgICAgICAga21wX3Rhc2tncm91cF90ICp0YXNrZ3JvdXA7CisKKyAgICAgICAgdGFzayA9IHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2s7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGFzayk7CisKKyAgICAgICAgdGFza2dyb3VwID0gdGFzay0+dGRfdGFza2dyb3VwOworICAgICAgICBpZiAodGFza2dyb3VwKSB7CisgICAgICAgICAga21wX2ludDMyIG9sZCA9IEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQzMigKKyAgICAgICAgICAgICAgJih0YXNrZ3JvdXAtPmNhbmNlbF9yZXF1ZXN0KSwgY2FuY2VsX25vcmVxLCBjbmNsX2tpbmQpOworICAgICAgICAgIGlmIChvbGQgPT0gY2FuY2VsX25vcmVxIHx8IG9sZCA9PSBjbmNsX2tpbmQpIHsKKyAgICAgICAgICAgIC8vIHdlIGRvIG5vdCBoYXZlIGEgY2FuY2VsbGF0aW9uIHJlcXVlc3QgaW4gdGhpcyB0YXNrZ3JvdXAgb3Igd2UgZG8KKyAgICAgICAgICAgIC8vIGhhdmUgb25lIHRoYXQgbWF0Y2hlcyB0aGUgY3VycmVudCByZXF1ZXN0IC0+IGNhbmNlbAorICAgICAgICAgICAgcmV0dXJuIDEgLyogdHJ1ZSAqLzsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gVE9ETzogd2hhdCBuZWVkcyB0byBoYXBwZW4gaGVyZT8KKyAgICAgICAgICAvLyB0aGUgc3BlY2lmaWNhdGlvbiBkaXNhbGxvd3MgY2FuY2VsbGF0aW9uIHcvbyB0YXNrZ3JvdXBzCisgICAgICAgICAgLy8gc28gd2UgbWlnaHQgZG8gYW55dGhpbmcgaGVyZSwgbGV0J3MgYWJvcnQgZm9yIG5vdworICAgICAgICAgIEtNUF9BU1NFUlQoMCAvKiBmYWxzZSAqLyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBLTVBfQVNTRVJUKDAgLyogZmFsc2UgKi8pOworICAgIH0KKyAgfQorCisgIC8vIElDViBPTVBfQ0FOQ0VMTEFUSU9OPWZhbHNlLCBzbyB3ZSBpZ25vcmVkIHRoaXMgY2FuY2VsIHJlcXVlc3QKKyAgS01QX0RFQlVHX0FTU0VSVCghX19rbXBfb21wX2NhbmNlbGxhdGlvbik7CisgIHJldHVybiAwIC8qIGZhbHNlICovOworfQorCisvKiEKK0Bpbmdyb3VwIENBTkNFTExBVElPTgorQHBhcmFtIGxvY19yZWYgbG9jYXRpb24gb2YgdGhlIG9yaWdpbmFsIHRhc2sgZGlyZWN0aXZlCitAcGFyYW0gZ3RpZCBHbG9iYWwgdGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKK0BwYXJhbSBjbmNsX2tpbmQgQ2FuY2VsbGF0aW9uIGtpbmQgKHBhcmFsbGVsLCBmb3IsIHNlY3Rpb25zLCB0YXNrZ3JvdXApCisKK0ByZXR1cm4gcmV0dXJucyB0cnVlIGlmIGEgbWF0Y2hpbmcgY2FuY2VsbGF0aW9uIHJlcXVlc3QgaGFzIGJlZW4gZmxhZ2dlZCBpbiB0aGUKK1JUTCBhbmQgdGhlIGVuY291bnRlcmluZyB0aHJlYWQgaGFzIHRvIGNhbmNlbC4uCisKK0NhbmNlbGxhdGlvbiBwb2ludCBmb3IgdGhlIGVuY291bnRlcmluZyB0aHJlYWQuCisqLwora21wX2ludDMyIF9fa21wY19jYW5jZWxsYXRpb25wb2ludChpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGNuY2xfa2luZCkgeworICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisKKyAgS0NfVFJBQ0UoMTAsCisgICAgICAgICAgICgiX19rbXBjX2NhbmNlbGxhdGlvbnBvaW50OiBUIyVkIHJlcXVlc3QgJWQgT01QX0NBTkNFTExBVElPTj0lZFxuIiwKKyAgICAgICAgICAgIGd0aWQsIGNuY2xfa2luZCwgX19rbXBfb21wX2NhbmNlbGxhdGlvbikpOworCisgIEtNUF9ERUJVR19BU1NFUlQoY25jbF9raW5kICE9IGNhbmNlbF9ub3JlcSk7CisgIEtNUF9ERUJVR19BU1NFUlQoY25jbF9raW5kID09IGNhbmNlbF9wYXJhbGxlbCB8fCBjbmNsX2tpbmQgPT0gY2FuY2VsX2xvb3AgfHwKKyAgICAgICAgICAgICAgICAgICBjbmNsX2tpbmQgPT0gY2FuY2VsX3NlY3Rpb25zIHx8CisgICAgICAgICAgICAgICAgICAgY25jbF9raW5kID09IGNhbmNlbF90YXNrZ3JvdXApOworICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2dldF9ndGlkKCkgPT0gZ3RpZCk7CisKKyAgaWYgKF9fa21wX29tcF9jYW5jZWxsYXRpb24pIHsKKyAgICBzd2l0Y2ggKGNuY2xfa2luZCkgeworICAgIGNhc2UgY2FuY2VsX3BhcmFsbGVsOgorICAgIGNhc2UgY2FuY2VsX2xvb3A6CisgICAgY2FzZSBjYW5jZWxfc2VjdGlvbnM6CisgICAgICAvLyBjYW5jZWxsYXRpb24gcmVxdWVzdHMgZm9yIHBhcmFsbGVsIGFuZCB3b3Jrc2hhcmluZyBjb25zdHJ1Y3RzCisgICAgICAvLyBhcmUgaGFuZGxlZCB0aHJvdWdoIHRoZSB0ZWFtIHN0cnVjdHVyZQorICAgICAgeworICAgICAgICBrbXBfdGVhbV90ICp0aGlzX3RlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3RlYW0pOworICAgICAgICBpZiAodGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QpIHsKKyAgICAgICAgICBpZiAoY25jbF9raW5kID09IHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0KSB7CisgICAgICAgICAgICAvLyB0aGUgcmVxdWVzdCBpbiB0aGUgdGVhbSBzdHJ1Y3R1cmUgbWF0Y2hlcyB0aGUgdHlwZSBvZgorICAgICAgICAgICAgLy8gY2FuY2VsbGF0aW9uIHBvaW50IHNvIHdlIGNhbiBjYW5jZWwKKyAgICAgICAgICAgIHJldHVybiAxIC8qIHRydWUgKi87CisgICAgICAgICAgfQorICAgICAgICAgIEtNUF9BU1NFUlQoMCAvKiBmYWxzZSAqLyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gd2UgZG8gbm90IGhhdmUgYSBjYW5jZWxsYXRpb24gcmVxdWVzdCBwZW5kaW5nLCBzbyB3ZSBqdXN0CisgICAgICAgICAgLy8gaWdub3JlIHRoaXMgY2FuY2VsbGF0aW9uIHBvaW50CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSBjYW5jZWxfdGFza2dyb3VwOgorICAgICAgLy8gY2FuY2VsbGF0aW9uIHJlcXVlc3RzIGZvciBhIHRhc2sgZ3JvdXAKKyAgICAgIC8vIGFyZSBoYW5kbGVkIHRocm91Z2ggdGhlIHRhc2tncm91cCBzdHJ1Y3R1cmUKKyAgICAgIHsKKyAgICAgICAga21wX3Rhc2tkYXRhX3QgKnRhc2s7CisgICAgICAgIGttcF90YXNrZ3JvdXBfdCAqdGFza2dyb3VwOworCisgICAgICAgIHRhc2sgPSB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRhc2spOworCisgICAgICAgIHRhc2tncm91cCA9IHRhc2stPnRkX3Rhc2tncm91cDsKKyAgICAgICAgaWYgKHRhc2tncm91cCkgeworICAgICAgICAgIC8vIHJldHVybiB0aGUgY3VycmVudCBzdGF0dXMgb2YgY2FuY2VsbGF0aW9uIGZvciB0aGUgdGFza2dyb3VwCisgICAgICAgICAgcmV0dXJuICEhdGFza2dyb3VwLT5jYW5jZWxfcmVxdWVzdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBpZiBhIGNhbmNlbGxhdGlvbiBwb2ludCBpcyBlbmNvdW50ZXJlZCBieSBhIHRhc2sgdGhhdCBkb2VzIG5vdAorICAgICAgICAgIC8vIGJlbG9uZyB0byBhIHRhc2tncm91cCwgaXQgaXMgT0sgdG8gaWdub3JlIGl0CisgICAgICAgICAgcmV0dXJuIDAgLyogZmFsc2UgKi87CisgICAgICAgIH0KKyAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgS01QX0FTU0VSVCgwIC8qIGZhbHNlICovKTsKKyAgICB9CisgIH0KKworICAvLyBJQ1YgT01QX0NBTkNFTExBVElPTj1mYWxzZSwgc28gd2UgaWdub3JlIHRoZSBjYW5jZWxsYXRpb24gcG9pbnQKKyAgS01QX0RFQlVHX0FTU0VSVCghX19rbXBfb21wX2NhbmNlbGxhdGlvbik7CisgIHJldHVybiAwIC8qIGZhbHNlICovOworfQorCisvKiEKK0Bpbmdyb3VwIENBTkNFTExBVElPTgorQHBhcmFtIGxvY19yZWYgbG9jYXRpb24gb2YgdGhlIG9yaWdpbmFsIHRhc2sgZGlyZWN0aXZlCitAcGFyYW0gZ3RpZCBHbG9iYWwgdGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKKworQHJldHVybiByZXR1cm5zIHRydWUgaWYgYSBtYXRjaGluZyBjYW5jZWxsYXRpb24gcmVxdWVzdCBoYXMgYmVlbiBmbGFnZ2VkIGluIHRoZQorUlRMIGFuZCB0aGUgZW5jb3VudGVyaW5nIHRocmVhZCBoYXMgdG8gY2FuY2VsLi4KKworQmFycmllciB3aXRoIGNhbmNlbGxhdGlvbiBwb2ludCB0byBzZW5kIHRocmVhZHMgZnJvbSB0aGUgYmFycmllciB0byB0aGUKK2VuZCBvZiB0aGUgcGFyYWxsZWwgcmVnaW9uLiAgTmVlZHMgYSBzcGVjaWFsIGNvZGUgcGF0dGVybiBhcyBkb2N1bWVudGVkCitpbiB0aGUgZGVzaWduIGRvY3VtZW50IGZvciB0aGUgY2FuY2VsbGF0aW9uIGZlYXR1cmUuCisqLwora21wX2ludDMyIF9fa21wY19jYW5jZWxfYmFycmllcihpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkKSB7CisgIGludCByZXQgPSAwIC8qIGZhbHNlICovOworICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgIGttcF90ZWFtX3QgKnRoaXNfdGVhbSA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworCisgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfZ2V0X2d0aWQoKSA9PSBndGlkKTsKKworICAvLyBjYWxsIGludG8gdGhlIHN0YW5kYXJkIGJhcnJpZXIKKyAgX19rbXBjX2JhcnJpZXIobG9jLCBndGlkKTsKKworICAvLyBpZiBjYW5jZWxsYXRpb24gaXMgYWN0aXZlLCBjaGVjayBjYW5jZWxsYXRpb24gZmxhZworICBpZiAoX19rbXBfb21wX2NhbmNlbGxhdGlvbikgeworICAgIC8vIGRlcGVuZGluZyBvbiB3aGljaCBjb25zdHJ1Y3QgdG8gY2FuY2VsLCBjaGVjayB0aGUgZmxhZyBhbmQKKyAgICAvLyByZXNldCB0aGUgZmxhZworICAgIHN3aXRjaCAodGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QpIHsKKyAgICBjYXNlIGNhbmNlbF9wYXJhbGxlbDoKKyAgICAgIHJldCA9IDE7CisgICAgICAvLyBlbnN1cmUgdGhhdCB0aHJlYWRzIGhhdmUgY2hlY2tlZCB0aGUgZmxhZywgd2hlbgorICAgICAgLy8gbGVhdmluZyB0aGUgYWJvdmUgYmFycmllcgorICAgICAgX19rbXBjX2JhcnJpZXIobG9jLCBndGlkKTsKKyAgICAgIHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0ID0gY2FuY2VsX25vcmVxOworICAgICAgLy8gdGhlIG5leHQgYmFycmllciBpcyB0aGUgZm9yay9qb2luIGJhcnJpZXIsIHdoaWNoCisgICAgICAvLyBzeW5jaHJvbml6ZXMgdGhlIHRocmVhZHMgbGVhdmluZyBoZXJlCisgICAgICBicmVhazsKKyAgICBjYXNlIGNhbmNlbF9sb29wOgorICAgIGNhc2UgY2FuY2VsX3NlY3Rpb25zOgorICAgICAgcmV0ID0gMTsKKyAgICAgIC8vIGVuc3VyZSB0aGF0IHRocmVhZHMgaGF2ZSBjaGVja2VkIHRoZSBmbGFnLCB3aGVuCisgICAgICAvLyBsZWF2aW5nIHRoZSBhYm92ZSBiYXJyaWVyCisgICAgICBfX2ttcGNfYmFycmllcihsb2MsIGd0aWQpOworICAgICAgdGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QgPSBjYW5jZWxfbm9yZXE7CisgICAgICAvLyBzeW5jaHJvbml6ZSB0aGUgdGhyZWFkcyBhZ2FpbiB0byBtYWtlIHN1cmUgd2UgZG8gbm90IGhhdmUgYW55IHJ1bi1hd2F5CisgICAgICAvLyB0aHJlYWRzIHRoYXQgY2F1c2UgYSByYWNlIG9uIHRoZSBjYW5jZWxsYXRpb24gZmxhZworICAgICAgX19rbXBjX2JhcnJpZXIobG9jLCBndGlkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgY2FuY2VsX3Rhc2tncm91cDoKKyAgICAgIC8vIHRoaXMgY2FzZSBzaG91bGQgbm90IG9jY3VyCisgICAgICBLTVBfQVNTRVJUKDAgLyogZmFsc2UgKi8pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBjYW5jZWxfbm9yZXE6CisgICAgICAvLyBkbyBub3RoaW5nCisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgS01QX0FTU0VSVCgwIC8qIGZhbHNlICovKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmV0OworfQorCisvKiEKK0Bpbmdyb3VwIENBTkNFTExBVElPTgorQHBhcmFtIGxvY19yZWYgbG9jYXRpb24gb2YgdGhlIG9yaWdpbmFsIHRhc2sgZGlyZWN0aXZlCitAcGFyYW0gZ3RpZCBHbG9iYWwgdGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKKworQHJldHVybiByZXR1cm5zIHRydWUgaWYgYSBtYXRjaGluZyBjYW5jZWxsYXRpb24gcmVxdWVzdCBoYXMgYmVlbiBmbGFnZ2VkIGluIHRoZQorUlRMIGFuZCB0aGUgZW5jb3VudGVyaW5nIHRocmVhZCBoYXMgdG8gY2FuY2VsLi4KKworUXVlcnkgZnVuY3Rpb24gdG8gcXVlcnkgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGNhbmNlbGxhdGlvbiByZXF1ZXN0cy4KK0NhbiBiZSB1c2VkIHRvIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIHBhdHRlcm46CisKK2lmIChrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMoa21wX2NhbmNlbF9wYXJhbGxlbCkpIHsKKyAgICBwZXJmb3JtX2NsZWFudXAoKTsKKyAgICAjcHJhZ21hIG9tcCBjYW5jZWxsYXRpb24gcG9pbnQgcGFyYWxsZWwKK30KKyovCitpbnQgX19rbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMoaW50IGNhbmNlbF9raW5kKSB7CisgIGlmIChfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKSB7CisgICAga21wX2luZm9fdCAqdGhpc190aHIgPSBfX2ttcF9lbnRyeV90aHJlYWQoKTsKKworICAgIHN3aXRjaCAoY2FuY2VsX2tpbmQpIHsKKyAgICBjYXNlIGNhbmNlbF9wYXJhbGxlbDoKKyAgICBjYXNlIGNhbmNlbF9sb29wOgorICAgIGNhc2UgY2FuY2VsX3NlY3Rpb25zOiB7CisgICAgICBrbXBfdGVhbV90ICp0aGlzX3RlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgICAgIHJldHVybiB0aGlzX3RlYW0tPnQudF9jYW5jZWxfcmVxdWVzdCA9PSBjYW5jZWxfa2luZDsKKyAgICB9CisgICAgY2FzZSBjYW5jZWxfdGFza2dyb3VwOiB7CisgICAgICBrbXBfdGFza2RhdGFfdCAqdGFzazsKKyAgICAgIGttcF90YXNrZ3JvdXBfdCAqdGFza2dyb3VwOworICAgICAgdGFzayA9IHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2s7CisgICAgICB0YXNrZ3JvdXAgPSB0YXNrLT50ZF90YXNrZ3JvdXA7CisgICAgICByZXR1cm4gdGFza2dyb3VwICYmIHRhc2tncm91cC0+Y2FuY2VsX3JlcXVlc3Q7CisgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiAwIC8qIGZhbHNlICovOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9jb25maWcuaC5jbWFrZSBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9jb25maWcuaC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2Y4Y2ZkCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2NvbmZpZy5oLmNtYWtlCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICoga21wX2NvbmZpZy5oIC0tIEZlYXR1cmUgbWFjcm9zCisgKi8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjaWZuZGVmIEtNUF9DT05GSUdfSAorI2RlZmluZSBLTVBfQ09ORklHX0gKKworI2luY2x1ZGUgImttcF9wbGF0Zm9ybS5oIgorCisvLyBjbWFrZWRlZmluZTAxIE1BQ1JPIHdpbGwgZGVmaW5lIE1BQ1JPIGFzIGVpdGhlciAwIG9yIDEKKy8vIGNtYWtlZGVmaW5lIE1BQ1JPIDEgd2lsbCBkZWZpbmUgTUFDUk8gYXMgMSBvciBsZWF2ZSB1bmRlZmluZWQKKyNjbWFrZWRlZmluZTAxIERFQlVHX0JVSUxECisjY21ha2VkZWZpbmUwMSBSRUxXSVRIREVCSU5GT19CVUlMRAorI2NtYWtlZGVmaW5lMDEgTElCT01QX1VTRV9JVFRfTk9USUZZCisjZGVmaW5lIFVTRV9JVFRfTk9USUZZIExJQk9NUF9VU0VfSVRUX05PVElGWQorI2lmICEgTElCT01QX1VTRV9JVFRfTk9USUZZCisjIGRlZmluZSBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjZW5kaWYKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9VU0VfVkVSU0lPTl9TWU1CT0xTCisjaWYgTElCT01QX1VTRV9WRVJTSU9OX1NZTUJPTFMKKyMgZGVmaW5lIEtNUF9VU0VfVkVSU0lPTl9TWU1CT0xTCisjZW5kaWYKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9IQVZFX1dFQUtfQVRUUklCVVRFCisjZGVmaW5lIEtNUF9IQVZFX1dFQUtfQVRUUklCVVRFIExJQk9NUF9IQVZFX1dFQUtfQVRUUklCVVRFCisjY21ha2VkZWZpbmUwMSBMSUJPTVBfSEFWRV9QU0FQSQorI2RlZmluZSBLTVBfSEFWRV9QU0FQSSBMSUJPTVBfSEFWRV9QU0FQSQorI2NtYWtlZGVmaW5lMDEgTElCT01QX1NUQVRTCisjZGVmaW5lIEtNUF9TVEFUU19FTkFCTEVEIExJQk9NUF9TVEFUUworI2NtYWtlZGVmaW5lMDEgTElCT01QX0hBVkVfWDg2SU5UUklOX0gKKyNkZWZpbmUgS01QX0hBVkVfWDg2SU5UUklOX0ggTElCT01QX0hBVkVfWDg2SU5UUklOX0gKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9IQVZFX19fQlVJTFRJTl9SRUFEQ1lDTEVDT1VOVEVSCisjZGVmaW5lIEtNUF9IQVZFX19fQlVJTFRJTl9SRUFEQ1lDTEVDT1VOVEVSIExJQk9NUF9IQVZFX19fQlVJTFRJTl9SRUFEQ1lDTEVDT1VOVEVSCisjY21ha2VkZWZpbmUwMSBMSUJPTVBfSEFWRV9fX1JEVFNDCisjZGVmaW5lIEtNUF9IQVZFX19fUkRUU0MgTElCT01QX0hBVkVfX19SRFRTQworI2NtYWtlZGVmaW5lMDEgTElCT01QX1VTRV9ERUJVR0dFUgorI2RlZmluZSBVU0VfREVCVUdHRVIgTElCT01QX1VTRV9ERUJVR0dFUgorI2NtYWtlZGVmaW5lMDEgTElCT01QX09NUFRfREVCVUcKKyNkZWZpbmUgT01QVF9ERUJVRyBMSUJPTVBfT01QVF9ERUJVRworI2NtYWtlZGVmaW5lMDEgTElCT01QX09NUFRfU1VQUE9SVAorI2RlZmluZSBPTVBUX1NVUFBPUlQgTElCT01QX09NUFRfU1VQUE9SVAorI2NtYWtlZGVmaW5lMDEgTElCT01QX09NUFRfQkxBTUUKKyNkZWZpbmUgT01QVF9CTEFNRSBMSUJPTVBfT01QVF9CTEFNRQorI2NtYWtlZGVmaW5lMDEgTElCT01QX09NUFRfVFJBQ0UKKyNkZWZpbmUgT01QVF9UUkFDRSBMSUJPTVBfT01QVF9UUkFDRQorI2NtYWtlZGVmaW5lMDEgTElCT01QX1VTRV9BREFQVElWRV9MT0NLUworI2RlZmluZSBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTIExJQk9NUF9VU0VfQURBUFRJVkVfTE9DS1MKKyNkZWZpbmUgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTIDAKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9VU0VfSU5URVJOT0RFX0FMSUdOTUVOVAorI2RlZmluZSBLTVBfVVNFX0lOVEVSTk9ERV9BTElHTk1FTlQgTElCT01QX1VTRV9JTlRFUk5PREVfQUxJR05NRU5UCisjY21ha2VkZWZpbmUwMSBMSUJPTVBfRU5BQkxFX0FTU0VSVElPTlMKKyNkZWZpbmUgS01QX1VTRV9BU1NFUlQgTElCT01QX0VOQUJMRV9BU1NFUlRJT05TCisjY21ha2VkZWZpbmUwMSBTVFVCU19MSUJSQVJZCisjY21ha2VkZWZpbmUwMSBMSUJPTVBfVVNFX0hXTE9DCisjZGVmaW5lIEtNUF9VU0VfSFdMT0MgTElCT01QX1VTRV9IV0xPQworI2RlZmluZSBLTVBfQVJDSF9TVFIgIkBMSUJPTVBfTEVHQUxfQVJDSEAiCisjZGVmaW5lIEtNUF9MSUJSQVJZX0ZJTEUgIkBMSUJPTVBfTElCX0ZJTEVAIgorI2RlZmluZSBLTVBfVkVSU0lPTl9NQUpPUiBATElCT01QX1ZFUlNJT05fTUFKT1JACisjZGVmaW5lIEtNUF9WRVJTSU9OX01JTk9SIEBMSUJPTVBfVkVSU0lPTl9NSU5PUkAKKyNkZWZpbmUgTElCT01QX09NUF9WRVJTSU9OIEBMSUJPTVBfT01QX1ZFUlNJT05ACisjZGVmaW5lIE9NUF81MF9FTkFCTEVEIChMSUJPTVBfT01QX1ZFUlNJT04gPj0gNTApCisjZGVmaW5lIE9NUF80NV9FTkFCTEVEIChMSUJPTVBfT01QX1ZFUlNJT04gPj0gNDUpCisjZGVmaW5lIE9NUF80MF9FTkFCTEVEIChMSUJPTVBfT01QX1ZFUlNJT04gPj0gNDApCisjZGVmaW5lIE9NUF8zMF9FTkFCTEVEIChMSUJPTVBfT01QX1ZFUlNJT04gPj0gMzApCisjY21ha2VkZWZpbmUwMSBMSUJPTVBfVFNBTl9TVVBQT1JUCisjaWYgTElCT01QX1RTQU5fU1VQUE9SVAorI2RlZmluZSBUU0FOX1NVUFBPUlQKKyNlbmRpZgorCisvLyBDb25maWd1cmVkIGNhY2hlIGxpbmUgYmFzZWQgb24gYXJjaGl0ZWN0dXJlCisjaWYgS01QX0FSQ0hfUFBDNjQKKyMgZGVmaW5lIENBQ0hFX0xJTkUgMTI4CisjZWxzZQorIyBkZWZpbmUgQ0FDSEVfTElORSA2NAorI2VuZGlmCisKKyNpZiAhIEtNUF8zMl9CSVRfQVJDSAorIyBkZWZpbmUgQlVJTERfSTggMQorI2VuZGlmCisKKyNkZWZpbmUgS01QX0RZTkFNSUNfTElCIDEKKyNkZWZpbmUgS01QX05FU1RFRF9IT1RfVEVBTVMgMQorI2RlZmluZSBLTVBfQURKVVNUX0JMT0NLVElNRSAxCisjZGVmaW5lIEJVSUxEX1BBUkFMTEVMX09SREVSRUQgMQorI2RlZmluZSBLTVBfQVNNX0lOVFJJTlMgMQorI2RlZmluZSBVU0VfSVRUX0JVSUxEIExJQk9NUF9VU0VfSVRUX05PVElGWQorI2RlZmluZSBJTlRFTF9JVFROT1RJRllfUFJFRklYIF9fa21wX2l0dF8KKyNpZiAhIEtNUF9NSUMKKyMgZGVmaW5lIFVTRV9MT0FEX0JBTEFOQ0UgMQorI2VuZGlmCisjaWYgISAoS01QX09TX1dJTkRPV1MgfHwgS01QX09TX0RBUldJTikKKyMgZGVmaW5lIEtNUF9UREFUQV9HVElEIDEKKyNlbmRpZgorI2lmIFNUVUJTX0xJQlJBUlkKKyMgZGVmaW5lIEtNUF9TVFVCIDEKKyNlbmRpZgorI2lmIERFQlVHX0JVSUxEIHx8IFJFTFdJVEhERUJJTkZPX0JVSUxECisjIGRlZmluZSBLTVBfREVCVUcgMQorI2VuZGlmCisKKyNpZiBLTVBfT1NfV0lORE9XUworIyBkZWZpbmUgS01QX1dJTl9DREVDTAorI2Vsc2UKKyMgZGVmaW5lIEJVSUxEX1RWCisjIGRlZmluZSBLTVBfR09NUF9DT01QQVQKKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX0NPTkZJR19ICmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfY3N1cHBvcnQuY3BwIGIvZmluYWwvcnVudGltZS9zcmMva21wX2NzdXBwb3J0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmU0ZmY1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2NzdXBwb3J0LmNwcApAQCAtMCwwICsxLDMzMTQgQEAKKy8qCisgKiBrbXBfY3N1cHBvcnQuY3BwIC0tIGtmcm9udCBsaW5rYWdlIHN1cHBvcnQgZm9yIE9wZW5NUC4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgIm9tcC5oIiAvKiBleHRlcm4gIkMiIGRlY2xhcmF0aW9ucyBvZiB1c2VyLXZpc2libGUgcm91dGluZXMgKi8KKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfZXJyb3IuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfbG9jay5oIgorI2luY2x1ZGUgImttcF9zdGF0cy5oIgorCisjaWYgT01QVF9TVVBQT1JUCisjaW5jbHVkZSAib21wdC1pbnRlcm5hbC5oIgorI2luY2x1ZGUgIm9tcHQtc3BlY2lmaWMuaCIKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9NRVNTQUdFIDUxMgorCisvLyBmbGFncyB3aWxsIGJlIHVzZWQgaW4gZnV0dXJlLCBlLmcuIHRvIGltcGxlbWVudCBvcGVubXBfc3RyaWN0IGxpYnJhcnkKKy8vIHJlc3RyaWN0aW9ucworCisvKiEKKyAqIEBpbmdyb3VwIFNUQVJUVVBfU0hVVERPV04KKyAqIEBwYXJhbSBsb2MgICBpbiAgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorICogQHBhcmFtIGZsYWdzIGluICAgZm9yIGZ1dHVyZSB1c2UgKGN1cnJlbnRseSBpZ25vcmVkKQorICoKKyAqIEluaXRpYWxpemUgdGhlIHJ1bnRpbWUgbGlicmFyeS4gVGhpcyBjYWxsIGlzIG9wdGlvbmFsOyBpZiBpdCBpcyBub3QgbWFkZSB0aGVuCisgKiBpdCB3aWxsIGJlIGltcGxpY2l0bHkgY2FsbGVkIGJ5IGF0dGVtcHRzIHRvIHVzZSBvdGhlciBsaWJyYXJ5IGZ1bmN0aW9ucy4KKyAqLwordm9pZCBfX2ttcGNfYmVnaW4oaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZmxhZ3MpIHsKKyAgLy8gQnkgZGVmYXVsdCBfX2ttcGNfYmVnaW4oKSBpcyBuby1vcC4KKyAgY2hhciAqZW52OworICBpZiAoKGVudiA9IGdldGVudigiS01QX0lOSVRJQUxfVEhSRUFEX0JJTkQiKSkgIT0gTlVMTCAmJgorICAgICAgX19rbXBfc3RyX21hdGNoX3RydWUoZW52KSkgeworICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgS0NfVFJBQ0UoMTAsICgiX19rbXBjX2JlZ2luOiBtaWRkbGUgaW5pdGlhbGl6YXRpb24gY2FsbGVkXG4iKSk7CisgIH0gZWxzZSBpZiAoX19rbXBfaWdub3JlX21wcGJlZygpID09IEZBTFNFKSB7CisgICAgLy8gQnkgZGVmYXVsdCBfX2ttcF9pZ25vcmVfbXBwYmVnKCkgcmV0dXJucyBUUlVFLgorICAgIF9fa21wX2ludGVybmFsX2JlZ2luKCk7CisgICAgS0NfVFJBQ0UoMTAsICgiX19rbXBjX2JlZ2luOiBjYWxsZWRcbiIpKTsKKyAgfQorfQorCisvKiEKKyAqIEBpbmdyb3VwIFNUQVJUVVBfU0hVVERPV04KKyAqIEBwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCisgKgorICogU2h1dGRvd24gdGhlIHJ1bnRpbWUgbGlicmFyeS4gVGhpcyBpcyBhbHNvIG9wdGlvbmFsLCBhbmQgZXZlbiBpZiBjYWxsZWQgd2lsbAorICogbm90IGRvIGFueXRoaW5nIHVubGVzcyB0aGUgYEtNUF9JR05PUkVfTVBQRU5EYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQgdG8KKyAqIHplcm8uCisgKi8KK3ZvaWQgX19rbXBjX2VuZChpZGVudF90ICpsb2MpIHsKKyAgLy8gQnkgZGVmYXVsdCwgX19rbXBfaWdub3JlX21wcGVuZCgpIHJldHVybnMgVFJVRSB3aGljaCBtYWtlcyBfX2ttcGNfZW5kKCkKKyAgLy8gY2FsbCBuby1vcC4gSG93ZXZlciwgdGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIEtNUF9JR05PUkVfTVBQRU5ECisgIC8vIGVudmlyb25tZW50IHZhcmlhYmxlLiBJZiBLTVBfSUdOT1JFX01QUEVORCBpcyAwLCBfX2ttcF9pZ25vcmVfbXBwZW5kKCkKKyAgLy8gcmV0dXJucyBGQUxTRSBhbmQgX19rbXBjX2VuZCgpIHdpbGwgdW5yZWdpc3RlciB0aGlzIHJvb3QgKGl0IGNhbiBjYXVzZQorICAvLyBsaWJyYXJ5IHNodXQgZG93bikuCisgIGlmIChfX2ttcF9pZ25vcmVfbXBwZW5kKCkgPT0gRkFMU0UpIHsKKyAgICBLQ19UUkFDRSgxMCwgKCJfX2ttcGNfZW5kOiBjYWxsZWRcbiIpKTsKKyAgICBLQV9UUkFDRSgzMCwgKCJfX2ttcGNfZW5kXG4iKSk7CisKKyAgICBfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkKC0xKTsKKyAgfQorfQorCisvKiEKK0Bpbmdyb3VwIFRIUkVBRF9TVEFURVMKK0BwYXJhbSBsb2MgU291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHJldHVybiBUaGUgZ2xvYmFsIHRocmVhZCBpbmRleCBvZiB0aGUgYWN0aXZlIHRocmVhZC4KKworVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGluIGFueSBjb250ZXh0LgorCitJZiB0aGUgcnVudGltZSBoYXMgb255IGJlZW4gZW50ZXJlZCBhdCB0aGUgb3V0ZXJtb3N0IGxldmVsIGZyb20gYQorc2luZ2xlIChuZWNlc3NhcmlseSBub24tT3Blbk1QPHN1cD4qPC9zdXA+KSB0aHJlYWQsIHRoZW4gdGhlIHRocmVhZCBudW1iZXIgaXMKK3RoYXQgd2hpY2ggd291bGQgYmUgcmV0dXJuZWQgYnkgb21wX2dldF90aHJlYWRfbnVtKCkgaW4gdGhlIG91dGVybW9zdAorYWN0aXZlIHBhcmFsbGVsIGNvbnN0cnVjdC4gKE9yIHplcm8gaWYgdGhlcmUgaXMgbm8gYWN0aXZlIHBhcmFsbGVsCitjb25zdHJ1Y3QsIHNpbmNlIHRoZSBtYXN0ZXIgdGhyZWFkIGlzIG5lY2Vzc2FyaWx5IHRocmVhZCB6ZXJvKS4KKworSWYgbXVsdGlwbGUgbm9uLU9wZW5NUCB0aHJlYWRzIGFsbCBlbnRlciBhbiBPcGVuTVAgY29uc3RydWN0IHRoZW4gdGhpcword2lsbCBiZSBhIHVuaXF1ZSB0aHJlYWQgaWRlbnRpZmllciBhbW9uZyBhbGwgdGhlIHRocmVhZHMgY3JlYXRlZCBieQordGhlIE9wZW5NUCBydW50aW1lIChidXQgdGhlIHZhbHVlIGNhbm5vdGUgYmUgZGVmaW5lZCBpbiB0ZXJtcyBvZgorT3Blbk1QIHRocmVhZCBpZHMgcmV0dXJuZWQgYnkgb21wX2dldF90aHJlYWRfbnVtKCkpLgorKi8KK2ttcF9pbnQzMiBfX2ttcGNfZ2xvYmFsX3RocmVhZF9udW0oaWRlbnRfdCAqbG9jKSB7CisgIGttcF9pbnQzMiBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworCisgIEtDX1RSQUNFKDEwLCAoIl9fa21wY19nbG9iYWxfdGhyZWFkX251bTogVCMlZFxuIiwgZ3RpZCkpOworCisgIHJldHVybiBndGlkOworfQorCisvKiEKK0Bpbmdyb3VwIFRIUkVBRF9TVEFURVMKK0BwYXJhbSBsb2MgU291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHJldHVybiBUaGUgbnVtYmVyIG9mIHRocmVhZHMgdW5kZXIgY29udHJvbCBvZiB0aGUgT3Blbk1QPHN1cD4qPC9zdXA+IHJ1bnRpbWUKKworVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGluIGFueSBjb250ZXh0LgorSXQgcmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHRocmVhZHMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIE9wZW5NUCBydW50aW1lLgorVGhhdCBpcyBub3QgYSBudW1iZXIgdGhhdCBjYW4gYmUgZGV0ZXJtaW5lZCBieSBhbnkgT3Blbk1QIHN0YW5kYXJkIGNhbGxzLCBzaW5jZQordGhlIGxpYnJhcnkgbWF5IGJlIGNhbGxlZCBmcm9tIG1vcmUgdGhhbiBvbmUgbm9uLU9wZW5NUCB0aHJlYWQsIGFuZCB0aGlzCityZWZsZWN0cyB0aGUgdG90YWwgb3ZlciBhbGwgc3VjaCBjYWxscy4gU2ltaWxhcmx5IHRoZSBydW50aW1lIG1haW50YWlucwordW5kZXJseWluZyB0aHJlYWRzIGV2ZW4gd2hlbiB0aGV5IGFyZSBub3QgYWN0aXZlIChzaW5jZSB0aGUgY29zdCBvZiBjcmVhdGluZworYW5kIGRlc3Ryb3lpbmcgT1MgdGhyZWFkcyBpcyBoaWdoKSwgdGhpcyBjYWxsIGNvdW50cyBhbGwgc3VjaCB0aHJlYWRzIGV2ZW4gaWYKK3RoZXkgYXJlIG5vdCB3YWl0aW5nIGZvciB3b3JrLgorKi8KK2ttcF9pbnQzMiBfX2ttcGNfZ2xvYmFsX251bV90aHJlYWRzKGlkZW50X3QgKmxvYykgeworICBLQ19UUkFDRSgxMCwKKyAgICAgICAgICAgKCJfX2ttcGNfZ2xvYmFsX251bV90aHJlYWRzOiBudW1fdGhyZWFkcyA9ICVkXG4iLCBfX2ttcF9hbGxfbnRoKSk7CisKKyAgcmV0dXJuIFRDUl80KF9fa21wX2FsbF9udGgpOworfQorCisvKiEKK0Bpbmdyb3VwIFRIUkVBRF9TVEFURVMKK0BwYXJhbSBsb2MgU291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHJldHVybiBUaGUgdGhyZWFkIG51bWJlciBvZiB0aGUgY2FsbGluZyB0aHJlYWQgaW4gdGhlIGlubmVybW9zdCBhY3RpdmUgcGFyYWxsZWwKK2NvbnN0cnVjdC4KKyovCitrbXBfaW50MzIgX19rbXBjX2JvdW5kX3RocmVhZF9udW0oaWRlbnRfdCAqbG9jKSB7CisgIEtDX1RSQUNFKDEwLCAoIl9fa21wY19ib3VuZF90aHJlYWRfbnVtOiBjYWxsZWRcbiIpKTsKKyAgcmV0dXJuIF9fa21wX3RpZF9mcm9tX2d0aWQoX19rbXBfZW50cnlfZ3RpZCgpKTsKK30KKworLyohCitAaW5ncm91cCBUSFJFQURfU1RBVEVTCitAcGFyYW0gbG9jIFNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KK0ByZXR1cm4gVGhlIG51bWJlciBvZiB0aHJlYWRzIGluIHRoZSBpbm5lcm1vc3QgYWN0aXZlIHBhcmFsbGVsIGNvbnN0cnVjdC4KKyovCitrbXBfaW50MzIgX19rbXBjX2JvdW5kX251bV90aHJlYWRzKGlkZW50X3QgKmxvYykgeworICBLQ19UUkFDRSgxMCwgKCJfX2ttcGNfYm91bmRfbnVtX3RocmVhZHM6IGNhbGxlZFxuIikpOworCisgIHJldHVybiBfX2ttcF9lbnRyeV90aHJlYWQoKS0+dGgudGhfdGVhbS0+dC50X25wcm9jOworfQorCisvKiEKKyAqIEBpbmdyb3VwIERFUFJFQ0FURUQKKyAqIEBwYXJhbSBsb2MgbG9jYXRpb24gZGVzY3JpcHRpb24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG5lZWQgbm90IGJlIGNhbGxlZC4gSXQgYWx3YXlzIHJldHVybnMgVFJVRS4KKyAqLwora21wX2ludDMyIF9fa21wY19va190b19mb3JrKGlkZW50X3QgKmxvYykgeworI2lmbmRlZiBLTVBfREVCVUcKKworICByZXR1cm4gVFJVRTsKKworI2Vsc2UKKworICBjb25zdCBjaGFyICpzZW1pMjsKKyAgY29uc3QgY2hhciAqc2VtaTM7CisgIGludCBsaW5lX25vOworCisgIGlmIChfX2ttcF9wYXJfcmFuZ2UgPT0gMCkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIHNlbWkyID0gbG9jLT5wc291cmNlOworICBpZiAoc2VtaTIgPT0gTlVMTCkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIHNlbWkyID0gc3RyY2hyKHNlbWkyLCAnOycpOworICBpZiAoc2VtaTIgPT0gTlVMTCkgeworICAgIHJldHVybiBUUlVFOworICB9CisgIHNlbWkyID0gc3RyY2hyKHNlbWkyICsgMSwgJzsnKTsKKyAgaWYgKHNlbWkyID09IE5VTEwpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoX19rbXBfcGFyX3JhbmdlX2ZpbGVuYW1lWzBdKSB7CisgICAgY29uc3QgY2hhciAqbmFtZSA9IHNlbWkyIC0gMTsKKyAgICB3aGlsZSAoKG5hbWUgPiBsb2MtPnBzb3VyY2UpICYmICgqbmFtZSAhPSAnLycpICYmICgqbmFtZSAhPSAnOycpKSB7CisgICAgICBuYW1lLS07CisgICAgfQorICAgIGlmICgoKm5hbWUgPT0gJy8nKSB8fCAoKm5hbWUgPT0gJzsnKSkgeworICAgICAgbmFtZSsrOworICAgIH0KKyAgICBpZiAoc3RybmNtcChfX2ttcF9wYXJfcmFuZ2VfZmlsZW5hbWUsIG5hbWUsIHNlbWkyIC0gbmFtZSkpIHsKKyAgICAgIHJldHVybiBfX2ttcF9wYXJfcmFuZ2UgPCAwOworICAgIH0KKyAgfQorICBzZW1pMyA9IHN0cmNocihzZW1pMiArIDEsICc7Jyk7CisgIGlmIChfX2ttcF9wYXJfcmFuZ2Vfcm91dGluZVswXSkgeworICAgIGlmICgoc2VtaTMgIT0gTlVMTCkgJiYgKHNlbWkzID4gc2VtaTIpICYmCisgICAgICAgIChzdHJuY21wKF9fa21wX3Bhcl9yYW5nZV9yb3V0aW5lLCBzZW1pMiArIDEsIHNlbWkzIC0gc2VtaTIgLSAxKSkpIHsKKyAgICAgIHJldHVybiBfX2ttcF9wYXJfcmFuZ2UgPCAwOworICAgIH0KKyAgfQorICBpZiAoS01QX1NTQ0FORihzZW1pMyArIDEsICIlZCIsICZsaW5lX25vKSA9PSAxKSB7CisgICAgaWYgKChsaW5lX25vID49IF9fa21wX3Bhcl9yYW5nZV9sYikgJiYgKGxpbmVfbm8gPD0gX19rbXBfcGFyX3JhbmdlX3ViKSkgeworICAgICAgcmV0dXJuIF9fa21wX3Bhcl9yYW5nZSA+IDA7CisgICAgfQorICAgIHJldHVybiBfX2ttcF9wYXJfcmFuZ2UgPCAwOworICB9CisgIHJldHVybiBUUlVFOworCisjZW5kaWYgLyogS01QX0RFQlVHICovCit9CisKKy8qIQorQGluZ3JvdXAgVEhSRUFEX1NUQVRFUworQHBhcmFtIGxvYyBTb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitAcmV0dXJuIDEgaWYgdGhpcyB0aHJlYWQgaXMgZXhlY3V0aW5nIGluc2lkZSBhbiBhY3RpdmUgcGFyYWxsZWwgcmVnaW9uLCB6ZXJvIGlmCitub3QuCisqLwora21wX2ludDMyIF9fa21wY19pbl9wYXJhbGxlbChpZGVudF90ICpsb2MpIHsKKyAgcmV0dXJuIF9fa21wX2VudHJ5X3RocmVhZCgpLT50aC50aF9yb290LT5yLnJfYWN0aXZlOworfQorCisvKiEKK0Bpbmdyb3VwIFBBUkFMTEVMCitAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgZ2xvYmFsIHRocmVhZCBudW1iZXIKK0BwYXJhbSBudW1fdGhyZWFkcyBudW1iZXIgb2YgdGhyZWFkcyByZXF1ZXN0ZWQgZm9yIHRoaXMgcGFyYWxsZWwgY29uc3RydWN0CisKK1NldCB0aGUgbnVtYmVyIG9mIHRocmVhZHMgdG8gYmUgdXNlZCBieSB0aGUgbmV4dCBmb3JrIHNwYXduZWQgYnkgdGhpcyB0aHJlYWQuCitUaGlzIGNhbGwgaXMgb25seSByZXF1aXJlZCBpZiB0aGUgcGFyYWxsZWwgY29uc3RydWN0IGhhcyBhIGBudW1fdGhyZWFkc2AgY2xhdXNlLgorKi8KK3ZvaWQgX19rbXBjX3B1c2hfbnVtX3RocmVhZHMoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIG51bV90aHJlYWRzKSB7CisgIEtBX1RSQUNFKDIwLCAoIl9fa21wY19wdXNoX251bV90aHJlYWRzOiBlbnRlciBUIyVkIG51bV90aHJlYWRzPSVkXG4iLAorICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsIG51bV90aHJlYWRzKSk7CisKKyAgX19rbXBfcHVzaF9udW1fdGhyZWFkcyhsb2MsIGdsb2JhbF90aWQsIG51bV90aHJlYWRzKTsKK30KKwordm9pZCBfX2ttcGNfcG9wX251bV90aHJlYWRzKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQpIHsKKyAgS0FfVFJBQ0UoMjAsICgiX19rbXBjX3BvcF9udW1fdGhyZWFkczogZW50ZXJcbiIpKTsKKworICAvKiB0aGUgbnVtX3RocmVhZHMgYXJlIGF1dG9tYXRpY2FsbHkgcG9wcGVkICovCit9CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCit2b2lkIF9fa21wY19wdXNoX3Byb2NfYmluZChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIHByb2NfYmluZCkgeworICBLQV9UUkFDRSgyMCwgKCJfX2ttcGNfcHVzaF9wcm9jX2JpbmQ6IGVudGVyIFQjJWQgcHJvY19iaW5kPSVkXG4iLCBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgIHByb2NfYmluZCkpOworCisgIF9fa21wX3B1c2hfcHJvY19iaW5kKGxvYywgZ2xvYmFsX3RpZCwgKGttcF9wcm9jX2JpbmRfdClwcm9jX2JpbmQpOworfQorCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworLyohCitAaW5ncm91cCBQQVJBTExFTAorQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gYXJnYyAgdG90YWwgbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiB0aGUgZWxsaXBzaXMKK0BwYXJhbSBtaWNyb3Rhc2sgIHBvaW50ZXIgdG8gY2FsbGJhY2sgcm91dGluZSBjb25zaXN0aW5nIG9mIG91dGxpbmVkIHBhcmFsbGVsCitjb25zdHJ1Y3QKK0BwYXJhbSAuLi4gIHBvaW50ZXJzIHRvIHNoYXJlZCB2YXJpYWJsZXMgdGhhdCBhcmVuJ3QgZ2xvYmFsCisKK0RvIHRoZSBhY3R1YWwgZm9yayBhbmQgY2FsbCB0aGUgbWljcm90YXNrIGluIHRoZSByZWxldmFudCBudW1iZXIgb2YgdGhyZWFkcy4KKyovCit2b2lkIF9fa21wY19mb3JrX2NhbGwoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgYXJnYywga21wY19taWNybyBtaWNyb3Rhc2ssIC4uLikgeworICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKworI2lmIChLTVBfU1RBVFNfRU5BQkxFRCkKKyAgaW50IGluUGFyYWxsZWwgPSBfX2ttcGNfaW5fcGFyYWxsZWwobG9jKTsKKyAgaWYgKGluUGFyYWxsZWwpIHsKKyAgICBLTVBfQ09VTlRfQkxPQ0soT01QX05FU1RFRF9QQVJBTExFTCk7CisgIH0gZWxzZSB7CisgICAgS01QX0NPVU5UX0JMT0NLKE9NUF9QQVJBTExFTCk7CisgIH0KKyNlbmRpZgorCisgIC8vIG1heWJlIHRvIHNhdmUgdGhyX3N0YXRlIGlzIGVub3VnaCBoZXJlCisgIHsKKyAgICB2YV9saXN0IGFwOworICAgIHZhX3N0YXJ0KGFwLCBtaWNyb3Rhc2spOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgb21wdF9mcmFtZV90ICpvbXB0X2ZyYW1lOworICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgIGttcF9pbmZvX3QgKm1hc3Rlcl90aCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAgICBrbXBfdGVhbV90ICpwYXJlbnRfdGVhbSA9IG1hc3Rlcl90aC0+dGgudGhfdGVhbTsKKyAgICAgIG9tcHRfbHdfdGFza3RlYW1fdCAqbHd0ID0gcGFyZW50X3RlYW0tPnQub21wdF9zZXJpYWxpemVkX3RlYW1faW5mbzsKKyAgICAgIGlmIChsd3QpCisgICAgICAgIG9tcHRfZnJhbWUgPSAmKGx3dC0+b21wdF90YXNrX2luZm8uZnJhbWUpOworICAgICAgZWxzZSB7CisgICAgICAgIGludCB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworICAgICAgICBvbXB0X2ZyYW1lID0gJigKKyAgICAgICAgICAgIHBhcmVudF90ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLm9tcHRfdGFza19pbmZvLmZyYW1lKTsKKyAgICAgIH0KKyAgICAgIG9tcHRfZnJhbWUtPnJlZW50ZXJfcnVudGltZV9mcmFtZSA9IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDEpOworICAgIH0KKyNlbmRpZgorCisjaWYgSU5DTFVERV9TU0NfTUFSS1MKKyAgICBTU0NfTUFSS19GT1JLSU5HKCk7CisjZW5kaWYKKyAgICBfX2ttcF9mb3JrX2NhbGwobG9jLCBndGlkLCBmb3JrX2NvbnRleHRfaW50ZWwsIGFyZ2MsCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgIFZPTEFUSUxFX0NBU1Qodm9pZCAqKSBtaWNyb3Rhc2ssIC8vICJ1bndyYXBwZWQiIHRhc2sKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBWT0xBVElMRV9DQVNUKG1pY3JvdGFza190KSBtaWNyb3Rhc2ssIC8vICJ3cmFwcGVkIiB0YXNrCisgICAgICAgICAgICAgICAgICAgIFZPTEFUSUxFX0NBU1QobGF1bmNoX3QpIF9fa21wX2ludm9rZV90YXNrX2Z1bmMsCisvKiBUT0RPOiByZXZlcnQgd29ya2Fyb3VuZCBmb3IgSW50ZWwoUikgNjQgdHJhY2tlciAjOTYgKi8KKyNpZiAoS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KSAmJiBLTVBfT1NfTElOVVgKKyAgICAgICAgICAgICAgICAgICAgJmFwCisjZWxzZQorICAgICAgICAgICAgICAgICAgICBhcAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICk7CisjaWYgSU5DTFVERV9TU0NfTUFSS1MKKyAgICBTU0NfTUFSS19KT0lOSU5HKCk7CisjZW5kaWYKKyAgICBfX2ttcF9qb2luX2NhbGwobG9jLCBndGlkCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgICAgZm9ya19jb250ZXh0X2ludGVsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgKTsKKworICAgIHZhX2VuZChhcCk7CisgIH0KK30KKworI2lmIE9NUF80MF9FTkFCTEVECisvKiEKK0Bpbmdyb3VwIFBBUkFMTEVMCitAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgZ2xvYmFsIHRocmVhZCBudW1iZXIKK0BwYXJhbSBudW1fdGVhbXMgbnVtYmVyIG9mIHRlYW1zIHJlcXVlc3RlZCBmb3IgdGhlIHRlYW1zIGNvbnN0cnVjdAorQHBhcmFtIG51bV90aHJlYWRzIG51bWJlciBvZiB0aHJlYWRzIHBlciB0ZWFtIHJlcXVlc3RlZCBmb3IgdGhlIHRlYW1zIGNvbnN0cnVjdAorCitTZXQgdGhlIG51bWJlciBvZiB0ZWFtcyB0byBiZSB1c2VkIGJ5IHRoZSB0ZWFtcyBjb25zdHJ1Y3QuCitUaGlzIGNhbGwgaXMgb25seSByZXF1aXJlZCBpZiB0aGUgdGVhbXMgY29uc3RydWN0IGhhcyBhIGBudW1fdGVhbXNgIGNsYXVzZQorb3IgYSBgdGhyZWFkX2xpbWl0YCBjbGF1c2UgKG9yIGJvdGgpLgorKi8KK3ZvaWQgX19rbXBjX3B1c2hfbnVtX3RlYW1zKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbnVtX3RlYW1zLCBrbXBfaW50MzIgbnVtX3RocmVhZHMpIHsKKyAgS0FfVFJBQ0UoMjAsCisgICAgICAgICAgICgiX19rbXBjX3B1c2hfbnVtX3RlYW1zOiBlbnRlciBUIyVkIG51bV90ZWFtcz0lZCBudW1fdGhyZWFkcz0lZFxuIiwKKyAgICAgICAgICAgIGdsb2JhbF90aWQsIG51bV90ZWFtcywgbnVtX3RocmVhZHMpKTsKKworICBfX2ttcF9wdXNoX251bV90ZWFtcyhsb2MsIGdsb2JhbF90aWQsIG51bV90ZWFtcywgbnVtX3RocmVhZHMpOworfQorCisvKiEKK0Bpbmdyb3VwIFBBUkFMTEVMCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBhcmdjICB0b3RhbCBudW1iZXIgb2YgYXJndW1lbnRzIGluIHRoZSBlbGxpcHNpcworQHBhcmFtIG1pY3JvdGFzayAgcG9pbnRlciB0byBjYWxsYmFjayByb3V0aW5lIGNvbnNpc3Rpbmcgb2Ygb3V0bGluZWQgdGVhbXMKK2NvbnN0cnVjdAorQHBhcmFtIC4uLiAgcG9pbnRlcnMgdG8gc2hhcmVkIHZhcmlhYmxlcyB0aGF0IGFyZW4ndCBnbG9iYWwKKworRG8gdGhlIGFjdHVhbCBmb3JrIGFuZCBjYWxsIHRoZSBtaWNyb3Rhc2sgaW4gdGhlIHJlbGV2YW50IG51bWJlciBvZiB0aHJlYWRzLgorKi8KK3ZvaWQgX19rbXBjX2ZvcmtfdGVhbXMoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgYXJnYywga21wY19taWNybyBtaWNyb3Rhc2ssCisgICAgICAgICAgICAgICAgICAgICAgIC4uLikgeworICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAga21wX2luZm9fdCAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICB2YV9saXN0IGFwOworICB2YV9zdGFydChhcCwgbWljcm90YXNrKTsKKworICBLTVBfQ09VTlRfQkxPQ0soT01QX1RFQU1TKTsKKworICAvLyByZW1lbWJlciB0ZWFtcyBlbnRyeSBwb2ludCBhbmQgbmVzdGluZyBsZXZlbAorICB0aGlzX3Roci0+dGgudGhfdGVhbXNfbWljcm90YXNrID0gbWljcm90YXNrOworICB0aGlzX3Roci0+dGgudGhfdGVhbXNfbGV2ZWwgPQorICAgICAgdGhpc190aHItPnRoLnRoX3RlYW0tPnQudF9sZXZlbDsgLy8gQUM6IGNhbiBiZSA+MCBvbiBob3N0CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAga21wX3RlYW1fdCAqcGFyZW50X3RlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgaW50IHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCk7CisgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICBwYXJlbnRfdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXQorICAgICAgICAub21wdF90YXNrX2luZm8uZnJhbWUucmVlbnRlcl9ydW50aW1lX2ZyYW1lID0KKyAgICAgICAgX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMSk7CisgIH0KKyNlbmRpZgorCisgIC8vIGNoZWNrIGlmIF9fa21wY19wdXNoX251bV90ZWFtcyBjYWxsZWQsIHNldCBkZWZhdWx0IG51bWJlciBvZiB0ZWFtcworICAvLyBvdGhlcndpc2UKKyAgaWYgKHRoaXNfdGhyLT50aC50aF90ZWFtc19zaXplLm50ZWFtcyA9PSAwKSB7CisgICAgX19rbXBfcHVzaF9udW1fdGVhbXMobG9jLCBndGlkLCAwLCAwKTsKKyAgfQorICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyLT50aC50aF9zZXRfbnByb2MgPj0gMSk7CisgIEtNUF9ERUJVR19BU1NFUlQodGhpc190aHItPnRoLnRoX3RlYW1zX3NpemUubnRlYW1zID49IDEpOworICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyLT50aC50aF90ZWFtc19zaXplLm50aCA+PSAxKTsKKworICBfX2ttcF9mb3JrX2NhbGwobG9jLCBndGlkLCBmb3JrX2NvbnRleHRfaW50ZWwsIGFyZ2MsCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICBWT0xBVElMRV9DQVNUKHZvaWQgKikgbWljcm90YXNrLCAvLyAidW53cmFwcGVkIiB0YXNrCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgIFZPTEFUSUxFX0NBU1QobWljcm90YXNrX3QpCisgICAgICAgICAgICAgICAgICAgICAgX19rbXBfdGVhbXNfbWFzdGVyLCAvLyAid3JhcHBlZCIgdGFzaworICAgICAgICAgICAgICAgICAgVk9MQVRJTEVfQ0FTVChsYXVuY2hfdCkgX19rbXBfaW52b2tlX3RlYW1zX21hc3RlciwKKyNpZiAoS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KSAmJiBLTVBfT1NfTElOVVgKKyAgICAgICAgICAgICAgICAgICZhcAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgIGFwCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICk7CisgIF9fa21wX2pvaW5fY2FsbChsb2MsIGd0aWQKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgIGZvcmtfY29udGV4dF9pbnRlbAorI2VuZGlmCisgICAgICAgICAgICAgICAgICApOworCisgIHRoaXNfdGhyLT50aC50aF90ZWFtc19taWNyb3Rhc2sgPSBOVUxMOworICB0aGlzX3Roci0+dGgudGhfdGVhbXNfbGV2ZWwgPSAwOworICAqKGttcF9pbnQ2NCAqKSgmdGhpc190aHItPnRoLnRoX3RlYW1zX3NpemUpID0gMEw7CisgIHZhX2VuZChhcCk7Cit9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworLy8gSSBkb24ndCB0aGluayB0aGlzIGZ1bmN0aW9uIHNob3VsZCBldmVyIGhhdmUgYmVlbiBleHBvcnRlZC4KKy8vIFRoZSBfX2ttcGNfIHByZWZpeCB3YXMgbWlzYXBwbGllZC4gIEknbSBmYWlybHkgY2VydGFpbiB0aGF0IG5vIGdlbmVyYXRlZAorLy8gb3Blbm1wIGNvZGUgZXZlciBjYWxsZWQgaXQsIGJ1dCBpdCdzIGJlZW4gZXhwb3J0ZWQgZnJvbSB0aGUgUlRMIGZvciBzbworLy8gbG9uZyB0aGF0IEknbSBhZnJhaWQgdG8gcmVtb3ZlIHRoZSBkZWZpbml0aW9uLgoraW50IF9fa21wY19pbnZva2VfdGFza19mdW5jKGludCBndGlkKSB7IHJldHVybiBfX2ttcF9pbnZva2VfdGFza19mdW5jKGd0aWQpOyB9CisKKy8qIQorQGluZ3JvdXAgUEFSQUxMRUwKK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyCisKK0VudGVyIGEgc2VyaWFsaXplZCBwYXJhbGxlbCBjb25zdHJ1Y3QuIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gaGFuZGxlIGEKK2NvbmRpdGlvbmFsIHBhcmFsbGVsIHJlZ2lvbiwgbGlrZSB0aGlzLAorQGNvZGUKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGlmIChjb25kaXRpb24pCitAZW5kY29kZQord2hlbiB0aGUgY29uZGl0aW9uIGlzIGZhbHNlLgorKi8KK3ZvaWQgX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkgeworICAvLyBUaGUgaW1wbGVtZW50YXRpb24gaXMgbm93IGluIGttcF9ydW50aW1lLmNwcCBzbyB0aGF0IGl0IGNhbiBzaGFyZSBzdGF0aWMKKyAgLy8gZnVuY3Rpb25zIHdpdGgga21wX2ZvcmtfY2FsbCBzaW5jZSB0aGUgdGFza3MgdG8gYmUgZG9uZSBhcmUgc2ltaWxhciBpbgorICAvLyBlYWNoIGNhc2UuCisgIF9fa21wX3NlcmlhbGl6ZWRfcGFyYWxsZWwobG9jLCBnbG9iYWxfdGlkKTsKK30KKworLyohCitAaW5ncm91cCBQQVJBTExFTAorQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCAgZ2xvYmFsIHRocmVhZCBudW1iZXIKKworTGVhdmUgYSBzZXJpYWxpemVkIHBhcmFsbGVsIGNvbnN0cnVjdC4KKyovCit2b2lkIF9fa21wY19lbmRfc2VyaWFsaXplZF9wYXJhbGxlbChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkKSB7CisgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKnRvcDsKKyAga21wX2luZm9fdCAqdGhpc190aHI7CisgIGttcF90ZWFtX3QgKnNlcmlhbF90ZWFtOworCisgIEtDX1RSQUNFKDEwLAorICAgICAgICAgICAoIl9fa21wY19lbmRfc2VyaWFsaXplZF9wYXJhbGxlbDogY2FsbGVkIGJ5IFQjJWRcbiIsIGdsb2JhbF90aWQpKTsKKworICAvKiBza2lwIGFsbCB0aGlzIGNvZGUgZm9yIGF1dG9wYXIgc2VyaWFsaXplZCBsb29wcyBzaW5jZSBpdCByZXN1bHRzIGluCisgICAgIHVuYWNjZXB0YWJsZSBvdmVyaGVhZCAqLworICBpZiAobG9jICE9IE5VTEwgJiYgKGxvYy0+ZmxhZ3MgJiBLTVBfSURFTlRfQVVUT1BBUikpCisgICAgcmV0dXJuOworCisgIC8vIE5vdCBhdXRvcGFyIGNvZGUKKyAgaWYgKCFUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkKKyAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgdGhpc190aHIgPSBfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdOworICBzZXJpYWxfdGVhbSA9IHRoaXNfdGhyLT50aC50aF9zZXJpYWxfdGVhbTsKKworI2lmIE9NUF80NV9FTkFCTEVECisgIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtID0gdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbTsKKworICAvLyB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBwcm94eSB0YXNrcyBiZWZvcmUgZmluaXNoaW5nIHRoZSB0aHJlYWQKKyAgaWYgKHRhc2tfdGVhbSAhPSBOVUxMICYmIHRhc2tfdGVhbS0+dHQudHRfZm91bmRfcHJveHlfdGFza3MpCisgICAgX19rbXBfdGFza190ZWFtX3dhaXQodGhpc190aHIsIHNlcmlhbF90ZWFtIFVTRV9JVFRfQlVJTERfQVJHKE5VTEwpKTsKKyNlbmRpZgorCisgIEtNUF9NQigpOworICBLTVBfREVCVUdfQVNTRVJUKHNlcmlhbF90ZWFtKTsKKyAgS01QX0FTU0VSVChzZXJpYWxfdGVhbS0+dC50X3NlcmlhbGl6ZWQpOworICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyLT50aC50aF90ZWFtID09IHNlcmlhbF90ZWFtKTsKKyAgS01QX0RFQlVHX0FTU0VSVChzZXJpYWxfdGVhbSAhPSB0aGlzX3Roci0+dGgudGhfcm9vdC0+ci5yX3Jvb3RfdGVhbSk7CisgIEtNUF9ERUJVR19BU1NFUlQoc2VyaWFsX3RlYW0tPnQudF90aHJlYWRzKTsKKyAgS01QX0RFQlVHX0FTU0VSVChzZXJpYWxfdGVhbS0+dC50X3RocmVhZHNbMF0gPT0gdGhpc190aHIpOworCisgIC8qIElmIG5lY2Vzc2FyeSwgcG9wIHRoZSBpbnRlcm5hbCBjb250cm9sIHN0YWNrIHZhbHVlcyBhbmQgcmVwbGFjZSB0aGUgdGVhbQorICAgKiB2YWx1ZXMgKi8KKyAgdG9wID0gc2VyaWFsX3RlYW0tPnQudF9jb250cm9sX3N0YWNrX3RvcDsKKyAgaWYgKHRvcCAmJiB0b3AtPnNlcmlhbF9uZXN0aW5nX2xldmVsID09IHNlcmlhbF90ZWFtLT50LnRfc2VyaWFsaXplZCkgeworICAgIGNvcHlfaWN2cygmc2VyaWFsX3RlYW0tPnQudF90aHJlYWRzWzBdLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMsIHRvcCk7CisgICAgc2VyaWFsX3RlYW0tPnQudF9jb250cm9sX3N0YWNrX3RvcCA9IHRvcC0+bmV4dDsKKyAgICBfX2ttcF9mcmVlKHRvcCk7CisgIH0KKworICAvLyBpZiggc2VyaWFsX3RlYW0gLT4gdC50X3NlcmlhbGl6ZWQgPiAxICkKKyAgc2VyaWFsX3RlYW0tPnQudF9sZXZlbC0tOworCisgIC8qIHBvcCBkaXNwYXRjaCBidWZmZXJzIHN0YWNrICovCisgIEtNUF9ERUJVR19BU1NFUlQoc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaC0+dGhfZGlzcF9idWZmZXIpOworICB7CisgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgKmRpc3BfYnVmZmVyID0KKyAgICAgICAgc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaC0+dGhfZGlzcF9idWZmZXI7CisgICAgc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaC0+dGhfZGlzcF9idWZmZXIgPQorICAgICAgICBzZXJpYWxfdGVhbS0+dC50X2Rpc3BhdGNoLT50aF9kaXNwX2J1ZmZlci0+bmV4dDsKKyAgICBfX2ttcF9mcmVlKGRpc3BfYnVmZmVyKTsKKyAgfQorCisgIC0tc2VyaWFsX3RlYW0tPnQudF9zZXJpYWxpemVkOworICBpZiAoc2VyaWFsX3RlYW0tPnQudF9zZXJpYWxpemVkID09IDApIHsKKworLyogcmV0dXJuIHRvIHRoZSBwYXJhbGxlbCBzZWN0aW9uICovCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgaWYgKF9fa21wX2luaGVyaXRfZnBfY29udHJvbCAmJiBzZXJpYWxfdGVhbS0+dC50X2ZwX2NvbnRyb2xfc2F2ZWQpIHsKKyAgICAgIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQoKTsKKyAgICAgIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQoJnNlcmlhbF90ZWFtLT50LnRfeDg3X2ZwdV9jb250cm9sX3dvcmQpOworICAgICAgX19rbXBfbG9hZF9teGNzcigmc2VyaWFsX3RlYW0tPnQudF9teGNzcik7CisgICAgfQorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworICAgIHRoaXNfdGhyLT50aC50aF90ZWFtID0gc2VyaWFsX3RlYW0tPnQudF9wYXJlbnQ7CisgICAgdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfdGlkID0gc2VyaWFsX3RlYW0tPnQudF9tYXN0ZXJfdGlkOworCisgICAgLyogcmVzdG9yZSB2YWx1ZXMgY2FjaGVkIGluIHRoZSB0aHJlYWQgKi8KKyAgICB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYyA9IHNlcmlhbF90ZWFtLT50LnRfcGFyZW50LT50LnRfbnByb2M7IC8qICBKUEggKi8KKyAgICB0aGlzX3Roci0+dGgudGhfdGVhbV9tYXN0ZXIgPQorICAgICAgICBzZXJpYWxfdGVhbS0+dC50X3BhcmVudC0+dC50X3RocmVhZHNbMF07IC8qIEpQSCAqLworICAgIHRoaXNfdGhyLT50aC50aF90ZWFtX3NlcmlhbGl6ZWQgPSB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC50X3NlcmlhbGl6ZWQ7CisKKyAgICAvKiBUT0RPIHRoZSBiZWxvdyBzaG91bGRuJ3QgbmVlZCB0byBiZSBhZGp1c3RlZCBmb3Igc2VyaWFsaXplZCB0ZWFtcyAqLworICAgIHRoaXNfdGhyLT50aC50aF9kaXNwYXRjaCA9CisgICAgICAgICZ0aGlzX3Roci0+dGgudGhfdGVhbS0+dC50X2Rpc3BhdGNoW3NlcmlhbF90ZWFtLT50LnRfbWFzdGVyX3RpZF07CisKKyAgICBfX2ttcF9wb3BfY3VycmVudF90YXNrX2Zyb21fdGhyZWFkKHRoaXNfdGhyKTsKKworICAgIEtNUF9BU1NFUlQodGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfZmxhZ3MuZXhlY3V0aW5nID09IDApOworICAgIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ZsYWdzLmV4ZWN1dGluZyA9IDE7CisKKyAgICBpZiAoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyAgICAgIC8vIENvcHkgdGhlIHRhc2sgdGVhbSBmcm9tIHRoZSBuZXcgY2hpbGQgLyBvbGQgcGFyZW50IHRlYW0gdG8gdGhlIHRocmVhZC4KKyAgICAgIHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0gPQorICAgICAgICAgIHRoaXNfdGhyLT50aC50aF90ZWFtLT50LnRfdGFza190ZWFtW3RoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlXTsKKyAgICAgIEtBX1RSQUNFKDIwLAorICAgICAgICAgICAgICAgKCJfX2ttcGNfZW5kX3NlcmlhbGl6ZWRfcGFyYWxsZWw6IFQjJWQgcmVzdG9yaW5nIHRhc2tfdGVhbSAlcCAvICIKKyAgICAgICAgICAgICAgICAidGVhbSAlcFxuIiwKKyAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCB0aGlzX3Roci0+dGgudGhfdGFza190ZWFtLCB0aGlzX3Roci0+dGgudGhfdGVhbSkpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wY19lbmRfc2VyaWFsaXplZF9wYXJhbGxlbDogVCMlZCBkZWNyZWFzaW5nIG5lc3RpbmcgIgorICAgICAgICAgICAgICAgICAgICAiZGVwdGggb2Ygc2VyaWFsIHRlYW0gJXAgdG8gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsIHNlcmlhbF90ZWFtLCBzZXJpYWxfdGVhbS0+dC50X3NlcmlhbGl6ZWQpKTsKKyAgICB9CisgIH0KKworICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKQorICAgIF9fa21wX3BvcF9wYXJhbGxlbChnbG9iYWxfdGlkLCBOVUxMKTsKK30KKworLyohCitAaW5ncm91cCBTWU5DSFJPTklaQVRJT04KK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KKworRXhlY3V0ZSA8dHQ+Zmx1c2g8L3R0Pi4gVGhpcyBpcyBpbXBsZW1lbnRlZCBhcyBhIGZ1bGwgbWVtb3J5IGZlbmNlLiAoVGhvdWdoCitkZXBlbmRpbmcgb24gdGhlIG1lbW9yeSBvcmRlcmluZyBjb252ZW50aW9uIG9iZXllZCBieSB0aGUgY29tcGlsZXIKK2V2ZW4gdGhhdCBtYXkgbm90IGJlIG5lY2Vzc2FyeSkuCisqLwordm9pZCBfX2ttcGNfZmx1c2goaWRlbnRfdCAqbG9jKSB7CisgIEtDX1RSQUNFKDEwLCAoIl9fa21wY19mbHVzaDogY2FsbGVkXG4iKSk7CisKKyAgLyogbmVlZCBleHBsaWNpdCBfX21mKCkgaGVyZSBzaW5jZSB1c2Ugdm9sYXRpbGUgaW5zdGVhZCBpbiBsaWJyYXJ5ICovCisgIEtNUF9NQigpOyAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisjaWYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpCisjaWYgS01QX01JQworLy8gZmVuY2Utc3R5bGUgaW5zdHJ1Y3Rpb25zIGRvIG5vdCBleGlzdCwgYnV0IGxvY2s7IHhhZGRsICQwLCglcnNwKSBjYW4gYmUgdXNlZC4KKy8vIFdlIHNob3VsZG4ndCBuZWVkIGl0LCB0aG91Z2gsIHNpbmNlIHRoZSBBQkkgcnVsZXMgcmVxdWlyZSB0aGF0CisvLyAqIElmIHRoZSBjb21waWxlciBnZW5lcmF0ZXMgTkdPIHN0b3JlcyBpdCBhbHNvIGdlbmVyYXRlcyB0aGUgZmVuY2UKKy8vICogSWYgdXNlcnMgaGFuZC1jb2RlIE5HTyBzdG9yZXMgdGhleSBzaG91bGQgaW5zZXJ0IHRoZSBmZW5jZQorLy8gdGhlcmVmb3JlIG5vIGluY29tcGxldGUgdW5vcmRlcmVkIHN0b3JlcyBzaG91bGQgYmUgdmlzaWJsZS4KKyNlbHNlCisgIC8vIEM3NDQwNAorICAvLyBUaGlzIGlzIHRvIGFkZHJlc3Mgbm9uLXRlbXBvcmFsIHN0b3JlIGluc3RydWN0aW9ucyAoc2ZlbmNlIG5lZWRlZCkuCisgIC8vIFRoZSBjbGZsdXNoIGluc3RydWN0aW9uIGlzIGFkZHJlc3NlZCBlaXRoZXIgKG1mZW5jZSBuZWVkZWQpLgorICAvLyBQcm9iYWJseSB0aGUgbm9uLXRlbXBvcmFsIGxvYWQgbW9udnRkcWEgaW5zdHJ1Y3Rpb24gc2hvdWxkIGFsc28gYmUKKyAgLy8gYWRkcmVzc2VkLgorICAvLyBtZmVuY2UgaXMgYSBTU0UyIGluc3RydWN0aW9uLiBEbyBub3QgZXhlY3V0ZSBpdCBpZiBDUFUgaXMgbm90IFNTRTIuCisgIGlmICghX19rbXBfY3B1aW5mby5pbml0aWFsaXplZCkgeworICAgIF9fa21wX3F1ZXJ5X2NwdWlkKCZfX2ttcF9jcHVpbmZvKTsKKyAgfTsgLy8gaWYKKyAgaWYgKCFfX2ttcF9jcHVpbmZvLnNzZTIpIHsKKyAgICAvLyBDUFUgY2Fubm90IGV4ZWN1dGUgU1NFMiBpbnN0cnVjdGlvbnMuCisgIH0gZWxzZSB7CisjaWYgS01QX0NPTVBJTEVSX0lDQworICAgIF9tbV9tZmVuY2UoKTsKKyNlbGlmIEtNUF9DT01QSUxFUl9NU1ZDCisgICAgTWVtb3J5QmFycmllcigpOworI2Vsc2UKKyAgICBfX3N5bmNfc3luY2hyb25pemUoKTsKKyNlbmRpZiAvLyBLTVBfQ09NUElMRVJfSUNDCisgIH07IC8vIGlmCisjZW5kaWYgLy8gS01QX01JQworI2VsaWYgKEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0IHx8IEtNUF9BUkNIX01JUFMgfHwgS01QX0FSQ0hfTUlQUzY0KQorLy8gTm90aGluZyB0byBzZWUgaGVyZSBtb3ZlIGFsb25nCisjZWxpZiBLTVBfQVJDSF9QUEM2NAorLy8gTm90aGluZyBuZWVkZWQgaGVyZSAod2UgaGF2ZSBhIHJlYWwgTUIgYWJvdmUpLgorI2lmIEtNUF9PU19DTksKKyAgLy8gVGhlIGZsdXNoaW5nIHRocmVhZCBuZWVkcyB0byB5aWVsZCBoZXJlOyB0aGlzIHByZXZlbnRzIGEKKyAgLy8gYnVzeS13YWl0aW5nIHRocmVhZCBmcm9tIHNhdHVyYXRpbmcgdGhlIHBpcGVsaW5lLiBmbHVzaCBpcworICAvLyBvZnRlbiB1c2VkIGluIGxvb3BzIGxpa2UgdGhpczoKKyAgLy8gd2hpbGUgKCFmbGFnKSB7CisgIC8vICAgI3ByYWdtYSBvbXAgZmx1c2goZmxhZykKKyAgLy8gfQorICAvLyBhbmQgYWRkaW5nIHRoZSB5aWVsZCBoZXJlIGlzIGdvb2QgZm9yIGF0IGxlYXN0IGEgMTB4IHNwZWVkdXAKKyAgLy8gd2hlbiBydW5uaW5nID4yIHRocmVhZHMgcGVyIGNvcmUgKG9uIHRoZSBOQVMgTFUgYmVuY2htYXJrKS4KKyAgX19rbXBfeWllbGQoVFJVRSk7CisjZW5kaWYKKyNlbHNlCisjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUKKyNlbmRpZgorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyohCitAaW5ncm91cCBTWU5DSFJPTklaQVRJT04KK0BwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCB0aHJlYWQgaWQuCisKK0V4ZWN1dGUgYSBiYXJyaWVyLgorKi8KK3ZvaWQgX19rbXBjX2JhcnJpZXIoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkgeworICBLTVBfQ09VTlRfQkxPQ0soT01QX0JBUlJJRVIpOworICBLQ19UUkFDRSgxMCwgKCJfX2ttcGNfYmFycmllcjogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQpKTsKKworICBpZiAoIVRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpKQorICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgaWYgKGxvYyA9PSAwKSB7CisgICAgICBLTVBfV0FSTklORyhDb25zdHJ1Y3RJZGVudEludmFsaWQpOyAvLyA/Pz8gV2hhdCBkb2VzIGl0IG1lYW4gZm9yIHRoZSB1c2VyPworICAgIH07IC8vIGlmCisKKyAgICBfX2ttcF9jaGVja19iYXJyaWVyKGdsb2JhbF90aWQsIGN0X2JhcnJpZXIsIGxvYyk7CisgIH0KKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgIG9tcHRfZnJhbWVfdCAqb21wdF9mcmFtZTsKKyAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgIG9tcHRfZnJhbWUgPSBfX29tcHRfZ2V0X3Rhc2tfZnJhbWVfaW50ZXJuYWwoMCk7CisgICAgaWYgKG9tcHRfZnJhbWUtPnJlZW50ZXJfcnVudGltZV9mcmFtZSA9PSBOVUxMKQorICAgICAgb21wdF9mcmFtZS0+cmVlbnRlcl9ydW50aW1lX2ZyYW1lID0gX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMSk7CisgIH0KKyNlbmRpZgorICBfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdLT50aC50aF9pZGVudCA9IGxvYzsKKyAgLy8gVE9ETzogZXhwbGljaXQgYmFycmllcl93YWl0X2lkOgorICAvLyAgIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gJ2JhcnJpZXInIGRpcmVjdGl2ZSBpcyBwcmVzZW50IG9yCisgIC8vICAgaW1wbGljaXQgYmFycmllciBhdCB0aGUgZW5kIG9mIGEgd29ya3NoYXJpbmcgY29uc3RydWN0LgorICAvLyAxKSBiZXR0ZXIgdG8gYWRkIGEgcGVyLXRocmVhZCBiYXJyaWVyIGNvdW50ZXIgdG8gYSB0aHJlYWQgZGF0YSBzdHJ1Y3R1cmUKKyAgLy8gMikgc2V0IHRvIDAgd2hlbiBhIG5ldyB0ZWFtIGlzIGNyZWF0ZWQKKyAgLy8gNCkgbm8gc3luYyBpcyByZXF1aXJlZAorCisgIF9fa21wX2JhcnJpZXIoYnNfcGxhaW5fYmFycmllciwgZ2xvYmFsX3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwpOworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICBvbXB0X2ZyYW1lLT5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSBOVUxMOworICB9CisjZW5kaWYKK30KKworLyogVGhlIEJBUlJJRVIgZm9yIGEgTUFTVEVSIHNlY3Rpb24gaXMgYWx3YXlzIGV4cGxpY2l0ICAgKi8KKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitAcGFyYW0gZ2xvYmFsX3RpZCAgZ2xvYmFsIHRocmVhZCBudW1iZXIgLgorQHJldHVybiAxIGlmIHRoaXMgdGhyZWFkIHNob3VsZCBleGVjdXRlIHRoZSA8dHQ+bWFzdGVyPC90dD4gYmxvY2ssIDAgb3RoZXJ3aXNlLgorKi8KK2ttcF9pbnQzMiBfX2ttcGNfbWFzdGVyKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQpIHsKKyAgaW50IHN0YXR1cyA9IDA7CisKKyAgS0NfVFJBQ0UoMTAsICgiX19rbXBjX21hc3RlcjogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQpKTsKKworICBpZiAoIVRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpKQorICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICBpZiAoS01QX01BU1RFUl9HVElEKGdsb2JhbF90aWQpKSB7CisgICAgS01QX0NPVU5UX0JMT0NLKE9NUF9NQVNURVIpOworICAgIEtNUF9QVVNIX1BBUlRJVElPTkVEX1RJTUVSKE9NUF9tYXN0ZXIpOworICAgIHN0YXR1cyA9IDE7CisgIH0KKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgIGlmIChzdGF0dXMpIHsKKyAgICBpZiAob21wdF9lbmFibGVkICYmIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9tYXN0ZXJfYmVnaW4pKSB7CisgICAgICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF07CisgICAgICBrbXBfdGVhbV90ICp0ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisKKyAgICAgIGludCB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGdsb2JhbF90aWQpOworICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X21hc3Rlcl9iZWdpbikoCisgICAgICAgICAgdGVhbS0+dC5vbXB0X3RlYW1faW5mby5wYXJhbGxlbF9pZCwKKyAgICAgICAgICB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLm9tcHRfdGFza19pbmZvLnRhc2tfaWQpOworICAgIH0KKyAgfQorI2VuZGlmCisKKyAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgaWYgKHN0YXR1cykKKyAgICAgIF9fa21wX3B1c2hfc3luYyhnbG9iYWxfdGlkLCBjdF9tYXN0ZXIsIGxvYywgTlVMTCwgMCk7CisgICAgZWxzZQorICAgICAgX19rbXBfY2hlY2tfc3luYyhnbG9iYWxfdGlkLCBjdF9tYXN0ZXIsIGxvYywgTlVMTCwgMCk7CisjZWxzZQorICAgIGlmIChzdGF0dXMpCisgICAgICBfX2ttcF9wdXNoX3N5bmMoZ2xvYmFsX3RpZCwgY3RfbWFzdGVyLCBsb2MsIE5VTEwpOworICAgIGVsc2UKKyAgICAgIF9fa21wX2NoZWNrX3N5bmMoZ2xvYmFsX3RpZCwgY3RfbWFzdGVyLCBsb2MsIE5VTEwpOworI2VuZGlmCisgIH0KKworICByZXR1cm4gc3RhdHVzOworfQorCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyIC4KKworTWFyayB0aGUgZW5kIG9mIGEgPHR0Pm1hc3RlcjwvdHQ+IHJlZ2lvbi4gVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgdGhlCit0aHJlYWQgdGhhdCBleGVjdXRlcyB0aGUgPHR0Pm1hc3RlcjwvdHQ+IHJlZ2lvbi4KKyovCit2b2lkIF9fa21wY19lbmRfbWFzdGVyKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQpIHsKKyAgS0NfVFJBQ0UoMTAsICgiX19rbXBjX2VuZF9tYXN0ZXI6IGNhbGxlZCBUIyVkXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgS01QX0RFQlVHX0FTU0VSVChLTVBfTUFTVEVSX0dUSUQoZ2xvYmFsX3RpZCkpOworICBLTVBfUE9QX1BBUlRJVElPTkVEX1RJTUVSKCk7CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF07CisgIGttcF90ZWFtX3QgKnRlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgaWYgKG9tcHRfZW5hYmxlZCAmJiBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbWFzdGVyX2VuZCkpIHsKKyAgICBpbnQgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChnbG9iYWxfdGlkKTsKKyAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbWFzdGVyX2VuZCkoCisgICAgICAgIHRlYW0tPnQub21wdF90ZWFtX2luZm8ucGFyYWxsZWxfaWQsCisgICAgICAgIHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0ub21wdF90YXNrX2luZm8udGFza19pZCk7CisgIH0KKyNlbmRpZgorCisgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICBpZiAoZ2xvYmFsX3RpZCA8IDApCisgICAgICBLTVBfV0FSTklORyhUaHJlYWRJZGVudEludmFsaWQpOworCisgICAgaWYgKEtNUF9NQVNURVJfR1RJRChnbG9iYWxfdGlkKSkKKyAgICAgIF9fa21wX3BvcF9zeW5jKGdsb2JhbF90aWQsIGN0X21hc3RlciwgbG9jKTsKKyAgfQorfQorCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHBhcmFtIGd0aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyLgorCitTdGFydCBleGVjdXRpb24gb2YgYW4gPHR0Pm9yZGVyZWQ8L3R0PiBjb25zdHJ1Y3QuCisqLwordm9pZCBfX2ttcGNfb3JkZXJlZChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkKSB7CisgIGludCBjaWQgPSAwOworICBrbXBfaW5mb190ICp0aDsKKyAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9pbml0X3NlcmlhbCk7CisKKyAgS0NfVFJBQ0UoMTAsICgiX19rbXBjX29yZGVyZWQ6IGNhbGxlZCBUIyVkXG4iLCBndGlkKSk7CisKKyAgaWYgKCFUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkKKyAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgIF9fa21wX2l0dF9vcmRlcmVkX3ByZXAoZ3RpZCk7CisvLyBUT0RPOiBvcmRlcmVkX3dhaXRfaWQKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgdGggPSBfX2ttcF90aHJlYWRzW2d0aWRdOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgIC8qIE9NUFQgc3RhdGUgdXBkYXRlICovCisgICAgdGgtPnRoLm9tcHRfdGhyZWFkX2luZm8ud2FpdF9pZCA9ICh1aW50NjRfdClsb2M7CisgICAgdGgtPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3dhaXRfb3JkZXJlZDsKKworICAgIC8qIE9NUFQgZXZlbnQgY2FsbGJhY2sgKi8KKyAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3dhaXRfb3JkZXJlZCkpIHsKKyAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF93YWl0X29yZGVyZWQpKAorICAgICAgICAgIHRoLT50aC5vbXB0X3RocmVhZF9pbmZvLndhaXRfaWQpOworICAgIH0KKyAgfQorI2VuZGlmCisKKyAgaWYgKHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGVvX2ZjbiAhPSAwKQorICAgICgqdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kZW9fZmNuKSgmZ3RpZCwgJmNpZCwgbG9jKTsKKyAgZWxzZQorICAgIF9fa21wX3BhcmFsbGVsX2RlbygmZ3RpZCwgJmNpZCwgbG9jKTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAvKiBPTVBUIHN0YXRlIHVwZGF0ZSAqLworICAgIHRoLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV93b3JrX3BhcmFsbGVsOworICAgIHRoLT50aC5vbXB0X3RocmVhZF9pbmZvLndhaXRfaWQgPSAwOworCisgICAgLyogT01QVCBldmVudCBjYWxsYmFjayAqLworICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYWNxdWlyZWRfb3JkZXJlZCkpIHsKKyAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9hY3F1aXJlZF9vcmRlcmVkKSgKKyAgICAgICAgICB0aC0+dGgub21wdF90aHJlYWRfaW5mby53YWl0X2lkKTsKKyAgICB9CisgIH0KKyNlbmRpZgorCisjaWYgVVNFX0lUVF9CVUlMRAorICBfX2ttcF9pdHRfb3JkZXJlZF9zdGFydChndGlkKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCit9CisKKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitAcGFyYW0gZ3RpZCAgZ2xvYmFsIHRocmVhZCBudW1iZXIuCisKK0VuZCBleGVjdXRpb24gb2YgYW4gPHR0Pm9yZGVyZWQ8L3R0PiBjb25zdHJ1Y3QuCisqLwordm9pZCBfX2ttcGNfZW5kX29yZGVyZWQoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCkgeworICBpbnQgY2lkID0gMDsKKyAga21wX2luZm9fdCAqdGg7CisKKyAgS0NfVFJBQ0UoMTAsICgiX19rbXBjX2VuZF9vcmRlcmVkOiBjYWxsZWQgVCMlZFxuIiwgZ3RpZCkpOworCisjaWYgVVNFX0lUVF9CVUlMRAorICBfX2ttcF9pdHRfb3JkZXJlZF9lbmQoZ3RpZCk7CisvLyBUT0RPOiBvcmRlcmVkX3dhaXRfaWQKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgdGggPSBfX2ttcF90aHJlYWRzW2d0aWRdOworCisgIGlmICh0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2R4b19mY24gIT0gMCkKKyAgICAoKnRoLT50aC50aF9kaXNwYXRjaC0+dGhfZHhvX2ZjbikoJmd0aWQsICZjaWQsIGxvYyk7CisgIGVsc2UKKyAgICBfX2ttcF9wYXJhbGxlbF9keG8oJmd0aWQsICZjaWQsIGxvYyk7CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9CTEFNRQorICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcmVsZWFzZV9vcmRlcmVkKSkgeworICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9yZWxlYXNlX29yZGVyZWQpKAorICAgICAgICB0aC0+dGgub21wdF90aHJlYWRfaW5mby53YWl0X2lkKTsKKyAgfQorI2VuZGlmCit9CisKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworCitzdGF0aWMgX19mb3JjZWlubGluZSB2b2lkCitfX2ttcF9pbml0X2luZGlyZWN0X2NzcHRyKGttcF9jcml0aWNhbF9uYW1lICpjcml0LCBpZGVudF90IGNvbnN0ICpsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkLCBrbXBfaW5kaXJlY3RfbG9ja3RhZ190IHRhZykgeworICAvLyBQb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgaW5kaXJlY3QgbG9jayBpcyB3cml0dGVuIHRvIGNyaXQsIHdoaWxlIGluZGV4aW5nCisgIC8vIGlzIGlnbm9yZWQuCisgIHZvaWQgKmlkeDsKKyAga21wX2luZGlyZWN0X2xvY2tfdCAqKmxjazsKKyAgbGNrID0gKGttcF9pbmRpcmVjdF9sb2NrX3QgKiopY3JpdDsKKyAga21wX2luZGlyZWN0X2xvY2tfdCAqaWxrID0gX19rbXBfYWxsb2NhdGVfaW5kaXJlY3RfbG9jaygmaWR4LCBndGlkLCB0YWcpOworICBLTVBfSV9MT0NLX0ZVTkMoaWxrLCBpbml0KShpbGstPmxvY2spOworICBLTVBfU0VUX0lfTE9DS19MT0NBVElPTihpbGssIGxvYyk7CisgIEtNUF9TRVRfSV9MT0NLX0ZMQUdTKGlsaywga21wX2xmX2NyaXRpY2FsX3NlY3Rpb24pOworICBLQV9UUkFDRSgyMCwKKyAgICAgICAgICAgKCJfX2ttcF9pbml0X2luZGlyZWN0X2NzcHRyOiBpbml0aWFsaXplZCBpbmRpcmVjdCBsb2NrICMlZFxuIiwgdGFnKSk7CisjaWYgVVNFX0lUVF9CVUlMRAorICBfX2ttcF9pdHRfY3JpdGljYWxfY3JlYXRpbmcoaWxrLT5sb2NrLCBsb2MpOworI2VuZGlmCisgIGludCBzdGF0dXMgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKGxjaywgbnVsbHB0ciwgaWxrKTsKKyAgaWYgKHN0YXR1cyA9PSAwKSB7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9jcml0aWNhbF9kZXN0cm95ZWQoaWxrLT5sb2NrKTsKKyNlbmRpZgorICAgIC8vIFdlIGRvbid0IHJlYWxseSBuZWVkIHRvIGRlc3Ryb3kgdGhlIHVuY2xhaW1lZCBsb2NrIGhlcmUgc2luY2UgaXQgd2lsbCBiZQorICAgIC8vIGNsZWFuZWQgdXAgYXQgcHJvZ3JhbSBleGl0LgorICAgIC8vIEtNUF9EX0xPQ0tfRlVOQygmaWR4LCBkZXN0cm95KSgoa21wX2R5bmFfbG9ja190ICopJmlkeCk7CisgIH0KKyAgS01QX0RFQlVHX0FTU0VSVCgqbGNrICE9IE5VTEwpOworfQorCisvLyBGYXN0LXBhdGggYWNxdWlyZSB0YXMgbG9jaworI2RlZmluZSBLTVBfQUNRVUlSRV9UQVNfTE9DSyhsb2NrLCBndGlkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAga21wX3Rhc19sb2NrX3QgKmwgPSAoa21wX3Rhc19sb2NrX3QgKilsb2NrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChsLT5say5wb2xsICE9IEtNUF9MT0NLX0ZSRUUodGFzKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIUtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMigmKGwtPmxrLnBvbGwpLCBLTVBfTE9DS19GUkVFKHRhcyksICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0xPQ0tfQlVTWShndGlkICsgMSwgdGFzKSkpIHsgICAgICAgICAgXAorICAgICAga21wX3VpbnQzMiBzcGluczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEtNUF9GU1lOQ19QUkVQQVJFKGwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBLTVBfSU5JVF9ZSUVMRChzcGlucyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKFRDUl80KF9fa21wX250aCkgPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOiBfX2ttcF94cHJvYykpIHsgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9ZSUVMRChUUlVFKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX1lJRUxEX1NQSU4oc3BpbnMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAga21wX2JhY2tvZmZfdCBiYWNrb2ZmID0gX19rbXBfc3Bpbl9iYWNrb2ZmX3BhcmFtczsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHdoaWxlIChsLT5say5wb2xsICE9IEtNUF9MT0NLX0ZSRUUodGFzKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIUtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMigmKGwtPmxrLnBvbGwpLCBLTVBfTE9DS19GUkVFKHRhcyksICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0xPQ0tfQlVTWShndGlkICsgMSwgdGFzKSkpIHsgICAgIFwKKyAgICAgICAgX19rbXBfc3Bpbl9iYWNrb2ZmKCZiYWNrb2ZmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChUQ1JfNChfX2ttcF9udGgpID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDogX19rbXBfeHByb2MpKSB7ICAgICAgICAgICAgIFwKKyAgICAgICAgICBLTVBfWUlFTEQoVFJVRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIEtNUF9ZSUVMRF9TUElOKHNwaW5zKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfRlNZTkNfQUNRVUlSRUQobCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworLy8gRmFzdC1wYXRoIHRlc3QgdGFzIGxvY2sKKyNkZWZpbmUgS01QX1RFU1RfVEFTX0xPQ0sobG9jaywgZ3RpZCwgcmMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGttcF90YXNfbG9ja190ICpsID0gKGttcF90YXNfbG9ja190ICopbG9jazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByYyA9IGwtPmxrLnBvbGwgPT0gS01QX0xPQ0tfRlJFRSh0YXMpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoJihsLT5say5wb2xsKSwgS01QX0xPQ0tfRlJFRSh0YXMpLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9MT0NLX0JVU1koZ3RpZCArIDEsIHRhcykpOyAgICAgICAgICAgIFwKKyAgfQorCisvLyBGYXN0LXBhdGggcmVsZWFzZSB0YXMgbG9jaworI2RlZmluZSBLTVBfUkVMRUFTRV9UQVNfTE9DSyhsb2NrLCBndGlkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVENXXzQoKChrbXBfdGFzX2xvY2tfdCAqKWxvY2spLT5say5wb2xsLCBLTVBfTE9DS19GUkVFKHRhcykpOyAgICAgICAgICAgICAgXAorICAgIEtNUF9NQigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjaWYgS01QX1VTRV9GVVRFWAorCisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpZm5kZWYgRlVURVhfV0FJVAorI2RlZmluZSBGVVRFWF9XQUlUIDAKKyNlbmRpZgorI2lmbmRlZiBGVVRFWF9XQUtFCisjZGVmaW5lIEZVVEVYX1dBS0UgMQorI2VuZGlmCisKKy8vIEZhc3QtcGF0aCBhY3F1aXJlIGZ1dGV4IGxvY2sKKyNkZWZpbmUgS01QX0FDUVVJUkVfRlVURVhfTE9DSyhsb2NrLCBndGlkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGttcF9mdXRleF9sb2NrX3QgKmZ0eCA9IChrbXBfZnV0ZXhfbG9ja190ICopbG9jazsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBrbXBfaW50MzIgZ3RpZF9jb2RlID0gKGd0aWQgKyAxKSA8PCAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX01CKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9GU1lOQ19QUkVQQVJFKGZ0eCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBrbXBfaW50MzIgcG9sbF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKChwb2xsX3ZhbCA9IEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQzMiggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICYoZnR4LT5say5wb2xsKSwgS01QX0xPQ0tfRlJFRShmdXRleCksICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfTE9DS19CVVNZKGd0aWRfY29kZSwgZnV0ZXgpKSkgIT0gS01QX0xPQ0tfRlJFRShmdXRleCkpIHsgICBcCisgICAgICBrbXBfaW50MzIgY29uZCA9IEtNUF9MT0NLX1NUUklQKHBvbGxfdmFsKSAmIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKCFjb25kKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCFLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUMzIoJihmdHgtPmxrLnBvbGwpLCBwb2xsX3ZhbCwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGxfdmFsIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0xPQ0tfQlVTWSgxLCBmdXRleCkpKSB7ICAgICAgIFwKKyAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwb2xsX3ZhbCB8PSBLTVBfTE9DS19CVVNZKDEsIGZ1dGV4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBrbXBfaW50MzIgcmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKChyYyA9IHN5c2NhbGwoX19OUl9mdXRleCwgJihmdHgtPmxrLnBvbGwpLCBGVVRFWF9XQUlULCBwb2xsX3ZhbCwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIDApKSAhPSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGd0aWRfY29kZSB8PSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9GU1lOQ19BQ1FVSVJFRChmdHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisvLyBGYXN0LXBhdGggdGVzdCBmdXRleCBsb2NrCisjZGVmaW5lIEtNUF9URVNUX0ZVVEVYX0xPQ0sobG9jaywgZ3RpZCwgcmMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBrbXBfZnV0ZXhfbG9ja190ICpmdHggPSAoa21wX2Z1dGV4X2xvY2tfdCAqKWxvY2s7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMigmKGZ0eC0+bGsucG9sbCksIEtNUF9MT0NLX0ZSRUUoZnV0ZXgpLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0xPQ0tfQlVTWShndGlkICsgMSA8PCAxLCBmdXRleCkpKSB7ICAgIFwKKyAgICAgIEtNUF9GU1lOQ19BQ1FVSVJFRChmdHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByYyA9IFRSVUU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJjID0gRkFMU0U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKy8vIEZhc3QtcGF0aCByZWxlYXNlIGZ1dGV4IGxvY2sKKyNkZWZpbmUgS01QX1JFTEVBU0VfRlVURVhfTE9DSyhsb2NrLCBndGlkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGttcF9mdXRleF9sb2NrX3QgKmZ0eCA9IChrbXBfZnV0ZXhfbG9ja190ICopbG9jazsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfTUIoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0ZTWU5DX1JFTEVBU0lORyhmdHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGttcF9pbnQzMiBwb2xsX3ZhbCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX1hDSEdfRklYRUQzMigmKGZ0eC0+bGsucG9sbCksIEtNUF9MT0NLX0ZSRUUoZnV0ZXgpKTsgICAgICAgICAgICAgICBcCisgICAgaWYgKEtNUF9MT0NLX1NUUklQKHBvbGxfdmFsKSAmIDEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc3lzY2FsbChfX05SX2Z1dGV4LCAmKGZ0eC0+bGsucG9sbCksIEZVVEVYX1dBS0UsICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgS01QX0xPQ0tfQlVTWSgxLCBmdXRleCksIE5VTEwsIE5VTEwsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9NQigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfWUlFTEQoVENSXzQoX19rbXBfbnRoKSA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6IF9fa21wX3hwcm9jKSk7ICAgICAgICAgICAgXAorICB9CisKKyNlbmRpZiAvLyBLTVBfVVNFX0ZVVEVYCisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKK3N0YXRpYyBrbXBfdXNlcl9sb2NrX3AgX19rbXBfZ2V0X2NyaXRpY2FsX3NlY3Rpb25fcHRyKGttcF9jcml0aWNhbF9uYW1lICpjcml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRfdCBjb25zdCAqbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGd0aWQpIHsKKyAga21wX3VzZXJfbG9ja19wICpsY2tfcHAgPSAoa21wX3VzZXJfbG9ja19wICopY3JpdDsKKworICAvLyBCZWNhdXNlIG9mIHRoZSBkb3VibGUtY2hlY2ssIHRoZSBmb2xsb3dpbmcgbG9hZCBkb2Vzbid0IG5lZWQgdG8gYmUgdm9sYXRpbGUKKyAga21wX3VzZXJfbG9ja19wIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApVENSX1BUUigqbGNrX3BwKTsKKworICBpZiAobGNrID09IE5VTEwpIHsKKyAgICB2b2lkICppZHg7CisKKyAgICAvLyBBbGxvY2F0ZSAmIGluaXRpYWxpemUgdGhlIGxvY2suCisgICAgLy8gUmVtZW1iZXIgYWxsb2MnZWQgbG9ja3MgaW4gdGFibGUgaW4gb3JkZXIgdG8gZnJlZSB0aGVtIGluIF9fa21wX2NsZWFudXAoKQorICAgIGxjayA9IF9fa21wX3VzZXJfbG9ja19hbGxvY2F0ZSgmaWR4LCBndGlkLCBrbXBfbGZfY3JpdGljYWxfc2VjdGlvbik7CisgICAgX19rbXBfaW5pdF91c2VyX2xvY2tfd2l0aF9jaGVja3MobGNrKTsKKyAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uKGxjaywgbG9jKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2NyaXRpY2FsX2NyZWF0aW5nKGxjayk7CisvLyBfX2ttcF9pdHRfY3JpdGljYWxfY3JlYXRpbmcoKSBzaG91bGQgYmUgY2FsbGVkICpiZWZvcmUqIHRoZSBmaXJzdCB1c2FnZQorLy8gb2YgdW5kZXJseWluZyBsb2NrLiBJdCBpcyB0aGUgb25seSBwbGFjZSB3aGVyZSB3ZSBjYW4gZ3VhcmFudGVlIGl0LiBUaGVyZQorLy8gYXJlIGNoYW5jZXMgdGhlIGxvY2sgd2lsbCBkZXN0cm95ZWQgd2l0aCBubyB1c2FnZSwgYnV0IGl0IGlzIG5vdCBhCisvLyBwcm9ibGVtLCBiZWNhdXNlIHRoaXMgaXMgbm90IHJlYWwgZXZlbnQgc2VlbiBieSB1c2VyIGJ1dCByYXRoZXIgc2V0dGluZworLy8gbmFtZSBmb3Igb2JqZWN0IChsb2NrKS4gU2VlIG1vcmUgZGV0YWlscyBpbiBrbXBfaXR0LmguCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgLy8gVXNlIGEgY21weGNoZyBpbnN0cnVjdGlvbiB0byBzbGFtIHRoZSBzdGFydCBvZiB0aGUgY3JpdGljYWwgc2VjdGlvbiB3aXRoCisgICAgLy8gdGhlIGxvY2sgcG9pbnRlci4gIElmIGFub3RoZXIgdGhyZWFkIGJlYXQgdXMgdG8gaXQsIGRlYWxsb2NhdGUgdGhlIGxvY2ssCisgICAgLy8gYW5kIHVzZSB0aGUgbG9jayB0aGF0IHRoZSBvdGhlciB0aHJlYWQgYWxsb2NhdGVkLgorICAgIGludCBzdGF0dXMgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKGxja19wcCwgMCwgbGNrKTsKKworICAgIGlmIChzdGF0dXMgPT0gMCkgeworLy8gRGVhbGxvY2F0ZSB0aGUgbG9jayBhbmQgcmVsb2FkIHRoZSB2YWx1ZS4KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICBfX2ttcF9pdHRfY3JpdGljYWxfZGVzdHJveWVkKGxjayk7CisvLyBMZXQgSVRUIGtub3cgdGhlIGxvY2sgaXMgZGVzdHJveWVkIGFuZCB0aGUgc2FtZSBtZW1vcnkgbG9jYXRpb24gbWF5IGJlIHJldXNlZAorLy8gZm9yIGFub3RoZXIgcHVycG9zZS4KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja193aXRoX2NoZWNrcyhsY2spOworICAgICAgX19rbXBfdXNlcl9sb2NrX2ZyZWUoJmlkeCwgZ3RpZCwgbGNrKTsKKyAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApVENSX1BUUigqbGNrX3BwKTsKKyAgICAgIEtNUF9ERUJVR19BU1NFUlQobGNrICE9IE5VTEwpOworICAgIH0KKyAgfQorICByZXR1cm4gbGNrOworfQorCisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KK0BwYXJhbSBnbG9iYWxfdGlkICBnbG9iYWwgdGhyZWFkIG51bWJlciAuCitAcGFyYW0gY3JpdCBpZGVudGl0eSBvZiB0aGUgY3JpdGljYWwgc2VjdGlvbi4gVGhpcyBjb3VsZCBiZSBhIHBvaW50ZXIgdG8gYSBsb2NrCithc3NvY2lhdGVkIHdpdGggdGhlIGNyaXRpY2FsIHNlY3Rpb24sIG9yIHNvbWUgb3RoZXIgc3VpdGFibHkgdW5pcXVlIHZhbHVlLgorCitFbnRlciBjb2RlIHByb3RlY3RlZCBieSBhIGBjcml0aWNhbGAgY29uc3RydWN0LgorVGhpcyBmdW5jdGlvbiBibG9ja3MgdW50aWwgdGhlIGV4ZWN1dGluZyB0aHJlYWQgY2FuIGVudGVyIHRoZSBjcml0aWNhbCBzZWN0aW9uLgorKi8KK3ZvaWQgX19rbXBjX2NyaXRpY2FsKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsCisgICAgICAgICAgICAgICAgICAgICBrbXBfY3JpdGljYWxfbmFtZSAqY3JpdCkgeworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgIF9fa21wY19jcml0aWNhbF93aXRoX2hpbnQobG9jLCBnbG9iYWxfdGlkLCBjcml0LCBvbXBfbG9ja19oaW50X25vbmUpOworI2Vsc2UKKyAgS01QX0NPVU5UX0JMT0NLKE9NUF9DUklUSUNBTCk7CisgIEtNUF9USU1FX1BBUlRJVElPTkVEX0JMT0NLKAorICAgICAgT01QX2NyaXRpY2FsX3dhaXQpOyAvKiBUaW1lIHNwZW50IHdhaXRpbmcgdG8gZW50ZXIgdGhlIGNyaXRpY2FsIHNlY3Rpb24gKi8KKyAga21wX3VzZXJfbG9ja19wIGxjazsKKworICBLQ19UUkFDRSgxMCwgKCJfX2ttcGNfY3JpdGljYWw6IGNhbGxlZCBUIyVkXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgLy8gVE9ETzogYWRkIFRIUl9PVkhEX1NUQVRFCisKKyAgS01QX0NIRUNLX1VTRVJfTE9DS19JTklUKCk7CisKKyAgaWYgKChfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMpICYmCisgICAgICAoc2l6ZW9mKGxjay0+dGFzLmxrLnBvbGwpIDw9IE9NUF9DUklUSUNBTF9TSVpFKSkgeworICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApY3JpdDsKKyAgfQorI2lmIEtNUF9VU0VfRlVURVgKKyAgZWxzZSBpZiAoKF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4KSAmJgorICAgICAgICAgICAoc2l6ZW9mKGxjay0+ZnV0ZXgubGsucG9sbCkgPD0gT01QX0NSSVRJQ0FMX1NJWkUpKSB7CisgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCljcml0OworICB9CisjZW5kaWYKKyAgZWxzZSB7IC8vIHRpY2tldCwgcXVldWluZyBvciBkcmRwYQorICAgIGxjayA9IF9fa21wX2dldF9jcml0aWNhbF9zZWN0aW9uX3B0cihjcml0LCBsb2MsIGdsb2JhbF90aWQpOworICB9CisKKyAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykKKyAgICBfX2ttcF9wdXNoX3N5bmMoZ2xvYmFsX3RpZCwgY3RfY3JpdGljYWwsIGxvYywgbGNrKTsKKworLy8gc2luY2UgdGhlIGNyaXRpY2FsIGRpcmVjdGl2ZSBiaW5kcyB0byBhbGwgdGhyZWFkcywgbm90IGp1c3QgdGhlIGN1cnJlbnQKKy8vIHRlYW0gd2UgaGF2ZSB0byBjaGVjayB0aGlzIGV2ZW4gaWYgd2UgYXJlIGluIGEgc2VyaWFsaXplZCB0ZWFtLgorLy8gYWxzbywgZXZlbiBpZiB3ZSBhcmUgdGhlIHViZXIgdGhyZWFkLCB3ZSBzdGlsbCBoYXZlIHRvIGNvbmR1Y3QgdGhlIGxvY2ssCisvLyBhcyB3ZSBoYXZlIHRvIGNvbnRlbmQgd2l0aCBzaWJsaW5nIHRocmVhZHMuCisKKyNpZiBVU0VfSVRUX0JVSUxECisgIF9fa21wX2l0dF9jcml0aWNhbF9hY3F1aXJpbmcobGNrKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgIC8vIFZhbHVlIG9mICdjcml0JyBzaG91bGQgYmUgZ29vZCBmb3IgdXNpbmcgYXMgYSBjcml0aWNhbF9pZCBvZiB0aGUgY3JpdGljYWwKKyAgLy8gc2VjdGlvbiBkaXJlY3RpdmUuCisgIF9fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKGxjaywgZ2xvYmFsX3RpZCk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgIF9fa21wX2l0dF9jcml0aWNhbF9hY3F1aXJlZChsY2spOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICBLTVBfU1RBUlRfRVhQTElDSVRfVElNRVIoT01QX2NyaXRpY2FsKTsKKyAgS0FfVFJBQ0UoMTUsICgiX19rbXBjX2NyaXRpY2FsOiBkb25lIFQjJWRcbiIsIGdsb2JhbF90aWQpKTsKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworfQorCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworLy8gQ29udmVydHMgdGhlIGdpdmVuIGhpbnQgdG8gYW4gaW50ZXJuYWwgbG9jayBpbXBsZW1lbnRhdGlvbgorc3RhdGljIF9fZm9yY2VpbmxpbmUga21wX2R5bmFfbG9ja3NlcV90IF9fa21wX21hcF9oaW50X3RvX2xvY2sodWludHB0cl90IGhpbnQpIHsKKyNpZiBLTVBfVVNFX1RTWAorI2RlZmluZSBLTVBfVFNYX0xPQ0soc2VxKSBsb2Nrc2VxXyMjc2VxCisjZWxzZQorI2RlZmluZSBLTVBfVFNYX0xPQ0soc2VxKSBfX2ttcF91c2VyX2xvY2tfc2VxCisjZW5kaWYKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyNkZWZpbmUgS01QX0NQVUlORk9fUlRNIChfX2ttcF9jcHVpbmZvLnJ0bSkKKyNlbHNlCisjZGVmaW5lIEtNUF9DUFVJTkZPX1JUTSAwCisjZW5kaWYKKworICAvLyBIaW50cyB0aGF0IGRvIG5vdCByZXF1aXJlIGZ1cnRoZXIgbG9naWMKKyAgaWYgKGhpbnQgJiBrbXBfbG9ja19oaW50X2hsZSkKKyAgICByZXR1cm4gS01QX1RTWF9MT0NLKGhsZSk7CisgIGlmIChoaW50ICYga21wX2xvY2tfaGludF9ydG0pCisgICAgcmV0dXJuIEtNUF9DUFVJTkZPX1JUTSA/IEtNUF9UU1hfTE9DSyhydG0pIDogX19rbXBfdXNlcl9sb2NrX3NlcTsKKyAgaWYgKGhpbnQgJiBrbXBfbG9ja19oaW50X2FkYXB0aXZlKQorICAgIHJldHVybiBLTVBfQ1BVSU5GT19SVE0gPyBLTVBfVFNYX0xPQ0soYWRhcHRpdmUpIDogX19rbXBfdXNlcl9sb2NrX3NlcTsKKworICAvLyBSdWxlIG91dCBjb25mbGljdGluZyBoaW50cyBmaXJzdCBieSByZXR1cm5pbmcgdGhlIGRlZmF1bHQgbG9jaworICBpZiAoKGhpbnQgJiBvbXBfbG9ja19oaW50X2NvbnRlbmRlZCkgJiYgKGhpbnQgJiBvbXBfbG9ja19oaW50X3VuY29udGVuZGVkKSkKKyAgICByZXR1cm4gX19rbXBfdXNlcl9sb2NrX3NlcTsKKyAgaWYgKChoaW50ICYgb21wX2xvY2tfaGludF9zcGVjdWxhdGl2ZSkgJiYKKyAgICAgIChoaW50ICYgb21wX2xvY2tfaGludF9ub25zcGVjdWxhdGl2ZSkpCisgICAgcmV0dXJuIF9fa21wX3VzZXJfbG9ja19zZXE7CisKKyAgLy8gRG8gbm90IGV2ZW4gY29uc2lkZXIgc3BlY3VsYXRpb24gd2hlbiBpdCBhcHBlYXJzIHRvIGJlIGNvbnRlbmRlZAorICBpZiAoaGludCAmIG9tcF9sb2NrX2hpbnRfY29udGVuZGVkKQorICAgIHJldHVybiBsb2Nrc2VxX3F1ZXVpbmc7CisKKyAgLy8gVW5jb250ZW5kZWQgbG9jayB3aXRob3V0IHNwZWN1bGF0aW9uCisgIGlmICgoaGludCAmIG9tcF9sb2NrX2hpbnRfdW5jb250ZW5kZWQpICYmICEoaGludCAmIG9tcF9sb2NrX2hpbnRfc3BlY3VsYXRpdmUpKQorICAgIHJldHVybiBsb2Nrc2VxX3RhczsKKworICAvLyBITEUgbG9jayBmb3Igc3BlY3VsYXRpb24KKyAgaWYgKGhpbnQgJiBvbXBfbG9ja19oaW50X3NwZWN1bGF0aXZlKQorICAgIHJldHVybiBLTVBfVFNYX0xPQ0soaGxlKTsKKworICByZXR1cm4gX19rbXBfdXNlcl9sb2NrX3NlcTsKK30KKworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KK0BwYXJhbSBnbG9iYWxfdGlkICBnbG9iYWwgdGhyZWFkIG51bWJlci4KK0BwYXJhbSBjcml0IGlkZW50aXR5IG9mIHRoZSBjcml0aWNhbCBzZWN0aW9uLiBUaGlzIGNvdWxkIGJlIGEgcG9pbnRlciB0byBhIGxvY2sKK2Fzc29jaWF0ZWQgd2l0aCB0aGUgY3JpdGljYWwgc2VjdGlvbiwgb3Igc29tZSBvdGhlciBzdWl0YWJseSB1bmlxdWUgdmFsdWUuCitAcGFyYW0gaGludCB0aGUgbG9jayBoaW50LgorCitFbnRlciBjb2RlIHByb3RlY3RlZCBieSBhIGBjcml0aWNhbGAgY29uc3RydWN0IHdpdGggYSBoaW50LiBUaGUgaGludCB2YWx1ZSBpcwordXNlZCB0byBzdWdnZXN0IGEgbG9jayBpbXBsZW1lbnRhdGlvbi4gVGhpcyBmdW5jdGlvbiBibG9ja3MgdW50aWwgdGhlIGV4ZWN1dGluZwordGhyZWFkIGNhbiBlbnRlciB0aGUgY3JpdGljYWwgc2VjdGlvbiB1bmxlc3MgdGhlIGhpbnQgc3VnZ2VzdHMgdXNlIG9mCitzcGVjdWxhdGl2ZSBleGVjdXRpb24gYW5kIHRoZSBoYXJkd2FyZSBzdXBwb3J0cyBpdC4KKyovCit2b2lkIF9fa21wY19jcml0aWNhbF93aXRoX2hpbnQoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY3JpdGljYWxfbmFtZSAqY3JpdCwgdWludHB0cl90IGhpbnQpIHsKKyAgS01QX0NPVU5UX0JMT0NLKE9NUF9DUklUSUNBTCk7CisgIGttcF91c2VyX2xvY2tfcCBsY2s7CisKKyAgS0NfVFJBQ0UoMTAsICgiX19rbXBjX2NyaXRpY2FsOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCkpOworCisgIGttcF9keW5hX2xvY2tfdCAqbGsgPSAoa21wX2R5bmFfbG9ja190ICopY3JpdDsKKyAgLy8gQ2hlY2sgaWYgaXQgaXMgaW5pdGlhbGl6ZWQuCisgIGlmICgqbGsgPT0gMCkgeworICAgIGttcF9keW5hX2xvY2tzZXFfdCBsY2tzZXEgPSBfX2ttcF9tYXBfaGludF90b19sb2NrKGhpbnQpOworICAgIGlmIChLTVBfSVNfRF9MT0NLKGxja3NlcSkpIHsKKyAgICAgIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMigodm9sYXRpbGUga21wX2ludDMyICopY3JpdCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfR0VUX0RfVEFHKGxja3NlcSkpOworICAgIH0gZWxzZSB7CisgICAgICBfX2ttcF9pbml0X2luZGlyZWN0X2NzcHRyKGNyaXQsIGxvYywgZ2xvYmFsX3RpZCwgS01QX0dFVF9JX1RBRyhsY2tzZXEpKTsKKyAgICB9CisgIH0KKyAgLy8gQnJhbmNoIGZvciBhY2Nlc3NpbmcgdGhlIGFjdHVhbCBsb2NrIG9iamVjdCBhbmQgc2V0IG9wZXJhdGlvbi4gVGhpcworICAvLyBicmFuY2hpbmcgaXMgaW5ldml0YWJsZSBzaW5jZSB0aGlzIGxvY2sgaW5pdGlhbGl6YXRpb24gZG9lcyBub3QgZm9sbG93IHRoZQorICAvLyBub3JtYWwgZGlzcGF0Y2ggcGF0aCAobG9jayB0YWJsZSBpcyBub3QgdXNlZCkuCisgIGlmIChLTVBfRVhUUkFDVF9EX1RBRyhsaykgIT0gMCkgeworICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApbGs7CisgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgX19rbXBfcHVzaF9zeW5jKGdsb2JhbF90aWQsIGN0X2NyaXRpY2FsLCBsb2MsIGxjaywKKyAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tYXBfaGludF90b19sb2NrKGhpbnQpKTsKKyAgICB9CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9jcml0aWNhbF9hY3F1aXJpbmcobGNrKTsKKyNlbmRpZgorI2lmIEtNUF9VU0VfSU5MSU5FRF9UQVMKKyAgICBpZiAoX19rbXBfdXNlcl9sb2NrX3NlcSA9PSBsb2Nrc2VxX3RhcyAmJiAhX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICBLTVBfQUNRVUlSRV9UQVNfTE9DSyhsY2ssIGdsb2JhbF90aWQpOworICAgIH0gZWxzZQorI2VsaWYgS01QX1VTRV9JTkxJTkVEX0ZVVEVYCisgICAgaWYgKF9fa21wX3VzZXJfbG9ja19zZXEgPT0gbG9ja3NlcV9mdXRleCAmJiAhX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICBLTVBfQUNRVUlSRV9GVVRFWF9MT0NLKGxjaywgZ2xvYmFsX3RpZCk7CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICBLTVBfRF9MT0NLX0ZVTkMobGssIHNldCkobGssIGdsb2JhbF90aWQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBrbXBfaW5kaXJlY3RfbG9ja190ICppbGsgPSAqKChrbXBfaW5kaXJlY3RfbG9ja190ICoqKWxrKTsKKyAgICBsY2sgPSBpbGstPmxvY2s7CisgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgX19rbXBfcHVzaF9zeW5jKGdsb2JhbF90aWQsIGN0X2NyaXRpY2FsLCBsb2MsIGxjaywKKyAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tYXBfaGludF90b19sb2NrKGhpbnQpKTsKKyAgICB9CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9jcml0aWNhbF9hY3F1aXJpbmcobGNrKTsKKyNlbmRpZgorICAgIEtNUF9JX0xPQ0tfRlVOQyhpbGssIHNldCkobGNrLCBnbG9iYWxfdGlkKTsKKyAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICBfX2ttcF9pdHRfY3JpdGljYWxfYWNxdWlyZWQobGNrKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgS01QX1BVU0hfUEFSVElUSU9ORURfVElNRVIoT01QX2NyaXRpY2FsKTsKKyAgS0FfVFJBQ0UoMTUsICgiX19rbXBjX2NyaXRpY2FsOiBkb25lIFQjJWRcbiIsIGdsb2JhbF90aWQpKTsKK30gLy8gX19rbXBjX2NyaXRpY2FsX3dpdGhfaGludAorCisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KK0BwYXJhbSBnbG9iYWxfdGlkICBnbG9iYWwgdGhyZWFkIG51bWJlciAuCitAcGFyYW0gY3JpdCBpZGVudGl0eSBvZiB0aGUgY3JpdGljYWwgc2VjdGlvbi4gVGhpcyBjb3VsZCBiZSBhIHBvaW50ZXIgdG8gYSBsb2NrCithc3NvY2lhdGVkIHdpdGggdGhlIGNyaXRpY2FsIHNlY3Rpb24sIG9yIHNvbWUgb3RoZXIgc3VpdGFibHkgdW5pcXVlIHZhbHVlLgorCitMZWF2ZSBhIGNyaXRpY2FsIHNlY3Rpb24sIHJlbGVhc2luZyBhbnkgbG9jayB0aGF0IHdhcyBoZWxkIGR1cmluZyBpdHMgZXhlY3V0aW9uLgorKi8KK3ZvaWQgX19rbXBjX2VuZF9jcml0aWNhbChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jcml0aWNhbF9uYW1lICpjcml0KSB7CisgIGttcF91c2VyX2xvY2tfcCBsY2s7CisKKyAgS0NfVFJBQ0UoMTAsICgiX19rbXBjX2VuZF9jcml0aWNhbDogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQpKTsKKworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgIGlmIChLTVBfSVNfRF9MT0NLKF9fa21wX3VzZXJfbG9ja19zZXEpKSB7CisgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCljcml0OworICAgIEtNUF9BU1NFUlQobGNrICE9IE5VTEwpOworICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgIF9fa21wX3BvcF9zeW5jKGdsb2JhbF90aWQsIGN0X2NyaXRpY2FsLCBsb2MpOworICAgIH0KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2NyaXRpY2FsX3JlbGVhc2luZyhsY2spOworI2VuZGlmCisjaWYgS01QX1VTRV9JTkxJTkVEX1RBUworICAgIGlmIChfX2ttcF91c2VyX2xvY2tfc2VxID09IGxvY2tzZXFfdGFzICYmICFfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgIEtNUF9SRUxFQVNFX1RBU19MT0NLKGxjaywgZ2xvYmFsX3RpZCk7CisgICAgfSBlbHNlCisjZWxpZiBLTVBfVVNFX0lOTElORURfRlVURVgKKyAgICBpZiAoX19rbXBfdXNlcl9sb2NrX3NlcSA9PSBsb2Nrc2VxX2Z1dGV4ICYmICFfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgIEtNUF9SRUxFQVNFX0ZVVEVYX0xPQ0sobGNrLCBnbG9iYWxfdGlkKTsKKyAgICB9IGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgIEtNUF9EX0xPQ0tfRlVOQyhsY2ssIHVuc2V0KSgoa21wX2R5bmFfbG9ja190ICopbGNrLCBnbG9iYWxfdGlkKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAga21wX2luZGlyZWN0X2xvY2tfdCAqaWxrID0KKyAgICAgICAgKGttcF9pbmRpcmVjdF9sb2NrX3QgKilUQ1JfUFRSKCooKGttcF9pbmRpcmVjdF9sb2NrX3QgKiopY3JpdCkpOworICAgIEtNUF9BU1NFUlQoaWxrICE9IE5VTEwpOworICAgIGxjayA9IGlsay0+bG9jazsKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICBfX2ttcF9wb3Bfc3luYyhnbG9iYWxfdGlkLCBjdF9jcml0aWNhbCwgbG9jKTsKKyAgICB9CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9jcml0aWNhbF9yZWxlYXNpbmcobGNrKTsKKyNlbmRpZgorICAgIEtNUF9JX0xPQ0tfRlVOQyhpbGssIHVuc2V0KShsY2ssIGdsb2JhbF90aWQpOworICB9CisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgaWYgKChfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMpICYmCisgICAgICAoc2l6ZW9mKGxjay0+dGFzLmxrLnBvbGwpIDw9IE9NUF9DUklUSUNBTF9TSVpFKSkgeworICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApY3JpdDsKKyAgfQorI2lmIEtNUF9VU0VfRlVURVgKKyAgZWxzZSBpZiAoKF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4KSAmJgorICAgICAgICAgICAoc2l6ZW9mKGxjay0+ZnV0ZXgubGsucG9sbCkgPD0gT01QX0NSSVRJQ0FMX1NJWkUpKSB7CisgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCljcml0OworICB9CisjZW5kaWYKKyAgZWxzZSB7IC8vIHRpY2tldCwgcXVldWluZyBvciBkcmRwYQorICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApVENSX1BUUigqKChrbXBfdXNlcl9sb2NrX3AgKiljcml0KSk7CisgIH0KKworICBLTVBfQVNTRVJUKGxjayAhPSBOVUxMKTsKKworICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKQorICAgIF9fa21wX3BvcF9zeW5jKGdsb2JhbF90aWQsIGN0X2NyaXRpY2FsLCBsb2MpOworCisjaWYgVVNFX0lUVF9CVUlMRAorICBfX2ttcF9pdHRfY3JpdGljYWxfcmVsZWFzaW5nKGxjayk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAvLyBWYWx1ZSBvZiAnY3JpdCcgc2hvdWxkIGJlIGdvb2QgZm9yIHVzaW5nIGFzIGEgY3JpdGljYWxfaWQgb2YgdGhlIGNyaXRpY2FsCisgIC8vIHNlY3Rpb24gZGlyZWN0aXZlLgorICBfX2ttcF9yZWxlYXNlX3VzZXJfbG9ja193aXRoX2NoZWNrcyhsY2ssIGdsb2JhbF90aWQpOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfQkxBTUUKKyAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3JlbGVhc2VfY3JpdGljYWwpKSB7CisgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3JlbGVhc2VfY3JpdGljYWwpKCh1aW50NjRfdClsY2spOworICB9CisjZW5kaWYKKworI2VuZGlmIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgIEtNUF9QT1BfUEFSVElUSU9ORURfVElNRVIoKTsKKyAgS0FfVFJBQ0UoMTUsICgiX19rbXBjX2VuZF9jcml0aWNhbDogZG9uZSBUIyVkXG4iLCBnbG9iYWxfdGlkKSk7Cit9CisKKy8qIQorQGluZ3JvdXAgU1lOQ0hST05JWkFUSU9OCitAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgdGhyZWFkIGlkLgorQHJldHVybiBvbmUgaWYgdGhlIHRocmVhZCBzaG91bGQgZXhlY3V0ZSB0aGUgbWFzdGVyIGJsb2NrLCB6ZXJvIG90aGVyd2lzZQorCitTdGFydCBleGVjdXRpb24gb2YgYSBjb21iaW5lZCBiYXJyaWVyIGFuZCBtYXN0ZXIuIFRoZSBiYXJyaWVyIGlzIGV4ZWN1dGVkIGluc2lkZQordGhpcyBmdW5jdGlvbi4KKyovCitrbXBfaW50MzIgX19rbXBjX2JhcnJpZXJfbWFzdGVyKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQpIHsKKyAgaW50IHN0YXR1czsKKworICBLQ19UUkFDRSgxMCwgKCJfX2ttcGNfYmFycmllcl9tYXN0ZXI6IGNhbGxlZCBUIyVkXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgaWYgKCFUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkKKyAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykKKyAgICBfX2ttcF9jaGVja19iYXJyaWVyKGdsb2JhbF90aWQsIGN0X2JhcnJpZXIsIGxvYyk7CisKKyNpZiBVU0VfSVRUX05PVElGWQorICBfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdLT50aC50aF9pZGVudCA9IGxvYzsKKyNlbmRpZgorICBzdGF0dXMgPSBfX2ttcF9iYXJyaWVyKGJzX3BsYWluX2JhcnJpZXIsIGdsb2JhbF90aWQsIFRSVUUsIDAsIE5VTEwsIE5VTEwpOworCisgIHJldHVybiAoc3RhdHVzICE9IDApID8gMCA6IDE7Cit9CisKKy8qIQorQGluZ3JvdXAgU1lOQ0hST05JWkFUSU9OCitAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgdGhyZWFkIGlkLgorCitDb21wbGV0ZSB0aGUgZXhlY3V0aW9uIG9mIGEgY29tYmluZWQgYmFycmllciBhbmQgbWFzdGVyLiBUaGlzIGZ1bmN0aW9uIHNob3VsZAorb25seSBiZSBjYWxsZWQgYXQgdGhlIGNvbXBsZXRpb24gb2YgdGhlIDx0dD5tYXN0ZXI8L3R0PiBjb2RlLiBPdGhlciB0aHJlYWRzIHdpbGwKK3N0aWxsIGJlIHdhaXRpbmcgYXQgdGhlIGJhcnJpZXIgYW5kIHRoaXMgY2FsbCByZWxlYXNlcyB0aGVtLgorKi8KK3ZvaWQgX19rbXBjX2VuZF9iYXJyaWVyX21hc3RlcihpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkKSB7CisgIEtDX1RSQUNFKDEwLCAoIl9fa21wY19lbmRfYmFycmllcl9tYXN0ZXI6IGNhbGxlZCBUIyVkXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgX19rbXBfZW5kX3NwbGl0X2JhcnJpZXIoYnNfcGxhaW5fYmFycmllciwgZ2xvYmFsX3RpZCk7Cit9CisKKy8qIQorQGluZ3JvdXAgU1lOQ0hST05JWkFUSU9OCitAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgdGhyZWFkIGlkLgorQHJldHVybiBvbmUgaWYgdGhlIHRocmVhZCBzaG91bGQgZXhlY3V0ZSB0aGUgbWFzdGVyIGJsb2NrLCB6ZXJvIG90aGVyd2lzZQorCitTdGFydCBleGVjdXRpb24gb2YgYSBjb21iaW5lZCBiYXJyaWVyIGFuZCBtYXN0ZXIobm93YWl0KSBjb25zdHJ1Y3QuCitUaGUgYmFycmllciBpcyBleGVjdXRlZCBpbnNpZGUgdGhpcyBmdW5jdGlvbi4KK1RoZXJlIGlzIG5vIGVxdWl2YWxlbnQgImVuZCIgZnVuY3Rpb24sIHNpbmNlIHRoZQorKi8KK2ttcF9pbnQzMiBfX2ttcGNfYmFycmllcl9tYXN0ZXJfbm93YWl0KGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQpIHsKKyAga21wX2ludDMyIHJldDsKKworICBLQ19UUkFDRSgxMCwgKCJfX2ttcGNfYmFycmllcl9tYXN0ZXJfbm93YWl0OiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCkpOworCisgIGlmICghVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkpCisgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICBpZiAobG9jID09IDApIHsKKyAgICAgIEtNUF9XQVJOSU5HKENvbnN0cnVjdElkZW50SW52YWxpZCk7IC8vID8/PyBXaGF0IGRvZXMgaXQgbWVhbiBmb3IgdGhlIHVzZXI/CisgICAgfQorICAgIF9fa21wX2NoZWNrX2JhcnJpZXIoZ2xvYmFsX3RpZCwgY3RfYmFycmllciwgbG9jKTsKKyAgfQorCisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXS0+dGgudGhfaWRlbnQgPSBsb2M7CisjZW5kaWYKKyAgX19rbXBfYmFycmllcihic19wbGFpbl9iYXJyaWVyLCBnbG9iYWxfdGlkLCBGQUxTRSwgMCwgTlVMTCwgTlVMTCk7CisKKyAgcmV0ID0gX19rbXBjX21hc3Rlcihsb2MsIGdsb2JhbF90aWQpOworCisgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAvKiAgdGhlcmUncyBubyBfX2ttcGNfZW5kX21hc3RlciBjYWxsZWQ7IHNvIHRoZSAoc3RhdHMpICovCisgICAgLyogIGFjdGlvbnMgb2YgX19rbXBjX2VuZF9tYXN0ZXIgYXJlIGRvbmUgaGVyZSAgICAgICAgICAqLworCisgICAgaWYgKGdsb2JhbF90aWQgPCAwKSB7CisgICAgICBLTVBfV0FSTklORyhUaHJlYWRJZGVudEludmFsaWQpOworICAgIH0KKyAgICBpZiAocmV0KSB7CisgICAgICAvKiBvbmx5IG9uZSB0aHJlYWQgc2hvdWxkIGRvIHRoZSBwb3Agc2luY2Ugb25seSAqLworICAgICAgLyogb25lIGRpZCB0aGUgcHVzaCAoc2VlIF9fa21wY19tYXN0ZXIoKSkgICAgICAgKi8KKworICAgICAgX19rbXBfcG9wX3N5bmMoZ2xvYmFsX3RpZCwgY3RfbWFzdGVyLCBsb2MpOworICAgIH0KKyAgfQorCisgIHJldHVybiAocmV0KTsKK30KKworLyogVGhlIEJBUlJJRVIgZm9yIGEgU0lOR0xFIHByb2Nlc3Mgc2VjdGlvbiBpcyBhbHdheXMgZXhwbGljaXQgICAqLworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyCitAcmV0dXJuIE9uZSBpZiB0aGlzIHRocmVhZCBzaG91bGQgZXhlY3V0ZSB0aGUgc2luZ2xlIGNvbnN0cnVjdCwgemVybyBvdGhlcndpc2UuCisKK1Rlc3Qgd2hldGhlciB0byBleGVjdXRlIGEgPHR0PnNpbmdsZTwvdHQ+IGNvbnN0cnVjdC4KK1RoZXJlIGFyZSBubyBpbXBsaWNpdCBiYXJyaWVycyBpbiB0aGUgdHdvICJzaW5nbGUiIGNhbGxzLCByYXRoZXIgdGhlIGNvbXBpbGVyCitzaG91bGQgaW50cm9kdWNlIGFuIGV4cGxpY2l0IGJhcnJpZXIgaWYgaXQgaXMgcmVxdWlyZWQuCisqLworCitrbXBfaW50MzIgX19rbXBjX3NpbmdsZShpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkKSB7CisgIGttcF9pbnQzMiByYyA9IF9fa21wX2VudGVyX3NpbmdsZShnbG9iYWxfdGlkLCBsb2MsIFRSVUUpOworCisgIGlmIChyYykgeworICAgIC8vIFdlIGFyZSBnb2luZyB0byBleGVjdXRlIHRoZSBzaW5nbGUgc3RhdGVtZW50LCBzbyB3ZSBzaG91bGQgY291bnQgaXQuCisgICAgS01QX0NPVU5UX0JMT0NLKE9NUF9TSU5HTEUpOworICAgIEtNUF9QVVNIX1BBUlRJVElPTkVEX1RJTUVSKE9NUF9zaW5nbGUpOworICB9CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF07CisgIGttcF90ZWFtX3QgKnRlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgaW50IHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoZ2xvYmFsX3RpZCk7CisKKyAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgIGlmIChyYykgeworICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9zaW5nbGVfaW5fYmxvY2tfYmVnaW4pKSB7CisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9zaW5nbGVfaW5fYmxvY2tfYmVnaW4pKAorICAgICAgICAgICAgdGVhbS0+dC5vbXB0X3RlYW1faW5mby5wYXJhbGxlbF9pZCwKKyAgICAgICAgICAgIHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0ub21wdF90YXNrX2luZm8udGFza19pZCwKKyAgICAgICAgICAgIHRlYW0tPnQub21wdF90ZWFtX2luZm8ubWljcm90YXNrKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9zaW5nbGVfb3RoZXJzX2JlZ2luKSkgeworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfc2luZ2xlX290aGVyc19iZWdpbikoCisgICAgICAgICAgICB0ZWFtLT50Lm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkLAorICAgICAgICAgICAgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS5vbXB0X3Rhc2tfaW5mby50YXNrX2lkKTsKKyAgICAgIH0KKyAgICAgIHRoaXNfdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV93YWl0X3NpbmdsZTsKKyAgICB9CisgIH0KKyNlbmRpZgorCisgIHJldHVybiByYzsKK30KKworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyCisKK01hcmsgdGhlIGVuZCBvZiBhIDx0dD5zaW5nbGU8L3R0PiBjb25zdHJ1Y3QuICBUaGlzIGZ1bmN0aW9uIHNob3VsZAorb25seSBiZSBjYWxsZWQgYnkgdGhlIHRocmVhZCB0aGF0IGV4ZWN1dGVkIHRoZSBibG9jayBvZiBjb2RlIHByb3RlY3RlZAorYnkgdGhlIGBzaW5nbGVgIGNvbnN0cnVjdC4KKyovCit2b2lkIF9fa21wY19lbmRfc2luZ2xlKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQpIHsKKyAgX19rbXBfZXhpdF9zaW5nbGUoZ2xvYmFsX3RpZCk7CisgIEtNUF9QT1BfUEFSVElUSU9ORURfVElNRVIoKTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXTsKKyAga21wX3RlYW1fdCAqdGVhbSA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworICBpbnQgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChnbG9iYWxfdGlkKTsKKworICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfc2luZ2xlX2luX2Jsb2NrX2VuZCkpIHsKKyAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfc2luZ2xlX2luX2Jsb2NrX2VuZCkoCisgICAgICAgIHRlYW0tPnQub21wdF90ZWFtX2luZm8ucGFyYWxsZWxfaWQsCisgICAgICAgIHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0ub21wdF90YXNrX2luZm8udGFza19pZCk7CisgIH0KKyNlbmRpZgorfQorCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtIGxvYyBTb3VyY2UgbG9jYXRpb24KK0BwYXJhbSBnbG9iYWxfdGlkIEdsb2JhbCB0aHJlYWQgaWQKKworTWFyayB0aGUgZW5kIG9mIGEgc3RhdGljYWxseSBzY2hlZHVsZWQgbG9vcC4KKyovCit2b2lkIF9fa21wY19mb3Jfc3RhdGljX2ZpbmkoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkgeworICBLRV9UUkFDRSgxMCwgKCJfX2ttcGNfZm9yX3N0YXRpY19maW5pIGNhbGxlZCBUIyVkXG4iLCBnbG9iYWxfdGlkKSk7CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICBpZiAob21wdF9lbmFibGVkICYmIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9sb29wX2VuZCkpIHsKKyAgICBvbXB0X3RlYW1faW5mb190ICp0ZWFtX2luZm8gPSBfX29tcHRfZ2V0X3RlYW1pbmZvKDAsIE5VTEwpOworICAgIG9tcHRfdGFza19pbmZvX3QgKnRhc2tfaW5mbyA9IF9fb21wdF9nZXRfdGFza2luZm8oMCk7CisgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2xvb3BfZW5kKSh0ZWFtX2luZm8tPnBhcmFsbGVsX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza19pbmZvLT50YXNrX2lkKTsKKyAgfQorI2VuZGlmCisKKyAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykKKyAgICBfX2ttcF9wb3Bfd29ya3NoYXJlKGdsb2JhbF90aWQsIGN0X3BkbywgbG9jKTsKK30KKworLy8gVXNlciByb3V0aW5lcyB3aGljaCB0YWtlIEMtc3R5bGUgYXJndW1lbnRzIChjYWxsIGJ5IHZhbHVlKQorLy8gZGlmZmVyZW50IGZyb20gdGhlIEZvcnRyYW4gZXF1aXZhbGVudCByb3V0aW5lcworCit2b2lkIG9tcGNfc2V0X251bV90aHJlYWRzKGludCBhcmcpIHsKKyAgLy8gISEhISEgVE9ETzogY2hlY2sgdGhlIHBlci10YXNrIGJpbmRpbmcKKyAgX19rbXBfc2V0X251bV90aHJlYWRzKGFyZywgX19rbXBfZW50cnlfZ3RpZCgpKTsKK30KKwordm9pZCBvbXBjX3NldF9keW5hbWljKGludCBmbGFnKSB7CisgIGttcF9pbmZvX3QgKnRocmVhZDsKKworICAvKiBGb3IgdGhlIHRocmVhZC1wcml2YXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cm9scyAqLworICB0aHJlYWQgPSBfX2ttcF9lbnRyeV90aHJlYWQoKTsKKworICBfX2ttcF9zYXZlX2ludGVybmFsX2NvbnRyb2xzKHRocmVhZCk7CisKKyAgc2V0X19keW5hbWljKHRocmVhZCwgZmxhZyA/IFRSVUUgOiBGQUxTRSk7Cit9CisKK3ZvaWQgb21wY19zZXRfbmVzdGVkKGludCBmbGFnKSB7CisgIGttcF9pbmZvX3QgKnRocmVhZDsKKworICAvKiBGb3IgdGhlIHRocmVhZC1wcml2YXRlIGludGVybmFsIGNvbnRyb2xzIGltcGxlbWVudGF0aW9uICovCisgIHRocmVhZCA9IF9fa21wX2VudHJ5X3RocmVhZCgpOworCisgIF9fa21wX3NhdmVfaW50ZXJuYWxfY29udHJvbHModGhyZWFkKTsKKworICBzZXRfX25lc3RlZCh0aHJlYWQsIGZsYWcgPyBUUlVFIDogRkFMU0UpOworfQorCit2b2lkIG9tcGNfc2V0X21heF9hY3RpdmVfbGV2ZWxzKGludCBtYXhfYWN0aXZlX2xldmVscykgeworICAvKiBUTyBETyAqLworICAvKiB3ZSB3YW50IHBlci10YXNrIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJuYWwgY29udHJvbCAqLworCisgIC8qIEZvciB0aGUgcGVyLXRocmVhZCBpbnRlcm5hbCBjb250cm9scyBpbXBsZW1lbnRhdGlvbiAqLworICBfX2ttcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMoX19rbXBfZW50cnlfZ3RpZCgpLCBtYXhfYWN0aXZlX2xldmVscyk7Cit9CisKK3ZvaWQgb21wY19zZXRfc2NoZWR1bGUob21wX3NjaGVkX3Qga2luZCwgaW50IG1vZGlmaWVyKSB7CisgIC8vICEhISEhIFRPRE86IGNoZWNrIHRoZSBwZXItdGFzayBiaW5kaW5nCisgIF9fa21wX3NldF9zY2hlZHVsZShfX2ttcF9lbnRyeV9ndGlkKCksIChrbXBfc2NoZWRfdClraW5kLCBtb2RpZmllcik7Cit9CisKK2ludCBvbXBjX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKGludCBsZXZlbCkgeworICByZXR1cm4gX19rbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0oX19rbXBfZW50cnlfZ3RpZCgpLCBsZXZlbCk7Cit9CisKK2ludCBvbXBjX2dldF90ZWFtX3NpemUoaW50IGxldmVsKSB7CisgIHJldHVybiBfX2ttcF9nZXRfdGVhbV9zaXplKF9fa21wX2VudHJ5X2d0aWQoKSwgbGV2ZWwpOworfQorCit2b2lkIGttcGNfc2V0X3N0YWNrc2l6ZShpbnQgYXJnKSB7CisgIC8vIF9fa21wX2F1eF9zZXRfc3RhY2tzaXplIGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICBfX2ttcF9hdXhfc2V0X3N0YWNrc2l6ZShhcmcpOworfQorCit2b2lkIGttcGNfc2V0X3N0YWNrc2l6ZV9zKHNpemVfdCBhcmcpIHsKKyAgLy8gX19rbXBfYXV4X3NldF9zdGFja3NpemUgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgIF9fa21wX2F1eF9zZXRfc3RhY2tzaXplKGFyZyk7Cit9CisKK3ZvaWQga21wY19zZXRfYmxvY2t0aW1lKGludCBhcmcpIHsKKyAgaW50IGd0aWQsIHRpZDsKKyAga21wX2luZm9fdCAqdGhyZWFkOworCisgIGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgIHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCk7CisgIHRocmVhZCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoZ3RpZCk7CisKKyAgX19rbXBfYXV4X3NldF9ibG9ja3RpbWUoYXJnLCB0aHJlYWQsIHRpZCk7Cit9CisKK3ZvaWQga21wY19zZXRfbGlicmFyeShpbnQgYXJnKSB7CisgIC8vIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkoKGVudW0gbGlicmFyeV90eXBlKWFyZyk7Cit9CisKK3ZvaWQga21wY19zZXRfZGVmYXVsdHMoY2hhciBjb25zdCAqc3RyKSB7CisgIC8vIF9fa21wX2F1eF9zZXRfZGVmYXVsdHMgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgIF9fa21wX2F1eF9zZXRfZGVmYXVsdHMoc3RyLCBLTVBfU1RSTEVOKHN0cikpOworfQorCit2b2lkIGttcGNfc2V0X2Rpc3BfbnVtX2J1ZmZlcnMoaW50IGFyZykgeworICAvLyBpZ25vcmUgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gYmVjYXVzZSBzb21lIHRlYW1zIGhhdmUgYWxyZWFkeQorICAvLyBhbGxvY2F0ZWQgZGlzcGF0Y2ggYnVmZmVycworICBpZiAoX19rbXBfaW5pdF9zZXJpYWwgPT0gMCAmJiBhcmcgPiAwKQorICAgIF9fa21wX2Rpc3BhdGNoX251bV9idWZmZXJzID0gYXJnOworfQorCitpbnQga21wY19zZXRfYWZmaW5pdHlfbWFza19wcm9jKGludCBwcm9jLCB2b2lkICoqbWFzaykgeworI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgIHJldHVybiAtMTsKKyNlbHNlCisgIGlmICghVENSXzQoX19rbXBfaW5pdF9taWRkbGUpKSB7CisgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgfQorICByZXR1cm4gX19rbXBfYXV4X3NldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzayk7CisjZW5kaWYKK30KKworaW50IGttcGNfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKGludCBwcm9jLCB2b2lkICoqbWFzaykgeworI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgIHJldHVybiAtMTsKKyNlbHNlCisgIGlmICghVENSXzQoX19rbXBfaW5pdF9taWRkbGUpKSB7CisgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgfQorICByZXR1cm4gX19rbXBfYXV4X3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKTsKKyNlbmRpZgorfQorCitpbnQga21wY19nZXRfYWZmaW5pdHlfbWFza19wcm9jKGludCBwcm9jLCB2b2lkICoqbWFzaykgeworI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgIHJldHVybiAtMTsKKyNlbHNlCisgIGlmICghVENSXzQoX19rbXBfaW5pdF9taWRkbGUpKSB7CisgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgfQorICByZXR1cm4gX19rbXBfYXV4X2dldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzayk7CisjZW5kaWYKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIQorQGluZ3JvdXAgVEhSRUFEUFJJVkFURQorQHBhcmFtIGxvYyAgICAgICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBndGlkICAgICAgZ2xvYmFsIHRocmVhZCBudW1iZXIKK0BwYXJhbSBjcHlfc2l6ZSAgc2l6ZSBvZiB0aGUgY3B5X2RhdGEgYnVmZmVyCitAcGFyYW0gY3B5X2RhdGEgIHBvaW50ZXIgdG8gZGF0YSB0byBiZSBjb3BpZWQKK0BwYXJhbSBjcHlfZnVuYyAgaGVscGVyIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGNvcHlpbmcgZGF0YQorQHBhcmFtIGRpZGl0ICAgICBmbGFnIHZhcmlhYmxlOiAxPXNpbmdsZSB0aHJlYWQ7IDA9bm90IHNpbmdsZSB0aHJlYWQKKworX19rbXBjX2NvcHlwcml2YXRlIGltcGxlbWVudHMgdGhlIGludGVyZmFjZSBmb3IgdGhlIHByaXZhdGUgZGF0YSBicm9hZGNhc3QKK25lZWRlZCBmb3IgdGhlIGNvcHlwcml2YXRlIGNsYXVzZSBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgcmVnaW9uIGluIGFuCitPcGVuTVA8c3VwPio8L3N1cD4gcHJvZ3JhbSAoYm90aCBDIGFuZCBGb3J0cmFuKS4KK0FsbCB0aHJlYWRzIHBhcnRpY2lwYXRpbmcgaW4gdGhlIHBhcmFsbGVsIHJlZ2lvbiBjYWxsIHRoaXMgcm91dGluZS4KK09uZSBvZiB0aGUgdGhyZWFkcyAoY2FsbGVkIHRoZSBzaW5nbGUgdGhyZWFkKSBzaG91bGQgaGF2ZSB0aGUgPHR0PmRpZGl0PC90dD4KK3ZhcmlhYmxlIHNldCB0byAxIGFuZCBhbGwgb3RoZXIgdGhyZWFkcyBzaG91bGQgaGF2ZSB0aGF0IHZhcmlhYmxlIHNldCB0byAwLgorQWxsIHRocmVhZHMgcGFzcyBhIHBvaW50ZXIgdG8gYSBkYXRhIGJ1ZmZlciAoY3B5X2RhdGEpIHRoYXQgdGhleSBoYXZlIGJ1aWx0LgorCitUaGUgT3Blbk1QIHNwZWNpZmljYXRpb24gZm9yYmlkcyB0aGUgdXNlIG9mIG5vd2FpdCBvbiB0aGUgc2luZ2xlIHJlZ2lvbiB3aGVuIGEKK2NvcHlwcml2YXRlIGNsYXVzZSBpcyBwcmVzZW50LiBIb3dldmVyLCBAcmVmIF9fa21wY19jb3B5cHJpdmF0ZSBpbXBsZW1lbnRzIGEKK2JhcnJpZXIgaW50ZXJuYWxseSB0byBhdm9pZCByYWNlIGNvbmRpdGlvbnMsIHNvIHRoZSBjb2RlIGdlbmVyYXRpb24gZm9yIHRoZQorc2luZ2xlIHJlZ2lvbiBzaG91bGQgYXZvaWQgZ2VuZXJhdGluZyBhIGJhcnJpZXIgYWZ0ZXIgdGhlIGNhbGwgdG8gQHJlZgorX19rbXBjX2NvcHlwcml2YXRlLgorCitUaGUgPHR0Pmd0aWQ8L3R0PiBwYXJhbWV0ZXIgaXMgdGhlIGdsb2JhbCB0aHJlYWQgaWQgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KK1RoZSA8dHQ+bG9jPC90dD4gcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCisKK0ludGVybmFsIGltcGxlbWVudGF0aW9uOiBUaGUgc2luZ2xlIHRocmVhZCB3aWxsIGZpcnN0IGNvcHkgaXRzIGRlc2NyaXB0b3IKK2FkZHJlc3MgKGNweV9kYXRhKSB0byBhIHRlYW0tcHJpdmF0ZSBsb2NhdGlvbiwgdGhlbiB0aGUgb3RoZXIgdGhyZWFkcyB3aWxsIGVhY2gKK2NhbGwgdGhlIGZ1bmN0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIHBhcmFtZXRlciBjcHlfZnVuYywgd2hpY2ggY2FycmllcyBvdXQgdGhlCitjb3B5IGJ5IGNvcHlpbmcgdGhlIGRhdGEgdXNpbmcgdGhlIGNweV9kYXRhIGJ1ZmZlci4KKworVGhlIGNweV9mdW5jIHJvdXRpbmUgdXNlZCBmb3IgdGhlIGNvcHkgYW5kIHRoZSBjb250ZW50cyBvZiB0aGUgZGF0YSBhcmVhIGRlZmluZWQKK2J5IGNweV9kYXRhIGFuZCBjcHlfc2l6ZSBtYXkgYmUgYnVpbHQgaW4gYW55IGZhc2hpb24gdGhhdCB3aWxsIGFsbG93IHRoZSBjb3B5Cit0byBiZSBkb25lLiBGb3IgaW5zdGFuY2UsIHRoZSBjcHlfZGF0YSBidWZmZXIgY2FuIGhvbGQgdGhlIGFjdHVhbCBkYXRhIHRvIGJlCitjb3BpZWQgb3IgaXQgbWF5IGhvbGQgYSBsaXN0IG9mIHBvaW50ZXJzIHRvIHRoZSBkYXRhLiBUaGUgY3B5X2Z1bmMgcm91dGluZSBtdXN0CitpbnRlcnByZXQgdGhlIGNweV9kYXRhIGJ1ZmZlciBhcHByb3ByaWF0ZWx5LgorCitUaGUgaW50ZXJmYWNlIHRvIGNweV9mdW5jIGlzIGFzIGZvbGxvd3M6CitAY29kZQordm9pZCBjcHlfZnVuYyggdm9pZCAqZGVzdGluYXRpb24sIHZvaWQgKnNvdXJjZSApCitAZW5kY29kZQord2hlcmUgdm9pZCAqZGVzdGluYXRpb24gaXMgdGhlIGNweV9kYXRhIHBvaW50ZXIgZm9yIHRoZSB0aHJlYWQgYmVpbmcgY29waWVkIHRvCithbmQgdm9pZCAqc291cmNlIGlzIHRoZSBjcHlfZGF0YSBwb2ludGVyIGZvciB0aGUgdGhyZWFkIGJlaW5nIGNvcGllZCBmcm9tLgorKi8KK3ZvaWQgX19rbXBjX2NvcHlwcml2YXRlKGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHNpemVfdCBjcHlfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNweV9kYXRhLCB2b2lkICgqY3B5X2Z1bmMpKHZvaWQgKiwgdm9pZCAqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBkaWRpdCkgeworICB2b2lkICoqZGF0YV9wdHI7CisKKyAgS0NfVFJBQ0UoMTAsICgiX19rbXBjX2NvcHlwcml2YXRlOiBjYWxsZWQgVCMlZFxuIiwgZ3RpZCkpOworCisgIEtNUF9NQigpOworCisgIGRhdGFfcHRyID0gJl9fa21wX3RlYW1fZnJvbV9ndGlkKGd0aWQpLT50LnRfY29weXByaXZfZGF0YTsKKworICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgaWYgKGxvYyA9PSAwKSB7CisgICAgICBLTVBfV0FSTklORyhDb25zdHJ1Y3RJZGVudEludmFsaWQpOworICAgIH0KKyAgfQorCisgIC8vIFRvRG86IE9wdGltaXplIHRoZSBmb2xsb3dpbmcgdHdvIGJhcnJpZXJzIGludG8gc29tZSBraW5kIG9mIHNwbGl0IGJhcnJpZXIKKworICBpZiAoZGlkaXQpCisgICAgKmRhdGFfcHRyID0gY3B5X2RhdGE7CisKKy8qIFRoaXMgYmFycmllciBpcyBub3QgYSBiYXJyaWVyIHJlZ2lvbiBib3VuZGFyeSAqLworI2lmIFVTRV9JVFRfTk9USUZZCisgIF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX2lkZW50ID0gbG9jOworI2VuZGlmCisgIF9fa21wX2JhcnJpZXIoYnNfcGxhaW5fYmFycmllciwgZ3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwpOworCisgIGlmICghZGlkaXQpCisgICAgKCpjcHlfZnVuYykoY3B5X2RhdGEsICpkYXRhX3B0cik7CisKKy8vIENvbnNpZGVyIG5leHQgYmFycmllciBhIHVzZXItdmlzaWJsZSBiYXJyaWVyIGZvciBiYXJyaWVyIHJlZ2lvbiBib3VuZGFyaWVzCisvLyBOZXN0aW5nIGNoZWNrcyBhcmUgYWxyZWFkeSBoYW5kbGVkIGJ5IHRoZSBzaW5nbGUgY29uc3RydWN0IGNoZWNrcworCisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfaWRlbnQgPSBsb2M7IC8vIFRPRE86IGNoZWNrIGlmIGl0IGlzIG5lZWRlZCAoZS5nLgorLy8gdGFza3MgY2FuIG92ZXJ3cml0ZSB0aGUgbG9jYXRpb24pCisjZW5kaWYKKyAgX19rbXBfYmFycmllcihic19wbGFpbl9iYXJyaWVyLCBndGlkLCBGQUxTRSwgMCwgTlVMTCwgTlVMTCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgSU5JVF9MT0NLIF9fa21wX2luaXRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzCisjZGVmaW5lIElOSVRfTkVTVEVEX0xPQ0sgX19rbXBfaW5pdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzCisjZGVmaW5lIEFDUVVJUkVfTE9DSyBfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrcworI2RlZmluZSBBQ1FVSVJFX0xPQ0tfVElNRUQgX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfdGltZWQKKyNkZWZpbmUgQUNRVUlSRV9ORVNURURfTE9DSyBfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3MKKyNkZWZpbmUgQUNRVUlSRV9ORVNURURfTE9DS19USU1FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc190aW1lZAorI2RlZmluZSBSRUxFQVNFX0xPQ0sgX19rbXBfcmVsZWFzZV91c2VyX2xvY2tfd2l0aF9jaGVja3MKKyNkZWZpbmUgUkVMRUFTRV9ORVNURURfTE9DSyBfX2ttcF9yZWxlYXNlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3MKKyNkZWZpbmUgVEVTVF9MT0NLIF9fa21wX3Rlc3RfdXNlcl9sb2NrX3dpdGhfY2hlY2tzCisjZGVmaW5lIFRFU1RfTkVTVEVEX0xPQ0sgX19rbXBfdGVzdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzCisjZGVmaW5lIERFU1RST1lfTE9DSyBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja193aXRoX2NoZWNrcworI2RlZmluZSBERVNUUk9ZX05FU1RFRF9MT0NLIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcworCisvLyBUT0RPOiBNYWtlIGNoZWNrIGFib3J0IG1lc3NhZ2VzIHVzZSBsb2NhdGlvbiBpbmZvICYgcGFzcyBpdCBpbnRvCisvLyB3aXRoX2NoZWNrcyByb3V0aW5lcworCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworLy8gaW50ZXJuYWwgbG9jayBpbml0aWFsaXplcgorc3RhdGljIF9fZm9yY2VpbmxpbmUgdm9pZCBfX2ttcF9pbml0X2xvY2tfd2l0aF9oaW50KGlkZW50X3QgKmxvYywgdm9pZCAqKmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2R5bmFfbG9ja3NlcV90IHNlcSkgeworICBpZiAoS01QX0lTX0RfTE9DSyhzZXEpKSB7CisgICAgS01QX0lOSVRfRF9MT0NLKGxvY2ssIHNlcSk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX2NyZWF0aW5nKChrbXBfdXNlcl9sb2NrX3ApbG9jaywgTlVMTCk7CisjZW5kaWYKKyAgfSBlbHNlIHsKKyAgICBLTVBfSU5JVF9JX0xPQ0sobG9jaywgc2VxKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAga21wX2luZGlyZWN0X2xvY2tfdCAqaWxrID0gS01QX0xPT0tVUF9JX0xPQ0sobG9jayk7CisgICAgX19rbXBfaXR0X2xvY2tfY3JlYXRpbmcoaWxrLT5sb2NrLCBsb2MpOworI2VuZGlmCisgIH0KK30KKworLy8gaW50ZXJuYWwgbmVzdCBsb2NrIGluaXRpYWxpemVyCitzdGF0aWMgX19mb3JjZWlubGluZSB2b2lkCitfX2ttcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQoaWRlbnRfdCAqbG9jLCB2b2lkICoqbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfZHluYV9sb2Nrc2VxX3Qgc2VxKSB7CisjaWYgS01QX1VTRV9UU1gKKyAgLy8gRG9uJ3QgaGF2ZSBuZXN0ZWQgbG9jayBpbXBsZW1lbnRhdGlvbiBmb3Igc3BlY3VsYXRpdmUgbG9ja3MKKyAgaWYgKHNlcSA9PSBsb2Nrc2VxX2hsZSB8fCBzZXEgPT0gbG9ja3NlcV9ydG0gfHwgc2VxID09IGxvY2tzZXFfYWRhcHRpdmUpCisgICAgc2VxID0gX19rbXBfdXNlcl9sb2NrX3NlcTsKKyNlbmRpZgorICBzd2l0Y2ggKHNlcSkgeworICBjYXNlIGxvY2tzZXFfdGFzOgorICAgIHNlcSA9IGxvY2tzZXFfbmVzdGVkX3RhczsKKyAgICBicmVhazsKKyNpZiBLTVBfVVNFX0ZVVEVYCisgIGNhc2UgbG9ja3NlcV9mdXRleDoKKyAgICBzZXEgPSBsb2Nrc2VxX25lc3RlZF9mdXRleDsKKyAgICBicmVhazsKKyNlbmRpZgorICBjYXNlIGxvY2tzZXFfdGlja2V0OgorICAgIHNlcSA9IGxvY2tzZXFfbmVzdGVkX3RpY2tldDsKKyAgICBicmVhazsKKyAgY2FzZSBsb2Nrc2VxX3F1ZXVpbmc6CisgICAgc2VxID0gbG9ja3NlcV9uZXN0ZWRfcXVldWluZzsKKyAgICBicmVhazsKKyAgY2FzZSBsb2Nrc2VxX2RyZHBhOgorICAgIHNlcSA9IGxvY2tzZXFfbmVzdGVkX2RyZHBhOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHNlcSA9IGxvY2tzZXFfbmVzdGVkX3F1ZXVpbmc7CisgIH0KKyAgS01QX0lOSVRfSV9MT0NLKGxvY2ssIHNlcSk7CisjaWYgVVNFX0lUVF9CVUlMRAorICBrbXBfaW5kaXJlY3RfbG9ja190ICppbGsgPSBLTVBfTE9PS1VQX0lfTE9DSyhsb2NrKTsKKyAgX19rbXBfaXR0X2xvY2tfY3JlYXRpbmcoaWxrLT5sb2NrLCBsb2MpOworI2VuZGlmCit9CisKKy8qIGluaXRpYWxpemUgdGhlIGxvY2sgd2l0aCBhIGhpbnQgKi8KK3ZvaWQgX19rbXBjX2luaXRfbG9ja193aXRoX2hpbnQoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IGhpbnQpIHsKKyAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9pbml0X3NlcmlhbCk7CisgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgJiYgdXNlcl9sb2NrID09IE5VTEwpIHsKKyAgICBLTVBfRkFUQUwoTG9ja0lzVW5pbml0aWFsaXplZCwgIm9tcF9pbml0X2xvY2tfd2l0aF9oaW50Iik7CisgIH0KKworICBfX2ttcF9pbml0X2xvY2tfd2l0aF9oaW50KGxvYywgdXNlcl9sb2NrLCBfX2ttcF9tYXBfaGludF90b19sb2NrKGhpbnQpKTsKK30KKworLyogaW5pdGlhbGl6ZSB0aGUgbG9jayB3aXRoIGEgaGludCAqLwordm9pZCBfX2ttcGNfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50KGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKnVzZXJfbG9jaywgdWludHB0cl90IGhpbnQpIHsKKyAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9pbml0X3NlcmlhbCk7CisgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgJiYgdXNlcl9sb2NrID09IE5VTEwpIHsKKyAgICBLTVBfRkFUQUwoTG9ja0lzVW5pbml0aWFsaXplZCwgIm9tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQiKTsKKyAgfQorCisgIF9fa21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludChsb2MsIHVzZXJfbG9jaywgX19rbXBfbWFwX2hpbnRfdG9fbG9jayhoaW50KSk7Cit9CisKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisvKiBpbml0aWFsaXplIHRoZSBsb2NrICovCit2b2lkIF9fa21wY19pbml0X2xvY2soaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jaykgeworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9pbml0X3NlcmlhbCk7CisgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgJiYgdXNlcl9sb2NrID09IE5VTEwpIHsKKyAgICBLTVBfRkFUQUwoTG9ja0lzVW5pbml0aWFsaXplZCwgIm9tcF9pbml0X2xvY2siKTsKKyAgfQorICBfX2ttcF9pbml0X2xvY2tfd2l0aF9oaW50KGxvYywgdXNlcl9sb2NrLCBfX2ttcF91c2VyX2xvY2tfc2VxKTsKKworI2Vsc2UgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworICBzdGF0aWMgY2hhciBjb25zdCAqY29uc3QgZnVuYyA9ICJvbXBfaW5pdF9sb2NrIjsKKyAga21wX3VzZXJfbG9ja19wIGxjazsKKyAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9pbml0X3NlcmlhbCk7CisKKyAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgIGlmICh1c2VyX2xvY2sgPT0gTlVMTCkgeworICAgICAgS01QX0ZBVEFMKExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMpOworICAgIH0KKyAgfQorCisgIEtNUF9DSEVDS19VU0VSX0xPQ0tfSU5JVCgpOworCisgIGlmICgoX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzKSAmJgorICAgICAgKHNpemVvZihsY2stPnRhcy5say5wb2xsKSA8PSBPTVBfTE9DS19UX1NJWkUpKSB7CisgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgIH0KKyNpZiBLTVBfVVNFX0ZVVEVYCisgIGVsc2UgaWYgKChfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCkgJiYKKyAgICAgICAgICAgKHNpemVvZihsY2stPmZ1dGV4LmxrLnBvbGwpIDw9IE9NUF9MT0NLX1RfU0laRSkpIHsKKyAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgfQorI2VuZGlmCisgIGVsc2UgeworICAgIGxjayA9IF9fa21wX3VzZXJfbG9ja19hbGxvY2F0ZSh1c2VyX2xvY2ssIGd0aWQsIDApOworICB9CisgIElOSVRfTE9DSyhsY2spOworICBfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uKGxjaywgbG9jKTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgIGlmIChvbXB0X2VuYWJsZWQgJiYgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2luaXRfbG9jaykpIHsKKyAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW5pdF9sb2NrKSgodWludDY0X3QpbGNrKTsKKyAgfQorI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgIF9fa21wX2l0dF9sb2NrX2NyZWF0aW5nKGxjayk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKK30gLy8gX19rbXBjX2luaXRfbG9jaworCisvKiBpbml0aWFsaXplIHRoZSBsb2NrICovCit2b2lkIF9fa21wY19pbml0X25lc3RfbG9jayhpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrKSB7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2luaXRfc2VyaWFsKTsKKyAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayAmJiB1c2VyX2xvY2sgPT0gTlVMTCkgeworICAgIEtNUF9GQVRBTChMb2NrSXNVbmluaXRpYWxpemVkLCAib21wX2luaXRfbmVzdF9sb2NrIik7CisgIH0KKyAgX19rbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50KGxvYywgdXNlcl9sb2NrLCBfX2ttcF91c2VyX2xvY2tfc2VxKTsKKworI2Vsc2UgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworICBzdGF0aWMgY2hhciBjb25zdCAqY29uc3QgZnVuYyA9ICJvbXBfaW5pdF9uZXN0X2xvY2siOworICBrbXBfdXNlcl9sb2NrX3AgbGNrOworICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2luaXRfc2VyaWFsKTsKKworICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgaWYgKHVzZXJfbG9jayA9PSBOVUxMKSB7CisgICAgICBLTVBfRkFUQUwoTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyk7CisgICAgfQorICB9CisKKyAgS01QX0NIRUNLX1VTRVJfTE9DS19JTklUKCk7CisKKyAgaWYgKChfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMpICYmCisgICAgICAoc2l6ZW9mKGxjay0+dGFzLmxrLnBvbGwpICsgc2l6ZW9mKGxjay0+dGFzLmxrLmRlcHRoX2xvY2tlZCkgPD0KKyAgICAgICBPTVBfTkVTVF9MT0NLX1RfU0laRSkpIHsKKyAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgfQorI2lmIEtNUF9VU0VfRlVURVgKKyAgZWxzZSBpZiAoKF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4KSAmJgorICAgICAgICAgICAoc2l6ZW9mKGxjay0+ZnV0ZXgubGsucG9sbCkgKyBzaXplb2YobGNrLT5mdXRleC5say5kZXB0aF9sb2NrZWQpIDw9CisgICAgICAgICAgICBPTVBfTkVTVF9MT0NLX1RfU0laRSkpIHsKKyAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgfQorI2VuZGlmCisgIGVsc2UgeworICAgIGxjayA9IF9fa21wX3VzZXJfbG9ja19hbGxvY2F0ZSh1c2VyX2xvY2ssIGd0aWQsIDApOworICB9CisKKyAgSU5JVF9ORVNURURfTE9DSyhsY2spOworICBfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uKGxjaywgbG9jKTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgIGlmIChvbXB0X2VuYWJsZWQgJiYgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2luaXRfbmVzdF9sb2NrKSkgeworICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbml0X25lc3RfbG9jaykoKHVpbnQ2NF90KWxjayk7CisgIH0KKyNlbmRpZgorCisjaWYgVVNFX0lUVF9CVUlMRAorICBfX2ttcF9pdHRfbG9ja19jcmVhdGluZyhsY2spOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworI2VuZGlmIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCit9IC8vIF9fa21wY19pbml0X25lc3RfbG9jaworCit2b2lkIF9fa21wY19kZXN0cm95X2xvY2soaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jaykgeworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyNpZiBVU0VfSVRUX0JVSUxECisgIGttcF91c2VyX2xvY2tfcCBsY2s7CisgIGlmIChLTVBfRVhUUkFDVF9EX1RBRyh1c2VyX2xvY2spID09IDApIHsKKyAgICBsY2sgPSAoKGttcF9pbmRpcmVjdF9sb2NrX3QgKilLTVBfTE9PS1VQX0lfTE9DSyh1c2VyX2xvY2spKS0+bG9jazsKKyAgfSBlbHNlIHsKKyAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgfQorICBfX2ttcF9pdHRfbG9ja19kZXN0cm95ZWQobGNrKTsKKyNlbmRpZgorICBLTVBfRF9MT0NLX0ZVTkModXNlcl9sb2NrLCBkZXN0cm95KSgoa21wX2R5bmFfbG9ja190ICopdXNlcl9sb2NrKTsKKyNlbHNlCisgIGttcF91c2VyX2xvY2tfcCBsY2s7CisKKyAgaWYgKChfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMpICYmCisgICAgICAoc2l6ZW9mKGxjay0+dGFzLmxrLnBvbGwpIDw9IE9NUF9MT0NLX1RfU0laRSkpIHsKKyAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgfQorI2lmIEtNUF9VU0VfRlVURVgKKyAgZWxzZSBpZiAoKF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4KSAmJgorICAgICAgICAgICAoc2l6ZW9mKGxjay0+ZnV0ZXgubGsucG9sbCkgPD0gT01QX0xPQ0tfVF9TSVpFKSkgeworICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICB9CisjZW5kaWYKKyAgZWxzZSB7CisgICAgbGNrID0gX19rbXBfbG9va3VwX3VzZXJfbG9jayh1c2VyX2xvY2ssICJvbXBfZGVzdHJveV9sb2NrIik7CisgIH0KKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgIGlmIChvbXB0X2VuYWJsZWQgJiYgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2Rlc3Ryb3lfbG9jaykpIHsKKyAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfZGVzdHJveV9sb2NrKSgodWludDY0X3QpbGNrKTsKKyAgfQorI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgIF9fa21wX2l0dF9sb2NrX2Rlc3Ryb3llZChsY2spOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgREVTVFJPWV9MT0NLKGxjayk7CisKKyAgaWYgKChfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMpICYmCisgICAgICAoc2l6ZW9mKGxjay0+dGFzLmxrLnBvbGwpIDw9IE9NUF9MT0NLX1RfU0laRSkpIHsKKyAgICA7CisgIH0KKyNpZiBLTVBfVVNFX0ZVVEVYCisgIGVsc2UgaWYgKChfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCkgJiYKKyAgICAgICAgICAgKHNpemVvZihsY2stPmZ1dGV4LmxrLnBvbGwpIDw9IE9NUF9MT0NLX1RfU0laRSkpIHsKKyAgICA7CisgIH0KKyNlbmRpZgorICBlbHNlIHsKKyAgICBfX2ttcF91c2VyX2xvY2tfZnJlZSh1c2VyX2xvY2ssIGd0aWQsIGxjayk7CisgIH0KKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworfSAvLyBfX2ttcGNfZGVzdHJveV9sb2NrCisKKy8qIGRlc3Ryb3kgdGhlIGxvY2sgKi8KK3ZvaWQgX19rbXBjX2Rlc3Ryb3lfbmVzdF9sb2NrKGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2spIHsKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisjaWYgVVNFX0lUVF9CVUlMRAorICBrbXBfaW5kaXJlY3RfbG9ja190ICppbGsgPSBLTVBfTE9PS1VQX0lfTE9DSyh1c2VyX2xvY2spOworICBfX2ttcF9pdHRfbG9ja19kZXN0cm95ZWQoaWxrLT5sb2NrKTsKKyNlbmRpZgorICBLTVBfRF9MT0NLX0ZVTkModXNlcl9sb2NrLCBkZXN0cm95KSgoa21wX2R5bmFfbG9ja190ICopdXNlcl9sb2NrKTsKKworI2Vsc2UgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworICBrbXBfdXNlcl9sb2NrX3AgbGNrOworCisgIGlmICgoX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzKSAmJgorICAgICAgKHNpemVvZihsY2stPnRhcy5say5wb2xsKSArIHNpemVvZihsY2stPnRhcy5say5kZXB0aF9sb2NrZWQpIDw9CisgICAgICAgT01QX05FU1RfTE9DS19UX1NJWkUpKSB7CisgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgIH0KKyNpZiBLTVBfVVNFX0ZVVEVYCisgIGVsc2UgaWYgKChfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCkgJiYKKyAgICAgICAgICAgKHNpemVvZihsY2stPmZ1dGV4LmxrLnBvbGwpICsgc2l6ZW9mKGxjay0+ZnV0ZXgubGsuZGVwdGhfbG9ja2VkKSA8PQorICAgICAgICAgICAgT01QX05FU1RfTE9DS19UX1NJWkUpKSB7CisgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgIH0KKyNlbmRpZgorICBlbHNlIHsKKyAgICBsY2sgPSBfX2ttcF9sb29rdXBfdXNlcl9sb2NrKHVzZXJfbG9jaywgIm9tcF9kZXN0cm95X25lc3RfbG9jayIpOworICB9CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfZGVzdHJveV9uZXN0X2xvY2spKSB7CisgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2Rlc3Ryb3lfbmVzdF9sb2NrKSgodWludDY0X3QpbGNrKTsKKyAgfQorI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgIF9fa21wX2l0dF9sb2NrX2Rlc3Ryb3llZChsY2spOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICBERVNUUk9ZX05FU1RFRF9MT0NLKGxjayk7CisKKyAgaWYgKChfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMpICYmCisgICAgICAoc2l6ZW9mKGxjay0+dGFzLmxrLnBvbGwpICsgc2l6ZW9mKGxjay0+dGFzLmxrLmRlcHRoX2xvY2tlZCkgPD0KKyAgICAgICBPTVBfTkVTVF9MT0NLX1RfU0laRSkpIHsKKyAgICA7CisgIH0KKyNpZiBLTVBfVVNFX0ZVVEVYCisgIGVsc2UgaWYgKChfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCkgJiYKKyAgICAgICAgICAgKHNpemVvZihsY2stPmZ1dGV4LmxrLnBvbGwpICsgc2l6ZW9mKGxjay0+ZnV0ZXgubGsuZGVwdGhfbG9ja2VkKSA8PQorICAgICAgICAgICAgT01QX05FU1RfTE9DS19UX1NJWkUpKSB7CisgICAgOworICB9CisjZW5kaWYKKyAgZWxzZSB7CisgICAgX19rbXBfdXNlcl9sb2NrX2ZyZWUodXNlcl9sb2NrLCBndGlkLCBsY2spOworICB9CisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKK30gLy8gX19rbXBjX2Rlc3Ryb3lfbmVzdF9sb2NrCisKK3ZvaWQgX19rbXBjX3NldF9sb2NrKGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2spIHsKKyAgS01QX0NPVU5UX0JMT0NLKE9NUF9zZXRfbG9jayk7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgaW50IHRhZyA9IEtNUF9FWFRSQUNUX0RfVEFHKHVzZXJfbG9jayk7CisjaWYgVVNFX0lUVF9CVUlMRAorICBfX2ttcF9pdHRfbG9ja19hY3F1aXJpbmcoCisgICAgICAoa21wX3VzZXJfbG9ja19wKQorICAgICAgICAgIHVzZXJfbG9jayk7IC8vIGl0dCBmdW5jdGlvbiB3aWxsIGdldCB0byB0aGUgcmlnaHQgbG9jayBvYmplY3QuCisjZW5kaWYKKyNpZiBLTVBfVVNFX0lOTElORURfVEFTCisgIGlmICh0YWcgPT0gbG9ja3RhZ190YXMgJiYgIV9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgIEtNUF9BQ1FVSVJFX1RBU19MT0NLKHVzZXJfbG9jaywgZ3RpZCk7CisgIH0gZWxzZQorI2VsaWYgS01QX1VTRV9JTkxJTkVEX0ZVVEVYCisgIGlmICh0YWcgPT0gbG9ja3RhZ19mdXRleCAmJiAhX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgS01QX0FDUVVJUkVfRlVURVhfTE9DSyh1c2VyX2xvY2ssIGd0aWQpOworICB9IGVsc2UKKyNlbmRpZgorICB7CisgICAgX19rbXBfZGlyZWN0X3NldFt0YWddKChrbXBfZHluYV9sb2NrX3QgKil1c2VyX2xvY2ssIGd0aWQpOworICB9CisjaWYgVVNFX0lUVF9CVUlMRAorICBfX2ttcF9pdHRfbG9ja19hY3F1aXJlZCgoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jayk7CisjZW5kaWYKKworI2Vsc2UgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworICBrbXBfdXNlcl9sb2NrX3AgbGNrOworCisgIGlmICgoX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzKSAmJgorICAgICAgKHNpemVvZihsY2stPnRhcy5say5wb2xsKSA8PSBPTVBfTE9DS19UX1NJWkUpKSB7CisgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgIH0KKyNpZiBLTVBfVVNFX0ZVVEVYCisgIGVsc2UgaWYgKChfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCkgJiYKKyAgICAgICAgICAgKHNpemVvZihsY2stPmZ1dGV4LmxrLnBvbGwpIDw9IE9NUF9MT0NLX1RfU0laRSkpIHsKKyAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgfQorI2VuZGlmCisgIGVsc2UgeworICAgIGxjayA9IF9fa21wX2xvb2t1cF91c2VyX2xvY2sodXNlcl9sb2NrLCAib21wX3NldF9sb2NrIik7CisgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgX19rbXBfaXR0X2xvY2tfYWNxdWlyaW5nKGxjayk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgIEFDUVVJUkVfTE9DSyhsY2ssIGd0aWQpOworCisjaWYgVVNFX0lUVF9CVUlMRAorICBfX2ttcF9pdHRfbG9ja19hY3F1aXJlZChsY2spOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgIGlmIChvbXB0X2VuYWJsZWQgJiYgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2FjcXVpcmVkX2xvY2spKSB7CisgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2FjcXVpcmVkX2xvY2spKCh1aW50NjRfdClsY2spOworICB9CisjZW5kaWYKKworI2VuZGlmIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCit9CisKK3ZvaWQgX19rbXBjX3NldF9uZXN0X2xvY2soaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jaykgeworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyNpZiBVU0VfSVRUX0JVSUxECisgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmluZygoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jayk7CisjZW5kaWYKKyAgS01QX0RfTE9DS19GVU5DKHVzZXJfbG9jaywgc2V0KSgoa21wX2R5bmFfbG9ja190ICopdXNlcl9sb2NrLCBndGlkKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkKChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrKTsKKyNlbmRpZgorCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgIC8vIG1pc3Npbmcgc3VwcG9ydCBoZXJlOiBuZWVkIHRvIGtub3cgd2hldGhlciBhY3F1aXJlZCBmaXJzdCBvciBub3QKKyAgfQorI2VuZGlmCisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgIGludCBhY3F1aXJlX3N0YXR1czsKKyAga21wX3VzZXJfbG9ja19wIGxjazsKKworICBpZiAoKF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcykgJiYKKyAgICAgIChzaXplb2YobGNrLT50YXMubGsucG9sbCkgKyBzaXplb2YobGNrLT50YXMubGsuZGVwdGhfbG9ja2VkKSA8PQorICAgICAgIE9NUF9ORVNUX0xPQ0tfVF9TSVpFKSkgeworICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICB9CisjaWYgS01QX1VTRV9GVVRFWAorICBlbHNlIGlmICgoX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXgpICYmCisgICAgICAgICAgIChzaXplb2YobGNrLT5mdXRleC5say5wb2xsKSArIHNpemVvZihsY2stPmZ1dGV4LmxrLmRlcHRoX2xvY2tlZCkgPD0KKyAgICAgICAgICAgIE9NUF9ORVNUX0xPQ0tfVF9TSVpFKSkgeworICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICB9CisjZW5kaWYKKyAgZWxzZSB7CisgICAgbGNrID0gX19rbXBfbG9va3VwX3VzZXJfbG9jayh1c2VyX2xvY2ssICJvbXBfc2V0X25lc3RfbG9jayIpOworICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmluZyhsY2spOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICBBQ1FVSVJFX05FU1RFRF9MT0NLKGxjaywgZ3RpZCwgJmFjcXVpcmVfc3RhdHVzKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgX19rbXBfaXR0X2xvY2tfYWNxdWlyZWQobGNrKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgaWYgKGFjcXVpcmVfc3RhdHVzID09IEtNUF9MT0NLX0FDUVVJUkVEX0ZJUlNUKSB7CisgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2FjcXVpcmVkX25lc3RfbG9ja19maXJzdCkpCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9hY3F1aXJlZF9uZXN0X2xvY2tfZmlyc3QpKAorICAgICAgICAgICAgKHVpbnQ2NF90KWxjayk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYWNxdWlyZWRfbmVzdF9sb2NrX25leHQpKQorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYWNxdWlyZWRfbmVzdF9sb2NrX25leHQpKAorICAgICAgICAgICAgKHVpbnQ2NF90KWxjayk7CisgICAgfQorICB9CisjZW5kaWYKKworI2VuZGlmIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCit9CisKK3ZvaWQgX19rbXBjX3Vuc2V0X2xvY2soaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jaykgeworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgaW50IHRhZyA9IEtNUF9FWFRSQUNUX0RfVEFHKHVzZXJfbG9jayk7CisjaWYgVVNFX0lUVF9CVUlMRAorICBfX2ttcF9pdHRfbG9ja19yZWxlYXNpbmcoKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2spOworI2VuZGlmCisjaWYgS01QX1VTRV9JTkxJTkVEX1RBUworICBpZiAodGFnID09IGxvY2t0YWdfdGFzICYmICFfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICBLTVBfUkVMRUFTRV9UQVNfTE9DSyh1c2VyX2xvY2ssIGd0aWQpOworICB9IGVsc2UKKyNlbGlmIEtNUF9VU0VfSU5MSU5FRF9GVVRFWAorICBpZiAodGFnID09IGxvY2t0YWdfZnV0ZXggJiYgIV9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgIEtNUF9SRUxFQVNFX0ZVVEVYX0xPQ0sodXNlcl9sb2NrLCBndGlkKTsKKyAgfSBlbHNlCisjZW5kaWYKKyAgeworICAgIF9fa21wX2RpcmVjdF91bnNldFt0YWddKChrbXBfZHluYV9sb2NrX3QgKil1c2VyX2xvY2ssIGd0aWQpOworICB9CisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAga21wX3VzZXJfbG9ja19wIGxjazsKKworICAvKiBDYW4ndCB1c2Ugc2VyaWFsIGludGVydmFsIHNpbmNlIG5vdCBibG9jayBzdHJ1Y3R1cmVkICovCisgIC8qIHJlbGVhc2UgdGhlIGxvY2sgKi8KKworICBpZiAoKF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcykgJiYKKyAgICAgIChzaXplb2YobGNrLT50YXMubGsucG9sbCkgPD0gT01QX0xPQ0tfVF9TSVpFKSkgeworI2lmIEtNUF9PU19MSU5VWCAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKy8vICJmYXN0IiBwYXRoIGltcGxlbWVudGVkIHRvIGZpeCBjdXN0b21lciBwZXJmb3JtYW5jZSBpc3N1ZQorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19yZWxlYXNpbmcoKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2spOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICBUQ1dfNCgoKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2spLT50YXMubGsucG9sbCwgMCk7CisgICAgS01QX01CKCk7CisgICAgcmV0dXJuOworI2Vsc2UKKyAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyNlbmRpZgorICB9CisjaWYgS01QX1VTRV9GVVRFWAorICBlbHNlIGlmICgoX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXgpICYmCisgICAgICAgICAgIChzaXplb2YobGNrLT5mdXRleC5say5wb2xsKSA8PSBPTVBfTE9DS19UX1NJWkUpKSB7CisgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgIH0KKyNlbmRpZgorICBlbHNlIHsKKyAgICBsY2sgPSBfX2ttcF9sb29rdXBfdXNlcl9sb2NrKHVzZXJfbG9jaywgIm9tcF91bnNldF9sb2NrIik7CisgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgX19rbXBfaXR0X2xvY2tfcmVsZWFzaW5nKGxjayk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgIFJFTEVBU0VfTE9DSyhsY2ssIGd0aWQpOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfQkxBTUUKKyAgaWYgKG9tcHRfZW5hYmxlZCAmJiBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcmVsZWFzZV9sb2NrKSkgeworICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9yZWxlYXNlX2xvY2spKCh1aW50NjRfdClsY2spOworICB9CisjZW5kaWYKKworI2VuZGlmIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCit9CisKKy8qIHJlbGVhc2UgdGhlIGxvY2sgKi8KK3ZvaWQgX19rbXBjX3Vuc2V0X25lc3RfbG9jayhpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrKSB7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgX19rbXBfaXR0X2xvY2tfcmVsZWFzaW5nKChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrKTsKKyNlbmRpZgorICBLTVBfRF9MT0NLX0ZVTkModXNlcl9sb2NrLCB1bnNldCkoKGttcF9keW5hX2xvY2tfdCAqKXVzZXJfbG9jaywgZ3RpZCk7CisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAga21wX3VzZXJfbG9ja19wIGxjazsKKworICAvKiBDYW4ndCB1c2Ugc2VyaWFsIGludGVydmFsIHNpbmNlIG5vdCBibG9jayBzdHJ1Y3R1cmVkICovCisKKyAgaWYgKChfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMpICYmCisgICAgICAoc2l6ZW9mKGxjay0+dGFzLmxrLnBvbGwpICsgc2l6ZW9mKGxjay0+dGFzLmxrLmRlcHRoX2xvY2tlZCkgPD0KKyAgICAgICBPTVBfTkVTVF9MT0NLX1RfU0laRSkpIHsKKyNpZiBLTVBfT1NfTElOVVggJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpCisgICAgLy8gImZhc3QiIHBhdGggaW1wbGVtZW50ZWQgdG8gZml4IGN1c3RvbWVyIHBlcmZvcm1hbmNlIGlzc3VlCisgICAga21wX3Rhc19sb2NrX3QgKnRsID0gKGttcF90YXNfbG9ja190ICopdXNlcl9sb2NrOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19yZWxlYXNpbmcoKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2spOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICBpZiAoLS0odGwtPmxrLmRlcHRoX2xvY2tlZCkgPT0gMCkgeworICAgICAgVENXXzQodGwtPmxrLnBvbGwsIDApOworICAgIH0KKyAgICBLTVBfTUIoKTsKKyAgICByZXR1cm47CisjZWxzZQorICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworI2VuZGlmCisgIH0KKyNpZiBLTVBfVVNFX0ZVVEVYCisgIGVsc2UgaWYgKChfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCkgJiYKKyAgICAgICAgICAgKHNpemVvZihsY2stPmZ1dGV4LmxrLnBvbGwpICsgc2l6ZW9mKGxjay0+ZnV0ZXgubGsuZGVwdGhfbG9ja2VkKSA8PQorICAgICAgICAgICAgT01QX05FU1RfTE9DS19UX1NJWkUpKSB7CisgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgIH0KKyNlbmRpZgorICBlbHNlIHsKKyAgICBsY2sgPSBfX2ttcF9sb29rdXBfdXNlcl9sb2NrKHVzZXJfbG9jaywgIm9tcF91bnNldF9uZXN0X2xvY2siKTsKKyAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICBfX2ttcF9pdHRfbG9ja19yZWxlYXNpbmcobGNrKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgaW50IHJlbGVhc2Vfc3RhdHVzOworICByZWxlYXNlX3N0YXR1cyA9IFJFTEVBU0VfTkVTVEVEX0xPQ0sobGNrLCBndGlkKTsKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9CTEFNRQorICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgaWYgKHJlbGVhc2Vfc3RhdHVzID09IEtNUF9MT0NLX1JFTEVBU0VEKSB7CisgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3JlbGVhc2VfbmVzdF9sb2NrX2xhc3QpKSB7CisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9yZWxlYXNlX25lc3RfbG9ja19sYXN0KSgKKyAgICAgICAgICAgICh1aW50NjRfdClsY2spOworICAgICAgfQorICAgIH0gZWxzZSBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjaygKKyAgICAgICAgICAgICAgICAgICBvbXB0X2V2ZW50X3JlbGVhc2VfbmVzdF9sb2NrX3ByZXYpKSB7CisgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcmVsZWFzZV9uZXN0X2xvY2tfcHJldikoCisgICAgICAgICAgKHVpbnQ2NF90KWxjayk7CisgICAgfQorICB9CisjZW5kaWYKKworI2VuZGlmIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCit9CisKKy8qIHRyeSB0byBhY3F1aXJlIHRoZSBsb2NrICovCitpbnQgX19rbXBjX3Rlc3RfbG9jayhpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrKSB7CisgIEtNUF9DT1VOVF9CTE9DSyhPTVBfdGVzdF9sb2NrKTsKKworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgIGludCByYzsKKyAgaW50IHRhZyA9IEtNUF9FWFRSQUNUX0RfVEFHKHVzZXJfbG9jayk7CisjaWYgVVNFX0lUVF9CVUlMRAorICBfX2ttcF9pdHRfbG9ja19hY3F1aXJpbmcoKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2spOworI2VuZGlmCisjaWYgS01QX1VTRV9JTkxJTkVEX1RBUworICBpZiAodGFnID09IGxvY2t0YWdfdGFzICYmICFfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICBLTVBfVEVTVF9UQVNfTE9DSyh1c2VyX2xvY2ssIGd0aWQsIHJjKTsKKyAgfSBlbHNlCisjZWxpZiBLTVBfVVNFX0lOTElORURfRlVURVgKKyAgaWYgKHRhZyA9PSBsb2NrdGFnX2Z1dGV4ICYmICFfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICBLTVBfVEVTVF9GVVRFWF9MT0NLKHVzZXJfbG9jaywgZ3RpZCwgcmMpOworICB9IGVsc2UKKyNlbmRpZgorICB7CisgICAgcmMgPSBfX2ttcF9kaXJlY3RfdGVzdFt0YWddKChrbXBfZHluYV9sb2NrX3QgKil1c2VyX2xvY2ssIGd0aWQpOworICB9CisgIGlmIChyYykgeworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJlZCgoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jayk7CisjZW5kaWYKKyAgICByZXR1cm4gRlROX1RSVUU7CisgIH0gZWxzZSB7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX2NhbmNlbGxlZCgoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jayk7CisjZW5kaWYKKyAgICByZXR1cm4gRlROX0ZBTFNFOworICB9CisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAga21wX3VzZXJfbG9ja19wIGxjazsKKyAgaW50IHJjOworCisgIGlmICgoX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzKSAmJgorICAgICAgKHNpemVvZihsY2stPnRhcy5say5wb2xsKSA8PSBPTVBfTE9DS19UX1NJWkUpKSB7CisgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgIH0KKyNpZiBLTVBfVVNFX0ZVVEVYCisgIGVsc2UgaWYgKChfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCkgJiYKKyAgICAgICAgICAgKHNpemVvZihsY2stPmZ1dGV4LmxrLnBvbGwpIDw9IE9NUF9MT0NLX1RfU0laRSkpIHsKKyAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgfQorI2VuZGlmCisgIGVsc2UgeworICAgIGxjayA9IF9fa21wX2xvb2t1cF91c2VyX2xvY2sodXNlcl9sb2NrLCAib21wX3Rlc3RfbG9jayIpOworICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmluZyhsY2spOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICByYyA9IFRFU1RfTE9DSyhsY2ssIGd0aWQpOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgaWYgKHJjKSB7CisgICAgX19rbXBfaXR0X2xvY2tfYWNxdWlyZWQobGNrKTsKKyAgfSBlbHNlIHsKKyAgICBfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQobGNrKTsKKyAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgcmV0dXJuIChyYyA/IEZUTl9UUlVFIDogRlROX0ZBTFNFKTsKKworLyogQ2FuJ3QgdXNlIHNlcmlhbCBpbnRlcnZhbCBzaW5jZSBub3QgYmxvY2sgc3RydWN0dXJlZCAqLworCisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKK30KKworLyogdHJ5IHRvIGFjcXVpcmUgdGhlIGxvY2sgKi8KK2ludCBfX2ttcGNfdGVzdF9uZXN0X2xvY2soaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jaykgeworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgIGludCByYzsKKyNpZiBVU0VfSVRUX0JVSUxECisgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmluZygoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jayk7CisjZW5kaWYKKyAgcmMgPSBLTVBfRF9MT0NLX0ZVTkModXNlcl9sb2NrLCB0ZXN0KSgoa21wX2R5bmFfbG9ja190ICopdXNlcl9sb2NrLCBndGlkKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgIGlmIChyYykgeworICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkKChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrKTsKKyAgfSBlbHNlIHsKKyAgICBfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQoKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2spOworICB9CisjZW5kaWYKKyAgcmV0dXJuIHJjOworCisjZWxzZSAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisgIGttcF91c2VyX2xvY2tfcCBsY2s7CisgIGludCByYzsKKworICBpZiAoKF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcykgJiYKKyAgICAgIChzaXplb2YobGNrLT50YXMubGsucG9sbCkgKyBzaXplb2YobGNrLT50YXMubGsuZGVwdGhfbG9ja2VkKSA8PQorICAgICAgIE9NUF9ORVNUX0xPQ0tfVF9TSVpFKSkgeworICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICB9CisjaWYgS01QX1VTRV9GVVRFWAorICBlbHNlIGlmICgoX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXgpICYmCisgICAgICAgICAgIChzaXplb2YobGNrLT5mdXRleC5say5wb2xsKSArIHNpemVvZihsY2stPmZ1dGV4LmxrLmRlcHRoX2xvY2tlZCkgPD0KKyAgICAgICAgICAgIE9NUF9ORVNUX0xPQ0tfVF9TSVpFKSkgeworICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICB9CisjZW5kaWYKKyAgZWxzZSB7CisgICAgbGNrID0gX19rbXBfbG9va3VwX3VzZXJfbG9jayh1c2VyX2xvY2ssICJvbXBfdGVzdF9uZXN0X2xvY2siKTsKKyAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICBfX2ttcF9pdHRfbG9ja19hY3F1aXJpbmcobGNrKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgcmMgPSBURVNUX05FU1RFRF9MT0NLKGxjaywgZ3RpZCk7CisjaWYgVVNFX0lUVF9CVUlMRAorICBpZiAocmMpIHsKKyAgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJlZChsY2spOworICB9IGVsc2UgeworICAgIF9fa21wX2l0dF9sb2NrX2NhbmNlbGxlZChsY2spOworICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICByZXR1cm4gcmM7CisKKy8qIENhbid0IHVzZSBzZXJpYWwgaW50ZXJ2YWwgc2luY2Ugbm90IGJsb2NrIHN0cnVjdHVyZWQgKi8KKworI2VuZGlmIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCit9CisKKy8vIEludGVyZmFjZSB0byBmYXN0IHNjYWxhYmxlIHJlZHVjZSBtZXRob2RzIHJvdXRpbmVzCisKKy8vIGtlZXAgdGhlIHNlbGVjdGVkIG1ldGhvZCBpbiBhIHRocmVhZCBsb2NhbCBzdHJ1Y3R1cmUgZm9yIGNyb3NzLWZ1bmN0aW9uCisvLyB1c2FnZTogd2lsbCBiZSB1c2VkIGluIF9fa21wY19lbmRfcmVkdWNlKiBmdW5jdGlvbnM7CisvLyBhbm90aGVyIHNvbHV0aW9uOiB0byByZS1kZXRlcm1pbmUgdGhlIG1ldGhvZCBvbmUgbW9yZSB0aW1lIGluCisvLyBfX2ttcGNfZW5kX3JlZHVjZSogZnVuY3Rpb25zIChuZXcgcHJvdG90eXBlIHJlcXVpcmVkIHRoZW4pCisvLyBBVDogd2hpY2ggc29sdXRpb24gaXMgYmV0dGVyPworI2RlZmluZSBfX0tNUF9TRVRfUkVEVUNUSU9OX01FVEhPRChndGlkLCBybWV0aG9kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChfX2ttcF90aHJlYWRzWyhndGlkKV0tPnRoLnRoX2xvY2FsLnBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kKSA9IChybWV0aG9kKSkKKworI2RlZmluZSBfX0tNUF9HRVRfUkVEVUNUSU9OX01FVEhPRChndGlkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKF9fa21wX3RocmVhZHNbKGd0aWQpXS0+dGgudGhfbG9jYWwucGFja2VkX3JlZHVjdGlvbl9tZXRob2QpCisKKy8vIGRlc2NyaXB0aW9uIG9mIHRoZSBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCB2YXJpYWJsZTogbG9vayBhdCB0aGUgbWFjcm9zIGluCisvLyBrbXAuaAorCisvLyB1c2VkIGluIGEgY3JpdGljYWwgc2VjdGlvbiByZWR1Y2UgYmxvY2sKK3N0YXRpYyBfX2ZvcmNlaW5saW5lIHZvaWQKK19fa21wX2VudGVyX2NyaXRpY2FsX3NlY3Rpb25fcmVkdWNlX2Jsb2NrKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY3JpdGljYWxfbmFtZSAqY3JpdCkgeworCisgIC8vIHRoaXMgbG9jayB3YXMgdmlzaWJsZSB0byBhIGN1c3RvbWVyIGFuZCB0byB0aGUgdGhyZWFkaW5nIHByb2ZpbGUgdG9vbCBhcyBhCisgIC8vIHNlcmlhbCBvdmVyaGVhZCBzcGFuIChhbHRob3VnaCBpdCdzIHVzZWQgZm9yIGFuIGludGVybmFsIHB1cnBvc2Ugb25seSkKKyAgLy8gICAgICAgICAgICB3aHkgd2FzIGl0IHZpc2libGUgaW4gcHJldmlvdXMgaW1wbGVtZW50YXRpb24/CisgIC8vICAgICAgICAgICAgc2hvdWxkIHdlIGtlZXAgaXQgdmlzaWJsZSBpbiBuZXcgcmVkdWNlIGJsb2NrPworICBrbXBfdXNlcl9sb2NrX3AgbGNrOworCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworICBrbXBfZHluYV9sb2NrX3QgKmxrID0gKGttcF9keW5hX2xvY2tfdCAqKWNyaXQ7CisgIC8vIENoZWNrIGlmIGl0IGlzIGluaXRpYWxpemVkLgorICBpZiAoKmxrID09IDApIHsKKyAgICBpZiAoS01QX0lTX0RfTE9DSyhfX2ttcF91c2VyX2xvY2tfc2VxKSkgeworICAgICAgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCh2b2xhdGlsZSBrbXBfaW50MzIgKiljcml0LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9HRVRfRF9UQUcoX19rbXBfdXNlcl9sb2NrX3NlcSkpOworICAgIH0gZWxzZSB7CisgICAgICBfX2ttcF9pbml0X2luZGlyZWN0X2NzcHRyKGNyaXQsIGxvYywgZ2xvYmFsX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0dFVF9JX1RBRyhfX2ttcF91c2VyX2xvY2tfc2VxKSk7CisgICAgfQorICB9CisgIC8vIEJyYW5jaCBmb3IgYWNjZXNzaW5nIHRoZSBhY3R1YWwgbG9jayBvYmplY3QgYW5kIHNldCBvcGVyYXRpb24uIFRoaXMKKyAgLy8gYnJhbmNoaW5nIGlzIGluZXZpdGFibGUgc2luY2UgdGhpcyBsb2NrIGluaXRpYWxpemF0aW9uIGRvZXMgbm90IGZvbGxvdyB0aGUKKyAgLy8gbm9ybWFsIGRpc3BhdGNoIHBhdGggKGxvY2sgdGFibGUgaXMgbm90IHVzZWQpLgorICBpZiAoS01QX0VYVFJBQ1RfRF9UQUcobGspICE9IDApIHsKKyAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKWxrOworICAgIEtNUF9ERUJVR19BU1NFUlQobGNrICE9IE5VTEwpOworICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgIF9fa21wX3B1c2hfc3luYyhnbG9iYWxfdGlkLCBjdF9jcml0aWNhbCwgbG9jLCBsY2ssIF9fa21wX3VzZXJfbG9ja19zZXEpOworICAgIH0KKyAgICBLTVBfRF9MT0NLX0ZVTkMobGssIHNldCkobGssIGdsb2JhbF90aWQpOworICB9IGVsc2UgeworICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmlsayA9ICooKGttcF9pbmRpcmVjdF9sb2NrX3QgKiopbGspOworICAgIGxjayA9IGlsay0+bG9jazsKKyAgICBLTVBfREVCVUdfQVNTRVJUKGxjayAhPSBOVUxMKTsKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICBfX2ttcF9wdXNoX3N5bmMoZ2xvYmFsX3RpZCwgY3RfY3JpdGljYWwsIGxvYywgbGNrLCBfX2ttcF91c2VyX2xvY2tfc2VxKTsKKyAgICB9CisgICAgS01QX0lfTE9DS19GVU5DKGlsaywgc2V0KShsY2ssIGdsb2JhbF90aWQpOworICB9CisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgLy8gV2Uga25vdyB0aGF0IHRoZSBmYXN0IHJlZHVjdGlvbiBjb2RlIGlzIG9ubHkgZW1pdHRlZCBieSBJbnRlbCBjb21waWxlcnMKKyAgLy8gd2l0aCAzMiBieXRlIGNyaXRpY2FsIHNlY3Rpb25zLiBJZiB0aGVyZSBpc24ndCBlbm91Z2ggc3BhY2UsIHRoZW4gd2UKKyAgLy8gaGF2ZSB0byB1c2UgYSBwb2ludGVyLgorICBpZiAoX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZSA8PSBJTlRFTF9DUklUSUNBTF9TSVpFKSB7CisgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCljcml0OworICB9IGVsc2UgeworICAgIGxjayA9IF9fa21wX2dldF9jcml0aWNhbF9zZWN0aW9uX3B0cihjcml0LCBsb2MsIGdsb2JhbF90aWQpOworICB9CisgIEtNUF9ERUJVR19BU1NFUlQobGNrICE9IE5VTEwpOworCisgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spCisgICAgX19rbXBfcHVzaF9zeW5jKGdsb2JhbF90aWQsIGN0X2NyaXRpY2FsLCBsb2MsIGxjayk7CisKKyAgX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3MobGNrLCBnbG9iYWxfdGlkKTsKKworI2VuZGlmIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCit9CisKKy8vIHVzZWQgaW4gYSBjcml0aWNhbCBzZWN0aW9uIHJlZHVjZSBibG9jaworc3RhdGljIF9fZm9yY2VpbmxpbmUgdm9pZAorX19rbXBfZW5kX2NyaXRpY2FsX3NlY3Rpb25fcmVkdWNlX2Jsb2NrKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NyaXRpY2FsX25hbWUgKmNyaXQpIHsKKworICBrbXBfdXNlcl9sb2NrX3AgbGNrOworCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworICBpZiAoS01QX0lTX0RfTE9DSyhfX2ttcF91c2VyX2xvY2tfc2VxKSkgeworICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApY3JpdDsKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKQorICAgICAgX19rbXBfcG9wX3N5bmMoZ2xvYmFsX3RpZCwgY3RfY3JpdGljYWwsIGxvYyk7CisgICAgS01QX0RfTE9DS19GVU5DKGxjaywgdW5zZXQpKChrbXBfZHluYV9sb2NrX3QgKilsY2ssIGdsb2JhbF90aWQpOworICB9IGVsc2UgeworICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmlsayA9CisgICAgICAgIChrbXBfaW5kaXJlY3RfbG9ja190ICopVENSX1BUUigqKChrbXBfaW5kaXJlY3RfbG9ja190ICoqKWNyaXQpKTsKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKQorICAgICAgX19rbXBfcG9wX3N5bmMoZ2xvYmFsX3RpZCwgY3RfY3JpdGljYWwsIGxvYyk7CisgICAgS01QX0lfTE9DS19GVU5DKGlsaywgdW5zZXQpKGlsay0+bG9jaywgZ2xvYmFsX3RpZCk7CisgIH0KKworI2Vsc2UgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworICAvLyBXZSBrbm93IHRoYXQgdGhlIGZhc3QgcmVkdWN0aW9uIGNvZGUgaXMgb25seSBlbWl0dGVkIGJ5IEludGVsIGNvbXBpbGVycworICAvLyB3aXRoIDMyIGJ5dGUgY3JpdGljYWwgc2VjdGlvbnMuIElmIHRoZXJlIGlzbid0IGVub3VnaCBzcGFjZSwgdGhlbiB3ZSBoYXZlCisgIC8vIHRvIHVzZSBhIHBvaW50ZXIuCisgIGlmIChfX2ttcF9iYXNlX3VzZXJfbG9ja19zaXplID4gMzIpIHsKKyAgICBsY2sgPSAqKChrbXBfdXNlcl9sb2NrX3AgKiljcml0KTsKKyAgICBLTVBfQVNTRVJUKGxjayAhPSBOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKWNyaXQ7CisgIH0KKworICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKQorICAgIF9fa21wX3BvcF9zeW5jKGdsb2JhbF90aWQsIGN0X2NyaXRpY2FsLCBsb2MpOworCisgIF9fa21wX3JlbGVhc2VfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKGxjaywgZ2xvYmFsX3RpZCk7CisKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworfSAvLyBfX2ttcF9lbmRfY3JpdGljYWxfc2VjdGlvbl9yZWR1Y2VfYmxvY2sKKworLyogMi5hLmkuIFJlZHVjZSBCbG9jayB3aXRob3V0IGEgdGVybWluYXRpbmcgYmFycmllciAqLworLyohCitAaW5ncm91cCBTWU5DSFJPTklaQVRJT04KK0BwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCBnbG9iYWwgdGhyZWFkIG51bWJlcgorQHBhcmFtIG51bV92YXJzIG51bWJlciBvZiBpdGVtcyAodmFyaWFibGVzKSB0byBiZSByZWR1Y2VkCitAcGFyYW0gcmVkdWNlX3NpemUgc2l6ZSBvZiBkYXRhIGluIGJ5dGVzIHRvIGJlIHJlZHVjZWQKK0BwYXJhbSByZWR1Y2VfZGF0YSBwb2ludGVyIHRvIGRhdGEgdG8gYmUgcmVkdWNlZAorQHBhcmFtIHJlZHVjZV9mdW5jIGNhbGxiYWNrIGZ1bmN0aW9uIHByb3ZpZGluZyByZWR1Y3Rpb24gb3BlcmF0aW9uIG9uIHR3bworb3BlcmFuZHMgYW5kIHJldHVybmluZyByZXN1bHQgb2YgcmVkdWN0aW9uIGluIGxoc19kYXRhCitAcGFyYW0gbGNrIHBvaW50ZXIgdG8gdGhlIHVuaXF1ZSBsb2NrIGRhdGEgc3RydWN0dXJlCitAcmVzdWx0IDEgZm9yIHRoZSBtYXN0ZXIgdGhyZWFkLCAwIGZvciBhbGwgb3RoZXIgdGVhbSB0aHJlYWRzLCAyIGZvciBhbGwgdGVhbQordGhyZWFkcyBpZiBhdG9taWMgcmVkdWN0aW9uIG5lZWRlZAorCitUaGUgbm93YWl0IHZlcnNpb24gaXMgdXNlZCBmb3IgYSByZWR1Y2UgY2xhdXNlIHdpdGggdGhlIG5vd2FpdCBhcmd1bWVudC4KKyovCitrbXBfaW50MzIKK19fa21wY19yZWR1Y2Vfbm93YWl0KGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9pbnQzMiBudW1fdmFycywKKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByZWR1Y2Vfc2l6ZSwgdm9pZCAqcmVkdWNlX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICB2b2lkICgqcmVkdWNlX2Z1bmMpKHZvaWQgKmxoc19kYXRhLCB2b2lkICpyaHNfZGF0YSksCisgICAgICAgICAgICAgICAgICAgICBrbXBfY3JpdGljYWxfbmFtZSAqbGNrKSB7CisKKyAgS01QX0NPVU5UX0JMT0NLKFJFRFVDRV9ub3dhaXQpOworICBpbnQgcmV0dmFsID0gMDsKKyAgUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZDsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICBrbXBfdGVhbV90ICp0ZWFtOworICBrbXBfaW5mb190ICp0aDsKKyAgaW50IHRlYW1zX3N3YXBwZWQgPSAwLCB0YXNrX3N0YXRlOworI2VuZGlmCisgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19yZWR1Y2Vfbm93YWl0KCkgZW50ZXI6IGNhbGxlZCBUIyVkXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgLy8gd2h5IGRvIHdlIG5lZWQgdGhpcyBpbml0aWFsaXphdGlvbiBoZXJlIGF0IGFsbD8KKyAgLy8gUmVkdWN0aW9uIGNsYXVzZSBjYW4gbm90IGJlIHVzZWQgYXMgYSBzdGFuZC1hbG9uZSBkaXJlY3RpdmUuCisKKyAgLy8gZG8gbm90IGNhbGwgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKSwgaXQgd2lsbCBiZSBjYWxsZWQgYnkKKyAgLy8gX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpIGlmIG5lZWRlZAorICAvLyBwb3NzaWJsZSBkZXRlY3Rpb24gb2YgZmFsc2UtcG9zaXRpdmUgcmFjZSBieSB0aGUgdGhyZWFkY2hlY2tlciA/Pz8KKyAgaWYgKCFUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkKKyAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKy8vIGNoZWNrIGNvcnJlY3RuZXNzIG9mIHJlZHVjZSBibG9jayBuZXN0aW5nCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykKKyAgICBfX2ttcF9wdXNoX3N5bmMoZ2xvYmFsX3RpZCwgY3RfcmVkdWNlLCBsb2MsIE5VTEwsIDApOworI2Vsc2UKKyAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykKKyAgICBfX2ttcF9wdXNoX3N5bmMoZ2xvYmFsX3RpZCwgY3RfcmVkdWNlLCBsb2MsIE5VTEwpOworI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICB0aCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoZ2xvYmFsX3RpZCk7CisgIGlmICh0aC0+dGgudGhfdGVhbXNfbWljcm90YXNrKSB7IC8vIEFDOiBjaGVjayBpZiB3ZSBhcmUgaW5zaWRlIHRoZSB0ZWFtcworICAgIC8vIGNvbnN0cnVjdD8KKyAgICB0ZWFtID0gdGgtPnRoLnRoX3RlYW07CisgICAgaWYgKHRlYW0tPnQudF9sZXZlbCA9PSB0aC0+dGgudGhfdGVhbXNfbGV2ZWwpIHsKKyAgICAgIC8vIHRoaXMgaXMgcmVkdWN0aW9uIGF0IHRlYW1zIGNvbnN0cnVjdAorICAgICAgS01QX0RFQlVHX0FTU0VSVCghdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkKTsgLy8gQUM6IGNoZWNrIHRoYXQgdGlkID09IDAKKyAgICAgIC8vIExldCdzIHN3YXAgdGVhbXMgdGVtcG9yYXJpbHkgZm9yIHRoZSByZWR1Y3Rpb24gYmFycmllcgorICAgICAgdGVhbXNfc3dhcHBlZCA9IDE7CisgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aWQgPSB0ZWFtLT50LnRfbWFzdGVyX3RpZDsKKyAgICAgIHRoLT50aC50aF90ZWFtID0gdGVhbS0+dC50X3BhcmVudDsKKyAgICAgIHRoLT50aC50aF90ZWFtX25wcm9jID0gdGgtPnRoLnRoX3RlYW0tPnQudF9ucHJvYzsKKyAgICAgIHRoLT50aC50aF90YXNrX3RlYW0gPSB0aC0+dGgudGhfdGVhbS0+dC50X3Rhc2tfdGVhbVswXTsKKyAgICAgIHRhc2tfc3RhdGUgPSB0aC0+dGgudGhfdGFza19zdGF0ZTsKKyAgICAgIHRoLT50aC50aF90YXNrX3N0YXRlID0gMDsKKyAgICB9CisgIH0KKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisgIC8vIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kIHZhbHVlIHdpbGwgYmUgcmV1c2VkIGJ5IF9fa21wX2VuZF9yZWR1Y2UqIGZ1bmN0aW9uLAorICAvLyB0aGUgdmFsdWUgc2hvdWxkIGJlIGtlcHQgaW4gYSB2YXJpYWJsZQorICAvLyB0aGUgdmFyaWFibGUgc2hvdWxkIGJlIGVpdGhlciBhIGNvbnN0cnVjdC1zcGVjaWZpYyBvciB0aHJlYWQtc3BlY2lmaWMKKyAgLy8gcHJvcGVydHksIG5vdCBhIHRlYW0gc3BlY2lmaWMgcHJvcGVydHkKKyAgLy8gICAgIChhIHRocmVhZCBjYW4gcmVhY2ggdGhlIG5leHQgcmVkdWNlIGJsb2NrIG9uIHRoZSBuZXh0IGNvbnN0cnVjdCwgcmVkdWNlCisgIC8vICAgICBtZXRob2QgbWF5IGRpZmZlciBvbiB0aGUgbmV4dCBjb25zdHJ1Y3QpCisgIC8vIGFuIGlkZW50X3QgImxvYyIgcGFyYW1ldGVyIGNvdWxkIGJlIHVzZWQgYXMgYSBjb25zdHJ1Y3Qtc3BlY2lmaWMgcHJvcGVydHkKKyAgLy8gKHdoYXQgaWYgbG9jID09IDA/KQorICAvLyAgICAgKGlmIGJvdGggY29uc3RydWN0LXNwZWNpZmljIGFuZCB0ZWFtLXNwZWNpZmljIHZhcmlhYmxlcyB3ZXJlIHNoYXJlZCwKKyAgLy8gICAgIHRoZW4gdW5uZXNzIGV4dHJhIHN5bmNzIHNob3VsZCBiZSBuZWVkZWQpCisgIC8vIGEgdGhyZWFkLXNwZWNpZmljIHZhcmlhYmxlIGlzIGJldHRlciByZWdhcmRpbmcgdHdvIGlzc3VlcyBhYm92ZSAobmV4dAorICAvLyBjb25zdHJ1Y3QgYW5kIGV4dHJhIHN5bmNzKQorICAvLyBhIHRocmVhZC1zcGVjaWZpYyAidGhfbG9jYWwucmVkdWN0aW9uX21ldGhvZCIgdmFyaWFibGUgaXMgdXNlZCBjdXJyZW50bHkKKyAgLy8gZWFjaCB0aHJlYWQgZXhlY3V0ZXMgJ2RldGVybWluZScgYW5kICdzZXQnIGxpbmVzIChubyBuZWVkIHRvIGV4ZWN1dGUgYnkgb25lCisgIC8vIHRocmVhZCwgdG8gYXZvaWQgdW5uZXNzIGV4dHJhIHN5bmNzKQorCisgIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID0gX19rbXBfZGV0ZXJtaW5lX3JlZHVjdGlvbl9tZXRob2QoCisgICAgICBsb2MsIGdsb2JhbF90aWQsIG51bV92YXJzLCByZWR1Y2Vfc2l6ZSwgcmVkdWNlX2RhdGEsIHJlZHVjZV9mdW5jLCBsY2spOworICBfX0tNUF9TRVRfUkVEVUNUSU9OX01FVEhPRChnbG9iYWxfdGlkLCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCk7CisKKyAgaWYgKHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGNyaXRpY2FsX3JlZHVjZV9ibG9jaykgeworCisgICAgX19rbXBfZW50ZXJfY3JpdGljYWxfc2VjdGlvbl9yZWR1Y2VfYmxvY2sobG9jLCBnbG9iYWxfdGlkLCBsY2spOworICAgIHJldHZhbCA9IDE7CisKKyAgfSBlbHNlIGlmIChwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9PSBlbXB0eV9yZWR1Y2VfYmxvY2spIHsKKworICAgIC8vIHVzYWdlOiBpZiB0ZWFtIHNpemUgPT0gMSwgbm8gc3luY2hyb25pemF0aW9uIGlzIHJlcXVpcmVkICggSW50ZWwKKyAgICAvLyBwbGF0Zm9ybXMgb25seSApCisgICAgcmV0dmFsID0gMTsKKworICB9IGVsc2UgaWYgKHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGF0b21pY19yZWR1Y2VfYmxvY2spIHsKKworICAgIHJldHZhbCA9IDI7CisKKyAgICAvLyBhbGwgdGhyZWFkcyBzaG91bGQgZG8gdGhpcyBwb3AgaGVyZSAoYmVjYXVzZSBfX2ttcGNfZW5kX3JlZHVjZV9ub3dhaXQoKQorICAgIC8vIHdvbid0IGJlIGNhbGxlZCBieSB0aGUgY29kZSBnZW4pCisgICAgLy8gICAgIChpdCdzIG5vdCBxdWl0ZSBnb29kLCBiZWNhdXNlIHRoZSBjaGVja2luZyBibG9jayBoYXMgYmVlbiBjbG9zZWQgYnkKKyAgICAvLyAgICAgdGhpcyAncG9wJywKKyAgICAvLyAgICAgIGJ1dCBhdG9taWMgb3BlcmF0aW9uIGhhcyBub3QgYmVlbiBleGVjdXRlZCB5ZXQsIHdpbGwgYmUgZXhlY3V0ZWQKKyAgICAvLyAgICAgIHNsaWdodGx5IGxhdGVyLCBsaXRlcmFsbHkgb24gbmV4dCBpbnN0cnVjdGlvbikKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKQorICAgICAgX19rbXBfcG9wX3N5bmMoZ2xvYmFsX3RpZCwgY3RfcmVkdWNlLCBsb2MpOworCisgIH0gZWxzZSBpZiAoVEVTVF9SRURVQ1RJT05fTUVUSE9EKHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlX3JlZHVjZV9ibG9jaykpIHsKKworLy8gQVQ6IHBlcmZvcm1hbmNlIGlzc3VlOiBhIHJlYWwgYmFycmllciBoZXJlCisvLyBBVDogICAgIChpZiBtYXN0ZXIgZ29lcyBzbG93LCBvdGhlciB0aHJlYWRzIGFyZSBibG9ja2VkIGhlcmUgd2FpdGluZyBmb3IgdGhlCisvLyBtYXN0ZXIgdG8gY29tZSBhbmQgcmVsZWFzZSB0aGVtKQorLy8gQVQ6ICAgICAoaXQncyBub3Qgd2hhdCBhIGN1c3RvbWVyIG1pZ2h0IGV4cGVjdCBzcGVjaWZ5aW5nIE5PV0FJVCBjbGF1c2UpCisvLyBBVDogICAgIChzcGVjaWZ5aW5nIE5PV0FJVCB3b24ndCByZXN1bHQgaW4gaW1wcm92ZW1lbnQgb2YgcGVyZm9ybWFuY2UsIGl0J2xsCisvLyBiZSBjb25mdXNpbmcgdG8gYSBjdXN0b21lcikKKy8vIEFUOiBhbm90aGVyIGltcGxlbWVudGF0aW9uIG9mICpiYXJyaWVyX2dhdGhlcipub3dhaXQoKSAob3Igc29tZSBvdGhlciBkZXNpZ24pCisvLyBtaWdodCBnbyBmYXN0ZXIgYW5kIGJlIG1vcmUgaW4gbGluZSB3aXRoIHNlbnNlIG9mIE5PV0FJVAorLy8gQVQ6IFRPIERPOiBkbyBlcGNjIHRlc3QgYW5kIGNvbXBhcmUgdGltZXMKKworLy8gdGhpcyBiYXJyaWVyIHNob3VsZCBiZSBpbnZpc2libGUgdG8gYSBjdXN0b21lciBhbmQgdG8gdGhlIHRocmVhZGluZyBwcm9maWxlCisvLyB0b29sIChpdCdzIG5laXRoZXIgYSB0ZXJtaW5hdGluZyBiYXJyaWVyIG5vciBjdXN0b21lcidzIGNvZGUsIGl0J3MKKy8vIHVzZWQgZm9yIGFuIGludGVybmFsIHB1cnBvc2UpCisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdLT50aC50aF9pZGVudCA9IGxvYzsKKyNlbmRpZgorICAgIHJldHZhbCA9CisgICAgICAgIF9fa21wX2JhcnJpZXIoVU5QQUNLX1JFRFVDVElPTl9CQVJSSUVSKHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kKSwKKyAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCBGQUxTRSwgcmVkdWNlX3NpemUsIHJlZHVjZV9kYXRhLCByZWR1Y2VfZnVuYyk7CisgICAgcmV0dmFsID0gKHJldHZhbCAhPSAwKSA/ICgwKSA6ICgxKTsKKworICAgIC8vIGFsbCBvdGhlciB3b3JrZXJzIGV4Y2VwdCBtYXN0ZXIgc2hvdWxkIGRvIHRoaXMgcG9wIGhlcmUKKyAgICAvLyAgICAgKCBub25lIG9mIG90aGVyIHdvcmtlcnMgd2lsbCBnZXQgdG8gX19rbXBjX2VuZF9yZWR1Y2Vfbm93YWl0KCkgKQorICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgIGlmIChyZXR2YWwgPT0gMCkgeworICAgICAgICBfX2ttcF9wb3Bfc3luYyhnbG9iYWxfdGlkLCBjdF9yZWR1Y2UsIGxvYyk7CisgICAgICB9CisgICAgfQorCisgIH0gZWxzZSB7CisKKyAgICAvLyBzaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBibG9jaworICAgIEtNUF9BU1NFUlQoMCk7IC8vICJ1bmV4cGVjdGVkIG1ldGhvZCIKKyAgfQorI2lmIE9NUF80MF9FTkFCTEVECisgIGlmICh0ZWFtc19zd2FwcGVkKSB7CisgICAgLy8gUmVzdG9yZSB0aHJlYWQgc3RydWN0dXJlCisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkID0gMDsKKyAgICB0aC0+dGgudGhfdGVhbSA9IHRlYW07CisgICAgdGgtPnRoLnRoX3RlYW1fbnByb2MgPSB0ZWFtLT50LnRfbnByb2M7CisgICAgdGgtPnRoLnRoX3Rhc2tfdGVhbSA9IHRlYW0tPnQudF90YXNrX3RlYW1bdGFza19zdGF0ZV07CisgICAgdGgtPnRoLnRoX3Rhc2tfc3RhdGUgPSB0YXNrX3N0YXRlOworICB9CisjZW5kaWYKKyAgS0FfVFJBQ0UoCisgICAgICAxMCwKKyAgICAgICgiX19rbXBjX3JlZHVjZV9ub3dhaXQoKSBleGl0OiBjYWxsZWQgVCMlZDogbWV0aG9kICUwOHgsIHJldHVybnMgJTA4eFxuIiwKKyAgICAgICBnbG9iYWxfdGlkLCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCwgcmV0dmFsKSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyohCitAaW5ncm91cCBTWU5DSFJPTklaQVRJT04KK0BwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCBnbG9iYWwgdGhyZWFkIGlkLgorQHBhcmFtIGxjayBwb2ludGVyIHRvIHRoZSB1bmlxdWUgbG9jayBkYXRhIHN0cnVjdHVyZQorCitGaW5pc2ggdGhlIGV4ZWN1dGlvbiBvZiBhIHJlZHVjZSBub3dhaXQuCisqLwordm9pZCBfX2ttcGNfZW5kX3JlZHVjZV9ub3dhaXQoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jcml0aWNhbF9uYW1lICpsY2spIHsKKworICBQQUNLRURfUkVEVUNUSU9OX01FVEhPRF9UIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kOworCisgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19lbmRfcmVkdWNlX25vd2FpdCgpIGVudGVyOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCkpOworCisgIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID0gX19LTVBfR0VUX1JFRFVDVElPTl9NRVRIT0QoZ2xvYmFsX3RpZCk7CisKKyAgaWYgKHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGNyaXRpY2FsX3JlZHVjZV9ibG9jaykgeworCisgICAgX19rbXBfZW5kX2NyaXRpY2FsX3NlY3Rpb25fcmVkdWNlX2Jsb2NrKGxvYywgZ2xvYmFsX3RpZCwgbGNrKTsKKworICB9IGVsc2UgaWYgKHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGVtcHR5X3JlZHVjZV9ibG9jaykgeworCisgICAgLy8gdXNhZ2U6IGlmIHRlYW0gc2l6ZSA9PSAxLCBubyBzeW5jaHJvbml6YXRpb24gaXMgcmVxdWlyZWQgKCBvbiBJbnRlbAorICAgIC8vIHBsYXRmb3JtcyBvbmx5ICkKKworICB9IGVsc2UgaWYgKHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGF0b21pY19yZWR1Y2VfYmxvY2spIHsKKworICAgIC8vIG5laXRoZXIgbWFzdGVyIG5vciBvdGhlciB3b3JrZXJzIHNob3VsZCBnZXQgaGVyZQorICAgIC8vICAgICAoY29kZSBnZW4gZG9lcyBub3QgZ2VuZXJhdGUgdGhpcyBjYWxsIGluIGNhc2UgMjogYXRvbWljIHJlZHVjZSBibG9jaykKKyAgICAvLyBhY3R1YWxseSBpdCdzIGJldHRlciB0byByZW1vdmUgdGhpcyBlbHNlaWYgYXQgYWxsOworICAgIC8vIGFmdGVyIHJlbW92YWwgdGhpcyB2YWx1ZSB3aWxsIGNoZWNrZWQgYnkgdGhlICdlbHNlJyBhbmQgd2lsbCBhc3NlcnQKKworICB9IGVsc2UgaWYgKFRFU1RfUkVEVUNUSU9OX01FVEhPRChwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZV9yZWR1Y2VfYmxvY2spKSB7CisKKyAgICAvLyBvbmx5IG1hc3RlciBnZXRzIGhlcmUKKworICB9IGVsc2UgeworCisgICAgLy8gc2hvdWxkIG5ldmVyIHJlYWNoIHRoaXMgYmxvY2sKKyAgICBLTVBfQVNTRVJUKDApOyAvLyAidW5leHBlY3RlZCBtZXRob2QiCisgIH0KKworICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKQorICAgIF9fa21wX3BvcF9zeW5jKGdsb2JhbF90aWQsIGN0X3JlZHVjZSwgbG9jKTsKKworICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfZW5kX3JlZHVjZV9ub3dhaXQoKSBleGl0OiBjYWxsZWQgVCMlZDogbWV0aG9kICUwOHhcbiIsCisgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QpKTsKKworICByZXR1cm47Cit9CisKKy8qIDIuYS5paS4gUmVkdWNlIEJsb2NrIHdpdGggYSB0ZXJtaW5hdGluZyBiYXJyaWVyICovCisKKy8qIQorQGluZ3JvdXAgU1lOQ0hST05JWkFUSU9OCitAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgZ2xvYmFsIHRocmVhZCBudW1iZXIKK0BwYXJhbSBudW1fdmFycyBudW1iZXIgb2YgaXRlbXMgKHZhcmlhYmxlcykgdG8gYmUgcmVkdWNlZAorQHBhcmFtIHJlZHVjZV9zaXplIHNpemUgb2YgZGF0YSBpbiBieXRlcyB0byBiZSByZWR1Y2VkCitAcGFyYW0gcmVkdWNlX2RhdGEgcG9pbnRlciB0byBkYXRhIHRvIGJlIHJlZHVjZWQKK0BwYXJhbSByZWR1Y2VfZnVuYyBjYWxsYmFjayBmdW5jdGlvbiBwcm92aWRpbmcgcmVkdWN0aW9uIG9wZXJhdGlvbiBvbiB0d28KK29wZXJhbmRzIGFuZCByZXR1cm5pbmcgcmVzdWx0IG9mIHJlZHVjdGlvbiBpbiBsaHNfZGF0YQorQHBhcmFtIGxjayBwb2ludGVyIHRvIHRoZSB1bmlxdWUgbG9jayBkYXRhIHN0cnVjdHVyZQorQHJlc3VsdCAxIGZvciB0aGUgbWFzdGVyIHRocmVhZCwgMCBmb3IgYWxsIG90aGVyIHRlYW0gdGhyZWFkcywgMiBmb3IgYWxsIHRlYW0KK3RocmVhZHMgaWYgYXRvbWljIHJlZHVjdGlvbiBuZWVkZWQKKworQSBibG9ja2luZyByZWR1Y2UgdGhhdCBpbmNsdWRlcyBhbiBpbXBsaWNpdCBiYXJyaWVyLgorKi8KK2ttcF9pbnQzMiBfX2ttcGNfcmVkdWNlKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9pbnQzMiBudW1fdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByZWR1Y2Vfc2l6ZSwgdm9pZCAqcmVkdWNlX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqcmVkdWNlX2Z1bmMpKHZvaWQgKmxoc19kYXRhLCB2b2lkICpyaHNfZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY3JpdGljYWxfbmFtZSAqbGNrKSB7CisgIEtNUF9DT1VOVF9CTE9DSyhSRURVQ0Vfd2FpdCk7CisgIGludCByZXR2YWwgPSAwOworICBQQUNLRURfUkVEVUNUSU9OX01FVEhPRF9UIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kOworCisgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19yZWR1Y2UoKSBlbnRlcjogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQpKTsKKworICAvLyB3aHkgZG8gd2UgbmVlZCB0aGlzIGluaXRpYWxpemF0aW9uIGhlcmUgYXQgYWxsPworICAvLyBSZWR1Y3Rpb24gY2xhdXNlIGNhbiBub3QgYmUgYSBzdGFuZC1hbG9uZSBkaXJlY3RpdmUuCisKKyAgLy8gZG8gbm90IGNhbGwgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKSwgaXQgd2lsbCBiZSBjYWxsZWQgYnkKKyAgLy8gX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpIGlmIG5lZWRlZAorICAvLyBwb3NzaWJsZSBkZXRlY3Rpb24gb2YgZmFsc2UtcG9zaXRpdmUgcmFjZSBieSB0aGUgdGhyZWFkY2hlY2tlciA/Pz8KKyAgaWYgKCFUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkKKyAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKy8vIGNoZWNrIGNvcnJlY3RuZXNzIG9mIHJlZHVjZSBibG9jayBuZXN0aW5nCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykKKyAgICBfX2ttcF9wdXNoX3N5bmMoZ2xvYmFsX3RpZCwgY3RfcmVkdWNlLCBsb2MsIE5VTEwsIDApOworI2Vsc2UKKyAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykKKyAgICBfX2ttcF9wdXNoX3N5bmMoZ2xvYmFsX3RpZCwgY3RfcmVkdWNlLCBsb2MsIE5VTEwpOworI2VuZGlmCisKKyAgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPSBfX2ttcF9kZXRlcm1pbmVfcmVkdWN0aW9uX21ldGhvZCgKKyAgICAgIGxvYywgZ2xvYmFsX3RpZCwgbnVtX3ZhcnMsIHJlZHVjZV9zaXplLCByZWR1Y2VfZGF0YSwgcmVkdWNlX2Z1bmMsIGxjayk7CisgIF9fS01QX1NFVF9SRURVQ1RJT05fTUVUSE9EKGdsb2JhbF90aWQsIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kKTsKKworICBpZiAocGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gY3JpdGljYWxfcmVkdWNlX2Jsb2NrKSB7CisKKyAgICBfX2ttcF9lbnRlcl9jcml0aWNhbF9zZWN0aW9uX3JlZHVjZV9ibG9jayhsb2MsIGdsb2JhbF90aWQsIGxjayk7CisgICAgcmV0dmFsID0gMTsKKworICB9IGVsc2UgaWYgKHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGVtcHR5X3JlZHVjZV9ibG9jaykgeworCisgICAgLy8gdXNhZ2U6IGlmIHRlYW0gc2l6ZSA9PSAxLCBubyBzeW5jaHJvbml6YXRpb24gaXMgcmVxdWlyZWQgKCBJbnRlbAorICAgIC8vIHBsYXRmb3JtcyBvbmx5ICkKKyAgICByZXR2YWwgPSAxOworCisgIH0gZWxzZSBpZiAocGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gYXRvbWljX3JlZHVjZV9ibG9jaykgeworCisgICAgcmV0dmFsID0gMjsKKworICB9IGVsc2UgaWYgKFRFU1RfUkVEVUNUSU9OX01FVEhPRChwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZV9yZWR1Y2VfYmxvY2spKSB7CisKKy8vIGNhc2UgdHJlZV9yZWR1Y2VfYmxvY2s6CisvLyB0aGlzIGJhcnJpZXIgc2hvdWxkIGJlIHZpc2libGUgdG8gYSBjdXN0b21lciBhbmQgdG8gdGhlIHRocmVhZGluZyBwcm9maWxlCisvLyB0b29sIChpdCdzIGEgdGVybWluYXRpbmcgYmFycmllciBvbiBjb25zdHJ1Y3RzIGlmIE5PV0FJVCBub3Qgc3BlY2lmaWVkKQorI2lmIFVTRV9JVFRfTk9USUZZCisgICAgX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXS0+dGgudGhfaWRlbnQgPQorICAgICAgICBsb2M7IC8vIG5lZWRlZCBmb3IgY29ycmVjdCBub3RpZmljYXRpb24gb2YgZnJhbWVzCisjZW5kaWYKKyAgICByZXR2YWwgPQorICAgICAgICBfX2ttcF9iYXJyaWVyKFVOUEFDS19SRURVQ1RJT05fQkFSUklFUihwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCksCisgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgVFJVRSwgcmVkdWNlX3NpemUsIHJlZHVjZV9kYXRhLCByZWR1Y2VfZnVuYyk7CisgICAgcmV0dmFsID0gKHJldHZhbCAhPSAwKSA/ICgwKSA6ICgxKTsKKworICAgIC8vIGFsbCBvdGhlciB3b3JrZXJzIGV4Y2VwdCBtYXN0ZXIgc2hvdWxkIGRvIHRoaXMgcG9wIGhlcmUKKyAgICAvLyAoIG5vbmUgb2Ygb3RoZXIgd29ya2VycyBleGNlcHQgbWFzdGVyIHdpbGwgZW50ZXIgX19rbXBjX2VuZF9yZWR1Y2UoKSApCisgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgaWYgKHJldHZhbCA9PSAwKSB7IC8vIDA6IGFsbCBvdGhlciB3b3JrZXJzOyAxOiBtYXN0ZXIKKyAgICAgICAgX19rbXBfcG9wX3N5bmMoZ2xvYmFsX3RpZCwgY3RfcmVkdWNlLCBsb2MpOworICAgICAgfQorICAgIH0KKworICB9IGVsc2UgeworCisgICAgLy8gc2hvdWxkIG5ldmVyIHJlYWNoIHRoaXMgYmxvY2sKKyAgICBLTVBfQVNTRVJUKDApOyAvLyAidW5leHBlY3RlZCBtZXRob2QiCisgIH0KKworICBLQV9UUkFDRSgxMCwKKyAgICAgICAgICAgKCJfX2ttcGNfcmVkdWNlKCkgZXhpdDogY2FsbGVkIFQjJWQ6IG1ldGhvZCAlMDh4LCByZXR1cm5zICUwOHhcbiIsCisgICAgICAgICAgICBnbG9iYWxfdGlkLCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCwgcmV0dmFsKSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyohCitAaW5ncm91cCBTWU5DSFJPTklaQVRJT04KK0BwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCBnbG9iYWwgdGhyZWFkIGlkLgorQHBhcmFtIGxjayBwb2ludGVyIHRvIHRoZSB1bmlxdWUgbG9jayBkYXRhIHN0cnVjdHVyZQorCitGaW5pc2ggdGhlIGV4ZWN1dGlvbiBvZiBhIGJsb2NraW5nIHJlZHVjZS4KK1RoZSA8dHQ+bGNrPC90dD4gcG9pbnRlciBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoYXQgdXNlZCBpbiB0aGUgY29ycmVzcG9uZGluZworc3RhcnQgZnVuY3Rpb24uCisqLwordm9pZCBfX2ttcGNfZW5kX3JlZHVjZShpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICBrbXBfY3JpdGljYWxfbmFtZSAqbGNrKSB7CisKKyAgUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZDsKKworICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfZW5kX3JlZHVjZSgpIGVudGVyOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCkpOworCisgIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID0gX19LTVBfR0VUX1JFRFVDVElPTl9NRVRIT0QoZ2xvYmFsX3RpZCk7CisKKyAgLy8gdGhpcyBiYXJyaWVyIHNob3VsZCBiZSB2aXNpYmxlIHRvIGEgY3VzdG9tZXIgYW5kIHRvIHRoZSB0aHJlYWRpbmcgcHJvZmlsZQorICAvLyB0b29sIChpdCdzIGEgdGVybWluYXRpbmcgYmFycmllciBvbiBjb25zdHJ1Y3RzIGlmIE5PV0FJVCBub3Qgc3BlY2lmaWVkKQorCisgIGlmIChwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9PSBjcml0aWNhbF9yZWR1Y2VfYmxvY2spIHsKKworICAgIF9fa21wX2VuZF9jcml0aWNhbF9zZWN0aW9uX3JlZHVjZV9ibG9jayhsb2MsIGdsb2JhbF90aWQsIGxjayk7CisKKy8vIFRPRE86IGltcGxpY2l0IGJhcnJpZXI6IHNob3VsZCBiZSBleHBvc2VkCisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdLT50aC50aF9pZGVudCA9IGxvYzsKKyNlbmRpZgorICAgIF9fa21wX2JhcnJpZXIoYnNfcGxhaW5fYmFycmllciwgZ2xvYmFsX3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwpOworCisgIH0gZWxzZSBpZiAocGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gZW1wdHlfcmVkdWNlX2Jsb2NrKSB7CisKKy8vIHVzYWdlOiBpZiB0ZWFtIHNpemU9PTEsIG5vIHN5bmNocm9uaXphdGlvbiBpcyByZXF1aXJlZCAoSW50ZWwgcGxhdGZvcm1zIG9ubHkpCisKKy8vIFRPRE86IGltcGxpY2l0IGJhcnJpZXI6IHNob3VsZCBiZSBleHBvc2VkCisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdLT50aC50aF9pZGVudCA9IGxvYzsKKyNlbmRpZgorICAgIF9fa21wX2JhcnJpZXIoYnNfcGxhaW5fYmFycmllciwgZ2xvYmFsX3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwpOworCisgIH0gZWxzZSBpZiAocGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gYXRvbWljX3JlZHVjZV9ibG9jaykgeworCisvLyBUT0RPOiBpbXBsaWNpdCBiYXJyaWVyOiBzaG91bGQgYmUgZXhwb3NlZAorI2lmIFVTRV9JVFRfTk9USUZZCisgICAgX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXS0+dGgudGhfaWRlbnQgPSBsb2M7CisjZW5kaWYKKyAgICBfX2ttcF9iYXJyaWVyKGJzX3BsYWluX2JhcnJpZXIsIGdsb2JhbF90aWQsIEZBTFNFLCAwLCBOVUxMLCBOVUxMKTsKKworICB9IGVsc2UgaWYgKFRFU1RfUkVEVUNUSU9OX01FVEhPRChwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZV9yZWR1Y2VfYmxvY2spKSB7CisKKyAgICAvLyBvbmx5IG1hc3RlciBleGVjdXRlcyBoZXJlIChtYXN0ZXIgcmVsZWFzZXMgYWxsIG90aGVyIHdvcmtlcnMpCisgICAgX19rbXBfZW5kX3NwbGl0X2JhcnJpZXIoVU5QQUNLX1JFRFVDVElPTl9CQVJSSUVSKHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkKTsKKworICB9IGVsc2UgeworCisgICAgLy8gc2hvdWxkIG5ldmVyIHJlYWNoIHRoaXMgYmxvY2sKKyAgICBLTVBfQVNTRVJUKDApOyAvLyAidW5leHBlY3RlZCBtZXRob2QiCisgIH0KKworICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKQorICAgIF9fa21wX3BvcF9zeW5jKGdsb2JhbF90aWQsIGN0X3JlZHVjZSwgbG9jKTsKKworICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfZW5kX3JlZHVjZSgpIGV4aXQ6IGNhbGxlZCBUIyVkOiBtZXRob2QgJTA4eFxuIiwKKyAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCkpOworCisgIHJldHVybjsKK30KKworI3VuZGVmIF9fS01QX0dFVF9SRURVQ1RJT05fTUVUSE9ECisjdW5kZWYgX19LTVBfU0VUX1JFRFVDVElPTl9NRVRIT0QKKworLyogZW5kIG9mIGludGVyZmFjZSB0byBmYXN0IHNjYWxhYmxlIHJlZHVjZSByb3V0aW5lcyAqLworCitrbXBfdWludDY0IF9fa21wY19nZXRfdGFza2lkKCkgeworCisgIGttcF9pbnQzMiBndGlkOworICBrbXBfaW5mb190ICp0aHJlYWQ7CisKKyAgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgIGlmIChndGlkIDwgMCkgeworICAgIHJldHVybiAwOworICB9OyAvLyBpZgorICB0aHJlYWQgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKGd0aWQpOworICByZXR1cm4gdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX3Rhc2tfaWQ7CisKK30gLy8gX19rbXBjX2dldF90YXNraWQKKwora21wX3VpbnQ2NCBfX2ttcGNfZ2V0X3BhcmVudF90YXNraWQoKSB7CisKKyAga21wX2ludDMyIGd0aWQ7CisgIGttcF9pbmZvX3QgKnRocmVhZDsKKyAga21wX3Rhc2tkYXRhX3QgKnBhcmVudF90YXNrOworCisgIGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICBpZiAoZ3RpZCA8IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfTsgLy8gaWYKKyAgdGhyZWFkID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZChndGlkKTsKKyAgcGFyZW50X3Rhc2sgPSB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfcGFyZW50OworICByZXR1cm4gKHBhcmVudF90YXNrID09IE5VTEwgPyAwIDogcGFyZW50X3Rhc2stPnRkX3Rhc2tfaWQpOworCit9IC8vIF9fa21wY19nZXRfcGFyZW50X3Rhc2tpZAorCisjaWYgT01QXzQ1X0VOQUJMRUQKKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitAcGFyYW0gZ3RpZCAgZ2xvYmFsIHRocmVhZCBudW1iZXIuCitAcGFyYW0gbnVtX2RpbXMgIG51bWJlciBvZiBhc3NvY2lhdGVkIGRvYWNyb3NzIGxvb3BzLgorQHBhcmFtIGRpbXMgIGluZm8gb24gbG9vcHMgYm91bmRzLgorCitJbml0aWFsaXplIGRvYWNyb3NzIGxvb3AgaW5mb3JtYXRpb24uCitFeHBlY3QgY29tcGlsZXIgc2VuZCB1cyBpbmNsdXNpdmUgYm91bmRzLAorZS5nLiBmb3IoaT0yO2k8OTtpKz0yKSBsbz0yLCB1cD04LCBzdD0yLgorKi8KK3ZvaWQgX19rbXBjX2RvYWNyb3NzX2luaXQoaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwgaW50IG51bV9kaW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qga21wX2RpbSAqZGltcykgeworICBpbnQgaiwgaWR4OworICBrbXBfaW50NjQgbGFzdCwgdHJhY2VfY291bnQ7CisgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAga21wX3RlYW1fdCAqdGVhbSA9IHRoLT50aC50aF90ZWFtOworICBrbXBfdWludDMyICpmbGFnczsKKyAga21wX2Rpc3BfdCAqcHJfYnVmID0gdGgtPnRoLnRoX2Rpc3BhdGNoOworICBkaXNwYXRjaF9zaGFyZWRfaW5mb190ICpzaF9idWY7CisKKyAgS0FfVFJBQ0UoCisgICAgICAyMCwKKyAgICAgICgiX19rbXBjX2RvYWNyb3NzX2luaXQoKSBlbnRlcjogY2FsbGVkIFQjJWQsIG51bSBkaW1zICVkLCBhY3RpdmUgJWRcbiIsCisgICAgICAgZ3RpZCwgbnVtX2RpbXMsICF0ZWFtLT50LnRfc2VyaWFsaXplZCkpOworICBLTVBfREVCVUdfQVNTRVJUKGRpbXMgIT0gTlVMTCk7CisgIEtNUF9ERUJVR19BU1NFUlQobnVtX2RpbXMgPiAwKTsKKworICBpZiAodGVhbS0+dC50X3NlcmlhbGl6ZWQpIHsKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcGNfZG9hY3Jvc3NfaW5pdCgpIGV4aXQ6IHNlcmlhbGl6ZWQgdGVhbVxuIikpOworICAgIHJldHVybjsgLy8gbm8gZGVwZW5kZW5jaWVzIGlmIHRlYW0gaXMgc2VyaWFsaXplZAorICB9CisgIEtNUF9ERUJVR19BU1NFUlQodGVhbS0+dC50X25wcm9jID4gMSk7CisgIGlkeCA9IHByX2J1Zi0+dGhfZG9hY3Jvc3NfYnVmX2lkeCsrOyAvLyBJbmNyZW1lbnQgaW5kZXggb2Ygc2hhcmVkIGJ1ZmZlciBmb3IKKyAgLy8gdGhlIG5leHQgbG9vcAorICBzaF9idWYgPSAmdGVhbS0+dC50X2Rpc3BfYnVmZmVyW2lkeCAlIF9fa21wX2Rpc3BhdGNoX251bV9idWZmZXJzXTsKKworICAvLyBTYXZlIGJvdW5kcyBpbmZvIGludG8gYWxsb2NhdGVkIHByaXZhdGUgYnVmZmVyCisgIEtNUF9ERUJVR19BU1NFUlQocHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvID09IE5VTEwpOworICBwcl9idWYtPnRoX2RvYWNyb3NzX2luZm8gPSAoa21wX2ludDY0ICopX19rbXBfdGhyZWFkX21hbGxvYygKKyAgICAgIHRoLCBzaXplb2Yoa21wX2ludDY0KSAqICg0ICogbnVtX2RpbXMgKyAxKSk7CisgIEtNUF9ERUJVR19BU1NFUlQocHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvICE9IE5VTEwpOworICBwcl9idWYtPnRoX2RvYWNyb3NzX2luZm9bMF0gPQorICAgICAgKGttcF9pbnQ2NCludW1fZGltczsgLy8gZmlyc3QgZWxlbWVudCBpcyBudW1iZXIgb2YgZGltZW5zaW9ucworICAvLyBTYXZlIGFsc28gYWRkcmVzcyBvZiBudW1fZG9uZSBpbiBvcmRlciB0byBhY2Nlc3MgaXQgbGF0ZXIgd2l0aG91dCBrbm93aW5nCisgIC8vIHRoZSBidWZmZXIgaW5kZXgKKyAgcHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvWzFdID0gKGttcF9pbnQ2NCkmc2hfYnVmLT5kb2Fjcm9zc19udW1fZG9uZTsKKyAgcHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvWzJdID0gZGltc1swXS5sbzsKKyAgcHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvWzNdID0gZGltc1swXS51cDsKKyAgcHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvWzRdID0gZGltc1swXS5zdDsKKyAgbGFzdCA9IDU7CisgIGZvciAoaiA9IDE7IGogPCBudW1fZGltczsgKytqKSB7CisgICAga21wX2ludDY0CisgICAgICAgIHJhbmdlX2xlbmd0aDsgLy8gVG8ga2VlcCByYW5nZXMgb2YgYWxsIGRpbWVuc2lvbnMgYnV0IHRoZSBmaXJzdCBkaW1zWzBdCisgICAgaWYgKGRpbXNbal0uc3QgPT0gMSkgeyAvLyBtb3N0IGNvbW1vbiBjYXNlCisgICAgICAvLyBBQzogc2hvdWxkIHdlIGNhcmUgb2YgcmFuZ2VzIGJpZ2dlciB0aGFuIExMT05HX01BWD8gKG5vdCBmb3Igbm93KQorICAgICAgcmFuZ2VfbGVuZ3RoID0gZGltc1tqXS51cCAtIGRpbXNbal0ubG8gKyAxOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoZGltc1tqXS5zdCA+IDApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChkaW1zW2pdLnVwID4gZGltc1tqXS5sbyk7CisgICAgICAgIHJhbmdlX2xlbmd0aCA9IChrbXBfdWludDY0KShkaW1zW2pdLnVwIC0gZGltc1tqXS5sbykgLyBkaW1zW2pdLnN0ICsgMTsKKyAgICAgIH0gZWxzZSB7IC8vIG5lZ2F0aXZlIGluY3JlbWVudAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGRpbXNbal0ubG8gPiBkaW1zW2pdLnVwKTsKKyAgICAgICAgcmFuZ2VfbGVuZ3RoID0KKyAgICAgICAgICAgIChrbXBfdWludDY0KShkaW1zW2pdLmxvIC0gZGltc1tqXS51cCkgLyAoLWRpbXNbal0uc3QpICsgMTsKKyAgICAgIH0KKyAgICB9CisgICAgcHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvW2xhc3QrK10gPSByYW5nZV9sZW5ndGg7CisgICAgcHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvW2xhc3QrK10gPSBkaW1zW2pdLmxvOworICAgIHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mb1tsYXN0KytdID0gZGltc1tqXS51cDsKKyAgICBwcl9idWYtPnRoX2RvYWNyb3NzX2luZm9bbGFzdCsrXSA9IGRpbXNbal0uc3Q7CisgIH0KKworICAvLyBDb21wdXRlIHRvdGFsIHRyaXAgY291bnQuCisgIC8vIFN0YXJ0IHdpdGggcmFuZ2Ugb2YgZGltc1swXSB3aGljaCB3ZSBkb24ndCBuZWVkIHRvIGtlZXAgaW4gdGhlIGJ1ZmZlci4KKyAgaWYgKGRpbXNbMF0uc3QgPT0gMSkgeyAvLyBtb3N0IGNvbW1vbiBjYXNlCisgICAgdHJhY2VfY291bnQgPSBkaW1zWzBdLnVwIC0gZGltc1swXS5sbyArIDE7CisgIH0gZWxzZSBpZiAoZGltc1swXS5zdCA+IDApIHsKKyAgICBLTVBfREVCVUdfQVNTRVJUKGRpbXNbMF0udXAgPiBkaW1zWzBdLmxvKTsKKyAgICB0cmFjZV9jb3VudCA9IChrbXBfdWludDY0KShkaW1zWzBdLnVwIC0gZGltc1swXS5sbykgLyBkaW1zWzBdLnN0ICsgMTsKKyAgfSBlbHNlIHsgLy8gbmVnYXRpdmUgaW5jcmVtZW50CisgICAgS01QX0RFQlVHX0FTU0VSVChkaW1zWzBdLmxvID4gZGltc1swXS51cCk7CisgICAgdHJhY2VfY291bnQgPSAoa21wX3VpbnQ2NCkoZGltc1swXS5sbyAtIGRpbXNbMF0udXApIC8gKC1kaW1zWzBdLnN0KSArIDE7CisgIH0KKyAgZm9yIChqID0gMTsgaiA8IG51bV9kaW1zOyArK2opIHsKKyAgICB0cmFjZV9jb3VudCAqPSBwcl9idWYtPnRoX2RvYWNyb3NzX2luZm9bNCAqIGogKyAxXTsgLy8gdXNlIGtlcHQgcmFuZ2VzCisgIH0KKyAgS01QX0RFQlVHX0FTU0VSVCh0cmFjZV9jb3VudCA+IDApOworCisgIC8vIENoZWNrIGlmIHNoYXJlZCBidWZmZXIgaXMgbm90IG9jY3VwaWVkIGJ5IG90aGVyIGxvb3AgKGlkeCAtCisgIC8vIF9fa21wX2Rpc3BhdGNoX251bV9idWZmZXJzKQorICBpZiAoaWR4ICE9IHNoX2J1Zi0+ZG9hY3Jvc3NfYnVmX2lkeCkgeworICAgIC8vIFNoYXJlZCBidWZmZXIgaXMgb2NjdXBpZWQsIHdhaXQgZm9yIGl0IHRvIGJlIGZyZWUKKyAgICBfX2ttcF93YWl0X3lpZWxkXzQoKHZvbGF0aWxlIGttcF91aW50MzIgKikmc2hfYnVmLT5kb2Fjcm9zc19idWZfaWR4LCBpZHgsCisgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2VxXzQsIE5VTEwpOworICB9CisjaWYgS01QXzMyX0JJVF9BUkNICisgIC8vIENoZWNrIGlmIHdlIGFyZSB0aGUgZmlyc3QgdGhyZWFkLiBBZnRlciB0aGUgQ0FTIHRoZSBmaXJzdCB0aHJlYWQgZ2V0cyAwLAorICAvLyBvdGhlcnMgZ2V0IDEgaWYgaW5pdGlhbGl6YXRpb24gaXMgaW4gcHJvZ3Jlc3MsIGFsbG9jYXRlZCBwb2ludGVyIG90aGVyd2lzZS4KKyAgLy8gVHJlYXQgcG9pbnRlciBhcyB2b2xhdGlsZSBpbnRlZ2VyICh2YWx1ZSAwIG9yIDEpIHVudGlsIG1lbW9yeSBpcyBhbGxvY2F0ZWQuCisgIGZsYWdzID0gKGttcF91aW50MzIgKilLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUMzIoCisgICAgICAodm9sYXRpbGUga21wX2ludDMyICopJnNoX2J1Zi0+ZG9hY3Jvc3NfZmxhZ3MsIE5VTEwsIDEpOworI2Vsc2UKKyAgZmxhZ3MgPSAoa21wX3VpbnQzMiAqKUtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQ2NCgKKyAgICAgICh2b2xhdGlsZSBrbXBfaW50NjQgKikmc2hfYnVmLT5kb2Fjcm9zc19mbGFncywgTlVMTCwgMUxMKTsKKyNlbmRpZgorICBpZiAoZmxhZ3MgPT0gTlVMTCkgeworICAgIC8vIHdlIGFyZSB0aGUgZmlyc3QgdGhyZWFkLCBhbGxvY2F0ZSB0aGUgYXJyYXkgb2YgZmxhZ3MKKyAgICBzaXplX3Qgc2l6ZSA9IHRyYWNlX2NvdW50IC8gOCArIDg7IC8vIGluIGJ5dGVzLCB1c2Ugc2luZ2xlIGJpdCBwZXIgaXRlcmF0aW9uCisgICAgZmxhZ3MgPSAoa21wX3VpbnQzMiAqKV9fa21wX3RocmVhZF9jYWxsb2ModGgsIHNpemUsIDEpOworICAgIEtNUF9NQigpOworICAgIHNoX2J1Zi0+ZG9hY3Jvc3NfZmxhZ3MgPSBmbGFnczsKKyAgfSBlbHNlIGlmIChmbGFncyA9PSAoa21wX3VpbnQzMiAqKTEpIHsKKyNpZiBLTVBfMzJfQklUX0FSQ0gKKyAgICAvLyBpbml0aWFsaXphdGlvbiBpcyBzdGlsbCBpbiBwcm9ncmVzcywgbmVlZCB0byB3YWl0CisgICAgd2hpbGUgKCoodm9sYXRpbGUga21wX2ludDMyICopJnNoX2J1Zi0+ZG9hY3Jvc3NfZmxhZ3MgPT0gMSkKKyNlbHNlCisgICAgd2hpbGUgKCoodm9sYXRpbGUga21wX2ludDY0ICopJnNoX2J1Zi0+ZG9hY3Jvc3NfZmxhZ3MgPT0gMUxMKQorI2VuZGlmCisgICAgICBLTVBfWUlFTEQoVFJVRSk7CisgICAgS01QX01CKCk7CisgIH0gZWxzZSB7CisgICAgS01QX01CKCk7CisgIH0KKyAgS01QX0RFQlVHX0FTU0VSVChzaF9idWYtPmRvYWNyb3NzX2ZsYWdzID4gKGttcF91aW50MzIgKikxKTsgLy8gY2hlY2sgcHRyIHZhbHVlCisgIHByX2J1Zi0+dGhfZG9hY3Jvc3NfZmxhZ3MgPQorICAgICAgc2hfYnVmLT5kb2Fjcm9zc19mbGFnczsgLy8gc2F2ZSBwcml2YXRlIGNvcHkgaW4gb3JkZXIgdG8gbm90CisgIC8vIHRvdWNoIHNoYXJlZCBidWZmZXIgb24gZWFjaCBpdGVyYXRpb24KKyAgS0FfVFJBQ0UoMjAsICgiX19rbXBjX2RvYWNyb3NzX2luaXQoKSBleGl0OiBUIyVkXG4iLCBndGlkKSk7Cit9CisKK3ZvaWQgX19rbXBjX2RvYWNyb3NzX3dhaXQoaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwgbG9uZyBsb25nICp2ZWMpIHsKKyAga21wX2ludDMyIHNoZnQsIG51bV9kaW1zLCBpOworICBrbXBfdWludDMyIGZsYWc7CisgIGttcF9pbnQ2NCBpdGVyX251bWJlcjsgLy8gaXRlcmF0aW9uIG51bWJlciBvZiAiY29sbGFwc2VkIiBsb29wIG5lc3QKKyAga21wX2luZm9fdCAqdGggPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICBrbXBfdGVhbV90ICp0ZWFtID0gdGgtPnRoLnRoX3RlYW07CisgIGttcF9kaXNwX3QgKnByX2J1ZjsKKyAga21wX2ludDY0IGxvLCB1cCwgc3Q7CisKKyAgS0FfVFJBQ0UoMjAsICgiX19rbXBjX2RvYWNyb3NzX3dhaXQoKSBlbnRlcjogY2FsbGVkIFQjJWRcbiIsIGd0aWQpKTsKKyAgaWYgKHRlYW0tPnQudF9zZXJpYWxpemVkKSB7CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBjX2RvYWNyb3NzX3dhaXQoKSBleGl0OiBzZXJpYWxpemVkIHRlYW1cbiIpKTsKKyAgICByZXR1cm47IC8vIG5vIGRlcGVuZGVuY2llcyBpZiB0ZWFtIGlzIHNlcmlhbGl6ZWQKKyAgfQorCisgIC8vIGNhbGN1bGF0ZSBzZXF1ZW50aWFsIGl0ZXJhdGlvbiBudW1iZXIgYW5kIGNoZWNrIG91dC1vZi1ib3VuZHMgY29uZGl0aW9uCisgIHByX2J1ZiA9IHRoLT50aC50aF9kaXNwYXRjaDsKKyAgS01QX0RFQlVHX0FTU0VSVChwcl9idWYtPnRoX2RvYWNyb3NzX2luZm8gIT0gTlVMTCk7CisgIG51bV9kaW1zID0gcHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvWzBdOworICBsbyA9IHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mb1syXTsKKyAgdXAgPSBwcl9idWYtPnRoX2RvYWNyb3NzX2luZm9bM107CisgIHN0ID0gcHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvWzRdOworICBpZiAoc3QgPT0gMSkgeyAvLyBtb3N0IGNvbW1vbiBjYXNlCisgICAgaWYgKHZlY1swXSA8IGxvIHx8IHZlY1swXSA+IHVwKSB7CisgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcGNfZG9hY3Jvc3Nfd2FpdCgpIGV4aXQ6IFQjJWQgaXRlciAlbGxkIGlzIG91dCBvZiAiCisgICAgICAgICAgICAgICAgICAgICJib3VuZHMgWyVsbGQsJWxsZF1cbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIHZlY1swXSwgbG8sIHVwKSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGl0ZXJfbnVtYmVyID0gdmVjWzBdIC0gbG87CisgIH0gZWxzZSBpZiAoc3QgPiAwKSB7CisgICAgaWYgKHZlY1swXSA8IGxvIHx8IHZlY1swXSA+IHVwKSB7CisgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcGNfZG9hY3Jvc3Nfd2FpdCgpIGV4aXQ6IFQjJWQgaXRlciAlbGxkIGlzIG91dCBvZiAiCisgICAgICAgICAgICAgICAgICAgICJib3VuZHMgWyVsbGQsJWxsZF1cbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIHZlY1swXSwgbG8sIHVwKSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGl0ZXJfbnVtYmVyID0gKGttcF91aW50NjQpKHZlY1swXSAtIGxvKSAvIHN0OworICB9IGVsc2UgeyAvLyBuZWdhdGl2ZSBpbmNyZW1lbnQKKyAgICBpZiAodmVjWzBdID4gbG8gfHwgdmVjWzBdIDwgdXApIHsKKyAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wY19kb2Fjcm9zc193YWl0KCkgZXhpdDogVCMlZCBpdGVyICVsbGQgaXMgb3V0IG9mICIKKyAgICAgICAgICAgICAgICAgICAgImJvdW5kcyBbJWxsZCwlbGxkXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdmVjWzBdLCBsbywgdXApKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaXRlcl9udW1iZXIgPSAoa21wX3VpbnQ2NCkobG8gLSB2ZWNbMF0pIC8gKC1zdCk7CisgIH0KKyAgZm9yIChpID0gMTsgaSA8IG51bV9kaW1zOyArK2kpIHsKKyAgICBrbXBfaW50NjQgaXRlciwgbG47CisgICAga21wX2ludDMyIGogPSBpICogNDsKKyAgICBsbiA9IHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mb1tqICsgMV07CisgICAgbG8gPSBwcl9idWYtPnRoX2RvYWNyb3NzX2luZm9baiArIDJdOworICAgIHVwID0gcHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvW2ogKyAzXTsKKyAgICBzdCA9IHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mb1tqICsgNF07CisgICAgaWYgKHN0ID09IDEpIHsKKyAgICAgIGlmICh2ZWNbaV0gPCBsbyB8fCB2ZWNbaV0gPiB1cCkgeworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcGNfZG9hY3Jvc3Nfd2FpdCgpIGV4aXQ6IFQjJWQgaXRlciAlbGxkIGlzIG91dCBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgImJvdW5kcyBbJWxsZCwlbGxkXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCB2ZWNbaV0sIGxvLCB1cCkpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpdGVyID0gdmVjW2ldIC0gbG87CisgICAgfSBlbHNlIGlmIChzdCA+IDApIHsKKyAgICAgIGlmICh2ZWNbaV0gPCBsbyB8fCB2ZWNbaV0gPiB1cCkgeworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcGNfZG9hY3Jvc3Nfd2FpdCgpIGV4aXQ6IFQjJWQgaXRlciAlbGxkIGlzIG91dCBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgImJvdW5kcyBbJWxsZCwlbGxkXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCB2ZWNbaV0sIGxvLCB1cCkpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpdGVyID0gKGttcF91aW50NjQpKHZlY1tpXSAtIGxvKSAvIHN0OworICAgIH0gZWxzZSB7IC8vIHN0IDwgMAorICAgICAgaWYgKHZlY1tpXSA+IGxvIHx8IHZlY1tpXSA8IHVwKSB7CisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wY19kb2Fjcm9zc193YWl0KCkgZXhpdDogVCMlZCBpdGVyICVsbGQgaXMgb3V0IG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAiYm91bmRzIFslbGxkLCVsbGRdXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHZlY1tpXSwgbG8sIHVwKSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGl0ZXIgPSAoa21wX3VpbnQ2NCkobG8gLSB2ZWNbaV0pIC8gKC1zdCk7CisgICAgfQorICAgIGl0ZXJfbnVtYmVyID0gaXRlciArIGxuICogaXRlcl9udW1iZXI7CisgIH0KKyAgc2hmdCA9IGl0ZXJfbnVtYmVyICUgMzI7IC8vIHVzZSAzMi1iaXQgZ3JhbnVsYXJpdHkKKyAgaXRlcl9udW1iZXIgPj49IDU7IC8vIGRpdmlkZWQgYnkgMzIKKyAgZmxhZyA9IDEgPDwgc2hmdDsKKyAgd2hpbGUgKChmbGFnICYgcHJfYnVmLT50aF9kb2Fjcm9zc19mbGFnc1tpdGVyX251bWJlcl0pID09IDApIHsKKyAgICBLTVBfWUlFTEQoVFJVRSk7CisgIH0KKyAgS01QX01CKCk7CisgIEtBX1RSQUNFKDIwLAorICAgICAgICAgICAoIl9fa21wY19kb2Fjcm9zc193YWl0KCkgZXhpdDogVCMlZCB3YWl0IGZvciBpdGVyICVsbGQgY29tcGxldGVkXG4iLAorICAgICAgICAgICAgZ3RpZCwgKGl0ZXJfbnVtYmVyIDw8IDUpICsgc2hmdCkpOworfQorCit2b2lkIF9fa21wY19kb2Fjcm9zc19wb3N0KGlkZW50X3QgKmxvYywgaW50IGd0aWQsIGxvbmcgbG9uZyAqdmVjKSB7CisgIGttcF9pbnQzMiBzaGZ0LCBudW1fZGltcywgaTsKKyAga21wX3VpbnQzMiBmbGFnOworICBrbXBfaW50NjQgaXRlcl9udW1iZXI7IC8vIGl0ZXJhdGlvbiBudW1iZXIgb2YgImNvbGxhcHNlZCIgbG9vcCBuZXN0CisgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAga21wX3RlYW1fdCAqdGVhbSA9IHRoLT50aC50aF90ZWFtOworICBrbXBfZGlzcF90ICpwcl9idWY7CisgIGttcF9pbnQ2NCBsbywgc3Q7CisKKyAgS0FfVFJBQ0UoMjAsICgiX19rbXBjX2RvYWNyb3NzX3Bvc3QoKSBlbnRlcjogY2FsbGVkIFQjJWRcbiIsIGd0aWQpKTsKKyAgaWYgKHRlYW0tPnQudF9zZXJpYWxpemVkKSB7CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBjX2RvYWNyb3NzX3Bvc3QoKSBleGl0OiBzZXJpYWxpemVkIHRlYW1cbiIpKTsKKyAgICByZXR1cm47IC8vIG5vIGRlcGVuZGVuY2llcyBpZiB0ZWFtIGlzIHNlcmlhbGl6ZWQKKyAgfQorCisgIC8vIGNhbGN1bGF0ZSBzZXF1ZW50aWFsIGl0ZXJhdGlvbiBudW1iZXIgKHNhbWUgYXMgaW4gIndhaXQiIGJ1dCBubworICAvLyBvdXQtb2YtYm91bmRzIGNoZWNrcykKKyAgcHJfYnVmID0gdGgtPnRoLnRoX2Rpc3BhdGNoOworICBLTVBfREVCVUdfQVNTRVJUKHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mbyAhPSBOVUxMKTsKKyAgbnVtX2RpbXMgPSBwcl9idWYtPnRoX2RvYWNyb3NzX2luZm9bMF07CisgIGxvID0gcHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvWzJdOworICBzdCA9IHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mb1s0XTsKKyAgaWYgKHN0ID09IDEpIHsgLy8gbW9zdCBjb21tb24gY2FzZQorICAgIGl0ZXJfbnVtYmVyID0gdmVjWzBdIC0gbG87CisgIH0gZWxzZSBpZiAoc3QgPiAwKSB7CisgICAgaXRlcl9udW1iZXIgPSAoa21wX3VpbnQ2NCkodmVjWzBdIC0gbG8pIC8gc3Q7CisgIH0gZWxzZSB7IC8vIG5lZ2F0aXZlIGluY3JlbWVudAorICAgIGl0ZXJfbnVtYmVyID0gKGttcF91aW50NjQpKGxvIC0gdmVjWzBdKSAvICgtc3QpOworICB9CisgIGZvciAoaSA9IDE7IGkgPCBudW1fZGltczsgKytpKSB7CisgICAga21wX2ludDY0IGl0ZXIsIGxuOworICAgIGttcF9pbnQzMiBqID0gaSAqIDQ7CisgICAgbG4gPSBwcl9idWYtPnRoX2RvYWNyb3NzX2luZm9baiArIDFdOworICAgIGxvID0gcHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvW2ogKyAyXTsKKyAgICBzdCA9IHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mb1tqICsgNF07CisgICAgaWYgKHN0ID09IDEpIHsKKyAgICAgIGl0ZXIgPSB2ZWNbaV0gLSBsbzsKKyAgICB9IGVsc2UgaWYgKHN0ID4gMCkgeworICAgICAgaXRlciA9IChrbXBfdWludDY0KSh2ZWNbaV0gLSBsbykgLyBzdDsKKyAgICB9IGVsc2UgeyAvLyBzdCA8IDAKKyAgICAgIGl0ZXIgPSAoa21wX3VpbnQ2NCkobG8gLSB2ZWNbaV0pIC8gKC1zdCk7CisgICAgfQorICAgIGl0ZXJfbnVtYmVyID0gaXRlciArIGxuICogaXRlcl9udW1iZXI7CisgIH0KKyAgc2hmdCA9IGl0ZXJfbnVtYmVyICUgMzI7IC8vIHVzZSAzMi1iaXQgZ3JhbnVsYXJpdHkKKyAgaXRlcl9udW1iZXIgPj49IDU7IC8vIGRpdmlkZWQgYnkgMzIKKyAgZmxhZyA9IDEgPDwgc2hmdDsKKyAgS01QX01CKCk7CisgIGlmICgoZmxhZyAmIHByX2J1Zi0+dGhfZG9hY3Jvc3NfZmxhZ3NbaXRlcl9udW1iZXJdKSA9PSAwKQorICAgIEtNUF9URVNUX1RIRU5fT1IzMigmcHJfYnVmLT50aF9kb2Fjcm9zc19mbGFnc1tpdGVyX251bWJlcl0sIGZsYWcpOworICBLQV9UUkFDRSgyMCwgKCJfX2ttcGNfZG9hY3Jvc3NfcG9zdCgpIGV4aXQ6IFQjJWQgaXRlciAlbGxkIHBvc3RlZFxuIiwgZ3RpZCwKKyAgICAgICAgICAgICAgICAoaXRlcl9udW1iZXIgPDwgNSkgKyBzaGZ0KSk7Cit9CisKK3ZvaWQgX19rbXBjX2RvYWNyb3NzX2ZpbmkoaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCkgeworICBrbXBfaW50NjQgbnVtX2RvbmU7CisgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAga21wX3RlYW1fdCAqdGVhbSA9IHRoLT50aC50aF90ZWFtOworICBrbXBfZGlzcF90ICpwcl9idWYgPSB0aC0+dGgudGhfZGlzcGF0Y2g7CisKKyAgS0FfVFJBQ0UoMjAsICgiX19rbXBjX2RvYWNyb3NzX2ZpbmkoKSBlbnRlcjogY2FsbGVkIFQjJWRcbiIsIGd0aWQpKTsKKyAgaWYgKHRlYW0tPnQudF9zZXJpYWxpemVkKSB7CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBjX2RvYWNyb3NzX2ZpbmkoKSBleGl0OiBzZXJpYWxpemVkIHRlYW0gJXBcbiIsIHRlYW0pKTsKKyAgICByZXR1cm47IC8vIG5vdGhpbmcgdG8gZG8KKyAgfQorICBudW1fZG9uZSA9IEtNUF9URVNUX1RIRU5fSU5DNjQoKGttcF9pbnQ2NCAqKXByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mb1sxXSkgKyAxOworICBpZiAobnVtX2RvbmUgPT0gdGgtPnRoLnRoX3RlYW1fbnByb2MpIHsKKyAgICAvLyB3ZSBhcmUgdGhlIGxhc3QgdGhyZWFkLCBuZWVkIHRvIGZyZWUgc2hhcmVkIHJlc291cmNlcworICAgIGludCBpZHggPSBwcl9idWYtPnRoX2RvYWNyb3NzX2J1Zl9pZHggLSAxOworICAgIGRpc3BhdGNoX3NoYXJlZF9pbmZvX3QgKnNoX2J1ZiA9CisgICAgICAgICZ0ZWFtLT50LnRfZGlzcF9idWZmZXJbaWR4ICUgX19rbXBfZGlzcGF0Y2hfbnVtX2J1ZmZlcnNdOworICAgIEtNUF9ERUJVR19BU1NFUlQocHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvWzFdID09CisgICAgICAgICAgICAgICAgICAgICAoa21wX2ludDY0KSZzaF9idWYtPmRvYWNyb3NzX251bV9kb25lKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKG51bV9kb25lID09IChrbXBfaW50NjQpc2hfYnVmLT5kb2Fjcm9zc19udW1fZG9uZSk7CisgICAgS01QX0RFQlVHX0FTU0VSVChpZHggPT0gc2hfYnVmLT5kb2Fjcm9zc19idWZfaWR4KTsKKyAgICBfX2ttcF90aHJlYWRfZnJlZSh0aCwgQ0NBU1Qoa21wX3VpbnQzMiAqLCBzaF9idWYtPmRvYWNyb3NzX2ZsYWdzKSk7CisgICAgc2hfYnVmLT5kb2Fjcm9zc19mbGFncyA9IE5VTEw7CisgICAgc2hfYnVmLT5kb2Fjcm9zc19udW1fZG9uZSA9IDA7CisgICAgc2hfYnVmLT5kb2Fjcm9zc19idWZfaWR4ICs9CisgICAgICAgIF9fa21wX2Rpc3BhdGNoX251bV9idWZmZXJzOyAvLyBmcmVlIGJ1ZmZlciBmb3IgZnV0dXJlIHJlLXVzZQorICB9CisgIC8vIGZyZWUgcHJpdmF0ZSByZXNvdXJjZXMgKG5lZWQgdG8ga2VlcCBidWZmZXIgaW5kZXggZm9yZXZlcikKKyAgX19rbXBfdGhyZWFkX2ZyZWUodGgsICh2b2lkICopcHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvKTsKKyAgcHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvID0gTlVMTDsKKyAgS0FfVFJBQ0UoMjAsICgiX19rbXBjX2RvYWNyb3NzX2ZpbmkoKSBleGl0OiBUIyVkXG4iLCBndGlkKSk7Cit9CisjZW5kaWYKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9kZWJ1Zy5jcHAgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZGVidWcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYjA3NzQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZGVidWcuY3BwCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICoga21wX2RlYnVnLmNwcCAtLSBkZWJ1ZyB1dGlsaXRpZXMgZm9yIHRoZSBHdWlkZSBsaWJyYXJ5CisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfZGVidWcuaCIgLyogcmVhbGx5IG5lY2Vzc2FyeT8gKi8KKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pby5oIgorCisjaWZkZWYgS01QX0RFQlVHCit2b2lkIF9fa21wX2RlYnVnX3ByaW50Zl9zdGRvdXQoY2hhciBjb25zdCAqZm9ybWF0LCAuLi4pIHsKKyAgdmFfbGlzdCBhcDsKKyAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisKKyAgX19rbXBfdnByaW50ZihrbXBfb3V0LCBmb3JtYXQsIGFwKTsKKworICB2YV9lbmQoYXApOworfQorI2VuZGlmCisKK3ZvaWQgX19rbXBfZGVidWdfcHJpbnRmKGNoYXIgY29uc3QgKmZvcm1hdCwgLi4uKSB7CisgIHZhX2xpc3QgYXA7CisgIHZhX3N0YXJ0KGFwLCBmb3JtYXQpOworCisgIF9fa21wX3ZwcmludGYoa21wX2VyciwgZm9ybWF0LCBhcCk7CisKKyAgdmFfZW5kKGFwKTsKK30KKworI2lmZGVmIEtNUF9VU0VfQVNTRVJUCitpbnQgX19rbXBfZGVidWdfYXNzZXJ0KGNoYXIgY29uc3QgKm1zZywgY2hhciBjb25zdCAqZmlsZSwgaW50IGxpbmUpIHsKKworICBpZiAoZmlsZSA9PSBOVUxMKSB7CisgICAgZmlsZSA9IEtNUF9JMThOX1NUUihVbmtub3duRmlsZSk7CisgIH0gZWxzZSB7CisgICAgLy8gUmVtb3ZlIGRpcmVjdG9yaWVzIGZyb20gcGF0aCwgbGVhdmUgb25seSBmaWxlIG5hbWUuIEZpbGUgbmFtZSBpcyBlbm91Z2gsCisgICAgLy8gdGhlcmUgaXMgbm8gbmVlZCBpbiBib3RoZXJpbmcgZGV2ZWxvcGVycyBhbmQgY3VzdG9tZXJzIHdpdGggZnVsbCBwYXRocy4KKyAgICBjaGFyIGNvbnN0ICpzbGFzaCA9IHN0cnJjaHIoZmlsZSwgJy8nKTsKKyAgICBpZiAoc2xhc2ggIT0gTlVMTCkgeworICAgICAgZmlsZSA9IHNsYXNoICsgMTsKKyAgICB9OyAvLyBpZgorICB9OyAvLyBpZgorCisjaWZkZWYgS01QX0RFQlVHCisgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soJl9fa21wX3N0ZGlvX2xvY2spOworICBfX2ttcF9kZWJ1Z19wcmludGYoIkFzc2VydGlvbiBmYWlsdXJlIGF0ICVzKCVkKTogJXMuXG4iLCBmaWxlLCBsaW5lLCBtc2cpOworICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF9zdGRpb19sb2NrKTsKKyNpZmRlZiBVU0VfQVNTRVJUX0JSRUFLCisjaWYgS01QX09TX1dJTkRPV1MKKyAgRGVidWdCcmVhaygpOworI2VuZGlmCisjZW5kaWYgLy8gVVNFX0FTU0VSVF9CUkVBSworI2lmZGVmIFVTRV9BU1NFUlRfU1RBTEwKKyAgLyogICAgX19rbXBfaW5maW5pdGVfbG9vcCgpOyAqLworICBmb3IgKDs7KQorICAgIDsKKyNlbmRpZiAvLyBVU0VfQVNTRVJUX1NUQUxMCisjaWZkZWYgVVNFX0FTU0VSVF9TRUcKKyAgeworICAgIGludCB2b2xhdGlsZSAqWkVSTyA9IChpbnQgKikwOworICAgICsrKCpaRVJPKTsKKyAgfQorI2VuZGlmIC8vIFVTRV9BU1NFUlRfU0VHCisjZW5kaWYKKworICBfX2ttcF9tc2coa21wX21zX2ZhdGFsLCBLTVBfTVNHKEFzc2VydGlvbkZhaWx1cmUsIGZpbGUsIGxpbmUpLAorICAgICAgICAgICAgS01QX0hOVChTdWJtaXRCdWdSZXBvcnQpLCBfX2ttcF9tc2dfbnVsbCk7CisKKyAgcmV0dXJuIDA7CisKK30gLy8gX19rbXBfZGVidWdfYXNzZXJ0CisKKyNlbmRpZiAvLyBLTVBfVVNFX0FTU0VSVAorCisvKiBEdW1wIGRlYnVnZ2luZyBidWZmZXIgdG8gc3RkZXJyICovCit2b2lkIF9fa21wX2R1bXBfZGVidWdfYnVmZmVyKHZvaWQpIHsKKyAgaWYgKF9fa21wX2RlYnVnX2J1ZmZlciAhPSBOVUxMKSB7CisgICAgaW50IGk7CisgICAgaW50IGRjID0gX19rbXBfZGVidWdfY291bnQ7CisgICAgY2hhciAqZGIgPSAmX19rbXBfZGVidWdfYnVmZmVyWyhkYyAlIF9fa21wX2RlYnVnX2J1Zl9saW5lcykgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9kZWJ1Z19idWZfY2hhcnNdOworICAgIGNoYXIgKmRiX2VuZCA9CisgICAgICAgICZfX2ttcF9kZWJ1Z19idWZmZXJbX19rbXBfZGVidWdfYnVmX2xpbmVzICogX19rbXBfZGVidWdfYnVmX2NoYXJzXTsKKyAgICBjaGFyICpkYjI7CisKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF9zdGRpb19sb2NrKTsKKyAgICBfX2ttcF9wcmludGZfbm9fbG9jaygiXG5TdGFydCBkdW1wIG9mIGRlYnVnZ2luZyBidWZmZXIgKGVudHJ5PSVkKTpcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGMgJSBfX2ttcF9kZWJ1Z19idWZfbGluZXMpOworCisgICAgZm9yIChpID0gMDsgaSA8IF9fa21wX2RlYnVnX2J1Zl9saW5lczsgaSsrKSB7CisKKyAgICAgIGlmICgqZGIgIT0gJ1wwJykgeworICAgICAgICAvKiBGaXggdXAgd2hlcmUgbm8gY2FycmlhZ2UgcmV0dXJuIGJlZm9yZSBzdHJpbmcgdGVybWluYXRpb24gY2hhciAqLworICAgICAgICBmb3IgKGRiMiA9IGRiICsgMTsgZGIyIDwgZGIgKyBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgLSAxOyBkYjIrKykgeworICAgICAgICAgIGlmICgqZGIyID09ICdcMCcpIHsKKyAgICAgICAgICAgIGlmICgqKGRiMiAtIDEpICE9ICdcbicpIHsKKyAgICAgICAgICAgICAgKmRiMiA9ICdcbic7CisgICAgICAgICAgICAgICooZGIyICsgMSkgPSAnXDAnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIEhhbmRsZSBjYXNlIGF0IGVuZCBieSBzaG9ydGVuaW5nIHRoZSBwcmludGVkIG1lc3NhZ2UgYnkgb25lIGNoYXIgaWYKKyAgICAgICAgICogbmVjZXNzYXJ5ICovCisgICAgICAgIGlmIChkYjIgPT0gZGIgKyBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgLSAxICYmICpkYjIgPT0gJ1wwJyAmJgorICAgICAgICAgICAgKihkYjIgLSAxKSAhPSAnXG4nKSB7CisgICAgICAgICAgKihkYjIgLSAxKSA9ICdcbic7CisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jaygiJTRkOiAlLipzIiwgaSwgX19rbXBfZGVidWdfYnVmX2NoYXJzLCBkYik7CisgICAgICAgICpkYiA9ICdcMCc7IC8qIG9ubHkgbGV0IGl0IHByaW50IG9uY2UhICovCisgICAgICB9CisKKyAgICAgIGRiICs9IF9fa21wX2RlYnVnX2J1Zl9jaGFyczsKKyAgICAgIGlmIChkYiA+PSBkYl9lbmQpCisgICAgICAgIGRiID0gX19rbXBfZGVidWdfYnVmZmVyOworICAgIH0KKworICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCJFbmQgZHVtcCBvZiBkZWJ1Z2dpbmcgYnVmZmVyIChlbnRyeT0lZCkuXG5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGRjICsgaSAtIDEpICUgX19rbXBfZGVidWdfYnVmX2xpbmVzKTsKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF9zdGRpb19sb2NrKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2RlYnVnLmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDgwYTRhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2RlYnVnLmgKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBrbXBfZGVidWcuaCAtLSBkZWJ1ZyAvIGFzc2VydGlvbiBjb2RlIGZvciBBc3N1cmUgbGlicmFyeQorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9ERUJVR19ICisjZGVmaW5lIEtNUF9ERUJVR19ICisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQnVpbGQtdGltZSBhc3NlcnRpb24uCisKKy8vIE5ldyBDKysxMSBzdHlsZSBidWlsZCBhc3NlcnQKKyNkZWZpbmUgS01QX0JVSUxEX0FTU0VSVChleHByKSBzdGF0aWNfYXNzZXJ0KGV4cHIsICJCdWlsZCBjb25kaXRpb24gZXJyb3IiKQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUnVuLXRpbWUgYXNzZXJ0aW9ucy4KKworZXh0ZXJuIHZvaWQgX19rbXBfZHVtcF9kZWJ1Z19idWZmZXIodm9pZCk7CisKKyNpZmRlZiBLTVBfVVNFX0FTU0VSVAorZXh0ZXJuIGludCBfX2ttcF9kZWJ1Z19hc3NlcnQoY2hhciBjb25zdCAqZXhwciwgY2hhciBjb25zdCAqZmlsZSwgaW50IGxpbmUpOworI2lmZGVmIEtNUF9ERUJVRworI2RlZmluZSBLTVBfQVNTRVJUKGNvbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChjb25kKSA/IDAgOiBfX2ttcF9kZWJ1Z19hc3NlcnQoI2NvbmQsIF9fRklMRV9fLCBfX0xJTkVfXykpCisjZGVmaW5lIEtNUF9BU1NFUlQyKGNvbmQsIG1zZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKGNvbmQpID8gMCA6IF9fa21wX2RlYnVnX2Fzc2VydCgobXNnKSwgX19GSUxFX18sIF9fTElORV9fKSkKKyNkZWZpbmUgS01QX0RFQlVHX0FTU0VSVChjb25kKSBLTVBfQVNTRVJUKGNvbmQpCisjZGVmaW5lIEtNUF9ERUJVR19BU1NFUlQyKGNvbmQsIG1zZykgS01QX0FTU0VSVDIoY29uZCwgbXNnKQorI2Vsc2UKKy8vIERvIG5vdCBleHBvc2UgY29uZGl0aW9uIGluIHJlbGVhc2UgYnVpbGQuIFVzZSAiYXNzZXJ0aW9uIGZhaWx1cmUiLgorI2RlZmluZSBLTVBfQVNTRVJUKGNvbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChjb25kKSA/IDAgOiBfX2ttcF9kZWJ1Z19hc3NlcnQoImFzc2VydGlvbiBmYWlsdXJlIiwgX19GSUxFX18sIF9fTElORV9fKSkKKyNkZWZpbmUgS01QX0FTU0VSVDIoY29uZCwgbXNnKSBLTVBfQVNTRVJUKGNvbmQpCisjZGVmaW5lIEtNUF9ERUJVR19BU1NFUlQoY29uZCkgMAorI2RlZmluZSBLTVBfREVCVUdfQVNTRVJUMihjb25kLCBtc2cpIDAKKyNlbmRpZiAvLyBLTVBfREVCVUcKKyNlbHNlCisjZGVmaW5lIEtNUF9BU1NFUlQoY29uZCkgMAorI2RlZmluZSBLTVBfQVNTRVJUMihjb25kLCBtc2cpIDAKKyNkZWZpbmUgS01QX0RFQlVHX0FTU0VSVChjb25kKSAwCisjZGVmaW5lIEtNUF9ERUJVR19BU1NFUlQyKGNvbmQsIG1zZykgMAorI2VuZGlmIC8vIEtNUF9VU0VfQVNTRVJUCisKKyNpZmRlZiBLTVBfREVCVUcKK2V4dGVybiB2b2lkIF9fa21wX2RlYnVnX3ByaW50Zl9zdGRvdXQoY2hhciBjb25zdCAqZm9ybWF0LCAuLi4pOworI2VuZGlmCitleHRlcm4gdm9pZCBfX2ttcF9kZWJ1Z19wcmludGYoY2hhciBjb25zdCAqZm9ybWF0LCAuLi4pOworCisjaWZkZWYgS01QX0RFQlVHCisKK2V4dGVybiBpbnQga21wX2FfZGVidWc7CitleHRlcm4gaW50IGttcF9iX2RlYnVnOworZXh0ZXJuIGludCBrbXBfY19kZWJ1ZzsKK2V4dGVybiBpbnQga21wX2RfZGVidWc7CitleHRlcm4gaW50IGttcF9lX2RlYnVnOworZXh0ZXJuIGludCBrbXBfZl9kZWJ1ZzsKK2V4dGVybiBpbnQga21wX2RpYWc7CisKKyNkZWZpbmUgS0FfVFJBQ0UoZCwgeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChrbXBfYV9kZWJ1ZyA+PSBkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2RlYnVnX3ByaW50ZiB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorI2RlZmluZSBLQl9UUkFDRShkLCB4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGttcF9iX2RlYnVnID49IGQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfZGVidWdfcHJpbnRmIHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZGVmaW5lIEtDX1RSQUNFKGQsIHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoa21wX2NfZGVidWcgPj0gZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9kZWJ1Z19wcmludGYgeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNkZWZpbmUgS0RfVFJBQ0UoZCwgeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChrbXBfZF9kZWJ1ZyA+PSBkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2RlYnVnX3ByaW50ZiB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorI2RlZmluZSBLRV9UUkFDRShkLCB4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGttcF9lX2RlYnVnID49IGQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfZGVidWdfcHJpbnRmIHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZGVmaW5lIEtGX1RSQUNFKGQsIHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoa21wX2ZfZGVidWcgPj0gZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9kZWJ1Z19wcmludGYgeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNkZWZpbmUgS19ESUFHKGQsIHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChrbXBfZGlhZyA9PSBkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF9fa21wX2RlYnVnX3ByaW50Zl9zdGRvdXQgeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgS0FfRFVNUChkLCB4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChrbXBfYV9kZWJ1ZyA+PSBkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBrczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9kaXNhYmxlKCZrcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2VuYWJsZShrcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorI2RlZmluZSBLQl9EVU1QKGQsIHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGttcF9iX2RlYnVnID49IGQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGtzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2Rpc2FibGUoJmtzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoeCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfZW5hYmxlKGtzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZGVmaW5lIEtDX0RVTVAoZCwgeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoa21wX2NfZGVidWcgPj0gZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQga3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfZGlzYWJsZSgma3MpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICh4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9lbmFibGUoa3MpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNkZWZpbmUgS0RfRFVNUChkLCB4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChrbXBfZF9kZWJ1ZyA+PSBkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBrczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9kaXNhYmxlKCZrcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2VuYWJsZShrcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorI2RlZmluZSBLRV9EVU1QKGQsIHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGttcF9lX2RlYnVnID49IGQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGtzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2Rpc2FibGUoJmtzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoeCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfZW5hYmxlKGtzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZGVmaW5lIEtGX0RVTVAoZCwgeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoa21wX2ZfZGVidWcgPj0gZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQga3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfZGlzYWJsZSgma3MpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICh4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9lbmFibGUoa3MpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2Vsc2UKKworI2RlZmluZSBLQV9UUkFDRShkLCB4KSAvKiBub3RoaW5nIHRvIGRvICovCisjZGVmaW5lIEtCX1RSQUNFKGQsIHgpIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyNkZWZpbmUgS0NfVFJBQ0UoZCwgeCkgLyogbm90aGluZyB0byBkbyAqLworI2RlZmluZSBLRF9UUkFDRShkLCB4KSAvKiBub3RoaW5nIHRvIGRvICovCisjZGVmaW5lIEtFX1RSQUNFKGQsIHgpIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyNkZWZpbmUgS0ZfVFJBQ0UoZCwgeCkgLyogbm90aGluZyB0byBkbyAqLworI2RlZmluZSBLX0RJQUcoZCwgeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAge30gLyogbm90aGluZyB0byBkbyAqLworCisjZGVmaW5lIEtBX0RVTVAoZCwgeCkgLyogbm90aGluZyB0byBkbyAqLworI2RlZmluZSBLQl9EVU1QKGQsIHgpIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyNkZWZpbmUgS0NfRFVNUChkLCB4KSAvKiBub3RoaW5nIHRvIGRvICovCisjZGVmaW5lIEtEX0RVTVAoZCwgeCkgLyogbm90aGluZyB0byBkbyAqLworI2RlZmluZSBLRV9EVU1QKGQsIHgpIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyNkZWZpbmUgS0ZfRFVNUChkLCB4KSAvKiBub3RoaW5nIHRvIGRvICovCisKKyNlbmRpZiAvLyBLTVBfREVCVUcKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjZW5kaWYgLyogS01QX0RFQlVHX0ggKi8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9kZWJ1Z2dlci5jcHAgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZGVidWdnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzOTRhMTkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZGVidWdnZXIuY3BwCkBAIC0wLDAgKzEsMjkxIEBACisjaWYgVVNFX0RFQlVHR0VSCisvKgorICoga21wX2RlYnVnZ2VyLmNwcCAtLSBkZWJ1Z2dlciBzdXBwb3J0LgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2xvY2suaCIKKyNpbmNsdWRlICJrbXBfb21wLmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorCisvLyBOT1RFOiBBbGwgdmFyaWFibGUgbmFtZXMgYXJlIGtub3duIHRvIHRoZSBkZWJ1Z2dlciwgZG8gbm90IGNoYW5nZSEKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKK2V4dGVybiBrbXBfb21wX3N0cnVjdF9pbmZvX3QgX19rbXBfb21wX2RlYnVnX3N0cnVjdF9pbmZvOworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworaW50IF9fa21wX2RlYnVnZ2luZyA9IEZBTFNFOyAvLyBCb29sZWFuIHdoZXRoZXIgY3VycmVudGx5IGRlYnVnZ2luZyBPcGVuTVAgUlRMLgorCisjZGVmaW5lIG9mZnNldF9hbmRfc2l6ZV9vZihzdHJ1Y3R1cmUsIGZpZWxkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7IG9mZnNldG9mKHN0cnVjdHVyZSwgZmllbGQpLCBzaXplb2YoKChzdHJ1Y3R1cmUgKilOVUxMKS0+ZmllbGQpIH0KKworI2RlZmluZSBvZmZzZXRfYW5kX3NpemVfbm90X2F2YWlsYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAtMSwgLTEgfQorCisjZGVmaW5lIGFkZHJfYW5kX3NpemVfb2YodmFyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7IChrbXBfdWludDY0KSgmdmFyKSwgc2l6ZW9mKHZhcikgfQorCisjZGVmaW5lIG50aHJfYnVmZmVyX3NpemUgMTAyNAorc3RhdGljIGttcF9pbnQzMiBrbXBfb21wX250aHJfaW5mb19idWZmZXJbbnRocl9idWZmZXJfc2l6ZV0gPSB7CisgICAgbnRocl9idWZmZXJfc2l6ZSAqIHNpemVvZihrbXBfaW50MzIpfTsKKworLyogVE9ETzogQ2hlY2sgcHVuY3R1YXRpb24gZm9yIHZhcmlvdXMgcGxhdGZvcm1zIGhlcmUgKi8KK3N0YXRpYyBjaGFyIGZ1bmNfbWljcm90YXNrW10gPSAiX19rbXBfaW52b2tlX21pY3JvdGFzayI7CitzdGF0aWMgY2hhciBmdW5jX2ZvcmtbXSA9ICJfX2ttcGNfZm9ya19jYWxsIjsKK3N0YXRpYyBjaGFyIGZ1bmNfZm9ya190ZWFtc1tdID0gIl9fa21wY19mb3JrX3RlYW1zIjsKKworLy8gVmFyaW91cyBpbmZvIGFib3V0IHJ1bnRpbWUgc3RydWN0dXJlczogYWRkcmVzc2VzLCBmaWVsZCBvZmZzZXRzLCBzaXplcywgZXRjLgora21wX29tcF9zdHJ1Y3RfaW5mb190IF9fa21wX29tcF9kZWJ1Z19zdHJ1Y3RfaW5mbyA9IHsKKworICAgIC8qIENoYW5nZSB0aGlzIG9ubHkgaWYgeW91IG1ha2UgYSBmdW5kYW1lbnRhbCBkYXRhIHN0cnVjdHVyZSBjaGFuZ2UgaGVyZSAqLworICAgIEtNUF9PTVBfVkVSU0lPTiwKKworICAgIC8qIHNhbml0eSBjaGVjay4gIE9ubHkgc2hvdWxkIGJlIGNoZWNrZWQgaWYgdmVyc2lvbnMgYXJlIGlkZW50aWNhbAorICAgICAqIFRoaXMgaXMgYWxzbyB1c2VkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHRvIGdldCB0aGUgcnVudGltZQorICAgICAqIHN0cnVjdHVyZSBzaXplIGlmIGl0IHRoZSBydW50aW1lIGlzIG9sZGVyIHRoYW4gdGhlIGludGVyZmFjZSAqLworICAgIHNpemVvZihrbXBfb21wX3N0cnVjdF9pbmZvX3QpLAorCisgICAgLyogT3Blbk1QIFJUTCB2ZXJzaW9uIGluZm8uICovCisgICAgYWRkcl9hbmRfc2l6ZV9vZihfX2ttcF92ZXJzaW9uX21ham9yKSwKKyAgICBhZGRyX2FuZF9zaXplX29mKF9fa21wX3ZlcnNpb25fbWlub3IpLAorICAgIGFkZHJfYW5kX3NpemVfb2YoX19rbXBfdmVyc2lvbl9idWlsZCksCisgICAgYWRkcl9hbmRfc2l6ZV9vZihfX2ttcF9vcGVubXBfdmVyc2lvbiksCisgICAgeyhrbXBfdWludDY0KShfX2ttcF9jb3B5cmlnaHQpICsgS01QX1ZFUlNJT05fTUFHSUNfTEVOLAorICAgICAwfSwgLy8gU2tpcCBtYWdpYyBwcmVmaXguCisKKyAgICAvKiBWYXJpb3VzIGdsb2JhbHMuICovCisgICAgYWRkcl9hbmRfc2l6ZV9vZihfX2ttcF90aHJlYWRzKSwKKyAgICBhZGRyX2FuZF9zaXplX29mKF9fa21wX3Jvb3QpLAorICAgIGFkZHJfYW5kX3NpemVfb2YoX19rbXBfdGhyZWFkc19jYXBhY2l0eSksCisgICAgYWRkcl9hbmRfc2l6ZV9vZihfX2ttcF9tb25pdG9yKSwKKyNpZiAhS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICBhZGRyX2FuZF9zaXplX29mKF9fa21wX3VzZXJfbG9ja190YWJsZSksCisjZW5kaWYKKyAgICBhZGRyX2FuZF9zaXplX29mKGZ1bmNfbWljcm90YXNrKSwKKyAgICBhZGRyX2FuZF9zaXplX29mKGZ1bmNfZm9yayksCisgICAgYWRkcl9hbmRfc2l6ZV9vZihmdW5jX2ZvcmtfdGVhbXMpLAorICAgIGFkZHJfYW5kX3NpemVfb2YoX19rbXBfdGVhbV9jb3VudGVyKSwKKyAgICBhZGRyX2FuZF9zaXplX29mKF9fa21wX3Rhc2tfY291bnRlciksCisgICAgYWRkcl9hbmRfc2l6ZV9vZihrbXBfb21wX250aHJfaW5mb19idWZmZXIpLAorICAgIHNpemVvZih2b2lkICopLAorICAgIE9NUF9MT0NLX1RfU0laRSA8IHNpemVvZih2b2lkICopLAorICAgIGJzX2xhc3RfYmFycmllciwKKyAgICBJTklUSUFMX1RBU0tfREVRVUVfU0laRSwKKworICAgIC8vIHRocmVhZCBzdHJ1Y3R1cmUgaW5mb3JtYXRpb24KKyAgICBzaXplb2Yoa21wX2Jhc2VfaW5mb190KSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2Yoa21wX2Jhc2VfaW5mb190LCB0aF9pbmZvKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2Yoa21wX2Jhc2VfaW5mb190LCB0aF90ZWFtKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2Yoa21wX2Jhc2VfaW5mb190LCB0aF9yb290KSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2Yoa21wX2Jhc2VfaW5mb190LCB0aF9zZXJpYWxfdGVhbSksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKGttcF9iYXNlX2luZm9fdCwgdGhfaWRlbnQpLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfYmFzZV9pbmZvX3QsIHRoX3NwaW5faGVyZSksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKGttcF9iYXNlX2luZm9fdCwgdGhfbmV4dF93YWl0aW5nKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2Yoa21wX2Jhc2VfaW5mb190LCB0aF90YXNrX3RlYW0pLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfYmFzZV9pbmZvX3QsIHRoX2N1cnJlbnRfdGFzayksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKGttcF9iYXNlX2luZm9fdCwgdGhfdGFza19zdGF0ZSksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKGttcF9iYXNlX2luZm9fdCwgdGhfYmFyKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2Yoa21wX2JzdGF0ZV90LCBiX3dvcmtlcl9hcnJpdmVkKSwKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgLy8gdGVhbXMgaW5mb3JtYXRpb24KKyAgICBvZmZzZXRfYW5kX3NpemVfb2Yoa21wX2Jhc2VfaW5mb190LCB0aF90ZWFtc19taWNyb3Rhc2spLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfYmFzZV9pbmZvX3QsIHRoX3RlYW1zX2xldmVsKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2Yoa21wX3RlYW1zX3NpemVfdCwgbnRlYW1zKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2Yoa21wX3RlYW1zX3NpemVfdCwgbnRoKSwKKyNlbmRpZgorCisgICAgLy8ga21wX2Rlc2Mgc3RydWN0dXJlIChmb3IgaW5mbyBmaWVsZCBhYm92ZSkKKyAgICBzaXplb2Yoa21wX2Rlc2NfYmFzZV90KSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2Yoa21wX2Rlc2NfYmFzZV90LCBkc190aWQpLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfZGVzY19iYXNlX3QsIGRzX2d0aWQpLAorLy8gT24gV2luZG93cyogT1MsIGRzX3RocmVhZCBjb250YWlucyBhIHRocmVhZCAvaGFuZGxlLywgd2hpY2ggaXMgbm90IHVzYWJsZSwKKy8vIHdoaWxlIHRocmVhZCAvaWQvIGlzIGluIGRzX3RocmVhZF9pZC4KKyNpZiBLTVBfT1NfV0lORE9XUworICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfZGVzY19iYXNlX3QsIGRzX3RocmVhZF9pZCksCisjZWxzZQorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfZGVzY19iYXNlX3QsIGRzX3RocmVhZCksCisjZW5kaWYKKworICAgIC8vIHRlYW0gc3RydWN0dXJlIGluZm9ybWF0aW9uCisgICAgc2l6ZW9mKGttcF9iYXNlX3RlYW1fdCksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKGttcF9iYXNlX3RlYW1fdCwgdF9tYXN0ZXJfdGlkKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2Yoa21wX2Jhc2VfdGVhbV90LCB0X2lkZW50KSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2Yoa21wX2Jhc2VfdGVhbV90LCB0X3BhcmVudCksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKGttcF9iYXNlX3RlYW1fdCwgdF9ucHJvYyksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKGttcF9iYXNlX3RlYW1fdCwgdF90aHJlYWRzKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2Yoa21wX2Jhc2VfdGVhbV90LCB0X3NlcmlhbGl6ZWQpLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfYmFzZV90ZWFtX3QsIHRfaWQpLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfYmFzZV90ZWFtX3QsIHRfcGtmbiksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKGttcF9iYXNlX3RlYW1fdCwgdF90YXNrX3RlYW0pLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfYmFzZV90ZWFtX3QsIHRfaW1wbGljaXRfdGFza190YXNrZGF0YSksCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBvZmZzZXRfYW5kX3NpemVfb2Yoa21wX2Jhc2VfdGVhbV90LCB0X2NhbmNlbF9yZXF1ZXN0KSwKKyNlbmRpZgorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfYmFzZV90ZWFtX3QsIHRfYmFyKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2Yoa21wX2JhbGlnbl90ZWFtX3QsIGJfbWFzdGVyX2Fycml2ZWQpLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfYmFsaWduX3RlYW1fdCwgYl90ZWFtX2Fycml2ZWQpLAorCisgICAgLy8gcm9vdCBzdHJ1Y3R1cmUgaW5mb3JtYXRpb24KKyAgICBzaXplb2Yoa21wX2Jhc2Vfcm9vdF90KSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2Yoa21wX2Jhc2Vfcm9vdF90LCByX3Jvb3RfdGVhbSksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKGttcF9iYXNlX3Jvb3RfdCwgcl9ob3RfdGVhbSksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKGttcF9iYXNlX3Jvb3RfdCwgcl91YmVyX3RocmVhZCksCisgICAgb2Zmc2V0X2FuZF9zaXplX25vdF9hdmFpbGFibGUsCisKKyAgICAvLyBpZGVudCBzdHJ1Y3R1cmUgaW5mb3JtYXRpb24KKyAgICBzaXplb2YoaWRlbnRfdCksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKGlkZW50X3QsIHBzb3VyY2UpLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihpZGVudF90LCBmbGFncyksCisKKyAgICAvLyBsb2NrIHN0cnVjdHVyZSBpbmZvcm1hdGlvbgorICAgIHNpemVvZihrbXBfYmFzZV9xdWV1aW5nX2xvY2tfdCksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKGttcF9iYXNlX3F1ZXVpbmdfbG9ja190LCBpbml0aWFsaXplZCksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKGttcF9iYXNlX3F1ZXVpbmdfbG9ja190LCBsb2NhdGlvbiksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKGttcF9iYXNlX3F1ZXVpbmdfbG9ja190LCB0YWlsX2lkKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2Yoa21wX2Jhc2VfcXVldWluZ19sb2NrX3QsIGhlYWRfaWQpLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfYmFzZV9xdWV1aW5nX2xvY2tfdCwgbmV4dF90aWNrZXQpLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfYmFzZV9xdWV1aW5nX2xvY2tfdCwgbm93X3NlcnZpbmcpLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfYmFzZV9xdWV1aW5nX2xvY2tfdCwgb3duZXJfaWQpLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfYmFzZV9xdWV1aW5nX2xvY2tfdCwgZGVwdGhfbG9ja2VkKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2Yoa21wX2Jhc2VfcXVldWluZ19sb2NrX3QsIGZsYWdzKSwKKworI2lmICFLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgIC8qIExvY2sgdGFibGUuICovCisgICAgc2l6ZW9mKGttcF9sb2NrX3RhYmxlX3QpLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfbG9ja190YWJsZV90LCB1c2VkKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2Yoa21wX2xvY2tfdGFibGVfdCwgYWxsb2NhdGVkKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2Yoa21wX2xvY2tfdGFibGVfdCwgdGFibGUpLAorI2VuZGlmCisKKyAgICAvLyBUYXNrIHRlYW0gc3RydWN0dXJlIGluZm9ybWF0aW9uLgorICAgIHNpemVvZihrbXBfYmFzZV90YXNrX3RlYW1fdCksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKGttcF9iYXNlX3Rhc2tfdGVhbV90LCB0dF90aHJlYWRzX2RhdGEpLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfYmFzZV90YXNrX3RlYW1fdCwgdHRfZm91bmRfdGFza3MpLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfYmFzZV90YXNrX3RlYW1fdCwgdHRfbnByb2MpLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfYmFzZV90YXNrX3RlYW1fdCwgdHRfdW5maW5pc2hlZF90aHJlYWRzKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2Yoa21wX2Jhc2VfdGFza190ZWFtX3QsIHR0X2FjdGl2ZSksCisKKyAgICAvLyB0YXNrX2RhdGFfdC4KKyAgICBzaXplb2Yoa21wX3Rhc2tkYXRhX3QpLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfdGFza2RhdGFfdCwgdGRfdGFza19pZCksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKGttcF90YXNrZGF0YV90LCB0ZF9mbGFncyksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKGttcF90YXNrZGF0YV90LCB0ZF90ZWFtKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2Yoa21wX3Rhc2tkYXRhX3QsIHRkX3BhcmVudCksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKGttcF90YXNrZGF0YV90LCB0ZF9sZXZlbCksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKGttcF90YXNrZGF0YV90LCB0ZF9pZGVudCksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKGttcF90YXNrZGF0YV90LCB0ZF9hbGxvY2F0ZWRfY2hpbGRfdGFza3MpLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfdGFza2RhdGFfdCwgdGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcyksCisKKyAgICBvZmZzZXRfYW5kX3NpemVfb2Yoa21wX3Rhc2tkYXRhX3QsIHRkX3Rhc2t3YWl0X2lkZW50KSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2Yoa21wX3Rhc2tkYXRhX3QsIHRkX3Rhc2t3YWl0X2NvdW50ZXIpLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfdGFza2RhdGFfdCwgdGRfdGFza3dhaXRfdGhyZWFkKSwKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgb2Zmc2V0X2FuZF9zaXplX29mKGttcF90YXNrZGF0YV90LCB0ZF90YXNrZ3JvdXApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfdGFza2dyb3VwX3QsIGNvdW50KSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2Yoa21wX3Rhc2tncm91cF90LCBjYW5jZWxfcmVxdWVzdCksCisKKyAgICBvZmZzZXRfYW5kX3NpemVfb2Yoa21wX3Rhc2tkYXRhX3QsIHRkX2RlcG5vZGUpLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfZGVwbm9kZV9saXN0X3QsIG5vZGUpLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfZGVwbm9kZV9saXN0X3QsIG5leHQpLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfYmFzZV9kZXBub2RlX3QsIHN1Y2Nlc3NvcnMpLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfYmFzZV9kZXBub2RlX3QsIHRhc2spLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfYmFzZV9kZXBub2RlX3QsIG5wcmVkZWNlc3NvcnMpLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfYmFzZV9kZXBub2RlX3QsIG5yZWZzKSwKKyNlbmRpZgorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfdGFza190LCByb3V0aW5lKSwKKworICAgIC8vIHRocmVhZF9kYXRhX3QuCisgICAgc2l6ZW9mKGttcF90aHJlYWRfZGF0YV90KSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2Yoa21wX2Jhc2VfdGhyZWFkX2RhdGFfdCwgdGRfZGVxdWUpLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfYmFzZV90aHJlYWRfZGF0YV90LCB0ZF9kZXF1ZV9zaXplKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2Yoa21wX2Jhc2VfdGhyZWFkX2RhdGFfdCwgdGRfZGVxdWVfaGVhZCksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKGttcF9iYXNlX3RocmVhZF9kYXRhX3QsIHRkX2RlcXVlX3RhaWwpLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfYmFzZV90aHJlYWRfZGF0YV90LCB0ZF9kZXF1ZV9udGFza3MpLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZihrbXBfYmFzZV90aHJlYWRfZGF0YV90LCB0ZF9kZXF1ZV9sYXN0X3N0b2xlbiksCisKKyAgICAvLyBUaGUgbGFzdCBmaWVsZC4KKyAgICBLTVBfT01QX1ZFUlNJT04sCisKK307IC8vIF9fa21wX29tcF9kZWJ1Z19zdHJ1Y3RfaW5mbworCisjdW5kZWYgb2Zmc2V0X2FuZF9zaXplX29mCisjdW5kZWYgYWRkcl9hbmRfc2l6ZV9vZgorCisvKiBJbnRlbCBjb21waWxlciBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgaXNzdWVzIGEgd2FybmluZyAiY29udmVyc2lvbgorICBmcm9tICJ1bnNpZ25lZCBsb25nIGxvbmciIHRvICJjaGFyICoiIG1heSBsb3NlIHNpZ25pZmljYW50IGJpdHMiCisgIHdoZW4gNjQtYml0IHZhbHVlIGlzIGFzc2lnbmVkIHRvIDMyLWJpdCBwb2ludGVyLiBVc2UgdGhpcyBmdW5jdGlvbgorICB0byBzdXBwcmVzcyB0aGUgd2FybmluZy4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqX19rbXBfY29udmVydF90b19wdHIoa21wX3VpbnQ2NCBhZGRyKSB7CisjaWYgS01QX0NPTVBJTEVSX0lDQworI3ByYWdtYSB3YXJuaW5nKHB1c2gpCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDgxMCkgLy8gY29udmVyc2lvbiBmcm9tICJ1bnNpZ25lZCBsb25nIGxvbmciIHRvICJjaGFyCisvLyAqIiBtYXkgbG9zZSBzaWduaWZpY2FudCBiaXRzCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDExOTUpIC8vIGNvbnZlcnNpb24gZnJvbSBpbnRlZ2VyIHRvIHNtYWxsZXIgcG9pbnRlcgorI2VuZGlmIC8vIEtNUF9DT01QSUxFUl9JQ0MKKyAgcmV0dXJuICh2b2lkICopYWRkcjsKKyNpZiBLTVBfQ09NUElMRVJfSUNDCisjcHJhZ21hIHdhcm5pbmcocG9wKQorI2VuZGlmIC8vIEtNUF9DT01QSUxFUl9JQ0MKK30gLy8gX19rbXBfY29udmVydF90b19wdHIKKworc3RhdGljIGludCBrbXBfbG9jYXRpb25fbWF0Y2goa21wX3N0cl9sb2NfdCAqbG9jLCBrbXBfb21wX250aHJfaXRlbV90ICppdGVtKSB7CisKKyAgaW50IGZpbGVfbWF0Y2ggPSAwOworICBpbnQgZnVuY19tYXRjaCA9IDA7CisgIGludCBsaW5lX21hdGNoID0gMDsKKworICBjaGFyICpmaWxlID0gKGNoYXIgKilfX2ttcF9jb252ZXJ0X3RvX3B0cihpdGVtLT5maWxlKTsKKyAgY2hhciAqZnVuYyA9IChjaGFyICopX19rbXBfY29udmVydF90b19wdHIoaXRlbS0+ZnVuYyk7CisgIGZpbGVfbWF0Y2ggPSBfX2ttcF9zdHJfZm5hbWVfbWF0Y2goJmxvYy0+Zm5hbWUsIGZpbGUpOworICBmdW5jX21hdGNoID0KKyAgICAgIGl0ZW0tPmZ1bmMgPT0gMCAvLyBJZiBpdGVtLT5mdW5jIGlzIE5VTEwsIGl0IGFsbG93cyBhbnkgZnVuYyBuYW1lLgorICAgICAgfHwgc3RyY21wKGZ1bmMsICIqIikgPT0gMCB8fAorICAgICAgKGxvYy0+ZnVuYyAhPSBOVUxMICYmIHN0cmNtcChsb2MtPmZ1bmMsIGZ1bmMpID09IDApOworICBsaW5lX21hdGNoID0KKyAgICAgIGl0ZW0tPmJlZ2luIDw9IGxvYy0+bGluZSAmJgorICAgICAgKGl0ZW0tPmVuZCA8PSAwIHx8CisgICAgICAgbG9jLT5saW5lIDw9IGl0ZW0tPmVuZCk7IC8vIGlmIGl0ZW0tPmVuZCA8PSAwLCBpdCBtZWFucyAiZW5kIG9mIGZpbGUiLgorCisgIHJldHVybiAoZmlsZV9tYXRjaCAmJiBmdW5jX21hdGNoICYmIGxpbmVfbWF0Y2gpOworCit9IC8vIGttcF9sb2NhdGlvbl9tYXRjaAorCitpbnQgX19rbXBfb21wX251bV90aHJlYWRzKGlkZW50X3QgY29uc3QgKmlkZW50KSB7CisKKyAgaW50IG51bV90aHJlYWRzID0gMDsKKworICBrbXBfb21wX250aHJfaW5mb190ICppbmZvID0gKGttcF9vbXBfbnRocl9pbmZvX3QgKilfX2ttcF9jb252ZXJ0X3RvX3B0cigKKyAgICAgIF9fa21wX29tcF9kZWJ1Z19zdHJ1Y3RfaW5mby5udGhyX2luZm8uYWRkcik7CisgIGlmIChpbmZvLT5udW0gPiAwICYmIGluZm8tPmFycmF5ICE9IDApIHsKKyAgICBrbXBfb21wX250aHJfaXRlbV90ICppdGVtcyA9CisgICAgICAgIChrbXBfb21wX250aHJfaXRlbV90ICopX19rbXBfY29udmVydF90b19wdHIoaW5mby0+YXJyYXkpOworICAgIGttcF9zdHJfbG9jX3QgbG9jID0gX19rbXBfc3RyX2xvY19pbml0KGlkZW50LT5wc291cmNlLCAxKTsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaW5mby0+bnVtOyArK2kpIHsKKyAgICAgIGlmIChrbXBfbG9jYXRpb25fbWF0Y2goJmxvYywgJml0ZW1zW2ldKSkgeworICAgICAgICBudW1fdGhyZWFkcyA9IGl0ZW1zW2ldLm51bV90aHJlYWRzOworICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBmb3IKKyAgICBfX2ttcF9zdHJfbG9jX2ZyZWUoJmxvYyk7CisgIH07IC8vIGlmCisKKyAgcmV0dXJuIG51bV90aHJlYWRzOworICA7CisKK30gLy8gX19rbXBfb21wX251bV90aHJlYWRzCisjZW5kaWYgLyogVVNFX0RFQlVHR0VSICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZGVidWdnZXIuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9kZWJ1Z2dlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MTNkODgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZGVidWdnZXIuaApAQCAtMCwwICsxLDUxIEBACisjaWYgVVNFX0RFQlVHR0VSCisvKgorICoga21wX2RlYnVnZ2VyLmggLS0gZGVidWdnZXIgc3VwcG9ydC4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfREVCVUdHRVJfSAorI2RlZmluZSBLTVBfREVCVUdHRVJfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKy8qIFRoaXMgZXh0ZXJuYWwgdmFyaWFibGUgY2FuIGJlIHNldCBieSBhbnkgZGVidWdnZXIgdG8gZmxhZyB0byB0aGUgcnVudGltZQorICAgdGhhdCB3ZSBhcmUgY3VycmVudGx5IGV4ZWN1dGluZyBpbnNpZGUgYSBkZWJ1Z2dlci4gIFRoaXMgd2lsbCBhbGxvdyB0aGUKKyAgIGRlYnVnZ2VyIHRvIG92ZXJyaWRlIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBzcGF3bmVkIGluIGEgcGFyYWxsZWwgcmVnaW9uIGJ5CisgICB1c2luZyBfX2ttcF9vbXBfbnVtX3RocmVhZHMoKSAoYmVsb3cpLgorICAgKiBXaGVuIF9fa21wX2RlYnVnZ2luZyBpcyBUUlVFLCBlYWNoIHRlYW0gYW5kIGVhY2ggdGFzayBnZXRzIGEgdW5pcXVlIGludGVnZXIKKyAgIGlkZW50aWZpZXIgdGhhdCBjYW4gYmUgdXNlZCBieSBkZWJ1Z2dlciB0byBjb252ZW5pZW50bHkgaWRlbnRpZnkgdGVhbXMgYW5kCisgICB0YXNrcy4KKyAgICogVGhlIGRlYnVnZ2VyIGhhcyBhY2Nlc3MgdG8gX19rbXBfb21wX2RlYnVnX3N0cnVjdF9pbmZvIHdoaWNoIGNvbnRhaW5zCisgICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgT3Blbk1QIGxpYnJhcnkncyBpbXBvcnRhbnQgaW50ZXJuYWwgc3RydWN0dXJlcy4gIFRoaXMKKyAgIGFjY2VzcyB3aWxsIGFsbG93IHRoZSBkZWJ1Z2dlciB0byByZWFkIGRldGFpbGVkIGluZm9ybWF0aW9uIGZyb20gdGhlIHR5cGljYWwKKyAgIE9wZW5NUCBjb25zdHJ1Y3RzICh0ZWFtcywgdGhyZWFkcywgdGFza2luZywgZXRjLiApIGR1cmluZyBhIGRlYnVnZ2luZworICAgc2Vzc2lvbiBhbmQgb2ZmZXIgZGV0YWlsZWQgYW5kIHVzZWZ1bCBpbmZvcm1hdGlvbiB3aGljaCB0aGUgdXNlciBjYW4gcHJvYmUKKyAgIGFib3V0IHRoZSBPcGVuTVAgcG9ydGlvbiBvZiB0aGVpciBjb2RlLiAqLworZXh0ZXJuIGludCBfX2ttcF9kZWJ1Z2dpbmc7IC8qIEJvb2xlYW4gd2hldGhlciBjdXJyZW50bHkgZGVidWdnaW5nIE9wZW5NUCBSVEwgKi8KKy8vIFJldHVybiBudW1iZXIgb2YgdGhyZWFkcyBzcGVjaWZpZWQgYnkgdGhlIGRlYnVnZ2VyIGZvciBnaXZlbiBwYXJhbGxlbCByZWdpb24uCisvKiBUaGUgaWRlbnQgZmllbGQsIHdoaWNoIHJlcHJlc2VudHMgYSBzb3VyY2UgZmlsZSBsb2NhdGlvbiwgaXMgdXNlZCB0byBjaGVjayBpZgorICAgdGhlIGRlYnVnZ2VyIGhhcyBjaGFuZ2VkIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBmb3IgdGhlIHBhcmFsbGVsIHJlZ2lvbiBhdAorICAgc291cmNlIGZpbGUgbG9jYXRpb24gaWRlbnQuICBUaGlzIHdheSwgc3BlY2lmaWMgcGFyYWxsZWwgcmVnaW9ucycgbnVtYmVyIG9mCisgICB0aHJlYWRzIGNhbiBiZSBjaGFuZ2VkIGF0IHRoZSBkZWJ1Z2dlcidzIHJlcXVlc3QuICovCitpbnQgX19rbXBfb21wX251bV90aHJlYWRzKGlkZW50X3QgY29uc3QgKmlkZW50KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjZW5kaWYgLy8gS01QX0RFQlVHR0VSX0gKKworI2VuZGlmIC8vIFVTRV9ERUJVR0dFUgpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2Rpc3BhdGNoLmNwcCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9kaXNwYXRjaC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdhNTlmOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9kaXNwYXRjaC5jcHAKQEAgLTAsMCArMSwyODE4IEBACisvKgorICoga21wX2Rpc3BhdGNoLmNwcDogZHluYW1pYyBzY2hlZHVsaW5nIC0gaXRlcmF0aW9uIGluaXRpYWxpemF0aW9uIGFuZCBkaXNwYXRjaC4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLyogRHluYW1pYyBzY2hlZHVsaW5nIGluaXRpYWxpemF0aW9uIGFuZCBkaXNwYXRjaC4KKyAqCisgKiBOT1RFOiBfX2ttcF9udGggaXMgYSBjb25zdGFudCBpbnNpZGUgb2YgYW55IGRpc3BhdGNoIGxvb3AsIGhvd2V2ZXIKKyAqICAgICAgIGl0IG1heSBjaGFuZ2UgdmFsdWVzIGJldHdlZW4gcGFyYWxsZWwgcmVnaW9ucy4gIF9fa21wX21heF9udGgKKyAqICAgICAgIGlzIHRoZSBsYXJnZXN0IHZhbHVlIF9fa21wX250aCBtYXkgdGFrZSwgMSBpcyB0aGUgc21hbGxlc3QuCisgKi8KKworLy8gTmVlZCB0byByYWlzZSBXaW4gdmVyc2lvbiBmcm9tIFhQIHRvIFZpc3RhIGhlcmUgZm9yIHN1cHBvcnQgb2YKKy8vIEludGVybG9ja2VkRXhjaGFuZ2U2NAorI2lmIGRlZmluZWQoX1dJTjMyX1dJTk5UKSAmJiBkZWZpbmVkKF9NX0lYODYpCisjdW5kZWYgX1dJTjMyX1dJTk5UCisjZGVmaW5lIF9XSU4zMl9XSU5OVCAweDA1MDIKKyNlbmRpZgorCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2Vycm9yLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisjaW5jbHVkZSAia21wX3N0YXRzLmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorI2lmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4NgorI2luY2x1ZGUgPGZsb2F0Lmg+CisjZW5kaWYKKworI2lmIE9NUFRfU1VQUE9SVAorI2luY2x1ZGUgIm9tcHQtaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJvbXB0LXNwZWNpZmljLmgiCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQKKworLy8gcmVwbGFjZXMgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvezMyLDY0fSBzdHJ1Y3R1cmVzIGFuZAorLy8gZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvezMyLDY0fV90IHR5cGVzCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IGRpc3BhdGNoX3ByaXZhdGVfaW5mb1hYX3RlbXBsYXRlIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDxUPjo6dW5zaWduZWRfdCBVVDsKKyAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDxUPjo6c2lnbmVkX3QgU1Q7CisgIFVUIGNvdW50OyAvLyB1bnNpZ25lZAorICBUIHViOworICAvKiBBZGRpbmcgS01QX0FMSUdOX0NBQ0hFIGhlcmUgZG9lc24ndCBoZWxwIC8gY2FuIGh1cnQgcGVyZm9ybWFuY2UgKi8KKyAgVCBsYjsKKyAgU1Qgc3Q7IC8vIHNpZ25lZAorICBVVCB0YzsgLy8gdW5zaWduZWQKKyAgVCBzdGF0aWNfc3RlYWxfY291bnRlcjsgLy8gZm9yIHN0YXRpY19zdGVhbCBvbmx5OyBtYXliZSBiZXR0ZXIgdG8gcHV0IGFmdGVyIHViCisKKyAgLyogcGFybVsxLTRdIGFyZSB1c2VkIGluIGRpZmZlcmVudCB3YXlzIGJ5IGRpZmZlcmVudCBzY2hlZHVsaW5nIGFsZ29yaXRobXMgKi8KKworICAvLyBLTVBfQUxJR04oIDMyICkgZW5zdXJlcyAoIGlmIHRoZSBLTVBfQUxJR04gbWFjcm8gaXMgdHVybmVkIG9uICkKKyAgLy8gICAgYSkgcGFybTMgaXMgcHJvcGVybHkgYWxpZ25lZCBhbmQKKyAgLy8gICAgYikgYWxsIHBhcm0xLTQgYXJlIGluIHRoZSBzYW1lIGNhY2hlIGxpbmUuCisgIC8vIEJlY2F1c2Ugb2YgcGFybTEtNCBhcmUgdXNlZCB0b2dldGhlciwgcGVyZm9ybWFuY2Ugc2VlbXMgdG8gYmUgYmV0dGVyCisgIC8vIGlmIHRoZXkgYXJlIGluIHRoZSBzYW1lIGxpbmUgKG5vdCBtZWFzdXJlZCB0aG91Z2gpLgorCisgIHN0cnVjdCBLTVBfQUxJR04oMzIpIHsgLy8gY29tcGlsZXIgZG9lcyBub3QgYWNjZXB0IHNpemVvZihUKSo0CisgICAgVCBwYXJtMTsKKyAgICBUIHBhcm0yOworICAgIFQgcGFybTM7CisgICAgVCBwYXJtNDsKKyAgfTsKKworICBVVCBvcmRlcmVkX2xvd2VyOyAvLyB1bnNpZ25lZAorICBVVCBvcmRlcmVkX3VwcGVyOyAvLyB1bnNpZ25lZAorI2lmIEtNUF9PU19XSU5ET1dTCisgIFQgbGFzdF91cHBlcjsKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworfTsKKworI2Vsc2UgLyogS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEICovCisKKy8vIHJlcGxhY2VzIGRpc3BhdGNoX3ByaXZhdGVfaW5mb3szMiw2NH0gc3RydWN0dXJlcyBhbmQKKy8vIGRpc3BhdGNoX3ByaXZhdGVfaW5mb3szMiw2NH1fdCB0eXBlcwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBkaXNwYXRjaF9wcml2YXRlX2luZm9YWF90ZW1wbGF0ZSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8VD46OnVuc2lnbmVkX3QgVVQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8VD46OnNpZ25lZF90IFNUOworICBUIGxiOworICBUIHViOworICBTVCBzdDsgLy8gc2lnbmVkCisgIFVUIHRjOyAvLyB1bnNpZ25lZAorCisgIFQgcGFybTE7CisgIFQgcGFybTI7CisgIFQgcGFybTM7CisgIFQgcGFybTQ7CisKKyAgVVQgY291bnQ7IC8vIHVuc2lnbmVkCisKKyAgVVQgb3JkZXJlZF9sb3dlcjsgLy8gdW5zaWduZWQKKyAgVVQgb3JkZXJlZF91cHBlcjsgLy8gdW5zaWduZWQKKyNpZiBLTVBfT1NfV0lORE9XUworICBUIGxhc3RfdXBwZXI7CisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KK307CisKKyNlbmRpZiAvKiBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQgKi8KKworLy8gcmVwbGFjZXMgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvIHN0cnVjdHVyZSBhbmQgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgdHlwZQordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBLTVBfQUxJR05fQ0FDSEUgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlIHsKKyAgLy8gZHVwbGljYXRlIGFsaWdubWVudCBoZXJlLCBvdGhlcndpc2Ugc2l6ZSBvZiBzdHJ1Y3R1cmUgaXMgbm90IGNvcnJlY3QgaW4gb3VyCisgIC8vIGNvbXBpbGVyCisgIHVuaW9uIEtNUF9BTElHTl9DQUNIRSBwcml2YXRlX2luZm9fdG1wbCB7CisgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvWFhfdGVtcGxhdGU8VD4gcDsKKyAgICBkaXNwYXRjaF9wcml2YXRlX2luZm82NF90IHA2NDsKKyAgfSB1OworICBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGU7IC8qIHNjaGVkdWxpbmcgYWxnb3JpdGhtICovCisgIGttcF91aW50MzIgb3JkZXJlZDsgLyogb3JkZXJlZCBjbGF1c2Ugc3BlY2lmaWVkICovCisgIGttcF91aW50MzIgb3JkZXJlZF9idW1wZWQ7CisgIC8vIFRvIHJldGFpbiB0aGUgc3RydWN0dXJlIHNpemUgYWZ0ZXIgbWFraW5nIG9yZGVyZWRfaXRlcmF0aW9uIHNjYWxhcgorICBrbXBfaW50MzIgb3JkZXJlZF9kdW1teVtLTVBfTUFYX09SREVSRUQgLSAzXTsKKyAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvICpuZXh0OyAvKiBzdGFjayBvZiBidWZmZXJzIGZvciBuZXN0IG9mIHNlcmlhbCByZWdpb25zICovCisgIGttcF91aW50MzIgbm9tZXJnZTsgLyogZG9uJ3QgbWVyZ2UgaXRlcnMgaWYgc2VyaWFsaXplZCAqLworICBrbXBfdWludDMyIHR5cGVfc2l6ZTsKKyAgZW51bSBjb25zX3R5cGUgcHVzaGVkX3dzOworfTsKKworLy8gcmVwbGFjZXMgZGlzcGF0Y2hfc2hhcmVkX2luZm97MzIsNjR9IHN0cnVjdHVyZXMgYW5kCisvLyBkaXNwYXRjaF9zaGFyZWRfaW5mb3szMiw2NH1fdCB0eXBlcwordGVtcGxhdGUgPHR5cGVuYW1lIFVUPiBzdHJ1Y3QgZGlzcGF0Y2hfc2hhcmVkX2luZm9YWF90ZW1wbGF0ZSB7CisgIC8qIGNodW5rIGluZGV4IHVuZGVyIGR5bmFtaWMsIG51bWJlciBvZiBpZGxlIHRocmVhZHMgdW5kZXIgc3RhdGljLXN0ZWFsOworICAgICBpdGVyYXRpb24gaW5kZXggb3RoZXJ3aXNlICovCisgIHZvbGF0aWxlIFVUIGl0ZXJhdGlvbjsKKyAgdm9sYXRpbGUgVVQgbnVtX2RvbmU7CisgIHZvbGF0aWxlIFVUIG9yZGVyZWRfaXRlcmF0aW9uOworICAvLyB0byByZXRhaW4gdGhlIHN0cnVjdHVyZSBzaXplIG1ha2luZyBvcmRlcmVkX2l0ZXJhdGlvbiBzY2FsYXIKKyAgVVQgb3JkZXJlZF9kdW1teVtLTVBfTUFYX09SREVSRUQgLSAzXTsKK307CisKKy8vIHJlcGxhY2VzIGRpc3BhdGNoX3NoYXJlZF9pbmZvIHN0cnVjdHVyZSBhbmQgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdCB0eXBlCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVVQ+IHN0cnVjdCBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZSB7CisgIC8vIHdlIG5lZWQgdW5pb24gaGVyZSB0byBrZWVwIHRoZSBzdHJ1Y3R1cmUgc2l6ZQorICB1bmlvbiBzaGFyZWRfaW5mb190bXBsIHsKKyAgICBkaXNwYXRjaF9zaGFyZWRfaW5mb1hYX3RlbXBsYXRlPFVUPiBzOworICAgIGRpc3BhdGNoX3NoYXJlZF9pbmZvNjRfdCBzNjQ7CisgIH0gdTsKKyAgdm9sYXRpbGUga21wX3VpbnQzMiBidWZmZXJfaW5kZXg7CisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgdm9sYXRpbGUga21wX2ludDMyIGRvYWNyb3NzX2J1Zl9pZHg7IC8vIHRlYW13aXNlIGluZGV4CisgIGttcF91aW50MzIgKmRvYWNyb3NzX2ZsYWdzOyAvLyBhcnJheSBvZiBpdGVyYXRpb24gZmxhZ3MgKDAvMSkKKyAga21wX2ludDMyIGRvYWNyb3NzX251bV9kb25lOyAvLyBjb3VudCBmaW5pc2hlZCB0aHJlYWRzCisjZW5kaWYKKyNpZiBLTVBfVVNFX0hXTE9DCisgIC8vIFdoZW4gbGlua2luZyB3aXRoIGxpYmh3bG9jLCB0aGUgT1JERVJFRCBFUENDIHRlc3Qgc2xvd3Nkb3duIG9uIGJpZworICAvLyBtYWNoaW5lcyAoPiA0OCBjb3JlcykuIFBlcmZvcm1hbmNlIGFuYWx5c2lzIHNob3dlZCB0aGF0IGEgY2FjaGUgdGhyYXNoCisgIC8vIHdhcyBvY2N1cnJpbmcgYW5kIHRoaXMgcGFkZGluZyBoZWxwcyBhbGxldmlhdGUgdGhlIHByb2JsZW0uCisgIGNoYXIgcGFkZGluZ1s2NF07CisjZW5kaWYKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjdW5kZWYgVVNFX1RFU1RfTE9DS1MKKworLy8gdGVzdF90aGVuX2FkZCB0ZW1wbGF0ZSAoZ2VuZXJhbCB0ZW1wbGF0ZSBzaG91bGQgTk9UIGJlIHVzZWQpCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RhdGljIF9fZm9yY2VpbmxpbmUgVCB0ZXN0X3RoZW5fYWRkKHZvbGF0aWxlIFQgKnAsIFQgZCk7CisKK3RlbXBsYXRlIDw+CitfX2ZvcmNlaW5saW5lIGttcF9pbnQzMiB0ZXN0X3RoZW5fYWRkPGttcF9pbnQzMj4odm9sYXRpbGUga21wX2ludDMyICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBkKSB7CisgIGttcF9pbnQzMiByOworICByID0gS01QX1RFU1RfVEhFTl9BREQzMihwLCBkKTsKKyAgcmV0dXJuIHI7Cit9CisKK3RlbXBsYXRlIDw+CitfX2ZvcmNlaW5saW5lIGttcF9pbnQ2NCB0ZXN0X3RoZW5fYWRkPGttcF9pbnQ2ND4odm9sYXRpbGUga21wX2ludDY0ICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCBkKSB7CisgIGttcF9pbnQ2NCByOworICByID0gS01QX1RFU1RfVEhFTl9BREQ2NChwLCBkKTsKKyAgcmV0dXJuIHI7Cit9CisKKy8vIHRlc3RfdGhlbl9pbmNfYWNxIHRlbXBsYXRlIChnZW5lcmFsIHRlbXBsYXRlIHNob3VsZCBOT1QgYmUgdXNlZCkKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdGF0aWMgX19mb3JjZWlubGluZSBUIHRlc3RfdGhlbl9pbmNfYWNxKHZvbGF0aWxlIFQgKnApOworCit0ZW1wbGF0ZSA8PgorX19mb3JjZWlubGluZSBrbXBfaW50MzIgdGVzdF90aGVuX2luY19hY3E8a21wX2ludDMyPih2b2xhdGlsZSBrbXBfaW50MzIgKnApIHsKKyAga21wX2ludDMyIHI7CisgIHIgPSBLTVBfVEVTVF9USEVOX0lOQ19BQ1EzMihwKTsKKyAgcmV0dXJuIHI7Cit9CisKK3RlbXBsYXRlIDw+CitfX2ZvcmNlaW5saW5lIGttcF9pbnQ2NCB0ZXN0X3RoZW5faW5jX2FjcTxrbXBfaW50NjQ+KHZvbGF0aWxlIGttcF9pbnQ2NCAqcCkgeworICBrbXBfaW50NjQgcjsKKyAgciA9IEtNUF9URVNUX1RIRU5fSU5DX0FDUTY0KHApOworICByZXR1cm4gcjsKK30KKworLy8gdGVzdF90aGVuX2luYyB0ZW1wbGF0ZSAoZ2VuZXJhbCB0ZW1wbGF0ZSBzaG91bGQgTk9UIGJlIHVzZWQpCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RhdGljIF9fZm9yY2VpbmxpbmUgVCB0ZXN0X3RoZW5faW5jKHZvbGF0aWxlIFQgKnApOworCit0ZW1wbGF0ZSA8PgorX19mb3JjZWlubGluZSBrbXBfaW50MzIgdGVzdF90aGVuX2luYzxrbXBfaW50MzI+KHZvbGF0aWxlIGttcF9pbnQzMiAqcCkgeworICBrbXBfaW50MzIgcjsKKyAgciA9IEtNUF9URVNUX1RIRU5fSU5DMzIocCk7CisgIHJldHVybiByOworfQorCit0ZW1wbGF0ZSA8PgorX19mb3JjZWlubGluZSBrbXBfaW50NjQgdGVzdF90aGVuX2luYzxrbXBfaW50NjQ+KHZvbGF0aWxlIGttcF9pbnQ2NCAqcCkgeworICBrbXBfaW50NjQgcjsKKyAgciA9IEtNUF9URVNUX1RIRU5fSU5DNjQocCk7CisgIHJldHVybiByOworfQorCisvLyBjb21wYXJlX2FuZF9zd2FwIHRlbXBsYXRlIChnZW5lcmFsIHRlbXBsYXRlIHNob3VsZCBOT1QgYmUgdXNlZCkKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIF9fZm9yY2VpbmxpbmUga21wX2ludDMyIGNvbXBhcmVfYW5kX3N3YXAodm9sYXRpbGUgVCAqcCwgVCBjLCBUIHMpOworCit0ZW1wbGF0ZSA8PgorX19mb3JjZWlubGluZSBrbXBfaW50MzIgY29tcGFyZV9hbmRfc3dhcDxrbXBfaW50MzI+KHZvbGF0aWxlIGttcF9pbnQzMiAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgYywga21wX2ludDMyIHMpIHsKKyAgcmV0dXJuIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUwzMihwLCBjLCBzKTsKK30KKwordGVtcGxhdGUgPD4KK19fZm9yY2VpbmxpbmUga21wX2ludDMyIGNvbXBhcmVfYW5kX3N3YXA8a21wX2ludDY0Pih2b2xhdGlsZSBrbXBfaW50NjQgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IGMsIGttcF9pbnQ2NCBzKSB7CisgIHJldHVybiBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMNjQocCwgYywgcyk7Cit9CisKKy8qIFNwaW4gd2FpdCBsb29wIHRoYXQgZmlyc3QgZG9lcyBwYXVzZSwgdGhlbiB5aWVsZC4KKyAgICBXYWl0cyB1bnRpbCBmdW5jdGlvbiByZXR1cm5zIG5vbi16ZXJvIHdoZW4gY2FsbGVkIHdpdGggKnNwaW5uZXIgYW5kIGNoZWNrLgorICAgIERvZXMgTk9UIHB1dCB0aHJlYWRzIHRvIHNsZWVwLgorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBBcmd1bWVudHM6CisgICAgICAgIG9iaiAtLSBpcyBoaWdoZXItbGV2ZWwgc3luY2hyb25pemF0aW9uIG9iamVjdCB0byByZXBvcnQgdG8gaXR0bm90aWZ5LgorICAgICAgICBJdCBpcyB1c2VkIHRvIHJlcG9ydCBsb2NrcyBjb25zaXN0ZW50bHkuIEZvciBleGFtcGxlLCBpZiBsb2NrIGlzCisgICAgICAgIGFjcXVpcmVkIGltbWVkaWF0ZWx5LCBpdHMgYWRkcmVzcyBpcyByZXBvcnRlZCB0byBpdHRub3RpZnkgdmlhCisgICAgICAgIEtNUF9GU1lOQ19BQ1FVSVJFRCgpLiBIb3dldmVyLCBpdCBsb2NrIGNhbm5vdCBiZSBhY3F1aXJlZCBpbW1lZGlhdGVseQorICAgICAgICBhbmQgbG9jayByb3V0aW5lIGNhbGxzIHRvIEtNUF9XQUlUX1lJRUxEKCksIHRoZSBsYXRlciBzaG91bGQgcmVwb3J0IHRoZQorICAgICAgICBzYW1lIGFkZHJlc3MsIG5vdCBhbiBhZGRyZXNzIG9mIGxvdy1sZXZlbCBzcGlubmVyLgorI2VuZGlmIC8vIFVTRV9JVFRfQlVJTEQKKyovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVVQ+CisvLyBUb0RvOiBtYWtlIGlubGluZSBmdW5jdGlvbiAobW92ZSB0byBoZWFkZXIgZmlsZSBmb3IgaWNsKQorc3RhdGljIFVUIC8vIHVuc2lnbmVkIDQtIG9yIDgtYnl0ZSB0eXBlCisgICAgX19rbXBfd2FpdF95aWVsZCgKKyAgICAgICAgdm9sYXRpbGUgVVQgKnNwaW5uZXIsIFVUIGNoZWNrZXIsCisgICAgICAgIGttcF91aW50MzIgKCpwcmVkKShVVCwgVVQpIFVTRV9JVFRfQlVJTERfQVJHKAorICAgICAgICAgICAgdm9pZCAqb2JqKSAvLyBIaWdoZXItbGV2ZWwgc3luY2hyb25pemF0aW9uIG9iamVjdCwgb3IgTlVMTC4KKyAgICAgICAgKSB7CisgIC8vIG5vdGU6IHdlIG1heSBub3QgYmVsb25nIHRvIGEgdGVhbSBhdCB0aGlzIHBvaW50CisgIHZvbGF0aWxlIFVUICpzcGluID0gc3Bpbm5lcjsKKyAgVVQgY2hlY2sgPSBjaGVja2VyOworICBrbXBfdWludDMyIHNwaW5zOworICBrbXBfdWludDMyICgqZikoVVQsIFVUKSA9IHByZWQ7CisgIFVUIHI7CisKKyAgS01QX0ZTWU5DX1NQSU5fSU5JVChvYmosIENDQVNUKFVUICosIHNwaW4pKTsKKyAgS01QX0lOSVRfWUlFTEQoc3BpbnMpOworICAvLyBtYWluIHdhaXQgc3BpbiBsb29wCisgIHdoaWxlICghZihyID0gKnNwaW4sIGNoZWNrKSkgeworICAgIEtNUF9GU1lOQ19TUElOX1BSRVBBUkUob2JqKTsKKyAgICAvKiBHRUggLSByZW1vdmUgdGhpcyBzaW5jZSBpdCB3YXMgYWNjaWRlbnRhbGx5IGludHJvZHVjZWQgd2hlbiBrbXBfd2FpdCB3YXMKKyAgICAgICBzcGxpdC4gSXQgY2F1c2VzIHByb2JsZW1zIHdpdGggaW5maW5pdGUgcmVjdXJzaW9uIGJlY2F1c2Ugb2YgZXhpdCBsb2NrICovCisgICAgLyogaWYgKCBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpICYmIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQpCisgICAgICAgIF9fa21wX2Fib3J0X3RocmVhZCgpOyAqLworCisgICAgLy8gaWYgd2UgYXJlIG92ZXJzdWJzY3JpYmVkLCBvciBoYXZlIHdhaXRlZCBhIGJpdCAoYW5kCisgICAgLy8gS01QX0xJQlJBUlk9dGhyb3VnaHB1dCwgdGhlbiB5aWVsZC4gcGF1c2UgaXMgaW4gdGhlIGZvbGxvd2luZyBjb2RlCisgICAgS01QX1lJRUxEKFRDUl80KF9fa21wX250aCkgPiBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICBLTVBfWUlFTERfU1BJTihzcGlucyk7CisgIH0KKyAgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQob2JqKTsKKyAgcmV0dXJuIHI7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBVVD4gc3RhdGljIGttcF91aW50MzIgX19rbXBfZXEoVVQgdmFsdWUsIFVUIGNoZWNrZXIpIHsKKyAgcmV0dXJuIHZhbHVlID09IGNoZWNrZXI7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBVVD4gc3RhdGljIGttcF91aW50MzIgX19rbXBfbmVxKFVUIHZhbHVlLCBVVCBjaGVja2VyKSB7CisgIHJldHVybiB2YWx1ZSAhPSBjaGVja2VyOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVVQ+IHN0YXRpYyBrbXBfdWludDMyIF9fa21wX2x0KFVUIHZhbHVlLCBVVCBjaGVja2VyKSB7CisgIHJldHVybiB2YWx1ZSA8IGNoZWNrZXI7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBVVD4gc3RhdGljIGttcF91aW50MzIgX19rbXBfZ2UoVVQgdmFsdWUsIFVUIGNoZWNrZXIpIHsKKyAgcmV0dXJuIHZhbHVlID49IGNoZWNrZXI7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBVVD4gc3RhdGljIGttcF91aW50MzIgX19rbXBfbGUoVVQgdmFsdWUsIFVUIGNoZWNrZXIpIHsKKyAgcmV0dXJuIHZhbHVlIDw9IGNoZWNrZXI7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBfX2ttcF9kaXNwYXRjaF9kZW9fZXJyb3IoaW50ICpndGlkX3JlZiwgaW50ICpjaWRfcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50X3QgKmxvY19yZWYpIHsKKyAga21wX2luZm9fdCAqdGg7CisKKyAgS01QX0RFQlVHX0FTU0VSVChndGlkX3JlZik7CisKKyAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgIHRoID0gX19rbXBfdGhyZWFkc1sqZ3RpZF9yZWZdOworICAgIGlmICh0aC0+dGgudGhfcm9vdC0+ci5yX2FjdGl2ZSAmJgorICAgICAgICAodGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9wcl9jdXJyZW50LT5wdXNoZWRfd3MgIT0gY3Rfbm9uZSkpIHsKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgICAgX19rbXBfcHVzaF9zeW5jKCpndGlkX3JlZiwgY3Rfb3JkZXJlZF9pbl9wZG8sIGxvY19yZWYsIE5VTEwsIDApOworI2Vsc2UKKyAgICAgIF9fa21wX3B1c2hfc3luYygqZ3RpZF9yZWYsIGN0X29yZGVyZWRfaW5fcGRvLCBsb2NfcmVmLCBOVUxMKTsKKyNlbmRpZgorICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVVQ+CitzdGF0aWMgdm9pZCBfX2ttcF9kaXNwYXRjaF9kZW8oaW50ICpndGlkX3JlZiwgaW50ICpjaWRfcmVmLCBpZGVudF90ICpsb2NfcmVmKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8VVQ+OjpzaWduZWRfdCBTVDsKKyAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPFVUPiAqcHI7CisKKyAgaW50IGd0aWQgPSAqZ3RpZF9yZWY7CisgIC8vICAgIGludCAgY2lkID0gKmNpZF9yZWY7CisgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgS01QX0RFQlVHX0FTU0VSVCh0aC0+dGgudGhfZGlzcGF0Y2gpOworCisgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9kZW86IFQjJWQgY2FsbGVkXG4iLCBndGlkKSk7CisgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICBwciA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPFVUPiAqPigKKyAgICAgICAgdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9wcl9jdXJyZW50KTsKKyAgICBpZiAocHItPnB1c2hlZF93cyAhPSBjdF9ub25lKSB7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICAgIF9fa21wX3B1c2hfc3luYyhndGlkLCBjdF9vcmRlcmVkX2luX3BkbywgbG9jX3JlZiwgTlVMTCwgMCk7CisjZWxzZQorICAgICAgX19rbXBfcHVzaF9zeW5jKGd0aWQsIGN0X29yZGVyZWRfaW5fcGRvLCBsb2NfcmVmLCBOVUxMKTsKKyNlbmRpZgorICAgIH0KKyAgfQorCisgIGlmICghdGgtPnRoLnRoX3RlYW0tPnQudF9zZXJpYWxpemVkKSB7CisgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGU8VVQ+ICpzaCA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8ZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGU8VVQ+ICo+KAorICAgICAgICAgICAgdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9zaF9jdXJyZW50KTsKKyAgICBVVCBsb3dlcjsKKworICAgIGlmICghX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICBwciA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPFVUPiAqPigKKyAgICAgICAgICB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQpOworICAgIH0KKyAgICBsb3dlciA9IHByLT51LnAub3JkZXJlZF9sb3dlcjsKKworI2lmICFkZWZpbmVkKEtNUF9HT01QX0NPTVBBVCkKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICBpZiAocHItPm9yZGVyZWRfYnVtcGVkKSB7CisgICAgICAgIHN0cnVjdCBjb25zX2hlYWRlciAqcCA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX2NvbnM7CisgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoa21wX2kxOG5fbXNnX0Nuc011bHRpcGxlTmVzdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdF9vcmRlcmVkX2luX3BkbywgbG9jX3JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcC0+c3RhY2tfZGF0YVtwLT53X3RvcF0pOworICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiAhZGVmaW5lZChLTVBfR09NUF9DT01QQVQpICovCisKKyAgICBLTVBfTUIoKTsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpidWZmOworICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgiX19rbXBfZGlzcGF0Y2hfZGVvOiBUIyUlZCBiZWZvcmUgd2FpdDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyZWRfaXRlcjolJSVzIGxvd2VyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDxVVD46OnNwZWMsIHRyYWl0c190PFVUPjo6c3BlYyk7CisgICAgICBLRF9UUkFDRSgxMDAwLCAoYnVmZiwgZ3RpZCwgc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbiwgbG93ZXIpKTsKKyAgICAgIF9fa21wX3N0cl9mcmVlKCZidWZmKTsKKyAgICB9CisjZW5kaWYKKworICAgIF9fa21wX3dhaXRfeWllbGQ8VVQ+KCZzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uLCBsb3dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9nZTxVVD4gVVNFX0lUVF9CVUlMRF9BUkcoTlVMTCkpOworICAgIEtNUF9NQigpOyAvKiBpcyB0aGlzIG5lY2Vzc2FyeT8gKi8KKyNpZmRlZiBLTVBfREVCVUcKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpidWZmOworICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgiX19rbXBfZGlzcGF0Y2hfZGVvOiBUIyUlZCBhZnRlciB3YWl0OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXJlZF9pdGVyOiUlJXMgbG93ZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PFVUPjo6c3BlYywgdHJhaXRzX3Q8VVQ+OjpzcGVjKTsKKyAgICAgIEtEX1RSQUNFKDEwMDAsIChidWZmLCBndGlkLCBzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uLCBsb3dlcikpOworICAgICAgX19rbXBfc3RyX2ZyZWUoJmJ1ZmYpOworICAgIH0KKyNlbmRpZgorICB9CisgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9kZW86IFQjJWQgcmV0dXJuZWRcbiIsIGd0aWQpKTsKK30KKworc3RhdGljIHZvaWQgX19rbXBfZGlzcGF0Y2hfZHhvX2Vycm9yKGludCAqZ3RpZF9yZWYsIGludCAqY2lkX3JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudF90ICpsb2NfcmVmKSB7CisgIGttcF9pbmZvX3QgKnRoOworCisgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICB0aCA9IF9fa21wX3RocmVhZHNbKmd0aWRfcmVmXTsKKyAgICBpZiAodGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9wcl9jdXJyZW50LT5wdXNoZWRfd3MgIT0gY3Rfbm9uZSkgeworICAgICAgX19rbXBfcG9wX3N5bmMoKmd0aWRfcmVmLCBjdF9vcmRlcmVkX2luX3BkbywgbG9jX3JlZik7CisgICAgfQorICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBVVD4KK3N0YXRpYyB2b2lkIF9fa21wX2Rpc3BhdGNoX2R4byhpbnQgKmd0aWRfcmVmLCBpbnQgKmNpZF9yZWYsIGlkZW50X3QgKmxvY19yZWYpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDxVVD46OnNpZ25lZF90IFNUOworICBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8VVQ+ICpwcjsKKworICBpbnQgZ3RpZCA9ICpndGlkX3JlZjsKKyAgLy8gICAgaW50ICBjaWQgPSAqY2lkX3JlZjsKKyAga21wX2luZm9fdCAqdGggPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICBLTVBfREVCVUdfQVNTRVJUKHRoLT50aC50aF9kaXNwYXRjaCk7CisKKyAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2R4bzogVCMlZCBjYWxsZWRcbiIsIGd0aWQpKTsKKyAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgIHByID0gcmVpbnRlcnByZXRfY2FzdDxkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8VVQ+ICo+KAorICAgICAgICB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQpOworICAgIGlmIChwci0+cHVzaGVkX3dzICE9IGN0X25vbmUpIHsKKyAgICAgIF9fa21wX3BvcF9zeW5jKGd0aWQsIGN0X29yZGVyZWRfaW5fcGRvLCBsb2NfcmVmKTsKKyAgICB9CisgIH0KKworICBpZiAoIXRoLT50aC50aF90ZWFtLT50LnRfc2VyaWFsaXplZCkgeworICAgIGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPFVUPiAqc2ggPQorICAgICAgICByZWludGVycHJldF9jYXN0PGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPFVUPiAqPigKKyAgICAgICAgICAgIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfc2hfY3VycmVudCk7CisKKyAgICBpZiAoIV9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgcHIgPSByZWludGVycHJldF9jYXN0PGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTxVVD4gKj4oCisgICAgICAgICAgdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9wcl9jdXJyZW50KTsKKyAgICB9CisKKyAgICBLTVBfRlNZTkNfUkVMRUFTSU5HKENDQVNUKFVUICosICZzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uKSk7CisjaWYgIWRlZmluZWQoS01QX0dPTVBfQ09NUEFUKQorICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgIGlmIChwci0+b3JkZXJlZF9idW1wZWQgIT0gMCkgeworICAgICAgICBzdHJ1Y3QgY29uc19oZWFkZXIgKnAgPSBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF9jb25zOworICAgICAgICAvKiBIb3cgdG8gdGVzdCBpdD8gLSBPTSAqLworICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKGttcF9pMThuX21zZ19DbnNNdWx0aXBsZU5lc3RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Rfb3JkZXJlZF9pbl9wZG8sIGxvY19yZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPnN0YWNrX2RhdGFbcC0+d190b3BdKTsKKyAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogIWRlZmluZWQoS01QX0dPTVBfQ09NUEFUKSAqLworCisgICAgS01QX01CKCk7IC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBwci0+b3JkZXJlZF9idW1wZWQgKz0gMTsKKworICAgIEtEX1RSQUNFKDEwMDAsCisgICAgICAgICAgICAgKCJfX2ttcF9kaXNwYXRjaF9keG86IFQjJWQgYnVtcGluZyBvcmRlcmVkIG9yZGVyZWRfYnVtcGVkPSVkXG4iLAorICAgICAgICAgICAgICBndGlkLCBwci0+b3JkZXJlZF9idW1wZWQpKTsKKworICAgIEtNUF9NQigpOyAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgLyogVE9ETyB1c2UgZ2VuZXJhbCByZWxlYXNlIHByb2NlZHVyZT8gKi8KKyAgICB0ZXN0X3RoZW5faW5jPFNUPigodm9sYXRpbGUgU1QgKikmc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbik7CisKKyAgICBLTVBfTUIoKTsgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKyAgfQorICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfZHhvOiBUIyVkIHJldHVybmVkXG4iLCBndGlkKSk7Cit9CisKKy8vIENvbXB1dGVzIGFuZCByZXR1cm5zIHggdG8gdGhlIHBvd2VyIG9mIHksIHdoZXJlIHkgbXVzdCBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVVQ+CitzdGF0aWMgX19mb3JjZWlubGluZSBsb25nIGRvdWJsZSBfX2ttcF9wb3cobG9uZyBkb3VibGUgeCwgVVQgeSkgeworICBsb25nIGRvdWJsZSBzID0gMS4wTDsKKworICBLTVBfREVCVUdfQVNTRVJUKHggPiAwLjAgJiYgeCA8IDEuMCk7CisgIC8vIEtNUF9ERUJVR19BU1NFUlQoeSA+PSAwKTsgLy8geSBpcyB1bnNpZ25lZAorICB3aGlsZSAoeSkgeworICAgIGlmICh5ICYgMSkKKyAgICAgIHMgKj0geDsKKyAgICB4ICo9IHg7CisgICAgeSA+Pj0gMTsKKyAgfQorICByZXR1cm4gczsKK30KKworLyogQ29tcHV0ZXMgYW5kIHJldHVybnMgdGhlIG51bWJlciBvZiB1bmFzc2lnbmVkIGl0ZXJhdGlvbnMgYWZ0ZXIgaWR4IGNodW5rcworICAgaGF2ZSBiZWVuIGFzc2lnbmVkICh0aGUgdG90YWwgbnVtYmVyIG9mIHVuYXNzaWduZWQgaXRlcmF0aW9ucyBpbiBjaHVua3Mgd2l0aAorICAgaW5kZXggZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGlkeCkuIF9fZm9yY2VpbmxpbmUgc2VlbXMgdG8gYmUgYnJva2VuIHNvIHRoYXQKKyAgIGlmIHdlIF9fZm9yY2VpbmxpbmUgdGhpcyBmdW5jdGlvbiwgdGhlIGJlaGF2aW9yIGlzIHdyb25nCisgICAob25lIG9mIHRoZSB1bml0IHRlc3RzLCBzY2hfZ3VpZGVkX2FuYWx5dGljYWxfYmFzaWMuY3BwLCBmYWlscykgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIF9faW5saW5lIHR5cGVuYW1lIHRyYWl0c190PFQ+Ojp1bnNpZ25lZF90CitfX2ttcF9kaXNwYXRjaF9ndWlkZWRfcmVtYWluaW5nKFQgdGMsIHR5cGVuYW1lIHRyYWl0c190PFQ+OjpmbG9hdGluZ190IGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHRyYWl0c190PFQ+Ojp1bnNpZ25lZF90IGlkeCkgeworICAvKiBOb3RlOiBPbiBXaW5kb3dzKiBPUyBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0LCBhdCBsZWFzdCBmb3IKKyAgICAgSUNMIDguMSwgbG9uZyBkb3VibGUgYXJpdGhtZXRpYyBtYXkgbm90IHJlYWxseSBoYXZlIGxvbmcgZG91YmxlIHByZWNpc2lvbiwKKyAgICAgZXZlbiB3aXRoIC9RbG9uZ19kb3VibGUuICBDdXJyZW50bHksIHdlIHdvcmthcm91bmQgdGhhdCBpbiB0aGUgY2FsbGVyIGNvZGUsCisgICAgIGJ5IG1hbmlwdWxhdGluZyB0aGUgRlBDVyBmb3IgV2luZG93cyogT1Mgb24gSUEtMzIgYXJjaGl0ZWN0dXJlLiAgVGhlIGxhY2sKKyAgICAgb2YgcHJlY2lzaW9uIGlzIG5vdCBleHBlY3RlZCB0byBiZSBhIGNvcnJlY3RuZXNzIGlzc3VlLCB0aG91Z2guICovCisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8VD46OnVuc2lnbmVkX3QgVVQ7CisKKyAgbG9uZyBkb3VibGUgeCA9IHRjICogX19rbXBfcG93PFVUPihiYXNlLCBpZHgpOworICBVVCByID0gKFVUKXg7CisgIGlmICh4ID09IHIpCisgICAgcmV0dXJuIHI7CisgIHJldHVybiByICsgMTsKK30KKworLy8gUGFyYW1ldGVycyBvZiB0aGUgZ3VpZGVkLWl0ZXJhdGl2ZSBhbGdvcml0aG06CisvLyAgIHAyID0gbiAqIG5wcm9jICogKCBjaHVuayArIDEgKSAgLy8gcG9pbnQgb2Ygc3dpdGNoaW5nIHRvIGR5bmFtaWMKKy8vICAgcDMgPSAxIC8gKCBuICogbnByb2MgKSAgICAgICAgICAvLyByZW1haW5pbmcgaXRlcmF0aW9ucyBtdWx0aXBsaWVyCisvLyBieSBkZWZhdWx0IG4gPSAyLiBGb3IgZXhhbXBsZSB3aXRoIG4gPSAzIHRoZSBjaHVua3MgZGlzdHJpYnV0aW9uIHdpbGwgYmUgbW9yZQorLy8gZmxhdC4KKy8vIFdpdGggbiA9IDEgZmlyc3QgY2h1bmsgaXMgdGhlIHNhbWUgYXMgZm9yIHN0YXRpYyBzY2hlZHVsZSwgZS5nLiB0cmlwIC8gbnByb2MuCitzdGF0aWMgaW50IGd1aWRlZF9pbnRfcGFyYW0gPSAyOworc3RhdGljIGRvdWJsZSBndWlkZWRfZmx0X3BhcmFtID0gMC41OyAvLyA9IDEuMCAvIGd1aWRlZF9pbnRfcGFyYW07CisKKy8vIFVUIC0gdW5zaWduZWQgZmxhdm9yIG9mIFQsIFNUIC0gc2lnbmVkIGZsYXZvciBvZiBULAorLy8gREJMIC0gZG91YmxlIGlmIHNpemVvZihUKT09NCwgb3IgbG9uZyBkb3VibGUgaWYgc2l6ZW9mKFQpPT04Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyB2b2lkCitfX2ttcF9kaXNwYXRjaF9pbml0KGlkZW50X3QgKmxvYywgaW50IGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwgVCBsYiwKKyAgICAgICAgICAgICAgICAgICAgVCB1YiwgdHlwZW5hbWUgdHJhaXRzX3Q8VD46OnNpZ25lZF90IHN0LAorICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSB0cmFpdHNfdDxUPjo6c2lnbmVkX3QgY2h1bmssIGludCBwdXNoX3dzKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8VD46OnVuc2lnbmVkX3QgVVQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8VD46OnNpZ25lZF90IFNUOworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PFQ+OjpmbG9hdGluZ190IERCTDsKKworICBpbnQgYWN0aXZlOworICBUIHRjOworICBrbXBfaW5mb190ICp0aDsKKyAga21wX3RlYW1fdCAqdGVhbTsKKyAga21wX3VpbnQzMiBteV9idWZmZXJfaW5kZXg7CisgIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTxUPiAqcHI7CisgIGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPFVUPiB2b2xhdGlsZSAqc2g7CisKKyAgS01QX0JVSUxEX0FTU0VSVChzaXplb2YoZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPFQ+KSA9PQorICAgICAgICAgICAgICAgICAgIHNpemVvZihkaXNwYXRjaF9wcml2YXRlX2luZm8pKTsKKyAgS01QX0JVSUxEX0FTU0VSVChzaXplb2YoZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGU8VVQ+KSA9PQorICAgICAgICAgICAgICAgICAgIHNpemVvZihkaXNwYXRjaF9zaGFyZWRfaW5mbykpOworCisgIGlmICghVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkpCisgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisjaWYgSU5DTFVERV9TU0NfTUFSS1MKKyAgU1NDX01BUktfRElTUEFUQ0hfSU5JVCgpOworI2VuZGlmCisjaWZkZWYgS01QX0RFQlVHCisgIHsKKyAgICBjb25zdCBjaGFyICpidWZmOworICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyUlZCBjYWxsZWQ6IHNjaGVkdWxlOiUlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNodW5rOiUlJXMgbGI6JSUlcyB1YjolJSVzIHN0OiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8U1Q+OjpzcGVjLCB0cmFpdHNfdDxUPjo6c3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDxUPjo6c3BlYywgdHJhaXRzX3Q8U1Q+OjpzcGVjKTsKKyAgICBLRF9UUkFDRSgxMCwgKGJ1ZmYsIGd0aWQsIHNjaGVkdWxlLCBjaHVuaywgbGIsIHViLCBzdCkpOworICAgIF9fa21wX3N0cl9mcmVlKCZidWZmKTsKKyAgfQorI2VuZGlmCisgIC8qIHNldHVwIGRhdGEgKi8KKyAgdGggPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICB0ZWFtID0gdGgtPnRoLnRoX3RlYW07CisgIGFjdGl2ZSA9ICF0ZWFtLT50LnRfc2VyaWFsaXplZDsKKyAgdGgtPnRoLnRoX2lkZW50ID0gbG9jOworCisjaWYgVVNFX0lUVF9CVUlMRAorICBrbXBfdWludDY0IGN1cl9jaHVuayA9IGNodW5rOworICBpbnQgaXR0X25lZWRfbWV0YWRhdGFfcmVwb3J0aW5nID0gX19pdHRfbWV0YWRhdGFfYWRkX3B0ciAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX01BU1RFUl9HVElEKGd0aWQpICYmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF90ZWFtc19taWNyb3Rhc2sgPT0gTlVMTCAmJgorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfYWN0aXZlX2xldmVsID09IDE7CisjZW5kaWYKKyAgaWYgKCFhY3RpdmUpIHsKKyAgICBwciA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPFQ+ICo+KAorICAgICAgICB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyKTsgLyogdG9wIG9mIHRoZSBzdGFjayAqLworICB9IGVsc2UgeworICAgIEtNUF9ERUJVR19BU1NFUlQodGgtPnRoLnRoX2Rpc3BhdGNoID09CisgICAgICAgICAgICAgICAgICAgICAmdGgtPnRoLnRoX3RlYW0tPnQudF9kaXNwYXRjaFt0aC0+dGgudGhfaW5mby5kcy5kc190aWRdKTsKKworICAgIG15X2J1ZmZlcl9pbmRleCA9IHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcF9pbmRleCsrOworCisgICAgLyogV2hhdCBoYXBwZW5zIHdoZW4gbnVtYmVyIG9mIHRocmVhZHMgY2hhbmdlcywgbmVlZCB0byByZXNpemUgYnVmZmVyPyAqLworICAgIHByID0gcmVpbnRlcnByZXRfY2FzdDxkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8VD4gKj4oCisgICAgICAgICZ0aC0+dGgudGhfZGlzcGF0Y2gKKyAgICAgICAgICAgICAtPnRoX2Rpc3BfYnVmZmVyW215X2J1ZmZlcl9pbmRleCAlIF9fa21wX2Rpc3BhdGNoX251bV9idWZmZXJzXSk7CisgICAgc2ggPSByZWludGVycHJldF9jYXN0PGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPFVUPiB2b2xhdGlsZSAqPigKKyAgICAgICAgJnRlYW0tPnQudF9kaXNwX2J1ZmZlcltteV9idWZmZXJfaW5kZXggJSBfX2ttcF9kaXNwYXRjaF9udW1fYnVmZmVyc10pOworICB9CisKKyNpZiAoS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEKQorICBpZiAoU0NIRURVTEVfSEFTX05PTk1PTk9UT05JQyhzY2hlZHVsZSkpCisgICAgLy8gQUM6IHdlIG5vdyBoYXZlIG9ubHkgb25lIGltcGxlbWVudGF0aW9uIG9mIHN0ZWFsaW5nLCBzbyB1c2UgaXQKKyAgICBzY2hlZHVsZSA9IGttcF9zY2hfc3RhdGljX3N0ZWFsOworICBlbHNlCisjZW5kaWYKKyAgICBzY2hlZHVsZSA9IFNDSEVEVUxFX1dJVEhPVVRfTU9ESUZJRVJTKHNjaGVkdWxlKTsKKworICAvKiBQaWNrIHVwIHRoZSBub21lcmdlL29yZGVyZWQgYml0cyBmcm9tIHRoZSBzY2hlZHVsaW5nIHR5cGUgKi8KKyAgaWYgKChzY2hlZHVsZSA+PSBrbXBfbm1fbG93ZXIpICYmIChzY2hlZHVsZSA8IGttcF9ubV91cHBlcikpIHsKKyAgICBwci0+bm9tZXJnZSA9IFRSVUU7CisgICAgc2NoZWR1bGUgPQorICAgICAgICAoZW51bSBzY2hlZF90eXBlKSgoKGludClzY2hlZHVsZSkgLSAoa21wX25tX2xvd2VyIC0ga21wX3NjaF9sb3dlcikpOworICB9IGVsc2UgeworICAgIHByLT5ub21lcmdlID0gRkFMU0U7CisgIH0KKyAgcHItPnR5cGVfc2l6ZSA9IHRyYWl0c190PFQ+Ojp0eXBlX3NpemU7IC8vIHJlbWVtYmVyIHRoZSBzaXplIG9mIHZhcmlhYmxlcworICBpZiAoa21wX29yZF9sb3dlciAmIHNjaGVkdWxlKSB7CisgICAgcHItPm9yZGVyZWQgPSBUUlVFOworICAgIHNjaGVkdWxlID0KKyAgICAgICAgKGVudW0gc2NoZWRfdHlwZSkoKChpbnQpc2NoZWR1bGUpIC0gKGttcF9vcmRfbG93ZXIgLSBrbXBfc2NoX2xvd2VyKSk7CisgIH0gZWxzZSB7CisgICAgcHItPm9yZGVyZWQgPSBGQUxTRTsKKyAgfQorCisgIGlmIChzY2hlZHVsZSA9PSBrbXBfc2NoX3N0YXRpYykgeworICAgIHNjaGVkdWxlID0gX19rbXBfc3RhdGljOworICB9IGVsc2UgeworICAgIGlmIChzY2hlZHVsZSA9PSBrbXBfc2NoX3J1bnRpbWUpIHsKKyAgICAgIC8vIFVzZSB0aGUgc2NoZWR1bGluZyBzcGVjaWZpZWQgYnkgT01QX1NDSEVEVUxFIChvciBfX2ttcF9zY2hfZGVmYXVsdCBpZgorICAgICAgLy8gbm90IHNwZWNpZmllZCkKKyAgICAgIHNjaGVkdWxlID0gdGVhbS0+dC50X3NjaGVkLnJfc2NoZWRfdHlwZTsKKyAgICAgIC8vIERldGFpbCB0aGUgc2NoZWR1bGUgaWYgbmVlZGVkIChnbG9iYWwgY29udHJvbHMgYXJlIGRpZmZlcmVudGlhdGVkCisgICAgICAvLyBhcHByb3ByaWF0ZWx5KQorICAgICAgaWYgKHNjaGVkdWxlID09IGttcF9zY2hfZ3VpZGVkX2NodW5rZWQpIHsKKyAgICAgICAgc2NoZWR1bGUgPSBfX2ttcF9ndWlkZWQ7CisgICAgICB9IGVsc2UgaWYgKHNjaGVkdWxlID09IGttcF9zY2hfc3RhdGljKSB7CisgICAgICAgIHNjaGVkdWxlID0gX19rbXBfc3RhdGljOworICAgICAgfQorICAgICAgLy8gVXNlIHRoZSBjaHVuayBzaXplIHNwZWNpZmllZCBieSBPTVBfU0NIRURVTEUgKG9yIGRlZmF1bHQgaWYgbm90CisgICAgICAvLyBzcGVjaWZpZWQpCisgICAgICBjaHVuayA9IHRlYW0tPnQudF9zY2hlZC5jaHVuazsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICBjdXJfY2h1bmsgPSBjaHVuazsKKyNlbmRpZgorI2lmZGVmIEtNUF9ERUJVRworICAgICAgeworICAgICAgICBjb25zdCBjaGFyICpidWZmOworICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlJWQgbmV3OiBzY2hlZHVsZTolJWQgY2h1bms6JSUlc1xuIiwKKyAgICAgICAgICAgIHRyYWl0c190PFNUPjo6c3BlYyk7CisgICAgICAgIEtEX1RSQUNFKDEwLCAoYnVmZiwgZ3RpZCwgc2NoZWR1bGUsIGNodW5rKSk7CisgICAgICAgIF9fa21wX3N0cl9mcmVlKCZidWZmKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICBpZiAoc2NoZWR1bGUgPT0ga21wX3NjaF9ndWlkZWRfY2h1bmtlZCkgeworICAgICAgICBzY2hlZHVsZSA9IF9fa21wX2d1aWRlZDsKKyAgICAgIH0KKyAgICAgIGlmIChjaHVuayA8PSAwKSB7CisgICAgICAgIGNodW5rID0gS01QX0RFRkFVTFRfQ0hVTks7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHNjaGVkdWxlID09IGttcF9zY2hfYXV0bykgeworICAgICAgLy8gbWFwcGluZyBhbmQgZGlmZmVyZW50aWF0aW9uOiBpbiB0aGUgX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemUoKQorICAgICAgc2NoZWR1bGUgPSBfX2ttcF9hdXRvOworI2lmZGVmIEtNUF9ERUJVRworICAgICAgeworICAgICAgICBjb25zdCBjaGFyICpidWZmOworICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoIl9fa21wX2Rpc3BhdGNoX2luaXQ6IGttcF9zY2hfYXV0bzogVCMlJWQgbmV3OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY2hlZHVsZTolJWQgY2h1bms6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8U1Q+OjpzcGVjKTsKKyAgICAgICAgS0RfVFJBQ0UoMTAsIChidWZmLCBndGlkLCBzY2hlZHVsZSwgY2h1bmspKTsKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoJmJ1ZmYpOworICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgLyogZ3VpZGVkIGFuYWx5dGljYWwgbm90IHNhZmUgZm9yIHRvbyBtYW55IHRocmVhZHMgKi8KKyAgICBpZiAoc2NoZWR1bGUgPT0ga21wX3NjaF9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkICYmCisgICAgICAgIHRoLT50aC50aF90ZWFtX25wcm9jID4gMSA8PCAyMCkgeworICAgICAgc2NoZWR1bGUgPSBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZDsKKyAgICAgIEtNUF9XQVJOSU5HKERpc3BhdGNoTWFueVRocmVhZHMpOworICAgIH0KKyAgICBpZiAoc2NoZWR1bGUgPT0ga21wX3NjaF9ydW50aW1lX3NpbWQpIHsKKyAgICAgIC8vIGNvbXBpbGVyIHByb3ZpZGVzIHNpbWRfd2lkdGggaW4gdGhlIGNodW5rIHBhcmFtZXRlcgorICAgICAgc2NoZWR1bGUgPSB0ZWFtLT50LnRfc2NoZWQucl9zY2hlZF90eXBlOworICAgICAgLy8gRGV0YWlsIHRoZSBzY2hlZHVsZSBpZiBuZWVkZWQgKGdsb2JhbCBjb250cm9scyBhcmUgZGlmZmVyZW50aWF0ZWQKKyAgICAgIC8vIGFwcHJvcHJpYXRlbHkpCisgICAgICBpZiAoc2NoZWR1bGUgPT0ga21wX3NjaF9zdGF0aWMgfHwgc2NoZWR1bGUgPT0ga21wX3NjaF9hdXRvIHx8CisgICAgICAgICAgc2NoZWR1bGUgPT0gX19rbXBfc3RhdGljKSB7CisgICAgICAgIHNjaGVkdWxlID0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWRfY2h1bmtlZDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzY2hlZHVsZSA9PSBrbXBfc2NoX2d1aWRlZF9jaHVua2VkIHx8IHNjaGVkdWxlID09IF9fa21wX2d1aWRlZCkgeworICAgICAgICAgIHNjaGVkdWxlID0ga21wX3NjaF9ndWlkZWRfc2ltZDsKKyAgICAgICAgfQorICAgICAgICBjaHVuayA9IHRlYW0tPnQudF9zY2hlZC5jaHVuayAqIGNodW5rOworICAgICAgfQorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgIGN1cl9jaHVuayA9IGNodW5rOworI2VuZGlmCisjaWZkZWYgS01QX0RFQlVHCisgICAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZmY7CisgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlJWQgbmV3OiBzY2hlZHVsZTolJWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgY2h1bms6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8U1Q+OjpzcGVjKTsKKyAgICAgICAgS0RfVFJBQ0UoMTAsIChidWZmLCBndGlkLCBzY2hlZHVsZSwgY2h1bmspKTsKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoJmJ1ZmYpOworICAgICAgfQorI2VuZGlmCisgICAgfQorICAgIHByLT51LnAucGFybTEgPSBjaHVuazsKKyAgfQorICBLTVBfQVNTRVJUMigoa21wX3NjaF9sb3dlciA8IHNjaGVkdWxlICYmIHNjaGVkdWxlIDwga21wX3NjaF91cHBlciksCisgICAgICAgICAgICAgICJ1bmtub3duIHNjaGVkdWxpbmcgdHlwZSIpOworCisgIHByLT51LnAuY291bnQgPSAwOworCisgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICBpZiAoc3QgPT0gMCkgeworICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0KGttcF9pMThuX21zZ19DbnNMb29wSW5jclplcm9Qcm9oaWJpdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwci0+b3JkZXJlZCA/IGN0X3Bkb19vcmRlcmVkIDogY3RfcGRvKSwgbG9jKTsKKyAgICB9CisgIH0KKyAgLy8gY29tcHV0ZSB0cmlwIGNvdW50CisgIGlmIChzdCA9PSAxKSB7IC8vIG1vc3QgY29tbW9uIGNhc2UKKyAgICBpZiAodWIgPj0gbGIpIHsKKyAgICAgIHRjID0gdWIgLSBsYiArIDE7CisgICAgfSBlbHNlIHsgLy8gdWIgPCBsYgorICAgICAgdGMgPSAwOyAvLyB6ZXJvLXRyaXAKKyAgICB9CisgIH0gZWxzZSBpZiAoc3QgPCAwKSB7CisgICAgaWYgKGxiID49IHViKSB7CisgICAgICAvLyBBQzogY2FzdCB0byB1bnNpZ25lZCBpcyBuZWVkZWQgZm9yIGxvb3BzIGxpa2UgKGk9MkI7IGk+LTJCOyBpLT0xQiksCisgICAgICAvLyB3aGVyZSB0aGUgZGl2aXNpb24gbmVlZHMgdG8gYmUgdW5zaWduZWQgcmVnYXJkbGVzcyBvZiB0aGUgcmVzdWx0IHR5cGUKKyAgICAgIHRjID0gKFVUKShsYiAtIHViKSAvICgtc3QpICsgMTsKKyAgICB9IGVsc2UgeyAvLyBsYiA8IHViCisgICAgICB0YyA9IDA7IC8vIHplcm8tdHJpcAorICAgIH0KKyAgfSBlbHNlIHsgLy8gc3QgPiAwCisgICAgaWYgKHViID49IGxiKSB7CisgICAgICAvLyBBQzogY2FzdCB0byB1bnNpZ25lZCBpcyBuZWVkZWQgZm9yIGxvb3BzIGxpa2UgKGk9LTJCOyBpPDJCOyBpKz0xQiksCisgICAgICAvLyB3aGVyZSB0aGUgZGl2aXNpb24gbmVlZHMgdG8gYmUgdW5zaWduZWQgcmVnYXJkbGVzcyBvZiB0aGUgcmVzdWx0IHR5cGUKKyAgICAgIHRjID0gKFVUKSh1YiAtIGxiKSAvIHN0ICsgMTsKKyAgICB9IGVsc2UgeyAvLyB1YiA8IGxiCisgICAgICB0YyA9IDA7IC8vIHplcm8tdHJpcAorICAgIH0KKyAgfQorCisgIC8vIEFueSBoYWxmLWRlY2VudCBvcHRpbWl6ZXIgd2lsbCByZW1vdmUgdGhpcyB0ZXN0IHdoZW4gdGhlIGJsb2NrcyBhcmUgZW1wdHkKKyAgLy8gc2luY2UgdGhlIG1hY3JvcyBleHBhbmQgdG8gbm90aGluZyB3aGVuIHN0YXRpc3RpY3MgYXJlIGRpc2FibGVkLgorICBpZiAoc2NoZWR1bGUgPT0gX19rbXBfc3RhdGljKSB7CisgICAgS01QX0NPVU5UX0JMT0NLKE9NUF9GT1Jfc3RhdGljKTsKKyAgICBLTVBfQ09VTlRfVkFMVUUoRk9SX3N0YXRpY19pdGVyYXRpb25zLCB0Yyk7CisgIH0gZWxzZSB7CisgICAgS01QX0NPVU5UX0JMT0NLKE9NUF9GT1JfZHluYW1pYyk7CisgICAgS01QX0NPVU5UX1ZBTFVFKEZPUl9keW5hbWljX2l0ZXJhdGlvbnMsIHRjKTsKKyAgfQorCisgIHByLT51LnAubGIgPSBsYjsKKyAgcHItPnUucC51YiA9IHViOworICBwci0+dS5wLnN0ID0gc3Q7CisgIHByLT51LnAudGMgPSB0YzsKKworI2lmIEtNUF9PU19XSU5ET1dTCisgIHByLT51LnAubGFzdF91cHBlciA9IHViICsgc3Q7CisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKworICAvKiBOT1RFOiBvbmx5IHRoZSBhY3RpdmUgcGFyYWxsZWwgcmVnaW9uKHMpIGhhcyBhY3RpdmUgb3JkZXJlZCBzZWN0aW9ucyAqLworCisgIGlmIChhY3RpdmUpIHsKKyAgICBpZiAocHItPm9yZGVyZWQgPT0gMCkgeworICAgICAgdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kZW9fZmNuID0gX19rbXBfZGlzcGF0Y2hfZGVvX2Vycm9yOworICAgICAgdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9keG9fZmNuID0gX19rbXBfZGlzcGF0Y2hfZHhvX2Vycm9yOworICAgIH0gZWxzZSB7CisgICAgICBwci0+b3JkZXJlZF9idW1wZWQgPSAwOworCisgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSAxOworICAgICAgcHItPnUucC5vcmRlcmVkX3VwcGVyID0gMDsKKworICAgICAgdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kZW9fZmNuID0gX19rbXBfZGlzcGF0Y2hfZGVvPFVUPjsKKyAgICAgIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZHhvX2ZjbiA9IF9fa21wX2Rpc3BhdGNoX2R4bzxVVD47CisgICAgfQorICB9CisKKyAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgIGVudW0gY29uc190eXBlIHdzID0gcHItPm9yZGVyZWQgPyBjdF9wZG9fb3JkZXJlZCA6IGN0X3BkbzsKKyAgICBpZiAocHVzaF93cykgeworICAgICAgX19rbXBfcHVzaF93b3Jrc2hhcmUoZ3RpZCwgd3MsIGxvYyk7CisgICAgICBwci0+cHVzaGVkX3dzID0gd3M7CisgICAgfSBlbHNlIHsKKyAgICAgIF9fa21wX2NoZWNrX3dvcmtzaGFyZShndGlkLCB3cywgbG9jKTsKKyAgICAgIHByLT5wdXNoZWRfd3MgPSBjdF9ub25lOworICAgIH0KKyAgfQorCisgIHN3aXRjaCAoc2NoZWR1bGUpIHsKKyNpZiAoS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEKQorICBjYXNlIGttcF9zY2hfc3RhdGljX3N0ZWFsOiB7CisgICAgVCBucHJvYyA9IHRoLT50aC50aF90ZWFtX25wcm9jOworICAgIFQgbnRjLCBpbml0OworCisgICAgS0RfVFJBQ0UoMTAwLAorICAgICAgICAgICAgICgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBrbXBfc2NoX3N0YXRpY19zdGVhbCBjYXNlXG4iLCBndGlkKSk7CisKKyAgICBudGMgPSAodGMgJSBjaHVuayA/IDEgOiAwKSArIHRjIC8gY2h1bms7CisgICAgaWYgKG5wcm9jID4gMSAmJiBudGMgPj0gbnByb2MpIHsKKyAgICAgIEtNUF9DT1VOVF9CTE9DSyhPTVBfRk9SX3N0YXRpY19zdGVhbCk7CisgICAgICBUIGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKyAgICAgIFQgc21hbGxfY2h1bmssIGV4dHJhczsKKworICAgICAgc21hbGxfY2h1bmsgPSBudGMgLyBucHJvYzsKKyAgICAgIGV4dHJhcyA9IG50YyAlIG5wcm9jOworCisgICAgICBpbml0ID0gaWQgKiBzbWFsbF9jaHVuayArIChpZCA8IGV4dHJhcyA/IGlkIDogZXh0cmFzKTsKKyAgICAgIHByLT51LnAuY291bnQgPSBpbml0OworICAgICAgcHItPnUucC51YiA9IGluaXQgKyBzbWFsbF9jaHVuayArIChpZCA8IGV4dHJhcyA/IDEgOiAwKTsKKworICAgICAgcHItPnUucC5wYXJtMiA9IGxiOworICAgICAgLy8gcHItPnBmaWVsZHMucGFybTMgPSAwOyAvLyBpdCdzIG5vdCB1c2VkIGluIHN0YXRpY19zdGVhbAorICAgICAgcHItPnUucC5wYXJtNCA9IChpZCArIDEpICUgbnByb2M7IC8vIHJlbWVtYmVyIG5laWdoYm91ciB0aWQKKyAgICAgIHByLT51LnAuc3QgPSBzdDsKKyAgICAgIGlmICh0cmFpdHNfdDxUPjo6dHlwZV9zaXplID4gNCkgeworICAgICAgICAvLyBBQzogVE9ETzogY2hlY2sgaWYgMTYtYnl0ZSBDQVMgYXZhaWxhYmxlIGFuZCB1c2UgaXQgdG8KKyAgICAgICAgLy8gaW1wcm92ZSBwZXJmb3JtYW5jZSAocHJvYmFibHkgd2FpdCBmb3IgZXhwbGljaXQgcmVxdWVzdAorICAgICAgICAvLyBiZWZvcmUgc3BlbmRpbmcgdGltZSBvbiB0aGlzKS4KKyAgICAgICAgLy8gRm9yIG5vdyB1c2UgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHBlci10aHJlYWQgbG9jaywKKyAgICAgICAgLy8gZnJlZSBtZW1vcnkgaW4gX19rbXBfZGlzcGF0Y2hfbmV4dCB3aGVuIHN0YXR1cz09MC4KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX3N0ZWFsX2xvY2sgPT0gTlVMTCk7CisgICAgICAgIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfc3RlYWxfbG9jayA9CisgICAgICAgICAgICAoa21wX2xvY2tfdCAqKV9fa21wX2FsbG9jYXRlKHNpemVvZihrbXBfbG9ja190KSk7CisgICAgICAgIF9fa21wX2luaXRfbG9jayh0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX3N0ZWFsX2xvY2spOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGZhbGxpbmctdGhyb3VnaCB0byAiCisgICAgICAgICAgICAgICAgICAgICAia21wX3NjaF9zdGF0aWNfYmFsYW5jZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICBndGlkKSk7CisgICAgICBzY2hlZHVsZSA9IGttcF9zY2hfc3RhdGljX2JhbGFuY2VkOworICAgICAgLyogdG9vIGZldyBpdGVyYXRpb25zOiBmYWxsLXRocm91Z2ggdG8ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQgKi8KKyAgICB9IC8vIGlmCisgICAgLyogRkFMTC1USFJPVUdIIHRvIHN0YXRpYyBiYWxhbmNlZCAqLworICB9IC8vIGNhc2UKKyNlbmRpZgorICBjYXNlIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkOiB7CisgICAgVCBucHJvYyA9IHRoLT50aC50aF90ZWFtX25wcm9jOworICAgIFQgaW5pdCwgbGltaXQ7CisKKyAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZCBjYXNlXG4iLAorICAgICAgICAgICAgICAgICAgIGd0aWQpKTsKKworICAgIGlmIChucHJvYyA+IDEpIHsKKyAgICAgIFQgaWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworCisgICAgICBpZiAodGMgPCBucHJvYykgeworICAgICAgICBpZiAoaWQgPCB0YykgeworICAgICAgICAgIGluaXQgPSBpZDsKKyAgICAgICAgICBsaW1pdCA9IGlkOworICAgICAgICAgIHByLT51LnAucGFybTEgPSAoaWQgPT0gdGMgLSAxKTsgLyogcGFybTEgc3RvcmVzICpwbGFzdGl0ZXIgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwci0+dS5wLmNvdW50ID0gMTsgLyogbWVhbnMgbm8gbW9yZSBjaHVua3MgdG8gZXhlY3V0ZSAqLworICAgICAgICAgIHByLT51LnAucGFybTEgPSBGQUxTRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgVCBzbWFsbF9jaHVuayA9IHRjIC8gbnByb2M7CisgICAgICAgIFQgZXh0cmFzID0gdGMgJSBucHJvYzsKKyAgICAgICAgaW5pdCA9IGlkICogc21hbGxfY2h1bmsgKyAoaWQgPCBleHRyYXMgPyBpZCA6IGV4dHJhcyk7CisgICAgICAgIGxpbWl0ID0gaW5pdCArIHNtYWxsX2NodW5rIC0gKGlkIDwgZXh0cmFzID8gMCA6IDEpOworICAgICAgICBwci0+dS5wLnBhcm0xID0gKGlkID09IG5wcm9jIC0gMSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICh0YyA+IDApIHsKKyAgICAgICAgaW5pdCA9IDA7CisgICAgICAgIGxpbWl0ID0gdGMgLSAxOworICAgICAgICBwci0+dS5wLnBhcm0xID0gVFJVRTsKKyAgICAgIH0gZWxzZSB7IC8vIHplcm8gdHJpcCBjb3VudAorICAgICAgICBwci0+dS5wLmNvdW50ID0gMTsgLyogbWVhbnMgbm8gbW9yZSBjaHVua3MgdG8gZXhlY3V0ZSAqLworICAgICAgICBwci0+dS5wLnBhcm0xID0gRkFMU0U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgLy8gQ2FsY3VsYXRlIGNodW5rIGZvciBtZXRhZGF0YSByZXBvcnQKKyAgICBpZiAoaXR0X25lZWRfbWV0YWRhdGFfcmVwb3J0aW5nKQorICAgICAgY3VyX2NodW5rID0gbGltaXQgLSBpbml0ICsgMTsKKyNlbmRpZgorICAgIGlmIChzdCA9PSAxKSB7CisgICAgICBwci0+dS5wLmxiID0gbGIgKyBpbml0OworICAgICAgcHItPnUucC51YiA9IGxiICsgbGltaXQ7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGNhbGN1bGF0ZWQgdXBwZXIgYm91bmQsICJ1YiIgaXMgdXNlci1kZWZpbmVkIHVwcGVyIGJvdW5kCisgICAgICBUIHViX3RtcCA9IGxiICsgbGltaXQgKiBzdDsKKyAgICAgIHByLT51LnAubGIgPSBsYiArIGluaXQgKiBzdDsKKyAgICAgIC8vIGFkanVzdCB1cHBlciBib3VuZCB0byAidWIiIGlmIG5lZWRlZCwgc28gdGhhdCBNUyBsYXN0cHJpdmF0ZSB3aWxsIG1hdGNoCisgICAgICAvLyBpdCBleGFjdGx5CisgICAgICBpZiAoc3QgPiAwKSB7CisgICAgICAgIHByLT51LnAudWIgPSAodWJfdG1wICsgc3QgPiB1YiA/IHViIDogdWJfdG1wKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByLT51LnAudWIgPSAodWJfdG1wICsgc3QgPCB1YiA/IHViIDogdWJfdG1wKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHByLT5vcmRlcmVkKSB7CisgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSBpbml0OworICAgICAgcHItPnUucC5vcmRlcmVkX3VwcGVyID0gbGltaXQ7CisgICAgfQorICAgIGJyZWFrOworICB9IC8vIGNhc2UKKyAgY2FzZSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZF9jaHVua2VkOiB7CisgICAgLy8gc2ltaWxhciB0byBiYWxhbmNlZCwgYnV0IGNodW5rIGFkanVzdGVkIHRvIG11bHRpcGxlIG9mIHNpbWQgd2lkdGgKKyAgICBUIG50aCA9IHRoLT50aC50aF90ZWFtX25wcm9jOworICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIHJ1bnRpbWUoc2ltZDpzdGF0aWMpIgorICAgICAgICAgICAgICAgICAgICIgLT4gZmFsbGluZy10aHJvdWdoIHRvIHN0YXRpY19ncmVlZHlcbiIsCisgICAgICAgICAgICAgICAgICAgZ3RpZCkpOworICAgIHNjaGVkdWxlID0ga21wX3NjaF9zdGF0aWNfZ3JlZWR5OworICAgIGlmIChudGggPiAxKQorICAgICAgcHItPnUucC5wYXJtMSA9ICgodGMgKyBudGggLSAxKSAvIG50aCArIGNodW5rIC0gMSkgJiB+KGNodW5rIC0gMSk7CisgICAgZWxzZQorICAgICAgcHItPnUucC5wYXJtMSA9IHRjOworICAgIGJyZWFrOworICB9IC8vIGNhc2UKKyAgY2FzZSBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZDoKKyAgY2FzZSBrbXBfc2NoX2d1aWRlZF9zaW1kOiB7CisgICAgVCBucHJvYyA9IHRoLT50aC50aF90ZWFtX25wcm9jOworICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkIgorICAgICAgICAgICAgICAgICAgICIgY2FzZVxuIiwKKyAgICAgICAgICAgICAgICAgICBndGlkKSk7CisKKyAgICBpZiAobnByb2MgPiAxKSB7CisgICAgICBpZiAoKDJMICogY2h1bmsgKyAxKSAqIG5wcm9jID49IHRjKSB7CisgICAgICAgIC8qIGNodW5rIHNpemUgdG9vIGxhcmdlLCBzd2l0Y2ggdG8gZHluYW1pYyAqLworICAgICAgICBzY2hlZHVsZSA9IGttcF9zY2hfZHluYW1pY19jaHVua2VkOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gd2hlbiByZW1haW5pbmcgaXRlcnMgYmVjb21lIGxlc3MgdGhhbiBwYXJtMiAtIHN3aXRjaCB0byBkeW5hbWljCisgICAgICAgIHByLT51LnAucGFybTIgPSBndWlkZWRfaW50X3BhcmFtICogbnByb2MgKiAoY2h1bmsgKyAxKTsKKyAgICAgICAgKihkb3VibGUgKikmcHItPnUucC5wYXJtMyA9CisgICAgICAgICAgICBndWlkZWRfZmx0X3BhcmFtIC8gbnByb2M7IC8vIG1heSBvY2N1cHkgcGFybTMgYW5kIHBhcm00CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGZhbGxpbmctdGhyb3VnaCB0byAiCisgICAgICAgICAgICAgICAgICAgICAia21wX3NjaF9zdGF0aWNfZ3JlZWR5XG4iLAorICAgICAgICAgICAgICAgICAgICAgZ3RpZCkpOworICAgICAgc2NoZWR1bGUgPSBrbXBfc2NoX3N0YXRpY19ncmVlZHk7CisgICAgICAvKiB0ZWFtLT50LnRfbnByb2MgPT0gMTogZmFsbC10aHJvdWdoIHRvIGttcF9zY2hfc3RhdGljX2dyZWVkeSAqLworICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJWQga21wX3NjaF9zdGF0aWNfZ3JlZWR5IGNhc2VcbiIsCisgICAgICAgICAgICAgICAgICAgICBndGlkKSk7CisgICAgICBwci0+dS5wLnBhcm0xID0gdGM7CisgICAgfSAvLyBpZgorICB9IC8vIGNhc2UKKyAgYnJlYWs7CisgIGNhc2Uga21wX3NjaF9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkOiB7CisgICAgVCBucHJvYyA9IHRoLT50aC50aF90ZWFtX25wcm9jOworICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZCIKKyAgICAgICAgICAgICAgICAgICAiIGNhc2VcbiIsCisgICAgICAgICAgICAgICAgICAgZ3RpZCkpOworICAgIGlmIChucHJvYyA+IDEpIHsKKyAgICAgIGlmICgoMkwgKiBjaHVuayArIDEpICogbnByb2MgPj0gdGMpIHsKKyAgICAgICAgLyogY2h1bmsgc2l6ZSB0b28gbGFyZ2UsIHN3aXRjaCB0byBkeW5hbWljICovCisgICAgICAgIHNjaGVkdWxlID0ga21wX3NjaF9keW5hbWljX2NodW5rZWQ7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBjb21tb25seSB1c2VkIHRlcm06ICgyIG5wcm9jIC0gMSkvKDIgbnByb2MpICovCisgICAgICAgIERCTCB4OworCisjaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2CisgICAgICAgIC8qIExpbnV4KiBPUyBhbHJlYWR5IGhhcyA2NC1iaXQgY29tcHV0YXRpb24gYnkgZGVmYXVsdCBmb3IgbG9uZyBkb3VibGUsCisgICAgICAgICAgIGFuZCBvbiBXaW5kb3dzKiBPUyBvbiBJbnRlbChSKSA2NCwgL1Fsb25nX2RvdWJsZSBkb2Vzbid0IHdvcmsuIE9uCisgICAgICAgICAgIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZSwgd2UgbmVlZCB0byBzZXQgcHJlY2lzaW9uIHRvIDY0LWJpdAorICAgICAgICAgICBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IDUzLWJpdC4gRXZlbiB0aG91Z2ggbG9uZyBkb3VibGUgZG9lc24ndCB3b3JrCisgICAgICAgICAgIG9uIFdpbmRvd3MqIE9TIG9uIEludGVsKFIpIDY0LCB0aGUgcmVzdWx0aW5nIGxhY2sgb2YgcHJlY2lzaW9uIGlzIG5vdAorICAgICAgICAgICBleHBlY3RlZCB0byBpbXBhY3QgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBhbGdvcml0aG0sIGJ1dCB0aGlzIGhhcyBub3QKKyAgICAgICAgICAgYmVlbiBtYXRoZW1hdGljYWxseSBwcm92ZW4uICovCisgICAgICAgIC8vIHNhdmUgb3JpZ2luYWwgRlBDVyBhbmQgc2V0IHByZWNpc2lvbiB0byA2NC1iaXQsIGFzCisgICAgICAgIC8vIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBkZWZhdWx0cyB0byA1My1iaXQKKyAgICAgICAgdW5zaWduZWQgaW50IG9sZEZwY3cgPSBfY29udHJvbDg3KDAsIDApOworICAgICAgICBfY29udHJvbDg3KF9QQ182NCwgX01DV19QQyk7IC8vIDAsMHgzMDAwMAorI2VuZGlmCisgICAgICAgIC8qIHZhbHVlIHVzZWQgZm9yIGNvbXBhcmlzb24gaW4gc29sdmVyIGZvciBjcm9zcy1vdmVyIHBvaW50ICovCisgICAgICAgIGxvbmcgZG91YmxlIHRhcmdldCA9ICgobG9uZyBkb3VibGUpY2h1bmsgKiAyICsgMSkgKiBucHJvYyAvIHRjOworCisgICAgICAgIC8qIGNyb3Nzb3ZlciBwb2ludC0tY2h1bmsgaW5kZXhlcyBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4KKyAgICAgICAgICAgdGhpcyBwb2ludCBzd2l0Y2ggdG8gZHluYW1pYy1zdHlsZSBzY2hlZHVsaW5nICovCisgICAgICAgIFVUIGNyb3NzOworCisgICAgICAgIC8qIGNvbW1vbmx5IHVzZWQgdGVybTogKDIgbnByb2MgLSAxKS8oMiBucHJvYykgKi8KKyAgICAgICAgeCA9IChsb25nIGRvdWJsZSkxLjAgLSAobG9uZyBkb3VibGUpMC41IC8gbnByb2M7CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgeyAvLyB0ZXN0IG5hdHVyYWwgYWxpZ25tZW50CisgICAgICAgICAgc3RydWN0IF90ZXN0X2EgeworICAgICAgICAgICAgY2hhciBhOworICAgICAgICAgICAgdW5pb24geworICAgICAgICAgICAgICBjaGFyIGI7CisgICAgICAgICAgICAgIERCTCBkOworICAgICAgICAgICAgfTsKKyAgICAgICAgICB9IHQ7CisgICAgICAgICAgcHRyZGlmZl90IG5hdHVyYWxfYWxpZ25tZW50ID0KKyAgICAgICAgICAgICAgKHB0cmRpZmZfdCkmdC5iIC0gKHB0cmRpZmZfdCkmdCAtIChwdHJkaWZmX3QpMTsKKyAgICAgICAgICAvL19fa21wX3dhcm4oICIgJWxseCAlbGx4ICVsbGQiLCAobG9uZyBsb25nKSZ0LmQsIChsb25nIGxvbmcpJnQsIChsb25nCisgICAgICAgICAgLy8gbG9uZyluYXR1cmFsX2FsaWdubWVudCApOworICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoCisgICAgICAgICAgICAgICgoKHB0cmRpZmZfdCkmcHItPnUucC5wYXJtMykgJiAobmF0dXJhbF9hbGlnbm1lbnQpKSA9PSAwKTsKKyAgICAgICAgfQorI2VuZGlmIC8vIEtNUF9ERUJVRworCisgICAgICAgIC8qIHNhdmUgdGhlIHRlcm0gaW4gdGhyZWFkIHByaXZhdGUgZGlzcGF0Y2ggc3RydWN0dXJlICovCisgICAgICAgICooREJMICopJnByLT51LnAucGFybTMgPSB4OworCisgICAgICAgIC8qIHNvbHZlIGZvciB0aGUgY3Jvc3NvdmVyIHBvaW50IHRvIHRoZSBuZWFyZXN0IGludGVnZXIgaSBmb3Igd2hpY2ggQ19pCisgICAgICAgICAgIDw9IGNodW5rICovCisgICAgICAgIHsKKyAgICAgICAgICBVVCBsZWZ0LCByaWdodCwgbWlkOworICAgICAgICAgIGxvbmcgZG91YmxlIHA7CisKKyAgICAgICAgICAvKiBlc3RpbWF0ZSBpbml0aWFsIHVwcGVyIGFuZCBsb3dlciBib3VuZCAqLworCisgICAgICAgICAgLyogZG9lc24ndCBtYXR0ZXIgd2hhdCB2YWx1ZSByaWdodCBpcyBhcyBsb25nIGFzIGl0IGlzIHBvc2l0aXZlLCBidXQKKyAgICAgICAgICAgICBpdCBhZmZlY3RzIHBlcmZvcm1hbmNlIG9mIHRoZSBzb2x2ZXIgKi8KKyAgICAgICAgICByaWdodCA9IDIyOTsKKyAgICAgICAgICBwID0gX19rbXBfcG93PFVUPih4LCByaWdodCk7CisgICAgICAgICAgaWYgKHAgPiB0YXJnZXQpIHsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgcCAqPSBwOworICAgICAgICAgICAgICByaWdodCA8PD0gMTsKKyAgICAgICAgICAgIH0gd2hpbGUgKHAgPiB0YXJnZXQgJiYgcmlnaHQgPCAoMSA8PCAyNykpOworICAgICAgICAgICAgLyogbG93ZXIgYm91bmQgaXMgcHJldmlvdXMgKGZhaWxlZCkgZXN0aW1hdGUgb2YgdXBwZXIgYm91bmQgKi8KKyAgICAgICAgICAgIGxlZnQgPSByaWdodCA+PiAxOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZWZ0ID0gMDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBiaXNlY3Rpb24gcm9vdC1maW5kaW5nIG1ldGhvZCAqLworICAgICAgICAgIHdoaWxlIChsZWZ0ICsgMSA8IHJpZ2h0KSB7CisgICAgICAgICAgICBtaWQgPSAobGVmdCArIHJpZ2h0KSAvIDI7CisgICAgICAgICAgICBpZiAoX19rbXBfcG93PFVUPih4LCBtaWQpID4gdGFyZ2V0KSB7CisgICAgICAgICAgICAgIGxlZnQgPSBtaWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICByaWdodCA9IG1pZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IC8vIHdoaWxlCisgICAgICAgICAgY3Jvc3MgPSByaWdodDsKKyAgICAgICAgfQorICAgICAgICAvKiBhc3NlcnQgc2FuaXR5IG9mIGNvbXB1dGVkIGNyb3Nzb3ZlciBwb2ludCAqLworICAgICAgICBLTVBfQVNTRVJUKGNyb3NzICYmIF9fa21wX3BvdzxVVD4oeCwgY3Jvc3MgLSAxKSA+IHRhcmdldCAmJgorICAgICAgICAgICAgICAgICAgIF9fa21wX3BvdzxVVD4oeCwgY3Jvc3MpIDw9IHRhcmdldCk7CisKKyAgICAgICAgLyogc2F2ZSB0aGUgY3Jvc3NvdmVyIHBvaW50IGluIHRocmVhZCBwcml2YXRlIGRpc3BhdGNoIHN0cnVjdHVyZSAqLworICAgICAgICBwci0+dS5wLnBhcm0yID0gY3Jvc3M7CisKKy8vIEM3NTgwMworI2lmICgoS01QX09TX0xJTlVYIHx8IEtNUF9PU19XSU5ET1dTKSAmJiBLTVBfQVJDSF9YODYpICYmICghZGVmaW5lZChLTVBfSTgpKQorI2RlZmluZSBHVUlERURfQU5BTFlUSUNBTF9XT1JLQVJPVU5EICgqKERCTCAqKSZwci0+dS5wLnBhcm0zKQorI2Vsc2UKKyNkZWZpbmUgR1VJREVEX0FOQUxZVElDQUxfV09SS0FST1VORCAoeCkKKyNlbmRpZgorICAgICAgICAvKiBkeW5hbWljLXN0eWxlIHNjaGVkdWxpbmcgb2Zmc2V0ICovCisgICAgICAgIHByLT51LnAuY291bnQgPSB0YyAtIF9fa21wX2Rpc3BhdGNoX2d1aWRlZF9yZW1haW5pbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YywgR1VJREVEX0FOQUxZVElDQUxfV09SS0FST1VORCwgY3Jvc3MpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNyb3NzICogY2h1bms7CisjaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2CisgICAgICAgIC8vIHJlc3RvcmUgRlBDVworICAgICAgICBfY29udHJvbDg3KG9sZEZwY3csIF9NQ1dfUEMpOworI2VuZGlmCisgICAgICB9IC8vIGlmCisgICAgfSBlbHNlIHsKKyAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGZhbGxpbmctdGhyb3VnaCB0byAiCisgICAgICAgICAgICAgICAgICAgICAia21wX3NjaF9zdGF0aWNfZ3JlZWR5XG4iLAorICAgICAgICAgICAgICAgICAgICAgZ3RpZCkpOworICAgICAgc2NoZWR1bGUgPSBrbXBfc2NoX3N0YXRpY19ncmVlZHk7CisgICAgICAvKiB0ZWFtLT50LnRfbnByb2MgPT0gMTogZmFsbC10aHJvdWdoIHRvIGttcF9zY2hfc3RhdGljX2dyZWVkeSAqLworICAgICAgcHItPnUucC5wYXJtMSA9IHRjOworICAgIH0gLy8gaWYKKyAgfSAvLyBjYXNlCisgIGJyZWFrOworICBjYXNlIGttcF9zY2hfc3RhdGljX2dyZWVkeToKKyAgICBLRF9UUkFDRSgxMDAsCisgICAgICAgICAgICAgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGttcF9zY2hfc3RhdGljX2dyZWVkeSBjYXNlXG4iLCBndGlkKSk7CisgICAgcHItPnUucC5wYXJtMSA9ICh0aC0+dGgudGhfdGVhbV9ucHJvYyA+IDEpCisgICAgICAgICAgICAgICAgICAgICAgICA/ICh0YyArIHRoLT50aC50aF90ZWFtX25wcm9jIC0gMSkgLyB0aC0+dGgudGhfdGVhbV9ucHJvYworICAgICAgICAgICAgICAgICAgICAgICAgOiB0YzsKKyAgICBicmVhazsKKyAgY2FzZSBrbXBfc2NoX3N0YXRpY19jaHVua2VkOgorICBjYXNlIGttcF9zY2hfZHluYW1pY19jaHVua2VkOgorICAgIGlmIChwci0+dS5wLnBhcm0xIDw9IDApIHsKKyAgICAgIHByLT51LnAucGFybTEgPSBLTVBfREVGQVVMVF9DSFVOSzsKKyAgICB9CisgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJWQgIgorICAgICAgICAgICAgICAgICAgICJrbXBfc2NoX3N0YXRpY19jaHVua2VkL2ttcF9zY2hfZHluYW1pY19jaHVua2VkIGNhc2VzXG4iLAorICAgICAgICAgICAgICAgICAgIGd0aWQpKTsKKyAgICBicmVhazsKKyAgY2FzZSBrbXBfc2NoX3RyYXBlem9pZGFsOiB7CisgICAgLyogVFNTOiB0cmFwZXpvaWQgc2VsZi1zY2hlZHVsaW5nLCBtaW5pbXVtIGNodW5rX3NpemUgPSBwYXJtMSAqLworCisgICAgVCBwYXJtMSwgcGFybTIsIHBhcm0zLCBwYXJtNDsKKyAgICBLRF9UUkFDRSgxMDAsCisgICAgICAgICAgICAgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGttcF9zY2hfdHJhcGV6b2lkYWwgY2FzZVxuIiwgZ3RpZCkpOworCisgICAgcGFybTEgPSBjaHVuazsKKworICAgIC8qIEYgOiBzaXplIG9mIHRoZSBmaXJzdCBjeWNsZSAqLworICAgIHBhcm0yID0gKHRjIC8gKDIgKiB0aC0+dGgudGhfdGVhbV9ucHJvYykpOworCisgICAgaWYgKHBhcm0yIDwgMSkgeworICAgICAgcGFybTIgPSAxOworICAgIH0KKworICAgIC8qIEwgOiBzaXplIG9mIHRoZSBsYXN0IGN5Y2xlLiAgTWFrZSBzdXJlIHRoZSBsYXN0IGN5Y2xlIGlzIG5vdCBsYXJnZXIKKyAgICAgICB0aGFuIHRoZSBmaXJzdCBjeWNsZS4gKi8KKyAgICBpZiAocGFybTEgPCAxKSB7CisgICAgICBwYXJtMSA9IDE7CisgICAgfSBlbHNlIGlmIChwYXJtMSA+IHBhcm0yKSB7CisgICAgICBwYXJtMSA9IHBhcm0yOworICAgIH0KKworICAgIC8qIE4gOiBudW1iZXIgb2YgY3ljbGVzICovCisgICAgcGFybTMgPSAocGFybTIgKyBwYXJtMSk7CisgICAgcGFybTMgPSAoMiAqIHRjICsgcGFybTMgLSAxKSAvIHBhcm0zOworCisgICAgaWYgKHBhcm0zIDwgMikgeworICAgICAgcGFybTMgPSAyOworICAgIH0KKworICAgIC8qIHNpZ21hIDogZGVjcmVhc2luZyBpbmNyIG9mIHRoZSB0cmFwZXpvaWQgKi8KKyAgICBwYXJtNCA9IChwYXJtMyAtIDEpOworICAgIHBhcm00ID0gKHBhcm0yIC0gcGFybTEpIC8gcGFybTQ7CisKKyAgICAvLyBwb2ludGxlc3MgY2hlY2ssIGJlY2F1c2UgcGFybTQgPj0gMCBhbHdheXMKKyAgICAvLyBpZiAoIHBhcm00IDwgMCApIHsKKyAgICAvLyAgICBwYXJtNCA9IDA7CisgICAgLy99CisKKyAgICBwci0+dS5wLnBhcm0xID0gcGFybTE7CisgICAgcHItPnUucC5wYXJtMiA9IHBhcm0yOworICAgIHByLT51LnAucGFybTMgPSBwYXJtMzsKKyAgICBwci0+dS5wLnBhcm00ID0gcGFybTQ7CisgIH0gLy8gY2FzZQorICBicmVhazsKKworICBkZWZhdWx0OiB7CisgICAgX19rbXBfbXNnKGttcF9tc19mYXRhbCwgLy8gU2V2ZXJpdHkKKyAgICAgICAgICAgICAgS01QX01TRyhVbmtub3duU2NoZWRUeXBlRGV0ZWN0ZWQpLCAvLyBQcmltYXJ5IG1lc3NhZ2UKKyAgICAgICAgICAgICAgS01QX0hOVChHZXROZXdlckxpYnJhcnkpLCAvLyBIaW50CisgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsIC8vIFZhcmlhZGljIGFyZ3VtZW50IGxpc3QgdGVybWluYXRvcgorICAgICAgICAgICAgICApOworICB9IGJyZWFrOworICB9IC8vIHN3aXRjaAorICBwci0+c2NoZWR1bGUgPSBzY2hlZHVsZTsKKyAgaWYgKGFjdGl2ZSkgeworICAgIC8qIFRoZSBuYW1lIG9mIHRoaXMgYnVmZmVyIHNob3VsZCBiZSBteV9idWZmZXJfaW5kZXggd2hlbiBpdCdzIGZyZWUgdG8gdXNlCisgICAgICogaXQgKi8KKworICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGJlZm9yZSB3YWl0OiBteV9idWZmZXJfaW5kZXg6JWQgIgorICAgICAgICAgICAgICAgICAgICJzaC0+YnVmZmVyX2luZGV4OiVkXG4iLAorICAgICAgICAgICAgICAgICAgIGd0aWQsIG15X2J1ZmZlcl9pbmRleCwgc2gtPmJ1ZmZlcl9pbmRleCkpOworICAgIF9fa21wX3dhaXRfeWllbGQ8a21wX3VpbnQzMj4oJnNoLT5idWZmZXJfaW5kZXgsIG15X2J1ZmZlcl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2VxPGttcF91aW50MzI+IFVTRV9JVFRfQlVJTERfQVJHKE5VTEwpKTsKKyAgICAvLyBOb3RlOiBLTVBfV0FJVF9ZSUVMRCgpIGNhbm5vdCBiZSB1c2VkIHRoZXJlOiBidWZmZXIgaW5kZXggYW5kCisgICAgLy8gbXlfYnVmZmVyX2luZGV4IGFyZSAqYWx3YXlzKiAzMi1iaXQgaW50ZWdlcnMuCisgICAgS01QX01CKCk7IC8qIGlzIHRoaXMgbmVjZXNzYXJ5PyAqLworICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGFmdGVyIHdhaXQ6IG15X2J1ZmZlcl9pbmRleDolZCAiCisgICAgICAgICAgICAgICAgICAgInNoLT5idWZmZXJfaW5kZXg6JWRcbiIsCisgICAgICAgICAgICAgICAgICAgZ3RpZCwgbXlfYnVmZmVyX2luZGV4LCBzaC0+YnVmZmVyX2luZGV4KSk7CisKKyAgICB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQgPSAoZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgKilwcjsKKyAgICB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQgPQorICAgICAgICBDQ0FTVChkaXNwYXRjaF9zaGFyZWRfaW5mb190ICosICh2b2xhdGlsZSBkaXNwYXRjaF9zaGFyZWRfaW5mb190ICopc2gpOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBpZiAocHItPm9yZGVyZWQpIHsKKyAgICAgIF9fa21wX2l0dF9vcmRlcmVkX2luaXQoZ3RpZCk7CisgICAgfTsgLy8gaWYKKyAgICAvLyBSZXBvcnQgbG9vcCBtZXRhZGF0YQorICAgIGlmIChpdHRfbmVlZF9tZXRhZGF0YV9yZXBvcnRpbmcpIHsKKyAgICAgIC8vIE9ubHkgcmVwb3J0IG1ldGFkYXRhIGJ5IG1hc3RlciBvZiBhY3RpdmUgdGVhbSBhdCBsZXZlbCAxCisgICAgICBrbXBfdWludDY0IHNjaGVkdHlwZSA9IDA7CisgICAgICBzd2l0Y2ggKHNjaGVkdWxlKSB7CisgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2NodW5rZWQ6CisgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkOiAvLyBDaHVuayBpcyBjYWxjdWxhdGVkIGluIHRoZSBzd2l0Y2ggYWJvdmUKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2dyZWVkeToKKyAgICAgICAgY3VyX2NodW5rID0gcHItPnUucC5wYXJtMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGttcF9zY2hfZHluYW1pY19jaHVua2VkOgorICAgICAgICBzY2hlZHR5cGUgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQ6CisgICAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZDoKKyAgICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfc2ltZDoKKyAgICAgICAgc2NoZWR0eXBlID0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAvLyBTaG91bGQgd2UgcHV0IHRoaXMgY2FzZSB1bmRlciAic3RhdGljIj8KKyAgICAgICAgLy8gY2FzZSBrbXBfc2NoX3N0YXRpY19zdGVhbDoKKyAgICAgICAgc2NoZWR0eXBlID0gMzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBfX2ttcF9pdHRfbWV0YWRhdGFfbG9vcChsb2MsIHNjaGVkdHlwZSwgdGMsIGN1cl9jaHVuayk7CisgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgfTsgLy8gaWYKKworI2lmZGVmIEtNUF9ERUJVRworICB7CisgICAgY29uc3QgY2hhciAqYnVmZjsKKyAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJSVkIHJldHVybmluZzogc2NoZWR1bGU6JSVkIG9yZGVyZWQ6JSUlcyAiCisgICAgICAgICJsYjolJSVzIHViOiUlJXMiCisgICAgICAgICIgc3Q6JSUlcyB0YzolJSVzIGNvdW50OiUlJXNcblx0b3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlcyIKKyAgICAgICAgIiBwYXJtMTolJSVzIHBhcm0yOiUlJXMgcGFybTM6JSUlcyBwYXJtNDolJSVzXG4iLAorICAgICAgICB0cmFpdHNfdDxVVD46OnNwZWMsIHRyYWl0c190PFQ+OjpzcGVjLCB0cmFpdHNfdDxUPjo6c3BlYywKKyAgICAgICAgdHJhaXRzX3Q8U1Q+OjpzcGVjLCB0cmFpdHNfdDxVVD46OnNwZWMsIHRyYWl0c190PFVUPjo6c3BlYywKKyAgICAgICAgdHJhaXRzX3Q8VVQ+OjpzcGVjLCB0cmFpdHNfdDxVVD46OnNwZWMsIHRyYWl0c190PFQ+OjpzcGVjLAorICAgICAgICB0cmFpdHNfdDxUPjo6c3BlYywgdHJhaXRzX3Q8VD46OnNwZWMsIHRyYWl0c190PFQ+OjpzcGVjKTsKKyAgICBLRF9UUkFDRSgxMCwgKGJ1ZmYsIGd0aWQsIHByLT5zY2hlZHVsZSwgcHItPm9yZGVyZWQsIHByLT51LnAubGIsIHByLT51LnAudWIsCisgICAgICAgICAgICAgICAgICBwci0+dS5wLnN0LCBwci0+dS5wLnRjLCBwci0+dS5wLmNvdW50LCBwci0+dS5wLm9yZGVyZWRfbG93ZXIsCisgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfdXBwZXIsIHByLT51LnAucGFybTEsIHByLT51LnAucGFybTIsCisgICAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm0zLCBwci0+dS5wLnBhcm00KSk7CisgICAgX19rbXBfc3RyX2ZyZWUoJmJ1ZmYpOworICB9CisjZW5kaWYKKyNpZiAoS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEKQorICAvLyBJdCBjYW5ub3QgYmUgZ3VhcmFudGVlZCB0aGF0IGFmdGVyIGV4ZWN1dGlvbiBvZiBhIGxvb3Agd2l0aCBzb21lIG90aGVyCisgIC8vIHNjaGVkdWxlIGtpbmQgYWxsIHRoZSBwYXJtMyB2YXJpYWJsZXMgd2lsbCBjb250YWluIHRoZSBzYW1lIHZhbHVlLiBFdmVuIGlmCisgIC8vIGFsbCBwYXJtMyB3aWxsIGJlIHRoZSBzYW1lLCBpdCBzdGlsbCBleGlzdHMgYSBiYWQgY2FzZSBsaWtlIHVzaW5nIDAgYW5kIDEKKyAgLy8gcmF0aGVyIHRoYW4gcHJvZ3JhbSBsaWZlLXRpbWUgaW5jcmVtZW50LiBTbyB0aGUgZGVkaWNhdGVkIHZhcmlhYmxlIGlzCisgIC8vIHJlcXVpcmVkLiBUaGUgJ3N0YXRpY19zdGVhbF9jb3VudGVyJyBpcyB1c2VkLgorICBpZiAoc2NoZWR1bGUgPT0ga21wX3NjaF9zdGF0aWNfc3RlYWwpIHsKKyAgICAvLyBPdGhlciB0aHJlYWRzIHdpbGwgaW5zcGVjdCB0aGlzIHZhcmlhYmxlIHdoZW4gc2VhcmNoaW5nIGZvciBhIHZpY3RpbS4KKyAgICAvLyBUaGlzIGlzIGEgZmxhZyBzaG93aW5nIHRoYXQgb3RoZXIgdGhyZWFkcyBtYXkgc3RlYWwgZnJvbSB0aGlzIHRocmVhZAorICAgIC8vIHNpbmNlIHRoZW4uCisgICAgdm9sYXRpbGUgVCAqcCA9ICZwci0+dS5wLnN0YXRpY19zdGVhbF9jb3VudGVyOworICAgICpwID0gKnAgKyAxOworICB9CisjZW5kaWYgLy8gKCBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQgKQorCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgaWYgKG9tcHRfZW5hYmxlZCAmJiBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbG9vcF9iZWdpbikpIHsKKyAgICBvbXB0X3RlYW1faW5mb190ICp0ZWFtX2luZm8gPSBfX29tcHRfZ2V0X3RlYW1pbmZvKDAsIE5VTEwpOworICAgIG9tcHRfdGFza19pbmZvX3QgKnRhc2tfaW5mbyA9IF9fb21wdF9nZXRfdGFza2luZm8oMCk7CisgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2xvb3BfYmVnaW4pKAorICAgICAgICB0ZWFtX2luZm8tPnBhcmFsbGVsX2lkLCB0YXNrX2luZm8tPnRhc2tfaWQsIHRlYW1faW5mby0+bWljcm90YXNrKTsKKyAgfQorI2VuZGlmCit9CisKKy8qIEZvciBvcmRlcmVkIGxvb3BzLCBlaXRoZXIgX19rbXBfZGlzcGF0Y2hfZmluaXNoKCkgc2hvdWxkIGJlIGNhbGxlZCBhZnRlcgorICogZXZlcnkgaXRlcmF0aW9uLCBvciBfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bmsoKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyCisgKiBldmVyeSBjaHVuayBvZiBpdGVyYXRpb25zLiAgSWYgdGhlIG9yZGVyZWQgc2VjdGlvbihzKSB3ZXJlIG5vdCBleGVjdXRlZAorICogZm9yIHRoaXMgaXRlcmF0aW9uIChvciBldmVyeSBpdGVyYXRpb24gaW4gdGhpcyBjaHVuayksIHdlIG5lZWQgdG8gc2V0IHRoZQorICogb3JkZXJlZCBpdGVyYXRpb24gY291bnRlcnMgc28gdGhhdCB0aGUgbmV4dCB0aHJlYWQgY2FuIHByb2NlZWQuICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVVQ+CitzdGF0aWMgdm9pZCBfX2ttcF9kaXNwYXRjaF9maW5pc2goaW50IGd0aWQsIGlkZW50X3QgKmxvYykgeworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PFVUPjo6c2lnbmVkX3QgU1Q7CisgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKworICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfZmluaXNoOiBUIyVkIGNhbGxlZFxuIiwgZ3RpZCkpOworICBpZiAoIXRoLT50aC50aF90ZWFtLT50LnRfc2VyaWFsaXplZCkgeworCisgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPFVUPiAqcHIgPQorICAgICAgICByZWludGVycHJldF9jYXN0PGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTxVVD4gKj4oCisgICAgICAgICAgICB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQpOworICAgIGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPFVUPiB2b2xhdGlsZSAqc2ggPQorICAgICAgICByZWludGVycHJldF9jYXN0PGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPFVUPiB2b2xhdGlsZSAqPigKKyAgICAgICAgICAgIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfc2hfY3VycmVudCk7CisgICAgS01QX0RFQlVHX0FTU0VSVChwcik7CisgICAgS01QX0RFQlVHX0FTU0VSVChzaCk7CisgICAgS01QX0RFQlVHX0FTU0VSVCh0aC0+dGgudGhfZGlzcGF0Y2ggPT0KKyAgICAgICAgICAgICAgICAgICAgICZ0aC0+dGgudGhfdGVhbS0+dC50X2Rpc3BhdGNoW3RoLT50aC50aF9pbmZvLmRzLmRzX3RpZF0pOworCisgICAgaWYgKHByLT5vcmRlcmVkX2J1bXBlZCkgeworICAgICAgS0RfVFJBQ0UoCisgICAgICAgICAgMTAwMCwKKyAgICAgICAgICAoIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaDogVCMlZCByZXNldHRpbmcgb3JkZXJlZF9idW1wZWQgdG8gemVyb1xuIiwKKyAgICAgICAgICAgZ3RpZCkpOworICAgICAgcHItPm9yZGVyZWRfYnVtcGVkID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgVVQgbG93ZXIgPSBwci0+dS5wLm9yZGVyZWRfbG93ZXI7CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqYnVmZjsKKyAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KCJfX2ttcF9kaXNwYXRjaF9maW5pc2g6IFQjJSVkIGJlZm9yZSB3YWl0OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmVkX2l0ZXJhdGlvbjolJSVzIGxvd2VyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PFVUPjo6c3BlYywgdHJhaXRzX3Q8VVQ+OjpzcGVjKTsKKyAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKGJ1ZmYsIGd0aWQsIHNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24sIGxvd2VyKSk7CisgICAgICAgIF9fa21wX3N0cl9mcmVlKCZidWZmKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBfX2ttcF93YWl0X3lpZWxkPFVUPigmc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbiwgbG93ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9nZTxVVD4gVVNFX0lUVF9CVUlMRF9BUkcoTlVMTCkpOworICAgICAgS01QX01CKCk7IC8qIGlzIHRoaXMgbmVjZXNzYXJ5PyAqLworI2lmZGVmIEtNUF9ERUJVRworICAgICAgeworICAgICAgICBjb25zdCBjaGFyICpidWZmOworICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaDogVCMlJWQgYWZ0ZXIgd2FpdDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXJlZF9pdGVyYXRpb246JSUlcyBsb3dlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDxVVD46OnNwZWMsIHRyYWl0c190PFVUPjo6c3BlYyk7CisgICAgICAgIEtEX1RSQUNFKDEwMDAsIChidWZmLCBndGlkLCBzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uLCBsb3dlcikpOworICAgICAgICBfX2ttcF9zdHJfZnJlZSgmYnVmZik7CisgICAgICB9CisjZW5kaWYKKworICAgICAgdGVzdF90aGVuX2luYzxTVD4oKHZvbGF0aWxlIFNUICopJnNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24pOworICAgIH0gLy8gaWYKKyAgfSAvLyBpZgorICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfZmluaXNoOiBUIyVkIHJldHVybmVkXG4iLCBndGlkKSk7Cit9CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKwordGVtcGxhdGUgPHR5cGVuYW1lIFVUPgorc3RhdGljIHZvaWQgX19rbXBfZGlzcGF0Y2hfZmluaXNoX2NodW5rKGludCBndGlkLCBpZGVudF90ICpsb2MpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDxVVD46OnNpZ25lZF90IFNUOworICBrbXBfaW5mb190ICp0aCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisKKyAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaF9jaHVuazogVCMlZCBjYWxsZWRcbiIsIGd0aWQpKTsKKyAgaWYgKCF0aC0+dGgudGhfdGVhbS0+dC50X3NlcmlhbGl6ZWQpIHsKKyAgICAvLyAgICAgICAgaW50IGNpZDsKKyAgICBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8VVQ+ICpwciA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8ZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPFVUPiAqPigKKyAgICAgICAgICAgIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfcHJfY3VycmVudCk7CisgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGU8VVQ+IHZvbGF0aWxlICpzaCA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8ZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGU8VVQ+IHZvbGF0aWxlICo+KAorICAgICAgICAgICAgdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9zaF9jdXJyZW50KTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHByKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHNoKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoLT50aC50aF9kaXNwYXRjaCA9PQorICAgICAgICAgICAgICAgICAgICAgJnRoLT50aC50aF90ZWFtLT50LnRfZGlzcGF0Y2hbdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkXSk7CisKKyAgICAvLyAgICAgICAgZm9yIChjaWQgPSAwOyBjaWQgPCBLTVBfTUFYX09SREVSRUQ7ICsrY2lkKSB7CisgICAgVVQgbG93ZXIgPSBwci0+dS5wLm9yZGVyZWRfbG93ZXI7CisgICAgVVQgdXBwZXIgPSBwci0+dS5wLm9yZGVyZWRfdXBwZXI7CisgICAgVVQgaW5jID0gdXBwZXIgLSBsb3dlciArIDE7CisKKyAgICBpZiAocHItPm9yZGVyZWRfYnVtcGVkID09IGluYykgeworICAgICAgS0RfVFJBQ0UoCisgICAgICAgICAgMTAwMCwKKyAgICAgICAgICAoIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaDogVCMlZCByZXNldHRpbmcgb3JkZXJlZF9idW1wZWQgdG8gemVyb1xuIiwKKyAgICAgICAgICAgZ3RpZCkpOworICAgICAgcHItPm9yZGVyZWRfYnVtcGVkID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgaW5jIC09IHByLT5vcmRlcmVkX2J1bXBlZDsKKworI2lmZGVmIEtNUF9ERUJVRworICAgICAgeworICAgICAgICBjb25zdCBjaGFyICpidWZmOworICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfZmluaXNoX2NodW5rOiBUIyUlZCBiZWZvcmUgd2FpdDogIgorICAgICAgICAgICAgIm9yZGVyZWRfaXRlcmF0aW9uOiUlJXMgbG93ZXI6JSUlcyB1cHBlcjolJSVzXG4iLAorICAgICAgICAgICAgdHJhaXRzX3Q8VVQ+OjpzcGVjLCB0cmFpdHNfdDxVVD46OnNwZWMsIHRyYWl0c190PFVUPjo6c3BlYyk7CisgICAgICAgIEtEX1RSQUNFKDEwMDAsIChidWZmLCBndGlkLCBzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uLCBsb3dlciwgdXBwZXIpKTsKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoJmJ1ZmYpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIF9fa21wX3dhaXRfeWllbGQ8VVQ+KCZzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uLCBsb3dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2dlPFVUPiBVU0VfSVRUX0JVSUxEX0FSRyhOVUxMKSk7CisKKyAgICAgIEtNUF9NQigpOyAvKiBpcyB0aGlzIG5lY2Vzc2FyeT8gKi8KKyAgICAgIEtEX1RSQUNFKDEwMDAsICgiX19rbXBfZGlzcGF0Y2hfZmluaXNoX2NodW5rOiBUIyVkIHJlc2V0dGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyZWRfYnVtcGVkIHRvIHplcm9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCkpOworICAgICAgcHItPm9yZGVyZWRfYnVtcGVkID0gMDsKKy8vISEhISEgVE9ETyBjaGVjayBpZiB0aGUgaW5jIHNob3VsZCBiZSB1bnNpZ25lZCwgb3Igc2lnbmVkPz8/CisjaWZkZWYgS01QX0RFQlVHCisgICAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZmY7CisgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bms6IFQjJSVkIGFmdGVyIHdhaXQ6ICIKKyAgICAgICAgICAgICJvcmRlcmVkX2l0ZXJhdGlvbjolJSVzIGluYzolJSVzIGxvd2VyOiUlJXMgdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgIHRyYWl0c190PFVUPjo6c3BlYywgdHJhaXRzX3Q8VVQ+OjpzcGVjLCB0cmFpdHNfdDxVVD46OnNwZWMsCisgICAgICAgICAgICB0cmFpdHNfdDxVVD46OnNwZWMpOworICAgICAgICBLRF9UUkFDRSgxMDAwLAorICAgICAgICAgICAgICAgICAoYnVmZiwgZ3RpZCwgc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbiwgaW5jLCBsb3dlciwgdXBwZXIpKTsKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoJmJ1ZmYpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHRlc3RfdGhlbl9hZGQ8U1Q+KCh2b2xhdGlsZSBTVCAqKSZzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uLCBpbmMpOworICAgIH0KKyAgICAvLyAgICAgICAgfQorICB9CisgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bms6IFQjJWQgcmV0dXJuZWRcbiIsIGd0aWQpKTsKK30KKworI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisvKiBEZWZpbmUgYSBtYWNybyBmb3IgZXhpdGluZyBfX2ttcF9kaXNwYXRjaF9uZXh0KCkuIElmIHN0YXR1cyBpcyAwIChubyBtb3JlCisgICB3b3JrKSwgdGhlbiB0ZWxsIE9NUFQgdGhlIGxvb3AgaXMgb3Zlci4gSW4gc29tZSBjYXNlcyBrbXBfZGlzcGF0Y2hfZmluaSgpCisgICBpcyBub3QgY2FsbGVkLiAqLworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisjZGVmaW5lIE9NUFRfTE9PUF9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoc3RhdHVzID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAob21wdF9lbmFibGVkICYmIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9sb29wX2VuZCkpIHsgICBcCisgICAgICBvbXB0X3RlYW1faW5mb190ICp0ZWFtX2luZm8gPSBfX29tcHRfZ2V0X3RlYW1pbmZvKDAsIE5VTEwpOyAgICAgICAgICAgICAgXAorICAgICAgb21wdF90YXNrX2luZm9fdCAqdGFza19pbmZvID0gX19vbXB0X2dldF90YXNraW5mbygwKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9sb29wX2VuZCkoICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgdGVhbV9pbmZvLT5wYXJhbGxlbF9pZCwgdGFza19pbmZvLT50YXNrX2lkKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorI2Vsc2UKKyNkZWZpbmUgT01QVF9MT09QX0VORCAvLyBuby1vcAorI2VuZGlmCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIGludCBfX2ttcF9kaXNwYXRjaF9uZXh0KGlkZW50X3QgKmxvYywgaW50IGd0aWQsIGttcF9pbnQzMiAqcF9sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgKnBfbGIsIFQgKnBfdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgdHJhaXRzX3Q8VD46OnNpZ25lZF90ICpwX3N0KSB7CisKKyAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDxUPjo6dW5zaWduZWRfdCBVVDsKKyAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDxUPjo6c2lnbmVkX3QgU1Q7CisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8VD46OmZsb2F0aW5nX3QgREJMOworCisgIC8vIFRoaXMgaXMgcG90ZW50aWFsbHkgc2xpZ2h0bHkgbWlzbGVhZGluZywgc2NoZWR1bGUocnVudGltZSkgd2lsbCBhcHBlYXIgaGVyZQorICAvLyBldmVuIGlmIHRoZSBhY3R1YWwgcnVudG1lIHNjaGVkdWxlIGlzIHN0YXRpYy4gKFdoaWNoIHBvaW50cyBvdXQgYQorICAvLyBkaXNhZGF2YW50YWdlIG9mIHNjaGVkdWxlKHJ1bnRpbWUpOiBldmVuIHdoZW4gc3RhdGljIHNjaGVkdWxpbmcgaXMgdXNlZCBpdAorICAvLyBjb3N0cyBtb3JlIHRoYW4gYSBjb21waWxlIHRpbWUgY2hvaWNlIHRvIHVzZSBzdGF0aWMgc2NoZWR1bGluZyB3b3VsZC4pCisgIEtNUF9USU1FX1BBUlRJVElPTkVEX0JMT0NLKEZPUl9keW5hbWljX3NjaGVkdWxpbmcpOworCisgIGludCBzdGF0dXM7CisgIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTxUPiAqcHI7CisgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAga21wX3RlYW1fdCAqdGVhbSA9IHRoLT50aC50aF90ZWFtOworCisgIEtNUF9ERUJVR19BU1NFUlQocF9sYiAmJiBwX3ViICYmIHBfc3QpOyAvLyBBQzogdGhlc2UgY2Fubm90IGJlIE5VTEwKKyNpZmRlZiBLTVBfREVCVUcKKyAgeworICAgIGNvbnN0IGNoYXIgKmJ1ZmY7CisgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkIGNhbGxlZCBwX2xiOiUlJXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwX3ViOiUlJXMgcF9zdDolJSVzIHBfbGFzdDogJSVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PFQ+OjpzcGVjLCB0cmFpdHNfdDxUPjo6c3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDxTVD46OnNwZWMpOworICAgIEtEX1RSQUNFKDEwMDAsIChidWZmLCBndGlkLCAqcF9sYiwgKnBfdWIsIHBfc3QgPyAqcF9zdCA6IDAsIHBfbGFzdCkpOworICAgIF9fa21wX3N0cl9mcmVlKCZidWZmKTsKKyAgfQorI2VuZGlmCisKKyAgaWYgKHRlYW0tPnQudF9zZXJpYWxpemVkKSB7CisgICAgLyogTk9URTogc2VyaWFsaXplIHRoaXMgZGlzcGF0Y2ggYmVjYXNlIHdlIGFyZSBub3QgYXQgdGhlIGFjdGl2ZSBsZXZlbCAqLworICAgIHByID0gcmVpbnRlcnByZXRfY2FzdDxkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8VD4gKj4oCisgICAgICAgIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcF9idWZmZXIpOyAvKiB0b3Agb2YgdGhlIHN0YWNrICovCisgICAgS01QX0RFQlVHX0FTU0VSVChwcik7CisKKyAgICBpZiAoKHN0YXR1cyA9IChwci0+dS5wLnRjICE9IDApKSA9PSAwKSB7CisgICAgICAqcF9sYiA9IDA7CisgICAgICAqcF91YiA9IDA7CisgICAgICAvLyAgICAgICAgICAgIGlmICggcF9sYXN0ICE9IE5VTEwgKQorICAgICAgLy8gICAgICAgICAgICAgICAgKnBfbGFzdCA9IDA7CisgICAgICBpZiAocF9zdCAhPSBOVUxMKQorICAgICAgICAqcF9zdCA9IDA7CisgICAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgIGlmIChwci0+cHVzaGVkX3dzICE9IGN0X25vbmUpIHsKKyAgICAgICAgICBwci0+cHVzaGVkX3dzID0gX19rbXBfcG9wX3dvcmtzaGFyZShndGlkLCBwci0+cHVzaGVkX3dzLCBsb2MpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChwci0+bm9tZXJnZSkgeworICAgICAga21wX2ludDMyIGxhc3Q7CisgICAgICBUIHN0YXJ0OworICAgICAgVVQgbGltaXQsIHRyaXAsIGluaXQ7CisgICAgICBTVCBpbmNyOworICAgICAgVCBjaHVuayA9IHByLT51LnAucGFybTE7CisKKyAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyVkIGttcF9zY2hfZHluYW1pY19jaHVua2VkIGNhc2VcbiIsCisgICAgICAgICAgICAgICAgICAgICBndGlkKSk7CisKKyAgICAgIGluaXQgPSBjaHVuayAqIHByLT51LnAuY291bnQrKzsKKyAgICAgIHRyaXAgPSBwci0+dS5wLnRjIC0gMTsKKworICAgICAgaWYgKChzdGF0dXMgPSAoaW5pdCA8PSB0cmlwKSkgPT0gMCkgeworICAgICAgICAqcF9sYiA9IDA7CisgICAgICAgICpwX3ViID0gMDsKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgaWYgKCBwX2xhc3QgIT0gTlVMTCApCisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAqcF9sYXN0ID0gMDsKKyAgICAgICAgaWYgKHBfc3QgIT0gTlVMTCkKKyAgICAgICAgICAqcF9zdCA9IDA7CisgICAgICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgICAgICBpZiAocHItPnB1c2hlZF93cyAhPSBjdF9ub25lKSB7CisgICAgICAgICAgICBwci0+cHVzaGVkX3dzID0gX19rbXBfcG9wX3dvcmtzaGFyZShndGlkLCBwci0+cHVzaGVkX3dzLCBsb2MpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhcnQgPSBwci0+dS5wLmxiOworICAgICAgICBsaW1pdCA9IGNodW5rICsgaW5pdCAtIDE7CisgICAgICAgIGluY3IgPSBwci0+dS5wLnN0OworCisgICAgICAgIGlmICgobGFzdCA9IChsaW1pdCA+PSB0cmlwKSkgIT0gMCkgeworICAgICAgICAgIGxpbWl0ID0gdHJpcDsKKyNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgIHByLT51LnAubGFzdF91cHBlciA9IHByLT51LnAudWI7CisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKyAgICAgICAgfQorICAgICAgICBpZiAocF9sYXN0ICE9IE5VTEwpCisgICAgICAgICAgKnBfbGFzdCA9IGxhc3Q7CisgICAgICAgIGlmIChwX3N0ICE9IE5VTEwpCisgICAgICAgICAgKnBfc3QgPSBpbmNyOworICAgICAgICBpZiAoaW5jciA9PSAxKSB7CisgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQ7CisgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICpwX2xiID0gc3RhcnQgKyBpbml0ICogaW5jcjsKKyAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQgKiBpbmNyOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHByLT5vcmRlcmVkKSB7CisgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyID0gaW5pdDsKKyAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfdXBwZXIgPSBsaW1pdDsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpidWZmOworICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyZWRfbG93ZXI6JSUlcyBvcmRlcmVkX3VwcGVyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDxVVD46OnNwZWMsIHRyYWl0c190PFVUPjo6c3BlYyk7CisgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoYnVmZiwgZ3RpZCwgcHItPnUucC5vcmRlcmVkX2xvd2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlcikpOworICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoJmJ1ZmYpOworICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9IC8vIGlmCisgICAgICB9IC8vIGlmCisgICAgfSBlbHNlIHsKKyAgICAgIHByLT51LnAudGMgPSAwOworICAgICAgKnBfbGIgPSBwci0+dS5wLmxiOworICAgICAgKnBfdWIgPSBwci0+dS5wLnViOworI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICBwci0+dS5wLmxhc3RfdXBwZXIgPSAqcF91YjsKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworICAgICAgaWYgKHBfbGFzdCAhPSBOVUxMKQorICAgICAgICAqcF9sYXN0ID0gVFJVRTsKKyAgICAgIGlmIChwX3N0ICE9IE5VTEwpCisgICAgICAgICpwX3N0ID0gcHItPnUucC5zdDsKKyAgICB9IC8vIGlmCisjaWZkZWYgS01QX0RFQlVHCisgICAgeworICAgICAgY29uc3QgY2hhciAqYnVmZjsKKyAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkIHNlcmlhbGl6ZWQgY2FzZTogcF9sYjolJSVzICIKKyAgICAgICAgICAicF91YjolJSVzIHBfc3Q6JSUlcyBwX2xhc3Q6JSVwICUlZCAgcmV0dXJuaW5nOiUlZFxuIiwKKyAgICAgICAgICB0cmFpdHNfdDxUPjo6c3BlYywgdHJhaXRzX3Q8VD46OnNwZWMsIHRyYWl0c190PFNUPjo6c3BlYyk7CisgICAgICBLRF9UUkFDRSgxMCwgKGJ1ZmYsIGd0aWQsICpwX2xiLCAqcF91YiwgKnBfc3QsIHBfbGFzdCwgKnBfbGFzdCwgc3RhdHVzKSk7CisgICAgICBfX2ttcF9zdHJfZnJlZSgmYnVmZik7CisgICAgfQorI2VuZGlmCisjaWYgSU5DTFVERV9TU0NfTUFSS1MKKyAgICBTU0NfTUFSS19ESVNQQVRDSF9ORVhUKCk7CisjZW5kaWYKKyAgICBPTVBUX0xPT1BfRU5EOworICAgIHJldHVybiBzdGF0dXM7CisgIH0gZWxzZSB7CisgICAga21wX2ludDMyIGxhc3QgPSAwOworICAgIGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPFVUPiAqc2g7CisgICAgVCBzdGFydDsKKyAgICBTVCBpbmNyOworICAgIFVUIGxpbWl0LCB0cmlwLCBpbml0OworCisgICAgS01QX0RFQlVHX0FTU0VSVCh0aC0+dGgudGhfZGlzcGF0Y2ggPT0KKyAgICAgICAgICAgICAgICAgICAgICZ0aC0+dGgudGhfdGVhbS0+dC50X2Rpc3BhdGNoW3RoLT50aC50aF9pbmZvLmRzLmRzX3RpZF0pOworCisgICAgcHIgPSByZWludGVycHJldF9jYXN0PGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTxUPiAqPigKKyAgICAgICAgdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9wcl9jdXJyZW50KTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHByKTsKKyAgICBzaCA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGU8VVQ+ICo+KAorICAgICAgICB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQpOworICAgIEtNUF9ERUJVR19BU1NFUlQoc2gpOworCisgICAgaWYgKHByLT51LnAudGMgPT0gMCkgeworICAgICAgLy8gemVybyB0cmlwIGNvdW50CisgICAgICBzdGF0dXMgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKHByLT5zY2hlZHVsZSkgeworI2lmIChLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQpCisgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX3N0ZWFsOiB7CisgICAgICAgIFQgY2h1bmsgPSBwci0+dS5wLnBhcm0xOworICAgICAgICBpbnQgbnByb2MgPSB0aC0+dGgudGhfdGVhbV9ucHJvYzsKKworICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlZCBrbXBfc2NoX3N0YXRpY19zdGVhbCBjYXNlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBndGlkKSk7CisKKyAgICAgICAgdHJpcCA9IHByLT51LnAudGMgLSAxOworCisgICAgICAgIGlmICh0cmFpdHNfdDxUPjo6dHlwZV9zaXplID4gNCkgeworICAgICAgICAgIC8vIHVzZSBsb2NrIGZvciA4LWJ5dGUgYW5kIENBUyBmb3IgNC1ieXRlIGluZHVjdGlvbgorICAgICAgICAgIC8vIHZhcmlhYmxlLiBUT0RPIChvcHRpb25hbCk6IGNoZWNrIGFuZCB1c2UgMTYtYnl0ZSBDQVMKKyAgICAgICAgICBrbXBfbG9ja190ICpsY2sgPSB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX3N0ZWFsX2xvY2s7CisgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChsY2sgIT0gTlVMTCk7CisgICAgICAgICAgaWYgKHByLT51LnAuY291bnQgPCAoVVQpcHItPnUucC51YikgeworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKGxjaywgZ3RpZCk7CisgICAgICAgICAgICAvLyB0cnkgdG8gZ2V0IG93biBjaHVuayBvZiBpdGVyYXRpb25zCisgICAgICAgICAgICBpbml0ID0gKHByLT51LnAuY291bnQpKys7CisgICAgICAgICAgICBzdGF0dXMgPSAoaW5pdCA8IChVVClwci0+dS5wLnViKTsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jayhsY2ssIGd0aWQpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSAwOyAvLyBubyBvd24gY2h1bmtzCisgICAgICAgICAgfQorICAgICAgICAgIGlmICghc3RhdHVzKSB7IC8vIHRyeSB0byBzdGVhbAorICAgICAgICAgICAga21wX2luZm9fdCAqKm90aGVyX3RocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKyAgICAgICAgICAgIGludCB3aGlsZV9saW1pdCA9IG5wcm9jOyAvLyBucHJvYyBhdHRlbXB0cyB0byBmaW5kIGEgdmljdGltCisgICAgICAgICAgICBpbnQgd2hpbGVfaW5kZXggPSAwOworICAgICAgICAgICAgLy8gVE9ETzogYWxnb3JpdGhtIG9mIHNlYXJjaGluZyBmb3IgYSB2aWN0aW0KKyAgICAgICAgICAgIC8vIHNob3VsZCBiZSBjbGVhbmVkIHVwIGFuZCBtZWFzdXJlZAorICAgICAgICAgICAgd2hpbGUgKCghc3RhdHVzKSAmJiAod2hpbGVfbGltaXQgIT0gKyt3aGlsZV9pbmRleCkpIHsKKyAgICAgICAgICAgICAgVCByZW1haW5pbmc7CisgICAgICAgICAgICAgIFQgdmljdGltSWR4ID0gcHItPnUucC5wYXJtNDsKKyAgICAgICAgICAgICAgVCBvbGRWaWN0aW1JZHggPSB2aWN0aW1JZHggPyB2aWN0aW1JZHggLSAxIDogbnByb2MgLSAxOworICAgICAgICAgICAgICBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8VD4gKnZpY3RpbSA9CisgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTxUPiAqPigKKyAgICAgICAgICAgICAgICAgICAgICBvdGhlcl90aHJlYWRzW3ZpY3RpbUlkeF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfcHJfY3VycmVudCk7CisgICAgICAgICAgICAgIHdoaWxlICgodmljdGltID09IE5VTEwgfHwgdmljdGltID09IHByIHx8CisgICAgICAgICAgICAgICAgICAgICAgKCoodm9sYXRpbGUgVCAqKSZ2aWN0aW0tPnUucC5zdGF0aWNfc3RlYWxfY291bnRlciAhPQorICAgICAgICAgICAgICAgICAgICAgICAqKHZvbGF0aWxlIFQgKikmcHItPnUucC5zdGF0aWNfc3RlYWxfY291bnRlcikpICYmCisgICAgICAgICAgICAgICAgICAgICBvbGRWaWN0aW1JZHggIT0gdmljdGltSWR4KSB7CisgICAgICAgICAgICAgICAgdmljdGltSWR4ID0gKHZpY3RpbUlkeCArIDEpICUgbnByb2M7CisgICAgICAgICAgICAgICAgdmljdGltID0gcmVpbnRlcnByZXRfY2FzdDxkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8VD4gKj4oCisgICAgICAgICAgICAgICAgICAgIG90aGVyX3RocmVhZHNbdmljdGltSWR4XQorICAgICAgICAgICAgICAgICAgICAgICAgLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfcHJfY3VycmVudCk7CisgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgIGlmICghdmljdGltIHx8CisgICAgICAgICAgICAgICAgICAoKih2b2xhdGlsZSBUICopJnZpY3RpbS0+dS5wLnN0YXRpY19zdGVhbF9jb3VudGVyICE9CisgICAgICAgICAgICAgICAgICAgKih2b2xhdGlsZSBUICopJnByLT51LnAuc3RhdGljX3N0ZWFsX2NvdW50ZXIpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7IC8vIHRyeSBvbmNlIG1vcmUgKG5wcm9jIGF0dGVtcHRzIGluIHRvdGFsKQorICAgICAgICAgICAgICAgIC8vIG5vIHZpY3RpbSBpcyByZWFkeSB5ZXQgdG8gcGFydGljaXBhdGUgaW4gc3RlYWxpbmcKKyAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIGFsbCB2aWN0aW1zIGFyZSBzdGlsbCBpbiBrbXBfaW5pdF9kaXNwYXRjaAorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmICh2aWN0aW0tPnUucC5jb3VudCArIDIgPiAoVVQpdmljdGltLT51LnAudWIpIHsKKyAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm00ID0gKHZpY3RpbUlkeCArIDEpICUgbnByb2M7IC8vIHNoaWZ0IHN0YXJ0IHRpZAorICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBub3QgZW5vdWdoIGNodW5rcyB0byBzdGVhbCwgZ290byBuZXh0IHZpY3RpbQorICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgbGNrID0gb3RoZXJfdGhyZWFkc1t2aWN0aW1JZHhdLT50aC50aF9kaXNwYXRjaC0+dGhfc3RlYWxfbG9jazsKKyAgICAgICAgICAgICAgS01QX0FTU0VSVChsY2sgIT0gTlVMTCk7CisgICAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jayhsY2ssIGd0aWQpOworICAgICAgICAgICAgICBsaW1pdCA9IHZpY3RpbS0+dS5wLnViOyAvLyBrZWVwIGluaXRpYWwgdWIKKyAgICAgICAgICAgICAgaWYgKHZpY3RpbS0+dS5wLmNvdW50ID49IGxpbWl0IHx8CisgICAgICAgICAgICAgICAgICAocmVtYWluaW5nID0gbGltaXQgLSB2aWN0aW0tPnUucC5jb3VudCkgPCAyKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKGxjaywgZ3RpZCk7CisgICAgICAgICAgICAgICAgcHItPnUucC5wYXJtNCA9ICh2aWN0aW1JZHggKyAxKSAlIG5wcm9jOyAvLyBuZXh0IHZpY3RpbQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBub3QgZW5vdWdoIGNodW5rcyB0byBzdGVhbAorICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIC8vIHN0ZWFsaW5nIHN1Y2NlZGVkLCByZWR1Y2UgdmljdGltJ3MgdWIgYnkgMS80IG9mIHVuZG9uZSBjaHVua3MKKyAgICAgICAgICAgICAgLy8gb3IgYnkgMQorICAgICAgICAgICAgICBpZiAocmVtYWluaW5nID4gMykgeworICAgICAgICAgICAgICAgIEtNUF9DT1VOVF9WQUxVRShGT1Jfc3RhdGljX3N0ZWFsX3N0b2xlbiwgcmVtYWluaW5nID4+IDIpOworICAgICAgICAgICAgICAgIGluaXQgPSAodmljdGltLT51LnAudWIgLT0KKyAgICAgICAgICAgICAgICAgICAgICAgIChyZW1haW5pbmcgPj4gMikpOyAvLyBzdGVhbCAxLzQgb2YgcmVtYWluaW5nCisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0NPVU5UX1ZBTFVFKEZPUl9zdGF0aWNfc3RlYWxfc3RvbGVuLCAxKTsKKyAgICAgICAgICAgICAgICBpbml0ID0KKyAgICAgICAgICAgICAgICAgICAgKHZpY3RpbS0+dS5wLnViIC09IDEpOyAvLyBzdGVhbCAxIGNodW5rIG9mIDIgb3IgMyByZW1haW5pbmcKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2sobGNrLCBndGlkKTsKKworICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGluaXQgKyAxIDw9IGxpbWl0KTsKKyAgICAgICAgICAgICAgcHItPnUucC5wYXJtNCA9IHZpY3RpbUlkeDsgLy8gcmVtZW1iZXIgdmljdGltIHRvIHN0ZWFsIGZyb20KKyAgICAgICAgICAgICAgc3RhdHVzID0gMTsKKyAgICAgICAgICAgICAgd2hpbGVfaW5kZXggPSAwOworICAgICAgICAgICAgICAvLyBub3cgdXBkYXRlIG93biBjb3VudCBhbmQgdWIgd2l0aCBzdG9sZW4gcmFuZ2UgYnV0IGluaXQgY2h1bmsKKyAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKHRoLT50aC50aF9kaXNwYXRjaC0+dGhfc3RlYWxfbG9jaywgZ3RpZCk7CisgICAgICAgICAgICAgIHByLT51LnAuY291bnQgPSBpbml0ICsgMTsKKyAgICAgICAgICAgICAgcHItPnUucC51YiA9IGxpbWl0OworICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2sodGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9zdGVhbF9sb2NrLCBndGlkKTsKKyAgICAgICAgICAgIH0gLy8gd2hpbGUgKHNlYXJjaCBmb3IgdmljdGltKQorICAgICAgICAgIH0gLy8gaWYgKHRyeSB0byBmaW5kIHZpY3RpbSBhbmQgc3RlYWwpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gNC1ieXRlIGluZHVjdGlvbiB2YXJpYWJsZSwgdXNlIDgtYnl0ZSBDQVMgZm9yIHBhaXIgKGNvdW50LCB1YikKKyAgICAgICAgICB0eXBlZGVmIHVuaW9uIHsKKyAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgIFVUIGNvdW50OworICAgICAgICAgICAgICBUIHViOworICAgICAgICAgICAgfSBwOworICAgICAgICAgICAga21wX2ludDY0IGI7CisgICAgICAgICAgfSB1bmlvbl9pNDsKKyAgICAgICAgICAvLyBBbGwgb3BlcmF0aW9ucyBvbiAnY291bnQnIG9yICd1YicgbXVzdCBiZSBjb21iaW5lZCBhdG9taWNhbGx5CisgICAgICAgICAgLy8gdG9nZXRoZXIuCisgICAgICAgICAgeworICAgICAgICAgICAgdW5pb25faTQgdm9sZCwgdm5ldzsKKyAgICAgICAgICAgIHZvbGQuYiA9ICoodm9sYXRpbGUga21wX2ludDY0ICopKCZwci0+dS5wLmNvdW50KTsKKyAgICAgICAgICAgIHZuZXcgPSB2b2xkOworICAgICAgICAgICAgdm5ldy5wLmNvdW50Kys7CisgICAgICAgICAgICB3aGlsZSAoIUtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E2NCgKKyAgICAgICAgICAgICAgICAodm9sYXRpbGUga21wX2ludDY0ICopJnByLT51LnAuY291bnQsCisgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludDY0ICopICYgdm9sZC5iLAorICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQ2NCAqKSAmIHZuZXcuYikpIHsKKyAgICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICAgICAgICB2b2xkLmIgPSAqKHZvbGF0aWxlIGttcF9pbnQ2NCAqKSgmcHItPnUucC5jb3VudCk7CisgICAgICAgICAgICAgIHZuZXcgPSB2b2xkOworICAgICAgICAgICAgICB2bmV3LnAuY291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZuZXcgPSB2b2xkOworICAgICAgICAgICAgaW5pdCA9IHZuZXcucC5jb3VudDsKKyAgICAgICAgICAgIHN0YXR1cyA9IChpbml0IDwgKFVUKXZuZXcucC51Yik7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFzdGF0dXMpIHsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKipvdGhlcl90aHJlYWRzID0gdGVhbS0+dC50X3RocmVhZHM7CisgICAgICAgICAgICBpbnQgd2hpbGVfbGltaXQgPSBucHJvYzsgLy8gbnByb2MgYXR0ZW1wdHMgdG8gZmluZCBhIHZpY3RpbQorICAgICAgICAgICAgaW50IHdoaWxlX2luZGV4ID0gMDsKKworICAgICAgICAgICAgLy8gVE9ETzogYWxnb3JpdGhtIG9mIHNlYXJjaGluZyBmb3IgYSB2aWN0aW0KKyAgICAgICAgICAgIC8vIHNob3VsZCBiZSBjbGVhbmVkIHVwIGFuZCBtZWFzdXJlZAorICAgICAgICAgICAgd2hpbGUgKCghc3RhdHVzKSAmJiAod2hpbGVfbGltaXQgIT0gKyt3aGlsZV9pbmRleCkpIHsKKyAgICAgICAgICAgICAgdW5pb25faTQgdm9sZCwgdm5ldzsKKyAgICAgICAgICAgICAga21wX2ludDMyIHJlbWFpbmluZzsKKyAgICAgICAgICAgICAgVCB2aWN0aW1JZHggPSBwci0+dS5wLnBhcm00OworICAgICAgICAgICAgICBUIG9sZFZpY3RpbUlkeCA9IHZpY3RpbUlkeCA/IHZpY3RpbUlkeCAtIDEgOiBucHJvYyAtIDE7CisgICAgICAgICAgICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTxUPiAqdmljdGltID0KKyAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8ZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPFQ+ICo+KAorICAgICAgICAgICAgICAgICAgICAgIG90aGVyX3RocmVhZHNbdmljdGltSWR4XQorICAgICAgICAgICAgICAgICAgICAgICAgICAtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9wcl9jdXJyZW50KTsKKyAgICAgICAgICAgICAgd2hpbGUgKCh2aWN0aW0gPT0gTlVMTCB8fCB2aWN0aW0gPT0gcHIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAoKih2b2xhdGlsZSBUICopJnZpY3RpbS0+dS5wLnN0YXRpY19zdGVhbF9jb3VudGVyICE9CisgICAgICAgICAgICAgICAgICAgICAgICoodm9sYXRpbGUgVCAqKSZwci0+dS5wLnN0YXRpY19zdGVhbF9jb3VudGVyKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgIG9sZFZpY3RpbUlkeCAhPSB2aWN0aW1JZHgpIHsKKyAgICAgICAgICAgICAgICB2aWN0aW1JZHggPSAodmljdGltSWR4ICsgMSkgJSBucHJvYzsKKyAgICAgICAgICAgICAgICB2aWN0aW0gPSByZWludGVycHJldF9jYXN0PGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTxUPiAqPigKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1t2aWN0aW1JZHhdCisgICAgICAgICAgICAgICAgICAgICAgICAtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9wcl9jdXJyZW50KTsKKyAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgaWYgKCF2aWN0aW0gfHwKKyAgICAgICAgICAgICAgICAgICgqKHZvbGF0aWxlIFQgKikmdmljdGltLT51LnAuc3RhdGljX3N0ZWFsX2NvdW50ZXIgIT0KKyAgICAgICAgICAgICAgICAgICAqKHZvbGF0aWxlIFQgKikmcHItPnUucC5zdGF0aWNfc3RlYWxfY291bnRlcikpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gdHJ5IG9uY2UgbW9yZSAobnByb2MgYXR0ZW1wdHMgaW4gdG90YWwpCisgICAgICAgICAgICAgICAgLy8gbm8gdmljdGltIGlzIHJlYWR5IHlldCB0byBwYXJ0aWNpcGF0ZSBpbiBzdGVhbGluZworICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgYWxsIHZpY3RpbXMgYXJlIHN0aWxsIGluIGttcF9pbml0X2Rpc3BhdGNoCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgcHItPnUucC5wYXJtNCA9IHZpY3RpbUlkeDsgLy8gbmV3IHZpY3RpbSBmb3VuZAorICAgICAgICAgICAgICB3aGlsZSAoMSkgeyAvLyBDQVMgbG9vcCBpZiB2aWN0aW0gaGFzIGVub3VnaCBjaHVua3MgdG8gc3RlYWwKKyAgICAgICAgICAgICAgICB2b2xkLmIgPSAqKHZvbGF0aWxlIGttcF9pbnQ2NCAqKSgmdmljdGltLT51LnAuY291bnQpOworICAgICAgICAgICAgICAgIHZuZXcgPSB2b2xkOworCisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgodm5ldy5wLnViIC0gMSkgKiAoVVQpY2h1bmsgPD0gdHJpcCk7CisgICAgICAgICAgICAgICAgaWYgKHZuZXcucC5jb3VudCA+PSAoVVQpdm5ldy5wLnViIHx8CisgICAgICAgICAgICAgICAgICAgIChyZW1haW5pbmcgPSB2bmV3LnAudWIgLSB2bmV3LnAuY291bnQpIDwgMikgeworICAgICAgICAgICAgICAgICAgcHItPnUucC5wYXJtNCA9CisgICAgICAgICAgICAgICAgICAgICAgKHZpY3RpbUlkeCArIDEpICUgbnByb2M7IC8vIHNoaWZ0IHN0YXJ0IHZpY3RpbSBpZAorICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIG5vdCBlbm91Z2ggY2h1bmtzIHRvIHN0ZWFsLCBnb3RvIG5leHQgdmljdGltCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPiAzKSB7CisgICAgICAgICAgICAgICAgICB2bmV3LnAudWIgLT0gKHJlbWFpbmluZyA+PiAyKTsgLy8gdHJ5IHRvIHN0ZWFsIDEvNCByZW1haW5pbmcKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgdm5ldy5wLnViIC09IDE7IC8vIHN0ZWFsIDEgY2h1bmsgb2YgMiBvciAzIHJlbWFpbmluZworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCh2bmV3LnAudWIgLSAxKSAqIChVVCljaHVuayA8PSB0cmlwKTsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBTaG91bGQgdGhpcyBiZSBhY3F1aXJlIG9yIHJlbGVhc2U/CisgICAgICAgICAgICAgICAgaWYgKEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E2NCgKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2xhdGlsZSBrbXBfaW50NjQgKikmdmljdGltLT51LnAuY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50NjQgKikgJiB2b2xkLmIsCisgICAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50NjQgKikgJiB2bmV3LmIpKSB7CisgICAgICAgICAgICAgICAgICAvLyBzdGVhbGluZyBzdWNjZWVkZWQKKyAgICAgICAgICAgICAgICAgIEtNUF9DT1VOVF9WQUxVRShGT1Jfc3RhdGljX3N0ZWFsX3N0b2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xkLnAudWIgLSB2bmV3LnAudWIpOworICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMTsKKyAgICAgICAgICAgICAgICAgIHdoaWxlX2luZGV4ID0gMDsKKyAgICAgICAgICAgICAgICAgIC8vIG5vdyB1cGRhdGUgb3duIGNvdW50IGFuZCB1YgorICAgICAgICAgICAgICAgICAgaW5pdCA9IHZuZXcucC51YjsKKyAgICAgICAgICAgICAgICAgIHZvbGQucC5jb3VudCA9IGluaXQgKyAxOworI2lmIEtNUF9BUkNIX1g4NgorICAgICAgICAgICAgICAgICAgS01QX1hDSEdfRklYRUQ2NCgodm9sYXRpbGUga21wX2ludDY0ICopKCZwci0+dS5wLmNvdW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sZC5iKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAqKHZvbGF0aWxlIGttcF9pbnQ2NCAqKSgmcHItPnUucC5jb3VudCkgPSB2b2xkLmI7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gLy8gaWYgKGNoZWNrIENBUyByZXN1bHQpCisgICAgICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOyAvLyBDQVMgZmFpbGVkLCByZXBlYXQgYXR0ZW1wdAorICAgICAgICAgICAgICB9IC8vIHdoaWxlICh0cnkgdG8gc3RlYWwgZnJvbSBwYXJ0aWN1bGFyIHZpY3RpbSkKKyAgICAgICAgICAgIH0gLy8gd2hpbGUgKHNlYXJjaCBmb3IgdmljdGltKQorICAgICAgICAgIH0gLy8gaWYgKHRyeSB0byBmaW5kIHZpY3RpbSBhbmQgc3RlYWwpCisgICAgICAgIH0gLy8gaWYgKDQtYnl0ZSBpbmR1Y3Rpb24gdmFyaWFibGUpCisgICAgICAgIGlmICghc3RhdHVzKSB7CisgICAgICAgICAgKnBfbGIgPSAwOworICAgICAgICAgICpwX3ViID0gMDsKKyAgICAgICAgICBpZiAocF9zdCAhPSBOVUxMKQorICAgICAgICAgICAgKnBfc3QgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN0YXJ0ID0gcHItPnUucC5wYXJtMjsKKyAgICAgICAgICBpbml0ICo9IGNodW5rOworICAgICAgICAgIGxpbWl0ID0gY2h1bmsgKyBpbml0IC0gMTsKKyAgICAgICAgICBpbmNyID0gcHItPnUucC5zdDsKKyAgICAgICAgICBLTVBfQ09VTlRfVkFMVUUoRk9SX3N0YXRpY19zdGVhbF9jaHVua3MsIDEpOworCisgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChpbml0IDw9IHRyaXApOworICAgICAgICAgIGlmICgobGFzdCA9IChsaW1pdCA+PSB0cmlwKSkgIT0gMCkKKyAgICAgICAgICAgIGxpbWl0ID0gdHJpcDsKKyAgICAgICAgICBpZiAocF9zdCAhPSBOVUxMKQorICAgICAgICAgICAgKnBfc3QgPSBpbmNyOworCisgICAgICAgICAgaWYgKGluY3IgPT0gMSkgeworICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQ7CisgICAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpwX2xiID0gc3RhcnQgKyBpbml0ICogaW5jcjsKKyAgICAgICAgICAgICpwX3ViID0gc3RhcnQgKyBsaW1pdCAqIGluY3I7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHByLT5vcmRlcmVkKSB7CisgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSBpbml0OworICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX3VwcGVyID0gbGltaXQ7CisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZmY7CisgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8VVQ+OjpzcGVjLCB0cmFpdHNfdDxVVD46OnNwZWMpOworICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoYnVmZiwgZ3RpZCwgcHItPnUucC5vcmRlcmVkX2xvd2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX3VwcGVyKSk7CisgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCZidWZmKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgfSAvLyBpZgorICAgICAgICBicmVhazsKKyAgICAgIH0gLy8gY2FzZQorI2VuZGlmIC8vICggS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEICkKKyAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQ6IHsKKyAgICAgICAgS0RfVFJBQ0UoCisgICAgICAgICAgICAxMDAsCisgICAgICAgICAgICAoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJWQga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQgY2FzZVxuIiwgZ3RpZCkpOworICAgICAgICBpZiAoKHN0YXR1cyA9ICFwci0+dS5wLmNvdW50KSAhPQorICAgICAgICAgICAgMCkgeyAvKiBjaGVjayBpZiB0aHJlYWQgaGFzIGFueSBpdGVyYXRpb24gdG8gZG8gKi8KKyAgICAgICAgICBwci0+dS5wLmNvdW50ID0gMTsKKyAgICAgICAgICAqcF9sYiA9IHByLT51LnAubGI7CisgICAgICAgICAgKnBfdWIgPSBwci0+dS5wLnViOworICAgICAgICAgIGxhc3QgPSBwci0+dS5wLnBhcm0xOworICAgICAgICAgIGlmIChwX3N0ICE9IE5VTEwpCisgICAgICAgICAgICAqcF9zdCA9IHByLT51LnAuc3Q7CisgICAgICAgIH0gZWxzZSB7IC8qIG5vIGl0ZXJhdGlvbnMgdG8gZG8gKi8KKyAgICAgICAgICBwci0+dS5wLmxiID0gcHItPnUucC51YiArIHByLT51LnAuc3Q7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByLT5vcmRlcmVkKSB7CisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgeworICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmZjsKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmVkX2xvd2VyOiUlJXMgb3JkZXJlZF91cHBlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8VVQ+OjpzcGVjLCB0cmFpdHNfdDxVVD46OnNwZWMpOworICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKGJ1ZmYsIGd0aWQsIHByLT51LnAub3JkZXJlZF9sb3dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfdXBwZXIpKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCZidWZmKTsKKyAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfSAvLyBpZgorICAgICAgfSAvLyBjYXNlCisgICAgICBicmVhazsKKyAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfZ3JlZWR5OiAvKiBvcmlnaW5hbCBjb2RlIGZvciBrbXBfc2NoX3N0YXRpY19ncmVlZHkgd2FzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VkIGhlcmUgKi8KKyAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfY2h1bmtlZDogeworICAgICAgICBUIHBhcm0xOworCisgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgImttcF9zY2hfc3RhdGljX1thZmZpbml0eXxjaHVua2VkXSBjYXNlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBndGlkKSk7CisgICAgICAgIHBhcm0xID0gcHItPnUucC5wYXJtMTsKKworICAgICAgICB0cmlwID0gcHItPnUucC50YyAtIDE7CisgICAgICAgIGluaXQgPSBwYXJtMSAqIChwci0+dS5wLmNvdW50ICsgX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKSk7CisKKyAgICAgICAgaWYgKChzdGF0dXMgPSAoaW5pdCA8PSB0cmlwKSkgIT0gMCkgeworICAgICAgICAgIHN0YXJ0ID0gcHItPnUucC5sYjsKKyAgICAgICAgICBpbmNyID0gcHItPnUucC5zdDsKKyAgICAgICAgICBsaW1pdCA9IHBhcm0xICsgaW5pdCAtIDE7CisKKyAgICAgICAgICBpZiAoKGxhc3QgPSAobGltaXQgPj0gdHJpcCkpICE9IDApCisgICAgICAgICAgICBsaW1pdCA9IHRyaXA7CisKKyAgICAgICAgICBpZiAocF9zdCAhPSBOVUxMKQorICAgICAgICAgICAgKnBfc3QgPSBpbmNyOworCisgICAgICAgICAgcHItPnUucC5jb3VudCArPSB0aC0+dGgudGhfdGVhbV9ucHJvYzsKKworICAgICAgICAgIGlmIChpbmNyID09IDEpIHsKKyAgICAgICAgICAgICpwX2xiID0gc3RhcnQgKyBpbml0OworICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdCAqIGluY3I7CisgICAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQgKiBpbmNyOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChwci0+b3JkZXJlZCkgeworICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyID0gaW5pdDsKKyAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IGxpbWl0OworI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgeworICAgICAgICAgICAgICBjb25zdCBjaGFyICpidWZmOworICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyZWRfbG93ZXI6JSUlcyBvcmRlcmVkX3VwcGVyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PFVUPjo6c3BlYywgdHJhaXRzX3Q8VVQ+OjpzcGVjKTsKKyAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKGJ1ZmYsIGd0aWQsIHByLT51LnAub3JkZXJlZF9sb3dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlcikpOworICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSgmYnVmZik7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICB9IC8vIGlmCisgICAgICAgIH0gLy8gaWYKKyAgICAgIH0gLy8gY2FzZQorICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2Uga21wX3NjaF9keW5hbWljX2NodW5rZWQ6IHsKKyAgICAgICAgVCBjaHVuayA9IHByLT51LnAucGFybTE7CisKKyAgICAgICAgS0RfVFJBQ0UoCisgICAgICAgICAgICAxMDAsCisgICAgICAgICAgICAoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJWQga21wX3NjaF9keW5hbWljX2NodW5rZWQgY2FzZVxuIiwgZ3RpZCkpOworCisgICAgICAgIGluaXQgPSBjaHVuayAqIHRlc3RfdGhlbl9pbmNfYWNxPFNUPigodm9sYXRpbGUgU1QgKikmc2gtPnUucy5pdGVyYXRpb24pOworICAgICAgICB0cmlwID0gcHItPnUucC50YyAtIDE7CisKKyAgICAgICAgaWYgKChzdGF0dXMgPSAoaW5pdCA8PSB0cmlwKSkgPT0gMCkgeworICAgICAgICAgICpwX2xiID0gMDsKKyAgICAgICAgICAqcF91YiA9IDA7CisgICAgICAgICAgaWYgKHBfc3QgIT0gTlVMTCkKKyAgICAgICAgICAgICpwX3N0ID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzdGFydCA9IHByLT51LnAubGI7CisgICAgICAgICAgbGltaXQgPSBjaHVuayArIGluaXQgLSAxOworICAgICAgICAgIGluY3IgPSBwci0+dS5wLnN0OworCisgICAgICAgICAgaWYgKChsYXN0ID0gKGxpbWl0ID49IHRyaXApKSAhPSAwKQorICAgICAgICAgICAgbGltaXQgPSB0cmlwOworCisgICAgICAgICAgaWYgKHBfc3QgIT0gTlVMTCkKKyAgICAgICAgICAgICpwX3N0ID0gaW5jcjsKKworICAgICAgICAgIGlmIChpbmNyID09IDEpIHsKKyAgICAgICAgICAgICpwX2xiID0gc3RhcnQgKyBpbml0OworICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdCAqIGluY3I7CisgICAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQgKiBpbmNyOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChwci0+b3JkZXJlZCkgeworICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyID0gaW5pdDsKKyAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IGxpbWl0OworI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgeworICAgICAgICAgICAgICBjb25zdCBjaGFyICpidWZmOworICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyZWRfbG93ZXI6JSUlcyBvcmRlcmVkX3VwcGVyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PFVUPjo6c3BlYywgdHJhaXRzX3Q8VVQ+OjpzcGVjKTsKKyAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKGJ1ZmYsIGd0aWQsIHByLT51LnAub3JkZXJlZF9sb3dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlcikpOworICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSgmYnVmZik7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICB9IC8vIGlmCisgICAgICAgIH0gLy8gaWYKKyAgICAgIH0gLy8gY2FzZQorICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQ6IHsKKyAgICAgICAgVCBjaHVua3NwZWMgPSBwci0+dS5wLnBhcm0xOworICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlZCBrbXBfc2NoX2d1aWRlZF9jaHVua2VkICIKKyAgICAgICAgICAgICAgICAgICAgICAgIml0ZXJhdGl2ZSBjYXNlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBndGlkKSk7CisgICAgICAgIHRyaXAgPSBwci0+dS5wLnRjOworICAgICAgICAvLyBTdGFydCBhdG9taWMgcGFydCBvZiBjYWxjdWxhdGlvbnMKKyAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICBTVCByZW1haW5pbmc7IC8vIHNpZ25lZCwgYmVjYXVzZSBjYW4gYmUgPCAwCisgICAgICAgICAgaW5pdCA9IHNoLT51LnMuaXRlcmF0aW9uOyAvLyBzaGFyZWQgdmFsdWUKKyAgICAgICAgICByZW1haW5pbmcgPSB0cmlwIC0gaW5pdDsKKyAgICAgICAgICBpZiAocmVtYWluaW5nIDw9IDApIHsgLy8gQUM6IG5lZWQgdG8gY29tcGFyZSB3aXRoIDAgZmlyc3QKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8sIGRvbid0IHRyeSBhdG9taWMgb3AKKyAgICAgICAgICAgIHN0YXR1cyA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKChUKXJlbWFpbmluZyA8CisgICAgICAgICAgICAgIHByLT51LnAucGFybTIpIHsgLy8gY29tcGFyZSB3aXRoIEsqbnByb2MqKGNodW5rKzEpLCBLPTIgYnkgZGVmYXVsdAorICAgICAgICAgICAgLy8gdXNlIGR5bmFtaWMtc3R5bGUgc2hjZWR1bGUKKyAgICAgICAgICAgIC8vIGF0b21pY2FsbHkgaW5yZW1lbnQgaXRlcmF0aW9ucywgZ2V0IG9sZCB2YWx1ZQorICAgICAgICAgICAgaW5pdCA9IHRlc3RfdGhlbl9hZGQ8U1Q+KAorICAgICAgICAgICAgICAgIFJDQVNUKHZvbGF0aWxlIFNUICosICZzaC0+dS5zLml0ZXJhdGlvbiksIChTVCljaHVua3NwZWMpOworICAgICAgICAgICAgcmVtYWluaW5nID0gdHJpcCAtIGluaXQ7CisgICAgICAgICAgICBpZiAocmVtYWluaW5nIDw9IDApIHsKKyAgICAgICAgICAgICAgc3RhdHVzID0gMDsgLy8gYWxsIGl0ZXJhdGlvbnMgZ290IGJ5IG90aGVyIHRocmVhZHMKKyAgICAgICAgICAgIH0gZWxzZSB7IC8vIGdvdCBzb21lIGl0ZXJhdGlvbnMgdG8gd29yayBvbgorICAgICAgICAgICAgICBzdGF0dXMgPSAxOworICAgICAgICAgICAgICBpZiAoKFQpcmVtYWluaW5nID4gY2h1bmtzcGVjKSB7CisgICAgICAgICAgICAgICAgbGltaXQgPSBpbml0ICsgY2h1bmtzcGVjIC0gMTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsYXN0ID0gMTsgLy8gdGhlIGxhc3QgY2h1bmsKKyAgICAgICAgICAgICAgICBsaW1pdCA9IGluaXQgKyByZW1haW5pbmcgLSAxOworICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgbGltaXQgPSBpbml0ICsgKFVUKShyZW1haW5pbmcgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihkb3VibGUgKikmcHItPnUucC5wYXJtMyk7IC8vIGRpdmlkZSBieSBLKm5wcm9jCisgICAgICAgICAgaWYgKGNvbXBhcmVfYW5kX3N3YXA8U1Q+KFJDQVNUKHZvbGF0aWxlIFNUICosICZzaC0+dS5zLml0ZXJhdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTVClpbml0LCAoU1QpbGltaXQpKSB7CisgICAgICAgICAgICAvLyBDQVMgd2FzIHN1Y2Nlc3NmdWwsIGNodW5rIG9idGFpbmVkCisgICAgICAgICAgICBzdGF0dXMgPSAxOworICAgICAgICAgICAgLS1saW1pdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgfSAvLyB3aGlsZQorICAgICAgICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICAgICAgICBzdGFydCA9IHByLT51LnAubGI7CisgICAgICAgICAgaW5jciA9IHByLT51LnAuc3Q7CisgICAgICAgICAgaWYgKHBfc3QgIT0gTlVMTCkKKyAgICAgICAgICAgICpwX3N0ID0gaW5jcjsKKyAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdCAqIGluY3I7CisgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0ICogaW5jcjsKKyAgICAgICAgICBpZiAocHItPm9yZGVyZWQpIHsKKyAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF9sb3dlciA9IGluaXQ7CisgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfdXBwZXIgPSBsaW1pdDsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmZjsKKyAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KCJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyUlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRlcmVkX2xvd2VyOiUlJXMgb3JkZXJlZF91cHBlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDxVVD46OnNwZWMsIHRyYWl0c190PFVUPjo6c3BlYyk7CisgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsIChidWZmLCBndGlkLCBwci0+dS5wLm9yZGVyZWRfbG93ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfdXBwZXIpKTsKKyAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoJmJ1ZmYpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgfSAvLyBpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICpwX2xiID0gMDsKKyAgICAgICAgICAqcF91YiA9IDA7CisgICAgICAgICAgaWYgKHBfc3QgIT0gTlVMTCkKKyAgICAgICAgICAgICpwX3N0ID0gMDsKKyAgICAgICAgfSAvLyBpZgorICAgICAgfSAvLyBjYXNlCisgICAgICBicmVhazsKKworICAgICAgY2FzZSBrbXBfc2NoX2d1aWRlZF9zaW1kOiB7CisgICAgICAgIC8vIHNhbWUgYXMgaXRlcmF0aXZlIGJ1dCBjdXJyLWNodW5rIGFkanVzdGVkIHRvIGJlIG11bHRpcGxlIG9mIGdpdmVuCisgICAgICAgIC8vIGNodW5rCisgICAgICAgIFQgY2h1bmsgPSBwci0+dS5wLnBhcm0xOworICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlZCBrbXBfc2NoX2d1aWRlZF9zaW1kIGNhc2VcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGd0aWQpKTsKKyAgICAgICAgdHJpcCA9IHByLT51LnAudGM7CisgICAgICAgIC8vIFN0YXJ0IGF0b21pYyBwYXJ0IG9mIGNhbGN1bGF0aW9ucworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgIFNUIHJlbWFpbmluZzsgLy8gc2lnbmVkLCBiZWNhdXNlIGNhbiBiZSA8IDAKKyAgICAgICAgICBpbml0ID0gc2gtPnUucy5pdGVyYXRpb247IC8vIHNoYXJlZCB2YWx1ZQorICAgICAgICAgIHJlbWFpbmluZyA9IHRyaXAgLSBpbml0OworICAgICAgICAgIGlmIChyZW1haW5pbmcgPD0gMCkgeyAvLyBBQzogbmVlZCB0byBjb21wYXJlIHdpdGggMCBmaXJzdAorICAgICAgICAgICAgc3RhdHVzID0gMDsgLy8gbm90aGluZyB0byBkbywgZG9uJ3QgdHJ5IGF0b21pYyBvcAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoaW5pdCAlIGNodW5rID09IDApOworICAgICAgICAgIC8vIGNvbXBhcmUgd2l0aCBLKm5wcm9jKihjaHVuaysxKSwgSz0yIGJ5IGRlZmF1bHQKKyAgICAgICAgICBpZiAoKFQpcmVtYWluaW5nIDwgcHItPnUucC5wYXJtMikgeworICAgICAgICAgICAgLy8gdXNlIGR5bmFtaWMtc3R5bGUgc2hjZWR1bGUKKyAgICAgICAgICAgIC8vIGF0b21pY2FsbHkgaW5yZW1lbnQgaXRlcmF0aW9ucywgZ2V0IG9sZCB2YWx1ZQorICAgICAgICAgICAgaW5pdCA9IHRlc3RfdGhlbl9hZGQ8U1Q+KAorICAgICAgICAgICAgICAgIFJDQVNUKHZvbGF0aWxlIFNUICosICZzaC0+dS5zLml0ZXJhdGlvbiksIChTVCljaHVuayk7CisgICAgICAgICAgICByZW1haW5pbmcgPSB0cmlwIC0gaW5pdDsKKyAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPD0gMCkgeworICAgICAgICAgICAgICBzdGF0dXMgPSAwOyAvLyBhbGwgaXRlcmF0aW9ucyBnb3QgYnkgb3RoZXIgdGhyZWFkcworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgLy8gZ290IHNvbWUgaXRlcmF0aW9ucyB0byB3b3JrIG9uCisgICAgICAgICAgICAgIHN0YXR1cyA9IDE7CisgICAgICAgICAgICAgIGlmICgoVClyZW1haW5pbmcgPiBjaHVuaykgeworICAgICAgICAgICAgICAgIGxpbWl0ID0gaW5pdCArIGNodW5rIC0gMTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsYXN0ID0gMTsgLy8gdGhlIGxhc3QgY2h1bmsKKyAgICAgICAgICAgICAgICBsaW1pdCA9IGluaXQgKyByZW1haW5pbmcgLSAxOworICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgLy8gZGl2aWRlIGJ5IEsqbnByb2MKKyAgICAgICAgICBVVCBzcGFuID0gcmVtYWluaW5nICogKCooZG91YmxlICopJnByLT51LnAucGFybTMpOworICAgICAgICAgIFVUIHJlbSA9IHNwYW4gJSBjaHVuazsKKyAgICAgICAgICBpZiAocmVtKSAvLyBhZGp1c3Qgc28gdGhhdCBzcGFuJWNodW5rID09IDAKKyAgICAgICAgICAgIHNwYW4gKz0gY2h1bmsgLSByZW07CisgICAgICAgICAgbGltaXQgPSBpbml0ICsgc3BhbjsKKyAgICAgICAgICBpZiAoY29tcGFyZV9hbmRfc3dhcDxTVD4oUkNBU1Qodm9sYXRpbGUgU1QgKiwgJnNoLT51LnMuaXRlcmF0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNUKWluaXQsIChTVClsaW1pdCkpIHsKKyAgICAgICAgICAgIC8vIENBUyB3YXMgc3VjY2Vzc2Z1bCwgY2h1bmsgb2J0YWluZWQKKyAgICAgICAgICAgIHN0YXR1cyA9IDE7CisgICAgICAgICAgICAtLWxpbWl0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfSAvLyBpZgorICAgICAgICB9IC8vIHdoaWxlCisgICAgICAgIGlmIChzdGF0dXMgIT0gMCkgeworICAgICAgICAgIHN0YXJ0ID0gcHItPnUucC5sYjsKKyAgICAgICAgICBpbmNyID0gcHItPnUucC5zdDsKKyAgICAgICAgICBpZiAocF9zdCAhPSBOVUxMKQorICAgICAgICAgICAgKnBfc3QgPSBpbmNyOworICAgICAgICAgICpwX2xiID0gc3RhcnQgKyBpbml0ICogaW5jcjsKKyAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQgKiBpbmNyOworICAgICAgICAgIGlmIChwci0+b3JkZXJlZCkgeworICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyID0gaW5pdDsKKyAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IGxpbWl0OworI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgeworICAgICAgICAgICAgICBjb25zdCBjaGFyICpidWZmOworICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyZWRfbG93ZXI6JSUlcyBvcmRlcmVkX3VwcGVyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PFVUPjo6c3BlYywgdHJhaXRzX3Q8VVQ+OjpzcGVjKTsKKyAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKGJ1ZmYsIGd0aWQsIHByLT51LnAub3JkZXJlZF9sb3dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlcikpOworICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSgmYnVmZik7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICB9IC8vIGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKnBfbGIgPSAwOworICAgICAgICAgICpwX3ViID0gMDsKKyAgICAgICAgICBpZiAocF9zdCAhPSBOVUxMKQorICAgICAgICAgICAgKnBfc3QgPSAwOworICAgICAgICB9IC8vIGlmCisgICAgICB9IC8vIGNhc2UKKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZDogeworICAgICAgICBUIGNodW5rc3BlYyA9IHByLT51LnAucGFybTE7CisgICAgICAgIFVUIGNodW5rSWR4OworI2lmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4NgorICAgICAgICAvKiBmb3Igc3RvcmluZyBvcmlnaW5hbCBGUENXIHZhbHVlIGZvciBXaW5kb3dzKiBPUyBvbgorICAgICAgICAgICBJQS0zMiBhcmNoaXRlY3R1cmUgOC1ieXRlIHZlcnNpb24gKi8KKyAgICAgICAgdW5zaWduZWQgaW50IG9sZEZwY3c7CisgICAgICAgIHVuc2lnbmVkIGludCBmcGN3U2V0ID0gMDsKKyNlbmRpZgorICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlZCBrbXBfc2NoX2d1aWRlZF9jaHVua2VkICIKKyAgICAgICAgICAgICAgICAgICAgICAgImFuYWx5dGljYWwgY2FzZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCkpOworCisgICAgICAgIHRyaXAgPSBwci0+dS5wLnRjOworCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGgtPnRoLnRoX3RlYW1fbnByb2MgPiAxKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgoMlVMICogY2h1bmtzcGVjICsgMSkgKiAoVVQpdGgtPnRoLnRoX3RlYW1fbnByb2MgPAorICAgICAgICAgICAgICAgICAgICAgICAgIHRyaXApOworCisgICAgICAgIHdoaWxlICgxKSB7IC8qIHRoaXMgd2hpbGUgbG9vcCBpcyBhIHNhZmVndWFyZCBhZ2FpbnN0IHVuZXhwZWN0ZWQgemVybworICAgICAgICAgICAgICAgICAgICAgICBjaHVuayBzaXplcyAqLworICAgICAgICAgIGNodW5rSWR4ID0gdGVzdF90aGVuX2luY19hY3E8U1Q+KCh2b2xhdGlsZSBTVCAqKSZzaC0+dS5zLml0ZXJhdGlvbik7CisgICAgICAgICAgaWYgKGNodW5rSWR4ID49IChVVClwci0+dS5wLnBhcm0yKSB7CisgICAgICAgICAgICAtLXRyaXA7CisgICAgICAgICAgICAvKiB1c2UgZHluYW1pYy1zdHlsZSBzY2hlZHVsaW5nICovCisgICAgICAgICAgICBpbml0ID0gY2h1bmtJZHggKiBjaHVua3NwZWMgKyBwci0+dS5wLmNvdW50OworICAgICAgICAgICAgLyogbmVlZCB0byB2ZXJpZnkgaW5pdCA+IDAgaW4gY2FzZSBvZiBvdmVyZmxvdyBpbiB0aGUgYWJvdmUKKyAgICAgICAgICAgICAqIGNhbGN1bGF0aW9uICovCisgICAgICAgICAgICBpZiAoKHN0YXR1cyA9IChpbml0ID4gMCAmJiBpbml0IDw9IHRyaXApKSAhPSAwKSB7CisgICAgICAgICAgICAgIGxpbWl0ID0gaW5pdCArIGNodW5rc3BlYyAtIDE7CisKKyAgICAgICAgICAgICAgaWYgKChsYXN0ID0gKGxpbWl0ID49IHRyaXApKSAhPSAwKQorICAgICAgICAgICAgICAgIGxpbWl0ID0gdHJpcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0gZWxzZSB7CisvKiB1c2UgZXhwb25lbnRpYWwtc3R5bGUgc2NoZWR1bGluZyAqLworLyogVGhlIGZvbGxvd2luZyBjaGVjayBpcyB0byB3b3JrYXJvdW5kIHRoZSBsYWNrIG9mIGxvbmcgZG91YmxlIHByZWNpc2lvbiBvbgorICAgV2luZG93cyogT1MuCisgICBUaGlzIGNoZWNrIHdvcmtzIGFyb3VuZCB0aGUgcG9zc2libGUgZWZmZWN0IHRoYXQgaW5pdCAhPSAwIGZvciBjaHVua0lkeCA9PSAwLgorICovCisjaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2CisgICAgICAgICAgICAvKiBJZiB3ZSBoYXZlbid0IGFscmVhZHkgZG9uZSBzbywgc2F2ZSBvcmlnaW5hbCBGUENXIGFuZCBzZXQKKyAgICAgICAgICAgICAgIHByZWNpc2lvbiB0byA2NC1iaXQsIGFzIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZQorICAgICAgICAgICAgICAgZGVmYXVsdHMgdG8gNTMtYml0ICovCisgICAgICAgICAgICBpZiAoIWZwY3dTZXQpIHsKKyAgICAgICAgICAgICAgb2xkRnBjdyA9IF9jb250cm9sODcoMCwgMCk7CisgICAgICAgICAgICAgIF9jb250cm9sODcoX1BDXzY0LCBfTUNXX1BDKTsKKyAgICAgICAgICAgICAgZnBjd1NldCA9IDB4MzAwMDA7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIGlmIChjaHVua0lkeCkgeworICAgICAgICAgICAgICBpbml0ID0gX19rbXBfZGlzcGF0Y2hfZ3VpZGVkX3JlbWFpbmluZzxUPigKKyAgICAgICAgICAgICAgICAgIHRyaXAsICooREJMICopJnByLT51LnAucGFybTMsIGNodW5rSWR4KTsKKyAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChpbml0KTsKKyAgICAgICAgICAgICAgaW5pdCA9IHRyaXAgLSBpbml0OworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgIGluaXQgPSAwOworICAgICAgICAgICAgbGltaXQgPSB0cmlwIC0gX19rbXBfZGlzcGF0Y2hfZ3VpZGVkX3JlbWFpbmluZzxUPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlwLCAqKERCTCAqKSZwci0+dS5wLnBhcm0zLCBjaHVua0lkeCArIDEpOworICAgICAgICAgICAgS01QX0FTU0VSVChpbml0IDw9IGxpbWl0KTsKKyAgICAgICAgICAgIGlmIChpbml0IDwgbGltaXQpIHsKKyAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChsaW1pdCA8PSB0cmlwKTsKKyAgICAgICAgICAgICAgLS1saW1pdDsKKyAgICAgICAgICAgICAgc3RhdHVzID0gMTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgfSAvLyBpZgorICAgICAgICB9IC8vIHdoaWxlICgxKQorI2lmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4NgorICAgICAgICAvKiByZXN0b3JlIEZQQ1cgaWYgbmVjZXNzYXJ5CisgICAgICAgICAgIEFDOiBjaGVjayBmcGN3U2V0IGZsYWcgZmlyc3QgYmVjYXVzZSBvbGRGcGN3IGNhbiBiZSB1bmluaXRpYWxpemVkCisgICAgICAgICAgIGhlcmUgKi8KKyAgICAgICAgaWYgKGZwY3dTZXQgJiYgKG9sZEZwY3cgJiBmcGN3U2V0KSkKKyAgICAgICAgICBfY29udHJvbDg3KG9sZEZwY3csIF9NQ1dfUEMpOworI2VuZGlmCisgICAgICAgIGlmIChzdGF0dXMgIT0gMCkgeworICAgICAgICAgIHN0YXJ0ID0gcHItPnUucC5sYjsKKyAgICAgICAgICBpbmNyID0gcHItPnUucC5zdDsKKyAgICAgICAgICBpZiAocF9zdCAhPSBOVUxMKQorICAgICAgICAgICAgKnBfc3QgPSBpbmNyOworICAgICAgICAgICpwX2xiID0gc3RhcnQgKyBpbml0ICogaW5jcjsKKyAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQgKiBpbmNyOworICAgICAgICAgIGlmIChwci0+b3JkZXJlZCkgeworICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyID0gaW5pdDsKKyAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IGxpbWl0OworI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgeworICAgICAgICAgICAgICBjb25zdCBjaGFyICpidWZmOworICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGVyZWRfbG93ZXI6JSUlcyBvcmRlcmVkX3VwcGVyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PFVUPjo6c3BlYywgdHJhaXRzX3Q8VVQ+OjpzcGVjKTsKKyAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKGJ1ZmYsIGd0aWQsIHByLT51LnAub3JkZXJlZF9sb3dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlcikpOworICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSgmYnVmZik7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKnBfbGIgPSAwOworICAgICAgICAgICpwX3ViID0gMDsKKyAgICAgICAgICBpZiAocF9zdCAhPSBOVUxMKQorICAgICAgICAgICAgKnBfc3QgPSAwOworICAgICAgICB9CisgICAgICB9IC8vIGNhc2UKKyAgICAgIGJyZWFrOworCisgICAgICBjYXNlIGttcF9zY2hfdHJhcGV6b2lkYWw6IHsKKyAgICAgICAgVVQgaW5kZXg7CisgICAgICAgIFQgcGFybTIgPSBwci0+dS5wLnBhcm0yOworICAgICAgICBUIHBhcm0zID0gcHItPnUucC5wYXJtMzsKKyAgICAgICAgVCBwYXJtNCA9IHByLT51LnAucGFybTQ7CisgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyVkIGttcF9zY2hfdHJhcGV6b2lkYWwgY2FzZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCkpOworCisgICAgICAgIGluZGV4ID0gdGVzdF90aGVuX2luYzxTVD4oKHZvbGF0aWxlIFNUICopJnNoLT51LnMuaXRlcmF0aW9uKTsKKworICAgICAgICBpbml0ID0gKGluZGV4ICogKCgyICogcGFybTIpIC0gKGluZGV4IC0gMSkgKiBwYXJtNCkpIC8gMjsKKyAgICAgICAgdHJpcCA9IHByLT51LnAudGMgLSAxOworCisgICAgICAgIGlmICgoc3RhdHVzID0gKChUKWluZGV4IDwgcGFybTMgJiYgaW5pdCA8PSB0cmlwKSkgPT0gMCkgeworICAgICAgICAgICpwX2xiID0gMDsKKyAgICAgICAgICAqcF91YiA9IDA7CisgICAgICAgICAgaWYgKHBfc3QgIT0gTlVMTCkKKyAgICAgICAgICAgICpwX3N0ID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzdGFydCA9IHByLT51LnAubGI7CisgICAgICAgICAgbGltaXQgPSAoKGluZGV4ICsgMSkgKiAoMiAqIHBhcm0yIC0gaW5kZXggKiBwYXJtNCkpIC8gMiAtIDE7CisgICAgICAgICAgaW5jciA9IHByLT51LnAuc3Q7CisKKyAgICAgICAgICBpZiAoKGxhc3QgPSAobGltaXQgPj0gdHJpcCkpICE9IDApCisgICAgICAgICAgICBsaW1pdCA9IHRyaXA7CisKKyAgICAgICAgICBpZiAocF9zdCAhPSBOVUxMKQorICAgICAgICAgICAgKnBfc3QgPSBpbmNyOworCisgICAgICAgICAgaWYgKGluY3IgPT0gMSkgeworICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQ7CisgICAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpwX2xiID0gc3RhcnQgKyBpbml0ICogaW5jcjsKKyAgICAgICAgICAgICpwX3ViID0gc3RhcnQgKyBsaW1pdCAqIGluY3I7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHByLT5vcmRlcmVkKSB7CisgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSBpbml0OworICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX3VwcGVyID0gbGltaXQ7CisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZmY7CisgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8VVQ+OjpzcGVjLCB0cmFpdHNfdDxVVD46OnNwZWMpOworICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoYnVmZiwgZ3RpZCwgcHItPnUucC5vcmRlcmVkX2xvd2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX3VwcGVyKSk7CisgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCZidWZmKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgfSAvLyBpZgorICAgICAgfSAvLyBjYXNlCisgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgc3RhdHVzID0gMDsgLy8gdG8gYXZvaWQgY29tcGxhaW50cyBvbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlIHVzZQorICAgICAgICBfX2ttcF9tc2coa21wX21zX2ZhdGFsLCAvLyBTZXZlcml0eQorICAgICAgICAgICAgICAgICAgS01QX01TRyhVbmtub3duU2NoZWRUeXBlRGV0ZWN0ZWQpLCAvLyBQcmltYXJ5IG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgIEtNUF9ITlQoR2V0TmV3ZXJMaWJyYXJ5KSwgLy8gSGludAorICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwgLy8gVmFyaWFkaWMgYXJndW1lbnQgbGlzdCB0ZXJtaW5hdG9yCisgICAgICAgICAgICAgICAgICApOworICAgICAgfSBicmVhazsKKyAgICAgIH0gLy8gc3dpdGNoCisgICAgfSAvLyBpZiB0YyA9PSAwOworCisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICBVVCBudW1fZG9uZTsKKworICAgICAgbnVtX2RvbmUgPSB0ZXN0X3RoZW5faW5jPFNUPigodm9sYXRpbGUgU1QgKikmc2gtPnUucy5udW1fZG9uZSk7CisjaWZkZWYgS01QX0RFQlVHCisgICAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZmY7CisgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyUlZCBpbmNyZW1lbnQgbnVtX2RvbmU6JSUlc1xuIiwKKyAgICAgICAgICAgIHRyYWl0c190PFVUPjo6c3BlYyk7CisgICAgICAgIEtEX1RSQUNFKDEwMCwgKGJ1ZmYsIGd0aWQsIHNoLT51LnMubnVtX2RvbmUpKTsKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoJmJ1ZmYpOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIGlmICgoU1QpbnVtX2RvbmUgPT0gdGgtPnRoLnRoX3RlYW1fbnByb2MgLSAxKSB7CisjaWYgKEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRCkKKyAgICAgICAgaWYgKHByLT5zY2hlZHVsZSA9PSBrbXBfc2NoX3N0YXRpY19zdGVhbCAmJgorICAgICAgICAgICAgdHJhaXRzX3Q8VD46OnR5cGVfc2l6ZSA+IDQpIHsKKyAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICBrbXBfaW5mb190ICoqb3RoZXJfdGhyZWFkcyA9IHRlYW0tPnQudF90aHJlYWRzOworICAgICAgICAgIC8vIGxvb3AgY29tcGxldGUsIHNhZmUgdG8gZGVzdHJveSBsb2NrcyB1c2VkIGZvciBzdGVhbGluZworICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aC0+dGgudGhfdGVhbV9ucHJvYzsgKytpKSB7CisgICAgICAgICAgICBrbXBfbG9ja190ICpsY2sgPSBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9kaXNwYXRjaC0+dGhfc3RlYWxfbG9jazsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQobGNrICE9IE5VTEwpOworICAgICAgICAgICAgX19rbXBfZGVzdHJveV9sb2NrKGxjayk7CisgICAgICAgICAgICBfX2ttcF9mcmVlKGxjayk7CisgICAgICAgICAgICBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9kaXNwYXRjaC0+dGhfc3RlYWxfbG9jayA9IE5VTEw7CisgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgLyogTk9URTogcmVsZWFzZSB0aGlzIGJ1ZmZlciB0byBiZSByZXVzZWQgKi8KKworICAgICAgICBLTVBfTUIoKTsgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgICAgICBzaC0+dS5zLm51bV9kb25lID0gMDsKKyAgICAgICAgc2gtPnUucy5pdGVyYXRpb24gPSAwOworCisgICAgICAgIC8qIFRPRE8gcmVwbGFjZSB3aXRoIGdlbmVyYWwgcmVsZWFzZSBwcm9jZWR1cmU/ICovCisgICAgICAgIGlmIChwci0+b3JkZXJlZCkgeworICAgICAgICAgIHNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24gPSAwOworICAgICAgICB9CisKKyAgICAgICAgS01QX01CKCk7IC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAgICAgc2gtPmJ1ZmZlcl9pbmRleCArPSBfX2ttcF9kaXNwYXRjaF9udW1fYnVmZmVyczsKKyAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJWQgY2hhbmdlIGJ1ZmZlcl9pbmRleDolZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgc2gtPmJ1ZmZlcl9pbmRleCkpOworCisgICAgICAgIEtNUF9NQigpOyAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICB9IC8vIGlmCisgICAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgIGlmIChwci0+cHVzaGVkX3dzICE9IGN0X25vbmUpIHsKKyAgICAgICAgICBwci0+cHVzaGVkX3dzID0gX19rbXBfcG9wX3dvcmtzaGFyZShndGlkLCBwci0+cHVzaGVkX3dzLCBsb2MpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGVvX2ZjbiA9IE5VTEw7CisgICAgICB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2R4b19mY24gPSBOVUxMOworICAgICAgdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9zaF9jdXJyZW50ID0gTlVMTDsKKyAgICAgIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfcHJfY3VycmVudCA9IE5VTEw7CisgICAgfSAvLyBpZiAoc3RhdHVzID09IDApCisjaWYgS01QX09TX1dJTkRPV1MKKyAgICBlbHNlIGlmIChsYXN0KSB7CisgICAgICBwci0+dS5wLmxhc3RfdXBwZXIgPSBwci0+dS5wLnViOworICAgIH0KKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworICAgIGlmIChwX2xhc3QgIT0gTlVMTCAmJiBzdGF0dXMgIT0gMCkKKyAgICAgICpwX2xhc3QgPSBsYXN0OworICB9IC8vIGlmCisKKyNpZmRlZiBLTVBfREVCVUcKKyAgeworICAgIGNvbnN0IGNoYXIgKmJ1ZmY7CisgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyUlZCBub3JtYWwgY2FzZTogIgorICAgICAgICAicF9sYjolJSVzIHBfdWI6JSUlcyBwX3N0OiUlJXMgcF9sYXN0OiUlcCAgcmV0dXJuaW5nOiUlZFxuIiwKKyAgICAgICAgdHJhaXRzX3Q8VD46OnNwZWMsIHRyYWl0c190PFQ+OjpzcGVjLCB0cmFpdHNfdDxTVD46OnNwZWMpOworICAgIEtEX1RSQUNFKDEwLCAoYnVmZiwgZ3RpZCwgKnBfbGIsICpwX3ViLCBwX3N0ID8gKnBfc3QgOiAwLCBwX2xhc3QsIHN0YXR1cykpOworICAgIF9fa21wX3N0cl9mcmVlKCZidWZmKTsKKyAgfQorI2VuZGlmCisjaWYgSU5DTFVERV9TU0NfTUFSS1MKKyAgU1NDX01BUktfRElTUEFUQ0hfTkVYVCgpOworI2VuZGlmCisgIE9NUFRfTE9PUF9FTkQ7CisgIHJldHVybiBzdGF0dXM7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIHZvaWQgX19rbXBfZGlzdF9nZXRfYm91bmRzKGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyICpwbGFzdGl0ZXIsIFQgKnBsb3dlciwgVCAqcHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHRyYWl0c190PFQ+OjpzaWduZWRfdCBpbmNyKSB7CisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8VD46OnVuc2lnbmVkX3QgVVQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8VD46OnNpZ25lZF90IFNUOworICBrbXBfdWludDMyIHRlYW1faWQ7CisgIGttcF91aW50MzIgbnRlYW1zOworICBVVCB0cmlwX2NvdW50OworICBrbXBfdGVhbV90ICp0ZWFtOworICBrbXBfaW5mb190ICp0aDsKKworICBLTVBfREVCVUdfQVNTRVJUKHBsYXN0aXRlciAmJiBwbG93ZXIgJiYgcHVwcGVyKTsKKyAgS0VfVFJBQ0UoMTAsICgiX19rbXBjX2Rpc3RfZ2V0X2JvdW5kcyBjYWxsZWQgKCVkKVxuIiwgZ3RpZCkpOworI2lmZGVmIEtNUF9ERUJVRworICB7CisgICAgY29uc3QgY2hhciAqYnVmZjsKKyAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgiX19rbXBjX2Rpc3RfZ2V0X2JvdW5kczogVCMlJWQgbGl0ZXI9JSVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXRlcj0oJSUlcywgJSUlcywgJSUlcykgc2lnbmVkPzwlcz5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8VD46OnNwZWMsIHRyYWl0c190PFQ+OjpzcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PFNUPjo6c3BlYywgdHJhaXRzX3Q8VD46OnNwZWMpOworICAgIEtEX1RSQUNFKDEwMCwgKGJ1ZmYsIGd0aWQsICpwbGFzdGl0ZXIsICpwbG93ZXIsICpwdXBwZXIsIGluY3IpKTsKKyAgICBfX2ttcF9zdHJfZnJlZSgmYnVmZik7CisgIH0KKyNlbmRpZgorCisgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICBpZiAoaW5jciA9PSAwKSB7CisgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3Qoa21wX2kxOG5fbXNnX0Nuc0xvb3BJbmNyWmVyb1Byb2hpYml0ZWQsIGN0X3BkbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MpOworICAgIH0KKyAgICBpZiAoaW5jciA+IDAgPyAoKnB1cHBlciA8ICpwbG93ZXIpIDogKCpwbG93ZXIgPCAqcHVwcGVyKSkgeworICAgICAgLy8gVGhlIGxvb3AgaXMgaWxsZWdhbC4KKyAgICAgIC8vIFNvbWUgemVyby10cmlwIGxvb3BzIG1haW50YWluZWQgYnkgY29tcGlsZXIsIGUuZy46CisgICAgICAvLyAgIGZvcihpPTEwO2k8MDsrK2kpIC8vIGxvd2VyID49IHVwcGVyIC0gcnVuLXRpbWUgY2hlY2sKKyAgICAgIC8vICAgZm9yKGk9MDtpPjEwOy0taSkgLy8gbG93ZXIgPD0gdXBwZXIgLSBydW4tdGltZSBjaGVjaworICAgICAgLy8gICBmb3IoaT0wO2k+MTA7KytpKSAvLyBpbmNyID4gMCAgICAgICAtIGNvbXBpbGUtdGltZSBjaGVjaworICAgICAgLy8gICBmb3IoaT0xMDtpPDA7LS1pKSAvLyBpbmNyIDwgMCAgICAgICAtIGNvbXBpbGUtdGltZSBjaGVjaworICAgICAgLy8gQ29tcGlsZXIgZG9lcyBub3QgY2hlY2sgdGhlIGZvbGxvd2luZyBpbGxlZ2FsIGxvb3BzOgorICAgICAgLy8gICBmb3IoaT0wO2k8MTA7aSs9aW5jcikgLy8gd2hlcmUgaW5jcjwwCisgICAgICAvLyAgIGZvcihpPTEwO2k+MDtpLT1pbmNyKSAvLyB3aGVyZSBpbmNyPDAKKyAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdChrbXBfaTE4bl9tc2dfQ25zTG9vcEluY3JJbGxlZ2FsLCBjdF9wZG8sIGxvYyk7CisgICAgfQorICB9CisgIHRoID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgdGVhbSA9IHRoLT50aC50aF90ZWFtOworI2lmIE9NUF80MF9FTkFCTEVECisgIEtNUF9ERUJVR19BU1NFUlQodGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayk7IC8vIHdlIGFyZSBpbiB0aGUgdGVhbXMgY29uc3RydWN0CisgIG50ZWFtcyA9IHRoLT50aC50aF90ZWFtc19zaXplLm50ZWFtczsKKyNlbmRpZgorICB0ZWFtX2lkID0gdGVhbS0+dC50X21hc3Rlcl90aWQ7CisgIEtNUF9ERUJVR19BU1NFUlQobnRlYW1zID09IHRlYW0tPnQudF9wYXJlbnQtPnQudF9ucHJvYyk7CisKKyAgLy8gY29tcHV0ZSBnbG9iYWwgdHJpcCBjb3VudAorICBpZiAoaW5jciA9PSAxKSB7CisgICAgdHJpcF9jb3VudCA9ICpwdXBwZXIgLSAqcGxvd2VyICsgMTsKKyAgfSBlbHNlIGlmIChpbmNyID09IC0xKSB7CisgICAgdHJpcF9jb3VudCA9ICpwbG93ZXIgLSAqcHVwcGVyICsgMTsKKyAgfSBlbHNlIGlmIChpbmNyID4gMCkgeworICAgIC8vIHVwcGVyLWxvd2VyIGNhbiBleGNlZWQgdGhlIGxpbWl0IG9mIHNpZ25lZCB0eXBlCisgICAgdHJpcF9jb3VudCA9IChVVCkoKnB1cHBlciAtICpwbG93ZXIpIC8gaW5jciArIDE7CisgIH0gZWxzZSB7CisgICAgdHJpcF9jb3VudCA9IChVVCkoKnBsb3dlciAtICpwdXBwZXIpIC8gKC1pbmNyKSArIDE7CisgIH0KKworICBpZiAodHJpcF9jb3VudCA8PSBudGVhbXMpIHsKKyAgICBLTVBfREVCVUdfQVNTRVJUKAorICAgICAgICBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfZ3JlZWR5IHx8CisgICAgICAgIF9fa21wX3N0YXRpYyA9PQorICAgICAgICAgICAga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQpOyAvLyBVbmtub3duIHN0YXRpYyBzY2hlZHVsaW5nIHR5cGUuCisgICAgLy8gb25seSBzb21lIHRlYW1zIGdldCBzaW5nbGUgaXRlcmF0aW9uLCBvdGhlcnMgZ2V0IG5vdGhpbmcKKyAgICBpZiAodGVhbV9pZCA8IHRyaXBfY291bnQpIHsKKyAgICAgICpwdXBwZXIgPSAqcGxvd2VyID0gKnBsb3dlciArIHRlYW1faWQgKiBpbmNyOworICAgIH0gZWxzZSB7CisgICAgICAqcGxvd2VyID0gKnB1cHBlciArIGluY3I7IC8vIHplcm8tdHJpcCBsb29wCisgICAgfQorICAgIGlmIChwbGFzdGl0ZXIgIT0gTlVMTCkKKyAgICAgICpwbGFzdGl0ZXIgPSAodGVhbV9pZCA9PSB0cmlwX2NvdW50IC0gMSk7CisgIH0gZWxzZSB7CisgICAgaWYgKF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZCkgeworICAgICAgVVQgY2h1bmsgPSB0cmlwX2NvdW50IC8gbnRlYW1zOworICAgICAgVVQgZXh0cmFzID0gdHJpcF9jb3VudCAlIG50ZWFtczsKKyAgICAgICpwbG93ZXIgKz0KKyAgICAgICAgICBpbmNyICogKHRlYW1faWQgKiBjaHVuayArICh0ZWFtX2lkIDwgZXh0cmFzID8gdGVhbV9pZCA6IGV4dHJhcykpOworICAgICAgKnB1cHBlciA9ICpwbG93ZXIgKyBjaHVuayAqIGluY3IgLSAodGVhbV9pZCA8IGV4dHJhcyA/IDAgOiBpbmNyKTsKKyAgICAgIGlmIChwbGFzdGl0ZXIgIT0gTlVMTCkKKyAgICAgICAgKnBsYXN0aXRlciA9ICh0ZWFtX2lkID09IG50ZWFtcyAtIDEpOworICAgIH0gZWxzZSB7CisgICAgICBUIGNodW5rX2luY19jb3VudCA9CisgICAgICAgICAgKHRyaXBfY291bnQgLyBudGVhbXMgKyAoKHRyaXBfY291bnQgJSBudGVhbXMpID8gMSA6IDApKSAqIGluY3I7CisgICAgICBUIHVwcGVyID0gKnB1cHBlcjsKKyAgICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2dyZWVkeSk7CisgICAgICAvLyBVbmtub3duIHN0YXRpYyBzY2hlZHVsaW5nIHR5cGUuCisgICAgICAqcGxvd2VyICs9IHRlYW1faWQgKiBjaHVua19pbmNfY291bnQ7CisgICAgICAqcHVwcGVyID0gKnBsb3dlciArIGNodW5rX2luY19jb3VudCAtIGluY3I7CisgICAgICAvLyBDaGVjay9jb3JyZWN0IGJvdW5kcyBpZiBuZWVkZWQKKyAgICAgIGlmIChpbmNyID4gMCkgeworICAgICAgICBpZiAoKnB1cHBlciA8ICpwbG93ZXIpCisgICAgICAgICAgKnB1cHBlciA9IHRyYWl0c190PFQ+OjptYXhfdmFsdWU7CisgICAgICAgIGlmIChwbGFzdGl0ZXIgIT0gTlVMTCkKKyAgICAgICAgICAqcGxhc3RpdGVyID0gKnBsb3dlciA8PSB1cHBlciAmJiAqcHVwcGVyID4gdXBwZXIgLSBpbmNyOworICAgICAgICBpZiAoKnB1cHBlciA+IHVwcGVyKQorICAgICAgICAgICpwdXBwZXIgPSB1cHBlcjsgLy8gdHJhY2tlciBDNzMyNTgKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgqcHVwcGVyID4gKnBsb3dlcikKKyAgICAgICAgICAqcHVwcGVyID0gdHJhaXRzX3Q8VD46Om1pbl92YWx1ZTsKKyAgICAgICAgaWYgKHBsYXN0aXRlciAhPSBOVUxMKQorICAgICAgICAgICpwbGFzdGl0ZXIgPSAqcGxvd2VyID49IHVwcGVyICYmICpwdXBwZXIgPCB1cHBlciAtIGluY3I7CisgICAgICAgIGlmICgqcHVwcGVyIDwgdXBwZXIpCisgICAgICAgICAgKnB1cHBlciA9IHVwcGVyOyAvLyB0cmFja2VyIEM3MzI1OAorICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEaXNwYXRjaCByb3V0aW5lcworLy8gICAgVHJhbnNmZXIgY2FsbCB0byB0ZW1wbGF0ZTwgdHlwZSBUID4KKy8vICAgIF9fa21wX2Rpc3BhdGNoX2luaXQoIGlkZW50X3QgKmxvYywgaW50IGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIFQgbGIsIFQgdWIsIFNUIHN0LCBTVCBjaHVuayApCitleHRlcm4gIkMiIHsKKworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0B7CitAcGFyYW0gbG9jIFNvdXJjZSBsb2NhdGlvbgorQHBhcmFtIGd0aWQgR2xvYmFsIHRocmVhZCBpZAorQHBhcmFtIHNjaGVkdWxlIFNjaGVkdWxlIHR5cGUKK0BwYXJhbSBsYiAgTG93ZXIgYm91bmQKK0BwYXJhbSB1YiAgVXBwZXIgYm91bmQKK0BwYXJhbSBzdCAgU3RlcCAob3IgaW5jcmVtZW50IGlmIHlvdSBwcmVmZXIpCitAcGFyYW0gY2h1bmsgVGhlIGNodW5rIHNpemUgdG8gYmxvY2sgd2l0aAorCitUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIHRoZSBydW50aW1lIHRvIHN0YXJ0IGEgZHluYW1pY2FsbHkgc2NoZWR1bGVkIGZvciBsb29wLAorc2F2aW5nIHRoZSBsb29wIGFyZ3VtZW50cy4KK1RoZXNlIGZ1bmN0aW9ucyBhcmUgYWxsIGlkZW50aWNhbCBhcGFydCBmcm9tIHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzLgorKi8KKwordm9pZCBfX2ttcGNfZGlzcGF0Y2hfaW5pdF80KGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLCBrbXBfaW50MzIgbGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIHViLCBrbXBfaW50MzIgc3QsIGttcF9pbnQzMiBjaHVuaykgeworICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2luaXRfc2VyaWFsKTsKKyAgX19rbXBfZGlzcGF0Y2hfaW5pdDxrbXBfaW50MzI+KGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLCB0cnVlKTsKK30KKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2luaXRfNAorKi8KK3ZvaWQgX19rbXBjX2Rpc3BhdGNoX2luaXRfNHUoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLCBrbXBfdWludDMyIGxiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDMyIHViLCBrbXBfaW50MzIgc3QsIGttcF9pbnQzMiBjaHVuaykgeworICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2luaXRfc2VyaWFsKTsKKyAgX19rbXBfZGlzcGF0Y2hfaW5pdDxrbXBfdWludDMyPihsb2MsIGd0aWQsIHNjaGVkdWxlLCBsYiwgdWIsIHN0LCBjaHVuaywgdHJ1ZSk7Cit9CisKKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2luaXRfNAorKi8KK3ZvaWQgX19rbXBjX2Rpc3BhdGNoX2luaXRfOChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwga21wX2ludDY0IGxiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCB1Yiwga21wX2ludDY0IHN0LCBrbXBfaW50NjQgY2h1bmspIHsKKyAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9pbml0X3NlcmlhbCk7CisgIF9fa21wX2Rpc3BhdGNoX2luaXQ8a21wX2ludDY0Pihsb2MsIGd0aWQsIHNjaGVkdWxlLCBsYiwgdWIsIHN0LCBjaHVuaywgdHJ1ZSk7Cit9CisKKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2luaXRfNAorKi8KK3ZvaWQgX19rbXBjX2Rpc3BhdGNoX2luaXRfOHUoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLCBrbXBfdWludDY0IGxiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDY0IHViLCBrbXBfaW50NjQgc3QsIGttcF9pbnQ2NCBjaHVuaykgeworICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2luaXRfc2VyaWFsKTsKKyAgX19rbXBfZGlzcGF0Y2hfaW5pdDxrbXBfdWludDY0Pihsb2MsIGd0aWQsIHNjaGVkdWxlLCBsYiwgdWIsIHN0LCBjaHVuaywgdHJ1ZSk7Cit9CisKKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2luaXRfNAorCitEaWZmZXJlbmNlIGZyb20gX19rbXBjX2Rpc3BhdGNoX2luaXQgc2V0IG9mIGZ1bmN0aW9ucyBpcyB0aGVzZSBmdW5jdGlvbnMKK2FyZSBjYWxsZWQgZm9yIGNvbXBvc2l0ZSBkaXN0cmlidXRlIHBhcmFsbGVsIGZvciBjb25zdHJ1Y3QuIFRodXMgYmVmb3JlCityZWd1bGFyIGl0ZXJhdGlvbnMgZGlzcGF0Y2hpbmcgd2UgbmVlZCB0byBjYWxjIHBlci10ZWFtIGl0ZXJhdGlvbiBzcGFjZS4KKworVGhlc2UgZnVuY3Rpb25zIGFyZSBhbGwgaWRlbnRpY2FsIGFwYXJ0IGZyb20gdGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMuCisqLwordm9pZCBfX2ttcGNfZGlzdF9kaXNwYXRjaF9pbml0XzQoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwga21wX2ludDMyICpwX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbGIsIGttcF9pbnQzMiB1Yiwga21wX2ludDMyIHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGNodW5rKSB7CisgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfaW5pdF9zZXJpYWwpOworICBfX2ttcF9kaXN0X2dldF9ib3VuZHM8a21wX2ludDMyPihsb2MsIGd0aWQsIHBfbGFzdCwgJmxiLCAmdWIsIHN0KTsKKyAgX19rbXBfZGlzcGF0Y2hfaW5pdDxrbXBfaW50MzI+KGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLCB0cnVlKTsKK30KKwordm9pZCBfX2ttcGNfZGlzdF9kaXNwYXRjaF9pbml0XzR1KGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLCBrbXBfaW50MzIgKnBfbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDMyIGxiLCBrbXBfdWludDMyIHViLCBrbXBfaW50MzIgc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGNodW5rKSB7CisgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfaW5pdF9zZXJpYWwpOworICBfX2ttcF9kaXN0X2dldF9ib3VuZHM8a21wX3VpbnQzMj4obG9jLCBndGlkLCBwX2xhc3QsICZsYiwgJnViLCBzdCk7CisgIF9fa21wX2Rpc3BhdGNoX2luaXQ8a21wX3VpbnQzMj4obG9jLCBndGlkLCBzY2hlZHVsZSwgbGIsIHViLCBzdCwgY2h1bmssIHRydWUpOworfQorCit2b2lkIF9fa21wY19kaXN0X2Rpc3BhdGNoX2luaXRfOChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLCBrbXBfaW50MzIgKnBfbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCBsYiwga21wX2ludDY0IHViLCBrbXBfaW50NjQgc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgY2h1bmspIHsKKyAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9pbml0X3NlcmlhbCk7CisgIF9fa21wX2Rpc3RfZ2V0X2JvdW5kczxrbXBfaW50NjQ+KGxvYywgZ3RpZCwgcF9sYXN0LCAmbGIsICZ1Yiwgc3QpOworICBfX2ttcF9kaXNwYXRjaF9pbml0PGttcF9pbnQ2ND4obG9jLCBndGlkLCBzY2hlZHVsZSwgbGIsIHViLCBzdCwgY2h1bmssIHRydWUpOworfQorCit2b2lkIF9fa21wY19kaXN0X2Rpc3BhdGNoX2luaXRfOHUoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsIGttcF9pbnQzMiAqcF9sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgbGIsIGttcF91aW50NjQgdWIsIGttcF9pbnQ2NCBzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgY2h1bmspIHsKKyAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9pbml0X3NlcmlhbCk7CisgIF9fa21wX2Rpc3RfZ2V0X2JvdW5kczxrbXBfdWludDY0Pihsb2MsIGd0aWQsIHBfbGFzdCwgJmxiLCAmdWIsIHN0KTsKKyAgX19rbXBfZGlzcGF0Y2hfaW5pdDxrbXBfdWludDY0Pihsb2MsIGd0aWQsIHNjaGVkdWxlLCBsYiwgdWIsIHN0LCBjaHVuaywgdHJ1ZSk7Cit9CisKKy8qIQorQHBhcmFtIGxvYyBTb3VyY2UgY29kZSBsb2NhdGlvbgorQHBhcmFtIGd0aWQgR2xvYmFsIHRocmVhZCBpZAorQHBhcmFtIHBfbGFzdCBQb2ludGVyIHRvIGEgZmxhZyBzZXQgdG8gb25lIGlmIHRoaXMgaXMgdGhlIGxhc3QgY2h1bmsgb3IgemVybworb3RoZXJ3aXNlCitAcGFyYW0gcF9sYiAgIFBvaW50ZXIgdG8gdGhlIGxvd2VyIGJvdW5kIGZvciB0aGUgbmV4dCBjaHVuayBvZiB3b3JrCitAcGFyYW0gcF91YiAgIFBvaW50ZXIgdG8gdGhlIHVwcGVyIGJvdW5kIGZvciB0aGUgbmV4dCBjaHVuayBvZiB3b3JrCitAcGFyYW0gcF9zdCAgIFBvaW50ZXIgdG8gdGhlIHN0cmlkZSBmb3IgdGhlIG5leHQgY2h1bmsgb2Ygd29yaworQHJldHVybiBvbmUgaWYgdGhlcmUgaXMgd29yayB0byBiZSBkb25lLCB6ZXJvIG90aGVyd2lzZQorCitHZXQgdGhlIG5leHQgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGNodW5rIG9mIHdvcmsgZm9yIHRoaXMgdGhyZWFkLgorSWYgdGhlcmUgaXMgbm8gbW9yZSB3b3JrLCB0aGVuIHRoZSBsYix1YiBhbmQgc3RyaWRlIG5lZWQgbm90IGJlIG1vZGlmaWVkLgorKi8KK2ludCBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80KGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiAqcF9sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyICpwX2xiLCBrbXBfaW50MzIgKnBfdWIsIGttcF9pbnQzMiAqcF9zdCkgeworICByZXR1cm4gX19rbXBfZGlzcGF0Y2hfbmV4dDxrbXBfaW50MzI+KGxvYywgZ3RpZCwgcF9sYXN0LCBwX2xiLCBwX3ViLCBwX3N0KTsKK30KKworLyohCitTZWUgQHJlZiBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80CisqLworaW50IF9fa21wY19kaXNwYXRjaF9uZXh0XzR1KGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiAqcF9sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50MzIgKnBfbGIsIGttcF91aW50MzIgKnBfdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyICpwX3N0KSB7CisgIHJldHVybiBfX2ttcF9kaXNwYXRjaF9uZXh0PGttcF91aW50MzI+KGxvYywgZ3RpZCwgcF9sYXN0LCBwX2xiLCBwX3ViLCBwX3N0KTsKK30KKworLyohCitTZWUgQHJlZiBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80CisqLworaW50IF9fa21wY19kaXNwYXRjaF9uZXh0XzgoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyICpwX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgKnBfbGIsIGttcF9pbnQ2NCAqcF91Yiwga21wX2ludDY0ICpwX3N0KSB7CisgIHJldHVybiBfX2ttcF9kaXNwYXRjaF9uZXh0PGttcF9pbnQ2ND4obG9jLCBndGlkLCBwX2xhc3QsIHBfbGIsIHBfdWIsIHBfc3QpOworfQorCisvKiEKK1NlZSBAcmVmIF9fa21wY19kaXNwYXRjaF9uZXh0XzQKKyovCitpbnQgX19rbXBjX2Rpc3BhdGNoX25leHRfOHUoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyICpwX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQ2NCAqcF9sYiwga21wX3VpbnQ2NCAqcF91YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgKnBfc3QpIHsKKyAgcmV0dXJuIF9fa21wX2Rpc3BhdGNoX25leHQ8a21wX3VpbnQ2ND4obG9jLCBndGlkLCBwX2xhc3QsIHBfbGIsIHBfdWIsIHBfc3QpOworfQorCisvKiEKK0BwYXJhbSBsb2MgU291cmNlIGNvZGUgbG9jYXRpb24KK0BwYXJhbSBndGlkIEdsb2JhbCB0aHJlYWQgaWQKKworTWFyayB0aGUgZW5kIG9mIGEgZHluYW1pYyBsb29wLgorKi8KK3ZvaWQgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfNChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkKSB7CisgIF9fa21wX2Rpc3BhdGNoX2ZpbmlzaDxrbXBfdWludDMyPihndGlkLCBsb2MpOworfQorCisvKiEKK1NlZSBAcmVmIF9fa21wY19kaXNwYXRjaF9maW5pXzQKKyovCit2b2lkIF9fa21wY19kaXNwYXRjaF9maW5pXzgoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCkgeworICBfX2ttcF9kaXNwYXRjaF9maW5pc2g8a21wX3VpbnQ2ND4oZ3RpZCwgbG9jKTsKK30KKworLyohCitTZWUgQHJlZiBfX2ttcGNfZGlzcGF0Y2hfZmluaV80CisqLwordm9pZCBfX2ttcGNfZGlzcGF0Y2hfZmluaV80dShpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkKSB7CisgIF9fa21wX2Rpc3BhdGNoX2ZpbmlzaDxrbXBfdWludDMyPihndGlkLCBsb2MpOworfQorCisvKiEKK1NlZSBAcmVmIF9fa21wY19kaXNwYXRjaF9maW5pXzQKKyovCit2b2lkIF9fa21wY19kaXNwYXRjaF9maW5pXzh1KGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQpIHsKKyAgX19rbXBfZGlzcGF0Y2hfZmluaXNoPGttcF91aW50NjQ+KGd0aWQsIGxvYyk7Cit9CisvKiEgQH0gKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTm9uLXRlbXBsYXRlIHJvdXRpbmVzIGZyb20ga21wX2Rpc3BhdGNoLmNwcCB1c2VkIGluIG90aGVyIHNvdXJjZXMKKwora21wX3VpbnQzMiBfX2ttcF9lcV80KGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlcikgeworICByZXR1cm4gdmFsdWUgPT0gY2hlY2tlcjsKK30KKwora21wX3VpbnQzMiBfX2ttcF9uZXFfNChrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIpIHsKKyAgcmV0dXJuIHZhbHVlICE9IGNoZWNrZXI7Cit9CisKK2ttcF91aW50MzIgX19rbXBfbHRfNChrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIpIHsKKyAgcmV0dXJuIHZhbHVlIDwgY2hlY2tlcjsKK30KKwora21wX3VpbnQzMiBfX2ttcF9nZV80KGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlcikgeworICByZXR1cm4gdmFsdWUgPj0gY2hlY2tlcjsKK30KKwora21wX3VpbnQzMiBfX2ttcF9sZV80KGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlcikgeworICByZXR1cm4gdmFsdWUgPD0gY2hlY2tlcjsKK30KKwora21wX3VpbnQzMgorX19rbXBfd2FpdF95aWVsZF80KHZvbGF0aWxlIGttcF91aW50MzIgKnNwaW5uZXIsIGttcF91aW50MzIgY2hlY2tlciwKKyAgICAgICAgICAgICAgICAgICBrbXBfdWludDMyICgqcHJlZCkoa21wX3VpbnQzMiwga21wX3VpbnQzMiksCisgICAgICAgICAgICAgICAgICAgdm9pZCAqb2JqIC8vIEhpZ2hlci1sZXZlbCBzeW5jaHJvbml6YXRpb24gb2JqZWN0LCBvciBOVUxMLgorICAgICAgICAgICAgICAgICAgICkgeworICAvLyBub3RlOiB3ZSBtYXkgbm90IGJlbG9uZyB0byBhIHRlYW0gYXQgdGhpcyBwb2ludAorICB2b2xhdGlsZSBrbXBfdWludDMyICpzcGluID0gc3Bpbm5lcjsKKyAga21wX3VpbnQzMiBjaGVjayA9IGNoZWNrZXI7CisgIGttcF91aW50MzIgc3BpbnM7CisgIGttcF91aW50MzIgKCpmKShrbXBfdWludDMyLCBrbXBfdWludDMyKSA9IHByZWQ7CisgIGttcF91aW50MzIgcjsKKworICBLTVBfRlNZTkNfU1BJTl9JTklUKG9iaiwgQ0NBU1Qoa21wX3VpbnQzMiAqLCBzcGluKSk7CisgIEtNUF9JTklUX1lJRUxEKHNwaW5zKTsKKyAgLy8gbWFpbiB3YWl0IHNwaW4gbG9vcAorICB3aGlsZSAoIWYociA9IFRDUl80KCpzcGluKSwgY2hlY2spKSB7CisgICAgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRShvYmopOworICAgIC8qIEdFSCAtIHJlbW92ZSB0aGlzIHNpbmNlIGl0IHdhcyBhY2NpZGVudGFsbHkgaW50cm9kdWNlZCB3aGVuIGttcF93YWl0IHdhcworICAgICAgIHNwbGl0LiBJdCBjYXVzZXMgcHJvYmxlbXMgd2l0aCBpbmZpbml0ZSByZWN1cnNpb24gYmVjYXVzZSBvZiBleGl0IGxvY2sgKi8KKyAgICAvKiBpZiAoIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgJiYgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCkKKyAgICAgICAgX19rbXBfYWJvcnRfdGhyZWFkKCk7ICovCisKKyAgICAvKiBpZiB3ZSBoYXZlIHdhaXRlZCBhIGJpdCwgb3IgYXJlIG92ZXJzdWJzY3JpYmVkLCB5aWVsZCAqLworICAgIC8qIHBhdXNlIGlzIGluIHRoZSBmb2xsb3dpbmcgY29kZSAqLworICAgIEtNUF9ZSUVMRChUQ1JfNChfX2ttcF9udGgpID4gX19rbXBfYXZhaWxfcHJvYyk7CisgICAgS01QX1lJRUxEX1NQSU4oc3BpbnMpOworICB9CisgIEtNUF9GU1lOQ19TUElOX0FDUVVJUkVEKG9iaik7CisgIHJldHVybiByOworfQorCit2b2lkIF9fa21wX3dhaXRfeWllbGRfNF9wdHIoCisgICAgdm9pZCAqc3Bpbm5lciwga21wX3VpbnQzMiBjaGVja2VyLCBrbXBfdWludDMyICgqcHJlZCkodm9pZCAqLCBrbXBfdWludDMyKSwKKyAgICB2b2lkICpvYmogLy8gSGlnaGVyLWxldmVsIHN5bmNocm9uaXphdGlvbiBvYmplY3QsIG9yIE5VTEwuCisgICAgKSB7CisgIC8vIG5vdGU6IHdlIG1heSBub3QgYmVsb25nIHRvIGEgdGVhbSBhdCB0aGlzIHBvaW50CisgIHZvaWQgKnNwaW4gPSBzcGlubmVyOworICBrbXBfdWludDMyIGNoZWNrID0gY2hlY2tlcjsKKyAga21wX3VpbnQzMiBzcGluczsKKyAga21wX3VpbnQzMiAoKmYpKHZvaWQgKiwga21wX3VpbnQzMikgPSBwcmVkOworCisgIEtNUF9GU1lOQ19TUElOX0lOSVQob2JqLCBzcGluKTsKKyAgS01QX0lOSVRfWUlFTEQoc3BpbnMpOworICAvLyBtYWluIHdhaXQgc3BpbiBsb29wCisgIHdoaWxlICghZihzcGluLCBjaGVjaykpIHsKKyAgICBLTVBfRlNZTkNfU1BJTl9QUkVQQVJFKG9iaik7CisgICAgLyogaWYgd2UgaGF2ZSB3YWl0ZWQgYSBiaXQsIG9yIGFyZSBvdmVyc3Vic2NyaWJlZCwgeWllbGQgKi8KKyAgICAvKiBwYXVzZSBpcyBpbiB0aGUgZm9sbG93aW5nIGNvZGUgKi8KKyAgICBLTVBfWUlFTEQoVENSXzQoX19rbXBfbnRoKSA+IF9fa21wX2F2YWlsX3Byb2MpOworICAgIEtNUF9ZSUVMRF9TUElOKHNwaW5zKTsKKyAgfQorICBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRChvYmopOworfQorCit9IC8vIGV4dGVybiAiQyIKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorCit2b2lkIF9fa21wX2F1eF9kaXNwYXRjaF9pbml0XzQoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsIGttcF9pbnQzMiBsYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgdWIsIGttcF9pbnQzMiBzdCwga21wX2ludDMyIGNodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwdXNoX3dzKSB7CisgIF9fa21wX2Rpc3BhdGNoX2luaXQ8a21wX2ludDMyPihsb2MsIGd0aWQsIHNjaGVkdWxlLCBsYiwgdWIsIHN0LCBjaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hfd3MpOworfQorCit2b2lkIF9fa21wX2F1eF9kaXNwYXRjaF9pbml0XzR1KGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwga21wX3VpbnQzMiBsYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiB1Yiwga21wX2ludDMyIHN0LCBrbXBfaW50MzIgY2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwdXNoX3dzKSB7CisgIF9fa21wX2Rpc3BhdGNoX2luaXQ8a21wX3VpbnQzMj4obG9jLCBndGlkLCBzY2hlZHVsZSwgbGIsIHViLCBzdCwgY2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaF93cyk7Cit9CisKK3ZvaWQgX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfOChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwga21wX2ludDY0IGxiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCB1Yiwga21wX2ludDY0IHN0LCBrbXBfaW50NjQgY2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHB1c2hfd3MpIHsKKyAgX19rbXBfZGlzcGF0Y2hfaW5pdDxrbXBfaW50NjQ+KGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaF93cyk7Cit9CisKK3ZvaWQgX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfOHUoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLCBrbXBfdWludDY0IGxiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDY0IHViLCBrbXBfaW50NjQgc3QsIGttcF9pbnQ2NCBjaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHB1c2hfd3MpIHsKKyAgX19rbXBfZGlzcGF0Y2hfaW5pdDxrbXBfdWludDY0Pihsb2MsIGd0aWQsIHNjaGVkdWxlLCBsYiwgdWIsIHN0LCBjaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoX3dzKTsKK30KKwordm9pZCBfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua180KGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQpIHsKKyAgX19rbXBfZGlzcGF0Y2hfZmluaXNoX2NodW5rPGttcF91aW50MzI+KGd0aWQsIGxvYyk7Cit9CisKK3ZvaWQgX19rbXBfYXV4X2Rpc3BhdGNoX2ZpbmlfY2h1bmtfOChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkKSB7CisgIF9fa21wX2Rpc3BhdGNoX2ZpbmlzaF9jaHVuazxrbXBfdWludDY0PihndGlkLCBsb2MpOworfQorCit2b2lkIF9fa21wX2F1eF9kaXNwYXRjaF9maW5pX2NodW5rXzR1KGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQpIHsKKyAgX19rbXBfZGlzcGF0Y2hfZmluaXNoX2NodW5rPGttcF91aW50MzI+KGd0aWQsIGxvYyk7Cit9CisKK3ZvaWQgX19rbXBfYXV4X2Rpc3BhdGNoX2ZpbmlfY2h1bmtfOHUoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCkgeworICBfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bms8a21wX3VpbnQ2ND4oZ3RpZCwgbG9jKTsKK30KKworI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9lbnZpcm9ubWVudC5jcHAgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZW52aXJvbm1lbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMTc2YjUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZW52aXJvbm1lbnQuY3BwCkBAIC0wLDAgKzEsNTEyIEBACisvKgorICoga21wX2Vudmlyb25tZW50LmNwcCAtLSBIYW5kbGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIE9TLWluZGVwZW5kZW50bHkuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8qIFdlIHVzZSBHZXRFbnZpcm9ubWVudFZhcmlhYmxlIGZvciBXaW5kb3dzKiBPUyBpbnN0ZWFkIG9mIGdldGVudiBiZWNhdXNlIHRoZQorICAgYWN0IG9mIGxvYWRpbmcgYSBETEwgb24gV2luZG93cyogT1MgbWFrZXMgYW55IHVzZXItc2V0IGVudmlyb25tZW50IHZhcmlhYmxlcworICAgKGkuZS4gd2l0aCBwdXRlbnYoKSkgdW5hdmFpbGFibGUuICBnZXRlbnYoKSBhcHBhcmVudGx5IGdldHMgYSBjbGVhbiBjb3B5IG9mCisgICB0aGUgZW52IHZhcmlhYmxlcyBhcyB0aGV5IGV4aXN0ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBydW4uIEpIIDEyLzIzLzIwMDIKKworICAgT24gV2luZG93cyogT1MsIHRoZXJlIGFyZSB0d28gZW52aXJvbm1lbnRzIChhdCBsZWFzdCwgc2VlIGJlbG93KToKKworICAgMS4gRW52aXJvbm1lbnQgbWFpbnRhaW5lZCBieSBXaW5kb3dzKiBPUyBvbiBJQS0zMiBhcmNoaXRlY3R1cmUuIEFjY2Vzc2libGUKKyAgICAgIHRocm91Z2ggR2V0RW52aXJvbm1lbnRWYXJpYWJsZSgpLCBTZXRFbnZpcm9ubWVudFZhcmlhYmxlKCksIGFuZAorICAgICAgR2V0RW52aXJvbm1lbnRTdHJpbmdzKCkuCisKKyAgIDIuIEVudmlyb25tZW50IG1haW50YWluZWQgYnkgQyBSVEwuIEFjY2Vzc2libGUgdGhyb3VnaCBnZXRlbnYoKSwgcHV0ZW52KCkuCisKKyAgIHB1dGVudigpIGZ1bmN0aW9uIHVwZGF0ZXMgYm90aCBDIGFuZCBXaW5kb3dzKiBPUyBvbiBJQS0zMiBhcmNoaXRlY3R1cmUuCisgICBnZXRlbnYoKSBmdW5jdGlvbiBzZWFyY2ggZm9yIHZhcmlhYmxlcyBpbiBDIFJUTCBlbnZpcm9ubWVudCBvbmx5LgorICAgV2luZG93cyogT1Mgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGZ1bmN0aW9ucyB3b3JrICpvbmx5KiB3aXRoIFdpbmRvd3MqIE9TIG9uCisgICBJQS0zMiBhcmNoaXRlY3R1cmUuCisKKyAgIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBtYWludGFpbmVkIGJ5IE9TLCBzbyB0aGVyZSBpcyBhbHdheXMgb25seQorICAgb25lIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBwZXIgcHJvY2Vzcy4gQ2hhbmdlcyBpbiBXaW5kb3dzKiBPUyBvbgorICAgSUEtMzIgYXJjaGl0ZWN0dXJlIGFyZSBwcm9jZXNzLXZpc2libGUuCisKKyAgIEMgZW52aXJvbm1lbnQgbWFpbnRhaW5lZCBieSBDIFJUTC4gTXVsdGlwbGUgY29waWVzIG9mIEMgUlRMIG1heSBiZSBwcmVzZW50CisgICBpbiB0aGUgcHJvY2VzcywgYW5kIGVhY2ggQyBSVEwgbWFpbnRhaW5zIGl0cyBvd24gZW52aXJvbm1lbnQuIDotKAorCisgICBUaHVzLCBwcm9wZXIgd2F5IHRvIHdvcmsgd2l0aCBlbnZpcm9ubWVudCBvbiBXaW5kb3dzKiBPUyBpczoKKworICAgMS4gU2V0IHZhcmlhYmxlcyB3aXRoIHB1dGVudigpIGZ1bmN0aW9uIC0tIGJvdGggQyBhbmQgV2luZG93cyogT1Mgb24gSUEtMzIKKyAgICAgIGFyY2hpdGVjdHVyZSBhcmUgYmVpbmcgdXBkYXRlZC4gV2luZG93cyogT1Mgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIG1heSBiZQorICAgICAgY29uc2lkZXJlZCBwcmltYXJ5IHRhcmdldCwgd2hpbGUgdXBkYXRpbmcgQyBSVEwgZW52aXJvbm1lbnQgaXMgZnJlZSBib251cy4KKworICAgMi4gR2V0IHZhcmlhYmxlcyB3aXRoIEdldEVudmlyb25tZW50VmFyaWFibGUoKSAtLSBnZXRlbnYoKSBkb2VzIG5vdAorICAgICAgc2VhcmNoIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZSwgYW5kIGNhbiBub3Qgc2VlIHZhcmlhYmxlcworICAgICAgc2V0IHdpdGggU2V0RW52aXJvbm1lbnRWYXJpYWJsZSgpLgorCisgICAyMDA3LTA0LTA1IC0tIGxldgorKi8KKworI2luY2x1ZGUgImttcF9lbnZpcm9ubWVudC5oIgorCisjaW5jbHVkZSAia21wLmgiIC8vCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfb3MuaCIgLy8gS01QX09TXyouCisjaW5jbHVkZSAia21wX3N0ci5oIiAvLyBfX2ttcF9zdHJfKigpLgorCisjaWYgS01QX09TX1VOSVgKKyNpbmNsdWRlIDxzdGRsaWIuaD4gLy8gZ2V0ZW52LCBzZXRlbnYsIHVuc2V0ZW52LgorI2luY2x1ZGUgPHN0cmluZy5oPiAvLyBzdHJsZW4sIHN0cmNweS4KKyNpZiBLTVBfT1NfREFSV0lOCisjaW5jbHVkZSA8Y3J0X2V4dGVybnMuaD4KKyNkZWZpbmUgZW52aXJvbiAoKl9OU0dldEVudmlyb24oKSkKKyNlbHNlCitleHRlcm4gY2hhciAqKmVudmlyb247CisjZW5kaWYKKyNlbGlmIEtNUF9PU19XSU5ET1dTCisjaW5jbHVkZSA8d2luZG93cy5oPiAvLyBHZXRFbnZpcm9ubWVudFZhcmlhYmxlLCBTZXRFbnZpcm9ubWVudFZhcmlhYmxlLAorLy8gR2V0TGFzdEVycm9yLgorI2Vsc2UKKyNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TLgorI2VuZGlmCisKKy8vIFRPRE86IEVsaW1pbmF0ZSBkaXJlY3QgbWVtb3J5IGFsbG9jYXRpb25zLCB1c2Ugc3RyaW5nIG9wZXJhdGlvbnMgaW5zdGVhZC4KKworc3RhdGljIGlubGluZSB2b2lkICphbGxvY2F0ZShzaXplX3Qgc2l6ZSkgeworICB2b2lkICpwdHIgPSBLTVBfSU5URVJOQUxfTUFMTE9DKHNpemUpOworICBpZiAocHRyID09IE5VTEwpIHsKKyAgICBLTVBfRkFUQUwoTWVtb3J5QWxsb2NGYWlsZWQpOworICB9OyAvLyBpZgorICByZXR1cm4gcHRyOworfSAvLyBhbGxvY2F0ZQorCitjaGFyICpfX2ttcF9lbnZfZ2V0KGNoYXIgY29uc3QgKm5hbWUpIHsKKworICBjaGFyICpyZXN1bHQgPSBOVUxMOworCisjaWYgS01QX09TX1VOSVgKKyAgY2hhciBjb25zdCAqdmFsdWUgPSBnZXRlbnYobmFtZSk7CisgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CisgICAgc2l6ZV90IGxlbiA9IEtNUF9TVFJMRU4odmFsdWUpICsgMTsKKyAgICByZXN1bHQgPSAoY2hhciAqKUtNUF9JTlRFUk5BTF9NQUxMT0MobGVuKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgIEtNUF9GQVRBTChNZW1vcnlBbGxvY0ZhaWxlZCk7CisgICAgfTsgLy8gaWYKKyAgICBLTVBfU1RSTkNQWV9TKHJlc3VsdCwgbGVuLCB2YWx1ZSwgbGVuKTsKKyAgfTsgLy8gaWYKKyNlbGlmIEtNUF9PU19XSU5ET1dTCisgIC8qIFdlIHVzZSBHZXRFbnZpcm9ubWVudFZhcmlhYmxlIGZvciBXaW5kb3dzKiBPUyBpbnN0ZWFkIG9mIGdldGVudiBiZWNhdXNlIHRoZQorICAgICBhY3Qgb2YgbG9hZGluZyBhIERMTCBvbiBXaW5kb3dzKiBPUyBtYWtlcyBhbnkgdXNlci1zZXQgZW52aXJvbm1lbnQKKyAgICAgdmFyaWFibGVzIChpLmUuIHdpdGggcHV0ZW52KCkpIHVuYXZhaWxhYmxlLiBnZXRlbnYoKSBhcHBhcmVudGx5IGdldHMgYQorICAgICBjbGVhbiBjb3B5IG9mIHRoZSBlbnYgdmFyaWFibGVzIGFzIHRoZXkgZXhpc3RlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIHJ1bi4KKyAgICAgSkggMTIvMjMvMjAwMiAqLworICBEV09SRCByYzsKKyAgcmMgPSBHZXRFbnZpcm9ubWVudFZhcmlhYmxlKG5hbWUsIE5VTEwsIDApOworICBpZiAoIXJjKSB7CisgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICBpZiAoZXJyb3IgIT0gRVJST1JfRU5WVkFSX05PVF9GT1VORCkgeworICAgICAgX19rbXBfbXNnKGttcF9tc19mYXRhbCwgS01QX01TRyhDYW50R2V0RW52VmFyLCBuYW1lKSwgS01QX0VSUihlcnJvciksCisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwpOworICAgIH07IC8vIGlmCisgICAgLy8gVmFyaWFibGUgaXMgbm90IGZvdW5kLCBpdCdzIG9rLCBqdXN0IGNvbnRpbnVlLgorICB9IGVsc2UgeworICAgIERXT1JEIGxlbiA9IHJjOworICAgIHJlc3VsdCA9IChjaGFyICopS01QX0lOVEVSTkFMX01BTExPQyhsZW4pOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgS01QX0ZBVEFMKE1lbW9yeUFsbG9jRmFpbGVkKTsKKyAgICB9OyAvLyBpZgorICAgIHJjID0gR2V0RW52aXJvbm1lbnRWYXJpYWJsZShuYW1lLCByZXN1bHQsIGxlbik7CisgICAgaWYgKCFyYykgeworICAgICAgLy8gR2V0RW52aXJvbm1lbnRWYXJpYWJsZSgpIG1heSByZXR1cm4gMCBpZiB2YXJpYWJsZSBpcyBlbXB0eS4KKyAgICAgIC8vIEluIHN1Y2ggYSBjYXNlIEdldExhc3RFcnJvcigpIHJldHVybnMgRVJST1JfU1VDQ0VTUy4KKyAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICBpZiAoZXJyb3IgIT0gRVJST1JfU1VDQ0VTUykgeworICAgICAgICAvLyBVbmV4cGVjdGVkIGVycm9yLiBUaGUgdmFyaWFibGUgc2hvdWxkIGJlIGluIHRoZSBlbnZpcm9ubWVudCwKKyAgICAgICAgLy8gYW5kIGJ1ZmZlciBzaG91bGQgYmUgbGFyZ2UgZW5vdWdoLgorICAgICAgICBfX2ttcF9tc2coa21wX21zX2ZhdGFsLCBLTVBfTVNHKENhbnRHZXRFbnZWYXIsIG5hbWUpLCBLTVBfRVJSKGVycm9yKSwKKyAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsKTsKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoKHZvaWQgKilyZXN1bHQpOworICAgICAgICByZXN1bHQgPSBOVUxMOworICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorICB9OyAvLyBpZgorI2Vsc2UKKyNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TLgorI2VuZGlmCisKKyAgcmV0dXJuIHJlc3VsdDsKKworfSAvLyBmdW5jIF9fa21wX2Vudl9nZXQKKworLy8gVE9ETzogRmluZCBhbmQgcmVwbGFjZSBhbGwgcmVndWxhciBmcmVlKCkgd2l0aCBfX2ttcF9lbnZfZnJlZSgpLgorCit2b2lkIF9fa21wX2Vudl9mcmVlKGNoYXIgY29uc3QgKip2YWx1ZSkgeworCisgIEtNUF9ERUJVR19BU1NFUlQodmFsdWUgIT0gTlVMTCk7CisgIEtNUF9JTlRFUk5BTF9GUkVFKENDQVNUKGNoYXIgKiwgKnZhbHVlKSk7CisgICp2YWx1ZSA9IE5VTEw7CisKK30gLy8gZnVuYyBfX2ttcF9lbnZfZnJlZQorCitpbnQgX19rbXBfZW52X2V4aXN0cyhjaGFyIGNvbnN0ICpuYW1lKSB7CisKKyNpZiBLTVBfT1NfVU5JWAorICBjaGFyIGNvbnN0ICp2YWx1ZSA9IGdldGVudihuYW1lKTsKKyAgcmV0dXJuICgodmFsdWUgPT0gTlVMTCkgPyAoMCkgOiAoMSkpOworI2VsaWYgS01QX09TX1dJTkRPV1MKKyAgRFdPUkQgcmM7CisgIHJjID0gR2V0RW52aXJvbm1lbnRWYXJpYWJsZShuYW1lLCBOVUxMLCAwKTsKKyAgaWYgKHJjID09IDApIHsKKyAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgIGlmIChlcnJvciAhPSBFUlJPUl9FTlZWQVJfTk9UX0ZPVU5EKSB7CisgICAgICBfX2ttcF9tc2coa21wX21zX2ZhdGFsLCBLTVBfTVNHKENhbnRHZXRFbnZWYXIsIG5hbWUpLCBLTVBfRVJSKGVycm9yKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCk7CisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gMDsKKyAgfTsgLy8gaWYKKyAgcmV0dXJuIDE7CisjZWxzZQorI2Vycm9yIFVua25vd24gb3IgdW5zdXBwb3J0ZWQgT1MuCisjZW5kaWYKKworfSAvLyBmdW5jIF9fa21wX2Vudl9leGlzdHMKKwordm9pZCBfX2ttcF9lbnZfc2V0KGNoYXIgY29uc3QgKm5hbWUsIGNoYXIgY29uc3QgKnZhbHVlLCBpbnQgb3ZlcndyaXRlKSB7CisKKyNpZiBLTVBfT1NfVU5JWAorICBpbnQgcmMgPSBzZXRlbnYobmFtZSwgdmFsdWUsIG92ZXJ3cml0ZSk7CisgIGlmIChyYyAhPSAwKSB7CisgICAgLy8gRGVhZCBjb2RlLiBJIHRyaWVkIHRvIHB1dCB0b28gbWFueSB2YXJpYWJsZXMgaW50byBMaW51eCogT1MKKyAgICAvLyBlbnZpcm9ubWVudCBvbiBJQS0zMiBhcmNoaXRlY3R1cmUuIFdoZW4gYXBwbGljYXRpb24gY29uc3VtZXMKKyAgICAvLyBtb3JlIHRoYW4gfjIuNSBHQiBvZiBtZW1vcnksIGVudGlyZSBzeXN0ZW0gZmVlbHMgYmFkLiBTb21ldGltZXMKKyAgICAvLyBhcHBsaWNhdGlvbiBpcyBraWxsZWQgKGJ5IE9TPyksIHNvbWV0aW1lcyBzeXN0ZW0gc3RvcHMKKyAgICAvLyByZXNwb25kaW5nLi4uIEJ1dCB0aGlzIGVycm9yIG1lc3NhZ2UgbmV2ZXIgYXBwZWFycy4gLS1sbgorICAgIF9fa21wX21zZyhrbXBfbXNfZmF0YWwsIEtNUF9NU0coQ2FudFNldEVudlZhciwgbmFtZSksCisgICAgICAgICAgICAgIEtNUF9ITlQoTm90RW5vdWdoTWVtb3J5KSwgX19rbXBfbXNnX251bGwpOworICB9OyAvLyBpZgorI2VsaWYgS01QX09TX1dJTkRPV1MKKyAgQk9PTCByYzsKKyAgaWYgKCFvdmVyd3JpdGUpIHsKKyAgICByYyA9IEdldEVudmlyb25tZW50VmFyaWFibGUobmFtZSwgTlVMTCwgMCk7CisgICAgaWYgKHJjKSB7CisgICAgICAvLyBWYXJpYWJsZSBleGlzdHMsIGRvIG5vdCBvdmVyd3JpdGUuCisgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKyAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgIGlmIChlcnJvciAhPSBFUlJPUl9FTlZWQVJfTk9UX0ZPVU5EKSB7CisgICAgICBfX2ttcF9tc2coa21wX21zX2ZhdGFsLCBLTVBfTVNHKENhbnRHZXRFbnZWYXIsIG5hbWUpLCBLTVBfRVJSKGVycm9yKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCk7CisgICAgfTsgLy8gaWYKKyAgfTsgLy8gaWYKKyAgcmMgPSBTZXRFbnZpcm9ubWVudFZhcmlhYmxlKG5hbWUsIHZhbHVlKTsKKyAgaWYgKCFyYykgeworICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgX19rbXBfbXNnKGttcF9tc19mYXRhbCwgS01QX01TRyhDYW50U2V0RW52VmFyLCBuYW1lKSwgS01QX0VSUihlcnJvciksCisgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsKTsKKyAgfTsgLy8gaWYKKyNlbHNlCisjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUy4KKyNlbmRpZgorCit9IC8vIGZ1bmMgX19rbXBfZW52X3NldAorCit2b2lkIF9fa21wX2Vudl91bnNldChjaGFyIGNvbnN0ICpuYW1lKSB7CisKKyNpZiBLTVBfT1NfVU5JWAorICB1bnNldGVudihuYW1lKTsKKyNlbGlmIEtNUF9PU19XSU5ET1dTCisgIEJPT0wgcmMgPSBTZXRFbnZpcm9ubWVudFZhcmlhYmxlKG5hbWUsIE5VTEwpOworICBpZiAoIXJjKSB7CisgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICBfX2ttcF9tc2coa21wX21zX2ZhdGFsLCBLTVBfTVNHKENhbnRTZXRFbnZWYXIsIG5hbWUpLCBLTVBfRVJSKGVycm9yKSwKKyAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwpOworICB9OyAvLyBpZgorI2Vsc2UKKyNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TLgorI2VuZGlmCisKK30gLy8gZnVuYyBfX2ttcF9lbnZfdW5zZXQKKworLyogSW50ZWwgT3Blbk1QIFJUTCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgZW52aXJvbm1lbnQ6IGp1c3QgYSBzdHJpbmcgb2YKKyAgIGNoYXJhY3RlcnMsIHZhcmlhYmxlcyBhcmUgc2VwYXJhdGVkIHdpdGggdmVydGljYWwgYmFycywgZS4gZy46CisKKyAgICAgICAgIktNUF9XQVJOSU5HUz0wfEtNUF9BRkZJTklUWT1jb21wYWN0fCIKKworICAgIEVtcHR5IHZhcmlhYmxlcyBhcmUgYWxsb3dlZCBhbmQgaWdub3JlZDoKKworICAgICAgICAifHxLTVBfV0FSTklOR1M9MXx8IgorKi8KKworc3RhdGljIHZvaWQKK19fX2ttcF9lbnZfYmxrX3BhcnNlX3N0cmluZyhrbXBfZW52X2Jsa190ICpibG9jaywgLy8gTTogRW52IGJsb2NrIHRvIGZpbGwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqZW52IC8vIEk6IFN0cmluZyB0byBwYXJzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKKworICBjaGFyIGNvbnN0IGNocl9kZWxpbWl0ZXIgPSAnfCc7CisgIGNoYXIgY29uc3Qgc3RyX2RlbGltaXRlcltdID0ge2Nocl9kZWxpbWl0ZXIsIDB9OworCisgIGNoYXIgKmJ1bGsgPSBOVUxMOworICBrbXBfZW52X3Zhcl90ICp2YXJzID0gTlVMTDsKKyAgaW50IGNvdW50ID0gMDsgLy8gTnVtYmVyIG9mIHVzZWQgZWxlbWVudHMgaW4gdmFycyBhcnJheS4KKyAgaW50IGRlbGltaXRlcnMgPSAwOyAvLyBOdW1iZXIgb2YgZGVsaW1pdGVycyBpbiBpbnB1dCBzdHJpbmcuCisKKyAgLy8gQ29weSBvcmlnaW5hbCBzdHJpbmcsIHdlIHdpbGwgbW9kaWZ5IHRoZSBjb3B5LgorICBidWxrID0gX19rbXBfc3RyX2Zvcm1hdCgiJXMiLCBlbnYpOworCisgIC8vIExvb3AgdGhydSBhbGwgdGhlIHZhcnMgaW4gZW52aXJvbm1lbnQgYmxvY2suIENvdW50IGRlbGltaXRlcnMgKG1heGltdW0KKyAgLy8gbnVtYmVyIG9mIHZhcmlhYmxlcyBpcyBudW1iZXIgb2YgZGVsaW1pdGVycyBwbHVzIG9uZSkuCisgIHsKKyAgICBjaGFyIGNvbnN0ICpwdHIgPSBidWxrOworICAgIGZvciAoOzspIHsKKyAgICAgIHB0ciA9IHN0cmNocihwdHIsIGNocl9kZWxpbWl0ZXIpOworICAgICAgaWYgKHB0ciA9PSBOVUxMKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfTsgLy8gaWYKKyAgICAgICsrZGVsaW1pdGVyczsKKyAgICAgIHB0ciArPSAxOworICAgIH07IC8vIGZvcmV2ZXIKKyAgfQorCisgIC8vIEFsbG9jYXRlIHZhcnMgYXJyYXkuCisgIHZhcnMgPSAoa21wX2Vudl92YXJfdCAqKWFsbG9jYXRlKChkZWxpbWl0ZXJzICsgMSkgKiBzaXplb2Yoa21wX2Vudl92YXJfdCkpOworCisgIC8vIExvb3AgdGhydSBhbGwgdGhlIHZhcmlhYmxlcy4KKyAgeworICAgIGNoYXIgKnZhcjsgLy8gUG9pbnRlciB0byB2YXJpYWJsZSAoYm90aCBuYW1lIGFuZCB2YWx1ZSkuCisgICAgY2hhciAqbmFtZTsgLy8gUG9pbnRlciB0byBuYW1lIG9mIHZhcmlhYmxlLgorICAgIGNoYXIgKnZhbHVlOyAvLyBQb2ludGVyIHRvIHZhbHVlLgorICAgIGNoYXIgKmJ1ZjsgLy8gQnVmZmVyIGZvciBfX2ttcF9zdHJfdG9rZW4oKSBmdW5jdGlvbi4KKyAgICB2YXIgPSBfX2ttcF9zdHJfdG9rZW4oYnVsaywgc3RyX2RlbGltaXRlciwgJmJ1Zik7IC8vIEdldCB0aGUgZmlyc3QgdmFyLgorICAgIHdoaWxlICh2YXIgIT0gTlVMTCkgeworICAgICAgLy8gU2F2ZSBmb3VuZCB2YXJpYWJsZSBpbiB2YXJzIGFycmF5LgorICAgICAgX19rbXBfc3RyX3NwbGl0KHZhciwgJz0nLCAmbmFtZSwgJnZhbHVlKTsKKyAgICAgIEtNUF9ERUJVR19BU1NFUlQoY291bnQgPCBkZWxpbWl0ZXJzICsgMSk7CisgICAgICB2YXJzW2NvdW50XS5uYW1lID0gbmFtZTsKKyAgICAgIHZhcnNbY291bnRdLnZhbHVlID0gdmFsdWU7CisgICAgICArK2NvdW50OworICAgICAgLy8gR2V0IHRoZSBuZXh0IHZhci4KKyAgICAgIHZhciA9IF9fa21wX3N0cl90b2tlbihOVUxMLCBzdHJfZGVsaW1pdGVyLCAmYnVmKTsKKyAgICB9OyAvLyB3aGlsZQorICB9CisKKyAgLy8gRmlsbCBvdXQgcmVzdWx0LgorICBibG9jay0+YnVsayA9IGJ1bGs7CisgIGJsb2NrLT52YXJzID0gdmFyczsKKyAgYmxvY2stPmNvdW50ID0gY291bnQ7CisKK307IC8vIF9fX2ttcF9lbnZfYmxrX3BhcnNlX3N0cmluZworCisvKiBXaW5kb3dzKiBPUyAoYWN0dWFsbHksIERPUykgZW52aXJvbm1lbnQgYmxvY2sgaXMgYSBwaWVjZSBvZiBtZW1vcnkgd2l0aAorICAgZW52aXJvbm1lbnQgdmFyaWFibGVzLiBFYWNoIHZhcmlhYmxlIGlzIHRlcm1pbmF0ZWQgd2l0aCB6ZXJvIGJ5dGUsIGVudGlyZQorICAgYmxvY2sgaXMgdGVybWluYXRlZCB3aXRoIG9uZSBleHRyYSB6ZXJvIGJ5dGUsIHNvIHdlIGhhdmUgdHdvIHplcm8gYnl0ZXMgYXQKKyAgIHRoZSBlbmQgb2YgZW52aXJvbm1lbnQgYmxvY2ssIGUuIGcuOgorCisgICAgICAgICJIT01FPUM6XFx1c2Vyc1xcbGV2XHgwME9TPVdpbmRvd3NfTlRceDAwXHgwMCIKKworICAgIEl0IGlzIG5vdCBjbGVhciBob3cgZW1wdHkgZW52aXJvbm1lbnQgaXMgcmVwcmVzZW50ZWQuICJceDAwXHgwMCI/CisqLworCisjaWYgS01QX09TX1dJTkRPV1MKK3N0YXRpYyB2b2lkIF9fX2ttcF9lbnZfYmxrX3BhcnNlX3dpbmRvd3MoCisgICAga21wX2Vudl9ibGtfdCAqYmxvY2ssIC8vIE06IEVudiBibG9jayB0byBmaWxsLgorICAgIGNoYXIgY29uc3QgKmVudiAvLyBJOiBQb2ludGVyIHRvIFdpbmRvd3MqIE9TIChET1MpIGVudmlyb25tZW50IGJsb2NrLgorICAgICkgeworCisgIGNoYXIgKmJ1bGsgPSBOVUxMOworICBrbXBfZW52X3Zhcl90ICp2YXJzID0gTlVMTDsKKyAgaW50IGNvdW50ID0gMDsgLy8gTnVtYmVyIG9mIHVzZWQgZWxlbWVudHMgaW4gdmFycyBhcnJheS4KKyAgaW50IHNpemUgPSAwOyAvLyBTaXplIG9mIGJ1bGsuCisKKyAgY2hhciAqbmFtZTsgLy8gUG9pbnRlciB0byBuYW1lIG9mIHZhcmlhYmxlLgorICBjaGFyICp2YWx1ZTsgLy8gUG9pbnRlciB0byB2YWx1ZS4KKworICBpZiAoZW52ICE9IE5VTEwpIHsKKworICAgIC8vIExvb3AgdGhydSBhbGwgdGhlIHZhcnMgaW4gZW52aXJvbm1lbnQgYmxvY2suIENvdW50IHZhcmlhYmxlcywgZmluZCBzaXplCisgICAgLy8gb2YgYmxvY2suCisgICAgeworICAgICAgY2hhciBjb25zdCAqdmFyOyAvLyBQb2ludGVyIHRvIGJlZ2lubmluZyBvZiB2YXIuCisgICAgICBpbnQgbGVuOyAvLyBMZW5ndGggb2YgdmFyaWFibGUuCisgICAgICBjb3VudCA9IDA7CisgICAgICB2YXIgPQorICAgICAgICAgIGVudjsgLy8gVGhlIGZpcnN0IHZhcmlhYmxlIHN0YXJ0cyBhbmQgYmVnaW5uaW5nIG9mIGVudmlyb25tZW50IGJsb2NrLgorICAgICAgbGVuID0gS01QX1NUUkxFTih2YXIpOworICAgICAgd2hpbGUgKGxlbiAhPSAwKSB7CisgICAgICAgICsrY291bnQ7CisgICAgICAgIHNpemUgPSBzaXplICsgbGVuICsgMTsKKyAgICAgICAgdmFyID0gdmFyICsgbGVuICsKKyAgICAgICAgICAgICAgMTsgLy8gTW92ZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgdmFyaWFibGUuCisgICAgICAgIGxlbiA9IEtNUF9TVFJMRU4odmFyKTsKKyAgICAgIH07IC8vIHdoaWxlCisgICAgICBzaXplID0KKyAgICAgICAgICBzaXplICsgMTsgLy8gVG90YWwgc2l6ZSBvZiBlbnYgYmxvY2ssIGluY2x1ZGluZyB0ZXJtaW5hdGluZyB6ZXJvIGJ5dGUuCisgICAgfQorCisgICAgLy8gQ29weSBvcmlnaW5hbCBibG9jayB0byBidWxrLCB3ZSB3aWxsIG1vZGlmeSBidWxrLCBub3Qgb3JpZ2luYWwgYmxvY2suCisgICAgYnVsayA9IChjaGFyICopYWxsb2NhdGUoc2l6ZSk7CisgICAgS01QX01FTUNQWV9TKGJ1bGssIHNpemUsIGVudiwgc2l6ZSk7CisgICAgLy8gQWxsb2NhdGUgdmFycyBhcnJheS4KKyAgICB2YXJzID0gKGttcF9lbnZfdmFyX3QgKilhbGxvY2F0ZShjb3VudCAqIHNpemVvZihrbXBfZW52X3Zhcl90KSk7CisKKyAgICAvLyBMb29wIHRocnUgYWxsIHRoZSB2YXJzLCBub3cgaW4gYnVsay4KKyAgICB7CisgICAgICBjaGFyICp2YXI7IC8vIFBvaW50ZXIgdG8gYmVnaW5uaW5nIG9mIHZhci4KKyAgICAgIGludCBsZW47IC8vIExlbmd0aCBvZiB2YXJpYWJsZS4KKyAgICAgIGNvdW50ID0gMDsKKyAgICAgIHZhciA9IGJ1bGs7CisgICAgICBsZW4gPSBLTVBfU1RSTEVOKHZhcik7CisgICAgICB3aGlsZSAobGVuICE9IDApIHsKKyAgICAgICAgLy8gU2F2ZSB2YXJpYWJsZSBpbiB2YXJzIGFycmF5LgorICAgICAgICBfX2ttcF9zdHJfc3BsaXQodmFyLCAnPScsICZuYW1lLCAmdmFsdWUpOworICAgICAgICB2YXJzW2NvdW50XS5uYW1lID0gbmFtZTsKKyAgICAgICAgdmFyc1tjb3VudF0udmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgKytjb3VudDsKKyAgICAgICAgLy8gR2V0IHRoZSBuZXh0IHZhci4KKyAgICAgICAgdmFyID0gdmFyICsgbGVuICsgMTsKKyAgICAgICAgbGVuID0gS01QX1NUUkxFTih2YXIpOworICAgICAgfTsgLy8gd2hpbGUKKyAgICB9CisKKyAgfTsgLy8gaWYKKworICAvLyBGaWxsIG91dCByZXN1bHQuCisgIGJsb2NrLT5idWxrID0gYnVsazsKKyAgYmxvY2stPnZhcnMgPSB2YXJzOworICBibG9jay0+Y291bnQgPSBjb3VudDsKKworfTsgLy8gX19fa21wX2Vudl9ibGtfcGFyc2Vfd2luZG93cworI2VuZGlmCisKKy8qIFVuaXggZW52aXJvbm1lbnQgYmxvY2sgaXMgYSBhcnJheSBvZiBwb2ludGVycyB0byB2YXJpYWJsZXMsIGxhc3QgcG9pbnRlciBpbgorICAgYXJyYXkgaXMgTlVMTDoKKworICAgICAgICB7ICJIT01FPS9ob21lL2xldiIsICJURVJNPXh0ZXJtIiwgTlVMTCB9CisqLworCitzdGF0aWMgdm9pZAorX19fa21wX2Vudl9ibGtfcGFyc2VfdW5peChrbXBfZW52X2Jsa190ICpibG9jaywgLy8gTTogRW52IGJsb2NrIHRvIGZpbGwuCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiplbnYgLy8gSTogVW5peCBlbnZpcm9ubWVudCB0byBwYXJzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7CisKKyAgY2hhciAqYnVsayA9IE5VTEw7CisgIGttcF9lbnZfdmFyX3QgKnZhcnMgPSBOVUxMOworICBpbnQgY291bnQgPSAwOworICBpbnQgc2l6ZSA9IDA7IC8vIFNpemUgb2YgYnVsay4KKworICAvLyBDb3VudCBudW1iZXIgb2YgdmFyaWFibGVzIGFuZCBsZW5ndGggb2YgcmVxdWlyZWQgYnVsay4KKyAgeworICAgIGNvdW50ID0gMDsKKyAgICBzaXplID0gMDsKKyAgICB3aGlsZSAoZW52W2NvdW50XSAhPSBOVUxMKSB7CisgICAgICBzaXplICs9IEtNUF9TVFJMRU4oZW52W2NvdW50XSkgKyAxOworICAgICAgKytjb3VudDsKKyAgICB9OyAvLyB3aGlsZQorICB9CisKKyAgLy8gQWxsb2NhdGUgbWVtb3J5LgorICBidWxrID0gKGNoYXIgKilhbGxvY2F0ZShzaXplKTsKKyAgdmFycyA9IChrbXBfZW52X3Zhcl90ICopYWxsb2NhdGUoY291bnQgKiBzaXplb2Yoa21wX2Vudl92YXJfdCkpOworCisgIC8vIExvb3AgdGhydSBhbGwgdGhlIHZhcnMuCisgIHsKKyAgICBjaGFyICp2YXI7IC8vIFBvaW50ZXIgdG8gYmVnaW5uaW5nIG9mIHZhci4KKyAgICBjaGFyICpuYW1lOyAvLyBQb2ludGVyIHRvIG5hbWUgb2YgdmFyaWFibGUuCisgICAgY2hhciAqdmFsdWU7IC8vIFBvaW50ZXIgdG8gdmFsdWUuCisgICAgaW50IGxlbjsgLy8gTGVuZ3RoIG9mIHZhcmlhYmxlLgorICAgIGludCBpOworICAgIHZhciA9IGJ1bGs7CisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgIC8vIENvcHkgdmFyaWFibGUgdG8gYnVsay4KKyAgICAgIGxlbiA9IEtNUF9TVFJMRU4oZW52W2ldKTsKKyAgICAgIEtNUF9NRU1DUFlfUyh2YXIsIHNpemUsIGVudltpXSwgbGVuICsgMSk7CisgICAgICAvLyBTYXZlIGZvdW5kIHZhcmlhYmxlIGluIHZhcnMgYXJyYXkuCisgICAgICBfX2ttcF9zdHJfc3BsaXQodmFyLCAnPScsICZuYW1lLCAmdmFsdWUpOworICAgICAgdmFyc1tpXS5uYW1lID0gbmFtZTsKKyAgICAgIHZhcnNbaV0udmFsdWUgPSB2YWx1ZTsKKyAgICAgIC8vIE1vdmUgcG9pbnRlci4KKyAgICAgIHZhciArPSBsZW4gKyAxOworICAgIH07IC8vIGZvcgorICB9CisKKyAgLy8gRmlsbCBvdXQgcmVzdWx0LgorICBibG9jay0+YnVsayA9IGJ1bGs7CisgIGJsb2NrLT52YXJzID0gdmFyczsKKyAgYmxvY2stPmNvdW50ID0gY291bnQ7CisKK307IC8vIF9fX2ttcF9lbnZfYmxrX3BhcnNlX3VuaXgKKwordm9pZCBfX2ttcF9lbnZfYmxrX2luaXQoa21wX2Vudl9ibGtfdCAqYmxvY2ssIC8vIE06IEJsb2NrIHRvIGluaXRpYWxpemUuCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0ICpidWxrIC8vIEk6IEluaXRpYWxpemF0aW9uIHN0cmluZywgb3IgTlVMTC4KKyAgICAgICAgICAgICAgICAgICAgICAgICkgeworCisgIGlmIChidWxrICE9IE5VTEwpIHsKKyAgICBfX19rbXBfZW52X2Jsa19wYXJzZV9zdHJpbmcoYmxvY2ssIGJ1bGspOworICB9IGVsc2UgeworI2lmIEtNUF9PU19VTklYCisgICAgX19fa21wX2Vudl9ibGtfcGFyc2VfdW5peChibG9jaywgZW52aXJvbik7CisjZWxpZiBLTVBfT1NfV0lORE9XUworICAgIHsKKyAgICAgIGNoYXIgKm1lbSA9IEdldEVudmlyb25tZW50U3RyaW5ncygpOworICAgICAgaWYgKG1lbSA9PSBOVUxMKSB7CisgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIF9fa21wX21zZyhrbXBfbXNfZmF0YWwsIEtNUF9NU0coQ2FudEdldEVudmlyb25tZW50KSwgS01QX0VSUihlcnJvciksCisgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCk7CisgICAgICB9OyAvLyBpZgorICAgICAgX19fa21wX2Vudl9ibGtfcGFyc2Vfd2luZG93cyhibG9jaywgbWVtKTsKKyAgICAgIEZyZWVFbnZpcm9ubWVudFN0cmluZ3MobWVtKTsKKyAgICB9CisjZWxzZQorI2Vycm9yIFVua25vd24gb3IgdW5zdXBwb3J0ZWQgT1MuCisjZW5kaWYKKyAgfTsgLy8gaWYKKworfSAvLyBfX2ttcF9lbnZfYmxrX2luaXQKKworc3RhdGljIGludCBfX19rbXBfZW52X3Zhcl9jbXAoIC8vIENvbXBhcmlzb24gZnVuY3Rpb24gZm9yIHFzb3J0KCkuCisgICAga21wX2Vudl92YXJfdCBjb25zdCAqbGhzLCBrbXBfZW52X3Zhcl90IGNvbnN0ICpyaHMpIHsKKyAgcmV0dXJuIHN0cmNtcChsaHMtPm5hbWUsIHJocy0+bmFtZSk7Cit9CisKK3ZvaWQgX19rbXBfZW52X2Jsa19zb3J0KAorICAgIGttcF9lbnZfYmxrX3QgKmJsb2NrIC8vIE06IEJsb2NrIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBzb3J0LgorICAgICkgeworCisgIHFzb3J0KENDQVNUKGttcF9lbnZfdmFyX3QgKiwgYmxvY2stPnZhcnMpLCBibG9jay0+Y291bnQsCisgICAgICAgIHNpemVvZihrbXBfZW52X3Zhcl90KSwKKyAgICAgICAgKGludCAoKikodm9pZCBjb25zdCAqLCB2b2lkIGNvbnN0ICopKSAmIF9fX2ttcF9lbnZfdmFyX2NtcCk7CisKK30gLy8gX19rbXBfZW52X2Jsb2NrX3NvcnQKKwordm9pZCBfX2ttcF9lbnZfYmxrX2ZyZWUoCisgICAga21wX2Vudl9ibGtfdCAqYmxvY2sgLy8gTTogQmxvY2sgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGZyZWUuCisgICAgKSB7CisKKyAgS01QX0lOVEVSTkFMX0ZSRUUoQ0NBU1Qoa21wX2Vudl92YXJfdCAqLCBibG9jay0+dmFycykpOworICBfX2ttcF9zdHJfZnJlZSgmKGJsb2NrLT5idWxrKSk7CisKKyAgYmxvY2stPmNvdW50ID0gMDsKKyAgYmxvY2stPnZhcnMgPSBOVUxMOworCit9IC8vIF9fa21wX2Vudl9ibGtfZnJlZQorCitjaGFyIGNvbnN0ICogLy8gUjogVmFsdWUgb2YgdmFyaWFibGUgb3IgTlVMTCBpZiB2YXJpYWJsZSBkb2VzIG5vdCBleGlzdC4KKyAgICBfX2ttcF9lbnZfYmxrX3ZhcigKKyAgICAgICAga21wX2Vudl9ibGtfdCAqYmxvY2ssIC8vIEk6IEJsb2NrIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKyAgICAgICAgY2hhciBjb25zdCAqbmFtZSAvLyBJOiBOYW1lIG9mIHZhcmlhYmxlIHRvIGZpbmQuCisgICAgICAgICkgeworCisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgYmxvY2stPmNvdW50OyArK2kpIHsKKyAgICBpZiAoc3RyY21wKGJsb2NrLT52YXJzW2ldLm5hbWUsIG5hbWUpID09IDApIHsKKyAgICAgIHJldHVybiBibG9jay0+dmFyc1tpXS52YWx1ZTsKKyAgICB9OyAvLyBpZgorICB9OyAvLyBmb3IKKyAgcmV0dXJuIE5VTEw7CisKK30gLy8gX19rbXBfZW52X2Jsb2NrX3ZhcgorCisvLyBlbmQgb2YgZmlsZSAvLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2Vudmlyb25tZW50LmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZW52aXJvbm1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTlmM2U1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Vudmlyb25tZW50LmgKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIGttcF9lbnZpcm9ubWVudC5oIC0tIEhhbmRsZSBlbnZpcm9ubWVudCB2YXJvaWFibGVzIE9TLWluZGVwZW5kZW50bHkuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0VOVklST05NRU5UX0gKKyNkZWZpbmUgS01QX0VOVklST05NRU5UX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBSZXR1cm4gYSBjb3B5IG9mIHRoZSB2YWx1ZSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBOVUxMIGlmIHRoZSB2YXJpYWJsZQorLy8gZG9lcyBub3QgZXhpc3QuCisvLyAqTm90ZSo6IFJldHVybmVkIHBvaW50ZWQgKm11c3QqIGJlIGZyZWVkIGFmdGVyIHVzZSB3aXRoIF9fa21wX2Vudl9mcmVlKCkuCitjaGFyICpfX2ttcF9lbnZfZ2V0KGNoYXIgY29uc3QgKm5hbWUpOwordm9pZCBfX2ttcF9lbnZfZnJlZShjaGFyIGNvbnN0ICoqdmFsdWUpOworCisvLyBSZXR1cm4gMSBpZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgZXhpc3RzIG9yIDAgaWYgZG9lcyBub3QgZXhpc3QuCitpbnQgX19rbXBfZW52X2V4aXN0cyhjaGFyIGNvbnN0ICpuYW1lKTsKKworLy8gU2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KK3ZvaWQgX19rbXBfZW52X3NldChjaGFyIGNvbnN0ICpuYW1lLCBjaGFyIGNvbnN0ICp2YWx1ZSwgaW50IG92ZXJ3cml0ZSk7CisKKy8vIFVuc2V0IChyZW1vdmUpIGVudmlyb25tZW50IHZhcmlhYmxlLgordm9pZCBfX2ttcF9lbnZfdW5zZXQoY2hhciBjb25zdCAqbmFtZSk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgV29ya2luZyB3aXRoIGVudmlyb25tZW50IGJsb2Nrcy4KKworLyoga21wX2Vudl9ibGtfdCBpcyByZWFkLW9ubHkgY29sbGVjdGlvbiBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKG9yCisgICBlbnZpcm9ubWVudC1saWtlKS4gVXNhZ2U6CisKK2ttcF9lbnZfYmxrX3QgYmxvY2s7CitfX2ttcF9lbnZfYmxrX2luaXQoICYgYmxvY2ssIE5VTEwgKTsgLy8gSW5pdGlhbGl6ZSBibG9jayBmcm9tIHByb2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbnZpcm9ubWVudC4KKy8vIG9yCitfX2ttcF9lbnZfYmxrX2luaXQoICYgYmxvY2ssICJLTVBfV0FSTklORz0xfEtNUF9BRkZJTklUWT1ub25lIiApOyAvLyBmcm9tIHN0cmluZworX19rbXBfZW52X2Jsa19zb3J0KCAmIGJsb2NrICk7IC8vIE9wdGlvbmFsbHksIHNvcnQgbGlzdC4KK2ZvciAoIGkgPSAwOyBpIDwgYmxvY2suY291bnQ7ICsrIGkgKSB7CisgICAgLy8gUHJvY2VzcyBibG9jay52YXJzWyBpIF0ubmFtZSBhbmQgYmxvY2sudmFyc1sgaSBdLnZhbHVlLi4uCit9OyAvLyBmb3IgaQorX19rbXBfZW52X2Jsb2NrX2ZyZWUoICYgYmxvY2sgKTsKKyovCisKK3N0cnVjdCBfX2ttcF9lbnZfdmFyIHsKKyAgY2hhciBjb25zdCAqbmFtZTsKKyAgY2hhciBjb25zdCAqdmFsdWU7Cit9OwordHlwZWRlZiBzdHJ1Y3QgX19rbXBfZW52X3ZhciBrbXBfZW52X3Zhcl90OworCitzdHJ1Y3QgX19rbXBfZW52X2JsayB7CisgIGNoYXIgY29uc3QgKmJ1bGs7CisgIGttcF9lbnZfdmFyX3QgY29uc3QgKnZhcnM7CisgIGludCBjb3VudDsKK307Cit0eXBlZGVmIHN0cnVjdCBfX2ttcF9lbnZfYmxrIGttcF9lbnZfYmxrX3Q7CisKK3ZvaWQgX19rbXBfZW52X2Jsa19pbml0KGttcF9lbnZfYmxrX3QgKmJsb2NrLCBjaGFyIGNvbnN0ICpidWxrKTsKK3ZvaWQgX19rbXBfZW52X2Jsa19mcmVlKGttcF9lbnZfYmxrX3QgKmJsb2NrKTsKK3ZvaWQgX19rbXBfZW52X2Jsa19zb3J0KGttcF9lbnZfYmxrX3QgKmJsb2NrKTsKK2NoYXIgY29uc3QgKl9fa21wX2Vudl9ibGtfdmFyKGttcF9lbnZfYmxrX3QgKmJsb2NrLCBjaGFyIGNvbnN0ICpuYW1lKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8vIEtNUF9FTlZJUk9OTUVOVF9ICisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZXJyb3IuY3BwIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Vycm9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmZiZTYzCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Vycm9yLmNwcApAQCAtMCwwICsxLDQ2NSBAQAorLyoKKyAqIGttcF9lcnJvci5jcHAgLS0gS1BUUyBmdW5jdGlvbnMgZm9yIGVycm9yIGNoZWNraW5nIGF0IHJ1bnRpbWUKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9lcnJvci5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBNSU5fU1RBQ0sgMTAwCisKK3N0YXRpYyBjaGFyIGNvbnN0ICpjb25zX3RleHRfY1tdID0geworICAgICIobm9uZSkiLCAiXCJwYXJhbGxlbFwiIiwgIndvcmstc2hhcmluZyIsIC8qIHRoaXMgaXMgbm90IGNhbGxlZCAiZm9yIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlY2F1c2Ugb2YgbG93ZXJpbmcgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VjdGlvbnMiIHByYWdtYXMgKi8KKyAgICAiXCJvcmRlcmVkXCIgd29yay1zaGFyaW5nIiwgLyogdGhpcyBpcyBub3QgY2FsbGVkICJmb3Igb3JkZXJlZCIgYmVjYXVzZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlcmluZyBvZiAic2VjdGlvbnMiIHByYWdtYXMgKi8KKyAgICAiXCJzZWN0aW9uc1wiIiwKKyAgICAid29yay1zaGFyaW5nIiwgLyogdGhpcyBpcyBub3QgY2FsbGVkICJzaW5nbGUiIGJlY2F1c2Ugb2YgbG93ZXJpbmcgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgInNlY3Rpb25zIiBwcmFnbWFzICovCisgICAgIlwidGFza3FcIiIsICJcInRhc2txXCIiLCAiXCJ0YXNrcSBvcmRlcmVkXCIiLCAiXCJjcml0aWNhbFwiIiwKKyAgICAiXCJvcmRlcmVkXCIiLCAvKiBpbiBQQVJBTExFTCAqLworICAgICJcIm9yZGVyZWRcIiIsIC8qIGluIFBETyAqLworICAgICJcIm9yZGVyZWRcIiIsIC8qIGluIFRBU0tRICovCisgICAgIlwibWFzdGVyXCIiLCAiXCJyZWR1Y2VcIiIsICJcImJhcnJpZXJcIiJ9OworCisjZGVmaW5lIGdldF9zcmMoaWRlbnQpICgoaWRlbnQpID09IE5VTEwgPyBOVUxMIDogKGlkZW50KS0+cHNvdXJjZSkKKworI2RlZmluZSBQVVNIX01TRyhjdCwgaWRlbnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIlx0cHVzaGluZyBvbiBzdGFjazogJXMgKCVzKVxuIiwgY29uc190ZXh0X2NbKGN0KV0sIGdldF9zcmMoKGlkZW50KSkKKyNkZWZpbmUgUE9QX01TRyhwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJcdHBvcHBpbmcgb2ZmIHN0YWNrOiAlcyAoJXMpXG4iLCBjb25zX3RleHRfY1socCktPnN0YWNrX2RhdGFbdG9zXS50eXBlXSwgICAgXAorICAgICAgZ2V0X3NyYygocCktPnN0YWNrX2RhdGFbdG9zXS5pZGVudCkKKworc3RhdGljIGludCBjb25zdCBjb25zX3RleHRfY19udW0gPSBzaXplb2YoY29uc190ZXh0X2MpIC8gc2l6ZW9mKGNoYXIgY29uc3QgKik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLSBTVEFSVCBPRiBTVEFUSUMgTE9DQUwgUk9VVElORVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBfX2ttcF9jaGVja19udWxsX2Z1bmModm9pZCkgeyAvKiBub3RoaW5nIHRvIGRvICovCit9CisKK3N0YXRpYyB2b2lkIF9fa21wX2V4cGFuZF9jb25zX3N0YWNrKGludCBndGlkLCBzdHJ1Y3QgY29uc19oZWFkZXIgKnApIHsKKyAgaW50IGk7CisgIHN0cnVjdCBjb25zX2RhdGEgKmQ7CisKKyAgLyogVE9ETyBmb3IgbW9uaXRvciBwZXJoYXBzPyAqLworICBpZiAoZ3RpZCA8IDApCisgICAgX19rbXBfY2hlY2tfbnVsbF9mdW5jKCk7CisKKyAgS0VfVFJBQ0UoMTAsICgiZXhwYW5kIGNvbnNfc3RhY2sgKCVkICVkKVxuIiwgZ3RpZCwgX19rbXBfZ2V0X2d0aWQoKSkpOworCisgIGQgPSBwLT5zdGFja19kYXRhOworCisgIHAtPnN0YWNrX3NpemUgPSAocC0+c3RhY2tfc2l6ZSAqIDIpICsgMTAwOworCisgIC8qIFRPRE8gZnJlZSB0aGUgb2xkIGRhdGEgKi8KKyAgcC0+c3RhY2tfZGF0YSA9IChzdHJ1Y3QgY29uc19kYXRhICopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKHN0cnVjdCBjb25zX2RhdGEpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHAtPnN0YWNrX3NpemUgKyAxKSk7CisKKyAgZm9yIChpID0gcC0+c3RhY2tfdG9wOyBpID49IDA7IC0taSkKKyAgICBwLT5zdGFja19kYXRhW2ldID0gZFtpXTsKKworICAvKiBOT1RFOiB3ZSBkbyBub3QgZnJlZSB0aGUgb2xkIHN0YWNrX2RhdGEgKi8KK30KKworLy8gTk9URTogRnVuY3Rpb24gcmV0dXJucyBhbGxvY2F0ZWQgbWVtb3J5LCBjYWxsZXIgbXVzdCBmcmVlIGl0IQorc3RhdGljIGNoYXIgY29uc3QgKl9fa21wX3ByYWdtYShpbnQgY3QsIGlkZW50X3QgY29uc3QgKmlkZW50KSB7CisgIGNoYXIgY29uc3QgKmNvbnMgPSBOVUxMOyAvLyBDb25zdHJ1Y3QgbmFtZS4KKyAgY2hhciAqZmlsZSA9IE5VTEw7IC8vIEZpbGUgbmFtZS4KKyAgY2hhciAqZnVuYyA9IE5VTEw7IC8vIEZ1bmN0aW9uIChyb3V0aW5lKSBuYW1lLgorICBjaGFyICpsaW5lID0gTlVMTDsgLy8gTGluZSBudW1iZXIuCisgIGttcF9zdHJfYnVmX3QgYnVmZmVyOworICBrbXBfbXNnX3QgcHJnbTsKKyAgX19rbXBfc3RyX2J1Zl9pbml0KCZidWZmZXIpOworICBpZiAoMCA8IGN0ICYmIGN0IDwgY29uc190ZXh0X2NfbnVtKSB7CisgICAgY29ucyA9IGNvbnNfdGV4dF9jW2N0XTsKKyAgfSBlbHNlIHsKKyAgICBLTVBfREVCVUdfQVNTRVJUKDApOworICB9OworICBpZiAoaWRlbnQgIT0gTlVMTCAmJiBpZGVudC0+cHNvdXJjZSAhPSBOVUxMKSB7CisgICAgY2hhciAqdGFpbCA9IE5VTEw7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmZmVyLCAiJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQtPnBzb3VyY2UpOyAvLyBDb3B5IHNvdXJjZSB0byBidWZmZXIuCisgICAgLy8gU3BsaXQgc3RyaW5nIGluIGJ1ZmZlciB0byBmaWxlLCBmdW5jLCBhbmQgbGluZS4KKyAgICB0YWlsID0gYnVmZmVyLnN0cjsKKyAgICBfX2ttcF9zdHJfc3BsaXQodGFpbCwgJzsnLCBOVUxMLCAmdGFpbCk7CisgICAgX19rbXBfc3RyX3NwbGl0KHRhaWwsICc7JywgJmZpbGUsICZ0YWlsKTsKKyAgICBfX2ttcF9zdHJfc3BsaXQodGFpbCwgJzsnLCAmZnVuYywgJnRhaWwpOworICAgIF9fa21wX3N0cl9zcGxpdCh0YWlsLCAnOycsICZsaW5lLCAmdGFpbCk7CisgIH07IC8vIGlmCisgIHByZ20gPSBfX2ttcF9tc2dfZm9ybWF0KGttcF9pMThuX2ZtdF9QcmFnbWEsIGNvbnMsIGZpbGUsIGZ1bmMsIGxpbmUpOworICBfX2ttcF9zdHJfYnVmX2ZyZWUoJmJ1ZmZlcik7CisgIHJldHVybiBwcmdtLnN0cjsKK30gLy8gX19rbXBfcHJhZ21hCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIEVORCBPRiBTVEFUSUMgTE9DQUwgUk9VVElORVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIF9fa21wX2Vycm9yX2NvbnN0cnVjdChrbXBfaTE4bl9pZF90IGlkLCAvLyBNZXNzYWdlIGlkZW50aWZpZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGNvbnNfdHlwZSBjdCwgLy8gQ29uc3RydWN0IHR5cGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudF90IGNvbnN0ICppZGVudCAvLyBDb25zdHJ1Y3QgaWRlbnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKKyAgY2hhciBjb25zdCAqY29uc3RydWN0ID0gX19rbXBfcHJhZ21hKGN0LCBpZGVudCk7CisgIF9fa21wX21zZyhrbXBfbXNfZmF0YWwsIF9fa21wX21zZ19mb3JtYXQoaWQsIGNvbnN0cnVjdCksIF9fa21wX21zZ19udWxsKTsKKyAgS01QX0lOVEVSTkFMX0ZSRUUoQ0NBU1QoY2hhciAqLCBjb25zdHJ1Y3QpKTsKK30KKwordm9pZCBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKGttcF9pMThuX2lkX3QgaWQsIC8vIE1lc3NhZ2UgaWRlbnRpZmllci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGNvbnNfdHlwZSBjdCwgLy8gRmlyc3QgY29uc3RydWN0IHR5cGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRfdCBjb25zdCAqaWRlbnQsIC8vIEZpcnN0IGNvbnN0cnVjdCBpZGVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29uc19kYXRhIGNvbnN0ICpjb25zIC8vIFNlY29uZCBjb25zdHJ1Y3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7CisgIGNoYXIgY29uc3QgKmNvbnN0cnVjdDEgPSBfX2ttcF9wcmFnbWEoY3QsIGlkZW50KTsKKyAgY2hhciBjb25zdCAqY29uc3RydWN0MiA9IF9fa21wX3ByYWdtYShjb25zLT50eXBlLCBjb25zLT5pZGVudCk7CisgIF9fa21wX21zZyhrbXBfbXNfZmF0YWwsIF9fa21wX21zZ19mb3JtYXQoaWQsIGNvbnN0cnVjdDEsIGNvbnN0cnVjdDIpLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwpOworICBLTVBfSU5URVJOQUxfRlJFRShDQ0FTVChjaGFyICosIGNvbnN0cnVjdDEpKTsKKyAgS01QX0lOVEVSTkFMX0ZSRUUoQ0NBU1QoY2hhciAqLCBjb25zdHJ1Y3QyKSk7Cit9CisKK3N0cnVjdCBjb25zX2hlYWRlciAqX19rbXBfYWxsb2NhdGVfY29uc19zdGFjayhpbnQgZ3RpZCkgeworICBzdHJ1Y3QgY29uc19oZWFkZXIgKnA7CisKKyAgLyogVE9ETyBmb3IgbW9uaXRvciBwZXJoYXBzPyAqLworICBpZiAoZ3RpZCA8IDApIHsKKyAgICBfX2ttcF9jaGVja19udWxsX2Z1bmMoKTsKKyAgfTsgLy8gaWYKKyAgS0VfVFJBQ0UoMTAsICgiYWxsb2NhdGUgY29uc19zdGFjayAoJWQpXG4iLCBndGlkKSk7CisgIHAgPSAoc3RydWN0IGNvbnNfaGVhZGVyICopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKHN0cnVjdCBjb25zX2hlYWRlcikpOworICBwLT5wX3RvcCA9IHAtPndfdG9wID0gcC0+c190b3AgPSAwOworICBwLT5zdGFja19kYXRhID0gKHN0cnVjdCBjb25zX2RhdGEgKilfX2ttcF9hbGxvY2F0ZShzaXplb2Yoc3RydWN0IGNvbnNfZGF0YSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTUlOX1NUQUNLICsgMSkpOworICBwLT5zdGFja19zaXplID0gTUlOX1NUQUNLOworICBwLT5zdGFja190b3AgPSAwOworICBwLT5zdGFja19kYXRhWzBdLnR5cGUgPSBjdF9ub25lOworICBwLT5zdGFja19kYXRhWzBdLnByZXYgPSAwOworICBwLT5zdGFja19kYXRhWzBdLmlkZW50ID0gTlVMTDsKKyAgcmV0dXJuIHA7Cit9CisKK3ZvaWQgX19rbXBfZnJlZV9jb25zX3N0YWNrKHZvaWQgKnB0cikgeworICBzdHJ1Y3QgY29uc19oZWFkZXIgKnAgPSAoc3RydWN0IGNvbnNfaGVhZGVyICopcHRyOworICBpZiAocCAhPSBOVUxMKSB7CisgICAgaWYgKHAtPnN0YWNrX2RhdGEgIT0gTlVMTCkgeworICAgICAgX19rbXBfZnJlZShwLT5zdGFja19kYXRhKTsKKyAgICAgIHAtPnN0YWNrX2RhdGEgPSBOVUxMOworICAgIH07IC8vIGlmCisgICAgX19rbXBfZnJlZShwKTsKKyAgfTsgLy8gaWYKK30KKworI2lmIEtNUF9ERUJVRworc3RhdGljIHZvaWQgZHVtcF9jb25zX3N0YWNrKGludCBndGlkLCBzdHJ1Y3QgY29uc19oZWFkZXIgKnApIHsKKyAgaW50IGk7CisgIGludCB0b3MgPSBwLT5zdGFja190b3A7CisgIGttcF9zdHJfYnVmX3QgYnVmZmVyOworICBfX2ttcF9zdHJfYnVmX2luaXQoJmJ1ZmZlcik7CisgIF9fa21wX3N0cl9idWZfcHJpbnQoCisgICAgICAmYnVmZmVyLAorICAgICAgIistKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy1cbiIpOworICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIkJlZ2luIGNvbnN0cnVjdCBzdGFjayB3aXRoICVkIGl0ZW1zIGZvciB0aHJlYWQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgdG9zLCBndGlkKTsKKyAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmZmVyLCAiICAgICBzdGFja190b3A9JWQgeyBQPSVkLCBXPSVkLCBTPSVkIH1cbiIsIHRvcywKKyAgICAgICAgICAgICAgICAgICAgICBwLT5wX3RvcCwgcC0+d190b3AsIHAtPnNfdG9wKTsKKyAgZm9yIChpID0gdG9zOyBpID4gMDsgaS0tKSB7CisgICAgc3RydWN0IGNvbnNfZGF0YSAqYyA9ICYocC0+c3RhY2tfZGF0YVtpXSk7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludCgKKyAgICAgICAgJmJ1ZmZlciwgIiAgICAgICAgc3RhY2tfZGF0YVslMmRdID0geyAlcyAoJXMpICVkICVwIH1cbiIsIGksCisgICAgICAgIGNvbnNfdGV4dF9jW2MtPnR5cGVdLCBnZXRfc3JjKGMtPmlkZW50KSwgYy0+cHJldiwgYy0+bmFtZSk7CisgIH07IC8vIGZvciBpCisgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZmZlciwgIkVuZCBjb25zdHJ1Y3Qgc3RhY2sgZm9yIHRocmVhZCAlZFxuIiwgZ3RpZCk7CisgIF9fa21wX3N0cl9idWZfcHJpbnQoCisgICAgICAmYnVmZmVyLAorICAgICAgIistKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy1cbiIpOworICBfX2ttcF9kZWJ1Z19wcmludGYoIiVzIiwgYnVmZmVyLnN0cik7CisgIF9fa21wX3N0cl9idWZfZnJlZSgmYnVmZmVyKTsKK30KKyNlbmRpZgorCit2b2lkIF9fa21wX3B1c2hfcGFyYWxsZWwoaW50IGd0aWQsIGlkZW50X3QgY29uc3QgKmlkZW50KSB7CisgIGludCB0b3M7CisgIHN0cnVjdCBjb25zX2hlYWRlciAqcCA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX2NvbnM7CisKKyAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF9jb25zKTsKKyAgS0VfVFJBQ0UoMTAsICgiX19rbXBfcHVzaF9wYXJhbGxlbCAoJWQgJWQpXG4iLCBndGlkLCBfX2ttcF9nZXRfZ3RpZCgpKSk7CisgIEtFX1RSQUNFKDEwMCwgKFBVU0hfTVNHKGN0X3BhcmFsbGVsLCBpZGVudCkpKTsKKyAgaWYgKHAtPnN0YWNrX3RvcCA+PSBwLT5zdGFja19zaXplKSB7CisgICAgX19rbXBfZXhwYW5kX2NvbnNfc3RhY2soZ3RpZCwgcCk7CisgIH07IC8vIGlmCisgIHRvcyA9ICsrcC0+c3RhY2tfdG9wOworICBwLT5zdGFja19kYXRhW3Rvc10udHlwZSA9IGN0X3BhcmFsbGVsOworICBwLT5zdGFja19kYXRhW3Rvc10ucHJldiA9IHAtPnBfdG9wOworICBwLT5zdGFja19kYXRhW3Rvc10uaWRlbnQgPSBpZGVudDsKKyAgcC0+c3RhY2tfZGF0YVt0b3NdLm5hbWUgPSBOVUxMOworICBwLT5wX3RvcCA9IHRvczsKKyAgS0VfRFVNUCgxMDAwLCBkdW1wX2NvbnNfc3RhY2soZ3RpZCwgcCkpOworfQorCit2b2lkIF9fa21wX2NoZWNrX3dvcmtzaGFyZShpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKmlkZW50KSB7CisgIHN0cnVjdCBjb25zX2hlYWRlciAqcCA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX2NvbnM7CisKKyAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF9jb25zKTsKKyAgS0VfVFJBQ0UoMTAsICgiX19rbXBfY2hlY2tfd29ya3NoYXJlICglZCAlZClcbiIsIGd0aWQsIF9fa21wX2dldF9ndGlkKCkpKTsKKworICBpZiAocC0+c3RhY2tfdG9wID49IHAtPnN0YWNrX3NpemUpIHsKKyAgICBfX2ttcF9leHBhbmRfY29uc19zdGFjayhndGlkLCBwKTsKKyAgfTsgLy8gaWYKKyAgaWYgKHAtPndfdG9wID4gcC0+cF90b3AgJiYKKyAgICAgICEoSVNfQ09OU19UWVBFX1RBU0tRKHAtPnN0YWNrX2RhdGFbcC0+d190b3BdLnR5cGUpICYmCisgICAgICAgIElTX0NPTlNfVFlQRV9UQVNLUShjdCkpKSB7CisgICAgLy8gV2UgYXJlIGFscmVhZHkgaW4gYSBXT1JLU0hBUkUgY29uc3RydWN0IGZvciB0aGlzIFBBUkFMTEVMIHJlZ2lvbi4KKyAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKGttcF9pMThuX21zZ19DbnNJbnZhbGlkTmVzdGluZywgY3QsIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPnN0YWNrX2RhdGFbcC0+d190b3BdKTsKKyAgfTsgLy8gaWYKKyAgaWYgKHAtPnNfdG9wID4gcC0+cF90b3ApIHsKKyAgICAvLyBXZSBhcmUgYWxyZWFkeSBpbiBhIFNZTkMgY29uc3RydWN0IGZvciB0aGlzIFBBUkFMTEVMIHJlZ2lvbi4KKyAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKGttcF9pMThuX21zZ19DbnNJbnZhbGlkTmVzdGluZywgY3QsIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPnN0YWNrX2RhdGFbcC0+c190b3BdKTsKKyAgfTsgLy8gaWYKK30KKwordm9pZCBfX2ttcF9wdXNoX3dvcmtzaGFyZShpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKmlkZW50KSB7CisgIGludCB0b3M7CisgIHN0cnVjdCBjb25zX2hlYWRlciAqcCA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX2NvbnM7CisgIEtFX1RSQUNFKDEwLCAoIl9fa21wX3B1c2hfd29ya3NoYXJlICglZCAlZClcbiIsIGd0aWQsIF9fa21wX2dldF9ndGlkKCkpKTsKKyAgX19rbXBfY2hlY2tfd29ya3NoYXJlKGd0aWQsIGN0LCBpZGVudCk7CisgIEtFX1RSQUNFKDEwMCwgKFBVU0hfTVNHKGN0LCBpZGVudCkpKTsKKyAgdG9zID0gKytwLT5zdGFja190b3A7CisgIHAtPnN0YWNrX2RhdGFbdG9zXS50eXBlID0gY3Q7CisgIHAtPnN0YWNrX2RhdGFbdG9zXS5wcmV2ID0gcC0+d190b3A7CisgIHAtPnN0YWNrX2RhdGFbdG9zXS5pZGVudCA9IGlkZW50OworICBwLT5zdGFja19kYXRhW3Rvc10ubmFtZSA9IE5VTEw7CisgIHAtPndfdG9wID0gdG9zOworICBLRV9EVU1QKDEwMDAsIGR1bXBfY29uc19zdGFjayhndGlkLCBwKSk7Cit9CisKK3ZvaWQKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworX19rbXBfY2hlY2tfc3luYyggaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQsIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF91aW50MzIgc2VxICkKKyNlbHNlCitfX2ttcF9jaGVja19zeW5jKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCwga21wX3VzZXJfbG9ja19wIGxjayApCisjZW5kaWYKK3sKKyAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfY29uczsKKworICBLRV9UUkFDRSgxMCwgKCJfX2ttcF9jaGVja19zeW5jIChndGlkPSVkKVxuIiwgX19rbXBfZ2V0X2d0aWQoKSkpOworCisgIGlmIChwLT5zdGFja190b3AgPj0gcC0+c3RhY2tfc2l6ZSkKKyAgICBfX2ttcF9leHBhbmRfY29uc19zdGFjayhndGlkLCBwKTsKKworICBpZiAoY3QgPT0gY3Rfb3JkZXJlZF9pbl9wYXJhbGxlbCB8fCBjdCA9PSBjdF9vcmRlcmVkX2luX3BkbyB8fAorICAgICAgY3QgPT0gY3Rfb3JkZXJlZF9pbl90YXNrcSkgeworICAgIGlmIChwLT53X3RvcCA8PSBwLT5wX3RvcCkgeworLyogd2UgYXJlIG5vdCBpbiBhIHdvcmtzaGFyaW5nIGNvbnN0cnVjdCAqLworI2lmZGVmIEJVSUxEX1BBUkFMTEVMX09SREVSRUQKKyAgICAgIC8qIGRvIG5vdCByZXBvcnQgZXJyb3IgbWVzc2FnZXMgZm9yIFBBUkFMTEVMIE9SREVSRUQgKi8KKyAgICAgIEtNUF9BU1NFUlQoY3QgPT0gY3Rfb3JkZXJlZF9pbl9wYXJhbGxlbCk7CisjZWxzZQorICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0KGttcF9pMThuX21zZ19DbnNCb3VuZFRvV29ya3NoYXJpbmcsIGN0LCBpZGVudCk7CisjZW5kaWYgLyogQlVJTERfUEFSQUxMRUxfT1JERVJFRCAqLworICAgIH0gZWxzZSB7CisgICAgICAvKiBpbnNpZGUgYSBXT1JLU0hBUklORyBjb25zdHJ1Y3QgZm9yIHRoaXMgUEFSQUxMRUwgcmVnaW9uICovCisgICAgICBpZiAoIUlTX0NPTlNfVFlQRV9PUkRFUkVEKHAtPnN0YWNrX2RhdGFbcC0+d190b3BdLnR5cGUpKSB7CisgICAgICAgIGlmIChwLT5zdGFja19kYXRhW3AtPndfdG9wXS50eXBlID09IGN0X3Rhc2txKSB7CisgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0MihrbXBfaTE4bl9tc2dfQ25zTm90SW5UYXNrQ29uc3RydWN0LCBjdCwgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcC0+c3RhY2tfZGF0YVtwLT53X3RvcF0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoa21wX2kxOG5fbXNnX0Nuc05vT3JkZXJlZENsYXVzZSwgY3QsIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPnN0YWNrX2RhdGFbcC0+d190b3BdKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAocC0+c190b3AgPiBwLT5wX3RvcCAmJiBwLT5zX3RvcCA+IHAtPndfdG9wKSB7CisgICAgICAvKiBpbnNpZGUgYSBzeW5jIGNvbnN0cnVjdCB3aGljaCBpcyBpbnNpZGUgYSB3b3Jrc2hhcmluZyBjb25zdHJ1Y3QgKi8KKyAgICAgIGludCBpbmRleCA9IHAtPnNfdG9wOworICAgICAgZW51bSBjb25zX3R5cGUgc3RhY2tfdHlwZTsKKworICAgICAgc3RhY2tfdHlwZSA9IHAtPnN0YWNrX2RhdGFbaW5kZXhdLnR5cGU7CisKKyAgICAgIGlmIChzdGFja190eXBlID09IGN0X2NyaXRpY2FsIHx8CisgICAgICAgICAgKChzdGFja190eXBlID09IGN0X29yZGVyZWRfaW5fcGFyYWxsZWwgfHwKKyAgICAgICAgICAgIHN0YWNrX3R5cGUgPT0gY3Rfb3JkZXJlZF9pbl9wZG8gfHwKKyAgICAgICAgICAgIHN0YWNrX3R5cGUgPT0KKyAgICAgICAgICAgICAgICBjdF9vcmRlcmVkX2luX3Rhc2txKSAmJiAvKiBDIGRvZXNuJ3QgYWxsb3cgbmFtZWQgb3JkZXJlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcmVkIGluIG9yZGVyZWQgZ2V0cyBlcnJvciAqLworICAgICAgICAgICBwLT5zdGFja19kYXRhW2luZGV4XS5pZGVudCAhPSBOVUxMICYmCisgICAgICAgICAgIChwLT5zdGFja19kYXRhW2luZGV4XS5pZGVudC0+ZmxhZ3MgJiBLTVBfSURFTlRfS01QQykpKSB7CisgICAgICAgIC8qIHdlIGFyZSBpbiBPUkRFUkVEIHdoaWNoIGlzIGluc2lkZSBhbiBPUkRFUkVEIG9yIENSSVRJQ0FMIGNvbnN0cnVjdCAqLworICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKGttcF9pMThuX21zZ19DbnNJbnZhbGlkTmVzdGluZywgY3QsIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwLT5zdGFja19kYXRhW2luZGV4XSk7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKGN0ID09IGN0X2NyaXRpY2FsKSB7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICBpZiAobGNrICE9IE5VTEwgJiYKKyAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcihsY2ssIHNlcSkgPT0KKyAgICAgICAgICAgIGd0aWQpIHsgLyogdGhpcyB0aHJlYWQgYWxyZWFkeSBoYXMgbG9jayBmb3IgdGhpcyBjcml0aWNhbCBzZWN0aW9uICovCisjZWxzZQorICAgIGlmIChsY2sgIT0gTlVMTCAmJgorICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyKGxjaykgPT0KKyAgICAgICAgICAgIGd0aWQpIHsgLyogdGhpcyB0aHJlYWQgYWxyZWFkeSBoYXMgbG9jayBmb3IgdGhpcyBjcml0aWNhbCBzZWN0aW9uICovCisjZW5kaWYKKyAgICAgIGludCBpbmRleCA9IHAtPnNfdG9wOworICAgICAgc3RydWN0IGNvbnNfZGF0YSBjb25zID0ge05VTEwsIGN0X2NyaXRpY2FsLCAwLCBOVUxMfTsKKyAgICAgIC8qIHdhbGsgdXAgY29uc3RydWN0IHN0YWNrIGFuZCB0cnkgdG8gZmluZCBjcml0aWNhbCB3aXRoIG1hdGNoaW5nIG5hbWUgKi8KKyAgICAgIHdoaWxlIChpbmRleCAhPSAwICYmIHAtPnN0YWNrX2RhdGFbaW5kZXhdLm5hbWUgIT0gbGNrKSB7CisgICAgICAgIGluZGV4ID0gcC0+c3RhY2tfZGF0YVtpbmRleF0ucHJldjsKKyAgICAgIH0KKyAgICAgIGlmIChpbmRleCAhPSAwKSB7CisgICAgICAgIC8qIGZvdW5kIG1hdGNoIG9uIHRoZSBzdGFjayAobWF5IG5vdCBhbHdheXMgYmVjYXVzZSBvZiBpbnRlcmxlYXZlZAorICAgICAgICAgKiBjcml0aWNhbCBmb3IgRm9ydHJhbikgKi8KKyAgICAgICAgY29ucyA9IHAtPnN0YWNrX2RhdGFbaW5kZXhdOworICAgICAgfQorICAgICAgLyogd2UgYXJlIGluIENSSVRJQ0FMIHdoaWNoIGlzIGluc2lkZSBhIENSSVRJQ0FMIGNvbnN0cnVjdCBvZiBzYW1lIG5hbWUgKi8KKyAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoa21wX2kxOG5fbXNnX0Nuc05lc3RpbmdTYW1lTmFtZSwgY3QsIGlkZW50LCAmY29ucyk7CisgICAgfQorICB9IGVsc2UgaWYgKGN0ID09IGN0X21hc3RlciB8fCBjdCA9PSBjdF9yZWR1Y2UpIHsKKyAgICBpZiAocC0+d190b3AgPiBwLT5wX3RvcCkgeworICAgICAgLyogaW5zaWRlIGEgV09SS1NIQVJJTkcgY29uc3RydWN0IGZvciB0aGlzIFBBUkFMTEVMIHJlZ2lvbiAqLworICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0MihrbXBfaTE4bl9tc2dfQ25zSW52YWxpZE5lc3RpbmcsIGN0LCBpZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPnN0YWNrX2RhdGFbcC0+d190b3BdKTsKKyAgICB9CisgICAgaWYgKGN0ID09IGN0X3JlZHVjZSAmJiBwLT5zX3RvcCA+IHAtPnBfdG9wKSB7CisgICAgICAvKiBpbnNpZGUgYSBhbm90aGVyIFNZTkMgY29uc3RydWN0IGZvciB0aGlzIFBBUkFMTEVMIHJlZ2lvbiAqLworICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0MihrbXBfaTE4bl9tc2dfQ25zSW52YWxpZE5lc3RpbmcsIGN0LCBpZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPnN0YWNrX2RhdGFbcC0+c190b3BdKTsKKyAgICB9OyAvLyBpZgorICB9OyAvLyBpZgorfQorCit2b2lkCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKK19fa21wX3B1c2hfc3luYyggaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQsIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF91aW50MzIgc2VxICkKKyNlbHNlCitfX2ttcF9wdXNoX3N5bmMoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50LCBrbXBfdXNlcl9sb2NrX3AgbGNrICkKKyNlbmRpZgoreworICBpbnQgdG9zOworICBzdHJ1Y3QgY29uc19oZWFkZXIgKnAgPSBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF9jb25zOworCisgIEtNUF9BU1NFUlQoZ3RpZCA9PSBfX2ttcF9nZXRfZ3RpZCgpKTsKKyAgS0VfVFJBQ0UoMTAsICgiX19rbXBfcHVzaF9zeW5jIChndGlkPSVkKVxuIiwgZ3RpZCkpOworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgIF9fa21wX2NoZWNrX3N5bmMoZ3RpZCwgY3QsIGlkZW50LCBsY2ssIHNlcSk7CisjZWxzZQorICBfX2ttcF9jaGVja19zeW5jKGd0aWQsIGN0LCBpZGVudCwgbGNrKTsKKyNlbmRpZgorICBLRV9UUkFDRSgxMDAsIChQVVNIX01TRyhjdCwgaWRlbnQpKSk7CisgIHRvcyA9ICsrcC0+c3RhY2tfdG9wOworICBwLT5zdGFja19kYXRhW3Rvc10udHlwZSA9IGN0OworICBwLT5zdGFja19kYXRhW3Rvc10ucHJldiA9IHAtPnNfdG9wOworICBwLT5zdGFja19kYXRhW3Rvc10uaWRlbnQgPSBpZGVudDsKKyAgcC0+c3RhY2tfZGF0YVt0b3NdLm5hbWUgPSBsY2s7CisgIHAtPnNfdG9wID0gdG9zOworICBLRV9EVU1QKDEwMDAsIGR1bXBfY29uc19zdGFjayhndGlkLCBwKSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIF9fa21wX3BvcF9wYXJhbGxlbChpbnQgZ3RpZCwgaWRlbnRfdCBjb25zdCAqaWRlbnQpIHsKKyAgaW50IHRvczsKKyAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfY29uczsKKyAgdG9zID0gcC0+c3RhY2tfdG9wOworICBLRV9UUkFDRSgxMCwgKCJfX2ttcF9wb3BfcGFyYWxsZWwgKCVkICVkKVxuIiwgZ3RpZCwgX19rbXBfZ2V0X2d0aWQoKSkpOworICBpZiAodG9zID09IDAgfHwgcC0+cF90b3AgPT0gMCkgeworICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdChrbXBfaTE4bl9tc2dfQ25zRGV0ZWN0ZWRFbmQsIGN0X3BhcmFsbGVsLCBpZGVudCk7CisgIH0KKyAgaWYgKHRvcyAhPSBwLT5wX3RvcCB8fCBwLT5zdGFja19kYXRhW3Rvc10udHlwZSAhPSBjdF9wYXJhbGxlbCkgeworICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoa21wX2kxOG5fbXNnX0Nuc0V4cGVjdGVkRW5kLCBjdF9wYXJhbGxlbCwgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcC0+c3RhY2tfZGF0YVt0b3NdKTsKKyAgfQorICBLRV9UUkFDRSgxMDAsIChQT1BfTVNHKHApKSk7CisgIHAtPnBfdG9wID0gcC0+c3RhY2tfZGF0YVt0b3NdLnByZXY7CisgIHAtPnN0YWNrX2RhdGFbdG9zXS50eXBlID0gY3Rfbm9uZTsKKyAgcC0+c3RhY2tfZGF0YVt0b3NdLmlkZW50ID0gTlVMTDsKKyAgcC0+c3RhY2tfdG9wID0gdG9zIC0gMTsKKyAgS0VfRFVNUCgxMDAwLCBkdW1wX2NvbnNfc3RhY2soZ3RpZCwgcCkpOworfQorCitlbnVtIGNvbnNfdHlwZSBfX2ttcF9wb3Bfd29ya3NoYXJlKGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRfdCBjb25zdCAqaWRlbnQpIHsKKyAgaW50IHRvczsKKyAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfY29uczsKKworICB0b3MgPSBwLT5zdGFja190b3A7CisgIEtFX1RSQUNFKDEwLCAoIl9fa21wX3BvcF93b3Jrc2hhcmUgKCVkICVkKVxuIiwgZ3RpZCwgX19rbXBfZ2V0X2d0aWQoKSkpOworICBpZiAodG9zID09IDAgfHwgcC0+d190b3AgPT0gMCkgeworICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdChrbXBfaTE4bl9tc2dfQ25zRGV0ZWN0ZWRFbmQsIGN0LCBpZGVudCk7CisgIH0KKworICBpZiAodG9zICE9IHAtPndfdG9wIHx8CisgICAgICAocC0+c3RhY2tfZGF0YVt0b3NdLnR5cGUgIT0gY3QgJiYKKyAgICAgICAvLyBiZWxvdyBhcmUgdHdvIGV4Y2VwdGlvbnMgdG8gdGhlIHJ1bGUgdGhhdCBjb25zdHJ1Y3QgdHlwZXMgbXVzdCBtYXRjaAorICAgICAgICEocC0+c3RhY2tfZGF0YVt0b3NdLnR5cGUgPT0gY3RfcGRvX29yZGVyZWQgJiYgY3QgPT0gY3RfcGRvKSAmJgorICAgICAgICEocC0+c3RhY2tfZGF0YVt0b3NdLnR5cGUgPT0gY3RfdGFza19vcmRlcmVkICYmIGN0ID09IGN0X3Rhc2spKSkgeworICAgIF9fa21wX2NoZWNrX251bGxfZnVuYygpOworICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoa21wX2kxOG5fbXNnX0Nuc0V4cGVjdGVkRW5kLCBjdCwgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcC0+c3RhY2tfZGF0YVt0b3NdKTsKKyAgfQorICBLRV9UUkFDRSgxMDAsIChQT1BfTVNHKHApKSk7CisgIHAtPndfdG9wID0gcC0+c3RhY2tfZGF0YVt0b3NdLnByZXY7CisgIHAtPnN0YWNrX2RhdGFbdG9zXS50eXBlID0gY3Rfbm9uZTsKKyAgcC0+c3RhY2tfZGF0YVt0b3NdLmlkZW50ID0gTlVMTDsKKyAgcC0+c3RhY2tfdG9wID0gdG9zIC0gMTsKKyAgS0VfRFVNUCgxMDAwLCBkdW1wX2NvbnNfc3RhY2soZ3RpZCwgcCkpOworICByZXR1cm4gcC0+c3RhY2tfZGF0YVtwLT53X3RvcF0udHlwZTsKK30KKwordm9pZCBfX2ttcF9wb3Bfc3luYyhpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKmlkZW50KSB7CisgIGludCB0b3M7CisgIHN0cnVjdCBjb25zX2hlYWRlciAqcCA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX2NvbnM7CisgIHRvcyA9IHAtPnN0YWNrX3RvcDsKKyAgS0VfVFJBQ0UoMTAsICgiX19rbXBfcG9wX3N5bmMgKCVkICVkKVxuIiwgZ3RpZCwgX19rbXBfZ2V0X2d0aWQoKSkpOworICBpZiAodG9zID09IDAgfHwgcC0+c190b3AgPT0gMCkgeworICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdChrbXBfaTE4bl9tc2dfQ25zRGV0ZWN0ZWRFbmQsIGN0LCBpZGVudCk7CisgIH07CisgIGlmICh0b3MgIT0gcC0+c190b3AgfHwgcC0+c3RhY2tfZGF0YVt0b3NdLnR5cGUgIT0gY3QpIHsKKyAgICBfX2ttcF9jaGVja19udWxsX2Z1bmMoKTsKKyAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKGttcF9pMThuX21zZ19DbnNFeHBlY3RlZEVuZCwgY3QsIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPnN0YWNrX2RhdGFbdG9zXSk7CisgIH07CisgIGlmIChndGlkIDwgMCkgeworICAgIF9fa21wX2NoZWNrX251bGxfZnVuYygpOworICB9OworICBLRV9UUkFDRSgxMDAsIChQT1BfTVNHKHApKSk7CisgIHAtPnNfdG9wID0gcC0+c3RhY2tfZGF0YVt0b3NdLnByZXY7CisgIHAtPnN0YWNrX2RhdGFbdG9zXS50eXBlID0gY3Rfbm9uZTsKKyAgcC0+c3RhY2tfZGF0YVt0b3NdLmlkZW50ID0gTlVMTDsKKyAgcC0+c3RhY2tfdG9wID0gdG9zIC0gMTsKKyAgS0VfRFVNUCgxMDAwLCBkdW1wX2NvbnNfc3RhY2soZ3RpZCwgcCkpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBfX2ttcF9jaGVja19iYXJyaWVyKGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqaWRlbnQpIHsKKyAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfY29uczsKKyAgS0VfVFJBQ0UoMTAsICgiX19rbXBfY2hlY2tfYmFycmllciAobG9jOiAlcCwgZ3RpZDogJWQgJWQpXG4iLCBpZGVudCwgZ3RpZCwKKyAgICAgICAgICAgICAgICBfX2ttcF9nZXRfZ3RpZCgpKSk7CisgIGlmIChpZGVudCAhPSAwKSB7CisgICAgX19rbXBfY2hlY2tfbnVsbF9mdW5jKCk7CisgIH0KKyAgaWYgKHAtPndfdG9wID4gcC0+cF90b3ApIHsKKyAgICAvKiB3ZSBhcmUgYWxyZWFkeSBpbiBhIFdPUktTSEFSSU5HIGNvbnN0cnVjdCBmb3IgdGhpcyBQQVJBTExFTCByZWdpb24gKi8KKyAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKGttcF9pMThuX21zZ19DbnNJbnZhbGlkTmVzdGluZywgY3QsIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPnN0YWNrX2RhdGFbcC0+d190b3BdKTsKKyAgfQorICBpZiAocC0+c190b3AgPiBwLT5wX3RvcCkgeworICAgIC8qIHdlIGFyZSBhbHJlYWR5IGluIGEgU1lOQyBjb25zdHJ1Y3QgZm9yIHRoaXMgUEFSQUxMRUwgcmVnaW9uICovCisgICAgX19rbXBfZXJyb3JfY29uc3RydWN0MihrbXBfaTE4bl9tc2dfQ25zSW52YWxpZE5lc3RpbmcsIGN0LCBpZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZwLT5zdGFja19kYXRhW3AtPnNfdG9wXSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9lcnJvci5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Vycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYxNDEyMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9lcnJvci5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBrbXBfZXJyb3IuaCAtLSBQVFMgZnVuY3Rpb25zIGZvciBlcnJvciBjaGVja2luZyBhdCBydW50aW1lLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9FUlJPUl9ICisjZGVmaW5lIEtNUF9FUlJPUl9ICisKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordm9pZCBfX2ttcF9lcnJvcl9jb25zdHJ1Y3Qoa21wX2kxOG5faWRfdCBpZCwgZW51bSBjb25zX3R5cGUgY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudF90IGNvbnN0ICppZGVudCk7Cit2b2lkIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoa21wX2kxOG5faWRfdCBpZCwgZW51bSBjb25zX3R5cGUgY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRfdCBjb25zdCAqaWRlbnQsIHN0cnVjdCBjb25zX2RhdGEgY29uc3QgKmNvbnMpOworCitzdHJ1Y3QgY29uc19oZWFkZXIgKl9fa21wX2FsbG9jYXRlX2NvbnNfc3RhY2soaW50IGd0aWQpOwordm9pZCBfX2ttcF9mcmVlX2NvbnNfc3RhY2sodm9pZCAqcHRyKTsKKwordm9pZCBfX2ttcF9wdXNoX3BhcmFsbGVsKGludCBndGlkLCBpZGVudF90IGNvbnN0ICppZGVudCk7Cit2b2lkIF9fa21wX3B1c2hfd29ya3NoYXJlKGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqaWRlbnQpOworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCit2b2lkIF9fa21wX3B1c2hfc3luYyhpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKmlkZW50LAorICAgICAgICAgICAgICAgICAgICAga21wX3VzZXJfbG9ja19wIG5hbWUsIGttcF91aW50MzIpOworI2Vsc2UKK3ZvaWQgX19rbXBfcHVzaF9zeW5jKGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICBrbXBfdXNlcl9sb2NrX3AgbmFtZSk7CisjZW5kaWYKKwordm9pZCBfX2ttcF9jaGVja193b3Jrc2hhcmUoaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICppZGVudCk7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKK3ZvaWQgX19rbXBfY2hlY2tfc3luYyhpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKmlkZW50LAorICAgICAgICAgICAgICAgICAgICAgIGttcF91c2VyX2xvY2tfcCBuYW1lLCBrbXBfdWludDMyKTsKKyNlbHNlCit2b2lkIF9fa21wX2NoZWNrX3N5bmMoaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICppZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICBrbXBfdXNlcl9sb2NrX3AgbmFtZSk7CisjZW5kaWYKKwordm9pZCBfX2ttcF9wb3BfcGFyYWxsZWwoaW50IGd0aWQsIGlkZW50X3QgY29uc3QgKmlkZW50KTsKK2VudW0gY29uc190eXBlIF9fa21wX3BvcF93b3Jrc2hhcmUoaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudF90IGNvbnN0ICppZGVudCk7Cit2b2lkIF9fa21wX3BvcF9zeW5jKGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqaWRlbnQpOwordm9pZCBfX2ttcF9jaGVja19iYXJyaWVyKGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqaWRlbnQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAvLyBLTVBfRVJST1JfSApkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2Z0bl9jZGVjbC5jcHAgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZnRuX2NkZWNsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODdkOGI5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Z0bl9jZGVjbC5jcHAKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIGttcF9mdG5fY2RlY2wuY3BwIC0tIEZvcnRyYW4gX19jZGVjbCBsaW5rYWdlIHN1cHBvcnQgZm9yIE9wZW5NUC4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9hZmZpbml0eS5oIgorCisjaWYgS01QX09TX1dJTkRPV1MKKyNpZiBkZWZpbmVkIEtNUF9XSU5fQ0RFQ0wgfHwgIWRlZmluZWQgS01QX0RZTkFNSUNfTElCCisjZGVmaW5lIEtNUF9GVE5fRU5UUklFUyBLTVBfRlROX1VQUEVSCisjZW5kaWYKKyNlbGlmIEtNUF9PU19VTklYCisjZGVmaW5lIEtNUF9GVE5fRU5UUklFUyBLTVBfRlROX1BMQUlOCisjZW5kaWYKKworLy8gTm90ZTogVGhpcyBzdHJpbmcgaXMgbm90IHByaW50ZWQgd2hlbiBLTVBfVkVSU0lPTj0xLgorY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2Z0bmNkZWNsW10gPQorICAgIEtNUF9WRVJTSU9OX1BSRUZJWCAiRm9ydHJhbiBfX2NkZWNsIE9NUCBzdXBwb3J0OiAiCisjaWZkZWYgS01QX0ZUTl9FTlRSSUVTCisgICAgICAgICAgICAgICAgICAgICAgICJ5ZXMiOworI2RlZmluZSBGVE5fU1REQ0FMTCAvKiBubyBzdGRjYWxsICovCisjaW5jbHVkZSAia21wX2Z0bl9vcy5oIgorI2luY2x1ZGUgImttcF9mdG5fZW50cnkuaCIKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICJubyI7CisjZW5kaWYgLyogS01QX0ZUTl9FTlRSSUVTICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZnRuX2VudHJ5LmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZnRuX2VudHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMzODYzZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9mdG5fZW50cnkuaApAQCAtMCwwICsxLDEzMDAgQEAKKy8qCisgKiBrbXBfZnRuX2VudHJ5LmggLS0gRm9ydHJhbiBlbnRyeSBsaW5rYWdlIHN1cHBvcnQgZm9yIE9wZW5NUC4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBGVE5fU1REQ0FMTAorI2Vycm9yIFRoZSBzdXBwb3J0IGZpbGUga21wX2Z0bl9lbnRyeS5oIHNob3VsZCBub3QgYmUgY29tcGlsZWQgYnkgaXRzZWxmLgorI2VuZGlmCisKKyNpZmRlZiBLTVBfU1RVQgorI2luY2x1ZGUgImttcF9zdHViLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImttcF9pMThuLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworLyogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgR251L01TIE9wZW4gTVAgY29kZWdlbiwgb21wX3NldF9udW1fdGhyZWFkcygpLAorICogb21wX3NldF9uZXN0ZWQoKSwgYW5kIG9tcF9zZXRfZHluYW1pYygpIFtpbiBsb3dlcmNhc2Ugb24gTVMsIGFuZCB3L28KKyAqIGEgdHJhaWxpbmcgdW5kZXJzY29yZSBvbiBMaW51eCogT1NdIHRha2UgY2FsbCBieSB2YWx1ZSBpbnRlZ2VyIGFyZ3VtZW50cy4KKyAqICsgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscygpCisgKiArIG9tcF9zZXRfc2NoZWR1bGUoKQorICoKKyAqIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggOS4xIGFuZCBwcmV2aW91cyBJbnRlbCBjb21waWxlciwgdGhlc2UKKyAqIGVudHJ5IHBvaW50cyB0YWtlIGNhbGwgYnkgcmVmZXJlbmNlIGludGVnZXIgYXJndW1lbnRzLiAqLworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2lmIChLTVBfRlROX0VOVFJJRVMgPT0gS01QX0ZUTl9QTEFJTikgfHwgKEtNUF9GVE5fRU5UUklFUyA9PSBLTVBfRlROX1VQUEVSKQorI2RlZmluZSBQQVNTX0FSR1NfQllfVkFMVUUgMQorI2VuZGlmCisjZW5kaWYKKyNpZiBLTVBfT1NfV0lORE9XUworI2lmIChLTVBfRlROX0VOVFJJRVMgPT0gS01QX0ZUTl9QTEFJTikgfHwgKEtNUF9GVE5fRU5UUklFUyA9PSBLTVBfRlROX0FQUEVORCkKKyNkZWZpbmUgUEFTU19BUkdTX0JZX1ZBTFVFIDEKKyNlbmRpZgorI2VuZGlmCisKKy8vIFRoaXMgbWFjcm8gaGVscHMgdG8gcmVkdWNlIGNvZGUgZHVwbGljYXRpb24uCisjaWZkZWYgUEFTU19BUkdTX0JZX1ZBTFVFCisjZGVmaW5lIEtNUF9ERVJFRgorI2Vsc2UKKyNkZWZpbmUgS01QX0RFUkVGICoKKyNlbmRpZgorCit2b2lkIEZUTl9TVERDQUxMIEZUTl9TRVRfU1RBQ0tTSVpFKGludCBLTVBfREVSRUYgYXJnKSB7CisjaWZkZWYgS01QX1NUVUIKKyAgX19rbXBzX3NldF9zdGFja3NpemUoS01QX0RFUkVGIGFyZyk7CisjZWxzZQorICAvLyBfX2ttcF9hdXhfc2V0X3N0YWNrc2l6ZSBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgX19rbXBfYXV4X3NldF9zdGFja3NpemUoKHNpemVfdClLTVBfREVSRUYgYXJnKTsKKyNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMIEZUTl9TRVRfU1RBQ0tTSVpFX1Moc2l6ZV90IEtNUF9ERVJFRiBhcmcpIHsKKyNpZmRlZiBLTVBfU1RVQgorICBfX2ttcHNfc2V0X3N0YWNrc2l6ZShLTVBfREVSRUYgYXJnKTsKKyNlbHNlCisgIC8vIF9fa21wX2F1eF9zZXRfc3RhY2tzaXplIGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICBfX2ttcF9hdXhfc2V0X3N0YWNrc2l6ZShLTVBfREVSRUYgYXJnKTsKKyNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwgRlROX0dFVF9TVEFDS1NJWkUodm9pZCkgeworI2lmZGVmIEtNUF9TVFVCCisgIHJldHVybiBfX2ttcHNfZ2V0X3N0YWNrc2l6ZSgpOworI2Vsc2UKKyAgaWYgKCFfX2ttcF9pbml0X3NlcmlhbCkgeworICAgIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCk7CisgIH07CisgIHJldHVybiAoaW50KV9fa21wX3N0a3NpemU7CisjZW5kaWYKK30KKworc2l6ZV90IEZUTl9TVERDQUxMIEZUTl9HRVRfU1RBQ0tTSVpFX1Modm9pZCkgeworI2lmZGVmIEtNUF9TVFVCCisgIHJldHVybiBfX2ttcHNfZ2V0X3N0YWNrc2l6ZSgpOworI2Vsc2UKKyAgaWYgKCFfX2ttcF9pbml0X3NlcmlhbCkgeworICAgIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCk7CisgIH07CisgIHJldHVybiBfX2ttcF9zdGtzaXplOworI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwgRlROX1NFVF9CTE9DS1RJTUUoaW50IEtNUF9ERVJFRiBhcmcpIHsKKyNpZmRlZiBLTVBfU1RVQgorICBfX2ttcHNfc2V0X2Jsb2NrdGltZShLTVBfREVSRUYgYXJnKTsKKyNlbHNlCisgIGludCBndGlkLCB0aWQ7CisgIGttcF9pbmZvX3QgKnRocmVhZDsKKworICBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworICB0aHJlYWQgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKGd0aWQpOworCisgIF9fa21wX2F1eF9zZXRfYmxvY2t0aW1lKEtNUF9ERVJFRiBhcmcsIHRocmVhZCwgdGlkKTsKKyNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwgRlROX0dFVF9CTE9DS1RJTUUodm9pZCkgeworI2lmZGVmIEtNUF9TVFVCCisgIHJldHVybiBfX2ttcHNfZ2V0X2Jsb2NrdGltZSgpOworI2Vsc2UKKyAgaW50IGd0aWQsIHRpZDsKKyAga21wX2luZm9fdCAqdGhyZWFkOworICBrbXBfdGVhbV9wICp0ZWFtOworCisgIGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgIHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCk7CisgIHRocmVhZCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoZ3RpZCk7CisgIHRlYW0gPSBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF90ZWFtOworCisgIC8qIFRoZXNlIG11c3QgbWF0Y2ggdGhlIHNldHRpbmdzIHVzZWQgaW4gX19rbXBfd2FpdF9zbGVlcCgpICovCisgIGlmIChfX2ttcF9kZmx0X2Jsb2NrdGltZSA9PSBLTVBfTUFYX0JMT0NLVElNRSkgeworICAgIEtGX1RSQUNFKDEwLCAoImttcF9nZXRfYmxvY2t0aW1lOiBUIyVkKCVkOiVkKSwgYmxvY2t0aW1lPSVkXG4iLCBndGlkLAorICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCB0aWQsIEtNUF9NQVhfQkxPQ0tUSU1FKSk7CisgICAgcmV0dXJuIEtNUF9NQVhfQkxPQ0tUSU1FOworICB9CisjaWZkZWYgS01QX0FESlVTVF9CTE9DS1RJTUUKKyAgZWxzZSBpZiAoX19rbXBfemVyb19idCAmJiAhZ2V0X19idF9zZXQodGVhbSwgdGlkKSkgeworICAgIEtGX1RSQUNFKDEwLCAoImttcF9nZXRfYmxvY2t0aW1lOiBUIyVkKCVkOiVkKSwgYmxvY2t0aW1lPSVkXG4iLCBndGlkLAorICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCB0aWQsIDApKTsKKyAgICByZXR1cm4gMDsKKyAgfQorI2VuZGlmIC8qIEtNUF9BREpVU1RfQkxPQ0tUSU1FICovCisgIGVsc2UgeworICAgIEtGX1RSQUNFKDEwLCAoImttcF9nZXRfYmxvY2t0aW1lOiBUIyVkKCVkOiVkKSwgYmxvY2t0aW1lPSVkXG4iLCBndGlkLAorICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCB0aWQsIGdldF9fYmxvY2t0aW1lKHRlYW0sIHRpZCkpKTsKKyAgICByZXR1cm4gZ2V0X19ibG9ja3RpbWUodGVhbSwgdGlkKTsKKyAgfTsKKyNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMIEZUTl9TRVRfTElCUkFSWV9TRVJJQUwodm9pZCkgeworI2lmZGVmIEtNUF9TVFVCCisgIF9fa21wc19zZXRfbGlicmFyeShsaWJyYXJ5X3NlcmlhbCk7CisjZWxzZQorICAvLyBfX2ttcF91c2VyX3NldF9saWJyYXJ5IGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICBfX2ttcF91c2VyX3NldF9saWJyYXJ5KGxpYnJhcnlfc2VyaWFsKTsKKyNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMIEZUTl9TRVRfTElCUkFSWV9UVVJOQVJPVU5EKHZvaWQpIHsKKyNpZmRlZiBLTVBfU1RVQgorICBfX2ttcHNfc2V0X2xpYnJhcnkobGlicmFyeV90dXJuYXJvdW5kKTsKKyNlbHNlCisgIC8vIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkobGlicmFyeV90dXJuYXJvdW5kKTsKKyNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMIEZUTl9TRVRfTElCUkFSWV9USFJPVUdIUFVUKHZvaWQpIHsKKyNpZmRlZiBLTVBfU1RVQgorICBfX2ttcHNfc2V0X2xpYnJhcnkobGlicmFyeV90aHJvdWdocHV0KTsKKyNlbHNlCisgIC8vIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkobGlicmFyeV90aHJvdWdocHV0KTsKKyNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMIEZUTl9TRVRfTElCUkFSWShpbnQgS01QX0RFUkVGIGFyZykgeworI2lmZGVmIEtNUF9TVFVCCisgIF9fa21wc19zZXRfbGlicmFyeShLTVBfREVSRUYgYXJnKTsKKyNlbHNlCisgIGVudW0gbGlicmFyeV90eXBlIGxpYjsKKyAgbGliID0gKGVudW0gbGlicmFyeV90eXBlKUtNUF9ERVJFRiBhcmc7CisgIC8vIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgIF9fa21wX3VzZXJfc2V0X2xpYnJhcnkobGliKTsKKyNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwgRlROX0dFVF9MSUJSQVJZKHZvaWQpIHsKKyNpZmRlZiBLTVBfU1RVQgorICByZXR1cm4gX19rbXBzX2dldF9saWJyYXJ5KCk7CisjZWxzZQorICBpZiAoIV9fa21wX2luaXRfc2VyaWFsKSB7CisgICAgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgfQorICByZXR1cm4gKChpbnQpX19rbXBfbGlicmFyeSk7CisjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTCBGVE5fU0VUX0RJU1BfTlVNX0JVRkZFUlMoaW50IEtNUF9ERVJFRiBhcmcpIHsKKyNpZmRlZiBLTVBfU1RVQgorICA7IC8vIGVtcHR5IHJvdXRpbmUKKyNlbHNlCisgIC8vIGlnbm9yZSBhZnRlciBpbml0aWFsaXphdGlvbiBiZWNhdXNlIHNvbWUgdGVhbXMgaGF2ZSBhbHJlYWR5CisgIC8vIGFsbG9jYXRlZCBkaXNwYXRjaCBidWZmZXJzCisgIGlmIChfX2ttcF9pbml0X3NlcmlhbCA9PSAwICYmIChLTVBfREVSRUYgYXJnKSA+IDApCisgICAgX19rbXBfZGlzcGF0Y2hfbnVtX2J1ZmZlcnMgPSBLTVBfREVSRUYgYXJnOworI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTCBGVE5fU0VUX0FGRklOSVRZKHZvaWQgKiptYXNrKSB7CisjaWYgZGVmaW5lZChLTVBfU1RVQikgfHwgIUtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgcmV0dXJuIC0xOworI2Vsc2UKKyAgaWYgKCFUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkpIHsKKyAgICBfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSgpOworICB9CisgIHJldHVybiBfX2ttcF9hdXhfc2V0X2FmZmluaXR5KG1hc2spOworI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTCBGVE5fR0VUX0FGRklOSVRZKHZvaWQgKiptYXNrKSB7CisjaWYgZGVmaW5lZChLTVBfU1RVQikgfHwgIUtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgcmV0dXJuIC0xOworI2Vsc2UKKyAgaWYgKCFUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkpIHsKKyAgICBfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSgpOworICB9CisgIHJldHVybiBfX2ttcF9hdXhfZ2V0X2FmZmluaXR5KG1hc2spOworI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTCBGVE5fR0VUX0FGRklOSVRZX01BWF9QUk9DKHZvaWQpIHsKKyNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICByZXR1cm4gMDsKKyNlbHNlCisgIC8vIFdlIHJlYWxseSBvbmx5IE5FRUQgc2VyaWFsIGluaXRpYWxpemF0aW9uIGhlcmUuCisgIGlmICghVENSXzQoX19rbXBfaW5pdF9taWRkbGUpKSB7CisgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgfQorICByZXR1cm4gX19rbXBfYXV4X2dldF9hZmZpbml0eV9tYXhfcHJvYygpOworI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwgRlROX0NSRUFURV9BRkZJTklUWV9NQVNLKHZvaWQgKiptYXNrKSB7CisjaWYgZGVmaW5lZChLTVBfU1RVQikgfHwgIUtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgKm1hc2sgPSBOVUxMOworI2Vsc2UKKyAgLy8gV2UgcmVhbGx5IG9ubHkgTkVFRCBzZXJpYWwgaW5pdGlhbGl6YXRpb24gaGVyZS4KKyAga21wX2FmZmluX21hc2tfdCAqbWFza19pbnRlcm5hbHM7CisgIGlmICghVENSXzQoX19rbXBfaW5pdF9taWRkbGUpKSB7CisgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgfQorICBtYXNrX2ludGVybmFscyA9IF9fa21wX2FmZmluaXR5X2Rpc3BhdGNoLT5hbGxvY2F0ZV9tYXNrKCk7CisgIEtNUF9DUFVfWkVSTyhtYXNrX2ludGVybmFscyk7CisgICptYXNrID0gbWFza19pbnRlcm5hbHM7CisjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTCBGVE5fREVTVFJPWV9BRkZJTklUWV9NQVNLKHZvaWQgKiptYXNrKSB7CisjaWYgZGVmaW5lZChLTVBfU1RVQikgfHwgIUtNUF9BRkZJTklUWV9TVVBQT1JURUQKKy8vIE5vdGhpbmcKKyNlbHNlCisgIC8vIFdlIHJlYWxseSBvbmx5IE5FRUQgc2VyaWFsIGluaXRpYWxpemF0aW9uIGhlcmUuCisgIGttcF9hZmZpbl9tYXNrX3QgKm1hc2tfaW50ZXJuYWxzOworICBpZiAoIVRDUl80KF9fa21wX2luaXRfbWlkZGxlKSkgeworICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgIH0KKyAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgIGlmICgqbWFzayA9PSBOVUxMKSB7CisgICAgICBLTVBfRkFUQUwoQWZmaW5pdHlJbnZhbGlkTWFzaywgImttcF9kZXN0cm95X2FmZmluaXR5X21hc2siKTsKKyAgICB9CisgIH0KKyAgbWFza19pbnRlcm5hbHMgPSAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzayk7CisgIF9fa21wX2FmZmluaXR5X2Rpc3BhdGNoLT5kZWFsbG9jYXRlX21hc2sobWFza19pbnRlcm5hbHMpOworICAqbWFzayA9IE5VTEw7CisjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMIEZUTl9TRVRfQUZGSU5JVFlfTUFTS19QUk9DKGludCBLTVBfREVSRUYgcHJvYywgdm9pZCAqKm1hc2spIHsKKyNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICByZXR1cm4gLTE7CisjZWxzZQorICBpZiAoIVRDUl80KF9fa21wX2luaXRfbWlkZGxlKSkgeworICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgIH0KKyAgcmV0dXJuIF9fa21wX2F1eF9zZXRfYWZmaW5pdHlfbWFza19wcm9jKEtNUF9ERVJFRiBwcm9jLCBtYXNrKTsKKyNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwgRlROX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQyhpbnQgS01QX0RFUkVGIHByb2MsIHZvaWQgKiptYXNrKSB7CisjaWYgZGVmaW5lZChLTVBfU1RVQikgfHwgIUtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgcmV0dXJuIC0xOworI2Vsc2UKKyAgaWYgKCFUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkpIHsKKyAgICBfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSgpOworICB9CisgIHJldHVybiBfX2ttcF9hdXhfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKEtNUF9ERVJFRiBwcm9jLCBtYXNrKTsKKyNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwgRlROX0dFVF9BRkZJTklUWV9NQVNLX1BST0MoaW50IEtNUF9ERVJFRiBwcm9jLCB2b2lkICoqbWFzaykgeworI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgIHJldHVybiAtMTsKKyNlbHNlCisgIGlmICghVENSXzQoX19rbXBfaW5pdF9taWRkbGUpKSB7CisgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgfQorICByZXR1cm4gX19rbXBfYXV4X2dldF9hZmZpbml0eV9tYXNrX3Byb2MoS01QX0RFUkVGIHByb2MsIG1hc2spOworI2VuZGlmCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBzZXRzIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIHRocmVhZHMgZm9yIHRoZSBuZXh0IHBhcmFsbGVsIHJlZ2lvbiAqLwordm9pZCBGVE5fU1REQ0FMTCB4ZXhwYW5kKEZUTl9TRVRfTlVNX1RIUkVBRFMpKGludCBLTVBfREVSRUYgYXJnKSB7CisjaWZkZWYgS01QX1NUVUIKKy8vIE5vdGhpbmcuCisjZWxzZQorICBfX2ttcF9zZXRfbnVtX3RocmVhZHMoS01QX0RFUkVGIGFyZywgX19rbXBfZW50cnlfZ3RpZCgpKTsKKyNlbmRpZgorfQorCisvKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBpbiBjdXJyZW50IHRlYW0gKi8KK2ludCBGVE5fU1REQ0FMTCB4ZXhwYW5kKEZUTl9HRVRfTlVNX1RIUkVBRFMpKHZvaWQpIHsKKyNpZmRlZiBLTVBfU1RVQgorICByZXR1cm4gMTsKKyNlbHNlCisgIC8vIF9fa21wY19ib3VuZF9udW1fdGhyZWFkcyBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgcmV0dXJuIF9fa21wY19ib3VuZF9udW1fdGhyZWFkcyhOVUxMKTsKKyNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwgeGV4cGFuZChGVE5fR0VUX01BWF9USFJFQURTKSh2b2lkKSB7CisjaWZkZWYgS01QX1NUVUIKKyAgcmV0dXJuIDE7CisjZWxzZQorICBpbnQgZ3RpZDsKKyAga21wX2luZm9fdCAqdGhyZWFkOworICBpZiAoIVRDUl80KF9fa21wX2luaXRfbWlkZGxlKSkgeworICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgIH0KKyAgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgdGhyZWFkID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgLy8gcmV0dXJuIHRocmVhZCAtPiB0aC50aF90ZWFtIC0+IHQudF9jdXJyZW50X3Rhc2tbCisgIC8vIHRocmVhZC0+dGgudGhfaW5mby5kcy5kc190aWQgXSAtPiBpY3ZzLm5wcm9jOworICByZXR1cm4gdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubnByb2M7CisjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMIHhleHBhbmQoRlROX0dFVF9USFJFQURfTlVNKSh2b2lkKSB7CisjaWZkZWYgS01QX1NUVUIKKyAgcmV0dXJuIDA7CisjZWxzZQorICBpbnQgZ3RpZDsKKworI2lmIEtNUF9PU19EQVJXSU4gfHwgS01QX09TX0ZSRUVCU0QgfHwgS01QX09TX05FVEJTRAorICBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworI2VsaWYgS01QX09TX1dJTkRPV1MKKyAgaWYgKCFfX2ttcF9pbml0X3BhcmFsbGVsIHx8CisgICAgICAoZ3RpZCA9IChpbnQpKChrbXBfaW50cHRyX3QpVGxzR2V0VmFsdWUoX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSkpKSA9PQorICAgICAgICAgIDApIHsKKyAgICAvLyBFaXRoZXIgbGlicmFyeSBpc24ndCBpbml0aWFsaXplZCBvciB0aHJlYWQgaXMgbm90IHJlZ2lzdGVyZWQKKyAgICAvLyAwIGlzIHRoZSBjb3JyZWN0IFRJRCBpbiB0aGlzIGNhc2UKKyAgICByZXR1cm4gMDsKKyAgfQorICAtLWd0aWQ7IC8vIFdlIGtlZXAgKGd0aWQrMSkgaW4gVExTCisjZWxpZiBLTVBfT1NfTElOVVgKKyNpZmRlZiBLTVBfVERBVEFfR1RJRAorICBpZiAoX19rbXBfZ3RpZF9tb2RlID49IDMpIHsKKyAgICBpZiAoKGd0aWQgPSBfX2ttcF9ndGlkKSA9PSBLTVBfR1RJRF9ETkUpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfSBlbHNlIHsKKyNlbmRpZgorICAgIGlmICghX19rbXBfaW5pdF9wYXJhbGxlbCB8fAorICAgICAgICAoZ3RpZCA9IChrbXBfaW50cHRyX3QpKAorICAgICAgICAgICAgIHB0aHJlYWRfZ2V0c3BlY2lmaWMoX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSkpKSA9PSAwKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLS1ndGlkOworI2lmZGVmIEtNUF9UREFUQV9HVElECisgIH0KKyNlbmRpZgorI2Vsc2UKKyNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TCisjZW5kaWYKKworICByZXR1cm4gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKyNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwgRlROX0dFVF9OVU1fS05PV05fVEhSRUFEUyh2b2lkKSB7CisjaWZkZWYgS01QX1NUVUIKKyAgcmV0dXJuIDE7CisjZWxzZQorICBpZiAoIV9fa21wX2luaXRfc2VyaWFsKSB7CisgICAgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgfQorICAvKiBOT1RFOiB0aGlzIGlzIG5vdCBzeW5jcm9uaXplZCwgc28gaXQgY2FuIGNoYW5nZSBhdCBhbnkgbW9tZW50ICovCisgIC8qIE5PVEU6IHRoaXMgbnVtYmVyIGFsc28gaW5jbHVkZXMgdGhyZWFkcyBwcmVhbGxvY2F0ZWQgaW4gaG90LXRlYW1zICovCisgIHJldHVybiBUQ1JfNChfX2ttcF9udGgpOworI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTCB4ZXhwYW5kKEZUTl9HRVRfTlVNX1BST0NTKSh2b2lkKSB7CisjaWZkZWYgS01QX1NUVUIKKyAgcmV0dXJuIDE7CisjZWxzZQorICBpZiAoIVRDUl80KF9fa21wX2luaXRfbWlkZGxlKSkgeworICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgIH0KKyAgcmV0dXJuIF9fa21wX2F2YWlsX3Byb2M7CisjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTCB4ZXhwYW5kKEZUTl9TRVRfTkVTVEVEKShpbnQgS01QX0RFUkVGIGZsYWcpIHsKKyNpZmRlZiBLTVBfU1RVQgorICBfX2ttcHNfc2V0X25lc3RlZChLTVBfREVSRUYgZmxhZyk7CisjZWxzZQorICBrbXBfaW5mb190ICp0aHJlYWQ7CisgIC8qIEZvciB0aGUgdGhyZWFkLXByaXZhdGUgaW50ZXJuYWwgY29udHJvbHMgaW1wbGVtZW50YXRpb24gKi8KKyAgdGhyZWFkID0gX19rbXBfZW50cnlfdGhyZWFkKCk7CisgIF9fa21wX3NhdmVfaW50ZXJuYWxfY29udHJvbHModGhyZWFkKTsKKyAgc2V0X19uZXN0ZWQodGhyZWFkLCAoKEtNUF9ERVJFRiBmbGFnKSA/IFRSVUUgOiBGQUxTRSkpOworI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTCB4ZXhwYW5kKEZUTl9HRVRfTkVTVEVEKSh2b2lkKSB7CisjaWZkZWYgS01QX1NUVUIKKyAgcmV0dXJuIF9fa21wc19nZXRfbmVzdGVkKCk7CisjZWxzZQorICBrbXBfaW5mb190ICp0aHJlYWQ7CisgIHRocmVhZCA9IF9fa21wX2VudHJ5X3RocmVhZCgpOworICByZXR1cm4gZ2V0X19uZXN0ZWQodGhyZWFkKTsKKyNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMIHhleHBhbmQoRlROX1NFVF9EWU5BTUlDKShpbnQgS01QX0RFUkVGIGZsYWcpIHsKKyNpZmRlZiBLTVBfU1RVQgorICBfX2ttcHNfc2V0X2R5bmFtaWMoS01QX0RFUkVGIGZsYWcgPyBUUlVFIDogRkFMU0UpOworI2Vsc2UKKyAga21wX2luZm9fdCAqdGhyZWFkOworICAvKiBGb3IgdGhlIHRocmVhZC1wcml2YXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cm9scyAqLworICB0aHJlYWQgPSBfX2ttcF9lbnRyeV90aHJlYWQoKTsKKyAgLy8gISEhIFdoYXQgaWYgZm9yZWlnbiB0aHJlYWQgY2FsbHMgaXQ/CisgIF9fa21wX3NhdmVfaW50ZXJuYWxfY29udHJvbHModGhyZWFkKTsKKyAgc2V0X19keW5hbWljKHRocmVhZCwgS01QX0RFUkVGIGZsYWcgPyBUUlVFIDogRkFMU0UpOworI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTCB4ZXhwYW5kKEZUTl9HRVRfRFlOQU1JQykodm9pZCkgeworI2lmZGVmIEtNUF9TVFVCCisgIHJldHVybiBfX2ttcHNfZ2V0X2R5bmFtaWMoKTsKKyNlbHNlCisgIGttcF9pbmZvX3QgKnRocmVhZDsKKyAgdGhyZWFkID0gX19rbXBfZW50cnlfdGhyZWFkKCk7CisgIHJldHVybiBnZXRfX2R5bmFtaWModGhyZWFkKTsKKyNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwgeGV4cGFuZChGVE5fSU5fUEFSQUxMRUwpKHZvaWQpIHsKKyNpZmRlZiBLTVBfU1RVQgorICByZXR1cm4gMDsKKyNlbHNlCisgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfZW50cnlfdGhyZWFkKCk7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgaWYgKHRoLT50aC50aF90ZWFtc19taWNyb3Rhc2spIHsKKyAgICAvLyBBQzogcl9pbl9wYXJhbGxlbCBkb2VzIG5vdCB3b3JrIGluc2lkZSB0ZWFtcyBjb25zdHJ1Y3Qgd2hlcmUgcmVhbAorICAgIC8vIHBhcmFsbGVsIGlzIGluYWN0aXZlLCBidXQgYWxsIHRocmVhZHMgaGF2ZSBzYW1lIHJvb3QsIHNvIHNldHRpbmcgaXQgaW4KKyAgICAvLyBvbmUgdGVhbSBhZmZlY3RzIG90aGVyIHRlYW1zLgorICAgIC8vIFRoZSBzb2x1dGlvbiBpcyB0byB1c2UgcGVyLXRlYW0gbmVzdGluZyBsZXZlbAorICAgIHJldHVybiAodGgtPnRoLnRoX3RlYW0tPnQudF9hY3RpdmVfbGV2ZWwgPyAxIDogMCk7CisgIH0gZWxzZQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgcmV0dXJuICh0aC0+dGgudGhfcm9vdC0+ci5yX2luX3BhcmFsbGVsID8gRlROX1RSVUUgOiBGVE5fRkFMU0UpOworI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwgeGV4cGFuZChGVE5fU0VUX1NDSEVEVUxFKShrbXBfc2NoZWRfdCBLTVBfREVSRUYga2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgS01QX0RFUkVGIG1vZGlmaWVyKSB7CisjaWZkZWYgS01QX1NUVUIKKyAgX19rbXBzX3NldF9zY2hlZHVsZShLTVBfREVSRUYga2luZCwgS01QX0RFUkVGIG1vZGlmaWVyKTsKKyNlbHNlCisgIC8qIFRPIERPOiBGb3IgdGhlIHBlci10YXNrIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cm9scyAqLworICBfX2ttcF9zZXRfc2NoZWR1bGUoX19rbXBfZW50cnlfZ3RpZCgpLCBLTVBfREVSRUYga2luZCwgS01QX0RFUkVGIG1vZGlmaWVyKTsKKyNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMIHhleHBhbmQoRlROX0dFVF9TQ0hFRFVMRSkoa21wX3NjaGVkX3QgKmtpbmQsIGludCAqbW9kaWZpZXIpIHsKKyNpZmRlZiBLTVBfU1RVQgorICBfX2ttcHNfZ2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKTsKKyNlbHNlCisgIC8qIFRPIERPOiBGb3IgdGhlIHBlci10YXNrIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cm9scyAqLworICBfX2ttcF9nZXRfc2NoZWR1bGUoX19rbXBfZW50cnlfZ3RpZCgpLCBraW5kLCBtb2RpZmllcik7CisjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTCB4ZXhwYW5kKEZUTl9TRVRfTUFYX0FDVElWRV9MRVZFTFMpKGludCBLTVBfREVSRUYgYXJnKSB7CisjaWZkZWYgS01QX1NUVUIKKy8vIE5vdGhpbmcuCisjZWxzZQorICAvKiBUTyBETzogV2Ugd2FudCBwZXItdGFzayBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVybmFsIGNvbnRyb2wgKi8KKyAgX19rbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKF9fa21wX2VudHJ5X2d0aWQoKSwgS01QX0RFUkVGIGFyZyk7CisjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMIHhleHBhbmQoRlROX0dFVF9NQVhfQUNUSVZFX0xFVkVMUykodm9pZCkgeworI2lmZGVmIEtNUF9TVFVCCisgIHJldHVybiAwOworI2Vsc2UKKyAgLyogVE8gRE86IFdlIHdhbnQgcGVyLXRhc2sgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcm5hbCBjb250cm9sICovCisgIHJldHVybiBfX2ttcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMoX19rbXBfZW50cnlfZ3RpZCgpKTsKKyNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwgeGV4cGFuZChGVE5fR0VUX0FDVElWRV9MRVZFTCkodm9pZCkgeworI2lmZGVmIEtNUF9TVFVCCisgIHJldHVybiAwOyAvLyByZXR1cm5zIDAgaWYgaXQgaXMgY2FsbGVkIGZyb20gdGhlIHNlcXVlbnRpYWwgcGFydCBvZiB0aGUgcHJvZ3JhbQorI2Vsc2UKKyAgLyogVE8gRE86IEZvciB0aGUgcGVyLXRhc2sgaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVybmFsIGNvbnRyb2xzICovCisgIHJldHVybiBfX2ttcF9lbnRyeV90aHJlYWQoKS0+dGgudGhfdGVhbS0+dC50X2FjdGl2ZV9sZXZlbDsKKyNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwgeGV4cGFuZChGVE5fR0VUX0xFVkVMKSh2b2lkKSB7CisjaWZkZWYgS01QX1NUVUIKKyAgcmV0dXJuIDA7IC8vIHJldHVybnMgMCBpZiBpdCBpcyBjYWxsZWQgZnJvbSB0aGUgc2VxdWVudGlhbCBwYXJ0IG9mIHRoZSBwcm9ncmFtCisjZWxzZQorICAvKiBUTyBETzogRm9yIHRoZSBwZXItdGFzayBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJvbHMgKi8KKyAgcmV0dXJuIF9fa21wX2VudHJ5X3RocmVhZCgpLT50aC50aF90ZWFtLT50LnRfbGV2ZWw7CisjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMIHhleHBhbmQoRlROX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNKShpbnQgS01QX0RFUkVGIGxldmVsKSB7CisjaWZkZWYgS01QX1NUVUIKKyAgcmV0dXJuIChLTVBfREVSRUYgbGV2ZWwpID8gKC0xKSA6ICgwKTsKKyNlbHNlCisgIHJldHVybiBfX2ttcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bShfX2ttcF9lbnRyeV9ndGlkKCksIEtNUF9ERVJFRiBsZXZlbCk7CisjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMIHhleHBhbmQoRlROX0dFVF9URUFNX1NJWkUpKGludCBLTVBfREVSRUYgbGV2ZWwpIHsKKyNpZmRlZiBLTVBfU1RVQgorICByZXR1cm4gKEtNUF9ERVJFRiBsZXZlbCkgPyAoLTEpIDogKDEpOworI2Vsc2UKKyAgcmV0dXJuIF9fa21wX2dldF90ZWFtX3NpemUoX19rbXBfZW50cnlfZ3RpZCgpLCBLTVBfREVSRUYgbGV2ZWwpOworI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTCB4ZXhwYW5kKEZUTl9HRVRfVEhSRUFEX0xJTUlUKSh2b2lkKSB7CisjaWZkZWYgS01QX1NUVUIKKyAgcmV0dXJuIDE7IC8vIFRPIERPOiBjbGFyaWZ5IHdoZXRoZXIgaXQgcmV0dXJucyAxIG9yIDA/CisjZWxzZQorICBpZiAoIV9fa21wX2luaXRfc2VyaWFsKSB7CisgICAgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgfTsKKyAgLyogZ2xvYmFsIElDViAqLworICByZXR1cm4gX19rbXBfbWF4X250aDsKKyNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwgeGV4cGFuZChGVE5fSU5fRklOQUwpKHZvaWQpIHsKKyNpZmRlZiBLTVBfU1RVQgorICByZXR1cm4gMDsgLy8gVE8gRE86IGNsYXJpZnkgd2hldGhlciBpdCByZXR1cm5zIDEgb3IgMD8KKyNlbHNlCisgIGlmICghVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gX19rbXBfZW50cnlfdGhyZWFkKCktPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfZmxhZ3MuZmluYWw7CisjZW5kaWYKK30KKworI2lmIE9NUF80MF9FTkFCTEVECisKKwora21wX3Byb2NfYmluZF90IEZUTl9TVERDQUxMIHhleHBhbmQoRlROX0dFVF9QUk9DX0JJTkQpKHZvaWQpIHsKKyNpZmRlZiBLTVBfU1RVQgorICByZXR1cm4gX19rbXBzX2dldF9wcm9jX2JpbmQoKTsKKyNlbHNlCisgIHJldHVybiBnZXRfX3Byb2NfYmluZChfX2ttcF9lbnRyeV90aHJlYWQoKSk7CisjZW5kaWYKK30KKworI2lmIE9NUF80NV9FTkFCTEVECitpbnQgRlROX1NURENBTEwgRlROX0dFVF9OVU1fUExBQ0VTKHZvaWQpIHsKKyNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICByZXR1cm4gMDsKKyNlbHNlCisgIGlmICghVENSXzQoX19rbXBfaW5pdF9taWRkbGUpKSB7CisgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgfQorICBpZiAoIUtNUF9BRkZJTklUWV9DQVBBQkxFKCkpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiBfX2ttcF9hZmZpbml0eV9udW1fbWFza3M7CisjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMIEZUTl9HRVRfUExBQ0VfTlVNX1BST0NTKGludCBwbGFjZV9udW0pIHsKKyNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICByZXR1cm4gMDsKKyNlbHNlCisgIGludCBpOworICBpbnQgcmV0dmFsID0gMDsKKyAgaWYgKCFUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkpIHsKKyAgICBfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSgpOworICB9CisgIGlmICghS01QX0FGRklOSVRZX0NBUEFCTEUoKSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKHBsYWNlX251bSA8IDAgfHwgcGxhY2VfbnVtID49IChpbnQpX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzKQorICAgIHJldHVybiAwOworICBrbXBfYWZmaW5fbWFza190ICptYXNrID0gS01QX0NQVV9JTkRFWChfX2ttcF9hZmZpbml0eV9tYXNrcywgcGxhY2VfbnVtKTsKKyAgS01QX0NQVV9TRVRfSVRFUkFURShpLCBtYXNrKSB7CisgICAgaWYgKCghS01QX0NQVV9JU1NFVChpLCBfX2ttcF9hZmZpbl9mdWxsTWFzaykpIHx8CisgICAgICAgICghS01QX0NQVV9JU1NFVChpLCBtYXNrKSkpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICArK3JldHZhbDsKKyAgfQorICByZXR1cm4gcmV0dmFsOworI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwgRlROX0dFVF9QTEFDRV9QUk9DX0lEUyhpbnQgcGxhY2VfbnVtLCBpbnQgKmlkcykgeworI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisvLyBOb3RoaW5nLgorI2Vsc2UKKyAgaW50IGksIGo7CisgIGlmICghVENSXzQoX19rbXBfaW5pdF9taWRkbGUpKSB7CisgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgfQorICBpZiAoIUtNUF9BRkZJTklUWV9DQVBBQkxFKCkpCisgICAgcmV0dXJuOworICBpZiAocGxhY2VfbnVtIDwgMCB8fCBwbGFjZV9udW0gPj0gKGludClfX2ttcF9hZmZpbml0eV9udW1fbWFza3MpCisgICAgcmV0dXJuOworICBrbXBfYWZmaW5fbWFza190ICptYXNrID0gS01QX0NQVV9JTkRFWChfX2ttcF9hZmZpbml0eV9tYXNrcywgcGxhY2VfbnVtKTsKKyAgaiA9IDA7CisgIEtNUF9DUFVfU0VUX0lURVJBVEUoaSwgbWFzaykgeworICAgIGlmICgoIUtNUF9DUFVfSVNTRVQoaSwgX19rbXBfYWZmaW5fZnVsbE1hc2spKSB8fAorICAgICAgICAoIUtNUF9DUFVfSVNTRVQoaSwgbWFzaykpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWRzW2orK10gPSBpOworICB9CisjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMIEZUTl9HRVRfUExBQ0VfTlVNKHZvaWQpIHsKKyNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICByZXR1cm4gLTE7CisjZWxzZQorICBpbnQgZ3RpZDsKKyAga21wX2luZm9fdCAqdGhyZWFkOworICBpZiAoIVRDUl80KF9fa21wX2luaXRfbWlkZGxlKSkgeworICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgIH0KKyAgaWYgKCFLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKQorICAgIHJldHVybiAtMTsKKyAgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgdGhyZWFkID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZChndGlkKTsKKyAgaWYgKHRocmVhZC0+dGgudGhfY3VycmVudF9wbGFjZSA8IDApCisgICAgcmV0dXJuIC0xOworICByZXR1cm4gdGhyZWFkLT50aC50aF9jdXJyZW50X3BsYWNlOworI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTCBGVE5fR0VUX1BBUlRJVElPTl9OVU1fUExBQ0VTKHZvaWQpIHsKKyNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICByZXR1cm4gMDsKKyNlbHNlCisgIGludCBndGlkLCBudW1fcGxhY2VzLCBmaXJzdF9wbGFjZSwgbGFzdF9wbGFjZTsKKyAga21wX2luZm9fdCAqdGhyZWFkOworICBpZiAoIVRDUl80KF9fa21wX2luaXRfbWlkZGxlKSkgeworICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgIH0KKyAgaWYgKCFLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKQorICAgIHJldHVybiAwOworICBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICB0aHJlYWQgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKGd0aWQpOworICBmaXJzdF9wbGFjZSA9IHRocmVhZC0+dGgudGhfZmlyc3RfcGxhY2U7CisgIGxhc3RfcGxhY2UgPSB0aHJlYWQtPnRoLnRoX2xhc3RfcGxhY2U7CisgIGlmIChmaXJzdF9wbGFjZSA8IDAgfHwgbGFzdF9wbGFjZSA8IDApCisgICAgcmV0dXJuIDA7CisgIGlmIChmaXJzdF9wbGFjZSA8PSBsYXN0X3BsYWNlKQorICAgIG51bV9wbGFjZXMgPSBsYXN0X3BsYWNlIC0gZmlyc3RfcGxhY2UgKyAxOworICBlbHNlCisgICAgbnVtX3BsYWNlcyA9IF9fa21wX2FmZmluaXR5X251bV9tYXNrcyAtIGZpcnN0X3BsYWNlICsgbGFzdF9wbGFjZSArIDE7CisgIHJldHVybiBudW1fcGxhY2VzOworI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwgRlROX0dFVF9QQVJUSVRJT05fUExBQ0VfTlVNUyhpbnQgKnBsYWNlX251bXMpIHsKKyNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorLy8gTm90aGluZy4KKyNlbHNlCisgIGludCBpLCBndGlkLCBwbGFjZV9udW0sIGZpcnN0X3BsYWNlLCBsYXN0X3BsYWNlLCBzdGFydCwgZW5kOworICBrbXBfaW5mb190ICp0aHJlYWQ7CisgIGlmICghVENSXzQoX19rbXBfaW5pdF9taWRkbGUpKSB7CisgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgfQorICBpZiAoIUtNUF9BRkZJTklUWV9DQVBBQkxFKCkpCisgICAgcmV0dXJuOworICBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICB0aHJlYWQgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKGd0aWQpOworICBmaXJzdF9wbGFjZSA9IHRocmVhZC0+dGgudGhfZmlyc3RfcGxhY2U7CisgIGxhc3RfcGxhY2UgPSB0aHJlYWQtPnRoLnRoX2xhc3RfcGxhY2U7CisgIGlmIChmaXJzdF9wbGFjZSA8IDAgfHwgbGFzdF9wbGFjZSA8IDApCisgICAgcmV0dXJuOworICBpZiAoZmlyc3RfcGxhY2UgPD0gbGFzdF9wbGFjZSkgeworICAgIHN0YXJ0ID0gZmlyc3RfcGxhY2U7CisgICAgZW5kID0gbGFzdF9wbGFjZTsKKyAgfSBlbHNlIHsKKyAgICBzdGFydCA9IGxhc3RfcGxhY2U7CisgICAgZW5kID0gZmlyc3RfcGxhY2U7CisgIH0KKyAgZm9yIChpID0gMCwgcGxhY2VfbnVtID0gc3RhcnQ7IHBsYWNlX251bSA8PSBlbmQ7ICsrcGxhY2VfbnVtLCArK2kpIHsKKyAgICBwbGFjZV9udW1zW2ldID0gcGxhY2VfbnVtOworICB9CisjZW5kaWYKK30KKyNlbmRpZgorCitpbnQgRlROX1NURENBTEwgeGV4cGFuZChGVE5fR0VUX05VTV9URUFNUykodm9pZCkgeworI2lmZGVmIEtNUF9TVFVCCisgIHJldHVybiAxOworI2Vsc2UKKyAga21wX2luZm9fdCAqdGhyID0gX19rbXBfZW50cnlfdGhyZWFkKCk7CisgIGlmICh0aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzaykgeworICAgIGttcF90ZWFtX3QgKnRlYW0gPSB0aHItPnRoLnRoX3RlYW07CisgICAgaW50IHRsZXZlbCA9IHRoci0+dGgudGhfdGVhbXNfbGV2ZWw7CisgICAgaW50IGlpID0gdGVhbS0+dC50X2xldmVsOyAvLyB0aGUgbGV2ZWwgb2YgdGhlIHRlYW1zIGNvbnN0cnVjdAorICAgIGludCBkZCA9IHRlYW0tPnQudF9zZXJpYWxpemVkOworICAgIGludCBsZXZlbCA9IHRsZXZlbCArIDE7CisgICAgS01QX0RFQlVHX0FTU0VSVChpaSA+PSB0bGV2ZWwpOworICAgIHdoaWxlIChpaSA+IGxldmVsKSB7CisgICAgICBmb3IgKGRkID0gdGVhbS0+dC50X3NlcmlhbGl6ZWQ7IChkZCA+IDApICYmIChpaSA+IGxldmVsKTsgZGQtLSwgaWktLSkgeworICAgICAgfQorICAgICAgaWYgKHRlYW0tPnQudF9zZXJpYWxpemVkICYmICghZGQpKSB7CisgICAgICAgIHRlYW0gPSB0ZWFtLT50LnRfcGFyZW50OworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChpaSA+IGxldmVsKSB7CisgICAgICAgIHRlYW0gPSB0ZWFtLT50LnRfcGFyZW50OworICAgICAgICBpaS0tOworICAgICAgfQorICAgIH0KKyAgICBpZiAoZGQgPiAxKSB7CisgICAgICByZXR1cm4gMTsgLy8gdGVhbXMgcmVnaW9uIGlzIHNlcmlhbGl6ZWQgKCAxIHRlYW0gb2YgMSB0aHJlYWQgKS4KKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHRlYW0tPnQudF9wYXJlbnQtPnQudF9ucHJvYzsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwgeGV4cGFuZChGVE5fR0VUX1RFQU1fTlVNKSh2b2lkKSB7CisjaWZkZWYgS01QX1NUVUIKKyAgcmV0dXJuIDA7CisjZWxzZQorICBrbXBfaW5mb190ICp0aHIgPSBfX2ttcF9lbnRyeV90aHJlYWQoKTsKKyAgaWYgKHRoci0+dGgudGhfdGVhbXNfbWljcm90YXNrKSB7CisgICAga21wX3RlYW1fdCAqdGVhbSA9IHRoci0+dGgudGhfdGVhbTsKKyAgICBpbnQgdGxldmVsID0gdGhyLT50aC50aF90ZWFtc19sZXZlbDsgLy8gdGhlIGxldmVsIG9mIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKKyAgICBpbnQgaWkgPSB0ZWFtLT50LnRfbGV2ZWw7CisgICAgaW50IGRkID0gdGVhbS0+dC50X3NlcmlhbGl6ZWQ7CisgICAgaW50IGxldmVsID0gdGxldmVsICsgMTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKGlpID49IHRsZXZlbCk7CisgICAgd2hpbGUgKGlpID4gbGV2ZWwpIHsKKyAgICAgIGZvciAoZGQgPSB0ZWFtLT50LnRfc2VyaWFsaXplZDsgKGRkID4gMCkgJiYgKGlpID4gbGV2ZWwpOyBkZC0tLCBpaS0tKSB7CisgICAgICB9CisgICAgICBpZiAodGVhbS0+dC50X3NlcmlhbGl6ZWQgJiYgKCFkZCkpIHsKKyAgICAgICAgdGVhbSA9IHRlYW0tPnQudF9wYXJlbnQ7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKGlpID4gbGV2ZWwpIHsKKyAgICAgICAgdGVhbSA9IHRlYW0tPnQudF9wYXJlbnQ7CisgICAgICAgIGlpLS07CisgICAgICB9CisgICAgfQorICAgIGlmIChkZCA+IDEpIHsKKyAgICAgIHJldHVybiAwOyAvLyB0ZWFtcyByZWdpb24gaXMgc2VyaWFsaXplZCAoIDEgdGVhbSBvZiAxIHRocmVhZCApLgorICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gdGVhbS0+dC50X21hc3Rlcl90aWQ7CisgICAgfQorICB9IGVsc2UgeworICAgIHJldHVybiAwOworICB9CisjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMIHhleHBhbmQoRlROX0dFVF9ERUZBVUxUX0RFVklDRSkodm9pZCkgeworI2lmIEtNUF9NSUMgfHwgS01QX09TX0RBUldJTiB8fCBkZWZpbmVkKEtNUF9TVFVCKQorICByZXR1cm4gMDsKKyNlbHNlCisgIHJldHVybiBfX2ttcF9lbnRyeV90aHJlYWQoKS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLmRlZmF1bHRfZGV2aWNlOworI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwgeGV4cGFuZChGVE5fU0VUX0RFRkFVTFRfREVWSUNFKShpbnQgS01QX0RFUkVGIGFyZykgeworI2lmIEtNUF9NSUMgfHwgS01QX09TX0RBUldJTiB8fCBkZWZpbmVkKEtNUF9TVFVCKQorLy8gTm90aGluZy4KKyNlbHNlCisgIF9fa21wX2VudHJ5X3RocmVhZCgpLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuZGVmYXVsdF9kZXZpY2UgPQorICAgICAgS01QX0RFUkVGIGFyZzsKKyNlbmRpZgorfQorCisjaWYgS01QX01JQyB8fCBLTVBfT1NfREFSV0lOIHx8IGRlZmluZWQoS01QX1NUVUIpCisKK2ludCBGVE5fU1REQ0FMTCBGVE5fR0VUX05VTV9ERVZJQ0VTKHZvaWQpIHsgcmV0dXJuIDA7IH0KKworI2VuZGlmIC8vIEtNUF9NSUMgfHwgS01QX09TX0RBUldJTiB8fCBkZWZpbmVkKEtNUF9TVFVCKQorCisjaWYgIUtNUF9PU19MSU5VWAorCitpbnQgRlROX1NURENBTEwgeGV4cGFuZChGVE5fSVNfSU5JVElBTF9ERVZJQ0UpKHZvaWQpIHsgcmV0dXJuIDE7IH0KKworI2Vsc2UKKworLy8gVGhpcyBpbnRlcm5hbCBmdW5jdGlvbiBpcyB1c2VkIHdoZW4gdGhlIGVudHJ5IGZyb20gdGhlIG9mZmxvYWQgbGlicmFyeQorLy8gaXMgbm90IGZvdW5kLgoraW50IF9PZmZsb2FkX2dldF9kZXZpY2VfbnVtYmVyKHZvaWQpIF9fYXR0cmlidXRlX18oKHdlYWspKTsKKworaW50IEZUTl9TVERDQUxMIHhleHBhbmQoRlROX0lTX0lOSVRJQUxfREVWSUNFKSh2b2lkKSB7CisgIGlmIChfT2ZmbG9hZF9nZXRfZGV2aWNlX251bWJlcikgeworICAgIHJldHVybiBfT2ZmbG9hZF9nZXRfZGV2aWNlX251bWJlcigpID09IC0xOworICB9IGVsc2UgeworICAgIHJldHVybiAxOworICB9Cit9CisKKyNlbmRpZiAvLyAhIEtNUF9PU19MSU5VWAorCisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworI2lmIE9NUF80NV9FTkFCTEVEICYmIGRlZmluZWQoS01QX1NUVUIpCisvLyBPcGVuTVAgNC41IGVudHJpZXMgZm9yIHN0dWJzIGxpYnJhcnkKKworaW50IEZUTl9TVERDQUxMIEZUTl9HRVRfSU5JVElBTF9ERVZJQ0Uodm9pZCkgeyByZXR1cm4gLTE7IH0KKworLy8gQXMgYWxsICp0YXJnZXQqIGZ1bmN0aW9ucyBhcmUgQy1vbmx5IHBhcmFtZXRlcnMgYWx3YXlzIHBhc3NlZCBieSB2YWx1ZQordm9pZCAqRlROX1NURENBTEwgRlROX1RBUkdFVF9BTExPQyhzaXplX3Qgc2l6ZSwgaW50IGRldmljZV9udW0pIHsgcmV0dXJuIDA7IH0KKwordm9pZCBGVE5fU1REQ0FMTCBGVE5fVEFSR0VUX0ZSRUUodm9pZCAqZGV2aWNlX3B0ciwgaW50IGRldmljZV9udW0pIHt9CisKK2ludCBGVE5fU1REQ0FMTCBGVE5fVEFSR0VUX0lTX1BSRVNFTlQodm9pZCAqcHRyLCBpbnQgZGV2aWNlX251bSkgeyByZXR1cm4gMDsgfQorCitpbnQgRlROX1NURENBTEwgRlROX1RBUkdFVF9NRU1DUFkodm9pZCAqZHN0LCB2b2lkICpzcmMsIHNpemVfdCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRzdF9vZmZzZXQsIHNpemVfdCBzcmNfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RfZGV2aWNlLCBpbnQgc3JjX2RldmljZSkgeworICByZXR1cm4gLTE7Cit9CisKK2ludCBGVE5fU1REQ0FMTCBGVE5fVEFSR0VUX01FTUNQWV9SRUNUKAorICAgIHZvaWQgKmRzdCwgdm9pZCAqc3JjLCBzaXplX3QgZWxlbWVudF9zaXplLCBpbnQgbnVtX2RpbXMsCisgICAgY29uc3Qgc2l6ZV90ICp2b2x1bWUsIGNvbnN0IHNpemVfdCAqZHN0X29mZnNldHMsIGNvbnN0IHNpemVfdCAqc3JjX29mZnNldHMsCisgICAgY29uc3Qgc2l6ZV90ICpkc3RfZGltZW5zaW9ucywgY29uc3Qgc2l6ZV90ICpzcmNfZGltZW5zaW9ucywgaW50IGRzdF9kZXZpY2UsCisgICAgaW50IHNyY19kZXZpY2UpIHsKKyAgcmV0dXJuIC0xOworfQorCitpbnQgRlROX1NURENBTEwgRlROX1RBUkdFVF9BU1NPQ0lBVEVfUFRSKHZvaWQgKmhvc3RfcHRyLCB2b2lkICpkZXZpY2VfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwgc2l6ZV90IGRldmljZV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXZpY2VfbnVtKSB7CisgIHJldHVybiAtMTsKK30KKworaW50IEZUTl9TVERDQUxMIEZUTl9UQVJHRVRfRElTQVNTT0NJQVRFX1BUUih2b2lkICpob3N0X3B0ciwgaW50IGRldmljZV9udW0pIHsKKyAgcmV0dXJuIC0xOworfQorI2VuZGlmIC8vIE9NUF80NV9FTkFCTEVEICYmIGRlZmluZWQoS01QX1NUVUIpCisKKyNpZmRlZiBLTVBfU1RVQgordHlwZWRlZiBlbnVtIHsgVU5JTklUID0gLTEsIFVOTE9DS0VELCBMT0NLRUQgfSBrbXBfc3R1Yl9sb2NrX3Q7CisjZW5kaWYgLyogS01QX1NUVUIgKi8KKworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCit2b2lkIEZUTl9TVERDQUxMIEZUTl9JTklUX0xPQ0tfV0lUSF9ISU5UKHZvaWQgKip1c2VyX2xvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBLTVBfREVSRUYgaGludCkgeworI2lmZGVmIEtNUF9TVFVCCisgICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPSBVTkxPQ0tFRDsKKyNlbHNlCisgIF9fa21wY19pbml0X2xvY2tfd2l0aF9oaW50KE5VTEwsIF9fa21wX2VudHJ5X2d0aWQoKSwgdXNlcl9sb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfREVSRUYgaGludCk7CisjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTCBGVE5fSU5JVF9ORVNUX0xPQ0tfV0lUSF9ISU5UKHZvaWQgKip1c2VyX2xvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IEtNUF9ERVJFRiBoaW50KSB7CisjaWZkZWYgS01QX1NUVUIKKyAgKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9IFVOTE9DS0VEOworI2Vsc2UKKyAgX19rbXBjX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludChOVUxMLCBfX2ttcF9lbnRyeV9ndGlkKCksIHVzZXJfbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfREVSRUYgaGludCk7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKiBpbml0aWFsaXplIHRoZSBsb2NrICovCit2b2lkIEZUTl9TVERDQUxMIHhleHBhbmQoRlROX0lOSVRfTE9DSykodm9pZCAqKnVzZXJfbG9jaykgeworI2lmZGVmIEtNUF9TVFVCCisgICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPSBVTkxPQ0tFRDsKKyNlbHNlCisgIF9fa21wY19pbml0X2xvY2soTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2spOworI2VuZGlmCit9CisKKy8qIGluaXRpYWxpemUgdGhlIGxvY2sgKi8KK3ZvaWQgRlROX1NURENBTEwgeGV4cGFuZChGVE5fSU5JVF9ORVNUX0xPQ0spKHZvaWQgKip1c2VyX2xvY2spIHsKKyNpZmRlZiBLTVBfU1RVQgorICAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID0gVU5MT0NLRUQ7CisjZWxzZQorICBfX2ttcGNfaW5pdF9uZXN0X2xvY2soTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2spOworI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwgeGV4cGFuZChGVE5fREVTVFJPWV9MT0NLKSh2b2lkICoqdXNlcl9sb2NrKSB7CisjaWZkZWYgS01QX1NUVUIKKyAgKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9IFVOSU5JVDsKKyNlbHNlCisgIF9fa21wY19kZXN0cm95X2xvY2soTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2spOworI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwgeGV4cGFuZChGVE5fREVTVFJPWV9ORVNUX0xPQ0spKHZvaWQgKip1c2VyX2xvY2spIHsKKyNpZmRlZiBLTVBfU1RVQgorICAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID0gVU5JTklUOworI2Vsc2UKKyAgX19rbXBjX2Rlc3Ryb3lfbmVzdF9sb2NrKE5VTEwsIF9fa21wX2VudHJ5X2d0aWQoKSwgdXNlcl9sb2NrKTsKKyNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMIHhleHBhbmQoRlROX1NFVF9MT0NLKSh2b2lkICoqdXNlcl9sb2NrKSB7CisjaWZkZWYgS01QX1NUVUIKKyAgaWYgKCooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPT0gVU5JTklUKSB7CisgICAgLy8gVE9ETzogSXNzdWUgYW4gZXJyb3IuCisgIH07IC8vIGlmCisgIGlmICgqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spICE9IFVOTE9DS0VEKSB7CisgICAgLy8gVE9ETzogSXNzdWUgYW4gZXJyb3IuCisgIH07IC8vIGlmCisgICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPSBMT0NLRUQ7CisjZWxzZQorICBfX2ttcGNfc2V0X2xvY2soTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2spOworI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwgeGV4cGFuZChGVE5fU0VUX05FU1RfTE9DSykodm9pZCAqKnVzZXJfbG9jaykgeworI2lmZGVmIEtNUF9TVFVCCisgIGlmICgqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID09IFVOSU5JVCkgeworICAgIC8vIFRPRE86IElzc3VlIGFuIGVycm9yLgorICB9OyAvLyBpZgorICAoKigoaW50ICopdXNlcl9sb2NrKSkrKzsKKyNlbHNlCisgIF9fa21wY19zZXRfbmVzdF9sb2NrKE5VTEwsIF9fa21wX2VudHJ5X2d0aWQoKSwgdXNlcl9sb2NrKTsKKyNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMIHhleHBhbmQoRlROX1VOU0VUX0xPQ0spKHZvaWQgKip1c2VyX2xvY2spIHsKKyNpZmRlZiBLTVBfU1RVQgorICBpZiAoKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9PSBVTklOSVQpIHsKKyAgICAvLyBUT0RPOiBJc3N1ZSBhbiBlcnJvci4KKyAgfTsgLy8gaWYKKyAgaWYgKCooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPT0gVU5MT0NLRUQpIHsKKyAgICAvLyBUT0RPOiBJc3N1ZSBhbiBlcnJvci4KKyAgfTsgLy8gaWYKKyAgKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9IFVOTE9DS0VEOworI2Vsc2UKKyAgX19rbXBjX3Vuc2V0X2xvY2soTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2spOworI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwgeGV4cGFuZChGVE5fVU5TRVRfTkVTVF9MT0NLKSh2b2lkICoqdXNlcl9sb2NrKSB7CisjaWZkZWYgS01QX1NUVUIKKyAgaWYgKCooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPT0gVU5JTklUKSB7CisgICAgLy8gVE9ETzogSXNzdWUgYW4gZXJyb3IuCisgIH07IC8vIGlmCisgIGlmICgqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID09IFVOTE9DS0VEKSB7CisgICAgLy8gVE9ETzogSXNzdWUgYW4gZXJyb3IuCisgIH07IC8vIGlmCisgICgqKChpbnQgKil1c2VyX2xvY2spKS0tOworI2Vsc2UKKyAgX19rbXBjX3Vuc2V0X25lc3RfbG9jayhOVUxMLCBfX2ttcF9lbnRyeV9ndGlkKCksIHVzZXJfbG9jayk7CisjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMIHhleHBhbmQoRlROX1RFU1RfTE9DSykodm9pZCAqKnVzZXJfbG9jaykgeworI2lmZGVmIEtNUF9TVFVCCisgIGlmICgqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID09IFVOSU5JVCkgeworICAgIC8vIFRPRE86IElzc3VlIGFuIGVycm9yLgorICB9OyAvLyBpZgorICBpZiAoKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9PSBMT0NLRUQpIHsKKyAgICByZXR1cm4gMDsKKyAgfTsgLy8gaWYKKyAgKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9IExPQ0tFRDsKKyAgcmV0dXJuIDE7CisjZWxzZQorICByZXR1cm4gX19rbXBjX3Rlc3RfbG9jayhOVUxMLCBfX2ttcF9lbnRyeV9ndGlkKCksIHVzZXJfbG9jayk7CisjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMIHhleHBhbmQoRlROX1RFU1RfTkVTVF9MT0NLKSh2b2lkICoqdXNlcl9sb2NrKSB7CisjaWZkZWYgS01QX1NUVUIKKyAgaWYgKCooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPT0gVU5JTklUKSB7CisgICAgLy8gVE9ETzogSXNzdWUgYW4gZXJyb3IuCisgIH07IC8vIGlmCisgIHJldHVybiArKygqKChpbnQgKil1c2VyX2xvY2spKTsKKyNlbHNlCisgIHJldHVybiBfX2ttcGNfdGVzdF9uZXN0X2xvY2soTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2spOworI2VuZGlmCit9CisKK2RvdWJsZSBGVE5fU1REQ0FMTCB4ZXhwYW5kKEZUTl9HRVRfV1RJTUUpKHZvaWQpIHsKKyNpZmRlZiBLTVBfU1RVQgorICByZXR1cm4gX19rbXBzX2dldF93dGltZSgpOworI2Vsc2UKKyAgZG91YmxlIGRhdGE7CisjaWYgIUtNUF9PU19MSU5VWAorICAvLyBXZSBkb24ndCBuZWVkIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gdG8gZ2V0IHRoZSB0aW1lIG9uIExpbnV4KiBPUy4gVGhlCisgIC8vIHJvdXRpbmUgY2FuIGJlIHVzZWQgdG8gbWVhc3VyZSBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIHRpbWUgb24gTGludXgqIE9TIG5vdworICBpZiAoIV9fa21wX2luaXRfc2VyaWFsKSB7CisgICAgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgfTsKKyNlbmRpZgorICBfX2ttcF9lbGFwc2VkKCZkYXRhKTsKKyAgcmV0dXJuIGRhdGE7CisjZW5kaWYKK30KKworZG91YmxlIEZUTl9TVERDQUxMIHhleHBhbmQoRlROX0dFVF9XVElDSykodm9pZCkgeworI2lmZGVmIEtNUF9TVFVCCisgIHJldHVybiBfX2ttcHNfZ2V0X3d0aWNrKCk7CisjZWxzZQorICBkb3VibGUgZGF0YTsKKyAgaWYgKCFfX2ttcF9pbml0X3NlcmlhbCkgeworICAgIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCk7CisgIH07CisgIF9fa21wX2VsYXBzZWRfdGljaygmZGF0YSk7CisgIHJldHVybiBkYXRhOworI2VuZGlmCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkICpGVE5fU1REQ0FMTCBGVE5fTUFMTE9DKHNpemVfdCBLTVBfREVSRUYgc2l6ZSkgeworICAvLyBrbXBjX21hbGxvYyBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgcmV0dXJuIGttcGNfbWFsbG9jKEtNUF9ERVJFRiBzaXplKTsKK30KKwordm9pZCAqRlROX1NURENBTEwgRlROX0FMSUdORURfTUFMTE9DKHNpemVfdCBLTVBfREVSRUYgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgS01QX0RFUkVGIGFsaWdubWVudCkgeworICAvLyBrbXBjX2FsaWduZWRfbWFsbG9jIGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICByZXR1cm4ga21wY19hbGlnbmVkX21hbGxvYyhLTVBfREVSRUYgc2l6ZSwgS01QX0RFUkVGIGFsaWdubWVudCk7Cit9CisKK3ZvaWQgKkZUTl9TVERDQUxMIEZUTl9DQUxMT0Moc2l6ZV90IEtNUF9ERVJFRiBuZWxlbSwgc2l6ZV90IEtNUF9ERVJFRiBlbHNpemUpIHsKKyAgLy8ga21wY19jYWxsb2MgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgIHJldHVybiBrbXBjX2NhbGxvYyhLTVBfREVSRUYgbmVsZW0sIEtNUF9ERVJFRiBlbHNpemUpOworfQorCit2b2lkICpGVE5fU1REQ0FMTCBGVE5fUkVBTExPQyh2b2lkICpLTVBfREVSRUYgcHRyLCBzaXplX3QgS01QX0RFUkVGIHNpemUpIHsKKyAgLy8ga21wY19yZWFsbG9jIGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICByZXR1cm4ga21wY19yZWFsbG9jKEtNUF9ERVJFRiBwdHIsIEtNUF9ERVJFRiBzaXplKTsKK30KKwordm9pZCBGVE5fU1REQ0FMTCBGVE5fRlJFRSh2b2lkICpLTVBfREVSRUYgcHRyKSB7CisgIC8vIGRvZXMgbm90aGluZyBpZiB0aGUgbGlicmFyeSBpcyBub3QgaW5pdGlhbGl6ZWQKKyAga21wY19mcmVlKEtNUF9ERVJFRiBwdHIpOworfQorCit2b2lkIEZUTl9TVERDQUxMIEZUTl9TRVRfV0FSTklOR1NfT04odm9pZCkgeworI2lmbmRlZiBLTVBfU1RVQgorICBfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA9IGttcF93YXJuaW5nc19leHBsaWNpdDsKKyNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMIEZUTl9TRVRfV0FSTklOR1NfT0ZGKHZvaWQpIHsKKyNpZm5kZWYgS01QX1NUVUIKKyAgX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPSBGQUxTRTsKKyNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMIEZUTl9TRVRfREVGQVVMVFMoY2hhciBjb25zdCAqc3RyCisjaWZuZGVmIFBBU1NfQVJHU19CWV9WQUxVRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKKyNpZm5kZWYgS01QX1NUVUIKKyNpZmRlZiBQQVNTX0FSR1NfQllfVkFMVUUKKyAgaW50IGxlbiA9IChpbnQpS01QX1NUUkxFTihzdHIpOworI2VuZGlmCisgIF9fa21wX2F1eF9zZXRfZGVmYXVsdHMoc3RyLCBsZW4pOworI2VuZGlmCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorLyogcmV0dXJucyB0aGUgc3RhdHVzIG9mIGNhbmNlbGxhdGlvbiAqLworaW50IEZUTl9TVERDQUxMIHhleHBhbmQoRlROX0dFVF9DQU5DRUxMQVRJT04pKHZvaWQpIHsKKyNpZmRlZiBLTVBfU1RVQgorICByZXR1cm4gMCAvKiBmYWxzZSAqLzsKKyNlbHNlCisgIC8vIGluaXRpYWxpemUgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgIGlmICghX19rbXBfaW5pdF9zZXJpYWwpIHsKKyAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICB9CisgIHJldHVybiBfX2ttcF9vbXBfY2FuY2VsbGF0aW9uOworI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTCBGVE5fR0VUX0NBTkNFTExBVElPTl9TVEFUVVMoaW50IGNhbmNlbF9raW5kKSB7CisjaWZkZWYgS01QX1NUVUIKKyAgcmV0dXJuIDAgLyogZmFsc2UgKi87CisjZWxzZQorICByZXR1cm4gX19rbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMoY2FuY2VsX2tpbmQpOworI2VuZGlmCit9CisKKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisjaWYgT01QXzQ1X0VOQUJMRUQKKy8qIHJldHVybnMgdGhlIG1heGltdW0gYWxsb3dlZCB0YXNrIHByaW9yaXR5ICovCitpbnQgRlROX1NURENBTEwgRlROX0dFVF9NQVhfVEFTS19QUklPUklUWSh2b2lkKSB7CisjaWZkZWYgS01QX1NUVUIKKyAgcmV0dXJuIDA7CisjZWxzZQorICBpZiAoIV9fa21wX2luaXRfc2VyaWFsKSB7CisgICAgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgfQorICByZXR1cm4gX19rbXBfbWF4X3Rhc2tfcHJpb3JpdHk7CisjZW5kaWYKK30KKyNlbmRpZgorCisvLyBHQ0MgY29tcGF0aWJpbGl0eSAodmVyc2lvbmVkIHN5bWJvbHMpCisjaWZkZWYgS01QX1VTRV9WRVJTSU9OX1NZTUJPTFMKKworLyogVGhlc2UgZm9sbG93aW5nIHNlY3Rpb25zIGNyZWF0ZSBmdW5jdGlvbiBhbGlhc2VzIChkdW1teSBzeW1ib2xzKSBmb3IgdGhlCisgICBvbXBfKiByb3V0aW5lcy4gVGhlc2UgYWxpYXNlcyB3aWxsIHRoZW4gYmUgdmVyc2lvbmVkIGFjY29yZGluZyB0byBob3cKKyAgIGxpYmdvbXAgYGB2ZXJzaW9ucycnIGl0cyBzeW1ib2xzIChPTVBfMS4wLCBPTVBfMi4wLCBPTVBfMy4wLCAuLi4pIHdoaWxlIGFsc28KKyAgIHJldGFpbmluZyB0aGUgZGVmYXVsdCB2ZXJzaW9uIHdoaWNoIGxpYm9tcCB1c2VzOiBWRVJTSU9OIChkZWZpbmVkIGluCisgICBleHBvcnRzX3NvLnR4dCkuIElmIHlvdSB3YW50IHRvIHNlZSB0aGUgdmVyc2lvbmVkIHN5bWJvbHMgZm9yIGxpYmdvbXAuc28uMQorICAgdGhlbiBqdXN0IHR5cGU6CisKKyAgIG9iamR1bXAgLVQgL3BhdGgvdG8vbGliZ29tcC5zby4xIHwgZ3JlcCBvbXBfCisKKyAgIEV4YW1wbGU6CisgICBTdGVwIDEpIENyZWF0ZSBfX2ttcF9hcGlfb21wX3NldF9udW1fdGhyZWFkc18xMF9hbGlhcyB3aGljaCBpcyBhbGlhcyBvZgorICAgICBfX2ttcF9hcGlfb21wX3NldF9udW1fdGhyZWFkcworICAgU3RlcCAyKSBTZXQgX19rbXBfYXBpX29tcF9zZXRfbnVtX3RocmVhZHNfMTBfYWxpYXMgdG8gdmVyc2lvbjoKKyAgICAgb21wX3NldF9udW1fdGhyZWFkc0BPTVBfMS4wCisgICBTdGVwIDJCKSBTZXQgX19rbXBfYXBpX29tcF9zZXRfbnVtX3RocmVhZHMgdG8gZGVmYXVsdCB2ZXJzaW9uOgorICAgICBvbXBfc2V0X251bV90aHJlYWRzQEBWRVJTSU9OCisqLworCisvLyBPTVBfMS4wIGFsaWFzZXMKK3hhbGlhc2lmeShGVE5fU0VUX05VTV9USFJFQURTLCAxMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9OVU1fVEhSRUFEUywgMTApOworeGFsaWFzaWZ5KEZUTl9HRVRfTUFYX1RIUkVBRFMsIDEwKTsKK3hhbGlhc2lmeShGVE5fR0VUX1RIUkVBRF9OVU0sIDEwKTsKK3hhbGlhc2lmeShGVE5fR0VUX05VTV9QUk9DUywgMTApOworeGFsaWFzaWZ5KEZUTl9JTl9QQVJBTExFTCwgMTApOworeGFsaWFzaWZ5KEZUTl9TRVRfRFlOQU1JQywgMTApOworeGFsaWFzaWZ5KEZUTl9HRVRfRFlOQU1JQywgMTApOworeGFsaWFzaWZ5KEZUTl9TRVRfTkVTVEVELCAxMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9ORVNURUQsIDEwKTsKK3hhbGlhc2lmeShGVE5fSU5JVF9MT0NLLCAxMCk7Cit4YWxpYXNpZnkoRlROX0lOSVRfTkVTVF9MT0NLLCAxMCk7Cit4YWxpYXNpZnkoRlROX0RFU1RST1lfTE9DSywgMTApOworeGFsaWFzaWZ5KEZUTl9ERVNUUk9ZX05FU1RfTE9DSywgMTApOworeGFsaWFzaWZ5KEZUTl9TRVRfTE9DSywgMTApOworeGFsaWFzaWZ5KEZUTl9TRVRfTkVTVF9MT0NLLCAxMCk7Cit4YWxpYXNpZnkoRlROX1VOU0VUX0xPQ0ssIDEwKTsKK3hhbGlhc2lmeShGVE5fVU5TRVRfTkVTVF9MT0NLLCAxMCk7Cit4YWxpYXNpZnkoRlROX1RFU1RfTE9DSywgMTApOworeGFsaWFzaWZ5KEZUTl9URVNUX05FU1RfTE9DSywgMTApOworCisvLyBPTVBfMi4wIGFsaWFzZXMKK3hhbGlhc2lmeShGVE5fR0VUX1dUSUNLLCAyMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9XVElNRSwgMjApOworCisvLyBPTVBfMy4wIGFsaWFzZXMKK3hhbGlhc2lmeShGVE5fU0VUX1NDSEVEVUxFLCAzMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9TQ0hFRFVMRSwgMzApOworeGFsaWFzaWZ5KEZUTl9HRVRfVEhSRUFEX0xJTUlULCAzMCk7Cit4YWxpYXNpZnkoRlROX1NFVF9NQVhfQUNUSVZFX0xFVkVMUywgMzApOworeGFsaWFzaWZ5KEZUTl9HRVRfTUFYX0FDVElWRV9MRVZFTFMsIDMwKTsKK3hhbGlhc2lmeShGVE5fR0VUX0xFVkVMLCAzMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNLCAzMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9URUFNX1NJWkUsIDMwKTsKK3hhbGlhc2lmeShGVE5fR0VUX0FDVElWRV9MRVZFTCwgMzApOworeGFsaWFzaWZ5KEZUTl9JTklUX0xPQ0ssIDMwKTsKK3hhbGlhc2lmeShGVE5fSU5JVF9ORVNUX0xPQ0ssIDMwKTsKK3hhbGlhc2lmeShGVE5fREVTVFJPWV9MT0NLLCAzMCk7Cit4YWxpYXNpZnkoRlROX0RFU1RST1lfTkVTVF9MT0NLLCAzMCk7Cit4YWxpYXNpZnkoRlROX1NFVF9MT0NLLCAzMCk7Cit4YWxpYXNpZnkoRlROX1NFVF9ORVNUX0xPQ0ssIDMwKTsKK3hhbGlhc2lmeShGVE5fVU5TRVRfTE9DSywgMzApOworeGFsaWFzaWZ5KEZUTl9VTlNFVF9ORVNUX0xPQ0ssIDMwKTsKK3hhbGlhc2lmeShGVE5fVEVTVF9MT0NLLCAzMCk7Cit4YWxpYXNpZnkoRlROX1RFU1RfTkVTVF9MT0NLLCAzMCk7CisKKy8vIE9NUF8zLjEgYWxpYXNlcworeGFsaWFzaWZ5KEZUTl9JTl9GSU5BTCwgMzEpOworCisjaWYgT01QXzQwX0VOQUJMRUQKKy8vIE9NUF80LjAgYWxpYXNlcworeGFsaWFzaWZ5KEZUTl9HRVRfUFJPQ19CSU5ELCA0MCk7Cit4YWxpYXNpZnkoRlROX0dFVF9OVU1fVEVBTVMsIDQwKTsKK3hhbGlhc2lmeShGVE5fR0VUX1RFQU1fTlVNLCA0MCk7Cit4YWxpYXNpZnkoRlROX0dFVF9DQU5DRUxMQVRJT04sIDQwKTsKK3hhbGlhc2lmeShGVE5fR0VUX0RFRkFVTFRfREVWSUNFLCA0MCk7Cit4YWxpYXNpZnkoRlROX1NFVF9ERUZBVUxUX0RFVklDRSwgNDApOworeGFsaWFzaWZ5KEZUTl9JU19JTklUSUFMX0RFVklDRSwgNDApOworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyNpZiBPTVBfNDVfRU5BQkxFRAorLy8gT01QXzQuNSBhbGlhc2VzCisjZW5kaWYKKworI2lmIE9NUF81MF9FTkFCTEVECisvLyBPTVBfNS4wIGFsaWFzZXMKKyNlbmRpZgorCisvLyBPTVBfMS4wIHZlcnNpb25lZCBzeW1ib2xzCit4dmVyc2lvbmlmeShGVE5fU0VUX05VTV9USFJFQURTLCAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfTlVNX1RIUkVBRFMsIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9NQVhfVEhSRUFEUywgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX1RIUkVBRF9OVU0sIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9OVU1fUFJPQ1MsIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0lOX1BBUkFMTEVMLCAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9TRVRfRFlOQU1JQywgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX0RZTkFNSUMsIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX1NFVF9ORVNURUQsIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9ORVNURUQsIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0lOSVRfTE9DSywgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fSU5JVF9ORVNUX0xPQ0ssIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0RFU1RST1lfTE9DSywgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fREVTVFJPWV9ORVNUX0xPQ0ssIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX1NFVF9MT0NLLCAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9TRVRfTkVTVF9MT0NLLCAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9VTlNFVF9MT0NLLCAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9VTlNFVF9ORVNUX0xPQ0ssIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX1RFU1RfTE9DSywgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fVEVTVF9ORVNUX0xPQ0ssIDEwLCAiT01QXzEuMCIpOworCisvLyBPTVBfMi4wIHZlcnNpb25lZCBzeW1ib2xzCit4dmVyc2lvbmlmeShGVE5fR0VUX1dUSUNLLCAyMCwgIk9NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfV1RJTUUsIDIwLCAiT01QXzIuMCIpOworCisvLyBPTVBfMy4wIHZlcnNpb25lZCBzeW1ib2xzCit4dmVyc2lvbmlmeShGVE5fU0VUX1NDSEVEVUxFLCAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfU0NIRURVTEUsIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9USFJFQURfTElNSVQsIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX1NFVF9NQVhfQUNUSVZFX0xFVkVMUywgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX01BWF9BQ1RJVkVfTEVWRUxTLCAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTSwgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX0xFVkVMLCAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfVEVBTV9TSVpFLCAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfQUNUSVZFX0xFVkVMLCAzMCwgIk9NUF8zLjAiKTsKKworLy8gdGhlIGxvY2sgcm91dGluZXMgaGF2ZSBhIDEuMCBhbmQgMy4wIHZlcnNpb24KK3h2ZXJzaW9uaWZ5KEZUTl9JTklUX0xPQ0ssIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX0lOSVRfTkVTVF9MT0NLLCAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9ERVNUUk9ZX0xPQ0ssIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX0RFU1RST1lfTkVTVF9MT0NLLCAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9TRVRfTE9DSywgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fU0VUX05FU1RfTE9DSywgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fVU5TRVRfTE9DSywgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fVU5TRVRfTkVTVF9MT0NLLCAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9URVNUX0xPQ0ssIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX1RFU1RfTkVTVF9MT0NLLCAzMCwgIk9NUF8zLjAiKTsKKworLy8gT01QXzMuMSB2ZXJzaW9uZWQgc3ltYm9sCit4dmVyc2lvbmlmeShGVE5fSU5fRklOQUwsIDMxLCAiT01QXzMuMSIpOworCisjaWYgT01QXzQwX0VOQUJMRUQKKy8vIE9NUF80LjAgdmVyc2lvbmVkIHN5bWJvbHMKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfUFJPQ19CSU5ELCA0MCwgIk9NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfTlVNX1RFQU1TLCA0MCwgIk9NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfVEVBTV9OVU0sIDQwLCAiT01QXzQuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9DQU5DRUxMQVRJT04sIDQwLCAiT01QXzQuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9ERUZBVUxUX0RFVklDRSwgNDAsICJPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShGVE5fU0VUX0RFRkFVTFRfREVWSUNFLCA0MCwgIk9NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9JU19JTklUSUFMX0RFVklDRSwgNDAsICJPTVBfNC4wIik7CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworI2lmIE9NUF80NV9FTkFCTEVECisvLyBPTVBfNC41IHZlcnNpb25lZCBzeW1ib2xzCisjZW5kaWYKKworI2lmIE9NUF81MF9FTkFCTEVECisvLyBPTVBfNS4wIHZlcnNpb25lZCBzeW1ib2xzCisjZW5kaWYKKworI2VuZGlmIC8vIEtNUF9VU0VfVkVSU0lPTl9TWU1CT0xTCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9mdG5fZXh0cmEuY3BwIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Z0bl9leHRyYS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNmOTg3NQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9mdG5fZXh0cmEuY3BwCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBrbXBfZnRuX2V4dHJhLmNwcCAtLSBGb3J0cmFuICdleHRyYScgbGlua2FnZSBzdXBwb3J0IGZvciBPcGVuTVAuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfYWZmaW5pdHkuaCIKKworI2lmIEtNUF9PU19XSU5ET1dTCisjZGVmaW5lIEtNUF9GVE5fRU5UUklFUyBLTVBfRlROX1BMQUlOCisjZWxpZiBLTVBfT1NfVU5JWAorI2RlZmluZSBLTVBfRlROX0VOVFJJRVMgS01QX0ZUTl9BUFBFTkQKKyNlbmRpZgorCisvLyBOb3RlOiBUaGlzIHN0cmluZyBpcyBub3QgcHJpbnRlZCB3aGVuIEtNUF9WRVJTSU9OPTEuCitjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fZnRuZXh0cmFbXSA9CisgICAgS01QX1ZFUlNJT05fUFJFRklYICJGb3J0cmFuIFwiZXh0cmFcIiBPTVAgc3VwcG9ydDogIgorI2lmZGVmIEtNUF9GVE5fRU5UUklFUworICAgICAgICAgICAgICAgICAgICAgICAieWVzIjsKKyNkZWZpbmUgRlROX1NURENBTEwgLyogbm90aGluZyB0byBkbyAqLworI2luY2x1ZGUgImttcF9mdG5fb3MuaCIKKyNpbmNsdWRlICJrbXBfZnRuX2VudHJ5LmgiCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAibm8iOworI2VuZGlmIC8qIEtNUF9GVE5fRU5UUklFUyAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2Z0bl9vcy5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX2Z0bl9vcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMDRiMmYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfZnRuX29zLmgKQEAgLTAsMCArMSw2NDQgQEAKKy8qCisgKiBrbXBfZnRuX29zLmggLS0gS1BUUyBGb3J0cmFuIGRlZmluZXMgaGVhZGVyIGZpbGUuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0ZUTl9PU19ICisjZGVmaW5lIEtNUF9GVE5fT1NfSAorCisvLyBLTVBfRk5UX0VOVFJJRVMgbWF5IGJlIG9uZSBvZjogS01QX0ZUTl9QTEFJTiwgS01QX0ZUTl9VUFBFUiwgS01QX0ZUTl9BUFBFTkQsCisvLyBLTVBfRlROX1VBUFBFTkQuCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEV4dGVybmFsIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgS01QX0ZUTl9FTlRSSUVTID09IEtNUF9GVE5fUExBSU4KKworI2RlZmluZSBGVE5fU0VUX1NUQUNLU0laRSBrbXBfc2V0X3N0YWNrc2l6ZQorI2RlZmluZSBGVE5fU0VUX1NUQUNLU0laRV9TIGttcF9zZXRfc3RhY2tzaXplX3MKKyNkZWZpbmUgRlROX0dFVF9TVEFDS1NJWkUga21wX2dldF9zdGFja3NpemUKKyNkZWZpbmUgRlROX0dFVF9TVEFDS1NJWkVfUyBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisjZGVmaW5lIEZUTl9TRVRfQkxPQ0tUSU1FIGttcF9zZXRfYmxvY2t0aW1lCisjZGVmaW5lIEZUTl9HRVRfQkxPQ0tUSU1FIGttcF9nZXRfYmxvY2t0aW1lCisjZGVmaW5lIEZUTl9TRVRfTElCUkFSWV9TRVJJQUwga21wX3NldF9saWJyYXJ5X3NlcmlhbAorI2RlZmluZSBGVE5fU0VUX0xJQlJBUllfVFVSTkFST1VORCBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorI2RlZmluZSBGVE5fU0VUX0xJQlJBUllfVEhST1VHSFBVVCBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorI2RlZmluZSBGVE5fU0VUX0xJQlJBUlkga21wX3NldF9saWJyYXJ5CisjZGVmaW5lIEZUTl9HRVRfTElCUkFSWSBrbXBfZ2V0X2xpYnJhcnkKKyNkZWZpbmUgRlROX1NFVF9ERUZBVUxUUyBrbXBfc2V0X2RlZmF1bHRzCisjZGVmaW5lIEZUTl9TRVRfRElTUF9OVU1fQlVGRkVSUyBrbXBfc2V0X2Rpc3BfbnVtX2J1ZmZlcnMKKyNkZWZpbmUgRlROX1NFVF9BRkZJTklUWSBrbXBfc2V0X2FmZmluaXR5CisjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFkga21wX2dldF9hZmZpbml0eQorI2RlZmluZSBGVE5fR0VUX0FGRklOSVRZX01BWF9QUk9DIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyNkZWZpbmUgRlROX0NSRUFURV9BRkZJTklUWV9NQVNLIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworI2RlZmluZSBGVE5fREVTVFJPWV9BRkZJTklUWV9NQVNLIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyNkZWZpbmUgRlROX1NFVF9BRkZJTklUWV9NQVNLX1BST0Mga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyNkZWZpbmUgRlROX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQyBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFlfTUFTS19QUk9DIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyNkZWZpbmUgRlROX01BTExPQyBrbXBfbWFsbG9jCisjZGVmaW5lIEZUTl9BTElHTkVEX01BTExPQyBrbXBfYWxpZ25lZF9tYWxsb2MKKyNkZWZpbmUgRlROX0NBTExPQyBrbXBfY2FsbG9jCisjZGVmaW5lIEZUTl9SRUFMTE9DIGttcF9yZWFsbG9jCisjZGVmaW5lIEZUTl9GUkVFIGttcF9mcmVlCisKKyNkZWZpbmUgRlROX0dFVF9OVU1fS05PV05fVEhSRUFEUyBrbXBfZ2V0X251bV9rbm93bl90aHJlYWRzCisKKyNkZWZpbmUgRlROX1NFVF9OVU1fVEhSRUFEUyBvbXBfc2V0X251bV90aHJlYWRzCisjZGVmaW5lIEZUTl9HRVRfTlVNX1RIUkVBRFMgb21wX2dldF9udW1fdGhyZWFkcworI2RlZmluZSBGVE5fR0VUX01BWF9USFJFQURTIG9tcF9nZXRfbWF4X3RocmVhZHMKKyNkZWZpbmUgRlROX0dFVF9USFJFQURfTlVNIG9tcF9nZXRfdGhyZWFkX251bQorI2RlZmluZSBGVE5fR0VUX05VTV9QUk9DUyBvbXBfZ2V0X251bV9wcm9jcworI2RlZmluZSBGVE5fU0VUX0RZTkFNSUMgb21wX3NldF9keW5hbWljCisjZGVmaW5lIEZUTl9HRVRfRFlOQU1JQyBvbXBfZ2V0X2R5bmFtaWMKKyNkZWZpbmUgRlROX1NFVF9ORVNURUQgb21wX3NldF9uZXN0ZWQKKyNkZWZpbmUgRlROX0dFVF9ORVNURUQgb21wX2dldF9uZXN0ZWQKKyNkZWZpbmUgRlROX0lOX1BBUkFMTEVMIG9tcF9pbl9wYXJhbGxlbAorI2RlZmluZSBGVE5fR0VUX1RIUkVBRF9MSU1JVCBvbXBfZ2V0X3RocmVhZF9saW1pdAorI2RlZmluZSBGVE5fU0VUX1NDSEVEVUxFIG9tcF9zZXRfc2NoZWR1bGUKKyNkZWZpbmUgRlROX0dFVF9TQ0hFRFVMRSBvbXBfZ2V0X3NjaGVkdWxlCisjZGVmaW5lIEZUTl9TRVRfTUFYX0FDVElWRV9MRVZFTFMgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworI2RlZmluZSBGVE5fR0VUX01BWF9BQ1RJVkVfTEVWRUxTIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyNkZWZpbmUgRlROX0dFVF9BQ1RJVkVfTEVWRUwgb21wX2dldF9hY3RpdmVfbGV2ZWwKKyNkZWZpbmUgRlROX0dFVF9MRVZFTCBvbXBfZ2V0X2xldmVsCisjZGVmaW5lIEZUTl9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTSBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyNkZWZpbmUgRlROX0dFVF9URUFNX1NJWkUgb21wX2dldF90ZWFtX3NpemUKKyNkZWZpbmUgRlROX0lOX0ZJTkFMIG9tcF9pbl9maW5hbAorLy8gICNkZWZpbmUgRlROX1NFVF9QUk9DX0JJTkQgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfcHJvY19iaW5kCisjZGVmaW5lIEZUTl9HRVRfUFJPQ19CSU5EIG9tcF9nZXRfcHJvY19iaW5kCisvLyAgI2RlZmluZSBGVE5fQ1VSUl9QUk9DX0JJTkQgICAgICAgICAgICAgICAgICAgb21wX2N1cnJfcHJvY19iaW5kCisjaWYgT01QXzQwX0VOQUJMRUQKKyNkZWZpbmUgRlROX0dFVF9OVU1fVEVBTVMgb21wX2dldF9udW1fdGVhbXMKKyNkZWZpbmUgRlROX0dFVF9URUFNX05VTSBvbXBfZ2V0X3RlYW1fbnVtCisjZW5kaWYKKyNkZWZpbmUgRlROX0lOSVRfTE9DSyBvbXBfaW5pdF9sb2NrCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyNkZWZpbmUgRlROX0lOSVRfTE9DS19XSVRIX0hJTlQgb21wX2luaXRfbG9ja193aXRoX2hpbnQKKyNkZWZpbmUgRlROX0lOSVRfTkVTVF9MT0NLX1dJVEhfSElOVCBvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50CisjZW5kaWYKKyNkZWZpbmUgRlROX0RFU1RST1lfTE9DSyBvbXBfZGVzdHJveV9sb2NrCisjZGVmaW5lIEZUTl9TRVRfTE9DSyBvbXBfc2V0X2xvY2sKKyNkZWZpbmUgRlROX1VOU0VUX0xPQ0sgb21wX3Vuc2V0X2xvY2sKKyNkZWZpbmUgRlROX1RFU1RfTE9DSyBvbXBfdGVzdF9sb2NrCisjZGVmaW5lIEZUTl9JTklUX05FU1RfTE9DSyBvbXBfaW5pdF9uZXN0X2xvY2sKKyNkZWZpbmUgRlROX0RFU1RST1lfTkVTVF9MT0NLIG9tcF9kZXN0cm95X25lc3RfbG9jaworI2RlZmluZSBGVE5fU0VUX05FU1RfTE9DSyBvbXBfc2V0X25lc3RfbG9jaworI2RlZmluZSBGVE5fVU5TRVRfTkVTVF9MT0NLIG9tcF91bnNldF9uZXN0X2xvY2sKKyNkZWZpbmUgRlROX1RFU1RfTkVTVF9MT0NLIG9tcF90ZXN0X25lc3RfbG9jaworCisjZGVmaW5lIEZUTl9TRVRfV0FSTklOR1NfT04ga21wX3NldF93YXJuaW5nc19vbgorI2RlZmluZSBGVE5fU0VUX1dBUk5JTkdTX09GRiBrbXBfc2V0X3dhcm5pbmdzX29mZgorCisjZGVmaW5lIEZUTl9HRVRfV1RJTUUgb21wX2dldF93dGltZQorI2RlZmluZSBGVE5fR0VUX1dUSUNLIG9tcF9nZXRfd3RpY2sKKworI2lmIE9NUF80MF9FTkFCTEVECisjaWYgS01QX01JQyB8fCBLTVBfT1NfREFSV0lOIHx8IGRlZmluZWQoS01QX1NUVUIpCisjZGVmaW5lIEZUTl9HRVRfTlVNX0RFVklDRVMgb21wX2dldF9udW1fZGV2aWNlcworI2VuZGlmCisjZGVmaW5lIEZUTl9HRVRfREVGQVVMVF9ERVZJQ0Ugb21wX2dldF9kZWZhdWx0X2RldmljZQorI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRfREVWSUNFIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UKKyNkZWZpbmUgRlROX0lTX0lOSVRJQUxfREVWSUNFIG9tcF9pc19pbml0aWFsX2RldmljZQorI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTiBvbXBfZ2V0X2NhbmNlbGxhdGlvbgorI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTl9TVEFUVVMga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisjZW5kaWYKKworI2lmIE9NUF80NV9FTkFCTEVECisjZGVmaW5lIEZUTl9HRVRfTUFYX1RBU0tfUFJJT1JJVFkgb21wX2dldF9tYXhfdGFza19wcmlvcml0eQorI2RlZmluZSBGVE5fR0VUX05VTV9QTEFDRVMgb21wX2dldF9udW1fcGxhY2VzCisjZGVmaW5lIEZUTl9HRVRfUExBQ0VfTlVNX1BST0NTIG9tcF9nZXRfcGxhY2VfbnVtX3Byb2NzCisjZGVmaW5lIEZUTl9HRVRfUExBQ0VfUFJPQ19JRFMgb21wX2dldF9wbGFjZV9wcm9jX2lkcworI2RlZmluZSBGVE5fR0VUX1BMQUNFX05VTSBvbXBfZ2V0X3BsYWNlX251bQorI2RlZmluZSBGVE5fR0VUX1BBUlRJVElPTl9OVU1fUExBQ0VTIG9tcF9nZXRfcGFydGl0aW9uX251bV9wbGFjZXMKKyNkZWZpbmUgRlROX0dFVF9QQVJUSVRJT05fUExBQ0VfTlVNUyBvbXBfZ2V0X3BhcnRpdGlvbl9wbGFjZV9udW1zCisjaWZkZWYgS01QX1NUVUIKKyNkZWZpbmUgRlROX0dFVF9JTklUSUFMX0RFVklDRSBvbXBfZ2V0X2luaXRpYWxfZGV2aWNlCisjZGVmaW5lIEZUTl9UQVJHRVRfQUxMT0Mgb21wX3RhcmdldF9hbGxvYworI2RlZmluZSBGVE5fVEFSR0VUX0ZSRUUgb21wX3RhcmdldF9mcmVlCisjZGVmaW5lIEZUTl9UQVJHRVRfSVNfUFJFU0VOVCBvbXBfdGFyZ2V0X2lzX3ByZXNlbnQKKyNkZWZpbmUgRlROX1RBUkdFVF9NRU1DUFkgb21wX3RhcmdldF9tZW1jcHkKKyNkZWZpbmUgRlROX1RBUkdFVF9NRU1DUFlfUkVDVCBvbXBfdGFyZ2V0X21lbWNweV9yZWN0CisjZGVmaW5lIEZUTl9UQVJHRVRfQVNTT0NJQVRFX1BUUiBvbXBfdGFyZ2V0X2Fzc29jaWF0ZV9wdHIKKyNkZWZpbmUgRlROX1RBUkdFVF9ESVNBU1NPQ0lBVEVfUFRSIG9tcF90YXJnZXRfZGlzYXNzb2NpYXRlX3B0cgorI2VuZGlmCisjZW5kaWYKKworI2VuZGlmIC8qIEtNUF9GVE5fUExBSU4gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfRlROX0VOVFJJRVMgPT0gS01QX0ZUTl9BUFBFTkQKKworI2RlZmluZSBGVE5fU0VUX1NUQUNLU0laRSBrbXBfc2V0X3N0YWNrc2l6ZV8KKyNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkVfUyBrbXBfc2V0X3N0YWNrc2l6ZV9zXworI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRSBrbXBfZ2V0X3N0YWNrc2l6ZV8KKyNkZWZpbmUgRlROX0dFVF9TVEFDS1NJWkVfUyBrbXBfZ2V0X3N0YWNrc2l6ZV9zXworI2RlZmluZSBGVE5fU0VUX0JMT0NLVElNRSBrbXBfc2V0X2Jsb2NrdGltZV8KKyNkZWZpbmUgRlROX0dFVF9CTE9DS1RJTUUga21wX2dldF9ibG9ja3RpbWVfCisjZGVmaW5lIEZUTl9TRVRfTElCUkFSWV9TRVJJQUwga21wX3NldF9saWJyYXJ5X3NlcmlhbF8KKyNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfCisjZGVmaW5lIEZUTl9TRVRfTElCUkFSWV9USFJPVUdIUFVUIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0XworI2RlZmluZSBGVE5fU0VUX0xJQlJBUlkga21wX3NldF9saWJyYXJ5XworI2RlZmluZSBGVE5fR0VUX0xJQlJBUlkga21wX2dldF9saWJyYXJ5XworI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRTIGttcF9zZXRfZGVmYXVsdHNfCisjZGVmaW5lIEZUTl9TRVRfRElTUF9OVU1fQlVGRkVSUyBrbXBfc2V0X2Rpc3BfbnVtX2J1ZmZlcnNfCisjZGVmaW5lIEZUTl9TRVRfQUZGSU5JVFkga21wX3NldF9hZmZpbml0eV8KKyNkZWZpbmUgRlROX0dFVF9BRkZJTklUWSBrbXBfZ2V0X2FmZmluaXR5XworI2RlZmluZSBGVE5fR0VUX0FGRklOSVRZX01BWF9QUk9DIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfCisjZGVmaW5lIEZUTl9DUkVBVEVfQUZGSU5JVFlfTUFTSyBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfCisjZGVmaW5lIEZUTl9ERVNUUk9ZX0FGRklOSVRZX01BU0sga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza18KKyNkZWZpbmUgRlROX1NFVF9BRkZJTklUWV9NQVNLX1BST0Mga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfCisjZGVmaW5lIEZUTl9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0Mga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY18KKyNkZWZpbmUgRlROX0dFVF9BRkZJTklUWV9NQVNLX1BST0Mga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfCisKKyNkZWZpbmUgRlROX01BTExPQyBrbXBfbWFsbG9jXworI2RlZmluZSBGVE5fQUxJR05FRF9NQUxMT0Mga21wX2FsaWduZWRfbWFsbG9jXworI2RlZmluZSBGVE5fQ0FMTE9DIGttcF9jYWxsb2NfCisjZGVmaW5lIEZUTl9SRUFMTE9DIGttcF9yZWFsbG9jXworI2RlZmluZSBGVE5fRlJFRSBrbXBfZnJlZV8KKworI2RlZmluZSBGVE5fR0VUX05VTV9LTk9XTl9USFJFQURTIGttcF9nZXRfbnVtX2tub3duX3RocmVhZHNfCisKKyNkZWZpbmUgRlROX1NFVF9OVU1fVEhSRUFEUyBvbXBfc2V0X251bV90aHJlYWRzXworI2RlZmluZSBGVE5fR0VUX05VTV9USFJFQURTIG9tcF9nZXRfbnVtX3RocmVhZHNfCisjZGVmaW5lIEZUTl9HRVRfTUFYX1RIUkVBRFMgb21wX2dldF9tYXhfdGhyZWFkc18KKyNkZWZpbmUgRlROX0dFVF9USFJFQURfTlVNIG9tcF9nZXRfdGhyZWFkX251bV8KKyNkZWZpbmUgRlROX0dFVF9OVU1fUFJPQ1Mgb21wX2dldF9udW1fcHJvY3NfCisjZGVmaW5lIEZUTl9TRVRfRFlOQU1JQyBvbXBfc2V0X2R5bmFtaWNfCisjZGVmaW5lIEZUTl9HRVRfRFlOQU1JQyBvbXBfZ2V0X2R5bmFtaWNfCisjZGVmaW5lIEZUTl9TRVRfTkVTVEVEIG9tcF9zZXRfbmVzdGVkXworI2RlZmluZSBGVE5fR0VUX05FU1RFRCBvbXBfZ2V0X25lc3RlZF8KKyNkZWZpbmUgRlROX0lOX1BBUkFMTEVMIG9tcF9pbl9wYXJhbGxlbF8KKyNkZWZpbmUgRlROX0dFVF9USFJFQURfTElNSVQgb21wX2dldF90aHJlYWRfbGltaXRfCisjZGVmaW5lIEZUTl9TRVRfU0NIRURVTEUgb21wX3NldF9zY2hlZHVsZV8KKyNkZWZpbmUgRlROX0dFVF9TQ0hFRFVMRSBvbXBfZ2V0X3NjaGVkdWxlXworI2RlZmluZSBGVE5fU0VUX01BWF9BQ1RJVkVfTEVWRUxTIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHNfCisjZGVmaW5lIEZUTl9HRVRfTUFYX0FDVElWRV9MRVZFTFMgb21wX2dldF9tYXhfYWN0aXZlX2xldmVsc18KKyNkZWZpbmUgRlROX0dFVF9BQ1RJVkVfTEVWRUwgb21wX2dldF9hY3RpdmVfbGV2ZWxfCisjZGVmaW5lIEZUTl9HRVRfTEVWRUwgb21wX2dldF9sZXZlbF8KKyNkZWZpbmUgRlROX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bV8KKyNkZWZpbmUgRlROX0dFVF9URUFNX1NJWkUgb21wX2dldF90ZWFtX3NpemVfCisjZGVmaW5lIEZUTl9JTl9GSU5BTCBvbXBfaW5fZmluYWxfCisvLyAgI2RlZmluZSBGVE5fU0VUX1BST0NfQklORCAgICAgICAgICAgICAgICAgICAgb21wX3NldF9wcm9jX2JpbmRfCisjZGVmaW5lIEZUTl9HRVRfUFJPQ19CSU5EIG9tcF9nZXRfcHJvY19iaW5kXworLy8gICNkZWZpbmUgRlROX0NVUlJfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgIG9tcF9jdXJyX3Byb2NfYmluZF8KKyNpZiBPTVBfNDBfRU5BQkxFRAorI2RlZmluZSBGVE5fR0VUX05VTV9URUFNUyBvbXBfZ2V0X251bV90ZWFtc18KKyNkZWZpbmUgRlROX0dFVF9URUFNX05VTSBvbXBfZ2V0X3RlYW1fbnVtXworI2VuZGlmCisjZGVmaW5lIEZUTl9JTklUX0xPQ0sgb21wX2luaXRfbG9ja18KKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworI2RlZmluZSBGVE5fSU5JVF9MT0NLX1dJVEhfSElOVCBvbXBfaW5pdF9sb2NrX3dpdGhfaGludF8KKyNkZWZpbmUgRlROX0lOSVRfTkVTVF9MT0NLX1dJVEhfSElOVCBvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50XworI2VuZGlmCisjZGVmaW5lIEZUTl9ERVNUUk9ZX0xPQ0sgb21wX2Rlc3Ryb3lfbG9ja18KKyNkZWZpbmUgRlROX1NFVF9MT0NLIG9tcF9zZXRfbG9ja18KKyNkZWZpbmUgRlROX1VOU0VUX0xPQ0sgb21wX3Vuc2V0X2xvY2tfCisjZGVmaW5lIEZUTl9URVNUX0xPQ0sgb21wX3Rlc3RfbG9ja18KKyNkZWZpbmUgRlROX0lOSVRfTkVTVF9MT0NLIG9tcF9pbml0X25lc3RfbG9ja18KKyNkZWZpbmUgRlROX0RFU1RST1lfTkVTVF9MT0NLIG9tcF9kZXN0cm95X25lc3RfbG9ja18KKyNkZWZpbmUgRlROX1NFVF9ORVNUX0xPQ0sgb21wX3NldF9uZXN0X2xvY2tfCisjZGVmaW5lIEZUTl9VTlNFVF9ORVNUX0xPQ0sgb21wX3Vuc2V0X25lc3RfbG9ja18KKyNkZWZpbmUgRlROX1RFU1RfTkVTVF9MT0NLIG9tcF90ZXN0X25lc3RfbG9ja18KKworI2RlZmluZSBGVE5fU0VUX1dBUk5JTkdTX09OIGttcF9zZXRfd2FybmluZ3Nfb25fCisjZGVmaW5lIEZUTl9TRVRfV0FSTklOR1NfT0ZGIGttcF9zZXRfd2FybmluZ3Nfb2ZmXworCisjZGVmaW5lIEZUTl9HRVRfV1RJTUUgb21wX2dldF93dGltZV8KKyNkZWZpbmUgRlROX0dFVF9XVElDSyBvbXBfZ2V0X3d0aWNrXworCisjaWYgT01QXzQwX0VOQUJMRUQKKyNpZiBLTVBfTUlDIHx8IEtNUF9PU19EQVJXSU4gfHwgZGVmaW5lZChLTVBfU1RVQikKKyNkZWZpbmUgRlROX0dFVF9OVU1fREVWSUNFUyBvbXBfZ2V0X251bV9kZXZpY2VzXworI2VuZGlmCisjZGVmaW5lIEZUTl9HRVRfREVGQVVMVF9ERVZJQ0Ugb21wX2dldF9kZWZhdWx0X2RldmljZV8KKyNkZWZpbmUgRlROX1NFVF9ERUZBVUxUX0RFVklDRSBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlXworI2RlZmluZSBGVE5fSVNfSU5JVElBTF9ERVZJQ0Ugb21wX2lzX2luaXRpYWxfZGV2aWNlXworI2VuZGlmCisKKworI2lmIE9NUF80MF9FTkFCTEVECisjZGVmaW5lIEZUTl9HRVRfQ0FOQ0VMTEFUSU9OIG9tcF9nZXRfY2FuY2VsbGF0aW9uXworI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTl9TVEFUVVMga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzXworI2VuZGlmCisKKyNpZiBPTVBfNDVfRU5BQkxFRAorI2RlZmluZSBGVE5fR0VUX01BWF9UQVNLX1BSSU9SSVRZIG9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHlfCisjZGVmaW5lIEZUTl9HRVRfTlVNX1BMQUNFUyBvbXBfZ2V0X251bV9wbGFjZXNfCisjZGVmaW5lIEZUTl9HRVRfUExBQ0VfTlVNX1BST0NTIG9tcF9nZXRfcGxhY2VfbnVtX3Byb2NzXworI2RlZmluZSBGVE5fR0VUX1BMQUNFX1BST0NfSURTIG9tcF9nZXRfcGxhY2VfcHJvY19pZHNfCisjZGVmaW5lIEZUTl9HRVRfUExBQ0VfTlVNIG9tcF9nZXRfcGxhY2VfbnVtXworI2RlZmluZSBGVE5fR0VUX1BBUlRJVElPTl9OVU1fUExBQ0VTIG9tcF9nZXRfcGFydGl0aW9uX251bV9wbGFjZXNfCisjZGVmaW5lIEZUTl9HRVRfUEFSVElUSU9OX1BMQUNFX05VTVMgb21wX2dldF9wYXJ0aXRpb25fcGxhY2VfbnVtc18KKyNpZmRlZiBLTVBfU1RVQgorI2RlZmluZSBGVE5fR0VUX0lOSVRJQUxfREVWSUNFIG9tcF9nZXRfaW5pdGlhbF9kZXZpY2VfCisjZGVmaW5lIEZUTl9UQVJHRVRfQUxMT0Mgb21wX3RhcmdldF9hbGxvY18KKyNkZWZpbmUgRlROX1RBUkdFVF9GUkVFIG9tcF90YXJnZXRfZnJlZV8KKyNkZWZpbmUgRlROX1RBUkdFVF9JU19QUkVTRU5UIG9tcF90YXJnZXRfaXNfcHJlc2VudF8KKyNkZWZpbmUgRlROX1RBUkdFVF9NRU1DUFkgb21wX3RhcmdldF9tZW1jcHlfCisjZGVmaW5lIEZUTl9UQVJHRVRfTUVNQ1BZX1JFQ1Qgb21wX3RhcmdldF9tZW1jcHlfcmVjdF8KKyNkZWZpbmUgRlROX1RBUkdFVF9BU1NPQ0lBVEVfUFRSIG9tcF90YXJnZXRfYXNzb2NpYXRlX3B0cl8KKyNkZWZpbmUgRlROX1RBUkdFVF9ESVNBU1NPQ0lBVEVfUFRSIG9tcF90YXJnZXRfZGlzYXNzb2NpYXRlX3B0cl8KKyNlbmRpZgorI2VuZGlmCisKKyNlbmRpZiAvKiBLTVBfRlROX0FQUEVORCAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9GVE5fRU5UUklFUyA9PSBLTVBfRlROX1VQUEVSCisKKyNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkUgS01QX1NFVF9TVEFDS1NJWkUKKyNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkVfUyBLTVBfU0VUX1NUQUNLU0laRV9TCisjZGVmaW5lIEZUTl9HRVRfU1RBQ0tTSVpFIEtNUF9HRVRfU1RBQ0tTSVpFCisjZGVmaW5lIEZUTl9HRVRfU1RBQ0tTSVpFX1MgS01QX0dFVF9TVEFDS1NJWkVfUworI2RlZmluZSBGVE5fU0VUX0JMT0NLVElNRSBLTVBfU0VUX0JMT0NLVElNRQorI2RlZmluZSBGVE5fR0VUX0JMT0NLVElNRSBLTVBfR0VUX0JMT0NLVElNRQorI2RlZmluZSBGVE5fU0VUX0xJQlJBUllfU0VSSUFMIEtNUF9TRVRfTElCUkFSWV9TRVJJQUwKKyNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQgS01QX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQKKyNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQgS01QX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQKKyNkZWZpbmUgRlROX1NFVF9MSUJSQVJZIEtNUF9TRVRfTElCUkFSWQorI2RlZmluZSBGVE5fR0VUX0xJQlJBUlkgS01QX0dFVF9MSUJSQVJZCisjZGVmaW5lIEZUTl9TRVRfREVGQVVMVFMgS01QX1NFVF9ERUZBVUxUUworI2RlZmluZSBGVE5fU0VUX0RJU1BfTlVNX0JVRkZFUlMgS01QX1NFVF9ESVNQX05VTV9CVUZGRVJTCisjZGVmaW5lIEZUTl9TRVRfQUZGSU5JVFkgS01QX1NFVF9BRkZJTklUWQorI2RlZmluZSBGVE5fR0VUX0FGRklOSVRZIEtNUF9HRVRfQUZGSU5JVFkKKyNkZWZpbmUgRlROX0dFVF9BRkZJTklUWV9NQVhfUFJPQyBLTVBfR0VUX0FGRklOSVRZX01BWF9QUk9DCisjZGVmaW5lIEZUTl9DUkVBVEVfQUZGSU5JVFlfTUFTSyBLTVBfQ1JFQVRFX0FGRklOSVRZX01BU0sKKyNkZWZpbmUgRlROX0RFU1RST1lfQUZGSU5JVFlfTUFTSyBLTVBfREVTVFJPWV9BRkZJTklUWV9NQVNLCisjZGVmaW5lIEZUTl9TRVRfQUZGSU5JVFlfTUFTS19QUk9DIEtNUF9TRVRfQUZGSU5JVFlfTUFTS19QUk9DCisjZGVmaW5lIEZUTl9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MgS01QX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQworI2RlZmluZSBGVE5fR0VUX0FGRklOSVRZX01BU0tfUFJPQyBLTVBfR0VUX0FGRklOSVRZX01BU0tfUFJPQworCisjZGVmaW5lIEZUTl9NQUxMT0MgS01QX01BTExPQworI2RlZmluZSBGVE5fQUxJR05FRF9NQUxMT0MgS01QX0FMSUdORURfTUFMTE9DCisjZGVmaW5lIEZUTl9DQUxMT0MgS01QX0NBTExPQworI2RlZmluZSBGVE5fUkVBTExPQyBLTVBfUkVBTExPQworI2RlZmluZSBGVE5fRlJFRSBLTVBfRlJFRQorCisjZGVmaW5lIEZUTl9HRVRfTlVNX0tOT1dOX1RIUkVBRFMgS01QX0dFVF9OVU1fS05PV05fVEhSRUFEUworCisjZGVmaW5lIEZUTl9TRVRfTlVNX1RIUkVBRFMgT01QX1NFVF9OVU1fVEhSRUFEUworI2RlZmluZSBGVE5fR0VUX05VTV9USFJFQURTIE9NUF9HRVRfTlVNX1RIUkVBRFMKKyNkZWZpbmUgRlROX0dFVF9NQVhfVEhSRUFEUyBPTVBfR0VUX01BWF9USFJFQURTCisjZGVmaW5lIEZUTl9HRVRfVEhSRUFEX05VTSBPTVBfR0VUX1RIUkVBRF9OVU0KKyNkZWZpbmUgRlROX0dFVF9OVU1fUFJPQ1MgT01QX0dFVF9OVU1fUFJPQ1MKKyNkZWZpbmUgRlROX1NFVF9EWU5BTUlDIE9NUF9TRVRfRFlOQU1JQworI2RlZmluZSBGVE5fR0VUX0RZTkFNSUMgT01QX0dFVF9EWU5BTUlDCisjZGVmaW5lIEZUTl9TRVRfTkVTVEVEIE9NUF9TRVRfTkVTVEVECisjZGVmaW5lIEZUTl9HRVRfTkVTVEVEIE9NUF9HRVRfTkVTVEVECisjZGVmaW5lIEZUTl9JTl9QQVJBTExFTCBPTVBfSU5fUEFSQUxMRUwKKyNkZWZpbmUgRlROX0dFVF9USFJFQURfTElNSVQgT01QX0dFVF9USFJFQURfTElNSVQKKyNkZWZpbmUgRlROX1NFVF9TQ0hFRFVMRSBPTVBfU0VUX1NDSEVEVUxFCisjZGVmaW5lIEZUTl9HRVRfU0NIRURVTEUgT01QX0dFVF9TQ0hFRFVMRQorI2RlZmluZSBGVE5fU0VUX01BWF9BQ1RJVkVfTEVWRUxTIE9NUF9TRVRfTUFYX0FDVElWRV9MRVZFTFMKKyNkZWZpbmUgRlROX0dFVF9NQVhfQUNUSVZFX0xFVkVMUyBPTVBfR0VUX01BWF9BQ1RJVkVfTEVWRUxTCisjZGVmaW5lIEZUTl9HRVRfQUNUSVZFX0xFVkVMIE9NUF9HRVRfQUNUSVZFX0xFVkVMCisjZGVmaW5lIEZUTl9HRVRfTEVWRUwgT01QX0dFVF9MRVZFTAorI2RlZmluZSBGVE5fR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0gT01QX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNCisjZGVmaW5lIEZUTl9HRVRfVEVBTV9TSVpFIE9NUF9HRVRfVEVBTV9TSVpFCisjZGVmaW5lIEZUTl9JTl9GSU5BTCBPTVBfSU5fRklOQUwKKy8vICAjZGVmaW5lIEZUTl9TRVRfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgICBPTVBfU0VUX1BST0NfQklORAorI2RlZmluZSBGVE5fR0VUX1BST0NfQklORCBPTVBfR0VUX1BST0NfQklORAorLy8gICNkZWZpbmUgRlROX0NVUlJfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgIE9NUF9DVVJSX1BST0NfQklORAorI2lmIE9NUF80MF9FTkFCTEVECisjZGVmaW5lIEZUTl9HRVRfTlVNX1RFQU1TIE9NUF9HRVRfTlVNX1RFQU1TCisjZGVmaW5lIEZUTl9HRVRfVEVBTV9OVU0gT01QX0dFVF9URUFNX05VTQorI2VuZGlmCisjZGVmaW5lIEZUTl9JTklUX0xPQ0sgT01QX0lOSVRfTE9DSworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisjZGVmaW5lIEZUTl9JTklUX0xPQ0tfV0lUSF9ISU5UIE9NUF9JTklUX0xPQ0tfV0lUSF9ISU5UCisjZGVmaW5lIEZUTl9JTklUX05FU1RfTE9DS19XSVRIX0hJTlQgT01QX0lOSVRfTkVTVF9MT0NLX1dJVEhfSElOVAorI2VuZGlmCisjZGVmaW5lIEZUTl9ERVNUUk9ZX0xPQ0sgT01QX0RFU1RST1lfTE9DSworI2RlZmluZSBGVE5fU0VUX0xPQ0sgT01QX1NFVF9MT0NLCisjZGVmaW5lIEZUTl9VTlNFVF9MT0NLIE9NUF9VTlNFVF9MT0NLCisjZGVmaW5lIEZUTl9URVNUX0xPQ0sgT01QX1RFU1RfTE9DSworI2RlZmluZSBGVE5fSU5JVF9ORVNUX0xPQ0sgT01QX0lOSVRfTkVTVF9MT0NLCisjZGVmaW5lIEZUTl9ERVNUUk9ZX05FU1RfTE9DSyBPTVBfREVTVFJPWV9ORVNUX0xPQ0sKKyNkZWZpbmUgRlROX1NFVF9ORVNUX0xPQ0sgT01QX1NFVF9ORVNUX0xPQ0sKKyNkZWZpbmUgRlROX1VOU0VUX05FU1RfTE9DSyBPTVBfVU5TRVRfTkVTVF9MT0NLCisjZGVmaW5lIEZUTl9URVNUX05FU1RfTE9DSyBPTVBfVEVTVF9ORVNUX0xPQ0sKKworI2RlZmluZSBGVE5fU0VUX1dBUk5JTkdTX09OIEtNUF9TRVRfV0FSTklOR1NfT04KKyNkZWZpbmUgRlROX1NFVF9XQVJOSU5HU19PRkYgS01QX1NFVF9XQVJOSU5HU19PRkYKKworI2RlZmluZSBGVE5fR0VUX1dUSU1FIE9NUF9HRVRfV1RJTUUKKyNkZWZpbmUgRlROX0dFVF9XVElDSyBPTVBfR0VUX1dUSUNLCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorI2lmIEtNUF9NSUMgfHwgS01QX09TX0RBUldJTiB8fCBkZWZpbmVkKEtNUF9TVFVCKQorI2RlZmluZSBGVE5fR0VUX05VTV9ERVZJQ0VTIE9NUF9HRVRfTlVNX0RFVklDRVMKKyNlbmRpZgorI2RlZmluZSBGVE5fR0VUX0RFRkFVTFRfREVWSUNFIE9NUF9HRVRfREVGQVVMVF9ERVZJQ0UKKyNkZWZpbmUgRlROX1NFVF9ERUZBVUxUX0RFVklDRSBPTVBfU0VUX0RFRkFVTFRfREVWSUNFCisjZGVmaW5lIEZUTl9JU19JTklUSUFMX0RFVklDRSBPTVBfSVNfSU5JVElBTF9ERVZJQ0UKKyNlbmRpZgorCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTiBPTVBfR0VUX0NBTkNFTExBVElPTgorI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTl9TVEFUVVMgS01QX0dFVF9DQU5DRUxMQVRJT05fU1RBVFVTCisjZW5kaWYKKworI2lmIE9NUF80NV9FTkFCTEVECisjZGVmaW5lIEZUTl9HRVRfTUFYX1RBU0tfUFJJT1JJVFkgT01QX0dFVF9NQVhfVEFTS19QUklPUklUWQorI2RlZmluZSBGVE5fR0VUX05VTV9QTEFDRVMgT01QX0dFVF9OVU1fUExBQ0VTCisjZGVmaW5lIEZUTl9HRVRfUExBQ0VfTlVNX1BST0NTIE9NUF9HRVRfUExBQ0VfTlVNX1BST0NTCisjZGVmaW5lIEZUTl9HRVRfUExBQ0VfUFJPQ19JRFMgT01QX0dFVF9QTEFDRV9QUk9DX0lEUworI2RlZmluZSBGVE5fR0VUX1BMQUNFX05VTSBPTVBfR0VUX1BMQUNFX05VTQorI2RlZmluZSBGVE5fR0VUX1BBUlRJVElPTl9OVU1fUExBQ0VTIE9NUF9HRVRfUEFSVElUSU9OX05VTV9QTEFDRVMKKyNkZWZpbmUgRlROX0dFVF9QQVJUSVRJT05fUExBQ0VfTlVNUyBPTVBfR0VUX1BBUlRJVElPTl9QTEFDRV9OVU1TCisjaWZkZWYgS01QX1NUVUIKKyNkZWZpbmUgRlROX0dFVF9JTklUSUFMX0RFVklDRSBPTVBfR0VUX0lOSVRJQUxfREVWSUNFCisjZGVmaW5lIEZUTl9UQVJHRVRfQUxMT0MgT01QX1RBUkdFVF9BTExPQworI2RlZmluZSBGVE5fVEFSR0VUX0ZSRUUgT01QX1RBUkdFVF9GUkVFCisjZGVmaW5lIEZUTl9UQVJHRVRfSVNfUFJFU0VOVCBPTVBfVEFSR0VUX0lTX1BSRVNFTlQKKyNkZWZpbmUgRlROX1RBUkdFVF9NRU1DUFkgT01QX1RBUkdFVF9NRU1DUFkKKyNkZWZpbmUgRlROX1RBUkdFVF9NRU1DUFlfUkVDVCBPTVBfVEFSR0VUX01FTUNQWV9SRUNUCisjZGVmaW5lIEZUTl9UQVJHRVRfQVNTT0NJQVRFX1BUUiBPTVBfVEFSR0VUX0FTU09DSUFURV9QVFIKKyNkZWZpbmUgRlROX1RBUkdFVF9ESVNBU1NPQ0lBVEVfUFRSIE9NUF9UQVJHRVRfRElTQVNTT0NJQVRFX1BUUgorI2VuZGlmCisjZW5kaWYKKworI2VuZGlmIC8qIEtNUF9GVE5fVVBQRVIgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfRlROX0VOVFJJRVMgPT0gS01QX0ZUTl9VQVBQRU5ECisKKyNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkUgS01QX1NFVF9TVEFDS1NJWkVfCisjZGVmaW5lIEZUTl9TRVRfU1RBQ0tTSVpFX1MgS01QX1NFVF9TVEFDS1NJWkVfU18KKyNkZWZpbmUgRlROX0dFVF9TVEFDS1NJWkUgS01QX0dFVF9TVEFDS1NJWkVfCisjZGVmaW5lIEZUTl9HRVRfU1RBQ0tTSVpFX1MgS01QX0dFVF9TVEFDS1NJWkVfU18KKyNkZWZpbmUgRlROX1NFVF9CTE9DS1RJTUUgS01QX1NFVF9CTE9DS1RJTUVfCisjZGVmaW5lIEZUTl9HRVRfQkxPQ0tUSU1FIEtNUF9HRVRfQkxPQ0tUSU1FXworI2RlZmluZSBGVE5fU0VUX0xJQlJBUllfU0VSSUFMIEtNUF9TRVRfTElCUkFSWV9TRVJJQUxfCisjZGVmaW5lIEZUTl9TRVRfTElCUkFSWV9UVVJOQVJPVU5EIEtNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5EXworI2RlZmluZSBGVE5fU0VUX0xJQlJBUllfVEhST1VHSFBVVCBLTVBfU0VUX0xJQlJBUllfVEhST1VHSFBVVF8KKyNkZWZpbmUgRlROX1NFVF9MSUJSQVJZIEtNUF9TRVRfTElCUkFSWV8KKyNkZWZpbmUgRlROX0dFVF9MSUJSQVJZIEtNUF9HRVRfTElCUkFSWV8KKyNkZWZpbmUgRlROX1NFVF9ERUZBVUxUUyBLTVBfU0VUX0RFRkFVTFRTXworI2RlZmluZSBGVE5fU0VUX0RJU1BfTlVNX0JVRkZFUlMgS01QX1NFVF9ESVNQX05VTV9CVUZGRVJTXworI2RlZmluZSBGVE5fU0VUX0FGRklOSVRZIEtNUF9TRVRfQUZGSU5JVFlfCisjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFkgS01QX0dFVF9BRkZJTklUWV8KKyNkZWZpbmUgRlROX0dFVF9BRkZJTklUWV9NQVhfUFJPQyBLTVBfR0VUX0FGRklOSVRZX01BWF9QUk9DXworI2RlZmluZSBGVE5fQ1JFQVRFX0FGRklOSVRZX01BU0sgS01QX0NSRUFURV9BRkZJTklUWV9NQVNLXworI2RlZmluZSBGVE5fREVTVFJPWV9BRkZJTklUWV9NQVNLIEtNUF9ERVNUUk9ZX0FGRklOSVRZX01BU0tfCisjZGVmaW5lIEZUTl9TRVRfQUZGSU5JVFlfTUFTS19QUk9DIEtNUF9TRVRfQUZGSU5JVFlfTUFTS19QUk9DXworI2RlZmluZSBGVE5fVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DIEtNUF9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0NfCisjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFlfTUFTS19QUk9DIEtNUF9HRVRfQUZGSU5JVFlfTUFTS19QUk9DXworCisjZGVmaW5lIEZUTl9NQUxMT0MgS01QX01BTExPQ18KKyNkZWZpbmUgRlROX0FMSUdORURfTUFMTE9DIEtNUF9BTElHTkVEX01BTExPQ18KKyNkZWZpbmUgRlROX0NBTExPQyBLTVBfQ0FMTE9DXworI2RlZmluZSBGVE5fUkVBTExPQyBLTVBfUkVBTExPQ18KKyNkZWZpbmUgRlROX0ZSRUUgS01QX0ZSRUVfCisKKyNkZWZpbmUgRlROX0dFVF9OVU1fS05PV05fVEhSRUFEUyBLTVBfR0VUX05VTV9LTk9XTl9USFJFQURTXworCisjZGVmaW5lIEZUTl9TRVRfTlVNX1RIUkVBRFMgT01QX1NFVF9OVU1fVEhSRUFEU18KKyNkZWZpbmUgRlROX0dFVF9OVU1fVEhSRUFEUyBPTVBfR0VUX05VTV9USFJFQURTXworI2RlZmluZSBGVE5fR0VUX01BWF9USFJFQURTIE9NUF9HRVRfTUFYX1RIUkVBRFNfCisjZGVmaW5lIEZUTl9HRVRfVEhSRUFEX05VTSBPTVBfR0VUX1RIUkVBRF9OVU1fCisjZGVmaW5lIEZUTl9HRVRfTlVNX1BST0NTIE9NUF9HRVRfTlVNX1BST0NTXworI2RlZmluZSBGVE5fU0VUX0RZTkFNSUMgT01QX1NFVF9EWU5BTUlDXworI2RlZmluZSBGVE5fR0VUX0RZTkFNSUMgT01QX0dFVF9EWU5BTUlDXworI2RlZmluZSBGVE5fU0VUX05FU1RFRCBPTVBfU0VUX05FU1RFRF8KKyNkZWZpbmUgRlROX0dFVF9ORVNURUQgT01QX0dFVF9ORVNURURfCisjZGVmaW5lIEZUTl9JTl9QQVJBTExFTCBPTVBfSU5fUEFSQUxMRUxfCisjZGVmaW5lIEZUTl9HRVRfVEhSRUFEX0xJTUlUIE9NUF9HRVRfVEhSRUFEX0xJTUlUXworI2RlZmluZSBGVE5fU0VUX1NDSEVEVUxFIE9NUF9TRVRfU0NIRURVTEVfCisjZGVmaW5lIEZUTl9HRVRfU0NIRURVTEUgT01QX0dFVF9TQ0hFRFVMRV8KKyNkZWZpbmUgRlROX1NFVF9NQVhfQUNUSVZFX0xFVkVMUyBPTVBfU0VUX01BWF9BQ1RJVkVfTEVWRUxTXworI2RlZmluZSBGVE5fR0VUX01BWF9BQ1RJVkVfTEVWRUxTIE9NUF9HRVRfTUFYX0FDVElWRV9MRVZFTFNfCisjZGVmaW5lIEZUTl9HRVRfQUNUSVZFX0xFVkVMIE9NUF9HRVRfQUNUSVZFX0xFVkVMXworI2RlZmluZSBGVE5fR0VUX0xFVkVMIE9NUF9HRVRfTEVWRUxfCisjZGVmaW5lIEZUTl9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTSBPTVBfR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU1fCisjZGVmaW5lIEZUTl9HRVRfVEVBTV9TSVpFIE9NUF9HRVRfVEVBTV9TSVpFXworI2RlZmluZSBGVE5fSU5fRklOQUwgT01QX0lOX0ZJTkFMXworLy8gICNkZWZpbmUgRlROX1NFVF9QUk9DX0JJTkQgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfUFJPQ19CSU5EXworI2RlZmluZSBGVE5fR0VUX1BST0NfQklORCBPTVBfR0VUX1BST0NfQklORF8KKy8vICAjZGVmaW5lIEZUTl9DVVJSX1BST0NfQklORCAgICAgICAgICAgICAgICAgICBPTVBfQ1VSUl9QUk9DX0JJTkRfCisjaWYgT01QXzQwX0VOQUJMRUQKKyNkZWZpbmUgRlROX0dFVF9OVU1fVEVBTVMgT01QX0dFVF9OVU1fVEVBTVNfCisjZGVmaW5lIEZUTl9HRVRfVEVBTV9OVU0gT01QX0dFVF9URUFNX05VTV8KKyNlbmRpZgorI2RlZmluZSBGVE5fSU5JVF9MT0NLIE9NUF9JTklUX0xPQ0tfCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyNkZWZpbmUgRlROX0lOSVRfTE9DS19XSVRIX0hJTlQgT01QX0lOSVRfTE9DS19XSVRIX0hJTlRfCisjZGVmaW5lIEZUTl9JTklUX05FU1RfTE9DS19XSVRIX0hJTlQgT01QX0lOSVRfTkVTVF9MT0NLX1dJVEhfSElOVF8KKyNlbmRpZgorI2RlZmluZSBGVE5fREVTVFJPWV9MT0NLIE9NUF9ERVNUUk9ZX0xPQ0tfCisjZGVmaW5lIEZUTl9TRVRfTE9DSyBPTVBfU0VUX0xPQ0tfCisjZGVmaW5lIEZUTl9VTlNFVF9MT0NLIE9NUF9VTlNFVF9MT0NLXworI2RlZmluZSBGVE5fVEVTVF9MT0NLIE9NUF9URVNUX0xPQ0tfCisjZGVmaW5lIEZUTl9JTklUX05FU1RfTE9DSyBPTVBfSU5JVF9ORVNUX0xPQ0tfCisjZGVmaW5lIEZUTl9ERVNUUk9ZX05FU1RfTE9DSyBPTVBfREVTVFJPWV9ORVNUX0xPQ0tfCisjZGVmaW5lIEZUTl9TRVRfTkVTVF9MT0NLIE9NUF9TRVRfTkVTVF9MT0NLXworI2RlZmluZSBGVE5fVU5TRVRfTkVTVF9MT0NLIE9NUF9VTlNFVF9ORVNUX0xPQ0tfCisjZGVmaW5lIEZUTl9URVNUX05FU1RfTE9DSyBPTVBfVEVTVF9ORVNUX0xPQ0tfCisKKyNkZWZpbmUgRlROX1NFVF9XQVJOSU5HU19PTiBLTVBfU0VUX1dBUk5JTkdTX09OXworI2RlZmluZSBGVE5fU0VUX1dBUk5JTkdTX09GRiBLTVBfU0VUX1dBUk5JTkdTX09GRl8KKworI2RlZmluZSBGVE5fR0VUX1dUSU1FIE9NUF9HRVRfV1RJTUVfCisjZGVmaW5lIEZUTl9HRVRfV1RJQ0sgT01QX0dFVF9XVElDS18KKworI2lmIE9NUF80MF9FTkFCTEVECisjaWYgS01QX01JQyB8fCBLTVBfT1NfREFSV0lOIHx8IGRlZmluZWQoS01QX1NUVUIpCisjZGVmaW5lIEZUTl9HRVRfTlVNX0RFVklDRVMgT01QX0dFVF9OVU1fREVWSUNFU18KKyNlbmRpZgorI2RlZmluZSBGVE5fR0VUX0RFRkFVTFRfREVWSUNFIE9NUF9HRVRfREVGQVVMVF9ERVZJQ0VfCisjZGVmaW5lIEZUTl9TRVRfREVGQVVMVF9ERVZJQ0UgT01QX1NFVF9ERUZBVUxUX0RFVklDRV8KKyNkZWZpbmUgRlROX0lTX0lOSVRJQUxfREVWSUNFIE9NUF9JU19JTklUSUFMX0RFVklDRV8KKyNlbmRpZgorCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTiBPTVBfR0VUX0NBTkNFTExBVElPTl8KKyNkZWZpbmUgRlROX0dFVF9DQU5DRUxMQVRJT05fU1RBVFVTIEtNUF9HRVRfQ0FOQ0VMTEFUSU9OX1NUQVRVU18KKyNlbmRpZgorCisjaWYgT01QXzQ1X0VOQUJMRUQKKyNkZWZpbmUgRlROX0dFVF9NQVhfVEFTS19QUklPUklUWSBPTVBfR0VUX01BWF9UQVNLX1BSSU9SSVRZXworI2RlZmluZSBGVE5fR0VUX05VTV9QTEFDRVMgT01QX0dFVF9OVU1fUExBQ0VTXworI2RlZmluZSBGVE5fR0VUX1BMQUNFX05VTV9QUk9DUyBPTVBfR0VUX1BMQUNFX05VTV9QUk9DU18KKyNkZWZpbmUgRlROX0dFVF9QTEFDRV9QUk9DX0lEUyBPTVBfR0VUX1BMQUNFX1BST0NfSURTXworI2RlZmluZSBGVE5fR0VUX1BMQUNFX05VTSBPTVBfR0VUX1BMQUNFX05VTV8KKyNkZWZpbmUgRlROX0dFVF9QQVJUSVRJT05fTlVNX1BMQUNFUyBPTVBfR0VUX1BBUlRJVElPTl9OVU1fUExBQ0VTXworI2RlZmluZSBGVE5fR0VUX1BBUlRJVElPTl9QTEFDRV9OVU1TIE9NUF9HRVRfUEFSVElUSU9OX1BMQUNFX05VTVNfCisjaWZkZWYgS01QX1NUVUIKKyNkZWZpbmUgRlROX0dFVF9JTklUSUFMX0RFVklDRSBPTVBfR0VUX0lOSVRJQUxfREVWSUNFXworI2RlZmluZSBGVE5fVEFSR0VUX0FMTE9DIE9NUF9UQVJHRVRfQUxMT0NfCisjZGVmaW5lIEZUTl9UQVJHRVRfRlJFRSBPTVBfVEFSR0VUX0ZSRUVfCisjZGVmaW5lIEZUTl9UQVJHRVRfSVNfUFJFU0VOVCBPTVBfVEFSR0VUX0lTX1BSRVNFTlRfCisjZGVmaW5lIEZUTl9UQVJHRVRfTUVNQ1BZIE9NUF9UQVJHRVRfTUVNQ1BZXworI2RlZmluZSBGVE5fVEFSR0VUX01FTUNQWV9SRUNUIE9NUF9UQVJHRVRfTUVNQ1BZX1JFQ1RfCisjZGVmaW5lIEZUTl9UQVJHRVRfQVNTT0NJQVRFX1BUUiBPTVBfVEFSR0VUX0FTU09DSUFURV9QVFJfCisjZGVmaW5lIEZUTl9UQVJHRVRfRElTQVNTT0NJQVRFX1BUUiBPTVBfVEFSR0VUX0RJU0FTU09DSUFURV9QVFJfCisjZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLyogS01QX0ZUTl9VQVBQRU5EICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEdPTVAgQVBJIE5BTUVTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLy8gQWxsIEdPTVBfMS4wIHN5bWJvbHMKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfQVRPTUlDX0VORCBHT01QX2F0b21pY19lbmQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfQVRPTUlDX1NUQVJUIEdPTVBfYXRvbWljX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0JBUlJJRVIgR09NUF9iYXJyaWVyCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX0VORCBHT01QX2NyaXRpY2FsX2VuZAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9DUklUSUNBTF9OQU1FX0VORCBHT01QX2NyaXRpY2FsX25hbWVfZW5kCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX05BTUVfU1RBUlQgR09NUF9jcml0aWNhbF9uYW1lX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX1NUQVJUIEdPTVBfY3JpdGljYWxfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9EWU5BTUlDX05FWFQgR09NUF9sb29wX2R5bmFtaWNfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX0RZTkFNSUNfU1RBUlQgR09NUF9sb29wX2R5bmFtaWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9FTkQgR09NUF9sb29wX2VuZAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX0VORF9OT1dBSVQgR09NUF9sb29wX2VuZF9ub3dhaXQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9HVUlERURfTkVYVCBHT01QX2xvb3BfZ3VpZGVkX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9HVUlERURfU1RBUlQgR09NUF9sb29wX2d1aWRlZF9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfRFlOQU1JQ19ORVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR09NUF9sb29wX29yZGVyZWRfZHluYW1pY19uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9EWU5BTUlDX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHT01QX2xvb3Bfb3JkZXJlZF9keW5hbWljX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9HVUlERURfTkVYVCBHT01QX2xvb3Bfb3JkZXJlZF9ndWlkZWRfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfR1VJREVEX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR09NUF9sb29wX29yZGVyZWRfZ3VpZGVkX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9SVU5USU1FX05FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHT01QX2xvb3Bfb3JkZXJlZF9ydW50aW1lX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1JVTlRJTUVfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEdPTVBfbG9vcF9vcmRlcmVkX3J1bnRpbWVfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1NUQVRJQ19ORVhUIEdPTVBfbG9vcF9vcmRlcmVkX3N0YXRpY19uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9TVEFUSUNfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHT01QX2xvb3Bfb3JkZXJlZF9zdGF0aWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9SVU5USU1FX05FWFQgR09NUF9sb29wX3J1bnRpbWVfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1JVTlRJTUVfU1RBUlQgR09NUF9sb29wX3J1bnRpbWVfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9TVEFUSUNfTkVYVCBHT01QX2xvb3Bfc3RhdGljX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9TVEFUSUNfU1RBUlQgR09NUF9sb29wX3N0YXRpY19zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9PUkRFUkVEX0VORCBHT01QX29yZGVyZWRfZW5kCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX09SREVSRURfU1RBUlQgR09NUF9vcmRlcmVkX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0VORCBHT01QX3BhcmFsbGVsX2VuZAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0RZTkFNSUNfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR09NUF9wYXJhbGxlbF9sb29wX2R5bmFtaWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9HVUlERURfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEdPTVBfcGFyYWxsZWxfbG9vcF9ndWlkZWRfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9SVU5USU1FX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEdPTVBfcGFyYWxsZWxfbG9vcF9ydW50aW1lX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfU1RBVElDX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHT01QX3BhcmFsbGVsX2xvb3Bfc3RhdGljX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NFQ1RJT05TX1NUQVJUIEdPTVBfcGFyYWxsZWxfc2VjdGlvbnNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfU1RBUlQgR09NUF9wYXJhbGxlbF9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkQgR09NUF9zZWN0aW9uc19lbmQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfRU5EX05PV0FJVCBHT01QX3NlY3Rpb25zX2VuZF9ub3dhaXQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfTkVYVCBHT01QX3NlY3Rpb25zX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfU1RBUlQgR09NUF9zZWN0aW9uc19zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfQ09QWV9FTkQgR09NUF9zaW5nbGVfY29weV9lbmQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfU0lOR0xFX0NPUFlfU1RBUlQgR09NUF9zaW5nbGVfY29weV9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfU1RBUlQgR09NUF9zaW5nbGVfc3RhcnQKKworLy8gQWxsIEdPTVBfMi4wIHN5bWJvbHMKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfVEFTSyBHT01QX3Rhc2sKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfVEFTS1dBSVQgR09NUF90YXNrd2FpdAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9EWU5BTUlDX05FWFQgR09NUF9sb29wX3VsbF9keW5hbWljX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfRFlOQU1JQ19TVEFSVCBHT01QX2xvb3BfdWxsX2R5bmFtaWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfR1VJREVEX05FWFQgR09NUF9sb29wX3VsbF9ndWlkZWRfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9HVUlERURfU1RBUlQgR09NUF9sb29wX3VsbF9ndWlkZWRfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9EWU5BTUlDX05FWFQgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEdPTVBfbG9vcF91bGxfb3JkZXJlZF9keW5hbWljX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9EWU5BTUlDX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICBcCisgIEdPTVBfbG9vcF91bGxfb3JkZXJlZF9keW5hbWljX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfR1VJREVEX05FWFQgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHT01QX2xvb3BfdWxsX29yZGVyZWRfZ3VpZGVkX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9HVUlERURfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEdPTVBfbG9vcF91bGxfb3JkZXJlZF9ndWlkZWRfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9SVU5USU1FX05FWFQgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEdPTVBfbG9vcF91bGxfb3JkZXJlZF9ydW50aW1lX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9SVU5USU1FX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICBcCisgIEdPTVBfbG9vcF91bGxfb3JkZXJlZF9ydW50aW1lX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfU1RBVElDX05FWFQgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHT01QX2xvb3BfdWxsX29yZGVyZWRfc3RhdGljX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9TVEFUSUNfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEdPTVBfbG9vcF91bGxfb3JkZXJlZF9zdGF0aWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfUlVOVElNRV9ORVhUIEdPTVBfbG9vcF91bGxfcnVudGltZV9uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1JVTlRJTUVfU1RBUlQgR09NUF9sb29wX3VsbF9ydW50aW1lX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1NUQVRJQ19ORVhUIEdPTVBfbG9vcF91bGxfc3RhdGljX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfU1RBVElDX1NUQVJUIEdPTVBfbG9vcF91bGxfc3RhdGljX3N0YXJ0CisKKy8vIEFsbCBHT01QXzMuMCBzeW1ib2xzCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1RBU0tZSUVMRCBHT01QX3Rhc2t5aWVsZAorCisvLyBBbGwgR09NUF80LjAgc3ltYm9scworLy8gVE9ETzogQXMgb2YgMjAxMy0xMC0xNCwgbm9uZSBvZiB0aGUgR09NUF80LjAgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBpbgorLy8gbGlib21wCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0JBUlJJRVJfQ0FOQ0VMIEdPTVBfYmFycmllcl9jYW5jZWwKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfQ0FOQ0VMIEdPTVBfY2FuY2VsCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0NBTkNFTExBVElPTl9QT0lOVCBHT01QX2NhbmNlbGxhdGlvbl9wb2ludAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX0VORF9DQU5DRUwgR09NUF9sb29wX2VuZF9jYW5jZWwKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9EWU5BTUlDIEdPTVBfcGFyYWxsZWxfbG9vcF9keW5hbWljCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfR1VJREVEIEdPTVBfcGFyYWxsZWxfbG9vcF9ndWlkZWQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9SVU5USU1FIEdPTVBfcGFyYWxsZWxfbG9vcF9ydW50aW1lCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfU1RBVElDIEdPTVBfcGFyYWxsZWxfbG9vcF9zdGF0aWMKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfU0VDVElPTlMgR09NUF9wYXJhbGxlbF9zZWN0aW9ucworI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTCBHT01QX3BhcmFsbGVsCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORF9DQU5DRUwgR09NUF9zZWN0aW9uc19lbmRfY2FuY2VsCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1RBU0tHUk9VUF9TVEFSVCBHT01QX3Rhc2tncm91cF9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9UQVNLR1JPVVBfRU5EIEdPTVBfdGFza2dyb3VwX2VuZAorLyogVGFyZ2V0IGZ1bmN0aW9ucyBzaG91bGQgYmUgdGFrZW4gY2FyZSBvZiBieSBsaWJvZmZsb2FkICovCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVCBHT01QX3RhcmdldAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9UQVJHRVRfREFUQSBHT01QX3RhcmdldF9kYXRhCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVF9FTkRfREFUQSBHT01QX3RhcmdldF9lbmRfZGF0YQorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9UQVJHRVRfVVBEQVRFIEdPTVBfdGFyZ2V0X3VwZGF0ZQorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9URUFNUyBHT01QX3RlYW1zCisKKyNpZmRlZiBLTVBfVVNFX1ZFUlNJT05fU1lNQk9MUworI2RlZmluZSB4c3RyKHgpIHN0cih4KQorI2RlZmluZSBzdHIoeCkgI3gKKworLy8gSWYgTGludXgsIHhleHBhbmQgcHJlcGVuZHMgX19rbXBfYXBpXyB0byB0aGUgcmVhbCBBUEkgbmFtZQorI2RlZmluZSB4ZXhwYW5kKGFwaV9uYW1lKSBleHBhbmQoYXBpX25hbWUpCisjZGVmaW5lIGV4cGFuZChhcGlfbmFtZSkgX19rbXBfYXBpXyMjYXBpX25hbWUKKworI2RlZmluZSB4YWxpYXNpZnkoYXBpX25hbWUsIHZlcikgYWxpYXNpZnkoYXBpX25hbWUsIHZlcikKKyNkZWZpbmUgYWxpYXNpZnkoYXBpX25hbWUsIHZlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fdHlwZW9mX18oX19rbXBfYXBpXyMjYXBpX25hbWUpIF9fa21wX2FwaV8jI2FwaV9uYW1lIyNfIyN2ZXIjI19hbGlhcyAgICAgICAgXAorICAgICAgX19hdHRyaWJ1dGVfXygoYWxpYXMoeHN0cihfX2ttcF9hcGlfIyNhcGlfbmFtZSkpKSkKKworI2RlZmluZSB4dmVyc2lvbmlmeShhcGlfbmFtZSwgdmVyc2lvbl9udW0sIHZlcnNpb25fc3RyKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdmVyc2lvbmlmeShhcGlfbmFtZSwgdmVyc2lvbl9udW0sIHZlcnNpb25fc3RyLCAiVkVSU0lPTiIpCisjZGVmaW5lIHZlcnNpb25pZnkoYXBpX25hbWUsIHZlcnNpb25fbnVtLCB2ZXJzaW9uX3N0ciwgZGVmYXVsdF92ZXIpICAgICAgICAgICAgXAorICBfX2FzbV9fKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIuc3ltdmVyICIgeHN0cihfX2ttcF9hcGlfIyNhcGlfbmFtZSMjXyMjdmVyc2lvbl9udW0jI19hbGlhcykgIiwiIHhzdHIoICBcCisgICAgICAgICAgYXBpX25hbWUpICJAIiB2ZXJzaW9uX3N0ciAiXG5cdCIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2FzbV9fKCIuc3ltdmVyICIgeHN0cihfX2ttcF9hcGlfIyNhcGlfbmFtZSkgIiwiIHhzdHIoICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGFwaV9uYW1lKSAiQEAiIGRlZmF1bHRfdmVyICJcblx0IikKKworI2Vsc2UgLy8gS01QX1VTRV9WRVJTSU9OX1NZTUJPTFMKKyNkZWZpbmUgeHN0cih4KSAvKiBOb3RoaW5nICovCisjZGVmaW5lIHN0cih4KSAvKiBOb3RoaW5nICovCisKKy8vIGlmIFdpbmRvd3Mgb3IgTWFjLCB4ZXhwYW5kIGRvZXMgbm8gbmFtZSB0cmFuc2Zvcm1hdGlvbgorI2RlZmluZSB4ZXhwYW5kKGFwaV9uYW1lKSBleHBhbmQoYXBpX25hbWUpCisjZGVmaW5lIGV4cGFuZChhcGlfbmFtZSkgYXBpX25hbWUKKworI2RlZmluZSB4YWxpYXNpZnkoYXBpX25hbWUsIHZlcikgLyogTm90aGluZyAqLworI2RlZmluZSBhbGlhc2lmeShhcGlfbmFtZSwgdmVyKSAvKiBOb3RoaW5nICovCisKKyNkZWZpbmUgeHZlcnNpb25pZnkoYXBpX25hbWUsIHZlcnNpb25fbnVtLCB2ZXJzaW9uX3N0cikgLyogTm90aGluZyAqLworI2RlZmluZSB2ZXJzaW9uaWZ5KGFwaV9uYW1lLCB2ZXJzaW9uX251bSwgdmVyc2lvbl9zdHIsICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBkZWZhdWx0X3ZlcikgLyogTm90aGluZyAqLworCisjZW5kaWYgLy8gS01QX1VTRV9WRVJTSU9OX1NZTUJPTFMKKworI2VuZGlmIC8qIEtNUF9GVE5fT1NfSCAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2Z0bl9zdGRjYWxsLmNwcCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9mdG5fc3RkY2FsbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc0NDFiNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9mdG5fc3RkY2FsbC5jcHAKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIGttcF9mdG5fc3RkY2FsbC5jcHAgLS0gRm9ydHJhbiBfX3N0ZGNhbGwgbGlua2FnZSBzdXBwb3J0IGZvciBPcGVuTVAuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKworLy8gTm90ZTogVGhpcyBzdHJpbmcgaXMgbm90IHByaW50ZWQgd2hlbiBLTVBfVkVSU0lPTj0xLgorY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2Z0bnN0ZGNhbGxbXSA9CisgICAgS01QX1ZFUlNJT05fUFJFRklYICJGb3J0cmFuIF9fc3RkY2FsbCBPTVAgc3VwcG9ydDogIgorI2lmZGVmIFVTRV9GVE5fU1REQ0FMTAorICAgICAgICAgICAgICAgICAgICAgICAieWVzIjsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICJubyI7CisjZW5kaWYKKworI2lmZGVmIFVTRV9GVE5fU1REQ0FMTAorCisjZGVmaW5lIEZUTl9TVERDQUxMIEtNUF9TVERDQUxMCisjZGVmaW5lIEtNUF9GVE5fRU5UUklFUyBVU0VfRlROX1NURENBTEwKKworI2luY2x1ZGUgImttcF9mdG5fZW50cnkuaCIKKyNpbmNsdWRlICJrbXBfZnRuX29zLmgiCisKKyNlbmRpZiAvKiBVU0VfRlROX1NURENBTEwgKi8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9nbG9iYWwuY3BwIGIvZmluYWwvcnVudGltZS9zcmMva21wX2dsb2JhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVlMGFjYgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9nbG9iYWwuY3BwCkBAIC0wLDAgKzEsNTMxIEBACisvKgorICoga21wX2dsb2JhbC5jcHAgLS0gS1BUUyBnbG9iYWwgdmFyaWFibGVzIGZvciBydW50aW1lIHN1cHBvcnQgbGlicmFyeQorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2FmZmluaXR5LmgiCisKK2ttcF9rZXlfdCBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5OworCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAora21wX2NwdWluZm9fdCBfX2ttcF9jcHVpbmZvID0gezB9OyAvLyBOb3QgaW5pdGlhbGl6ZWQKKyNlbmRpZgorCisjaWYgS01QX1NUQVRTX0VOQUJMRUQKKyNpbmNsdWRlICJrbXBfc3RhdHMuaCIKKy8vIGxvY2sgZm9yIG1vZGlmeWluZyB0aGUgZ2xvYmFsIF9fa21wX3N0YXRzX2xpc3QKK2ttcF90YXNfbG9ja190IF9fa21wX3N0YXRzX2xvY2s7CisKKy8vIGdsb2JhbCBsaXN0IG9mIHBlciB0aHJlYWQgc3RhdHMsIHRoZSBoZWFkIGlzIGEgc2VudGluZWwgbm9kZSB3aGljaAorLy8gYWNjdW11bGF0ZXMgYWxsIHN0YXRzIHByb2R1Y2VkIGJlZm9yZSBfX2ttcF9jcmVhdGVfd29ya2VyIGlzIGNhbGxlZC4KK2ttcF9zdGF0c19saXN0ICpfX2ttcF9zdGF0c19saXN0OworCisvLyB0aHJlYWQgbG9jYWwgcG9pbnRlciB0byBzdGF0cyBub2RlIHdpdGhpbiBsaXN0CitfX3RocmVhZCBrbXBfc3RhdHNfbGlzdCAqX19rbXBfc3RhdHNfdGhyZWFkX3B0ciA9IE5VTEw7CisKKy8vIGdpdmVzIHJlZmVyZW5jZSB0aWNrIGZvciBhbGwgZXZlbnRzIChjb25zaWRlcmVkIHRoZSAwIHRpY2spCit0c2NfdGlja19jb3VudCBfX2ttcF9zdGF0c19zdGFydF90aW1lOworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBJTklUSUFMSVpBVElPTiBWQVJJQUJMRVMgKi8KKy8qIHRoZXkgYXJlIHN5bmNyb25pemVkIHRvIHdyaXRlIGR1cmluZyBpbml0LCBidXQgcmVhZCBhbnl0aW1lICovCit2b2xhdGlsZSBpbnQgX19rbXBfaW5pdF9zZXJpYWwgPSBGQUxTRTsKK3ZvbGF0aWxlIGludCBfX2ttcF9pbml0X2d0aWQgPSBGQUxTRTsKK3ZvbGF0aWxlIGludCBfX2ttcF9pbml0X2NvbW1vbiA9IEZBTFNFOwordm9sYXRpbGUgaW50IF9fa21wX2luaXRfbWlkZGxlID0gRkFMU0U7Cit2b2xhdGlsZSBpbnQgX19rbXBfaW5pdF9wYXJhbGxlbCA9IEZBTFNFOworI2lmIEtNUF9VU0VfTU9OSVRPUgordm9sYXRpbGUgaW50IF9fa21wX2luaXRfbW9uaXRvciA9CisgICAgMDsgLyogMSAtIGxhdW5jaGVkLCAyIC0gYWN0dWFsbHkgc3RhcnRlZCAoV2luZG93cyogT1Mgb25seSkgKi8KKyNlbmRpZgordm9sYXRpbGUgaW50IF9fa21wX2luaXRfdXNlcl9sb2NrcyA9IEZBTFNFOworCisvKiBsaXN0IG9mIGFkZHJlc3Mgb2YgYWxsb2NhdGVkIGNhY2hlcyBmb3IgY29tbW9ucyAqLwora21wX2NhY2hlZF9hZGRyX3QgKl9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdCA9IE5VTEw7CisKK2ludCBfX2ttcF9pbml0X2NvdW50ZXIgPSAwOworaW50IF9fa21wX3Jvb3RfY291bnRlciA9IDA7CitpbnQgX19rbXBfdmVyc2lvbiA9IDA7CisKK3ZvbGF0aWxlIGttcF91aW50MzIgX19rbXBfdGVhbV9jb3VudGVyID0gMDsKK3ZvbGF0aWxlIGttcF91aW50MzIgX19rbXBfdGFza19jb3VudGVyID0gMDsKKwordW5zaWduZWQgaW50IF9fa21wX2luaXRfd2FpdCA9CisgICAgS01QX0RFRkFVTFRfSU5JVF9XQUlUOyAvKiBpbml0aWFsIG51bWJlciBvZiBzcGluLXRlc3RzICAgKi8KK3Vuc2lnbmVkIGludCBfX2ttcF9uZXh0X3dhaXQgPQorICAgIEtNUF9ERUZBVUxUX05FWFRfV0FJVDsgLyogc3VzZXF1ZW50IG51bWJlciBvZiBzcGluLXRlc3RzICovCisKK3NpemVfdCBfX2ttcF9zdGtzaXplID0gS01QX0RFRkFVTFRfU1RLU0laRTsKKyNpZiBLTVBfVVNFX01PTklUT1IKK3NpemVfdCBfX2ttcF9tb25pdG9yX3N0a3NpemUgPSAwOyAvLyBhdXRvIGFkanVzdAorI2VuZGlmCitzaXplX3QgX19rbXBfc3Rrb2Zmc2V0ID0gS01QX0RFRkFVTFRfU1RLT0ZGU0VUOworaW50IF9fa21wX3N0a3BhZGRpbmcgPSBLTVBfTUlOX1NUS1BBRERJTkc7CisKK3NpemVfdCBfX2ttcF9tYWxsb2NfcG9vbF9pbmNyID0gS01QX0RFRkFVTFRfTUFMTE9DX1BPT0xfSU5DUjsKKworLy8gQmFycmllciBtZXRob2QgZGVmYXVsdHMsIHNldHRpbmdzLCBhbmQgc3RyaW5ncy4KKy8vIGJyYW5jaCBmYWN0b3IgPSAyXmJyYW5jaF9iaXRzIChvbmx5IHJlbGV2YW50IGZvciB0cmVlICYgaHlwZXIgYmFycmllciB0eXBlcykKKyNpZiBLTVBfQVJDSF9YODZfNjQKK2ttcF91aW50MzIgX19rbXBfYmFycmllcl9nYXRoZXJfYmJfZGZsdCA9IDI7CisvKiBicmFuY2hfZmFjdG9yID0gNCAqLyAvKiBoeXBlcjI6IEM3ODk4MCAqLwora21wX3VpbnQzMiBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYmJfZGZsdCA9IDI7CisvKiBicmFuY2hfZmFjdG9yID0gNCAqLyAvKiBoeXBlcjI6IEM3ODk4MCAqLworI2Vsc2UKK2ttcF91aW50MzIgX19rbXBfYmFycmllcl9nYXRoZXJfYmJfZGZsdCA9IDI7CisvKiBicmFuY2hfZmFjdG9yID0gNCAqLyAvKiBjb21tdW5pY2F0aW9uIGluIGNvcmUgZm9yIE1JQyAqLwora21wX3VpbnQzMiBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYmJfZGZsdCA9IDI7CisvKiBicmFuY2hfZmFjdG9yID0gNCAqLyAvKiBjb21tdW5pY2F0aW9uIGluIGNvcmUgZm9yIE1JQyAqLworI2VuZGlmIC8vIEtNUF9BUkNIX1g4Nl82NAorI2lmIEtNUF9BUkNIX1g4Nl82NAora21wX2Jhcl9wYXRfZSBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXRfZGZsdCA9IGJwX2h5cGVyX2JhcjsgLyogaHlwZXIyOiBDNzg5ODAgKi8KK2ttcF9iYXJfcGF0X2UgX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdF9kZmx0ID0KKyAgICBicF9oeXBlcl9iYXI7IC8qIGh5cGVyMjogQzc4OTgwICovCisjZWxzZQora21wX2Jhcl9wYXRfZSBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXRfZGZsdCA9IGJwX2xpbmVhcl9iYXI7CitrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXRfZGZsdCA9IGJwX2xpbmVhcl9iYXI7CisjZW5kaWYKK2ttcF91aW50MzIgX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHNbYnNfbGFzdF9iYXJyaWVyXSA9IHswfTsKK2ttcF91aW50MzIgX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzW2JzX2xhc3RfYmFycmllcl0gPSB7MH07CitrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm5bYnNfbGFzdF9iYXJyaWVyXSA9IHticF9saW5lYXJfYmFyfTsKK2ttcF9iYXJfcGF0X2UgX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm5bYnNfbGFzdF9iYXJyaWVyXSA9IHticF9saW5lYXJfYmFyfTsKK2NoYXIgY29uc3QgKl9fa21wX2JhcnJpZXJfYnJhbmNoX2JpdF9lbnZfbmFtZVtic19sYXN0X2JhcnJpZXJdID0geworICAgICJLTVBfUExBSU5fQkFSUklFUiIsICJLTVBfRk9SS0pPSU5fQkFSUklFUiIKKyNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICwKKyAgICAiS01QX1JFRFVDVElPTl9CQVJSSUVSIgorI2VuZGlmIC8vIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCit9OworY2hhciBjb25zdCAqX19rbXBfYmFycmllcl9wYXR0ZXJuX2Vudl9uYW1lW2JzX2xhc3RfYmFycmllcl0gPSB7CisgICAgIktNUF9QTEFJTl9CQVJSSUVSX1BBVFRFUk4iLCAiS01QX0ZPUktKT0lOX0JBUlJJRVJfUEFUVEVSTiIKKyNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICwKKyAgICAiS01QX1JFRFVDVElPTl9CQVJSSUVSX1BBVFRFUk4iCisjZW5kaWYgLy8gS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKK307CitjaGFyIGNvbnN0ICpfX2ttcF9iYXJyaWVyX3R5cGVfbmFtZVtic19sYXN0X2JhcnJpZXJdID0geyJwbGFpbiIsICJmb3Jram9pbiIKKyNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWR1Y3Rpb24iCisjZW5kaWYgLy8gS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKK307CitjaGFyIGNvbnN0ICpfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZVticF9sYXN0X2Jhcl0gPSB7ImxpbmVhciIsICJ0cmVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHlwZXIiLCAiaGllcmFyY2hpY2FsIn07CisKK2ludCBfX2ttcF9hbGxUaHJlYWRzU3BlY2lmaWVkID0gMDsKK3NpemVfdCBfX2ttcF9hbGlnbl9hbGxvYyA9IENBQ0hFX0xJTkU7CisKKworaW50IF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID0ga21wX3dhcm5pbmdzX2xvdzsKK2ludCBfX2ttcF9yZXNlcnZlX3dhcm4gPSAwOworaW50IF9fa21wX3hwcm9jID0gMDsKK2ludCBfX2ttcF9hdmFpbF9wcm9jID0gMDsKK3NpemVfdCBfX2ttcF9zeXNfbWluX3N0a3NpemUgPSBLTVBfTUlOX1NUS1NJWkU7CitpbnQgX19rbXBfc3lzX21heF9udGggPSBLTVBfTUFYX05USDsKK2ludCBfX2ttcF9tYXhfbnRoID0gMDsKK2ludCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ID0gMDsKK2ludCBfX2ttcF9kZmx0X3RlYW1fbnRoID0gMDsKK2ludCBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViID0gMDsKK2ludCBfX2ttcF90cF9jYXBhY2l0eSA9IDA7CitpbnQgX19rbXBfdHBfY2FjaGVkID0gMDsKK2ludCBfX2ttcF9kZmx0X25lc3RlZCA9IEZBTFNFOworaW50IF9fa21wX2Rpc3BhdGNoX251bV9idWZmZXJzID0gS01QX0RGTFRfRElTUF9OVU1fQlVGRjsKK2ludCBfX2ttcF9kZmx0X21heF9hY3RpdmVfbGV2ZWxzID0KKyAgICBLTVBfTUFYX0FDVElWRV9MRVZFTFNfTElNSVQ7IC8qIG1heF9hY3RpdmVfbGV2ZWxzIGxpbWl0ICovCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKK2ludCBfX2ttcF9ob3RfdGVhbXNfbW9kZSA9IDA7IC8qIDAgLSBmcmVlIGV4dHJhIHRocmVhZHMgd2hlbiByZWR1Y2VkICovCisvKiAxIC0ga2VlcCBleHRyYSB0aHJlYWRzIHdoZW4gcmVkdWNlZCAqLworaW50IF9fa21wX2hvdF90ZWFtc19tYXhfbGV2ZWwgPSAxOyAvKiBuZXN0aW5nIGxldmVsIG9mIGhvdCB0ZWFtcyAqLworI2VuZGlmCitlbnVtIGxpYnJhcnlfdHlwZSBfX2ttcF9saWJyYXJ5ID0gbGlicmFyeV9ub25lOworZW51bSBzY2hlZF90eXBlIF9fa21wX3NjaGVkID0KKyAgICBrbXBfc2NoX2RlZmF1bHQ7IC8qIHNjaGVkdWxpbmcgbWV0aG9kIGZvciBydW50aW1lIHNjaGVkdWxpbmcgKi8KK2VudW0gc2NoZWRfdHlwZSBfX2ttcF9zdGF0aWMgPQorICAgIGttcF9zY2hfc3RhdGljX2dyZWVkeTsgLyogZGVmYXVsdCBzdGF0aWMgc2NoZWR1bGluZyBtZXRob2QgKi8KK2VudW0gc2NoZWRfdHlwZSBfX2ttcF9ndWlkZWQgPQorICAgIGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkOyAvKiBkZWZhdWx0IGd1aWRlZCBzY2hlZHVsaW5nIG1ldGhvZCAqLworZW51bSBzY2hlZF90eXBlIF9fa21wX2F1dG8gPQorICAgIGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZDsgLyogZGVmYXVsdCBhdXRvIHNjaGVkdWxpbmcgbWV0aG9kICovCitpbnQgX19rbXBfZGZsdF9ibG9ja3RpbWUgPSBLTVBfREVGQVVMVF9CTE9DS1RJTUU7CisjaWYgS01QX1VTRV9NT05JVE9SCitpbnQgX19rbXBfbW9uaXRvcl93YWtldXBzID0gS01QX01JTl9NT05JVE9SX1dBS0VVUFM7CitpbnQgX19rbXBfYnRfaW50ZXJ2YWxzID0gS01QX0lOVEVSVkFMU19GUk9NX0JMT0NLVElNRShLTVBfREVGQVVMVF9CTE9DS1RJTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTUlOX01PTklUT1JfV0FLRVVQUyk7CisjZW5kaWYKKyNpZmRlZiBLTVBfQURKVVNUX0JMT0NLVElNRQoraW50IF9fa21wX3plcm9fYnQgPSBGQUxTRTsKKyNlbmRpZiAvKiBLTVBfQURKVVNUX0JMT0NLVElNRSAqLworI2lmZGVmIEtNUF9ERkxUX05USF9DT1JFUworaW50IF9fa21wX25jb3JlcyA9IDA7CisjZW5kaWYKK2ludCBfX2ttcF9jaHVuayA9IDA7CitpbnQgX19rbXBfYWJvcnRfZGVsYXkgPSAwOworI2lmIEtNUF9PU19MSU5VWCAmJiBkZWZpbmVkKEtNUF9UREFUQV9HVElEKQoraW50IF9fa21wX2d0aWRfbW9kZSA9IDM7IC8qIHVzZSBfX2RlY2xzcGVjKHRocmVhZCkgVExTIHRvIHN0b3JlIGd0aWQgKi8KK2ludCBfX2ttcF9hZGp1c3RfZ3RpZF9tb2RlID0gRkFMU0U7CisjZWxpZiBLTVBfT1NfV0lORE9XUworaW50IF9fa21wX2d0aWRfbW9kZSA9IDI7IC8qIHVzZSBUTFMgZnVuY3Rpb25zIHRvIHN0b3JlIGd0aWQgKi8KK2ludCBfX2ttcF9hZGp1c3RfZ3RpZF9tb2RlID0gRkFMU0U7CisjZWxzZQoraW50IF9fa21wX2d0aWRfbW9kZSA9IDA7IC8qIHNlbGVjdCBtZXRob2QgdG8gZ2V0IGd0aWQgYmFzZWQgb24gI3RocmVhZHMgKi8KK2ludCBfX2ttcF9hZGp1c3RfZ3RpZF9tb2RlID0gVFJVRTsKKyNlbmRpZiAvKiBLTVBfT1NfTElOVVggJiYgZGVmaW5lZChLTVBfVERBVEFfR1RJRCkgKi8KKyNpZmRlZiBLTVBfVERBVEFfR1RJRAorI2lmIEtNUF9PU19XSU5ET1dTCitfX2RlY2xzcGVjKHRocmVhZCkgaW50IF9fa21wX2d0aWQgPSBLTVBfR1RJRF9ETkU7CisjZWxzZQorX190aHJlYWQgaW50IF9fa21wX2d0aWQgPSBLTVBfR1RJRF9ETkU7CisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgLSB3b3JrYXJvdW5kIGJlY2F1c2UgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgICAgXAorICAgICAgICAgIGNvbXBpbGVyIDIwMTEwMzE2IGRvZXNuJ3QgYWNjZXB0IF9fZGVjbHNwZWMgKi8KKyNlbmRpZiAvKiBLTVBfVERBVEFfR1RJRCAqLworaW50IF9fa21wX3Rsc19ndGlkX21pbiA9IElOVF9NQVg7CitpbnQgX19rbXBfZm9yZWlnbl90cCA9IFRSVUU7CisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAoraW50IF9fa21wX2luaGVyaXRfZnBfY29udHJvbCA9IFRSVUU7CitrbXBfaW50MTYgX19rbXBfaW5pdF94ODdfZnB1X2NvbnRyb2xfd29yZCA9IDA7CitrbXBfdWludDMyIF9fa21wX2luaXRfbXhjc3IgPSAwOworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKK2RvdWJsZSBfX2ttcF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwgPSAxLjA7CisjZW5kaWYgLyogVVNFX0xPQURfQkFMQU5DRSAqLworCitrbXBfbmVzdGVkX250aHJlYWRzX3QgX19rbXBfbmVzdGVkX250aCA9IHtOVUxMLCAwLCAwfTsKKworI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKwora21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zX3QgX19rbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXMgPSB7CisgICAgMSwgMTAyNH07IC8vIFRPRE86IHR1bmUgaXQhCisKKyNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKK2NoYXIgKl9fa21wX3NwZWN1bGF0aXZlX3N0YXRzZmlsZSA9ICItIjsKKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworCisjaWYgT01QXzQwX0VOQUJMRUQKK2ludCBfX2ttcF9kaXNwbGF5X2VudiA9IEZBTFNFOworaW50IF9fa21wX2Rpc3BsYXlfZW52X3ZlcmJvc2UgPSBGQUxTRTsKK2ludCBfX2ttcF9vbXBfY2FuY2VsbGF0aW9uID0gRkFMU0U7CisjZW5kaWYKKworLyogbWFwIE9NUCAzLjAgc2NoZWR1bGUgdHlwZXMgd2l0aCBvdXIgaW50ZXJuYWwgc2NoZWR1bGUgdHlwZXMgKi8KK2VudW0gc2NoZWRfdHlwZSBfX2ttcF9zY2hfbWFwW2ttcF9zY2hlZF91cHBlciAtIGttcF9zY2hlZF9sb3dlcl9leHQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3NjaGVkX3VwcGVyX3N0ZCAtIGttcF9zY2hlZF9sb3dlciAtIDJdID0geworICAgIGttcF9zY2hfc3RhdGljX2NodW5rZWQsIC8vID09PiBrbXBfc2NoZWRfc3RhdGljICAgICAgICAgICAgPSAxCisgICAga21wX3NjaF9keW5hbWljX2NodW5rZWQsIC8vID09PiBrbXBfc2NoZWRfZHluYW1pYyAgICAgICAgICAgPSAyCisgICAga21wX3NjaF9ndWlkZWRfY2h1bmtlZCwgLy8gPT0+IGttcF9zY2hlZF9ndWlkZWQgICAgICAgICAgICA9IDMKKyAgICBrbXBfc2NoX2F1dG8sIC8vID09PiBrbXBfc2NoZWRfYXV0byAgICAgICAgICAgICAgPSA0CisgICAga21wX3NjaF90cmFwZXpvaWRhbCAvLyA9PT4ga21wX3NjaGVkX3RyYXBlem9pZGFsICAgICAgID0gMTAxCisgICAgLy8gd2lsbCBsaWtlbHkgbm90IGJlIHVzZWQsIGludHJvZHVjZWQgaGVyZSBqdXN0IHRvIGRlYnVnIHRoZSBjb2RlCisgICAgLy8gb2YgcHVibGljIGludGVsIGV4dGVuc2lvbiBzY2hlZHVsZXMKK307CisKKyNpZiBLTVBfT1NfTElOVVgKK2VudW0gY2xvY2tfZnVuY3Rpb25fdHlwZSBfX2ttcF9jbG9ja19mdW5jdGlvbjsKK2ludCBfX2ttcF9jbG9ja19mdW5jdGlvbl9wYXJhbTsKKyNlbmRpZiAvKiBLTVBfT1NfTElOVVggKi8KKworI2lmIEtNUF9NSUNfU1VQUE9SVEVECitlbnVtIG1pY190eXBlIF9fa21wX21pY190eXBlID0gbm9uX21pYzsKKyNlbmRpZgorCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorCitLTVBBZmZpbml0eSAqX19rbXBfYWZmaW5pdHlfZGlzcGF0Y2ggPSBOVUxMOworCisjaWYgS01QX1VTRV9IV0xPQworaW50IF9fa21wX2h3bG9jX2Vycm9yID0gRkFMU0U7Citod2xvY190b3BvbG9neV90IF9fa21wX2h3bG9jX3RvcG9sb2d5ID0gTlVMTDsKKyNlbmRpZgorCisjaWYgS01QX09TX1dJTkRPV1MKKyNpZiBLTVBfR1JPVVBfQUZGSU5JVFkKK2ludCBfX2ttcF9udW1fcHJvY19ncm91cHMgPSAxOworI2VuZGlmIC8qIEtNUF9HUk9VUF9BRkZJTklUWSAqLwora21wX0dldEFjdGl2ZVByb2Nlc3NvckNvdW50X3QgX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnQgPSBOVUxMOwora21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnRfdCBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JHcm91cENvdW50ID0gTlVMTDsKK2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5X3QgX19rbXBfR2V0VGhyZWFkR3JvdXBBZmZpbml0eSA9IE5VTEw7CitrbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eV90IF9fa21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHkgPSBOVUxMOworI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisKK3NpemVfdCBfX2ttcF9hZmZpbl9tYXNrX3NpemUgPSAwOworZW51bSBhZmZpbml0eV90eXBlIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9kZWZhdWx0OworZW51bSBhZmZpbml0eV9ncmFuIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2RlZmF1bHQ7CitpbnQgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAtMTsKK2ludCBfX2ttcF9hZmZpbml0eV9kdXBzID0gVFJVRTsKK2VudW0gYWZmaW5pdHlfdG9wX21ldGhvZCBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0KKyAgICBhZmZpbml0eV90b3BfbWV0aG9kX2RlZmF1bHQ7CitpbnQgX19rbXBfYWZmaW5pdHlfY29tcGFjdCA9IDA7CitpbnQgX19rbXBfYWZmaW5pdHlfb2Zmc2V0ID0gMDsKK2ludCBfX2ttcF9hZmZpbml0eV92ZXJib3NlID0gRkFMU0U7CitpbnQgX19rbXBfYWZmaW5pdHlfd2FybmluZ3MgPSBUUlVFOworaW50IF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzayA9IGFmZmluaXR5X3Jlc3BlY3RfbWFza19kZWZhdWx0OworY2hhciAqX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QgPSBOVUxMOwora21wX2FmZmluX21hc2tfdCAqX19rbXBfYWZmaW5pdHlfbWFza3MgPSBOVUxMOwordW5zaWduZWQgX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzID0gMDsKKworY2hhciBjb25zdCAqX19rbXBfY3B1aW5mb19maWxlID0gTlVMTDsKKworI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworI2lmIE9NUF80MF9FTkFCTEVECitrbXBfbmVzdGVkX3Byb2NfYmluZF90IF9fa21wX25lc3RlZF9wcm9jX2JpbmQgPSB7TlVMTCwgMCwgMH07CitpbnQgX19rbXBfYWZmaW5pdHlfbnVtX3BsYWNlcyA9IDA7CisjZW5kaWYKKwora21wX2h3c19pdGVtX3QgX19rbXBfaHdzX3NvY2tldCA9IHswLCAwfTsKK2ttcF9od3NfaXRlbV90IF9fa21wX2h3c19ub2RlID0gezAsIDB9Owora21wX2h3c19pdGVtX3QgX19rbXBfaHdzX3RpbGUgPSB7MCwgMH07CitrbXBfaHdzX2l0ZW1fdCBfX2ttcF9od3NfY29yZSA9IHswLCAwfTsKK2ttcF9od3NfaXRlbV90IF9fa21wX2h3c19wcm9jID0gezAsIDB9OworaW50IF9fa21wX2h3c19yZXF1ZXN0ZWQgPSAwOworaW50IF9fa21wX2h3c19hYnNfZmxhZyA9IDA7IC8vIGFic29sdXRlIG9yIHBlci1pdGVtIG51bWJlciByZXF1ZXN0ZWQKKworI2lmIE9NUF80MF9FTkFCTEVECitrbXBfaW50MzIgX19rbXBfZGVmYXVsdF9kZXZpY2UgPSAwOworI2VuZGlmCisKK2ttcF90YXNraW5nX21vZGVfdCBfX2ttcF90YXNraW5nX21vZGUgPSB0c2ttX3Rhc2tfdGVhbXM7CisjaWYgT01QXzQ1X0VOQUJMRUQKK2ttcF9pbnQzMiBfX2ttcF9tYXhfdGFza19wcmlvcml0eSA9IDA7CitrbXBfdWludDY0IF9fa21wX3Rhc2tsb29wX21pbl90YXNrcyA9IDA7CisjZW5kaWYKKworLyogVGhpcyBjaGVjayBlbnN1cmVzIHRoYXQgdGhlIGNvbXBpbGVyIGlzIHBhc3NpbmcgdGhlIGNvcnJlY3QgZGF0YSB0eXBlIGZvciB0aGUKKyAgIGZsYWdzIGZvcm1hbCBwYXJhbWV0ZXIgb2YgdGhlIGZ1bmN0aW9uIGttcGNfb21wX3Rhc2tfYWxsb2MoKS4gSWYgdGhlIHR5cGUgaXMKKyAgIG5vdCBhIDQtYnl0ZSB0eXBlLCB0aGVuIGdpdmUgYW4gZXJyb3IgbWVzc2FnZSBhYm91dCBhIG5vbi1wb3NpdGl2ZSBsZW5ndGgKKyAgIGFycmF5IHBvaW50aW5nIGhlcmUuICBJZiB0aGF0IGhhcHBlbnMsIHRoZSBrbXBfdGFza2luZ19mbGFnc190IHN0cnVjdHVyZSBtdXN0CisgICBiZSByZWRlZmluZWQgdG8gaGF2ZSBleGFjdGx5IDMyIGJpdHMuICovCitLTVBfQlVJTERfQVNTRVJUKHNpemVvZihrbXBfdGFza2luZ19mbGFnc190KSA9PSA0KTsKKwora21wX2ludDMyIF9fa21wX3Rhc2tfc3RlYWxpbmdfY29uc3RyYWludCA9CisgICAgMTsgLyogQ29uc3RyYWluIHRhc2sgc3RlYWxpbmcgYnkgZGVmYXVsdCAqLworCisjaWZkZWYgREVCVUdfU1VTUEVORAoraW50IF9fa21wX3N1c3BlbmRfY291bnQgPSAwOworI2VuZGlmCisKK2ludCBfX2ttcF9zZXR0aW5ncyA9IEZBTFNFOworaW50IF9fa21wX2R1cGxpY2F0ZV9saWJyYXJ5X29rID0gMDsKKyNpZiBVU0VfSVRUX0JVSUxECitpbnQgX19rbXBfZm9ya2pvaW5fZnJhbWVzID0gMTsKK2ludCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9IDM7CisjZW5kaWYKK1BBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QgX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9CisgICAgcmVkdWN0aW9uX21ldGhvZF9ub3RfZGVmaW5lZDsKK2ludCBfX2ttcF9kZXRlcm1fcmVkID0gRkFMU0U7CisKKyNpZmRlZiBLTVBfREVCVUcKK2ludCBrbXBfYV9kZWJ1ZyA9IDA7CitpbnQga21wX2JfZGVidWcgPSAwOworaW50IGttcF9jX2RlYnVnID0gMDsKK2ludCBrbXBfZF9kZWJ1ZyA9IDA7CitpbnQga21wX2VfZGVidWcgPSAwOworaW50IGttcF9mX2RlYnVnID0gMDsKK2ludCBrbXBfZGlhZyA9IDA7CisjZW5kaWYKKworLyogRm9yIGRlYnVnIGluZm9ybWF0aW9uIGxvZ2dpbmcgdXNpbmcgcm90YXRpbmcgYnVmZmVyICovCitpbnQgX19rbXBfZGVidWdfYnVmID0KKyAgICBGQUxTRTsgLyogVFJVRSBtZWFucyB1c2UgYnVmZmVyLCBGQUxTRSBtZWFucyBwcmludCB0byBzdGRlcnIgKi8KK2ludCBfX2ttcF9kZWJ1Z19idWZfbGluZXMgPQorICAgIEtNUF9ERUJVR19CVUZfTElORVNfSU5JVDsgLyogTGluZXMgb2YgZGVidWcgc3RvcmVkIGluIGJ1ZmZlciAqLworaW50IF9fa21wX2RlYnVnX2J1Zl9jaGFycyA9CisgICAgS01QX0RFQlVHX0JVRl9DSEFSU19JTklUOyAvKiBDaGFyYWN0ZXJzIGFsbG93ZWQgcGVyIGxpbmUgaW4gYnVmZmVyICovCitpbnQgX19rbXBfZGVidWdfYnVmX2F0b21pYyA9CisgICAgRkFMU0U7IC8qIFRSVUUgbWVhbnMgdXNlIGF0b21pYyB1cGRhdGUgb2YgYnVmZmVyIGVudHJ5IHBvaW50ZXIgKi8KKworY2hhciAqX19rbXBfZGVidWdfYnVmZmVyID0gTlVMTDsgLyogRGVidWcgYnVmZmVyIGl0c2VsZiAqLworaW50IF9fa21wX2RlYnVnX2NvdW50ID0KKyAgICAwOyAvKiBDb3VudGVyIGZvciBudW1iZXIgb2YgbGluZXMgcHJpbnRlZCBpbiBidWZmZXIgc28gZmFyICovCitpbnQgX19rbXBfZGVidWdfYnVmX3dhcm5fY2hhcnMgPQorICAgIDA7IC8qIEtlZXAgdHJhY2sgb2YgY2hhciBpbmNyZWFzZSByZWNvbW1lbmRlZCBpbiB3YXJuaW5ncyAqLworLyogZW5kIHJvdGF0aW5nIGRlYnVnIGJ1ZmZlciAqLworCisjaWZkZWYgS01QX0RFQlVHCitpbnQgX19rbXBfcGFyX3JhbmdlOyAvKiArMSA9PiBvbmx5IGdvIHBhciBmb3IgY29uc3RydWN0cyBpbiByYW5nZSAqLworLyogLTEgPT4gb25seSBnbyBwYXIgZm9yIGNvbnN0cnVjdHMgb3V0c2lkZSByYW5nZSAqLworY2hhciBfX2ttcF9wYXJfcmFuZ2Vfcm91dGluZVtLTVBfUEFSX1JBTkdFX1JPVVRJTkVfTEVOXSA9IHsnXDAnfTsKK2NoYXIgX19rbXBfcGFyX3JhbmdlX2ZpbGVuYW1lW0tNUF9QQVJfUkFOR0VfRklMRU5BTUVfTEVOXSA9IHsnXDAnfTsKK2ludCBfX2ttcF9wYXJfcmFuZ2VfbGIgPSAwOworaW50IF9fa21wX3Bhcl9yYW5nZV91YiA9IElOVF9NQVg7CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKy8qIEZvciBwcmludGluZyBvdXQgZHluYW1pYyBzdG9yYWdlIG1hcCBmb3IgdGhyZWFkcyBhbmQgdGVhbXMgKi8KK2ludCBfX2ttcF9zdG9yYWdlX21hcCA9CisgICAgRkFMU0U7IC8qIFRydWUgbWVhbnMgcHJpbnQgc3RvcmFnZSBtYXAgZm9yIHRocmVhZHMgYW5kIHRlYW1zICovCitpbnQgX19rbXBfc3RvcmFnZV9tYXBfdmVyYm9zZSA9CisgICAgRkFMU0U7IC8qIFRydWUgbWVhbnMgc3RvcmFnZSBtYXAgaW5jbHVkZXMgcGxhY2VtZW50IGluZm8gKi8KK2ludCBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlX3NwZWNpZmllZCA9IEZBTFNFOworLyogSW5pdGlhbGl6ZSB0aGUgbGlicmFyeSBkYXRhIHN0cnVjdHVyZXMgd2hlbiB3ZSBmb3JrIGEgY2hpbGQgcHJvY2VzcywgZGVmYXVsdHMKKyAqIHRvIFRSVUUgKi8KK2ludCBfX2ttcF9uZWVkX3JlZ2lzdGVyX2F0Zm9yayA9CisgICAgVFJVRTsgLyogQXQgaW5pdGlhbGl6YXRpb24sIGNhbGwgcHRocmVhZF9hdGZvcmsgdG8gaW5zdGFsbCBmb3JrIGhhbmRsZXIgKi8KK2ludCBfX2ttcF9uZWVkX3JlZ2lzdGVyX2F0Zm9ya19zcGVjaWZpZWQgPSBUUlVFOworCitpbnQgX19rbXBfZW52X2NodW5rID0gRkFMU0U7IC8qIEtNUF9DSFVOSyBzcGVjaWZpZWQ/ICAgICAqLworaW50IF9fa21wX2Vudl9zdGtzaXplID0gRkFMU0U7IC8qIEtNUF9TVEFDS1NJWkUgc3BlY2lmaWVkPyAqLworaW50IF9fa21wX2Vudl9vbXBfc3Rrc2l6ZSA9IEZBTFNFOyAvKiBPTVBfU1RBQ0tTSVpFIHNwZWNpZmllZD8gKi8KK2ludCBfX2ttcF9lbnZfYWxsX3RocmVhZHMgPQorICAgIEZBTFNFOyAvKiBLTVBfQUxMX1RIUkVBRFMgb3IgS01QX01BWF9USFJFQURTIHNwZWNpZmllZD8gKi8KK2ludCBfX2ttcF9lbnZfb21wX2FsbF90aHJlYWRzID0gRkFMU0U7IC8qIE9NUF9USFJFQURfTElNSVQgc3BlY2lmaWVkPyAqLworaW50IF9fa21wX2Vudl9ibG9ja3RpbWUgPSBGQUxTRTsgLyogS01QX0JMT0NLVElNRSBzcGVjaWZpZWQ/ICovCitpbnQgX19rbXBfZW52X2NoZWNrcyA9IEZBTFNFOyAvKiBLTVBfQ0hFQ0tTIHNwZWNpZmllZD8gICAgKi8KK2ludCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgPSBGQUxTRTsgLyogS01QX0NPTlNJU1RFTkNZX0NIRUNLIHNwZWNpZmllZD8gKi8KKwora21wX3VpbnQzMiBfX2ttcF95aWVsZF9pbml0ID0gS01QX0lOSVRfV0FJVDsKK2ttcF91aW50MzIgX19rbXBfeWllbGRfbmV4dCA9IEtNUF9ORVhUX1dBSVQ7CisKKyNpZiBLTVBfVVNFX01PTklUT1IKK2ttcF91aW50MzIgX19rbXBfeWllbGRpbmdfb24gPSAxOworI2VuZGlmCisjaWYgS01QX09TX0NOSwora21wX3VpbnQzMiBfX2ttcF95aWVsZF9jeWNsZSA9IDA7CisjZWxzZQora21wX3VpbnQzMiBfX2ttcF95aWVsZF9jeWNsZSA9IDE7IC8qIFlpZWxkLWN5Y2xlIGlzIG9uIGJ5IGRlZmF1bHQgKi8KKyNlbmRpZgora21wX2ludDMyIF9fa21wX3lpZWxkX29uX2NvdW50ID0KKyAgICAxMDsgLyogQnkgZGVmYXVsdCwgeWllbGRpbmcgaXMgb24gZm9yIDEwIG1vbml0b3IgcGVyaW9kcy4gKi8KK2ttcF9pbnQzMiBfX2ttcF95aWVsZF9vZmZfY291bnQgPQorICAgIDE7IC8qIEJ5IGRlZmF1bHQsIHlpZWxkaW5nIGlzIG9mZiBmb3IgMSBtb25pdG9yIHBlcmlvZHMuICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogU1RBVEUgbW9zdGx5IHN5bmNyb25pemVkIHdpdGggZ2xvYmFsIGxvY2sgKi8KKy8qIGRhdGEgd3JpdHRlbiB0byByYXJlbHkgYnkgbWFzdGVycywgcmVhZCBvZnRlbiBieSB3b3JrZXJzICovCisvKiBUT0RPOiBOb25lIG9mIHRoaXMgZ2xvYmFsIHBhZGRpbmcgc3R1ZmYgd29ya3MgY29uc2lzdGVudGx5IGJlY2F1c2UgdGhlIG9yZGVyCisgICBvZiBkZWNsYXJhdGlvbiBpcyBub3QgbmVjZXNzYXJpbHkgY29ycmVsYXRlZCB0byBzdG9yYWdlIG9yZGVyLiBUbyBmaXggdGhpcywKKyAgIGFsbCB0aGUgaW1wb3J0YW50IGdsb2JhbHMgbXVzdCBiZSBwdXQgaW4gYSBiaWcgc3RydWN0dXJlIGluc3RlYWQuICovCitLTVBfQUxJR05fQ0FDSEUKK2ttcF9pbmZvX3QgKipfX2ttcF90aHJlYWRzID0gTlVMTDsKK2ttcF9yb290X3QgKipfX2ttcF9yb290ID0gTlVMTDsKKworLyogZGF0YSByZWFkL3dyaXR0ZW4gdG8gb2Z0ZW4gYnkgbWFzdGVycyAqLworS01QX0FMSUdOX0NBQ0hFCit2b2xhdGlsZSBpbnQgX19rbXBfbnRoID0gMDsKK3ZvbGF0aWxlIGludCBfX2ttcF9hbGxfbnRoID0gMDsKK2ludCBfX2ttcF90aHJlYWRfcG9vbF9udGggPSAwOwordm9sYXRpbGUga21wX2luZm9fdCAqX19rbXBfdGhyZWFkX3Bvb2wgPSBOVUxMOwordm9sYXRpbGUga21wX3RlYW1fdCAqX19rbXBfdGVhbV9wb29sID0gTlVMTDsKKworS01QX0FMSUdOX0NBQ0hFCit2b2xhdGlsZSBpbnQgX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCA9IDA7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEdMT0JBTC9ST09UIFNUQVRFICovCitLTVBfQUxJR05fQ0FDSEUKK2ttcF9nbG9iYWxfdCBfX2ttcF9nbG9iYWwgPSB7ezB9fTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEdMT0JBTCBTWU5DSFJPTklaQVRJT04gTE9DS1MgKi8KKy8qIFRPRE8gdmVyaWZ5IHRoZSBuZWVkIGZvciB0aGVzZSBsb2NrcyBhbmQgaWYgdGhleSBuZWVkIHRvIGJlIGdsb2JhbCAqLworCisjaWYgS01QX1VTRV9JTlRFUk5PREVfQUxJR05NRU5UCisvKiBNdWx0aW5vZGUgc3lzdGVtcyBoYXZlIGxhcmdlciBjYWNoZSBsaW5lIGdyYW51bGFyaXR5IHdoaWNoIGNhbiBjYXVzZQorICogZmFsc2Ugc2hhcmluZyBpZiB0aGUgYWxpZ25tZW50IGlzIG5vdCBsYXJnZSBlbm91Z2ggZm9yIHRoZXNlIGxvY2tzICovCitLTVBfQUxJR05fQ0FDSEVfSU5URVJOT0RFCisKK2ttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2luaXR6X2xvY2sgPSBLTVBfQk9PVFNUUkFQX0xPQ0tfSU5JVElBTElaRVIoCisgICAgX19rbXBfaW5pdHpfbG9jayk7IC8qIENvbnRyb2wgaW5pdGlhbGl6YXRpb25zICovCitLTVBfQUxJR05fQ0FDSEVfSU5URVJOT0RFCitrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9mb3Jram9pbl9sb2NrOyAvKiBjb250cm9sIGZvcmsvam9pbiBhY2Nlc3MgKi8KK0tNUF9BTElHTl9DQUNIRV9JTlRFUk5PREUKK2ttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2V4aXRfbG9jazsgLyogZXhpdCgpIGlzIG5vdCBhbHdheXMgdGhyZWFkLXNhZmUgKi8KKyNpZiBLTVBfVVNFX01PTklUT1IKK0tNUF9BTElHTl9DQUNIRV9JTlRFUk5PREUKK2ttcF9ib290c3RyYXBfbG9ja190IF9fa21wX21vbml0b3JfbG9jazsgLyogY29udHJvbCBtb25pdG9yIHRocmVhZCBjcmVhdGlvbiAqLworI2VuZGlmCisvKiB1c2VkIGZvciB0aGUgaGFjayB0byBhbGxvdyB0aHJlYWRwcml2YXRlIGNhY2hlIGFuZCBfX2ttcF90aHJlYWRzIGV4cGFuc2lvbgorICAgdG8gY28tZXhpc3QgKi8KK0tNUF9BTElHTl9DQUNIRV9JTlRFUk5PREUKK2ttcF9ib290c3RyYXBfbG9ja190IF9fa21wX3RwX2NhY2hlZF9sb2NrOworCitLTVBfQUxJR05fQ0FDSEVfSU5URVJOT0RFCitrbXBfbG9ja190IF9fa21wX2dsb2JhbF9sb2NrOyAvKiBDb250cm9sIE9TL2dsb2JhbCBhY2Nlc3MgKi8KK0tNUF9BTElHTl9DQUNIRV9JTlRFUk5PREUKK2ttcF9xdWV1aW5nX2xvY2tfdCBfX2ttcF9kaXNwYXRjaF9sb2NrOyAvKiBDb250cm9sIGRpc3BhdGNoIGFjY2VzcyAgKi8KK0tNUF9BTElHTl9DQUNIRV9JTlRFUk5PREUKK2ttcF9sb2NrX3QgX19rbXBfZGVidWdfbG9jazsgLyogQ29udHJvbCBJL08gYWNjZXNzIGZvciBLTVBfREVCVUcgKi8KKyNlbHNlCitLTVBfQUxJR05fQ0FDSEUKKwora21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfaW5pdHpfbG9jayA9IEtNUF9CT09UU1RSQVBfTE9DS19JTklUSUFMSVpFUigKKyAgICBfX2ttcF9pbml0el9sb2NrKTsgLyogQ29udHJvbCBpbml0aWFsaXphdGlvbnMgKi8KK2ttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2Zvcmtqb2luX2xvY2s7IC8qIGNvbnRyb2wgZm9yay9qb2luIGFjY2VzcyAqLwora21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfZXhpdF9sb2NrOyAvKiBleGl0KCkgaXMgbm90IGFsd2F5cyB0aHJlYWQtc2FmZSAqLworI2lmIEtNUF9VU0VfTU9OSVRPUgora21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfbW9uaXRvcl9sb2NrOyAvKiBjb250cm9sIG1vbml0b3IgdGhyZWFkIGNyZWF0aW9uICovCisjZW5kaWYKKy8qIHVzZWQgZm9yIHRoZSBoYWNrIHRvIGFsbG93IHRocmVhZHByaXZhdGUgY2FjaGUgYW5kIF9fa21wX3RocmVhZHMgZXhwYW5zaW9uCisgICB0byBjby1leGlzdCAqLwora21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfdHBfY2FjaGVkX2xvY2s7CisKK0tNUF9BTElHTigxMjgpCitrbXBfbG9ja190IF9fa21wX2dsb2JhbF9sb2NrOyAvKiBDb250cm9sIE9TL2dsb2JhbCBhY2Nlc3MgKi8KK0tNUF9BTElHTigxMjgpCitrbXBfcXVldWluZ19sb2NrX3QgX19rbXBfZGlzcGF0Y2hfbG9jazsgLyogQ29udHJvbCBkaXNwYXRjaCBhY2Nlc3MgICovCitLTVBfQUxJR04oMTI4KQora21wX2xvY2tfdCBfX2ttcF9kZWJ1Z19sb2NrOyAvKiBDb250cm9sIEkvTyBhY2Nlc3MgZm9yIEtNUF9ERUJVRyAqLworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfSEFORExFX1NJR05BTFMKKy8qIFNpZ25hbCBoYW5kbGluZyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LCBiZWNhdXNlIGl0IGNvbmZ1c2VzIHVzZXJzOiBJbiBjYXNlIG9mCisgICBzaWdzZWd2IChvciBvdGhlciB0cm91YmxlKSBpbiB1c2VyIGNvZGUgc2lnbmFsIGhhbmRsZXIgY2F0Y2hlcyB0aGUgc2lnbmFsLAorICAgd2hpY2ggdGhlbiAiYXBwZWFycyIgaW4gdGhlIG1vbml0b3IgdGhyZWFkICh3aGVuIHRoZSBtb25pdG9yIGV4ZWN1dGVzIHJhaXNlKCkKKyAgIGZ1bmN0aW9uKS4gVXNlcnMgc2VlIHNpZ25hbCBpbiB0aGUgbW9uaXRvciB0aHJlYWQgYW5kIGJsYW1lIE9wZW5NUCBSVEwuCisKKyAgIEdyYW50IHNhaWQgc2lnbmFsIGhhbmRsaW5nIHJlcXVpcmVkIG9uIHNvbWUgb2xkZXIgT1NlcyAoSXJpeD8pIHN1cHBvcnRlZCBieQorICAgS0FJLCBiZWNhdXNlIGJhZCBhcHBsaWNhdGlvbnMgaHVuZyBidXQgbm90IGFib3J0ZWQuIEN1cnJlbnRseSBpdCBpcyBub3QgYQorICAgcHJvYmxlbSBmb3IgTGludXgqIE9TLCBPUyBYKiBhbmQgV2luZG93cyogT1MuCisKKyAgIEdyYW50OiBGb3VuZCBuZXcgaGFuZ3MgZm9yIEVMNCwgRUw1LCBhbmQgYSBGZWRvcmEgQ29yZSBtYWNoaW5lLiAgU28gSSdtCisgICBwdXR0aW5nIHRoZSBkZWZhdWx0IGJhY2sgZm9yIG5vdyB0byBzZWUgaWYgdGhhdCBmaXhlcyBoYW5ncyBvbiB0aG9zZQorICAgbWFjaGluZXMuCisKKyAgIDIwMTAtMDQwMTMgTGV2OiBJdCB3YXMgYSBidWcgaW4gRm9ydHJhbiBSVEwuIEZvcnRyYW4gUlRMIHByaW50cyBhIGtpbmQgb2YKKyAgIHN0YWNrIGJhY2t0cmFjZSB3aGVuIHByb2dyYW0gaXMgYWJvcnRpbmcsIGJ1dCB0aGUgY29kZSBpcyBub3Qgc2lnbmFsLXNhZmUuCisgICBXaGVuIG11bHRpcGxlIHNpZ25hbHMgcmFpc2VkIGF0IHRoZSBzYW1lIHRpbWUgKHdoaWNoIG9jY3VycyBpbiBkeW5hbWljCisgICBuZWdhdGl2ZSB0ZXN0cyBiZWNhdXNlIGFsbCB0aGUgd29ya2VyIHRocmVhZHMgZGV0ZWN0cyB0aGUgc2FtZSBlcnJvciksCisgICBGb3J0cmFuIFJUTCBtYXkgaGFuZy4gVGhlIGJ1ZyBmaW5hbGx5IGZpeGVkIGluIEZvcnRyYW4gUlRMIGxpYnJhcnkgcHJvdmlkZWQKKyAgIGJ5IFN0ZXZlIFIuLCBhbmQgd2lsbCBiZSBhdmFpbGFibGUgc29vbi4gKi8KK2ludCBfX2ttcF9oYW5kbGVfc2lnbmFscyA9IEZBTFNFOworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWZkZWYgQlVJTERfVFYKK2ttcF9rZXlfdCBfX2ttcF90dl9rZXkgPSAwOworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgREVCVUdfU1VTUEVORAoraW50IGdldF9zdXNwZW5kX2NvdW50Xyh2b2lkKSB7CisgIGludCBjb3VudCA9IF9fa21wX3N1c3BlbmRfY291bnQ7CisgIF9fa21wX3N1c3BlbmRfY291bnQgPSAwOworICByZXR1cm4gY291bnQ7Cit9Cit2b2lkIHNldF9zdXNwZW5kX2NvdW50XyhpbnQgKnZhbHVlKSB7IF9fa21wX3N1c3BlbmRfY291bnQgPSAqdmFsdWU7IH0KKyNlbmRpZgorCisvLyBTeW1ib2xzIGZvciBNUyBtdXR1YWwgZGV0ZWN0aW9uLgoraW50IF9Zb3VfbXVzdF9saW5rX3dpdGhfZXhhY3RseV9vbmVfT3Blbk1QX2xpYnJhcnkgPSAxOworaW50IF9Zb3VfbXVzdF9saW5rX3dpdGhfSW50ZWxfT3Blbk1QX2xpYnJhcnkgPSAxOworI2lmIEtNUF9PU19XSU5ET1dTICYmIChLTVBfVkVSU0lPTl9NQUpPUiA+IDQpCitpbnQgX1lvdV9tdXN0X2xpbmtfd2l0aF9NaWNyb3NvZnRfT3Blbk1QX2xpYnJhcnkgPSAxOworI2VuZGlmCisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfZ3N1cHBvcnQuY3BwIGIvZmluYWwvcnVudGltZS9zcmMva21wX2dzdXBwb3J0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTlkMGEyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2dzdXBwb3J0LmNwcApAQCAtMCwwICsxLDE1MDcgQEAKKy8qCisgKiBrbXBfZ3N1cHBvcnQuY3BwCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfYXRvbWljLmgiCisKKyNpZiBPTVBUX1NVUFBPUlQKKyNpbmNsdWRlICJvbXB0LXNwZWNpZmljLmgiCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjZGVmaW5lIE1LTE9DKGxvYywgcm91dGluZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgaWRlbnRfdChsb2MpID0gezAsIEtNUF9JREVOVF9LTVBDLCAwLCAwLCAiO3Vua25vd247dW5rbm93bjswOzA7OyJ9OworCisjaW5jbHVkZSAia21wX2Z0bl9vcy5oIgorCit2b2lkIHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfQkFSUklFUikodm9pZCkgeworICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgTUtMT0MobG9jLCAiR09NUF9iYXJyaWVyIik7CisgIEtBX1RSQUNFKDIwLCAoIkdPTVBfYmFycmllcjogVCMlZFxuIiwgZ3RpZCkpOworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgIG9tcHRfZnJhbWVfdCAqb21wdF9mcmFtZTsKKyAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgIG9tcHRfZnJhbWUgPSBfX29tcHRfZ2V0X3Rhc2tfZnJhbWVfaW50ZXJuYWwoMCk7CisgICAgb21wdF9mcmFtZS0+cmVlbnRlcl9ydW50aW1lX2ZyYW1lID0gX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMSk7CisgIH0KKyNlbmRpZgorICBfX2ttcGNfYmFycmllcigmbG9jLCBndGlkKTsKK30KKworLy8gTXV0dWFsIGV4Y2x1c2lvbgorCisvLyBUaGUgc3ltYm9sIHRoYXQgaWNjL2lmb3J0IGdlbmVyYXRlcyBmb3IgdW5uYW1lZCBmb3IgdW5uYW1lZCBjcml0aWNhbCBzZWN0aW9ucworLy8gLSAuZ29tcF9jcml0aWNhbF91c2VyXyAtIGlzIGRlZmluZWQgdXNpbmcgLmNvbW0gaW4gYW55IG9iamVjdHMgcmVmZXJlbmNlIGl0LgorLy8gV2UgY2FuJ3QgcmVmZXJlbmNlIGl0IGRpcmVjdGx5IGhlcmUgaW4gQyBjb2RlLCBhcyB0aGUgc3ltYm9sIGNvbnRhaW5zIGEgIi4iLgorLy8KKy8vIFRoZSBSVEwgY29udGFpbnMgYW4gYXNzZW1ibHkgbGFuZ3VhZ2UgZGVmaW5pdGlvbiBvZiAuZ29tcF9jcml0aWNhbF91c2VyXworLy8gd2l0aCBhbm90aGVyIHN5bWJvbCBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIgaW5pdGlhbGl6ZWQgd2l0aCBpdCdzCisvLyBhZGRyZXNzLgorZXh0ZXJuIGttcF9jcml0aWNhbF9uYW1lICpfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHI7CisKK3ZvaWQgeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9DUklUSUNBTF9TVEFSVCkodm9pZCkgeworICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgTUtMT0MobG9jLCAiR09NUF9jcml0aWNhbF9zdGFydCIpOworICBLQV9UUkFDRSgyMCwgKCJHT01QX2NyaXRpY2FsX3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisgIF9fa21wY19jcml0aWNhbCgmbG9jLCBndGlkLCBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIpOworfQorCit2b2lkIHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfRU5EKSh2b2lkKSB7CisgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgTUtMT0MobG9jLCAiR09NUF9jcml0aWNhbF9lbmQiKTsKKyAgS0FfVFJBQ0UoMjAsICgiR09NUF9jcml0aWNhbF9lbmQ6IFQjJWRcbiIsIGd0aWQpKTsKKyAgX19rbXBjX2VuZF9jcml0aWNhbCgmbG9jLCBndGlkLCBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIpOworfQorCit2b2lkIHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfTkFNRV9TVEFSVCkodm9pZCAqKnBwdHIpIHsKKyAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgIE1LTE9DKGxvYywgIkdPTVBfY3JpdGljYWxfbmFtZV9zdGFydCIpOworICBLQV9UUkFDRSgyMCwgKCJHT01QX2NyaXRpY2FsX25hbWVfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKyAgX19rbXBjX2NyaXRpY2FsKCZsb2MsIGd0aWQsIChrbXBfY3JpdGljYWxfbmFtZSAqKXBwdHIpOworfQorCit2b2lkIHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfTkFNRV9FTkQpKHZvaWQgKipwcHRyKSB7CisgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgTUtMT0MobG9jLCAiR09NUF9jcml0aWNhbF9uYW1lX2VuZCIpOworICBLQV9UUkFDRSgyMCwgKCJHT01QX2NyaXRpY2FsX25hbWVfZW5kOiBUIyVkXG4iLCBndGlkKSk7CisgIF9fa21wY19lbmRfY3JpdGljYWwoJmxvYywgZ3RpZCwgKGttcF9jcml0aWNhbF9uYW1lICopcHB0cik7Cit9CisKKy8vIFRoZSBHbnUgY29kZWdlbiB0cmllcyB0byB1c2UgbG9ja2VkIG9wZXJhdGlvbnMgdG8gcGVyZm9ybSBhdG9taWMgdXBkYXRlcworLy8gaW5saW5lLiAgSWYgaXQgY2FuJ3QsIHRoZW4gaXQgY2FsbHMgR09NUF9hdG9taWNfc3RhcnQoKSBiZWZvcmUgcGVyZm9ybWluZworLy8gdGhlIHVwZGF0ZSBhbmQgR09NUF9hdG9taWNfZW5kKCkgYWZ0ZXJ3YXJkLCByZWdhcmRsZXNzIG9mIHRoZSBkYXRhIHR5cGUuCit2b2lkIHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfQVRPTUlDX1NUQVJUKSh2b2lkKSB7CisgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICBLQV9UUkFDRSgyMCwgKCJHT01QX2F0b21pY19zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworCisjaWYgT01QVF9TVVBQT1JUCisgIF9fb21wdF90aHJlYWRfYXNzaWduX3dhaXRfaWQoMCk7CisjZW5kaWYKKworICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCZfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCk7Cit9CisKK3ZvaWQgeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9BVE9NSUNfRU5EKSh2b2lkKSB7CisgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgS0FfVFJBQ0UoMjAsICgiR09NUF9hdG9taWNfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKyAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jaygmX19rbXBfYXRvbWljX2xvY2ssIGd0aWQpOworfQorCitpbnQgeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfU1RBUlQpKHZvaWQpIHsKKyAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgIE1LTE9DKGxvYywgIkdPTVBfc2luZ2xlX3N0YXJ0Iik7CisgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2luZ2xlX3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisKKyAgaWYgKCFUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkKKyAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgLy8gM3JkIHBhcmFtZXRlciA9PSBGQUxTRSBwcmV2ZW50cyBrbXBfZW50ZXJfc2luZ2xlIGZyb20gcHVzaGluZyBhCisgIC8vIHdvcmtzaGFyZSB3aGVuIFVTRV9DSEVDS1MgaXMgZGVmaW5lZC4gIFdlIG5lZWQgdG8gYXZvaWQgdGhlIHB1c2gsCisgIC8vIGFzIHRoZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcgR09NUF9zaW5nbGVfZW5kKCkgY2FsbC4KKyAgcmV0dXJuIF9fa21wX2VudGVyX3NpbmdsZShndGlkLCAmbG9jLCBGQUxTRSk7Cit9CisKK3ZvaWQgKnhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfU0lOR0xFX0NPUFlfU1RBUlQpKHZvaWQpIHsKKyAgdm9pZCAqcmV0dmFsOworICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgTUtMT0MobG9jLCAiR09NUF9zaW5nbGVfY29weV9zdGFydCIpOworICBLQV9UUkFDRSgyMCwgKCJHT01QX3NpbmdsZV9jb3B5X3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisKKyAgaWYgKCFUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkKKyAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGhyZWFkIHRvIGVudGVyLCByZXR1cm4gTlVMTC4gIFRoZSBnZW5lcmF0ZWQgY29kZSB3aWxsCisgIC8vIHRoZW4gY2FsbCBHT01QX3NpbmdsZV9jb3B5X2VuZCgpIGZvciB0aGlzIHRocmVhZCBvbmx5LCB3aXRoIHRoZQorICAvLyBjb3B5cHJpdmF0ZSBkYXRhIHBvaW50ZXIgYXMgYW4gYXJndW1lbnQuCisgIGlmIChfX2ttcF9lbnRlcl9zaW5nbGUoZ3RpZCwgJmxvYywgRkFMU0UpKQorICAgIHJldHVybiBOVUxMOworCisgIC8vIFdhaXQgZm9yIHRoZSBmaXJzdCB0aHJlYWQgdG8gc2V0IHRoZSBjb3B5cHJpdmF0ZSBkYXRhIHBvaW50ZXIsCisgIC8vIGFuZCBmb3IgYWxsIG90aGVyIHRocmVhZHMgdG8gcmVhY2ggdGhpcyBwb2ludC4KKyAgX19rbXBfYmFycmllcihic19wbGFpbl9iYXJyaWVyLCBndGlkLCBGQUxTRSwgMCwgTlVMTCwgTlVMTCk7CisKKyAgLy8gUmV0cmlldmUgdGhlIHZhbHVlIG9mIHRoZSBjb3B5cHJpdmF0ZSBkYXRhIHBvaW50LCBhbmQgd2FpdCBmb3IgYWxsCisgIC8vIHRocmVhZHMgdG8gZG8gbGlrZXdpc2UsIHRoZW4gcmV0dXJuLgorICByZXR2YWwgPSBfX2ttcF90ZWFtX2Zyb21fZ3RpZChndGlkKS0+dC50X2NvcHlwcml2X2RhdGE7CisgIF9fa21wX2JhcnJpZXIoYnNfcGxhaW5fYmFycmllciwgZ3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwpOworICByZXR1cm4gcmV0dmFsOworfQorCit2b2lkIHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfU0lOR0xFX0NPUFlfRU5EKSh2b2lkICpkYXRhKSB7CisgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgS0FfVFJBQ0UoMjAsICgiR09NUF9zaW5nbGVfY29weV9lbmQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAvLyBTZXQgdGhlIGNvcHlwcml2YXRlIGRhdGEgcG9pbnRlciBmbyB0aGUgdGVhbSwgdGhlbiBoaXQgdGhlIGJhcnJpZXIgc28gdGhhdAorICAvLyB0aGUgb3RoZXIgdGhyZWFkcyB3aWxsIGNvbnRpbnVlIG9uIGFuZCByZWFkIGl0LiAgSGl0IGFub3RoZXIgYmFycmllciBiZWZvcmUKKyAgLy8gY29udGludWluZywgc28gdGhhdCB0aGUga25vdyB0aGF0IHRoZSBjb3B5cHJpdmF0ZSBkYXRhIHBvaW50ZXIgaGFzIGJlZW4KKyAgLy8gcHJvcGFnYXRlZCB0byBhbGwgdGhyZWFkcyBiZWZvcmUgdHJ5aW5nIHRvIHJldXNlIHRoZSB0X2NvcHlwcml2X2RhdGEgZmllbGQuCisgIF9fa21wX3RlYW1fZnJvbV9ndGlkKGd0aWQpLT50LnRfY29weXByaXZfZGF0YSA9IGRhdGE7CisgIF9fa21wX2JhcnJpZXIoYnNfcGxhaW5fYmFycmllciwgZ3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwpOworICBfX2ttcF9iYXJyaWVyKGJzX3BsYWluX2JhcnJpZXIsIGd0aWQsIEZBTFNFLCAwLCBOVUxMLCBOVUxMKTsKK30KKwordm9pZCB4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX09SREVSRURfU1RBUlQpKHZvaWQpIHsKKyAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgIE1LTE9DKGxvYywgIkdPTVBfb3JkZXJlZF9zdGFydCIpOworICBLQV9UUkFDRSgyMCwgKCJHT01QX29yZGVyZWRfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKyAgX19rbXBjX29yZGVyZWQoJmxvYywgZ3RpZCk7Cit9CisKK3ZvaWQgeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9PUkRFUkVEX0VORCkodm9pZCkgeworICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgIE1LTE9DKGxvYywgIkdPTVBfb3JkZXJlZF9lbmQiKTsKKyAgS0FfVFJBQ0UoMjAsICgiR09NUF9vcmRlcmVkX3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisgIF9fa21wY19lbmRfb3JkZXJlZCgmbG9jLCBndGlkKTsKK30KKworLy8gRGlzcGF0Y2ggbWFjcm8gZGVmcworLy8KKy8vIFRoZXkgY29tZSBpbiB0d28gZmxhdm9yczogNjQtYml0IHVuc2lnbmVkLCBhbmQgZWl0aGVyIDMyLWJpdCBzaWduZWQKKy8vIChJQS0zMiBhcmNoaXRlY3R1cmUpIG9yIDY0LWJpdCBzaWduZWQgKEludGVsKFIpIDY0KS4KKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfTUlQUworI2RlZmluZSBLTVBfRElTUEFUQ0hfSU5JVCBfX2ttcF9hdXhfZGlzcGF0Y2hfaW5pdF80CisjZGVmaW5lIEtNUF9ESVNQQVRDSF9GSU5JX0NIVU5LIF9fa21wX2F1eF9kaXNwYXRjaF9maW5pX2NodW5rXzQKKyNkZWZpbmUgS01QX0RJU1BBVENIX05FWFQgX19rbXBjX2Rpc3BhdGNoX25leHRfNAorI2Vsc2UKKyNkZWZpbmUgS01QX0RJU1BBVENIX0lOSVQgX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfOAorI2RlZmluZSBLTVBfRElTUEFUQ0hfRklOSV9DSFVOSyBfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua184CisjZGVmaW5lIEtNUF9ESVNQQVRDSF9ORVhUIF9fa21wY19kaXNwYXRjaF9uZXh0XzgKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgKi8KKworI2RlZmluZSBLTVBfRElTUEFUQ0hfSU5JVF9VTEwgX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfOHUKKyNkZWZpbmUgS01QX0RJU1BBVENIX0ZJTklfQ0hVTktfVUxMIF9fa21wX2F1eF9kaXNwYXRjaF9maW5pX2NodW5rXzh1CisjZGVmaW5lIEtNUF9ESVNQQVRDSF9ORVhUX1VMTCBfX2ttcGNfZGlzcGF0Y2hfbmV4dF84dQorCisvLyBUaGUgcGFyYWxsZWwgY29udHJ1Y3QKKworI2lmbmRlZiBLTVBfREVCVUcKK3N0YXRpYworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworICAgIHZvaWQKKyAgICBfX2ttcF9HT01QX21pY3JvdGFza193cmFwcGVyKGludCAqZ3RpZCwgaW50ICpucHIsIHZvaWQgKCp0YXNrKSh2b2lkICopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworI2lmIE9NUFRfU1VQUE9SVAorICBrbXBfaW5mb190ICp0aHI7CisgIG9tcHRfZnJhbWVfdCAqb21wdF9mcmFtZTsKKyAgb21wdF9zdGF0ZV90IGVuY2xvc2luZ19zdGF0ZTsKKworICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgLy8gZ2V0IHBvaW50ZXIgdG8gdGhyZWFkIGRhdGEgc3RydWN0dXJlCisgICAgdGhyID0gX19rbXBfdGhyZWFkc1sqZ3RpZF07CisKKyAgICAvLyBzYXZlIGVuY2xvc2luZyB0YXNrIHN0YXRlOyBzZXQgY3VycmVudCBzdGF0ZSBmb3IgdGFzaworICAgIGVuY2xvc2luZ19zdGF0ZSA9IHRoci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZTsKKyAgICB0aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWw7CisKKyAgICAvLyBzZXQgdGFzayBmcmFtZQorICAgIG9tcHRfZnJhbWUgPSBfX29tcHRfZ2V0X3Rhc2tfZnJhbWVfaW50ZXJuYWwoMCk7CisgICAgb21wdF9mcmFtZS0+ZXhpdF9ydW50aW1lX2ZyYW1lID0gX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMCk7CisgIH0KKyNlbmRpZgorCisgIHRhc2soZGF0YSk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgIC8vIGNsZWFyIHRhc2sgZnJhbWUKKyAgICBvbXB0X2ZyYW1lLT5leGl0X3J1bnRpbWVfZnJhbWUgPSBOVUxMOworCisgICAgLy8gcmVzdG9yZSBlbmNsb3Npbmcgc3RhdGUKKyAgICB0aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBlbmNsb3Npbmdfc3RhdGU7CisgIH0KKyNlbmRpZgorfQorCisjaWZuZGVmIEtNUF9ERUJVRworc3RhdGljCisjZW5kaWYgLyogS01QX0RFQlVHICovCisgICAgdm9pZAorICAgIF9fa21wX0dPTVBfcGFyYWxsZWxfbWljcm90YXNrX3dyYXBwZXIoaW50ICpndGlkLCBpbnQgKm5wciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCp0YXNrKSh2b2lkICopLCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtX3RocmVhZHMsIGlkZW50X3QgKmxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwgbG9uZyBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZW5kLCBsb25nIGluY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGNodW5rX3NpemUpIHsKKyAgLy8gSW50aWFsaXplIHRoZSBsb29wIHdvcmtzaGFyaW5nIGNvbnN0cnVjdC4KKyAgS01QX0RJU1BBVENIX0lOSVQobG9jLCAqZ3RpZCwgc2NoZWR1bGUsIHN0YXJ0LCBlbmQsIGluY3IsIGNodW5rX3NpemUsCisgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlICE9IGttcF9zY2hfc3RhdGljKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICBrbXBfaW5mb190ICp0aHI7CisgIG9tcHRfZnJhbWVfdCAqb21wdF9mcmFtZTsKKyAgb21wdF9zdGF0ZV90IGVuY2xvc2luZ19zdGF0ZTsKKworICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgdGhyID0gX19rbXBfdGhyZWFkc1sqZ3RpZF07CisgICAgLy8gc2F2ZSBlbmNsb3NpbmcgdGFzayBzdGF0ZTsgc2V0IGN1cnJlbnQgc3RhdGUgZm9yIHRhc2sKKyAgICBlbmNsb3Npbmdfc3RhdGUgPSB0aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGU7CisgICAgdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV93b3JrX3BhcmFsbGVsOworCisgICAgLy8gc2V0IHRhc2sgZnJhbWUKKyAgICBvbXB0X2ZyYW1lID0gX19vbXB0X2dldF90YXNrX2ZyYW1lX2ludGVybmFsKDApOworICAgIG9tcHRfZnJhbWUtPmV4aXRfcnVudGltZV9mcmFtZSA9IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApOworICB9CisjZW5kaWYKKworICAvLyBOb3cgaW52b2tlIHRoZSBtaWNyb3Rhc2suCisgIHRhc2soZGF0YSk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgIC8vIGNsZWFyIHRhc2sgZnJhbWUKKyAgICBvbXB0X2ZyYW1lLT5leGl0X3J1bnRpbWVfZnJhbWUgPSBOVUxMOworCisgICAgLy8gcmVzZXQgZW5jbG9zaW5nIHN0YXRlCisgICAgdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gZW5jbG9zaW5nX3N0YXRlOworICB9CisjZW5kaWYKK30KKworI2lmbmRlZiBLTVBfREVCVUcKK3N0YXRpYworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworICAgIHZvaWQKKyAgICBfX2ttcF9HT01QX2ZvcmtfY2FsbChpZGVudF90ICpsb2MsIGludCBndGlkLCB2b2lkICgqdW53cmFwcGVkX3Rhc2spKHZvaWQgKiksCisgICAgICAgICAgICAgICAgICAgICAgICAgbWljcm90YXNrX3Qgd3JhcHBlciwgaW50IGFyZ2MsIC4uLikgeworICBpbnQgcmM7CisgIGttcF9pbmZvX3QgKnRociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgIGttcF90ZWFtX3QgKnRlYW0gPSB0aHItPnRoLnRoX3RlYW07CisgIGludCB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworCisgIHZhX2xpc3QgYXA7CisgIHZhX3N0YXJ0KGFwLCBhcmdjKTsKKworICByYyA9IF9fa21wX2ZvcmtfY2FsbChsb2MsIGd0aWQsIGZvcmtfY29udGV4dF9nbnUsIGFyZ2MsCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgIFZPTEFUSUxFX0NBU1Qodm9pZCAqKSB1bndyYXBwZWRfdGFzaywKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLCBfX2ttcF9pbnZva2VfdGFza19mdW5jLAorI2lmIChLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpICYmIEtNUF9PU19MSU5VWAorICAgICAgICAgICAgICAgICAgICAgICAmYXAKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgIGFwCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICB2YV9lbmQoYXApOworCisgIGlmIChyYykgeworICAgIF9fa21wX3J1bl9iZWZvcmVfaW52b2tlZF90YXNrKGd0aWQsIHRpZCwgdGhyLCB0ZWFtKTsKKyAgfQorCisjaWYgT01QVF9TVVBQT1JUCisgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyNpZiBPTVBUX1RSQUNFCisgICAgb21wdF90ZWFtX2luZm9fdCAqdGVhbV9pbmZvID0gX19vbXB0X2dldF90ZWFtaW5mbygwLCBOVUxMKTsKKyAgICBvbXB0X3Rhc2tfaW5mb190ICp0YXNrX2luZm8gPSBfX29tcHRfZ2V0X3Rhc2tpbmZvKDApOworCisgICAgLy8gaW1wbGljaXQgdGFzayBjYWxsYmFjaworICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbikpIHsKKyAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luKSgKKyAgICAgICAgICB0ZWFtX2luZm8tPnBhcmFsbGVsX2lkLCB0YXNrX2luZm8tPnRhc2tfaWQpOworICAgIH0KKyNlbmRpZgorICAgIHRoci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd29ya19wYXJhbGxlbDsKKyAgfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIF9fa21wX0dPTVBfc2VyaWFsaXplZF9wYXJhbGxlbChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCp0YXNrKSh2b2lkICopKSB7CisjaWYgT01QVF9TVVBQT1JUCisgIG9tcHRfcGFyYWxsZWxfaWRfdCBvbXB0X3BhcmFsbGVsX2lkOworICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgb21wdF90YXNrX2luZm9fdCAqdGFza19pbmZvID0gX19vbXB0X2dldF90YXNraW5mbygwKTsKKworICAgIG9tcHRfcGFyYWxsZWxfaWQgPSBfX29tcHRfcGFyYWxsZWxfaWRfbmV3KGd0aWQpOworCisgICAgLy8gcGFyYWxsZWwgcmVnaW9uIGNhbGxiYWNrCisgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbikpIHsKKyAgICAgIGludCB0ZWFtX3NpemUgPSAxOworICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luKSgKKyAgICAgICAgICB0YXNrX2luZm8tPnRhc2tfaWQsICZ0YXNrX2luZm8tPmZyYW1lLCBvbXB0X3BhcmFsbGVsX2lkLCB0ZWFtX3NpemUsCisgICAgICAgICAgKHZvaWQgKil0YXNrLCBPTVBUX0lOVk9LRVIoZm9ya19jb250ZXh0X2dudSkpOworICAgIH0KKyAgfQorI2VuZGlmCisKKyAgX19rbXBfc2VyaWFsaXplZF9wYXJhbGxlbChsb2MsIGd0aWQpOworCisjaWYgT01QVF9TVVBQT1JUCisgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICBrbXBfaW5mb190ICp0aHIgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworCisgICAgb21wdF90YXNrX2lkX3QgbXlfb21wdF90YXNrX2lkID0gX19vbXB0X3Rhc2tfaWRfbmV3KGd0aWQpOworCisgICAgLy8gc2V0IHVwIGxpZ2h0d2VpZ2h0IHRhc2sKKyAgICBvbXB0X2x3X3Rhc2t0ZWFtX3QgKmx3dCA9CisgICAgICAgIChvbXB0X2x3X3Rhc2t0ZWFtX3QgKilfX2ttcF9hbGxvY2F0ZShzaXplb2Yob21wdF9sd190YXNrdGVhbV90KSk7CisgICAgX19vbXB0X2x3X3Rhc2t0ZWFtX2luaXQobHd0LCB0aHIsIGd0aWQsICh2b2lkICopdGFzaywgb21wdF9wYXJhbGxlbF9pZCk7CisgICAgbHd0LT5vbXB0X3Rhc2tfaW5mby50YXNrX2lkID0gbXlfb21wdF90YXNrX2lkOworICAgIF9fb21wdF9sd190YXNrdGVhbV9saW5rKGx3dCwgdGhyKTsKKworI2lmIE9NUFRfVFJBQ0UKKyAgICAvLyBpbXBsaWNpdCB0YXNrIGNhbGxiYWNrCisgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luKSkgeworICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW4pKAorICAgICAgICAgIG9tcHRfcGFyYWxsZWxfaWQsIG15X29tcHRfdGFza19pZCk7CisgICAgfQorICAgIHRoci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd29ya19wYXJhbGxlbDsKKyNlbmRpZgorICB9CisjZW5kaWYKK30KKwordm9pZCB4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NUQVJUKSh2b2lkICgqdGFzaykodm9pZCAqKSwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtX3RocmVhZHMpIHsKKyAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgb21wdF9mcmFtZV90ICpwYXJlbnRfZnJhbWUsICpmcmFtZTsKKworICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgcGFyZW50X2ZyYW1lID0gX19vbXB0X2dldF90YXNrX2ZyYW1lX2ludGVybmFsKDApOworICAgIHBhcmVudF9mcmFtZS0+cmVlbnRlcl9ydW50aW1lX2ZyYW1lID0gX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMSk7CisgIH0KKyNlbmRpZgorCisgIE1LTE9DKGxvYywgIkdPTVBfcGFyYWxsZWxfc3RhcnQiKTsKKyAgS0FfVFJBQ0UoMjAsICgiR09NUF9wYXJhbGxlbF9zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworCisgIGlmIChfX2ttcGNfb2tfdG9fZm9yaygmbG9jKSAmJiAobnVtX3RocmVhZHMgIT0gMSkpIHsKKyAgICBpZiAobnVtX3RocmVhZHMgIT0gMCkgeworICAgICAgX19rbXBfcHVzaF9udW1fdGhyZWFkcygmbG9jLCBndGlkLCBudW1fdGhyZWFkcyk7CisgICAgfQorICAgIF9fa21wX0dPTVBfZm9ya19jYWxsKCZsb2MsIGd0aWQsIHRhc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgKG1pY3JvdGFza190KV9fa21wX0dPTVBfbWljcm90YXNrX3dyYXBwZXIsIDIsIHRhc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSk7CisgIH0gZWxzZSB7CisgICAgX19rbXBfR09NUF9zZXJpYWxpemVkX3BhcmFsbGVsKCZsb2MsIGd0aWQsIHRhc2spOworICB9CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgIGZyYW1lID0gX19vbXB0X2dldF90YXNrX2ZyYW1lX2ludGVybmFsKDApOworICAgIGZyYW1lLT5leGl0X3J1bnRpbWVfZnJhbWUgPSBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygxKTsKKyAgfQorI2VuZGlmCit9CisKK3ZvaWQgeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9FTkQpKHZvaWQpIHsKKyAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICBrbXBfaW5mb190ICp0aHI7CisKKyAgdGhyID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKworICBNS0xPQyhsb2MsICJHT01QX3BhcmFsbGVsX2VuZCIpOworICBLQV9UUkFDRSgyMCwgKCJHT01QX3BhcmFsbGVsX2VuZDogVCMlZFxuIiwgZ3RpZCkpOworCisjaWYgT01QVF9TVVBQT1JUCisgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZDsKKyAgb21wdF90YXNrX2lkX3Qgc2VyaWFsaXplZF90YXNrX2lkOworICBvbXB0X2ZyYW1lX3QgKm9tcHRfZnJhbWUgPSBOVUxMOworCisgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICBvbXB0X3RlYW1faW5mb190ICp0ZWFtX2luZm8gPSBfX29tcHRfZ2V0X3RlYW1pbmZvKDAsIE5VTEwpOworICAgIHBhcmFsbGVsX2lkID0gdGVhbV9pbmZvLT5wYXJhbGxlbF9pZDsKKworICAgIG9tcHRfdGFza19pbmZvX3QgKnRhc2tfaW5mbyA9IF9fb21wdF9nZXRfdGFza2luZm8oMCk7CisgICAgc2VyaWFsaXplZF90YXNrX2lkID0gdGFza19pbmZvLT50YXNrX2lkOworCisgICAgLy8gdW5saW5rIGlmIG5lY2Vzc2FyeS4gbm8tb3AgaWYgdGhlcmUgaXMgbm90IGEgbGlnaHR3ZWlnaHQgdGFzay4KKyAgICBvbXB0X2x3X3Rhc2t0ZWFtX3QgKmx3dCA9IF9fb21wdF9sd190YXNrdGVhbV91bmxpbmsodGhyKTsKKyAgICAvLyBHT01QIGFsbG9jYXRlcy9mcmVlcyBsd3Qgc2luY2UgaXQgY2FuJ3QgYmUga2VwdCBvbiB0aGUgc3RhY2sKKyAgICBpZiAobHd0KSB7CisgICAgICBfX2ttcF9mcmVlKGx3dCk7CisgICAgfQorICB9CisjZW5kaWYKKworICBpZiAoIXRoci0+dGgudGhfdGVhbS0+dC50X3NlcmlhbGl6ZWQpIHsKKyAgICBfX2ttcF9ydW5fYWZ0ZXJfaW52b2tlZF90YXNrKGd0aWQsIF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCksIHRociwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoci0+dGgudGhfdGVhbSk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAvLyBJbXBsaWNpdCB0YXNrIGlzIGZpbmlzaGVkIGhlcmUsIGluIHRoZSBiYXJyaWVyIHdlIG1pZ2h0IHNjaGVkdWxlCisgICAgICAvLyBkZWZlcnJlZCB0YXNrcywKKyAgICAgIC8vIHRoZXNlIGRvbid0IHNlZSB0aGUgaW1wbGljaXQgdGFzayBvbiB0aGUgc3RhY2sKKyAgICAgIG9tcHRfZnJhbWUgPSBfX29tcHRfZ2V0X3Rhc2tfZnJhbWVfaW50ZXJuYWwoMCk7CisgICAgICBvbXB0X2ZyYW1lLT5leGl0X3J1bnRpbWVfZnJhbWUgPSBOVUxMOworICAgIH0KKyNlbmRpZgorCisgICAgX19rbXBfam9pbl9jYWxsKCZsb2MsIGd0aWQKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAgICBmb3JrX2NvbnRleHRfZ251CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgfSBlbHNlIHsKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kKSkgeworICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kKSgKKyAgICAgICAgICBwYXJhbGxlbF9pZCwgc2VyaWFsaXplZF90YXNrX2lkKTsKKyAgICB9CisjZW5kaWYKKworICAgIF9fa21wY19lbmRfc2VyaWFsaXplZF9wYXJhbGxlbCgmbG9jLCBndGlkKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgIC8vIFJlY29yZCB0aGF0IHdlIHJlLWVudGVyZWQgdGhlIHJ1bnRpbWUgc3lzdGVtIGluIHRoZSBmcmFtZSB0aGF0CisgICAgICAvLyBjcmVhdGVkIHRoZSBwYXJhbGxlbCByZWdpb24uCisgICAgICBvbXB0X3Rhc2tfaW5mb190ICpwYXJlbnRfdGFza19pbmZvID0gX19vbXB0X2dldF90YXNraW5mbygwKTsKKworICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9wYXJhbGxlbF9lbmQpKSB7CisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9wYXJhbGxlbF9lbmQpKAorICAgICAgICAgICAgcGFyYWxsZWxfaWQsIHBhcmVudF90YXNrX2luZm8tPnRhc2tfaWQsCisgICAgICAgICAgICBPTVBUX0lOVk9LRVIoZm9ya19jb250ZXh0X2dudSkpOworICAgICAgfQorCisgICAgICBwYXJlbnRfdGFza19pbmZvLT5mcmFtZS5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSBOVUxMOworCisgICAgICB0aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPQorICAgICAgICAgICgoKHRoci0+dGgudGhfdGVhbSktPnQudF9zZXJpYWxpemVkKSA/IG9tcHRfc3RhdGVfd29ya19zZXJpYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWwpOworICAgIH0KKyNlbmRpZgorICB9Cit9CisKKy8vIExvb3Agd29ya3NoYXJpbmcgY29uc3RydWN0cworCisvLyBUaGUgR251IGNvZGVnZW4gcGFzc2VzIGluIGFuIGV4Y2x1c2l2ZSB1cHBlciBib3VuZCBmb3IgdGhlIG92ZXJhbGwgcmFuZ2UsCisvLyBidXQgdGhlIGxpYmd1aWRlIGRpc3BhdGNoIGNvZGUgZXhwZWN0cyBhbiBpbmNsdXNpdmUgdXBwZXIgYm91bmQsIGhlbmNlIHRoZQorLy8gImVuZCAtIGluY3IiIDV0aCBhcmd1bWVudCB0byBLTVBfRElTUEFUQ0hfSU5JVCAoYW5kIHRoZSAiIHViIC0gc3RyIiAxMXRoCisvLyBhcmd1bWVudCB0byBfX2ttcF9HT01QX2ZvcmtfY2FsbCkuCisvLworLy8gQ29udmVyc2VseSwgS01QX0RJU1BBVENIX05FWFQgcmV0dXJucyBhbmQgaW5jbHVzaXZlIHVwcGVyIGJvdW5kIGluICpwX3ViLAorLy8gYnV0IHRoZSBHbnUgY29kZWdlbiBleHBlY3RzIGFuIGV4Y2x1c2lkZSB1cHBlciBib3VuZCwgc28gdGhlIGFkanVzdG1lbnQKKy8vICIqcF91YiArPSBzdHJpZGUiIGNvbXBlbnN0YXRlcyBmb3IgdGhlIGRpc2NyZXBhbmN5LgorLy8KKy8vIENvcnJlY3Rpb246IHRoZSBnbnUgY29kZWdlbiBhbHdheXMgYWRqdXN0cyB0aGUgdXBwZXIgYm91bmQgYnkgKy0xLCBub3QgdGhlCisvLyBzdHJpZGUgdmFsdWUuICBXZSBhZGp1c3QgdGhlIGRpc3BhdGNoIHBhcmFtZXRlcnMgYWNjb3JkaW5nbHkgKGJ5ICstMSksIGJ1dAorLy8gd2Ugc3RpbGwgYWRqdXN0IHBfdWIgYnkgdGhlIGFjdHVhbCBzdHJpZGUgdmFsdWUuCisvLworLy8gVGhlICJydW50aW1lIiB2ZXJzaW9ucyBkbyBub3QgdGFrZSBhIGNodW5rX3N6IHBhcmFtZXRlci4KKy8vCisvLyBUaGUgcHJvZmlsZSBsaWIgY2Fubm90IHN1cHBvcnQgY29uc3RydWN0IGNoZWNraW5nIG9mIHVub3JkZXJlZCBsb29wcyB0aGF0CisvLyBhcmUgcHJlZGV0ZXJtaW5lZCBieSB0aGUgY29tcGlsZXIgdG8gYmUgc3RhdGljYWxseSBzY2hlZHVsZWQsIGFzIHRoZSBnY2MKKy8vIGNvZGVnZW4gd2lsbCBub3QgYWx3YXlzIGVtaXQgY2FsbHMgdG8gR09NUF9sb29wX3N0YXRpY19uZXh0KCkgdG8gZ2V0IHRoZQorLy8gbmV4dCBpdGVyYXRpb24uICBJbnN0ZWFkLCBpdCBlbWl0cyBpbmxpbmUgY29kZSB0byBjYWxsIG9tcF9nZXRfdGhyZWFkX251bSgpCisvLyBudW0gYW5kIGNhbGN1bGF0ZSB0aGUgaXRlcmF0aW9uIHNwYWNlIHVzaW5nIHRoZSByZXN1bHQuICBJdCBkb2Vzbid0IGRvIHRoaXMKKy8vIHdpdGggb3JkZXJlZCBzdGF0aWMgbG9vcCwgc28gdGhleSBjYW4gYmUgY2hlY2tlZC4KKworI2RlZmluZSBMT09QX1NUQVJUKGZ1bmMsIHNjaGVkdWxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IGZ1bmMobG9uZyBsYiwgbG9uZyB1YiwgbG9uZyBzdHIsIGxvbmcgY2h1bmtfc3osIGxvbmcgKnBfbGIsICAgICAgICAgICAgICBcCisgICAgICAgICAgIGxvbmcgKnBfdWIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBsb25nIHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1LTE9DKGxvYywgI2Z1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLQV9UUkFDRSgyMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKCNmdW5jICI6IFQjJWQsIGxiIDB4JWx4LCB1YiAweCVseCwgc3RyIDB4JWx4LCBjaHVua19zeiAweCVseFxuIiwgXAorICAgICAgICAgICAgICBndGlkLCBsYiwgdWIsIHN0ciwgY2h1bmtfc3opKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChzdHIgPiAwKSA/IChsYiA8IHViKSA6IChsYiA+IHViKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgS01QX0RJU1BBVENIX0lOSVQoJmxvYywgZ3RpZCwgKHNjaGVkdWxlKSwgbGIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChzdHIgPiAwKSA/ICh1YiAtIDEpIDogKHViICsgMSksIHN0ciwgY2h1bmtfc3osICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoc2NoZWR1bGUpICE9IGttcF9zY2hfc3RhdGljKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc3RhdHVzID0gS01QX0RJU1BBVENIX05FWFQoJmxvYywgZ3RpZCwgTlVMTCwgKGttcF9pbnQgKilwX2xiLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrbXBfaW50ICopcF91YiwgKGttcF9pbnQgKikmc3RyaWRlKTsgICAgICAgICBcCisgICAgICBpZiAoc3RhdHVzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHN0cmlkZSA9PSBzdHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKnBfdWIgKz0gKHN0ciA+IDApID8gMSA6IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN0YXR1cyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLQV9UUkFDRSgyMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKCNmdW5jICIgZXhpdDogVCMlZCwgKnBfbGIgMHglbHgsICpwX3ViIDB4JWx4LCByZXR1cm5pbmcgJWRcbiIsICAgXAorICAgICAgICAgICAgICBndGlkLCAqcF9sYiwgKnBfdWIsIHN0YXR1cykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBMT09QX1JVTlRJTUVfU1RBUlQoZnVuYywgc2NoZWR1bGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IGZ1bmMobG9uZyBsYiwgbG9uZyB1YiwgbG9uZyBzdHIsIGxvbmcgKnBfbGIsIGxvbmcgKnBfdWIpIHsgICAgICAgICAgICAgICBcCisgICAgaW50IHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGxvbmcgc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBsb25nIGNodW5rX3N6ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1LTE9DKGxvYywgI2Z1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLQV9UUkFDRSgyMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKCNmdW5jICI6IFQjJWQsIGxiIDB4JWx4LCB1YiAweCVseCwgc3RyIDB4JWx4LCBjaHVua19zeiAlZFxuIiwgICAgXAorICAgICAgICAgICAgICBndGlkLCBsYiwgdWIsIHN0ciwgY2h1bmtfc3opKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChzdHIgPiAwKSA/IChsYiA8IHViKSA6IChsYiA+IHViKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgS01QX0RJU1BBVENIX0lOSVQoJmxvYywgZ3RpZCwgKHNjaGVkdWxlKSwgbGIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChzdHIgPiAwKSA/ICh1YiAtIDEpIDogKHViICsgMSksIHN0ciwgY2h1bmtfc3osIFRSVUUpOyBcCisgICAgICBzdGF0dXMgPSBLTVBfRElTUEFUQ0hfTkVYVCgmbG9jLCBndGlkLCBOVUxMLCAoa21wX2ludCAqKXBfbGIsICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGttcF9pbnQgKilwX3ViLCAoa21wX2ludCAqKSZzdHJpZGUpOyAgICAgICAgIFwKKyAgICAgIGlmIChzdGF0dXMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoc3RyaWRlID09IHN0cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAqcF91YiArPSAoc3RyID4gMCkgPyAxIDogLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc3RhdHVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtBX1RSQUNFKDIwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAoI2Z1bmMgIiBleGl0OiBUIyVkLCAqcF9sYiAweCVseCwgKnBfdWIgMHglbHgsIHJldHVybmluZyAlZFxuIiwgICBcCisgICAgICAgICAgICAgIGd0aWQsICpwX2xiLCAqcF91Yiwgc3RhdHVzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIExPT1BfTkVYVChmdW5jLCBmaW5pX2NvZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgZnVuYyhsb25nICpwX2xiLCBsb25nICpwX3ViKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbG9uZyBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNS0xPQyhsb2MsICNmdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS0FfVFJBQ0UoMjAsICgjZnVuYyAiOiBUIyVkXG4iLCBndGlkKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmaW5pX2NvZGUgc3RhdHVzID0gS01QX0RJU1BBVENIX05FWFQoJmxvYywgZ3RpZCwgTlVMTCwgKGttcF9pbnQgKilwX2xiLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrbXBfaW50ICopcF91YiwgKGttcF9pbnQgKikmc3RyaWRlKTsgXAorICAgIGlmIChzdGF0dXMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICpwX3ViICs9IChzdHJpZGUgPiAwKSA/IDEgOiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLQV9UUkFDRSgyMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKCNmdW5jICIgZXhpdDogVCMlZCwgKnBfbGIgMHglbHgsICpwX3ViIDB4JWx4LCBzdHJpZGUgMHglbHgsICIgICAgXAorICAgICAgICAgICAgICAgICAgICAicmV0dXJuaW5nICVkXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgZ3RpZCwgKnBfbGIsICpwX3ViLCBzdHJpZGUsIHN0YXR1cykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKK0xPT1BfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1NUQVRJQ19TVEFSVCksIGttcF9zY2hfc3RhdGljKQorTE9PUF9ORVhUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9TVEFUSUNfTkVYVCksIHt9KQorTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRFlOQU1JQ19TVEFSVCksCisgICAgICAgICAgIGttcF9zY2hfZHluYW1pY19jaHVua2VkKQorTE9PUF9ORVhUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9EWU5BTUlDX05FWFQpLCB7fSkKK0xPT1BfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX0dVSURFRF9TVEFSVCksIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQpCitMT09QX05FWFQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX0dVSURFRF9ORVhUKSwge30pCitMT09QX1JVTlRJTUVfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1JVTlRJTUVfU1RBUlQpLAorICAgICAgICAgICAgICAgICAgIGttcF9zY2hfcnVudGltZSkKK0xPT1BfTkVYVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfUlVOVElNRV9ORVhUKSwge30pCisKK0xPT1BfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfU1RBVElDX1NUQVJUKSwga21wX29yZF9zdGF0aWMpCitMT09QX05FWFQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfU1RBVElDX05FWFQpLAorICAgICAgICAgIHsgS01QX0RJU1BBVENIX0ZJTklfQ0hVTksoJmxvYywgZ3RpZCk7IH0pCitMT09QX1NUQVJUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0RZTkFNSUNfU1RBUlQpLAorICAgICAgICAgICBrbXBfb3JkX2R5bmFtaWNfY2h1bmtlZCkKK0xPT1BfTkVYVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9EWU5BTUlDX05FWFQpLAorICAgICAgICAgIHsgS01QX0RJU1BBVENIX0ZJTklfQ0hVTksoJmxvYywgZ3RpZCk7IH0pCitMT09QX1NUQVJUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0dVSURFRF9TVEFSVCksCisgICAgICAgICAgIGttcF9vcmRfZ3VpZGVkX2NodW5rZWQpCitMT09QX05FWFQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfR1VJREVEX05FWFQpLAorICAgICAgICAgIHsgS01QX0RJU1BBVENIX0ZJTklfQ0hVTksoJmxvYywgZ3RpZCk7IH0pCitMT09QX1JVTlRJTUVfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfUlVOVElNRV9TVEFSVCksCisgICAgICAgICAgICAgICAgICAga21wX29yZF9ydW50aW1lKQorTE9PUF9ORVhUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1JVTlRJTUVfTkVYVCksCisgICAgICAgICAgeyBLTVBfRElTUEFUQ0hfRklOSV9DSFVOSygmbG9jLCBndGlkKTsgfSkKKwordm9pZCB4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5EKSh2b2lkKSB7CisgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgS0FfVFJBQ0UoMjAsICgiR09NUF9sb29wX2VuZDogVCMlZFxuIiwgZ3RpZCkpCisKKyAgX19rbXBfYmFycmllcihic19wbGFpbl9iYXJyaWVyLCBndGlkLCBGQUxTRSwgMCwgTlVMTCwgTlVMTCk7CisKKyAgS0FfVFJBQ0UoMjAsICgiR09NUF9sb29wX2VuZCBleGl0OiBUIyVkXG4iLCBndGlkKSkKK30KKwordm9pZCB4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5EX05PV0FJVCkodm9pZCkgeworICBLQV9UUkFDRSgyMCwgKCJHT01QX2xvb3BfZW5kX25vd2FpdDogVCMlZFxuIiwgX19rbXBfZ2V0X2d0aWQoKSkpCit9CisKKy8vIFVuc2lnbmVkIGxvbmcgbG9uZyBsb29wIHdvcmtzaGFyaW5nIGNvbnN0cnVjdHMKKy8vCisvLyBUaGVzZSBhcmUgbmV3IHdpdGggZ2NjIDQuNAorCisjZGVmaW5lIExPT1BfU1RBUlRfVUxMKGZ1bmMsIHNjaGVkdWxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgZnVuYyhpbnQgdXAsIHVuc2lnbmVkIGxvbmcgbG9uZyBsYiwgdW5zaWduZWQgbG9uZyBsb25nIHViLCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHN0ciwgdW5zaWduZWQgbG9uZyBsb25nIGNodW5rX3N6LCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAqcF9sYiwgdW5zaWduZWQgbG9uZyBsb25nICpwX3ViKSB7ICAgICAgICAgICAgICAgXAorICAgIGludCBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBsb25nIGxvbmcgc3RyMiA9IHVwID8gKChsb25nIGxvbmcpc3RyKSA6IC0oKGxvbmcgbG9uZylzdHIpOyAgICAgICAgICAgICAgICBcCisgICAgbG9uZyBsb25nIHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNS0xPQyhsb2MsICNmdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtBX1RSQUNFKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgMjAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgjZnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIjogVCMlZCwgdXAgJWQsIGxiIDB4JWxseCwgdWIgMHglbGx4LCBzdHIgMHglbGx4LCBjaHVua19zeiAweCVsbHhcbiIsIFwKKyAgICAgICAgIGd0aWQsIHVwLCBsYiwgdWIsIHN0ciwgY2h1bmtfc3opKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoc3RyID4gMCkgPyAobGIgPCB1YikgOiAobGIgPiB1YikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEtNUF9ESVNQQVRDSF9JTklUX1VMTCgmbG9jLCBndGlkLCAoc2NoZWR1bGUpLCBsYiwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cjIgPiAwKSA/ICh1YiAtIDEpIDogKHViICsgMSksIHN0cjIsIGNodW5rX3N6LCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzY2hlZHVsZSkgIT0ga21wX3NjaF9zdGF0aWMpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN0YXR1cyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgS01QX0RJU1BBVENIX05FWFRfVUxMKCZsb2MsIGd0aWQsIE5VTEwsIChrbXBfdWludDY0ICopcF9sYiwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa21wX3VpbnQ2NCAqKXBfdWIsIChrbXBfaW50NjQgKikmc3RyaWRlKTsgICAgIFwKKyAgICAgIGlmIChzdGF0dXMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoc3RyaWRlID09IHN0cjIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAqcF91YiArPSAoc3RyID4gMCkgPyAxIDogLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgc3RhdHVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtBX1RSQUNFKDIwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAoI2Z1bmMgIiBleGl0OiBUIyVkLCAqcF9sYiAweCVsbHgsICpwX3ViIDB4JWxseCwgcmV0dXJuaW5nICVkXG4iLCBcCisgICAgICAgICAgICAgIGd0aWQsICpwX2xiLCAqcF91Yiwgc3RhdHVzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIExPT1BfUlVOVElNRV9TVEFSVF9VTEwoZnVuYywgc2NoZWR1bGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgZnVuYyhpbnQgdXAsIHVuc2lnbmVkIGxvbmcgbG9uZyBsYiwgdW5zaWduZWQgbG9uZyBsb25nIHViLCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHN0ciwgdW5zaWduZWQgbG9uZyBsb25nICpwX2xiLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAqcF91YikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBsb25nIGxvbmcgc3RyMiA9IHVwID8gKChsb25nIGxvbmcpc3RyKSA6IC0oKGxvbmcgbG9uZylzdHIpOyAgICAgICAgICAgICAgICBcCisgICAgdW5zaWduZWQgbG9uZyBsb25nIHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBjaHVua19zeiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTUtMT0MobG9jLCAjZnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLQV9UUkFDRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDIwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoI2Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICI6IFQjJWQsIHVwICVkLCBsYiAweCVsbHgsIHViIDB4JWxseCwgc3RyIDB4JWxseCwgY2h1bmtfc3ogMHglbGx4XG4iLCBcCisgICAgICAgICBndGlkLCB1cCwgbGIsIHViLCBzdHIsIGNodW5rX3N6KSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKHN0ciA+IDApID8gKGxiIDwgdWIpIDogKGxiID4gdWIpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBLTVBfRElTUEFUQ0hfSU5JVF9VTEwoJmxvYywgZ3RpZCwgKHNjaGVkdWxlKSwgbGIsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHIyID4gMCkgPyAodWIgLSAxKSA6ICh1YiArIDEpLCBzdHIyLCBjaHVua19zeiwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdGF0dXMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIEtNUF9ESVNQQVRDSF9ORVhUX1VMTCgmbG9jLCBndGlkLCBOVUxMLCAoa21wX3VpbnQ2NCAqKXBfbGIsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGttcF91aW50NjQgKilwX3ViLCAoa21wX2ludDY0ICopJnN0cmlkZSk7ICAgICBcCisgICAgICBpZiAoc3RhdHVzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKChsb25nIGxvbmcpc3RyaWRlID09IHN0cjIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKnBfdWIgKz0gKHN0ciA+IDApID8gMSA6IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN0YXR1cyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLQV9UUkFDRSgyMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgKCNmdW5jICIgZXhpdDogVCMlZCwgKnBfbGIgMHglbGx4LCAqcF91YiAweCVsbHgsIHJldHVybmluZyAlZFxuIiwgXAorICAgICAgICAgICAgICBndGlkLCAqcF9sYiwgKnBfdWIsIHN0YXR1cykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBMT09QX05FWFRfVUxMKGZ1bmMsIGZpbmlfY29kZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IGZ1bmModW5zaWduZWQgbG9uZyBsb25nICpwX2xiLCB1bnNpZ25lZCBsb25nIGxvbmcgKnBfdWIpIHsgICAgICAgICAgICAgICBcCisgICAgaW50IHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGxvbmcgbG9uZyBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTUtMT0MobG9jLCAjZnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtBX1RSQUNFKDIwLCAoI2Z1bmMgIjogVCMlZFxuIiwgZ3RpZCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmluaV9jb2RlIHN0YXR1cyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfRElTUEFUQ0hfTkVYVF9VTEwoJmxvYywgZ3RpZCwgTlVMTCwgKGttcF91aW50NjQgKilwX2xiLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrbXBfdWludDY0ICopcF91YiwgKGttcF9pbnQ2NCAqKSZzdHJpZGUpOyAgICAgICBcCisgICAgaWYgKHN0YXR1cykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKnBfdWIgKz0gKHN0cmlkZSA+IDApID8gMSA6IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtBX1RSQUNFKDIwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAoI2Z1bmMgIiBleGl0OiBUIyVkLCAqcF9sYiAweCVsbHgsICpwX3ViIDB4JWxseCwgc3RyaWRlIDB4JWxseCwgIiBcCisgICAgICAgICAgICAgICAgICAgICJyZXR1cm5pbmcgJWRcbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBndGlkLCAqcF9sYiwgKnBfdWIsIHN0cmlkZSwgc3RhdHVzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworTE9PUF9TVEFSVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9TVEFUSUNfU1RBUlQpLCBrbXBfc2NoX3N0YXRpYykKK0xPT1BfTkVYVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9TVEFUSUNfTkVYVCksIHt9KQorTE9PUF9TVEFSVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9EWU5BTUlDX1NUQVJUKSwKKyAgICAgICAgICAgICAgIGttcF9zY2hfZHluYW1pY19jaHVua2VkKQorTE9PUF9ORVhUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0RZTkFNSUNfTkVYVCksIHt9KQorTE9PUF9TVEFSVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9HVUlERURfU1RBUlQpLAorICAgICAgICAgICAgICAga21wX3NjaF9ndWlkZWRfY2h1bmtlZCkKK0xPT1BfTkVYVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9HVUlERURfTkVYVCksIHt9KQorTE9PUF9SVU5USU1FX1NUQVJUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1JVTlRJTUVfU1RBUlQpLAorICAgICAgICAgICAgICAgICAgICAgICBrbXBfc2NoX3J1bnRpbWUpCitMT09QX05FWFRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfUlVOVElNRV9ORVhUKSwge30pCisKK0xPT1BfU1RBUlRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9TVEFUSUNfU1RBUlQpLAorICAgICAgICAgICAgICAga21wX29yZF9zdGF0aWMpCitMT09QX05FWFRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9TVEFUSUNfTkVYVCksCisgICAgICAgICAgICAgIHsgS01QX0RJU1BBVENIX0ZJTklfQ0hVTktfVUxMKCZsb2MsIGd0aWQpOyB9KQorTE9PUF9TVEFSVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0RZTkFNSUNfU1RBUlQpLAorICAgICAgICAgICAgICAga21wX29yZF9keW5hbWljX2NodW5rZWQpCitMT09QX05FWFRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9EWU5BTUlDX05FWFQpLAorICAgICAgICAgICAgICB7IEtNUF9ESVNQQVRDSF9GSU5JX0NIVU5LX1VMTCgmbG9jLCBndGlkKTsgfSkKK0xPT1BfU1RBUlRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9HVUlERURfU1RBUlQpLAorICAgICAgICAgICAgICAga21wX29yZF9ndWlkZWRfY2h1bmtlZCkKK0xPT1BfTkVYVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0dVSURFRF9ORVhUKSwKKyAgICAgICAgICAgICAgeyBLTVBfRElTUEFUQ0hfRklOSV9DSFVOS19VTEwoJmxvYywgZ3RpZCk7IH0pCitMT09QX1JVTlRJTUVfU1RBUlRfVUxMKAorICAgIHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9SVU5USU1FX1NUQVJUKSwga21wX29yZF9ydW50aW1lKQorTE9PUF9ORVhUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfUlVOVElNRV9ORVhUKSwKKyAgICAgICAgICAgICAgeyBLTVBfRElTUEFUQ0hfRklOSV9DSFVOS19VTEwoJmxvYywgZ3RpZCk7IH0pCisKKy8vIENvbWJpbmVkIHBhcmFsbGVsIC8gbG9vcCB3b3Jrc2hhcmluZyBjb25zdHJ1Y3RzCisvLworLy8gVGhlcmUgYXJlIG5vIHVsbCB2ZXJzaW9ucyAoeWV0KS4KKworI2RlZmluZSBQQVJBTExFTF9MT09QX1NUQVJUKGZ1bmMsIHNjaGVkdWxlLCBvbXB0X3ByZSwgb21wdF9wb3N0KSAgICAgICAgICAgICAgIFwKKyAgdm9pZCBmdW5jKHZvaWQgKCp0YXNrKSh2b2lkICopLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBudW1fdGhyZWFkcywgbG9uZyBsYiwgICBcCisgICAgICAgICAgICBsb25nIHViLCBsb25nIHN0ciwgbG9uZyBjaHVua19zeikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNS0xPQyhsb2MsICNmdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS0FfVFJBQ0UoMjAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICgjZnVuYyAiOiBUIyVkLCBsYiAweCVseCwgdWIgMHglbHgsIHN0ciAweCVseCwgY2h1bmtfc3ogMHglbHhcbiIsIFwKKyAgICAgICAgICAgICAgZ3RpZCwgbGIsIHViLCBzdHIsIGNodW5rX3N6KSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG9tcHRfcHJlKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKF9fa21wY19va190b19mb3JrKCZsb2MpICYmIChudW1fdGhyZWFkcyAhPSAxKSkgeyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKG51bV90aHJlYWRzICE9IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19rbXBfcHVzaF9udW1fdGhyZWFkcygmbG9jLCBndGlkLCBudW1fdGhyZWFkcyk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX19rbXBfR09NUF9mb3JrX2NhbGwoJmxvYywgZ3RpZCwgdGFzaywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChtaWNyb3Rhc2tfdClfX2ttcF9HT01QX3BhcmFsbGVsX21pY3JvdGFza193cmFwcGVyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICA5LCB0YXNrLCBkYXRhLCBudW1fdGhyZWFkcywgJmxvYywgKHNjaGVkdWxlKSwgbGIsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0ciA+IDApID8gKHViIC0gMSkgOiAodWIgKyAxKSwgc3RyLCBjaHVua19zeik7ICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBfX2ttcF9HT01QX3NlcmlhbGl6ZWRfcGFyYWxsZWwoJmxvYywgZ3RpZCwgdGFzayk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0RJU1BBVENIX0lOSVQoJmxvYywgZ3RpZCwgKHNjaGVkdWxlKSwgbGIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIChzdHIgPiAwKSA/ICh1YiAtIDEpIDogKHViICsgMSksIHN0ciwgY2h1bmtfc3osICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAoc2NoZWR1bGUpICE9IGttcF9zY2hfc3RhdGljKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG9tcHRfcG9zdCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS0FfVFJBQ0UoMjAsICgjZnVuYyAiIGV4aXQ6IFQjJWRcbiIsIGd0aWQpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNpZiBPTVBUX1NVUFBPUlQKKworI2RlZmluZSBPTVBUX0xPT1BfUFJFKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb21wdF9mcmFtZV90ICpwYXJlbnRfZnJhbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChvbXB0X2VuYWJsZWQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHBhcmVudF9mcmFtZSA9IF9fb21wdF9nZXRfdGFza19mcmFtZV9pbnRlcm5hbCgwKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwYXJlbnRfZnJhbWUtPnJlZW50ZXJfcnVudGltZV9mcmFtZSA9IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDEpOyAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBPTVBUX0xPT1BfUE9TVCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKG9tcHRfZW5hYmxlZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcGFyZW50X2ZyYW1lLT5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNlbHNlCisKKyNkZWZpbmUgT01QVF9MT09QX1BSRSgpCisKKyNkZWZpbmUgT01QVF9MT09QX1BPU1QoKQorCisjZW5kaWYKKworUEFSQUxMRUxfTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfU1RBVElDX1NUQVJUKSwKKyAgICAgICAgICAgICAgICAgICAga21wX3NjaF9zdGF0aWMsIE9NUFRfTE9PUF9QUkUsIE9NUFRfTE9PUF9QT1NUKQorUEFSQUxMRUxfTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfRFlOQU1JQ19TVEFSVCksCisgICAgICAgICAgICAgICAgICAgIGttcF9zY2hfZHluYW1pY19jaHVua2VkLCBPTVBUX0xPT1BfUFJFLCBPTVBUX0xPT1BfUE9TVCkKK1BBUkFMTEVMX0xPT1BfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0dVSURFRF9TVEFSVCksCisgICAgICAgICAgICAgICAgICAgIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQsIE9NUFRfTE9PUF9QUkUsIE9NUFRfTE9PUF9QT1NUKQorUEFSQUxMRUxfTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfUlVOVElNRV9TVEFSVCksCisgICAgICAgICAgICAgICAgICAgIGttcF9zY2hfcnVudGltZSwgT01QVF9MT09QX1BSRSwgT01QVF9MT09QX1BPU1QpCisKKy8vIFRhc2tpbmcgY29uc3RydWN0cworCit2b2lkIHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfVEFTSykodm9pZCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmNvcHlfZnVuYykodm9pZCAqLCB2b2lkICopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgYXJnX3NpemUsIGxvbmcgYXJnX2FsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaWZfY29uZCwgdW5zaWduZWQgZ29tcF9mbGFncworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipkZXBlbmQKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgeworICBNS0xPQyhsb2MsICJHT01QX3Rhc2siKTsKKyAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgIGttcF9pbnQzMiBmbGFncyA9IDA7CisgIGttcF90YXNraW5nX2ZsYWdzX3QgKmlucHV0X2ZsYWdzID0gKGttcF90YXNraW5nX2ZsYWdzX3QgKikmZmxhZ3M7CisKKyAgS0FfVFJBQ0UoMjAsICgiR09NUF90YXNrOiBUIyVkXG4iLCBndGlkKSk7CisKKyAgLy8gVGhlIGxvdy1vcmRlciBiaXQgaXMgdGhlICJ1bnRpZWQiIGZsYWcKKyAgaWYgKCEoZ29tcF9mbGFncyAmIDEpKSB7CisgICAgaW5wdXRfZmxhZ3MtPnRpZWRuZXNzID0gMTsKKyAgfQorICAvLyBUaGUgc2Vjb25kIGxvdy1vcmRlciBiaXQgaXMgdGhlICJmaW5hbCIgZmxhZworICBpZiAoZ29tcF9mbGFncyAmIDIpIHsKKyAgICBpbnB1dF9mbGFncy0+ZmluYWwgPSAxOworICB9CisgIGlucHV0X2ZsYWdzLT5uYXRpdmUgPSAxOworICAvLyBfX2ttcF90YXNrX2FsbG9jKCkgc2V0cyB1cCBhbGwgb3RoZXIgZmxhZ3MKKworICBpZiAoIWlmX2NvbmQpIHsKKyAgICBhcmdfc2l6ZSA9IDA7CisgIH0KKworICBrbXBfdGFza190ICp0YXNrID0gX19rbXBfdGFza19hbGxvYygKKyAgICAgICZsb2MsIGd0aWQsIGlucHV0X2ZsYWdzLCBzaXplb2Yoa21wX3Rhc2tfdCksCisgICAgICBhcmdfc2l6ZSA/IGFyZ19zaXplICsgYXJnX2FsaWduIC0gMSA6IDAsIChrbXBfcm91dGluZV9lbnRyeV90KWZ1bmMpOworCisgIGlmIChhcmdfc2l6ZSA+IDApIHsKKyAgICBpZiAoYXJnX2FsaWduID4gMCkgeworICAgICAgdGFzay0+c2hhcmVkcyA9ICh2b2lkICopKCgoKHNpemVfdCl0YXNrLT5zaGFyZWRzKSArIGFyZ19hbGlnbiAtIDEpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdfYWxpZ24gKiBhcmdfYWxpZ24pOworICAgIH0KKyAgICAvLyBlbHNlIGVycm9yPz8KKworICAgIGlmIChjb3B5X2Z1bmMpIHsKKyAgICAgICgqY29weV9mdW5jKSh0YXNrLT5zaGFyZWRzLCBkYXRhKTsKKyAgICB9IGVsc2UgeworICAgICAgS01QX01FTUNQWSh0YXNrLT5zaGFyZWRzLCBkYXRhLCBhcmdfc2l6ZSk7CisgICAgfQorICB9CisKKyAgaWYgKGlmX2NvbmQpIHsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmIChnb21wX2ZsYWdzICYgOCkgeworICAgICAgS01QX0FTU0VSVChkZXBlbmQpOworICAgICAgY29uc3Qgc2l6ZV90IG5kZXBzID0gKGttcF9pbnRwdHJfdClkZXBlbmRbMF07CisgICAgICBjb25zdCBzaXplX3Qgbm91dCA9IChrbXBfaW50cHRyX3QpZGVwZW5kWzFdOworICAgICAga21wX2RlcGVuZF9pbmZvX3QgZGVwX2xpc3RbbmRlcHNdOworCisgICAgICBmb3IgKHNpemVfdCBpID0gMFU7IGkgPCBuZGVwczsgaSsrKSB7CisgICAgICAgIGRlcF9saXN0W2ldLmJhc2VfYWRkciA9IChrbXBfaW50cHRyX3QpZGVwZW5kWzJVICsgaV07CisgICAgICAgIGRlcF9saXN0W2ldLmxlbiA9IDBVOworICAgICAgICBkZXBfbGlzdFtpXS5mbGFncy5pbiA9IDE7CisgICAgICAgIGRlcF9saXN0W2ldLmZsYWdzLm91dCA9IChpIDwgbm91dCk7CisgICAgICB9CisgICAgICBfX2ttcGNfb21wX3Rhc2tfd2l0aF9kZXBzKCZsb2MsIGd0aWQsIHRhc2ssIG5kZXBzLCBkZXBfbGlzdCwgMCwgTlVMTCk7CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgIF9fa21wY19vbXBfdGFzaygmbG9jLCBndGlkLCB0YXNrKTsKKyAgfSBlbHNlIHsKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBvbXB0X3RocmVhZF9pbmZvX3Qgb2xkSW5mbzsKKyAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisgICAga21wX3Rhc2tkYXRhX3QgKnRhc2tkYXRhOworICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgIC8vIFN0b3JlIHRoZSB0aHJlYWRzIHN0YXRlcyBhbmQgcmVzdG9yZSB0aGVtIGFmdGVyIHRoZSB0YXNrCisgICAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICAgICAgdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKTsKKyAgICAgIG9sZEluZm8gPSB0aHJlYWQtPnRoLm9tcHRfdGhyZWFkX2luZm87CisgICAgICB0aHJlYWQtPnRoLm9tcHRfdGhyZWFkX2luZm8ud2FpdF9pZCA9IDA7CisgICAgICB0aHJlYWQtPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWw7CisgICAgICB0YXNrZGF0YS0+b21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lID0KKyAgICAgICAgICBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKTsKKyAgICB9CisjZW5kaWYKKworICAgIF9fa21wY19vbXBfdGFza19iZWdpbl9pZjAoJmxvYywgZ3RpZCwgdGFzayk7CisgICAgZnVuYyhkYXRhKTsKKyAgICBfX2ttcGNfb21wX3Rhc2tfY29tcGxldGVfaWYwKCZsb2MsIGd0aWQsIHRhc2spOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgdGhyZWFkLT50aC5vbXB0X3RocmVhZF9pbmZvID0gb2xkSW5mbzsKKyAgICAgIHRhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby5mcmFtZS5leGl0X3J1bnRpbWVfZnJhbWUgPSBOVUxMOworICAgIH0KKyNlbmRpZgorICB9CisKKyAgS0FfVFJBQ0UoMjAsICgiR09NUF90YXNrIGV4aXQ6IFQjJWRcbiIsIGd0aWQpKTsKK30KKwordm9pZCB4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1RBU0tXQUlUKSh2b2lkKSB7CisgIE1LTE9DKGxvYywgIkdPTVBfdGFza3dhaXQiKTsKKyAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisKKyAgS0FfVFJBQ0UoMjAsICgiR09NUF90YXNrd2FpdDogVCMlZFxuIiwgZ3RpZCkpOworCisgIF9fa21wY19vbXBfdGFza3dhaXQoJmxvYywgZ3RpZCk7CisKKyAgS0FfVFJBQ0UoMjAsICgiR09NUF90YXNrd2FpdCBleGl0OiBUIyVkXG4iLCBndGlkKSk7Cit9CisKKy8vIFNlY3Rpb25zIHdvcmtzaGFyaW5nIGNvbnN0cnVjdHMKKy8vCisvLyBGb3IgdGhlIHNlY3Rpb25zIGNvbnN0cnVjdCwgd2UgaW5pdGlhbGl6ZSBhIGR5bmFtaWNhbGx5IHNjaGVkdWxlZCBsb29wCisvLyB3b3Jrc2hhcmluZyBjb25zdHJ1Y3Qgd2l0aCBsYiAxIGFuZCBzdHJpZGUgMSwgYW5kIHVzZSB0aGUgaXRlcmF0aW9uICMncworLy8gdGhhdCBpdHMgcmV0dXJucyBhcyBzZWN0aW9ucyBpZHMuCisvLworLy8gVGhlcmUgYXJlIG5vIHNwZWNpYWwgZW50cnkgcG9pbnRzIGZvciBvcmRlcmVkIHNlY3Rpb25zLCBzbyB3ZSBhbHdheXMgdXNlCisvLyB0aGUgZHluYW1pY2FsbHkgc2NoZWR1bGVkIHdvcmtzaGFyZSwgZXZlbiBpZiB0aGUgc2VjdGlvbnMgYXJlbid0IG9yZGVyZWQuCisKK3Vuc2lnbmVkIHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfU1RBUlQpKHVuc2lnbmVkIGNvdW50KSB7CisgIGludCBzdGF0dXM7CisgIGttcF9pbnQgbGIsIHViLCBzdHJpZGU7CisgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICBNS0xPQyhsb2MsICJHT01QX3NlY3Rpb25zX3N0YXJ0Iik7CisgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICBLTVBfRElTUEFUQ0hfSU5JVCgmbG9jLCBndGlkLCBrbXBfbm1fZHluYW1pY19jaHVua2VkLCAxLCBjb3VudCwgMSwgMSwgVFJVRSk7CisKKyAgc3RhdHVzID0gS01QX0RJU1BBVENIX05FWFQoJmxvYywgZ3RpZCwgTlVMTCwgJmxiLCAmdWIsICZzdHJpZGUpOworICBpZiAoc3RhdHVzKSB7CisgICAgS01QX0RFQlVHX0FTU0VSVChzdHJpZGUgPT0gMSk7CisgICAgS01QX0RFQlVHX0FTU0VSVChsYiA+IDApOworICAgIEtNUF9BU1NFUlQobGIgPT0gdWIpOworICB9IGVsc2UgeworICAgIGxiID0gMDsKKyAgfQorCisgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfc3RhcnQgZXhpdDogVCMlZCByZXR1cm5pbmcgJXVcbiIsIGd0aWQsCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkKWxiKSk7CisgIHJldHVybiAodW5zaWduZWQpbGI7Cit9CisKK3Vuc2lnbmVkIHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfTkVYVCkodm9pZCkgeworICBpbnQgc3RhdHVzOworICBrbXBfaW50IGxiLCB1Yiwgc3RyaWRlOworICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgIE1LTE9DKGxvYywgIkdPTVBfc2VjdGlvbnNfbmV4dCIpOworICBLQV9UUkFDRSgyMCwgKCJHT01QX3NlY3Rpb25zX25leHQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICBzdGF0dXMgPSBLTVBfRElTUEFUQ0hfTkVYVCgmbG9jLCBndGlkLCBOVUxMLCAmbGIsICZ1YiwgJnN0cmlkZSk7CisgIGlmIChzdGF0dXMpIHsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHN0cmlkZSA9PSAxKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKGxiID4gMCk7CisgICAgS01QX0FTU0VSVChsYiA9PSB1Yik7CisgIH0gZWxzZSB7CisgICAgbGIgPSAwOworICB9CisKKyAgS0FfVFJBQ0UoCisgICAgICAyMCwgKCJHT01QX3NlY3Rpb25zX25leHQgZXhpdDogVCMlZCByZXR1cm5pbmcgJXVcbiIsIGd0aWQsICh1bnNpZ25lZClsYikpOworICByZXR1cm4gKHVuc2lnbmVkKWxiOworfQorCit2b2lkIHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfU0VDVElPTlNfU1RBUlQpKHZvaWQgKCp0YXNrKSh2b2lkICopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBudW1fdGhyZWFkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY291bnQpIHsKKyAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgb21wdF9mcmFtZV90ICpwYXJlbnRfZnJhbWU7CisKKyAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgIHBhcmVudF9mcmFtZSA9IF9fb21wdF9nZXRfdGFza19mcmFtZV9pbnRlcm5hbCgwKTsKKyAgICBwYXJlbnRfZnJhbWUtPnJlZW50ZXJfcnVudGltZV9mcmFtZSA9IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDEpOworICB9CisjZW5kaWYKKworICBNS0xPQyhsb2MsICJHT01QX3BhcmFsbGVsX3NlY3Rpb25zX3N0YXJ0Iik7CisgIEtBX1RSQUNFKDIwLCAoIkdPTVBfcGFyYWxsZWxfc2VjdGlvbnNfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICBpZiAoX19rbXBjX29rX3RvX2ZvcmsoJmxvYykgJiYgKG51bV90aHJlYWRzICE9IDEpKSB7CisgICAgaWYgKG51bV90aHJlYWRzICE9IDApIHsKKyAgICAgIF9fa21wX3B1c2hfbnVtX3RocmVhZHMoJmxvYywgZ3RpZCwgbnVtX3RocmVhZHMpOworICAgIH0KKyAgICBfX2ttcF9HT01QX2ZvcmtfY2FsbCgmbG9jLCBndGlkLCB0YXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgIChtaWNyb3Rhc2tfdClfX2ttcF9HT01QX3BhcmFsbGVsX21pY3JvdGFza193cmFwcGVyLCA5LAorICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2ssIGRhdGEsIG51bV90aHJlYWRzLCAmbG9jLCBrbXBfbm1fZHluYW1pY19jaHVua2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgIChrbXBfaW50KTEsIChrbXBfaW50KWNvdW50LCAoa21wX2ludCkxLCAoa21wX2ludCkxKTsKKyAgfSBlbHNlIHsKKyAgICBfX2ttcF9HT01QX3NlcmlhbGl6ZWRfcGFyYWxsZWwoJmxvYywgZ3RpZCwgdGFzayk7CisgIH0KKworI2lmIE9NUFRfU1VQUE9SVAorICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgcGFyZW50X2ZyYW1lLT5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSBOVUxMOworICB9CisjZW5kaWYKKworICBLTVBfRElTUEFUQ0hfSU5JVCgmbG9jLCBndGlkLCBrbXBfbm1fZHluYW1pY19jaHVua2VkLCAxLCBjb3VudCwgMSwgMSwgVFJVRSk7CisKKyAgS0FfVFJBQ0UoMjAsICgiR09NUF9wYXJhbGxlbF9zZWN0aW9uc19zdGFydCBleGl0OiBUIyVkXG4iLCBndGlkKSk7Cit9CisKK3ZvaWQgeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkQpKHZvaWQpIHsKKyAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICBLQV9UUkFDRSgyMCwgKCJHT01QX3NlY3Rpb25zX2VuZDogVCMlZFxuIiwgZ3RpZCkpCisKKyAgX19rbXBfYmFycmllcihic19wbGFpbl9iYXJyaWVyLCBndGlkLCBGQUxTRSwgMCwgTlVMTCwgTlVMTCk7CisKKyAgS0FfVFJBQ0UoMjAsICgiR09NUF9zZWN0aW9uc19lbmQgZXhpdDogVCMlZFxuIiwgZ3RpZCkpCit9CisKK3ZvaWQgeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkRfTk9XQUlUKSh2b2lkKSB7CisgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfZW5kX25vd2FpdDogVCMlZFxuIiwgX19rbXBfZ2V0X2d0aWQoKSkpCit9CisKKy8vIGxpYmdvbXAgaGFzIGFuIGVtcHR5IGZ1bmN0aW9uIGZvciBHT01QX3Rhc2t5aWVsZCBhcyBvZiAyMDEzLTEwLTEwCit2b2lkIHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfVEFTS1lJRUxEKSh2b2lkKSB7CisgIEtBX1RSQUNFKDIwLCAoIkdPTVBfdGFza3lpZWxkOiBUIyVkXG4iLCBfX2ttcF9nZXRfZ3RpZCgpKSkKKyAgcmV0dXJuOworfQorCisjaWYgT01QXzQwX0VOQUJMRUQgLy8gdGhlc2UgYXJlIG5ldyBHT01QXzQuMCBlbnRyeSBwb2ludHMKKwordm9pZCB4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMKSh2b2lkICgqdGFzaykodm9pZCAqKSwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbnVtX3RocmVhZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncykgeworICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgTUtMT0MobG9jLCAiR09NUF9wYXJhbGxlbCIpOworICBLQV9UUkFDRSgyMCwgKCJHT01QX3BhcmFsbGVsOiBUIyVkXG4iLCBndGlkKSk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgb21wdF90YXNrX2luZm9fdCAqcGFyZW50X3Rhc2tfaW5mbywgKnRhc2tfaW5mbzsKKyAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgIHBhcmVudF90YXNrX2luZm8gPSBfX29tcHRfZ2V0X3Rhc2tpbmZvKDApOworICAgIHBhcmVudF90YXNrX2luZm8tPmZyYW1lLnJlZW50ZXJfcnVudGltZV9mcmFtZSA9IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDEpOworICB9CisjZW5kaWYKKyAgaWYgKF9fa21wY19va190b19mb3JrKCZsb2MpICYmIChudW1fdGhyZWFkcyAhPSAxKSkgeworICAgIGlmIChudW1fdGhyZWFkcyAhPSAwKSB7CisgICAgICBfX2ttcF9wdXNoX251bV90aHJlYWRzKCZsb2MsIGd0aWQsIG51bV90aHJlYWRzKTsKKyAgICB9CisgICAgaWYgKGZsYWdzICE9IDApIHsKKyAgICAgIF9fa21wX3B1c2hfcHJvY19iaW5kKCZsb2MsIGd0aWQsIChrbXBfcHJvY19iaW5kX3QpZmxhZ3MpOworICAgIH0KKyAgICBfX2ttcF9HT01QX2ZvcmtfY2FsbCgmbG9jLCBndGlkLCB0YXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgIChtaWNyb3Rhc2tfdClfX2ttcF9HT01QX21pY3JvdGFza193cmFwcGVyLCAyLCB0YXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEpOworICB9IGVsc2UgeworICAgIF9fa21wX0dPTVBfc2VyaWFsaXplZF9wYXJhbGxlbCgmbG9jLCBndGlkLCB0YXNrKTsKKyAgfQorI2lmIE9NUFRfU1VQUE9SVAorICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgdGFza19pbmZvID0gX19vbXB0X2dldF90YXNraW5mbygwKTsKKyAgICB0YXNrX2luZm8tPmZyYW1lLmV4aXRfcnVudGltZV9mcmFtZSA9IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApOworICB9CisjZW5kaWYKKyAgdGFzayhkYXRhKTsKKyAgeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9FTkQpKCk7CisjaWYgT01QVF9TVVBQT1JUCisgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICB0YXNrX2luZm8tPmZyYW1lLmV4aXRfcnVudGltZV9mcmFtZSA9IE5VTEw7CisgICAgcGFyZW50X3Rhc2tfaW5mby0+ZnJhbWUucmVlbnRlcl9ydW50aW1lX2ZyYW1lID0gTlVMTDsKKyAgfQorI2VuZGlmCit9CisKK3ZvaWQgeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9TRUNUSU9OUykodm9pZCAoKnRhc2spKHZvaWQgKiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bV90aHJlYWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZmxhZ3MpIHsKKyAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgIE1LTE9DKGxvYywgIkdPTVBfcGFyYWxsZWxfc2VjdGlvbnMiKTsKKyAgS0FfVFJBQ0UoMjAsICgiR09NUF9wYXJhbGxlbF9zZWN0aW9uczogVCMlZFxuIiwgZ3RpZCkpOworCisgIGlmIChfX2ttcGNfb2tfdG9fZm9yaygmbG9jKSAmJiAobnVtX3RocmVhZHMgIT0gMSkpIHsKKyAgICBpZiAobnVtX3RocmVhZHMgIT0gMCkgeworICAgICAgX19rbXBfcHVzaF9udW1fdGhyZWFkcygmbG9jLCBndGlkLCBudW1fdGhyZWFkcyk7CisgICAgfQorICAgIGlmIChmbGFncyAhPSAwKSB7CisgICAgICBfX2ttcF9wdXNoX3Byb2NfYmluZCgmbG9jLCBndGlkLCAoa21wX3Byb2NfYmluZF90KWZsYWdzKTsKKyAgICB9CisgICAgX19rbXBfR09NUF9mb3JrX2NhbGwoJmxvYywgZ3RpZCwgdGFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAobWljcm90YXNrX3QpX19rbXBfR09NUF9wYXJhbGxlbF9taWNyb3Rhc2tfd3JhcHBlciwgOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLCBkYXRhLCBudW1fdGhyZWFkcywgJmxvYywga21wX25tX2R5bmFtaWNfY2h1bmtlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoa21wX2ludCkxLCAoa21wX2ludCljb3VudCwgKGttcF9pbnQpMSwgKGttcF9pbnQpMSk7CisgIH0gZWxzZSB7CisgICAgX19rbXBfR09NUF9zZXJpYWxpemVkX3BhcmFsbGVsKCZsb2MsIGd0aWQsIHRhc2spOworICB9CisKKyAgS01QX0RJU1BBVENIX0lOSVQoJmxvYywgZ3RpZCwga21wX25tX2R5bmFtaWNfY2h1bmtlZCwgMSwgY291bnQsIDEsIDEsIFRSVUUpOworCisgIHRhc2soZGF0YSk7CisgIHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfRU5EKSgpOworICBLQV9UUkFDRSgyMCwgKCJHT01QX3BhcmFsbGVsX3NlY3Rpb25zIGV4aXQ6IFQjJWRcbiIsIGd0aWQpKTsKK30KKworI2RlZmluZSBQQVJBTExFTF9MT09QKGZ1bmMsIHNjaGVkdWxlLCBvbXB0X3ByZSwgb21wdF9wb3N0KSAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBmdW5jKHZvaWQgKCp0YXNrKSh2b2lkICopLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBudW1fdGhyZWFkcywgbG9uZyBsYiwgICBcCisgICAgICAgICAgICBsb25nIHViLCBsb25nIHN0ciwgbG9uZyBjaHVua19zeiwgdW5zaWduZWQgZmxhZ3MpIHsgICAgICAgICAgICAgICAgXAorICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNS0xPQyhsb2MsICNmdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS0FfVFJBQ0UoMjAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICgjZnVuYyAiOiBUIyVkLCBsYiAweCVseCwgdWIgMHglbHgsIHN0ciAweCVseCwgY2h1bmtfc3ogMHglbHhcbiIsIFwKKyAgICAgICAgICAgICAgZ3RpZCwgbGIsIHViLCBzdHIsIGNodW5rX3N6KSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG9tcHRfcHJlKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoX19rbXBjX29rX3RvX2ZvcmsoJmxvYykgJiYgKG51bV90aHJlYWRzICE9IDEpKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAobnVtX3RocmVhZHMgIT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2ttcF9wdXNoX251bV90aHJlYWRzKCZsb2MsIGd0aWQsIG51bV90aHJlYWRzKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoZmxhZ3MgIT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2ttcF9wdXNoX3Byb2NfYmluZCgmbG9jLCBndGlkLCAoa21wX3Byb2NfYmluZF90KWZsYWdzKTsgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBfX2ttcF9HT01QX2ZvcmtfY2FsbCgmbG9jLCBndGlkLCB0YXNrLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1pY3JvdGFza190KV9fa21wX0dPTVBfcGFyYWxsZWxfbWljcm90YXNrX3dyYXBwZXIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDksIHRhc2ssIGRhdGEsIG51bV90aHJlYWRzLCAmbG9jLCAoc2NoZWR1bGUpLCBsYiwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyID4gMCkgPyAodWIgLSAxKSA6ICh1YiArIDEpLCBzdHIsIGNodW5rX3N6KTsgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF9fa21wX0dPTVBfc2VyaWFsaXplZF9wYXJhbGxlbCgmbG9jLCBndGlkLCB0YXNrKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfRElTUEFUQ0hfSU5JVCgmbG9jLCBndGlkLCAoc2NoZWR1bGUpLCBsYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKHN0ciA+IDApID8gKHViIC0gMSkgOiAodWIgKyAxKSwgc3RyLCBjaHVua19zeiwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIChzY2hlZHVsZSkgIT0ga21wX3NjaF9zdGF0aWMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YXNrKGRhdGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9FTkQpKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG9tcHRfcG9zdCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS0FfVFJBQ0UoMjAsICgjZnVuYyAiIGV4aXQ6IFQjJWRcbiIsIGd0aWQpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKK1BBUkFMTEVMX0xPT1AoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX1NUQVRJQyksIGttcF9zY2hfc3RhdGljLAorICAgICAgICAgICAgICBPTVBUX0xPT1BfUFJFLCBPTVBUX0xPT1BfUE9TVCkKK1BBUkFMTEVMX0xPT1AoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0RZTkFNSUMpLAorICAgICAgICAgICAgICBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCwgT01QVF9MT09QX1BSRSwgT01QVF9MT09QX1BPU1QpCitQQVJBTExFTF9MT09QKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9HVUlERUQpLAorICAgICAgICAgICAgICBrbXBfc2NoX2d1aWRlZF9jaHVua2VkLCBPTVBUX0xPT1BfUFJFLCBPTVBUX0xPT1BfUE9TVCkKK1BBUkFMTEVMX0xPT1AoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX1JVTlRJTUUpLCBrbXBfc2NoX3J1bnRpbWUsCisgICAgICAgICAgICAgIE9NUFRfTE9PUF9QUkUsIE9NUFRfTE9PUF9QT1NUKQorCit2b2lkIHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfVEFTS0dST1VQX1NUQVJUKSh2b2lkKSB7CisgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICBNS0xPQyhsb2MsICJHT01QX3Rhc2tncm91cF9zdGFydCIpOworICBLQV9UUkFDRSgyMCwgKCJHT01QX3Rhc2tncm91cF9zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworCisgIF9fa21wY190YXNrZ3JvdXAoJmxvYywgZ3RpZCk7CisKKyAgcmV0dXJuOworfQorCit2b2lkIHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfVEFTS0dST1VQX0VORCkodm9pZCkgeworICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgIE1LTE9DKGxvYywgIkdPTVBfdGFza2dyb3VwX2VuZCIpOworICBLQV9UUkFDRSgyMCwgKCJHT01QX3Rhc2tncm91cF9lbmQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICBfX2ttcGNfZW5kX3Rhc2tncm91cCgmbG9jLCBndGlkKTsKKworICByZXR1cm47Cit9CisKKyNpZm5kZWYgS01QX0RFQlVHCitzdGF0aWMKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKyAgICBrbXBfaW50MzIKKyAgICBfX2ttcF9nb21wX3RvX29tcF9jYW5jZWxsYXRpb25fa2luZChpbnQgZ29tcF9raW5kKSB7CisgIGttcF9pbnQzMiBjbmNsX2tpbmQgPSAwOworICBzd2l0Y2ggKGdvbXBfa2luZCkgeworICBjYXNlIDE6CisgICAgY25jbF9raW5kID0gY2FuY2VsX3BhcmFsbGVsOworICAgIGJyZWFrOworICBjYXNlIDI6CisgICAgY25jbF9raW5kID0gY2FuY2VsX2xvb3A7CisgICAgYnJlYWs7CisgIGNhc2UgNDoKKyAgICBjbmNsX2tpbmQgPSBjYW5jZWxfc2VjdGlvbnM7CisgICAgYnJlYWs7CisgIGNhc2UgODoKKyAgICBjbmNsX2tpbmQgPSBjYW5jZWxfdGFza2dyb3VwOworICAgIGJyZWFrOworICB9CisgIHJldHVybiBjbmNsX2tpbmQ7Cit9CisKK2Jvb2wgeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9DQU5DRUxMQVRJT05fUE9JTlQpKGludCB3aGljaCkgeworICBpZiAoX19rbXBfb21wX2NhbmNlbGxhdGlvbikgeworICAgIEtNUF9GQVRBTChOb0dvbXBDYW5jZWxsYXRpb24pOworICB9CisgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgTUtMT0MobG9jLCAiR09NUF9jYW5jZWxsYXRpb25fcG9pbnQiKTsKKyAgS0FfVFJBQ0UoMjAsICgiR09NUF9jYW5jZWxsYXRpb25fcG9pbnQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICBrbXBfaW50MzIgY25jbF9raW5kID0gX19rbXBfZ29tcF90b19vbXBfY2FuY2VsbGF0aW9uX2tpbmQod2hpY2gpOworCisgIHJldHVybiBfX2ttcGNfY2FuY2VsbGF0aW9ucG9pbnQoJmxvYywgZ3RpZCwgY25jbF9raW5kKTsKK30KKworYm9vbCB4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0JBUlJJRVJfQ0FOQ0VMKSh2b2lkKSB7CisgIGlmIChfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKSB7CisgICAgS01QX0ZBVEFMKE5vR29tcENhbmNlbGxhdGlvbik7CisgIH0KKyAgS01QX0ZBVEFMKE5vR29tcENhbmNlbGxhdGlvbik7CisgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgTUtMT0MobG9jLCAiR09NUF9iYXJyaWVyX2NhbmNlbCIpOworICBLQV9UUkFDRSgyMCwgKCJHT01QX2JhcnJpZXJfY2FuY2VsOiBUIyVkXG4iLCBndGlkKSk7CisKKyAgcmV0dXJuIF9fa21wY19jYW5jZWxfYmFycmllcigmbG9jLCBndGlkKTsKK30KKworYm9vbCB4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0NBTkNFTCkoaW50IHdoaWNoLCBib29sIGRvX2NhbmNlbCkgeworICBpZiAoX19rbXBfb21wX2NhbmNlbGxhdGlvbikgeworICAgIEtNUF9GQVRBTChOb0dvbXBDYW5jZWxsYXRpb24pOworICB9IGVsc2UgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgTUtMT0MobG9jLCAiR09NUF9jYW5jZWwiKTsKKyAgS0FfVFJBQ0UoMjAsICgiR09NUF9jYW5jZWw6IFQjJWRcbiIsIGd0aWQpKTsKKworICBrbXBfaW50MzIgY25jbF9raW5kID0gX19rbXBfZ29tcF90b19vbXBfY2FuY2VsbGF0aW9uX2tpbmQod2hpY2gpOworCisgIGlmIChkb19jYW5jZWwgPT0gRkFMU0UpIHsKKyAgICByZXR1cm4geGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9DQU5DRUxMQVRJT05fUE9JTlQpKHdoaWNoKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gX19rbXBjX2NhbmNlbCgmbG9jLCBndGlkLCBjbmNsX2tpbmQpOworICB9Cit9CisKK2Jvb2wgeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkRfQ0FOQ0VMKSh2b2lkKSB7CisgIGlmIChfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKSB7CisgICAgS01QX0ZBVEFMKE5vR29tcENhbmNlbGxhdGlvbik7CisgIH0KKyAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICBNS0xPQyhsb2MsICJHT01QX3NlY3Rpb25zX2VuZF9jYW5jZWwiKTsKKyAgS0FfVFJBQ0UoMjAsICgiR09NUF9zZWN0aW9uc19lbmRfY2FuY2VsOiBUIyVkXG4iLCBndGlkKSk7CisKKyAgcmV0dXJuIF9fa21wY19jYW5jZWxfYmFycmllcigmbG9jLCBndGlkKTsKK30KKworYm9vbCB4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5EX0NBTkNFTCkodm9pZCkgeworICBpZiAoX19rbXBfb21wX2NhbmNlbGxhdGlvbikgeworICAgIEtNUF9GQVRBTChOb0dvbXBDYW5jZWxsYXRpb24pOworICB9CisgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgTUtMT0MobG9jLCAiR09NUF9sb29wX2VuZF9jYW5jZWwiKTsKKyAgS0FfVFJBQ0UoMjAsICgiR09NUF9sb29wX2VuZF9jYW5jZWw6IFQjJWRcbiIsIGd0aWQpKTsKKworICByZXR1cm4gX19rbXBjX2NhbmNlbF9iYXJyaWVyKCZsb2MsIGd0aWQpOworfQorCisvLyBBbGwgdGFyZ2V0IGZ1bmN0aW9ucyBhcmUgZW1wdHkgYXMgb2YgMjAxNC0wNS0yOQordm9pZCB4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVCkoaW50IGRldmljZSwgdm9pZCAoKmZuKSh2b2lkICopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqb3Blbm1wX3RhcmdldCwgc2l6ZV90IG1hcG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipob3N0YWRkcnMsIHNpemVfdCAqc2l6ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpraW5kcykgeworICByZXR1cm47Cit9CisKK3ZvaWQgeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9UQVJHRVRfREFUQSkoaW50IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqb3Blbm1wX3RhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1hcG51bSwgdm9pZCAqKmhvc3RhZGRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpzaXplcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqa2luZHMpIHsKKyAgcmV0dXJuOworfQorCit2b2lkIHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUX0VORF9EQVRBKSh2b2lkKSB7IHJldHVybjsgfQorCit2b2lkIHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUX1VQREFURSkoaW50IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpvcGVubXBfdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtYXBudW0sIHZvaWQgKipob3N0YWRkcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpzaXplcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpraW5kcykgeworICByZXR1cm47Cit9CisKK3ZvaWQgeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9URUFNUykodW5zaWduZWQgaW50IG51bV90ZWFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRocmVhZF9saW1pdCkgeworICByZXR1cm47Cit9CisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworLyogVGhlIGZvbGxvd2luZyBzZWN0aW9ucyBvZiBjb2RlIGNyZWF0ZSBhbGlhc2VzIGZvciB0aGUgR09NUF8qIGZ1bmN0aW9ucywgdGhlbgorICAgY3JlYXRlIHZlcnNpb25lZCBzeW1ib2xzIHVzaW5nIHRoZSBhc3NlbWJsZXIgZGlyZWN0aXZlIC5zeW12ZXIuIFRoaXMgaXMgb25seQorICAgcGVydGluZW50IGZvciBFTEYgLnNvIGxpYnJhcnkgeGFsaWFzaWZ5IGFuZCB4dmVyc2lvbmlmeSBhcmUgZGVmaW5lZCBpbgorICAga21wX2Z0bl9vcy5oICAqLworCisjaWZkZWYgS01QX1VTRV9WRVJTSU9OX1NZTUJPTFMKKworLy8gR09NUF8xLjAgYWxpYXNlcworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0FUT01JQ19FTkQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9BVE9NSUNfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9CQVJSSUVSLCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfRU5ELCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfTkFNRV9FTkQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9DUklUSUNBTF9OQU1FX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0RZTkFNSUNfTkVYVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRFlOQU1JQ19TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5ELCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9FTkRfTk9XQUlULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9HVUlERURfTkVYVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfR1VJREVEX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0RZTkFNSUNfTkVYVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9EWU5BTUlDX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0dVSURFRF9ORVhULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0dVSURFRF9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9SVU5USU1FX05FWFQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfUlVOVElNRV9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9TVEFUSUNfTkVYVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9TVEFUSUNfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1JVTlRJTUVfTkVYVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfUlVOVElNRV9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfU1RBVElDX05FWFQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1NUQVRJQ19TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX09SREVSRURfRU5ELCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfT1JERVJFRF9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0VORCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfRFlOQU1JQ19TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfR1VJREVEX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9SVU5USU1FX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9TVEFUSUNfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9TRUNUSU9OU19TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfRU5ELCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfRU5EX05PV0FJVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX05FWFQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NJTkdMRV9DT1BZX0VORCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NJTkdMRV9DT1BZX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfU0lOR0xFX1NUQVJULCAxMCk7CisKKy8vIEdPTVBfMi4wIGFsaWFzZXMKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9UQVNLLCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFTS1dBSVQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9EWU5BTUlDX05FWFQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9EWU5BTUlDX1NUQVJULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfR1VJREVEX05FWFQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9HVUlERURfU1RBUlQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0RZTkFNSUNfTkVYVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfRFlOQU1JQ19TVEFSVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfR1VJREVEX05FWFQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0dVSURFRF9TVEFSVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfUlVOVElNRV9ORVhULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9SVU5USU1FX1NUQVJULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9TVEFUSUNfTkVYVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfU1RBVElDX1NUQVJULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfUlVOVElNRV9ORVhULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfUlVOVElNRV9TVEFSVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1NUQVRJQ19ORVhULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfU1RBVElDX1NUQVJULCAyMCk7CisKKy8vIEdPTVBfMy4wIGFsaWFzZXMKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9UQVNLWUlFTEQsIDMwKTsKKworLy8gR09NUF80LjAgYWxpYXNlcworLy8gVGhlIEdPTVBfcGFyYWxsZWwqIGVudHJ5IHBvaW50cyBiZWxvdyBhcmVuJ3QgT3Blbk1QIDQuMCByZWxhdGVkLgorI2lmIE9NUF80MF9FTkFCTEVECit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUwsIDQwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9TRUNUSU9OUywgNDApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfRFlOQU1JQywgNDApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfR1VJREVELCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9SVU5USU1FLCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9TVEFUSUMsIDQwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9UQVNLR1JPVVBfU1RBUlQsIDQwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9UQVNLR1JPVVBfRU5ELCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfQkFSUklFUl9DQU5DRUwsIDQwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9DQU5DRUwsIDQwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9DQU5DRUxMQVRJT05fUE9JTlQsIDQwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0VORF9DQU5DRUwsIDQwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkRfQ0FOQ0VMLCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VULCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUX0RBVEEsIDQwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9UQVJHRVRfRU5EX0RBVEEsIDQwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9UQVJHRVRfVVBEQVRFLCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfVEVBTVMsIDQwKTsKKyNlbmRpZgorCisvLyBHT01QXzEuMCB2ZXJzaW9uZWQgc3ltYm9scworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfQVRPTUlDX0VORCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfQVRPTUlDX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9CQVJSSUVSLCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9DUklUSUNBTF9FTkQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX05BTUVfRU5ELCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9DUklUSUNBTF9OQU1FX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9DUklUSUNBTF9TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9EWU5BTUlDX05FWFQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRFlOQU1JQ19TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9FTkQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5EX05PV0FJVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9HVUlERURfTkVYVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9HVUlERURfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9EWU5BTUlDX05FWFQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9EWU5BTUlDX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfR1VJREVEX05FWFQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9HVUlERURfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9SVU5USU1FX05FWFQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9SVU5USU1FX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfU1RBVElDX05FWFQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9TVEFUSUNfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfUlVOVElNRV9ORVhULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1JVTlRJTUVfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfU1RBVElDX05FWFQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfU1RBVElDX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9PUkRFUkVEX0VORCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfT1JERVJFRF9TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfRU5ELCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0RZTkFNSUNfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfR1VJREVEX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX1JVTlRJTUVfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfU1RBVElDX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9TRUNUSU9OU19TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfRU5EX05PV0FJVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfTkVYVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NJTkdMRV9DT1BZX0VORCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfU0lOR0xFX0NPUFlfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NJTkdMRV9TVEFSVCwgMTAsICJHT01QXzEuMCIpOworCisvLyBHT01QXzIuMCB2ZXJzaW9uZWQgc3ltYm9scworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFTSywgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFTS1dBSVQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0RZTkFNSUNfTkVYVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfRFlOQU1JQ19TVEFSVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfR1VJREVEX05FWFQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0dVSURFRF9TVEFSVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9EWU5BTUlDX05FWFQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfRFlOQU1JQ19TVEFSVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9HVUlERURfTkVYVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9HVUlERURfU1RBUlQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfUlVOVElNRV9ORVhULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1JVTlRJTUVfU1RBUlQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfU1RBVElDX05FWFQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfU1RBVElDX1NUQVJULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9SVU5USU1FX05FWFQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1JVTlRJTUVfU1RBUlQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1NUQVRJQ19ORVhULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9TVEFUSUNfU1RBUlQsIDIwLCAiR09NUF8yLjAiKTsKKworLy8gR09NUF8zLjAgdmVyc2lvbmVkIHN5bWJvbHMKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBU0tZSUVMRCwgMzAsICJHT01QXzMuMCIpOworCisvLyBHT01QXzQuMCB2ZXJzaW9uZWQgc3ltYm9scworI2lmIE9NUF80MF9FTkFCTEVECit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTCwgNDAsICJHT01QXzQuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfU0VDVElPTlMsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfRFlOQU1JQywgNDAsICJHT01QXzQuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9HVUlERUQsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfUlVOVElNRSwgNDAsICJHT01QXzQuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9TVEFUSUMsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBU0tHUk9VUF9TVEFSVCwgNDAsICJHT01QXzQuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFTS0dST1VQX0VORCwgNDAsICJHT01QXzQuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfQkFSUklFUl9DQU5DRUwsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0NBTkNFTCwgNDAsICJHT01QXzQuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfQ0FOQ0VMTEFUSU9OX1BPSU5ULCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0VORF9DQU5DRUwsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORF9DQU5DRUwsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVCwgNDAsICJHT01QXzQuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUX0RBVEEsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVF9FTkRfREFUQSwgNDAsICJHT01QXzQuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUX1VQREFURSwgNDAsICJHT01QXzQuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfVEVBTVMsIDQwLCAiR09NUF80LjAiKTsKKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1VTRV9WRVJTSU9OX1NZTUJPTFMKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2kxOG4uY3BwIGIvZmluYWwvcnVudGltZS9zcmMva21wX2kxOG4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NzRjOWUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfaTE4bi5jcHAKQEAgLTAsMCArMSw4NjYgQEAKKy8qCisgKiBrbXBfaTE4bi5jcHAKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcF9pMThuLmgiCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfZGVidWcuaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIgLy8gX19rbXBfcHJpbnRmLgorI2luY2x1ZGUgImttcF9sb2NrLmgiCisjaW5jbHVkZSAia21wX29zLmgiCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxvY2FsZS5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJrbXBfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJrbXBfaTE4bl9kZWZhdWx0LmluYyIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisKKyN1bmRlZiBLTVBfSTE4Tl9PSworCisjZGVmaW5lIGdldF9zZWN0aW9uKGlkKSAoKGlkKSA+PiAxNikKKyNkZWZpbmUgZ2V0X251bWJlcihpZCkgKChpZCkmMHhGRkZGKQorCitrbXBfbXNnX3QgX19rbXBfbXNnX2VtcHR5ID0ge2ttcF9tdF9kdW1teSwgMCwgIiIsIDB9Owora21wX21zZ190IF9fa21wX21zZ19udWxsID0ge2ttcF9tdF9kdW1teSwgMCwgTlVMTCwgMH07CitzdGF0aWMgY2hhciBjb25zdCAqbm9fbWVzc2FnZV9hdmFpbGFibGUgPSAiKE5vIG1lc3NhZ2UgYXZhaWxhYmxlKSI7CisKK2VudW0ga21wX2kxOG5fY2F0X3N0YXR1cyB7CisgIEtNUF9JMThOX0NMT1NFRCwgLy8gTm90IHlldCBvcGVuZWQgb3IgY2xvc2VkLgorICBLTVBfSTE4Tl9PUEVORUQsIC8vIE9wZW5lZCBzdWNjZXNzZnVsbHksIHJlYWR5IHRvIHVzZS4KKyAgS01QX0kxOE5fQUJTRU5UIC8vIE9wZW5pbmcgZmFpbGVkLCBtZXNzYWdlIGNhdGFsb2cgc2hvdWxkIG5vdCBiZSB1c2VkLgorfTsgLy8gZW51bSBrbXBfaTE4bl9jYXRfc3RhdHVzCit0eXBlZGVmIGVudW0ga21wX2kxOG5fY2F0X3N0YXR1cyBrbXBfaTE4bl9jYXRfc3RhdHVzX3Q7CitzdGF0aWMgdm9sYXRpbGUga21wX2kxOG5fY2F0X3N0YXR1c190IHN0YXR1cyA9IEtNUF9JMThOX0NMT1NFRDsKKworLyogTWVzc2FnZSBjYXRhbG9nIGlzIG9wZW5lZCBhdCBmaXJzdCB1c2FnZSwgc28gd2UgaGF2ZSB0byBzeW5jaHJvbml6ZSBvcGVuaW5nCisgICB0byBhdm9pZCByYWNlIGFuZCBtdWx0aXBsZSBvcGVuaW5ncy4KKworICAgQ2xvc2luZyBkb2VzIG5vdCByZXF1aXJlIHN5bmNocm9uaXphdGlvbiwgYmVjYXVzZSBjYXRhbG9nIGlzIGNsb3NlZCB2ZXJ5IGxhdGUKKyAgIGF0IGxpYnJhcnkgc2h1dHRpbmcgZG93biwgd2hlbiBubyBvdGhlciB0aHJlYWRzIGFyZSBhbGl2ZS4gICovCisKK3N0YXRpYyB2b2lkIF9fa21wX2kxOG5fZG9fY2F0b3BlbigpOworc3RhdGljIGttcF9ib290c3RyYXBfbG9ja190IGxvY2sgPSBLTVBfQk9PVFNUUkFQX0xPQ0tfSU5JVElBTElaRVIobG9jayk7CisvLyBgbG9jaycgdmFyaWFibGUgbWF5IGJlIHBsYWNlZCBpbnRvIF9fa21wX2kxOG5fY2F0b3BlbiBmdW5jdGlvbiBiZWNhdXNlIGl0IGlzCisvLyB1c2VkIG9ubHkgYnkgdGhhdCBmdW5jdGlvbi4gQnV0IHdlIGFmcmFpZCBhIChidWdneSkgY29tcGlsZXIgbWF5IHRyZWF0IGl0CisvLyB3cm9uZ2x5LiBTbyB3ZSBwdXQgaXQgb3V0c2lkZSBvZiBmdW5jdGlvbiBqdXN0IGluIGNhc2UuCisKK3ZvaWQgX19rbXBfaTE4bl9jYXRvcGVuKCkgeworICBpZiAoc3RhdHVzID09IEtNUF9JMThOX0NMT1NFRCkgeworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soJmxvY2spOworICAgIGlmIChzdGF0dXMgPT0gS01QX0kxOE5fQ0xPU0VEKSB7CisgICAgICBfX2ttcF9pMThuX2RvX2NhdG9wZW4oKTsKKyAgICB9OyAvLyBpZgorICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJmxvY2spOworICB9OyAvLyBpZgorfSAvLyBmdW5jIF9fa21wX2kxOG5fY2F0b3BlbgorCisvKiBMaW51eCogT1MgYW5kIE9TIFgqIHBhcnQgKi8KKyNpZiBLTVBfT1NfVU5JWAorI2RlZmluZSBLTVBfSTE4Tl9PSworCisjaW5jbHVkZSA8bmxfdHlwZXMuaD4KKworI2RlZmluZSBLTVBfSTE4Tl9OVUxMQ0FUICgobmxfY2F0ZCkoLTEpKQorc3RhdGljIG5sX2NhdGQgY2F0ID0gS01QX0kxOE5fTlVMTENBVDsgLy8gISEhIFNoYWxsIGl0IGJlIHZvbGF0aWxlPworc3RhdGljIGNoYXIgY29uc3QgKm5hbWUgPQorICAgIChLTVBfVkVSU0lPTl9NQUpPUiA9PSA0ID8gImxpYmd1aWRlLmNhdCIgOiAibGlib21wLmNhdCIpOworCisvKiBVc2VmdWwgbGlua3M6CitodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDAwOTUzOTkvYmFzZWRlZnMveGJkX2NoYXAwOC5odG1sI3RhZ18wOF8wMgoraHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDAwMDk1Mzk5L2Z1bmN0aW9ucy9jYXRvcGVuLmh0bWwKK2h0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwMDA5NTM5OS9mdW5jdGlvbnMvc2V0bG9jYWxlLmh0bWwKKyovCisKK3ZvaWQgX19rbXBfaTE4bl9kb19jYXRvcGVuKCkgeworICBpbnQgZW5nbGlzaCA9IDA7CisgIGNoYXIgKmxhbmcgPSBfX2ttcF9lbnZfZ2V0KCJMQU5HIik7CisgIC8vIFRPRE86IFdoYXQgYWJvdXQgTENfQUxMIG9yIExDX01FU1NBR0VTPworCisgIEtNUF9ERUJVR19BU1NFUlQoc3RhdHVzID09IEtNUF9JMThOX0NMT1NFRCk7CisgIEtNUF9ERUJVR19BU1NFUlQoY2F0ID09IEtNUF9JMThOX05VTExDQVQpOworCisgIGVuZ2xpc2ggPSBsYW5nID09IE5VTEwgfHwgLy8gSW4gYWxsIHRoZXNlIGNhc2VzIEVuZ2xpc2ggbGFuZ3VhZ2UgaXMgdXNlZC4KKyAgICAgICAgICAgIHN0cmNtcChsYW5nLCAiIikgPT0gMCB8fCBzdHJjbXAobGFuZywgIiAiKSA9PSAwIHx8CisgICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBGb3J0cmFuIFJUTCBidWcgRFBEMjAwMTM3ODczICJGb3J0cmFuIHJ1bnRpbWUKKyAgICAgICAgICAgIC8vIHJlc2V0cyBMQU5HIGVudiB2YXIgdG8gc3BhY2UgaWYgaXQgaXMgbm90IHNldCIuCisgICAgICAgICAgICBzdHJjbXAobGFuZywgIkMiKSA9PSAwIHx8IHN0cmNtcChsYW5nLCAiUE9TSVgiKSA9PSAwOworCisgIGlmICghZW5nbGlzaCkgeyAvLyBFbmdsaXNoIGxhbmd1YWdlIGlzIG5vdCB5ZXQgZGV0ZWN0ZWQsIGxldCB1cyBjb250aW51ZS4KKyAgICAvLyBGb3JtYXQgb2YgTEFORyBpczogW2xhbmd1YWdlW190ZXJyaXRvcnldWy5jb2Rlc2V0XVtAbW9kaWZpZXJdXQorICAgIC8vIFN0cmlwIGFsbCBwYXJ0cyBleGNlcHQgbGFuZ3VhZ2UuCisgICAgY2hhciAqdGFpbCA9IE5VTEw7CisgICAgX19rbXBfc3RyX3NwbGl0KGxhbmcsICdAJywgJmxhbmcsICZ0YWlsKTsKKyAgICBfX2ttcF9zdHJfc3BsaXQobGFuZywgJy4nLCAmbGFuZywgJnRhaWwpOworICAgIF9fa21wX3N0cl9zcGxpdChsYW5nLCAnXycsICZsYW5nLCAmdGFpbCk7CisgICAgZW5nbGlzaCA9IChzdHJjbXAobGFuZywgImVuIikgPT0gMCk7CisgIH07IC8vIGlmCisKKyAgS01QX0lOVEVSTkFMX0ZSRUUobGFuZyk7CisKKyAgLy8gRG8gbm90IHRyeSB0byBvcGVuIEVuZ2xpc2ggY2F0YWxvZyBiZWNhdXNlIGludGVybmFsIG1lc3NhZ2VzIGFyZQorICAvLyBleGFjdCBjb3B5IG9mIG1lc3NhZ2VzIGluIEVuZ2xpc2ggY2F0YWxvZy4KKyAgaWYgKGVuZ2xpc2gpIHsKKyAgICBzdGF0dXMgPSBLTVBfSTE4Tl9BQlNFTlQ7IC8vIG1hcmsgY2F0YWxvZyBhcyBhYnNlbnQgc28gaXQgd2lsbCBub3QKKyAgICAvLyBiZSByZS1vcGVuZWQuCisgICAgcmV0dXJuOworICB9CisKKyAgY2F0ID0gY2F0b3BlbihuYW1lLCAwKTsKKyAgLy8gVE9ETzogV2h5IGRvIHdlIHBhc3MgMCBpbiBmbGFncz8KKyAgc3RhdHVzID0gKGNhdCA9PSBLTVBfSTE4Tl9OVUxMQ0FUID8gS01QX0kxOE5fQUJTRU5UIDogS01QX0kxOE5fT1BFTkVEKTsKKworICBpZiAoc3RhdHVzID09IEtNUF9JMThOX0FCU0VOVCkgeworICAgIGlmIChfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA+IGttcF93YXJuaW5nc19sb3cpIHsKKyAgICAgIC8vIEFDOiBvbmx5IGlzc3VlIHdhcm5pbmcgaW4gY2FzZSBleHBsaWNpdGx5IGFza2VkIHRvCisgICAgICBpbnQgZXJyb3IgPSBlcnJubzsgLy8gU2F2ZSBlcnJubyBpbW1lZGlhdGVseS4KKyAgICAgIGNoYXIgKm5sc3BhdGggPSBfX2ttcF9lbnZfZ2V0KCJOTFNQQVRIIik7CisgICAgICBjaGFyICpsYW5nID0gX19rbXBfZW52X2dldCgiTEFORyIpOworCisgICAgICAvLyBJbmZpbml0ZSByZWN1cnNpb24gd2lsbCBub3Qgb2NjdXIgLS0gc3RhdHVzIGlzIEtNUF9JMThOX0FCU0VOVCBub3csIHNvCisgICAgICAvLyBfX2ttcF9pMThuX2NhdGdldHMoKSB3aWxsIG5vdCB0cnkgdG8gb3BlbiBjYXRhbG9nLCBidXQgd2lsbCByZXR1cm4KKyAgICAgIC8vIGRlZmF1bHQgbWVzc2FnZS4KKyAgICAgIGttcF9tc2dfdCBlcnJfY29kZSA9IEtNUF9FUlIoZXJyb3IpOworICAgICAgX19rbXBfbXNnKGttcF9tc193YXJuaW5nLCBLTVBfTVNHKENhbnRPcGVuTWVzc2FnZUNhdGFsb2csIG5hbWUpLCBlcnJfY29kZSwKKyAgICAgICAgICAgICAgICBLTVBfSE5UKENoZWNrRW52VmFyLCAiTkxTUEFUSCIsIG5sc3BhdGgpLAorICAgICAgICAgICAgICAgIEtNUF9ITlQoQ2hlY2tFbnZWYXIsICJMQU5HIiwgbGFuZyksIF9fa21wX21zZ19udWxsKTsKKyAgICAgIGlmIChfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA9PSBrbXBfd2FybmluZ3Nfb2ZmKSB7CisgICAgICAgIF9fa21wX3N0cl9mcmVlKCZlcnJfY29kZS5zdHIpOworICAgICAgfQorCisgICAgICBLTVBfSU5GT1JNKFdpbGxVc2VEZWZhdWx0TWVzc2FnZXMpOworICAgICAgS01QX0lOVEVSTkFMX0ZSRUUobmxzcGF0aCk7CisgICAgICBLTVBfSU5URVJOQUxfRlJFRShsYW5nKTsKKyAgICB9CisgIH0gZWxzZSB7IC8vIHN0YXR1cyA9PSBLTVBfSTE4Tl9PUEVORUQKKyAgICBpbnQgc2VjdGlvbiA9IGdldF9zZWN0aW9uKGttcF9pMThuX3BycF9WZXJzaW9uKTsKKyAgICBpbnQgbnVtYmVyID0gZ2V0X251bWJlcihrbXBfaTE4bl9wcnBfVmVyc2lvbik7CisgICAgY2hhciBjb25zdCAqZXhwZWN0ZWQgPSBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2VjdFtzZWN0aW9uXS5zdHJbbnVtYmVyXTsKKyAgICAvLyBFeHBlY3RlZCB2ZXJzaW9uIG9mIHRoZSBjYXRhbG9nLgorICAgIGttcF9zdHJfYnVmX3QgdmVyc2lvbjsgLy8gQWN0dWFsIHZlcnNpb24gb2YgdGhlIGNhdGFsb2cuCisgICAgX19rbXBfc3RyX2J1Zl9pbml0KCZ2ZXJzaW9uKTsKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZ2ZXJzaW9uLCAiJXMiLCBjYXRnZXRzKGNhdCwgc2VjdGlvbiwgbnVtYmVyLCBOVUxMKSk7CisKKyAgICAvLyBTdHJpbmcgcmV0dXJuZWQgYnkgY2F0Z2V0cyBpcyBpbnZhbGlkIGFmdGVyIGNsb3NpbmcgY2F0YWxvZywgc28gY29weSBpdC4KKyAgICBpZiAoc3RyY21wKHZlcnNpb24uc3RyLCBleHBlY3RlZCkgIT0gMCkgeworICAgICAgX19rbXBfaTE4bl9jYXRjbG9zZSgpOyAvLyBDbG9zZSBiYWQgY2F0YWxvZy4KKyAgICAgIHN0YXR1cyA9IEtNUF9JMThOX0FCU0VOVDsgLy8gQW5kIG1hcmsgaXQgYXMgYWJzZW50LgorICAgICAgaWYgKF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID4ga21wX3dhcm5pbmdzX2xvdykgeworICAgICAgICAvLyBBQzogb25seSBpc3N1ZSB3YXJuaW5nIGluIGNhc2UgZXhwbGljaXRseSBhc2tlZCB0bworICAgICAgICAvLyBBbmQgbm93IHByaW50IGEgd2FybmluZyB1c2luZyBkZWZhdWx0IG1lc3NhZ2VzLgorICAgICAgICBjaGFyIGNvbnN0ICpuYW1lID0gIk5MU1BBVEgiOworICAgICAgICBjaGFyIGNvbnN0ICpubHNwYXRoID0gX19rbXBfZW52X2dldChuYW1lKTsKKyAgICAgICAgX19rbXBfbXNnKGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgICAgICAgS01QX01TRyhXcm9uZ01lc3NhZ2VDYXRhbG9nLCBuYW1lLCB2ZXJzaW9uLnN0ciwgZXhwZWN0ZWQpLAorICAgICAgICAgICAgICAgICAgS01QX0hOVChDaGVja0VudlZhciwgbmFtZSwgbmxzcGF0aCksIF9fa21wX21zZ19udWxsKTsKKyAgICAgICAgS01QX0lORk9STShXaWxsVXNlRGVmYXVsdE1lc3NhZ2VzKTsKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoQ0NBU1QoY2hhciAqLCBubHNwYXRoKSk7CisgICAgICB9IC8vIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzCisgICAgfTsgLy8gaWYKKyAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoJnZlcnNpb24pOworICB9OyAvLyBpZgorfSAvLyBmdW5jIF9fa21wX2kxOG5fZG9fY2F0b3BlbgorCit2b2lkIF9fa21wX2kxOG5fY2F0Y2xvc2UoKSB7CisgIGlmIChzdGF0dXMgPT0gS01QX0kxOE5fT1BFTkVEKSB7CisgICAgS01QX0RFQlVHX0FTU0VSVChjYXQgIT0gS01QX0kxOE5fTlVMTENBVCk7CisgICAgY2F0Y2xvc2UoY2F0KTsKKyAgICBjYXQgPSBLTVBfSTE4Tl9OVUxMQ0FUOworICB9OyAvLyBpZgorICBzdGF0dXMgPSBLTVBfSTE4Tl9DTE9TRUQ7Cit9IC8vIGZ1bmMgX19rbXBfaTE4bl9jYXRjbG9zZQorCitjaGFyIGNvbnN0ICpfX2ttcF9pMThuX2NhdGdldHMoa21wX2kxOG5faWRfdCBpZCkgeworCisgIGludCBzZWN0aW9uID0gZ2V0X3NlY3Rpb24oaWQpOworICBpbnQgbnVtYmVyID0gZ2V0X251bWJlcihpZCk7CisgIGNoYXIgY29uc3QgKm1lc3NhZ2UgPSBOVUxMOworCisgIGlmICgxIDw9IHNlY3Rpb24gJiYgc2VjdGlvbiA8PSBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2l6ZSkgeworICAgIGlmICgxIDw9IG51bWJlciAmJiBudW1iZXIgPD0gX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNlY3Rbc2VjdGlvbl0uc2l6ZSkgeworICAgICAgaWYgKHN0YXR1cyA9PSBLTVBfSTE4Tl9DTE9TRUQpIHsKKyAgICAgICAgX19rbXBfaTE4bl9jYXRvcGVuKCk7CisgICAgICB9OyAvLyBpZgorICAgICAgaWYgKHN0YXR1cyA9PSBLTVBfSTE4Tl9PUEVORUQpIHsKKyAgICAgICAgbWVzc2FnZSA9IGNhdGdldHMoY2F0LCBzZWN0aW9uLCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zZWN0W3NlY3Rpb25dLnN0cltudW1iZXJdKTsKKyAgICAgIH07IC8vIGlmCisgICAgICBpZiAobWVzc2FnZSA9PSBOVUxMKSB7CisgICAgICAgIG1lc3NhZ2UgPSBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2VjdFtzZWN0aW9uXS5zdHJbbnVtYmVyXTsKKyAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyAgfTsgLy8gaWYKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkgeworICAgIG1lc3NhZ2UgPSBub19tZXNzYWdlX2F2YWlsYWJsZTsKKyAgfTsgLy8gaWYKKyAgcmV0dXJuIG1lc3NhZ2U7CisKK30gLy8gZnVuYyBfX2ttcF9pMThuX2NhdGdldHMKKworI2VuZGlmIC8vIEtNUF9PU19VTklYCisKKy8qIFdpbmRvd3MqIE9TIHBhcnQuICovCisKKyNpZiBLTVBfT1NfV0lORE9XUworI2RlZmluZSBLTVBfSTE4Tl9PSworCisjaW5jbHVkZSAia21wX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjZGVmaW5lIEtNUF9JMThOX05VTExDQVQgTlVMTAorc3RhdGljIEhNT0RVTEUgY2F0ID0gS01QX0kxOE5fTlVMTENBVDsgLy8gISEhIFNoYWxsIGl0IGJlIHZvbGF0aWxlPworc3RhdGljIGNoYXIgY29uc3QgKm5hbWUgPQorICAgIChLTVBfVkVSU0lPTl9NQUpPUiA9PSA0ID8gImxpYmd1aWRlNDB1aS5kbGwiIDogImxpYm9tcHVpLmRsbCIpOworCitzdGF0aWMga21wX2kxOG5fdGFibGVfdCB0YWJsZSA9IHswLCBOVUxMfTsKKy8vIE1lc3NhZ2VzIGZvcm1hdHRlZCBieSBGb3JtYXRNZXNzYWdlKCkgc2hvdWxkIGJlIGZyZWVkLCBidXQgY2F0Z2V0cygpCisvLyBpbnRlcmZhY2UgYXNzdW1lcyB1c2VyIHdpbGwgbm90IGZyZWUgbWVzc2FnZXMuIFNvIHdlIGNhY2hlIGFsbCB0aGUgcmV0cmlldmVkCisvLyBtZXNzYWdlcyBpbiB0aGUgdGFibGUsIHdoaWNoIGFyZSBmcmVlZCBhdCBjYXRjbG9zZSgpLgorc3RhdGljIFVJTlQgY29uc3QgZGVmYXVsdF9jb2RlX3BhZ2UgPSBDUF9PRU1DUDsKK3N0YXRpYyBVSU5UIGNvZGVfcGFnZSA9IGRlZmF1bHRfY29kZV9wYWdlOworCitzdGF0aWMgY2hhciBjb25zdCAqX19fY2F0Z2V0cyhrbXBfaTE4bl9pZF90IGlkKTsKK3N0YXRpYyBVSU5UIGdldF9jb2RlX3BhZ2UoKTsKK3N0YXRpYyB2b2lkIGttcF9pMThuX3RhYmxlX2ZyZWUoa21wX2kxOG5fdGFibGVfdCAqdGFibGUpOworCitzdGF0aWMgVUlOVCBnZXRfY29kZV9wYWdlKCkgeworCisgIFVJTlQgY3AgPSBkZWZhdWx0X2NvZGVfcGFnZTsKKyAgY2hhciBjb25zdCAqdmFsdWUgPSBfX2ttcF9lbnZfZ2V0KCJLTVBfQ09ERVBBR0UiKTsKKyAgaWYgKHZhbHVlICE9IE5VTEwpIHsKKyAgICBpZiAoX3N0cmljbXAodmFsdWUsICJBTlNJIikgPT0gMCkgeworICAgICAgY3AgPSBDUF9BQ1A7CisgICAgfSBlbHNlIGlmIChfc3RyaWNtcCh2YWx1ZSwgIk9FTSIpID09IDApIHsKKyAgICAgIGNwID0gQ1BfT0VNQ1A7CisgICAgfSBlbHNlIGlmIChfc3RyaWNtcCh2YWx1ZSwgIlVURi04IikgPT0gMCB8fCBfc3RyaWNtcCh2YWx1ZSwgIlVURjgiKSA9PSAwKSB7CisgICAgICBjcCA9IENQX1VURjg7CisgICAgfSBlbHNlIGlmIChfc3RyaWNtcCh2YWx1ZSwgIlVURi03IikgPT0gMCB8fCBfc3RyaWNtcCh2YWx1ZSwgIlVURjciKSA9PSAwKSB7CisgICAgICBjcCA9IENQX1VURjc7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vICEhISBUT0RPOiBJc3N1ZSBhIHdhcm5pbmc/CisgICAgfTsgLy8gaWYKKyAgfTsgLy8gaWYKKyAgS01QX0lOVEVSTkFMX0ZSRUUoKHZvaWQgKil2YWx1ZSk7CisgIHJldHVybiBjcDsKKworfSAvLyBmdW5jIGdldF9jb2RlX3BhZ2UKKworc3RhdGljIHZvaWQga21wX2kxOG5fdGFibGVfZnJlZShrbXBfaTE4bl90YWJsZV90ICp0YWJsZSkgeworICBpbnQgczsKKyAgaW50IG07CisgIGZvciAocyA9IDA7IHMgPCB0YWJsZS0+c2l6ZTsgKytzKSB7CisgICAgZm9yIChtID0gMDsgbSA8IHRhYmxlLT5zZWN0W3NdLnNpemU7ICsrbSkgeworICAgICAgLy8gRnJlZSBtZXNzYWdlLgorICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoKHZvaWQgKil0YWJsZS0+c2VjdFtzXS5zdHJbbV0pOworICAgICAgdGFibGUtPnNlY3Rbc10uc3RyW21dID0gTlVMTDsKKyAgICB9OyAvLyBmb3IgbQorICAgIHRhYmxlLT5zZWN0W3NdLnNpemUgPSAwOworICAgIC8vIEZyZWUgc2VjdGlvbiBpdHNlbGYuCisgICAgS01QX0lOVEVSTkFMX0ZSRUUoKHZvaWQgKil0YWJsZS0+c2VjdFtzXS5zdHIpOworICAgIHRhYmxlLT5zZWN0W3NdLnN0ciA9IE5VTEw7CisgIH07IC8vIGZvciBzCisgIHRhYmxlLT5zaXplID0gMDsKKyAgS01QX0lOVEVSTkFMX0ZSRUUoKHZvaWQgKil0YWJsZS0+c2VjdCk7CisgIHRhYmxlLT5zZWN0ID0gTlVMTDsKK30gLy8ga21wX2kxOG5fdGFibGVfZnJlZQorCit2b2lkIF9fa21wX2kxOG5fZG9fY2F0b3BlbigpIHsKKworICBMQ0lEIGxvY2FsZV9pZCA9IEdldFRocmVhZExvY2FsZSgpOworICBXT1JEIGxhbmdfaWQgPSBMQU5HSURGUk9NTENJRChsb2NhbGVfaWQpOworICBXT1JEIHByaW1hcnlfbGFuZ19pZCA9IFBSSU1BUllMQU5HSUQobGFuZ19pZCk7CisgIGttcF9zdHJfYnVmX3QgcGF0aDsKKworICBLTVBfREVCVUdfQVNTRVJUKHN0YXR1cyA9PSBLTVBfSTE4Tl9DTE9TRUQpOworICBLTVBfREVCVUdfQVNTRVJUKGNhdCA9PSBLTVBfSTE4Tl9OVUxMQ0FUKTsKKworICBfX2ttcF9zdHJfYnVmX2luaXQoJnBhdGgpOworCisgIC8vIERvIG5vdCB0cnkgdG8gb3BlbiBFbmdsaXNoIGNhdGFsb2cgYmVjYXVzZSBpbnRlcm5hbCBtZXNzYWdlcyBhcmUgZXhhY3QgY29weQorICAvLyBvZiBtZXNzYWdlcyBpbiBFbmdsaXNoIGNhdGFsb2cuCisgIGlmIChwcmltYXJ5X2xhbmdfaWQgPT0gTEFOR19FTkdMSVNIKSB7CisgICAgc3RhdHVzID0gS01QX0kxOE5fQUJTRU5UOyAvLyBtYXJrIGNhdGFsb2cgYXMgYWJzZW50IHNvIGl0IHdpbGwgbm90CisgICAgLy8gYmUgcmUtb3BlbmVkLgorICAgIGdvdG8gZW5kOworICB9OyAvLyBpZgorCisgIC8vIENvbnN0cnVjdCByZXNvdXJjZSBETEwgbmFtZS4KKyAgLyogU2ltcGxlIExvYWRMaWJyYXJ5KCBuYW1lICkgaXMgbm90IHN1aXRhYmxlIGR1ZSB0byBzZWN1cml0eSBpc3N1ZSAoc2VlCisgICAgIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS90ZWNobmV0L3NlY3VyaXR5L2Fkdmlzb3J5LzIyNjk2MzcubXNweCkuIFdlIGhhdmUKKyAgICAgdG8gc3BlY2lmeSBmdWxsIHBhdGggdG8gdGhlIG1lc3NhZ2UgY2F0YWxvZy4gICovCisgIHsKKyAgICAvLyBHZXQgaGFuZGxlIG9mIG91ciBETEwgZmlyc3QuCisgICAgSE1PRFVMRSBoYW5kbGU7CisgICAgQk9PTCBicmMgPSBHZXRNb2R1bGVIYW5kbGVFeCgKKyAgICAgICAgR0VUX01PRFVMRV9IQU5ETEVfRVhfRkxBR19GUk9NX0FERFJFU1MgfAorICAgICAgICAgICAgR0VUX01PRFVMRV9IQU5ETEVfRVhfRkxBR19VTkNIQU5HRURfUkVGQ09VTlQsCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TFBDU1RSPigmX19rbXBfaTE4bl9kb19jYXRvcGVuKSwgJmhhbmRsZSk7CisgICAgaWYgKCFicmMpIHsgLy8gRXJyb3Igb2NjdXJyZWQuCisgICAgICBzdGF0dXMgPSBLTVBfSTE4Tl9BQlNFTlQ7IC8vIG1hcmsgY2F0YWxvZyBhcyBhYnNlbnQgc28gaXQgd2lsbCBub3QgYmUKKyAgICAgIC8vIHJlLW9wZW5lZC4KKyAgICAgIGdvdG8gZW5kOworICAgICAgLy8gVE9ETzogRW5hYmxlIG11bHRpcGxlIG1lc3NhZ2VzIChLTVBfTVNHKSB0byBiZSBwYXNzZWQgdG8gX19rbXBfbXNnOyBhbmQKKyAgICAgIC8vIHByaW50IGEgcHJvcGVyIHdhcm5pbmcuCisgICAgfTsgLy8gaWYKKworICAgIC8vIE5vdyBnZXQgcGF0aCB0byB0aGUgb3VyIERMTC4KKyAgICBmb3IgKDs7KSB7CisgICAgICBEV09SRCBkcmMgPSBHZXRNb2R1bGVGaWxlTmFtZShoYW5kbGUsIHBhdGguc3RyLCBwYXRoLnNpemUpOworICAgICAgaWYgKGRyYyA9PSAwKSB7IC8vIEVycm9yIG9jY3VycmVkLgorICAgICAgICBzdGF0dXMgPSBLTVBfSTE4Tl9BQlNFTlQ7CisgICAgICAgIGdvdG8gZW5kOworICAgICAgfTsgLy8gaWYKKyAgICAgIGlmIChkcmMgPCBwYXRoLnNpemUpIHsKKyAgICAgICAgcGF0aC51c2VkID0gZHJjOworICAgICAgICBicmVhazsKKyAgICAgIH07IC8vIGlmCisgICAgICBfX2ttcF9zdHJfYnVmX3Jlc2VydmUoJnBhdGgsIHBhdGguc2l6ZSAqIDIpOworICAgIH07IC8vIGZvcmV2ZXIKKworICAgIC8vIE5vdyBjb25zdHJ1Y3QgdGhlIG5hbWUgb2YgbWVzc2FnZSBjYXRhbG9nLgorICAgIGttcF9zdHJfZm5hbWUgZm5hbWU7CisgICAgX19rbXBfc3RyX2ZuYW1lX2luaXQoJmZuYW1lLCBwYXRoLnN0cik7CisgICAgX19rbXBfc3RyX2J1Zl9jbGVhcigmcGF0aCk7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmcGF0aCwgIiVzJWx1LyVzIiwgZm5hbWUuZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpKGxvY2FsZV9pZCksIG5hbWUpOworICAgIF9fa21wX3N0cl9mbmFtZV9mcmVlKCZmbmFtZSk7CisgIH0KKworICAvLyBGb3Igc2VjdXJpdHkgcmVhc29ucywgdXNlIExvYWRMaWJyYXJ5RXgoKSBhbmQgbG9hZCBtZXNzYWdlIGNhdGFsb2cgYXMgYQorICAvLyBkYXRhIGZpbGUuCisgIGNhdCA9IExvYWRMaWJyYXJ5RXgocGF0aC5zdHIsIE5VTEwsIExPQURfTElCUkFSWV9BU19EQVRBRklMRSk7CisgIHN0YXR1cyA9IChjYXQgPT0gS01QX0kxOE5fTlVMTENBVCA/IEtNUF9JMThOX0FCU0VOVCA6IEtNUF9JMThOX09QRU5FRCk7CisKKyAgaWYgKHN0YXR1cyA9PSBLTVBfSTE4Tl9BQlNFTlQpIHsKKyAgICBpZiAoX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPiBrbXBfd2FybmluZ3NfbG93KSB7CisgICAgICAvLyBBQzogb25seSBpc3N1ZSB3YXJuaW5nIGluIGNhc2UgZXhwbGljaXRseSBhc2tlZCB0bworICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgIC8vIEluZmluaXRlIHJlY3Vyc2lvbiB3aWxsIG5vdCBvY2N1ciAtLSBzdGF0dXMgaXMgS01QX0kxOE5fQUJTRU5UIG5vdywgc28KKyAgICAgIC8vIF9fa21wX2kxOG5fY2F0Z2V0cygpIHdpbGwgbm90IHRyeSB0byBvcGVuIGNhdGFsb2cgYnV0IHdpbGwgcmV0dXJuCisgICAgICAvLyBkZWZhdWx0IG1lc3NhZ2UuCisgICAgICAvKiBJZiBtZXNzYWdlIGNhdGFsb2cgZm9yIGFub3RoZXIgYXJjaGl0ZWN0dXJlIGZvdW5kIChlLmcuIE9wZW5NUCBSVEwgZm9yCisgICAgICAgICBJQS0zMiBhcmNoaXRlY3R1cmUgb3BlbnMgbGlib21wdWkuZGxsIGZvciBJbnRlbChSKSA2NCkgV2luZG93cyogT1MKKyAgICAgICAgIHJldHVybnMgZXJyb3IgMTkzIChFUlJPUl9CQURfRVhFX0ZPUk1BVCkuIEhvd2V2ZXIsIEZvcm1hdE1lc3NhZ2UgZmFpbHMKKyAgICAgICAgIHRvIHJldHVybiBhIG1lc3NhZ2UgZm9yIHRoaXMgZXJyb3IsIHNvIHVzZXIgd2lsbCBzZWU6CisKKyAgICAgICAgIE9NUDogV2FybmluZyAjMjogQ2Fubm90IG9wZW4gbWVzc2FnZSBjYXRhbG9nICIxMDQxXGxpYm9tcHVpLmRsbCI6CisgICAgICAgICBPTVA6IFN5c3RlbSBlcnJvciAjMTkzOiAoTm8gc3lzdGVtIGVycm9yIG1lc3NhZ2UgYXZhaWxhYmxlKQorICAgICAgICAgT01QOiBJbmZvICMzOiBEZWZhdWx0IG1lc3NhZ2VzIHdpbGwgYmUgdXNlZC4KKworICAgICAgICAgSXNzdWUgaGludCBpbiB0aGlzIGNhc2Ugc28gY2F1c2Ugb2YgdHJvdWJsZSBpcyBtb3JlIHVuZGVyc3RhbmRhYmxlLiAqLworICAgICAga21wX21zZ190IGVycl9jb2RlID0gS01QX1NZU0VSUkNPREUoZXJyb3IpOworICAgICAgX19rbXBfbXNnKGttcF9tc193YXJuaW5nLCBLTVBfTVNHKENhbnRPcGVuTWVzc2FnZUNhdGFsb2csIHBhdGguc3RyKSwKKyAgICAgICAgICAgICAgICBlcnJfY29kZSwgKGVycm9yID09IEVSUk9SX0JBRF9FWEVfRk9STUFUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBLTVBfSE5UKEJhZEV4ZUZvcm1hdCwgcGF0aC5zdHIsIEtNUF9BUkNIX1NUUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9fa21wX21zZ19udWxsKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCk7CisgICAgICBpZiAoX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPT0ga21wX3dhcm5pbmdzX29mZikgeworICAgICAgICBfX2ttcF9zdHJfZnJlZSgmZXJyX2NvZGUuc3RyKTsKKyAgICAgIH0KKyAgICAgIEtNUF9JTkZPUk0oV2lsbFVzZURlZmF1bHRNZXNzYWdlcyk7CisgICAgfQorICB9IGVsc2UgeyAvLyBzdGF0dXMgPT0gS01QX0kxOE5fT1BFTkVECisKKyAgICBpbnQgc2VjdGlvbiA9IGdldF9zZWN0aW9uKGttcF9pMThuX3BycF9WZXJzaW9uKTsKKyAgICBpbnQgbnVtYmVyID0gZ2V0X251bWJlcihrbXBfaTE4bl9wcnBfVmVyc2lvbik7CisgICAgY2hhciBjb25zdCAqZXhwZWN0ZWQgPSBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2VjdFtzZWN0aW9uXS5zdHJbbnVtYmVyXTsKKyAgICBrbXBfc3RyX2J1Zl90IHZlcnNpb247IC8vIEFjdHVhbCB2ZXJzaW9uIG9mIHRoZSBjYXRhbG9nLgorICAgIF9fa21wX3N0cl9idWZfaW5pdCgmdmVyc2lvbik7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmdmVyc2lvbiwgIiVzIiwgX19fY2F0Z2V0cyhrbXBfaTE4bl9wcnBfVmVyc2lvbikpOworICAgIC8vIFN0cmluZyByZXR1cm5lZCBieSBjYXRnZXRzIGlzIGludmFsaWQgYWZ0ZXIgY2xvc2luZyBjYXRhbG9nLCBzbyBjb3B5IGl0LgorICAgIGlmIChzdHJjbXAodmVyc2lvbi5zdHIsIGV4cGVjdGVkKSAhPSAwKSB7CisgICAgICAvLyBDbG9zZSBiYWQgY2F0YWxvZy4KKyAgICAgIF9fa21wX2kxOG5fY2F0Y2xvc2UoKTsKKyAgICAgIHN0YXR1cyA9IEtNUF9JMThOX0FCU0VOVDsgLy8gQW5kIG1hcmsgaXQgYXMgYWJzZW50LgorICAgICAgaWYgKF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID4ga21wX3dhcm5pbmdzX2xvdykgeworICAgICAgICAvLyBBbmQgbm93IHByaW50IGEgd2FybmluZyB1c2luZyBkZWZhdWx0IG1lc3NhZ2VzLgorICAgICAgICBfX2ttcF9tc2coa21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICBLTVBfTVNHKFdyb25nTWVzc2FnZUNhdGFsb2csIHBhdGguc3RyLCB2ZXJzaW9uLnN0ciwgZXhwZWN0ZWQpLAorICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwpOworICAgICAgICBLTVBfSU5GT1JNKFdpbGxVc2VEZWZhdWx0TWVzc2FnZXMpOworICAgICAgfSAvLyBfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncworICAgIH07IC8vIGlmCisgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCZ2ZXJzaW9uKTsKKworICB9OyAvLyBpZgorICBjb2RlX3BhZ2UgPSBnZXRfY29kZV9wYWdlKCk7CisKK2VuZDoKKyAgX19rbXBfc3RyX2J1Zl9mcmVlKCZwYXRoKTsKKyAgcmV0dXJuOworfSAvLyBmdW5jIF9fa21wX2kxOG5fZG9fY2F0b3BlbgorCit2b2lkIF9fa21wX2kxOG5fY2F0Y2xvc2UoKSB7CisgIGlmIChzdGF0dXMgPT0gS01QX0kxOE5fT1BFTkVEKSB7CisgICAgS01QX0RFQlVHX0FTU0VSVChjYXQgIT0gS01QX0kxOE5fTlVMTENBVCk7CisgICAga21wX2kxOG5fdGFibGVfZnJlZSgmdGFibGUpOworICAgIEZyZWVMaWJyYXJ5KGNhdCk7CisgICAgY2F0ID0gS01QX0kxOE5fTlVMTENBVDsKKyAgfTsgLy8gaWYKKyAgY29kZV9wYWdlID0gZGVmYXVsdF9jb2RlX3BhZ2U7CisgIHN0YXR1cyA9IEtNUF9JMThOX0NMT1NFRDsKK30gLy8gZnVuYyBfX2ttcF9pMThuX2NhdGNsb3NlCisKKy8qIFdlIHVzZSBGb3JtYXRNZXNzYWdlKCkgdG8gZ2V0IHN0cmluZ3MgZnJvbSBjYXRhbG9nLCBnZXQgc3lzdGVtIGVycm9yCisgICBtZXNzYWdlcywgZXRjLiBGb3JtYXRNZXNzYWdlKCkgdGVuZHMgdG8gcmV0dXJuIFdpbmRvd3MqIE9TLXN0eWxlCisgICBlbmQtb2YtbGluZXMsICJcclxuIi4gV2hlbiBzdHJpbmcgaXMgcHJpbnRlZCwgcHJpbnRmKCkgYWxzbyByZXBsYWNlcyBhbGwgdGhlCisgICBvY2N1cnJlbmNlcyBvZiAiXG4iIHdpdGggIlxyXG4iIChhZ2FpbiEpLCBzbyBzZXF1ZW5jZXMgbGlrZSAiXHJcclxyXG4iCisgICBhcHBlYXIgaW4gb3V0cHV0LiBJdCBpcyBub3QgdG9vIGdvb2QuCisKKyAgIEFkZGl0aW9uYWwgbWVzcyBjb21lcyBmcm9tIG1lc3NhZ2UgY2F0YWxvZzogT3VyIGNhdGFsb2cgc291cmNlIGVuX1VTLm1jIGZpbGUKKyAgIChnZW5lcmF0ZWQgYnkgbWVzc2FnZS1jb252ZXJ0ZXIucGwpIGNvbnRhaW5zIG9ubHkgIlxuIiBjaGFyYWN0ZXJzLCBidXQKKyAgIGVuX1VTX21zZ18xMDMzLmJpbiBmaWxlIChwcm9kdWNlZCBieSBtYy5leGUpIG1heSBjb250YWluICJcclxuIiBvciBqdXN0ICJcbiIuCisgICBUaGlzIG1lc3MgZ29lcyBmcm9tIGVuX1VTX21zZ18xMDMzLmJpbiBmaWxlIHRvIG1lc3NhZ2UgY2F0YWxvZywKKyAgIGxpYm9tcHVpLmRsbC4gRm9yIGV4YW1wbGUsIG1lc3NhZ2UKKworICAgRXJyb3IKKworICAgKHRoZXJlIGlzICJcbiIgYXQgdGhlIGVuZCkgaXMgY29tcGlsZWQgYnkgbWMuZXhlIHRvICJFcnJvclxyXG4iLCB3aGlsZQorCisgICBPTVA6IEVycm9yICUxIWQhOiAlMiFzIVxuCisKKyAgICh0aGVyZSBpcyAiXG4iIGF0IHRoZSBlbmQgYXMgd2VsbCkgaXMgY29tcGlsZWQgdG8gIk9NUDogRXJyb3IgJTEhZCE6CisgICAlMiFzIVxyXG5cbiIuCisKKyAgIFRodXMsIHN0cmlwcGluZyBhbGwgIlxyIiBub3JtYWxpemVzIHN0cmluZyBhbmQgcmV0dXJucyBpdCB0byBjYW5vbmljYWwgZm9ybSwKKyAgIHNvIHByaW50ZigpIHdpbGwgcHJvZHVjZSBjb3JyZWN0IGVuZC1vZi1saW5lIHNlcXVlbmNlcy4KKworICAgX19fc3RyaXBfY3JzKCkgc2VydmVzIGZvciB0aGlzIHB1cnBvc2U6IGl0IHJlbW92ZXMgYWxsIHRoZSBvY2N1cnJlbmNlcyBvZgorICAgIlxyIiBpbi1wbGFjZSBhbmQgcmV0dXJucyBuZXcgbGVuZ3RoIG9mIHN0cmluZy4gICovCitzdGF0aWMgaW50IF9fX3N0cmlwX2NycyhjaGFyICpzdHIpIHsKKyAgaW50IGluID0gMDsgLy8gSW5wdXQgY2hhcmFjdGVyIGluZGV4LgorICBpbnQgb3V0ID0gMDsgLy8gT3V0cHV0IGNoYXJhY3RlciBpbmRleC4KKyAgZm9yICg7OykgeworICAgIGlmIChzdHJbaW5dICE9ICdccicpIHsKKyAgICAgIHN0cltvdXRdID0gc3RyW2luXTsKKyAgICAgICsrb3V0OworICAgIH07IC8vIGlmCisgICAgaWYgKHN0cltpbl0gPT0gMCkgeworICAgICAgYnJlYWs7CisgICAgfTsgLy8gaWYKKyAgICArK2luOworICB9OyAvLyBmb3JldmVyCisgIHJldHVybiBvdXQgLSAxOworfSAvLyBmdW5jIF9fc3RyaXBfY3JzCisKK3N0YXRpYyBjaGFyIGNvbnN0ICpfX19jYXRnZXRzKGttcF9pMThuX2lkX3QgaWQpIHsKKworICBjaGFyICpyZXN1bHQgPSBOVUxMOworICBQVk9JRCBhZGRyID0gTlVMTDsKKyAgd2NoYXJfdCAqd21zZyA9IE5VTEw7CisgIERXT1JEIHdsZW4gPSAwOworICBjaGFyICptc2cgPSBOVUxMOworICBpbnQgbGVuID0gMDsKKyAgaW50IHJjOworCisgIEtNUF9ERUJVR19BU1NFUlQoY2F0ICE9IEtNUF9JMThOX05VTExDQVQpOworICB3bGVuID0gLy8gd2xlbiBkb2VzICpub3QqIGluY2x1ZGUgdGVybWluYXRpbmcgbnVsbC4KKyAgICAgIEZvcm1hdE1lc3NhZ2VXKEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgRk9STUFUX01FU1NBR0VfRlJPTV9ITU9EVUxFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUywKKyAgICAgICAgICAgICAgICAgICAgIGNhdCwgaWQsCisgICAgICAgICAgICAgICAgICAgICAwLCAvLyBMYW5nSWQKKyAgICAgICAgICAgICAgICAgICAgIChMUFdTVFIpJmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAwLCAvLyBTaXplIGluIGVsZW1lbnRzLCBub3QgaW4gYnl0ZXMuCisgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgaWYgKHdsZW4gPD0gMCkgeworICAgIGdvdG8gZW5kOworICB9OyAvLyBpZgorICB3bXNnID0gKHdjaGFyX3QgKilhZGRyOyAvLyBXYXJuaW5nOiB3bXNnIG1heSBiZSBub3QgbnVsLXRlcm1pbmF0ZWQhCisKKyAgLy8gQ2FsY3VsYXRlIGxlbmd0aCBvZiBtdWx0aWJ5dGUgbWVzc2FnZS4KKyAgLy8gU2luY2Ugd2xlbiBkb2VzIG5vdCBpbmNsdWRlIHRlcm1pbmF0aW5nIG51bGwsIGxlbiBkb2VzIG5vdCBpbmNsdWRlIGl0IGFsc28uCisgIGxlbiA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoY29kZV9wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8vIEZsYWdzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdtc2csIHdsZW4sIC8vIFdpZGUgYnVmZmVyIGFuZCBzaXplLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIC8vIEJ1ZmZlciBhbmQgc2l6ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMIC8vIERlZmF1bHQgY2hhciBhbmQgdXNlZCBkZWZhdWx0IGNoYXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgaWYgKGxlbiA8PSAwKSB7CisgICAgZ290byBlbmQ7CisgIH07IC8vIGlmCisKKyAgLy8gQWxsb2NhdGUgbWVtb3J5LgorICBtc2cgPSAoY2hhciAqKUtNUF9JTlRFUk5BTF9NQUxMT0MobGVuICsgMSk7CisKKyAgLy8gQ29udmVydCB3aWRlIG1lc3NhZ2UgdG8gbXVsdGlieXRlIG9uZS4KKyAgcmMgPSBXaWRlQ2hhclRvTXVsdGlCeXRlKGNvZGVfcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8vIEZsYWdzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgd21zZywgd2xlbiwgLy8gV2lkZSBidWZmZXIgYW5kIHNpemUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2csIGxlbiwgLy8gQnVmZmVyIGFuZCBzaXplLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCAvLyBEZWZhdWx0IGNoYXIgYW5kIHVzZWQgZGVmYXVsdCBjaGFyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgaWYgKHJjIDw9IDAgfHwgcmMgPiBsZW4pIHsKKyAgICBnb3RvIGVuZDsKKyAgfTsgLy8gaWYKKyAgS01QX0RFQlVHX0FTU0VSVChyYyA9PSBsZW4pOworICBsZW4gPSByYzsKKyAgbXNnW2xlbl0gPSAwOyAvLyBQdXQgdGVybWluYXRpbmcgbnVsbCB0byB0aGUgZW5kLgorCisgIC8vIFN0cmlwcGluZyBhbGwgIlxyIiBiZWZvcmUgc3RyaXBwaW5nIGxhc3QgZW5kLW9mLWxpbmUgc2ltcGxpZmllcyB0aGUgdGFzay4KKyAgbGVuID0gX19fc3RyaXBfY3JzKG1zZyk7CisKKyAgLy8gRXZlcnkgbWVzc2FnZSBpbiBjYXRhbG9nIGlzIHRlcm1pbmF0ZWQgd2l0aCAiXG4iLiBTdHJpcCBpdC4KKyAgaWYgKGxlbiA+PSAxICYmIG1zZ1tsZW4gLSAxXSA9PSAnXG4nKSB7CisgICAgLS1sZW47CisgICAgbXNnW2xlbl0gPSAwOworICB9OyAvLyBpZgorCisgIC8vIEV2ZXJ5dGhpbmcgbG9va3Mgb2suCisgIHJlc3VsdCA9IG1zZzsKKyAgbXNnID0gTlVMTDsKKworZW5kOgorCisgIGlmIChtc2cgIT0gTlVMTCkgeworICAgIEtNUF9JTlRFUk5BTF9GUkVFKG1zZyk7CisgIH07IC8vIGlmCisgIGlmICh3bXNnICE9IE5VTEwpIHsKKyAgICBMb2NhbEZyZWUod21zZyk7CisgIH07IC8vIGlmCisKKyAgcmV0dXJuIHJlc3VsdDsKKworfSAvLyBfX19jYXRnZXRzCisKK2NoYXIgY29uc3QgKl9fa21wX2kxOG5fY2F0Z2V0cyhrbXBfaTE4bl9pZF90IGlkKSB7CisKKyAgaW50IHNlY3Rpb24gPSBnZXRfc2VjdGlvbihpZCk7CisgIGludCBudW1iZXIgPSBnZXRfbnVtYmVyKGlkKTsKKyAgY2hhciBjb25zdCAqbWVzc2FnZSA9IE5VTEw7CisKKyAgaWYgKDEgPD0gc2VjdGlvbiAmJiBzZWN0aW9uIDw9IF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zaXplKSB7CisgICAgaWYgKDEgPD0gbnVtYmVyICYmIG51bWJlciA8PSBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2VjdFtzZWN0aW9uXS5zaXplKSB7CisgICAgICBpZiAoc3RhdHVzID09IEtNUF9JMThOX0NMT1NFRCkgeworICAgICAgICBfX2ttcF9pMThuX2NhdG9wZW4oKTsKKyAgICAgIH07IC8vIGlmCisgICAgICBpZiAoY2F0ICE9IEtNUF9JMThOX05VTExDQVQpIHsKKyAgICAgICAgaWYgKHRhYmxlLnNpemUgPT0gMCkgeworICAgICAgICAgIHRhYmxlLnNlY3QgPSAoa21wX2kxOG5fc2VjdGlvbl90ICopS01QX0lOVEVSTkFMX0NBTExPQygKKyAgICAgICAgICAgICAgKF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zaXplICsgMiksIHNpemVvZihrbXBfaTE4bl9zZWN0aW9uX3QpKTsKKyAgICAgICAgICB0YWJsZS5zaXplID0gX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNpemU7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIGlmICh0YWJsZS5zZWN0W3NlY3Rpb25dLnNpemUgPT0gMCkgeworICAgICAgICAgIHRhYmxlLnNlY3Rbc2VjdGlvbl0uc3RyID0gKGNvbnN0IGNoYXIgKiopS01QX0lOVEVSTkFMX0NBTExPQygKKyAgICAgICAgICAgICAgX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNlY3Rbc2VjdGlvbl0uc2l6ZSArIDIsCisgICAgICAgICAgICAgIHNpemVvZihjaGFyIGNvbnN0ICopKTsKKyAgICAgICAgICB0YWJsZS5zZWN0W3NlY3Rpb25dLnNpemUgPQorICAgICAgICAgICAgICBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2VjdFtzZWN0aW9uXS5zaXplOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBpZiAodGFibGUuc2VjdFtzZWN0aW9uXS5zdHJbbnVtYmVyXSA9PSBOVUxMKSB7CisgICAgICAgICAgdGFibGUuc2VjdFtzZWN0aW9uXS5zdHJbbnVtYmVyXSA9IF9fX2NhdGdldHMoaWQpOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBtZXNzYWdlID0gdGFibGUuc2VjdFtzZWN0aW9uXS5zdHJbbnVtYmVyXTsKKyAgICAgIH07IC8vIGlmCisgICAgICBpZiAobWVzc2FnZSA9PSBOVUxMKSB7CisgICAgICAgIC8vIENhdGFsb2cgaXMgbm90IG9wZW5lZCBvciBtZXNzYWdlIGlzIG5vdCBmb3VuZCwgcmV0dXJuIGRlZmF1bHQKKyAgICAgICAgLy8gbWVzc2FnZS4KKyAgICAgICAgbWVzc2FnZSA9IF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zZWN0W3NlY3Rpb25dLnN0cltudW1iZXJdOworICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorICB9OyAvLyBpZgorICBpZiAobWVzc2FnZSA9PSBOVUxMKSB7CisgICAgbWVzc2FnZSA9IG5vX21lc3NhZ2VfYXZhaWxhYmxlOworICB9OyAvLyBpZgorICByZXR1cm4gbWVzc2FnZTsKKworfSAvLyBmdW5jIF9fa21wX2kxOG5fY2F0Z2V0cworCisjZW5kaWYgLy8gS01QX09TX1dJTkRPV1MKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmbmRlZiBLTVBfSTE4Tl9PSworI2Vycm9yIEkxOG4gc3VwcG9ydCBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgT1MuCisjZW5kaWYgLy8gS01QX0kxOE5fT0sKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBfX2ttcF9pMThuX2R1bXBfY2F0YWxvZyhrbXBfc3RyX2J1Zl90ICpidWZmZXIpIHsKKworICBzdHJ1Y3Qga21wX2kxOG5faWRfcmFuZ2VfdCB7CisgICAga21wX2kxOG5faWRfdCBmaXJzdDsKKyAgICBrbXBfaTE4bl9pZF90IGxhc3Q7CisgIH07IC8vIHN0cnVjdCBrbXBfaTE4bl9pZF9yYW5nZV90CisKKyAgc3RhdGljIHN0cnVjdCBrbXBfaTE4bl9pZF9yYW5nZV90IHJhbmdlc1tdID0geworICAgICAge2ttcF9pMThuX3BycF9maXJzdCwga21wX2kxOG5fcHJwX2xhc3R9LAorICAgICAge2ttcF9pMThuX3N0cl9maXJzdCwga21wX2kxOG5fc3RyX2xhc3R9LAorICAgICAge2ttcF9pMThuX2ZtdF9maXJzdCwga21wX2kxOG5fZm10X2xhc3R9LAorICAgICAge2ttcF9pMThuX21zZ19maXJzdCwga21wX2kxOG5fbXNnX2xhc3R9LAorICAgICAge2ttcF9pMThuX2hudF9maXJzdCwga21wX2kxOG5faG50X2xhc3R9fTsgLy8gcmFuZ2VzCisKKyAgaW50IG51bV9vZl9yYW5nZXMgPSBzaXplb2YocmFuZ2VzKSAvIHNpemVvZihzdHJ1Y3Qga21wX2kxOG5faWRfcmFuZ2VfdCk7CisgIGludCByYW5nZTsKKyAga21wX2kxOG5faWRfdCBpZDsKKworICBmb3IgKHJhbmdlID0gMDsgcmFuZ2UgPCBudW1fb2ZfcmFuZ2VzOyArK3JhbmdlKSB7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIqKiogU2V0ICMlZCAqKipcbiIsIHJhbmdlICsgMSk7CisgICAgZm9yIChpZCA9IChrbXBfaTE4bl9pZF90KShyYW5nZXNbcmFuZ2VdLmZpcnN0ICsgMSk7IGlkIDwgcmFuZ2VzW3JhbmdlXS5sYXN0OworICAgICAgICAgaWQgPSAoa21wX2kxOG5faWRfdCkoaWQgKyAxKSkgeworICAgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIlZDogPDwlcz4+XG4iLCBpZCwgX19rbXBfaTE4bl9jYXRnZXRzKGlkKSk7CisgICAgfTsgLy8gZm9yIGlkCisgIH07IC8vIGZvciByYW5nZQorCisgIF9fa21wX3ByaW50ZigiJXMiLCBidWZmZXItPnN0cik7CisKK30gLy8gX19rbXBfaTE4bl9kdW1wX2NhdGFsb2cKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ttcF9tc2dfdCBfX2ttcF9tc2dfZm9ybWF0KHVuc2lnbmVkIGlkX2FyZywgLi4uKSB7CisKKyAga21wX21zZ190IG1zZzsKKyAgdmFfbGlzdCBhcmdzOworICBrbXBfc3RyX2J1Zl90IGJ1ZmZlcjsKKyAgX19rbXBfc3RyX2J1Zl9pbml0KCZidWZmZXIpOworCisgIHZhX3N0YXJ0KGFyZ3MsIGlkX2FyZyk7CisKKyAgLy8gV2UgdXNlIHVuc2lnbmVkIGZvciB0aGUgSUQgYXJndW1lbnQgYW5kIGV4cGxpY2l0bHkgY2FzdCBpdCBoZXJlIHRvIHRoZQorICAvLyByaWdodCBlbnVtZXJhdG9yIGJlY2F1c2UgdmFyaWFkaWMgZnVuY3Rpb25zIGFyZSBub3QgY29tcGF0aWJsZSB3aXRoCisgIC8vIGRlZmF1bHQgcHJvbW90aW9ucy4KKyAga21wX2kxOG5faWRfdCBpZCA9IChrbXBfaTE4bl9pZF90KWlkX2FyZzsKKworI2lmIEtNUF9PU19VTklYCisgIC8vIE9uIExpbnV4KiBPUyBhbmQgT1MgWCosIHByaW50ZigpIGZhbWlseSBmdW5jdGlvbnMgcHJvY2VzcyBwYXJhbWV0ZXIKKyAgLy8gbnVtYmVycywgZm9yIGV4YW1wbGU6ICAiJTIkcyAlMSRzIi4KKyAgX19rbXBfc3RyX2J1Zl92cHJpbnQoJmJ1ZmZlciwgX19rbXBfaTE4bl9jYXRnZXRzKGlkKSwgYXJncyk7CisjZWxpZiBLTVBfT1NfV0lORE9XUworICAvLyBPbiBXaW5vZHdzLCBwcmludGYoKSBmYW1pbHkgZnVuY3Rpb25zIGRvZXMgbm90IHJlY29nbml6ZSBHTlUgc3R5bGUKKyAgLy8gcGFyYW1ldGVyIG51bWJlcnMsIHNvIHdlIGhhdmUgdG8gdXNlIEZvcm1hdE1lc3NhZ2UoKSBpbnN0ZWFkLiBJdCByZWNvZ25pemVzCisgIC8vIHBhcmFtZXRlciBudW1iZXJzLCBlLiBnLjogICIlMiFzISAiJTEhcyEiLgorICB7CisgICAgTFBUU1RSIHN0ciA9IE5VTEw7CisgICAgaW50IGxlbjsKKyAgICBGb3JtYXRNZXNzYWdlKEZPUk1BVF9NRVNTQUdFX0ZST01fU1RSSU5HIHwgRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSLAorICAgICAgICAgICAgICAgICAgX19rbXBfaTE4bl9jYXRnZXRzKGlkKSwgMCwgMCwgKExQVFNUUikoJnN0ciksIDAsICZhcmdzKTsKKyAgICBsZW4gPSBfX19zdHJpcF9jcnMoc3RyKTsKKyAgICBfX2ttcF9zdHJfYnVmX2NhdCgmYnVmZmVyLCBzdHIsIGxlbik7CisgICAgTG9jYWxGcmVlKHN0cik7CisgIH0KKyNlbHNlCisjZXJyb3IKKyNlbmRpZgorICB2YV9lbmQoYXJncyk7CisgIF9fa21wX3N0cl9idWZfZGV0YWNoKCZidWZmZXIpOworCisgIG1zZy50eXBlID0gKGttcF9tc2dfdHlwZV90KShpZCA+PiAxNik7CisgIG1zZy5udW0gPSBpZCAmIDB4RkZGRjsKKyAgbXNnLnN0ciA9IGJ1ZmZlci5zdHI7CisgIG1zZy5sZW4gPSBidWZmZXIudXNlZDsKKworICByZXR1cm4gbXNnOworCit9IC8vIF9fa21wX21zZ19mb3JtYXQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyBjaGFyICpzeXNfZXJyb3IoaW50IGVycikgeworCisgIGNoYXIgKm1lc3NhZ2UgPSBOVUxMOworCisjaWYgS01QX09TX1dJTkRPV1MKKworICBMUFZPSUQgYnVmZmVyID0gTlVMTDsKKyAgaW50IGxlbjsKKyAgRFdPUkQgcmM7CisgIHJjID0gRm9ybWF0TWVzc2FnZSgKKyAgICAgIEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8IEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNLCBOVUxMLCBlcnIsCisgICAgICBNQUtFTEFOR0lEKExBTkdfTkVVVFJBTCwgU1VCTEFOR19ERUZBVUxUKSwgLy8gRGVmYXVsdCBsYW5ndWFnZS4KKyAgICAgIChMUFRTVFIpJmJ1ZmZlciwgMCwgTlVMTCk7CisgIGlmIChyYyA+IDApIHsKKyAgICAvLyBNZXNzYWdlIGZvcm1hdHRlZC4gQ29weSBpdCAoc28gd2UgY2FuIGZyZWUgaXQgbGF0ZXIgd2l0aCBub3JtYWwgZnJlZSgpLgorICAgIG1lc3NhZ2UgPSBfX2ttcF9zdHJfZm9ybWF0KCIlcyIsIChjaGFyICopYnVmZmVyKTsKKyAgICBsZW4gPSBfX19zdHJpcF9jcnMobWVzc2FnZSk7IC8vIERlbGV0ZSBjYXJyaWFnZSByZXR1cm5zIGlmIGFueS4KKyAgICAvLyBTdHJpcCB0cmFpbGluZyBuZXdsaW5lcy4KKyAgICB3aGlsZSAobGVuID4gMCAmJiBtZXNzYWdlW2xlbiAtIDFdID09ICdcbicpIHsKKyAgICAgIC0tbGVuOworICAgIH07IC8vIHdoaWxlCisgICAgbWVzc2FnZVtsZW5dID0gMDsKKyAgfSBlbHNlIHsKKyAgICAvLyBGb3JtYXRNZXNzYWdlKCkgZmFpbGVkIHRvIGZvcm1hdCBzeXN0ZW0gZXJyb3IgbWVzc2FnZS4gR2V0TGFzdEVycm9yKCkKKyAgICAvLyB3b3VsZCBnaXZlIHVzIGVycm9yIGNvZGUsIHdoaWNoIHdlIHdvdWxkIGNvbnZlcnQgdG8gbWVzc2FnZS4uLiB0aGlzIGl0CisgICAgLy8gZGFuZ2Vyb3VzIHJlY3Vyc2lvbiwgd2hpY2ggY2Fubm90IGNsYXJpZnkgb3JpZ2luYWwgZXJyb3IsIHNvIHdlIHdpbGwgbm90CisgICAgLy8gZXZlbiBzdGFydCBpdC4KKyAgfTsgLy8gaWYKKyAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7CisgICAgTG9jYWxGcmVlKGJ1ZmZlcik7CisgIH07IC8vIGlmCisKKyNlbHNlIC8vIE5vbi1XaW5kb3dzKiBPUzogTGludXgqIE9TIG9yIE9TIFgqCisKKy8qIFRoZXJlIGFyZSAyIGluY29tcGF0aWJsZSB2ZXJzaW9ucyBvZiBzdHJlcnJvcl9yOgorCisgICBjaGFyICogc3RyZXJyb3JfciggaW50LCBjaGFyICosIHNpemVfdCApOyAgLy8gR05VIHZlcnNpb24KKyAgIGludCAgICBzdHJlcnJvcl9yKCBpbnQsIGNoYXIgKiwgc2l6ZV90ICk7ICAvLyBYU0kgdmVyc2lvbgorKi8KKworI2lmIChkZWZpbmVkKF9fR0xJQkNfXykgJiYgZGVmaW5lZChfR05VX1NPVVJDRSkpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoZGVmaW5lZChfX0JJT05JQ19fKSAmJiBkZWZpbmVkKF9HTlVfU09VUkNFKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIF9fQU5EUk9JRF9BUElfXyA+PSBfX0FORFJPSURfQVBJX01fXykKKyAgLy8gR05VIHZlcnNpb24gb2Ygc3RyZXJyb3Jfci4KKworICBjaGFyIGJ1ZmZlclsyMDQ4XTsKKyAgY2hhciAqY29uc3QgZXJyX21zZyA9IHN0cmVycm9yX3IoZXJyLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKyAgLy8gRG8gbm90IGVsaW1pbmF0ZSB0aGlzIGFzc2lnbm1lbnQgdG8gdGVtcG9yYXJ5IHZhcmlhYmxlLCBvdGhlcndpc2UgY29tcGlsZXIKKyAgLy8gd291bGQgbm90IGlzc3VlIHdhcm5pbmcgaWYgc3RyZXJyb3JfcigpIHJldHVybnMgYGludCcgaW5zdGVhZCBvZiBleHBlY3RlZAorICAvLyBgY2hhciAqJy4KKyAgbWVzc2FnZSA9IF9fa21wX3N0cl9mb3JtYXQoIiVzIiwgZXJyX21zZyk7CisKKyNlbHNlIC8vIE9TIFgqLCBGcmVlQlNEKiBldGMuCisgIC8vIFhTSSB2ZXJzaW9uIG9mIHN0cmVycm9yX3IuCisgIGludCBzaXplID0gMjA0ODsKKyAgY2hhciAqYnVmZmVyID0gKGNoYXIgKilLTVBfSU5URVJOQUxfTUFMTE9DKHNpemUpOworICBpbnQgcmM7CisgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgIEtNUF9GQVRBTChNZW1vcnlBbGxvY0ZhaWxlZCk7CisgIH0KKyAgcmMgPSBzdHJlcnJvcl9yKGVyciwgYnVmZmVyLCBzaXplKTsKKyAgaWYgKHJjID09IC0xKSB7CisgICAgcmMgPSBlcnJubzsgLy8gWFNJIHZlcnNpb24gc2V0cyBlcnJuby4KKyAgfTsgLy8gaWYKKyAgd2hpbGUgKHJjID09IEVSQU5HRSkgeyAvLyBFUkFOR0UgbWVhbnMgdGhlIGJ1ZmZlciBpcyB0b28gc21hbGwuCisgICAgS01QX0lOVEVSTkFMX0ZSRUUoYnVmZmVyKTsKKyAgICBzaXplICo9IDI7CisgICAgYnVmZmVyID0gKGNoYXIgKilLTVBfSU5URVJOQUxfTUFMTE9DKHNpemUpOworICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgS01QX0ZBVEFMKE1lbW9yeUFsbG9jRmFpbGVkKTsKKyAgICB9CisgICAgcmMgPSBzdHJlcnJvcl9yKGVyciwgYnVmZmVyLCBzaXplKTsKKyAgICBpZiAocmMgPT0gLTEpIHsKKyAgICAgIHJjID0gZXJybm87IC8vIFhTSSB2ZXJzaW9uIHNldHMgZXJybm8uCisgICAgfTsgLy8gaWYKKyAgfTsgLy8gd2hpbGUKKyAgaWYgKHJjID09IDApIHsKKyAgICBtZXNzYWdlID0gYnVmZmVyOworICB9IGVsc2UgeyAvLyBCdWZmZXIgaXMgdW51c2VkLiBGcmVlIGl0LgorICAgIEtNUF9JTlRFUk5BTF9GUkVFKGJ1ZmZlcik7CisgIH07IC8vIGlmCisKKyNlbmRpZgorCisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKworICBpZiAobWVzc2FnZSA9PSBOVUxMKSB7CisgICAgLy8gVE9ETzogSTE4biB0aGlzIG1lc3NhZ2UuCisgICAgbWVzc2FnZSA9IF9fa21wX3N0cl9mb3JtYXQoIiVzIiwgIihObyBzeXN0ZW0gZXJyb3IgbWVzc2FnZSBhdmFpbGFibGUpIik7CisgIH07IC8vIGlmCisgIHJldHVybiBtZXNzYWdlOworfSAvLyBzeXNfZXJyb3IKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ttcF9tc2dfdCBfX2ttcF9tc2dfZXJyb3JfY29kZShpbnQgY29kZSkgeworCisgIGttcF9tc2dfdCBtc2c7CisgIG1zZy50eXBlID0ga21wX210X3N5c2VycjsKKyAgbXNnLm51bSA9IGNvZGU7CisgIG1zZy5zdHIgPSBzeXNfZXJyb3IoY29kZSk7CisgIG1zZy5sZW4gPSBLTVBfU1RSTEVOKG1zZy5zdHIpOworICByZXR1cm4gbXNnOworCit9IC8vIF9fa21wX21zZ19lcnJvcl9jb2RlCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitrbXBfbXNnX3QgX19rbXBfbXNnX2Vycm9yX21lc2coY2hhciBjb25zdCAqbWVzZykgeworCisgIGttcF9tc2dfdCBtc2c7CisgIG1zZy50eXBlID0ga21wX210X3N5c2VycjsKKyAgbXNnLm51bSA9IDA7CisgIG1zZy5zdHIgPSBfX2ttcF9zdHJfZm9ybWF0KCIlcyIsIG1lc2cpOworICBtc2cubGVuID0gS01QX1NUUkxFTihtc2cuc3RyKTsKKyAgcmV0dXJuIG1zZzsKKworfSAvLyBfX2ttcF9tc2dfZXJyb3JfbWVzZworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCBfX2ttcF9tc2coa21wX21zZ19zZXZlcml0eV90IHNldmVyaXR5LCBrbXBfbXNnX3QgbWVzc2FnZSwgLi4uKSB7CisKKyAgdmFfbGlzdCBhcmdzOworICBrbXBfaTE4bl9pZF90IGZvcm1hdDsgLy8gZm9ybWF0IGlkZW50aWZpZXIKKyAga21wX21zZ190IGZtc2c7IC8vIGZvcm1hdHRlZCBtZXNzYWdlCisgIGttcF9zdHJfYnVmX3QgYnVmZmVyOworCisgIGlmIChzZXZlcml0eSAhPSBrbXBfbXNfZmF0YWwgJiYgX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPT0ga21wX3dhcm5pbmdzX29mZikKKyAgICByZXR1cm47IC8vIG5vIHJlYXNvbiB0byBmb3JtIGEgc3RyaW5nIGluIG9yZGVyIHRvIG5vdCBwcmludCBpdAorCisgIF9fa21wX3N0cl9idWZfaW5pdCgmYnVmZmVyKTsKKworICAvLyBGb3JtYXQgdGhlIHByaW1hcnkgbWVzc2FnZS4KKyAgc3dpdGNoIChzZXZlcml0eSkgeworICBjYXNlIGttcF9tc19pbmZvcm06IHsKKyAgICBmb3JtYXQgPSBrbXBfaTE4bl9mbXRfSW5mbzsKKyAgfSBicmVhazsKKyAgY2FzZSBrbXBfbXNfd2FybmluZzogeworICAgIGZvcm1hdCA9IGttcF9pMThuX2ZtdF9XYXJuaW5nOworICB9IGJyZWFrOworICBjYXNlIGttcF9tc19mYXRhbDogeworICAgIGZvcm1hdCA9IGttcF9pMThuX2ZtdF9GYXRhbDsKKyAgfSBicmVhazsKKyAgZGVmYXVsdDogeyBLTVBfREVCVUdfQVNTRVJUKDApOyB9OworICB9OyAvLyBzd2l0Y2gKKyAgZm1zZyA9IF9fa21wX21zZ19mb3JtYXQoZm9ybWF0LCBtZXNzYWdlLm51bSwgbWVzc2FnZS5zdHIpOworICBfX2ttcF9zdHJfZnJlZSgmbWVzc2FnZS5zdHIpOworICBfX2ttcF9zdHJfYnVmX2NhdCgmYnVmZmVyLCBmbXNnLnN0ciwgZm1zZy5sZW4pOworICBfX2ttcF9zdHJfZnJlZSgmZm1zZy5zdHIpOworCisgIC8vIEZvcm1hdCBvdGhlciBtZXNzYWdlcy4KKyAgdmFfc3RhcnQoYXJncywgbWVzc2FnZSk7CisgIGZvciAoOzspIHsKKyAgICBtZXNzYWdlID0gdmFfYXJnKGFyZ3MsIGttcF9tc2dfdCk7CisgICAgaWYgKG1lc3NhZ2UudHlwZSA9PSBrbXBfbXRfZHVtbXkgJiYgbWVzc2FnZS5zdHIgPT0gTlVMTCkgeworICAgICAgYnJlYWs7CisgICAgfTsgLy8gaWYKKyAgICBpZiAobWVzc2FnZS50eXBlID09IGttcF9tdF9kdW1teSAmJiBtZXNzYWdlLnN0ciA9PSBfX2ttcF9tc2dfZW1wdHkuc3RyKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9OyAvLyBpZgorICAgIHN3aXRjaCAobWVzc2FnZS50eXBlKSB7CisgICAgY2FzZSBrbXBfbXRfaGludDogeworICAgICAgZm9ybWF0ID0ga21wX2kxOG5fZm10X0hpbnQ7CisgICAgfSBicmVhazsKKyAgICBjYXNlIGttcF9tdF9zeXNlcnI6IHsKKyAgICAgIGZvcm1hdCA9IGttcF9pMThuX2ZtdF9TeXNFcnI7CisgICAgfSBicmVhazsKKyAgICBkZWZhdWx0OiB7IEtNUF9ERUJVR19BU1NFUlQoMCk7IH07CisgICAgfTsgLy8gc3dpdGNoCisgICAgZm1zZyA9IF9fa21wX21zZ19mb3JtYXQoZm9ybWF0LCBtZXNzYWdlLm51bSwgbWVzc2FnZS5zdHIpOworICAgIF9fa21wX3N0cl9mcmVlKCZtZXNzYWdlLnN0cik7CisgICAgX19rbXBfc3RyX2J1Zl9jYXQoJmJ1ZmZlciwgZm1zZy5zdHIsIGZtc2cubGVuKTsKKyAgICBfX2ttcF9zdHJfZnJlZSgmZm1zZy5zdHIpOworICB9OyAvLyBmb3JldmVyCisgIHZhX2VuZChhcmdzKTsKKworICAvLyBQcmludCBmb3JtYXR0ZWQgbWVzc2FnZXMuCisgIC8vIFRoaXMgbG9jayBwcmV2ZW50cyBtdWx0aXBsZSBmYXRhbCBlcnJvcnMgb24gdGhlIHNhbWUgcHJvYmxlbS4KKyAgLy8gX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiBsb2NrICk7ICAgIC8vIEdFSCAtIFRoaXMgbG9jayBjYXVzaW5nIHRlc3RzCisgIC8vIHRvIGhhbmcgb24gT1MgWCouCisgIF9fa21wX3ByaW50ZigiJXMiLCBidWZmZXIuc3RyKTsKKyAgX19rbXBfc3RyX2J1Zl9mcmVlKCZidWZmZXIpOworCisgIGlmIChzZXZlcml0eSA9PSBrbXBfbXNfZmF0YWwpIHsKKyNpZiBLTVBfT1NfV0lORE9XUworICAgIF9fa21wX3RocmVhZF9zbGVlcCgKKyAgICAgICAgNTAwKTsgLyogRGVsYXkgdG8gZ2l2ZSBtZXNzYWdlIGEgY2hhbmNlIHRvIGFwcGVhciBiZWZvcmUgcmVhcGluZyAqLworI2VuZGlmCisgICAgX19rbXBfYWJvcnRfcHJvY2VzcygpOworICB9OyAvLyBpZgorCisgIC8vIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgbG9jayApOyAgLy8gR0VIIC0gdGhpcyBsb2NrIGNhdXNpbmcgdGVzdHMKKyAgLy8gdG8gaGFuZyBvbiBPUyBYKi4KKworfSAvLyBfX2ttcF9tc2cKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pMThuLmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfaTE4bi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYjI4ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfaTE4bi5oCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICoga21wX2kxOG4uaAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9JMThOX0gKKyNkZWZpbmUgS01QX0kxOE5fSAorCisjaW5jbHVkZSAia21wX3N0ci5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKy8qIGttcF9pMThuX2lkLmluYyBkZWZpbmVzIGttcF9pMThuX2lkX3QgdHlwZS4gSXQgaXMgYW4gZW51bWVyYXRpb24gd2l0aAorICAgaWRlbnRpZmllcnMgb2YgYWxsIHRoZSBtZXNzYWdlcyBpbiB0aGUgY2F0YWxvZy4gVGhlcmUgaXMgb25lIHNwZWNpYWwKKyAgIGlkZW50aWZpZXI6IGttcF9pMThuX251bGwsIHdoaWNoIGRlbm90ZXMgYWJzZW5jZSBvZiBtZXNzYWdlLiAqLworI2luY2x1ZGUgImttcF9pMThuX2lkLmluYyIgLy8gR2VuZXJhdGVkIGZpbGUuIERvIG5vdCBlZGl0IGl0IG1hbnVhbGx5LgorCisvKiBMb3ctbGV2ZWwgZnVuY3Rpb25zIGhhbmRsaW5nIG1lc3NhZ2UgY2F0YWxvZy4gX19rbXBfaTE4bl9vcGVuKCkgb3BlbnMgbWVzc2FnZQorICAgY2F0YWxvZywgX19rbXBfaTE4bl9jbG9zZXMoKSBpdC4gRXhwbGljaXQgb3BlbmluZyBpcyBub3QgcmVxdWlyZWQ6IGlmIG1lc3NhZ2UKKyAgIGNhdGFsb2cgaXMgbm90IHlldCBvcGVuLCBfX2ttcF9pMThuX2NhdGdldHMoKSB3aWxsIG9wZW4gaXQgaW1wbGljaXRseS4KKyAgIEhvd2V2ZXIsIGNhdGFsb2cgc2hvdWxkIGJlIGV4cGxpY2l0bHkgY2xvc2VkLCBvdGhlcndpc2UgcmVzb3VyY2VzIChtYW1vcnksCisgICBoYW5kbGVzKSBtYXkgbGVhay4KKworICAgX19rbXBfaTE4bl9jYXRnZXRzKCkgcmV0dXJucyByZWFkLW9ubHkgc3RyaW5nLiBJdCBzaG91bGQgbm90IGJlIGZyZWVkLgorCisgICBLTVBfSTE4Tl9TVFIgbWFjcm8gc2ltcGxpZmllcyBhY2NlcyB0byBzdHJpbmdzIGluIG1lc3NhZ2UgY2F0YWxvZyBhIGJpdC4KKyAgIEZvbGxvd2luZyB0d28gbGluZXMgYXJlIGVxdWl2YWxlbnQ6CisKKyAgIF9fa21wX2kxOG5fY2F0Z2V0cygga21wX2kxOG5fc3RyX1dhcm5pbmcgKQorICAgS01QX0kxOE5fU1RSKCBXYXJuaW5nICkKKyovCisKK3ZvaWQgX19rbXBfaTE4bl9jYXRvcGVuKCk7Cit2b2lkIF9fa21wX2kxOG5fY2F0Y2xvc2UoKTsKK2NoYXIgY29uc3QgKl9fa21wX2kxOG5fY2F0Z2V0cyhrbXBfaTE4bl9pZF90IGlkKTsKKworI2RlZmluZSBLTVBfSTE4Tl9TVFIoaWQpIF9fa21wX2kxOG5fY2F0Z2V0cyhrbXBfaTE4bl9zdHJfIyNpZCkKKworLyogSGlnaC1sZXZlbCBpbnRlcmZhY2UgZm9yIHByaW50aW5nIHN0cmluZ3MgdGFyZ2V0ZWQgdG8gdGhlIHVzZXIuCisKKyAgIEFsbCB0aGUgc3RyaW5ncyBhcmUgZGl2aWRlZCBpbnRvIDMgdHlwZXM6CisgICAqIG1lc3NhZ2VzLAorICAgKiBoaW50cywKKyAgICogc3lzdGVtIGVycm9ycy4KKworICAgVGhlcmUgYXJlIDMga2luZCBvZiBtZXNzYWdlIHNldmVyaXRpZXM6CisgICAqIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMsCisgICAqIHdhcm5pbmdzIChub24tZmF0YWwgZXJyb3JzKSwKKyAgICogZmF0YWwgZXJyb3JzLgorCisgICBGb3IgZXhhbXBsZToKKyAgICAgT01QOiBXYXJuaW5nICMyOiBDYW5ub3Qgb3BlbiBtZXNzYWdlIGNhdGFsb2cgImxpYmd1aWRlLmNhdCI6ICAgKDEpCisgICAgIE9NUDogU3lzdGVtIGVycm9yICMyOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5ICAgICAgICAgICAgICAgICgyKQorICAgICBPTVA6IEhpbnQ6IFBsZWFzZSBjaGVjayBOTFNQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLiAgICAgICAgICAoMykKKyAgICAgT01QOiBJbmZvICMzOiBEZWZhdWx0IG1lc3NhZ2VzIHdpbGwgYmUgdXNlZC4gICAgICAgICAgICAgICAgICAgKDQpCisKKyAgIHdoZXJlCisgICAoMSkgaXMgYSBtZXNzYWdlIG9mIHdhcm5pbmcgc2V2ZXJpdHksCisgICAoMikgaXMgYSBzeXN0ZW0gZXJyb3IgY2F1c2VkIHRoZSBwcmV2aW91cyB3YXJuaW5nLAorICAgKDMpIGlzIGEgaGludCBmb3IgdGhlIHVzZXIgaG93IHRvIGZpeCB0aGUgcHJvYmxlbSwKKyAgICg0KSBpcyBhIG1lc3NhZ2Ugb2YgaW5mb3JtYXRpb25hbCBzZXZlcml0eS4KKworICAgVXNhZ2UgaW4gY29tcGxleCBjYXNlcyAobWVzc2FnZSBpcyBhY2NvbXBhbmllZCB3aXRoIGhpbnRzIGFuZCBzeXN0ZW0gZXJyb3JzKToKKworICAgaW50IGVycm9yID0gZXJybm87IC8vIFdlIG5lZWQgc2F2ZSBlcnJubyBpbW1lZGlhdGVseSwgYmVjYXVzZSBpdCBtYXkKKyAgICAgICAgICAgICAgICAgICAgICAvLyBiZSBjaGFuZ2VkLgorICAgX19rbXBfbXNnKAorICAgICAgIGttcF9tc193YXJuaW5nLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldmVyaXR5CisgICAgICAgS01QX01TRyggQ2FudE9wZW5NZXNzYWdlQ2F0YWxvZywgbmFtZSApLCAvLyBQcmltYXJ5IG1lc3NhZ2UKKyAgICAgICBLTVBfRVJSKCBlcnJvciApLCAgICAgICAgICAgICAgICAgICAgICAvLyBTeXN0ZW0gZXJyb3IKKyAgICAgICBLTVBfSE5UKCBDaGVja05MU1BBVEggKSwgICAgICAgICAgICAgICAvLyBIaW50CisgICAgICAgX19rbXBfbXNnX251bGwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFyaWFkaWMgYXJndW1lbnQgbGlzdCBmaW5pc2hlcgorICAgKTsKKworICAgVXNhZ2UgaW4gc2ltcGxlIGNhc2VzIChqdXN0IGEgbWVzc2FnZSwgbm8gc3lzdGVtIGVycm9ycyBvciBoaW50cyk6CisgICBLTVBfSU5GT1JNKCBXaWxsVXNlRGVmYXVsdE1lc3NhZ2VzICk7CisgICBLTVBfV0FSTklORyggQ2FudE9wZW5NZXNzYWdlQ2F0YWxvZywgbmFtZSApOworICAgS01QX0ZBVEFMKCBTdGFja092ZXJsYXAgKTsKKyAgIEtNUF9TWVNGQUlMKCAicHRocmVhZF9jcmVhdGUiLCBzdGF0dXMgKTsKKyAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9jcmVhdGUiLCBzdGF0dXMgKTsKKyAgIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCAiZ2V0dGltZW9mZGF5Iiwgc3RhdHVzICk7CisqLworCitlbnVtIGttcF9tc2dfdHlwZSB7CisgIGttcF9tdF9kdW1teSA9IDAsIC8vIFNwZWNpYWwgdHlwZSBmb3IgaW50ZXJuYWwgcHVycG9zZXMuCisgIGttcF9tdF9tZXNnID0KKyAgICAgIDQsIC8vIFByaW1hcnkgT3Blbk1QIG1lc3NhZ2UsIGNvdWxkIGJlIGluZm9ybWF0aW9uLCB3YXJuaW5nLCBvciBmYXRhbC4KKyAga21wX210X2hpbnQgPSA1LCAvLyBIaW50IHRvIHRoZSB1c2VyLgorICBrbXBfbXRfc3lzZXJyID0gLTEgLy8gU3lzdGVtIGVycm9yIG1lc3NhZ2UuCit9OyAvLyBlbnVtIGttcF9tc2dfdHlwZQordHlwZWRlZiBlbnVtIGttcF9tc2dfdHlwZSBrbXBfbXNnX3R5cGVfdDsKKworc3RydWN0IGttcF9tc2cgeworICBrbXBfbXNnX3R5cGVfdCB0eXBlOworICBpbnQgbnVtOworICBjaGFyIGNvbnN0ICpzdHI7CisgIGludCBsZW47Cit9OyAvLyBzdHJ1Y3Qga21wX21lc3NhZ2UKK3R5cGVkZWYgc3RydWN0IGttcF9tc2cga21wX21zZ190OworCisvLyBUd28gc3BlY2lhbCBtZXNzYWdlcy4KK2V4dGVybiBrbXBfbXNnX3QgX19rbXBfbXNnX2VtcHR5OyAvLyBDYW4gYmUgdXNlZCBpbiBwbGFjZSB3aGVyZSBtZXNzYWdlIGlzCisvLyByZXF1aXJlZCBzeW50YWN0aWNhbGx5LgorZXh0ZXJuIGttcF9tc2dfdAorICAgIF9fa21wX21zZ19udWxsOyAvLyBEZW5vdGVzIHRoZSBlbmQgb2YgdmFyaWFkaWMgbGlzdCBvZiBhcmd1bWVudHMuCisKKy8vIEhlbHBlciBmdW5jdGlvbnMuIENyZWF0ZXMgbWVzc2FnZXMgZWl0aGVyIGZyb20gbWVzc2FnZSBjYXRhbG9nIG9yIGZyb20KKy8vIHN5c3RlbS4gTm90ZTogdGhlc2UgZnVuY3Rpb25zIGFsbG9jYXRlIG1lbW9yeS4gWW91IHNob3VsZCBwYXNzIGNyZWF0ZWQKKy8vIG1lc3NhZ2VzIHRvIF9fa21wX21zZygpIGZ1bmN0aW9uLCBpdCB3aWxsIHByaW50IG1lc3NhZ2VzIGFuZCBkZXN0cm95IHRoZW0uCitrbXBfbXNnX3QgX19rbXBfbXNnX2Zvcm1hdCh1bnNpZ25lZCBpZF9hcmcsIC4uLik7CitrbXBfbXNnX3QgX19rbXBfbXNnX2Vycm9yX2NvZGUoaW50IGNvZGUpOwora21wX21zZ190IF9fa21wX21zZ19lcnJvcl9tZXNnKGNoYXIgY29uc3QgKm1lc2cpOworCisvLyBIZWxwZXIgbWFjcm9zIHRvIG1ha2UgY2FsbHMgc2hvcnRlci4KKyNkZWZpbmUgS01QX01TRyguLi4pIF9fa21wX21zZ19mb3JtYXQoa21wX2kxOG5fbXNnXyMjX19WQV9BUkdTX18pCisjZGVmaW5lIEtNUF9ITlQoLi4uKSBfX2ttcF9tc2dfZm9ybWF0KGttcF9pMThuX2hudF8jI19fVkFfQVJHU19fKQorI2RlZmluZSBLTVBfU1lTRVJSQ09ERShjb2RlKSBfX2ttcF9tc2dfZXJyb3JfY29kZShjb2RlKQorI2RlZmluZSBLTVBfU1lTRVJSTUVTRyhtZXNnKSBfX2ttcF9tc2dfZXJyb3JfbWVzZyhtZXNnKQorI2RlZmluZSBLTVBfRVJSIEtNUF9TWVNFUlJDT0RFCisKKy8vIE1lc3NhZ2Ugc2V2ZXJpdHkuCitlbnVtIGttcF9tc2dfc2V2ZXJpdHkgeworICBrbXBfbXNfaW5mb3JtLCAvLyBKdXN0IGluZm9ybWF0aW9uIGZvciB0aGUgdXNlci4KKyAga21wX21zX3dhcm5pbmcsIC8vIE5vbi1mYXRhbCBlcnJvciwgZXhlY3V0aW9uIGNvbnRpbnVlcy4KKyAga21wX21zX2ZhdGFsIC8vIEZhdGFsIGVycm9yLCBwcm9ncmFtIGFib3J0cy4KK307IC8vIGVudW0ga21wX21zZ19zZXZlcml0eQordHlwZWRlZiBlbnVtIGttcF9tc2dfc2V2ZXJpdHkga21wX21zZ19zZXZlcml0eV90OworCisvLyBQcmltYXJ5IGZ1bmN0aW9uIGZvciBwcmludGluZyBtZXNzYWdlcyBmb3IgdGhlIHVzZXIuIFRoZSBmaXJzdCBtZXNzYWdlIGlzCisvLyBtYW5kYXRvcnkuIEFueSBudW1iZXIgb2Ygc3lzdGVtIGVycm9ycyBhbmQgaGludHMgbWF5IGJlIHNwZWNpZmllZC4gQXJndW1lbnQKKy8vIGxpc3QgbXVzdCBiZSBmaW5pc2hlZCB3aXRoIF9fa21wX21zZ19udWxsLgordm9pZCBfX2ttcF9tc2coa21wX21zZ19zZXZlcml0eV90IHNldmVyaXR5LCBrbXBfbXNnX3QgbWVzc2FnZSwgLi4uKTsKKworLy8gSGVscGVyIG1hY3JvcyB0byBtYWtlIGNhbGxzIHNob3J0ZXIgaW4gc2ltcGxlIGNhc2VzLgorI2RlZmluZSBLTVBfSU5GT1JNKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfbXNnKGttcF9tc19pbmZvcm0sIEtNUF9NU0coX19WQV9BUkdTX18pLCBfX2ttcF9tc2dfbnVsbCkKKyNkZWZpbmUgS01QX1dBUk5JTkcoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX21zZyhrbXBfbXNfd2FybmluZywgS01QX01TRyhfX1ZBX0FSR1NfXyksIF9fa21wX21zZ19udWxsKQorI2RlZmluZSBLTVBfRkFUQUwoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfbXNnKGttcF9tc19mYXRhbCwgS01QX01TRyhfX1ZBX0FSR1NfXyksIF9fa21wX21zZ19udWxsKQorI2RlZmluZSBLTVBfU1lTRkFJTChmdW5jLCBlcnJvcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfbXNnKGttcF9tc19mYXRhbCwgS01QX01TRyhGdW5jdGlvbkVycm9yLCBmdW5jKSwgS01QX1NZU0VSUkNPREUoZXJyb3IpLCBcCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCkKKworLy8gQ2hlY2sgZXJyb3IsIGlmIG5vdCB6ZXJvLCBnZW5lcmF0ZSBmYXRhbCBlcnJvciBtZXNzYWdlLgorI2RlZmluZSBLTVBfQ0hFQ0tfU1lTRkFJTChmdW5jLCBlcnJvcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGVycm9yKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgS01QX1NZU0ZBSUwoZnVuYywgZXJyb3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworLy8gQ2hlY2sgc3RhdHVzLCBpZiBub3QgemVybywgZ2VuZXJhdGUgZmF0YWwgZXJyb3IgbWVzc2FnZSB1c2luZyBlcnJuby4KKyNkZWZpbmUgS01QX0NIRUNLX1NZU0ZBSUxfRVJSTk8oZnVuYywgc3RhdHVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChzdGF0dXMgIT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGludCBlcnJvciA9IGVycm5vOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBLTVBfU1lTRkFJTChmdW5jLCBlcnJvcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjaWZkZWYgS01QX0RFQlVHCit2b2lkIF9fa21wX2kxOG5fZHVtcF9jYXRhbG9nKGttcF9zdHJfYnVmX3QgKmJ1ZmZlcik7CisjZW5kaWYgLy8gS01QX0RFQlVHCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsgLy8gZXh0ZXJuICJDIgorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNlbmRpZiAvLyBLTVBfSTE4Tl9ICisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfaW1wb3J0LmNwcCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pbXBvcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0Yjg4NDIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfaW1wb3J0LmNwcApAQCAtMCwwICsxLDM2IEBACisvKgorICoga21wX2ltcG9ydC5jcHAKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLyogT2JqZWN0IGdlbmVyYXRlZCBmcm9tIHRoaXMgc291cmNlIGZpbGUgaXMgbGlua2VkIHRvIFdpbmRvd3MqIE9TIERMTCBpbXBvcnQKKyAgIGxpYnJhcnkgKGxpYm9tcG1kLmxpYikgb25seSEgSXQgaXMgbm90IGEgcGFydCBvZiByZWd1bGFyIHN0YXRpYyBvciBkeW5hbWljCisgICBPcGVuTVAgUlRMLiBBbnkgY29kZSB0aGF0IGp1c3QgbmVlZHMgdG8gZ28gaW4gdGhlIGxpYm9tcG1kLmxpYiAoYnV0IG5vdCBpbgorICAgbGlib21wbXQubGliIGFuZCBsaWJvbXBtZC5kbGwpIHNob3VsZCBiZSBwbGFjZWQgaW4gdGhpcyBmaWxlLiAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qVGhlc2Ugc3ltYm9scyBhcmUgcmVxdWlyZWQgZm9yIG11dHVhbCBleGNsdXNpb24gd2l0aCBNaWNyb3NvZnQgT3Blbk1QIFJUTAorICAoYW5kIGNvbXBhdGliaWxpdHkgd2l0aCBNUyBDb21waWxlcikuICovCisKK2ludCBfWW91X211c3RfbGlua193aXRoX2V4YWN0bHlfb25lX09wZW5NUF9saWJyYXJ5ID0gMTsKK2ludCBfWW91X211c3RfbGlua193aXRoX0ludGVsX09wZW5NUF9saWJyYXJ5ID0gMTsKK2ludCBfWW91X211c3RfbGlua193aXRoX01pY3Jvc29mdF9PcGVuTVBfbGlicmFyeSA9IDE7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfaW8uY3BwIGIvZmluYWwvcnVudGltZS9zcmMva21wX2lvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWFjMWNhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2lvLmNwcApAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIGttcF9pby5jcHAgLS0gUlRMIElPCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmbmRlZiBfX0FCU09GVF9XSU4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAia21wLmgiIC8vIEtNUF9HVElEX0RORSwgX19rbXBfZGVidWdfYnVmLCBldGMKKyNpbmNsdWRlICJrbXBfaW8uaCIKKyNpbmNsdWRlICJrbXBfbG9jay5oIgorI2luY2x1ZGUgImttcF9vcy5oIgorI2luY2x1ZGUgImttcF9zdHIuaCIKKworI2lmIEtNUF9PU19XSU5ET1dTCisjcHJhZ21hIHdhcm5pbmcocHVzaCkKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlIDogMjcxIDMxMCkKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjcHJhZ21hIHdhcm5pbmcocG9wKQorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9zdGRpb19sb2NrID0gS01QX0JPT1RTVFJBUF9MT0NLX0lOSVRJQUxJWkVSKAorICAgIF9fa21wX3N0ZGlvX2xvY2spOyAvKiBDb250cm9sIHN0ZGlvIGZ1bmN0aW9ucyAqLwora21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfY29uc29sZV9sb2NrID0gS01QX0JPT1RTVFJBUF9MT0NLX0lOSVRJQUxJWkVSKAorICAgIF9fa21wX2NvbnNvbGVfbG9jayk7IC8qIENvbnRyb2wgY29uc29sZSBpbml0aWFsaXphdGlvbiAqLworCisjaWYgS01QX09TX1dJTkRPV1MKKworI2lmZGVmIEtNUF9ERUJVRworLyogX19rbXBfc3Rkb3V0IGlzIHVzZWQgb25seSBmb3IgZGV2IGJ1aWxkICovCitzdGF0aWMgSEFORExFIF9fa21wX3N0ZG91dCA9IE5VTEw7CisjZW5kaWYKK3N0YXRpYyBIQU5ETEUgX19rbXBfc3RkZXJyID0gTlVMTDsKK3N0YXRpYyBpbnQgX19rbXBfY29uc29sZV9leGlzdHMgPSBGQUxTRTsKK3N0YXRpYyBrbXBfc3RyX2J1Zl90IF9fa21wX2NvbnNvbGVfYnVmOworCitzdGF0aWMgaW50IGlzX2NvbnNvbGUodm9pZCkgeworICBjaGFyIGJ1ZmZlclsxMjhdOworICBEV09SRCByYyA9IDA7CisgIERXT1JEIGVyciA9IDA7CisgIC8vIFRyeSB0byBnZXQgY29uc29sZSB0aXRsZS4KKyAgU2V0TGFzdEVycm9yKDApOworICAvLyBHZXRDb25zb2xlVGl0bGUgZG9lcyBub3QgcmVzZXQgbGFzdCBlcnJvciBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3Igc2hvcnQKKyAgLy8gYnVmZmVyLCBzbyB3ZSBuZWVkIHRvIGNsZWFyIGl0IGV4cGxpY2l0bHkuCisgIHJjID0gR2V0Q29uc29sZVRpdGxlKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICBpZiAocmMgPT0gMCkgeworICAgIC8vIHJjID09IDAgbWVhbnMgZ2V0dGluZyBjb25zb2xlIHRpdGxlIGZhaWxlZC4gTGV0IHVzIGZpbmQgb3V0IHdoeS4KKyAgICBlcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAvLyBlcnIgPT0gMCBtZWFucyBidWZmZXIgdG9vIHNob3J0ICh3ZSBzdXBwb3NlIGNvbnNvbGUgZXhpc3RzKS4KKyAgICAvLyBJbiBXaW5kb3cgYXBwbGljYXRpb25zIHdlIHVzdWFsbHkgaGF2ZSBlcnIgPT0gNiAoaW52YWxpZCBoYW5kbGUpLgorICB9OyAvLyBpZgorICByZXR1cm4gcmMgPiAwIHx8IGVyciA9PSAwOworfQorCit2b2lkIF9fa21wX2Nsb3NlX2NvbnNvbGUodm9pZCkgeworICAvKiB3YWl0IHVudGlsIHVzZXIgcHJlc3NlcyByZXR1cm4gYmVmb3JlIGNsb3Npbmcgd2luZG93ICovCisgIC8qIFRPRE8gb25seSBjbG9zZSBpZiBhIHdpbmRvdyB3YXMgb3BlbmVkICovCisgIGlmIChfX2ttcF9jb25zb2xlX2V4aXN0cykgeworI2lmZGVmIEtNUF9ERUJVRworICAgIC8qIHN0YW5kYXJkIG91dCBpcyB1c2VkIG9ubHkgaW4gZGV2IGJ1aWxkICovCisgICAgX19rbXBfc3Rkb3V0ID0gTlVMTDsKKyNlbmRpZgorICAgIF9fa21wX3N0ZGVyciA9IE5VTEw7CisgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCZfX2ttcF9jb25zb2xlX2J1Zik7CisgICAgX19rbXBfY29uc29sZV9leGlzdHMgPSBGQUxTRTsKKyAgfQorfQorCisvKiBGb3Igd2luZG93cywgY2FsbCB0aGlzIGJlZm9yZSBzdGRvdXQsIHN0ZGVyciwgb3Igc3RkaW4gYXJlIHVzZWQuCisgICBJdCBvcGVucyBhIGNvbnNvbGUgd2luZG93IGFuZCBzdGFydHMgcHJvY2Vzc2luZyAqLworc3RhdGljIHZvaWQgX19rbXBfcmVkaXJlY3Rfb3V0cHV0KHZvaWQpIHsKKyAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jaygmX19rbXBfY29uc29sZV9sb2NrKTsKKworICBpZiAoIV9fa21wX2NvbnNvbGVfZXhpc3RzKSB7CisjaWZkZWYgS01QX0RFQlVHCisgICAgLyogc3RhbmRhcmQgb3V0IGlzIHVzZWQgb25seSBpbiBkZXYgYnVpbGQgKi8KKyAgICBIQU5ETEUgaG87CisjZW5kaWYKKyAgICBIQU5ETEUgaGU7CisKKyAgICBfX2ttcF9zdHJfYnVmX2luaXQoJl9fa21wX2NvbnNvbGVfYnVmKTsKKworICAgIEFsbG9jQ29uc29sZSgpOworLy8gV2UgZG8gbm90IGNoZWNrIHRoZSByZXN1bHQgb2YgQWxsb2NDb25zb2xlIGJlY2F1c2UKKy8vICAxLiB0aGUgY2FsbCBpcyBoYXJtbGVzcworLy8gIDIuIGl0IGlzIG5vdCBjbGVhciBob3cgdG8gY29tbXVuaWNhdGUgZmFpbHVlCisvLyAgMy4gd2Ugd2lsbCBkZXRlY3QgZmFpbHVyZSBsYXRlciB3aGVuIHdlIGdldCBoYW5kbGUocykKKworI2lmZGVmIEtNUF9ERUJVRworICAgIGhvID0gR2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFKTsKKyAgICBpZiAoaG8gPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUgfHwgaG8gPT0gTlVMTCkgeworCisgICAgICBEV09SRCBlcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgIC8vIFRPRE86IG91dHB1dCBlcnJvciBzb21laG93IChtYXliZSBtZXNzYWdlIGJveCkKKyAgICAgIF9fa21wX3N0ZG91dCA9IE5VTEw7CisKKyAgICB9IGVsc2UgeworCisgICAgICBfX2ttcF9zdGRvdXQgPSBobzsgLy8gdGVtcG9yYXJ5IGNvZGUsIG5lZWQgbmV3IGdsb2JhbCBmb3IgaG8KKyAgICB9CisjZW5kaWYKKyAgICBoZSA9IEdldFN0ZEhhbmRsZShTVERfRVJST1JfSEFORExFKTsKKyAgICBpZiAoaGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUgfHwgaGUgPT0gTlVMTCkgeworCisgICAgICBEV09SRCBlcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgIC8vIFRPRE86IG91dHB1dCBlcnJvciBzb21laG93IChtYXliZSBtZXNzYWdlIGJveCkKKyAgICAgIF9fa21wX3N0ZGVyciA9IE5VTEw7CisKKyAgICB9IGVsc2UgeworCisgICAgICBfX2ttcF9zdGRlcnIgPSBoZTsgLy8gdGVtcG9yYXJ5IGNvZGUsIG5lZWQgbmV3IGdsb2JhbAorICAgIH0KKyAgICBfX2ttcF9jb25zb2xlX2V4aXN0cyA9IFRSVUU7CisgIH0KKyAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jaygmX19rbXBfY29uc29sZV9sb2NrKTsKK30KKworI2Vsc2UKKyNkZWZpbmUgX19rbXBfc3RkZXJyIChzdGRlcnIpCisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKwordm9pZCBfX2ttcF92cHJpbnRmKGVudW0ga21wX2lvIF9fa21wX2lvLCBjaGFyIGNvbnN0ICpmb3JtYXQsIHZhX2xpc3QgYXApIHsKKyNpZiBLTVBfT1NfV0lORE9XUworICBpZiAoIV9fa21wX2NvbnNvbGVfZXhpc3RzKSB7CisgICAgX19rbXBfcmVkaXJlY3Rfb3V0cHV0KCk7CisgIH0KKyAgaWYgKCFfX2ttcF9zdGRlcnIgJiYgX19rbXBfaW8gPT0ga21wX2VycikgeworICAgIHJldHVybjsKKyAgfQorI2lmZGVmIEtNUF9ERUJVRworICBpZiAoIV9fa21wX3N0ZG91dCAmJiBfX2ttcF9pbyA9PSBrbXBfb3V0KSB7CisgICAgcmV0dXJuOworICB9CisjZW5kaWYKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworCisgIGlmIChfX2ttcF9kZWJ1Z19idWYgJiYgX19rbXBfZGVidWdfYnVmZmVyICE9IE5VTEwpIHsKKworICAgIGludCBkYyA9IChfX2ttcF9kZWJ1Z19idWZfYXRvbWljID8gS01QX1RFU1RfVEhFTl9JTkMzMigmX19rbXBfZGVidWdfY291bnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX2ttcF9kZWJ1Z19jb3VudCsrKSAlCisgICAgICAgICAgICAgX19rbXBfZGVidWdfYnVmX2xpbmVzOworICAgIGNoYXIgKmRiID0gJl9fa21wX2RlYnVnX2J1ZmZlcltkYyAqIF9fa21wX2RlYnVnX2J1Zl9jaGFyc107CisgICAgaW50IGNoYXJzID0gMDsKKworI2lmZGVmIEtNUF9ERUJVR19QSURTCisgICAgY2hhcnMgPSBLTVBfU05QUklOVEYoZGIsIF9fa21wX2RlYnVnX2J1Zl9jaGFycywgInBpZD0lZDogIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoa21wX2ludDMyKWdldHBpZCgpKTsKKyNlbmRpZgorICAgIGNoYXJzICs9IEtNUF9WU05QUklOVEYoZGIsIF9fa21wX2RlYnVnX2J1Zl9jaGFycywgZm9ybWF0LCBhcCk7CisKKyAgICBpZiAoY2hhcnMgKyAxID4gX19rbXBfZGVidWdfYnVmX2NoYXJzKSB7CisgICAgICBpZiAoY2hhcnMgKyAxID4gX19rbXBfZGVidWdfYnVmX3dhcm5fY2hhcnMpIHsKKyNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICBEV09SRCBjb3VudDsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmX19rbXBfY29uc29sZV9idWYsICJPTVAgd2FybmluZzogRGVidWdnaW5nIGJ1ZmZlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3ZlcmZsb3c7IGluY3JlYXNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLTVBfREVCVUdfQlVGX0NIQVJTIHRvICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzICsgMSk7CisgICAgICAgIFdyaXRlRmlsZShfX2ttcF9zdGRlcnIsIF9fa21wX2NvbnNvbGVfYnVmLnN0ciwgX19rbXBfY29uc29sZV9idWYudXNlZCwKKyAgICAgICAgICAgICAgICAgICZjb3VudCwgTlVMTCk7CisgICAgICAgIF9fa21wX3N0cl9idWZfY2xlYXIoJl9fa21wX2NvbnNvbGVfYnVmKTsKKyNlbHNlCisgICAgICAgIGZwcmludGYoX19rbXBfc3RkZXJyLCAiT01QIHdhcm5pbmc6IERlYnVnZ2luZyBidWZmZXIgb3ZlcmZsb3c7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNyZWFzZSBLTVBfREVCVUdfQlVGX0NIQVJTIHRvICVkXG4iLAorICAgICAgICAgICAgICAgIGNoYXJzICsgMSk7CisgICAgICAgIGZmbHVzaChfX2ttcF9zdGRlcnIpOworI2VuZGlmCisgICAgICAgIF9fa21wX2RlYnVnX2J1Zl93YXJuX2NoYXJzID0gY2hhcnMgKyAxOworICAgICAgfQorICAgICAgLyogdGVybWluYXRlIHN0cmluZyBpZiBvdmVyZmxvdyBvY2N1cnJlZCAqLworICAgICAgZGJbX19rbXBfZGVidWdfYnVmX2NoYXJzIC0gMl0gPSAnXG4nOworICAgICAgZGJbX19rbXBfZGVidWdfYnVmX2NoYXJzIC0gMV0gPSAnXDAnOworICAgIH0KKyAgfSBlbHNlIHsKKyNpZiBLTVBfT1NfV0lORE9XUworICAgIERXT1JEIGNvdW50OworI2lmZGVmIEtNUF9ERUJVR19QSURTCisgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmX19rbXBfY29uc29sZV9idWYsICJwaWQ9JWQ6ICIsIChrbXBfaW50MzIpZ2V0cGlkKCkpOworI2VuZGlmCisgICAgX19rbXBfc3RyX2J1Zl92cHJpbnQoJl9fa21wX2NvbnNvbGVfYnVmLCBmb3JtYXQsIGFwKTsKKyAgICBXcml0ZUZpbGUoX19rbXBfc3RkZXJyLCBfX2ttcF9jb25zb2xlX2J1Zi5zdHIsIF9fa21wX2NvbnNvbGVfYnVmLnVzZWQsCisgICAgICAgICAgICAgICZjb3VudCwgTlVMTCk7CisgICAgX19rbXBfc3RyX2J1Zl9jbGVhcigmX19rbXBfY29uc29sZV9idWYpOworI2Vsc2UKKyNpZmRlZiBLTVBfREVCVUdfUElEUworICAgIGZwcmludGYoX19rbXBfc3RkZXJyLCAicGlkPSVkOiAiLCAoa21wX2ludDMyKWdldHBpZCgpKTsKKyNlbmRpZgorICAgIHZmcHJpbnRmKF9fa21wX3N0ZGVyciwgZm9ybWF0LCBhcCk7CisgICAgZmZsdXNoKF9fa21wX3N0ZGVycik7CisjZW5kaWYKKyAgfQorfQorCit2b2lkIF9fa21wX3ByaW50ZihjaGFyIGNvbnN0ICpmb3JtYXQsIC4uLikgeworICB2YV9saXN0IGFwOworICB2YV9zdGFydChhcCwgZm9ybWF0KTsKKworICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF9zdGRpb19sb2NrKTsKKyAgX19rbXBfdnByaW50ZihrbXBfZXJyLCBmb3JtYXQsIGFwKTsKKyAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jaygmX19rbXBfc3RkaW9fbG9jayk7CisKKyAgdmFfZW5kKGFwKTsKK30KKwordm9pZCBfX2ttcF9wcmludGZfbm9fbG9jayhjaGFyIGNvbnN0ICpmb3JtYXQsIC4uLikgeworICB2YV9saXN0IGFwOworICB2YV9zdGFydChhcCwgZm9ybWF0KTsKKworICBfX2ttcF92cHJpbnRmKGttcF9lcnIsIGZvcm1hdCwgYXApOworCisgIHZhX2VuZChhcCk7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfaW8uaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNmU4MTMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfaW8uaApAQCAtMCwwICsxLDQwIEBACisvKgorICoga21wX2lvLmggLS0gUlRMIElPIGhlYWRlciBmaWxlLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9JT19ICisjZGVmaW5lIEtNUF9JT19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2VudW0ga21wX2lvIHsga21wX291dCA9IDAsIGttcF9lcnIgfTsKKworZXh0ZXJuIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX3N0ZGlvX2xvY2s7IC8qIENvbnRyb2wgc3RkaW8gZnVuY3Rpb25zICovCitleHRlcm4ga21wX2Jvb3RzdHJhcF9sb2NrX3QKKyAgICBfX2ttcF9jb25zb2xlX2xvY2s7IC8qIENvbnRyb2wgY29uc29sZSBpbml0aWFsaXphdGlvbiAqLworCitleHRlcm4gdm9pZCBfX2ttcF92cHJpbnRmKGVudW0ga21wX2lvIF9fa21wX2lvLCBjaGFyIGNvbnN0ICpmb3JtYXQsIHZhX2xpc3QgYXApOworZXh0ZXJuIHZvaWQgX19rbXBfcHJpbnRmKGNoYXIgY29uc3QgKmZvcm1hdCwgLi4uKTsKK2V4dGVybiB2b2lkIF9fa21wX3ByaW50Zl9ub19sb2NrKGNoYXIgY29uc3QgKmZvcm1hdCwgLi4uKTsKK2V4dGVybiB2b2lkIF9fa21wX2Nsb3NlX2NvbnNvbGUodm9pZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBLTVBfSU9fSCAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2l0dC5jcHAgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfaXR0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWM1OTkwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2l0dC5jcHAKQEAgLTAsMCArMSwxNTEgQEAKKyNpbmNsdWRlICJrbXBfY29uZmlnLmgiCisKKyNpZiBVU0VfSVRUX0JVSUxECisvKgorICoga21wX2l0dC5jcHAgLS0gSVRUIE5vdGlmeSBpbnRlcmZhY2UuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisKKyNpZiBLTVBfREVCVUcKKyNpbmNsdWRlICJrbXBfaXR0LmlubCIKKyNlbmRpZgorCisjaWYgVVNFX0lUVF9OT1RJRlkKKwora21wX2ludDMyIF9fa21wX2JhcnJpZXJfZG9tYWluX2NvdW50Owora21wX2ludDMyIF9fa21wX3JlZ2lvbl9kb21haW5fY291bnQ7CitfX2l0dF9kb21haW4gKl9fa21wX2l0dF9iYXJyaWVyX2RvbWFpbnNbS01QX01BWF9GUkFNRV9ET01BSU5TXTsKK19faXR0X2RvbWFpbiAqX19rbXBfaXR0X3JlZ2lvbl9kb21haW5zW0tNUF9NQVhfRlJBTUVfRE9NQUlOU107CitfX2l0dF9kb21haW4gKl9fa21wX2l0dF9pbWJhbGFuY2VfZG9tYWluc1tLTVBfTUFYX0ZSQU1FX0RPTUFJTlNdOwora21wX2ludDMyIF9fa21wX2l0dF9yZWdpb25fdGVhbV9zaXplW0tNUF9NQVhfRlJBTUVfRE9NQUlOU107CitfX2l0dF9kb21haW4gKm1ldGFkYXRhX2RvbWFpbiA9IE5VTEw7CitfX2l0dF9zdHJpbmdfaGFuZGxlICpzdHJpbmdfaGFuZGxlX2ltYmwgPSBOVUxMOworX19pdHRfc3RyaW5nX2hhbmRsZSAqc3RyaW5nX2hhbmRsZV9sb29wID0gTlVMTDsKK19faXR0X3N0cmluZ19oYW5kbGUgKnN0cmluZ19oYW5kbGVfc25nbCA9IE5VTEw7CisKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9zdHIuaCIKKyNpbmNsdWRlICJrbXBfdmVyc2lvbi5oIgorCitLTVBfQlVJTERfQVNTRVJUKHNpemVvZihrbXBfaXR0X21hcmtfdCkgPT0gc2l6ZW9mKF9faXR0X21hcmtfdHlwZSkpOworCisvKiBQcmV2aW91c2x5IHVzZWQgd2FybmluZ3M6CisKKyAgIEtNUF9XQVJOSU5HKCBJdHRBbGxOb3RpZkRpc2FibGVkICk7CisgICBLTVBfV0FSTklORyggSXR0T2JqTm90aWZEaXNhYmxlZCApOworICAgS01QX1dBUk5JTkcoIEl0dE1hcmtOb3RpZkRpc2FibGVkICk7CisgICBLTVBfV0FSTklORyggSXR0VW5sb2FkTGliRmFpbGVkLCBsaWJpdHRub3RpZnkgKTsKKyovCisKK2ttcF9pbnQzMiBfX2ttcF9pdHRfcHJlcGFyZV9kZWxheSA9IDA7CitrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9pdHRfZGVidWdfbG9jayA9CisgICAgS01QX0JPT1RTVFJBUF9MT0NLX0lOSVRJQUxJWkVSKF9fa21wX2l0dF9kZWJ1Z19sb2NrKTsKKworI2VuZGlmIC8vIFVTRV9JVFRfTk9USUZZCisKK3ZvaWQgX19rbXBfaXR0X2luaXRpYWxpemUoKSB7CisKKy8vIElUVE5vdGlmeSBsaWJyYXJ5IGlzIGxvYWRlZCBhbmQgaW5pdGlhbGl6ZWQgYXQgZmlyc3QgY2FsbCB0byBhbnkgaXR0bm90aWZ5CisvLyBmdW5jdGlvbiwgc28gd2UgZG8gbm90IG5lZWQgdG8gZXhwbGljaXRseSBsb2FkIGl0IGFueSBtb3JlLiBKdXN0IHJlcG9ydCBPTVAKKy8vIFJUTCB2ZXJzaW9uIHRvIElUVE5vdGlmeS4KKworI2lmIFVTRV9JVFRfTk9USUZZCisgIC8vIFJlcG9ydCBPcGVuTVAgUlRMIHZlcnNpb24uCisgIGttcF9zdHJfYnVmX3QgYnVmOworICBfX2l0dF9tYXJrX3R5cGUgdmVyc2lvbjsKKyAgX19rbXBfc3RyX2J1Zl9pbml0KCZidWYpOworICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICJPTVAgUlRMIFZlcnNpb24gJWQuJWQuJWQiLCBfX2ttcF92ZXJzaW9uX21ham9yLAorICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3ZlcnNpb25fbWlub3IsIF9fa21wX3ZlcnNpb25fYnVpbGQpOworICBpZiAoX19pdHRfYXBpX3ZlcnNpb25fcHRyICE9IE5VTEwpIHsKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICI6JXMiLCBfX2l0dF9hcGlfdmVyc2lvbigpKTsKKyAgfTsgLy8gaWYKKyAgdmVyc2lvbiA9IF9faXR0X21hcmtfY3JlYXRlKGJ1Zi5zdHIpOworICBfX2l0dF9tYXJrKHZlcnNpb24sIE5VTEwpOworICBfX2ttcF9zdHJfYnVmX2ZyZWUoJmJ1Zik7CisjZW5kaWYKKworfSAvLyBfX2ttcF9pdHRfaW5pdGlhbGl6ZQorCit2b2lkIF9fa21wX2l0dF9kZXN0cm95KCkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgIF9fa21wX2l0dF9maW5pX2l0dGxpYigpOworI2VuZGlmCit9IC8vIF9fa21wX2l0dF9kZXN0cm95CisKK2V4dGVybiAiQyIgdm9pZCBfX2l0dF9lcnJvcl9oYW5kbGVyKF9faXR0X2Vycm9yX2NvZGUgZXJyLCB2YV9saXN0IGFyZ3MpIHsKKworICBzd2l0Y2ggKGVycikgeworICBjYXNlIF9faXR0X2Vycm9yX25vX21vZHVsZTogeworICAgIGNoYXIgY29uc3QgKmxpYnJhcnkgPSB2YV9hcmcoYXJncywgY2hhciBjb25zdCAqKTsKKyNpZiBLTVBfT1NfV0lORE9XUworICAgIGludCBzeXNfZXJyID0gdmFfYXJnKGFyZ3MsIGludCk7CisgICAga21wX21zZ190IGVycl9jb2RlID0gS01QX1NZU0VSUkNPREUoc3lzX2Vycik7CisgICAgX19rbXBfbXNnKGttcF9tc193YXJuaW5nLCBLTVBfTVNHKEl0dExvYWRMaWJGYWlsZWQsIGxpYnJhcnkpLCBlcnJfY29kZSwKKyAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwpOworICAgIGlmIChfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA9PSBrbXBfd2FybmluZ3Nfb2ZmKSB7CisgICAgICBfX2ttcF9zdHJfZnJlZSgmZXJyX2NvZGUuc3RyKTsKKyAgICB9CisjZWxzZQorICAgIGNoYXIgY29uc3QgKnN5c19lcnIgPSB2YV9hcmcoYXJncywgY2hhciBjb25zdCAqKTsKKyAgICBrbXBfbXNnX3QgZXJyX2NvZGUgPSBLTVBfU1lTRVJSTUVTRyhzeXNfZXJyKTsKKyAgICBfX2ttcF9tc2coa21wX21zX3dhcm5pbmcsIEtNUF9NU0coSXR0TG9hZExpYkZhaWxlZCwgbGlicmFyeSksIGVycl9jb2RlLAorICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCk7CisgICAgaWYgKF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID09IGttcF93YXJuaW5nc19vZmYpIHsKKyAgICAgIF9fa21wX3N0cl9mcmVlKCZlcnJfY29kZS5zdHIpOworICAgIH0KKyNlbmRpZgorICB9IGJyZWFrOworICBjYXNlIF9faXR0X2Vycm9yX25vX3N5bWJvbDogeworICAgIGNoYXIgY29uc3QgKmxpYnJhcnkgPSB2YV9hcmcoYXJncywgY2hhciBjb25zdCAqKTsKKyAgICBjaGFyIGNvbnN0ICpzeW1ib2wgPSB2YV9hcmcoYXJncywgY2hhciBjb25zdCAqKTsKKyAgICBLTVBfV0FSTklORyhJdHRMb29rdXBGYWlsZWQsIHN5bWJvbCwgbGlicmFyeSk7CisgIH0gYnJlYWs7CisgIGNhc2UgX19pdHRfZXJyb3JfdW5rbm93bl9ncm91cDogeworICAgIGNoYXIgY29uc3QgKnZhciA9IHZhX2FyZyhhcmdzLCBjaGFyIGNvbnN0ICopOworICAgIGNoYXIgY29uc3QgKmdyb3VwID0gdmFfYXJnKGFyZ3MsIGNoYXIgY29uc3QgKik7CisgICAgS01QX1dBUk5JTkcoSXR0VW5rbm93bkdyb3VwLCB2YXIsIGdyb3VwKTsKKyAgfSBicmVhazsKKyAgY2FzZSBfX2l0dF9lcnJvcl9lbnZfdG9vX2xvbmc6IHsKKyAgICBjaGFyIGNvbnN0ICp2YXIgPSB2YV9hcmcoYXJncywgY2hhciBjb25zdCAqKTsKKyAgICBzaXplX3QgYWN0X2xlbiA9IHZhX2FyZyhhcmdzLCBzaXplX3QpOworICAgIHNpemVfdCBtYXhfbGVuID0gdmFfYXJnKGFyZ3MsIHNpemVfdCk7CisgICAgS01QX1dBUk5JTkcoSXR0RW52VmFyVG9vTG9uZywgdmFyLCAodW5zaWduZWQgbG9uZylhY3RfbGVuLAorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKW1heF9sZW4pOworICB9IGJyZWFrOworICBjYXNlIF9faXR0X2Vycm9yX2NhbnRfcmVhZF9lbnY6IHsKKyAgICBjaGFyIGNvbnN0ICp2YXIgPSB2YV9hcmcoYXJncywgY2hhciBjb25zdCAqKTsKKyAgICBpbnQgc3lzX2VyciA9IHZhX2FyZyhhcmdzLCBpbnQpOworICAgIGttcF9tc2dfdCBlcnJfY29kZSA9IEtNUF9FUlIoc3lzX2Vycik7CisgICAgX19rbXBfbXNnKGttcF9tc193YXJuaW5nLCBLTVBfTVNHKENhbnRHZXRFbnZWYXIsIHZhciksIGVycl9jb2RlLAorICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCk7CisgICAgaWYgKF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID09IGttcF93YXJuaW5nc19vZmYpIHsKKyAgICAgIF9fa21wX3N0cl9mcmVlKCZlcnJfY29kZS5zdHIpOworICAgIH0KKyAgfSBicmVhazsKKyAgY2FzZSBfX2l0dF9lcnJvcl9zeXN0ZW06IHsKKyAgICBjaGFyIGNvbnN0ICpmdW5jID0gdmFfYXJnKGFyZ3MsIGNoYXIgY29uc3QgKik7CisgICAgaW50IHN5c19lcnIgPSB2YV9hcmcoYXJncywgaW50KTsKKyAgICBrbXBfbXNnX3QgZXJyX2NvZGUgPSBLTVBfU1lTRVJSQ09ERShzeXNfZXJyKTsKKyAgICBfX2ttcF9tc2coa21wX21zX3dhcm5pbmcsIEtNUF9NU0coSXR0RnVuY3Rpb25FcnJvciwgZnVuYyksIGVycl9jb2RlLAorICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCk7CisgICAgaWYgKF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID09IGttcF93YXJuaW5nc19vZmYpIHsKKyAgICAgIF9fa21wX3N0cl9mcmVlKCZlcnJfY29kZS5zdHIpOworICAgIH0KKyAgfSBicmVhazsKKyAgZGVmYXVsdDogeyBLTVBfV0FSTklORyhJdHRVbmtub3duRXJyb3IsIGVycik7IH07CisgIH07IC8vIHN3aXRjaAorfSAvLyBfX2l0dF9lcnJvcl9oYW5kbGVyCisKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfaXR0LmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfaXR0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJkYWNkNgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9pdHQuaApAQCAtMCwwICsxLDMzNCBAQAorI2lmIFVTRV9JVFRfQlVJTEQKKy8qCisgKiBrbXBfaXR0LmggLS0gSVRUIE5vdGlmeSBpbnRlcmZhY2UuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0lUVF9ICisjZGVmaW5lIEtNUF9JVFRfSAorCisjaW5jbHVkZSAia21wX2xvY2suaCIKKworI2RlZmluZSBJTlRFTF9JVFROT1RJRllfQVBJX1BSSVZBVEUKKyNpbmNsdWRlICJpdHRub3RpZnkuaCIKKyNpbmNsdWRlICJsZWdhY3kvaXR0bm90aWZ5LmgiCisKKyNpZiBLTVBfREVCVUcKKyNkZWZpbmUgX19rbXBfaW5saW5lIC8vIFR1cm4gb2ZmIGlubGluaW5nIGluIGRlYnVnIG1vZGUuCisjZWxzZQorI2RlZmluZSBfX2ttcF9pbmxpbmUgc3RhdGljIGlubGluZQorI2VuZGlmCisKKyNpZiBVU0VfSVRUX05PVElGWQorZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF9pdHRfcHJlcGFyZV9kZWxheTsKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB2b2lkIF9fa21wX2l0dF9maW5pX2l0dGxpYih2b2lkKTsKKyNlbHNlCitleHRlcm4gdm9pZCBfX2ttcF9pdHRfZmluaV9pdHRsaWIodm9pZCk7CisjZW5kaWYKKyNlbmRpZgorCisvLyBTaW1wbGlmeSB0aGUgaGFuZGxpbmcgb2YgYW4gYXJndW1lbnQgdGhhdCBpcyBvbmx5IHJlcXVpcmVkIHdoZW4gVVNFX0lUVF9CVUlMRAorLy8gaXMgZW5hYmxlZC4KKyNkZWZpbmUgVVNFX0lUVF9CVUlMRF9BUkcoeCkgLCB4CisKK3ZvaWQgX19rbXBfaXR0X2luaXRpYWxpemUoKTsKK3ZvaWQgX19rbXBfaXR0X2Rlc3Ryb3koKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5ldyBzdHVmZiBmb3IgcmVwb3J0aW5nIGhpZ2gtbGV2ZWwgY29uc3RydWN0cy4KKworLy8gTm90ZSB0aGUgbmFtaW5nIGNvbnZlbnRpb246CisvLyAgICAgX19rbXBfaXR0X3h4eGluZygpIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIGFjdGlvbiwgd2hpbGUKKy8vICAgICBfX2ttcF9pdHRfeHh4ZWQoKSAgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBhY3Rpb24uCisKKy8vIC0tLSBQYXJhbGxlbCByZWdpb24gcmVwb3J0aW5nIC0tLQorX19rbXBfaW5saW5lIHZvaWQKK19fa21wX2l0dF9yZWdpb25fZm9ya2luZyhpbnQgZ3RpZCwgaW50IHRlYW1fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmFycmllcnMpOyAvLyBNYXN0ZXIgb25seSwgYmVmb3JlIGZvcmtpbmcgdGhyZWFkcy4KK19fa21wX2lubGluZSB2b2lkCitfX2ttcF9pdHRfcmVnaW9uX2pvaW5lZChpbnQgZ3RpZCk7IC8vIE1hc3RlciBvbmx5LCBhZnRlciBqb2luaW5nIHRocmVhZHMuCisvLyAoKikgTm90ZTogQSB0aHJlYWQgbWF5IGV4ZWN1dGUgdGFza3MgYWZ0ZXIgdGhpcyBwb2ludCwgdGhvdWdoLgorCisvLyAtLS0gRnJhbWUgcmVwb3J0aW5nIC0tLQorLy8gcmVnaW9uPTA6IG5vIHJlZ2lvbnMsIHJlZ2lvbj0xOiBwYXJhbGxlbCwgcmVnaW9uPTI6IHNlcmlhbGl6ZWQgcGFyYWxsZWwKK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9mcmFtZV9zdWJtaXQoaW50IGd0aWQsIF9faXR0X3RpbWVzdGFtcCBiZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pdHRfdGltZXN0YW1wIGVuZCwgaW50IGltYmFsYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRfdCAqbG9jLCBpbnQgdGVhbV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVnaW9uID0gMCk7CisKKy8vIC0tLSBNZXRhZGF0YSByZXBvcnRpbmcgLS0tCisvLyBiZWdpbi9lbmQgLSBiZWdpbi9lbmQgdGltZXN0YW1wcyBvZiBhIGJhcnJpZXIgZnJhbWUsIGltYmFsYW5jZSAtIGFnZ3JlZ2F0ZWQKKy8vIHdhaXQgdGltZSB2YWx1ZSwgcmVkdWN0aW9uIC1pZiB0aGlzIGlzIGEgcmVkdWN0aW9uIGJhcnJpZXIKK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9tZXRhZGF0YV9pbWJhbGFuY2UoaW50IGd0aWQsIGttcF91aW50NjQgYmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDY0IGltYmFsYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQ2NCByZWR1Y3Rpb24pOworLy8gc2NoZWRfdHlwZTogMCAtIHN0YXRpYywgMSAtIGR5bmFtaWMsIDIgLSBndWlkZWQsIDMgLSBjdXN0b20gKGFsbCBvdGhlcnMpOworLy8gaXRlcmF0aW9ucyAtIGxvb3AgdHJpcCBjb3VudCwgY2h1bmsgLSBjaHVuayBzaXplCitfX2ttcF9pbmxpbmUgdm9pZCBfX2ttcF9pdHRfbWV0YWRhdGFfbG9vcChpZGVudF90ICpsb2MsIGttcF91aW50NjQgc2NoZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgaXRlcmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgY2h1bmspOworX19rbXBfaW5saW5lIHZvaWQgX19rbXBfaXR0X21ldGFkYXRhX3NpbmdsZShpZGVudF90ICpsb2MpOworCisvLyAtLS0gQmFycmllciByZXBvcnRpbmcgLS0tCitfX2ttcF9pbmxpbmUgdm9pZCAqX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KGludCBndGlkLCBpbnQgYnQsIGludCBzZXRfbmFtZSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YSA9IDApOworX19rbXBfaW5saW5lIHZvaWQgX19rbXBfaXR0X2JhcnJpZXJfc3RhcnRpbmcoaW50IGd0aWQsIHZvaWQgKm9iamVjdCk7CitfX2ttcF9pbmxpbmUgdm9pZCBfX2ttcF9pdHRfYmFycmllcl9taWRkbGUoaW50IGd0aWQsIHZvaWQgKm9iamVjdCk7CitfX2ttcF9pbmxpbmUgdm9pZCBfX2ttcF9pdHRfYmFycmllcl9maW5pc2hlZChpbnQgZ3RpZCwgdm9pZCAqb2JqZWN0KTsKKworLy8gLS0tIFRhc2t3YWl0IHJlcG9ydGluZyAtLS0KK19fa21wX2lubGluZSB2b2lkICpfX2ttcF9pdHRfdGFza3dhaXRfb2JqZWN0KGludCBndGlkKTsKK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF90YXNrd2FpdF9zdGFydGluZyhpbnQgZ3RpZCwgdm9pZCAqb2JqZWN0KTsKK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF90YXNrd2FpdF9maW5pc2hlZChpbnQgZ3RpZCwgdm9pZCAqb2JqZWN0KTsKKworLy8gLS0tIFRhc2sgcmVwb3J0aW5nIC0tLQorX19rbXBfaW5saW5lIHZvaWQgX19rbXBfaXR0X3Rhc2tfc3RhcnRpbmcodm9pZCAqb2JqZWN0KTsKK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF90YXNrX2ZpbmlzaGVkKHZvaWQgKm9iamVjdCk7CisKKy8vIC0tLSBMb2NrIHJlcG9ydGluZyAtLS0KKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworX19rbXBfaW5saW5lIHZvaWQgX19rbXBfaXR0X2xvY2tfY3JlYXRpbmcoa21wX3VzZXJfbG9ja19wIGxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpZGVudF90ICopOworI2Vsc2UKK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9sb2NrX2NyZWF0aW5nKGttcF91c2VyX2xvY2tfcCBsb2NrKTsKKyNlbmRpZgorX19rbXBfaW5saW5lIHZvaWQgX19rbXBfaXR0X2xvY2tfYWNxdWlyaW5nKGttcF91c2VyX2xvY2tfcCBsb2NrKTsKK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkKGttcF91c2VyX2xvY2tfcCBsb2NrKTsKK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9sb2NrX3JlbGVhc2luZyhrbXBfdXNlcl9sb2NrX3AgbG9jayk7CitfX2ttcF9pbmxpbmUgdm9pZCBfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQoa21wX3VzZXJfbG9ja19wIGxvY2spOworX19rbXBfaW5saW5lIHZvaWQgX19rbXBfaXR0X2xvY2tfZGVzdHJveWVkKGttcF91c2VyX2xvY2tfcCBsb2NrKTsKKworLy8gLS0tIENyaXRpY2FsIHJlcG9ydGluZyAtLS0KKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworX19rbXBfaW5saW5lIHZvaWQgX19rbXBfaXR0X2NyaXRpY2FsX2NyZWF0aW5nKGttcF91c2VyX2xvY2tfcCBsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkZW50X3QgKik7CisjZWxzZQorX19rbXBfaW5saW5lIHZvaWQgX19rbXBfaXR0X2NyaXRpY2FsX2NyZWF0aW5nKGttcF91c2VyX2xvY2tfcCBsb2NrKTsKKyNlbmRpZgorX19rbXBfaW5saW5lIHZvaWQgX19rbXBfaXR0X2NyaXRpY2FsX2FjcXVpcmluZyhrbXBfdXNlcl9sb2NrX3AgbG9jayk7CitfX2ttcF9pbmxpbmUgdm9pZCBfX2ttcF9pdHRfY3JpdGljYWxfYWNxdWlyZWQoa21wX3VzZXJfbG9ja19wIGxvY2spOworX19rbXBfaW5saW5lIHZvaWQgX19rbXBfaXR0X2NyaXRpY2FsX3JlbGVhc2luZyhrbXBfdXNlcl9sb2NrX3AgbG9jayk7CitfX2ttcF9pbmxpbmUgdm9pZCBfX2ttcF9pdHRfY3JpdGljYWxfZGVzdHJveWVkKGttcF91c2VyX2xvY2tfcCBsb2NrKTsKKworLy8gLS0tIFNpbmdsZSByZXBvcnRpbmcgLS0tCitfX2ttcF9pbmxpbmUgdm9pZCBfX2ttcF9pdHRfc2luZ2xlX3N0YXJ0KGludCBndGlkKTsKK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9zaW5nbGVfZW5kKGludCBndGlkKTsKKworLy8gLS0tIE9yZGVyZWQgcmVwb3J0aW5nIC0tLQorX19rbXBfaW5saW5lIHZvaWQgX19rbXBfaXR0X29yZGVyZWRfaW5pdChpbnQgZ3RpZCk7CitfX2ttcF9pbmxpbmUgdm9pZCBfX2ttcF9pdHRfb3JkZXJlZF9wcmVwKGludCBndGlkKTsKK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9vcmRlcmVkX3N0YXJ0KGludCBndGlkKTsKK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9vcmRlcmVkX2VuZChpbnQgZ3RpZCk7CisKKy8vIC0tLSBUaHJlYWRzIHJlcG9ydGluZyAtLS0KK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF90aHJlYWRfaWdub3JlKCk7CitfX2ttcF9pbmxpbmUgdm9pZCBfX2ttcF9pdHRfdGhyZWFkX25hbWUoaW50IGd0aWQpOworCisvLyAtLS0gU3lzdGVtIG9iamVjdHMgLS0tCitfX2ttcF9pbmxpbmUgdm9pZCBfX2ttcF9pdHRfc3lzdGVtX29iamVjdF9jcmVhdGVkKHZvaWQgKm9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqbmFtZSk7CisKKy8vIC0tLSBTdGFjayBzdGl0Y2hpbmcgLS0tCitfX2ttcF9pbmxpbmUgX19pdHRfY2FsbGVyIF9fa21wX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlKHZvaWQpOworX19rbXBfaW5saW5lIHZvaWQgX19rbXBfaXR0X3N0YWNrX2NhbGxlcl9kZXN0cm95KF9faXR0X2NhbGxlcik7CitfX2ttcF9pbmxpbmUgdm9pZCBfX2ttcF9pdHRfc3RhY2tfY2FsbGVlX2VudGVyKF9faXR0X2NhbGxlcik7CitfX2ttcF9pbmxpbmUgdm9pZCBfX2ttcF9pdHRfc3RhY2tfY2FsbGVlX2xlYXZlKF9faXR0X2NhbGxlcik7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPbGQgc3R1ZmYgZm9yIHJlcG9ydGluZyBsb3ctbGV2ZWwgaW50ZXJuYWwgc3luY2hyb25pemF0aW9uLgorCisjaWYgVVNFX0lUVF9OT1RJRlkKKworLyogU3VwcG9ydCBmb3IgU1NDIG1hcmtzLCB3aGljaCBhcmUgdXNlZCBieSBTREUKKyAgIGh0dHA6Ly9zb2Z0d2FyZS5pbnRlbC5jb20vZW4tdXMvYXJ0aWNsZXMvaW50ZWwtc29mdHdhcmUtZGV2ZWxvcG1lbnQtZW11bGF0b3IKKyAgIHRvIG1hcmsgcG9pbnRzIGluIGluc3RydWN0aW9uIHRyYWNlcyB0aGF0IHJlcHJlc2VudCBzcGluLWxvb3BzIGFuZCBhcmUKKyAgIHRoZXJlZm9yZSB1bmludGVyZXN0aW5nIHdoZW4gY29sbGVjdGluZyB0cmFjZXMgZm9yIGFyY2hpdGVjdHVyZSBzaW11bGF0aW9uLgorICovCisjaWZuZGVmIElOQ0xVREVfU1NDX01BUktTCisjZGVmaW5lIElOQ0xVREVfU1NDX01BUktTIChLTVBfT1NfTElOVVggJiYgS01QX0FSQ0hfWDg2XzY0KQorI2VuZGlmCisKKy8qIExpbnV4IDY0IG9ubHkgZm9yIG5vdyAqLworI2lmIChJTkNMVURFX1NTQ19NQVJLUyAmJiBLTVBfT1NfTElOVVggJiYgS01QX0FSQ0hfWDg2XzY0KQorLy8gUG9ydGFibGUgKGF0IGxlYXN0IGZvciBnY2MgYW5kIGljYykgY29kZSB0byBpbnNlcnQgdGhlIG5lY2Vzc2FyeSBpbnN0cnVjdGlvbnMKKy8vIHRvIHNldCAlZWJ4IGFuZCBleGVjdXRlIHRoZSB1bmxpa2VseSBuby1vcC4KKyNpZiBkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpCisjZGVmaW5lIElOU0VSVF9TU0NfTUFSSyh0YWcpIF9fU1NDX01BUksodGFnKQorI2Vsc2UKKyNkZWZpbmUgSU5TRVJUX1NTQ19NQVJLKHRhZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZsICUwLCAlJWVieDsgLmJ5dGUgMHg2NCwgMHg2NywgMHg5MCAiIDo6ImkiKHRhZykgICAgXAorICAgICAgICAgICAgICAgICAgICAgICA6ICIlZWJ4IikKKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgSU5TRVJUX1NTQ19NQVJLKHRhZykgKCh2b2lkKTApCisjZW5kaWYKKworLyogTWFya2VycyBmb3IgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgcmVnaW9ucyB0aGF0IHJlcHJlc2VudCBwb2xsaW5nIGFuZCBhcmUKKyAgIHRoZXJlZm9yZSB1bmludGVyZXN0aW5nIHRvIGFyY2hpdGVjdHVyYWwgc2ltdWxhdGlvbnMgMHg0Mzc2IGFuZCAweDQzNzcgYXJlCisgICBhcmJpdHJhcnkgbnVtYmVycyB0aGF0IHNob3VsZCBiZSB1bmlxdWUgaW4gdGhlIHNwYWNlIG9mIFNTQyB0YWdzLCBidXQgdGhlcmUKKyAgIGlzIG5vIGNlbnRyYWwgaXNzdWluZyBhdXRob3JpdHkgcmF0aGVyIHJhbmRvbW5lc3MgaXMgZXhwZWN0ZWQgdG8gd29yay4gKi8KKyNkZWZpbmUgU1NDX01BUktfU1BJTl9TVEFSVCgpIElOU0VSVF9TU0NfTUFSSygweDQzNzYpCisjZGVmaW5lIFNTQ19NQVJLX1NQSU5fRU5EKCkgSU5TRVJUX1NTQ19NQVJLKDB4NDM3NykKKworLy8gTWFya2VycyBmb3IgYXJjaGl0ZWN0dXJlIHNpbXVsYXRpb24uCisvLyBGT1JLSU5HICAgICAgOiBCZWZvcmUgdGhlIG1hc3RlciB0aHJlYWQgZm9ya3MuCisvLyBKT0lOSU5HICAgICAgOiBBdCB0aGUgc3RhcnQgb2YgdGhlIGpvaW4uCisvLyBJTlZPS0lORyAgICAgOiBCZWZvcmUgdGhlIHRocmVhZHMgaW52b2tlIG1pY3JvdGFza3MuCisvLyBESVNQQVRDSF9JTklUOiBBdCB0aGUgc3RhcnQgb2YgZHluYW1pY2FsbHkgc2NoZWR1bGVkIGxvb3AuCisvLyBESVNQQVRDSF9ORVhUOiBBZnRlciBjbGFtaW5nIG5leHQgaXRlcmF0aW9uIG9mIGR5bmFtaWNhbGx5IHNjaGVkdWxlZCBsb29wLgorI2RlZmluZSBTU0NfTUFSS19GT1JLSU5HKCkgSU5TRVJUX1NTQ19NQVJLKDB4ZDY5MykKKyNkZWZpbmUgU1NDX01BUktfSk9JTklORygpIElOU0VSVF9TU0NfTUFSSygweGQ2OTQpCisjZGVmaW5lIFNTQ19NQVJLX0lOVk9LSU5HKCkgSU5TRVJUX1NTQ19NQVJLKDB4ZDY5NSkKKyNkZWZpbmUgU1NDX01BUktfRElTUEFUQ0hfSU5JVCgpIElOU0VSVF9TU0NfTUFSSygweGQ2OTYpCisjZGVmaW5lIFNTQ19NQVJLX0RJU1BBVENIX05FWFQoKSBJTlNFUlRfU1NDX01BUksoMHhkNjk3KQorCisvLyBUaGUgb2JqZWN0IGlzIGFuIGFkZHJlc3MgdGhhdCBhc3NvY2lhdGVzIGEgc3BlY2lmaWMgc2V0IG9mIHRoZSBwcmVwYXJlLAorLy8gYWNxdWlyZSwgcmVsZWFzZSwgYW5kIGNhbmNlbCBvcGVyYXRpb25zLgorCisvKiBTeW5jIHByZXBhcmUgaW5kaWNhdGVzIGEgdGhyZWFkIGlzIGdvaW5nIHRvIHN0YXJ0IHdhaXRpbmcgZm9yIGFub3RoZXIgdGhyZWFkCisgICB0byBzZW5kIGEgcmVsZWFzZSBldmVudC4gIFRoaXMgb3BlcmF0aW9uIHNob3VsZCBiZSBkb25lIGp1c3QgYmVmb3JlIHRoZQorICAgdGhyZWFkIGJlZ2lucyBjaGVja2luZyBmb3IgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgcmVsZWFzZSBldmVudCAqLworCisvKiBTeW5jIGNhbmNlbCBpbmRpY2F0ZXMgYSB0aHJlYWQgaXMgY2FuY2VsbGluZyBhIHdhaXQgb24gYW5vdGhlciB0aHJlYWQgYW5kCisgICBjb250aW51aW5nIGV4ZWN1dGlvbiB3aXRob3V0IHdhaXRpbmcgZm9yIHRoZSBvdGhlciB0aHJlYWQgdG8gcmVsZWFzZSBpdCAqLworCisvKiBTeW5jIGFjcXVpcmVkIGluZGljYXRlcyBhIHRocmVhZCBoYXMgcmVjZWl2ZWQgYSByZWxlYXNlIGV2ZW50IGZyb20gYW5vdGhlcgorICAgdGhyZWFkIGFuZCBoYXMgc3RvcHBlZCB3YWl0aW5nLiAgVGhpcyBvcGVyYXRpb24gbXVzdCBvY2N1ciBvbmx5IGFmdGVyIHRoZQorICAgcmVsZWFzZSBldmVudCBpcyByZWNlaXZlZC4gKi8KKworLyogU3luYyByZWxlYXNlIGluZGljYXRlcyBhIHRocmVhZCBpcyBnb2luZyB0byBzZW5kIGEgcmVsZWFzZSBldmVudCB0byBhbm90aGVyCisgICB0aHJlYWQgc28gaXQgd2lsbCBzdG9wIHdhaXRpbmcgYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbi4gVGhpcyBvcGVyYXRpb24gbXVzdAorICAganVzdCBoYXBwZW4gYmVmb3JlIHRoZSByZWxlYXNlIGV2ZW50LiAqLworCisjZGVmaW5lIEtNUF9GU1lOQ19QUkVQQVJFKG9iaikgX19pdHRfZnN5bmNfcHJlcGFyZSgodm9pZCAqKShvYmopKQorI2RlZmluZSBLTVBfRlNZTkNfQ0FOQ0VMKG9iaikgX19pdHRfZnN5bmNfY2FuY2VsKCh2b2lkICopKG9iaikpCisjZGVmaW5lIEtNUF9GU1lOQ19BQ1FVSVJFRChvYmopIF9faXR0X2ZzeW5jX2FjcXVpcmVkKCh2b2lkICopKG9iaikpCisjZGVmaW5lIEtNUF9GU1lOQ19SRUxFQVNJTkcob2JqKSBfX2l0dF9mc3luY19yZWxlYXNpbmcoKHZvaWQgKikob2JqKSkKKworLyogSW4gY2FzZSBvZiB3YWl0aW5nIGluIGEgc3BpbiBsb29wLCBJVFQgd2FudHMgS01QX0ZTWU5DX1BSRVBBUkUoKSB0byBiZSBjYWxsZWQKKyAgIHdpdGggYSBkZWxheSAoYW5kIG5vdCBjYWxsZWQgYXQgYWxsIGlmIHdhaXRpbmcgdGltZSBpcyBzbWFsbCkuIFNvLCBpbiBzcGluCisgICBsb29wcywgZG8gbm90IHVzZSBLTVBfRlNZTkNfUFJFUEFSRSgpLCBidXQgdXNlIEtNUF9GU1lOQ19TUElOX0lOSVQoKSAoYmVmb3JlCisgICBzcGluIGxvb3ApLCBLTVBfRlNZTkNfU1BJTl9QUkVQQVJFKCkgKHdoaXRoaW4gdGhlIHNwaW4gbG9vcCksIGFuZAorICAgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQoKS4gU2VlIEtNUF9XQUlUX1lJRUxEKCkgZm9yIGV4YW1wbGUuICovCisKKyN1bmRlZiBLTVBfRlNZTkNfU1BJTl9JTklUCisjZGVmaW5lIEtNUF9GU1lOQ19TUElOX0lOSVQob2JqLCBzcGluKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgc3luY19pdGVycyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKF9faXR0X2ZzeW5jX3ByZXBhcmVfcHRyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKG9iaiA9PSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgb2JqID0gc3BpbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IC8qIGlmICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gLyogaWYgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTU0NfTUFSS19TUElOX1NUQVJUKCkKKworI3VuZGVmIEtNUF9GU1lOQ19TUElOX1BSRVBBUkUKKyNkZWZpbmUgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRShvYmopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChfX2l0dF9mc3luY19wcmVwYXJlX3B0ciAmJiBzeW5jX2l0ZXJzIDwgX19rbXBfaXR0X3ByZXBhcmVfZGVsYXkpIHsgICAgIFwKKyAgICAgICsrc3luY19pdGVyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoc3luY19pdGVycyA+PSBfX2ttcF9pdHRfcHJlcGFyZV9kZWxheSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfRlNZTkNfUFJFUEFSRSgodm9pZCAqKW9iaik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gLyogaWYgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAvKiBpZiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorI3VuZGVmIEtNUF9GU1lOQ19TUElOX0FDUVVJUkVECisjZGVmaW5lIEtNUF9GU1lOQ19TUElOX0FDUVVJUkVEKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTU0NfTUFSS19TUElOX0VORCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHN5bmNfaXRlcnMgPj0gX19rbXBfaXR0X3ByZXBhcmVfZGVsYXkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgS01QX0ZTWU5DX0FDUVVJUkVEKCh2b2lkICopb2JqKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IC8qIGlmICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKy8qIElUVCB3aWxsIG5vdCByZXBvcnQgb2JqZWN0cyBjcmVhdGVkIHdpdGhpbiBLTVBfSVRUX0lHTk9SRSgpLCBlLiBnLjoKKyAgICAgICBLTVBfSVRUX0lHTk9SRSgKKyAgICAgICAgICAgcHRyID0gbWFsbG9jKCBzaXplICk7CisgICAgICAgKTsKKyovCisjZGVmaW5lIEtNUF9JVFRfSUdOT1JFKHN0YXRlbWVudCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2l0dF9zdGF0ZV90IF9faXR0X3N0YXRlXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKF9faXR0X3N0YXRlX2dldF9wdHIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX19pdHRfc3RhdGVfID0gX19pdHRfc3RhdGVfZ2V0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF9faXR0X29ial9tb2RlX3NldChfX2l0dF9vYmpfcHJvcF9pZ25vcmUsIF9faXR0X29ial9zdGF0ZV9zZXQpOyAgICAgICAgICBcCisgICAgfSAvKiBpZiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgc3RhdGVtZW50IH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoX19pdHRfc3RhdGVfZ2V0X3B0cikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBfX2l0dF9zdGF0ZV9zZXQoX19pdHRfc3RhdGVfKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gLyogaWYgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworY29uc3QgaW50IEtNUF9NQVhfRlJBTUVfRE9NQUlOUyA9CisgICAgNTEyOyAvLyBNYXhpbXVtIG51bWJlciBvZiBmcmFtZSBkb21haW5zIHRvIHVzZSAobWFwcyB0bworLy8gZGlmZmVyZW50IE9wZW5NUCByZWdpb25zIGluIHRoZSB1c2VyIHNvdXJjZSBjb2RlKS4KK2V4dGVybiBrbXBfaW50MzIgX19rbXBfYmFycmllcl9kb21haW5fY291bnQ7CitleHRlcm4ga21wX2ludDMyIF9fa21wX3JlZ2lvbl9kb21haW5fY291bnQ7CitleHRlcm4gX19pdHRfZG9tYWluICpfX2ttcF9pdHRfYmFycmllcl9kb21haW5zW0tNUF9NQVhfRlJBTUVfRE9NQUlOU107CitleHRlcm4gX19pdHRfZG9tYWluICpfX2ttcF9pdHRfcmVnaW9uX2RvbWFpbnNbS01QX01BWF9GUkFNRV9ET01BSU5TXTsKK2V4dGVybiBfX2l0dF9kb21haW4gKl9fa21wX2l0dF9pbWJhbGFuY2VfZG9tYWluc1tLTVBfTUFYX0ZSQU1FX0RPTUFJTlNdOworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF9pdHRfcmVnaW9uX3RlYW1fc2l6ZVtLTVBfTUFYX0ZSQU1FX0RPTUFJTlNdOworZXh0ZXJuIF9faXR0X2RvbWFpbiAqbWV0YWRhdGFfZG9tYWluOworZXh0ZXJuIF9faXR0X3N0cmluZ19oYW5kbGUgKnN0cmluZ19oYW5kbGVfaW1ibDsKK2V4dGVybiBfX2l0dF9zdHJpbmdfaGFuZGxlICpzdHJpbmdfaGFuZGxlX2xvb3A7CitleHRlcm4gX19pdHRfc3RyaW5nX2hhbmRsZSAqc3RyaW5nX2hhbmRsZV9zbmdsOworCisjZWxzZQorCisvLyBOdWxsIGRlZmluaXRpb25zIG9mIHRoZSBzeW5jaHJvbml6YXRpb24gdHJhY2luZyBmdW5jdGlvbnMuCisjZGVmaW5lIEtNUF9GU1lOQ19QUkVQQVJFKG9iaikgKCh2b2lkKTApCisjZGVmaW5lIEtNUF9GU1lOQ19DQU5DRUwob2JqKSAoKHZvaWQpMCkKKyNkZWZpbmUgS01QX0ZTWU5DX0FDUVVJUkVEKG9iaikgKCh2b2lkKTApCisjZGVmaW5lIEtNUF9GU1lOQ19SRUxFQVNJTkcob2JqKSAoKHZvaWQpMCkKKworI2RlZmluZSBLTVBfRlNZTkNfU1BJTl9JTklUKG9iaiwgc3BpbikgKCh2b2lkKTApCisjZGVmaW5lIEtNUF9GU1lOQ19TUElOX1BSRVBBUkUob2JqKSAoKHZvaWQpMCkKKyNkZWZpbmUgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQob2JqKSAoKHZvaWQpMCkKKworI2RlZmluZSBLTVBfSVRUX0lHTk9SRShzdG10KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RtdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZW5kaWYgLy8gVVNFX0lUVF9OT1RJRlkKKworI2lmICFLTVBfREVCVUcKKy8vIEluIHJlbGVhc2UgbW9kZSBpbmNsdWRlIGRlZmluaXRpb25zIG9mIGlubGluZSBmdW5jdGlvbnMuCisjaW5jbHVkZSAia21wX2l0dC5pbmwiCisjZW5kaWYKKworI2VuZGlmIC8vIEtNUF9JVFRfSAorCisjZWxzZSAvKiBVU0VfSVRUX0JVSUxEICovCisKKy8vIE51bGwgZGVmaW5pdGlvbnMgb2YgdGhlIHN5bmNocm9uaXphdGlvbiB0cmFjaW5nIGZ1bmN0aW9ucy4KKy8vIElmIFVTRV9JVFRfQlVMSUQgaXMgbm90IGVuYWJsZWQsIFVTRV9JVFRfTk9USUZZIGNhbm5vdCBiZSBlaXRoZXIuCisvLyBCeSBkZWZpbmluZyB0aGVzZSB3ZSBhdm9pZCB1bnBsZWFzYW50IGlmZGVmIHRlc3RzIGluIG1hbnkgcGxhY2VzLgorI2RlZmluZSBLTVBfRlNZTkNfUFJFUEFSRShvYmopICgodm9pZCkwKQorI2RlZmluZSBLTVBfRlNZTkNfQ0FOQ0VMKG9iaikgKCh2b2lkKTApCisjZGVmaW5lIEtNUF9GU1lOQ19BQ1FVSVJFRChvYmopICgodm9pZCkwKQorI2RlZmluZSBLTVBfRlNZTkNfUkVMRUFTSU5HKG9iaikgKCh2b2lkKTApCisKKyNkZWZpbmUgS01QX0ZTWU5DX1NQSU5fSU5JVChvYmosIHNwaW4pICgodm9pZCkwKQorI2RlZmluZSBLTVBfRlNZTkNfU1BJTl9QUkVQQVJFKG9iaikgKCh2b2lkKTApCisjZGVmaW5lIEtNUF9GU1lOQ19TUElOX0FDUVVJUkVEKG9iaikgKCh2b2lkKTApCisKKyNkZWZpbmUgS01QX0lUVF9JR05PUkUoc3RtdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0bXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBVU0VfSVRUX0JVSUxEX0FSRyh4KQorCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX2l0dC5pbmwgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfaXR0LmlubApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2MwY2ExCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2l0dC5pbmwKQEAgLTAsMCArMSwxMDQ0IEBACisjaWYgVVNFX0lUVF9CVUlMRAorLyoKKyAqIGttcF9pdHQuaW5sIC0tIElubGluZSBmdW5jdGlvbnMgb2YgSVRUIE5vdGlmeS4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLy8gSW5saW5lIGZ1bmN0aW9uIGRlZmluaXRpb25zLiBUaGlzIGZpbGUgc2hvdWxkIGJlIGluY2x1ZGVkIGludG8ga21wX2l0dC5oIGZpbGUKKy8vIGZvciBwcm9kdWN0aW9uIGJ1aWxkICh0byBsZXQgY29tcGxpbGVyIGlubGluZSBmdW5jdGlvbnMpIG9yIGludG8ga21wX2l0dC5jCisvLyBmaWxlIGZvciBkZWJ1ZyBidWlsZCAodG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgZmlsZXMgdG8gcmVjb21waWxlIGFuZCBzYXZlCisvLyBidWlsZCB0aW1lKS4KKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9zdHIuaCIKKworI2lmIEtNUF9JVFRfREVCVUcKK2V4dGVybiBrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9pdHRfZGVidWdfbG9jazsKKyNkZWZpbmUgS01QX0lUVF9ERUJVR19MT0NLKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jaygmX19rbXBfaXR0X2RlYnVnX2xvY2spOyB9CisjZGVmaW5lIEtNUF9JVFRfREVCVUdfUFJJTlQoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiMlMDJkOiAiLCBfX2ttcF9nZXRfZ3RpZCgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZnByaW50ZihzdGRlcnIsIF9fVkFfQVJHU19fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZmbHVzaChzdGRlcnIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF9pdHRfZGVidWdfbG9jayk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNlbHNlCisjZGVmaW5lIEtNUF9JVFRfREVCVUdfTE9DSygpCisjZGVmaW5lIEtNUF9JVFRfREVCVUdfUFJJTlQoLi4uKQorI2VuZGlmIC8vIEtNUF9JVFRfREVCVUcKKworLy8gRW5zdXJlIHRoYXQgdGhlIGZ1bmN0aW9ucyBhcmUgc3RhdGljIGlmIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUgYmVpbmcgaW5saW5lZC4KKy8vIE90aGVyd2lzZSB0aGV5IGNhbm5vdCBiZSB1c2VkIGluIG1vcmUgdGhhbiBvbmUgZmlsZSwgc2luY2UgdGhlcmUgd2lsbCBiZQorLy8gbXVsdGlwbGUgZGVmaW5pdGlvbnMuCisjaWYgS01QX0RFQlVHCisjZGVmaW5lIExJTktBR0UKKyNlbHNlCisjZGVmaW5lIExJTktBR0Ugc3RhdGljIGlubGluZQorI2VuZGlmCisKKy8vIFpDQSBpbnRlcmZhY2UgdXNlZCBieSBJbnRlbChSKSBJbnNwZWN0b3IuIEludGVsKFIpIFBhcmFsbGVsIEFtcGxpZmllciB1c2VzCisvLyB0aGlzIEFQSSB0byBzdXBwb3J0IHVzZXItZGVmaW5lZCBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcywgYnV0IGRvZXMgbm90IHVzZQorLy8gWkNBOyBpdCB3b3VsZCBiZSBzYWZlIHRvIHR1cm4gdGhpcyBvZmYgdW50aWwgd2lkZXIgc3VwcG9ydCBiZWNvbWVzIGF2YWlsYWJsZS4KKyNpZiBVU0VfSVRUX1pDQQorI2lmZGVmIF9fSU5URUxfQ09NUElMRVIKKyNpZiBfX0lOVEVMX0NPTVBJTEVSID49IDEyMDAKKyN1bmRlZiBfX2l0dF9zeW5jX2FjcXVpcmVkCisjdW5kZWYgX19pdHRfc3luY19yZWxlYXNpbmcKKyNkZWZpbmUgX19pdHRfc3luY19hY3F1aXJlZChhZGRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fbm90aWZ5X3pjX2ludHJpbnNpYygoY2hhciAqKSJzeW5jX2FjcXVpcmVkIiwgYWRkcikKKyNkZWZpbmUgX19pdHRfc3luY19yZWxlYXNpbmcoYWRkcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fbm90aWZ5X2ludHJpbnNpYygoY2hhciAqKSJzeW5jX3JlbGVhc2luZyIsIGFkZHIpCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKK3N0YXRpYyBrbXBfYm9vdHN0cmFwX2xvY2tfdCBtZXRhZGF0YV9sb2NrID0KKyAgICBLTVBfQk9PVFNUUkFQX0xPQ0tfSU5JVElBTElaRVIobWV0YWRhdGFfbG9jayk7CisKKy8qIFBhcmFsbGVsIHJlZ2lvbiByZXBvcnRpbmcuCisgKiBfX2ttcF9pdHRfcmVnaW9uX2Zvcmtpbmcgc2hvdWxkIGJlIGNhbGxlZCBieSBtYXN0ZXIgdGhyZWFkIG9mIGEgdGVhbS4KKyAgIEV4YWN0IG1vbWVudCBvZiBjYWxsIGRvZXMgbm90IG1hdHRlciwgYnV0IGl0IHNob3VsZCBiZSBjb21wbGV0ZWQgYmVmb3JlIGFueQorICAgdGhyZWFkIG9mIHRoaXMgdGVhbSBjYWxscyBfX2ttcF9pdHRfcmVnaW9uX3N0YXJ0aW5nLgorICogX19rbXBfaXR0X3JlZ2lvbl9zdGFydGluZyBzaG91bGQgYmUgY2FsbGVkIGJ5IGVhY2ggdGhyZWFkIG9mIGEgdGVhbSBqdXN0CisgICBiZWZvcmUgZW50ZXJpbmcgcGFyYWxsZWwgcmVnaW9uIGJvZHkuCisgKiBfX2ttcF9pdHRfcmVnaW9uX2ZpbmlzaGVkIHNob3VsZCBiZSBjYWxsZWQgYnkgZWFjaCB0aHJlYWQgb2YgYSB0ZWFtIHJpZ2h0CisgICBhZnRlciByZXR1cm5pbmcgZnJvbSBwYXJhbGxlbCByZWdpb24gYm9keS4KKyAqIF9fa21wX2l0dF9yZWdpb25fam9pbmVkIHNob3VsZCBiZSBjYWxsZWQgYnkgbWFzdGVyIHRocmVhZCBvZiBhIHRlYW0sIGFmdGVyCisgICBhbGwgdGhyZWFkcyBjYWxsZWQgX19rbXBfaXR0X3JlZ2lvbl9maW5pc2hlZC4KKworIE5vdGU6IFRocmVhZCB3YWl0aW5nIGF0IGpvaW4gYmFycmllciAoYWZ0ZXIgX19rbXBfaXR0X3JlZ2lvbl9maW5pc2hlZCkgY2FuCisgZXhlY3V0ZSBzb21lIG1vcmUgdXNlciBjb2RlIC0tIHN1Y2ggYSB0aHJlYWQgY2FuIGV4ZWN1dGUgdGFza3MuCisKKyBOb3RlOiBUaGUgb3ZlcmhlYWQgb2YgbG9nZ2luZyByZWdpb25fc3RhcnRpbmcgYW5kIHJlZ2lvbl9maW5pc2hlZCBpbiBlYWNoCisgdGhyZWFkIGlzIHRvbyBsYXJnZSwgc28gdGhlc2UgY2FsbHMgYXJlIG5vdCB1c2VkLiAqLworCitMSU5LQUdFIHZvaWQgX19rbXBfaXR0X3JlZ2lvbl9mb3JraW5nKGludCBndGlkLCBpbnQgdGVhbV9zaXplLCBpbnQgYmFycmllcnMpIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICBrbXBfdGVhbV90ICp0ZWFtID0gX19rbXBfdGVhbV9mcm9tX2d0aWQoZ3RpZCk7CisgIGlmICh0ZWFtLT50LnRfYWN0aXZlX2xldmVsID4gMSkgeworICAgIC8vIFRoZSBmcmFtZSBub3RpZmljYXRpb25zIGFyZSBvbmx5IHN1cHBvcnRlZCBmb3IgdGhlIG91dGVybW9zdCB0ZWFtcy4KKyAgICByZXR1cm47CisgIH0KKyAgaWRlbnRfdCAqbG9jID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZChndGlkKS0+dGgudGhfaWRlbnQ7CisgIGlmIChsb2MpIHsKKyAgICAvLyBVc2UgdGhlIHJlc2VydmVkXzIgZmllbGQgdG8gc3RvcmUgdGhlIGluZGV4IHRvIHRoZSByZWdpb24gZG9tYWluLgorICAgIC8vIEFzc3VtZSB0aGF0IHJlc2VydmVkXzIgY29udGFpbnMgemVybyBpbml0aWFsbHkuICBTaW5jZSB6ZXJvIGlzIHNwZWNpYWwKKyAgICAvLyB2YWx1ZSBoZXJlLCBzdG9yZSB0aGUgaW5kZXggaW50byBkb21haW4gYXJyYXkgaW5jcmVhc2VkIGJ5IDEuCisgICAgaWYgKGxvYy0+cmVzZXJ2ZWRfMiA9PSAwKSB7CisgICAgICBpZiAoX19rbXBfcmVnaW9uX2RvbWFpbl9jb3VudCA8IEtNUF9NQVhfRlJBTUVfRE9NQUlOUykgeworICAgICAgICBpbnQgZnJtID0KKyAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fSU5DMzIoJl9fa21wX3JlZ2lvbl9kb21haW5fY291bnQpOyAvLyBnZXQgIm9sZCIgdmFsdWUKKyAgICAgICAgaWYgKGZybSA+PSBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMpIHsKKyAgICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKCZfX2ttcF9yZWdpb25fZG9tYWluX2NvdW50KTsgLy8gcmV2ZXJ0IHRoZSBjb3VudAorICAgICAgICAgIHJldHVybjsgLy8gbG9jLT5yZXNlcnZlZF8yIGlzIHN0aWxsIDAKKyAgICAgICAgfQorICAgICAgICAvLyBpZiAoIUtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggJmxvYy0+cmVzZXJ2ZWRfMiwgMCwgZnJtICsgMSApKSB7CisgICAgICAgIC8vICAgIGZybSA9IGxvYy0+cmVzZXJ2ZWRfMiAtIDE7ICAgLy8gZ2V0IHZhbHVlIHNhdmVkIGJ5IG90aGVyIHRocmVhZAorICAgICAgICAvLyAgICBmb3Igc2FtZSBsb2MKKyAgICAgICAgLy99IC8vIEFDOiB0aGlzIGJsb2NrIGlzIHRvIHJlcGxhY2UgbmV4dCB1bnN5bmNocm9uaXplZCBsaW5lCisKKyAgICAgICAgLy8gV2UgbmVlZCB0byBzYXZlIGluZGV4ZXMgZm9yIGJvdGggcmVnaW9uIGFuZCBiYXJyaWVyIGZyYW1lcy4gV2UnbGwgdXNlCisgICAgICAgIC8vIGxvYy0+cmVzZXJ2ZWRfMiBmaWVsZCBidXQgcHV0IHJlZ2lvbiBpbmRleCB0byB0aGUgbG93IHR3byBieXRlcyBhbmQKKyAgICAgICAgLy8gYmFycmllciBpbmRleGVzIHRvIHRoZSBoaWdoIHR3byBieXRlcy4gSXQgaXMgT0sgYmVjYXVzZQorICAgICAgICAvLyBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMgPSA1MTIuCisgICAgICAgIGxvYy0+cmVzZXJ2ZWRfMiB8PSAoZnJtICsgMSk7IC8vIHNhdmUgIm5ldyIgdmFsdWUKKworICAgICAgICAvLyBUcmFuc2Zvcm0gY29tcGlsZXItZ2VuZXJhdGVkIHJlZ2lvbiBsb2NhdGlvbiBpbnRvIHRoZSBmb3JtYXQKKyAgICAgICAgLy8gdGhhdCB0aGUgdG9vbHMgbW9yZSBvciBsZXNzIHN0YW5kYXJkaXplZCBvbjoKKyAgICAgICAgLy8gICAiPGZ1bmM+JG9tcCRwYXJhbGxlbEBbZmlsZTpdPGxpbmU+Wzo8Y29sPl0iCisgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZmYgPSBOVUxMOworICAgICAgICBrbXBfc3RyX2xvY190IHN0cl9sb2MgPSBfX2ttcF9zdHJfbG9jX2luaXQobG9jLT5wc291cmNlLCAxKTsKKyAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoIiVzJG9tcCRwYXJhbGxlbDolZEAlczolZDolZCIsIHN0cl9sb2MuZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbV9zaXplLCBzdHJfbG9jLmZpbGUsIHN0cl9sb2MubGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2xvYy5jb2wpOworCisgICAgICAgIF9faXR0X3N1cHByZXNzX3B1c2goX19pdHRfc3VwcHJlc3NfbWVtb3J5X2Vycm9ycyk7CisgICAgICAgIF9fa21wX2l0dF9yZWdpb25fZG9tYWluc1tmcm1dID0gX19pdHRfZG9tYWluX2NyZWF0ZShidWZmKTsKKyAgICAgICAgX19pdHRfc3VwcHJlc3NfcG9wKCk7CisKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoJmJ1ZmYpOworICAgICAgICBpZiAoYmFycmllcnMpIHsKKyAgICAgICAgICBpZiAoX19rbXBfYmFycmllcl9kb21haW5fY291bnQgPCBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMpIHsKKyAgICAgICAgICAgIGludCBmcm0gPSBLTVBfVEVTVF9USEVOX0lOQzMyKAorICAgICAgICAgICAgICAgICZfX2ttcF9iYXJyaWVyX2RvbWFpbl9jb3VudCk7IC8vIGdldCAib2xkIiB2YWx1ZQorICAgICAgICAgICAgaWYgKGZybSA+PSBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMpIHsKKyAgICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9ERUMzMigKKyAgICAgICAgICAgICAgICAgICZfX2ttcF9iYXJyaWVyX2RvbWFpbl9jb3VudCk7IC8vIHJldmVydCB0aGUgY291bnQKKyAgICAgICAgICAgICAgcmV0dXJuOyAvLyBsb2MtPnJlc2VydmVkXzIgaXMgc3RpbGwgMAorICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmZiA9IE5VTEw7CisgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgiJXMkb21wJGJhcnJpZXJAJXM6JWQiLCBzdHJfbG9jLmZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfbG9jLmZpbGUsIHN0cl9sb2MuY29sKTsKKyAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3B1c2goX19pdHRfc3VwcHJlc3NfbWVtb3J5X2Vycm9ycyk7CisgICAgICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9kb21haW5zW2ZybV0gPSBfX2l0dF9kb21haW5fY3JlYXRlKGJ1ZmYpOworICAgICAgICAgICAgX19pdHRfc3VwcHJlc3NfcG9wKCk7CisgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSgmYnVmZik7CisgICAgICAgICAgICAvLyBTYXZlIHRoZSBiYXJyaWVyIGZyYW1lIGluZGV4IHRvIHRoZSBoaWdoIHR3byBieXRlcy4KKyAgICAgICAgICAgIGxvYy0+cmVzZXJ2ZWRfMiB8PSAoZnJtICsgMSkgPDwgMTY7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF9fa21wX3N0cl9sb2NfZnJlZSgmc3RyX2xvYyk7CisgICAgICAgIF9faXR0X2ZyYW1lX2JlZ2luX3YzKF9fa21wX2l0dF9yZWdpb25fZG9tYWluc1tmcm1dLCBOVUxMKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBSZWdpb24gZG9tYWluIGV4aXN0cyBmb3IgdGhpcyBsb2NhdGlvbgorICAgICAgLy8gQ2hlY2sgaWYgdGVhbSBzaXplIHdhcyBjaGFuZ2VkLiBUaGVuIGNyZWF0ZSBuZXcgcmVnaW9uIGRvbWFpbiBmb3IgdGhpcworICAgICAgLy8gbG9jYXRpb24KKyAgICAgIGludCBmcm0gPSAobG9jLT5yZXNlcnZlZF8yICYgMHgwMDAwRkZGRikgLSAxOworICAgICAgaWYgKF9fa21wX2l0dF9yZWdpb25fdGVhbV9zaXplW2ZybV0gIT0gdGVhbV9zaXplKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZmYgPSBOVUxMOworICAgICAgICBrbXBfc3RyX2xvY190IHN0cl9sb2MgPSBfX2ttcF9zdHJfbG9jX2luaXQobG9jLT5wc291cmNlLCAxKTsKKyAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoIiVzJG9tcCRwYXJhbGxlbDolZEAlczolZDolZCIsIHN0cl9sb2MuZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbV9zaXplLCBzdHJfbG9jLmZpbGUsIHN0cl9sb2MubGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2xvYy5jb2wpOworCisgICAgICAgIF9faXR0X3N1cHByZXNzX3B1c2goX19pdHRfc3VwcHJlc3NfbWVtb3J5X2Vycm9ycyk7CisgICAgICAgIF9fa21wX2l0dF9yZWdpb25fZG9tYWluc1tmcm1dID0gX19pdHRfZG9tYWluX2NyZWF0ZShidWZmKTsKKyAgICAgICAgX19pdHRfc3VwcHJlc3NfcG9wKCk7CisKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoJmJ1ZmYpOworICAgICAgICBfX2ttcF9zdHJfbG9jX2ZyZWUoJnN0cl9sb2MpOworICAgICAgICBfX2ttcF9pdHRfcmVnaW9uX3RlYW1fc2l6ZVtmcm1dID0gdGVhbV9zaXplOworICAgICAgICBfX2l0dF9mcmFtZV9iZWdpbl92MyhfX2ttcF9pdHRfcmVnaW9uX2RvbWFpbnNbZnJtXSwgTlVMTCk7CisgICAgICB9IGVsc2UgeyAvLyBUZWFtIHNpemUgd2FzIG5vdCBjaGFuZ2VkLiBVc2UgZXhpc3RpbmcgZG9tYWluLgorICAgICAgICBfX2l0dF9mcmFtZV9iZWdpbl92MyhfX2ttcF9pdHRfcmVnaW9uX2RvbWFpbnNbZnJtXSwgTlVMTCk7CisgICAgICB9CisgICAgfQorICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoIltmcm0gYmVnXSBndGlkPSVkLCBpZHg9JXgsIGxvYzolcFxuIiwgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvYy0+cmVzZXJ2ZWRfMiwgbG9jKTsKKyAgfQorI2VuZGlmCit9IC8vIF9fa21wX2l0dF9yZWdpb25fZm9ya2luZworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTElOS0FHRSB2b2lkIF9fa21wX2l0dF9mcmFtZV9zdWJtaXQoaW50IGd0aWQsIF9faXR0X3RpbWVzdGFtcCBiZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXR0X3RpbWVzdGFtcCBlbmQsIGludCBpbWJhbGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudF90ICpsb2MsIGludCB0ZWFtX3NpemUsIGludCByZWdpb24pIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICBpZiAocmVnaW9uKSB7CisgICAga21wX3RlYW1fdCAqdGVhbSA9IF9fa21wX3RlYW1fZnJvbV9ndGlkKGd0aWQpOworICAgIGludCBzZXJpYWxpemVkID0gKHJlZ2lvbiA9PSAyID8gMSA6IDApOworICAgIGlmICh0ZWFtLT50LnRfYWN0aXZlX2xldmVsICsgc2VyaWFsaXplZCA+IDEpIHsKKyAgICAgIC8vIFRoZSBmcmFtZSBub3RpZmljYXRpb25zIGFyZSBvbmx5IHN1cHBvcnRlZCBmb3IgdGhlIG91dGVybW9zdCB0ZWFtcy4KKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gQ2hlY2sgcmVnaW9uIGRvbWFpbiBoYXMgbm90IGJlZW4gY3JlYXRlZCBiZWZvcmUuIEl0J3MgaW5kZXggaXMgc2F2ZWQgaW4KKyAgICAvLyB0aGUgbG93IHR3byBieXRlcy4KKyAgICBpZiAoKGxvYy0+cmVzZXJ2ZWRfMiAmIDB4MDAwMEZGRkYpID09IDApIHsKKyAgICAgIGlmIChfX2ttcF9yZWdpb25fZG9tYWluX2NvdW50IDwgS01QX01BWF9GUkFNRV9ET01BSU5TKSB7CisgICAgICAgIGludCBmcm0gPQorICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9JTkMzMigmX19rbXBfcmVnaW9uX2RvbWFpbl9jb3VudCk7IC8vIGdldCAib2xkIiB2YWx1ZQorICAgICAgICBpZiAoZnJtID49IEtNUF9NQVhfRlJBTUVfRE9NQUlOUykgeworICAgICAgICAgIEtNUF9URVNUX1RIRU5fREVDMzIoJl9fa21wX3JlZ2lvbl9kb21haW5fY291bnQpOyAvLyByZXZlcnQgdGhlIGNvdW50CisgICAgICAgICAgcmV0dXJuOyAvLyBsb2MtPnJlc2VydmVkXzIgaXMgc3RpbGwgMAorICAgICAgICB9CisKKyAgICAgICAgLy8gV2UgbmVlZCB0byBzYXZlIGluZGV4ZXMgZm9yIGJvdGggcmVnaW9uIGFuZCBiYXJyaWVyIGZyYW1lcy4gV2UnbGwgdXNlCisgICAgICAgIC8vIGxvYy0+cmVzZXJ2ZWRfMiBmaWVsZCBidXQgcHV0IHJlZ2lvbiBpbmRleCB0byB0aGUgbG93IHR3byBieXRlcyBhbmQKKyAgICAgICAgLy8gYmFycmllciBpbmRleGVzIHRvIHRoZSBoaWdoIHR3byBieXRlcy4gSXQgaXMgT0sgYmVjYXVzZQorICAgICAgICAvLyBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMgPSA1MTIuCisgICAgICAgIGxvYy0+cmVzZXJ2ZWRfMiB8PSAoZnJtICsgMSk7IC8vIHNhdmUgIm5ldyIgdmFsdWUKKworICAgICAgICAvLyBUcmFuc2Zvcm0gY29tcGlsZXItZ2VuZXJhdGVkIHJlZ2lvbiBsb2NhdGlvbiBpbnRvIHRoZSBmb3JtYXQKKyAgICAgICAgLy8gdGhhdCB0aGUgdG9vbHMgbW9yZSBvciBsZXNzIHN0YW5kYXJkaXplZCBvbjoKKyAgICAgICAgLy8gICAiPGZ1bmM+JG9tcCRwYXJhbGxlbDp0ZWFtX3NpemVAW2ZpbGU6XTxsaW5lPls6PGNvbD5dIgorICAgICAgICBjb25zdCBjaGFyICpidWZmID0gTlVMTDsKKyAgICAgICAga21wX3N0cl9sb2NfdCBzdHJfbG9jID0gX19rbXBfc3RyX2xvY19pbml0KGxvYy0+cHNvdXJjZSwgMSk7CisgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KCIlcyRvbXAkcGFyYWxsZWw6JWRAJXM6JWQ6JWQiLCBzdHJfbG9jLmZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW1fc2l6ZSwgc3RyX2xvYy5maWxlLCBzdHJfbG9jLmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9sb2MuY29sKTsKKworICAgICAgICBfX2l0dF9zdXBwcmVzc19wdXNoKF9faXR0X3N1cHByZXNzX21lbW9yeV9lcnJvcnMpOworICAgICAgICBfX2ttcF9pdHRfcmVnaW9uX2RvbWFpbnNbZnJtXSA9IF9faXR0X2RvbWFpbl9jcmVhdGUoYnVmZik7CisgICAgICAgIF9faXR0X3N1cHByZXNzX3BvcCgpOworCisgICAgICAgIF9fa21wX3N0cl9mcmVlKCZidWZmKTsKKyAgICAgICAgX19rbXBfc3RyX2xvY19mcmVlKCZzdHJfbG9jKTsKKyAgICAgICAgX19rbXBfaXR0X3JlZ2lvbl90ZWFtX3NpemVbZnJtXSA9IHRlYW1fc2l6ZTsKKyAgICAgICAgX19pdHRfZnJhbWVfc3VibWl0X3YzKF9fa21wX2l0dF9yZWdpb25fZG9tYWluc1tmcm1dLCBOVUxMLCBiZWdpbiwgZW5kKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBSZWdpb24gZG9tYWluIGV4aXN0cyBmb3IgdGhpcyBsb2NhdGlvbgorICAgICAgLy8gQ2hlY2sgaWYgdGVhbSBzaXplIHdhcyBjaGFuZ2VkLiBUaGVuIGNyZWF0ZSBuZXcgcmVnaW9uIGRvbWFpbiBmb3IgdGhpcworICAgICAgLy8gbG9jYXRpb24KKyAgICAgIGludCBmcm0gPSAobG9jLT5yZXNlcnZlZF8yICYgMHgwMDAwRkZGRikgLSAxOworICAgICAgaWYgKF9fa21wX2l0dF9yZWdpb25fdGVhbV9zaXplW2ZybV0gIT0gdGVhbV9zaXplKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZmYgPSBOVUxMOworICAgICAgICBrbXBfc3RyX2xvY190IHN0cl9sb2MgPSBfX2ttcF9zdHJfbG9jX2luaXQobG9jLT5wc291cmNlLCAxKTsKKyAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoIiVzJG9tcCRwYXJhbGxlbDolZEAlczolZDolZCIsIHN0cl9sb2MuZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbV9zaXplLCBzdHJfbG9jLmZpbGUsIHN0cl9sb2MubGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2xvYy5jb2wpOworCisgICAgICAgIF9faXR0X3N1cHByZXNzX3B1c2goX19pdHRfc3VwcHJlc3NfbWVtb3J5X2Vycm9ycyk7CisgICAgICAgIF9fa21wX2l0dF9yZWdpb25fZG9tYWluc1tmcm1dID0gX19pdHRfZG9tYWluX2NyZWF0ZShidWZmKTsKKyAgICAgICAgX19pdHRfc3VwcHJlc3NfcG9wKCk7CisKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoJmJ1ZmYpOworICAgICAgICBfX2ttcF9zdHJfbG9jX2ZyZWUoJnN0cl9sb2MpOworICAgICAgICBfX2ttcF9pdHRfcmVnaW9uX3RlYW1fc2l6ZVtmcm1dID0gdGVhbV9zaXplOworICAgICAgICBfX2l0dF9mcmFtZV9zdWJtaXRfdjMoX19rbXBfaXR0X3JlZ2lvbl9kb21haW5zW2ZybV0sIE5VTEwsIGJlZ2luLCBlbmQpOworICAgICAgfSBlbHNlIHsgLy8gVGVhbSBzaXplIHdhcyBub3QgY2hhbmdlZC4gVXNlIGV4aXN0aW5nIGRvbWFpbi4KKyAgICAgICAgX19pdHRfZnJhbWVfc3VibWl0X3YzKF9fa21wX2l0dF9yZWdpb25fZG9tYWluc1tmcm1dLCBOVUxMLCBiZWdpbiwgZW5kKTsKKyAgICAgIH0KKyAgICB9CisgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgS01QX0lUVF9ERUJVR19QUklOVCgKKyAgICAgICAgIltyZWcgc3ViXSBndGlkPSVkLCBpZHg9JXgsIHJlZ2lvbjolZCwgbG9jOiVwLCBiZWc6JWxsdSwgZW5kOiVsbHVcbiIsCisgICAgICAgIGd0aWQsIGxvYy0+cmVzZXJ2ZWRfMiwgcmVnaW9uLCBsb2MsIGJlZ2luLCBlbmQpOworICAgIHJldHVybjsKKyAgfSBlbHNlIHsgLy8gY2FsbGVkIGZvciBiYXJyaWVyIHJlcG9ydGluZworICAgIGlmIChsb2MpIHsKKyAgICAgIGlmICgobG9jLT5yZXNlcnZlZF8yICYgMHhGRkZGMDAwMCkgPT0gMCkgeworICAgICAgICBpZiAoX19rbXBfYmFycmllcl9kb21haW5fY291bnQgPCBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMpIHsKKyAgICAgICAgICBpbnQgZnJtID0gS01QX1RFU1RfVEhFTl9JTkMzMigKKyAgICAgICAgICAgICAgJl9fa21wX2JhcnJpZXJfZG9tYWluX2NvdW50KTsgLy8gZ2V0ICJvbGQiIHZhbHVlCisgICAgICAgICAgaWYgKGZybSA+PSBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMpIHsKKyAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fREVDMzIoCisgICAgICAgICAgICAgICAgJl9fa21wX2JhcnJpZXJfZG9tYWluX2NvdW50KTsgLy8gcmV2ZXJ0IHRoZSBjb3VudAorICAgICAgICAgICAgcmV0dXJuOyAvLyBsb2MtPnJlc2VydmVkXzIgaXMgc3RpbGwgMAorICAgICAgICAgIH0KKyAgICAgICAgICAvLyBTYXZlIHRoZSBiYXJyaWVyIGZyYW1lIGluZGV4IHRvIHRoZSBoaWdoIHR3byBieXRlcy4KKyAgICAgICAgICBsb2MtPnJlc2VydmVkXzIgfD0gKGZybSArIDEpIDw8IDE2OyAvLyBzYXZlICJuZXciIHZhbHVlCisKKyAgICAgICAgICAvLyBUcmFuc2Zvcm0gY29tcGlsZXItZ2VuZXJhdGVkIHJlZ2lvbiBsb2NhdGlvbiBpbnRvIHRoZSBmb3JtYXQKKyAgICAgICAgICAvLyB0aGF0IHRoZSB0b29scyBtb3JlIG9yIGxlc3Mgc3RhbmRhcmRpemVkIG9uOgorICAgICAgICAgIC8vICAgIjxmdW5jPiRvbXAkZnJhbWVAW2ZpbGU6XTxsaW5lPls6PGNvbD5dIgorICAgICAgICAgIGttcF9zdHJfbG9jX3Qgc3RyX2xvYyA9IF9fa21wX3N0cl9sb2NfaW5pdChsb2MtPnBzb3VyY2UsIDEpOworICAgICAgICAgIGlmIChpbWJhbGFuY2UpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZmZfaW1iID0gTlVMTDsKKyAgICAgICAgICAgIGJ1ZmZfaW1iID0gX19rbXBfc3RyX2Zvcm1hdCgiJXMkb21wJGJhcnJpZXItaW1iYWxhbmNlOiVkQCVzOiVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfbG9jLmZ1bmMsIHRlYW1fc2l6ZSwgc3RyX2xvYy5maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9sb2MuY29sKTsKKyAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3B1c2goX19pdHRfc3VwcHJlc3NfbWVtb3J5X2Vycm9ycyk7CisgICAgICAgICAgICBfX2ttcF9pdHRfaW1iYWxhbmNlX2RvbWFpbnNbZnJtXSA9IF9faXR0X2RvbWFpbl9jcmVhdGUoYnVmZl9pbWIpOworICAgICAgICAgICAgX19pdHRfc3VwcHJlc3NfcG9wKCk7CisgICAgICAgICAgICBfX2l0dF9mcmFtZV9zdWJtaXRfdjMoX19rbXBfaXR0X2ltYmFsYW5jZV9kb21haW5zW2ZybV0sIE5VTEwsIGJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCk7CisgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSgmYnVmZl9pbWIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpidWZmID0gTlVMTDsKKyAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KCIlcyRvbXAkYmFycmllckAlczolZCIsIHN0cl9sb2MuZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9sb2MuZmlsZSwgc3RyX2xvYy5jb2wpOworICAgICAgICAgICAgX19pdHRfc3VwcHJlc3NfcHVzaChfX2l0dF9zdXBwcmVzc19tZW1vcnlfZXJyb3JzKTsKKyAgICAgICAgICAgIF9fa21wX2l0dF9iYXJyaWVyX2RvbWFpbnNbZnJtXSA9IF9faXR0X2RvbWFpbl9jcmVhdGUoYnVmZik7CisgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wb3AoKTsKKyAgICAgICAgICAgIF9faXR0X2ZyYW1lX3N1Ym1pdF92MyhfX2ttcF9pdHRfYmFycmllcl9kb21haW5zW2ZybV0sIE5VTEwsIGJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCk7CisgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSgmYnVmZik7CisgICAgICAgICAgfQorICAgICAgICAgIF9fa21wX3N0cl9sb2NfZnJlZSgmc3RyX2xvYyk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7IC8vIGlmIGl0IGlzIG5vdCAwIHRoZW4gaXQgc2hvdWxkIGJlIDw9IEtNUF9NQVhfRlJBTUVfRE9NQUlOUworICAgICAgICBpZiAoaW1iYWxhbmNlKSB7CisgICAgICAgICAgX19pdHRfZnJhbWVfc3VibWl0X3YzKAorICAgICAgICAgICAgICBfX2ttcF9pdHRfaW1iYWxhbmNlX2RvbWFpbnNbKGxvYy0+cmVzZXJ2ZWRfMiA+PiAxNikgLSAxXSwgTlVMTCwKKyAgICAgICAgICAgICAgYmVnaW4sIGVuZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgX19pdHRfZnJhbWVfc3VibWl0X3YzKAorICAgICAgICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9kb21haW5zWyhsb2MtPnJlc2VydmVkXzIgPj4gMTYpIC0gMV0sIE5VTEwsCisgICAgICAgICAgICAgIGJlZ2luLCBlbmQpOworICAgICAgICB9CisgICAgICB9CisgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoCisgICAgICAgICAgIltmcm0gc3ViXSBndGlkPSVkLCBpZHg9JXgsIGxvYzolcCwgYmVnOiVsbHUsIGVuZDolbGx1XG4iLCBndGlkLAorICAgICAgICAgIGxvYy0+cmVzZXJ2ZWRfMiwgbG9jLCBiZWdpbiwgZW5kKTsKKyAgICB9CisgIH0KKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfZnJhbWVfc3VibWl0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMSU5LQUdFIHZvaWQgX19rbXBfaXR0X21ldGFkYXRhX2ltYmFsYW5jZShpbnQgZ3RpZCwga21wX3VpbnQ2NCBiZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgZW5kLCBrbXBfdWludDY0IGltYmFsYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgcmVkdWN0aW9uKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgaWYgKG1ldGFkYXRhX2RvbWFpbiA9PSBOVUxMKSB7CisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jaygmbWV0YWRhdGFfbG9jayk7CisgICAgaWYgKG1ldGFkYXRhX2RvbWFpbiA9PSBOVUxMKSB7CisgICAgICBfX2l0dF9zdXBwcmVzc19wdXNoKF9faXR0X3N1cHByZXNzX21lbW9yeV9lcnJvcnMpOworICAgICAgbWV0YWRhdGFfZG9tYWluID0gX19pdHRfZG9tYWluX2NyZWF0ZSgiT01QIE1ldGFkYXRhIik7CisgICAgICBzdHJpbmdfaGFuZGxlX2ltYmwgPSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZSgib21wX21ldGFkYXRhX2ltYmFsYW5jZSIpOworICAgICAgc3RyaW5nX2hhbmRsZV9sb29wID0gX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUoIm9tcF9tZXRhZGF0YV9sb29wIik7CisgICAgICBzdHJpbmdfaGFuZGxlX3NuZ2wgPSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZSgib21wX21ldGFkYXRhX3NpbmdsZSIpOworICAgICAgX19pdHRfc3VwcHJlc3NfcG9wKCk7CisgICAgfQorICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJm1ldGFkYXRhX2xvY2spOworICB9CisKKyAga21wX3VpbnQ2NCBpbWJhbGFuY2VfZGF0YVs0XTsKKyAgaW1iYWxhbmNlX2RhdGFbMF0gPSBiZWdpbjsKKyAgaW1iYWxhbmNlX2RhdGFbMV0gPSBlbmQ7CisgIGltYmFsYW5jZV9kYXRhWzJdID0gaW1iYWxhbmNlOworICBpbWJhbGFuY2VfZGF0YVszXSA9IHJlZHVjdGlvbjsKKworICBfX2l0dF9tZXRhZGF0YV9hZGQobWV0YWRhdGFfZG9tYWluLCBfX2l0dF9udWxsLCBzdHJpbmdfaGFuZGxlX2ltYmwsCisgICAgICAgICAgICAgICAgICAgICBfX2l0dF9tZXRhZGF0YV91NjQsIDQsIGltYmFsYW5jZV9kYXRhKTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfbWV0YWRhdGFfaW1iYWxhbmNlCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMSU5LQUdFIHZvaWQgX19rbXBfaXR0X21ldGFkYXRhX2xvb3AoaWRlbnRfdCAqbG9jLCBrbXBfdWludDY0IHNjaGVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQ2NCBpdGVyYXRpb25zLCBrbXBfdWludDY0IGNodW5rKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgaWYgKG1ldGFkYXRhX2RvbWFpbiA9PSBOVUxMKSB7CisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jaygmbWV0YWRhdGFfbG9jayk7CisgICAgaWYgKG1ldGFkYXRhX2RvbWFpbiA9PSBOVUxMKSB7CisgICAgICBfX2l0dF9zdXBwcmVzc19wdXNoKF9faXR0X3N1cHByZXNzX21lbW9yeV9lcnJvcnMpOworICAgICAgbWV0YWRhdGFfZG9tYWluID0gX19pdHRfZG9tYWluX2NyZWF0ZSgiT01QIE1ldGFkYXRhIik7CisgICAgICBzdHJpbmdfaGFuZGxlX2ltYmwgPSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZSgib21wX21ldGFkYXRhX2ltYmFsYW5jZSIpOworICAgICAgc3RyaW5nX2hhbmRsZV9sb29wID0gX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUoIm9tcF9tZXRhZGF0YV9sb29wIik7CisgICAgICBzdHJpbmdfaGFuZGxlX3NuZ2wgPSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZSgib21wX21ldGFkYXRhX3NpbmdsZSIpOworICAgICAgX19pdHRfc3VwcHJlc3NfcG9wKCk7CisgICAgfQorICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJm1ldGFkYXRhX2xvY2spOworICB9CisKKyAgLy8gUGFyc2UgbGluZSBhbmQgY29sdW1uIGZyb20gcHNvdXJjZSBzdHJpbmc6ICI7ZmlsZTtmdW5jO2xpbmU7Y29sOzsiCisgIGNoYXIgKnNfbGluZTsKKyAgY2hhciAqc19jb2w7CisgIEtNUF9ERUJVR19BU1NFUlQobG9jLT5wc291cmNlKTsKKyNpZmRlZiBfX2NwbHVzcGx1cworICBzX2xpbmUgPSBzdHJjaHIoQ0NBU1QoY2hhciAqLCBsb2MtPnBzb3VyY2UpLCAnOycpOworI2Vsc2UKKyAgc19saW5lID0gc3RyY2hyKGxvYy0+cHNvdXJjZSwgJzsnKTsKKyNlbmRpZgorICBLTVBfREVCVUdfQVNTRVJUKHNfbGluZSk7CisgIHNfbGluZSA9IHN0cmNocihzX2xpbmUgKyAxLCAnOycpOyAvLyAyLW5kIHNlbWljb2xvbgorICBLTVBfREVCVUdfQVNTRVJUKHNfbGluZSk7CisgIHNfbGluZSA9IHN0cmNocihzX2xpbmUgKyAxLCAnOycpOyAvLyAzLXJkIHNlbWljb2xvbgorICBLTVBfREVCVUdfQVNTRVJUKHNfbGluZSk7CisgIHNfY29sID0gc3RyY2hyKHNfbGluZSArIDEsICc7Jyk7IC8vIDQtdGggc2VtaWNvbG9uCisgIEtNUF9ERUJVR19BU1NFUlQoc19jb2wpOworCisgIGttcF91aW50NjQgbG9vcF9kYXRhWzVdOworICBsb29wX2RhdGFbMF0gPSBhdG9pKHNfbGluZSArIDEpOyAvLyByZWFkIGxpbmUKKyAgbG9vcF9kYXRhWzFdID0gYXRvaShzX2NvbCArIDEpOyAvLyByZWFkIGNvbHVtbgorICBsb29wX2RhdGFbMl0gPSBzY2hlZF90eXBlOworICBsb29wX2RhdGFbM10gPSBpdGVyYXRpb25zOworICBsb29wX2RhdGFbNF0gPSBjaHVuazsKKworICBfX2l0dF9tZXRhZGF0YV9hZGQobWV0YWRhdGFfZG9tYWluLCBfX2l0dF9udWxsLCBzdHJpbmdfaGFuZGxlX2xvb3AsCisgICAgICAgICAgICAgICAgICAgICBfX2l0dF9tZXRhZGF0YV91NjQsIDUsIGxvb3BfZGF0YSk7CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X21ldGFkYXRhX2xvb3AKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xJTktBR0Ugdm9pZCBfX2ttcF9pdHRfbWV0YWRhdGFfc2luZ2xlKGlkZW50X3QgKmxvYykgeworI2lmIFVTRV9JVFRfTk9USUZZCisgIGlmIChtZXRhZGF0YV9kb21haW4gPT0gTlVMTCkgeworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soJm1ldGFkYXRhX2xvY2spOworICAgIGlmIChtZXRhZGF0YV9kb21haW4gPT0gTlVMTCkgeworICAgICAgX19pdHRfc3VwcHJlc3NfcHVzaChfX2l0dF9zdXBwcmVzc19tZW1vcnlfZXJyb3JzKTsKKyAgICAgIG1ldGFkYXRhX2RvbWFpbiA9IF9faXR0X2RvbWFpbl9jcmVhdGUoIk9NUCBNZXRhZGF0YSIpOworICAgICAgc3RyaW5nX2hhbmRsZV9pbWJsID0gX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUoIm9tcF9tZXRhZGF0YV9pbWJhbGFuY2UiKTsKKyAgICAgIHN0cmluZ19oYW5kbGVfbG9vcCA9IF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlKCJvbXBfbWV0YWRhdGFfbG9vcCIpOworICAgICAgc3RyaW5nX2hhbmRsZV9zbmdsID0gX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUoIm9tcF9tZXRhZGF0YV9zaW5nbGUiKTsKKyAgICAgIF9faXR0X3N1cHByZXNzX3BvcCgpOworICAgIH0KKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCZtZXRhZGF0YV9sb2NrKTsKKyAgfQorCisgIGttcF9zdHJfbG9jX3Qgc3RyX2xvYyA9IF9fa21wX3N0cl9sb2NfaW5pdChsb2MtPnBzb3VyY2UsIDEpOworICBrbXBfdWludDY0IHNpbmdsZV9kYXRhWzJdOworICBzaW5nbGVfZGF0YVswXSA9IHN0cl9sb2MubGluZTsKKyAgc2luZ2xlX2RhdGFbMV0gPSBzdHJfbG9jLmNvbDsKKworICBfX2ttcF9zdHJfbG9jX2ZyZWUoJnN0cl9sb2MpOworCisgIF9faXR0X21ldGFkYXRhX2FkZChtZXRhZGF0YV9kb21haW4sIF9faXR0X251bGwsIHN0cmluZ19oYW5kbGVfc25nbCwKKyAgICAgICAgICAgICAgICAgICAgIF9faXR0X21ldGFkYXRhX3U2NCwgMiwgc2luZ2xlX2RhdGEpOworI2VuZGlmCit9IC8vIF9fa21wX2l0dF9tZXRhZGF0YV9zaW5nbGUKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xJTktBR0Ugdm9pZCBfX2ttcF9pdHRfcmVnaW9uX3N0YXJ0aW5nKGludCBndGlkKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfcmVnaW9uX3N0YXJ0aW5nCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMSU5LQUdFIHZvaWQgX19rbXBfaXR0X3JlZ2lvbl9maW5pc2hlZChpbnQgZ3RpZCkgeworI2lmIFVTRV9JVFRfTk9USUZZCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X3JlZ2lvbl9maW5pc2hlZAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMSU5LQUdFIHZvaWQgX19rbXBfaXR0X3JlZ2lvbl9qb2luZWQoaW50IGd0aWQpIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICBrbXBfdGVhbV90ICp0ZWFtID0gX19rbXBfdGVhbV9mcm9tX2d0aWQoZ3RpZCk7CisgIGlmICh0ZWFtLT50LnRfYWN0aXZlX2xldmVsID4gMSkgeworICAgIC8vIFRoZSBmcmFtZSBub3RpZmljYXRpb25zIGFyZSBvbmx5IHN1cHBvcnRlZCBmb3IgdGhlIG91dGVybW9zdCB0ZWFtcy4KKyAgICByZXR1cm47CisgIH0KKyAgaWRlbnRfdCAqbG9jID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZChndGlkKS0+dGgudGhfaWRlbnQ7CisgIGlmIChsb2MgJiYgbG9jLT5yZXNlcnZlZF8yKSB7CisgICAgaW50IGZybSA9IChsb2MtPnJlc2VydmVkXzIgJiAweDAwMDBGRkZGKSAtIDE7CisgICAgaWYgKGZybSA8IEtNUF9NQVhfRlJBTUVfRE9NQUlOUykgeworICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICBfX2l0dF9mcmFtZV9lbmRfdjMoX19rbXBfaXR0X3JlZ2lvbl9kb21haW5zW2ZybV0sIE5VTEwpOworICAgICAgS01QX0lUVF9ERUJVR19QUklOVCgiW2ZybSBlbmRdIGd0aWQ9JWQsIGlkeD0leCwgbG9jOiVwXG4iLCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MtPnJlc2VydmVkXzIsIGxvYyk7CisgICAgfQorICB9CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X3JlZ2lvbl9qb2luZWQKKworLyogQmFycmllcnMgcmVwb3J0aW5nLgorCisgICBBIGJhcnJpZXIgY29uc2lzdHMgb2YgdHdvIHBoYXNlczoKKyAgIDEuIEdhdGhlciAtLSBtYXN0ZXIgd2FpdHMgZm9yIGFycml2aW5nIG9mIGFsbCB0aGUgd29ya2VyIHRocmVhZHM7IGVhY2gKKyAgICAgIHdvcmtlciB0aHJlYWQgcmVnaXN0ZXJzIGFycml2YWwgYW5kIGdvZXMgZnVydGhlci4KKyAgIDIuIFJlbGVhc2UgLS0gZWFjaCB3b3JrZXIgdGhyZWFkcyB3YWl0cyB1bnRpbCBtYXN0ZXIgbGV0cyBpdCBnbzsgbWFzdGVyIGxldHMKKyAgICAgIHdvcmtlciB0aHJlYWRzIGdvLgorCisgICBGdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJ5IGVhY2ggdGhyZWFkOgorICAgKiBfX2ttcF9pdHRfYmFycmllcl9zdGFydGluZygpIC0tIGJlZm9yZSBhcnJpdmluZyB0byB0aGUgZ2F0aGVyIHBoYXNlLgorICAgKiBfX2ttcF9pdHRfYmFycmllcl9taWRkbGUoKSAgIC0tIGJldHdlZW4gZ2F0aGVyIGFuZCByZWxlYXNlIHBoYXNlcy4KKyAgICogX19rbXBfaXR0X2JhcnJpZXJfZmluaXNoZWQoKSAtLSBhZnRlciByZWxlYXNlIHBoYXNlLgorCisgICBOb3RlOiBDYWxsIF9fa21wX2l0dF9iYXJyaWVyX29iamVjdCgpIGJlZm9yZSBjYWxsIHRvCisgICBfX2ttcF9pdHRfYmFycmllcl9zdGFydGluZygpIGFuZCBzYXZlIHJlc3VsdCBpbiBsb2NhbCB2YXJpYWJsZS4KKyAgIF9fa21wX2l0dF9iYXJyaWVyX29iamVjdCgpLCBiZWluZyBjYWxsZWQgdG9vIGxhdGUgKGUuIGcuIGFmdGVyIGdhdGhlciBwaGFzZSkKKyAgIHdvdWxkIHJldHVybiBpdHQgc3luYyBvYmplY3QgZm9yIHRoZSBuZXh0IGJhcnJpZXIhCisKKyAgIElUVCBuZWVkIGFuIGFkZHJlc3MgKHZvaWQgKikgdG8gYmUgc3BlY2lmaWVkIGFzIGEgc3luYyBvYmplY3QuIE9wZW5NUCBSVEwKKyAgIGRvZXMgbm90IGhhdmUgYmFycmllciBvYmplY3Qgb3IgYmFycmllciBkYXRhIHN0cnVjdHVyZS4gQmFycmllciBpcyBqdXN0IGEKKyAgIGNvdW50ZXIgaW4gdGVhbSBhbmQgdGhyZWFkIHN0cnVjdHVyZXMuIFdlIGNvdWxkIHVzZSBhbiBhZGRyZXNzIG9mIHRlYW0KKyAgIHN0cnVjdHVyZSBhcyBhbiBiYXJyaWVyIHN5bmMgb2JqZWN0LCBidXQgSVRUIHdhbnRzIGRpZmZlcmVudCBvYmplY3RzIGZvcgorICAgZGlmZmVyZW50IGJhcnJpZXJzIChldmVuIHdoaXRoaW4gdGhlIHNhbWUgdGVhbSkuIFNvIGxldCB1cyB1c2UgdGVhbSBhZGRyZXNzCisgICBhcyBiYXJyaWVyIHN5bmMgb2JqZWN0IGZvciB0aGUgZmlyc3QgYmFycmllciwgdGhlbiBpbmNyZWFzZSBpdCBieSBvbmUgZm9yIHRoZQorICAgbmV4dCBiYXJyaWVyLCBhbmQgc28gb24gKGJ1dCB3cmFwIGl0IG5vdCB0byB1c2UgYWRkcmVzc2VzIG91dHNpZGUgb2YgdGVhbQorICAgc3RydWN0dXJlKS4gKi8KKwordm9pZCAqX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KGludCBndGlkLCBpbnQgYnQsIGludCBzZXRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGEgLy8gMCAoY3VycmVudCBiYXJyaWVyKSBpcyBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWU7IHNwZWNpZnkgLTEgdG8gZ2V0IHByZXZpb3VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFycmllci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKKyAgdm9pZCAqb2JqZWN0ID0gTlVMTDsKKyNpZiBVU0VfSVRUX05PVElGWQorICBrbXBfaW5mb190ICp0aHIgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKGd0aWQpOworICBrbXBfdGVhbV90ICp0ZWFtID0gdGhyLT50aC50aF90ZWFtOworCisgIC8vIE5PVEU6IElmIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBfX2ttcF9mb3JrX2JhcnJpZXIsIHRlYW0gcG9pbnRlciBjYW4KKyAgLy8gYmUgTlVMTC4gVGhpcyAiaWYiIGhlbHBzIHRvIGF2b2lkIGNyYXNoLiBIb3dldmVyLCB0aGlzIGlzIG5vdCBjb21wbGV0ZQorICAvLyBzb2x1dGlvbiwgYW5kIHJlcG9ydGluZyBmb3JrL2pvaW4gYmFycmllcnMgdG8gSVRUIHNob3VsZCBiZSByZXZpc2l0ZWQuCisKKyAgaWYgKHRlYW0gIT0gTlVMTCkgeworICAgIC8vIE1hc3RlciB0aHJlYWQgaW5jcmVhc2VzIGJfYXJyaXZlZCBieSBLTVBfQkFSUklFUl9TVEFURV9CVU1QIGVhY2ggdGltZS4KKyAgICAvLyBEaXZpZGUgYl9hcnJpdmVkIGJ5IEtNUF9CQVJSSUVSX1NUQVRFX0JVTVAgdG8gZ2V0IHBsYWluIGJhcnJpZXIgY291bnRlci4KKyAgICBrbXBfdWludDY0IGNvdW50ZXIgPQorICAgICAgICB0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQgLyBLTVBfQkFSUklFUl9TVEFURV9CVU1QICsgZGVsdGE7CisgICAgLy8gTm93IGZvcm0gdGhlIGJhcnJpZXIgaWQuIEVuY29kZSBiYXJyaWVyIHR5cGUgKGJ0KSBpbiBiYXJyaWVyIGlkIHRvbywgc28KKyAgICAvLyBiYXJyaWVycyBvZiBkaWZmZXJlbnQgdHlwZXMgZG8gbm90IGhhdmUgdGhlIHNhbWUgaWRzLgorICAgIEtNUF9CVUlMRF9BU1NFUlQoc2l6ZW9mKGttcF90ZWFtX3QpID49IGJzX2xhc3RfYmFycmllcik7CisgICAgLy8gVGhpcyBjb25kaXRvbiBpcyBhIG11c3QgKHdlIHdvdWxkIGhhdmUgemVybyBkaXZpZGUgb3RoZXJ3aXNlKS4KKyAgICBLTVBfQlVJTERfQVNTRVJUKHNpemVvZihrbXBfdGVhbV90KSA+PSAyICogYnNfbGFzdF9iYXJyaWVyKTsKKyAgICAvLyBNb3JlIHN0cm9uZyBjb25kaXRpb246IG1ha2Ugc3VyZSB3ZSBoYXZlIHJvb20gYXQgbGVhc3QgZm9yIGZvciB0d28KKyAgICAvLyBkaWZmZXJ0ZW50IGlkcyAoZm9yIGVhY2ggYmFycmllciB0eXBlKS4KKyAgICBvYmplY3QgPSByZWludGVycHJldF9jYXN0PHZvaWQgKj4oCisgICAgICAgIGttcF91aW50cHRyX3QodGVhbSkgKworICAgICAgICBjb3VudGVyICUgKHNpemVvZihrbXBfdGVhbV90KSAvIGJzX2xhc3RfYmFycmllcikgKiBic19sYXN0X2JhcnJpZXIgKworICAgICAgICBidCk7CisgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgS01QX0lUVF9ERUJVR19QUklOVCgiW2JhciBvYmpdIHR5cGU9JWQsIGNvdW50ZXI9JWxsZCwgb2JqZWN0PSVwXG4iLCBidCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXIsIG9iamVjdCk7CisKKyAgICBpZiAoc2V0X25hbWUpIHsKKyAgICAgIGlkZW50X3QgY29uc3QgKmxvYyA9IE5VTEw7CisgICAgICBjaGFyIGNvbnN0ICpzcmMgPSBOVUxMOworICAgICAgY2hhciBjb25zdCAqdHlwZSA9ICJPTVAgQmFycmllciI7CisgICAgICBzd2l0Y2ggKGJ0KSB7CisgICAgICBjYXNlIGJzX3BsYWluX2JhcnJpZXI6IHsKKyAgICAgICAgLy8gRm9yIHBsYWluIGJhcnJpZXIgY29tcGlsZXIgY2FsbHMgX19rbXBjX2JhcnJpZXIoKSBmdW5jdGlvbiwgd2hpY2gKKyAgICAgICAgLy8gc2F2ZXMgbG9jYXRpb24gaW4gdGhyLT50aC50aF9pZGVudC4KKyAgICAgICAgbG9jID0gdGhyLT50aC50aF9pZGVudDsKKyAgICAgICAgLy8gR2V0IHRoZSBiYXJyaWVyIHR5cGUgZnJvbSBmbGFncyBwcm92aWRlZCBieSBjb21waWxlci4KKyAgICAgICAga21wX2ludDMyIGV4cGwgPSAwOworICAgICAgICBrbXBfdWludDMyIGltcGwgPSAwOworICAgICAgICBpZiAobG9jICE9IE5VTEwpIHsKKyAgICAgICAgICBzcmMgPSBsb2MtPnBzb3VyY2U7CisgICAgICAgICAgZXhwbCA9IChsb2MtPmZsYWdzICYgS01QX0lERU5UX0JBUlJJRVJfRVhQTCkgIT0gMDsKKyAgICAgICAgICBpbXBsID0gKGxvYy0+ZmxhZ3MgJiBLTVBfSURFTlRfQkFSUklFUl9JTVBMKSAhPSAwOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBpZiAoaW1wbCkgeworICAgICAgICAgIHN3aXRjaCAobG9jLT5mbGFncyAmIEtNUF9JREVOVF9CQVJSSUVSX0lNUExfTUFTSykgeworICAgICAgICAgIGNhc2UgS01QX0lERU5UX0JBUlJJRVJfSU1QTF9GT1I6IHsKKyAgICAgICAgICAgIHR5cGUgPSAiT01QIEZvciBCYXJyaWVyIjsKKyAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgIGNhc2UgS01QX0lERU5UX0JBUlJJRVJfSU1QTF9TRUNUSU9OUzogeworICAgICAgICAgICAgdHlwZSA9ICJPTVAgU2VjdGlvbnMgQmFycmllciI7CisgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICBjYXNlIEtNUF9JREVOVF9CQVJSSUVSX0lNUExfU0lOR0xFOiB7CisgICAgICAgICAgICB0eXBlID0gIk9NUCBTaW5nbGUgQmFycmllciI7CisgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICBjYXNlIEtNUF9JREVOVF9CQVJSSUVSX0lNUExfV09SS1NIQVJFOiB7CisgICAgICAgICAgICB0eXBlID0gIk9NUCBXb3Jrc2hhcmUgQmFycmllciI7CisgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICB0eXBlID0gIk9NUCBJbXBsaWNpdCBCYXJyaWVyIjsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoMCk7CisgICAgICAgICAgfTsKKyAgICAgICAgICB9OyAvKiBzd2l0Y2ggKi8KKyAgICAgICAgfSBlbHNlIGlmIChleHBsKSB7CisgICAgICAgICAgdHlwZSA9ICJPTVAgRXhwbGljaXQgQmFycmllciI7CisgICAgICAgIH07IC8qIGlmICovCisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBic19mb3Jram9pbl9iYXJyaWVyOiB7CisgICAgICAgIC8vIEluIGNhc2Ugb2YgZm9yay9qb2luIGJhcnJpZXIgd2UgY2FuIHJlYWQgdGhyLT50aC50aF9pZGVudCwgYmVjYXVzZSBpdAorICAgICAgICAvLyBjb250YWlucyBsb2NhdGlvbiBvZiBsYXN0IHBhc3NlZCBjb25zdHJ1Y3QgKHdoaWxlIGpvaW4gYmFycmllciBpcyBub3QKKyAgICAgICAgLy8gc3VjaCBvbmUpLiBVc2UgdGhfaWRlbnQgb2YgbWFzdGVyIHRocmVhZCBpbnN0ZWFkIC0tIF9fa21wX2pvaW5fY2FsbCgpCisgICAgICAgIC8vIGNhbGxlZCBieSB0aGUgbWFzdGVyIHRocmVhZCBzYXZlcyBsb2NhdGlvbi4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gQUM6IGNhbm5vdCByZWFkIGZyb20gbWFzdGVyIGJlY2F1c2UgX19rbXBfam9pbl9jYWxsIG1heSBiZSBub3QgY2FsbGVkCisgICAgICAgIC8vICAgIHlldCwgc28gd2UgcmVhZCB0aGUgbG9jYXRpb24gZnJvbSB0ZWFtLiBUaGlzIGlzIHRoZSBzYW1lIGxvY2F0aW9uLgorICAgICAgICAvLyAgICBBbmQgdGVhbSBpcyB2YWxpZCBhdCB0aGUgZW50ZXIgdG8gam9pbiBiYXJyaWVyIHdoZXJlIHRoaXMgaGFwcGVucy4KKyAgICAgICAgbG9jID0gdGVhbS0+dC50X2lkZW50OworICAgICAgICBpZiAobG9jICE9IE5VTEwpIHsKKyAgICAgICAgICBzcmMgPSBsb2MtPnBzb3VyY2U7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIHR5cGUgPSAiT01QIEpvaW4gQmFycmllciI7CisgICAgICB9IGJyZWFrOworICAgICAgfTsgLy8gc3dpdGNoCisgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgIF9faXR0X3N5bmNfY3JlYXRlKG9iamVjdCwgdHlwZSwgc3JjLCBfX2l0dF9hdHRyX2JhcnJpZXIpOworICAgICAgS01QX0lUVF9ERUJVR19QUklOVCgKKyAgICAgICAgICAiW2JhciBzdGFdIHNjcmUoICVwLCBcIiVzXCIsIFwiJXNcIiwgX19pdHRfYXR0cl9iYXJyaWVyIClcbiIsIG9iamVjdCwKKyAgICAgICAgICB0eXBlLCBzcmMpOworICAgIH07IC8vIGlmCisKKyAgfTsgLy8gaWYKKyNlbmRpZgorICByZXR1cm4gb2JqZWN0OworfSAvLyBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZvaWQgX19rbXBfaXR0X2JhcnJpZXJfc3RhcnRpbmcoaW50IGd0aWQsIHZvaWQgKm9iamVjdCkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgIGlmICghS01QX01BU1RFUl9HVElEKGd0aWQpKSB7CisgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgX19pdHRfc3luY19yZWxlYXNpbmcob2JqZWN0KTsKKyAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCJbYmFyIHN0YV0gc3JlbCggJXAgKVxuIiwgb2JqZWN0KTsKKyAgfTsgLy8gaWYKKyAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgIF9faXR0X3N5bmNfcHJlcGFyZShvYmplY3QpOworICBLTVBfSVRUX0RFQlVHX1BSSU5UKCJbYmFyIHN0YV0gc3ByZSggJXAgKVxuIiwgb2JqZWN0KTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfYmFycmllcl9zdGFydGluZworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCBfX2ttcF9pdHRfYmFycmllcl9taWRkbGUoaW50IGd0aWQsIHZvaWQgKm9iamVjdCkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgIGlmIChLTVBfTUFTVEVSX0dUSUQoZ3RpZCkpIHsKKyAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICBfX2l0dF9zeW5jX2FjcXVpcmVkKG9iamVjdCk7CisgICAgS01QX0lUVF9ERUJVR19QUklOVCgiW2JhciBtaWRdIHNhY3EoICVwIClcbiIsIG9iamVjdCk7CisgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgX19pdHRfc3luY19yZWxlYXNpbmcob2JqZWN0KTsKKyAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCJbYmFyIG1pZF0gc3JlbCggJXAgKVxuIiwgb2JqZWN0KTsKKyAgfSBlbHNlIHsKKyAgfTsgLy8gaWYKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfYmFycmllcl9taWRkbGUKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZvaWQgX19rbXBfaXR0X2JhcnJpZXJfZmluaXNoZWQoaW50IGd0aWQsIHZvaWQgKm9iamVjdCkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgIGlmIChLTVBfTUFTVEVSX0dUSUQoZ3RpZCkpIHsKKyAgfSBlbHNlIHsKKyAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICBfX2l0dF9zeW5jX2FjcXVpcmVkKG9iamVjdCk7CisgICAgS01QX0lUVF9ERUJVR19QUklOVCgiW2JhciBlbmRdIHNhY3EoICVwIClcbiIsIG9iamVjdCk7CisgIH07IC8vIGlmCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X2JhcnJpZXJfZmluaXNoZWQKKworLyogVGFza3dhaXQgcmVwb3J0aW5nLgorICAgSVRUIG5lZWQgYW4gYWRkcmVzcyAodm9pZCAqKSB0byBiZSBzcGVjaWZpZWQgYXMgYSBzeW5jIG9iamVjdC4gT3Blbk1QIFJUTAorICAgZG9lcyBub3QgaGF2ZSB0YXNrd2FpdCBzdHJ1Y3R1cmUsIHNvIHdlIG5lZWQgdG8gY29uc3RydWN0IHNvbWV0aGluZy4gKi8KKwordm9pZCAqX19rbXBfaXR0X3Rhc2t3YWl0X29iamVjdChpbnQgZ3RpZCkgeworICB2b2lkICpvYmplY3QgPSBOVUxMOworI2lmIFVTRV9JVFRfTk9USUZZCisgIGlmIChfX2l0dF9zeW5jX2NyZWF0ZV9wdHIpIHsKKyAgICBrbXBfaW5mb190ICp0aHJlYWQgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKGd0aWQpOworICAgIGttcF90YXNrZGF0YV90ICp0YXNrZGF0YSA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrOworICAgIG9iamVjdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPihrbXBfdWludHB0cl90KHRhc2tkYXRhKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF9jb3VudGVyICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfdGFza2RhdGFfdCkpOworICB9OyAvLyBpZgorI2VuZGlmCisgIHJldHVybiBvYmplY3Q7Cit9IC8vIF9fa21wX2l0dF90YXNrd2FpdF9vYmplY3QKKwordm9pZCBfX2ttcF9pdHRfdGFza3dhaXRfc3RhcnRpbmcoaW50IGd0aWQsIHZvaWQgKm9iamVjdCkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgIGttcF9pbmZvX3QgKnRocmVhZCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoZ3RpZCk7CisgIGttcF90YXNrZGF0YV90ICp0YXNrZGF0YSA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrOworICBpZGVudF90IGNvbnN0ICpsb2MgPSB0YXNrZGF0YS0+dGRfdGFza3dhaXRfaWRlbnQ7CisgIGNoYXIgY29uc3QgKnNyYyA9IChsb2MgPT0gTlVMTCA/IE5VTEwgOiBsb2MtPnBzb3VyY2UpOworICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgX19pdHRfc3luY19jcmVhdGUob2JqZWN0LCAiT01QIFRhc2t3YWl0Iiwgc3JjLCAwKTsKKyAgS01QX0lUVF9ERUJVR19QUklOVCgiW3R3YSBzdGFdIHNjcmUoICVwLCBcIk9NUCBUYXNrd2FpdFwiLCBcIiVzXCIsIDAgKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBvYmplY3QsIHNyYyk7CisgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICBfX2l0dF9zeW5jX3ByZXBhcmUob2JqZWN0KTsKKyAgS01QX0lUVF9ERUJVR19QUklOVCgiW3R3YSBzdGFdIHNwcmUoICVwIClcbiIsIG9iamVjdCk7CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X3Rhc2t3YWl0X3N0YXJ0aW5nCisKK3ZvaWQgX19rbXBfaXR0X3Rhc2t3YWl0X2ZpbmlzaGVkKGludCBndGlkLCB2b2lkICpvYmplY3QpIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgX19pdHRfc3luY19hY3F1aXJlZChvYmplY3QpOworICBLTVBfSVRUX0RFQlVHX1BSSU5UKCJbdHdhIGVuZF0gc2FjcSggJXAgKVxuIiwgb2JqZWN0KTsKKyAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgIF9faXR0X3N5bmNfZGVzdHJveShvYmplY3QpOworICBLTVBfSVRUX0RFQlVHX1BSSU5UKCJbdHdhIGVuZF0gc2RlcyggJXAgKVxuIiwgb2JqZWN0KTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfdGFza3dhaXRfZmluaXNoZWQKKworLyogVGFzayByZXBvcnRpbmcuCisgICBPbmx5IHRob3NlIHRhc2tzIGFyZSByZXBvcnRlZCB3aGljaCBhcmUgZXhlY3V0ZWQgYnkgYSB0aHJlYWQgc3Bpbm5pbmcgYXQKKyAgIGJhcnJpZXIgKG9yIHRhc2t3YWl0KS4gU3luY2ggb2JqZWN0IHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gbXVzdCBiZSBiYXJyaWVyIG9mCisgICB0YXNrd2FpdCB0aGUgdGhyZWFkcyB3YWl0aW5nIGF0LiAqLworCit2b2lkIF9fa21wX2l0dF90YXNrX3N0YXJ0aW5nKAorICAgIHZvaWQgKm9iamVjdCAvLyBJVFQgc3luYyBvYmplY3Q6IGJhcnJpZXIgb3IgdGFza3dhaXQuCisgICAgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgaWYgKG9iamVjdCAhPSBOVUxMKSB7CisgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgX19pdHRfc3luY19jYW5jZWwob2JqZWN0KTsKKyAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCJbdHNrIHN0YV0gc2NhbiggJXAgKVxuIiwgb2JqZWN0KTsKKyAgfTsgLy8gaWYKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfdGFza19zdGFydGluZworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCBfX2ttcF9pdHRfdGFza19maW5pc2hlZCgKKyAgICB2b2lkICpvYmplY3QgLy8gSVRUIHN5bmMgb2JqZWN0OiBiYXJyaWVyIG9yIHRhc2t3YWl0LgorICAgICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICBfX2l0dF9zeW5jX3ByZXBhcmUob2JqZWN0KTsKKyAgS01QX0lUVF9ERUJVR19QUklOVCgiW3RzayBlbmRdIHNwcmUoICVwIClcbiIsIG9iamVjdCk7CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X3Rhc2tfZmluaXNoZWQKKworLyogTG9jayByZXBvcnRpbmcuCisgKiBfX2ttcF9pdHRfbG9ja19jcmVhdGluZyggbG9jayApIHNob3VsZCBiZSBjYWxsZWQgKmJlZm9yZSogdGhlIGZpcnN0IGxvY2sKKyAgIG9wZXJhdGlvbiAoc2V0L3Vuc2V0KS4gSXQgaXMgbm90IGEgcmVhbCBldmVudCBzaG93biB0byB0aGUgdXNlciBidXQganVzdAorICAgc2V0dGluZyBhIG5hbWUgZm9yIHN5bmNocm9uaXphdGlvbiBvYmplY3QuIGBsb2NrJyBpcyBhbiBhZGRyZXNzIG9mIHN5bmMKKyAgIG9iamVjdCwgdGhlIHNhbWUgYWRkcmVzcyBzaG91bGQgYmUgdXNlZCBpbiBhbGwgc3Vic2VxdWVudCBjYWxscy4KKyAqIF9fa21wX2l0dF9sb2NrX2FjcXVpcmluZygpIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHNldHRpbmcgdGhlIGxvY2suCisgKiBfX2ttcF9pdHRfbG9ja19hY3F1aXJlZCgpIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgc2V0dGluZyB0aGUgbG9jay4KKyAqIF9fa21wX2l0dF9sb2NrX3JlYWxlYXNpbmcoKSBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSB1bnNldHRpbmcgdGhlIGxvY2suCisgKiBfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQoKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHRocmVhZCBjYW5jZWxsZWQgd2FpdGluZworICAgZm9yIHRoZSBsb2NrLgorICogX19rbXBfaXR0X2xvY2tfZGVzdHJveWVkKCBsb2NrICkgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciB0aGUgbGFzdCBsb2NrCisgICBvcGVyYXRpb24uIEFmdGVyIF9fa21wX2l0dF9sb2NrX2Rlc3Ryb3llZCgpIGFsbCB0aGUgcmVmZXJlbmNlcyB0byB0aGUgc2FtZQorICAgYWRkcmVzcyB3aWxsIGJlIGNvbnNpZGVyZWQgYXMgYW5vdGhlciBzeW5jIG9iamVjdCwgbm90IHJlbGF0ZWQgd2l0aCB0aGUKKyAgIG9yaWdpbmFsIG9uZS4gICovCisKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworLy8gVGFrZXMgbG9jYXRpb24gaW5mb3JtYXRpb24gZGlyZWN0bHkKK19fa21wX2lubGluZSB2b2lkIF9fX2ttcF9pdHRfbG9ja19pbml0KGttcF91c2VyX2xvY2tfcCBsb2NrLCBjaGFyIGNvbnN0ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaWRlbnRfdCAqbG9jKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0cikgeworICAgIGNoYXIgY29uc3QgKnNyYyA9IChsb2MgPT0gTlVMTCA/IE5VTEwgOiBsb2MtPnBzb3VyY2UpOworICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgIF9faXR0X3N5bmNfY3JlYXRlKGxvY2ssIHR5cGUsIHNyYywgMCk7CisgICAgS01QX0lUVF9ERUJVR19QUklOVCgiW2xjayBpbmldIHNjcmUoICVwLCBcIiVzXCIsIFwiJXNcIiwgMCApXG4iLCBsb2NrLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjKTsKKyAgfQorI2VuZGlmCit9CisjZWxzZSAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworLy8gSW50ZXJuYWwgZ3V0cyAtLSBjb21tb24gY29kZSBmb3IgbG9ja3MgYW5kIGNyaXRpY2FsIHNlY3Rpb25zLCBkbyBub3QgY2FsbAorLy8gZGlyZWN0bHkuCitfX2ttcF9pbmxpbmUgdm9pZCBfX19rbXBfaXR0X2xvY2tfaW5pdChrbXBfdXNlcl9sb2NrX3AgbG9jaywgY2hhciBjb25zdCAqdHlwZSkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgIGlmIChfX2l0dF9zeW5jX2NyZWF0ZV9wdHIpIHsKKyAgICBpZGVudF90IGNvbnN0ICpsb2MgPSBOVUxMOworICAgIGlmIChfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyAhPSBOVUxMKQorICAgICAgbG9jID0gX19rbXBfZ2V0X3VzZXJfbG9ja19sb2NhdGlvbl8oKGxvY2spKTsKKyAgICBjaGFyIGNvbnN0ICpzcmMgPSAobG9jID09IE5VTEwgPyBOVUxMIDogbG9jLT5wc291cmNlKTsKKyAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICBfX2l0dF9zeW5jX2NyZWF0ZShsb2NrLCB0eXBlLCBzcmMsIDApOworICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoIltsY2sgaW5pXSBzY3JlKCAlcCwgXCIlc1wiLCBcIiVzXCIsIDAgKVxuIiwgbG9jaywgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYyk7CisgIH07IC8vIGlmCisjZW5kaWYKK30gLy8gX19fa21wX2l0dF9sb2NrX2luaXQKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisvLyBJbnRlcm5hbCBndXRzIC0tIGNvbW1vbiBjb2RlIGZvciBsb2NrcyBhbmQgY3JpdGljYWwgc2VjdGlvbnMsIGRvIG5vdCBjYWxsCisvLyBkaXJlY3RseS4KK19fa21wX2lubGluZSB2b2lkIF9fX2ttcF9pdHRfbG9ja19maW5pKGttcF91c2VyX2xvY2tfcCBsb2NrLCBjaGFyIGNvbnN0ICp0eXBlKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgIF9faXR0X3N5bmNfZGVzdHJveShsb2NrKTsKKyAgS01QX0lUVF9ERUJVR19QUklOVCgiW2xjayBkc3RdIHNkZXMoICVwIClcbiIsIGxvY2spOworI2VuZGlmCit9IC8vIF9fX2ttcF9pdHRfbG9ja19maW5pCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKK3ZvaWQgX19rbXBfaXR0X2xvY2tfY3JlYXRpbmcoa21wX3VzZXJfbG9ja19wIGxvY2ssIGNvbnN0IGlkZW50X3QgKmxvYykgeworICBfX19rbXBfaXR0X2xvY2tfaW5pdChsb2NrLCAiT01QIExvY2siLCBsb2MpOworfQorI2Vsc2UKK3ZvaWQgX19rbXBfaXR0X2xvY2tfY3JlYXRpbmcoa21wX3VzZXJfbG9ja19wIGxvY2spIHsKKyAgX19fa21wX2l0dF9sb2NrX2luaXQobG9jaywgIk9NUCBMb2NrIik7Cit9IC8vIF9fa21wX2l0dF9sb2NrX2NyZWF0aW5nCisjZW5kaWYKKwordm9pZCBfX2ttcF9pdHRfbG9ja19hY3F1aXJpbmcoa21wX3VzZXJfbG9ja19wIGxvY2spIHsKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSyAmJiBVU0VfSVRUX05PVElGWQorICAvLyBwb3N0cG9uZSBsb2NrIG9iamVjdCBhY2Nlc3MKKyAgaWYgKF9faXR0X3N5bmNfcHJlcGFyZV9wdHIpIHsKKyAgICBpZiAoS01QX0VYVFJBQ1RfRF9UQUcobG9jaykgPT0gMCkgeworICAgICAga21wX2luZGlyZWN0X2xvY2tfdCAqaWxrID0gS01QX0xPT0tVUF9JX0xPQ0sobG9jayk7CisgICAgICBfX2l0dF9zeW5jX3ByZXBhcmUoaWxrLT5sb2NrKTsKKyAgICB9IGVsc2UgeworICAgICAgX19pdHRfc3luY19wcmVwYXJlKGxvY2spOworICAgIH0KKyAgfQorI2Vsc2UKKyAgX19pdHRfc3luY19wcmVwYXJlKGxvY2spOworI2VuZGlmCit9IC8vIF9fa21wX2l0dF9sb2NrX2FjcXVpcmluZworCit2b2lkIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkKGttcF91c2VyX2xvY2tfcCBsb2NrKSB7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sgJiYgVVNFX0lUVF9OT1RJRlkKKyAgLy8gcG9zdHBvbmUgbG9jayBvYmplY3QgYWNjZXNzCisgIGlmIChfX2l0dF9zeW5jX2FjcXVpcmVkX3B0cikgeworICAgIGlmIChLTVBfRVhUUkFDVF9EX1RBRyhsb2NrKSA9PSAwKSB7CisgICAgICBrbXBfaW5kaXJlY3RfbG9ja190ICppbGsgPSBLTVBfTE9PS1VQX0lfTE9DSyhsb2NrKTsKKyAgICAgIF9faXR0X3N5bmNfYWNxdWlyZWQoaWxrLT5sb2NrKTsKKyAgICB9IGVsc2UgeworICAgICAgX19pdHRfc3luY19hY3F1aXJlZChsb2NrKTsKKyAgICB9CisgIH0KKyNlbHNlCisgIF9faXR0X3N5bmNfYWNxdWlyZWQobG9jayk7CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X2xvY2tfYWNxdWlyZWQKKwordm9pZCBfX2ttcF9pdHRfbG9ja19yZWxlYXNpbmcoa21wX3VzZXJfbG9ja19wIGxvY2spIHsKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSyAmJiBVU0VfSVRUX05PVElGWQorICBpZiAoX19pdHRfc3luY19yZWxlYXNpbmdfcHRyKSB7CisgICAgaWYgKEtNUF9FWFRSQUNUX0RfVEFHKGxvY2spID09IDApIHsKKyAgICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmlsayA9IEtNUF9MT09LVVBfSV9MT0NLKGxvY2spOworICAgICAgX19pdHRfc3luY19yZWxlYXNpbmcoaWxrLT5sb2NrKTsKKyAgICB9IGVsc2UgeworICAgICAgX19pdHRfc3luY19yZWxlYXNpbmcobG9jayk7CisgICAgfQorICB9CisjZWxzZQorICBfX2l0dF9zeW5jX3JlbGVhc2luZyhsb2NrKTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfbG9ja19yZWxlYXNpbmcKKwordm9pZCBfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQoa21wX3VzZXJfbG9ja19wIGxvY2spIHsKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSyAmJiBVU0VfSVRUX05PVElGWQorICBpZiAoX19pdHRfc3luY19jYW5jZWxfcHRyKSB7CisgICAgaWYgKEtNUF9FWFRSQUNUX0RfVEFHKGxvY2spID09IDApIHsKKyAgICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmlsayA9IEtNUF9MT09LVVBfSV9MT0NLKGxvY2spOworICAgICAgX19pdHRfc3luY19jYW5jZWwoaWxrLT5sb2NrKTsKKyAgICB9IGVsc2UgeworICAgICAgX19pdHRfc3luY19jYW5jZWwobG9jayk7CisgICAgfQorICB9CisjZWxzZQorICBfX2l0dF9zeW5jX2NhbmNlbChsb2NrKTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQKKwordm9pZCBfX2ttcF9pdHRfbG9ja19kZXN0cm95ZWQoa21wX3VzZXJfbG9ja19wIGxvY2spIHsKKyAgX19fa21wX2l0dF9sb2NrX2ZpbmkobG9jaywgIk9NUCBMb2NrIik7Cit9IC8vIF9fa21wX2l0dF9sb2NrX2Rlc3Ryb3llZAorCisvKiBDcml0aWNhbCByZXBvcnRpbmcuCisgICBDcml0aWNhbCBzZWN0aW9ucyBhcmUgdHJlYXRlZCBleGFjdGx5IGFzIGxvY2tzIChidXQgaGF2ZSBkaWZmZXJlbnQgb2JqZWN0CisgICB0eXBlKS4gKi8KKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSwordm9pZCBfX2ttcF9pdHRfY3JpdGljYWxfY3JlYXRpbmcoa21wX3VzZXJfbG9ja19wIGxvY2ssIGNvbnN0IGlkZW50X3QgKmxvYykgeworICBfX19rbXBfaXR0X2xvY2tfaW5pdChsb2NrLCAiT01QIENyaXRpY2FsIiwgbG9jKTsKK30KKyNlbHNlCit2b2lkIF9fa21wX2l0dF9jcml0aWNhbF9jcmVhdGluZyhrbXBfdXNlcl9sb2NrX3AgbG9jaykgeworICBfX19rbXBfaXR0X2xvY2tfaW5pdChsb2NrLCAiT01QIENyaXRpY2FsIik7Cit9IC8vIF9fa21wX2l0dF9jcml0aWNhbF9jcmVhdGluZworI2VuZGlmCisKK3ZvaWQgX19rbXBfaXR0X2NyaXRpY2FsX2FjcXVpcmluZyhrbXBfdXNlcl9sb2NrX3AgbG9jaykgeworICBfX2l0dF9zeW5jX3ByZXBhcmUobG9jayk7Cit9IC8vIF9fa21wX2l0dF9jcml0aWNhbF9hY3F1aXJpbmcKKwordm9pZCBfX2ttcF9pdHRfY3JpdGljYWxfYWNxdWlyZWQoa21wX3VzZXJfbG9ja19wIGxvY2spIHsKKyAgX19pdHRfc3luY19hY3F1aXJlZChsb2NrKTsKK30gLy8gX19rbXBfaXR0X2NyaXRpY2FsX2FjcXVpcmVkCisKK3ZvaWQgX19rbXBfaXR0X2NyaXRpY2FsX3JlbGVhc2luZyhrbXBfdXNlcl9sb2NrX3AgbG9jaykgeworICBfX2l0dF9zeW5jX3JlbGVhc2luZyhsb2NrKTsKK30gLy8gX19rbXBfaXR0X2NyaXRpY2FsX3JlbGVhc2luZworCit2b2lkIF9fa21wX2l0dF9jcml0aWNhbF9kZXN0cm95ZWQoa21wX3VzZXJfbG9ja19wIGxvY2spIHsKKyAgX19fa21wX2l0dF9sb2NrX2ZpbmkobG9jaywgIk9NUCBDcml0aWNhbCIpOworfSAvLyBfX2ttcF9pdHRfY3JpdGljYWxfZGVzdHJveWVkCisKKy8qIFNpbmdsZSByZXBvcnRpbmcuICovCisKK3ZvaWQgX19rbXBfaXR0X3NpbmdsZV9zdGFydChpbnQgZ3RpZCkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgIGlmIChfX2l0dF9tYXJrX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRykgeworICAgIGttcF9pbmZvX3QgKnRociA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoKGd0aWQpKTsKKyAgICBpZGVudF90ICpsb2MgPSB0aHItPnRoLnRoX2lkZW50OworICAgIGNoYXIgY29uc3QgKnNyYyA9IChsb2MgPT0gTlVMTCA/IE5VTEwgOiBsb2MtPnBzb3VyY2UpOworICAgIGttcF9zdHJfYnVmX3QgbmFtZTsKKyAgICBfX2ttcF9zdHJfYnVmX2luaXQoJm5hbWUpOworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJm5hbWUsICJPTVAgU2luZ2xlLSVzIiwgc3JjKTsKKyAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICB0aHItPnRoLnRoX2l0dF9tYXJrX3NpbmdsZSA9IF9faXR0X21hcmtfY3JlYXRlKG5hbWUuc3RyKTsKKyAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCJbc2luIHN0YV0gbWNyZSggXCIlc1wiKSAtPiAlZFxuIiwgbmFtZS5zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICB0aHItPnRoLnRoX2l0dF9tYXJrX3NpbmdsZSk7CisgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCZuYW1lKTsKKyAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICBfX2l0dF9tYXJrKHRoci0+dGgudGhfaXR0X21hcmtfc2luZ2xlLCBOVUxMKTsKKyAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCJbc2luIHN0YV0gbWFyayggJWQsIE5VTEwgKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoci0+dGgudGhfaXR0X21hcmtfc2luZ2xlKTsKKyAgfTsgLy8gaWYKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfc2luZ2xlX3N0YXJ0CisKK3ZvaWQgX19rbXBfaXR0X3NpbmdsZV9lbmQoaW50IGd0aWQpIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICBfX2l0dF9tYXJrX3R5cGUgbWFyayA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoZ3RpZCktPnRoLnRoX2l0dF9tYXJrX3NpbmdsZTsKKyAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgIF9faXR0X21hcmtfb2ZmKG1hcmspOworICBLTVBfSVRUX0RFQlVHX1BSSU5UKCJbc2luIGVuZF0gbW9mZiggJWQgKVxuIiwgbWFyayk7CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X3NpbmdsZV9lbmQKKworLyogT3JkZXJlZCByZXBvcnRpbmcuCisgKiBfX2ttcF9pdHRfb3JkZXJlZF9pbml0IGlzIGNhbGxlZCBieSBlYWNoIHRocmVhZCAqYmVmb3JlKiBmaXJzdCB1c2luZyBzeW5jCisgICBvYmplY3QuIElUVCB0ZWFtIHdvdWxkIGxpa2UgaXQgdG8gYmUgY2FsbGVkIG9uY2UsIGJ1dCBpdCByZXF1aXJlcyBleHRyYQorICAgc3luY2hyb25pemF0aW9uLgorICogX19rbXBfaXR0X29yZGVyZWRfcHJlcCBpcyBjYWxsZWQgd2hlbiB0aHJlYWQgaXMgZ29pbmcgdG8gZW50ZXIgb3JkZXJlZAorICAgc2VjdGlvbiAoYmVmb3JlIHN5bmNocm9uaXphdGlvbikuCisgKiBfX2ttcF9pdHRfb3JkZXJlZF9zdGFydCBpcyBjYWxsZWQganVzdCBiZWZvcmUgZW50ZXJpbmcgdXNlciBjb2RlIChhZnRlcgorICAgc3luY2hyb25pemF0aW9uKS4KKyAqIF9fa21wX2l0dF9vcmRlcmVkX2VuZCBpcyBjYWxsZWQgYWZ0ZXIgcmV0dXJuaW5nIGZyb20gdXNlciBjb2RlLgorCisgU3luYyBvYmplY3QgaXMgdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9zaF9jdXJyZW50LgorIEV2ZW50cyBhcmUgbm90IGdlbmVyYXRlZCBpbiBjYXNlIG9mIHNlcmlhbGl6ZWQgdGVhbS4gKi8KKwordm9pZCBfX2ttcF9pdHRfb3JkZXJlZF9pbml0KGludCBndGlkKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0cikgeworICAgIGttcF9pbmZvX3QgKnRociA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoZ3RpZCk7CisgICAgaWRlbnRfdCBjb25zdCAqbG9jID0gdGhyLT50aC50aF9pZGVudDsKKyAgICBjaGFyIGNvbnN0ICpzcmMgPSAobG9jID09IE5VTEwgPyBOVUxMIDogbG9jLT5wc291cmNlKTsKKyAgICBfX2l0dF9zeW5jX2NyZWF0ZSh0aHItPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9zaF9jdXJyZW50LAorICAgICAgICAgICAgICAgICAgICAgICJPTVAgT3JkZXJlZCIsIHNyYywgMCk7CisgIH07IC8vIGlmCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X29yZGVyZWRfaW5pdAorCit2b2lkIF9fa21wX2l0dF9vcmRlcmVkX3ByZXAoaW50IGd0aWQpIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICBpZiAoX19pdHRfc3luY19jcmVhdGVfcHRyKSB7CisgICAga21wX3RlYW1fdCAqdCA9IF9fa21wX3RlYW1fZnJvbV9ndGlkKGd0aWQpOworICAgIGlmICghdC0+dC50X3NlcmlhbGl6ZWQpIHsKKyAgICAgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZChndGlkKTsKKyAgICAgIF9faXR0X3N5bmNfcHJlcGFyZSh0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQpOworICAgIH07IC8vIGlmCisgIH07IC8vIGlmCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X29yZGVyZWRfcHJlcAorCit2b2lkIF9fa21wX2l0dF9vcmRlcmVkX3N0YXJ0KGludCBndGlkKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0cikgeworICAgIGttcF90ZWFtX3QgKnQgPSBfX2ttcF90ZWFtX2Zyb21fZ3RpZChndGlkKTsKKyAgICBpZiAoIXQtPnQudF9zZXJpYWxpemVkKSB7CisgICAgICBrbXBfaW5mb190ICp0aCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoZ3RpZCk7CisgICAgICBfX2l0dF9zeW5jX2FjcXVpcmVkKHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfc2hfY3VycmVudCk7CisgICAgfTsgLy8gaWYKKyAgfTsgLy8gaWYKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfb3JkZXJlZF9zdGFydAorCit2b2lkIF9fa21wX2l0dF9vcmRlcmVkX2VuZChpbnQgZ3RpZCkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgIGlmIChfX2l0dF9zeW5jX2NyZWF0ZV9wdHIpIHsKKyAgICBrbXBfdGVhbV90ICp0ID0gX19rbXBfdGVhbV9mcm9tX2d0aWQoZ3RpZCk7CisgICAgaWYgKCF0LT50LnRfc2VyaWFsaXplZCkgeworICAgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKGd0aWQpOworICAgICAgX19pdHRfc3luY19yZWxlYXNpbmcodGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9zaF9jdXJyZW50KTsKKyAgICB9OyAvLyBpZgorICB9OyAvLyBpZgorI2VuZGlmCit9IC8vIF9fa21wX2l0dF9vcmRlcmVkX2VuZAorCisvKiBUaHJlYWRzIHJlcG9ydGluZy4gKi8KKwordm9pZCBfX2ttcF9pdHRfdGhyZWFkX2lnbm9yZSgpIHsKKyAgX19pdHRfdGhyX2lnbm9yZSgpOworfSAvLyBfX2ttcF9pdHRfdGhyZWFkX2lnbm9yZQorCit2b2lkIF9fa21wX2l0dF90aHJlYWRfbmFtZShpbnQgZ3RpZCkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgIGlmIChfX2l0dF90aHJfbmFtZV9zZXRfcHRyKSB7CisgICAga21wX3N0cl9idWZfdCBuYW1lOworICAgIF9fa21wX3N0cl9idWZfaW5pdCgmbmFtZSk7CisgICAgaWYgKEtNUF9NQVNURVJfR1RJRChndGlkKSkgeworICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmbmFtZSwgIk9NUCBNYXN0ZXIgVGhyZWFkICMlZCIsIGd0aWQpOworICAgIH0gZWxzZSB7CisgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZuYW1lLCAiT01QIFdvcmtlciBUaHJlYWQgIyVkIiwgZ3RpZCk7CisgICAgfQorICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgIF9faXR0X3Rocl9uYW1lX3NldChuYW1lLnN0ciwgbmFtZS51c2VkKTsKKyAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCJbdGhyIG5hbV0gbmFtZSggXCIlc1wiKVxuIiwgbmFtZS5zdHIpOworICAgIF9fa21wX3N0cl9idWZfZnJlZSgmbmFtZSk7CisgIH07IC8vIGlmCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X3RocmVhZF9uYW1lCisKKy8qIFN5c3RlbSBvYmplY3QgcmVwb3J0aW5nLgorICAgSVRUIGNhdGNoZXMgb3BlcmF0aW9ucyB3aXRoIHN5c3RlbSBzeW5jIG9iamVjdHMgKGxpa2UgV2luZG93cyogT1Mgb24gSUEtMzIKKyAgIGFyY2hpdGVjdHVyZSBBUEkgY3JpdGljYWwgc2VjdGlvbnMgYW5kIGV2ZW50cykuIFdlIG9ubHkgbmVlZCB0byBzcGVjaWZ5CisgICBuYW1lICgiT01QIFNjaGVkdWxlciIpIGZvciB0aGUgb2JqZWN0IHRvIGxldCBJVFQga25vdyBpdCBpcyBhbiBvYmplY3QgdXNlZAorICAgYnkgT3Blbk1QIFJUTCBmb3IgaW50ZXJuYWwgcHVycG9zZXMuICovCisKK3ZvaWQgX19rbXBfaXR0X3N5c3RlbV9vYmplY3RfY3JlYXRlZCh2b2lkICpvYmplY3QsIGNoYXIgY29uc3QgKm5hbWUpIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgX19pdHRfc3luY19jcmVhdGUob2JqZWN0LCAiT01QIFNjaGVkdWxlciIsIG5hbWUsIDApOworICBLTVBfSVRUX0RFQlVHX1BSSU5UKCJbc3lzIG9ial0gc2NyZSggJXAsIFwiT01QIFNjaGVkdWxlclwiLCBcIiVzXCIsIDAgKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBvYmplY3QsIG5hbWUpOworI2VuZGlmCit9IC8vIF9fa21wX2l0dF9zeXN0ZW1fb2JqZWN0X2NyZWF0ZWQKKworLyogU3RhY2sgc3RpdGNoaW5nIGFwaS4KKyAgIE1hc3RlciBjYWxscyAiY3JlYXRlIiBhbmQgcHV0IHRoZSBzdGl0Y2hpbmcgaWQgaW50byB0ZWFtIHN0cnVjdHVyZS4KKyAgIFdvcmtlcnMgcmVhZCB0aGUgc3RpdGNoaW5nIGlkIGFuZCBjYWxsICJlbnRlciIgLyAibGVhdmUiIGFwaS4KKyAgIE1hc3RlciBjYWxscyAiZGVzdHJveSIgYXQgdGhlIGVuZCBvZiB0aGUgcGFyYWxsZWwgcmVnaW9uLiAqLworCitfX2l0dF9jYWxsZXIgX19rbXBfaXR0X3N0YWNrX2NhbGxlcl9jcmVhdGUoKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgaWYgKCFfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlX3B0cikKKyAgICByZXR1cm4gTlVMTDsKKyAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgIF9faXR0X2NhbGxlciBpZCA9IF9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGUoKTsKKyAgS01QX0lUVF9ERUJVR19QUklOVCgiW3N0ayBjcmVdICVwXG4iLCBpZCk7CisgIHJldHVybiBpZDsKKyNlbmRpZgorICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBfX2ttcF9pdHRfc3RhY2tfY2FsbGVyX2Rlc3Ryb3koX19pdHRfY2FsbGVyIGlkKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgaWYgKF9faXR0X3N0YWNrX2NhbGxlcl9kZXN0cm95X3B0cikgeworICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgIF9faXR0X3N0YWNrX2NhbGxlcl9kZXN0cm95KGlkKTsKKyAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCJbc3RrIGRlc10gJXBcbiIsIGlkKTsKKyAgfQorI2VuZGlmCit9CisKK3ZvaWQgX19rbXBfaXR0X3N0YWNrX2NhbGxlZV9lbnRlcihfX2l0dF9jYWxsZXIgaWQpIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICBpZiAoX19pdHRfc3RhY2tfY2FsbGVlX2VudGVyX3B0cikgeworICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgIF9faXR0X3N0YWNrX2NhbGxlZV9lbnRlcihpZCk7CisgICAgS01QX0lUVF9ERUJVR19QUklOVCgiW3N0ayBlbnRdICVwXG4iLCBpZCk7CisgIH0KKyNlbmRpZgorfQorCit2b2lkIF9fa21wX2l0dF9zdGFja19jYWxsZWVfbGVhdmUoX19pdHRfY2FsbGVyIGlkKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgaWYgKF9faXR0X3N0YWNrX2NhbGxlZV9sZWF2ZV9wdHIpIHsKKyAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICBfX2l0dF9zdGFja19jYWxsZWVfbGVhdmUoaWQpOworICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoIltzdGsgbGVhXSAlcFxuIiwgaWQpOworICB9CisjZW5kaWYKK30KKworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9sb2NrLmNwcCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9sb2NrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2RhY2E1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2xvY2suY3BwCkBAIC0wLDAgKzEsMzg5NCBAQAorLyoKKyAqIGttcF9sb2NrLmNwcCAtLSBsb2NrLXJlbGF0ZWQgZnVuY3Rpb25zCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxhdG9taWM+CisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pby5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfbG9jay5oIgorCisjaW5jbHVkZSAidHNhbl9hbm5vdGF0aW9ucy5oIgorCisjaWYgS01QX1VTRV9GVVRFWAorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisvLyBXZSBzaG91bGQgcmVhbGx5IGluY2x1ZGUgPGZ1dGV4Lmg+LCBidXQgdGhhdCBjYXVzZXMgY29tcGF0aWJpbGl0eSBwcm9ibGVtcyBvbgorLy8gZGlmZmVyZW50IExpbnV4KiBPUyBkaXN0cmlidXRpb25zIHRoYXQgZWl0aGVyIHJlcXVpcmUgdGhhdCB5b3UgaW5jbHVkZSAob3IKKy8vIGJyZWFrIHdoZW4geW91IHRyeSB0byBpbmNsdWRlKSA8cGNpL3R5cGVzLmg+LiBTaW5jZSBhbGwgd2UgbmVlZCBpcyB0aGUgdHdvCisvLyBtYWNyb3MgYmVsb3cgKHdoaWNoIGFyZSBwYXJ0IG9mIHRoZSBrZXJuZWwgQUJJLCBzbyBjYW4ndCBjaGFuZ2UpIHdlIGp1c3QKKy8vIGRlZmluZSB0aGUgY29uc3RhbnRzIGhlcmUgYW5kIGRvbid0IGluY2x1ZGUgPGZ1dGV4Lmg+CisjaWZuZGVmIEZVVEVYX1dBSVQKKyNkZWZpbmUgRlVURVhfV0FJVCAwCisjZW5kaWYKKyNpZm5kZWYgRlVURVhfV0FLRQorI2RlZmluZSBGVVRFWF9XQUtFIDEKKyNlbmRpZgorI2VuZGlmCisKKy8qIEltcGxlbWVudCBzcGluIGxvY2tzIGZvciBpbnRlcm5hbCBsaWJyYXJ5IHVzZS4gICAgICAgICAgICAgKi8KKy8qIFRoZSBhbGdvcml0aG0gaW1wbGVtZW50ZWQgaXMgTGFtcG9ydCdzIGJha2VyeSBsb2NrIFsxOTc0XS4gKi8KKwordm9pZCBfX2ttcF92YWxpZGF0ZV9sb2Nrcyh2b2lkKSB7CisgIGludCBpOworICBrbXBfdWludDMyIHgsIHk7CisKKyAgLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHVuc2lnbmVkIGFyaXRobWV0aWMgZG9lcyB3cmFwcyBwcm9wZXJseSAqLworICB4ID0gfigoa21wX3VpbnQzMikwKSAtIDI7CisgIHkgPSB4IC0gMjsKKworICBmb3IgKGkgPSAwOyBpIDwgODsgKytpLCArK3gsICsreSkgeworICAgIGttcF91aW50MzIgeiA9ICh4IC0geSk7CisgICAgS01QX0FTU0VSVCh6ID09IDIpOworICB9CisKKyAgS01QX0FTU0VSVChvZmZzZXRvZihrbXBfYmFzZV9xdWV1aW5nX2xvY2ssIHRhaWxfaWQpICUgOCA9PSAwKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiB0ZXN0IGFuZCBzZXQgbG9ja3MgKi8KKworLy8gRm9yIHRoZSBub24tbmVzdGVkIGxvY2tzLCB3ZSBjYW4gb25seSBhc3N1bWUgdGhhdCB0aGUgZmlyc3QgNCBieXRlcyB3ZXJlCisvLyBhbGxvY2F0ZWQsIHNpbmNlIGdjYyBvbmx5IGFsbG9jYXRlcyA0IGJ5dGVzIGZvciBvbXBfbG9ja190LCBhbmQgdGhlIEludGVsCisvLyBjb21waWxlciBvbmx5IGFsbG9jYXRlcyBhIDQgYnl0ZSBwb2ludGVyIG9uIElBLTMyIGFyY2hpdGVjdHVyZS4gIE9uCisvLyBXaW5kb3dzKiBPUyBvbiBJbnRlbChSKSA2NCwgd2UgY2FuIGFzc3VtZSB0aGF0IGFsbCA4IGJ5dGVzIHdlcmUgYWxsb2NhdGVkLgorLy8KKy8vIGdjYyByZXNlcnZlcyA+PSA4IGJ5dGVzIGZvciBuZXN0ZWQgbG9ja3MsIHNvIHdlIGNhbiBhc3N1bWUgdGhhdCB0aGUKKy8vIGVudGlyZSA4IGJ5dGVzIHdlcmUgYWxsb2NhdGVkIGZvciBuZXN0ZWQgbG9ja3Mgb24gYWxsIDY0LWJpdCBwbGF0Zm9ybXMuCisKK3N0YXRpYyBrbXBfaW50MzIgX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKGttcF90YXNfbG9ja190ICpsY2spIHsKKyAgcmV0dXJuIEtNUF9MT0NLX1NUUklQKFRDUl80KGxjay0+bGsucG9sbCkpIC0gMTsKK30KKworc3RhdGljIGlubGluZSBib29sIF9fa21wX2lzX3Rhc19sb2NrX25lc3RhYmxlKGttcF90YXNfbG9ja190ICpsY2spIHsKKyAgcmV0dXJuIGxjay0+bGsuZGVwdGhfbG9ja2VkICE9IC0xOworfQorCitfX2ZvcmNlaW5saW5lIHN0YXRpYyBpbnQKK19fa21wX2FjcXVpcmVfdGFzX2xvY2tfdGltZWRfdGVtcGxhdGUoa21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpIHsKKyAgS01QX01CKCk7CisKKyNpZmRlZiBVU0VfTE9DS19QUk9GSUxFCisgIGttcF91aW50MzIgY3VyciA9IEtNUF9MT0NLX1NUUklQKFRDUl80KGxjay0+bGsucG9sbCkpOworICBpZiAoKGN1cnIgIT0gMCkgJiYgKGN1cnIgIT0gZ3RpZCArIDEpKQorICAgIF9fa21wX3ByaW50ZigiTE9DSyBDT05URU5USU9OOiAlcFxuIiwgbGNrKTsKKy8qIGVsc2UgX19rbXBfcHJpbnRmKCAiLiIgKTsqLworI2VuZGlmIC8qIFVTRV9MT0NLX1BST0ZJTEUgKi8KKworICBpZiAoKGxjay0+bGsucG9sbCA9PSBLTVBfTE9DS19GUkVFKHRhcykpICYmCisgICAgICBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoJihsY2stPmxrLnBvbGwpLCBLTVBfTE9DS19GUkVFKHRhcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0xPQ0tfQlVTWShndGlkICsgMSwgdGFzKSkpIHsKKyAgICBLTVBfRlNZTkNfQUNRVUlSRUQobGNrKTsKKyAgICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfRklSU1Q7CisgIH0KKworICBrbXBfdWludDMyIHNwaW5zOworICBLTVBfRlNZTkNfUFJFUEFSRShsY2spOworICBLTVBfSU5JVF9ZSUVMRChzcGlucyk7CisgIGlmIChUQ1JfNChfX2ttcF9udGgpID4gKF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDogX19rbXBfeHByb2MpKSB7CisgICAgS01QX1lJRUxEKFRSVUUpOworICB9IGVsc2UgeworICAgIEtNUF9ZSUVMRF9TUElOKHNwaW5zKTsKKyAgfQorCisgIGttcF9iYWNrb2ZmX3QgYmFja29mZiA9IF9fa21wX3NwaW5fYmFja29mZl9wYXJhbXM7CisgIHdoaWxlICgobGNrLT5say5wb2xsICE9IEtNUF9MT0NLX0ZSRUUodGFzKSkgfHwKKyAgICAgICAgICghS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCYobGNrLT5say5wb2xsKSwgS01QX0xPQ0tfRlJFRSh0YXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0xPQ0tfQlVTWShndGlkICsgMSwgdGFzKSkpKSB7CisKKyAgICBfX2ttcF9zcGluX2JhY2tvZmYoJmJhY2tvZmYpOworICAgIGlmIChUQ1JfNChfX2ttcF9udGgpID4KKyAgICAgICAgKF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDogX19rbXBfeHByb2MpKSB7CisgICAgICBLTVBfWUlFTEQoVFJVRSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEtNUF9ZSUVMRF9TUElOKHNwaW5zKTsKKyAgICB9CisgIH0KKyAgS01QX0ZTWU5DX0FDUVVJUkVEKGxjayk7CisgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVDsKK30KKworaW50IF9fa21wX2FjcXVpcmVfdGFzX2xvY2soa21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpIHsKKyAgaW50IHJldHZhbCA9IF9fa21wX2FjcXVpcmVfdGFzX2xvY2tfdGltZWRfdGVtcGxhdGUobGNrLCBndGlkKTsKKyAgQU5OT1RBVEVfVEFTX0FDUVVJUkVEKGxjayk7CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgX19rbXBfYWNxdWlyZV90YXNfbG9ja193aXRoX2NoZWNrcyhrbXBfdGFzX2xvY2tfdCAqbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKSB7CisgIGNoYXIgY29uc3QgKmNvbnN0IGZ1bmMgPSAib21wX3NldF9sb2NrIjsKKyAgaWYgKChzaXplb2Yoa21wX3Rhc19sb2NrX3QpIDw9IE9NUF9MT0NLX1RfU0laRSkgJiYKKyAgICAgIF9fa21wX2lzX3Rhc19sb2NrX25lc3RhYmxlKGxjaykpIHsKKyAgICBLTVBfRkFUQUwoTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jKTsKKyAgfQorICBpZiAoKGd0aWQgPj0gMCkgJiYgKF9fa21wX2dldF90YXNfbG9ja19vd25lcihsY2spID09IGd0aWQpKSB7CisgICAgS01QX0ZBVEFMKExvY2tJc0FscmVhZHlPd25lZCwgZnVuYyk7CisgIH0KKyAgcmV0dXJuIF9fa21wX2FjcXVpcmVfdGFzX2xvY2sobGNrLCBndGlkKTsKK30KKworaW50IF9fa21wX3Rlc3RfdGFzX2xvY2soa21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpIHsKKyAgaWYgKChsY2stPmxrLnBvbGwgPT0gS01QX0xPQ0tfRlJFRSh0YXMpKSAmJgorICAgICAgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCYobGNrLT5say5wb2xsKSwgS01QX0xPQ0tfRlJFRSh0YXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9MT0NLX0JVU1koZ3RpZCArIDEsIHRhcykpKSB7CisgICAgS01QX0ZTWU5DX0FDUVVJUkVEKGxjayk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW50IF9fa21wX3Rlc3RfdGFzX2xvY2tfd2l0aF9jaGVja3Moa21wX3Rhc19sb2NrX3QgKmxjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgZ3RpZCkgeworICBjaGFyIGNvbnN0ICpjb25zdCBmdW5jID0gIm9tcF90ZXN0X2xvY2siOworICBpZiAoKHNpemVvZihrbXBfdGFzX2xvY2tfdCkgPD0gT01QX0xPQ0tfVF9TSVpFKSAmJgorICAgICAgX19rbXBfaXNfdGFzX2xvY2tfbmVzdGFibGUobGNrKSkgeworICAgIEtNUF9GQVRBTChMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMpOworICB9CisgIHJldHVybiBfX2ttcF90ZXN0X3Rhc19sb2NrKGxjaywgZ3RpZCk7Cit9CisKK2ludCBfX2ttcF9yZWxlYXNlX3Rhc19sb2NrKGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKSB7CisgIEtNUF9NQigpOyAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgIEtNUF9GU1lOQ19SRUxFQVNJTkcobGNrKTsKKyAgQU5OT1RBVEVfVEFTX1JFTEVBU0VEKGxjayk7CisgIEtNUF9TVF9SRUwzMigmKGxjay0+bGsucG9sbCksIEtNUF9MT0NLX0ZSRUUodGFzKSk7CisgIEtNUF9NQigpOyAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgIEtNUF9ZSUVMRChUQ1JfNChfX2ttcF9udGgpID4KKyAgICAgICAgICAgIChfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6IF9fa21wX3hwcm9jKSk7CisgIHJldHVybiBLTVBfTE9DS19SRUxFQVNFRDsKK30KKworc3RhdGljIGludCBfX2ttcF9yZWxlYXNlX3Rhc19sb2NrX3dpdGhfY2hlY2tzKGttcF90YXNfbG9ja190ICpsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGd0aWQpIHsKKyAgY2hhciBjb25zdCAqY29uc3QgZnVuYyA9ICJvbXBfdW5zZXRfbG9jayI7CisgIEtNUF9NQigpOyAvKiBpbiBjYXNlIGFub3RoZXIgcHJvY2Vzc29yIGluaXRpYWxpemVkIGxvY2sgKi8KKyAgaWYgKChzaXplb2Yoa21wX3Rhc19sb2NrX3QpIDw9IE9NUF9MT0NLX1RfU0laRSkgJiYKKyAgICAgIF9fa21wX2lzX3Rhc19sb2NrX25lc3RhYmxlKGxjaykpIHsKKyAgICBLTVBfRkFUQUwoTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jKTsKKyAgfQorICBpZiAoX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKGxjaykgPT0gLTEpIHsKKyAgICBLTVBfRkFUQUwoTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMpOworICB9CisgIGlmICgoZ3RpZCA+PSAwKSAmJiAoX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKGxjaykgPj0gMCkgJiYKKyAgICAgIChfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIobGNrKSAhPSBndGlkKSkgeworICAgIEtNUF9GQVRBTChMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyLCBmdW5jKTsKKyAgfQorICByZXR1cm4gX19rbXBfcmVsZWFzZV90YXNfbG9jayhsY2ssIGd0aWQpOworfQorCit2b2lkIF9fa21wX2luaXRfdGFzX2xvY2soa21wX3Rhc19sb2NrX3QgKmxjaykgeworICBUQ1dfNChsY2stPmxrLnBvbGwsIEtNUF9MT0NLX0ZSRUUodGFzKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fa21wX2luaXRfdGFzX2xvY2tfd2l0aF9jaGVja3Moa21wX3Rhc19sb2NrX3QgKmxjaykgeworICBfX2ttcF9pbml0X3Rhc19sb2NrKGxjayk7Cit9CisKK3ZvaWQgX19rbXBfZGVzdHJveV90YXNfbG9jayhrbXBfdGFzX2xvY2tfdCAqbGNrKSB7IGxjay0+bGsucG9sbCA9IDA7IH0KKworc3RhdGljIHZvaWQgX19rbXBfZGVzdHJveV90YXNfbG9ja193aXRoX2NoZWNrcyhrbXBfdGFzX2xvY2tfdCAqbGNrKSB7CisgIGNoYXIgY29uc3QgKmNvbnN0IGZ1bmMgPSAib21wX2Rlc3Ryb3lfbG9jayI7CisgIGlmICgoc2l6ZW9mKGttcF90YXNfbG9ja190KSA8PSBPTVBfTE9DS19UX1NJWkUpICYmCisgICAgICBfX2ttcF9pc190YXNfbG9ja19uZXN0YWJsZShsY2spKSB7CisgICAgS01QX0ZBVEFMKExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyk7CisgIH0KKyAgaWYgKF9fa21wX2dldF90YXNfbG9ja19vd25lcihsY2spICE9IC0xKSB7CisgICAgS01QX0ZBVEFMKExvY2tTdGlsbE93bmVkLCBmdW5jKTsKKyAgfQorICBfX2ttcF9kZXN0cm95X3Rhc19sb2NrKGxjayk7Cit9CisKKy8vIG5lc3RlZCB0ZXN0IGFuZCBzZXQgbG9ja3MKKworaW50IF9fa21wX2FjcXVpcmVfbmVzdGVkX3Rhc19sb2NrKGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKSB7CisgIEtNUF9ERUJVR19BU1NFUlQoZ3RpZCA+PSAwKTsKKworICBpZiAoX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKGxjaykgPT0gZ3RpZCkgeworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkICs9IDE7CisgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX05FWFQ7CisgIH0gZWxzZSB7CisgICAgX19rbXBfYWNxdWlyZV90YXNfbG9ja190aW1lZF90ZW1wbGF0ZShsY2ssIGd0aWQpOworICAgIEFOTk9UQVRFX1RBU19BQ1FVSVJFRChsY2spOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMTsKKyAgICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfRklSU1Q7CisgIH0KK30KKworc3RhdGljIGludCBfX2ttcF9hY3F1aXJlX25lc3RlZF90YXNfbG9ja193aXRoX2NoZWNrcyhrbXBfdGFzX2xvY2tfdCAqbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgZ3RpZCkgeworICBjaGFyIGNvbnN0ICpjb25zdCBmdW5jID0gIm9tcF9zZXRfbmVzdF9sb2NrIjsKKyAgaWYgKCFfX2ttcF9pc190YXNfbG9ja19uZXN0YWJsZShsY2spKSB7CisgICAgS01QX0ZBVEFMKExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyk7CisgIH0KKyAgcmV0dXJuIF9fa21wX2FjcXVpcmVfbmVzdGVkX3Rhc19sb2NrKGxjaywgZ3RpZCk7Cit9CisKK2ludCBfX2ttcF90ZXN0X25lc3RlZF90YXNfbG9jayhrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCkgeworICBpbnQgcmV0dmFsOworCisgIEtNUF9ERUJVR19BU1NFUlQoZ3RpZCA+PSAwKTsKKworICBpZiAoX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKGxjaykgPT0gZ3RpZCkgeworICAgIHJldHZhbCA9ICsrbGNrLT5say5kZXB0aF9sb2NrZWQ7CisgIH0gZWxzZSBpZiAoIV9fa21wX3Rlc3RfdGFzX2xvY2sobGNrLCBndGlkKSkgeworICAgIHJldHZhbCA9IDA7CisgIH0gZWxzZSB7CisgICAgS01QX01CKCk7CisgICAgcmV0dmFsID0gbGNrLT5say5kZXB0aF9sb2NrZWQgPSAxOworICB9CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgX19rbXBfdGVzdF9uZXN0ZWRfdGFzX2xvY2tfd2l0aF9jaGVja3Moa21wX3Rhc19sb2NrX3QgKmxjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGd0aWQpIHsKKyAgY2hhciBjb25zdCAqY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9uZXN0X2xvY2siOworICBpZiAoIV9fa21wX2lzX3Rhc19sb2NrX25lc3RhYmxlKGxjaykpIHsKKyAgICBLTVBfRkFUQUwoTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jKTsKKyAgfQorICByZXR1cm4gX19rbXBfdGVzdF9uZXN0ZWRfdGFzX2xvY2sobGNrLCBndGlkKTsKK30KKworaW50IF9fa21wX3JlbGVhc2VfbmVzdGVkX3Rhc19sb2NrKGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKSB7CisgIEtNUF9ERUJVR19BU1NFUlQoZ3RpZCA+PSAwKTsKKworICBLTVBfTUIoKTsKKyAgaWYgKC0tKGxjay0+bGsuZGVwdGhfbG9ja2VkKSA9PSAwKSB7CisgICAgX19rbXBfcmVsZWFzZV90YXNfbG9jayhsY2ssIGd0aWQpOworICAgIHJldHVybiBLTVBfTE9DS19SRUxFQVNFRDsKKyAgfQorICByZXR1cm4gS01QX0xPQ0tfU1RJTExfSEVMRDsKK30KKworc3RhdGljIGludCBfX2ttcF9yZWxlYXNlX25lc3RlZF90YXNfbG9ja193aXRoX2NoZWNrcyhrbXBfdGFzX2xvY2tfdCAqbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgZ3RpZCkgeworICBjaGFyIGNvbnN0ICpjb25zdCBmdW5jID0gIm9tcF91bnNldF9uZXN0X2xvY2siOworICBLTVBfTUIoKTsgLyogaW4gY2FzZSBhbm90aGVyIHByb2Nlc3NvciBpbml0aWFsaXplZCBsb2NrICovCisgIGlmICghX19rbXBfaXNfdGFzX2xvY2tfbmVzdGFibGUobGNrKSkgeworICAgIEtNUF9GQVRBTChMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMpOworICB9CisgIGlmIChfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIobGNrKSA9PSAtMSkgeworICAgIEtNUF9GQVRBTChMb2NrVW5zZXR0aW5nRnJlZSwgZnVuYyk7CisgIH0KKyAgaWYgKF9fa21wX2dldF90YXNfbG9ja19vd25lcihsY2spICE9IGd0aWQpIHsKKyAgICBLTVBfRkFUQUwoTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyk7CisgIH0KKyAgcmV0dXJuIF9fa21wX3JlbGVhc2VfbmVzdGVkX3Rhc19sb2NrKGxjaywgZ3RpZCk7Cit9CisKK3ZvaWQgX19rbXBfaW5pdF9uZXN0ZWRfdGFzX2xvY2soa21wX3Rhc19sb2NrX3QgKmxjaykgeworICBfX2ttcF9pbml0X3Rhc19sb2NrKGxjayk7CisgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMDsgLy8gPj0gMCBmb3IgbmVzdGFibGUgbG9ja3MsIC0xIGZvciBzaW1wbGUgbG9ja3MKK30KKworc3RhdGljIHZvaWQgX19rbXBfaW5pdF9uZXN0ZWRfdGFzX2xvY2tfd2l0aF9jaGVja3Moa21wX3Rhc19sb2NrX3QgKmxjaykgeworICBfX2ttcF9pbml0X25lc3RlZF90YXNfbG9jayhsY2spOworfQorCit2b2lkIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3Rhc19sb2NrKGttcF90YXNfbG9ja190ICpsY2spIHsKKyAgX19rbXBfZGVzdHJveV90YXNfbG9jayhsY2spOworICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3Rhc19sb2NrX3dpdGhfY2hlY2tzKGttcF90YXNfbG9ja190ICpsY2spIHsKKyAgY2hhciBjb25zdCAqY29uc3QgZnVuYyA9ICJvbXBfZGVzdHJveV9uZXN0X2xvY2siOworICBpZiAoIV9fa21wX2lzX3Rhc19sb2NrX25lc3RhYmxlKGxjaykpIHsKKyAgICBLTVBfRkFUQUwoTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jKTsKKyAgfQorICBpZiAoX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKGxjaykgIT0gLTEpIHsKKyAgICBLTVBfRkFUQUwoTG9ja1N0aWxsT3duZWQsIGZ1bmMpOworICB9CisgIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3Rhc19sb2NrKGxjayk7Cit9CisKKyNpZiBLTVBfVVNFX0ZVVEVYCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogZnV0ZXggbG9ja3MgKi8KKworLy8gZnV0ZXggbG9ja3MgYXJlIHJlYWxseSBqdXN0IHRlc3QgYW5kIHNldCBsb2Nrcywgd2l0aCBhIGRpZmZlcmVudCBtZXRob2QKKy8vIG9mIGhhbmRsaW5nIGNvbnRlbnRpb24uICBUaGV5IHRha2UgdGhlIHNhbWUgYW1vdW50IG9mIHNwYWNlIGFzIHRlc3QgYW5kCisvLyBzZXQgbG9ja3MsIGFuZCBhcmUgYWxsb2NhdGVkIHRoZSBzYW1lIHdheSAoaS5lLiB1c2UgdGhlIGFyZWEgYWxsb2NhdGVkIGJ5CisvLyB0aGUgY29tcGlsZXIgZm9yIG5vbi1uZXN0ZWQgbG9ja3MgLyBhbGxvY2F0ZSBuZXN0ZWQgbG9ja3Mgb24gdGhlIGhlYXApLgorCitzdGF0aWMga21wX2ludDMyIF9fa21wX2dldF9mdXRleF9sb2NrX293bmVyKGttcF9mdXRleF9sb2NrX3QgKmxjaykgeworICByZXR1cm4gS01QX0xPQ0tfU1RSSVAoKFRDUl80KGxjay0+bGsucG9sbCkgPj4gMSkpIC0gMTsKK30KKworc3RhdGljIGlubGluZSBib29sIF9fa21wX2lzX2Z1dGV4X2xvY2tfbmVzdGFibGUoa21wX2Z1dGV4X2xvY2tfdCAqbGNrKSB7CisgIHJldHVybiBsY2stPmxrLmRlcHRoX2xvY2tlZCAhPSAtMTsKK30KKworX19mb3JjZWlubGluZSBzdGF0aWMgaW50CitfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2tfdGltZWRfdGVtcGxhdGUoa21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCkgeworICBrbXBfaW50MzIgZ3RpZF9jb2RlID0gKGd0aWQgKyAxKSA8PCAxOworCisgIEtNUF9NQigpOworCisjaWZkZWYgVVNFX0xPQ0tfUFJPRklMRQorICBrbXBfdWludDMyIGN1cnIgPSBLTVBfTE9DS19TVFJJUChUQ1JfNChsY2stPmxrLnBvbGwpKTsKKyAgaWYgKChjdXJyICE9IDApICYmIChjdXJyICE9IGd0aWRfY29kZSkpCisgICAgX19rbXBfcHJpbnRmKCJMT0NLIENPTlRFTlRJT046ICVwXG4iLCBsY2spOworLyogZWxzZSBfX2ttcF9wcmludGYoICIuIiApOyovCisjZW5kaWYgLyogVVNFX0xPQ0tfUFJPRklMRSAqLworCisgIEtNUF9GU1lOQ19QUkVQQVJFKGxjayk7CisgIEtBX1RSQUNFKDEwMDAsICgiX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrOiBsY2s6JXAoMHgleCksIFQjJWQgZW50ZXJpbmdcbiIsCisgICAgICAgICAgICAgICAgICBsY2ssIGxjay0+bGsucG9sbCwgZ3RpZCkpOworCisgIGttcF9pbnQzMiBwb2xsX3ZhbDsKKworICB3aGlsZSAoKHBvbGxfdmFsID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDMyKAorICAgICAgICAgICAgICAmKGxjay0+bGsucG9sbCksIEtNUF9MT0NLX0ZSRUUoZnV0ZXgpLAorICAgICAgICAgICAgICBLTVBfTE9DS19CVVNZKGd0aWRfY29kZSwgZnV0ZXgpKSkgIT0gS01QX0xPQ0tfRlJFRShmdXRleCkpIHsKKworICAgIGttcF9pbnQzMiBjb25kID0gS01QX0xPQ0tfU1RSSVAocG9sbF92YWwpICYgMTsKKyAgICBLQV9UUkFDRSgKKyAgICAgICAgMTAwMCwKKyAgICAgICAgKCJfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2s6IGxjazolcCwgVCMlZCBwb2xsX3ZhbCA9IDB4JXggY29uZCA9IDB4JXhcbiIsCisgICAgICAgICBsY2ssIGd0aWQsIHBvbGxfdmFsLCBjb25kKSk7CisKKyAgICAvLyBOT1RFOiBpZiB5b3UgdHJ5IHRvIHVzZSB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbiBmb3IgdGhpcyBicmFuY2gKKyAgICAvLworICAgIC8vIGlmICggcG9sbF92YWwgJiAxID09IDAgKQorICAgIC8vCisgICAgLy8gVGhlbiB0aGUgMTIuMCBjb21waWxlciBoYXMgYSBidWcgd2hlcmUgdGhlIGZvbGxvd2luZyBibG9jayB3aWxsCisgICAgLy8gYWx3YXlzIGJlIHNraXBwZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIHRoZSBMU0Igb2YgcG9sbF92YWwuCisgICAgaWYgKCFjb25kKSB7CisgICAgICAvLyBUcnkgdG8gc2V0IHRoZSBsc2IgaW4gdGhlIHBvbGwgdG8gaW5kaWNhdGUgdG8gdGhlIG93bmVyCisgICAgICAvLyB0aHJlYWQgdGhhdCB0aGV5IG5lZWQgdG8gd2FrZSB0aGlzIHRocmVhZCB1cC4KKyAgICAgIGlmICghS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDMyKCYobGNrLT5say5wb2xsKSwgcG9sbF92YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xsX3ZhbCB8IEtNUF9MT0NLX0JVU1koMSwgZnV0ZXgpKSkgeworICAgICAgICBLQV9UUkFDRSgKKyAgICAgICAgICAgIDEwMDAsCisgICAgICAgICAgICAoIl9fa21wX2FjcXVpcmVfZnV0ZXhfbG9jazogbGNrOiVwKDB4JXgpLCBUIyVkIGNhbid0IHNldCBiaXQgMFxuIiwKKyAgICAgICAgICAgICBsY2ssIGxjay0+bGsucG9sbCwgZ3RpZCkpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHBvbGxfdmFsIHw9IEtNUF9MT0NLX0JVU1koMSwgZnV0ZXgpOworCisgICAgICBLQV9UUkFDRSgxMDAwLAorICAgICAgICAgICAgICAgKCJfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2s6IGxjazolcCgweCV4KSwgVCMlZCBiaXQgMCBzZXRcbiIsIGxjaywKKyAgICAgICAgICAgICAgICBsY2stPmxrLnBvbGwsIGd0aWQpKTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSgKKyAgICAgICAgMTAwMCwKKyAgICAgICAgKCJfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2s6IGxjazolcCwgVCMlZCBiZWZvcmUgZnV0ZXhfd2FpdCgweCV4KVxuIiwKKyAgICAgICAgIGxjaywgZ3RpZCwgcG9sbF92YWwpKTsKKworICAgIGttcF9pbnQzMiByYzsKKyAgICBpZiAoKHJjID0gc3lzY2FsbChfX05SX2Z1dGV4LCAmKGxjay0+bGsucG9sbCksIEZVVEVYX1dBSVQsIHBvbGxfdmFsLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDApKSAhPSAwKSB7CisgICAgICBLQV9UUkFDRSgxMDAwLCAoIl9fa21wX2FjcXVpcmVfZnV0ZXhfbG9jazogbGNrOiVwLCBUIyVkIGZ1dGV4X3dhaXQoMHgleCkgIgorICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgKHJjPSVkIGVycm5vPSVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBsY2ssIGd0aWQsIHBvbGxfdmFsLCByYywgZXJybm8pKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIEtBX1RSQUNFKDEwMDAsCisgICAgICAgICAgICAgKCJfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2s6IGxjazolcCwgVCMlZCBhZnRlciBmdXRleF93YWl0KDB4JXgpXG4iLAorICAgICAgICAgICAgICBsY2ssIGd0aWQsIHBvbGxfdmFsKSk7CisgICAgLy8gVGhpcyB0aHJlYWQgaGFzIG5vdyBkb25lIGEgc3VjY2Vzc2Z1bCBmdXRleCB3YWl0IGNhbGwgYW5kIHdhcyBlbnRlcmVkIG9uCisgICAgLy8gdGhlIE9TIGZ1dGV4IHF1ZXVlLiAgV2UgbXVzdCBub3cgcGVyZm9ybSBhIGZ1dGV4IHdha2UgY2FsbCB3aGVuIHJlbGVhc2luZworICAgIC8vIHRoZSBsb2NrLCBhcyB3ZSBoYXZlIG5vIGlkZWEgaG93IG1hbnkgb3RoZXIgdGhyZWFkcyBhcmUgaW4gdGhlIHF1ZXVlLgorICAgIGd0aWRfY29kZSB8PSAxOworICB9CisKKyAgS01QX0ZTWU5DX0FDUVVJUkVEKGxjayk7CisgIEtBX1RSQUNFKDEwMDAsICgiX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrOiBsY2s6JXAoMHgleCksIFQjJWQgZXhpdGluZ1xuIiwgbGNrLAorICAgICAgICAgICAgICAgICAgbGNrLT5say5wb2xsLCBndGlkKSk7CisgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVDsKK30KKworaW50IF9fa21wX2FjcXVpcmVfZnV0ZXhfbG9jayhrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKSB7CisgIGludCByZXR2YWwgPSBfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2tfdGltZWRfdGVtcGxhdGUobGNrLCBndGlkKTsKKyAgQU5OT1RBVEVfRlVURVhfQUNRVUlSRUQobGNrKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2tfd2l0aF9jaGVja3Moa21wX2Z1dGV4X2xvY2tfdCAqbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGd0aWQpIHsKKyAgY2hhciBjb25zdCAqY29uc3QgZnVuYyA9ICJvbXBfc2V0X2xvY2siOworICBpZiAoKHNpemVvZihrbXBfZnV0ZXhfbG9ja190KSA8PSBPTVBfTE9DS19UX1NJWkUpICYmCisgICAgICBfX2ttcF9pc19mdXRleF9sb2NrX25lc3RhYmxlKGxjaykpIHsKKyAgICBLTVBfRkFUQUwoTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jKTsKKyAgfQorICBpZiAoKGd0aWQgPj0gMCkgJiYgKF9fa21wX2dldF9mdXRleF9sb2NrX293bmVyKGxjaykgPT0gZ3RpZCkpIHsKKyAgICBLTVBfRkFUQUwoTG9ja0lzQWxyZWFkeU93bmVkLCBmdW5jKTsKKyAgfQorICByZXR1cm4gX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrKGxjaywgZ3RpZCk7Cit9CisKK2ludCBfX2ttcF90ZXN0X2Z1dGV4X2xvY2soa21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCkgeworICBpZiAoS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCYobGNrLT5say5wb2xsKSwgS01QX0xPQ0tfRlJFRShmdXRleCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0xPQ0tfQlVTWSgoZ3RpZCArIDEpIDw8IDEsIGZ1dGV4KSkpIHsKKyAgICBLTVBfRlNZTkNfQUNRVUlSRUQobGNrKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBpbnQgX19rbXBfdGVzdF9mdXRleF9sb2NrX3dpdGhfY2hlY2tzKGttcF9mdXRleF9sb2NrX3QgKmxjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKSB7CisgIGNoYXIgY29uc3QgKmNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbG9jayI7CisgIGlmICgoc2l6ZW9mKGttcF9mdXRleF9sb2NrX3QpIDw9IE9NUF9MT0NLX1RfU0laRSkgJiYKKyAgICAgIF9fa21wX2lzX2Z1dGV4X2xvY2tfbmVzdGFibGUobGNrKSkgeworICAgIEtNUF9GQVRBTChMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMpOworICB9CisgIHJldHVybiBfX2ttcF90ZXN0X2Z1dGV4X2xvY2sobGNrLCBndGlkKTsKK30KKworaW50IF9fa21wX3JlbGVhc2VfZnV0ZXhfbG9jayhrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKSB7CisgIEtNUF9NQigpOyAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgIEtBX1RSQUNFKDEwMDAsICgiX19rbXBfcmVsZWFzZV9mdXRleF9sb2NrOiBsY2s6JXAoMHgleCksIFQjJWQgZW50ZXJpbmdcbiIsCisgICAgICAgICAgICAgICAgICBsY2ssIGxjay0+bGsucG9sbCwgZ3RpZCkpOworCisgIEtNUF9GU1lOQ19SRUxFQVNJTkcobGNrKTsKKyAgQU5OT1RBVEVfRlVURVhfUkVMRUFTRUQobGNrKTsKKworICBrbXBfaW50MzIgcG9sbF92YWwgPSBLTVBfWENIR19GSVhFRDMyKCYobGNrLT5say5wb2xsKSwgS01QX0xPQ0tfRlJFRShmdXRleCkpOworCisgIEtBX1RSQUNFKDEwMDAsCisgICAgICAgICAgICgiX19rbXBfcmVsZWFzZV9mdXRleF9sb2NrOiBsY2s6JXAsIFQjJWQgcmVsZWFzZWQgcG9sbF92YWwgPSAweCV4XG4iLAorICAgICAgICAgICAgbGNrLCBndGlkLCBwb2xsX3ZhbCkpOworCisgIGlmIChLTVBfTE9DS19TVFJJUChwb2xsX3ZhbCkgJiAxKSB7CisgICAgS0FfVFJBQ0UoMTAwMCwKKyAgICAgICAgICAgICAoIl9fa21wX3JlbGVhc2VfZnV0ZXhfbG9jazogbGNrOiVwLCBUIyVkIGZ1dGV4X3dha2UgMSB0aHJlYWRcbiIsCisgICAgICAgICAgICAgIGxjaywgZ3RpZCkpOworICAgIHN5c2NhbGwoX19OUl9mdXRleCwgJihsY2stPmxrLnBvbGwpLCBGVVRFWF9XQUtFLCBLTVBfTE9DS19CVVNZKDEsIGZ1dGV4KSwKKyAgICAgICAgICAgIE5VTEwsIE5VTEwsIDApOworICB9CisKKyAgS01QX01CKCk7IC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgS0FfVFJBQ0UoMTAwMCwgKCJfX2ttcF9yZWxlYXNlX2Z1dGV4X2xvY2s6IGxjazolcCgweCV4KSwgVCMlZCBleGl0aW5nXG4iLCBsY2ssCisgICAgICAgICAgICAgICAgICBsY2stPmxrLnBvbGwsIGd0aWQpKTsKKworICBLTVBfWUlFTEQoVENSXzQoX19rbXBfbnRoKSA+CisgICAgICAgICAgICAoX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOiBfX2ttcF94cHJvYykpOworICByZXR1cm4gS01QX0xPQ0tfUkVMRUFTRUQ7Cit9CisKK3N0YXRpYyBpbnQgX19rbXBfcmVsZWFzZV9mdXRleF9sb2NrX3dpdGhfY2hlY2tzKGttcF9mdXRleF9sb2NrX3QgKmxjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKSB7CisgIGNoYXIgY29uc3QgKmNvbnN0IGZ1bmMgPSAib21wX3Vuc2V0X2xvY2siOworICBLTVBfTUIoKTsgLyogaW4gY2FzZSBhbm90aGVyIHByb2Nlc3NvciBpbml0aWFsaXplZCBsb2NrICovCisgIGlmICgoc2l6ZW9mKGttcF9mdXRleF9sb2NrX3QpIDw9IE9NUF9MT0NLX1RfU0laRSkgJiYKKyAgICAgIF9fa21wX2lzX2Z1dGV4X2xvY2tfbmVzdGFibGUobGNrKSkgeworICAgIEtNUF9GQVRBTChMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMpOworICB9CisgIGlmIChfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lcihsY2spID09IC0xKSB7CisgICAgS01QX0ZBVEFMKExvY2tVbnNldHRpbmdGcmVlLCBmdW5jKTsKKyAgfQorICBpZiAoKGd0aWQgPj0gMCkgJiYgKF9fa21wX2dldF9mdXRleF9sb2NrX293bmVyKGxjaykgPj0gMCkgJiYKKyAgICAgIChfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lcihsY2spICE9IGd0aWQpKSB7CisgICAgS01QX0ZBVEFMKExvY2tVbnNldHRpbmdTZXRCeUFub3RoZXIsIGZ1bmMpOworICB9CisgIHJldHVybiBfX2ttcF9yZWxlYXNlX2Z1dGV4X2xvY2sobGNrLCBndGlkKTsKK30KKwordm9pZCBfX2ttcF9pbml0X2Z1dGV4X2xvY2soa21wX2Z1dGV4X2xvY2tfdCAqbGNrKSB7CisgIFRDV180KGxjay0+bGsucG9sbCwgS01QX0xPQ0tfRlJFRShmdXRleCkpOworfQorCitzdGF0aWMgdm9pZCBfX2ttcF9pbml0X2Z1dGV4X2xvY2tfd2l0aF9jaGVja3Moa21wX2Z1dGV4X2xvY2tfdCAqbGNrKSB7CisgIF9fa21wX2luaXRfZnV0ZXhfbG9jayhsY2spOworfQorCit2b2lkIF9fa21wX2Rlc3Ryb3lfZnV0ZXhfbG9jayhrbXBfZnV0ZXhfbG9ja190ICpsY2spIHsgbGNrLT5say5wb2xsID0gMDsgfQorCitzdGF0aWMgdm9pZCBfX2ttcF9kZXN0cm95X2Z1dGV4X2xvY2tfd2l0aF9jaGVja3Moa21wX2Z1dGV4X2xvY2tfdCAqbGNrKSB7CisgIGNoYXIgY29uc3QgKmNvbnN0IGZ1bmMgPSAib21wX2Rlc3Ryb3lfbG9jayI7CisgIGlmICgoc2l6ZW9mKGttcF9mdXRleF9sb2NrX3QpIDw9IE9NUF9MT0NLX1RfU0laRSkgJiYKKyAgICAgIF9fa21wX2lzX2Z1dGV4X2xvY2tfbmVzdGFibGUobGNrKSkgeworICAgIEtNUF9GQVRBTChMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMpOworICB9CisgIGlmIChfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lcihsY2spICE9IC0xKSB7CisgICAgS01QX0ZBVEFMKExvY2tTdGlsbE93bmVkLCBmdW5jKTsKKyAgfQorICBfX2ttcF9kZXN0cm95X2Z1dGV4X2xvY2sobGNrKTsKK30KKworLy8gbmVzdGVkIGZ1dGV4IGxvY2tzCisKK2ludCBfX2ttcF9hY3F1aXJlX25lc3RlZF9mdXRleF9sb2NrKGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpIHsKKyAgS01QX0RFQlVHX0FTU0VSVChndGlkID49IDApOworCisgIGlmIChfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lcihsY2spID09IGd0aWQpIHsKKyAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCArPSAxOworICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9ORVhUOworICB9IGVsc2UgeworICAgIF9fa21wX2FjcXVpcmVfZnV0ZXhfbG9ja190aW1lZF90ZW1wbGF0ZShsY2ssIGd0aWQpOworICAgIEFOTk9UQVRFX0ZVVEVYX0FDUVVJUkVEKGxjayk7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAxOworICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVDsKKyAgfQorfQorCitzdGF0aWMgaW50IF9fa21wX2FjcXVpcmVfbmVzdGVkX2Z1dGV4X2xvY2tfd2l0aF9jaGVja3Moa21wX2Z1dGV4X2xvY2tfdCAqbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKSB7CisgIGNoYXIgY29uc3QgKmNvbnN0IGZ1bmMgPSAib21wX3NldF9uZXN0X2xvY2siOworICBpZiAoIV9fa21wX2lzX2Z1dGV4X2xvY2tfbmVzdGFibGUobGNrKSkgeworICAgIEtNUF9GQVRBTChMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMpOworICB9CisgIHJldHVybiBfX2ttcF9hY3F1aXJlX25lc3RlZF9mdXRleF9sb2NrKGxjaywgZ3RpZCk7Cit9CisKK2ludCBfX2ttcF90ZXN0X25lc3RlZF9mdXRleF9sb2NrKGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpIHsKKyAgaW50IHJldHZhbDsKKworICBLTVBfREVCVUdfQVNTRVJUKGd0aWQgPj0gMCk7CisKKyAgaWYgKF9fa21wX2dldF9mdXRleF9sb2NrX293bmVyKGxjaykgPT0gZ3RpZCkgeworICAgIHJldHZhbCA9ICsrbGNrLT5say5kZXB0aF9sb2NrZWQ7CisgIH0gZWxzZSBpZiAoIV9fa21wX3Rlc3RfZnV0ZXhfbG9jayhsY2ssIGd0aWQpKSB7CisgICAgcmV0dmFsID0gMDsKKyAgfSBlbHNlIHsKKyAgICBLTVBfTUIoKTsKKyAgICByZXR2YWwgPSBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDE7CisgIH0KKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBfX2ttcF90ZXN0X25lc3RlZF9mdXRleF9sb2NrX3dpdGhfY2hlY2tzKGttcF9mdXRleF9sb2NrX3QgKmxjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgZ3RpZCkgeworICBjaGFyIGNvbnN0ICpjb25zdCBmdW5jID0gIm9tcF90ZXN0X25lc3RfbG9jayI7CisgIGlmICghX19rbXBfaXNfZnV0ZXhfbG9ja19uZXN0YWJsZShsY2spKSB7CisgICAgS01QX0ZBVEFMKExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyk7CisgIH0KKyAgcmV0dXJuIF9fa21wX3Rlc3RfbmVzdGVkX2Z1dGV4X2xvY2sobGNrLCBndGlkKTsKK30KKworaW50IF9fa21wX3JlbGVhc2VfbmVzdGVkX2Z1dGV4X2xvY2soa21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCkgeworICBLTVBfREVCVUdfQVNTRVJUKGd0aWQgPj0gMCk7CisKKyAgS01QX01CKCk7CisgIGlmICgtLShsY2stPmxrLmRlcHRoX2xvY2tlZCkgPT0gMCkgeworICAgIF9fa21wX3JlbGVhc2VfZnV0ZXhfbG9jayhsY2ssIGd0aWQpOworICAgIHJldHVybiBLTVBfTE9DS19SRUxFQVNFRDsKKyAgfQorICByZXR1cm4gS01QX0xPQ0tfU1RJTExfSEVMRDsKK30KKworc3RhdGljIGludCBfX2ttcF9yZWxlYXNlX25lc3RlZF9mdXRleF9sb2NrX3dpdGhfY2hlY2tzKGttcF9mdXRleF9sb2NrX3QgKmxjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgZ3RpZCkgeworICBjaGFyIGNvbnN0ICpjb25zdCBmdW5jID0gIm9tcF91bnNldF9uZXN0X2xvY2siOworICBLTVBfTUIoKTsgLyogaW4gY2FzZSBhbm90aGVyIHByb2Nlc3NvciBpbml0aWFsaXplZCBsb2NrICovCisgIGlmICghX19rbXBfaXNfZnV0ZXhfbG9ja19uZXN0YWJsZShsY2spKSB7CisgICAgS01QX0ZBVEFMKExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyk7CisgIH0KKyAgaWYgKF9fa21wX2dldF9mdXRleF9sb2NrX293bmVyKGxjaykgPT0gLTEpIHsKKyAgICBLTVBfRkFUQUwoTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMpOworICB9CisgIGlmIChfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lcihsY2spICE9IGd0aWQpIHsKKyAgICBLTVBfRkFUQUwoTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyk7CisgIH0KKyAgcmV0dXJuIF9fa21wX3JlbGVhc2VfbmVzdGVkX2Z1dGV4X2xvY2sobGNrLCBndGlkKTsKK30KKwordm9pZCBfX2ttcF9pbml0X25lc3RlZF9mdXRleF9sb2NrKGttcF9mdXRleF9sb2NrX3QgKmxjaykgeworICBfX2ttcF9pbml0X2Z1dGV4X2xvY2sobGNrKTsKKyAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAwOyAvLyA+PSAwIGZvciBuZXN0YWJsZSBsb2NrcywgLTEgZm9yIHNpbXBsZSBsb2NrcworfQorCitzdGF0aWMgdm9pZCBfX2ttcF9pbml0X25lc3RlZF9mdXRleF9sb2NrX3dpdGhfY2hlY2tzKGttcF9mdXRleF9sb2NrX3QgKmxjaykgeworICBfX2ttcF9pbml0X25lc3RlZF9mdXRleF9sb2NrKGxjayk7Cit9CisKK3ZvaWQgX19rbXBfZGVzdHJveV9uZXN0ZWRfZnV0ZXhfbG9jayhrbXBfZnV0ZXhfbG9ja190ICpsY2spIHsKKyAgX19rbXBfZGVzdHJveV9mdXRleF9sb2NrKGxjayk7CisgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMDsKK30KKworc3RhdGljIHZvaWQgX19rbXBfZGVzdHJveV9uZXN0ZWRfZnV0ZXhfbG9ja193aXRoX2NoZWNrcyhrbXBfZnV0ZXhfbG9ja190ICpsY2spIHsKKyAgY2hhciBjb25zdCAqY29uc3QgZnVuYyA9ICJvbXBfZGVzdHJveV9uZXN0X2xvY2siOworICBpZiAoIV9fa21wX2lzX2Z1dGV4X2xvY2tfbmVzdGFibGUobGNrKSkgeworICAgIEtNUF9GQVRBTChMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMpOworICB9CisgIGlmIChfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lcihsY2spICE9IC0xKSB7CisgICAgS01QX0ZBVEFMKExvY2tTdGlsbE93bmVkLCBmdW5jKTsKKyAgfQorICBfX2ttcF9kZXN0cm95X25lc3RlZF9mdXRleF9sb2NrKGxjayk7Cit9CisKKyNlbmRpZiAvLyBLTVBfVVNFX0ZVVEVYCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogdGlja2V0IChiYWtlcnkpIGxvY2tzICovCisKK3N0YXRpYyBrbXBfaW50MzIgX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKGttcF90aWNrZXRfbG9ja190ICpsY2spIHsKKyAgcmV0dXJuIHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoJmxjay0+bGsub3duZXJfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpIC0KKyAgICAgICAgIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBfX2ttcF9pc190aWNrZXRfbG9ja19uZXN0YWJsZShrbXBfdGlja2V0X2xvY2tfdCAqbGNrKSB7CisgIHJldHVybiBzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KCZsY2stPmxrLmRlcHRoX2xvY2tlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkgIT0gLTE7Cit9CisKK3N0YXRpYyBrbXBfdWludDMyIF9fa21wX2Jha2VyeV9jaGVjayh2b2lkICpub3dfc2VydmluZywga21wX3VpbnQzMiBteV90aWNrZXQpIHsKKyAgcmV0dXJuIHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoKHN0ZDo6YXRvbWljPHVuc2lnbmVkPiAqKW5vd19zZXJ2aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1lbW9yeV9vcmRlcl9hY3F1aXJlKSA9PSBteV90aWNrZXQ7Cit9CisKK19fZm9yY2VpbmxpbmUgc3RhdGljIGludAorX19rbXBfYWNxdWlyZV90aWNrZXRfbG9ja190aW1lZF90ZW1wbGF0ZShrbXBfdGlja2V0X2xvY2tfdCAqbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgZ3RpZCkgeworICBrbXBfdWludDMyIG15X3RpY2tldCA9IHN0ZDo6YXRvbWljX2ZldGNoX2FkZF9leHBsaWNpdCgKKyAgICAgICZsY2stPmxrLm5leHRfdGlja2V0LCAxVSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisKKyNpZmRlZiBVU0VfTE9DS19QUk9GSUxFCisgIGlmIChzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KCZsY2stPmxrLm5vd19zZXJ2aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKSAhPSBteV90aWNrZXQpCisgICAgX19rbXBfcHJpbnRmKCJMT0NLIENPTlRFTlRJT046ICVwXG4iLCBsY2spOworLyogZWxzZSBfX2ttcF9wcmludGYoICIuIiApOyovCisjZW5kaWYgLyogVVNFX0xPQ0tfUFJPRklMRSAqLworCisgIGlmIChzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KCZsY2stPmxrLm5vd19zZXJ2aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1lbW9yeV9vcmRlcl9hY3F1aXJlKSA9PSBteV90aWNrZXQpIHsKKyAgICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfRklSU1Q7CisgIH0KKyAgS01QX1dBSVRfWUlFTERfUFRSKCZsY2stPmxrLm5vd19zZXJ2aW5nLCBteV90aWNrZXQsIF9fa21wX2Jha2VyeV9jaGVjaywgbGNrKTsKKyAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX0ZJUlNUOworfQorCitpbnQgX19rbXBfYWNxdWlyZV90aWNrZXRfbG9jayhrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCkgeworICBpbnQgcmV0dmFsID0gX19rbXBfYWNxdWlyZV90aWNrZXRfbG9ja190aW1lZF90ZW1wbGF0ZShsY2ssIGd0aWQpOworICBBTk5PVEFURV9USUNLRVRfQUNRVUlSRUQobGNrKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBfX2ttcF9hY3F1aXJlX3RpY2tldF9sb2NrX3dpdGhfY2hlY2tzKGttcF90aWNrZXRfbG9ja190ICpsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGd0aWQpIHsKKyAgY2hhciBjb25zdCAqY29uc3QgZnVuYyA9ICJvbXBfc2V0X2xvY2siOworCisgIGlmICghc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCgmbGNrLT5say5pbml0aWFsaXplZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpKSB7CisgICAgS01QX0ZBVEFMKExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMpOworICB9CisgIGlmIChsY2stPmxrLnNlbGYgIT0gbGNrKSB7CisgICAgS01QX0ZBVEFMKExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMpOworICB9CisgIGlmIChfX2ttcF9pc190aWNrZXRfbG9ja19uZXN0YWJsZShsY2spKSB7CisgICAgS01QX0ZBVEFMKExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyk7CisgIH0KKyAgaWYgKChndGlkID49IDApICYmIChfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIobGNrKSA9PSBndGlkKSkgeworICAgIEtNUF9GQVRBTChMb2NrSXNBbHJlYWR5T3duZWQsIGZ1bmMpOworICB9CisKKyAgX19rbXBfYWNxdWlyZV90aWNrZXRfbG9jayhsY2ssIGd0aWQpOworCisgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KCZsY2stPmxrLm93bmVyX2lkLCBndGlkICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVDsKK30KKworaW50IF9fa21wX3Rlc3RfdGlja2V0X2xvY2soa21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpIHsKKyAga21wX3VpbnQzMiBteV90aWNrZXQgPSBzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KCZsY2stPmxrLm5leHRfdGlja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisKKyAgaWYgKHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoJmxjay0+bGsubm93X3NlcnZpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpID09IG15X3RpY2tldCkgeworICAgIGttcF91aW50MzIgbmV4dF90aWNrZXQgPSBteV90aWNrZXQgKyAxOworICAgIGlmIChzdGQ6OmF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZ19leHBsaWNpdCgKKyAgICAgICAgICAgICZsY2stPmxrLm5leHRfdGlja2V0LCAmbXlfdGlja2V0LCBuZXh0X3RpY2tldCwKKyAgICAgICAgICAgIHN0ZDo6bWVtb3J5X29yZGVyX2FjcXVpcmUsIHN0ZDo6bWVtb3J5X29yZGVyX2FjcXVpcmUpKSB7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW50IF9fa21wX3Rlc3RfdGlja2V0X2xvY2tfd2l0aF9jaGVja3Moa21wX3RpY2tldF9sb2NrX3QgKmxjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgZ3RpZCkgeworICBjaGFyIGNvbnN0ICpjb25zdCBmdW5jID0gIm9tcF90ZXN0X2xvY2siOworCisgIGlmICghc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCgmbGNrLT5say5pbml0aWFsaXplZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpKSB7CisgICAgS01QX0ZBVEFMKExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMpOworICB9CisgIGlmIChsY2stPmxrLnNlbGYgIT0gbGNrKSB7CisgICAgS01QX0ZBVEFMKExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMpOworICB9CisgIGlmIChfX2ttcF9pc190aWNrZXRfbG9ja19uZXN0YWJsZShsY2spKSB7CisgICAgS01QX0ZBVEFMKExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyk7CisgIH0KKworICBpbnQgcmV0dmFsID0gX19rbXBfdGVzdF90aWNrZXRfbG9jayhsY2ssIGd0aWQpOworCisgIGlmIChyZXR2YWwpIHsKKyAgICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCgmbGNrLT5say5vd25lcl9pZCwgZ3RpZCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgIH0KKyAgcmV0dXJuIHJldHZhbDsKK30KKworaW50IF9fa21wX3JlbGVhc2VfdGlja2V0X2xvY2soa21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpIHsKKyAga21wX3VpbnQzMiBkaXN0YW5jZSA9IHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoJmxjay0+bGsubmV4dF90aWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoJmxjay0+bGsubm93X3NlcnZpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworCisgIEFOTk9UQVRFX1RJQ0tFVF9SRUxFQVNFRChsY2spOworICBzdGQ6OmF0b21pY19mZXRjaF9hZGRfZXhwbGljaXQoJmxjay0+bGsubm93X3NlcnZpbmcsIDFVLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptZW1vcnlfb3JkZXJfcmVsZWFzZSk7CisKKyAgS01QX1lJRUxEKGRpc3RhbmNlID4KKyAgICAgICAgICAgIChrbXBfdWludDMyKShfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6IF9fa21wX3hwcm9jKSk7CisgIHJldHVybiBLTVBfTE9DS19SRUxFQVNFRDsKK30KKworc3RhdGljIGludCBfX2ttcF9yZWxlYXNlX3RpY2tldF9sb2NrX3dpdGhfY2hlY2tzKGttcF90aWNrZXRfbG9ja190ICpsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGd0aWQpIHsKKyAgY2hhciBjb25zdCAqY29uc3QgZnVuYyA9ICJvbXBfdW5zZXRfbG9jayI7CisKKyAgaWYgKCFzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KCZsY2stPmxrLmluaXRpYWxpemVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkpIHsKKyAgICBLTVBfRkFUQUwoTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyk7CisgIH0KKyAgaWYgKGxjay0+bGsuc2VsZiAhPSBsY2spIHsKKyAgICBLTVBfRkFUQUwoTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyk7CisgIH0KKyAgaWYgKF9fa21wX2lzX3RpY2tldF9sb2NrX25lc3RhYmxlKGxjaykpIHsKKyAgICBLTVBfRkFUQUwoTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jKTsKKyAgfQorICBpZiAoX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKGxjaykgPT0gLTEpIHsKKyAgICBLTVBfRkFUQUwoTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMpOworICB9CisgIGlmICgoZ3RpZCA+PSAwKSAmJiAoX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKGxjaykgPj0gMCkgJiYKKyAgICAgIChfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIobGNrKSAhPSBndGlkKSkgeworICAgIEtNUF9GQVRBTChMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyLCBmdW5jKTsKKyAgfQorICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCgmbGNrLT5say5vd25lcl9pZCwgMCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgIHJldHVybiBfX2ttcF9yZWxlYXNlX3RpY2tldF9sb2NrKGxjaywgZ3RpZCk7Cit9CisKK3ZvaWQgX19rbXBfaW5pdF90aWNrZXRfbG9jayhrbXBfdGlja2V0X2xvY2tfdCAqbGNrKSB7CisgIGxjay0+bGsubG9jYXRpb24gPSBOVUxMOworICBsY2stPmxrLnNlbGYgPSBsY2s7CisgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KCZsY2stPmxrLm5leHRfdGlja2V0LCAwVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KCZsY2stPmxrLm5vd19zZXJ2aW5nLCAwVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAorICAgICAgJmxjay0+bGsub3duZXJfaWQsIDAsCisgICAgICBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsgLy8gbm8gdGhyZWFkIG93bnMgdGhlIGxvY2suCisgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAorICAgICAgJmxjay0+bGsuZGVwdGhfbG9ja2VkLCAtMSwKKyAgICAgIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOyAvLyAtMSA9PiBub3QgYSBuZXN0ZWQgbG9jay4KKyAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoJmxjay0+bGsuaW5pdGlhbGl6ZWQsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UpOworfQorCitzdGF0aWMgdm9pZCBfX2ttcF9pbml0X3RpY2tldF9sb2NrX3dpdGhfY2hlY2tzKGttcF90aWNrZXRfbG9ja190ICpsY2spIHsKKyAgX19rbXBfaW5pdF90aWNrZXRfbG9jayhsY2spOworfQorCit2b2lkIF9fa21wX2Rlc3Ryb3lfdGlja2V0X2xvY2soa21wX3RpY2tldF9sb2NrX3QgKmxjaykgeworICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCgmbGNrLT5say5pbml0aWFsaXplZCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UpOworICBsY2stPmxrLnNlbGYgPSBOVUxMOworICBsY2stPmxrLmxvY2F0aW9uID0gTlVMTDsKKyAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoJmxjay0+bGsubmV4dF90aWNrZXQsIDBVLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoJmxjay0+bGsubm93X3NlcnZpbmcsIDBVLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoJmxjay0+bGsub3duZXJfaWQsIDAsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCgmbGNrLT5say5kZXB0aF9sb2NrZWQsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKK30KKworc3RhdGljIHZvaWQgX19rbXBfZGVzdHJveV90aWNrZXRfbG9ja193aXRoX2NoZWNrcyhrbXBfdGlja2V0X2xvY2tfdCAqbGNrKSB7CisgIGNoYXIgY29uc3QgKmNvbnN0IGZ1bmMgPSAib21wX2Rlc3Ryb3lfbG9jayI7CisKKyAgaWYgKCFzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KCZsY2stPmxrLmluaXRpYWxpemVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkpIHsKKyAgICBLTVBfRkFUQUwoTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyk7CisgIH0KKyAgaWYgKGxjay0+bGsuc2VsZiAhPSBsY2spIHsKKyAgICBLTVBfRkFUQUwoTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyk7CisgIH0KKyAgaWYgKF9fa21wX2lzX3RpY2tldF9sb2NrX25lc3RhYmxlKGxjaykpIHsKKyAgICBLTVBfRkFUQUwoTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jKTsKKyAgfQorICBpZiAoX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKGxjaykgIT0gLTEpIHsKKyAgICBLTVBfRkFUQUwoTG9ja1N0aWxsT3duZWQsIGZ1bmMpOworICB9CisgIF9fa21wX2Rlc3Ryb3lfdGlja2V0X2xvY2sobGNrKTsKK30KKworLy8gbmVzdGVkIHRpY2tldCBsb2NrcworCitpbnQgX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGlja2V0X2xvY2soa21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpIHsKKyAgS01QX0RFQlVHX0FTU0VSVChndGlkID49IDApOworCisgIGlmIChfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIobGNrKSA9PSBndGlkKSB7CisgICAgc3RkOjphdG9taWNfZmV0Y2hfYWRkX2V4cGxpY2l0KCZsY2stPmxrLmRlcHRoX2xvY2tlZCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX05FWFQ7CisgIH0gZWxzZSB7CisgICAgX19rbXBfYWNxdWlyZV90aWNrZXRfbG9ja190aW1lZF90ZW1wbGF0ZShsY2ssIGd0aWQpOworICAgIEFOTk9UQVRFX1RJQ0tFVF9BQ1FVSVJFRChsY2spOworICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KCZsY2stPmxrLmRlcHRoX2xvY2tlZCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCgmbGNrLT5say5vd25lcl9pZCwgZ3RpZCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX0ZJUlNUOworICB9Cit9CisKK3N0YXRpYyBpbnQgX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGlja2V0X2xvY2tfd2l0aF9jaGVja3Moa21wX3RpY2tldF9sb2NrX3QgKmxjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGd0aWQpIHsKKyAgY2hhciBjb25zdCAqY29uc3QgZnVuYyA9ICJvbXBfc2V0X25lc3RfbG9jayI7CisKKyAgaWYgKCFzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KCZsY2stPmxrLmluaXRpYWxpemVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkpIHsKKyAgICBLTVBfRkFUQUwoTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyk7CisgIH0KKyAgaWYgKGxjay0+bGsuc2VsZiAhPSBsY2spIHsKKyAgICBLTVBfRkFUQUwoTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyk7CisgIH0KKyAgaWYgKCFfX2ttcF9pc190aWNrZXRfbG9ja19uZXN0YWJsZShsY2spKSB7CisgICAgS01QX0ZBVEFMKExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyk7CisgIH0KKyAgcmV0dXJuIF9fa21wX2FjcXVpcmVfbmVzdGVkX3RpY2tldF9sb2NrKGxjaywgZ3RpZCk7Cit9CisKK2ludCBfX2ttcF90ZXN0X25lc3RlZF90aWNrZXRfbG9jayhrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCkgeworICBpbnQgcmV0dmFsOworCisgIEtNUF9ERUJVR19BU1NFUlQoZ3RpZCA+PSAwKTsKKworICBpZiAoX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKGxjaykgPT0gZ3RpZCkgeworICAgIHJldHZhbCA9IHN0ZDo6YXRvbWljX2ZldGNoX2FkZF9leHBsaWNpdCgmbGNrLT5say5kZXB0aF9sb2NrZWQsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpICsKKyAgICAgICAgICAgICAxOworICB9IGVsc2UgaWYgKCFfX2ttcF90ZXN0X3RpY2tldF9sb2NrKGxjaywgZ3RpZCkpIHsKKyAgICByZXR2YWwgPSAwOworICB9IGVsc2UgeworICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KCZsY2stPmxrLmRlcHRoX2xvY2tlZCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCgmbGNrLT5say5vd25lcl9pZCwgZ3RpZCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgcmV0dmFsID0gMTsKKyAgfQorICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IF9fa21wX3Rlc3RfbmVzdGVkX3RpY2tldF9sb2NrX3dpdGhfY2hlY2tzKGttcF90aWNrZXRfbG9ja190ICpsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKSB7CisgIGNoYXIgY29uc3QgKmNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbmVzdF9sb2NrIjsKKworICBpZiAoIXN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoJmxjay0+bGsuaW5pdGlhbGl6ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKSkgeworICAgIEtNUF9GQVRBTChMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jKTsKKyAgfQorICBpZiAobGNrLT5say5zZWxmICE9IGxjaykgeworICAgIEtNUF9GQVRBTChMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jKTsKKyAgfQorICBpZiAoIV9fa21wX2lzX3RpY2tldF9sb2NrX25lc3RhYmxlKGxjaykpIHsKKyAgICBLTVBfRkFUQUwoTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jKTsKKyAgfQorICByZXR1cm4gX19rbXBfdGVzdF9uZXN0ZWRfdGlja2V0X2xvY2sobGNrLCBndGlkKTsKK30KKworaW50IF9fa21wX3JlbGVhc2VfbmVzdGVkX3RpY2tldF9sb2NrKGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKSB7CisgIEtNUF9ERUJVR19BU1NFUlQoZ3RpZCA+PSAwKTsKKworICBpZiAoKHN0ZDo6YXRvbWljX2ZldGNoX2FkZF9leHBsaWNpdCgmbGNrLT5say5kZXB0aF9sb2NrZWQsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKSAtCisgICAgICAgMSkgPT0gMCkgeworICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KCZsY2stPmxrLm93bmVyX2lkLCAwLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICBfX2ttcF9yZWxlYXNlX3RpY2tldF9sb2NrKGxjaywgZ3RpZCk7CisgICAgcmV0dXJuIEtNUF9MT0NLX1JFTEVBU0VEOworICB9CisgIHJldHVybiBLTVBfTE9DS19TVElMTF9IRUxEOworfQorCitzdGF0aWMgaW50IF9fa21wX3JlbGVhc2VfbmVzdGVkX3RpY2tldF9sb2NrX3dpdGhfY2hlY2tzKGttcF90aWNrZXRfbG9ja190ICpsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKSB7CisgIGNoYXIgY29uc3QgKmNvbnN0IGZ1bmMgPSAib21wX3Vuc2V0X25lc3RfbG9jayI7CisKKyAgaWYgKCFzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KCZsY2stPmxrLmluaXRpYWxpemVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkpIHsKKyAgICBLTVBfRkFUQUwoTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyk7CisgIH0KKyAgaWYgKGxjay0+bGsuc2VsZiAhPSBsY2spIHsKKyAgICBLTVBfRkFUQUwoTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyk7CisgIH0KKyAgaWYgKCFfX2ttcF9pc190aWNrZXRfbG9ja19uZXN0YWJsZShsY2spKSB7CisgICAgS01QX0ZBVEFMKExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyk7CisgIH0KKyAgaWYgKF9fa21wX2dldF90aWNrZXRfbG9ja19vd25lcihsY2spID09IC0xKSB7CisgICAgS01QX0ZBVEFMKExvY2tVbnNldHRpbmdGcmVlLCBmdW5jKTsKKyAgfQorICBpZiAoX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKGxjaykgIT0gZ3RpZCkgeworICAgIEtNUF9GQVRBTChMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyLCBmdW5jKTsKKyAgfQorICByZXR1cm4gX19rbXBfcmVsZWFzZV9uZXN0ZWRfdGlja2V0X2xvY2sobGNrLCBndGlkKTsKK30KKwordm9pZCBfX2ttcF9pbml0X25lc3RlZF90aWNrZXRfbG9jayhrbXBfdGlja2V0X2xvY2tfdCAqbGNrKSB7CisgIF9fa21wX2luaXRfdGlja2V0X2xvY2sobGNrKTsKKyAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoJmxjay0+bGsuZGVwdGhfbG9ja2VkLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgLy8gPj0gMCBmb3IgbmVzdGFibGUgbG9ja3MsIC0xIGZvciBzaW1wbGUgbG9ja3MKK30KKworc3RhdGljIHZvaWQgX19rbXBfaW5pdF9uZXN0ZWRfdGlja2V0X2xvY2tfd2l0aF9jaGVja3Moa21wX3RpY2tldF9sb2NrX3QgKmxjaykgeworICBfX2ttcF9pbml0X25lc3RlZF90aWNrZXRfbG9jayhsY2spOworfQorCit2b2lkIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3RpY2tldF9sb2NrKGttcF90aWNrZXRfbG9ja190ICpsY2spIHsKKyAgX19rbXBfZGVzdHJveV90aWNrZXRfbG9jayhsY2spOworICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCgmbGNrLT5say5kZXB0aF9sb2NrZWQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9uZXN0ZWRfdGlja2V0X2xvY2tfd2l0aF9jaGVja3Moa21wX3RpY2tldF9sb2NrX3QgKmxjaykgeworICBjaGFyIGNvbnN0ICpjb25zdCBmdW5jID0gIm9tcF9kZXN0cm95X25lc3RfbG9jayI7CisKKyAgaWYgKCFzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KCZsY2stPmxrLmluaXRpYWxpemVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkpIHsKKyAgICBLTVBfRkFUQUwoTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyk7CisgIH0KKyAgaWYgKGxjay0+bGsuc2VsZiAhPSBsY2spIHsKKyAgICBLTVBfRkFUQUwoTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyk7CisgIH0KKyAgaWYgKCFfX2ttcF9pc190aWNrZXRfbG9ja19uZXN0YWJsZShsY2spKSB7CisgICAgS01QX0ZBVEFMKExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyk7CisgIH0KKyAgaWYgKF9fa21wX2dldF90aWNrZXRfbG9ja19vd25lcihsY2spICE9IC0xKSB7CisgICAgS01QX0ZBVEFMKExvY2tTdGlsbE93bmVkLCBmdW5jKTsKKyAgfQorICBfX2ttcF9kZXN0cm95X25lc3RlZF90aWNrZXRfbG9jayhsY2spOworfQorCisvLyBhY2Nlc3MgZnVuY3Rpb25zIHRvIGZpZWxkcyB3aGljaCBkb24ndCBleGlzdCBmb3IgYWxsIGxvY2sga2luZHMuCisKK3N0YXRpYyBpbnQgX19rbXBfaXNfdGlja2V0X2xvY2tfaW5pdGlhbGl6ZWQoa21wX3RpY2tldF9sb2NrX3QgKmxjaykgeworICByZXR1cm4gc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCgmbGNrLT5say5pbml0aWFsaXplZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkgJiYKKyAgICAgICAgIChsY2stPmxrLnNlbGYgPT0gbGNrKTsKK30KKworc3RhdGljIGNvbnN0IGlkZW50X3QgKl9fa21wX2dldF90aWNrZXRfbG9ja19sb2NhdGlvbihrbXBfdGlja2V0X2xvY2tfdCAqbGNrKSB7CisgIHJldHVybiBsY2stPmxrLmxvY2F0aW9uOworfQorCitzdGF0aWMgdm9pZCBfX2ttcF9zZXRfdGlja2V0X2xvY2tfbG9jYXRpb24oa21wX3RpY2tldF9sb2NrX3QgKmxjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpZGVudF90ICpsb2MpIHsKKyAgbGNrLT5say5sb2NhdGlvbiA9IGxvYzsKK30KKworc3RhdGljIGttcF9sb2NrX2ZsYWdzX3QgX19rbXBfZ2V0X3RpY2tldF9sb2NrX2ZsYWdzKGttcF90aWNrZXRfbG9ja190ICpsY2spIHsKKyAgcmV0dXJuIGxjay0+bGsuZmxhZ3M7Cit9CisKK3N0YXRpYyB2b2lkIF9fa21wX3NldF90aWNrZXRfbG9ja19mbGFncyhrbXBfdGlja2V0X2xvY2tfdCAqbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9sb2NrX2ZsYWdzX3QgZmxhZ3MpIHsKKyAgbGNrLT5say5mbGFncyA9IGZsYWdzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIHF1ZXVpbmcgbG9ja3MgKi8KKworLyogRmlyc3QgdGhlIHN0YXRlcworICAgKGhlYWQsdGFpbCkgPSAgICAgICAgICAgICAgMCwgMCAgbWVhbnMgbG9jayBpcyB1bmhlbGQsIG5vYm9keSBvbiBxdWV1ZQorICAgICAgICAgICAgICAgICBVSU5UX01BWCBvciAtMSwgMCAgbWVhbnMgbG9jayBpcyBoZWxkLCBub2JvZHkgb24gcXVldWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgsIGggIG1lYW5zIGxvY2sgaGVsZCBvciBhYm91dCB0byB0cmFuc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSBlbGVtZW50IG9uIHF1ZXVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLCB0ICBoIDw+IHQsIG1lYW5zIGxvY2sgaXMgaGVsZCBvciBhYm91dCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbiwgPjEgZWxlbWVudHMgb24gcXVldWUKKworICAgTm93IHRoZSB0cmFuc2l0aW9ucworICAgICAgQWNxdWlyZSgwLDApICA9IC0xICwwCisgICAgICBSZWxlYXNlKDAsMCkgID0gRXJyb3IKKyAgICAgIEFjcXVpcmUoLTEsMCkgPSAgaCAsaCAgICBoID4gMAorICAgICAgUmVsZWFzZSgtMSwwKSA9ICAwICwwCisgICAgICBBY3F1aXJlKGgsaCkgID0gIGggLHQgICAgaCA+IDAsIHQgPiAwLCBoIDw+IHQKKyAgICAgIFJlbGVhc2UoaCxoKSAgPSAtMSAsMCAgICBoID4gMAorICAgICAgQWNxdWlyZShoLHQpICA9ICBoICx0JyAgIGggPiAwLCB0ID4gMCwgdCcgPiAwLCBoIDw+IHQsIGggPD4gdCcsIHQgPD4gdCcKKyAgICAgIFJlbGVhc2UoaCx0KSAgPSAgaCcsdCAgICBoID4gMCwgdCA+IDAsIGggPD4gdCwgaCA8PiBoJywgaCcgbWF5YmUgPSB0CisKKyAgIEFuZCBwaWN0b3JpYWxseQorCisgICAgICAgICAgICstLS0tLSsKKyAgICAgICAgICAgfCAwLCAwfC0tLS0tLS0gcmVsZWFzZSAtLS0tLS0tPiBFcnJvcgorICAgICAgICAgICArLS0tLS0rCisgICAgICAgICAgICAgfCAgXgorICAgICAgYWNxdWlyZXwgIHxyZWxlYXNlCisgICAgICAgICAgICAgfCAgfAorICAgICAgICAgICAgIHwgIHwKKyAgICAgICAgICAgICB2ICB8CisgICAgICAgICAgICstLS0tLSsKKyAgICAgICAgICAgfC0xLCAwfAorICAgICAgICAgICArLS0tLS0rCisgICAgICAgICAgICAgfCAgXgorICAgICAgYWNxdWlyZXwgIHxyZWxlYXNlCisgICAgICAgICAgICAgfCAgfAorICAgICAgICAgICAgIHwgIHwKKyAgICAgICAgICAgICB2ICB8CisgICAgICAgICAgICstLS0tLSsKKyAgICAgICAgICAgfCBoLCBofAorICAgICAgICAgICArLS0tLS0rCisgICAgICAgICAgICAgfCAgXgorICAgICAgYWNxdWlyZXwgIHxyZWxlYXNlCisgICAgICAgICAgICAgfCAgfAorICAgICAgICAgICAgIHwgIHwKKyAgICAgICAgICAgICB2ICB8CisgICAgICAgICAgICstLS0tLSsKKyAgICAgICAgICAgfCBoLCB0fC0tLS0tIGFjcXVpcmUsIHJlbGVhc2UgbG9vcGJhY2sgLS0tKworICAgICAgICAgICArLS0tLS0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKi8KKworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKworLyogU3R1ZmYgZm9yIGNpcmN1bGFyIHRyYWNlIGJ1ZmZlciAqLworI2RlZmluZSBUUkFDRV9CVUZfRUxFIDEwMjQKK3N0YXRpYyBjaGFyIHRyYWNlc1tUUkFDRV9CVUZfRUxFXVsxMjhdID0gezB9Oworc3RhdGljIGludCB0YyA9IDA7CisjZGVmaW5lIFRSQUNFX0xPQ0soWCwgWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBLTVBfU05QUklOVEYodHJhY2VzW3RjKysgJSBUUkFDRV9CVUZfRUxFXSwgMTI4LCAidCVkIGF0ICVzXG4iLCBYLCBZKTsKKyNkZWZpbmUgVFJBQ0VfTE9DS19UKFgsIFksIFopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEtNUF9TTlBSSU5URih0cmFjZXNbdGMrKyAlIFRSQUNFX0JVRl9FTEVdLCAxMjgsICJ0JWQgYXQgJXMlZFxuIiwgWCwgWSwgWik7CisjZGVmaW5lIFRSQUNFX0xPQ0tfSFQoWCwgWSwgWiwgUSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBLTVBfU05QUklOVEYodHJhY2VzW3RjKysgJSBUUkFDRV9CVUZfRUxFXSwgMTI4LCAidCVkIGF0ICVzICVkLCVkXG4iLCBYLCBZLCAgIFwKKyAgICAgICAgICAgICAgIFosIFEpOworCitzdGF0aWMgdm9pZCBfX2ttcF9kdW1wX3F1ZXVpbmdfbG9jayhrbXBfaW5mb190ICp0aGlzX3Rociwga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGhlYWRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgdGFpbF9pZCkgeworICBrbXBfaW50MzIgdCwgaTsKKworICBfX2ttcF9wcmludGZfbm9fbG9jaygiXG5fX2ttcF9kdW1wX3F1ZXVpbmdfbG9jazogVFJBQ0UgQkVHSU5TIEhFUkUhIFxuIik7CisKKyAgaSA9IHRjICUgVFJBQ0VfQlVGX0VMRTsKKyAgX19rbXBfcHJpbnRmX25vX2xvY2soIiVzXG4iLCB0cmFjZXNbaV0pOworICBpID0gKGkgKyAxKSAlIFRSQUNFX0JVRl9FTEU7CisgIHdoaWxlIChpICE9ICh0YyAlIFRSQUNFX0JVRl9FTEUpKSB7CisgICAgX19rbXBfcHJpbnRmX25vX2xvY2soIiVzIiwgdHJhY2VzW2ldKTsKKyAgICBpID0gKGkgKyAxKSAlIFRSQUNFX0JVRl9FTEU7CisgIH0KKyAgX19rbXBfcHJpbnRmX25vX2xvY2soIlxuIik7CisKKyAgX19rbXBfcHJpbnRmX25vX2xvY2soIlxuX19rbXBfZHVtcF9xdWV1aW5nX2xvY2s6IGd0aWQrMTolZCwgc3Bpbl9oZXJlOiVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICJuZXh0X3dhaXQ6JWQsIGhlYWRfaWQ6JWQsIHRhaWxfaWQ6JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGd0aWQgKyAxLCB0aGlzX3Roci0+dGgudGhfc3Bpbl9oZXJlLAorICAgICAgICAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfbmV4dF93YWl0aW5nLCBoZWFkX2lkLCB0YWlsX2lkKTsKKworICBfX2ttcF9wcmludGZfbm9fbG9jaygiXHRcdGhlYWQ6ICVkICIsIGxjay0+bGsuaGVhZF9pZCk7CisKKyAgaWYgKGxjay0+bGsuaGVhZF9pZCA+PSAxKSB7CisgICAgdCA9IF9fa21wX3RocmVhZHNbbGNrLT5say5oZWFkX2lkIC0gMV0tPnRoLnRoX25leHRfd2FpdGluZzsKKyAgICB3aGlsZSAodCA+IDApIHsKKyAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCItPiAlZCAiLCB0KTsKKyAgICAgIHQgPSBfX2ttcF90aHJlYWRzW3QgLSAxXS0+dGgudGhfbmV4dF93YWl0aW5nOworICAgIH0KKyAgfQorICBfX2ttcF9wcmludGZfbm9fbG9jaygiOyAgdGFpbDogJWQgIiwgbGNrLT5say50YWlsX2lkKTsKKyAgX19rbXBfcHJpbnRmX25vX2xvY2soIlxuXG4iKTsKK30KKworI2VuZGlmIC8qIERFQlVHX1FVRVVJTkdfTE9DS1MgKi8KKworc3RhdGljIGttcF9pbnQzMiBfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrKSB7CisgIHJldHVybiBUQ1JfNChsY2stPmxrLm93bmVyX2lkKSAtIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBfX2ttcF9pc19xdWV1aW5nX2xvY2tfbmVzdGFibGUoa21wX3F1ZXVpbmdfbG9ja190ICpsY2spIHsKKyAgcmV0dXJuIGxjay0+bGsuZGVwdGhfbG9ja2VkICE9IC0xOworfQorCisvKiBBY3F1aXJlIGEgbG9jayB1c2luZyBhIHRoZSBxdWV1aW5nIGxvY2sgaW1wbGVtZW50YXRpb24gKi8KK3RlbXBsYXRlIDxib29sIHRha2VUaW1lPgorLyogW1RMV10gVGhlIHVudXNlZCB0ZW1wbGF0ZSBhYm92ZSBpcyBsZWZ0IGJlaGluZCBiZWNhdXNlIG9mIHdoYXQgQkVCIGJlbGlldmVzCisgICBpcyBhIHBvdGVudGlhbCBjb21waWxlciBwcm9ibGVtIHdpdGggX19mb3JjZWlubGluZS4gKi8KK19fZm9yY2VpbmxpbmUgc3RhdGljIGludAorX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2tfdGltZWRfdGVtcGxhdGUoa21wX3F1ZXVpbmdfbG9ja190ICpsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgZ3RpZCkgeworICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoZ3RpZCk7CisgIHZvbGF0aWxlIGttcF9pbnQzMiAqaGVhZF9pZF9wID0gJmxjay0+bGsuaGVhZF9pZDsKKyAgdm9sYXRpbGUga21wX2ludDMyICp0YWlsX2lkX3AgPSAmbGNrLT5say50YWlsX2lkOworICB2b2xhdGlsZSBrbXBfdWludDMyICpzcGluX2hlcmVfcDsKKyAga21wX2ludDMyIG5lZWRfbWYgPSAxOworCisjaWYgT01QVF9TVVBQT1JUCisgIG9tcHRfc3RhdGVfdCBwcmV2X3N0YXRlID0gb21wdF9zdGF0ZV91bmRlZmluZWQ7CisjZW5kaWYKKworICBLQV9UUkFDRSgxMDAwLAorICAgICAgICAgICAoIl9fa21wX2FjcXVpcmVfcXVldWluZ19sb2NrOiBsY2s6JXAsIFQjJWQgZW50ZXJpbmdcbiIsIGxjaywgZ3RpZCkpOworCisgIEtNUF9GU1lOQ19QUkVQQVJFKGxjayk7CisgIEtNUF9ERUJVR19BU1NFUlQodGhpc190aHIgIT0gTlVMTCk7CisgIHNwaW5faGVyZV9wID0gJnRoaXNfdGhyLT50aC50aF9zcGluX2hlcmU7CisKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgIFRSQUNFX0xPQ0soZ3RpZCArIDEsICJhY3EgZW50Iik7CisgIGlmICgqc3Bpbl9oZXJlX3ApCisgICAgX19rbXBfZHVtcF9xdWV1aW5nX2xvY2sodGhpc190aHIsIGd0aWQsIGxjaywgKmhlYWRfaWRfcCwgKnRhaWxfaWRfcCk7CisgIGlmICh0aGlzX3Roci0+dGgudGhfbmV4dF93YWl0aW5nICE9IDApCisgICAgX19rbXBfZHVtcF9xdWV1aW5nX2xvY2sodGhpc190aHIsIGd0aWQsIGxjaywgKmhlYWRfaWRfcCwgKnRhaWxfaWRfcCk7CisjZW5kaWYKKyAgS01QX0RFQlVHX0FTU0VSVCghKnNwaW5faGVyZV9wKTsKKyAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3Roci0+dGgudGhfbmV4dF93YWl0aW5nID09IDApOworCisgIC8qIFRoZSBmb2xsb3dpbmcgc3QucmVsIHRvIHNwaW5faGVyZV9wIG5lZWRzIHRvIHByZWNlZGUgdGhlIGNtcHhjaGcuYWNxIHRvCisgICAgIGhlYWRfaWRfcCB0aGF0IG1heSBmb2xsb3csIG5vdCBqdXN0IGluIGV4ZWN1dGlvbiBvcmRlciwgYnV0IGFsc28gaW4KKyAgICAgdmlzaWJpbGl0eSBvcmRlci4gVGhpcyB3YXksIHdoZW4gYSByZWxlYXNpbmcgdGhyZWFkIG9ic2VydmVzIHRoZSBjaGFuZ2VzIHRvCisgICAgIHRoZSBxdWV1ZSBieSB0aGlzIHRocmVhZCwgaXQgY2FuIHJpZ2h0bHkgYXNzdW1lIHRoYXQgc3Bpbl9oZXJlX3AgaGFzCisgICAgIGFscmVhZHkgYmVlbiBzZXQgdG8gVFJVRSwgc28gdGhhdCB3aGVuIGl0IHNldHMgc3Bpbl9oZXJlX3AgdG8gRkFMU0UsIGl0IGlzCisgICAgIG5vdCBwcmVtYXR1cmUuICBJZiB0aGUgcmVsZWFzaW5nIHRocmVhZCBzZXRzIHNwaW5faGVyZV9wIHRvIEZBTFNFIGJlZm9yZQorICAgICB0aGlzIHRocmVhZCBzZXRzIGl0IHRvIFRSVUUsIHRoaXMgdGhyZWFkIHdpbGwgaGFuZy4gKi8KKyAgKnNwaW5faGVyZV9wID0gVFJVRTsgLyogYmVmb3JlIGVucXVldWluZyB0byBwcmV2ZW50IHJhY2UgKi8KKworICB3aGlsZSAoMSkgeworICAgIGttcF9pbnQzMiBlbnF1ZXVlZDsKKyAgICBrbXBfaW50MzIgaGVhZDsKKyAgICBrbXBfaW50MzIgdGFpbDsKKworICAgIGhlYWQgPSAqaGVhZF9pZF9wOworCisgICAgc3dpdGNoIChoZWFkKSB7CisKKyAgICBjYXNlIC0xOiB7CisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgdGFpbCA9ICp0YWlsX2lkX3A7CisgICAgICBUUkFDRV9MT0NLX0hUKGd0aWQgKyAxLCAiYWNxIHJlYWQ6ICIsIGhlYWQsIHRhaWwpOworI2VuZGlmCisgICAgICB0YWlsID0gMDsgLyogdG8gbWFrZSBzdXJlIG5leHQgbGluayBhc3luY2hyb25vdXNseSByZWFkIGlzIG5vdCBzZXQKKyAgICAgICAgICAgICAgICBhY2NpZGVudGFsbHk7IHRoaXMgYXNzaWdubWVudCBwcmV2ZW50cyB1cyBmcm9tIGVudGVyaW5nIHRoZQorICAgICAgICAgICAgICAgIGlmICggdCA+IDAgKSBjb25kaXRpb24gaW4gdGhlIGVucXVldWVkIGNhc2UgYmVsb3csIHdoaWNoIGlzIG5vdAorICAgICAgICAgICAgICAgIG5lY2Vzc2FyeSBmb3IgdGhpcyBzdGF0ZSB0cmFuc2l0aW9uICovCisKKyAgICAgIG5lZWRfbWYgPSAwOworICAgICAgLyogdHJ5ICgtMSwwKS0+KHRpZCx0aWQpICovCisgICAgICBlbnF1ZXVlZCA9IEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E2NCgodm9sYXRpbGUga21wX2ludDY0ICopdGFpbF9pZF9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX1BBQ0tfNjQoLTEsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX1BBQ0tfNjQoZ3RpZCArIDEsIGd0aWQgKyAxKSk7CisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgaWYgKGVucXVldWVkKQorICAgICAgICBUUkFDRV9MT0NLKGd0aWQgKyAxLCAiYWNxIGVucTogKC0xLDApLT4odGlkLHRpZCkiKTsKKyNlbmRpZgorICAgIH0gYnJlYWs7CisKKyAgICBkZWZhdWx0OiB7CisgICAgICB0YWlsID0gKnRhaWxfaWRfcDsKKyAgICAgIEtNUF9ERUJVR19BU1NFUlQodGFpbCAhPSBndGlkICsgMSk7CisKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICBUUkFDRV9MT0NLX0hUKGd0aWQgKyAxLCAiYWNxIHJlYWQ6ICIsIGhlYWQsIHRhaWwpOworI2VuZGlmCisKKyAgICAgIGlmICh0YWlsID09IDApIHsKKyAgICAgICAgZW5xdWV1ZWQgPSBGQUxTRTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5lZWRfbWYgPSAwOworICAgICAgICAvKiB0cnkgKGgsdCkgb3IgKGgsaCktPihoLHRpZCkgKi8KKyAgICAgICAgZW5xdWV1ZWQgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIodGFpbF9pZF9wLCB0YWlsLCBndGlkICsgMSk7CisKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgIGlmIChlbnF1ZXVlZCkKKyAgICAgICAgICBUUkFDRV9MT0NLKGd0aWQgKyAxLCAiYWNxIGVucTogKGgsdCktPihoLHRpZCkiKTsKKyNlbmRpZgorICAgICAgfQorICAgIH0gYnJlYWs7CisKKyAgICBjYXNlIDA6IC8qIGVtcHR5IHF1ZXVlICovCisgICAgeworICAgICAga21wX2ludDMyIGdyYWJiZWRfbG9jazsKKworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgIHRhaWwgPSAqdGFpbF9pZF9wOworICAgICAgVFJBQ0VfTE9DS19IVChndGlkICsgMSwgImFjcSByZWFkOiAiLCBoZWFkLCB0YWlsKTsKKyNlbmRpZgorICAgICAgLyogdHJ5ICgwLDApLT4oLTEsMCkgKi8KKworICAgICAgLyogb25seSBsZWdhbCB0cmFuc2l0aW9uIG91dCBvZiBoZWFkID0gMCBpcyBoZWFkID0gLTEgd2l0aCBubyBjaGFuZ2UgdG8KKyAgICAgICAqIHRhaWwgKi8KKyAgICAgIGdyYWJiZWRfbG9jayA9IEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMihoZWFkX2lkX3AsIDAsIC0xKTsKKworICAgICAgaWYgKGdyYWJiZWRfbG9jaykgeworCisgICAgICAgICpzcGluX2hlcmVfcCA9IEZBTFNFOworCisgICAgICAgIEtBX1RSQUNFKAorICAgICAgICAgICAgMTAwMCwKKyAgICAgICAgICAgICgiX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2s6IGxjazolcCwgVCMlZCBleGl0aW5nOiBubyBxdWV1aW5nXG4iLAorICAgICAgICAgICAgIGxjaywgZ3RpZCkpOworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgVFJBQ0VfTE9DS19IVChndGlkICsgMSwgImFjcSBleGl0OiAiLCBoZWFkLCAwKTsKKyNlbmRpZgorCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQgJiYgcHJldl9zdGF0ZSAhPSBvbXB0X3N0YXRlX3VuZGVmaW5lZCkgeworICAgICAgICAgIC8qIGNoYW5nZSB0aGUgc3RhdGUgYmVmb3JlIGNsZWFyaW5nIHdhaXRfaWQgKi8KKyAgICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IHByZXZfc3RhdGU7CisgICAgICAgICAgdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8ud2FpdF9pZCA9IDA7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIEtNUF9GU1lOQ19BQ1FVSVJFRChsY2spOworICAgICAgICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfRklSU1Q7IC8qIGxvY2sgaG9sZGVyIGNhbm5vdCBiZSBvbiBxdWV1ZSAqLworICAgICAgfQorICAgICAgZW5xdWV1ZWQgPSBGQUxTRTsKKyAgICB9IGJyZWFrOworICAgIH0KKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQgJiYgcHJldl9zdGF0ZSA9PSBvbXB0X3N0YXRlX3VuZGVmaW5lZCkgeworICAgICAgLyogdGhpcyB0aHJlYWQgd2lsbCBzcGluOyBzZXQgd2FpdF9pZCBiZWZvcmUgZW50ZXJpbmcgd2FpdCBzdGF0ZSAqLworICAgICAgcHJldl9zdGF0ZSA9IHRoaXNfdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlOworICAgICAgdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8ud2FpdF9pZCA9ICh1aW50NjRfdClsY2s7CisgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd2FpdF9sb2NrOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGVucXVldWVkKSB7CisgICAgICBpZiAodGFpbCA+IDApIHsKKyAgICAgICAga21wX2luZm9fdCAqdGFpbF90aHIgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKHRhaWwgLSAxKTsKKyAgICAgICAgS01QX0FTU0VSVCh0YWlsX3RociAhPSBOVUxMKTsKKyAgICAgICAgdGFpbF90aHItPnRoLnRoX25leHRfd2FpdGluZyA9IGd0aWQgKyAxOworICAgICAgICAvKiBjb3JyZXNwb25kaW5nIHdhaXQgZm9yIHRoaXMgd3JpdGUgaW4gcmVsZWFzZSBjb2RlICovCisgICAgICB9CisgICAgICBLQV9UUkFDRSgxMDAwLAorICAgICAgICAgICAgICAgKCJfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9jazogbGNrOiVwLCBUIyVkIHdhaXRpbmcgZm9yIGxvY2tcbiIsCisgICAgICAgICAgICAgICAgbGNrLCBndGlkKSk7CisKKyAgICAgIC8qIFRvRG86IE1heSB3YW50IHRvIGNvbnNpZGVyIHVzaW5nIF9fa21wX3dhaXRfc2xlZXAgIG9yIHNvbWV0aGluZyB0aGF0CisgICAgICAgICBzbGVlcHMgZm9yIHRocm91Z2hwdXQgb25seSBoZXJlLiAqLworICAgICAgS01QX01CKCk7CisgICAgICBLTVBfV0FJVF9ZSUVMRChzcGluX2hlcmVfcCwgRkFMU0UsIEtNUF9FUSwgbGNrKTsKKworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgIFRSQUNFX0xPQ0soZ3RpZCArIDEsICJhY3Egc3BpbiIpOworCisgICAgICBpZiAodGhpc190aHItPnRoLnRoX25leHRfd2FpdGluZyAhPSAwKQorICAgICAgICBfX2ttcF9kdW1wX3F1ZXVpbmdfbG9jayh0aGlzX3RociwgZ3RpZCwgbGNrLCAqaGVhZF9pZF9wLCAqdGFpbF9pZF9wKTsKKyNlbmRpZgorICAgICAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3Roci0+dGgudGhfbmV4dF93YWl0aW5nID09IDApOworICAgICAgS0FfVFJBQ0UoMTAwMCwgKCJfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9jazogbGNrOiVwLCBUIyVkIGV4aXRpbmc6IGFmdGVyICIKKyAgICAgICAgICAgICAgICAgICAgICAid2FpdGluZyBvbiBxdWV1ZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBsY2ssIGd0aWQpKTsKKworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgIFRSQUNFX0xPQ0soZ3RpZCArIDEsICJhY3EgZXhpdCAyIik7CisjZW5kaWYKKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgLyogY2hhbmdlIHRoZSBzdGF0ZSBiZWZvcmUgY2xlYXJpbmcgd2FpdF9pZCAqLworICAgICAgdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBwcmV2X3N0YXRlOworICAgICAgdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8ud2FpdF9pZCA9IDA7CisjZW5kaWYKKworICAgICAgLyogZ290IGxvY2ssIHdlIHdlcmUgZGVxdWV1ZWQgYnkgdGhlIHRocmVhZCB0aGF0IHJlbGVhc2VkIGxvY2sgKi8KKyAgICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVDsKKyAgICB9CisKKyAgICAvKiBZaWVsZCBpZiBudW1iZXIgb2YgdGhyZWFkcyA+IG51bWJlciBvZiBsb2dpY2FsIHByb2Nlc3NvcnMgKi8KKyAgICAvKiBUb0RvOiBOb3Qgc3VyZSB3aHkgdGhpcyBzaG91bGQgb25seSBiZSBpbiBvdmVyc3Vic2NyaXB0aW9uIGNhc2UsCisgICAgICAgbWF5YmUgc2hvdWxkIGJlIHRyYWRpdGlvbmFsIFlJRUxEX0lOSVQvWUlFTERfV0hFTiBsb29wICovCisgICAgS01QX1lJRUxEKFRDUl80KF9fa21wX250aCkgPgorICAgICAgICAgICAgICAoX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOiBfX2ttcF94cHJvYykpOworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICBUUkFDRV9MT0NLKGd0aWQgKyAxLCAiYWNxIHJldHJ5Iik7CisjZW5kaWYKKyAgfQorICBLTVBfQVNTRVJUMigwLCAic2hvdWxkIG5vdCBnZXQgaGVyZSIpOworICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfRklSU1Q7Cit9CisKK2ludCBfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9jayhrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpIHsKKyAgS01QX0RFQlVHX0FTU0VSVChndGlkID49IDApOworCisgIGludCByZXR2YWwgPSBfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9ja190aW1lZF90ZW1wbGF0ZTxmYWxzZT4obGNrLCBndGlkKTsKKyAgQU5OT1RBVEVfUVVFVUlOR19BQ1FVSVJFRChsY2spOworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IF9fa21wX2FjcXVpcmVfcXVldWluZ19sb2NrX3dpdGhfY2hlY2tzKGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgZ3RpZCkgeworICBjaGFyIGNvbnN0ICpjb25zdCBmdW5jID0gIm9tcF9zZXRfbG9jayI7CisgIGlmIChsY2stPmxrLmluaXRpYWxpemVkICE9IGxjaykgeworICAgIEtNUF9GQVRBTChMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jKTsKKyAgfQorICBpZiAoX19rbXBfaXNfcXVldWluZ19sb2NrX25lc3RhYmxlKGxjaykpIHsKKyAgICBLTVBfRkFUQUwoTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jKTsKKyAgfQorICBpZiAoX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lcihsY2spID09IGd0aWQpIHsKKyAgICBLTVBfRkFUQUwoTG9ja0lzQWxyZWFkeU93bmVkLCBmdW5jKTsKKyAgfQorCisgIF9fa21wX2FjcXVpcmVfcXVldWluZ19sb2NrKGxjaywgZ3RpZCk7CisKKyAgbGNrLT5say5vd25lcl9pZCA9IGd0aWQgKyAxOworICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfRklSU1Q7Cit9CisKK2ludCBfX2ttcF90ZXN0X3F1ZXVpbmdfbG9jayhrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpIHsKKyAgdm9sYXRpbGUga21wX2ludDMyICpoZWFkX2lkX3AgPSAmbGNrLT5say5oZWFkX2lkOworICBrbXBfaW50MzIgaGVhZDsKKyNpZmRlZiBLTVBfREVCVUcKKyAga21wX2luZm9fdCAqdGhpc190aHI7CisjZW5kaWYKKworICBLQV9UUkFDRSgxMDAwLCAoIl9fa21wX3Rlc3RfcXVldWluZ19sb2NrOiBUIyVkIGVudGVyaW5nXG4iLCBndGlkKSk7CisgIEtNUF9ERUJVR19BU1NFUlQoZ3RpZCA+PSAwKTsKKyNpZmRlZiBLTVBfREVCVUcKKyAgdGhpc190aHIgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKGd0aWQpOworICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyICE9IE5VTEwpOworICBLTVBfREVCVUdfQVNTRVJUKCF0aGlzX3Roci0+dGgudGhfc3Bpbl9oZXJlKTsKKyNlbmRpZgorCisgIGhlYWQgPSAqaGVhZF9pZF9wOworCisgIGlmIChoZWFkID09IDApIHsgLyogbm9ib2R5IG9uIHF1ZXVlLCBub2JvZHkgaG9sZGluZyAqLworICAgIC8qIHRyeSAoMCwwKS0+KC0xLDApICovCisgICAgaWYgKEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMihoZWFkX2lkX3AsIDAsIC0xKSkgeworICAgICAgS0FfVFJBQ0UoMTAwMCwKKyAgICAgICAgICAgICAgICgiX19rbXBfdGVzdF9xdWV1aW5nX2xvY2s6IFQjJWQgZXhpdGluZzogaG9sZGluZyBsb2NrXG4iLCBndGlkKSk7CisgICAgICBLTVBfRlNZTkNfQUNRVUlSRUQobGNrKTsKKyAgICAgIEFOTk9UQVRFX1FVRVVJTkdfQUNRVUlSRUQobGNrKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorCisgIEtBX1RSQUNFKDEwMDAsCisgICAgICAgICAgICgiX19rbXBfdGVzdF9xdWV1aW5nX2xvY2s6IFQjJWQgZXhpdGluZzogd2l0aG91dCBsb2NrXG4iLCBndGlkKSk7CisgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGludCBfX2ttcF90ZXN0X3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcyhrbXBfcXVldWluZ19sb2NrX3QgKmxjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGd0aWQpIHsKKyAgY2hhciBjb25zdCAqY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9sb2NrIjsKKyAgaWYgKGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrKSB7CisgICAgS01QX0ZBVEFMKExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMpOworICB9CisgIGlmIChfX2ttcF9pc19xdWV1aW5nX2xvY2tfbmVzdGFibGUobGNrKSkgeworICAgIEtNUF9GQVRBTChMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMpOworICB9CisKKyAgaW50IHJldHZhbCA9IF9fa21wX3Rlc3RfcXVldWluZ19sb2NrKGxjaywgZ3RpZCk7CisKKyAgaWYgKHJldHZhbCkgeworICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgfQorICByZXR1cm4gcmV0dmFsOworfQorCitpbnQgX19rbXBfcmVsZWFzZV9xdWV1aW5nX2xvY2soa21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKSB7CisgIGttcF9pbmZvX3QgKnRoaXNfdGhyOworICB2b2xhdGlsZSBrbXBfaW50MzIgKmhlYWRfaWRfcCA9ICZsY2stPmxrLmhlYWRfaWQ7CisgIHZvbGF0aWxlIGttcF9pbnQzMiAqdGFpbF9pZF9wID0gJmxjay0+bGsudGFpbF9pZDsKKworICBLQV9UUkFDRSgxMDAwLAorICAgICAgICAgICAoIl9fa21wX3JlbGVhc2VfcXVldWluZ19sb2NrOiBsY2s6JXAsIFQjJWQgZW50ZXJpbmdcbiIsIGxjaywgZ3RpZCkpOworICBLTVBfREVCVUdfQVNTRVJUKGd0aWQgPj0gMCk7CisgIHRoaXNfdGhyID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZChndGlkKTsKKyAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3RociAhPSBOVUxMKTsKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgIFRSQUNFX0xPQ0soZ3RpZCArIDEsICJyZWwgZW50Iik7CisKKyAgaWYgKHRoaXNfdGhyLT50aC50aF9zcGluX2hlcmUpCisgICAgX19rbXBfZHVtcF9xdWV1aW5nX2xvY2sodGhpc190aHIsIGd0aWQsIGxjaywgKmhlYWRfaWRfcCwgKnRhaWxfaWRfcCk7CisgIGlmICh0aGlzX3Roci0+dGgudGhfbmV4dF93YWl0aW5nICE9IDApCisgICAgX19rbXBfZHVtcF9xdWV1aW5nX2xvY2sodGhpc190aHIsIGd0aWQsIGxjaywgKmhlYWRfaWRfcCwgKnRhaWxfaWRfcCk7CisjZW5kaWYKKyAgS01QX0RFQlVHX0FTU0VSVCghdGhpc190aHItPnRoLnRoX3NwaW5faGVyZSk7CisgIEtNUF9ERUJVR19BU1NFUlQodGhpc190aHItPnRoLnRoX25leHRfd2FpdGluZyA9PSAwKTsKKworICBLTVBfRlNZTkNfUkVMRUFTSU5HKGxjayk7CisgIEFOTk9UQVRFX1FVRVVJTkdfUkVMRUFTRUQobGNrKTsKKworICB3aGlsZSAoMSkgeworICAgIGttcF9pbnQzMiBkZXF1ZXVlZDsKKyAgICBrbXBfaW50MzIgaGVhZDsKKyAgICBrbXBfaW50MzIgdGFpbDsKKworICAgIGhlYWQgPSAqaGVhZF9pZF9wOworCisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgIHRhaWwgPSAqdGFpbF9pZF9wOworICAgIFRSQUNFX0xPQ0tfSFQoZ3RpZCArIDEsICJyZWwgcmVhZDogIiwgaGVhZCwgdGFpbCk7CisgICAgaWYgKGhlYWQgPT0gMCkKKyAgICAgIF9fa21wX2R1bXBfcXVldWluZ19sb2NrKHRoaXNfdGhyLCBndGlkLCBsY2ssIGhlYWQsIHRhaWwpOworI2VuZGlmCisgICAgS01QX0RFQlVHX0FTU0VSVChoZWFkICE9CisgICAgICAgICAgICAgICAgICAgICAwKTsgLyogaG9sZGluZyB0aGUgbG9jaywgaGVhZCBtdXN0IGJlIC0xIG9yIHF1ZXVlIGhlYWQgKi8KKworICAgIGlmIChoZWFkID09IC0xKSB7IC8qIG5vYm9keSBvbiBxdWV1ZSAqLworICAgICAgLyogdHJ5ICgtMSwwKS0+KDAsMCkgKi8KKyAgICAgIGlmIChLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMzIoaGVhZF9pZF9wLCAtMSwgMCkpIHsKKyAgICAgICAgS0FfVFJBQ0UoCisgICAgICAgICAgICAxMDAwLAorICAgICAgICAgICAgKCJfX2ttcF9yZWxlYXNlX3F1ZXVpbmdfbG9jazogbGNrOiVwLCBUIyVkIGV4aXRpbmc6IHF1ZXVlIGVtcHR5XG4iLAorICAgICAgICAgICAgIGxjaywgZ3RpZCkpOworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgVFJBQ0VfTE9DS19IVChndGlkICsgMSwgInJlbCBleGl0OiAiLCAwLCAwKTsKKyNlbmRpZgorCisjaWYgT01QVF9TVVBQT1JUCisvKiBub3RoaW5nIHRvIGRvIC0gbm8gb3RoZXIgdGhyZWFkIGlzIHRyeWluZyB0byBzaGlmdCBibGFtZSAqLworI2VuZGlmCisgICAgICAgIHJldHVybiBLTVBfTE9DS19SRUxFQVNFRDsKKyAgICAgIH0KKyAgICAgIGRlcXVldWVkID0gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgIHRhaWwgPSAqdGFpbF9pZF9wOworICAgICAgaWYgKGhlYWQgPT0gdGFpbCkgeyAvKiBvbmx5IG9uZSB0aHJlYWQgb24gdGhlIHF1ZXVlICovCisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICBpZiAoaGVhZCA8PSAwKQorICAgICAgICAgIF9fa21wX2R1bXBfcXVldWluZ19sb2NrKHRoaXNfdGhyLCBndGlkLCBsY2ssIGhlYWQsIHRhaWwpOworI2VuZGlmCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoaGVhZCA+IDApOworCisgICAgICAgIC8qIHRyeSAoaCxoKS0+KC0xLDApICovCisgICAgICAgIGRlcXVldWVkID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDY0KAorICAgICAgICAgICAgUkNBU1Qodm9sYXRpbGUga21wX2ludDY0ICosIHRhaWxfaWRfcCksIEtNUF9QQUNLXzY0KGhlYWQsIGhlYWQpLAorICAgICAgICAgICAgS01QX1BBQ0tfNjQoLTEsIDApKTsKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgIFRSQUNFX0xPQ0soZ3RpZCArIDEsICJyZWwgZGVxOiAoaCxoKS0+KC0xLDApIik7CisjZW5kaWYKKworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdm9sYXRpbGUga21wX2ludDMyICp3YWl0aW5nX2lkX3A7CisgICAgICAgIGttcF9pbmZvX3QgKmhlYWRfdGhyID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZChoZWFkIC0gMSk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoaGVhZF90aHIgIT0gTlVMTCk7CisgICAgICAgIHdhaXRpbmdfaWRfcCA9ICZoZWFkX3Roci0+dGgudGhfbmV4dF93YWl0aW5nOworCisvKiBEb2VzIHRoaXMgcmVxdWlyZSBzeW5jaHJvbm91cyByZWFkcz8gKi8KKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgIGlmIChoZWFkIDw9IDAgfHwgdGFpbCA8PSAwKQorICAgICAgICAgIF9fa21wX2R1bXBfcXVldWluZ19sb2NrKHRoaXNfdGhyLCBndGlkLCBsY2ssIGhlYWQsIHRhaWwpOworI2VuZGlmCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoaGVhZCA+IDAgJiYgdGFpbCA+IDApOworCisgICAgICAgIC8qIHRyeSAoaCx0KS0+KGgnLHQpIG9yICh0LHQpICovCisgICAgICAgIEtNUF9NQigpOworICAgICAgICAvKiBtYWtlIHN1cmUgZW5xdWV1aW5nIHRocmVhZCBoYXMgdGltZSB0byB1cGRhdGUgbmV4dCB3YWl0aW5nIHRocmVhZAorICAgICAgICAgKiBmaWVsZCAqLworICAgICAgICAqaGVhZF9pZF9wID0gS01QX1dBSVRfWUlFTEQoKHZvbGF0aWxlIGttcF91aW50MzIgKil3YWl0aW5nX2lkX3AsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTkVRLCBOVUxMKTsKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgIFRSQUNFX0xPQ0soZ3RpZCArIDEsICJyZWwgZGVxOiAoaCx0KS0+KGgnLHQpIik7CisjZW5kaWYKKyAgICAgICAgZGVxdWV1ZWQgPSBUUlVFOworICAgICAgfQorICAgIH0KKworICAgIGlmIChkZXF1ZXVlZCkgeworICAgICAga21wX2luZm9fdCAqaGVhZF90aHIgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKGhlYWQgLSAxKTsKKyAgICAgIEtNUF9ERUJVR19BU1NFUlQoaGVhZF90aHIgIT0gTlVMTCk7CisKKy8qIERvZXMgdGhpcyByZXF1aXJlIHN5bmNocm9ub3VzIHJlYWRzPyAqLworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgIGlmIChoZWFkIDw9IDAgfHwgdGFpbCA8PSAwKQorICAgICAgICBfX2ttcF9kdW1wX3F1ZXVpbmdfbG9jayh0aGlzX3RociwgZ3RpZCwgbGNrLCBoZWFkLCB0YWlsKTsKKyNlbmRpZgorICAgICAgS01QX0RFQlVHX0FTU0VSVChoZWFkID4gMCAmJiB0YWlsID4gMCk7CisKKyAgICAgIC8qIEZvciBjbGVhbiBjb2RlIG9ubHkuIFRocmVhZCBub3QgcmVsZWFzZWQgdW50aWwgbmV4dCBzdGF0ZW1lbnQgcHJldmVudHMKKyAgICAgICAgIHJhY2Ugd2l0aCBhY3F1aXJlIGNvZGUuICovCisgICAgICBoZWFkX3Roci0+dGgudGhfbmV4dF93YWl0aW5nID0gMDsKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICBUUkFDRV9MT0NLX1QoZ3RpZCArIDEsICJyZWwgbnc9MCBmb3IgdD0iLCBoZWFkKTsKKyNlbmRpZgorCisgICAgICBLTVBfTUIoKTsKKyAgICAgIC8qIHJlc2V0IHNwaW4gdmFsdWUgKi8KKyAgICAgIGhlYWRfdGhyLT50aC50aF9zcGluX2hlcmUgPSBGQUxTRTsKKworICAgICAgS0FfVFJBQ0UoMTAwMCwgKCJfX2ttcF9yZWxlYXNlX3F1ZXVpbmdfbG9jazogbGNrOiVwLCBUIyVkIGV4aXRpbmc6IGFmdGVyICIKKyAgICAgICAgICAgICAgICAgICAgICAiZGVxdWV1aW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGxjaywgZ3RpZCkpOworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgIFRSQUNFX0xPQ0soZ3RpZCArIDEsICJyZWwgZXhpdCAyIik7CisjZW5kaWYKKyAgICAgIHJldHVybiBLTVBfTE9DS19SRUxFQVNFRDsKKyAgICB9CisvKiBLTVBfQ1BVX1BBVVNFKCk7IGRvbid0IHdhbnQgdG8gbWFrZSByZWxlYXNpbmcgdGhyZWFkIGhvbGQgdXAgYWNxdWlyaW5nCisgICB0aHJlYWRzICovCisKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgVFJBQ0VfTE9DSyhndGlkICsgMSwgInJlbCByZXRyeSIpOworI2VuZGlmCisKKyAgfSAvKiB3aGlsZSAqLworICBLTVBfQVNTRVJUMigwLCAic2hvdWxkIG5vdCBnZXQgaGVyZSIpOworICByZXR1cm4gS01QX0xPQ0tfUkVMRUFTRUQ7Cit9CisKK3N0YXRpYyBpbnQgX19rbXBfcmVsZWFzZV9xdWV1aW5nX2xvY2tfd2l0aF9jaGVja3Moa21wX3F1ZXVpbmdfbG9ja190ICpsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKSB7CisgIGNoYXIgY29uc3QgKmNvbnN0IGZ1bmMgPSAib21wX3Vuc2V0X2xvY2siOworICBLTVBfTUIoKTsgLyogaW4gY2FzZSBhbm90aGVyIHByb2Nlc3NvciBpbml0aWFsaXplZCBsb2NrICovCisgIGlmIChsY2stPmxrLmluaXRpYWxpemVkICE9IGxjaykgeworICAgIEtNUF9GQVRBTChMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jKTsKKyAgfQorICBpZiAoX19rbXBfaXNfcXVldWluZ19sb2NrX25lc3RhYmxlKGxjaykpIHsKKyAgICBLTVBfRkFUQUwoTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jKTsKKyAgfQorICBpZiAoX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lcihsY2spID09IC0xKSB7CisgICAgS01QX0ZBVEFMKExvY2tVbnNldHRpbmdGcmVlLCBmdW5jKTsKKyAgfQorICBpZiAoX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lcihsY2spICE9IGd0aWQpIHsKKyAgICBLTVBfRkFUQUwoTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyk7CisgIH0KKyAgbGNrLT5say5vd25lcl9pZCA9IDA7CisgIHJldHVybiBfX2ttcF9yZWxlYXNlX3F1ZXVpbmdfbG9jayhsY2ssIGd0aWQpOworfQorCit2b2lkIF9fa21wX2luaXRfcXVldWluZ19sb2NrKGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrKSB7CisgIGxjay0+bGsubG9jYXRpb24gPSBOVUxMOworICBsY2stPmxrLmhlYWRfaWQgPSAwOworICBsY2stPmxrLnRhaWxfaWQgPSAwOworICBsY2stPmxrLm5leHRfdGlja2V0ID0gMDsKKyAgbGNrLT5say5ub3dfc2VydmluZyA9IDA7CisgIGxjay0+bGsub3duZXJfaWQgPSAwOyAvLyBubyB0aHJlYWQgb3ducyB0aGUgbG9jay4KKyAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAtMTsgLy8gPj0gMCBmb3IgbmVzdGFibGUgbG9ja3MsIC0xIGZvciBzaW1wbGUgbG9ja3MuCisgIGxjay0+bGsuaW5pdGlhbGl6ZWQgPSBsY2s7CisKKyAgS0FfVFJBQ0UoMTAwMCwgKCJfX2ttcF9pbml0X3F1ZXVpbmdfbG9jazogbG9jayAlcCBpbml0aWFsaXplZFxuIiwgbGNrKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fa21wX2luaXRfcXVldWluZ19sb2NrX3dpdGhfY2hlY2tzKGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrKSB7CisgIF9fa21wX2luaXRfcXVldWluZ19sb2NrKGxjayk7Cit9CisKK3ZvaWQgX19rbXBfZGVzdHJveV9xdWV1aW5nX2xvY2soa21wX3F1ZXVpbmdfbG9ja190ICpsY2spIHsKKyAgbGNrLT5say5pbml0aWFsaXplZCA9IE5VTEw7CisgIGxjay0+bGsubG9jYXRpb24gPSBOVUxMOworICBsY2stPmxrLmhlYWRfaWQgPSAwOworICBsY2stPmxrLnRhaWxfaWQgPSAwOworICBsY2stPmxrLm5leHRfdGlja2V0ID0gMDsKKyAgbGNrLT5say5ub3dfc2VydmluZyA9IDA7CisgIGxjay0+bGsub3duZXJfaWQgPSAwOworICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IC0xOworfQorCitzdGF0aWMgdm9pZCBfX2ttcF9kZXN0cm95X3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcyhrbXBfcXVldWluZ19sb2NrX3QgKmxjaykgeworICBjaGFyIGNvbnN0ICpjb25zdCBmdW5jID0gIm9tcF9kZXN0cm95X2xvY2siOworICBpZiAobGNrLT5say5pbml0aWFsaXplZCAhPSBsY2spIHsKKyAgICBLTVBfRkFUQUwoTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyk7CisgIH0KKyAgaWYgKF9fa21wX2lzX3F1ZXVpbmdfbG9ja19uZXN0YWJsZShsY2spKSB7CisgICAgS01QX0ZBVEFMKExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyk7CisgIH0KKyAgaWYgKF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIobGNrKSAhPSAtMSkgeworICAgIEtNUF9GQVRBTChMb2NrU3RpbGxPd25lZCwgZnVuYyk7CisgIH0KKyAgX19rbXBfZGVzdHJveV9xdWV1aW5nX2xvY2sobGNrKTsKK30KKworLy8gbmVzdGVkIHF1ZXVpbmcgbG9ja3MKKworaW50IF9fa21wX2FjcXVpcmVfbmVzdGVkX3F1ZXVpbmdfbG9jayhrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpIHsKKyAgS01QX0RFQlVHX0FTU0VSVChndGlkID49IDApOworCisgIGlmIChfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKGxjaykgPT0gZ3RpZCkgeworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkICs9IDE7CisgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX05FWFQ7CisgIH0gZWxzZSB7CisgICAgX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2tfdGltZWRfdGVtcGxhdGU8ZmFsc2U+KGxjaywgZ3RpZCk7CisgICAgQU5OT1RBVEVfUVVFVUlOR19BQ1FVSVJFRChsY2spOworICAgIEtNUF9NQigpOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMTsKKyAgICBLTVBfTUIoKTsKKyAgICBsY2stPmxrLm93bmVyX2lkID0gZ3RpZCArIDE7CisgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX0ZJUlNUOworICB9Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX2FjcXVpcmVfbmVzdGVkX3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcyhrbXBfcXVldWluZ19sb2NrX3QgKmxjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgZ3RpZCkgeworICBjaGFyIGNvbnN0ICpjb25zdCBmdW5jID0gIm9tcF9zZXRfbmVzdF9sb2NrIjsKKyAgaWYgKGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrKSB7CisgICAgS01QX0ZBVEFMKExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMpOworICB9CisgIGlmICghX19rbXBfaXNfcXVldWluZ19sb2NrX25lc3RhYmxlKGxjaykpIHsKKyAgICBLTVBfRkFUQUwoTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jKTsKKyAgfQorICByZXR1cm4gX19rbXBfYWNxdWlyZV9uZXN0ZWRfcXVldWluZ19sb2NrKGxjaywgZ3RpZCk7Cit9CisKK2ludCBfX2ttcF90ZXN0X25lc3RlZF9xdWV1aW5nX2xvY2soa21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKSB7CisgIGludCByZXR2YWw7CisKKyAgS01QX0RFQlVHX0FTU0VSVChndGlkID49IDApOworCisgIGlmIChfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKGxjaykgPT0gZ3RpZCkgeworICAgIHJldHZhbCA9ICsrbGNrLT5say5kZXB0aF9sb2NrZWQ7CisgIH0gZWxzZSBpZiAoIV9fa21wX3Rlc3RfcXVldWluZ19sb2NrKGxjaywgZ3RpZCkpIHsKKyAgICByZXR2YWwgPSAwOworICB9IGVsc2UgeworICAgIEtNUF9NQigpOworICAgIHJldHZhbCA9IGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMTsKKyAgICBLTVBfTUIoKTsKKyAgICBsY2stPmxrLm93bmVyX2lkID0gZ3RpZCArIDE7CisgIH0KKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBfX2ttcF90ZXN0X25lc3RlZF9xdWV1aW5nX2xvY2tfd2l0aF9jaGVja3Moa21wX3F1ZXVpbmdfbG9ja190ICpsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgZ3RpZCkgeworICBjaGFyIGNvbnN0ICpjb25zdCBmdW5jID0gIm9tcF90ZXN0X25lc3RfbG9jayI7CisgIGlmIChsY2stPmxrLmluaXRpYWxpemVkICE9IGxjaykgeworICAgIEtNUF9GQVRBTChMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jKTsKKyAgfQorICBpZiAoIV9fa21wX2lzX3F1ZXVpbmdfbG9ja19uZXN0YWJsZShsY2spKSB7CisgICAgS01QX0ZBVEFMKExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyk7CisgIH0KKyAgcmV0dXJuIF9fa21wX3Rlc3RfbmVzdGVkX3F1ZXVpbmdfbG9jayhsY2ssIGd0aWQpOworfQorCitpbnQgX19rbXBfcmVsZWFzZV9uZXN0ZWRfcXVldWluZ19sb2NrKGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCkgeworICBLTVBfREVCVUdfQVNTRVJUKGd0aWQgPj0gMCk7CisKKyAgS01QX01CKCk7CisgIGlmICgtLShsY2stPmxrLmRlcHRoX2xvY2tlZCkgPT0gMCkgeworICAgIEtNUF9NQigpOworICAgIGxjay0+bGsub3duZXJfaWQgPSAwOworICAgIF9fa21wX3JlbGVhc2VfcXVldWluZ19sb2NrKGxjaywgZ3RpZCk7CisgICAgcmV0dXJuIEtNUF9MT0NLX1JFTEVBU0VEOworICB9CisgIHJldHVybiBLTVBfTE9DS19TVElMTF9IRUxEOworfQorCitzdGF0aWMgaW50CitfX2ttcF9yZWxlYXNlX25lc3RlZF9xdWV1aW5nX2xvY2tfd2l0aF9jaGVja3Moa21wX3F1ZXVpbmdfbG9ja190ICpsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGd0aWQpIHsKKyAgY2hhciBjb25zdCAqY29uc3QgZnVuYyA9ICJvbXBfdW5zZXRfbmVzdF9sb2NrIjsKKyAgS01QX01CKCk7IC8qIGluIGNhc2UgYW5vdGhlciBwcm9jZXNzb3IgaW5pdGlhbGl6ZWQgbG9jayAqLworICBpZiAobGNrLT5say5pbml0aWFsaXplZCAhPSBsY2spIHsKKyAgICBLTVBfRkFUQUwoTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyk7CisgIH0KKyAgaWYgKCFfX2ttcF9pc19xdWV1aW5nX2xvY2tfbmVzdGFibGUobGNrKSkgeworICAgIEtNUF9GQVRBTChMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMpOworICB9CisgIGlmIChfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKGxjaykgPT0gLTEpIHsKKyAgICBLTVBfRkFUQUwoTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMpOworICB9CisgIGlmIChfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKGxjaykgIT0gZ3RpZCkgeworICAgIEtNUF9GQVRBTChMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyLCBmdW5jKTsKKyAgfQorICByZXR1cm4gX19rbXBfcmVsZWFzZV9uZXN0ZWRfcXVldWluZ19sb2NrKGxjaywgZ3RpZCk7Cit9CisKK3ZvaWQgX19rbXBfaW5pdF9uZXN0ZWRfcXVldWluZ19sb2NrKGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrKSB7CisgIF9fa21wX2luaXRfcXVldWluZ19sb2NrKGxjayk7CisgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMDsgLy8gPj0gMCBmb3IgbmVzdGFibGUgbG9ja3MsIC0xIGZvciBzaW1wbGUgbG9ja3MKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfbmVzdGVkX3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcyhrbXBfcXVldWluZ19sb2NrX3QgKmxjaykgeworICBfX2ttcF9pbml0X25lc3RlZF9xdWV1aW5nX2xvY2sobGNrKTsKK30KKwordm9pZCBfX2ttcF9kZXN0cm95X25lc3RlZF9xdWV1aW5nX2xvY2soa21wX3F1ZXVpbmdfbG9ja190ICpsY2spIHsKKyAgX19rbXBfZGVzdHJveV9xdWV1aW5nX2xvY2sobGNrKTsKKyAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAwOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9uZXN0ZWRfcXVldWluZ19sb2NrX3dpdGhfY2hlY2tzKGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrKSB7CisgIGNoYXIgY29uc3QgKmNvbnN0IGZ1bmMgPSAib21wX2Rlc3Ryb3lfbmVzdF9sb2NrIjsKKyAgaWYgKGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrKSB7CisgICAgS01QX0ZBVEFMKExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMpOworICB9CisgIGlmICghX19rbXBfaXNfcXVldWluZ19sb2NrX25lc3RhYmxlKGxjaykpIHsKKyAgICBLTVBfRkFUQUwoTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jKTsKKyAgfQorICBpZiAoX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lcihsY2spICE9IC0xKSB7CisgICAgS01QX0ZBVEFMKExvY2tTdGlsbE93bmVkLCBmdW5jKTsKKyAgfQorICBfX2ttcF9kZXN0cm95X25lc3RlZF9xdWV1aW5nX2xvY2sobGNrKTsKK30KKworLy8gYWNjZXNzIGZ1bmN0aW9ucyB0byBmaWVsZHMgd2hpY2ggZG9uJ3QgZXhpc3QgZm9yIGFsbCBsb2NrIGtpbmRzLgorCitzdGF0aWMgaW50IF9fa21wX2lzX3F1ZXVpbmdfbG9ja19pbml0aWFsaXplZChrbXBfcXVldWluZ19sb2NrX3QgKmxjaykgeworICByZXR1cm4gbGNrID09IGxjay0+bGsuaW5pdGlhbGl6ZWQ7Cit9CisKK3N0YXRpYyBjb25zdCBpZGVudF90ICpfX2ttcF9nZXRfcXVldWluZ19sb2NrX2xvY2F0aW9uKGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrKSB7CisgIHJldHVybiBsY2stPmxrLmxvY2F0aW9uOworfQorCitzdGF0aWMgdm9pZCBfX2ttcF9zZXRfcXVldWluZ19sb2NrX2xvY2F0aW9uKGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpZGVudF90ICpsb2MpIHsKKyAgbGNrLT5say5sb2NhdGlvbiA9IGxvYzsKK30KKworc3RhdGljIGttcF9sb2NrX2ZsYWdzX3QgX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19mbGFncyhrbXBfcXVldWluZ19sb2NrX3QgKmxjaykgeworICByZXR1cm4gbGNrLT5say5mbGFnczsKK30KKworc3RhdGljIHZvaWQgX19rbXBfc2V0X3F1ZXVpbmdfbG9ja19mbGFncyhrbXBfcXVldWluZ19sb2NrX3QgKmxjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2xvY2tfZmxhZ3NfdCBmbGFncykgeworICBsY2stPmxrLmZsYWdzID0gZmxhZ3M7Cit9CisKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKy8qIFJUTSBBZGFwdGl2ZSBsb2NrcyAqLworCisjaWYgS01QX0NPTVBJTEVSX0lDQyAmJiBfX0lOVEVMX0NPTVBJTEVSID49IDEzMDAKKworI2luY2x1ZGUgPGltbWludHJpbi5oPgorI2RlZmluZSBTT0ZUX0FCT1JUX01BU0sgKF9YQUJPUlRfUkVUUlkgfCBfWEFCT1JUX0NPTkZMSUNUIHwgX1hBQk9SVF9FWFBMSUNJVCkKKworI2Vsc2UKKworLy8gVmFsdWVzIGZyb20gdGhlIHN0YXR1cyByZWdpc3RlciBhZnRlciBmYWlsZWQgc3BlY3VsYXRpb24uCisjZGVmaW5lIF9YQkVHSU5fU1RBUlRFRCAofjB1KQorI2RlZmluZSBfWEFCT1JUX0VYUExJQ0lUICgxIDw8IDApCisjZGVmaW5lIF9YQUJPUlRfUkVUUlkgKDEgPDwgMSkKKyNkZWZpbmUgX1hBQk9SVF9DT05GTElDVCAoMSA8PCAyKQorI2RlZmluZSBfWEFCT1JUX0NBUEFDSVRZICgxIDw8IDMpCisjZGVmaW5lIF9YQUJPUlRfREVCVUcgKDEgPDwgNCkKKyNkZWZpbmUgX1hBQk9SVF9ORVNURUQgKDEgPDwgNSkKKyNkZWZpbmUgX1hBQk9SVF9DT0RFKHgpICgodW5zaWduZWQgY2hhcikoKCh4KSA+PiAyNCkgJiAweEZGKSkKKworLy8gQWJvcnRzIGZvciB3aGljaCBpdCdzIHdvcnRoIHRyeWluZyBhZ2FpbiBpbW1lZGlhdGVseQorI2RlZmluZSBTT0ZUX0FCT1JUX01BU0sgKF9YQUJPUlRfUkVUUlkgfCBfWEFCT1JUX0NPTkZMSUNUIHwgX1hBQk9SVF9FWFBMSUNJVCkKKworI2RlZmluZSBTVFJJTkdJWkVfSU5URVJOQUwoYXJnKSAjYXJnCisjZGVmaW5lIFNUUklOR0laRShhcmcpIFNUUklOR0laRV9JTlRFUk5BTChhcmcpCisKKy8vIEFjY2VzcyB0byBSVE0gaW5zdHJ1Y3Rpb25zCisvKkEgdmVyc2lvbiBvZiBYQmVnaW4gd2hpY2ggcmV0dXJucyAtMSBvbiBzcGVjdWxhdGlvbiwgYW5kIHRoZSB2YWx1ZSBvZiBFQVggb24KKyAgYW4gYWJvcnQuIFRoaXMgaXMgdGhlIHNhbWUgZGVmaW5pdGlvbiBhcyB0aGUgY29tcGlsZXIgaW50cmluc2ljIHRoYXQgd2lsbCBiZQorICBzdXBwb3J0ZWQgYXQgc29tZSBwb2ludC4gKi8KK3N0YXRpYyBfX2lubGluZSBpbnQgX3hiZWdpbigpIHsKKyAgaW50IHJlcyA9IC0xOworCisjaWYgS01QX09TX1dJTkRPV1MKKyNpZiBLTVBfQVJDSF9YODZfNjQKKyAgX2FzbSB7CisgICAgICAgIF9lbWl0IDB4QzcKKyAgICAgICAgX2VtaXQgMHhGOAorICAgICAgICBfZW1pdCAyCisgICAgICAgIF9lbWl0IDAKKyAgICAgICAgX2VtaXQgMAorICAgICAgICBfZW1pdCAwCisgICAgICAgIGptcCAgIEwyCisgICAgICAgIG1vdiAgIHJlcywgZWF4CisgICAgTDI6CisgIH0KKyNlbHNlIC8qIElBMzIgKi8KKyAgX2FzbSB7CisgICAgICAgIF9lbWl0IDB4QzcKKyAgICAgICAgX2VtaXQgMHhGOAorICAgICAgICBfZW1pdCAyCisgICAgICAgIF9lbWl0IDAKKyAgICAgICAgX2VtaXQgMAorICAgICAgICBfZW1pdCAwCisgICAgICAgIGptcCAgIEwyCisgICAgICAgIG1vdiAgIHJlcywgZWF4CisgICAgTDI6CisgIH0KKyNlbmRpZiAvLyBLTVBfQVJDSF9YODZfNjQKKyNlbHNlCisgIC8qIE5vdGUgdGhhdCAlZWF4IG11c3QgYmUgbm90ZWQgYXMga2lsbGVkIChjbG9iYmVyZWQpLCBiZWNhdXNlIHRoZSBYU1IgaXMKKyAgICAgcmV0dXJuZWQgaW4gJWVheCglcmF4KSBvbiBhYm9ydC4gIE90aGVyIHJlZ2lzdGVyIHZhbHVlcyBhcmUgcmVzdG9yZWQsIHNvCisgICAgIGRvbid0IG5lZWQgdG8gYmUga2lsbGVkLgorCisgICAgIFdlIG11c3QgYWxzbyBtYXJrICdyZXMnIGFzIGFuIGlucHV0IGFuZCBhbiBvdXRwdXQsIHNpbmNlIG90aGVyd2lzZQorICAgICAncmVzPS0xJyBtYXkgYmUgZHJvcHBlZCBhcyBiZWluZyBkZWFkLCB3aGVyZWFzIHdlIGRvIG5lZWQgdGhlIGFzc2lnbm1lbnQgb24KKyAgICAgdGhlIHN1Y2Nlc3NmdWwgKGkuZS4sIG5vbi1hYm9ydCkgcGF0aC4gKi8KKyAgX19hc21fXyB2b2xhdGlsZSgiMTogLmJ5dGUgIDB4Qzc7IC5ieXRlIDB4Rjg7XG4iCisgICAgICAgICAgICAgICAgICAgIiAgIC5sb25nICAxZi0xYi02XG4iCisgICAgICAgICAgICAgICAgICAgIiAgICBqbXAgICAyZlxuIgorICAgICAgICAgICAgICAgICAgICIxOiAgbW92bCAgJSVlYXgsJTBcbiIKKyAgICAgICAgICAgICAgICAgICAiMjoiCisgICAgICAgICAgICAgICAgICAgOiAiK3IiKHJlcyk6OiJtZW1vcnkiLCAiJWVheCIpOworI2VuZGlmIC8vIEtNUF9PU19XSU5ET1dTCisgIHJldHVybiByZXM7Cit9CisKKy8qIFRyYW5zYWN0aW9uIGVuZCAqLworc3RhdGljIF9faW5saW5lIHZvaWQgX3hlbmQoKSB7CisjaWYgS01QX09TX1dJTkRPV1MKKyAgX19hc20geworICAgICAgICBfZW1pdCAweDBmCisgICAgICAgIF9lbWl0IDB4MDEKKyAgICAgICAgX2VtaXQgMHhkNQorICB9CisjZWxzZQorICBfX2FzbV9fIHZvbGF0aWxlKCIuYnl0ZSAweDBmOyAuYnl0ZSAweDAxOyAuYnl0ZSAweGQ1IiA6OjogIm1lbW9yeSIpOworI2VuZGlmCit9CisKKy8qIFRoaXMgaXMgYSBtYWNybywgdGhlIGFyZ3VtZW50IG11c3QgYmUgYSBzaW5nbGUgYnl0ZSBjb25zdGFudCB3aGljaCBjYW4gYmUKKyAgIGV2YWx1YXRlZCBieSB0aGUgaW5saW5lIGFzc2VtYmxlciwgc2luY2UgaXQgaXMgZW1pdHRlZCBhcyBhIGJ5dGUgaW50byB0aGUKKyAgIGFzc2VtYmx5IGNvZGUuICovCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisjaWYgS01QX09TX1dJTkRPV1MKKyNkZWZpbmUgX3hhYm9ydChBUkcpIF9hc20gX2VtaXQgMHhjNiBfYXNtIF9lbWl0IDB4ZjggX2FzbSBfZW1pdCBBUkcKKyNlbHNlCisjZGVmaW5lIF94YWJvcnQoQVJHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2FzbV9fIHZvbGF0aWxlKCIuYnl0ZSAweEM2OyAuYnl0ZSAweEY4OyAuYnl0ZSAiIFNUUklOR0laRShBUkcpOjo6Im1lbW9yeSIpOworI2VuZGlmCisvLyBjbGFuZy1mb3JtYXQgb24KKyNlbmRpZiAvLyBLTVBfQ09NUElMRVJfSUNDICYmIF9fSU5URUxfQ09NUElMRVIgPj0gMTMwMAorCisvLyBTdGF0aXN0aWNzIGlzIGNvbGxlY3RlZCBmb3IgdGVzdGluZyBwdXJwb3NlCisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisKKy8vIFdlIGFjY3VtdWxhdGUgc3BlY3VsYXRpdmUgbG9jayBzdGF0aXN0aWNzIHdoZW4gdGhlIGxvY2sgaXMgZGVzdHJveWVkLiBXZQorLy8ga2VlcCBsb2NrcyB0aGF0IGhhdmVuJ3QgYmVlbiBkZXN0cm95ZWQgaW4gdGhlIGxpdmVMb2NrcyBsaXN0IHNvIHRoYXQgd2UgY2FuCisvLyBncmFiIHRoZWlyIHN0YXRpc3RpY3MgdG9vLgorc3RhdGljIGttcF9hZGFwdGl2ZV9sb2NrX3N0YXRpc3RpY3NfdCBkZXN0cm95ZWRTdGF0czsKKworLy8gVG8gaG9sZCB0aGUgbGlzdCBvZiBsaXZlIGxvY2tzLgorc3RhdGljIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdCBsaXZlTG9ja3M7CisKKy8vIEEgbG9jayBzbyB3ZSBjYW4gc2FmZWx5IHVwZGF0ZSB0aGUgbGlzdCBvZiBsb2Nrcy4KK3N0YXRpYyBrbXBfYm9vdHN0cmFwX2xvY2tfdCBjaGFpbl9sb2NrOworCisvLyBJbml0aWFsaXplIHRoZSBsaXN0IG9mIHN0YXRzLgordm9pZCBfX2ttcF9pbml0X3NwZWN1bGF0aXZlX3N0YXRzKCkgeworICBrbXBfYWRhcHRpdmVfbG9ja19pbmZvX3QgKmxjayA9ICZsaXZlTG9ja3M7CisKKyAgbWVtc2V0KCh2b2lkICopJihsY2stPnN0YXRzKSwgMCwgc2l6ZW9mKGxjay0+c3RhdHMpKTsKKyAgbGNrLT5zdGF0cy5uZXh0ID0gbGNrOworICBsY2stPnN0YXRzLnByZXYgPSBsY2s7CisKKyAgS01QX0FTU0VSVChsY2stPnN0YXRzLm5leHQtPnN0YXRzLnByZXYgPT0gbGNrKTsKKyAgS01QX0FTU0VSVChsY2stPnN0YXRzLnByZXYtPnN0YXRzLm5leHQgPT0gbGNrKTsKKworICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCZjaGFpbl9sb2NrKTsKK30KKworLy8gSW5zZXJ0IHRoZSBsb2NrIGludG8gdGhlIGNpcmN1bGFyIGxpc3QKK3N0YXRpYyB2b2lkIF9fa21wX3JlbWVtYmVyX2xvY2soa21wX2FkYXB0aXZlX2xvY2tfaW5mb190ICpsY2spIHsKKyAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jaygmY2hhaW5fbG9jayk7CisKKyAgbGNrLT5zdGF0cy5uZXh0ID0gbGl2ZUxvY2tzLnN0YXRzLm5leHQ7CisgIGxjay0+c3RhdHMucHJldiA9ICZsaXZlTG9ja3M7CisKKyAgbGl2ZUxvY2tzLnN0YXRzLm5leHQgPSBsY2s7CisgIGxjay0+c3RhdHMubmV4dC0+c3RhdHMucHJldiA9IGxjazsKKworICBLTVBfQVNTRVJUKGxjay0+c3RhdHMubmV4dC0+c3RhdHMucHJldiA9PSBsY2spOworICBLTVBfQVNTRVJUKGxjay0+c3RhdHMucHJldi0+c3RhdHMubmV4dCA9PSBsY2spOworCisgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJmNoYWluX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBfX2ttcF9mb3JnZXRfbG9jayhrbXBfYWRhcHRpdmVfbG9ja19pbmZvX3QgKmxjaykgeworICBLTVBfQVNTRVJUKGxjay0+c3RhdHMubmV4dC0+c3RhdHMucHJldiA9PSBsY2spOworICBLTVBfQVNTRVJUKGxjay0+c3RhdHMucHJldi0+c3RhdHMubmV4dCA9PSBsY2spOworCisgIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdCAqbiA9IGxjay0+c3RhdHMubmV4dDsKKyAga21wX2FkYXB0aXZlX2xvY2tfaW5mb190ICpwID0gbGNrLT5zdGF0cy5wcmV2OworCisgIG4tPnN0YXRzLnByZXYgPSBwOworICBwLT5zdGF0cy5uZXh0ID0gbjsKK30KKworc3RhdGljIHZvaWQgX19rbXBfemVyb19zcGVjdWxhdGl2ZV9zdGF0cyhrbXBfYWRhcHRpdmVfbG9ja19pbmZvX3QgKmxjaykgeworICBtZW1zZXQoKHZvaWQgKikmbGNrLT5zdGF0cywgMCwgc2l6ZW9mKGxjay0+c3RhdHMpKTsKKyAgX19rbXBfcmVtZW1iZXJfbG9jayhsY2spOworfQorCitzdGF0aWMgdm9pZCBfX2ttcF9hZGRfc3RhdHMoa21wX2FkYXB0aXZlX2xvY2tfc3RhdGlzdGljc190ICp0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdCAqbGNrKSB7CisgIGttcF9hZGFwdGl2ZV9sb2NrX3N0YXRpc3RpY3NfdCB2b2xhdGlsZSAqcyA9ICZsY2stPnN0YXRzOworCisgIHQtPm5vblNwZWN1bGF0aXZlQWNxdWlyZUF0dGVtcHRzICs9IGxjay0+YWNxdWlyZV9hdHRlbXB0czsKKyAgdC0+c3VjY2Vzc2Z1bFNwZWN1bGF0aW9ucyArPSBzLT5zdWNjZXNzZnVsU3BlY3VsYXRpb25zOworICB0LT5oYXJkRmFpbGVkU3BlY3VsYXRpb25zICs9IHMtPmhhcmRGYWlsZWRTcGVjdWxhdGlvbnM7CisgIHQtPnNvZnRGYWlsZWRTcGVjdWxhdGlvbnMgKz0gcy0+c29mdEZhaWxlZFNwZWN1bGF0aW9uczsKKyAgdC0+bm9uU3BlY3VsYXRpdmVBY3F1aXJlcyArPSBzLT5ub25TcGVjdWxhdGl2ZUFjcXVpcmVzOworICB0LT5sZW1taW5nWWllbGRzICs9IHMtPmxlbW1pbmdZaWVsZHM7Cit9CisKK3N0YXRpYyB2b2lkIF9fa21wX2FjY3VtdWxhdGVfc3BlY3VsYXRpdmVfc3RhdHMoa21wX2FkYXB0aXZlX2xvY2tfaW5mb190ICpsY2spIHsKKyAga21wX2FkYXB0aXZlX2xvY2tfc3RhdGlzdGljc190ICp0ID0gJmRlc3Ryb3llZFN0YXRzOworCisgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soJmNoYWluX2xvY2spOworCisgIF9fa21wX2FkZF9zdGF0cygmZGVzdHJveWVkU3RhdHMsIGxjayk7CisgIF9fa21wX2ZvcmdldF9sb2NrKGxjayk7CisKKyAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jaygmY2hhaW5fbG9jayk7Cit9CisKK3N0YXRpYyBmbG9hdCBwZXJjZW50KGttcF91aW50MzIgY291bnQsIGttcF91aW50MzIgdG90YWwpIHsKKyAgcmV0dXJuICh0b3RhbCA9PSAwKSA/IDAuMCA6ICgxMDAuMCAqIGNvdW50KSAvIHRvdGFsOworfQorCitzdGF0aWMgRklMRSAqX19rbXBfb3Blbl9zdGF0c19maWxlKCkgeworICBpZiAoc3RyY21wKF9fa21wX3NwZWN1bGF0aXZlX3N0YXRzZmlsZSwgIi0iKSA9PSAwKQorICAgIHJldHVybiBzdGRvdXQ7CisKKyAgc2l6ZV90IGJ1ZmZMZW4gPSBLTVBfU1RSTEVOKF9fa21wX3NwZWN1bGF0aXZlX3N0YXRzZmlsZSkgKyAyMDsKKyAgY2hhciBidWZmZXJbYnVmZkxlbl07CisgIEtNUF9TTlBSSU5URigmYnVmZmVyWzBdLCBidWZmTGVuLCBfX2ttcF9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUsCisgICAgICAgICAgICAgICAoa21wX2ludDMyKWdldHBpZCgpKTsKKyAgRklMRSAqcmVzdWx0ID0gZm9wZW4oJmJ1ZmZlclswXSwgInciKTsKKworICAvLyBNYXliZSB3ZSBzaG91bGQgaXNzdWUgYSB3YXJuaW5nIGhlcmUuLi4KKyAgcmV0dXJuIHJlc3VsdCA/IHJlc3VsdCA6IHN0ZG91dDsKK30KKwordm9pZCBfX2ttcF9wcmludF9zcGVjdWxhdGl2ZV9zdGF0cygpIHsKKyAgaWYgKF9fa21wX3VzZXJfbG9ja19raW5kICE9IGxrX2FkYXB0aXZlKQorICAgIHJldHVybjsKKworICBGSUxFICpzdGF0c0ZpbGUgPSBfX2ttcF9vcGVuX3N0YXRzX2ZpbGUoKTsKKworICBrbXBfYWRhcHRpdmVfbG9ja19zdGF0aXN0aWNzX3QgdG90YWwgPSBkZXN0cm95ZWRTdGF0czsKKyAga21wX2FkYXB0aXZlX2xvY2tfaW5mb190ICpsY2s7CisKKyAgZm9yIChsY2sgPSBsaXZlTG9ja3Muc3RhdHMubmV4dDsgbGNrICE9ICZsaXZlTG9ja3M7IGxjayA9IGxjay0+c3RhdHMubmV4dCkgeworICAgIF9fa21wX2FkZF9zdGF0cygmdG90YWwsIGxjayk7CisgIH0KKyAga21wX2FkYXB0aXZlX2xvY2tfc3RhdGlzdGljc190ICp0ID0gJnRvdGFsOworICBrbXBfdWludDMyIHRvdGFsU2VjdGlvbnMgPQorICAgICAgdC0+bm9uU3BlY3VsYXRpdmVBY3F1aXJlcyArIHQtPnN1Y2Nlc3NmdWxTcGVjdWxhdGlvbnM7CisgIGttcF91aW50MzIgdG90YWxTcGVjdWxhdGlvbnMgPSB0LT5zdWNjZXNzZnVsU3BlY3VsYXRpb25zICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPmhhcmRGYWlsZWRTcGVjdWxhdGlvbnMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+c29mdEZhaWxlZFNwZWN1bGF0aW9uczsKKworICBmcHJpbnRmKHN0YXRzRmlsZSwgIlNwZWN1bGF0aXZlIGxvY2sgc3RhdGlzdGljcyAoYWxsIGFwcHJveGltYXRlISlcbiIpOworICBmcHJpbnRmKHN0YXRzRmlsZSwgIiBMb2NrIHBhcmFtZXRlcnM6IFxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIG1heF9zb2Z0X3JldHJpZXMgICAgICAgICAgICAgICA6ICUxMGRcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBtYXhfYmFkbmVzcyAgICAgICAgICAgICAgICAgICAgOiAlMTBkXG4iLAorICAgICAgICAgIF9fa21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zLm1heF9zb2Z0X3JldHJpZXMsCisgICAgICAgICAgX19rbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXMubWF4X2JhZG5lc3MpOworICBmcHJpbnRmKHN0YXRzRmlsZSwgIiBOb24tc3BlY3VsYXRpdmUgYWNxdWlyZSBhdHRlbXB0cyA6ICUxMGRcbiIsCisgICAgICAgICAgdC0+bm9uU3BlY3VsYXRpdmVBY3F1aXJlQXR0ZW1wdHMpOworICBmcHJpbnRmKHN0YXRzRmlsZSwgIiBUb3RhbCBjcml0aWNhbCBzZWN0aW9ucyAgICAgICAgICA6ICUxMGRcbiIsCisgICAgICAgICAgdG90YWxTZWN0aW9ucyk7CisgIGZwcmludGYoc3RhdHNGaWxlLCAiIFN1Y2Nlc3NmdWwgc3BlY3VsYXRpb25zICAgICAgICAgIDogJTEwZCAoJTUuMWYlJSlcbiIsCisgICAgICAgICAgdC0+c3VjY2Vzc2Z1bFNwZWN1bGF0aW9ucywKKyAgICAgICAgICBwZXJjZW50KHQtPnN1Y2Nlc3NmdWxTcGVjdWxhdGlvbnMsIHRvdGFsU2VjdGlvbnMpKTsKKyAgZnByaW50ZihzdGF0c0ZpbGUsICIgTm9uLXNwZWN1bGF0aXZlIGFjcXVpcmVzICAgICAgICAgOiAlMTBkICglNS4xZiUlKVxuIiwKKyAgICAgICAgICB0LT5ub25TcGVjdWxhdGl2ZUFjcXVpcmVzLAorICAgICAgICAgIHBlcmNlbnQodC0+bm9uU3BlY3VsYXRpdmVBY3F1aXJlcywgdG90YWxTZWN0aW9ucykpOworICBmcHJpbnRmKHN0YXRzRmlsZSwgIiBMZW1taW5nIHlpZWxkcyAgICAgICAgICAgICAgICAgICA6ICUxMGRcblxuIiwKKyAgICAgICAgICB0LT5sZW1taW5nWWllbGRzKTsKKworICBmcHJpbnRmKHN0YXRzRmlsZSwgIiBTcGVjdWxhdGl2ZSBhY3F1aXJlIGF0dGVtcHRzICAgICA6ICUxMGRcbiIsCisgICAgICAgICAgdG90YWxTcGVjdWxhdGlvbnMpOworICBmcHJpbnRmKHN0YXRzRmlsZSwgIiBTdWNjZXNzZXMgICAgICAgICAgICAgICAgICAgICAgICA6ICUxMGQgKCU1LjFmJSUpXG4iLAorICAgICAgICAgIHQtPnN1Y2Nlc3NmdWxTcGVjdWxhdGlvbnMsCisgICAgICAgICAgcGVyY2VudCh0LT5zdWNjZXNzZnVsU3BlY3VsYXRpb25zLCB0b3RhbFNwZWN1bGF0aW9ucykpOworICBmcHJpbnRmKHN0YXRzRmlsZSwgIiBTb2Z0IGZhaWx1cmVzICAgICAgICAgICAgICAgICAgICA6ICUxMGQgKCU1LjFmJSUpXG4iLAorICAgICAgICAgIHQtPnNvZnRGYWlsZWRTcGVjdWxhdGlvbnMsCisgICAgICAgICAgcGVyY2VudCh0LT5zb2Z0RmFpbGVkU3BlY3VsYXRpb25zLCB0b3RhbFNwZWN1bGF0aW9ucykpOworICBmcHJpbnRmKHN0YXRzRmlsZSwgIiBIYXJkIGZhaWx1cmVzICAgICAgICAgICAgICAgICAgICA6ICUxMGQgKCU1LjFmJSUpXG4iLAorICAgICAgICAgIHQtPmhhcmRGYWlsZWRTcGVjdWxhdGlvbnMsCisgICAgICAgICAgcGVyY2VudCh0LT5oYXJkRmFpbGVkU3BlY3VsYXRpb25zLCB0b3RhbFNwZWN1bGF0aW9ucykpOworCisgIGlmIChzdGF0c0ZpbGUgIT0gc3Rkb3V0KQorICAgIGZjbG9zZShzdGF0c0ZpbGUpOworfQorCisjZGVmaW5lIEtNUF9JTkNfU1RBVChsY2ssIHN0YXQpIChsY2stPmxrLmFkYXB0aXZlLnN0YXRzLnN0YXQrKykKKyNlbHNlCisjZGVmaW5lIEtNUF9JTkNfU1RBVChsY2ssIHN0YXQpCisKKyNlbmRpZiAvLyBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKworc3RhdGljIGlubGluZSBib29sIF9fa21wX2lzX3VubG9ja2VkX3F1ZXVpbmdfbG9jayhrbXBfcXVldWluZ19sb2NrX3QgKmxjaykgeworICAvLyBJdCBpcyBlbm91Z2ggdG8gY2hlY2sgdGhhdCB0aGUgaGVhZF9pZCBpcyB6ZXJvLgorICAvLyBXZSBkb24ndCBhbHNvIG5lZWQgdG8gY2hlY2sgdGhlIHRhaWwuCisgIGJvb2wgcmVzID0gbGNrLT5say5oZWFkX2lkID09IDA7CisKKy8vIFdlIG5lZWQgYSBmZW5jZSBoZXJlLCBzaW5jZSB3ZSBtdXN0IGVuc3VyZSB0aGF0IG5vIG1lbW9yeSBvcGVyYXRpb25zCisvLyBmcm9tIGxhdGVyIGluIHRoaXMgdGhyZWFkIGZsb2F0IGFib3ZlIHRoYXQgcmVhZC4KKyNpZiBLTVBfQ09NUElMRVJfSUNDCisgIF9tbV9tZmVuY2UoKTsKKyNlbHNlCisgIF9fc3luY19zeW5jaHJvbml6ZSgpOworI2VuZGlmCisKKyAgcmV0dXJuIHJlczsKK30KKworLy8gRnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgdGhlIGJhZG5lc3MKK3N0YXRpYyBfX2lubGluZSB2b2lkCitfX2ttcF91cGRhdGVfYmFkbmVzc19hZnRlcl9zdWNjZXNzKGttcF9hZGFwdGl2ZV9sb2NrX3QgKmxjaykgeworICAvLyBSZXNldCB0aGUgYmFkbmVzcyB0byB6ZXJvIHNvIHdlIGVhZ2VybHkgdHJ5IHRvIHNwZWN1bGF0ZSBhZ2FpbgorICBsY2stPmxrLmFkYXB0aXZlLmJhZG5lc3MgPSAwOworICBLTVBfSU5DX1NUQVQobGNrLCBzdWNjZXNzZnVsU3BlY3VsYXRpb25zKTsKK30KKworLy8gQ3JlYXRlIGEgYml0IG1hc2sgd2l0aCBvbmUgbW9yZSBzZXQgYml0Lgorc3RhdGljIF9faW5saW5lIHZvaWQgX19rbXBfc3RlcF9iYWRuZXNzKGttcF9hZGFwdGl2ZV9sb2NrX3QgKmxjaykgeworICBrbXBfdWludDMyIG5ld0JhZG5lc3MgPSAobGNrLT5say5hZGFwdGl2ZS5iYWRuZXNzIDw8IDEpIHwgMTsKKyAgaWYgKG5ld0JhZG5lc3MgPiBsY2stPmxrLmFkYXB0aXZlLm1heF9iYWRuZXNzKSB7CisgICAgcmV0dXJuOworICB9IGVsc2UgeworICAgIGxjay0+bGsuYWRhcHRpdmUuYmFkbmVzcyA9IG5ld0JhZG5lc3M7CisgIH0KK30KKworLy8gQ2hlY2sgd2hldGhlciBzcGVjdWxhdGlvbiBzaG91bGQgYmUgYXR0ZW1wdGVkLgorc3RhdGljIF9faW5saW5lIGludCBfX2ttcF9zaG91bGRfc3BlY3VsYXRlKGttcF9hZGFwdGl2ZV9sb2NrX3QgKmxjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgZ3RpZCkgeworICBrbXBfdWludDMyIGJhZG5lc3MgPSBsY2stPmxrLmFkYXB0aXZlLmJhZG5lc3M7CisgIGttcF91aW50MzIgYXR0ZW1wdHMgPSBsY2stPmxrLmFkYXB0aXZlLmFjcXVpcmVfYXR0ZW1wdHM7CisgIGludCByZXMgPSAoYXR0ZW1wdHMgJiBiYWRuZXNzKSA9PSAwOworICByZXR1cm4gcmVzOworfQorCisvLyBBdHRlbXB0IHRvIGFjcXVpcmUgb25seSB0aGUgc3BlY3VsYXRpdmUgbG9jay4KKy8vIERvZXMgbm90IGJhY2sgb2ZmIHRvIHRoZSBub24tc3BlY3VsYXRpdmUgbG9jay4KK3N0YXRpYyBpbnQgX19rbXBfdGVzdF9hZGFwdGl2ZV9sb2NrX29ubHkoa21wX2FkYXB0aXZlX2xvY2tfdCAqbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgZ3RpZCkgeworICBpbnQgcmV0cmllcyA9IGxjay0+bGsuYWRhcHRpdmUubWF4X3NvZnRfcmV0cmllczsKKworICAvLyBXZSBkb24ndCBleHBsaWNpdGx5IGNvdW50IHRoZSBzdGFydCBvZiBzcGVjdWxhdGlvbiwgcmF0aGVyIHdlIHJlY29yZCB0aGUKKyAgLy8gcmVzdWx0cyAoc3VjY2VzcywgaGFyZCBmYWlsLCBzb2Z0IGZhaWwpLiBUaGUgc3VtIG9mIGFsbCBvZiB0aG9zZSBpcyB0aGUKKyAgLy8gdG90YWwgbnVtYmVyIG9mIHRpbWVzIHdlIHN0YXJ0ZWQgc3BlY3VsYXRpb24gc2luY2UgYWxsIHNwZWN1bGF0aW9ucyBtdXN0CisgIC8vIGVuZCBvbmUgb2YgdGhvc2Ugd2F5cy4KKyAgZG8geworICAgIGttcF91aW50MzIgc3RhdHVzID0gX3hiZWdpbigpOworICAgIC8vIFN3aXRjaCB0aGlzIGluIHRvIGRpc2FibGUgYWN0dWFsIHNwZWN1bGF0aW9uIGJ1dCBleGVyY2lzZSBhdCBsZWFzdCBzb21lCisgICAgLy8gb2YgdGhlIHJlc3Qgb2YgdGhlIGNvZGUuIFVzZWZ1bCBmb3IgZGVidWdnaW5nLi4uCisgICAgLy8ga21wX3VpbnQzMiBzdGF0dXMgPSBfWEFCT1JUX05FU1RFRDsKKworICAgIGlmIChzdGF0dXMgPT0gX1hCRUdJTl9TVEFSVEVEKSB7CisgICAgICAvKiBXZSBoYXZlIHN1Y2Nlc3NmdWxseSBzdGFydGVkIHNwZWN1bGF0aW9uLiBDaGVjayB0aGF0IG5vLW9uZSBhY3F1aXJlZAorICAgICAgICAgdGhlIGxvY2sgZm9yIHJlYWwgYmV0d2VlbiB3aGVuIHdlIGxhc3QgbG9va2VkIGFuZCBub3cuIFRoaXMgYWxzbyBnZXRzCisgICAgICAgICB0aGUgbG9jayBjYWNoZSBsaW5lIGludG8gb3VyIHJlYWQtc2V0LCB3aGljaCB3ZSBuZWVkIHNvIHRoYXQgd2UnbGwKKyAgICAgICAgIGFib3J0IGlmIGFueW9uZSBsYXRlciBjbGFpbXMgaXQgZm9yIHJlYWwuICovCisgICAgICBpZiAoIV9fa21wX2lzX3VubG9ja2VkX3F1ZXVpbmdfbG9jayhHRVRfUUxLX1BUUihsY2spKSkgeworICAgICAgICAvLyBMb2NrIGlzIG5vdyB2aXNpYmx5IGFjcXVpcmVkLCBzbyBzb21lb25lIGJlYXQgdXMgdG8gaXQuIEFib3J0IHRoZQorICAgICAgICAvLyB0cmFuc2FjdGlvbiBzbyB3ZSdsbCByZXN0YXJ0IGZyb20gX3hiZWdpbiB3aXRoIHRoZSBmYWlsdXJlIHN0YXR1cy4KKyAgICAgICAgX3hhYm9ydCgweDAxKTsKKyAgICAgICAgS01QX0FTU0VSVDIoMCwgInNob3VsZCBub3QgZ2V0IGhlcmUiKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAxOyAvLyBMb2NrIGhhcyBiZWVuIGFjcXVpcmVkIChzcGVjdWxhdGl2ZWx5KQorICAgIH0gZWxzZSB7CisgICAgICAvLyBXZSBoYXZlIGFib3J0ZWQsIHVwZGF0ZSB0aGUgc3RhdGlzdGljcworICAgICAgaWYgKHN0YXR1cyAmIFNPRlRfQUJPUlRfTUFTSykgeworICAgICAgICBLTVBfSU5DX1NUQVQobGNrLCBzb2Z0RmFpbGVkU3BlY3VsYXRpb25zKTsKKyAgICAgICAgLy8gYW5kIGxvb3Agcm91bmQgdG8gcmV0cnkuCisgICAgICB9IGVsc2UgeworICAgICAgICBLTVBfSU5DX1NUQVQobGNrLCBoYXJkRmFpbGVkU3BlY3VsYXRpb25zKTsKKyAgICAgICAgLy8gR2l2ZSB1cCBpZiB3ZSBoYWQgYSBoYXJkIGZhaWx1cmUuCisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfSB3aGlsZSAocmV0cmllcy0tKTsgLy8gTG9vcCB3aGlsZSB3ZSBoYXZlIHJldHJpZXMsIGFuZCBkaWRuJ3QgZmFpbCBoYXJkLgorCisgIC8vIEVpdGhlciB3ZSBoYWQgYSBoYXJkIGZhaWx1cmUgb3Igd2UgZGlkbid0IHN1Y2NlZWQgc29mdGx5IGFmdGVyCisgIC8vIHRoZSBmdWxsIHNldCBvZiBhdHRlbXB0cywgc28gYmFjayBvZmYgdGhlIGJhZG5lc3MuCisgIF9fa21wX3N0ZXBfYmFkbmVzcyhsY2spOworICByZXR1cm4gMDsKK30KKworLy8gQXR0ZW1wdCB0byBhY3F1aXJlIHRoZSBzcGVjdWxhdGl2ZSBsb2NrLCBvciBiYWNrIG9mZiB0byB0aGUgbm9uLXNwZWN1bGF0aXZlCisvLyBvbmUgaWYgdGhlIHNwZWN1bGF0aXZlIGxvY2sgY2Fubm90IGJlIGFjcXVpcmVkLgorLy8gV2UgY2FuIHN1Y2NlZWQgc3BlY3VsYXRpdmVseSwgbm9uLXNwZWN1bGF0aXZlbHksIG9yIGZhaWwuCitzdGF0aWMgaW50IF9fa21wX3Rlc3RfYWRhcHRpdmVfbG9jayhrbXBfYWRhcHRpdmVfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKSB7CisgIC8vIEZpcnN0IHRyeSB0byBhY3F1aXJlIHRoZSBsb2NrIHNwZWN1bGF0aXZlbHkKKyAgaWYgKF9fa21wX3Nob3VsZF9zcGVjdWxhdGUobGNrLCBndGlkKSAmJgorICAgICAgX19rbXBfdGVzdF9hZGFwdGl2ZV9sb2NrX29ubHkobGNrLCBndGlkKSkKKyAgICByZXR1cm4gMTsKKworICAvLyBTcGVjdWxhdGl2ZSBhY3F1aXNpdGlvbiBmYWlsZWQsIHNvIHRyeSB0byBhY3F1aXJlIGl0IG5vbi1zcGVjdWxhdGl2ZWx5LgorICAvLyBDb3VudCB0aGUgbm9uLXNwZWN1bGF0aXZlIGFjcXVpcmUgYXR0ZW1wdAorICBsY2stPmxrLmFkYXB0aXZlLmFjcXVpcmVfYXR0ZW1wdHMrKzsKKworICAvLyBVc2UgYmFzZSwgbm9uLXNwZWN1bGF0aXZlIGxvY2suCisgIGlmIChfX2ttcF90ZXN0X3F1ZXVpbmdfbG9jayhHRVRfUUxLX1BUUihsY2spLCBndGlkKSkgeworICAgIEtNUF9JTkNfU1RBVChsY2ssIG5vblNwZWN1bGF0aXZlQWNxdWlyZXMpOworICAgIHJldHVybiAxOyAvLyBMb2NrIGlzIGFjcXVpcmVkIChub24tc3BlY3VsYXRpdmVseSkKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gMDsgLy8gRmFpbGVkIHRvIGFjcXVpcmUgdGhlIGxvY2ssIGl0J3MgYWxyZWFkeSB2aXNpYmx5IGxvY2tlZC4KKyAgfQorfQorCitzdGF0aWMgaW50IF9fa21wX3Rlc3RfYWRhcHRpdmVfbG9ja193aXRoX2NoZWNrcyhrbXBfYWRhcHRpdmVfbG9ja190ICpsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgZ3RpZCkgeworICBjaGFyIGNvbnN0ICpjb25zdCBmdW5jID0gIm9tcF90ZXN0X2xvY2siOworICBpZiAobGNrLT5say5xbGsuaW5pdGlhbGl6ZWQgIT0gR0VUX1FMS19QVFIobGNrKSkgeworICAgIEtNUF9GQVRBTChMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jKTsKKyAgfQorCisgIGludCByZXR2YWwgPSBfX2ttcF90ZXN0X2FkYXB0aXZlX2xvY2sobGNrLCBndGlkKTsKKworICBpZiAocmV0dmFsKSB7CisgICAgbGNrLT5say5xbGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgfQorICByZXR1cm4gcmV0dmFsOworfQorCisvLyBCbG9jayB1bnRpbCB3ZSBjYW4gYWNxdWlyZSBhIHNwZWN1bGF0aXZlLCBhZGFwdGl2ZSBsb2NrLiBXZSBjaGVjayB3aGV0aGVyIHdlCisvLyBzaG91bGQgYmUgdHJ5aW5nIHRvIHNwZWN1bGF0ZS4gSWYgd2Ugc2hvdWxkIGJlLCB3ZSBjaGVjayB0aGUgcmVhbCBsb2NrIHRvIHNlZQorLy8gaWYgaXQgaXMgZnJlZSwgYW5kLCBpZiBub3QsIHBhdXNlIHdpdGhvdXQgYXR0ZW1wdGluZyB0byBhY3F1aXJlIGl0IHVudGlsIGl0CisvLyBpcy4gVGhlbiB3ZSB0cnkgdGhlIHNwZWN1bGF0aXZlIGFjcXVpcmUuIFRoaXMgbWVhbnMgdGhhdCBhbHRob3VnaCB3ZSBzdWZmZXIKKy8vIGZyb20gbGVtbWluZ3MgYSBsaXR0bGUgKGJlY2F1c2UgYWxsIHdlIGNhbid0IGFjcXVpcmUgdGhlIGxvY2sgc3BlY3VsYXRpdmVseQorLy8gdW50aWwgdGhlIHF1ZXVlIG9mIHRocmVhZHMgd2FpdGluZyBoYXMgY2xlYXJlZCksIHdlIGRvbid0IGdldCBpbnRvIGEgc3RhdGUKKy8vIHdoZXJlIHdlIGNhbiBuZXZlciBhY3F1aXJlIHRoZSBsb2NrIHNwZWN1bGF0aXZlbHkgKGJlY2F1c2Ugd2UgZm9yY2UgdGhlIHF1ZXVlCisvLyB0byBjbGVhciBieSBwcmV2ZW50aW5nIG5ldyBhcnJpdmFscyBmcm9tIGVudGVyaW5nIHRoZSBxdWV1ZSkuIFRoaXMgZG9lcyBtZWFuCisvLyB0aGF0IHdoZW4gd2UncmUgdHJ5aW5nIHRvIGJyZWFrIGxlbW1pbmdzLCB0aGUgbG9jayBpcyBubyBsb25nZXIgZmFpci4gSG93ZXZlcgorLy8gT3Blbk1QIG1ha2VzIG5vIGd1YXJhbnRlZSB0aGF0IGl0cyBsb2NrcyBhcmUgZmFpciwgc28gdGhpcyBpc24ndCBhIHJlYWwKKy8vIHByb2JsZW0uCitzdGF0aWMgdm9pZCBfX2ttcF9hY3F1aXJlX2FkYXB0aXZlX2xvY2soa21wX2FkYXB0aXZlX2xvY2tfdCAqbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKSB7CisgIGlmIChfX2ttcF9zaG91bGRfc3BlY3VsYXRlKGxjaywgZ3RpZCkpIHsKKyAgICBpZiAoX19rbXBfaXNfdW5sb2NrZWRfcXVldWluZ19sb2NrKEdFVF9RTEtfUFRSKGxjaykpKSB7CisgICAgICBpZiAoX19rbXBfdGVzdF9hZGFwdGl2ZV9sb2NrX29ubHkobGNrLCBndGlkKSkKKyAgICAgICAgcmV0dXJuOworICAgICAgLy8gV2UgdHJpZWQgc3BlY3VsYXRpb24gYW5kIGZhaWxlZCwgc28gZ2l2ZSB1cC4KKyAgICB9IGVsc2UgeworICAgICAgLy8gV2UgY2FuJ3QgdHJ5IHNwZWN1bGF0aW9uIHVudGlsIHRoZSBsb2NrIGlzIGZyZWUsIHNvIHdlIHBhdXNlIGhlcmUKKyAgICAgIC8vICh3aXRob3V0IHN1c3BlbmRpbmcgb24gdGhlIHF1ZXVlaW5nIGxvY2ssIHRvIGFsbG93IGl0IHRvIGRyYWluLCB0aGVuCisgICAgICAvLyB0cnkgYWdhaW4uIEFsbCBvdGhlciB0aHJlYWRzIHdpbGwgYWxzbyBzZWUgdGhlIHNhbWUgcmVzdWx0IGZvcgorICAgICAgLy8gc2hvdWxkU3BlY3VsYXRlLCBzbyB3aWxsIGJlIGRvaW5nIHRoZSBzYW1lIGlmIHRoZXkgdHJ5IHRvIGNsYWltIHRoZQorICAgICAgLy8gbG9jayBmcm9tIG5vdyBvbi4KKyAgICAgIHdoaWxlICghX19rbXBfaXNfdW5sb2NrZWRfcXVldWluZ19sb2NrKEdFVF9RTEtfUFRSKGxjaykpKSB7CisgICAgICAgIEtNUF9JTkNfU1RBVChsY2ssIGxlbW1pbmdZaWVsZHMpOworICAgICAgICBfX2ttcF95aWVsZChUUlVFKTsKKyAgICAgIH0KKworICAgICAgaWYgKF9fa21wX3Rlc3RfYWRhcHRpdmVfbG9ja19vbmx5KGxjaywgZ3RpZCkpCisgICAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICAvLyBTcGVjdWxhdGl2ZSBhY3F1aXNpdGlvbiBmYWlsZWQsIHNvIGFjcXVpcmUgaXQgbm9uLXNwZWN1bGF0aXZlbHkuCisgIC8vIENvdW50IHRoZSBub24tc3BlY3VsYXRpdmUgYWNxdWlyZSBhdHRlbXB0CisgIGxjay0+bGsuYWRhcHRpdmUuYWNxdWlyZV9hdHRlbXB0cysrOworCisgIF9fa21wX2FjcXVpcmVfcXVldWluZ19sb2NrX3RpbWVkX3RlbXBsYXRlPEZBTFNFPihHRVRfUUxLX1BUUihsY2spLCBndGlkKTsKKyAgLy8gV2UgaGF2ZSBhY3F1aXJlZCB0aGUgYmFzZSBsb2NrLCBzbyBjb3VudCB0aGF0LgorICBLTVBfSU5DX1NUQVQobGNrLCBub25TcGVjdWxhdGl2ZUFjcXVpcmVzKTsKKyAgQU5OT1RBVEVfUVVFVUlOR19BQ1FVSVJFRChsY2spOworfQorCitzdGF0aWMgdm9pZCBfX2ttcF9hY3F1aXJlX2FkYXB0aXZlX2xvY2tfd2l0aF9jaGVja3Moa21wX2FkYXB0aXZlX2xvY2tfdCAqbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKSB7CisgIGNoYXIgY29uc3QgKmNvbnN0IGZ1bmMgPSAib21wX3NldF9sb2NrIjsKKyAgaWYgKGxjay0+bGsucWxrLmluaXRpYWxpemVkICE9IEdFVF9RTEtfUFRSKGxjaykpIHsKKyAgICBLTVBfRkFUQUwoTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyk7CisgIH0KKyAgaWYgKF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoR0VUX1FMS19QVFIobGNrKSkgPT0gZ3RpZCkgeworICAgIEtNUF9GQVRBTChMb2NrSXNBbHJlYWR5T3duZWQsIGZ1bmMpOworICB9CisKKyAgX19rbXBfYWNxdWlyZV9hZGFwdGl2ZV9sb2NrKGxjaywgZ3RpZCk7CisKKyAgbGNrLT5say5xbGsub3duZXJfaWQgPSBndGlkICsgMTsKK30KKworc3RhdGljIGludCBfX2ttcF9yZWxlYXNlX2FkYXB0aXZlX2xvY2soa21wX2FkYXB0aXZlX2xvY2tfdCAqbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGd0aWQpIHsKKyAgaWYgKF9fa21wX2lzX3VubG9ja2VkX3F1ZXVpbmdfbG9jayhHRVRfUUxLX1BUUigKKyAgICAgICAgICBsY2spKSkgeyAvLyBJZiB0aGUgbG9jayBkb2Vzbid0IGxvb2sgY2xhaW1lZCB3ZSBtdXN0IGJlIHNwZWN1bGF0aW5nLgorICAgIC8vIChPciB0aGUgdXNlcidzIGNvZGUgaXMgYnVnZ3kgYW5kIHRoZXkncmUgcmVsZWFzaW5nIHdpdGhvdXQgbG9ja2luZzsKKyAgICAvLyBpZiB3ZSBoYWQgWFRFU1Qgd2UnZCBiZSBhYmxlIHRvIGNoZWNrIHRoYXQgY2FzZS4uLikKKyAgICBfeGVuZCgpOyAvLyBFeGl0IHNwZWN1bGF0aW9uCisgICAgX19rbXBfdXBkYXRlX2JhZG5lc3NfYWZ0ZXJfc3VjY2VzcyhsY2spOworICB9IGVsc2UgeyAvLyBTaW5jZSB0aGUgbG9jayAqaXMqIHZpc2libHkgbG9ja2VkIHdlJ3JlIG5vdCBzcGVjdWxhdGluZywKKyAgICAvLyBzbyBzaG91bGQgdXNlIHRoZSB1bmRlcmx5aW5nIGxvY2sncyByZWxlYXNlIHNjaGVtZS4KKyAgICBfX2ttcF9yZWxlYXNlX3F1ZXVpbmdfbG9jayhHRVRfUUxLX1BUUihsY2spLCBndGlkKTsKKyAgfQorICByZXR1cm4gS01QX0xPQ0tfUkVMRUFTRUQ7Cit9CisKK3N0YXRpYyBpbnQgX19rbXBfcmVsZWFzZV9hZGFwdGl2ZV9sb2NrX3dpdGhfY2hlY2tzKGttcF9hZGFwdGl2ZV9sb2NrX3QgKmxjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKSB7CisgIGNoYXIgY29uc3QgKmNvbnN0IGZ1bmMgPSAib21wX3Vuc2V0X2xvY2siOworICBLTVBfTUIoKTsgLyogaW4gY2FzZSBhbm90aGVyIHByb2Nlc3NvciBpbml0aWFsaXplZCBsb2NrICovCisgIGlmIChsY2stPmxrLnFsay5pbml0aWFsaXplZCAhPSBHRVRfUUxLX1BUUihsY2spKSB7CisgICAgS01QX0ZBVEFMKExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMpOworICB9CisgIGlmIChfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKEdFVF9RTEtfUFRSKGxjaykpID09IC0xKSB7CisgICAgS01QX0ZBVEFMKExvY2tVbnNldHRpbmdGcmVlLCBmdW5jKTsKKyAgfQorICBpZiAoX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lcihHRVRfUUxLX1BUUihsY2spKSAhPSBndGlkKSB7CisgICAgS01QX0ZBVEFMKExvY2tVbnNldHRpbmdTZXRCeUFub3RoZXIsIGZ1bmMpOworICB9CisgIGxjay0+bGsucWxrLm93bmVyX2lkID0gMDsKKyAgX19rbXBfcmVsZWFzZV9hZGFwdGl2ZV9sb2NrKGxjaywgZ3RpZCk7CisgIHJldHVybiBLTVBfTE9DS19SRUxFQVNFRDsKK30KKworc3RhdGljIHZvaWQgX19rbXBfaW5pdF9hZGFwdGl2ZV9sb2NrKGttcF9hZGFwdGl2ZV9sb2NrX3QgKmxjaykgeworICBfX2ttcF9pbml0X3F1ZXVpbmdfbG9jayhHRVRfUUxLX1BUUihsY2spKTsKKyAgbGNrLT5say5hZGFwdGl2ZS5iYWRuZXNzID0gMDsKKyAgbGNrLT5say5hZGFwdGl2ZS5hY3F1aXJlX2F0dGVtcHRzID0gMDsgLy8gbm9uU3BlY3VsYXRpdmVBY3F1aXJlQXR0ZW1wdHMgPSAwOworICBsY2stPmxrLmFkYXB0aXZlLm1heF9zb2Z0X3JldHJpZXMgPQorICAgICAgX19rbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXMubWF4X3NvZnRfcmV0cmllczsKKyAgbGNrLT5say5hZGFwdGl2ZS5tYXhfYmFkbmVzcyA9IF9fa21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zLm1heF9iYWRuZXNzOworI2lmIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUworICBfX2ttcF96ZXJvX3NwZWN1bGF0aXZlX3N0YXRzKCZsY2stPmxrLmFkYXB0aXZlKTsKKyNlbmRpZgorICBLQV9UUkFDRSgxMDAwLCAoIl9fa21wX2luaXRfYWRhcHRpdmVfbG9jazogbG9jayAlcCBpbml0aWFsaXplZFxuIiwgbGNrKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fa21wX2luaXRfYWRhcHRpdmVfbG9ja193aXRoX2NoZWNrcyhrbXBfYWRhcHRpdmVfbG9ja190ICpsY2spIHsKKyAgX19rbXBfaW5pdF9hZGFwdGl2ZV9sb2NrKGxjayk7Cit9CisKK3N0YXRpYyB2b2lkIF9fa21wX2Rlc3Ryb3lfYWRhcHRpdmVfbG9jayhrbXBfYWRhcHRpdmVfbG9ja190ICpsY2spIHsKKyNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKyAgX19rbXBfYWNjdW11bGF0ZV9zcGVjdWxhdGl2ZV9zdGF0cygmbGNrLT5say5hZGFwdGl2ZSk7CisjZW5kaWYKKyAgX19rbXBfZGVzdHJveV9xdWV1aW5nX2xvY2soR0VUX1FMS19QVFIobGNrKSk7CisgIC8vIE5vdGhpbmcgbmVlZGVkIGZvciB0aGUgc3BlY3VsYXRpdmUgcGFydC4KK30KKworc3RhdGljIHZvaWQgX19rbXBfZGVzdHJveV9hZGFwdGl2ZV9sb2NrX3dpdGhfY2hlY2tzKGttcF9hZGFwdGl2ZV9sb2NrX3QgKmxjaykgeworICBjaGFyIGNvbnN0ICpjb25zdCBmdW5jID0gIm9tcF9kZXN0cm95X2xvY2siOworICBpZiAobGNrLT5say5xbGsuaW5pdGlhbGl6ZWQgIT0gR0VUX1FMS19QVFIobGNrKSkgeworICAgIEtNUF9GQVRBTChMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jKTsKKyAgfQorICBpZiAoX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lcihHRVRfUUxLX1BUUihsY2spKSAhPSAtMSkgeworICAgIEtNUF9GQVRBTChMb2NrU3RpbGxPd25lZCwgZnVuYyk7CisgIH0KKyAgX19rbXBfZGVzdHJveV9hZGFwdGl2ZV9sb2NrKGxjayk7Cit9CisKKyNlbmRpZiAvLyBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogRFJEUEEgdGlja2V0IGxvY2tzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICJEUkRQQSIgbWVhbnMgRHluYW1pY2FsbHkgUmVjb25maWd1cmFibGUgRGlzdHJpYnV0ZWQgUG9sbGluZyBBcmVhICovCisKK3N0YXRpYyBrbXBfaW50MzIgX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIoa21wX2RyZHBhX2xvY2tfdCAqbGNrKSB7CisgIHJldHVybiBUQ1JfNChsY2stPmxrLm93bmVyX2lkKSAtIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBfX2ttcF9pc19kcmRwYV9sb2NrX25lc3RhYmxlKGttcF9kcmRwYV9sb2NrX3QgKmxjaykgeworICByZXR1cm4gbGNrLT5say5kZXB0aF9sb2NrZWQgIT0gLTE7Cit9CisKK19fZm9yY2VpbmxpbmUgc3RhdGljIGludAorX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrX3RpbWVkX3RlbXBsYXRlKGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpIHsKKyAga21wX3VpbnQ2NCB0aWNrZXQgPQorICAgICAgS01QX1RFU1RfVEhFTl9JTkM2NChSQ0FTVCh2b2xhdGlsZSBrbXBfaW50NjQgKiwgJmxjay0+bGsubmV4dF90aWNrZXQpKTsKKyAga21wX3VpbnQ2NCBtYXNrID0gVENSXzgobGNrLT5say5tYXNrKTsgLy8gdm9sYXRpbGUgbG9hZAorICB2b2xhdGlsZSBzdHJ1Y3Qga21wX2Jhc2VfZHJkcGFfbG9jazo6a21wX2xvY2tfcG9sbCAqcG9sbHMgPSBsY2stPmxrLnBvbGxzOworCisjaWZkZWYgVVNFX0xPQ0tfUFJPRklMRQorICBpZiAoVENSXzgocG9sbHNbdGlja2V0ICYgbWFza10ucG9sbCkgIT0gdGlja2V0KQorICAgIF9fa21wX3ByaW50ZigiTE9DSyBDT05URU5USU9OOiAlcFxuIiwgbGNrKTsKKy8qIGVsc2UgX19rbXBfcHJpbnRmKCAiLiIgKTsqLworI2VuZGlmIC8qIFVTRV9MT0NLX1BST0ZJTEUgKi8KKworICAvLyBOb3cgc3Bpbi13YWl0LCBidXQgcmVsb2FkIHRoZSBwb2xscyBwb2ludGVyIGFuZCBtYXNrLCBpbiBjYXNlIHRoZQorICAvLyBwb2xsaW5nIGFyZWEgaGFzIGJlZW4gcmVjb25maWd1cmVkLiAgVW5sZXNzIGl0IGlzIHJlY29uZmlndXJlZCwgdGhlCisgIC8vIHJlbG9hZHMgc3RheSBpbiBMMSBjYWNoZSBhbmQgYXJlIGNoZWFwLgorICAvLworICAvLyBLZWVwIHRoaXMgY29kZSBpbiBzeW5jIHdpdGggS01QX1dBSVRfWUlFTEQsIGluIGttcF9kaXNwYXRjaC5jcHAgISEhCisgIC8vCisgIC8vIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIEtNUF9XQUlUX1lJRUxEIGRvZXNuJ3QgYWxsb3cgZm9yIG1hc2sKKyAgLy8gYW5kIHBvbGwgdG8gYmUgcmUtcmVhZCBldmVyeSBzcGluIGl0ZXJhdGlvbi4KKyAga21wX3VpbnQzMiBzcGluczsKKworICBLTVBfRlNZTkNfUFJFUEFSRShsY2spOworICBLTVBfSU5JVF9ZSUVMRChzcGlucyk7CisgIHdoaWxlIChUQ1JfOChwb2xsc1t0aWNrZXQgJiBtYXNrXS5wb2xsKSA8IHRpY2tldCkgeyAvLyB2b2xhdGlsZSBsb2FkCisgICAgLy8gSWYgd2UgYXJlIG92ZXJzdWJzY3JpYmVkLAorICAgIC8vIG9yIGhhdmUgd2FpdGVkIGEgYml0IChhbmQgS01QX0xJQlJBUlk9dHVybmFyb3VuZCksIHRoZW4geWllbGQuCisgICAgLy8gQ1BVIFBhdXNlIGlzIGluIHRoZSBtYWNyb3MgZm9yIHlpZWxkLgorICAgIC8vCisgICAgS01QX1lJRUxEKFRDUl80KF9fa21wX250aCkgPgorICAgICAgICAgICAgICAoX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOiBfX2ttcF94cHJvYykpOworICAgIEtNUF9ZSUVMRF9TUElOKHNwaW5zKTsKKworICAgIC8vIFJlLXJlYWQgdGhlIG1hc2sgYW5kIHRoZSBwb2xsIHBvaW50ZXIgZnJvbSB0aGUgbG9jayBzdHJ1Y3R1cmUuCisgICAgLy8KKyAgICAvLyBNYWtlIGNlcnRhaW4gdGhhdCAibWFzayIgaXMgcmVhZCBiZWZvcmUgInBvbGxzIiAhISEKKyAgICAvLworICAgIC8vIElmIGFub3RoZXIgdGhyZWFkIHBpY2tzIHJlY29uZmlndXJlcyB0aGUgcG9sbGluZyBhcmVhIGFuZCB1cGRhdGVzIHRoZWlyCisgICAgLy8gdmFsdWVzLCBhbmQgd2UgZ2V0IHRoZSBuZXcgdmFsdWUgb2YgbWFzayBhbmQgdGhlIG9sZCBwb2xscyBwb2ludGVyLCB3ZQorICAgIC8vIGNvdWxkIGFjY2VzcyBtZW1vcnkgYmV5b25kIHRoZSBlbmQgb2YgdGhlIG9sZCBwb2xsaW5nIGFyZWEuCisgICAgbWFzayA9IFRDUl84KGxjay0+bGsubWFzayk7IC8vIHZvbGF0aWxlIGxvYWQKKyAgICBwb2xscyA9IGxjay0+bGsucG9sbHM7IC8vIHZvbGF0aWxlIGxvYWQKKyAgfQorCisgIC8vIENyaXRpY2FsIHNlY3Rpb24gc3RhcnRzIGhlcmUKKyAgS01QX0ZTWU5DX0FDUVVJUkVEKGxjayk7CisgIEtBX1RSQUNFKDEwMDAsICgiX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrOiB0aWNrZXQgIyVsbGQgYWNxdWlyZWQgbG9jayAlcFxuIiwKKyAgICAgICAgICAgICAgICAgIHRpY2tldCwgbGNrKSk7CisgIGxjay0+bGsubm93X3NlcnZpbmcgPSB0aWNrZXQ7IC8vIG5vbi12b2xhdGlsZSBzdG9yZQorCisgIC8vIERlYWxsb2NhdGUgYSBnYXJiYWdlIHBvbGxpbmcgYXJlYSBpZiB3ZSBrbm93IHRoYXQgd2UgYXJlIHRoZSBsYXN0CisgIC8vIHRocmVhZCB0aGF0IGNvdWxkIHBvc3NpYmx5IGFjY2VzcyBpdC4KKyAgLy8KKyAgLy8gVGhlID49IGNoZWNrIGlzIGluIGNhc2UgX19rbXBfdGVzdF9kcmRwYV9sb2NrKCkgYWxsb2NhdGVkIHRoZSBjbGVhbnVwCisgIC8vIHRpY2tldC4KKyAgaWYgKChsY2stPmxrLm9sZF9wb2xscyAhPSBOVUxMKSAmJiAodGlja2V0ID49IGxjay0+bGsuY2xlYW51cF90aWNrZXQpKSB7CisgICAgX19rbXBfZnJlZShDQ0FTVChrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICosIGxjay0+bGsub2xkX3BvbGxzKSk7CisgICAgbGNrLT5say5vbGRfcG9sbHMgPSBOVUxMOworICAgIGxjay0+bGsuY2xlYW51cF90aWNrZXQgPSAwOworICB9CisKKyAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIHNob3VsZCByZWNvbmZpZ3VyZSB0aGUgcG9sbGluZyBhcmVhLgorICAvLyBJZiB0aGVyZSBpcyBzdGlsbCBhIGdhcmJhZ2UgcG9sbGluZyBhcmVhIHRvIGJlIGRlYWxsb2NhdGVkIGZyb20gYQorICAvLyBwcmV2aW91cyByZWNvbmZpZ3VyYXRpb24sIGxldCBhIGxhdGVyIHRocmVhZCByZWNvbmZpZ3VyZSBpdC4KKyAgaWYgKGxjay0+bGsub2xkX3BvbGxzID09IE5VTEwpIHsKKyAgICBib29sIHJlY29uZmlndXJlID0gZmFsc2U7CisgICAgdm9sYXRpbGUgc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2s6OmttcF9sb2NrX3BvbGwgKm9sZF9wb2xscyA9IHBvbGxzOworICAgIGttcF91aW50MzIgbnVtX3BvbGxzID0gVENSXzQobGNrLT5say5udW1fcG9sbHMpOworCisgICAgaWYgKFRDUl80KF9fa21wX250aCkgPgorICAgICAgICAoX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOiBfX2ttcF94cHJvYykpIHsKKyAgICAgIC8vIFdlIGFyZSBpbiBvdmVyc3Vic2NyaXB0aW9uIG1vZGUuICBDb250cmFjdCB0aGUgcG9sbGluZyBhcmVhCisgICAgICAvLyBkb3duIHRvIGEgc2luZ2xlIGxvY2F0aW9uLCBpZiB0aGF0IGhhc24ndCBiZWVuIGRvbmUgYWxyZWFkeS4KKyAgICAgIGlmIChudW1fcG9sbHMgPiAxKSB7CisgICAgICAgIHJlY29uZmlndXJlID0gdHJ1ZTsKKyAgICAgICAgbnVtX3BvbGxzID0gVENSXzQobGNrLT5say5udW1fcG9sbHMpOworICAgICAgICBtYXNrID0gMDsKKyAgICAgICAgbnVtX3BvbGxzID0gMTsKKyAgICAgICAgcG9sbHMgPSAodm9sYXRpbGUgc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2s6OmttcF9sb2NrX3BvbGwgKikKKyAgICAgICAgICAgIF9fa21wX2FsbG9jYXRlKG51bV9wb2xscyAqIHNpemVvZigqcG9sbHMpKTsKKyAgICAgICAgcG9sbHNbMF0ucG9sbCA9IHRpY2tldDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gV2UgYXJlIGluIHVuZGVyL2Z1bGx5IHN1YnNjcmliZWQgbW9kZS4gIENoZWNrIHRoZSBudW1iZXIgb2YKKyAgICAgIC8vIHRocmVhZHMgd2FpdGluZyBvbiB0aGUgbG9jay4gIFRoZSBzaXplIG9mIHRoZSBwb2xsaW5nIGFyZWEKKyAgICAgIC8vIHNob3VsZCBiZSBhdCBsZWFzdCB0aGUgbnVtYmVyIG9mIHRocmVhZHMgd2FpdGluZy4KKyAgICAgIGttcF91aW50NjQgbnVtX3dhaXRpbmcgPSBUQ1JfOChsY2stPmxrLm5leHRfdGlja2V0KSAtIHRpY2tldCAtIDE7CisgICAgICBpZiAobnVtX3dhaXRpbmcgPiBudW1fcG9sbHMpIHsKKyAgICAgICAga21wX3VpbnQzMiBvbGRfbnVtX3BvbGxzID0gbnVtX3BvbGxzOworICAgICAgICByZWNvbmZpZ3VyZSA9IHRydWU7CisgICAgICAgIGRvIHsKKyAgICAgICAgICBtYXNrID0gKG1hc2sgPDwgMSkgfCAxOworICAgICAgICAgIG51bV9wb2xscyAqPSAyOworICAgICAgICB9IHdoaWxlIChudW1fcG9sbHMgPD0gbnVtX3dhaXRpbmcpOworCisgICAgICAgIC8vIEFsbG9jYXRlIHRoZSBuZXcgcG9sbGluZyBhcmVhLCBhbmQgY29weSB0aGUgcmVsZXZhbnQgcG9ydGlvbgorICAgICAgICAvLyBvZiB0aGUgb2xkIHBvbGxpbmcgYXJlYSB0byB0aGUgbmV3IGFyZWEuICBfX2ttcF9hbGxvY2F0ZSgpCisgICAgICAgIC8vIHplcm9lcyB0aGUgbWVtb3J5IGl0IGFsbG9jYXRlcywgYW5kIG1vc3Qgb2YgdGhlIG9sZCBhcmVhIGlzCisgICAgICAgIC8vIGp1c3QgemVybyBwYWRkaW5nLCBzbyB3ZSBvbmx5IGNvcHkgdGhlIHJlbGVhc2UgY291bnRlcnMuCisgICAgICAgIHBvbGxzID0gKHZvbGF0aWxlIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICopCisgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZShudW1fcG9sbHMgKiBzaXplb2YoKnBvbGxzKSk7CisgICAgICAgIGttcF91aW50MzIgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG9sZF9udW1fcG9sbHM7IGkrKykgeworICAgICAgICAgIHBvbGxzW2ldLnBvbGwgPSBvbGRfcG9sbHNbaV0ucG9sbDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChyZWNvbmZpZ3VyZSkgeworICAgICAgLy8gTm93IHdyaXRlIHRoZSB1cGRhdGVkIGZpZWxkcyBiYWNrIHRvIHRoZSBsb2NrIHN0cnVjdHVyZS4KKyAgICAgIC8vCisgICAgICAvLyBNYWtlIGNlcnRhaW4gdGhhdCAicG9sbHMiIGlzIHdyaXR0ZW4gYmVmb3JlICJtYXNrIiAhISEKKyAgICAgIC8vCisgICAgICAvLyBJZiBhbm90aGVyIHRocmVhZCBwaWNrcyB1cCB0aGUgbmV3IHZhbHVlIG9mIG1hc2sgYW5kIHRoZSBvbGQgcG9sbHMKKyAgICAgIC8vIHBvaW50ZXIgLCBpdCBjb3VsZCBhY2Nlc3MgbWVtb3J5IGJleW9uZCB0aGUgZW5kIG9mIHRoZSBvbGQgcG9sbGluZworICAgICAgLy8gYXJlYS4KKyAgICAgIC8vCisgICAgICAvLyBPbiB4ODYsIHdlIG5lZWQgbWVtb3J5IGZlbmNlcy4KKyAgICAgIEtBX1RSQUNFKDEwMDAsICgiX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrOiB0aWNrZXQgIyVsbGQgcmVjb25maWd1cmluZyAiCisgICAgICAgICAgICAgICAgICAgICAgImxvY2sgJXAgdG8gJWQgcG9sbHNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgdGlja2V0LCBsY2ssIG51bV9wb2xscykpOworCisgICAgICBsY2stPmxrLm9sZF9wb2xscyA9IG9sZF9wb2xsczsgLy8gbm9uLXZvbGF0aWxlIHN0b3JlCisgICAgICBsY2stPmxrLnBvbGxzID0gcG9sbHM7IC8vIHZvbGF0aWxlIHN0b3JlCisKKyAgICAgIEtNUF9NQigpOworCisgICAgICBsY2stPmxrLm51bV9wb2xscyA9IG51bV9wb2xsczsgLy8gbm9uLXZvbGF0aWxlIHN0b3JlCisgICAgICBsY2stPmxrLm1hc2sgPSBtYXNrOyAvLyB2b2xhdGlsZSBzdG9yZQorCisgICAgICBLTVBfTUIoKTsKKworICAgICAgLy8gT25seSBhZnRlciB0aGUgbmV3IHBvbGxpbmcgYXJlYSBhbmQgbWFzayBoYXZlIGJlZW4gZmx1c2hlZAorICAgICAgLy8gdG8gbWFpbiBtZW1vcnkgY2FuIHdlIHVwZGF0ZSB0aGUgY2xlYW51cCB0aWNrZXQgZmllbGQuCisgICAgICAvLworICAgICAgLy8gdm9sYXRpbGUgbG9hZCAvIG5vbi12b2xhdGlsZSBzdG9yZQorICAgICAgbGNrLT5say5jbGVhbnVwX3RpY2tldCA9IFRDUl84KGxjay0+bGsubmV4dF90aWNrZXQpOworICAgIH0KKyAgfQorICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfRklSU1Q7Cit9CisKK2ludCBfX2ttcF9hY3F1aXJlX2RyZHBhX2xvY2soa21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCkgeworICBpbnQgcmV0dmFsID0gX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrX3RpbWVkX3RlbXBsYXRlKGxjaywgZ3RpZCk7CisgIEFOTk9UQVRFX0RSRFBBX0FDUVVJUkVEKGxjayk7CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrX3dpdGhfY2hlY2tzKGttcF9kcmRwYV9sb2NrX3QgKmxjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKSB7CisgIGNoYXIgY29uc3QgKmNvbnN0IGZ1bmMgPSAib21wX3NldF9sb2NrIjsKKyAgaWYgKGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrKSB7CisgICAgS01QX0ZBVEFMKExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMpOworICB9CisgIGlmIChfX2ttcF9pc19kcmRwYV9sb2NrX25lc3RhYmxlKGxjaykpIHsKKyAgICBLTVBfRkFUQUwoTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jKTsKKyAgfQorICBpZiAoKGd0aWQgPj0gMCkgJiYgKF9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKGxjaykgPT0gZ3RpZCkpIHsKKyAgICBLTVBfRkFUQUwoTG9ja0lzQWxyZWFkeU93bmVkLCBmdW5jKTsKKyAgfQorCisgIF9fa21wX2FjcXVpcmVfZHJkcGFfbG9jayhsY2ssIGd0aWQpOworCisgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX0ZJUlNUOworfQorCitpbnQgX19rbXBfdGVzdF9kcmRwYV9sb2NrKGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpIHsKKyAgLy8gRmlyc3QgZ2V0IGEgdGlja2V0LCB0aGVuIHJlYWQgdGhlIHBvbGxzIHBvaW50ZXIgYW5kIHRoZSBtYXNrLgorICAvLyBUaGUgcG9sbHMgcG9pbnRlciBtdXN0IGJlIHJlYWQgYmVmb3JlIHRoZSBtYXNrISEhIChTZWUgYWJvdmUpCisgIGttcF91aW50NjQgdGlja2V0ID0gVENSXzgobGNrLT5say5uZXh0X3RpY2tldCk7IC8vIHZvbGF0aWxlIGxvYWQKKyAgdm9sYXRpbGUgc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2s6OmttcF9sb2NrX3BvbGwgKnBvbGxzID0gbGNrLT5say5wb2xsczsKKyAga21wX3VpbnQ2NCBtYXNrID0gVENSXzgobGNrLT5say5tYXNrKTsgLy8gdm9sYXRpbGUgbG9hZAorICBpZiAoVENSXzgocG9sbHNbdGlja2V0ICYgbWFza10ucG9sbCkgPT0gdGlja2V0KSB7CisgICAga21wX3VpbnQ2NCBuZXh0X3RpY2tldCA9IHRpY2tldCArIDE7CisgICAgaWYgKEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E2NCgmbGNrLT5say5uZXh0X3RpY2tldCwgdGlja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF90aWNrZXQpKSB7CisgICAgICBLTVBfRlNZTkNfQUNRVUlSRUQobGNrKTsKKyAgICAgIEtBX1RSQUNFKDEwMDAsICgiX19rbXBfdGVzdF9kcmRwYV9sb2NrOiB0aWNrZXQgIyVsbGQgYWNxdWlyZWQgbG9jayAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICB0aWNrZXQsIGxjaykpOworICAgICAgbGNrLT5say5ub3dfc2VydmluZyA9IHRpY2tldDsgLy8gbm9uLXZvbGF0aWxlIHN0b3JlCisKKyAgICAgIC8vIFNpbmNlIG5vIHRocmVhZHMgYXJlIHdhaXRpbmcsIHRoZXJlIGlzIG5vIHBvc3NpYmlsaXR5IHRoYXQgd2Ugd291bGQKKyAgICAgIC8vIHdhbnQgdG8gcmVjb25maWd1cmUgdGhlIHBvbGxpbmcgYXJlYS4gIFdlIG1pZ2h0IGhhdmUgdGhlIGNsZWFudXAgdGlja2V0CisgICAgICAvLyB2YWx1ZSAod2hpY2ggc2F5cyB0aGF0IGl0IGlzIG5vdyBzYWZlIHRvIGRlYWxsb2NhdGUgb2xkX3BvbGxzKSwgYnV0CisgICAgICAvLyB3ZSdsbCBsZXQgYSBsYXRlciB0aHJlYWQgd2hpY2ggY2FsbHMgX19rbXBfYWNxdWlyZV9sb2NrIGRvIHRoYXQgLSB0aGlzCisgICAgICAvLyByb3V0aW5lIGlzbid0IHN1cHBvc2VkIHRvIGJsb2NrLCBhbmQgd2Ugd291bGQgcmlzayBibG9ja3MgaWYgd2UgY2FsbGVkCisgICAgICAvLyBfX2ttcF9mcmVlKCkgdG8gZG8gdGhlIGRlYWxsb2NhdGlvbi4KKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBpbnQgX19rbXBfdGVzdF9kcmRwYV9sb2NrX3dpdGhfY2hlY2tzKGttcF9kcmRwYV9sb2NrX3QgKmxjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKSB7CisgIGNoYXIgY29uc3QgKmNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbG9jayI7CisgIGlmIChsY2stPmxrLmluaXRpYWxpemVkICE9IGxjaykgeworICAgIEtNUF9GQVRBTChMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jKTsKKyAgfQorICBpZiAoX19rbXBfaXNfZHJkcGFfbG9ja19uZXN0YWJsZShsY2spKSB7CisgICAgS01QX0ZBVEFMKExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyk7CisgIH0KKworICBpbnQgcmV0dmFsID0gX19rbXBfdGVzdF9kcmRwYV9sb2NrKGxjaywgZ3RpZCk7CisKKyAgaWYgKHJldHZhbCkgeworICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgfQorICByZXR1cm4gcmV0dmFsOworfQorCitpbnQgX19rbXBfcmVsZWFzZV9kcmRwYV9sb2NrKGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpIHsKKyAgLy8gUmVhZCB0aGUgdGlja2V0IHZhbHVlIGZyb20gdGhlIGxvY2sgZGF0YSBzdHJ1Y3QsIHRoZW4gdGhlIHBvbGxzIHBvaW50ZXIgYW5kCisgIC8vIHRoZSBtYXNrLiAgVGhlIHBvbGxzIHBvaW50ZXIgbXVzdCBiZSByZWFkIGJlZm9yZSB0aGUgbWFzayEhISAoU2VlIGFib3ZlKQorICBrbXBfdWludDY0IHRpY2tldCA9IGxjay0+bGsubm93X3NlcnZpbmcgKyAxOyAvLyBub24tdm9sYXRpbGUgbG9hZAorICB2b2xhdGlsZSBzdHJ1Y3Qga21wX2Jhc2VfZHJkcGFfbG9jazo6a21wX2xvY2tfcG9sbCAqcG9sbHMgPSBsY2stPmxrLnBvbGxzOworICBrbXBfdWludDY0IG1hc2sgPSBUQ1JfOChsY2stPmxrLm1hc2spOyAvLyB2b2xhdGlsZSBsb2FkCisgIEtBX1RSQUNFKDEwMDAsICgiX19rbXBfcmVsZWFzZV9kcmRwYV9sb2NrOiB0aWNrZXQgIyVsbGQgcmVsZWFzZWQgbG9jayAlcFxuIiwKKyAgICAgICAgICAgICAgICAgIHRpY2tldCAtIDEsIGxjaykpOworICBLTVBfRlNZTkNfUkVMRUFTSU5HKGxjayk7CisgIEFOTk9UQVRFX0RSRFBBX1JFTEVBU0VEKGxjayk7CisgIEtNUF9TVF9SRUw2NCgmKHBvbGxzW3RpY2tldCAmIG1hc2tdLnBvbGwpLCB0aWNrZXQpOyAvLyB2b2xhdGlsZSBzdG9yZQorICByZXR1cm4gS01QX0xPQ0tfUkVMRUFTRUQ7Cit9CisKK3N0YXRpYyBpbnQgX19rbXBfcmVsZWFzZV9kcmRwYV9sb2NrX3dpdGhfY2hlY2tzKGttcF9kcmRwYV9sb2NrX3QgKmxjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKSB7CisgIGNoYXIgY29uc3QgKmNvbnN0IGZ1bmMgPSAib21wX3Vuc2V0X2xvY2siOworICBLTVBfTUIoKTsgLyogaW4gY2FzZSBhbm90aGVyIHByb2Nlc3NvciBpbml0aWFsaXplZCBsb2NrICovCisgIGlmIChsY2stPmxrLmluaXRpYWxpemVkICE9IGxjaykgeworICAgIEtNUF9GQVRBTChMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jKTsKKyAgfQorICBpZiAoX19rbXBfaXNfZHJkcGFfbG9ja19uZXN0YWJsZShsY2spKSB7CisgICAgS01QX0ZBVEFMKExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyk7CisgIH0KKyAgaWYgKF9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKGxjaykgPT0gLTEpIHsKKyAgICBLTVBfRkFUQUwoTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMpOworICB9CisgIGlmICgoZ3RpZCA+PSAwKSAmJiAoX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIobGNrKSA+PSAwKSAmJgorICAgICAgKF9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKGxjaykgIT0gZ3RpZCkpIHsKKyAgICBLTVBfRkFUQUwoTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyk7CisgIH0KKyAgbGNrLT5say5vd25lcl9pZCA9IDA7CisgIHJldHVybiBfX2ttcF9yZWxlYXNlX2RyZHBhX2xvY2sobGNrLCBndGlkKTsKK30KKwordm9pZCBfX2ttcF9pbml0X2RyZHBhX2xvY2soa21wX2RyZHBhX2xvY2tfdCAqbGNrKSB7CisgIGxjay0+bGsubG9jYXRpb24gPSBOVUxMOworICBsY2stPmxrLm1hc2sgPSAwOworICBsY2stPmxrLm51bV9wb2xscyA9IDE7CisgIGxjay0+bGsucG9sbHMgPQorICAgICAgKHZvbGF0aWxlIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICopX19rbXBfYWxsb2NhdGUoCisgICAgICAgICAgbGNrLT5say5udW1fcG9sbHMgKiBzaXplb2YoKihsY2stPmxrLnBvbGxzKSkpOworICBsY2stPmxrLmNsZWFudXBfdGlja2V0ID0gMDsKKyAgbGNrLT5say5vbGRfcG9sbHMgPSBOVUxMOworICBsY2stPmxrLm5leHRfdGlja2V0ID0gMDsKKyAgbGNrLT5say5ub3dfc2VydmluZyA9IDA7CisgIGxjay0+bGsub3duZXJfaWQgPSAwOyAvLyBubyB0aHJlYWQgb3ducyB0aGUgbG9jay4KKyAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAtMTsgLy8gPj0gMCBmb3IgbmVzdGFibGUgbG9ja3MsIC0xIGZvciBzaW1wbGUgbG9ja3MuCisgIGxjay0+bGsuaW5pdGlhbGl6ZWQgPSBsY2s7CisKKyAgS0FfVFJBQ0UoMTAwMCwgKCJfX2ttcF9pbml0X2RyZHBhX2xvY2s6IGxvY2sgJXAgaW5pdGlhbGl6ZWRcbiIsIGxjaykpOworfQorCitzdGF0aWMgdm9pZCBfX2ttcF9pbml0X2RyZHBhX2xvY2tfd2l0aF9jaGVja3Moa21wX2RyZHBhX2xvY2tfdCAqbGNrKSB7CisgIF9fa21wX2luaXRfZHJkcGFfbG9jayhsY2spOworfQorCit2b2lkIF9fa21wX2Rlc3Ryb3lfZHJkcGFfbG9jayhrbXBfZHJkcGFfbG9ja190ICpsY2spIHsKKyAgbGNrLT5say5pbml0aWFsaXplZCA9IE5VTEw7CisgIGxjay0+bGsubG9jYXRpb24gPSBOVUxMOworICBpZiAobGNrLT5say5wb2xscyAhPSBOVUxMKSB7CisgICAgX19rbXBfZnJlZShDQ0FTVChrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICosIGxjay0+bGsucG9sbHMpKTsKKyAgICBsY2stPmxrLnBvbGxzID0gTlVMTDsKKyAgfQorICBpZiAobGNrLT5say5vbGRfcG9sbHMgIT0gTlVMTCkgeworICAgIF9fa21wX2ZyZWUoQ0NBU1Qoa21wX2Jhc2VfZHJkcGFfbG9jazo6a21wX2xvY2tfcG9sbCAqLCBsY2stPmxrLm9sZF9wb2xscykpOworICAgIGxjay0+bGsub2xkX3BvbGxzID0gTlVMTDsKKyAgfQorICBsY2stPmxrLm1hc2sgPSAwOworICBsY2stPmxrLm51bV9wb2xscyA9IDA7CisgIGxjay0+bGsuY2xlYW51cF90aWNrZXQgPSAwOworICBsY2stPmxrLm5leHRfdGlja2V0ID0gMDsKKyAgbGNrLT5say5ub3dfc2VydmluZyA9IDA7CisgIGxjay0+bGsub3duZXJfaWQgPSAwOworICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IC0xOworfQorCitzdGF0aWMgdm9pZCBfX2ttcF9kZXN0cm95X2RyZHBhX2xvY2tfd2l0aF9jaGVja3Moa21wX2RyZHBhX2xvY2tfdCAqbGNrKSB7CisgIGNoYXIgY29uc3QgKmNvbnN0IGZ1bmMgPSAib21wX2Rlc3Ryb3lfbG9jayI7CisgIGlmIChsY2stPmxrLmluaXRpYWxpemVkICE9IGxjaykgeworICAgIEtNUF9GQVRBTChMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jKTsKKyAgfQorICBpZiAoX19rbXBfaXNfZHJkcGFfbG9ja19uZXN0YWJsZShsY2spKSB7CisgICAgS01QX0ZBVEFMKExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyk7CisgIH0KKyAgaWYgKF9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKGxjaykgIT0gLTEpIHsKKyAgICBLTVBfRkFUQUwoTG9ja1N0aWxsT3duZWQsIGZ1bmMpOworICB9CisgIF9fa21wX2Rlc3Ryb3lfZHJkcGFfbG9jayhsY2spOworfQorCisvLyBuZXN0ZWQgZHJkcGEgdGlja2V0IGxvY2tzCisKK2ludCBfX2ttcF9hY3F1aXJlX25lc3RlZF9kcmRwYV9sb2NrKGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpIHsKKyAgS01QX0RFQlVHX0FTU0VSVChndGlkID49IDApOworCisgIGlmIChfX2ttcF9nZXRfZHJkcGFfbG9ja19vd25lcihsY2spID09IGd0aWQpIHsKKyAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCArPSAxOworICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9ORVhUOworICB9IGVsc2UgeworICAgIF9fa21wX2FjcXVpcmVfZHJkcGFfbG9ja190aW1lZF90ZW1wbGF0ZShsY2ssIGd0aWQpOworICAgIEFOTk9UQVRFX0RSRFBBX0FDUVVJUkVEKGxjayk7CisgICAgS01QX01CKCk7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAxOworICAgIEtNUF9NQigpOworICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfRklSU1Q7CisgIH0KK30KKworc3RhdGljIHZvaWQgX19rbXBfYWNxdWlyZV9uZXN0ZWRfZHJkcGFfbG9ja193aXRoX2NoZWNrcyhrbXBfZHJkcGFfbG9ja190ICpsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKSB7CisgIGNoYXIgY29uc3QgKmNvbnN0IGZ1bmMgPSAib21wX3NldF9uZXN0X2xvY2siOworICBpZiAobGNrLT5say5pbml0aWFsaXplZCAhPSBsY2spIHsKKyAgICBLTVBfRkFUQUwoTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyk7CisgIH0KKyAgaWYgKCFfX2ttcF9pc19kcmRwYV9sb2NrX25lc3RhYmxlKGxjaykpIHsKKyAgICBLTVBfRkFUQUwoTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jKTsKKyAgfQorICBfX2ttcF9hY3F1aXJlX25lc3RlZF9kcmRwYV9sb2NrKGxjaywgZ3RpZCk7Cit9CisKK2ludCBfX2ttcF90ZXN0X25lc3RlZF9kcmRwYV9sb2NrKGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpIHsKKyAgaW50IHJldHZhbDsKKworICBLTVBfREVCVUdfQVNTRVJUKGd0aWQgPj0gMCk7CisKKyAgaWYgKF9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKGxjaykgPT0gZ3RpZCkgeworICAgIHJldHZhbCA9ICsrbGNrLT5say5kZXB0aF9sb2NrZWQ7CisgIH0gZWxzZSBpZiAoIV9fa21wX3Rlc3RfZHJkcGFfbG9jayhsY2ssIGd0aWQpKSB7CisgICAgcmV0dmFsID0gMDsKKyAgfSBlbHNlIHsKKyAgICBLTVBfTUIoKTsKKyAgICByZXR2YWwgPSBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDE7CisgICAgS01QX01CKCk7CisgICAgbGNrLT5say5vd25lcl9pZCA9IGd0aWQgKyAxOworICB9CisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgX19rbXBfdGVzdF9uZXN0ZWRfZHJkcGFfbG9ja193aXRoX2NoZWNrcyhrbXBfZHJkcGFfbG9ja190ICpsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGd0aWQpIHsKKyAgY2hhciBjb25zdCAqY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9uZXN0X2xvY2siOworICBpZiAobGNrLT5say5pbml0aWFsaXplZCAhPSBsY2spIHsKKyAgICBLTVBfRkFUQUwoTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyk7CisgIH0KKyAgaWYgKCFfX2ttcF9pc19kcmRwYV9sb2NrX25lc3RhYmxlKGxjaykpIHsKKyAgICBLTVBfRkFUQUwoTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jKTsKKyAgfQorICByZXR1cm4gX19rbXBfdGVzdF9uZXN0ZWRfZHJkcGFfbG9jayhsY2ssIGd0aWQpOworfQorCitpbnQgX19rbXBfcmVsZWFzZV9uZXN0ZWRfZHJkcGFfbG9jayhrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKSB7CisgIEtNUF9ERUJVR19BU1NFUlQoZ3RpZCA+PSAwKTsKKworICBLTVBfTUIoKTsKKyAgaWYgKC0tKGxjay0+bGsuZGVwdGhfbG9ja2VkKSA9PSAwKSB7CisgICAgS01QX01CKCk7CisgICAgbGNrLT5say5vd25lcl9pZCA9IDA7CisgICAgX19rbXBfcmVsZWFzZV9kcmRwYV9sb2NrKGxjaywgZ3RpZCk7CisgICAgcmV0dXJuIEtNUF9MT0NLX1JFTEVBU0VEOworICB9CisgIHJldHVybiBLTVBfTE9DS19TVElMTF9IRUxEOworfQorCitzdGF0aWMgaW50IF9fa21wX3JlbGVhc2VfbmVzdGVkX2RyZHBhX2xvY2tfd2l0aF9jaGVja3Moa21wX2RyZHBhX2xvY2tfdCAqbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKSB7CisgIGNoYXIgY29uc3QgKmNvbnN0IGZ1bmMgPSAib21wX3Vuc2V0X25lc3RfbG9jayI7CisgIEtNUF9NQigpOyAvKiBpbiBjYXNlIGFub3RoZXIgcHJvY2Vzc29yIGluaXRpYWxpemVkIGxvY2sgKi8KKyAgaWYgKGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrKSB7CisgICAgS01QX0ZBVEFMKExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMpOworICB9CisgIGlmICghX19rbXBfaXNfZHJkcGFfbG9ja19uZXN0YWJsZShsY2spKSB7CisgICAgS01QX0ZBVEFMKExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyk7CisgIH0KKyAgaWYgKF9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKGxjaykgPT0gLTEpIHsKKyAgICBLTVBfRkFUQUwoTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMpOworICB9CisgIGlmIChfX2ttcF9nZXRfZHJkcGFfbG9ja19vd25lcihsY2spICE9IGd0aWQpIHsKKyAgICBLTVBfRkFUQUwoTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyk7CisgIH0KKyAgcmV0dXJuIF9fa21wX3JlbGVhc2VfbmVzdGVkX2RyZHBhX2xvY2sobGNrLCBndGlkKTsKK30KKwordm9pZCBfX2ttcF9pbml0X25lc3RlZF9kcmRwYV9sb2NrKGttcF9kcmRwYV9sb2NrX3QgKmxjaykgeworICBfX2ttcF9pbml0X2RyZHBhX2xvY2sobGNrKTsKKyAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAwOyAvLyA+PSAwIGZvciBuZXN0YWJsZSBsb2NrcywgLTEgZm9yIHNpbXBsZSBsb2NrcworfQorCitzdGF0aWMgdm9pZCBfX2ttcF9pbml0X25lc3RlZF9kcmRwYV9sb2NrX3dpdGhfY2hlY2tzKGttcF9kcmRwYV9sb2NrX3QgKmxjaykgeworICBfX2ttcF9pbml0X25lc3RlZF9kcmRwYV9sb2NrKGxjayk7Cit9CisKK3ZvaWQgX19rbXBfZGVzdHJveV9uZXN0ZWRfZHJkcGFfbG9jayhrbXBfZHJkcGFfbG9ja190ICpsY2spIHsKKyAgX19rbXBfZGVzdHJveV9kcmRwYV9sb2NrKGxjayk7CisgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMDsKK30KKworc3RhdGljIHZvaWQgX19rbXBfZGVzdHJveV9uZXN0ZWRfZHJkcGFfbG9ja193aXRoX2NoZWNrcyhrbXBfZHJkcGFfbG9ja190ICpsY2spIHsKKyAgY2hhciBjb25zdCAqY29uc3QgZnVuYyA9ICJvbXBfZGVzdHJveV9uZXN0X2xvY2siOworICBpZiAobGNrLT5say5pbml0aWFsaXplZCAhPSBsY2spIHsKKyAgICBLTVBfRkFUQUwoTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyk7CisgIH0KKyAgaWYgKCFfX2ttcF9pc19kcmRwYV9sb2NrX25lc3RhYmxlKGxjaykpIHsKKyAgICBLTVBfRkFUQUwoTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jKTsKKyAgfQorICBpZiAoX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIobGNrKSAhPSAtMSkgeworICAgIEtNUF9GQVRBTChMb2NrU3RpbGxPd25lZCwgZnVuYyk7CisgIH0KKyAgX19rbXBfZGVzdHJveV9uZXN0ZWRfZHJkcGFfbG9jayhsY2spOworfQorCisvLyBhY2Nlc3MgZnVuY3Rpb25zIHRvIGZpZWxkcyB3aGljaCBkb24ndCBleGlzdCBmb3IgYWxsIGxvY2sga2luZHMuCisKK3N0YXRpYyBpbnQgX19rbXBfaXNfZHJkcGFfbG9ja19pbml0aWFsaXplZChrbXBfZHJkcGFfbG9ja190ICpsY2spIHsKKyAgcmV0dXJuIGxjayA9PSBsY2stPmxrLmluaXRpYWxpemVkOworfQorCitzdGF0aWMgY29uc3QgaWRlbnRfdCAqX19rbXBfZ2V0X2RyZHBhX2xvY2tfbG9jYXRpb24oa21wX2RyZHBhX2xvY2tfdCAqbGNrKSB7CisgIHJldHVybiBsY2stPmxrLmxvY2F0aW9uOworfQorCitzdGF0aWMgdm9pZCBfX2ttcF9zZXRfZHJkcGFfbG9ja19sb2NhdGlvbihrbXBfZHJkcGFfbG9ja190ICpsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpZGVudF90ICpsb2MpIHsKKyAgbGNrLT5say5sb2NhdGlvbiA9IGxvYzsKK30KKworc3RhdGljIGttcF9sb2NrX2ZsYWdzX3QgX19rbXBfZ2V0X2RyZHBhX2xvY2tfZmxhZ3Moa21wX2RyZHBhX2xvY2tfdCAqbGNrKSB7CisgIHJldHVybiBsY2stPmxrLmZsYWdzOworfQorCitzdGF0aWMgdm9pZCBfX2ttcF9zZXRfZHJkcGFfbG9ja19mbGFncyhrbXBfZHJkcGFfbG9ja190ICpsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbG9ja19mbGFnc190IGZsYWdzKSB7CisgIGxjay0+bGsuZmxhZ3MgPSBmbGFnczsKK30KKworLy8gVGltZSBzdGFtcCBjb3VudGVyCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorI2RlZmluZSBfX2ttcF90c2MoKSBfX2ttcF9oYXJkd2FyZV90aW1lc3RhbXAoKQorLy8gUnVudGltZSdzIGRlZmF1bHQgYmFja29mZiBwYXJhbWV0ZXJzCitrbXBfYmFja29mZl90IF9fa21wX3NwaW5fYmFja29mZl9wYXJhbXMgPSB7MSwgNDA5NiwgMTAwfTsKKyNlbHNlCisvLyBVc2UgbmFub3NlY29uZHMgZm9yIG90aGVyIHBsYXRmb3JtcworZXh0ZXJuIGttcF91aW50NjQgX19rbXBfbm93X25zZWMoKTsKK2ttcF9iYWNrb2ZmX3QgX19rbXBfc3Bpbl9iYWNrb2ZmX3BhcmFtcyA9IHsxLCAyNTYsIDEwMH07CisjZGVmaW5lIF9fa21wX3RzYygpIF9fa21wX25vd19uc2VjKCkKKyNlbmRpZgorCisvLyBBIHVzZWZ1bCBwcmVkaWNhdGUgZm9yIGRlYWxpbmcgd2l0aCB0aW1lc3RhbXBzIHRoYXQgbWF5IHdyYXAuCisvLyBJcyBhIGJlZm9yZSBiPyBTaW5jZSB0aGUgdGltZXN0YW1wcyBtYXkgd3JhcCwgdGhpcyBpcyBhc2tpbmcgd2hldGhlciBpdCdzCisvLyBzaG9ydGVyIHRvIGdvIGNsb2Nrd2lzZSBmcm9tIGEgdG8gYiBhcm91bmQgdGhlIGNsb2NrLWZhY2UsIG9yIGFudGktY2xvY2t3aXNlLgorLy8gVGltZXMgd2hlcmUgZ29pbmcgY2xvY2t3aXNlIGlzIGxlc3MgZGlzdGFuY2UgdGhhbiBnb2luZyBhbnRpLWNsb2Nrd2lzZQorLy8gYXJlIGluIHRoZSBmdXR1cmUsIG90aGVycyBhcmUgaW4gdGhlIHBhc3QuIGUuZy4gYSA9IE1BWC0xLCBiID0gTUFYKzEgKD0wKSwKKy8vIHRoZW4gYSA+IGIgKHRydWUpIGRvZXMgbm90IG1lYW4gYSByZWFjaGVkIGI7IHdoZXJlYXMgc2lnbmVkKGEpID0gLTIsCisvLyBzaWduZWQoYikgPSAwIGNhcHR1cmVzIHRoZSBhY3R1YWwgZGlmZmVyZW5jZQorc3RhdGljIGlubGluZSBib29sIGJlZm9yZShrbXBfdWludDY0IGEsIGttcF91aW50NjQgYikgeworICByZXR1cm4gKChrbXBfaW50NjQpYiAtIChrbXBfaW50NjQpYSkgPiAwOworfQorCisvLyBUcnVuY2F0ZWQgYmluYXJ5IGV4cG9uZW50aWFsIGJhY2tvZmYgZnVuY3Rpb24KK3ZvaWQgX19rbXBfc3Bpbl9iYWNrb2ZmKGttcF9iYWNrb2ZmX3QgKmJvZmYpIHsKKyAgLy8gV2UgY291bGQgZmxhdHRlbiB0aGlzIGxvb3AsIGJ1dCBtYWtpbmcgaXQgYSBuZXN0ZWQgbG9vcCBnaXZlcyBiZXR0ZXIgcmVzdWx0CisgIGttcF91aW50MzIgaTsKKyAgZm9yIChpID0gYm9mZi0+c3RlcDsgaSA+IDA7IGktLSkgeworICAgIGttcF91aW50NjQgZ29hbCA9IF9fa21wX3RzYygpICsgYm9mZi0+bWluX3RpY2s7CisgICAgZG8geworICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgIH0gd2hpbGUgKGJlZm9yZShfX2ttcF90c2MoKSwgZ29hbCkpOworICB9CisgIGJvZmYtPnN0ZXAgPSAoYm9mZi0+c3RlcCA8PCAxIHwgMSkgJiAoYm9mZi0+bWF4X2JhY2tvZmYgLSAxKTsKK30KKworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKy8vIERpcmVjdCBsb2NrIGluaXRpYWxpemVycy4gSXQgc2ltcGx5IHdyaXRlcyBhIHRhZyB0byB0aGUgbG93IDggYml0cyBvZiB0aGUKKy8vIGxvY2sgd29yZC4KK3N0YXRpYyB2b2lkIF9fa21wX2luaXRfZGlyZWN0X2xvY2soa21wX2R5bmFfbG9ja190ICpsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9keW5hX2xvY2tzZXFfdCBzZXEpIHsKKyAgVENXXzQoKmxjaywgS01QX0dFVF9EX1RBRyhzZXEpKTsKKyAgS0FfVFJBQ0UoCisgICAgICAyMCwKKyAgICAgICgiX19rbXBfaW5pdF9kaXJlY3RfbG9jazogaW5pdGlhbGl6ZWQgZGlyZWN0IGxvY2sgd2l0aCB0eXBlIyVkXG4iLCBzZXEpKTsKK30KKworI2lmIEtNUF9VU0VfVFNYCisKKy8vIEhMRSBsb2NrIGZ1bmN0aW9ucyAtIGltcG9ydGVkIGZyb20gdGhlIHRlc3RiZWQgcnVudGltZS4KKyNkZWZpbmUgSExFX0FDUVVJUkUgIi5ieXRlIDB4ZjI7IgorI2RlZmluZSBITEVfUkVMRUFTRSAiLmJ5dGUgMHhmMzsiCisKK3N0YXRpYyBpbmxpbmUga21wX3VpbnQzMiBzd2FwNChrbXBfdWludDMyIHZvbGF0aWxlICpwLCBrbXBfdWludDMyIHYpIHsKKyAgX19hc21fXyB2b2xhdGlsZShITEVfQUNRVUlSRSAieGNoZyAlMSwlMCIgOiAiK3IiKHYpLCAiK20iKCpwKSA6IDogIm1lbW9yeSIpOworICByZXR1cm4gdjsKK30KKworc3RhdGljIHZvaWQgX19rbXBfZGVzdHJveV9obGVfbG9jayhrbXBfZHluYV9sb2NrX3QgKmxjaykgeyBUQ1dfNCgqbGNrLCAwKTsgfQorCitzdGF0aWMgdm9pZCBfX2ttcF9hY3F1aXJlX2hsZV9sb2NrKGttcF9keW5hX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCkgeworICAvLyBVc2UgZ3RpZCBmb3IgS01QX0xPQ0tfQlVTWSBpZiBuZWNlc3NhcnkKKyAgaWYgKHN3YXA0KGxjaywgS01QX0xPQ0tfQlVTWSgxLCBobGUpKSAhPSBLTVBfTE9DS19GUkVFKGhsZSkpIHsKKyAgICBpbnQgZGVsYXkgPSAxOworICAgIGRvIHsKKyAgICAgIHdoaWxlICgqKGttcF91aW50MzIgdm9sYXRpbGUgKilsY2sgIT0gS01QX0xPQ0tfRlJFRShobGUpKSB7CisgICAgICAgIGZvciAoaW50IGkgPSBkZWxheTsgaSAhPSAwOyAtLWkpCisgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICBkZWxheSA9ICgoZGVsYXkgPDwgMSkgfCAxKSAmIDc7CisgICAgICB9CisgICAgfSB3aGlsZSAoc3dhcDQobGNrLCBLTVBfTE9DS19CVVNZKDEsIGhsZSkpICE9IEtNUF9MT0NLX0ZSRUUoaGxlKSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgX19rbXBfYWNxdWlyZV9obGVfbG9ja193aXRoX2NoZWNrcyhrbXBfZHluYV9sb2NrX3QgKmxjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGd0aWQpIHsKKyAgX19rbXBfYWNxdWlyZV9obGVfbG9jayhsY2ssIGd0aWQpOyAvLyBUT0RPOiBhZGQgY2hlY2tzCit9CisKK3N0YXRpYyBpbnQgX19rbXBfcmVsZWFzZV9obGVfbG9jayhrbXBfZHluYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpIHsKKyAgX19hc21fXyB2b2xhdGlsZShITEVfUkVMRUFTRSAibW92bCAlMSwlMCIKKyAgICAgICAgICAgICAgICAgICA6ICI9bSIoKmxjaykKKyAgICAgICAgICAgICAgICAgICA6ICJyIihLTVBfTE9DS19GUkVFKGhsZSkpCisgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5Iik7CisgIHJldHVybiBLTVBfTE9DS19SRUxFQVNFRDsKK30KKworc3RhdGljIGludCBfX2ttcF9yZWxlYXNlX2hsZV9sb2NrX3dpdGhfY2hlY2tzKGttcF9keW5hX2xvY2tfdCAqbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKSB7CisgIHJldHVybiBfX2ttcF9yZWxlYXNlX2hsZV9sb2NrKGxjaywgZ3RpZCk7IC8vIFRPRE86IGFkZCBjaGVja3MKK30KKworc3RhdGljIGludCBfX2ttcF90ZXN0X2hsZV9sb2NrKGttcF9keW5hX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCkgeworICByZXR1cm4gc3dhcDQobGNrLCBLTVBfTE9DS19CVVNZKDEsIGhsZSkpID09IEtNUF9MT0NLX0ZSRUUoaGxlKTsKK30KKworc3RhdGljIGludCBfX2ttcF90ZXN0X2hsZV9sb2NrX3dpdGhfY2hlY2tzKGttcF9keW5hX2xvY2tfdCAqbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKSB7CisgIHJldHVybiBfX2ttcF90ZXN0X2hsZV9sb2NrKGxjaywgZ3RpZCk7IC8vIFRPRE86IGFkZCBjaGVja3MKK30KKworc3RhdGljIHZvaWQgX19rbXBfaW5pdF9ydG1fbG9jayhrbXBfcXVldWluZ19sb2NrX3QgKmxjaykgeworICBfX2ttcF9pbml0X3F1ZXVpbmdfbG9jayhsY2spOworfQorCitzdGF0aWMgdm9pZCBfX2ttcF9kZXN0cm95X3J0bV9sb2NrKGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrKSB7CisgIF9fa21wX2Rlc3Ryb3lfcXVldWluZ19sb2NrKGxjayk7Cit9CisKK3N0YXRpYyB2b2lkIF9fa21wX2FjcXVpcmVfcnRtX2xvY2soa21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKSB7CisgIHVuc2lnbmVkIHJldHJpZXMgPSAzLCBzdGF0dXM7CisgIGRvIHsKKyAgICBzdGF0dXMgPSBfeGJlZ2luKCk7CisgICAgaWYgKHN0YXR1cyA9PSBfWEJFR0lOX1NUQVJURUQpIHsKKyAgICAgIGlmIChfX2ttcF9pc191bmxvY2tlZF9xdWV1aW5nX2xvY2sobGNrKSkKKyAgICAgICAgcmV0dXJuOworICAgICAgX3hhYm9ydCgweGZmKTsKKyAgICB9CisgICAgaWYgKChzdGF0dXMgJiBfWEFCT1JUX0VYUExJQ0lUKSAmJiBfWEFCT1JUX0NPREUoc3RhdHVzKSA9PSAweGZmKSB7CisgICAgICAvLyBXYWl0IHVudGlsIGxvY2sgYmVjb21lcyBmcmVlCisgICAgICB3aGlsZSAoIV9fa21wX2lzX3VubG9ja2VkX3F1ZXVpbmdfbG9jayhsY2spKQorICAgICAgICBfX2ttcF95aWVsZChUUlVFKTsKKyAgICB9IGVsc2UgaWYgKCEoc3RhdHVzICYgX1hBQk9SVF9SRVRSWSkpCisgICAgICBicmVhazsKKyAgfSB3aGlsZSAocmV0cmllcy0tKTsKKworICAvLyBGYWxsLWJhY2sgbm9uLXNwZWN1bGF0aXZlIGxvY2sgKHhjaGcpCisgIF9fa21wX2FjcXVpcmVfcXVldWluZ19sb2NrKGxjaywgZ3RpZCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fa21wX2FjcXVpcmVfcnRtX2xvY2tfd2l0aF9jaGVja3Moa21wX3F1ZXVpbmdfbG9ja190ICpsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKSB7CisgIF9fa21wX2FjcXVpcmVfcnRtX2xvY2sobGNrLCBndGlkKTsKK30KKworc3RhdGljIGludCBfX2ttcF9yZWxlYXNlX3J0bV9sb2NrKGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCkgeworICBpZiAoX19rbXBfaXNfdW5sb2NrZWRfcXVldWluZ19sb2NrKGxjaykpIHsKKyAgICAvLyBSZWxlYXNpbmcgZnJvbSBzcGVjdWxhdGlvbgorICAgIF94ZW5kKCk7CisgIH0gZWxzZSB7CisgICAgLy8gUmVsZWFzaW5nIGZyb20gYSByZWFsIGxvY2sKKyAgICBfX2ttcF9yZWxlYXNlX3F1ZXVpbmdfbG9jayhsY2ssIGd0aWQpOworICB9CisgIHJldHVybiBLTVBfTE9DS19SRUxFQVNFRDsKK30KKworc3RhdGljIGludCBfX2ttcF9yZWxlYXNlX3J0bV9sb2NrX3dpdGhfY2hlY2tzKGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKSB7CisgIHJldHVybiBfX2ttcF9yZWxlYXNlX3J0bV9sb2NrKGxjaywgZ3RpZCk7Cit9CisKK3N0YXRpYyBpbnQgX19rbXBfdGVzdF9ydG1fbG9jayhrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpIHsKKyAgdW5zaWduZWQgcmV0cmllcyA9IDMsIHN0YXR1czsKKyAgZG8geworICAgIHN0YXR1cyA9IF94YmVnaW4oKTsKKyAgICBpZiAoc3RhdHVzID09IF9YQkVHSU5fU1RBUlRFRCAmJiBfX2ttcF9pc191bmxvY2tlZF9xdWV1aW5nX2xvY2sobGNrKSkgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICghKHN0YXR1cyAmIF9YQUJPUlRfUkVUUlkpKQorICAgICAgYnJlYWs7CisgIH0gd2hpbGUgKHJldHJpZXMtLSk7CisKKyAgcmV0dXJuIChfX2ttcF9pc191bmxvY2tlZF9xdWV1aW5nX2xvY2sobGNrKSkgPyAxIDogMDsKK30KKworc3RhdGljIGludCBfX2ttcF90ZXN0X3J0bV9sb2NrX3dpdGhfY2hlY2tzKGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKSB7CisgIHJldHVybiBfX2ttcF90ZXN0X3J0bV9sb2NrKGxjaywgZ3RpZCk7Cit9CisKKyNlbmRpZiAvLyBLTVBfVVNFX1RTWAorCisvLyBFbnRyeSBmdW5jdGlvbnMgZm9yIGluZGlyZWN0IGxvY2tzIChmaXJzdCBlbGVtZW50IG9mIGRpcmVjdCBsb2NrIGp1bXAgdGFibGVzKQorc3RhdGljIHZvaWQgX19rbXBfaW5pdF9pbmRpcmVjdF9sb2NrKGttcF9keW5hX2xvY2tfdCAqbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfZHluYV9sb2Nrc2VxX3QgdGFnKTsKK3N0YXRpYyB2b2lkIF9fa21wX2Rlc3Ryb3lfaW5kaXJlY3RfbG9jayhrbXBfZHluYV9sb2NrX3QgKmxvY2spOworc3RhdGljIHZvaWQgX19rbXBfc2V0X2luZGlyZWN0X2xvY2soa21wX2R5bmFfbG9ja190ICpsb2NrLCBrbXBfaW50MzIpOworc3RhdGljIGludCBfX2ttcF91bnNldF9pbmRpcmVjdF9sb2NrKGttcF9keW5hX2xvY2tfdCAqbG9jaywga21wX2ludDMyKTsKK3N0YXRpYyBpbnQgX19rbXBfdGVzdF9pbmRpcmVjdF9sb2NrKGttcF9keW5hX2xvY2tfdCAqbG9jaywga21wX2ludDMyKTsKK3N0YXRpYyB2b2lkIF9fa21wX3NldF9pbmRpcmVjdF9sb2NrX3dpdGhfY2hlY2tzKGttcF9keW5hX2xvY2tfdCAqbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMik7CitzdGF0aWMgaW50IF9fa21wX3Vuc2V0X2luZGlyZWN0X2xvY2tfd2l0aF9jaGVja3Moa21wX2R5bmFfbG9ja190ICpsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMik7CitzdGF0aWMgaW50IF9fa21wX3Rlc3RfaW5kaXJlY3RfbG9ja193aXRoX2NoZWNrcyhrbXBfZHluYV9sb2NrX3QgKmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIpOworCisvLyBKdW1wIHRhYmxlcyBmb3IgdGhlIGluZGlyZWN0IGxvY2sgZnVuY3Rpb25zCisvLyBPbmx5IGZpbGwgaW4gdGhlIG9kZCBlbnRyaWVzLCB0aGF0IGF2b2lkcyB0aGUgbmVlZCB0byBzaGlmdCBvdXQgdGhlIGxvdyBiaXQKKworLy8gaW5pdCBmdW5jdGlvbnMKKyNkZWZpbmUgZXhwYW5kKGwsIG9wKSAwLCBfX2ttcF9pbml0X2RpcmVjdF9sb2NrLAordm9pZCAoKl9fa21wX2RpcmVjdF9pbml0W10pKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfZHluYV9sb2Nrc2VxX3QpID0geworICAgIF9fa21wX2luaXRfaW5kaXJlY3RfbG9jaywgMCwgS01QX0ZPUkVBQ0hfRF9MT0NLKGV4cGFuZCwgaW5pdCl9OworI3VuZGVmIGV4cGFuZAorCisvLyBkZXN0cm95IGZ1bmN0aW9ucworI2RlZmluZSBleHBhbmQobCwgb3ApIDAsICh2b2lkICgqKShrbXBfZHluYV9sb2NrX3QgKikpX19rbXBfIyNvcCMjXyMjbCMjX2xvY2ssCit2b2lkICgqX19rbXBfZGlyZWN0X2Rlc3Ryb3lbXSkoa21wX2R5bmFfbG9ja190ICopID0geworICAgIF9fa21wX2Rlc3Ryb3lfaW5kaXJlY3RfbG9jaywgMCwgS01QX0ZPUkVBQ0hfRF9MT0NLKGV4cGFuZCwgZGVzdHJveSl9OworI3VuZGVmIGV4cGFuZAorCisvLyBzZXQvYWNxdWlyZSBmdW5jdGlvbnMKKyNkZWZpbmUgZXhwYW5kKGwsIG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDAsICh2b2lkICgqKShrbXBfZHluYV9sb2NrX3QgKiwga21wX2ludDMyKSlfX2ttcF8jI29wIyNfIyNsIyNfbG9jaywKK3N0YXRpYyB2b2lkICgqZGlyZWN0X3NldFtdKShrbXBfZHluYV9sb2NrX3QgKiwga21wX2ludDMyKSA9IHsKKyAgICBfX2ttcF9zZXRfaW5kaXJlY3RfbG9jaywgMCwgS01QX0ZPUkVBQ0hfRF9MT0NLKGV4cGFuZCwgYWNxdWlyZSl9OworI3VuZGVmIGV4cGFuZAorI2RlZmluZSBleHBhbmQobCwgb3ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMCwgKHZvaWQgKCopKGttcF9keW5hX2xvY2tfdCAqLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBrbXBfaW50MzIpKV9fa21wXyMjb3AjI18jI2wjI19sb2NrX3dpdGhfY2hlY2tzLAorc3RhdGljIHZvaWQgKCpkaXJlY3Rfc2V0X2NoZWNrW10pKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfaW50MzIpID0geworICAgIF9fa21wX3NldF9pbmRpcmVjdF9sb2NrX3dpdGhfY2hlY2tzLCAwLAorICAgIEtNUF9GT1JFQUNIX0RfTE9DSyhleHBhbmQsIGFjcXVpcmUpfTsKKyN1bmRlZiBleHBhbmQKKworLy8gdW5zZXQvcmVsZWFzZSBhbmQgdGVzdCBmdW5jdGlvbnMKKyNkZWZpbmUgZXhwYW5kKGwsIG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDAsIChpbnQgKCopKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfaW50MzIpKV9fa21wXyMjb3AjI18jI2wjI19sb2NrLAorc3RhdGljIGludCAoKmRpcmVjdF91bnNldFtdKShrbXBfZHluYV9sb2NrX3QgKiwga21wX2ludDMyKSA9IHsKKyAgICBfX2ttcF91bnNldF9pbmRpcmVjdF9sb2NrLCAwLCBLTVBfRk9SRUFDSF9EX0xPQ0soZXhwYW5kLCByZWxlYXNlKX07CitzdGF0aWMgaW50ICgqZGlyZWN0X3Rlc3RbXSkoa21wX2R5bmFfbG9ja190ICosIGttcF9pbnQzMikgPSB7CisgICAgX19rbXBfdGVzdF9pbmRpcmVjdF9sb2NrLCAwLCBLTVBfRk9SRUFDSF9EX0xPQ0soZXhwYW5kLCB0ZXN0KX07CisjdW5kZWYgZXhwYW5kCisjZGVmaW5lIGV4cGFuZChsLCBvcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAwLCAoaW50ICgqKShrbXBfZHluYV9sb2NrX3QgKiwga21wX2ludDMyKSlfX2ttcF8jI29wIyNfIyNsIyNfbG9ja193aXRoX2NoZWNrcywKK3N0YXRpYyBpbnQgKCpkaXJlY3RfdW5zZXRfY2hlY2tbXSkoa21wX2R5bmFfbG9ja190ICosIGttcF9pbnQzMikgPSB7CisgICAgX19rbXBfdW5zZXRfaW5kaXJlY3RfbG9ja193aXRoX2NoZWNrcywgMCwKKyAgICBLTVBfRk9SRUFDSF9EX0xPQ0soZXhwYW5kLCByZWxlYXNlKX07CitzdGF0aWMgaW50ICgqZGlyZWN0X3Rlc3RfY2hlY2tbXSkoa21wX2R5bmFfbG9ja190ICosIGttcF9pbnQzMikgPSB7CisgICAgX19rbXBfdGVzdF9pbmRpcmVjdF9sb2NrX3dpdGhfY2hlY2tzLCAwLCBLTVBfRk9SRUFDSF9EX0xPQ0soZXhwYW5kLCB0ZXN0KX07CisjdW5kZWYgZXhwYW5kCisKKy8vIEV4cG9zZXMgb25seSBvbmUgc2V0IG9mIGp1bXAgdGFibGVzICgqbG9jayBvciAqbG9ja193aXRoX2NoZWNrcykuCit2b2lkICgqKCpfX2ttcF9kaXJlY3Rfc2V0KSkoa21wX2R5bmFfbG9ja190ICosIGttcF9pbnQzMikgPSAwOworaW50ICgqKCpfX2ttcF9kaXJlY3RfdW5zZXQpKShrbXBfZHluYV9sb2NrX3QgKiwga21wX2ludDMyKSA9IDA7CitpbnQgKCooKl9fa21wX2RpcmVjdF90ZXN0KSkoa21wX2R5bmFfbG9ja190ICosIGttcF9pbnQzMikgPSAwOworCisvLyBKdW1wIHRhYmxlcyBmb3IgdGhlIGluZGlyZWN0IGxvY2sgZnVuY3Rpb25zCisjZGVmaW5lIGV4cGFuZChsLCBvcCkgKHZvaWQgKCopKGttcF91c2VyX2xvY2tfcCkpIF9fa21wXyMjb3AjI18jI2wjI18jI2xvY2ssCit2b2lkICgqX19rbXBfaW5kaXJlY3RfaW5pdFtdKShrbXBfdXNlcl9sb2NrX3ApID0geworICAgIEtNUF9GT1JFQUNIX0lfTE9DSyhleHBhbmQsIGluaXQpfTsKK3ZvaWQgKCpfX2ttcF9pbmRpcmVjdF9kZXN0cm95W10pKGttcF91c2VyX2xvY2tfcCkgPSB7CisgICAgS01QX0ZPUkVBQ0hfSV9MT0NLKGV4cGFuZCwgZGVzdHJveSl9OworI3VuZGVmIGV4cGFuZAorCisvLyBzZXQvYWNxdWlyZSBmdW5jdGlvbnMKKyNkZWZpbmUgZXhwYW5kKGwsIG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICh2b2lkICgqKShrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMikpIF9fa21wXyMjb3AjI18jI2wjI18jI2xvY2ssCitzdGF0aWMgdm9pZCAoKmluZGlyZWN0X3NldFtdKShrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMikgPSB7CisgICAgS01QX0ZPUkVBQ0hfSV9MT0NLKGV4cGFuZCwgYWNxdWlyZSl9OworI3VuZGVmIGV4cGFuZAorI2RlZmluZSBleHBhbmQobCwgb3ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKHZvaWQgKCopKGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyKSkgX19rbXBfIyNvcCMjXyMjbCMjXyMjbG9ja193aXRoX2NoZWNrcywKK3N0YXRpYyB2b2lkICgqaW5kaXJlY3Rfc2V0X2NoZWNrW10pKGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyKSA9IHsKKyAgICBLTVBfRk9SRUFDSF9JX0xPQ0soZXhwYW5kLCBhY3F1aXJlKX07CisjdW5kZWYgZXhwYW5kCisKKy8vIHVuc2V0L3JlbGVhc2UgYW5kIHRlc3QgZnVuY3Rpb25zCisjZGVmaW5lIGV4cGFuZChsLCBvcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoaW50ICgqKShrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMikpIF9fa21wXyMjb3AjI18jI2wjI18jI2xvY2ssCitzdGF0aWMgaW50ICgqaW5kaXJlY3RfdW5zZXRbXSkoa21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIpID0geworICAgIEtNUF9GT1JFQUNIX0lfTE9DSyhleHBhbmQsIHJlbGVhc2UpfTsKK3N0YXRpYyBpbnQgKCppbmRpcmVjdF90ZXN0W10pKGttcF91c2VyX2xvY2tfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMikgPSB7S01QX0ZPUkVBQ0hfSV9MT0NLKGV4cGFuZCwgdGVzdCl9OworI3VuZGVmIGV4cGFuZAorI2RlZmluZSBleHBhbmQobCwgb3ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKGludCAoKikoa21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIpKSBfX2ttcF8jI29wIyNfIyNsIyNfIyNsb2NrX3dpdGhfY2hlY2tzLAorc3RhdGljIGludCAoKmluZGlyZWN0X3Vuc2V0X2NoZWNrW10pKGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyKSA9IHsKKyAgICBLTVBfRk9SRUFDSF9JX0xPQ0soZXhwYW5kLCByZWxlYXNlKX07CitzdGF0aWMgaW50ICgqaW5kaXJlY3RfdGVzdF9jaGVja1tdKShrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMikgPSB7CisgICAgS01QX0ZPUkVBQ0hfSV9MT0NLKGV4cGFuZCwgdGVzdCl9OworI3VuZGVmIGV4cGFuZAorCisvLyBFeHBvc2VzIG9ubHkgb25lIGp1bXAgdGFibGVzICgqbG9jayBvciAqbG9ja193aXRoX2NoZWNrcykuCit2b2lkICgqKCpfX2ttcF9pbmRpcmVjdF9zZXQpKShrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMikgPSAwOworaW50ICgqKCpfX2ttcF9pbmRpcmVjdF91bnNldCkpKGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyKSA9IDA7CitpbnQgKCooKl9fa21wX2luZGlyZWN0X3Rlc3QpKShrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMikgPSAwOworCisvLyBMb2NrIGluZGV4IHRhYmxlLgora21wX2luZGlyZWN0X2xvY2tfdGFibGVfdCBfX2ttcF9pX2xvY2tfdGFibGU7CisKKy8vIFNpemUgb2YgaW5kaXJlY3QgbG9ja3MuCitzdGF0aWMga21wX3VpbnQzMiBfX2ttcF9pbmRpcmVjdF9sb2NrX3NpemVbS01QX05VTV9JX0xPQ0tTXSA9IHswfTsKKworLy8gSnVtcCB0YWJsZXMgZm9yIGxvY2sgYWNjZXNzb3IvbW9kaWZpZXIuCit2b2lkICgqX19rbXBfaW5kaXJlY3Rfc2V0X2xvY2F0aW9uW0tNUF9OVU1fSV9MT0NLU10pKGttcF91c2VyX2xvY2tfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaWRlbnRfdCAqKSA9IHswfTsKK3ZvaWQgKCpfX2ttcF9pbmRpcmVjdF9zZXRfZmxhZ3NbS01QX05VTV9JX0xPQ0tTXSkoa21wX3VzZXJfbG9ja19wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbG9ja19mbGFnc190KSA9IHswfTsKK2NvbnN0IGlkZW50X3QgKigqX19rbXBfaW5kaXJlY3RfZ2V0X2xvY2F0aW9uW0tNUF9OVU1fSV9MT0NLU10pKAorICAgIGttcF91c2VyX2xvY2tfcCkgPSB7MH07CitrbXBfbG9ja19mbGFnc190ICgqX19rbXBfaW5kaXJlY3RfZ2V0X2ZsYWdzW0tNUF9OVU1fSV9MT0NLU10pKAorICAgIGttcF91c2VyX2xvY2tfcCkgPSB7MH07CisKKy8vIFVzZSBkaWZmZXJlbnQgbG9jayBwb29scyBmb3IgZGlmZmVyZW50IGxvY2sgdHlwZXMuCitzdGF0aWMga21wX2luZGlyZWN0X2xvY2tfdCAqX19rbXBfaW5kaXJlY3RfbG9ja19wb29sW0tNUF9OVU1fSV9MT0NLU10gPSB7MH07CisKKy8vIFVzZXIgbG9jayBhbGxvY2F0b3IgZm9yIGR5bmFtaWNhbGx5IGRpc3BhdGNoZWQgaW5kaXJlY3QgbG9ja3MuIEV2ZXJ5IGVudHJ5IG9mCisvLyB0aGUgaW5kaXJlY3QgbG9jayB0YWJsZSBob2xkcyB0aGUgYWRkcmVzcyBhbmQgdHlwZSBvZiB0aGUgYWxsb2NhdGVkIGluZHJlY3QKKy8vIGxvY2sgKGttcF9pbmRpcmVjdF9sb2NrX3QpLCBhbmQgdGhlIHNpemUgb2YgdGhlIHRhYmxlIGRvdWJsZXMgd2hlbiBpdCBpcworLy8gZnVsbC4gQSBkZXN0cm95ZWQgaW5kaXJlY3QgbG9jayBvYmplY3QgaXMgcmV0dXJuZWQgdG8gdGhlIHJldXNhYmxlIHBvb2wgb2YKKy8vIGxvY2tzLCB1bmlxdWUgdG8gZWFjaCBsb2NrIHR5cGUuCitrbXBfaW5kaXJlY3RfbG9ja190ICpfX2ttcF9hbGxvY2F0ZV9pbmRpcmVjdF9sb2NrKHZvaWQgKip1c2VyX2xvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW5kaXJlY3RfbG9ja3RhZ190IHRhZykgeworICBrbXBfaW5kaXJlY3RfbG9ja190ICpsY2s7CisgIGttcF9sb2NrX2luZGV4X3QgaWR4OworCisgIF9fa21wX2FjcXVpcmVfbG9jaygmX19rbXBfZ2xvYmFsX2xvY2ssIGd0aWQpOworCisgIGlmIChfX2ttcF9pbmRpcmVjdF9sb2NrX3Bvb2xbdGFnXSAhPSBOVUxMKSB7CisgICAgLy8gUmV1c2UgdGhlIGFsbG9jYXRlZCBhbmQgZGVzdHJveWVkIGxvY2sgb2JqZWN0CisgICAgbGNrID0gX19rbXBfaW5kaXJlY3RfbG9ja19wb29sW3RhZ107CisgICAgaWYgKE9NUF9MT0NLX1RfU0laRSA8IHNpemVvZih2b2lkICopKQorICAgICAgaWR4ID0gbGNrLT5sb2NrLT5wb29sLmluZGV4OworICAgIF9fa21wX2luZGlyZWN0X2xvY2tfcG9vbFt0YWddID0gKGttcF9pbmRpcmVjdF9sb2NrX3QgKilsY2stPmxvY2stPnBvb2wubmV4dDsKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9hbGxvY2F0ZV9pbmRpcmVjdF9sb2NrOiByZXVzaW5nIGFuIGV4aXN0aW5nIGxvY2sgJXBcbiIsCisgICAgICAgICAgICAgICAgICBsY2spKTsKKyAgfSBlbHNlIHsKKyAgICBpZHggPSBfX2ttcF9pX2xvY2tfdGFibGUubmV4dDsKKyAgICAvLyBDaGVjayBjYXBhY2l0eSBhbmQgZG91YmxlIHRoZSBzaXplIGlmIGl0IGlzIGZ1bGwKKyAgICBpZiAoaWR4ID09IF9fa21wX2lfbG9ja190YWJsZS5zaXplKSB7CisgICAgICAvLyBEb3VibGUgdXAgdGhlIHNwYWNlIGZvciBibG9jayBwb2ludGVycworICAgICAgaW50IHJvdyA9IF9fa21wX2lfbG9ja190YWJsZS5zaXplIC8gS01QX0lfTE9DS19DSFVOSzsKKyAgICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKipuZXdfdGFibGUgPSAoa21wX2luZGlyZWN0X2xvY2tfdCAqKilfX2ttcF9hbGxvY2F0ZSgKKyAgICAgICAgICAyICogcm93ICogc2l6ZW9mKGttcF9pbmRpcmVjdF9sb2NrX3QgKikpOworICAgICAgS01QX01FTUNQWShuZXdfdGFibGUsIF9fa21wX2lfbG9ja190YWJsZS50YWJsZSwKKyAgICAgICAgICAgICAgICAgcm93ICogc2l6ZW9mKGttcF9pbmRpcmVjdF9sb2NrX3QgKikpOworICAgICAga21wX2luZGlyZWN0X2xvY2tfdCAqKm9sZF90YWJsZSA9IF9fa21wX2lfbG9ja190YWJsZS50YWJsZTsKKyAgICAgIF9fa21wX2lfbG9ja190YWJsZS50YWJsZSA9IG5ld190YWJsZTsKKyAgICAgIF9fa21wX2ZyZWUob2xkX3RhYmxlKTsKKyAgICAgIC8vIEFsbG9jYXRlIG5ldyBvYmplY3RzIGluIHRoZSBuZXcgYmxvY2tzCisgICAgICBmb3IgKGludCBpID0gcm93OyBpIDwgMiAqIHJvdzsgKytpKQorICAgICAgICAqKF9fa21wX2lfbG9ja190YWJsZS50YWJsZSArIGkpID0gKGttcF9pbmRpcmVjdF9sb2NrX3QgKilfX2ttcF9hbGxvY2F0ZSgKKyAgICAgICAgICAgIEtNUF9JX0xPQ0tfQ0hVTksgKiBzaXplb2Yoa21wX2luZGlyZWN0X2xvY2tfdCkpOworICAgICAgX19rbXBfaV9sb2NrX3RhYmxlLnNpemUgPSAyICogaWR4OworICAgIH0KKyAgICBfX2ttcF9pX2xvY2tfdGFibGUubmV4dCsrOworICAgIGxjayA9IEtNUF9HRVRfSV9MT0NLKGlkeCk7CisgICAgLy8gQWxsb2NhdGUgYSBuZXcgYmFzZSBsb2NrIG9iamVjdAorICAgIGxjay0+bG9jayA9IChrbXBfdXNlcl9sb2NrX3ApX19rbXBfYWxsb2NhdGUoX19rbXBfaW5kaXJlY3RfbG9ja19zaXplW3RhZ10pOworICAgIEtBX1RSQUNFKDIwLAorICAgICAgICAgICAgICgiX19rbXBfYWxsb2NhdGVfaW5kaXJlY3RfbG9jazogYWxsb2NhdGVkIGEgbmV3IGxvY2sgJXBcbiIsIGxjaykpOworICB9CisKKyAgX19rbXBfcmVsZWFzZV9sb2NrKCZfX2ttcF9nbG9iYWxfbG9jaywgZ3RpZCk7CisKKyAgbGNrLT50eXBlID0gdGFnOworCisgIGlmIChPTVBfTE9DS19UX1NJWkUgPCBzaXplb2Yodm9pZCAqKSkgeworICAgICooKGttcF9sb2NrX2luZGV4X3QgKil1c2VyX2xvY2spID0gaWR4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAxOyAvLyBpbmRpcmVjdCBsb2NrIHdvcmQgbXVzdCBiZSBldmVuCisgIH0gZWxzZSB7CisgICAgKigoa21wX2luZGlyZWN0X2xvY2tfdCAqKil1c2VyX2xvY2spID0gbGNrOworICB9CisKKyAgcmV0dXJuIGxjazsKK30KKworLy8gVXNlciBsb2NrIGxvb2t1cCBmb3IgZHluYW1pY2FsbHkgZGlzcGF0Y2hlZCBsb2Nrcy4KK3N0YXRpYyBfX2ZvcmNlaW5saW5lIGttcF9pbmRpcmVjdF9sb2NrX3QgKgorX19rbXBfbG9va3VwX2luZGlyZWN0X2xvY2sodm9pZCAqKnVzZXJfbG9jaywgY29uc3QgY2hhciAqZnVuYykgeworICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAga21wX2luZGlyZWN0X2xvY2tfdCAqbGNrID0gTlVMTDsKKyAgICBpZiAodXNlcl9sb2NrID09IE5VTEwpIHsKKyAgICAgIEtNUF9GQVRBTChMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jKTsKKyAgICB9CisgICAgaWYgKE9NUF9MT0NLX1RfU0laRSA8IHNpemVvZih2b2lkICopKSB7CisgICAgICBrbXBfbG9ja19pbmRleF90IGlkeCA9IEtNUF9FWFRSQUNUX0lfSU5ERVgodXNlcl9sb2NrKTsKKyAgICAgIGlmIChpZHggPj0gX19rbXBfaV9sb2NrX3RhYmxlLnNpemUpIHsKKyAgICAgICAgS01QX0ZBVEFMKExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMpOworICAgICAgfQorICAgICAgbGNrID0gS01QX0dFVF9JX0xPQ0soaWR4KTsKKyAgICB9IGVsc2UgeworICAgICAgbGNrID0gKigoa21wX2luZGlyZWN0X2xvY2tfdCAqKil1c2VyX2xvY2spOworICAgIH0KKyAgICBpZiAobGNrID09IE5VTEwpIHsKKyAgICAgIEtNUF9GQVRBTChMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jKTsKKyAgICB9CisgICAgcmV0dXJuIGxjazsKKyAgfSBlbHNlIHsKKyAgICBpZiAoT01QX0xPQ0tfVF9TSVpFIDwgc2l6ZW9mKHZvaWQgKikpIHsKKyAgICAgIHJldHVybiBLTVBfR0VUX0lfTE9DSyhLTVBfRVhUUkFDVF9JX0lOREVYKHVzZXJfbG9jaykpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gKigoa21wX2luZGlyZWN0X2xvY2tfdCAqKil1c2VyX2xvY2spOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBfX2ttcF9pbml0X2luZGlyZWN0X2xvY2soa21wX2R5bmFfbG9ja190ICpsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9keW5hX2xvY2tzZXFfdCBzZXEpIHsKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgIGlmIChzZXEgPT0gbG9ja3NlcV9hZGFwdGl2ZSAmJiAhX19rbXBfY3B1aW5mby5ydG0pIHsKKyAgICBLTVBfV0FSTklORyhBZGFwdGl2ZU5vdFN1cHBvcnRlZCwgImttcF9sb2Nrc2VxX3QiLCAiYWRhcHRpdmUiKTsKKyAgICBzZXEgPSBsb2Nrc2VxX3F1ZXVpbmc7CisgIH0KKyNlbmRpZgorI2lmIEtNUF9VU0VfVFNYCisgIGlmIChzZXEgPT0gbG9ja3NlcV9ydG0gJiYgIV9fa21wX2NwdWluZm8ucnRtKSB7CisgICAgc2VxID0gbG9ja3NlcV9xdWV1aW5nOworICB9CisjZW5kaWYKKyAga21wX2luZGlyZWN0X2xvY2t0YWdfdCB0YWcgPSBLTVBfR0VUX0lfVEFHKHNlcSk7CisgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmwgPQorICAgICAgX19rbXBfYWxsb2NhdGVfaW5kaXJlY3RfbG9jaygodm9pZCAqKilsb2NrLCBfX2ttcF9lbnRyeV9ndGlkKCksIHRhZyk7CisgIEtNUF9JX0xPQ0tfRlVOQyhsLCBpbml0KShsLT5sb2NrKTsKKyAgS0FfVFJBQ0UoCisgICAgICAyMCwgKCJfX2ttcF9pbml0X2luZGlyZWN0X2xvY2s6IGluaXRpYWxpemVkIGluZGlyZWN0IGxvY2sgd2l0aCB0eXBlIyVkXG4iLAorICAgICAgICAgICBzZXEpKTsKK30KKworc3RhdGljIHZvaWQgX19rbXBfZGVzdHJveV9pbmRpcmVjdF9sb2NrKGttcF9keW5hX2xvY2tfdCAqbG9jaykgeworICBrbXBfdWludDMyIGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmwgPQorICAgICAgX19rbXBfbG9va3VwX2luZGlyZWN0X2xvY2soKHZvaWQgKiopbG9jaywgIm9tcF9kZXN0cm95X2xvY2siKTsKKyAgS01QX0lfTE9DS19GVU5DKGwsIGRlc3Ryb3kpKGwtPmxvY2spOworICBrbXBfaW5kaXJlY3RfbG9ja3RhZ190IHRhZyA9IGwtPnR5cGU7CisKKyAgX19rbXBfYWNxdWlyZV9sb2NrKCZfX2ttcF9nbG9iYWxfbG9jaywgZ3RpZCk7CisKKyAgLy8gVXNlIHRoZSBiYXNlIGxvY2sncyBzcGFjZSB0byBrZWVwIHRoZSBwb29sIGNoYWluLgorICBsLT5sb2NrLT5wb29sLm5leHQgPSAoa21wX3VzZXJfbG9ja19wKV9fa21wX2luZGlyZWN0X2xvY2tfcG9vbFt0YWddOworICBpZiAoT01QX0xPQ0tfVF9TSVpFIDwgc2l6ZW9mKHZvaWQgKikpIHsKKyAgICBsLT5sb2NrLT5wb29sLmluZGV4ID0gS01QX0VYVFJBQ1RfSV9JTkRFWChsb2NrKTsKKyAgfQorICBfX2ttcF9pbmRpcmVjdF9sb2NrX3Bvb2xbdGFnXSA9IGw7CisKKyAgX19rbXBfcmVsZWFzZV9sb2NrKCZfX2ttcF9nbG9iYWxfbG9jaywgZ3RpZCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fa21wX3NldF9pbmRpcmVjdF9sb2NrKGttcF9keW5hX2xvY2tfdCAqbG9jaywga21wX2ludDMyIGd0aWQpIHsKKyAga21wX2luZGlyZWN0X2xvY2tfdCAqbCA9IEtNUF9MT09LVVBfSV9MT0NLKGxvY2spOworICBLTVBfSV9MT0NLX0ZVTkMobCwgc2V0KShsLT5sb2NrLCBndGlkKTsKK30KKworc3RhdGljIGludCBfX2ttcF91bnNldF9pbmRpcmVjdF9sb2NrKGttcF9keW5hX2xvY2tfdCAqbG9jaywga21wX2ludDMyIGd0aWQpIHsKKyAga21wX2luZGlyZWN0X2xvY2tfdCAqbCA9IEtNUF9MT09LVVBfSV9MT0NLKGxvY2spOworICByZXR1cm4gS01QX0lfTE9DS19GVU5DKGwsIHVuc2V0KShsLT5sb2NrLCBndGlkKTsKK30KKworc3RhdGljIGludCBfX2ttcF90ZXN0X2luZGlyZWN0X2xvY2soa21wX2R5bmFfbG9ja190ICpsb2NrLCBrbXBfaW50MzIgZ3RpZCkgeworICBrbXBfaW5kaXJlY3RfbG9ja190ICpsID0gS01QX0xPT0tVUF9JX0xPQ0sobG9jayk7CisgIHJldHVybiBLTVBfSV9MT0NLX0ZVTkMobCwgdGVzdCkobC0+bG9jaywgZ3RpZCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fa21wX3NldF9pbmRpcmVjdF9sb2NrX3dpdGhfY2hlY2tzKGttcF9keW5hX2xvY2tfdCAqbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKSB7CisgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmwgPQorICAgICAgX19rbXBfbG9va3VwX2luZGlyZWN0X2xvY2soKHZvaWQgKiopbG9jaywgIm9tcF9zZXRfbG9jayIpOworICBLTVBfSV9MT0NLX0ZVTkMobCwgc2V0KShsLT5sb2NrLCBndGlkKTsKK30KKworc3RhdGljIGludCBfX2ttcF91bnNldF9pbmRpcmVjdF9sb2NrX3dpdGhfY2hlY2tzKGttcF9keW5hX2xvY2tfdCAqbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgZ3RpZCkgeworICBrbXBfaW5kaXJlY3RfbG9ja190ICpsID0KKyAgICAgIF9fa21wX2xvb2t1cF9pbmRpcmVjdF9sb2NrKCh2b2lkICoqKWxvY2ssICJvbXBfdW5zZXRfbG9jayIpOworICByZXR1cm4gS01QX0lfTE9DS19GVU5DKGwsIHVuc2V0KShsLT5sb2NrLCBndGlkKTsKK30KKworc3RhdGljIGludCBfX2ttcF90ZXN0X2luZGlyZWN0X2xvY2tfd2l0aF9jaGVja3Moa21wX2R5bmFfbG9ja190ICpsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGd0aWQpIHsKKyAga21wX2luZGlyZWN0X2xvY2tfdCAqbCA9CisgICAgICBfX2ttcF9sb29rdXBfaW5kaXJlY3RfbG9jaygodm9pZCAqKilsb2NrLCAib21wX3Rlc3RfbG9jayIpOworICByZXR1cm4gS01QX0lfTE9DS19GVU5DKGwsIHRlc3QpKGwtPmxvY2ssIGd0aWQpOworfQorCitrbXBfZHluYV9sb2Nrc2VxX3QgX19rbXBfdXNlcl9sb2NrX3NlcSA9IGxvY2tzZXFfcXVldWluZzsKKworLy8gVGhpcyBpcyB1c2VkIG9ubHkgaW4ga21wX2Vycm9yLmNwcCB3aGVuIGNvbnNpc3RlbmN5IGNoZWNraW5nIGlzIG9uLgora21wX2ludDMyIF9fa21wX2dldF91c2VyX2xvY2tfb3duZXIoa21wX3VzZXJfbG9ja19wIGxjaywga21wX3VpbnQzMiBzZXEpIHsKKyAgc3dpdGNoIChzZXEpIHsKKyAgY2FzZSBsb2Nrc2VxX3RhczoKKyAgY2FzZSBsb2Nrc2VxX25lc3RlZF90YXM6CisgICAgcmV0dXJuIF9fa21wX2dldF90YXNfbG9ja19vd25lcigoa21wX3Rhc19sb2NrX3QgKilsY2spOworI2lmIEtNUF9VU0VfRlVURVgKKyAgY2FzZSBsb2Nrc2VxX2Z1dGV4OgorICBjYXNlIGxvY2tzZXFfbmVzdGVkX2Z1dGV4OgorICAgIHJldHVybiBfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lcigoa21wX2Z1dGV4X2xvY2tfdCAqKWxjayk7CisjZW5kaWYKKyAgY2FzZSBsb2Nrc2VxX3RpY2tldDoKKyAgY2FzZSBsb2Nrc2VxX25lc3RlZF90aWNrZXQ6CisgICAgcmV0dXJuIF9fa21wX2dldF90aWNrZXRfbG9ja19vd25lcigoa21wX3RpY2tldF9sb2NrX3QgKilsY2spOworICBjYXNlIGxvY2tzZXFfcXVldWluZzoKKyAgY2FzZSBsb2Nrc2VxX25lc3RlZF9xdWV1aW5nOgorI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyAgY2FzZSBsb2Nrc2VxX2FkYXB0aXZlOgorI2VuZGlmCisgICAgcmV0dXJuIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoKGttcF9xdWV1aW5nX2xvY2tfdCAqKWxjayk7CisgIGNhc2UgbG9ja3NlcV9kcmRwYToKKyAgY2FzZSBsb2Nrc2VxX25lc3RlZF9kcmRwYToKKyAgICByZXR1cm4gX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIoKGttcF9kcmRwYV9sb2NrX3QgKilsY2spOworICBkZWZhdWx0OgorICAgIHJldHVybiAwOworICB9Cit9CisKKy8vIEluaXRpYWxpemVzIGRhdGEgZm9yIGR5bmFtaWMgdXNlciBsb2Nrcy4KK3ZvaWQgX19rbXBfaW5pdF9keW5hbWljX3VzZXJfbG9ja3MoKSB7CisgIC8vIEluaXRpYWxpemUganVtcCB0YWJsZSBmb3IgdGhlIGxvY2sgZnVuY3Rpb25zCisgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICBfX2ttcF9kaXJlY3Rfc2V0ID0gZGlyZWN0X3NldF9jaGVjazsKKyAgICBfX2ttcF9kaXJlY3RfdW5zZXQgPSBkaXJlY3RfdW5zZXRfY2hlY2s7CisgICAgX19rbXBfZGlyZWN0X3Rlc3QgPSBkaXJlY3RfdGVzdF9jaGVjazsKKyAgICBfX2ttcF9pbmRpcmVjdF9zZXQgPSBpbmRpcmVjdF9zZXRfY2hlY2s7CisgICAgX19rbXBfaW5kaXJlY3RfdW5zZXQgPSBpbmRpcmVjdF91bnNldF9jaGVjazsKKyAgICBfX2ttcF9pbmRpcmVjdF90ZXN0ID0gaW5kaXJlY3RfdGVzdF9jaGVjazsKKyAgfSBlbHNlIHsKKyAgICBfX2ttcF9kaXJlY3Rfc2V0ID0gZGlyZWN0X3NldDsKKyAgICBfX2ttcF9kaXJlY3RfdW5zZXQgPSBkaXJlY3RfdW5zZXQ7CisgICAgX19rbXBfZGlyZWN0X3Rlc3QgPSBkaXJlY3RfdGVzdDsKKyAgICBfX2ttcF9pbmRpcmVjdF9zZXQgPSBpbmRpcmVjdF9zZXQ7CisgICAgX19rbXBfaW5kaXJlY3RfdW5zZXQgPSBpbmRpcmVjdF91bnNldDsKKyAgICBfX2ttcF9pbmRpcmVjdF90ZXN0ID0gaW5kaXJlY3RfdGVzdDsKKyAgfQorICAvLyBJZiB0aGUgdXNlciBsb2NrcyBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCwgdGhlbiByZXR1cm4uIEFsbG93IHRoZQorICAvLyBzd2l0Y2ggYmV0d2VlbiBkaWZmZXJlbnQgS01QX0NPTlNJU1RFTkNZX0NIRUNLIHZhbHVlcywgYnV0IGRvIG5vdCBhbGxvY2F0ZQorICAvLyBuZXcgbG9jayB0YWJsZXMgaWYgdGhleSBoYXZlIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQuCisgIGlmIChfX2ttcF9pbml0X3VzZXJfbG9ja3MpCisgICAgcmV0dXJuOworCisgIC8vIEluaXRpYWxpemUgbG9jayBpbmRleCB0YWJsZQorICBfX2ttcF9pX2xvY2tfdGFibGUuc2l6ZSA9IEtNUF9JX0xPQ0tfQ0hVTks7CisgIF9fa21wX2lfbG9ja190YWJsZS50YWJsZSA9CisgICAgICAoa21wX2luZGlyZWN0X2xvY2tfdCAqKilfX2ttcF9hbGxvY2F0ZShzaXplb2Yoa21wX2luZGlyZWN0X2xvY2tfdCAqKSk7CisgICooX19rbXBfaV9sb2NrX3RhYmxlLnRhYmxlKSA9IChrbXBfaW5kaXJlY3RfbG9ja190ICopX19rbXBfYWxsb2NhdGUoCisgICAgICBLTVBfSV9MT0NLX0NIVU5LICogc2l6ZW9mKGttcF9pbmRpcmVjdF9sb2NrX3QpKTsKKyAgX19rbXBfaV9sb2NrX3RhYmxlLm5leHQgPSAwOworCisgIC8vIEluZGlyZWN0IGxvY2sgc2l6ZQorICBfX2ttcF9pbmRpcmVjdF9sb2NrX3NpemVbbG9ja3RhZ190aWNrZXRdID0gc2l6ZW9mKGttcF90aWNrZXRfbG9ja190KTsKKyAgX19rbXBfaW5kaXJlY3RfbG9ja19zaXplW2xvY2t0YWdfcXVldWluZ10gPSBzaXplb2Yoa21wX3F1ZXVpbmdfbG9ja190KTsKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgIF9fa21wX2luZGlyZWN0X2xvY2tfc2l6ZVtsb2NrdGFnX2FkYXB0aXZlXSA9IHNpemVvZihrbXBfYWRhcHRpdmVfbG9ja190KTsKKyNlbmRpZgorICBfX2ttcF9pbmRpcmVjdF9sb2NrX3NpemVbbG9ja3RhZ19kcmRwYV0gPSBzaXplb2Yoa21wX2RyZHBhX2xvY2tfdCk7CisjaWYgS01QX1VTRV9UU1gKKyAgX19rbXBfaW5kaXJlY3RfbG9ja19zaXplW2xvY2t0YWdfcnRtXSA9IHNpemVvZihrbXBfcXVldWluZ19sb2NrX3QpOworI2VuZGlmCisgIF9fa21wX2luZGlyZWN0X2xvY2tfc2l6ZVtsb2NrdGFnX25lc3RlZF90YXNdID0gc2l6ZW9mKGttcF90YXNfbG9ja190KTsKKyNpZiBLTVBfVVNFX0ZVVEVYCisgIF9fa21wX2luZGlyZWN0X2xvY2tfc2l6ZVtsb2NrdGFnX25lc3RlZF9mdXRleF0gPSBzaXplb2Yoa21wX2Z1dGV4X2xvY2tfdCk7CisjZW5kaWYKKyAgX19rbXBfaW5kaXJlY3RfbG9ja19zaXplW2xvY2t0YWdfbmVzdGVkX3RpY2tldF0gPSBzaXplb2Yoa21wX3RpY2tldF9sb2NrX3QpOworICBfX2ttcF9pbmRpcmVjdF9sb2NrX3NpemVbbG9ja3RhZ19uZXN0ZWRfcXVldWluZ10gPSBzaXplb2Yoa21wX3F1ZXVpbmdfbG9ja190KTsKKyAgX19rbXBfaW5kaXJlY3RfbG9ja19zaXplW2xvY2t0YWdfbmVzdGVkX2RyZHBhXSA9IHNpemVvZihrbXBfZHJkcGFfbG9ja190KTsKKworLy8gSW5pdGlhbGl6ZSBsb2NrIGFjY2Vzc29yL21vZGlmaWVyCisjZGVmaW5lIGZpbGxfanVtcHModGFibGUsIGV4cGFuZCwgc2VwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YWJsZVtsb2NrdGFnIyNzZXAjI3RpY2tldF0gPSBleHBhbmQodGlja2V0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGFibGVbbG9ja3RhZyMjc2VwIyNxdWV1aW5nXSA9IGV4cGFuZChxdWV1aW5nKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRhYmxlW2xvY2t0YWcjI3NlcCMjZHJkcGFdID0gZXhwYW5kKGRyZHBhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworI2RlZmluZSBmaWxsX3RhYmxlKHRhYmxlLCBleHBhbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmlsbF9qdW1wcyh0YWJsZSwgZXhwYW5kLCBfKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRhYmxlW2xvY2t0YWdfYWRhcHRpdmVdID0gZXhwYW5kKHF1ZXVpbmcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmaWxsX2p1bXBzKHRhYmxlLCBleHBhbmQsIF9uZXN0ZWRfKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNlbHNlCisjZGVmaW5lIGZpbGxfdGFibGUodGFibGUsIGV4cGFuZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmaWxsX2p1bXBzKHRhYmxlLCBleHBhbmQsIF8pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmlsbF9qdW1wcyh0YWJsZSwgZXhwYW5kLCBfbmVzdGVkXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworCisjZGVmaW5lIGV4cGFuZChsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAodm9pZCAoKikoa21wX3VzZXJfbG9ja19wLCBjb25zdCBpZGVudF90ICopKSBfX2ttcF9zZXRfIyNsIyNfbG9ja19sb2NhdGlvbgorICBmaWxsX3RhYmxlKF9fa21wX2luZGlyZWN0X3NldF9sb2NhdGlvbiwgZXhwYW5kKTsKKyN1bmRlZiBleHBhbmQKKyNkZWZpbmUgZXhwYW5kKGwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICh2b2lkICgqKShrbXBfdXNlcl9sb2NrX3AsIGttcF9sb2NrX2ZsYWdzX3QpKSBfX2ttcF9zZXRfIyNsIyNfbG9ja19mbGFncworICBmaWxsX3RhYmxlKF9fa21wX2luZGlyZWN0X3NldF9mbGFncywgZXhwYW5kKTsKKyN1bmRlZiBleHBhbmQKKyNkZWZpbmUgZXhwYW5kKGwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChjb25zdCBpZGVudF90ICooKikoa21wX3VzZXJfbG9ja19wKSkgX19rbXBfZ2V0XyMjbCMjX2xvY2tfbG9jYXRpb24KKyAgZmlsbF90YWJsZShfX2ttcF9pbmRpcmVjdF9nZXRfbG9jYXRpb24sIGV4cGFuZCk7CisjdW5kZWYgZXhwYW5kCisjZGVmaW5lIGV4cGFuZChsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoa21wX2xvY2tfZmxhZ3NfdCgqKShrbXBfdXNlcl9sb2NrX3ApKSBfX2ttcF9nZXRfIyNsIyNfbG9ja19mbGFncworICBmaWxsX3RhYmxlKF9fa21wX2luZGlyZWN0X2dldF9mbGFncywgZXhwYW5kKTsKKyN1bmRlZiBleHBhbmQKKworICBfX2ttcF9pbml0X3VzZXJfbG9ja3MgPSBUUlVFOworfQorCisvLyBDbGVhbiB1cCB0aGUgbG9jayB0YWJsZS4KK3ZvaWQgX19rbXBfY2xlYW51cF9pbmRpcmVjdF91c2VyX2xvY2tzKCkgeworICBrbXBfbG9ja19pbmRleF90IGk7CisgIGludCBrOworCisgIC8vIENsZWFuIHVwIGxvY2tzIGluIHRoZSBwb29scyBmaXJzdCAodGhleSB3ZXJlIGFscmVhZHkgZGVzdHJveWVkIGJlZm9yZSBnb2luZworICAvLyBpbnRvIHRoZSBwb29scykuCisgIGZvciAoayA9IDA7IGsgPCBLTVBfTlVNX0lfTE9DS1M7ICsraykgeworICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmwgPSBfX2ttcF9pbmRpcmVjdF9sb2NrX3Bvb2xba107CisgICAgd2hpbGUgKGwgIT0gTlVMTCkgeworICAgICAga21wX2luZGlyZWN0X2xvY2tfdCAqbGwgPSBsOworICAgICAgbCA9IChrbXBfaW5kaXJlY3RfbG9ja190ICopbC0+bG9jay0+cG9vbC5uZXh0OworICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfY2xlYW51cF9pbmRpcmVjdF91c2VyX2xvY2tzOiBmcmVlaW5nICVwIGZyb20gcG9vbFxuIiwKKyAgICAgICAgICAgICAgICAgICAgbGwpKTsKKyAgICAgIF9fa21wX2ZyZWUobGwtPmxvY2spOworICAgICAgbGwtPmxvY2sgPSBOVUxMOworICAgIH0KKyAgICBfX2ttcF9pbmRpcmVjdF9sb2NrX3Bvb2xba10gPSBOVUxMOworICB9CisgIC8vIENsZWFuIHVwIHRoZSByZW1haW5pbmcgdW5kZXN0cm95ZWQgbG9ja3MuCisgIGZvciAoaSA9IDA7IGkgPCBfX2ttcF9pX2xvY2tfdGFibGUubmV4dDsgaSsrKSB7CisgICAga21wX2luZGlyZWN0X2xvY2tfdCAqbCA9IEtNUF9HRVRfSV9MT0NLKGkpOworICAgIGlmIChsLT5sb2NrICE9IE5VTEwpIHsKKyAgICAgIC8vIExvY2tzIG5vdCBkZXN0cm95ZWQgZXhwbGljaXRseSBuZWVkIHRvIGJlIGRlc3Ryb3llZCBoZXJlLgorICAgICAgS01QX0lfTE9DS19GVU5DKGwsIGRlc3Ryb3kpKGwtPmxvY2spOworICAgICAgS0FfVFJBQ0UoCisgICAgICAgICAgMjAsCisgICAgICAgICAgKCJfX2ttcF9jbGVhbnVwX2luZGlyZWN0X3VzZXJfbG9ja3M6IGRlc3Ryb3kvZnJlZWluZyAlcCBmcm9tIHRhYmxlXG4iLAorICAgICAgICAgICBsKSk7CisgICAgICBfX2ttcF9mcmVlKGwtPmxvY2spOworICAgIH0KKyAgfQorICAvLyBGcmVlIHRoZSB0YWJsZQorICBmb3IgKGkgPSAwOyBpIDwgX19rbXBfaV9sb2NrX3RhYmxlLnNpemUgLyBLTVBfSV9MT0NLX0NIVU5LOyBpKyspCisgICAgX19rbXBfZnJlZShfX2ttcF9pX2xvY2tfdGFibGUudGFibGVbaV0pOworICBfX2ttcF9mcmVlKF9fa21wX2lfbG9ja190YWJsZS50YWJsZSk7CisKKyAgX19rbXBfaW5pdF91c2VyX2xvY2tzID0gRkFMU0U7Cit9CisKK2VudW0ga21wX2xvY2tfa2luZCBfX2ttcF91c2VyX2xvY2tfa2luZCA9IGxrX2RlZmF1bHQ7CitpbnQgX19rbXBfbnVtX2xvY2tzX2luX2Jsb2NrID0gMTsgLy8gRklYTUUgLSB0dW5lIHRoaXMgdmFsdWUKKworI2Vsc2UgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworLyogdXNlciBsb2NrcworICogVGhleSBhcmUgaW1wbGVtZW50ZWQgYXMgYSB0YWJsZSBvZiBmdW5jdGlvbiBwb2ludGVycyB3aGljaCBhcmUgc2V0IHRvIHRoZQorICogbG9jayBmdW5jdGlvbnMgb2YgdGhlIGFwcHJvcHJpYXRlIGtpbmQsIG9uY2UgdGhhdCBoYXMgYmVlbiBkZXRlcm1pbmVkLiAqLworCitlbnVtIGttcF9sb2NrX2tpbmQgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa19kZWZhdWx0OworCitzaXplX3QgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZSA9IDA7CitzaXplX3QgX19rbXBfdXNlcl9sb2NrX3NpemUgPSAwOworCitrbXBfaW50MzIgKCpfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyXykoa21wX3VzZXJfbG9ja19wIGxjaykgPSBOVUxMOworaW50ICgqX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfKShrbXBfdXNlcl9sb2NrX3AgbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgZ3RpZCkgPSBOVUxMOworCitpbnQgKCpfX2ttcF90ZXN0X3VzZXJfbG9ja193aXRoX2NoZWNrc18pKGttcF91c2VyX2xvY2tfcCBsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKSA9IE5VTEw7CitpbnQgKCpfX2ttcF9yZWxlYXNlX3VzZXJfbG9ja193aXRoX2NoZWNrc18pKGttcF91c2VyX2xvY2tfcCBsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKSA9IE5VTEw7Cit2b2lkICgqX19rbXBfaW5pdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfKShrbXBfdXNlcl9sb2NrX3AgbGNrKSA9IE5VTEw7Cit2b2lkICgqX19rbXBfZGVzdHJveV91c2VyX2xvY2tfKShrbXBfdXNlcl9sb2NrX3AgbGNrKSA9IE5VTEw7Cit2b2lkICgqX19rbXBfZGVzdHJveV91c2VyX2xvY2tfd2l0aF9jaGVja3NfKShrbXBfdXNlcl9sb2NrX3AgbGNrKSA9IE5VTEw7CitpbnQgKCpfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfKShrbXBfdXNlcl9sb2NrX3AgbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGd0aWQpID0gTlVMTDsKKworaW50ICgqX19rbXBfdGVzdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXykoa21wX3VzZXJfbG9ja19wIGxjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKSA9IE5VTEw7CitpbnQgKCpfX2ttcF9yZWxlYXNlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfKShrbXBfdXNlcl9sb2NrX3AgbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGd0aWQpID0gTlVMTDsKK3ZvaWQgKCpfX2ttcF9pbml0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfKShrbXBfdXNlcl9sb2NrX3AgbGNrKSA9IE5VTEw7Cit2b2lkICgqX19rbXBfZGVzdHJveV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXykoa21wX3VzZXJfbG9ja19wIGxjaykgPSBOVUxMOworCitpbnQgKCpfX2ttcF9pc191c2VyX2xvY2tfaW5pdGlhbGl6ZWRfKShrbXBfdXNlcl9sb2NrX3AgbGNrKSA9IE5VTEw7Citjb25zdCBpZGVudF90ICooKl9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fKShrbXBfdXNlcl9sb2NrX3AgbGNrKSA9IE5VTEw7Cit2b2lkICgqX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbl8pKGttcF91c2VyX2xvY2tfcCBsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkZW50X3QgKmxvYykgPSBOVUxMOwora21wX2xvY2tfZmxhZ3NfdCAoKl9fa21wX2dldF91c2VyX2xvY2tfZmxhZ3NfKShrbXBfdXNlcl9sb2NrX3AgbGNrKSA9IE5VTEw7Cit2b2lkICgqX19rbXBfc2V0X3VzZXJfbG9ja19mbGFnc18pKGttcF91c2VyX2xvY2tfcCBsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9sb2NrX2ZsYWdzX3QgZmxhZ3MpID0gTlVMTDsKKwordm9pZCBfX2ttcF9zZXRfdXNlcl9sb2NrX3ZwdHJzKGttcF9sb2NrX2tpbmRfdCB1c2VyX2xvY2tfa2luZCkgeworICBzd2l0Y2ggKHVzZXJfbG9ja19raW5kKSB7CisgIGNhc2UgbGtfZGVmYXVsdDoKKyAgZGVmYXVsdDoKKyAgICBLTVBfQVNTRVJUKDApOworCisgIGNhc2UgbGtfdGFzOiB7CisgICAgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZihrbXBfYmFzZV90YXNfbG9ja190KTsKKyAgICBfX2ttcF91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZihrbXBfdGFzX2xvY2tfdCk7CisKKyAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyXyA9CisgICAgICAgIChrbXBfaW50MzIoKikoa21wX3VzZXJfbG9ja19wKSkoJl9fa21wX2dldF90YXNfbG9ja19vd25lcik7CisKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICBLTVBfQklORF9VU0VSX0xPQ0tfV0lUSF9DSEVDS1ModGFzKTsKKyAgICAgIEtNUF9CSU5EX05FU1RFRF9VU0VSX0xPQ0tfV0lUSF9DSEVDS1ModGFzKTsKKyAgICB9IGVsc2UgeworICAgICAgS01QX0JJTkRfVVNFUl9MT0NLKHRhcyk7CisgICAgICBLTVBfQklORF9ORVNURURfVVNFUl9MT0NLKHRhcyk7CisgICAgfQorCisgICAgX19rbXBfZGVzdHJveV91c2VyX2xvY2tfID0KKyAgICAgICAgKHZvaWQgKCopKGttcF91c2VyX2xvY2tfcCkpKCZfX2ttcF9kZXN0cm95X3Rhc19sb2NrKTsKKworICAgIF9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8gPSAoaW50ICgqKShrbXBfdXNlcl9sb2NrX3ApKU5VTEw7CisKKyAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9IChjb25zdCBpZGVudF90ICooKikoa21wX3VzZXJfbG9ja19wKSlOVUxMOworCisgICAgX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gPQorICAgICAgICAodm9pZCAoKikoa21wX3VzZXJfbG9ja19wLCBjb25zdCBpZGVudF90ICopKU5VTEw7CisKKyAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2ZsYWdzXyA9IChrbXBfbG9ja19mbGFnc190KCopKGttcF91c2VyX2xvY2tfcCkpTlVMTDsKKworICAgIF9fa21wX3NldF91c2VyX2xvY2tfZmxhZ3NfID0KKyAgICAgICAgKHZvaWQgKCopKGttcF91c2VyX2xvY2tfcCwga21wX2xvY2tfZmxhZ3NfdCkpTlVMTDsKKyAgfSBicmVhazsKKworI2lmIEtNUF9VU0VfRlVURVgKKworICBjYXNlIGxrX2Z1dGV4OiB7CisgICAgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZihrbXBfYmFzZV9mdXRleF9sb2NrX3QpOworICAgIF9fa21wX3VzZXJfbG9ja19zaXplID0gc2l6ZW9mKGttcF9mdXRleF9sb2NrX3QpOworCisgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcl8gPQorICAgICAgICAoa21wX2ludDMyKCopKGttcF91c2VyX2xvY2tfcCkpKCZfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lcik7CisKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICBLTVBfQklORF9VU0VSX0xPQ0tfV0lUSF9DSEVDS1MoZnV0ZXgpOworICAgICAgS01QX0JJTkRfTkVTVEVEX1VTRVJfTE9DS19XSVRIX0NIRUNLUyhmdXRleCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEtNUF9CSU5EX1VTRVJfTE9DSyhmdXRleCk7CisgICAgICBLTVBfQklORF9ORVNURURfVVNFUl9MT0NLKGZ1dGV4KTsKKyAgICB9CisKKyAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja18gPQorICAgICAgICAodm9pZCAoKikoa21wX3VzZXJfbG9ja19wKSkoJl9fa21wX2Rlc3Ryb3lfZnV0ZXhfbG9jayk7CisKKyAgICBfX2ttcF9pc191c2VyX2xvY2tfaW5pdGlhbGl6ZWRfID0gKGludCAoKikoa21wX3VzZXJfbG9ja19wKSlOVUxMOworCisgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gPSAoY29uc3QgaWRlbnRfdCAqKCopKGttcF91c2VyX2xvY2tfcCkpTlVMTDsKKworICAgIF9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgKHZvaWQgKCopKGttcF91c2VyX2xvY2tfcCwgY29uc3QgaWRlbnRfdCAqKSlOVUxMOworCisgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gPSAoa21wX2xvY2tfZmxhZ3NfdCgqKShrbXBfdXNlcl9sb2NrX3ApKU5VTEw7CisKKyAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICh2b2lkICgqKShrbXBfdXNlcl9sb2NrX3AsIGttcF9sb2NrX2ZsYWdzX3QpKU5VTEw7CisgIH0gYnJlYWs7CisKKyNlbmRpZiAvLyBLTVBfVVNFX0ZVVEVYCisKKyAgY2FzZSBsa190aWNrZXQ6IHsKKyAgICBfX2ttcF9iYXNlX3VzZXJfbG9ja19zaXplID0gc2l6ZW9mKGttcF9iYXNlX3RpY2tldF9sb2NrX3QpOworICAgIF9fa21wX3VzZXJfbG9ja19zaXplID0gc2l6ZW9mKGttcF90aWNrZXRfbG9ja190KTsKKworICAgIF9fa21wX2dldF91c2VyX2xvY2tfb3duZXJfID0KKyAgICAgICAgKGttcF9pbnQzMigqKShrbXBfdXNlcl9sb2NrX3ApKSgmX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKTsKKworICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgIEtNUF9CSU5EX1VTRVJfTE9DS19XSVRIX0NIRUNLUyh0aWNrZXQpOworICAgICAgS01QX0JJTkRfTkVTVEVEX1VTRVJfTE9DS19XSVRIX0NIRUNLUyh0aWNrZXQpOworICAgIH0gZWxzZSB7CisgICAgICBLTVBfQklORF9VU0VSX0xPQ0sodGlja2V0KTsKKyAgICAgIEtNUF9CSU5EX05FU1RFRF9VU0VSX0xPQ0sodGlja2V0KTsKKyAgICB9CisKKyAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja18gPQorICAgICAgICAodm9pZCAoKikoa21wX3VzZXJfbG9ja19wKSkoJl9fa21wX2Rlc3Ryb3lfdGlja2V0X2xvY2spOworCisgICAgX19rbXBfaXNfdXNlcl9sb2NrX2luaXRpYWxpemVkXyA9CisgICAgICAgIChpbnQgKCopKGttcF91c2VyX2xvY2tfcCkpKCZfX2ttcF9pc190aWNrZXRfbG9ja19pbml0aWFsaXplZCk7CisKKyAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgIChjb25zdCBpZGVudF90ICooKikoa21wX3VzZXJfbG9ja19wKSkoJl9fa21wX2dldF90aWNrZXRfbG9ja19sb2NhdGlvbik7CisKKyAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9ICh2b2lkICgqKSgKKyAgICAgICAga21wX3VzZXJfbG9ja19wLCBjb25zdCBpZGVudF90ICopKSgmX19rbXBfc2V0X3RpY2tldF9sb2NrX2xvY2F0aW9uKTsKKworICAgIF9fa21wX2dldF91c2VyX2xvY2tfZmxhZ3NfID0KKyAgICAgICAgKGttcF9sb2NrX2ZsYWdzX3QoKikoa21wX3VzZXJfbG9ja19wKSkoJl9fa21wX2dldF90aWNrZXRfbG9ja19mbGFncyk7CisKKyAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzXyA9ICh2b2lkICgqKShrbXBfdXNlcl9sb2NrX3AsIGttcF9sb2NrX2ZsYWdzX3QpKSgKKyAgICAgICAgJl9fa21wX3NldF90aWNrZXRfbG9ja19mbGFncyk7CisgIH0gYnJlYWs7CisKKyAgY2FzZSBsa19xdWV1aW5nOiB7CisgICAgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZihrbXBfYmFzZV9xdWV1aW5nX2xvY2tfdCk7CisgICAgX19rbXBfdXNlcl9sb2NrX3NpemUgPSBzaXplb2Yoa21wX3F1ZXVpbmdfbG9ja190KTsKKworICAgIF9fa21wX2dldF91c2VyX2xvY2tfb3duZXJfID0KKyAgICAgICAgKGttcF9pbnQzMigqKShrbXBfdXNlcl9sb2NrX3ApKSgmX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lcik7CisKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICBLTVBfQklORF9VU0VSX0xPQ0tfV0lUSF9DSEVDS1MocXVldWluZyk7CisgICAgICBLTVBfQklORF9ORVNURURfVVNFUl9MT0NLX1dJVEhfQ0hFQ0tTKHF1ZXVpbmcpOworICAgIH0gZWxzZSB7CisgICAgICBLTVBfQklORF9VU0VSX0xPQ0socXVldWluZyk7CisgICAgICBLTVBfQklORF9ORVNURURfVVNFUl9MT0NLKHF1ZXVpbmcpOworICAgIH0KKworICAgIF9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrXyA9CisgICAgICAgICh2b2lkICgqKShrbXBfdXNlcl9sb2NrX3ApKSgmX19rbXBfZGVzdHJveV9xdWV1aW5nX2xvY2spOworCisgICAgX19rbXBfaXNfdXNlcl9sb2NrX2luaXRpYWxpemVkXyA9CisgICAgICAgIChpbnQgKCopKGttcF91c2VyX2xvY2tfcCkpKCZfX2ttcF9pc19xdWV1aW5nX2xvY2tfaW5pdGlhbGl6ZWQpOworCisgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gPQorICAgICAgICAoY29uc3QgaWRlbnRfdCAqKCopKGttcF91c2VyX2xvY2tfcCkpKCZfX2ttcF9nZXRfcXVldWluZ19sb2NrX2xvY2F0aW9uKTsKKworICAgIF9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb25fID0gKHZvaWQgKCopKAorICAgICAgICBrbXBfdXNlcl9sb2NrX3AsIGNvbnN0IGlkZW50X3QgKikpKCZfX2ttcF9zZXRfcXVldWluZ19sb2NrX2xvY2F0aW9uKTsKKworICAgIF9fa21wX2dldF91c2VyX2xvY2tfZmxhZ3NfID0KKyAgICAgICAgKGttcF9sb2NrX2ZsYWdzX3QoKikoa21wX3VzZXJfbG9ja19wKSkoJl9fa21wX2dldF9xdWV1aW5nX2xvY2tfZmxhZ3MpOworCisgICAgX19rbXBfc2V0X3VzZXJfbG9ja19mbGFnc18gPSAodm9pZCAoKikoa21wX3VzZXJfbG9ja19wLCBrbXBfbG9ja19mbGFnc190KSkoCisgICAgICAgICZfX2ttcF9zZXRfcXVldWluZ19sb2NrX2ZsYWdzKTsKKyAgfSBicmVhazsKKworI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyAgY2FzZSBsa19hZGFwdGl2ZTogeworICAgIF9fa21wX2Jhc2VfdXNlcl9sb2NrX3NpemUgPSBzaXplb2Yoa21wX2Jhc2VfYWRhcHRpdmVfbG9ja190KTsKKyAgICBfX2ttcF91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZihrbXBfYWRhcHRpdmVfbG9ja190KTsKKworICAgIF9fa21wX2dldF91c2VyX2xvY2tfb3duZXJfID0KKyAgICAgICAgKGttcF9pbnQzMigqKShrbXBfdXNlcl9sb2NrX3ApKSgmX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lcik7CisKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICBLTVBfQklORF9VU0VSX0xPQ0tfV0lUSF9DSEVDS1MoYWRhcHRpdmUpOworICAgIH0gZWxzZSB7CisgICAgICBLTVBfQklORF9VU0VSX0xPQ0soYWRhcHRpdmUpOworICAgIH0KKworICAgIF9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrXyA9CisgICAgICAgICh2b2lkICgqKShrbXBfdXNlcl9sb2NrX3ApKSgmX19rbXBfZGVzdHJveV9hZGFwdGl2ZV9sb2NrKTsKKworICAgIF9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8gPQorICAgICAgICAoaW50ICgqKShrbXBfdXNlcl9sb2NrX3ApKSgmX19rbXBfaXNfcXVldWluZ19sb2NrX2luaXRpYWxpemVkKTsKKworICAgIF9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgKGNvbnN0IGlkZW50X3QgKigqKShrbXBfdXNlcl9sb2NrX3ApKSgmX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19sb2NhdGlvbik7CisKKyAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9ICh2b2lkICgqKSgKKyAgICAgICAga21wX3VzZXJfbG9ja19wLCBjb25zdCBpZGVudF90ICopKSgmX19rbXBfc2V0X3F1ZXVpbmdfbG9ja19sb2NhdGlvbik7CisKKyAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgIChrbXBfbG9ja19mbGFnc190KCopKGttcF91c2VyX2xvY2tfcCkpKCZfX2ttcF9nZXRfcXVldWluZ19sb2NrX2ZsYWdzKTsKKworICAgIF9fa21wX3NldF91c2VyX2xvY2tfZmxhZ3NfID0gKHZvaWQgKCopKGttcF91c2VyX2xvY2tfcCwga21wX2xvY2tfZmxhZ3NfdCkpKAorICAgICAgICAmX19rbXBfc2V0X3F1ZXVpbmdfbG9ja19mbGFncyk7CisKKyAgfSBicmVhazsKKyNlbmRpZiAvLyBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKyAgY2FzZSBsa19kcmRwYTogeworICAgIF9fa21wX2Jhc2VfdXNlcl9sb2NrX3NpemUgPSBzaXplb2Yoa21wX2Jhc2VfZHJkcGFfbG9ja190KTsKKyAgICBfX2ttcF91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZihrbXBfZHJkcGFfbG9ja190KTsKKworICAgIF9fa21wX2dldF91c2VyX2xvY2tfb3duZXJfID0KKyAgICAgICAgKGttcF9pbnQzMigqKShrbXBfdXNlcl9sb2NrX3ApKSgmX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIpOworCisgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgS01QX0JJTkRfVVNFUl9MT0NLX1dJVEhfQ0hFQ0tTKGRyZHBhKTsKKyAgICAgIEtNUF9CSU5EX05FU1RFRF9VU0VSX0xPQ0tfV0lUSF9DSEVDS1MoZHJkcGEpOworICAgIH0gZWxzZSB7CisgICAgICBLTVBfQklORF9VU0VSX0xPQ0soZHJkcGEpOworICAgICAgS01QX0JJTkRfTkVTVEVEX1VTRVJfTE9DSyhkcmRwYSk7CisgICAgfQorCisgICAgX19rbXBfZGVzdHJveV91c2VyX2xvY2tfID0KKyAgICAgICAgKHZvaWQgKCopKGttcF91c2VyX2xvY2tfcCkpKCZfX2ttcF9kZXN0cm95X2RyZHBhX2xvY2spOworCisgICAgX19rbXBfaXNfdXNlcl9sb2NrX2luaXRpYWxpemVkXyA9CisgICAgICAgIChpbnQgKCopKGttcF91c2VyX2xvY2tfcCkpKCZfX2ttcF9pc19kcmRwYV9sb2NrX2luaXRpYWxpemVkKTsKKworICAgIF9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgKGNvbnN0IGlkZW50X3QgKigqKShrbXBfdXNlcl9sb2NrX3ApKSgmX19rbXBfZ2V0X2RyZHBhX2xvY2tfbG9jYXRpb24pOworCisgICAgX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gPSAodm9pZCAoKikoCisgICAgICAgIGttcF91c2VyX2xvY2tfcCwgY29uc3QgaWRlbnRfdCAqKSkoJl9fa21wX3NldF9kcmRwYV9sb2NrX2xvY2F0aW9uKTsKKworICAgIF9fa21wX2dldF91c2VyX2xvY2tfZmxhZ3NfID0KKyAgICAgICAgKGttcF9sb2NrX2ZsYWdzX3QoKikoa21wX3VzZXJfbG9ja19wKSkoJl9fa21wX2dldF9kcmRwYV9sb2NrX2ZsYWdzKTsKKworICAgIF9fa21wX3NldF91c2VyX2xvY2tfZmxhZ3NfID0gKHZvaWQgKCopKGttcF91c2VyX2xvY2tfcCwga21wX2xvY2tfZmxhZ3NfdCkpKAorICAgICAgICAmX19rbXBfc2V0X2RyZHBhX2xvY2tfZmxhZ3MpOworICB9IGJyZWFrOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFVzZXIgbG9jayB0YWJsZSAmIGxvY2sgYWxsb2NhdGlvbgorCitrbXBfbG9ja190YWJsZV90IF9fa21wX3VzZXJfbG9ja190YWJsZSA9IHsxLCAwLCBOVUxMfTsKK2ttcF91c2VyX2xvY2tfcCBfX2ttcF9sb2NrX3Bvb2wgPSBOVUxMOworCisvLyBMb2NrIGJsb2NrLWFsbG9jYXRpb24gc3VwcG9ydC4KK2ttcF9ibG9ja19vZl9sb2NrcyAqX19rbXBfbG9ja19ibG9ja3MgPSBOVUxMOworaW50IF9fa21wX251bV9sb2Nrc19pbl9ibG9jayA9IDE7IC8vIEZJWE1FIC0gdHVuZSB0aGlzIHZhbHVlCisKK3N0YXRpYyBrbXBfbG9ja19pbmRleF90IF9fa21wX2xvY2tfdGFibGVfaW5zZXJ0KGttcF91c2VyX2xvY2tfcCBsY2spIHsKKyAgLy8gQXNzdW1lIHRoYXQga21wX2dsb2JhbF9sb2NrIGlzIGhlbGQgdXBvbiBlbnRyeS9leGl0LgorICBrbXBfbG9ja19pbmRleF90IGluZGV4OworICBpZiAoX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQgPj0gX19rbXBfdXNlcl9sb2NrX3RhYmxlLmFsbG9jYXRlZCkgeworICAgIGttcF9sb2NrX2luZGV4X3Qgc2l6ZTsKKyAgICBrbXBfdXNlcl9sb2NrX3AgKnRhYmxlOworICAgIC8vIFJlYWxsb2NhdGUgbG9jayB0YWJsZS4KKyAgICBpZiAoX19rbXBfdXNlcl9sb2NrX3RhYmxlLmFsbG9jYXRlZCA9PSAwKSB7CisgICAgICBzaXplID0gMTAyNDsKKyAgICB9IGVsc2UgeworICAgICAgc2l6ZSA9IF9fa21wX3VzZXJfbG9ja190YWJsZS5hbGxvY2F0ZWQgKiAyOworICAgIH0KKyAgICB0YWJsZSA9IChrbXBfdXNlcl9sb2NrX3AgKilfX2ttcF9hbGxvY2F0ZShzaXplb2Yoa21wX3VzZXJfbG9ja19wKSAqIHNpemUpOworICAgIEtNUF9NRU1DUFkodGFibGUgKyAxLCBfX2ttcF91c2VyX2xvY2tfdGFibGUudGFibGUgKyAxLAorICAgICAgICAgICAgICAgc2l6ZW9mKGttcF91c2VyX2xvY2tfcCkgKiAoX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQgLSAxKSk7CisgICAgdGFibGVbMF0gPSAoa21wX3VzZXJfbG9ja19wKV9fa21wX3VzZXJfbG9ja190YWJsZS50YWJsZTsKKyAgICAvLyBXZSBjYW5ub3QgZnJlZSB0aGUgcHJldmlvdXMgdGFibGUgbm93LCBzaW5jZSBpdCBtYXkgYmUgaW4gdXNlIGJ5IG90aGVyCisgICAgLy8gdGhyZWFkcy4gU28gc2F2ZSB0aGUgcG9pbnRlciB0byB0aGUgcHJldmlvdXMgdGFibGUgaW4gaW4gdGhlIGZpcnN0CisgICAgLy8gZWxlbWVudCBvZiB0aGUgbmV3IHRhYmxlLiBBbGwgdGhlIHRhYmxlcyB3aWxsIGJlIG9yZ2FuaXplZCBpbnRvIGEgbGlzdCwKKyAgICAvLyBhbmQgY291bGQgYmUgZnJlZWQgd2hlbiBsaWJyYXJ5IHNodXR0aW5nIGRvd24uCisgICAgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnRhYmxlID0gdGFibGU7CisgICAgX19rbXBfdXNlcl9sb2NrX3RhYmxlLmFsbG9jYXRlZCA9IHNpemU7CisgIH0KKyAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF91c2VyX2xvY2tfdGFibGUudXNlZCA8CisgICAgICAgICAgICAgICAgICAgX19rbXBfdXNlcl9sb2NrX3RhYmxlLmFsbG9jYXRlZCk7CisgIGluZGV4ID0gX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQ7CisgIF9fa21wX3VzZXJfbG9ja190YWJsZS50YWJsZVtpbmRleF0gPSBsY2s7CisgICsrX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQ7CisgIHJldHVybiBpbmRleDsKK30KKworc3RhdGljIGttcF91c2VyX2xvY2tfcCBfX2ttcF9sb2NrX2Jsb2NrX2FsbG9jYXRlKCkgeworICAvLyBBc3N1bWUgdGhhdCBrbXBfZ2xvYmFsX2xvY2sgaXMgaGVsZCB1cG9uIGVudHJ5L2V4aXQuCisgIHN0YXRpYyBpbnQgbGFzdF9pbmRleCA9IDA7CisgIGlmICgobGFzdF9pbmRleCA+PSBfX2ttcF9udW1fbG9ja3NfaW5fYmxvY2spIHx8IChfX2ttcF9sb2NrX2Jsb2NrcyA9PSBOVUxMKSkgeworICAgIC8vIFJlc3RhcnQgdGhlIGluZGV4LgorICAgIGxhc3RfaW5kZXggPSAwOworICAgIC8vIE5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgYmxvY2suCisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF91c2VyX2xvY2tfc2l6ZSA+IDApOworICAgIHNpemVfdCBzcGFjZV9mb3JfbG9ja3MgPSBfX2ttcF91c2VyX2xvY2tfc2l6ZSAqIF9fa21wX251bV9sb2Nrc19pbl9ibG9jazsKKyAgICBjaGFyICpidWZmZXIgPQorICAgICAgICAoY2hhciAqKV9fa21wX2FsbG9jYXRlKHNwYWNlX2Zvcl9sb2NrcyArIHNpemVvZihrbXBfYmxvY2tfb2ZfbG9ja3MpKTsKKyAgICAvLyBTZXQgdXAgdGhlIG5ldyBibG9jay4KKyAgICBrbXBfYmxvY2tfb2ZfbG9ja3MgKm5ld19ibG9jayA9CisgICAgICAgIChrbXBfYmxvY2tfb2ZfbG9ja3MgKikoJmJ1ZmZlcltzcGFjZV9mb3JfbG9ja3NdKTsKKyAgICBuZXdfYmxvY2stPm5leHRfYmxvY2sgPSBfX2ttcF9sb2NrX2Jsb2NrczsKKyAgICBuZXdfYmxvY2stPmxvY2tzID0gKHZvaWQgKilidWZmZXI7CisgICAgLy8gUHVibGlzaCB0aGUgbmV3IGJsb2NrLgorICAgIEtNUF9NQigpOworICAgIF9fa21wX2xvY2tfYmxvY2tzID0gbmV3X2Jsb2NrOworICB9CisgIGttcF91c2VyX2xvY2tfcCByZXQgPSAoa21wX3VzZXJfbG9ja19wKSgmKAorICAgICAgKChjaGFyICopKF9fa21wX2xvY2tfYmxvY2tzLT5sb2NrcykpW2xhc3RfaW5kZXggKiBfX2ttcF91c2VyX2xvY2tfc2l6ZV0pKTsKKyAgbGFzdF9pbmRleCsrOworICByZXR1cm4gcmV0OworfQorCisvLyBHZXQgbWVtb3J5IGZvciBhIGxvY2suIEl0IG1heSBiZSBmcmVzaGx5IGFsbG9jYXRlZCBtZW1vcnkgb3IgcmV1c2VkIG1lbW9yeQorLy8gZnJvbSBsb2NrIHBvb2wuCitrbXBfdXNlcl9sb2NrX3AgX19rbXBfdXNlcl9sb2NrX2FsbG9jYXRlKHZvaWQgKip1c2VyX2xvY2ssIGttcF9pbnQzMiBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbG9ja19mbGFnc190IGZsYWdzKSB7CisgIGttcF91c2VyX2xvY2tfcCBsY2s7CisgIGttcF9sb2NrX2luZGV4X3QgaW5kZXg7CisgIEtNUF9ERUJVR19BU1NFUlQodXNlcl9sb2NrKTsKKworICBfX2ttcF9hY3F1aXJlX2xvY2soJl9fa21wX2dsb2JhbF9sb2NrLCBndGlkKTsKKworICBpZiAoX19rbXBfbG9ja19wb29sID09IE5VTEwpIHsKKyAgICAvLyBMb2NrIHBvb2wgaXMgZW1wdHkuIEFsbG9jYXRlIG5ldyBtZW1vcnkuCisKKyAgICAvLyBBTk5PVEFUSU9OOiBGb3VuZCBubyBnb29kIHdheSB0byBleHByZXNzIHRoZSBzeW5jcm9uaXNhdGlvbgorICAgIC8vIGJldHdlZW4gYWxsb2NhdGlvbiBhbmQgdXNhZ2UsIHNvIGlnbm9yZSB0aGUgYWxsb2NhdGlvbgorICAgIEFOTk9UQVRFX0lHTk9SRV9XUklURVNfQkVHSU4oKTsKKyAgICBpZiAoX19rbXBfbnVtX2xvY2tzX2luX2Jsb2NrIDw9IDEpIHsgLy8gVHVuZSB0aGlzIGN1dG9mZiBwb2ludC4KKyAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApX19rbXBfYWxsb2NhdGUoX19rbXBfdXNlcl9sb2NrX3NpemUpOworICAgIH0gZWxzZSB7CisgICAgICBsY2sgPSBfX2ttcF9sb2NrX2Jsb2NrX2FsbG9jYXRlKCk7CisgICAgfQorICAgIEFOTk9UQVRFX0lHTk9SRV9XUklURVNfRU5EKCk7CisKKyAgICAvLyBJbnNlcnQgbG9jayBpbiB0aGUgdGFibGUgc28gdGhhdCBpdCBjYW4gYmUgZnJlZWQgaW4gX19rbXBfY2xlYW51cCwKKyAgICAvLyBhbmQgZGVidWdnZXIgaGFzIGluZm8gb24gYWxsIGFsbG9jYXRlZCBsb2Nrcy4KKyAgICBpbmRleCA9IF9fa21wX2xvY2tfdGFibGVfaW5zZXJ0KGxjayk7CisgIH0gZWxzZSB7CisgICAgLy8gUGljayB1cCBsb2NrIGZyb20gcG9vbC4KKyAgICBsY2sgPSBfX2ttcF9sb2NrX3Bvb2w7CisgICAgaW5kZXggPSBfX2ttcF9sb2NrX3Bvb2wtPnBvb2wuaW5kZXg7CisgICAgX19rbXBfbG9ja19wb29sID0gX19rbXBfbG9ja19wb29sLT5wb29sLm5leHQ7CisgIH0KKworICAvLyBXZSBjb3VsZCBwb3RlbnRpYWxseSBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbmVzdGVkIGFuZCByZWd1bGFyIGxvY2tzCisgIC8vIGhlcmUsIGFuZCBkbyB0aGUgbG9jayB0YWJsZSBsb29rdXAgZm9yIHJlZ3VsYXIgbG9ja3Mgb25seS4KKyAgaWYgKE9NUF9MT0NLX1RfU0laRSA8IHNpemVvZih2b2lkICopKSB7CisgICAgKigoa21wX2xvY2tfaW5kZXhfdCAqKXVzZXJfbG9jaykgPSBpbmRleDsKKyAgfSBlbHNlIHsKKyAgICAqKChrbXBfdXNlcl9sb2NrX3AgKil1c2VyX2xvY2spID0gbGNrOworICB9CisKKyAgLy8gbWFyayB0aGUgbG9jayBpZiBpdCBpcyBjcml0aWNhbCBzZWN0aW9uIGxvY2suCisgIF9fa21wX3NldF91c2VyX2xvY2tfZmxhZ3MobGNrLCBmbGFncyk7CisKKyAgX19rbXBfcmVsZWFzZV9sb2NrKCZfX2ttcF9nbG9iYWxfbG9jaywgZ3RpZCk7IC8vIEFDOiBUT0RPIG1vdmUgdGhpcyBsaW5lIHVwcGVyCisKKyAgcmV0dXJuIGxjazsKK30KKworLy8gUHV0IGxvY2sncyBtZW1vcnkgdG8gcG9vbCBmb3IgcmV1c2luZy4KK3ZvaWQgX19rbXBfdXNlcl9sb2NrX2ZyZWUodm9pZCAqKnVzZXJfbG9jaywga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91c2VyX2xvY2tfcCBsY2spIHsKKyAgS01QX0RFQlVHX0FTU0VSVCh1c2VyX2xvY2sgIT0gTlVMTCk7CisgIEtNUF9ERUJVR19BU1NFUlQobGNrICE9IE5VTEwpOworCisgIF9fa21wX2FjcXVpcmVfbG9jaygmX19rbXBfZ2xvYmFsX2xvY2ssIGd0aWQpOworCisgIGxjay0+cG9vbC5uZXh0ID0gX19rbXBfbG9ja19wb29sOworICBfX2ttcF9sb2NrX3Bvb2wgPSBsY2s7CisgIGlmIChPTVBfTE9DS19UX1NJWkUgPCBzaXplb2Yodm9pZCAqKSkgeworICAgIGttcF9sb2NrX2luZGV4X3QgaW5kZXggPSAqKChrbXBfbG9ja19pbmRleF90ICopdXNlcl9sb2NrKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKDAgPCBpbmRleCAmJiBpbmRleCA8PSBfX2ttcF91c2VyX2xvY2tfdGFibGUudXNlZCk7CisgICAgbGNrLT5wb29sLmluZGV4ID0gaW5kZXg7CisgIH0KKworICBfX2ttcF9yZWxlYXNlX2xvY2soJl9fa21wX2dsb2JhbF9sb2NrLCBndGlkKTsKK30KKwora21wX3VzZXJfbG9ja19wIF9fa21wX2xvb2t1cF91c2VyX2xvY2sodm9pZCAqKnVzZXJfbG9jaywgY2hhciBjb25zdCAqZnVuYykgeworICBrbXBfdXNlcl9sb2NrX3AgbGNrID0gTlVMTDsKKworICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgaWYgKHVzZXJfbG9jayA9PSBOVUxMKSB7CisgICAgICBLTVBfRkFUQUwoTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyk7CisgICAgfQorICB9CisKKyAgaWYgKE9NUF9MT0NLX1RfU0laRSA8IHNpemVvZih2b2lkICopKSB7CisgICAga21wX2xvY2tfaW5kZXhfdCBpbmRleCA9ICooKGttcF9sb2NrX2luZGV4X3QgKil1c2VyX2xvY2spOworICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgIGlmICghKDAgPCBpbmRleCAmJiBpbmRleCA8IF9fa21wX3VzZXJfbG9ja190YWJsZS51c2VkKSkgeworICAgICAgICBLTVBfRkFUQUwoTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyk7CisgICAgICB9CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoMCA8IGluZGV4ICYmIGluZGV4IDwgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQpOworICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfdXNlcl9sb2NrX3NpemUgPiAwKTsKKyAgICBsY2sgPSBfX2ttcF91c2VyX2xvY2tfdGFibGUudGFibGVbaW5kZXhdOworICB9IGVsc2UgeworICAgIGxjayA9ICooKGttcF91c2VyX2xvY2tfcCAqKXVzZXJfbG9jayk7CisgIH0KKworICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgaWYgKGxjayA9PSBOVUxMKSB7CisgICAgICBLTVBfRkFUQUwoTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGxjazsKK30KKwordm9pZCBfX2ttcF9jbGVhbnVwX3VzZXJfbG9ja3Modm9pZCkgeworICAvLyBSZXNldCBsb2NrIHBvb2wuIERvbid0IHdvcnJ5IGFib3V0IGxvY2sgaW4gdGhlIHBvb2wtLXdlIHdpbGwgZnJlZSB0aGVtIHdoZW4KKyAgLy8gaXRlcmF0aW5nIHRocm91Z2ggbG9jayB0YWJsZSAoaXQgaW5jbHVkZXMgYWxsIHRoZSBsb2NrcywgZGVhZCBvciBhbGl2ZSkuCisgIF9fa21wX2xvY2tfcG9vbCA9IE5VTEw7CisKKyNkZWZpbmUgSVNfQ1JJVElDQUwobGNrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gIT0gTlVMTCkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKCgqX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18pKGxjaykma21wX2xmX2NyaXRpY2FsX3NlY3Rpb24pKQorCisgIC8vIExvb3AgdGhyb3VnaCBsb2NrIHRhYmxlLCBmcmVlIGFsbCBsb2Nrcy4KKyAgLy8gRG8gbm90IGZyZWUgaXRlbSBbMF0sIGl0IGlzIHJlc2VydmVkIGZvciBsb2NrIHRhYmxlcyBsaXN0LgorICAvLworICAvLyBGSVhNRSAtIHdlIGFyZSBpdGVyYXRpbmcgdGhyb3VnaCBhIGxpc3Qgb2YgKHBvaW50ZXJzIHRvKSBvYmplY3RzIG9mIHR5cGUKKyAgLy8gdW5pb24ga21wX3VzZXJfbG9jaywgYnV0IHdlIGhhdmUgbm8gd2F5IG9mIGtub3dpbmcgd2hldGhlciB0aGUgYmFzZSB0eXBlIGlzCisgIC8vIGN1cnJlbnRseSAicG9vbCIgb3Igd2hhdGV2ZXIgdGhlIGdsb2JhbCB1c2VyIGxvY2sgdHlwZSBpcy4KKyAgLy8KKyAgLy8gV2UgYXJlIHJlbHlpbmcgb24gdGhlIGZhY3QgdGhhdCBmb3IgYWxsIG9mIHRoZSB1c2VyIGxvY2sgdHlwZXMKKyAgLy8gKGV4Y2VwdCAidGFzIiksIHRoZSBmaXJzdCBmaWVsZCBpbiB0aGUgbG9jayBzdHJ1Y3QgaXMgdGhlICJpbml0aWFsaXplZCIKKyAgLy8gZmllbGQsIHdoaWNoIGlzIHNldCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgbG9jayBvYmplY3QgaXRzZWxmIHdoZW4KKyAgLy8gdGhlIGxvY2sgaXMgaW5pdGlhbGl6ZWQuICBXaGVuIHRoZSB1bmlvbiBpcyBvZiB0eXBlICJwb29sIiwgdGhlCisgIC8vIGZpcnN0IGZpZWxkIGlzIGEgcG9pbnRlciB0byB0aGUgbmV4dCBvYmplY3QgaW4gdGhlIGZyZWUgbGlzdCwgd2hpY2gKKyAgLy8gd2lsbCBub3QgYmUgdGhlIHNhbWUgYWRkcmVzcyBhcyB0aGUgb2JqZWN0IGl0c2VsZi4KKyAgLy8KKyAgLy8gVGhpcyBtZWFucyB0aGF0IHRoZSBjaGVjayAoKl9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8pKGxjaykgd2lsbCBmYWlsCisgIC8vIGZvciAicG9vbCIgb2JqZWN0cyBvbiB0aGUgZnJlZSBsaXN0LiAgVGhpcyBtdXN0IGhhcHBlbiBhcyB0aGUgImxvY2F0aW9uIgorICAvLyBmaWVsZCBvZiByZWFsIHVzZXIgbG9ja3Mgb3ZlcmxhcHMgdGhlICJpbmRleCIgZmllbGQgb2YgInBvb2wiIG9iamVjdHMuCisgIC8vCisgIC8vIEl0IHdvdWxkIGJlIGJldHRlciB0byBydW4gdGhyb3VnaCB0aGUgZnJlZSBsaXN0LCBhbmQgcmVtb3ZlIGFsbCAicG9vbCIKKyAgLy8gb2JqZWN0cyBmcm9tIHRoZSBsb2NrIHRhYmxlIGJlZm9yZSBleGVjdXRpbmcgdGhpcyBsb29wLiAgSG93ZXZlciwKKyAgLy8gInBvb2wiIG9iamVjdHMgZG8gbm90IGFsd2F5cyBoYXZlIHRoZWlyIGluZGV4IGZpZWxkIHNldCAob25seSBvbgorICAvLyBsaW5fMzJlKSwgYW5kIEkgZG9uJ3Qgd2FudCB0byBzZWFyY2ggdGhlIGxvY2sgdGFibGUgZm9yIHRoZSBhZGRyZXNzCisgIC8vIG9mIGV2ZXJ5ICJwb29sIiBvYmplY3Qgb24gdGhlIGZyZWUgbGlzdC4KKyAgd2hpbGUgKF9fa21wX3VzZXJfbG9ja190YWJsZS51c2VkID4gMSkgeworICAgIGNvbnN0IGlkZW50ICpsb2M7CisKKyAgICAvLyByZWR1Y2UgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQgYmVmb3JlIGZyZWVpbmcgdGhlIGxvY2ssCisgICAgLy8gc28gdGhhdCBzdGF0ZSBvZiBsb2NrcyBpcyBjb25zaXN0ZW50CisgICAga21wX3VzZXJfbG9ja19wIGxjayA9CisgICAgICAgIF9fa21wX3VzZXJfbG9ja190YWJsZS50YWJsZVstLV9fa21wX3VzZXJfbG9ja190YWJsZS51c2VkXTsKKworICAgIGlmICgoX19rbXBfaXNfdXNlcl9sb2NrX2luaXRpYWxpemVkXyAhPSBOVUxMKSAmJgorICAgICAgICAoKl9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8pKGxjaykpIHsKKyAgICAgIC8vIElzc3VlIGEgd2FybmluZyBpZjogS01QX0NPTlNJU1RFTkNZX0NIRUNLIEFORCBsb2NrIGlzIGluaXRpYWxpemVkIEFORAorICAgICAgLy8gaXQgaXMgTk9UIGEgY3JpdGljYWwgc2VjdGlvbiAodXNlciBpcyBub3QgcmVzcG9uc2libGUgZm9yIGRlc3Ryb3lpbmcKKyAgICAgIC8vIGNyaXRpY2FscykgQU5EIHdlIGtub3cgc291cmNlIGxvY2F0aW9uIHRvIHJlcG9ydC4KKyAgICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgJiYgKCFJU19DUklUSUNBTChsY2spKSAmJgorICAgICAgICAgICgobG9jID0gX19rbXBfZ2V0X3VzZXJfbG9ja19sb2NhdGlvbihsY2spKSAhPSBOVUxMKSAmJgorICAgICAgICAgIChsb2MtPnBzb3VyY2UgIT0gTlVMTCkpIHsKKyAgICAgICAga21wX3N0cl9sb2NfdCBzdHJfbG9jID0gX19rbXBfc3RyX2xvY19pbml0KGxvYy0+cHNvdXJjZSwgMCk7CisgICAgICAgIEtNUF9XQVJOSU5HKENuc0xvY2tOb3REZXN0cm95ZWQsIHN0cl9sb2MuZmlsZSwgc3RyX2xvYy5saW5lKTsKKyAgICAgICAgX19rbXBfc3RyX2xvY19mcmVlKCZzdHJfbG9jKTsKKyAgICAgIH0KKworI2lmZGVmIEtNUF9ERUJVRworICAgICAgaWYgKElTX0NSSVRJQ0FMKGxjaykpIHsKKyAgICAgICAgS0FfVFJBQ0UoCisgICAgICAgICAgICAyMCwKKyAgICAgICAgICAgICgiX19rbXBfY2xlYW51cF91c2VyX2xvY2tzOiBmcmVlIGNyaXRpY2FsIHNlY3Rpb24gbG9jayAlcCAoJXApXG4iLAorICAgICAgICAgICAgIGxjaywgKih2b2lkICoqKWxjaykpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfY2xlYW51cF91c2VyX2xvY2tzOiBmcmVlIGxvY2sgJXAgKCVwKVxuIiwgbGNrLAorICAgICAgICAgICAgICAgICAgICAgICoodm9pZCAqKilsY2spKTsKKyAgICAgIH0KKyNlbmRpZiAvLyBLTVBfREVCVUcKKworICAgICAgLy8gQ2xlYW51cCBpbnRlcm5hbCBsb2NrIGR5bmFtaWMgcmVzb3VyY2VzIChmb3IgZHJkcGEgbG9ja3MgcGFydGljdWxhcmx5KS4KKyAgICAgIF9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrKGxjayk7CisgICAgfQorCisgICAgLy8gRnJlZSB0aGUgbG9jayBpZiBibG9jayBhbGxvY2F0aW9uIG9mIGxvY2tzIGlzIG5vdCB1c2VkLgorICAgIGlmIChfX2ttcF9sb2NrX2Jsb2NrcyA9PSBOVUxMKSB7CisgICAgICBfX2ttcF9mcmVlKGxjayk7CisgICAgfQorICB9CisKKyN1bmRlZiBJU19DUklUSUNBTAorCisgIC8vIGRlbGV0ZSBsb2NrIHRhYmxlKHMpLgorICBrbXBfdXNlcl9sb2NrX3AgKnRhYmxlX3B0ciA9IF9fa21wX3VzZXJfbG9ja190YWJsZS50YWJsZTsKKyAgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnRhYmxlID0gTlVMTDsKKyAgX19rbXBfdXNlcl9sb2NrX3RhYmxlLmFsbG9jYXRlZCA9IDA7CisKKyAgd2hpbGUgKHRhYmxlX3B0ciAhPSBOVUxMKSB7CisgICAgLy8gSW4gdGhlIGZpcnN0IGVsZW1lbnQgd2Ugc2F2ZWQgdGhlIHBvaW50ZXIgdG8gdGhlIHByZXZpb3VzCisgICAgLy8gKHNtYWxsZXIpIGxvY2sgdGFibGUuCisgICAga21wX3VzZXJfbG9ja19wICpuZXh0ID0gKGttcF91c2VyX2xvY2tfcCAqKSh0YWJsZV9wdHJbMF0pOworICAgIF9fa21wX2ZyZWUodGFibGVfcHRyKTsKKyAgICB0YWJsZV9wdHIgPSBuZXh0OworICB9CisKKyAgLy8gRnJlZSBidWZmZXJzIGFsbG9jYXRlZCBmb3IgYmxvY2tzIG9mIGxvY2tzLgorICBrbXBfYmxvY2tfb2ZfbG9ja3NfdCAqYmxvY2tfcHRyID0gX19rbXBfbG9ja19ibG9ja3M7CisgIF9fa21wX2xvY2tfYmxvY2tzID0gTlVMTDsKKworICB3aGlsZSAoYmxvY2tfcHRyICE9IE5VTEwpIHsKKyAgICBrbXBfYmxvY2tfb2ZfbG9ja3NfdCAqbmV4dCA9IGJsb2NrX3B0ci0+bmV4dF9ibG9jazsKKyAgICBfX2ttcF9mcmVlKGJsb2NrX3B0ci0+bG9ja3MpOworICAgIC8vICpibG9ja19wdHIgaXRzZWxmIHdhcyBhbGxvY2F0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgbG9ja3MgdmVjdG9yLgorICAgIGJsb2NrX3B0ciA9IG5leHQ7CisgIH0KKworICBUQ1dfNChfX2ttcF9pbml0X3VzZXJfbG9ja3MsIEZBTFNFKTsKK30KKworI2VuZGlmIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfbG9jay5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX2xvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTU0MzkzCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX2xvY2suaApAQCAtMCwwICsxLDEyOTYgQEAKKy8qCisgKiBrbXBfbG9jay5oIC0tIGxvY2sgaGVhZGVyIGZpbGUKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfTE9DS19ICisjZGVmaW5lIEtNUF9MT0NLX0gKKworI2luY2x1ZGUgPGxpbWl0cy5oPiAvLyBDSEFSX0JJVAorI2luY2x1ZGUgPHN0ZGRlZi5oPiAvLyBvZmZzZXRvZgorCisjaW5jbHVkZSAia21wX2RlYnVnLmgiCisjaW5jbHVkZSAia21wX29zLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworI2luY2x1ZGUgPGF0b21pYz4KKworZXh0ZXJuICJDIiB7CisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGF2ZSB0byBjb3B5IHRoZXNlIGRlZmluaXRpb25zIGZyb20ga21wLmggYmVjYXVzZSBrbXAuaCBjYW5ub3QgYmUgaW5jbHVkZWQKKy8vIGR1ZSB0byBjaXJjdWxhciBkZXBlbmRlbmNpZXMuICBXaWxsIHVuZGVmIHRoZXNlIGF0IGVuZCBvZiBmaWxlLgorCisjZGVmaW5lIEtNUF9QQUQodHlwZSwgc3opICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoc2l6ZW9mKHR5cGUpICsgKHN6IC0gKChzaXplb2YodHlwZSkgLSAxKSAlIChzeikpIC0gMSkpCisjZGVmaW5lIEtNUF9HVElEX0RORSAoLTIpCisKKy8vIEZvcndhcmQgZGVjbGFyYXRpb24gb2YgaWRlbnQgYW5kIGlkZW50X3QKKworc3RydWN0IGlkZW50OwordHlwZWRlZiBzdHJ1Y3QgaWRlbnQgaWRlbnRfdDsKKworLy8gRW5kIG9mIGNvcGllZCBjb2RlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBXZSBuZWVkIHRvIGtub3cgdGhlIHNpemUgb2YgdGhlIGFyZWEgd2UgY2FuIGFzc3VtZSB0aGF0IHRoZSBjb21waWxlcihzKQorLy8gYWxsb2NhdGVkIGZvciBvYmVjdHMgb2YgdHlwZSBvbXBfbG9ja190IGFuZCBvbXBfbmVzdF9sb2NrX3QuICBUaGUgSW50ZWwKKy8vIGNvbXBpbGVyIGFsd2F5cyBhbGxvY2F0ZXMgYSBwb2ludGVyLXNpemVkIGFyZWEsIGFzIGRvZXMgdmlzdWFsIHN0dWRpby4KKy8vCisvLyBnY2MgaG93ZXZlciwgb25seSBhbGxvY2F0ZXMgNCBieXRlcyBmb3IgcmVndWxhciBsb2NrcywgZXZlbiBvbiA2NC1iaXQKKy8vIGludGVsIGFyY2hzLiAgSXQgYWxsb2NhdGVzIGF0IGxlYXN0IDggYnl0ZXMgZm9yIG5lc3RlZCBsb2NrIChtb3JlIG9uCisvLyByZWNlbnQgdmVyc2lvbnMpLCBidXQgd2UgYXJlIGJvdW5kZWQgYnkgdGhlIHBvaW50ZXItc2l6ZWQgY2h1bmtzIHRoYXQKKy8vIHRoZSBJbnRlbCBjb21waWxlciBhbGxvY2F0ZXMuCisKKyNpZiBLTVBfT1NfTElOVVggJiYgZGVmaW5lZChLTVBfR09NUF9DT01QQVQpCisjZGVmaW5lIE9NUF9MT0NLX1RfU0laRSBzaXplb2YoaW50KQorI2RlZmluZSBPTVBfTkVTVF9MT0NLX1RfU0laRSBzaXplb2Yodm9pZCAqKQorI2Vsc2UKKyNkZWZpbmUgT01QX0xPQ0tfVF9TSVpFIHNpemVvZih2b2lkICopCisjZGVmaW5lIE9NUF9ORVNUX0xPQ0tfVF9TSVpFIHNpemVvZih2b2lkICopCisjZW5kaWYKKworLy8gVGhlIEludGVsIGNvbXBpbGVyIGFsbG9jYXRlcyBhIDMyLWJ5dGUgY2h1bmsgZm9yIGEgY3JpdGljYWwgc2VjdGlvbi4KKy8vIEJvdGggZ2NjIGFuZCB2aXN1YWwgc3R1ZGlvIG9ubHkgYWxsb2NhdGUgZW5vdWdoIHNwYWNlIGZvciBhIHBvaW50ZXIuCisvLyBTb21ldGltZXMgd2Uga25vdyB0aGF0IHRoZSBzcGFjZSB3YXMgYWxsb2NhdGVkIGJ5IHRoZSBJbnRlbCBjb21waWxlci4KKyNkZWZpbmUgT01QX0NSSVRJQ0FMX1NJWkUgc2l6ZW9mKHZvaWQgKikKKyNkZWZpbmUgSU5URUxfQ1JJVElDQUxfU0laRSAzMgorCisvLyBsb2NrIGZsYWdzCit0eXBlZGVmIGttcF91aW50MzIga21wX2xvY2tfZmxhZ3NfdDsKKworI2RlZmluZSBrbXBfbGZfY3JpdGljYWxfc2VjdGlvbiAxCisKKy8vIFdoZW4gYSBsb2NrIHRhYmxlIGlzIHVzZWQsIHRoZSBpbmRpY2VzIGFyZSBvZiBrbXBfbG9ja19pbmRleF90Cit0eXBlZGVmIGttcF91aW50MzIga21wX2xvY2tfaW5kZXhfdDsKKworLy8gV2hlbiBtZW1vcnkgYWxsb2NhdGVkIGZvciBsb2NrcyBhcmUgb24gdGhlIGxvY2sgcG9vbCAoZnJlZSBsaXN0KSwKKy8vIGl0IGlzIHRyZWF0ZWQgYXMgc3RydWN0cyBvZiB0aGlzIHR5cGUuCitzdHJ1Y3Qga21wX2xvY2tfcG9vbCB7CisgIHVuaW9uIGttcF91c2VyX2xvY2sgKm5leHQ7CisgIGttcF9sb2NrX2luZGV4X3QgaW5kZXg7Cit9OworCit0eXBlZGVmIHN0cnVjdCBrbXBfbG9ja19wb29sIGttcF9sb2NrX3Bvb2xfdDsKKworZXh0ZXJuIHZvaWQgX19rbXBfdmFsaWRhdGVfbG9ja3Modm9pZCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBUaGVyZSBhcmUgNSBsb2NrIGltcGxlbWVudGF0aW9uczoKKy8vICAgICAgIDEuIFRlc3QgYW5kIHNldCBsb2Nrcy4KKy8vICAgICAgIDIuIGZ1dGV4IGxvY2tzIChMaW51eCogT1Mgb24geDg2IGFuZCBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZQorLy8gICAgICAgYXJjaGl0ZWN0dXJlKQorLy8gICAgICAgMy4gVGlja2V0IChMYW1wb3J0IGJha2VyeSkgbG9ja3MuCisvLyAgICAgICA0LiBRdWV1aW5nIGxvY2tzICh3aXRoIHNlcGFyYXRlIHNwaW4gZmllbGRzKS4KKy8vICAgICAgIDUuIERSUEEgKER5bmFtaWNhbGx5IFJlY29uZmlndXJhYmxlIERpc3RyaWJ1dGVkIFBvbGxpbmcgQXJlYSkgbG9ja3MKKy8vCisvLyAgIGFuZCAzIGxvY2sgcHVycG9zZXM6CisvLyAgICAgICAxLiBCb290c3RyYXAgbG9ja3MgLS0gVXNlZCBmb3IgYSBmZXcgbG9ja3MgYXZhaWxhYmxlIGF0IGxpYnJhcnkKKy8vICAgICAgIHN0YXJ0dXAtc2h1dGRvd24gdGltZS4KKy8vICAgICAgICAgIFRoZXNlIGRvIG5vdCByZXF1aXJlIG5vbi1uZWdhdGl2ZSBnbG9iYWwgdGhyZWFkIElEJ3MuCisvLyAgICAgICAyLiBJbnRlcm5hbCBSVEwgbG9ja3MgLS0gVXNlZCBldmVyeXdoZXJlIGVsc2UgaW4gdGhlIFJUTAorLy8gICAgICAgMy4gVXNlciBsb2NrcyAoaW5jbHVkZXMgY3JpdGljYWwgc2VjdGlvbnMpCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIExvY2sgaW1wbGVtZW50YXRpb25zLgorLy8KKy8vIFRlc3QgYW5kIHNldCBsb2Nrcy4KKy8vCisvLyBOb24tbmVzdGVkIHRlc3QgYW5kIHNldCBsb2NrcyBkaWZmZXIgZnJvbSB0aGUgb3RoZXIgbG9jayBraW5kcyAoZXhjZXB0CisvLyBmdXRleCkgaW4gdGhhdCB3ZSB1c2UgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgdGhlIGNvbXBpbGVyIGZvciB0aGUgbG9jaywKKy8vIHJhdGhlciB0aGFuIGEgcG9pbnRlciB0byBpdC4KKy8vCisvLyBPbiBsaW4zMiwgbGluXzMyZSwgYW5kIHdpbl8zMiwgdGhlIHNwYWNlIGFsbG9jYXRlZCBtYXkgYmUgYXMgc21hbGwgYXMgNAorLy8gYnl0ZXMsIHNvIHdlIGhhdmUgdG8gdXNlIGEgbG9jayB0YWJsZSBmb3IgbmVzdGVkIGxvY2tzLCBhbmQgYXZvaWQgYWNjZXNzaW5nCisvLyB0aGUgZGVwdGhfbG9ja2VkIGZpZWxkIGZvciBub24tbmVzdGVkIGxvY2tzLgorLy8KKy8vIEluZm9ybWF0aW9uIG5vcm1hbGx5IGF2YWlsYWJsZSB0byB0aGUgdG9vbHMsIHN1Y2ggYXMgbG9jayBsb2NhdGlvbiwgbG9jaworLy8gdXNhZ2UgKG5vcm1hbCBsb2NrIHZzLiBjcml0aWNhbCBzZWN0aW9uKSwgZXRjLiBpcyBub3QgYXZhaWxhYmxlIHdpdGggdGVzdCBhbmQKKy8vIHNldCBsb2Nrcy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RydWN0IGttcF9iYXNlX3Rhc19sb2NrIHsKKyAgLy8gS01QX0xPQ0tfRlJFRSh0YXMpID0+IHVubG9ja2VkOyBsb2NrZWQ6IChndGlkKzEpIG9mIG93bmluZyB0aHJlYWQKKyAgdm9sYXRpbGUga21wX2ludDMyIHBvbGw7CisgIGttcF9pbnQzMiBkZXB0aF9sb2NrZWQ7IC8vIGRlcHRoIGxvY2tlZCwgZm9yIG5lc3RlZCBsb2NrcyBvbmx5Cit9OworCit0eXBlZGVmIHN0cnVjdCBrbXBfYmFzZV90YXNfbG9jayBrbXBfYmFzZV90YXNfbG9ja190OworCit1bmlvbiBrbXBfdGFzX2xvY2sgeworICBrbXBfYmFzZV90YXNfbG9ja190IGxrOworICBrbXBfbG9ja19wb29sX3QgcG9vbDsgLy8gbWFrZSBjZXJ0YWluIHN0cnVjdCBpcyBsYXJnZSBlbm91Z2gKKyAgZG91YmxlIGxrX2FsaWduOyAvLyB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQ7IG5vIGNhY2hlIGxpbmUgcGFkZGluZworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfdGFzX2xvY2sga21wX3Rhc19sb2NrX3Q7CisKKy8vIFN0YXRpYyBpbml0aWFsaXplciBmb3IgdGVzdCBhbmQgc2V0IGxvY2sgdmFyaWFibGVzLiBVc2FnZToKKy8vICAgIGttcF90YXNfbG9ja190IHhsb2NrID0gS01QX1RBU19MT0NLX0lOSVRJQUxJWkVSKCB4bG9jayApOworI2RlZmluZSBLTVBfVEFTX0xPQ0tfSU5JVElBTElaRVIobG9jaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyBLTVBfTE9DS19GUkVFKHRhcyksIDAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKK2V4dGVybiBpbnQgX19rbXBfYWNxdWlyZV90YXNfbG9jayhrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfdGFzX2xvY2soa21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpOworZXh0ZXJuIGludCBfX2ttcF9yZWxlYXNlX3Rhc19sb2NrKGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfdGFzX2xvY2soa21wX3Rhc19sb2NrX3QgKmxjayk7CitleHRlcm4gdm9pZCBfX2ttcF9kZXN0cm95X3Rhc19sb2NrKGttcF90YXNfbG9ja190ICpsY2spOworCitleHRlcm4gaW50IF9fa21wX2FjcXVpcmVfbmVzdGVkX3Rhc19sb2NrKGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKTsKK2V4dGVybiBpbnQgX19rbXBfdGVzdF9uZXN0ZWRfdGFzX2xvY2soa21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpOworZXh0ZXJuIGludCBfX2ttcF9yZWxlYXNlX25lc3RlZF90YXNfbG9jayhrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X25lc3RlZF90YXNfbG9jayhrbXBfdGFzX2xvY2tfdCAqbGNrKTsKK2V4dGVybiB2b2lkIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3Rhc19sb2NrKGttcF90YXNfbG9ja190ICpsY2spOworCisjZGVmaW5lIEtNUF9MT0NLX1JFTEVBU0VEIDEKKyNkZWZpbmUgS01QX0xPQ0tfU1RJTExfSEVMRCAwCisjZGVmaW5lIEtNUF9MT0NLX0FDUVVJUkVEX0ZJUlNUIDEKKyNkZWZpbmUgS01QX0xPQ0tfQUNRVUlSRURfTkVYVCAwCisKKyNkZWZpbmUgS01QX1VTRV9GVVRFWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChLTVBfT1NfTElOVVggJiYgIUtNUF9PU19DTksgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpKQorCisjaWYgS01QX1VTRV9GVVRFWAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBmdXRleCBsb2Nrcy4gIGZ1dGV4IGxvY2tzIGFyZSBvbmx5IGF2YWlsYWJsZSBvbiBMaW51eCogT1MuCisvLworLy8gTGlrZSBub24tbmVzdGVkIHRlc3QgYW5kIHNldCBsb2NrLCBub24tbmVzdGVkIGZ1dGV4IGxvY2tzIHVzZSB0aGUgbWVtb3J5CisvLyBhbGxvY2F0ZWQgYnkgdGhlIGNvbXBpbGVyIGZvciB0aGUgbG9jaywgcmF0aGVyIHRoYW4gYSBwb2ludGVyIHRvIGl0LgorLy8KKy8vIEluZm9ybWF0aW9uIG5vcm1hbGx5IGF2YWlsYWJsZSB0byB0aGUgdG9vbHMsIHN1Y2ggYXMgbG9jayBsb2NhdGlvbiwgbG9jaworLy8gdXNhZ2UgKG5vcm1hbCBsb2NrIHZzLiBjcml0aWNhbCBzZWN0aW9uKSwgZXRjLiBpcyBub3QgYXZhaWxhYmxlIHdpdGggdGVzdCBhbmQKKy8vIHNldCBsb2Nrcy4gV2l0aCBub24tbmVzdGVkIGZ1dGV4IGxvY2tzLCB0aGUgbG9jayBvd25lciBpcyBub3QgZXZlbiBhdmFpbGFibGUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0cnVjdCBrbXBfYmFzZV9mdXRleF9sb2NrIHsKKyAgdm9sYXRpbGUga21wX2ludDMyIHBvbGw7IC8vIEtNUF9MT0NLX0ZSRUUoZnV0ZXgpID0+IHVubG9ja2VkCisgIC8vIDIqKGd0aWQrMSkgb2Ygb3duaW5nIHRocmVhZCwgMCBpZiB1bmxvY2tlZAorICAvLyBsb2NrZWQ6IChndGlkKzEpIG9mIG93bmluZyB0aHJlYWQKKyAga21wX2ludDMyIGRlcHRoX2xvY2tlZDsgLy8gZGVwdGggbG9ja2VkLCBmb3IgbmVzdGVkIGxvY2tzIG9ubHkKK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX2Z1dGV4X2xvY2sga21wX2Jhc2VfZnV0ZXhfbG9ja190OworCit1bmlvbiBrbXBfZnV0ZXhfbG9jayB7CisgIGttcF9iYXNlX2Z1dGV4X2xvY2tfdCBsazsKKyAga21wX2xvY2tfcG9vbF90IHBvb2w7IC8vIG1ha2UgY2VydGFpbiBzdHJ1Y3QgaXMgbGFyZ2UgZW5vdWdoCisgIGRvdWJsZSBsa19hbGlnbjsgLy8gdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50CisgIC8vIG5vIGNhY2hlIGxpbmUgcGFkZGluZworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfZnV0ZXhfbG9jayBrbXBfZnV0ZXhfbG9ja190OworCisvLyBTdGF0aWMgaW5pdGlhbGl6ZXIgZm9yIGZ1dGV4IGxvY2sgdmFyaWFibGVzLiBVc2FnZToKKy8vICAgIGttcF9mdXRleF9sb2NrX3QgeGxvY2sgPSBLTVBfRlVURVhfTE9DS19JTklUSUFMSVpFUiggeGxvY2sgKTsKKyNkZWZpbmUgS01QX0ZVVEVYX0xPQ0tfSU5JVElBTElaRVIobG9jaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgS01QX0xPQ0tfRlJFRShmdXRleCksIDAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCitleHRlcm4gaW50IF9fa21wX2FjcXVpcmVfZnV0ZXhfbG9jayhrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKTsKK2V4dGVybiBpbnQgX19rbXBfdGVzdF9mdXRleF9sb2NrKGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpOworZXh0ZXJuIGludCBfX2ttcF9yZWxlYXNlX2Z1dGV4X2xvY2soa21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X2Z1dGV4X2xvY2soa21wX2Z1dGV4X2xvY2tfdCAqbGNrKTsKK2V4dGVybiB2b2lkIF9fa21wX2Rlc3Ryb3lfZnV0ZXhfbG9jayhrbXBfZnV0ZXhfbG9ja190ICpsY2spOworCitleHRlcm4gaW50IF9fa21wX2FjcXVpcmVfbmVzdGVkX2Z1dGV4X2xvY2soa21wX2Z1dGV4X2xvY2tfdCAqbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKTsKK2V4dGVybiBpbnQgX19rbXBfdGVzdF9uZXN0ZWRfZnV0ZXhfbG9jayhrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKTsKK2V4dGVybiBpbnQgX19rbXBfcmVsZWFzZV9uZXN0ZWRfZnV0ZXhfbG9jayhrbXBfZnV0ZXhfbG9ja190ICpsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGd0aWQpOworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF9uZXN0ZWRfZnV0ZXhfbG9jayhrbXBfZnV0ZXhfbG9ja190ICpsY2spOworZXh0ZXJuIHZvaWQgX19rbXBfZGVzdHJveV9uZXN0ZWRfZnV0ZXhfbG9jayhrbXBfZnV0ZXhfbG9ja190ICpsY2spOworCisjZW5kaWYgLy8gS01QX1VTRV9GVVRFWAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaWNrZXQgbG9ja3MuCisKKyNpZmRlZiBfX2NwbHVzcGx1cworCisjaWZkZWYgX01TQ19WRVIKKy8vIE1TVkMgd29uJ3QgYWxsb3cgdXNlIG9mIHN0ZDo6YXRvbWljPD4gaW4gYSB1bmlvbiBzaW5jZSBpdCBoYXMgbm9uLXRyaXZpYWwKKy8vIGNvcHkgY29uc3RydWN0b3IuCisKK3N0cnVjdCBrbXBfYmFzZV90aWNrZXRfbG9jayB7CisgIC8vIGBpbml0aWFsaXplZCcgbXVzdCBiZSB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGxvY2sgZGF0YSBzdHJ1Y3R1cmUhCisgIHN0ZDo6YXRvbWljX2Jvb2wgaW5pdGlhbGl6ZWQ7CisgIHZvbGF0aWxlIHVuaW9uIGttcF90aWNrZXRfbG9jayAqc2VsZjsgLy8gcG9pbnRzIHRvIHRoZSBsb2NrIHVuaW9uCisgIGlkZW50X3QgY29uc3QgKmxvY2F0aW9uOyAvLyBTb3VyY2UgY29kZSBsb2NhdGlvbiBvZiBvbXBfaW5pdF9sb2NrKCkuCisgIHN0ZDo6YXRvbWljX3VpbnQKKyAgICAgIG5leHRfdGlja2V0OyAvLyB0aWNrZXQgbnVtYmVyIHRvIGdpdmUgdG8gbmV4dCB0aHJlYWQgd2hpY2ggYWNxdWlyZXMKKyAgc3RkOjphdG9taWNfdWludCBub3dfc2VydmluZzsgLy8gdGlja2V0IG51bWJlciBmb3IgdGhyZWFkIHdoaWNoIGhvbGRzIHRoZSBsb2NrCisgIHN0ZDo6YXRvbWljX2ludCBvd25lcl9pZDsgLy8gKGd0aWQrMSkgb2Ygb3duaW5nIHRocmVhZCwgMCBpZiB1bmxvY2tlZAorICBzdGQ6OmF0b21pY19pbnQgZGVwdGhfbG9ja2VkOyAvLyBkZXB0aCBsb2NrZWQsIGZvciBuZXN0ZWQgbG9ja3Mgb25seQorICBrbXBfbG9ja19mbGFnc190IGZsYWdzOyAvLyBsb2NrIHNwZWNpZmljcywgZS5nLiBjcml0aWNhbCBzZWN0aW9uIGxvY2sKK307CisjZWxzZQorc3RydWN0IGttcF9iYXNlX3RpY2tldF9sb2NrIHsKKyAgLy8gYGluaXRpYWxpemVkJyBtdXN0IGJlIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgbG9jayBkYXRhIHN0cnVjdHVyZSEKKyAgc3RkOjphdG9taWM8Ym9vbD4gaW5pdGlhbGl6ZWQ7CisgIHZvbGF0aWxlIHVuaW9uIGttcF90aWNrZXRfbG9jayAqc2VsZjsgLy8gcG9pbnRzIHRvIHRoZSBsb2NrIHVuaW9uCisgIGlkZW50X3QgY29uc3QgKmxvY2F0aW9uOyAvLyBTb3VyY2UgY29kZSBsb2NhdGlvbiBvZiBvbXBfaW5pdF9sb2NrKCkuCisgIHN0ZDo6YXRvbWljPHVuc2lnbmVkPgorICAgICAgbmV4dF90aWNrZXQ7IC8vIHRpY2tldCBudW1iZXIgdG8gZ2l2ZSB0byBuZXh0IHRocmVhZCB3aGljaCBhY3F1aXJlcworICBzdGQ6OmF0b21pYzx1bnNpZ25lZD4KKyAgICAgIG5vd19zZXJ2aW5nOyAvLyB0aWNrZXQgbnVtYmVyIGZvciB0aHJlYWQgd2hpY2ggaG9sZHMgdGhlIGxvY2sKKyAgc3RkOjphdG9taWM8aW50PiBvd25lcl9pZDsgLy8gKGd0aWQrMSkgb2Ygb3duaW5nIHRocmVhZCwgMCBpZiB1bmxvY2tlZAorICBzdGQ6OmF0b21pYzxpbnQ+IGRlcHRoX2xvY2tlZDsgLy8gZGVwdGggbG9ja2VkLCBmb3IgbmVzdGVkIGxvY2tzIG9ubHkKKyAga21wX2xvY2tfZmxhZ3NfdCBmbGFnczsgLy8gbG9jayBzcGVjaWZpY3MsIGUuZy4gY3JpdGljYWwgc2VjdGlvbiBsb2NrCit9OworI2VuZGlmCisKKyNlbHNlIC8vIF9fY3BsdXNwbHVzCisKK3N0cnVjdCBrbXBfYmFzZV90aWNrZXRfbG9jazsKKworI2VuZGlmIC8vICFfX2NwbHVzcGx1cworCit0eXBlZGVmIHN0cnVjdCBrbXBfYmFzZV90aWNrZXRfbG9jayBrbXBfYmFzZV90aWNrZXRfbG9ja190OworCit1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX3RpY2tldF9sb2NrIHsKKyAga21wX2Jhc2VfdGlja2V0X2xvY2tfdAorICAgICAgbGs7IC8vIFRoaXMgZmllbGQgbXVzdCBiZSBmaXJzdCB0byBhbGxvdyBzdGF0aWMgaW5pdGlhbGl6aW5nLgorICBrbXBfbG9ja19wb29sX3QgcG9vbDsKKyAgZG91YmxlIGxrX2FsaWduOyAvLyB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQKKyAgY2hhciBsa19wYWRbS01QX1BBRChrbXBfYmFzZV90aWNrZXRfbG9ja190LCBDQUNIRV9MSU5FKV07Cit9OworCit0eXBlZGVmIHVuaW9uIGttcF90aWNrZXRfbG9jayBrbXBfdGlja2V0X2xvY2tfdDsKKworLy8gU3RhdGljIGluaXRpYWxpemVyIGZvciBzaW1wbGUgdGlja2V0IGxvY2sgdmFyaWFibGVzLiBVc2FnZToKKy8vICAgIGttcF90aWNrZXRfbG9ja190IHhsb2NrID0gS01QX1RJQ0tFVF9MT0NLX0lOSVRJQUxJWkVSKCB4bG9jayApOworLy8gTm90ZSB0aGUgbWFjcm8gYXJndW1lbnQuIEl0IGlzIGltcG9ydGFudCB0byBtYWtlIHZhciBwcm9wZXJseSBpbml0aWFsaXplZC4KKyNkZWZpbmUgS01QX1RJQ0tFVF9MT0NLX0lOSVRJQUxJWkVSKGxvY2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEFUT01JQ19WQVJfSU5JVCh0cnVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAsICYobG9jayksIE5VTEwsIEFUT01JQ19WQVJfSU5JVCgwVSksIEFUT01JQ19WQVJfSU5JVCgwVSksICAgICAgICAgICAgICAgXAorICAgICAgICAgIEFUT01JQ19WQVJfSU5JVCgwKSwgQVRPTUlDX1ZBUl9JTklUKC0xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworZXh0ZXJuIGludCBfX2ttcF9hY3F1aXJlX3RpY2tldF9sb2NrKGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKTsKK2V4dGVybiBpbnQgX19rbXBfdGVzdF90aWNrZXRfbG9jayhrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfdGlja2V0X2xvY2tfd2l0aF9jaGVrcyhrbXBfdGlja2V0X2xvY2tfdCAqbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGd0aWQpOworZXh0ZXJuIGludCBfX2ttcF9yZWxlYXNlX3RpY2tldF9sb2NrKGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfdGlja2V0X2xvY2soa21wX3RpY2tldF9sb2NrX3QgKmxjayk7CitleHRlcm4gdm9pZCBfX2ttcF9kZXN0cm95X3RpY2tldF9sb2NrKGttcF90aWNrZXRfbG9ja190ICpsY2spOworCitleHRlcm4gaW50IF9fa21wX2FjcXVpcmVfbmVzdGVkX3RpY2tldF9sb2NrKGttcF90aWNrZXRfbG9ja190ICpsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKTsKK2V4dGVybiBpbnQgX19rbXBfdGVzdF9uZXN0ZWRfdGlja2V0X2xvY2soa21wX3RpY2tldF9sb2NrX3QgKmxjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGd0aWQpOworZXh0ZXJuIGludCBfX2ttcF9yZWxlYXNlX25lc3RlZF90aWNrZXRfbG9jayhrbXBfdGlja2V0X2xvY2tfdCAqbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgZ3RpZCk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X25lc3RlZF90aWNrZXRfbG9jayhrbXBfdGlja2V0X2xvY2tfdCAqbGNrKTsKK2V4dGVybiB2b2lkIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3RpY2tldF9sb2NrKGttcF90aWNrZXRfbG9ja190ICpsY2spOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBRdWV1aW5nIGxvY2tzLgorCisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworCitzdHJ1Y3Qga21wX2FkYXB0aXZlX2xvY2tfaW5mbzsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2FkYXB0aXZlX2xvY2tfaW5mbyBrbXBfYWRhcHRpdmVfbG9ja19pbmZvX3Q7CisKKyNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKworc3RydWN0IGttcF9hZGFwdGl2ZV9sb2NrX3N0YXRpc3RpY3MgeworICAvKiBTbyB3ZSBjYW4gZ2V0IHN0YXRzIGZyb20gbG9ja3MgdGhhdCBoYXZlbid0IGJlZW4gZGVzdHJveWVkLiAqLworICBrbXBfYWRhcHRpdmVfbG9ja19pbmZvX3QgKm5leHQ7CisgIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdCAqcHJldjsKKworICAvKiBPdGhlciBzdGF0aXN0aWNzICovCisgIGttcF91aW50MzIgc3VjY2Vzc2Z1bFNwZWN1bGF0aW9uczsKKyAga21wX3VpbnQzMiBoYXJkRmFpbGVkU3BlY3VsYXRpb25zOworICBrbXBfdWludDMyIHNvZnRGYWlsZWRTcGVjdWxhdGlvbnM7CisgIGttcF91aW50MzIgbm9uU3BlY3VsYXRpdmVBY3F1aXJlczsKKyAga21wX3VpbnQzMiBub25TcGVjdWxhdGl2ZUFjcXVpcmVBdHRlbXB0czsKKyAga21wX3VpbnQzMiBsZW1taW5nWWllbGRzOworfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2FkYXB0aXZlX2xvY2tfc3RhdGlzdGljcyBrbXBfYWRhcHRpdmVfbG9ja19zdGF0aXN0aWNzX3Q7CisKK2V4dGVybiB2b2lkIF9fa21wX3ByaW50X3NwZWN1bGF0aXZlX3N0YXRzKCk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X3NwZWN1bGF0aXZlX3N0YXRzKCk7CisKKyNlbmRpZiAvLyBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKworc3RydWN0IGttcF9hZGFwdGl2ZV9sb2NrX2luZm8geworICAvKiBWYWx1ZXMgdXNlZCBmb3IgYWRhcHRpdml0eS4KKyAgICAgQWx0aG91Z2ggdGhlc2UgYXJlIGFjY2Vzc2VkIGZyb20gbXVsdGlwbGUgdGhyZWFkcyB3ZSBkb24ndCBhY2Nlc3MgdGhlbQorICAgICBhdG9taWNhbGx5LCBiZWNhdXNlIGlmIHdlIG1pc3MgdXBkYXRlcyBpdCBwcm9iYWJseSBkb2Vzbid0IG1hdHRlciBtdWNoLiAoSXQKKyAgICAganVzdCBhZmZlY3RzIG91ciBkZWNpc2lvbiBhYm91dCB3aGV0aGVyIHRvIHRyeSBzcGVjdWxhdGlvbiBvbiB0aGUgbG9jaykuICovCisgIGttcF91aW50MzIgdm9sYXRpbGUgYmFkbmVzczsKKyAga21wX3VpbnQzMiB2b2xhdGlsZSBhY3F1aXJlX2F0dGVtcHRzOworICAvKiBQYXJhbWV0ZXJzIG9mIHRoZSBsb2NrLiAqLworICBrbXBfdWludDMyIG1heF9iYWRuZXNzOworICBrbXBfdWludDMyIG1heF9zb2Z0X3JldHJpZXM7CisKKyNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKyAga21wX2FkYXB0aXZlX2xvY2tfc3RhdGlzdGljc190IHZvbGF0aWxlIHN0YXRzOworI2VuZGlmCit9OworCisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworCitzdHJ1Y3Qga21wX2Jhc2VfcXVldWluZ19sb2NrIHsKKworICAvLyAgYGluaXRpYWxpemVkJyBtdXN0IGJlIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgbG9jayBkYXRhIHN0cnVjdHVyZSEKKyAgdm9sYXRpbGUgdW5pb24ga21wX3F1ZXVpbmdfbG9jaworICAgICAgKmluaXRpYWxpemVkOyAvLyBQb2ludHMgdG8gdGhlIGxvY2sgdW5pb24gaWYgaW4gaW5pdGlhbGl6ZWQgc3RhdGUuCisKKyAgaWRlbnRfdCBjb25zdCAqbG9jYXRpb247IC8vIFNvdXJjZSBjb2RlIGxvY2F0aW9uIG9mIG9tcF9pbml0X2xvY2soKS4KKworICBLTVBfQUxJR04oOCkgLy8gdGFpbF9pZCAgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZCEKKworICB2b2xhdGlsZSBrbXBfaW50MzIKKyAgICAgIHRhaWxfaWQ7IC8vIChndGlkKzEpIG9mIHRocmVhZCBhdCB0YWlsIG9mIHdhaXQgcXVldWUsIDAgaWYgZW1wdHkKKyAgLy8gTXVzdCBiZSBubyBwYWRkaW5nIGhlcmUgc2luY2UgaGVhZC90YWlsIHVzZWQgaW4gOC1ieXRlIENBUworICB2b2xhdGlsZSBrbXBfaW50MzIKKyAgICAgIGhlYWRfaWQ7IC8vIChndGlkKzEpIG9mIHRocmVhZCBhdCBoZWFkIG9mIHdhaXQgcXVldWUsIDAgaWYgZW1wdHkKKyAgLy8gRGVjbCBvcmRlciBhc3N1bWVzIGxpdHRsZSBlbmRpYW4KKyAgLy8gYmFrZXJ5LXN0eWxlIGxvY2sKKyAgdm9sYXRpbGUga21wX3VpbnQzMgorICAgICAgbmV4dF90aWNrZXQ7IC8vIHRpY2tldCBudW1iZXIgdG8gZ2l2ZSB0byBuZXh0IHRocmVhZCB3aGljaCBhY3F1aXJlcworICB2b2xhdGlsZSBrbXBfdWludDMyCisgICAgICBub3dfc2VydmluZzsgLy8gdGlja2V0IG51bWJlciBmb3IgdGhyZWFkIHdoaWNoIGhvbGRzIHRoZSBsb2NrCisgIHZvbGF0aWxlIGttcF9pbnQzMiBvd25lcl9pZDsgLy8gKGd0aWQrMSkgb2Ygb3duaW5nIHRocmVhZCwgMCBpZiB1bmxvY2tlZAorICBrbXBfaW50MzIgZGVwdGhfbG9ja2VkOyAvLyBkZXB0aCBsb2NrZWQsIGZvciBuZXN0ZWQgbG9ja3Mgb25seQorCisgIGttcF9sb2NrX2ZsYWdzX3QgZmxhZ3M7IC8vIGxvY2sgc3BlY2lmaWNzLCBlLmcuIGNyaXRpY2FsIHNlY3Rpb24gbG9jaworfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfcXVldWluZ19sb2NrIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190OworCitLTVBfQlVJTERfQVNTRVJUKG9mZnNldG9mKGttcF9iYXNlX3F1ZXVpbmdfbG9ja190LCB0YWlsX2lkKSAlIDggPT0gMCk7CisKK3VuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfcXVldWluZ19sb2NrIHsKKyAga21wX2Jhc2VfcXVldWluZ19sb2NrX3QKKyAgICAgIGxrOyAvLyBUaGlzIGZpZWxkIG11c3QgYmUgZmlyc3QgdG8gYWxsb3cgc3RhdGljIGluaXRpYWxpemluZy4KKyAga21wX2xvY2tfcG9vbF90IHBvb2w7CisgIGRvdWJsZSBsa19hbGlnbjsgLy8gdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50CisgIGNoYXIgbGtfcGFkW0tNUF9QQUQoa21wX2Jhc2VfcXVldWluZ19sb2NrX3QsIENBQ0hFX0xJTkUpXTsKK307CisKK3R5cGVkZWYgdW5pb24ga21wX3F1ZXVpbmdfbG9jayBrbXBfcXVldWluZ19sb2NrX3Q7CisKK2V4dGVybiBpbnQgX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2soa21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKTsKK2V4dGVybiBpbnQgX19rbXBfdGVzdF9xdWV1aW5nX2xvY2soa21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKTsKK2V4dGVybiBpbnQgX19rbXBfcmVsZWFzZV9xdWV1aW5nX2xvY2soa21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfcXVldWluZ19sb2NrKGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrKTsKK2V4dGVybiB2b2lkIF9fa21wX2Rlc3Ryb3lfcXVldWluZ19sb2NrKGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrKTsKKworZXh0ZXJuIGludCBfX2ttcF9hY3F1aXJlX25lc3RlZF9xdWV1aW5nX2xvY2soa21wX3F1ZXVpbmdfbG9ja190ICpsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgZ3RpZCk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfbmVzdGVkX3F1ZXVpbmdfbG9jayhrbXBfcXVldWluZ19sb2NrX3QgKmxjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKTsKK2V4dGVybiBpbnQgX19rbXBfcmVsZWFzZV9uZXN0ZWRfcXVldWluZ19sb2NrKGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGd0aWQpOworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF9uZXN0ZWRfcXVldWluZ19sb2NrKGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrKTsKK2V4dGVybiB2b2lkIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3F1ZXVpbmdfbG9jayhrbXBfcXVldWluZ19sb2NrX3QgKmxjayk7CisKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFkYXB0aXZlIGxvY2tzLgorc3RydWN0IGttcF9iYXNlX2FkYXB0aXZlX2xvY2sgeworICBrbXBfYmFzZV9xdWV1aW5nX2xvY2sgcWxrOworICBLTVBfQUxJR04oQ0FDSEVfTElORSkKKyAga21wX2FkYXB0aXZlX2xvY2tfaW5mb190CisgICAgICBhZGFwdGl2ZTsgLy8gSW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjdWxhdGl2ZSBhZGFwdGl2ZSBsb2NrCit9OworCit0eXBlZGVmIHN0cnVjdCBrbXBfYmFzZV9hZGFwdGl2ZV9sb2NrIGttcF9iYXNlX2FkYXB0aXZlX2xvY2tfdDsKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9hZGFwdGl2ZV9sb2NrIHsKKyAga21wX2Jhc2VfYWRhcHRpdmVfbG9ja190IGxrOworICBrbXBfbG9ja19wb29sX3QgcG9vbDsKKyAgZG91YmxlIGxrX2FsaWduOworICBjaGFyIGxrX3BhZFtLTVBfUEFEKGttcF9iYXNlX2FkYXB0aXZlX2xvY2tfdCwgQ0FDSEVfTElORSldOworfTsKK3R5cGVkZWYgdW5pb24ga21wX2FkYXB0aXZlX2xvY2sga21wX2FkYXB0aXZlX2xvY2tfdDsKKworI2RlZmluZSBHRVRfUUxLX1BUUihsKSAoKGttcF9xdWV1aW5nX2xvY2tfdCAqKSYobCktPmxrLnFsaykKKworI2VuZGlmIC8vIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRFJEUEEgdGlja2V0IGxvY2tzLgorc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2sgeworICAvLyBBbGwgb2YgdGhlIGZpZWxkcyBvbiB0aGUgZmlyc3QgY2FjaGUgbGluZSBhcmUgb25seSB3cml0dGVuIHdoZW4KKyAgLy8gaW5pdGlhbGl6aW5nIG9yIHJlY29uZmlndXJpbmcgdGhlIGxvY2suICBUaGVzZSBhcmUgcmVsYXRpdmVseSByYXJlCisgIC8vIG9wZXJhdGlvbnMsIHNvIGRhdGEgZnJvbSB0aGUgZmlyc3QgY2FjaGUgbGluZSB3aWxsIHVzdWFsbHkgc3RheSByZXNpZGVudCBpbgorICAvLyB0aGUgY2FjaGUgb2YgZWFjaCB0aHJlYWQgdHJ5aW5nIHRvIGFjcXVpcmUgdGhlIGxvY2suCisgIC8vCisgIC8vIGluaXRpYWxpemVkIG11c3QgYmUgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBsb2NrIGRhdGEgc3RydWN0dXJlIQorICBLTVBfQUxJR05fQ0FDSEUKKworICB2b2xhdGlsZSB1bmlvbiBrbXBfZHJkcGFfbG9jaworICAgICAgKmluaXRpYWxpemVkOyAvLyBwb2ludHMgdG8gdGhlIGxvY2sgdW5pb24gaWYgaW4gaW5pdGlhbGl6ZWQgc3RhdGUKKyAgaWRlbnRfdCBjb25zdCAqbG9jYXRpb247IC8vIFNvdXJjZSBjb2RlIGxvY2F0aW9uIG9mIG9tcF9pbml0X2xvY2soKS4KKyAgdm9sYXRpbGUgc3RydWN0IGttcF9sb2NrX3BvbGwgeyBrbXBfdWludDY0IHBvbGw7IH0gKiB2b2xhdGlsZSBwb2xsczsKKyAgdm9sYXRpbGUga21wX3VpbnQ2NCBtYXNrOyAvLyBpcyAyKipudW1fcG9sbHMtMSBmb3IgbW9kIG9wCisgIGttcF91aW50NjQgY2xlYW51cF90aWNrZXQ7IC8vIHRocmVhZCB3aXRoIGNsZWFudXAgdGlja2V0CisgIHZvbGF0aWxlIHN0cnVjdCBrbXBfbG9ja19wb2xsICpvbGRfcG9sbHM7IC8vIHdpbGwgZGVhbGxvY2F0ZSBvbGRfcG9sbHMKKyAga21wX3VpbnQzMiBudW1fcG9sbHM7IC8vIG11c3QgYmUgcG93ZXIgb2YgMgorCisgIC8vIG5leHRfdGlja2V0IGl0IG5lZWRzIHRvIGV4aXN0IGluIGEgc2VwYXJhdGUgY2FjaGUgbGluZSwgYXMgaXQgaXMKKyAgLy8gaW52YWxpZGF0ZWQgZXZlcnkgdGltZSBhIHRocmVhZCB0YWtlcyBhIG5ldyB0aWNrZXQuCisgIEtNUF9BTElHTl9DQUNIRQorCisgIHZvbGF0aWxlIGttcF91aW50NjQgbmV4dF90aWNrZXQ7CisKKyAgLy8gbm93X3NlcnZpbmcgaXMgdXNlZCB0byBzdG9yZSBvdXIgdGlja2V0IHZhbHVlIHdoaWxlIHdlIGhvbGQgdGhlIGxvY2suIEl0CisgIC8vIGhhcyBhIHNsaWdodGx5IGRpZmZlcmVudCBtZWFuaW5nIGluIHRoZSBEUkRQQSB0aWNrZXQgbG9ja3MgKHdoZXJlIGl0IGlzCisgIC8vIHdyaXR0ZW4gYnkgdGhlIGFjcXVpcmluZyB0aHJlYWQpIHRoYW4gaXQgZG9lcyBpbiB0aGUgc2ltcGxlIHRpY2tldCBsb2NrcworICAvLyAod2hlcmUgaXQgaXMgd3JpdHRlbiBieSB0aGUgcmVsZWFzaW5nIHRocmVhZCkuCisgIC8vCisgIC8vIFNpbmNlIG5vd19zZXJ2aW5nIGlzIG9ubHkgcmVhZCBhbiB3cml0dGVuIGluIHRoZSBjcml0aWNhbCBzZWN0aW9uLAorICAvLyBpdCBpcyBub24tdm9sYXRpbGUsIGJ1dCBpdCBuZWVkcyB0byBleGlzdCBvbiBhIHNlcGFyYXRlIGNhY2hlIGxpbmUsCisgIC8vIGFzIGl0IGlzIGludmFsaWRhdGVkIGF0IGV2ZXJ5IGxvY2sgYWNxdWlyZS4KKyAgLy8KKyAgLy8gTGlrZXdpc2UsIHRoZSB2YXJzIHVzZWQgZm9yIG5lc3RlZCBsb2NrcyAob3duZXJfaWQgYW5kIGRlcHRoX2xvY2tlZCkgYXJlCisgIC8vIG9ubHkgd3JpdHRlbiBieSB0aGUgdGhyZWFkIG93bmluZyB0aGUgbG9jaywgc28gdGhleSBhcmUgcHV0IGluIHRoaXMgY2FjaGUKKyAgLy8gbGluZS4gIG93bmVyX2lkIGlzIHJlYWQgYnkgb3RoZXIgdGhyZWFkcywgc28gaXQgbXVzdCBiZSBkZWNsYXJlZCB2b2xhdGlsZS4KKyAgS01QX0FMSUdOX0NBQ0hFCisgIGttcF91aW50NjQgbm93X3NlcnZpbmc7IC8vIGRvZXNuJ3QgaGF2ZSB0byBiZSB2b2xhdGlsZQorICB2b2xhdGlsZSBrbXBfdWludDMyIG93bmVyX2lkOyAvLyAoZ3RpZCsxKSBvZiBvd25pbmcgdGhyZWFkLCAwIGlmIHVubG9ja2VkCisgIGttcF9pbnQzMiBkZXB0aF9sb2NrZWQ7IC8vIGRlcHRoIGxvY2tlZAorICBrbXBfbG9ja19mbGFnc190IGZsYWdzOyAvLyBsb2NrIHNwZWNpZmljcywgZS5nLiBjcml0aWNhbCBzZWN0aW9uIGxvY2sKK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2sga21wX2Jhc2VfZHJkcGFfbG9ja190OworCit1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX2RyZHBhX2xvY2sgeworICBrbXBfYmFzZV9kcmRwYV9sb2NrX3QKKyAgICAgIGxrOyAvLyBUaGlzIGZpZWxkIG11c3QgYmUgZmlyc3QgdG8gYWxsb3cgc3RhdGljIGluaXRpYWxpemluZy4gKi8KKyAga21wX2xvY2tfcG9vbF90IHBvb2w7CisgIGRvdWJsZSBsa19hbGlnbjsgLy8gdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50CisgIGNoYXIgbGtfcGFkW0tNUF9QQUQoa21wX2Jhc2VfZHJkcGFfbG9ja190LCBDQUNIRV9MSU5FKV07Cit9OworCit0eXBlZGVmIHVuaW9uIGttcF9kcmRwYV9sb2NrIGttcF9kcmRwYV9sb2NrX3Q7CisKK2V4dGVybiBpbnQgX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrKGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpOworZXh0ZXJuIGludCBfX2ttcF90ZXN0X2RyZHBhX2xvY2soa21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCk7CitleHRlcm4gaW50IF9fa21wX3JlbGVhc2VfZHJkcGFfbG9jayhrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfZHJkcGFfbG9jayhrbXBfZHJkcGFfbG9ja190ICpsY2spOworZXh0ZXJuIHZvaWQgX19rbXBfZGVzdHJveV9kcmRwYV9sb2NrKGttcF9kcmRwYV9sb2NrX3QgKmxjayk7CisKK2V4dGVybiBpbnQgX19rbXBfYWNxdWlyZV9uZXN0ZWRfZHJkcGFfbG9jayhrbXBfZHJkcGFfbG9ja190ICpsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGd0aWQpOworZXh0ZXJuIGludCBfX2ttcF90ZXN0X25lc3RlZF9kcmRwYV9sb2NrKGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpOworZXh0ZXJuIGludCBfX2ttcF9yZWxlYXNlX25lc3RlZF9kcmRwYV9sb2NrKGttcF9kcmRwYV9sb2NrX3QgKmxjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgZ3RpZCk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X25lc3RlZF9kcmRwYV9sb2NrKGttcF9kcmRwYV9sb2NrX3QgKmxjayk7CitleHRlcm4gdm9pZCBfX2ttcF9kZXN0cm95X25lc3RlZF9kcmRwYV9sb2NrKGttcF9kcmRwYV9sb2NrX3QgKmxjayk7CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIExvY2sgcHVycG9zZXMuCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIEJvb3RzdHJhcCBsb2Nrcy4KKy8vCisvLyBCb290c3RyYXAgbG9ja3MgLS0gdmVyeSBmZXcgbG9ja3MgdXNlZCBhdCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIHRpbWUuCisvLyBCb290c3RyYXAgbG9ja3MgYXJlIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBhcyB0aWNrZXQgbG9ja3MuCisvLyBUaGV5IGNvdWxkIGFsc28gYmUgaW1wbGVtZW50ZWQgYXMgdGVzdCBhbmQgc2V0IGxvY2ssIGJ1dCBjYW5ub3QgYmUKKy8vIGltcGxlbWVudGVkIHdpdGggb3RoZXIgbG9jayBraW5kcyBhcyB0aGV5IHJlcXVpcmUgZ3RpZHMgd2hpY2ggYXJlIG5vdAorLy8gYXZhaWxhYmxlIGF0IGluaXRpYWxpemF0aW9uIHRpbWUuCisKK3R5cGVkZWYga21wX3RpY2tldF9sb2NrX3Qga21wX2Jvb3RzdHJhcF9sb2NrX3Q7CisKKyNkZWZpbmUgS01QX0JPT1RTVFJBUF9MT0NLX0lOSVRJQUxJWkVSKGxvY2spIEtNUF9USUNLRVRfTE9DS19JTklUSUFMSVpFUigobG9jaykpCisKK3N0YXRpYyBpbmxpbmUgaW50IF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soa21wX2Jvb3RzdHJhcF9sb2NrX3QgKmxjaykgeworICByZXR1cm4gX19rbXBfYWNxdWlyZV90aWNrZXRfbG9jayhsY2ssIEtNUF9HVElEX0RORSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fa21wX3Rlc3RfYm9vdHN0cmFwX2xvY2soa21wX2Jvb3RzdHJhcF9sb2NrX3QgKmxjaykgeworICByZXR1cm4gX19rbXBfdGVzdF90aWNrZXRfbG9jayhsY2ssIEtNUF9HVElEX0RORSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKGttcF9ib290c3RyYXBfbG9ja190ICpsY2spIHsKKyAgX19rbXBfcmVsZWFzZV90aWNrZXRfbG9jayhsY2ssIEtNUF9HVElEX0RORSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKGttcF9ib290c3RyYXBfbG9ja190ICpsY2spIHsKKyAgX19rbXBfaW5pdF90aWNrZXRfbG9jayhsY2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19rbXBfZGVzdHJveV9ib290c3RyYXBfbG9jayhrbXBfYm9vdHN0cmFwX2xvY2tfdCAqbGNrKSB7CisgIF9fa21wX2Rlc3Ryb3lfdGlja2V0X2xvY2sobGNrKTsKK30KKworLy8gSW50ZXJuYWwgUlRMIGxvY2tzLgorLy8KKy8vIEludGVybmFsIFJUTCBsb2NrcyBhcmUgYWxzbyBpbXBsZW1lbnRlZCBhcyB0aWNrZXQgbG9ja3MsIGZvciBub3cuCisvLworLy8gRklYTUUgLSBXZSBzaG91bGQgZ28gdGhyb3VnaCBhbmQgZmlndXJlIG91dCB3aGljaCBsb2NrIGtpbmQgd29ya3MgYmVzdCBmb3IKKy8vIGVhY2ggaW50ZXJuYWwgbG9jaywgYW5kIHVzZSB0aGUgdHlwZSBkZWNsYXJhdGlvbiBhbmQgZnVuY3Rpb24gY2FsbHMgZm9yCisvLyB0aGF0IGV4cGxpY2l0IGxvY2sga2luZCAoYW5kIGdldCByaWQgb2YgdGhpcyBzZWN0aW9uKS4KKwordHlwZWRlZiBrbXBfdGlja2V0X2xvY2tfdCBrbXBfbG9ja190OworCitzdGF0aWMgaW5saW5lIGludCBfX2ttcF9hY3F1aXJlX2xvY2soa21wX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCkgeworICByZXR1cm4gX19rbXBfYWNxdWlyZV90aWNrZXRfbG9jayhsY2ssIGd0aWQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX2ttcF90ZXN0X2xvY2soa21wX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCkgeworICByZXR1cm4gX19rbXBfdGVzdF90aWNrZXRfbG9jayhsY2ssIGd0aWQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19rbXBfcmVsZWFzZV9sb2NrKGttcF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpIHsKKyAgX19rbXBfcmVsZWFzZV90aWNrZXRfbG9jayhsY2ssIGd0aWQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19rbXBfaW5pdF9sb2NrKGttcF9sb2NrX3QgKmxjaykgeworICBfX2ttcF9pbml0X3RpY2tldF9sb2NrKGxjayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2ttcF9kZXN0cm95X2xvY2soa21wX2xvY2tfdCAqbGNrKSB7CisgIF9fa21wX2Rlc3Ryb3lfdGlja2V0X2xvY2sobGNrKTsKK30KKworLy8gVXNlciBsb2Nrcy4KKy8vCisvLyBEbyBub3QgYWxsb2NhdGUgb2JqZWN0cyBvZiB0eXBlIHVuaW9uIGttcF91c2VyX2xvY2shISEgVGhpcyB3aWxsIHdhc3RlIHNwYWNlCisvLyB1bmxlc3MgX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZHJkcGEuIEluc3RlYWQsIGNoZWNrIHRoZSB2YWx1ZSBvZgorLy8gX19rbXBfdXNlcl9sb2NrX2tpbmQgYW5kIGFsbG9jYXRlIG9iamVjdHMgb2YgdGhlIHR5cGUgb2YgdGhlIGFwcHJvcHJpYXRlCisvLyB1bmlvbiBtZW1iZXIsIGFuZCBjYXN0IHRoZWlyIGFkZHJlc3NlcyB0byBrbXBfdXNlcl9sb2NrX3AuCisKK2VudW0ga21wX2xvY2tfa2luZCB7CisgIGxrX2RlZmF1bHQgPSAwLAorICBsa190YXMsCisjaWYgS01QX1VTRV9GVVRFWAorICBsa19mdXRleCwKKyNlbmRpZgorI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLICYmIEtNUF9VU0VfVFNYCisgIGxrX2hsZSwKKyAgbGtfcnRtLAorI2VuZGlmCisgIGxrX3RpY2tldCwKKyAgbGtfcXVldWluZywKKyAgbGtfZHJkcGEsCisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworICBsa19hZGFwdGl2ZQorI2VuZGlmIC8vIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKK307CisKK3R5cGVkZWYgZW51bSBrbXBfbG9ja19raW5kIGttcF9sb2NrX2tpbmRfdDsKKworZXh0ZXJuIGttcF9sb2NrX2tpbmRfdCBfX2ttcF91c2VyX2xvY2tfa2luZDsKKwordW5pb24ga21wX3VzZXJfbG9jayB7CisgIGttcF90YXNfbG9ja190IHRhczsKKyNpZiBLTVBfVVNFX0ZVVEVYCisgIGttcF9mdXRleF9sb2NrX3QgZnV0ZXg7CisjZW5kaWYKKyAga21wX3RpY2tldF9sb2NrX3QgdGlja2V0OworICBrbXBfcXVldWluZ19sb2NrX3QgcXVldWluZzsKKyAga21wX2RyZHBhX2xvY2tfdCBkcmRwYTsKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgIGttcF9hZGFwdGl2ZV9sb2NrX3QgYWRhcHRpdmU7CisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworICBrbXBfbG9ja19wb29sX3QgcG9vbDsKK307CisKK3R5cGVkZWYgdW5pb24ga21wX3VzZXJfbG9jayAqa21wX3VzZXJfbG9ja19wOworCisjaWYgIUtNUF9VU0VfRFlOQU1JQ19MT0NLCisKK2V4dGVybiBzaXplX3QgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZTsKK2V4dGVybiBzaXplX3QgX19rbXBfdXNlcl9sb2NrX3NpemU7CisKK2V4dGVybiBrbXBfaW50MzIgKCpfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyXykoa21wX3VzZXJfbG9ja19wIGxjayk7CisKK3N0YXRpYyBpbmxpbmUga21wX2ludDMyIF9fa21wX2dldF91c2VyX2xvY2tfb3duZXIoa21wX3VzZXJfbG9ja19wIGxjaykgeworICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2dldF91c2VyX2xvY2tfb3duZXJfICE9IE5VTEwpOworICByZXR1cm4gKCpfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyXykobGNrKTsKK30KKworZXh0ZXJuIGludCAoKl9fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXykoa21wX3VzZXJfbG9ja19wIGxjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKTsKKworI2lmIEtNUF9PU19MSU5VWCAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKworI2RlZmluZSBfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrcyhsY2ssIGd0aWQpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2hhciBjb25zdCAqY29uc3QgZnVuYyA9ICJvbXBfc2V0X2xvY2siOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmICgoc2l6ZW9mKGttcF90YXNfbG9ja190KSA8PSBPTVBfTE9DS19UX1NJWkUpICYmICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkICE9IC0xKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfRkFUQUwoTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoKGd0aWQgPj0gMCkgJiYgKGxjay0+dGFzLmxrLnBvbGwgLSAxID09IGd0aWQpKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfRkFUQUwoTG9ja0lzQWxyZWFkeU93bmVkLCBmdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgobGNrLT50YXMubGsucG9sbCAhPSAwKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCFLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoJihsY2stPnRhcy5say5wb2xsKSwgMCwgZ3RpZCArIDEpKSkgeyAgICBcCisgICAgICBrbXBfdWludDMyIHNwaW5zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgS01QX0ZTWU5DX1BSRVBBUkUobGNrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEtNUF9JTklUX1lJRUxEKHNwaW5zKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoVENSXzQoX19rbXBfbnRoKSA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6IF9fa21wX3hwcm9jKSkgeyAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX1lJRUxEKFRSVUUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfWUlFTERfU1BJTihzcGlucyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB3aGlsZSAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChsY2stPnRhcy5say5wb2xsICE9IDApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoIUtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMigmKGxjay0+dGFzLmxrLnBvbGwpLCAwLCBndGlkICsgMSkpKSB7ICBcCisgICAgICAgIGlmIChUQ1JfNChfX2ttcF9udGgpID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDogX19rbXBfeHByb2MpKSB7ICAgICAgICAgICAgIFwKKyAgICAgICAgICBLTVBfWUlFTEQoVFJVRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIEtNUF9ZSUVMRF9TUElOKHNwaW5zKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfRlNZTkNfQUNRVUlSRUQobGNrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwpOyAgICAgICAgICAgIFwKKyAgICAoKl9fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXykobGNrLCBndGlkKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IF9fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKGttcF91c2VyX2xvY2tfcCBsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgZ3RpZCkgeworICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMKTsKKyAgcmV0dXJuICgqX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfKShsY2ssIGd0aWQpOworfQorI2VuZGlmCisKK2V4dGVybiBpbnQgKCpfX2ttcF90ZXN0X3VzZXJfbG9ja193aXRoX2NoZWNrc18pKGttcF91c2VyX2xvY2tfcCBsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgZ3RpZCk7CisKKyNpZiBLTVBfT1NfTElOVVggJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpCisKKyNpbmNsdWRlICJrbXBfaTE4bi5oIiAvKiBBQzogS01QX0ZBVEFMIGRlZmluaXRpb24gKi8KK2V4dGVybiBpbnQgX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrOyAvKiBBQzogY29weSBmcm9tIGttcC5oIGhlcmUgKi8KK3N0YXRpYyBpbmxpbmUgaW50IF9fa21wX3Rlc3RfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKGttcF91c2VyX2xvY2tfcCBsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgZ3RpZCkgeworICBpZiAoX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzKSB7CisgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgY2hhciBjb25zdCAqY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9sb2NrIjsKKyAgICAgIGlmICgoc2l6ZW9mKGttcF90YXNfbG9ja190KSA8PSBPTVBfTE9DS19UX1NJWkUpICYmCisgICAgICAgICAgbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkICE9IC0xKSB7CisgICAgICAgIEtNUF9GQVRBTChMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKChsY2stPnRhcy5say5wb2xsID09IDApICYmCisgICAgICAgICAgICBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoJihsY2stPnRhcy5say5wb2xsKSwgMCwgZ3RpZCArIDEpKTsKKyAgfSBlbHNlIHsKKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX3Rlc3RfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMKTsKKyAgICByZXR1cm4gKCpfX2ttcF90ZXN0X3VzZXJfbG9ja193aXRoX2NoZWNrc18pKGxjaywgZ3RpZCk7CisgIH0KK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBfX2ttcF90ZXN0X3VzZXJfbG9ja193aXRoX2NoZWNrcyhrbXBfdXNlcl9sb2NrX3AgbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGd0aWQpIHsKKyAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF90ZXN0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCk7CisgIHJldHVybiAoKl9fa21wX3Rlc3RfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXykobGNrLCBndGlkKTsKK30KKyNlbmRpZgorCitleHRlcm4gaW50ICgqX19rbXBfcmVsZWFzZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfKShrbXBfdXNlcl9sb2NrX3AgbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGd0aWQpOworCitzdGF0aWMgaW5saW5lIHZvaWQgX19rbXBfcmVsZWFzZV91c2VyX2xvY2tfd2l0aF9jaGVja3Moa21wX3VzZXJfbG9ja19wIGxjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgZ3RpZCkgeworICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX3JlbGVhc2VfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMKTsKKyAgKCpfX2ttcF9yZWxlYXNlX3VzZXJfbG9ja193aXRoX2NoZWNrc18pKGxjaywgZ3RpZCk7Cit9CisKK2V4dGVybiB2b2lkICgqX19rbXBfaW5pdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfKShrbXBfdXNlcl9sb2NrX3AgbGNrKTsKKworc3RhdGljIGlubGluZSB2b2lkIF9fa21wX2luaXRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKGttcF91c2VyX2xvY2tfcCBsY2spIHsKKyAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9pbml0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCk7CisgICgqX19rbXBfaW5pdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfKShsY2spOworfQorCisvLyBXZSBuZWVkIGEgbm9uLWNoZWNraW5nIHZlcnNpb24gb2YgZGVzdHJveSBsb2NrIGZvciB3aGVuIHRoZSBSVEwgaXMKKy8vIGRvaW5nIHRoZSBjbGVhbnVwIGFzIGl0IGNhbid0IGFsd2F5cyB0ZWxsIGlmIHRoZSBsb2NrIGlzIG5lc3RlZCBvciBub3QuCitleHRlcm4gdm9pZCAoKl9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrXykoa21wX3VzZXJfbG9ja19wIGxjayk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2ttcF9kZXN0cm95X3VzZXJfbG9jayhrbXBfdXNlcl9sb2NrX3AgbGNrKSB7CisgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfZGVzdHJveV91c2VyX2xvY2tfICE9IE5VTEwpOworICAoKl9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrXykobGNrKTsKK30KKworZXh0ZXJuIHZvaWQgKCpfX2ttcF9kZXN0cm95X3VzZXJfbG9ja193aXRoX2NoZWNrc18pKGttcF91c2VyX2xvY2tfcCBsY2spOworCitzdGF0aWMgaW5saW5lIHZvaWQgX19rbXBfZGVzdHJveV91c2VyX2xvY2tfd2l0aF9jaGVja3Moa21wX3VzZXJfbG9ja19wIGxjaykgeworICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMKTsKKyAgKCpfX2ttcF9kZXN0cm95X3VzZXJfbG9ja193aXRoX2NoZWNrc18pKGxjayk7Cit9CisKK2V4dGVybiBpbnQgKCpfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfKShrbXBfdXNlcl9sb2NrX3AgbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKTsKKworI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCkKKworI2RlZmluZSBfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3MobGNrLCBndGlkLCBkZXB0aCkgICAgICAgICAgIFwKKyAgaWYgKF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2hhciBjb25zdCAqY29uc3QgZnVuYyA9ICJvbXBfc2V0X25lc3RfbG9jayI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmICgoc2l6ZW9mKGttcF90YXNfbG9ja190KSA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSkgJiYgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkID09IC0xKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfRkFUQUwoTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChsY2stPnRhcy5say5wb2xsIC0gMSA9PSBndGlkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGxjay0+dGFzLmxrLmRlcHRoX2xvY2tlZCArPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAqZGVwdGggPSBLTVBfTE9DS19BQ1FVSVJFRF9ORVhUOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmICgobGNrLT50YXMubGsucG9sbCAhPSAwKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKCFLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoJihsY2stPnRhcy5say5wb2xsKSwgMCwgZ3RpZCArIDEpKSkgeyAgXAorICAgICAgICBrbXBfdWludDMyIHNwaW5zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0ZTWU5DX1BSRVBBUkUobGNrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9JTklUX1lJRUxEKHNwaW5zKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoVENSXzQoX19rbXBfbnRoKSA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIChfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6IF9fa21wX3hwcm9jKSkgeyAgICAgICAgICAgICBcCisgICAgICAgICAgS01QX1lJRUxEKFRSVUUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBLTVBfWUlFTERfU1BJTihzcGlucyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSAoKGxjay0+dGFzLmxrLnBvbGwgIT0gMCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICghS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCYobGNrLT50YXMubGsucG9sbCksIDAsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkICsgMSkpKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGlmIChUQ1JfNChfX2ttcF9udGgpID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDogX19rbXBfeHByb2MpKSB7ICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfWUlFTEQoVFJVRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9ZSUVMRF9TUElOKHNwaW5zKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKmRlcHRoID0gS01QX0xPQ0tfQUNRVUlSRURfRklSU1Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0ZTWU5DX0FDUVVJUkVEKGxjayk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCk7ICAgICBcCisgICAgKmRlcHRoID0gKCpfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfKShsY2ssIGd0aWQpOyAgICAgICAgXAorICB9CisKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcyhrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmRlcHRoKSB7CisgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfYWNxdWlyZV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMKTsKKyAgKmRlcHRoID0gKCpfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfKShsY2ssIGd0aWQpOworfQorI2VuZGlmCisKK2V4dGVybiBpbnQgKCpfX2ttcF90ZXN0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfKShrbXBfdXNlcl9sb2NrX3AgbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKTsKKworI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCkKK3N0YXRpYyBpbmxpbmUgaW50IF9fa21wX3Rlc3RfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcyhrbXBfdXNlcl9sb2NrX3AgbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkKSB7CisgIGlmIChfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMpIHsKKyAgICBpbnQgcmV0dmFsOworICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgIGNoYXIgY29uc3QgKmNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbmVzdF9sb2NrIjsKKyAgICAgIGlmICgoc2l6ZW9mKGttcF90YXNfbG9ja190KSA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSkgJiYKKyAgICAgICAgICBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgPT0gLTEpIHsKKyAgICAgICAgS01QX0ZBVEFMKExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyk7CisgICAgICB9CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoZ3RpZCA+PSAwKTsKKyAgICBpZiAobGNrLT50YXMubGsucG9sbCAtIDEgPT0KKyAgICAgICAgZ3RpZCkgeyAvKiBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKi8KKyAgICAgIHJldHVybiArK2xjay0+dGFzLmxrLmRlcHRoX2xvY2tlZDsgLyogc2FtZSBvd25lciwgZGVwdGggaW5jcmVhc2VkICovCisgICAgfQorICAgIHJldHZhbCA9ICgobGNrLT50YXMubGsucG9sbCA9PSAwKSAmJgorICAgICAgICAgICAgICBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoJihsY2stPnRhcy5say5wb2xsKSwgMCwgZ3RpZCArIDEpKTsKKyAgICBpZiAocmV0dmFsKSB7CisgICAgICBLTVBfTUIoKTsKKyAgICAgIGxjay0+dGFzLmxrLmRlcHRoX2xvY2tlZCA9IDE7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7CisgIH0gZWxzZSB7CisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF90ZXN0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwpOworICAgIHJldHVybiAoKl9fa21wX3Rlc3RfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18pKGxjaywgZ3RpZCk7CisgIH0KK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBfX2ttcF90ZXN0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3Moa21wX3VzZXJfbG9ja19wIGxjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgZ3RpZCkgeworICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX3Rlc3RfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCk7CisgIHJldHVybiAoKl9fa21wX3Rlc3RfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18pKGxjaywgZ3RpZCk7Cit9CisjZW5kaWYKKworZXh0ZXJuIGludCAoKl9fa21wX3JlbGVhc2VfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18pKGttcF91c2VyX2xvY2tfcCBsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGd0aWQpOworCitzdGF0aWMgaW5saW5lIGludAorX19rbXBfcmVsZWFzZV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKGttcF91c2VyX2xvY2tfcCBsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGd0aWQpIHsKKyAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9yZWxlYXNlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwpOworICByZXR1cm4gKCpfX2ttcF9yZWxlYXNlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfKShsY2ssIGd0aWQpOworfQorCitleHRlcm4gdm9pZCAoKl9fa21wX2luaXRfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18pKGttcF91c2VyX2xvY2tfcCBsY2spOworCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2luaXRfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcyhrbXBfdXNlcl9sb2NrX3AgbGNrKSB7CisgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfaW5pdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMKTsKKyAgKCpfX2ttcF9pbml0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfKShsY2spOworfQorCitleHRlcm4gdm9pZCAoKl9fa21wX2Rlc3Ryb3lfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18pKGttcF91c2VyX2xvY2tfcCBsY2spOworCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2Rlc3Ryb3lfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcyhrbXBfdXNlcl9sb2NrX3AgbGNrKSB7CisgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfZGVzdHJveV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMKTsKKyAgKCpfX2ttcF9kZXN0cm95X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfKShsY2spOworfQorCisvLyB1c2VyIGxvY2sgZnVuY3Rpb25zIHdoaWNoIGRvIG5vdCBuZWNlc3NhcmlseSBleGlzdCBmb3IgYWxsIGxvY2sga2luZHMuCisvLworLy8gVGhlICJzZXQiIGZ1bmN0aW9ucyB1c3VhbGx5IGhhdmUgd3JhcHBlciByb3V0aW5lcyB0aGF0IGNoZWNrIGZvciBhIE5VTEwgc2V0CisvLyBmdW5jdGlvbiBwb2ludGVyIGFuZCBjYWxsIGl0IGlmIG5vbi1OVUxMLgorLy8KKy8vIEluIHNvbWUgY2FzZXMsIGl0IG1ha2VzIHNlbnNlIHRvIGhhdmUgYSAiZ2V0IiB3cmFwcGVyIGZ1bmN0aW9uIGNoZWNrIGZvciBhCisvLyBOVUxMIGdldCBmdW5jdGlvbiBwb2ludGVyIGFuZCByZXR1cm4gTlVMTCAvIGludmFsaWQgdmFsdWUgLyBlcnJvciBjb2RlIGlmCisvLyB0aGUgZnVuY3Rpb24gcG9pbnRlciBpcyBOVUxMLgorLy8KKy8vIEluIG90aGVyIGNhc2VzLCB0aGUgY2FsbGluZyBjb2RlIHJlYWxseSBzaG91bGQgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGFuCisvLyB1bmltcGxlbWVudGVkIGZ1bmN0aW9uIGFuZCBvbmUgdGhhdCBpcyBpbXBsZW1lbnRlZCBidXQgcmV0dXJuaW5nIE5VTEwgLworLy8gaW52YWxpZWQgdmFsdWUuICBJZiB0aGlzIGlzIHRoZSBjYXNlLCBubyBnZXQgZnVuY3Rpb24gd3JhcHBlciBleGlzdHMuCisKK2V4dGVybiBpbnQgKCpfX2ttcF9pc191c2VyX2xvY2tfaW5pdGlhbGl6ZWRfKShrbXBfdXNlcl9sb2NrX3AgbGNrKTsKKworLy8gbm8gc2V0IGZ1bmN0aW9uOyBmaWVsZHMgc2V0IGR1cmluaW5nIGxvY2FsIGFsbG9jYXRpb24KKworZXh0ZXJuIGNvbnN0IGlkZW50X3QgKigqX19rbXBfZ2V0X3VzZXJfbG9ja19sb2NhdGlvbl8pKGttcF91c2VyX2xvY2tfcCBsY2spOworCitzdGF0aWMgaW5saW5lIGNvbnN0IGlkZW50X3QgKl9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb24oa21wX3VzZXJfbG9ja19wIGxjaykgeworICBpZiAoX19rbXBfZ2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gIT0gTlVMTCkgeworICAgIHJldHVybiAoKl9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fKShsY2spOworICB9IGVsc2UgeworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK2V4dGVybiB2b2lkICgqX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbl8pKGttcF91c2VyX2xvY2tfcCBsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpZGVudF90ICpsb2MpOworCitzdGF0aWMgaW5saW5lIHZvaWQgX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbihrbXBfdXNlcl9sb2NrX3AgbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaWRlbnRfdCAqbG9jKSB7CisgIGlmIChfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyAhPSBOVUxMKSB7CisgICAgKCpfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uXykobGNrLCBsb2MpOworICB9Cit9CisKK2V4dGVybiBrbXBfbG9ja19mbGFnc190ICgqX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18pKGttcF91c2VyX2xvY2tfcCBsY2spOworCitleHRlcm4gdm9pZCAoKl9fa21wX3NldF91c2VyX2xvY2tfZmxhZ3NfKShrbXBfdXNlcl9sb2NrX3AgbGNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2xvY2tfZmxhZ3NfdCBmbGFncyk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzKGttcF91c2VyX2xvY2tfcCBsY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbG9ja19mbGFnc190IGZsYWdzKSB7CisgIGlmIChfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzXyAhPSBOVUxMKSB7CisgICAgKCpfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzXykobGNrLCBmbGFncyk7CisgIH0KK30KKworLy8gVGhlIGZ1Y3Rpb24gd2hpY2ggc2V0cyB1cCBhbGwgb2YgdGhlIHZ0YmwgcG9pbnRlcnMgZm9yIGttcF91c2VyX2xvY2tfdC4KK2V4dGVybiB2b2lkIF9fa21wX3NldF91c2VyX2xvY2tfdnB0cnMoa21wX2xvY2tfa2luZF90IHVzZXJfbG9ja19raW5kKTsKKworLy8gTWFjcm9zIGZvciBiaW5kaW5nIHVzZXIgbG9jayBmdW5jdGlvbnMuCisjZGVmaW5lIEtNUF9CSU5EX1VTRVJfTE9DS19URU1QTEFURShuZXN0LCBraW5kLCBzdWZmaXgpICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9hY3F1aXJlIyNuZXN0IyN1c2VyX2xvY2tfd2l0aF9jaGVja3NfID0gKGludCAoKikoICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyKSlfX2ttcF9hY3F1aXJlIyNuZXN0IyNraW5kIyNfIyNzdWZmaXg7ICAgICAgXAorICAgIF9fa21wX3JlbGVhc2UjI25lc3QjI3VzZXJfbG9ja193aXRoX2NoZWNrc18gPSAoaW50ICgqKSggICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAga21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIpKV9fa21wX3JlbGVhc2UjI25lc3QjI2tpbmQjI18jI3N1ZmZpeDsgICAgICBcCisgICAgX19rbXBfdGVzdCMjbmVzdCMjdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyA9IChpbnQgKCopKCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMikpX19rbXBfdGVzdCMjbmVzdCMja2luZCMjXyMjc3VmZml4OyAgICAgICAgIFwKKyAgICBfX2ttcF9pbml0IyNuZXN0IyN1c2VyX2xvY2tfd2l0aF9jaGVja3NfID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICh2b2lkICgqKShrbXBfdXNlcl9sb2NrX3ApKV9fa21wX2luaXQjI25lc3QjI2tpbmQjI18jI3N1ZmZpeDsgICAgICAgICAgXAorICAgIF9fa21wX2Rlc3Ryb3kjI25lc3QjI3VzZXJfbG9ja193aXRoX2NoZWNrc18gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHZvaWQgKCopKGttcF91c2VyX2xvY2tfcCkpX19rbXBfZGVzdHJveSMjbmVzdCMja2luZCMjXyMjc3VmZml4OyAgICAgICBcCisgIH0KKworI2RlZmluZSBLTVBfQklORF9VU0VSX0xPQ0soa2luZCkgS01QX0JJTkRfVVNFUl9MT0NLX1RFTVBMQVRFKF8sIGtpbmQsIGxvY2spCisjZGVmaW5lIEtNUF9CSU5EX1VTRVJfTE9DS19XSVRIX0NIRUNLUyhraW5kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBLTVBfQklORF9VU0VSX0xPQ0tfVEVNUExBVEUoXywga2luZCwgbG9ja193aXRoX2NoZWNrcykKKyNkZWZpbmUgS01QX0JJTkRfTkVTVEVEX1VTRVJfTE9DSyhraW5kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEtNUF9CSU5EX1VTRVJfTE9DS19URU1QTEFURShfbmVzdGVkXywga2luZCwgbG9jaykKKyNkZWZpbmUgS01QX0JJTkRfTkVTVEVEX1VTRVJfTE9DS19XSVRIX0NIRUNLUyhraW5kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEtNUF9CSU5EX1VTRVJfTE9DS19URU1QTEFURShfbmVzdGVkXywga2luZCwgbG9ja193aXRoX2NoZWNrcykKKworLy8gVXNlciBsb2NrIHRhYmxlICYgbG9jayBhbGxvY2F0aW9uCisvKiBPbiA2NC1iaXQgTGludXgqIE9TIChhbmQgT1MgWCopIEdOVSBjb21waWxlciBhbGxvY2F0ZXMgb25seSA0IGJ5dGVtcyBtZW1vcnkKKyAgIGZvciBsb2NrIHZhcmlhYmxlLCB3aGljaCBpcyBub3QgZW5vdWdoIHRvIHN0b3JlIGEgcG9pbnRlciwgc28gd2UgaGF2ZSB0byB1c2UKKyAgIGxvY2sgaW5kZXhlcyBpbnN0ZWFkIG9mIHBvaW50ZXJzIGFuZCBtYWludGFpbiBsb2NrIHRhYmxlIHRvIG1hcCBpbmRleGVzIHRvCisgICBwb2ludGVycy4KKworCisgICBOb3RlOiBUaGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgdGFibGUgaXMgbm90IGEgcG9pbnRlciB0byBsb2NrISBJdCBpcyBhCisgICBwb2ludGVyIHRvIHByZXZpb3VzbHkgYWxsb2NhdGVkIHRhYmxlIChvciBOVUxMIGlmIGl0IGlzIHRoZSBmaXJzdCB0YWJsZSkuCisKKyAgIFVzYWdlOgorCisgICBpZiAoIE9NUF9MT0NLX1RfU0laRSA8IHNpemVvZiggPGxvY2s+ICkgKSB7IC8vIG9yIE9NUF9ORVNUX0xPQ0tfVF9TSVpFCisgICAgIExvY2sgdGFibGUgaXMgZnVsbHkgdXRpbGl6ZWQuIFVzZXIgbG9ja3MgYXJlIGluZGV4ZXMsIHNvIHRhYmxlIGlzIHVzZWQgb24KKyAgICAgdXNlciBsb2NrIG9wZXJhdGlvbi4KKyAgICAgTm90ZTogaXQgbWF5IGJlIHRoZSBjYXNlIChsaW5fMzIpIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byB1c2UgYSBsb2NrCisgICAgIHRhYmxlIGZvciByZWd1bGFyIGxvY2tzLCBidXQgZG8gbmVlZCB0aGUgdGFibGUgZm9yIG5lc3RlZCBsb2Nrcy4KKyAgIH0KKyAgIGVsc2UgeworICAgICBMb2NrIHRhYmxlIGluaXRpYWxpemVkIGJ1dCBub3QgYWN0dWFsbHkgdXNlZC4KKyAgIH0KKyovCisKK3N0cnVjdCBrbXBfbG9ja190YWJsZSB7CisgIGttcF9sb2NrX2luZGV4X3QgdXNlZDsgLy8gTnVtYmVyIG9mIHVzZWQgZWxlbWVudHMKKyAga21wX2xvY2tfaW5kZXhfdCBhbGxvY2F0ZWQ7IC8vIE51bWJlciBvZiBhbGxvY2F0ZWQgZWxlbWVudHMKKyAga21wX3VzZXJfbG9ja19wICp0YWJsZTsgLy8gTG9jayB0YWJsZS4KK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9sb2NrX3RhYmxlIGttcF9sb2NrX3RhYmxlX3Q7CisKK2V4dGVybiBrbXBfbG9ja190YWJsZV90IF9fa21wX3VzZXJfbG9ja190YWJsZTsKK2V4dGVybiBrbXBfdXNlcl9sb2NrX3AgX19rbXBfbG9ja19wb29sOworCitzdHJ1Y3Qga21wX2Jsb2NrX29mX2xvY2tzIHsKKyAgc3RydWN0IGttcF9ibG9ja19vZl9sb2NrcyAqbmV4dF9ibG9jazsKKyAgdm9pZCAqbG9ja3M7Cit9OworCit0eXBlZGVmIHN0cnVjdCBrbXBfYmxvY2tfb2ZfbG9ja3Mga21wX2Jsb2NrX29mX2xvY2tzX3Q7CisKK2V4dGVybiBrbXBfYmxvY2tfb2ZfbG9ja3NfdCAqX19rbXBfbG9ja19ibG9ja3M7CitleHRlcm4gaW50IF9fa21wX251bV9sb2Nrc19pbl9ibG9jazsKKworZXh0ZXJuIGttcF91c2VyX2xvY2tfcCBfX2ttcF91c2VyX2xvY2tfYWxsb2NhdGUodm9pZCAqKnVzZXJfbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2xvY2tfZmxhZ3NfdCBmbGFncyk7CitleHRlcm4gdm9pZCBfX2ttcF91c2VyX2xvY2tfZnJlZSh2b2lkICoqdXNlcl9sb2NrLCBrbXBfaW50MzIgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91c2VyX2xvY2tfcCBsY2spOworZXh0ZXJuIGttcF91c2VyX2xvY2tfcCBfX2ttcF9sb29rdXBfdXNlcl9sb2NrKHZvaWQgKip1c2VyX2xvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqZnVuYyk7CitleHRlcm4gdm9pZCBfX2ttcF9jbGVhbnVwX3VzZXJfbG9ja3MoKTsKKworI2RlZmluZSBLTVBfQ0hFQ0tfVVNFUl9MT0NLX0lOSVQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFUQ1JfNChfX2ttcF9pbml0X3VzZXJfbG9ja3MpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jaygmX19rbXBfaW5pdHpfbG9jayk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmICghVENSXzQoX19rbXBfaW5pdF91c2VyX2xvY2tzKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRDV180KF9fa21wX2luaXRfdXNlcl9sb2NrcywgVFJVRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJl9fa21wX2luaXR6X2xvY2spOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisjdW5kZWYgS01QX1BBRAorI3VuZGVmIEtNUF9HVElEX0RORQorCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKy8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLIGVuYWJsZXMgZHluYW1pYyBkaXNwYXRjaCBvZiBsb2NrIGZ1bmN0aW9ucyB3aXRob3V0CisvLyBicmVha2luZyB0aGUgY3VycmVudCBjb21wYXRpYmlsaXR5LiBFc3NlbnRpYWwgZnVuY3Rpb25hbGl0eSBvZiB0aGlzIG5ldyBjb2RlCisvLyBpcyBkeW5hbWljIGRpc3BhdGNoLCBidXQgaXQgYWxzbyBpbXBsZW1lbnRzIChvciBlbmFibGVzIGltcGxlbWVudGF0aW9uIG9mKQorLy8gaGludGVkIHVzZXIgbG9jayBhbmQgY3JpdGljYWwgc2VjdGlvbiB3aGljaCB3aWxsIGJlIHBhcnQgb2YgT01QIDQuNSBzb29uLgorLy8KKy8vIExvY2sgdHlwZSBjYW4gYmUgZGVjaWRlZCBhdCBjcmVhdGlvbiB0aW1lIChpLmUuLCBsb2NrIGluaXRpYWxpemF0aW9uKSwgYW5kCisvLyBzdWJzZXF1ZW50IGxvY2sgZnVuY3Rpb24gY2FsbCBvbiB0aGUgY3JlYXRlZCBsb2NrIG9iamVjdCByZXF1aXJlcyB0eXBlCisvLyBleHRyYWN0aW9uIGFuZCBjYWxsIHRocm91Z2gganVtcCB0YWJsZSB1c2luZyB0aGUgZXh0cmFjdGVkIHR5cGUuIFRoaXMgdHlwZQorLy8gaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIHR3byBkaWZmZXJlbnQgd2F5cyBkZXBlbmRpbmcgb24gdGhlIHNpemUgb2YgdGhlIGxvY2sKKy8vIG9iamVjdCwgYW5kIHdlIGRpZmZlcmVudGlhdGUgbG9jayB0eXBlcyBieSB0aGlzIHNpemUgcmVxdWlyZW1lbnQgLSBkaXJlY3QgYW5kCisvLyBpbmRpcmVjdCBsb2Nrcy4KKy8vCisvLyBEaXJlY3QgbG9ja3M6CisvLyBBIGRpcmVjdCBsb2NrIG9iamVjdCBmaXRzIGludG8gdGhlIHNwYWNlIGNyZWF0ZWQgYnkgdGhlIGNvbXBpbGVyIGZvciBhbgorLy8gb21wX2xvY2tfdCBvYmplY3QsIGFuZCBUQVMvRnV0ZXggbG9jayBmYWxscyBpbnRvIHRoaXMgY2F0ZWdvcnkuIFdlIHVzZSBsb3cKKy8vIG9uZSBieXRlIG9mIHRoZSBsb2NrIG9iamVjdCBhcyB0aGUgc3RvcmFnZSBmb3IgdGhlIGxvY2sgdHlwZSwgYW5kIGFwcHJvcHJpYXRlCisvLyBiaXQgb3BlcmF0aW9uIGlzIHJlcXVpcmVkIHRvIGFjY2VzcyB0aGUgZGF0YSBtZWFuaW5nZnVsIHRvIHRoZSBsb2NrCisvLyBhbGdvcml0aG1zLiBBbHNvLCB0byBkaWZmZXJlbnRpYXRlIGRpcmVjdCBsb2NrIGZyb20gaW5kaXJlY3QgbG9jaywgMSBpcworLy8gd3JpdHRlbiB0byBMU0Igb2YgdGhlIGxvY2sgb2JqZWN0LiBUaGUgbmV3bHkgaW50cm9kdWNlZCAiaGxlIiBsb2NrIGlzIGFsc28gYQorLy8gZGlyZWN0IGxvY2suCisvLworLy8gSW5kaXJlY3QgbG9ja3M6CisvLyBBbiBpbmRpcmVjdCBsb2NrIG9iamVjdCByZXF1aXJlcyBtb3JlIHNwYWNlIHRoYW4gdGhlIGNvbXBpbGVyLWdlbmVyYXRlZAorLy8gc3BhY2UsIGFuZCBpdCBzaG91bGQgYmUgYWxsb2NhdGVkIGZyb20gaGVhcC4gRGVwZW5kaW5nIG9uIHRoZSBzaXplIG9mIHRoZQorLy8gY29tcGlsZXItZ2VuZXJhdGVkIHNwYWNlIGZvciB0aGUgbG9jayAoaS5lLiwgc2l6ZSBvZiBvbXBfbG9ja190KSwgdGhpcworLy8gb21wX2xvY2tfdCBvYmplY3Qgc3RvcmVzIGVpdGhlciB0aGUgYWRkcmVzcyBvZiB0aGUgaGVhcC1hbGxvY2F0ZWQgaW5kaXJlY3QKKy8vIGxvY2sgKHZvaWQgKiBmaXRzIGluIHRoZSBvYmplY3QpIG9yIGFuIGluZGV4IHRvIHRoZSBpbmRpcmVjdCBsb2NrIHRhYmxlIGVudHJ5CisvLyB0aGF0IGhvbGRzIHRoZSBhZGRyZXNzLiBUaWNrZXQvUXVldWluZy9EUkRQQS9BZGFwdGl2ZSBsb2NrIGZhbGxzIGludG8gdGhpcworLy8gY2F0ZWdvcnksIGFuZCB0aGUgbmV3bHkgaW50cm9kdWNlZCAicnRtIiBsb2NrIGlzIGFsc28gYW4gaW5kaXJlY3QgbG9jayB3aGljaAorLy8gd2FzIGltcGxlbWVudGVkIG9uIHRvcCBvZiB0aGUgUXVldWluZyBsb2NrLiBXaGVuIHRoZSBvbXBfbG9ja190IG9iamVjdCBob2xkcworLy8gYW4gaW5kZXggKG5vdCBsb2NrIGFkZHJlc3MpLCAwIGlzIHdyaXR0ZW4gdG8gTFNCIHRvIGRpZmZlcmVudGlhdGUgdGhlIGxvY2sKKy8vIGZyb20gYSBkaXJlY3QgbG9jaywgYW5kIHRoZSByZW1haW5pbmcgcGFydCBpcyB0aGUgYWN0dWFsIGluZGV4IHRvIHRoZQorLy8gaW5kaXJlY3QgbG9jayB0YWJsZS4KKworI2luY2x1ZGUgPHN0ZGludC5oPiAvLyBmb3IgdWludHB0cl90CisKKy8vIFNob3J0Y3V0cworI2RlZmluZSBLTVBfVVNFX0lOTElORURfVEFTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0pKSAmJiAxCisjZGVmaW5lIEtNUF9VU0VfSU5MSU5FRF9GVVRFWCBLTVBfVVNFX0ZVVEVYICYmIDAKKworLy8gTGlzdCBvZiBsb2NrIGRlZmluaXRpb25zOyBhbGwgbmVzdGVkIGxvY2tzIGFyZSBpbmRpcmVjdCBsb2Nrcy4KKy8vIGhsZSBsb2NrIGlzIHhjaGcgbG9jayBwcmVmaXhlZCB3aXRoIFhBQ1FVSVJFL1hSRUxFQVNFLgorLy8gQWxsIG5lc3RlZCBsb2NrcyBhcmUgaW5kaXJlY3QgbG9jayB0eXBlcy4KKyNpZiBLTVBfVVNFX1RTWAorI2lmIEtNUF9VU0VfRlVURVgKKyNkZWZpbmUgS01QX0ZPUkVBQ0hfRF9MT0NLKG0sIGEpIG0odGFzLCBhKSBtKGZ1dGV4LCBhKSBtKGhsZSwgYSkKKyNkZWZpbmUgS01QX0ZPUkVBQ0hfSV9MT0NLKG0sIGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG0odGlja2V0LCBhKSBtKHF1ZXVpbmcsIGEpIG0oYWRhcHRpdmUsIGEpIG0oZHJkcGEsIGEpIG0ocnRtLCBhKSAgICAgICAgICAgICAgXAorICAgICAgbShuZXN0ZWRfdGFzLCBhKSBtKG5lc3RlZF9mdXRleCwgYSkgbShuZXN0ZWRfdGlja2V0LCBhKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBtKG5lc3RlZF9xdWV1aW5nLCBhKSBtKG5lc3RlZF9kcmRwYSwgYSkKKyNlbHNlCisjZGVmaW5lIEtNUF9GT1JFQUNIX0RfTE9DSyhtLCBhKSBtKHRhcywgYSkgbShobGUsIGEpCisjZGVmaW5lIEtNUF9GT1JFQUNIX0lfTE9DSyhtLCBhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBtKHRpY2tldCwgYSkgbShxdWV1aW5nLCBhKSBtKGFkYXB0aXZlLCBhKSBtKGRyZHBhLCBhKSBtKHJ0bSwgYSkgICAgICAgICAgICAgIFwKKyAgICAgIG0obmVzdGVkX3RhcywgYSkgbShuZXN0ZWRfdGlja2V0LCBhKSBtKG5lc3RlZF9xdWV1aW5nLCBhKSAgICAgICAgICAgICAgICBcCisgICAgICAgICAgbShuZXN0ZWRfZHJkcGEsIGEpCisjZW5kaWYgLy8gS01QX1VTRV9GVVRFWAorI2RlZmluZSBLTVBfTEFTVF9EX0xPQ0sgbG9ja3NlcV9obGUKKyNlbHNlCisjaWYgS01QX1VTRV9GVVRFWAorI2RlZmluZSBLTVBfRk9SRUFDSF9EX0xPQ0sobSwgYSkgbSh0YXMsIGEpIG0oZnV0ZXgsIGEpCisjZGVmaW5lIEtNUF9GT1JFQUNIX0lfTE9DSyhtLCBhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBtKHRpY2tldCwgYSkgbShxdWV1aW5nLCBhKSBtKGRyZHBhLCBhKSBtKG5lc3RlZF90YXMsIGEpIG0obmVzdGVkX2Z1dGV4LCBhKSAgIFwKKyAgICAgIG0obmVzdGVkX3RpY2tldCwgYSkgbShuZXN0ZWRfcXVldWluZywgYSkgbShuZXN0ZWRfZHJkcGEsIGEpCisjZGVmaW5lIEtNUF9MQVNUX0RfTE9DSyBsb2Nrc2VxX2Z1dGV4CisjZWxzZQorI2RlZmluZSBLTVBfRk9SRUFDSF9EX0xPQ0sobSwgYSkgbSh0YXMsIGEpCisjZGVmaW5lIEtNUF9GT1JFQUNIX0lfTE9DSyhtLCBhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBtKHRpY2tldCwgYSkgbShxdWV1aW5nLCBhKSBtKGRyZHBhLCBhKSBtKG5lc3RlZF90YXMsIGEpIG0obmVzdGVkX3RpY2tldCwgYSkgIFwKKyAgICAgIG0obmVzdGVkX3F1ZXVpbmcsIGEpIG0obmVzdGVkX2RyZHBhLCBhKQorI2RlZmluZSBLTVBfTEFTVF9EX0xPQ0sgbG9ja3NlcV90YXMKKyNlbmRpZiAvLyBLTVBfVVNFX0ZVVEVYCisjZW5kaWYgLy8gS01QX1VTRV9UU1gKKworLy8gSW5mb3JtYXRpb24gdXNlZCBpbiBkeW5hbWljIGRpc3BhdGNoCisjZGVmaW5lIEtNUF9MT0NLX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICA4IC8vIG51bWJlciBvZiBsb3cgYml0cyB0byBiZSB1c2VkIGFzIHRhZyBmb3IgZGlyZWN0IGxvY2tzCisjZGVmaW5lIEtNUF9GSVJTVF9EX0xPQ0sgbG9ja3NlcV90YXMKKyNkZWZpbmUgS01QX0ZJUlNUX0lfTE9DSyBsb2Nrc2VxX3RpY2tldAorI2RlZmluZSBLTVBfTEFTVF9JX0xPQ0sgbG9ja3NlcV9uZXN0ZWRfZHJkcGEKKyNkZWZpbmUgS01QX05VTV9JX0xPQ0tTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChsb2NrdGFnX25lc3RlZF9kcmRwYSArIDEpIC8vIG51bWJlciBvZiBpbmRpcmVjdCBsb2NrIHR5cGVzCisKKy8vIEJhc2UgdHlwZSBmb3IgZHluYW1pYyBsb2Nrcy4KK3R5cGVkZWYga21wX3VpbnQzMiBrbXBfZHluYV9sb2NrX3Q7CisKKy8vIExvY2sgc2VxdWVuY2UgdGhhdCBlbnVtZXJhdGVzIGFsbCBsb2NrIGtpbmRzLiBBbHdheXMgbWFrZSB0aGlzIGVudW1lcmF0aW9uCisvLyBjb25zaXN0ZW50IHdpdGgga21wX2xvY2tzZXFfdCBpbiB0aGUgaW5jbHVkZSBkaXJlY3RvcnkuCit0eXBlZGVmIGVudW0geworICBsb2Nrc2VxX2luZGlyZWN0ID0gMCwKKyNkZWZpbmUgZXhwYW5kX3NlcShsLCBhKSBsb2Nrc2VxXyMjbCwKKyAgS01QX0ZPUkVBQ0hfRF9MT0NLKGV4cGFuZF9zZXEsIDApIEtNUF9GT1JFQUNIX0lfTE9DSyhleHBhbmRfc2VxLCAwKQorI3VuZGVmIGV4cGFuZF9zZXEKK30ga21wX2R5bmFfbG9ja3NlcV90OworCisvLyBFbnVtZXJhdGVzIGluZGlyZWN0IGxvY2sgdGFncy4KK3R5cGVkZWYgZW51bSB7CisjZGVmaW5lIGV4cGFuZF90YWcobCwgYSkgbG9ja3RhZ18jI2wsCisgIEtNUF9GT1JFQUNIX0lfTE9DSyhleHBhbmRfdGFnLCAwKQorI3VuZGVmIGV4cGFuZF90YWcKK30ga21wX2luZGlyZWN0X2xvY2t0YWdfdDsKKworLy8gVXRpbGl0eSBtYWNyb3MgdGhhdCBleHRyYWN0IGluZm9ybWF0aW9uIGZyb20gbG9jayBzZXF1ZW5jZXMuCisjZGVmaW5lIEtNUF9JU19EX0xPQ0soc2VxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKHNlcSkgPj0gS01QX0ZJUlNUX0RfTE9DSyAmJiAoc2VxKSA8PSBLTVBfTEFTVF9EX0xPQ0spCisjZGVmaW5lIEtNUF9JU19JX0xPQ0soc2VxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKHNlcSkgPj0gS01QX0ZJUlNUX0lfTE9DSyAmJiAoc2VxKSA8PSBLTVBfTEFTVF9JX0xPQ0spCisjZGVmaW5lIEtNUF9HRVRfSV9UQUcoc2VxKSAoa21wX2luZGlyZWN0X2xvY2t0YWdfdCkoKHNlcSktS01QX0ZJUlNUX0lfTE9DSykKKyNkZWZpbmUgS01QX0dFVF9EX1RBRyhzZXEpICgoc2VxKSA8PCAxIHwgMSkKKworLy8gRW51bWVyYXRlcyBkaXJlY3QgbG9jayB0YWdzIHN0YXJ0aW5nIGZyb20gaW5kaXJlY3QgdGFnLgordHlwZWRlZiBlbnVtIHsKKyNkZWZpbmUgZXhwYW5kX3RhZyhsLCBhKSBsb2NrdGFnXyMjbCA9IEtNUF9HRVRfRF9UQUcobG9ja3NlcV8jI2wpLAorICBLTVBfRk9SRUFDSF9EX0xPQ0soZXhwYW5kX3RhZywgMCkKKyN1bmRlZiBleHBhbmRfdGFnCit9IGttcF9kaXJlY3RfbG9ja3RhZ190OworCisvLyBJbmRpcmVjdCBsb2NrIHR5cGUKK3R5cGVkZWYgc3RydWN0IHsKKyAga21wX3VzZXJfbG9ja19wIGxvY2s7CisgIGttcF9pbmRpcmVjdF9sb2NrdGFnX3QgdHlwZTsKK30ga21wX2luZGlyZWN0X2xvY2tfdDsKKworLy8gRnVuY3Rpb24gdGFibGVzIGZvciBkaXJlY3QgbG9ja3MuIFNldC91bnNldC90ZXN0IGRpZmZlcmVudGlhdGUgZnVuY3Rpb25zCisvLyB3aXRoL3dpdGhvdXQgY29uc2lzdGVuY3kgY2hlY2tpbmcuCitleHRlcm4gdm9pZCAoKl9fa21wX2RpcmVjdF9pbml0W10pKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfZHluYV9sb2Nrc2VxX3QpOworZXh0ZXJuIHZvaWQgKCpfX2ttcF9kaXJlY3RfZGVzdHJveVtdKShrbXBfZHluYV9sb2NrX3QgKik7CitleHRlcm4gdm9pZCAoKigqX19rbXBfZGlyZWN0X3NldCkpKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfaW50MzIpOworZXh0ZXJuIGludCAoKigqX19rbXBfZGlyZWN0X3Vuc2V0KSkoa21wX2R5bmFfbG9ja190ICosIGttcF9pbnQzMik7CitleHRlcm4gaW50ICgqKCpfX2ttcF9kaXJlY3RfdGVzdCkpKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfaW50MzIpOworCisvLyBGdW5jdGlvbiB0YWJsZXMgZm9yIGluZGlyZWN0IGxvY2tzLiBTZXQvdW5zZXQvdGVzdCBkaWZmZXJlbnRpYXRlIGZ1bmN0aW9ucworLy8gd2l0aC93aXRodW90IGNvbnNpc3RlbmN5IGNoZWNraW5nLgorZXh0ZXJuIHZvaWQgKCpfX2ttcF9pbmRpcmVjdF9pbml0W10pKGttcF91c2VyX2xvY2tfcCk7CitleHRlcm4gdm9pZCAoKl9fa21wX2luZGlyZWN0X2Rlc3Ryb3lbXSkoa21wX3VzZXJfbG9ja19wKTsKK2V4dGVybiB2b2lkICgqKCpfX2ttcF9pbmRpcmVjdF9zZXQpKShrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMik7CitleHRlcm4gaW50ICgqKCpfX2ttcF9pbmRpcmVjdF91bnNldCkpKGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyKTsKK2V4dGVybiBpbnQgKCooKl9fa21wX2luZGlyZWN0X3Rlc3QpKShrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMik7CisKKy8vIEV4dHJhY3RzIGRpcmVjdCBsb2NrIHRhZyBmcm9tIGEgdXNlciBsb2NrIHBvaW50ZXIKKyNkZWZpbmUgS01QX0VYVFJBQ1RfRF9UQUcobCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgqKChrbXBfZHluYV9sb2NrX3QgKikobCkpICYgKCgxIDw8IEtNUF9MT0NLX1NISUZUKSAtIDEpICYgICAgICAgICAgICAgICAgICAgXAorICAgLSgqKChrbXBfZHluYV9sb2NrX3QgKikobCkpICYgMSkpCisKKy8vIEV4dHJhY3RzIGluZGlyZWN0IGxvY2sgaW5kZXggZnJvbSBhIHVzZXIgbG9jayBwb2ludGVyCisjZGVmaW5lIEtNUF9FWFRSQUNUX0lfSU5ERVgobCkgKCooa21wX2xvY2tfaW5kZXhfdCAqKShsKSA+PiAxKQorCisvLyBSZXR1cm5zIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdGhlIGRpcmVjdCBsb2NrIGZ1bmN0aW9uIHdpdGggbCAoa21wX2R5bmFfbG9ja190CisvLyAqKSBhbmQgb3AgKG9wZXJhdGlvbiB0eXBlKS4KKyNkZWZpbmUgS01QX0RfTE9DS19GVU5DKGwsIG9wKSBfX2ttcF9kaXJlY3RfIyNvcFtLTVBfRVhUUkFDVF9EX1RBRyhsKV0KKworLy8gUmV0dXJucyBmdW5jdGlvbiBwb2ludGVyIHRvIHRoZSBpbmRpcmVjdCBsb2NrIGZ1bmN0aW9uIHdpdGggbAorLy8gKGttcF9pbmRpcmVjdF9sb2NrX3QgKikgYW5kIG9wIChvcGVyYXRpb24gdHlwZSkuCisjZGVmaW5lIEtNUF9JX0xPQ0tfRlVOQyhsLCBvcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF9pbmRpcmVjdF8jI29wWygoa21wX2luZGlyZWN0X2xvY2tfdCAqKShsKSktPnR5cGVdCisKKy8vIEluaXRpYWxpemVzIGEgZGlyZWN0IGxvY2sgd2l0aCB0aGUgZ2l2ZW4gbG9jayBwb2ludGVyIGFuZCBsb2NrIHNlcXVlbmNlLgorI2RlZmluZSBLTVBfSU5JVF9EX0xPQ0sobCwgc2VxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfZGlyZWN0X2luaXRbS01QX0dFVF9EX1RBRyhzZXEpXSgoa21wX2R5bmFfbG9ja190ICopbCwgc2VxKQorCisvLyBJbml0aWFsaXplcyBhbiBpbmRpcmVjdCBsb2NrIHdpdGggdGhlIGdpdmVuIGxvY2sgcG9pbnRlciBhbmQgbG9jayBzZXF1ZW5jZS4KKyNkZWZpbmUgS01QX0lOSVRfSV9MT0NLKGwsIHNlcSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX2RpcmVjdF9pbml0WzBdKChrbXBfZHluYV9sb2NrX3QgKikobCksIHNlcSkKKworLy8gUmV0dXJucyAiZnJlZSIgbG9jayB2YWx1ZSBmb3IgdGhlIGdpdmVuIGxvY2sgdHlwZS4KKyNkZWZpbmUgS01QX0xPQ0tfRlJFRSh0eXBlKSAobG9ja3RhZ18jI3R5cGUpCisKKy8vIFJldHVybnMgImJ1c3kiIGxvY2sgdmFsdWUgZm9yIHRoZSBnaXZlbiBsb2NrIHRleXAuCisjZGVmaW5lIEtNUF9MT0NLX0JVU1kodiwgdHlwZSkgKCh2KSA8PCBLTVBfTE9DS19TSElGVCB8IGxvY2t0YWdfIyN0eXBlKQorCisvLyBSZXR1cm5zIGxvY2sgdmFsdWUgYWZ0ZXIgcmVtb3ZpbmcgKHNoaWZ0aW5nKSBsb2NrIHRhZy4KKyNkZWZpbmUgS01QX0xPQ0tfU1RSSVAodikgKCh2KSA+PiBLTVBfTE9DS19TSElGVCkKKworLy8gSW5pdGlhbGl6ZXMgZ2xvYmFsIHN0YXRlcyBhbmQgZGF0YSBzdHJ1Y3R1cmVzIGZvciBtYW5hZ2luZyBkeW5hbWljIHVzZXIKKy8vIGxvY2tzLgorZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF9keW5hbWljX3VzZXJfbG9ja3MoKTsKKworLy8gQWxsb2NhdGVzIGFuZCByZXR1cm5zIGFuIGluZGlyZWN0IGxvY2sgd2l0aCB0aGUgZ2l2ZW4gaW5kaXJlY3QgbG9jayB0YWcuCitleHRlcm4ga21wX2luZGlyZWN0X2xvY2tfdCAqCitfX2ttcF9hbGxvY2F0ZV9pbmRpcmVjdF9sb2NrKHZvaWQgKiosIGttcF9pbnQzMiwga21wX2luZGlyZWN0X2xvY2t0YWdfdCk7CisKKy8vIENsZWFucyB1cCBnbG9iYWwgc3RhdGVzIGFuZCBkYXRhIHN0cnVjdHVyZXMgZm9yIG1hbmFnaW5nIGR5bmFtaWMgdXNlciBsb2Nrcy4KK2V4dGVybiB2b2lkIF9fa21wX2NsZWFudXBfaW5kaXJlY3RfdXNlcl9sb2NrcygpOworCisvLyBEZWZhdWx0IHVzZXIgbG9jayBzZXF1ZW5jZSB3aGVuIG5vdCB1c2luZyBoaW50ZWQgbG9ja3MuCitleHRlcm4ga21wX2R5bmFfbG9ja3NlcV90IF9fa21wX3VzZXJfbG9ja19zZXE7CisKKy8vIEp1bXAgdGFibGUgZm9yICJzZXQgbG9jayBsb2NhdGlvbiIsIGF2YWlsYWJsZSBvbmx5IGZvciBpbmRpcmVjdCBsb2Nrcy4KK2V4dGVybiB2b2lkICgqX19rbXBfaW5kaXJlY3Rfc2V0X2xvY2F0aW9uW0tNUF9OVU1fSV9MT0NLU10pKGttcF91c2VyX2xvY2tfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkZW50X3QgKik7CisjZGVmaW5lIEtNUF9TRVRfSV9MT0NLX0xPQ0FUSU9OKGxjaywgbG9jKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoX19rbXBfaW5kaXJlY3Rfc2V0X2xvY2F0aW9uWyhsY2spLT50eXBlXSAhPSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBfX2ttcF9pbmRpcmVjdF9zZXRfbG9jYXRpb25bKGxjayktPnR5cGVdKChsY2spLT5sb2NrLCBsb2MpOyAgICAgICAgICAgICAgXAorICB9CisKKy8vIEp1bXAgdGFibGUgZm9yICJzZXQgbG9jayBmbGFncyIsIGF2YWlsYWJsZSBvbmx5IGZvciBpbmRpcmVjdCBsb2Nrcy4KK2V4dGVybiB2b2lkICgqX19rbXBfaW5kaXJlY3Rfc2V0X2ZsYWdzW0tNUF9OVU1fSV9MT0NLU10pKGttcF91c2VyX2xvY2tfcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9sb2NrX2ZsYWdzX3QpOworI2RlZmluZSBLTVBfU0VUX0lfTE9DS19GTEFHUyhsY2ssIGZsYWcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKF9fa21wX2luZGlyZWN0X3NldF9mbGFnc1sobGNrKS0+dHlwZV0gIT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX19rbXBfaW5kaXJlY3Rfc2V0X2ZsYWdzWyhsY2spLT50eXBlXSgobGNrKS0+bG9jaywgZmxhZyk7ICAgICAgICAgICAgICAgIFwKKyAgfQorCisvLyBKdW1wIHRhYmxlIGZvciAiZ2V0IGxvY2sgbG9jYXRpb24iLCBhdmFpbGFibGUgb25seSBmb3IgaW5kaXJlY3QgbG9ja3MuCitleHRlcm4gY29uc3QgaWRlbnRfdCAqKCpfX2ttcF9pbmRpcmVjdF9nZXRfbG9jYXRpb25bS01QX05VTV9JX0xPQ0tTXSkoCisgICAga21wX3VzZXJfbG9ja19wKTsKKyNkZWZpbmUgS01QX0dFVF9JX0xPQ0tfTE9DQVRJT04obGNrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChfX2ttcF9pbmRpcmVjdF9nZXRfbG9jYXRpb25bKGxjayktPnR5cGVdICE9IE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgID8gX19rbXBfaW5kaXJlY3RfZ2V0X2xvY2F0aW9uWyhsY2spLT50eXBlXSgobGNrKS0+bG9jaykgICAgICAgICAgICAgICAgIFwKKyAgICAgICA6IE5VTEwpCisKKy8vIEp1bXAgdGFibGUgZm9yICJnZXQgbG9jayBmbGFncyIsIGF2YWlsYWJsZSBvbmx5IGZvciBpbmRpcmVjdCBsb2Nrcy4KK2V4dGVybiBrbXBfbG9ja19mbGFnc190ICgqX19rbXBfaW5kaXJlY3RfZ2V0X2ZsYWdzW0tNUF9OVU1fSV9MT0NLU10pKAorICAgIGttcF91c2VyX2xvY2tfcCk7CisjZGVmaW5lIEtNUF9HRVRfSV9MT0NLX0ZMQUdTKGxjaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoX19rbXBfaW5kaXJlY3RfZ2V0X2ZsYWdzWyhsY2spLT50eXBlXSAhPSBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICA/IF9fa21wX2luZGlyZWN0X2dldF9mbGFnc1sobGNrKS0+dHlwZV0oKGxjayktPmxvY2spICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgOiBOVUxMKQorCisjZGVmaW5lIEtNUF9JX0xPQ0tfQ0hVTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAxMDI0IC8vIG51bWJlciBvZiBrbXBfaW5kaXJlY3RfbG9ja190IG9iamVjdHMgdG8gYmUgYWxsb2NhdGVkIHRvZ2V0aGVyCisKKy8vIExvY2sgdGFibGUgZm9yIGluZGlyZWN0IGxvY2tzLgordHlwZWRlZiBzdHJ1Y3Qga21wX2luZGlyZWN0X2xvY2tfdGFibGUgeworICBrbXBfaW5kaXJlY3RfbG9ja190ICoqdGFibGU7IC8vIGJsb2NrcyBvZiBpbmRpcmVjdCBsb2NrcyBhbGxvY2F0ZWQKKyAga21wX2xvY2tfaW5kZXhfdCBzaXplOyAvLyBzaXplIG9mIHRoZSBpbmRpcmVjdCBsb2NrIHRhYmxlCisgIGttcF9sb2NrX2luZGV4X3QgbmV4dDsgLy8gaW5kZXggdG8gdGhlIG5leHQgbG9jayB0byBiZSBhbGxvY2F0ZWQKK30ga21wX2luZGlyZWN0X2xvY2tfdGFibGVfdDsKKworZXh0ZXJuIGttcF9pbmRpcmVjdF9sb2NrX3RhYmxlX3QgX19rbXBfaV9sb2NrX3RhYmxlOworCisvLyBSZXR1cm5zIHRoZSBpbmRpcmVjdCBsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gaW5kZXguCisjZGVmaW5lIEtNUF9HRVRfSV9MT0NLKGluZGV4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKihfX2ttcF9pX2xvY2tfdGFibGUudGFibGUgKyAoaW5kZXgpIC8gS01QX0lfTE9DS19DSFVOSykgKyAgICAgICAgICAgICAgICAgIFwKKyAgIChpbmRleCkgJSBLTVBfSV9MT0NLX0NIVU5LKQorCisvLyBOdW1iZXIgb2YgbG9ja3MgaW4gYSBsb2NrIGJsb2NrLCB3aGljaCBpcyBmaXhlZCB0byAiMSIgbm93LgorLy8gVE9ETzogTm8gbG9jayBibG9jayBpbXBsZW1lbnRhdGlvbiBub3cuIElmIHdlIGRvIHN1cHBvcnQsIHdlIG5lZWQgdG8gbWFuYWdlCisvLyBsb2NrIGJsb2NrIGRhdGEgc3RydWN0dXJlIGZvciBlYWNoIGluZGlyZWN0IGxvY2sgdHlwZS4KK2V4dGVybiBpbnQgX19rbXBfbnVtX2xvY2tzX2luX2Jsb2NrOworCisvLyBGYXN0IGxvY2sgdGFibGUgbG9va3VwIHdpdGhvdXQgY29uc2lzdGVuY3kgY2hlY2tpbmcKKyNkZWZpbmUgS01QX0xPT0tVUF9JX0xPQ0sobCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoT01QX0xPQ0tfVF9TSVpFIDwgc2l6ZW9mKHZvaWQgKikpID8gS01QX0dFVF9JX0xPQ0soS01QX0VYVFJBQ1RfSV9JTkRFWChsKSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICooKGttcF9pbmRpcmVjdF9sb2NrX3QgKiopKGwpKSkKKworLy8gVXNlZCBvbmNlIGluIGttcF9lcnJvci5jcHAKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcihrbXBfdXNlcl9sb2NrX3AsIGttcF91aW50MzIpOworCisjZWxzZSAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisjZGVmaW5lIEtNUF9MT0NLX0JVU1kodiwgdHlwZSkgKHYpCisjZGVmaW5lIEtNUF9MT0NLX0ZSRUUodHlwZSkgMAorI2RlZmluZSBLTVBfTE9DS19TVFJJUCh2KSAodikKKworI2VuZGlmIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKy8vIGRhdGEgc3RydWN0dXJlIGZvciB1c2luZyBiYWNrb2ZmIHdpdGhpbiBzcGluIGxvY2tzLgordHlwZWRlZiBzdHJ1Y3QgeworICBrbXBfdWludDMyIHN0ZXA7IC8vIGN1cnJlbnQgc3RlcAorICBrbXBfdWludDMyIG1heF9iYWNrb2ZmOyAvLyB1cHBlciBib3VuZCBvZiBvdXRlciBkZWxheSBsb29wCisgIGttcF91aW50MzIgbWluX3RpY2s7IC8vIHNpemUgb2YgaW5uZXIgZGVsYXkgbG9vcCBpbiB0aWNrcyAobWFjaGluZS1kZXBlbmRlbnQpCit9IGttcF9iYWNrb2ZmX3Q7CisKKy8vIFJ1bnRpbWUncyBkZWZhdWx0IGJhY2tvZmYgcGFyYW1ldGVycworZXh0ZXJuIGttcF9iYWNrb2ZmX3QgX19rbXBfc3Bpbl9iYWNrb2ZmX3BhcmFtczsKKworLy8gQmFja29mZiBmdW5jdGlvbgorZXh0ZXJuIHZvaWQgX19rbXBfc3Bpbl9iYWNrb2ZmKGttcF9iYWNrb2ZmX3QgKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2VuZGlmIC8qIEtNUF9MT0NLX0ggKi8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9vbXAuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9vbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Njg0ZmQzCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX29tcC5oCkBAIC0wLDAgKzEsMjQyIEBACisjaWYgVVNFX0RFQlVHR0VSCisvKgorICoga21wX29tcC5oIC0tIE9wZW5NUCBkZWZpbml0aW9uIGZvciBrbXBfb21wX3N0cnVjdF9pbmZvX3QuCisgKiAgICAgICAgICAgICAgVGhpcyBpcyBmb3IgaW5mb3JtYXRpb24gYWJvdXQgcnVudGltZSBsaWJyYXJ5IHN0cnVjdHVyZXMuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8qIFRISVMgRklMRSBTSE9VTEQgTk9UIEJFIE1PRElGSUVEIElOIElEQiBJTlRFUkZBQ0UgTElCUkFSWSBDT0RFCisgICBJdCBzaG91bGQgaW5zdGVhZCBiZSBtb2RpZmllZCBpbiB0aGUgT3Blbk1QIHJ1bnRpbWUgYW5kIGNvcGllZCB0byB0aGUKKyAgIGludGVyZmFjZSBsaWJyYXJ5IGNvZGUuICBUaGlzIHdheSB3ZSBjYW4gbWluaW1pemUgdGhlIHByb2JsZW1zIHRoYXQgdGhpcyBpcworICAgc3VyZSB0byBjYXVzZSBoYXZpbmcgdHdvIGNvcGllcyBvZiB0aGUgc2FtZSBmaWxlLgorCisgICBGaWxlcyBsaXZlIGluIGxpYm9tcCBhbmQgbGlib21wX2RiL3NyYy9pbmNsdWRlICAqLworCisvKiBDSEFOR0UgVEhJUyBXSEVOIFNUUlVDVFVSRVMgQkVMT1cgQ0hBTkdFCisgICBCZWZvcmUgd2UgcmVsZWFzZSB0aGlzIHRvIGEgY3VzdG9tZXIsIHBsZWFzZSBkb24ndCBjaGFuZ2UgdGhpcyB2YWx1ZS4gIEFmdGVyCisgICBpdCBpcyByZWxlYXNlZCBhbmQgc3RhYmxlLCB0aGVuIGFueSBuZXcgdXBkYXRlcyB0byB0aGUgc3RydWN0dXJlcyBvciBkYXRhCisgICBzdHJ1Y3R1cmUgdHJhdmVyc2FsIGFsZ29yaXRobXMgbmVlZCB0byBjaGFuZ2UgdGhpcyB2YWx1ZS4gKi8KKyNkZWZpbmUgS01QX09NUF9WRVJTSU9OIDkKKwordHlwZWRlZiBzdHJ1Y3QgeworICBrbXBfaW50MzIgb2Zmc2V0OworICBrbXBfaW50MzIgc2l6ZTsKK30gb2Zmc2V0X2FuZF9zaXplX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAga21wX3VpbnQ2NCBhZGRyOworICBrbXBfaW50MzIgc2l6ZTsKKyAga21wX2ludDMyIHBhZGRpbmc7Cit9IGFkZHJfYW5kX3NpemVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBrbXBfdWludDY0IGZsYWdzOyAvLyBGbGFncyBmb3IgZnV0dXJlIGV4dGVuc2lvbnMuCisgIGttcF91aW50NjQKKyAgICAgIGZpbGU7IC8vIFBvaW50ZXIgdG8gbmFtZSBvZiBzb3VyY2UgZmlsZSB3aGVyZSB0aGUgcGFyYWxsZWwgcmVnaW9uIGlzLgorICBrbXBfdWludDY0IGZ1bmM7IC8vIFBvaW50ZXIgdG8gbmFtZSBvZiByb3V0aW5lIHdoZXJlIHRoZSBwYXJhbGxlbCByZWdpb24gaXMuCisgIGttcF9pbnQzMiBiZWdpbjsgLy8gQmVnaW5uaW5nIG9mIHNvdXJjZSBsaW5lIHJhbmdlLgorICBrbXBfaW50MzIgZW5kOyAvLyBFbmQgb2Ygc291cmNlIGxpbmUgcmFuZ2UuCisgIGttcF9pbnQzMiBudW1fdGhyZWFkczsgLy8gU3BlY2lmaWVkIG51bWJlciBvZiB0aHJlYWRzLgorfSBrbXBfb21wX250aHJfaXRlbV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgIGttcF9pbnQzMiBudW07IC8vIE51bWJlciBvZiBpdGVtcyBpbiB0aGUgYXJycmF5LgorICBrbXBfdWludDY0IGFycmF5OyAvLyBBZGRyZXNzIG9mIGFycmF5IG9mIGttcF9vbXBfbnVtX3RocmVhZHNfaXRlbV90LgorfSBrbXBfb21wX250aHJfaW5mb190OworCisvKiBUaGlzIHN0cnVjdHVyZSBpcyBrbm93biB0byB0aGUgaWRiIGludGVyZmFjZSBsaWJyYXJ5ICovCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgLyogQ2hhbmdlIHRoaXMgb25seSBpZiB5b3UgbWFrZSBhIGZ1bmRhbWVudGFsIGRhdGEgc3RydWN0dXJlIGNoYW5nZSBoZXJlICovCisgIGttcF9pbnQzMiBsaWJfdmVyc2lvbjsKKworICAvKiBzYW5pdHkgY2hlY2suICBPbmx5IHNob3VsZCBiZSBjaGVja2VkIGlmIHZlcnNpb25zIGFyZSBpZGVudGljYWwKKyAgICogVGhpcyBpcyBhbHNvIHVzZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgdG8gZ2V0IHRoZSBydW50aW1lCisgICAqIHN0cnVjdHVyZSBzaXplIGlmIGl0IHRoZSBydW50aW1lIGlzIG9sZGVyIHRoYW4gdGhlIGludGVyZmFjZSAqLworICBrbXBfaW50MzIgc2l6ZW9mX3RoaXNfc3RydWN0dXJlOworCisgIC8qIE9wZW5NUCBSVEwgdmVyc2lvbiBpbmZvLiAqLworICBhZGRyX2FuZF9zaXplX3QgbWFqb3I7CisgIGFkZHJfYW5kX3NpemVfdCBtaW5vcjsKKyAgYWRkcl9hbmRfc2l6ZV90IGJ1aWxkOworICBhZGRyX2FuZF9zaXplX3Qgb3Blbm1wX3ZlcnNpb247CisgIGFkZHJfYW5kX3NpemVfdCBiYW5uZXI7CisKKyAgLyogVmFyaW91cyBnbG9iYWxzLiAqLworICBhZGRyX2FuZF9zaXplX3QgdGhyZWFkczsgLy8gUG9pbnRlciB0byBfX2ttcF90aHJlYWRzLgorICBhZGRyX2FuZF9zaXplX3Qgcm9vdHM7IC8vIFBvaW50ZXIgdG8gX19rbXBfcm9vdC4KKyAgYWRkcl9hbmRfc2l6ZV90IGNhcGFjaXR5OyAvLyBQb2ludGVyIHRvIF9fa21wX3RocmVhZHNfY2FwYWNpdHkuCisgIGFkZHJfYW5kX3NpemVfdCBtb25pdG9yOyAvLyBQb2ludGVyIHRvIF9fa21wX21vbml0b3IuCisjaWYgIUtNUF9VU0VfRFlOQU1JQ19MT0NLCisgIGFkZHJfYW5kX3NpemVfdCBsb2NrX3RhYmxlOyAvLyBQb2ludGVyIHRvIF9fa21wX2xvY2tfdGFibGUuCisjZW5kaWYKKyAgYWRkcl9hbmRfc2l6ZV90IGZ1bmNfbWljcm90YXNrOworICBhZGRyX2FuZF9zaXplX3QgZnVuY19mb3JrOworICBhZGRyX2FuZF9zaXplX3QgZnVuY19mb3JrX3RlYW1zOworICBhZGRyX2FuZF9zaXplX3QgdGVhbV9jb3VudGVyOworICBhZGRyX2FuZF9zaXplX3QgdGFza19jb3VudGVyOworICBhZGRyX2FuZF9zaXplX3QgbnRocl9pbmZvOworICBrbXBfaW50MzIgYWRkcmVzc193aWR0aDsKKyAga21wX2ludDMyIGluZGV4ZWRfbG9ja3M7CisgIGttcF9pbnQzMiBsYXN0X2JhcnJpZXI7IC8vIFRoZSBlbmQgaW4gZW51bSBiYXJyaWVyX3R5cGUKKyAga21wX2ludDMyIGRlcXVlX3NpemU7IC8vIFRBU0tfREVRVUVfU0laRQorCisgIC8qIHRocmVhZCBzdHJ1Y3R1cmUgaW5mb3JtYXRpb24uICovCisgIGttcF9pbnQzMiB0aF9zaXplb2Zfc3RydWN0OworICBvZmZzZXRfYW5kX3NpemVfdCB0aF9pbmZvOyAvLyBkZXNjcmlwdG9yIGZvciB0aHJlYWQKKyAgb2Zmc2V0X2FuZF9zaXplX3QgdGhfdGVhbTsgLy8gdGVhbSBmb3IgdGhpcyB0aHJlYWQKKyAgb2Zmc2V0X2FuZF9zaXplX3QgdGhfcm9vdDsgLy8gcm9vdCBmb3IgdGhpcyB0aHJlYWQKKyAgb2Zmc2V0X2FuZF9zaXplX3QgdGhfc2VyaWFsX3RlYW07IC8vIHNlcmlhbCB0ZWFtIHVuZGVyIHRoaXMgdGhyZWFkCisgIG9mZnNldF9hbmRfc2l6ZV90IHRoX2lkZW50OyAvLyBsb2NhdGlvbiBmb3IgdGhpcyB0aHJlYWQgKGlmIGF2YWlsYWJsZSkKKyAgb2Zmc2V0X2FuZF9zaXplX3QgdGhfc3Bpbl9oZXJlOyAvLyBpcyB0aHJlYWQgd2FpdGluZyBmb3IgbG9jayAoaWYgYXZhaWxhYmxlKQorICBvZmZzZXRfYW5kX3NpemVfdAorICAgICAgdGhfbmV4dF93YWl0aW5nOyAvLyBuZXh0IHRocmVhZCB3YWl0aW5nIGZvciBsb2NrIChpZiBhdmFpbGFibGUpCisgIG9mZnNldF9hbmRfc2l6ZV90IHRoX3Rhc2tfdGVhbTsgLy8gdGFzayB0ZWFtIHN0cnVjdAorICBvZmZzZXRfYW5kX3NpemVfdCB0aF9jdXJyZW50X3Rhc2s7IC8vIGlubmVybW9zdCB0YXNrIGJlaW5nIGV4ZWN1dGVkCisgIG9mZnNldF9hbmRfc2l6ZV90CisgICAgICB0aF90YXNrX3N0YXRlOyAvLyBhbHRlcm5hdGluZyAwLzEgZm9yIHRhc2sgdGVhbSBpZGVudGlmaWNhdGlvbgorICBvZmZzZXRfYW5kX3NpemVfdCB0aF9iYXI7CisgIG9mZnNldF9hbmRfc2l6ZV90IHRoX2Jfd29ya2VyX2Fycml2ZWQ7IC8vIHRoZSB3b3JrZXIgaW5jcmVhc2VzIGl0IGJ5IDEgd2hlbiBpdAorLy8gYXJyaXZlcyB0byB0aGUgYmFycmllcgorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgLyogdGVhbXMgaW5mb3JtYXRpb24gKi8KKyAgb2Zmc2V0X2FuZF9zaXplX3QgdGhfdGVhbXNfbWljcm90YXNrOyAvLyBlbnRyeSBhZGRyZXNzIGZvciB0ZWFtcyBjb25zdHJ1Y3QKKyAgb2Zmc2V0X2FuZF9zaXplX3QgdGhfdGVhbXNfbGV2ZWw7IC8vIGluaXRpYWwgbGV2ZWwgb2YgdGVhbXMgY29uc3RydWN0CisgIG9mZnNldF9hbmRfc2l6ZV90IHRoX3RlYW1zX250ZWFtczsgLy8gbnVtYmVyIG9mIHRlYW1zIGluIGEgbGVhZ3VlCisgIG9mZnNldF9hbmRfc2l6ZV90CisgICAgICB0aF90ZWFtc19udGg7IC8vIG51bWJlciBvZiB0aHJlYWRzIGluIGVhY2ggdGVhbSBvZiB0aGUgbGVhZ3VlCisjZW5kaWYKKworICAvKiBrbXBfZGVzYyBzdHJ1Y3R1cmUgKGZvciBpbmZvIGZpZWxkIGFib3ZlKSAqLworICBrbXBfaW50MzIgZHNfc2l6ZW9mX3N0cnVjdDsKKyAgb2Zmc2V0X2FuZF9zaXplX3QgZHNfdGlkOyAvLyB0ZWFtIHRocmVhZCBpZAorICBvZmZzZXRfYW5kX3NpemVfdCBkc19ndGlkOyAvLyBnbG9iYWwgdGhyZWFkIGlkCisgIG9mZnNldF9hbmRfc2l6ZV90IGRzX3RocmVhZDsgLy8gbmF0aXZlIHRocmVhZCBpZAorCisgIC8qIHRlYW0gc3RydWN0dXJlIGluZm9ybWF0aW9uICovCisgIGttcF9pbnQzMiB0X3NpemVvZl9zdHJ1Y3Q7CisgIG9mZnNldF9hbmRfc2l6ZV90IHRfbWFzdGVyX3RpZDsgLy8gdGlkIG9mIG1hc3RlciBpbiBwYXJlbnQgdGVhbQorICBvZmZzZXRfYW5kX3NpemVfdCB0X2lkZW50OyAvLyBsb2NhdGlvbiBvZiBwYXJhbGxlbCByZWdpb24KKyAgb2Zmc2V0X2FuZF9zaXplX3QgdF9wYXJlbnQ7IC8vIHBhcmVudCB0ZWFtCisgIG9mZnNldF9hbmRfc2l6ZV90IHRfbnByb2M7IC8vICMgdGVhbSB0aHJlYWRzCisgIG9mZnNldF9hbmRfc2l6ZV90IHRfdGhyZWFkczsgLy8gYXJyYXkgb2YgdGhyZWFkcworICBvZmZzZXRfYW5kX3NpemVfdCB0X3NlcmlhbGl6ZWQ7IC8vICMgbGV2ZWxzIG9mIHNlcmlhbGl6ZWQgdGVhbXMKKyAgb2Zmc2V0X2FuZF9zaXplX3QgdF9pZDsgLy8gdW5pcXVlIHRlYW0gaWQKKyAgb2Zmc2V0X2FuZF9zaXplX3QgdF9wa2ZuOworICBvZmZzZXRfYW5kX3NpemVfdCB0X3Rhc2tfdGVhbTsgLy8gdGFzayB0ZWFtIHN0cnVjdHVyZQorICBvZmZzZXRfYW5kX3NpemVfdCB0X2ltcGxpY2l0X3Rhc2s7IC8vIHRhc2tkYXRhIGZvciB0aGUgdGhyZWFkJ3MgaW1wbGljaXQgdGFzaworI2lmIE9NUF80MF9FTkFCTEVECisgIG9mZnNldF9hbmRfc2l6ZV90IHRfY2FuY2VsX3JlcXVlc3Q7CisjZW5kaWYKKyAgb2Zmc2V0X2FuZF9zaXplX3QgdF9iYXI7CisgIG9mZnNldF9hbmRfc2l6ZV90CisgICAgICB0X2JfbWFzdGVyX2Fycml2ZWQ7IC8vIGluY3JlYXNlZCBieSAxIHdoZW4gbWFzdGVyIGFycml2ZXMgdG8gYSBiYXJyaWVyCisgIG9mZnNldF9hbmRfc2l6ZV90CisgICAgICB0X2JfdGVhbV9hcnJpdmVkOyAvLyBpbmNyZWFzZWQgYnkgb25lIHdoZW4gYWxsIHRoZSB0aHJlYWRzIGFycml2ZWQKKworICAvKiByb290IHN0cnVjdHVyZSBpbmZvcm1hdGlvbiAqLworICBrbXBfaW50MzIgcl9zaXplb2Zfc3RydWN0OworICBvZmZzZXRfYW5kX3NpemVfdCByX3Jvb3RfdGVhbTsgLy8gdGVhbSBhdCByb290CisgIG9mZnNldF9hbmRfc2l6ZV90IHJfaG90X3RlYW07IC8vIGhvdCB0ZWFtIGZvciB0aGlzIHJvb3QKKyAgb2Zmc2V0X2FuZF9zaXplX3Qgcl91YmVyX3RocmVhZDsgLy8gcm9vdCB0aHJlYWQKKyAgb2Zmc2V0X2FuZF9zaXplX3Qgcl9yb290X2lkOyAvLyB1bmlxdWUgcm9vdCBpZCAoaWYgYXZhaWxhYmxlKQorCisgIC8qIGlkZW50IHN0cnVjdHVyZSBpbmZvcm1hdGlvbiAqLworICBrbXBfaW50MzIgaWRfc2l6ZW9mX3N0cnVjdDsKKyAgb2Zmc2V0X2FuZF9zaXplX3QKKyAgICAgIGlkX3Bzb3VyY2U7IC8qIGFkZHJlc3Mgb2Ygc3RyaW5nICI7ZmlsZTtmdW5jO2xpbmUxO2xpbmUyOzsiLiAqLworICBvZmZzZXRfYW5kX3NpemVfdCBpZF9mbGFnczsKKworICAvKiBsb2NrIHN0cnVjdHVyZSBpbmZvcm1hdGlvbiAqLworICBrbXBfaW50MzIgbGtfc2l6ZW9mX3N0cnVjdDsKKyAgb2Zmc2V0X2FuZF9zaXplX3QgbGtfaW5pdGlhbGl6ZWQ7CisgIG9mZnNldF9hbmRfc2l6ZV90IGxrX2xvY2F0aW9uOworICBvZmZzZXRfYW5kX3NpemVfdCBsa190YWlsX2lkOworICBvZmZzZXRfYW5kX3NpemVfdCBsa19oZWFkX2lkOworICBvZmZzZXRfYW5kX3NpemVfdCBsa19uZXh0X3RpY2tldDsKKyAgb2Zmc2V0X2FuZF9zaXplX3QgbGtfbm93X3NlcnZpbmc7CisgIG9mZnNldF9hbmRfc2l6ZV90IGxrX293bmVyX2lkOworICBvZmZzZXRfYW5kX3NpemVfdCBsa19kZXB0aF9sb2NrZWQ7CisgIG9mZnNldF9hbmRfc2l6ZV90IGxrX2xvY2tfZmxhZ3M7CisKKyNpZiAhS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgLyogbG9ja190YWJsZV90ICovCisgIGttcF9pbnQzMiBsdF9zaXplX29mX3N0cnVjdDsgLyogU2l6ZSBhbmQgbGF5b3V0IG9mIGttcF9sb2NrX3RhYmxlX3QuICovCisgIG9mZnNldF9hbmRfc2l6ZV90IGx0X3VzZWQ7CisgIG9mZnNldF9hbmRfc2l6ZV90IGx0X2FsbG9jYXRlZDsKKyAgb2Zmc2V0X2FuZF9zaXplX3QgbHRfdGFibGU7CisjZW5kaWYKKworICAvKiB0YXNrX3RlYW1fdCAqLworICBrbXBfaW50MzIgdHRfc2l6ZW9mX3N0cnVjdDsKKyAgb2Zmc2V0X2FuZF9zaXplX3QgdHRfdGhyZWFkc19kYXRhOworICBvZmZzZXRfYW5kX3NpemVfdCB0dF9mb3VuZF90YXNrczsKKyAgb2Zmc2V0X2FuZF9zaXplX3QgdHRfbnByb2M7CisgIG9mZnNldF9hbmRfc2l6ZV90IHR0X3VuZmluaXNoZWRfdGhyZWFkczsKKyAgb2Zmc2V0X2FuZF9zaXplX3QgdHRfYWN0aXZlOworCisgIC8qIGttcF90YXNrZGF0YV90ICovCisgIGttcF9pbnQzMiB0ZF9zaXplb2Zfc3RydWN0OworICBvZmZzZXRfYW5kX3NpemVfdCB0ZF90YXNrX2lkOyAvLyB0YXNrIGlkCisgIG9mZnNldF9hbmRfc2l6ZV90IHRkX2ZsYWdzOyAvLyB0YXNrIGZsYWdzCisgIG9mZnNldF9hbmRfc2l6ZV90IHRkX3RlYW07IC8vIHRlYW0gZm9yIHRoaXMgdGFzaworICBvZmZzZXRfYW5kX3NpemVfdCB0ZF9wYXJlbnQ7IC8vIHBhcmVudCB0YXNrCisgIG9mZnNldF9hbmRfc2l6ZV90IHRkX2xldmVsOyAvLyB0YXNrIHRlc3RpbmcgbGV2ZWwKKyAgb2Zmc2V0X2FuZF9zaXplX3QgdGRfaWRlbnQ7IC8vIHRhc2sgaWRlbnRpZmllcgorICBvZmZzZXRfYW5kX3NpemVfdCB0ZF9hbGxvY2F0ZWRfY2hpbGRfdGFza3M7IC8vIGNoaWxkIHRhc2tzICgrIGN1cnJlbnQgdGFzaykKKyAgLy8gbm90IHlldCBkZWFsbG9jYXRlZAorICBvZmZzZXRfYW5kX3NpemVfdCB0ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzOyAvLyBjaGlsZCB0YXNrcyBub3QgeWV0IGNvbXBsZXRlCisKKyAgLyogVGFza3dhaXQgKi8KKyAgb2Zmc2V0X2FuZF9zaXplX3QgdGRfdGFza3dhaXRfaWRlbnQ7CisgIG9mZnNldF9hbmRfc2l6ZV90IHRkX3Rhc2t3YWl0X2NvdW50ZXI7CisgIG9mZnNldF9hbmRfc2l6ZV90CisgICAgICB0ZF90YXNrd2FpdF90aHJlYWQ7IC8vIGd0aWQgKyAxIG9mIHRocmVhZCBlbmNvdW50ZXJlZCB0YXNrd2FpdAorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgLyogVGFza2dyb3VwICovCisgIG9mZnNldF9hbmRfc2l6ZV90IHRkX3Rhc2tncm91cDsgLy8gcG9pbnRlciB0byB0aGUgY3VycmVudCB0YXNrZ3JvdXAKKyAgb2Zmc2V0X2FuZF9zaXplX3QKKyAgICAgIHRkX3Rhc2tfY291bnQ7IC8vIG51bWJlciBvZiBhbGxvY2F0ZWQgYW5kIG5vdCB5ZXQgY29tcGxldGUgdGFza3MKKyAgb2Zmc2V0X2FuZF9zaXplX3QgdGRfY2FuY2VsOyAvLyByZXF1ZXN0IGZvciBjYW5jZWxsYXRpb24gb2YgdGhpcyB0YXNrZ3JvdXAKKworICAvKiBUYXNrIGRlcGVuZGVuY3kgKi8KKyAgb2Zmc2V0X2FuZF9zaXplX3QKKyAgICAgIHRkX2RlcG5vZGU7IC8vIHBvaW50ZXIgdG8gZ3JhcGggbm9kZSBpZiB0aGUgdGFzayBoYXMgZGVwZW5kZW5jaWVzCisgIG9mZnNldF9hbmRfc2l6ZV90IGRuX25vZGU7CisgIG9mZnNldF9hbmRfc2l6ZV90IGRuX25leHQ7CisgIG9mZnNldF9hbmRfc2l6ZV90IGRuX3N1Y2Nlc3NvcnM7CisgIG9mZnNldF9hbmRfc2l6ZV90IGRuX3Rhc2s7CisgIG9mZnNldF9hbmRfc2l6ZV90IGRuX25wcmVkZWNlc3NvcnM7CisgIG9mZnNldF9hbmRfc2l6ZV90IGRuX25yZWZzOworI2VuZGlmCisgIG9mZnNldF9hbmRfc2l6ZV90IGRuX3JvdXRpbmU7CisKKyAgLyoga21wX3RocmVhZF9kYXRhX3QgKi8KKyAga21wX2ludDMyIGhkX3NpemVvZl9zdHJ1Y3Q7CisgIG9mZnNldF9hbmRfc2l6ZV90IGhkX2RlcXVlOworICBvZmZzZXRfYW5kX3NpemVfdCBoZF9kZXF1ZV9zaXplOworICBvZmZzZXRfYW5kX3NpemVfdCBoZF9kZXF1ZV9oZWFkOworICBvZmZzZXRfYW5kX3NpemVfdCBoZF9kZXF1ZV90YWlsOworICBvZmZzZXRfYW5kX3NpemVfdCBoZF9kZXF1ZV9udGFza3M7CisgIG9mZnNldF9hbmRfc2l6ZV90IGhkX2RlcXVlX2xhc3Rfc3RvbGVuOworCisgIC8vIFRoZSBsYXN0IGZpZWxkIG9mIHN0YWJsZSB2ZXJzaW9uLgorICBrbXBfdWludDY0IGxhc3RfZmllbGQ7CisKK30ga21wX29tcF9zdHJ1Y3RfaW5mb190OworCisjZW5kaWYgLyogVVNFX0RFQlVHR0VSICovCisKKy8qIGVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfb3MuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9vcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YWUxNTIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfb3MuaApAQCAtMCwwICsxLDg2NyBAQAorLyoKKyAqIGttcF9vcy5oIC0tIEtQVFMgcnVudGltZSBoZWFkZXIgZmlsZS4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfT1NfSAorI2RlZmluZSBLTVBfT1NfSAorCisjaW5jbHVkZSAia21wX2NvbmZpZy5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjZGVmaW5lIEtNUF9GVE5fUExBSU4gMQorI2RlZmluZSBLTVBfRlROX0FQUEVORCAyCisjZGVmaW5lIEtNUF9GVE5fVVBQRVIgMworLyoKKyNkZWZpbmUgS01QX0ZUTl9QUkVQRU5EIDQKKyNkZWZpbmUgS01QX0ZUTl9VQVBQRU5EIDUKKyovCisKKyNkZWZpbmUgS01QX1BUUl9TS0lQIChzaXplb2Yodm9pZCAqKSkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29tcGlsZXIgdmFyaWF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBLTVBfT0ZGIDAKKyNkZWZpbmUgS01QX09OIDEKKworI2RlZmluZSBLTVBfTUVNX0NPTlNfVk9MQVRJTEUgMAorI2RlZmluZSBLTVBfTUVNX0NPTlNfRkVOQ0UgMQorCisjaWZuZGVmIEtNUF9NRU1fQ09OU19NT0RFTAorI2RlZmluZSBLTVBfTUVNX0NPTlNfTU9ERUwgS01QX01FTV9DT05TX1ZPTEFUSUxFCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb21waWxlciByZWNvZ25pdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIEtNUF9DT01QSUxFUl9JQ0MgMAorI2RlZmluZSBLTVBfQ09NUElMRVJfR0NDIDAKKyNkZWZpbmUgS01QX0NPTVBJTEVSX0NMQU5HIDAKKyNkZWZpbmUgS01QX0NPTVBJTEVSX01TVkMgMAorCisjaWYgZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKQorI3VuZGVmIEtNUF9DT01QSUxFUl9JQ0MKKyNkZWZpbmUgS01QX0NPTVBJTEVSX0lDQyAxCisjZWxpZiBkZWZpbmVkKF9fY2xhbmdfXykKKyN1bmRlZiBLTVBfQ09NUElMRVJfQ0xBTkcKKyNkZWZpbmUgS01QX0NPTVBJTEVSX0NMQU5HIDEKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pCisjdW5kZWYgS01QX0NPTVBJTEVSX0dDQworI2RlZmluZSBLTVBfQ09NUElMRVJfR0NDIDEKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisjdW5kZWYgS01QX0NPTVBJTEVSX01TVkMKKyNkZWZpbmUgS01QX0NPTVBJTEVSX01TVkMgMQorI2Vsc2UKKyNlcnJvciBVbmtub3duIGNvbXBpbGVyCisjZW5kaWYKKworI2lmIChLTVBfT1NfTElOVVggfHwgS01QX09TX1dJTkRPV1MpICYmICFLTVBfT1NfQ05LICYmICFLTVBfQVJDSF9QUEM2NAorI2RlZmluZSBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEIDEKKyNpZiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODZfNjQKKyNkZWZpbmUgS01QX0dST1VQX0FGRklOSVRZIDEKKyNlbHNlCisjZGVmaW5lIEtNUF9HUk9VUF9BRkZJTklUWSAwCisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgMAorI2RlZmluZSBLTVBfR1JPVVBfQUZGSU5JVFkgMAorI2VuZGlmCisKKy8qIENoZWNrIGZvciBxdWFkLXByZWNpc2lvbiBleHRlbnNpb24uICovCisjZGVmaW5lIEtNUF9IQVZFX1FVQUQgMAorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyNpZiBLTVBfQ09NUElMRVJfSUNDCisvKiBfUXVhZCBpcyBhbHJlYWR5IGRlZmluZWQgZm9yIGljYyAqLworI3VuZGVmIEtNUF9IQVZFX1FVQUQKKyNkZWZpbmUgS01QX0hBVkVfUVVBRCAxCisjZWxpZiBLTVBfQ09NUElMRVJfQ0xBTkcKKy8qIENsYW5nIGRvZXNuJ3Qgc3VwcG9ydCBhIHNvZnR3YXJlLWltcGxlbWVudGVkCisgICAxMjgtYml0IGV4dGVuZGVkIHByZWNpc2lvbiB0eXBlIHlldCAqLwordHlwZWRlZiBsb25nIGRvdWJsZSBfUXVhZDsKKyNlbGlmIEtNUF9DT01QSUxFUl9HQ0MKK3R5cGVkZWYgX19mbG9hdDEyOCBfUXVhZDsKKyN1bmRlZiBLTVBfSEFWRV9RVUFECisjZGVmaW5lIEtNUF9IQVZFX1FVQUQgMQorI2VsaWYgS01QX0NPTVBJTEVSX01TVkMKK3R5cGVkZWYgbG9uZyBkb3VibGUgX1F1YWQ7CisjZW5kaWYKKyNlbHNlCisjaWYgX19MREJMX01BWF9FWFBfXyA+PSAxNjM4NCAmJiBLTVBfQ09NUElMRVJfR0NDCit0eXBlZGVmIGxvbmcgZG91YmxlIF9RdWFkOworI3VuZGVmIEtNUF9IQVZFX1FVQUQKKyNkZWZpbmUgS01QX0hBVkVfUVVBRCAxCisjZW5kaWYKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyNpZiBLTVBfT1NfV0lORE9XUwordHlwZWRlZiBjaGFyIGttcF9pbnQ4OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIGttcF91aW50ODsKK3R5cGVkZWYgc2hvcnQga21wX2ludDE2OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBrbXBfdWludDE2OwordHlwZWRlZiBpbnQga21wX2ludDMyOwordHlwZWRlZiB1bnNpZ25lZCBpbnQga21wX3VpbnQzMjsKKyNkZWZpbmUgS01QX0lOVDMyX1NQRUMgImQiCisjZGVmaW5lIEtNUF9VSU5UMzJfU1BFQyAidSIKKyNpZm5kZWYgS01QX1NUUlVDVDY0Cit0eXBlZGVmIF9faW50NjQga21wX2ludDY0OwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IGttcF91aW50NjQ7CisjZGVmaW5lIEtNUF9JTlQ2NF9TUEVDICJJNjRkIgorI2RlZmluZSBLTVBfVUlOVDY0X1NQRUMgIkk2NHUiCisjZWxzZQorc3RydWN0IGttcF9zdHJ1Y3Q2NCB7CisgIGttcF9pbnQzMiBhLCBiOworfTsKK3R5cGVkZWYgc3RydWN0IGttcF9zdHJ1Y3Q2NCBrbXBfaW50NjQ7Cit0eXBlZGVmIHN0cnVjdCBrbXBfc3RydWN0NjQga21wX3VpbnQ2NDsKKy8qIE5vdCBzdXJlIHdoYXQgdG8gdXNlIGZvciBLTVBfW1VdSU5UNjRfU1BFQyBoZXJlICovCisjZW5kaWYKKyNpZiBLTVBfQVJDSF9YODZfNjQKKyNkZWZpbmUgS01QX0lOVFBUUiAxCit0eXBlZGVmIF9faW50NjQga21wX2ludHB0cl90OwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IGttcF91aW50cHRyX3Q7CisjZGVmaW5lIEtNUF9JTlRQVFJfU1BFQyAiSTY0ZCIKKyNkZWZpbmUgS01QX1VJTlRQVFJfU1BFQyAiSTY0dSIKKyNlbmRpZgorI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisKKyNpZiBLTVBfT1NfVU5JWAordHlwZWRlZiBjaGFyIGttcF9pbnQ4OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIGttcF91aW50ODsKK3R5cGVkZWYgc2hvcnQga21wX2ludDE2OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBrbXBfdWludDE2OwordHlwZWRlZiBpbnQga21wX2ludDMyOwordHlwZWRlZiB1bnNpZ25lZCBpbnQga21wX3VpbnQzMjsKK3R5cGVkZWYgbG9uZyBsb25nIGttcF9pbnQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGttcF91aW50NjQ7CisjZGVmaW5lIEtNUF9JTlQzMl9TUEVDICJkIgorI2RlZmluZSBLTVBfVUlOVDMyX1NQRUMgInUiCisjZGVmaW5lIEtNUF9JTlQ2NF9TUEVDICJsbGQiCisjZGVmaW5lIEtNUF9VSU5UNjRfU1BFQyAibGx1IgorI2VuZGlmIC8qIEtNUF9PU19VTklYICovCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX01JUFMKKyNkZWZpbmUgS01QX1NJWkVfVF9TUEVDIEtNUF9VSU5UMzJfU1BFQworI2VsaWYgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX1BQQzY0IHx8IEtNUF9BUkNIX0FBUkNINjQgfHwgS01QX0FSQ0hfTUlQUzY0CisjZGVmaW5lIEtNUF9TSVpFX1RfU1BFQyBLTVBfVUlOVDY0X1NQRUMKKyNlbHNlCisjZXJyb3IgIkNhbid0IGRldGVybWluZSBzaXplX3QgcHJpbnRmIGZvcm1hdCBzcGVjaWZpZXIuIgorI2VuZGlmCisKKyNpZiBLTVBfQVJDSF9YODYKKyNkZWZpbmUgS01QX1NJWkVfVF9NQVggKDB4RkZGRkZGRkYpCisjZWxzZQorI2RlZmluZSBLTVBfU0laRV9UX01BWCAoMHhGRkZGRkZGRkZGRkZGRkZGKQorI2VuZGlmCisKK3R5cGVkZWYgc2l6ZV90IGttcF9zaXplX3Q7Cit0eXBlZGVmIGZsb2F0IGttcF9yZWFsMzI7Cit0eXBlZGVmIGRvdWJsZSBrbXBfcmVhbDY0OworCisjaWZuZGVmIEtNUF9JTlRQVFIKKyNkZWZpbmUgS01QX0lOVFBUUiAxCit0eXBlZGVmIGxvbmcga21wX2ludHB0cl90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGttcF91aW50cHRyX3Q7CisjZGVmaW5lIEtNUF9JTlRQVFJfU1BFQyAibGQiCisjZGVmaW5lIEtNUF9VSU5UUFRSX1NQRUMgImx1IgorI2VuZGlmCisKKyNpZmRlZiBCVUlMRF9JOAordHlwZWRlZiBrbXBfaW50NjQga21wX2ludDsKK3R5cGVkZWYga21wX3VpbnQ2NCBrbXBfdWludDsKKyNlbHNlCit0eXBlZGVmIGttcF9pbnQzMiBrbXBfaW50OwordHlwZWRlZiBrbXBfdWludDMyIGttcF91aW50OworI2VuZGlmIC8qIEJVSUxEX0k4ICovCisjZGVmaW5lIEtNUF9JTlRfTUFYICgoa21wX2ludDMyKTB4N0ZGRkZGRkYpCisjZGVmaW5lIEtNUF9JTlRfTUlOICgoa21wX2ludDMyKTB4ODAwMDAwMDApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworLy8gbWFjcm9zIHRvIGNhc3Qgb3V0IHF1YWxpZmllcnMgYW5kIHRvIHJlLWludGVycHJldCB0eXBlcworI2RlZmluZSBDQ0FTVCh0eXBlLCB2YXIpIGNvbnN0X2Nhc3Q8dHlwZT4odmFyKQorI2RlZmluZSBSQ0FTVCh0eXBlLCB2YXIpIHJlaW50ZXJwcmV0X2Nhc3Q8dHlwZT4odmFyKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0ZW1wbGF0ZSBmb3IgZGVidWcgcHJpbnRzIHNwZWNpZmljYXRpb24gKCBkLCB1LCBsbGQsIGxsdSApLCBhbmQgdG8gb2J0YWluCisvLyBzaWduZWQvdW5zaWduZWQgZmxhdm9ycyBvZiBhIHR5cGUKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgdHJhaXRzX3Qge307CisvLyBpbnQKK3RlbXBsYXRlIDw+IHN0cnVjdCB0cmFpdHNfdDxzaWduZWQgaW50PiB7CisgIHR5cGVkZWYgc2lnbmVkIGludCBzaWduZWRfdDsKKyAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgdW5zaWduZWRfdDsKKyAgdHlwZWRlZiBkb3VibGUgZmxvYXRpbmdfdDsKKyAgc3RhdGljIGNoYXIgY29uc3QgKnNwZWM7CisgIHN0YXRpYyBjb25zdCBzaWduZWRfdCBtYXhfdmFsdWUgPSAweDdmZmZmZmZmOworICBzdGF0aWMgY29uc3Qgc2lnbmVkX3QgbWluX3ZhbHVlID0gMHg4MDAwMDAwMDsKKyAgc3RhdGljIGNvbnN0IGludCB0eXBlX3NpemUgPSBzaXplb2Yoc2lnbmVkX3QpOworfTsKKy8vIHVuc2lnbmVkIGludAordGVtcGxhdGUgPD4gc3RydWN0IHRyYWl0c190PHVuc2lnbmVkIGludD4geworICB0eXBlZGVmIHNpZ25lZCBpbnQgc2lnbmVkX3Q7CisgIHR5cGVkZWYgdW5zaWduZWQgaW50IHVuc2lnbmVkX3Q7CisgIHR5cGVkZWYgZG91YmxlIGZsb2F0aW5nX3Q7CisgIHN0YXRpYyBjaGFyIGNvbnN0ICpzcGVjOworICBzdGF0aWMgY29uc3QgdW5zaWduZWRfdCBtYXhfdmFsdWUgPSAweGZmZmZmZmZmOworICBzdGF0aWMgY29uc3QgdW5zaWduZWRfdCBtaW5fdmFsdWUgPSAweDAwMDAwMDAwOworICBzdGF0aWMgY29uc3QgaW50IHR5cGVfc2l6ZSA9IHNpemVvZih1bnNpZ25lZF90KTsKK307CisvLyBsb25nIGxvbmcKK3RlbXBsYXRlIDw+IHN0cnVjdCB0cmFpdHNfdDxzaWduZWQgbG9uZyBsb25nPiB7CisgIHR5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyBzaWduZWRfdDsKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdW5zaWduZWRfdDsKKyAgdHlwZWRlZiBsb25nIGRvdWJsZSBmbG9hdGluZ190OworICBzdGF0aWMgY2hhciBjb25zdCAqc3BlYzsKKyAgc3RhdGljIGNvbnN0IHNpZ25lZF90IG1heF92YWx1ZSA9IDB4N2ZmZmZmZmZmZmZmZmZmZkxMOworICBzdGF0aWMgY29uc3Qgc2lnbmVkX3QgbWluX3ZhbHVlID0gMHg4MDAwMDAwMDAwMDAwMDAwTEw7CisgIHN0YXRpYyBjb25zdCBpbnQgdHlwZV9zaXplID0gc2l6ZW9mKHNpZ25lZF90KTsKK307CisvLyB1bnNpZ25lZCBsb25nIGxvbmcKK3RlbXBsYXRlIDw+IHN0cnVjdCB0cmFpdHNfdDx1bnNpZ25lZCBsb25nIGxvbmc+IHsKKyAgdHlwZWRlZiBzaWduZWQgbG9uZyBsb25nIHNpZ25lZF90OworICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1bnNpZ25lZF90OworICB0eXBlZGVmIGxvbmcgZG91YmxlIGZsb2F0aW5nX3Q7CisgIHN0YXRpYyBjaGFyIGNvbnN0ICpzcGVjOworICBzdGF0aWMgY29uc3QgdW5zaWduZWRfdCBtYXhfdmFsdWUgPSAweGZmZmZmZmZmZmZmZmZmZmZMTDsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkX3QgbWluX3ZhbHVlID0gMHgwMDAwMDAwMDAwMDAwMDAwTEw7CisgIHN0YXRpYyBjb25zdCBpbnQgdHlwZV9zaXplID0gc2l6ZW9mKHVuc2lnbmVkX3QpOworfTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2Vsc2UKKyNkZWZpbmUgQ0NBU1QodHlwZSwgdmFyKSAodHlwZSkodmFyKQorI2RlZmluZSBSQ0FTVCh0eXBlLCB2YXIpICh0eXBlKSh2YXIpCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2RlZmluZSBLTVBfRVhQT1JUIGV4dGVybiAvKiBleHBvcnQgZGVjbGFyYXRpb24gaW4gZ3VpZGUgbGlicmFyaWVzICovCisKKyNpZiBfX0dOVUNfXyA+PSA0CisjZGVmaW5lIF9fZm9yY2VpbmxpbmUgX19pbmxpbmUKKyNlbmRpZgorCisjaWYgS01QX09TX1dJTkRPV1MKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK3N0YXRpYyBpbmxpbmUgaW50IEtNUF9HRVRfUEFHRV9TSVpFKHZvaWQpIHsKKyAgICBTWVNURU1fSU5GTyBzaTsKKyAgICBHZXRTeXN0ZW1JbmZvKCZzaSk7CisgICAgcmV0dXJuIHNpLmR3UGFnZVNpemU7Cit9CisjZWxzZQorI2RlZmluZSBLTVBfR0VUX1BBR0VfU0laRSgpIGdldHBhZ2VzaXplKCkKKyNlbmRpZgorCisjZGVmaW5lIFBBR0VfQUxJR05FRChfYWRkcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoISgoc2l6ZV90KV9hZGRyICYgKHNpemVfdCkoS01QX0dFVF9QQUdFX1NJWkUoKSAtIDEpKSkKKyNkZWZpbmUgQUxJR05fVE9fUEFHRSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICh2b2lkICopKCgoc2l6ZV90KSh4KSkgJiB+KChzaXplX3QpKEtNUF9HRVRfUEFHRV9TSVpFKCkgLSAxKSkpCisKKy8qIC0tLS0tLS0tLS0gU3VwcG9ydCBmb3IgY2FjaGUgYWxpZ25tZW50LCBwYWRkaW5nLCBldGMuIC0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNkZWZpbmUgSU5URVJOT0RFX0NBQ0hFX0xJTkUgNDA5NiAvKiBmb3IgbXVsdGktbm9kZSBzeXN0ZW1zICovCisKKy8qIERlZmluZSB0aGUgZGVmYXVsdCBzaXplIG9mIHRoZSBjYWNoZSBsaW5lICovCisjaWZuZGVmIENBQ0hFX0xJTkUKKyNkZWZpbmUgQ0FDSEVfTElORSAxMjggLyogY2FjaGUgbGluZSBzaXplIGluIGJ5dGVzICovCisjZWxzZQorI2lmIChDQUNIRV9MSU5FIDwgNjQpICYmICFkZWZpbmVkKEtNUF9PU19EQVJXSU4pCisvLyAyMDA2LTAyLTEzOiBUaGlzIHByb2R1Y2VzIHRvbyBtYW55IHdhcm5pbmdzIG9uIE9TIFgqLiBEaXNhYmxlIGZvciBub3cKKyN3YXJuaW5nIENBQ0hFX0xJTkUgaXMgdG9vIHNtYWxsLgorI2VuZGlmCisjZW5kaWYgLyogQ0FDSEVfTElORSAqLworCisjZGVmaW5lIEtNUF9DQUNIRV9QUkVGRVRDSChBRERSKSAvKiBub3RoaW5nICovCisKKy8qIFRlbXBvcmFyeSBub3RlOiBpZiBwZXJmb3JtYW5jZSB0ZXN0aW5nIG9mIHRoaXMgcGFzc2VzLCB3ZSBjYW4gcmVtb3ZlCisgICBhbGwgcmVmZXJlbmNlcyB0byBLTVBfRE9fQUxJR04gYW5kIHJlcGxhY2Ugd2l0aCBLTVBfQUxJR04uICAqLworI2lmIEtNUF9PU19VTklYICYmIGRlZmluZWQoX19HTlVDX18pCisjZGVmaW5lIEtNUF9ET19BTElHTihieXRlcykgX19hdHRyaWJ1dGVfXygoYWxpZ25lZChieXRlcykpKQorI2RlZmluZSBLTVBfQUxJR05fQ0FDSEUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZChDQUNIRV9MSU5FKSkpCisjZGVmaW5lIEtNUF9BTElHTl9DQUNIRV9JTlRFUk5PREUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZChJTlRFUk5PREVfQ0FDSEVfTElORSkpKQorI2RlZmluZSBLTVBfQUxJR04oYnl0ZXMpIF9fYXR0cmlidXRlX18oKGFsaWduZWQoYnl0ZXMpKSkKKyNlbHNlCisjZGVmaW5lIEtNUF9ET19BTElHTihieXRlcykgX19kZWNsc3BlYyhhbGlnbihieXRlcykpCisjZGVmaW5lIEtNUF9BTElHTl9DQUNIRSBfX2RlY2xzcGVjKGFsaWduKENBQ0hFX0xJTkUpKQorI2RlZmluZSBLTVBfQUxJR05fQ0FDSEVfSU5URVJOT0RFIF9fZGVjbHNwZWMoYWxpZ24oSU5URVJOT0RFX0NBQ0hFX0xJTkUpKQorI2RlZmluZSBLTVBfQUxJR04oYnl0ZXMpIF9fZGVjbHNwZWMoYWxpZ24oYnl0ZXMpKQorI2VuZGlmCisKKy8qIEdlbmVyYWwgcHVycG9zZSBmZW5jZSB0eXBlcyBmb3IgbWVtb3J5IG9wZXJhdGlvbnMgKi8KK2VudW0ga21wX21lbV9mZW5jZV90eXBlIHsKKyAga21wX25vX2ZlbmNlLCAvKiBObyBtZW1vcnkgZmVuY2UgKi8KKyAga21wX2FjcXVpcmVfZmVuY2UsIC8qIEFjcXVpcmUgKHJlYWQpIG1lbW9yeSBmZW5jZSAqLworICBrbXBfcmVsZWFzZV9mZW5jZSwgLyogUmVsZWFzZSAod3JpdGUpIG1lbW9yeSBmZW5jZSAqLworICBrbXBfZnVsbF9mZW5jZSAvKiBGdWxsIChyZWFkK3dyaXRlKSBtZW1vcnkgZmVuY2UgKi8KK307CisKKy8vIFN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzCisKKyNpZiBLTVBfQVNNX0lOVFJJTlMgJiYgS01QX09TX1dJTkRPV1MKKworI3ByYWdtYSBpbnRyaW5zaWMoSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCkKKyNwcmFnbWEgaW50cmluc2ljKEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlKQorI3ByYWdtYSBpbnRyaW5zaWMoSW50ZXJsb2NrZWRFeGNoYW5nZSkKKyNwcmFnbWEgaW50cmluc2ljKEludGVybG9ja2VkRXhjaGFuZ2U2NCkKKworLy8gVXNpbmcgSW50ZXJsb2NrZWRJbmNyZW1lbnQgLyBJbnRlcmxvY2tlZERlY3JlbWVudCBjYXVzZXMgYSBsaWJyYXJ5IGxvYWRpbmcKKy8vIG9yZGVyaW5nIHByb2JsZW0sIHNvIHdlIHVzZSBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkIGluc3RlYWQuCisjZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DMzIocCkgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCgodm9sYXRpbGUgbG9uZyAqKShwKSwgMSkKKyNkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkNfQUNRMzIocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEludGVybG9ja2VkRXhjaGFuZ2VBZGQoKHZvbGF0aWxlIGxvbmcgKikocCksIDEpCisjZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF8zMihwKSBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKCh2b2xhdGlsZSBsb25nICopKHApLCA0KQorI2RlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfQUNRMzIocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCgodm9sYXRpbGUgbG9uZyAqKShwKSwgNCkKKyNkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUMzMihwKSBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKCh2b2xhdGlsZSBsb25nICopKHApLCAtMSkKKyNkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUNfQUNRMzIocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEludGVybG9ja2VkRXhjaGFuZ2VBZGQoKHZvbGF0aWxlIGxvbmcgKikocCksIC0xKQorI2RlZmluZSBLTVBfVEVTVF9USEVOX0FERDMyKHAsIHYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCgodm9sYXRpbGUgbG9uZyAqKShwKSwgKHYpKQorCisjZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQzMihwLCBjdiwgc3YpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZSgodm9sYXRpbGUgbG9uZyAqKShwKSwgKGxvbmcpKHN2KSwgKGxvbmcpKGN2KSkKKworI2RlZmluZSBLTVBfWENIR19GSVhFRDMyKHAsIHYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSW50ZXJsb2NrZWRFeGNoYW5nZSgodm9sYXRpbGUgbG9uZyAqKShwKSwgKGxvbmcpKHYpKQorI2RlZmluZSBLTVBfWENIR19GSVhFRDY0KHAsIHYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSW50ZXJsb2NrZWRFeGNoYW5nZTY0KCh2b2xhdGlsZSBrbXBfaW50NjQgKikocCksIChrbXBfaW50NjQpKHYpKQorCitpbmxpbmUga21wX3JlYWwzMiBLTVBfWENIR19SRUFMMzIodm9sYXRpbGUga21wX3JlYWwzMiAqcCwga21wX3JlYWwzMiB2KSB7CisgIGttcF9pbnQzMiB0bXAgPSBJbnRlcmxvY2tlZEV4Y2hhbmdlKCh2b2xhdGlsZSBsb25nICopcCwgKihsb25nICopJnYpOworICByZXR1cm4gKihrbXBfcmVhbDMyICopJnRtcDsKK30KKworLy8gUm91dGluZXMgdGhhdCB3ZSBzdGlsbCBuZWVkIHRvIGltcGxlbWVudCBpbiBhc3NlbWJseS4KK2V4dGVybiBrbXBfaW50OCBfX2ttcF90ZXN0X3RoZW5fYWRkOCh2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggdik7CitleHRlcm4ga21wX2ludDggX19rbXBfdGVzdF90aGVuX29yOCh2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggdik7CitleHRlcm4ga21wX2ludDggX19rbXBfdGVzdF90aGVuX2FuZDgodm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IHYpOworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF90ZXN0X3RoZW5fYWRkMzIodm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgdik7CitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF90ZXN0X3RoZW5fb3IzMih2b2xhdGlsZSBrbXBfdWludDMyICpwLCBrbXBfdWludDMyIHYpOworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfdGVzdF90aGVuX2FuZDMyKHZvbGF0aWxlIGttcF91aW50MzIgKnAsIGttcF91aW50MzIgdik7CitleHRlcm4ga21wX2ludDY0IF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCh2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCB2KTsKK2V4dGVybiBrbXBfdWludDY0IF9fa21wX3Rlc3RfdGhlbl9vcjY0KHZvbGF0aWxlIGttcF91aW50NjQgKnAsIGttcF91aW50NjQgdik7CitleHRlcm4ga21wX3VpbnQ2NCBfX2ttcF90ZXN0X3RoZW5fYW5kNjQodm9sYXRpbGUga21wX3VpbnQ2NCAqcCwga21wX3VpbnQ2NCB2KTsKKworZXh0ZXJuIGttcF9pbnQ4IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCh2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ4IHN2KTsKK2V4dGVybiBrbXBfaW50MTYgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNih2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiBjdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MTYgc3YpOworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBzdik7CitleHRlcm4ga21wX2ludDMyIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQodm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgY3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IHN2KTsKK2V4dGVybiBrbXBfaW50OCBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4KHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBjdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ4IHN2KTsKK2V4dGVybiBrbXBfaW50MTYgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYodm9sYXRpbGUga21wX2ludDE2ICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdik7CitleHRlcm4ga21wX2ludDMyIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyKHZvbGF0aWxlIGttcF9pbnQzMiAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YpOworZXh0ZXJuIGttcF9pbnQ2NCBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NCh2b2xhdGlsZSBrbXBfaW50NjQgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2KTsKKworZXh0ZXJuIGttcF9pbnQ4IF9fa21wX3hjaGdfZml4ZWQ4KHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCB2KTsKK2V4dGVybiBrbXBfaW50MTYgX19rbXBfeGNoZ19maXhlZDE2KHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IHYpOworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF94Y2hnX2ZpeGVkMzIodm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgdik7CitleHRlcm4ga21wX2ludDY0IF9fa21wX3hjaGdfZml4ZWQ2NCh2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCB2KTsKK2V4dGVybiBrbXBfcmVhbDMyIF9fa21wX3hjaGdfcmVhbDMyKHZvbGF0aWxlIGttcF9yZWFsMzIgKnAsIGttcF9yZWFsMzIgdik7CitleHRlcm4ga21wX3JlYWw2NCBfX2ttcF94Y2hnX3JlYWw2NCh2b2xhdGlsZSBrbXBfcmVhbDY0ICpwLCBrbXBfcmVhbDY0IHYpOworCisvLyNkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkMzMihwKSBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoKHApLCAxKQorLy8jZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DX0FDUTMyKHApIF9fa21wX3Rlc3RfdGhlbl9hZGQzMigocCksIDEpCisjZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DNjQocCkgX19rbXBfdGVzdF90aGVuX2FkZDY0KChwKSwgMUxMKQorI2RlZmluZSBLTVBfVEVTVF9USEVOX0lOQ19BQ1E2NChwKSBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoKHApLCAxTEwpCisvLyNkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0XzMyKHApIF9fa21wX3Rlc3RfdGhlbl9hZGQzMigocCksIDQpCisvLyNkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0X0FDUTMyKHApIF9fa21wX3Rlc3RfdGhlbl9hZGQzMigocCksIDQpCisjZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF82NChwKSBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoKHApLCA0TEwpCisjZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF9BQ1E2NChwKSBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoKHApLCA0TEwpCisvLyNkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUMzMihwKSBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoKHApLCAtMSkKKy8vI2RlZmluZSBLTVBfVEVTVF9USEVOX0RFQ19BQ1EzMihwKSBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoKHApLCAtMSkKKyNkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUM2NChwKSBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoKHApLCAtMUxMKQorI2RlZmluZSBLTVBfVEVTVF9USEVOX0RFQ19BQ1E2NChwKSBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoKHApLCAtMUxMKQorLy8jZGVmaW5lIEtNUF9URVNUX1RIRU5fQUREMzIocCwgdikgX19rbXBfdGVzdF90aGVuX2FkZDMyKChwKSwgKHYpKQorI2RlZmluZSBLTVBfVEVTVF9USEVOX0FERDgocCwgdikgX19rbXBfdGVzdF90aGVuX2FkZDgoKHApLCAodikpCisjZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENjQocCwgdikgX19rbXBfdGVzdF90aGVuX2FkZDY0KChwKSwgKHYpKQorCisjZGVmaW5lIEtNUF9URVNUX1RIRU5fT1I4KHAsIHYpIF9fa21wX3Rlc3RfdGhlbl9vcjgoKHApLCAodikpCisjZGVmaW5lIEtNUF9URVNUX1RIRU5fQU5EOChwLCB2KSBfX2ttcF90ZXN0X3RoZW5fYW5kOCgocCksICh2KSkKKyNkZWZpbmUgS01QX1RFU1RfVEhFTl9PUjMyKHAsIHYpIF9fa21wX3Rlc3RfdGhlbl9vcjMyKChwKSwgKHYpKQorI2RlZmluZSBLTVBfVEVTVF9USEVOX0FORDMyKHAsIHYpIF9fa21wX3Rlc3RfdGhlbl9hbmQzMigocCksICh2KSkKKyNkZWZpbmUgS01QX1RFU1RfVEhFTl9PUjY0KHAsIHYpIF9fa21wX3Rlc3RfdGhlbl9vcjY0KChwKSwgKHYpKQorI2RlZmluZSBLTVBfVEVTVF9USEVOX0FORDY0KHAsIHYpIF9fa21wX3Rlc3RfdGhlbl9hbmQ2NCgocCksICh2KSkKKworI2RlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNROChwLCBjdiwgc3YpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4KChwKSwgKGN2KSwgKHN2KSkKKyNkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDgocCwgY3YsIHN2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCgocCksIChjdiksIChzdikpCisjZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1ExNihwLCBjdiwgc3YpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2KChwKSwgKGN2KSwgKHN2KSkKKyNkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDE2KHAsIGN2LCBzdikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYoKHApLCAoY3YpLCAoc3YpKQorI2RlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIocCwgY3YsIHN2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMigodm9sYXRpbGUga21wX2ludDMyICopKHApLCAoa21wX2ludDMyKShjdiksICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGttcF9pbnQzMikoc3YpKQorI2RlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMzIocCwgY3YsIHN2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMigodm9sYXRpbGUga21wX2ludDMyICopKHApLCAoa21wX2ludDMyKShjdiksICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGttcF9pbnQzMikoc3YpKQorI2RlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRNjQocCwgY3YsIHN2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCgodm9sYXRpbGUga21wX2ludDY0ICopKHApLCAoa21wX2ludDY0KShjdiksICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGttcF9pbnQ2NCkoc3YpKQorI2RlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMNjQocCwgY3YsIHN2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCgodm9sYXRpbGUga21wX2ludDY0ICopKHApLCAoa21wX2ludDY0KShjdiksICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGttcF9pbnQ2NCkoc3YpKQorCisjaWYgS01QX0FSQ0hfWDg2CisjZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9QVFIocCwgY3YsIHN2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKCh2b2xhdGlsZSBrbXBfaW50MzIgKikocCksIChrbXBfaW50MzIpKGN2KSwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa21wX2ludDMyKShzdikpCisjZWxzZSAvKiA2NCBiaXQgcG9pbnRlcnMgKi8KKyNkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1BUUihwLCBjdiwgc3YpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoKHZvbGF0aWxlIGttcF9pbnQ2NCAqKShwKSwgKGttcF9pbnQ2NCkoY3YpLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrbXBfaW50NjQpKHN2KSkKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgKi8KKworI2RlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUOChwLCBjdiwgc3YpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCgocCksIChjdiksIChzdikpCisjZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQxNihwLCBjdiwgc3YpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNigocCksIChjdiksIChzdikpCisjZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQ2NChwLCBjdiwgc3YpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NCgodm9sYXRpbGUga21wX2ludDY0ICopKHApLCAoa21wX2ludDY0KShjdiksICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGttcF9pbnQ2NCkoc3YpKQorCisjZGVmaW5lIEtNUF9YQ0hHX0ZJWEVEOChwLCB2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF94Y2hnX2ZpeGVkOCgodm9sYXRpbGUga21wX2ludDggKikocCksIChrbXBfaW50OCkodikpOworI2RlZmluZSBLTVBfWENIR19GSVhFRDE2KHAsIHYpIF9fa21wX3hjaGdfZml4ZWQxNigocCksICh2KSk7CisvLyNkZWZpbmUgS01QX1hDSEdfRklYRUQzMihwLCB2KSBfX2ttcF94Y2hnX2ZpeGVkMzIoKHApLCAodikpOworLy8jZGVmaW5lIEtNUF9YQ0hHX0ZJWEVENjQocCwgdikgX19rbXBfeGNoZ19maXhlZDY0KChwKSwgKHYpKTsKKy8vI2RlZmluZSBLTVBfWENIR19SRUFMMzIocCwgdikgX19rbXBfeGNoZ19yZWFsMzIoKHApLCAodikpOworI2RlZmluZSBLTVBfWENIR19SRUFMNjQocCwgdikgX19rbXBfeGNoZ19yZWFsNjQoKHApLCAodikpOworCisjZWxpZiAoS01QX0FTTV9JTlRSSU5TICYmIEtNUF9PU19VTklYKSB8fCAhKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpCisKKy8qIGNhc3QgcCB0byBjb3JyZWN0IHR5cGUgc28gdGhhdCBwcm9wZXIgaW50cmluc2ljIHdpbGwgYmUgdXNlZCAqLworI2RlZmluZSBLTVBfVEVTVF9USEVOX0lOQzMyKHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19zeW5jX2ZldGNoX2FuZF9hZGQoKHZvbGF0aWxlIGttcF9pbnQzMiAqKShwKSwgMSkKKyNkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkNfQUNRMzIocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fc3luY19mZXRjaF9hbmRfYWRkKCh2b2xhdGlsZSBrbXBfaW50MzIgKikocCksIDEpCisjZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DNjQocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX3N5bmNfZmV0Y2hfYW5kX2FkZCgodm9sYXRpbGUga21wX2ludDY0ICopKHApLCAxTEwpCisjZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DX0FDUTY0KHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX3N5bmNfZmV0Y2hfYW5kX2FkZCgodm9sYXRpbGUga21wX2ludDY0ICopKHApLCAxTEwpCisjZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF8zMihwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX3N5bmNfZmV0Y2hfYW5kX2FkZCgodm9sYXRpbGUga21wX2ludDMyICopKHApLCA0KQorI2RlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfQUNRMzIocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19zeW5jX2ZldGNoX2FuZF9hZGQoKHZvbGF0aWxlIGttcF9pbnQzMiAqKShwKSwgNCkKKyNkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0XzY0KHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fc3luY19mZXRjaF9hbmRfYWRkKCh2b2xhdGlsZSBrbXBfaW50NjQgKikocCksIDRMTCkKKyNkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0X0FDUTY0KHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fc3luY19mZXRjaF9hbmRfYWRkKCh2b2xhdGlsZSBrbXBfaW50NjQgKikocCksIDRMTCkKKyNkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUMzMihwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fc3luY19mZXRjaF9hbmRfc3ViKCh2b2xhdGlsZSBrbXBfaW50MzIgKikocCksIDEpCisjZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDX0FDUTMyKHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX3N5bmNfZmV0Y2hfYW5kX3N1Yigodm9sYXRpbGUga21wX2ludDMyICopKHApLCAxKQorI2RlZmluZSBLTVBfVEVTVF9USEVOX0RFQzY0KHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19zeW5jX2ZldGNoX2FuZF9zdWIoKHZvbGF0aWxlIGttcF9pbnQ2NCAqKShwKSwgMUxMKQorI2RlZmluZSBLTVBfVEVTVF9USEVOX0RFQ19BQ1E2NChwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19zeW5jX2ZldGNoX2FuZF9zdWIoKHZvbGF0aWxlIGttcF9pbnQ2NCAqKShwKSwgMUxMKQorI2RlZmluZSBLTVBfVEVTVF9USEVOX0FERDgocCwgdikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19zeW5jX2ZldGNoX2FuZF9hZGQoKHZvbGF0aWxlIGttcF9pbnQ4ICopKHApLCAoa21wX2ludDgpKHYpKQorI2RlZmluZSBLTVBfVEVTVF9USEVOX0FERDMyKHAsIHYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19zeW5jX2ZldGNoX2FuZF9hZGQoKHZvbGF0aWxlIGttcF9pbnQzMiAqKShwKSwgKGttcF9pbnQzMikodikpCisjZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENjQocCwgdikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX3N5bmNfZmV0Y2hfYW5kX2FkZCgodm9sYXRpbGUga21wX2ludDY0ICopKHApLCAoa21wX2ludDY0KSh2KSkKKworI2RlZmluZSBLTVBfVEVTVF9USEVOX09SOChwLCB2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19zeW5jX2ZldGNoX2FuZF9vcigodm9sYXRpbGUga21wX2ludDggKikocCksIChrbXBfaW50OCkodikpCisjZGVmaW5lIEtNUF9URVNUX1RIRU5fQU5EOChwLCB2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX3N5bmNfZmV0Y2hfYW5kX2FuZCgodm9sYXRpbGUga21wX2ludDggKikocCksIChrbXBfaW50OCkodikpCisjZGVmaW5lIEtNUF9URVNUX1RIRU5fT1IzMihwLCB2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX3N5bmNfZmV0Y2hfYW5kX29yKCh2b2xhdGlsZSBrbXBfdWludDMyICopKHApLCAoa21wX3VpbnQzMikodikpCisjZGVmaW5lIEtNUF9URVNUX1RIRU5fQU5EMzIocCwgdikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX3N5bmNfZmV0Y2hfYW5kX2FuZCgodm9sYXRpbGUga21wX3VpbnQzMiAqKShwKSwgKGttcF91aW50MzIpKHYpKQorI2RlZmluZSBLTVBfVEVTVF9USEVOX09SNjQocCwgdikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19zeW5jX2ZldGNoX2FuZF9vcigodm9sYXRpbGUga21wX3VpbnQ2NCAqKShwKSwgKGttcF91aW50NjQpKHYpKQorI2RlZmluZSBLTVBfVEVTVF9USEVOX0FORDY0KHAsIHYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19zeW5jX2ZldGNoX2FuZF9hbmQoKHZvbGF0aWxlIGttcF91aW50NjQgKikocCksIChrbXBfdWludDY0KSh2KSkKKworI2RlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNROChwLCBjdiwgc3YpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcCgodm9sYXRpbGUga21wX3VpbnQ4ICopKHApLCAoa21wX3VpbnQ4KShjdiksICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGttcF91aW50OCkoc3YpKQorI2RlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMOChwLCBjdiwgc3YpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcCgodm9sYXRpbGUga21wX3VpbnQ4ICopKHApLCAoa21wX3VpbnQ4KShjdiksICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGttcF91aW50OCkoc3YpKQorI2RlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMTYocCwgY3YsIHN2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcCgodm9sYXRpbGUga21wX3VpbnQxNiAqKShwKSwgKGttcF91aW50MTYpKGN2KSwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGttcF91aW50MTYpKHN2KSkKKyNkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDE2KHAsIGN2LCBzdikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXAoKHZvbGF0aWxlIGttcF91aW50MTYgKikocCksIChrbXBfdWludDE2KShjdiksICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrbXBfdWludDE2KShzdikpCisjZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMihwLCBjdiwgc3YpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKCh2b2xhdGlsZSBrbXBfdWludDMyICopKHApLCAoa21wX3VpbnQzMikoY3YpLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa21wX3VpbnQzMikoc3YpKQorI2RlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMzIocCwgY3YsIHN2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcCgodm9sYXRpbGUga21wX3VpbnQzMiAqKShwKSwgKGttcF91aW50MzIpKGN2KSwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGttcF91aW50MzIpKHN2KSkKKyNkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTY0KHAsIGN2LCBzdikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXAoKHZvbGF0aWxlIGttcF91aW50NjQgKikocCksIChrbXBfdWludDY0KShjdiksICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrbXBfdWludDY0KShzdikpCisjZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw2NChwLCBjdiwgc3YpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKCh2b2xhdGlsZSBrbXBfdWludDY0ICopKHApLCAoa21wX3VpbnQ2NCkoY3YpLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa21wX3VpbnQ2NCkoc3YpKQorI2RlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKHAsIGN2LCBzdikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcCgodm9pZCAqdm9sYXRpbGUgKikocCksICh2b2lkICopKGN2KSwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikoc3YpKQorCisjZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQ4KHAsIGN2LCBzdikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXAoKHZvbGF0aWxlIGttcF91aW50OCAqKShwKSwgKGttcF91aW50OCkoY3YpLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrbXBfdWludDgpKHN2KSkKKyNkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDE2KHAsIGN2LCBzdikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcCgodm9sYXRpbGUga21wX3VpbnQxNiAqKShwKSwgKGttcF91aW50MTYpKGN2KSwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGttcF91aW50MTYpKHN2KSkKKyNkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDMyKHAsIGN2LCBzdikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcCgodm9sYXRpbGUga21wX3VpbnQzMiAqKShwKSwgKGttcF91aW50MzIpKGN2KSwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGttcF91aW50MzIpKHN2KSkKKyNkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDY0KHAsIGN2LCBzdikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcCgodm9sYXRpbGUga21wX3VpbnQ2NCAqKShwKSwgKGttcF91aW50NjQpKGN2KSwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGttcF91aW50NjQpKHN2KSkKKworI2RlZmluZSBLTVBfWENIR19GSVhFRDgocCwgdikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19zeW5jX2xvY2tfdGVzdF9hbmRfc2V0KCh2b2xhdGlsZSBrbXBfdWludDggKikocCksIChrbXBfdWludDgpKHYpKQorI2RlZmluZSBLTVBfWENIR19GSVhFRDE2KHAsIHYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19zeW5jX2xvY2tfdGVzdF9hbmRfc2V0KCh2b2xhdGlsZSBrbXBfdWludDE2ICopKHApLCAoa21wX3VpbnQxNikodikpCisjZGVmaW5lIEtNUF9YQ0hHX0ZJWEVEMzIocCwgdikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX3N5bmNfbG9ja190ZXN0X2FuZF9zZXQoKHZvbGF0aWxlIGttcF91aW50MzIgKikocCksIChrbXBfdWludDMyKSh2KSkKKyNkZWZpbmUgS01QX1hDSEdfRklYRUQ2NChwLCB2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fc3luY19sb2NrX3Rlc3RfYW5kX3NldCgodm9sYXRpbGUga21wX3VpbnQ2NCAqKShwKSwgKGttcF91aW50NjQpKHYpKQorCitpbmxpbmUga21wX3JlYWwzMiBLTVBfWENIR19SRUFMMzIodm9sYXRpbGUga21wX3JlYWwzMiAqcCwga21wX3JlYWwzMiB2KSB7CisgIGttcF9pbnQzMiB0bXAgPQorICAgICAgX19zeW5jX2xvY2tfdGVzdF9hbmRfc2V0KCh2b2xhdGlsZSBrbXBfdWludDMyICopKHApLCAqKGttcF91aW50MzIgKikmdik7CisgIHJldHVybiAqKGttcF9yZWFsMzIgKikmdG1wOworfQorCitpbmxpbmUga21wX3JlYWw2NCBLTVBfWENIR19SRUFMNjQodm9sYXRpbGUga21wX3JlYWw2NCAqcCwga21wX3JlYWw2NCB2KSB7CisgIGttcF9pbnQ2NCB0bXAgPQorICAgICAgX19zeW5jX2xvY2tfdGVzdF9hbmRfc2V0KCh2b2xhdGlsZSBrbXBfdWludDY0ICopKHApLCAqKGttcF91aW50NjQgKikmdik7CisgIHJldHVybiAqKGttcF9yZWFsNjQgKikmdG1wOworfQorCisjZWxzZQorCitleHRlcm4ga21wX2ludDggX19rbXBfdGVzdF90aGVuX2FkZDgodm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IHYpOworZXh0ZXJuIGttcF9pbnQ4IF9fa21wX3Rlc3RfdGhlbl9vcjgodm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IHYpOworZXh0ZXJuIGttcF9pbnQ4IF9fa21wX3Rlc3RfdGhlbl9hbmQ4KHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCB2KTsKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfdGVzdF90aGVuX2FkZDMyKHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIHYpOworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfdGVzdF90aGVuX29yMzIodm9sYXRpbGUga21wX3VpbnQzMiAqcCwga21wX3VpbnQzMiB2KTsKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX3Rlc3RfdGhlbl9hbmQzMih2b2xhdGlsZSBrbXBfdWludDMyICpwLCBrbXBfdWludDMyIHYpOworZXh0ZXJuIGttcF9pbnQ2NCBfX2ttcF90ZXN0X3RoZW5fYWRkNjQodm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgdik7CitleHRlcm4ga21wX3VpbnQ2NCBfX2ttcF90ZXN0X3RoZW5fb3I2NCh2b2xhdGlsZSBrbXBfdWludDY0ICpwLCBrbXBfdWludDY0IHYpOworZXh0ZXJuIGttcF91aW50NjQgX19rbXBfdGVzdF90aGVuX2FuZDY0KHZvbGF0aWxlIGttcF91aW50NjQgKnAsIGttcF91aW50NjQgdik7CisKK2V4dGVybiBrbXBfaW50OCBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgodm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGN2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50OCBzdik7CitleHRlcm4ga21wX2ludDE2IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYodm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDE2IHN2KTsKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMih2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgc3YpOworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0KHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCBzdik7CitleHRlcm4ga21wX2ludDggX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCh2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50OCBzdik7CitleHRlcm4ga21wX2ludDE2IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2KHZvbGF0aWxlIGttcF9pbnQxNiAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YpOworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMih2b2xhdGlsZSBrbXBfaW50MzIgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBjdiwga21wX2ludDMyIHN2KTsKK2V4dGVybiBrbXBfaW50NjQgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQodm9sYXRpbGUga21wX2ludDY0ICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgY3YsIGttcF9pbnQ2NCBzdik7CisKK2V4dGVybiBrbXBfaW50OCBfX2ttcF94Y2hnX2ZpeGVkOCh2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggdik7CitleHRlcm4ga21wX2ludDE2IF9fa21wX3hjaGdfZml4ZWQxNih2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiB2KTsKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfeGNoZ19maXhlZDMyKHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIHYpOworZXh0ZXJuIGttcF9pbnQ2NCBfX2ttcF94Y2hnX2ZpeGVkNjQodm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgdik7CitleHRlcm4ga21wX3JlYWwzMiBfX2ttcF94Y2hnX3JlYWwzMih2b2xhdGlsZSBrbXBfcmVhbDMyICpwLCBrbXBfcmVhbDMyIHYpOworZXh0ZXJuIGttcF9yZWFsNjQgX19rbXBfeGNoZ19yZWFsNjQodm9sYXRpbGUga21wX3JlYWw2NCAqcCwga21wX3JlYWw2NCB2KTsKKworI2RlZmluZSBLTVBfVEVTVF9USEVOX0lOQzMyKHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCh2b2xhdGlsZSBrbXBfaW50MzIgKikocCksIDEpCisjZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DX0FDUTMyKHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoKHZvbGF0aWxlIGttcF9pbnQzMiAqKShwKSwgMSkKKyNkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkM2NChwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCgodm9sYXRpbGUga21wX2ludDY0ICopKHApLCAxTEwpCisjZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DX0FDUTY0KHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoKHZvbGF0aWxlIGttcF9pbnQ2NCAqKShwKSwgMUxMKQorI2RlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfMzIocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCh2b2xhdGlsZSBrbXBfaW50MzIgKikocCksIDQpCisjZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF9BQ1EzMihwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoKHZvbGF0aWxlIGttcF9pbnQzMiAqKShwKSwgNCkKKyNkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0XzY0KHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCgodm9sYXRpbGUga21wX2ludDY0ICopKHApLCA0TEwpCisjZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF9BQ1E2NChwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoKHZvbGF0aWxlIGttcF9pbnQ2NCAqKShwKSwgNExMKQorI2RlZmluZSBLTVBfVEVTVF9USEVOX0RFQzMyKHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCh2b2xhdGlsZSBrbXBfaW50MzIgKikocCksIC0xKQorI2RlZmluZSBLTVBfVEVTVF9USEVOX0RFQ19BQ1EzMihwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCh2b2xhdGlsZSBrbXBfaW50MzIgKikocCksIC0xKQorI2RlZmluZSBLTVBfVEVTVF9USEVOX0RFQzY0KHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfdGVzdF90aGVuX2FkZDY0KCh2b2xhdGlsZSBrbXBfaW50NjQgKikocCksIC0xTEwpCisjZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDX0FDUTY0KHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoKHZvbGF0aWxlIGttcF9pbnQ2NCAqKShwKSwgLTFMTCkKKyNkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ4KHAsIHYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX3Rlc3RfdGhlbl9hZGQ4KCh2b2xhdGlsZSBrbXBfaW50OCAqKShwKSwgKGttcF9pbnQ4KSh2KSkKKyNkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQzMihwLCB2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMigodm9sYXRpbGUga21wX2ludDMyICopKHApLCAoa21wX2ludDMyKSh2KSkKKyNkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ2NChwLCB2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCgodm9sYXRpbGUga21wX2ludDY0ICopKHApLCAoa21wX2ludDY0KSh2KSkKKworI2RlZmluZSBLTVBfVEVTVF9USEVOX09SOChwLCB2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfdGVzdF90aGVuX29yOCgodm9sYXRpbGUga21wX2ludDggKikocCksIChrbXBfaW50OCkodikpCisjZGVmaW5lIEtNUF9URVNUX1RIRU5fQU5EOChwLCB2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF90ZXN0X3RoZW5fYW5kOCgodm9sYXRpbGUga21wX2ludDggKikocCksIChrbXBfaW50OCkodikpCisjZGVmaW5lIEtNUF9URVNUX1RIRU5fT1IzMihwLCB2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF90ZXN0X3RoZW5fb3IzMigodm9sYXRpbGUga21wX3VpbnQzMiAqKShwKSwgKGttcF91aW50MzIpKHYpKQorI2RlZmluZSBLTVBfVEVTVF9USEVOX0FORDMyKHAsIHYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfdGVzdF90aGVuX2FuZDMyKCh2b2xhdGlsZSBrbXBfdWludDMyICopKHApLCAoa21wX3VpbnQzMikodikpCisjZGVmaW5lIEtNUF9URVNUX1RIRU5fT1I2NChwLCB2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF90ZXN0X3RoZW5fb3I2NCgodm9sYXRpbGUga21wX3VpbnQ2NCAqKShwKSwgKGttcF91aW50NjQpKHYpKQorI2RlZmluZSBLTVBfVEVTVF9USEVOX0FORDY0KHAsIHYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfdGVzdF90aGVuX2FuZDY0KCh2b2xhdGlsZSBrbXBfdWludDY0ICopKHApLCAoa21wX3VpbnQ2NCkodikpCisKKyNkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTgocCwgY3YsIHN2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCgodm9sYXRpbGUga21wX2ludDggKikocCksIChrbXBfaW50OCkoY3YpLCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGttcF9pbnQ4KShzdikpCisjZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw4KHAsIGN2LCBzdikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgoKHZvbGF0aWxlIGttcF9pbnQ4ICopKHApLCAoa21wX2ludDgpKGN2KSwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChrbXBfaW50OCkoc3YpKQorI2RlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMTYocCwgY3YsIHN2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNigodm9sYXRpbGUga21wX2ludDE2ICopKHApLCAoa21wX2ludDE2KShjdiksICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGttcF9pbnQxNikoc3YpKQorI2RlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMTYocCwgY3YsIHN2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNigodm9sYXRpbGUga21wX2ludDE2ICopKHApLCAoa21wX2ludDE2KShjdiksICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGttcF9pbnQxNikoc3YpKQorI2RlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIocCwgY3YsIHN2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMigodm9sYXRpbGUga21wX2ludDMyICopKHApLCAoa21wX2ludDMyKShjdiksICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGttcF9pbnQzMikoc3YpKQorI2RlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMzIocCwgY3YsIHN2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMigodm9sYXRpbGUga21wX2ludDMyICopKHApLCAoa21wX2ludDMyKShjdiksICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGttcF9pbnQzMikoc3YpKQorI2RlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRNjQocCwgY3YsIHN2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCgodm9sYXRpbGUga21wX2ludDY0ICopKHApLCAoa21wX2ludDY0KShjdiksICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGttcF9pbnQ2NCkoc3YpKQorI2RlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMNjQocCwgY3YsIHN2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCgodm9sYXRpbGUga21wX2ludDY0ICopKHApLCAoa21wX2ludDY0KShjdiksICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGttcF9pbnQ2NCkoc3YpKQorCisjaWYgS01QX0FSQ0hfWDg2CisjZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9QVFIocCwgY3YsIHN2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKCh2b2xhdGlsZSBrbXBfaW50MzIgKikocCksIChrbXBfaW50MzIpKGN2KSwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa21wX2ludDMyKShzdikpCisjZWxzZSAvKiA2NCBiaXQgcG9pbnRlcnMgKi8KKyNkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1BUUihwLCBjdiwgc3YpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoKHZvbGF0aWxlIGttcF9pbnQ2NCAqKShwKSwgKGttcF9pbnQ2NCkoY3YpLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrbXBfaW50NjQpKHN2KSkKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgKi8KKworI2RlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUOChwLCBjdiwgc3YpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCgocCksIChjdiksIChzdikpCisjZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQxNihwLCBjdiwgc3YpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNigocCksIChjdiksIChzdikpCisjZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQzMihwLCBjdiwgc3YpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMigodm9sYXRpbGUga21wX2ludDMyICopKHApLCAoa21wX2ludDMyKShjdiksICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGttcF9pbnQzMikoc3YpKQorI2RlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUNjQocCwgY3YsIHN2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQoKHZvbGF0aWxlIGttcF9pbnQ2NCAqKShwKSwgKGttcF9pbnQ2NCkoY3YpLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrbXBfaW50NjQpKHN2KSkKKworI2RlZmluZSBLTVBfWENIR19GSVhFRDgocCwgdikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfeGNoZ19maXhlZDgoKHZvbGF0aWxlIGttcF9pbnQ4ICopKHApLCAoa21wX2ludDgpKHYpKTsKKyNkZWZpbmUgS01QX1hDSEdfRklYRUQxNihwLCB2KSBfX2ttcF94Y2hnX2ZpeGVkMTYoKHApLCAodikpOworI2RlZmluZSBLTVBfWENIR19GSVhFRDMyKHAsIHYpIF9fa21wX3hjaGdfZml4ZWQzMigocCksICh2KSk7CisjZGVmaW5lIEtNUF9YQ0hHX0ZJWEVENjQocCwgdikgX19rbXBfeGNoZ19maXhlZDY0KChwKSwgKHYpKTsKKyNkZWZpbmUgS01QX1hDSEdfUkVBTDMyKHAsIHYpIF9fa21wX3hjaGdfcmVhbDMyKChwKSwgKHYpKTsKKyNkZWZpbmUgS01QX1hDSEdfUkVBTDY0KHAsIHYpIF9fa21wX3hjaGdfcmVhbDY0KChwKSwgKHYpKTsKKworI2VuZGlmIC8qIEtNUF9BU01fSU5UUklOUyAqLworCisvKiAtLS0tLS0tLS0tLS0tIHJlbGF4ZWQgY29uc2lzdGVuY3kgbWVtb3J5IG1vZGVsIHN0dWZmIC0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgS01QX09TX1dJTkRPV1MKKyNpZmRlZiBfX0FCU09GVF9XSU4KKyNkZWZpbmUgS01QX01CKCkgYXNtKCJub3AiKQorI2RlZmluZSBLTVBfSU1CKCkgYXNtKCJub3AiKQorI2Vsc2UKKyNkZWZpbmUgS01QX01CKCkgLyogX2FzbXsgbm9wIH0gKi8KKyNkZWZpbmUgS01QX0lNQigpIC8qIF9hc217IG5vcCB9ICovCisjZW5kaWYKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworCisjaWYgS01QX0FSQ0hfUFBDNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQgfHwgS01QX0FSQ0hfTUlQUyB8fCAgICAgXAorICAgIEtNUF9BUkNIX01JUFM2NAorI2RlZmluZSBLTVBfTUIoKSBfX3N5bmNfc3luY2hyb25pemUoKQorI2VuZGlmCisKKyNpZm5kZWYgS01QX01CCisjZGVmaW5lIEtNUF9NQigpIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyNlbmRpZgorCisjaWZuZGVmIEtNUF9JTUIKKyNkZWZpbmUgS01QX0lNQigpIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyNlbmRpZgorCisjaWZuZGVmIEtNUF9TVF9SRUwzMgorI2RlZmluZSBLTVBfU1RfUkVMMzIoQSwgRCkgKCooQSkgPSAoRCkpCisjZW5kaWYKKworI2lmbmRlZiBLTVBfU1RfUkVMNjQKKyNkZWZpbmUgS01QX1NUX1JFTDY0KEEsIEQpICgqKEEpID0gKEQpKQorI2VuZGlmCisKKyNpZm5kZWYgS01QX0xEX0FDUTMyCisjZGVmaW5lIEtNUF9MRF9BQ1EzMihBKSAoKihBKSkKKyNlbmRpZgorCisjaWZuZGVmIEtNUF9MRF9BQ1E2NAorI2RlZmluZSBLTVBfTERfQUNRNjQoQSkgKCooQSkpCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvLyBGSVhNRSAtIG1heWJlIHRoaXMgc2hvdWxkIHRoaXMgYmUKKy8vCisvLyAjZGVmaW5lIFRDUl80KGEpICAgICgqKHZvbGF0aWxlIGttcF9pbnQzMiAqKSgmYSkpCisvLyAjZGVmaW5lIFRDV180KGEsYikgIChhKSA9ICgqKHZvbGF0aWxlIGttcF9pbnQzMiAqKSYoYikpCisvLworLy8gI2RlZmluZSBUQ1JfOChhKSAgICAoKih2b2xhdGlsZSBrbXBfaW50NjQgKikoYSkpCisvLyAjZGVmaW5lIFRDV184KGEsYikgIChhKSA9ICgqKHZvbGF0aWxlIGttcF9pbnQ2NCAqKSgmYikpCisvLworLy8gSSdtIGZhaXJseSBjZXJ0YWluIHRoaXMgaXMgdGhlIGNvcnJlY3QgdGhpbmcgdG8gZG8sIGJ1dCBJJ20gYWZyYWlkCisvLyBvZiBwZXJmb3JtYW5jZSByZWdyZXNzaW9ucy4KKworI2RlZmluZSBUQ1JfMShhKSAoYSkKKyNkZWZpbmUgVENXXzEoYSwgYikgKGEpID0gKGIpCisjZGVmaW5lIFRDUl80KGEpIChhKQorI2RlZmluZSBUQ1dfNChhLCBiKSAoYSkgPSAoYikKKyNkZWZpbmUgVENJXzQoYSkgKCsrKGEpKQorI2RlZmluZSBUQ0RfNChhKSAoLS0oYSkpCisjZGVmaW5lIFRDUl84KGEpIChhKQorI2RlZmluZSBUQ1dfOChhLCBiKSAoYSkgPSAoYikKKyNkZWZpbmUgVENJXzgoYSkgKCsrKGEpKQorI2RlZmluZSBUQ0RfOChhKSAoLS0oYSkpCisjZGVmaW5lIFRDUl9TWU5DXzQoYSkgKGEpCisjZGVmaW5lIFRDV19TWU5DXzQoYSwgYikgKGEpID0gKGIpCisjZGVmaW5lIFRDWF9TWU5DXzQoYSwgYiwgYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMzIoKHZvbGF0aWxlIGttcF9pbnQzMiAqKSh2b2xhdGlsZSB2b2lkICopJihhKSwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrbXBfaW50MzIpKGIpLCAoa21wX2ludDMyKShjKSkKKyNkZWZpbmUgVENSX1NZTkNfOChhKSAoYSkKKyNkZWZpbmUgVENXX1NZTkNfOChhLCBiKSAoYSkgPSAoYikKKyNkZWZpbmUgVENYX1NZTkNfOChhLCBiLCBjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw2NCgodm9sYXRpbGUga21wX2ludDY0ICopKHZvbGF0aWxlIHZvaWQgKikmKGEpLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGttcF9pbnQ2NCkoYiksIChrbXBfaW50NjQpKGMpKQorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX01JUFMKKy8vIFdoYXQgYWJvdXQgQVJNPworI2RlZmluZSBUQ1JfUFRSKGEpICgodm9pZCAqKVRDUl80KGEpKQorI2RlZmluZSBUQ1dfUFRSKGEsIGIpIFRDV180KChhKSwgKGIpKQorI2RlZmluZSBUQ1JfU1lOQ19QVFIoYSkgKCh2b2lkICopVENSX1NZTkNfNChhKSkKKyNkZWZpbmUgVENXX1NZTkNfUFRSKGEsIGIpIFRDV19TWU5DXzQoKGEpLCAoYikpCisjZGVmaW5lIFRDWF9TWU5DX1BUUihhLCBiLCBjKSAoKHZvaWQgKilUQ1hfU1lOQ180KChhKSwgKGIpLCAoYykpKQorCisjZWxzZSAvKiA2NCBiaXQgcG9pbnRlcnMgKi8KKworI2RlZmluZSBUQ1JfUFRSKGEpICgodm9pZCAqKVRDUl84KGEpKQorI2RlZmluZSBUQ1dfUFRSKGEsIGIpIFRDV184KChhKSwgKGIpKQorI2RlZmluZSBUQ1JfU1lOQ19QVFIoYSkgKCh2b2lkICopVENSX1NZTkNfOChhKSkKKyNkZWZpbmUgVENXX1NZTkNfUFRSKGEsIGIpIFRDV19TWU5DXzgoKGEpLCAoYikpCisjZGVmaW5lIFRDWF9TWU5DX1BUUihhLCBiLCBjKSAoKHZvaWQgKilUQ1hfU1lOQ184KChhKSwgKGIpLCAoYykpKQorCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2ICovCisKKy8qIElmIHRoZXNlIEZUTl97VFJVRSxGQUxTRX0gdmFsdWVzIGNoYW5nZSwgbWF5IG5lZWQgdG8gY2hhbmdlIHNldmVyYWwgcGxhY2VzCisgICB3aGVyZSB0aGV5IGFyZSB1c2VkIHRvIGNoZWNrIHRoYXQgbGFuZ3VhZ2UgaXMgRm9ydHJhbiwgbm90IEMuICovCisKKyNpZm5kZWYgRlROX1RSVUUKKyNkZWZpbmUgRlROX1RSVUUgVFJVRQorI2VuZGlmCisKKyNpZm5kZWYgRlROX0ZBTFNFCisjZGVmaW5lIEZUTl9GQUxTRSBGQUxTRQorI2VuZGlmCisKK3R5cGVkZWYgdm9pZCAoKm1pY3JvdGFza190KShpbnQgKmd0aWQsIGludCAqbnByLCAuLi4pOworCisjaWZkZWYgVVNFX1ZPTEFUSUxFX0NBU1QKKyNkZWZpbmUgVk9MQVRJTEVfQ0FTVCh4KSAodm9sYXRpbGUgeCkKKyNlbHNlCisjZGVmaW5lIFZPTEFUSUxFX0NBU1QoeCkgKHgpCisjZW5kaWYKKworI2RlZmluZSBLTVBfV0FJVF9ZSUVMRCBfX2ttcF93YWl0X3lpZWxkXzQKKyNkZWZpbmUgS01QX1dBSVRfWUlFTERfUFRSIF9fa21wX3dhaXRfeWllbGRfNF9wdHIKKyNkZWZpbmUgS01QX0VRIF9fa21wX2VxXzQKKyNkZWZpbmUgS01QX05FUSBfX2ttcF9uZXFfNAorI2RlZmluZSBLTVBfTFQgX19rbXBfbHRfNAorI2RlZmluZSBLTVBfR0UgX19rbXBfZ2VfNAorI2RlZmluZSBLTVBfTEUgX19rbXBfbGVfNAorCisvKiBXb3JrYXJvdW5kIGZvciBJbnRlbChSKSA2NCBjb2RlIGdlbiBidWcgd2hlbiB0YWtpbmcgYWRkcmVzcyBvZiBzdGF0aWMgYXJyYXkKKyAqIChJbnRlbChSKSA2NCBUcmFja2VyICMxMzgpICovCisjaWYgKEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9QUEM2NCkgJiYgS01QX09TX0xJTlVYCisjZGVmaW5lIFNUQVRJQ19FRkkyX1dPUktBUk9VTkQKKyNlbHNlCisjZGVmaW5lIFNUQVRJQ19FRkkyX1dPUktBUk9VTkQgc3RhdGljCisjZW5kaWYKKworLy8gU3VwcG9ydCBvZiBCR0VUIHVzYWdlCisjaWZuZGVmIEtNUF9VU0VfQkdFVAorI2RlZmluZSBLTVBfVVNFX0JHRVQgMQorI2VuZGlmCisKKworLy8gU3dpdGNoZXMgZm9yIE9TUyBidWlsZHMKKyNpZm5kZWYgVVNFX1NZU0ZTX0lORk8KKyNkZWZpbmUgVVNFX1NZU0ZTX0lORk8gMAorI2VuZGlmCisjaWZuZGVmIFVTRV9DTVBYQ0hHX0ZJWAorI2RlZmluZSBVU0VfQ01QWENIR19GSVggMQorI2VuZGlmCisKKy8vIEVuYWJsZSBkeW5hbWljIHVzZXIgbG9jaworI2lmIE9NUF80NV9FTkFCTEVECisjZGVmaW5lIEtNUF9VU0VfRFlOQU1JQ19MT0NLIDEKKyNlbmRpZgorCisvLyBFbmFibGUgVFNYIGlmIGR5bmFtaWMgdXNlciBsb2NrIGlzIHR1cm5lZCBvbgorI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisvLyBWaXN1YWwgc3R1ZGlvIGNhbid0IGhhbmRsZSB0aGUgYXNtIHNlY3Rpb25zIGluIHRoaXMgY29kZQorI2RlZmluZSBLTVBfVVNFX1RTWCAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCkgJiYgIUtNUF9DT01QSUxFUl9NU1ZDCisjaWZkZWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworI3VuZGVmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyNlbmRpZgorI2RlZmluZSBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTIEtNUF9VU0VfVFNYCisjZW5kaWYKKworLy8gRW5hYmxlIHRpY2sgdGltZSBjb252ZXJzaW9uIG9mIHRpY2tzIHRvIHNlY29uZHMKKyNpZiBLTVBfU1RBVFNfRU5BQkxFRAorI2RlZmluZSBLTVBfSEFWRV9USUNLX1RJTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEtNUF9PU19MSU5VWCAmJiAoS01QX01JQyB8fCBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0KSkKKyNlbmRpZgorCisvLyBXYXJuaW5nIGxldmVscworZW51bSBrbXBfd2FybmluZ3NfbGV2ZWwgeworICBrbXBfd2FybmluZ3Nfb2ZmID0gMCwgLyogTm8gd2FybmluZ3MgKi8KKyAga21wX3dhcm5pbmdzX2xvdywgLyogTWluaW1hbCB3YXJuaW5ncyAoZGVmYXVsdCkgKi8KKyAga21wX3dhcm5pbmdzX2V4cGxpY2l0ID0gNiwgLyogRXhwbGljaXRseSBzZXQgdG8gT04gLSBtb3JlIHdhcm5pbmdzICovCisgIGttcF93YXJuaW5nc192ZXJib3NlIC8qIHJlc2VydmVkICovCit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNlbmRpZiAvKiBLTVBfT1NfSCAqLworLy8gU2FmZSBDIEFQSQorI2luY2x1ZGUgImttcF9zYWZlX2NfYXBpLmgiCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfcGxhdGZvcm0uaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9wbGF0Zm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMDUyM2EKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfcGxhdGZvcm0uaApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIGttcF9wbGF0Zm9ybS5oIC0tIGhlYWRlciBmb3IgZGV0ZXJtaW5pbmcgb3BlcmF0aW5nIHN5c3RlbSBhbmQgYXJjaGl0ZWN0dXJlCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX1BMQVRGT1JNX0gKKyNkZWZpbmUgS01QX1BMQVRGT1JNX0gKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPcGVyYXRpbmcgc3lzdGVtIHJlY29nbml0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBLTVBfT1NfTElOVVggMAorI2RlZmluZSBLTVBfT1NfRlJFRUJTRCAwCisjZGVmaW5lIEtNUF9PU19ORVRCU0QgMAorI2RlZmluZSBLTVBfT1NfREFSV0lOIDAKKyNkZWZpbmUgS01QX09TX1dJTkRPV1MgMAorI2RlZmluZSBLTVBfT1NfQ05LIDAKKyNkZWZpbmUgS01QX09TX1VOSVggMCAvKiBkaXNqdW5jdGlvbiBvZiBLTVBfT1NfTElOVVgsIEtNUF9PU19EQVJXSU4gZXRjLiAqLworCisjaWZkZWYgX1dJTjMyCisjdW5kZWYgS01QX09TX1dJTkRPV1MKKyNkZWZpbmUgS01QX09TX1dJTkRPV1MgMQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZCBfX0FQUExFX18gJiYgZGVmaW5lZCBfX01BQ0hfXykKKyN1bmRlZiBLTVBfT1NfREFSV0lOCisjZGVmaW5lIEtNUF9PU19EQVJXSU4gMQorI2VuZGlmCisKKy8vIGluIHNvbWUgcHBjNjQgbGludXggaW5zdGFsbGF0aW9ucywgb25seSB0aGUgc2Vjb25kIGNvbmRpdGlvbiBpcyBtZXQKKyNpZiAoZGVmaW5lZCBfX2xpbnV4KQorI3VuZGVmIEtNUF9PU19MSU5VWAorI2RlZmluZSBLTVBfT1NfTElOVVggMQorI2VsaWYgKGRlZmluZWQgX19saW51eF9fKQorI3VuZGVmIEtNUF9PU19MSU5VWAorI2RlZmluZSBLTVBfT1NfTElOVVggMQorI2Vsc2UKKyNlbmRpZgorCisjaWYgKGRlZmluZWQgX19GcmVlQlNEX18pCisjdW5kZWYgS01QX09TX0ZSRUVCU0QKKyNkZWZpbmUgS01QX09TX0ZSRUVCU0QgMQorI2VuZGlmCisKKyNpZiAoZGVmaW5lZCBfX05ldEJTRF9fKQorI3VuZGVmIEtNUF9PU19ORVRCU0QKKyNkZWZpbmUgS01QX09TX05FVEJTRCAxCisjZW5kaWYKKworI2lmIChkZWZpbmVkIF9fYmdxX18pCisjdW5kZWYgS01QX09TX0NOSworI2RlZmluZSBLTVBfT1NfQ05LIDEKKyNlbmRpZgorCisjaWYgKDEgIT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBLTVBfT1NfTElOVVggKyBLTVBfT1NfRlJFRUJTRCArIEtNUF9PU19ORVRCU0QgKyBLTVBfT1NfREFSV0lOICsgICAgICAgICAgIFwKKyAgICAgICAgIEtNUF9PU19XSU5ET1dTKQorI2Vycm9yIFVua25vd24gT1MKKyNlbmRpZgorCisjaWYgS01QX09TX0xJTlVYIHx8IEtNUF9PU19GUkVFQlNEIHx8IEtNUF9PU19ORVRCU0QgfHwgS01QX09TX0RBUldJTgorI3VuZGVmIEtNUF9PU19VTklYCisjZGVmaW5lIEtNUF9PU19VTklYIDEKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFyY2hpdGVjdHVyZSByZWNvZ25pdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgS01QX0FSQ0hfWDg2IDAKKyNkZWZpbmUgS01QX0FSQ0hfWDg2XzY0IDAKKyNkZWZpbmUgS01QX0FSQ0hfQUFSQ0g2NCAwCisjZGVmaW5lIEtNUF9BUkNIX1BQQzY0X0JFIDAKKyNkZWZpbmUgS01QX0FSQ0hfUFBDNjRfTEUgMAorI2RlZmluZSBLTVBfQVJDSF9QUEM2NCAoS01QX0FSQ0hfUFBDNjRfTEUgfHwgS01QX0FSQ0hfUFBDNjRfQkUpCisjZGVmaW5lIEtNUF9BUkNIX01JUFMgMAorI2RlZmluZSBLTVBfQVJDSF9NSVBTNjQgMAorCisjaWYgS01QX09TX1dJTkRPV1MKKyNpZiBkZWZpbmVkIF9NX0FNRDY0CisjdW5kZWYgS01QX0FSQ0hfWDg2XzY0CisjZGVmaW5lIEtNUF9BUkNIX1g4Nl82NCAxCisjZWxzZQorI3VuZGVmIEtNUF9BUkNIX1g4NgorI2RlZmluZSBLTVBfQVJDSF9YODYgMQorI2VuZGlmCisjZW5kaWYKKworI2lmIEtNUF9PU19VTklYCisjaWYgZGVmaW5lZCBfX3g4Nl82NAorI3VuZGVmIEtNUF9BUkNIX1g4Nl82NAorI2RlZmluZSBLTVBfQVJDSF9YODZfNjQgMQorI2VsaWYgZGVmaW5lZCBfX2kzODYKKyN1bmRlZiBLTVBfQVJDSF9YODYKKyNkZWZpbmUgS01QX0FSQ0hfWDg2IDEKKyNlbGlmIGRlZmluZWQgX19wb3dlcnBjNjRfXworI2lmIGRlZmluZWQgX19MSVRUTEVfRU5ESUFOX18KKyN1bmRlZiBLTVBfQVJDSF9QUEM2NF9MRQorI2RlZmluZSBLTVBfQVJDSF9QUEM2NF9MRSAxCisjZWxzZQorI3VuZGVmIEtNUF9BUkNIX1BQQzY0X0JFCisjZGVmaW5lIEtNUF9BUkNIX1BQQzY0X0JFIDEKKyNlbmRpZgorI2VsaWYgZGVmaW5lZCBfX2FhcmNoNjRfXworI3VuZGVmIEtNUF9BUkNIX0FBUkNINjQKKyNkZWZpbmUgS01QX0FSQ0hfQUFSQ0g2NCAxCisjZWxpZiBkZWZpbmVkIF9fbWlwc19fCisjaWYgZGVmaW5lZCBfX21pcHM2NAorI3VuZGVmIEtNUF9BUkNIX01JUFM2NAorI2RlZmluZSBLTVBfQVJDSF9NSVBTNjQgMQorI2Vsc2UKKyN1bmRlZiBLTVBfQVJDSF9NSVBTCisjZGVmaW5lIEtNUF9BUkNIX01JUFMgMQorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0FSTV9BUkNIXzdfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzdSX18pIHx8ICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRlZmluZWQoX19BUk1fQVJDSF83QV9fKQorI2RlZmluZSBLTVBfQVJDSF9BUk1WNyAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoS01QX0FSQ0hfQVJNVjcpIHx8IGRlZmluZWQoX19BUk1fQVJDSF82X18pIHx8ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkZWZpbmVkKF9fQVJNX0FSQ0hfNkpfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZLX18pIHx8ICAgICAgICAgICAgICAgICAgICBcCisgICAgZGVmaW5lZChfX0FSTV9BUkNIXzZaX18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF82VDJfXykgfHwgICAgICAgICAgICAgICAgICAgXAorICAgIGRlZmluZWQoX19BUk1fQVJDSF82WktfXykKKyNkZWZpbmUgS01QX0FSQ0hfQVJNVjYgMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEtNUF9BUkNIX0FSTVY2KSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRfXykgfHwgICAgICAgICAgICAgICAgICAgICBcCisgICAgZGVmaW5lZChfX0FSTV9BUkNIXzVFX18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF81VEVfXykgfHwgICAgICAgICAgICAgICAgICAgXAorICAgIGRlZmluZWQoX19BUk1fQVJDSF81VEVKX18pCisjZGVmaW5lIEtNUF9BUkNIX0FSTVY1IDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChLTVBfQVJDSF9BUk1WNSkgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzRfXykgfHwgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRlZmluZWQoX19BUk1fQVJDSF80VF9fKQorI2RlZmluZSBLTVBfQVJDSF9BUk1WNCAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoS01QX0FSQ0hfQVJNVjQpIHx8IGRlZmluZWQoX19BUk1fQVJDSF8zX18pIHx8ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkZWZpbmVkKF9fQVJNX0FSQ0hfM01fXykKKyNkZWZpbmUgS01QX0FSQ0hfQVJNVjMgMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEtNUF9BUkNIX0FSTVYzKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfMl9fKQorI2RlZmluZSBLTVBfQVJDSF9BUk1WMiAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoS01QX0FSQ0hfQVJNVjIpCisjZGVmaW5lIEtNUF9BUkNIX0FSTSAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19NSUNfXykgfHwgZGVmaW5lZChfX01JQzJfXykKKyNkZWZpbmUgS01QX01JQyAxCisjaWYgX19NSUMyX18gfHwgX19LTkNfXworI2RlZmluZSBLTVBfTUlDMSAwCisjZGVmaW5lIEtNUF9NSUMyIDEKKyNlbHNlCisjZGVmaW5lIEtNUF9NSUMxIDEKKyNkZWZpbmUgS01QX01JQzIgMAorI2VuZGlmCisjZWxzZQorI2RlZmluZSBLTVBfTUlDIDAKKyNkZWZpbmUgS01QX01JQzEgMAorI2RlZmluZSBLTVBfTUlDMiAwCisjZW5kaWYKKworLyogU3BlY2lmeSAzMiBiaXQgYXJjaGl0ZWN0dXJlcyBoZXJlICovCisjZGVmaW5lIEtNUF8zMl9CSVRfQVJDSCAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9NSVBTKQorCisvLyBQbGF0Zm9ybXMgd2hpY2ggc3VwcG9ydCBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUKKyNkZWZpbmUgS01QX01JQ19TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCkgJiYgKEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfV0lORE9XUykpCisKKy8vIFRPRE86IEZpeG1lIC0gVGhpcyBpcyBjbGV2ZXIsIGJ1dCByZWFsbHkgZnVnbHkKKyNpZiAoMSAhPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIEtNUF9BUkNIX1g4NiArIEtNUF9BUkNIX1g4Nl82NCArIEtNUF9BUkNIX0FSTSArIEtNUF9BUkNIX1BQQzY0ICsgICAgICAgICAgXAorICAgICAgICAgS01QX0FSQ0hfQUFSQ0g2NCArIEtNUF9BUkNIX01JUFMgKyBLTVBfQVJDSF9NSVBTNjQpCisjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUKKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1BMQVRGT1JNX0gKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9ydW50aW1lLmNwcCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9ydW50aW1lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWRiYTRlCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3J1bnRpbWUuY3BwCkBAIC0wLDAgKzEsNzYyMiBAQAorLyoKKyAqIGttcF9ydW50aW1lLmNwcCAtLSBLUFRTIHJ1bnRpbWUgc3VwcG9ydCBsaWJyYXJ5CisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfYWZmaW5pdHkuaCIKKyNpbmNsdWRlICJrbXBfYXRvbWljLmgiCisjaW5jbHVkZSAia21wX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAia21wX2Vycm9yLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisjaW5jbHVkZSAia21wX3NldHRpbmdzLmgiCisjaW5jbHVkZSAia21wX3N0YXRzLmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorI2luY2x1ZGUgImttcF93YWl0X3JlbGVhc2UuaCIKKyNpbmNsdWRlICJrbXBfd3JhcHBlcl9nZXRwaWQuaCIKKworI2lmIE9NUFRfU1VQUE9SVAorI2luY2x1ZGUgIm9tcHQtc3BlY2lmaWMuaCIKKyNlbmRpZgorCisvKiB0aGVzZSBhcmUgdGVtcG9yYXJ5IGlzc3VlcyB0byBiZSBkZWFsdCB3aXRoICovCisjZGVmaW5lIEtNUF9VU0VfUFJDVEwgMAorCisjaWYgS01QX09TX1dJTkRPV1MKKyNpbmNsdWRlIDxwcm9jZXNzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInRzYW5fYW5ub3RhdGlvbnMuaCIKKworI2lmIGRlZmluZWQoS01QX0dPTVBfQ09NUEFUKQorY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2FsdF9jb21wW10gPQorICAgIEtNUF9WRVJTSU9OX1BSRUZJWCAiYWx0ZXJuYXRpdmUgY29tcGlsZXIgc3VwcG9ydDogeWVzIjsKKyNlbmRpZiAvKiBkZWZpbmVkKEtNUF9HT01QX0NPTVBBVCkgKi8KKworY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX29tcF9hcGlbXSA9IEtNUF9WRVJTSU9OX1BSRUZJWCAiQVBJIHZlcnNpb246ICIKKyNpZiBPTVBfNTBfRU5BQkxFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNS4wICgyMDE2MTEpIjsKKyNlbGlmIE9NUF80NV9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0LjUgKDIwMTUxMSkiOworI2VsaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQuMCAoMjAxMzA3KSI7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMy4xICgyMDExMDcpIjsKKyNlbmRpZgorCisjaWZkZWYgS01QX0RFQlVHCitjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fbG9ja1tdID0KKyAgICBLTVBfVkVSU0lPTl9QUkVGSVggImxvY2sgdHlwZTogcnVuIHRpbWUgc2VsZWN0YWJsZSI7CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKyNkZWZpbmUgS01QX01JTih4LCB5KSAoKHgpIDwgKHkpID8gKHgpIDogKHkpKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwora21wX2luZm9fdCBfX2ttcF9tb25pdG9yOworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworCit2b2lkIF9fa21wX2NsZWFudXAodm9pZCk7CisKK3N0YXRpYyB2b2lkIF9fa21wX2luaXRpYWxpemVfaW5mbyhrbXBfaW5mb190ICosIGttcF90ZWFtX3QgKiwgaW50IHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3RpZCk7CitzdGF0aWMgdm9pZCBfX2ttcF9pbml0aWFsaXplX3RlYW0oa21wX3RlYW1fdCAqdGVhbSwgaW50IG5ld19ucHJvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90ICpuZXdfaWN2cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudF90ICpsb2MpOworI2lmIE9NUF80MF9FTkFCTEVEICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKK3N0YXRpYyB2b2lkIF9fa21wX3BhcnRpdGlvbl9wbGFjZXMoa21wX3RlYW1fdCAqdGVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVwZGF0ZV9tYXN0ZXJfb25seSA9IDApOworI2VuZGlmCitzdGF0aWMgdm9pZCBfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZSh2b2lkKTsKK3ZvaWQgX19rbXBfZm9ya19iYXJyaWVyKGludCBndGlkLCBpbnQgdGlkKTsKK3ZvaWQgX19rbXBfam9pbl9iYXJyaWVyKGludCBndGlkKTsKK3ZvaWQgX19rbXBfc2V0dXBfaWN2X2NvcHkoa21wX3RlYW1fdCAqdGVhbSwgaW50IG5ld19ucHJvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCAqbmV3X2ljdnMsIGlkZW50X3QgKmxvYyk7CisKKyNpZmRlZiBVU0VfTE9BRF9CQUxBTkNFCitzdGF0aWMgaW50IF9fa21wX2xvYWRfYmFsYW5jZV9ucHJvYyhrbXBfcm9vdF90ICpyb290LCBpbnQgc2V0X25wcm9jKTsKKyNlbmRpZgorCitzdGF0aWMgaW50IF9fa21wX2V4cGFuZF90aHJlYWRzKGludCBuV2lzaCwgaW50IG5OZWVkKTsKKyNpZiBLTVBfT1NfV0lORE9XUworc3RhdGljIGludCBfX2ttcF91bnJlZ2lzdGVyX3Jvb3Rfb3RoZXJfdGhyZWFkKGludCBndGlkKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgX19rbXBfdW5yZWdpc3Rlcl9saWJyYXJ5KHZvaWQpOyAvLyBjYWxsZWQgYnkgX19rbXBfaW50ZXJuYWxfZW5kKCkKK3N0YXRpYyB2b2lkIF9fa21wX3JlYXBfdGhyZWFkKGttcF9pbmZvX3QgKnRocmVhZCwgaW50IGlzX3Jvb3QpOworc3RhdGljIGttcF9pbmZvX3QgKl9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdCA9IE5VTEw7CisKKy8qIENhbGN1bGF0ZSB0aGUgaWRlbnRpZmllciBvZiB0aGUgY3VycmVudCB0aHJlYWQgKi8KKy8qIGZhc3QgKGFuZCBzb21ld2hhdCBwb3J0YWJsZSkgd2F5IHRvIGdldCB1bmlxdWUgaWRlbnRpZmllciBvZiBleGVjdXRpbmcKKyAgIHRocmVhZC4gUmV0dXJucyBLTVBfR1RJRF9ETkUgaWYgd2UgaGF2ZW4ndCBiZWVuIGFzc2lnbmVkIGEgZ3RpZC4gKi8KK2ludCBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZCgpIHsKKyAgaW50IGk7CisgIGttcF9pbmZvX3QgKipvdGhlcl90aHJlYWRzOworICBzaXplX3Qgc3RhY2tfZGF0YTsKKyAgY2hhciAqc3RhY2tfYWRkcjsKKyAgc2l6ZV90IHN0YWNrX3NpemU7CisgIGNoYXIgKnN0YWNrX2Jhc2U7CisKKyAgS0FfVFJBQ0UoCisgICAgICAxMDAwLAorICAgICAgKCIqKiogX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWQ6IGVudGVyaW5nLCBucHJvYz0lZCAgYWxsX25wcm9jPSVkXG4iLAorICAgICAgIF9fa21wX250aCwgX19rbXBfYWxsX250aCkpOworCisgIC8qIEpQSCAtIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBfX2ttcGNfZW5kKDApIGlzIGNhbGxlZCBpbW1lZGlhdGVseSBwcmlvciB0bworICAgICBhIHBhcmFsbGVsIHJlZ2lvbiwgbWFkZSBpdCByZXR1cm4gS01QX0dUSURfRE5FIHRvIGZvcmNlIHNlcmlhbF9pbml0aWFsaXplCisgICAgIGJ5IGNhbGxlci4gSGFkIHRvIGhhbmRsZSBLTVBfR1RJRF9ETkUgYXQgYWxsIGNhbGwtc2l0ZXMsIG9yIGVsc2UgZ3VhcmFudGVlCisgICAgIF9fa21wX2luaXRfZ3RpZCBmb3IgdGhpcyB0byB3b3JrLiAqLworCisgIGlmICghVENSXzQoX19rbXBfaW5pdF9ndGlkKSkKKyAgICByZXR1cm4gS01QX0dUSURfRE5FOworCisjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgaWYgKFRDUl80KF9fa21wX2d0aWRfbW9kZSkgPj0gMykgeworICAgIEtBX1RSQUNFKDEwMDAsICgiKioqIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkOiB1c2luZyBUREFUQVxuIikpOworICAgIHJldHVybiBfX2ttcF9ndGlkOworICB9CisjZW5kaWYKKyAgaWYgKFRDUl80KF9fa21wX2d0aWRfbW9kZSkgPj0gMikgeworICAgIEtBX1RSQUNFKDEwMDAsICgiKioqIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkOiB1c2luZyBrZXllZCBUTFNcbiIpKTsKKyAgICByZXR1cm4gX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKTsKKyAgfQorICBLQV9UUkFDRSgxMDAwLCAoIioqKiBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZDogdXNpbmcgaW50ZXJuYWwgYWxnLlxuIikpOworCisgIHN0YWNrX2FkZHIgPSAoY2hhciAqKSZzdGFja19kYXRhOworICBvdGhlcl90aHJlYWRzID0gX19rbXBfdGhyZWFkczsKKworICAvKiBBVFQ6IFRoZSBjb2RlIGJlbG93IGlzIGEgc291cmNlIG9mIHBvdGVudGlhbCBidWdzIGR1ZSB0byB1bnN5bmNocm9uaXplZAorICAgICBhY2Nlc3MgdG8gX19rbXBfdGhyZWFkcyBhcnJheS4gRm9yIGV4YW1wbGU6CisgICAgIDEuIEN1cnJlbnQgdGhyZWFkIGxvYWRzIG90aGVyX3RocmVhZHNbaV0gdG8gdGhyIGFuZCBjaGVja3MgaXQsIGl0IGlzCisgICAgICAgIG5vbi1OVUxMLgorICAgICAyLiBDdXJyZW50IHRocmVhZCBpcyBzdXNwZW5kZWQgYnkgT1MuCisgICAgIDMuIEFub3RoZXIgdGhyZWFkIHVucmVnaXN0ZXJzIGFuZCBmaW5pc2hlcyAoZGVidWcgdmVyc2lvbnMgb2YgZnJlZSgpCisgICAgICAgIG1heSBmaWxsIG1lbW9yeSB3aXRoIHNvbWV0aGluZyBsaWtlIDB4RUYpLgorICAgICA0LiBDdXJyZW50IHRocmVhZCBpcyByZXN1bWVkLgorICAgICA1LiBDdXJyZW50IHRocmVhZCByZWFkcyBqdW5rIGZyb20gKnRoci4KKyAgICAgVE9ETzogRml4IGl0LiAgLS1sbiAgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgaSsrKSB7CisKKyAgICBrbXBfaW5mb190ICp0aHIgPSAoa21wX2luZm9fdCAqKVRDUl9TWU5DX1BUUihvdGhlcl90aHJlYWRzW2ldKTsKKyAgICBpZiAoIXRocikKKyAgICAgIGNvbnRpbnVlOworCisgICAgc3RhY2tfc2l6ZSA9IChzaXplX3QpVENSX1BUUih0aHItPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplKTsKKyAgICBzdGFja19iYXNlID0gKGNoYXIgKilUQ1JfUFRSKHRoci0+dGgudGhfaW5mby5kcy5kc19zdGFja2Jhc2UpOworCisgICAgLyogc3RhY2sgZ3Jvd3MgZG93biAtLSBzZWFyY2ggdGhyb3VnaCBhbGwgb2YgdGhlIGFjdGl2ZSB0aHJlYWRzICovCisKKyAgICBpZiAoc3RhY2tfYWRkciA8PSBzdGFja19iYXNlKSB7CisgICAgICBzaXplX3Qgc3RhY2tfZGlmZiA9IHN0YWNrX2Jhc2UgLSBzdGFja19hZGRyOworCisgICAgICBpZiAoc3RhY2tfZGlmZiA8PSBzdGFja19zaXplKSB7CisgICAgICAgIC8qIFRoZSBvbmx5IHdheSB3ZSBjYW4gYmUgY2xvc2VyIHRoYW4gdGhlIGFsbG9jYXRlZCAqLworICAgICAgICAvKiBzdGFjayBzaXplIGlzIGlmIHdlIGFyZSBydW5uaW5nIG9uIHRoaXMgdGhyZWFkLiAqLworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCkgPT0gaSk7CisgICAgICAgIHJldHVybiBpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIGdldCBzcGVjaWZpYyB0byB0cnkgYW5kIGRldGVybWluZSBvdXIgZ3RpZCAqLworICBLQV9UUkFDRSgxMDAwLAorICAgICAgICAgICAoIioqKiBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZDogaW50ZXJuYWwgYWxnLiBmYWlsZWQgdG8gZmluZCAiCisgICAgICAgICAgICAidGhyZWFkLCB1c2luZyBUTFNcbiIpKTsKKyAgaSA9IF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCk7CisKKyAgLypmcHJpbnRmKCBzdGRlcnIsICI9PT0gJWRcbiIsIGkgKTsgICovIC8qIEdST08gKi8KKworICAvKiBpZiB3ZSBoYXZuJ3QgYmVlbiBhc3NpZ25lZCBhIGd0aWQsIHRoZW4gcmV0dXJuIGNvZGUgKi8KKyAgaWYgKGkgPCAwKQorICAgIHJldHVybiBpOworCisgIC8qIGR5bmFtaWNhbGx5IHVwZGF0ZWQgc3RhY2sgd2luZG93IGZvciB1YmVyIHRocmVhZHMgdG8gYXZvaWQgZ2V0X3NwZWNpZmljCisgICAgIGNhbGwgKi8KKyAgaWYgKCFUQ1JfNChvdGhlcl90aHJlYWRzW2ldLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrZ3JvdykpIHsKKyAgICBLTVBfRkFUQUwoU3RhY2tPdmVyZmxvdywgaSk7CisgIH0KKworICBzdGFja19iYXNlID0gKGNoYXIgKilvdGhlcl90aHJlYWRzW2ldLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZTsKKyAgaWYgKHN0YWNrX2FkZHIgPiBzdGFja19iYXNlKSB7CisgICAgVENXX1BUUihvdGhlcl90aHJlYWRzW2ldLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZSwgc3RhY2tfYWRkcik7CisgICAgVENXX1BUUihvdGhlcl90aHJlYWRzW2ldLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSwKKyAgICAgICAgICAgIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplICsgc3RhY2tfYWRkciAtCisgICAgICAgICAgICAgICAgc3RhY2tfYmFzZSk7CisgIH0gZWxzZSB7CisgICAgVENXX1BUUihvdGhlcl90aHJlYWRzW2ldLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSwKKyAgICAgICAgICAgIHN0YWNrX2Jhc2UgLSBzdGFja19hZGRyKTsKKyAgfQorCisgIC8qIFJlcHJpbnQgc3RhY2sgYm91bmRzIGZvciB1YmVybWFzdGVyIHNpbmNlIHRoZXkgaGF2ZSBiZWVuIHJlZmluZWQgKi8KKyAgaWYgKF9fa21wX3N0b3JhZ2VfbWFwKSB7CisgICAgY2hhciAqc3RhY2tfZW5kID0gKGNoYXIgKilvdGhlcl90aHJlYWRzW2ldLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZTsKKyAgICBjaGFyICpzdGFja19iZWcgPSBzdGFja19lbmQgLSBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZTsKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKGksIHN0YWNrX2JlZywgc3RhY2tfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhfJWQgc3RhY2sgKHJlZmluZW1lbnQpIiwgaSk7CisgIH0KKyAgcmV0dXJuIGk7Cit9CisKK2ludCBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZF9yZWcoKSB7CisgIGludCBndGlkOworCisgIGlmICghX19rbXBfaW5pdF9zZXJpYWwpIHsKKyAgICBndGlkID0gS01QX0dUSURfRE5FOworICB9IGVsc2UKKyNpZmRlZiBLTVBfVERBVEFfR1RJRAorICAgICAgaWYgKFRDUl80KF9fa21wX2d0aWRfbW9kZSkgPj0gMykgeworICAgIEtBX1RSQUNFKDEwMDAsICgiKioqIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkX3JlZzogdXNpbmcgVERBVEFcbiIpKTsKKyAgICBndGlkID0gX19rbXBfZ3RpZDsKKyAgfSBlbHNlCisjZW5kaWYKKyAgICAgIGlmIChUQ1JfNChfX2ttcF9ndGlkX21vZGUpID49IDIpIHsKKyAgICBLQV9UUkFDRSgxMDAwLCAoIioqKiBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZF9yZWc6IHVzaW5nIGtleWVkIFRMU1xuIikpOworICAgIGd0aWQgPSBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpOworICB9IGVsc2UgeworICAgIEtBX1RSQUNFKDEwMDAsCisgICAgICAgICAgICAgKCIqKiogX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWRfcmVnOiB1c2luZyBpbnRlcm5hbCBhbGcuXG4iKSk7CisgICAgZ3RpZCA9IF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkKCk7CisgIH0KKworICAvKiB3ZSBtdXN0IGJlIGEgbmV3IHViZXIgbWFzdGVyIHNpYmxpbmcgdGhyZWFkICovCisgIGlmIChndGlkID09IEtNUF9HVElEX0RORSkgeworICAgIEtBX1RSQUNFKDEwLAorICAgICAgICAgICAgICgiX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWRfcmVnOiBFbmNvdW50ZXJlZCBuZXcgcm9vdCB0aHJlYWQuICIKKyAgICAgICAgICAgICAgIlJlZ2lzdGVyaW5nIGEgbmV3IGd0aWQuXG4iKSk7CisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jaygmX19rbXBfaW5pdHpfbG9jayk7CisgICAgaWYgKCFfX2ttcF9pbml0X3NlcmlhbCkgeworICAgICAgX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgICAgIGd0aWQgPSBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpOworICAgIH0gZWxzZSB7CisgICAgICBndGlkID0gX19rbXBfcmVnaXN0ZXJfcm9vdChGQUxTRSk7CisgICAgfQorICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJl9fa21wX2luaXR6X2xvY2spOworICAgIC8qX19rbXBfcHJpbnRmKCAiKysrICVkXG4iLCBndGlkICk7ICovIC8qIEdST08gKi8KKyAgfQorCisgIEtNUF9ERUJVR19BU1NFUlQoZ3RpZCA+PSAwKTsKKworICByZXR1cm4gZ3RpZDsKK30KKworLyogY2FsbGVyIG11c3QgaG9sZCBmb3Jram9pbl9sb2NrICovCit2b2lkIF9fa21wX2NoZWNrX3N0YWNrX292ZXJsYXAoa21wX2luZm9fdCAqdGgpIHsKKyAgaW50IGY7CisgIGNoYXIgKnN0YWNrX2JlZyA9IE5VTEw7CisgIGNoYXIgKnN0YWNrX2VuZCA9IE5VTEw7CisgIGludCBndGlkOworCisgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2NoZWNrX3N0YWNrX292ZXJsYXA6IGNhbGxlZFxuIikpOworICBpZiAoX19rbXBfc3RvcmFnZV9tYXApIHsKKyAgICBzdGFja19lbmQgPSAoY2hhciAqKXRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZTsKKyAgICBzdGFja19iZWcgPSBzdGFja19lbmQgLSB0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemU7CisKKyAgICBndGlkID0gX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aCk7CisKKyAgICBpZiAoZ3RpZCA9PSBLTVBfR1RJRF9NT05JVE9SKSB7CisgICAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKAorICAgICAgICAgIGd0aWQsIHN0YWNrX2JlZywgc3RhY2tfZW5kLCB0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUsCisgICAgICAgICAgInRoXyVzIHN0YWNrICglcykiLCAibW9uIiwKKyAgICAgICAgICAodGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tncm93KSA/ICJpbml0aWFsIiA6ICJhY3R1YWwiKTsKKyAgICB9IGVsc2UgeworICAgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCgKKyAgICAgICAgICBndGlkLCBzdGFja19iZWcsIHN0YWNrX2VuZCwgdGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplLAorICAgICAgICAgICJ0aF8lZCBzdGFjayAoJXMpIiwgZ3RpZCwKKyAgICAgICAgICAodGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tncm93KSA/ICJpbml0aWFsIiA6ICJhY3R1YWwiKTsKKyAgICB9CisgIH0KKworICAvKiBObyBwb2ludCBpbiBjaGVja2luZyB1YmVybWFzdGVyIHRocmVhZHMgc2luY2UgdGhleSB1c2UgcmVmaW5lbWVudCBhbmQKKyAgICogY2Fubm90IG92ZXJsYXAgKi8KKyAgZ3RpZCA9IF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGgpOworICBpZiAoX19rbXBfZW52X2NoZWNrcyA9PSBUUlVFICYmICFLTVBfVUJFUl9HVElEKGd0aWQpKSB7CisgICAgS0FfVFJBQ0UoMTAsCisgICAgICAgICAgICAgKCJfX2ttcF9jaGVja19zdGFja19vdmVybGFwOiBwZXJmb3JtaW5nIGV4dGVuc2l2ZSBjaGVja2luZ1xuIikpOworICAgIGlmIChzdGFja19iZWcgPT0gTlVMTCkgeworICAgICAgc3RhY2tfZW5kID0gKGNoYXIgKil0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2Jhc2U7CisgICAgICBzdGFja19iZWcgPSBzdGFja19lbmQgLSB0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemU7CisgICAgfQorCisgICAgZm9yIChmID0gMDsgZiA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7IGYrKykgeworICAgICAga21wX2luZm9fdCAqZl90aCA9IChrbXBfaW5mb190ICopVENSX1NZTkNfUFRSKF9fa21wX3RocmVhZHNbZl0pOworCisgICAgICBpZiAoZl90aCAmJiBmX3RoICE9IHRoKSB7CisgICAgICAgIGNoYXIgKm90aGVyX3N0YWNrX2VuZCA9CisgICAgICAgICAgICAoY2hhciAqKVRDUl9QVFIoZl90aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2Jhc2UpOworICAgICAgICBjaGFyICpvdGhlcl9zdGFja19iZWcgPQorICAgICAgICAgICAgb3RoZXJfc3RhY2tfZW5kIC0gKHNpemVfdClUQ1JfUFRSKGZfdGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplKTsKKyAgICAgICAgaWYgKChzdGFja19iZWcgPiBvdGhlcl9zdGFja19iZWcgJiYgc3RhY2tfYmVnIDwgb3RoZXJfc3RhY2tfZW5kKSB8fAorICAgICAgICAgICAgKHN0YWNrX2VuZCA+IG90aGVyX3N0YWNrX2JlZyAmJiBzdGFja19lbmQgPCBvdGhlcl9zdGFja19lbmQpKSB7CisKKyAgICAgICAgICAvKiBQcmludCB0aGUgb3RoZXIgc3RhY2sgdmFsdWVzIGJlZm9yZSB0aGUgYWJvcnQgKi8KKyAgICAgICAgICBpZiAoX19rbXBfc3RvcmFnZV9tYXApCisgICAgICAgICAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKAorICAgICAgICAgICAgICAgIC0xLCBvdGhlcl9zdGFja19iZWcsIG90aGVyX3N0YWNrX2VuZCwKKyAgICAgICAgICAgICAgICAoc2l6ZV90KVRDUl9QVFIoZl90aC0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUpLAorICAgICAgICAgICAgICAgICJ0aF8lZCBzdGFjayAob3ZlcmxhcHBlZCkiLCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKGZfdGgpKTsKKworICAgICAgICAgIF9fa21wX21zZyhrbXBfbXNfZmF0YWwsIEtNUF9NU0coU3RhY2tPdmVybGFwKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0hOVChDaGFuZ2VTdGFja0xpbWl0KSwgX19rbXBfbXNnX251bGwpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2NoZWNrX3N0YWNrX292ZXJsYXA6IHJldHVybmluZ1xuIikpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBfX2ttcF9pbmZpbml0ZV9sb29wKHZvaWQpIHsKKyAgc3RhdGljIGludCBkb25lID0gRkFMU0U7CisKKyAgd2hpbGUgKCFkb25lKSB7CisgICAgS01QX1lJRUxEKDEpOworICB9Cit9CisKKyNkZWZpbmUgTUFYX01FU1NBR0UgNTEyCisKK3ZvaWQgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZChpbnQgZ3RpZCwgdm9pZCAqcDEsIHZvaWQgKnAyLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0ICpmb3JtYXQsIC4uLikgeworICBjaGFyIGJ1ZmZlcltNQVhfTUVTU0FHRV07CisgIHZhX2xpc3QgYXA7CisKKyAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisgIEtNUF9TTlBSSU5URihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiT01QIHN0b3JhZ2UgbWFwOiAlcCAlcCU4bHUgJXNcbiIsIHAxLAorICAgICAgICAgICAgICAgcDIsICh1bnNpZ25lZCBsb25nKXNpemUsIGZvcm1hdCk7CisgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soJl9fa21wX3N0ZGlvX2xvY2spOworICBfX2ttcF92cHJpbnRmKGttcF9lcnIsIGJ1ZmZlciwgYXApOworI2lmIEtNUF9QUklOVF9EQVRBX1BMQUNFTUVOVAorICBpbnQgbm9kZTsKKyAgaWYgKGd0aWQgPj0gMCkgeworICAgIGlmIChwMSA8PSBwMiAmJiAoY2hhciAqKXAyIC0gKGNoYXIgKilwMSA9PSBzaXplKSB7CisgICAgICBpZiAoX19rbXBfc3RvcmFnZV9tYXBfdmVyYm9zZSkgeworICAgICAgICBub2RlID0gX19rbXBfZ2V0X2hvc3Rfbm9kZShwMSk7CisgICAgICAgIGlmIChub2RlIDwgMCkgLyogZG9lc24ndCB3b3JrLCBzbyBkb24ndCB0cnkgdGhpcyBuZXh0IHRpbWUgKi8KKyAgICAgICAgICBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlID0gRkFMU0U7CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGNoYXIgKmxhc3Q7CisgICAgICAgICAgaW50IGxhc3ROb2RlOworICAgICAgICAgIGludCBsb2NhbFByb2MgPSBfX2ttcF9nZXRfY3B1X2Zyb21fZ3RpZChndGlkKTsKKworICAgICAgICAgIGNvbnN0IGludCBwYWdlX3NpemUgPSBLTVBfR0VUX1BBR0VfU0laRSgpOworCisgICAgICAgICAgcDEgPSAodm9pZCAqKSgoc2l6ZV90KXAxICYgfigoc2l6ZV90KXBhZ2Vfc2l6ZSAtIDEpKTsKKyAgICAgICAgICBwMiA9ICh2b2lkICopKCgoc2l6ZV90KXAyIC0gMSkgJiB+KChzaXplX3QpcGFnZV9zaXplIC0gMSkpOworICAgICAgICAgIGlmIChsb2NhbFByb2MgPj0gMCkKKyAgICAgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCIgIEdUSUQgJWQgbG9jYWxOb2RlICVkXG4iLCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxQcm9jID4+IDEpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCIgIEdUSUQgJWRcbiIsIGd0aWQpOworI2lmIEtNUF9VU0VfUFJDVEwKKyAgICAgICAgICAvKiBUaGUgbW9yZSBlbGFib3JhdGUgZm9ybWF0IGlzIGRpc2FibGVkIGZvciBub3cgYmVjYXVzZSBvZiB0aGUgcHJjdGwKKyAgICAgICAgICAgKiBoYW5naW5nIGJ1Zy4gKi8KKyAgICAgICAgICBkbyB7CisgICAgICAgICAgICBsYXN0ID0gcDE7CisgICAgICAgICAgICBsYXN0Tm9kZSA9IG5vZGU7CisgICAgICAgICAgICAvKiBUaGlzIGxvb3AgY29sbGF0ZXMgYWRqYWNlbnQgcGFnZXMgd2l0aCB0aGUgc2FtZSBob3N0IG5vZGUuICovCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgIChjaGFyICopcDEgKz0gcGFnZV9zaXplOworICAgICAgICAgICAgfSB3aGlsZSAocDEgPD0gcDIgJiYgKG5vZGUgPSBfX2ttcF9nZXRfaG9zdF9ub2RlKHAxKSkgPT0gbGFzdE5vZGUpOworICAgICAgICAgICAgX19rbXBfcHJpbnRmX25vX2xvY2soIiAgICAlcC0lcCBtZW1Ob2RlICVkXG4iLCBsYXN0LCAoY2hhciAqKXAxIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3ROb2RlKTsKKyAgICAgICAgICB9IHdoaWxlIChwMSA8PSBwMik7CisjZWxzZQorICAgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCIgICAgJXAtJXAgbWVtTm9kZSAlZFxuIiwgcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilwMSArIChwYWdlX3NpemUgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9nZXRfaG9zdF9ub2RlKHAxKSk7CisgICAgICAgICAgaWYgKHAxIDwgcDIpIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCIgICAgJXAtJXAgbWVtTm9kZSAlZFxuIiwgcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXAyICsgKHBhZ2Vfc2l6ZSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ2V0X2hvc3Rfbm9kZShwMikpOworICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlCisgICAgICBfX2ttcF9wcmludGZfbm9fbG9jaygiICAlc1xuIiwgS01QX0kxOE5fU1RSKFN0b3JhZ2VNYXBXYXJuaW5nKSk7CisgIH0KKyNlbmRpZiAvKiBLTVBfUFJJTlRfREFUQV9QTEFDRU1FTlQgKi8KKyAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jaygmX19rbXBfc3RkaW9fbG9jayk7Cit9CisKK3ZvaWQgX19rbXBfd2FybihjaGFyIGNvbnN0ICpmb3JtYXQsIC4uLikgeworICBjaGFyIGJ1ZmZlcltNQVhfTUVTU0FHRV07CisgIHZhX2xpc3QgYXA7CisKKyAgaWYgKF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID09IGttcF93YXJuaW5nc19vZmYpIHsKKyAgICByZXR1cm47CisgIH0KKworICB2YV9zdGFydChhcCwgZm9ybWF0KTsKKworICBLTVBfU05QUklOVEYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIk9NUCB3YXJuaW5nOiAlc1xuIiwgZm9ybWF0KTsKKyAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jaygmX19rbXBfc3RkaW9fbG9jayk7CisgIF9fa21wX3ZwcmludGYoa21wX2VyciwgYnVmZmVyLCBhcCk7CisgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJl9fa21wX3N0ZGlvX2xvY2spOworCisgIHZhX2VuZChhcCk7Cit9CisKK3ZvaWQgX19rbXBfYWJvcnRfcHJvY2VzcygpIHsKKyAgLy8gTGF0ZXIgdGhyZWFkcyBtYXkgc3RhbGwgaGVyZSwgYnV0IHRoYXQncyBvayBiZWNhdXNlIGFib3J0KCkgd2lsbCBraWxsIHRoZW0uCisgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soJl9fa21wX2V4aXRfbG9jayk7CisKKyAgaWYgKF9fa21wX2RlYnVnX2J1ZikgeworICAgIF9fa21wX2R1bXBfZGVidWdfYnVmZmVyKCk7CisgIH07IC8vIGlmCisKKyAgaWYgKEtNUF9PU19XSU5ET1dTKSB7CisgICAgLy8gTGV0IG90aGVyIHRocmVhZHMga25vdyBvZiBhYm5vcm1hbCB0ZXJtaW5hdGlvbiBhbmQgcHJldmVudCBkZWFkbG9jaworICAgIC8vIGlmIGFib3J0IGhhcHBlbmVkIGR1cmluZyBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIG9yIHNodXRkb3duCisgICAgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCA9IFNJR0FCUlQ7CisKKyAgICAvKiBPbiBXaW5kb3dzKiBPUyBieSBkZWZhdWx0IGFib3J0KCkgY2F1c2VzIHBvcC11cCBlcnJvciBib3gsIHdoaWNoIHN0YWxscworICAgICAgIG5pZ2h0bHkgdGVzdGluZy4gVW5mb3J0dW5hdGVseSwgd2UgY2Fubm90IHJlbGlhYmx5IHN1cHByZXNzIHBvcC11cCBlcnJvcgorICAgICAgIGJveGVzLiBfc2V0X2Fib3J0X2JlaGF2aW9yKCkgd29ya3Mgd2VsbCwgYnV0IHRoaXMgZnVuY3Rpb24gaXMgbm90CisgICAgICAgYXZhaWxhYmxlIGluIFZTNyAodGhpcyBpcyBub3QgcHJvYmxlbSBmb3IgRExMLCBidXQgaXQgaXMgYSBwcm9ibGVtIGZvcgorICAgICAgIHN0YXRpYyBPcGVuTVAgUlRMKS4gU2V0RXJyb3JNb2RlIChhbmQgc28sIHRpbWVsaW1pdCB1dGlsaXR5KSBkb2VzIG5vdAorICAgICAgIGhlbHAsIGF0IGxlYXN0IGluIHNvbWUgdmVyc2lvbnMgb2YgTVMgQyBSVEwuCisKKyAgICAgICBJdCBzZWVtcyBmb2xsb3dpbmcgc2VxdWVuY2UgaXMgdGhlIG9ubHkgd2F5IHRvIHNpbXVsYXRlIGFib3J0KCkgYW5kCisgICAgICAgYXZvaWQgcG9wLXVwIGVycm9yIGJveC4gKi8KKyAgICByYWlzZShTSUdBQlJUKTsKKyAgICBfZXhpdCgzKTsgLy8gSnVzdCBpbiBjYXNlLCBpZiBzaWduYWwgaWdub3JlZCwgZXhpdCBhbnl3YXkuCisgIH0gZWxzZSB7CisgICAgYWJvcnQoKTsKKyAgfTsgLy8gaWYKKworICBfX2ttcF9pbmZpbml0ZV9sb29wKCk7CisgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJl9fa21wX2V4aXRfbG9jayk7CisKK30gLy8gX19rbXBfYWJvcnRfcHJvY2VzcworCit2b2lkIF9fa21wX2Fib3J0X3RocmVhZCh2b2lkKSB7CisgIC8vIFRPRE86IEVsaW1pbmF0ZSBnX2Fib3J0IGdsb2JhbCB2YXJpYWJsZSBhbmQgdGhpcyBmdW5jdGlvbi4KKyAgLy8gSW4gY2FzZSBvZiBhYm9ydCBqdXN0IGNhbGwgYWJvcnQoKSwgaXQgd2lsbCBraWxsIGFsbCB0aGUgdGhyZWFkcy4KKyAgX19rbXBfaW5maW5pdGVfbG9vcCgpOworfSAvLyBfX2ttcF9hYm9ydF90aHJlYWQKKworLyogUHJpbnQgb3V0IHRoZSBzdG9yYWdlIG1hcCBmb3IgdGhlIG1ham9yIGttcF9pbmZvX3QgdGhyZWFkIGRhdGEgc3RydWN0dXJlcworICAgdGhhdCBhcmUgYWxsb2NhdGVkIHRvZ2V0aGVyLiAqLworCitzdGF0aWMgdm9pZCBfX2ttcF9wcmludF90aHJlYWRfc3RvcmFnZV9tYXAoa21wX2luZm9fdCAqdGhyLCBpbnQgZ3RpZCkgeworICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKGd0aWQsIHRociwgdGhyICsgMSwgc2l6ZW9mKGttcF9pbmZvX3QpLCAidGhfJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQpOworCisgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoZ3RpZCwgJnRoci0+dGgudGhfaW5mbywgJnRoci0+dGgudGhfdGVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa21wX2Rlc2NfdCksICJ0aF8lZC50aF9pbmZvIiwgZ3RpZCk7CisKKyAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZChndGlkLCAmdGhyLT50aC50aF9sb2NhbCwgJnRoci0+dGgudGhfcHJpX2hlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF9sb2NhbF90KSwgInRoXyVkLnRoX2xvY2FsIiwgZ3RpZCk7CisKKyAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCgKKyAgICAgIGd0aWQsICZ0aHItPnRoLnRoX2JhclswXSwgJnRoci0+dGgudGhfYmFyW2JzX2xhc3RfYmFycmllcl0sCisgICAgICBzaXplb2Yoa21wX2JhbGlnbl90KSAqIGJzX2xhc3RfYmFycmllciwgInRoXyVkLnRoX2JhciIsIGd0aWQpOworCisgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoZ3RpZCwgJnRoci0+dGgudGhfYmFyW2JzX3BsYWluX2JhcnJpZXJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHItPnRoLnRoX2Jhcltic19wbGFpbl9iYXJyaWVyICsgMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF9iYWxpZ25fdCksICJ0aF8lZC50aF9iYXJbcGxhaW5dIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkKTsKKworICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKGd0aWQsICZ0aHItPnRoLnRoX2Jhcltic19mb3Jram9pbl9iYXJyaWVyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhyLT50aC50aF9iYXJbYnNfZm9ya2pvaW5fYmFycmllciArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfYmFsaWduX3QpLCAidGhfJWQudGhfYmFyW2Zvcmtqb2luXSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCk7CisKKyNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKGd0aWQsICZ0aHItPnRoLnRoX2Jhcltic19yZWR1Y3Rpb25fYmFycmllcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoci0+dGgudGhfYmFyW2JzX3JlZHVjdGlvbl9iYXJyaWVyICsgMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF9iYWxpZ25fdCksICJ0aF8lZC50aF9iYXJbcmVkdWN0aW9uXSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCk7CisjZW5kaWYgLy8gS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKK30KKworLyogUHJpbnQgb3V0IHRoZSBzdG9yYWdlIG1hcCBmb3IgdGhlIG1ham9yIGttcF90ZWFtX3QgdGVhbSBkYXRhIHN0cnVjdHVyZXMKKyAgIHRoYXQgYXJlIGFsbG9jYXRlZCB0b2dldGhlci4gKi8KKworc3RhdGljIHZvaWQgX19rbXBfcHJpbnRfdGVhbV9zdG9yYWdlX21hcChjb25zdCBjaGFyICpoZWFkZXIsIGttcF90ZWFtX3QgKnRlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0ZWFtX2lkLCBpbnQgbnVtX3RocikgeworICBpbnQgbnVtX2Rpc3BfYnVmZiA9IHRlYW0tPnQudF9tYXhfbnByb2MgPiAxID8gX19rbXBfZGlzcGF0Y2hfbnVtX2J1ZmZlcnMgOiAyOworICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKC0xLCB0ZWFtLCB0ZWFtICsgMSwgc2l6ZW9mKGttcF90ZWFtX3QpLCAiJXNfJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciwgdGVhbV9pZCk7CisKKyAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCgtMSwgJnRlYW0tPnQudF9iYXJbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlYW0tPnQudF9iYXJbYnNfbGFzdF9iYXJyaWVyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa21wX2JhbGlnbl90ZWFtX3QpICogYnNfbGFzdF9iYXJyaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlc18lZC50X2JhciIsIGhlYWRlciwgdGVhbV9pZCk7CisKKyAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCgtMSwgJnRlYW0tPnQudF9iYXJbYnNfcGxhaW5fYmFycmllcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlYW0tPnQudF9iYXJbYnNfcGxhaW5fYmFycmllciArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfYmFsaWduX3RlYW1fdCksICIlc18lZC50X2JhcltwbGFpbl0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciwgdGVhbV9pZCk7CisKKyAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCgtMSwgJnRlYW0tPnQudF9iYXJbYnNfZm9ya2pvaW5fYmFycmllcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlYW0tPnQudF9iYXJbYnNfZm9ya2pvaW5fYmFycmllciArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfYmFsaWduX3RlYW1fdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzXyVkLnRfYmFyW2Zvcmtqb2luXSIsIGhlYWRlciwgdGVhbV9pZCk7CisKKyNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKC0xLCAmdGVhbS0+dC50X2Jhcltic19yZWR1Y3Rpb25fYmFycmllcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlYW0tPnQudF9iYXJbYnNfcmVkdWN0aW9uX2JhcnJpZXIgKyAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa21wX2JhbGlnbl90ZWFtX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlc18lZC50X2JhcltyZWR1Y3Rpb25dIiwgaGVhZGVyLCB0ZWFtX2lkKTsKKyNlbmRpZiAvLyBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorCisgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoCisgICAgICAtMSwgJnRlYW0tPnQudF9kaXNwYXRjaFswXSwgJnRlYW0tPnQudF9kaXNwYXRjaFtudW1fdGhyXSwKKyAgICAgIHNpemVvZihrbXBfZGlzcF90KSAqIG51bV90aHIsICIlc18lZC50X2Rpc3BhdGNoIiwgaGVhZGVyLCB0ZWFtX2lkKTsKKworICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKAorICAgICAgLTEsICZ0ZWFtLT50LnRfdGhyZWFkc1swXSwgJnRlYW0tPnQudF90aHJlYWRzW251bV90aHJdLAorICAgICAgc2l6ZW9mKGttcF9pbmZvX3QgKikgKiBudW1fdGhyLCAiJXNfJWQudF90aHJlYWRzIiwgaGVhZGVyLCB0ZWFtX2lkKTsKKworICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKC0xLCAmdGVhbS0+dC50X2Rpc3BfYnVmZmVyWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZWFtLT50LnRfZGlzcF9idWZmZXJbbnVtX2Rpc3BfYnVmZl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGRpc3BhdGNoX3NoYXJlZF9pbmZvX3QpICogbnVtX2Rpc3BfYnVmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXNfJWQudF9kaXNwX2J1ZmZlciIsIGhlYWRlciwgdGVhbV9pZCk7CisKKyAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCgtMSwgJnRlYW0tPnQudF90YXNrcSwgJnRlYW0tPnQudF9jb3B5cHJpdl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfdGFza3FfdCksICIlc18lZC50X3Rhc2txIiwgaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW1faWQpOworfQorCitzdGF0aWMgdm9pZCBfX2ttcF9pbml0X2FsbG9jYXRvcigpIHt9CitzdGF0aWMgdm9pZCBfX2ttcF9maW5pX2FsbG9jYXRvcigpIHt9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgS01QX0RZTkFNSUNfTElCCisjaWYgS01QX09TX1dJTkRPV1MKKworc3RhdGljIHZvaWQgX19rbXBfcmVzZXRfbG9jayhrbXBfYm9vdHN0cmFwX2xvY2tfdCAqbGNrKSB7CisgIC8vIFRPRE86IENoYW5nZSB0byBfX2ttcF9icmVha19ib290c3RyYXBfbG9jaygpLgorICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKGxjayk7IC8vIG1ha2UgdGhlIGxvY2sgcmVsZWFzZWQKK30KKworc3RhdGljIHZvaWQgX19rbXBfcmVzZXRfbG9ja3Nfb25fcHJvY2Vzc19kZXRhY2goaW50IGd0aWRfcmVxKSB7CisgIGludCBpOworICBpbnQgdGhyZWFkX2NvdW50OworCisgIC8vIFBST0NFU1NfREVUQUNIIGlzIGV4cGVjdGVkIHRvIGJlIGNhbGxlZCBieSBhIHRocmVhZCB0aGF0IGV4ZWN1dGVzCisgIC8vIFByb2Nlc3NFeGl0KCkgb3IgRnJlZUxpYnJhcnkoKS4gT1MgdGVybWluYXRlcyBvdGhlciB0aHJlYWRzIChleGNlcHQgdGhlIG9uZQorICAvLyBjYWxsaW5nIFByb2Nlc3NFeGl0IG9yIEZyZWVMaWJyYXJ5KS4gU28sIGl0IG1pZ2h0IGJlIHNhZmUgdG8gYWNjZXNzIHRoZQorICAvLyBfX2ttcF90aHJlYWRzW10gd2l0aG91dCB0YWtpbmcgdGhlIGZvcmtqb2luX2xvY2suIEhvd2V2ZXIsIGluIGZhY3QsIHNvbWUKKyAgLy8gdGhyZWFkcyBjYW4gYmUgc3RpbGwgYWxpdmUgaGVyZSwgYWx0aG91Z2ggYmVpbmcgYWJvdXQgdG8gYmUgdGVybWluYXRlZC4gVGhlCisgIC8vIHRocmVhZHMgaW4gdGhlIGFycmF5IHdpdGggZHNfdGhyZWFkPT0wIGFyZSBtb3N0IHN1c3BpY2lvdXMuIEFjdHVhbGx5LCBpdAorICAvLyBjYW4gYmUgbm90IHNhZmUgdG8gYWNjZXNzIHRoZSBfX2ttcF90aHJlYWRzW10uCisKKyAgLy8gVE9ETzogZG9lcyBpdCBtYWtlIHNlbnNlIHRvIGNoZWNrIF9fa21wX3Jvb3RzW10gPworCisgIC8vIExldCdzIGNoZWNrIHRoYXQgdGhlcmUgYXJlIG5vIG90aGVyIGFsaXZlIHRocmVhZHMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBPTVAKKyAgLy8gbGliLgorICB3aGlsZSAoMSkgeworICAgIHRocmVhZF9jb3VudCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7ICsraSkgeworICAgICAgaWYgKCFfX2ttcF90aHJlYWRzKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfdGhyZWFkc1tpXTsKKyAgICAgIGlmICh0aCA9PSBOVUxMKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGludCBndGlkID0gdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZDsKKyAgICAgIGlmIChndGlkID09IGd0aWRfcmVxKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGlmIChndGlkIDwgMCkKKyAgICAgICAgY29udGludWU7CisgICAgICBEV09SRCBleGl0X3ZhbDsKKyAgICAgIGludCBhbGl2ZSA9IF9fa21wX2lzX3RocmVhZF9hbGl2ZSh0aCwgJmV4aXRfdmFsKTsKKyAgICAgIGlmIChhbGl2ZSkgeworICAgICAgICArK3RocmVhZF9jb3VudDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHRocmVhZF9jb3VudCA9PSAwKQorICAgICAgYnJlYWs7IC8vIHN1Y2Nlc3MKKyAgfQorCisgIC8vIEFzc3VtZSB0aGF0IEknbSBhbG9uZS4gTm93IGl0IG1pZ2h0IGJlIHNhZmUgdG8gY2hlY2sgYW5kIHJlc2V0IGxvY2tzLgorICAvLyBfX2ttcF9mb3Jram9pbl9sb2NrIGFuZCBfX2ttcF9zdGRpb19sb2NrIGFyZSBleHBlY3RlZCB0byBiZSByZXNldC4KKyAgX19rbXBfcmVzZXRfbG9jaygmX19rbXBfZm9ya2pvaW5fbG9jayk7CisjaWZkZWYgS01QX0RFQlVHCisgIF9fa21wX3Jlc2V0X2xvY2soJl9fa21wX3N0ZGlvX2xvY2spOworI2VuZGlmIC8vIEtNUF9ERUJVRworfQorCitCT09MIFdJTkFQSSBEbGxNYWluKEhJTlNUQU5DRSBoSW5zdERMTCwgRFdPUkQgZmR3UmVhc29uLCBMUFZPSUQgbHBSZXNlcnZlZCkgeworICAvL19fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisKKyAgc3dpdGNoIChmZHdSZWFzb24pIHsKKworICBjYXNlIERMTF9QUk9DRVNTX0FUVEFDSDoKKyAgICBLQV9UUkFDRSgxMCwgKCJEbGxNYWluOiBQUk9DRVNTX0FUVEFDSFxuIikpOworCisgICAgcmV0dXJuIFRSVUU7CisKKyAgY2FzZSBETExfUFJPQ0VTU19ERVRBQ0g6CisgICAgS0FfVFJBQ0UoMTAsICgiRGxsTWFpbjogUFJPQ0VTU19ERVRBQ0ggVCMlZFxuIiwgX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKSkpOworCisgICAgaWYgKGxwUmVzZXJ2ZWQgIT0gTlVMTCkgeworICAgICAgLy8gbHBSZXNlcnZlZCBpcyB1c2VkIGZvciB0ZWxsaW5nIHRoZSBkaWZmZXJlbmNlOgorICAgICAgLy8gICBscFJlc2VydmVkID09IE5VTEwgd2hlbiBGcmVlTGlicmFyeSgpIHdhcyBjYWxsZWQsCisgICAgICAvLyAgIGxwUmVzZXJ2ZWQgIT0gTlVMTCB3aGVuIHRoZSBwcm9jZXNzIHRlcm1pbmF0ZXMuCisgICAgICAvLyBXaGVuIEZyZWVMaWJyYXJ5KCkgaXMgY2FsbGVkLCB3b3JrZXIgdGhyZWFkcyByZW1haW4gYWxpdmUuIFNvIHRoZXkgd2lsbAorICAgICAgLy8gcmVsZWFzZSB0aGUgZm9ya2pvaW4gbG9jayBieSB0aGVtc2VsdmVzLiBXaGVuIHRoZSBwcm9jZXNzIHRlcm1pbmF0ZXMsCisgICAgICAvLyB3b3JrZXIgdGhyZWFkcyBkaXNhcHBlYXIgdHJpZ2dlcmluZyB0aGUgcHJvYmxlbSBvZiB1bnJlbGVhc2VkIGZvcmtqb2luCisgICAgICAvLyBsb2NrIGFzIGRlc2NyaWJlZCBiZWxvdy4KKworICAgICAgLy8gQSB3b3JrZXIgdGhyZWFkIGNhbiB0YWtlIHRoZSBmb3Jram9pbiBsb2NrLiBUaGUgcHJvYmxlbSBjb21lcyB1cCBpZgorICAgICAgLy8gdGhhdCB3b3JrZXIgdGhyZWFkIGJlY29tZXMgZGVhZCBiZWZvcmUgaXQgcmVsZWFzZXMgdGhlIGZvcmtqb2luIGxvY2suCisgICAgICAvLyBUaGUgZm9ya2pvaW4gbG9jayByZW1haW5zIHRha2VuLCB3aGlsZSB0aGUgdGhyZWFkIGV4ZWN1dGluZworICAgICAgLy8gRGxsTWFpbigpLT5QUk9DRVNTX0RFVEFDSC0+X19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnkoKSBiZWxvdyB3aWxsIHRyeQorICAgICAgLy8gdG8gdGFrZSB0aGUgZm9ya2pvaW4gbG9jayBhbmQgd2lsbCBhbHdheXMgZmFpbCwgc28gdGhhdCB0aGUgYXBwbGljYXRpb24KKyAgICAgIC8vIHdpbGwgbmV2ZXIgZmluaXNoIFtub3JtYWxseV0uIFRoaXMgc2NlbmFyaW8gaXMgcG9zc2libGUgaWYKKyAgICAgIC8vIF9fa21wY19lbmQoKSBoYXMgbm90IGJlZW4gZXhlY3V0ZWQuIEl0IGxvb2tzIGxpa2UgaXQncyBub3QgYSBjb3JuZXIKKyAgICAgIC8vIGNhc2UsIGJ1dCBjb21tb24gY2FzZXM6CisgICAgICAvLyAtIHRoZSBtYWluIGZ1bmN0aW9uIHdhcyBjb21waWxlZCBieSBhbiBhbHRlcm5hdGl2ZSBjb21waWxlcjsKKyAgICAgIC8vIC0gdGhlIG1haW4gZnVuY3Rpb24gd2FzIGNvbXBpbGVkIGJ5IGljbCBidXQgd2l0aG91dCAvUW9wZW5tcAorICAgICAgLy8gICAoYXBwbGljYXRpb24gd2l0aCBwbHVnaW5zKTsKKyAgICAgIC8vIC0gYXBwbGljYXRpb24gdGVybWluYXRlcyBieSBjYWxsaW5nIEMgZXhpdCgpLCBGb3J0cmFuIENBTEwgRVhJVCgpIG9yCisgICAgICAvLyAgIEZvcnRyYW4gU1RPUC4KKyAgICAgIC8vIC0gYWxpdmUgZm9yZWlnbiB0aHJlYWQgcHJldmVudGVkIF9fa21wY19lbmQgZnJvbSBkb2luZyBjbGVhbnVwLgorICAgICAgLy8KKyAgICAgIC8vIFRoaXMgaXMgYSBoYWNrIHRvIHdvcmsgYXJvdW5kIHRoZSBwcm9ibGVtLgorICAgICAgLy8gVE9ETzogISEhIGZpZ3VyZSBvdXQgc29tZXRoaW5nIGJldHRlci4KKyAgICAgIF9fa21wX3Jlc2V0X2xvY2tzX29uX3Byb2Nlc3NfZGV0YWNoKF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCkpOworICAgIH0KKworICAgIF9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5KF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCkpOworCisgICAgcmV0dXJuIFRSVUU7CisKKyAgY2FzZSBETExfVEhSRUFEX0FUVEFDSDoKKyAgICBLQV9UUkFDRSgxMCwgKCJEbGxNYWluOiBUSFJFQURfQVRUQUNIXG4iKSk7CisKKyAgICAvKiBpZiB3ZSB3YW50IHRvIHJlZ2lzdGVyIG5ldyBzaWJsaW5ncyBhbGwgdGhlIHRpbWUgaGVyZSBjYWxsCisgICAgICogX19rbXBfZ2V0X2d0aWQoKTsgKi8KKyAgICByZXR1cm4gVFJVRTsKKworICBjYXNlIERMTF9USFJFQURfREVUQUNIOgorICAgIEtBX1RSQUNFKDEwLCAoIkRsbE1haW46IFRIUkVBRF9ERVRBQ0ggVCMlZFxuIiwgX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKSkpOworCisgICAgX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZChfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKyNlbmRpZiAvKiBLTVBfRFlOQU1JQ19MSUIgKi8KKworLyogQ2hhbmdlIHRoZSBsaWJyYXJ5IHR5cGUgdG8gInN0YXR1cyIgYW5kIHJldHVybiB0aGUgb2xkIHR5cGUgKi8KKy8qIGNhbGxlZCBmcm9tIHdpdGhpbiBpbml0aWFsaXphdGlvbiByb3V0aW5lcyB3aGVyZSBfX2ttcF9pbml0el9sb2NrIGlzIGhlbGQgKi8KK2ludCBfX2ttcF9jaGFuZ2VfbGlicmFyeShpbnQgc3RhdHVzKSB7CisgIGludCBvbGRfc3RhdHVzOworCisgIG9sZF9zdGF0dXMgPSBfX2ttcF95aWVsZF9pbml0ICYKKyAgICAgICAgICAgICAgIDE7IC8vIGNoZWNrIHdoZXRoZXIgS01QX0xJQlJBUlk9dGhyb3VnaHB1dCAoZXZlbiBpbml0IGNvdW50KQorCisgIGlmIChzdGF0dXMpIHsKKyAgICBfX2ttcF95aWVsZF9pbml0IHw9IDE7IC8vIHRocm91Z2hwdXQgPT4gdHVybmFyb3VuZCAob2RkIGluaXQgY291bnQpCisgIH0gZWxzZSB7CisgICAgX19rbXBfeWllbGRfaW5pdCAmPSB+MTsgLy8gdHVybmFyb3VuZCA9PiB0aHJvdWdocHV0IChldmVuIGluaXQgY291bnQpCisgIH0KKworICByZXR1cm4gb2xkX3N0YXR1czsgLy8gcmV0dXJuIHByZXZpb3VzIHNldHRpbmcgb2Ygd2hldGhlcgorICAvLyBLTVBfTElCUkFSWT10aHJvdWdocHV0Cit9CisKKy8qIF9fa21wX3BhcmFsbGVsX2RlbyAtLSBXYWl0IHVudGlsIGl0J3Mgb3VyIHR1cm4uICovCit2b2lkIF9fa21wX3BhcmFsbGVsX2RlbyhpbnQgKmd0aWRfcmVmLCBpbnQgKmNpZF9yZWYsIGlkZW50X3QgKmxvY19yZWYpIHsKKyAgaW50IGd0aWQgPSAqZ3RpZF9yZWY7CisjaWZkZWYgQlVJTERfUEFSQUxMRUxfT1JERVJFRAorICBrbXBfdGVhbV90ICp0ZWFtID0gX19rbXBfdGVhbV9mcm9tX2d0aWQoZ3RpZCk7CisjZW5kaWYgLyogQlVJTERfUEFSQUxMRUxfT1JERVJFRCAqLworCisgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICBpZiAoX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfcm9vdC0+ci5yX2FjdGl2ZSkKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgICAgX19rbXBfcHVzaF9zeW5jKGd0aWQsIGN0X29yZGVyZWRfaW5fcGFyYWxsZWwsIGxvY19yZWYsIE5VTEwsIDApOworI2Vsc2UKKyAgICAgIF9fa21wX3B1c2hfc3luYyhndGlkLCBjdF9vcmRlcmVkX2luX3BhcmFsbGVsLCBsb2NfcmVmLCBOVUxMKTsKKyNlbmRpZgorICB9CisjaWZkZWYgQlVJTERfUEFSQUxMRUxfT1JERVJFRAorICBpZiAoIXRlYW0tPnQudF9zZXJpYWxpemVkKSB7CisgICAgS01QX01CKCk7CisgICAgS01QX1dBSVRfWUlFTEQoJnRlYW0tPnQudF9vcmRlcmVkLmR0LnRfdmFsdWUsIF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCksCisgICAgICAgICAgICAgICAgICAgS01QX0VRLCBOVUxMKTsKKyAgICBLTVBfTUIoKTsKKyAgfQorI2VuZGlmIC8qIEJVSUxEX1BBUkFMTEVMX09SREVSRUQgKi8KK30KKworLyogX19rbXBfcGFyYWxsZWxfZHhvIC0tIFNpZ25hbCB0aGUgbmV4dCB0YXNrLiAqLwordm9pZCBfX2ttcF9wYXJhbGxlbF9keG8oaW50ICpndGlkX3JlZiwgaW50ICpjaWRfcmVmLCBpZGVudF90ICpsb2NfcmVmKSB7CisgIGludCBndGlkID0gKmd0aWRfcmVmOworI2lmZGVmIEJVSUxEX1BBUkFMTEVMX09SREVSRUQKKyAgaW50IHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCk7CisgIGttcF90ZWFtX3QgKnRlYW0gPSBfX2ttcF90ZWFtX2Zyb21fZ3RpZChndGlkKTsKKyNlbmRpZiAvKiBCVUlMRF9QQVJBTExFTF9PUkRFUkVEICovCisKKyAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgIGlmIChfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF9yb290LT5yLnJfYWN0aXZlKQorICAgICAgX19rbXBfcG9wX3N5bmMoZ3RpZCwgY3Rfb3JkZXJlZF9pbl9wYXJhbGxlbCwgbG9jX3JlZik7CisgIH0KKyNpZmRlZiBCVUlMRF9QQVJBTExFTF9PUkRFUkVECisgIGlmICghdGVhbS0+dC50X3NlcmlhbGl6ZWQpIHsKKyAgICBLTVBfTUIoKTsgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIC8qIHVzZSB0aGUgdGlkIG9mIHRoZSBuZXh0IHRocmVhZCBpbiB0aGlzIHRlYW0gKi8KKyAgICAvKiBUT0RPIHJlcGxhY2Ugd2l0aCBnZW5lcmFsIHJlbGVhc2UgcHJvY2VkdXJlICovCisgICAgdGVhbS0+dC50X29yZGVyZWQuZHQudF92YWx1ZSA9ICgodGlkICsgMSkgJSB0ZWFtLT50LnRfbnByb2MpOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfQkxBTUUKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9yZWxlYXNlX29yZGVyZWQpKSB7CisgICAgICAvKiBhY2NlcHQgYmxhbWUgZm9yICJvcmRlcmVkIiB3YWl0aW5nICovCisgICAgICBrbXBfaW5mb190ICp0aGlzX3RocmVhZCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcmVsZWFzZV9vcmRlcmVkKSgKKyAgICAgICAgICB0aGlzX3RocmVhZC0+dGgub21wdF90aHJlYWRfaW5mby53YWl0X2lkKTsKKyAgICB9CisjZW5kaWYKKworICAgIEtNUF9NQigpOyAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworICB9CisjZW5kaWYgLyogQlVJTERfUEFSQUxMRUxfT1JERVJFRCAqLworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFRoZSBCQVJSSUVSIGZvciBhIFNJTkdMRSBwcm9jZXNzIHNlY3Rpb24gaXMgYWx3YXlzIGV4cGxpY2l0ICAgKi8KKworaW50IF9fa21wX2VudGVyX3NpbmdsZShpbnQgZ3RpZCwgaWRlbnRfdCAqaWRfcmVmLCBpbnQgcHVzaF93cykgeworICBpbnQgc3RhdHVzOworICBrbXBfaW5mb190ICp0aDsKKyAga21wX3RlYW1fdCAqdGVhbTsKKworICBpZiAoIVRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpKQorICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICB0aCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgIHRlYW0gPSB0aC0+dGgudGhfdGVhbTsKKyAgc3RhdHVzID0gMDsKKworICB0aC0+dGgudGhfaWRlbnQgPSBpZF9yZWY7CisKKyAgaWYgKHRlYW0tPnQudF9zZXJpYWxpemVkKSB7CisgICAgc3RhdHVzID0gMTsKKyAgfSBlbHNlIHsKKyAgICBrbXBfaW50MzIgb2xkX3RoaXMgPSB0aC0+dGgudGhfbG9jYWwudGhpc19jb25zdHJ1Y3Q7CisKKyAgICArK3RoLT50aC50aF9sb2NhbC50aGlzX2NvbnN0cnVjdDsKKyAgICAvKiB0cnkgdG8gc2V0IHRlYW0gY291bnQgdG8gdGhyZWFkIGNvdW50LS1zdWNjZXNzIG1lYW5zIHRocmVhZCBnb3QgdGhlCisgICAgICAgc2luZ2xlIGJsb2NrICovCisgICAgLyogVE9ETzogU2hvdWxkIHRoaXMgYmUgYWNxdWlyZSBvciByZWxlYXNlPyAqLworICAgIGlmICh0ZWFtLT50LnRfY29uc3RydWN0ID09IG9sZF90aGlzKSB7CisgICAgICBzdGF0dXMgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoJnRlYW0tPnQudF9jb25zdHJ1Y3QsIG9sZF90aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9sb2NhbC50aGlzX2NvbnN0cnVjdCk7CisgICAgfQorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBpZiAoX19pdHRfbWV0YWRhdGFfYWRkX3B0ciAmJiBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAzICYmCisgICAgICAgIEtNUF9NQVNURVJfR1RJRChndGlkKSAmJgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgIHRoLT50aC50aF90ZWFtc19taWNyb3Rhc2sgPT0gTlVMTCAmJgorI2VuZGlmCisgICAgICAgIHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwgPT0KKyAgICAgICAgICAgIDEpIHsgLy8gT25seSByZXBvcnQgbWV0YWRhdGEgYnkgbWFzdGVyIG9mIGFjdGl2ZSB0ZWFtIGF0IGxldmVsIDEKKyAgICAgIF9fa21wX2l0dF9tZXRhZGF0YV9zaW5nbGUoaWRfcmVmKTsKKyAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICB9CisKKyAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgIGlmIChzdGF0dXMgJiYgcHVzaF93cykgeworICAgICAgX19rbXBfcHVzaF93b3Jrc2hhcmUoZ3RpZCwgY3RfcHNpbmdsZSwgaWRfcmVmKTsKKyAgICB9IGVsc2UgeworICAgICAgX19rbXBfY2hlY2tfd29ya3NoYXJlKGd0aWQsIGN0X3BzaW5nbGUsIGlkX3JlZik7CisgICAgfQorICB9CisjaWYgVVNFX0lUVF9CVUlMRAorICBpZiAoc3RhdHVzKSB7CisgICAgX19rbXBfaXR0X3NpbmdsZV9zdGFydChndGlkKTsKKyAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBfX2ttcF9leGl0X3NpbmdsZShpbnQgZ3RpZCkgeworI2lmIFVTRV9JVFRfQlVJTEQKKyAgX19rbXBfaXR0X3NpbmdsZV9lbmQoZ3RpZCk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKQorICAgIF9fa21wX3BvcF93b3Jrc2hhcmUoZ3RpZCwgY3RfcHNpbmdsZSwgTlVMTCk7Cit9CisKKy8qIGRldGVybWluZSBpZiB3ZSBjYW4gZ28gcGFyYWxsZWwgb3IgbXVzdCB1c2UgYSBzZXJpYWxpemVkIHBhcmFsbGVsIHJlZ2lvbiBhbmQKKyAqIGhvdyBtYW55IHRocmVhZHMgd2UgY2FuIHVzZQorICogc2V0X25wcm9jIGlzIHRoZSBudW1iZXIgb2YgdGhyZWFkcyByZXF1ZXN0ZWQgZm9yIHRoZSB0ZWFtCisgKiByZXR1cm5zIDAgaWYgd2Ugc2hvdWxkIHNlcmlhbGl6ZSBvciBvbmx5IHVzZSBvbmUgdGhyZWFkLAorICogb3RoZXJ3aXNlIHRoZSBudW1iZXIgb2YgdGhyZWFkcyB0byB1c2UKKyAqIFRoZSBmb3Jram9pbiBsb2NrIGlzIGhlbGQgYnkgdGhlIGNhbGxlci4gKi8KK3N0YXRpYyBpbnQgX19rbXBfcmVzZXJ2ZV90aHJlYWRzKGttcF9yb290X3QgKnJvb3QsIGttcF90ZWFtX3QgKnBhcmVudF90ZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc3Rlcl90aWQsIGludCBzZXRfbnRocmVhZHMKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVudGVyX3RlYW1zCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgeworICBpbnQgY2FwYWNpdHk7CisgIGludCBuZXdfbnRocmVhZHM7CisgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfaW5pdF9zZXJpYWwpOworICBLTVBfREVCVUdfQVNTRVJUKHJvb3QgJiYgcGFyZW50X3RlYW0pOworCisgIC8vIElmIGR5bi12YXIgaXMgc2V0LCBkeW5hbWljYWxseSBhZGp1c3QgdGhlIG51bWJlciBvZiBkZXNpcmVkIHRocmVhZHMsCisgIC8vIGFjY29yZGluZyB0byB0aGUgbWV0aG9kIHNwZWNpZmllZCBieSBkeW5hbWljX21vZGUuCisgIG5ld19udGhyZWFkcyA9IHNldF9udGhyZWFkczsKKyAgaWYgKCFnZXRfX2R5bmFtaWNfMihwYXJlbnRfdGVhbSwgbWFzdGVyX3RpZCkpIHsKKyAgICA7CisgIH0KKyNpZmRlZiBVU0VfTE9BRF9CQUxBTkNFCisgIGVsc2UgaWYgKF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID09IGR5bmFtaWNfbG9hZF9iYWxhbmNlKSB7CisgICAgbmV3X250aHJlYWRzID0gX19rbXBfbG9hZF9iYWxhbmNlX25wcm9jKHJvb3QsIHNldF9udGhyZWFkcyk7CisgICAgaWYgKG5ld19udGhyZWFkcyA9PSAxKSB7CisgICAgICBLQ19UUkFDRSgxMCwgKCJfX2ttcF9yZXNlcnZlX3RocmVhZHM6IFQjJWQgbG9hZCBiYWxhbmNlIHJlZHVjZWQgIgorICAgICAgICAgICAgICAgICAgICAicmVzZXJ2YXRpb24gdG8gMSB0aHJlYWRcbiIsCisgICAgICAgICAgICAgICAgICAgIG1hc3Rlcl90aWQpKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAobmV3X250aHJlYWRzIDwgc2V0X250aHJlYWRzKSB7CisgICAgICBLQ19UUkFDRSgxMCwgKCJfX2ttcF9yZXNlcnZlX3RocmVhZHM6IFQjJWQgbG9hZCBiYWxhbmNlIHJlZHVjZWQgIgorICAgICAgICAgICAgICAgICAgICAicmVzZXJ2YXRpb24gdG8gJWQgdGhyZWFkc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgbWFzdGVyX3RpZCwgbmV3X250aHJlYWRzKSk7CisgICAgfQorICB9CisjZW5kaWYgLyogVVNFX0xPQURfQkFMQU5DRSAqLworICBlbHNlIGlmIChfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9PSBkeW5hbWljX3RocmVhZF9saW1pdCkgeworICAgIG5ld19udGhyZWFkcyA9IF9fa21wX2F2YWlsX3Byb2MgLSBfX2ttcF9udGggKworICAgICAgICAgICAgICAgICAgIChyb290LT5yLnJfYWN0aXZlID8gMSA6IHJvb3QtPnIucl9ob3RfdGVhbS0+dC50X25wcm9jKTsKKyAgICBpZiAobmV3X250aHJlYWRzIDw9IDEpIHsKKyAgICAgIEtDX1RSQUNFKDEwLCAoIl9fa21wX3Jlc2VydmVfdGhyZWFkczogVCMlZCB0aHJlYWQgbGltaXQgcmVkdWNlZCAiCisgICAgICAgICAgICAgICAgICAgICJyZXNlcnZhdGlvbiB0byAxIHRocmVhZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgbWFzdGVyX3RpZCkpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChuZXdfbnRocmVhZHMgPCBzZXRfbnRocmVhZHMpIHsKKyAgICAgIEtDX1RSQUNFKDEwLCAoIl9fa21wX3Jlc2VydmVfdGhyZWFkczogVCMlZCB0aHJlYWQgbGltaXQgcmVkdWNlZCAiCisgICAgICAgICAgICAgICAgICAgICJyZXNlcnZhdGlvbiB0byAlZCB0aHJlYWRzXG4iLAorICAgICAgICAgICAgICAgICAgICBtYXN0ZXJfdGlkLCBuZXdfbnRocmVhZHMpKTsKKyAgICB9IGVsc2UgeworICAgICAgbmV3X250aHJlYWRzID0gc2V0X250aHJlYWRzOworICAgIH0KKyAgfSBlbHNlIGlmIChfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9PSBkeW5hbWljX3JhbmRvbSkgeworICAgIGlmIChzZXRfbnRocmVhZHMgPiAyKSB7CisgICAgICBuZXdfbnRocmVhZHMgPSBfX2ttcF9nZXRfcmFuZG9tKHBhcmVudF90ZWFtLT50LnRfdGhyZWFkc1ttYXN0ZXJfdGlkXSk7CisgICAgICBuZXdfbnRocmVhZHMgPSAobmV3X250aHJlYWRzICUgc2V0X250aHJlYWRzKSArIDE7CisgICAgICBpZiAobmV3X250aHJlYWRzID09IDEpIHsKKyAgICAgICAgS0NfVFJBQ0UoMTAsICgiX19rbXBfcmVzZXJ2ZV90aHJlYWRzOiBUIyVkIGR5bmFtaWMgcmFuZG9tIHJlZHVjZWQgIgorICAgICAgICAgICAgICAgICAgICAgICJyZXNlcnZhdGlvbiB0byAxIHRocmVhZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBtYXN0ZXJfdGlkKSk7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgaWYgKG5ld19udGhyZWFkcyA8IHNldF9udGhyZWFkcykgeworICAgICAgICBLQ19UUkFDRSgxMCwgKCJfX2ttcF9yZXNlcnZlX3RocmVhZHM6IFQjJWQgZHluYW1pYyByYW5kb20gcmVkdWNlZCAiCisgICAgICAgICAgICAgICAgICAgICAgInJlc2VydmF0aW9uIHRvICVkIHRocmVhZHNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgbWFzdGVyX3RpZCwgbmV3X250aHJlYWRzKSk7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIEtNUF9BU1NFUlQoMCk7CisgIH0KKworICAvLyBSZXNwZWN0IEtNUF9BTExfVEhSRUFEUywgS01QX01BWF9USFJFQURTLCBPTVBfVEhSRUFEX0xJTUlULgorICBpZiAoX19rbXBfbnRoICsgbmV3X250aHJlYWRzIC0KKyAgICAgICAgICAocm9vdC0+ci5yX2FjdGl2ZSA/IDEgOiByb290LT5yLnJfaG90X3RlYW0tPnQudF9ucHJvYykgPgorICAgICAgX19rbXBfbWF4X250aCkgeworICAgIGludCB0bF9udGhyZWFkcyA9IF9fa21wX21heF9udGggLSBfX2ttcF9udGggKworICAgICAgICAgICAgICAgICAgICAgIChyb290LT5yLnJfYWN0aXZlID8gMSA6IHJvb3QtPnIucl9ob3RfdGVhbS0+dC50X25wcm9jKTsKKyAgICBpZiAodGxfbnRocmVhZHMgPD0gMCkgeworICAgICAgdGxfbnRocmVhZHMgPSAxOworICAgIH0KKworICAgIC8vIElmIGR5bi12YXIgaXMgZmFsc2UsIGVtaXQgYSAxLXRpbWUgd2FybmluZy4KKyAgICBpZiAoIWdldF9fZHluYW1pY18yKHBhcmVudF90ZWFtLCBtYXN0ZXJfdGlkKSAmJiAoIV9fa21wX3Jlc2VydmVfd2FybikpIHsKKyAgICAgIF9fa21wX3Jlc2VydmVfd2FybiA9IDE7CisgICAgICBfX2ttcF9tc2coa21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgS01QX01TRyhDYW50Rm9ybVRoclRlYW0sIHNldF9udGhyZWFkcywgdGxfbnRocmVhZHMpLAorICAgICAgICAgICAgICAgIEtNUF9ITlQoVW5zZXRfQUxMX1RIUkVBRFMpLCBfX2ttcF9tc2dfbnVsbCk7CisgICAgfQorICAgIGlmICh0bF9udGhyZWFkcyA9PSAxKSB7CisgICAgICBLQ19UUkFDRSgxMCwgKCJfX2ttcF9yZXNlcnZlX3RocmVhZHM6IFQjJWQgS01QX0FMTF9USFJFQURTIHJlZHVjZWQgIgorICAgICAgICAgICAgICAgICAgICAicmVzZXJ2YXRpb24gdG8gMSB0aHJlYWRcbiIsCisgICAgICAgICAgICAgICAgICAgIG1hc3Rlcl90aWQpKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBLQ19UUkFDRSgxMCwgKCJfX2ttcF9yZXNlcnZlX3RocmVhZHM6IFQjJWQgS01QX0FMTF9USFJFQURTIHJlZHVjZWQgIgorICAgICAgICAgICAgICAgICAgInJlc2VydmF0aW9uIHRvICVkIHRocmVhZHNcbiIsCisgICAgICAgICAgICAgICAgICBtYXN0ZXJfdGlkLCB0bF9udGhyZWFkcykpOworICAgIG5ld19udGhyZWFkcyA9IHRsX250aHJlYWRzOworICB9CisKKyAgLy8gQ2hlY2sgaWYgdGhlIHRocmVhZHMgYXJyYXkgaXMgbGFyZ2UgZW5vdWdoLCBvciBuZWVkcyBleHBhbmRpbmcuCisgIC8vIFNlZSBjb21tZW50IGluIF9fa21wX3JlZ2lzdGVyX3Jvb3QoKSBhYm91dCB0aGUgYWRqdXN0bWVudCBpZgorICAvLyBfX2ttcF90aHJlYWRzWzBdID09IE5VTEwuCisgIGNhcGFjaXR5ID0gX19rbXBfdGhyZWFkc19jYXBhY2l0eTsKKyAgaWYgKFRDUl9QVFIoX19rbXBfdGhyZWFkc1swXSkgPT0gTlVMTCkgeworICAgIC0tY2FwYWNpdHk7CisgIH0KKyAgaWYgKF9fa21wX250aCArIG5ld19udGhyZWFkcyAtCisgICAgICAgICAgKHJvb3QtPnIucl9hY3RpdmUgPyAxIDogcm9vdC0+ci5yX2hvdF90ZWFtLT50LnRfbnByb2MpID4KKyAgICAgIGNhcGFjaXR5KSB7CisgICAgLy8gRXhwYW5kIHRoZSB0aHJlYWRzIGFycmF5LgorICAgIGludCBzbG90c1JlcXVpcmVkID0gX19rbXBfbnRoICsgbmV3X250aHJlYWRzIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIChyb290LT5yLnJfYWN0aXZlID8gMSA6IHJvb3QtPnIucl9ob3RfdGVhbS0+dC50X25wcm9jKSAtCisgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eTsKKyAgICBpbnQgc2xvdHNBZGRlZCA9IF9fa21wX2V4cGFuZF90aHJlYWRzKHNsb3RzUmVxdWlyZWQsIHNsb3RzUmVxdWlyZWQpOworICAgIGlmIChzbG90c0FkZGVkIDwgc2xvdHNSZXF1aXJlZCkgeworICAgICAgLy8gVGhlIHRocmVhZHMgYXJyYXkgd2FzIG5vdCBleHBhbmRlZCBlbm91Z2guCisgICAgICBuZXdfbnRocmVhZHMgLT0gKHNsb3RzUmVxdWlyZWQgLSBzbG90c0FkZGVkKTsKKyAgICAgIEtNUF9BU1NFUlQobmV3X250aHJlYWRzID49IDEpOworCisgICAgICAvLyBJZiBkeW4tdmFyIGlzIGZhbHNlLCBlbWl0IGEgMS10aW1lIHdhcm5pbmcuCisgICAgICBpZiAoIWdldF9fZHluYW1pY18yKHBhcmVudF90ZWFtLCBtYXN0ZXJfdGlkKSAmJiAoIV9fa21wX3Jlc2VydmVfd2FybikpIHsKKyAgICAgICAgX19rbXBfcmVzZXJ2ZV93YXJuID0gMTsKKyAgICAgICAgaWYgKF9fa21wX3RwX2NhY2hlZCkgeworICAgICAgICAgIF9fa21wX21zZyhrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyhDYW50Rm9ybVRoclRlYW0sIHNldF9udGhyZWFkcywgbmV3X250aHJlYWRzKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0hOVChTZXRfQUxMX1RIUkVBRFBSSVZBVEUsIF9fa21wX3RwX2NhcGFjaXR5KSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0hOVChQb3NzaWJsZVN5c3RlbUxpbWl0T25UaHJlYWRzKSwgX19rbXBfbXNnX251bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIF9fa21wX21zZyhrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyhDYW50Rm9ybVRoclRlYW0sIHNldF9udGhyZWFkcywgbmV3X250aHJlYWRzKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0hOVChTeXN0ZW1MaW1pdE9uVGhyZWFkcyksIF9fa21wX21zZ19udWxsKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisjaWZkZWYgS01QX0RFQlVHCisgIGlmIChuZXdfbnRocmVhZHMgPT0gMSkgeworICAgIEtDX1RSQUNFKDEwLAorICAgICAgICAgICAgICgiX19rbXBfcmVzZXJ2ZV90aHJlYWRzOiBUIyVkIHNlcmlhbGl6aW5nIHRlYW0gYWZ0ZXIgcmVjbGFpbWluZyAiCisgICAgICAgICAgICAgICJkZWFkIHJvb3RzIGFuZCByZWNoZWNraW5nOyByZXF1ZXN0ZWQgJWQgdGhyZWFkc1xuIiwKKyAgICAgICAgICAgICAgX19rbXBfZ2V0X2d0aWQoKSwgc2V0X250aHJlYWRzKSk7CisgIH0gZWxzZSB7CisgICAgS0NfVFJBQ0UoMTAsICgiX19rbXBfcmVzZXJ2ZV90aHJlYWRzOiBUIyVkIGFsbG9jYXRpbmcgJWQgdGhyZWFkczsgcmVxdWVzdGVkIgorICAgICAgICAgICAgICAgICAgIiAlZCB0aHJlYWRzXG4iLAorICAgICAgICAgICAgICAgICAgX19rbXBfZ2V0X2d0aWQoKSwgbmV3X250aHJlYWRzLCBzZXRfbnRocmVhZHMpKTsKKyAgfQorI2VuZGlmIC8vIEtNUF9ERUJVRworICByZXR1cm4gbmV3X250aHJlYWRzOworfQorCisvKiBBbGxvY2F0ZSB0aHJlYWRzIGZyb20gdGhlIHRocmVhZCBwb29sIGFuZCBhc3NpZ24gdGhlbSB0byB0aGUgbmV3IHRlYW0uIFdlIGFyZQorICAgYXNzdXJlZCB0aGF0IHRoZXJlIGFyZSBlbm91Z2ggdGhyZWFkcyBhdmFpbGFibGUsIGJlY2F1c2Ugd2UgY2hlY2tlZCBvbiB0aGF0CisgICBlYXJsaWVyIHdpdGhpbiBjcml0aWNhbCBzZWN0aW9uIGZvcmtqb2luICovCitzdGF0aWMgdm9pZCBfX2ttcF9mb3JrX3RlYW1fdGhyZWFkcyhrbXBfcm9vdF90ICpyb290LCBrbXBfdGVhbV90ICp0ZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2luZm9fdCAqbWFzdGVyX3RoLCBpbnQgbWFzdGVyX2d0aWQpIHsKKyAgaW50IGk7CisgIGludCB1c2VfaG90X3RlYW07CisKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBfZm9ya190ZWFtX3RocmVhZHM6IG5ld19ucHJvY3MgPSAlZFxuIiwgdGVhbS0+dC50X25wcm9jKSk7CisgIEtNUF9ERUJVR19BU1NFUlQobWFzdGVyX2d0aWQgPT0gX19rbXBfZ2V0X2d0aWQoKSk7CisgIEtNUF9NQigpOworCisgIC8qIGZpcnN0LCBsZXQncyBzZXR1cCB0aGUgbWFzdGVyIHRocmVhZCAqLworICBtYXN0ZXJfdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkID0gMDsKKyAgbWFzdGVyX3RoLT50aC50aF90ZWFtID0gdGVhbTsKKyAgbWFzdGVyX3RoLT50aC50aF90ZWFtX25wcm9jID0gdGVhbS0+dC50X25wcm9jOworICBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1fbWFzdGVyID0gbWFzdGVyX3RoOworICBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1fc2VyaWFsaXplZCA9IEZBTFNFOworICBtYXN0ZXJfdGgtPnRoLnRoX2Rpc3BhdGNoID0gJnRlYW0tPnQudF9kaXNwYXRjaFswXTsKKworLyogbWFrZSBzdXJlIHdlIGFyZSBub3QgdGhlIG9wdGltaXplZCBob3QgdGVhbSAqLworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgIHVzZV9ob3RfdGVhbSA9IDA7CisgIGttcF9ob3RfdGVhbV9wdHJfdCAqaG90X3RlYW1zID0gbWFzdGVyX3RoLT50aC50aF9ob3RfdGVhbXM7CisgIGlmIChob3RfdGVhbXMpIHsgLy8gaG90IHRlYW1zIGFycmF5IGlzIG5vdCBhbGxvY2F0ZWQgaWYKKyAgICAvLyBLTVBfSE9UX1RFQU1TX01BWF9MRVZFTD0wCisgICAgaW50IGxldmVsID0gdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCAtIDE7IC8vIGluZGV4IGluIGFycmF5IG9mIGhvdCB0ZWFtcworICAgIGlmIChtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzaykgeyAvLyBhcmUgd2UgaW5zaWRlIHRoZSB0ZWFtcz8KKyAgICAgIGlmIChtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX3NpemUubnRlYW1zID4gMSkgeworICAgICAgICArK2xldmVsOyAvLyBsZXZlbCB3YXMgbm90IGluY3JlYXNlZCBpbiB0ZWFtcyBjb25zdHJ1Y3QgZm9yCisgICAgICAgIC8vIHRlYW1fb2ZfbWFzdGVycworICAgICAgfQorICAgICAgaWYgKHRlYW0tPnQudF9wa2ZuICE9IChtaWNyb3Rhc2tfdClfX2ttcF90ZWFtc19tYXN0ZXIgJiYKKyAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX2xldmVsID09IHRlYW0tPnQudF9sZXZlbCkgeworICAgICAgICArK2xldmVsOyAvLyBsZXZlbCB3YXMgbm90IGluY3JlYXNlZCBpbiB0ZWFtcyBjb25zdHJ1Y3QgZm9yCisgICAgICAgIC8vIHRlYW1fb2Zfd29ya2VycyBiZWZvcmUgdGhlIHBhcmFsbGVsCisgICAgICB9IC8vIHRlYW0tPnQudF9sZXZlbCB3aWxsIGJlIGluY3JlYXNlZCBpbnNpZGUgcGFyYWxsZWwKKyAgICB9CisgICAgaWYgKGxldmVsIDwgX19rbXBfaG90X3RlYW1zX21heF9sZXZlbCkgeworICAgICAgaWYgKGhvdF90ZWFtc1tsZXZlbF0uaG90X3RlYW0pIHsKKyAgICAgICAgLy8gaG90IHRlYW0gaGFzIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgZm9yIGdpdmVuIGxldmVsCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoaG90X3RlYW1zW2xldmVsXS5ob3RfdGVhbSA9PSB0ZWFtKTsKKyAgICAgICAgdXNlX2hvdF90ZWFtID0gMTsgLy8gdGhlIHRlYW0gaXMgcmVhZHkgdG8gdXNlCisgICAgICB9IGVsc2UgeworICAgICAgICB1c2VfaG90X3RlYW0gPSAwOyAvLyBBQzogdGhyZWFkcyBhcmUgbm90IGFsbG9jYXRlZCB5ZXQKKyAgICAgICAgaG90X3RlYW1zW2xldmVsXS5ob3RfdGVhbSA9IHRlYW07IC8vIHJlbWVtYmVyIG5ldyBob3QgdGVhbQorICAgICAgICBob3RfdGVhbXNbbGV2ZWxdLmhvdF90ZWFtX250aCA9IHRlYW0tPnQudF9ucHJvYzsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdXNlX2hvdF90ZWFtID0gMDsKKyAgICB9CisgIH0KKyNlbHNlCisgIHVzZV9ob3RfdGVhbSA9IHRlYW0gPT0gcm9vdC0+ci5yX2hvdF90ZWFtOworI2VuZGlmCisgIGlmICghdXNlX2hvdF90ZWFtKSB7CisKKyAgICAvKiBpbnN0YWxsIHRoZSBtYXN0ZXIgdGhyZWFkICovCisgICAgdGVhbS0+dC50X3RocmVhZHNbMF0gPSBtYXN0ZXJfdGg7CisgICAgX19rbXBfaW5pdGlhbGl6ZV9pbmZvKG1hc3Rlcl90aCwgdGVhbSwgMCwgbWFzdGVyX2d0aWQpOworCisgICAgLyogbm93LCBpbnN0YWxsIHRoZSB3b3JrZXIgdGhyZWFkcyAqLworICAgIGZvciAoaSA9IDE7IGkgPCB0ZWFtLT50LnRfbnByb2M7IGkrKykgeworCisgICAgICAvKiBmb3JrIG9yIHJlYWxsb2NhdGUgYSBuZXcgdGhyZWFkIGFuZCBpbnN0YWxsIGl0IGluIHRlYW0gKi8KKyAgICAgIGttcF9pbmZvX3QgKnRociA9IF9fa21wX2FsbG9jYXRlX3RocmVhZChyb290LCB0ZWFtLCBpKTsKKyAgICAgIHRlYW0tPnQudF90aHJlYWRzW2ldID0gdGhyOworICAgICAgS01QX0RFQlVHX0FTU0VSVCh0aHIpOworICAgICAgS01QX0RFQlVHX0FTU0VSVCh0aHItPnRoLnRoX3RlYW0gPT0gdGVhbSk7CisgICAgICAvKiBhbGlnbiB0ZWFtIGFuZCB0aHJlYWQgYXJyaXZlZCBzdGF0ZXMgKi8KKyAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2ZvcmtfdGVhbV90aHJlYWRzOiBUIyVkKCVkOiVkKSBpbml0IGFycml2ZWQgIgorICAgICAgICAgICAgICAgICAgICAiVCMlZCglZDolZCkgam9pbiA9JWxsdSwgcGxhaW49JWxsdVxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZCgwLCB0ZWFtKSwgdGVhbS0+dC50X2lkLCAwLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKGksIHRlYW0pLCB0ZWFtLT50LnRfaWQsIGksCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9iYXJbYnNfZm9ya2pvaW5fYmFycmllcl0uYl9hcnJpdmVkLAorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfYmFyW2JzX3BsYWluX2JhcnJpZXJdLmJfYXJyaXZlZCkpOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICB0aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayA9IG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbWljcm90YXNrOworICAgICAgdGhyLT50aC50aF90ZWFtc19sZXZlbCA9IG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbGV2ZWw7CisgICAgICB0aHItPnRoLnRoX3RlYW1zX3NpemUgPSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX3NpemU7CisjZW5kaWYKKyAgICAgIHsgLy8gSW5pdGlhbGl6ZSB0aHJlYWRzJyBiYXJyaWVyIGRhdGEuCisgICAgICAgIGludCBiOworICAgICAgICBrbXBfYmFsaWduX3QgKmJhbGlnbiA9IHRlYW0tPnQudF90aHJlYWRzW2ldLT50aC50aF9iYXI7CisgICAgICAgIGZvciAoYiA9IDA7IGIgPCBic19sYXN0X2JhcnJpZXI7ICsrYikgeworICAgICAgICAgIGJhbGlnbltiXS5iYi5iX2Fycml2ZWQgPSB0ZWFtLT50LnRfYmFyW2JdLmJfYXJyaXZlZDsKKyAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGJhbGlnbltiXS5iYi53YWl0X2ZsYWcgIT0gS01QX0JBUlJJRVJfUEFSRU5UX0ZMQUcpOworI2lmIFVTRV9ERUJVR0dFUgorICAgICAgICAgIGJhbGlnbltiXS5iYi5iX3dvcmtlcl9hcnJpdmVkID0gdGVhbS0+dC50X2JhcltiXS5iX3RlYW1fYXJyaXZlZDsKKyNlbmRpZgorICAgICAgICB9OyAvLyBmb3IgYgorICAgICAgfQorICAgIH0KKworI2lmIE9NUF80MF9FTkFCTEVEICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICBfX2ttcF9wYXJ0aXRpb25fcGxhY2VzKHRlYW0pOworI2VuZGlmCisgIH0KKworICBLTVBfTUIoKTsKK30KKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKy8vIFByb3BhZ2F0ZSBhbnkgY2hhbmdlcyB0byB0aGUgZmxvYXRpbmcgcG9pbnQgY29udHJvbCByZWdpc3RlcnMgb3V0IHRvIHRoZSB0ZWFtCisvLyBXZSB0cnkgdG8gYXZvaWQgdW5uZWNlc3Nhcnkgd3JpdGVzIHRvIHRoZSByZWxldmFudCBjYWNoZSBsaW5lIGluIHRoZSB0ZWFtCisvLyBzdHJ1Y3R1cmUsIHNvIHdlIGRvbid0IG1ha2UgY2hhbmdlcyB1bmxlc3MgdGhleSBhcmUgbmVlZGVkLgoraW5saW5lIHN0YXRpYyB2b2lkIHByb3BhZ2F0ZUZQQ29udHJvbChrbXBfdGVhbV90ICp0ZWFtKSB7CisgIGlmIChfX2ttcF9pbmhlcml0X2ZwX2NvbnRyb2wpIHsKKyAgICBrbXBfaW50MTYgeDg3X2ZwdV9jb250cm9sX3dvcmQ7CisgICAga21wX3VpbnQzMiBteGNzcjsKKworICAgIC8vIEdldCBtYXN0ZXIgdmFsdWVzIG9mIEZQVSBjb250cm9sIGZsYWdzIChib3RoIFg4NyBhbmQgdmVjdG9yKQorICAgIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkKCZ4ODdfZnB1X2NvbnRyb2xfd29yZCk7CisgICAgX19rbXBfc3RvcmVfbXhjc3IoJm14Y3NyKTsKKyAgICBteGNzciAmPSBLTVBfWDg2X01YQ1NSX01BU0s7CisKKy8vIFRoZXJlIGlzIG5vIHBvaW50IGxvb2tpbmcgYXQgdF9mcF9jb250cm9sX3NhdmVkIGhlcmUuCisvLyBJZiBpdCBpcyBUUlVFLCB3ZSBzdGlsbCBoYXZlIHRvIHVwZGF0ZSB0aGUgdmFsdWVzIGlmIHRoZXkgYXJlIGRpZmZlcmVudCBmcm9tCisvLyB0aG9zZSB3ZSBub3cgaGF2ZS4KKy8vIElmIGl0IGlzIEZBTFNFIHdlIGRpZG4ndCBzYXZlIGFueXRoaW5nIHlldCwgYnV0IG91ciBvYmplY3RpdmUgaXMgdGhlIHNhbWUuIFdlCisvLyBoYXZlIHRvIGVuc3VyZSB0aGF0IHRoZSB2YWx1ZXMgaW4gdGhlIHRlYW0gYXJlIHRoZSBzYW1lIGFzIHRob3NlIHdlIGhhdmUuCisvLyBTbywgdGhpcyBjb2RlIGFjaGlldmVzIHdoYXQgd2UgbmVlZCB3aGV0aGVyIG9yIG5vdCB0X2ZwX2NvbnRyb2xfc2F2ZWQgaXMKKy8vIHRydWUuIEJ5IGNoZWNraW5nIHdoZXRoZXIgdGhlIHZhbHVlIG5lZWRzIHVwZGF0aW5nIHdlIGF2b2lkIHVubmVjZXNzYXJ5CisvLyB3cml0ZXMgdGhhdCB3b3VsZCBwdXQgdGhlIGNhY2hlLWxpbmUgaW50byBhIHdyaXR0ZW4gc3RhdGUsIGNhdXNpbmcgYWxsCisvLyB0aHJlYWRzIGluIHRoZSB0ZWFtIHRvIGhhdmUgdG8gcmVhZCBpdCBhZ2Fpbi4KKyAgICBLTVBfQ0hFQ0tfVVBEQVRFKHRlYW0tPnQudF94ODdfZnB1X2NvbnRyb2xfd29yZCwgeDg3X2ZwdV9jb250cm9sX3dvcmQpOworICAgIEtNUF9DSEVDS19VUERBVEUodGVhbS0+dC50X214Y3NyLCBteGNzcik7CisgICAgLy8gQWx0aG91Z2ggd2UgZG9uJ3QgdXNlIHRoaXMgdmFsdWUsIG90aGVyIGNvZGUgaW4gdGhlIHJ1bnRpbWUgd2FudHMgdG8ga25vdworICAgIC8vIHdoZXRoZXIgaXQgc2hvdWxkIHJlc3RvcmUgdGhlbS4gU28gd2UgbXVzdCBlbnN1cmUgaXQgaXMgY29ycmVjdC4KKyAgICBLTVBfQ0hFQ0tfVVBEQVRFKHRlYW0tPnQudF9mcF9jb250cm9sX3NhdmVkLCBUUlVFKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBTaW1pbGFybHkgaGVyZS4gRG9uJ3Qgd3JpdGUgdG8gdGhpcyBjYWNoZS1saW5lIGluIHRoZSB0ZWFtIHN0cnVjdHVyZQorICAgIC8vIHVubGVzcyB3ZSBoYXZlIHRvLgorICAgIEtNUF9DSEVDS19VUERBVEUodGVhbS0+dC50X2ZwX2NvbnRyb2xfc2F2ZWQsIEZBTFNFKTsKKyAgfQorfQorCisvLyBEbyB0aGUgb3Bwb3NpdGUsIHNldHRpbmcgdGhlIGhhcmR3YXJlIHJlZ2lzdGVycyB0byB0aGUgdXBkYXRlZCB2YWx1ZXMgZnJvbQorLy8gdGhlIHRlYW0uCitpbmxpbmUgc3RhdGljIHZvaWQgdXBkYXRlSFdGUENvbnRyb2woa21wX3RlYW1fdCAqdGVhbSkgeworICBpZiAoX19rbXBfaW5oZXJpdF9mcF9jb250cm9sICYmIHRlYW0tPnQudF9mcF9jb250cm9sX3NhdmVkKSB7CisgICAgLy8gT25seSByZXNldCB0aGUgZnAgY29udHJvbCByZWdzIGlmIHRoZXkgaGF2ZSBiZWVuIGNoYW5nZWQgaW4gdGhlIHRlYW0uCisgICAgLy8gdGhlIHBhcmFsbGVsIHJlZ2lvbiB0aGF0IHdlIGFyZSBleGl0aW5nLgorICAgIGttcF9pbnQxNiB4ODdfZnB1X2NvbnRyb2xfd29yZDsKKyAgICBrbXBfdWludDMyIG14Y3NyOworICAgIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkKCZ4ODdfZnB1X2NvbnRyb2xfd29yZCk7CisgICAgX19rbXBfc3RvcmVfbXhjc3IoJm14Y3NyKTsKKyAgICBteGNzciAmPSBLTVBfWDg2X01YQ1NSX01BU0s7CisKKyAgICBpZiAodGVhbS0+dC50X3g4N19mcHVfY29udHJvbF93b3JkICE9IHg4N19mcHVfY29udHJvbF93b3JkKSB7CisgICAgICBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkKCk7CisgICAgICBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkKCZ0ZWFtLT50LnRfeDg3X2ZwdV9jb250cm9sX3dvcmQpOworICAgIH0KKworICAgIGlmICh0ZWFtLT50LnRfbXhjc3IgIT0gbXhjc3IpIHsKKyAgICAgIF9fa21wX2xvYWRfbXhjc3IoJnRlYW0tPnQudF9teGNzcik7CisgICAgfQorICB9Cit9CisjZWxzZQorI2RlZmluZSBwcm9wYWdhdGVGUENvbnRyb2woeCkgKCh2b2lkKTApCisjZGVmaW5lIHVwZGF0ZUhXRlBDb250cm9sKHgpICgodm9pZCkwKQorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworc3RhdGljIHZvaWQgX19rbXBfYWxsb2NfYXJndl9lbnRyaWVzKGludCBhcmdjLCBrbXBfdGVhbV90ICp0ZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWFsbG9jKTsgLy8gZm9yd2FyZCBkZWNsYXJhdGlvbgorCisvKiBSdW4gYSBwYXJhbGxlbCByZWdpb24gdGhhdCBoYXMgYmVlbiBzZXJpYWxpemVkLCBzbyBydW5zIG9ubHkgaW4gYSB0ZWFtIG9mIHRoZQorICAgc2luZ2xlIG1hc3RlciB0aHJlYWQuICovCit2b2lkIF9fa21wX3NlcmlhbGl6ZWRfcGFyYWxsZWwoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkgeworICBrbXBfaW5mb190ICp0aGlzX3RocjsKKyAga21wX3RlYW1fdCAqc2VyaWFsX3RlYW07CisKKyAgS0NfVFJBQ0UoMTAsICgiX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWw6IGNhbGxlZCBieSBUIyVkXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgLyogU2tpcCBhbGwgdGhpcyBjb2RlIGZvciBhdXRvcGFyIHNlcmlhbGl6ZWQgbG9vcHMgc2luY2UgaXQgcmVzdWx0cyBpbgorICAgICB1bmFjY2VwdGFibGUgb3ZlcmhlYWQgKi8KKyAgaWYgKGxvYyAhPSBOVUxMICYmIChsb2MtPmZsYWdzICYgS01QX0lERU5UX0FVVE9QQVIpKQorICAgIHJldHVybjsKKworICBpZiAoIVRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpKQorICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICB0aGlzX3RociA9IF9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF07CisgIHNlcmlhbF90ZWFtID0gdGhpc190aHItPnRoLnRoX3NlcmlhbF90ZWFtOworCisgIC8qIHV0aWxpemUgdGhlIHNlcmlhbGl6ZWQgdGVhbSBoZWxkIGJ5IHRoaXMgdGhyZWFkICovCisgIEtNUF9ERUJVR19BU1NFUlQoc2VyaWFsX3RlYW0pOworICBLTVBfTUIoKTsKKworICBpZiAoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyAgICBLTVBfREVCVUdfQVNTRVJUKAorICAgICAgICB0aGlzX3Roci0+dGgudGhfdGFza190ZWFtID09CisgICAgICAgIHRoaXNfdGhyLT50aC50aF90ZWFtLT50LnRfdGFza190ZWFtW3RoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlXSk7CisgICAgS01QX0RFQlVHX0FTU0VSVChzZXJpYWxfdGVhbS0+dC50X3Rhc2tfdGVhbVt0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZV0gPT0KKyAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wY19zZXJpYWxpemVkX3BhcmFsbGVsOiBUIyVkIHB1c2hpbmcgdGFza190ZWFtICVwIC8gIgorICAgICAgICAgICAgICAgICAgInRlYW0gJXAsIG5ldyB0YXNrX3RlYW0gPSBOVUxMXG4iLAorICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSwgdGhpc190aHItPnRoLnRoX3RlYW0pKTsKKyAgICB0aGlzX3Roci0+dGgudGhfdGFza190ZWFtID0gTlVMTDsKKyAgfQorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAga21wX3Byb2NfYmluZF90IHByb2NfYmluZCA9IHRoaXNfdGhyLT50aC50aF9zZXRfcHJvY19iaW5kOworICBpZiAodGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5wcm9jX2JpbmQgPT0gcHJvY19iaW5kX2ZhbHNlKSB7CisgICAgcHJvY19iaW5kID0gcHJvY19iaW5kX2ZhbHNlOworICB9IGVsc2UgaWYgKHByb2NfYmluZCA9PSBwcm9jX2JpbmRfZGVmYXVsdCkgeworICAgIC8vIE5vIHByb2NfYmluZCBjbGF1c2Ugd2FzIHNwZWNpZmllZCwgc28gdXNlIHRoZSBjdXJyZW50IHZhbHVlCisgICAgLy8gb2YgcHJvYy1iaW5kLXZhciBmb3IgdGhpcyBwYXJhbGxlbCByZWdpb24uCisgICAgcHJvY19iaW5kID0gdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5wcm9jX2JpbmQ7CisgIH0KKyAgLy8gUmVzZXQgZm9yIG5leHQgcGFyYWxsZWwgcmVnaW9uCisgIHRoaXNfdGhyLT50aC50aF9zZXRfcHJvY19iaW5kID0gcHJvY19iaW5kX2RlZmF1bHQ7CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworICBpZiAodGhpc190aHItPnRoLnRoX3RlYW0gIT0gc2VyaWFsX3RlYW0pIHsKKyAgICAvLyBOZXN0ZWQgbGV2ZWwgd2lsbCBiZSBhbiBpbmRleCBpbiB0aGUgbmVzdGVkIG50aHJlYWRzIGFycmF5CisgICAgaW50IGxldmVsID0gdGhpc190aHItPnRoLnRoX3RlYW0tPnQudF9sZXZlbDsKKworICAgIGlmIChzZXJpYWxfdGVhbS0+dC50X3NlcmlhbGl6ZWQpIHsKKyAgICAgIC8qIHRoaXMgc2VyaWFsIHRlYW0gd2FzIGFscmVhZHkgdXNlZAorICAgICAgICAgVE9ETyBpbmNyZWFzZSBwZXJmb3JtYW5jZSBieSBtYWtpbmcgdGhpcyBsb2NrcyBtb3JlIHNwZWNpZmljICovCisgICAgICBrbXBfdGVhbV90ICpuZXdfdGVhbTsKKworICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jaygmX19rbXBfZm9ya2pvaW5fbG9jayk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBvbXB0X3BhcmFsbGVsX2lkID0gX19vbXB0X3BhcmFsbGVsX2lkX25ldyhnbG9iYWxfdGlkKTsKKyNlbmRpZgorCisgICAgICBuZXdfdGVhbSA9IF9fa21wX2FsbG9jYXRlX3RlYW0odGhpc190aHItPnRoLnRoX3Jvb3QsIDEsIDEsCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZCwKKyNlbmRpZgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY19iaW5kLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCBVU0VfTkVTVEVEX0hPVF9BUkcoTlVMTCkpOworICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jaygmX19rbXBfZm9ya2pvaW5fbG9jayk7CisgICAgICBLTVBfQVNTRVJUKG5ld190ZWFtKTsKKworICAgICAgLyogc2V0dXAgbmV3IHNlcmlhbGl6ZWQgdGVhbSBhbmQgaW5zdGFsbCBpdCAqLworICAgICAgbmV3X3RlYW0tPnQudF90aHJlYWRzWzBdID0gdGhpc190aHI7CisgICAgICBuZXdfdGVhbS0+dC50X3BhcmVudCA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworICAgICAgc2VyaWFsX3RlYW0gPSBuZXdfdGVhbTsKKyAgICAgIHRoaXNfdGhyLT50aC50aF9zZXJpYWxfdGVhbSA9IHNlcmlhbF90ZWFtOworCisgICAgICBLRl9UUkFDRSgKKyAgICAgICAgICAxMCwKKyAgICAgICAgICAoIl9fa21wY19zZXJpYWxpemVkX3BhcmFsbGVsOiBUIyVkIGFsbG9jYXRlZCBuZXcgc2VyaWFsIHRlYW0gJXBcbiIsCisgICAgICAgICAgIGdsb2JhbF90aWQsIHNlcmlhbF90ZWFtKSk7CisKKyAgICAgIC8qIFRPRE8gdGhlIGFib3ZlIGJyZWFrcyB0aGUgcmVxdWlyZW1lbnQgdGhhdCBpZiB3ZSBydW4gb3V0IG9mIHJlc291cmNlcywKKyAgICAgICAgIHRoZW4gd2UgY2FuIHN0aWxsIGd1YXJhbnRlZSB0aGF0IHNlcmlhbGl6ZWQgdGVhbXMgYXJlIG9rLCBzaW5jZSB3ZSBtYXkKKyAgICAgICAgIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgb25lICovCisgICAgfSBlbHNlIHsKKyAgICAgIEtGX1RSQUNFKAorICAgICAgICAgIDEwLAorICAgICAgICAgICgiX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWw6IFQjJWQgcmV1c2luZyBjYWNoZWQgc2VyaWFsIHRlYW0gJXBcbiIsCisgICAgICAgICAgIGdsb2JhbF90aWQsIHNlcmlhbF90ZWFtKSk7CisgICAgfQorCisgICAgLyogd2UgaGF2ZSB0byBpbml0aWFsaXplIHRoaXMgc2VyaWFsIHRlYW0gKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUKHNlcmlhbF90ZWFtLT50LnRfdGhyZWFkcyk7CisgICAgS01QX0RFQlVHX0FTU0VSVChzZXJpYWxfdGVhbS0+dC50X3RocmVhZHNbMF0gPT0gdGhpc190aHIpOworICAgIEtNUF9ERUJVR19BU1NFUlQodGhpc190aHItPnRoLnRoX3RlYW0gIT0gc2VyaWFsX3RlYW0pOworICAgIHNlcmlhbF90ZWFtLT50LnRfaWRlbnQgPSBsb2M7CisgICAgc2VyaWFsX3RlYW0tPnQudF9zZXJpYWxpemVkID0gMTsKKyAgICBzZXJpYWxfdGVhbS0+dC50X25wcm9jID0gMTsKKyAgICBzZXJpYWxfdGVhbS0+dC50X3BhcmVudCA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworICAgIHNlcmlhbF90ZWFtLT50LnRfc2NoZWQgPSB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC50X3NjaGVkOworICAgIHRoaXNfdGhyLT50aC50aF90ZWFtID0gc2VyaWFsX3RlYW07CisgICAgc2VyaWFsX3RlYW0tPnQudF9tYXN0ZXJfdGlkID0gdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfdGlkOworCisgICAgS0ZfVFJBQ0UoMTAsICgiX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWw6IFQjZCBjdXJ0YXNrPSVwXG4iLCBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzaykpOworICAgIEtNUF9BU1NFUlQodGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfZmxhZ3MuZXhlY3V0aW5nID09IDEpOworICAgIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ZsYWdzLmV4ZWN1dGluZyA9IDA7CisKKyAgICBfX2ttcF9wdXNoX2N1cnJlbnRfdGFza190b190aHJlYWQodGhpc190aHIsIHNlcmlhbF90ZWFtLCAwKTsKKworICAgIC8qIFRPRE86IEdFSDogZG8gSUNWcyB3b3JrIGZvciBuZXN0ZWQgc2VyaWFsaXplZCB0ZWFtcz8gRG9uJ3Qgd2UgbmVlZCBhbgorICAgICAgIGltcGxpY2l0IHRhc2sgZm9yIGVhY2ggc2VyaWFsaXplZCB0YXNrIHJlcHJlc2VudGVkIGJ5CisgICAgICAgdGVhbS0+dC50X3NlcmlhbGl6ZWQ/ICovCisgICAgY29weV9pY3ZzKCZ0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLAorICAgICAgICAgICAgICAmdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfcGFyZW50LT50ZF9pY3ZzKTsKKworICAgIC8vIFRocmVhZCB2YWx1ZSBleGlzdHMgaW4gdGhlIG5lc3RlZCBudGhyZWFkcyBhcnJheSBmb3IgdGhlIG5leHQgbmVzdGVkCisgICAgLy8gbGV2ZWwKKyAgICBpZiAoX19rbXBfbmVzdGVkX250aC51c2VkICYmIChsZXZlbCArIDEgPCBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQpKSB7CisgICAgICB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm5wcm9jID0KKyAgICAgICAgICBfX2ttcF9uZXN0ZWRfbnRoLm50aFtsZXZlbCArIDFdOworICAgIH0KKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZCAmJgorICAgICAgICAobGV2ZWwgKyAxIDwgX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkKSkgeworICAgICAgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5wcm9jX2JpbmQgPQorICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1tsZXZlbCArIDFdOworICAgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisjaWYgVVNFX0RFQlVHR0VSCisgICAgc2VyaWFsX3RlYW0tPnQudF9wa2ZuID0gKG1pY3JvdGFza190KSh+MCk7IC8vIEZvciB0aGUgZGVidWdnZXIuCisjZW5kaWYKKyAgICB0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc190aWQgPSAwOworCisgICAgLyogc2V0IHRocmVhZCBjYWNoZSB2YWx1ZXMgKi8KKyAgICB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYyA9IDE7CisgICAgdGhpc190aHItPnRoLnRoX3RlYW1fbWFzdGVyID0gdGhpc190aHI7CisgICAgdGhpc190aHItPnRoLnRoX3RlYW1fc2VyaWFsaXplZCA9IDE7CisKKyAgICBzZXJpYWxfdGVhbS0+dC50X2xldmVsID0gc2VyaWFsX3RlYW0tPnQudF9wYXJlbnQtPnQudF9sZXZlbCArIDE7CisgICAgc2VyaWFsX3RlYW0tPnQudF9hY3RpdmVfbGV2ZWwgPSBzZXJpYWxfdGVhbS0+dC50X3BhcmVudC0+dC50X2FjdGl2ZV9sZXZlbDsKKworICAgIHByb3BhZ2F0ZUZQQ29udHJvbChzZXJpYWxfdGVhbSk7CisKKyAgICAvKiBjaGVjayBpZiB3ZSBuZWVkIHRvIGFsbG9jYXRlIGRpc3BhdGNoIGJ1ZmZlcnMgc3RhY2sgKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUKHNlcmlhbF90ZWFtLT50LnRfZGlzcGF0Y2gpOworICAgIGlmICghc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaC0+dGhfZGlzcF9idWZmZXIpIHsKKyAgICAgIHNlcmlhbF90ZWFtLT50LnRfZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyID0KKyAgICAgICAgICAoZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgKilfX2ttcF9hbGxvY2F0ZSgKKyAgICAgICAgICAgICAgc2l6ZW9mKGRpc3BhdGNoX3ByaXZhdGVfaW5mb190KSk7CisgICAgfQorICAgIHRoaXNfdGhyLT50aC50aF9kaXNwYXRjaCA9IHNlcmlhbF90ZWFtLT50LnRfZGlzcGF0Y2g7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3Qgb21wdF9wYXJhbGxlbF9pZCA9IF9fb21wdF9wYXJhbGxlbF9pZF9uZXcoZ2xvYmFsX3RpZCk7CisgICAgX19vbXB0X3RlYW1fYXNzaWduX2lkKHNlcmlhbF90ZWFtLCBvbXB0X3BhcmFsbGVsX2lkKTsKKyNlbmRpZgorCisgICAgS01QX01CKCk7CisKKyAgfSBlbHNlIHsKKyAgICAvKiB0aGlzIHNlcmlhbGl6ZWQgdGVhbSBpcyBhbHJlYWR5IGJlaW5nIHVzZWQsCisgICAgICogdGhhdCdzIGZpbmUsIGp1c3QgYWRkIGFub3RoZXIgbmVzdGVkIGxldmVsICovCisgICAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3Roci0+dGgudGhfdGVhbSA9PSBzZXJpYWxfdGVhbSk7CisgICAgS01QX0RFQlVHX0FTU0VSVChzZXJpYWxfdGVhbS0+dC50X3RocmVhZHMpOworICAgIEtNUF9ERUJVR19BU1NFUlQoc2VyaWFsX3RlYW0tPnQudF90aHJlYWRzWzBdID09IHRoaXNfdGhyKTsKKyAgICArK3NlcmlhbF90ZWFtLT50LnRfc2VyaWFsaXplZDsKKyAgICB0aGlzX3Roci0+dGgudGhfdGVhbV9zZXJpYWxpemVkID0gc2VyaWFsX3RlYW0tPnQudF9zZXJpYWxpemVkOworCisgICAgLy8gTmVzdGVkIGxldmVsIHdpbGwgYmUgYW4gaW5kZXggaW4gdGhlIG5lc3RlZCBudGhyZWFkcyBhcnJheQorICAgIGludCBsZXZlbCA9IHRoaXNfdGhyLT50aC50aF90ZWFtLT50LnRfbGV2ZWw7CisgICAgLy8gVGhyZWFkIHZhbHVlIGV4aXN0cyBpbiB0aGUgbmVzdGVkIG50aHJlYWRzIGFycmF5IGZvciB0aGUgbmV4dCBuZXN0ZWQKKyAgICAvLyBsZXZlbAorICAgIGlmIChfX2ttcF9uZXN0ZWRfbnRoLnVzZWQgJiYgKGxldmVsICsgMSA8IF9fa21wX25lc3RlZF9udGgudXNlZCkpIHsKKyAgICAgIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubnByb2MgPQorICAgICAgICAgIF9fa21wX25lc3RlZF9udGgubnRoW2xldmVsICsgMV07CisgICAgfQorICAgIHNlcmlhbF90ZWFtLT50LnRfbGV2ZWwrKzsKKyAgICBLRl9UUkFDRSgxMCwgKCJfX2ttcGNfc2VyaWFsaXplZF9wYXJhbGxlbDogVCMlZCBpbmNyZWFzaW5nIG5lc3RpbmcgbGV2ZWwgIgorICAgICAgICAgICAgICAgICAgIm9mIHNlcmlhbCB0ZWFtICVwIHRvICVkXG4iLAorICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgc2VyaWFsX3RlYW0sIHNlcmlhbF90ZWFtLT50LnRfbGV2ZWwpKTsKKworICAgIC8qIGFsbG9jYXRlL3B1c2ggZGlzcGF0Y2ggYnVmZmVycyBzdGFjayAqLworICAgIEtNUF9ERUJVR19BU1NFUlQoc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaCk7CisgICAgeworICAgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgKmRpc3BfYnVmZmVyID0KKyAgICAgICAgICAoZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgKilfX2ttcF9hbGxvY2F0ZSgKKyAgICAgICAgICAgICAgc2l6ZW9mKGRpc3BhdGNoX3ByaXZhdGVfaW5mb190KSk7CisgICAgICBkaXNwX2J1ZmZlci0+bmV4dCA9IHNlcmlhbF90ZWFtLT50LnRfZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyOworICAgICAgc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaC0+dGhfZGlzcF9idWZmZXIgPSBkaXNwX2J1ZmZlcjsKKyAgICB9CisgICAgdGhpc190aHItPnRoLnRoX2Rpc3BhdGNoID0gc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaDsKKworICAgIEtNUF9NQigpOworICB9CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgS01QX0NIRUNLX1VQREFURShzZXJpYWxfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0LCBjYW5jZWxfbm9yZXEpOworI2VuZGlmCisKKyAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykKKyAgICBfX2ttcF9wdXNoX3BhcmFsbGVsKGdsb2JhbF90aWQsIE5VTEwpOworfQorCisvKiBtb3N0IG9mIHRoZSB3b3JrIGZvciBhIGZvcmsgKi8KKy8qIHJldHVybiB0cnVlIGlmIHdlIHJlYWxseSB3ZW50IHBhcmFsbGVsLCBmYWxzZSBpZiBzZXJpYWxpemVkICovCitpbnQgX19rbXBfZm9ya19jYWxsKGlkZW50X3QgKmxvYywgaW50IGd0aWQsCisgICAgICAgICAgICAgICAgICAgIGVudW0gZm9ya19jb250ZXh0X2UgY2FsbF9jb250ZXh0LCAvLyBJbnRlbCwgR05VLCAuLi4KKyAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGFyZ2MsCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVud3JhcHBlZF90YXNrLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIG1pY3JvdGFza190IG1pY3JvdGFzaywgbGF1bmNoX3QgaW52b2tlciwKKy8qIFRPRE86IHJldmVydCB3b3JrYXJvdW5kIGZvciBJbnRlbChSKSA2NCB0cmFja2VyICM5NiAqLworI2lmIChLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpICYmIEtNUF9PU19MSU5VWAorICAgICAgICAgICAgICAgICAgICB2YV9saXN0ICphcAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICkgeworICB2b2lkICoqYXJndjsKKyAgaW50IGk7CisgIGludCBtYXN0ZXJfdGlkOworICBpbnQgbWFzdGVyX3RoaXNfY29uczsKKyAga21wX3RlYW1fdCAqdGVhbTsKKyAga21wX3RlYW1fdCAqcGFyZW50X3RlYW07CisgIGttcF9pbmZvX3QgKm1hc3Rlcl90aDsKKyAga21wX3Jvb3RfdCAqcm9vdDsKKyAgaW50IG50aHJlYWRzOworICBpbnQgbWFzdGVyX2FjdGl2ZTsKKyAgaW50IG1hc3Rlcl9zZXRfbnVtdGhyZWFkczsKKyAgaW50IGxldmVsOworI2lmIE9NUF80MF9FTkFCTEVECisgIGludCBhY3RpdmVfbGV2ZWw7CisgIGludCB0ZWFtc19sZXZlbDsKKyNlbmRpZgorI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgIGttcF9ob3RfdGVhbV9wdHJfdCAqKnBfaG90X3RlYW1zOworI2VuZGlmCisgIHsgLy8gS01QX1RJTUVfQkxPQ0sKKyAgICBLTVBfVElNRV9ERVZFTE9QRVJfUEFSVElUSU9ORURfQkxPQ0soS01QX2ZvcmtfY2FsbCk7CisgICAgS01QX0NPVU5UX1ZBTFVFKE9NUF9QQVJBTExFTF9hcmdzLCBhcmdjKTsKKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogZW50ZXIgVCMlZFxuIiwgZ3RpZCkpOworICAgIGlmIChfX2ttcF9zdGtwYWRkaW5nID4gMCAmJiBfX2ttcF9yb290W2d0aWRdICE9IE5VTEwpIHsKKyAgICAgIC8qIFNvbWUgc3lzdGVtcyBwcmVmZXIgdGhlIHN0YWNrIGZvciB0aGUgcm9vdCB0aHJlYWQocykgdG8gc3RhcnQgd2l0aCAqLworICAgICAgLyogc29tZSBnYXAgZnJvbSB0aGUgcGFyZW50IHN0YWNrIHRvIHByZXZlbnQgZmFsc2Ugc2hhcmluZy4gKi8KKyAgICAgIHZvaWQgKmR1bW15ID0gS01QX0FMTE9DQShfX2ttcF9zdGtwYWRkaW5nKTsKKyAgICAgIC8qIFRoZXNlIDIgbGluZXMgYmVsb3cgYXJlIHNvIHRoaXMgZG9lcyBub3QgZ2V0IG9wdGltaXplZCBvdXQgKi8KKyAgICAgIGlmIChfX2ttcF9zdGtwYWRkaW5nID4gS01QX01BWF9TVEtQQURESU5HKQorICAgICAgICBfX2ttcF9zdGtwYWRkaW5nICs9IChzaG9ydCkoKGttcF9pbnQ2NClkdW1teSk7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSBpZiBuZWVkZWQgKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUKAorICAgICAgICBfX2ttcF9pbml0X3NlcmlhbCk7IC8vIEFDOiBwb3RlbnRpYWxseSB1bnNhZmUsIG5vdCBpbiBzeW5jIHdpdGggc2h1dGRvd24KKyAgICBpZiAoIVRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpKQorICAgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisgICAgLyogc2V0dXAgY3VycmVudCBkYXRhICovCisgICAgbWFzdGVyX3RoID0gX19rbXBfdGhyZWFkc1tndGlkXTsgLy8gQUM6IHBvdGVudGlhbGx5IHVuc2FmZSwgbm90IGluIHN5bmMgd2l0aAorICAgIC8vIHNodXRkb3duCisgICAgcGFyZW50X3RlYW0gPSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW07CisgICAgbWFzdGVyX3RpZCA9IG1hc3Rlcl90aC0+dGgudGhfaW5mby5kcy5kc190aWQ7CisgICAgbWFzdGVyX3RoaXNfY29ucyA9IG1hc3Rlcl90aC0+dGgudGhfbG9jYWwudGhpc19jb25zdHJ1Y3Q7CisgICAgcm9vdCA9IG1hc3Rlcl90aC0+dGgudGhfcm9vdDsKKyAgICBtYXN0ZXJfYWN0aXZlID0gcm9vdC0+ci5yX2FjdGl2ZTsKKyAgICBtYXN0ZXJfc2V0X251bXRocmVhZHMgPSBtYXN0ZXJfdGgtPnRoLnRoX3NldF9ucHJvYzsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBvbXB0X3BhcmFsbGVsX2lkOworICAgIG9tcHRfdGFza19pZF90IG9tcHRfdGFza19pZDsKKyAgICBvbXB0X2ZyYW1lX3QgKm9tcHRfZnJhbWU7CisgICAgb21wdF90YXNrX2lkX3QgbXlfdGFza19pZDsKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgbXlfcGFyYWxsZWxfaWQ7CisKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICBvbXB0X3BhcmFsbGVsX2lkID0gX19vbXB0X3BhcmFsbGVsX2lkX25ldyhndGlkKTsKKyAgICAgIG9tcHRfdGFza19pZCA9IF9fb21wdF9nZXRfdGFza19pZF9pbnRlcm5hbCgwKTsKKyAgICAgIG9tcHRfZnJhbWUgPSBfX29tcHRfZ2V0X3Rhc2tfZnJhbWVfaW50ZXJuYWwoMCk7CisgICAgfQorI2VuZGlmCisKKyAgICAvLyBOZXN0ZWQgbGV2ZWwgd2lsbCBiZSBhbiBpbmRleCBpbiB0aGUgbmVzdGVkIG50aHJlYWRzIGFycmF5CisgICAgbGV2ZWwgPSBwYXJlbnRfdGVhbS0+dC50X2xldmVsOworICAgIC8vIHVzZWQgdG8gbGF1bmNoIG5vbi1zZXJpYWwgdGVhbXMgZXZlbiBpZiBuZXN0ZWQgaXMgbm90IGFsbG93ZWQKKyAgICBhY3RpdmVfbGV2ZWwgPSBwYXJlbnRfdGVhbS0+dC50X2FjdGl2ZV9sZXZlbDsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIC8vIG5lZWRlZCB0byBjaGVjayBuZXN0aW5nIGluc2lkZSB0aGUgdGVhbXMKKyAgICB0ZWFtc19sZXZlbCA9IG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbGV2ZWw7CisjZW5kaWYKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgIHBfaG90X3RlYW1zID0gJm1hc3Rlcl90aC0+dGgudGhfaG90X3RlYW1zOworICAgIGlmICgqcF9ob3RfdGVhbXMgPT0gTlVMTCAmJiBfX2ttcF9ob3RfdGVhbXNfbWF4X2xldmVsID4gMCkgeworICAgICAgKnBfaG90X3RlYW1zID0gKGttcF9ob3RfdGVhbV9wdHJfdCAqKV9fa21wX2FsbG9jYXRlKAorICAgICAgICAgIHNpemVvZihrbXBfaG90X3RlYW1fcHRyX3QpICogX19rbXBfaG90X3RlYW1zX21heF9sZXZlbCk7CisgICAgICAoKnBfaG90X3RlYW1zKVswXS5ob3RfdGVhbSA9IHJvb3QtPnIucl9ob3RfdGVhbTsKKyAgICAgIC8vIGl0IGlzIGVpdGhlciBhY3R1YWwgb3Igbm90IG5lZWRlZCAod2hlbiBhY3RpdmVfbGV2ZWwgPiAwKQorICAgICAgKCpwX2hvdF90ZWFtcylbMF0uaG90X3RlYW1fbnRoID0gMTsKKyAgICB9CisjZW5kaWYKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luKSkgeworICAgICAgaW50IHRlYW1fc2l6ZSA9IG1hc3Rlcl9zZXRfbnVtdGhyZWFkczsKKworICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luKSgKKyAgICAgICAgICBvbXB0X3Rhc2tfaWQsIG9tcHRfZnJhbWUsIG9tcHRfcGFyYWxsZWxfaWQsIHRlYW1fc2l6ZSwgdW53cmFwcGVkX3Rhc2ssCisgICAgICAgICAgT01QVF9JTlZPS0VSKGNhbGxfY29udGV4dCkpOworICAgIH0KKyNlbmRpZgorCisgICAgbWFzdGVyX3RoLT50aC50aF9pZGVudCA9IGxvYzsKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbWljcm90YXNrICYmIGFwICYmCisgICAgICAgIG1pY3JvdGFzayAhPSAobWljcm90YXNrX3QpX19rbXBfdGVhbXNfbWFzdGVyICYmIGxldmVsID09IHRlYW1zX2xldmVsKSB7CisgICAgICAvLyBBQzogVGhpcyBpcyBzdGFydCBvZiBwYXJhbGxlbCB0aGF0IGlzIG5lc3RlZCBpbnNpZGUgdGVhbXMgY29uc3RydWN0LgorICAgICAgLy8gVGhlIHRlYW0gaXMgYWN0dWFsIChob3QpLCBhbGwgd29ya2VycyBhcmUgcmVhZHkgYXQgdGhlIGZvcmsgYmFycmllci4KKyAgICAgIC8vIE5vIGxvY2sgbmVlZGVkIHRvIGluaXRpYWxpemUgdGhlIHRlYW0gYSBiaXQsIHRoZW4gZnJlZSB3b3JrZXJzLgorICAgICAgcGFyZW50X3RlYW0tPnQudF9pZGVudCA9IGxvYzsKKyAgICAgIF9fa21wX2FsbG9jX2FyZ3ZfZW50cmllcyhhcmdjLCBwYXJlbnRfdGVhbSwgVFJVRSk7CisgICAgICBwYXJlbnRfdGVhbS0+dC50X2FyZ2MgPSBhcmdjOworICAgICAgYXJndiA9ICh2b2lkICoqKXBhcmVudF90ZWFtLT50LnRfYXJndjsKKyAgICAgIGZvciAoaSA9IGFyZ2MgLSAxOyBpID49IDA7IC0taSkKKy8qIFRPRE86IHJldmVydCB3b3JrYXJvdW5kIGZvciBJbnRlbChSKSA2NCB0cmFja2VyICM5NiAqLworI2lmIChLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpICYmIEtNUF9PU19MSU5VWAorICAgICAgICAqYXJndisrID0gdmFfYXJnKCphcCwgdm9pZCAqKTsKKyNlbHNlCisgICAgICAgICphcmd2KysgPSB2YV9hcmcoYXAsIHZvaWQgKik7CisjZW5kaWYKKyAgICAgIC8vIEluY3JlbWVudCBvdXIgbmVzdGVkIGRlcHRoIGxldmVscywgYnV0IG5vdCBpbmNyZWFzZSB0aGUgc2VyaWFsaXphdGlvbgorICAgICAgaWYgKHBhcmVudF90ZWFtID09IG1hc3Rlcl90aC0+dGgudGhfc2VyaWFsX3RlYW0pIHsKKyAgICAgICAgLy8gQUM6IHdlIGFyZSBpbiBzZXJpYWxpemVkIHBhcmFsbGVsCisgICAgICAgIF9fa21wY19zZXJpYWxpemVkX3BhcmFsbGVsKGxvYywgZ3RpZCk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQocGFyZW50X3RlYW0tPnQudF9zZXJpYWxpemVkID4gMSk7CisgICAgICAgIC8vIEFDOiBuZWVkIHRoaXMgaW4gb3JkZXIgZW5xdWlyeSBmdW5jdGlvbnMgd29yaworICAgICAgICAvLyBjb3JyZWN0bHksIHdpbGwgcmVzdG9yZSBhdCBqb2luIHRpbWUKKyAgICAgICAgcGFyZW50X3RlYW0tPnQudF9zZXJpYWxpemVkLS07CisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgIHZvaWQgKmR1bW15OworICAgICAgICB2b2lkICoqZXhpdF9ydW50aW1lX3A7CisKKyAgICAgICAgb21wdF9sd190YXNrdGVhbV90IGx3X3Rhc2t0ZWFtOworCisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICBfX29tcHRfbHdfdGFza3RlYW1faW5pdCgmbHdfdGFza3RlYW0sIG1hc3Rlcl90aCwgZ3RpZCwgdW53cmFwcGVkX3Rhc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZCk7CisgICAgICAgICAgbHdfdGFza3RlYW0ub21wdF90YXNrX2luZm8udGFza19pZCA9IF9fb21wdF90YXNrX2lkX25ldyhndGlkKTsKKyAgICAgICAgICBleGl0X3J1bnRpbWVfcCA9CisgICAgICAgICAgICAgICYobHdfdGFza3RlYW0ub21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lKTsKKworICAgICAgICAgIF9fb21wdF9sd190YXNrdGVhbV9saW5rKCZsd190YXNrdGVhbSwgbWFzdGVyX3RoKTsKKworI2lmIE9NUFRfVFJBQ0UKKyAgICAgICAgICAvKiBPTVBUIGltcGxpY2l0IHRhc2sgYmVnaW4gKi8KKyAgICAgICAgICBteV90YXNrX2lkID0gbHdfdGFza3RlYW0ub21wdF90YXNrX2luZm8udGFza19pZDsKKyAgICAgICAgICBteV9wYXJhbGxlbF9pZCA9IHBhcmVudF90ZWFtLT50Lm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkOworICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbikpIHsKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luKSgKKyAgICAgICAgICAgICAgICBteV9wYXJhbGxlbF9pZCwgbXlfdGFza19pZCk7CisgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAvKiBPTVBUIHN0YXRlICovCisgICAgICAgICAgbWFzdGVyX3RoLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV93b3JrX3BhcmFsbGVsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGV4aXRfcnVudGltZV9wID0gJmR1bW15OworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICB7CisgICAgICAgICAgS01QX1RJTUVfUEFSVElUSU9ORURfQkxPQ0soT01QX3BhcmFsbGVsKTsKKyAgICAgICAgICBLTVBfU0VUX1RIUkVBRF9TVEFURV9CTE9DSyhJTVBMSUNJVF9UQVNLKTsKKyAgICAgICAgICBfX2ttcF9pbnZva2VfbWljcm90YXNrKG1pY3JvdGFzaywgZ3RpZCwgMCwgYXJnYywgcGFyZW50X3RlYW0tPnQudF9hcmd2CisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0X3J1bnRpbWVfcAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgKmV4aXRfcnVudGltZV9wID0gTlVMTDsKKyAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworI2lmIE9NUFRfVFJBQ0UKKyAgICAgICAgICBsd190YXNrdGVhbS5vbXB0X3Rhc2tfaW5mby5mcmFtZS5leGl0X3J1bnRpbWVfZnJhbWUgPSBOVUxMOworCisgICAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZCkpIHsKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZCkoCisgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZCwgb21wdF90YXNrX2lkKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBfX29tcHRfbHdfdGFza3RlYW1fdW5saW5rKG1hc3Rlcl90aCk7CisgICAgICAgICAgLy8gcmVzZXQgY2xlYXIgdGhlIHRhc2sgaWQgb25seSBhZnRlciB1bmxpbmtpbmcgdGhlIHRhc2sKKyAgICAgICAgICBsd190YXNrdGVhbS5vbXB0X3Rhc2tfaW5mby50YXNrX2lkID0gb21wdF90YXNrX2lkX25vbmU7CisjZW5kaWYKKworICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kKSkgeworICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZCkoCisgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZCwgb21wdF90YXNrX2lkLCBPTVBUX0lOVk9LRVIoY2FsbF9jb250ZXh0KSk7CisgICAgICAgICAgfQorICAgICAgICAgIG1hc3Rlcl90aC0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfb3ZlcmhlYWQ7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KKworICAgICAgcGFyZW50X3RlYW0tPnQudF9wa2ZuID0gbWljcm90YXNrOworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgcGFyZW50X3RlYW0tPnQub21wdF90ZWFtX2luZm8ubWljcm90YXNrID0gdW53cmFwcGVkX3Rhc2s7CisjZW5kaWYKKyAgICAgIHBhcmVudF90ZWFtLT50LnRfaW52b2tlID0gaW52b2tlcjsKKyAgICAgIEtNUF9URVNUX1RIRU5fSU5DMzIoKGttcF9pbnQzMiAqKSZyb290LT5yLnJfaW5fcGFyYWxsZWwpOworICAgICAgcGFyZW50X3RlYW0tPnQudF9hY3RpdmVfbGV2ZWwrKzsKKyAgICAgIHBhcmVudF90ZWFtLT50LnRfbGV2ZWwrKzsKKworICAgICAgLyogQ2hhbmdlIG51bWJlciBvZiB0aHJlYWRzIGluIHRoZSB0ZWFtIGlmIHJlcXVlc3RlZCAqLworICAgICAgaWYgKG1hc3Rlcl9zZXRfbnVtdGhyZWFkcykgeyAvLyBUaGUgcGFyYWxsZWwgaGFzIG51bV90aHJlYWRzIGNsYXVzZQorICAgICAgICBpZiAobWFzdGVyX3NldF9udW10aHJlYWRzIDwgbWFzdGVyX3RoLT50aC50aF90ZWFtc19zaXplLm50aCkgeworICAgICAgICAgIC8vIEFDOiBvbmx5IGNhbiByZWR1Y2UgbnVtYmVyIG9mIHRocmVhZHMgZHluYW1pY2FsbHksIGNhbid0IGluY3JlYXNlCisgICAgICAgICAga21wX2luZm9fdCAqKm90aGVyX3RocmVhZHMgPSBwYXJlbnRfdGVhbS0+dC50X3RocmVhZHM7CisgICAgICAgICAgcGFyZW50X3RlYW0tPnQudF9ucHJvYyA9IG1hc3Rlcl9zZXRfbnVtdGhyZWFkczsKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWFzdGVyX3NldF9udW10aHJlYWRzOyArK2kpIHsKKyAgICAgICAgICAgIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX3RlYW1fbnByb2MgPSBtYXN0ZXJfc2V0X251bXRocmVhZHM7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIEtlZXAgZXh0cmEgdGhyZWFkcyBob3QgaW4gdGhlIHRlYW0gZm9yIHBvc3NpYmxlIG5leHQgcGFyYWxsZWxzCisgICAgICAgIH0KKyAgICAgICAgbWFzdGVyX3RoLT50aC50aF9zZXRfbnByb2MgPSAwOworICAgICAgfQorCisjaWYgVVNFX0RFQlVHR0VSCisgICAgICBpZiAoX19rbXBfZGVidWdnaW5nKSB7IC8vIExldCBkZWJ1Z2dlciBvdmVycmlkZSBudW1iZXIgb2YgdGhyZWFkcy4KKyAgICAgICAgaW50IG50aCA9IF9fa21wX29tcF9udW1fdGhyZWFkcyhsb2MpOworICAgICAgICBpZiAobnRoID4gMCkgeyAvLyAwIG1lYW5zIGRlYnVnZ2VyIGRvZXNuJ3Qgd2FudCB0byBjaGFuZ2UgbnVtIHRocmVhZHMKKyAgICAgICAgICBtYXN0ZXJfc2V0X251bXRocmVhZHMgPSBudGg7CisgICAgICAgIH07IC8vIGlmCisgICAgICB9OyAvLyBpZgorI2VuZGlmCisKKyAgICAgIEtGX1RSQUNFKDEwLCAoIl9fa21wX2ZvcmtfY2FsbDogYmVmb3JlIGludGVybmFsIGZvcms6IHJvb3Q9JXAsIHRlYW09JXAsICIKKyAgICAgICAgICAgICAgICAgICAgIm1hc3Rlcl90aD0lcCwgZ3RpZD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgcm9vdCwgcGFyZW50X3RlYW0sIG1hc3Rlcl90aCwgZ3RpZCkpOworICAgICAgX19rbXBfaW50ZXJuYWxfZm9yayhsb2MsIGd0aWQsIHBhcmVudF90ZWFtKTsKKyAgICAgIEtGX1RSQUNFKDEwLCAoIl9fa21wX2ZvcmtfY2FsbDogYWZ0ZXIgaW50ZXJuYWwgZm9yazogcm9vdD0lcCwgdGVhbT0lcCwgIgorICAgICAgICAgICAgICAgICAgICAibWFzdGVyX3RoPSVwLCBndGlkPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICByb290LCBwYXJlbnRfdGVhbSwgbWFzdGVyX3RoLCBndGlkKSk7CisKKyAgICAgIC8qIEludm9rZSBtaWNyb3Rhc2sgZm9yIE1BU1RFUiB0aHJlYWQgKi8KKyAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogVCMlZCglZDowKSBpbnZva2UgbWljcm90YXNrID0gJXBcbiIsIGd0aWQsCisgICAgICAgICAgICAgICAgICAgIHBhcmVudF90ZWFtLT50LnRfaWQsIHBhcmVudF90ZWFtLT50LnRfcGtmbikpOworCisgICAgICB7CisgICAgICAgIEtNUF9USU1FX1BBUlRJVElPTkVEX0JMT0NLKE9NUF9wYXJhbGxlbCk7CisgICAgICAgIEtNUF9TRVRfVEhSRUFEX1NUQVRFX0JMT0NLKElNUExJQ0lUX1RBU0spOworICAgICAgICBpZiAoIXBhcmVudF90ZWFtLT50LnRfaW52b2tlKGd0aWQpKSB7CisgICAgICAgICAgS01QX0FTU0VSVDIoMCwgImNhbm5vdCBpbnZva2UgbWljcm90YXNrIGZvciBNQVNURVIgdGhyZWFkIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogVCMlZCglZDowKSBkb25lIG1pY3JvdGFzayA9ICVwXG4iLCBndGlkLAorICAgICAgICAgICAgICAgICAgICBwYXJlbnRfdGVhbS0+dC50X2lkLCBwYXJlbnRfdGVhbS0+dC50X3BrZm4pKTsKKyAgICAgIEtNUF9NQigpOyAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9mb3JrX2NhbGw6IHBhcmFsbGVsIGV4aXQgVCMlZFxuIiwgZ3RpZCkpOworCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9IC8vIFBhcmFsbGVsIGNsb3NlbHkgbmVzdGVkIGluIHRlYW1zIGNvbnN0cnVjdAorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyNpZiBLTVBfREVCVUcKKyAgICBpZiAoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyAgICAgIEtNUF9ERUJVR19BU1NFUlQobWFzdGVyX3RoLT50aC50aF90YXNrX3RlYW0gPT0KKyAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50X3RlYW0tPnQudF90YXNrX3RlYW1bbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlXSk7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAocGFyZW50X3RlYW0tPnQudF9hY3RpdmVfbGV2ZWwgPj0KKyAgICAgICAgbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubWF4X2FjdGl2ZV9sZXZlbHMpIHsKKyAgICAgIG50aHJlYWRzID0gMTsKKyAgICB9IGVsc2UgeworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICBpbnQgZW50ZXJfdGVhbXMgPSAoKGFwID09IE5VTEwgJiYgYWN0aXZlX2xldmVsID09IDApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgKGFwICYmIHRlYW1zX2xldmVsID4gMCAmJiB0ZWFtc19sZXZlbCA9PSBsZXZlbCkpOworI2VuZGlmCisgICAgICBudGhyZWFkcyA9CisgICAgICAgICAgbWFzdGVyX3NldF9udW10aHJlYWRzCisgICAgICAgICAgICAgID8gbWFzdGVyX3NldF9udW10aHJlYWRzCisgICAgICAgICAgICAgIDogZ2V0X19ucHJvY18yKAorICAgICAgICAgICAgICAgICAgICBwYXJlbnRfdGVhbSwKKyAgICAgICAgICAgICAgICAgICAgbWFzdGVyX3RpZCk7IC8vIFRPRE86IGdldCBucHJvYyBkaXJlY3RseSBmcm9tIGN1cnJlbnQgdGFzaworCisgICAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIHRha2UgZm9ya2pvaW4gbG9jaz8gKG5vIG5lZWQgZm9yIHNlcmlhbGl6ZWQKKyAgICAgIC8vIHBhcmFsbGVsIG91dCBvZiB0ZWFtcyBjb25zdHJ1Y3QpLiBUaGlzIGNvZGUgbW92ZWQgaGVyZSBmcm9tCisgICAgICAvLyBfX2ttcF9yZXNlcnZlX3RocmVhZHMoKSB0byBzcGVlZHVwIG5lc3RlZCBzZXJpYWxpemVkIHBhcmFsbGVscy4KKyAgICAgIGlmIChudGhyZWFkcyA+IDEpIHsKKyAgICAgICAgaWYgKCghZ2V0X19uZXN0ZWQobWFzdGVyX3RoKSAmJiAocm9vdC0+ci5yX2luX3BhcmFsbGVsCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWVudGVyX3RlYW1zCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkgfHwKKyAgICAgICAgICAgIChfX2ttcF9saWJyYXJ5ID09IGxpYnJhcnlfc2VyaWFsKSkgeworICAgICAgICAgIEtDX1RSQUNFKDEwLCAoIl9fa21wX2ZvcmtfY2FsbDogVCMlZCBzZXJpYWxpemluZyB0ZWFtOyByZXF1ZXN0ZWQgJWQiCisgICAgICAgICAgICAgICAgICAgICAgICAiIHRocmVhZHNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBudGhyZWFkcykpOworICAgICAgICAgIG50aHJlYWRzID0gMTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKG50aHJlYWRzID4gMSkgeworICAgICAgICAvKiBkZXRlcm1pbmUgaG93IG1hbnkgbmV3IHRocmVhZHMgd2UgY2FuIHVzZSAqLworICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF9mb3Jram9pbl9sb2NrKTsKKyAgICAgICAgbnRocmVhZHMgPSBfX2ttcF9yZXNlcnZlX3RocmVhZHMoCisgICAgICAgICAgICByb290LCBwYXJlbnRfdGVhbSwgbWFzdGVyX3RpZCwgbnRocmVhZHMKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgLyogQUM6IElmIHdlIGV4ZWN1dGUgdGVhbXMgZnJvbSBwYXJhbGxlbCByZWdpb24gKG9uIGhvc3QpLCB0aGVuCisgICAgICAgICAgICAgICB0ZWFtcyBzaG91bGQgYmUgY3JlYXRlZCBidXQgZWFjaCBjYW4gb25seSBoYXZlIDEgdGhyZWFkIGlmCisgICAgICAgICAgICAgICBuZXN0aW5nIGlzIGRpc2FibGVkLiBJZiB0ZWFtcyBjYWxsZWQgZnJvbSBzZXJpYWwgcmVnaW9uLCB0aGVuCisgICAgICAgICAgICAgICB0ZWFtcyBhbmQgdGhlaXIgdGhyZWFkcyBzaG91bGQgYmUgY3JlYXRlZCByZWdhcmRsZXNzIG9mIHRoZQorICAgICAgICAgICAgICAgbmVzdGluZyBzZXR0aW5nLiAqLworICAgICAgICAgICAgLAorICAgICAgICAgICAgZW50ZXJfdGVhbXMKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgICAgICAgICAgKTsKKyAgICAgICAgaWYgKG50aHJlYWRzID09IDEpIHsKKyAgICAgICAgICAvLyBGcmVlIGxvY2sgZm9yIHNpbmdsZSB0aHJlYWQgZXhlY3V0aW9uIGhlcmU7IGZvciBtdWx0aS10aHJlYWQKKyAgICAgICAgICAvLyBleGVjdXRpb24gaXQgd2lsbCBiZSBmcmVlZCBsYXRlciBhZnRlciB0ZWFtIG9mIHRocmVhZHMgY3JlYXRlZAorICAgICAgICAgIC8vIGFuZCBpbml0aWFsaXplZAorICAgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJl9fa21wX2Zvcmtqb2luX2xvY2spOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQobnRocmVhZHMgPiAwKTsKKworICAgIC8vIElmIHdlIHRlbXBvcmFyaWx5IGNoYW5nZWQgdGhlIHNldCBudW1iZXIgb2YgdGhyZWFkcyB0aGVuIHJlc3RvcmUgaXQgbm93CisgICAgbWFzdGVyX3RoLT50aC50aF9zZXRfbnByb2MgPSAwOworCisgICAgLyogY3JlYXRlIGEgc2VyaWFsaXplZCBwYXJhbGxlbCByZWdpb24/ICovCisgICAgaWYgKG50aHJlYWRzID09IDEpIHsKKy8qIGpvc2ggdG9kbzogaHlwb3RoZXRpY2FsIHF1ZXN0aW9uOiB3aGF0IGRvIHdlIGRvIGZvciBPUyBYKj8gKi8KKyNpZiBLTVBfT1NfTElOVVggJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpCisgICAgICB2b2lkICphcmdzW2FyZ2NdOworI2Vsc2UKKyAgICAgIHZvaWQgKiphcmdzID0gKHZvaWQgKiopS01QX0FMTE9DQShhcmdjICogc2l6ZW9mKHZvaWQgKikpOworI2VuZGlmIC8qIEtNUF9PU19MSU5VWCAmJiAoIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IFwKKyAgICAgICAgICBLTVBfQVJDSF9BQVJDSDY0KSAqLworCisgICAgICBLQV9UUkFDRSgyMCwKKyAgICAgICAgICAgICAgICgiX19rbXBfZm9ya19jYWxsOiBUIyVkIHNlcmlhbGl6aW5nIHBhcmFsbGVsIHJlZ2lvblxuIiwgZ3RpZCkpOworCisgICAgICBfX2ttcGNfc2VyaWFsaXplZF9wYXJhbGxlbChsb2MsIGd0aWQpOworCisgICAgICBpZiAoY2FsbF9jb250ZXh0ID09IGZvcmtfY29udGV4dF9pbnRlbCkgeworICAgICAgICAvKiBUT0RPIHRoaXMgc3Vja3MsIHVzZSB0aGUgY29tcGlsZXIgaXRzZWxmIHRvIHBhc3MgYXJncyEgOikgKi8KKyAgICAgICAgbWFzdGVyX3RoLT50aC50aF9zZXJpYWxfdGVhbS0+dC50X2lkZW50ID0gbG9jOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgIGlmICghYXApIHsKKyAgICAgICAgICAvLyByZXZlcnQgY2hhbmdlIG1hZGUgaW4gX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwoKQorICAgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfc2VyaWFsX3RlYW0tPnQudF9sZXZlbC0tOworLy8gR2V0IGFyZ3MgZnJvbSBwYXJlbnQgdGVhbSBmb3IgdGVhbXMgY29uc3RydWN0CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICB2b2lkICpkdW1teTsKKyAgICAgICAgICB2b2lkICoqZXhpdF9ydW50aW1lX3A7CisKKyAgICAgICAgICBvbXB0X2x3X3Rhc2t0ZWFtX3QgbHdfdGFza3RlYW07CisKKyAgICAgICAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgICAgICBfX29tcHRfbHdfdGFza3RlYW1faW5pdCgmbHdfdGFza3RlYW0sIG1hc3Rlcl90aCwgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVud3JhcHBlZF90YXNrLCBvbXB0X3BhcmFsbGVsX2lkKTsKKyAgICAgICAgICAgIGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLnRhc2tfaWQgPSBfX29tcHRfdGFza19pZF9uZXcoZ3RpZCk7CisgICAgICAgICAgICBleGl0X3J1bnRpbWVfcCA9CisgICAgICAgICAgICAgICAgJihsd190YXNrdGVhbS5vbXB0X3Rhc2tfaW5mby5mcmFtZS5leGl0X3J1bnRpbWVfZnJhbWUpOworCisgICAgICAgICAgICBfX29tcHRfbHdfdGFza3RlYW1fbGluaygmbHdfdGFza3RlYW0sIG1hc3Rlcl90aCk7CisKKyNpZiBPTVBUX1RSQUNFCisgICAgICAgICAgICBteV90YXNrX2lkID0gbHdfdGFza3RlYW0ub21wdF90YXNrX2luZm8udGFza19pZDsKKyAgICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbikpIHsKKyAgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW4pKAorICAgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZCwgbXlfdGFza19pZCk7CisgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgLyogT01QVCBzdGF0ZSAqLworICAgICAgICAgICAgbWFzdGVyX3RoLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV93b3JrX3BhcmFsbGVsOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBleGl0X3J1bnRpbWVfcCA9ICZkdW1teTsKKyAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgIHsKKyAgICAgICAgICAgIEtNUF9USU1FX1BBUlRJVElPTkVEX0JMT0NLKE9NUF9wYXJhbGxlbCk7CisgICAgICAgICAgICBLTVBfU0VUX1RIUkVBRF9TVEFURV9CTE9DSyhJTVBMSUNJVF9UQVNLKTsKKyAgICAgICAgICAgIF9fa21wX2ludm9rZV9taWNyb3Rhc2sobWljcm90YXNrLCBndGlkLCAwLCBhcmdjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRfdGVhbS0+dC50X2FyZ3YKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0X3J1bnRpbWVfcAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgfQorCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgKmV4aXRfcnVudGltZV9wID0gTlVMTDsKKyAgICAgICAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgICAgICBsd190YXNrdGVhbS5vbXB0X3Rhc2tfaW5mby5mcmFtZS5leGl0X3J1bnRpbWVfZnJhbWUgPSBOVUxMOworCisjaWYgT01QVF9UUkFDRQorICAgICAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZCkpIHsKKyAgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kKSgKKyAgICAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfaWQsIG9tcHRfdGFza19pZCk7CisgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgX19vbXB0X2x3X3Rhc2t0ZWFtX3VubGluayhtYXN0ZXJfdGgpOworICAgICAgICAgICAgLy8gcmVzZXQgY2xlYXIgdGhlIHRhc2sgaWQgb25seSBhZnRlciB1bmxpbmtpbmcgdGhlIHRhc2sKKyAgICAgICAgICAgIGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLnRhc2tfaWQgPSBvbXB0X3Rhc2tfaWRfbm9uZTsKKworICAgICAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9wYXJhbGxlbF9lbmQpKSB7CisgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9wYXJhbGxlbF9lbmQpKAorICAgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZCwgb21wdF90YXNrX2lkLCBPTVBUX0lOVk9LRVIoY2FsbF9jb250ZXh0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX292ZXJoZWFkOworICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9IGVsc2UgaWYgKG1pY3JvdGFzayA9PSAobWljcm90YXNrX3QpX19rbXBfdGVhbXNfbWFzdGVyKSB7CisgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChtYXN0ZXJfdGgtPnRoLnRoX3RlYW0gPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfc2VyaWFsX3RlYW0pOworICAgICAgICAgIHRlYW0gPSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW07CisgICAgICAgICAgLy8gdGVhbS0+dC50X3BrZm4gPSBtaWNyb3Rhc2s7CisgICAgICAgICAgdGVhbS0+dC50X2ludm9rZSA9IGludm9rZXI7CisgICAgICAgICAgX19rbXBfYWxsb2NfYXJndl9lbnRyaWVzKGFyZ2MsIHRlYW0sIFRSVUUpOworICAgICAgICAgIHRlYW0tPnQudF9hcmdjID0gYXJnYzsKKyAgICAgICAgICBhcmd2ID0gKHZvaWQgKiopdGVhbS0+dC50X2FyZ3Y7CisgICAgICAgICAgaWYgKGFwKSB7CisgICAgICAgICAgICBmb3IgKGkgPSBhcmdjIC0gMTsgaSA+PSAwOyAtLWkpCisvLyBUT0RPOiByZXZlcnQgd29ya2Fyb3VuZCBmb3IgSW50ZWwoUikgNjQgdHJhY2tlciAjOTYKKyNpZiAoS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KSAmJiBLTVBfT1NfTElOVVgKKyAgICAgICAgICAgICAgKmFyZ3YrKyA9IHZhX2FyZygqYXAsIHZvaWQgKik7CisjZWxzZQorICAgICAgICAgICAgICAqYXJndisrID0gdmFfYXJnKGFwLCB2b2lkICopOworI2VuZGlmCisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjOyArK2kpCisgICAgICAgICAgICAgIC8vIEdldCBhcmdzIGZyb20gcGFyZW50IHRlYW0gZm9yIHRlYW1zIGNvbnN0cnVjdAorICAgICAgICAgICAgICBhcmd2W2ldID0gcGFyZW50X3RlYW0tPnQudF9hcmd2W2ldOworICAgICAgICAgIH0KKyAgICAgICAgICAvLyBBQzogcmV2ZXJ0IGNoYW5nZSBtYWRlIGluIF9fa21wY19zZXJpYWxpemVkX3BhcmFsbGVsKCkKKyAgICAgICAgICAvLyAgICAgYmVjYXVzZSBpbml0aWFsIGNvZGUgaW4gdGVhbXMgc2hvdWxkIGhhdmUgbGV2ZWw9MAorICAgICAgICAgIHRlYW0tPnQudF9sZXZlbC0tOworICAgICAgICAgIC8vIEFDOiBjYWxsIHNwZWNpYWwgaW52b2tlciBmb3Igb3V0ZXIgInBhcmFsbGVsIiBvZiB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgICB7CisgICAgICAgICAgICBLTVBfVElNRV9QQVJUSVRJT05FRF9CTE9DSyhPTVBfcGFyYWxsZWwpOworICAgICAgICAgICAgS01QX1NFVF9USFJFQURfU1RBVEVfQkxPQ0soSU1QTElDSVRfVEFTSyk7CisgICAgICAgICAgICBpbnZva2VyKGd0aWQpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgICAgICAgIGFyZ3YgPSBhcmdzOworICAgICAgICAgIGZvciAoaSA9IGFyZ2MgLSAxOyBpID49IDA7IC0taSkKKy8vIFRPRE86IHJldmVydCB3b3JrYXJvdW5kIGZvciBJbnRlbChSKSA2NCB0cmFja2VyICM5NgorI2lmIChLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpICYmIEtNUF9PU19MSU5VWAorICAgICAgICAgICAgKmFyZ3YrKyA9IHZhX2FyZygqYXAsIHZvaWQgKik7CisjZWxzZQorICAgICAgICAgICphcmd2KysgPSB2YV9hcmcoYXAsIHZvaWQgKik7CisjZW5kaWYKKyAgICAgICAgICBLTVBfTUIoKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgIHZvaWQgKmR1bW15OworICAgICAgICAgIHZvaWQgKipleGl0X3J1bnRpbWVfcDsKKworICAgICAgICAgIG9tcHRfbHdfdGFza3RlYW1fdCBsd190YXNrdGVhbTsKKworICAgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgIF9fb21wdF9sd190YXNrdGVhbV9pbml0KCZsd190YXNrdGVhbSwgbWFzdGVyX3RoLCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW53cmFwcGVkX3Rhc2ssIG9tcHRfcGFyYWxsZWxfaWQpOworICAgICAgICAgICAgbHdfdGFza3RlYW0ub21wdF90YXNrX2luZm8udGFza19pZCA9IF9fb21wdF90YXNrX2lkX25ldyhndGlkKTsKKyAgICAgICAgICAgIGV4aXRfcnVudGltZV9wID0KKyAgICAgICAgICAgICAgICAmKGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLmZyYW1lLmV4aXRfcnVudGltZV9mcmFtZSk7CisKKyAgICAgICAgICAgIF9fb21wdF9sd190YXNrdGVhbV9saW5rKCZsd190YXNrdGVhbSwgbWFzdGVyX3RoKTsKKworI2lmIE9NUFRfVFJBQ0UKKyAgICAgICAgICAgIC8qIE9NUFQgaW1wbGljaXQgdGFzayBiZWdpbiAqLworICAgICAgICAgICAgbXlfdGFza19pZCA9IGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLnRhc2tfaWQ7CisgICAgICAgICAgICBteV9wYXJhbGxlbF9pZCA9IG9tcHRfcGFyYWxsZWxfaWQ7CisgICAgICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW4pKSB7CisgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luKSgKKyAgICAgICAgICAgICAgICAgIG15X3BhcmFsbGVsX2lkLCBteV90YXNrX2lkKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAvKiBPTVBUIHN0YXRlICovCisgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGV4aXRfcnVudGltZV9wID0gJmR1bW15OworICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgeworICAgICAgICAgICAgS01QX1RJTUVfUEFSVElUSU9ORURfQkxPQ0soT01QX3BhcmFsbGVsKTsKKyAgICAgICAgICAgIEtNUF9TRVRfVEhSRUFEX1NUQVRFX0JMT0NLKElNUExJQ0lUX1RBU0spOworICAgICAgICAgICAgX19rbXBfaW52b2tlX21pY3JvdGFzayhtaWNyb3Rhc2ssIGd0aWQsIDAsIGFyZ2MsIGFyZ3MKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0X3J1bnRpbWVfcAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgfQorCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgKmV4aXRfcnVudGltZV9wID0gTlVMTDsKKyAgICAgICAgICBpZiAob21wdF9lbmFibGVkKSB7CisjaWYgT01QVF9UUkFDRQorICAgICAgICAgICAgbHdfdGFza3RlYW0ub21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lID0gTlVMTDsKKworICAgICAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZCkpIHsKKyAgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kKSgKKyAgICAgICAgICAgICAgICAgIG15X3BhcmFsbGVsX2lkLCBteV90YXNrX2lkKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICBfX29tcHRfbHdfdGFza3RlYW1fdW5saW5rKG1hc3Rlcl90aCk7CisgICAgICAgICAgICAvLyByZXNldCBjbGVhciB0aGUgdGFzayBpZCBvbmx5IGFmdGVyIHVubGlua2luZyB0aGUgdGFzaworICAgICAgICAgICAgbHdfdGFza3RlYW0ub21wdF90YXNrX2luZm8udGFza19pZCA9IG9tcHRfdGFza19pZF9ub25lOworCisgICAgICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZCkpIHsKKyAgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZCkoCisgICAgICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2lkLCBvbXB0X3Rhc2tfaWQsIE9NUFRfSU5WT0tFUihjYWxsX2NvbnRleHQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfb3ZlcmhlYWQ7CisgICAgICAgICAgfQorI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgfQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgICB9IGVsc2UgaWYgKGNhbGxfY29udGV4dCA9PSBmb3JrX2NvbnRleHRfZ251KSB7CisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgIG9tcHRfbHdfdGFza3RlYW1fdCAqbHd0ID0KKyAgICAgICAgICAgIChvbXB0X2x3X3Rhc2t0ZWFtX3QgKilfX2ttcF9hbGxvY2F0ZShzaXplb2Yob21wdF9sd190YXNrdGVhbV90KSk7CisgICAgICAgIF9fb21wdF9sd190YXNrdGVhbV9pbml0KGx3dCwgbWFzdGVyX3RoLCBndGlkLCB1bndyYXBwZWRfdGFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZCk7CisKKyAgICAgICAgbHd0LT5vbXB0X3Rhc2tfaW5mby50YXNrX2lkID0gX19vbXB0X3Rhc2tfaWRfbmV3KGd0aWQpOworICAgICAgICBsd3QtPm9tcHRfdGFza19pbmZvLmZyYW1lLmV4aXRfcnVudGltZV9mcmFtZSA9IE5VTEw7CisgICAgICAgIF9fb21wdF9sd190YXNrdGVhbV9saW5rKGx3dCwgbWFzdGVyX3RoKTsKKyNlbmRpZgorCisgICAgICAgIC8vIHdlIHdlcmUgY2FsbGVkIGZyb20gR05VIG5hdGl2ZSBjb2RlCisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogVCMlZCBzZXJpYWwgZXhpdFxuIiwgZ3RpZCkpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9IGVsc2UgeworICAgICAgICBLTVBfQVNTRVJUMihjYWxsX2NvbnRleHQgPCBmb3JrX2NvbnRleHRfbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgIl9fa21wX2ZvcmtfY2FsbDogdW5rbm93biBmb3JrX2NvbnRleHQgcGFyYW1ldGVyIik7CisgICAgICB9CisKKyAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogVCMlZCBzZXJpYWwgZXhpdFxuIiwgZ3RpZCkpOworICAgICAgS01QX01CKCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLy8gR0VIOiBvbmx5IG1vZGlmeSB0aGUgZXhlY3V0aW5nIGZsYWcgaW4gdGhlIGNhc2Ugd2hlbiBub3Qgc2VyaWFsaXplZAorICAgIC8vICAgICAgc2VyaWFsaXplZCBjYXNlIGlzIGhhbmRsZWQgaW4ga21wY19zZXJpYWxpemVkX3BhcmFsbGVsCisgICAgS0ZfVFJBQ0UoMTAsICgiX19rbXBfZm9ya19jYWxsOiBwYXJlbnRfdGVhbV9hY2xldmVsPSVkLCBtYXN0ZXJfdGg9JXAsICIKKyAgICAgICAgICAgICAgICAgICJjdXJ0YXNrPSVwLCBjdXJ0YXNrX21heF9hY2xldmVsPSVkXG4iLAorICAgICAgICAgICAgICAgICAgcGFyZW50X3RlYW0tPnQudF9hY3RpdmVfbGV2ZWwsIG1hc3Rlcl90aCwKKyAgICAgICAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLAorICAgICAgICAgICAgICAgICAgbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubWF4X2FjdGl2ZV9sZXZlbHMpKTsKKyAgICAvLyBUT0RPOiBHRUggLSBjYW5ub3QgZG8gdGhpcyBhc3NlcnRpb24gYmVjYXVzZSByb290IHRocmVhZCBub3Qgc2V0IHVwIGFzCisgICAgLy8gZXhlY3V0aW5nCisgICAgLy8gS01QX0FTU0VSVCggbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ZsYWdzLmV4ZWN1dGluZyA9PSAxICk7CisgICAgbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ZsYWdzLmV4ZWN1dGluZyA9IDA7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmICghbWFzdGVyX3RoLT50aC50aF90ZWFtc19taWNyb3Rhc2sgfHwgbGV2ZWwgPiB0ZWFtc19sZXZlbCkKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgIHsKKyAgICAgIC8qIEluY3JlbWVudCBvdXIgbmVzdGVkIGRlcHRoIGxldmVsICovCisgICAgICBLTVBfVEVTVF9USEVOX0lOQzMyKChrbXBfaW50MzIgKikmcm9vdC0+ci5yX2luX3BhcmFsbGVsKTsKKyAgICB9CisKKyAgICAvLyBTZWUgaWYgd2UgbmVlZCB0byBtYWtlIGEgY29weSBvZiB0aGUgSUNWcy4KKyAgICBpbnQgbnRocmVhZHNfaWN2ID0gbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubnByb2M7CisgICAgaWYgKChsZXZlbCArIDEgPCBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQpICYmCisgICAgICAgIChfX2ttcF9uZXN0ZWRfbnRoLm50aFtsZXZlbCArIDFdICE9IG50aHJlYWRzX2ljdikpIHsKKyAgICAgIG50aHJlYWRzX2ljdiA9IF9fa21wX25lc3RlZF9udGgubnRoW2xldmVsICsgMV07CisgICAgfSBlbHNlIHsKKyAgICAgIG50aHJlYWRzX2ljdiA9IDA7IC8vIGRvbid0IHVwZGF0ZQorICAgIH0KKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgLy8gRmlndXJlIG91dCB0aGUgcHJvY19iaW5kX3BvbGljeSBmb3IgdGhlIG5ldyB0ZWFtLgorICAgIGttcF9wcm9jX2JpbmRfdCBwcm9jX2JpbmQgPSBtYXN0ZXJfdGgtPnRoLnRoX3NldF9wcm9jX2JpbmQ7CisgICAga21wX3Byb2NfYmluZF90IHByb2NfYmluZF9pY3YgPQorICAgICAgICBwcm9jX2JpbmRfZGVmYXVsdDsgLy8gcHJvY19iaW5kX2RlZmF1bHQgbWVhbnMgZG9uJ3QgdXBkYXRlCisgICAgaWYgKG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnByb2NfYmluZCA9PSBwcm9jX2JpbmRfZmFsc2UpIHsKKyAgICAgIHByb2NfYmluZCA9IHByb2NfYmluZF9mYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHByb2NfYmluZCA9PSBwcm9jX2JpbmRfZGVmYXVsdCkgeworICAgICAgICAvLyBObyBwcm9jX2JpbmQgY2xhdXNlIHNwZWNpZmllZDsgdXNlIGN1cnJlbnQgcHJvYy1iaW5kLXZhciBmb3IgdGhpcworICAgICAgICAvLyBwYXJhbGxlbCByZWdpb24KKyAgICAgICAgcHJvY19iaW5kID0gbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMucHJvY19iaW5kOworICAgICAgfQorICAgICAgLyogZWxzZTogVGhlIHByb2NfYmluZCBwb2xpY3kgd2FzIHNwZWNpZmllZCBleHBsaWNpdGx5IG9uIHBhcmFsbGVsIGNsYXVzZS4KKyAgICAgICAgIFRoaXMgb3ZlcnJpZGVzIHByb2MtYmluZC12YXIgZm9yIHRoaXMgcGFyYWxsZWwgcmVnaW9uLCBidXQgZG9lcyBub3QKKyAgICAgICAgIGNoYW5nZSBwcm9jLWJpbmQtdmFyLiAqLworICAgICAgLy8gRmlndXJlIHRoZSB2YWx1ZSBvZiBwcm9jLWJpbmQtdmFyIGZvciB0aGUgY2hpbGQgdGhyZWFkcy4KKyAgICAgIGlmICgobGV2ZWwgKyAxIDwgX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkKSAmJgorICAgICAgICAgIChfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbbGV2ZWwgKyAxXSAhPQorICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5wcm9jX2JpbmQpKSB7CisgICAgICAgIHByb2NfYmluZF9pY3YgPSBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbbGV2ZWwgKyAxXTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZXNldCBmb3IgbmV4dCBwYXJhbGxlbCByZWdpb24KKyAgICBtYXN0ZXJfdGgtPnRoLnRoX3NldF9wcm9jX2JpbmQgPSBwcm9jX2JpbmRfZGVmYXVsdDsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgICAgaWYgKChudGhyZWFkc19pY3YgPiAwKQorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgIHx8IChwcm9jX2JpbmRfaWN2ICE9IHByb2NfYmluZF9kZWZhdWx0KQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgICAgICAgICApIHsKKyAgICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgbmV3X2ljdnM7CisgICAgICBjb3B5X2ljdnMoJm5ld19pY3ZzLCAmbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMpOworICAgICAgbmV3X2ljdnMubmV4dCA9IE5VTEw7CisgICAgICBpZiAobnRocmVhZHNfaWN2ID4gMCkgeworICAgICAgICBuZXdfaWN2cy5ucHJvYyA9IG50aHJlYWRzX2ljdjsKKyAgICAgIH0KKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICBpZiAocHJvY19iaW5kX2ljdiAhPSBwcm9jX2JpbmRfZGVmYXVsdCkgeworICAgICAgICBuZXdfaWN2cy5wcm9jX2JpbmQgPSBwcm9jX2JpbmRfaWN2OworICAgICAgfQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyAgICAgIC8qIGFsbG9jYXRlIGEgbmV3IHBhcmFsbGVsIHRlYW0gKi8KKyAgICAgIEtGX1RSQUNFKDEwLCAoIl9fa21wX2ZvcmtfY2FsbDogYmVmb3JlIF9fa21wX2FsbG9jYXRlX3RlYW1cbiIpKTsKKyAgICAgIHRlYW0gPSBfX2ttcF9hbGxvY2F0ZV90ZWFtKHJvb3QsIG50aHJlYWRzLCBudGhyZWFkcywKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfaWQsCisjZW5kaWYKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY19iaW5kLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3X2ljdnMsIGFyZ2MgVVNFX05FU1RFRF9IT1RfQVJHKG1hc3Rlcl90aCkpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBhbGxvY2F0ZSBhIG5ldyBwYXJhbGxlbCB0ZWFtICovCisgICAgICBLRl9UUkFDRSgxMCwgKCJfX2ttcF9mb3JrX2NhbGw6IGJlZm9yZSBfX2ttcF9hbGxvY2F0ZV90ZWFtXG4iKSk7CisgICAgICB0ZWFtID0gX19rbXBfYWxsb2NhdGVfdGVhbShyb290LCBudGhyZWFkcywgbnRocmVhZHMsCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2lkLAorI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2NfYmluZCwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnYyBVU0VfTkVTVEVEX0hPVF9BUkcobWFzdGVyX3RoKSk7CisgICAgfQorICAgIEtGX1RSQUNFKAorICAgICAgICAxMCwgKCJfX2ttcF9mb3JrX2NhbGw6IGFmdGVyIF9fa21wX2FsbG9jYXRlX3RlYW0gLSB0ZWFtID0gJXBcbiIsIHRlYW0pKTsKKworICAgIC8qIHNldHVwIHRoZSBuZXcgdGVhbSAqLworICAgIEtNUF9DSEVDS19VUERBVEUodGVhbS0+dC50X21hc3Rlcl90aWQsIG1hc3Rlcl90aWQpOworICAgIEtNUF9DSEVDS19VUERBVEUodGVhbS0+dC50X21hc3Rlcl90aGlzX2NvbnMsIG1hc3Rlcl90aGlzX2NvbnMpOworICAgIEtNUF9DSEVDS19VUERBVEUodGVhbS0+dC50X2lkZW50LCBsb2MpOworICAgIEtNUF9DSEVDS19VUERBVEUodGVhbS0+dC50X3BhcmVudCwgcGFyZW50X3RlYW0pOworICAgIEtNUF9DSEVDS19VUERBVEVfU1lOQyh0ZWFtLT50LnRfcGtmbiwgbWljcm90YXNrKTsKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBLTVBfQ0hFQ0tfVVBEQVRFX1NZTkModGVhbS0+dC5vbXB0X3RlYW1faW5mby5taWNyb3Rhc2ssIHVud3JhcHBlZF90YXNrKTsKKyNlbmRpZgorICAgIEtNUF9DSEVDS19VUERBVEUodGVhbS0+dC50X2ludm9rZSwgaW52b2tlcik7IC8vIFRPRE8gbW92ZSB0byByb290LCBtYXliZQorLy8gVE9ETzogcGFyZW50X3RlYW0tPnQudF9sZXZlbCA9PSBJTlRfTUFYID8/PworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKCFtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayB8fCBsZXZlbCA+IHRlYW1zX2xldmVsKSB7CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgIGludCBuZXdfbGV2ZWwgPSBwYXJlbnRfdGVhbS0+dC50X2xldmVsICsgMTsKKyAgICAgIEtNUF9DSEVDS19VUERBVEUodGVhbS0+dC50X2xldmVsLCBuZXdfbGV2ZWwpOworICAgICAgbmV3X2xldmVsID0gcGFyZW50X3RlYW0tPnQudF9hY3RpdmVfbGV2ZWwgKyAxOworICAgICAgS01QX0NIRUNLX1VQREFURSh0ZWFtLT50LnRfYWN0aXZlX2xldmVsLCBuZXdfbGV2ZWwpOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEFDOiBEbyBub3QgaW5jcmVhc2UgcGFyYWxsZWwgbGV2ZWwgYXQgc3RhcnQgb2YgdGhlIHRlYW1zIGNvbnN0cnVjdAorICAgICAgaW50IG5ld19sZXZlbCA9IHBhcmVudF90ZWFtLT50LnRfbGV2ZWw7CisgICAgICBLTVBfQ0hFQ0tfVVBEQVRFKHRlYW0tPnQudF9sZXZlbCwgbmV3X2xldmVsKTsKKyAgICAgIG5ld19sZXZlbCA9IHBhcmVudF90ZWFtLT50LnRfYWN0aXZlX2xldmVsOworICAgICAgS01QX0NIRUNLX1VQREFURSh0ZWFtLT50LnRfYWN0aXZlX2xldmVsLCBuZXdfbGV2ZWwpOworICAgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgIGttcF9yX3NjaGVkX3QgbmV3X3NjaGVkID0gZ2V0X19zY2hlZF8yKHBhcmVudF90ZWFtLCBtYXN0ZXJfdGlkKTsKKyAgICBpZiAodGVhbS0+dC50X3NjaGVkLnJfc2NoZWRfdHlwZSAhPSBuZXdfc2NoZWQucl9zY2hlZF90eXBlIHx8CisgICAgICAgIHRlYW0tPnQudF9zY2hlZC5jaHVuayAhPSBuZXdfc2NoZWQuY2h1bmspCisgICAgICB0ZWFtLT50LnRfc2NoZWQgPQorICAgICAgICAgIG5ld19zY2hlZDsgLy8gc2V0IG1hc3RlcidzIHNjaGVkdWxlIGFzIG5ldyBydW4tdGltZSBzY2hlZHVsZQorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBLTVBfQ0hFQ0tfVVBEQVRFKHRlYW0tPnQudF9jYW5jZWxfcmVxdWVzdCwgY2FuY2VsX25vcmVxKTsKKyNlbmRpZgorCisgICAgLy8gVXBkYXRlIHRoZSBmbG9hdGluZyBwb2ludCByb3VuZGluZyBpbiB0aGUgdGVhbSBpZiByZXF1aXJlZC4KKyAgICBwcm9wYWdhdGVGUENvbnRyb2wodGVhbSk7CisKKyAgICBpZiAoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyAgICAgIC8vIFNldCBtYXN0ZXIncyB0YXNrIHRlYW0gdG8gdGVhbSdzIHRhc2sgdGVhbS4gVW5sZXNzIHRoaXMgaXMgaG90IHRlYW0sIGl0CisgICAgICAvLyBzaG91bGQgYmUgTlVMTC4KKyAgICAgIEtNUF9ERUJVR19BU1NFUlQobWFzdGVyX3RoLT50aC50aF90YXNrX3RlYW0gPT0KKyAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50X3RlYW0tPnQudF90YXNrX3RlYW1bbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlXSk7CisgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9mb3JrX2NhbGw6IE1hc3RlciBUIyVkIHB1c2hpbmcgdGFza190ZWFtICVwIC8gdGVhbSAiCisgICAgICAgICAgICAgICAgICAgICIlcCwgbmV3IHRhc2tfdGVhbSAlcCAvIHRlYW0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQobWFzdGVyX3RoKSwKKyAgICAgICAgICAgICAgICAgICAgbWFzdGVyX3RoLT50aC50aF90YXNrX3RlYW0sIHBhcmVudF90ZWFtLAorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGFza190ZWFtW21hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV0sIHRlYW0pKTsKKworICAgICAgaWYgKGFjdGl2ZV9sZXZlbCB8fCBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfdGVhbSkgeworICAgICAgICAvLyBUYWtlIGEgbWVtbyBvZiBtYXN0ZXIncyB0YXNrX3N0YXRlCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQobWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX21lbW9fc3RhY2spOworICAgICAgICBpZiAobWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX3RvcCA+PQorICAgICAgICAgICAgbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX3N0YWNrX3N6KSB7IC8vIGluY3JlYXNlIHNpemUKKyAgICAgICAgICBrbXBfdWludDMyIG5ld19zaXplID0gMiAqIG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV9zdGFja19zejsKKyAgICAgICAgICBrbXBfdWludDggKm9sZF9zdGFjaywgKm5ld19zdGFjazsKKyAgICAgICAgICBrbXBfdWludDMyIGk7CisgICAgICAgICAgbmV3X3N0YWNrID0gKGttcF91aW50OCAqKV9fa21wX2FsbG9jYXRlKG5ld19zaXplKTsKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX3N0YWNrX3N6OyArK2kpIHsKKyAgICAgICAgICAgIG5ld19zdGFja1tpXSA9IG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV9tZW1vX3N0YWNrW2ldOworICAgICAgICAgIH0KKyAgICAgICAgICBmb3IgKGkgPSBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfc3RhY2tfc3o7IGkgPCBuZXdfc2l6ZTsKKyAgICAgICAgICAgICAgICsraSkgeyAvLyB6ZXJvLWluaXQgcmVzdCBvZiBzdGFjaworICAgICAgICAgICAgbmV3X3N0YWNrW2ldID0gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgb2xkX3N0YWNrID0gbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX21lbW9fc3RhY2s7CisgICAgICAgICAgbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX21lbW9fc3RhY2sgPSBuZXdfc3RhY2s7CisgICAgICAgICAgbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX3N0YWNrX3N6ID0gbmV3X3NpemU7CisgICAgICAgICAgX19rbXBfZnJlZShvbGRfc3RhY2spOworICAgICAgICB9CisgICAgICAgIC8vIFN0b3JlIG1hc3RlcidzIHRhc2tfc3RhdGUgb24gc3RhY2sKKyAgICAgICAgbWFzdGVyX3RoLT50aAorICAgICAgICAgICAgLnRoX3Rhc2tfc3RhdGVfbWVtb19zdGFja1ttYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfdG9wXSA9CisgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGU7CisgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV90b3ArKzsKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgICAgICBpZiAodGVhbSA9PSBtYXN0ZXJfdGgtPnRoLnRoX2hvdF90ZWFtc1thY3RpdmVfbGV2ZWxdLmhvdF90ZWFtKSB7CisgICAgICAgICAgLy8gUmVzdG9yZSBtYXN0ZXIncyBuZXN0ZWQgc3RhdGUgaWYgbmVzdGVkIGhvdCB0ZWFtCisgICAgICAgICAgbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlID0KKyAgICAgICAgICAgICAgbWFzdGVyX3RoLT50aAorICAgICAgICAgICAgICAgICAgLnRoX3Rhc2tfc3RhdGVfbWVtb19zdGFja1ttYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfdG9wXTsKKyAgICAgICAgfSBlbHNlIHsKKyNlbmRpZgorICAgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZSA9IDA7CisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgICAgfQorI2VuZGlmCisgICAgICB9CisjaWYgIUtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgICBLTVBfREVCVUdfQVNTRVJUKChtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfdGVhbSA9PSBOVUxMKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAodGVhbSA9PSByb290LT5yLnJfaG90X3RlYW0pKTsKKyNlbmRpZgorICAgIH0KKworICAgIEtBX1RSQUNFKAorICAgICAgICAyMCwKKyAgICAgICAgKCJfX2ttcF9mb3JrX2NhbGw6IFQjJWQoJWQ6JWQpLT4oJWQ6MCkgY3JlYXRlZCBhIHRlYW0gb2YgJWQgdGhyZWFkc1xuIiwKKyAgICAgICAgIGd0aWQsIHBhcmVudF90ZWFtLT50LnRfaWQsIHRlYW0tPnQudF9tYXN0ZXJfdGlkLCB0ZWFtLT50LnRfaWQsCisgICAgICAgICB0ZWFtLT50LnRfbnByb2MpKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0gIT0gcm9vdC0+ci5yX2hvdF90ZWFtIHx8CisgICAgICAgICAgICAgICAgICAgICAodGVhbS0+dC50X21hc3Rlcl90aWQgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICh0ZWFtLT50LnRfcGFyZW50ID09IHJvb3QtPnIucl9yb290X3RlYW0gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3BhcmVudC0+dC50X3NlcmlhbGl6ZWQpKSk7CisgICAgS01QX01CKCk7CisKKyAgICAvKiBub3csIHNldHVwIHRoZSBhcmd1bWVudHMgKi8KKyAgICBhcmd2ID0gKHZvaWQgKiopdGVhbS0+dC50X2FyZ3Y7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAoYXApIHsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgICAgZm9yIChpID0gYXJnYyAtIDE7IGkgPj0gMDsgLS1pKSB7CisvLyBUT0RPOiByZXZlcnQgd29ya2Fyb3VuZCBmb3IgSW50ZWwoUikgNjQgdHJhY2tlciAjOTYKKyNpZiAoS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KSAmJiBLTVBfT1NfTElOVVgKKyAgICAgICAgdm9pZCAqbmV3X2FyZ3YgPSB2YV9hcmcoKmFwLCB2b2lkICopOworI2Vsc2UKKyAgICAgIHZvaWQgKm5ld19hcmd2ID0gdmFfYXJnKGFwLCB2b2lkICopOworI2VuZGlmCisgICAgICAgIEtNUF9DSEVDS19VUERBVEUoKmFyZ3YsIG5ld19hcmd2KTsKKyAgICAgICAgYXJndisrOworICAgICAgfQorI2lmIE9NUF80MF9FTkFCTEVECisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjOyArK2kpIHsKKyAgICAgICAgLy8gR2V0IGFyZ3MgZnJvbSBwYXJlbnQgdGVhbSBmb3IgdGVhbXMgY29uc3RydWN0CisgICAgICAgIEtNUF9DSEVDS19VUERBVEUoYXJndltpXSwgdGVhbS0+dC50X3BhcmVudC0+dC50X2FyZ3ZbaV0pOworICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgICAgLyogbm93IGFjdHVhbGx5IGZvcmsgdGhlIHRocmVhZHMgKi8KKyAgICBLTVBfQ0hFQ0tfVVBEQVRFKHRlYW0tPnQudF9tYXN0ZXJfYWN0aXZlLCBtYXN0ZXJfYWN0aXZlKTsKKyAgICBpZiAoIXJvb3QtPnIucl9hY3RpdmUpIC8vIE9ubHkgZG8gYXNzaWdubWVudCBpZiBpdCBwcmV2ZW50cyBjYWNoZSBwaW5nLXBvbmcKKyAgICAgIHJvb3QtPnIucl9hY3RpdmUgPSBUUlVFOworCisgICAgX19rbXBfZm9ya190ZWFtX3RocmVhZHMocm9vdCwgdGVhbSwgbWFzdGVyX3RoLCBndGlkKTsKKyAgICBfX2ttcF9zZXR1cF9pY3ZfY29weSh0ZWFtLCBudGhyZWFkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMsIGxvYyk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBtYXN0ZXJfdGgtPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWw7CisjZW5kaWYKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJl9fa21wX2Zvcmtqb2luX2xvY2spOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGlmICh0ZWFtLT50LnRfYWN0aXZlX2xldmVsID09IDEgLy8gb25seSByZXBvcnQgZnJhbWVzIGF0IGxldmVsIDEKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAmJiAhbWFzdGVyX3RoLT50aC50aF90ZWFtc19taWNyb3Rhc2sgLy8gbm90IGluIHRlYW1zIGNvbnN0cnVjdAorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgICAgICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgICBpZiAoKF9faXR0X2ZyYW1lX3N1Ym1pdF92M19wdHIgfHwgS01QX0lUVF9ERUJVRykgJiYKKyAgICAgICAgICAoX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMyB8fAorICAgICAgICAgICBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAxKSkgeworICAgICAgICBrbXBfdWludDY0IHRtcF90aW1lID0gMDsKKyAgICAgICAgaWYgKF9faXR0X2dldF90aW1lc3RhbXBfcHRyKQorICAgICAgICAgIHRtcF90aW1lID0gX19pdHRfZ2V0X3RpbWVzdGFtcCgpOworICAgICAgICAvLyBJbnRlcm5hbCBmb3JrIC0gcmVwb3J0IGZyYW1lIGJlZ2luCisgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfZnJhbWVfdGltZSA9IHRtcF90aW1lOworICAgICAgICBpZiAoX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMykKKyAgICAgICAgICB0ZWFtLT50LnRfcmVnaW9uX3RpbWUgPSB0bXBfdGltZTsKKyAgICAgIH0gZWxzZQorLy8gb25seSBvbmUgbm90aWZpY2F0aW9uIHNjaGVtZSAoZWl0aGVyICJzdWJtaXQiIG9yICJmb3JraW5nL2pvaW5lZCIsIG5vdCBib3RoKQorI2VuZGlmIC8qIFVTRV9JVFRfTk9USUZZICovCisgICAgICAgICAgaWYgKChfX2l0dF9mcmFtZV9iZWdpbl92M19wdHIgfHwgS01QX0lUVF9ERUJVRykgJiYKKyAgICAgICAgICAgICAgX19rbXBfZm9ya2pvaW5fZnJhbWVzICYmICFfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSkgeworICAgICAgICAvLyBNYXJrIHN0YXJ0IG9mICJwYXJhbGxlbCIgcmVnaW9uIGZvciBWVHVuZS4KKyAgICAgICAgX19rbXBfaXR0X3JlZ2lvbl9mb3JraW5nKGd0aWQsIHRlYW0tPnQudF9ucHJvYywgMCk7CisgICAgICB9CisgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIC8qIG5vdyBnbyBvbiBhbmQgZG8gdGhlIHdvcmsgKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0gPT0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbSk7CisgICAgS01QX01CKCk7CisgICAgS0ZfVFJBQ0UoMTAsCisgICAgICAgICAgICAgKCJfX2ttcF9pbnRlcm5hbF9mb3JrIDogcm9vdD0lcCwgdGVhbT0lcCwgbWFzdGVyX3RoPSVwLCBndGlkPSVkXG4iLAorICAgICAgICAgICAgICByb290LCB0ZWFtLCBtYXN0ZXJfdGgsIGd0aWQpKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBpZiAoX19pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZV9wdHIpIHsKKyAgICAgIHRlYW0tPnQudF9zdGFja19pZCA9CisgICAgICAgICAgX19rbXBfaXR0X3N0YWNrX2NhbGxlcl9jcmVhdGUoKTsgLy8gY3JlYXRlIG5ldyBzdGFjayBzdGl0Y2hpbmcgaWQKKyAgICAgIC8vIGJlZm9yZSBlbnRlcmluZyBmb3JrIGJhcnJpZXIKKyAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAvLyBBQzogc2tpcCBfX2ttcF9pbnRlcm5hbF9mb3JrIGF0IHRlYW1zIGNvbnN0cnVjdCwgbGV0IG9ubHkgbWFzdGVyCisgICAgLy8gdGhyZWFkcyBleGVjdXRlCisgICAgaWYgKGFwKQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgeworICAgICAgX19rbXBfaW50ZXJuYWxfZm9yayhsb2MsIGd0aWQsIHRlYW0pOworICAgICAgS0ZfVFJBQ0UoMTAsICgiX19rbXBfaW50ZXJuYWxfZm9yayA6IGFmdGVyIDogcm9vdD0lcCwgdGVhbT0lcCwgIgorICAgICAgICAgICAgICAgICAgICAibWFzdGVyX3RoPSVwLCBndGlkPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICByb290LCB0ZWFtLCBtYXN0ZXJfdGgsIGd0aWQpKTsKKyAgICB9CisKKyAgICBpZiAoY2FsbF9jb250ZXh0ID09IGZvcmtfY29udGV4dF9nbnUpIHsKKyAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogcGFyYWxsZWwgZXhpdCBUIyVkXG4iLCBndGlkKSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgICAvKiBJbnZva2UgbWljcm90YXNrIGZvciBNQVNURVIgdGhyZWFkICovCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfZm9ya19jYWxsOiBUIyVkKCVkOjApIGludm9rZSBtaWNyb3Rhc2sgPSAlcFxuIiwgZ3RpZCwKKyAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgdGVhbS0+dC50X3BrZm4pKTsKKyAgfSAvLyBFTkQgb2YgdGltZXIgS01QX2ZvcmtfY2FsbCBibG9jaworCisgIHsKKyAgICBLTVBfVElNRV9QQVJUSVRJT05FRF9CTE9DSyhPTVBfcGFyYWxsZWwpOworICAgIEtNUF9TRVRfVEhSRUFEX1NUQVRFX0JMT0NLKElNUExJQ0lUX1RBU0spOworICAgIGlmICghdGVhbS0+dC50X2ludm9rZShndGlkKSkgeworICAgICAgS01QX0FTU0VSVDIoMCwgImNhbm5vdCBpbnZva2UgbWljcm90YXNrIGZvciBNQVNURVIgdGhyZWFkIik7CisgICAgfQorICB9CisgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogVCMlZCglZDowKSBkb25lIG1pY3JvdGFzayA9ICVwXG4iLCBndGlkLAorICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgdGVhbS0+dC50X3BrZm4pKTsKKyAgS01QX01CKCk7IC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgS0FfVFJBQ0UoMjAsICgiX19rbXBfZm9ya19jYWxsOiBwYXJhbGxlbCBleGl0IFQjJWRcbiIsIGd0aWQpKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgbWFzdGVyX3RoLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV9vdmVyaGVhZDsKKyAgfQorI2VuZGlmCisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNpZiBPTVBUX1NVUFBPUlQKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2ttcF9qb2luX3Jlc3RvcmVfc3RhdGUoa21wX2luZm9fdCAqdGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdGVhbV90ICp0ZWFtKSB7CisgIC8vIHJlc3RvcmUgc3RhdGUgb3V0c2lkZSB0aGUgcmVnaW9uCisgIHRocmVhZC0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9CisgICAgICAoKHRlYW0tPnQudF9zZXJpYWxpemVkKSA/IG9tcHRfc3RhdGVfd29ya19zZXJpYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogb21wdF9zdGF0ZV93b3JrX3BhcmFsbGVsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fa21wX2pvaW5fb21wdChrbXBfaW5mb190ICp0aHJlYWQsIGttcF90ZWFtX3QgKnRlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ya19jb250ZXh0X2UgZm9ya19jb250ZXh0KSB7CisgIG9tcHRfdGFza19pbmZvX3QgKnRhc2tfaW5mbyA9IF9fb21wdF9nZXRfdGFza2luZm8oMCk7CisgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kKSkgeworICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9wYXJhbGxlbF9lbmQpKAorICAgICAgICBwYXJhbGxlbF9pZCwgdGFza19pbmZvLT50YXNrX2lkLCBPTVBUX0lOVk9LRVIoZm9ya19jb250ZXh0KSk7CisgIH0KKworICB0YXNrX2luZm8tPmZyYW1lLnJlZW50ZXJfcnVudGltZV9mcmFtZSA9IE5VTEw7CisgIF9fa21wX2pvaW5fcmVzdG9yZV9zdGF0ZSh0aHJlYWQsIHRlYW0pOworfQorI2VuZGlmCisKK3ZvaWQgX19rbXBfam9pbl9jYWxsKGlkZW50X3QgKmxvYywgaW50IGd0aWQKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgICAgIGVudW0gZm9ya19jb250ZXh0X2UgZm9ya19jb250ZXh0CisjZW5kaWYKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAgICAgaW50IGV4aXRfdGVhbXMKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgICAgICAgICAgICAgICAgICAgKSB7CisgIEtNUF9USU1FX0RFVkVMT1BFUl9QQVJUSVRJT05FRF9CTE9DSyhLTVBfam9pbl9jYWxsKTsKKyAga21wX3RlYW1fdCAqdGVhbTsKKyAga21wX3RlYW1fdCAqcGFyZW50X3RlYW07CisgIGttcF9pbmZvX3QgKm1hc3Rlcl90aDsKKyAga21wX3Jvb3RfdCAqcm9vdDsKKyAgaW50IG1hc3Rlcl9hY3RpdmU7CisgIGludCBpOworCisgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2pvaW5fY2FsbDogZW50ZXIgVCMlZFxuIiwgZ3RpZCkpOworCisgIC8qIHNldHVwIGN1cnJlbnQgZGF0YSAqLworICBtYXN0ZXJfdGggPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICByb290ID0gbWFzdGVyX3RoLT50aC50aF9yb290OworICB0ZWFtID0gbWFzdGVyX3RoLT50aC50aF90ZWFtOworICBwYXJlbnRfdGVhbSA9IHRlYW0tPnQudF9wYXJlbnQ7CisKKyAgbWFzdGVyX3RoLT50aC50aF9pZGVudCA9IGxvYzsKKworI2lmIE9NUFRfU1VQUE9SVAorICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgbWFzdGVyX3RoLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV9vdmVyaGVhZDsKKyAgfQorI2VuZGlmCisKKyNpZiBLTVBfREVCVUcKKyAgaWYgKF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICYmICFleGl0X3RlYW1zKSB7CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfam9pbl9jYWxsOiBUIyVkLCBvbGQgdGVhbSA9ICVwIG9sZCB0YXNrX3RlYW0gPSAlcCwgIgorICAgICAgICAgICAgICAgICAgInRoX3Rhc2tfdGVhbSA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZChtYXN0ZXJfdGgpLCB0ZWFtLAorICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3Rhc2tfdGVhbVttYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVdLAorICAgICAgICAgICAgICAgICAgbWFzdGVyX3RoLT50aC50aF90YXNrX3RlYW0pKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKG1hc3Rlcl90aC0+dGgudGhfdGFza190ZWFtID09CisgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGFza190ZWFtW21hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV0pOworICB9CisjZW5kaWYKKworICBpZiAodGVhbS0+dC50X3NlcmlhbGl6ZWQpIHsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmIChtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzaykgeworICAgICAgLy8gV2UgYXJlIGluIHRlYW1zIGNvbnN0cnVjdAorICAgICAgaW50IGxldmVsID0gdGVhbS0+dC50X2xldmVsOworICAgICAgaW50IHRsZXZlbCA9IG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbGV2ZWw7CisgICAgICBpZiAobGV2ZWwgPT0gdGxldmVsKSB7CisgICAgICAgIC8vIEFDOiB3ZSBoYXZlbid0IGluY3JlbWVudGVkIGl0IGVhcmxpZXIgYXQgc3RhcnQgb2YgdGVhbXMgY29uc3RydWN0LAorICAgICAgICAvLyAgICAgc28gZG8gaXQgaGVyZSAtIGF0IHRoZSBlbmQgb2YgdGVhbXMgY29uc3RydWN0CisgICAgICAgIHRlYW0tPnQudF9sZXZlbCsrOworICAgICAgfSBlbHNlIGlmIChsZXZlbCA9PSB0bGV2ZWwgKyAxKSB7CisgICAgICAgIC8vIEFDOiB3ZSBhcmUgZXhpdGluZyBwYXJhbGxlbCBpbnNpZGUgdGVhbXMsIG5lZWQgdG8gaW5jcmVtZW50CisgICAgICAgIC8vIHNlcmlhbGl6YXRpb24gaW4gb3JkZXIgdG8gcmVzdG9yZSBpdCBpbiB0aGUgbmV4dCBjYWxsIHRvCisgICAgICAgIC8vIF9fa21wY19lbmRfc2VyaWFsaXplZF9wYXJhbGxlbAorICAgICAgICB0ZWFtLT50LnRfc2VyaWFsaXplZCsrOworICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgIF9fa21wY19lbmRfc2VyaWFsaXplZF9wYXJhbGxlbChsb2MsIGd0aWQpOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgX19rbXBfam9pbl9yZXN0b3JlX3N0YXRlKG1hc3Rlcl90aCwgcGFyZW50X3RlYW0pOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuOworICB9CisKKyAgbWFzdGVyX2FjdGl2ZSA9IHRlYW0tPnQudF9tYXN0ZXJfYWN0aXZlOworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgaWYgKCFleGl0X3RlYW1zKQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgIHsKKyAgICAvLyBBQzogTm8gYmFycmllciBmb3IgaW50ZXJuYWwgdGVhbXMgYXQgZXhpdCBmcm9tIHRlYW1zIGNvbnN0cnVjdC4KKyAgICAvLyAgICAgQnV0IHRoZXJlIGlzIGJhcnJpZXIgZm9yIGV4dGVybmFsIHRlYW0gKGxlYWd1ZSkuCisgICAgX19rbXBfaW50ZXJuYWxfam9pbihsb2MsIGd0aWQsIHRlYW0pOworICB9CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgZWxzZSB7CisgICAgbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlID0KKyAgICAgICAgMDsgLy8gQUM6IG5vIHRhc2tpbmcgaW4gdGVhbXMgKG91dCBvZiBhbnkgcGFyYWxsZWwpCisgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgIEtNUF9NQigpOworCisjaWYgT01QVF9TVVBQT1JUCisgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCA9IHRlYW0tPnQub21wdF90ZWFtX2luZm8ucGFyYWxsZWxfaWQ7CisjZW5kaWYKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgaWYgKF9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGVfcHRyKSB7CisgICAgX19rbXBfaXR0X3N0YWNrX2NhbGxlcl9kZXN0cm95KAorICAgICAgICAoX19pdHRfY2FsbGVyKXRlYW0tPnQKKyAgICAgICAgICAgIC50X3N0YWNrX2lkKTsgLy8gZGVzdHJveSB0aGUgc3RhY2sgc3RpdGNoaW5nIGlkIGFmdGVyIGpvaW4gYmFycmllcgorICB9CisKKyAgLy8gTWFyayBlbmQgb2YgInBhcmFsbGVsIiByZWdpb24gZm9yIFZUdW5lLgorICBpZiAodGVhbS0+dC50X2FjdGl2ZV9sZXZlbCA9PSAxCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICYmICFtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayAvKiBub3QgaW4gdGVhbXMgY29uc3RydWN0ICovCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICkgeworICAgIG1hc3Rlcl90aC0+dGgudGhfaWRlbnQgPSBsb2M7CisgICAgLy8gb25seSBvbmUgbm90aWZpY2F0aW9uIHNjaGVtZSAoZWl0aGVyICJzdWJtaXQiIG9yICJmb3JraW5nL2pvaW5lZCIsIG5vdAorICAgIC8vIGJvdGgpCisgICAgaWYgKChfX2l0dF9mcmFtZV9zdWJtaXRfdjNfcHRyIHx8IEtNUF9JVFRfREVCVUcpICYmCisgICAgICAgIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDMpCisgICAgICBfX2ttcF9pdHRfZnJhbWVfc3VibWl0KGd0aWQsIHRlYW0tPnQudF9yZWdpb25fdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzdGVyX3RoLT50aC50aF9mcmFtZV90aW1lLCAwLCBsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfdGVhbV9ucHJvYywgMSk7CisgICAgZWxzZSBpZiAoKF9faXR0X2ZyYW1lX2VuZF92M19wdHIgfHwgS01QX0lUVF9ERUJVRykgJiYKKyAgICAgICAgICAgICAhX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgJiYgX19rbXBfZm9ya2pvaW5fZnJhbWVzKQorICAgICAgX19rbXBfaXR0X3JlZ2lvbl9qb2luZWQoZ3RpZCk7CisgIH0gLy8gYWN0aXZlX2xldmVsID09IDEKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICBpZiAobWFzdGVyX3RoLT50aC50aF90ZWFtc19taWNyb3Rhc2sgJiYgIWV4aXRfdGVhbXMgJiYKKyAgICAgIHRlYW0tPnQudF9wa2ZuICE9IChtaWNyb3Rhc2tfdClfX2ttcF90ZWFtc19tYXN0ZXIgJiYKKyAgICAgIHRlYW0tPnQudF9sZXZlbCA9PSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX2xldmVsICsgMSkgeworICAgIC8vIEFDOiBXZSBuZWVkIHRvIGxlYXZlIHRoZSB0ZWFtIHN0cnVjdHVyZSBpbnRhY3QgYXQgdGhlIGVuZCBvZiBwYXJhbGxlbAorICAgIC8vIGluc2lkZSB0aGUgdGVhbXMgY29uc3RydWN0LCBzbyB0aGF0IGF0IHRoZSBuZXh0IHBhcmFsbGVsIHNhbWUgKGhvdCkgdGVhbQorICAgIC8vIHdvcmtzLCBvbmx5IGFkanVzdCBuZXN0aW5nIGxldmVscworCisgICAgLyogRGVjcmVtZW50IG91ciBuZXN0ZWQgZGVwdGggbGV2ZWwgKi8KKyAgICB0ZWFtLT50LnRfbGV2ZWwtLTsKKyAgICB0ZWFtLT50LnRfYWN0aXZlX2xldmVsLS07CisgICAgS01QX1RFU1RfVEhFTl9ERUMzMigoa21wX2ludDMyICopJnJvb3QtPnIucl9pbl9wYXJhbGxlbCk7CisKKyAgICAvKiBSZXN0b3JlIG51bWJlciBvZiB0aHJlYWRzIGluIHRoZSB0ZWFtIGlmIG5lZWRlZCAqLworICAgIGlmIChtYXN0ZXJfdGgtPnRoLnRoX3RlYW1fbnByb2MgPCBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX3NpemUubnRoKSB7CisgICAgICBpbnQgb2xkX251bSA9IG1hc3Rlcl90aC0+dGgudGhfdGVhbV9ucHJvYzsKKyAgICAgIGludCBuZXdfbnVtID0gbWFzdGVyX3RoLT50aC50aF90ZWFtc19zaXplLm50aDsKKyAgICAgIGttcF9pbmZvX3QgKipvdGhlcl90aHJlYWRzID0gdGVhbS0+dC50X3RocmVhZHM7CisgICAgICB0ZWFtLT50LnRfbnByb2MgPSBuZXdfbnVtOworICAgICAgZm9yIChpID0gMDsgaSA8IG9sZF9udW07ICsraSkgeworICAgICAgICBvdGhlcl90aHJlYWRzW2ldLT50aC50aF90ZWFtX25wcm9jID0gbmV3X251bTsKKyAgICAgIH0KKyAgICAgIC8vIEFkanVzdCBzdGF0ZXMgb2Ygbm9uLXVzZWQgdGhyZWFkcyBvZiB0aGUgdGVhbQorICAgICAgZm9yIChpID0gb2xkX251bTsgaSA8IG5ld19udW07ICsraSkgeworICAgICAgICAvLyBSZS1pbml0aWFsaXplIHRocmVhZCdzIGJhcnJpZXIgZGF0YS4KKyAgICAgICAgaW50IGI7CisgICAgICAgIGttcF9iYWxpZ25fdCAqYmFsaWduID0gb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyOworICAgICAgICBmb3IgKGIgPSAwOyBiIDwgYnNfbGFzdF9iYXJyaWVyOyArK2IpIHsKKyAgICAgICAgICBiYWxpZ25bYl0uYmIuYl9hcnJpdmVkID0gdGVhbS0+dC50X2JhcltiXS5iX2Fycml2ZWQ7CisgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChiYWxpZ25bYl0uYmIud2FpdF9mbGFnICE9IEtNUF9CQVJSSUVSX1BBUkVOVF9GTEFHKTsKKyNpZiBVU0VfREVCVUdHRVIKKyAgICAgICAgICBiYWxpZ25bYl0uYmIuYl93b3JrZXJfYXJyaXZlZCA9IHRlYW0tPnQudF9iYXJbYl0uYl90ZWFtX2Fycml2ZWQ7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBpZiAoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyAgICAgICAgICAvLyBTeW5jaHJvbml6ZSB0aHJlYWQncyB0YXNrIHN0YXRlCisgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfdGFza19zdGF0ZSA9IG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgIF9fa21wX2pvaW5fb21wdChtYXN0ZXJfdGgsIHBhcmVudF90ZWFtLCBwYXJhbGxlbF9pZCwgZm9ya19jb250ZXh0KTsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybjsKKyAgfQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyAgLyogZG8gY2xlYW51cCBhbmQgcmVzdG9yZSB0aGUgcGFyZW50IHRlYW0gKi8KKyAgbWFzdGVyX3RoLT50aC50aF9pbmZvLmRzLmRzX3RpZCA9IHRlYW0tPnQudF9tYXN0ZXJfdGlkOworICBtYXN0ZXJfdGgtPnRoLnRoX2xvY2FsLnRoaXNfY29uc3RydWN0ID0gdGVhbS0+dC50X21hc3Rlcl90aGlzX2NvbnM7CisKKyAgbWFzdGVyX3RoLT50aC50aF9kaXNwYXRjaCA9ICZwYXJlbnRfdGVhbS0+dC50X2Rpc3BhdGNoW3RlYW0tPnQudF9tYXN0ZXJfdGlkXTsKKworICAvKiBqYzogVGhlIGZvbGxvd2luZyBsb2NrIGhhcyBpbnN0cnVjdGlvbnMgd2l0aCBSRUwgYW5kIEFDUSBzZW1hbnRpY3MsCisgICAgIHNlcGFyYXRpbmcgdGhlIHBhcmFsbGVsIHVzZXIgY29kZSBjYWxsZWQgaW4gdGhpcyBwYXJhbGxlbCByZWdpb24KKyAgICAgZnJvbSB0aGUgc2VyaWFsIHVzZXIgY29kZSBjYWxsZWQgYWZ0ZXIgdGhpcyBmdW5jdGlvbiByZXR1cm5zLiAqLworICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF9mb3Jram9pbl9sb2NrKTsKKworI2lmIE9NUF80MF9FTkFCTEVECisgIGlmICghbWFzdGVyX3RoLT50aC50aF90ZWFtc19taWNyb3Rhc2sgfHwKKyAgICAgIHRlYW0tPnQudF9sZXZlbCA+IG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbGV2ZWwpCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgeworICAgIC8qIERlY3JlbWVudCBvdXIgbmVzdGVkIGRlcHRoIGxldmVsICovCisgICAgS01QX1RFU1RfVEhFTl9ERUMzMigoa21wX2ludDMyICopJnJvb3QtPnIucl9pbl9wYXJhbGxlbCk7CisgIH0KKyAgS01QX0RFQlVHX0FTU0VSVChyb290LT5yLnJfaW5fcGFyYWxsZWwgPj0gMCk7CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgb21wdF90YXNrX2luZm9fdCAqdGFza19pbmZvID0gX19vbXB0X2dldF90YXNraW5mbygwKTsKKyAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kKSkgeworICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kKSgKKyAgICAgICAgICBwYXJhbGxlbF9pZCwgdGFza19pbmZvLT50YXNrX2lkKTsKKyAgICB9CisgICAgdGFza19pbmZvLT5mcmFtZS5leGl0X3J1bnRpbWVfZnJhbWUgPSBOVUxMOworICAgIHRhc2tfaW5mby0+dGFza19pZCA9IDA7CisgIH0KKyNlbmRpZgorCisgIEtGX1RSQUNFKDEwLCAoIl9fa21wX2pvaW5fY2FsbDE6IFQjJWQsIHRoaXNfdGhyZWFkPSVwIHRlYW09JXBcbiIsIDAsCisgICAgICAgICAgICAgICAgbWFzdGVyX3RoLCB0ZWFtKSk7CisgIF9fa21wX3BvcF9jdXJyZW50X3Rhc2tfZnJvbV90aHJlYWQobWFzdGVyX3RoKTsKKworI2lmIE9NUF80MF9FTkFCTEVEICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgLy8gUmVzdG9yZSBtYXN0ZXIgdGhyZWFkJ3MgcGFydGl0aW9uLgorICBtYXN0ZXJfdGgtPnRoLnRoX2ZpcnN0X3BsYWNlID0gdGVhbS0+dC50X2ZpcnN0X3BsYWNlOworICBtYXN0ZXJfdGgtPnRoLnRoX2xhc3RfcGxhY2UgPSB0ZWFtLT50LnRfbGFzdF9wbGFjZTsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgIHVwZGF0ZUhXRlBDb250cm9sKHRlYW0pOworCisgIGlmIChyb290LT5yLnJfYWN0aXZlICE9IG1hc3Rlcl9hY3RpdmUpCisgICAgcm9vdC0+ci5yX2FjdGl2ZSA9IG1hc3Rlcl9hY3RpdmU7CisKKyAgX19rbXBfZnJlZV90ZWFtKHJvb3QsIHRlYW0gVVNFX05FU1RFRF9IT1RfQVJHKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc3Rlcl90aCkpOyAvLyB0aGlzIHdpbGwgZnJlZSB3b3JrZXIgdGhyZWFkcworCisgIC8qIHRoaXMgcmFjZSB3YXMgZnVuIHRvIGZpbmQuIG1ha2Ugc3VyZSB0aGUgZm9sbG93aW5nIGlzIGluIHRoZSBjcml0aWNhbAorICAgICByZWdpb24gb3RoZXJ3aXNlIGFzc2VydGlvbnMgbWF5IGZhaWwgb2NjYXNpb25hbGx5IHNpbmNlIHRoZSBvbGQgdGVhbSBtYXkgYmUKKyAgICAgcmVhbGxvY2F0ZWQgYW5kIHRoZSBoaWVyYXJjaHkgYXBwZWFycyBpbmNvbnNpc3RlbnQuIGl0IGlzIGFjdHVhbGx5IHNhZmUgdG8KKyAgICAgcnVuIGFuZCB3b24ndCBjYXVzZSBhbnkgYnVncywgYnV0IHdpbGwgY2F1c2UgdGhvc2UgYXNzZXJ0aW9uIGZhaWx1cmVzLiBpdCdzCisgICAgIG9ubHkgb25lIGRlcmVmJmFzc2lnbiBzbyBtaWdodCBhcyB3ZWxsIHB1dCB0aGlzIGluIHRoZSBjcml0aWNhbCByZWdpb24gKi8KKyAgbWFzdGVyX3RoLT50aC50aF90ZWFtID0gcGFyZW50X3RlYW07CisgIG1hc3Rlcl90aC0+dGgudGhfdGVhbV9ucHJvYyA9IHBhcmVudF90ZWFtLT50LnRfbnByb2M7CisgIG1hc3Rlcl90aC0+dGgudGhfdGVhbV9tYXN0ZXIgPSBwYXJlbnRfdGVhbS0+dC50X3RocmVhZHNbMF07CisgIG1hc3Rlcl90aC0+dGgudGhfdGVhbV9zZXJpYWxpemVkID0gcGFyZW50X3RlYW0tPnQudF9zZXJpYWxpemVkOworCisgIC8qIHJlc3RvcmUgc2VyaWFsaXplZCB0ZWFtLCBpZiBuZWVkIGJlICovCisgIGlmIChwYXJlbnRfdGVhbS0+dC50X3NlcmlhbGl6ZWQgJiYKKyAgICAgIHBhcmVudF90ZWFtICE9IG1hc3Rlcl90aC0+dGgudGhfc2VyaWFsX3RlYW0gJiYKKyAgICAgIHBhcmVudF90ZWFtICE9IHJvb3QtPnIucl9yb290X3RlYW0pIHsKKyAgICBfX2ttcF9mcmVlX3RlYW0ocm9vdCwKKyAgICAgICAgICAgICAgICAgICAgbWFzdGVyX3RoLT50aC50aF9zZXJpYWxfdGVhbSBVU0VfTkVTVEVEX0hPVF9BUkcoTlVMTCkpOworICAgIG1hc3Rlcl90aC0+dGgudGhfc2VyaWFsX3RlYW0gPSBwYXJlbnRfdGVhbTsKKyAgfQorCisgIGlmIChfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYykgeworICAgIGlmIChtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfdG9wID4KKyAgICAgICAgMCkgeyAvLyBSZXN0b3JlIHRhc2sgc3RhdGUgZnJvbSBtZW1vIHN0YWNrCisgICAgICBLTVBfREVCVUdfQVNTRVJUKG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV9tZW1vX3N0YWNrKTsKKyAgICAgIC8vIFJlbWVtYmVyIG1hc3RlcidzIHN0YXRlIGlmIHdlIHJlLXVzZSB0aGlzIG5lc3RlZCBob3QgdGVhbQorICAgICAgbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX21lbW9fc3RhY2tbbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX3RvcF0gPQorICAgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZTsKKyAgICAgIC0tbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX3RvcDsgLy8gcG9wCisgICAgICAvLyBOb3cgcmVzdG9yZSBzdGF0ZSBhdCB0aGlzIGxldmVsCisgICAgICBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGUgPQorICAgICAgICAgIG1hc3Rlcl90aC0+dGgKKyAgICAgICAgICAgICAgLnRoX3Rhc2tfc3RhdGVfbWVtb19zdGFja1ttYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfdG9wXTsKKyAgICB9CisgICAgLy8gQ29weSB0aGUgdGFzayB0ZWFtIGZyb20gdGhlIHBhcmVudCB0ZWFtIHRvIHRoZSBtYXN0ZXIgdGhyZWFkCisgICAgbWFzdGVyX3RoLT50aC50aF90YXNrX3RlYW0gPQorICAgICAgICBwYXJlbnRfdGVhbS0+dC50X3Rhc2tfdGVhbVttYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVdOworICAgIEtBX1RSQUNFKDIwLAorICAgICAgICAgICAgICgiX19rbXBfam9pbl9jYWxsOiBNYXN0ZXIgVCMlZCByZXN0b3JpbmcgdGFza190ZWFtICVwIC8gdGVhbSAlcFxuIiwKKyAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZChtYXN0ZXJfdGgpLCBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfdGVhbSwKKyAgICAgICAgICAgICAgcGFyZW50X3RlYW0pKTsKKyAgfQorCisgIC8vIFRPRE86IEdFSCAtIGNhbm5vdCBkbyB0aGlzIGFzc2VydGlvbiBiZWNhdXNlIHJvb3QgdGhyZWFkIG5vdCBzZXQgdXAgYXMKKyAgLy8gZXhlY3V0aW5nCisgIC8vIEtNUF9BU1NFUlQoIG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9mbGFncy5leGVjdXRpbmcgPT0gMCApOworICBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfZmxhZ3MuZXhlY3V0aW5nID0gMTsKKworICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF9mb3Jram9pbl9sb2NrKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgX19rbXBfam9pbl9vbXB0KG1hc3Rlcl90aCwgcGFyZW50X3RlYW0sIHBhcmFsbGVsX2lkLCBmb3JrX2NvbnRleHQpOworICB9CisjZW5kaWYKKworICBLTVBfTUIoKTsKKyAgS0FfVFJBQ0UoMjAsICgiX19rbXBfam9pbl9jYWxsOiBleGl0IFQjJWRcbiIsIGd0aWQpKTsKK30KKworLyogQ2hlY2sgd2hldGhlciB3ZSBzaG91bGQgcHVzaCBhbiBpbnRlcm5hbCBjb250cm9sIHJlY29yZCBvbnRvIHRoZQorICAgc2VyaWFsIHRlYW0gc3RhY2suICBJZiBzbywgZG8gaXQuICAqLwordm9pZCBfX2ttcF9zYXZlX2ludGVybmFsX2NvbnRyb2xzKGttcF9pbmZvX3QgKnRocmVhZCkgeworCisgIGlmICh0aHJlYWQtPnRoLnRoX3RlYW0gIT0gdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbSkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAodGhyZWFkLT50aC50aF90ZWFtLT50LnRfc2VyaWFsaXplZCA+IDEpIHsKKyAgICBpbnQgcHVzaCA9IDA7CisKKyAgICBpZiAodGhyZWFkLT50aC50aF90ZWFtLT50LnRfY29udHJvbF9zdGFja190b3AgPT0gTlVMTCkgeworICAgICAgcHVzaCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICh0aHJlYWQtPnRoLnRoX3RlYW0tPnQudF9jb250cm9sX3N0YWNrX3RvcC0+c2VyaWFsX25lc3RpbmdfbGV2ZWwgIT0KKyAgICAgICAgICB0aHJlYWQtPnRoLnRoX3RlYW0tPnQudF9zZXJpYWxpemVkKSB7CisgICAgICAgIHB1c2ggPSAxOworICAgICAgfQorICAgIH0KKyAgICBpZiAocHVzaCkgeyAvKiBwdXNoIGEgcmVjb3JkIG9uIHRoZSBzZXJpYWwgdGVhbSdzIHN0YWNrICovCisgICAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90ICpjb250cm9sID0KKyAgICAgICAgICAoa21wX2ludGVybmFsX2NvbnRyb2xfdCAqKV9fa21wX2FsbG9jYXRlKAorICAgICAgICAgICAgICBzaXplb2Yoa21wX2ludGVybmFsX2NvbnRyb2xfdCkpOworCisgICAgICBjb3B5X2ljdnMoY29udHJvbCwgJnRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzKTsKKworICAgICAgY29udHJvbC0+c2VyaWFsX25lc3RpbmdfbGV2ZWwgPSB0aHJlYWQtPnRoLnRoX3RlYW0tPnQudF9zZXJpYWxpemVkOworCisgICAgICBjb250cm9sLT5uZXh0ID0gdGhyZWFkLT50aC50aF90ZWFtLT50LnRfY29udHJvbF9zdGFja190b3A7CisgICAgICB0aHJlYWQtPnRoLnRoX3RlYW0tPnQudF9jb250cm9sX3N0YWNrX3RvcCA9IGNvbnRyb2w7CisgICAgfQorICB9Cit9CisKKy8qIENoYW5nZXMgc2V0X25wcm9jICovCit2b2lkIF9fa21wX3NldF9udW1fdGhyZWFkcyhpbnQgbmV3X250aCwgaW50IGd0aWQpIHsKKyAga21wX2luZm9fdCAqdGhyZWFkOworICBrbXBfcm9vdF90ICpyb290OworCisgIEtGX1RSQUNFKDEwLCAoIl9fa21wX3NldF9udW1fdGhyZWFkczogbmV3IF9fa21wX250aCA9ICVkXG4iLCBuZXdfbnRoKSk7CisgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfaW5pdF9zZXJpYWwpOworCisgIGlmIChuZXdfbnRoIDwgMSkKKyAgICBuZXdfbnRoID0gMTsKKyAgZWxzZSBpZiAobmV3X250aCA+IF9fa21wX21heF9udGgpCisgICAgbmV3X250aCA9IF9fa21wX21heF9udGg7CisKKyAgS01QX0NPVU5UX1ZBTFVFKE9NUF9zZXRfbnVtdGhyZWFkcywgbmV3X250aCk7CisgIHRocmVhZCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisKKyAgX19rbXBfc2F2ZV9pbnRlcm5hbF9jb250cm9scyh0aHJlYWQpOworCisgIHNldF9fbnByb2ModGhyZWFkLCBuZXdfbnRoKTsKKworICAvLyBJZiB0aGlzIG9tcF9zZXRfbnVtX3RocmVhZHMoKSBjYWxsIHdpbGwgY2F1c2UgdGhlIGhvdCB0ZWFtIHNpemUgdG8gYmUKKyAgLy8gcmVkdWNlZCAoaW4gdGhlIGFic2VuY2Ugb2YgYSBudW1fdGhyZWFkcyBjbGF1c2UpLCB0aGVuIHJlZHVjZSBpdCBub3csCisgIC8vIHJhdGhlciB0aGFuIHdhaXRpbmcgZm9yIHRoZSBuZXh0IHBhcmFsbGVsIHJlZ2lvbi4KKyAgcm9vdCA9IHRocmVhZC0+dGgudGhfcm9vdDsKKyAgaWYgKF9fa21wX2luaXRfcGFyYWxsZWwgJiYgKCFyb290LT5yLnJfYWN0aXZlKSAmJgorICAgICAgKHJvb3QtPnIucl9ob3RfdGVhbS0+dC50X25wcm9jID4gbmV3X250aCkKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgICAgJiYgX19rbXBfaG90X3RlYW1zX21heF9sZXZlbCAmJiAhX19rbXBfaG90X3RlYW1zX21vZGUKKyNlbmRpZgorICAgICAgKSB7CisgICAga21wX3RlYW1fdCAqaG90X3RlYW0gPSByb290LT5yLnJfaG90X3RlYW07CisgICAgaW50IGY7CisKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF9mb3Jram9pbl9sb2NrKTsKKworICAgIC8vIFJlbGVhc2UgdGhlIGV4dHJhIHRocmVhZHMgd2UgZG9uJ3QgbmVlZCBhbnkgbW9yZS4KKyAgICBmb3IgKGYgPSBuZXdfbnRoOyBmIDwgaG90X3RlYW0tPnQudF9ucHJvYzsgZisrKSB7CisgICAgICBLTVBfREVCVUdfQVNTRVJUKGhvdF90ZWFtLT50LnRfdGhyZWFkc1tmXSAhPSBOVUxMKTsKKyAgICAgIGlmIChfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYykgeworICAgICAgICAvLyBXaGVuIGRlY3JlYXNpbmcgdGVhbSBzaXplLCB0aHJlYWRzIG5vIGxvbmdlciBpbiB0aGUgdGVhbSBzaG91bGQgdW5yZWYKKyAgICAgICAgLy8gdGFzayB0ZWFtLgorICAgICAgICBob3RfdGVhbS0+dC50X3RocmVhZHNbZl0tPnRoLnRoX3Rhc2tfdGVhbSA9IE5VTEw7CisgICAgICB9CisgICAgICBfX2ttcF9mcmVlX3RocmVhZChob3RfdGVhbS0+dC50X3RocmVhZHNbZl0pOworICAgICAgaG90X3RlYW0tPnQudF90aHJlYWRzW2ZdID0gTlVMTDsKKyAgICB9CisgICAgaG90X3RlYW0tPnQudF9ucHJvYyA9IG5ld19udGg7CisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICBpZiAodGhyZWFkLT50aC50aF9ob3RfdGVhbXMpIHsKKyAgICAgIEtNUF9ERUJVR19BU1NFUlQoaG90X3RlYW0gPT0gdGhyZWFkLT50aC50aF9ob3RfdGVhbXNbMF0uaG90X3RlYW0pOworICAgICAgdGhyZWFkLT50aC50aF9ob3RfdGVhbXNbMF0uaG90X3RlYW1fbnRoID0gbmV3X250aDsKKyAgICB9CisjZW5kaWYKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJl9fa21wX2Zvcmtqb2luX2xvY2spOworCisgICAgLy8gVXBkYXRlIHRoZSB0X25wcm9jIGZpZWxkIGluIHRoZSB0aHJlYWRzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZS4KKyAgICBmb3IgKGYgPSAwOyBmIDwgbmV3X250aDsgZisrKSB7CisgICAgICBLTVBfREVCVUdfQVNTRVJUKGhvdF90ZWFtLT50LnRfdGhyZWFkc1tmXSAhPSBOVUxMKTsKKyAgICAgIGhvdF90ZWFtLT50LnRfdGhyZWFkc1tmXS0+dGgudGhfdGVhbV9ucHJvYyA9IG5ld19udGg7CisgICAgfQorICAgIC8vIFNwZWNpYWwgZmxhZyBpbiBjYXNlIG9tcF9zZXRfbnVtX3RocmVhZHMoKSBjYWxsCisgICAgaG90X3RlYW0tPnQudF9zaXplX2NoYW5nZWQgPSAtMTsKKyAgfQorfQorCisvKiBDaGFuZ2VzIG1heF9hY3RpdmVfbGV2ZWxzICovCit2b2lkIF9fa21wX3NldF9tYXhfYWN0aXZlX2xldmVscyhpbnQgZ3RpZCwgaW50IG1heF9hY3RpdmVfbGV2ZWxzKSB7CisgIGttcF9pbmZvX3QgKnRocmVhZDsKKworICBLRl9UUkFDRSgxMCwgKCJfX2ttcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHM6IG5ldyBtYXhfYWN0aXZlX2xldmVscyBmb3IgdGhyZWFkICIKKyAgICAgICAgICAgICAgICAiJWQgPSAoJWQpXG4iLAorICAgICAgICAgICAgICAgIGd0aWQsIG1heF9hY3RpdmVfbGV2ZWxzKSk7CisgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfaW5pdF9zZXJpYWwpOworCisgIC8vIHZhbGlkYXRlIG1heF9hY3RpdmVfbGV2ZWxzCisgIGlmIChtYXhfYWN0aXZlX2xldmVscyA8IDApIHsKKyAgICBLTVBfV0FSTklORyhBY3RpdmVMZXZlbHNOZWdhdGl2ZSwgbWF4X2FjdGl2ZV9sZXZlbHMpOworICAgIC8vIFdlIGlnbm9yZSB0aGlzIGNhbGwgaWYgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCBhIG5lZ2F0aXZlIHZhbHVlLgorICAgIC8vIFRoZSBjdXJyZW50IHNldHRpbmcgd29uJ3QgYmUgY2hhbmdlZC4gVGhlIGxhc3QgdmFsaWQgc2V0dGluZyB3aWxsIGJlCisgICAgLy8gdXNlZC4gQSB3YXJuaW5nIHdpbGwgYmUgaXNzdWVkIChpZiB3YXJuaW5ncyBhcmUgYWxsb3dlZCBhcyBjb250cm9sbGVkIGJ5CisgICAgLy8gdGhlIEtNUF9XQVJOSU5HUyBlbnYgdmFyKS4KKyAgICBLRl9UUkFDRSgxMCwgKCJfX2ttcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHM6IHRoZSBjYWxsIGlzIGlnbm9yZWQ6IG5ldyAiCisgICAgICAgICAgICAgICAgICAibWF4X2FjdGl2ZV9sZXZlbHMgZm9yIHRocmVhZCAlZCA9ICglZClcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBtYXhfYWN0aXZlX2xldmVscykpOworICAgIHJldHVybjsKKyAgfQorICBpZiAobWF4X2FjdGl2ZV9sZXZlbHMgPD0gS01QX01BWF9BQ1RJVkVfTEVWRUxTX0xJTUlUKSB7CisgICAgLy8gaXQncyBPSywgdGhlIG1heF9hY3RpdmVfbGV2ZWxzIGlzIHdpdGhpbiB0aGUgdmFsaWQgcmFuZ2U6IFsgMDsKKyAgICAvLyBLTVBfTUFYX0FDVElWRV9MRVZFTFNfTElNSVQgXQorICAgIC8vIFdlIGFsbG93IGEgemVybyB2YWx1ZS4gKGltcGxlbWVudGF0aW9uIGRlZmluZWQgYmVoYXZpb3IpCisgIH0gZWxzZSB7CisgICAgS01QX1dBUk5JTkcoQWN0aXZlTGV2ZWxzRXhjZWVkTGltaXQsIG1heF9hY3RpdmVfbGV2ZWxzLAorICAgICAgICAgICAgICAgIEtNUF9NQVhfQUNUSVZFX0xFVkVMU19MSU1JVCk7CisgICAgbWF4X2FjdGl2ZV9sZXZlbHMgPSBLTVBfTUFYX0FDVElWRV9MRVZFTFNfTElNSVQ7CisgICAgLy8gQ3VycmVudCB1cHBlciBsaW1pdCBpcyBNQVhfSU5ULiAoaW1wbGVtZW50YXRpb24gZGVmaW5lZCBiZWhhdmlvcikKKyAgICAvLyBJZiB0aGUgaW5wdXQgZXhjZWVkcyB0aGUgdXBwZXIgbGltaXQsIHdlIGNvcnJlY3QgdGhlIGlucHV0IHRvIGJlIHRoZQorICAgIC8vIHVwcGVyIGxpbWl0LiAoaW1wbGVtZW50YXRpb24gZGVmaW5lZCBiZWhhdmlvcikKKyAgICAvLyBBY3R1YWxseSwgdGhlIGZsb3cgc2hvdWxkIG5ldmVyIGdldCBoZXJlIHVudGlsIHdlIHVzZSBNQVhfSU5UIGxpbWl0LgorICB9CisgIEtGX1RSQUNFKDEwLCAoIl9fa21wX3NldF9tYXhfYWN0aXZlX2xldmVsczogYWZ0ZXIgdmFsaWRhdGlvbjogbmV3ICIKKyAgICAgICAgICAgICAgICAibWF4X2FjdGl2ZV9sZXZlbHMgZm9yIHRocmVhZCAlZCA9ICglZClcbiIsCisgICAgICAgICAgICAgICAgZ3RpZCwgbWF4X2FjdGl2ZV9sZXZlbHMpKTsKKworICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworCisgIF9fa21wX3NhdmVfaW50ZXJuYWxfY29udHJvbHModGhyZWFkKTsKKworICBzZXRfX21heF9hY3RpdmVfbGV2ZWxzKHRocmVhZCwgbWF4X2FjdGl2ZV9sZXZlbHMpOworfQorCisvKiBHZXRzIG1heF9hY3RpdmVfbGV2ZWxzICovCitpbnQgX19rbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzKGludCBndGlkKSB7CisgIGttcF9pbmZvX3QgKnRocmVhZDsKKworICBLRl9UUkFDRSgxMCwgKCJfX2ttcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHM6IHRocmVhZCAlZFxuIiwgZ3RpZCkpOworICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2luaXRfc2VyaWFsKTsKKworICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICBLTVBfREVCVUdfQVNTRVJUKHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrKTsKKyAgS0ZfVFJBQ0UoMTAsICgiX19rbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzOiB0aHJlYWQgJWQsIGN1cnRhc2s9JXAsICIKKyAgICAgICAgICAgICAgICAiY3VydGFza19tYXhhY2xldmVsPSVkXG4iLAorICAgICAgICAgICAgICAgIGd0aWQsIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLAorICAgICAgICAgICAgICAgIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm1heF9hY3RpdmVfbGV2ZWxzKSk7CisgIHJldHVybiB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5tYXhfYWN0aXZlX2xldmVsczsKK30KKworLyogQ2hhbmdlcyBkZWZfc2NoZWRfdmFyIElDViB2YWx1ZXMgKHJ1bi10aW1lIHNjaGVkdWxlIGtpbmQgYW5kIGNodW5rKSAqLwordm9pZCBfX2ttcF9zZXRfc2NoZWR1bGUoaW50IGd0aWQsIGttcF9zY2hlZF90IGtpbmQsIGludCBjaHVuaykgeworICBrbXBfaW5mb190ICp0aHJlYWQ7CisgIC8vICAgIGttcF90ZWFtX3QgKnRlYW07CisKKyAgS0ZfVFJBQ0UoMTAsICgiX19rbXBfc2V0X3NjaGVkdWxlOiBuZXcgc2NoZWR1bGUgZm9yIHRocmVhZCAlZCA9ICglZCwgJWQpXG4iLAorICAgICAgICAgICAgICAgIGd0aWQsIChpbnQpa2luZCwgY2h1bmspKTsKKyAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9pbml0X3NlcmlhbCk7CisKKyAgLy8gQ2hlY2sgaWYgdGhlIGtpbmQgcGFyYW1ldGVyIGlzIHZhbGlkLCBjb3JyZWN0IGlmIG5lZWRlZC4KKyAgLy8gVmFsaWQgcGFyYW1ldGVycyBzaG91bGQgZml0IGluIG9uZSBvZiB0d28gaW50ZXJ2YWxzIC0gc3RhbmRhcmQgb3IgZXh0ZW5kZWQ6CisgIC8vICAgICAgIDxsb3dlcj4sIDx2YWxpZD4sIDx1cHBlcl9zdGQ+LCA8bG93ZXJfZXh0PiwgPHZhbGlkPiwgPHVwcGVyPgorICAvLyAyMDA4LTAxLTI1OiAwLCAgMSAtIDQsICAgICAgIDUsICAgICAgICAgMTAwLCAgICAgMTAxIC0gMTAyLCAxMDMKKyAgaWYgKGtpbmQgPD0ga21wX3NjaGVkX2xvd2VyIHx8IGtpbmQgPj0ga21wX3NjaGVkX3VwcGVyIHx8CisgICAgICAoa2luZCA8PSBrbXBfc2NoZWRfbG93ZXJfZXh0ICYmIGtpbmQgPj0ga21wX3NjaGVkX3VwcGVyX3N0ZCkpIHsKKyAgICAvLyBUT0RPOiBIaW50IG5lZWRzIGF0dGVudGlvbiBpbiBjYXNlIHdlIGNoYW5nZSB0aGUgZGVmYXVsdCBzY2hlZHVsZS4KKyAgICBfX2ttcF9tc2coa21wX21zX3dhcm5pbmcsIEtNUF9NU0coU2NoZWR1bGVLaW5kT3V0T2ZSYW5nZSwga2luZCksCisgICAgICAgICAgICAgIEtNUF9ITlQoRGVmYXVsdFNjaGVkdWxlS2luZFVzZWQsICJzdGF0aWMsIG5vIGNodW5rIiksCisgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsKTsKKyAgICBraW5kID0ga21wX3NjaGVkX2RlZmF1bHQ7CisgICAgY2h1bmsgPSAwOyAvLyBpZ25vcmUgY2h1bmsgdmFsdWUgaW4gY2FzZSBvZiBiYWQga2luZAorICB9CisKKyAgdGhyZWFkID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKworICBfX2ttcF9zYXZlX2ludGVybmFsX2NvbnRyb2xzKHRocmVhZCk7CisKKyAgaWYgKGtpbmQgPCBrbXBfc2NoZWRfdXBwZXJfc3RkKSB7CisgICAgaWYgKGtpbmQgPT0ga21wX3NjaGVkX3N0YXRpYyAmJiBjaHVuayA8IEtNUF9ERUZBVUxUX0NIVU5LKSB7CisgICAgICAvLyBkaWZmZXIgc3RhdGljIGNodW5rZWQgdnMuIHVuY2h1bmtlZDogIGNodW5rIHNob3VsZCBiZSBpbnZhbGlkIHRvCisgICAgICAvLyBpbmRpY2F0ZSB1bmNodW5rZWQgc2NoZWR1bGUgKHdoaWNoIGlzIHRoZSBkZWZhdWx0KQorICAgICAgdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuc2NoZWQucl9zY2hlZF90eXBlID0ga21wX3NjaF9zdGF0aWM7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnNjaGVkLnJfc2NoZWRfdHlwZSA9CisgICAgICAgICAgX19rbXBfc2NoX21hcFtraW5kIC0ga21wX3NjaGVkX2xvd2VyIC0gMV07CisgICAgfQorICB9IGVsc2UgeworICAgIC8vICAgIF9fa21wX3NjaF9tYXBbIGtpbmQgLSBrbXBfc2NoZWRfbG93ZXJfZXh0ICsga21wX3NjaGVkX3VwcGVyX3N0ZCAtCisgICAgLy8gICAga21wX3NjaGVkX2xvd2VyIC0gMiBdOworICAgIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnNjaGVkLnJfc2NoZWRfdHlwZSA9CisgICAgICAgIF9fa21wX3NjaF9tYXBba2luZCAtIGttcF9zY2hlZF9sb3dlcl9leHQgKyBrbXBfc2NoZWRfdXBwZXJfc3RkIC0KKyAgICAgICAgICAgICAgICAgICAgICBrbXBfc2NoZWRfbG93ZXIgLSAyXTsKKyAgfQorICBpZiAoa2luZCA9PSBrbXBfc2NoZWRfYXV0byB8fCBjaHVuayA8IDEpIHsKKyAgICAvLyBpZ25vcmUgcGFyYW1ldGVyIGNodW5rIGZvciBzY2hlZHVsZSBhdXRvCisgICAgdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuc2NoZWQuY2h1bmsgPSBLTVBfREVGQVVMVF9DSFVOSzsKKyAgfSBlbHNlIHsKKyAgICB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5zY2hlZC5jaHVuayA9IGNodW5rOworICB9Cit9CisKKy8qIEdldHMgZGVmX3NjaGVkX3ZhciBJQ1YgdmFsdWVzICovCit2b2lkIF9fa21wX2dldF9zY2hlZHVsZShpbnQgZ3RpZCwga21wX3NjaGVkX3QgKmtpbmQsIGludCAqY2h1bmspIHsKKyAga21wX2luZm9fdCAqdGhyZWFkOworICBlbnVtIHNjaGVkX3R5cGUgdGhfdHlwZTsKKworICBLRl9UUkFDRSgxMCwgKCJfX2ttcF9nZXRfc2NoZWR1bGU6IHRocmVhZCAlZFxuIiwgZ3RpZCkpOworICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2luaXRfc2VyaWFsKTsKKworICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworCisgIHRoX3R5cGUgPSB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5zY2hlZC5yX3NjaGVkX3R5cGU7CisKKyAgc3dpdGNoICh0aF90eXBlKSB7CisgIGNhc2Uga21wX3NjaF9zdGF0aWM6CisgIGNhc2Uga21wX3NjaF9zdGF0aWNfZ3JlZWR5OgorICBjYXNlIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkOgorICAgICpraW5kID0ga21wX3NjaGVkX3N0YXRpYzsKKyAgICAqY2h1bmsgPSAwOyAvLyBjaHVuayB3YXMgbm90IHNldCwgdHJ5IHRvIHNob3cgdGhpcyBmYWN0IHZpYSB6ZXJvIHZhbHVlCisgICAgcmV0dXJuOworICBjYXNlIGttcF9zY2hfc3RhdGljX2NodW5rZWQ6CisgICAgKmtpbmQgPSBrbXBfc2NoZWRfc3RhdGljOworICAgIGJyZWFrOworICBjYXNlIGttcF9zY2hfZHluYW1pY19jaHVua2VkOgorICAgICpraW5kID0ga21wX3NjaGVkX2R5bmFtaWM7CisgICAgYnJlYWs7CisgIGNhc2Uga21wX3NjaF9ndWlkZWRfY2h1bmtlZDoKKyAgY2FzZSBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZDoKKyAgY2FzZSBrbXBfc2NoX2d1aWRlZF9hbmFseXRpY2FsX2NodW5rZWQ6CisgICAgKmtpbmQgPSBrbXBfc2NoZWRfZ3VpZGVkOworICAgIGJyZWFrOworICBjYXNlIGttcF9zY2hfYXV0bzoKKyAgICAqa2luZCA9IGttcF9zY2hlZF9hdXRvOworICAgIGJyZWFrOworICBjYXNlIGttcF9zY2hfdHJhcGV6b2lkYWw6CisgICAgKmtpbmQgPSBrbXBfc2NoZWRfdHJhcGV6b2lkYWw7CisgICAgYnJlYWs7CisjaWYgS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVECisgIGNhc2Uga21wX3NjaF9zdGF0aWNfc3RlYWw6CisgICAgKmtpbmQgPSBrbXBfc2NoZWRfc3RhdGljX3N0ZWFsOworICAgIGJyZWFrOworI2VuZGlmCisgIGRlZmF1bHQ6CisgICAgS01QX0ZBVEFMKFVua25vd25TY2hlZHVsaW5nVHlwZSwgdGhfdHlwZSk7CisgIH0KKworICAqY2h1bmsgPSB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5zY2hlZC5jaHVuazsKK30KKworaW50IF9fa21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKGludCBndGlkLCBpbnQgbGV2ZWwpIHsKKworICBpbnQgaWksIGRkOworICBrbXBfdGVhbV90ICp0ZWFtOworICBrbXBfaW5mb190ICp0aHI7CisKKyAgS0ZfVFJBQ0UoMTAsICgiX19rbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW06IHRocmVhZCAlZCAlZFxuIiwgZ3RpZCwgbGV2ZWwpKTsKKyAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9pbml0X3NlcmlhbCk7CisKKyAgLy8gdmFsaWRhdGUgbGV2ZWwKKyAgaWYgKGxldmVsID09IDApCisgICAgcmV0dXJuIDA7CisgIGlmIChsZXZlbCA8IDApCisgICAgcmV0dXJuIC0xOworICB0aHIgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICB0ZWFtID0gdGhyLT50aC50aF90ZWFtOworICBpaSA9IHRlYW0tPnQudF9sZXZlbDsKKyAgaWYgKGxldmVsID4gaWkpCisgICAgcmV0dXJuIC0xOworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgaWYgKHRoci0+dGgudGhfdGVhbXNfbWljcm90YXNrKSB7CisgICAgLy8gQUM6IHdlIGFyZSBpbiB0ZWFtcyByZWdpb24gd2hlcmUgbXVsdGlwbGUgbmVzdGVkIHRlYW1zIGhhdmUgc2FtZSBsZXZlbAorICAgIGludCB0bGV2ZWwgPSB0aHItPnRoLnRoX3RlYW1zX2xldmVsOyAvLyB0aGUgbGV2ZWwgb2YgdGhlIHRlYW1zIGNvbnN0cnVjdAorICAgIGlmIChsZXZlbCA8PQorICAgICAgICB0bGV2ZWwpIHsgLy8gb3RoZXJ3aXNlIHVzdWFsIGFsZ29yaXRobSB3b3JrcyAod2lsbCBub3QgdG91Y2ggdGhlIHRlYW1zKQorICAgICAgS01QX0RFQlVHX0FTU0VSVChpaSA+PSB0bGV2ZWwpOworICAgICAgLy8gQUM6IEFzIHdlIG5lZWQgdG8gcGFzcyBieSB0aGUgdGVhbXMgbGVhZ3VlLCB3ZSBuZWVkIHRvIGFydGlmaWNpYWxseQorICAgICAgLy8gaW5jcmVhc2UgaWkKKyAgICAgIGlmIChpaSA9PSB0bGV2ZWwpIHsKKyAgICAgICAgaWkgKz0gMjsgLy8gdGhyZWUgdGVhbXMgaGF2ZSBzYW1lIGxldmVsCisgICAgICB9IGVsc2UgeworICAgICAgICBpaSsrOyAvLyB0d28gdGVhbXMgaGF2ZSBzYW1lIGxldmVsCisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYKKworICBpZiAoaWkgPT0gbGV2ZWwpCisgICAgcmV0dXJuIF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCk7CisKKyAgZGQgPSB0ZWFtLT50LnRfc2VyaWFsaXplZDsKKyAgbGV2ZWwrKzsKKyAgd2hpbGUgKGlpID4gbGV2ZWwpIHsKKyAgICBmb3IgKGRkID0gdGVhbS0+dC50X3NlcmlhbGl6ZWQ7IChkZCA+IDApICYmIChpaSA+IGxldmVsKTsgZGQtLSwgaWktLSkgeworICAgIH0KKyAgICBpZiAoKHRlYW0tPnQudF9zZXJpYWxpemVkKSAmJiAoIWRkKSkgeworICAgICAgdGVhbSA9IHRlYW0tPnQudF9wYXJlbnQ7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKGlpID4gbGV2ZWwpIHsKKyAgICAgIHRlYW0gPSB0ZWFtLT50LnRfcGFyZW50OworICAgICAgZGQgPSB0ZWFtLT50LnRfc2VyaWFsaXplZDsKKyAgICAgIGlpLS07CisgICAgfQorICB9CisKKyAgcmV0dXJuIChkZCA+IDEpID8gKDApIDogKHRlYW0tPnQudF9tYXN0ZXJfdGlkKTsKK30KKworaW50IF9fa21wX2dldF90ZWFtX3NpemUoaW50IGd0aWQsIGludCBsZXZlbCkgeworCisgIGludCBpaSwgZGQ7CisgIGttcF90ZWFtX3QgKnRlYW07CisgIGttcF9pbmZvX3QgKnRocjsKKworICBLRl9UUkFDRSgxMCwgKCJfX2ttcF9nZXRfdGVhbV9zaXplOiB0aHJlYWQgJWQgJWRcbiIsIGd0aWQsIGxldmVsKSk7CisgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfaW5pdF9zZXJpYWwpOworCisgIC8vIHZhbGlkYXRlIGxldmVsCisgIGlmIChsZXZlbCA9PSAwKQorICAgIHJldHVybiAxOworICBpZiAobGV2ZWwgPCAwKQorICAgIHJldHVybiAtMTsKKyAgdGhyID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgdGVhbSA9IHRoci0+dGgudGhfdGVhbTsKKyAgaWkgPSB0ZWFtLT50LnRfbGV2ZWw7CisgIGlmIChsZXZlbCA+IGlpKQorICAgIHJldHVybiAtMTsKKworI2lmIE9NUF80MF9FTkFCTEVECisgIGlmICh0aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzaykgeworICAgIC8vIEFDOiB3ZSBhcmUgaW4gdGVhbXMgcmVnaW9uIHdoZXJlIG11bHRpcGxlIG5lc3RlZCB0ZWFtcyBoYXZlIHNhbWUgbGV2ZWwKKyAgICBpbnQgdGxldmVsID0gdGhyLT50aC50aF90ZWFtc19sZXZlbDsgLy8gdGhlIGxldmVsIG9mIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKKyAgICBpZiAobGV2ZWwgPD0KKyAgICAgICAgdGxldmVsKSB7IC8vIG90aGVyd2lzZSB1c3VhbCBhbGdvcml0aG0gd29ya3MgKHdpbGwgbm90IHRvdWNoIHRoZSB0ZWFtcykKKyAgICAgIEtNUF9ERUJVR19BU1NFUlQoaWkgPj0gdGxldmVsKTsKKyAgICAgIC8vIEFDOiBBcyB3ZSBuZWVkIHRvIHBhc3MgYnkgdGhlIHRlYW1zIGxlYWd1ZSwgd2UgbmVlZCB0byBhcnRpZmljaWFsbHkKKyAgICAgIC8vIGluY3JlYXNlIGlpCisgICAgICBpZiAoaWkgPT0gdGxldmVsKSB7CisgICAgICAgIGlpICs9IDI7IC8vIHRocmVlIHRlYW1zIGhhdmUgc2FtZSBsZXZlbAorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWkrKzsgLy8gdHdvIHRlYW1zIGhhdmUgc2FtZSBsZXZlbAorICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmCisKKyAgd2hpbGUgKGlpID4gbGV2ZWwpIHsKKyAgICBmb3IgKGRkID0gdGVhbS0+dC50X3NlcmlhbGl6ZWQ7IChkZCA+IDApICYmIChpaSA+IGxldmVsKTsgZGQtLSwgaWktLSkgeworICAgIH0KKyAgICBpZiAodGVhbS0+dC50X3NlcmlhbGl6ZWQgJiYgKCFkZCkpIHsKKyAgICAgIHRlYW0gPSB0ZWFtLT50LnRfcGFyZW50OworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChpaSA+IGxldmVsKSB7CisgICAgICB0ZWFtID0gdGVhbS0+dC50X3BhcmVudDsKKyAgICAgIGlpLS07CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRlYW0tPnQudF9ucHJvYzsKK30KKwora21wX3Jfc2NoZWRfdCBfX2ttcF9nZXRfc2NoZWR1bGVfZ2xvYmFsKCkgeworICAvLyBUaGlzIHJvdXRpbmUgY3JlYXRlZCBiZWNhdXNlIHBhaXJzIChfX2ttcF9zY2hlZCwgX19rbXBfY2h1bmspIGFuZAorICAvLyAoX19rbXBfc3RhdGljLCBfX2ttcF9ndWlkZWQpIG1heSBiZSBjaGFuZ2VkIGJ5IGttcF9zZXRfZGVmYXVsdHMKKyAgLy8gaW5kZXBlbmRlbnRseS4gU28gb25lIGNhbiBnZXQgdGhlIHVwZGF0ZWQgc2NoZWR1bGUgaGVyZS4KKworICBrbXBfcl9zY2hlZF90IHJfc2NoZWQ7CisKKyAgLy8gY3JlYXRlIHNjaGVkdWxlIGZyb20gNCBnbG9iYWxzOiBfX2ttcF9zY2hlZCwgX19rbXBfY2h1bmssIF9fa21wX3N0YXRpYywKKyAgLy8gX19rbXBfZ3VpZGVkLiBfX2ttcF9zY2hlZCBzaG91bGQga2VlcCBvcmlnaW5hbCB2YWx1ZSwgc28gdGhhdCB1c2VyIGNhbiBzZXQKKyAgLy8gS01QX1NDSEVEVUxFIG11bHRpcGxlIHRpbWVzLCBhbmQgdGh1cyBoYXZlIGRpZmZlcmVudCBydW4tdGltZSBzY2hlZHVsZXMgaW4KKyAgLy8gZGlmZmVyZW50IHJvb3RzIChldmVuIGluIE9NUCAyLjUpCisgIGlmIChfX2ttcF9zY2hlZCA9PSBrbXBfc2NoX3N0YXRpYykgeworICAgIHJfc2NoZWQucl9zY2hlZF90eXBlID0gX19rbXBfc3RhdGljOyAvLyByZXBsYWNlIFNUQVRJQyB3aXRoIG1vcmUgZGV0YWlsZWQKKyAgICAvLyBzY2hlZHVsZSAoYmFsYW5jZWQgb3IgZ3JlZWR5KQorICB9IGVsc2UgaWYgKF9fa21wX3NjaGVkID09IGttcF9zY2hfZ3VpZGVkX2NodW5rZWQpIHsKKyAgICByX3NjaGVkLnJfc2NoZWRfdHlwZSA9IF9fa21wX2d1aWRlZDsgLy8gcmVwbGFjZSBHVUlERUQgd2l0aCBtb3JlIGRldGFpbGVkCisgICAgLy8gc2NoZWR1bGUgKGl0ZXJhdGl2ZSBvciBhbmFseXRpY2FsKQorICB9IGVsc2UgeworICAgIHJfc2NoZWQucl9zY2hlZF90eXBlID0KKyAgICAgICAgX19rbXBfc2NoZWQ7IC8vIChTVEFUSUNfQ0hVTktFRCksIG9yIChEWU5BTUlDX0NIVU5LRUQpLCBvciBvdGhlcgorICB9CisKKyAgaWYgKF9fa21wX2NodW5rIDwgS01QX0RFRkFVTFRfQ0hVTkspIHsgLy8gX19rbXBfY2h1bmsgbWF5IGJlIHdyb25nIGhlcmUgKGlmIGl0CisgICAgLy8gd2FzIG5vdCBldmVyIHNldCkKKyAgICByX3NjaGVkLmNodW5rID0gS01QX0RFRkFVTFRfQ0hVTks7CisgIH0gZWxzZSB7CisgICAgcl9zY2hlZC5jaHVuayA9IF9fa21wX2NodW5rOworICB9CisKKyAgcmV0dXJuIHJfc2NoZWQ7Cit9CisKKy8qIEFsbG9jYXRlIChyZWFsbG9jID09IEZBTFNFKSAqIG9yIHJlYWxsb2NhdGUgKHJlYWxsb2MgPT0gVFJVRSkKKyAgIGF0IGxlYXN0IGFyZ2MgbnVtYmVyIG9mICp0X2FyZ3YgZW50cmllcyBmb3IgdGhlIHJlcXVlc3RlZCB0ZWFtLiAqLworc3RhdGljIHZvaWQgX19rbXBfYWxsb2NfYXJndl9lbnRyaWVzKGludCBhcmdjLCBrbXBfdGVhbV90ICp0ZWFtLCBpbnQgcmVhbGxvYykgeworCisgIEtNUF9ERUJVR19BU1NFUlQodGVhbSk7CisgIGlmICghcmVhbGxvYyB8fCBhcmdjID4gdGVhbS0+dC50X21heF9hcmdjKSB7CisKKyAgICBLQV9UUkFDRSgxMDAsICgiX19rbXBfYWxsb2NfYXJndl9lbnRyaWVzOiB0ZWFtICVkOiBuZWVkZWQgZW50cmllcz0lZCwgIgorICAgICAgICAgICAgICAgICAgICJjdXJyZW50IGVudHJpZXM9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBhcmdjLCAocmVhbGxvYykgPyB0ZWFtLT50LnRfbWF4X2FyZ2MgOiAwKSk7CisgICAgLyogaWYgcHJldmlvdXNseSBhbGxvY2F0ZWQgaGVhcCBzcGFjZSBmb3IgYXJncywgZnJlZSB0aGVtICovCisgICAgaWYgKHJlYWxsb2MgJiYgdGVhbS0+dC50X2FyZ3YgIT0gJnRlYW0tPnQudF9pbmxpbmVfYXJndlswXSkKKyAgICAgIF9fa21wX2ZyZWUoKHZvaWQgKil0ZWFtLT50LnRfYXJndik7CisKKyAgICBpZiAoYXJnYyA8PSBLTVBfSU5MSU5FX0FSR1ZfRU5UUklFUykgeworICAgICAgLyogdXNlIHVudXNlZCBzcGFjZSBpbiB0aGUgY2FjaGUgbGluZSBmb3IgYXJndW1lbnRzICovCisgICAgICB0ZWFtLT50LnRfbWF4X2FyZ2MgPSBLTVBfSU5MSU5FX0FSR1ZfRU5UUklFUzsKKyAgICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF9hbGxvY19hcmd2X2VudHJpZXM6IHRlYW0gJWQ6IGlubGluZSBhbGxvY2F0ZSAlZCAiCisgICAgICAgICAgICAgICAgICAgICAiYXJndiBlbnRyaWVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCB0ZWFtLT50LnRfbWF4X2FyZ2MpKTsKKyAgICAgIHRlYW0tPnQudF9hcmd2ID0gJnRlYW0tPnQudF9pbmxpbmVfYXJndlswXTsKKyAgICAgIGlmIChfX2ttcF9zdG9yYWdlX21hcCkgeworICAgICAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKAorICAgICAgICAgICAgLTEsICZ0ZWFtLT50LnRfaW5saW5lX2FyZ3ZbMF0sCisgICAgICAgICAgICAmdGVhbS0+dC50X2lubGluZV9hcmd2W0tNUF9JTkxJTkVfQVJHVl9FTlRSSUVTXSwKKyAgICAgICAgICAgIChzaXplb2Yodm9pZCAqKSAqIEtNUF9JTkxJTkVfQVJHVl9FTlRSSUVTKSwgInRlYW1fJWQudF9pbmxpbmVfYXJndiIsCisgICAgICAgICAgICB0ZWFtLT50LnRfaWQpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvKiBhbGxvY2F0ZSBzcGFjZSBmb3IgYXJndW1lbnRzIGluIHRoZSBoZWFwICovCisgICAgICB0ZWFtLT50LnRfbWF4X2FyZ2MgPSAoYXJnYyA8PSAoS01QX01JTl9NQUxMT0NfQVJHVl9FTlRSSUVTID4+IDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gS01QX01JTl9NQUxMT0NfQVJHVl9FTlRSSUVTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAyICogYXJnYzsKKyAgICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF9hbGxvY19hcmd2X2VudHJpZXM6IHRlYW0gJWQ6IGR5bmFtaWMgYWxsb2NhdGUgJWQgIgorICAgICAgICAgICAgICAgICAgICAgImFyZ3YgZW50cmllc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgdGVhbS0+dC50X21heF9hcmdjKSk7CisgICAgICB0ZWFtLT50LnRfYXJndiA9CisgICAgICAgICAgKHZvaWQgKiopX19rbXBfcGFnZV9hbGxvY2F0ZShzaXplb2Yodm9pZCAqKSAqIHRlYW0tPnQudF9tYXhfYXJnYyk7CisgICAgICBpZiAoX19rbXBfc3RvcmFnZV9tYXApIHsKKyAgICAgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCgtMSwgJnRlYW0tPnQudF9hcmd2WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZWFtLT50LnRfYXJndlt0ZWFtLT50LnRfbWF4X2FyZ2NdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih2b2lkICopICogdGVhbS0+dC50X21heF9hcmdjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZWFtXyVkLnRfYXJndiIsIHRlYW0tPnQudF9pZCk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIF9fa21wX2FsbG9jYXRlX3RlYW1fYXJyYXlzKGttcF90ZWFtX3QgKnRlYW0sIGludCBtYXhfbnRoKSB7CisgIGludCBpOworICBpbnQgbnVtX2Rpc3BfYnVmZiA9IG1heF9udGggPiAxID8gX19rbXBfZGlzcGF0Y2hfbnVtX2J1ZmZlcnMgOiAyOworICB0ZWFtLT50LnRfdGhyZWFkcyA9CisgICAgICAoa21wX2luZm9fdCAqKilfX2ttcF9hbGxvY2F0ZShzaXplb2Yoa21wX2luZm9fdCAqKSAqIG1heF9udGgpOworICB0ZWFtLT50LnRfZGlzcF9idWZmZXIgPSAoZGlzcGF0Y2hfc2hhcmVkX2luZm9fdCAqKV9fa21wX2FsbG9jYXRlKAorICAgICAgc2l6ZW9mKGRpc3BhdGNoX3NoYXJlZF9pbmZvX3QpICogbnVtX2Rpc3BfYnVmZik7CisgIHRlYW0tPnQudF9kaXNwYXRjaCA9CisgICAgICAoa21wX2Rpc3BfdCAqKV9fa21wX2FsbG9jYXRlKHNpemVvZihrbXBfZGlzcF90KSAqIG1heF9udGgpOworICB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YSA9CisgICAgICAoa21wX3Rhc2tkYXRhX3QgKilfX2ttcF9hbGxvY2F0ZShzaXplb2Yoa21wX3Rhc2tkYXRhX3QpICogbWF4X250aCk7CisgIHRlYW0tPnQudF9tYXhfbnByb2MgPSBtYXhfbnRoOworCisgIC8qIHNldHVwIGRpc3BhdGNoIGJ1ZmZlcnMgKi8KKyAgZm9yIChpID0gMDsgaSA8IG51bV9kaXNwX2J1ZmY7ICsraSkgeworICAgIHRlYW0tPnQudF9kaXNwX2J1ZmZlcltpXS5idWZmZXJfaW5kZXggPSBpOworI2lmIE9NUF80NV9FTkFCTEVECisgICAgdGVhbS0+dC50X2Rpc3BfYnVmZmVyW2ldLmRvYWNyb3NzX2J1Zl9pZHggPSBpOworI2VuZGlmCisgIH0KK30KKworc3RhdGljIHZvaWQgX19rbXBfZnJlZV90ZWFtX2FycmF5cyhrbXBfdGVhbV90ICp0ZWFtKSB7CisgIC8qIE5vdGU6IHRoaXMgZG9lcyBub3QgZnJlZSB0aGUgdGhyZWFkcyBpbiB0X3RocmVhZHMgKF9fa21wX2ZyZWVfdGhyZWFkcykgKi8KKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCB0ZWFtLT50LnRfbWF4X25wcm9jOyArK2kpIHsKKyAgICBpZiAodGVhbS0+dC50X2Rpc3BhdGNoW2ldLnRoX2Rpc3BfYnVmZmVyICE9IE5VTEwpIHsKKyAgICAgIF9fa21wX2ZyZWUodGVhbS0+dC50X2Rpc3BhdGNoW2ldLnRoX2Rpc3BfYnVmZmVyKTsKKyAgICAgIHRlYW0tPnQudF9kaXNwYXRjaFtpXS50aF9kaXNwX2J1ZmZlciA9IE5VTEw7CisgICAgfTsgLy8gaWYKKyAgfTsgLy8gZm9yCisgIF9fa21wX2ZyZWUodGVhbS0+dC50X3RocmVhZHMpOworICBfX2ttcF9mcmVlKHRlYW0tPnQudF9kaXNwX2J1ZmZlcik7CisgIF9fa21wX2ZyZWUodGVhbS0+dC50X2Rpc3BhdGNoKTsKKyAgX19rbXBfZnJlZSh0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YSk7CisgIHRlYW0tPnQudF90aHJlYWRzID0gTlVMTDsKKyAgdGVhbS0+dC50X2Rpc3BfYnVmZmVyID0gTlVMTDsKKyAgdGVhbS0+dC50X2Rpc3BhdGNoID0gTlVMTDsKKyAgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGEgPSAwOworfQorCitzdGF0aWMgdm9pZCBfX2ttcF9yZWFsbG9jYXRlX3RlYW1fYXJyYXlzKGttcF90ZWFtX3QgKnRlYW0sIGludCBtYXhfbnRoKSB7CisgIGttcF9pbmZvX3QgKipvbGRUaHJlYWRzID0gdGVhbS0+dC50X3RocmVhZHM7CisKKyAgX19rbXBfZnJlZSh0ZWFtLT50LnRfZGlzcF9idWZmZXIpOworICBfX2ttcF9mcmVlKHRlYW0tPnQudF9kaXNwYXRjaCk7CisgIF9fa21wX2ZyZWUodGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGEpOworICBfX2ttcF9hbGxvY2F0ZV90ZWFtX2FycmF5cyh0ZWFtLCBtYXhfbnRoKTsKKworICBLTVBfTUVNQ1BZKHRlYW0tPnQudF90aHJlYWRzLCBvbGRUaHJlYWRzLAorICAgICAgICAgICAgIHRlYW0tPnQudF9ucHJvYyAqIHNpemVvZihrbXBfaW5mb190ICopKTsKKworICBfX2ttcF9mcmVlKG9sZFRocmVhZHMpOworfQorCitzdGF0aWMga21wX2ludGVybmFsX2NvbnRyb2xfdCBfX2ttcF9nZXRfZ2xvYmFsX2ljdnModm9pZCkgeworCisgIGttcF9yX3NjaGVkX3Qgcl9zY2hlZCA9CisgICAgICBfX2ttcF9nZXRfc2NoZWR1bGVfZ2xvYmFsKCk7IC8vIGdldCBjdXJyZW50IHN0YXRlIG9mIHNjaGVkdWxpbmcgZ2xvYmFscworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgPiAwKTsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgZ19pY3ZzID0geworICAgIDAsIC8vIGludCBzZXJpYWxfbmVzdGluZ19sZXZlbDsgLy9jb3JyZXNwb25kcyB0byB2YWx1ZSBvZiB0aF90ZWFtX3NlcmlhbGl6ZWQKKyAgICAoa21wX2ludDgpX19rbXBfZGZsdF9uZXN0ZWQsIC8vIGludCBuZXN0ZWQ7IC8vaW50ZXJuYWwgY29udHJvbAorICAgIC8vIGZvciBuZXN0ZWQgcGFyYWxsZWxpc20gKHBlciB0aHJlYWQpCisgICAgKGttcF9pbnQ4KV9fa21wX2dsb2JhbC5nLmdfZHluYW1pYywgLy8gaW50ZXJuYWwgY29udHJvbCBmb3IgZHluYW1pYworICAgIC8vIGFkanVzdG1lbnQgb2YgdGhyZWFkcyAocGVyIHRocmVhZCkKKyAgICAoa21wX2ludDgpX19rbXBfZW52X2Jsb2NrdGltZSwgLy8gaW50IGJ0X3NldDsgLy9pbnRlcm5hbCBjb250cm9sIGZvcgorICAgIC8vIHdoZXRoZXIgYmxvY2t0aW1lIGlzIGV4cGxpY2l0bHkgc2V0CisgICAgX19rbXBfZGZsdF9ibG9ja3RpbWUsIC8vIGludCBibG9ja3RpbWU7IC8vaW50ZXJuYWwgY29udHJvbCBmb3IgYmxvY2t0aW1lCisjaWYgS01QX1VTRV9NT05JVE9SCisgICAgX19rbXBfYnRfaW50ZXJ2YWxzLCAvLyBpbnQgYnRfaW50ZXJ2YWxzOyAvL2ludGVybmFsIGNvbnRyb2wgZm9yIGJsb2NrdGltZQorLy8gaW50ZXJ2YWxzCisjZW5kaWYKKyAgICBfX2ttcF9kZmx0X3RlYW1fbnRoLCAvLyBpbnQgbnByb2M7IC8vaW50ZXJuYWwgY29udHJvbCBmb3IgIyBvZiB0aHJlYWRzIGZvcgorICAgIC8vIG5leHQgcGFyYWxsZWwgcmVnaW9uIChwZXIgdGhyZWFkKQorICAgIC8vICh1c2UgYSBtYXggdWIgb24gdmFsdWUgaWYgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSBub3QgY2FsbGVkIHlldCkKKyAgICBfX2ttcF9kZmx0X21heF9hY3RpdmVfbGV2ZWxzLCAvLyBpbnQgbWF4X2FjdGl2ZV9sZXZlbHM7IC8vaW50ZXJuYWwgY29udHJvbAorICAgIC8vIGZvciBtYXhfYWN0aXZlX2xldmVscworICAgIHJfc2NoZWQsIC8vIGttcF9yX3NjaGVkX3Qgc2NoZWQ7IC8vaW50ZXJuYWwgY29udHJvbCBmb3IgcnVudGltZSBzY2hlZHVsZQorLy8ge3NjaGVkLGNodW5rfSBwYWlyCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0sCisgICAgX19rbXBfZGVmYXVsdF9kZXZpY2UsCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICBOVUxMIC8vIHN0cnVjdCBrbXBfaW50ZXJuYWxfY29udHJvbCAqbmV4dDsKKyAgfTsKKworICByZXR1cm4gZ19pY3ZzOworfQorCitzdGF0aWMga21wX2ludGVybmFsX2NvbnRyb2xfdCBfX2ttcF9nZXRfeF9nbG9iYWxfaWN2cyhjb25zdCBrbXBfdGVhbV90ICp0ZWFtKSB7CisKKyAga21wX2ludGVybmFsX2NvbnRyb2xfdCBneF9pY3ZzOworICBneF9pY3ZzLnNlcmlhbF9uZXN0aW5nX2xldmVsID0KKyAgICAgIDA7IC8vIHByb2JhYmx5ID10ZWFtLT50LnRfc2VyaWFsIGxpa2UgaW4gc2F2ZV9pbnRlcl9jb250cm9scworICBjb3B5X2ljdnMoJmd4X2ljdnMsICZ0ZWFtLT50LnRfdGhyZWFkc1swXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzKTsKKyAgZ3hfaWN2cy5uZXh0ID0gTlVMTDsKKworICByZXR1cm4gZ3hfaWN2czsKK30KKworc3RhdGljIHZvaWQgX19rbXBfaW5pdGlhbGl6ZV9yb290KGttcF9yb290X3QgKnJvb3QpIHsKKyAgaW50IGY7CisgIGttcF90ZWFtX3QgKnJvb3RfdGVhbTsKKyAga21wX3RlYW1fdCAqaG90X3RlYW07CisgIGludCBob3RfdGVhbV9tYXhfbnRoOworICBrbXBfcl9zY2hlZF90IHJfc2NoZWQgPQorICAgICAgX19rbXBfZ2V0X3NjaGVkdWxlX2dsb2JhbCgpOyAvLyBnZXQgY3VycmVudCBzdGF0ZSBvZiBzY2hlZHVsaW5nIGdsb2JhbHMKKyAga21wX2ludGVybmFsX2NvbnRyb2xfdCByX2ljdnMgPSBfX2ttcF9nZXRfZ2xvYmFsX2ljdnMoKTsKKyAgS01QX0RFQlVHX0FTU0VSVChyb290KTsKKyAgS01QX0FTU0VSVCghcm9vdC0+ci5yX2JlZ2luKTsKKworICAvKiBzZXR1cCB0aGUgcm9vdCBzdGF0ZSBzdHJ1Y3R1cmUgKi8KKyAgX19rbXBfaW5pdF9sb2NrKCZyb290LT5yLnJfYmVnaW5fbG9jayk7CisgIHJvb3QtPnIucl9iZWdpbiA9IEZBTFNFOworICByb290LT5yLnJfYWN0aXZlID0gRkFMU0U7CisgIHJvb3QtPnIucl9pbl9wYXJhbGxlbCA9IDA7CisgIHJvb3QtPnIucl9ibG9ja3RpbWUgPSBfX2ttcF9kZmx0X2Jsb2NrdGltZTsKKyAgcm9vdC0+ci5yX25lc3RlZCA9IF9fa21wX2RmbHRfbmVzdGVkOworCisgIC8qIHNldHVwIHRoZSByb290IHRlYW0gZm9yIHRoaXMgdGFzayAqLworICAvKiBhbGxvY2F0ZSB0aGUgcm9vdCB0ZWFtIHN0cnVjdHVyZSAqLworICBLRl9UUkFDRSgxMCwgKCJfX2ttcF9pbml0aWFsaXplX3Jvb3Q6IGJlZm9yZSByb290X3RlYW1cbiIpKTsKKworICByb290X3RlYW0gPQorICAgICAgX19rbXBfYWxsb2NhdGVfdGVhbShyb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAvLyBuZXdfbnByb2MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgLy8gbWF4X25wcm9jCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8vIHJvb3QgcGFyYWxsZWwgaWQKKyNlbmRpZgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAmcl9pY3ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8vIGFyZ2MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX05FU1RFRF9IT1RfQVJHKE5VTEwpIC8vIG1hc3RlciB0aHJlYWQgaXMgdW5rbm93bgorICAgICAgICAgICAgICAgICAgICAgICAgICApOworI2lmIFVTRV9ERUJVR0dFUgorICAvLyBOb24tTlVMTCB2YWx1ZSBzaG91bGQgYmUgYXNzaWduZWQgdG8gbWFrZSB0aGUgZGVidWdnZXIgZGlzcGxheSB0aGUgcm9vdAorICAvLyB0ZWFtLgorICBUQ1dfU1lOQ19QVFIocm9vdF90ZWFtLT50LnRfcGtmbiwgKG1pY3JvdGFza190KSh+MCkpOworI2VuZGlmCisKKyAgS0ZfVFJBQ0UoMTAsICgiX19rbXBfaW5pdGlhbGl6ZV9yb290OiBhZnRlciByb290X3RlYW0gPSAlcFxuIiwgcm9vdF90ZWFtKSk7CisKKyAgcm9vdC0+ci5yX3Jvb3RfdGVhbSA9IHJvb3RfdGVhbTsKKyAgcm9vdF90ZWFtLT50LnRfY29udHJvbF9zdGFja190b3AgPSBOVUxMOworCisgIC8qIGluaXRpYWxpemUgcm9vdCB0ZWFtICovCisgIHJvb3RfdGVhbS0+dC50X3RocmVhZHNbMF0gPSBOVUxMOworICByb290X3RlYW0tPnQudF9ucHJvYyA9IDE7CisgIHJvb3RfdGVhbS0+dC50X3NlcmlhbGl6ZWQgPSAxOworICAvLyBUT0RPPz8/OiByb290X3RlYW0tPnQudF9tYXhfYWN0aXZlX2xldmVscyA9IF9fa21wX2RmbHRfbWF4X2FjdGl2ZV9sZXZlbHM7CisgIHJvb3RfdGVhbS0+dC50X3NjaGVkLnJfc2NoZWRfdHlwZSA9IHJfc2NoZWQucl9zY2hlZF90eXBlOworICByb290X3RlYW0tPnQudF9zY2hlZC5jaHVuayA9IHJfc2NoZWQuY2h1bms7CisgIEtBX1RSQUNFKAorICAgICAgMjAsCisgICAgICAoIl9fa21wX2luaXRpYWxpemVfcm9vdDogaW5pdCByb290IHRlYW0gJWQgYXJyaXZlZDogam9pbj0ldSwgcGxhaW49JXVcbiIsCisgICAgICAgcm9vdF90ZWFtLT50LnRfaWQsIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUsIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUpKTsKKworICAvKiBzZXR1cCB0aGUgIGhvdCB0ZWFtIGZvciB0aGlzIHRhc2sgKi8KKyAgLyogYWxsb2NhdGUgdGhlIGhvdCB0ZWFtIHN0cnVjdHVyZSAqLworICBLRl9UUkFDRSgxMCwgKCJfX2ttcF9pbml0aWFsaXplX3Jvb3Q6IGJlZm9yZSBob3RfdGVhbVxuIikpOworCisgIGhvdF90ZWFtID0KKyAgICAgIF9fa21wX2FsbG9jYXRlX3RlYW0ocm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgLy8gbmV3X25wcm9jCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGhfdWIgKiAyLCAvLyBtYXhfbnByb2MKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLy8gcm9vdCBwYXJhbGxlbCBpZAorI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyX2ljdnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLy8gYXJnYworICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfTkVTVEVEX0hPVF9BUkcoTlVMTCkgLy8gbWFzdGVyIHRocmVhZCBpcyB1bmtub3duCisgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgIEtGX1RSQUNFKDEwLCAoIl9fa21wX2luaXRpYWxpemVfcm9vdDogYWZ0ZXIgaG90X3RlYW0gPSAlcFxuIiwgaG90X3RlYW0pKTsKKworICByb290LT5yLnJfaG90X3RlYW0gPSBob3RfdGVhbTsKKyAgcm9vdF90ZWFtLT50LnRfY29udHJvbF9zdGFja190b3AgPSBOVUxMOworCisgIC8qIGZpcnN0LXRpbWUgaW5pdGlhbGl6YXRpb24gKi8KKyAgaG90X3RlYW0tPnQudF9wYXJlbnQgPSByb290X3RlYW07CisKKyAgLyogaW5pdGlhbGl6ZSBob3QgdGVhbSAqLworICBob3RfdGVhbV9tYXhfbnRoID0gaG90X3RlYW0tPnQudF9tYXhfbnByb2M7CisgIGZvciAoZiA9IDA7IGYgPCBob3RfdGVhbV9tYXhfbnRoOyArK2YpIHsKKyAgICBob3RfdGVhbS0+dC50X3RocmVhZHNbZl0gPSBOVUxMOworICB9OyAvLyBmb3IKKyAgaG90X3RlYW0tPnQudF9ucHJvYyA9IDE7CisgIC8vIFRPRE8/Pz86IGhvdF90ZWFtLT50LnRfbWF4X2FjdGl2ZV9sZXZlbHMgPSBfX2ttcF9kZmx0X21heF9hY3RpdmVfbGV2ZWxzOworICBob3RfdGVhbS0+dC50X3NjaGVkLnJfc2NoZWRfdHlwZSA9IHJfc2NoZWQucl9zY2hlZF90eXBlOworICBob3RfdGVhbS0+dC50X3NjaGVkLmNodW5rID0gcl9zY2hlZC5jaHVuazsKKyAgaG90X3RlYW0tPnQudF9zaXplX2NoYW5nZWQgPSAwOworfQorCisjaWZkZWYgS01QX0RFQlVHCisKK3R5cGVkZWYgc3RydWN0IGttcF90ZWFtX2xpc3RfaXRlbSB7CisgIGttcF90ZWFtX3AgY29uc3QgKmVudHJ5OworICBzdHJ1Y3Qga21wX3RlYW1fbGlzdF9pdGVtICpuZXh0OworfSBrbXBfdGVhbV9saXN0X2l0ZW1fdDsKK3R5cGVkZWYga21wX3RlYW1fbGlzdF9pdGVtX3QgKmttcF90ZWFtX2xpc3RfdDsKKworc3RhdGljIHZvaWQgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW1fYWNjdW0oIC8vIEFkZCB0ZWFtIHRvIGxpc3Qgb2YgdGVhbXMuCisgICAga21wX3RlYW1fbGlzdF90IGxpc3QsIC8vIExpc3Qgb2YgdGVhbXMuCisgICAga21wX3RlYW1fcCBjb25zdCAqdGVhbSAvLyBUZWFtIHRvIGFkZC4KKyAgICApIHsKKworICAvLyBMaXN0IG11c3QgdGVybWluYXRlIHdpdGggaXRlbSB3aGVyZSBib3RoIGVudHJ5IGFuZCBuZXh0IGFyZSBOVUxMLgorICAvLyBUZWFtIGlzIGFkZGVkIHRvIHRoZSBsaXN0IG9ubHkgb25jZS4KKyAgLy8gTGlzdCBpcyBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHRlYW0gaWQuCisgIC8vIFRlYW0gaWQgaXMgKm5vdCogYSBrZXkuCisKKyAga21wX3RlYW1fbGlzdF90IGw7CisKKyAgS01QX0RFQlVHX0FTU0VSVChsaXN0ICE9IE5VTEwpOworICBpZiAodGVhbSA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9OyAvLyBpZgorCisgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtX2FjY3VtKGxpc3QsIHRlYW0tPnQudF9wYXJlbnQpOworICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbV9hY2N1bShsaXN0LCB0ZWFtLT50LnRfbmV4dF9wb29sKTsKKworICAvLyBTZWFyY2ggbGlzdCBmb3IgdGhlIHRlYW0uCisgIGwgPSBsaXN0OworICB3aGlsZSAobC0+bmV4dCAhPSBOVUxMICYmIGwtPmVudHJ5ICE9IHRlYW0pIHsKKyAgICBsID0gbC0+bmV4dDsKKyAgfTsgLy8gd2hpbGUKKyAgaWYgKGwtPm5leHQgIT0gTlVMTCkgeworICAgIHJldHVybjsgLy8gVGVhbSBoYXMgYmVlbiBhZGRlZCBiZWZvcmUsIGV4aXQuCisgIH07IC8vIGlmCisKKyAgLy8gVGVhbSBpcyBub3QgZm91bmQuIFNlYXJjaCBsaXN0IGFnYWluIGZvciBpbnNlcnRpb24gcG9pbnQuCisgIGwgPSBsaXN0OworICB3aGlsZSAobC0+bmV4dCAhPSBOVUxMICYmIGwtPmVudHJ5LT50LnRfaWQgPD0gdGVhbS0+dC50X2lkKSB7CisgICAgbCA9IGwtPm5leHQ7CisgIH07IC8vIHdoaWxlCisKKyAgLy8gSW5zZXJ0IHRlYW0uCisgIHsKKyAgICBrbXBfdGVhbV9saXN0X2l0ZW1fdCAqaXRlbSA9IChrbXBfdGVhbV9saXN0X2l0ZW1fdCAqKUtNUF9JTlRFUk5BTF9NQUxMT0MoCisgICAgICAgIHNpemVvZihrbXBfdGVhbV9saXN0X2l0ZW1fdCkpOworICAgICppdGVtID0gKmw7CisgICAgbC0+ZW50cnkgPSB0ZWFtOworICAgIGwtPm5leHQgPSBpdGVtOworICB9Cit9CisKK3N0YXRpYyB2b2lkIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtKGNoYXIgY29uc3QgKnRpdGxlLCBrbXBfdGVhbV9wIGNvbnN0ICp0ZWFtCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgeworICBfX2ttcF9wcmludGYoIiVzIiwgdGl0bGUpOworICBpZiAodGVhbSAhPSBOVUxMKSB7CisgICAgX19rbXBfcHJpbnRmKCIlMnggJXBcbiIsIHRlYW0tPnQudF9pZCwgdGVhbSk7CisgIH0gZWxzZSB7CisgICAgX19rbXBfcHJpbnRmKCIgLSAobmlsKVxuIik7CisgIH07IC8vIGlmCit9CisKK3N0YXRpYyB2b2lkIF9fa21wX3ByaW50X3N0cnVjdHVyZV90aHJlYWQoY2hhciBjb25zdCAqdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbmZvX3AgY29uc3QgKnRocmVhZCkgeworICBfX2ttcF9wcmludGYoIiVzIiwgdGl0bGUpOworICBpZiAodGhyZWFkICE9IE5VTEwpIHsKKyAgICBfX2ttcF9wcmludGYoIiUyZCAlcFxuIiwgdGhyZWFkLT50aC50aF9pbmZvLmRzLmRzX2d0aWQsIHRocmVhZCk7CisgIH0gZWxzZSB7CisgICAgX19rbXBfcHJpbnRmKCIgLSAobmlsKVxuIik7CisgIH07IC8vIGlmCit9CisKK3ZvaWQgX19rbXBfcHJpbnRfc3RydWN0dXJlKHZvaWQpIHsKKworICBrbXBfdGVhbV9saXN0X3QgbGlzdDsKKworICAvLyBJbml0aWFsaXplIGxpc3Qgb2YgdGVhbXMuCisgIGxpc3QgPQorICAgICAgKGttcF90ZWFtX2xpc3RfaXRlbV90ICopS01QX0lOVEVSTkFMX01BTExPQyhzaXplb2Yoa21wX3RlYW1fbGlzdF9pdGVtX3QpKTsKKyAgbGlzdC0+ZW50cnkgPSBOVUxMOworICBsaXN0LT5uZXh0ID0gTlVMTDsKKworICBfX2ttcF9wcmludGYoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5HbG9iYWwgVGhyZWFkICIKKyAgICAgICAgICAgICAgICJUYWJsZVxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgeworICAgIGludCBndGlkOworICAgIGZvciAoZ3RpZCA9IDA7IGd0aWQgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyArK2d0aWQpIHsKKyAgICAgIF9fa21wX3ByaW50ZigiJTJkIiwgZ3RpZCk7CisgICAgICBpZiAoX19rbXBfdGhyZWFkcyAhPSBOVUxMKSB7CisgICAgICAgIF9fa21wX3ByaW50ZigiICVwIiwgX19rbXBfdGhyZWFkc1tndGlkXSk7CisgICAgICB9OyAvLyBpZgorICAgICAgaWYgKF9fa21wX3Jvb3QgIT0gTlVMTCkgeworICAgICAgICBfX2ttcF9wcmludGYoIiAlcCIsIF9fa21wX3Jvb3RbZ3RpZF0pOworICAgICAgfTsgLy8gaWYKKyAgICAgIF9fa21wX3ByaW50ZigiXG4iKTsKKyAgICB9OyAvLyBmb3IgZ3RpZAorICB9CisKKyAgLy8gUHJpbnQgb3V0IF9fa21wX3RocmVhZHMgYXJyYXkuCisgIF9fa21wX3ByaW50ZigiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblRocmVhZHNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgICAgICAgICAgICAgIi0tLS0tLS0tLS1cbiIpOworICBpZiAoX19rbXBfdGhyZWFkcyAhPSBOVUxMKSB7CisgICAgaW50IGd0aWQ7CisgICAgZm9yIChndGlkID0gMDsgZ3RpZCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7ICsrZ3RpZCkgeworICAgICAga21wX2luZm9fdCBjb25zdCAqdGhyZWFkID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgICAgIGlmICh0aHJlYWQgIT0gTlVMTCkgeworICAgICAgICBfX2ttcF9wcmludGYoIkdUSUQgJTJkICVwOlxuIiwgZ3RpZCwgdGhyZWFkKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgT3VyIFJvb3Q6ICAgICAgICAlcFxuIiwgdGhyZWFkLT50aC50aF9yb290KTsKKyAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW0oIiAgICBPdXIgVGVhbTogICAgICIsIHRocmVhZC0+dGgudGhfdGVhbSk7CisgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtKCIgICAgU2VyaWFsIFRlYW06ICAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQtPnRoLnRoX3NlcmlhbF90ZWFtKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgVGhyZWFkczogICAgICAlMmRcbiIsIHRocmVhZC0+dGgudGhfdGVhbV9ucHJvYyk7CisgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90aHJlYWQoIiAgICBNYXN0ZXI6ICAgICAgICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkLT50aC50aF90ZWFtX21hc3Rlcik7CisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIFNlcmlhbGl6ZWQ/OiAgJTJkXG4iLCB0aHJlYWQtPnRoLnRoX3RlYW1fc2VyaWFsaXplZCk7CisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIFNldCBOUHJvYzogICAgJTJkXG4iLCB0aHJlYWQtPnRoLnRoX3NldF9ucHJvYyk7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgU2V0IFByb2MgQmluZDogJTJkXG4iLCB0aHJlYWQtPnRoLnRoX3NldF9wcm9jX2JpbmQpOworI2VuZGlmCisgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90aHJlYWQoIiAgICBOZXh0IGluIHBvb2w6ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkLT50aC50aF9uZXh0X3Bvb2wpOworICAgICAgICBfX2ttcF9wcmludGYoIlxuIik7CisgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtX2FjY3VtKGxpc3QsIHRocmVhZC0+dGgudGhfdGVhbSk7CisgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtX2FjY3VtKGxpc3QsIHRocmVhZC0+dGgudGhfc2VyaWFsX3RlYW0pOworICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBmb3IgZ3RpZAorICB9IGVsc2UgeworICAgIF9fa21wX3ByaW50ZigiVGhyZWFkcyBhcnJheSBpcyBub3QgYWxsb2NhdGVkLlxuIik7CisgIH07IC8vIGlmCisKKyAgLy8gUHJpbnQgb3V0IF9fa21wX3Jvb3QgYXJyYXkuCisgIF9fa21wX3ByaW50ZigiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblViZXJzXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgICAgICAgICAgICAgIi0tLS0tLS0tXG4iKTsKKyAgaWYgKF9fa21wX3Jvb3QgIT0gTlVMTCkgeworICAgIGludCBndGlkOworICAgIGZvciAoZ3RpZCA9IDA7IGd0aWQgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyArK2d0aWQpIHsKKyAgICAgIGttcF9yb290X3QgY29uc3QgKnJvb3QgPSBfX2ttcF9yb290W2d0aWRdOworICAgICAgaWYgKHJvb3QgIT0gTlVMTCkgeworICAgICAgICBfX2ttcF9wcmludGYoIkdUSUQgJTJkICVwOlxuIiwgZ3RpZCwgcm9vdCk7CisgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtKCIgICAgUm9vdCBUZWFtOiAgICAiLCByb290LT5yLnJfcm9vdF90ZWFtKTsKKyAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW0oIiAgICBIb3QgVGVhbTogICAgICIsIHJvb3QtPnIucl9ob3RfdGVhbSk7CisgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90aHJlYWQoIiAgICBVYmVyIFRocmVhZDogICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdC0+ci5yX3ViZXJfdGhyZWFkKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgQWN0aXZlPzogICAgICAlMmRcbiIsIHJvb3QtPnIucl9hY3RpdmUpOworICAgICAgICBfX2ttcF9wcmludGYoIiAgICBOZXN0ZWQ/OiAgICAgICUyZFxuIiwgcm9vdC0+ci5yX25lc3RlZCk7CisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIEluIFBhcmFsbGVsOiAgJTJkXG4iLCByb290LT5yLnJfaW5fcGFyYWxsZWwpOworICAgICAgICBfX2ttcF9wcmludGYoIlxuIik7CisgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtX2FjY3VtKGxpc3QsIHJvb3QtPnIucl9yb290X3RlYW0pOworICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbV9hY2N1bShsaXN0LCByb290LT5yLnJfaG90X3RlYW0pOworICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBmb3IgZ3RpZAorICB9IGVsc2UgeworICAgIF9fa21wX3ByaW50ZigiVWJlcnMgYXJyYXkgaXMgbm90IGFsbG9jYXRlZC5cbiIpOworICB9OyAvLyBpZgorCisgIF9fa21wX3ByaW50ZigiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblRlYW1zXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgICAgICAgICAgICAgIi0tLS0tLS0tXG4iKTsKKyAgd2hpbGUgKGxpc3QtPm5leHQgIT0gTlVMTCkgeworICAgIGttcF90ZWFtX3AgY29uc3QgKnRlYW0gPSBsaXN0LT5lbnRyeTsKKyAgICBpbnQgaTsKKyAgICBfX2ttcF9wcmludGYoIlRlYW0gJTJ4ICVwOlxuIiwgdGVhbS0+dC50X2lkLCB0ZWFtKTsKKyAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbSgiICAgIFBhcmVudCBUZWFtOiAgICAgICIsIHRlYW0tPnQudF9wYXJlbnQpOworICAgIF9fa21wX3ByaW50ZigiICAgIE1hc3RlciBUSUQ6ICAgICAgICUyZFxuIiwgdGVhbS0+dC50X21hc3Rlcl90aWQpOworICAgIF9fa21wX3ByaW50ZigiICAgIE1heCB0aHJlYWRzOiAgICAgICUyZFxuIiwgdGVhbS0+dC50X21heF9ucHJvYyk7CisgICAgX19rbXBfcHJpbnRmKCIgICAgTGV2ZWxzIG9mIHNlcmlhbDogJTJkXG4iLCB0ZWFtLT50LnRfc2VyaWFsaXplZCk7CisgICAgX19rbXBfcHJpbnRmKCIgICAgTnVtYmVyIHRocmVhZHM6ICAgJTJkXG4iLCB0ZWFtLT50LnRfbnByb2MpOworICAgIGZvciAoaSA9IDA7IGkgPCB0ZWFtLT50LnRfbnByb2M7ICsraSkgeworICAgICAgX19rbXBfcHJpbnRmKCIgICAgVGhyZWFkICUyZDogICAgICAiLCBpKTsKKyAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90aHJlYWQoIiIsIHRlYW0tPnQudF90aHJlYWRzW2ldKTsKKyAgICB9OyAvLyBmb3IgaQorICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtKCIgICAgTmV4dCBpbiBwb29sOiAgICAgIiwgdGVhbS0+dC50X25leHRfcG9vbCk7CisgICAgX19rbXBfcHJpbnRmKCJcbiIpOworICAgIGxpc3QgPSBsaXN0LT5uZXh0OworICB9OyAvLyB3aGlsZQorCisgIC8vIFByaW50IG91dCBfX2ttcF90aHJlYWRfcG9vbCBhbmQgX19rbXBfdGVhbV9wb29sLgorICBfX2ttcF9wcmludGYoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5Qb29sc1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKyAgICAgICAgICAgICAgICItLS0tLS0tLVxuIik7CisgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90aHJlYWQoIlRocmVhZCBwb29sOiAgICAgICAgICAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDQVNUKGttcF9pbmZvX3QgKiwgX19rbXBfdGhyZWFkX3Bvb2wpKTsKKyAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW0oIlRlYW0gcG9vbDogICAgICAgICAgICAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ0FTVChrbXBfdGVhbV90ICosIF9fa21wX3RlYW1fcG9vbCkpOworICBfX2ttcF9wcmludGYoIlxuIik7CisKKyAgLy8gRnJlZSB0ZWFtIGxpc3QuCisgIHdoaWxlIChsaXN0ICE9IE5VTEwpIHsKKyAgICBrbXBfdGVhbV9saXN0X2l0ZW1fdCAqaXRlbSA9IGxpc3Q7CisgICAgbGlzdCA9IGxpc3QtPm5leHQ7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUoaXRlbSk7CisgIH07IC8vIHdoaWxlCit9CisKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFN0dWZmIGZvciBwZXItdGhyZWFkIGZhc3QgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKy8vICBUYWJsZSBvZiBwcmltZXMKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBfX2ttcF9wcmltZXNbXSA9IHsKKyAgICAweDllMzc3OWIxLCAweGZmZTZjYzU5LCAweDIxMDlmNmRkLCAweDQzOTc3YWI1LCAweGJhNTcwM2Y1LCAweGI0OTVhODc3LAorICAgIDB4ZTE2MjY3NDEsIDB4Nzk2OTVlNmIsIDB4YmM5OGMwOWYsIDB4ZDViZWUyYjMsIDB4Mjg3NDg4ZjksIDB4M2FmMTgyMzEsCisgICAgMHg5Njc3Y2Q0ZCwgMHhiZTNhNjkyOSwgMHhhZGM2YTg3NywgMHhkY2YwNjc0YiwgMHhiZTRkNmZlOSwgMHg1ZjE1ZTIwMSwKKyAgICAweDk5YWZjM2ZkLCAweGYzZjE2ODAxLCAweGUyMjJjZmZmLCAweDI0YmE1ZmRiLCAweDA2MjA0NTJkLCAweDc5ZjE0OWUzLAorICAgIDB4YzhiOTNmNDksIDB4OTcyNzAyY2QsIDB4YjA3ZGQ4MjcsIDB4NmM5N2Q1ZWQsIDB4MDg1YTNkNjEsIDB4NDZlYjVlYTcsCisgICAgMHgzZDk5MTBlZCwgMHgyZTY4N2I1YiwgMHgyOTYwOTIyNywgMHg2ZWIwODFmMSwgMHgwOTU0YzRlMSwgMHg5ZDExNGRiOSwKKyAgICAweDU0MmFjZmE5LCAweGIzZTZiZDdiLCAweDA3NDJkOTE3LCAweGU5ZjNmZmE3LCAweDU0NTgxZWRiLCAweGYyNDgwZjQ1LAorICAgIDB4MGJiOTI4OGYsIDB4ZWYxYWZmYzcsIDB4ODVmYTBjYTcsIDB4M2NjYzE0ZGIsIDB4ZTZiYWYzNGIsIDB4MzQzMzc3ZjcsCisgICAgMHg1Y2ExOTAzMSwgMHhlNmQ5MjkzYiwgMHhmMGE5ZjM5MSwgMHg1ZDJlOTgwYiwgMHhmYzQxMTA3MywgMHhjMzc0OTM2MywKKyAgICAweGI4OTJkODI5LCAweDM1NDkzNjZiLCAweDYyOTc1MGFkLCAweGI5ODI5NGU1LCAweDg5MmQ5NDgzLCAweGMyMzViYWYzLAorICAgIDB4M2QyNDAyYTMsIDB4NmJkZWYzYzksIDB4YmVjMzMzY2QsIDB4NDBjOTUyMGZ9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIF9fa21wX2dldF9yYW5kb206IEdldCBhIHJhbmRvbSBudW1iZXIgdXNpbmcgYSBsaW5lYXIgY29uZ3J1ZW50aWFsIG1ldGhvZC4KK3Vuc2lnbmVkIHNob3J0IF9fa21wX2dldF9yYW5kb20oa21wX2luZm9fdCAqdGhyZWFkKSB7CisgIHVuc2lnbmVkIHggPSB0aHJlYWQtPnRoLnRoX3g7CisgIHVuc2lnbmVkIHNob3J0IHIgPSB4ID4+IDE2OworCisgIHRocmVhZC0+dGgudGhfeCA9IHggKiB0aHJlYWQtPnRoLnRoX2EgKyAxOworCisgIEtBX1RSQUNFKDMwLCAoIl9fa21wX2dldF9yYW5kb206IFRIUkVBRDogJWQsIFJFVFVSTjogJXVcbiIsCisgICAgICAgICAgICAgICAgdGhyZWFkLT50aC50aF9pbmZvLmRzLmRzX3RpZCwgcikpOworCisgIHJldHVybiByOworfQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfaW5pdF9yYW5kb206IEluaXRpYWxpemUgYSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgordm9pZCBfX2ttcF9pbml0X3JhbmRvbShrbXBfaW5mb190ICp0aHJlYWQpIHsKKyAgdW5zaWduZWQgc2VlZCA9IHRocmVhZC0+dGgudGhfaW5mby5kcy5kc190aWQ7CisKKyAgdGhyZWFkLT50aC50aF9hID0KKyAgICAgIF9fa21wX3ByaW1lc1tzZWVkICUgKHNpemVvZihfX2ttcF9wcmltZXMpIC8gc2l6ZW9mKF9fa21wX3ByaW1lc1swXSkpXTsKKyAgdGhyZWFkLT50aC50aF94ID0gKHNlZWQgKyAxKSAqIHRocmVhZC0+dGgudGhfYSArIDE7CisgIEtBX1RSQUNFKDMwLAorICAgICAgICAgICAoIl9fa21wX2luaXRfcmFuZG9tOiBUSFJFQUQ6ICV1OyBBOiAldVxuIiwgc2VlZCwgdGhyZWFkLT50aC50aF9hKSk7Cit9CisKKyNpZiBLTVBfT1NfV0lORE9XUworLyogcmVjbGFpbSBhcnJheSBlbnRyaWVzIGZvciByb290IHRocmVhZHMgdGhhdCBhcmUgYWxyZWFkeSBkZWFkLCByZXR1cm5zIG51bWJlcgorICogcmVjbGFpbWVkICovCitzdGF0aWMgaW50IF9fa21wX3JlY2xhaW1fZGVhZF9yb290cyh2b2lkKSB7CisgIGludCBpLCByID0gMDsKKworICBmb3IgKGkgPSAwOyBpIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgKytpKSB7CisgICAgaWYgKEtNUF9VQkVSX0dUSUQoaSkgJiYKKyAgICAgICAgIV9fa21wX3N0aWxsX3J1bm5pbmcoKGttcF9pbmZvX3QgKilUQ1JfU1lOQ19QVFIoX19rbXBfdGhyZWFkc1tpXSkpICYmCisgICAgICAgICFfX2ttcF9yb290W2ldCisgICAgICAgICAgICAgLT5yLnJfYWN0aXZlKSB7IC8vIEFDOiByZWNsYWltIG9ubHkgcm9vdHMgZGllZCBpbiBub24tYWN0aXZlIHN0YXRlCisgICAgICByICs9IF9fa21wX3VucmVnaXN0ZXJfcm9vdF9vdGhlcl90aHJlYWQoaSk7CisgICAgfQorICB9CisgIHJldHVybiByOworfQorI2VuZGlmCisKKy8qIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gY3JlYXRlIGZyZWUgZW50cmllcyBpbiBfX2ttcF90aHJlYWRzIGFuZAorICAgX19rbXBfcm9vdCwgYW5kIHJldHVybnMgdGhlIG51bWJlciBvZiBmcmVlIGVudHJpZXMgZ2VuZXJhdGVkLgorCisgICBGb3IgV2luZG93cyogT1Mgc3RhdGljIGxpYnJhcnksIHRoZSBmaXJzdCBtZWNoYW5pc20gdXNlZCBpcyB0byByZWNsYWltIGFycmF5CisgICBlbnRyaWVzIGZvciByb290IHRocmVhZHMgdGhhdCBhcmUgYWxyZWFkeSBkZWFkLgorCisgICBPbiBhbGwgcGxhdGZvcm1zLCBleHBhbnNpb24gaXMgYXR0ZW1wdGVkIG9uIHRoZSBhcnJheXMgX19rbXBfdGhyZWFkc18gYW5kCisgICBfX2ttcF9yb290LCB3aXRoIGFwcHJvcHJpYXRlIHVwZGF0ZSB0byBfX2ttcF90aHJlYWRzX2NhcGFjaXR5LiBBcnJheQorICAgY2FwYWNpdHkgaXMgaW5jcmVhc2VkIGJ5IGRvdWJsaW5nIHdpdGggY2xpcHBpbmcgdG8gX19rbXBfdHBfY2FwYWNpdHksIGlmCisgICB0aHJlYWRwcml2YXRlIGNhY2hlIGFycmF5IGhhcyBiZWVuIGNyZWF0ZWQuIFN5bmNocm9uaXphdGlvbiB3aXRoCisgICBfX2ttcGNfdGhyZWFkcHJpdmF0ZV9jYWNoZWQgaXMgZG9uZSB1c2luZyBfX2ttcF90cF9jYWNoZWRfbG9jay4KKworICAgQWZ0ZXIgYW55IGRlYWQgcm9vdCByZWNsYW1hdGlvbiwgaWYgdGhlIGNsaXBwaW5nIHZhbHVlIGFsbG93cyBhcnJheSBleHBhbnNpb24KKyAgIHRvIHJlc3VsdCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiBhIHRvdGFsIG9mIG5XaXNoIGZyZWUgc2xvdHMsIHRoZSBmdW5jdGlvbiBkb2VzCisgICB0aGF0IGV4cGFuc2lvbi4gSWYgbm90LCBidXQgdGhlIGNsaXBwaW5nIHZhbHVlIGFsbG93cyBhcnJheSBleHBhbnNpb24gdG8KKyAgIHJlc3VsdCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiBhIHRvdGFsIG9mIG5OZWVkIGZyZWUgc2xvdHMsIHRoZSBmdW5jdGlvbiBkb2VzCisgICB0aGF0IGV4cGFuc2lvbi4gT3RoZXJ3aXNlLCBub3RoaW5nIGlzIGRvbmUgYmV5b25kIHRoZSBwb3NzaWJsZSBpbml0aWFsIHJvb3QKKyAgIHRocmVhZCByZWNsYW1hdGlvbi4gSG93ZXZlciwgaWYgbk5lZWQgaXMgemVybywgYSBiZXN0LWVmZm9ydCBhdHRlbXB0IGlzIG1hZGUKKyAgIHRvIGZ1bGZpbCBuV2lzaCBhcyBmYXIgYXMgcG9zc2libGUsIGkuZS4gdGhlIGZ1bmN0aW9uIHdpbGwgYXR0ZW1wdCB0byBjcmVhdGUKKyAgIGFzIG1hbnkgZnJlZSBzbG90cyBhcyBwb3NzaWJsZSB1cCB0byBuV2lzaC4KKworICAgSWYgYW55IGFyZ3VtZW50IGlzIG5lZ2F0aXZlLCB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkLiAqLworc3RhdGljIGludCBfX2ttcF9leHBhbmRfdGhyZWFkcyhpbnQgbldpc2gsIGludCBuTmVlZCkgeworICBpbnQgYWRkZWQgPSAwOworICBpbnQgb2xkX3RwX2NhY2hlZDsKKyAgaW50IF9fa21wX2FjdHVhbF9tYXhfbnRoOworCisgIGlmIChuTmVlZCA+IG5XaXNoKSAvKiBub3JtYWxpemUgdGhlIGFyZ3VtZW50cyAqLworICAgIG5XaXNoID0gbk5lZWQ7CisjaWYgS01QX09TX1dJTkRPV1MgJiYgIWRlZmluZWQgS01QX0RZTkFNSUNfTElCCisgIC8qIG9ubHkgZm9yIFdpbmRvd3Mgc3RhdGljIGxpYnJhcnkgKi8KKyAgLyogcmVjbGFpbSBhcnJheSBlbnRyaWVzIGZvciByb290IHRocmVhZHMgdGhhdCBhcmUgYWxyZWFkeSBkZWFkICovCisgIGFkZGVkID0gX19rbXBfcmVjbGFpbV9kZWFkX3Jvb3RzKCk7CisKKyAgaWYgKG5OZWVkKSB7CisgICAgbk5lZWQgLT0gYWRkZWQ7CisgICAgaWYgKG5OZWVkIDwgMCkKKyAgICAgIG5OZWVkID0gMDsKKyAgfQorICBpZiAobldpc2gpIHsKKyAgICBuV2lzaCAtPSBhZGRlZDsKKyAgICBpZiAobldpc2ggPCAwKQorICAgICAgbldpc2ggPSAwOworICB9CisjZW5kaWYKKyAgaWYgKG5XaXNoIDw9IDApCisgICAgcmV0dXJuIGFkZGVkOworCisgIHdoaWxlICgxKSB7CisgICAgaW50IG5UYXJnZXQ7CisgICAgaW50IG1pbmltdW1SZXF1aXJlZENhcGFjaXR5OworICAgIGludCBuZXdDYXBhY2l0eTsKKyAgICBrbXBfaW5mb190ICoqbmV3VGhyZWFkczsKKyAgICBrbXBfcm9vdF90ICoqbmV3Um9vdDsKKworICAgIC8vIE5vdGUgdGhhdCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IGlzIG5vdCBib3VuZGVkIGJ5IF9fa21wX21heF9udGguIElmCisgICAgLy8gX19rbXBfbWF4X250aCBpcyBzZXQgdG8gc29tZSB2YWx1ZSBsZXNzIHRoYW4gX19rbXBfc3lzX21heF9udGggYnkgdGhlCisgICAgLy8gdXNlciB2aWEgT01QX1RIUkVBRF9MSU1JVCwgdGhlbiBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IG1heSBiZWNvbWUKKyAgICAvLyA+IF9fa21wX21heF9udGggaW4gb25lIG9mIHR3byB3YXlzOgorICAgIC8vCisgICAgLy8gMSkgVGhlIGluaXRpYWxpemF0aW9uIHRocmVhZCAoZ3RpZCA9IDApIGV4aXRzLiAgX19rbXBfdGhyZWFkc1swXQorICAgIC8vICAgIG1heSBub3QgYmUgcmVzdXNlZCBieSBhbm90aGVyIHRocmVhZCwgc28gd2UgbWF5IG5lZWQgdG8gaW5jcmVhc2UKKyAgICAvLyAgICBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IHRvIF9fa21wX21heF90aHJlYWRzICsgMS4KKyAgICAvLworICAgIC8vIDIpIE5ldyBmb3JlaWduIHJvb3QocykgYXJlIGVuY291bnRlcmVkLiAgV2UgYWx3YXlzIHJlZ2lzdGVyIG5ldyBmb3JlaWduCisgICAgLy8gICAgcm9vdHMuIFRoaXMgbWF5IGNhdXNlIGEgc21hbGxlciAjIG9mIHRocmVhZHMgdG8gYmUgYWxsb2NhdGVkIGF0CisgICAgLy8gICAgc3Vic2VxdWVudCBwYXJhbGxlbCByZWdpb25zLCBidXQgdGhlIHdvcmtlciB0aHJlYWRzIGhhbmcgYXJvdW5kIChhbmQKKyAgICAvLyAgICBldmVudHVhbGx5IGdvIHRvIHNsZWVwKSBhbmQgbmVlZCBzbG90cyBpbiB0aGUgX19rbXBfdGhyZWFkc1tdIGFycmF5LgorICAgIC8vCisgICAgLy8gQW55d2F5LCB0aGF0IGlzIHRoZSByZWFzb24gZm9yIG1vdmluZyB0aGUgY2hlY2sgdG8gc2VlIGlmCisgICAgLy8gX19rbXBfbWF4X3RocmVhZHMgd2FzIGV4Y2VlZGVkIGludG8gX19rbXBfcmVzZWVydmVfdGhyZWFkcygpCisgICAgLy8gaW5zdGVhZCBvZiBoYXZpbmcgaXQgcGVyZm9ybWVkIGhlcmUuIC1CQgorICAgIG9sZF90cF9jYWNoZWQgPSBfX2ttcF90cF9jYWNoZWQ7CisgICAgX19rbXBfYWN0dWFsX21heF9udGggPQorICAgICAgICBvbGRfdHBfY2FjaGVkID8gX19rbXBfdHBfY2FwYWNpdHkgOiBfX2ttcF9zeXNfbWF4X250aDsKKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2FjdHVhbF9tYXhfbnRoID49IF9fa21wX3RocmVhZHNfY2FwYWNpdHkpOworCisgICAgLyogY29tcHV0ZSBleHBhbnNpb24gaGVhZHJvb20gdG8gY2hlY2sgaWYgd2UgY2FuIGV4cGFuZCBhbmQgd2hldGhlciB0byBhaW0KKyAgICAgICBmb3Igbldpc2ggb3Igbk5lZWQgKi8KKyAgICBuVGFyZ2V0ID0gbldpc2g7CisgICAgaWYgKF9fa21wX2FjdHVhbF9tYXhfbnRoIC0gX19rbXBfdGhyZWFkc19jYXBhY2l0eSA8IG5UYXJnZXQpIHsKKyAgICAgIC8qIGNhbid0IGZ1bGZpbCBuV2lzaCwgc28gdHJ5IG5OZWVkICovCisgICAgICBpZiAobk5lZWQpIHsKKyAgICAgICAgblRhcmdldCA9IG5OZWVkOworICAgICAgICBpZiAoX19rbXBfYWN0dWFsX21heF9udGggLSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IDwgblRhcmdldCkgeworICAgICAgICAgIC8qIHBvc3NpYmxlIGV4cGFuc2lvbiB0b28gc21hbGwgLS0gZ2l2ZSB1cCAqLworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBiZXN0LWVmZm9ydCAqLworICAgICAgICBuVGFyZ2V0ID0gX19rbXBfYWN0dWFsX21heF9udGggLSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OworICAgICAgICBpZiAoIW5UYXJnZXQpIHsKKyAgICAgICAgICAvKiBjYW4gZXhwYW5kIGF0IGFsbCAtLSBnaXZlIHVwICovCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgbWluaW11bVJlcXVpcmVkQ2FwYWNpdHkgPSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ICsgblRhcmdldDsKKworICAgIG5ld0NhcGFjaXR5ID0gX19rbXBfdGhyZWFkc19jYXBhY2l0eTsKKyAgICBkbyB7CisgICAgICBuZXdDYXBhY2l0eSA9IG5ld0NhcGFjaXR5IDw9IChfX2ttcF9hY3R1YWxfbWF4X250aCA+PiAxKQorICAgICAgICAgICAgICAgICAgICAgICAgPyAobmV3Q2FwYWNpdHkgPDwgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogX19rbXBfYWN0dWFsX21heF9udGg7CisgICAgfSB3aGlsZSAobmV3Q2FwYWNpdHkgPCBtaW5pbXVtUmVxdWlyZWRDYXBhY2l0eSk7CisgICAgbmV3VGhyZWFkcyA9IChrbXBfaW5mb190ICoqKV9fa21wX2FsbG9jYXRlKAorICAgICAgICAoc2l6ZW9mKGttcF9pbmZvX3QgKikgKyBzaXplb2Yoa21wX3Jvb3RfdCAqKSkgKiBuZXdDYXBhY2l0eSArCisgICAgICAgIENBQ0hFX0xJTkUpOworICAgIG5ld1Jvb3QgPSAoa21wX3Jvb3RfdCAqKikoKGNoYXIgKiluZXdUaHJlYWRzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfaW5mb190ICopICogbmV3Q2FwYWNpdHkpOworICAgIEtNUF9NRU1DUFkobmV3VGhyZWFkcywgX19rbXBfdGhyZWFkcywKKyAgICAgICAgICAgICAgIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgKiBzaXplb2Yoa21wX2luZm9fdCAqKSk7CisgICAgS01QX01FTUNQWShuZXdSb290LCBfX2ttcF9yb290LAorICAgICAgICAgICAgICAgX19rbXBfdGhyZWFkc19jYXBhY2l0eSAqIHNpemVvZihrbXBfcm9vdF90ICopKTsKKyAgICBtZW1zZXQobmV3VGhyZWFkcyArIF9fa21wX3RocmVhZHNfY2FwYWNpdHksIDAsCisgICAgICAgICAgIChuZXdDYXBhY2l0eSAtIF9fa21wX3RocmVhZHNfY2FwYWNpdHkpICogc2l6ZW9mKGttcF9pbmZvX3QgKikpOworICAgIG1lbXNldChuZXdSb290ICsgX19rbXBfdGhyZWFkc19jYXBhY2l0eSwgMCwKKyAgICAgICAgICAgKG5ld0NhcGFjaXR5IC0gX19rbXBfdGhyZWFkc19jYXBhY2l0eSkgKiBzaXplb2Yoa21wX3Jvb3RfdCAqKSk7CisKKyAgICBpZiAoIW9sZF90cF9jYWNoZWQgJiYgX19rbXBfdHBfY2FjaGVkICYmIG5ld0NhcGFjaXR5ID4gX19rbXBfdHBfY2FwYWNpdHkpIHsKKyAgICAgIC8qIF9fa21wX3RwX2NhY2hlZCBoYXMgY2hhbmdlZCwgaS5lLiBfX2ttcGNfdGhyZWFkcHJpdmF0ZV9jYWNoZWQgaGFzCisgICAgICAgICBhbGxvY2F0ZWQgYSB0aHJlYWRwcml2YXRlIGNhY2hlIHdoaWxlIHdlIHdlcmUgYWxsb2NhdGluZyB0aGUgZXhwYW5kZWQKKyAgICAgICAgIGFycmF5LCBhbmQgb3VyIG5ldyBjYXBhY2l0eSBpcyBsYXJnZXIgdGhhbiB0aGUgdGhyZWFkcHJpdmF0ZSBjYWNoZQorICAgICAgICAgY2FwYWNpdHksIHNvIHdlIHNob3VsZCBkZWFsbG9jYXRlIHRoZSBleHBhbmRlZCBhcnJheXMgYW5kIHRyeSBhZ2Fpbi4KKyAgICAgICAgIFRoaXMgaXMgdGhlIGZpcnN0IGNoZWNrIG9mIGEgZG91YmxlLWNoZWNrIHBhaXIuICovCisgICAgICBfX2ttcF9mcmVlKG5ld1RocmVhZHMpOworICAgICAgY29udGludWU7IC8qIHN0YXJ0IG92ZXIgYW5kIHRyeSBhZ2FpbiAqLworICAgIH0KKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF90cF9jYWNoZWRfbG9jayk7CisgICAgaWYgKCFvbGRfdHBfY2FjaGVkICYmIF9fa21wX3RwX2NhY2hlZCAmJiBuZXdDYXBhY2l0eSA+IF9fa21wX3RwX2NhcGFjaXR5KSB7CisgICAgICAvKiBTYW1lIGNoZWNrIGFzIGFib3ZlLCBidXQgdGhpcyB0aW1lIHdpdGggdGhlIGxvY2sgc28gd2UgY2FuIGJlIHN1cmUgaWYKKyAgICAgICAgIHdlIGNhbiBzdWNjZWVkLiAqLworICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jaygmX19rbXBfdHBfY2FjaGVkX2xvY2spOworICAgICAgX19rbXBfZnJlZShuZXdUaHJlYWRzKTsKKyAgICAgIGNvbnRpbnVlOyAvKiBzdGFydCBvdmVyIGFuZCB0cnkgYWdhaW4gKi8KKyAgICB9IGVsc2UgeworICAgICAgLyogc3VjY2VzcyAqLworICAgICAgLy8gX19rbXBfZnJlZSggX19rbXBfdGhyZWFkcyApOyAvLyBBVFQ6IEl0IGxlYWRzIHRvIGNyYXNoLiBOZWVkIHRvIGJlCisgICAgICAvLyBpbnZlc3RpZ2F0ZWQuCisgICAgICAqKGttcF9pbmZvX3QgKiAqdm9sYXRpbGUgKikmX19rbXBfdGhyZWFkcyA9IG5ld1RocmVhZHM7CisgICAgICAqKGttcF9yb290X3QgKiAqdm9sYXRpbGUgKikmX19rbXBfcm9vdCA9IG5ld1Jvb3Q7CisgICAgICBhZGRlZCArPSBuZXdDYXBhY2l0eSAtIF9fa21wX3RocmVhZHNfY2FwYWNpdHk7CisgICAgICAqKHZvbGF0aWxlIGludCAqKSZfX2ttcF90aHJlYWRzX2NhcGFjaXR5ID0gbmV3Q2FwYWNpdHk7CisgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF90cF9jYWNoZWRfbG9jayk7CisgICAgICBicmVhazsgLyogc3VjY2VlZGVkLCBzbyB3ZSBjYW4gZXhpdCB0aGUgbG9vcCAqLworICAgIH0KKyAgfQorICByZXR1cm4gYWRkZWQ7Cit9CisKKy8qIFJlZ2lzdGVyIHRoZSBjdXJyZW50IHRocmVhZCBhcyBhIHJvb3QgdGhyZWFkIGFuZCBvYnRhaW4gb3VyIGd0aWQuIFdlIG11c3QKKyAgIGhhdmUgdGhlIF9fa21wX2luaXR6X2xvY2sgaGVsZCBhdCB0aGlzIHBvaW50LiBBcmd1bWVudCBUUlVFIG9ubHkgaWYgYXJlIHRoZQorICAgdGhyZWFkIHRoYXQgY2FsbHMgZnJvbSBfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZSgpICovCitpbnQgX19rbXBfcmVnaXN0ZXJfcm9vdChpbnQgaW5pdGlhbF90aHJlYWQpIHsKKyAga21wX2luZm9fdCAqcm9vdF90aHJlYWQ7CisgIGttcF9yb290X3QgKnJvb3Q7CisgIGludCBndGlkOworICBpbnQgY2FwYWNpdHk7CisgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soJl9fa21wX2Zvcmtqb2luX2xvY2spOworICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9yZWdpc3Rlcl9yb290OiBlbnRlcmVkXG4iKSk7CisgIEtNUF9NQigpOworCisgIC8qIDIwMDctMDMtMDI6CisgICAgIElmIGluaXRpYWwgdGhyZWFkIGRpZCBub3QgaW52b2tlIE9wZW5NUCBSVEwgeWV0LCBhbmQgdGhpcyB0aHJlYWQgaXMgbm90IGFuCisgICAgIGluaXRpYWwgb25lLCAiX19rbXBfYWxsX250aCA+PSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IiBjb25kaXRpb24gZG9lcyBub3QKKyAgICAgd29yayBhcyBleHBlY3RlZCAtLSBpdCBtYXkgcmV0dXJuIGZhbHNlICh0aGF0IG1lYW5zIHRoZXJlIGlzIGF0IGxlYXN0IG9uZQorICAgICBlbXB0eSBzbG90IGluIF9fa21wX3RocmVhZHMgYXJyYXkpLCBidXQgaXQgaXMgcG9zc2libGUgdGhlIG9ubHkgZnJlZSBzbG90CisgICAgIGlzICMwLCB3aGljaCBpcyByZXNlcnZlZCBmb3IgaW5pdGlhbCB0aHJlYWQgYW5kIHNvIGNhbm5vdCBiZSB1c2VkIGZvciB0aGlzCisgICAgIG9uZS4gRm9sbG93aW5nIGNvZGUgd29ya2Fyb3VuZHMgdGhpcyBidWcuCisKKyAgICAgSG93ZXZlciwgcmlnaHQgc29sdXRpb24gc2VlbXMgdG8gYmUgbm90IHJlc2VydmluZyBzbG90ICMwIGZvciBpbml0aWFsCisgICAgIHRocmVhZCBiZWNhdXNlOgorICAgICAoMSkgdGhlcmUgaXMgbm8gbWFnaWMgaW4gc2xvdCAjMCwKKyAgICAgKDIpIHdlIGNhbm5vdCBkZXRlY3QgaW5pdGlhbCB0aHJlYWQgcmVsaWFibHkgKHRoZSBmaXJzdCB0aHJlYWQgd2hpY2ggZG9lcworICAgICAgICBzZXJpYWwgaW5pdGlhbGl6YXRpb24gbWF5IGJlIG5vdCBhIHJlYWwgaW5pdGlhbCB0aHJlYWQpLgorICAqLworICBjYXBhY2l0eSA9IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7CisgIGlmICghaW5pdGlhbF90aHJlYWQgJiYgVENSX1BUUihfX2ttcF90aHJlYWRzWzBdKSA9PSBOVUxMKSB7CisgICAgLS1jYXBhY2l0eTsKKyAgfTsgLy8gaWYKKworICAvKiBzZWUgaWYgdGhlcmUgYXJlIHRvbyBtYW55IHRocmVhZHMgKi8KKyAgaWYgKF9fa21wX2FsbF9udGggPj0gY2FwYWNpdHkgJiYgIV9fa21wX2V4cGFuZF90aHJlYWRzKDEsIDEpKSB7CisgICAgaWYgKF9fa21wX3RwX2NhY2hlZCkgeworICAgICAgX19rbXBfbXNnKGttcF9tc19mYXRhbCwgS01QX01TRyhDYW50UmVnaXN0ZXJOZXdUaHJlYWQpLAorICAgICAgICAgICAgICAgIEtNUF9ITlQoU2V0X0FMTF9USFJFQURQUklWQVRFLCBfX2ttcF90cF9jYXBhY2l0eSksCisgICAgICAgICAgICAgICAgS01QX0hOVChQb3NzaWJsZVN5c3RlbUxpbWl0T25UaHJlYWRzKSwgX19rbXBfbXNnX251bGwpOworICAgIH0gZWxzZSB7CisgICAgICBfX2ttcF9tc2coa21wX21zX2ZhdGFsLCBLTVBfTVNHKENhbnRSZWdpc3Rlck5ld1RocmVhZCksCisgICAgICAgICAgICAgICAgS01QX0hOVChTeXN0ZW1MaW1pdE9uVGhyZWFkcyksIF9fa21wX21zZ19udWxsKTsKKyAgICB9CisgIH07IC8vIGlmCisKKyAgLyogZmluZCBhbiBhdmFpbGFibGUgdGhyZWFkIHNsb3QgKi8KKyAgLyogRG9uJ3QgcmVhc3NpZ24gdGhlIHplcm8gc2xvdCBzaW5jZSB3ZSBuZWVkIHRoYXQgdG8gb25seSBiZSB1c2VkIGJ5IGluaXRpYWwKKyAgICAgdGhyZWFkICovCisgIGZvciAoZ3RpZCA9IChpbml0aWFsX3RocmVhZCA/IDAgOiAxKTsgVENSX1BUUihfX2ttcF90aHJlYWRzW2d0aWRdKSAhPSBOVUxMOworICAgICAgIGd0aWQrKykKKyAgICA7CisgIEtBX1RSQUNFKDEsCisgICAgICAgICAgICgiX19rbXBfcmVnaXN0ZXJfcm9vdDogZm91bmQgc2xvdCBpbiB0aHJlYWRzIGFycmF5OiBUIyVkXG4iLCBndGlkKSk7CisgIEtNUF9BU1NFUlQoZ3RpZCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHkpOworCisgIC8qIHVwZGF0ZSBnbG9iYWwgYWNjb3VudGluZyAqLworICBfX2ttcF9hbGxfbnRoKys7CisgIFRDV180KF9fa21wX250aCwgX19rbXBfbnRoICsgMSk7CisKKyAgLy8gaWYgX19rbXBfYWRqdXN0X2d0aWRfbW9kZSBpcyBzZXQsIHRoZW4gd2UgdXNlIG1ldGhvZCAjMSAoc3Agc2VhcmNoKSBmb3IgbG93CisgIC8vIG51bWJlcnMgb2YgcHJvY3MsIGFuZCBtZXRob2QgIzIgKGtleWVkIEFQSSBjYWxsKSBmb3IgaGlnaGVyIG51bWJlcnMuCisgIGlmIChfX2ttcF9hZGp1c3RfZ3RpZF9tb2RlKSB7CisgICAgaWYgKF9fa21wX2FsbF9udGggPj0gX19rbXBfdGxzX2d0aWRfbWluKSB7CisgICAgICBpZiAoVENSXzQoX19rbXBfZ3RpZF9tb2RlKSAhPSAyKSB7CisgICAgICAgIFRDV180KF9fa21wX2d0aWRfbW9kZSwgMik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChUQ1JfNChfX2ttcF9ndGlkX21vZGUpICE9IDEpIHsKKyAgICAgICAgVENXXzQoX19rbXBfZ3RpZF9tb2RlLCAxKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworI2lmZGVmIEtNUF9BREpVU1RfQkxPQ0tUSU1FCisgIC8qIEFkanVzdCBibG9ja3RpbWUgdG8gemVybyBpZiBuZWNlc3NhcnkgICAgICAgICAgICAqLworICAvKiBNaWRkbGUgaW5pdGlhbGl6YXRpb24gbWlnaHQgbm90IGhhdmUgb2NjdXJyZWQgeWV0ICovCisgIGlmICghX19rbXBfZW52X2Jsb2NrdGltZSAmJiAoX19rbXBfYXZhaWxfcHJvYyA+IDApKSB7CisgICAgaWYgKF9fa21wX250aCA+IF9fa21wX2F2YWlsX3Byb2MpIHsKKyAgICAgIF9fa21wX3plcm9fYnQgPSBUUlVFOworICAgIH0KKyAgfQorI2VuZGlmIC8qIEtNUF9BREpVU1RfQkxPQ0tUSU1FICovCisKKyAgLyogc2V0dXAgdGhpcyBuZXcgaGllcmFyY2h5ICovCisgIGlmICghKHJvb3QgPSBfX2ttcF9yb290W2d0aWRdKSkgeworICAgIHJvb3QgPSBfX2ttcF9yb290W2d0aWRdID0gKGttcF9yb290X3QgKilfX2ttcF9hbGxvY2F0ZShzaXplb2Yoa21wX3Jvb3RfdCkpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIXJvb3QtPnIucl9yb290X3RlYW0pOworICB9CisKKyNpZiBLTVBfU1RBVFNfRU5BQkxFRAorICAvLyBJbml0aWFsaXplIHN0YXRzIGFzIHNvb24gYXMgcG9zc2libGUgKHJpZ2h0IGFmdGVyIGd0aWQgYXNzaWdubWVudCkuCisgIF9fa21wX3N0YXRzX3RocmVhZF9wdHIgPSBfX2ttcF9zdGF0c19saXN0LT5wdXNoX2JhY2soZ3RpZCk7CisgIEtNUF9TVEFSVF9FWFBMSUNJVF9USU1FUihPTVBfd29ya2VyX3RocmVhZF9saWZlKTsKKyAgS01QX1NFVF9USFJFQURfU1RBVEUoU0VSSUFMX1JFR0lPTik7CisgIEtNUF9JTklUX1BBUlRJVElPTkVEX1RJTUVSUyhPTVBfc2VyaWFsKTsKKyNlbmRpZgorICBfX2ttcF9pbml0aWFsaXplX3Jvb3Qocm9vdCk7CisKKyAgLyogc2V0dXAgbmV3IHJvb3QgdGhyZWFkIHN0cnVjdHVyZSAqLworICBpZiAocm9vdC0+ci5yX3ViZXJfdGhyZWFkKSB7CisgICAgcm9vdF90aHJlYWQgPSByb290LT5yLnJfdWJlcl90aHJlYWQ7CisgIH0gZWxzZSB7CisgICAgcm9vdF90aHJlYWQgPSAoa21wX2luZm9fdCAqKV9fa21wX2FsbG9jYXRlKHNpemVvZihrbXBfaW5mb190KSk7CisgICAgaWYgKF9fa21wX3N0b3JhZ2VfbWFwKSB7CisgICAgICBfX2ttcF9wcmludF90aHJlYWRfc3RvcmFnZV9tYXAocm9vdF90aHJlYWQsIGd0aWQpOworICAgIH0KKyAgICByb290X3RocmVhZC0+dGgudGhfaW5mby5kcy5kc19ndGlkID0gZ3RpZDsKKyAgICByb290X3RocmVhZC0+dGgudGhfcm9vdCA9IHJvb3Q7CisgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgcm9vdF90aHJlYWQtPnRoLnRoX2NvbnMgPSBfX2ttcF9hbGxvY2F0ZV9jb25zX3N0YWNrKGd0aWQpOworICAgIH0KKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICBfX2ttcF9pbml0aWFsaXplX2Zhc3RfbWVtb3J5KHJvb3RfdGhyZWFkKTsKKyNlbmRpZiAvKiBVU0VfRkFTVF9NRU1PUlkgKi8KKworI2lmIEtNUF9VU0VfQkdFVAorICAgIEtNUF9ERUJVR19BU1NFUlQocm9vdF90aHJlYWQtPnRoLnRoX2xvY2FsLmJnZXRfZGF0YSA9PSBOVUxMKTsKKyAgICBfX2ttcF9pbml0aWFsaXplX2JnZXQocm9vdF90aHJlYWQpOworI2VuZGlmCisgICAgX19rbXBfaW5pdF9yYW5kb20ocm9vdF90aHJlYWQpOyAvLyBJbml0aWFsaXplIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgIH0KKworICAvKiBzZXR1cCB0aGUgc2VyaWFsIHRlYW0gaGVsZCBpbiByZXNlcnZlIGJ5IHRoZSByb290IHRocmVhZCAqLworICBpZiAoIXJvb3RfdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbSkgeworICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3Qgcl9pY3ZzID0gX19rbXBfZ2V0X2dsb2JhbF9pY3ZzKCk7CisgICAgS0ZfVFJBQ0UoMTAsICgiX19rbXBfcmVnaXN0ZXJfcm9vdDogYmVmb3JlIHNlcmlhbF90ZWFtXG4iKSk7CisgICAgcm9vdF90aHJlYWQtPnRoLnRoX3NlcmlhbF90ZWFtID0KKyAgICAgICAgX19rbXBfYWxsb2NhdGVfdGVhbShyb290LCAxLCAxLAorI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8vIHJvb3QgcGFyYWxsZWwgaWQKKyNlbmRpZgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY19iaW5kX2RlZmF1bHQsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcl9pY3ZzLCAwIFVTRV9ORVNURURfSE9UX0FSRyhOVUxMKSk7CisgIH0KKyAgS01QX0FTU0VSVChyb290X3RocmVhZC0+dGgudGhfc2VyaWFsX3RlYW0pOworICBLRl9UUkFDRSgxMCwgKCJfX2ttcF9yZWdpc3Rlcl9yb290OiBhZnRlciBzZXJpYWxfdGVhbSA9ICVwXG4iLAorICAgICAgICAgICAgICAgIHJvb3RfdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbSkpOworCisgIC8qIGRyb3Agcm9vdF90aHJlYWQgaW50byBwbGFjZSAqLworICBUQ1dfU1lOQ19QVFIoX19rbXBfdGhyZWFkc1tndGlkXSwgcm9vdF90aHJlYWQpOworCisgIHJvb3QtPnIucl9yb290X3RlYW0tPnQudF90aHJlYWRzWzBdID0gcm9vdF90aHJlYWQ7CisgIHJvb3QtPnIucl9ob3RfdGVhbS0+dC50X3RocmVhZHNbMF0gPSByb290X3RocmVhZDsKKyAgcm9vdF90aHJlYWQtPnRoLnRoX3NlcmlhbF90ZWFtLT50LnRfdGhyZWFkc1swXSA9IHJvb3RfdGhyZWFkOworICAvLyBBQzogdGhlIHRlYW0gY3JlYXRlZCBpbiByZXNlcnZlLCBub3QgZm9yIGV4ZWN1dGlvbiAoaXQgaXMgdW51c2VkIGZvciBub3cpLgorICByb290X3RocmVhZC0+dGgudGhfc2VyaWFsX3RlYW0tPnQudF9zZXJpYWxpemVkID0gMDsKKyAgcm9vdC0+ci5yX3ViZXJfdGhyZWFkID0gcm9vdF90aHJlYWQ7CisKKyAgLyogaW5pdGlhbGl6ZSB0aGUgdGhyZWFkLCBnZXQgaXQgcmVhZHkgdG8gZ28gKi8KKyAgX19rbXBfaW5pdGlhbGl6ZV9pbmZvKHJvb3RfdGhyZWFkLCByb290LT5yLnJfcm9vdF90ZWFtLCAwLCBndGlkKTsKKyAgVENXXzQoX19rbXBfaW5pdF9ndGlkLCBUUlVFKTsKKworICAvKiBwcmVwYXJlIHRoZSBtYXN0ZXIgdGhyZWFkIGZvciBnZXRfZ3RpZCgpICovCisgIF9fa21wX2d0aWRfc2V0X3NwZWNpZmljKGd0aWQpOworCisjaWYgVVNFX0lUVF9CVUlMRAorICBfX2ttcF9pdHRfdGhyZWFkX25hbWUoZ3RpZCk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgX19rbXBfZ3RpZCA9IGd0aWQ7CisjZW5kaWYKKyAgX19rbXBfY3JlYXRlX3dvcmtlcihndGlkLCByb290X3RocmVhZCwgX19rbXBfc3Rrc2l6ZSk7CisgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKSA9PSBndGlkKTsKKworICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9yZWdpc3Rlcl9yb290OiBUIyVkIGluaXQgVCMlZCglZDolZCkgYXJyaXZlZDogam9pbj0ldSwgIgorICAgICAgICAgICAgICAgICJwbGFpbj0ldVxuIiwKKyAgICAgICAgICAgICAgICBndGlkLCBfX2ttcF9ndGlkX2Zyb21fdGlkKDAsIHJvb3QtPnIucl9ob3RfdGVhbSksCisgICAgICAgICAgICAgICAgcm9vdC0+ci5yX2hvdF90ZWFtLT50LnRfaWQsIDAsIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUsCisgICAgICAgICAgICAgICAgS01QX0lOSVRfQkFSUklFUl9TVEFURSkpOworICB7IC8vIEluaXRpYWxpemUgYmFycmllciBkYXRhLgorICAgIGludCBiOworICAgIGZvciAoYiA9IDA7IGIgPCBic19sYXN0X2JhcnJpZXI7ICsrYikgeworICAgICAgcm9vdF90aHJlYWQtPnRoLnRoX2JhcltiXS5iYi5iX2Fycml2ZWQgPSBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFOworI2lmIFVTRV9ERUJVR0dFUgorICAgICAgcm9vdF90aHJlYWQtPnRoLnRoX2JhcltiXS5iYi5iX3dvcmtlcl9hcnJpdmVkID0gMDsKKyNlbmRpZgorICAgIH07IC8vIGZvcgorICB9CisgIEtNUF9ERUJVR19BU1NFUlQocm9vdC0+ci5yX2hvdF90ZWFtLT50LnRfYmFyW2JzX2Zvcmtqb2luX2JhcnJpZXJdLmJfYXJyaXZlZCA9PQorICAgICAgICAgICAgICAgICAgIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUpOworCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorI2lmIE9NUF80MF9FTkFCTEVECisgIHJvb3RfdGhyZWFkLT50aC50aF9jdXJyZW50X3BsYWNlID0gS01QX1BMQUNFX1VOREVGSU5FRDsKKyAgcm9vdF90aHJlYWQtPnRoLnRoX25ld19wbGFjZSA9IEtNUF9QTEFDRV9VTkRFRklORUQ7CisgIHJvb3RfdGhyZWFkLT50aC50aF9maXJzdF9wbGFjZSA9IEtNUF9QTEFDRV9VTkRFRklORUQ7CisgIHJvb3RfdGhyZWFkLT50aC50aF9sYXN0X3BsYWNlID0gS01QX1BMQUNFX1VOREVGSU5FRDsKKyNlbmRpZgorCisgIGlmIChUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkpIHsKKyAgICBfX2ttcF9hZmZpbml0eV9zZXRfaW5pdF9tYXNrKGd0aWQsIFRSVUUpOworICB9CisjZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworCisgIF9fa21wX3Jvb3RfY291bnRlcisrOworCisgIEtNUF9NQigpOworICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF9mb3Jram9pbl9sb2NrKTsKKworICByZXR1cm4gZ3RpZDsKK30KKworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCitzdGF0aWMgaW50IF9fa21wX2ZyZWVfaG90X3RlYW1zKGttcF9yb290X3QgKnJvb3QsIGttcF9pbmZvX3QgKnRociwgaW50IGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbWF4X2xldmVsKSB7CisgIGludCBpLCBuLCBudGg7CisgIGttcF9ob3RfdGVhbV9wdHJfdCAqaG90X3RlYW1zID0gdGhyLT50aC50aF9ob3RfdGVhbXM7CisgIGlmICghaG90X3RlYW1zIHx8ICFob3RfdGVhbXNbbGV2ZWxdLmhvdF90ZWFtKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgS01QX0RFQlVHX0FTU0VSVChsZXZlbCA8IG1heF9sZXZlbCk7CisgIGttcF90ZWFtX3QgKnRlYW0gPSBob3RfdGVhbXNbbGV2ZWxdLmhvdF90ZWFtOworICBudGggPSBob3RfdGVhbXNbbGV2ZWxdLmhvdF90ZWFtX250aDsKKyAgbiA9IG50aCAtIDE7IC8vIG1hc3RlciBpcyBub3QgZnJlZWQKKyAgaWYgKGxldmVsIDwgbWF4X2xldmVsIC0gMSkgeworICAgIGZvciAoaSA9IDA7IGkgPCBudGg7ICsraSkgeworICAgICAga21wX2luZm9fdCAqdGggPSB0ZWFtLT50LnRfdGhyZWFkc1tpXTsKKyAgICAgIG4gKz0gX19rbXBfZnJlZV9ob3RfdGVhbXMocm9vdCwgdGgsIGxldmVsICsgMSwgbWF4X2xldmVsKTsKKyAgICAgIGlmIChpID4gMCAmJiB0aC0+dGgudGhfaG90X3RlYW1zKSB7CisgICAgICAgIF9fa21wX2ZyZWUodGgtPnRoLnRoX2hvdF90ZWFtcyk7CisgICAgICAgIHRoLT50aC50aF9ob3RfdGVhbXMgPSBOVUxMOworICAgICAgfQorICAgIH0KKyAgfQorICBfX2ttcF9mcmVlX3RlYW0ocm9vdCwgdGVhbSwgTlVMTCk7CisgIHJldHVybiBuOworfQorI2VuZGlmCisKKy8vIFJlc2V0cyBhIHJvb3QgdGhyZWFkIGFuZCBjbGVhciBpdHMgcm9vdCBhbmQgaG90IHRlYW1zLgorLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIF9fa21wX3RocmVhZHMgZW50cmllcyBkaXJlY3RseSBhbmQgaW5kaXJlY3RseSBmcmVlZC4KK3N0YXRpYyBpbnQgX19rbXBfcmVzZXRfcm9vdChpbnQgZ3RpZCwga21wX3Jvb3RfdCAqcm9vdCkgeworICBrbXBfdGVhbV90ICpyb290X3RlYW0gPSByb290LT5yLnJfcm9vdF90ZWFtOworICBrbXBfdGVhbV90ICpob3RfdGVhbSA9IHJvb3QtPnIucl9ob3RfdGVhbTsKKyAgaW50IG4gPSBob3RfdGVhbS0+dC50X25wcm9jOworICBpbnQgaTsKKworICBLTVBfREVCVUdfQVNTRVJUKCFyb290LT5yLnJfYWN0aXZlKTsKKworICByb290LT5yLnJfcm9vdF90ZWFtID0gTlVMTDsKKyAgcm9vdC0+ci5yX2hvdF90ZWFtID0gTlVMTDsKKyAgLy8gX19rbXBfZnJlZV90ZWFtKCkgZG9lcyBub3QgZnJlZSBob3QgdGVhbXMsIHNvIHdlIGhhdmUgdG8gY2xlYXIgcl9ob3RfdGVhbQorICAvLyBiZWZvcmUgY2FsbCB0byBfX2ttcF9mcmVlX3RlYW0oKS4KKyAgX19rbXBfZnJlZV90ZWFtKHJvb3QsIHJvb3RfdGVhbSBVU0VfTkVTVEVEX0hPVF9BUkcoTlVMTCkpOworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgIGlmIChfX2ttcF9ob3RfdGVhbXNfbWF4X2xldmVsID4KKyAgICAgIDApIHsgLy8gbmVlZCB0byBmcmVlIG5lc3RlZCBob3QgdGVhbXMgYW5kIHRoZWlyIHRocmVhZHMgaWYgYW55CisgICAgZm9yIChpID0gMDsgaSA8IGhvdF90ZWFtLT50LnRfbnByb2M7ICsraSkgeworICAgICAga21wX2luZm9fdCAqdGggPSBob3RfdGVhbS0+dC50X3RocmVhZHNbaV07CisgICAgICBpZiAoX19rbXBfaG90X3RlYW1zX21heF9sZXZlbCA+IDEpIHsKKyAgICAgICAgbiArPSBfX2ttcF9mcmVlX2hvdF90ZWFtcyhyb290LCB0aCwgMSwgX19rbXBfaG90X3RlYW1zX21heF9sZXZlbCk7CisgICAgICB9CisgICAgICBpZiAodGgtPnRoLnRoX2hvdF90ZWFtcykgeworICAgICAgICBfX2ttcF9mcmVlKHRoLT50aC50aF9ob3RfdGVhbXMpOworICAgICAgICB0aC0+dGgudGhfaG90X3RlYW1zID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbmRpZgorICBfX2ttcF9mcmVlX3RlYW0ocm9vdCwgaG90X3RlYW0gVVNFX05FU1RFRF9IT1RfQVJHKE5VTEwpKTsKKworICAvLyBCZWZvcmUgd2UgY2FuIHJlYXAgdGhlIHRocmVhZCwgd2UgbmVlZCB0byBtYWtlIGNlcnRhaW4gdGhhdCBhbGwgb3RoZXIKKyAgLy8gdGhyZWFkcyBpbiB0aGUgdGVhbXMgdGhhdCBoYWQgdGhpcyByb290IGFzIGFuY2VzdG9yIGhhdmUgc3RvcHBlZCB0cnlpbmcgdG8KKyAgLy8gc3RlYWwgdGFza3MuCisgIGlmIChfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYykgeworICAgIF9fa21wX3dhaXRfdG9fdW5yZWZfdGFza190ZWFtcygpOworICB9CisKKyNpZiBLTVBfT1NfV0lORE9XUworICAvKiBDbG9zZSBIYW5kbGUgb2Ygcm9vdCBkdXBsaWNhdGVkIGluIF9fa21wX2NyZWF0ZV93b3JrZXIgKHRyICM2MjkxOSkgKi8KKyAgS0FfVFJBQ0UoCisgICAgICAxMCwgKCJfX2ttcF9yZXNldF9yb290OiBmcmVlIGhhbmRsZSwgdGggPSAlcCwgaGFuZGxlID0gJSIgS01QX1VJTlRQVFJfU1BFQworICAgICAgICAgICAiXG4iLAorICAgICAgICAgICAoTFBWT0lEKSAmIChyb290LT5yLnJfdWJlcl90aHJlYWQtPnRoKSwKKyAgICAgICAgICAgcm9vdC0+ci5yX3ViZXJfdGhyZWFkLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCkpOworICBfX2ttcF9mcmVlX2hhbmRsZShyb290LT5yLnJfdWJlcl90aHJlYWQtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkKTsKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworCisjaWYgT01QVF9TVVBQT1JUCisgIGlmIChvbXB0X2VuYWJsZWQgJiYgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3RocmVhZF9lbmQpKSB7CisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIF9fb21wdF90aHJlYWRfZW5kKG9tcHRfdGhyZWFkX2luaXRpYWwsIGd0aWQpOworICB9CisjZW5kaWYKKworICBUQ1dfNChfX2ttcF9udGgsCisgICAgICAgIF9fa21wX250aCAtIDEpOyAvLyBfX2ttcF9yZWFwX3RocmVhZCB3aWxsIGRlY3JlbWVudCBfX2ttcF9hbGxfbnRoLgorICBfX2ttcF9yZWFwX3RocmVhZChyb290LT5yLnJfdWJlcl90aHJlYWQsIDEpOworCisgIC8vIFdlIGNhbm90IHB1dCByb290IHRocmVhZCB0byBfX2ttcF90aHJlYWRfcG9vbCwgc28gd2UgaGF2ZSB0byByZWFwIGl0IGlzdGVhZAorICAvLyBvZiBmcmVlaW5nLgorICByb290LT5yLnJfdWJlcl90aHJlYWQgPSBOVUxMOworICAvKiBtYXJrIHJvb3QgYXMgbm8gbG9uZ2VyIGluIHVzZSAqLworICByb290LT5yLnJfYmVnaW4gPSBGQUxTRTsKKworICByZXR1cm4gbjsKK30KKwordm9pZCBfX2ttcF91bnJlZ2lzdGVyX3Jvb3RfY3VycmVudF90aHJlYWQoaW50IGd0aWQpIHsKKyAgS0FfVFJBQ0UoMSwgKCJfX2ttcF91bnJlZ2lzdGVyX3Jvb3RfY3VycmVudF90aHJlYWQ6IGVudGVyIFQjJWRcbiIsIGd0aWQpKTsKKyAgLyogdGhpcyBsb2NrIHNob3VsZCBiZSBvaywgc2luY2UgdW5yZWdpc3Rlcl9yb290X2N1cnJlbnRfdGhyZWFkIGlzIG5ldmVyCisgICAgIGNhbGxlZCBkdXJpbmcgYW4gYWJvcnQsIG9ubHkgZHVyaW5nIGEgbm9ybWFsIGNsb3NlLiBmdXJ0aGVybW9yZSwgaWYgeW91CisgICAgIGhhdmUgdGhlIGZvcmtqb2luIGxvY2ssIHlvdSBzaG91bGQgbmV2ZXIgdHJ5IHRvIGdldCB0aGUgaW5pdHogbG9jayAqLworICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF9mb3Jram9pbl9sb2NrKTsKKyAgaWYgKFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgfHwgIV9fa21wX2luaXRfc2VyaWFsKSB7CisgICAgS0NfVFJBQ0UoMTAsICgiX19rbXBfdW5yZWdpc3Rlcl9yb290X2N1cnJlbnRfdGhyZWFkOiBhbHJlYWR5IGZpbmlzaGVkLCAiCisgICAgICAgICAgICAgICAgICAiZXhpdGluZyBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCkpOworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJl9fa21wX2Zvcmtqb2luX2xvY2spOworICAgIHJldHVybjsKKyAgfQorICBrbXBfcm9vdF90ICpyb290ID0gX19rbXBfcm9vdFtndGlkXTsKKworICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX3RocmVhZHMgJiYgX19rbXBfdGhyZWFkc1tndGlkXSk7CisgIEtNUF9BU1NFUlQoS01QX1VCRVJfR1RJRChndGlkKSk7CisgIEtNUF9BU1NFUlQocm9vdCA9PSBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF9yb290KTsKKyAgS01QX0FTU0VSVChyb290LT5yLnJfYWN0aXZlID09IEZBTFNFKTsKKworICBLTVBfTUIoKTsKKworI2lmIE9NUF80NV9FTkFCTEVECisgIGttcF9pbmZvX3QgKnRocmVhZCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgIGttcF90ZWFtX3QgKnRlYW0gPSB0aHJlYWQtPnRoLnRoX3RlYW07CisgIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtID0gdGhyZWFkLT50aC50aF90YXNrX3RlYW07CisKKyAgLy8gd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgcHJveHkgdGFza3MgYmVmb3JlIGZpbmlzaGluZyB0aGUgdGhyZWFkCisgIGlmICh0YXNrX3RlYW0gIT0gTlVMTCAmJiB0YXNrX3RlYW0tPnR0LnR0X2ZvdW5kX3Byb3h5X3Rhc2tzKSB7CisjaWYgT01QVF9TVVBQT1JUCisgICAgLy8gdGhlIHJ1bnRpbWUgaXMgc2h1dHRpbmcgZG93biBzbyB3ZSB3b24ndCByZXBvcnQgYW55IGV2ZW50cworICAgIHRocmVhZC0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfdW5kZWZpbmVkOworI2VuZGlmCisgICAgX19rbXBfdGFza190ZWFtX3dhaXQodGhyZWFkLCB0ZWFtIFVTRV9JVFRfQlVJTERfQVJHKE5VTEwpKTsKKyAgfQorI2VuZGlmCisKKyAgX19rbXBfcmVzZXRfcm9vdChndGlkLCByb290KTsKKworICAvKiBmcmVlIHVwIHRoaXMgdGhyZWFkIHNsb3QgKi8KKyAgX19rbXBfZ3RpZF9zZXRfc3BlY2lmaWMoS01QX0dUSURfRE5FKTsKKyNpZmRlZiBLTVBfVERBVEFfR1RJRAorICBfX2ttcF9ndGlkID0gS01QX0dUSURfRE5FOworI2VuZGlmCisKKyAgS01QX01CKCk7CisgIEtDX1RSQUNFKDEwLAorICAgICAgICAgICAoIl9fa21wX3VucmVnaXN0ZXJfcm9vdF9jdXJyZW50X3RocmVhZDogVCMlZCB1bnJlZ2lzdGVyZWRcbiIsIGd0aWQpKTsKKworICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF9mb3Jram9pbl9sb2NrKTsKK30KKworI2lmIEtNUF9PU19XSU5ET1dTCisvKiBfX2ttcF9mb3Jram9pbl9sb2NrIG11c3QgYmUgYWxyZWFkeSBoZWxkCisgICBVbnJlZ2lzdGVycyBhIHJvb3QgdGhyZWFkIHRoYXQgaXMgbm90IHRoZSBjdXJyZW50IHRocmVhZC4gIFJldHVybnMgdGhlIG51bWJlcgorICAgb2YgX19rbXBfdGhyZWFkcyBlbnRyaWVzIGZyZWVkIGFzIGEgcmVzdWx0LiAqLworc3RhdGljIGludCBfX2ttcF91bnJlZ2lzdGVyX3Jvb3Rfb3RoZXJfdGhyZWFkKGludCBndGlkKSB7CisgIGttcF9yb290X3QgKnJvb3QgPSBfX2ttcF9yb290W2d0aWRdOworICBpbnQgcjsKKworICBLQV9UUkFDRSgxLCAoIl9fa21wX3VucmVnaXN0ZXJfcm9vdF9vdGhlcl90aHJlYWQ6IGVudGVyIFQjJWRcbiIsIGd0aWQpKTsKKyAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF90aHJlYWRzICYmIF9fa21wX3RocmVhZHNbZ3RpZF0pOworICBLTVBfQVNTRVJUKEtNUF9VQkVSX0dUSUQoZ3RpZCkpOworICBLTVBfQVNTRVJUKHJvb3QgPT0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfcm9vdCk7CisgIEtNUF9BU1NFUlQocm9vdC0+ci5yX2FjdGl2ZSA9PSBGQUxTRSk7CisKKyAgciA9IF9fa21wX3Jlc2V0X3Jvb3QoZ3RpZCwgcm9vdCk7CisgIEtDX1RSQUNFKDEwLAorICAgICAgICAgICAoIl9fa21wX3VucmVnaXN0ZXJfcm9vdF9vdGhlcl90aHJlYWQ6IFQjJWQgdW5yZWdpc3RlcmVkXG4iLCBndGlkKSk7CisgIHJldHVybiByOworfQorI2VuZGlmCisKKyNpZiBLTVBfREVCVUcKK3ZvaWQgX19rbXBfdGFza19pbmZvKCkgeworCisgIGttcF9pbnQzMiBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICBrbXBfaW50MzIgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKyAga21wX2luZm9fdCAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICBrbXBfdGVhbV90ICpzdGVhbSA9IHRoaXNfdGhyLT50aC50aF9zZXJpYWxfdGVhbTsKKyAga21wX3RlYW1fdCAqdGVhbSA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworCisgIF9fa21wX3ByaW50ZigiX19rbXBfdGFza19pbmZvOiBndGlkPSVkIHRpZD0lZCB0X3RocmVhZD0lcCB0ZWFtPSVwIGN1cnRhc2s9JXAgIgorICAgICAgICAgICAgICAgInB0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgZ3RpZCwgdGlkLCB0aGlzX3RociwgdGVhbSwgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzaywKKyAgICAgICAgICAgICAgIHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfcGFyZW50KTsKK30KKyNlbmRpZiAvLyBLTVBfREVCVUcKKworLyogVE9ETyBvcHRpbWl6ZSB3aXRoIG9uZSBiaWcgbWVtY2xyLCB0YWtlIG91dCB3aGF0IGlzbid0IG5lZWRlZCwgc3BsaXQKKyAgIHJlc3BvbnNpYmlsaXR5IHRvIHdvcmtlcnMgYXMgbXVjaCBhcyBwb3NzaWJsZSwgYW5kIGRlbGF5IGluaXRpYWxpemF0aW9uIG9mCisgICBmZWF0dXJlcyBhcyBtdWNoIGFzIHBvc3NpYmxlICAqLworc3RhdGljIHZvaWQgX19rbXBfaW5pdGlhbGl6ZV9pbmZvKGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfdGVhbV90ICp0ZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWQsIGludCBndGlkKSB7CisgIC8qIHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgaXMgc2V0dXAgaW4KKyAgICAga21wX2FsbG9jYXRlX3RocmVhZC9jcmVhdGVfd29ya2VyLgorICAgICB0aGlzX3Roci0+dGgudGhfc2VyaWFsX3RlYW0gaXMgc2V0dXAgaW4gX19rbXBfYWxsb2NhdGVfdGhyZWFkICovCisgIGttcF9pbmZvX3QgKm1hc3RlciA9IHRlYW0tPnQudF90aHJlYWRzWzBdOworICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyICE9IE5VTEwpOworICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyLT50aC50aF9zZXJpYWxfdGVhbSk7CisgIEtNUF9ERUJVR19BU1NFUlQodGVhbSk7CisgIEtNUF9ERUJVR19BU1NFUlQodGVhbS0+dC50X3RocmVhZHMpOworICBLTVBfREVCVUdfQVNTRVJUKHRlYW0tPnQudF9kaXNwYXRjaCk7CisgIEtNUF9ERUJVR19BU1NFUlQobWFzdGVyKTsKKyAgS01QX0RFQlVHX0FTU0VSVChtYXN0ZXItPnRoLnRoX3Jvb3QpOworCisgIEtNUF9NQigpOworCisgIFRDV19TWU5DX1BUUih0aGlzX3Roci0+dGgudGhfdGVhbSwgdGVhbSk7CisKKyAgdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfdGlkID0gdGlkOworICB0aGlzX3Roci0+dGgudGhfc2V0X25wcm9jID0gMDsKKyAgaWYgKF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjKQorICAgIC8vIFdoZW4gdGFza2luZyBpcyBwb3NzaWJsZSwgdGhyZWFkcyBhcmUgbm90IHNhZmUgdG8gcmVhcCB1bnRpbCB0aGV5IGFyZQorICAgIC8vIGRvbmUgdGFza2luZzsgdGhpcyB3aWxsIGJlIHNldCB3aGVuIHRhc2tpbmcgY29kZSBpcyBleGl0ZWQgaW4gd2FpdAorICAgIHRoaXNfdGhyLT50aC50aF9yZWFwX3N0YXRlID0gS01QX05PVF9TQUZFX1RPX1JFQVA7CisgIGVsc2UgLy8gbm8gdGFza2luZyAtLT4gYWx3YXlzIHNhZmUgdG8gcmVhcAorICAgIHRoaXNfdGhyLT50aC50aF9yZWFwX3N0YXRlID0gS01QX1NBRkVfVE9fUkVBUDsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICB0aGlzX3Roci0+dGgudGhfc2V0X3Byb2NfYmluZCA9IHByb2NfYmluZF9kZWZhdWx0OworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgdGhpc190aHItPnRoLnRoX25ld19wbGFjZSA9IHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3BsYWNlOworI2VuZGlmCisjZW5kaWYKKyAgdGhpc190aHItPnRoLnRoX3Jvb3QgPSBtYXN0ZXItPnRoLnRoX3Jvb3Q7CisKKyAgLyogc2V0dXAgdGhlIHRocmVhZCdzIGNhY2hlIG9mIHRoZSB0ZWFtIHN0cnVjdHVyZSAqLworICB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYyA9IHRlYW0tPnQudF9ucHJvYzsKKyAgdGhpc190aHItPnRoLnRoX3RlYW1fbWFzdGVyID0gbWFzdGVyOworICB0aGlzX3Roci0+dGgudGhfdGVhbV9zZXJpYWxpemVkID0gdGVhbS0+dC50X3NlcmlhbGl6ZWQ7CisgIFRDV19QVFIodGhpc190aHItPnRoLnRoX3NsZWVwX2xvYywgTlVMTCk7CisKKyAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YSk7CisKKyAgS0ZfVFJBQ0UoMTAsICgiX19rbXBfaW5pdGlhbGl6ZV9pbmZvMTogVCMlZDolZCB0aGlzX3RocmVhZD0lcCBjdXJ0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgIHRpZCwgZ3RpZCwgdGhpc190aHIsIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2spKTsKKworICBfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2sodGhpc190aHItPnRoLnRoX3RlYW1fbWFzdGVyLT50aC50aF9pZGVudCwgdGhpc190aHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLCB0aWQsIFRSVUUpOworCisgIEtGX1RSQUNFKDEwLCAoIl9fa21wX2luaXRpYWxpemVfaW5mbzI6IFQjJWQ6JWQgdGhpc190aHJlYWQ9JXAgY3VydGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICB0aWQsIGd0aWQsIHRoaXNfdGhyLCB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrKSk7CisgIC8vIFRPRE86IEluaXRpYWxpemUgSUNWcyBmcm9tIHBhcmVudDsgR0VIIC0gaXNuJ3QgdGhhdCBhbHJlYWR5IGRvbmUgaW4KKyAgLy8gX19rbXBfaW5pdGlhbGl6ZV90ZWFtKCk/CisKKyAgLyogVE9ETyBubyB3b3Jrc2hhcmluZyBpbiBzcGVjdWxhdGl2ZSB0aHJlYWRzICovCisgIHRoaXNfdGhyLT50aC50aF9kaXNwYXRjaCA9ICZ0ZWFtLT50LnRfZGlzcGF0Y2hbdGlkXTsKKworICB0aGlzX3Roci0+dGgudGhfbG9jYWwudGhpc19jb25zdHJ1Y3QgPSAwOworCisjaWZkZWYgQlVJTERfVFYKKyAgdGhpc190aHItPnRoLnRoX2xvY2FsLnR2X2RhdGEgPSAwOworI2VuZGlmCisKKyAgaWYgKCF0aGlzX3Roci0+dGgudGhfcHJpX2NvbW1vbikgeworICAgIHRoaXNfdGhyLT50aC50aF9wcmlfY29tbW9uID0KKyAgICAgICAgKHN0cnVjdCBjb21tb25fdGFibGUgKilfX2ttcF9hbGxvY2F0ZShzaXplb2Yoc3RydWN0IGNvbW1vbl90YWJsZSkpOworICAgIGlmIChfX2ttcF9zdG9yYWdlX21hcCkgeworICAgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCgKKyAgICAgICAgICBndGlkLCB0aGlzX3Roci0+dGgudGhfcHJpX2NvbW1vbiwgdGhpc190aHItPnRoLnRoX3ByaV9jb21tb24gKyAxLAorICAgICAgICAgIHNpemVvZihzdHJ1Y3QgY29tbW9uX3RhYmxlKSwgInRoXyVkLnRoX3ByaV9jb21tb25cbiIsIGd0aWQpOworICAgIH07IC8vIGlmCisgICAgdGhpc190aHItPnRoLnRoX3ByaV9oZWFkID0gTlVMTDsKKyAgfTsgLy8gaWYKKworICAvKiBJbml0aWFsaXplIGR5bmFtaWMgZGlzcGF0Y2ggKi8KKyAgeworICAgIHZvbGF0aWxlIGttcF9kaXNwX3QgKmRpc3BhdGNoID0gdGhpc190aHItPnRoLnRoX2Rpc3BhdGNoOworICAgIC8vIFVzZSB0ZWFtIG1heF9ucHJvYyBzaW5jZSB0aGlzIHdpbGwgbmV2ZXIgY2hhbmdlIGZvciB0aGUgdGVhbS4KKyAgICBzaXplX3QgZGlzcF9zaXplID0KKyAgICAgICAgc2l6ZW9mKGRpc3BhdGNoX3ByaXZhdGVfaW5mb190KSAqCisgICAgICAgICh0ZWFtLT50LnRfbWF4X25wcm9jID09IDEgPyAxIDogX19rbXBfZGlzcGF0Y2hfbnVtX2J1ZmZlcnMpOworICAgIEtEX1RSQUNFKDEwLCAoIl9fa21wX2luaXRpYWxpemVfaW5mbzogVCMlZCBtYXhfbnByb2M6ICVkXG4iLCBndGlkLAorICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X21heF9ucHJvYykpOworICAgIEtNUF9BU1NFUlQoZGlzcGF0Y2gpOworICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbS0+dC50X2Rpc3BhdGNoKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKGRpc3BhdGNoID09ICZ0ZWFtLT50LnRfZGlzcGF0Y2hbdGlkXSk7CisKKyAgICBkaXNwYXRjaC0+dGhfZGlzcF9pbmRleCA9IDA7CisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICBkaXNwYXRjaC0+dGhfZG9hY3Jvc3NfYnVmX2lkeCA9IDA7CisjZW5kaWYKKyAgICBpZiAoIWRpc3BhdGNoLT50aF9kaXNwX2J1ZmZlcikgeworICAgICAgZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyID0KKyAgICAgICAgICAoZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgKilfX2ttcF9hbGxvY2F0ZShkaXNwX3NpemUpOworCisgICAgICBpZiAoX19rbXBfc3RvcmFnZV9tYXApIHsKKyAgICAgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCgKKyAgICAgICAgICAgIGd0aWQsICZkaXNwYXRjaC0+dGhfZGlzcF9idWZmZXJbMF0sCisgICAgICAgICAgICAmZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyW3RlYW0tPnQudF9tYXhfbnByb2MgPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9fa21wX2Rpc3BhdGNoX251bV9idWZmZXJzXSwKKyAgICAgICAgICAgIGRpc3Bfc2l6ZSwgInRoXyVkLnRoX2Rpc3BhdGNoLnRoX2Rpc3BfYnVmZmVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgIih0ZWFtXyVkLnRfZGlzcGF0Y2hbJWRdLnRoX2Rpc3BfYnVmZmVyKSIsCisgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIGd0aWQpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBtZW1zZXQoJmRpc3BhdGNoLT50aF9kaXNwX2J1ZmZlclswXSwgJ1wwJywgZGlzcF9zaXplKTsKKyAgICB9CisKKyAgICBkaXNwYXRjaC0+dGhfZGlzcGF0Y2hfcHJfY3VycmVudCA9IDA7CisgICAgZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQgPSAwOworCisgICAgZGlzcGF0Y2gtPnRoX2Rlb19mY24gPSAwOyAvKiBPUkRFUkVEICAgICAqLworICAgIGRpc3BhdGNoLT50aF9keG9fZmNuID0gMDsgLyogRU5EIE9SREVSRUQgKi8KKyAgfQorCisgIHRoaXNfdGhyLT50aC50aF9uZXh0X3Bvb2wgPSBOVUxMOworCisgIGlmICghdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGVfbWVtb19zdGFjaykgeworICAgIHNpemVfdCBpOworICAgIHRoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlX21lbW9fc3RhY2sgPQorICAgICAgICAoa21wX3VpbnQ4ICopX19rbXBfYWxsb2NhdGUoNCAqIHNpemVvZihrbXBfdWludDgpKTsKKyAgICB0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZV90b3AgPSAwOworICAgIHRoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlX3N0YWNrX3N6ID0gNDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGVfc3RhY2tfc3o7CisgICAgICAgICArK2kpIC8vIHplcm8gaW5pdCB0aGUgc3RhY2sKKyAgICAgIHRoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlX21lbW9fc3RhY2tbaV0gPSAwOworICB9CisKKyAgS01QX0RFQlVHX0FTU0VSVCghdGhpc190aHItPnRoLnRoX3NwaW5faGVyZSk7CisgIEtNUF9ERUJVR19BU1NFUlQodGhpc190aHItPnRoLnRoX25leHRfd2FpdGluZyA9PSAwKTsKKworICBLTVBfTUIoKTsKK30KKworLyogYWxsb2NhdGUgYSBuZXcgdGhyZWFkIGZvciB0aGUgcmVxdWVzdGluZyB0ZWFtLiB0aGlzIGlzIG9ubHkgY2FsbGVkIGZyb20KKyAgIHdpdGhpbiBhIGZvcmtqb2luIGNyaXRpY2FsIHNlY3Rpb24uIHdlIHdpbGwgZmlyc3QgdHJ5IHRvIGdldCBhbiBhdmFpbGFibGUKKyAgIHRocmVhZCBmcm9tIHRoZSB0aHJlYWQgcG9vbC4gaWYgbm9uZSBpcyBhdmFpbGFibGUsIHdlIHdpbGwgZm9yayBhIG5ldyBvbmUKKyAgIGFzc3VtaW5nIHdlIGFyZSBhYmxlIHRvIGNyZWF0ZSBhIG5ldyBvbmUuIHRoaXMgc2hvdWxkIGJlIGFzc3VyZWQsIGFzIHRoZQorICAgY2FsbGVyIHNob3VsZCBjaGVjayBvbiB0aGlzIGZpcnN0LiAqLwora21wX2luZm9fdCAqX19rbXBfYWxsb2NhdGVfdGhyZWFkKGttcF9yb290X3QgKnJvb3QsIGttcF90ZWFtX3QgKnRlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5ld190aWQpIHsKKyAga21wX3RlYW1fdCAqc2VyaWFsX3RlYW07CisgIGttcF9pbmZvX3QgKm5ld190aHI7CisgIGludCBuZXdfZ3RpZDsKKworICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9hbGxvY2F0ZV90aHJlYWQ6IFQjJWRcbiIsIF9fa21wX2dldF9ndGlkKCkpKTsKKyAgS01QX0RFQlVHX0FTU0VSVChyb290ICYmIHRlYW0pOworI2lmICFLTVBfTkVTVEVEX0hPVF9URUFNUworICBLTVBfREVCVUdfQVNTRVJUKEtNUF9NQVNURVJfR1RJRChfX2ttcF9nZXRfZ3RpZCgpKSk7CisjZW5kaWYKKyAgS01QX01CKCk7CisKKyAgLyogZmlyc3QsIHRyeSB0byBnZXQgb25lIGZyb20gdGhlIHRocmVhZCBwb29sICovCisgIGlmIChfX2ttcF90aHJlYWRfcG9vbCkgeworCisgICAgbmV3X3RociA9IENDQVNUKGttcF9pbmZvX3QgKiwgX19rbXBfdGhyZWFkX3Bvb2wpOworICAgIF9fa21wX3RocmVhZF9wb29sID0gKHZvbGF0aWxlIGttcF9pbmZvX3QgKiluZXdfdGhyLT50aC50aF9uZXh0X3Bvb2w7CisgICAgaWYgKG5ld190aHIgPT0gX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0KSB7CisgICAgICBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQgPSBOVUxMOworICAgIH0KKyAgICBUQ1dfNChuZXdfdGhyLT50aC50aF9pbl9wb29sLCBGQUxTRSk7CisgICAgLy8gRG9uJ3QgdG91Y2ggdGhfYWN0aXZlX2luX3Bvb2wgb3IgdGhfYWN0aXZlLgorICAgIC8vIFRoZSB3b3JrZXIgdGhyZWFkIGFkanVzdHMgdGhvc2UgZmxhZ3MgYXMgaXQgc2xlZXBzL2F3YWtlbnMuCisgICAgX19rbXBfdGhyZWFkX3Bvb2xfbnRoLS07CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9hbGxvY2F0ZV90aHJlYWQ6IFQjJWQgdXNpbmcgdGhyZWFkIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICBfX2ttcF9nZXRfZ3RpZCgpLCBuZXdfdGhyLT50aC50aF9pbmZvLmRzLmRzX2d0aWQpKTsKKyAgICBLTVBfQVNTRVJUKCFuZXdfdGhyLT50aC50aF90ZWFtKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX250aCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHkpOworICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfdGhyZWFkX3Bvb2xfbnRoID49IDApOworCisgICAgLyogc2V0dXAgdGhlIHRocmVhZCBzdHJ1Y3R1cmUgKi8KKyAgICBfX2ttcF9pbml0aWFsaXplX2luZm8obmV3X3RociwgdGVhbSwgbmV3X3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3Roci0+dGgudGhfaW5mby5kcy5kc19ndGlkKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKG5ld190aHItPnRoLnRoX3NlcmlhbF90ZWFtKTsKKworICAgIFRDV180KF9fa21wX250aCwgX19rbXBfbnRoICsgMSk7CisKKyAgICBuZXdfdGhyLT50aC50aF90YXNrX3N0YXRlID0gMDsKKyAgICBuZXdfdGhyLT50aC50aF90YXNrX3N0YXRlX3RvcCA9IDA7CisgICAgbmV3X3Roci0+dGgudGhfdGFza19zdGF0ZV9zdGFja19zeiA9IDQ7CisKKyNpZmRlZiBLTVBfQURKVVNUX0JMT0NLVElNRQorICAgIC8qIEFkanVzdCBibG9ja3RpbWUgYmFjayB0byB6ZXJvIGlmIG5lY2Vzc2FyeSAqLworICAgIC8qIE1pZGRsZSBpbml0aWFsaXphdGlvbiBtaWdodCBub3QgaGF2ZSBvY2N1cnJlZCB5ZXQgKi8KKyAgICBpZiAoIV9fa21wX2Vudl9ibG9ja3RpbWUgJiYgKF9fa21wX2F2YWlsX3Byb2MgPiAwKSkgeworICAgICAgaWYgKF9fa21wX250aCA+IF9fa21wX2F2YWlsX3Byb2MpIHsKKyAgICAgICAgX19rbXBfemVyb19idCA9IFRSVUU7CisgICAgICB9CisgICAgfQorI2VuZGlmIC8qIEtNUF9BREpVU1RfQkxPQ0tUSU1FICovCisKKyNpZiBLTVBfREVCVUcKKyAgICAvLyBJZiB0aHJlYWQgZW50ZXJlZCBwb29sIHZpYSBfX2ttcF9mcmVlX3RocmVhZCwgd2FpdF9mbGFnIHNob3VsZCAhPQorICAgIC8vIEtNUF9CQVJSSUVSX1BBUkVOVF9GTEFHLgorICAgIGludCBiOworICAgIGttcF9iYWxpZ25fdCAqYmFsaWduID0gbmV3X3Roci0+dGgudGhfYmFyOworICAgIGZvciAoYiA9IDA7IGIgPCBic19sYXN0X2JhcnJpZXI7ICsrYikKKyAgICAgIEtNUF9ERUJVR19BU1NFUlQoYmFsaWduW2JdLmJiLndhaXRfZmxhZyAhPSBLTVBfQkFSUklFUl9QQVJFTlRfRkxBRyk7CisjZW5kaWYKKworICAgIEtGX1RSQUNFKDEwLCAoIl9fa21wX2FsbG9jYXRlX3RocmVhZDogVCMlZCB1c2luZyB0aHJlYWQgJXAgVCMlZFxuIiwKKyAgICAgICAgICAgICAgICAgIF9fa21wX2dldF9ndGlkKCksIG5ld190aHIsIG5ld190aHItPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCkpOworCisgICAgS01QX01CKCk7CisgICAgcmV0dXJuIG5ld190aHI7CisgIH0KKworICAvKiBubywgd2VsbCBmb3JrIGEgbmV3IG9uZSAqLworICBLTVBfQVNTRVJUKF9fa21wX250aCA9PSBfX2ttcF9hbGxfbnRoKTsKKyAgS01QX0FTU0VSVChfX2ttcF9hbGxfbnRoIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eSk7CisKKyNpZiBLTVBfVVNFX01PTklUT1IKKyAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3Qgd29ya2VyIHRocmVhZCB0aGUgUlRMIGlzIGNyZWF0aW5nLCB0aGVuIGFsc28KKyAgLy8gbGF1bmNoIHRoZSBtb25pdG9yIHRocmVhZC4gIFdlIHRyeSB0byBkbyB0aGlzIGFzIGVhcmx5IGFzIHBvc3NpYmxlLgorICBpZiAoIVRDUl80KF9fa21wX2luaXRfbW9uaXRvcikpIHsKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF9tb25pdG9yX2xvY2spOworICAgIGlmICghVENSXzQoX19rbXBfaW5pdF9tb25pdG9yKSkgeworICAgICAgS0ZfVFJBQ0UoMTAsICgiYmVmb3JlIF9fa21wX2NyZWF0ZV9tb25pdG9yXG4iKSk7CisgICAgICBUQ1dfNChfX2ttcF9pbml0X21vbml0b3IsIDEpOworICAgICAgX19rbXBfY3JlYXRlX21vbml0b3IoJl9fa21wX21vbml0b3IpOworICAgICAgS0ZfVFJBQ0UoMTAsICgiYWZ0ZXIgX19rbXBfY3JlYXRlX21vbml0b3JcbiIpKTsKKyNpZiBLTVBfT1NfV0lORE9XUworICAgICAgLy8gQUM6IHdhaXQgdW50aWwgbW9uaXRvciBoYXMgc3RhcnRlZC4gVGhpcyBpcyBhIGZpeCBmb3IgQ1EyMzI4MDguCisgICAgICAvLyBUaGUgcmVhc29uIGlzIHRoYXQgaWYgdGhlIGxpYnJhcnkgaXMgbG9hZGVkL3VubG9hZGVkIGluIGEgbG9vcCB3aXRoCisgICAgICAvLyBzbWFsbCAocGFyYWxsZWwpIHdvcmsgaW4gYmV0d2VlbiwgdGhlbiB0aGVyZSBpcyBoaWdoIHByb2JhYmlsaXR5IHRoYXQKKyAgICAgIC8vIG1vbml0b3IgdGhyZWFkIHN0YXJ0ZWQgYWZ0ZXIgdGhlIGxpYnJhcnkgc2h1dGRvd24uIEF0IHNodXRkb3duIGl0IGlzCisgICAgICAvLyB0b28gbGF0ZSB0byBjb3BlIHdpdGggdGhlIHByb2JsZW0sIGJlY2F1c2Ugd2hlbiB0aGUgbWFzdGVyIGlzIGluCisgICAgICAvLyBEbGxNYWluIChwcm9jZXNzIGRldGFjaCkgdGhlIG1vbml0b3IgaGFzIG5vIGNoYW5jZXMgdG8gc3RhcnQgKGl0IGlzCisgICAgICAvLyBibG9ja2VkKSwgYW5kIG1hc3RlciBoYXMgbm8gbWVhbnMgdG8gaW5mb3JtIHRoZSBtb25pdG9yIHRoYXQgdGhlCisgICAgICAvLyBsaWJyYXJ5IGhhcyBnb25lLCBiZWNhdXNlIGFsbCB0aGUgbWVtb3J5IHdoaWNoIHRoZSBtb25pdG9yIGNhbiBhY2Nlc3MKKyAgICAgIC8vIGlzIGdvaW5nIHRvIGJlIHJlbGVhc2VkL3Jlc2V0LgorICAgICAgd2hpbGUgKFRDUl80KF9fa21wX2luaXRfbW9uaXRvcikgPCAyKSB7CisgICAgICAgIEtNUF9ZSUVMRChUUlVFKTsKKyAgICAgIH0KKyAgICAgIEtGX1RSQUNFKDEwLCAoImFmdGVyIG1vbml0b3IgdGhyZWFkIGhhcyBzdGFydGVkXG4iKSk7CisjZW5kaWYKKyAgICB9CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jaygmX19rbXBfbW9uaXRvcl9sb2NrKTsKKyAgfQorI2VuZGlmCisKKyAgS01QX01CKCk7CisgIGZvciAobmV3X2d0aWQgPSAxOyBUQ1JfUFRSKF9fa21wX3RocmVhZHNbbmV3X2d0aWRdKSAhPSBOVUxMOyArK25ld19ndGlkKSB7CisgICAgS01QX0RFQlVHX0FTU0VSVChuZXdfZ3RpZCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHkpOworICB9CisKKyAgLyogYWxsb2NhdGUgc3BhY2UgZm9yIGl0LiAqLworICBuZXdfdGhyID0gKGttcF9pbmZvX3QgKilfX2ttcF9hbGxvY2F0ZShzaXplb2Yoa21wX2luZm9fdCkpOworCisgIFRDV19TWU5DX1BUUihfX2ttcF90aHJlYWRzW25ld19ndGlkXSwgbmV3X3Rocik7CisKKyAgaWYgKF9fa21wX3N0b3JhZ2VfbWFwKSB7CisgICAgX19rbXBfcHJpbnRfdGhyZWFkX3N0b3JhZ2VfbWFwKG5ld190aHIsIG5ld19ndGlkKTsKKyAgfQorCisgIC8vIGFkZCB0aGUgcmVzZXJ2ZSBzZXJpYWxpemVkIHRlYW0sIGluaXRpYWxpemVkIGZyb20gdGhlIHRlYW0ncyBtYXN0ZXIgdGhyZWFkCisgIHsKKyAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90IHJfaWN2cyA9IF9fa21wX2dldF94X2dsb2JhbF9pY3ZzKHRlYW0pOworICAgIEtGX1RSQUNFKDEwLCAoIl9fa21wX2FsbG9jYXRlX3RocmVhZDogYmVmb3JlIHRoX3NlcmlhbC9zZXJpYWxfdGVhbVxuIikpOworICAgIG5ld190aHItPnRoLnRoX3NlcmlhbF90ZWFtID0gc2VyaWFsX3RlYW0gPQorICAgICAgICAoa21wX3RlYW1fdCAqKV9fa21wX2FsbG9jYXRlX3RlYW0ocm9vdCwgMSwgMSwKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8vIHJvb3QgcGFyYWxsZWwgaWQKKyNlbmRpZgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jX2JpbmRfZGVmYXVsdCwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJfaWN2cywgMCBVU0VfTkVTVEVEX0hPVF9BUkcoTlVMTCkpOworICB9CisgIEtNUF9BU1NFUlQoc2VyaWFsX3RlYW0pOworICBzZXJpYWxfdGVhbS0+dC50X3NlcmlhbGl6ZWQgPSAwOyAvLyBBQzogdGhlIHRlYW0gY3JlYXRlZCBpbiByZXNlcnZlLCBub3QgZm9yCisgIC8vIGV4ZWN1dGlvbiAoaXQgaXMgdW51c2VkIGZvciBub3cpLgorICBzZXJpYWxfdGVhbS0+dC50X3RocmVhZHNbMF0gPSBuZXdfdGhyOworICBLRl9UUkFDRSgxMCwKKyAgICAgICAgICAgKCJfX2ttcF9hbGxvY2F0ZV90aHJlYWQ6IGFmdGVyIHRoX3NlcmlhbC9zZXJpYWxfdGVhbSA6IG5ld190aHI9JXBcbiIsCisgICAgICAgICAgICBuZXdfdGhyKSk7CisKKyAgLyogc2V0dXAgdGhlIHRocmVhZCBzdHJ1Y3R1cmVzICovCisgIF9fa21wX2luaXRpYWxpemVfaW5mbyhuZXdfdGhyLCB0ZWFtLCBuZXdfdGlkLCBuZXdfZ3RpZCk7CisKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgX19rbXBfaW5pdGlhbGl6ZV9mYXN0X21lbW9yeShuZXdfdGhyKTsKKyNlbmRpZiAvKiBVU0VfRkFTVF9NRU1PUlkgKi8KKworI2lmIEtNUF9VU0VfQkdFVAorICBLTVBfREVCVUdfQVNTRVJUKG5ld190aHItPnRoLnRoX2xvY2FsLmJnZXRfZGF0YSA9PSBOVUxMKTsKKyAgX19rbXBfaW5pdGlhbGl6ZV9iZ2V0KG5ld190aHIpOworI2VuZGlmCisKKyAgX19rbXBfaW5pdF9yYW5kb20obmV3X3Rocik7IC8vIEluaXRpYWxpemUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKworICAvKiBJbml0aWFsaXplIHRoZXNlIG9ubHkgb25jZSB3aGVuIHRocmVhZCBpcyBncmFiYmVkIGZvciBhIHRlYW0gYWxsb2NhdGlvbiAqLworICBLQV9UUkFDRSgyMCwKKyAgICAgICAgICAgKCJfX2ttcF9hbGxvY2F0ZV90aHJlYWQ6IFQjJWQgaW5pdCBnbyBmb3JrPSV1LCBwbGFpbj0ldVxuIiwKKyAgICAgICAgICAgIF9fa21wX2dldF9ndGlkKCksIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUsIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUpKTsKKworICBpbnQgYjsKKyAga21wX2JhbGlnbl90ICpiYWxpZ24gPSBuZXdfdGhyLT50aC50aF9iYXI7CisgIGZvciAoYiA9IDA7IGIgPCBic19sYXN0X2JhcnJpZXI7ICsrYikgeworICAgIGJhbGlnbltiXS5iYi5iX2dvID0gS01QX0lOSVRfQkFSUklFUl9TVEFURTsKKyAgICBiYWxpZ25bYl0uYmIudGVhbSA9IE5VTEw7CisgICAgYmFsaWduW2JdLmJiLndhaXRfZmxhZyA9IEtNUF9CQVJSSUVSX05PVF9XQUlUSU5HOworICAgIGJhbGlnbltiXS5iYi51c2Vfb25jb3JlX2JhcnJpZXIgPSAwOworICB9CisKKyAgbmV3X3Roci0+dGgudGhfc3Bpbl9oZXJlID0gRkFMU0U7CisgIG5ld190aHItPnRoLnRoX25leHRfd2FpdGluZyA9IDA7CisKKyNpZiBPTVBfNDBfRU5BQkxFRCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgIG5ld190aHItPnRoLnRoX2N1cnJlbnRfcGxhY2UgPSBLTVBfUExBQ0VfVU5ERUZJTkVEOworICBuZXdfdGhyLT50aC50aF9uZXdfcGxhY2UgPSBLTVBfUExBQ0VfVU5ERUZJTkVEOworICBuZXdfdGhyLT50aC50aF9maXJzdF9wbGFjZSA9IEtNUF9QTEFDRV9VTkRFRklORUQ7CisgIG5ld190aHItPnRoLnRoX2xhc3RfcGxhY2UgPSBLTVBfUExBQ0VfVU5ERUZJTkVEOworI2VuZGlmCisKKyAgVENXXzQobmV3X3Roci0+dGgudGhfaW5fcG9vbCwgRkFMU0UpOworICBuZXdfdGhyLT50aC50aF9hY3RpdmVfaW5fcG9vbCA9IEZBTFNFOworICBUQ1dfNChuZXdfdGhyLT50aC50aF9hY3RpdmUsIFRSVUUpOworCisgIC8qIGFkanVzdCB0aGUgZ2xvYmFsIGNvdW50ZXJzICovCisgIF9fa21wX2FsbF9udGgrKzsKKyAgX19rbXBfbnRoKys7CisKKyAgLy8gaWYgX19rbXBfYWRqdXN0X2d0aWRfbW9kZSBpcyBzZXQsIHRoZW4gd2UgdXNlIG1ldGhvZCAjMSAoc3Agc2VhcmNoKSBmb3IgbG93CisgIC8vIG51bWJlcnMgb2YgcHJvY3MsIGFuZCBtZXRob2QgIzIgKGtleWVkIEFQSSBjYWxsKSBmb3IgaGlnaGVyIG51bWJlcnMuCisgIGlmIChfX2ttcF9hZGp1c3RfZ3RpZF9tb2RlKSB7CisgICAgaWYgKF9fa21wX2FsbF9udGggPj0gX19rbXBfdGxzX2d0aWRfbWluKSB7CisgICAgICBpZiAoVENSXzQoX19rbXBfZ3RpZF9tb2RlKSAhPSAyKSB7CisgICAgICAgIFRDV180KF9fa21wX2d0aWRfbW9kZSwgMik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChUQ1JfNChfX2ttcF9ndGlkX21vZGUpICE9IDEpIHsKKyAgICAgICAgVENXXzQoX19rbXBfZ3RpZF9tb2RlLCAxKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworI2lmZGVmIEtNUF9BREpVU1RfQkxPQ0tUSU1FCisgIC8qIEFkanVzdCBibG9ja3RpbWUgYmFjayB0byB6ZXJvIGlmIG5lY2Vzc2FyeSAgICAgICAqLworICAvKiBNaWRkbGUgaW5pdGlhbGl6YXRpb24gbWlnaHQgbm90IGhhdmUgb2NjdXJyZWQgeWV0ICovCisgIGlmICghX19rbXBfZW52X2Jsb2NrdGltZSAmJiAoX19rbXBfYXZhaWxfcHJvYyA+IDApKSB7CisgICAgaWYgKF9fa21wX250aCA+IF9fa21wX2F2YWlsX3Byb2MpIHsKKyAgICAgIF9fa21wX3plcm9fYnQgPSBUUlVFOworICAgIH0KKyAgfQorI2VuZGlmIC8qIEtNUF9BREpVU1RfQkxPQ0tUSU1FICovCisKKyAgLyogYWN0dWFsbHkgZm9yayBpdCBhbmQgY3JlYXRlIHRoZSBuZXcgd29ya2VyIHRocmVhZCAqLworICBLRl9UUkFDRSgKKyAgICAgIDEwLCAoIl9fa21wX2FsbG9jYXRlX3RocmVhZDogYmVmb3JlIF9fa21wX2NyZWF0ZV93b3JrZXI6ICVwXG4iLCBuZXdfdGhyKSk7CisgIF9fa21wX2NyZWF0ZV93b3JrZXIobmV3X2d0aWQsIG5ld190aHIsIF9fa21wX3N0a3NpemUpOworICBLRl9UUkFDRSgxMCwKKyAgICAgICAgICAgKCJfX2ttcF9hbGxvY2F0ZV90aHJlYWQ6IGFmdGVyIF9fa21wX2NyZWF0ZV93b3JrZXI6ICVwXG4iLCBuZXdfdGhyKSk7CisKKyAgS0FfVFJBQ0UoMjAsICgiX19rbXBfYWxsb2NhdGVfdGhyZWFkOiBUIyVkIGZvcmtlZCBUIyVkXG4iLCBfX2ttcF9nZXRfZ3RpZCgpLAorICAgICAgICAgICAgICAgIG5ld19ndGlkKSk7CisgIEtNUF9NQigpOworICByZXR1cm4gbmV3X3RocjsKK30KKworLyogUmVpbml0aWFsaXplIHRlYW0gZm9yIHJldXNlLgorICAgVGhlIGhvdCB0ZWFtIGNvZGUgY2FsbHMgdGhpcyBjYXNlIGF0IGV2ZXJ5IGZvcmsgYmFycmllciwgc28gRVBDQyBiYXJyaWVyCisgICB0ZXN0IGFyZSBleHRyZW1lbHkgc2Vuc2l0aXZlIHRvIGNoYW5nZXMgaW4gaXQsIGVzcC4gd3JpdGVzIHRvIHRoZSB0ZWFtCisgICBzdHJ1Y3QsIHdoaWNoIGNhdXNlIGEgY2FjaGUgaW52YWxpZGF0aW9uIGluIGFsbCB0aHJlYWRzLgorICAgSUYgWU9VIFRPVUNIIFRISVMgUk9VVElORSwgUlVOIEVQQ0MgQyBTWU5DQkVOQ0ggT04gQSBCSUctSVJPTiBNQUNISU5FISEhICovCitzdGF0aWMgdm9pZCBfX2ttcF9yZWluaXRpYWxpemVfdGVhbShrbXBfdGVhbV90ICp0ZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCAqbmV3X2ljdnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudF90ICpsb2MpIHsKKyAgS0ZfVFJBQ0UoMTAsICgiX19rbXBfcmVpbml0aWFsaXplX3RlYW06IGVudGVyIHRoaXNfdGhyZWFkPSVwIHRlYW09JXBcbiIsCisgICAgICAgICAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbMF0sIHRlYW0pKTsKKyAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtICYmIG5ld19pY3ZzKTsKKyAgS01QX0RFQlVHX0FTU0VSVCgoIVRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpKSB8fCBuZXdfaWN2cy0+bnByb2MpOworICBLTVBfQ0hFQ0tfVVBEQVRFKHRlYW0tPnQudF9pZGVudCwgbG9jKTsKKworICBLTVBfQ0hFQ0tfVVBEQVRFKHRlYW0tPnQudF9pZCwgS01QX0dFTl9URUFNX0lEKCkpOworICAvLyBDb3B5IElDVnMgdG8gdGhlIG1hc3RlciB0aHJlYWQncyBpbXBsaWNpdCB0YXNrZGF0YQorICBfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2sobG9jLCB0ZWFtLT50LnRfdGhyZWFkc1swXSwgdGVhbSwgMCwgRkFMU0UpOworICBjb3B5X2ljdnMoJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWzBdLnRkX2ljdnMsIG5ld19pY3ZzKTsKKworICBLRl9UUkFDRSgxMCwgKCJfX2ttcF9yZWluaXRpYWxpemVfdGVhbTogZXhpdCB0aGlzX3RocmVhZD0lcCB0ZWFtPSVwXG4iLAorICAgICAgICAgICAgICAgIHRlYW0tPnQudF90aHJlYWRzWzBdLCB0ZWFtKSk7Cit9CisKKy8qIEluaXRpYWxpemUgdGhlIHRlYW0gZGF0YSBzdHJ1Y3R1cmUuCisgICBUaGlzIGFzc3VtZXMgdGhlIHRfdGhyZWFkcyBhbmQgdF9tYXhfbnByb2MgYXJlIGFscmVhZHkgc2V0LgorICAgQWxzbywgd2UgZG9uJ3QgdG91Y2ggdGhlIGFyZ3VtZW50cyAqLworc3RhdGljIHZvaWQgX19rbXBfaW5pdGlhbGl6ZV90ZWFtKGttcF90ZWFtX3QgKnRlYW0sIGludCBuZXdfbnByb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCAqbmV3X2ljdnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRfdCAqbG9jKSB7CisgIEtGX1RSQUNFKDEwLCAoIl9fa21wX2luaXRpYWxpemVfdGVhbTogZW50ZXI6IHRlYW09JXBcbiIsIHRlYW0pKTsKKworICAvKiB2ZXJpZnkgKi8KKyAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtKTsKKyAgS01QX0RFQlVHX0FTU0VSVChuZXdfbnByb2MgPD0gdGVhbS0+dC50X21heF9ucHJvYyk7CisgIEtNUF9ERUJVR19BU1NFUlQodGVhbS0+dC50X3RocmVhZHMpOworICBLTVBfTUIoKTsKKworICB0ZWFtLT50LnRfbWFzdGVyX3RpZCA9IDA7IC8qIG5vdCBuZWVkZWQgKi8KKyAgLyogdGVhbS0+dC50X21hc3Rlcl9iYXI7ICAgICAgICBub3QgbmVlZGVkICovCisgIHRlYW0tPnQudF9zZXJpYWxpemVkID0gbmV3X25wcm9jID4gMSA/IDAgOiAxOworICB0ZWFtLT50LnRfbnByb2MgPSBuZXdfbnByb2M7CisKKyAgLyogdGVhbS0+dC50X3BhcmVudCAgICAgPSBOVUxMOyBUT0RPIG5vdCBuZWVkZWQgJiB3b3VsZCBtZXNzIHVwIGhvdCB0ZWFtICovCisgIHRlYW0tPnQudF9uZXh0X3Bvb2wgPSBOVUxMOworICAvKiBtZW1zZXQoIHRlYW0tPnQudF90aHJlYWRzLCAwLCBzaXplb2Yoa21wX2luZm9fdCopKm5ld19ucHJvYyApOyB3b3VsZCBtZXNzCisgICAqIHVwIGhvdCB0ZWFtICovCisKKyAgVENXX1NZTkNfUFRSKHRlYW0tPnQudF9wa2ZuLCBOVUxMKTsgLyogbm90IG5lZWRlZCAqLworICB0ZWFtLT50LnRfaW52b2tlID0gTlVMTDsgLyogbm90IG5lZWRlZCAqLworCisgIC8vIFRPRE8/Pz86IHRlYW0tPnQudF9tYXhfYWN0aXZlX2xldmVscyAgICAgICA9IG5ld19tYXhfYWN0aXZlX2xldmVsczsKKyAgdGVhbS0+dC50X3NjaGVkID0gbmV3X2ljdnMtPnNjaGVkOworCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICB0ZWFtLT50LnRfZnBfY29udHJvbF9zYXZlZCA9IEZBTFNFOyAvKiBub3QgbmVlZGVkICovCisgIHRlYW0tPnQudF94ODdfZnB1X2NvbnRyb2xfd29yZCA9IDA7IC8qIG5vdCBuZWVkZWQgKi8KKyAgdGVhbS0+dC50X214Y3NyID0gMDsgLyogbm90IG5lZWRlZCAqLworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworICB0ZWFtLT50LnRfY29uc3RydWN0ID0gMDsKKyAgX19rbXBfaW5pdF9sb2NrKCZ0ZWFtLT50LnRfc2luZ2xlX2xvY2spOworCisgIHRlYW0tPnQudF9vcmRlcmVkLmR0LnRfdmFsdWUgPSAwOworICB0ZWFtLT50LnRfbWFzdGVyX2FjdGl2ZSA9IEZBTFNFOworCisgIG1lbXNldCgmdGVhbS0+dC50X3Rhc2txLCAnXDAnLCBzaXplb2Yoa21wX3Rhc2txX3QpKTsKKworI2lmZGVmIEtNUF9ERUJVRworICB0ZWFtLT50LnRfY29weXByaXZfZGF0YSA9IE5VTEw7IC8qIG5vdCBuZWNlc3NhcnksIGJ1dCBuaWNlIGZvciBkZWJ1Z2dpbmcgKi8KKyNlbmRpZgorICB0ZWFtLT50LnRfY29weWluX2NvdW50ZXIgPSAwOyAvKiBmb3IgYmFycmllci1mcmVlIGNvcHlpbiBpbXBsZW1lbnRhdGlvbiAqLworCisgIHRlYW0tPnQudF9jb250cm9sX3N0YWNrX3RvcCA9IE5VTEw7CisKKyAgX19rbXBfcmVpbml0aWFsaXplX3RlYW0odGVhbSwgbmV3X2ljdnMsIGxvYyk7CisKKyAgS01QX01CKCk7CisgIEtGX1RSQUNFKDEwLCAoIl9fa21wX2luaXRpYWxpemVfdGVhbTogZXhpdDogdGVhbT0lcFxuIiwgdGVhbSkpOworfQorCisjaWYgS01QX09TX0xJTlVYICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKy8qIFNldHMgZnVsbCBtYXNrIGZvciB0aHJlYWQgYW5kIHJldHVybnMgb2xkIG1hc2ssIG5vIGNoYW5nZXMgdG8gc3RydWN0dXJlcy4gKi8KK3N0YXRpYyB2b2lkCitfX2ttcF9zZXRfdGhyZWFkX2FmZmluaXR5X21hc2tfZnVsbF90bXAoa21wX2FmZmluX21hc2tfdCAqb2xkX21hc2spIHsKKyAgaWYgKEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICBpbnQgc3RhdHVzOworICAgIGlmIChvbGRfbWFzayAhPSBOVUxMKSB7CisgICAgICBzdGF0dXMgPSBfX2ttcF9nZXRfc3lzdGVtX2FmZmluaXR5KG9sZF9tYXNrLCBUUlVFKTsKKyAgICAgIGludCBlcnJvciA9IGVycm5vOworICAgICAgaWYgKHN0YXR1cyAhPSAwKSB7CisgICAgICAgIF9fa21wX21zZyhrbXBfbXNfZmF0YWwsIEtNUF9NU0coQ2hhbmdlVGhyZWFkQWZmTWFza0Vycm9yKSwKKyAgICAgICAgICAgICAgICAgIEtNUF9FUlIoZXJyb3IpLCBfX2ttcF9tc2dfbnVsbCk7CisgICAgICB9CisgICAgfQorICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkoX19rbXBfYWZmaW5fZnVsbE1hc2ssIFRSVUUpOworICB9Cit9CisjZW5kaWYKKworI2lmIE9NUF80MF9FTkFCTEVEICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKworLy8gX19rbXBfcGFydGl0aW9uX3BsYWNlcygpIGlzIHRoZSBoZWFydCBvZiB0aGUgT3Blbk1QIDQuMCBhZmZpbml0eSBtZWNoYW5pc20uCisvLyBJdCBjYWxjdWxhdHMgdGhlIHdvcmtlciArIG1hc3RlciB0aHJlYWQncyBwYXJ0aXRpb24gYmFzZWQgdXBvbiB0aGUgcGFyZW50CisvLyB0aHJlYWQncyBwYXJ0aXRpb24sIGFuZCBiaW5kcyBlYWNoIHdvcmtlciB0byBhIHRocmVhZCBpbiB0aGVpciBwYXJ0aXRpb24uCisvLyBUaGUgbWFzdGVyIHRocmVhZCdzIHBhcnRpdGlvbiBzaG91bGQgYWxyZWFkeSBpbmNsdWRlIGl0cyBjdXJyZW50IGJpbmRpbmcuCitzdGF0aWMgdm9pZCBfX2ttcF9wYXJ0aXRpb25fcGxhY2VzKGttcF90ZWFtX3QgKnRlYW0sIGludCB1cGRhdGVfbWFzdGVyX29ubHkpIHsKKyAgLy8gQ29weSB0aGUgbWFzdGVyIHRocmVhZCdzIHBsYWNlIHBhcnRpb24gdG8gdGhlIHRlYW0gc3RydWN0CisgIGttcF9pbmZvX3QgKm1hc3Rlcl90aCA9IHRlYW0tPnQudF90aHJlYWRzWzBdOworICBLTVBfREVCVUdfQVNTRVJUKG1hc3Rlcl90aCAhPSBOVUxMKTsKKyAga21wX3Byb2NfYmluZF90IHByb2NfYmluZCA9IHRlYW0tPnQudF9wcm9jX2JpbmQ7CisgIGludCBmaXJzdF9wbGFjZSA9IG1hc3Rlcl90aC0+dGgudGhfZmlyc3RfcGxhY2U7CisgIGludCBsYXN0X3BsYWNlID0gbWFzdGVyX3RoLT50aC50aF9sYXN0X3BsYWNlOworICBpbnQgbWFzdGVyc19wbGFjZSA9IG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF9wbGFjZTsKKyAgdGVhbS0+dC50X2ZpcnN0X3BsYWNlID0gZmlyc3RfcGxhY2U7CisgIHRlYW0tPnQudF9sYXN0X3BsYWNlID0gbGFzdF9wbGFjZTsKKworICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9wYXJ0aXRpb25fcGxhY2VzOiBlbnRlcjogcHJvY19iaW5kID0gJWQgVCMlZCglZDowKSAiCisgICAgICAgICAgICAgICAgImJvdW5kIHRvIHBsYWNlICVkIHBhcnRpdGlvbiA9IFslZCwlZF1cbiIsCisgICAgICAgICAgICAgICAgcHJvY19iaW5kLCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRlYW0tPnQudF90aHJlYWRzWzBdKSwKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIG1hc3RlcnNfcGxhY2UsIGZpcnN0X3BsYWNlLCBsYXN0X3BsYWNlKSk7CisKKyAgc3dpdGNoIChwcm9jX2JpbmQpIHsKKworICBjYXNlIHByb2NfYmluZF9kZWZhdWx0OgorICAgIC8vIHNlcmlhbCB0ZWFtcyBtaWdodCBoYXZlIHRoZSBwcm9jX2JpbmQgcG9saWN5IHNldCB0byBwcm9jX2JpbmRfZGVmYXVsdC4gSXQKKyAgICAvLyBkb2Vzbid0IG1hdHRlciwgYXMgd2UgZG9uJ3QgcmViaW5kIG1hc3RlciB0aHJlYWQgZm9yIGFueSBwcm9jX2JpbmQgcG9saWN5CisgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtLT50LnRfbnByb2MgPT0gMSk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBwcm9jX2JpbmRfbWFzdGVyOiB7CisgICAgaW50IGY7CisgICAgaW50IG5fdGggPSB0ZWFtLT50LnRfbnByb2M7CisgICAgZm9yIChmID0gMTsgZiA8IG5fdGg7IGYrKykgeworICAgICAga21wX2luZm9fdCAqdGggPSB0ZWFtLT50LnRfdGhyZWFkc1tmXTsKKyAgICAgIEtNUF9ERUJVR19BU1NFUlQodGggIT0gTlVMTCk7CisgICAgICB0aC0+dGgudGhfZmlyc3RfcGxhY2UgPSBmaXJzdF9wbGFjZTsKKyAgICAgIHRoLT50aC50aF9sYXN0X3BsYWNlID0gbGFzdF9wbGFjZTsKKyAgICAgIHRoLT50aC50aF9uZXdfcGxhY2UgPSBtYXN0ZXJzX3BsYWNlOworCisgICAgICBLQV9UUkFDRSgxMDAsICgiX19rbXBfcGFydGl0aW9uX3BsYWNlczogbWFzdGVyOiBUIyVkKCVkOiVkKSBwbGFjZSAlZCAiCisgICAgICAgICAgICAgICAgICAgICAicGFydGl0aW9uID0gWyVkLCVkXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGVhbS0+dC50X3RocmVhZHNbZl0pLCB0ZWFtLT50LnRfaWQsCisgICAgICAgICAgICAgICAgICAgICBmLCBtYXN0ZXJzX3BsYWNlLCBmaXJzdF9wbGFjZSwgbGFzdF9wbGFjZSkpOworICAgIH0KKyAgfSBicmVhazsKKworICBjYXNlIHByb2NfYmluZF9jbG9zZTogeworICAgIGludCBmOworICAgIGludCBuX3RoID0gdGVhbS0+dC50X25wcm9jOworICAgIGludCBuX3BsYWNlczsKKyAgICBpZiAoZmlyc3RfcGxhY2UgPD0gbGFzdF9wbGFjZSkgeworICAgICAgbl9wbGFjZXMgPSBsYXN0X3BsYWNlIC0gZmlyc3RfcGxhY2UgKyAxOworICAgIH0gZWxzZSB7CisgICAgICBuX3BsYWNlcyA9IF9fa21wX2FmZmluaXR5X251bV9tYXNrcyAtIGZpcnN0X3BsYWNlICsgbGFzdF9wbGFjZSArIDE7CisgICAgfQorICAgIGlmIChuX3RoIDw9IG5fcGxhY2VzKSB7CisgICAgICBpbnQgcGxhY2UgPSBtYXN0ZXJzX3BsYWNlOworICAgICAgZm9yIChmID0gMTsgZiA8IG5fdGg7IGYrKykgeworICAgICAgICBrbXBfaW5mb190ICp0aCA9IHRlYW0tPnQudF90aHJlYWRzW2ZdOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRoICE9IE5VTEwpOworCisgICAgICAgIGlmIChwbGFjZSA9PSBsYXN0X3BsYWNlKSB7CisgICAgICAgICAgcGxhY2UgPSBmaXJzdF9wbGFjZTsKKyAgICAgICAgfSBlbHNlIGlmIChwbGFjZSA9PSAoaW50KShfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSAxKSkgeworICAgICAgICAgIHBsYWNlID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwbGFjZSsrOworICAgICAgICB9CisgICAgICAgIHRoLT50aC50aF9maXJzdF9wbGFjZSA9IGZpcnN0X3BsYWNlOworICAgICAgICB0aC0+dGgudGhfbGFzdF9wbGFjZSA9IGxhc3RfcGxhY2U7CisgICAgICAgIHRoLT50aC50aF9uZXdfcGxhY2UgPSBwbGFjZTsKKworICAgICAgICBLQV9UUkFDRSgxMDAsICgiX19rbXBfcGFydGl0aW9uX3BsYWNlczogY2xvc2U6IFQjJWQoJWQ6JWQpIHBsYWNlICVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgInBhcnRpdGlvbiA9IFslZCwlZF1cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGVhbS0+dC50X3RocmVhZHNbZl0pLAorICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIGYsIHBsYWNlLCBmaXJzdF9wbGFjZSwgbGFzdF9wbGFjZSkpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpbnQgUywgcmVtLCBnYXAsIHNfY291bnQ7CisgICAgICBTID0gbl90aCAvIG5fcGxhY2VzOworICAgICAgc19jb3VudCA9IDA7CisgICAgICByZW0gPSBuX3RoIC0gKFMgKiBuX3BsYWNlcyk7CisgICAgICBnYXAgPSByZW0gPiAwID8gbl9wbGFjZXMgLyByZW0gOiBuX3BsYWNlczsKKyAgICAgIGludCBwbGFjZSA9IG1hc3RlcnNfcGxhY2U7CisgICAgICBpbnQgZ2FwX2N0ID0gZ2FwOworICAgICAgZm9yIChmID0gMDsgZiA8IG5fdGg7IGYrKykgeworICAgICAgICBrbXBfaW5mb190ICp0aCA9IHRlYW0tPnQudF90aHJlYWRzW2ZdOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRoICE9IE5VTEwpOworCisgICAgICAgIHRoLT50aC50aF9maXJzdF9wbGFjZSA9IGZpcnN0X3BsYWNlOworICAgICAgICB0aC0+dGgudGhfbGFzdF9wbGFjZSA9IGxhc3RfcGxhY2U7CisgICAgICAgIHRoLT50aC50aF9uZXdfcGxhY2UgPSBwbGFjZTsKKyAgICAgICAgc19jb3VudCsrOworCisgICAgICAgIGlmICgoc19jb3VudCA9PSBTKSAmJiByZW0gJiYgKGdhcF9jdCA9PSBnYXApKSB7CisgICAgICAgICAgLy8gZG8gbm90aGluZywgYWRkIGFuIGV4dHJhIHRocmVhZCB0byBwbGFjZSBvbiBuZXh0IGl0ZXJhdGlvbgorICAgICAgICB9IGVsc2UgaWYgKChzX2NvdW50ID09IFMgKyAxKSAmJiByZW0gJiYgKGdhcF9jdCA9PSBnYXApKSB7CisgICAgICAgICAgLy8gd2UgYWRkZWQgYW4gZXh0cmEgdGhyZWFkIHRvIHRoaXMgcGxhY2U7IG1vdmUgdG8gbmV4dCBwbGFjZQorICAgICAgICAgIGlmIChwbGFjZSA9PSBsYXN0X3BsYWNlKSB7CisgICAgICAgICAgICBwbGFjZSA9IGZpcnN0X3BsYWNlOworICAgICAgICAgIH0gZWxzZSBpZiAocGxhY2UgPT0gKGludCkoX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gMSkpIHsKKyAgICAgICAgICAgIHBsYWNlID0gMDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGxhY2UrKzsKKyAgICAgICAgICB9CisgICAgICAgICAgc19jb3VudCA9IDA7CisgICAgICAgICAgZ2FwX2N0ID0gMTsKKyAgICAgICAgICByZW0tLTsKKyAgICAgICAgfSBlbHNlIGlmIChzX2NvdW50ID09IFMpIHsgLy8gcGxhY2UgZnVsbDsgZG9uJ3QgYWRkIGV4dHJhCisgICAgICAgICAgaWYgKHBsYWNlID09IGxhc3RfcGxhY2UpIHsKKyAgICAgICAgICAgIHBsYWNlID0gZmlyc3RfcGxhY2U7CisgICAgICAgICAgfSBlbHNlIGlmIChwbGFjZSA9PSAoaW50KShfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSAxKSkgeworICAgICAgICAgICAgcGxhY2UgPSAwOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwbGFjZSsrOworICAgICAgICAgIH0KKyAgICAgICAgICBnYXBfY3QrKzsKKyAgICAgICAgICBzX2NvdW50ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIEtBX1RSQUNFKDEwMCwKKyAgICAgICAgICAgICAgICAgKCJfX2ttcF9wYXJ0aXRpb25fcGxhY2VzOiBjbG9zZTogVCMlZCglZDolZCkgcGxhY2UgJWQgIgorICAgICAgICAgICAgICAgICAgInBhcnRpdGlvbiA9IFslZCwlZF1cbiIsCisgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRlYW0tPnQudF90aHJlYWRzW2ZdKSwgdGVhbS0+dC50X2lkLCBmLAorICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX25ld19wbGFjZSwgZmlyc3RfcGxhY2UsIGxhc3RfcGxhY2UpKTsKKyAgICAgIH0KKyAgICAgIEtNUF9ERUJVR19BU1NFUlQocGxhY2UgPT0gbWFzdGVyc19wbGFjZSk7CisgICAgfQorICB9IGJyZWFrOworCisgIGNhc2UgcHJvY19iaW5kX3NwcmVhZDogeworICAgIGludCBmOworICAgIGludCBuX3RoID0gdGVhbS0+dC50X25wcm9jOworICAgIGludCBuX3BsYWNlczsKKyAgICBpbnQgdGhpZHg7CisgICAgaWYgKGZpcnN0X3BsYWNlIDw9IGxhc3RfcGxhY2UpIHsKKyAgICAgIG5fcGxhY2VzID0gbGFzdF9wbGFjZSAtIGZpcnN0X3BsYWNlICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgbl9wbGFjZXMgPSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSBmaXJzdF9wbGFjZSArIGxhc3RfcGxhY2UgKyAxOworICAgIH0KKyAgICBpZiAobl90aCA8PSBuX3BsYWNlcykgeworICAgICAgaW50IHBsYWNlID0gbWFzdGVyc19wbGFjZTsKKyAgICAgIGludCBTID0gbl9wbGFjZXMgLyBuX3RoOworICAgICAgaW50IHNfY291bnQsIHJlbSwgZ2FwLCBnYXBfY3Q7CisgICAgICByZW0gPSBuX3BsYWNlcyAtIG5fdGggKiBTOworICAgICAgZ2FwID0gcmVtID8gbl90aCAvIHJlbSA6IDE7CisgICAgICBnYXBfY3QgPSBnYXA7CisgICAgICB0aGlkeCA9IG5fdGg7CisgICAgICBpZiAodXBkYXRlX21hc3Rlcl9vbmx5ID09IDEpCisgICAgICAgIHRoaWR4ID0gMTsKKyAgICAgIGZvciAoZiA9IDA7IGYgPCB0aGlkeDsgZisrKSB7CisgICAgICAgIGttcF9pbmZvX3QgKnRoID0gdGVhbS0+dC50X3RocmVhZHNbZl07CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGggIT0gTlVMTCk7CisKKyAgICAgICAgdGgtPnRoLnRoX2ZpcnN0X3BsYWNlID0gcGxhY2U7CisgICAgICAgIHRoLT50aC50aF9uZXdfcGxhY2UgPSBwbGFjZTsKKyAgICAgICAgc19jb3VudCA9IDE7CisgICAgICAgIHdoaWxlIChzX2NvdW50IDwgUykgeworICAgICAgICAgIGlmIChwbGFjZSA9PSBsYXN0X3BsYWNlKSB7CisgICAgICAgICAgICBwbGFjZSA9IGZpcnN0X3BsYWNlOworICAgICAgICAgIH0gZWxzZSBpZiAocGxhY2UgPT0gKGludCkoX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gMSkpIHsKKyAgICAgICAgICAgIHBsYWNlID0gMDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGxhY2UrKzsKKyAgICAgICAgICB9CisgICAgICAgICAgc19jb3VudCsrOworICAgICAgICB9CisgICAgICAgIGlmIChyZW0gJiYgKGdhcF9jdCA9PSBnYXApKSB7CisgICAgICAgICAgaWYgKHBsYWNlID09IGxhc3RfcGxhY2UpIHsKKyAgICAgICAgICAgIHBsYWNlID0gZmlyc3RfcGxhY2U7CisgICAgICAgICAgfSBlbHNlIGlmIChwbGFjZSA9PSAoaW50KShfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSAxKSkgeworICAgICAgICAgICAgcGxhY2UgPSAwOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwbGFjZSsrOworICAgICAgICAgIH0KKyAgICAgICAgICByZW0tLTsKKyAgICAgICAgICBnYXBfY3QgPSAwOworICAgICAgICB9CisgICAgICAgIHRoLT50aC50aF9sYXN0X3BsYWNlID0gcGxhY2U7CisgICAgICAgIGdhcF9jdCsrOworCisgICAgICAgIGlmIChwbGFjZSA9PSBsYXN0X3BsYWNlKSB7CisgICAgICAgICAgcGxhY2UgPSBmaXJzdF9wbGFjZTsKKyAgICAgICAgfSBlbHNlIGlmIChwbGFjZSA9PSAoaW50KShfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSAxKSkgeworICAgICAgICAgIHBsYWNlID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwbGFjZSsrOworICAgICAgICB9CisKKyAgICAgICAgS0FfVFJBQ0UoMTAwLCAoIl9fa21wX3BhcnRpdGlvbl9wbGFjZXM6IHNwcmVhZDogVCMlZCglZDolZCkgcGxhY2UgJWQgIgorICAgICAgICAgICAgICAgICAgICAgICAicGFydGl0aW9uID0gWyVkLCVkXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0ZWFtLT50LnRfdGhyZWFkc1tmXSksCisgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgZiwgdGgtPnRoLnRoX25ld19wbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2ZpcnN0X3BsYWNlLCB0aC0+dGgudGhfbGFzdF9wbGFjZSkpOworICAgICAgfQorICAgICAgS01QX0RFQlVHX0FTU0VSVCh1cGRhdGVfbWFzdGVyX29ubHkgfHwgcGxhY2UgPT0gbWFzdGVyc19wbGFjZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGludCBTLCByZW0sIGdhcCwgc19jb3VudDsKKyAgICAgIFMgPSBuX3RoIC8gbl9wbGFjZXM7CisgICAgICBzX2NvdW50ID0gMDsKKyAgICAgIHJlbSA9IG5fdGggLSAoUyAqIG5fcGxhY2VzKTsKKyAgICAgIGdhcCA9IHJlbSA+IDAgPyBuX3BsYWNlcyAvIHJlbSA6IG5fcGxhY2VzOworICAgICAgaW50IHBsYWNlID0gbWFzdGVyc19wbGFjZTsKKyAgICAgIGludCBnYXBfY3QgPSBnYXA7CisgICAgICB0aGlkeCA9IG5fdGg7CisgICAgICBpZiAodXBkYXRlX21hc3Rlcl9vbmx5ID09IDEpCisgICAgICAgIHRoaWR4ID0gMTsKKyAgICAgIGZvciAoZiA9IDA7IGYgPCB0aGlkeDsgZisrKSB7CisgICAgICAgIGttcF9pbmZvX3QgKnRoID0gdGVhbS0+dC50X3RocmVhZHNbZl07CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGggIT0gTlVMTCk7CisKKyAgICAgICAgdGgtPnRoLnRoX2ZpcnN0X3BsYWNlID0gcGxhY2U7CisgICAgICAgIHRoLT50aC50aF9sYXN0X3BsYWNlID0gcGxhY2U7CisgICAgICAgIHRoLT50aC50aF9uZXdfcGxhY2UgPSBwbGFjZTsKKyAgICAgICAgc19jb3VudCsrOworCisgICAgICAgIGlmICgoc19jb3VudCA9PSBTKSAmJiByZW0gJiYgKGdhcF9jdCA9PSBnYXApKSB7CisgICAgICAgICAgLy8gZG8gbm90aGluZywgYWRkIGFuIGV4dHJhIHRocmVhZCB0byBwbGFjZSBvbiBuZXh0IGl0ZXJhdGlvbgorICAgICAgICB9IGVsc2UgaWYgKChzX2NvdW50ID09IFMgKyAxKSAmJiByZW0gJiYgKGdhcF9jdCA9PSBnYXApKSB7CisgICAgICAgICAgLy8gd2UgYWRkZWQgYW4gZXh0cmEgdGhyZWFkIHRvIHRoaXMgcGxhY2U7IG1vdmUgb24gdG8gbmV4dCBwbGFjZQorICAgICAgICAgIGlmIChwbGFjZSA9PSBsYXN0X3BsYWNlKSB7CisgICAgICAgICAgICBwbGFjZSA9IGZpcnN0X3BsYWNlOworICAgICAgICAgIH0gZWxzZSBpZiAocGxhY2UgPT0gKGludCkoX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gMSkpIHsKKyAgICAgICAgICAgIHBsYWNlID0gMDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGxhY2UrKzsKKyAgICAgICAgICB9CisgICAgICAgICAgc19jb3VudCA9IDA7CisgICAgICAgICAgZ2FwX2N0ID0gMTsKKyAgICAgICAgICByZW0tLTsKKyAgICAgICAgfSBlbHNlIGlmIChzX2NvdW50ID09IFMpIHsgLy8gcGxhY2UgaXMgZnVsbDsgZG9uJ3QgYWRkIGV4dHJhIHRocmVhZAorICAgICAgICAgIGlmIChwbGFjZSA9PSBsYXN0X3BsYWNlKSB7CisgICAgICAgICAgICBwbGFjZSA9IGZpcnN0X3BsYWNlOworICAgICAgICAgIH0gZWxzZSBpZiAocGxhY2UgPT0gKGludCkoX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gMSkpIHsKKyAgICAgICAgICAgIHBsYWNlID0gMDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGxhY2UrKzsKKyAgICAgICAgICB9CisgICAgICAgICAgZ2FwX2N0Kys7CisgICAgICAgICAgc19jb3VudCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBLQV9UUkFDRSgxMDAsICgiX19rbXBfcGFydGl0aW9uX3BsYWNlczogc3ByZWFkOiBUIyVkKCVkOiVkKSBwbGFjZSAlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICJwYXJ0aXRpb24gPSBbJWQsJWRdXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRlYW0tPnQudF90aHJlYWRzW2ZdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBmLCB0aC0+dGgudGhfbmV3X3BsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfZmlyc3RfcGxhY2UsIHRoLT50aC50aF9sYXN0X3BsYWNlKSk7CisgICAgICB9CisgICAgICBLTVBfREVCVUdfQVNTRVJUKHVwZGF0ZV9tYXN0ZXJfb25seSB8fCBwbGFjZSA9PSBtYXN0ZXJzX3BsYWNlKTsKKyAgICB9CisgIH0gYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQorCisgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3BhcnRpdGlvbl9wbGFjZXM6IGV4aXQgVCMlZFxuIiwgdGVhbS0+dC50X2lkKSk7Cit9CisKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKKy8qIGFsbG9jYXRlIGEgbmV3IHRlYW0gZGF0YSBzdHJ1Y3R1cmUgdG8gdXNlLiAgdGFrZSBvbmUgb2ZmIG9mIHRoZSBmcmVlIHBvb2wgaWYKKyAgIGF2YWlsYWJsZSAqLwora21wX3RlYW1fdCAqCitfX2ttcF9hbGxvY2F0ZV90ZWFtKGttcF9yb290X3QgKnJvb3QsIGludCBuZXdfbnByb2MsIGludCBtYXhfbnByb2MsCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBvbXB0X3BhcmFsbGVsX2lkLAorI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAga21wX3Byb2NfYmluZF90IG5ld19wcm9jX2JpbmQsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCAqbmV3X2ljdnMsCisgICAgICAgICAgICAgICAgICAgIGludCBhcmdjIFVTRV9ORVNURURfSE9UX0FSRyhrbXBfaW5mb190ICptYXN0ZXIpKSB7CisgIEtNUF9USU1FX0RFVkVMT1BFUl9QQVJUSVRJT05FRF9CTE9DSyhLTVBfYWxsb2NhdGVfdGVhbSk7CisgIGludCBmOworICBrbXBfdGVhbV90ICp0ZWFtOworICBpbnQgdXNlX2hvdF90ZWFtID0gIXJvb3QtPnIucl9hY3RpdmU7CisgIGludCBsZXZlbCA9IDA7CisKKyAgS0FfVFJBQ0UoMjAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogY2FsbGVkXG4iKSk7CisgIEtNUF9ERUJVR19BU1NFUlQobmV3X25wcm9jID49IDEgJiYgYXJnYyA+PSAwKTsKKyAgS01QX0RFQlVHX0FTU0VSVChtYXhfbnByb2MgPj0gbmV3X25wcm9jKTsKKyAgS01QX01CKCk7CisKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICBrbXBfaG90X3RlYW1fcHRyX3QgKmhvdF90ZWFtczsKKyAgaWYgKG1hc3RlcikgeworICAgIHRlYW0gPSBtYXN0ZXItPnRoLnRoX3RlYW07CisgICAgbGV2ZWwgPSB0ZWFtLT50LnRfYWN0aXZlX2xldmVsOworICAgIGlmIChtYXN0ZXItPnRoLnRoX3RlYW1zX21pY3JvdGFzaykgeyAvLyBpbiB0ZWFtcyBjb25zdHJ1Y3Q/CisgICAgICBpZiAobWFzdGVyLT50aC50aF90ZWFtc19zaXplLm50ZWFtcyA+IDEgJiYKKyAgICAgICAgICAoIC8vICN0ZWFtcyA+IDEKKyAgICAgICAgICAgICAgdGVhbS0+dC50X3BrZm4gPT0KKyAgICAgICAgICAgICAgICAgIChtaWNyb3Rhc2tfdClfX2ttcF90ZWFtc19tYXN0ZXIgfHwgLy8gaW5uZXIgZm9yayBvZiB0aGUgdGVhbXMKKyAgICAgICAgICAgICAgbWFzdGVyLT50aC50aF90ZWFtc19sZXZlbCA8CisgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfbGV2ZWwpKSB7IC8vIG9yIG5lc3RlZCBwYXJhbGxlbCBpbnNpZGUgdGhlIHRlYW1zCisgICAgICAgICsrbGV2ZWw7IC8vIG5vdCBpbmNyZW1lbnQgaWYgI3RlYW1zPT0xLCBvciBmb3Igb3V0ZXIgZm9yayBvZiB0aGUgdGVhbXM7CisgICAgICAgIC8vIGluY3JlbWVudCBvdGhlcndpc2UKKyAgICAgIH0KKyAgICB9CisgICAgaG90X3RlYW1zID0gbWFzdGVyLT50aC50aF9ob3RfdGVhbXM7CisgICAgaWYgKGxldmVsIDwgX19rbXBfaG90X3RlYW1zX21heF9sZXZlbCAmJiBob3RfdGVhbXMgJiYKKyAgICAgICAgaG90X3RlYW1zW2xldmVsXQorICAgICAgICAgICAgLmhvdF90ZWFtKSB7IC8vIGhvdCB0ZWFtIGhhcyBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGZvciBnaXZlbiBsZXZlbAorICAgICAgdXNlX2hvdF90ZWFtID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgdXNlX2hvdF90ZWFtID0gMDsKKyAgICB9CisgIH0KKyNlbmRpZgorICAvLyBPcHRpbWl6YXRpb24gdG8gdXNlIGEgImhvdCIgdGVhbQorICBpZiAodXNlX2hvdF90ZWFtICYmIG5ld19ucHJvYyA+IDEpIHsKKyAgICBLTVBfREVCVUdfQVNTRVJUKG5ld19ucHJvYyA9PSBtYXhfbnByb2MpOworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgdGVhbSA9IGhvdF90ZWFtc1tsZXZlbF0uaG90X3RlYW07CisjZWxzZQorICAgIHRlYW0gPSByb290LT5yLnJfaG90X3RlYW07CisjZW5kaWYKKyNpZiBLTVBfREVCVUcKKyAgICBpZiAoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2FsbG9jYXRlX3RlYW06IGhvdCB0ZWFtIHRhc2tfdGVhbVswXSA9ICVwICIKKyAgICAgICAgICAgICAgICAgICAgInRhc2tfdGVhbVsxXSA9ICVwIGJlZm9yZSByZWluaXRcbiIsCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF90YXNrX3RlYW1bMF0sIHRlYW0tPnQudF90YXNrX3RlYW1bMV0pKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIEhhcyB0aGUgbnVtYmVyIG9mIHRocmVhZHMgY2hhbmdlZD8KKyAgICAvKiBMZXQncyBhc3N1bWUgdGhlIG1vc3QgY29tbW9uIGNhc2UgaXMgdGhhdCB0aGUgbnVtYmVyIG9mIHRocmVhZHMgaXMKKyAgICAgICB1bmNoYW5nZWQsIGFuZCBwdXQgdGhhdCBjYXNlIGZpcnN0LiAqLworICAgIGlmICh0ZWFtLT50LnRfbnByb2MgPT0gbmV3X25wcm9jKSB7IC8vIENoZWNrIGNoYW5nZXMgaW4gbnVtYmVyIG9mIHRocmVhZHMKKyAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2FsbG9jYXRlX3RlYW06IHJldXNpbmcgaG90IHRlYW1cbiIpKTsKKyAgICAgIC8vIFRoaXMgY2FzZSBjYW4gbWVhbiB0aGF0IG9tcF9zZXRfbnVtX3RocmVhZHMoKSB3YXMgY2FsbGVkIGFuZCB0aGUgaG90CisgICAgICAvLyB0ZWFtIHNpemUgd2FzIGFscmVhZHkgcmVkdWNlZCwgc28gd2UgY2hlY2sgdGhlIHNwZWNpYWwgZmxhZworICAgICAgaWYgKHRlYW0tPnQudF9zaXplX2NoYW5nZWQgPT0gLTEpIHsKKyAgICAgICAgdGVhbS0+dC50X3NpemVfY2hhbmdlZCA9IDE7CisgICAgICB9IGVsc2UgeworICAgICAgICBLTVBfQ0hFQ0tfVVBEQVRFKHRlYW0tPnQudF9zaXplX2NoYW5nZWQsIDApOworICAgICAgfQorCisgICAgICAvLyBUT0RPPz8/OiB0ZWFtLT50LnRfbWF4X2FjdGl2ZV9sZXZlbHMgPSBuZXdfbWF4X2FjdGl2ZV9sZXZlbHM7CisgICAgICBrbXBfcl9zY2hlZF90IG5ld19zY2hlZCA9IG5ld19pY3ZzLT5zY2hlZDsKKyAgICAgIGlmICh0ZWFtLT50LnRfc2NoZWQucl9zY2hlZF90eXBlICE9IG5ld19zY2hlZC5yX3NjaGVkX3R5cGUgfHwKKyAgICAgICAgICB0ZWFtLT50LnRfc2NoZWQuY2h1bmsgIT0gbmV3X3NjaGVkLmNodW5rKQorICAgICAgICB0ZWFtLT50LnRfc2NoZWQgPQorICAgICAgICAgICAgbmV3X3NjaGVkOyAvLyBzZXQgbWFzdGVyJ3Mgc2NoZWR1bGUgYXMgbmV3IHJ1bi10aW1lIHNjaGVkdWxlCisKKyAgICAgIF9fa21wX3JlaW5pdGlhbGl6ZV90ZWFtKHRlYW0sIG5ld19pY3ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdC0+ci5yX3ViZXJfdGhyZWFkLT50aC50aF9pZGVudCk7CisKKyAgICAgIEtGX1RSQUNFKDEwLCAoIl9fa21wX2FsbG9jYXRlX3RlYW0yOiBUIyVkLCB0aGlzX3RocmVhZD0lcCB0ZWFtPSVwXG4iLCAwLAorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1swXSwgdGVhbSkpOworICAgICAgX19rbXBfcHVzaF9jdXJyZW50X3Rhc2tfdG9fdGhyZWFkKHRlYW0tPnQudF90aHJlYWRzWzBdLCB0ZWFtLCAwKTsKKworI2lmIE9NUF80MF9FTkFCTEVECisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgaWYgKCh0ZWFtLT50LnRfc2l6ZV9jaGFuZ2VkID09IDApICYmCisgICAgICAgICAgKHRlYW0tPnQudF9wcm9jX2JpbmQgPT0gbmV3X3Byb2NfYmluZCkpIHsKKyAgICAgICAgaWYgKG5ld19wcm9jX2JpbmQgPT0gcHJvY19iaW5kX3NwcmVhZCkgeworICAgICAgICAgIF9fa21wX3BhcnRpdGlvbl9wbGFjZXMoCisgICAgICAgICAgICAgIHRlYW0sIDEpOyAvLyBhZGQgZmxhZyB0byB1cGRhdGUgb25seSBtYXN0ZXIgZm9yIHNwcmVhZAorICAgICAgICB9CisgICAgICAgIEtBX1RSQUNFKDIwMCwgKCJfX2ttcF9hbGxvY2F0ZV90ZWFtOiByZXVzaW5nIGhvdCB0ZWFtICMlZCBiaW5kaW5nczogIgorICAgICAgICAgICAgICAgICAgICAgICAicHJvY19iaW5kID0gJWQsIHBhcnRpdGlvbiA9IFslZCwlZF1cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgbmV3X3Byb2NfYmluZCwgdGVhbS0+dC50X2ZpcnN0X3BsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfbGFzdF9wbGFjZSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0NIRUNLX1VQREFURSh0ZWFtLT50LnRfcHJvY19iaW5kLCBuZXdfcHJvY19iaW5kKTsKKyAgICAgICAgX19rbXBfcGFydGl0aW9uX3BsYWNlcyh0ZWFtKTsKKyAgICAgIH0KKyNlbHNlCisgICAgICBLTVBfQ0hFQ0tfVVBEQVRFKHRlYW0tPnQudF9wcm9jX2JpbmQsIG5ld19wcm9jX2JpbmQpOworI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgIH0gZWxzZSBpZiAodGVhbS0+dC50X25wcm9jID4gbmV3X25wcm9jKSB7CisgICAgICBLQV9UUkFDRSgyMCwKKyAgICAgICAgICAgICAgICgiX19rbXBfYWxsb2NhdGVfdGVhbTogZGVjcmVhc2luZyBob3QgdGVhbSB0aHJlYWQgY291bnQgdG8gJWRcbiIsCisgICAgICAgICAgICAgICAgbmV3X25wcm9jKSk7CisKKyAgICAgIHRlYW0tPnQudF9zaXplX2NoYW5nZWQgPSAxOworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgICBpZiAoX19rbXBfaG90X3RlYW1zX21vZGUgPT0gMCkgeworICAgICAgICAvLyBBQzogc2F2ZWQgbnVtYmVyIG9mIHRocmVhZHMgc2hvdWxkIGNvcnJlc3BvbmQgdG8gdGVhbSdzIHZhbHVlIGluIHRoaXMKKyAgICAgICAgLy8gbW9kZSwgY2FuIGJlIGJpZ2dlciBpbiBtb2RlIDEsIHdoZW4gaG90IHRlYW0gaGFzIHRocmVhZHMgaW4gcmVzZXJ2ZQorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGhvdF90ZWFtc1tsZXZlbF0uaG90X3RlYW1fbnRoID09IHRlYW0tPnQudF9ucHJvYyk7CisgICAgICAgIGhvdF90ZWFtc1tsZXZlbF0uaG90X3RlYW1fbnRoID0gbmV3X25wcm9jOworI2VuZGlmIC8vIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgICAgIC8qIHJlbGVhc2UgdGhlIGV4dHJhIHRocmVhZHMgd2UgZG9uJ3QgbmVlZCBhbnkgbW9yZSAqLworICAgICAgICBmb3IgKGYgPSBuZXdfbnByb2M7IGYgPCB0ZWFtLT50LnRfbnByb2M7IGYrKykgeworICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbS0+dC50X3RocmVhZHNbZl0pOworICAgICAgICAgIGlmIChfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYykgeworICAgICAgICAgICAgLy8gV2hlbiBkZWNyZWFzaW5nIHRlYW0gc2l6ZSwgdGhyZWFkcyBubyBsb25nZXIgaW4gdGhlIHRlYW0gc2hvdWxkCisgICAgICAgICAgICAvLyB1bnJlZiB0YXNrIHRlYW0uCisgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1tmXS0+dGgudGhfdGFza190ZWFtID0gTlVMTDsKKyAgICAgICAgICB9CisgICAgICAgICAgX19rbXBfZnJlZV90aHJlYWQodGVhbS0+dC50X3RocmVhZHNbZl0pOworICAgICAgICAgIHRlYW0tPnQudF90aHJlYWRzW2ZdID0gTlVMTDsKKyAgICAgICAgfQorI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgICB9IC8vIChfX2ttcF9ob3RfdGVhbXNfbW9kZSA9PSAwKQorICAgICAgZWxzZSB7CisgICAgICAgIC8vIFdoZW4ga2VlcGluZyBleHRyYSB0aHJlYWRzIGluIHRlYW0sIHN3aXRjaCB0aHJlYWRzIHRvIHdhaXQgb24gb3duCisgICAgICAgIC8vIGJfZ28gZmxhZworICAgICAgICBmb3IgKGYgPSBuZXdfbnByb2M7IGYgPCB0ZWFtLT50LnRfbnByb2M7ICsrZikgeworICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbS0+dC50X3RocmVhZHNbZl0pOworICAgICAgICAgIGttcF9iYWxpZ25fdCAqYmFsaWduID0gdGVhbS0+dC50X3RocmVhZHNbZl0tPnRoLnRoX2JhcjsKKyAgICAgICAgICBmb3IgKGludCBiID0gMDsgYiA8IGJzX2xhc3RfYmFycmllcjsgKytiKSB7CisgICAgICAgICAgICBpZiAoYmFsaWduW2JdLmJiLndhaXRfZmxhZyA9PSBLTVBfQkFSUklFUl9QQVJFTlRfRkxBRykgeworICAgICAgICAgICAgICBiYWxpZ25bYl0uYmIud2FpdF9mbGFnID0gS01QX0JBUlJJRVJfU1dJVENIX1RPX09XTl9GTEFHOworICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX0NIRUNLX1VQREFURShiYWxpZ25bYl0uYmIubGVhZl9raWRzLCAwKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyNlbmRpZiAvLyBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgICAgdGVhbS0+dC50X25wcm9jID0gbmV3X25wcm9jOworICAgICAgLy8gVE9ETz8/PzogdGVhbS0+dC50X21heF9hY3RpdmVfbGV2ZWxzID0gbmV3X21heF9hY3RpdmVfbGV2ZWxzOworICAgICAgaWYgKHRlYW0tPnQudF9zY2hlZC5yX3NjaGVkX3R5cGUgIT0gbmV3X2ljdnMtPnNjaGVkLnJfc2NoZWRfdHlwZSB8fAorICAgICAgICAgIHRlYW0tPnQudF9zY2hlZC5jaHVuayAhPSBuZXdfaWN2cy0+c2NoZWQuY2h1bmspCisgICAgICAgIHRlYW0tPnQudF9zY2hlZCA9IG5ld19pY3ZzLT5zY2hlZDsKKyAgICAgIF9fa21wX3JlaW5pdGlhbGl6ZV90ZWFtKHRlYW0sIG5ld19pY3ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdC0+ci5yX3ViZXJfdGhyZWFkLT50aC50aF9pZGVudCk7CisKKyAgICAgIC8qIHVwZGF0ZSB0aGUgcmVtYWluaW5nIHRocmVhZHMgKi8KKyAgICAgIGZvciAoZiA9IDA7IGYgPCBuZXdfbnByb2M7ICsrZikgeworICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1tmXS0+dGgudGhfdGVhbV9ucHJvYyA9IG5ld19ucHJvYzsKKyAgICAgIH0KKyAgICAgIC8vIHJlc3RvcmUgdGhlIGN1cnJlbnQgdGFzayBzdGF0ZSBvZiB0aGUgbWFzdGVyIHRocmVhZDogc2hvdWxkIGJlIHRoZQorICAgICAgLy8gaW1wbGljaXQgdGFzaworICAgICAgS0ZfVFJBQ0UoMTAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogVCMlZCwgdGhpc190aHJlYWQ9JXAgdGVhbT0lcFxuIiwgMCwKKyAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbMF0sIHRlYW0pKTsKKworICAgICAgX19rbXBfcHVzaF9jdXJyZW50X3Rhc2tfdG9fdGhyZWFkKHRlYW0tPnQudF90aHJlYWRzWzBdLCB0ZWFtLCAwKTsKKworI2lmZGVmIEtNUF9ERUJVRworICAgICAgZm9yIChmID0gMDsgZiA8IHRlYW0tPnQudF9ucHJvYzsgZisrKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbS0+dC50X3RocmVhZHNbZl0gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1tmXS0+dGgudGhfdGVhbV9ucHJvYyA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfbnByb2MpOworICAgICAgfQorI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgS01QX0NIRUNLX1VQREFURSh0ZWFtLT50LnRfcHJvY19iaW5kLCBuZXdfcHJvY19iaW5kKTsKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICBfX2ttcF9wYXJ0aXRpb25fcGxhY2VzKHRlYW0pOworI2VuZGlmCisjZW5kaWYKKyAgICB9IGVsc2UgeyAvLyB0ZWFtLT50LnRfbnByb2MgPCBuZXdfbnByb2MKKyNpZiBLTVBfT1NfTElOVVggJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAga21wX2FmZmluX21hc2tfdCAqb2xkX21hc2s7CisgICAgICBpZiAoS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgICAgICBLTVBfQ1BVX0FMTE9DKG9sZF9tYXNrKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBLQV9UUkFDRSgyMCwKKyAgICAgICAgICAgICAgICgiX19rbXBfYWxsb2NhdGVfdGVhbTogaW5jcmVhc2luZyBob3QgdGVhbSB0aHJlYWQgY291bnQgdG8gJWRcbiIsCisgICAgICAgICAgICAgICAgbmV3X25wcm9jKSk7CisKKyAgICAgIHRlYW0tPnQudF9zaXplX2NoYW5nZWQgPSAxOworCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgIGludCBhdmFpbF90aHJlYWRzID0gaG90X3RlYW1zW2xldmVsXS5ob3RfdGVhbV9udGg7CisgICAgICBpZiAobmV3X25wcm9jIDwgYXZhaWxfdGhyZWFkcykKKyAgICAgICAgYXZhaWxfdGhyZWFkcyA9IG5ld19ucHJvYzsKKyAgICAgIGttcF9pbmZvX3QgKipvdGhlcl90aHJlYWRzID0gdGVhbS0+dC50X3RocmVhZHM7CisgICAgICBmb3IgKGYgPSB0ZWFtLT50LnRfbnByb2M7IGYgPCBhdmFpbF90aHJlYWRzOyArK2YpIHsKKyAgICAgICAgLy8gQWRqdXN0IGJhcnJpZXIgZGF0YSBvZiByZXNlcnZlZCB0aHJlYWRzIChpZiBhbnkpIG9mIHRoZSB0ZWFtCisgICAgICAgIC8vIE90aGVyIGRhdGEgd2lsbCBiZSBzZXQgaW4gX19rbXBfaW5pdGlhbGl6ZV9pbmZvKCkgYmVsb3cuCisgICAgICAgIGludCBiOworICAgICAgICBrbXBfYmFsaWduX3QgKmJhbGlnbiA9IG90aGVyX3RocmVhZHNbZl0tPnRoLnRoX2JhcjsKKyAgICAgICAgZm9yIChiID0gMDsgYiA8IGJzX2xhc3RfYmFycmllcjsgKytiKSB7CisgICAgICAgICAgYmFsaWduW2JdLmJiLmJfYXJyaXZlZCA9IHRlYW0tPnQudF9iYXJbYl0uYl9hcnJpdmVkOworICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYmFsaWduW2JdLmJiLndhaXRfZmxhZyAhPSBLTVBfQkFSUklFUl9QQVJFTlRfRkxBRyk7CisjaWYgVVNFX0RFQlVHR0VSCisgICAgICAgICAgYmFsaWduW2JdLmJiLmJfd29ya2VyX2Fycml2ZWQgPSB0ZWFtLT50LnRfYmFyW2JdLmJfdGVhbV9hcnJpdmVkOworI2VuZGlmCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChob3RfdGVhbXNbbGV2ZWxdLmhvdF90ZWFtX250aCA+PSBuZXdfbnByb2MpIHsKKyAgICAgICAgLy8gd2UgaGF2ZSBhbGwgbmVlZGVkIHRocmVhZHMgaW4gcmVzZXJ2ZSwgbm8gbmVlZCB0byBhbGxvY2F0ZSBhbnkKKyAgICAgICAgLy8gdGhpcyBvbmx5IHBvc3NpYmxlIGluIG1vZGUgMSwgY2Fubm90IGhhdmUgcmVzZXJ2ZWQgdGhyZWFkcyBpbiBtb2RlIDAKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9ob3RfdGVhbXNfbW9kZSA9PSAxKTsKKyAgICAgICAgdGVhbS0+dC50X25wcm9jID0gbmV3X25wcm9jOyAvLyBqdXN0IGdldCByZXNlcnZlZCB0aHJlYWRzIGludm9sdmVkCisgICAgICB9IGVsc2UgeworICAgICAgICAvLyB3ZSBtYXkgaGF2ZSBzb21lIHRocmVhZHMgaW4gcmVzZXJ2ZSwgYnV0IG5vdCBlbm91Z2gKKyAgICAgICAgdGVhbS0+dC50X25wcm9jID0KKyAgICAgICAgICAgIGhvdF90ZWFtc1tsZXZlbF0KKyAgICAgICAgICAgICAgICAuaG90X3RlYW1fbnRoOyAvLyBnZXQgcmVzZXJ2ZWQgdGhyZWFkcyBpbnZvbHZlZCBpZiBhbnkKKyAgICAgICAgaG90X3RlYW1zW2xldmVsXS5ob3RfdGVhbV9udGggPSBuZXdfbnByb2M7IC8vIGFkanVzdCBob3QgdGVhbSBtYXggc2l6ZQorI2VuZGlmIC8vIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgICAgIGlmICh0ZWFtLT50LnRfbWF4X25wcm9jIDwgbmV3X25wcm9jKSB7CisgICAgICAgICAgLyogcmVhbGxvY2F0ZSBsYXJnZXIgYXJyYXlzICovCisgICAgICAgICAgX19rbXBfcmVhbGxvY2F0ZV90ZWFtX2FycmF5cyh0ZWFtLCBuZXdfbnByb2MpOworICAgICAgICAgIF9fa21wX3JlaW5pdGlhbGl6ZV90ZWFtKHRlYW0sIG5ld19pY3ZzLCBOVUxMKTsKKyAgICAgICAgfQorCisjaWYgS01QX09TX0xJTlVYICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgLyogVGVtcG9yYXJpbHkgc2V0IGZ1bGwgbWFzayBmb3IgbWFzdGVyIHRocmVhZCBiZWZvcmUgY3JlYXRpb24gb2YKKyAgICAgICAgICAgd29ya2Vycy4gVGhlIHJlYXNvbiBpcyB0aGF0IHdvcmtlcnMgaW5oZXJpdCB0aGUgYWZmaW5pdHkgZnJvbSBtYXN0ZXIsCisgICAgICAgICAgIHNvIGlmIGEgbG90IG9mIHdvcmtlcnMgYXJlIGNyZWF0ZWQgb24gdGhlIHNpbmdsZSBjb3JlIHF1aWNrbHksIHRoZXkKKyAgICAgICAgICAgZG9uJ3QgZ2V0IGEgY2hhbmNlIHRvIHNldCB0aGVpciBvd24gYWZmaW5pdHkgZm9yIGEgbG9uZyB0aW1lLiAqLworICAgICAgICBfX2ttcF9zZXRfdGhyZWFkX2FmZmluaXR5X21hc2tfZnVsbF90bXAob2xkX21hc2spOworI2VuZGlmCisKKyAgICAgICAgLyogYWxsb2NhdGUgbmV3IHRocmVhZHMgZm9yIHRoZSBob3QgdGVhbSAqLworICAgICAgICBmb3IgKGYgPSB0ZWFtLT50LnRfbnByb2M7IGYgPCBuZXdfbnByb2M7IGYrKykgeworICAgICAgICAgIGttcF9pbmZvX3QgKm5ld193b3JrZXIgPSBfX2ttcF9hbGxvY2F0ZV90aHJlYWQocm9vdCwgdGVhbSwgZik7CisgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChuZXdfd29ya2VyKTsKKyAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1tmXSA9IG5ld193b3JrZXI7CisKKyAgICAgICAgICBLQV9UUkFDRSgyMCwKKyAgICAgICAgICAgICAgICAgICAoIl9fa21wX2FsbG9jYXRlX3RlYW06IHRlYW0gJWQgaW5pdCBUIyVkIGFycml2ZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgImpvaW49JWxsdSwgcGxhaW49JWxsdVxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBfX2ttcF9ndGlkX2Zyb21fdGlkKGYsIHRlYW0pLCB0ZWFtLT50LnRfaWQsIGYsCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9iYXJbYnNfZm9ya2pvaW5fYmFycmllcl0uYl9hcnJpdmVkLAorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfYmFyW2JzX3BsYWluX2JhcnJpZXJdLmJfYXJyaXZlZCkpOworCisgICAgICAgICAgeyAvLyBJbml0aWFsaXplIGJhcnJpZXIgZGF0YSBmb3IgbmV3IHRocmVhZHMuCisgICAgICAgICAgICBpbnQgYjsKKyAgICAgICAgICAgIGttcF9iYWxpZ25fdCAqYmFsaWduID0gbmV3X3dvcmtlci0+dGgudGhfYmFyOworICAgICAgICAgICAgZm9yIChiID0gMDsgYiA8IGJzX2xhc3RfYmFycmllcjsgKytiKSB7CisgICAgICAgICAgICAgIGJhbGlnbltiXS5iYi5iX2Fycml2ZWQgPSB0ZWFtLT50LnRfYmFyW2JdLmJfYXJyaXZlZDsKKyAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChiYWxpZ25bYl0uYmIud2FpdF9mbGFnICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0JBUlJJRVJfUEFSRU5UX0ZMQUcpOworI2lmIFVTRV9ERUJVR0dFUgorICAgICAgICAgICAgICBiYWxpZ25bYl0uYmIuYl93b3JrZXJfYXJyaXZlZCA9IHRlYW0tPnQudF9iYXJbYl0uYl90ZWFtX2Fycml2ZWQ7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmIEtNUF9PU19MSU5VWCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIGlmIChLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgICAgLyogUmVzdG9yZSBpbml0aWFsIG1hc3RlciB0aHJlYWQncyBhZmZpbml0eSBtYXNrICovCisgICAgICAgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eShvbGRfbWFzaywgVFJVRSk7CisgICAgICAgICAgS01QX0NQVV9GUkVFKG9sZF9tYXNrKTsKKyAgICAgICAgfQorI2VuZGlmCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgIH0gLy8gZW5kIG9mIGNoZWNrIG9mIHRfbnByb2MgdnMuIG5ld19ucHJvYyB2cy4gaG90X3RlYW1fbnRoCisjZW5kaWYgLy8gS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgIC8qIG1ha2Ugc3VyZSBldmVyeW9uZSBpcyBzeW5jcm9uaXplZCAqLworICAgICAgaW50IG9sZF9ucHJvYyA9IHRlYW0tPnQudF9ucHJvYzsgLy8gc2F2ZSBvbGQgdmFsdWUgYW5kIHVzZSB0byB1cGRhdGUgb25seQorICAgICAgLy8gbmV3IHRocmVhZHMgYmVsb3cKKyAgICAgIF9fa21wX2luaXRpYWxpemVfdGVhbSh0ZWFtLCBuZXdfbnByb2MsIG5ld19pY3ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QtPnIucl91YmVyX3RocmVhZC0+dGgudGhfaWRlbnQpOworCisgICAgICAvKiByZWluaXRpYWxpemUgdGhlIHRocmVhZHMgKi8KKyAgICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbS0+dC50X25wcm9jID09IG5ld19ucHJvYyk7CisgICAgICBmb3IgKGYgPSAwOyBmIDwgdGVhbS0+dC50X25wcm9jOyArK2YpCisgICAgICAgIF9fa21wX2luaXRpYWxpemVfaW5mbyh0ZWFtLT50LnRfdGhyZWFkc1tmXSwgdGVhbSwgZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aWQoZiwgdGVhbSkpOworICAgICAgaWYgKGxldmVsKSB7IC8vIHNldCB0aF90YXNrX3N0YXRlIGZvciBuZXcgdGhyZWFkcyBpbiBuZXN0ZWQgaG90IHRlYW0KKyAgICAgICAgLy8gX19rbXBfaW5pdGlhbGl6ZV9pbmZvKCkgbm8gbG9uZ2VyIHplcm9lcyB0aF90YXNrX3N0YXRlLCBzbyB3ZSBzaG91bGQKKyAgICAgICAgLy8gb25seSBuZWVkIHRvIHNldCB0aGUgdGhfdGFza19zdGF0ZSBmb3IgdGhlIG5ldyB0aHJlYWRzLiB0aF90YXNrX3N0YXRlCisgICAgICAgIC8vIGZvciBtYXN0ZXIgdGhyZWFkIHdpbGwgbm90IGJlIGFjY3VyYXRlIHVudGlsIGFmdGVyIHRoaXMgaW4KKyAgICAgICAgLy8gX19rbXBfZm9ya19jYWxsKCksIHNvIHdlIGxvb2sgdG8gdGhlIG1hc3RlcidzIG1lbW9fc3RhY2sgdG8gZ2V0IHRoZQorICAgICAgICAvLyBjb3JyZWN0IHZhbHVlLgorICAgICAgICBmb3IgKGYgPSBvbGRfbnByb2M7IGYgPCB0ZWFtLT50LnRfbnByb2M7ICsrZikKKyAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1tmXS0+dGgudGhfdGFza19zdGF0ZSA9CisgICAgICAgICAgICAgIHRlYW0tPnQudF90aHJlYWRzWzBdLT50aC50aF90YXNrX3N0YXRlX21lbW9fc3RhY2tbbGV2ZWxdOworICAgICAgfSBlbHNlIHsgLy8gc2V0IHRoX3Rhc2tfc3RhdGUgZm9yIG5ldyB0aHJlYWRzIGluIG5vbi1uZXN0ZWQgaG90IHRlYW0KKyAgICAgICAgaW50IG9sZF9zdGF0ZSA9CisgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1swXS0+dGgudGhfdGFza19zdGF0ZTsgLy8gY29weSBtYXN0ZXIncyBzdGF0ZQorICAgICAgICBmb3IgKGYgPSBvbGRfbnByb2M7IGYgPCB0ZWFtLT50LnRfbnByb2M7ICsrZikKKyAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1tmXS0+dGgudGhfdGFza19zdGF0ZSA9IG9sZF9zdGF0ZTsKKyAgICAgIH0KKworI2lmZGVmIEtNUF9ERUJVRworICAgICAgZm9yIChmID0gMDsgZiA8IHRlYW0tPnQudF9ucHJvYzsgKytmKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbS0+dC50X3RocmVhZHNbZl0gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1tmXS0+dGgudGhfdGVhbV9ucHJvYyA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfbnByb2MpOworICAgICAgfQorI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgS01QX0NIRUNLX1VQREFURSh0ZWFtLT50LnRfcHJvY19iaW5kLCBuZXdfcHJvY19iaW5kKTsKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICBfX2ttcF9wYXJ0aXRpb25fcGxhY2VzKHRlYW0pOworI2VuZGlmCisjZW5kaWYKKyAgICB9IC8vIENoZWNrIGNoYW5nZXMgaW4gbnVtYmVyIG9mIHRocmVhZHMKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAga21wX2luZm9fdCAqbWFzdGVyID0gdGVhbS0+dC50X3RocmVhZHNbMF07CisgICAgaWYgKG1hc3Rlci0+dGgudGhfdGVhbXNfbWljcm90YXNrKSB7CisgICAgICBmb3IgKGYgPSAxOyBmIDwgbmV3X25wcm9jOyArK2YpIHsKKyAgICAgICAgLy8gcHJvcGFnYXRlIHRlYW1zIGNvbnN0cnVjdCBzcGVjaWZpYyBpbmZvIHRvIHdvcmtlcnMKKyAgICAgICAga21wX2luZm9fdCAqdGhyID0gdGVhbS0+dC50X3RocmVhZHNbZl07CisgICAgICAgIHRoci0+dGgudGhfdGVhbXNfbWljcm90YXNrID0gbWFzdGVyLT50aC50aF90ZWFtc19taWNyb3Rhc2s7CisgICAgICAgIHRoci0+dGgudGhfdGVhbXNfbGV2ZWwgPSBtYXN0ZXItPnRoLnRoX3RlYW1zX2xldmVsOworICAgICAgICB0aHItPnRoLnRoX3RlYW1zX3NpemUgPSBtYXN0ZXItPnRoLnRoX3RlYW1zX3NpemU7CisgICAgICB9CisgICAgfQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICBpZiAobGV2ZWwpIHsKKyAgICAgIC8vIFN5bmMgYmFycmllciBzdGF0ZSBmb3IgbmVzdGVkIGhvdCB0ZWFtcywgbm90IG5lZWRlZCBmb3Igb3V0ZXJtb3N0IGhvdAorICAgICAgLy8gdGVhbS4KKyAgICAgIGZvciAoZiA9IDE7IGYgPCBuZXdfbnByb2M7ICsrZikgeworICAgICAgICBrbXBfaW5mb190ICp0aHIgPSB0ZWFtLT50LnRfdGhyZWFkc1tmXTsKKyAgICAgICAgaW50IGI7CisgICAgICAgIGttcF9iYWxpZ25fdCAqYmFsaWduID0gdGhyLT50aC50aF9iYXI7CisgICAgICAgIGZvciAoYiA9IDA7IGIgPCBic19sYXN0X2JhcnJpZXI7ICsrYikgeworICAgICAgICAgIGJhbGlnbltiXS5iYi5iX2Fycml2ZWQgPSB0ZWFtLT50LnRfYmFyW2JdLmJfYXJyaXZlZDsKKyAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGJhbGlnbltiXS5iYi53YWl0X2ZsYWcgIT0gS01QX0JBUlJJRVJfUEFSRU5UX0ZMQUcpOworI2lmIFVTRV9ERUJVR0dFUgorICAgICAgICAgIGJhbGlnbltiXS5iYi5iX3dvcmtlcl9hcnJpdmVkID0gdGVhbS0+dC50X2JhcltiXS5iX3RlYW1fYXJyaXZlZDsKKyNlbmRpZgorICAgICAgICB9CisgICAgICB9CisgICAgfQorI2VuZGlmIC8vIEtNUF9ORVNURURfSE9UX1RFQU1TCisKKyAgICAvKiByZWFsbG9jYXRlIHNwYWNlIGZvciBhcmd1bWVudHMgaWYgbmVjZXNzYXJ5ICovCisgICAgX19rbXBfYWxsb2NfYXJndl9lbnRyaWVzKGFyZ2MsIHRlYW0sIFRSVUUpOworICAgIEtNUF9DSEVDS19VUERBVEUodGVhbS0+dC50X2FyZ2MsIGFyZ2MpOworICAgIC8vIFRoZSBob3QgdGVhbSByZS11c2VzIHRoZSBwcmV2aW91cyB0YXNrIHRlYW0sCisgICAgLy8gaWYgdW50b3VjaGVkIGR1cmluZyB0aGUgcHJldmlvdXMgcmVsZWFzZS0+Z2F0aGVyIHBoYXNlLgorCisgICAgS0ZfVFJBQ0UoMTAsICgiIGhvdF90ZWFtID0gJXBcbiIsIHRlYW0pKTsKKworI2lmIEtNUF9ERUJVRworICAgIGlmIChfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYykgeworICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogaG90IHRlYW0gdGFza190ZWFtWzBdID0gJXAgIgorICAgICAgICAgICAgICAgICAgICAidGFza190ZWFtWzFdID0gJXAgYWZ0ZXIgcmVpbml0XG4iLAorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGFza190ZWFtWzBdLCB0ZWFtLT50LnRfdGFza190ZWFtWzFdKSk7CisgICAgfQorI2VuZGlmCisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBfX29tcHRfdGVhbV9hc3NpZ25faWQodGVhbSwgb21wdF9wYXJhbGxlbF9pZCk7CisjZW5kaWYKKworICAgIEtNUF9NQigpOworCisgICAgcmV0dXJuIHRlYW07CisgIH0KKworICAvKiBuZXh0LCBsZXQncyB0cnkgdG8gdGFrZSBvbmUgZnJvbSB0aGUgdGVhbSBwb29sICovCisgIEtNUF9NQigpOworICBmb3IgKHRlYW0gPSBDQ0FTVChrbXBfdGVhbV90ICosIF9fa21wX3RlYW1fcG9vbCk7ICh0ZWFtKTspIHsKKyAgICAvKiBUT0RPOiBjb25zaWRlciByZXNpemluZyB1bmRlcnNpemVkIHRlYW1zIGluc3RlYWQgb2YgcmVhcGluZyB0aGVtLCBub3cKKyAgICAgICB0aGF0IHdlIGhhdmUgYSByZXNpemluZyBtZWNoYW5pc20gKi8KKyAgICBpZiAodGVhbS0+dC50X21heF9ucHJvYyA+PSBtYXhfbnByb2MpIHsKKyAgICAgIC8qIHRha2UgdGhpcyB0ZWFtIGZyb20gdGhlIHRlYW0gcG9vbCAqLworICAgICAgX19rbXBfdGVhbV9wb29sID0gdGVhbS0+dC50X25leHRfcG9vbDsKKworICAgICAgLyogc2V0dXAgdGhlIHRlYW0gZm9yIGZyZXNoIHVzZSAqLworICAgICAgX19rbXBfaW5pdGlhbGl6ZV90ZWFtKHRlYW0sIG5ld19ucHJvYywgbmV3X2ljdnMsIE5VTEwpOworCisgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9hbGxvY2F0ZV90ZWFtOiBzZXR0aW5nIHRhc2tfdGVhbVswXSAlcCBhbmQgIgorICAgICAgICAgICAgICAgICAgICAidGFza190ZWFtWzFdICVwIHRvIE5VTExcbiIsCisgICAgICAgICAgICAgICAgICAgICZ0ZWFtLT50LnRfdGFza190ZWFtWzBdLCAmdGVhbS0+dC50X3Rhc2tfdGVhbVsxXSkpOworICAgICAgdGVhbS0+dC50X3Rhc2tfdGVhbVswXSA9IE5VTEw7CisgICAgICB0ZWFtLT50LnRfdGFza190ZWFtWzFdID0gTlVMTDsKKworICAgICAgLyogcmVhbGxvY2F0ZSBzcGFjZSBmb3IgYXJndW1lbnRzIGlmIG5lY2Vzc2FyeSAqLworICAgICAgX19rbXBfYWxsb2NfYXJndl9lbnRyaWVzKGFyZ2MsIHRlYW0sIFRSVUUpOworICAgICAgS01QX0NIRUNLX1VQREFURSh0ZWFtLT50LnRfYXJnYywgYXJnYyk7CisKKyAgICAgIEtBX1RSQUNFKAorICAgICAgICAgIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RlYW06IHRlYW0gJWQgaW5pdCBhcnJpdmVkOiBqb2luPSV1LCBwbGFpbj0ldVxuIiwKKyAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgS01QX0lOSVRfQkFSUklFUl9TVEFURSwgS01QX0lOSVRfQkFSUklFUl9TVEFURSkpOworICAgICAgeyAvLyBJbml0aWFsaXplIGJhcnJpZXIgZGF0YS4KKyAgICAgICAgaW50IGI7CisgICAgICAgIGZvciAoYiA9IDA7IGIgPCBic19sYXN0X2JhcnJpZXI7ICsrYikgeworICAgICAgICAgIHRlYW0tPnQudF9iYXJbYl0uYl9hcnJpdmVkID0gS01QX0lOSVRfQkFSUklFUl9TVEFURTsKKyNpZiBVU0VfREVCVUdHRVIKKyAgICAgICAgICB0ZWFtLT50LnRfYmFyW2JdLmJfbWFzdGVyX2Fycml2ZWQgPSAwOworICAgICAgICAgIHRlYW0tPnQudF9iYXJbYl0uYl90ZWFtX2Fycml2ZWQgPSAwOworI2VuZGlmCisgICAgICAgIH0KKyAgICAgIH0KKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICB0ZWFtLT50LnRfcHJvY19iaW5kID0gbmV3X3Byb2NfYmluZDsKKyNlbmRpZgorCisgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9hbGxvY2F0ZV90ZWFtOiB1c2luZyB0ZWFtIGZyb20gcG9vbCAlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCkpOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgICBfX29tcHRfdGVhbV9hc3NpZ25faWQodGVhbSwgb21wdF9wYXJhbGxlbF9pZCk7CisjZW5kaWYKKworICAgICAgS01QX01CKCk7CisKKyAgICAgIHJldHVybiB0ZWFtOworICAgIH0KKworLyogcmVhcCB0ZWFtIGlmIGl0IGlzIHRvbyBzbWFsbCwgdGhlbiBsb29wIGJhY2sgYW5kIGNoZWNrIHRoZSBuZXh0IG9uZSAqLworLy8gbm90IHN1cmUgaWYgdGhpcyBpcyB3aXNlLCBidXQsIHdpbGwgYmUgcmVkb25lIGR1cmluZyB0aGUgaG90LXRlYW1zIHJld3JpdGUuCisvKiBUT0RPOiBVc2UgdGVjaG5pcXVlIHRvIGZpbmQgdGhlIHJpZ2h0IHNpemUgaG90LXRlYW0sIGRvbid0IHJlYXAgdGhlbSAqLworICAgIHRlYW0gPSBfX2ttcF9yZWFwX3RlYW0odGVhbSk7CisgICAgX19rbXBfdGVhbV9wb29sID0gdGVhbTsKKyAgfQorCisgIC8qIG5vdGhpbmcgYXZhaWxhYmxlIGluIHRoZSBwb29sLCBubyBtYXR0ZXIsIG1ha2UgYSBuZXcgdGVhbSEgKi8KKyAgS01QX01CKCk7CisgIHRlYW0gPSAoa21wX3RlYW1fdCAqKV9fa21wX2FsbG9jYXRlKHNpemVvZihrbXBfdGVhbV90KSk7CisKKyAgLyogYW5kIHNldCBpdCB1cCAqLworICB0ZWFtLT50LnRfbWF4X25wcm9jID0gbWF4X25wcm9jOworICAvKiBOT1RFIHdlbGwsIGZvciBzb21lIHJlYXNvbiBhbGxvY2F0aW5nIG9uZSBiaWcgYnVmZmVyIGFuZCBkaXZpZGluZyBpdCB1cAorICAgICBzZWVtcyB0byByZWFsbHkgaHVydCBwZXJmb3JtYW5jZSBhIGxvdCBvbiB0aGUgUDQsIHNvLCBsZXQncyBub3QgdXNlIHRoaXMgKi8KKyAgX19rbXBfYWxsb2NhdGVfdGVhbV9hcnJheXModGVhbSwgbWF4X25wcm9jKTsKKworICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9hbGxvY2F0ZV90ZWFtOiBtYWtpbmcgYSBuZXcgdGVhbVxuIikpOworICBfX2ttcF9pbml0aWFsaXplX3RlYW0odGVhbSwgbmV3X25wcm9jLCBuZXdfaWN2cywgTlVMTCk7CisKKyAgS0FfVFJBQ0UoMjAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogc2V0dGluZyB0YXNrX3RlYW1bMF0gJXAgYW5kIHRhc2tfdGVhbVsxXSAiCisgICAgICAgICAgICAgICAgIiVwIHRvIE5VTExcbiIsCisgICAgICAgICAgICAgICAgJnRlYW0tPnQudF90YXNrX3RlYW1bMF0sICZ0ZWFtLT50LnRfdGFza190ZWFtWzFdKSk7CisgIHRlYW0tPnQudF90YXNrX3RlYW1bMF0gPSBOVUxMOyAvLyB0byBiZSByZW1vdmVkLCBhcyBfX2ttcF9hbGxvY2F0ZSB6ZXJvZXMKKyAgLy8gbWVtb3J5LCBubyBuZWVkIHRvIGR1cGxpY2F0ZQorICB0ZWFtLT50LnRfdGFza190ZWFtWzFdID0gTlVMTDsgLy8gdG8gYmUgcmVtb3ZlZCwgYXMgX19rbXBfYWxsb2NhdGUgemVyb2VzCisgIC8vIG1lbW9yeSwgbm8gbmVlZCB0byBkdXBsaWNhdGUKKworICBpZiAoX19rbXBfc3RvcmFnZV9tYXApIHsKKyAgICBfX2ttcF9wcmludF90ZWFtX3N0b3JhZ2VfbWFwKCJ0ZWFtIiwgdGVhbSwgdGVhbS0+dC50X2lkLCBuZXdfbnByb2MpOworICB9CisKKyAgLyogYWxsb2NhdGUgc3BhY2UgZm9yIGFyZ3VtZW50cyAqLworICBfX2ttcF9hbGxvY19hcmd2X2VudHJpZXMoYXJnYywgdGVhbSwgRkFMU0UpOworICB0ZWFtLT50LnRfYXJnYyA9IGFyZ2M7CisKKyAgS0FfVFJBQ0UoMjAsCisgICAgICAgICAgICgiX19rbXBfYWxsb2NhdGVfdGVhbTogdGVhbSAlZCBpbml0IGFycml2ZWQ6IGpvaW49JXUsIHBsYWluPSV1XG4iLAorICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFKSk7CisgIHsgLy8gSW5pdGlhbGl6ZSBiYXJyaWVyIGRhdGEuCisgICAgaW50IGI7CisgICAgZm9yIChiID0gMDsgYiA8IGJzX2xhc3RfYmFycmllcjsgKytiKSB7CisgICAgICB0ZWFtLT50LnRfYmFyW2JdLmJfYXJyaXZlZCA9IEtNUF9JTklUX0JBUlJJRVJfU1RBVEU7CisjaWYgVVNFX0RFQlVHR0VSCisgICAgICB0ZWFtLT50LnRfYmFyW2JdLmJfbWFzdGVyX2Fycml2ZWQgPSAwOworICAgICAgdGVhbS0+dC50X2JhcltiXS5iX3RlYW1fYXJyaXZlZCA9IDA7CisjZW5kaWYKKyAgICB9CisgIH0KKworI2lmIE9NUF80MF9FTkFCTEVECisgIHRlYW0tPnQudF9wcm9jX2JpbmQgPSBuZXdfcHJvY19iaW5kOworI2VuZGlmCisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgX19vbXB0X3RlYW1fYXNzaWduX2lkKHRlYW0sIG9tcHRfcGFyYWxsZWxfaWQpOworICB0ZWFtLT50Lm9tcHRfc2VyaWFsaXplZF90ZWFtX2luZm8gPSBOVUxMOworI2VuZGlmCisKKyAgS01QX01CKCk7CisKKyAgS0FfVFJBQ0UoMjAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogZG9uZSBjcmVhdGluZyBhIG5ldyB0ZWFtICVkLlxuIiwKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQpKTsKKworICByZXR1cm4gdGVhbTsKK30KKworLyogVE9ETyBpbXBsZW1lbnQgaG90LXRlYW1zIGF0IGFsbCBsZXZlbHMgKi8KKy8qIFRPRE8gaW1wbGVtZW50IGxhenkgdGhyZWFkIHJlbGVhc2Ugb24gZGVtYW5kIChkaXNiYW5kIHJlcXVlc3QpICovCisKKy8qIGZyZWUgdGhlIHRlYW0uICByZXR1cm4gaXQgdG8gdGhlIHRlYW0gcG9vbC4gIHJlbGVhc2UgYWxsIHRoZSB0aHJlYWRzCisgKiBhc3NvY2lhdGVkIHdpdGggaXQgKi8KK3ZvaWQgX19rbXBfZnJlZV90ZWFtKGttcF9yb290X3QgKnJvb3QsCisgICAgICAgICAgICAgICAgICAgICBrbXBfdGVhbV90ICp0ZWFtIFVTRV9ORVNURURfSE9UX0FSRyhrbXBfaW5mb190ICptYXN0ZXIpKSB7CisgIGludCBmOworICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9mcmVlX3RlYW06IFQjJWQgZnJlZWluZyB0ZWFtICVkXG4iLCBfX2ttcF9nZXRfZ3RpZCgpLAorICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCkpOworCisgIC8qIHZlcmlmeSBzdGF0ZSAqLworICBLTVBfREVCVUdfQVNTRVJUKHJvb3QpOworICBLTVBfREVCVUdfQVNTRVJUKHRlYW0pOworICBLTVBfREVCVUdfQVNTRVJUKHRlYW0tPnQudF9ucHJvYyA8PSB0ZWFtLT50LnRfbWF4X25wcm9jKTsKKyAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtLT50LnRfdGhyZWFkcyk7CisKKyAgaW50IHVzZV9ob3RfdGVhbSA9IHRlYW0gPT0gcm9vdC0+ci5yX2hvdF90ZWFtOworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgIGludCBsZXZlbDsKKyAga21wX2hvdF90ZWFtX3B0cl90ICpob3RfdGVhbXM7CisgIGlmIChtYXN0ZXIpIHsKKyAgICBsZXZlbCA9IHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwgLSAxOworICAgIGlmIChtYXN0ZXItPnRoLnRoX3RlYW1zX21pY3JvdGFzaykgeyAvLyBpbiB0ZWFtcyBjb25zdHJ1Y3Q/CisgICAgICBpZiAobWFzdGVyLT50aC50aF90ZWFtc19zaXplLm50ZWFtcyA+IDEpIHsKKyAgICAgICAgKytsZXZlbDsgLy8gbGV2ZWwgd2FzIG5vdCBpbmNyZWFzZWQgaW4gdGVhbXMgY29uc3RydWN0IGZvcgorICAgICAgICAvLyB0ZWFtX29mX21hc3RlcnMKKyAgICAgIH0KKyAgICAgIGlmICh0ZWFtLT50LnRfcGtmbiAhPSAobWljcm90YXNrX3QpX19rbXBfdGVhbXNfbWFzdGVyICYmCisgICAgICAgICAgbWFzdGVyLT50aC50aF90ZWFtc19sZXZlbCA9PSB0ZWFtLT50LnRfbGV2ZWwpIHsKKyAgICAgICAgKytsZXZlbDsgLy8gbGV2ZWwgd2FzIG5vdCBpbmNyZWFzZWQgaW4gdGVhbXMgY29uc3RydWN0IGZvcgorICAgICAgICAvLyB0ZWFtX29mX3dvcmtlcnMgYmVmb3JlIHRoZSBwYXJhbGxlbAorICAgICAgfSAvLyB0ZWFtLT50LnRfbGV2ZWwgd2lsbCBiZSBpbmNyZWFzZWQgaW5zaWRlIHBhcmFsbGVsCisgICAgfQorICAgIGhvdF90ZWFtcyA9IG1hc3Rlci0+dGgudGhfaG90X3RlYW1zOworICAgIGlmIChsZXZlbCA8IF9fa21wX2hvdF90ZWFtc19tYXhfbGV2ZWwpIHsKKyAgICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbSA9PSBob3RfdGVhbXNbbGV2ZWxdLmhvdF90ZWFtKTsKKyAgICAgIHVzZV9ob3RfdGVhbSA9IDE7CisgICAgfQorICB9CisjZW5kaWYgLy8gS01QX05FU1RFRF9IT1RfVEVBTVMKKworICAvKiB0ZWFtIGlzIGRvbmUgd29ya2luZyAqLworICBUQ1dfU1lOQ19QVFIodGVhbS0+dC50X3BrZm4sCisgICAgICAgICAgICAgICBOVUxMKTsgLy8gSW1wb3J0YW50IGZvciBEZWJ1Z2dpbmcgU3VwcG9ydCBMaWJyYXJ5LgorICB0ZWFtLT50LnRfY29weWluX2NvdW50ZXIgPSAwOyAvLyBpbml0IGNvdW50ZXIgZm9yIHBvc3NpYmxlIHJldXNlCisgIC8vIERvIG5vdCByZXNldCBwb2ludGVyIHRvIHBhcmVudCB0ZWFtIHRvIE5VTEwgZm9yIGhvdCB0ZWFtcy4KKworICAvKiBpZiB3ZSBhcmUgbm9uLWhvdCB0ZWFtLCByZWxlYXNlIG91ciB0aHJlYWRzICovCisgIGlmICghdXNlX2hvdF90ZWFtKSB7CisgICAgaWYgKF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjKSB7CisgICAgICAvLyBXYWl0IGZvciB0aHJlYWRzIHRvIHJlYWNoIHJlYXBhYmxlIHN0YXRlCisgICAgICBmb3IgKGYgPSAxOyBmIDwgdGVhbS0+dC50X25wcm9jOyArK2YpIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtLT50LnRfdGhyZWFkc1tmXSk7CisgICAgICAgIGttcF9pbmZvX3QgKnRoID0gdGVhbS0+dC50X3RocmVhZHNbZl07CisgICAgICAgIHZvbGF0aWxlIGttcF91aW50MzIgKnN0YXRlID0gJnRoLT50aC50aF9yZWFwX3N0YXRlOworICAgICAgICB3aGlsZSAoKnN0YXRlICE9IEtNUF9TQUZFX1RPX1JFQVApIHsKKyNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgIC8vIE9uIFdpbmRvd3MgYSB0aHJlYWQgY2FuIGJlIGtpbGxlZCBhdCBhbnkgdGltZSwgY2hlY2sgdGhpcworICAgICAgICAgIERXT1JEIGVjb2RlOworICAgICAgICAgIGlmICghX19rbXBfaXNfdGhyZWFkX2FsaXZlKHRoLCAmZWNvZGUpKSB7CisgICAgICAgICAgICAqc3RhdGUgPSBLTVBfU0FGRV9UT19SRUFQOyAvLyByZXNldCB0aGUgZmxhZyBmb3IgZGVhZCB0aHJlYWQKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgIC8vIGZpcnN0IGNoZWNrIGlmIHRocmVhZCBpcyBzbGVlcGluZworICAgICAgICAgIGttcF9mbGFnXzY0IGZsKCZ0aC0+dGgudGhfYmFyW2JzX2Zvcmtqb2luX2JhcnJpZXJdLmJiLmJfZ28sIHRoKTsKKyAgICAgICAgICBpZiAoZmwuaXNfc2xlZXBpbmcoKSkKKyAgICAgICAgICAgIGZsLnJlc3VtZShfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRoKSk7CisgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIERlbGV0ZSB0YXNrIHRlYW1zCisgICAgICBpbnQgdHRfaWR4OworICAgICAgZm9yICh0dF9pZHggPSAwOyB0dF9pZHggPCAyOyArK3R0X2lkeCkgeworICAgICAgICBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSA9IHRlYW0tPnQudF90YXNrX3RlYW1bdHRfaWR4XTsKKyAgICAgICAgaWYgKHRhc2tfdGVhbSAhPSBOVUxMKSB7CisgICAgICAgICAgZm9yIChmID0gMDsgZiA8IHRlYW0tPnQudF9ucHJvYzsKKyAgICAgICAgICAgICAgICsrZikgeyAvLyBIYXZlIGFsbCB0aHJlYWRzIHVucmVmIHRhc2sgdGVhbXMKKyAgICAgICAgICAgIHRlYW0tPnQudF90aHJlYWRzW2ZdLT50aC50aF90YXNrX3RlYW0gPSBOVUxMOworICAgICAgICAgIH0KKyAgICAgICAgICBLQV9UUkFDRSgKKyAgICAgICAgICAgICAgMjAsCisgICAgICAgICAgICAgICgiX19rbXBfZnJlZV90ZWFtOiBUIyVkIGRlYWN0aXZhdGluZyB0YXNrX3RlYW0gJXAgb24gdGVhbSAlZFxuIiwKKyAgICAgICAgICAgICAgIF9fa21wX2dldF9ndGlkKCksIHRhc2tfdGVhbSwgdGVhbS0+dC50X2lkKSk7CisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgICAgICBfX2ttcF9mcmVlX3Rhc2tfdGVhbShtYXN0ZXIsIHRhc2tfdGVhbSk7CisjZW5kaWYKKyAgICAgICAgICB0ZWFtLT50LnRfdGFza190ZWFtW3R0X2lkeF0gPSBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gUmVzZXQgcG9pbnRlciB0byBwYXJlbnQgdGVhbSBvbmx5IGZvciBub24taG90IHRlYW1zLgorICAgIHRlYW0tPnQudF9wYXJlbnQgPSBOVUxMOworICAgIHRlYW0tPnQudF9sZXZlbCA9IDA7CisgICAgdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCA9IDA7CisKKyAgICAvKiBmcmVlIHRoZSB3b3JrZXIgdGhyZWFkcyAqLworICAgIGZvciAoZiA9IDE7IGYgPCB0ZWFtLT50LnRfbnByb2M7ICsrZikgeworICAgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtLT50LnRfdGhyZWFkc1tmXSk7CisgICAgICBfX2ttcF9mcmVlX3RocmVhZCh0ZWFtLT50LnRfdGhyZWFkc1tmXSk7CisgICAgICB0ZWFtLT50LnRfdGhyZWFkc1tmXSA9IE5VTEw7CisgICAgfQorCisgICAgLyogcHV0IHRoZSB0ZWFtIGJhY2sgaW4gdGhlIHRlYW0gcG9vbCAqLworICAgIC8qIFRPRE8gbGltaXQgc2l6ZSBvZiB0ZWFtIHBvb2wsIGNhbGwgcmVhcF90ZWFtIGlmIHBvb2wgdG9vIGxhcmdlICovCisgICAgdGVhbS0+dC50X25leHRfcG9vbCA9IENDQVNUKGttcF90ZWFtX3QgKiwgX19rbXBfdGVhbV9wb29sKTsKKyAgICBfX2ttcF90ZWFtX3Bvb2wgPSAodm9sYXRpbGUga21wX3RlYW1fdCAqKXRlYW07CisgIH0KKworICBLTVBfTUIoKTsKK30KKworLyogcmVhcCB0aGUgdGVhbS4gIGRlc3Ryb3kgaXQsIHJlY2xhaW0gYWxsIGl0cyByZXNvdXJjZXMgYW5kIGZyZWUgaXRzIG1lbW9yeSAqLwora21wX3RlYW1fdCAqX19rbXBfcmVhcF90ZWFtKGttcF90ZWFtX3QgKnRlYW0pIHsKKyAga21wX3RlYW1fdCAqbmV4dF9wb29sID0gdGVhbS0+dC50X25leHRfcG9vbDsKKworICBLTVBfREVCVUdfQVNTRVJUKHRlYW0pOworICBLTVBfREVCVUdfQVNTRVJUKHRlYW0tPnQudF9kaXNwYXRjaCk7CisgIEtNUF9ERUJVR19BU1NFUlQodGVhbS0+dC50X2Rpc3BfYnVmZmVyKTsKKyAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtLT50LnRfdGhyZWFkcyk7CisgIEtNUF9ERUJVR19BU1NFUlQodGVhbS0+dC50X2FyZ3YpOworCisgIC8qIFRPRE8gY2xlYW4gdGhlIHRocmVhZHMgdGhhdCBhcmUgYSBwYXJ0IG9mIHRoaXM/ICovCisKKyAgLyogZnJlZSBzdHVmZiAqLworICBfX2ttcF9mcmVlX3RlYW1fYXJyYXlzKHRlYW0pOworICBpZiAodGVhbS0+dC50X2FyZ3YgIT0gJnRlYW0tPnQudF9pbmxpbmVfYXJndlswXSkKKyAgICBfX2ttcF9mcmVlKCh2b2lkICopdGVhbS0+dC50X2FyZ3YpOworICBfX2ttcF9mcmVlKHRlYW0pOworCisgIEtNUF9NQigpOworICByZXR1cm4gbmV4dF9wb29sOworfQorCisvLyBGcmVlIHRoZSB0aHJlYWQuICBEb24ndCByZWFwIGl0LCBqdXN0IHBsYWNlIGl0IG9uIHRoZSBwb29sIG9mIGF2YWlsYWJsZQorLy8gdGhyZWFkcy4KKy8vCisvLyBDaGFuZ2VzIGZvciBRdWFkIGlzc3VlIDUyNzg0NTogV2UgbmVlZCBhIHByZWRpY3RhYmxlIE9NUCB0aWQgPC0+IGd0aWQKKy8vIGJpbmRpbmcgZm9yIHRoZSBhZmZpbml0eSBtZWNoYW5pc20gdG8gYmUgdXNlZnVsLgorLy8KKy8vIE5vdywgd2UgYWx3YXlzIGtlZXAgdGhlIGZyZWUgbGlzdCAoX19rbXBfdGhyZWFkX3Bvb2wpIHNvcnRlZCBieSBndGlkLgorLy8gSG93ZXZlciwgd2Ugd2FudCB0byBhdm9pZCBhIHBvdGVudGlhbCBwZXJmb3JtYW5jZSBwcm9ibGVtIGJ5IGFsd2F5cworLy8gc2Nhbm5pbmcgdGhyb3VnaCB0aGUgbGlzdCB0byBmaW5kIHRoZSBjb3JyZWN0IHBvaW50IGF0IHdoaWNoIHRvIGluc2VydAorLy8gdGhlIHRocmVhZCAocG90ZW50aWFsIE4qKjIgYmVoYXZpb3IpLiAgVG8gZG8gdGhpcyB3ZSBrZWVwIHRyYWNrIG9mIHRoZQorLy8gbGFzdCBwbGFjZSBhIHRocmVhZCBzdHJ1Y3Qgd2FzIGluc2VydGVkIChfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQpLgorLy8gV2l0aCBzaW5nbGUtbGV2ZWwgcGFyYWxsZWxpc20sIHRocmVhZHMgd2lsbCBhbHdheXMgYmUgYWRkZWQgdG8gdGhlIHRhaWwKKy8vIG9mIHRoZSBsaXN0LCBrZXB0IHRyYWNrIG9mIGJ5IF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdC4gIFdpdGggbmVzdGVkCisvLyBwYXJhbGxlbGlzbSwgYWxsIGJldHMgYXJlIG9mZiBhbmQgd2UgbWF5IG5lZWQgdG8gc2NhbiB0aHJvdWdoIHRoZSBlbnRpcmUKKy8vIGZyZWUgbGlzdC4KKy8vCisvLyBUaGlzIGNoYW5nZSBhbHNvIGhhcyBhIHBvdGVudGlhbGx5IGxhcmdlIHBlcmZvcm1hbmNlIGJlbmVmaXQsIGZvciBzb21lCisvLyBhcHBsaWNhdGlvbnMuICBQcmV2aW91c2x5LCBhcyB0aHJlYWRzIHdlcmUgZnJlZWQgZnJvbSB0aGUgaG90IHRlYW0sIHRoZXkKKy8vIHdvdWxkIGJlIHBsYWNlZCBiYWNrIG9uIHRoZSBmcmVlIGxpc3QgaW4gaW52ZXJzZSBvcmRlci4gIElmIHRoZSBob3QgdGVhbQorLy8gZ3JldyBiYWNrIHRvIGl0J3Mgb3JpZ2luYWwgc2l6ZSwgdGhlbiB0aGUgZnJlZWQgdGhyZWFkIHdvdWxkIGJlIHBsYWNlZAorLy8gYmFjayBvbiB0aGUgaG90IHRlYW0gaW4gcmV2ZXJzZSBvcmRlci4gIFRoaXMgY291bGQgY2F1c2UgYmFkIGNhY2hlCisvLyBsb2NhbGl0eSBwcm9ibGVtcyBvbiBwcm9ncmFtcyB3aGVyZSB0aGUgc2l6ZSBvZiB0aGUgaG90IHRlYW0gcmVndWxhcmx5CisvLyBncmV3IGFuZCBzaHJ1bmsuCisvLworLy8gTm93LCBmb3Igc2luZ2xlLWxldmVsIHBhcmFsbGVsaXNtLCB0aGUgT01QIHRpZCBpcyBhbHdheSA9PSBndGlkLgordm9pZCBfX2ttcF9mcmVlX3RocmVhZChrbXBfaW5mb190ICp0aGlzX3RoKSB7CisgIGludCBndGlkOworICBrbXBfaW5mb190ICoqc2NhbjsKKworICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9mcmVlX3RocmVhZDogVCMlZCBwdXR0aW5nIFQjJWQgYmFjayBvbiBmcmVlIHBvb2wuXG4iLAorICAgICAgICAgICAgICAgIF9fa21wX2dldF9ndGlkKCksIHRoaXNfdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCkpOworCisgIEtNUF9ERUJVR19BU1NFUlQodGhpc190aCk7CisKKyAgLy8gV2hlbiBtb3ZpbmcgdGhyZWFkIHRvIHBvb2wsIHN3aXRjaCB0aHJlYWQgdG8gd2FpdCBvbiBvd24gYl9nbyBmbGFnLCBhbmQKKyAgLy8gdW5pbml0aWFsaXplZCAoTlVMTCB0ZWFtKS4KKyAgaW50IGI7CisgIGttcF9iYWxpZ25fdCAqYmFsaWduID0gdGhpc190aC0+dGgudGhfYmFyOworICBmb3IgKGIgPSAwOyBiIDwgYnNfbGFzdF9iYXJyaWVyOyArK2IpIHsKKyAgICBpZiAoYmFsaWduW2JdLmJiLndhaXRfZmxhZyA9PSBLTVBfQkFSUklFUl9QQVJFTlRfRkxBRykKKyAgICAgIGJhbGlnbltiXS5iYi53YWl0X2ZsYWcgPSBLTVBfQkFSUklFUl9TV0lUQ0hfVE9fT1dOX0ZMQUc7CisgICAgYmFsaWduW2JdLmJiLnRlYW0gPSBOVUxMOworICAgIGJhbGlnbltiXS5iYi5sZWFmX2tpZHMgPSAwOworICB9CisgIHRoaXNfdGgtPnRoLnRoX3Rhc2tfc3RhdGUgPSAwOworCisgIC8qIHB1dCB0aHJlYWQgYmFjayBvbiB0aGUgZnJlZSBwb29sICovCisgIFRDV19QVFIodGhpc190aC0+dGgudGhfdGVhbSwgTlVMTCk7CisgIFRDV19QVFIodGhpc190aC0+dGgudGhfcm9vdCwgTlVMTCk7CisgIFRDV19QVFIodGhpc190aC0+dGgudGhfZGlzcGF0Y2gsIE5VTEwpOyAvKiBOT1QgTkVFREVEICovCisKKyAgLy8gSWYgdGhlIF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdCBpcyBhbHJlYWR5IHBhc3QgdGhlIG5ldyBpbnNlcnQKKyAgLy8gcG9pbnQsIHRoZW4gd2UgbmVlZCB0byByZS1zY2FuIHRoZSBlbnRpcmUgbGlzdC4KKyAgZ3RpZCA9IHRoaXNfdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZDsKKyAgaWYgKF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdCAhPSBOVUxMKSB7CisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF90aHJlYWRfcG9vbCAhPSBOVUxMKTsKKyAgICBpZiAoX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0LT50aC50aF9pbmZvLmRzLmRzX2d0aWQgPiBndGlkKSB7CisgICAgICBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQgPSBOVUxMOworICAgIH0KKyAgfQorCisgIC8vIFNjYW4gZG93biB0aGUgbGlzdCB0byBmaW5kIHRoZSBwbGFjZSB0byBpbnNlcnQgdGhlIHRocmVhZC4KKyAgLy8gc2NhbiBpcyB0aGUgYWRkcmVzcyBvZiBhIGxpbmsgaW4gdGhlIGxpc3QsIHBvc3NpYmx5IHRoZSBhZGRyZXNzIG9mCisgIC8vIF9fa21wX3RocmVhZF9wb29sIGl0c2VsZi4KKyAgLy8KKyAgLy8gSW4gdGhlIGFic2VuY2Ugb2YgbmVzdGVkIHBhcmFsbGlzbSwgdGhlIGZvciBsb29wIHdpbGwgaGF2ZSAwIGl0ZXJhdGlvbnMuCisgIGlmIChfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQgIT0gTlVMTCkgeworICAgIHNjYW4gPSAmKF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdC0+dGgudGhfbmV4dF9wb29sKTsKKyAgfSBlbHNlIHsKKyAgICBzY2FuID0gQ0NBU1Qoa21wX2luZm9fdCAqKiwgJl9fa21wX3RocmVhZF9wb29sKTsKKyAgfQorICBmb3IgKDsgKCpzY2FuICE9IE5VTEwpICYmICgoKnNjYW4pLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgPCBndGlkKTsKKyAgICAgICBzY2FuID0gJigoKnNjYW4pLT50aC50aF9uZXh0X3Bvb2wpKQorICAgIDsKKworICAvLyBJbnNlcnQgdGhlIG5ldyBlbGVtZW50IG9uIHRoZSBsaXN0LCBhbmQgc2V0IF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdAorICAvLyB0byBpdHMgYWRkcmVzcy4KKyAgVENXX1BUUih0aGlzX3RoLT50aC50aF9uZXh0X3Bvb2wsICpzY2FuKTsKKyAgX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0ID0gKnNjYW4gPSB0aGlzX3RoOworICBLTVBfREVCVUdfQVNTRVJUKCh0aGlzX3RoLT50aC50aF9uZXh0X3Bvb2wgPT0gTlVMTCkgfHwKKyAgICAgICAgICAgICAgICAgICAodGhpc190aC0+dGgudGhfaW5mby5kcy5kc19ndGlkIDwKKyAgICAgICAgICAgICAgICAgICAgdGhpc190aC0+dGgudGhfbmV4dF9wb29sLT50aC50aF9pbmZvLmRzLmRzX2d0aWQpKTsKKyAgVENXXzQodGhpc190aC0+dGgudGhfaW5fcG9vbCwgVFJVRSk7CisgIF9fa21wX3RocmVhZF9wb29sX250aCsrOworCisgIFRDV180KF9fa21wX250aCwgX19rbXBfbnRoIC0gMSk7CisKKyNpZmRlZiBLTVBfQURKVVNUX0JMT0NLVElNRQorICAvKiBBZGp1c3QgYmxvY2t0aW1lIGJhY2sgdG8gdXNlciBzZXR0aW5nIG9yIGRlZmF1bHQgaWYgbmVjZXNzYXJ5ICovCisgIC8qIE1pZGRsZSBpbml0aWFsaXphdGlvbiBtaWdodCBuZXZlciBoYXZlIG9jY3VycmVkICAgICAgICAgICAgICAgICovCisgIGlmICghX19rbXBfZW52X2Jsb2NrdGltZSAmJiAoX19rbXBfYXZhaWxfcHJvYyA+IDApKSB7CisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9hdmFpbF9wcm9jID4gMCk7CisgICAgaWYgKF9fa21wX250aCA8PSBfX2ttcF9hdmFpbF9wcm9jKSB7CisgICAgICBfX2ttcF96ZXJvX2J0ID0gRkFMU0U7CisgICAgfQorICB9CisjZW5kaWYgLyogS01QX0FESlVTVF9CTE9DS1RJTUUgKi8KKworICBLTVBfTUIoKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgKl9fa21wX2xhdW5jaF90aHJlYWQoa21wX2luZm9fdCAqdGhpc190aHIpIHsKKyAgaW50IGd0aWQgPSB0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc19ndGlkOworICAvKiAgICB2b2lkICAgICAgICAgICAgICAgICAqc3RhY2tfZGF0YTsqLworICBrbXBfdGVhbV90ICooKnZvbGF0aWxlIHB0ZWFtKTsKKworICBLTVBfTUIoKTsKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBfbGF1bmNoX3RocmVhZDogVCMlZCBzdGFydFxuIiwgZ3RpZCkpOworCisgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICB0aGlzX3Roci0+dGgudGhfY29ucyA9IF9fa21wX2FsbG9jYXRlX2NvbnNfc3RhY2soZ3RpZCk7IC8vIEFUVDogTWVtb3J5IGxlYWs/CisgIH0KKworI2lmIE9NUFRfU1VQUE9SVAorICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX292ZXJoZWFkOworICAgIHRoaXNfdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLndhaXRfaWQgPSAwOworICAgIHRoaXNfdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLmlkbGVfZnJhbWUgPSBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKTsKKyAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3RocmVhZF9iZWdpbikpIHsKKyAgICAgIF9fb21wdF90aHJlYWRfYmVnaW4ob21wdF90aHJlYWRfd29ya2VyLCBndGlkKTsKKyAgICB9CisgIH0KKyNlbmRpZgorCisgIC8qIFRoaXMgaXMgdGhlIHBsYWNlIHdoZXJlIHRocmVhZHMgd2FpdCBmb3Igd29yayAqLworICB3aGlsZSAoIVRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkpIHsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyID09IF9fa21wX3RocmVhZHNbZ3RpZF0pOworICAgIEtNUF9NQigpOworCisgICAgLyogd2FpdCBmb3Igd29yayB0byBkbyAqLworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2xhdW5jaF90aHJlYWQ6IFQjJWQgd2FpdGluZyBmb3Igd29ya1xuIiwgZ3RpZCkpOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX2lkbGU7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBObyB0aWQgeWV0IHNpbmNlIG5vdCBwYXJ0IG9mIGEgdGVhbSAqLworICAgIF9fa21wX2ZvcmtfYmFycmllcihndGlkLCBLTVBfR1RJRF9ETkUpOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX292ZXJoZWFkOworICAgIH0KKyNlbmRpZgorCisgICAgcHRlYW0gPSAoa21wX3RlYW1fdCAqICgqKSkoJnRoaXNfdGhyLT50aC50aF90ZWFtKTsKKworICAgIC8qIGhhdmUgd2UgYmVlbiBhbGxvY2F0ZWQ/ICovCisgICAgaWYgKFRDUl9TWU5DX1BUUigqcHRlYW0pICYmICFUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpKSB7CisjaWYgT01QVF9TVVBQT1JUCisgICAgICBvbXB0X3Rhc2tfaW5mb190ICp0YXNrX2luZm87CisgICAgICBvbXB0X3BhcmFsbGVsX2lkX3QgbXlfcGFyYWxsZWxfaWQ7CisgICAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIHRhc2tfaW5mbyA9IF9fb21wdF9nZXRfdGFza2luZm8oMCk7CisgICAgICAgIG15X3BhcmFsbGVsX2lkID0gKCpwdGVhbSktPnQub21wdF90ZWFtX2luZm8ucGFyYWxsZWxfaWQ7CisgICAgICB9CisjZW5kaWYKKyAgICAgIC8qIHdlIHdlcmUganVzdCB3b2tlbiB1cCwgc28gcnVuIG91ciBuZXcgdGFzayAqLworICAgICAgaWYgKFRDUl9TWU5DX1BUUigoKnB0ZWFtKS0+dC50X3BrZm4pICE9IE5VTEwpIHsKKyAgICAgICAgaW50IHJjOworICAgICAgICBLQV9UUkFDRSgyMCwKKyAgICAgICAgICAgICAgICAgKCJfX2ttcF9sYXVuY2hfdGhyZWFkOiBUIyVkKCVkOiVkKSBpbnZva2UgbWljcm90YXNrID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCAoKnB0ZWFtKS0+dC50X2lkLCBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpLAorICAgICAgICAgICAgICAgICAgKCpwdGVhbSktPnQudF9wa2ZuKSk7CisKKyAgICAgICAgdXBkYXRlSFdGUENvbnRyb2woKnB0ZWFtKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgICAgdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWw7CisgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBPTVBUIHRhc2sgaWQgZm9yIGltcGxpY2l0IHRhc2suCisgICAgICAgICAgaW50IHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCk7CisgICAgICAgICAgdGFza19pbmZvLT50YXNrX2lkID0gX19vbXB0X3Rhc2tfaWRfbmV3KHRpZCk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIHsKKyAgICAgICAgICBLTVBfVElNRV9QQVJUSVRJT05FRF9CTE9DSyhPTVBfcGFyYWxsZWwpOworICAgICAgICAgIEtNUF9TRVRfVEhSRUFEX1NUQVRFX0JMT0NLKElNUExJQ0lUX1RBU0spOworICAgICAgICAgIHJjID0gKCpwdGVhbSktPnQudF9pbnZva2UoZ3RpZCk7CisgICAgICAgIH0KKyAgICAgICAgS01QX0FTU0VSVChyYyk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICAgIC8qIG5vIGZyYW1lIHNldCB3aGlsZSBvdXRzaWRlIHRhc2sgKi8KKyAgICAgICAgICB0YXNrX2luZm8tPmZyYW1lLmV4aXRfcnVudGltZV9mcmFtZSA9IE5VTEw7CisKKyAgICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfb3ZlcmhlYWQ7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfbGF1bmNoX3RocmVhZDogVCMlZCglZDolZCkgZG9uZSBtaWNyb3Rhc2sgPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCAoKnB0ZWFtKS0+dC50X2lkLCBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpLAorICAgICAgICAgICAgICAgICAgICAgICgqcHRlYW0pLT50LnRfcGtmbikpOworICAgICAgfQorICAgICAgLyogam9pbiBiYXJyaWVyIGFmdGVyIHBhcmFsbGVsIHJlZ2lvbiAqLworICAgICAgX19rbXBfam9pbl9iYXJyaWVyKGd0aWQpOworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQpKSB7CisgICAgICAgICAgLy8gZG9uJ3QgYWNjZXNzICpwdGVhbSBoZXJlOiBpdCBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gZnJlZWQKKyAgICAgICAgICAvLyBieSB0aGUgbWFzdGVyIHRocmVhZCBiZWhpbmQgdGhlIGJhcnJpZXIgKHBvc3NpYmxlIHJhY2UpCisgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kKSgKKyAgICAgICAgICAgICAgbXlfcGFyYWxsZWxfaWQsIHRhc2tfaW5mby0+dGFza19pZCk7CisgICAgICAgIH0KKyAgICAgICAgdGFza19pbmZvLT5mcmFtZS5leGl0X3J1bnRpbWVfZnJhbWUgPSBOVUxMOworICAgICAgICB0YXNrX2luZm8tPnRhc2tfaWQgPSAwOworICAgICAgfQorI2VuZGlmCisgICAgfQorICB9CisgIFRDUl9TWU5DX1BUUigoaW50cHRyX3QpX19rbXBfZ2xvYmFsLmcuZ19kb25lKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICBpZiAob21wdF9lbmFibGVkICYmIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90aHJlYWRfZW5kKSkgeworICAgIF9fb21wdF90aHJlYWRfZW5kKG9tcHRfdGhyZWFkX3dvcmtlciwgZ3RpZCk7CisgIH0KKyNlbmRpZgorCisgIHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0gPSBOVUxMOworICAvKiBydW4gdGhlIGRlc3RydWN0b3JzIGZvciB0aGUgdGhyZWFkcHJpdmF0ZSBkYXRhIGZvciB0aGlzIHRocmVhZCAqLworICBfX2ttcF9jb21tb25fZGVzdHJveV9ndGlkKGd0aWQpOworCisgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2xhdW5jaF90aHJlYWQ6IFQjJWQgZG9uZVxuIiwgZ3RpZCkpOworICBLTVBfTUIoKTsKKyAgcmV0dXJuIHRoaXNfdGhyOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBfX2ttcF9pbnRlcm5hbF9lbmRfZGVzdCh2b2lkICpzcGVjaWZpY19ndGlkKSB7CisjaWYgS01QX0NPTVBJTEVSX0lDQworI3ByYWdtYSB3YXJuaW5nKHB1c2gpCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDgxMCkgLy8gY29udmVyc2lvbiBmcm9tICJ2b2lkICoiIHRvICJpbnQiIG1heSBsb3NlCisvLyBzaWduaWZpY2FudCBiaXRzCisjZW5kaWYKKyAgLy8gTWFrZSBzdXJlIG5vIHNpZ25pZmljYW50IGJpdHMgYXJlIGxvc3QKKyAgaW50IGd0aWQgPSAoa21wX2ludHB0cl90KXNwZWNpZmljX2d0aWQgLSAxOworI2lmIEtNUF9DT01QSUxFUl9JQ0MKKyNwcmFnbWEgd2FybmluZyhwb3ApCisjZW5kaWYKKworICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfZGVzdDogVCMlZFxuIiwgZ3RpZCkpOworICAvKiBOT1RFOiB0aGUgZ3RpZCBpcyBzdG9yZWQgYXMgZ2l0ZCsxIGluIHRoZSB0aHJlYWQtbG9jYWwtc3RvcmFnZQorICAgKiB0aGlzIGlzIGJlY2F1c2UgMCBpcyByZXNlcnZlZCBmb3IgdGhlIG5vdGhpbmctc3RvcmVkIGNhc2UgKi8KKworICAvKiBqb3NoOiBPbmUgcmVhc29uIGZvciBzZXR0aW5nIHRoZSBndGlkIHNwZWNpZmljIGRhdGEgZXZlbiB3aGVuIGl0IGlzIGJlaW5nCisgICAgIGRlc3Ryb3llZCBieSBwdGhyZWFkIGlzIHRvIGFsbG93IGd0aWQgbG9va3VwIHRocm91Z2ggdGhyZWFkIHNwZWNpZmljIGRhdGEKKyAgICAgKF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKS4gIFNvbWUgb2YgdGhlIGNvZGUsIGVzcGVjaWFsbHkgc3RhdCBjb2RlLAorICAgICB0aGF0IGdldHMgZXhlY3V0ZWQgaW4gdGhlIGNhbGwgdG8gX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZCwgYWN0dWFsbHkKKyAgICAgZ2V0cyB0aGUgZ3RpZCB0aHJvdWdoIHRoZSB0aHJlYWQgc3BlY2lmaWMgZGF0YS4gIFNldHRpbmcgaXQgaGVyZSBzZWVtcworICAgICByYXRoZXIgaW5lbGVnYW50IGFuZCBwZXJoYXBzIHdyb25nLCBidXQgYWxsb3dzIF9fa21wX2ludGVybmFsX2VuZF90aHJlYWQKKyAgICAgdG8gcnVuIHNtb290aGx5LgorICAgICB0b2RvOiBnZXQgcmlkIG9mIHRoaXMgYWZ0ZXIgd2UgcmVtb3ZlIHRoZSBkZXBlbmRlbmNlIG9uCisgICAgIF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljICAqLworICBpZiAoZ3RpZCA+PSAwICYmIEtNUF9VQkVSX0dUSUQoZ3RpZCkpCisgICAgX19rbXBfZ3RpZF9zZXRfc3BlY2lmaWMoZ3RpZCk7CisjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgX19rbXBfZ3RpZCA9IGd0aWQ7CisjZW5kaWYKKyAgX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZChndGlkKTsKK30KKworI2lmIEtNUF9PU19VTklYICYmIEtNUF9EWU5BTUlDX0xJQgorCisvLyAyMDA5LTA5LTA4IChsZXYpOiBJdCBsb29rcyB0aGUgZGVzdHJ1Y3RvciBkb2VzIG5vdCB3b3JrLiBJbiBzaW1wbGUgdGVzdCBjYXNlcworLy8gZGVzdHJ1Y3RvcnMgd29yayBwZXJmZWN0bHksIGJ1dCBpbiByZWFsIGxpYm9tcC5zbyBJIGhhdmUgbm8gZXZpZGVuY2UgaXQgaXMKKy8vIGV2ZXIgY2FsbGVkLiBIb3dldmVyLCAtZmluaSBsaW5rZXIgb3B0aW9uIGluIG1ha2VmaWxlLm1rIHdvcmtzIGZpbmUuCisKK19fYXR0cmlidXRlX18oKGRlc3RydWN0b3IpKSB2b2lkIF9fa21wX2ludGVybmFsX2VuZF9kdG9yKHZvaWQpIHsKKyAgX19rbXBfaW50ZXJuYWxfZW5kX2F0ZXhpdCgpOworfQorCit2b2lkIF9fa21wX2ludGVybmFsX2VuZF9maW5pKHZvaWQpIHsgX19rbXBfaW50ZXJuYWxfZW5kX2F0ZXhpdCgpOyB9CisKKyNlbmRpZgorCisvKiBbV2luZG93c10gam9zaDogd2hlbiB0aGUgYXRleGl0IGhhbmRsZXIgaXMgY2FsbGVkLCB0aGVyZSBtYXkgc3RpbGwgYmUgbW9yZQorICAgdGhhbiBvbmUgdGhyZWFkIGFsaXZlICovCit2b2lkIF9fa21wX2ludGVybmFsX2VuZF9hdGV4aXQodm9pZCkgeworICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfYXRleGl0XG4iKSk7CisgIC8qIFtXaW5kb3dzXQorICAgICBqb3NoOiBpZGVhbGx5LCB3ZSB3YW50IHRvIGNvbXBsZXRlbHkgc2h1dGRvd24gdGhlIGxpYnJhcnkgaW4gdGhpcyBhdGV4aXQKKyAgICAgaGFuZGxlciwgYnV0IHN0YXQgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhyZWFkIHNwZWNpZmljIGRhdGEgZm9yIGd0aWQgZmFpbHMKKyAgICAgYmVjYXVzZSB0aGF0IGRhdGEgYmVjb21lcyB1bmF2YWlsYWJsZSBhdCBzb21lIHBvaW50IGR1cmluZyB0aGUgc2h1dGRvd24sIHNvCisgICAgIHdlIGNhbGwgX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZCBpbnN0ZWFkLiBXZSBzaG91bGQgZXZlbnR1YWxseSByZW1vdmUgdGhlCisgICAgIGRlcGVuZGVuY3kgb24gX19rbXBfZ2V0X3NwZWNpZmljX2d0aWQgaW4gdGhlIHN0YXQgY29kZSBhbmQgdXNlCisgICAgIF9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5IHRvIGNsZWFubHkgc2h1dGRvd24gdGhlIGxpYnJhcnkuCisKKyAgICAgLy8gVE9ETzogQ2FuIHNvbWUgb2YgdGhpcyBjb21tZW50IGFib3V0IEdWUyBiZSByZW1vdmVkPworICAgICBJIHN1c3BlY3QgdGhhdCB0aGUgb2ZmZW5kaW5nIHN0YXQgY29kZSBpcyBleGVjdXRlZCB3aGVuIHRoZSBjYWxsaW5nIHRocmVhZAorICAgICB0cmllcyB0byBjbGVhbiB1cCBhIGRlYWQgcm9vdCB0aHJlYWQncyBkYXRhIHN0cnVjdHVyZXMsIHJlc3VsdGluZyBpbiBHVlMKKyAgICAgY29kZSB0cnlpbmcgdG8gY2xvc2UgdGhlIEdWUyBzdHJ1Y3R1cmVzIGZvciB0aGF0IHRocmVhZCwgYnV0IHNpbmNlIHRoZSBzdGF0CisgICAgIGNvZGUgdXNlcyBfX2ttcF9nZXRfc3BlY2lmaWNfZ3RpZCB0byBnZXQgdGhlIGd0aWQgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0CisgICAgIHRoZSBjYWxsaW5nIHRocmVhZCBpcyBjbGVhbmluZyB1cCBpdHNlbGYgaW5zdGVhZCBvZiBhbm90aGVyIHRocmVhZCwgaXQgZ2V0CisgICAgIGNvbmZ1c2VkLiBUaGlzIGhhcHBlbnMgYmVjYXVzZSBhbGxvd2luZyBhIHRocmVhZCB0byB1bnJlZ2lzdGVyIGFuZCBjbGVhbnVwCisgICAgIGFub3RoZXIgdGhyZWFkIGlzIGEgcmVjZW50IG1vZGlmaWNhdGlvbiBmb3IgYWRkcmVzc2luZyBhbiBpc3N1ZS4KKyAgICAgQmFzZWQgb24gdGhlIGN1cnJlbnQgZGVzaWduICgyMDA1MDcyMiksIGEgdGhyZWFkIG1heSBlbmQgdXAKKyAgICAgdHJ5aW5nIHRvIHVucmVnaXN0ZXIgYW5vdGhlciB0aHJlYWQgb25seSBpZiB0aHJlYWQgZGVhdGggZG9lcyBub3QgdHJpZ2dlcgorICAgICB0aGUgY2FsbGluZyBvZiBfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkLiAgRm9yIExpbnV4KiBPUywgdGhlcmUgaXMgdGhlCisgICAgIHRocmVhZCBzcGVjaWZpYyBkYXRhIGRlc3RydWN0b3IgZnVuY3Rpb24gdG8gZGV0ZWN0IHRocmVhZCBkZWF0aC4gRm9yCisgICAgIFdpbmRvd3MgZHluYW1pYywgdGhlcmUgaXMgRGxsTWFpbihUSFJFQURfREVUQUNIKS4gRm9yIFdpbmRvd3Mgc3RhdGljLCB0aGVyZQorICAgICBpcyBub3RoaW5nLiAgVGh1cywgdGhlIHdvcmthcm91bmQgaXMgYXBwbGljYWJsZSBvbmx5IGZvciBXaW5kb3dzIHN0YXRpYworICAgICBzdGF0IGxpYnJhcnkuICovCisgIF9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5KC0xKTsKKyNpZiBLTVBfT1NfV0lORE9XUworICBfX2ttcF9jbG9zZV9jb25zb2xlKCk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgX19rbXBfcmVhcF90aHJlYWQoa21wX2luZm9fdCAqdGhyZWFkLCBpbnQgaXNfcm9vdCkgeworICAvLyBJdCBpcyBhc3N1bWVkIF9fa21wX2Zvcmtqb2luX2xvY2sgaXMgYWNxdWlyZWQuCisKKyAgaW50IGd0aWQ7CisKKyAgS01QX0RFQlVHX0FTU0VSVCh0aHJlYWQgIT0gTlVMTCk7CisKKyAgZ3RpZCA9IHRocmVhZC0+dGgudGhfaW5mby5kcy5kc19ndGlkOworCisgIGlmICghaXNfcm9vdCkgeworCisgICAgaWYgKF9fa21wX2RmbHRfYmxvY2t0aW1lICE9IEtNUF9NQVhfQkxPQ0tUSU1FKSB7CisgICAgICAvKiBBc3N1bWUgdGhlIHRocmVhZHMgYXJlIGF0IHRoZSBmb3JrIGJhcnJpZXIgaGVyZSAqLworICAgICAgS0FfVFJBQ0UoCisgICAgICAgICAgMjAsICgiX19rbXBfcmVhcF90aHJlYWQ6IHJlbGVhc2luZyBUIyVkIGZyb20gZm9yayBiYXJyaWVyIGZvciByZWFwXG4iLAorICAgICAgICAgICAgICAgZ3RpZCkpOworICAgICAgLyogTmVlZCByZWxlYXNlIGZlbmNlIGhlcmUgdG8gcHJldmVudCBzZWcgZmF1bHRzIGZvciB0cmVlIGZvcmtqb2luIGJhcnJpZXIKKyAgICAgICAqIChHRUgpICovCisgICAgICBBTk5PVEFURV9IQVBQRU5TX0JFRk9SRSh0aHJlYWQpOworICAgICAga21wX2ZsYWdfNjQgZmxhZygmdGhyZWFkLT50aC50aF9iYXJbYnNfZm9ya2pvaW5fYmFycmllcl0uYmIuYl9nbywgdGhyZWFkKTsKKyAgICAgIF9fa21wX3JlbGVhc2VfNjQoJmZsYWcpOworICAgIH07IC8vIGlmCisKKyAgICAvLyBUZXJtaW5hdGUgT1MgdGhyZWFkLgorICAgIF9fa21wX3JlYXBfd29ya2VyKHRocmVhZCk7CisKKyAgICAvLyBUaGUgdGhyZWFkIHdhcyBraWxsZWQgYXN5bmNocm9ub3VzbHkuICBJZiBpdCB3YXMgYWN0aXZlbHkKKyAgICAvLyBzcGlubmluZyBpbiB0aGUgdGhyZWFkIHBvb2wsIGRlY3JlbWVudCB0aGUgZ2xvYmFsIGNvdW50LgorICAgIC8vCisgICAgLy8gVGhlcmUgaXMgYSBzbWFsbCB0aW1pbmcgaG9sZSBoZXJlIC0gaWYgdGhlIHdvcmtlciB0aHJlYWQgd2FzIGp1c3Qgd2FraW5nCisgICAgLy8gdXAgYWZ0ZXIgc2xlZXBpbmcgaW4gdGhlIHBvb2wsIGhhZCByZXNldCBpdCdzIHRoX2FjdGl2ZV9pbl9wb29sIGZsYWcgYnV0CisgICAgLy8gbm90IGRlY3JlbWVudGVkIHRoZSBnbG9iYWwgY291bnRlciBfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoIHlldCwgdGhlbgorICAgIC8vIHRoZSBnbG9iYWwgY291bnRlciBtaWdodCBub3QgZ2V0IHVwZGF0ZWQuCisgICAgLy8KKyAgICAvLyBDdXJyZW50bHksIHRoaXMgY2FuIG9ubHkgaGFwcGVuIGFzIHRoZSBsaWJyYXJ5IGlzIHVubG9hZGVkLAorICAgIC8vIHNvIHRoZXJlIGFyZSBubyBoYXJtZnVsIHNpZGUgZWZmZWN0cy4KKyAgICBpZiAodGhyZWFkLT50aC50aF9hY3RpdmVfaW5fcG9vbCkgeworICAgICAgdGhyZWFkLT50aC50aF9hY3RpdmVfaW5fcG9vbCA9IEZBTFNFOworICAgICAgS01QX1RFU1RfVEhFTl9ERUMzMigmX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCk7CisgICAgICBLTVBfREVCVUdfQVNTRVJUKFRDUl80KF9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGgpID49IDApOworICAgIH0KKworICAgIC8vIERlY3JlbWVudCAjIG9mIFt3b3JrZXJdIHRocmVhZHMgaW4gdGhlIHBvb2wuCisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF90aHJlYWRfcG9vbF9udGggPiAwKTsKKyAgICAtLV9fa21wX3RocmVhZF9wb29sX250aDsKKyAgfTsgLy8gaWYKKworICBfX2ttcF9mcmVlX2ltcGxpY2l0X3Rhc2sodGhyZWFkKTsKKworLy8gRnJlZSB0aGUgZmFzdCBtZW1vcnkgZm9yIHRhc2tpbmcKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgX19rbXBfZnJlZV9mYXN0X21lbW9yeSh0aHJlYWQpOworI2VuZGlmIC8qIFVTRV9GQVNUX01FTU9SWSAqLworCisgIF9fa21wX3N1c3BlbmRfdW5pbml0aWFsaXplX3RocmVhZCh0aHJlYWQpOworCisgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfdGhyZWFkc1tndGlkXSA9PSB0aHJlYWQpOworICBUQ1dfU1lOQ19QVFIoX19rbXBfdGhyZWFkc1tndGlkXSwgTlVMTCk7CisKKyAgLS1fX2ttcF9hbGxfbnRoOworLy8gX19rbXBfbnRoIHdhcyBkZWNyZW1lbnRlZCB3aGVuIHRocmVhZCBpcyBhZGRlZCB0byB0aGUgcG9vbC4KKworI2lmZGVmIEtNUF9BREpVU1RfQkxPQ0tUSU1FCisgIC8qIEFkanVzdCBibG9ja3RpbWUgYmFjayB0byB1c2VyIHNldHRpbmcgb3IgZGVmYXVsdCBpZiBuZWNlc3NhcnkgKi8KKyAgLyogTWlkZGxlIGluaXRpYWxpemF0aW9uIG1pZ2h0IG5ldmVyIGhhdmUgb2NjdXJyZWQgICAgICAgICAgICAgICAgKi8KKyAgaWYgKCFfX2ttcF9lbnZfYmxvY2t0aW1lICYmIChfX2ttcF9hdmFpbF9wcm9jID4gMCkpIHsKKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2F2YWlsX3Byb2MgPiAwKTsKKyAgICBpZiAoX19rbXBfbnRoIDw9IF9fa21wX2F2YWlsX3Byb2MpIHsKKyAgICAgIF9fa21wX3plcm9fYnQgPSBGQUxTRTsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBLTVBfQURKVVNUX0JMT0NLVElNRSAqLworCisgIC8qIGZyZWUgdGhlIG1lbW9yeSBiZWluZyB1c2VkICovCisgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICBpZiAodGhyZWFkLT50aC50aF9jb25zKSB7CisgICAgICBfX2ttcF9mcmVlX2NvbnNfc3RhY2sodGhyZWFkLT50aC50aF9jb25zKTsKKyAgICAgIHRocmVhZC0+dGgudGhfY29ucyA9IE5VTEw7CisgICAgfTsgLy8gaWYKKyAgfQorCisgIGlmICh0aHJlYWQtPnRoLnRoX3ByaV9jb21tb24gIT0gTlVMTCkgeworICAgIF9fa21wX2ZyZWUodGhyZWFkLT50aC50aF9wcmlfY29tbW9uKTsKKyAgICB0aHJlYWQtPnRoLnRoX3ByaV9jb21tb24gPSBOVUxMOworICB9OyAvLyBpZgorCisgIGlmICh0aHJlYWQtPnRoLnRoX3Rhc2tfc3RhdGVfbWVtb19zdGFjayAhPSBOVUxMKSB7CisgICAgX19rbXBfZnJlZSh0aHJlYWQtPnRoLnRoX3Rhc2tfc3RhdGVfbWVtb19zdGFjayk7CisgICAgdGhyZWFkLT50aC50aF90YXNrX3N0YXRlX21lbW9fc3RhY2sgPSBOVUxMOworICB9CisKKyNpZiBLTVBfVVNFX0JHRVQKKyAgaWYgKHRocmVhZC0+dGgudGhfbG9jYWwuYmdldF9kYXRhICE9IE5VTEwpIHsKKyAgICBfX2ttcF9maW5hbGl6ZV9iZ2V0KHRocmVhZCk7CisgIH07IC8vIGlmCisjZW5kaWYKKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgaWYgKHRocmVhZC0+dGgudGhfYWZmaW5fbWFzayAhPSBOVUxMKSB7CisgICAgS01QX0NQVV9GUkVFKHRocmVhZC0+dGgudGhfYWZmaW5fbWFzayk7CisgICAgdGhyZWFkLT50aC50aF9hZmZpbl9tYXNrID0gTlVMTDsKKyAgfTsgLy8gaWYKKyNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKKyAgX19rbXBfcmVhcF90ZWFtKHRocmVhZC0+dGgudGhfc2VyaWFsX3RlYW0pOworICB0aHJlYWQtPnRoLnRoX3NlcmlhbF90ZWFtID0gTlVMTDsKKyAgX19rbXBfZnJlZSh0aHJlYWQpOworCisgIEtNUF9NQigpOworCit9IC8vIF9fa21wX3JlYXBfdGhyZWFkCisKK3N0YXRpYyB2b2lkIF9fa21wX2ludGVybmFsX2VuZCh2b2lkKSB7CisgIGludCBpOworCisgIC8qIEZpcnN0LCB1bnJlZ2lzdGVyIHRoZSBsaWJyYXJ5ICovCisgIF9fa21wX3VucmVnaXN0ZXJfbGlicmFyeSgpOworCisjaWYgS01QX09TX1dJTkRPV1MKKyAgLyogSW4gV2luIHN0YXRpYyBsaWJyYXJ5LCB3ZSBjYW4ndCB0ZWxsIHdoZW4gYSByb290IGFjdHVhbGx5IGRpZXMsIHNvIHdlCisgICAgIHJlY2xhaW0gdGhlIGRhdGEgc3RydWN0dXJlcyBmb3IgYW55IHJvb3QgdGhyZWFkcyB0aGF0IGhhdmUgZGllZCBidXQgbm90CisgICAgIHVucmVnaXN0ZXJlZCB0aGVtc2VsdmVzLCBpbiBvcmRlciB0byBzaHV0IGRvd24gY2xlYW5seS4KKyAgICAgSW4gV2luIGR5bmFtaWMgbGlicmFyeSB3ZSBhbHNvIGNhbid0IHRlbGwgd2hlbiBhIHRocmVhZCBkaWVzLiAgKi8KKyAgX19rbXBfcmVjbGFpbV9kZWFkX3Jvb3RzKCk7IC8vIEFDOiBtb3ZlZCBoZXJlIHRvIGFsd2F5cyBjbGVhbiByZXNvdXJjZXMgb2YKKy8vIGRlYWQgcm9vdHMKKyNlbmRpZgorCisgIGZvciAoaSA9IDA7IGkgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyBpKyspCisgICAgaWYgKF9fa21wX3Jvb3RbaV0pCisgICAgICBpZiAoX19rbXBfcm9vdFtpXS0+ci5yX2FjdGl2ZSkKKyAgICAgICAgYnJlYWs7CisgIEtNUF9NQigpOyAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworICBUQ1dfU1lOQ180KF9fa21wX2dsb2JhbC5nLmdfZG9uZSwgVFJVRSk7CisKKyAgaWYgKGkgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5KSB7CisjaWYgS01QX1VTRV9NT05JVE9SCisgICAgLy8gMjAwOS0wOS0wOCAobGV2KTogT3RoZXIgYWxpdmUgcm9vdHMgZm91bmQuIFdoeSBkbyB3ZSBraWxsIHRoZSBtb25pdG9yPz8KKyAgICBLTVBfTUIoKTsgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworLy8gTmVlZCB0byBjaGVjayB0aGF0IG1vbml0b3Igd2FzIGluaXRpYWxpemVkIGJlZm9yZSByZWFwaW5nIGl0LiBJZiB3ZSBhcmUKKy8vIGNhbGxlZCBmb3JtIF9fa21wX2F0Zm9ya19jaGlsZCAod2hpY2ggc2V0cyBfX2ttcF9pbml0X3BhcmFsbGVsID0gMCksIHRoZW4KKy8vIF9fa21wX21vbml0b3Igd2lsbCBhcHBlYXIgdG8gY29udGFpbiB2YWxpZCBkYXRhLCBidXQgaXQgaXMgb25seSB2YWxpZCBpbiB0aGUKKy8vIHBhcmVudCBwcm9jZXNzLCBub3QgdGhlIGNoaWxkLgorICAgIC8vIE5ldyBiZWhhdmlvciAoMjAxMDA4KTogaW5zdGVhZCBvZiBrZXlpbmcgb2ZmIG9mIHRoZSBmbGFnCisgICAgLy8gX19rbXBfaW5pdF9wYXJhbGxlbCwgdGhlIG1vbml0b3IgdGhyZWFkIGNyZWF0aW9uIGlzIGtleWVkIG9mZgorICAgIC8vIG9mIHRoZSBuZXcgZmxhZyBfX2ttcF9pbml0X21vbml0b3IuCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jaygmX19rbXBfbW9uaXRvcl9sb2NrKTsKKyAgICBpZiAoVENSXzQoX19rbXBfaW5pdF9tb25pdG9yKSkgeworICAgICAgX19rbXBfcmVhcF9tb25pdG9yKCZfX2ttcF9tb25pdG9yKTsKKyAgICAgIFRDV180KF9fa21wX2luaXRfbW9uaXRvciwgMCk7CisgICAgfQorICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJl9fa21wX21vbml0b3JfbG9jayk7CisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kOiBtb25pdG9yIHJlYXBlZFxuIikpOworI2VuZGlmIC8vIEtNUF9VU0VfTU9OSVRPUgorICB9IGVsc2UgeworLyogVE9ETyBtb3ZlIHRoaXMgdG8gY2xlYW51cCBjb2RlICovCisjaWZkZWYgS01QX0RFQlVHCisgICAgLyogbWFrZSBzdXJlIHRoYXQgZXZlcnl0aGluZyBoYXMgcHJvcGVybHkgZW5kZWQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgaSsrKSB7CisgICAgICBpZiAoX19rbXBfcm9vdFtpXSkgeworICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggISBLTVBfVUJFUl9HVElEKCBpICkgKTsgICAgICAgICAvLyBBQzoKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIHRoZXJlIGNhbiBiZSB1YmVyIHRocmVhZHMgYWxpdmUgaGVyZQorICAgICAgICBLTVBfQVNTRVJUKCFfX2ttcF9yb290W2ldLT5yLnJfYWN0aXZlKTsgLy8gVE9ETzogY2FuIHRoZXkgYmUgYWN0aXZlPworICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgS01QX01CKCk7CisKKyAgICAvLyBSZWFwIHRoZSB3b3JrZXIgdGhyZWFkcy4KKyAgICAvLyBUaGlzIGlzIHZhbGlkIGZvciBub3csIGJ1dCBiZSBjYXJlZnVsIGlmIHRocmVhZHMgYXJlIHJlYXBlZCBzb29uZXIuCisgICAgd2hpbGUgKF9fa21wX3RocmVhZF9wb29sICE9IE5VTEwpIHsgLy8gTG9vcCB0aHJ1IGFsbCB0aGUgdGhyZWFkIGluIHRoZSBwb29sLgorICAgICAgLy8gR2V0IHRoZSBuZXh0IHRocmVhZCBmcm9tIHRoZSBwb29sLgorICAgICAga21wX2luZm9fdCAqdGhyZWFkID0gQ0NBU1Qoa21wX2luZm9fdCAqLCBfX2ttcF90aHJlYWRfcG9vbCk7CisgICAgICBfX2ttcF90aHJlYWRfcG9vbCA9IHRocmVhZC0+dGgudGhfbmV4dF9wb29sOworICAgICAgLy8gUmVhcCBpdC4KKyAgICAgIEtNUF9ERUJVR19BU1NFUlQodGhyZWFkLT50aC50aF9yZWFwX3N0YXRlID09IEtNUF9TQUZFX1RPX1JFQVApOworICAgICAgdGhyZWFkLT50aC50aF9uZXh0X3Bvb2wgPSBOVUxMOworICAgICAgdGhyZWFkLT50aC50aF9pbl9wb29sID0gRkFMU0U7CisgICAgICBfX2ttcF9yZWFwX3RocmVhZCh0aHJlYWQsIDApOworICAgIH07IC8vIHdoaWxlCisgICAgX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0ID0gTlVMTDsKKworICAgIC8vIFJlYXAgdGVhbXMuCisgICAgd2hpbGUgKF9fa21wX3RlYW1fcG9vbCAhPSBOVUxMKSB7IC8vIExvb3AgdGhydSBhbGwgdGhlIHRlYW1zIGluIHRoZSBwb29sLgorICAgICAgLy8gR2V0IHRoZSBuZXh0IHRlYW0gZnJvbSB0aGUgcG9vbC4KKyAgICAgIGttcF90ZWFtX3QgKnRlYW0gPSBDQ0FTVChrbXBfdGVhbV90ICosIF9fa21wX3RlYW1fcG9vbCk7CisgICAgICBfX2ttcF90ZWFtX3Bvb2wgPSB0ZWFtLT50LnRfbmV4dF9wb29sOworICAgICAgLy8gUmVhcCBpdC4KKyAgICAgIHRlYW0tPnQudF9uZXh0X3Bvb2wgPSBOVUxMOworICAgICAgX19rbXBfcmVhcF90ZWFtKHRlYW0pOworICAgIH07IC8vIHdoaWxlCisKKyAgICBfX2ttcF9yZWFwX3Rhc2tfdGVhbXMoKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyArK2kpIHsKKyAgICAgIC8vIFRCRDogQWRkIHNvbWUgY2hlY2tpbmcuLi4KKyAgICAgIC8vIFNvbWV0aGluZyBsaWtlIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RocmVhZFsgaSBdID09IE5VTEwgKTsKKyAgICB9CisKKyAgICAvKiBNYWtlIHN1cmUgYWxsIHRocmVhZHByaXZhdGUgZGVzdHJ1Y3RvcnMgZ2V0IHJ1biBieSBqb2luaW5nIHdpdGggYWxsCisgICAgICAgd29ya2VyIHRocmVhZHMgYmVmb3JlIHJlc2V0dGluZyB0aGlzIGZsYWcgKi8KKyAgICBUQ1dfU1lOQ180KF9fa21wX2luaXRfY29tbW9uLCBGQUxTRSk7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmQ6IGFsbCB3b3JrZXJzIHJlYXBlZFxuIikpOworICAgIEtNUF9NQigpOworCisjaWYgS01QX1VTRV9NT05JVE9SCisgICAgLy8gU2VlIG5vdGUgYWJvdmU6IE9uZSBvZiB0aGUgcG9zc2libGUgZml4ZXMgZm9yIENRMTM4NDM0IC8gQ1ExNDAxMjYKKyAgICAvLworICAgIC8vIEZJWE1FOiBwdXNoIGJvdGggY29kZSBmcmFnbWVudHMgZG93biBhbmQgQ1NFIHRoZW0/CisgICAgLy8gcHVzaCB0aGVtIGludG8gX19rbXBfY2xlYW51cCgpID8KKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF9tb25pdG9yX2xvY2spOworICAgIGlmIChUQ1JfNChfX2ttcF9pbml0X21vbml0b3IpKSB7CisgICAgICBfX2ttcF9yZWFwX21vbml0b3IoJl9fa21wX21vbml0b3IpOworICAgICAgVENXXzQoX19rbXBfaW5pdF9tb25pdG9yLCAwKTsKKyAgICB9CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jaygmX19rbXBfbW9uaXRvcl9sb2NrKTsKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmQ6IG1vbml0b3IgcmVhcGVkXG4iKSk7CisjZW5kaWYKKyAgfSAvKiBlbHNlICFfX2ttcF9nbG9iYWwudF9hY3RpdmUgKi8KKyAgVENXXzQoX19rbXBfaW5pdF9ndGlkLCBGQUxTRSk7CisgIEtNUF9NQigpOyAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgIF9fa21wX2NsZWFudXAoKTsKKyNpZiBPTVBUX1NVUFBPUlQKKyAgb21wdF9maW5pKCk7CisjZW5kaWYKK30KKwordm9pZCBfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeShpbnQgZ3RpZF9yZXEpIHsKKyAgLyogaWYgd2UgaGF2ZSBhbHJlYWR5IGNsZWFuZWQgdXAsIGRvbid0IHRyeSBhZ2FpbiwgaXQgd291bGRuJ3QgYmUgcHJldHR5ICovCisgIC8qIHRoaXMgc2hvdWxkbid0IGJlIGEgcmFjZSBjb25kaXRpb24gYmVjYXVzZSBfX2ttcF9pbnRlcm5hbF9lbmQoKSBpcyB0aGUKKyAgICAgb25seSBwbGFjZSB0byBjbGVhciBfX2ttcF9zZXJpYWxfaW5pdCAqLworICAvKiB3ZSdsbCBjaGVjayB0aGlzIGxhdGVyIHRvbywgYWZ0ZXIgd2UgZ2V0IHRoZSBsb2NrICovCisgIC8vIDIwMDktMDktMDY6IFdlIGRvIG5vdCBzZXQgZ19hYm9ydCB3aXRob3V0IHNldHRpbmcgZ19kb25lLiBUaGlzIGNoZWNrIGxvb2tzCisgIC8vIHJlZHVuZGFhbnQsIGJlY2F1c2UgdGhlIG5leHQgY2hlY2sgd2lsbCB3b3JrIGluIGFueSBjYXNlLgorICBpZiAoX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCkgeworICAgIEtBX1RSQUNFKDExLCAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiBhYm9ydCwgZXhpdGluZ1xuIikpOworICAgIC8qIFRPRE8gYWJvcnQ/ICovCisgICAgcmV0dXJuOworICB9CisgIGlmIChUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpIHx8ICFfX2ttcF9pbml0X3NlcmlhbCkgeworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiBhbHJlYWR5IGZpbmlzaGVkXG4iKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgS01QX01CKCk7IC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgLyogZmluZCBvdXQgd2hvIHdlIGFyZSBhbmQgd2hhdCB3ZSBzaG91bGQgZG8gKi8KKyAgeworICAgIGludCBndGlkID0gKGd0aWRfcmVxID49IDApID8gZ3RpZF9yZXEgOiBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpOworICAgIEtBX1RSQUNFKAorICAgICAgICAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeTogZW50ZXIgVCMlZCAgKCVkKVxuIiwgZ3RpZCwgZ3RpZF9yZXEpKTsKKyAgICBpZiAoZ3RpZCA9PSBLTVBfR1RJRF9TSFVURE9XTikgeworICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnk6ICFfX2ttcF9pbml0X3J1bnRpbWUsIHN5c3RlbSAiCisgICAgICAgICAgICAgICAgICAgICJhbHJlYWR5IHNodXRkb3duXG4iKSk7CisgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmIChndGlkID09IEtNUF9HVElEX01PTklUT1IpIHsKKyAgICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiBtb25pdG9yIHRocmVhZCwgZ3RpZCBub3QgIgorICAgICAgICAgICAgICAgICAgICAicmVnaXN0ZXJlZCwgb3Igc3lzdGVtIHNodXRkb3duXG4iKSk7CisgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmIChndGlkID09IEtNUF9HVElEX0RORSkgeworICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnk6IGd0aWQgbm90IHJlZ2lzdGVyZWQgb3Igc3lzdGVtICIKKyAgICAgICAgICAgICAgICAgICAgInNodXRkb3duXG4iKSk7CisgICAgICAvKiB3ZSBkb24ndCBrbm93IHdobyB3ZSBhcmUsIGJ1dCB3ZSBtYXkgc3RpbGwgc2h1dGRvd24gdGhlIGxpYnJhcnkgKi8KKyAgICB9IGVsc2UgaWYgKEtNUF9VQkVSX0dUSUQoZ3RpZCkpIHsKKyAgICAgIC8qIHVucmVnaXN0ZXIgb3Vyc2VsdmVzIGFzIGFuIHViZXIgdGhyZWFkLiAgZ3RpZCBpcyBubyBsb25nZXIgdmFsaWQgKi8KKyAgICAgIGlmIChfX2ttcF9yb290W2d0aWRdLT5yLnJfYWN0aXZlKSB7CisgICAgICAgIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgPSAtMTsKKyAgICAgICAgVENXX1NZTkNfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUsIFRSVUUpOworICAgICAgICBLQV9UUkFDRSgxMCwKKyAgICAgICAgICAgICAgICAgKCJfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeTogcm9vdCBzdGlsbCBhY3RpdmUsIGFib3J0IFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkKSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEtBX1RSQUNFKAorICAgICAgICAgICAgMTAsCisgICAgICAgICAgICAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiB1bnJlZ2lzdGVyaW5nIHNpYmxpbmcgVCMlZFxuIiwgZ3RpZCkpOworICAgICAgICBfX2ttcF91bnJlZ2lzdGVyX3Jvb3RfY3VycmVudF90aHJlYWQoZ3RpZCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKy8qIHdvcmtlciB0aHJlYWRzIG1heSBjYWxsIHRoaXMgZnVuY3Rpb24gdGhyb3VnaCB0aGUgYXRleGl0IGhhbmRsZXIsIGlmIHRoZXkKKyAqIGNhbGwgZXhpdCgpICovCisvKiBGb3Igbm93LCBza2lwIHRoZSB1c3VhbCBzdWJzZXF1ZW50IHByb2Nlc3NpbmcgYW5kIGp1c3QgZHVtcCB0aGUgZGVidWcgYnVmZmVyLgorICAgVE9ETzogZG8gYSB0aG9yb3VnaCBzaHV0ZG93biBpbnN0ZWFkICovCisjaWZkZWYgRFVNUF9ERUJVR19PTl9FWElUCisgICAgICBpZiAoX19rbXBfZGVidWdfYnVmKQorICAgICAgICBfX2ttcF9kdW1wX2RlYnVnX2J1ZmZlcigpOworI2VuZGlmCisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIC8qIHN5bmNocm9uaXplIHRoZSB0ZXJtaW5hdGlvbiBwcm9jZXNzICovCisgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soJl9fa21wX2luaXR6X2xvY2spOworCisgIC8qIGhhdmUgd2UgYWxyZWFkeSBmaW5pc2hlZCAqLworICBpZiAoX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCkgeworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiBhYm9ydCwgZXhpdGluZ1xuIikpOworICAgIC8qIFRPRE8gYWJvcnQ/ICovCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jaygmX19rbXBfaW5pdHpfbG9jayk7CisgICAgcmV0dXJuOworICB9CisgIGlmIChUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpIHx8ICFfX2ttcF9pbml0X3NlcmlhbCkgeworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJl9fa21wX2luaXR6X2xvY2spOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIFdlIG5lZWQgdGhpcyBsb2NrIHRvIGVuZm9yY2UgbXV0ZXggYmV0d2VlbiB0aGlzIHJlYWRpbmcgb2YKKyAgICAgX19rbXBfdGhyZWFkc19jYXBhY2l0eSBhbmQgdGhlIHdyaXRpbmcgYnkgX19rbXBfcmVnaXN0ZXJfcm9vdC4KKyAgICAgQWx0ZXJuYXRpdmVseSwgd2UgY2FuIHVzZSBhIGNvdW50ZXIgb2Ygcm9vdHMgdGhhdCBpcyBhdG9taWNhbGx5IHVwZGF0ZWQgYnkKKyAgICAgX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWRfcmVnLCBfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZSBhbmQKKyAgICAgX19rbXBfaW50ZXJuYWxfZW5kXyouICAqLworICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF9mb3Jram9pbl9sb2NrKTsKKworICAvKiBub3cgd2UgY2FuIHNhZmVseSBjb25kdWN0IHRoZSBhY3R1YWwgdGVybWluYXRpb24gKi8KKyAgX19rbXBfaW50ZXJuYWxfZW5kKCk7CisKKyAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jaygmX19rbXBfZm9ya2pvaW5fbG9jayk7CisgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJl9fa21wX2luaXR6X2xvY2spOworCisgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiBleGl0XG4iKSk7CisKKyNpZmRlZiBEVU1QX0RFQlVHX09OX0VYSVQKKyAgaWYgKF9fa21wX2RlYnVnX2J1ZikKKyAgICBfX2ttcF9kdW1wX2RlYnVnX2J1ZmZlcigpOworI2VuZGlmCisKKyNpZiBLTVBfT1NfV0lORE9XUworICBfX2ttcF9jbG9zZV9jb25zb2xlKCk7CisjZW5kaWYKKworICBfX2ttcF9maW5pX2FsbG9jYXRvcigpOworCit9IC8vIF9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5CisKK3ZvaWQgX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZChpbnQgZ3RpZF9yZXEpIHsKKyAgaW50IGk7CisKKyAgLyogaWYgd2UgaGF2ZSBhbHJlYWR5IGNsZWFuZWQgdXAsIGRvbid0IHRyeSBhZ2FpbiwgaXQgd291bGRuJ3QgYmUgcHJldHR5ICovCisgIC8qIHRoaXMgc2hvdWxkbid0IGJlIGEgcmFjZSBjb25kaXRpb24gYmVjYXVzZSBfX2ttcF9pbnRlcm5hbF9lbmQoKSBpcyB0aGUKKyAgICogb25seSBwbGFjZSB0byBjbGVhciBfX2ttcF9zZXJpYWxfaW5pdCAqLworICAvKiB3ZSdsbCBjaGVjayB0aGlzIGxhdGVyIHRvbywgYWZ0ZXIgd2UgZ2V0IHRoZSBsb2NrICovCisgIC8vIDIwMDktMDktMDY6IFdlIGRvIG5vdCBzZXQgZ19hYm9ydCB3aXRob3V0IHNldHRpbmcgZ19kb25lLiBUaGlzIGNoZWNrIGxvb2tzCisgIC8vIHJlZHVuZGFudCwgYmVjYXVzZSB0aGUgbmV4dCBjaGVjayB3aWxsIHdvcmsgaW4gYW55IGNhc2UuCisgIGlmIChfX2ttcF9nbG9iYWwuZy5nX2Fib3J0KSB7CisgICAgS0FfVFJBQ0UoMTEsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogYWJvcnQsIGV4aXRpbmdcbiIpKTsKKyAgICAvKiBUT0RPIGFib3J0PyAqLworICAgIHJldHVybjsKKyAgfQorICBpZiAoVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSB8fCAhX19rbXBfaW5pdF9zZXJpYWwpIHsKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiBhbHJlYWR5IGZpbmlzaGVkXG4iKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgS01QX01CKCk7IC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgLyogZmluZCBvdXQgd2hvIHdlIGFyZSBhbmQgd2hhdCB3ZSBzaG91bGQgZG8gKi8KKyAgeworICAgIGludCBndGlkID0gKGd0aWRfcmVxID49IDApID8gZ3RpZF9yZXEgOiBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpOworICAgIEtBX1RSQUNFKDEwLAorICAgICAgICAgICAgICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogZW50ZXIgVCMlZCAgKCVkKVxuIiwgZ3RpZCwgZ3RpZF9yZXEpKTsKKyAgICBpZiAoZ3RpZCA9PSBLTVBfR1RJRF9TSFVURE9XTikgeworICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogIV9fa21wX2luaXRfcnVudGltZSwgc3lzdGVtICIKKyAgICAgICAgICAgICAgICAgICAgImFscmVhZHkgc2h1dGRvd25cbiIpKTsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKGd0aWQgPT0gS01QX0dUSURfTU9OSVRPUikgeworICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogbW9uaXRvciB0aHJlYWQsIGd0aWQgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgInJlZ2lzdGVyZWQsIG9yIHN5c3RlbSBzaHV0ZG93blxuIikpOworICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAoZ3RpZCA9PSBLTVBfR1RJRF9ETkUpIHsKKyAgICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF90aHJlYWQ6IGd0aWQgbm90IHJlZ2lzdGVyZWQgb3Igc3lzdGVtICIKKyAgICAgICAgICAgICAgICAgICAgInNodXRkb3duXG4iKSk7CisgICAgICByZXR1cm47CisgICAgICAvKiB3ZSBkb24ndCBrbm93IHdobyB3ZSBhcmUgKi8KKyAgICB9IGVsc2UgaWYgKEtNUF9VQkVSX0dUSUQoZ3RpZCkpIHsKKyAgICAgIC8qIHVucmVnaXN0ZXIgb3Vyc2VsdmVzIGFzIGFuIHViZXIgdGhyZWFkLiAgZ3RpZCBpcyBubyBsb25nZXIgdmFsaWQgKi8KKyAgICAgIGlmIChfX2ttcF9yb290W2d0aWRdLT5yLnJfYWN0aXZlKSB7CisgICAgICAgIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgPSAtMTsKKyAgICAgICAgVENXX1NZTkNfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUsIFRSVUUpOworICAgICAgICBLQV9UUkFDRSgxMCwKKyAgICAgICAgICAgICAgICAgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiByb290IHN0aWxsIGFjdGl2ZSwgYWJvcnQgVCMlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQpKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogdW5yZWdpc3RlcmluZyBzaWJsaW5nIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCkpOworICAgICAgICBfX2ttcF91bnJlZ2lzdGVyX3Jvb3RfY3VycmVudF90aHJlYWQoZ3RpZCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIGp1c3QgYSB3b3JrZXIgdGhyZWFkLCBsZXQncyBsZWF2ZSAqLworICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogd29ya2VyIHRocmVhZCBUIyVkXG4iLCBndGlkKSk7CisKKyAgICAgIGlmIChndGlkID49IDApIHsKKyAgICAgICAgX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGFza190ZWFtID0gTlVMTDsKKyAgICAgIH0KKworICAgICAgS0FfVFJBQ0UoMTAsCisgICAgICAgICAgICAgICAoIl9fa21wX2ludGVybmFsX2VuZF90aHJlYWQ6IHdvcmtlciB0aHJlYWQgZG9uZSwgZXhpdGluZyBUIyVkXG4iLAorICAgICAgICAgICAgICAgIGd0aWQpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyNpZiBkZWZpbmVkIEtNUF9EWU5BTUlDX0xJQgorICAvLyBBQzogbGV0cyBub3Qgc2h1dGRvd24gdGhlIExpbnV4KiBPUyBkeW5hbWljIGxpYnJhcnkgYXQgdGhlIGV4aXQgb2YgdWJlcgorICAvLyB0aHJlYWQsIGJlY2F1c2Ugd2Ugd2lsbCBiZXR0ZXIgc2h1dGRvd24gbGF0ZXIgaW4gdGhlIGxpYnJhcnkgZGVzdHJ1Y3Rvci4KKyAgLy8gVGhlIHJlYXNvbiBvZiB0aGlzIGNoYW5nZSBpcyBwZXJmb3JtYW5jZSBwcm9ibGVtIHdoZW4gbm9uLW9wZW5tcCB0aHJlYWQgaW4KKyAgLy8gYSBsb29wIGZvcmtzIGFuZCBqb2lucyBtYW55IG9wZW5tcCB0aHJlYWRzLiBXZSBjYW4gc2F2ZSBhIGxvdCBvZiB0aW1lCisgIC8vIGtlZXBpbmcgd29ya2VyIHRocmVhZHMgYWxpdmUgdW50aWwgdGhlIHByb2dyYW0gc2h1dGRvd24uCisgIC8vIE9NOiBSZW1vdmVkIExpbnV4KiBPUyByZXN0cmljdGlvbiB0byBmaXggdGhlIGNyYXNoIG9uIE9TIFgqIChEUEQyMDAyMzk5NjYpCisgIC8vIGFuZCBXaW5kb3dzKERQRDIwMDI4NzQ0MykgdGhhdCBvY2N1cnMgd2hlbiB1c2luZyBjcml0aWNhbCBzZWN0aW9ucyBmcm9tCisgIC8vIGZvcmVpZ24gdGhyZWFkcy4KKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogZXhpdGluZyBUIyVkXG4iLCBndGlkX3JlcSkpOworICByZXR1cm47CisjZW5kaWYKKyAgLyogc3luY2hyb25pemUgdGhlIHRlcm1pbmF0aW9uIHByb2Nlc3MgKi8KKyAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jaygmX19rbXBfaW5pdHpfbG9jayk7CisKKyAgLyogaGF2ZSB3ZSBhbHJlYWR5IGZpbmlzaGVkICovCisgIGlmIChfX2ttcF9nbG9iYWwuZy5nX2Fib3J0KSB7CisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogYWJvcnQsIGV4aXRpbmdcbiIpKTsKKyAgICAvKiBUT0RPIGFib3J0PyAqLworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJl9fa21wX2luaXR6X2xvY2spOworICAgIHJldHVybjsKKyAgfQorICBpZiAoVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSB8fCAhX19rbXBfaW5pdF9zZXJpYWwpIHsKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF9pbml0el9sb2NrKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBXZSBuZWVkIHRoaXMgbG9jayB0byBlbmZvcmNlIG11dGV4IGJldHdlZW4gdGhpcyByZWFkaW5nIG9mCisgICAgIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgYW5kIHRoZSB3cml0aW5nIGJ5IF9fa21wX3JlZ2lzdGVyX3Jvb3QuCisgICAgIEFsdGVybmF0aXZlbHksIHdlIGNhbiB1c2UgYSBjb3VudGVyIG9mIHJvb3RzIHRoYXQgaXMgYXRvbWljYWxseSB1cGRhdGVkIGJ5CisgICAgIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkX3JlZywgX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemUgYW5kCisgICAgIF9fa21wX2ludGVybmFsX2VuZF8qLiAgKi8KKworICAvKiBzaG91bGQgd2UgZmluaXNoIHRoZSBydW4tdGltZT8gIGFyZSBhbGwgc2libGluZ3MgZG9uZT8gKi8KKyAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jaygmX19rbXBfZm9ya2pvaW5fbG9jayk7CisKKyAgZm9yIChpID0gMDsgaSA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7ICsraSkgeworICAgIGlmIChLTVBfVUJFUl9HVElEKGkpKSB7CisgICAgICBLQV9UUkFDRSgKKyAgICAgICAgICAxMCwKKyAgICAgICAgICAoIl9fa21wX2ludGVybmFsX2VuZF90aHJlYWQ6IHJlbWFpbmluZyBzaWJsaW5nIHRhc2s6IGd0aWQ9PSVkXG4iLCBpKSk7CisgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF9mb3Jram9pbl9sb2NrKTsKKyAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJl9fa21wX2luaXR6X2xvY2spOworICAgICAgcmV0dXJuOworICAgIH07CisgIH0KKworICAvKiBub3cgd2UgY2FuIHNhZmVseSBjb25kdWN0IHRoZSBhY3R1YWwgdGVybWluYXRpb24gKi8KKworICBfX2ttcF9pbnRlcm5hbF9lbmQoKTsKKworICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF9mb3Jram9pbl9sb2NrKTsKKyAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jaygmX19rbXBfaW5pdHpfbG9jayk7CisKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogZXhpdCBUIyVkXG4iLCBndGlkX3JlcSkpOworCisjaWZkZWYgRFVNUF9ERUJVR19PTl9FWElUCisgIGlmIChfX2ttcF9kZWJ1Z19idWYpCisgICAgX19rbXBfZHVtcF9kZWJ1Z19idWZmZXIoKTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMaWJyYXJ5IHJlZ2lzdHJhdGlvbiBzdHVmZi4KKworc3RhdGljIGxvbmcgX19rbXBfcmVnaXN0cmF0aW9uX2ZsYWcgPSAwOworLy8gUmFuZG9tIHZhbHVlIHVzZWQgdG8gaW5kaWNhdGUgbGlicmFyeSBpbml0aWFsaXphdGlvbi4KK3N0YXRpYyBjaGFyICpfX2ttcF9yZWdpc3RyYXRpb25fc3RyID0gTlVMTDsKKy8vIFZhbHVlIHRvIGJlIHNhdmVkIGluIGVudiB2YXIgX19LTVBfUkVHSVNURVJFRF9MSUJfPHBpZD4uCisKK3N0YXRpYyBpbmxpbmUgY2hhciAqX19rbXBfcmVnX3N0YXR1c19uYW1lKCkgeworICAvKiBPbiBSSEVMIDN1NSBpZiBsaW5rZWQgc3RhdGljYWxseSwgZ2V0cGlkKCkgcmV0dXJucyBkaWZmZXJlbnQgdmFsdWVzIGluCisgICAgIGVhY2ggdGhyZWFkLiBJZiByZWdpc3RyYXRpb24gYW5kIHVucmVnaXN0cmF0aW9uIGdvIGluIGRpZmZlcmVudCB0aHJlYWRzCisgICAgIChvbXBfbWlzY19vdGhlcl9yb290X2V4aXQuY3BwIHRlc3QgY2FzZSksIHRoZSBuYW1lIG9mIHJlZ2lzdGVyZWRfbGliX2VudgorICAgICBlbnYgdmFyIGNhbiBub3QgYmUgZm91bmQsIGJlY2F1c2UgdGhlIG5hbWUgd2lsbCBjb250YWluIGRpZmZlcmVudCBwaWQuICovCisgIHJldHVybiBfX2ttcF9zdHJfZm9ybWF0KCJfX0tNUF9SRUdJU1RFUkVEX0xJQl8lZCIsIChpbnQpZ2V0cGlkKCkpOworfSAvLyBfX2ttcF9yZWdfc3RhdHVzX2dldAorCit2b2lkIF9fa21wX3JlZ2lzdGVyX2xpYnJhcnlfc3RhcnR1cCh2b2lkKSB7CisKKyAgY2hhciAqbmFtZSA9IF9fa21wX3JlZ19zdGF0dXNfbmFtZSgpOyAvLyBOYW1lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgaW50IGRvbmUgPSAwOworICB1bmlvbiB7CisgICAgZG91YmxlIGR0aW1lOworICAgIGxvbmcgbHRpbWU7CisgIH0gdGltZTsKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgIF9fa21wX2luaXRpYWxpemVfc3lzdGVtX3RpY2soKTsKKyNlbmRpZgorICBfX2ttcF9yZWFkX3N5c3RlbV90aW1lKCZ0aW1lLmR0aW1lKTsKKyAgX19rbXBfcmVnaXN0cmF0aW9uX2ZsYWcgPSAweENBRkUwMDAwTCB8ICh0aW1lLmx0aW1lICYgMHgwMDAwRkZGRkwpOworICBfX2ttcF9yZWdpc3RyYXRpb25fc3RyID0KKyAgICAgIF9fa21wX3N0cl9mb3JtYXQoIiVwLSVseC0lcyIsICZfX2ttcF9yZWdpc3RyYXRpb25fZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfcmVnaXN0cmF0aW9uX2ZsYWcsIEtNUF9MSUJSQVJZX0ZJTEUpOworCisgIEtBX1RSQUNFKDUwLCAoIl9fa21wX3JlZ2lzdGVyX2xpYnJhcnlfc3RhcnR1cDogJXM9XCIlc1wiXG4iLCBuYW1lLAorICAgICAgICAgICAgICAgIF9fa21wX3JlZ2lzdHJhdGlvbl9zdHIpKTsKKworICB3aGlsZSAoIWRvbmUpIHsKKworICAgIGNoYXIgKnZhbHVlID0gTlVMTDsgLy8gQWN0dWFsIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworICAgIC8vIFNldCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgYnV0IGRvIG5vdCBvdmVyd3JpdGUgaWYgaXQgaXMgZXhpc3QuCisgICAgX19rbXBfZW52X3NldChuYW1lLCBfX2ttcF9yZWdpc3RyYXRpb25fc3RyLCAwKTsKKyAgICAvLyBDaGVjayB0aGUgdmFyaWFibGUgaXMgd3JpdHRlbi4KKyAgICB2YWx1ZSA9IF9fa21wX2Vudl9nZXQobmFtZSk7CisgICAgaWYgKHZhbHVlICE9IE5VTEwgJiYgc3RyY21wKHZhbHVlLCBfX2ttcF9yZWdpc3RyYXRpb25fc3RyKSA9PSAwKSB7CisKKyAgICAgIGRvbmUgPSAxOyAvLyBPaywgZW52aXJvbm1lbnQgdmFyaWFibGUgc2V0IHN1Y2Nlc3NmdWxseSwgZXhpdCB0aGUgbG9vcC4KKworICAgIH0gZWxzZSB7CisKKyAgICAgIC8vIE9vcHMuIFdyaXRlIGZhaWxlZC4gQW5vdGhlciBjb3B5IG9mIE9wZW5NUCBSVEwgaXMgaW4gbWVtb3J5LgorICAgICAgLy8gQ2hlY2sgd2hldGhlciBpdCBhbGl2ZSBvciBkZWFkLgorICAgICAgaW50IG5laWdoYm9yID0gMDsgLy8gMCAtLSB1bmtub3duIHN0YXR1cywgMSAtLSBhbGl2ZSwgMiAtLSBkZWFkLgorICAgICAgY2hhciAqdGFpbCA9IHZhbHVlOworICAgICAgY2hhciAqZmxhZ19hZGRyX3N0ciA9IE5VTEw7CisgICAgICBjaGFyICpmbGFnX3ZhbF9zdHIgPSBOVUxMOworICAgICAgY2hhciBjb25zdCAqZmlsZV9uYW1lID0gTlVMTDsKKyAgICAgIF9fa21wX3N0cl9zcGxpdCh0YWlsLCAnLScsICZmbGFnX2FkZHJfc3RyLCAmdGFpbCk7CisgICAgICBfX2ttcF9zdHJfc3BsaXQodGFpbCwgJy0nLCAmZmxhZ192YWxfc3RyLCAmdGFpbCk7CisgICAgICBmaWxlX25hbWUgPSB0YWlsOworICAgICAgaWYgKHRhaWwgIT0gTlVMTCkgeworICAgICAgICBsb25nICpmbGFnX2FkZHIgPSAwOworICAgICAgICBsb25nIGZsYWdfdmFsID0gMDsKKyAgICAgICAgS01QX1NTQ0FORihmbGFnX2FkZHJfc3RyLCAiJXAiLCAmZmxhZ19hZGRyKTsKKyAgICAgICAgS01QX1NTQ0FORihmbGFnX3ZhbF9zdHIsICIlbHgiLCAmZmxhZ192YWwpOworICAgICAgICBpZiAoZmxhZ19hZGRyICE9IDAgJiYgZmxhZ192YWwgIT0gMCAmJiBzdHJjbXAoZmlsZV9uYW1lLCAiIikgIT0gMCkgeworICAgICAgICAgIC8vIEZpcnN0LCBjaGVjayB3aGV0aGVyIGVudmlyb25tZW50LWVuY29kZWQgYWRkcmVzcyBpcyBtYXBwZWQgaW50bworICAgICAgICAgIC8vIGFkZHIgc3BhY2UuCisgICAgICAgICAgLy8gSWYgc28sIGRlcmVmZXJlbmNlIGl0IHRvIHNlZSBpZiBpdCBzdGlsbCBoYXMgdGhlIHJpZ2h0IHZhbHVlLgorICAgICAgICAgIGlmIChfX2ttcF9pc19hZGRyZXNzX21hcHBlZChmbGFnX2FkZHIpICYmICpmbGFnX2FkZHIgPT0gZmxhZ192YWwpIHsKKyAgICAgICAgICAgIG5laWdoYm9yID0gMTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gSWYgbm90LCB0aGVuIHdlIGtub3cgdGhlIG90aGVyIGNvcHkgb2YgdGhlIGxpYnJhcnkgaXMgbm8gbG9uZ2VyCisgICAgICAgICAgICAvLyBydW5uaW5nLgorICAgICAgICAgICAgbmVpZ2hib3IgPSAyOworICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGlmCisgICAgICB9OyAvLyBpZgorICAgICAgc3dpdGNoIChuZWlnaGJvcikgeworICAgICAgY2FzZSAwOiAvLyBDYW5ub3QgcGFyc2UgZW52aXJvbm1lbnQgdmFyaWFibGUgLS0gbmVpZ2hib3Igc3RhdHVzIHVua25vd24uCisgICAgICAgIC8vIEFzc3VtZSBpdCBpcyB0aGUgaW5jb21wYXRpYmxlIGZvcm1hdCBvZiBmdXR1cmUgdmVyc2lvbiBvZiB0aGUKKyAgICAgICAgLy8gbGlicmFyeS4gQXNzdW1lIHRoZSBvdGhlciBsaWJyYXJ5IGlzIGFsaXZlLgorICAgICAgICAvLyBXQVJOKCAuLi4gKTsgLy8gVE9ETzogSXNzdWUgYSB3YXJuaW5nLgorICAgICAgICBmaWxlX25hbWUgPSAidW5rbm93biBsaWJyYXJ5IjsKKyAgICAgIC8vIEF0dGVudGlvbiEgRmFsbGluZyB0byB0aGUgbmV4dCBjYXNlLiBUaGF0J3MgaW50ZW50aW9uYWwuCisgICAgICBjYXNlIDE6IHsgLy8gTmVpZ2hib3IgaXMgYWxpdmUuCisgICAgICAgIC8vIENoZWNrIGl0IGlzIGFsbG93ZWQuCisgICAgICAgIGNoYXIgKmR1cGxpY2F0ZV9vayA9IF9fa21wX2Vudl9nZXQoIktNUF9EVVBMSUNBVEVfTElCX09LIik7CisgICAgICAgIGlmICghX19rbXBfc3RyX21hdGNoX3RydWUoZHVwbGljYXRlX29rKSkgeworICAgICAgICAgIC8vIFRoYXQncyBub3QgYWxsb3dlZC4gSXNzdWUgZmF0YWwgZXJyb3IuCisgICAgICAgICAgX19rbXBfbXNnKGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyhEdXBsaWNhdGVMaWJyYXJ5LCBLTVBfTElCUkFSWV9GSUxFLCBmaWxlX25hbWUpLAorICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKER1cGxpY2F0ZUxpYnJhcnkpLCBfX2ttcF9tc2dfbnVsbCk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKGR1cGxpY2F0ZV9vayk7CisgICAgICAgIF9fa21wX2R1cGxpY2F0ZV9saWJyYXJ5X29rID0gMTsKKyAgICAgICAgZG9uZSA9IDE7IC8vIEV4aXQgdGhlIGxvb3AuCisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSAyOiB7IC8vIE5laWdoYm9yIGlzIGRlYWQuCisgICAgICAgIC8vIENsZWFyIHRoZSB2YXJpYWJsZSBhbmQgdHJ5IHRvIHJlZ2lzdGVyIGxpYnJhcnkgYWdhaW4uCisgICAgICAgIF9fa21wX2Vudl91bnNldChuYW1lKTsKKyAgICAgIH0gYnJlYWs7CisgICAgICBkZWZhdWx0OiB7IEtNUF9ERUJVR19BU1NFUlQoMCk7IH0gYnJlYWs7CisgICAgICB9OyAvLyBzd2l0Y2gKKworICAgIH07IC8vIGlmCisgICAgS01QX0lOVEVSTkFMX0ZSRUUoKHZvaWQgKil2YWx1ZSk7CisKKyAgfTsgLy8gd2hpbGUKKyAgS01QX0lOVEVSTkFMX0ZSRUUoKHZvaWQgKiluYW1lKTsKKworfSAvLyBmdW5jIF9fa21wX3JlZ2lzdGVyX2xpYnJhcnlfc3RhcnR1cAorCit2b2lkIF9fa21wX3VucmVnaXN0ZXJfbGlicmFyeSh2b2lkKSB7CisKKyAgY2hhciAqbmFtZSA9IF9fa21wX3JlZ19zdGF0dXNfbmFtZSgpOworICBjaGFyICp2YWx1ZSA9IF9fa21wX2Vudl9nZXQobmFtZSk7CisKKyAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9yZWdpc3RyYXRpb25fZmxhZyAhPSAwKTsKKyAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9yZWdpc3RyYXRpb25fc3RyICE9IE5VTEwpOworICBpZiAodmFsdWUgIT0gTlVMTCAmJiBzdHJjbXAodmFsdWUsIF9fa21wX3JlZ2lzdHJhdGlvbl9zdHIpID09IDApIHsKKyAgICAvLyBPaywgdGhpcyBpcyBvdXIgdmFyaWFibGUuIERlbGV0ZSBpdC4KKyAgICBfX2ttcF9lbnZfdW5zZXQobmFtZSk7CisgIH07IC8vIGlmCisKKyAgS01QX0lOVEVSTkFMX0ZSRUUoX19rbXBfcmVnaXN0cmF0aW9uX3N0cik7CisgIEtNUF9JTlRFUk5BTF9GUkVFKHZhbHVlKTsKKyAgS01QX0lOVEVSTkFMX0ZSRUUobmFtZSk7CisKKyAgX19rbXBfcmVnaXN0cmF0aW9uX2ZsYWcgPSAwOworICBfX2ttcF9yZWdpc3RyYXRpb25fc3RyID0gTlVMTDsKKworfSAvLyBfX2ttcF91bnJlZ2lzdGVyX2xpYnJhcnkKKworLy8gRW5kIG9mIExpYnJhcnkgcmVnaXN0cmF0aW9uIHN0dWZmLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIEtNUF9NSUNfU1VQUE9SVEVECisKK3N0YXRpYyB2b2lkIF9fa21wX2NoZWNrX21pY190eXBlKCkgeworICBrbXBfY3B1aWRfdCBjcHVpZF9zdGF0ZSA9IHswfTsKKyAga21wX2NwdWlkX3QgKmNzX3AgPSAmY3B1aWRfc3RhdGU7CisgIF9fa21wX3g4Nl9jcHVpZCgxLCAwLCBjc19wKTsKKyAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBtaWMxIGF0IHRoZSBtb21lbnQKKyAgaWYgKChjc19wLT5lYXggJiAweGZmMCkgPT0gMHhCMTApIHsKKyAgICBfX2ttcF9taWNfdHlwZSA9IG1pYzI7CisgIH0gZWxzZSBpZiAoKGNzX3AtPmVheCAmIDB4ZjBmZjApID09IDB4NTA2NzApIHsKKyAgICBfX2ttcF9taWNfdHlwZSA9IG1pYzM7CisgIH0gZWxzZSB7CisgICAgX19rbXBfbWljX3R5cGUgPSBub25fbWljOworICB9Cit9CisKKyNlbmRpZiAvKiBLTVBfTUlDX1NVUFBPUlRFRCAqLworCitzdGF0aWMgdm9pZCBfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZSh2b2lkKSB7CisgIGludCBpLCBndGlkOworICBpbnQgc2l6ZTsKKworICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZTogZW50ZXJcbiIpKTsKKworICBLTVBfREVCVUdfQVNTRVJUKHNpemVvZihrbXBfaW50MzIpID09IDQpOworICBLTVBfREVCVUdfQVNTRVJUKHNpemVvZihrbXBfdWludDMyKSA9PSA0KTsKKyAgS01QX0RFQlVHX0FTU0VSVChzaXplb2Yoa21wX2ludDY0KSA9PSA4KTsKKyAgS01QX0RFQlVHX0FTU0VSVChzaXplb2Yoa21wX3VpbnQ2NCkgPT0gOCk7CisgIEtNUF9ERUJVR19BU1NFUlQoc2l6ZW9mKGttcF9pbnRwdHJfdCkgPT0gc2l6ZW9mKHZvaWQgKikpOworCisjaWYgT01QVF9TVVBQT1JUCisgIG9tcHRfcHJlX2luaXQoKTsKKyNlbmRpZgorCisgIF9fa21wX3ZhbGlkYXRlX2xvY2tzKCk7CisKKyAgLyogSW5pdGlhbGl6ZSBpbnRlcm5hbCBtZW1vcnkgYWxsb2NhdG9yICovCisgIF9fa21wX2luaXRfYWxsb2NhdG9yKCk7CisKKyAgLyogUmVnaXN0ZXIgdGhlIGxpYnJhcnkgc3RhcnR1cCB2aWEgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIGNoZWNrIHRvIHNlZQorICAgICB3aGV0aGVyIGFub3RoZXIgY29weSBvZiB0aGUgbGlicmFyeSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuICovCisKKyAgX19rbXBfcmVnaXN0ZXJfbGlicmFyeV9zdGFydHVwKCk7CisKKyAgLyogVE9ETyByZWluaXRpYWxpemF0aW9uIG9mIGxpYnJhcnkgKi8KKyAgaWYgKFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkpIHsKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZTogcmVpbml0aWFsaXphdGlvbiBvZiBsaWJyYXJ5XG4iKSk7CisgIH0KKworICBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ID0gMDsKKyAgVENXX1NZTkNfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUsIEZBTFNFKTsKKworLyogaW5pdGlhbGl6ZSB0aGUgbG9ja3MgKi8KKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisgIF9fa21wX2luaXRfc3BlY3VsYXRpdmVfc3RhdHMoKTsKKyNlbmRpZgorI2VuZGlmCisjaWYgS01QX1NUQVRTX0VOQUJMRUQKKyAgX19rbXBfc3RhdHNfaW5pdCgpOworI2VuZGlmCisgIF9fa21wX2luaXRfbG9jaygmX19rbXBfZ2xvYmFsX2xvY2spOworICBfX2ttcF9pbml0X3F1ZXVpbmdfbG9jaygmX19rbXBfZGlzcGF0Y2hfbG9jayk7CisgIF9fa21wX2luaXRfbG9jaygmX19rbXBfZGVidWdfbG9jayk7CisgIF9fa21wX2luaXRfYXRvbWljX2xvY2soJl9fa21wX2F0b21pY19sb2NrKTsKKyAgX19rbXBfaW5pdF9hdG9taWNfbG9jaygmX19rbXBfYXRvbWljX2xvY2tfMWkpOworICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCZfX2ttcF9hdG9taWNfbG9ja18yaSk7CisgIF9fa21wX2luaXRfYXRvbWljX2xvY2soJl9fa21wX2F0b21pY19sb2NrXzRpKTsKKyAgX19rbXBfaW5pdF9hdG9taWNfbG9jaygmX19rbXBfYXRvbWljX2xvY2tfNHIpOworICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCZfX2ttcF9hdG9taWNfbG9ja184aSk7CisgIF9fa21wX2luaXRfYXRvbWljX2xvY2soJl9fa21wX2F0b21pY19sb2NrXzhyKTsKKyAgX19rbXBfaW5pdF9hdG9taWNfbG9jaygmX19rbXBfYXRvbWljX2xvY2tfOGMpOworICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCZfX2ttcF9hdG9taWNfbG9ja18xMHIpOworICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCZfX2ttcF9hdG9taWNfbG9ja18xNnIpOworICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCZfX2ttcF9hdG9taWNfbG9ja18xNmMpOworICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCZfX2ttcF9hdG9taWNfbG9ja18yMGMpOworICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCZfX2ttcF9hdG9taWNfbG9ja18zMmMpOworICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF9mb3Jram9pbl9sb2NrKTsKKyAgX19rbXBfaW5pdF9ib290c3RyYXBfbG9jaygmX19rbXBfZXhpdF9sb2NrKTsKKyNpZiBLTVBfVVNFX01PTklUT1IKKyAgX19rbXBfaW5pdF9ib290c3RyYXBfbG9jaygmX19rbXBfbW9uaXRvcl9sb2NrKTsKKyNlbmRpZgorICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF90cF9jYWNoZWRfbG9jayk7CisKKyAgLyogY29uZHVjdCBpbml0aWFsaXphdGlvbiBhbmQgaW5pdGlhbCBzZXR1cCBvZiBjb25maWd1cmF0aW9uICovCisKKyAgX19rbXBfcnVudGltZV9pbml0aWFsaXplKCk7CisKKyNpZiBLTVBfTUlDX1NVUFBPUlRFRAorICBfX2ttcF9jaGVja19taWNfdHlwZSgpOworI2VuZGlmCisKKy8vIFNvbWUgZ2xvYmFsIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uIG1vdmVkIGhlcmUgZnJvbSBrbXBfZW52X2luaXRpYWxpemUoKQorI2lmZGVmIEtNUF9ERUJVRworICBrbXBfZGlhZyA9IDA7CisjZW5kaWYKKyAgX19rbXBfYWJvcnRfZGVsYXkgPSAwOworCisgIC8vIEZyb20gX19rbXBfaW5pdF9kZmx0X3RlYW1fbnRoKCkKKyAgLyogYXNzdW1lIHRoZSBlbnRpcmUgbWFjaGluZSB3aWxsIGJlIHVzZWQgKi8KKyAgX19rbXBfZGZsdF90ZWFtX250aF91YiA9IF9fa21wX3hwcm9jOworICBpZiAoX19rbXBfZGZsdF90ZWFtX250aF91YiA8IEtNUF9NSU5fTlRIKSB7CisgICAgX19rbXBfZGZsdF90ZWFtX250aF91YiA9IEtNUF9NSU5fTlRIOworICB9CisgIGlmIChfX2ttcF9kZmx0X3RlYW1fbnRoX3ViID4gX19rbXBfc3lzX21heF9udGgpIHsKKyAgICBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViID0gX19rbXBfc3lzX21heF9udGg7CisgIH0KKyAgX19rbXBfbWF4X250aCA9IF9fa21wX3N5c19tYXhfbnRoOworCisgIC8vIFRocmVlIHZhcnMgYmVsb3cgbW92ZWQgaGVyZSBmcm9tIF9fa21wX2Vudl9pbml0aWFsaXplKCkgIktNUF9CTE9DS1RJTUUiCisgIC8vIHBhcnQKKyAgX19rbXBfZGZsdF9ibG9ja3RpbWUgPSBLTVBfREVGQVVMVF9CTE9DS1RJTUU7CisjaWYgS01QX1VTRV9NT05JVE9SCisgIF9fa21wX21vbml0b3Jfd2FrZXVwcyA9CisgICAgICBLTVBfV0FLRVVQU19GUk9NX0JMT0NLVElNRShfX2ttcF9kZmx0X2Jsb2NrdGltZSwgX19rbXBfbW9uaXRvcl93YWtldXBzKTsKKyAgX19rbXBfYnRfaW50ZXJ2YWxzID0KKyAgICAgIEtNUF9JTlRFUlZBTFNfRlJPTV9CTE9DS1RJTUUoX19rbXBfZGZsdF9ibG9ja3RpbWUsIF9fa21wX21vbml0b3Jfd2FrZXVwcyk7CisjZW5kaWYKKyAgLy8gRnJvbSAiS01QX0xJQlJBUlkiIHBhcnQgb2YgX19rbXBfZW52X2luaXRpYWxpemUoKQorICBfX2ttcF9saWJyYXJ5ID0gbGlicmFyeV90aHJvdWdocHV0OworICAvLyBGcm9tIEtNUF9TQ0hFRFVMRSBpbml0aWFsaXphdGlvbgorICBfX2ttcF9zdGF0aWMgPSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZDsKKy8vIEFDOiBkbyBub3QgdXNlIGFuYWx5dGljYWwgaGVyZSwgYmVjYXVzZSBpdCBpcyBub24tbW9ub3Rvbm91cworLy9fX2ttcF9ndWlkZWQgPSBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZDsKKy8vX19rbXBfYXV0byA9IGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZDsgLy8gQUM6IGl0IGlzIHRoZSBkZWZhdWx0LCBubworLy8gbmVlZCB0byByZXBlYXQgYXNzaWdubWVudAorLy8gQmFycmllciBpbml0aWFsaXphdGlvbi4gTW92ZWQgaGVyZSBmcm9tIF9fa21wX2Vudl9pbml0aWFsaXplKCkgQmFycmllciBicmFuY2gKKy8vIGJpdCBjb250cm9sIGFuZCBiYXJyaWVyIG1ldGhvZCBjb250cm9sIHBhcnRzCisjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyNkZWZpbmUga21wX3JlZHVjdGlvbl9iYXJyaWVyX2dhdGhlcl9iYiAoKGludCkxKQorI2RlZmluZSBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfcmVsZWFzZV9iYiAoKGludCkxKQorI2RlZmluZSBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfZ2F0aGVyX3BhdCBicF9oeXBlcl9iYXIKKyNkZWZpbmUga21wX3JlZHVjdGlvbl9iYXJyaWVyX3JlbGVhc2VfcGF0IGJwX2h5cGVyX2JhcgorI2VuZGlmIC8vIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgIGZvciAoaSA9IGJzX3BsYWluX2JhcnJpZXI7IGkgPCBic19sYXN0X2JhcnJpZXI7IGkrKykgeworICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzW2ldID0gX19rbXBfYmFycmllcl9nYXRoZXJfYmJfZGZsdDsKKyAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbaV0gPSBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYmJfZGZsdDsKKyAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXR0ZXJuW2ldID0gX19rbXBfYmFycmllcl9nYXRoZXJfcGF0X2RmbHQ7CisgICAgX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm5baV0gPSBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0X2RmbHQ7CisjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICBpZiAoaSA9PSBic19yZWR1Y3Rpb25fYmFycmllcikgeyAvLyB0ZXN0ZWQgYW5kIGNvbmZpcm1lZCBvbiBBTFRJWCBvbmx5ICgKKyAgICAgIC8vIGxpbl82NCApOiBoeXBlciwxCisgICAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1tpXSA9IGttcF9yZWR1Y3Rpb25fYmFycmllcl9nYXRoZXJfYmI7CisgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbaV0gPSBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfcmVsZWFzZV9iYjsKKyAgICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm5baV0gPSBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfZ2F0aGVyX3BhdDsKKyAgICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuW2ldID0ga21wX3JlZHVjdGlvbl9iYXJyaWVyX3JlbGVhc2VfcGF0OworICAgIH0KKyNlbmRpZiAvLyBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICB9CisjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyN1bmRlZiBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfcmVsZWFzZV9wYXQKKyN1bmRlZiBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfZ2F0aGVyX3BhdAorI3VuZGVmIGttcF9yZWR1Y3Rpb25fYmFycmllcl9yZWxlYXNlX2JiCisjdW5kZWYga21wX3JlZHVjdGlvbl9iYXJyaWVyX2dhdGhlcl9iYgorI2VuZGlmIC8vIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisjaWYgS01QX01JQ19TVVBQT1JURUQKKyAgaWYgKF9fa21wX21pY190eXBlID09IG1pYzIpIHsgLy8gS05DCisgICAgLy8gQUM6IHBsYW5lPTMsMiwgZm9ya2pvaW49MiwxIGFyZSBvcHRpbWFsIGZvciAyNDAgdGhyZWFkcyBvbiBLTkMKKyAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1tic19wbGFpbl9iYXJyaWVyXSA9IDM7IC8vIHBsYWluIGdhdGhlcgorICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1tic19mb3Jram9pbl9iYXJyaWVyXSA9CisgICAgICAgIDE7IC8vIGZvcmtqb2luIHJlbGVhc2UKKyAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXR0ZXJuW2JzX2Zvcmtqb2luX2JhcnJpZXJdID0gYnBfaGllcmFyY2hpY2FsX2JhcjsKKyAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0dGVybltic19mb3Jram9pbl9iYXJyaWVyXSA9IGJwX2hpZXJhcmNoaWNhbF9iYXI7CisgIH0KKyNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICBpZiAoX19rbXBfbWljX3R5cGUgPT0gbWljMikgeyAvLyBLTkMKKyAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXR0ZXJuW2JzX3JlZHVjdGlvbl9iYXJyaWVyXSA9IGJwX2hpZXJhcmNoaWNhbF9iYXI7CisgICAgX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm5bYnNfcmVkdWN0aW9uX2JhcnJpZXJdID0gYnBfaGllcmFyY2hpY2FsX2JhcjsKKyAgfQorI2VuZGlmIC8vIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisjZW5kaWYgLy8gS01QX01JQ19TVVBQT1JURUQKKworLy8gRnJvbSBLTVBfQ0hFQ0tTIGluaXRpYWxpemF0aW9uCisjaWZkZWYgS01QX0RFQlVHCisgIF9fa21wX2Vudl9jaGVja3MgPSBUUlVFOyAvKiBkZXZlbG9wbWVudCB2ZXJzaW9ucyBoYXZlIHRoZSBleHRyYSBjaGVja3MgKi8KKyNlbHNlCisgIF9fa21wX2Vudl9jaGVja3MgPSBGQUxTRTsgLyogcG9ydCB2ZXJzaW9ucyBkbyBub3QgaGF2ZSB0aGUgZXh0cmEgY2hlY2tzICovCisjZW5kaWYKKworICAvLyBGcm9tICJLTVBfRk9SRUlHTl9USFJFQURTX1RIUkVBRFBSSVZBVEUiIGluaXRpYWxpemF0aW9uCisgIF9fa21wX2ZvcmVpZ25fdHAgPSBUUlVFOworCisgIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pYyA9IEZBTFNFOworICBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9IGR5bmFtaWNfZGVmYXVsdDsKKworICBfX2ttcF9lbnZfaW5pdGlhbGl6ZShOVUxMKTsKKworLy8gUHJpbnQgYWxsIG1lc3NhZ2VzIGluIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KKyNpZmRlZiBLTVBfREVCVUcKKyAgY2hhciBjb25zdCAqdmFsID0gX19rbXBfZW52X2dldCgiS01QX0RVTVBfQ0FUQUxPRyIpOworICBpZiAoX19rbXBfc3RyX21hdGNoX3RydWUodmFsKSkgeworICAgIGttcF9zdHJfYnVmX3QgYnVmZmVyOworICAgIF9fa21wX3N0cl9idWZfaW5pdCgmYnVmZmVyKTsKKyAgICBfX2ttcF9pMThuX2R1bXBfY2F0YWxvZygmYnVmZmVyKTsKKyAgICBfX2ttcF9wcmludGYoIiVzIiwgYnVmZmVyLnN0cik7CisgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCZidWZmZXIpOworICB9OyAvLyBpZgorICBfX2ttcF9lbnZfZnJlZSgmdmFsKTsKKyNlbmRpZgorCisgIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgPQorICAgICAgX19rbXBfaW5pdGlhbF90aHJlYWRzX2NhcGFjaXR5KF9fa21wX2RmbHRfdGVhbV9udGhfdWIpOworICAvLyBNb3ZlZCBoZXJlIGZyb20gX19rbXBfZW52X2luaXRpYWxpemUoKSAiS01QX0FMTF9USFJFQURQUklWQVRFIiBwYXJ0CisgIF9fa21wX3RwX2NhcGFjaXR5ID0gX19rbXBfZGVmYXVsdF90cF9jYXBhY2l0eSgKKyAgICAgIF9fa21wX2RmbHRfdGVhbV9udGhfdWIsIF9fa21wX21heF9udGgsIF9fa21wX2FsbFRocmVhZHNTcGVjaWZpZWQpOworCisgIC8vIElmIHRoZSBsaWJyYXJ5IGlzIHNodXQgZG93biBwcm9wZXJseSwgYm90aCBwb29scyBtdXN0IGJlIE5VTEwuIEp1c3QgaW4KKyAgLy8gY2FzZSwgc2V0IHRoZW0gdG8gTlVMTCAtLSBzb21lIG1lbW9yeSBtYXkgbGVhaywgYnV0IHN1YnNlcXVlbnQgY29kZSB3aWxsCisgIC8vIHdvcmsgZXZlbiBpZiBwb29scyBhcmUgbm90IGZyZWVkLgorICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX3RocmVhZF9wb29sID09IE5VTEwpOworICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdCA9PSBOVUxMKTsKKyAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF90ZWFtX3Bvb2wgPT0gTlVMTCk7CisgIF9fa21wX3RocmVhZF9wb29sID0gTlVMTDsKKyAgX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0ID0gTlVMTDsKKyAgX19rbXBfdGVhbV9wb29sID0gTlVMTDsKKworICAvKiBBbGxvY2F0ZSBhbGwgb2YgdGhlIHZhcmlhYmxlIHNpemVkIHJlY29yZHMgKi8KKyAgLyogTk9URTogX19rbXBfdGhyZWFkc19jYXBhY2l0eSBlbnRyaWVzIGFyZSBhbGxvY2F0ZWQsIGJ1dCB0aGUgYXJyYXlzIGFyZQorICAgKiBleHBhbmRhYmxlICovCisgIC8qIFNpbmNlIGFsbG9jYXRpb24gaXMgY2FjaGUtYWxpZ25lZCwganVzdCBhZGQgZXh0cmEgcGFkZGluZyBhdCB0aGUgZW5kICovCisgIHNpemUgPQorICAgICAgKHNpemVvZihrbXBfaW5mb190ICopICsgc2l6ZW9mKGttcF9yb290X3QgKikpICogX19rbXBfdGhyZWFkc19jYXBhY2l0eSArCisgICAgICBDQUNIRV9MSU5FOworICBfX2ttcF90aHJlYWRzID0gKGttcF9pbmZvX3QgKiopX19rbXBfYWxsb2NhdGUoc2l6ZSk7CisgIF9fa21wX3Jvb3QgPSAoa21wX3Jvb3RfdCAqKikoKGNoYXIgKilfX2ttcF90aHJlYWRzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa21wX2luZm9fdCAqKSAqIF9fa21wX3RocmVhZHNfY2FwYWNpdHkpOworCisgIC8qIGluaXQgdGhyZWFkIGNvdW50cyAqLworICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2FsbF9udGggPT0KKyAgICAgICAgICAgICAgICAgICAwKTsgLy8gQXNzZXJ0cyBmYWlsIGlmIHRoZSBsaWJyYXJ5IGlzIHJlaW5pdGlhbGl6aW5nIGFuZAorICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX250aCA9PSAwKTsgLy8gc29tZXRoaW5nIHdhcyB3cm9uZyBpbiB0ZXJtaW5hdGlvbi4KKyAgX19rbXBfYWxsX250aCA9IDA7CisgIF9fa21wX250aCA9IDA7CisKKyAgLyogc2V0dXAgdGhlIHViZXIgbWFzdGVyIHRocmVhZCBhbmQgaGllcmFyY2h5ICovCisgIGd0aWQgPSBfX2ttcF9yZWdpc3Rlcl9yb290KFRSVUUpOworICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZSAgVCMlZFxuIiwgZ3RpZCkpOworICBLTVBfQVNTRVJUKEtNUF9VQkVSX0dUSUQoZ3RpZCkpOworICBLTVBfQVNTRVJUKEtNUF9JTklUSUFMX0dUSUQoZ3RpZCkpOworCisgIEtNUF9NQigpOyAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgIF9fa21wX2NvbW1vbl9pbml0aWFsaXplKCk7CisKKyNpZiBLTVBfT1NfVU5JWAorICAvKiBpbnZva2UgdGhlIGNoaWxkIGZvcmsgaGFuZGxlciAqLworICBfX2ttcF9yZWdpc3Rlcl9hdGZvcmsoKTsKKyNlbmRpZgorCisjaWYgIWRlZmluZWQgS01QX0RZTkFNSUNfTElCCisgIHsKKyAgICAvKiBJbnZva2UgdGhlIGV4aXQgaGFuZGxlciB3aGVuIHRoZSBwcm9ncmFtIGZpbmlzaGVzLCBvbmx5IGZvciBzdGF0aWMKKyAgICAgICBsaWJyYXJ5LiBGb3IgZHluYW1pYyBsaWJyYXJ5LCB3ZSBhbHJlYWR5IGhhdmUgX2ZpbmkgYW5kIERsbE1haW4uICovCisgICAgaW50IHJjID0gYXRleGl0KF9fa21wX2ludGVybmFsX2VuZF9hdGV4aXQpOworICAgIGlmIChyYyAhPSAwKSB7CisgICAgICBfX2ttcF9tc2coa21wX21zX2ZhdGFsLCBLTVBfTVNHKEZ1bmN0aW9uRXJyb3IsICJhdGV4aXQoKSIpLCBLTVBfRVJSKHJjKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCk7CisgICAgfTsgLy8gaWYKKyAgfQorI2VuZGlmCisKKyNpZiBLTVBfSEFORExFX1NJR05BTFMKKyNpZiBLTVBfT1NfVU5JWAorICAvKiBOT1RFOiBtYWtlIHN1cmUgdGhhdCB0aGlzIGlzIGNhbGxlZCBiZWZvcmUgdGhlIHVzZXIgaW5zdGFsbHMgdGhlaXIgb3duCisgICAgIHNpZ25hbCBoYW5kbGVycyBzbyB0aGF0IHRoZSB1c2VyIGhhbmRsZXJzIGFyZSBjYWxsZWQgZmlyc3QuIHRoaXMgd2F5IHRoZXkKKyAgICAgY2FuIHJldHVybiBmYWxzZSwgbm90IGNhbGwgb3VyIGhhbmRsZXIsIGF2b2lkIHRlcm1pbmF0aW5nIHRoZSBsaWJyYXJ5LCBhbmQKKyAgICAgY29udGludWUgZXhlY3V0aW9uIHdoZXJlIHRoZXkgbGVmdCBvZmYuICovCisgIF9fa21wX2luc3RhbGxfc2lnbmFscyhGQUxTRSk7CisjZW5kaWYgLyogS01QX09TX1VOSVggKi8KKyNpZiBLTVBfT1NfV0lORE9XUworICBfX2ttcF9pbnN0YWxsX3NpZ25hbHMoVFJVRSk7CisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKyNlbmRpZgorCisgIC8qIHdlIGhhdmUgZmluaXNoZWQgdGhlIHNlcmlhbCBpbml0aWFsaXphdGlvbiAqLworICBfX2ttcF9pbml0X2NvdW50ZXIrKzsKKworICBfX2ttcF9pbml0X3NlcmlhbCA9IFRSVUU7CisKKyAgaWYgKF9fa21wX3NldHRpbmdzKSB7CisgICAgX19rbXBfZW52X3ByaW50KCk7CisgIH0KKworI2lmIE9NUF80MF9FTkFCTEVECisgIGlmIChfX2ttcF9kaXNwbGF5X2VudiB8fCBfX2ttcF9kaXNwbGF5X2Vudl92ZXJib3NlKSB7CisgICAgX19rbXBfZW52X3ByaW50XzIoKTsKKyAgfQorI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVECisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgb21wdF9wb3N0X2luaXQoKTsKKyNlbmRpZgorCisgIEtNUF9NQigpOworCisgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplOiBleGl0XG4iKSk7Cit9CisKK3ZvaWQgX19rbXBfc2VyaWFsX2luaXRpYWxpemUodm9pZCkgeworICBpZiAoX19rbXBfaW5pdF9zZXJpYWwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jaygmX19rbXBfaW5pdHpfbG9jayk7CisgIGlmIChfX2ttcF9pbml0X3NlcmlhbCkgeworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJl9fa21wX2luaXR6X2xvY2spOworICAgIHJldHVybjsKKyAgfQorICBfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZSgpOworICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF9pbml0el9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgX19rbXBfZG9fbWlkZGxlX2luaXRpYWxpemUodm9pZCkgeworICBpbnQgaSwgajsKKyAgaW50IHByZXZfZGZsdF90ZWFtX250aDsKKworICBpZiAoIV9fa21wX2luaXRfc2VyaWFsKSB7CisgICAgX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgfQorCisgIEtBX1RSQUNFKDEwLCAoIl9fa21wX21pZGRsZV9pbml0aWFsaXplOiBlbnRlclxuIikpOworCisgIC8vIFNhdmUgdGhlIHByZXZpb3VzIHZhbHVlIGZvciB0aGUgX19rbXBfZGZsdF90ZWFtX250aCBzbyB0aGF0CisgIC8vIHdlIGNhbiBhdm9pZCBzb21lIHJlaW5pdGlhbGl6YXRpb24gaWYgaXQgaGFzbid0IGNoYW5nZWQuCisgIHByZXZfZGZsdF90ZWFtX250aCA9IF9fa21wX2RmbHRfdGVhbV9udGg7CisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgIC8vIF9fa21wX2FmZmluaXR5X2luaXRpYWxpemUoKSB3aWxsIHRyeSB0byBzZXQgX19rbXBfbmNvcmVzIHRvIHRoZQorICAvLyBudW1iZXIgb2YgY29yZXMgb24gdGhlIG1hY2hpbmUuCisgIF9fa21wX2FmZmluaXR5X2luaXRpYWxpemUoKTsKKworICAvLyBSdW4gdGhyb3VnaCB0aGUgX19rbXBfdGhyZWFkcyBhcnJheSBhbmQgc2V0IHRoZSBhZmZpbml0eSBtYXNrCisgIC8vIGZvciBlYWNoIHJvb3QgdGhyZWFkIHRoYXQgaXMgY3VycmVudGx5IHJlZ2lzdGVyZWQgd2l0aCB0aGUgUlRMLgorICBmb3IgKGkgPSAwOyBpIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgaSsrKSB7CisgICAgaWYgKFRDUl9QVFIoX19rbXBfdGhyZWFkc1tpXSkgIT0gTlVMTCkgeworICAgICAgX19rbXBfYWZmaW5pdHlfc2V0X2luaXRfbWFzayhpLCBUUlVFKTsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKKyAgS01QX0FTU0VSVChfX2ttcF94cHJvYyA+IDApOworICBpZiAoX19rbXBfYXZhaWxfcHJvYyA9PSAwKSB7CisgICAgX19rbXBfYXZhaWxfcHJvYyA9IF9fa21wX3hwcm9jOworICB9CisKKyAgLy8gSWYgdGhlcmUgd2VyZSBlbXB0eSBwbGFjZXMgaW4gbnVtX3RocmVhZHMgbGlzdCAoT01QX05VTV9USFJFQURTPSwsMiwzKSwKKyAgLy8gY29ycmVjdCB0aGVtIG5vdworICBqID0gMDsKKyAgd2hpbGUgKChqIDwgX19rbXBfbmVzdGVkX250aC51c2VkKSAmJiAhX19rbXBfbmVzdGVkX250aC5udGhbal0pIHsKKyAgICBfX2ttcF9uZXN0ZWRfbnRoLm50aFtqXSA9IF9fa21wX2RmbHRfdGVhbV9udGggPSBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViID0KKyAgICAgICAgX19rbXBfYXZhaWxfcHJvYzsKKyAgICBqKys7CisgIH0KKworICBpZiAoX19rbXBfZGZsdF90ZWFtX250aCA9PSAwKSB7CisjaWZkZWYgS01QX0RGTFRfTlRIX0NPUkVTCisgICAgLy8gRGVmYXVsdCAjdGhyZWFkcyA9ICNjb3JlcworICAgIF9fa21wX2RmbHRfdGVhbV9udGggPSBfX2ttcF9uY29yZXM7CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfbWlkZGxlX2luaXRpYWxpemU6IHNldHRpbmcgX19rbXBfZGZsdF90ZWFtX250aCA9ICIKKyAgICAgICAgICAgICAgICAgICJfX2ttcF9uY29yZXMgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGgpKTsKKyNlbHNlCisgICAgLy8gRGVmYXVsdCAjdGhyZWFkcyA9ICNhdmFpbGFibGUgT1MgcHJvY3MKKyAgICBfX2ttcF9kZmx0X3RlYW1fbnRoID0gX19rbXBfYXZhaWxfcHJvYzsKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZTogc2V0dGluZyBfX2ttcF9kZmx0X3RlYW1fbnRoID0gIgorICAgICAgICAgICAgICAgICAgIl9fa21wX2F2YWlsX3Byb2MoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aCkpOworI2VuZGlmIC8qIEtNUF9ERkxUX05USF9DT1JFUyAqLworICB9CisKKyAgaWYgKF9fa21wX2RmbHRfdGVhbV9udGggPCBLTVBfTUlOX05USCkgeworICAgIF9fa21wX2RmbHRfdGVhbV9udGggPSBLTVBfTUlOX05USDsKKyAgfQorICBpZiAoX19rbXBfZGZsdF90ZWFtX250aCA+IF9fa21wX3N5c19tYXhfbnRoKSB7CisgICAgX19rbXBfZGZsdF90ZWFtX250aCA9IF9fa21wX3N5c19tYXhfbnRoOworICB9CisKKyAgLy8gVGhlcmUncyBubyBoYXJtIGluIGNvbnRpbnVpbmcgaWYgdGhlIGZvbGxvd2luZyBjaGVjayBmYWlscywKKyAgLy8gYnV0IGl0IGluZGljYXRlcyBhbiBlcnJvciBpbiB0aGUgcHJldmlvdXMgbG9naWMuCisgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfZGZsdF90ZWFtX250aCA8PSBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViKTsKKworICBpZiAoX19rbXBfZGZsdF90ZWFtX250aCAhPSBwcmV2X2RmbHRfdGVhbV9udGgpIHsKKyAgICAvLyBSdW4gdGhyb3VnaCB0aGUgX19rbXBfdGhyZWFkcyBhcnJheSBhbmQgc2V0IHRoZSBudW0gdGhyZWFkcyBpY3YgZm9yIGVhY2gKKyAgICAvLyByb290IHRocmVhZCB0aGF0IGlzIGN1cnJlbnRseSByZWdpc3RlcmVkIHdpdGggdGhlIFJUTCAod2hpY2ggaGFzIG5vdAorICAgIC8vIGFscmVhZHkgZXhwbGljaXRseSBzZXQgaXRzIG50aHJlYWRzLXZhciB3aXRoIGEgY2FsbCB0bworICAgIC8vIG9tcF9zZXRfbnVtX3RocmVhZHMoKSkuCisgICAgZm9yIChpID0gMDsgaSA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7IGkrKykgeworICAgICAga21wX2luZm9fdCAqdGhyZWFkID0gX19rbXBfdGhyZWFkc1tpXTsKKyAgICAgIGlmICh0aHJlYWQgPT0gTlVMTCkKKyAgICAgICAgY29udGludWU7CisgICAgICBpZiAodGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubnByb2MgIT0gMCkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIHNldF9fbnByb2MoX19rbXBfdGhyZWFkc1tpXSwgX19rbXBfZGZsdF90ZWFtX250aCk7CisgICAgfQorICB9CisgIEtBX1RSQUNFKAorICAgICAgMjAsCisgICAgICAoIl9fa21wX21pZGRsZV9pbml0aWFsaXplOiBmaW5hbCB2YWx1ZSBmb3IgX19rbXBfZGZsdF90ZWFtX250aCA9ICVkXG4iLAorICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGgpKTsKKworI2lmZGVmIEtNUF9BREpVU1RfQkxPQ0tUSU1FCisgIC8qIEFkanVzdCBibG9ja3RpbWUgdG8gemVybyBpZiBuZWNlc3NhcnkgIG5vdyB0aGF0IF9fa21wX2F2YWlsX3Byb2MgaXMgc2V0ICovCisgIGlmICghX19rbXBfZW52X2Jsb2NrdGltZSAmJiAoX19rbXBfYXZhaWxfcHJvYyA+IDApKSB7CisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9hdmFpbF9wcm9jID4gMCk7CisgICAgaWYgKF9fa21wX250aCA+IF9fa21wX2F2YWlsX3Byb2MpIHsKKyAgICAgIF9fa21wX3plcm9fYnQgPSBUUlVFOworICAgIH0KKyAgfQorI2VuZGlmIC8qIEtNUF9BREpVU1RfQkxPQ0tUSU1FICovCisKKyAgLyogd2UgaGF2ZSBmaW5pc2hlZCBtaWRkbGUgaW5pdGlhbGl6YXRpb24gKi8KKyAgVENXX1NZTkNfNChfX2ttcF9pbml0X21pZGRsZSwgVFJVRSk7CisKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBfZG9fbWlkZGxlX2luaXRpYWxpemU6IGV4aXRcbiIpKTsKK30KKwordm9pZCBfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSh2b2lkKSB7CisgIGlmIChfX2ttcF9pbml0X21pZGRsZSkgeworICAgIHJldHVybjsKKyAgfQorICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF9pbml0el9sb2NrKTsKKyAgaWYgKF9fa21wX2luaXRfbWlkZGxlKSB7CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jaygmX19rbXBfaW5pdHpfbG9jayk7CisgICAgcmV0dXJuOworICB9CisgIF9fa21wX2RvX21pZGRsZV9pbml0aWFsaXplKCk7CisgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJl9fa21wX2luaXR6X2xvY2spOworfQorCit2b2lkIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUodm9pZCkgeworICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsgLy8gdGhpcyBtaWdodCBiZSBhIG5ldyByb290CisKKyAgLyogc3luY2hyb25pemUgcGFyYWxsZWwgaW5pdGlhbGl6YXRpb24gKGZvciBzaWJsaW5nKSAqLworICBpZiAoVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkpCisgICAgcmV0dXJuOworICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF9pbml0el9sb2NrKTsKKyAgaWYgKFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpKSB7CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jaygmX19rbXBfaW5pdHpfbG9jayk7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogVE9ETyByZWluaXRpYWxpemF0aW9uIGFmdGVyIHdlIGhhdmUgYWxyZWFkeSBzaHV0IGRvd24gKi8KKyAgaWYgKFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkpIHsKKyAgICBLQV9UUkFDRSgKKyAgICAgICAgMTAsCisgICAgICAgICgiX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZTogYXR0ZW1wdCB0byBpbml0IHdoaWxlIHNodXR0aW5nIGRvd25cbiIpKTsKKyAgICBfX2ttcF9pbmZpbml0ZV9sb29wKCk7CisgIH0KKworICAvKiBqYzogVGhlIGxvY2sgX19rbXBfaW5pdHpfbG9jayBpcyBhbHJlYWR5IGhlbGQsIHNvIGNhbGxpbmcKKyAgICAgX19rbXBfc2VyaWFsX2luaXRpYWxpemUgd291bGQgY2F1c2UgYSBkZWFkbG9jay4gIFNvIHdlIGNhbGwKKyAgICAgX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemUgZGlyZWN0bHkuICovCisgIGlmICghX19rbXBfaW5pdF9taWRkbGUpIHsKKyAgICBfX2ttcF9kb19taWRkbGVfaW5pdGlhbGl6ZSgpOworICB9CisKKyAgLyogYmVnaW4gaW5pdGlhbGl6YXRpb24gKi8KKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZTogZW50ZXJcbiIpKTsKKyAgS01QX0FTU0VSVChLTVBfVUJFUl9HVElEKGd0aWQpKTsKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgLy8gU2F2ZSB0aGUgRlAgY29udHJvbCByZWdzLgorICAvLyBXb3JrZXIgdGhyZWFkcyB3aWxsIHNldCB0aGVpcnMgdG8gdGhlc2UgdmFsdWVzIGF0IHRocmVhZCBzdGFydHVwLgorICBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZCgmX19rbXBfaW5pdF94ODdfZnB1X2NvbnRyb2xfd29yZCk7CisgIF9fa21wX3N0b3JlX214Y3NyKCZfX2ttcF9pbml0X214Y3NyKTsKKyAgX19rbXBfaW5pdF9teGNzciAmPSBLTVBfWDg2X01YQ1NSX01BU0s7CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisjaWYgS01QX09TX1VOSVgKKyNpZiBLTVBfSEFORExFX1NJR05BTFMKKyAgLyogIG11c3QgYmUgYWZ0ZXIgX19rbXBfc2VyaWFsX2luaXRpYWxpemUgICovCisgIF9fa21wX2luc3RhbGxfc2lnbmFscyhUUlVFKTsKKyNlbmRpZgorI2VuZGlmCisKKyAgX19rbXBfc3VzcGVuZF9pbml0aWFsaXplKCk7CisKKyNpZiBkZWZpbmVkKFVTRV9MT0FEX0JBTEFOQ0UpCisgIGlmIChfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9PSBkeW5hbWljX2RlZmF1bHQpIHsKKyAgICBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9IGR5bmFtaWNfbG9hZF9iYWxhbmNlOworICB9CisjZWxzZQorICBpZiAoX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPT0gZHluYW1pY19kZWZhdWx0KSB7CisgICAgX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPSBkeW5hbWljX3RocmVhZF9saW1pdDsKKyAgfQorI2VuZGlmCisKKyAgaWYgKF9fa21wX3ZlcnNpb24pIHsKKyAgICBfX2ttcF9wcmludF92ZXJzaW9uXzIoKTsKKyAgfQorCisgIC8qIHdlIGhhdmUgZmluaXNoZWQgcGFyYWxsZWwgaW5pdGlhbGl6YXRpb24gKi8KKyAgVENXX1NZTkNfNChfX2ttcF9pbml0X3BhcmFsbGVsLCBUUlVFKTsKKworICBLTVBfTUIoKTsKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZTogZXhpdFxuIikpOworCisgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJl9fa21wX2luaXR6X2xvY2spOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBfX2ttcF9ydW5fYmVmb3JlX2ludm9rZWRfdGFzayhpbnQgZ3RpZCwgaW50IHRpZCwga21wX2luZm9fdCAqdGhpc190aHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF90ZWFtX3QgKnRlYW0pIHsKKyAga21wX2Rpc3BfdCAqZGlzcGF0Y2g7CisKKyAgS01QX01CKCk7CisKKyAgLyogbm9uZSBvZiB0aGUgdGhyZWFkcyBoYXZlIGVuY291bnRlcmVkIGFueSBjb25zdHJ1Y3RzLCB5ZXQuICovCisgIHRoaXNfdGhyLT50aC50aF9sb2NhbC50aGlzX2NvbnN0cnVjdCA9IDA7CisjaWYgS01QX0NBQ0hFX01BTkFHRQorICBLTVBfQ0FDSEVfUFJFRkVUQ0goJnRoaXNfdGhyLT50aC50aF9iYXJbYnNfZm9ya2pvaW5fYmFycmllcl0uYmIuYl9hcnJpdmVkKTsKKyNlbmRpZiAvKiBLTVBfQ0FDSEVfTUFOQUdFICovCisgIGRpc3BhdGNoID0gKGttcF9kaXNwX3QgKilUQ1JfUFRSKHRoaXNfdGhyLT50aC50aF9kaXNwYXRjaCk7CisgIEtNUF9ERUJVR19BU1NFUlQoZGlzcGF0Y2gpOworICBLTVBfREVCVUdfQVNTRVJUKHRlYW0tPnQudF9kaXNwYXRjaCk7CisgIC8vIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyLT50aC50aF9kaXNwYXRjaCA9PSAmdGVhbS0+dC50X2Rpc3BhdGNoWworICAvLyB0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc190aWQgXSApOworCisgIGRpc3BhdGNoLT50aF9kaXNwX2luZGV4ID0gMDsgLyogcmVzZXQgdGhlIGRpc3BhdGNoIGJ1ZmZlciBjb3VudGVyICovCisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgZGlzcGF0Y2gtPnRoX2RvYWNyb3NzX2J1Zl9pZHggPQorICAgICAgMDsgLyogcmVzZXQgdGhlIGRvYWNyb3NzIGRpc3BhdGNoIGJ1ZmZlciBjb3VudGVyICovCisjZW5kaWYKKyAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykKKyAgICBfX2ttcF9wdXNoX3BhcmFsbGVsKGd0aWQsIHRlYW0tPnQudF9pZGVudCk7CisKKyAgS01QX01CKCk7IC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCit9CisKK3ZvaWQgX19rbXBfcnVuX2FmdGVyX2ludm9rZWRfdGFzayhpbnQgZ3RpZCwgaW50IHRpZCwga21wX2luZm9fdCAqdGhpc190aHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3RlYW1fdCAqdGVhbSkgeworICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKQorICAgIF9fa21wX3BvcF9wYXJhbGxlbChndGlkLCB0ZWFtLT50LnRfaWRlbnQpOworCisgIF9fa21wX2ZpbmlzaF9pbXBsaWNpdF90YXNrKHRoaXNfdGhyKTsKK30KKworaW50IF9fa21wX2ludm9rZV90YXNrX2Z1bmMoaW50IGd0aWQpIHsKKyAgaW50IHJjOworICBpbnQgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKyAga21wX2luZm9fdCAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICBrbXBfdGVhbV90ICp0ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisKKyAgX19rbXBfcnVuX2JlZm9yZV9pbnZva2VkX3Rhc2soZ3RpZCwgdGlkLCB0aGlzX3RociwgdGVhbSk7CisjaWYgVVNFX0lUVF9CVUlMRAorICBpZiAoX19pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZV9wdHIpIHsKKyAgICBfX2ttcF9pdHRfc3RhY2tfY2FsbGVlX2VudGVyKAorICAgICAgICAoX19pdHRfY2FsbGVyKQorICAgICAgICAgICAgdGVhbS0+dC50X3N0YWNrX2lkKTsgLy8gaW5mb3JtIGl0dG5vdGlmeSBhYm91dCBlbnRlcmluZyB1c2VyJ3MgY29kZQorICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworI2lmIElOQ0xVREVfU1NDX01BUktTCisgIFNTQ19NQVJLX0lOVk9LSU5HKCk7CisjZW5kaWYKKworI2lmIE9NUFRfU1VQUE9SVAorICB2b2lkICpkdW1teTsKKyAgdm9pZCAqKmV4aXRfcnVudGltZV9wOworICBvbXB0X3Rhc2tfaWRfdCBteV90YXNrX2lkOworICBvbXB0X3BhcmFsbGVsX2lkX3QgbXlfcGFyYWxsZWxfaWQ7CisKKyAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgIGV4aXRfcnVudGltZV9wID0gJih0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAub21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lKTsKKyAgfSBlbHNlIHsKKyAgICBleGl0X3J1bnRpbWVfcCA9ICZkdW1teTsKKyAgfQorCisjaWYgT01QVF9UUkFDRQorICBteV90YXNrX2lkID0gdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS5vbXB0X3Rhc2tfaW5mby50YXNrX2lkOworICBteV9wYXJhbGxlbF9pZCA9IHRlYW0tPnQub21wdF90ZWFtX2luZm8ucGFyYWxsZWxfaWQ7CisgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luKSkgeworICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luKShteV9wYXJhbGxlbF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlfdGFza19pZCk7CisgIH0KKyNlbmRpZgorI2VuZGlmCisKKyAgeworICAgIEtNUF9USU1FX1BBUlRJVElPTkVEX0JMT0NLKE9NUF9wYXJhbGxlbCk7CisgICAgS01QX1NFVF9USFJFQURfU1RBVEVfQkxPQ0soSU1QTElDSVRfVEFTSyk7CisgICAgcmMgPQorICAgICAgICBfX2ttcF9pbnZva2VfbWljcm90YXNrKChtaWNyb3Rhc2tfdClUQ1JfU1lOQ19QVFIodGVhbS0+dC50X3BrZm4pLCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZCwgKGludCl0ZWFtLT50LnRfYXJnYywgKHZvaWQgKiopdGVhbS0+dC50X2FyZ3YKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdF9ydW50aW1lX3AKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisjaWYgT01QVF9TVVBQT1JUCisgICAgKmV4aXRfcnVudGltZV9wID0gTlVMTDsKKyNlbmRpZgorICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgIGlmIChfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlX3B0cikgeworICAgIF9fa21wX2l0dF9zdGFja19jYWxsZWVfbGVhdmUoCisgICAgICAgIChfX2l0dF9jYWxsZXIpCisgICAgICAgICAgICB0ZWFtLT50LnRfc3RhY2tfaWQpOyAvLyBpbmZvcm0gaXR0bm90aWZ5IGFib3V0IGxlYXZpbmcgdXNlcidzIGNvZGUKKyAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgX19rbXBfcnVuX2FmdGVyX2ludm9rZWRfdGFzayhndGlkLCB0aWQsIHRoaXNfdGhyLCB0ZWFtKTsKKworICByZXR1cm4gcmM7Cit9CisKKyNpZiBPTVBfNDBfRU5BQkxFRAordm9pZCBfX2ttcF90ZWFtc19tYXN0ZXIoaW50IGd0aWQpIHsKKyAgLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSBhbGwgbWFzdGVyIHRocmVhZHMgaW4gdGVhbXMgY29uc3RydWN0CisgIGttcF9pbmZvX3QgKnRociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgIGttcF90ZWFtX3QgKnRlYW0gPSB0aHItPnRoLnRoX3RlYW07CisgIGlkZW50X3QgKmxvYyA9IHRlYW0tPnQudF9pZGVudDsKKyAgdGhyLT50aC50aF9zZXRfbnByb2MgPSB0aHItPnRoLnRoX3RlYW1zX3NpemUubnRoOworICBLTVBfREVCVUdfQVNTRVJUKHRoci0+dGgudGhfdGVhbXNfbWljcm90YXNrKTsKKyAgS01QX0RFQlVHX0FTU0VSVCh0aHItPnRoLnRoX3NldF9ucHJvYyk7CisgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3RlYW1zX21hc3RlcjogVCMlZCwgVGlkICVkLCBtaWNyb3Rhc2sgJXBcbiIsIGd0aWQsCisgICAgICAgICAgICAgICAgX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKSwgdGhyLT50aC50aF90ZWFtc19taWNyb3Rhc2spKTsKKy8vIExhdW5jaCBsZWFndWUgb2YgdGVhbXMgbm93LCBidXQgbm90IGxldCB3b3JrZXJzIGV4ZWN1dGUKKy8vICh0aGV5IGhhbmcgb24gZm9yayBiYXJyaWVyIHVudGlsIG5leHQgcGFyYWxsZWwpCisjaWYgSU5DTFVERV9TU0NfTUFSS1MKKyAgU1NDX01BUktfRk9SS0lORygpOworI2VuZGlmCisgIF9fa21wX2ZvcmtfY2FsbChsb2MsIGd0aWQsIGZvcmtfY29udGV4dF9pbnRlbCwgdGVhbS0+dC50X2FyZ2MsCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAodm9pZCAqKXRoci0+dGgudGhfdGVhbXNfbWljcm90YXNrLCAvLyAidW53cmFwcGVkIiB0YXNrCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgIChtaWNyb3Rhc2tfdCl0aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzaywgLy8gIndyYXBwZWQiIHRhc2sKKyAgICAgICAgICAgICAgICAgIFZPTEFUSUxFX0NBU1QobGF1bmNoX3QpIF9fa21wX2ludm9rZV90YXNrX2Z1bmMsIE5VTEwpOworI2lmIElOQ0xVREVfU1NDX01BUktTCisgIFNTQ19NQVJLX0pPSU5JTkcoKTsKKyNlbmRpZgorCisgIC8vIEFDOiBsYXN0IHBhcmFtZXRlciAiMSIgZWxpbWluYXRlcyBqb2luIGJhcnJpZXIgd2hpY2ggd29uJ3Qgd29yayBiZWNhdXNlCisgIC8vIHdvcmtlciB0aHJlYWRzIGFyZSBpbiBhIGZvcmsgYmFycmllciB3YWl0aW5nIGZvciBtb3JlIHBhcmFsbGVsIHJlZ2lvbnMKKyAgX19rbXBfam9pbl9jYWxsKGxvYywgZ3RpZAorI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAgZm9ya19jb250ZXh0X2ludGVsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgIDEpOworfQorCitpbnQgX19rbXBfaW52b2tlX3RlYW1zX21hc3RlcihpbnQgZ3RpZCkgeworICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgIGttcF90ZWFtX3QgKnRlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyNpZiBLTVBfREVCVUcKKyAgaWYgKCFfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF90ZWFtLT50LnRfc2VyaWFsaXplZCkKKyAgICBLTVBfREVCVUdfQVNTRVJUKCh2b2lkICopX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbS0+dC50X3BrZm4gPT0KKyAgICAgICAgICAgICAgICAgICAgICh2b2lkICopX19rbXBfdGVhbXNfbWFzdGVyKTsKKyNlbmRpZgorICBfX2ttcF9ydW5fYmVmb3JlX2ludm9rZWRfdGFzayhndGlkLCAwLCB0aGlzX3RociwgdGVhbSk7CisgIF9fa21wX3RlYW1zX21hc3RlcihndGlkKTsKKyAgX19rbXBfcnVuX2FmdGVyX2ludm9rZWRfdGFzayhndGlkLCAwLCB0aGlzX3RociwgdGVhbSk7CisgIHJldHVybiAxOworfQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKy8qIHRoaXMgc2V0cyB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiB0aHJlYWRzIGZvciB0aGUgbmV4dCBwYXJhbGxlbCByZWdpb24KKyAgIGVuY291bnRlcmVkIGJ5IHRoaXMgdGVhbS4gc2luY2UgdGhpcyBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGZvcmtqb2luCisgICBjcml0aWNhbCBzZWN0aW9uIGl0IHNob3VsZCBhdm9pZCByYWNlIGNvbmRpdGlvbnMgd2l0aCBhc3N5bW1ldHJpY2FsIG5lc3RlZAorICAgcGFyYWxsZWxpc20gKi8KKwordm9pZCBfX2ttcF9wdXNoX251bV90aHJlYWRzKGlkZW50X3QgKmlkLCBpbnQgZ3RpZCwgaW50IG51bV90aHJlYWRzKSB7CisgIGttcF9pbmZvX3QgKnRociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisKKyAgaWYgKG51bV90aHJlYWRzID4gMCkKKyAgICB0aHItPnRoLnRoX3NldF9ucHJvYyA9IG51bV90aHJlYWRzOworfQorCisjaWYgT01QXzQwX0VOQUJMRUQKKworLyogdGhpcyBzZXRzIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIHRlYW1zIGZvciB0aGUgdGVhbXMgcmVnaW9uIGFuZC9vcgorICAgdGhlIG51bWJlciBvZiB0aHJlYWRzIGZvciB0aGUgbmV4dCBwYXJhbGxlbCByZWdpb24gZW5jb3VudGVyZWQgICovCit2b2lkIF9fa21wX3B1c2hfbnVtX3RlYW1zKGlkZW50X3QgKmlkLCBpbnQgZ3RpZCwgaW50IG51bV90ZWFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV90aHJlYWRzKSB7CisgIGttcF9pbmZvX3QgKnRociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgIEtNUF9ERUJVR19BU1NFUlQobnVtX3RlYW1zID49IDApOworICBLTVBfREVCVUdfQVNTRVJUKG51bV90aHJlYWRzID49IDApOworCisgIGlmIChudW1fdGVhbXMgPT0gMCkKKyAgICBudW1fdGVhbXMgPSAxOyAvLyBkZWZhdWx0IG51bWJlciBvZiB0ZWFtcyBpcyAxLgorICBpZiAobnVtX3RlYW1zID4gX19rbXBfbWF4X250aCkgeyAvLyBpZiB0b28gbWFueSB0ZWFtcyByZXF1ZXN0ZWQ/CisgICAgaWYgKCFfX2ttcF9yZXNlcnZlX3dhcm4pIHsKKyAgICAgIF9fa21wX3Jlc2VydmVfd2FybiA9IDE7CisgICAgICBfX2ttcF9tc2coa21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgS01QX01TRyhDYW50Rm9ybVRoclRlYW0sIG51bV90ZWFtcywgX19rbXBfbWF4X250aCksCisgICAgICAgICAgICAgICAgS01QX0hOVChVbnNldF9BTExfVEhSRUFEUyksIF9fa21wX21zZ19udWxsKTsKKyAgICB9CisgICAgbnVtX3RlYW1zID0gX19rbXBfbWF4X250aDsKKyAgfQorICAvLyBTZXQgbnVtYmVyIG9mIHRlYW1zIChudW1iZXIgb2YgdGhyZWFkcyBpbiB0aGUgb3V0ZXIgInBhcmFsbGVsIiBvZiB0aGUKKyAgLy8gdGVhbXMpCisgIHRoci0+dGgudGhfc2V0X25wcm9jID0gdGhyLT50aC50aF90ZWFtc19zaXplLm50ZWFtcyA9IG51bV90ZWFtczsKKworICAvLyBSZW1lbWJlciB0aGUgbnVtYmVyIG9mIHRocmVhZHMgZm9yIGlubmVyIHBhcmFsbGVsIHJlZ2lvbnMKKyAgaWYgKG51bV90aHJlYWRzID09IDApIHsKKyAgICBpZiAoIVRDUl80KF9fa21wX2luaXRfbWlkZGxlKSkKKyAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7IC8vIGdldCBfX2ttcF9hdmFpbF9wcm9jIGNhbGN1bGF0ZWQKKyAgICBudW1fdGhyZWFkcyA9IF9fa21wX2F2YWlsX3Byb2MgLyBudW1fdGVhbXM7CisgICAgaWYgKG51bV90ZWFtcyAqIG51bV90aHJlYWRzID4gX19rbXBfbWF4X250aCkgeworICAgICAgLy8gYWRqdXN0IG51bV90aHJlYWRzIHcvbyB3YXJuaW5nIGFzIGl0IGlzIG5vdCB1c2VyIHNldHRpbmcKKyAgICAgIG51bV90aHJlYWRzID0gX19rbXBfbWF4X250aCAvIG51bV90ZWFtczsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKG51bV90ZWFtcyAqIG51bV90aHJlYWRzID4gX19rbXBfbWF4X250aCkgeworICAgICAgaW50IG5ld190aHJlYWRzID0gX19rbXBfbWF4X250aCAvIG51bV90ZWFtczsKKyAgICAgIGlmICghX19rbXBfcmVzZXJ2ZV93YXJuKSB7IC8vIHVzZXIgYXNrZWQgZm9yIHRvbyBtYW55IHRocmVhZHMKKyAgICAgICAgX19rbXBfcmVzZXJ2ZV93YXJuID0gMTsgLy8gdGhhdCBjb25mbGljdHMgd2l0aCBPTVBfVEhSRUFEX0xJTUlUCisgICAgICAgIF9fa21wX21zZyhrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICAgIEtNUF9NU0coQ2FudEZvcm1UaHJUZWFtLCBudW1fdGhyZWFkcywgbmV3X3RocmVhZHMpLAorICAgICAgICAgICAgICAgICAgS01QX0hOVChVbnNldF9BTExfVEhSRUFEUyksIF9fa21wX21zZ19udWxsKTsKKyAgICAgIH0KKyAgICAgIG51bV90aHJlYWRzID0gbmV3X3RocmVhZHM7CisgICAgfQorICB9CisgIHRoci0+dGgudGhfdGVhbXNfc2l6ZS5udGggPSBudW1fdGhyZWFkczsKK30KKworLy8gU2V0IHRoZSBwcm9jX2JpbmQgdmFyIHRvIHVzZSBpbiB0aGUgZm9sbG93aW5nIHBhcmFsbGVsIHJlZ2lvbi4KK3ZvaWQgX19rbXBfcHVzaF9wcm9jX2JpbmQoaWRlbnRfdCAqaWQsIGludCBndGlkLCBrbXBfcHJvY19iaW5kX3QgcHJvY19iaW5kKSB7CisgIGttcF9pbmZvX3QgKnRociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgIHRoci0+dGgudGhfc2V0X3Byb2NfYmluZCA9IHByb2NfYmluZDsKK30KKworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKy8qIExhdW5jaCB0aGUgd29ya2VyIHRocmVhZHMgaW50byB0aGUgbWljcm90YXNrLiAqLworCit2b2lkIF9fa21wX2ludGVybmFsX2ZvcmsoaWRlbnRfdCAqaWQsIGludCBndGlkLCBrbXBfdGVhbV90ICp0ZWFtKSB7CisgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKworI2lmZGVmIEtNUF9ERUJVRworICBpbnQgZjsKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworICBLTVBfREVCVUdfQVNTRVJUKHRlYW0pOworICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyLT50aC50aF90ZWFtID09IHRlYW0pOworICBLTVBfQVNTRVJUKEtNUF9NQVNURVJfR1RJRChndGlkKSk7CisgIEtNUF9NQigpOyAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgIHRlYW0tPnQudF9jb25zdHJ1Y3QgPSAwOyAvKiBubyBzaW5nbGUgZGlyZWN0aXZlcyBzZWVuIHlldCAqLworICB0ZWFtLT50LnRfb3JkZXJlZC5kdC50X3ZhbHVlID0KKyAgICAgIDA7IC8qIHRocmVhZCAwIGVudGVycyB0aGUgb3JkZXJlZCBzZWN0aW9uIGZpcnN0ICovCisKKyAgLyogUmVzZXQgdGhlIGlkZW50aWZpZXJzIG9uIHRoZSBkaXNwYXRjaCBidWZmZXIgKi8KKyAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtLT50LnRfZGlzcF9idWZmZXIpOworICBpZiAodGVhbS0+dC50X21heF9ucHJvYyA+IDEpIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgX19rbXBfZGlzcGF0Y2hfbnVtX2J1ZmZlcnM7ICsraSkgeworICAgICAgdGVhbS0+dC50X2Rpc3BfYnVmZmVyW2ldLmJ1ZmZlcl9pbmRleCA9IGk7CisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICAgIHRlYW0tPnQudF9kaXNwX2J1ZmZlcltpXS5kb2Fjcm9zc19idWZfaWR4ID0gaTsKKyNlbmRpZgorICAgIH0KKyAgfSBlbHNlIHsKKyAgICB0ZWFtLT50LnRfZGlzcF9idWZmZXJbMF0uYnVmZmVyX2luZGV4ID0gMDsKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgIHRlYW0tPnQudF9kaXNwX2J1ZmZlclswXS5kb2Fjcm9zc19idWZfaWR4ID0gMDsKKyNlbmRpZgorICB9CisKKyAgS01QX01CKCk7IC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgIEtNUF9BU1NFUlQodGhpc190aHItPnRoLnRoX3RlYW0gPT0gdGVhbSk7CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgZm9yIChmID0gMDsgZiA8IHRlYW0tPnQudF9ucHJvYzsgZisrKSB7CisgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtLT50LnRfdGhyZWFkc1tmXSAmJgorICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbZl0tPnRoLnRoX3RlYW1fbnByb2MgPT0gdGVhbS0+dC50X25wcm9jKTsKKyAgfQorI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgIC8qIHJlbGVhc2UgdGhlIHdvcmtlciB0aHJlYWRzIHNvIHRoZXkgbWF5IGJlZ2luIHdvcmtpbmcgKi8KKyAgX19rbXBfZm9ya19iYXJyaWVyKGd0aWQsIDApOworfQorCit2b2lkIF9fa21wX2ludGVybmFsX2pvaW4oaWRlbnRfdCAqaWQsIGludCBndGlkLCBrbXBfdGVhbV90ICp0ZWFtKSB7CisgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKworICBLTVBfREVCVUdfQVNTRVJUKHRlYW0pOworICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyLT50aC50aF90ZWFtID09IHRlYW0pOworICBLTVBfQVNTRVJUKEtNUF9NQVNURVJfR1RJRChndGlkKSk7CisgIEtNUF9NQigpOyAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisvKiBKb2luIGJhcnJpZXIgYWZ0ZXIgZm9yayAqLworCisjaWZkZWYgS01QX0RFQlVHCisgIGlmIChfX2ttcF90aHJlYWRzW2d0aWRdICYmCisgICAgICBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF90ZWFtX25wcm9jICE9IHRlYW0tPnQudF9ucHJvYykgeworICAgIF9fa21wX3ByaW50ZigiR1RJRDogJWQsIF9fa21wX3RocmVhZHNbJWRdPSVwXG4iLCBndGlkLCBndGlkLAorICAgICAgICAgICAgICAgICBfX2ttcF90aHJlYWRzW2d0aWRdKTsKKyAgICBfX2ttcF9wcmludGYoIl9fa21wX3RocmVhZHNbJWRdLT50aC50aF90ZWFtX25wcm9jPSVkLCBURUFNOiAlcCwgIgorICAgICAgICAgICAgICAgICAidGVhbS0+dC50X25wcm9jPSVkXG4iLAorICAgICAgICAgICAgICAgICBndGlkLCBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF90ZWFtX25wcm9jLCB0ZWFtLAorICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfbnByb2MpOworICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZSgpOworICB9CisgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfdGhyZWFkc1tndGlkXSAmJgorICAgICAgICAgICAgICAgICAgIF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3RlYW1fbnByb2MgPT0gdGVhbS0+dC50X25wcm9jKTsKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworICBfX2ttcF9qb2luX2JhcnJpZXIoZ3RpZCk7IC8qIHdhaXQgZm9yIGV2ZXJ5b25lICovCisKKyAgS01QX01CKCk7IC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgIEtNUF9BU1NFUlQodGhpc190aHItPnRoLnRoX3RlYW0gPT0gdGVhbSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgVVNFX0xPQURfQkFMQU5DRQorCisvLyBSZXR1cm4gdGhlIHdvcmtlciB0aHJlYWRzIGFjdGl2ZWx5IHNwaW5uaW5nIGluIHRoZSBob3QgdGVhbSwgaWYgd2UKKy8vIGFyZSBhdCB0aGUgb3V0ZXJtb3N0IGxldmVsIG9mIHBhcmFsbGVsaXNtLiAgT3RoZXJ3aXNlLCByZXR1cm4gMC4KK3N0YXRpYyBpbnQgX19rbXBfYWN0aXZlX2hvdF90ZWFtX25wcm9jKGttcF9yb290X3QgKnJvb3QpIHsKKyAgaW50IGk7CisgIGludCByZXR2YWw7CisgIGttcF90ZWFtX3QgKmhvdF90ZWFtOworCisgIGlmIChyb290LT5yLnJfYWN0aXZlKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaG90X3RlYW0gPSByb290LT5yLnJfaG90X3RlYW07CisgIGlmIChfX2ttcF9kZmx0X2Jsb2NrdGltZSA9PSBLTVBfTUFYX0JMT0NLVElNRSkgeworICAgIHJldHVybiBob3RfdGVhbS0+dC50X25wcm9jIC0gMTsgLy8gRG9uJ3QgY291bnQgbWFzdGVyIHRocmVhZAorICB9CisKKyAgLy8gU2tpcCB0aGUgbWFzdGVyIHRocmVhZCAtIGl0IGlzIGFjY291bnRlZCBmb3IgZWxzZXdoZXJlLgorICByZXR2YWwgPSAwOworICBmb3IgKGkgPSAxOyBpIDwgaG90X3RlYW0tPnQudF9ucHJvYzsgaSsrKSB7CisgICAgaWYgKGhvdF90ZWFtLT50LnRfdGhyZWFkc1tpXS0+dGgudGhfYWN0aXZlKSB7CisgICAgICByZXR2YWwrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJldHZhbDsKK30KKworLy8gUGVyZm9ybSBhbiBhdXRvbWF0aWMgYWRqdXN0bWVudCB0byB0aGUgbnVtYmVyIG9mCisvLyB0aHJlYWRzIHVzZWQgYnkgdGhlIG5leHQgcGFyYWxsZWwgcmVnaW9uLgorc3RhdGljIGludCBfX2ttcF9sb2FkX2JhbGFuY2VfbnByb2Moa21wX3Jvb3RfdCAqcm9vdCwgaW50IHNldF9ucHJvYykgeworICBpbnQgcmV0dmFsOworICBpbnQgcG9vbF9hY3RpdmU7CisgIGludCBob3RfdGVhbV9hY3RpdmU7CisgIGludCB0ZWFtX2N1cnJfYWN0aXZlOworICBpbnQgc3lzdGVtX2FjdGl2ZTsKKworICBLQl9UUkFDRSgyMCwgKCJfX2ttcF9sb2FkX2JhbGFuY2VfbnByb2M6IGNhbGxlZCByb290OiVwIHNldF9ucHJvYzolZFxuIiwgcm9vdCwKKyAgICAgICAgICAgICAgICBzZXRfbnByb2MpKTsKKyAgS01QX0RFQlVHX0FTU0VSVChyb290KTsKKyAgS01QX0RFQlVHX0FTU0VSVChyb290LT5yLnJfcm9vdF90ZWFtLT50LnRfdGhyZWFkc1swXQorICAgICAgICAgICAgICAgICAgICAgICAtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5keW5hbWljID09IFRSVUUpOworICBLTVBfREVCVUdfQVNTRVJUKHNldF9ucHJvYyA+IDEpOworCisgIGlmIChzZXRfbnByb2MgPT0gMSkgeworICAgIEtCX1RSQUNFKDIwLCAoIl9fa21wX2xvYWRfYmFsYW5jZV9ucHJvYzogc2VyaWFsIGV4ZWN1dGlvbi5cbiIpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIC8vIFRocmVhZHMgdGhhdCBhcmUgYWN0aXZlIGluIHRoZSB0aHJlYWQgcG9vbCwgYWN0aXZlIGluIHRoZSBob3QgdGVhbSBmb3IgdGhpcworICAvLyBwYXJ0aWN1bGFyIHJvb3QgKGlmIHdlIGFyZSBhdCB0aGUgb3V0ZXIgcGFyIGxldmVsKSwgYW5kIHRoZSBjdXJyZW50bHkKKyAgLy8gZXhlY3V0aW5nIHRocmVhZCAodG8gYmVjb21lIHRoZSBtYXN0ZXIpIGFyZSBhdmFpbGFibGUgdG8gYWRkIHRvIHRoZSBuZXcKKyAgLy8gdGVhbSwgYnV0IGFyZSBjdXJyZW50bHkgY29udHJpYnV0aW5nIHRvIHRoZSBzeXN0ZW0gbG9hZCwgYW5kIG11c3QgYmUKKyAgLy8gYWNjb3VudGVkIGZvci4KKyAgcG9vbF9hY3RpdmUgPSBUQ1JfNChfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoKTsKKyAgaG90X3RlYW1fYWN0aXZlID0gX19rbXBfYWN0aXZlX2hvdF90ZWFtX25wcm9jKHJvb3QpOworICB0ZWFtX2N1cnJfYWN0aXZlID0gcG9vbF9hY3RpdmUgKyBob3RfdGVhbV9hY3RpdmUgKyAxOworCisgIC8vIENoZWNrIHRoZSBzeXN0ZW0gbG9hZC4KKyAgc3lzdGVtX2FjdGl2ZSA9IF9fa21wX2dldF9sb2FkX2JhbGFuY2UoX19rbXBfYXZhaWxfcHJvYyArIHRlYW1fY3Vycl9hY3RpdmUpOworICBLQl9UUkFDRSgzMCwgKCJfX2ttcF9sb2FkX2JhbGFuY2VfbnByb2M6IHN5c3RlbSBhY3RpdmUgPSAlZCBwb29sIGFjdGl2ZSA9ICVkICIKKyAgICAgICAgICAgICAgICAiaG90IHRlYW0gYWN0aXZlID0gJWRcbiIsCisgICAgICAgICAgICAgICAgc3lzdGVtX2FjdGl2ZSwgcG9vbF9hY3RpdmUsIGhvdF90ZWFtX2FjdGl2ZSkpOworCisgIGlmIChzeXN0ZW1fYWN0aXZlIDwgMCkgeworICAgIC8vIFRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIHRoZSBuZWNlc3NhcnkgaW5mbyBmcm9tIC9wcm9jLCBzbyB1c2UgdGhlCisgICAgLy8gdGhyZWFkIGxpbWl0IGFsZ29yaXRobSBpbnN0ZWFkLiBPbmNlIHdlIHNldCBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZQorICAgIC8vID0gZHluYW1pY190aHJlYWRfbGltaXQsIHdlIHNob3VsZG4ndCB3aW5kIHVwIGdldHRpbmcgYmFjayBoZXJlLgorICAgIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID0gZHluYW1pY190aHJlYWRfbGltaXQ7CisgICAgS01QX1dBUk5JTkcoQ2FudExvYWRCYWxVc2luZywgIktNUF9EWU5BTUlDX01PREU9dGhyZWFkIGxpbWl0Iik7CisKKyAgICAvLyBNYWtlIHRoaXMgY2FsbCBiZWhhdmUgbGlrZSB0aGUgdGhyZWFkIGxpbWl0IGFsZ29yaXRobS4KKyAgICByZXR2YWwgPSBfX2ttcF9hdmFpbF9wcm9jIC0gX19rbXBfbnRoICsKKyAgICAgICAgICAgICAocm9vdC0+ci5yX2FjdGl2ZSA/IDEgOiByb290LT5yLnJfaG90X3RlYW0tPnQudF9ucHJvYyk7CisgICAgaWYgKHJldHZhbCA+IHNldF9ucHJvYykgeworICAgICAgcmV0dmFsID0gc2V0X25wcm9jOworICAgIH0KKyAgICBpZiAocmV0dmFsIDwgS01QX01JTl9OVEgpIHsKKyAgICAgIHJldHZhbCA9IEtNUF9NSU5fTlRIOworICAgIH0KKworICAgIEtCX1RSQUNFKDIwLCAoIl9fa21wX2xvYWRfYmFsYW5jZV9ucHJvYzogdGhyZWFkIGxpbWl0IGV4aXQuIHJldHZhbDolZFxuIiwKKyAgICAgICAgICAgICAgICAgIHJldHZhbCkpOworICAgIHJldHVybiByZXR2YWw7CisgIH0KKworICAvLyBUaGVyZSBpcyBhIHNsaWdodCBkZWxheSBpbiB0aGUgbG9hZCBiYWxhbmNlIGFsZ29yaXRobSBpbiBkZXRlY3RpbmcgbmV3CisgIC8vIHJ1bm5pbmcgcHJvY3MuIFRoZSByZWFsIHN5c3RlbSBsb2FkIGF0IHRoaXMgaW5zdGFudCBzaG91bGQgYmUgYXQgbGVhc3QgYXMKKyAgLy8gbGFyZ2UgYXMgdGhlICNhY3RpdmUgb21wIHRocmVhZCB0aGF0IGFyZSBhdmFpbGFibGUgdG8gYWRkIHRvIHRoZSB0ZWFtLgorICBpZiAoc3lzdGVtX2FjdGl2ZSA8IHRlYW1fY3Vycl9hY3RpdmUpIHsKKyAgICBzeXN0ZW1fYWN0aXZlID0gdGVhbV9jdXJyX2FjdGl2ZTsKKyAgfQorICByZXR2YWwgPSBfX2ttcF9hdmFpbF9wcm9jIC0gc3lzdGVtX2FjdGl2ZSArIHRlYW1fY3Vycl9hY3RpdmU7CisgIGlmIChyZXR2YWwgPiBzZXRfbnByb2MpIHsKKyAgICByZXR2YWwgPSBzZXRfbnByb2M7CisgIH0KKyAgaWYgKHJldHZhbCA8IEtNUF9NSU5fTlRIKSB7CisgICAgcmV0dmFsID0gS01QX01JTl9OVEg7CisgIH0KKworICBLQl9UUkFDRSgyMCwgKCJfX2ttcF9sb2FkX2JhbGFuY2VfbnByb2M6IGV4aXQuIHJldHZhbDolZFxuIiwgcmV0dmFsKSk7CisgIHJldHVybiByZXR2YWw7Cit9IC8vIF9fa21wX2xvYWRfYmFsYW5jZV9ucHJvYygpCisKKyNlbmRpZiAvKiBVU0VfTE9BRF9CQUxBTkNFICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBOT1RFOiB0aGlzIGlzIGNhbGxlZCB3aXRoIHRoZSBfX2ttcF9pbml0X2xvY2sgaGVsZCAqLwordm9pZCBfX2ttcF9jbGVhbnVwKHZvaWQpIHsKKyAgaW50IGY7CisKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBfY2xlYW51cDogZW50ZXJcbiIpKTsKKworICBpZiAoVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkpIHsKKyNpZiBLTVBfSEFORExFX1NJR05BTFMKKyAgICBfX2ttcF9yZW1vdmVfc2lnbmFscygpOworI2VuZGlmCisgICAgVENXXzQoX19rbXBfaW5pdF9wYXJhbGxlbCwgRkFMU0UpOworICB9CisKKyAgaWYgKFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSkgeworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICBfX2ttcF9hZmZpbml0eV91bmluaXRpYWxpemUoKTsKKyNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisgICAgX19rbXBfY2xlYW51cF9oaWVyYXJjaHkoKTsKKyAgICBUQ1dfNChfX2ttcF9pbml0X21pZGRsZSwgRkFMU0UpOworICB9CisKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBfY2xlYW51cDogZ28gc2VyaWFsIGNsZWFudXBcbiIpKTsKKworICBpZiAoX19rbXBfaW5pdF9zZXJpYWwpIHsKKyAgICBfX2ttcF9ydW50aW1lX2Rlc3Ryb3koKTsKKyAgICBfX2ttcF9pbml0X3NlcmlhbCA9IEZBTFNFOworICB9CisKKyAgZm9yIChmID0gMDsgZiA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7IGYrKykgeworICAgIGlmIChfX2ttcF9yb290W2ZdICE9IE5VTEwpIHsKKyAgICAgIF9fa21wX2ZyZWUoX19rbXBfcm9vdFtmXSk7CisgICAgICBfX2ttcF9yb290W2ZdID0gTlVMTDsKKyAgICB9CisgIH0KKyAgX19rbXBfZnJlZShfX2ttcF90aHJlYWRzKTsKKyAgLy8gX19rbXBfdGhyZWFkcyBhbmQgX19rbXBfcm9vdCB3ZXJlIGFsbG9jYXRlZCBhdCBvbmNlLCBhcyBzaW5nbGUgYmxvY2ssIHNvCisgIC8vIHRoZXJlIGlzIG5vIG5lZWQgaW4gZnJlZWluZyBfX2ttcF9yb290LgorICBfX2ttcF90aHJlYWRzID0gTlVMTDsKKyAgX19rbXBfcm9vdCA9IE5VTEw7CisgIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgPSAwOworCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgX19rbXBfY2xlYW51cF9pbmRpcmVjdF91c2VyX2xvY2tzKCk7CisjZWxzZQorICBfX2ttcF9jbGVhbnVwX3VzZXJfbG9ja3MoKTsKKyNlbmRpZgorCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICBLTVBfSU5URVJOQUxfRlJFRShDQ0FTVChjaGFyICosIF9fa21wX2NwdWluZm9fZmlsZSkpOworICBfX2ttcF9jcHVpbmZvX2ZpbGUgPSBOVUxMOworI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKyAgX19rbXBfcHJpbnRfc3BlY3VsYXRpdmVfc3RhdHMoKTsKKyNlbmRpZgorI2VuZGlmCisgIEtNUF9JTlRFUk5BTF9GUkVFKF9fa21wX25lc3RlZF9udGgubnRoKTsKKyAgX19rbXBfbmVzdGVkX250aC5udGggPSBOVUxMOworICBfX2ttcF9uZXN0ZWRfbnRoLnNpemUgPSAwOworICBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQgPSAwOworICBLTVBfSU5URVJOQUxfRlJFRShfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXMpOworICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXMgPSBOVUxMOworICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnNpemUgPSAwOworICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgPSAwOworCisgIF9fa21wX2kxOG5fY2F0Y2xvc2UoKTsKKworI2lmIEtNUF9TVEFUU19FTkFCTEVECisgIF9fa21wX3N0YXRzX2ZpbmkoKTsKKyNlbmRpZgorCisgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2NsZWFudXA6IGV4aXRcbiIpKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2ludCBfX2ttcF9pZ25vcmVfbXBwYmVnKHZvaWQpIHsKKyAgY2hhciAqZW52OworCisgIGlmICgoZW52ID0gZ2V0ZW52KCJLTVBfSUdOT1JFX01QUEJFRyIpKSAhPSBOVUxMKSB7CisgICAgaWYgKF9fa21wX3N0cl9tYXRjaF9mYWxzZShlbnYpKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIC8vIEJ5IGRlZmF1bHQgX19rbXBjX2JlZ2luKCkgaXMgbm8tb3AuCisgIHJldHVybiBUUlVFOworfQorCitpbnQgX19rbXBfaWdub3JlX21wcGVuZCh2b2lkKSB7CisgIGNoYXIgKmVudjsKKworICBpZiAoKGVudiA9IGdldGVudigiS01QX0lHTk9SRV9NUFBFTkQiKSkgIT0gTlVMTCkgeworICAgIGlmIChfX2ttcF9zdHJfbWF0Y2hfZmFsc2UoZW52KSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICAvLyBCeSBkZWZhdWx0IF9fa21wY19lbmQoKSBpcyBuby1vcC4KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQgX19rbXBfaW50ZXJuYWxfYmVnaW4odm9pZCkgeworICBpbnQgZ3RpZDsKKyAga21wX3Jvb3RfdCAqcm9vdDsKKworICAvKiB0aGlzIGlzIGEgdmVyeSBpbXBvcnRhbnQgc3RlcCBhcyBpdCB3aWxsIHJlZ2lzdGVyIG5ldyBzaWJsaW5nIHRocmVhZHMKKyAgICAgYW5kIGFzc2lnbiB0aGVzZSBuZXcgdWJlciB0aHJlYWRzIGEgbmV3IGd0aWQgKi8KKyAgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgcm9vdCA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3Jvb3Q7CisgIEtNUF9BU1NFUlQoS01QX1VCRVJfR1RJRChndGlkKSk7CisKKyAgaWYgKHJvb3QtPnIucl9iZWdpbikKKyAgICByZXR1cm47CisgIF9fa21wX2FjcXVpcmVfbG9jaygmcm9vdC0+ci5yX2JlZ2luX2xvY2ssIGd0aWQpOworICBpZiAocm9vdC0+ci5yX2JlZ2luKSB7CisgICAgX19rbXBfcmVsZWFzZV9sb2NrKCZyb290LT5yLnJfYmVnaW5fbG9jaywgZ3RpZCk7CisgICAgcmV0dXJuOworICB9CisKKyAgcm9vdC0+ci5yX2JlZ2luID0gVFJVRTsKKworICBfX2ttcF9yZWxlYXNlX2xvY2soJnJvb3QtPnIucl9iZWdpbl9sb2NrLCBndGlkKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgX19rbXBfdXNlcl9zZXRfbGlicmFyeShlbnVtIGxpYnJhcnlfdHlwZSBhcmcpIHsKKyAgaW50IGd0aWQ7CisgIGttcF9yb290X3QgKnJvb3Q7CisgIGttcF9pbmZvX3QgKnRocmVhZDsKKworICAvKiBmaXJzdCwgbWFrZSBzdXJlIHdlIGFyZSBpbml0aWFsaXplZCBzbyB3ZSBjYW4gZ2V0IG91ciBndGlkICovCisKKyAgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgdGhyZWFkID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKworICByb290ID0gdGhyZWFkLT50aC50aF9yb290OworCisgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3VzZXJfc2V0X2xpYnJhcnk6IGVudGVyIFQjJWQsIGFyZzogJWQsICVkXG4iLCBndGlkLCBhcmcsCisgICAgICAgICAgICAgICAgbGlicmFyeV9zZXJpYWwpKTsKKyAgaWYgKHJvb3QtPnIucl9pbl9wYXJhbGxlbCkgeyAvKiBNdXN0IGJlIGNhbGxlZCBpbiBzZXJpYWwgc2VjdGlvbiBvZiB0b3AtbGV2ZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQgKi8KKyAgICBLTVBfV0FSTklORyhTZXRMaWJyYXJ5SW5jb3JyZWN0Q2FsbCk7CisgICAgcmV0dXJuOworICB9CisKKyAgc3dpdGNoIChhcmcpIHsKKyAgY2FzZSBsaWJyYXJ5X3NlcmlhbDoKKyAgICB0aHJlYWQtPnRoLnRoX3NldF9ucHJvYyA9IDA7CisgICAgc2V0X19ucHJvYyh0aHJlYWQsIDEpOworICAgIGJyZWFrOworICBjYXNlIGxpYnJhcnlfdHVybmFyb3VuZDoKKyAgICB0aHJlYWQtPnRoLnRoX3NldF9ucHJvYyA9IDA7CisgICAgc2V0X19ucHJvYyh0aHJlYWQsIF9fa21wX2RmbHRfdGVhbV9udGggPyBfX2ttcF9kZmx0X3RlYW1fbnRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViKTsKKyAgICBicmVhazsKKyAgY2FzZSBsaWJyYXJ5X3Rocm91Z2hwdXQ6CisgICAgdGhyZWFkLT50aC50aF9zZXRfbnByb2MgPSAwOworICAgIHNldF9fbnByb2ModGhyZWFkLCBfX2ttcF9kZmx0X3RlYW1fbnRoID8gX19rbXBfZGZsdF90ZWFtX250aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogX19rbXBfZGZsdF90ZWFtX250aF91Yik7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgS01QX0ZBVEFMKFVua25vd25MaWJyYXJ5VHlwZSwgYXJnKTsKKyAgfQorCisgIF9fa21wX2F1eF9zZXRfbGlicmFyeShhcmcpOworfQorCit2b2lkIF9fa21wX2F1eF9zZXRfc3RhY2tzaXplKHNpemVfdCBhcmcpIHsKKyAgaWYgKCFfX2ttcF9pbml0X3NlcmlhbCkKKyAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworCisjaWYgS01QX09TX0RBUldJTgorICBpZiAoYXJnICYgKDB4MTAwMCAtIDEpKSB7CisgICAgYXJnICY9IH4oMHgxMDAwIC0gMSk7CisgICAgaWYgKGFyZyArIDB4MTAwMCkgLyogY2hlY2sgZm9yIG92ZXJmbG93IGlmIHdlIHJvdW5kIHVwICovCisgICAgICBhcmcgKz0gMHgxMDAwOworICB9CisjZW5kaWYKKyAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jaygmX19rbXBfaW5pdHpfbG9jayk7CisKKyAgLyogb25seSBjaGFuZ2UgdGhlIGRlZmF1bHQgc3RhY2tzaXplIGJlZm9yZSB0aGUgZmlyc3QgcGFyYWxsZWwgcmVnaW9uICovCisgIGlmICghVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkpIHsKKyAgICBzaXplX3QgdmFsdWUgPSBhcmc7IC8qIGFyZ3VtZW50IGlzIGluIGJ5dGVzICovCisKKyAgICBpZiAodmFsdWUgPCBfX2ttcF9zeXNfbWluX3N0a3NpemUpCisgICAgICB2YWx1ZSA9IF9fa21wX3N5c19taW5fc3Rrc2l6ZTsKKyAgICBlbHNlIGlmICh2YWx1ZSA+IEtNUF9NQVhfU1RLU0laRSkKKyAgICAgIHZhbHVlID0gS01QX01BWF9TVEtTSVpFOworCisgICAgX19rbXBfc3Rrc2l6ZSA9IHZhbHVlOworCisgICAgX19rbXBfZW52X3N0a3NpemUgPSBUUlVFOyAvKiB3YXMgS01QX1NUQUNLU0laRSBzcGVjaWZpZWQ/ICovCisgIH0KKworICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF9pbml0el9sb2NrKTsKK30KKworLyogc2V0IHRoZSBiZWhhdmlvdXIgb2YgdGhlIHJ1bnRpbWUgbGlicmFyeSAqLworLyogVE9ETyB0aGlzIGNhbiBjYXVzZSBzb21lIG9kZCBiZWhhdmlvdXIgd2l0aCBzaWJsaW5nIHBhcmFsbGVsaXNtLi4uICovCit2b2lkIF9fa21wX2F1eF9zZXRfbGlicmFyeShlbnVtIGxpYnJhcnlfdHlwZSBhcmcpIHsKKyAgX19rbXBfbGlicmFyeSA9IGFyZzsKKworICBzd2l0Y2ggKF9fa21wX2xpYnJhcnkpIHsKKyAgY2FzZSBsaWJyYXJ5X3NlcmlhbDogeworICAgIEtNUF9JTkZPUk0oTGlicmFyeUlzU2VyaWFsKTsKKyAgICAodm9pZClfX2ttcF9jaGFuZ2VfbGlicmFyeShUUlVFKTsKKyAgfSBicmVhazsKKyAgY2FzZSBsaWJyYXJ5X3R1cm5hcm91bmQ6CisgICAgKHZvaWQpX19rbXBfY2hhbmdlX2xpYnJhcnkoVFJVRSk7CisgICAgYnJlYWs7CisgIGNhc2UgbGlicmFyeV90aHJvdWdocHV0OgorICAgICh2b2lkKV9fa21wX2NoYW5nZV9saWJyYXJ5KEZBTFNFKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBLTVBfRkFUQUwoVW5rbm93bkxpYnJhcnlUeXBlLCBhcmcpOworICB9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIF9fa21wX2F1eF9zZXRfYmxvY2t0aW1lKGludCBhcmcsIGttcF9pbmZvX3QgKnRocmVhZCwgaW50IHRpZCkgeworICBpbnQgYmxvY2t0aW1lID0gYXJnOyAvKiBhcmd1bWVudCBpcyBpbiBtaWxsaXNlY29uZHMgKi8KKyNpZiBLTVBfVVNFX01PTklUT1IKKyAgaW50IGJ0X2ludGVydmFsczsKKyNlbmRpZgorICBpbnQgYnRfc2V0OworCisgIF9fa21wX3NhdmVfaW50ZXJuYWxfY29udHJvbHModGhyZWFkKTsKKworICAvKiBOb3JtYWxpemUgYW5kIHNldCBibG9ja3RpbWUgZm9yIHRoZSB0ZWFtcyAqLworICBpZiAoYmxvY2t0aW1lIDwgS01QX01JTl9CTE9DS1RJTUUpCisgICAgYmxvY2t0aW1lID0gS01QX01JTl9CTE9DS1RJTUU7CisgIGVsc2UgaWYgKGJsb2NrdGltZSA+IEtNUF9NQVhfQkxPQ0tUSU1FKQorICAgIGJsb2NrdGltZSA9IEtNUF9NQVhfQkxPQ0tUSU1FOworCisgIHNldF9fYmxvY2t0aW1lX3RlYW0odGhyZWFkLT50aC50aF90ZWFtLCB0aWQsIGJsb2NrdGltZSk7CisgIHNldF9fYmxvY2t0aW1lX3RlYW0odGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbSwgMCwgYmxvY2t0aW1lKTsKKworI2lmIEtNUF9VU0VfTU9OSVRPUgorICAvKiBDYWxjdWxhdGUgYW5kIHNldCBibG9ja3RpbWUgaW50ZXJ2YWxzIGZvciB0aGUgdGVhbXMgKi8KKyAgYnRfaW50ZXJ2YWxzID0gS01QX0lOVEVSVkFMU19GUk9NX0JMT0NLVElNRShibG9ja3RpbWUsIF9fa21wX21vbml0b3Jfd2FrZXVwcyk7CisKKyAgc2V0X19idF9pbnRlcnZhbHNfdGVhbSh0aHJlYWQtPnRoLnRoX3RlYW0sIHRpZCwgYnRfaW50ZXJ2YWxzKTsKKyAgc2V0X19idF9pbnRlcnZhbHNfdGVhbSh0aHJlYWQtPnRoLnRoX3NlcmlhbF90ZWFtLCAwLCBidF9pbnRlcnZhbHMpOworI2VuZGlmCisKKyAgLyogU2V0IHdoZXRoZXIgYmxvY2t0aW1lIGhhcyBiZWVuIHNldCB0byAiVFJVRSIgKi8KKyAgYnRfc2V0ID0gVFJVRTsKKworICBzZXRfX2J0X3NldF90ZWFtKHRocmVhZC0+dGgudGhfdGVhbSwgdGlkLCBidF9zZXQpOworICBzZXRfX2J0X3NldF90ZWFtKHRocmVhZC0+dGgudGhfc2VyaWFsX3RlYW0sIDAsIGJ0X3NldCk7CisjaWYgS01QX1VTRV9NT05JVE9SCisgIEtGX1RSQUNFKDEwLCAoImttcF9zZXRfYmxvY2t0aW1lOiBUIyVkKCVkOiVkKSwgYmxvY2t0aW1lPSVkLCAiCisgICAgICAgICAgICAgICAgImJ0X2ludGVydmFscz0lZCwgbW9uaXRvcl91cGRhdGVzPSVkXG4iLAorICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aWQodGlkLCB0aHJlYWQtPnRoLnRoX3RlYW0pLAorICAgICAgICAgICAgICAgIHRocmVhZC0+dGgudGhfdGVhbS0+dC50X2lkLCB0aWQsIGJsb2NrdGltZSwgYnRfaW50ZXJ2YWxzLAorICAgICAgICAgICAgICAgIF9fa21wX21vbml0b3Jfd2FrZXVwcykpOworI2Vsc2UKKyAgS0ZfVFJBQ0UoMTAsICgia21wX3NldF9ibG9ja3RpbWU6IFQjJWQoJWQ6JWQpLCBibG9ja3RpbWU9JWRcbiIsCisgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZCh0aWQsIHRocmVhZC0+dGgudGhfdGVhbSksCisgICAgICAgICAgICAgICAgdGhyZWFkLT50aC50aF90ZWFtLT50LnRfaWQsIHRpZCwgYmxvY2t0aW1lKSk7CisjZW5kaWYKK30KKwordm9pZCBfX2ttcF9hdXhfc2V0X2RlZmF1bHRzKGNoYXIgY29uc3QgKnN0ciwgaW50IGxlbikgeworICBpZiAoIV9fa21wX2luaXRfc2VyaWFsKSB7CisgICAgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgfTsKKyAgX19rbXBfZW52X2luaXRpYWxpemUoc3RyKTsKKworICBpZiAoX19rbXBfc2V0dGluZ3MKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgfHwgX19rbXBfZGlzcGxheV9lbnYgfHwgX19rbXBfZGlzcGxheV9lbnZfdmVyYm9zZQorI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVECisgICAgICApIHsKKyAgICBfX2ttcF9lbnZfcHJpbnQoKTsKKyAgfQorfSAvLyBfX2ttcF9hdXhfc2V0X2RlZmF1bHRzCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogaW50ZXJuYWwgZmFzdCByZWR1Y3Rpb24gcm91dGluZXMgKi8KKworUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVAorX19rbXBfZGV0ZXJtaW5lX3JlZHVjdGlvbl9tZXRob2QoCisgICAgaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2ludDMyIG51bV92YXJzLCBzaXplX3QgcmVkdWNlX3NpemUsCisgICAgdm9pZCAqcmVkdWNlX2RhdGEsIHZvaWQgKCpyZWR1Y2VfZnVuYykodm9pZCAqbGhzX2RhdGEsIHZvaWQgKnJoc19kYXRhKSwKKyAgICBrbXBfY3JpdGljYWxfbmFtZSAqbGNrKSB7CisKKyAgLy8gRGVmYXVsdCByZWR1Y3Rpb24gbWV0aG9kOiBjcml0aWNhbCBjb25zdHJ1Y3QgKCBsY2sgIT0gTlVMTCwgbGlrZSBpbiBjdXJyZW50CisgIC8vIFBBUk9QVCApCisgIC8vIElmICggcmVkdWNlX2RhdGEhPU5VTEwgJiYgcmVkdWNlX2Z1bmMhPU5VTEwgKTogdGhlIHRyZWUtcmVkdWN0aW9uIG1ldGhvZAorICAvLyBjYW4gYmUgc2VsZWN0ZWQgYnkgUlRMCisgIC8vIElmIGxvYy0+ZmxhZ3MgY29udGFpbnMgS01QX0lERU5UX0FUT01JQ19SRURVQ0UsIHRoZSBhdG9taWMgcmVkdWNlIG1ldGhvZAorICAvLyBjYW4gYmUgc2VsZWN0ZWQgYnkgUlRMCisgIC8vIEZpbmFsbHksIGl0J3MgdXAgdG8gT3Blbk1QIFJUTCB0byBtYWtlIGEgZGVjaXNpb24gb24gd2hpY2ggbWV0aG9kIHRvIHNlbGVjdAorICAvLyBhbW9uZyBnZW5lcmF0ZWQgYnkgUEFST1BULgorCisgIFBBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QgcmV0dmFsOworCisgIGludCB0ZWFtX3NpemU7CisKKyAgS01QX0RFQlVHX0FTU0VSVChsb2MpOyAvLyBpdCB3b3VsZCBiZSBuaWNlIHRvIHRlc3QgKCBsb2MgIT0gMCApCisgIEtNUF9ERUJVR19BU1NFUlQobGNrKTsgLy8gaXQgd291bGQgYmUgbmljZSB0byB0ZXN0ICggbGNrICE9IDAgKQorCisjZGVmaW5lIEZBU1RfUkVEVUNUSU9OX0FUT01JQ19NRVRIT0RfR0VORVJBVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKGxvYy0+ZmxhZ3MgJiAoS01QX0lERU5UX0FUT01JQ19SRURVQ0UpKSA9PSAoS01QX0lERU5UX0FUT01JQ19SRURVQ0UpKQorI2RlZmluZSBGQVNUX1JFRFVDVElPTl9UUkVFX01FVEhPRF9HRU5FUkFURUQgKChyZWR1Y2VfZGF0YSkgJiYgKHJlZHVjZV9mdW5jKSkKKworICByZXR2YWwgPSBjcml0aWNhbF9yZWR1Y2VfYmxvY2s7CisKKyAgLy8gYW5vdGhlciBjaG9pY2Ugb2YgZ2V0dGluZyBhIHRlYW0gc2l6ZSAod2l0aCAxIGR5bmFtaWMgZGVmZXJlbmNlKSBpcyBzbG93ZXIKKyAgdGVhbV9zaXplID0gX19rbXBfZ2V0X3RlYW1fbnVtX3RocmVhZHMoZ2xvYmFsX3RpZCk7CisgIGlmICh0ZWFtX3NpemUgPT0gMSkgeworCisgICAgcmV0dmFsID0gZW1wdHlfcmVkdWNlX2Jsb2NrOworCisgIH0gZWxzZSB7CisKKyAgICBpbnQgYXRvbWljX2F2YWlsYWJsZSA9IEZBU1RfUkVEVUNUSU9OX0FUT01JQ19NRVRIT0RfR0VORVJBVEVEOworICAgIGludCB0cmVlX2F2YWlsYWJsZSA9IEZBU1RfUkVEVUNUSU9OX1RSRUVfTUVUSE9EX0dFTkVSQVRFRDsKKworI2lmIEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9QUEM2NCB8fCBLTVBfQVJDSF9BQVJDSDY0IHx8IEtNUF9BUkNIX01JUFM2NAorCisjaWYgS01QX09TX0xJTlVYIHx8IEtNUF9PU19GUkVFQlNEIHx8IEtNUF9PU19ORVRCU0QgfHwgS01QX09TX1dJTkRPV1MgfHwgICAgICAgXAorICAgIEtNUF9PU19EQVJXSU4KKworICAgIGludCB0ZWFtc2l6ZV9jdXRvZmYgPSA0OworCisjaWYgS01QX01JQ19TVVBQT1JURUQKKyAgICBpZiAoX19rbXBfbWljX3R5cGUgIT0gbm9uX21pYykgeworICAgICAgdGVhbXNpemVfY3V0b2ZmID0gODsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAodHJlZV9hdmFpbGFibGUpIHsKKyAgICAgIGlmICh0ZWFtX3NpemUgPD0gdGVhbXNpemVfY3V0b2ZmKSB7CisgICAgICAgIGlmIChhdG9taWNfYXZhaWxhYmxlKSB7CisgICAgICAgICAgcmV0dmFsID0gYXRvbWljX3JlZHVjZV9ibG9jazsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dmFsID0gVFJFRV9SRURVQ0VfQkxPQ0tfV0lUSF9SRURVQ1RJT05fQkFSUklFUjsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGF0b21pY19hdmFpbGFibGUpIHsKKyAgICAgIHJldHZhbCA9IGF0b21pY19yZWR1Y2VfYmxvY2s7CisgICAgfQorI2Vsc2UKKyNlcnJvciAiVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUyIKKyNlbmRpZiAvLyBLTVBfT1NfTElOVVggfHwgS01QX09TX0ZSRUVCU0QgfHwgS01QX09TX05FVEJTRCB8fCBLTVBfT1NfV0lORE9XUyB8fAorLy8gS01QX09TX0RBUldJTgorCisjZWxpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNIIHx8IEtNUF9BUkNIX01JUFMKKworI2lmIEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfV0lORE9XUworCisgICAgLy8gYmFzaWMgdHVuaW5nCisKKyAgICBpZiAoYXRvbWljX2F2YWlsYWJsZSkgeworICAgICAgaWYgKG51bV92YXJzIDw9IDIpIHsgLy8gJiYgKCB0ZWFtX3NpemUgPD0gOCApIGR1ZSB0byBmYWxzZS1zaGFyaW5nID8/PworICAgICAgICByZXR2YWwgPSBhdG9taWNfcmVkdWNlX2Jsb2NrOworICAgICAgfQorICAgIH0gLy8gb3RoZXJ3aXNlOiB1c2UgY3JpdGljYWwgc2VjdGlvbgorCisjZWxpZiBLTVBfT1NfREFSV0lOCisKKyAgICBpZiAoYXRvbWljX2F2YWlsYWJsZSAmJiAobnVtX3ZhcnMgPD0gMykpIHsKKyAgICAgIHJldHZhbCA9IGF0b21pY19yZWR1Y2VfYmxvY2s7CisgICAgfSBlbHNlIGlmICh0cmVlX2F2YWlsYWJsZSkgeworICAgICAgaWYgKChyZWR1Y2Vfc2l6ZSA+ICg5ICogc2l6ZW9mKGttcF9yZWFsNjQpKSkgJiYKKyAgICAgICAgICAocmVkdWNlX3NpemUgPCAoMjAwMCAqIHNpemVvZihrbXBfcmVhbDY0KSkpKSB7CisgICAgICAgIHJldHZhbCA9IFRSRUVfUkVEVUNFX0JMT0NLX1dJVEhfUExBSU5fQkFSUklFUjsKKyAgICAgIH0KKyAgICB9IC8vIG90aGVyd2lzZTogdXNlIGNyaXRpY2FsIHNlY3Rpb24KKworI2Vsc2UKKyNlcnJvciAiVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUyIKKyNlbmRpZgorCisjZWxzZQorI2Vycm9yICJVbmtub3duIG9yIHVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZSIKKyNlbmRpZgorICB9CisKKyAgLy8gS01QX0ZPUkNFX1JFRFVDVElPTgorCisgIC8vIElmIHRoZSB0ZWFtIGlzIHNlcmlhbGl6ZWQgKHRlYW1fc2l6ZSA9PSAxKSwgaWdub3JlIHRoZSBmb3JjZWQgcmVkdWN0aW9uCisgIC8vIG1ldGhvZCBhbmQgc3RheSB3aXRoIHRoZSB1bnN5bmNocm9uaXplZCBtZXRob2QgKGVtcHR5X3JlZHVjZV9ibG9jaykKKyAgaWYgKF9fa21wX2ZvcmNlX3JlZHVjdGlvbl9tZXRob2QgIT0gcmVkdWN0aW9uX21ldGhvZF9ub3RfZGVmaW5lZCAmJgorICAgICAgdGVhbV9zaXplICE9IDEpIHsKKworICAgIFBBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QgZm9yY2VkX3JldHZhbCA9IGNyaXRpY2FsX3JlZHVjZV9ibG9jazsKKworICAgIGludCBhdG9taWNfYXZhaWxhYmxlLCB0cmVlX2F2YWlsYWJsZTsKKworICAgIHN3aXRjaCAoKGZvcmNlZF9yZXR2YWwgPSBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kKSkgeworICAgIGNhc2UgY3JpdGljYWxfcmVkdWNlX2Jsb2NrOgorICAgICAgS01QX0FTU0VSVChsY2spOyAvLyBsY2sgc2hvdWxkIGJlICE9IDAKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBhdG9taWNfcmVkdWNlX2Jsb2NrOgorICAgICAgYXRvbWljX2F2YWlsYWJsZSA9IEZBU1RfUkVEVUNUSU9OX0FUT01JQ19NRVRIT0RfR0VORVJBVEVEOworICAgICAgaWYgKCFhdG9taWNfYXZhaWxhYmxlKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKFJlZE1ldGhvZE5vdFN1cHBvcnRlZCwgImF0b21pYyIpOworICAgICAgICBmb3JjZWRfcmV0dmFsID0gY3JpdGljYWxfcmVkdWNlX2Jsb2NrOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHRyZWVfcmVkdWNlX2Jsb2NrOgorICAgICAgdHJlZV9hdmFpbGFibGUgPSBGQVNUX1JFRFVDVElPTl9UUkVFX01FVEhPRF9HRU5FUkFURUQ7CisgICAgICBpZiAoIXRyZWVfYXZhaWxhYmxlKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKFJlZE1ldGhvZE5vdFN1cHBvcnRlZCwgInRyZWUiKTsKKyAgICAgICAgZm9yY2VkX3JldHZhbCA9IGNyaXRpY2FsX3JlZHVjZV9ibG9jazsKKyAgICAgIH0gZWxzZSB7CisjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAgICAgZm9yY2VkX3JldHZhbCA9IFRSRUVfUkVEVUNFX0JMT0NLX1dJVEhfUkVEVUNUSU9OX0JBUlJJRVI7CisjZW5kaWYKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIEtNUF9BU1NFUlQoMCk7IC8vICJ1bnN1cHBvcnRlZCBtZXRob2Qgc3BlY2lmaWVkIgorICAgIH0KKworICAgIHJldHZhbCA9IGZvcmNlZF9yZXR2YWw7CisgIH0KKworICBLQV9UUkFDRSgxMCwgKCJyZWR1Y3Rpb24gbWV0aG9kIHNlbGVjdGVkPSUwOHhcbiIsIHJldHZhbCkpOworCisjdW5kZWYgRkFTVF9SRURVQ1RJT05fVFJFRV9NRVRIT0RfR0VORVJBVEVECisjdW5kZWYgRkFTVF9SRURVQ1RJT05fQVRPTUlDX01FVEhPRF9HRU5FUkFURUQKKworICByZXR1cm4gKHJldHZhbCk7Cit9CisKKy8vIHRoaXMgZnVuY3Rpb24gaXMgZm9yIHRlc3Rpbmcgc2V0L2dldC9kZXRlcm1pbmUgcmVkdWNlIG1ldGhvZAora21wX2ludDMyIF9fa21wX2dldF9yZWR1Y2VfbWV0aG9kKHZvaWQpIHsKKyAgcmV0dXJuICgoX19rbXBfZW50cnlfdGhyZWFkKCktPnRoLnRoX2xvY2FsLnBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kKSA+PiA4KTsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zYWZlX2NfYXBpLmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc2FmZV9jX2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MmY4MjYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc2FmZV9jX2FwaS5oCkBAIC0wLDAgKzEsNjEgQEAKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9TQUZFX0NfQVBJX0gKKyNkZWZpbmUgS01QX1NBRkVfQ19BUElfSAorCisvLyBSZXBsYWNlbWVudCBmb3IgYmFubmVkIEMgQVBJCisKKy8vIE5vdCBldmVyeSB1bnNhZmUgY2FsbCBsaXN0ZWQgaGVyZSBpcyBoYW5kbGVkIG5vdywgYnV0IGtlZXBpbmcgZXZlcnl0aGluZworLy8gaW4gb25lIHBsYWNlIHNob3VsZCBiZSBoYW5keSBmb3IgZnV0dXJlIG1haW50ZW5hbmNlLgorI2lmIEtNUF9PU19XSU5ET1dTCisKKyNkZWZpbmUgUlNJWkVfTUFYX1NUUiAoNFVMIDw8IDEwKSAvLyA0S0IKKworLy8gX21hbGxvY2Egd2FzIHN1Z2dlc3RlZCwgYnV0IGl0IGlzIG5vdCBhIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIF9hbGxvY2EKKyNkZWZpbmUgS01QX0FMTE9DQSBfYWxsb2NhCisKKyNkZWZpbmUgS01QX01FTUNQWV9TIG1lbWNweV9zCisjZGVmaW5lIEtNUF9TTlBSSU5URiBzcHJpbnRmX3MKKyNkZWZpbmUgS01QX1NTQ0FORiBzc2NhbmZfcworI2RlZmluZSBLTVBfU1RSQ1BZX1Mgc3RyY3B5X3MKKyNkZWZpbmUgS01QX1NUUk5DUFlfUyBzdHJuY3B5X3MKKworLy8gVXNlIHRoaXMgb25seSB3aGVuIGJ1ZmZlciBzaXplIGlzIHVua25vd24KKyNkZWZpbmUgS01QX01FTUNQWShkc3QsIHNyYywgY250KSBtZW1jcHlfcyhkc3QsIGNudCwgc3JjLCBjbnQpCisKKyNkZWZpbmUgS01QX1NUUkxFTihzdHIpIHN0cm5sZW5fcyhzdHIsIFJTSVpFX01BWF9TVFIpCisKKy8vIFVzZSB0aGlzIG9ubHkgd2hlbiBidWZmZXIgc2l6ZSBpcyB1bmtub3duCisjZGVmaW5lIEtNUF9TVFJOQ1BZKGRzdCwgc3JjLCBjbnQpIHN0cm5jcHlfcyhkc3QsIGNudCwgc3JjLCBjbnQpCisKKy8vIF9UUlVOQ0FURSBpbnN1cmVzIGJ1ZmZlciBzaXplID4gbWF4IHN0cmluZyB0byBwcmludC4KKyNkZWZpbmUgS01QX1ZTTlBSSU5URihkc3QsIGNudCwgZm10LCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZzbnByaW50Zl9zKGRzdCwgY250LCBfVFJVTkNBVEUsIGZtdCwgYXJnKQorCisjZWxzZSAvLyBLTVBfT1NfV0lORE9XUworCisvLyBGb3Igbm93LCB0aGVzZSBtYWNyb3MgdXNlIHRoZSBleGlzdGluZyBBUEkuCisKKyNkZWZpbmUgS01QX0FMTE9DQSBhbGxvY2EKKyNkZWZpbmUgS01QX01FTUNQWV9TKGRzdCwgYnN6LCBzcmMsIGNudCkgbWVtY3B5KGRzdCwgc3JjLCBjbnQpCisjZGVmaW5lIEtNUF9TTlBSSU5URiBzbnByaW50ZgorI2RlZmluZSBLTVBfU1NDQU5GIHNzY2FuZgorI2RlZmluZSBLTVBfU1RSQ1BZX1MoZHN0LCBic3osIHNyYykgc3RyY3B5KGRzdCwgc3JjKQorI2RlZmluZSBLTVBfU1RSTkNQWV9TKGRzdCwgYnN6LCBzcmMsIGNudCkgc3RybmNweShkc3QsIHNyYywgY250KQorI2RlZmluZSBLTVBfVlNOUFJJTlRGIHZzbnByaW50ZgorI2RlZmluZSBLTVBfU1RSTkNQWSBzdHJuY3B5CisjZGVmaW5lIEtNUF9TVFJMRU4gc3RybGVuCisjZGVmaW5lIEtNUF9NRU1DUFkgbWVtY3B5CisKKyNlbmRpZiAvLyBLTVBfT1NfV0lORE9XUworCisjZW5kaWYgLy8gS01QX1NBRkVfQ19BUElfSApkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3NjaGVkLmNwcCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zY2hlZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ1ZTk0NwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zY2hlZC5jcHAKQEAgLTAsMCArMSw5MzUgQEAKKy8qCisgKiBrbXBfc2NoZWQuY3BwIC0tIHN0YXRpYyBzY2hlZHVsaW5nIC0tIGl0ZXJhdGlvbiBpbml0aWFsaXphdGlvbgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvKiBTdGF0aWMgc2NoZWR1bGluZyBpbml0aWFsaXphdGlvbi4KKworICBOT1RFOiB0ZWFtLT50LnRfbnByb2MgaXMgYSBjb25zdGFudCBpbnNpZGUgb2YgYW55IGRpc3BhdGNoIGxvb3AsIGhvd2V2ZXIKKyAgICAgICAgaXQgbWF5IGNoYW5nZSB2YWx1ZXMgYmV0d2VlbiBwYXJhbGxlbCByZWdpb25zLiAgX19rbXBfbWF4X250aAorICAgICAgICBpcyB0aGUgbGFyZ2VzdCB2YWx1ZSBfX2ttcF9udGggbWF5IHRha2UsIDEgaXMgdGhlIHNtYWxsZXN0LiAqLworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2Vycm9yLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisjaW5jbHVkZSAia21wX3N0YXRzLmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorCisjaWYgT01QVF9TVVBQT1JUCisjaW5jbHVkZSAib21wdC1zcGVjaWZpYy5oIgorI2VuZGlmCisKKyNpZmRlZiBLTVBfREVCVUcKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdGVtcGxhdGUgZm9yIGRlYnVnIHByaW50cyBzcGVjaWZpY2F0aW9uICggZCwgdSwgbGxkLCBsbHUgKQorY2hhciBjb25zdCAqdHJhaXRzX3Q8aW50Pjo6c3BlYyA9ICJkIjsKK2NoYXIgY29uc3QgKnRyYWl0c190PHVuc2lnbmVkIGludD46OnNwZWMgPSAidSI7CitjaGFyIGNvbnN0ICp0cmFpdHNfdDxsb25nIGxvbmc+OjpzcGVjID0gImxsZCI7CitjaGFyIGNvbnN0ICp0cmFpdHNfdDx1bnNpZ25lZCBsb25nIGxvbmc+OjpzcGVjID0gImxsdSI7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbmRpZgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyB2b2lkIF9fa21wX2Zvcl9zdGF0aWNfaW5pdChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBzY2hlZHR5cGUsIGttcF9pbnQzMiAqcGxhc3RpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgKnBsb3dlciwgVCAqcHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHRyYWl0c190PFQ+OjpzaWduZWRfdCAqcHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSB0cmFpdHNfdDxUPjo6c2lnbmVkX3QgaW5jciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSB0cmFpdHNfdDxUPjo6c2lnbmVkX3QgY2h1bmspIHsKKyAgS01QX0NPVU5UX0JMT0NLKE9NUF9GT1Jfc3RhdGljKTsKKyAgS01QX1RJTUVfUEFSVElUSU9ORURfQkxPQ0soRk9SX3N0YXRpY19zY2hlZHVsaW5nKTsKKworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PFQ+Ojp1bnNpZ25lZF90IFVUOworICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PFQ+OjpzaWduZWRfdCBTVDsKKyAgLyogIHRoaXMgYWxsIGhhcyB0byBiZSBjaGFuZ2VkIGJhY2sgdG8gVElEIGFuZCBzdWNoLi4gKi8KKyAga21wX2ludDMyIGd0aWQgPSBnbG9iYWxfdGlkOworICBrbXBfdWludDMyIHRpZDsKKyAga21wX3VpbnQzMiBudGg7CisgIFVUIHRyaXBfY291bnQ7CisgIGttcF90ZWFtX3QgKnRlYW07CisgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgIG9tcHRfdGVhbV9pbmZvX3QgKnRlYW1faW5mbyA9IE5VTEw7CisgIG9tcHRfdGFza19pbmZvX3QgKnRhc2tfaW5mbyA9IE5VTEw7CisKKyAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgIC8vIE9ubHkgZnVsbHkgaW5pdGlhbGl6ZSB2YXJpYWJsZXMgbmVlZGVkIGJ5IE9NUFQgaWYgT01QVCBpcyBlbmFibGVkLgorICAgIHRlYW1faW5mbyA9IF9fb21wdF9nZXRfdGVhbWluZm8oMCwgTlVMTCk7CisgICAgdGFza19pbmZvID0gX19vbXB0X2dldF90YXNraW5mbygwKTsKKyAgfQorI2VuZGlmCisKKyAgS01QX0RFQlVHX0FTU0VSVChwbGFzdGl0ZXIgJiYgcGxvd2VyICYmIHB1cHBlciAmJiBwc3RyaWRlKTsKKyAgS0VfVFJBQ0UoMTAsICgiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdCBjYWxsZWQgKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworI2lmZGVmIEtNUF9ERUJVRworICB7CisgICAgY29uc3QgY2hhciAqYnVmZjsKKyAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgIl9fa21wY19mb3Jfc3RhdGljX2luaXQ6IFQjJSVkIHNjaGVkPSUlZCBsaXRlcj0lJWQgaXRlcj0oJSUlcywiCisgICAgICAgICIgJSUlcywgJSUlcykgaW5jcj0lJSVzIGNodW5rPSUlJXMgc2lnbmVkPzwlcz5cbiIsCisgICAgICAgIHRyYWl0c190PFQ+OjpzcGVjLCB0cmFpdHNfdDxUPjo6c3BlYywgdHJhaXRzX3Q8U1Q+OjpzcGVjLAorICAgICAgICB0cmFpdHNfdDxTVD46OnNwZWMsIHRyYWl0c190PFNUPjo6c3BlYywgdHJhaXRzX3Q8VD46OnNwZWMpOworICAgIEtEX1RSQUNFKDEwMCwgKGJ1ZmYsIGdsb2JhbF90aWQsIHNjaGVkdHlwZSwgKnBsYXN0aXRlciwgKnBsb3dlciwgKnB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAqcHN0cmlkZSwgaW5jciwgY2h1bmspKTsKKyAgICBfX2ttcF9zdHJfZnJlZSgmYnVmZik7CisgIH0KKyNlbmRpZgorCisgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICBfX2ttcF9wdXNoX3dvcmtzaGFyZShnbG9iYWxfdGlkLCBjdF9wZG8sIGxvYyk7CisgICAgaWYgKGluY3IgPT0gMCkgeworICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0KGttcF9pMThuX21zZ19DbnNMb29wSW5jclplcm9Qcm9oaWJpdGVkLCBjdF9wZG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jKTsKKyAgICB9CisgIH0KKyAgLyogc3BlY2lhbCBoYW5kbGluZyBmb3IgemVyby10cmlwIGxvb3BzICovCisgIGlmIChpbmNyID4gMCA/ICgqcHVwcGVyIDwgKnBsb3dlcikgOiAoKnBsb3dlciA8ICpwdXBwZXIpKSB7CisgICAgaWYgKHBsYXN0aXRlciAhPSBOVUxMKQorICAgICAgKnBsYXN0aXRlciA9IEZBTFNFOworICAgIC8qIGxlYXZlIHB1cHBlciBhbmQgcGxvd2VyIHNldCB0byBlbnRpcmUgaXRlcmF0aW9uIHNwYWNlICovCisgICAgKnBzdHJpZGUgPSBpbmNyOyAvKiB2YWx1ZSBzaG91bGQgbmV2ZXIgYmUgdXNlZCAqLworLy8gKnBsb3dlciA9ICpwdXBwZXIgLSBpbmNyOworLy8gbGV0IGNvbXBpbGVyIGJ5cGFzcyB0aGUgaWxsZWdhbCBsb29wIChsaWtlIGZvcihpPTE7aTwxMDtpLS0pKQorLy8gVEhFIExJTkUgQ09NTUVOVEVEIEFCT1ZFIENBVVNFRCBzaGFwZTJGL2hfdGVzdHNfMS5mIFRPIEhBVkUgQSBGQUlMVVJFCisvLyBPTiBBIFpFUk8tVFJJUCBMT09QIChsb3dlcj0xLCB1cHBlcj0wLHN0cmlkZT0xKSAtIEpQSCBKdW5lIDIzLCAyMDA5LgorI2lmZGVmIEtNUF9ERUJVRworICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKmJ1ZmY7CisgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KCJfX2ttcGNfZm9yX3N0YXRpY19pbml0OihaRVJPIFRSSVApIGxpdGVyPSUlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG93ZXI9JSUlcyB1cHBlcj0lJSVzIHN0cmlkZSA9ICUlJXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpZ25lZD88JXM+LCBsb2MgPSAlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDxUPjo6c3BlYywgdHJhaXRzX3Q8VD46OnNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDxTVD46OnNwZWMsIHRyYWl0c190PFQ+OjpzcGVjKTsKKyAgICAgIEtEX1RSQUNFKDEwMCwKKyAgICAgICAgICAgICAgIChidWZmLCAqcGxhc3RpdGVyLCAqcGxvd2VyLCAqcHVwcGVyLCAqcHN0cmlkZSwgbG9jLT5wc291cmNlKSk7CisgICAgICBfX2ttcF9zdHJfZnJlZSgmYnVmZik7CisgICAgfQorI2VuZGlmCisgICAgS0VfVFJBQ0UoMTAsICgiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdDogVCMlZCByZXR1cm5cbiIsIGdsb2JhbF90aWQpKTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJiBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbG9vcF9iZWdpbikpIHsKKyAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9sb29wX2JlZ2luKSgKKyAgICAgICAgICB0ZWFtX2luZm8tPnBhcmFsbGVsX2lkLCB0YXNrX2luZm8tPnRhc2tfaWQsIHRlYW1faW5mby0+bWljcm90YXNrKTsKKyAgICB9CisjZW5kaWYKKyAgICBLTVBfQ09VTlRfVkFMVUUoRk9SX3N0YXRpY19pdGVyYXRpb25zLCAwKTsKKyAgICByZXR1cm47CisgIH0KKworI2lmIE9NUF80MF9FTkFCTEVECisgIC8vIEFsdGhvdWdoIHRoZXJlIGFyZSBzY2hlZHVsZSBlbnVtZXJhdGlvbnMgYWJvdmUga21wX29yZF91cHBlciB3aGljaCBhcmUgbm90CisgIC8vIHNjaGVkdWxlcyBmb3IgImRpc3RyaWJ1dGUiLCB0aGUgb25seSBvbmVzIHdoaWNoIGFyZSB1c2VmdWwgYXJlIGR5bmFtaWMsIHNvCisgIC8vIGNhbm5vdCBiZSBzZWVuIGhlcmUsIHNpbmNlIHRoaXMgY29kZXBhdGggaXMgb25seSBleGVjdXRlZCBmb3Igc3RhdGljCisgIC8vIHNjaGVkdWxlcy4KKyAgaWYgKHNjaGVkdHlwZSA+IGttcF9vcmRfdXBwZXIpIHsKKyAgICAvLyB3ZSBhcmUgaW4gRElTVFJJQlVURSBjb25zdHJ1Y3QKKyAgICBzY2hlZHR5cGUgKz0ga21wX3NjaF9zdGF0aWMgLQorICAgICAgICAgICAgICAgICBrbXBfZGlzdHJpYnV0ZV9zdGF0aWM7IC8vIEFDOiBjb252ZXJ0IHRvIHVzdWFsIHNjaGVkdWxlIHR5cGUKKyAgICB0aWQgPSB0aC0+dGgudGhfdGVhbS0+dC50X21hc3Rlcl90aWQ7CisgICAgdGVhbSA9IHRoLT50aC50aF90ZWFtLT50LnRfcGFyZW50OworICB9IGVsc2UKKyNlbmRpZgorICB7CisgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChnbG9iYWxfdGlkKTsKKyAgICB0ZWFtID0gdGgtPnRoLnRoX3RlYW07CisgIH0KKworICAvKiBkZXRlcm1pbmUgaWYgImZvciIgbG9vcCBpcyBhbiBhY3RpdmUgd29ya3NoYXJpbmcgY29uc3RydWN0ICovCisgIGlmICh0ZWFtLT50LnRfc2VyaWFsaXplZCkgeworICAgIC8qIHNlcmlhbGl6ZWQgcGFyYWxsZWwsIGVhY2ggdGhyZWFkIGV4ZWN1dGVzIHdob2xlIGl0ZXJhdGlvbiBzcGFjZSAqLworICAgIGlmIChwbGFzdGl0ZXIgIT0gTlVMTCkKKyAgICAgICpwbGFzdGl0ZXIgPSBUUlVFOworICAgIC8qIGxlYXZlIHB1cHBlciBhbmQgcGxvd2VyIHNldCB0byBlbnRpcmUgaXRlcmF0aW9uIHNwYWNlICovCisgICAgKnBzdHJpZGUgPQorICAgICAgICAoaW5jciA+IDApID8gKCpwdXBwZXIgLSAqcGxvd2VyICsgMSkgOiAoLSgqcGxvd2VyIC0gKnB1cHBlciArIDEpKTsKKworI2lmZGVmIEtNUF9ERUJVRworICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKmJ1ZmY7CisgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KCJfX2ttcGNfZm9yX3N0YXRpY19pbml0OiAoc2VyaWFsKSBsaXRlcj0lJWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvd2VyPSUlJXMgdXBwZXI9JSUlcyBzdHJpZGUgPSAlJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8VD46OnNwZWMsIHRyYWl0c190PFQ+OjpzcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8U1Q+OjpzcGVjKTsKKyAgICAgIEtEX1RSQUNFKDEwMCwgKGJ1ZmYsICpwbGFzdGl0ZXIsICpwbG93ZXIsICpwdXBwZXIsICpwc3RyaWRlKSk7CisgICAgICBfX2ttcF9zdHJfZnJlZSgmYnVmZik7CisgICAgfQorI2VuZGlmCisgICAgS0VfVFJBQ0UoMTAsICgiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdDogVCMlZCByZXR1cm5cbiIsIGdsb2JhbF90aWQpKTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJiBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbG9vcF9iZWdpbikpIHsKKyAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9sb29wX2JlZ2luKSgKKyAgICAgICAgICB0ZWFtX2luZm8tPnBhcmFsbGVsX2lkLCB0YXNrX2luZm8tPnRhc2tfaWQsIHRlYW1faW5mby0+bWljcm90YXNrKTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm47CisgIH0KKyAgbnRoID0gdGVhbS0+dC50X25wcm9jOworICBpZiAobnRoID09IDEpIHsKKyAgICBpZiAocGxhc3RpdGVyICE9IE5VTEwpCisgICAgICAqcGxhc3RpdGVyID0gVFJVRTsKKyAgICAqcHN0cmlkZSA9CisgICAgICAgIChpbmNyID4gMCkgPyAoKnB1cHBlciAtICpwbG93ZXIgKyAxKSA6ICgtKCpwbG93ZXIgLSAqcHVwcGVyICsgMSkpOworI2lmZGVmIEtNUF9ERUJVRworICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKmJ1ZmY7CisgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KCJfX2ttcGNfZm9yX3N0YXRpY19pbml0OiAoc2VyaWFsKSBsaXRlcj0lJWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvd2VyPSUlJXMgdXBwZXI9JSUlcyBzdHJpZGUgPSAlJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8VD46OnNwZWMsIHRyYWl0c190PFQ+OjpzcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8U1Q+OjpzcGVjKTsKKyAgICAgIEtEX1RSQUNFKDEwMCwgKGJ1ZmYsICpwbGFzdGl0ZXIsICpwbG93ZXIsICpwdXBwZXIsICpwc3RyaWRlKSk7CisgICAgICBfX2ttcF9zdHJfZnJlZSgmYnVmZik7CisgICAgfQorI2VuZGlmCisgICAgS0VfVFJBQ0UoMTAsICgiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdDogVCMlZCByZXR1cm5cbiIsIGdsb2JhbF90aWQpKTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJiBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbG9vcF9iZWdpbikpIHsKKyAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9sb29wX2JlZ2luKSgKKyAgICAgICAgICB0ZWFtX2luZm8tPnBhcmFsbGVsX2lkLCB0YXNrX2luZm8tPnRhc2tfaWQsIHRlYW1faW5mby0+bWljcm90YXNrKTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm47CisgIH0KKworICAvKiBjb21wdXRlIHRyaXAgY291bnQgKi8KKyAgaWYgKGluY3IgPT0gMSkgeworICAgIHRyaXBfY291bnQgPSAqcHVwcGVyIC0gKnBsb3dlciArIDE7CisgIH0gZWxzZSBpZiAoaW5jciA9PSAtMSkgeworICAgIHRyaXBfY291bnQgPSAqcGxvd2VyIC0gKnB1cHBlciArIDE7CisgIH0gZWxzZSBpZiAoaW5jciA+IDApIHsKKyAgICAvLyB1cHBlci1sb3dlciBjYW4gZXhjZWVkIHRoZSBsaW1pdCBvZiBzaWduZWQgdHlwZQorICAgIHRyaXBfY291bnQgPSAoVVQpKCpwdXBwZXIgLSAqcGxvd2VyKSAvIGluY3IgKyAxOworICB9IGVsc2UgeworICAgIHRyaXBfY291bnQgPSAoVVQpKCpwbG93ZXIgLSAqcHVwcGVyKSAvICgtaW5jcikgKyAxOworICB9CisKKyAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgIC8qIHRyaXBjb3VudCBvdmVyZmxvdz8gKi8KKyAgICBpZiAodHJpcF9jb3VudCA9PSAwICYmICpwdXBwZXIgIT0gKnBsb3dlcikgeworICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0KGttcF9pMThuX21zZ19DbnNJdGVyYXRpb25SYW5nZVRvb0xhcmdlLCBjdF9wZG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jKTsKKyAgICB9CisgIH0KKyAgS01QX0NPVU5UX1ZBTFVFKEZPUl9zdGF0aWNfaXRlcmF0aW9ucywgdHJpcF9jb3VudCk7CisKKyAgLyogY29tcHV0ZSByZW1haW5pbmcgcGFyYW1ldGVycyAqLworICBzd2l0Y2ggKHNjaGVkdHlwZSkgeworICBjYXNlIGttcF9zY2hfc3RhdGljOiB7CisgICAgaWYgKHRyaXBfY291bnQgPCBudGgpIHsKKyAgICAgIEtNUF9ERUJVR19BU1NFUlQoCisgICAgICAgICAgX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2dyZWVkeSB8fAorICAgICAgICAgIF9fa21wX3N0YXRpYyA9PQorICAgICAgICAgICAgICBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZCk7IC8vIFVua25vd24gc3RhdGljIHNjaGVkdWxpbmcgdHlwZS4KKyAgICAgIGlmICh0aWQgPCB0cmlwX2NvdW50KSB7CisgICAgICAgICpwdXBwZXIgPSAqcGxvd2VyID0gKnBsb3dlciArIHRpZCAqIGluY3I7CisgICAgICB9IGVsc2UgeworICAgICAgICAqcGxvd2VyID0gKnB1cHBlciArIGluY3I7CisgICAgICB9CisgICAgICBpZiAocGxhc3RpdGVyICE9IE5VTEwpCisgICAgICAgICpwbGFzdGl0ZXIgPSAodGlkID09IHRyaXBfY291bnQgLSAxKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZCkgeworICAgICAgICBVVCBzbWFsbF9jaHVuayA9IHRyaXBfY291bnQgLyBudGg7CisgICAgICAgIFVUIGV4dHJhcyA9IHRyaXBfY291bnQgJSBudGg7CisgICAgICAgICpwbG93ZXIgKz0gaW5jciAqICh0aWQgKiBzbWFsbF9jaHVuayArICh0aWQgPCBleHRyYXMgPyB0aWQgOiBleHRyYXMpKTsKKyAgICAgICAgKnB1cHBlciA9ICpwbG93ZXIgKyBzbWFsbF9jaHVuayAqIGluY3IgLSAodGlkIDwgZXh0cmFzID8gMCA6IGluY3IpOworICAgICAgICBpZiAocGxhc3RpdGVyICE9IE5VTEwpCisgICAgICAgICAgKnBsYXN0aXRlciA9ICh0aWQgPT0gbnRoIC0gMSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBUIGJpZ19jaHVua19pbmNfY291bnQgPQorICAgICAgICAgICAgKHRyaXBfY291bnQgLyBudGggKyAoKHRyaXBfY291bnQgJSBudGgpID8gMSA6IDApKSAqIGluY3I7CisgICAgICAgIFQgb2xkX3VwcGVyID0gKnB1cHBlcjsKKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19ncmVlZHkpOworICAgICAgICAvLyBVbmtub3duIHN0YXRpYyBzY2hlZHVsaW5nIHR5cGUuCisKKyAgICAgICAgKnBsb3dlciArPSB0aWQgKiBiaWdfY2h1bmtfaW5jX2NvdW50OworICAgICAgICAqcHVwcGVyID0gKnBsb3dlciArIGJpZ19jaHVua19pbmNfY291bnQgLSBpbmNyOworICAgICAgICBpZiAoaW5jciA+IDApIHsKKyAgICAgICAgICBpZiAoKnB1cHBlciA8ICpwbG93ZXIpCisgICAgICAgICAgICAqcHVwcGVyID0gdHJhaXRzX3Q8VD46Om1heF92YWx1ZTsKKyAgICAgICAgICBpZiAocGxhc3RpdGVyICE9IE5VTEwpCisgICAgICAgICAgICAqcGxhc3RpdGVyID0gKnBsb3dlciA8PSBvbGRfdXBwZXIgJiYgKnB1cHBlciA+IG9sZF91cHBlciAtIGluY3I7CisgICAgICAgICAgaWYgKCpwdXBwZXIgPiBvbGRfdXBwZXIpCisgICAgICAgICAgICAqcHVwcGVyID0gb2xkX3VwcGVyOyAvLyB0cmFja2VyIEM3MzI1OAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmICgqcHVwcGVyID4gKnBsb3dlcikKKyAgICAgICAgICAgICpwdXBwZXIgPSB0cmFpdHNfdDxUPjo6bWluX3ZhbHVlOworICAgICAgICAgIGlmIChwbGFzdGl0ZXIgIT0gTlVMTCkKKyAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAqcGxvd2VyID49IG9sZF91cHBlciAmJiAqcHVwcGVyIDwgb2xkX3VwcGVyIC0gaW5jcjsKKyAgICAgICAgICBpZiAoKnB1cHBlciA8IG9sZF91cHBlcikKKyAgICAgICAgICAgICpwdXBwZXIgPSBvbGRfdXBwZXI7IC8vIHRyYWNrZXIgQzczMjU4CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgKnBzdHJpZGUgPSB0cmlwX2NvdW50OworICAgIGJyZWFrOworICB9CisgIGNhc2Uga21wX3NjaF9zdGF0aWNfY2h1bmtlZDogeworICAgIFNUIHNwYW47CisgICAgaWYgKGNodW5rIDwgMSkgeworICAgICAgY2h1bmsgPSAxOworICAgIH0KKyAgICBzcGFuID0gY2h1bmsgKiBpbmNyOworICAgICpwc3RyaWRlID0gc3BhbiAqIG50aDsKKyAgICAqcGxvd2VyID0gKnBsb3dlciArIChzcGFuICogdGlkKTsKKyAgICAqcHVwcGVyID0gKnBsb3dlciArIHNwYW4gLSBpbmNyOworICAgIGlmIChwbGFzdGl0ZXIgIT0gTlVMTCkKKyAgICAgICpwbGFzdGl0ZXIgPSAodGlkID09ICgodHJpcF9jb3VudCAtIDEpIC8gKFVUKWNodW5rKSAlIG50aCk7CisgICAgYnJlYWs7CisgIH0KKyNpZiBPTVBfNDVfRU5BQkxFRAorICBjYXNlIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkX2NodW5rZWQ6IHsKKyAgICBUIG9sZF91cHBlciA9ICpwdXBwZXI7CisgICAgLy8gcm91bmQgdXAgdG8gbWFrZSBzdXJlIHRoZSBjaHVuayBpcyBlbm91Z2ggdG8gY292ZXIgYWxsIGl0ZXJhdGlvbnMKKyAgICBVVCBzcGFuID0gKHRyaXBfY291bnQgKyBudGggLSAxKSAvIG50aDsKKworICAgIC8vIHBlcmZvcm0gY2h1bmsgYWRqdXN0bWVudAorICAgIGNodW5rID0gKHNwYW4gKyBjaHVuayAtIDEpICYgfihjaHVuayAtIDEpOworCisgICAgc3BhbiA9IGNodW5rICogaW5jcjsKKyAgICAqcGxvd2VyID0gKnBsb3dlciArIChzcGFuICogdGlkKTsKKyAgICAqcHVwcGVyID0gKnBsb3dlciArIHNwYW4gLSBpbmNyOworICAgIGlmIChpbmNyID4gMCkgeworICAgICAgaWYgKCpwdXBwZXIgPiBvbGRfdXBwZXIpCisgICAgICAgICpwdXBwZXIgPSBvbGRfdXBwZXI7CisgICAgfSBlbHNlIGlmICgqcHVwcGVyIDwgb2xkX3VwcGVyKQorICAgICAgKnB1cHBlciA9IG9sZF91cHBlcjsKKworICAgIGlmIChwbGFzdGl0ZXIgIT0gTlVMTCkKKyAgICAgICpwbGFzdGl0ZXIgPSAodGlkID09ICgodHJpcF9jb3VudCAtIDEpIC8gKFVUKWNodW5rKSk7CisgICAgYnJlYWs7CisgIH0KKyNlbmRpZgorICBkZWZhdWx0OgorICAgIEtNUF9BU1NFUlQyKDAsICJfX2ttcGNfZm9yX3N0YXRpY19pbml0OiB1bmtub3duIHNjaGVkdWxpbmcgdHlwZSIpOworICAgIGJyZWFrOworICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgIC8vIFJlcG9ydCBsb29wIG1ldGFkYXRhCisgIGlmIChLTVBfTUFTVEVSX1RJRCh0aWQpICYmIF9faXR0X21ldGFkYXRhX2FkZF9wdHIgJiYKKyAgICAgIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDMgJiYKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayA9PSBOVUxMICYmCisjZW5kaWYKKyAgICAgIHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwgPT0gMSkgeworICAgIGttcF91aW50NjQgY3VyX2NodW5rID0gY2h1bms7CisgICAgLy8gQ2FsY3VsYXRlIGNodW5rIGluIGNhc2UgaXQgd2FzIG5vdCBzcGVjaWZpZWQ7IGl0IGlzIHNwZWNpZmllZCBmb3IKKyAgICAvLyBrbXBfc2NoX3N0YXRpY19jaHVua2VkCisgICAgaWYgKHNjaGVkdHlwZSA9PSBrbXBfc2NoX3N0YXRpYykgeworICAgICAgY3VyX2NodW5rID0gdHJpcF9jb3VudCAvIG50aCArICgodHJpcF9jb3VudCAlIG50aCkgPyAxIDogMCk7CisgICAgfQorICAgIC8vIDAgLSAic3RhdGljIiBzY2hlZHVsZQorICAgIF9fa21wX2l0dF9tZXRhZGF0YV9sb29wKGxvYywgMCwgdHJpcF9jb3VudCwgY3VyX2NodW5rKTsKKyAgfQorI2VuZGlmCisjaWZkZWYgS01QX0RFQlVHCisgIHsKKyAgICBjb25zdCBjaGFyICpidWZmOworICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KCJfX2ttcGNfZm9yX3N0YXRpY19pbml0OiBsaXRlcj0lJWQgbG93ZXI9JSUlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVwcGVyPSUlJXMgc3RyaWRlID0gJSUlcyBzaWduZWQ/PCVzPlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDxUPjo6c3BlYywgdHJhaXRzX3Q8VD46OnNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8U1Q+OjpzcGVjLCB0cmFpdHNfdDxUPjo6c3BlYyk7CisgICAgS0RfVFJBQ0UoMTAwLCAoYnVmZiwgKnBsYXN0aXRlciwgKnBsb3dlciwgKnB1cHBlciwgKnBzdHJpZGUpKTsKKyAgICBfX2ttcF9zdHJfZnJlZSgmYnVmZik7CisgIH0KKyNlbmRpZgorICBLRV9UUkFDRSgxMCwgKCJfX2ttcGNfZm9yX3N0YXRpY19pbml0OiBUIyVkIHJldHVyblxuIiwgZ2xvYmFsX3RpZCkpOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgaWYgKG9tcHRfZW5hYmxlZCAmJiBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbG9vcF9iZWdpbikpIHsKKyAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbG9vcF9iZWdpbikoCisgICAgICAgIHRlYW1faW5mby0+cGFyYWxsZWxfaWQsIHRhc2tfaW5mby0+dGFza19pZCwgdGVhbV9pbmZvLT5taWNyb3Rhc2spOworICB9CisjZW5kaWYKKworICByZXR1cm47Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIHZvaWQgX19rbXBfZGlzdF9mb3Jfc3RhdGljX2luaXQoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBzY2hlZHVsZSwga21wX2ludDMyICpwbGFzdGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUICpwbG93ZXIsIFQgKnB1cHBlciwgVCAqcHVwcGVyRGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHRyYWl0c190PFQ+OjpzaWduZWRfdCAqcHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHRyYWl0c190PFQ+OjpzaWduZWRfdCBpbmNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgdHJhaXRzX3Q8VD46OnNpZ25lZF90IGNodW5rKSB7CisgIEtNUF9DT1VOVF9CTE9DSyhPTVBfRElTVFJJQlVURSk7CisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8VD46OnVuc2lnbmVkX3QgVVQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8VD46OnNpZ25lZF90IFNUOworICBrbXBfdWludDMyIHRpZDsKKyAga21wX3VpbnQzMiBudGg7CisgIGttcF91aW50MzIgdGVhbV9pZDsKKyAga21wX3VpbnQzMiBudGVhbXM7CisgIFVUIHRyaXBfY291bnQ7CisgIGttcF90ZWFtX3QgKnRlYW07CisgIGttcF9pbmZvX3QgKnRoOworCisgIEtNUF9ERUJVR19BU1NFUlQocGxhc3RpdGVyICYmIHBsb3dlciAmJiBwdXBwZXIgJiYgcHVwcGVyRGlzdCAmJiBwc3RyaWRlKTsKKyAgS0VfVFJBQ0UoMTAsICgiX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0IGNhbGxlZCAoJWQpXG4iLCBndGlkKSk7CisjaWZkZWYgS01QX0RFQlVHCisgIHsKKyAgICBjb25zdCBjaGFyICpidWZmOworICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAiX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0OiBUIyUlZCBzY2hlZExvb3A9JSVkIGxpdGVyPSUlZCAiCisgICAgICAgICJpdGVyPSglJSVzLCAlJSVzLCAlJSVzKSBjaHVuaz0lJSVzIHNpZ25lZD88JXM+XG4iLAorICAgICAgICB0cmFpdHNfdDxUPjo6c3BlYywgdHJhaXRzX3Q8VD46OnNwZWMsIHRyYWl0c190PFNUPjo6c3BlYywKKyAgICAgICAgdHJhaXRzX3Q8U1Q+OjpzcGVjLCB0cmFpdHNfdDxUPjo6c3BlYyk7CisgICAgS0RfVFJBQ0UoMTAwLAorICAgICAgICAgICAgIChidWZmLCBndGlkLCBzY2hlZHVsZSwgKnBsYXN0aXRlciwgKnBsb3dlciwgKnB1cHBlciwgaW5jciwgY2h1bmspKTsKKyAgICBfX2ttcF9zdHJfZnJlZSgmYnVmZik7CisgIH0KKyNlbmRpZgorCisgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICBfX2ttcF9wdXNoX3dvcmtzaGFyZShndGlkLCBjdF9wZG8sIGxvYyk7CisgICAgaWYgKGluY3IgPT0gMCkgeworICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0KGttcF9pMThuX21zZ19DbnNMb29wSW5jclplcm9Qcm9oaWJpdGVkLCBjdF9wZG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jKTsKKyAgICB9CisgICAgaWYgKGluY3IgPiAwID8gKCpwdXBwZXIgPCAqcGxvd2VyKSA6ICgqcGxvd2VyIDwgKnB1cHBlcikpIHsKKyAgICAgIC8vIFRoZSBsb29wIGlzIGlsbGVnYWwuCisgICAgICAvLyBTb21lIHplcm8tdHJpcCBsb29wcyBtYWludGFpbmVkIGJ5IGNvbXBpbGVyLCBlLmcuOgorICAgICAgLy8gICBmb3IoaT0xMDtpPDA7KytpKSAvLyBsb3dlciA+PSB1cHBlciAtIHJ1bi10aW1lIGNoZWNrCisgICAgICAvLyAgIGZvcihpPTA7aT4xMDstLWkpIC8vIGxvd2VyIDw9IHVwcGVyIC0gcnVuLXRpbWUgY2hlY2sKKyAgICAgIC8vICAgZm9yKGk9MDtpPjEwOysraSkgLy8gaW5jciA+IDAgICAgICAgLSBjb21waWxlLXRpbWUgY2hlY2sKKyAgICAgIC8vICAgZm9yKGk9MTA7aTwwOy0taSkgLy8gaW5jciA8IDAgICAgICAgLSBjb21waWxlLXRpbWUgY2hlY2sKKyAgICAgIC8vIENvbXBpbGVyIGRvZXMgbm90IGNoZWNrIHRoZSBmb2xsb3dpbmcgaWxsZWdhbCBsb29wczoKKyAgICAgIC8vICAgZm9yKGk9MDtpPDEwO2krPWluY3IpIC8vIHdoZXJlIGluY3I8MAorICAgICAgLy8gICBmb3IoaT0xMDtpPjA7aS09aW5jcikgLy8gd2hlcmUgaW5jcjwwCisgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3Qoa21wX2kxOG5fbXNnX0Nuc0xvb3BJbmNySWxsZWdhbCwgY3RfcGRvLCBsb2MpOworICAgIH0KKyAgfQorICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworICB0aCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgIG50aCA9IHRoLT50aC50aF90ZWFtX25wcm9jOworICB0ZWFtID0gdGgtPnRoLnRoX3RlYW07CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgS01QX0RFQlVHX0FTU0VSVCh0aC0+dGgudGhfdGVhbXNfbWljcm90YXNrKTsgLy8gd2UgYXJlIGluIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKKyAgbnRlYW1zID0gdGgtPnRoLnRoX3RlYW1zX3NpemUubnRlYW1zOworI2VuZGlmCisgIHRlYW1faWQgPSB0ZWFtLT50LnRfbWFzdGVyX3RpZDsKKyAgS01QX0RFQlVHX0FTU0VSVChudGVhbXMgPT0gdGVhbS0+dC50X3BhcmVudC0+dC50X25wcm9jKTsKKworICAvLyBjb21wdXRlIGdsb2JhbCB0cmlwIGNvdW50CisgIGlmIChpbmNyID09IDEpIHsKKyAgICB0cmlwX2NvdW50ID0gKnB1cHBlciAtICpwbG93ZXIgKyAxOworICB9IGVsc2UgaWYgKGluY3IgPT0gLTEpIHsKKyAgICB0cmlwX2NvdW50ID0gKnBsb3dlciAtICpwdXBwZXIgKyAxOworICB9IGVsc2UgaWYgKGluY3IgPiAwKSB7CisgICAgLy8gdXBwZXItbG93ZXIgY2FuIGV4Y2VlZCB0aGUgbGltaXQgb2Ygc2lnbmVkIHR5cGUKKyAgICB0cmlwX2NvdW50ID0gKFVUKSgqcHVwcGVyIC0gKnBsb3dlcikgLyBpbmNyICsgMTsKKyAgfSBlbHNlIHsKKyAgICB0cmlwX2NvdW50ID0gKFVUKSgqcGxvd2VyIC0gKnB1cHBlcikgLyAoLWluY3IpICsgMTsKKyAgfQorCisgICpwc3RyaWRlID0gKnB1cHBlciAtICpwbG93ZXI7IC8vIGp1c3QgaW4gY2FzZSAoY2FuIGJlIHVudXNlZCkKKyAgaWYgKHRyaXBfY291bnQgPD0gbnRlYW1zKSB7CisgICAgS01QX0RFQlVHX0FTU0VSVCgKKyAgICAgICAgX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2dyZWVkeSB8fAorICAgICAgICBfX2ttcF9zdGF0aWMgPT0KKyAgICAgICAgICAgIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkKTsgLy8gVW5rbm93biBzdGF0aWMgc2NoZWR1bGluZyB0eXBlLgorICAgIC8vIG9ubHkgbWFzdGVycyBvZiBzb21lIHRlYW1zIGdldCBzaW5nbGUgaXRlcmF0aW9uLCBvdGhlciB0aHJlYWRzIGdldAorICAgIC8vIG5vdGhpbmcKKyAgICBpZiAodGVhbV9pZCA8IHRyaXBfY291bnQgJiYgdGlkID09IDApIHsKKyAgICAgICpwdXBwZXIgPSAqcHVwcGVyRGlzdCA9ICpwbG93ZXIgPSAqcGxvd2VyICsgdGVhbV9pZCAqIGluY3I7CisgICAgfSBlbHNlIHsKKyAgICAgICpwdXBwZXJEaXN0ID0gKnB1cHBlcjsKKyAgICAgICpwbG93ZXIgPSAqcHVwcGVyICsgaW5jcjsgLy8gY29tcGlsZXIgc2hvdWxkIHNraXAgbG9vcCBib2R5CisgICAgfQorICAgIGlmIChwbGFzdGl0ZXIgIT0gTlVMTCkKKyAgICAgICpwbGFzdGl0ZXIgPSAodGlkID09IDAgJiYgdGVhbV9pZCA9PSB0cmlwX2NvdW50IC0gMSk7CisgIH0gZWxzZSB7CisgICAgLy8gR2V0IHRoZSB0ZWFtJ3MgY2h1bmsgZmlyc3QgKGVhY2ggdGVhbSBnZXRzIGF0IG1vc3Qgb25lIGNodW5rKQorICAgIGlmIChfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQpIHsKKyAgICAgIFVUIGNodW5rRCA9IHRyaXBfY291bnQgLyBudGVhbXM7CisgICAgICBVVCBleHRyYXMgPSB0cmlwX2NvdW50ICUgbnRlYW1zOworICAgICAgKnBsb3dlciArPQorICAgICAgICAgIGluY3IgKiAodGVhbV9pZCAqIGNodW5rRCArICh0ZWFtX2lkIDwgZXh0cmFzID8gdGVhbV9pZCA6IGV4dHJhcykpOworICAgICAgKnB1cHBlckRpc3QgPSAqcGxvd2VyICsgY2h1bmtEICogaW5jciAtICh0ZWFtX2lkIDwgZXh0cmFzID8gMCA6IGluY3IpOworICAgICAgaWYgKHBsYXN0aXRlciAhPSBOVUxMKQorICAgICAgICAqcGxhc3RpdGVyID0gKHRlYW1faWQgPT0gbnRlYW1zIC0gMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIFQgY2h1bmtfaW5jX2NvdW50ID0KKyAgICAgICAgICAodHJpcF9jb3VudCAvIG50ZWFtcyArICgodHJpcF9jb3VudCAlIG50ZWFtcykgPyAxIDogMCkpICogaW5jcjsKKyAgICAgIFQgdXBwZXIgPSAqcHVwcGVyOworICAgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfZ3JlZWR5KTsKKyAgICAgIC8vIFVua25vd24gc3RhdGljIHNjaGVkdWxpbmcgdHlwZS4KKyAgICAgICpwbG93ZXIgKz0gdGVhbV9pZCAqIGNodW5rX2luY19jb3VudDsKKyAgICAgICpwdXBwZXJEaXN0ID0gKnBsb3dlciArIGNodW5rX2luY19jb3VudCAtIGluY3I7CisgICAgICAvLyBDaGVjay9jb3JyZWN0IGJvdW5kcyBpZiBuZWVkZWQKKyAgICAgIGlmIChpbmNyID4gMCkgeworICAgICAgICBpZiAoKnB1cHBlckRpc3QgPCAqcGxvd2VyKQorICAgICAgICAgICpwdXBwZXJEaXN0ID0gdHJhaXRzX3Q8VD46Om1heF92YWx1ZTsKKyAgICAgICAgaWYgKHBsYXN0aXRlciAhPSBOVUxMKQorICAgICAgICAgICpwbGFzdGl0ZXIgPSAqcGxvd2VyIDw9IHVwcGVyICYmICpwdXBwZXJEaXN0ID4gdXBwZXIgLSBpbmNyOworICAgICAgICBpZiAoKnB1cHBlckRpc3QgPiB1cHBlcikKKyAgICAgICAgICAqcHVwcGVyRGlzdCA9IHVwcGVyOyAvLyB0cmFja2VyIEM3MzI1OAorICAgICAgICBpZiAoKnBsb3dlciA+ICpwdXBwZXJEaXN0KSB7CisgICAgICAgICAgKnB1cHBlciA9ICpwdXBwZXJEaXN0OyAvLyBubyBpdGVyYXRpb25zIGF2YWlsYWJsZSBmb3IgdGhlIHRlYW0KKyAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCpwdXBwZXJEaXN0ID4gKnBsb3dlcikKKyAgICAgICAgICAqcHVwcGVyRGlzdCA9IHRyYWl0c190PFQ+OjptaW5fdmFsdWU7CisgICAgICAgIGlmIChwbGFzdGl0ZXIgIT0gTlVMTCkKKyAgICAgICAgICAqcGxhc3RpdGVyID0gKnBsb3dlciA+PSB1cHBlciAmJiAqcHVwcGVyRGlzdCA8IHVwcGVyIC0gaW5jcjsKKyAgICAgICAgaWYgKCpwdXBwZXJEaXN0IDwgdXBwZXIpCisgICAgICAgICAgKnB1cHBlckRpc3QgPSB1cHBlcjsgLy8gdHJhY2tlciBDNzMyNTgKKyAgICAgICAgaWYgKCpwbG93ZXIgPCAqcHVwcGVyRGlzdCkgeworICAgICAgICAgICpwdXBwZXIgPSAqcHVwcGVyRGlzdDsgLy8gbm8gaXRlcmF0aW9ucyBhdmFpbGFibGUgZm9yIHRoZSB0ZWFtCisgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgLy8gR2V0IHRoZSBwYXJhbGxlbCBsb29wIGNodW5rIG5vdyAoZm9yIHRocmVhZCkKKyAgICAvLyBjb21wdXRlIHRyaXAgY291bnQgZm9yIHRlYW0ncyBjaHVuaworICAgIGlmIChpbmNyID09IDEpIHsKKyAgICAgIHRyaXBfY291bnQgPSAqcHVwcGVyRGlzdCAtICpwbG93ZXIgKyAxOworICAgIH0gZWxzZSBpZiAoaW5jciA9PSAtMSkgeworICAgICAgdHJpcF9jb3VudCA9ICpwbG93ZXIgLSAqcHVwcGVyRGlzdCArIDE7CisgICAgfSBlbHNlIGlmIChpbmNyID4gMSkgeworICAgICAgLy8gdXBwZXItbG93ZXIgY2FuIGV4Y2VlZCB0aGUgbGltaXQgb2Ygc2lnbmVkIHR5cGUKKyAgICAgIHRyaXBfY291bnQgPSAoVVQpKCpwdXBwZXJEaXN0IC0gKnBsb3dlcikgLyBpbmNyICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgdHJpcF9jb3VudCA9IChVVCkoKnBsb3dlciAtICpwdXBwZXJEaXN0KSAvICgtaW5jcikgKyAxOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKHRyaXBfY291bnQpOworICAgIHN3aXRjaCAoc2NoZWR1bGUpIHsKKyAgICBjYXNlIGttcF9zY2hfc3RhdGljOiB7CisgICAgICBpZiAodHJpcF9jb3VudCA8PSBudGgpIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgKKyAgICAgICAgICAgIF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19ncmVlZHkgfHwKKyAgICAgICAgICAgIF9fa21wX3N0YXRpYyA9PQorICAgICAgICAgICAgICAgIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkKTsgLy8gVW5rbm93biBzdGF0aWMgc2NoZWR1bGluZyB0eXBlLgorICAgICAgICBpZiAodGlkIDwgdHJpcF9jb3VudCkKKyAgICAgICAgICAqcHVwcGVyID0gKnBsb3dlciA9ICpwbG93ZXIgKyB0aWQgKiBpbmNyOworICAgICAgICBlbHNlCisgICAgICAgICAgKnBsb3dlciA9ICpwdXBwZXIgKyBpbmNyOyAvLyBubyBpdGVyYXRpb25zIGF2YWlsYWJsZQorICAgICAgICBpZiAocGxhc3RpdGVyICE9IE5VTEwpCisgICAgICAgICAgaWYgKCpwbGFzdGl0ZXIgIT0gMCAmJiAhKHRpZCA9PSB0cmlwX2NvdW50IC0gMSkpCisgICAgICAgICAgICAqcGxhc3RpdGVyID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQpIHsKKyAgICAgICAgICBVVCBjaHVua0wgPSB0cmlwX2NvdW50IC8gbnRoOworICAgICAgICAgIFVUIGV4dHJhcyA9IHRyaXBfY291bnQgJSBudGg7CisgICAgICAgICAgKnBsb3dlciArPSBpbmNyICogKHRpZCAqIGNodW5rTCArICh0aWQgPCBleHRyYXMgPyB0aWQgOiBleHRyYXMpKTsKKyAgICAgICAgICAqcHVwcGVyID0gKnBsb3dlciArIGNodW5rTCAqIGluY3IgLSAodGlkIDwgZXh0cmFzID8gMCA6IGluY3IpOworICAgICAgICAgIGlmIChwbGFzdGl0ZXIgIT0gTlVMTCkKKyAgICAgICAgICAgIGlmICgqcGxhc3RpdGVyICE9IDAgJiYgISh0aWQgPT0gbnRoIC0gMSkpCisgICAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFQgY2h1bmtfaW5jX2NvdW50ID0KKyAgICAgICAgICAgICAgKHRyaXBfY291bnQgLyBudGggKyAoKHRyaXBfY291bnQgJSBudGgpID8gMSA6IDApKSAqIGluY3I7CisgICAgICAgICAgVCB1cHBlciA9ICpwdXBwZXJEaXN0OworICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2dyZWVkeSk7CisgICAgICAgICAgLy8gVW5rbm93biBzdGF0aWMgc2NoZWR1bGluZyB0eXBlLgorICAgICAgICAgICpwbG93ZXIgKz0gdGlkICogY2h1bmtfaW5jX2NvdW50OworICAgICAgICAgICpwdXBwZXIgPSAqcGxvd2VyICsgY2h1bmtfaW5jX2NvdW50IC0gaW5jcjsKKyAgICAgICAgICBpZiAoaW5jciA+IDApIHsKKyAgICAgICAgICAgIGlmICgqcHVwcGVyIDwgKnBsb3dlcikKKyAgICAgICAgICAgICAgKnB1cHBlciA9IHRyYWl0c190PFQ+OjptYXhfdmFsdWU7CisgICAgICAgICAgICBpZiAocGxhc3RpdGVyICE9IE5VTEwpCisgICAgICAgICAgICAgIGlmICgqcGxhc3RpdGVyICE9IDAgJiYKKyAgICAgICAgICAgICAgICAgICEoKnBsb3dlciA8PSB1cHBlciAmJiAqcHVwcGVyID4gdXBwZXIgLSBpbmNyKSkKKyAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gMDsKKyAgICAgICAgICAgIGlmICgqcHVwcGVyID4gdXBwZXIpCisgICAgICAgICAgICAgICpwdXBwZXIgPSB1cHBlcjsgLy8gdHJhY2tlciBDNzMyNTgKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCpwdXBwZXIgPiAqcGxvd2VyKQorICAgICAgICAgICAgICAqcHVwcGVyID0gdHJhaXRzX3Q8VD46Om1pbl92YWx1ZTsKKyAgICAgICAgICAgIGlmIChwbGFzdGl0ZXIgIT0gTlVMTCkKKyAgICAgICAgICAgICAgaWYgKCpwbGFzdGl0ZXIgIT0gMCAmJgorICAgICAgICAgICAgICAgICAgISgqcGxvd2VyID49IHVwcGVyICYmICpwdXBwZXIgPCB1cHBlciAtIGluY3IpKQorICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAwOworICAgICAgICAgICAgaWYgKCpwdXBwZXIgPCB1cHBlcikKKyAgICAgICAgICAgICAgKnB1cHBlciA9IHVwcGVyOyAvLyB0cmFja2VyIEM3MzI1OAorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfY2h1bmtlZDogeworICAgICAgU1Qgc3BhbjsKKyAgICAgIGlmIChjaHVuayA8IDEpCisgICAgICAgIGNodW5rID0gMTsKKyAgICAgIHNwYW4gPSBjaHVuayAqIGluY3I7CisgICAgICAqcHN0cmlkZSA9IHNwYW4gKiBudGg7CisgICAgICAqcGxvd2VyID0gKnBsb3dlciArIChzcGFuICogdGlkKTsKKyAgICAgICpwdXBwZXIgPSAqcGxvd2VyICsgc3BhbiAtIGluY3I7CisgICAgICBpZiAocGxhc3RpdGVyICE9IE5VTEwpCisgICAgICAgIGlmICgqcGxhc3RpdGVyICE9IDAgJiYgISh0aWQgPT0gKCh0cmlwX2NvdW50IC0gMSkgLyAoVVQpY2h1bmspICUgbnRoKSkKKyAgICAgICAgICAqcGxhc3RpdGVyID0gMDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgS01QX0FTU0VSVDIoMCwKKyAgICAgICAgICAgICAgICAgICJfX2ttcGNfZGlzdF9mb3Jfc3RhdGljX2luaXQ6IHVua25vd24gbG9vcCBzY2hlZHVsaW5nIHR5cGUiKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorZW5kOjsKKyNpZmRlZiBLTVBfREVCVUcKKyAgeworICAgIGNvbnN0IGNoYXIgKmJ1ZmY7CisgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICJfX2ttcGNfZGlzdF9mb3Jfc3RhdGljX2luaXQ6IGxhc3Q9JSVkIGxvPSUlJXMgdXA9JSUlcyB1cERpc3Q9JSUlcyAiCisgICAgICAgICJzdHJpZGU9JSUlcyBzaWduZWQ/PCVzPlxuIiwKKyAgICAgICAgdHJhaXRzX3Q8VD46OnNwZWMsIHRyYWl0c190PFQ+OjpzcGVjLCB0cmFpdHNfdDxUPjo6c3BlYywKKyAgICAgICAgdHJhaXRzX3Q8U1Q+OjpzcGVjLCB0cmFpdHNfdDxUPjo6c3BlYyk7CisgICAgS0RfVFJBQ0UoMTAwLCAoYnVmZiwgKnBsYXN0aXRlciwgKnBsb3dlciwgKnB1cHBlciwgKnB1cHBlckRpc3QsICpwc3RyaWRlKSk7CisgICAgX19rbXBfc3RyX2ZyZWUoJmJ1ZmYpOworICB9CisjZW5kaWYKKyAgS0VfVFJBQ0UoMTAsICgiX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0OiBUIyVkIHJldHVyblxuIiwgZ3RpZCkpOworICByZXR1cm47Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIHZvaWQgX19rbXBfdGVhbV9zdGF0aWNfaW5pdChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgKnBfbGFzdCwgVCAqcF9sYiwgVCAqcF91YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgdHJhaXRzX3Q8VD46OnNpZ25lZF90ICpwX3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSB0cmFpdHNfdDxUPjo6c2lnbmVkX3QgaW5jciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgdHJhaXRzX3Q8VD46OnNpZ25lZF90IGNodW5rKSB7CisgIC8vIFRoZSByb3V0aW5lIHJldHVybnMgdGhlIGZpcnN0IGNodW5rIGRpc3RyaWJ1dGVkIHRvIHRoZSB0ZWFtIGFuZAorICAvLyBzdHJpZGUgZm9yIG5leHQgY2h1bmtzIGNhbGN1bGF0aW9uLgorICAvLyBMYXN0IGl0ZXJhdGlvbiBmbGFnIHNldCBmb3IgdGhlIHRlYW0gdGhhdCB3aWxsIGV4ZWN1dGUKKyAgLy8gdGhlIGxhc3QgaXRlcmF0aW9uIG9mIHRoZSBsb29wLgorICAvLyBUaGUgcm91dGluZSBpcyBjYWxsZWQgZm9yIGRpc3Rfc2NoZWR1ZShzdGF0aWMsY2h1bmspIG9ubHkuCisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8VD46OnVuc2lnbmVkX3QgVVQ7CisgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8VD46OnNpZ25lZF90IFNUOworICBrbXBfdWludDMyIHRlYW1faWQ7CisgIGttcF91aW50MzIgbnRlYW1zOworICBVVCB0cmlwX2NvdW50OworICBUIGxvd2VyOworICBUIHVwcGVyOworICBTVCBzcGFuOworICBrbXBfdGVhbV90ICp0ZWFtOworICBrbXBfaW5mb190ICp0aDsKKworICBLTVBfREVCVUdfQVNTRVJUKHBfbGFzdCAmJiBwX2xiICYmIHBfdWIgJiYgcF9zdCk7CisgIEtFX1RSQUNFKDEwLCAoIl9fa21wX3RlYW1fc3RhdGljX2luaXQgY2FsbGVkICglZClcbiIsIGd0aWQpKTsKKyNpZmRlZiBLTVBfREVCVUcKKyAgeworICAgIGNvbnN0IGNoYXIgKmJ1ZmY7CisgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoIl9fa21wX3RlYW1fc3RhdGljX2luaXQgZW50ZXI6IFQjJSVkIGxpdGVyPSUlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZXI9KCUlJXMsICUlJXMsICUlJXMpIGNodW5rICUlJXM7IHNpZ25lZD88JXM+XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PFQ+OjpzcGVjLCB0cmFpdHNfdDxUPjo6c3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDxTVD46OnNwZWMsIHRyYWl0c190PFNUPjo6c3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDxUPjo6c3BlYyk7CisgICAgS0RfVFJBQ0UoMTAwLCAoYnVmZiwgZ3RpZCwgKnBfbGFzdCwgKnBfbGIsICpwX3ViLCAqcF9zdCwgY2h1bmspKTsKKyAgICBfX2ttcF9zdHJfZnJlZSgmYnVmZik7CisgIH0KKyNlbmRpZgorCisgIGxvd2VyID0gKnBfbGI7CisgIHVwcGVyID0gKnBfdWI7CisgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICBpZiAoaW5jciA9PSAwKSB7CisgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3Qoa21wX2kxOG5fbXNnX0Nuc0xvb3BJbmNyWmVyb1Byb2hpYml0ZWQsIGN0X3BkbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MpOworICAgIH0KKyAgICBpZiAoaW5jciA+IDAgPyAodXBwZXIgPCBsb3dlcikgOiAobG93ZXIgPCB1cHBlcikpIHsKKyAgICAgIC8vIFRoZSBsb29wIGlzIGlsbGVnYWwuCisgICAgICAvLyBTb21lIHplcm8tdHJpcCBsb29wcyBtYWludGFpbmVkIGJ5IGNvbXBpbGVyLCBlLmcuOgorICAgICAgLy8gICBmb3IoaT0xMDtpPDA7KytpKSAvLyBsb3dlciA+PSB1cHBlciAtIHJ1bi10aW1lIGNoZWNrCisgICAgICAvLyAgIGZvcihpPTA7aT4xMDstLWkpIC8vIGxvd2VyIDw9IHVwcGVyIC0gcnVuLXRpbWUgY2hlY2sKKyAgICAgIC8vICAgZm9yKGk9MDtpPjEwOysraSkgLy8gaW5jciA+IDAgICAgICAgLSBjb21waWxlLXRpbWUgY2hlY2sKKyAgICAgIC8vICAgZm9yKGk9MTA7aTwwOy0taSkgLy8gaW5jciA8IDAgICAgICAgLSBjb21waWxlLXRpbWUgY2hlY2sKKyAgICAgIC8vIENvbXBpbGVyIGRvZXMgbm90IGNoZWNrIHRoZSBmb2xsb3dpbmcgaWxsZWdhbCBsb29wczoKKyAgICAgIC8vICAgZm9yKGk9MDtpPDEwO2krPWluY3IpIC8vIHdoZXJlIGluY3I8MAorICAgICAgLy8gICBmb3IoaT0xMDtpPjA7aS09aW5jcikgLy8gd2hlcmUgaW5jcjwwCisgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3Qoa21wX2kxOG5fbXNnX0Nuc0xvb3BJbmNySWxsZWdhbCwgY3RfcGRvLCBsb2MpOworICAgIH0KKyAgfQorICB0aCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgIHRlYW0gPSB0aC0+dGgudGhfdGVhbTsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICBLTVBfREVCVUdfQVNTRVJUKHRoLT50aC50aF90ZWFtc19taWNyb3Rhc2spOyAvLyB3ZSBhcmUgaW4gdGhlIHRlYW1zIGNvbnN0cnVjdAorICBudGVhbXMgPSB0aC0+dGgudGhfdGVhbXNfc2l6ZS5udGVhbXM7CisjZW5kaWYKKyAgdGVhbV9pZCA9IHRlYW0tPnQudF9tYXN0ZXJfdGlkOworICBLTVBfREVCVUdfQVNTRVJUKG50ZWFtcyA9PSB0ZWFtLT50LnRfcGFyZW50LT50LnRfbnByb2MpOworCisgIC8vIGNvbXB1dGUgdHJpcCBjb3VudAorICBpZiAoaW5jciA9PSAxKSB7CisgICAgdHJpcF9jb3VudCA9IHVwcGVyIC0gbG93ZXIgKyAxOworICB9IGVsc2UgaWYgKGluY3IgPT0gLTEpIHsKKyAgICB0cmlwX2NvdW50ID0gbG93ZXIgLSB1cHBlciArIDE7CisgIH0gZWxzZSBpZiAoaW5jciA+IDApIHsKKyAgICAvLyB1cHBlci1sb3dlciBjYW4gZXhjZWVkIHRoZSBsaW1pdCBvZiBzaWduZWQgdHlwZQorICAgIHRyaXBfY291bnQgPSAoVVQpKHVwcGVyIC0gbG93ZXIpIC8gaW5jciArIDE7CisgIH0gZWxzZSB7CisgICAgdHJpcF9jb3VudCA9IChVVCkobG93ZXIgLSB1cHBlcikgLyAoLWluY3IpICsgMTsKKyAgfQorICBpZiAoY2h1bmsgPCAxKQorICAgIGNodW5rID0gMTsKKyAgc3BhbiA9IGNodW5rICogaW5jcjsKKyAgKnBfc3QgPSBzcGFuICogbnRlYW1zOworICAqcF9sYiA9IGxvd2VyICsgKHNwYW4gKiB0ZWFtX2lkKTsKKyAgKnBfdWIgPSAqcF9sYiArIHNwYW4gLSBpbmNyOworICBpZiAocF9sYXN0ICE9IE5VTEwpCisgICAgKnBfbGFzdCA9ICh0ZWFtX2lkID09ICgodHJpcF9jb3VudCAtIDEpIC8gKFVUKWNodW5rKSAlIG50ZWFtcyk7CisgIC8vIENvcnJlY3QgdXBwZXIgYm91bmQgaWYgbmVlZGVkCisgIGlmIChpbmNyID4gMCkgeworICAgIGlmICgqcF91YiA8ICpwX2xiKSAvLyBvdmVyZmxvdz8KKyAgICAgICpwX3ViID0gdHJhaXRzX3Q8VD46Om1heF92YWx1ZTsKKyAgICBpZiAoKnBfdWIgPiB1cHBlcikKKyAgICAgICpwX3ViID0gdXBwZXI7IC8vIHRyYWNrZXIgQzczMjU4CisgIH0gZWxzZSB7IC8vIGluY3IgPCAwCisgICAgaWYgKCpwX3ViID4gKnBfbGIpCisgICAgICAqcF91YiA9IHRyYWl0c190PFQ+OjptaW5fdmFsdWU7CisgICAgaWYgKCpwX3ViIDwgdXBwZXIpCisgICAgICAqcF91YiA9IHVwcGVyOyAvLyB0cmFja2VyIEM3MzI1OAorICB9CisjaWZkZWYgS01QX0RFQlVHCisgIHsKKyAgICBjb25zdCBjaGFyICpidWZmOworICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgIGJ1ZmYgPQorICAgICAgICBfX2ttcF9zdHJfZm9ybWF0KCJfX2ttcF90ZWFtX3N0YXRpY19pbml0IGV4aXQ6IFQjJSVkIHRlYW0lJXUgbGl0ZXI9JSVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaXRlcj0oJSUlcywgJSUlcywgJSUlcykgY2h1bmsgJSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDxUPjo6c3BlYywgdHJhaXRzX3Q8VD46OnNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8U1Q+OjpzcGVjLCB0cmFpdHNfdDxTVD46OnNwZWMpOworICAgIEtEX1RSQUNFKDEwMCwgKGJ1ZmYsIGd0aWQsIHRlYW1faWQsICpwX2xhc3QsICpwX2xiLCAqcF91YiwgKnBfc3QsIGNodW5rKSk7CisgICAgX19rbXBfc3RyX2ZyZWUoJmJ1ZmYpOworICB9CisjZW5kaWYKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2V4dGVybiAiQyIgeworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0BwYXJhbSAgICBsb2MgICAgICAgU291cmNlIGNvZGUgbG9jYXRpb24KK0BwYXJhbSAgICBndGlkICAgICAgR2xvYmFsIHRocmVhZCBpZCBvZiB0aGlzIHRocmVhZAorQHBhcmFtICAgIHNjaGVkdHlwZSAgU2NoZWR1bGluZyB0eXBlCitAcGFyYW0gICAgcGxhc3RpdGVyIFBvaW50ZXIgdG8gdGhlICJsYXN0IGl0ZXJhdGlvbiIgZmxhZworQHBhcmFtICAgIHBsb3dlciAgICBQb2ludGVyIHRvIHRoZSBsb3dlciBib3VuZAorQHBhcmFtICAgIHB1cHBlciAgICBQb2ludGVyIHRvIHRoZSB1cHBlciBib3VuZAorQHBhcmFtICAgIHBzdHJpZGUgICBQb2ludGVyIHRvIHRoZSBzdHJpZGUKK0BwYXJhbSAgICBpbmNyICAgICAgTG9vcCBpbmNyZW1lbnQKK0BwYXJhbSAgICBjaHVuayAgICAgVGhlIGNodW5rIHNpemUKKworRWFjaCBvZiB0aGUgZm91ciBmdW5jdGlvbnMgaGVyZSBhcmUgaWRlbnRpY2FsIGFwYXJ0IGZyb20gdGhlIGFyZ3VtZW50IHR5cGVzLgorCitUaGUgZnVuY3Rpb25zIGNvbXB1dGUgdGhlIHVwcGVyIGFuZCBsb3dlciBib3VuZHMgYW5kIHN0cmlkZSB0byBiZSB1c2VkIGZvciB0aGUKK3NldCBvZiBpdGVyYXRpb25zIHRvIGJlIGV4ZWN1dGVkIGJ5IHRoZSBjdXJyZW50IHRocmVhZCBmcm9tIHRoZSBzdGF0aWNhbGx5CitzY2hlZHVsZWQgbG9vcCB0aGF0IGlzIGRlc2NyaWJlZCBieSB0aGUgaW5pdGlhbCB2YWx1ZXMgb2YgdGhlIGJvdW5kcywgc3RyaWRlLAoraW5jcmVtZW50IGFuZCBjaHVuayBzaXplLgorCitAeworKi8KK3ZvaWQgX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF80KGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBzY2hlZHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgKnBsYXN0aXRlciwga21wX2ludDMyICpwbG93ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgKnB1cHBlciwga21wX2ludDMyICpwc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGluY3IsIGttcF9pbnQzMiBjaHVuaykgeworICBfX2ttcF9mb3Jfc3RhdGljX2luaXQ8a21wX2ludDMyPihsb2MsIGd0aWQsIHNjaGVkdHlwZSwgcGxhc3RpdGVyLCBwbG93ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1cHBlciwgcHN0cmlkZSwgaW5jciwgY2h1bmspOworfQorCisvKiEKKyBTZWUgQHJlZiBfX2ttcGNfZm9yX3N0YXRpY19pbml0XzQKKyAqLwordm9pZCBfX2ttcGNfZm9yX3N0YXRpY19pbml0XzR1KGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIHNjaGVkdHlwZSwga21wX2ludDMyICpwbGFzdGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiAqcGxvd2VyLCBrbXBfdWludDMyICpwdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyICpwc3RyaWRlLCBrbXBfaW50MzIgaW5jciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgY2h1bmspIHsKKyAgX19rbXBfZm9yX3N0YXRpY19pbml0PGttcF91aW50MzI+KGxvYywgZ3RpZCwgc2NoZWR0eXBlLCBwbGFzdGl0ZXIsIHBsb3dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1cHBlciwgcHN0cmlkZSwgaW5jciwgY2h1bmspOworfQorCisvKiEKKyBTZWUgQHJlZiBfX2ttcGNfZm9yX3N0YXRpY19pbml0XzQKKyAqLwordm9pZCBfX2ttcGNfZm9yX3N0YXRpY19pbml0XzgoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIHNjaGVkdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiAqcGxhc3RpdGVyLCBrbXBfaW50NjQgKnBsb3dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCAqcHVwcGVyLCBrbXBfaW50NjQgKnBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgaW5jciwga21wX2ludDY0IGNodW5rKSB7CisgIF9fa21wX2Zvcl9zdGF0aWNfaW5pdDxrbXBfaW50NjQ+KGxvYywgZ3RpZCwgc2NoZWR0eXBlLCBwbGFzdGl0ZXIsIHBsb3dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVwcGVyLCBwc3RyaWRlLCBpbmNyLCBjaHVuayk7Cit9CisKKy8qIQorIFNlZSBAcmVmIF9fa21wY19mb3Jfc3RhdGljX2luaXRfNAorICovCit2b2lkIF9fa21wY19mb3Jfc3RhdGljX2luaXRfOHUoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgc2NoZWR0eXBlLCBrbXBfaW50MzIgKnBsYXN0aXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDY0ICpwbG93ZXIsIGttcF91aW50NjQgKnB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgKnBzdHJpZGUsIGttcF9pbnQ2NCBpbmNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCBjaHVuaykgeworICBfX2ttcF9mb3Jfc3RhdGljX2luaXQ8a21wX3VpbnQ2ND4obG9jLCBndGlkLCBzY2hlZHR5cGUsIHBsYXN0aXRlciwgcGxvd2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVwcGVyLCBwc3RyaWRlLCBpbmNyLCBjaHVuayk7Cit9CisvKiEKK0B9CisqLworCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtICAgIGxvYyAgICAgICBTb3VyY2UgY29kZSBsb2NhdGlvbgorQHBhcmFtICAgIGd0aWQgICAgICBHbG9iYWwgdGhyZWFkIGlkIG9mIHRoaXMgdGhyZWFkCitAcGFyYW0gICAgc2NoZWR1bGUgIFNjaGVkdWxpbmcgdHlwZSBmb3IgdGhlIHBhcmFsbGVsIGxvb3AKK0BwYXJhbSAgICBwbGFzdGl0ZXIgUG9pbnRlciB0byB0aGUgImxhc3QgaXRlcmF0aW9uIiBmbGFnCitAcGFyYW0gICAgcGxvd2VyICAgIFBvaW50ZXIgdG8gdGhlIGxvd2VyIGJvdW5kCitAcGFyYW0gICAgcHVwcGVyICAgIFBvaW50ZXIgdG8gdGhlIHVwcGVyIGJvdW5kIG9mIGxvb3AgY2h1bmsKK0BwYXJhbSAgICBwdXBwZXJEICAgUG9pbnRlciB0byB0aGUgdXBwZXIgYm91bmQgb2YgZGlzdF9jaHVuaworQHBhcmFtICAgIHBzdHJpZGUgICBQb2ludGVyIHRvIHRoZSBzdHJpZGUgZm9yIHBhcmFsbGVsIGxvb3AKK0BwYXJhbSAgICBpbmNyICAgICAgTG9vcCBpbmNyZW1lbnQKK0BwYXJhbSAgICBjaHVuayAgICAgVGhlIGNodW5rIHNpemUgZm9yIHRoZSBwYXJhbGxlbCBsb29wCisKK0VhY2ggb2YgdGhlIGZvdXIgZnVuY3Rpb25zIGhlcmUgYXJlIGlkZW50aWNhbCBhcGFydCBmcm9tIHRoZSBhcmd1bWVudCB0eXBlcy4KKworVGhlIGZ1bmN0aW9ucyBjb21wdXRlIHRoZSB1cHBlciBhbmQgbG93ZXIgYm91bmRzIGFuZCBzdHJpZGVzIHRvIGJlIHVzZWQgZm9yIHRoZQorc2V0IG9mIGl0ZXJhdGlvbnMgdG8gYmUgZXhlY3V0ZWQgYnkgdGhlIGN1cnJlbnQgdGhyZWFkIGZyb20gdGhlIHN0YXRpY2FsbHkKK3NjaGVkdWxlZCBsb29wIHRoYXQgaXMgZGVzY3JpYmVkIGJ5IHRoZSBpbml0aWFsIHZhbHVlcyBvZiB0aGUgYm91bmRzLCBzdHJpZGVzLAoraW5jcmVtZW50IGFuZCBjaHVua3MgZm9yIHBhcmFsbGVsIGxvb3AgYW5kIGRpc3RyaWJ1dGUgY29uc3RydWN0cy4KKworQHsKKyovCit2b2lkIF9fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdF80KGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBzY2hlZHVsZSwga21wX2ludDMyICpwbGFzdGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiAqcGxvd2VyLCBrbXBfaW50MzIgKnB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyICpwdXBwZXJELCBrbXBfaW50MzIgKnBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBpbmNyLCBrbXBfaW50MzIgY2h1bmspIHsKKyAgX19rbXBfZGlzdF9mb3Jfc3RhdGljX2luaXQ8a21wX2ludDMyPihsb2MsIGd0aWQsIHNjaGVkdWxlLCBwbGFzdGl0ZXIsIHBsb3dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXBwZXIsIHB1cHBlckQsIHBzdHJpZGUsIGluY3IsIGNodW5rKTsKK30KKworLyohCisgU2VlIEByZWYgX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0XzQKKyAqLwordm9pZCBfX2ttcGNfZGlzdF9mb3Jfc3RhdGljX2luaXRfNHUoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBzY2hlZHVsZSwga21wX2ludDMyICpwbGFzdGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDMyICpwbG93ZXIsIGttcF91aW50MzIgKnB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50MzIgKnB1cHBlckQsIGttcF9pbnQzMiAqcHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBpbmNyLCBrbXBfaW50MzIgY2h1bmspIHsKKyAgX19rbXBfZGlzdF9mb3Jfc3RhdGljX2luaXQ8a21wX3VpbnQzMj4obG9jLCBndGlkLCBzY2hlZHVsZSwgcGxhc3RpdGVyLCBwbG93ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1cHBlciwgcHVwcGVyRCwgcHN0cmlkZSwgaW5jciwgY2h1bmspOworfQorCisvKiEKKyBTZWUgQHJlZiBfX2ttcGNfZGlzdF9mb3Jfc3RhdGljX2luaXRfNAorICovCit2b2lkIF9fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdF84KGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBzY2hlZHVsZSwga21wX2ludDMyICpwbGFzdGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCAqcGxvd2VyLCBrbXBfaW50NjQgKnB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0ICpwdXBwZXJELCBrbXBfaW50NjQgKnBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCBpbmNyLCBrbXBfaW50NjQgY2h1bmspIHsKKyAgX19rbXBfZGlzdF9mb3Jfc3RhdGljX2luaXQ8a21wX2ludDY0Pihsb2MsIGd0aWQsIHNjaGVkdWxlLCBwbGFzdGl0ZXIsIHBsb3dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXBwZXIsIHB1cHBlckQsIHBzdHJpZGUsIGluY3IsIGNodW5rKTsKK30KKworLyohCisgU2VlIEByZWYgX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0XzQKKyAqLwordm9pZCBfX2ttcGNfZGlzdF9mb3Jfc3RhdGljX2luaXRfOHUoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBzY2hlZHVsZSwga21wX2ludDMyICpwbGFzdGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDY0ICpwbG93ZXIsIGttcF91aW50NjQgKnB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgKnB1cHBlckQsIGttcF9pbnQ2NCAqcHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCBpbmNyLCBrbXBfaW50NjQgY2h1bmspIHsKKyAgX19rbXBfZGlzdF9mb3Jfc3RhdGljX2luaXQ8a21wX3VpbnQ2ND4obG9jLCBndGlkLCBzY2hlZHVsZSwgcGxhc3RpdGVyLCBwbG93ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1cHBlciwgcHVwcGVyRCwgcHN0cmlkZSwgaW5jciwgY2h1bmspOworfQorLyohCitAfQorKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEF1eGlsaWFyeSByb3V0aW5lcyBmb3IgRGlzdHJpYnV0ZSBQYXJhbGxlbCBMb29wIGNvbnN0cnVjdCBpbXBsZW1lbnRhdGlvbgorLy8gICAgVHJhbnNmZXIgY2FsbCB0byB0ZW1wbGF0ZTwgdHlwZSBUID4KKy8vICAgIF9fa21wX3RlYW1fc3RhdGljX2luaXQoIGlkZW50X3QgKmxvYywgaW50IGd0aWQsCisvLyAgICAgICAgaW50ICpwX2xhc3QsIFQgKmxiLCBUICp1YiwgU1QgKnN0LCBTVCBpbmNyLCBTVCBjaHVuayApCisKKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAeworQHBhcmFtIGxvYyBTb3VyY2UgbG9jYXRpb24KK0BwYXJhbSBndGlkIEdsb2JhbCB0aHJlYWQgaWQKK0BwYXJhbSBwX2xhc3QgcG9pbnRlciB0byBsYXN0IGl0ZXJhdGlvbiBmbGFnCitAcGFyYW0gcF9sYiAgcG9pbnRlciB0byBMb3dlciBib3VuZAorQHBhcmFtIHBfdWIgIHBvaW50ZXIgdG8gVXBwZXIgYm91bmQKK0BwYXJhbSBwX3N0ICBTdGVwIChvciBpbmNyZW1lbnQgaWYgeW91IHByZWZlcikKK0BwYXJhbSBpbmNyICBMb29wIGluY3JlbWVudAorQHBhcmFtIGNodW5rIFRoZSBjaHVuayBzaXplIHRvIGJsb2NrIHdpdGgKKworVGhlIGZ1bmN0aW9ucyBjb21wdXRlIHRoZSB1cHBlciBhbmQgbG93ZXIgYm91bmRzIGFuZCBzdHJpZGUgdG8gYmUgdXNlZCBmb3IgdGhlCitzZXQgb2YgaXRlcmF0aW9ucyB0byBiZSBleGVjdXRlZCBieSB0aGUgY3VycmVudCB0ZWFtIGZyb20gdGhlIHN0YXRpY2FsbHkKK3NjaGVkdWxlZCBsb29wIHRoYXQgaXMgZGVzY3JpYmVkIGJ5IHRoZSBpbml0aWFsIHZhbHVlcyBvZiB0aGUgYm91bmRzLCBzdHJpZGUsCitpbmNyZW1lbnQgYW5kIGNodW5rIGZvciB0aGUgZGlzdHJpYnV0ZSBjb25zdHJ1Y3QgYXMgcGFydCBvZiBjb21wb3NpdGUgZGlzdHJpYnV0ZQorcGFyYWxsZWwgbG9vcCBjb25zdHJ1Y3QuIFRoZXNlIGZ1bmN0aW9ucyBhcmUgYWxsIGlkZW50aWNhbCBhcGFydCBmcm9tIHRoZSB0eXBlcworb2YgdGhlIGFyZ3VtZW50cy4KKyovCisKK3ZvaWQgX19rbXBjX3RlYW1fc3RhdGljX2luaXRfNChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgKnBfbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgKnBfbGIsIGttcF9pbnQzMiAqcF91YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgKnBfc3QsIGttcF9pbnQzMiBpbmNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBjaHVuaykgeworICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2luaXRfc2VyaWFsKTsKKyAgX19rbXBfdGVhbV9zdGF0aWNfaW5pdDxrbXBfaW50MzI+KGxvYywgZ3RpZCwgcF9sYXN0LCBwX2xiLCBwX3ViLCBwX3N0LCBpbmNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmspOworfQorCisvKiEKKyBTZWUgQHJlZiBfX2ttcGNfdGVhbV9zdGF0aWNfaW5pdF80CisgKi8KK3ZvaWQgX19rbXBjX3RlYW1fc3RhdGljX2luaXRfNHUoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyICpwX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50MzIgKnBfbGIsIGttcF91aW50MzIgKnBfdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiAqcF9zdCwga21wX2ludDMyIGluY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBjaHVuaykgeworICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2luaXRfc2VyaWFsKTsKKyAgX19rbXBfdGVhbV9zdGF0aWNfaW5pdDxrbXBfdWludDMyPihsb2MsIGd0aWQsIHBfbGFzdCwgcF9sYiwgcF91YiwgcF9zdCwgaW5jciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVuayk7Cit9CisKKy8qIQorIFNlZSBAcmVmIF9fa21wY190ZWFtX3N0YXRpY19pbml0XzQKKyAqLwordm9pZCBfX2ttcGNfdGVhbV9zdGF0aWNfaW5pdF84KGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiAqcF9sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCAqcF9sYiwga21wX2ludDY0ICpwX3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCAqcF9zdCwga21wX2ludDY0IGluY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IGNodW5rKSB7CisgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfaW5pdF9zZXJpYWwpOworICBfX2ttcF90ZWFtX3N0YXRpY19pbml0PGttcF9pbnQ2ND4obG9jLCBndGlkLCBwX2xhc3QsIHBfbGIsIHBfdWIsIHBfc3QsIGluY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVuayk7Cit9CisKKy8qIQorIFNlZSBAcmVmIF9fa21wY190ZWFtX3N0YXRpY19pbml0XzQKKyAqLwordm9pZCBfX2ttcGNfdGVhbV9zdGF0aWNfaW5pdF84dShpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgKnBfbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQ2NCAqcF9sYiwga21wX3VpbnQ2NCAqcF91YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0ICpwX3N0LCBrbXBfaW50NjQgaW5jciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IGNodW5rKSB7CisgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfaW5pdF9zZXJpYWwpOworICBfX2ttcF90ZWFtX3N0YXRpY19pbml0PGttcF91aW50NjQ+KGxvYywgZ3RpZCwgcF9sYXN0LCBwX2xiLCBwX3ViLCBwX3N0LCBpbmNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rKTsKK30KKy8qIQorQH0KKyovCisKK30gLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3NldHRpbmdzLmNwcCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zZXR0aW5ncy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBkOWJhNQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zZXR0aW5ncy5jcHAKQEAgLTAsMCArMSw1MzgxIEBACisvKgorICoga21wX3NldHRpbmdzLmNwcCAtLSBJbml0aWFsaXplIGVudmlyb25tZW50IHZhcmlhYmxlcworICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2FmZmluaXR5LmgiCisjaW5jbHVkZSAia21wX2F0b21pYy5oIgorI2luY2x1ZGUgImttcF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX2lvLmgiCisjaW5jbHVkZSAia21wX2l0dC5oIgorI2luY2x1ZGUgImttcF9sb2NrLmgiCisjaW5jbHVkZSAia21wX3NldHRpbmdzLmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorI2luY2x1ZGUgImttcF93cmFwcGVyX2dldHBpZC5oIgorI2luY2x1ZGUgPGN0eXBlLmg+ICAgLy8gdG91cHBlcigpCisKK3N0YXRpYyBpbnQgX19rbXBfZW52X3RvUHJpbnQoY2hhciBjb25zdCAqbmFtZSwgaW50IGZsYWcpOworCitib29sIF9fa21wX2Vudl9mb3JtYXQgPSAwOyAvLyAwIC0gb2xkIGZvcm1hdDsgMSAtIG5ldyBmb3JtYXQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhlbHBlciBzdHJpbmcgZnVuY3Rpb25zLiBTdWJqZWN0IHRvIG1vdmUgdG8ga21wX3N0ci4KKworc3RhdGljIGRvdWJsZSBfX2ttcF9jb252ZXJ0X3RvX2RvdWJsZShjaGFyIGNvbnN0ICpzKSB7CisgIGRvdWJsZSByZXN1bHQ7CisKKyAgaWYgKEtNUF9TU0NBTkYocywgIiVsZiIsICZyZXN1bHQpIDwgMSkgeworICAgIHJlc3VsdCA9IDAuMDsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKyNpZmRlZiBLTVBfREVCVUcKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19rbXBfcmVhZHN0cl93aXRoX3NlbnRpbmVsKGNoYXIgKmRlc3QsIGNoYXIgY29uc3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4sIGNoYXIgc2VudGluZWwpIHsKKyAgdW5zaWduZWQgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIGlmICgoKnNyYyA9PSAnXDAnKSB8fCAoKnNyYyA9PSBzZW50aW5lbCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAqKGRlc3QrKykgPSAqKHNyYysrKTsKKyAgfQorICAqZGVzdCA9ICdcMCc7CisgIHJldHVybiBpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19rbXBfbWF0Y2hfd2l0aF9zZW50aW5lbChjaGFyIGNvbnN0ICphLCBjaGFyIGNvbnN0ICpiLCBzaXplX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgc2VudGluZWwpIHsKKyAgc2l6ZV90IGwgPSAwOworCisgIGlmIChhID09IE5VTEwpCisgICAgYSA9ICIiOworICBpZiAoYiA9PSBOVUxMKQorICAgIGIgPSAiIjsKKyAgd2hpbGUgKCphICYmICpiICYmICpiICE9IHNlbnRpbmVsKSB7CisgICAgY2hhciBjYSA9ICphLCBjYiA9ICpiOworCisgICAgaWYgKGNhID49ICdhJyAmJiBjYSA8PSAneicpCisgICAgICBjYSAtPSAnYScgLSAnQSc7CisgICAgaWYgKGNiID49ICdhJyAmJiBjYiA8PSAneicpCisgICAgICBjYiAtPSAnYScgLSAnQSc7CisgICAgaWYgKGNhICE9IGNiKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgICsrbDsKKyAgICArK2E7CisgICAgKytiOworICB9CisgIHJldHVybiBsID49IGxlbjsKK30KKworLy8gRXhwZWN0ZWQgdXNhZ2U6CisvLyAgICAgdG9rZW4gaXMgdGhlIHRva2VuIHRvIGNoZWNrIGZvci4KKy8vICAgICBidWYgaXMgdGhlIHN0cmluZyBiZWluZyBwYXJzZWQuCisvLyAgICAgKmVuZCByZXR1cm5zIHRoZSBjaGFyIGFmdGVyIHRoZSBlbmQgb2YgdGhlIHRva2VuLgorLy8gICAgICAgIGl0IGlzIG5vdCBtb2RpZmllZCB1bmxlc3MgYSBtYXRjaCBvY2N1cnMuCisvLworLy8gRXhhbXBsZSAxOgorLy8KKy8vICAgICBpZiAoX19rbXBfbWF0Y2hfc3RyKCJ0b2tlbiIsIGJ1ZiwgKmVuZCkgeworLy8gICAgICAgICA8ZG8gc29tZXRoaW5nPgorLy8gICAgICAgICBidWYgPSBlbmQ7CisvLyAgICAgfQorLy8KKy8vICBFeGFtcGxlIDI6CisvLworLy8gICAgIGlmIChfX2ttcF9tYXRjaF9zdHIoInRva2VuIiwgYnVmLCAqZW5kKSB7CisvLyAgICAgICAgIGNoYXIgKnNhdmUgPSAqKmVuZDsKKy8vICAgICAgICAgKiplbmQgPSBzZW50aW5lbDsKKy8vICAgICAgICAgPHVzZSBhbnkgb2YgdGhlIF9fa21wKl93aXRoX3NlbnRpbmVsKCkgZnVuY3Rpb25zPgorLy8gICAgICAgICAqKmVuZCA9IHNhdmU7CisvLyAgICAgICAgIGJ1ZiA9IGVuZDsKKy8vICAgICB9CisKK3N0YXRpYyBpbnQgX19rbXBfbWF0Y2hfc3RyKGNoYXIgY29uc3QgKnRva2VuLCBjaGFyIGNvbnN0ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqZW5kKSB7CisKKyAgS01QX0FTU0VSVCh0b2tlbiAhPSBOVUxMKTsKKyAgS01QX0FTU0VSVChidWYgIT0gTlVMTCk7CisgIEtNUF9BU1NFUlQoZW5kICE9IE5VTEwpOworCisgIHdoaWxlICgqdG9rZW4gJiYgKmJ1ZikgeworICAgIGNoYXIgY3QgPSAqdG9rZW4sIGNiID0gKmJ1ZjsKKworICAgIGlmIChjdCA+PSAnYScgJiYgY3QgPD0gJ3onKQorICAgICAgY3QgLT0gJ2EnIC0gJ0EnOworICAgIGlmIChjYiA+PSAnYScgJiYgY2IgPD0gJ3onKQorICAgICAgY2IgLT0gJ2EnIC0gJ0EnOworICAgIGlmIChjdCAhPSBjYikKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICArK3Rva2VuOworICAgICsrYnVmOworICB9CisgIGlmICgqdG9rZW4pIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgKmVuZCA9IGJ1ZjsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBzaXplX3QgX19rbXBfcm91bmQ0ayhzaXplX3Qgc2l6ZSkgeworICBzaXplX3QgXzRrID0gNCAqIDEwMjQ7CisgIGlmIChzaXplICYgKF80ayAtIDEpKSB7CisgICAgc2l6ZSAmPSB+KF80ayAtIDEpOworICAgIGlmIChzaXplIDw9IEtNUF9TSVpFX1RfTUFYIC0gXzRrKSB7CisgICAgICBzaXplICs9IF80azsgLy8gUm91bmQgdXAgaWYgdGhlcmUgaXMgbm8gb3ZlcmZsb3cuCisgICAgfTsgLy8gaWYKKyAgfTsgLy8gaWYKKyAgcmV0dXJuIHNpemU7Cit9IC8vIF9fa21wX3JvdW5kNGsKKworLyogSGVyZSwgbXVsdGlwbGllcnMgYXJlIGxpa2UgX19rbXBfY29udmVydF90b19zZWNvbmRzLCBidXQgZmxvYXRpbmctcG9pbnQKKyAgIHZhbHVlcyBhcmUgYWxsb3dlZCwgYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMgaW4gbWlsbGlzZWNvbmRzLiAgVGhlIGRlZmF1bHQKKyAgIG11bHRpcGxpZXIgaXMgbWlsbGlzZWNvbmRzLiAgUmV0dXJucyBJTlRfTUFYIG9ubHkgaWYgdGhlIHZhbHVlIHNwZWNpZmllZAorICAgbWF0Y2hlcyAiaW5maW5pdCoiLiAgUmV0dXJucyAtMSBpZiBzcGVjaWZpZWQgc3RyaW5nIGlzIGludmFsaWQuICovCitpbnQgX19rbXBfY29udmVydF90b19taWxsaXNlY29uZHMoY2hhciBjb25zdCAqZGF0YSkgeworICBpbnQgcmV0LCBudmFsdWVzLCBmYWN0b3I7CisgIGNoYXIgbXVsdCwgZXh0cmE7CisgIGRvdWJsZSB2YWx1ZTsKKworICBpZiAoZGF0YSA9PSBOVUxMKQorICAgIHJldHVybiAoLTEpOworICBpZiAoX19rbXBfc3RyX21hdGNoKCJpbmZpbml0IiwgLTEsIGRhdGEpKQorICAgIHJldHVybiAoSU5UX01BWCk7CisgIHZhbHVlID0gKGRvdWJsZSkwLjA7CisgIG11bHQgPSAnXDAnOworICBudmFsdWVzID0gS01QX1NTQ0FORihkYXRhLCAiJWxmJWMlYyIsICZ2YWx1ZSwgJm11bHQsICZleHRyYSk7CisgIGlmIChudmFsdWVzIDwgMSkKKyAgICByZXR1cm4gKC0xKTsKKyAgaWYgKG52YWx1ZXMgPT0gMSkKKyAgICBtdWx0ID0gJ1wwJzsKKyAgaWYgKG52YWx1ZXMgPT0gMykKKyAgICByZXR1cm4gKC0xKTsKKworICBpZiAodmFsdWUgPCAwKQorICAgIHJldHVybiAoLTEpOworCisgIHN3aXRjaCAobXVsdCkgeworICBjYXNlICdcMCc6CisgICAgLyogIGRlZmF1bHQgaXMgbWlsbGlzZWNvbmRzICAqLworICAgIGZhY3RvciA9IDE7CisgICAgYnJlYWs7CisgIGNhc2UgJ3MnOgorICBjYXNlICdTJzoKKyAgICBmYWN0b3IgPSAxMDAwOworICAgIGJyZWFrOworICBjYXNlICdtJzoKKyAgY2FzZSAnTSc6CisgICAgZmFjdG9yID0gMTAwMCAqIDYwOworICAgIGJyZWFrOworICBjYXNlICdoJzoKKyAgY2FzZSAnSCc6CisgICAgZmFjdG9yID0gMTAwMCAqIDYwICogNjA7CisgICAgYnJlYWs7CisgIGNhc2UgJ2QnOgorICBjYXNlICdEJzoKKyAgICBmYWN0b3IgPSAxMDAwICogMjQgKiA2MCAqIDYwOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHJldHVybiAoLTEpOworICB9CisKKyAgaWYgKHZhbHVlID49ICgoSU5UX01BWCAtIDEpIC8gZmFjdG9yKSkKKyAgICByZXQgPSBJTlRfTUFYIC0gMTsgLyogRG9uJ3QgYWxsb3cgaW5maW5pdGUgdmFsdWUgaGVyZSAqLworICBlbHNlCisgICAgcmV0ID0gKGludCkodmFsdWUgKiAoZG91YmxlKWZhY3Rvcik7IC8qIHRydW5jYXRlIHRvIGludCAgKi8KKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbChjaGFyIGNvbnN0ICphLCBjaGFyIGNvbnN0ICpiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBzZW50aW5lbCkgeworICBpZiAoYSA9PSBOVUxMKQorICAgIGEgPSAiIjsKKyAgaWYgKGIgPT0gTlVMTCkKKyAgICBiID0gIiI7CisgIHdoaWxlICgqYSAmJiAqYiAmJiAqYiAhPSBzZW50aW5lbCkgeworICAgIGNoYXIgY2EgPSAqYSwgY2IgPSAqYjsKKworICAgIGlmIChjYSA+PSAnYScgJiYgY2EgPD0gJ3onKQorICAgICAgY2EgLT0gJ2EnIC0gJ0EnOworICAgIGlmIChjYiA+PSAnYScgJiYgY2IgPD0gJ3onKQorICAgICAgY2IgLT0gJ2EnIC0gJ0EnOworICAgIGlmIChjYSAhPSBjYikKKyAgICAgIHJldHVybiAoaW50KSh1bnNpZ25lZCBjaGFyKSphIC0gKGludCkodW5zaWduZWQgY2hhcikqYjsKKyAgICArK2E7CisgICAgKytiOworICB9CisgIHJldHVybiAqYQorICAgICAgICAgICAgID8gKCpiICYmICpiICE9IHNlbnRpbmVsKQorICAgICAgICAgICAgICAgICAgID8gKGludCkodW5zaWduZWQgY2hhcikqYSAtIChpbnQpKHVuc2lnbmVkIGNoYXIpKmIKKyAgICAgICAgICAgICAgICAgICA6IDEKKyAgICAgICAgICAgICA6ICgqYiAmJiAqYiAhPSBzZW50aW5lbCkgPyAtMSA6IDA7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBUYWJsZSBzdHJ1Y3R1cmVzIGFuZCBoZWxwZXIgZnVuY3Rpb25zLgorCit0eXBlZGVmIHN0cnVjdCBfX2ttcF9zZXR0aW5nIGttcF9zZXR0aW5nX3Q7Cit0eXBlZGVmIHN0cnVjdCBfX2ttcF9zdGdfc3NfZGF0YSBrbXBfc3RnX3NzX2RhdGFfdDsKK3R5cGVkZWYgc3RydWN0IF9fa21wX3N0Z193cF9kYXRhIGttcF9zdGdfd3BfZGF0YV90OwordHlwZWRlZiBzdHJ1Y3QgX19rbXBfc3RnX2ZyX2RhdGEga21wX3N0Z19mcl9kYXRhX3Q7CisKK3R5cGVkZWYgdm9pZCAoKmttcF9zdGdfcGFyc2VfZnVuY190KShjaGFyIGNvbnN0ICpuYW1lLCBjaGFyIGNvbnN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKTsKK3R5cGVkZWYgdm9pZCAoKmttcF9zdGdfcHJpbnRfZnVuY190KShrbXBfc3RyX2J1Zl90ICpidWZmZXIsIGNoYXIgY29uc3QgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSk7CisKK3N0cnVjdCBfX2ttcF9zZXR0aW5nIHsKKyAgY2hhciBjb25zdCAqbmFtZTsgLy8gTmFtZSBvZiBzZXR0aW5nIChlbnZpcm9ubWVudCB2YXJpYWJsZSkuCisgIGttcF9zdGdfcGFyc2VfZnVuY190IHBhcnNlOyAvLyBQYXJzZXIgZnVuY3Rpb24uCisgIGttcF9zdGdfcHJpbnRfZnVuY190IHByaW50OyAvLyBQcmludCBmdW5jdGlvbi4KKyAgdm9pZCAqZGF0YTsgLy8gRGF0YSBwYXNzZWQgdG8gcGFyc2VyIGFuZCBwcmludGVyLgorICBpbnQgc2V0OyAvLyBWYXJpYWJsZSBzZXQgZHVyaW5nIHRoaXMgInNlc3Npb24iCisgIC8vICAgICAoX19rbXBfZW52X2luaXRpYWxpemUoKSBvciBrbXBfc2V0X2RlZmF1bHRzKCkgY2FsbCkuCisgIGludCBkZWZpbmVkOyAvLyBWYXJpYWJsZSBzZXQgaW4gYW55ICJzZXNzaW9uIi4KK307IC8vIHN0cnVjdCBfX2ttcF9zZXR0aW5nCisKK3N0cnVjdCBfX2ttcF9zdGdfc3NfZGF0YSB7CisgIHNpemVfdCBmYWN0b3I7IC8vIERlZmF1bHQgZmFjdG9yOiAxIGZvciBLTVBfU1RBQ0tTSVpFLCAxMDI0IGZvciBvdGhlcnMuCisgIGttcF9zZXR0aW5nX3QgKipyaXZhbHM7IC8vIEFycmF5IG9mIHBvaW50ZXJzIHRvIHJpdmFscyAoaW5jbHVkaW5nIGl0c2VsZikuCit9OyAvLyBzdHJ1Y3QgX19rbXBfc3RnX3NzX2RhdGEKKworc3RydWN0IF9fa21wX3N0Z193cF9kYXRhIHsKKyAgaW50IG9tcDsgLy8gMCAtLSBLTVBfTElCUkFSWSwgMSAtLSBPTVBfV0FJVF9QT0xJQ1kuCisgIGttcF9zZXR0aW5nX3QgKipyaXZhbHM7IC8vIEFycmF5IG9mIHBvaW50ZXJzIHRvIHJpdmFscyAoaW5jbHVkaW5nIGl0c2VsZikuCit9OyAvLyBzdHJ1Y3QgX19rbXBfc3RnX3dwX2RhdGEKKworc3RydWN0IF9fa21wX3N0Z19mcl9kYXRhIHsKKyAgaW50IGZvcmNlOyAvLyAwIC0tIEtNUF9ERVRFUk1JTklTVElDX1JFRFVDVElPTiwgMSAtLSBLTVBfRk9SQ0VfUkVEVUNUSU9OLgorICBrbXBfc2V0dGluZ190ICoqcml2YWxzOyAvLyBBcnJheSBvZiBwb2ludGVycyB0byByaXZhbHMgKGluY2x1ZGluZyBpdHNlbGYpLgorfTsgLy8gc3RydWN0IF9fa21wX3N0Z19mcl9kYXRhCisKK3N0YXRpYyBpbnQgX19rbXBfc3RnX2NoZWNrX3JpdmFscyggLy8gMCAtLSBPaywgMSAtLSBlcnJvcnMgZm91bmQuCisgICAgY2hhciBjb25zdCAqbmFtZSwgLy8gTmFtZSBvZiB2YXJpYWJsZS4KKyAgICBjaGFyIGNvbnN0ICp2YWx1ZSwgLy8gVmFsdWUgb2YgdGhlIHZhcmlhYmxlLgorICAgIGttcF9zZXR0aW5nX3QgKipyaXZhbHMgLy8gTGlzdCBvZiByaXZhbCBzZXR0aW5ncyAobXVzdCBpbmNsdWRlIGN1cnJlbnQgb25lKS4KKyAgICApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGVyIHBhcnNlIGZ1bmN0aW9ucy4KKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3BhcnNlX2Jvb2woY2hhciBjb25zdCAqbmFtZSwgY2hhciBjb25zdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm91dCkgeworICBpZiAoX19rbXBfc3RyX21hdGNoX3RydWUodmFsdWUpKSB7CisgICAgKm91dCA9IFRSVUU7CisgIH0gZWxzZSBpZiAoX19rbXBfc3RyX21hdGNoX2ZhbHNlKHZhbHVlKSkgeworICAgICpvdXQgPSBGQUxTRTsKKyAgfSBlbHNlIHsKKyAgICBfX2ttcF9tc2coa21wX21zX3dhcm5pbmcsIEtNUF9NU0coQmFkQm9vbFZhbHVlLCBuYW1lLCB2YWx1ZSksCisgICAgICAgICAgICAgIEtNUF9ITlQoVmFsaWRCb29sVmFsdWVzKSwgX19rbXBfbXNnX251bGwpOworICB9OyAvLyBpZgorfSAvLyBfX2ttcF9zdGdfcGFyc2VfYm9vbAorCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcGFyc2Vfc2l6ZShjaGFyIGNvbnN0ICpuYW1lLCBjaGFyIGNvbnN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplX21pbiwgc2l6ZV90IHNpemVfbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppc19zcGVjaWZpZWQsIHNpemVfdCAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZhY3RvcikgeworICBjaGFyIGNvbnN0ICptc2cgPSBOVUxMOworI2lmIEtNUF9PU19EQVJXSU4KKyAgc2l6ZV9taW4gPSBfX2ttcF9yb3VuZDRrKHNpemVfbWluKTsKKyAgc2l6ZV9tYXggPSBfX2ttcF9yb3VuZDRrKHNpemVfbWF4KTsKKyNlbmRpZiAvLyBLTVBfT1NfREFSV0lOCisgIGlmICh2YWx1ZSkgeworICAgIGlmIChpc19zcGVjaWZpZWQgIT0gTlVMTCkgeworICAgICAgKmlzX3NwZWNpZmllZCA9IDE7CisgICAgfTsgLy8gaWYKKyAgICBfX2ttcF9zdHJfdG9fc2l6ZSh2YWx1ZSwgb3V0LCBmYWN0b3IsICZtc2cpOworICAgIGlmIChtc2cgPT0gTlVMTCkgeworICAgICAgaWYgKCpvdXQgPiBzaXplX21heCkgeworICAgICAgICAqb3V0ID0gc2l6ZV9tYXg7CisgICAgICAgIG1zZyA9IEtNUF9JMThOX1NUUihWYWx1ZVRvb0xhcmdlKTsKKyAgICAgIH0gZWxzZSBpZiAoKm91dCA8IHNpemVfbWluKSB7CisgICAgICAgICpvdXQgPSBzaXplX21pbjsKKyAgICAgICAgbXNnID0gS01QX0kxOE5fU1RSKFZhbHVlVG9vU21hbGwpOworICAgICAgfSBlbHNlIHsKKyNpZiBLTVBfT1NfREFSV0lOCisgICAgICAgIHNpemVfdCByb3VuZDRrID0gX19rbXBfcm91bmQ0aygqb3V0KTsKKyAgICAgICAgaWYgKCpvdXQgIT0gcm91bmQ0aykgeworICAgICAgICAgICpvdXQgPSByb3VuZDRrOworICAgICAgICAgIG1zZyA9IEtNUF9JMThOX1NUUihOb3RNdWx0aXBsZTRLKTsKKyAgICAgICAgfTsgLy8gaWYKKyNlbmRpZgorICAgICAgfTsgLy8gaWYKKyAgICB9IGVsc2UgeworICAgICAgLy8gSWYgaW50ZWdlciBvdmVyZmxvdyBvY2N1cnJlZCwgKiBvdXQgPT0gS01QX1NJWkVfVF9NQVguIEN1dCBpdCB0bworICAgICAgLy8gc2l6ZV9tYXggc2lsZW50bHkuCisgICAgICBpZiAoKm91dCA8IHNpemVfbWluKSB7CisgICAgICAgICpvdXQgPSBzaXplX21heDsKKyAgICAgIH0gZWxzZSBpZiAoKm91dCA+IHNpemVfbWF4KSB7CisgICAgICAgICpvdXQgPSBzaXplX21heDsKKyAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyAgICBpZiAobXNnICE9IE5VTEwpIHsKKyAgICAgIC8vIE1lc3NhZ2UgaXMgbm90IGVtcHR5LiBQcmludCB3YXJuaW5nLgorICAgICAga21wX3N0cl9idWZfdCBidWY7CisgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoJmJ1Zik7CisgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50X3NpemUoJmJ1ZiwgKm91dCk7CisgICAgICBLTVBfV0FSTklORyhQYXJzZVNpemVJbnRXYXJuLCBuYW1lLCB2YWx1ZSwgbXNnKTsKKyAgICAgIEtNUF9JTkZPUk0oVXNpbmdfc3RyX1ZhbHVlLCBuYW1lLCBidWYuc3RyKTsKKyAgICAgIF9fa21wX3N0cl9idWZfZnJlZSgmYnVmKTsKKyAgICB9OyAvLyBpZgorICB9OyAvLyBpZgorfSAvLyBfX2ttcF9zdGdfcGFyc2Vfc2l6ZQorCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorc3RhdGljIHZvaWQgX19rbXBfc3RnX3BhcnNlX3N0cihjaGFyIGNvbnN0ICpuYW1lLCBjaGFyIGNvbnN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqKm91dCkgeworICBfX2ttcF9zdHJfZnJlZShvdXQpOworICAqb3V0ID0gX19rbXBfc3RyX2Zvcm1hdCgiJXMiLCB2YWx1ZSk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9zdHIKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcGFyc2VfaW50KAorICAgIGNoYXIgY29uc3QKKyAgICAgICAgKm5hbWUsIC8vIEk6IE5hbWUgb2YgZW52aXJvbm1lbnQgdmFyaWFibGUgKHVzZWQgaW4gd2FybmluZyBtZXNzYWdlcykuCisgICAgY2hhciBjb25zdCAqdmFsdWUsIC8vIEk6IFZhbHVlIG9mIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHBhcnNlLgorICAgIGludCBtaW4sIC8vIEk6IE1pbWluYWwgYWxsb3dlZCB2YWx1ZS4KKyAgICBpbnQgbWF4LCAvLyBJOiBNYXhpbXVtIGFsbG93ZWQgdmFsdWUuCisgICAgaW50ICpvdXQgLy8gTzogT3V0cHV0IChwYXJzZWQpIHZhbHVlLgorICAgICkgeworICBjaGFyIGNvbnN0ICptc2cgPSBOVUxMOworICBrbXBfdWludDY0IHVpbnQgPSAqb3V0OworICBfX2ttcF9zdHJfdG9fdWludCh2YWx1ZSwgJnVpbnQsICZtc2cpOworICBpZiAobXNnID09IE5VTEwpIHsKKyAgICBpZiAodWludCA8ICh1bnNpZ25lZCBpbnQpbWluKSB7CisgICAgICBtc2cgPSBLTVBfSTE4Tl9TVFIoVmFsdWVUb29TbWFsbCk7CisgICAgICB1aW50ID0gbWluOworICAgIH0gZWxzZSBpZiAodWludCA+ICh1bnNpZ25lZCBpbnQpbWF4KSB7CisgICAgICBtc2cgPSBLTVBfSTE4Tl9TVFIoVmFsdWVUb29MYXJnZSk7CisgICAgICB1aW50ID0gbWF4OworICAgIH07IC8vIGlmCisgIH0gZWxzZSB7CisgICAgLy8gSWYgb3ZlcmZsb3cgb2NjdXJyZWQgbXNnIGNvbnRhaW5zIGVycm9yIG1lc3NhZ2UgYW5kIHVpbnQgaXMgdmVyeSBiaWcuIEN1dAorICAgIC8vIHRtcCBpdCB0byBJTlRfTUFYLgorICAgIGlmICh1aW50IDwgKHVuc2lnbmVkIGludCltaW4pIHsKKyAgICAgIHVpbnQgPSBtaW47CisgICAgfSBlbHNlIGlmICh1aW50ID4gKHVuc2lnbmVkIGludCltYXgpIHsKKyAgICAgIHVpbnQgPSBtYXg7CisgICAgfTsgLy8gaWYKKyAgfTsgLy8gaWYKKyAgaWYgKG1zZyAhPSBOVUxMKSB7CisgICAgLy8gTWVzc2FnZSBpcyBub3QgZW1wdHkuIFByaW50IHdhcm5pbmcuCisgICAga21wX3N0cl9idWZfdCBidWY7CisgICAgS01QX1dBUk5JTkcoUGFyc2VTaXplSW50V2FybiwgbmFtZSwgdmFsdWUsIG1zZyk7CisgICAgX19rbXBfc3RyX2J1Zl9pbml0KCZidWYpOworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIiUiIEtNUF9VSU5UNjRfU1BFQyAiIiwgdWludCk7CisgICAgS01QX0lORk9STShVc2luZ191aW50NjRfVmFsdWUsIG5hbWUsIGJ1Zi5zdHIpOworICAgIF9fa21wX3N0cl9idWZfZnJlZSgmYnVmKTsKKyAgfTsgLy8gaWYKKyAgKm91dCA9IHVpbnQ7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9pbnQKKworI2lmIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUworc3RhdGljIHZvaWQgX19rbXBfc3RnX3BhcnNlX2ZpbGUoY2hhciBjb25zdCAqbmFtZSwgY2hhciBjb25zdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzdWZmaXgsIGNoYXIgKipvdXQpIHsKKyAgY2hhciBidWZmZXJbMjU2XTsKKyAgY2hhciAqdDsKKyAgaW50IGhhc1N1ZmZpeDsKKyAgX19rbXBfc3RyX2ZyZWUob3V0KTsKKyAgdCA9IChjaGFyICopc3RycmNocih2YWx1ZSwgJy4nKTsKKyAgaGFzU3VmZml4ID0gdCAmJiBfX2ttcF9zdHJfZXFmKHQsIHN1ZmZpeCk7CisgIHQgPSBfX2ttcF9zdHJfZm9ybWF0KCIlcyVzIiwgdmFsdWUsIGhhc1N1ZmZpeCA/ICIiIDogc3VmZml4KTsKKyAgX19rbXBfZXhwYW5kX2ZpbGVfbmFtZShidWZmZXIsIHNpemVvZihidWZmZXIpLCB0KTsKKyAgX19rbXBfc3RyX2ZyZWUoJnQpOworICAqb3V0ID0gX19rbXBfc3RyX2Zvcm1hdCgiJXMiLCBidWZmZXIpOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfZmlsZQorI2VuZGlmCisKKyNpZmRlZiBLTVBfREVCVUcKK3N0YXRpYyBjaGFyICpwYXJfcmFuZ2VfdG9fcHJpbnQgPSBOVUxMOworCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcGFyc2VfcGFyX3JhbmdlKGNoYXIgY29uc3QgKm5hbWUsIGNoYXIgY29uc3QgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm91dF9yYW5nZSwgY2hhciAqb3V0X3JvdXRpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKm91dF9maWxlLCBpbnQgKm91dF9sYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpvdXRfdWIpIHsKKyAgc2l6ZV90IGxlbiA9IEtNUF9TVFJMRU4odmFsdWUgKyAxKTsKKyAgcGFyX3JhbmdlX3RvX3ByaW50ID0gKGNoYXIgKilLTVBfSU5URVJOQUxfTUFMTE9DKGxlbiArIDEpOworICBLTVBfU1RSTkNQWV9TKHBhcl9yYW5nZV90b19wcmludCwgbGVuICsgMSwgdmFsdWUsIGxlbiArIDEpOworICBfX2ttcF9wYXJfcmFuZ2UgPSArMTsKKyAgX19rbXBfcGFyX3JhbmdlX2xiID0gMDsKKyAgX19rbXBfcGFyX3JhbmdlX3ViID0gSU5UX01BWDsKKyAgZm9yICg7OykgeworICAgIHVuc2lnbmVkIGludCBsZW47CisgICAgaWYgKCh2YWx1ZSA9PSBOVUxMKSB8fCAoKnZhbHVlID09ICdcMCcpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoInJvdXRpbmUiLCB2YWx1ZSwgJz0nKSkgeworICAgICAgdmFsdWUgPSBzdHJjaHIodmFsdWUsICc9JykgKyAxOworICAgICAgbGVuID0gX19rbXBfcmVhZHN0cl93aXRoX3NlbnRpbmVsKG91dF9yb3V0aW5lLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfUEFSX1JBTkdFX1JPVVRJTkVfTEVOIC0gMSwgJywnKTsKKyAgICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgICBnb3RvIHBhcl9yYW5nZV9lcnJvcjsKKyAgICAgIH0KKyAgICAgIHZhbHVlID0gc3RyY2hyKHZhbHVlLCAnLCcpOworICAgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgdmFsdWUrKzsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCgiZmlsZW5hbWUiLCB2YWx1ZSwgJz0nKSkgeworICAgICAgdmFsdWUgPSBzdHJjaHIodmFsdWUsICc9JykgKyAxOworICAgICAgbGVuID0gX19rbXBfcmVhZHN0cl93aXRoX3NlbnRpbmVsKG91dF9maWxlLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfUEFSX1JBTkdFX0ZJTEVOQU1FX0xFTiAtIDEsICcsJyk7CisgICAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgZ290byBwYXJfcmFuZ2VfZXJyb3I7CisgICAgICB9CisgICAgICB2YWx1ZSA9IHN0cmNocih2YWx1ZSwgJywnKTsKKyAgICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgIHZhbHVlKys7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKCghX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCJyYW5nZSIsIHZhbHVlLCAnPScpKSB8fAorICAgICAgICAoIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCgiaW5jbF9yYW5nZSIsIHZhbHVlLCAnPScpKSkgeworICAgICAgdmFsdWUgPSBzdHJjaHIodmFsdWUsICc9JykgKyAxOworICAgICAgaWYgKEtNUF9TU0NBTkYodmFsdWUsICIlZDolZCIsIG91dF9sYiwgb3V0X3ViKSAhPSAyKSB7CisgICAgICAgIGdvdG8gcGFyX3JhbmdlX2Vycm9yOworICAgICAgfQorICAgICAgKm91dF9yYW5nZSA9ICsxOworICAgICAgdmFsdWUgPSBzdHJjaHIodmFsdWUsICcsJyk7CisgICAgICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgICAgICB2YWx1ZSsrOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmICghX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCJleGNsX3JhbmdlIiwgdmFsdWUsICc9JykpIHsKKyAgICAgIHZhbHVlID0gc3RyY2hyKHZhbHVlLCAnPScpICsgMTsKKyAgICAgIGlmIChLTVBfU1NDQU5GKHZhbHVlLCAiJWQ6JWQiLCBvdXRfbGIsIG91dF91YikgIT0gMikgeworICAgICAgICBnb3RvIHBhcl9yYW5nZV9lcnJvcjsKKyAgICAgIH0KKyAgICAgICpvdXRfcmFuZ2UgPSAtMTsKKyAgICAgIHZhbHVlID0gc3RyY2hyKHZhbHVlLCAnLCcpOworICAgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgdmFsdWUrKzsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgcGFyX3JhbmdlX2Vycm9yOgorICAgIEtNUF9XQVJOSU5HKFBhclJhbmdlU3ludGF4LCBuYW1lKTsKKyAgICBfX2ttcF9wYXJfcmFuZ2UgPSAwOworICAgIGJyZWFrOworICB9Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9wYXJfcmFuZ2UKKyNlbmRpZgorCitpbnQgX19rbXBfaW5pdGlhbF90aHJlYWRzX2NhcGFjaXR5KGludCByZXFfbnByb2MpIHsKKyAgaW50IG50aCA9IDMyOworCisgIC8qIE1JTiggTUFYKCAzMiwgNCAqICRPTVBfTlVNX1RIUkVBRFMsIDQgKiBvbXBfZ2V0X251bV9wcm9jcygpICksCisgICAqIF9fa21wX21heF9udGgpICovCisgIGlmIChudGggPCAoNCAqIHJlcV9ucHJvYykpCisgICAgbnRoID0gKDQgKiByZXFfbnByb2MpOworICBpZiAobnRoIDwgKDQgKiBfX2ttcF94cHJvYykpCisgICAgbnRoID0gKDQgKiBfX2ttcF94cHJvYyk7CisKKyAgaWYgKG50aCA+IF9fa21wX21heF9udGgpCisgICAgbnRoID0gX19rbXBfbWF4X250aDsKKworICByZXR1cm4gbnRoOworfQorCitpbnQgX19rbXBfZGVmYXVsdF90cF9jYXBhY2l0eShpbnQgcmVxX25wcm9jLCBpbnQgbWF4X250aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxfdGhyZWFkc19zcGVjaWZpZWQpIHsKKyAgaW50IG50aCA9IDEyODsKKworICBpZiAoYWxsX3RocmVhZHNfc3BlY2lmaWVkKQorICAgIHJldHVybiBtYXhfbnRoOworICAvKiBNSU4oIE1BWCAoMTI4LCA0ICogJE9NUF9OVU1fVEhSRUFEUywgNCAqIG9tcF9nZXRfbnVtX3Byb2NzKCkgKSwKKyAgICogX19rbXBfbWF4X250aCApICovCisgIGlmIChudGggPCAoNCAqIHJlcV9ucHJvYykpCisgICAgbnRoID0gKDQgKiByZXFfbnByb2MpOworICBpZiAobnRoIDwgKDQgKiBfX2ttcF94cHJvYykpCisgICAgbnRoID0gKDQgKiBfX2ttcF94cHJvYyk7CisKKyAgaWYgKG50aCA+IF9fa21wX21heF9udGgpCisgICAgbnRoID0gX19rbXBfbWF4X250aDsKKworICByZXR1cm4gbnRoOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGVyIHByaW50IGZ1bmN0aW9ucy4KKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3ByaW50X2Jvb2woa21wX3N0cl9idWZfdCAqYnVmZmVyLCBjaGFyIGNvbnN0ICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlKSB7CisgIGlmIChfX2ttcF9lbnZfZm9ybWF0KSB7CisgICAgS01QX1NUUl9CVUZfUFJJTlRfQk9PTDsKKyAgfSBlbHNlIHsKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIiAgICVzPSVzXG4iLCBuYW1lLCB2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9ib29sCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wcmludF9pbnQoa21wX3N0cl9idWZfdCAqYnVmZmVyLCBjaGFyIGNvbnN0ICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUpIHsKKyAgaWYgKF9fa21wX2Vudl9mb3JtYXQpIHsKKyAgICBLTVBfU1RSX0JVRl9QUklOVF9JTlQ7CisgIH0gZWxzZSB7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIgICAlcz0lZFxuIiwgbmFtZSwgdmFsdWUpOworICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9pbnQKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3ByaW50X3VpbnQ2NChrbXBfc3RyX2J1Zl90ICpidWZmZXIsIGNoYXIgY29uc3QgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgdmFsdWUpIHsKKyAgaWYgKF9fa21wX2Vudl9mb3JtYXQpIHsKKyAgICBLTVBfU1RSX0JVRl9QUklOVF9VSU5UNjQ7CisgIH0gZWxzZSB7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIgICAlcz0lIiBLTVBfVUlOVDY0X1NQRUMgIlxuIiwgbmFtZSwgdmFsdWUpOworICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF91aW50NjQKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3ByaW50X3N0cihrbXBfc3RyX2J1Zl90ICpidWZmZXIsIGNoYXIgY29uc3QgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKnZhbHVlKSB7CisgIGlmIChfX2ttcF9lbnZfZm9ybWF0KSB7CisgICAgS01QX1NUUl9CVUZfUFJJTlRfU1RSOworICB9IGVsc2UgeworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiICAgJXM9JXNcbiIsIG5hbWUsIHZhbHVlKTsKKyAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfc3RyCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wcmludF9zaXplKGttcF9zdHJfYnVmX3QgKmJ1ZmZlciwgY2hhciBjb25zdCAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YWx1ZSkgeworICBpZiAoX19rbXBfZW52X2Zvcm1hdCkgeworICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgobmFtZSk7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludF9zaXplKGJ1ZmZlciwgdmFsdWUpOworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiJ1xuIik7CisgIH0gZWxzZSB7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIgICAlcz0iLCBuYW1lKTsKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50X3NpemUoYnVmZmVyLCB2YWx1ZSk7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICJcbiIpOworICAgIHJldHVybjsKKyAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfc2l6ZQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUGFyc2UgYW5kIHByaW50IGZ1bmN0aW9ucy4KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9BTExfVEhSRUFEUywgS01QX01BWF9USFJFQURTLCBPTVBfVEhSRUFEX0xJTUlUCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wYXJzZV9hbGxfdGhyZWFkcyhjaGFyIGNvbnN0ICpuYW1lLCBjaGFyIGNvbnN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKSB7CisKKyAga21wX3NldHRpbmdfdCAqKnJpdmFscyA9IChrbXBfc2V0dGluZ190ICoqKWRhdGE7CisgIGludCByYzsKKyAgcmMgPSBfX2ttcF9zdGdfY2hlY2tfcml2YWxzKG5hbWUsIHZhbHVlLCByaXZhbHMpOworICBpZiAocmMpIHsKKyAgICByZXR1cm47CisgIH07IC8vIGlmCisgIGlmICghX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCJhbGwiLCB2YWx1ZSwgMCkpIHsKKyAgICBfX2ttcF9tYXhfbnRoID0gX19rbXBfeHByb2M7CisgICAgX19rbXBfYWxsVGhyZWFkc1NwZWNpZmllZCA9IDE7CisgIH0gZWxzZSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludChuYW1lLCB2YWx1ZSwgMSwgX19rbXBfc3lzX21heF9udGgsICZfX2ttcF9tYXhfbnRoKTsKKyAgICBfX2ttcF9hbGxUaHJlYWRzU3BlY2lmaWVkID0gMDsKKyAgfQorICBLX0RJQUcoMSwgKCJfX2ttcF9tYXhfbnRoID09ICVkXG4iLCBfX2ttcF9tYXhfbnRoKSk7CisKK30gLy8gX19rbXBfc3RnX3BhcnNlX2FsbF90aHJlYWRzCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wcmludF9hbGxfdGhyZWFkcyhrbXBfc3RyX2J1Zl90ICpidWZmZXIsIGNoYXIgY29uc3QgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICBfX2ttcF9zdGdfcHJpbnRfaW50KGJ1ZmZlciwgbmFtZSwgX19rbXBfbWF4X250aCk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9hbGxfdGhyZWFkcworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0JMT0NLVElNRQorCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcGFyc2VfYmxvY2t0aW1lKGNoYXIgY29uc3QgKm5hbWUsIGNoYXIgY29uc3QgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKSB7CisgIF9fa21wX2RmbHRfYmxvY2t0aW1lID0gX19rbXBfY29udmVydF90b19taWxsaXNlY29uZHModmFsdWUpOworICBpZiAoX19rbXBfZGZsdF9ibG9ja3RpbWUgPCAwKSB7CisgICAgX19rbXBfZGZsdF9ibG9ja3RpbWUgPSBLTVBfREVGQVVMVF9CTE9DS1RJTUU7CisgICAgX19rbXBfbXNnKGttcF9tc193YXJuaW5nLCBLTVBfTVNHKEludmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWUpLAorICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCk7CisgICAgS01QX0lORk9STShVc2luZ19pbnRfVmFsdWUsIG5hbWUsIF9fa21wX2RmbHRfYmxvY2t0aW1lKTsKKyAgICBfX2ttcF9lbnZfYmxvY2t0aW1lID0gRkFMU0U7IC8vIFJldmVydCB0byBkZWZhdWx0IGFzIGlmIHZhciBub3Qgc2V0LgorICB9IGVsc2UgeworICAgIGlmIChfX2ttcF9kZmx0X2Jsb2NrdGltZSA8IEtNUF9NSU5fQkxPQ0tUSU1FKSB7CisgICAgICBfX2ttcF9kZmx0X2Jsb2NrdGltZSA9IEtNUF9NSU5fQkxPQ0tUSU1FOworICAgICAgX19rbXBfbXNnKGttcF9tc193YXJuaW5nLCBLTVBfTVNHKFNtYWxsVmFsdWUsIG5hbWUsIHZhbHVlKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCk7CisgICAgICBLTVBfSU5GT1JNKE1pblZhbHVlVXNpbmcsIG5hbWUsIF9fa21wX2RmbHRfYmxvY2t0aW1lKTsKKyAgICB9IGVsc2UgaWYgKF9fa21wX2RmbHRfYmxvY2t0aW1lID4gS01QX01BWF9CTE9DS1RJTUUpIHsKKyAgICAgIF9fa21wX2RmbHRfYmxvY2t0aW1lID0gS01QX01BWF9CTE9DS1RJTUU7CisgICAgICBfX2ttcF9tc2coa21wX21zX3dhcm5pbmcsIEtNUF9NU0coTGFyZ2VWYWx1ZSwgbmFtZSwgdmFsdWUpLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsKTsKKyAgICAgIEtNUF9JTkZPUk0oTWF4VmFsdWVVc2luZywgbmFtZSwgX19rbXBfZGZsdF9ibG9ja3RpbWUpOworICAgIH07IC8vIGlmCisgICAgX19rbXBfZW52X2Jsb2NrdGltZSA9IFRSVUU7IC8vIEtNUF9CTE9DS1RJTUUgd2FzIHNwZWNpZmllZC4KKyAgfTsgLy8gaWYKKyNpZiBLTVBfVVNFX01PTklUT1IKKyAgLy8gY2FsY3VsYXRlIG51bWJlciBvZiBtb25pdG9yIHRocmVhZCB3YWtldXAgaW50ZXJ2YWxzIGNvcnJlc3BvbmRpbmcgdG8KKyAgLy8gYmxvY2t0aW1lLgorICBfX2ttcF9tb25pdG9yX3dha2V1cHMgPQorICAgICAgS01QX1dBS0VVUFNfRlJPTV9CTE9DS1RJTUUoX19rbXBfZGZsdF9ibG9ja3RpbWUsIF9fa21wX21vbml0b3Jfd2FrZXVwcyk7CisgIF9fa21wX2J0X2ludGVydmFscyA9CisgICAgICBLTVBfSU5URVJWQUxTX0ZST01fQkxPQ0tUSU1FKF9fa21wX2RmbHRfYmxvY2t0aW1lLCBfX2ttcF9tb25pdG9yX3dha2V1cHMpOworI2VuZGlmCisgIEtfRElBRygxLCAoIl9fa21wX2Vudl9ibG9ja3RpbWUgPT0gJWRcbiIsIF9fa21wX2Vudl9ibG9ja3RpbWUpKTsKKyAgaWYgKF9fa21wX2Vudl9ibG9ja3RpbWUpIHsKKyAgICBLX0RJQUcoMSwgKCJfX2ttcF9kZmx0X2Jsb2NrdGltZSA9PSAlZFxuIiwgX19rbXBfZGZsdF9ibG9ja3RpbWUpKTsKKyAgfQorfSAvLyBfX2ttcF9zdGdfcGFyc2VfYmxvY2t0aW1lCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wcmludF9ibG9ja3RpbWUoa21wX3N0cl9idWZfdCAqYnVmZmVyLCBjaGFyIGNvbnN0ICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKSB7CisgIF9fa21wX3N0Z19wcmludF9pbnQoYnVmZmVyLCBuYW1lLCBfX2ttcF9kZmx0X2Jsb2NrdGltZSk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9ibG9ja3RpbWUKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9EVVBMSUNBVEVfTElCX09LCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wYXJzZV9kdXBsaWNhdGVfbGliX29rKGNoYXIgY29uc3QgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0ICp2YWx1ZSwgdm9pZCAqZGF0YSkgeworICAvKiBhY3R1YWxseSB0aGlzIHZhcmlhYmxlIGlzIG5vdCBzdXBwb3J0ZWQsIHB1dCBoZXJlIGZvciBjb21wYXRpYmlsaXR5IHdpdGgKKyAgICAgZWFybGllciBidWlsZHMgYW5kIGZvciBzdGF0aWMvZHluYW1pYyBjb21iaW5hdGlvbiAqLworICBfX2ttcF9zdGdfcGFyc2VfYm9vbChuYW1lLCB2YWx1ZSwgJl9fa21wX2R1cGxpY2F0ZV9saWJyYXJ5X29rKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2R1cGxpY2F0ZV9saWJfb2sKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3ByaW50X2R1cGxpY2F0ZV9saWJfb2soa21wX3N0cl9idWZfdCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqbmFtZSwgdm9pZCAqZGF0YSkgeworICBfX2ttcF9zdGdfcHJpbnRfYm9vbChidWZmZXIsIG5hbWUsIF9fa21wX2R1cGxpY2F0ZV9saWJyYXJ5X29rKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2R1cGxpY2F0ZV9saWJfb2sKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9JTkhFUklUX0ZQX0NPTlRST0wKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3BhcnNlX2luaGVyaXRfZnBfY29udHJvbChjaGFyIGNvbnN0ICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0ICp2YWx1ZSwgdm9pZCAqZGF0YSkgeworICBfX2ttcF9zdGdfcGFyc2VfYm9vbChuYW1lLCB2YWx1ZSwgJl9fa21wX2luaGVyaXRfZnBfY29udHJvbCk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9pbmhlcml0X2ZwX2NvbnRyb2wKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3ByaW50X2luaGVyaXRfZnBfY29udHJvbChrbXBfc3RyX2J1Zl90ICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKm5hbWUsIHZvaWQgKmRhdGEpIHsKKyNpZiBLTVBfREVCVUcKKyAgX19rbXBfc3RnX3ByaW50X2Jvb2woYnVmZmVyLCBuYW1lLCBfX2ttcF9pbmhlcml0X2ZwX2NvbnRyb2wpOworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworfSAvLyBfX2ttcF9zdGdfcHJpbnRfaW5oZXJpdF9mcF9jb250cm9sCisKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfTElCUkFSWSwgT01QX1dBSVRfUE9MSUNZCisKK3N0YXRpYyBjaGFyIGNvbnN0ICpibG9ja3RpbWVfc3RyID0gTlVMTDsKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3BhcnNlX3dhaXRfcG9saWN5KGNoYXIgY29uc3QgKm5hbWUsIGNoYXIgY29uc3QgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpIHsKKworICBrbXBfc3RnX3dwX2RhdGFfdCAqd2FpdCA9IChrbXBfc3RnX3dwX2RhdGFfdCAqKWRhdGE7CisgIGludCByYzsKKworICByYyA9IF9fa21wX3N0Z19jaGVja19yaXZhbHMobmFtZSwgdmFsdWUsIHdhaXQtPnJpdmFscyk7CisgIGlmIChyYykgeworICAgIHJldHVybjsKKyAgfTsgLy8gaWYKKworICBpZiAod2FpdC0+b21wKSB7CisgICAgaWYgKF9fa21wX3N0cl9tYXRjaCgiQUNUSVZFIiwgMSwgdmFsdWUpKSB7CisgICAgICBfX2ttcF9saWJyYXJ5ID0gbGlicmFyeV90dXJuYXJvdW5kOworICAgICAgaWYgKGJsb2NrdGltZV9zdHIgPT0gTlVMTCkgeworICAgICAgICAvLyBLTVBfQkxPQ0tUSU1FIG5vdCBzcGVjaWZpZWQsIHNvIHNldCBkZWZhdWx0IHRvICJpbmZpbml0ZSIuCisgICAgICAgIF9fa21wX2RmbHRfYmxvY2t0aW1lID0gS01QX01BWF9CTE9DS1RJTUU7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChfX2ttcF9zdHJfbWF0Y2goIlBBU1NJVkUiLCAxLCB2YWx1ZSkpIHsKKyAgICAgIF9fa21wX2xpYnJhcnkgPSBsaWJyYXJ5X3Rocm91Z2hwdXQ7CisgICAgICBpZiAoYmxvY2t0aW1lX3N0ciA9PSBOVUxMKSB7CisgICAgICAgIC8vIEtNUF9CTE9DS1RJTUUgbm90IHNwZWNpZmllZCwgc28gc2V0IGRlZmF1bHQgdG8gMC4KKyAgICAgICAgX19rbXBfZGZsdF9ibG9ja3RpbWUgPSAwOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBLTVBfV0FSTklORyhTdGdJbnZhbGlkVmFsdWUsIG5hbWUsIHZhbHVlKTsKKyAgICB9OyAvLyBpZgorICB9IGVsc2UgeworICAgIGlmIChfX2ttcF9zdHJfbWF0Y2goInNlcmlhbCIsIDEsIHZhbHVlKSkgeyAvKiBTICovCisgICAgICBfX2ttcF9saWJyYXJ5ID0gbGlicmFyeV9zZXJpYWw7CisgICAgfSBlbHNlIGlmIChfX2ttcF9zdHJfbWF0Y2goInRocm91Z2hwdXQiLCAyLCB2YWx1ZSkpIHsgLyogVEggKi8KKyAgICAgIF9fa21wX2xpYnJhcnkgPSBsaWJyYXJ5X3Rocm91Z2hwdXQ7CisgICAgfSBlbHNlIGlmIChfX2ttcF9zdHJfbWF0Y2goInR1cm5hcm91bmQiLCAyLCB2YWx1ZSkpIHsgLyogVFUgKi8KKyAgICAgIF9fa21wX2xpYnJhcnkgPSBsaWJyYXJ5X3R1cm5hcm91bmQ7CisgICAgfSBlbHNlIGlmIChfX2ttcF9zdHJfbWF0Y2goImRlZGljYXRlZCIsIDEsIHZhbHVlKSkgeyAvKiBEICovCisgICAgICBfX2ttcF9saWJyYXJ5ID0gbGlicmFyeV90dXJuYXJvdW5kOworICAgIH0gZWxzZSBpZiAoX19rbXBfc3RyX21hdGNoKCJtdWx0aXVzZXIiLCAxLCB2YWx1ZSkpIHsgLyogTSAqLworICAgICAgX19rbXBfbGlicmFyeSA9IGxpYnJhcnlfdGhyb3VnaHB1dDsKKyAgICB9IGVsc2UgeworICAgICAgS01QX1dBUk5JTkcoU3RnSW52YWxpZFZhbHVlLCBuYW1lLCB2YWx1ZSk7CisgICAgfTsgLy8gaWYKKyAgfTsgLy8gaWYKKyAgX19rbXBfYXV4X3NldF9saWJyYXJ5KF9fa21wX2xpYnJhcnkpOworCit9IC8vIF9fa21wX3N0Z19wYXJzZV93YWl0X3BvbGljeQorCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcHJpbnRfd2FpdF9wb2xpY3koa21wX3N0cl9idWZfdCAqYnVmZmVyLCBjaGFyIGNvbnN0ICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpIHsKKworICBrbXBfc3RnX3dwX2RhdGFfdCAqd2FpdCA9IChrbXBfc3RnX3dwX2RhdGFfdCAqKWRhdGE7CisgIGNoYXIgY29uc3QgKnZhbHVlID0gTlVMTDsKKworICBpZiAod2FpdC0+b21wKSB7CisgICAgc3dpdGNoIChfX2ttcF9saWJyYXJ5KSB7CisgICAgY2FzZSBsaWJyYXJ5X3R1cm5hcm91bmQ6IHsKKyAgICAgIHZhbHVlID0gIkFDVElWRSI7CisgICAgfSBicmVhazsKKyAgICBjYXNlIGxpYnJhcnlfdGhyb3VnaHB1dDogeworICAgICAgdmFsdWUgPSAiUEFTU0lWRSI7CisgICAgfSBicmVhazsKKyAgICB9OyAvLyBzd2l0Y2gKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKF9fa21wX2xpYnJhcnkpIHsKKyAgICBjYXNlIGxpYnJhcnlfc2VyaWFsOiB7CisgICAgICB2YWx1ZSA9ICJzZXJpYWwiOworICAgIH0gYnJlYWs7CisgICAgY2FzZSBsaWJyYXJ5X3R1cm5hcm91bmQ6IHsKKyAgICAgIHZhbHVlID0gInR1cm5hcm91bmQiOworICAgIH0gYnJlYWs7CisgICAgY2FzZSBsaWJyYXJ5X3Rocm91Z2hwdXQ6IHsKKyAgICAgIHZhbHVlID0gInRocm91Z2hwdXQiOworICAgIH0gYnJlYWs7CisgICAgfTsgLy8gc3dpdGNoCisgIH07IC8vIGlmCisgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CisgICAgX19rbXBfc3RnX3ByaW50X3N0cihidWZmZXIsIG5hbWUsIHZhbHVlKTsKKyAgfTsgLy8gaWYKKworfSAvLyBfX2ttcF9zdGdfcHJpbnRfd2FpdF9wb2xpY3kKKworI2lmIEtNUF9VU0VfTU9OSVRPUgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9NT05JVE9SX1NUQUNLU0laRQorCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcGFyc2VfbW9uaXRvcl9zdGFja3NpemUoY2hhciBjb25zdCAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0ICp2YWx1ZSwgdm9pZCAqZGF0YSkgeworICBfX2ttcF9zdGdfcGFyc2Vfc2l6ZShuYW1lLCB2YWx1ZSwgX19rbXBfc3lzX21pbl9zdGtzaXplLCBLTVBfTUFYX1NUS1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZfX2ttcF9tb25pdG9yX3N0a3NpemUsIDEpOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfbW9uaXRvcl9zdGFja3NpemUKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3ByaW50X21vbml0b3Jfc3RhY2tzaXplKGttcF9zdHJfYnVmX3QgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0ICpuYW1lLCB2b2lkICpkYXRhKSB7CisgIGlmIChfX2ttcF9lbnZfZm9ybWF0KSB7CisgICAgaWYgKF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA+IDApCisgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKG5hbWUpOworICAgIGVsc2UKKyAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUU7CisgIH0gZWxzZSB7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIgICAlcyIsIG5hbWUpOworICB9CisgIGlmIChfX2ttcF9tb25pdG9yX3N0a3NpemUgPiAwKSB7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludF9zaXplKGJ1ZmZlciwgX19rbXBfbW9uaXRvcl9zdGtzaXplKTsKKyAgfSBlbHNlIHsKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIjogJXNcbiIsIEtNUF9JMThOX1NUUihOb3REZWZpbmVkKSk7CisgIH0KKyAgaWYgKF9fa21wX2Vudl9mb3JtYXQgJiYgX19rbXBfbW9uaXRvcl9zdGtzaXplKSB7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICInXG4iKTsKKyAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfbW9uaXRvcl9zdGFja3NpemUKKyNlbmRpZiAvLyBLTVBfVVNFX01PTklUT1IKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9TRVRUSU5HUworCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcGFyc2Vfc2V0dGluZ3MoY2hhciBjb25zdCAqbmFtZSwgY2hhciBjb25zdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICBfX2ttcF9zdGdfcGFyc2VfYm9vbChuYW1lLCB2YWx1ZSwgJl9fa21wX3NldHRpbmdzKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3NldHRpbmdzCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wcmludF9zZXR0aW5ncyhrbXBfc3RyX2J1Zl90ICpidWZmZXIsIGNoYXIgY29uc3QgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICBfX2ttcF9zdGdfcHJpbnRfYm9vbChidWZmZXIsIG5hbWUsIF9fa21wX3NldHRpbmdzKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X3NldHRpbmdzCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfU1RBQ0tQQUQKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3BhcnNlX3N0YWNrcGFkKGNoYXIgY29uc3QgKm5hbWUsIGNoYXIgY29uc3QgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpIHsKKyAgX19rbXBfc3RnX3BhcnNlX2ludChuYW1lLCAvLyBFbnYgdmFyIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgLy8gRW52IHZhciB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgIEtNUF9NSU5fU1RLUEFERElORywgLy8gTWluIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgS01QX01BWF9TVEtQQURESU5HLCAvLyBNYXggdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAmX19rbXBfc3RrcGFkZGluZyAvLyBWYXIgdG8gaW5pdGlhbGl6ZQorICAgICAgICAgICAgICAgICAgICAgICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9zdGFja3BhZAorCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcHJpbnRfc3RhY2twYWQoa21wX3N0cl9idWZfdCAqYnVmZmVyLCBjaGFyIGNvbnN0ICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpIHsKKyAgX19rbXBfc3RnX3ByaW50X2ludChidWZmZXIsIG5hbWUsIF9fa21wX3N0a3BhZGRpbmcpOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfc3RhY2twYWQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9TVEFDS09GRlNFVAorCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcGFyc2Vfc3RhY2tvZmZzZXQoY2hhciBjb25zdCAqbmFtZSwgY2hhciBjb25zdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICBfX2ttcF9zdGdfcGFyc2Vfc2l6ZShuYW1lLCAvLyBFbnYgdmFyIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIC8vIEVudiB2YXIgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgS01QX01JTl9TVEtPRkZTRVQsIC8vIE1pbiB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICBLTVBfTUFYX1NUS09GRlNFVCwgLy8gTWF4IHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIC8vCisgICAgICAgICAgICAgICAgICAgICAgICZfX2ttcF9zdGtvZmZzZXQsIC8vIFZhciB0byBpbml0aWFsaXplCisgICAgICAgICAgICAgICAgICAgICAgIDEpOworfSAvLyBfX2ttcF9zdGdfcGFyc2Vfc3RhY2tvZmZzZXQKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3ByaW50X3N0YWNrb2Zmc2V0KGttcF9zdHJfYnVmX3QgKmJ1ZmZlciwgY2hhciBjb25zdCAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKSB7CisgIF9fa21wX3N0Z19wcmludF9zaXplKGJ1ZmZlciwgbmFtZSwgX19rbXBfc3Rrb2Zmc2V0KTsKK30gLy8gX19rbXBfc3RnX3ByaW50X3N0YWNrb2Zmc2V0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfU1RBQ0tTSVpFLCBPTVBfU1RBQ0tTSVpFLCBHT01QX1NUQUNLU0laRQorCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcGFyc2Vfc3RhY2tzaXplKGNoYXIgY29uc3QgKm5hbWUsIGNoYXIgY29uc3QgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKSB7CisKKyAga21wX3N0Z19zc19kYXRhX3QgKnN0YWNrc2l6ZSA9IChrbXBfc3RnX3NzX2RhdGFfdCAqKWRhdGE7CisgIGludCByYzsKKworICByYyA9IF9fa21wX3N0Z19jaGVja19yaXZhbHMobmFtZSwgdmFsdWUsIHN0YWNrc2l6ZS0+cml2YWxzKTsKKyAgaWYgKHJjKSB7CisgICAgcmV0dXJuOworICB9OyAvLyBpZgorICBfX2ttcF9zdGdfcGFyc2Vfc2l6ZShuYW1lLCAvLyBFbnYgdmFyIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIC8vIEVudiB2YXIgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3lzX21pbl9zdGtzaXplLCAvLyBNaW4gdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgS01QX01BWF9TVEtTSVpFLCAvLyBNYXggdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgJl9fa21wX2Vudl9zdGtzaXplLCAvLworICAgICAgICAgICAgICAgICAgICAgICAmX19rbXBfc3Rrc2l6ZSwgLy8gVmFyIHRvIGluaXRpYWxpemUKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tzaXplLT5mYWN0b3IpOworCit9IC8vIF9fa21wX3N0Z19wYXJzZV9zdGFja3NpemUKKworLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIHByaW50aW5nIGJvdGggS01QX1NUQUNLU0laRSAoZmFjdG9yIGlzIDEpIGFuZAorLy8gT01QX1NUQUNLU0laRSAoZmFjdG9yIGlzIDEwMjQpLiBDdXJyZW50bHkgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHByaW50CisvLyBPTVBfU1RBQ0tTSVpFIHZhbHVlIGluIGJ5dGVzLiBXZSBjYW4gY29uc2lkZXIgYWRkaW5nIHRoaXMgcG9zc2liaWxpdHkgYnkgYQorLy8gY3VzdG9tZXIgcmVxdWVzdCBpbiBmdXR1cmUuCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcHJpbnRfc3RhY2tzaXplKGttcF9zdHJfYnVmX3QgKmJ1ZmZlciwgY2hhciBjb25zdCAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICBrbXBfc3RnX3NzX2RhdGFfdCAqc3RhY2tzaXplID0gKGttcF9zdGdfc3NfZGF0YV90ICopZGF0YTsKKyAgaWYgKF9fa21wX2Vudl9mb3JtYXQpIHsKKyAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKG5hbWUpOworICAgIF9fa21wX3N0cl9idWZfcHJpbnRfc2l6ZShidWZmZXIsIChfX2ttcF9zdGtzaXplICUgMTAyNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBfX2ttcF9zdGtzaXplIC8gc3RhY2tzaXplLT5mYWN0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBfX2ttcF9zdGtzaXplKTsKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIidcbiIpOworICB9IGVsc2UgeworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiICAgJXM9IiwgbmFtZSk7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludF9zaXplKGJ1ZmZlciwgKF9fa21wX3N0a3NpemUgJSAxMDI0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF9fa21wX3N0a3NpemUgLyBzdGFja3NpemUtPmZhY3RvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9fa21wX3N0a3NpemUpOworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiXG4iKTsKKyAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfc3RhY2tzaXplCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfVkVSU0lPTgorCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcGFyc2VfdmVyc2lvbihjaGFyIGNvbnN0ICpuYW1lLCBjaGFyIGNvbnN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpIHsKKyAgX19rbXBfc3RnX3BhcnNlX2Jvb2wobmFtZSwgdmFsdWUsICZfX2ttcF92ZXJzaW9uKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3ZlcnNpb24KKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3ByaW50X3ZlcnNpb24oa21wX3N0cl9idWZfdCAqYnVmZmVyLCBjaGFyIGNvbnN0ICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICBfX2ttcF9zdGdfcHJpbnRfYm9vbChidWZmZXIsIG5hbWUsIF9fa21wX3ZlcnNpb24pOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfdmVyc2lvbgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1dBUk5JTkdTCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wYXJzZV93YXJuaW5ncyhjaGFyIGNvbnN0ICpuYW1lLCBjaGFyIGNvbnN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKSB7CisgIF9fa21wX3N0Z19wYXJzZV9ib29sKG5hbWUsIHZhbHVlLCAmX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MpOworICBpZiAoX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgIT0ga21wX3dhcm5pbmdzX29mZikgeworICAgIC8vIEFDOiBvbmx5IDAvMSB2YWx1ZXMgZG9jdW1lbnRlZCwgc28gcmVzZXQgdG8gZXhwbGljaXQgdG8gZGlzdGluZ3Vpc2ggZnJvbQorICAgIC8vIGRlZmF1bHQgc2V0dGluZworICAgIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID0ga21wX3dhcm5pbmdzX2V4cGxpY2l0OworICB9Cit9IC8vIF9fa21wX3N0Z19wYXJzZV93YXJuaW5ncworCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcHJpbnRfd2FybmluZ3Moa21wX3N0cl9idWZfdCAqYnVmZmVyLCBjaGFyIGNvbnN0ICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpIHsKKyAgLy8gQUM6IFRPRE86IGNoYW5nZSB0byBwcmludF9pbnQ/IChuZWVkcyBkb2N1bWVudGF0aW9uIGNoYW5nZSkKKyAgX19rbXBfc3RnX3ByaW50X2Jvb2woYnVmZmVyLCBuYW1lLCBfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyk7Cit9IC8vIF9fa21wX3N0Z19wcmludF93YXJuaW5ncworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT01QX05FU1RFRCwgT01QX05VTV9USFJFQURTCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wYXJzZV9uZXN0ZWQoY2hhciBjb25zdCAqbmFtZSwgY2hhciBjb25zdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpIHsKKyAgX19rbXBfc3RnX3BhcnNlX2Jvb2wobmFtZSwgdmFsdWUsICZfX2ttcF9kZmx0X25lc3RlZCk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9uZXN0ZWQKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3ByaW50X25lc3RlZChrbXBfc3RyX2J1Zl90ICpidWZmZXIsIGNoYXIgY29uc3QgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpIHsKKyAgX19rbXBfc3RnX3ByaW50X2Jvb2woYnVmZmVyLCBuYW1lLCBfX2ttcF9kZmx0X25lc3RlZCk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9uZXN0ZWQKKworc3RhdGljIHZvaWQgX19rbXBfcGFyc2VfbmVzdGVkX251bV90aHJlYWRzKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9uZXN0ZWRfbnRocmVhZHNfdCAqbnRoX2FycmF5KSB7CisgIGNvbnN0IGNoYXIgKm5leHQgPSBlbnY7CisgIGNvbnN0IGNoYXIgKnNjYW4gPSBuZXh0OworCisgIGludCB0b3RhbCA9IDA7IC8vIENvdW50IGVsZW1lbnRzIHRoYXQgd2VyZSBzZXQuIEl0J2xsIGJlIHVzZWQgYXMgYW4gYXJyYXkgc2l6ZQorICBpbnQgcHJldl9jb21tYSA9IEZBTFNFOyAvLyBGb3IgY29ycmVjdCBwcm9jZXNzaW5nIHNlcXVlbnRpYWwgY29tbWFzCisKKyAgLy8gQ291bnQgdGhlIG51bWJlciBvZiB2YWx1ZXMgaW4gdGhlIGVudi4gdmFyIHN0cmluZworICBmb3IgKDs7KSB7CisgICAgU0tJUF9XUyhuZXh0KTsKKworICAgIGlmICgqbmV4dCA9PSAnXDAnKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgLy8gTmV4dCBjaGFyYWN0ZXIgaXMgbm90IGFuIGludGVnZXIgb3Igbm90IGEgY29tbWEgPT4gZW5kIG9mIGxpc3QKKyAgICBpZiAoKCgqbmV4dCA8ICcwJykgfHwgKCpuZXh0ID4gJzknKSkgJiYgKCpuZXh0ICE9ICcsJykpIHsKKyAgICAgIEtNUF9XQVJOSU5HKE50aFN5bnRheEVycm9yLCB2YXIsIGVudik7CisgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIFRoZSBuZXh0IGNoYXJhY3RlciBpcyAnLCcKKyAgICBpZiAoKm5leHQgPT0gJywnKSB7CisgICAgICAvLyAnLCcgaXMgdGhlIGZpc3J0IGNoYXJhY3RlcgorICAgICAgaWYgKHRvdGFsID09IDAgfHwgcHJldl9jb21tYSkgeworICAgICAgICB0b3RhbCsrOworICAgICAgfQorICAgICAgcHJldl9jb21tYSA9IFRSVUU7CisgICAgICBuZXh0Kys7IC8vIHNraXAgJywnCisgICAgICBTS0lQX1dTKG5leHQpOworICAgIH0KKyAgICAvLyBOZXh0IGNoYXJhY3RlciBpcyBhIGRpZ2l0CisgICAgaWYgKCpuZXh0ID49ICcwJyAmJiAqbmV4dCA8PSAnOScpIHsKKyAgICAgIHByZXZfY29tbWEgPSBGQUxTRTsKKyAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgdG90YWwrKzsKKyAgICAgIGNvbnN0IGNoYXIgKnRtcCA9IG5leHQ7CisgICAgICBTS0lQX1dTKHRtcCk7CisgICAgICBpZiAoKCpuZXh0ID09ICcgJyB8fCAqbmV4dCA9PSAnXHQnKSAmJiAoKnRtcCA+PSAnMCcgJiYgKnRtcCA8PSAnOScpKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKE50aFNwYWNlc05vdEFsbG93ZWQsIHZhciwgZW52KTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgfQorICBLTVBfREVCVUdfQVNTRVJUKHRvdGFsID4gMCk7CisgIGlmICh0b3RhbCA8PSAwKSB7CisgICAgS01QX1dBUk5JTkcoTnRoU3ludGF4RXJyb3IsIHZhciwgZW52KTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBDaGVjayBpZiB0aGUgbmVzdGVkIG50aHJlYWRzIGFycmF5IGV4aXN0cworICBpZiAoIW50aF9hcnJheS0+bnRoKSB7CisgICAgLy8gQWxsb2NhdGUgYW4gYXJyYXkgb2YgZG91YmxlIHNpemUKKyAgICBudGhfYXJyYXktPm50aCA9IChpbnQgKilLTVBfSU5URVJOQUxfTUFMTE9DKHNpemVvZihpbnQpICogdG90YWwgKiAyKTsKKyAgICBpZiAobnRoX2FycmF5LT5udGggPT0gTlVMTCkgeworICAgICAgS01QX0ZBVEFMKE1lbW9yeUFsbG9jRmFpbGVkKTsKKyAgICB9CisgICAgbnRoX2FycmF5LT5zaXplID0gdG90YWwgKiAyOworICB9IGVsc2UgeworICAgIGlmIChudGhfYXJyYXktPnNpemUgPCB0b3RhbCkgeworICAgICAgLy8gSW5jcmVhc2UgdGhlIGFycmF5IHNpemUKKyAgICAgIGRvIHsKKyAgICAgICAgbnRoX2FycmF5LT5zaXplICo9IDI7CisgICAgICB9IHdoaWxlIChudGhfYXJyYXktPnNpemUgPCB0b3RhbCk7CisKKyAgICAgIG50aF9hcnJheS0+bnRoID0gKGludCAqKUtNUF9JTlRFUk5BTF9SRUFMTE9DKAorICAgICAgICAgIG50aF9hcnJheS0+bnRoLCBzaXplb2YoaW50KSAqIG50aF9hcnJheS0+c2l6ZSk7CisgICAgICBpZiAobnRoX2FycmF5LT5udGggPT0gTlVMTCkgeworICAgICAgICBLTVBfRkFUQUwoTWVtb3J5QWxsb2NGYWlsZWQpOworICAgICAgfQorICAgIH0KKyAgfQorICBudGhfYXJyYXktPnVzZWQgPSB0b3RhbDsKKyAgaW50IGkgPSAwOworCisgIHByZXZfY29tbWEgPSBGQUxTRTsKKyAgdG90YWwgPSAwOworICAvLyBTYXZlIHZhbHVlcyBpbiB0aGUgYXJyYXkKKyAgZm9yICg7OykgeworICAgIFNLSVBfV1Moc2Nhbik7CisgICAgaWYgKCpzY2FuID09ICdcMCcpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAvLyBUaGUgbmV4dCBjaGFyYWN0ZXIgaXMgJywnCisgICAgaWYgKCpzY2FuID09ICcsJykgeworICAgICAgLy8gJywnIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QKKyAgICAgIGlmICh0b3RhbCA9PSAwKSB7CisgICAgICAgIC8vIFRoZSB2YWx1ZSBpcyBzdXBwb3NlZCB0byBiZSBlcXVhbCB0byBfX2ttcF9hdmFpbF9wcm9jIGJ1dCBpdCBpcworICAgICAgICAvLyB1bmtub3duIGF0IHRoZSBtb21lbnQuCisgICAgICAgIC8vIFNvIGxldCdzIHB1dCBhIHBsYWNlaG9sZGVyICgjdGhyZWFkcyA9IDApIHRvIGNvcnJlY3QgaXQgbGF0ZXIuCisgICAgICAgIG50aF9hcnJheS0+bnRoW2krK10gPSAwOworICAgICAgICB0b3RhbCsrOworICAgICAgfSBlbHNlIGlmIChwcmV2X2NvbW1hKSB7CisgICAgICAgIC8vIE51bSB0aHJlYWRzIGlzIGluaGVyaXRlZCBmcm9tIHRoZSBwcmV2aW91cyBsZXZlbAorICAgICAgICBudGhfYXJyYXktPm50aFtpXSA9IG50aF9hcnJheS0+bnRoW2kgLSAxXTsKKyAgICAgICAgaSsrOworICAgICAgICB0b3RhbCsrOworICAgICAgfQorICAgICAgcHJldl9jb21tYSA9IFRSVUU7CisgICAgICBzY2FuKys7IC8vIHNraXAgJywnCisgICAgICBTS0lQX1dTKHNjYW4pOworICAgIH0KKyAgICAvLyBOZXh0IGNoYXJhY3RlciBpcyBhIGRpZ2l0CisgICAgaWYgKCpzY2FuID49ICcwJyAmJiAqc2NhbiA8PSAnOScpIHsKKyAgICAgIGludCBudW07CisgICAgICBjb25zdCBjaGFyICpidWYgPSBzY2FuOworICAgICAgY2hhciBjb25zdCAqbXNnID0gTlVMTDsKKyAgICAgIHByZXZfY29tbWEgPSBGQUxTRTsKKyAgICAgIFNLSVBfRElHSVRTKHNjYW4pOworICAgICAgdG90YWwrKzsKKworICAgICAgbnVtID0gX19rbXBfc3RyX3RvX2ludChidWYsICpzY2FuKTsKKyAgICAgIGlmIChudW0gPCBLTVBfTUlOX05USCkgeworICAgICAgICBtc2cgPSBLTVBfSTE4Tl9TVFIoVmFsdWVUb29TbWFsbCk7CisgICAgICAgIG51bSA9IEtNUF9NSU5fTlRIOworICAgICAgfSBlbHNlIGlmIChudW0gPiBfX2ttcF9zeXNfbWF4X250aCkgeworICAgICAgICBtc2cgPSBLTVBfSTE4Tl9TVFIoVmFsdWVUb29MYXJnZSk7CisgICAgICAgIG51bSA9IF9fa21wX3N5c19tYXhfbnRoOworICAgICAgfQorICAgICAgaWYgKG1zZyAhPSBOVUxMKSB7CisgICAgICAgIC8vIE1lc3NhZ2UgaXMgbm90IGVtcHR5LiBQcmludCB3YXJuaW5nLgorICAgICAgICBLTVBfV0FSTklORyhQYXJzZVNpemVJbnRXYXJuLCB2YXIsIGVudiwgbXNnKTsKKyAgICAgICAgS01QX0lORk9STShVc2luZ19pbnRfVmFsdWUsIHZhciwgbnVtKTsKKyAgICAgIH0KKyAgICAgIG50aF9hcnJheS0+bnRoW2krK10gPSBudW07CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wYXJzZV9udW1fdGhyZWFkcyhjaGFyIGNvbnN0ICpuYW1lLCBjaGFyIGNvbnN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKSB7CisgIC8vIFRPRE86IFJlbW92ZSB0aGlzIG9wdGlvbi4gT01QX05VTV9USFJFQURTIGlzIGEgbGlzdCBvZiBwb3NpdGl2ZSBpbnRlZ2VycyEKKyAgaWYgKCFfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoImFsbCIsIHZhbHVlLCAwKSkgeworICAgIC8vIFRoZSBhcnJheSBvZiAxIGVsZW1lbnQKKyAgICBfX2ttcF9uZXN0ZWRfbnRoLm50aCA9IChpbnQgKilLTVBfSU5URVJOQUxfTUFMTE9DKHNpemVvZihpbnQpKTsKKyAgICBfX2ttcF9uZXN0ZWRfbnRoLnNpemUgPSBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQgPSAxOworICAgIF9fa21wX25lc3RlZF9udGgubnRoWzBdID0gX19rbXBfZGZsdF90ZWFtX250aCA9IF9fa21wX2RmbHRfdGVhbV9udGhfdWIgPQorICAgICAgICBfX2ttcF94cHJvYzsKKyAgfSBlbHNlIHsKKyAgICBfX2ttcF9wYXJzZV9uZXN0ZWRfbnVtX3RocmVhZHMobmFtZSwgdmFsdWUsICZfX2ttcF9uZXN0ZWRfbnRoKTsKKyAgICBpZiAoX19rbXBfbmVzdGVkX250aC5udGgpIHsKKyAgICAgIF9fa21wX2RmbHRfdGVhbV9udGggPSBfX2ttcF9uZXN0ZWRfbnRoLm50aFswXTsKKyAgICAgIGlmIChfX2ttcF9kZmx0X3RlYW1fbnRoX3ViIDwgX19rbXBfZGZsdF90ZWFtX250aCkgeworICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViID0gX19rbXBfZGZsdF90ZWFtX250aDsKKyAgICAgIH0KKyAgICB9CisgIH07IC8vIGlmCisgIEtfRElBRygxLCAoIl9fa21wX2RmbHRfdGVhbV9udGggPT0gJWRcbiIsIF9fa21wX2RmbHRfdGVhbV9udGgpKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX251bV90aHJlYWRzCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wcmludF9udW1fdGhyZWFkcyhrbXBfc3RyX2J1Zl90ICpidWZmZXIsIGNoYXIgY29uc3QgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICBpZiAoX19rbXBfZW52X2Zvcm1hdCkgeworICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUU7CisgIH0gZWxzZSB7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIgICAlcyIsIG5hbWUpOworICB9CisgIGlmIChfX2ttcF9uZXN0ZWRfbnRoLnVzZWQpIHsKKyAgICBrbXBfc3RyX2J1Zl90IGJ1ZjsKKyAgICBfX2ttcF9zdHJfYnVmX2luaXQoJmJ1Zik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQ7IGkrKykgeworICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJWQiLCBfX2ttcF9uZXN0ZWRfbnRoLm50aFtpXSk7CisgICAgICBpZiAoaSA8IF9fa21wX25lc3RlZF9udGgudXNlZCAtIDEpIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiLCIpOworICAgICAgfQorICAgIH0KKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIj0nJXMnXG4iLCBidWYuc3RyKTsKKyAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoJmJ1Zik7CisgIH0gZWxzZSB7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICI6ICVzXG4iLCBLTVBfSTE4Tl9TVFIoTm90RGVmaW5lZCkpOworICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9udW1fdGhyZWFkcworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3Blbk1QIDMuMDogS01QX1RBU0tJTkcsIE9NUF9NQVhfQUNUSVZFX0xFVkVMUywKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3BhcnNlX3Rhc2tpbmcoY2hhciBjb25zdCAqbmFtZSwgY2hhciBjb25zdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKSB7CisgIF9fa21wX3N0Z19wYXJzZV9pbnQobmFtZSwgdmFsdWUsIDAsIChpbnQpdHNrbV9tYXgsCisgICAgICAgICAgICAgICAgICAgICAgKGludCAqKSZfX2ttcF90YXNraW5nX21vZGUpOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfdGFza2luZworCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcHJpbnRfdGFza2luZyhrbXBfc3RyX2J1Zl90ICpidWZmZXIsIGNoYXIgY29uc3QgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKSB7CisgIF9fa21wX3N0Z19wcmludF9pbnQoYnVmZmVyLCBuYW1lLCBfX2ttcF90YXNraW5nX21vZGUpOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfdGFza2luZworCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcGFyc2VfdGFza19zdGVhbGluZyhjaGFyIGNvbnN0ICpuYW1lLCBjaGFyIGNvbnN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpIHsKKyAgX19rbXBfc3RnX3BhcnNlX2ludChuYW1lLCB2YWx1ZSwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAoaW50ICopJl9fa21wX3Rhc2tfc3RlYWxpbmdfY29uc3RyYWludCk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV90YXNrX3N0ZWFsaW5nCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wcmludF90YXNrX3N0ZWFsaW5nKGttcF9zdHJfYnVmX3QgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKm5hbWUsIHZvaWQgKmRhdGEpIHsKKyAgX19rbXBfc3RnX3ByaW50X2ludChidWZmZXIsIG5hbWUsIF9fa21wX3Rhc2tfc3RlYWxpbmdfY29uc3RyYWludCk7Cit9IC8vIF9fa21wX3N0Z19wcmludF90YXNrX3N0ZWFsaW5nCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wYXJzZV9tYXhfYWN0aXZlX2xldmVscyhjaGFyIGNvbnN0ICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKnZhbHVlLCB2b2lkICpkYXRhKSB7CisgIF9fa21wX3N0Z19wYXJzZV9pbnQobmFtZSwgdmFsdWUsIDAsIEtNUF9NQVhfQUNUSVZFX0xFVkVMU19MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAmX19rbXBfZGZsdF9tYXhfYWN0aXZlX2xldmVscyk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9tYXhfYWN0aXZlX2xldmVscworCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcHJpbnRfbWF4X2FjdGl2ZV9sZXZlbHMoa21wX3N0cl9idWZfdCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKm5hbWUsIHZvaWQgKmRhdGEpIHsKKyAgX19rbXBfc3RnX3ByaW50X2ludChidWZmZXIsIG5hbWUsIF9fa21wX2RmbHRfbWF4X2FjdGl2ZV9sZXZlbHMpOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfbWF4X2FjdGl2ZV9sZXZlbHMKKworI2lmIE9NUF80MF9FTkFCTEVECisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3Blbk1QIDQuMDogT01QX0RFRkFVTFRfREVWSUNFCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcGFyc2VfZGVmYXVsdF9kZXZpY2UoY2hhciBjb25zdCAqbmFtZSwgY2hhciBjb25zdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICBfX2ttcF9zdGdfcGFyc2VfaW50KG5hbWUsIHZhbHVlLCAwLCBLTVBfTUFYX0RFRkFVTFRfREVWSUNFX0xJTUlULAorICAgICAgICAgICAgICAgICAgICAgICZfX2ttcF9kZWZhdWx0X2RldmljZSk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9kZWZhdWx0X2RldmljZQorCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcHJpbnRfZGVmYXVsdF9kZXZpY2Uoa21wX3N0cl9idWZfdCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKm5hbWUsIHZvaWQgKmRhdGEpIHsKKyAgX19rbXBfc3RnX3ByaW50X2ludChidWZmZXIsIG5hbWUsIF9fa21wX2RlZmF1bHRfZGV2aWNlKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2RlZmF1bHRfZGV2aWNlCisjZW5kaWYKKworI2lmIE9NUF80NV9FTkFCTEVECisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3Blbk1QIDQuNTogT01QX01BWF9UQVNLX1BSSU9SSVRZCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcGFyc2VfbWF4X3Rhc2tfcHJpb3JpdHkoY2hhciBjb25zdCAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0ICp2YWx1ZSwgdm9pZCAqZGF0YSkgeworICBfX2ttcF9zdGdfcGFyc2VfaW50KG5hbWUsIHZhbHVlLCAwLCBLTVBfTUFYX1RBU0tfUFJJT1JJVFlfTElNSVQsCisgICAgICAgICAgICAgICAgICAgICAgJl9fa21wX21heF90YXNrX3ByaW9yaXR5KTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX21heF90YXNrX3ByaW9yaXR5CisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wcmludF9tYXhfdGFza19wcmlvcml0eShrbXBfc3RyX2J1Zl90ICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqbmFtZSwgdm9pZCAqZGF0YSkgeworICBfX2ttcF9zdGdfcHJpbnRfaW50KGJ1ZmZlciwgbmFtZSwgX19rbXBfbWF4X3Rhc2tfcHJpb3JpdHkpOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfbWF4X3Rhc2tfcHJpb3JpdHkKKworLy8gS01QX1RBU0tMT09QX01JTl9UQVNLUworLy8gdGFza2xvb3AgdGhyZWFzaG9sZCB0byBzd2l0Y2ggZnJvbSByZWN1cnNpdmUgdG8gbGluZWFyIHRhc2tzIGNyZWF0aW9uCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcGFyc2VfdGFza2xvb3BfbWluX3Rhc2tzKGNoYXIgY29uc3QgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqdmFsdWUsIHZvaWQgKmRhdGEpIHsKKyAgaW50IHRtcDsKKyAgX19rbXBfc3RnX3BhcnNlX2ludChuYW1lLCB2YWx1ZSwgMCwgSU5UX01BWCwgJnRtcCk7CisgIF9fa21wX3Rhc2tsb29wX21pbl90YXNrcyA9IHRtcDsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3Rhc2tsb29wX21pbl90YXNrcworCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcHJpbnRfdGFza2xvb3BfbWluX3Rhc2tzKGttcF9zdHJfYnVmX3QgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0ICpuYW1lLCB2b2lkICpkYXRhKSB7CisgIF9fa21wX3N0Z19wcmludF9pbnQoYnVmZmVyLCBuYW1lLCBfX2ttcF90YXNrbG9vcF9taW5fdGFza3MpOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfdGFza2xvb3BfbWluX3Rhc2tzCisjZW5kaWYgLy8gT01QXzQ1X0VOQUJMRUQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9ESVNQX05VTV9CVUZGRVJTCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcGFyc2VfZGlzcF9idWZmZXJzKGNoYXIgY29uc3QgKm5hbWUsIGNoYXIgY29uc3QgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKSB7CisgIGlmIChUQ1JfNChfX2ttcF9pbml0X3NlcmlhbCkpIHsKKyAgICBLTVBfV0FSTklORyhFbnZTZXJpYWxXYXJuLCBuYW1lKTsKKyAgICByZXR1cm47CisgIH0gLy8gcmVhZCB2YWx1ZSBiZWZvcmUgc2VyaWFsIGluaXRpYWxpemF0aW9uIG9ubHkKKyAgX19rbXBfc3RnX3BhcnNlX2ludChuYW1lLCB2YWx1ZSwgMSwgS01QX01BWF9OVEgsICZfX2ttcF9kaXNwYXRjaF9udW1fYnVmZmVycyk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9kaXNwX2J1ZmZlcnMKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3ByaW50X2Rpc3BfYnVmZmVycyhrbXBfc3RyX2J1Zl90ICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKm5hbWUsIHZvaWQgKmRhdGEpIHsKKyAgX19rbXBfc3RnX3ByaW50X2ludChidWZmZXIsIG5hbWUsIF9fa21wX2Rpc3BhdGNoX251bV9idWZmZXJzKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2Rpc3BfYnVmZmVycworCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfSE9UX1RFQU1TX01BWF9MRVZFTCwgS01QX0hPVF9URUFNU19NT0RFCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wYXJzZV9ob3RfdGVhbXNfbGV2ZWwoY2hhciBjb25zdCAqbmFtZSwgY2hhciBjb25zdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpIHsKKyAgaWYgKFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpKSB7CisgICAgS01QX1dBUk5JTkcoRW52UGFyYWxsZWxXYXJuLCBuYW1lKTsKKyAgICByZXR1cm47CisgIH0gLy8gcmVhZCB2YWx1ZSBiZWZvcmUgZmlyc3QgcGFyYWxsZWwgb25seQorICBfX2ttcF9zdGdfcGFyc2VfaW50KG5hbWUsIHZhbHVlLCAwLCBLTVBfTUFYX0FDVElWRV9MRVZFTFNfTElNSVQsCisgICAgICAgICAgICAgICAgICAgICAgJl9fa21wX2hvdF90ZWFtc19tYXhfbGV2ZWwpOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfaG90X3RlYW1zX2xldmVsCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wcmludF9ob3RfdGVhbXNfbGV2ZWwoa21wX3N0cl9idWZfdCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0ICpuYW1lLCB2b2lkICpkYXRhKSB7CisgIF9fa21wX3N0Z19wcmludF9pbnQoYnVmZmVyLCBuYW1lLCBfX2ttcF9ob3RfdGVhbXNfbWF4X2xldmVsKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2hvdF90ZWFtc19sZXZlbAorCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcGFyc2VfaG90X3RlYW1zX21vZGUoY2hhciBjb25zdCAqbmFtZSwgY2hhciBjb25zdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICBpZiAoVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkpIHsKKyAgICBLTVBfV0FSTklORyhFbnZQYXJhbGxlbFdhcm4sIG5hbWUpOworICAgIHJldHVybjsKKyAgfSAvLyByZWFkIHZhbHVlIGJlZm9yZSBmaXJzdCBwYXJhbGxlbCBvbmx5CisgIF9fa21wX3N0Z19wYXJzZV9pbnQobmFtZSwgdmFsdWUsIDAsIEtNUF9NQVhfQUNUSVZFX0xFVkVMU19MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAmX19rbXBfaG90X3RlYW1zX21vZGUpOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfaG90X3RlYW1zX21vZGUKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3ByaW50X2hvdF90ZWFtc19tb2RlKGttcF9zdHJfYnVmX3QgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0ICpuYW1lLCB2b2lkICpkYXRhKSB7CisgIF9fa21wX3N0Z19wcmludF9pbnQoYnVmZmVyLCBuYW1lLCBfX2ttcF9ob3RfdGVhbXNfbW9kZSk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9ob3RfdGVhbXNfbW9kZQorCisjZW5kaWYgLy8gS01QX05FU1RFRF9IT1RfVEVBTVMKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9IQU5ETEVfU0lHTkFMUworCisjaWYgS01QX0hBTkRMRV9TSUdOQUxTCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wYXJzZV9oYW5kbGVfc2lnbmFscyhjaGFyIGNvbnN0ICpuYW1lLCBjaGFyIGNvbnN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKSB7CisgIF9fa21wX3N0Z19wYXJzZV9ib29sKG5hbWUsIHZhbHVlLCAmX19rbXBfaGFuZGxlX3NpZ25hbHMpOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfaGFuZGxlX3NpZ25hbHMKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3ByaW50X2hhbmRsZV9zaWduYWxzKGttcF9zdHJfYnVmX3QgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0ICpuYW1lLCB2b2lkICpkYXRhKSB7CisgIF9fa21wX3N0Z19wcmludF9ib29sKGJ1ZmZlciwgbmFtZSwgX19rbXBfaGFuZGxlX3NpZ25hbHMpOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfaGFuZGxlX3NpZ25hbHMKKworI2VuZGlmIC8vIEtNUF9IQU5ETEVfU0lHTkFMUworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1hfREVCVUcsIEtNUF9ERUJVRywgS01QX0RFQlVHX0JVRl8qLCBLTVBfRElBRworCisjaWZkZWYgS01QX0RFQlVHCisKKyNkZWZpbmUgS01QX1NUR19YX0RFQlVHKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyB2b2lkIF9fa21wX3N0Z19wYXJzZV8jI3gjI19kZWJ1ZyhjaGFyIGNvbnN0ICpuYW1lLCBjaGFyIGNvbnN0ICp2YWx1ZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KG5hbWUsIHZhbHVlLCAwLCBJTlRfTUFYLCAma21wXyMjeCMjX2RlYnVnKTsgICAgICAgICAgICBcCisgIH0gLyogX19rbXBfc3RnX3BhcnNlX3hfZGVidWcgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcHJpbnRfIyN4IyNfZGVidWcoa21wX3N0cl9idWZfdCAqYnVmZmVyLCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKm5hbWUsIHZvaWQgKmRhdGEpIHsgICAgICBcCisgICAgX19rbXBfc3RnX3ByaW50X2ludChidWZmZXIsIG5hbWUsIGttcF8jI3gjI19kZWJ1Zyk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IC8qIF9fa21wX3N0Z19wcmludF94X2RlYnVnICovCisKK0tNUF9TVEdfWF9ERUJVRyhhKQorS01QX1NUR19YX0RFQlVHKGIpCitLTVBfU1RHX1hfREVCVUcoYykKK0tNUF9TVEdfWF9ERUJVRyhkKQorS01QX1NUR19YX0RFQlVHKGUpCitLTVBfU1RHX1hfREVCVUcoZikKKworI3VuZGVmIEtNUF9TVEdfWF9ERUJVRworCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcGFyc2VfZGVidWcoY2hhciBjb25zdCAqbmFtZSwgY2hhciBjb25zdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICBpbnQgZGVidWcgPSAwOworICBfX2ttcF9zdGdfcGFyc2VfaW50KG5hbWUsIHZhbHVlLCAwLCBJTlRfTUFYLCAmZGVidWcpOworICBpZiAoa21wX2FfZGVidWcgPCBkZWJ1ZykgeworICAgIGttcF9hX2RlYnVnID0gZGVidWc7CisgIH07IC8vIGlmCisgIGlmIChrbXBfYl9kZWJ1ZyA8IGRlYnVnKSB7CisgICAga21wX2JfZGVidWcgPSBkZWJ1ZzsKKyAgfTsgLy8gaWYKKyAgaWYgKGttcF9jX2RlYnVnIDwgZGVidWcpIHsKKyAgICBrbXBfY19kZWJ1ZyA9IGRlYnVnOworICB9OyAvLyBpZgorICBpZiAoa21wX2RfZGVidWcgPCBkZWJ1ZykgeworICAgIGttcF9kX2RlYnVnID0gZGVidWc7CisgIH07IC8vIGlmCisgIGlmIChrbXBfZV9kZWJ1ZyA8IGRlYnVnKSB7CisgICAga21wX2VfZGVidWcgPSBkZWJ1ZzsKKyAgfTsgLy8gaWYKKyAgaWYgKGttcF9mX2RlYnVnIDwgZGVidWcpIHsKKyAgICBrbXBfZl9kZWJ1ZyA9IGRlYnVnOworICB9OyAvLyBpZgorfSAvLyBfX2ttcF9zdGdfcGFyc2VfZGVidWcKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3BhcnNlX2RlYnVnX2J1ZihjaGFyIGNvbnN0ICpuYW1lLCBjaGFyIGNvbnN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICBfX2ttcF9zdGdfcGFyc2VfYm9vbChuYW1lLCB2YWx1ZSwgJl9fa21wX2RlYnVnX2J1Zik7CisgIC8vICEhISBUT0RPOiBNb3ZlIGJ1ZmZlciBpbml0aWFsaXphdGlvbiBvZiBvZiB0aGlzIGZpbGUhIEl0IG1heSB3b3JrcworICAvLyBpbmNvcnJlY3RseSBpZiBLTVBfREVCVUdfQlVGIGlzIHBhcnNlZCBiZWZvcmUgS01QX0RFQlVHX0JVRl9MSU5FUyBvcgorICAvLyBLTVBfREVCVUdfQlVGX0NIQVJTLgorICBpZiAoX19rbXBfZGVidWdfYnVmKSB7CisgICAgaW50IGk7CisgICAgaW50IGVsZW1lbnRzID0gX19rbXBfZGVidWdfYnVmX2xpbmVzICogX19rbXBfZGVidWdfYnVmX2NoYXJzOworCisgICAgLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYWxsIGVudHJpZXMgaW4gZGVidWcgYnVmZmVyIHRvIGVtcHR5ICovCisgICAgX19rbXBfZGVidWdfYnVmZmVyID0gKGNoYXIgKilfX2ttcF9wYWdlX2FsbG9jYXRlKGVsZW1lbnRzICogc2l6ZW9mKGNoYXIpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZWxlbWVudHM7IGkgKz0gX19rbXBfZGVidWdfYnVmX2NoYXJzKQorICAgICAgX19rbXBfZGVidWdfYnVmZmVyW2ldID0gJ1wwJzsKKworICAgIF9fa21wX2RlYnVnX2NvdW50ID0gMDsKKyAgfQorICBLX0RJQUcoMSwgKCJfX2ttcF9kZWJ1Z19idWYgPSAlZFxuIiwgX19rbXBfZGVidWdfYnVmKSk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWYKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1ZihrbXBfc3RyX2J1Zl90ICpidWZmZXIsIGNoYXIgY29uc3QgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpIHsKKyAgX19rbXBfc3RnX3ByaW50X2Jvb2woYnVmZmVyLCBuYW1lLCBfX2ttcF9kZWJ1Z19idWYpOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfZGVidWdfYnVmCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWZfYXRvbWljKGNoYXIgY29uc3QgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0ICp2YWx1ZSwgdm9pZCAqZGF0YSkgeworICBfX2ttcF9zdGdfcGFyc2VfYm9vbChuYW1lLCB2YWx1ZSwgJl9fa21wX2RlYnVnX2J1Zl9hdG9taWMpOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfZGVidWdfYnVmX2F0b21pYworCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcHJpbnRfZGVidWdfYnVmX2F0b21pYyhrbXBfc3RyX2J1Zl90ICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0ICpuYW1lLCB2b2lkICpkYXRhKSB7CisgIF9fa21wX3N0Z19wcmludF9ib29sKGJ1ZmZlciwgbmFtZSwgX19rbXBfZGVidWdfYnVmX2F0b21pYyk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9kZWJ1Z19idWZfYXRvbWljCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWZfY2hhcnMoY2hhciBjb25zdCAqbmFtZSwgY2hhciBjb25zdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpIHsKKyAgX19rbXBfc3RnX3BhcnNlX2ludChuYW1lLCB2YWx1ZSwgS01QX0RFQlVHX0JVRl9DSEFSU19NSU4sIElOVF9NQVgsCisgICAgICAgICAgICAgICAgICAgICAgJl9fa21wX2RlYnVnX2J1Zl9jaGFycyk7Cit9IC8vIF9fa21wX3N0Z19kZWJ1Z19wYXJzZV9idWZfY2hhcnMKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1Zl9jaGFycyhrbXBfc3RyX2J1Zl90ICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKm5hbWUsIHZvaWQgKmRhdGEpIHsKKyAgX19rbXBfc3RnX3ByaW50X2ludChidWZmZXIsIG5hbWUsIF9fa21wX2RlYnVnX2J1Zl9jaGFycyk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9kZWJ1Z19idWZfY2hhcnMKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3BhcnNlX2RlYnVnX2J1Zl9saW5lcyhjaGFyIGNvbnN0ICpuYW1lLCBjaGFyIGNvbnN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICBfX2ttcF9zdGdfcGFyc2VfaW50KG5hbWUsIHZhbHVlLCBLTVBfREVCVUdfQlVGX0xJTkVTX01JTiwgSU5UX01BWCwKKyAgICAgICAgICAgICAgICAgICAgICAmX19rbXBfZGVidWdfYnVmX2xpbmVzKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2RlYnVnX2J1Zl9saW5lcworCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcHJpbnRfZGVidWdfYnVmX2xpbmVzKGttcF9zdHJfYnVmX3QgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqbmFtZSwgdm9pZCAqZGF0YSkgeworICBfX2ttcF9zdGdfcHJpbnRfaW50KGJ1ZmZlciwgbmFtZSwgX19rbXBfZGVidWdfYnVmX2xpbmVzKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1Zl9saW5lcworCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcGFyc2VfZGlhZyhjaGFyIGNvbnN0ICpuYW1lLCBjaGFyIGNvbnN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpIHsKKyAgX19rbXBfc3RnX3BhcnNlX2ludChuYW1lLCB2YWx1ZSwgMCwgSU5UX01BWCwgJmttcF9kaWFnKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2RpYWcKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3ByaW50X2RpYWcoa21wX3N0cl9idWZfdCAqYnVmZmVyLCBjaGFyIGNvbnN0ICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICBfX2ttcF9zdGdfcHJpbnRfaW50KGJ1ZmZlciwgbmFtZSwga21wX2RpYWcpOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfZGlhZworCisjZW5kaWYgLy8gS01QX0RFQlVHCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfQUxJR05fQUxMT0MKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3BhcnNlX2FsaWduX2FsbG9jKGNoYXIgY29uc3QgKm5hbWUsIGNoYXIgY29uc3QgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpIHsKKyAgX19rbXBfc3RnX3BhcnNlX3NpemUobmFtZSwgdmFsdWUsIENBQ0hFX0xJTkUsIElOVF9NQVgsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICZfX2ttcF9hbGlnbl9hbGxvYywgMSk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9hbGlnbl9hbGxvYworCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcHJpbnRfYWxpZ25fYWxsb2Moa21wX3N0cl9idWZfdCAqYnVmZmVyLCBjaGFyIGNvbnN0ICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpIHsKKyAgX19rbXBfc3RnX3ByaW50X3NpemUoYnVmZmVyLCBuYW1lLCBfX2ttcF9hbGlnbl9hbGxvYyk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9hbGlnbl9hbGxvYworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1BMQUlOX0JBUlJJRVIsIEtNUF9GT1JLSk9JTl9CQVJSSUVSLCBLTVBfUkVEVUNUSU9OX0JBUlJJRVIKKworLy8gVE9ETzogUmVtb3ZlIF9fa21wX2JhcnJpZXJfYnJhbmNoX2JpdF9lbnZfbmFtZSB2YXJpYmFsZSwgcmVtb3ZlIGxvb3BzIGZyb20KKy8vIHBhcnNlIGFuZCBwcmludCBmdW5jdGlvbnMsIHBhc3MgcmVxdWlyZWQgaW5mbyB0aHJvdWdoIGRhdGEgYXJndW1lbnQuCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wYXJzZV9iYXJyaWVyX2JyYW5jaF9iaXQoY2hhciBjb25zdCAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqdmFsdWUsIHZvaWQgKmRhdGEpIHsKKyAgY29uc3QgY2hhciAqdmFyOworCisgIC8qIC0tLS0tLS0tLS0gQmFycmllciBicmFuY2ggYml0IGNvbnRyb2wgLS0tLS0tLS0tLS0tICovCisgIGZvciAoaW50IGkgPSBic19wbGFpbl9iYXJyaWVyOyBpIDwgYnNfbGFzdF9iYXJyaWVyOyBpKyspIHsKKyAgICB2YXIgPSBfX2ttcF9iYXJyaWVyX2JyYW5jaF9iaXRfZW52X25hbWVbaV07CisgICAgaWYgKChzdHJjbXAodmFyLCBuYW1lKSA9PSAwKSAmJiAodmFsdWUgIT0gMCkpIHsKKyAgICAgIGNoYXIgKmNvbW1hOworCisgICAgICBjb21tYSA9IENDQVNUKGNoYXIgKiwgc3RyY2hyKHZhbHVlLCAnLCcpKTsKKyAgICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzW2ldID0KKyAgICAgICAgICAoa21wX3VpbnQzMilfX2ttcF9zdHJfdG9faW50KHZhbHVlLCAnLCcpOworICAgICAgLyogaXMgdGhlcmUgYSBzcGVjaWZpZWQgcmVsZWFzZSBwYXJhbWV0ZXI/ICovCisgICAgICBpZiAoY29tbWEgPT0gTlVMTCkgeworICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbaV0gPSBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYmJfZGZsdDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1tpXSA9CisgICAgICAgICAgICAoa21wX3VpbnQzMilfX2ttcF9zdHJfdG9faW50KGNvbW1hICsgMSwgMCk7CisKKyAgICAgICAgaWYgKF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1tpXSA+IEtNUF9NQVhfQlJBTkNIX0JJVFMpIHsKKyAgICAgICAgICBfX2ttcF9tc2coa21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coQmFyclJlbGVhc2VWYWx1ZUludmFsaWQsIG5hbWUsIGNvbW1hICsgMSksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsKTsKKyAgICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbaV0gPSBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYmJfZGZsdDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzW2ldID4gS01QX01BWF9CUkFOQ0hfQklUUykgeworICAgICAgICBLTVBfV0FSTklORyhCYXJyR2F0aGVyVmFsdWVJbnZhbGlkLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgIEtNUF9JTkZPUk0oVXNpbmdfdWludF9WYWx1ZSwgbmFtZSwgX19rbXBfYmFycmllcl9nYXRoZXJfYmJfZGZsdCk7CisgICAgICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzW2ldID0gX19rbXBfYmFycmllcl9nYXRoZXJfYmJfZGZsdDsKKyAgICAgIH0KKyAgICB9CisgICAgS19ESUFHKDEsICgiJXMgPT0gJWQsJWRcbiIsIF9fa21wX2JhcnJpZXJfYnJhbmNoX2JpdF9lbnZfbmFtZVtpXSwKKyAgICAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzW2ldLAorICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzW2ldKSkKKyAgfQorfSAvLyBfX2ttcF9zdGdfcGFyc2VfYmFycmllcl9icmFuY2hfYml0CisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wcmludF9iYXJyaWVyX2JyYW5jaF9iaXQoa21wX3N0cl9idWZfdCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0ICpuYW1lLCB2b2lkICpkYXRhKSB7CisgIGNvbnN0IGNoYXIgKnZhcjsKKyAgZm9yIChpbnQgaSA9IGJzX3BsYWluX2JhcnJpZXI7IGkgPCBic19sYXN0X2JhcnJpZXI7IGkrKykgeworICAgIHZhciA9IF9fa21wX2JhcnJpZXJfYnJhbmNoX2JpdF9lbnZfbmFtZVtpXTsKKyAgICBpZiAoc3RyY21wKHZhciwgbmFtZSkgPT0gMCkgeworICAgICAgaWYgKF9fa21wX2Vudl9mb3JtYXQpIHsKKyAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRV9FWChfX2ttcF9iYXJyaWVyX2JyYW5jaF9iaXRfZW52X25hbWVbaV0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIgICAlcz0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX2JyYW5jaF9iaXRfZW52X25hbWVbaV0pOworICAgICAgfQorICAgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIlZCwlZCdcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbaV0pOworICAgIH0KKyAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfYmFycmllcl9icmFuY2hfYml0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9QTEFJTl9CQVJSSUVSX1BBVFRFUk4sIEtNUF9GT1JLSk9JTl9CQVJSSUVSX1BBVFRFUk4sCisvLyBLTVBfUkVEVUNUSU9OX0JBUlJJRVJfUEFUVEVSTgorCisvLyBUT0RPOiBSZW1vdmUgX19rbXBfYmFycmllcl9wYXR0ZXJuX25hbWUgdmFyaWFibGUsIHJlbW92ZSBsb29wcyBmcm9tIHBhcnNlIGFuZAorLy8gcHJpbnQgZnVuY3Rpb25zLCBwYXNzIHJlcXVpcmVkIGRhdGEgdG8gZnVuY3Rpb25zIHRocm91Z2ggZGF0YSBhcmd1bWVudC4KKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3BhcnNlX2JhcnJpZXJfcGF0dGVybihjaGFyIGNvbnN0ICpuYW1lLCBjaGFyIGNvbnN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICBjb25zdCBjaGFyICp2YXI7CisgIC8qIC0tLS0tLS0tLS0gQmFycmllciBtZXRob2QgY29udHJvbCAtLS0tLS0tLS0tLS0gKi8KKworICBmb3IgKGludCBpID0gYnNfcGxhaW5fYmFycmllcjsgaSA8IGJzX2xhc3RfYmFycmllcjsgaSsrKSB7CisgICAgdmFyID0gX19rbXBfYmFycmllcl9wYXR0ZXJuX2Vudl9uYW1lW2ldOworCisgICAgaWYgKChzdHJjbXAodmFyLCBuYW1lKSA9PSAwKSAmJiAodmFsdWUgIT0gMCkpIHsKKyAgICAgIGludCBqOworICAgICAgY2hhciAqY29tbWEgPSBDQ0FTVChjaGFyICosIHN0cmNocih2YWx1ZSwgJywnKSk7CisKKyAgICAgIC8qIGhhbmRsZSBmaXJzdCBwYXJhbWV0ZXI6IGdhdGhlciBwYXR0ZXJuICovCisgICAgICBmb3IgKGogPSBicF9saW5lYXJfYmFyOyBqIDwgYnBfbGFzdF9iYXI7IGorKykgeworICAgICAgICBpZiAoX19rbXBfbWF0Y2hfd2l0aF9zZW50aW5lbChfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZVtqXSwgdmFsdWUsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcsJykpIHsKKyAgICAgICAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXR0ZXJuW2ldID0gKGttcF9iYXJfcGF0X2UpajsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGogPT0gYnBfbGFzdF9iYXIpIHsKKyAgICAgICAgS01QX1dBUk5JTkcoQmFyckdhdGhlclZhbHVlSW52YWxpZCwgbmFtZSwgdmFsdWUpOworICAgICAgICBLTVBfSU5GT1JNKFVzaW5nX3N0cl9WYWx1ZSwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZVticF9saW5lYXJfYmFyXSk7CisgICAgICB9CisKKyAgICAgIC8qIGhhbmRsZSBzZWNvbmQgcGFyYW1ldGVyOiByZWxlYXNlIHBhdHRlcm4gKi8KKyAgICAgIGlmIChjb21tYSAhPSBOVUxMKSB7CisgICAgICAgIGZvciAoaiA9IGJwX2xpbmVhcl9iYXI7IGogPCBicF9sYXN0X2JhcjsgaisrKSB7CisgICAgICAgICAgaWYgKF9fa21wX3N0cl9tYXRjaChfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZVtqXSwgMSwgY29tbWEgKyAxKSkgeworICAgICAgICAgICAgX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm5baV0gPSAoa21wX2Jhcl9wYXRfZSlqOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChqID09IGJwX2xhc3RfYmFyKSB7CisgICAgICAgICAgX19rbXBfbXNnKGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKEJhcnJSZWxlYXNlVmFsdWVJbnZhbGlkLCBuYW1lLCBjb21tYSArIDEpLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCk7CisgICAgICAgICAgS01QX0lORk9STShVc2luZ19zdHJfVmFsdWUsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZVticF9saW5lYXJfYmFyXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30gLy8gX19rbXBfc3RnX3BhcnNlX2JhcnJpZXJfcGF0dGVybgorCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcHJpbnRfYmFycmllcl9wYXR0ZXJuKGttcF9zdHJfYnVmX3QgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqbmFtZSwgdm9pZCAqZGF0YSkgeworICBjb25zdCBjaGFyICp2YXI7CisgIGZvciAoaW50IGkgPSBic19wbGFpbl9iYXJyaWVyOyBpIDwgYnNfbGFzdF9iYXJyaWVyOyBpKyspIHsKKyAgICB2YXIgPSBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fZW52X25hbWVbaV07CisgICAgaWYgKHN0cmNtcCh2YXIsIG5hbWUpID09IDApIHsKKyAgICAgIGludCBqID0gX19rbXBfYmFycmllcl9nYXRoZXJfcGF0dGVybltpXTsKKyAgICAgIGludCBrID0gX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm5baV07CisgICAgICBpZiAoX19rbXBfZW52X2Zvcm1hdCkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKF9fa21wX2JhcnJpZXJfcGF0dGVybl9lbnZfbmFtZVtpXSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIiAgICVzPSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfcGF0dGVybl9lbnZfbmFtZVtpXSk7CisgICAgICB9CisgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIiVzLCVzJ1xuIiwgX19rbXBfYmFycmllcl9wYXR0ZXJuX25hbWVbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfcGF0dGVybl9uYW1lW2tdKTsKKyAgICB9CisgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X2JhcnJpZXJfcGF0dGVybgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0FCT1JUX0RFTEFZCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wYXJzZV9hYm9ydF9kZWxheShjaGFyIGNvbnN0ICpuYW1lLCBjaGFyIGNvbnN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKSB7CisgIC8vIFVuaXRzIG9mIEtNUF9ERUxBWV9BQk9SVCBhcmUgc2Vjb25kcywgdW5pdHMgb2YgX19rbXBfYWJvcnRfZGVsYXkgaXMKKyAgLy8gbWlsbGlzZWNvbmRzLgorICBpbnQgZGVsYXkgPSBfX2ttcF9hYm9ydF9kZWxheSAvIDEwMDA7CisgIF9fa21wX3N0Z19wYXJzZV9pbnQobmFtZSwgdmFsdWUsIDAsIElOVF9NQVggLyAxMDAwLCAmZGVsYXkpOworICBfX2ttcF9hYm9ydF9kZWxheSA9IGRlbGF5ICogMTAwMDsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2Fib3J0X2RlbGF5CisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wcmludF9hYm9ydF9kZWxheShrbXBfc3RyX2J1Zl90ICpidWZmZXIsIGNoYXIgY29uc3QgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICBfX2ttcF9zdGdfcHJpbnRfaW50KGJ1ZmZlciwgbmFtZSwgX19rbXBfYWJvcnRfZGVsYXkpOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfYWJvcnRfZGVsYXkKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9DUFVJTkZPX0ZJTEUKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3BhcnNlX2NwdWluZm9fZmlsZShjaGFyIGNvbnN0ICpuYW1lLCBjaGFyIGNvbnN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgX19rbXBfc3RnX3BhcnNlX3N0cihuYW1lLCB2YWx1ZSwgJl9fa21wX2NwdWluZm9fZmlsZSk7CisgIEtfRElBRygxLCAoIl9fa21wX2NwdWluZm9fZmlsZSA9PSAlc1xuIiwgX19rbXBfY3B1aW5mb19maWxlKSk7CisjZW5kaWYKK30gLy9fX2ttcF9zdGdfcGFyc2VfY3B1aW5mb19maWxlCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wcmludF9jcHVpbmZvX2ZpbGUoa21wX3N0cl9idWZfdCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0ICpuYW1lLCB2b2lkICpkYXRhKSB7CisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICBpZiAoX19rbXBfZW52X2Zvcm1hdCkgeworICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUU7CisgIH0gZWxzZSB7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIgICAlcyIsIG5hbWUpOworICB9CisgIGlmIChfX2ttcF9jcHVpbmZvX2ZpbGUpIHsKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIj0nJXMnXG4iLCBfX2ttcF9jcHVpbmZvX2ZpbGUpOworICB9IGVsc2UgeworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiOiAlc1xuIiwgS01QX0kxOE5fU1RSKE5vdERlZmluZWQpKTsKKyAgfQorI2VuZGlmCit9IC8vX19rbXBfc3RnX3ByaW50X2NwdWluZm9fZmlsZQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0ZPUkNFX1JFRFVDVElPTiwgS01QX0RFVEVSTUlOSVNUSUNfUkVEVUNUSU9OCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wYXJzZV9mb3JjZV9yZWR1Y3Rpb24oY2hhciBjb25zdCAqbmFtZSwgY2hhciBjb25zdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpIHsKKyAga21wX3N0Z19mcl9kYXRhX3QgKnJlZHVjdGlvbiA9IChrbXBfc3RnX2ZyX2RhdGFfdCAqKWRhdGE7CisgIGludCByYzsKKworICByYyA9IF9fa21wX3N0Z19jaGVja19yaXZhbHMobmFtZSwgdmFsdWUsIHJlZHVjdGlvbi0+cml2YWxzKTsKKyAgaWYgKHJjKSB7CisgICAgcmV0dXJuOworICB9OyAvLyBpZgorICBpZiAocmVkdWN0aW9uLT5mb3JjZSkgeworICAgIGlmICh2YWx1ZSAhPSAwKSB7CisgICAgICBpZiAoX19rbXBfc3RyX21hdGNoKCJjcml0aWNhbCIsIDAsIHZhbHVlKSkKKyAgICAgICAgX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9IGNyaXRpY2FsX3JlZHVjZV9ibG9jazsKKyAgICAgIGVsc2UgaWYgKF9fa21wX3N0cl9tYXRjaCgiYXRvbWljIiwgMCwgdmFsdWUpKQorICAgICAgICBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kID0gYXRvbWljX3JlZHVjZV9ibG9jazsKKyAgICAgIGVsc2UgaWYgKF9fa21wX3N0cl9tYXRjaCgidHJlZSIsIDAsIHZhbHVlKSkKKyAgICAgICAgX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9IHRyZWVfcmVkdWNlX2Jsb2NrOworICAgICAgZWxzZSB7CisgICAgICAgIEtNUF9GQVRBTChVbmtub3duRm9yY2VSZWR1Y3Rpb24sIG5hbWUsIHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2wobmFtZSwgdmFsdWUsICZfX2ttcF9kZXRlcm1fcmVkKTsKKyAgICBpZiAoX19rbXBfZGV0ZXJtX3JlZCkgeworICAgICAgX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9IHRyZWVfcmVkdWNlX2Jsb2NrOworICAgIH0gZWxzZSB7CisgICAgICBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kID0gcmVkdWN0aW9uX21ldGhvZF9ub3RfZGVmaW5lZDsKKyAgICB9CisgIH0KKyAgS19ESUFHKDEsICgiX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9PSAlZFxuIiwKKyAgICAgICAgICAgICBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kKSk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9mb3JjZV9yZWR1Y3Rpb24KKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3ByaW50X2ZvcmNlX3JlZHVjdGlvbihrbXBfc3RyX2J1Zl90ICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKm5hbWUsIHZvaWQgKmRhdGEpIHsKKworICBrbXBfc3RnX2ZyX2RhdGFfdCAqcmVkdWN0aW9uID0gKGttcF9zdGdfZnJfZGF0YV90ICopZGF0YTsKKyAgaWYgKHJlZHVjdGlvbi0+Zm9yY2UpIHsKKyAgICBpZiAoX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9PSBjcml0aWNhbF9yZWR1Y2VfYmxvY2spIHsKKyAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoYnVmZmVyLCBuYW1lLCAiY3JpdGljYWwiKTsKKyAgICB9IGVsc2UgaWYgKF9fa21wX2ZvcmNlX3JlZHVjdGlvbl9tZXRob2QgPT0gYXRvbWljX3JlZHVjZV9ibG9jaykgeworICAgICAgX19rbXBfc3RnX3ByaW50X3N0cihidWZmZXIsIG5hbWUsICJhdG9taWMiKTsKKyAgICB9IGVsc2UgaWYgKF9fa21wX2ZvcmNlX3JlZHVjdGlvbl9tZXRob2QgPT0gdHJlZV9yZWR1Y2VfYmxvY2spIHsKKyAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoYnVmZmVyLCBuYW1lLCAidHJlZSIpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoX19rbXBfZW52X2Zvcm1hdCkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIgICAlcyIsIG5hbWUpOworICAgICAgfQorICAgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICI6ICVzXG4iLCBLTVBfSTE4Tl9TVFIoTm90RGVmaW5lZCkpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbChidWZmZXIsIG5hbWUsIF9fa21wX2RldGVybV9yZWQpOworICB9CisKK30gLy8gX19rbXBfc3RnX3ByaW50X2ZvcmNlX3JlZHVjdGlvbgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1NUT1JBR0VfTUFQCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wYXJzZV9zdG9yYWdlX21hcChjaGFyIGNvbnN0ICpuYW1lLCBjaGFyIGNvbnN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKSB7CisgIGlmIChfX2ttcF9zdHJfbWF0Y2goInZlcmJvc2UiLCAxLCB2YWx1ZSkpIHsKKyAgICBfX2ttcF9zdG9yYWdlX21hcCA9IFRSVUU7CisgICAgX19rbXBfc3RvcmFnZV9tYXBfdmVyYm9zZSA9IFRSVUU7CisgICAgX19rbXBfc3RvcmFnZV9tYXBfdmVyYm9zZV9zcGVjaWZpZWQgPSBUUlVFOworCisgIH0gZWxzZSB7CisgICAgX19rbXBfc3RvcmFnZV9tYXBfdmVyYm9zZSA9IEZBTFNFOworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKG5hbWUsIHZhbHVlLCAmX19rbXBfc3RvcmFnZV9tYXApOyAvLyAhISEKKyAgfTsgLy8gaWYKK30gLy8gX19rbXBfc3RnX3BhcnNlX3N0b3JhZ2VfbWFwCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wcmludF9zdG9yYWdlX21hcChrbXBfc3RyX2J1Zl90ICpidWZmZXIsIGNoYXIgY29uc3QgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICBpZiAoX19rbXBfc3RvcmFnZV9tYXBfdmVyYm9zZSB8fCBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlX3NwZWNpZmllZCkgeworICAgIF9fa21wX3N0Z19wcmludF9zdHIoYnVmZmVyLCBuYW1lLCAidmVyYm9zZSIpOworICB9IGVsc2UgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKGJ1ZmZlciwgbmFtZSwgX19rbXBfc3RvcmFnZV9tYXApOworICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9zdG9yYWdlX21hcAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0FMTF9USFJFQURQUklWQVRFCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wYXJzZV9hbGxfdGhyZWFkcHJpdmF0ZShjaGFyIGNvbnN0ICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKnZhbHVlLCB2b2lkICpkYXRhKSB7CisgIF9fa21wX3N0Z19wYXJzZV9pbnQobmFtZSwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWxsVGhyZWFkc1NwZWNpZmllZCA/IF9fa21wX21heF9udGggOiAxLAorICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21heF9udGgsICZfX2ttcF90cF9jYXBhY2l0eSk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9hbGxfdGhyZWFkcHJpdmF0ZQorCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcHJpbnRfYWxsX3RocmVhZHByaXZhdGUoa21wX3N0cl9idWZfdCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKm5hbWUsIHZvaWQgKmRhdGEpIHsKKyAgX19rbXBfc3RnX3ByaW50X2ludChidWZmZXIsIG5hbWUsIF9fa21wX3RwX2NhcGFjaXR5KTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9GT1JFSUdOX1RIUkVBRFNfVEhSRUFEUFJJVkFURQorCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcGFyc2VfZm9yZWlnbl90aHJlYWRzX3RocmVhZHByaXZhdGUoY2hhciBjb25zdCAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKSB7CisgIF9fa21wX3N0Z19wYXJzZV9ib29sKG5hbWUsIHZhbHVlLCAmX19rbXBfZm9yZWlnbl90cCk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9mb3JlaWduX3RocmVhZHNfdGhyZWFkcHJpdmF0ZQorCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcHJpbnRfZm9yZWlnbl90aHJlYWRzX3RocmVhZHByaXZhdGUoa21wX3N0cl9idWZfdCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICBfX2ttcF9zdGdfcHJpbnRfYm9vbChidWZmZXIsIG5hbWUsIF9fa21wX2ZvcmVpZ25fdHApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfZm9yZWlnbl90aHJlYWRzX3RocmVhZHByaXZhdGUKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9BRkZJTklUWSwgR09NUF9DUFVfQUZGSU5JVFksIEtNUF9UT1BPTE9HWV9NRVRIT0QKKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKy8vIFBhcnNlIHRoZSBwcm9jIGlkIGxpc3QuICBSZXR1cm4gVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UuCitzdGF0aWMgaW50IF9fa21wX3BhcnNlX2FmZmluaXR5X3Byb2NfaWRfbGlzdChjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipuZXh0RW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKnByb2NsaXN0KSB7CisgIGNvbnN0IGNoYXIgKnNjYW4gPSBlbnY7CisgIGNvbnN0IGNoYXIgKm5leHQgPSBzY2FuOworICBpbnQgZW1wdHkgPSBUUlVFOworCisgICpwcm9jbGlzdCA9IE5VTEw7CisKKyAgZm9yICg7OykgeworICAgIGludCBzdGFydCwgZW5kLCBzdHJpZGU7CisKKyAgICBTS0lQX1dTKHNjYW4pOworICAgIG5leHQgPSBzY2FuOworICAgIGlmICgqbmV4dCA9PSAnXDAnKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoKm5leHQgPT0gJ3snKSB7CisgICAgICBpbnQgbnVtOworICAgICAgbmV4dCsrOyAvLyBza2lwICd7JworICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgIHNjYW4gPSBuZXh0OworCisgICAgICAvLyBSZWFkIHRoZSBmaXJzdCBpbnRlZ2VyIGluIHRoZSBzZXQuCisgICAgICBpZiAoKCpuZXh0IDwgJzAnKSB8fCAoKm5leHQgPiAnOScpKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKEFmZlN5bnRheEVycm9yLCB2YXIpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgS01QX0FTU0VSVChudW0gPj0gMCk7CisKKyAgICAgIGZvciAoOzspIHsKKyAgICAgICAgLy8gQ2hlY2sgZm9yIGVuZCBvZiBzZXQuCisgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgIGlmICgqbmV4dCA9PSAnfScpIHsKKyAgICAgICAgICBuZXh0Kys7IC8vIHNraXAgJ30nCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBTa2lwIG9wdGlvbmFsIGNvbW1hLgorICAgICAgICBpZiAoKm5leHQgPT0gJywnKSB7CisgICAgICAgICAgbmV4dCsrOworICAgICAgICB9CisgICAgICAgIFNLSVBfV1MobmV4dCk7CisKKyAgICAgICAgLy8gUmVhZCB0aGUgbmV4dCBpbnRlZ2VyIGluIHRoZSBzZXQuCisgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICBpZiAoKCpuZXh0IDwgJzAnKSB8fCAoKm5leHQgPiAnOScpKSB7CisgICAgICAgICAgS01QX1dBUk5JTkcoQWZmU3ludGF4RXJyb3IsIHZhcik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUKG51bSA+PSAwKTsKKyAgICAgIH0KKyAgICAgIGVtcHR5ID0gRkFMU0U7CisKKyAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICBpZiAoKm5leHQgPT0gJywnKSB7CisgICAgICAgIG5leHQrKzsKKyAgICAgIH0KKyAgICAgIHNjYW4gPSBuZXh0OworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gTmV4dCBjaGFyYWN0ZXIgaXMgbm90IGFuIGludGVnZXIgPT4gZW5kIG9mIGxpc3QKKyAgICBpZiAoKCpuZXh0IDwgJzAnKSB8fCAoKm5leHQgPiAnOScpKSB7CisgICAgICBpZiAoZW1wdHkpIHsKKyAgICAgICAgS01QX1dBUk5JTkcoQWZmU3ludGF4RXJyb3IsIHZhcik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIFJlYWQgdGhlIGZpcnN0IGludGVnZXIuCisgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgc3RhcnQgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICBLTVBfQVNTRVJUKHN0YXJ0ID49IDApOworICAgIFNLSVBfV1MobmV4dCk7CisKKyAgICAvLyBJZiB0aGlzIGlzbid0IGEgcmFuZ2UsIHRoZW4gZ28gb24uCisgICAgaWYgKCpuZXh0ICE9ICctJykgeworICAgICAgZW1wdHkgPSBGQUxTRTsKKworICAgICAgLy8gU2tpcCBvcHRpb25hbCBjb21tYS4KKyAgICAgIGlmICgqbmV4dCA9PSAnLCcpIHsKKyAgICAgICAgbmV4dCsrOworICAgICAgfQorICAgICAgc2NhbiA9IG5leHQ7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIGEgcmFuZ2UuICBTa2lwIG92ZXIgdGhlICctJyBhbmQgcmVhZCBpbiB0aGUgMm5kIGludC4KKyAgICBuZXh0Kys7IC8vIHNraXAgJy0nCisgICAgU0tJUF9XUyhuZXh0KTsKKyAgICBzY2FuID0gbmV4dDsKKyAgICBpZiAoKCpuZXh0IDwgJzAnKSB8fCAoKm5leHQgPiAnOScpKSB7CisgICAgICBLTVBfV0FSTklORyhBZmZTeW50YXhFcnJvciwgdmFyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgZW5kID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgS01QX0FTU0VSVChlbmQgPj0gMCk7CisKKyAgICAvLyBDaGVjayBmb3IgYSBzdHJpZGUgcGFyYW1ldGVyCisgICAgc3RyaWRlID0gMTsKKyAgICBTS0lQX1dTKG5leHQpOworICAgIGlmICgqbmV4dCA9PSAnOicpIHsKKyAgICAgIC8vIEEgc3RyaWRlIGlzIHNwZWNpZmllZC4gIFNraXAgb3ZlciB0aGUgJzoiIGFuZCByZWFkIHRoZSAzcmQgaW50LgorICAgICAgaW50IHNpZ24gPSArMTsKKyAgICAgIG5leHQrKzsgLy8gc2tpcCAnOicKKyAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICBzY2FuID0gbmV4dDsKKyAgICAgIGlmICgqbmV4dCA9PSAnLScpIHsKKyAgICAgICAgc2lnbiA9IC0xOworICAgICAgICBuZXh0Kys7CisgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgfQorICAgICAgaWYgKCgqbmV4dCA8ICcwJykgfHwgKCpuZXh0ID4gJzknKSkgeworICAgICAgICBLTVBfV0FSTklORyhBZmZTeW50YXhFcnJvciwgdmFyKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICBzdHJpZGUgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgIEtNUF9BU1NFUlQoc3RyaWRlID49IDApOworICAgICAgc3RyaWRlICo9IHNpZ247CisgICAgfQorCisgICAgLy8gRG8gc29tZSByYW5nZSBjaGVja3MuCisgICAgaWYgKHN0cmlkZSA9PSAwKSB7CisgICAgICBLTVBfV0FSTklORyhBZmZaZXJvU3RyaWRlLCB2YXIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBpZiAoc3RyaWRlID4gMCkgeworICAgICAgaWYgKHN0YXJ0ID4gZW5kKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKEFmZlN0YXJ0R3JlYXRlckVuZCwgdmFyLCBzdGFydCwgZW5kKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoc3RhcnQgPCBlbmQpIHsKKyAgICAgICAgS01QX1dBUk5JTkcoQWZmU3RyaWRlTGVzc1plcm8sIHZhciwgc3RhcnQsIGVuZCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKChlbmQgLSBzdGFydCkgLyBzdHJpZGUgPiA2NTUzNikgeworICAgICAgS01QX1dBUk5JTkcoQWZmUmFuZ2VUb29CaWcsIHZhciwgZW5kLCBzdGFydCwgc3RyaWRlKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBlbXB0eSA9IEZBTFNFOworCisgICAgLy8gU2tpcCBvcHRpb25hbCBjb21tYS4KKyAgICBTS0lQX1dTKG5leHQpOworICAgIGlmICgqbmV4dCA9PSAnLCcpIHsKKyAgICAgIG5leHQrKzsKKyAgICB9CisgICAgc2NhbiA9IG5leHQ7CisgIH0KKworICAqbmV4dEVudiA9IG5leHQ7CisKKyAgeworICAgIGludCBsZW4gPSBuZXh0IC0gZW52OworICAgIGNoYXIgKnJldGxpc3QgPSAoY2hhciAqKV9fa21wX2FsbG9jYXRlKChsZW4gKyAxKSAqIHNpemVvZihjaGFyKSk7CisgICAgS01QX01FTUNQWV9TKHJldGxpc3QsIChsZW4gKyAxKSAqIHNpemVvZihjaGFyKSwgZW52LCBsZW4gKiBzaXplb2YoY2hhcikpOworICAgIHJldGxpc3RbbGVuXSA9ICdcMCc7CisgICAgKnByb2NsaXN0ID0gcmV0bGlzdDsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworLy8gSWYgS01QX0FGRklOSVRZIGlzIHNwZWNpZmllZCB3aXRob3V0IGEgdHlwZSwgdGhlbgorLy8gX19rbXBfYWZmaW5pdHlfbm90eXBlIHNob3VsZCBwb2ludCB0byBpdHMgc2V0dGluZy4KK3N0YXRpYyBrbXBfc2V0dGluZ190ICpfX2ttcF9hZmZpbml0eV9ub3R5cGUgPSBOVUxMOworCitzdGF0aWMgdm9pZCBfX2ttcF9wYXJzZV9hZmZpbml0eV9lbnYoY2hhciBjb25zdCAqbmFtZSwgY2hhciBjb25zdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBhZmZpbml0eV90eXBlICpvdXRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqb3V0X3Byb2NsaXN0LCBpbnQgKm91dF92ZXJib3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqb3V0X3dhcm4sIGludCAqb3V0X3Jlc3BlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBhZmZpbml0eV9ncmFuICpvdXRfZ3JhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm91dF9ncmFuX2xldmVscywgaW50ICpvdXRfZHVwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm91dF9jb21wYWN0LCBpbnQgKm91dF9vZmZzZXQpIHsKKyAgY2hhciAqYnVmZmVyID0gTlVMTDsgLy8gQ29weSBvZiBlbnYgdmFyIHZhbHVlLgorICBjaGFyICpidWYgPSBOVUxMOyAvLyBCdWZmZXIgZm9yIHN0cnRva19yKCkgZnVuY3Rpb24uCisgIGNoYXIgKm5leHQgPSBOVUxMOyAvLyBlbmQgb2YgdG9rZW4gLyBzdGFydCBvZiBuZXh0LgorICBjb25zdCBjaGFyICpzdGFydDsgLy8gc3RhcnQgb2YgY3VycmVudCB0b2tlbiAoZm9yIGVyciBtc2dzKQorICBpbnQgY291bnQgPSAwOyAvLyBDb3VudGVyIG9mIHBhcnNlZCBpbnRlZ2VyIG51bWJlcnMuCisgIGludCBudW1iZXJbMl07IC8vIFBhcnNlZCBudW1iZXJzLgorCisgIC8vIEd1YXJkcy4KKyAgaW50IHR5cGUgPSAwOworICBpbnQgcHJvY2xpc3QgPSAwOworICBpbnQgbWF4X3Byb2NsaXN0ID0gMDsKKyAgaW50IHZlcmJvc2UgPSAwOworICBpbnQgd2FybmluZ3MgPSAwOworICBpbnQgcmVzcGVjdCA9IDA7CisgIGludCBncmFuID0gMDsKKyAgaW50IGR1cHMgPSAwOworCisgIEtNUF9BU1NFUlQodmFsdWUgIT0gTlVMTCk7CisKKyAgaWYgKFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSkgeworICAgIEtNUF9XQVJOSU5HKEVudk1pZGRsZVdhcm4sIG5hbWUpOworICAgIF9fa21wX2Vudl90b1ByaW50KG5hbWUsIDApOworICAgIHJldHVybjsKKyAgfQorICBfX2ttcF9lbnZfdG9QcmludChuYW1lLCAxKTsKKworICBidWZmZXIgPQorICAgICAgX19rbXBfc3RyX2Zvcm1hdCgiJXMiLCB2YWx1ZSk7IC8vIENvcHkgZW52IHZhciB0byBrZWVwIG9yaWdpbmFsIGludGFjdC4KKyAgYnVmID0gYnVmZmVyOworICBTS0lQX1dTKGJ1Zik7CisKKy8vIEhlbHBlciBtYWNyb3MuCisKKy8vIElmIHdlIHNlZSBhIHBhcnNlIGVycm9yLCBlbWl0IGEgd2FybmluZyBhbmQgc2NhbiB0byB0aGUgbmV4dCAiLCIuCisvLworLy8gRklYTUUgLSB0aGVyZSdzIGdvdCB0byBiZSBhIGJldHRlciB3YXkgdG8gcHJpbnQgYW4gZXJyb3IKKy8vIG1lc3NhZ2UsIGhvcGVmdWxseSB3aXRob3V0IG92ZXJ3cml0dGluZyBwZWljZXMgb2YgYnVmLgorI2RlZmluZSBFTUlUX1dBUk4oc2tpcCwgZXJybGlzdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2hhciBjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChza2lwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFNLSVBfVE8obmV4dCwgJywnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNoID0gKm5leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqbmV4dCA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX1dBUk5JTkcgZXJybGlzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICpuZXh0ID0gY2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoc2tpcCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoY2ggPT0gJywnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXh0Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYnVmID0gbmV4dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgX3NldF9wYXJhbShfZ3VhcmQsIF92YXIsIF92YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChfZ3VhcmQgPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIF92YXIgPSBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRU1JVF9XQVJOKEZBTFNFLCAoQWZmUGFyYW1EZWZpbmVkLCBuYW1lLCBzdGFydCkpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKytfZ3VhcmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgc2V0X3R5cGUodmFsKSBfc2V0X3BhcmFtKHR5cGUsICpvdXRfdHlwZSwgdmFsKQorI2RlZmluZSBzZXRfdmVyYm9zZSh2YWwpIF9zZXRfcGFyYW0odmVyYm9zZSwgKm91dF92ZXJib3NlLCB2YWwpCisjZGVmaW5lIHNldF93YXJuaW5ncyh2YWwpIF9zZXRfcGFyYW0od2FybmluZ3MsICpvdXRfd2FybiwgdmFsKQorI2RlZmluZSBzZXRfcmVzcGVjdCh2YWwpIF9zZXRfcGFyYW0ocmVzcGVjdCwgKm91dF9yZXNwZWN0LCB2YWwpCisjZGVmaW5lIHNldF9kdXBzKHZhbCkgX3NldF9wYXJhbShkdXBzLCAqb3V0X2R1cHMsIHZhbCkKKyNkZWZpbmUgc2V0X3Byb2NsaXN0KHZhbCkgX3NldF9wYXJhbShwcm9jbGlzdCwgKm91dF9wcm9jbGlzdCwgdmFsKQorCisjZGVmaW5lIHNldF9ncmFuKHZhbCwgbGV2ZWxzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZ3JhbiA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAqb3V0X2dyYW4gPSB2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKm91dF9ncmFuX2xldmVscyA9IGxldmVsczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBFTUlUX1dBUk4oRkFMU0UsIChBZmZQYXJhbURlZmluZWQsIG5hbWUsIHN0YXJ0KSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICArK2dyYW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2lmIE9NUF80MF9FTkFCTEVECisgIEtNUF9ERUJVR19BU1NFUlQoKF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlcyAhPSBOVUxMKSAmJgorICAgICAgICAgICAgICAgICAgIChfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgPiAwKSk7CisjZW5kaWYKKworICB3aGlsZSAoKmJ1ZiAhPSAnXDAnKSB7CisgICAgc3RhcnQgPSBuZXh0ID0gYnVmOworCisgICAgaWYgKF9fa21wX21hdGNoX3N0cigibm9uZSIsIGJ1ZiwgQ0NBU1QoY29uc3QgY2hhciAqKiwgJm5leHQpKSkgeworICAgICAgc2V0X3R5cGUoYWZmaW5pdHlfbm9uZSk7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9mYWxzZTsKKyNlbmRpZgorICAgICAgYnVmID0gbmV4dDsKKyAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigic2NhdHRlciIsIGJ1ZiwgQ0NBU1QoY29uc3QgY2hhciAqKiwgJm5leHQpKSkgeworICAgICAgc2V0X3R5cGUoYWZmaW5pdHlfc2NhdHRlcik7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9pbnRlbDsKKyNlbmRpZgorICAgICAgYnVmID0gbmV4dDsKKyAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigiY29tcGFjdCIsIGJ1ZiwgQ0NBU1QoY29uc3QgY2hhciAqKiwgJm5leHQpKSkgeworICAgICAgc2V0X3R5cGUoYWZmaW5pdHlfY29tcGFjdCk7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9pbnRlbDsKKyNlbmRpZgorICAgICAgYnVmID0gbmV4dDsKKyAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigibG9naWNhbCIsIGJ1ZiwgQ0NBU1QoY29uc3QgY2hhciAqKiwgJm5leHQpKSkgeworICAgICAgc2V0X3R5cGUoYWZmaW5pdHlfbG9naWNhbCk7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9pbnRlbDsKKyNlbmRpZgorICAgICAgYnVmID0gbmV4dDsKKyAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigicGh5c2ljYWwiLCBidWYsIENDQVNUKGNvbnN0IGNoYXIgKiosICZuZXh0KSkpIHsKKyAgICAgIHNldF90eXBlKGFmZmluaXR5X3BoeXNpY2FsKTsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ludGVsOworI2VuZGlmCisgICAgICBidWYgPSBuZXh0OworICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJleHBsaWNpdCIsIGJ1ZiwgQ0NBU1QoY29uc3QgY2hhciAqKiwgJm5leHQpKSkgeworICAgICAgc2V0X3R5cGUoYWZmaW5pdHlfZXhwbGljaXQpOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfaW50ZWw7CisjZW5kaWYKKyAgICAgIGJ1ZiA9IG5leHQ7CisgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoImJhbGFuY2VkIiwgYnVmLCBDQ0FTVChjb25zdCBjaGFyICoqLCAmbmV4dCkpKSB7CisgICAgICBzZXRfdHlwZShhZmZpbml0eV9iYWxhbmNlZCk7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9pbnRlbDsKKyNlbmRpZgorICAgICAgYnVmID0gbmV4dDsKKyAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigiZGlzYWJsZWQiLCBidWYsIENDQVNUKGNvbnN0IGNoYXIgKiosICZuZXh0KSkpIHsKKyAgICAgIHNldF90eXBlKGFmZmluaXR5X2Rpc2FibGVkKTsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ZhbHNlOworI2VuZGlmCisgICAgICBidWYgPSBuZXh0OworICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJ2ZXJib3NlIiwgYnVmLCBDQ0FTVChjb25zdCBjaGFyICoqLCAmbmV4dCkpKSB7CisgICAgICBzZXRfdmVyYm9zZShUUlVFKTsKKyAgICAgIGJ1ZiA9IG5leHQ7CisgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoIm5vdmVyYm9zZSIsIGJ1ZiwgQ0NBU1QoY29uc3QgY2hhciAqKiwgJm5leHQpKSkgeworICAgICAgc2V0X3ZlcmJvc2UoRkFMU0UpOworICAgICAgYnVmID0gbmV4dDsKKyAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigid2FybmluZ3MiLCBidWYsIENDQVNUKGNvbnN0IGNoYXIgKiosICZuZXh0KSkpIHsKKyAgICAgIHNldF93YXJuaW5ncyhUUlVFKTsKKyAgICAgIGJ1ZiA9IG5leHQ7CisgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoIm5vd2FybmluZ3MiLCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NBU1QoY29uc3QgY2hhciAqKiwgJm5leHQpKSkgeworICAgICAgc2V0X3dhcm5pbmdzKEZBTFNFKTsKKyAgICAgIGJ1ZiA9IG5leHQ7CisgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoInJlc3BlY3QiLCBidWYsIENDQVNUKGNvbnN0IGNoYXIgKiosICZuZXh0KSkpIHsKKyAgICAgIHNldF9yZXNwZWN0KFRSVUUpOworICAgICAgYnVmID0gbmV4dDsKKyAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigibm9yZXNwZWN0IiwgYnVmLCBDQ0FTVChjb25zdCBjaGFyICoqLCAmbmV4dCkpKSB7CisgICAgICBzZXRfcmVzcGVjdChGQUxTRSk7CisgICAgICBidWYgPSBuZXh0OworICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJkdXBsaWNhdGVzIiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDQVNUKGNvbnN0IGNoYXIgKiosICZuZXh0KSkgfHwKKyAgICAgICAgICAgICAgIF9fa21wX21hdGNoX3N0cigiZHVwcyIsIGJ1ZiwgQ0NBU1QoY29uc3QgY2hhciAqKiwgJm5leHQpKSkgeworICAgICAgc2V0X2R1cHMoVFJVRSk7CisgICAgICBidWYgPSBuZXh0OworICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJub2R1cGxpY2F0ZXMiLCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NBU1QoY29uc3QgY2hhciAqKiwgJm5leHQpKSB8fAorICAgICAgICAgICAgICAgX19rbXBfbWF0Y2hfc3RyKCJub2R1cHMiLCBidWYsIENDQVNUKGNvbnN0IGNoYXIgKiosICZuZXh0KSkpIHsKKyAgICAgIHNldF9kdXBzKEZBTFNFKTsKKyAgICAgIGJ1ZiA9IG5leHQ7CisgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoImdyYW51bGFyaXR5IiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDQVNUKGNvbnN0IGNoYXIgKiosICZuZXh0KSkgfHwKKyAgICAgICAgICAgICAgIF9fa21wX21hdGNoX3N0cigiZ3JhbiIsIGJ1ZiwgQ0NBU1QoY29uc3QgY2hhciAqKiwgJm5leHQpKSkgeworICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgIGlmICgqbmV4dCAhPSAnPScpIHsKKyAgICAgICAgRU1JVF9XQVJOKFRSVUUsIChBZmZJbnZhbGlkUGFyYW0sIG5hbWUsIHN0YXJ0KSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgbmV4dCsrOyAvLyBza2lwICc9JworICAgICAgU0tJUF9XUyhuZXh0KTsKKworICAgICAgYnVmID0gbmV4dDsKKyAgICAgIGlmIChfX2ttcF9tYXRjaF9zdHIoImZpbmUiLCBidWYsIENDQVNUKGNvbnN0IGNoYXIgKiosICZuZXh0KSkpIHsKKyAgICAgICAgc2V0X2dyYW4oYWZmaW5pdHlfZ3Jhbl9maW5lLCAtMSk7CisgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigidGhyZWFkIiwgYnVmLCBDQ0FTVChjb25zdCBjaGFyICoqLCAmbmV4dCkpKSB7CisgICAgICAgIHNldF9ncmFuKGFmZmluaXR5X2dyYW5fdGhyZWFkLCAtMSk7CisgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigiY29yZSIsIGJ1ZiwgQ0NBU1QoY29uc3QgY2hhciAqKiwgJm5leHQpKSkgeworICAgICAgICBzZXRfZ3JhbihhZmZpbml0eV9ncmFuX2NvcmUsIC0xKTsKKyAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJwYWNrYWdlIiwgYnVmLCBDQ0FTVChjb25zdCBjaGFyICoqLCAmbmV4dCkpKSB7CisgICAgICAgIHNldF9ncmFuKGFmZmluaXR5X2dyYW5fcGFja2FnZSwgLTEpOworICAgICAgICBidWYgPSBuZXh0OworICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoIm5vZGUiLCBidWYsIENDQVNUKGNvbnN0IGNoYXIgKiosICZuZXh0KSkpIHsKKyAgICAgICAgc2V0X2dyYW4oYWZmaW5pdHlfZ3Jhbl9ub2RlLCAtMSk7CisgICAgICAgIGJ1ZiA9IG5leHQ7CisjaWYgS01QX0dST1VQX0FGRklOSVRZCisgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigiZ3JvdXAiLCBidWYsIENDQVNUKGNvbnN0IGNoYXIgKiosICZuZXh0KSkpIHsKKyAgICAgICAgc2V0X2dyYW4oYWZmaW5pdHlfZ3Jhbl9ncm91cCwgLTEpOworICAgICAgICBidWYgPSBuZXh0OworI2VuZGlmIC8qIEtNUF9HUk9VUCBBRkZJTklUWSAqLworICAgICAgfSBlbHNlIGlmICgoKmJ1ZiA+PSAnMCcpICYmICgqYnVmIDw9ICc5JykpIHsKKyAgICAgICAgaW50IG47CisgICAgICAgIG5leHQgPSBidWY7CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBuID0gX19rbXBfc3RyX3RvX2ludChidWYsICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChuID49IDApOworICAgICAgICBidWYgPSBuZXh0OworICAgICAgICBzZXRfZ3JhbihhZmZpbml0eV9ncmFuX2RlZmF1bHQsIG4pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRU1JVF9XQVJOKFRSVUUsIChBZmZJbnZhbGlkUGFyYW0sIG5hbWUsIHN0YXJ0KSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJwcm9jbGlzdCIsIGJ1ZiwgQ0NBU1QoY29uc3QgY2hhciAqKiwgJm5leHQpKSkgeworICAgICAgY2hhciAqdGVtcF9wcm9jbGlzdDsKKworICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgIGlmICgqbmV4dCAhPSAnPScpIHsKKyAgICAgICAgRU1JVF9XQVJOKFRSVUUsIChBZmZJbnZhbGlkUGFyYW0sIG5hbWUsIHN0YXJ0KSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgbmV4dCsrOyAvLyBza2lwICc9JworICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgIGlmICgqbmV4dCAhPSAnWycpIHsKKyAgICAgICAgRU1JVF9XQVJOKFRSVUUsIChBZmZJbnZhbGlkUGFyYW0sIG5hbWUsIHN0YXJ0KSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgbmV4dCsrOyAvLyBza2lwICdbJworICAgICAgYnVmID0gbmV4dDsKKyAgICAgIGlmICghX19rbXBfcGFyc2VfYWZmaW5pdHlfcHJvY19pZF9saXN0KAorICAgICAgICAgICAgICBuYW1lLCBidWYsIENDQVNUKGNvbnN0IGNoYXIgKiosICZuZXh0KSwgJnRlbXBfcHJvY2xpc3QpKSB7CisgICAgICAgIC8vIHdhcm5pbmcgYWxyZWFkeSBlbWl0dGVkLgorICAgICAgICBTS0lQX1RPKG5leHQsICddJyk7CisgICAgICAgIGlmICgqbmV4dCA9PSAnXScpCisgICAgICAgICAgbmV4dCsrOworICAgICAgICBTS0lQX1RPKG5leHQsICcsJyk7CisgICAgICAgIGlmICgqbmV4dCA9PSAnLCcpCisgICAgICAgICAgbmV4dCsrOworICAgICAgICBidWYgPSBuZXh0OworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmICgqbmV4dCAhPSAnXScpIHsKKyAgICAgICAgRU1JVF9XQVJOKFRSVUUsIChBZmZJbnZhbGlkUGFyYW0sIG5hbWUsIHN0YXJ0KSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgbmV4dCsrOyAvLyBza2lwICddJworICAgICAgc2V0X3Byb2NsaXN0KHRlbXBfcHJvY2xpc3QpOworICAgIH0gZWxzZSBpZiAoKCpidWYgPj0gJzAnKSAmJiAoKmJ1ZiA8PSAnOScpKSB7CisgICAgICAvLyBQYXJzZSBpbnRlZ2VyIG51bWJlcnMgLS0gcGVybXV0ZSBhbmQgb2Zmc2V0LgorICAgICAgaW50IG47CisgICAgICBuZXh0ID0gYnVmOworICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICBuID0gX19rbXBfc3RyX3RvX2ludChidWYsICpuZXh0KTsKKyAgICAgIEtNUF9BU1NFUlQobiA+PSAwKTsKKyAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICBpZiAoY291bnQgPCAyKSB7CisgICAgICAgIG51bWJlcltjb3VudF0gPSBuOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX1dBUk5JTkcoQWZmTWFueVBhcmFtcywgbmFtZSwgc3RhcnQpOworICAgICAgfTsgLy8gaWYKKyAgICAgICsrY291bnQ7CisgICAgfSBlbHNlIHsKKyAgICAgIEVNSVRfV0FSTihUUlVFLCAoQWZmSW52YWxpZFBhcmFtLCBuYW1lLCBzdGFydCkpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgU0tJUF9XUyhuZXh0KTsKKyAgICBpZiAoKm5leHQgPT0gJywnKSB7CisgICAgICBuZXh0Kys7CisgICAgICBTS0lQX1dTKG5leHQpOworICAgIH0gZWxzZSBpZiAoKm5leHQgIT0gJ1wwJykgeworICAgICAgY29uc3QgY2hhciAqdGVtcCA9IG5leHQ7CisgICAgICBFTUlUX1dBUk4oVFJVRSwgKFBhcnNlRXh0cmFDaGFyc1dhcm4sIG5hbWUsIHRlbXApKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBidWYgPSBuZXh0OworICB9IC8vIHdoaWxlCisKKyN1bmRlZiBFTUlUX1dBUk4KKyN1bmRlZiBfc2V0X3BhcmFtCisjdW5kZWYgc2V0X3R5cGUKKyN1bmRlZiBzZXRfdmVyYm9zZQorI3VuZGVmIHNldF93YXJuaW5ncworI3VuZGVmIHNldF9yZXNwZWN0CisjdW5kZWYgc2V0X2dyYW51bGFyaXR5CisKKyAgX19rbXBfc3RyX2ZyZWUoQ0NBU1QoY29uc3QgY2hhciAqKiwgJmJ1ZmZlcikpOworCisgIGlmIChwcm9jbGlzdCkgeworICAgIGlmICghdHlwZSkgeworICAgICAgS01QX1dBUk5JTkcoQWZmUHJvY0xpc3ROb1R5cGUsIG5hbWUpOworICAgICAgKm91dF90eXBlID0gYWZmaW5pdHlfZXhwbGljaXQ7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9pbnRlbDsKKyNlbmRpZgorICAgIH0gZWxzZSBpZiAoKm91dF90eXBlICE9IGFmZmluaXR5X2V4cGxpY2l0KSB7CisgICAgICBLTVBfV0FSTklORyhBZmZQcm9jTGlzdE5vdEV4cGxpY2l0LCBuYW1lKTsKKyAgICAgIEtNUF9BU1NFUlQoKm91dF9wcm9jbGlzdCAhPSBOVUxMKTsKKyAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCpvdXRfcHJvY2xpc3QpOworICAgICAgKm91dF9wcm9jbGlzdCA9IE5VTEw7CisgICAgfQorICB9CisgIHN3aXRjaCAoKm91dF90eXBlKSB7CisgIGNhc2UgYWZmaW5pdHlfbG9naWNhbDoKKyAgY2FzZSBhZmZpbml0eV9waHlzaWNhbDogeworICAgIGlmIChjb3VudCA+IDApIHsKKyAgICAgICpvdXRfb2Zmc2V0ID0gbnVtYmVyWzBdOworICAgIH07IC8vIGlmCisgICAgaWYgKGNvdW50ID4gMSkgeworICAgICAgS01QX1dBUk5JTkcoQWZmTWFueVBhcmFtc0ZvckxvZ2ljLCBuYW1lLCBudW1iZXJbMV0pOworICAgIH07IC8vIGlmCisgIH0gYnJlYWs7CisgIGNhc2UgYWZmaW5pdHlfYmFsYW5jZWQ6IHsKKyAgICBpZiAoY291bnQgPiAwKSB7CisgICAgICAqb3V0X2NvbXBhY3QgPSBudW1iZXJbMF07CisgICAgfTsgLy8gaWYKKyAgICBpZiAoY291bnQgPiAxKSB7CisgICAgICAqb3V0X29mZnNldCA9IG51bWJlclsxXTsKKyAgICB9OyAvLyBpZgorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9kZWZhdWx0KSB7CisjaWYgS01QX01JQ19TVVBQT1JURUQKKyAgICAgIGlmIChfX2ttcF9taWNfdHlwZSAhPSBub25fbWljKSB7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IF9fa21wX2FmZmluaXR5X3dhcm5pbmdzKSB7CisgICAgICAgICAgS01QX1dBUk5JTkcoQWZmR3JhblVzaW5nLCAiS01QX0FGRklOSVRZIiwgImZpbmUiKTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9maW5lOworICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgIHsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgX19rbXBfYWZmaW5pdHlfd2FybmluZ3MpIHsKKyAgICAgICAgICBLTVBfV0FSTklORyhBZmZHcmFuVXNpbmcsICJLTVBfQUZGSU5JVFkiLCAiY29yZSIpOworICAgICAgICB9CisgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2NvcmU7CisgICAgICB9CisgICAgfQorICB9IGJyZWFrOworICBjYXNlIGFmZmluaXR5X3NjYXR0ZXI6CisgIGNhc2UgYWZmaW5pdHlfY29tcGFjdDogeworICAgIGlmIChjb3VudCA+IDApIHsKKyAgICAgICpvdXRfY29tcGFjdCA9IG51bWJlclswXTsKKyAgICB9OyAvLyBpZgorICAgIGlmIChjb3VudCA+IDEpIHsKKyAgICAgICpvdXRfb2Zmc2V0ID0gbnVtYmVyWzFdOworICAgIH07IC8vIGlmCisgIH0gYnJlYWs7CisgIGNhc2UgYWZmaW5pdHlfZXhwbGljaXQ6IHsKKyAgICBpZiAoKm91dF9wcm9jbGlzdCA9PSBOVUxMKSB7CisgICAgICBLTVBfV0FSTklORyhBZmZOb1Byb2NMaXN0LCBuYW1lKTsKKyAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lOworICAgIH0KKyAgICBpZiAoY291bnQgPiAwKSB7CisgICAgICBLTVBfV0FSTklORyhBZmZOb1BhcmFtLCBuYW1lLCAiZXhwbGljaXQiKTsKKyAgICB9CisgIH0gYnJlYWs7CisgIGNhc2UgYWZmaW5pdHlfbm9uZTogeworICAgIGlmIChjb3VudCA+IDApIHsKKyAgICAgIEtNUF9XQVJOSU5HKEFmZk5vUGFyYW0sIG5hbWUsICJub25lIik7CisgICAgfTsgLy8gaWYKKyAgfSBicmVhazsKKyAgY2FzZSBhZmZpbml0eV9kaXNhYmxlZDogeworICAgIGlmIChjb3VudCA+IDApIHsKKyAgICAgIEtNUF9XQVJOSU5HKEFmZk5vUGFyYW0sIG5hbWUsICJkaXNhYmxlZCIpOworICAgIH07IC8vIGlmCisgIH0gYnJlYWs7CisgIGNhc2UgYWZmaW5pdHlfZGVmYXVsdDogeworICAgIGlmIChjb3VudCA+IDApIHsKKyAgICAgIEtNUF9XQVJOSU5HKEFmZk5vUGFyYW0sIG5hbWUsICJkZWZhdWx0Iik7CisgICAgfTsgLy8gaWYKKyAgfSBicmVhazsKKyAgZGVmYXVsdDogeyBLTVBfQVNTRVJUKDApOyB9OworICB9OyAvLyBzd2l0Y2gKK30gLy8gX19rbXBfcGFyc2VfYWZmaW5pdHlfZW52CisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wYXJzZV9hZmZpbml0eShjaGFyIGNvbnN0ICpuYW1lLCBjaGFyIGNvbnN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKSB7CisgIGttcF9zZXR0aW5nX3QgKipyaXZhbHMgPSAoa21wX3NldHRpbmdfdCAqKilkYXRhOworICBpbnQgcmM7CisKKyAgcmMgPSBfX2ttcF9zdGdfY2hlY2tfcml2YWxzKG5hbWUsIHZhbHVlLCByaXZhbHMpOworICBpZiAocmMpIHsKKyAgICByZXR1cm47CisgIH0KKworICBfX2ttcF9wYXJzZV9hZmZpbml0eV9lbnYobmFtZSwgdmFsdWUsICZfX2ttcF9hZmZpbml0eV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9fa21wX2FmZmluaXR5X3Byb2NsaXN0LCAmX19rbXBfYWZmaW5pdHlfdmVyYm9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZfX2ttcF9hZmZpbml0eV93YXJuaW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2ssICZfX2ttcF9hZmZpbml0eV9ncmFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzLCAmX19rbXBfYWZmaW5pdHlfZHVwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZfX2ttcF9hZmZpbml0eV9jb21wYWN0LCAmX19rbXBfYWZmaW5pdHlfb2Zmc2V0KTsKKworfSAvLyBfX2ttcF9zdGdfcGFyc2VfYWZmaW5pdHkKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3ByaW50X2FmZmluaXR5KGttcF9zdHJfYnVmX3QgKmJ1ZmZlciwgY2hhciBjb25zdCAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKSB7CisgIGlmIChfX2ttcF9lbnZfZm9ybWF0KSB7CisgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRV9FWChuYW1lKTsKKyAgfSBlbHNlIHsKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIiAgICVzPSciLCBuYW1lKTsKKyAgfQorICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiJXMsIiwgInZlcmJvc2UiKTsKKyAgfSBlbHNlIHsKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIiVzLCIsICJub3ZlcmJvc2UiKTsKKyAgfQorICBpZiAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MpIHsKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIiVzLCIsICJ3YXJuaW5ncyIpOworICB9IGVsc2UgeworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiJXMsIiwgIm5vd2FybmluZ3MiKTsKKyAgfQorICBpZiAoS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgIGlmIChfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2spIHsKKyAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiJXMsIiwgInJlc3BlY3QiKTsKKyAgICB9IGVsc2UgeworICAgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIlcywiLCAibm9yZXNwZWN0Iik7CisgICAgfQorICAgIHN3aXRjaCAoX19rbXBfYWZmaW5pdHlfZ3JhbikgeworICAgIGNhc2UgYWZmaW5pdHlfZ3Jhbl9kZWZhdWx0OgorICAgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIlcyIsICJncmFudWxhcml0eT1kZWZhdWx0LCIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBhZmZpbml0eV9ncmFuX2ZpbmU6CisgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIiVzIiwgImdyYW51bGFyaXR5PWZpbmUsIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIGFmZmluaXR5X2dyYW5fdGhyZWFkOgorICAgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIlcyIsICJncmFudWxhcml0eT10aHJlYWQsIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIGFmZmluaXR5X2dyYW5fY29yZToKKyAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiJXMiLCAiZ3JhbnVsYXJpdHk9Y29yZSwiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlOgorICAgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIlcyIsICJncmFudWxhcml0eT1wYWNrYWdlLCIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBhZmZpbml0eV9ncmFuX25vZGU6CisgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIiVzIiwgImdyYW51bGFyaXR5PW5vZGUsIik7CisgICAgICBicmVhazsKKyNpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKyAgICBjYXNlIGFmZmluaXR5X2dyYW5fZ3JvdXA6CisgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIiVzIiwgImdyYW51bGFyaXR5PWdyb3VwLCIpOworICAgICAgYnJlYWs7CisjZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisgICAgfQorICB9CisgIGlmICghS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiJXMiLCAiZGlzYWJsZWQiKTsKKyAgfSBlbHNlCisgICAgc3dpdGNoIChfX2ttcF9hZmZpbml0eV90eXBlKSB7CisgICAgY2FzZSBhZmZpbml0eV9ub25lOgorICAgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIlcyIsICJub25lIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIGFmZmluaXR5X3BoeXNpY2FsOgorICAgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIlcywlZCIsICJwaHlzaWNhbCIsIF9fa21wX2FmZmluaXR5X29mZnNldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGFmZmluaXR5X2xvZ2ljYWw6CisgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIiVzLCVkIiwgImxvZ2ljYWwiLCBfX2ttcF9hZmZpbml0eV9vZmZzZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBhZmZpbml0eV9jb21wYWN0OgorICAgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIlcywlZCwlZCIsICJjb21wYWN0IiwgX19rbXBfYWZmaW5pdHlfY29tcGFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfb2Zmc2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYWZmaW5pdHlfc2NhdHRlcjoKKyAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiJXMsJWQsJWQiLCAic2NhdHRlciIsIF9fa21wX2FmZmluaXR5X2NvbXBhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X29mZnNldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGFmZmluaXR5X2V4cGxpY2l0OgorICAgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIlcz1bJXNdLCVzIiwgInByb2NsaXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QsICJleHBsaWNpdCIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBhZmZpbml0eV9iYWxhbmNlZDoKKyAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiJXMsJWQsJWQiLCAiYmFsYW5jZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9jb21wYWN0LCBfX2ttcF9hZmZpbml0eV9vZmZzZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBhZmZpbml0eV9kaXNhYmxlZDoKKyAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiJXMiLCAiZGlzYWJsZWQiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYWZmaW5pdHlfZGVmYXVsdDoKKyAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiJXMiLCAiZGVmYXVsdCIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiJXMiLCAiPHVua25vd24+Iik7CisgICAgICBicmVhazsKKyAgICB9CisgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiJ1xuIik7Cit9IC8vX19rbXBfc3RnX3ByaW50X2FmZmluaXR5CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3BhcnNlX2dvbXBfY3B1X2FmZmluaXR5KGNoYXIgY29uc3QgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqdmFsdWUsIHZvaWQgKmRhdGEpIHsKKyAgY29uc3QgY2hhciAqbmV4dCA9IE5VTEw7CisgIGNoYXIgKnRlbXBfcHJvY2xpc3Q7CisgIGttcF9zZXR0aW5nX3QgKipyaXZhbHMgPSAoa21wX3NldHRpbmdfdCAqKilkYXRhOworICBpbnQgcmM7CisKKyAgcmMgPSBfX2ttcF9zdGdfY2hlY2tfcml2YWxzKG5hbWUsIHZhbHVlLCByaXZhbHMpOworICBpZiAocmMpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoVENSXzQoX19rbXBfaW5pdF9taWRkbGUpKSB7CisgICAgS01QX1dBUk5JTkcoRW52TWlkZGxlV2FybiwgbmFtZSk7CisgICAgX19rbXBfZW52X3RvUHJpbnQobmFtZSwgMCk7CisgICAgcmV0dXJuOworICB9CisKKyAgX19rbXBfZW52X3RvUHJpbnQobmFtZSwgMSk7CisKKyAgaWYgKF9fa21wX3BhcnNlX2FmZmluaXR5X3Byb2NfaWRfbGlzdChuYW1lLCB2YWx1ZSwgJm5leHQsICZ0ZW1wX3Byb2NsaXN0KSkgeworICAgIFNLSVBfV1MobmV4dCk7CisgICAgaWYgKCpuZXh0ID09ICdcMCcpIHsKKyAgICAgIC8vIEdPTVBfQ1BVX0FGRklOSVRZID0+IGdyYW51bGFyaXR5PWZpbmUsZXhwbGljaXQscHJvY2xpc3Q9Li4uCisgICAgICBfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCA9IHRlbXBfcHJvY2xpc3Q7CisgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfZXhwbGljaXQ7CisgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9maW5lOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfaW50ZWw7CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgS01QX1dBUk5JTkcoQWZmU3ludGF4RXJyb3IsIG5hbWUpOworICAgICAgaWYgKHRlbXBfcHJvY2xpc3QgIT0gTlVMTCkgeworICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSgodm9pZCAqKXRlbXBfcHJvY2xpc3QpOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBXYXJuaW5nIGFscmVhZHkgZW1pdHRlZAorICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ZhbHNlOworI2VuZGlmCisgIH0KK30gLy8gX19rbXBfc3RnX3BhcnNlX2dvbXBfY3B1X2FmZmluaXR5CisKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZSBPTVBfUExBQ0VTIHByb2MgaWQgbGlzdCBwYXJzZXIuIEhlcmUgaXMgdGhlIGdyYW1tYXI6CisKK3BsYWNlX2xpc3QgOj0gcGxhY2UKK3BsYWNlX2xpc3QgOj0gcGxhY2UgLCBwbGFjZV9saXN0CitwbGFjZSA6PSBudW0KK3BsYWNlIDo9IHBsYWNlIDogbnVtCitwbGFjZSA6PSBwbGFjZSA6IG51bSA6IHNpZ25lZAorcGxhY2UgOj0geyBzdWJwbGFjZWxpc3QgfQorcGxhY2UgOj0gISBwbGFjZSAgICAgICAgICAgICAgICAgIC8vIChsb3dlc3QgcHJpb3JpdHkpCitzdWJwbGFjZV9saXN0IDo9IHN1YnBsYWNlCitzdWJwbGFjZV9saXN0IDo9IHN1YnBsYWNlICwgc3VicGxhY2VfbGlzdAorc3VicGxhY2UgOj0gbnVtCitzdWJwbGFjZSA6PSBudW0gOiBudW0KK3N1YnBsYWNlIDo9IG51bSA6IG51bSA6IHNpZ25lZAorc2lnbmVkIDo9IG51bQorc2lnbmVkIDo9ICsgc2lnbmVkCitzaWduZWQgOj0gLSBzaWduZWQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBfX2ttcF9wYXJzZV9zdWJwbGFjZV9saXN0KGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqKnNjYW4pIHsKKyAgY29uc3QgY2hhciAqbmV4dDsKKworICBmb3IgKDs7KSB7CisgICAgaW50IHN0YXJ0LCBjb3VudCwgc3RyaWRlOworCisgICAgLy8KKyAgICAvLyBSZWFkIGluIHRoZSBzdGFydGluZyBwcm9jIGlkCisgICAgLy8KKyAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICBpZiAoKCoqc2NhbiA8ICcwJykgfHwgKCoqc2NhbiA+ICc5JykpIHsKKyAgICAgIEtNUF9XQVJOSU5HKFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIG5leHQgPSAqc2NhbjsKKyAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICBzdGFydCA9IF9fa21wX3N0cl90b19pbnQoKnNjYW4sICpuZXh0KTsKKyAgICBLTVBfQVNTRVJUKHN0YXJ0ID49IDApOworICAgICpzY2FuID0gbmV4dDsKKworICAgIC8vIHZhbGlkIGZvbGxvdyBzZXRzIGFyZSAnLCcgJzonIGFuZCAnfScKKyAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICBpZiAoKipzY2FuID09ICd9JykgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICgqKnNjYW4gPT0gJywnKSB7CisgICAgICAoKnNjYW4pKys7IC8vIHNraXAgJywnCisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKCoqc2NhbiAhPSAnOicpIHsKKyAgICAgIEtNUF9XQVJOSU5HKFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgICgqc2NhbikrKzsgLy8gc2tpcCAnOicKKworICAgIC8vIFJlYWQgY291bnQgcGFyYW1ldGVyCisgICAgU0tJUF9XUygqc2Nhbik7CisgICAgaWYgKCgqKnNjYW4gPCAnMCcpIHx8ICgqKnNjYW4gPiAnOScpKSB7CisgICAgICBLTVBfV0FSTklORyhTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBuZXh0ID0gKnNjYW47CisgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgY291bnQgPSBfX2ttcF9zdHJfdG9faW50KCpzY2FuLCAqbmV4dCk7CisgICAgS01QX0FTU0VSVChjb3VudCA+PSAwKTsKKyAgICAqc2NhbiA9IG5leHQ7CisKKyAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnICc6JyBhbmQgJ30nCisgICAgU0tJUF9XUygqc2Nhbik7CisgICAgaWYgKCoqc2NhbiA9PSAnfScpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoKipzY2FuID09ICcsJykgeworICAgICAgKCpzY2FuKSsrOyAvLyBza2lwICcsJworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmICgqKnNjYW4gIT0gJzonKSB7CisgICAgICBLTVBfV0FSTklORyhTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICAoKnNjYW4pKys7IC8vIHNraXAgJzonCisKKyAgICAvLyBSZWFkIHN0cmlkZSBwYXJhbWV0ZXIKKyAgICBpbnQgc2lnbiA9ICsxOworICAgIGZvciAoOzspIHsKKyAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgaWYgKCoqc2NhbiA9PSAnKycpIHsKKyAgICAgICAgKCpzY2FuKSsrOyAvLyBza2lwICcrJworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmICgqKnNjYW4gPT0gJy0nKSB7CisgICAgICAgIHNpZ24gKj0gLTE7CisgICAgICAgICgqc2NhbikrKzsgLy8gc2tpcCAnLScKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgU0tJUF9XUygqc2Nhbik7CisgICAgaWYgKCgqKnNjYW4gPCAnMCcpIHx8ICgqKnNjYW4gPiAnOScpKSB7CisgICAgICBLTVBfV0FSTklORyhTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBuZXh0ID0gKnNjYW47CisgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgc3RyaWRlID0gX19rbXBfc3RyX3RvX2ludCgqc2NhbiwgKm5leHQpOworICAgIEtNUF9BU1NFUlQoc3RyaWRlID49IDApOworICAgICpzY2FuID0gbmV4dDsKKyAgICBzdHJpZGUgKj0gc2lnbjsKKworICAgIC8vIHZhbGlkIGZvbGxvdyBzZXRzIGFyZSAnLCcgYW5kICd9JworICAgIFNLSVBfV1MoKnNjYW4pOworICAgIGlmICgqKnNjYW4gPT0gJ30nKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCoqc2NhbiA9PSAnLCcpIHsKKyAgICAgICgqc2NhbikrKzsgLy8gc2tpcCAnLCcKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIEtNUF9XQVJOSU5HKFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IF9fa21wX3BhcnNlX3BsYWNlKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqKnNjYW4pIHsKKyAgY29uc3QgY2hhciAqbmV4dDsKKworICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJ3snICchJyBhbmQgbnVtCisgIFNLSVBfV1MoKnNjYW4pOworICBpZiAoKipzY2FuID09ICd7JykgeworICAgICgqc2NhbikrKzsgLy8gc2tpcCAneycKKyAgICBpZiAoIV9fa21wX3BhcnNlX3N1YnBsYWNlX2xpc3QodmFyLCBzY2FuKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBpZiAoKipzY2FuICE9ICd9JykgeworICAgICAgS01QX1dBUk5JTkcoU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgKCpzY2FuKSsrOyAvLyBza2lwICd9JworICB9IGVsc2UgaWYgKCoqc2NhbiA9PSAnIScpIHsKKyAgICAoKnNjYW4pKys7IC8vIHNraXAgJyEnCisgICAgcmV0dXJuIF9fa21wX3BhcnNlX3BsYWNlKHZhciwgc2Nhbik7IC8vJyEnIGhhcyBsb3dlciBwcmVjZWRlbmNlIHRoYW4gJzonCisgIH0gZWxzZSBpZiAoKCoqc2NhbiA+PSAnMCcpICYmICgqKnNjYW4gPD0gJzknKSkgeworICAgIG5leHQgPSAqc2NhbjsKKyAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICBpbnQgcHJvYyA9IF9fa21wX3N0cl90b19pbnQoKnNjYW4sICpuZXh0KTsKKyAgICBLTVBfQVNTRVJUKHByb2MgPj0gMCk7CisgICAgKnNjYW4gPSBuZXh0OworICB9IGVsc2UgeworICAgIEtNUF9XQVJOSU5HKFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IF9fa21wX3BhcnNlX3BsYWNlX2xpc3QoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICplbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKnBsYWNlX2xpc3QpIHsKKyAgY29uc3QgY2hhciAqc2NhbiA9IGVudjsKKyAgY29uc3QgY2hhciAqbmV4dCA9IHNjYW47CisKKyAgZm9yICg7OykgeworICAgIGludCBzdGFydCwgY291bnQsIHN0cmlkZTsKKworICAgIGlmICghX19rbXBfcGFyc2VfcGxhY2UodmFyLCAmc2NhbikpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnICc6JyBhbmQgRU9MCisgICAgU0tJUF9XUyhzY2FuKTsKKyAgICBpZiAoKnNjYW4gPT0gJ1wwJykgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICgqc2NhbiA9PSAnLCcpIHsKKyAgICAgIHNjYW4rKzsgLy8gc2tpcCAnLCcKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoKnNjYW4gIT0gJzonKSB7CisgICAgICBLTVBfV0FSTklORyhTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBzY2FuKys7IC8vIHNraXAgJzonCisKKyAgICAvLyBSZWFkIGNvdW50IHBhcmFtZXRlcgorICAgIFNLSVBfV1Moc2Nhbik7CisgICAgaWYgKCgqc2NhbiA8ICcwJykgfHwgKCpzY2FuID4gJzknKSkgeworICAgICAgS01QX1dBUk5JTkcoU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgbmV4dCA9IHNjYW47CisgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgY291bnQgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICBLTVBfQVNTRVJUKGNvdW50ID49IDApOworICAgIHNjYW4gPSBuZXh0OworCisgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyAnOicgYW5kIEVPTAorICAgIFNLSVBfV1Moc2Nhbik7CisgICAgaWYgKCpzY2FuID09ICdcMCcpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoKnNjYW4gPT0gJywnKSB7CisgICAgICBzY2FuKys7IC8vIHNraXAgJywnCisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKCpzY2FuICE9ICc6JykgeworICAgICAgS01QX1dBUk5JTkcoU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgc2NhbisrOyAvLyBza2lwICc6JworCisgICAgLy8gUmVhZCBzdHJpZGUgcGFyYW1ldGVyCisgICAgaW50IHNpZ24gPSArMTsKKyAgICBmb3IgKDs7KSB7CisgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgaWYgKCpzY2FuID09ICcrJykgeworICAgICAgICBzY2FuKys7IC8vIHNraXAgJysnCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKCpzY2FuID09ICctJykgeworICAgICAgICBzaWduICo9IC0xOworICAgICAgICBzY2FuKys7IC8vIHNraXAgJy0nCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIFNLSVBfV1Moc2Nhbik7CisgICAgaWYgKCgqc2NhbiA8ICcwJykgfHwgKCpzY2FuID4gJzknKSkgeworICAgICAgS01QX1dBUk5JTkcoU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgbmV4dCA9IHNjYW47CisgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgc3RyaWRlID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgS01QX0FTU0VSVChzdHJpZGUgPj0gMCk7CisgICAgc2NhbiA9IG5leHQ7CisgICAgc3RyaWRlICo9IHNpZ247CisKKyAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnIGFuZCBFT0wKKyAgICBTS0lQX1dTKHNjYW4pOworICAgIGlmICgqc2NhbiA9PSAnXDAnKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCpzY2FuID09ICcsJykgeworICAgICAgc2NhbisrOyAvLyBza2lwICcsJworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgS01QX1dBUk5JTkcoU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICB7CisgICAgaW50IGxlbiA9IHNjYW4gLSBlbnY7CisgICAgY2hhciAqcmV0bGlzdCA9IChjaGFyICopX19rbXBfYWxsb2NhdGUoKGxlbiArIDEpICogc2l6ZW9mKGNoYXIpKTsKKyAgICBLTVBfTUVNQ1BZX1MocmV0bGlzdCwgKGxlbiArIDEpICogc2l6ZW9mKGNoYXIpLCBlbnYsIGxlbiAqIHNpemVvZihjaGFyKSk7CisgICAgcmV0bGlzdFtsZW5dID0gJ1wwJzsKKyAgICAqcGxhY2VfbGlzdCA9IHJldGxpc3Q7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wYXJzZV9wbGFjZXMoY2hhciBjb25zdCAqbmFtZSwgY2hhciBjb25zdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpIHsKKyAgaW50IGNvdW50OworICBjb25zdCBjaGFyICpzY2FuID0gdmFsdWU7CisgIGNvbnN0IGNoYXIgKm5leHQgPSBzY2FuOworICBjb25zdCBjaGFyICpraW5kID0gIlwidGhyZWFkc1wiIjsKKyAga21wX3NldHRpbmdfdCAqKnJpdmFscyA9IChrbXBfc2V0dGluZ190ICoqKWRhdGE7CisgIGludCByYzsKKworICByYyA9IF9fa21wX3N0Z19jaGVja19yaXZhbHMobmFtZSwgdmFsdWUsIHJpdmFscyk7CisgIGlmIChyYykgeworICAgIHJldHVybjsKKyAgfQorCisgIC8vIElmIE9NUF9QUk9DX0JJTkQgaXMgbm90IHNwZWNpZmllZCBidXQgT01QX1BMQUNFUyBpcywKKyAgLy8gdGhlbiBsZXQgT01QX1BST0NfQklORCBkZWZhdWx0IHRvIHRydWUuCisgIGlmIChfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPT0gcHJvY19iaW5kX2RlZmF1bHQpIHsKKyAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfdHJ1ZTsKKyAgfQorCisgIC8vX19rbXBfYWZmaW5pdHlfbnVtX3BsYWNlcyA9IDA7CisKKyAgaWYgKF9fa21wX21hdGNoX3N0cigidGhyZWFkcyIsIHNjYW4sICZuZXh0KSkgeworICAgIHNjYW4gPSBuZXh0OworICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9jb21wYWN0OworICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX3RocmVhZDsKKyAgICBfX2ttcF9hZmZpbml0eV9kdXBzID0gRkFMU0U7CisgICAga2luZCA9ICJcInRocmVhZHNcIiI7CisgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJjb3JlcyIsIHNjYW4sICZuZXh0KSkgeworICAgIHNjYW4gPSBuZXh0OworICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9jb21wYWN0OworICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2NvcmU7CisgICAgX19rbXBfYWZmaW5pdHlfZHVwcyA9IEZBTFNFOworICAgIGtpbmQgPSAiXCJjb3Jlc1wiIjsKKyAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoInNvY2tldHMiLCBzY2FuLCAmbmV4dCkpIHsKKyAgICBzY2FuID0gbmV4dDsKKyAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfY29tcGFjdDsKKyAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlOworICAgIF9fa21wX2FmZmluaXR5X2R1cHMgPSBGQUxTRTsKKyAgICBraW5kID0gIlwic29ja2V0c1wiIjsKKyAgfSBlbHNlIHsKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QgIT0gTlVMTCkgeworICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoKHZvaWQgKilfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCk7CisgICAgICBfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCA9IE5VTEw7CisgICAgfQorICAgIGlmIChfX2ttcF9wYXJzZV9wbGFjZV9saXN0KG5hbWUsIHZhbHVlLCAmX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QpKSB7CisgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfZXhwbGljaXQ7CisgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9maW5lOworICAgICAgX19rbXBfYWZmaW5pdHlfZHVwcyA9IEZBTFNFOworICAgICAgaWYgKF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9PSBwcm9jX2JpbmRfZGVmYXVsdCkgeworICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9PSBwcm9jX2JpbmRfZGVmYXVsdCkgeworICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF90cnVlOworICB9CisKKyAgU0tJUF9XUyhzY2FuKTsKKyAgaWYgKCpzY2FuID09ICdcMCcpIHsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBQYXJzZSBvcHRpb24gY291bnQgcGFyYW1ldGVyIGluIHBhcmVudGhlc2VzCisgIGlmICgqc2NhbiAhPSAnKCcpIHsKKyAgICBLTVBfV0FSTklORyhTeW50YXhFcnJvclVzaW5nLCBuYW1lLCBraW5kKTsKKyAgICByZXR1cm47CisgIH0KKyAgc2NhbisrOyAvLyBza2lwICcoJworCisgIFNLSVBfV1Moc2Nhbik7CisgIG5leHQgPSBzY2FuOworICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgY291bnQgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgS01QX0FTU0VSVChjb3VudCA+PSAwKTsKKyAgc2NhbiA9IG5leHQ7CisKKyAgU0tJUF9XUyhzY2FuKTsKKyAgaWYgKCpzY2FuICE9ICcpJykgeworICAgIEtNUF9XQVJOSU5HKFN5bnRheEVycm9yVXNpbmcsIG5hbWUsIGtpbmQpOworICAgIHJldHVybjsKKyAgfQorICBzY2FuKys7IC8vIHNraXAgJyknCisKKyAgU0tJUF9XUyhzY2FuKTsKKyAgaWYgKCpzY2FuICE9ICdcMCcpIHsKKyAgICBLTVBfV0FSTklORyhQYXJzZUV4dHJhQ2hhcnNXYXJuLCBuYW1lLCBzY2FuKTsKKyAgfQorICBfX2ttcF9hZmZpbml0eV9udW1fcGxhY2VzID0gY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wcmludF9wbGFjZXMoa21wX3N0cl9idWZfdCAqYnVmZmVyLCBjaGFyIGNvbnN0ICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKSB7CisgIGlmIChfX2ttcF9lbnZfZm9ybWF0KSB7CisgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRTsKKyAgfSBlbHNlIHsKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIiAgICVzIiwgbmFtZSk7CisgIH0KKyAgaWYgKChfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgPT0gMCkgfHwKKyAgICAgIChfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXMgPT0gTlVMTCkgfHwKKyAgICAgIChfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPT0gcHJvY19iaW5kX2ZhbHNlKSkgeworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiOiAlc1xuIiwgS01QX0kxOE5fU1RSKE5vdERlZmluZWQpKTsKKyAgfSBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2V4cGxpY2l0KSB7CisgICAgaWYgKF9fa21wX2FmZmluaXR5X3Byb2NsaXN0ICE9IE5VTEwpIHsKKyAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiPSclcydcbiIsIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0KTsKKyAgICB9IGVsc2UgeworICAgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICI6ICVzXG4iLCBLTVBfSTE4Tl9TVFIoTm90RGVmaW5lZCkpOworICAgIH0KKyAgfSBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2NvbXBhY3QpIHsKKyAgICBpbnQgbnVtOworICAgIGlmIChfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgPiAwKSB7CisgICAgICBudW0gPSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3M7CisgICAgfSBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV9udW1fcGxhY2VzID4gMCkgeworICAgICAgbnVtID0gX19rbXBfYWZmaW5pdHlfbnVtX3BsYWNlczsKKyAgICB9IGVsc2UgeworICAgICAgbnVtID0gMDsKKyAgICB9CisgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl90aHJlYWQpIHsKKyAgICAgIGlmIChudW0gPiAwKSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiPSd0aHJlYWRzKCVkKSdcbiIsIG51bSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIj0ndGhyZWFkcydcbiIpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2NvcmUpIHsKKyAgICAgIGlmIChudW0gPiAwKSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiPSdjb3JlcyglZCknIFxuIiwgbnVtKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiPSdjb3JlcydcbiIpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX3BhY2thZ2UpIHsKKyAgICAgIGlmIChudW0gPiAwKSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiPSdzb2NrZXRzKCVkKSdcbiIsIG51bSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIj0nc29ja2V0cydcbiIpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIjogJXNcbiIsIEtNUF9JMThOX1NUUihOb3REZWZpbmVkKSk7CisgICAgfQorICB9IGVsc2UgeworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiOiAlc1xuIiwgS01QX0kxOE5fU1RSKE5vdERlZmluZWQpKTsKKyAgfQorfQorCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworI2lmICghT01QXzQwX0VOQUJMRUQpCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wYXJzZV9wcm9jX2JpbmQoY2hhciBjb25zdCAqbmFtZSwgY2hhciBjb25zdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpIHsKKyAgaW50IGVuYWJsZWQ7CisgIGttcF9zZXR0aW5nX3QgKipyaXZhbHMgPSAoa21wX3NldHRpbmdfdCAqKilkYXRhOworICBpbnQgcmM7CisKKyAgcmMgPSBfX2ttcF9zdGdfY2hlY2tfcml2YWxzKG5hbWUsIHZhbHVlLCByaXZhbHMpOworICBpZiAocmMpIHsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBJbiBPTVAgMy4xLCBPTVBfUFJPQ19CSU5EIGlzIHN0cmljdGx5IGEgYm9vbGVhbgorICBfX2ttcF9zdGdfcGFyc2VfYm9vbChuYW1lLCB2YWx1ZSwgJmVuYWJsZWQpOworICBpZiAoZW5hYmxlZCkgeworICAgIC8vIE9NUF9QUk9DX0JJTkQgPT4gZ3JhbnVsYXJpdHk9ZmluZSxzY2F0dGVyIG9uIE1JQworICAgIC8vIE9NUF9QUk9DX0JJTkQgPT4gZ3JhbnVsYXJpdHk9Y29yZSxzY2F0dGVyIGVsc2V3aGVyZQorICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9zY2F0dGVyOworI2lmIEtNUF9NSUNfU1VQUE9SVEVECisgICAgaWYgKF9fa21wX21pY190eXBlICE9IG5vbl9taWMpCisgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9maW5lOworICAgIGVsc2UKKyNlbmRpZgorICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fY29yZTsKKyAgfSBlbHNlIHsKKyAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfbm9uZTsKKyAgfQorfSAvLyBfX2ttcF9wYXJzZV9wcm9jX2JpbmQKKworI2VuZGlmIC8qIGlmICghIE9NUF80MF9FTkFCTEVEKSAqLworCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcGFyc2VfdG9wb2xvZ3lfbWV0aG9kKGNoYXIgY29uc3QgKm5hbWUsIGNoYXIgY29uc3QgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKSB7CisgIGlmIChfX2ttcF9zdHJfbWF0Y2goImFsbCIsIDEsIHZhbHVlKSkgeworICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX2FsbDsKKyAgfQorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgZWxzZSBpZiAoX19rbXBfc3RyX21hdGNoKCJ4MmFwaWMgaWQiLCA5LCB2YWx1ZSkgfHwKKyAgICAgICAgICAgX19rbXBfc3RyX21hdGNoKCJ4MmFwaWNfaWQiLCA5LCB2YWx1ZSkgfHwKKyAgICAgICAgICAgX19rbXBfc3RyX21hdGNoKCJ4MmFwaWMtaWQiLCA5LCB2YWx1ZSkgfHwKKyAgICAgICAgICAgX19rbXBfc3RyX21hdGNoKCJ4MmFwaWNpZCIsIDgsIHZhbHVlKSB8fAorICAgICAgICAgICBfX2ttcF9zdHJfbWF0Y2goImNwdWlkIGxlYWYgMTEiLCAxMywgdmFsdWUpIHx8CisgICAgICAgICAgIF9fa21wX3N0cl9tYXRjaCgiY3B1aWRfbGVhZl8xMSIsIDEzLCB2YWx1ZSkgfHwKKyAgICAgICAgICAgX19rbXBfc3RyX21hdGNoKCJjcHVpZC1sZWFmLTExIiwgMTMsIHZhbHVlKSB8fAorICAgICAgICAgICBfX2ttcF9zdHJfbWF0Y2goImNwdWlkIGxlYWYxMSIsIDEyLCB2YWx1ZSkgfHwKKyAgICAgICAgICAgX19rbXBfc3RyX21hdGNoKCJjcHVpZF9sZWFmMTEiLCAxMiwgdmFsdWUpIHx8CisgICAgICAgICAgIF9fa21wX3N0cl9tYXRjaCgiY3B1aWQtbGVhZjExIiwgMTIsIHZhbHVlKSB8fAorICAgICAgICAgICBfX2ttcF9zdHJfbWF0Y2goImNwdWlkbGVhZiAxMSIsIDEyLCB2YWx1ZSkgfHwKKyAgICAgICAgICAgX19rbXBfc3RyX21hdGNoKCJjcHVpZGxlYWZfMTEiLCAxMiwgdmFsdWUpIHx8CisgICAgICAgICAgIF9fa21wX3N0cl9tYXRjaCgiY3B1aWRsZWFmLTExIiwgMTIsIHZhbHVlKSB8fAorICAgICAgICAgICBfX2ttcF9zdHJfbWF0Y2goImNwdWlkbGVhZjExIiwgMTEsIHZhbHVlKSB8fAorICAgICAgICAgICBfX2ttcF9zdHJfbWF0Y2goImNwdWlkIDExIiwgOCwgdmFsdWUpIHx8CisgICAgICAgICAgIF9fa21wX3N0cl9tYXRjaCgiY3B1aWRfMTEiLCA4LCB2YWx1ZSkgfHwKKyAgICAgICAgICAgX19rbXBfc3RyX21hdGNoKCJjcHVpZC0xMSIsIDgsIHZhbHVlKSB8fAorICAgICAgICAgICBfX2ttcF9zdHJfbWF0Y2goImNwdWlkMTEiLCA3LCB2YWx1ZSkgfHwKKyAgICAgICAgICAgX19rbXBfc3RyX21hdGNoKCJsZWFmIDExIiwgNywgdmFsdWUpIHx8CisgICAgICAgICAgIF9fa21wX3N0cl9tYXRjaCgibGVhZl8xMSIsIDcsIHZhbHVlKSB8fAorICAgICAgICAgICBfX2ttcF9zdHJfbWF0Y2goImxlYWYtMTEiLCA3LCB2YWx1ZSkgfHwKKyAgICAgICAgICAgX19rbXBfc3RyX21hdGNoKCJsZWFmMTEiLCA2LCB2YWx1ZSkpIHsKKyAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF94MmFwaWNpZDsKKyAgfSBlbHNlIGlmIChfX2ttcF9zdHJfbWF0Y2goImFwaWMgaWQiLCA3LCB2YWx1ZSkgfHwKKyAgICAgICAgICAgICBfX2ttcF9zdHJfbWF0Y2goImFwaWNfaWQiLCA3LCB2YWx1ZSkgfHwKKyAgICAgICAgICAgICBfX2ttcF9zdHJfbWF0Y2goImFwaWMtaWQiLCA3LCB2YWx1ZSkgfHwKKyAgICAgICAgICAgICBfX2ttcF9zdHJfbWF0Y2goImFwaWNpZCIsIDYsIHZhbHVlKSB8fAorICAgICAgICAgICAgIF9fa21wX3N0cl9tYXRjaCgiY3B1aWQgbGVhZiA0IiwgMTIsIHZhbHVlKSB8fAorICAgICAgICAgICAgIF9fa21wX3N0cl9tYXRjaCgiY3B1aWRfbGVhZl80IiwgMTIsIHZhbHVlKSB8fAorICAgICAgICAgICAgIF9fa21wX3N0cl9tYXRjaCgiY3B1aWQtbGVhZi00IiwgMTIsIHZhbHVlKSB8fAorICAgICAgICAgICAgIF9fa21wX3N0cl9tYXRjaCgiY3B1aWQgbGVhZjQiLCAxMSwgdmFsdWUpIHx8CisgICAgICAgICAgICAgX19rbXBfc3RyX21hdGNoKCJjcHVpZF9sZWFmNCIsIDExLCB2YWx1ZSkgfHwKKyAgICAgICAgICAgICBfX2ttcF9zdHJfbWF0Y2goImNwdWlkLWxlYWY0IiwgMTEsIHZhbHVlKSB8fAorICAgICAgICAgICAgIF9fa21wX3N0cl9tYXRjaCgiY3B1aWRsZWFmIDQiLCAxMSwgdmFsdWUpIHx8CisgICAgICAgICAgICAgX19rbXBfc3RyX21hdGNoKCJjcHVpZGxlYWZfNCIsIDExLCB2YWx1ZSkgfHwKKyAgICAgICAgICAgICBfX2ttcF9zdHJfbWF0Y2goImNwdWlkbGVhZi00IiwgMTEsIHZhbHVlKSB8fAorICAgICAgICAgICAgIF9fa21wX3N0cl9tYXRjaCgiY3B1aWRsZWFmNCIsIDEwLCB2YWx1ZSkgfHwKKyAgICAgICAgICAgICBfX2ttcF9zdHJfbWF0Y2goImNwdWlkIDQiLCA3LCB2YWx1ZSkgfHwKKyAgICAgICAgICAgICBfX2ttcF9zdHJfbWF0Y2goImNwdWlkXzQiLCA3LCB2YWx1ZSkgfHwKKyAgICAgICAgICAgICBfX2ttcF9zdHJfbWF0Y2goImNwdWlkLTQiLCA3LCB2YWx1ZSkgfHwKKyAgICAgICAgICAgICBfX2ttcF9zdHJfbWF0Y2goImNwdWlkNCIsIDYsIHZhbHVlKSB8fAorICAgICAgICAgICAgIF9fa21wX3N0cl9tYXRjaCgibGVhZiA0IiwgNiwgdmFsdWUpIHx8CisgICAgICAgICAgICAgX19rbXBfc3RyX21hdGNoKCJsZWFmXzQiLCA2LCB2YWx1ZSkgfHwKKyAgICAgICAgICAgICBfX2ttcF9zdHJfbWF0Y2goImxlYWYtNCIsIDYsIHZhbHVlKSB8fAorICAgICAgICAgICAgIF9fa21wX3N0cl9tYXRjaCgibGVhZjQiLCA1LCB2YWx1ZSkpIHsKKyAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9hcGljaWQ7CisgIH0KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisgIGVsc2UgaWYgKF9fa21wX3N0cl9tYXRjaCgiL3Byb2MvY3B1aW5mbyIsIDIsIHZhbHVlKSB8fAorICAgICAgICAgICBfX2ttcF9zdHJfbWF0Y2goImNwdWluZm8iLCA1LCB2YWx1ZSkpIHsKKyAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9jcHVpbmZvOworICB9CisjaWYgS01QX0dST1VQX0FGRklOSVRZCisgIGVsc2UgaWYgKF9fa21wX3N0cl9tYXRjaCgiZ3JvdXAiLCAxLCB2YWx1ZSkpIHsKKyAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9ncm91cDsKKyAgfQorI2VuZGlmIC8qIEtNUF9HUk9VUF9BRkZJTklUWSAqLworICBlbHNlIGlmIChfX2ttcF9zdHJfbWF0Y2goImZsYXQiLCAxLCB2YWx1ZSkpIHsKKyAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9mbGF0OworICB9CisjaWYgS01QX1VTRV9IV0xPQworICBlbHNlIGlmIChfX2ttcF9zdHJfbWF0Y2goImh3bG9jIiwgMSwgdmFsdWUpKSB7CisgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfaHdsb2M7CisgIH0KKyNlbmRpZgorICBlbHNlIHsKKyAgICBLTVBfV0FSTklORyhTdGdJbnZhbGlkVmFsdWUsIG5hbWUsIHZhbHVlKTsKKyAgfQorfSAvLyBfX2ttcF9zdGdfcGFyc2VfdG9wb2xvZ3lfbWV0aG9kCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wcmludF90b3BvbG9neV9tZXRob2Qoa21wX3N0cl9idWZfdCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0ICpuYW1lLCB2b2lkICpkYXRhKSB7CisjaWYgS01QX0RFQlVHCisgIGNoYXIgY29uc3QgKnZhbHVlID0gTlVMTDsKKworICBzd2l0Y2ggKF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QpIHsKKyAgY2FzZSBhZmZpbml0eV90b3BfbWV0aG9kX2RlZmF1bHQ6CisgICAgdmFsdWUgPSAiZGVmYXVsdCI7CisgICAgYnJlYWs7CisKKyAgY2FzZSBhZmZpbml0eV90b3BfbWV0aG9kX2FsbDoKKyAgICB2YWx1ZSA9ICJhbGwiOworICAgIGJyZWFrOworCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICBjYXNlIGFmZmluaXR5X3RvcF9tZXRob2RfeDJhcGljaWQ6CisgICAgdmFsdWUgPSAieDJBUElDIGlkIjsKKyAgICBicmVhazsKKworICBjYXNlIGFmZmluaXR5X3RvcF9tZXRob2RfYXBpY2lkOgorICAgIHZhbHVlID0gIkFQSUMgaWQiOworICAgIGJyZWFrOworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworI2lmIEtNUF9VU0VfSFdMT0MKKyAgY2FzZSBhZmZpbml0eV90b3BfbWV0aG9kX2h3bG9jOgorICAgIHZhbHVlID0gImh3bG9jIjsKKyAgICBicmVhazsKKyNlbmRpZgorCisgIGNhc2UgYWZmaW5pdHlfdG9wX21ldGhvZF9jcHVpbmZvOgorICAgIHZhbHVlID0gImNwdWluZm8iOworICAgIGJyZWFrOworCisjaWYgS01QX0dST1VQX0FGRklOSVRZCisgIGNhc2UgYWZmaW5pdHlfdG9wX21ldGhvZF9ncm91cDoKKyAgICB2YWx1ZSA9ICJncm91cCI7CisgICAgYnJlYWs7CisjZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisKKyAgY2FzZSBhZmZpbml0eV90b3BfbWV0aG9kX2ZsYXQ6CisgICAgdmFsdWUgPSAiZmxhdCI7CisgICAgYnJlYWs7CisgIH0KKworICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgIF9fa21wX3N0Z19wcmludF9zdHIoYnVmZmVyLCBuYW1lLCB2YWx1ZSk7CisgIH0KKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KK30gLy8gX19rbXBfc3RnX3ByaW50X3RvcG9sb2d5X21ldGhvZAorCisjZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworCisjaWYgT01QXzQwX0VOQUJMRUQKKworLy8gT01QX1BST0NfQklORCAvIGJpbmQtdmFyIGlzIGZ1bmN0aW9uYWwgb24gYWxsIDQuMCBidWlsZHMsIGluY2x1ZGluZyBPUyBYKgorLy8gT01QX1BMQUNFUyAvIHBsYWNlLXBhcnRpdGlvbi12YXIgaXMgbm90Lgorc3RhdGljIHZvaWQgX19rbXBfc3RnX3BhcnNlX3Byb2NfYmluZChjaGFyIGNvbnN0ICpuYW1lLCBjaGFyIGNvbnN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICBrbXBfc2V0dGluZ190ICoqcml2YWxzID0gKGttcF9zZXR0aW5nX3QgKiopZGF0YTsKKyAgaW50IHJjOworCisgIHJjID0gX19rbXBfc3RnX2NoZWNrX3JpdmFscyhuYW1lLCB2YWx1ZSwgcml2YWxzKTsKKyAgaWYgKHJjKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gSW4gT01QIDQuMCBPTVBfUFJPQ19CSU5EIGlzIGEgdmVjdG9yIG9mIHByb2NfYmluZCB0eXBlcy4KKyAgS01QX0RFQlVHX0FTU0VSVCgoX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzICE9IE5VTEwpICYmCisgICAgICAgICAgICAgICAgICAgKF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZCA+IDApKTsKKworICBjb25zdCBjaGFyICpidWYgPSB2YWx1ZTsKKyAgY29uc3QgY2hhciAqbmV4dDsKKyAgaW50IG51bTsKKyAgU0tJUF9XUyhidWYpOworICBpZiAoKCpidWYgPj0gJzAnKSAmJiAoKmJ1ZiA8PSAnOScpKSB7CisgICAgbmV4dCA9IGJ1ZjsKKyAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KGJ1ZiwgKm5leHQpOworICAgIEtNUF9BU1NFUlQobnVtID49IDApOworICAgIGJ1ZiA9IG5leHQ7CisgICAgU0tJUF9XUyhidWYpOworICB9IGVsc2UgeworICAgIG51bSA9IC0xOworICB9CisKKyAgbmV4dCA9IGJ1ZjsKKyAgaWYgKF9fa21wX21hdGNoX3N0cigiZGlzYWJsZWQiLCBidWYsICZuZXh0KSkgeworICAgIGJ1ZiA9IG5leHQ7CisgICAgU0tJUF9XUyhidWYpOworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfZGlzYWJsZWQ7CisjZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZCA9IDE7CisgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ZhbHNlOworICB9IGVsc2UgaWYgKChudW0gPT0gKGludClwcm9jX2JpbmRfZmFsc2UpIHx8CisgICAgICAgICAgICAgX19rbXBfbWF0Y2hfc3RyKCJmYWxzZSIsIGJ1ZiwgJm5leHQpKSB7CisgICAgYnVmID0gbmV4dDsKKyAgICBTS0lQX1dTKGJ1Zik7CisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lOworI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKyAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgPSAxOworICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9mYWxzZTsKKyAgfSBlbHNlIGlmICgobnVtID09IChpbnQpcHJvY19iaW5kX3RydWUpIHx8CisgICAgICAgICAgICAgX19rbXBfbWF0Y2hfc3RyKCJ0cnVlIiwgYnVmLCAmbmV4dCkpIHsKKyAgICBidWYgPSBuZXh0OworICAgIFNLSVBfV1MoYnVmKTsKKyAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgPSAxOworICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF90cnVlOworICB9IGVsc2UgeworICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2YgdmFsdWVzIGluIHRoZSBlbnYgdmFyIHN0cmluZworICAgIGNvbnN0IGNoYXIgKnNjYW47CisgICAgaW50IG5lbGVtID0gMTsKKyAgICBmb3IgKHNjYW4gPSBidWY7ICpzY2FuICE9ICdcMCc7IHNjYW4rKykgeworICAgICAgaWYgKCpzY2FuID09ICcsJykgeworICAgICAgICBuZWxlbSsrOworICAgICAgfQorICAgIH0KKworICAgIC8vIENyZWF0ZSAvIGV4cGFuZCB0aGUgbmVzdGVkIHByb2NfYmluZCBhcnJheSBhcyBuZWVkZWQKKyAgICBpZiAoX19rbXBfbmVzdGVkX3Byb2NfYmluZC5zaXplIDwgbmVsZW0pIHsKKyAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlcyA9CisgICAgICAgICAgKGttcF9wcm9jX2JpbmRfdCAqKUtNUF9JTlRFUk5BTF9SRUFMTE9DKAorICAgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXMsCisgICAgICAgICAgICAgIHNpemVvZihrbXBfcHJvY19iaW5kX3QpICogbmVsZW0pOworICAgICAgaWYgKF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlcyA9PSBOVUxMKSB7CisgICAgICAgIEtNUF9GQVRBTChNZW1vcnlBbGxvY0ZhaWxlZCk7CisgICAgICB9CisgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnNpemUgPSBuZWxlbTsKKyAgICB9CisgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID0gbmVsZW07CisKKyAgICAvLyBTYXZlIHZhbHVlcyBpbiB0aGUgbmVzdGVkIHByb2NfYmluZCBhcnJheQorICAgIGludCBpID0gMDsKKyAgICBmb3IgKDs7KSB7CisgICAgICBlbnVtIGttcF9wcm9jX2JpbmRfdCBiaW5kOworCisgICAgICBpZiAoKG51bSA9PSAoaW50KXByb2NfYmluZF9tYXN0ZXIpIHx8CisgICAgICAgICAgX19rbXBfbWF0Y2hfc3RyKCJtYXN0ZXIiLCBidWYsICZuZXh0KSkgeworICAgICAgICBidWYgPSBuZXh0OworICAgICAgICBTS0lQX1dTKGJ1Zik7CisgICAgICAgIGJpbmQgPSBwcm9jX2JpbmRfbWFzdGVyOworICAgICAgfSBlbHNlIGlmICgobnVtID09IChpbnQpcHJvY19iaW5kX2Nsb3NlKSB8fAorICAgICAgICAgICAgICAgICBfX2ttcF9tYXRjaF9zdHIoImNsb3NlIiwgYnVmLCAmbmV4dCkpIHsKKyAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgU0tJUF9XUyhidWYpOworICAgICAgICBiaW5kID0gcHJvY19iaW5kX2Nsb3NlOworICAgICAgfSBlbHNlIGlmICgobnVtID09IChpbnQpcHJvY19iaW5kX3NwcmVhZCkgfHwKKyAgICAgICAgICAgICAgICAgX19rbXBfbWF0Y2hfc3RyKCJzcHJlYWQiLCBidWYsICZuZXh0KSkgeworICAgICAgICBidWYgPSBuZXh0OworICAgICAgICBTS0lQX1dTKGJ1Zik7CisgICAgICAgIGJpbmQgPSBwcm9jX2JpbmRfc3ByZWFkOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX1dBUk5JTkcoU3RnSW52YWxpZFZhbHVlLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9mYWxzZTsKKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID0gMTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbaSsrXSA9IGJpbmQ7CisgICAgICBpZiAoaSA+PSBuZWxlbSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIEtNUF9ERUJVR19BU1NFUlQoKmJ1ZiA9PSAnLCcpOworICAgICAgYnVmKys7CisgICAgICBTS0lQX1dTKGJ1Zik7CisKKyAgICAgIC8vIFJlYWQgbmV4dCB2YWx1ZSBpZiBpdCB3YXMgc3BlY2lmaWVkIGFzIGFuIGludGVnZXIKKyAgICAgIGlmICgoKmJ1ZiA+PSAnMCcpICYmICgqYnVmIDw9ICc5JykpIHsKKyAgICAgICAgbmV4dCA9IGJ1ZjsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQoYnVmLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQobnVtID49IDApOworICAgICAgICBidWYgPSBuZXh0OworICAgICAgICBTS0lQX1dTKGJ1Zik7CisgICAgICB9IGVsc2UgeworICAgICAgICBudW0gPSAtMTsKKyAgICAgIH0KKyAgICB9CisgICAgU0tJUF9XUyhidWYpOworICB9CisgIGlmICgqYnVmICE9ICdcMCcpIHsKKyAgICBLTVBfV0FSTklORyhQYXJzZUV4dHJhQ2hhcnNXYXJuLCBuYW1lLCBidWYpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wcmludF9wcm9jX2JpbmQoa21wX3N0cl9idWZfdCAqYnVmZmVyLCBjaGFyIGNvbnN0ICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKSB7CisgIGludCBuZWxlbSA9IF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZDsKKyAgaWYgKF9fa21wX2Vudl9mb3JtYXQpIHsKKyAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FOworICB9IGVsc2UgeworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiICAgJXMiLCBuYW1lKTsKKyAgfQorICBpZiAobmVsZW0gPT0gMCkgeworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiOiAlc1xuIiwgS01QX0kxOE5fU1RSKE5vdERlZmluZWQpKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgaTsKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIj0nIiwgbmFtZSk7CisgICAgZm9yIChpID0gMDsgaSA8IG5lbGVtOyBpKyspIHsKKyAgICAgIHN3aXRjaCAoX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzW2ldKSB7CisgICAgICBjYXNlIHByb2NfYmluZF9mYWxzZToKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICJmYWxzZSIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBwcm9jX2JpbmRfdHJ1ZToKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICJ0cnVlIik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHByb2NfYmluZF9tYXN0ZXI6CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAibWFzdGVyIik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHByb2NfYmluZF9jbG9zZToKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICJjbG9zZSIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBwcm9jX2JpbmRfc3ByZWFkOgorICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgInNwcmVhZCIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBwcm9jX2JpbmRfaW50ZWw6CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiaW50ZWwiKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgcHJvY19iaW5kX2RlZmF1bHQ6CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiZGVmYXVsdCIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChpIDwgbmVsZW0gLSAxKSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiLCIpOworICAgICAgfQorICAgIH0KKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIidcbiIpOworICB9Cit9CisKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT01QX0RZTkFNSUMKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3BhcnNlX29tcF9keW5hbWljKGNoYXIgY29uc3QgKm5hbWUsIGNoYXIgY29uc3QgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpIHsKKyAgX19rbXBfc3RnX3BhcnNlX2Jvb2wobmFtZSwgdmFsdWUsICYoX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljKSk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9vbXBfZHluYW1pYworCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcHJpbnRfb21wX2R5bmFtaWMoa21wX3N0cl9idWZfdCAqYnVmZmVyLCBjaGFyIGNvbnN0ICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpIHsKKyAgX19rbXBfc3RnX3ByaW50X2Jvb2woYnVmZmVyLCBuYW1lLCBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWMpOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfb21wX2R5bmFtaWMKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3BhcnNlX2ttcF9keW5hbWljX21vZGUoY2hhciBjb25zdCAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKnZhbHVlLCB2b2lkICpkYXRhKSB7CisgIGlmIChUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkgeworICAgIEtNUF9XQVJOSU5HKEVudlBhcmFsbGVsV2FybiwgbmFtZSk7CisgICAgX19rbXBfZW52X3RvUHJpbnQobmFtZSwgMCk7CisgICAgcmV0dXJuOworICB9CisjaWZkZWYgVVNFX0xPQURfQkFMQU5DRQorICBlbHNlIGlmIChfX2ttcF9zdHJfbWF0Y2goImxvYWQgYmFsYW5jZSIsIDIsIHZhbHVlKSB8fAorICAgICAgICAgICBfX2ttcF9zdHJfbWF0Y2goImxvYWRfYmFsYW5jZSIsIDIsIHZhbHVlKSB8fAorICAgICAgICAgICBfX2ttcF9zdHJfbWF0Y2goImxvYWQtYmFsYW5jZSIsIDIsIHZhbHVlKSB8fAorICAgICAgICAgICBfX2ttcF9zdHJfbWF0Y2goImxvYWRiYWxhbmNlIiwgMiwgdmFsdWUpIHx8CisgICAgICAgICAgIF9fa21wX3N0cl9tYXRjaCgiYmFsYW5jZSIsIDEsIHZhbHVlKSkgeworICAgIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID0gZHluYW1pY19sb2FkX2JhbGFuY2U7CisgIH0KKyNlbmRpZiAvKiBVU0VfTE9BRF9CQUxBTkNFICovCisgIGVsc2UgaWYgKF9fa21wX3N0cl9tYXRjaCgidGhyZWFkIGxpbWl0IiwgMSwgdmFsdWUpIHx8CisgICAgICAgICAgIF9fa21wX3N0cl9tYXRjaCgidGhyZWFkX2xpbWl0IiwgMSwgdmFsdWUpIHx8CisgICAgICAgICAgIF9fa21wX3N0cl9tYXRjaCgidGhyZWFkLWxpbWl0IiwgMSwgdmFsdWUpIHx8CisgICAgICAgICAgIF9fa21wX3N0cl9tYXRjaCgidGhyZWFkbGltaXQiLCAxLCB2YWx1ZSkgfHwKKyAgICAgICAgICAgX19rbXBfc3RyX21hdGNoKCJsaW1pdCIsIDIsIHZhbHVlKSkgeworICAgIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID0gZHluYW1pY190aHJlYWRfbGltaXQ7CisgIH0gZWxzZSBpZiAoX19rbXBfc3RyX21hdGNoKCJyYW5kb20iLCAxLCB2YWx1ZSkpIHsKKyAgICBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9IGR5bmFtaWNfcmFuZG9tOworICB9IGVsc2UgeworICAgIEtNUF9XQVJOSU5HKFN0Z0ludmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWUpOworICB9Cit9IC8vX19rbXBfc3RnX3BhcnNlX2ttcF9keW5hbWljX21vZGUKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3ByaW50X2ttcF9keW5hbWljX21vZGUoa21wX3N0cl9idWZfdCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqbmFtZSwgdm9pZCAqZGF0YSkgeworI2lmIEtNUF9ERUJVRworICBpZiAoX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPT0gZHluYW1pY19kZWZhdWx0KSB7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIgICAlczogJXMgXG4iLCBuYW1lLCBLTVBfSTE4Tl9TVFIoTm90RGVmaW5lZCkpOworICB9CisjaWZkZWYgVVNFX0xPQURfQkFMQU5DRQorICBlbHNlIGlmIChfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9PSBkeW5hbWljX2xvYWRfYmFsYW5jZSkgeworICAgIF9fa21wX3N0Z19wcmludF9zdHIoYnVmZmVyLCBuYW1lLCAibG9hZCBiYWxhbmNlIik7CisgIH0KKyNlbmRpZiAvKiBVU0VfTE9BRF9CQUxBTkNFICovCisgIGVsc2UgaWYgKF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID09IGR5bmFtaWNfdGhyZWFkX2xpbWl0KSB7CisgICAgX19rbXBfc3RnX3ByaW50X3N0cihidWZmZXIsIG5hbWUsICJ0aHJlYWQgbGltaXQiKTsKKyAgfSBlbHNlIGlmIChfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9PSBkeW5hbWljX3JhbmRvbSkgeworICAgIF9fa21wX3N0Z19wcmludF9zdHIoYnVmZmVyLCBuYW1lLCAicmFuZG9tIik7CisgIH0gZWxzZSB7CisgICAgS01QX0FTU0VSVCgwKTsKKyAgfQorI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworfSAvLyBfX2ttcF9zdGdfcHJpbnRfa21wX2R5bmFtaWNfbW9kZQorCisjaWZkZWYgVVNFX0xPQURfQkFMQU5DRQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0xPQURfQkFMQU5DRV9JTlRFUlZBTAorCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcGFyc2VfbGRfYmFsYW5jZV9pbnRlcnZhbChjaGFyIGNvbnN0ICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqdmFsdWUsIHZvaWQgKmRhdGEpIHsKKyAgZG91YmxlIGludGVydmFsID0gX19rbXBfY29udmVydF90b19kb3VibGUodmFsdWUpOworICBpZiAoaW50ZXJ2YWwgPj0gMCkgeworICAgIF9fa21wX2xvYWRfYmFsYW5jZV9pbnRlcnZhbCA9IGludGVydmFsOworICB9IGVsc2UgeworICAgIEtNUF9XQVJOSU5HKFN0Z0ludmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWUpOworICB9OyAvLyBpZgorfSAvLyBfX2ttcF9zdGdfcGFyc2VfbG9hZF9iYWxhbmNlX2ludGVydmFsCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wcmludF9sZF9iYWxhbmNlX2ludGVydmFsKGttcF9zdHJfYnVmX3QgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKm5hbWUsIHZvaWQgKmRhdGEpIHsKKyNpZiBLTVBfREVCVUcKKyAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIgICAlcz0lOC42ZlxuIiwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwpOworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworfSAvLyBfX2ttcF9zdGdfcHJpbnRfbG9hZF9iYWxhbmNlX2ludGVydmFsCisKKyNlbmRpZiAvKiBVU0VfTE9BRF9CQUxBTkNFICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfSU5JVF9BVF9GT1JLCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wYXJzZV9pbml0X2F0X2ZvcmsoY2hhciBjb25zdCAqbmFtZSwgY2hhciBjb25zdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpIHsKKyAgX19rbXBfc3RnX3BhcnNlX2Jvb2wobmFtZSwgdmFsdWUsICZfX2ttcF9uZWVkX3JlZ2lzdGVyX2F0Zm9yayk7CisgIGlmIChfX2ttcF9uZWVkX3JlZ2lzdGVyX2F0Zm9yaykgeworICAgIF9fa21wX25lZWRfcmVnaXN0ZXJfYXRmb3JrX3NwZWNpZmllZCA9IFRSVUU7CisgIH07Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9pbml0X2F0X2ZvcmsKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3ByaW50X2luaXRfYXRfZm9yayhrbXBfc3RyX2J1Zl90ICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKm5hbWUsIHZvaWQgKmRhdGEpIHsKKyAgX19rbXBfc3RnX3ByaW50X2Jvb2woYnVmZmVyLCBuYW1lLCBfX2ttcF9uZWVkX3JlZ2lzdGVyX2F0Zm9ya19zcGVjaWZpZWQpOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfaW5pdF9hdF9mb3JrCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfU0NIRURVTEUKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3BhcnNlX3NjaGVkdWxlKGNoYXIgY29uc3QgKm5hbWUsIGNoYXIgY29uc3QgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpIHsKKworICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgIHNpemVfdCBsZW5ndGggPSBLTVBfU1RSTEVOKHZhbHVlKTsKKyAgICBpZiAobGVuZ3RoID4gSU5UX01BWCkgeworICAgICAgS01QX1dBUk5JTkcoTG9uZ1ZhbHVlLCBuYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgY2hhciAqc2VtaWNvbG9uOworICAgICAgaWYgKHZhbHVlW2xlbmd0aCAtIDFdID09ICciJyB8fCB2YWx1ZVtsZW5ndGggLSAxXSA9PSAnXCcnKQorICAgICAgICBLTVBfV0FSTklORyhVbmJhbGFuY2VkUXVvdGVzLCBuYW1lKTsKKyAgICAgIGRvIHsKKyAgICAgICAgY2hhciBzZW50aW5lbDsKKworICAgICAgICBzZW1pY29sb24gPSBDQ0FTVChjaGFyICosIHN0cmNocih2YWx1ZSwgJzsnKSk7CisgICAgICAgIGlmICgqdmFsdWUgJiYgc2VtaWNvbG9uICE9IHZhbHVlKSB7CisgICAgICAgICAgY2hhciAqY29tbWEgPSBDQ0FTVChjaGFyICosIHN0cmNocih2YWx1ZSwgJywnKSk7CisKKyAgICAgICAgICBpZiAoY29tbWEpIHsKKyAgICAgICAgICAgICsrY29tbWE7CisgICAgICAgICAgICBzZW50aW5lbCA9ICcsJzsKKyAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHNlbnRpbmVsID0gJzsnOworICAgICAgICAgIGlmICghX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCJzdGF0aWMiLCB2YWx1ZSwgc2VudGluZWwpKSB7CisgICAgICAgICAgICBpZiAoIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCgiZ3JlZWR5IiwgY29tbWEsICc7JykpIHsKKyAgICAgICAgICAgICAgX19rbXBfc3RhdGljID0ga21wX3NjaF9zdGF0aWNfZ3JlZWR5OworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCgiYmFsYW5jZWQiLCBjb21tYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOycpKSB7CisgICAgICAgICAgICAgIF9fa21wX3N0YXRpYyA9IGttcF9zY2hfc3RhdGljX2JhbGFuY2VkOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgaWYgKCFfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoImd1aWRlZCIsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW50aW5lbCkpIHsKKyAgICAgICAgICAgIGlmICghX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCJpdGVyYXRpdmUiLCBjb21tYSwgJzsnKSkgeworICAgICAgICAgICAgICBfX2ttcF9ndWlkZWQgPSBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZDsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoImFuYWx5dGljYWwiLCBjb21tYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOycpKSB7CisgICAgICAgICAgICAgIC8qIGFuYWx5dGljYWwgbm90IGFsbG93ZWQgZm9yIHRvbyBtYW55IHRocmVhZHMgKi8KKyAgICAgICAgICAgICAgX19rbXBfZ3VpZGVkID0ga21wX3NjaF9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgS01QX1dBUk5JTkcoSW52YWxpZENsYXVzZSwgbmFtZSwgdmFsdWUpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICBLTVBfV0FSTklORyhFbXB0eUNsYXVzZSwgbmFtZSk7CisgICAgICB9IHdoaWxlICgodmFsdWUgPSBzZW1pY29sb24gPyBzZW1pY29sb24gKyAxIDogTlVMTCkpOworICAgIH0KKyAgfTsgLy8gaWYKKworfSAvLyBfX2ttcF9zdGdfcGFyc2VfX3NjaGVkdWxlCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wcmludF9zY2hlZHVsZShrbXBfc3RyX2J1Zl90ICpidWZmZXIsIGNoYXIgY29uc3QgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICBpZiAoX19rbXBfZW52X2Zvcm1hdCkgeworICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgobmFtZSk7CisgIH0gZWxzZSB7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIgICAlcz0nIiwgbmFtZSk7CisgIH0KKyAgaWYgKF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19ncmVlZHkpIHsKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIiVzIiwgInN0YXRpYyxncmVlZHkiKTsKKyAgfSBlbHNlIGlmIChfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQpIHsKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIiVzIiwgInN0YXRpYyxiYWxhbmNlZCIpOworICB9CisgIGlmIChfX2ttcF9ndWlkZWQgPT0ga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQpIHsKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIjslcydcbiIsICJndWlkZWQsaXRlcmF0aXZlIik7CisgIH0gZWxzZSBpZiAoX19rbXBfZ3VpZGVkID09IGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZCkgeworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiOyVzJ1xuIiwgImd1aWRlZCxhbmFseXRpY2FsIik7CisgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X3NjaGVkdWxlCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPTVBfU0NIRURVTEUKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3BhcnNlX29tcF9zY2hlZHVsZShjaGFyIGNvbnN0ICpuYW1lLCBjaGFyIGNvbnN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICBzaXplX3QgbGVuZ3RoOworICBpZiAodmFsdWUpIHsKKyAgICBsZW5ndGggPSBLTVBfU1RSTEVOKHZhbHVlKTsKKyAgICBpZiAobGVuZ3RoKSB7CisgICAgICBjaGFyICpjb21tYSA9IENDQVNUKGNoYXIgKiwgc3RyY2hyKHZhbHVlLCAnLCcpKTsKKyAgICAgIGlmICh2YWx1ZVtsZW5ndGggLSAxXSA9PSAnIicgfHwgdmFsdWVbbGVuZ3RoIC0gMV0gPT0gJ1wnJykKKyAgICAgICAgS01QX1dBUk5JTkcoVW5iYWxhbmNlZFF1b3RlcywgbmFtZSk7CisgICAgICAvKiBnZXQgdGhlIHNwZWNpZmllZCBzY2hlZHVsaW5nIHN0eWxlICovCisgICAgICBpZiAoIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCgiZHluYW1pYyIsIHZhbHVlLCAnLCcpKSAvKiBEWU5BTUlDICovCisgICAgICAgIF9fa21wX3NjaGVkID0ga21wX3NjaF9keW5hbWljX2NodW5rZWQ7CisgICAgICBlbHNlIGlmICghX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCJndWlkZWQiLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJywnKSkgLyogR1VJREVEICovCisgICAgICAgIF9fa21wX3NjaGVkID0ga21wX3NjaF9ndWlkZWRfY2h1bmtlZDsKKyAgICAgIC8vIEFDOiBUT0RPOiBhZGQgQVVUTyBzY2hlZHVsZSwgYW5kIHBwcm9iYWJseSByZW1vdmUgVFJBUEVaT0lEQUwgKE9NUCAzLjAKKyAgICAgIC8vIGRvZXMgbm90IGFsbG93IGl0KQorICAgICAgZWxzZSBpZiAoIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCgiYXV0byIsIHZhbHVlLCAnLCcpKSB7IC8qIEFVVE8gKi8KKyAgICAgICAgX19rbXBfc2NoZWQgPSBrbXBfc2NoX2F1dG87CisgICAgICAgIGlmIChjb21tYSkgeworICAgICAgICAgIF9fa21wX21zZyhrbXBfbXNfd2FybmluZywgS01QX01TRyhJZ25vcmVDaHVuaywgbmFtZSwgY29tbWEpLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCk7CisgICAgICAgICAgY29tbWEgPSBOVUxMOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKCFfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoInRyYXBlem9pZGFsIiwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJywnKSkgLyogVFJBUEVaT0lEQUwgKi8KKyAgICAgICAgX19rbXBfc2NoZWQgPSBrbXBfc2NoX3RyYXBlem9pZGFsOworICAgICAgZWxzZSBpZiAoIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCgic3RhdGljIiwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcsJykpIC8qIFNUQVRJQyAqLworICAgICAgICBfX2ttcF9zY2hlZCA9IGttcF9zY2hfc3RhdGljOworI2lmIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRAorICAgICAgZWxzZSBpZiAoIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCgic3RhdGljX3N0ZWFsIiwgdmFsdWUsICcsJykpCisgICAgICAgIF9fa21wX3NjaGVkID0ga21wX3NjaF9zdGF0aWNfc3RlYWw7CisjZW5kaWYKKyAgICAgIGVsc2UgeworICAgICAgICBLTVBfV0FSTklORyhTdGdJbnZhbGlkVmFsdWUsIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgdmFsdWUgPSBOVUxMOyAvKiBza2lwIHByb2Nlc3Npbmcgb2YgY29tbWEgKi8KKyAgICAgIH0KKyAgICAgIGlmICh2YWx1ZSAmJiBjb21tYSkgeworICAgICAgICBfX2ttcF9lbnZfY2h1bmsgPSBUUlVFOworCisgICAgICAgIGlmIChfX2ttcF9zY2hlZCA9PSBrbXBfc2NoX3N0YXRpYykKKyAgICAgICAgICBfX2ttcF9zY2hlZCA9IGttcF9zY2hfc3RhdGljX2NodW5rZWQ7CisgICAgICAgICsrY29tbWE7CisgICAgICAgIF9fa21wX2NodW5rID0gX19rbXBfc3RyX3RvX2ludChjb21tYSwgMCk7CisgICAgICAgIGlmIChfX2ttcF9jaHVuayA8IDEpIHsKKyAgICAgICAgICBfX2ttcF9jaHVuayA9IEtNUF9ERUZBVUxUX0NIVU5LOworICAgICAgICAgIF9fa21wX21zZyhrbXBfbXNfd2FybmluZywgS01QX01TRyhJbnZhbGlkQ2h1bmssIG5hbWUsIGNvbW1hKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwpOworICAgICAgICAgIEtNUF9JTkZPUk0oVXNpbmdfaW50X1ZhbHVlLCBuYW1lLCBfX2ttcF9jaHVuayk7CisgICAgICAgICAgLy8gQUM6IG5leHQgYmxvY2sgY29tbWVudGVkIG91dCB1bnRpbCBLTVBfREVGQVVMVF9DSFVOSyAhPQorICAgICAgICAgIC8vIEtNUF9NSU5fQ0hVTksgKHRvIGltcHJvdmUgY29kZSBjb3ZlcmFnZSA6KQorICAgICAgICAgIC8vICAgICBUaGUgZGVmYXVsdCBjaHVuayBzaXplIGlzIDEgYWNjb3JkaW5nIHRvIHN0YW5kYXJkLCB0aHVzIG1ha2luZworICAgICAgICAgIC8vICAgICBLTVBfTUlOX0NIVU5LIG5vdCAxIHdlIHdvdWxkIGludHJvZHVjZSBtZXNzOgorICAgICAgICAgIC8vICAgICB3cm9uZyBjaHVuayBiZWNvbWVzIDEsIGJ1dCBpdCB3aWxsIGJlIGltcG9zc2libGUgdG8gZXhwbGljaXRlbHkKKyAgICAgICAgICAvLyAgICAgc2V0IDEsIGJlY2F1c2UgaXQgYmVjb21lcyBLTVBfTUlOX0NIVU5LLi4uCisgICAgICAgICAgLy8gICAgICAgICAgICAgICAgfSBlbHNlIGlmICggX19rbXBfY2h1bmsgPCBLTVBfTUlOX0NIVU5LICkgeworICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBfX2ttcF9jaHVuayA9IEtNUF9NSU5fQ0hVTks7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfY2h1bmsgPiBLTVBfTUFYX0NIVU5LKSB7CisgICAgICAgICAgX19rbXBfY2h1bmsgPSBLTVBfTUFYX0NIVU5LOworICAgICAgICAgIF9fa21wX21zZyhrbXBfbXNfd2FybmluZywgS01QX01TRyhMYXJnZUNodW5rLCBuYW1lLCBjb21tYSksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsKTsKKyAgICAgICAgICBLTVBfSU5GT1JNKFVzaW5nX2ludF9WYWx1ZSwgbmFtZSwgX19rbXBfY2h1bmspOworICAgICAgICB9CisgICAgICB9IGVsc2UKKyAgICAgICAgX19rbXBfZW52X2NodW5rID0gRkFMU0U7CisgICAgfSBlbHNlCisgICAgICBLTVBfV0FSTklORyhFbXB0eVN0cmluZywgbmFtZSk7CisgIH0KKyAgS19ESUFHKDEsICgiX19rbXBfc3RhdGljID09ICVkXG4iLCBfX2ttcF9zdGF0aWMpKQorICBLX0RJQUcoMSwgKCJfX2ttcF9ndWlkZWQgPT0gJWRcbiIsIF9fa21wX2d1aWRlZCkpCisgIEtfRElBRygxLCAoIl9fa21wX3NjaGVkID09ICVkXG4iLCBfX2ttcF9zY2hlZCkpCisgIEtfRElBRygxLCAoIl9fa21wX2NodW5rID09ICVkXG4iLCBfX2ttcF9jaHVuaykpCit9IC8vIF9fa21wX3N0Z19wYXJzZV9vbXBfc2NoZWR1bGUKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3ByaW50X29tcF9zY2hlZHVsZShrbXBfc3RyX2J1Zl90ICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKm5hbWUsIHZvaWQgKmRhdGEpIHsKKyAgaWYgKF9fa21wX2Vudl9mb3JtYXQpIHsKKyAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKG5hbWUpOworICB9IGVsc2UgeworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiICAgJXM9JyIsIG5hbWUpOworICB9CisgIGlmIChfX2ttcF9jaHVuaykgeworICAgIHN3aXRjaCAoX19rbXBfc2NoZWQpIHsKKyAgICBjYXNlIGttcF9zY2hfZHluYW1pY19jaHVua2VkOgorICAgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIlcywlZCdcbiIsICJkeW5hbWljIiwgX19rbXBfY2h1bmspOworICAgICAgYnJlYWs7CisgICAgY2FzZSBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZDoKKyAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZDoKKyAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiJXMsJWQnXG4iLCAiZ3VpZGVkIiwgX19rbXBfY2h1bmspOworICAgICAgYnJlYWs7CisgICAgY2FzZSBrbXBfc2NoX3RyYXBlem9pZGFsOgorICAgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIlcywlZCdcbiIsICJ0cmFwZXpvaWRhbCIsIF9fa21wX2NodW5rKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Uga21wX3NjaF9zdGF0aWM6CisgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19jaHVua2VkOgorICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQ6CisgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19ncmVlZHk6CisgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIiVzLCVkJ1xuIiwgInN0YXRpYyIsIF9fa21wX2NodW5rKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfc3RlYWw6CisgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIiVzLCVkJ1xuIiwgInN0YXRpY19zdGVhbCIsIF9fa21wX2NodW5rKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Uga21wX3NjaF9hdXRvOgorICAgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIlcywlZCdcbiIsICJhdXRvIiwgX19rbXBfY2h1bmspOworICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgeworICAgIHN3aXRjaCAoX19rbXBfc2NoZWQpIHsKKyAgICBjYXNlIGttcF9zY2hfZHluYW1pY19jaHVua2VkOgorICAgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIlcydcbiIsICJkeW5hbWljIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkOgorICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkOgorICAgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIlcydcbiIsICJndWlkZWQiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Uga21wX3NjaF90cmFwZXpvaWRhbDoKKyAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiJXMnXG4iLCAidHJhcGV6b2lkYWwiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Uga21wX3NjaF9zdGF0aWM6CisgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19jaHVua2VkOgorICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQ6CisgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19ncmVlZHk6CisgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIiVzJ1xuIiwgInN0YXRpYyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19zdGVhbDoKKyAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiJXMnXG4iLCAic3RhdGljX3N0ZWFsIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIGttcF9zY2hfYXV0bzoKKyAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiJXMnXG4iLCAiYXV0byIpOworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9vbXBfc2NoZWR1bGUKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9BVE9NSUNfTU9ERQorCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcGFyc2VfYXRvbWljX21vZGUoY2hhciBjb25zdCAqbmFtZSwgY2hhciBjb25zdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICAvLyBNb2RlczogMCAtLSBkbyBub3QgY2hhbmdlIGRlZmF1bHQ7IDEgLS0gSW50ZWwgcGVyZiBtb2RlLCAyIC0tIEdPTVAKKyAgLy8gY29tcGF0aWJpbGl0eSBtb2RlLgorICBpbnQgbW9kZSA9IDA7CisgIGludCBtYXggPSAxOworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICBtYXggPSAyOworI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworICBfX2ttcF9zdGdfcGFyc2VfaW50KG5hbWUsIHZhbHVlLCAwLCBtYXgsICZtb2RlKTsKKyAgLy8gVE9ETzsgcGFyc2VfaW50IGlzIG5vdCB2ZXJ5IHN1aXRhYmxlIGZvciB0aGlzIGNhc2UuIEluIGNhc2Ugb2Ygb3ZlcmZsb3cgaXQKKyAgLy8gaXMgYmV0dGVyIHRvIHVzZQorICAvLyAwIHJhdGhlciB0aGF0IG1heCB2YWx1ZS4KKyAgaWYgKG1vZGUgPiAwKSB7CisgICAgX19rbXBfYXRvbWljX21vZGUgPSBtb2RlOworICB9OyAvLyBpZgorfSAvLyBfX2ttcF9zdGdfcGFyc2VfYXRvbWljX21vZGUKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3ByaW50X2F0b21pY19tb2RlKGttcF9zdHJfYnVmX3QgKmJ1ZmZlciwgY2hhciBjb25zdCAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKSB7CisgIF9fa21wX3N0Z19wcmludF9pbnQoYnVmZmVyLCBuYW1lLCBfX2ttcF9hdG9taWNfbW9kZSk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9hdG9taWNfbW9kZQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0NPTlNJU1RFTkNZX0NIRUNLCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wYXJzZV9jb25zaXN0ZW5jeV9jaGVjayhjaGFyIGNvbnN0ICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKnZhbHVlLCB2b2lkICpkYXRhKSB7CisgIGlmICghX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCJhbGwiLCB2YWx1ZSwgMCkpIHsKKyAgICAvLyBOb3RlLCB0aGlzIHdpbGwgbm90IHdvcmsgZnJvbSBrbXBfc2V0X2RlZmF1bHRzIGJlY2F1c2UgdGhfY29ucyBzdGFjayB3YXMKKyAgICAvLyBub3QgYWxsb2NhdGVkCisgICAgLy8gZm9yIGV4aXN0ZWQgdGhyZWFkKHMpIHRodXMgdGhlIGZpcnN0IF9fa21wX3B1c2hfPGNvbnN0cnVjdD4gd2lsbCBicmVhaworICAgIC8vIHdpdGggYXNzZXJ0aW9uLgorICAgIC8vIFRPRE86IGFsbG9jYXRlIHRoX2NvbnMgaWYgY2FsbGVkIGZyb20ga21wX3NldF9kZWZhdWx0cy4KKyAgICBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgPSBUUlVFOworICB9IGVsc2UgaWYgKCFfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoIm5vbmUiLCB2YWx1ZSwgMCkpIHsKKyAgICBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgPSBGQUxTRTsKKyAgfSBlbHNlIHsKKyAgICBLTVBfV0FSTklORyhTdGdJbnZhbGlkVmFsdWUsIG5hbWUsIHZhbHVlKTsKKyAgfTsgLy8gaWYKK30gLy8gX19rbXBfc3RnX3BhcnNlX2NvbnNpc3RlbmN5X2NoZWNrCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wcmludF9jb25zaXN0ZW5jeV9jaGVjayhrbXBfc3RyX2J1Zl90ICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqbmFtZSwgdm9pZCAqZGF0YSkgeworI2lmIEtNUF9ERUJVRworICBjb25zdCBjaGFyICp2YWx1ZSA9IE5VTEw7CisKKyAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgIHZhbHVlID0gImFsbCI7CisgIH0gZWxzZSB7CisgICAgdmFsdWUgPSAibm9uZSI7CisgIH0KKworICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgIF9fa21wX3N0Z19wcmludF9zdHIoYnVmZmVyLCBuYW1lLCB2YWx1ZSk7CisgIH0KKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KK30gLy8gX19rbXBfc3RnX3ByaW50X2NvbnNpc3RlbmN5X2NoZWNrCisKKyNpZiBVU0VfSVRUX0JVSUxECisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0lUVF9QUkVQQVJFX0RFTEFZCisKKyNpZiBVU0VfSVRUX05PVElGWQorCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcGFyc2VfaXR0X3ByZXBhcmVfZGVsYXkoY2hhciBjb25zdCAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0ICp2YWx1ZSwgdm9pZCAqZGF0YSkgeworICAvLyBFeHBlcmltZW50YWwgY29kZTogS01QX0lUVF9QUkVQQVJFX0RFTEFZIHNwZWNpZmllcyBudW1iZXJ0IG9mIGxvb3AKKyAgLy8gaXRlcmF0aW9ucy4KKyAgaW50IGRlbGF5ID0gMDsKKyAgX19rbXBfc3RnX3BhcnNlX2ludChuYW1lLCB2YWx1ZSwgMCwgSU5UX01BWCwgJmRlbGF5KTsKKyAgX19rbXBfaXR0X3ByZXBhcmVfZGVsYXkgPSBkZWxheTsKK30gLy8gX19rbXBfc3RyX3BhcnNlX2l0dF9wcmVwYXJlX2RlbGF5CisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wcmludF9pdHRfcHJlcGFyZV9kZWxheShrbXBfc3RyX2J1Zl90ICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqbmFtZSwgdm9pZCAqZGF0YSkgeworICBfX2ttcF9zdGdfcHJpbnRfdWludDY0KGJ1ZmZlciwgbmFtZSwgX19rbXBfaXR0X3ByZXBhcmVfZGVsYXkpOworCit9IC8vIF9fa21wX3N0cl9wcmludF9pdHRfcHJlcGFyZV9kZWxheQorCisjZW5kaWYgLy8gVVNFX0lUVF9OT1RJRlkKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfTUFMTE9DX1BPT0xfSU5DUgorCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcGFyc2VfbWFsbG9jX3Bvb2xfaW5jcihjaGFyIGNvbnN0ICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqdmFsdWUsIHZvaWQgKmRhdGEpIHsKKyAgX19rbXBfc3RnX3BhcnNlX3NpemUobmFtZSwgdmFsdWUsIEtNUF9NSU5fTUFMTE9DX1BPT0xfSU5DUiwKKyAgICAgICAgICAgICAgICAgICAgICAgS01QX01BWF9NQUxMT0NfUE9PTF9JTkNSLCBOVUxMLCAmX19rbXBfbWFsbG9jX3Bvb2xfaW5jciwKKyAgICAgICAgICAgICAgICAgICAgICAgMSk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9tYWxsb2NfcG9vbF9pbmNyCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wcmludF9tYWxsb2NfcG9vbF9pbmNyKGttcF9zdHJfYnVmX3QgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKm5hbWUsIHZvaWQgKmRhdGEpIHsKKyAgX19rbXBfc3RnX3ByaW50X3NpemUoYnVmZmVyLCBuYW1lLCBfX2ttcF9tYWxsb2NfcG9vbF9pbmNyKTsKKworfSAvLyBfa21wX3N0Z19wcmludF9tYWxsb2NfcG9vbF9pbmNyCisKKyNpZmRlZiBLTVBfREVCVUcKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9QQVJfUkFOR0UKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3BhcnNlX3Bhcl9yYW5nZV9lbnYoY2hhciBjb25zdCAqbmFtZSwgY2hhciBjb25zdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKSB7CisgIF9fa21wX3N0Z19wYXJzZV9wYXJfcmFuZ2UobmFtZSwgdmFsdWUsICZfX2ttcF9wYXJfcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfcGFyX3JhbmdlX3JvdXRpbmUsIF9fa21wX3Bhcl9yYW5nZV9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX19rbXBfcGFyX3JhbmdlX2xiLCAmX19rbXBfcGFyX3JhbmdlX3ViKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3Bhcl9yYW5nZV9lbnYKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3ByaW50X3Bhcl9yYW5nZV9lbnYoa21wX3N0cl9idWZfdCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqbmFtZSwgdm9pZCAqZGF0YSkgeworICBpZiAoX19rbXBfcGFyX3JhbmdlICE9IDApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKGJ1ZmZlciwgbmFtZSwgcGFyX3JhbmdlX3RvX3ByaW50KTsKKyAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfcGFyX3JhbmdlX2VudgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1lJRUxEX0NZQ0xFLCBLTVBfWUlFTERfT04sIEtNUF9ZSUVMRF9PRkYKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3BhcnNlX3lpZWxkX2N5Y2xlKGNoYXIgY29uc3QgKm5hbWUsIGNoYXIgY29uc3QgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpIHsKKyAgaW50IGZsYWcgPSBfX2ttcF95aWVsZF9jeWNsZTsKKyAgX19rbXBfc3RnX3BhcnNlX2Jvb2wobmFtZSwgdmFsdWUsICZmbGFnKTsKKyAgX19rbXBfeWllbGRfY3ljbGUgPSBmbGFnOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfeWllbGRfY3ljbGUKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3ByaW50X3lpZWxkX2N5Y2xlKGttcF9zdHJfYnVmX3QgKmJ1ZmZlciwgY2hhciBjb25zdCAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKSB7CisgIF9fa21wX3N0Z19wcmludF9ib29sKGJ1ZmZlciwgbmFtZSwgX19rbXBfeWllbGRfY3ljbGUpOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfeWllbGRfY3ljbGUKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3BhcnNlX3lpZWxkX29uKGNoYXIgY29uc3QgKm5hbWUsIGNoYXIgY29uc3QgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpIHsKKyAgX19rbXBfc3RnX3BhcnNlX2ludChuYW1lLCB2YWx1ZSwgMiwgSU5UX01BWCwgJl9fa21wX3lpZWxkX29uX2NvdW50KTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3lpZWxkX29uCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wcmludF95aWVsZF9vbihrbXBfc3RyX2J1Zl90ICpidWZmZXIsIGNoYXIgY29uc3QgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICBfX2ttcF9zdGdfcHJpbnRfaW50KGJ1ZmZlciwgbmFtZSwgX19rbXBfeWllbGRfb25fY291bnQpOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfeWllbGRfb24KKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3BhcnNlX3lpZWxkX29mZihjaGFyIGNvbnN0ICpuYW1lLCBjaGFyIGNvbnN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICBfX2ttcF9zdGdfcGFyc2VfaW50KG5hbWUsIHZhbHVlLCAyLCBJTlRfTUFYLCAmX19rbXBfeWllbGRfb2ZmX2NvdW50KTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3lpZWxkX29mZgorCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcHJpbnRfeWllbGRfb2ZmKGttcF9zdHJfYnVmX3QgKmJ1ZmZlciwgY2hhciBjb25zdCAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICBfX2ttcF9zdGdfcHJpbnRfaW50KGJ1ZmZlciwgbmFtZSwgX19rbXBfeWllbGRfb2ZmX2NvdW50KTsKK30gLy8gX19rbXBfc3RnX3ByaW50X3lpZWxkX29mZgorCisjZW5kaWYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9JTklUX1dBSVQsIEtNUF9ORVhUX1dBSVQKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3BhcnNlX2luaXRfd2FpdChjaGFyIGNvbnN0ICpuYW1lLCBjaGFyIGNvbnN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICBpbnQgd2FpdDsKKyAgS01QX0FTU0VSVCgoX19rbXBfaW5pdF93YWl0ICYgMSkgPT0gMCk7CisgIHdhaXQgPSBfX2ttcF9pbml0X3dhaXQgLyAyOworICBfX2ttcF9zdGdfcGFyc2VfaW50KG5hbWUsIHZhbHVlLCBLTVBfTUlOX0lOSVRfV0FJVCwgS01QX01BWF9JTklUX1dBSVQsICZ3YWl0KTsKKyAgX19rbXBfaW5pdF93YWl0ID0gd2FpdCAqIDI7CisgIEtNUF9BU1NFUlQoKF9fa21wX2luaXRfd2FpdCAmIDEpID09IDApOworICBfX2ttcF95aWVsZF9pbml0ID0gX19rbXBfaW5pdF93YWl0OworfSAvLyBfX2ttcF9zdGdfcGFyc2VfaW5pdF93YWl0CisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wcmludF9pbml0X3dhaXQoa21wX3N0cl9idWZfdCAqYnVmZmVyLCBjaGFyIGNvbnN0ICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKSB7CisgIF9fa21wX3N0Z19wcmludF9pbnQoYnVmZmVyLCBuYW1lLCBfX2ttcF9pbml0X3dhaXQpOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfaW5pdF93YWl0CisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wYXJzZV9uZXh0X3dhaXQoY2hhciBjb25zdCAqbmFtZSwgY2hhciBjb25zdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpIHsKKyAgaW50IHdhaXQ7CisgIEtNUF9BU1NFUlQoKF9fa21wX25leHRfd2FpdCAmIDEpID09IDApOworICB3YWl0ID0gX19rbXBfbmV4dF93YWl0IC8gMjsKKyAgX19rbXBfc3RnX3BhcnNlX2ludChuYW1lLCB2YWx1ZSwgS01QX01JTl9ORVhUX1dBSVQsIEtNUF9NQVhfTkVYVF9XQUlULCAmd2FpdCk7CisgIF9fa21wX25leHRfd2FpdCA9IHdhaXQgKiAyOworICBLTVBfQVNTRVJUKChfX2ttcF9uZXh0X3dhaXQgJiAxKSA9PSAwKTsKKyAgX19rbXBfeWllbGRfbmV4dCA9IF9fa21wX25leHRfd2FpdDsKK30gLy8gX19rbXBfc3RnX3BhcnNlX25leHRfd2FpdAorCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcHJpbnRfbmV4dF93YWl0KGttcF9zdHJfYnVmX3QgKmJ1ZmZlciwgY2hhciBjb25zdCAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICBfX2ttcF9zdGdfcHJpbnRfaW50KGJ1ZmZlciwgbmFtZSwgX19rbXBfbmV4dF93YWl0KTsKK30gLy9fX2ttcF9zdGdfcHJpbnRfbmV4dF93YWl0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfR1RJRF9NT0RFCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wYXJzZV9ndGlkX21vZGUoY2hhciBjb25zdCAqbmFtZSwgY2hhciBjb25zdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpIHsKKyAgLy8gTW9kZXM6CisgIC8vICAgMCAtLSBkbyBub3QgY2hhbmdlIGRlZmF1bHQKKyAgLy8gICAxIC0tIHNwIHNlYXJjaAorICAvLyAgIDIgLS0gdXNlICJrZXllZCIgVExTIHZhciwgaS5lLgorICAvLyAgICAgICAgcHRocmVhZF9nZXRzcGVjaWZpYyhMaW51eCogT1MvT1MgWCopIG9yIFRsc0dldFZhbHVlKFdpbmRvd3MqIE9TKQorICAvLyAgIDMgLS0gX19kZWNsc3BlYyh0aHJlYWQpIFRMUyB2YXIgaW4gdGRhdGEgc2VjdGlvbgorICBpbnQgbW9kZSA9IDA7CisgIGludCBtYXggPSAyOworI2lmZGVmIEtNUF9UREFUQV9HVElECisgIG1heCA9IDM7CisjZW5kaWYgLyogS01QX1REQVRBX0dUSUQgKi8KKyAgX19rbXBfc3RnX3BhcnNlX2ludChuYW1lLCB2YWx1ZSwgMCwgbWF4LCAmbW9kZSk7CisgIC8vIFRPRE87IHBhcnNlX2ludCBpcyBub3QgdmVyeSBzdWl0YWJsZSBmb3IgdGhpcyBjYXNlLiBJbiBjYXNlIG9mIG92ZXJmbG93IGl0CisgIC8vIGlzIGJldHRlciB0byB1c2UgMCByYXRoZXIgdGhhdCBtYXggdmFsdWUuCisgIGlmIChtb2RlID09IDApIHsKKyAgICBfX2ttcF9hZGp1c3RfZ3RpZF9tb2RlID0gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBfX2ttcF9ndGlkX21vZGUgPSBtb2RlOworICAgIF9fa21wX2FkanVzdF9ndGlkX21vZGUgPSBGQUxTRTsKKyAgfTsgLy8gaWYKK30gLy8gX19rbXBfc3RyX3BhcnNlX2d0aWRfbW9kZQorCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcHJpbnRfZ3RpZF9tb2RlKGttcF9zdHJfYnVmX3QgKmJ1ZmZlciwgY2hhciBjb25zdCAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICBpZiAoX19rbXBfYWRqdXN0X2d0aWRfbW9kZSkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoYnVmZmVyLCBuYW1lLCAwKTsKKyAgfSBlbHNlIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KGJ1ZmZlciwgbmFtZSwgX19rbXBfZ3RpZF9tb2RlKTsKKyAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfZ3RpZF9tb2RlCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfTlVNX0xPQ0tTX0lOX0JMT0NLCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wYXJzZV9sb2NrX2Jsb2NrKGNoYXIgY29uc3QgKm5hbWUsIGNoYXIgY29uc3QgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICBfX2ttcF9zdGdfcGFyc2VfaW50KG5hbWUsIHZhbHVlLCAwLCBLTVBfSU5UX01BWCwgJl9fa21wX251bV9sb2Nrc19pbl9ibG9jayk7Cit9IC8vIF9fa21wX3N0cl9wYXJzZV9sb2NrX2Jsb2NrCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wcmludF9sb2NrX2Jsb2NrKGttcF9zdHJfYnVmX3QgKmJ1ZmZlciwgY2hhciBjb25zdCAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpIHsKKyAgX19rbXBfc3RnX3ByaW50X2ludChidWZmZXIsIG5hbWUsIF9fa21wX251bV9sb2Nrc19pbl9ibG9jayk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9sb2NrX2Jsb2NrCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfTE9DS19LSU5ECisKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworI2RlZmluZSBLTVBfU1RPUkVfTE9DS19TRVEoYSkgKF9fa21wX3VzZXJfbG9ja19zZXEgPSBsb2Nrc2VxXyMjYSkKKyNlbHNlCisjZGVmaW5lIEtNUF9TVE9SRV9MT0NLX1NFUShhKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wYXJzZV9sb2NrX2tpbmQoY2hhciBjb25zdCAqbmFtZSwgY2hhciBjb25zdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpIHsKKyAgaWYgKF9fa21wX2luaXRfdXNlcl9sb2NrcykgeworICAgIEtNUF9XQVJOSU5HKEVudkxvY2tXYXJuLCBuYW1lKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoX19rbXBfc3RyX21hdGNoKCJ0YXMiLCAyLCB2YWx1ZSkgfHwKKyAgICAgIF9fa21wX3N0cl9tYXRjaCgidGVzdCBhbmQgc2V0IiwgMiwgdmFsdWUpIHx8CisgICAgICBfX2ttcF9zdHJfbWF0Y2goInRlc3RfYW5kX3NldCIsIDIsIHZhbHVlKSB8fAorICAgICAgX19rbXBfc3RyX21hdGNoKCJ0ZXN0LWFuZC1zZXQiLCAyLCB2YWx1ZSkgfHwKKyAgICAgIF9fa21wX3N0cl9tYXRjaCgidGVzdCBhbmRzZXQiLCAyLCB2YWx1ZSkgfHwKKyAgICAgIF9fa21wX3N0cl9tYXRjaCgidGVzdF9hbmRzZXQiLCAyLCB2YWx1ZSkgfHwKKyAgICAgIF9fa21wX3N0cl9tYXRjaCgidGVzdC1hbmRzZXQiLCAyLCB2YWx1ZSkgfHwKKyAgICAgIF9fa21wX3N0cl9tYXRjaCgidGVzdGFuZCBzZXQiLCAyLCB2YWx1ZSkgfHwKKyAgICAgIF9fa21wX3N0cl9tYXRjaCgidGVzdGFuZF9zZXQiLCAyLCB2YWx1ZSkgfHwKKyAgICAgIF9fa21wX3N0cl9tYXRjaCgidGVzdGFuZC1zZXQiLCAyLCB2YWx1ZSkgfHwKKyAgICAgIF9fa21wX3N0cl9tYXRjaCgidGVzdGFuZHNldCIsIDIsIHZhbHVlKSkgeworICAgIF9fa21wX3VzZXJfbG9ja19raW5kID0gbGtfdGFzOworICAgIEtNUF9TVE9SRV9MT0NLX1NFUSh0YXMpOworICB9CisjaWYgS01QX1VTRV9GVVRFWAorICBlbHNlIGlmIChfX2ttcF9zdHJfbWF0Y2goImZ1dGV4IiwgMSwgdmFsdWUpKSB7CisgICAgaWYgKF9fa21wX2Z1dGV4X2RldGVybWluZV9jYXBhYmxlKCkpIHsKKyAgICAgIF9fa21wX3VzZXJfbG9ja19raW5kID0gbGtfZnV0ZXg7CisgICAgICBLTVBfU1RPUkVfTE9DS19TRVEoZnV0ZXgpOworICAgIH0gZWxzZSB7CisgICAgICBLTVBfV0FSTklORyhGdXRleE5vdFN1cHBvcnRlZCwgbmFtZSwgdmFsdWUpOworICAgIH0KKyAgfQorI2VuZGlmCisgIGVsc2UgaWYgKF9fa21wX3N0cl9tYXRjaCgidGlja2V0IiwgMiwgdmFsdWUpKSB7CisgICAgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa190aWNrZXQ7CisgICAgS01QX1NUT1JFX0xPQ0tfU0VRKHRpY2tldCk7CisgIH0gZWxzZSBpZiAoX19rbXBfc3RyX21hdGNoKCJxdWV1aW5nIiwgMSwgdmFsdWUpIHx8CisgICAgICAgICAgICAgX19rbXBfc3RyX21hdGNoKCJxdWV1ZSIsIDEsIHZhbHVlKSkgeworICAgIF9fa21wX3VzZXJfbG9ja19raW5kID0gbGtfcXVldWluZzsKKyAgICBLTVBfU1RPUkVfTE9DS19TRVEocXVldWluZyk7CisgIH0gZWxzZSBpZiAoX19rbXBfc3RyX21hdGNoKCJkcmRwYSB0aWNrZXQiLCAxLCB2YWx1ZSkgfHwKKyAgICAgICAgICAgICBfX2ttcF9zdHJfbWF0Y2goImRyZHBhX3RpY2tldCIsIDEsIHZhbHVlKSB8fAorICAgICAgICAgICAgIF9fa21wX3N0cl9tYXRjaCgiZHJkcGEtdGlja2V0IiwgMSwgdmFsdWUpIHx8CisgICAgICAgICAgICAgX19rbXBfc3RyX21hdGNoKCJkcmRwYXRpY2tldCIsIDEsIHZhbHVlKSB8fAorICAgICAgICAgICAgIF9fa21wX3N0cl9tYXRjaCgiZHJkcGEiLCAxLCB2YWx1ZSkpIHsKKyAgICBfX2ttcF91c2VyX2xvY2tfa2luZCA9IGxrX2RyZHBhOworICAgIEtNUF9TVE9SRV9MT0NLX1NFUShkcmRwYSk7CisgIH0KKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgIGVsc2UgaWYgKF9fa21wX3N0cl9tYXRjaCgiYWRhcHRpdmUiLCAxLCB2YWx1ZSkpIHsKKyAgICBpZiAoX19rbXBfY3B1aW5mby5ydG0pIHsgLy8gPz8/IElzIGNwdWluZm8gYXZhaWxhYmxlIGhlcmU/CisgICAgICBfX2ttcF91c2VyX2xvY2tfa2luZCA9IGxrX2FkYXB0aXZlOworICAgICAgS01QX1NUT1JFX0xPQ0tfU0VRKGFkYXB0aXZlKTsKKyAgICB9IGVsc2UgeworICAgICAgS01QX1dBUk5JTkcoQWRhcHRpdmVOb3RTdXBwb3J0ZWQsIG5hbWUsIHZhbHVlKTsKKyAgICAgIF9fa21wX3VzZXJfbG9ja19raW5kID0gbGtfcXVldWluZzsKKyAgICAgIEtNUF9TVE9SRV9MT0NLX1NFUShxdWV1aW5nKTsKKyAgICB9CisgIH0KKyNlbmRpZiAvLyBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sgJiYgS01QX1VTRV9UU1gKKyAgZWxzZSBpZiAoX19rbXBfc3RyX21hdGNoKCJydG0iLCAxLCB2YWx1ZSkpIHsKKyAgICBpZiAoX19rbXBfY3B1aW5mby5ydG0pIHsKKyAgICAgIF9fa21wX3VzZXJfbG9ja19raW5kID0gbGtfcnRtOworICAgICAgS01QX1NUT1JFX0xPQ0tfU0VRKHJ0bSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEtNUF9XQVJOSU5HKEFkYXB0aXZlTm90U3VwcG9ydGVkLCBuYW1lLCB2YWx1ZSk7CisgICAgICBfX2ttcF91c2VyX2xvY2tfa2luZCA9IGxrX3F1ZXVpbmc7CisgICAgICBLTVBfU1RPUkVfTE9DS19TRVEocXVldWluZyk7CisgICAgfQorICB9IGVsc2UgaWYgKF9fa21wX3N0cl9tYXRjaCgiaGxlIiwgMSwgdmFsdWUpKSB7CisgICAgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa19obGU7CisgICAgS01QX1NUT1JFX0xPQ0tfU0VRKGhsZSk7CisgIH0KKyNlbmRpZgorICBlbHNlIHsKKyAgICBLTVBfV0FSTklORyhTdGdJbnZhbGlkVmFsdWUsIG5hbWUsIHZhbHVlKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcHJpbnRfbG9ja19raW5kKGttcF9zdHJfYnVmX3QgKmJ1ZmZlciwgY2hhciBjb25zdCAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICBjb25zdCBjaGFyICp2YWx1ZSA9IE5VTEw7CisKKyAgc3dpdGNoIChfX2ttcF91c2VyX2xvY2tfa2luZCkgeworICBjYXNlIGxrX2RlZmF1bHQ6CisgICAgdmFsdWUgPSAiZGVmYXVsdCI7CisgICAgYnJlYWs7CisKKyAgY2FzZSBsa190YXM6CisgICAgdmFsdWUgPSAidGFzIjsKKyAgICBicmVhazsKKworI2lmIEtNUF9VU0VfRlVURVgKKyAgY2FzZSBsa19mdXRleDoKKyAgICB2YWx1ZSA9ICJmdXRleCI7CisgICAgYnJlYWs7CisjZW5kaWYKKworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLICYmIEtNUF9VU0VfVFNYCisgIGNhc2UgbGtfcnRtOgorICAgIHZhbHVlID0gInJ0bSI7CisgICAgYnJlYWs7CisKKyAgY2FzZSBsa19obGU6CisgICAgdmFsdWUgPSAiaGxlIjsKKyAgICBicmVhazsKKyNlbmRpZgorCisgIGNhc2UgbGtfdGlja2V0OgorICAgIHZhbHVlID0gInRpY2tldCI7CisgICAgYnJlYWs7CisKKyAgY2FzZSBsa19xdWV1aW5nOgorICAgIHZhbHVlID0gInF1ZXVpbmciOworICAgIGJyZWFrOworCisgIGNhc2UgbGtfZHJkcGE6CisgICAgdmFsdWUgPSAiZHJkcGEiOworICAgIGJyZWFrOworI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyAgY2FzZSBsa19hZGFwdGl2ZToKKyAgICB2YWx1ZSA9ICJhZGFwdGl2ZSI7CisgICAgYnJlYWs7CisjZW5kaWYKKyAgfQorCisgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CisgICAgX19rbXBfc3RnX3ByaW50X3N0cihidWZmZXIsIG5hbWUsIHZhbHVlKTsKKyAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1NQSU5fQkFDS09GRl9QQVJBTVMKKworLy8gS01QX1NQSU5fQkFDS09GRl9QQVJBTVM9bWF4X2JhY2tvZmZbLG1pbl90aWNrXSAobWF4IGJhY2tvZmYgc2l6ZSwgbWluIHRpY2sKKy8vIGZvciBtYWNoaW5lIHBhdXNlKQorc3RhdGljIHZvaWQgX19rbXBfc3RnX3BhcnNlX3NwaW5fYmFja29mZl9wYXJhbXMoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlLCB2b2lkICpkYXRhKSB7CisgIGNvbnN0IGNoYXIgKm5leHQgPSB2YWx1ZTsKKworICBpbnQgdG90YWwgPSAwOyAvLyBDb3VudCBlbGVtZW50cyB0aGF0IHdlcmUgc2V0LiBJdCdsbCBiZSB1c2VkIGFzIGFuIGFycmF5IHNpemUKKyAgaW50IHByZXZfY29tbWEgPSBGQUxTRTsgLy8gRm9yIGNvcnJlY3QgcHJvY2Vzc2luZyBzZXF1ZW50aWFsIGNvbW1hcworICBpbnQgaTsKKworICBrbXBfdWludDMyIG1heF9iYWNrb2ZmID0gX19rbXBfc3Bpbl9iYWNrb2ZmX3BhcmFtcy5tYXhfYmFja29mZjsKKyAga21wX3VpbnQzMiBtaW5fdGljayA9IF9fa21wX3NwaW5fYmFja29mZl9wYXJhbXMubWluX3RpY2s7CisKKyAgLy8gUnVuIG9ubHkgMyBpdGVyYXRpb25zIGJlY2F1c2UgaXQgaXMgZW5vdWdoIHRvIHJlYWQgdHdvIHZhbHVlcyBvciBmaW5kIGEKKyAgLy8gc3ludGF4IGVycm9yCisgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICBTS0lQX1dTKG5leHQpOworCisgICAgaWYgKCpuZXh0ID09ICdcMCcpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAvLyBOZXh0IGNoYXJhY3RlciBpcyBub3QgYW4gaW50ZWdlciBvciBub3QgYSBjb21tYSBPUiBudW1iZXIgb2YgdmFsdWVzID4gMgorICAgIC8vID0+IGVuZCBvZiBsaXN0CisgICAgaWYgKCgoKm5leHQgPCAnMCcgfHwgKm5leHQgPiAnOScpICYmICpuZXh0ICE9ICcsJykgfHwgdG90YWwgPiAyKSB7CisgICAgICBLTVBfV0FSTklORyhFbnZTeW50YXhFcnJvciwgbmFtZSwgdmFsdWUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBUaGUgbmV4dCBjaGFyYWN0ZXIgaXMgJywnCisgICAgaWYgKCpuZXh0ID09ICcsJykgeworICAgICAgLy8gJywnIGlzIHRoZSBmaXNydCBjaGFyYWN0ZXIKKyAgICAgIGlmICh0b3RhbCA9PSAwIHx8IHByZXZfY29tbWEpIHsKKyAgICAgICAgdG90YWwrKzsKKyAgICAgIH0KKyAgICAgIHByZXZfY29tbWEgPSBUUlVFOworICAgICAgbmV4dCsrOyAvLyBza2lwICcsJworICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICB9CisgICAgLy8gTmV4dCBjaGFyYWN0ZXIgaXMgYSBkaWdpdAorICAgIGlmICgqbmV4dCA+PSAnMCcgJiYgKm5leHQgPD0gJzknKSB7CisgICAgICBpbnQgbnVtOworICAgICAgY29uc3QgY2hhciAqYnVmID0gbmV4dDsKKyAgICAgIGNoYXIgY29uc3QgKm1zZyA9IE5VTEw7CisgICAgICBwcmV2X2NvbW1hID0gRkFMU0U7CisgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgIHRvdGFsKys7CisKKyAgICAgIGNvbnN0IGNoYXIgKnRtcCA9IG5leHQ7CisgICAgICBTS0lQX1dTKHRtcCk7CisgICAgICBpZiAoKCpuZXh0ID09ICcgJyB8fCAqbmV4dCA9PSAnXHQnKSAmJiAoKnRtcCA+PSAnMCcgJiYgKnRtcCA8PSAnOScpKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKEVudlNwYWNlc05vdEFsbG93ZWQsIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KGJ1ZiwgKm5leHQpOworICAgICAgaWYgKG51bSA8PSAwKSB7IC8vIFRoZSBudW1iZXIgb2YgcmV0cmllcyBzaG91bGQgYmUgPiAwCisgICAgICAgIG1zZyA9IEtNUF9JMThOX1NUUihWYWx1ZVRvb1NtYWxsKTsKKyAgICAgICAgbnVtID0gMTsKKyAgICAgIH0gZWxzZSBpZiAobnVtID4gS01QX0lOVF9NQVgpIHsKKyAgICAgICAgbXNnID0gS01QX0kxOE5fU1RSKFZhbHVlVG9vTGFyZ2UpOworICAgICAgICBudW0gPSBLTVBfSU5UX01BWDsKKyAgICAgIH0KKyAgICAgIGlmIChtc2cgIT0gTlVMTCkgeworICAgICAgICAvLyBNZXNzYWdlIGlzIG5vdCBlbXB0eS4gUHJpbnQgd2FybmluZy4KKyAgICAgICAgS01QX1dBUk5JTkcoUGFyc2VTaXplSW50V2FybiwgbmFtZSwgdmFsdWUsIG1zZyk7CisgICAgICAgIEtNUF9JTkZPUk0oVXNpbmdfaW50X1ZhbHVlLCBuYW1lLCBudW0pOworICAgICAgfQorICAgICAgaWYgKHRvdGFsID09IDEpIHsKKyAgICAgICAgbWF4X2JhY2tvZmYgPSBudW07CisgICAgICB9IGVsc2UgaWYgKHRvdGFsID09IDIpIHsKKyAgICAgICAgbWluX3RpY2sgPSBudW07CisgICAgICB9CisgICAgfQorICB9CisgIEtNUF9ERUJVR19BU1NFUlQodG90YWwgPiAwKTsKKyAgaWYgKHRvdGFsIDw9IDApIHsKKyAgICBLTVBfV0FSTklORyhFbnZTeW50YXhFcnJvciwgbmFtZSwgdmFsdWUpOworICAgIHJldHVybjsKKyAgfQorICBfX2ttcF9zcGluX2JhY2tvZmZfcGFyYW1zLm1heF9iYWNrb2ZmID0gbWF4X2JhY2tvZmY7CisgIF9fa21wX3NwaW5fYmFja29mZl9wYXJhbXMubWluX3RpY2sgPSBtaW5fdGljazsKK30KKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3ByaW50X3NwaW5fYmFja29mZl9wYXJhbXMoa21wX3N0cl9idWZfdCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqbmFtZSwgdm9pZCAqZGF0YSkgeworICBpZiAoX19rbXBfZW52X2Zvcm1hdCkgeworICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgobmFtZSk7CisgIH0gZWxzZSB7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIgICAlcz0nIiwgbmFtZSk7CisgIH0KKyAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIlZCwlZCdcbiIsIF9fa21wX3NwaW5fYmFja29mZl9wYXJhbXMubWF4X2JhY2tvZmYsCisgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3Bpbl9iYWNrb2ZmX3BhcmFtcy5taW5fdGljayk7Cit9CisKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfQURBUFRJVkVfTE9DS19QUk9QUywgS01QX1NQRUNVTEFUSVZFX1NUQVRTRklMRQorCisvLyBQYXJzZSBvdXQgdmFsdWVzIGZvciB0aGUgdHVuYWJsZSBwYXJhbWV0ZXJzIGZyb20gYSBzdHJpbmcgb2YgdGhlIGZvcm0KKy8vIEtNUF9BREFQVElWRV9MT0NLX1BST1BTPW1heF9zb2Z0X3JldHJpZXNbLG1heF9iYWRuZXNzXQorc3RhdGljIHZvaWQgX19rbXBfc3RnX3BhcnNlX2FkYXB0aXZlX2xvY2tfcHJvcHMoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlLCB2b2lkICpkYXRhKSB7CisgIGludCBtYXhfcmV0cmllcyA9IDA7CisgIGludCBtYXhfYmFkbmVzcyA9IDA7CisKKyAgY29uc3QgY2hhciAqbmV4dCA9IHZhbHVlOworCisgIGludCB0b3RhbCA9IDA7IC8vIENvdW50IGVsZW1lbnRzIHRoYXQgd2VyZSBzZXQuIEl0J2xsIGJlIHVzZWQgYXMgYW4gYXJyYXkgc2l6ZQorICBpbnQgcHJldl9jb21tYSA9IEZBTFNFOyAvLyBGb3IgY29ycmVjdCBwcm9jZXNzaW5nIHNlcXVlbnRpYWwgY29tbWFzCisgIGludCBpOworCisgIC8vIFNhdmUgdmFsdWVzIGluIHRoZSBzdHJ1Y3R1cmUgX19rbXBfc3BlY3VsYXRpdmVfYmFja29mZl9wYXJhbXMKKyAgLy8gUnVuIG9ubHkgMyBpdGVyYXRpb25zIGJlY2F1c2UgaXQgaXMgZW5vdWdoIHRvIHJlYWQgdHdvIHZhbHVlcyBvciBmaW5kIGEKKyAgLy8gc3ludGF4IGVycm9yCisgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICBTS0lQX1dTKG5leHQpOworCisgICAgaWYgKCpuZXh0ID09ICdcMCcpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAvLyBOZXh0IGNoYXJhY3RlciBpcyBub3QgYW4gaW50ZWdlciBvciBub3QgYSBjb21tYSBPUiBudW1iZXIgb2YgdmFsdWVzID4gMgorICAgIC8vID0+IGVuZCBvZiBsaXN0CisgICAgaWYgKCgoKm5leHQgPCAnMCcgfHwgKm5leHQgPiAnOScpICYmICpuZXh0ICE9ICcsJykgfHwgdG90YWwgPiAyKSB7CisgICAgICBLTVBfV0FSTklORyhFbnZTeW50YXhFcnJvciwgbmFtZSwgdmFsdWUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBUaGUgbmV4dCBjaGFyYWN0ZXIgaXMgJywnCisgICAgaWYgKCpuZXh0ID09ICcsJykgeworICAgICAgLy8gJywnIGlzIHRoZSBmaXNydCBjaGFyYWN0ZXIKKyAgICAgIGlmICh0b3RhbCA9PSAwIHx8IHByZXZfY29tbWEpIHsKKyAgICAgICAgdG90YWwrKzsKKyAgICAgIH0KKyAgICAgIHByZXZfY29tbWEgPSBUUlVFOworICAgICAgbmV4dCsrOyAvLyBza2lwICcsJworICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICB9CisgICAgLy8gTmV4dCBjaGFyYWN0ZXIgaXMgYSBkaWdpdAorICAgIGlmICgqbmV4dCA+PSAnMCcgJiYgKm5leHQgPD0gJzknKSB7CisgICAgICBpbnQgbnVtOworICAgICAgY29uc3QgY2hhciAqYnVmID0gbmV4dDsKKyAgICAgIGNoYXIgY29uc3QgKm1zZyA9IE5VTEw7CisgICAgICBwcmV2X2NvbW1hID0gRkFMU0U7CisgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgIHRvdGFsKys7CisKKyAgICAgIGNvbnN0IGNoYXIgKnRtcCA9IG5leHQ7CisgICAgICBTS0lQX1dTKHRtcCk7CisgICAgICBpZiAoKCpuZXh0ID09ICcgJyB8fCAqbmV4dCA9PSAnXHQnKSAmJiAoKnRtcCA+PSAnMCcgJiYgKnRtcCA8PSAnOScpKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKEVudlNwYWNlc05vdEFsbG93ZWQsIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KGJ1ZiwgKm5leHQpOworICAgICAgaWYgKG51bSA8IDApIHsgLy8gVGhlIG51bWJlciBvZiByZXRyaWVzIHNob3VsZCBiZSA+PSAwCisgICAgICAgIG1zZyA9IEtNUF9JMThOX1NUUihWYWx1ZVRvb1NtYWxsKTsKKyAgICAgICAgbnVtID0gMTsKKyAgICAgIH0gZWxzZSBpZiAobnVtID4gS01QX0lOVF9NQVgpIHsKKyAgICAgICAgbXNnID0gS01QX0kxOE5fU1RSKFZhbHVlVG9vTGFyZ2UpOworICAgICAgICBudW0gPSBLTVBfSU5UX01BWDsKKyAgICAgIH0KKyAgICAgIGlmIChtc2cgIT0gTlVMTCkgeworICAgICAgICAvLyBNZXNzYWdlIGlzIG5vdCBlbXB0eS4gUHJpbnQgd2FybmluZy4KKyAgICAgICAgS01QX1dBUk5JTkcoUGFyc2VTaXplSW50V2FybiwgbmFtZSwgdmFsdWUsIG1zZyk7CisgICAgICAgIEtNUF9JTkZPUk0oVXNpbmdfaW50X1ZhbHVlLCBuYW1lLCBudW0pOworICAgICAgfQorICAgICAgaWYgKHRvdGFsID09IDEpIHsKKyAgICAgICAgbWF4X3JldHJpZXMgPSBudW07CisgICAgICB9IGVsc2UgaWYgKHRvdGFsID09IDIpIHsKKyAgICAgICAgbWF4X2JhZG5lc3MgPSBudW07CisgICAgICB9CisgICAgfQorICB9CisgIEtNUF9ERUJVR19BU1NFUlQodG90YWwgPiAwKTsKKyAgaWYgKHRvdGFsIDw9IDApIHsKKyAgICBLTVBfV0FSTklORyhFbnZTeW50YXhFcnJvciwgbmFtZSwgdmFsdWUpOworICAgIHJldHVybjsKKyAgfQorICBfX2ttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtcy5tYXhfc29mdF9yZXRyaWVzID0gbWF4X3JldHJpZXM7CisgIF9fa21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zLm1heF9iYWRuZXNzID0gbWF4X2JhZG5lc3M7Cit9CisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wcmludF9hZGFwdGl2ZV9sb2NrX3Byb3BzKGttcF9zdHJfYnVmX3QgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKm5hbWUsIHZvaWQgKmRhdGEpIHsKKyAgaWYgKF9fa21wX2Vudl9mb3JtYXQpIHsKKyAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKG5hbWUpOworICB9IGVsc2UgeworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiICAgJXM9JyIsIG5hbWUpOworICB9CisgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiJWQsJWQnXG4iLAorICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zLm1heF9zb2Z0X3JldHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXMubWF4X2JhZG5lc3MpOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfYWRhcHRpdmVfbG9ja19wcm9wcworCisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wYXJzZV9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUoY2hhciBjb25zdCAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpIHsKKyAgX19rbXBfc3RnX3BhcnNlX2ZpbGUobmFtZSwgdmFsdWUsICIiLCAmX19rbXBfc3BlY3VsYXRpdmVfc3RhdHNmaWxlKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3NwZWN1bGF0aXZlX3N0YXRzZmlsZQorCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcHJpbnRfc3BlY3VsYXRpdmVfc3RhdHNmaWxlKGttcF9zdHJfYnVmX3QgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICBpZiAoX19rbXBfc3RyX21hdGNoKCItIiwgMCwgX19rbXBfc3BlY3VsYXRpdmVfc3RhdHNmaWxlKSkgeworICAgIF9fa21wX3N0Z19wcmludF9zdHIoYnVmZmVyLCBuYW1lLCAic3Rkb3V0Iik7CisgIH0gZWxzZSB7CisgICAgX19rbXBfc3RnX3ByaW50X3N0cihidWZmZXIsIG5hbWUsIF9fa21wX3NwZWN1bGF0aXZlX3N0YXRzZmlsZSk7CisgIH0KKworfSAvLyBfX2ttcF9zdGdfcHJpbnRfc3BlY3VsYXRpdmVfc3RhdHNmaWxlCisKKyNlbmRpZiAvLyBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKworI2VuZGlmIC8vIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9IV19TVUJTRVQgKHdhcyBLTVBfUExBQ0VfVEhSRUFEUykKKworLy8gVGhlIGxvbmdlc3Qgb2JzZXJ2YWJsZSBzZXF1ZW5zZSBvZiBpdGVtcyBpcworLy8gU29ja2V0LU5vZGUtVGlsZS1Db3JlLVRocmVhZAorLy8gU28sIGxldCdzIGxpbWl0IHRvIDUgbGV2ZWxzIGZvciBub3cKKy8vIFRoZSBpbnB1dCBzdHJpbmcgaXMgdXN1YWxseSBzaG9ydCBlbm91Z2gsIGxldCdzIHVzZSA1MTIgbGltaXQgZm9yIG5vdworI2RlZmluZSBNQVhfVF9MRVZFTCA1CisjZGVmaW5lIE1BWF9TVFJfTEVOIDUxMgorc3RhdGljIHZvaWQgX19rbXBfc3RnX3BhcnNlX2h3X3N1YnNldChjaGFyIGNvbnN0ICpuYW1lLCBjaGFyIGNvbnN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICAvLyBWYWx1ZSBleGFtcGxlOiAxcyw1Y0AzLDJUCisgIC8vIFdoaWNoIG1lYW5zICJ1c2UgMSBzb2NrZXQsIDUgY29yZXMgd2l0aCBvZmZzZXQgMywgMiB0aHJlYWRzIHBlciBjb3JlIgorICBzdGF0aWMgaW50IHBhcnNlZCA9IDA7CisgIGlmIChzdHJjbXAobmFtZSwgIktNUF9QTEFDRV9USFJFQURTIikgPT0gMCkgeworICAgIEtNUF9JTkZPUk0oRW52VmFyRGVwcmVjYXRlZCwgbmFtZSwgIktNUF9IV19TVUJTRVQiKTsKKyAgICBpZiAocGFyc2VkID09IDEpIHsKKyAgICAgIHJldHVybjsgLy8gYWxyZWFkeSBwYXJzZWQgS01QX0hXX1NVQlNFVAorICAgIH0KKyAgfQorICBwYXJzZWQgPSAxOworCisgIGNoYXIgKmNvbXBvbmVudHNbTUFYX1RfTEVWRUxdOworICBjaGFyIGNvbnN0ICpkaWdpdHMgPSAiMDEyMzQ1Njc4OSI7CisgIGNoYXIgaW5wdXRbTUFYX1NUUl9MRU5dOworICBzaXplX3QgbGVuID0gMCwgbWxlbiA9IE1BWF9TVFJfTEVOOworICBpbnQgbGV2ZWwgPSAwOworICAvLyBDYW5vbml6ZSB0aGUgc3RyaW5nIChyZW1vdmUgc3BhY2VzLCB1bmlmeSBkZWxpbWl0ZXJzLCBldGMuKQorICBjaGFyICpwb3MgPSBDQ0FTVChjaGFyICosIHZhbHVlKTsKKyAgd2hpbGUgKCpwb3MgJiYgbWxlbikgeworICAgIGlmICgqcG9zICE9ICcgJykgeyAvLyBza2lwIHNwYWNlcworICAgICAgaWYgKGxlbiA9PSAwICYmICpwb3MgPT0gJzonKSB7CisgICAgICAgIF9fa21wX2h3c19hYnNfZmxhZyA9IDE7IC8vIGlmIHRoZSBmaXJzdCBzeW1ib2wgaXMgIjoiLCBza2lwIGl0CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnB1dFtsZW5dID0gdG91cHBlcigqcG9zKTsKKyAgICAgICAgaWYgKGlucHV0W2xlbl0gPT0gJ1gnKQorICAgICAgICAgIGlucHV0W2xlbl0gPSAnLCc7IC8vIHVuaWZ5IGRlbGltaXRlcnMgb2YgbGV2ZWxzCisgICAgICAgIGlmIChpbnB1dFtsZW5dID09ICdPJyAmJiBzdHJjaHIoZGlnaXRzLCAqKHBvcyArIDEpKSkKKyAgICAgICAgICBpbnB1dFtsZW5dID0gJ0AnOyAvLyB1bmlmeSBkZWxpbWl0ZXJzIG9mIG9mZnNldAorICAgICAgICBsZW4rKzsKKyAgICAgIH0KKyAgICB9CisgICAgbWxlbi0tOworICAgIHBvcysrOworICB9CisgIGlmIChsZW4gPT0gMCB8fCBtbGVuID09IDApCisgICAgZ290byBlcnI7IC8vIGNvbnRlbnRzIGlzIGVpdGhlciBlbXB0eSBvciB0b28gbG9uZworICBpbnB1dFtsZW5dID0gJ1wwJzsKKyAgX19rbXBfaHdzX3JlcXVlc3RlZCA9IDE7IC8vIG1hcmsgdGhhdCBzdWJzZXQgcmVxdWVzdGVkCisgIC8vIFNwbGl0IGJ5IGRlbGltaXRlcgorICBwb3MgPSBpbnB1dDsKKyAgY29tcG9uZW50c1tsZXZlbCsrXSA9IHBvczsKKyAgd2hpbGUgKChwb3MgPSBzdHJjaHIocG9zLCAnLCcpKSkgeworICAgICpwb3MgPSAnXDAnOyAvLyBtb2RpZnkgaW5wdXQgYW5kIGF2b2lkIG1vcmUgY29weWluZworICAgIGNvbXBvbmVudHNbbGV2ZWwrK10gPSArK3BvczsgLy8gZXhwZWN0IHNvbWV0aGluZyBhZnRlciAiLCIKKyAgICBpZiAobGV2ZWwgPiBNQVhfVF9MRVZFTCkKKyAgICAgIGdvdG8gZXJyOyAvLyB0b28gbWFueSBjb21wb25lbnRzIHByb3ZpZGVkCisgIH0KKyAgLy8gQ2hlY2sgZWFjaCBjb21wb25lbnQKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZXZlbDsgKytpKSB7CisgICAgaW50IG9mZnNldCA9IDA7CisgICAgaW50IG51bSA9IGF0b2koY29tcG9uZW50c1tpXSk7IC8vIGVhY2ggY29tcG9uZW50IHNob3VsZCBzdGFydCB3aXRoIGEgbnVtYmVyCisgICAgaWYgKChwb3MgPSBzdHJjaHIoY29tcG9uZW50c1tpXSwgJ0AnKSkpIHsKKyAgICAgIG9mZnNldCA9IGF0b2kocG9zICsgMSk7IC8vIHNhdmUgb2Zmc2V0CisgICAgICAqcG9zID0gJ1wwJzsgLy8gY3V0IHRoZSBvZmZzZXQgZnJvbSB0aGUgY29tcG9uZW50CisgICAgfQorICAgIHBvcyA9IGNvbXBvbmVudHNbaV0gKyBzdHJzcG4oY29tcG9uZW50c1tpXSwgZGlnaXRzKTsKKyAgICBpZiAocG9zID09IGNvbXBvbmVudHNbaV0pCisgICAgICBnb3RvIGVycjsKKyAgICAvLyBkZXRlY3QgdGhlIGNvbXBvbmVudCB0eXBlCisgICAgc3dpdGNoICgqcG9zKSB7CisgICAgY2FzZSAnUyc6IC8vIFNvY2tldAorICAgICAgaWYgKF9fa21wX2h3c19zb2NrZXQubnVtID4gMCkKKyAgICAgICAgZ290byBlcnI7IC8vIGR1cGxpY2F0ZSBpcyBub3QgYWxsb3dlZAorICAgICAgX19rbXBfaHdzX3NvY2tldC5udW0gPSBudW07CisgICAgICBfX2ttcF9od3Nfc29ja2V0Lm9mZnNldCA9IG9mZnNldDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ04nOiAvLyBOVU1BIE5vZGUKKyAgICAgIGlmIChfX2ttcF9od3Nfbm9kZS5udW0gPiAwKQorICAgICAgICBnb3RvIGVycjsgLy8gZHVwbGljYXRlIGlzIG5vdCBhbGxvd2VkCisgICAgICBfX2ttcF9od3Nfbm9kZS5udW0gPSBudW07CisgICAgICBfX2ttcF9od3Nfbm9kZS5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICBicmVhazsKKyAgICBjYXNlICdMJzogLy8gQ2FjaGUKKyAgICAgIGlmICgqKHBvcyArIDEpID09ICcyJykgeyAvLyBMMiAtIFRpbGUKKyAgICAgICAgaWYgKF9fa21wX2h3c190aWxlLm51bSA+IDApCisgICAgICAgICAgZ290byBlcnI7IC8vIGR1cGxpY2F0ZSBpcyBub3QgYWxsb3dlZAorICAgICAgICBfX2ttcF9od3NfdGlsZS5udW0gPSBudW07CisgICAgICAgIF9fa21wX2h3c190aWxlLm9mZnNldCA9IG9mZnNldDsKKyAgICAgIH0gZWxzZSBpZiAoKihwb3MgKyAxKSA9PSAnMycpIHsgLy8gTDMgLSBTb2NrZXQKKyAgICAgICAgaWYgKF9fa21wX2h3c19zb2NrZXQubnVtID4gMCkKKyAgICAgICAgICBnb3RvIGVycjsgLy8gZHVwbGljYXRlIGlzIG5vdCBhbGxvd2VkCisgICAgICAgIF9fa21wX2h3c19zb2NrZXQubnVtID0gbnVtOworICAgICAgICBfX2ttcF9od3Nfc29ja2V0Lm9mZnNldCA9IG9mZnNldDsKKyAgICAgIH0gZWxzZSBpZiAoKihwb3MgKyAxKSA9PSAnMScpIHsgLy8gTDEgLSBDb3JlCisgICAgICAgIGlmIChfX2ttcF9od3NfY29yZS5udW0gPiAwKQorICAgICAgICAgIGdvdG8gZXJyOyAvLyBkdXBsaWNhdGUgaXMgbm90IGFsbG93ZWQKKyAgICAgICAgX19rbXBfaHdzX2NvcmUubnVtID0gbnVtOworICAgICAgICBfX2ttcF9od3NfY29yZS5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICdDJzogLy8gQ29yZSAob3IgQ2FjaGU/KQorICAgICAgaWYgKCoocG9zICsgMSkgIT0gJ0EnKSB7CisgICAgICAgIGlmIChfX2ttcF9od3NfY29yZS5udW0gPiAwKQorICAgICAgICAgIGdvdG8gZXJyOyAvLyBkdXBsaWNhdGUgaXMgbm90IGFsbG93ZWQKKyAgICAgICAgX19rbXBfaHdzX2NvcmUubnVtID0gbnVtOworICAgICAgICBfX2ttcF9od3NfY29yZS5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICB9IGVsc2UgeyAvLyBDYWNoZQorICAgICAgICBjaGFyICpkID0gcG9zICsgc3RyY3Nwbihwb3MsIGRpZ2l0cyk7IC8vIGZpbmQgZGlnaXQKKyAgICAgICAgaWYgKCpkID09ICcyJykgeyAvLyBMMiAtIFRpbGUKKyAgICAgICAgICBpZiAoX19rbXBfaHdzX3RpbGUubnVtID4gMCkKKyAgICAgICAgICAgIGdvdG8gZXJyOyAvLyBkdXBsaWNhdGUgaXMgbm90IGFsbG93ZWQKKyAgICAgICAgICBfX2ttcF9od3NfdGlsZS5udW0gPSBudW07CisgICAgICAgICAgX19rbXBfaHdzX3RpbGUub2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICB9IGVsc2UgaWYgKCpkID09ICczJykgeyAvLyBMMyAtIFNvY2tldAorICAgICAgICAgIGlmIChfX2ttcF9od3Nfc29ja2V0Lm51bSA+IDApCisgICAgICAgICAgICBnb3RvIGVycjsgLy8gZHVwbGljYXRlIGlzIG5vdCBhbGxvd2VkCisgICAgICAgICAgX19rbXBfaHdzX3NvY2tldC5udW0gPSBudW07CisgICAgICAgICAgX19rbXBfaHdzX3NvY2tldC5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgIH0gZWxzZSBpZiAoKmQgPT0gJzEnKSB7IC8vIEwxIC0gQ29yZQorICAgICAgICAgIGlmIChfX2ttcF9od3NfY29yZS5udW0gPiAwKQorICAgICAgICAgICAgZ290byBlcnI7IC8vIGR1cGxpY2F0ZSBpcyBub3QgYWxsb3dlZAorICAgICAgICAgIF9fa21wX2h3c19jb3JlLm51bSA9IG51bTsKKyAgICAgICAgICBfX2ttcF9od3NfY29yZS5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1QnOiAvLyBUaHJlYWQKKyAgICAgIGlmIChfX2ttcF9od3NfcHJvYy5udW0gPiAwKQorICAgICAgICBnb3RvIGVycjsgLy8gZHVwbGljYXRlIGlzIG5vdCBhbGxvd2VkCisgICAgICBfX2ttcF9od3NfcHJvYy5udW0gPSBudW07CisgICAgICBfX2ttcF9od3NfcHJvYy5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ290byBlcnI7CisgICAgfQorICB9CisgIHJldHVybjsKK2VycjoKKyAgS01QX1dBUk5JTkcoQWZmSFdTdWJzZXRJbnZhbGlkLCBuYW1lLCB2YWx1ZSk7CisgIF9fa21wX2h3c19yZXF1ZXN0ZWQgPSAwOyAvLyBtYXJrIHRoYXQgc3Vic2V0IG5vdCByZXF1ZXN0ZWQKKyAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcHJpbnRfaHdfc3Vic2V0KGttcF9zdHJfYnVmX3QgKmJ1ZmZlciwgY2hhciBjb25zdCAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSkgeworICBpZiAoX19rbXBfaHdzX3JlcXVlc3RlZCkgeworICAgIGludCBjb21tYSA9IDA7CisgICAga21wX3N0cl9idWZfdCBidWY7CisgICAgX19rbXBfc3RyX2J1Zl9pbml0KCZidWYpOworICAgIGlmIChfX2ttcF9lbnZfZm9ybWF0KQorICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRV9FWChuYW1lKTsKKyAgICBlbHNlCisgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIiAgICVzPSciLCBuYW1lKTsKKyAgICBpZiAoX19rbXBfaHdzX3NvY2tldC5udW0pIHsKKyAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIiVkcyIsIF9fa21wX2h3c19zb2NrZXQubnVtKTsKKyAgICAgIGlmIChfX2ttcF9od3Nfc29ja2V0Lm9mZnNldCkKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiQCVkIiwgX19rbXBfaHdzX3NvY2tldC5vZmZzZXQpOworICAgICAgY29tbWEgPSAxOworICAgIH0KKyAgICBpZiAoX19rbXBfaHdzX25vZGUubnVtKSB7CisgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIlcyVkbiIsIGNvbW1hID8gIiwiIDogIiIsIF9fa21wX2h3c19ub2RlLm51bSk7CisgICAgICBpZiAoX19rbXBfaHdzX25vZGUub2Zmc2V0KQorICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICJAJWQiLCBfX2ttcF9od3Nfbm9kZS5vZmZzZXQpOworICAgICAgY29tbWEgPSAxOworICAgIH0KKyAgICBpZiAoX19rbXBfaHdzX3RpbGUubnVtKSB7CisgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIlcyVkTDIiLCBjb21tYSA/ICIsIiA6ICIiLCBfX2ttcF9od3NfdGlsZS5udW0pOworICAgICAgaWYgKF9fa21wX2h3c190aWxlLm9mZnNldCkKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiQCVkIiwgX19rbXBfaHdzX3RpbGUub2Zmc2V0KTsKKyAgICAgIGNvbW1hID0gMTsKKyAgICB9CisgICAgaWYgKF9fa21wX2h3c19jb3JlLm51bSkgeworICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJXMlZGMiLCBjb21tYSA/ICIsIiA6ICIiLCBfX2ttcF9od3NfY29yZS5udW0pOworICAgICAgaWYgKF9fa21wX2h3c19jb3JlLm9mZnNldCkKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiQCVkIiwgX19rbXBfaHdzX2NvcmUub2Zmc2V0KTsKKyAgICAgIGNvbW1hID0gMTsKKyAgICB9CisgICAgaWYgKF9fa21wX2h3c19wcm9jLm51bSkKKyAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIiVzJWR0IiwgY29tbWEgPyAiLCIgOiAiIiwgX19rbXBfaHdzX3Byb2MubnVtKTsKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIiVzJ1xuIiwgYnVmLnN0cik7CisgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCZidWYpOworICB9Cit9CisKKyNpZiBVU0VfSVRUX0JVSUxECisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0ZPUktKT0lOX0ZSQU1FUworCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcGFyc2VfZm9ya2pvaW5fZnJhbWVzKGNoYXIgY29uc3QgKm5hbWUsIGNoYXIgY29uc3QgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKSB7CisgIF9fa21wX3N0Z19wYXJzZV9ib29sKG5hbWUsIHZhbHVlLCAmX19rbXBfZm9ya2pvaW5fZnJhbWVzKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2Zvcmtqb2luX2ZyYW1lcworCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcHJpbnRfZm9ya2pvaW5fZnJhbWVzKGttcF9zdHJfYnVmX3QgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqbmFtZSwgdm9pZCAqZGF0YSkgeworICBfX2ttcF9zdGdfcHJpbnRfYm9vbChidWZmZXIsIG5hbWUsIF9fa21wX2Zvcmtqb2luX2ZyYW1lcyk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9mb3Jram9pbl9mcmFtZXMKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9GT1JLSk9JTl9GUkFNRVNfTU9ERQorCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcGFyc2VfZm9ya2pvaW5fZnJhbWVzX21vZGUoY2hhciBjb25zdCAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKSB7CisgIF9fa21wX3N0Z19wYXJzZV9pbnQobmFtZSwgdmFsdWUsIDAsIDMsICZfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9mb3Jram9pbl9mcmFtZXMKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3ByaW50X2Zvcmtqb2luX2ZyYW1lc19tb2RlKGttcF9zdHJfYnVmX3QgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0ICpuYW1lLCB2b2lkICpkYXRhKSB7CisgIF9fa21wX3N0Z19wcmludF9pbnQoYnVmZmVyLCBuYW1lLCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9mb3Jram9pbl9mcmFtZXMKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPTVBfRElTUExBWV9FTlYKKworI2lmIE9NUF80MF9FTkFCTEVECisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19wYXJzZV9vbXBfZGlzcGxheV9lbnYoY2hhciBjb25zdCAqbmFtZSwgY2hhciBjb25zdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpIHsKKyAgaWYgKF9fa21wX3N0cl9tYXRjaCgiVkVSQk9TRSIsIDEsIHZhbHVlKSkgeworICAgIF9fa21wX2Rpc3BsYXlfZW52X3ZlcmJvc2UgPSBUUlVFOworICB9IGVsc2UgeworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKG5hbWUsIHZhbHVlLCAmX19rbXBfZGlzcGxheV9lbnYpOworICB9CisKK30gLy8gX19rbXBfc3RnX3BhcnNlX29tcF9kaXNwbGF5X2VudgorCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcHJpbnRfb21wX2Rpc3BsYXlfZW52KGttcF9zdHJfYnVmX3QgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqbmFtZSwgdm9pZCAqZGF0YSkgeworICBpZiAoX19rbXBfZGlzcGxheV9lbnZfdmVyYm9zZSkgeworICAgIF9fa21wX3N0Z19wcmludF9zdHIoYnVmZmVyLCBuYW1lLCAiVkVSQk9TRSIpOworICB9IGVsc2UgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKGJ1ZmZlciwgbmFtZSwgX19rbXBfZGlzcGxheV9lbnYpOworICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9vbXBfZGlzcGxheV9lbnYKKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3BhcnNlX29tcF9jYW5jZWxsYXRpb24oY2hhciBjb25zdCAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKnZhbHVlLCB2b2lkICpkYXRhKSB7CisgIGlmIChUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkgeworICAgIEtNUF9XQVJOSU5HKEVudlBhcmFsbGVsV2FybiwgbmFtZSk7CisgICAgcmV0dXJuOworICB9IC8vIHJlYWQgdmFsdWUgYmVmb3JlIGZpcnN0IHBhcmFsbGVsIG9ubHkKKyAgX19rbXBfc3RnX3BhcnNlX2Jvb2wobmFtZSwgdmFsdWUsICZfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX29tcF9jYW5jZWxsYXRpb24KKworc3RhdGljIHZvaWQgX19rbXBfc3RnX3ByaW50X29tcF9jYW5jZWxsYXRpb24oa21wX3N0cl9idWZfdCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqbmFtZSwgdm9pZCAqZGF0YSkgeworICBfX2ttcF9zdGdfcHJpbnRfYm9vbChidWZmZXIsIG5hbWUsIF9fa21wX29tcF9jYW5jZWxsYXRpb24pOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfb21wX2NhbmNlbGxhdGlvbgorCisjZW5kaWYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRhYmxlLgorCitzdGF0aWMga21wX3NldHRpbmdfdCBfX2ttcF9zdGdfdGFibGVbXSA9IHsKKworICAgIHsiS01QX0FMTF9USFJFQURTIiwgX19rbXBfc3RnX3BhcnNlX2FsbF90aHJlYWRzLAorICAgICBfX2ttcF9zdGdfcHJpbnRfYWxsX3RocmVhZHMsIE5VTEwsIDAsIDB9LAorICAgIHsiS01QX0JMT0NLVElNRSIsIF9fa21wX3N0Z19wYXJzZV9ibG9ja3RpbWUsIF9fa21wX3N0Z19wcmludF9ibG9ja3RpbWUsCisgICAgIE5VTEwsIDAsIDB9LAorICAgIHsiS01QX0RVUExJQ0FURV9MSUJfT0siLCBfX2ttcF9zdGdfcGFyc2VfZHVwbGljYXRlX2xpYl9vaywKKyAgICAgX19rbXBfc3RnX3ByaW50X2R1cGxpY2F0ZV9saWJfb2ssIE5VTEwsIDAsIDB9LAorICAgIHsiS01QX0xJQlJBUlkiLCBfX2ttcF9zdGdfcGFyc2Vfd2FpdF9wb2xpY3ksIF9fa21wX3N0Z19wcmludF93YWl0X3BvbGljeSwKKyAgICAgTlVMTCwgMCwgMH0sCisgICAgeyJLTVBfTUFYX1RIUkVBRFMiLCBfX2ttcF9zdGdfcGFyc2VfYWxsX3RocmVhZHMsIE5VTEwsIE5VTEwsIDAsCisgICAgIDB9LCAvLyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorI2lmIEtNUF9VU0VfTU9OSVRPUgorICAgIHsiS01QX01PTklUT1JfU1RBQ0tTSVpFIiwgX19rbXBfc3RnX3BhcnNlX21vbml0b3Jfc3RhY2tzaXplLAorICAgICBfX2ttcF9zdGdfcHJpbnRfbW9uaXRvcl9zdGFja3NpemUsIE5VTEwsIDAsIDB9LAorI2VuZGlmCisgICAgeyJLTVBfU0VUVElOR1MiLCBfX2ttcF9zdGdfcGFyc2Vfc2V0dGluZ3MsIF9fa21wX3N0Z19wcmludF9zZXR0aW5ncywgTlVMTCwKKyAgICAgMCwgMH0sCisgICAgeyJLTVBfU1RBQ0tPRkZTRVQiLCBfX2ttcF9zdGdfcGFyc2Vfc3RhY2tvZmZzZXQsCisgICAgIF9fa21wX3N0Z19wcmludF9zdGFja29mZnNldCwgTlVMTCwgMCwgMH0sCisgICAgeyJLTVBfU1RBQ0tTSVpFIiwgX19rbXBfc3RnX3BhcnNlX3N0YWNrc2l6ZSwgX19rbXBfc3RnX3ByaW50X3N0YWNrc2l6ZSwKKyAgICAgTlVMTCwgMCwgMH0sCisgICAgeyJLTVBfU1RBQ0tQQUQiLCBfX2ttcF9zdGdfcGFyc2Vfc3RhY2twYWQsIF9fa21wX3N0Z19wcmludF9zdGFja3BhZCwgTlVMTCwKKyAgICAgMCwgMH0sCisgICAgeyJLTVBfVkVSU0lPTiIsIF9fa21wX3N0Z19wYXJzZV92ZXJzaW9uLCBfX2ttcF9zdGdfcHJpbnRfdmVyc2lvbiwgTlVMTCwgMCwKKyAgICAgMH0sCisgICAgeyJLTVBfV0FSTklOR1MiLCBfX2ttcF9zdGdfcGFyc2Vfd2FybmluZ3MsIF9fa21wX3N0Z19wcmludF93YXJuaW5ncywgTlVMTCwKKyAgICAgMCwgMH0sCisKKyAgICB7Ik9NUF9ORVNURUQiLCBfX2ttcF9zdGdfcGFyc2VfbmVzdGVkLCBfX2ttcF9zdGdfcHJpbnRfbmVzdGVkLCBOVUxMLCAwLCAwfSwKKyAgICB7Ik9NUF9OVU1fVEhSRUFEUyIsIF9fa21wX3N0Z19wYXJzZV9udW1fdGhyZWFkcywKKyAgICAgX19rbXBfc3RnX3ByaW50X251bV90aHJlYWRzLCBOVUxMLCAwLCAwfSwKKyAgICB7Ik9NUF9TVEFDS1NJWkUiLCBfX2ttcF9zdGdfcGFyc2Vfc3RhY2tzaXplLCBfX2ttcF9zdGdfcHJpbnRfc3RhY2tzaXplLAorICAgICBOVUxMLCAwLCAwfSwKKworICAgIHsiS01QX1RBU0tJTkciLCBfX2ttcF9zdGdfcGFyc2VfdGFza2luZywgX19rbXBfc3RnX3ByaW50X3Rhc2tpbmcsIE5VTEwsIDAsCisgICAgIDB9LAorICAgIHsiS01QX1RBU0tfU1RFQUxJTkdfQ09OU1RSQUlOVCIsIF9fa21wX3N0Z19wYXJzZV90YXNrX3N0ZWFsaW5nLAorICAgICBfX2ttcF9zdGdfcHJpbnRfdGFza19zdGVhbGluZywgTlVMTCwgMCwgMH0sCisgICAgeyJPTVBfTUFYX0FDVElWRV9MRVZFTFMiLCBfX2ttcF9zdGdfcGFyc2VfbWF4X2FjdGl2ZV9sZXZlbHMsCisgICAgIF9fa21wX3N0Z19wcmludF9tYXhfYWN0aXZlX2xldmVscywgTlVMTCwgMCwgMH0sCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICB7Ik9NUF9ERUZBVUxUX0RFVklDRSIsIF9fa21wX3N0Z19wYXJzZV9kZWZhdWx0X2RldmljZSwKKyAgICAgX19rbXBfc3RnX3ByaW50X2RlZmF1bHRfZGV2aWNlLCBOVUxMLCAwLCAwfSwKKyNlbmRpZgorI2lmIE9NUF80NV9FTkFCTEVECisgICAgeyJPTVBfTUFYX1RBU0tfUFJJT1JJVFkiLCBfX2ttcF9zdGdfcGFyc2VfbWF4X3Rhc2tfcHJpb3JpdHksCisgICAgIF9fa21wX3N0Z19wcmludF9tYXhfdGFza19wcmlvcml0eSwgTlVMTCwgMCwgMH0sCisgICAgeyJLTVBfVEFTS0xPT1BfTUlOX1RBU0tTIiwgX19rbXBfc3RnX3BhcnNlX3Rhc2tsb29wX21pbl90YXNrcywKKyAgICAgX19rbXBfc3RnX3ByaW50X3Rhc2tsb29wX21pbl90YXNrcywgTlVMTCwgMCwgMH0sCisjZW5kaWYKKyAgICB7Ik9NUF9USFJFQURfTElNSVQiLCBfX2ttcF9zdGdfcGFyc2VfYWxsX3RocmVhZHMsCisgICAgIF9fa21wX3N0Z19wcmludF9hbGxfdGhyZWFkcywgTlVMTCwgMCwgMH0sCisgICAgeyJPTVBfV0FJVF9QT0xJQ1kiLCBfX2ttcF9zdGdfcGFyc2Vfd2FpdF9wb2xpY3ksCisgICAgIF9fa21wX3N0Z19wcmludF93YWl0X3BvbGljeSwgTlVMTCwgMCwgMH0sCisgICAgeyJLTVBfRElTUF9OVU1fQlVGRkVSUyIsIF9fa21wX3N0Z19wYXJzZV9kaXNwX2J1ZmZlcnMsCisgICAgIF9fa21wX3N0Z19wcmludF9kaXNwX2J1ZmZlcnMsIE5VTEwsIDAsIDB9LAorI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgeyJLTVBfSE9UX1RFQU1TX01BWF9MRVZFTCIsIF9fa21wX3N0Z19wYXJzZV9ob3RfdGVhbXNfbGV2ZWwsCisgICAgIF9fa21wX3N0Z19wcmludF9ob3RfdGVhbXNfbGV2ZWwsIE5VTEwsIDAsIDB9LAorICAgIHsiS01QX0hPVF9URUFNU19NT0RFIiwgX19rbXBfc3RnX3BhcnNlX2hvdF90ZWFtc19tb2RlLAorICAgICBfX2ttcF9zdGdfcHJpbnRfaG90X3RlYW1zX21vZGUsIE5VTEwsIDAsIDB9LAorI2VuZGlmIC8vIEtNUF9ORVNURURfSE9UX1RFQU1TCisKKyNpZiBLTVBfSEFORExFX1NJR05BTFMKKyAgICB7IktNUF9IQU5ETEVfU0lHTkFMUyIsIF9fa21wX3N0Z19wYXJzZV9oYW5kbGVfc2lnbmFscywKKyAgICAgX19rbXBfc3RnX3ByaW50X2hhbmRsZV9zaWduYWxzLCBOVUxMLCAwLCAwfSwKKyNlbmRpZgorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAgIHsiS01QX0lOSEVSSVRfRlBfQ09OVFJPTCIsIF9fa21wX3N0Z19wYXJzZV9pbmhlcml0X2ZwX2NvbnRyb2wsCisgICAgIF9fa21wX3N0Z19wcmludF9pbmhlcml0X2ZwX2NvbnRyb2wsIE5VTEwsIDAsIDB9LAorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgIHsiR09NUF9TVEFDS1NJWkUiLCBfX2ttcF9zdGdfcGFyc2Vfc3RhY2tzaXplLCBOVUxMLCBOVUxMLCAwLCAwfSwKKyNlbmRpZgorCisjaWZkZWYgS01QX0RFQlVHCisgICAgeyJLTVBfQV9ERUJVRyIsIF9fa21wX3N0Z19wYXJzZV9hX2RlYnVnLCBfX2ttcF9zdGdfcHJpbnRfYV9kZWJ1ZywgTlVMTCwgMCwKKyAgICAgMH0sCisgICAgeyJLTVBfQl9ERUJVRyIsIF9fa21wX3N0Z19wYXJzZV9iX2RlYnVnLCBfX2ttcF9zdGdfcHJpbnRfYl9kZWJ1ZywgTlVMTCwgMCwKKyAgICAgMH0sCisgICAgeyJLTVBfQ19ERUJVRyIsIF9fa21wX3N0Z19wYXJzZV9jX2RlYnVnLCBfX2ttcF9zdGdfcHJpbnRfY19kZWJ1ZywgTlVMTCwgMCwKKyAgICAgMH0sCisgICAgeyJLTVBfRF9ERUJVRyIsIF9fa21wX3N0Z19wYXJzZV9kX2RlYnVnLCBfX2ttcF9zdGdfcHJpbnRfZF9kZWJ1ZywgTlVMTCwgMCwKKyAgICAgMH0sCisgICAgeyJLTVBfRV9ERUJVRyIsIF9fa21wX3N0Z19wYXJzZV9lX2RlYnVnLCBfX2ttcF9zdGdfcHJpbnRfZV9kZWJ1ZywgTlVMTCwgMCwKKyAgICAgMH0sCisgICAgeyJLTVBfRl9ERUJVRyIsIF9fa21wX3N0Z19wYXJzZV9mX2RlYnVnLCBfX2ttcF9zdGdfcHJpbnRfZl9kZWJ1ZywgTlVMTCwgMCwKKyAgICAgMH0sCisgICAgeyJLTVBfREVCVUciLCBfX2ttcF9zdGdfcGFyc2VfZGVidWcsIE5VTEwsIC8qIG5vIHByaW50ICovIE5VTEwsIDAsIDB9LAorICAgIHsiS01QX0RFQlVHX0JVRiIsIF9fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWYsIF9fa21wX3N0Z19wcmludF9kZWJ1Z19idWYsCisgICAgIE5VTEwsIDAsIDB9LAorICAgIHsiS01QX0RFQlVHX0JVRl9BVE9NSUMiLCBfX2ttcF9zdGdfcGFyc2VfZGVidWdfYnVmX2F0b21pYywKKyAgICAgX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1Zl9hdG9taWMsIE5VTEwsIDAsIDB9LAorICAgIHsiS01QX0RFQlVHX0JVRl9DSEFSUyIsIF9fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWZfY2hhcnMsCisgICAgIF9fa21wX3N0Z19wcmludF9kZWJ1Z19idWZfY2hhcnMsIE5VTEwsIDAsIDB9LAorICAgIHsiS01QX0RFQlVHX0JVRl9MSU5FUyIsIF9fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWZfbGluZXMsCisgICAgIF9fa21wX3N0Z19wcmludF9kZWJ1Z19idWZfbGluZXMsIE5VTEwsIDAsIDB9LAorICAgIHsiS01QX0RJQUciLCBfX2ttcF9zdGdfcGFyc2VfZGlhZywgX19rbXBfc3RnX3ByaW50X2RpYWcsIE5VTEwsIDAsIDB9LAorCisgICAgeyJLTVBfUEFSX1JBTkdFIiwgX19rbXBfc3RnX3BhcnNlX3Bhcl9yYW5nZV9lbnYsCisgICAgIF9fa21wX3N0Z19wcmludF9wYXJfcmFuZ2VfZW52LCBOVUxMLCAwLCAwfSwKKyAgICB7IktNUF9ZSUVMRF9DWUNMRSIsIF9fa21wX3N0Z19wYXJzZV95aWVsZF9jeWNsZSwKKyAgICAgX19rbXBfc3RnX3ByaW50X3lpZWxkX2N5Y2xlLCBOVUxMLCAwLCAwfSwKKyAgICB7IktNUF9ZSUVMRF9PTiIsIF9fa21wX3N0Z19wYXJzZV95aWVsZF9vbiwgX19rbXBfc3RnX3ByaW50X3lpZWxkX29uLCBOVUxMLAorICAgICAwLCAwfSwKKyAgICB7IktNUF9ZSUVMRF9PRkYiLCBfX2ttcF9zdGdfcGFyc2VfeWllbGRfb2ZmLCBfX2ttcF9zdGdfcHJpbnRfeWllbGRfb2ZmLAorICAgICBOVUxMLCAwLCAwfSwKKyNlbmRpZiAvLyBLTVBfREVCVUcKKworICAgIHsiS01QX0FMSUdOX0FMTE9DIiwgX19rbXBfc3RnX3BhcnNlX2FsaWduX2FsbG9jLAorICAgICBfX2ttcF9zdGdfcHJpbnRfYWxpZ25fYWxsb2MsIE5VTEwsIDAsIDB9LAorCisgICAgeyJLTVBfUExBSU5fQkFSUklFUiIsIF9fa21wX3N0Z19wYXJzZV9iYXJyaWVyX2JyYW5jaF9iaXQsCisgICAgIF9fa21wX3N0Z19wcmludF9iYXJyaWVyX2JyYW5jaF9iaXQsIE5VTEwsIDAsIDB9LAorICAgIHsiS01QX1BMQUlOX0JBUlJJRVJfUEFUVEVSTiIsIF9fa21wX3N0Z19wYXJzZV9iYXJyaWVyX3BhdHRlcm4sCisgICAgIF9fa21wX3N0Z19wcmludF9iYXJyaWVyX3BhdHRlcm4sIE5VTEwsIDAsIDB9LAorICAgIHsiS01QX0ZPUktKT0lOX0JBUlJJRVIiLCBfX2ttcF9zdGdfcGFyc2VfYmFycmllcl9icmFuY2hfYml0LAorICAgICBfX2ttcF9zdGdfcHJpbnRfYmFycmllcl9icmFuY2hfYml0LCBOVUxMLCAwLCAwfSwKKyAgICB7IktNUF9GT1JLSk9JTl9CQVJSSUVSX1BBVFRFUk4iLCBfX2ttcF9zdGdfcGFyc2VfYmFycmllcl9wYXR0ZXJuLAorICAgICBfX2ttcF9zdGdfcHJpbnRfYmFycmllcl9wYXR0ZXJuLCBOVUxMLCAwLCAwfSwKKyNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgIHsiS01QX1JFRFVDVElPTl9CQVJSSUVSIiwgX19rbXBfc3RnX3BhcnNlX2JhcnJpZXJfYnJhbmNoX2JpdCwKKyAgICAgX19rbXBfc3RnX3ByaW50X2JhcnJpZXJfYnJhbmNoX2JpdCwgTlVMTCwgMCwgMH0sCisgICAgeyJLTVBfUkVEVUNUSU9OX0JBUlJJRVJfUEFUVEVSTiIsIF9fa21wX3N0Z19wYXJzZV9iYXJyaWVyX3BhdHRlcm4sCisgICAgIF9fa21wX3N0Z19wcmludF9iYXJyaWVyX3BhdHRlcm4sIE5VTEwsIDAsIDB9LAorI2VuZGlmCisKKyAgICB7IktNUF9BQk9SVF9ERUxBWSIsIF9fa21wX3N0Z19wYXJzZV9hYm9ydF9kZWxheSwKKyAgICAgX19rbXBfc3RnX3ByaW50X2Fib3J0X2RlbGF5LCBOVUxMLCAwLCAwfSwKKyAgICB7IktNUF9DUFVJTkZPX0ZJTEUiLCBfX2ttcF9zdGdfcGFyc2VfY3B1aW5mb19maWxlLAorICAgICBfX2ttcF9zdGdfcHJpbnRfY3B1aW5mb19maWxlLCBOVUxMLCAwLCAwfSwKKyAgICB7IktNUF9GT1JDRV9SRURVQ1RJT04iLCBfX2ttcF9zdGdfcGFyc2VfZm9yY2VfcmVkdWN0aW9uLAorICAgICBfX2ttcF9zdGdfcHJpbnRfZm9yY2VfcmVkdWN0aW9uLCBOVUxMLCAwLCAwfSwKKyAgICB7IktNUF9ERVRFUk1JTklTVElDX1JFRFVDVElPTiIsIF9fa21wX3N0Z19wYXJzZV9mb3JjZV9yZWR1Y3Rpb24sCisgICAgIF9fa21wX3N0Z19wcmludF9mb3JjZV9yZWR1Y3Rpb24sIE5VTEwsIDAsIDB9LAorICAgIHsiS01QX1NUT1JBR0VfTUFQIiwgX19rbXBfc3RnX3BhcnNlX3N0b3JhZ2VfbWFwLAorICAgICBfX2ttcF9zdGdfcHJpbnRfc3RvcmFnZV9tYXAsIE5VTEwsIDAsIDB9LAorICAgIHsiS01QX0FMTF9USFJFQURQUklWQVRFIiwgX19rbXBfc3RnX3BhcnNlX2FsbF90aHJlYWRwcml2YXRlLAorICAgICBfX2ttcF9zdGdfcHJpbnRfYWxsX3RocmVhZHByaXZhdGUsIE5VTEwsIDAsIDB9LAorICAgIHsiS01QX0ZPUkVJR05fVEhSRUFEU19USFJFQURQUklWQVRFIiwKKyAgICAgX19rbXBfc3RnX3BhcnNlX2ZvcmVpZ25fdGhyZWFkc190aHJlYWRwcml2YXRlLAorICAgICBfX2ttcF9zdGdfcHJpbnRfZm9yZWlnbl90aHJlYWRzX3RocmVhZHByaXZhdGUsIE5VTEwsIDAsIDB9LAorCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIHsiS01QX0FGRklOSVRZIiwgX19rbXBfc3RnX3BhcnNlX2FmZmluaXR5LCBfX2ttcF9zdGdfcHJpbnRfYWZmaW5pdHksIE5VTEwsCisgICAgIDAsIDB9LAorI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgIHsiR09NUF9DUFVfQUZGSU5JVFkiLCBfX2ttcF9zdGdfcGFyc2VfZ29tcF9jcHVfYWZmaW5pdHksIE5VTEwsCisgICAgIC8qIG5vIHByaW50ICovIE5VTEwsIDAsIDB9LAorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworI2lmIE9NUF80MF9FTkFCTEVECisgICAgeyJPTVBfUFJPQ19CSU5EIiwgX19rbXBfc3RnX3BhcnNlX3Byb2NfYmluZCwgX19rbXBfc3RnX3ByaW50X3Byb2NfYmluZCwKKyAgICAgTlVMTCwgMCwgMH0sCisgICAgeyJPTVBfUExBQ0VTIiwgX19rbXBfc3RnX3BhcnNlX3BsYWNlcywgX19rbXBfc3RnX3ByaW50X3BsYWNlcywgTlVMTCwgMCwgMH0sCisjZWxzZQorICAgIHsiT01QX1BST0NfQklORCIsIF9fa21wX3N0Z19wYXJzZV9wcm9jX2JpbmQsIE5VTEwsIC8qIG5vIHByaW50ICovIE5VTEwsIDAsCisgICAgIDB9LAorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyAgICB7IktNUF9UT1BPTE9HWV9NRVRIT0QiLCBfX2ttcF9zdGdfcGFyc2VfdG9wb2xvZ3lfbWV0aG9kLAorICAgICBfX2ttcF9zdGdfcHJpbnRfdG9wb2xvZ3lfbWV0aG9kLCBOVUxMLCAwLCAwfSwKKworI2Vsc2UKKworLy8gS01QX0FGRklOSVRZIGlzIG5vdCBzdXBwb3J0ZWQgb24gT1MgWCosIG5vciBpcyBPTVBfUExBQ0VTLgorLy8gT01QX1BST0NfQklORCBhbmQgcHJvYy1iaW5kLXZhciBhcmUgc3VwcG9ydGVkLCBob3dldmVyLgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgeyJPTVBfUFJPQ19CSU5EIiwgX19rbXBfc3RnX3BhcnNlX3Byb2NfYmluZCwgX19rbXBfc3RnX3ByaW50X3Byb2NfYmluZCwKKyAgICAgTlVMTCwgMCwgMH0sCisjZW5kaWYKKworI2VuZGlmIC8vIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKworICAgIHsiS01QX0lOSVRfQVRfRk9SSyIsIF9fa21wX3N0Z19wYXJzZV9pbml0X2F0X2ZvcmssCisgICAgIF9fa21wX3N0Z19wcmludF9pbml0X2F0X2ZvcmssIE5VTEwsIDAsIDB9LAorICAgIHsiS01QX1NDSEVEVUxFIiwgX19rbXBfc3RnX3BhcnNlX3NjaGVkdWxlLCBfX2ttcF9zdGdfcHJpbnRfc2NoZWR1bGUsIE5VTEwsCisgICAgIDAsIDB9LAorICAgIHsiT01QX1NDSEVEVUxFIiwgX19rbXBfc3RnX3BhcnNlX29tcF9zY2hlZHVsZSwgX19rbXBfc3RnX3ByaW50X29tcF9zY2hlZHVsZSwKKyAgICAgTlVMTCwgMCwgMH0sCisgICAgeyJLTVBfQVRPTUlDX01PREUiLCBfX2ttcF9zdGdfcGFyc2VfYXRvbWljX21vZGUsCisgICAgIF9fa21wX3N0Z19wcmludF9hdG9taWNfbW9kZSwgTlVMTCwgMCwgMH0sCisgICAgeyJLTVBfQ09OU0lTVEVOQ1lfQ0hFQ0siLCBfX2ttcF9zdGdfcGFyc2VfY29uc2lzdGVuY3lfY2hlY2ssCisgICAgIF9fa21wX3N0Z19wcmludF9jb25zaXN0ZW5jeV9jaGVjaywgTlVMTCwgMCwgMH0sCisKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgeyJLTVBfSVRUX1BSRVBBUkVfREVMQVkiLCBfX2ttcF9zdGdfcGFyc2VfaXR0X3ByZXBhcmVfZGVsYXksCisgICAgIF9fa21wX3N0Z19wcmludF9pdHRfcHJlcGFyZV9kZWxheSwgTlVMTCwgMCwgMH0sCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWSAqLworICAgIHsiS01QX01BTExPQ19QT09MX0lOQ1IiLCBfX2ttcF9zdGdfcGFyc2VfbWFsbG9jX3Bvb2xfaW5jciwKKyAgICAgX19rbXBfc3RnX3ByaW50X21hbGxvY19wb29sX2luY3IsIE5VTEwsIDAsIDB9LAorICAgIHsiS01QX0lOSVRfV0FJVCIsIF9fa21wX3N0Z19wYXJzZV9pbml0X3dhaXQsIF9fa21wX3N0Z19wcmludF9pbml0X3dhaXQsCisgICAgIE5VTEwsIDAsIDB9LAorICAgIHsiS01QX05FWFRfV0FJVCIsIF9fa21wX3N0Z19wYXJzZV9uZXh0X3dhaXQsIF9fa21wX3N0Z19wcmludF9uZXh0X3dhaXQsCisgICAgIE5VTEwsIDAsIDB9LAorICAgIHsiS01QX0dUSURfTU9ERSIsIF9fa21wX3N0Z19wYXJzZV9ndGlkX21vZGUsIF9fa21wX3N0Z19wcmludF9ndGlkX21vZGUsCisgICAgIE5VTEwsIDAsIDB9LAorICAgIHsiT01QX0RZTkFNSUMiLCBfX2ttcF9zdGdfcGFyc2Vfb21wX2R5bmFtaWMsIF9fa21wX3N0Z19wcmludF9vbXBfZHluYW1pYywKKyAgICAgTlVMTCwgMCwgMH0sCisgICAgeyJLTVBfRFlOQU1JQ19NT0RFIiwgX19rbXBfc3RnX3BhcnNlX2ttcF9keW5hbWljX21vZGUsCisgICAgIF9fa21wX3N0Z19wcmludF9rbXBfZHluYW1pY19tb2RlLCBOVUxMLCAwLCAwfSwKKworI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKKyAgICB7IktNUF9MT0FEX0JBTEFOQ0VfSU5URVJWQUwiLCBfX2ttcF9zdGdfcGFyc2VfbGRfYmFsYW5jZV9pbnRlcnZhbCwKKyAgICAgX19rbXBfc3RnX3ByaW50X2xkX2JhbGFuY2VfaW50ZXJ2YWwsIE5VTEwsIDAsIDB9LAorI2VuZGlmCisKKyAgICB7IktNUF9OVU1fTE9DS1NfSU5fQkxPQ0siLCBfX2ttcF9zdGdfcGFyc2VfbG9ja19ibG9jaywKKyAgICAgX19rbXBfc3RnX3ByaW50X2xvY2tfYmxvY2ssIE5VTEwsIDAsIDB9LAorICAgIHsiS01QX0xPQ0tfS0lORCIsIF9fa21wX3N0Z19wYXJzZV9sb2NrX2tpbmQsIF9fa21wX3N0Z19wcmludF9sb2NrX2tpbmQsCisgICAgIE5VTEwsIDAsIDB9LAorICAgIHsiS01QX1NQSU5fQkFDS09GRl9QQVJBTVMiLCBfX2ttcF9zdGdfcGFyc2Vfc3Bpbl9iYWNrb2ZmX3BhcmFtcywKKyAgICAgX19rbXBfc3RnX3ByaW50X3NwaW5fYmFja29mZl9wYXJhbXMsIE5VTEwsIDAsIDB9LAorI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyAgICB7IktNUF9BREFQVElWRV9MT0NLX1BST1BTIiwgX19rbXBfc3RnX3BhcnNlX2FkYXB0aXZlX2xvY2tfcHJvcHMsCisgICAgIF9fa21wX3N0Z19wcmludF9hZGFwdGl2ZV9sb2NrX3Byb3BzLCBOVUxMLCAwLCAwfSwKKyNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKyAgICB7IktNUF9TUEVDVUxBVElWRV9TVEFUU0ZJTEUiLCBfX2ttcF9zdGdfcGFyc2Vfc3BlY3VsYXRpdmVfc3RhdHNmaWxlLAorICAgICBfX2ttcF9zdGdfcHJpbnRfc3BlY3VsYXRpdmVfc3RhdHNmaWxlLCBOVUxMLCAwLCAwfSwKKyNlbmRpZgorI2VuZGlmIC8vIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyAgICB7IktNUF9QTEFDRV9USFJFQURTIiwgX19rbXBfc3RnX3BhcnNlX2h3X3N1YnNldCwgX19rbXBfc3RnX3ByaW50X2h3X3N1YnNldCwKKyAgICAgTlVMTCwgMCwgMH0sCisgICAgeyJLTVBfSFdfU1VCU0VUIiwgX19rbXBfc3RnX3BhcnNlX2h3X3N1YnNldCwgX19rbXBfc3RnX3ByaW50X2h3X3N1YnNldCwKKyAgICAgTlVMTCwgMCwgMH0sCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIHsiS01QX0ZPUktKT0lOX0ZSQU1FUyIsIF9fa21wX3N0Z19wYXJzZV9mb3Jram9pbl9mcmFtZXMsCisgICAgIF9fa21wX3N0Z19wcmludF9mb3Jram9pbl9mcmFtZXMsIE5VTEwsIDAsIDB9LAorICAgIHsiS01QX0ZPUktKT0lOX0ZSQU1FU19NT0RFIiwgX19rbXBfc3RnX3BhcnNlX2Zvcmtqb2luX2ZyYW1lc19tb2RlLAorICAgICBfX2ttcF9zdGdfcHJpbnRfZm9ya2pvaW5fZnJhbWVzX21vZGUsIE5VTEwsIDAsIDB9LAorI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIHsiT01QX0RJU1BMQVlfRU5WIiwgX19rbXBfc3RnX3BhcnNlX29tcF9kaXNwbGF5X2VudiwKKyAgICAgX19rbXBfc3RnX3ByaW50X29tcF9kaXNwbGF5X2VudiwgTlVMTCwgMCwgMH0sCisgICAgeyJPTVBfQ0FOQ0VMTEFUSU9OIiwgX19rbXBfc3RnX3BhcnNlX29tcF9jYW5jZWxsYXRpb24sCisgICAgIF9fa21wX3N0Z19wcmludF9vbXBfY2FuY2VsbGF0aW9uLCBOVUxMLCAwLCAwfSwKKyNlbmRpZgorICAgIHsiIiwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgMH19OyAvLyBzZXR0aW5ncworCitzdGF0aWMgaW50IGNvbnN0IF9fa21wX3N0Z19jb3VudCA9CisgICAgc2l6ZW9mKF9fa21wX3N0Z190YWJsZSkgLyBzaXplb2Yoa21wX3NldHRpbmdfdCk7CisKK3N0YXRpYyBpbmxpbmUga21wX3NldHRpbmdfdCAqX19rbXBfc3RnX2ZpbmQoY2hhciBjb25zdCAqbmFtZSkgeworCisgIGludCBpOworICBpZiAobmFtZSAhPSBOVUxMKSB7CisgICAgZm9yIChpID0gMDsgaSA8IF9fa21wX3N0Z19jb3VudDsgKytpKSB7CisgICAgICBpZiAoc3RyY21wKF9fa21wX3N0Z190YWJsZVtpXS5uYW1lLCBuYW1lKSA9PSAwKSB7CisgICAgICAgIHJldHVybiAmX19rbXBfc3RnX3RhYmxlW2ldOworICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBmb3IKKyAgfTsgLy8gaWYKKyAgcmV0dXJuIE5VTEw7CisKK30gLy8gX19rbXBfc3RnX2ZpbmQKKworc3RhdGljIGludCBfX2ttcF9zdGdfY21wKHZvaWQgY29uc3QgKl9hLCB2b2lkIGNvbnN0ICpfYikgeworICBjb25zdCBrbXBfc2V0dGluZ190ICphID0gUkNBU1QoY29uc3Qga21wX3NldHRpbmdfdCAqLCBfYSk7CisgIGNvbnN0IGttcF9zZXR0aW5nX3QgKmIgPSBSQ0FTVChjb25zdCBrbXBfc2V0dGluZ190ICosIF9iKTsKKworICAvLyBQcm9jZXNzIEtNUF9BRkZJTklUWSBsYXN0LgorICAvLyBJdCBuZWVkcyB0byBjb21lIGFmdGVyIE9NUF9QTEFDRVMgYW5kIEdPTVBfQ1BVX0FGRklOSVRZLgorICBpZiAoc3RyY21wKGEtPm5hbWUsICJLTVBfQUZGSU5JVFkiKSA9PSAwKSB7CisgICAgaWYgKHN0cmNtcChiLT5uYW1lLCAiS01QX0FGRklOSVRZIikgPT0gMCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOworICB9IGVsc2UgaWYgKHN0cmNtcChiLT5uYW1lLCAiS01QX0FGRklOSVRZIikgPT0gMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gc3RyY21wKGEtPm5hbWUsIGItPm5hbWUpOworfSAvLyBfX2ttcF9zdGdfY21wCisKK3N0YXRpYyB2b2lkIF9fa21wX3N0Z19pbml0KHZvaWQpIHsKKworICBzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKKworICBpZiAoIWluaXRpYWxpemVkKSB7CisKKyAgICAvLyBTb3J0IHRhYmxlLgorICAgIHFzb3J0KF9fa21wX3N0Z190YWJsZSwgX19rbXBfc3RnX2NvdW50IC0gMSwgc2l6ZW9mKGttcF9zZXR0aW5nX3QpLAorICAgICAgICAgIF9fa21wX3N0Z19jbXApOworCisgICAgeyAvLyBJbml0aWFsaXplICpfU1RBQ0tTSVpFIGRhdGEuCisgICAgICBrbXBfc2V0dGluZ190ICprbXBfc3RhY2tzaXplID0KKyAgICAgICAgICBfX2ttcF9zdGdfZmluZCgiS01QX1NUQUNLU0laRSIpOyAvLyAxc3QgcHJpb3JpdHkuCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICBrbXBfc2V0dGluZ190ICpnb21wX3N0YWNrc2l6ZSA9CisgICAgICAgICAgX19rbXBfc3RnX2ZpbmQoIkdPTVBfU1RBQ0tTSVpFIik7IC8vIDJuZCBwcmlvcml0eS4KKyNlbmRpZgorICAgICAga21wX3NldHRpbmdfdCAqb21wX3N0YWNrc2l6ZSA9CisgICAgICAgICAgX19rbXBfc3RnX2ZpbmQoIk9NUF9TVEFDS1NJWkUiKTsgLy8gM3JkIHByaW9yaXR5LgorCisgICAgICAvLyAhISEgdm9sYXRpbGUga2V5d29yZCBpcyBJbnRlbCAoUikgQyBDb21waWxlciBidWcgQ1E0OTkwOCB3b3JrYXJvdW5kLgorICAgICAgLy8gISEhIENvbXBpbGVyIGRvZXMgbm90IHVuZGVyc3RhbmQgcml2YWxzIGlzIHVzZWQgYW5kIG9wdGltaXplcyBvdXQKKyAgICAgIC8vIGFzc2lnbm1lbnRzCisgICAgICAvLyAhISEgICAgIHJpdmFsc1sgaSArKyBdID0gLi4uOworICAgICAgc3RhdGljIGttcF9zZXR0aW5nX3QgKnZvbGF0aWxlIHJpdmFsc1s0XTsKKyAgICAgIHN0YXRpYyBrbXBfc3RnX3NzX2RhdGFfdCBrbXBfZGF0YSA9IHsxLCBDQ0FTVChrbXBfc2V0dGluZ190ICoqLCByaXZhbHMpfTsKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgIHN0YXRpYyBrbXBfc3RnX3NzX2RhdGFfdCBnb21wX2RhdGEgPSB7MTAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NBU1Qoa21wX3NldHRpbmdfdCAqKiwgcml2YWxzKX07CisjZW5kaWYKKyAgICAgIHN0YXRpYyBrbXBfc3RnX3NzX2RhdGFfdCBvbXBfZGF0YSA9IHsxMDI0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDQVNUKGttcF9zZXR0aW5nX3QgKiosIHJpdmFscyl9OworICAgICAgaW50IGkgPSAwOworCisgICAgICByaXZhbHNbaSsrXSA9IGttcF9zdGFja3NpemU7CisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICBpZiAoZ29tcF9zdGFja3NpemUgIT0gTlVMTCkgeworICAgICAgICByaXZhbHNbaSsrXSA9IGdvbXBfc3RhY2tzaXplOworICAgICAgfTsgLy8gaWYKKyNlbmRpZgorICAgICAgcml2YWxzW2krK10gPSBvbXBfc3RhY2tzaXplOworICAgICAgcml2YWxzW2krK10gPSBOVUxMOworCisgICAgICBrbXBfc3RhY2tzaXplLT5kYXRhID0gJmttcF9kYXRhOworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgaWYgKGdvbXBfc3RhY2tzaXplICE9IE5VTEwpIHsKKyAgICAgICAgZ29tcF9zdGFja3NpemUtPmRhdGEgPSAmZ29tcF9kYXRhOworICAgICAgfTsgLy8gaWYKKyNlbmRpZgorICAgICAgb21wX3N0YWNrc2l6ZS0+ZGF0YSA9ICZvbXBfZGF0YTsKKyAgICB9CisKKyAgICB7IC8vIEluaXRpYWxpemUgS01QX0xJQlJBUlkgYW5kIE9NUF9XQUlUX1BPTElDWSBkYXRhLgorICAgICAga21wX3NldHRpbmdfdCAqa21wX2xpYnJhcnkgPQorICAgICAgICAgIF9fa21wX3N0Z19maW5kKCJLTVBfTElCUkFSWSIpOyAvLyAxc3QgcHJpb3JpdHkuCisgICAgICBrbXBfc2V0dGluZ190ICpvbXBfd2FpdF9wb2xpY3kgPQorICAgICAgICAgIF9fa21wX3N0Z19maW5kKCJPTVBfV0FJVF9QT0xJQ1kiKTsgLy8gMm5kIHByaW9yaXR5LgorCisgICAgICAvLyAhISEgdm9sYXRpbGUga2V5d29yZCBpcyBJbnRlbCAoUikgQyBDb21waWxlciBidWcgQ1E0OTkwOCB3b3JrYXJvdW5kLgorICAgICAgc3RhdGljIGttcF9zZXR0aW5nX3QgKnZvbGF0aWxlIHJpdmFsc1szXTsKKyAgICAgIHN0YXRpYyBrbXBfc3RnX3dwX2RhdGFfdCBrbXBfZGF0YSA9IHswLCBDQ0FTVChrbXBfc2V0dGluZ190ICoqLCByaXZhbHMpfTsKKyAgICAgIHN0YXRpYyBrbXBfc3RnX3dwX2RhdGFfdCBvbXBfZGF0YSA9IHsxLCBDQ0FTVChrbXBfc2V0dGluZ190ICoqLCByaXZhbHMpfTsKKyAgICAgIGludCBpID0gMDsKKworICAgICAgcml2YWxzW2krK10gPSBrbXBfbGlicmFyeTsKKyAgICAgIGlmIChvbXBfd2FpdF9wb2xpY3kgIT0gTlVMTCkgeworICAgICAgICByaXZhbHNbaSsrXSA9IG9tcF93YWl0X3BvbGljeTsKKyAgICAgIH07IC8vIGlmCisgICAgICByaXZhbHNbaSsrXSA9IE5VTEw7CisKKyAgICAgIGttcF9saWJyYXJ5LT5kYXRhID0gJmttcF9kYXRhOworICAgICAgaWYgKG9tcF93YWl0X3BvbGljeSAhPSBOVUxMKSB7CisgICAgICAgIG9tcF93YWl0X3BvbGljeS0+ZGF0YSA9ICZvbXBfZGF0YTsKKyAgICAgIH07IC8vIGlmCisgICAgfQorCisgICAgeyAvLyBJbml0aWFsaXplIEtNUF9BTExfVEhSRUFEUywgS01QX01BWF9USFJFQURTLCBhbmQgT01QX1RIUkVBRF9MSU1JVCBkYXRhLgorICAgICAga21wX3NldHRpbmdfdCAqa21wX2FsbF90aHJlYWRzID0KKyAgICAgICAgICBfX2ttcF9zdGdfZmluZCgiS01QX0FMTF9USFJFQURTIik7IC8vIDFzdCBwcmlvcml0eS4KKyAgICAgIGttcF9zZXR0aW5nX3QgKmttcF9tYXhfdGhyZWFkcyA9CisgICAgICAgICAgX19rbXBfc3RnX2ZpbmQoIktNUF9NQVhfVEhSRUFEUyIpOyAvLyAybmQgcHJpb3JpdHkuCisgICAgICBrbXBfc2V0dGluZ190ICpvbXBfdGhyZWFkX2xpbWl0ID0KKyAgICAgICAgICBfX2ttcF9zdGdfZmluZCgiT01QX1RIUkVBRF9MSU1JVCIpOyAvLyAzcmQgcHJpb3JpdHkuCisKKyAgICAgIC8vICEhISB2b2xhdGlsZSBrZXl3b3JkIGlzIEludGVsIChSKSBDIENvbXBpbGVyIGJ1ZyBDUTQ5OTA4IHdvcmthcm91bmQuCisgICAgICBzdGF0aWMga21wX3NldHRpbmdfdCAqdm9sYXRpbGUgcml2YWxzWzRdOworICAgICAgaW50IGkgPSAwOworCisgICAgICByaXZhbHNbaSsrXSA9IGttcF9hbGxfdGhyZWFkczsKKyAgICAgIHJpdmFsc1tpKytdID0ga21wX21heF90aHJlYWRzOworICAgICAgaWYgKG9tcF90aHJlYWRfbGltaXQgIT0gTlVMTCkgeworICAgICAgICByaXZhbHNbaSsrXSA9IG9tcF90aHJlYWRfbGltaXQ7CisgICAgICB9OyAvLyBpZgorICAgICAgcml2YWxzW2krK10gPSBOVUxMOworICAgICAga21wX2FsbF90aHJlYWRzLT5kYXRhID0gQ0NBU1Qoa21wX3NldHRpbmdfdCAqKiwgcml2YWxzKTsKKyAgICAgIGttcF9tYXhfdGhyZWFkcy0+ZGF0YSA9IENDQVNUKGttcF9zZXR0aW5nX3QgKiosIHJpdmFscyk7CisgICAgICBpZiAob21wX3RocmVhZF9saW1pdCAhPSBOVUxMKSB7CisgICAgICAgIG9tcF90aHJlYWRfbGltaXQtPmRhdGEgPSBDQ0FTVChrbXBfc2V0dGluZ190ICoqLCByaXZhbHMpOworICAgICAgfTsgLy8gaWYKKyAgICB9CisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgeyAvLyBJbml0aWFsaXplIEtNUF9BRkZJTklUWSwgR09NUF9DUFVfQUZGSU5JVFksIGFuZCBPTVBfUFJPQ19CSU5EIGRhdGEuCisgICAgICBrbXBfc2V0dGluZ190ICprbXBfYWZmaW5pdHkgPQorICAgICAgICAgIF9fa21wX3N0Z19maW5kKCJLTVBfQUZGSU5JVFkiKTsgLy8gMXN0IHByaW9yaXR5LgorICAgICAgS01QX0RFQlVHX0FTU0VSVChrbXBfYWZmaW5pdHkgIT0gTlVMTCk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgIGttcF9zZXR0aW5nX3QgKmdvbXBfY3B1X2FmZmluaXR5ID0KKyAgICAgICAgICBfX2ttcF9zdGdfZmluZCgiR09NUF9DUFVfQUZGSU5JVFkiKTsgLy8gMm5kIHByaW9yaXR5LgorICAgICAgS01QX0RFQlVHX0FTU0VSVChnb21wX2NwdV9hZmZpbml0eSAhPSBOVUxMKTsKKyNlbmRpZgorCisgICAgICBrbXBfc2V0dGluZ190ICpvbXBfcHJvY19iaW5kID0KKyAgICAgICAgICBfX2ttcF9zdGdfZmluZCgiT01QX1BST0NfQklORCIpOyAvLyAzcmQgcHJpb3JpdHkuCisgICAgICBLTVBfREVCVUdfQVNTRVJUKG9tcF9wcm9jX2JpbmQgIT0gTlVMTCk7CisKKyAgICAgIC8vICEhISB2b2xhdGlsZSBrZXl3b3JkIGlzIEludGVsIChSKSBDIENvbXBpbGVyIGJ1ZyBDUTQ5OTA4IHdvcmthcm91bmQuCisgICAgICBzdGF0aWMga21wX3NldHRpbmdfdCAqdm9sYXRpbGUgcml2YWxzWzRdOworICAgICAgaW50IGkgPSAwOworCisgICAgICByaXZhbHNbaSsrXSA9IGttcF9hZmZpbml0eTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgcml2YWxzW2krK10gPSBnb21wX2NwdV9hZmZpbml0eTsKKyAgICAgIGdvbXBfY3B1X2FmZmluaXR5LT5kYXRhID0gQ0NBU1Qoa21wX3NldHRpbmdfdCAqKiwgcml2YWxzKTsKKyNlbmRpZgorCisgICAgICByaXZhbHNbaSsrXSA9IG9tcF9wcm9jX2JpbmQ7CisgICAgICBvbXBfcHJvY19iaW5kLT5kYXRhID0gQ0NBU1Qoa21wX3NldHRpbmdfdCAqKiwgcml2YWxzKTsKKyAgICAgIHJpdmFsc1tpKytdID0gTlVMTDsKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICBzdGF0aWMga21wX3NldHRpbmdfdCAqdm9sYXRpbGUgcGxhY2VzX3JpdmFsc1s0XTsKKyAgICAgIGkgPSAwOworCisgICAgICBrbXBfc2V0dGluZ190ICpvbXBfcGxhY2VzID0gX19rbXBfc3RnX2ZpbmQoIk9NUF9QTEFDRVMiKTsgLy8gM3JkIHByaW9yaXR5LgorICAgICAgS01QX0RFQlVHX0FTU0VSVChvbXBfcGxhY2VzICE9IE5VTEwpOworCisgICAgICBwbGFjZXNfcml2YWxzW2krK10gPSBrbXBfYWZmaW5pdHk7CisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICBwbGFjZXNfcml2YWxzW2krK10gPSBnb21wX2NwdV9hZmZpbml0eTsKKyNlbmRpZgorICAgICAgcGxhY2VzX3JpdmFsc1tpKytdID0gb21wX3BsYWNlczsKKyAgICAgIG9tcF9wbGFjZXMtPmRhdGEgPSBDQ0FTVChrbXBfc2V0dGluZ190ICoqLCBwbGFjZXNfcml2YWxzKTsKKyAgICAgIHBsYWNlc19yaXZhbHNbaSsrXSA9IE5VTEw7CisjZW5kaWYKKyAgICB9CisjZWxzZQorLy8gS01QX0FGRklOSVRZIG5vdCBzdXBwb3J0ZWQsIHNvIE9NUF9QUk9DX0JJTkQgaGFzIG5vIHJpdmFscy4KKy8vIE9NUF9QTEFDRVMgbm90IHN1cHBvcnRlZCB5ZXQuCisjZW5kaWYgLy8gS01QX0FGRklOSVRZX1NVUFBPUlRFRAorCisgICAgeyAvLyBJbml0aWFsaXplIEtNUF9ERVRFUk1JTklTVElDX1JFRFVDVElPTiBhbmQgS01QX0ZPUkNFX1JFRFVDVElPTiBkYXRhLgorICAgICAga21wX3NldHRpbmdfdCAqa21wX2ZvcmNlX3JlZCA9CisgICAgICAgICAgX19rbXBfc3RnX2ZpbmQoIktNUF9GT1JDRV9SRURVQ1RJT04iKTsgLy8gMXN0IHByaW9yaXR5LgorICAgICAga21wX3NldHRpbmdfdCAqa21wX2RldGVybV9yZWQgPQorICAgICAgICAgIF9fa21wX3N0Z19maW5kKCJLTVBfREVURVJNSU5JU1RJQ19SRURVQ1RJT04iKTsgLy8gMm5kIHByaW9yaXR5LgorCisgICAgICAvLyAhISEgdm9sYXRpbGUga2V5d29yZCBpcyBJbnRlbCAoUikgQyBDb21waWxlciBidWcgQ1E0OTkwOCB3b3JrYXJvdW5kLgorICAgICAgc3RhdGljIGttcF9zZXR0aW5nX3QgKnZvbGF0aWxlIHJpdmFsc1szXTsKKyAgICAgIHN0YXRpYyBrbXBfc3RnX2ZyX2RhdGFfdCBmb3JjZV9kYXRhID0gezEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ0FTVChrbXBfc2V0dGluZ190ICoqLCByaXZhbHMpfTsKKyAgICAgIHN0YXRpYyBrbXBfc3RnX2ZyX2RhdGFfdCBkZXRlcm1fZGF0YSA9IHswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDQVNUKGttcF9zZXR0aW5nX3QgKiosIHJpdmFscyl9OworICAgICAgaW50IGkgPSAwOworCisgICAgICByaXZhbHNbaSsrXSA9IGttcF9mb3JjZV9yZWQ7CisgICAgICBpZiAoa21wX2RldGVybV9yZWQgIT0gTlVMTCkgeworICAgICAgICByaXZhbHNbaSsrXSA9IGttcF9kZXRlcm1fcmVkOworICAgICAgfTsgLy8gaWYKKyAgICAgIHJpdmFsc1tpKytdID0gTlVMTDsKKworICAgICAga21wX2ZvcmNlX3JlZC0+ZGF0YSA9ICZmb3JjZV9kYXRhOworICAgICAgaWYgKGttcF9kZXRlcm1fcmVkICE9IE5VTEwpIHsKKyAgICAgICAga21wX2RldGVybV9yZWQtPmRhdGEgPSAmZGV0ZXJtX2RhdGE7CisgICAgICB9OyAvLyBpZgorICAgIH0KKworICAgIGluaXRpYWxpemVkID0gMTsKKyAgfTsgLy8gaWYKKworICAvLyBSZXNldCBmbGFncy4KKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBfX2ttcF9zdGdfY291bnQ7ICsraSkgeworICAgIF9fa21wX3N0Z190YWJsZVtpXS5zZXQgPSAwOworICB9OyAvLyBmb3IKKworfSAvLyBfX2ttcF9zdGdfaW5pdAorCitzdGF0aWMgdm9pZCBfX2ttcF9zdGdfcGFyc2UoY2hhciBjb25zdCAqbmFtZSwgY2hhciBjb25zdCAqdmFsdWUpIHsKKyAgLy8gT24gV2luZG93cyogT1MgdGhlcmUgYXJlIHNvbWUgbmFtZWxlc3MgdmFyaWFibGVzIGxpa2UgIkM6PUM6XCIgKHllYWgsCisgIC8vIHJlYWxseSBuYW1lbGVzcywgdGhleSBhcmUgcHJlc2VudGVkIGluIGVudmlyb25tZW50IGJsb2NrIGFzCisgIC8vICI9Qzo9Q1xcXHgwMD1EOj1EOlxcXHgwMC4uLiIsIHNvIGxldCB1cyBza2lwIHRoZW0uCisgIGlmIChuYW1lWzBdID09IDApIHsKKyAgICByZXR1cm47CisgIH07IC8vIGlmCisKKyAgaWYgKHZhbHVlICE9IE5VTEwpIHsKKyAgICBrbXBfc2V0dGluZ190ICpzZXR0aW5nID0gX19rbXBfc3RnX2ZpbmQobmFtZSk7CisgICAgaWYgKHNldHRpbmcgIT0gTlVMTCkgeworICAgICAgc2V0dGluZy0+cGFyc2UobmFtZSwgdmFsdWUsIHNldHRpbmctPmRhdGEpOworICAgICAgc2V0dGluZy0+ZGVmaW5lZCA9IDE7CisgICAgfTsgLy8gaWYKKyAgfTsgLy8gaWYKKworfSAvLyBfX2ttcF9zdGdfcGFyc2UKKworc3RhdGljIGludCBfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCAvLyAwIC0tIE9rLCAxIC0tIGVycm9ycyBmb3VuZC4KKyAgICBjaGFyIGNvbnN0ICpuYW1lLCAvLyBOYW1lIG9mIHZhcmlhYmxlLgorICAgIGNoYXIgY29uc3QgKnZhbHVlLCAvLyBWYWx1ZSBvZiB0aGUgdmFyaWFibGUuCisgICAga21wX3NldHRpbmdfdCAqKnJpdmFscyAvLyBMaXN0IG9mIHJpdmFsIHNldHRpbmdzIChtdXN0IGluY2x1ZGUgY3VycmVudCBvbmUpLgorICAgICkgeworCisgIGlmIChyaXZhbHMgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gTG9vcCB0aHJ1IGhpZ2hlciBwcmlvcml0eSBzZXR0aW5ncyAobGlzdGVkIGJlZm9yZSBjdXJyZW50KS4KKyAgaW50IGkgPSAwOworICBmb3IgKDsgc3RyY21wKHJpdmFsc1tpXS0+bmFtZSwgbmFtZSkgIT0gMDsgaSsrKSB7CisgICAgS01QX0RFQlVHX0FTU0VSVChyaXZhbHNbaV0gIT0gTlVMTCk7CisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgaWYgKHJpdmFsc1tpXSA9PSBfX2ttcF9hZmZpbml0eV9ub3R5cGUpIHsKKyAgICAgIC8vIElmIEtNUF9BRkZJTklUWSBpcyBzcGVjaWZpZWQgd2l0aG91dCBhIHR5cGUgbmFtZSwKKyAgICAgIC8vIGl0IGRvZXMgbm90IHJpdmFsIE9NUF9QUk9DX0JJTkQgb3IgR09NUF9DUFVfQUZGSU5JVFkuCisgICAgICBjb250aW51ZTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChyaXZhbHNbaV0tPnNldCkgeworICAgICAgS01QX1dBUk5JTkcoU3RnSWdub3JlZCwgbmFtZSwgcml2YWxzW2ldLT5uYW1lKTsKKyAgICAgIHJldHVybiAxOworICAgIH07IC8vIGlmCisgIH07IC8vIHdoaWxlCisKKyAgKytpOyAvLyBTa2lwIGN1cnJlbnQgc2V0dGluZy4KKyAgcmV0dXJuIDA7CisKK307IC8vIF9fa21wX3N0Z19jaGVja19yaXZhbHMKKworc3RhdGljIGludCBfX2ttcF9lbnZfdG9QcmludChjaGFyIGNvbnN0ICpuYW1lLCBpbnQgZmxhZykgeworICBpbnQgcmMgPSAwOworICBrbXBfc2V0dGluZ190ICpzZXR0aW5nID0gX19rbXBfc3RnX2ZpbmQobmFtZSk7CisgIGlmIChzZXR0aW5nICE9IE5VTEwpIHsKKyAgICByYyA9IHNldHRpbmctPmRlZmluZWQ7CisgICAgaWYgKGZsYWcgPj0gMCkgeworICAgICAgc2V0dGluZy0+ZGVmaW5lZCA9IGZsYWc7CisgICAgfTsgLy8gaWYKKyAgfTsgLy8gaWYKKyAgcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBfX2ttcF9hdXhfZW52X2luaXRpYWxpemUoa21wX2Vudl9ibGtfdCAqYmxvY2spIHsKKworICBjaGFyIGNvbnN0ICp2YWx1ZTsKKworICAvKiBPTVBfTlVNX1RIUkVBRFMgKi8KKyAgdmFsdWUgPSBfX2ttcF9lbnZfYmxrX3ZhcihibG9jaywgIk9NUF9OVU1fVEhSRUFEUyIpOworICBpZiAodmFsdWUpIHsKKyAgICBvbXBjX3NldF9udW1fdGhyZWFkcyhfX2ttcF9kZmx0X3RlYW1fbnRoKTsKKyAgfQorCisgIC8qIEtNUF9CTE9DS1RJTUUgKi8KKyAgdmFsdWUgPSBfX2ttcF9lbnZfYmxrX3ZhcihibG9jaywgIktNUF9CTE9DS1RJTUUiKTsKKyAgaWYgKHZhbHVlKSB7CisgICAga21wY19zZXRfYmxvY2t0aW1lKF9fa21wX2RmbHRfYmxvY2t0aW1lKTsKKyAgfQorCisgIC8qIE9NUF9ORVNURUQgKi8KKyAgdmFsdWUgPSBfX2ttcF9lbnZfYmxrX3ZhcihibG9jaywgIk9NUF9ORVNURUQiKTsKKyAgaWYgKHZhbHVlKSB7CisgICAgb21wY19zZXRfbmVzdGVkKF9fa21wX2RmbHRfbmVzdGVkKTsKKyAgfQorCisgIC8qIE9NUF9EWU5BTUlDICovCisgIHZhbHVlID0gX19rbXBfZW52X2Jsa192YXIoYmxvY2ssICJPTVBfRFlOQU1JQyIpOworICBpZiAodmFsdWUpIHsKKyAgICBvbXBjX3NldF9keW5hbWljKF9fa21wX2dsb2JhbC5nLmdfZHluYW1pYyk7CisgIH0KKworfQorCit2b2lkIF9fa21wX2Vudl9pbml0aWFsaXplKGNoYXIgY29uc3QgKnN0cmluZykgeworCisgIGttcF9lbnZfYmxrX3QgYmxvY2s7CisgIGludCBpOworCisgIF9fa21wX3N0Z19pbml0KCk7CisKKyAgLy8gSGFjayEhIQorICBpZiAoc3RyaW5nID09IE5VTEwpIHsKKyAgICAvLyBfX2ttcF9tYXhfbnRoID0gX19rbXBfc3lzX21heF9udGg7CisgICAgX19rbXBfdGhyZWFkc19jYXBhY2l0eSA9CisgICAgICAgIF9fa21wX2luaXRpYWxfdGhyZWFkc19jYXBhY2l0eShfX2ttcF9kZmx0X3RlYW1fbnRoX3ViKTsKKyAgfTsgLy8gaWYKKyAgX19rbXBfZW52X2Jsa19pbml0KCZibG9jaywgc3RyaW5nKTsKKworICAvLyB1cGRhdGUgdGhlIHNldCBmbGFnIG9uIGFsbCBlbnRyaWVzIHRoYXQgaGF2ZSBhbiBlbnYgdmFyCisgIGZvciAoaSA9IDA7IGkgPCBibG9jay5jb3VudDsgKytpKSB7CisgICAgaWYgKChibG9jay52YXJzW2ldLm5hbWUgPT0gTlVMTCkgfHwgKCpibG9jay52YXJzW2ldLm5hbWUgPT0gJ1wwJykpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoYmxvY2sudmFyc1tpXS52YWx1ZSA9PSBOVUxMKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAga21wX3NldHRpbmdfdCAqc2V0dGluZyA9IF9fa21wX3N0Z19maW5kKGJsb2NrLnZhcnNbaV0ubmFtZSk7CisgICAgaWYgKHNldHRpbmcgIT0gTlVMTCkgeworICAgICAgc2V0dGluZy0+c2V0ID0gMTsKKyAgICB9CisgIH07IC8vIGZvciBpCisKKyAgLy8gV2UgbmVlZCB0byBrbm93IGlmIGJsb2NrdGltZSB3YXMgc2V0IHdoZW4gcHJvY2Vzc2luZyBPTVBfV0FJVF9QT0xJQ1kKKyAgYmxvY2t0aW1lX3N0ciA9IF9fa21wX2Vudl9ibGtfdmFyKCZibG9jaywgIktNUF9CTE9DS1RJTUUiKTsKKworICAvLyBTcGVjaWFsIGNhc2UuIElmIHdlIHBhcnNlIGVudmlyb25tZW50LCBub3QgYSBzdHJpbmcsIHByb2Nlc3MgS01QX1dBUk5JTkdTCisgIC8vIGZpcnN0LgorICBpZiAoc3RyaW5nID09IE5VTEwpIHsKKyAgICBjaGFyIGNvbnN0ICpuYW1lID0gIktNUF9XQVJOSU5HUyI7CisgICAgY2hhciBjb25zdCAqdmFsdWUgPSBfX2ttcF9lbnZfYmxrX3ZhcigmYmxvY2ssIG5hbWUpOworICAgIF9fa21wX3N0Z19wYXJzZShuYW1lLCB2YWx1ZSk7CisgIH07IC8vIGlmCisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgIC8vIFNwZWNpYWwgY2FzZS4gS01QX0FGRklOSVRZIGlzIG5vdCBhIHJpdmFsIHRvIG90aGVyIGFmZmluaXR5IGVudiB2YXJzCisgIC8vIGlmIG5vIGFmZmluaXR5IHR5cGUgaXMgc3BlY2lmaWVkLiAgV2Ugd2FudCB0byBhbGxvdworICAvLyBLTVBfQUZGSU5JVFk9W25vXSx2ZXJib3NlL1tub113YXJuaW5ncy9ldGMuICB0byBiZSBlbmFibGVkIHdoZW4KKyAgLy8gc3BlY2lmeWluZyB0aGUgYWZmaW5pdHkgdHlwZSB2aWEgR09NUF9DUFVfQUZGSU5JVFkgb3IgdGhlIE9NUCA0LjAKKyAgLy8gYWZmaW5pdHkgbWVjaGFuaXNtLgorICBfX2ttcF9hZmZpbml0eV9ub3R5cGUgPSBOVUxMOworICBjaGFyIGNvbnN0ICphZmZfc3RyID0gX19rbXBfZW52X2Jsa192YXIoJmJsb2NrLCAiS01QX0FGRklOSVRZIik7CisgIGlmIChhZmZfc3RyICE9IE5VTEwpIHsKKy8vIENoZWNrIGlmIHRoZSBLTVBfQUZGSU5JVFkgdHlwZSBpcyBzcGVjaWZpZWQgaW4gdGhlIHN0cmluZy4KKy8vIFdlIGp1c3Qgc2VhcmNoIHRoZSBzdHJpbmcgZm9yICJjb21wYWN0IiwgInNjYXR0ZXIiLCBldGMuCisvLyB3aXRob3V0IHJlYWxseSBwYXJzaW5nIHRoZSBzdHJpbmcuICBUaGUgc3ludGF4IG9mIHRoZQorLy8gS01QX0FGRklOSVRZIGVudiB2YXIgaXMgc3VjaCB0aGF0IG5vbmUgb2YgdGhlIGFmZmluaXR5CisvLyB0eXBlIG5hbWVzIGNhbiBhcHBlYXIgYW55d2hlcmUgb3RoZXIgdGhhdCB0aGUgdHlwZQorLy8gc3BlY2lmaWVyLCBldmVuIGFzIHN1YnN0cmluZ3MuCisvLworLy8gSSBjYW4ndCBmaW5kIGEgY2FzZS1pbnNlbnNpdGl2ZSB2ZXJzaW9uIG9mIHN0cnN0ciBvbiBXaW5kb3dzKiBPUy4KKy8vIFVzZSB0aGUgY2FzZS1zZW5zaXRpdmUgdmVyc2lvbiBmb3Igbm93LgorCisjaWYgS01QX09TX1dJTkRPV1MKKyNkZWZpbmUgRklORCBzdHJzdHIKKyNlbHNlCisjZGVmaW5lIEZJTkQgc3RyY2FzZXN0cgorI2VuZGlmCisKKyAgICBpZiAoKEZJTkQoYWZmX3N0ciwgIm5vbmUiKSA9PSBOVUxMKSAmJgorICAgICAgICAoRklORChhZmZfc3RyLCAicGh5c2ljYWwiKSA9PSBOVUxMKSAmJgorICAgICAgICAoRklORChhZmZfc3RyLCAibG9naWNhbCIpID09IE5VTEwpICYmCisgICAgICAgIChGSU5EKGFmZl9zdHIsICJjb21wYWN0IikgPT0gTlVMTCkgJiYKKyAgICAgICAgKEZJTkQoYWZmX3N0ciwgInNjYXR0ZXIiKSA9PSBOVUxMKSAmJgorICAgICAgICAoRklORChhZmZfc3RyLCAiZXhwbGljaXQiKSA9PSBOVUxMKSAmJgorICAgICAgICAoRklORChhZmZfc3RyLCAiYmFsYW5jZWQiKSA9PSBOVUxMKSAmJgorICAgICAgICAoRklORChhZmZfc3RyLCAiZGlzYWJsZWQiKSA9PSBOVUxMKSkgeworICAgICAgX19rbXBfYWZmaW5pdHlfbm90eXBlID0gX19rbXBfc3RnX2ZpbmQoIktNUF9BRkZJTklUWSIpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBBIG5ldyBhZmZpbml0eSB0eXBlIGlzIHNwZWNpZmllZC4KKyAgICAgIC8vIFJlc2V0IHRoZSBhZmZpbml0eSBmbGFncyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcywKKyAgICAgIC8vIGluIGNhc2UgdGhpcyBpcyBjYWxsZWQgZnJvbSBrbXBfc2V0X2RlZmF1bHRzKCkuCisgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfZGVmYXVsdDsKKyAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2RlZmF1bHQ7CisgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9kZWZhdWx0OworICAgICAgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrID0gYWZmaW5pdHlfcmVzcGVjdF9tYXNrX2RlZmF1bHQ7CisgICAgfQorI3VuZGVmIEZJTkQKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgLy8gQWxzbyByZXNldCB0aGUgYWZmaW5pdHkgZmxhZ3MgaWYgT01QX1BST0NfQklORCBpcyBzcGVjaWZpZWQuCisgICAgYWZmX3N0ciA9IF9fa21wX2Vudl9ibGtfdmFyKCZibG9jaywgIk9NUF9QUk9DX0JJTkQiKTsKKyAgICBpZiAoYWZmX3N0ciAhPSBOVUxMKSB7CisgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfZGVmYXVsdDsKKyAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2RlZmF1bHQ7CisgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9kZWZhdWx0OworICAgICAgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrID0gYWZmaW5pdHlfcmVzcGVjdF9tYXNrX2RlZmF1bHQ7CisgICAgfQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgIH0KKworI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworI2lmIE9NUF80MF9FTkFCTEVECisgIC8vIFNldCB1cCB0aGUgbmVzdGVkIHByb2MgYmluZCB0eXBlIHZlY3Rvci4KKyAgaWYgKF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlcyA9PSBOVUxMKSB7CisgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzID0KKyAgICAgICAgKGttcF9wcm9jX2JpbmRfdCAqKUtNUF9JTlRFUk5BTF9NQUxMT0Moc2l6ZW9mKGttcF9wcm9jX2JpbmRfdCkpOworICAgIGlmIChfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXMgPT0gTlVMTCkgeworICAgICAgS01QX0ZBVEFMKE1lbW9yeUFsbG9jRmFpbGVkKTsKKyAgICB9CisgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5zaXplID0gMTsKKyAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgPSAxOworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfZGVmYXVsdDsKKyNlbHNlCisgICAgLy8gZGVmYXVsdCBwcm9jIGJpbmQgaXMgZmFsc2UgaWYgYWZmaW5pdHkgbm90IHN1cHBvcnRlZAorICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9mYWxzZTsKKyNlbmRpZgorICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworICAvLyBOb3cgcHJvY2VzcyBhbGwgb2YgdGhlIHNldHRpbmdzLgorICBmb3IgKGkgPSAwOyBpIDwgYmxvY2suY291bnQ7ICsraSkgeworICAgIF9fa21wX3N0Z19wYXJzZShibG9jay52YXJzW2ldLm5hbWUsIGJsb2NrLnZhcnNbaV0udmFsdWUpOworICB9OyAvLyBmb3IgaQorCisgIC8vIElmIHVzZXIgbG9ja3MgaGF2ZSBiZWVuIGFsbG9jYXRlZCB5ZXQsIGRvbid0IHJlc2V0IHRoZSBsb2NrIHZwdHIgdGFibGUuCisgIGlmICghX19rbXBfaW5pdF91c2VyX2xvY2tzKSB7CisgICAgaWYgKF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2RlZmF1bHQpIHsKKyAgICAgIF9fa21wX3VzZXJfbG9ja19raW5kID0gbGtfcXVldWluZzsKKyAgICB9CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICBfX2ttcF9pbml0X2R5bmFtaWNfdXNlcl9sb2NrcygpOworI2Vsc2UKKyAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX3ZwdHJzKF9fa21wX3VzZXJfbG9ja19raW5kKTsKKyNlbmRpZgorICB9IGVsc2UgeworICAgIEtNUF9ERUJVR19BU1NFUlQoc3RyaW5nICE9IE5VTEwpOyAvLyBrbXBfc2V0X2RlZmF1bHRzKCkgd2FzIGNhbGxlZAorICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfdXNlcl9sb2NrX2tpbmQgIT0gbGtfZGVmYXVsdCk7CisvLyBCaW5kcyBsb2NrIGZ1bmN0aW9ucyBhZ2FpbiB0byBmb2xsb3cgdGhlIHRyYW5zaXRpb24gYmV0d2VlbiBkaWZmZXJlbnQKKy8vIEtNUF9DT05TSVNURU5DWV9DSEVDSyB2YWx1ZXMuIENhbGxpbmcgdGhpcyBhZ2FpbiBpcyBoYXJtbGVzcyBhcyBsb25nCisvLyBhcyB3ZSBkbyBub3QgYWxsb3cgbG9jayBraW5kIGNoYW5nZXMgYWZ0ZXIgbWFraW5nIGEgY2FsbCB0byBhbnkKKy8vIHVzZXIgbG9jayBmdW5jdGlvbnMgKHRydWUpLgorI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgX19rbXBfaW5pdF9keW5hbWljX3VzZXJfbG9ja3MoKTsKKyNlbHNlCisgICAgX19rbXBfc2V0X3VzZXJfbG9ja192cHRycyhfX2ttcF91c2VyX2xvY2tfa2luZCk7CisjZW5kaWYKKyAgfQorCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorCisgIGlmICghVENSXzQoX19rbXBfaW5pdF9taWRkbGUpKSB7CisgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBtYWNoaW5lL09TIGlzIGFjdHVhbGx5IGNhcGFibGUgb2Ygc3VwcG9ydGluZworICAgIC8vIGFmZmluaXR5LgorICAgIGNvbnN0IGNoYXIgKnZhciA9ICJLTVBfQUZGSU5JVFkiOworICAgIEtNUEFmZmluaXR5OjpwaWNrX2FwaSgpOworI2lmIEtNUF9VU0VfSFdMT0MKKyAgICAvLyBJZiBId2xvYyB0b3BvbG9neSBkaXNjb3Zlcnkgd2FzIHJlcXVlc3RlZCBidXQgYWZmaW5pdHkgd2FzIGFsc28gZGlzYWJsZWQsCisgICAgLy8gdGhlbiB0ZWxsIHVzZXIgdGhhdCBId2xvYyByZXF1ZXN0IGlzIGJlaW5nIGlnbm9yZWQgYW5kIHVzZSBkZWZhdWx0CisgICAgLy8gdG9wb2xvZ3kgZGlzY292ZXJ5IG1ldGhvZC4KKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX2h3bG9jICYmCisgICAgICAgIF9fa21wX2FmZmluaXR5X2Rpc3BhdGNoLT5nZXRfYXBpX3R5cGUoKSAhPSBLTVBBZmZpbml0eTo6SFdMT0MpIHsKKyAgICAgIEtNUF9XQVJOSU5HKEFmZklnbm9yaW5nSHdsb2MsIHZhcik7CisgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9hbGw7CisgICAgfQorI2VuZGlmCisgICAgaWYgKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfZGlzYWJsZWQpIHsKKyAgICAgIEtNUF9BRkZJTklUWV9ESVNBQkxFKCk7CisgICAgfSBlbHNlIGlmICghS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgICAgX19rbXBfYWZmaW5pdHlfZGlzcGF0Y2gtPmRldGVybWluZV9jYXBhYmxlKHZhcik7CisgICAgICBpZiAoIUtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwKKyAgICAgICAgICAgIChfX2ttcF9hZmZpbml0eV93YXJuaW5ncyAmJgorICAgICAgICAgICAgIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2RlZmF1bHQpICYmCisgICAgICAgICAgICAgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkgJiYKKyAgICAgICAgICAgICAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kaXNhYmxlZCkpKSB7CisgICAgICAgICAgS01QX1dBUk5JTkcoQWZmTm90U3VwcG9ydGVkLCB2YXIpOworICAgICAgICB9CisgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9kaXNhYmxlZDsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrID0gMDsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fZmluZTsKKyAgICAgIH0KKyAgICB9CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2Rpc2FibGVkKSB7CisgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfZmFsc2U7CisgICAgfSBlbHNlIGlmIChfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPT0gcHJvY19iaW5kX3RydWUpIHsKKyAgICAgIC8vIE9NUF9QUk9DX0JJTkQ9dHJ1ZSBtYXBzIHRvIE9NUF9QUk9DX0JJTkQ9c3ByZWFkLgorICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX3NwcmVhZDsKKyAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworICAgIGlmIChLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisKKyNpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKyAgICAgIC8vIFRoaXMgY2hlY2tzIHRvIHNlZSBpZiB0aGUgaW5pdGlhbCBhZmZpbml0eSBtYXNrIGlzIGVxdWFsCisgICAgICAvLyB0byBhIHNpbmdsZSB3aW5kb3dzIHByb2Nlc3NvciBncm91cC4gIElmIGl0IGlzLCB0aGVuIHdlIGRvCisgICAgICAvLyBub3QgcmVzcGVjdCB0aGUgaW5pdGlhbCBhZmZpbml0eSBtYXNrIGFuZCBpbnN0ZWFkLCB1c2UgdGhlCisgICAgICAvLyBlbnRpcmUgbWFjaGluZS4KKyAgICAgIGJvb2wgZXhhY3RseV9vbmVfZ3JvdXAgPSBmYWxzZTsKKyAgICAgIGlmIChfX2ttcF9udW1fcHJvY19ncm91cHMgPiAxKSB7CisgICAgICAgIGludCBncm91cDsKKyAgICAgICAgYm9vbCB3aXRoaW5fb25lX2dyb3VwOworICAgICAgICAvLyBHZXQgdGhlIGluaXRpYWwgYWZmaW5pdHkgbWFzayBhbmQgZGV0ZXJtaW5lIGlmIGl0IGlzCisgICAgICAgIC8vIGNvbnRhaW5lZCB3aXRoaW4gYSBzaW5nbGUgZ3JvdXAuCisgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgKmluaXRfbWFzazsKKyAgICAgICAgS01QX0NQVV9BTExPQyhpbml0X21hc2spOworICAgICAgICBfX2ttcF9nZXRfc3lzdGVtX2FmZmluaXR5KGluaXRfbWFzaywgVFJVRSk7CisgICAgICAgIGdyb3VwID0gX19rbXBfZ2V0X3Byb2NfZ3JvdXAoaW5pdF9tYXNrKTsKKyAgICAgICAgd2l0aGluX29uZV9ncm91cCA9IChncm91cCA+PSAwKTsKKyAgICAgICAgLy8gSWYgdGhlIGluaXRpYWwgYWZmaW5pdHkgaXMgd2l0aGluIGEgc2luZ2xlIGdyb3VwLAorICAgICAgICAvLyB0aGVuIGRldGVybWluZSBpZiBpdCBpcyBlcXVhbCB0byB0aGF0IHNpbmdsZSBncm91cC4KKyAgICAgICAgaWYgKHdpdGhpbl9vbmVfZ3JvdXApIHsKKyAgICAgICAgICBEV09SRCBudW1fYml0c19pbl9ncm91cCA9IF9fa21wX0dldEFjdGl2ZVByb2Nlc3NvckNvdW50KGdyb3VwKTsKKyAgICAgICAgICBpbnQgbnVtX2JpdHNfaW5fbWFzayA9IDA7CisgICAgICAgICAgZm9yIChpbnQgYml0ID0gaW5pdF9tYXNrLT5iZWdpbigpOyBiaXQgIT0gaW5pdF9tYXNrLT5lbmQoKTsKKyAgICAgICAgICAgICAgIGJpdCA9IGluaXRfbWFzay0+bmV4dChiaXQpKQorICAgICAgICAgICAgbnVtX2JpdHNfaW5fbWFzaysrOworICAgICAgICAgIGV4YWN0bHlfb25lX2dyb3VwID0gKG51bV9iaXRzX2luX2dyb3VwID09IG51bV9iaXRzX2luX21hc2spOworICAgICAgICB9CisgICAgICAgIEtNUF9DUFVfRlJFRShpbml0X21hc2spOworICAgICAgfQorCisgICAgICAvLyBIYW5kbGUgdGhlIFdpbiA2NCBncm91cCBhZmZpbml0eSBzdHVmZiBpZiB0aGVyZSBhcmUgbXVsdGlwbGUKKyAgICAgIC8vIHByb2Nlc3NvciBncm91cHMsIG9yIGlmIHRoZSB1c2VyIHJlcXVlc3RlZCBpdCwgYW5kIE9NUCA0LjAKKyAgICAgIC8vIGFmZmluaXR5IGlzIG5vdCBpbiBlZmZlY3QuCisgICAgICBpZiAoKChfX2ttcF9udW1fcHJvY19ncm91cHMgPiAxKSAmJgorICAgICAgICAgICAoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9kZWZhdWx0KQorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICYmIChfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPT0gcHJvY19iaW5kX2RlZmF1bHQpKQorI2VuZGlmCisgICAgICAgICAgfHwgKF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPT0gYWZmaW5pdHlfdG9wX21ldGhvZF9ncm91cCkpIHsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzayA9PSBhZmZpbml0eV9yZXNwZWN0X21hc2tfZGVmYXVsdCAmJgorICAgICAgICAgICAgZXhhY3RseV9vbmVfZ3JvdXApIHsKKyAgICAgICAgICBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgPSBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9kZWZhdWx0KSB7CisgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X2NvbXBhY3Q7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfaW50ZWw7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX2RlZmF1bHQpIHsKKyAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2RlZmF1bHQpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX2dyb3VwOworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fZ3JvdXA7CisgICAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZ3JvdXApIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX2dyb3VwOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9hbGw7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPT0gYWZmaW5pdHlfdG9wX21ldGhvZF9ncm91cCkgeworICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZGVmYXVsdCkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fZ3JvdXA7CisgICAgICAgICAgfSBlbHNlIGlmICgoX19rbXBfYWZmaW5pdHlfZ3JhbiAhPSBhZmZpbml0eV9ncmFuX2dyb3VwKSAmJgorICAgICAgICAgICAgICAgICAgICAgKF9fa21wX2FmZmluaXR5X2dyYW4gIT0gYWZmaW5pdHlfZ3Jhbl9maW5lKSAmJgorICAgICAgICAgICAgICAgICAgICAgKF9fa21wX2FmZmluaXR5X2dyYW4gIT0gYWZmaW5pdHlfZ3Jhbl90aHJlYWQpKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpzdHIgPSBOVUxMOworICAgICAgICAgICAgc3dpdGNoIChfX2ttcF9hZmZpbml0eV9ncmFuKSB7CisgICAgICAgICAgICBjYXNlIGFmZmluaXR5X2dyYW5fY29yZToKKyAgICAgICAgICAgICAgc3RyID0gImNvcmUiOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlOgorICAgICAgICAgICAgICBzdHIgPSAicGFja2FnZSI7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9ncmFuX25vZGU6CisgICAgICAgICAgICAgIHN0ciA9ICJub2RlIjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmR3JhblRvcEdyb3VwLCB2YXIsIHN0cik7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9maW5lOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2RlZmF1bHQpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2NvcmU7CisgICAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZ3JvdXApIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0ciA9IE5VTEw7CisgICAgICAgICAgICBzd2l0Y2ggKF9fa21wX2FmZmluaXR5X3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfcGh5c2ljYWw6CisgICAgICAgICAgICAgIHN0ciA9ICJwaHlzaWNhbCI7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9sb2dpY2FsOgorICAgICAgICAgICAgICBzdHIgPSAibG9naWNhbCI7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9jb21wYWN0OgorICAgICAgICAgICAgICBzdHIgPSAiY29tcGFjdCI7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9zY2F0dGVyOgorICAgICAgICAgICAgICBzdHIgPSAic2NhdHRlciI7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9leHBsaWNpdDoKKyAgICAgICAgICAgICAgc3RyID0gImV4cGxpY2l0IjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvLyBObyBNSUMgb24gd2luZG93cywgc28gbm8gYWZmaW5pdHlfYmFsYW5jZWQgY2FzZQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZkdyYW5Hcm91cFR5cGUsIHZhciwgc3RyKTsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2NvcmU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UKKworI2VuZGlmIC8qIEtNUF9HUk9VUF9BRkZJTklUWSAqLworCisgICAgICB7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgPT0gYWZmaW5pdHlfcmVzcGVjdF9tYXNrX2RlZmF1bHQpIHsKKyNpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKyAgICAgICAgICBpZiAoX19rbXBfbnVtX3Byb2NfZ3JvdXBzID4gMSAmJiBleGFjdGx5X29uZV9ncm91cCkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrID0gRkFMU0U7CisgICAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisgICAgICAgICAgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrID0gVFJVRTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBpZiAoKF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSAhPSBwcm9jX2JpbmRfaW50ZWwpICYmCisgICAgICAgICAgICAoX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdICE9IHByb2NfYmluZF9kZWZhdWx0KSkgeworICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2RlZmF1bHQpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9jb21wYWN0OworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZHVwcyA9IEZBTFNFOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2RlZmF1bHQpIHsKKyNpZiBPTVBfNDBfRU5BQkxFRAorI2lmIEtNUF9NSUNfU1VQUE9SVEVECisgICAgICAgICAgaWYgKF9fa21wX21pY190eXBlICE9IG5vbl9taWMpIHsKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9pbnRlbDsKKyAgICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9mYWxzZTsKKyAgICAgICAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyNpZiBLTVBfTUlDX1NVUFBPUlRFRAorICAgICAgICAgIGlmIChfX2ttcF9taWNfdHlwZSAhPSBub25fbWljKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfc2NhdHRlcjsKKyAgICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9ub25lOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9kZWZhdWx0KSAmJgorICAgICAgICAgICAgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzIDwgMCkpIHsKKyNpZiBLTVBfTUlDX1NVUFBPUlRFRAorICAgICAgICAgIGlmIChfX2ttcF9taWNfdHlwZSAhPSBub25fbWljKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9maW5lOworICAgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgICAgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fY29yZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPT0gYWZmaW5pdHlfdG9wX21ldGhvZF9kZWZhdWx0KSB7CisgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfYWxsOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgS19ESUFHKDEsICgiX19rbXBfYWZmaW5pdHlfdHlwZSAgICAgICAgID09ICVkXG4iLCBfX2ttcF9hZmZpbml0eV90eXBlKSk7CisgICAgS19ESUFHKDEsICgiX19rbXBfYWZmaW5pdHlfY29tcGFjdCAgICAgID09ICVkXG4iLCBfX2ttcF9hZmZpbml0eV9jb21wYWN0KSk7CisgICAgS19ESUFHKDEsICgiX19rbXBfYWZmaW5pdHlfb2Zmc2V0ICAgICAgID09ICVkXG4iLCBfX2ttcF9hZmZpbml0eV9vZmZzZXQpKTsKKyAgICBLX0RJQUcoMSwgKCJfX2ttcF9hZmZpbml0eV92ZXJib3NlICAgICAgPT0gJWRcbiIsIF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpKTsKKyAgICBLX0RJQUcoMSwgKCJfX2ttcF9hZmZpbml0eV93YXJuaW5ncyAgICAgPT0gJWRcbiIsIF9fa21wX2FmZmluaXR5X3dhcm5pbmdzKSk7CisgICAgS19ESUFHKDEsICgiX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrID09ICVkXG4iLAorICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrKSk7CisgICAgS19ESUFHKDEsICgiX19rbXBfYWZmaW5pdHlfZ3JhbiAgICAgICAgID09ICVkXG4iLCBfX2ttcF9hZmZpbml0eV9ncmFuKSk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZGVmYXVsdCk7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSAhPSBwcm9jX2JpbmRfZGVmYXVsdCk7CisjZW5kaWYKKyAgfQorCisjZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworCisgIGlmIChfX2ttcF92ZXJzaW9uKSB7CisgICAgX19rbXBfcHJpbnRfdmVyc2lvbl8xKCk7CisgIH07IC8vIGlmCisKKyAgLy8gUG9zdC1pbml0aWFsaXphdGlvbiBzdGVwOiBzb21lIGVudi4gdmFycyBuZWVkIHRoZWlyIHZhbHVlJ3MgZnVydGhlcgorICAvLyBwcm9jZXNzaW5nCisgIGlmIChzdHJpbmcgIT0gTlVMTCkgeyAvLyBrbXBfc2V0X2RlZmF1bHRzKCkgd2FzIGNhbGxlZAorICAgIF9fa21wX2F1eF9lbnZfaW5pdGlhbGl6ZSgmYmxvY2spOworICB9CisKKyAgX19rbXBfZW52X2Jsa19mcmVlKCZibG9jayk7CisKKyAgS01QX01CKCk7CisKK30gLy8gX19rbXBfZW52X2luaXRpYWxpemUKKwordm9pZCBfX2ttcF9lbnZfcHJpbnQoKSB7CisKKyAga21wX2Vudl9ibGtfdCBibG9jazsKKyAgaW50IGk7CisgIGttcF9zdHJfYnVmX3QgYnVmZmVyOworCisgIF9fa21wX3N0Z19pbml0KCk7CisgIF9fa21wX3N0cl9idWZfaW5pdCgmYnVmZmVyKTsKKworICBfX2ttcF9lbnZfYmxrX2luaXQoJmJsb2NrLCBOVUxMKTsKKyAgX19rbXBfZW52X2Jsa19zb3J0KCZibG9jayk7CisKKyAgLy8gUHJpbnQgcmVhbCBlbnZpcm9ubWVudCB2YWx1ZXMuCisgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZmZlciwgIlxuJXNcblxuIiwgS01QX0kxOE5fU1RSKFVzZXJTZXR0aW5ncykpOworICBmb3IgKGkgPSAwOyBpIDwgYmxvY2suY291bnQ7ICsraSkgeworICAgIGNoYXIgY29uc3QgKm5hbWUgPSBibG9jay52YXJzW2ldLm5hbWU7CisgICAgY2hhciBjb25zdCAqdmFsdWUgPSBibG9jay52YXJzW2ldLnZhbHVlOworICAgIGlmICgoS01QX1NUUkxFTihuYW1lKSA+IDQgJiYgc3RybmNtcChuYW1lLCAiS01QXyIsIDQpID09IDApIHx8CisgICAgICAgIHN0cm5jbXAobmFtZSwgIk9NUF8iLCA0KSA9PSAwCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgIHx8IHN0cm5jbXAobmFtZSwgIkdPTVBfIiwgNSkgPT0gMAorI2VuZGlmIC8vIEtNUF9HT01QX0NPTVBBVAorICAgICAgICApIHsKKyAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZmZlciwgIiAgICVzPSVzXG4iLCBuYW1lLCB2YWx1ZSk7CisgICAgfTsgLy8gaWYKKyAgfTsgLy8gZm9yCisgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZmZlciwgIlxuIik7CisKKyAgLy8gUHJpbnQgaW50ZXJuYWwgKGVmZmVjdGl2ZSkgc2V0dGluZ3MuCisgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZmZlciwgIiVzXG5cbiIsIEtNUF9JMThOX1NUUihFZmZlY3RpdmVTZXR0aW5ncykpOworICBmb3IgKGludCBpID0gMDsgaSA8IF9fa21wX3N0Z19jb3VudDsgKytpKSB7CisgICAgaWYgKF9fa21wX3N0Z190YWJsZVtpXS5wcmludCAhPSBOVUxMKSB7CisgICAgICBfX2ttcF9zdGdfdGFibGVbaV0ucHJpbnQoJmJ1ZmZlciwgX19rbXBfc3RnX3RhYmxlW2ldLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3RhYmxlW2ldLmRhdGEpOworICAgIH07IC8vIGlmCisgIH07IC8vIGZvcgorCisgIF9fa21wX3ByaW50ZigiJXMiLCBidWZmZXIuc3RyKTsKKworICBfX2ttcF9lbnZfYmxrX2ZyZWUoJmJsb2NrKTsKKyAgX19rbXBfc3RyX2J1Zl9mcmVlKCZidWZmZXIpOworCisgIF9fa21wX3ByaW50ZigiXG4iKTsKKworfSAvLyBfX2ttcF9lbnZfcHJpbnQKKworI2lmIE9NUF80MF9FTkFCTEVECit2b2lkIF9fa21wX2Vudl9wcmludF8yKCkgeworCisgIGttcF9lbnZfYmxrX3QgYmxvY2s7CisgIGttcF9zdHJfYnVmX3QgYnVmZmVyOworCisgIF9fa21wX2Vudl9mb3JtYXQgPSAxOworCisgIF9fa21wX3N0Z19pbml0KCk7CisgIF9fa21wX3N0cl9idWZfaW5pdCgmYnVmZmVyKTsKKworICBfX2ttcF9lbnZfYmxrX2luaXQoJmJsb2NrLCBOVUxMKTsKKyAgX19rbXBfZW52X2Jsa19zb3J0KCZibG9jayk7CisKKyAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmZmVyLCAiXG4lc1xuIiwgS01QX0kxOE5fU1RSKERpc3BsYXlFbnZCZWdpbikpOworICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWZmZXIsICIgICBfT1BFTk1QPSclZCdcbiIsIF9fa21wX29wZW5tcF92ZXJzaW9uKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IF9fa21wX3N0Z19jb3VudDsgKytpKSB7CisgICAgaWYgKF9fa21wX3N0Z190YWJsZVtpXS5wcmludCAhPSBOVUxMICYmCisgICAgICAgICgoX19rbXBfZGlzcGxheV9lbnYgJiYKKyAgICAgICAgICBzdHJuY21wKF9fa21wX3N0Z190YWJsZVtpXS5uYW1lLCAiT01QXyIsIDQpID09IDApIHx8CisgICAgICAgICBfX2ttcF9kaXNwbGF5X2Vudl92ZXJib3NlKSkgeworICAgICAgX19rbXBfc3RnX3RhYmxlW2ldLnByaW50KCZidWZmZXIsIF9fa21wX3N0Z190YWJsZVtpXS5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z190YWJsZVtpXS5kYXRhKTsKKyAgICB9OyAvLyBpZgorICB9OyAvLyBmb3IKKworICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWZmZXIsICIlc1xuIiwgS01QX0kxOE5fU1RSKERpc3BsYXlFbnZFbmQpKTsKKyAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmZmVyLCAiXG4iKTsKKworICBfX2ttcF9wcmludGYoIiVzIiwgYnVmZmVyLnN0cik7CisKKyAgX19rbXBfZW52X2Jsa19mcmVlKCZibG9jayk7CisgIF9fa21wX3N0cl9idWZfZnJlZSgmYnVmZmVyKTsKKworICBfX2ttcF9wcmludGYoIlxuIik7CisKK30gLy8gX19rbXBfZW52X3ByaW50XzIKKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisvLyBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3NldHRpbmdzLmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc2V0dGluZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzBjNjM2Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3NldHRpbmdzLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIGttcF9zZXR0aW5ncy5oIC0tIEluaXRpYWxpemUgZW52aXJvbm1lbnQgdmFyaWFibGVzCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX1NFVFRJTkdTX0gKKyNkZWZpbmUgS01QX1NFVFRJTkdTX0gKKwordm9pZCBfX2ttcF9yZXNldF9nbG9iYWxfdmFycyh2b2lkKTsKK3ZvaWQgX19rbXBfZW52X2luaXRpYWxpemUoY2hhciBjb25zdCAqKTsKK3ZvaWQgX19rbXBfZW52X3ByaW50KCk7CisjaWYgT01QXzQwX0VOQUJMRUQKK3ZvaWQgX19rbXBfZW52X3ByaW50XzIoKTsKKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCitpbnQgX19rbXBfaW5pdGlhbF90aHJlYWRzX2NhcGFjaXR5KGludCByZXFfbnByb2MpOwordm9pZCBfX2ttcF9pbml0X2RmbHRfdGVhbV9udGgoKTsKK2ludCBfX2ttcF9jb252ZXJ0X3RvX21pbGxpc2Vjb25kcyhjaGFyIGNvbnN0ICopOworaW50IF9fa21wX2RlZmF1bHRfdHBfY2FwYWNpdHkoaW50LCBpbnQsIGludCk7CisKKyNpZiBLTVBfTUlDCisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIiAgJXMgJXMiLCBLTVBfSTE4Tl9TVFIoRGV2aWNlKSwgbmFtZSkKKyNkZWZpbmUgS01QX1NUUl9CVUZfUFJJTlRfTkFNRV9FWCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiICAlcyAlcz0nIiwgS01QX0kxOE5fU1RSKERldmljZSksIHgpCisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIiAgJXMgJXM9JyVzJ1xuIiwgS01QX0kxOE5fU1RSKERldmljZSksIG5hbWUsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA/ICJUUlVFIiA6ICJGQUxTRSIpOworI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIgICVzICVzPSclZCdcbiIsIEtNUF9JMThOX1NUUihEZXZpY2UpLCBuYW1lLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpCisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX1VJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIiAgJXMgJXM9JyUiIEtNUF9VSU5UNjRfU1BFQyAiJ1xuIiwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBLTVBfSTE4Tl9TVFIoRGV2aWNlKSwgbmFtZSwgdmFsdWUpOworI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9TVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIgICVzICVzPSclcydcbiIsIEtNUF9JMThOX1NUUihEZXZpY2UpLCBuYW1lLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpCisjZWxzZQorI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIgICVzICVzIiwgS01QX0kxOE5fU1RSKEhvc3QpLCBuYW1lKQorI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIgICVzICVzPSciLCBLTVBfSTE4Tl9TVFIoSG9zdCksIHgpCisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIiAgJXMgJXM9JyVzJ1xuIiwgS01QX0kxOE5fU1RSKEhvc3QpLCBuYW1lLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA/ICJUUlVFIiA6ICJGQUxTRSIpOworI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIgICVzICVzPSclZCdcbiIsIEtNUF9JMThOX1NUUihIb3N0KSwgbmFtZSwgdmFsdWUpCisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX1VJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIiAgJXMgJXM9JyUiIEtNUF9VSU5UNjRfU1BFQyAiJ1xuIiwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBLTVBfSTE4Tl9TVFIoSG9zdCksIG5hbWUsIHZhbHVlKTsKKyNkZWZpbmUgS01QX1NUUl9CVUZfUFJJTlRfU1RSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX3N0cl9idWZfcHJpbnQoYnVmZmVyLCAiICAlcyAlcz0nJXMnXG4iLCBLTVBfSTE4Tl9TVFIoSG9zdCksIG5hbWUsIHZhbHVlKQorI2VuZGlmCisKKyNlbmRpZiAvLyBLTVBfU0VUVElOR1NfSAorCisvLyBlbmQgb2YgZmlsZSAvLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3N0YXRzLmNwcCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdGF0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVlYTRkZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdGF0cy5jcHAKQEAgLTAsMCArMSw3MTUgQEAKKy8qKiBAZmlsZSBrbXBfc3RhdHMuY3BwCisgKiBTdGF0aXN0aWNzIGdhdGhlcmluZyBhbmQgcHJvY2Vzc2luZy4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9sb2NrLmgiCisjaW5jbHVkZSAia21wX3N0YXRzLmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGN0aW1lPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdGRsaWIuaD4gLy8gZm9yIGF0ZXhpdAorCisjZGVmaW5lIFNUUklOR0laRTIoeCkgI3gKKyNkZWZpbmUgU1RSSU5HSVpFKHgpIFNUUklOR0laRTIoeCkKKworI2RlZmluZSBleHBhbmROYW1lKG5hbWUsIGZsYWdzLCBpZ25vcmUpIHtTVFJJTkdJWkUobmFtZSksIGZsYWdzfSwKK3N0YXRJbmZvIHRpbWVTdGF0Ojp0aW1lckluZm9bXSA9IHsKKyAgICBLTVBfRk9SRUFDSF9USU1FUihleHBhbmROYW1lLCAwKXsiVElNRVJfTEFTVCIsIDB9fTsKK2NvbnN0IHN0YXRJbmZvIGNvdW50ZXI6OmNvdW50ZXJJbmZvW10gPSB7CisgICAgS01QX0ZPUkVBQ0hfQ09VTlRFUihleHBhbmROYW1lLCAwKXsiQ09VTlRFUl9MQVNUIiwgMH19OworI3VuZGVmIGV4cGFuZE5hbWUKKworI2RlZmluZSBleHBhbmROYW1lKGlnbm9yZTEsIGlnbm9yZTIsIGlnbm9yZTMpIHswLjAsIDAuMCwgMC4wfSwKK2ttcF9zdGF0c19vdXRwdXRfbW9kdWxlOjpyZ2JfY29sb3Iga21wX3N0YXRzX291dHB1dF9tb2R1bGU6OnRpbWVyQ29sb3JJbmZvW10gPSB7CisgICAgS01QX0ZPUkVBQ0hfVElNRVIoZXhwYW5kTmFtZSwgMCl7MC4wLCAwLjAsIDAuMH19OworI3VuZGVmIGV4cGFuZE5hbWUKKworY29uc3Qga21wX3N0YXRzX291dHB1dF9tb2R1bGU6OnJnYl9jb2xvcgorICAgIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlOjpnbG9iYWxDb2xvckFycmF5W10gPSB7CisgICAgICAgIHsxLjAsIDAuMCwgMC4wfSwgLy8gcmVkCisgICAgICAgIHsxLjAsIDAuNiwgMC4wfSwgLy8gb3JhbmdlCisgICAgICAgIHsxLjAsIDEuMCwgMC4wfSwgLy8geWVsbG93CisgICAgICAgIHswLjAsIDEuMCwgMC4wfSwgLy8gZ3JlZW4KKyAgICAgICAgezAuMCwgMC4wLCAxLjB9LCAvLyBibHVlCisgICAgICAgIHswLjYsIDAuMiwgMC44fSwgLy8gcHVycGxlCisgICAgICAgIHsxLjAsIDAuMCwgMS4wfSwgLy8gbWFnZW50YQorICAgICAgICB7MC4wLCAwLjQsIDAuMn0sIC8vIGRhcmsgZ3JlZW4KKyAgICAgICAgezEuMCwgMS4wLCAwLjZ9LCAvLyBsaWdodCB5ZWxsb3cKKyAgICAgICAgezAuNiwgMC40LCAwLjZ9LCAvLyBkaXJ0eSBwdXJwbGUKKyAgICAgICAgezAuMCwgMS4wLCAxLjB9LCAvLyBjeWFuCisgICAgICAgIHsxLjAsIDAuNCwgMC44fSwgLy8gcGluaworICAgICAgICB7MC41LCAwLjUsIDAuNX0sIC8vIGdyZXkKKyAgICAgICAgezAuOCwgMC43LCAwLjV9LCAvLyBicm93bgorICAgICAgICB7MC42LCAwLjYsIDEuMH0sIC8vIGxpZ2h0IGJsdWUKKyAgICAgICAgezEuMCwgMC43LCAwLjV9LCAvLyBwZWFjaAorICAgICAgICB7MC44LCAwLjUsIDEuMH0sIC8vIGxhdmVuZGVyCisgICAgICAgIHswLjYsIDAuMCwgMC4wfSwgLy8gZGFyayByZWQKKyAgICAgICAgezAuNywgMC42LCAwLjB9LCAvLyBnb2xkCisgICAgICAgIHswLjAsIDAuMCwgMC4wfSAvLyBibGFjaworfTsKKworLy8gRW5zdXJlIHRoYXQgdGhlIGF0ZXhpdCBoYW5kbGVyIG9ubHkgcnVucyBvbmNlLgorc3RhdGljIHVpbnQzMl90IHN0YXRzUHJpbnRlZCA9IDA7CisKKy8vIG91dHB1dCBpbnRlcmZhY2UKK3N0YXRpYyBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZSAqX19rbXBfc3RhdHNfZ2xvYmFsX291dHB1dCA9IE5VTEw7CisKKy8qICoqKioqKioqKioqKiogc3RhdGlzdGljIG1lbWJlciBmdW5jdGlvbnMgKioqKioqKioqKioqKiAqLworCit2b2lkIHN0YXRpc3RpYzo6YWRkU2FtcGxlKGRvdWJsZSBzYW1wbGUpIHsKKyAgZG91YmxlIGRlbHRhID0gc2FtcGxlIC0gbWVhblZhbDsKKworICBzYW1wbGVDb3VudCA9IHNhbXBsZUNvdW50ICsgMTsKKyAgbWVhblZhbCA9IG1lYW5WYWwgKyBkZWx0YSAvIHNhbXBsZUNvdW50OworICBtMiA9IG0yICsgZGVsdGEgKiAoc2FtcGxlIC0gbWVhblZhbCk7CisKKyAgbWluVmFsID0gc3RkOjptaW4obWluVmFsLCBzYW1wbGUpOworICBtYXhWYWwgPSBzdGQ6Om1heChtYXhWYWwsIHNhbXBsZSk7Cit9CisKK3N0YXRpc3RpYyAmc3RhdGlzdGljOjpvcGVyYXRvcis9KGNvbnN0IHN0YXRpc3RpYyAmb3RoZXIpIHsKKyAgaWYgKHNhbXBsZUNvdW50ID09IDApIHsKKyAgICAqdGhpcyA9IG90aGVyOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHVpbnQ2NF90IG5ld1NhbXBsZUNvdW50ID0gc2FtcGxlQ291bnQgKyBvdGhlci5zYW1wbGVDb3VudDsKKyAgZG91YmxlIGRuc2MgPSBkb3VibGUobmV3U2FtcGxlQ291bnQpOworICBkb3VibGUgZHNjID0gZG91YmxlKHNhbXBsZUNvdW50KTsKKyAgZG91YmxlIGRzY0J5ZG5zYyA9IGRzYyAvIGRuc2M7CisgIGRvdWJsZSBkb3NjID0gZG91YmxlKG90aGVyLnNhbXBsZUNvdW50KTsKKyAgZG91YmxlIGRlbHRhID0gb3RoZXIubWVhblZhbCAtIG1lYW5WYWw7CisKKyAgLy8gVHJ5IHRvIG9yZGVyIHRoZXNlIGNhbGN1bGF0aW9ucyB0byBhdm9pZCBvdmVyZmxvd3MuIElmIHRoaXMgd2VyZSBGb3J0cmFuLAorICAvLyB0aGVuIHRoZSBjb21waWxlciB3b3VsZCBub3QgYmUgYWJsZSB0byByZS1vcmRlciBvdmVyIGJyYWNrZXRzLiBJbiBDKysgaXQKKyAgLy8gbWF5IGJlIGxlZ2FsIHRvIGRvIHRoYXQgKHdlIGNlcnRhaW5seSBob3BlIGl0IGRvZXNuJ3QsIGFuZCBDQysgUHJvZ3JhbW1pbmcKKyAgLy8gTGFuZ3VhZ2UgMm5kIGVkaXRpb24gc3VnZ2VzdHMgaXQgc2hvdWxkbid0LCBzaW5jZSBpdCBzYXlzIHRoYXQgZXhwbG9pdGF0aW9uCisgIC8vIG9mIGFzc29jaWF0aXZpdHkgY2FuIG9ubHkgYmUgbWFkZSBpZiB0aGUgb3BlcmF0aW9uIHJlYWxseSBpcyBhc3NvY2lhdGl2ZQorICAvLyAod2hpY2ggZmxvYXRpbmcgYWRkaXRpb24gaXNuJ3QuLi4pKS4KKyAgbWVhblZhbCA9IG1lYW5WYWwgKiBkc2NCeWRuc2MgKyBvdGhlci5tZWFuVmFsICogKDEgLSBkc2NCeWRuc2MpOworICBtMiA9IG0yICsgb3RoZXIubTIgKyBkc2NCeWRuc2MgKiBkb3NjICogZGVsdGEgKiBkZWx0YTsKKyAgbWluVmFsID0gc3RkOjptaW4obWluVmFsLCBvdGhlci5taW5WYWwpOworICBtYXhWYWwgPSBzdGQ6Om1heChtYXhWYWwsIG90aGVyLm1heFZhbCk7CisgIHNhbXBsZUNvdW50ID0gbmV3U2FtcGxlQ291bnQ7CisKKyAgcmV0dXJuICp0aGlzOworfQorCit2b2lkIHN0YXRpc3RpYzo6c2NhbGUoZG91YmxlIGZhY3RvcikgeworICBtaW5WYWwgPSBtaW5WYWwgKiBmYWN0b3I7CisgIG1heFZhbCA9IG1heFZhbCAqIGZhY3RvcjsKKyAgbWVhblZhbCA9IG1lYW5WYWwgKiBmYWN0b3I7CisgIG0yID0gbTIgKiBmYWN0b3IgKiBmYWN0b3I7CisgIHJldHVybjsKK30KKworc3RkOjpzdHJpbmcgc3RhdGlzdGljOjpmb3JtYXQoY2hhciB1bml0LCBib29sIHRvdGFsKSBjb25zdCB7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9IGZvcm1hdFNJKHNhbXBsZUNvdW50LCA5LCAnICcpOworCisgIGlmIChzYW1wbGVDb3VudCA9PSAwKSB7CisgICAgcmVzdWx0ID0gcmVzdWx0ICsgc3RkOjpzdHJpbmcoIiwgIikgKyBmb3JtYXRTSSgwLjAsIDksIHVuaXQpOworICAgIHJlc3VsdCA9IHJlc3VsdCArIHN0ZDo6c3RyaW5nKCIsICIpICsgZm9ybWF0U0koMC4wLCA5LCB1bml0KTsKKyAgICByZXN1bHQgPSByZXN1bHQgKyBzdGQ6OnN0cmluZygiLCAiKSArIGZvcm1hdFNJKDAuMCwgOSwgdW5pdCk7CisgICAgaWYgKHRvdGFsKQorICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc3RkOjpzdHJpbmcoIiwgIikgKyBmb3JtYXRTSSgwLjAsIDksIHVuaXQpOworICAgIHJlc3VsdCA9IHJlc3VsdCArIHN0ZDo6c3RyaW5nKCIsICIpICsgZm9ybWF0U0koMC4wLCA5LCB1bml0KTsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPSByZXN1bHQgKyBzdGQ6OnN0cmluZygiLCAiKSArIGZvcm1hdFNJKG1pblZhbCwgOSwgdW5pdCk7CisgICAgcmVzdWx0ID0gcmVzdWx0ICsgc3RkOjpzdHJpbmcoIiwgIikgKyBmb3JtYXRTSShtZWFuVmFsLCA5LCB1bml0KTsKKyAgICByZXN1bHQgPSByZXN1bHQgKyBzdGQ6OnN0cmluZygiLCAiKSArIGZvcm1hdFNJKG1heFZhbCwgOSwgdW5pdCk7CisgICAgaWYgKHRvdGFsKQorICAgICAgcmVzdWx0ID0KKyAgICAgICAgICByZXN1bHQgKyBzdGQ6OnN0cmluZygiLCAiKSArIGZvcm1hdFNJKG1lYW5WYWwgKiBzYW1wbGVDb3VudCwgOSwgdW5pdCk7CisgICAgcmVzdWx0ID0gcmVzdWx0ICsgc3RkOjpzdHJpbmcoIiwgIikgKyBmb3JtYXRTSShnZXRTRCgpLCA5LCB1bml0KTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKiAqKioqKioqKioqKioqIGV4cGxpY2l0VGltZXIgbWVtYmVyIGZ1bmN0aW9ucyAqKioqKioqKioqKioqICovCisKK3ZvaWQgZXhwbGljaXRUaW1lcjo6c3RhcnQodGltZXJfZSB0aW1lckVudW1WYWx1ZSkgeworICBzdGFydFRpbWUgPSB0c2NfdGlja19jb3VudDo6bm93KCk7CisgIHRvdGFsUGF1c2VUaW1lID0gMDsKKyAgaWYgKHRpbWVTdGF0Ojpsb2dFdmVudCh0aW1lckVudW1WYWx1ZSkpIHsKKyAgICBfX2ttcF9zdGF0c190aHJlYWRfcHRyLT5pbmNyZW1lbnROZXN0VmFsdWUoKTsKKyAgfQorICByZXR1cm47Cit9CisKK3ZvaWQgZXhwbGljaXRUaW1lcjo6c3RvcCh0aW1lcl9lIHRpbWVyRW51bVZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9zdGF0c19saXN0ICpzdGF0c19wdHIgLyogPSBudWxscHRyICovKSB7CisgIGlmIChzdGFydFRpbWUuZ2V0VmFsdWUoKSA9PSAwKQorICAgIHJldHVybjsKKworICB0c2NfdGlja19jb3VudCBmaW5pc2hUaW1lID0gdHNjX3RpY2tfY291bnQ6Om5vdygpOworCisgIC8vIHN0YXQtPmFkZFNhbXBsZSAoKHRzY190aWNrX2NvdW50Ojpub3coKSAtIHN0YXJ0VGltZSkudGlja3MoKSk7CisgIHN0YXQtPmFkZFNhbXBsZSgoKGZpbmlzaFRpbWUgLSBzdGFydFRpbWUpIC0gdG90YWxQYXVzZVRpbWUpLnRpY2tzKCkpOworCisgIGlmICh0aW1lU3RhdDo6bG9nRXZlbnQodGltZXJFbnVtVmFsdWUpKSB7CisgICAgaWYgKCFzdGF0c19wdHIpCisgICAgICBzdGF0c19wdHIgPSBfX2ttcF9zdGF0c190aHJlYWRfcHRyOworICAgIHN0YXRzX3B0ci0+cHVzaF9ldmVudCgKKyAgICAgICAgc3RhcnRUaW1lLmdldFZhbHVlKCkgLSBfX2ttcF9zdGF0c19zdGFydF90aW1lLmdldFZhbHVlKCksCisgICAgICAgIGZpbmlzaFRpbWUuZ2V0VmFsdWUoKSAtIF9fa21wX3N0YXRzX3N0YXJ0X3RpbWUuZ2V0VmFsdWUoKSwKKyAgICAgICAgX19rbXBfc3RhdHNfdGhyZWFkX3B0ci0+Z2V0TmVzdFZhbHVlKCksIHRpbWVyRW51bVZhbHVlKTsKKyAgICBzdGF0c19wdHItPmRlY3JlbWVudE5lc3RWYWx1ZSgpOworICB9CisKKyAgLyogV2UgYWNjZXB0IHRoZSByaXNrIHRoYXQgd2UgZHJvcCBhIHNhbXBsZSBiZWNhdXNlIGl0IHJlYWxseSBkaWQgc3RhcnQgYXQKKyAgICAgdD09MC4gKi8KKyAgc3RhcnRUaW1lID0gMDsKKyAgcmV0dXJuOworfQorCisvKiAqKioqKioqKioqKioqIHBhcnRpdGlvbmVkVGltZXJzIG1lbWJlciBmdW5jdGlvbnMgKioqKioqKioqKioqKiAqLworcGFydGl0aW9uZWRUaW1lcnM6OnBhcnRpdGlvbmVkVGltZXJzKCkgeyB0aW1lcl9zdGFjay5yZXNlcnZlKDgpOyB9CisKKy8vIGFkZCBhIHRpbWVyIHRvIHRoaXMgY29sbGVjdGlvbiBvZiBwYXJ0aXRpb25lZCB0aW1lcnMuCit2b2lkIHBhcnRpdGlvbmVkVGltZXJzOjphZGRfdGltZXIoZXhwbGljaXRfdGltZXJfZSB0aW1lcl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBsaWNpdFRpbWVyICp0aW1lcl9wb2ludGVyKSB7CisgIEtNUF9ERUJVR19BU1NFUlQoKGludCl0aW1lcl9pbmRleCA8IChpbnQpRVhQTElDSVRfVElNRVJfTEFTVCArIDEpOworICB0aW1lcnNbdGltZXJfaW5kZXhdID0gdGltZXJfcG9pbnRlcjsKK30KKworLy8gaW5pdGlhbGl6ZSB0aGUgcGFyaXRpb25lZCB0aW1lcnMgdG8gYW4gaW5pdGlhbCB0aW1lcgordm9pZCBwYXJ0aXRpb25lZFRpbWVyczo6aW5pdCh0aW1lclBhaXIgaW5pdF90aW1lcl9wYWlyKSB7CisgIEtNUF9ERUJVR19BU1NFUlQodGhpcy0+dGltZXJfc3RhY2suc2l6ZSgpID09IDApOworICB0aW1lcl9zdGFjay5wdXNoX2JhY2soaW5pdF90aW1lcl9wYWlyKTsKKyAgdGltZXJzW2luaXRfdGltZXJfcGFpci5nZXRfaW5kZXgoKV0tPnN0YXJ0KGluaXRfdGltZXJfcGFpci5nZXRfdGltZXIoKSk7Cit9CisKKy8vIHN0b3Avc2F2ZSB0aGUgY3VycmVudCB0aW1lciwgYW5kIHN0YXJ0IHRoZSBuZXcgdGltZXIgKHRpbWVyX3BhaXIpCisvLyBUaGVyZSBpcyBhIHNwZWNpYWwgY29uZGl0aW9uIHdoZXJlIGlmIHRoZSBjdXJyZW50IHRpbWVyIGlzIGVxdWFsIHRvCisvLyB0aGUgb25lIHlvdSBhcmUgdHJ5aW5nIHRvIHB1c2gsIHRoZW4gaXQgb25seSBtYW5pcHVsYXRlcyB0aGUgc3RhY2ssCisvLyBhbmQgaXQgd29uJ3Qgc3RvcC9zdGFydCB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGltZXIuCit2b2lkIHBhcnRpdGlvbmVkVGltZXJzOjpwdXNoKHRpbWVyUGFpciB0aW1lcl9wYWlyKSB7CisgIC8vIGdldCB0aGUgY3VycmVudCB0aW1lcgorICAvLyBzdG9wIGN1cnJlbnQgdGltZXIKKyAgLy8gcHVzaCBuZXcgdGltZXIKKyAgLy8gc3RhcnQgdGhlIG5ldyB0aW1lcgorICBLTVBfREVCVUdfQVNTRVJUKHRoaXMtPnRpbWVyX3N0YWNrLnNpemUoKSA+IDApOworICB0aW1lclBhaXIgY3VycmVudF90aW1lciA9IHRpbWVyX3N0YWNrLmJhY2soKTsKKyAgdGltZXJfc3RhY2sucHVzaF9iYWNrKHRpbWVyX3BhaXIpOworICBpZiAoY3VycmVudF90aW1lciAhPSB0aW1lcl9wYWlyKSB7CisgICAgdGltZXJzW2N1cnJlbnRfdGltZXIuZ2V0X2luZGV4KCldLT5wYXVzZSgpOworICAgIHRpbWVyc1t0aW1lcl9wYWlyLmdldF9pbmRleCgpXS0+c3RhcnQodGltZXJfcGFpci5nZXRfdGltZXIoKSk7CisgIH0KK30KKworLy8gc3RvcC9kaXNjYXJkIHRoZSBjdXJyZW50IHRpbWVyLCBhbmQgc3RhcnQgdGhlIHByZXZpb3VzbHkgc2F2ZWQgdGltZXIKK3ZvaWQgcGFydGl0aW9uZWRUaW1lcnM6OnBvcCgpIHsKKyAgLy8gZ2V0IHRoZSBjdXJyZW50IHRpbWVyCisgIC8vIHN0b3AgY3VycmVudCB0aW1lcgorICAvLyBwb3AgY3VycmVudCB0aW1lcgorICAvLyBnZXQgdGhlIG5ldyBjdXJyZW50IHRpbWVyIGFuZCBzdGFydCBpdCBiYWNrIHVwCisgIEtNUF9ERUJVR19BU1NFUlQodGhpcy0+dGltZXJfc3RhY2suc2l6ZSgpID4gMSk7CisgIHRpbWVyUGFpciBjdXJyZW50X3RpbWVyID0gdGltZXJfc3RhY2suYmFjaygpOworICB0aW1lcl9zdGFjay5wb3BfYmFjaygpOworICB0aW1lclBhaXIgbmV3X3RpbWVyID0gdGltZXJfc3RhY2suYmFjaygpOworICBpZiAoY3VycmVudF90aW1lciAhPSBuZXdfdGltZXIpIHsKKyAgICB0aW1lcnNbY3VycmVudF90aW1lci5nZXRfaW5kZXgoKV0tPnN0b3AoY3VycmVudF90aW1lci5nZXRfdGltZXIoKSk7CisgICAgdGltZXJzW25ld190aW1lci5nZXRfaW5kZXgoKV0tPnJlc3VtZSgpOworICB9Cit9CisKKy8vIFdpbmQgdXAgYWxsIHRoZSBjdXJyZW50bHkgcnVubmluZyB0aW1lcnMuCisvLyBUaGlzIHBvcHMgb2ZmIGFsbCB0aGUgdGltZXJzIGZyb20gdGhlIHN0YWNrIGFuZCBjbGVhcnMgdGhlIHN0YWNrCisvLyBBZnRlciB0aGlzIGlzIGNhbGxlZCwgaW5pdCgpIG11c3QgYmUgcnVuIGFnYWluIHRvIGluaXRpYWxpemUgdGhlCisvLyBzdGFjayBvZiB0aW1lcnMKK3ZvaWQgcGFydGl0aW9uZWRUaW1lcnM6OndpbmR1cCgpIHsKKyAgd2hpbGUgKHRpbWVyX3N0YWNrLnNpemUoKSA+IDEpIHsKKyAgICB0aGlzLT5wb3AoKTsKKyAgfQorICBpZiAodGltZXJfc3RhY2suc2l6ZSgpID4gMCkgeworICAgIHRpbWVyUGFpciBsYXN0X3RpbWVyID0gdGltZXJfc3RhY2suYmFjaygpOworICAgIHRpbWVyX3N0YWNrLnBvcF9iYWNrKCk7CisgICAgdGltZXJzW2xhc3RfdGltZXIuZ2V0X2luZGV4KCldLT5zdG9wKGxhc3RfdGltZXIuZ2V0X3RpbWVyKCkpOworICB9Cit9CisKKy8qICoqKioqKioqKioqKioga21wX3N0YXRzX2V2ZW50X3ZlY3RvciBtZW1iZXIgZnVuY3Rpb25zICoqKioqKioqKioqKiogKi8KKwordm9pZCBrbXBfc3RhdHNfZXZlbnRfdmVjdG9yOjpkZWFsbG9jYXRlKCkgeworICBfX2ttcF9mcmVlKGV2ZW50cyk7CisgIGludGVybmFsX3NpemUgPSAwOworICBhbGxvY2F0ZWRfc2l6ZSA9IDA7CisgIGV2ZW50cyA9IE5VTEw7Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gaXMgZm9yIHFzb3J0KCkgd2hpY2ggcmVxdWlyZXMgdGhlIGNvbXBhcmUgZnVuY3Rpb24gdG8gcmV0dXJuCisvLyBlaXRoZXIgYSBuZWdhdGl2ZSBudW1iZXIgaWYgZXZlbnQxIDwgZXZlbnQyLCBhIHBvc2l0aXZlIG51bWJlciBpZiBldmVudDEgPgorLy8gZXZlbnQyIG9yIHplcm8gaWYgZXZlbnQxID09IGV2ZW50Mi4gVGhpcyBzb3J0cyBieSBzdGFydCB0aW1lIChsb3dlc3QgdG8KKy8vIGhpZ2hlc3QpLgoraW50IGNvbXBhcmVfdHdvX2V2ZW50cyhjb25zdCB2b2lkICpldmVudDEsIGNvbnN0IHZvaWQgKmV2ZW50MikgeworICBrbXBfc3RhdHNfZXZlbnQgKmV2MSA9IChrbXBfc3RhdHNfZXZlbnQgKilldmVudDE7CisgIGttcF9zdGF0c19ldmVudCAqZXYyID0gKGttcF9zdGF0c19ldmVudCAqKWV2ZW50MjsKKworICBpZiAoZXYxLT5nZXRTdGFydCgpIDwgZXYyLT5nZXRTdGFydCgpKQorICAgIHJldHVybiAtMTsKKyAgZWxzZSBpZiAoZXYxLT5nZXRTdGFydCgpID4gZXYyLT5nZXRTdGFydCgpKQorICAgIHJldHVybiAxOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQga21wX3N0YXRzX2V2ZW50X3ZlY3Rvcjo6c29ydCgpIHsKKyAgcXNvcnQoZXZlbnRzLCBpbnRlcm5hbF9zaXplLCBzaXplb2Yoa21wX3N0YXRzX2V2ZW50KSwgY29tcGFyZV90d29fZXZlbnRzKTsKK30KKworLyogKioqKioqKioqKioqKiBrbXBfc3RhdHNfbGlzdCBtZW1iZXIgZnVuY3Rpb25zICoqKioqKioqKioqKiogKi8KKworLy8gcmV0dXJucyBhIHBvaW50ZXIgdG8gbmV3bHkgY3JlYXRlZCBzdGF0cyBub2RlCitrbXBfc3RhdHNfbGlzdCAqa21wX3N0YXRzX2xpc3Q6OnB1c2hfYmFjayhpbnQgZ3RpZCkgeworICBrbXBfc3RhdHNfbGlzdCAqbmV3bm9kZSA9CisgICAgICAoa21wX3N0YXRzX2xpc3QgKilfX2ttcF9hbGxvY2F0ZShzaXplb2Yoa21wX3N0YXRzX2xpc3QpKTsKKyAgLy8gcGxhY2VtZW50IG5ldywgb25seSByZXF1aXJlcyBzcGFjZSBhbmQgcG9pbnRlciBhbmQgaW5pdGlhbGl6ZXMgKHNvCisgIC8vIF9fa21wX2FsbG9jYXRlIGluc3RlYWQgb2YgQysrIG5ld1tdIGlzIHVzZWQpCisgIG5ldyAobmV3bm9kZSkga21wX3N0YXRzX2xpc3QoKTsKKyAgbmV3bm9kZS0+c2V0R3RpZChndGlkKTsKKyAgbmV3bm9kZS0+cHJldiA9IHRoaXMtPnByZXY7CisgIG5ld25vZGUtPm5leHQgPSB0aGlzOworICBuZXdub2RlLT5wcmV2LT5uZXh0ID0gbmV3bm9kZTsKKyAgbmV3bm9kZS0+bmV4dC0+cHJldiA9IG5ld25vZGU7CisgIHJldHVybiBuZXdub2RlOworfQordm9pZCBrbXBfc3RhdHNfbGlzdDo6ZGVhbGxvY2F0ZSgpIHsKKyAga21wX3N0YXRzX2xpc3QgKnB0ciA9IHRoaXMtPm5leHQ7CisgIGttcF9zdGF0c19saXN0ICpkZWxwdHIgPSB0aGlzLT5uZXh0OworICB3aGlsZSAocHRyICE9IHRoaXMpIHsKKyAgICBkZWxwdHIgPSBwdHI7CisgICAgcHRyID0gcHRyLT5uZXh0OworICAgIC8vIHBsYWNlbWVudCBuZXcgbWVhbnMgd2UgaGF2ZSB0byBleHBsaWNpdGx5IGNhbGwgZGVzdHJ1Y3Rvci4KKyAgICBkZWxwdHItPl9ldmVudF92ZWN0b3IuZGVhbGxvY2F0ZSgpOworICAgIGRlbHB0ci0+fmttcF9zdGF0c19saXN0KCk7CisgICAgX19rbXBfZnJlZShkZWxwdHIpOworICB9Cit9CitrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3Iga21wX3N0YXRzX2xpc3Q6OmJlZ2luKCkgeworICBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3IgaXQ7CisgIGl0LnB0ciA9IHRoaXMtPm5leHQ7CisgIHJldHVybiBpdDsKK30KK2ttcF9zdGF0c19saXN0OjppdGVyYXRvciBrbXBfc3RhdHNfbGlzdDo6ZW5kKCkgeworICBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3IgaXQ7CisgIGl0LnB0ciA9IHRoaXM7CisgIHJldHVybiBpdDsKK30KK2ludCBrbXBfc3RhdHNfbGlzdDo6c2l6ZSgpIHsKKyAgaW50IHJldHZhbDsKKyAga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGl0OworICBmb3IgKHJldHZhbCA9IDAsIGl0ID0gYmVnaW4oKTsgaXQgIT0gZW5kKCk7IGl0KyssIHJldHZhbCsrKSB7CisgIH0KKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyogKioqKioqKioqKioqKiBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3IgbWVtYmVyIGZ1bmN0aW9ucyAqKioqKioqKioqKioqICovCisKK2ttcF9zdGF0c19saXN0OjppdGVyYXRvcjo6aXRlcmF0b3IoKSA6IHB0cihOVUxMKSB7fQora21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yOjp+aXRlcmF0b3IoKSB7fQora21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGttcF9zdGF0c19saXN0OjppdGVyYXRvcjo6b3BlcmF0b3IrKygpIHsKKyAgdGhpcy0+cHRyID0gdGhpcy0+cHRyLT5uZXh0OworICByZXR1cm4gKnRoaXM7Cit9CitrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3Iga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yOjpvcGVyYXRvcisrKGludCBkdW1teSkgeworICB0aGlzLT5wdHIgPSB0aGlzLT5wdHItPm5leHQ7CisgIHJldHVybiAqdGhpczsKK30KK2ttcF9zdGF0c19saXN0OjppdGVyYXRvciBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3I6Om9wZXJhdG9yLS0oKSB7CisgIHRoaXMtPnB0ciA9IHRoaXMtPnB0ci0+cHJldjsKKyAgcmV0dXJuICp0aGlzOworfQora21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGttcF9zdGF0c19saXN0OjppdGVyYXRvcjo6b3BlcmF0b3ItLShpbnQgZHVtbXkpIHsKKyAgdGhpcy0+cHRyID0gdGhpcy0+cHRyLT5wcmV2OworICByZXR1cm4gKnRoaXM7Cit9Citib29sIGttcF9zdGF0c19saXN0OjppdGVyYXRvcjo6b3BlcmF0b3IhPShjb25zdCBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3IgJnJocykgeworICByZXR1cm4gdGhpcy0+cHRyICE9IHJocy5wdHI7Cit9Citib29sIGttcF9zdGF0c19saXN0OjppdGVyYXRvcjo6b3BlcmF0b3I9PShjb25zdCBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3IgJnJocykgeworICByZXR1cm4gdGhpcy0+cHRyID09IHJocy5wdHI7Cit9CitrbXBfc3RhdHNfbGlzdCAqa21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yOjpvcGVyYXRvciooKSBjb25zdCB7CisgIHJldHVybiB0aGlzLT5wdHI7Cit9CisKKy8qICoqKioqKioqKioqKiogIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKiAqLworCitjb25zdCBjaGFyICprbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6ZXZlbnRzRmlsZU5hbWUgPSBOVUxMOworY29uc3QgY2hhciAqa21wX3N0YXRzX291dHB1dF9tb2R1bGU6OnBsb3RGaWxlTmFtZSA9IE5VTEw7CitpbnQga21wX3N0YXRzX291dHB1dF9tb2R1bGU6OnByaW50UGVyVGhyZWFkRmxhZyA9IDA7CitpbnQga21wX3N0YXRzX291dHB1dF9tb2R1bGU6OnByaW50UGVyVGhyZWFkRXZlbnRzRmxhZyA9IDA7CisKKy8vIGluaXQoKSBpcyBjYWxsZWQgdmVyeSBuZWFyIHRoZSBiZWdpbm5pbmcgb2YgZXhlY3V0aW9uIHRpbWUgaW4gdGhlIGNvbnN0cnVjdG9yCisvLyBvZiBfX2ttcF9zdGF0c19nbG9iYWxfb3V0cHV0Cit2b2lkIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlOjppbml0KCkgeworICBjaGFyICpzdGF0c0ZpbGVOYW1lID0gZ2V0ZW52KCJLTVBfU1RBVFNfRklMRSIpOworICBldmVudHNGaWxlTmFtZSA9IGdldGVudigiS01QX1NUQVRTX0VWRU5UU19GSUxFIik7CisgIHBsb3RGaWxlTmFtZSA9IGdldGVudigiS01QX1NUQVRTX1BMT1RfRklMRSIpOworICBjaGFyICp0aHJlYWRTdGF0cyA9IGdldGVudigiS01QX1NUQVRTX1RIUkVBRFMiKTsKKyAgY2hhciAqdGhyZWFkRXZlbnRzID0gZ2V0ZW52KCJLTVBfU1RBVFNfRVZFTlRTIik7CisKKyAgLy8gc2V0IHRoZSBzdGF0cyBvdXRwdXQgZmlsZW5hbWVzIGJhc2VkIG9uIGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgZGVmYXVsdHMKKyAgaWYgKHN0YXRzRmlsZU5hbWUpIHsKKyAgICAvLyBhcHBlbmQgdGhlIHByb2Nlc3MgaWQgdG8gdGhlIG91dHB1dCBmaWxlbmFtZQorICAgIC8vIGV2ZW50cy5jc3YgLS0+IGV2ZW50cy1waWQuY3N2CisgICAgc2l6ZV90IGluZGV4OworICAgIHN0ZDo6c3RyaW5nIGJhc2VGaWxlTmFtZSwgcGlkLCBzdWZmaXg7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgb3V0cHV0RmlsZU5hbWUgPSBzdGQ6OnN0cmluZyhzdGF0c0ZpbGVOYW1lKTsKKyAgICBpbmRleCA9IG91dHB1dEZpbGVOYW1lLmZpbmRfbGFzdF9vZignLicpOworICAgIGlmIChpbmRleCA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgYmFzZUZpbGVOYW1lID0gb3V0cHV0RmlsZU5hbWU7CisgICAgfSBlbHNlIHsKKyAgICAgIGJhc2VGaWxlTmFtZSA9IG91dHB1dEZpbGVOYW1lLnN1YnN0cigwLCBpbmRleCk7CisgICAgICBzdWZmaXggPSBvdXRwdXRGaWxlTmFtZS5zdWJzdHIoaW5kZXgpOworICAgIH0KKyAgICBzcyA8PCBnZXRwaWQoKTsKKyAgICBwaWQgPSBzcy5zdHIoKTsKKyAgICBvdXRwdXRGaWxlTmFtZSA9IGJhc2VGaWxlTmFtZSArICItIiArIHBpZCArIHN1ZmZpeDsKKyAgfQorICBldmVudHNGaWxlTmFtZSA9IGV2ZW50c0ZpbGVOYW1lID8gZXZlbnRzRmlsZU5hbWUgOiAiZXZlbnRzLmRhdCI7CisgIHBsb3RGaWxlTmFtZSA9IHBsb3RGaWxlTmFtZSA/IHBsb3RGaWxlTmFtZSA6ICJldmVudHMucGx0IjsKKworICAvLyBzZXQgdGhlIGZsYWdzIGJhc2VkIG9uIGVudmlyb25tZW50IHZhcmlhYmxlcyBtYXRjaGluZzogdHJ1ZSwgb24sIDEsIC50cnVlLgorICAvLyAsIC50LiAsIHllcworICBwcmludFBlclRocmVhZEZsYWcgPSBfX2ttcF9zdHJfbWF0Y2hfdHJ1ZSh0aHJlYWRTdGF0cyk7CisgIHByaW50UGVyVGhyZWFkRXZlbnRzRmxhZyA9IF9fa21wX3N0cl9tYXRjaF90cnVlKHRocmVhZEV2ZW50cyk7CisKKyAgaWYgKHByaW50UGVyVGhyZWFkRXZlbnRzRmxhZykgeworICAgIC8vIGFzc2lnbnMgYSBjb2xvciB0byBlYWNoIHRpbWVyIGZvciBwcmludGluZworICAgIHNldHVwRXZlbnRDb2xvcnMoKTsKKyAgfSBlbHNlIHsKKyAgICAvLyB3aWxsIGNsZWFyIGZsYWcgc28gdGhhdCBubyBldmVudCB3aWxsIGJlIGxvZ2dlZAorICAgIHRpbWVTdGF0OjpjbGVhckV2ZW50RmxhZ3MoKTsKKyAgfQorCisgIHJldHVybjsKK30KKwordm9pZCBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6c2V0dXBFdmVudENvbG9ycygpIHsKKyAgaW50IGk7CisgIGludCBnbG9iYWxDb2xvckluZGV4ID0gMDsKKyAgaW50IG51bUdsb2JhbENvbG9ycyA9IHNpemVvZihnbG9iYWxDb2xvckFycmF5KSAvIHNpemVvZihyZ2JfY29sb3IpOworICBmb3IgKGkgPSAwOyBpIDwgVElNRVJfTEFTVDsgaSsrKSB7CisgICAgaWYgKHRpbWVTdGF0Ojpsb2dFdmVudCgodGltZXJfZSlpKSkgeworICAgICAgdGltZXJDb2xvckluZm9baV0gPSBnbG9iYWxDb2xvckFycmF5W2dsb2JhbENvbG9ySW5kZXhdOworICAgICAgZ2xvYmFsQ29sb3JJbmRleCA9IChnbG9iYWxDb2xvckluZGV4ICsgMSkgJSBudW1HbG9iYWxDb2xvcnM7CisgICAgfQorICB9CisgIHJldHVybjsKK30KKwordm9pZCBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6cHJpbnRUaW1lclN0YXRzKEZJTEUgKnN0YXRzT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpc3RpYyBjb25zdCAqdGhlU3RhdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGlzdGljIGNvbnN0ICp0b3RhbFN0YXRzKSB7CisgIGZwcmludGYoc3RhdHNPdXQsICJUaW1lciwgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlQ291bnQsICAgIE1pbiwgICAgICAiCisgICAgICAgICAgICAgICAgICAgICJNZWFuLCAgICAgICBNYXgsICAgICBUb3RhbCwgICAgICAgIFNEXG4iKTsKKyAgZm9yICh0aW1lcl9lIHMgPSB0aW1lcl9lKDApOyBzIDwgVElNRVJfTEFTVDsgcyA9IHRpbWVyX2UocyArIDEpKSB7CisgICAgc3RhdGlzdGljIGNvbnN0ICpzdGF0ID0gJnRoZVN0YXRzW3NdOworICAgIGNoYXIgdGFnID0gdGltZVN0YXQ6Om5vVW5pdHMocykgPyAnICcgOiAnVCc7CisKKyAgICBmcHJpbnRmKHN0YXRzT3V0LCAiJS0yOHMsICVzXG4iLCB0aW1lU3RhdDo6bmFtZShzKSwKKyAgICAgICAgICAgIHN0YXQtPmZvcm1hdCh0YWcsIHRydWUpLmNfc3RyKCkpOworICB9CisgIC8vIEFsc28gcHJpbnQgdGhlIFRvdGFsXyB2ZXJzaW9ucyBvZiB0aW1lcy4KKyAgZm9yICh0aW1lcl9lIHMgPSB0aW1lcl9lKDApOyBzIDwgVElNRVJfTEFTVDsgcyA9IHRpbWVyX2UocyArIDEpKSB7CisgICAgY2hhciB0YWcgPSB0aW1lU3RhdDo6bm9Vbml0cyhzKSA/ICcgJyA6ICdUJzsKKyAgICBpZiAodG90YWxTdGF0cyAmJiAhdGltZVN0YXQ6Om5vVG90YWwocykpCisgICAgICBmcHJpbnRmKHN0YXRzT3V0LCAiVG90YWxfJS0yMnMsICVzXG4iLCB0aW1lU3RhdDo6bmFtZShzKSwKKyAgICAgICAgICAgICAgdG90YWxTdGF0c1tzXS5mb3JtYXQodGFnLCB0cnVlKS5jX3N0cigpKTsKKyAgfQorfQorCit2b2lkIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlOjpwcmludENvdW50ZXJTdGF0cyhGSUxFICpzdGF0c091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpc3RpYyBjb25zdCAqdGhlU3RhdHMpIHsKKyAgZnByaW50ZihzdGF0c091dCwgIkNvdW50ZXIsICAgICAgICAgICAgICAgICBUaHJlYWRDb3VudCwgICAgTWluLCAgICAgIE1lYW4sICAiCisgICAgICAgICAgICAgICAgICAgICIgICAgIE1heCwgICAgIFRvdGFsLCAgICAgICAgU0RcbiIpOworICBmb3IgKGludCBzID0gMDsgcyA8IENPVU5URVJfTEFTVDsgcysrKSB7CisgICAgc3RhdGlzdGljIGNvbnN0ICpzdGF0ID0gJnRoZVN0YXRzW3NdOworICAgIGZwcmludGYoc3RhdHNPdXQsICIlLTI1cywgJXNcbiIsIGNvdW50ZXI6Om5hbWUoY291bnRlcl9lKHMpKSwKKyAgICAgICAgICAgIHN0YXQtPmZvcm1hdCgnICcsIHRydWUpLmNfc3RyKCkpOworICB9Cit9CisKK3ZvaWQga21wX3N0YXRzX291dHB1dF9tb2R1bGU6OnByaW50Q291bnRlcnMoRklMRSAqc3RhdHNPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXIgY29uc3QgKnRoZUNvdW50ZXJzKSB7CisgIC8vIFdlIHByaW50IGFsbCB0aGUgY291bnRlcnMgZXZlbiBpZiB0aGV5IGFyZSB6ZXJvLgorICAvLyBUaGF0IG1ha2VzIGl0IGVhc2llciB0byBzbGljZSB0aGVtIGludG8gYSBzcHJlYWRzaGVldCBpZiB5b3UgbmVlZCB0by4KKyAgZnByaW50ZihzdGF0c091dCwgIlxuQ291bnRlciwgICAgICAgICAgICAgICAgICAgIENvdW50XG4iKTsKKyAgZm9yIChpbnQgYyA9IDA7IGMgPCBDT1VOVEVSX0xBU1Q7IGMrKykgeworICAgIGNvdW50ZXIgY29uc3QgKnN0YXQgPSAmdGhlQ291bnRlcnNbY107CisgICAgZnByaW50ZihzdGF0c091dCwgIiUtMjVzLCAlc1xuIiwgY291bnRlcjo6bmFtZShjb3VudGVyX2UoYykpLAorICAgICAgICAgICAgZm9ybWF0U0koc3RhdC0+Z2V0VmFsdWUoKSwgOSwgJyAnKS5jX3N0cigpKTsKKyAgfQorfQorCit2b2lkIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlOjpwcmludEV2ZW50cyhGSUxFICpldmVudHNPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfc3RhdHNfZXZlbnRfdmVjdG9yICp0aGVFdmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3RpZCkgeworICAvLyBzb3J0IGJ5IHN0YXJ0IHRpbWUgYmVmb3JlIHByaW50aW5nCisgIHRoZUV2ZW50cy0+c29ydCgpOworICBmb3IgKGludCBpID0gMDsgaSA8IHRoZUV2ZW50cy0+c2l6ZSgpOyBpKyspIHsKKyAgICBrbXBfc3RhdHNfZXZlbnQgZXYgPSB0aGVFdmVudHMtPmF0KGkpOworICAgIHJnYl9jb2xvciBjb2xvciA9IGdldEV2ZW50Q29sb3IoZXYuZ2V0VGltZXJOYW1lKCkpOworICAgIGZwcmludGYoZXZlbnRzT3V0LCAiJWQgJWx1ICVsdSAlMS4xZiByZ2IoJTEuMWYsJTEuMWYsJTEuMWYpICVzXG4iLCBndGlkLAorICAgICAgICAgICAgZXYuZ2V0U3RhcnQoKSwgZXYuZ2V0U3RvcCgpLCAxLjIgLSAoZXYuZ2V0TmVzdExldmVsKCkgKiAwLjIpLAorICAgICAgICAgICAgY29sb3IuciwgY29sb3IuZywgY29sb3IuYiwgdGltZVN0YXQ6Om5hbWUoZXYuZ2V0VGltZXJOYW1lKCkpKTsKKyAgfQorICByZXR1cm47Cit9CisKK3ZvaWQga21wX3N0YXRzX291dHB1dF9tb2R1bGU6OndpbmR1cEV4cGxpY2l0VGltZXJzKCkgeworICAvLyBXaW5kIHVwIGFueSBleHBsaWNpdCB0aW1lcnMuIFdlIGFzc3VtZSB0aGF0IGl0J3MgZmFpciBhdCB0aGlzIHBvaW50IHRvIGp1c3QKKyAgLy8gd2FsayBhbGwgdGhlIGV4cGxjaXQgdGltZXJzIGluIGFsbCB0aHJlYWRzIGFuZCBzYXkgIml0J3Mgb3ZlciIuCisgIC8vIElmIHRoZSB0aW1lciB3YXNuJ3QgcnVubmluZywgdGhpcyB3b24ndCByZWNvcmQgYW55dGhpbmcgYW55d2F5LgorICBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3IgaXQ7CisgIGZvciAoaXQgPSBfX2ttcF9zdGF0c19saXN0LT5iZWdpbigpOyBpdCAhPSBfX2ttcF9zdGF0c19saXN0LT5lbmQoKTsgaXQrKykgeworICAgIGttcF9zdGF0c19saXN0ICpwdHIgPSAqaXQ7CisgICAgcHRyLT5nZXRQYXJ0aXRpb25lZFRpbWVycygpLT53aW5kdXAoKTsKKyAgICBmb3IgKGludCB0aW1lciA9IDA7IHRpbWVyIDwgRVhQTElDSVRfVElNRVJfTEFTVDsgdGltZXIrKykgeworICAgICAgcHRyLT5nZXRFeHBsaWNpdFRpbWVyKGV4cGxpY2l0X3RpbWVyX2UodGltZXIpKS0+c3RvcCgodGltZXJfZSl0aW1lciwgcHRyKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6cHJpbnRQbG90aWN1c0ZpbGUoKSB7CisgIGludCBpOworICBpbnQgc2l6ZSA9IF9fa21wX3N0YXRzX2xpc3QtPnNpemUoKTsKKyAgRklMRSAqcGxvdE91dCA9IGZvcGVuKHBsb3RGaWxlTmFtZSwgIncrIik7CisKKyAgZnByaW50ZihwbG90T3V0LCAiI3Byb2MgcGFnZVxuIgorICAgICAgICAgICAgICAgICAgICIgICBwYWdlc2l6ZTogMTUgMTBcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgc2NhbGU6IDEuMFxuXG4iKTsKKworICBmcHJpbnRmKHBsb3RPdXQsICIjcHJvYyBnZXRkYXRhXG4iCisgICAgICAgICAgICAgICAgICAgIiAgIGZpbGU6ICVzXG5cbiIsCisgICAgICAgICAgZXZlbnRzRmlsZU5hbWUpOworCisgIGZwcmludGYocGxvdE91dCwgIiNwcm9jIGFyZWFkZWZcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgdGl0bGU6IE9wZW5NUCBTYW1wbGluZyBUaW1lbGluZVxuIgorICAgICAgICAgICAgICAgICAgICIgICB0aXRsZWRldGFpbHM6IGFsaWduPWNlbnRlciBzaXplPTE2XG4iCisgICAgICAgICAgICAgICAgICAgIiAgIHJlY3RhbmdsZTogMSAxIDEzIDlcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgeGF1dG9yYW5nZTogZGF0YWZpZWxkPTIsM1xuIgorICAgICAgICAgICAgICAgICAgICIgICB5YXV0b3JhbmdlOiAtMSAlZFxuXG4iLAorICAgICAgICAgIHNpemUpOworCisgIGZwcmludGYocGxvdE91dCwgIiNwcm9jIHhheGlzXG4iCisgICAgICAgICAgICAgICAgICAgIiAgIHN0dWJzOiBpbmNcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgc3R1YmRldGFpbHM6IHNpemU9MTJcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgbGFiZWw6IFRpbWUgKHRpY2tzKVxuIgorICAgICAgICAgICAgICAgICAgICIgICBsYWJlbGRldGFpbHM6IHNpemU9MTRcblxuIik7CisKKyAgZnByaW50ZihwbG90T3V0LCAiI3Byb2MgeWF4aXNcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgc3R1YnM6IGluYyAxXG4iCisgICAgICAgICAgICAgICAgICAgIiAgIHN0dWJyYW5nZTogMCAlZFxuIgorICAgICAgICAgICAgICAgICAgICIgICBzdHViZGV0YWlsczogc2l6ZT0xMlxuIgorICAgICAgICAgICAgICAgICAgICIgICBsYWJlbDogVGhyZWFkICNcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgbGFiZWxkZXRhaWxzOiBzaXplPTE0XG5cbiIsCisgICAgICAgICAgc2l6ZSAtIDEpOworCisgIGZwcmludGYocGxvdE91dCwgIiNwcm9jIGJhcnNcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgZXhhY3Rjb2xvcmZpZWxkOiA1XG4iCisgICAgICAgICAgICAgICAgICAgIiAgIGF4aXM6IHhcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgbG9jZmllbGQ6IDFcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgc2VnbWVudGZpZWxkczogMiAzXG4iCisgICAgICAgICAgICAgICAgICAgIiAgIGJhcndpZHRoZmllbGQ6IDRcblxuIik7CisKKyAgLy8gY3JlYXRlIGxlZ2VuZCBlbnRyaWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRpbWVyIGNvbG9yCisgIGZvciAoaSA9IDA7IGkgPCBUSU1FUl9MQVNUOyBpKyspIHsKKyAgICBpZiAodGltZVN0YXQ6OmxvZ0V2ZW50KCh0aW1lcl9lKWkpKSB7CisgICAgICByZ2JfY29sb3IgYyA9IGdldEV2ZW50Q29sb3IoKHRpbWVyX2UpaSk7CisgICAgICBmcHJpbnRmKHBsb3RPdXQsICIjcHJvYyBsZWdlbmRlbnRyeVxuIgorICAgICAgICAgICAgICAgICAgICAgICAiICAgc2FtcGxldHlwZTogY29sb3JcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIiAgIGxhYmVsOiAlc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAiICAgZGV0YWlsczogcmdiKCUxLjFmLCUxLjFmLCUxLjFmKVxuXG4iLAorICAgICAgICAgICAgICB0aW1lU3RhdDo6bmFtZSgodGltZXJfZSlpKSwgYy5yLCBjLmcsIGMuYik7CisgICAgfQorICB9CisKKyAgZnByaW50ZihwbG90T3V0LCAiI3Byb2MgbGVnZW5kXG4iCisgICAgICAgICAgICAgICAgICAgIiAgIGZvcm1hdDogZG93blxuIgorICAgICAgICAgICAgICAgICAgICIgICBsb2NhdGlvbjogbWF4IG1heFxuXG4iKTsKKyAgZmNsb3NlKHBsb3RPdXQpOworICByZXR1cm47Cit9CisKKy8qIFByaW50IHNvbWUgdXNlZnVsIGluZm9ybWF0aW9uIGFib3V0CisgICAqIHRoZSBkYXRlIGFuZCB0aW1lIHRoaXMgZXhwZXJpbWVudCByYW4uCisgICAqIHRoZSBtYWNoaW5lIG9uIHdoaWNoIGl0IHJhbi4KKyAgIFdlIG91dHB1dCBhbGwgb2YgdGhpcyBhcyBzdHlsaXNlZCBjb21tZW50cywgdGhvdWdoIHdlIG1heSBkZWNpZGUgdG8gcGFyc2UKKyAgIHNvbWUgb2YgaXQuICovCit2b2lkIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlOjpwcmludEhlYWRlckluZm8oRklMRSAqc3RhdHNPdXQpIHsKKyAgc3RkOjp0aW1lX3Qgbm93ID0gc3RkOjp0aW1lKDApOworICBjaGFyIGJ1ZmZlcls0MF07CisgIGNoYXIgaG9zdE5hbWVbODBdOworCisgIHN0ZDo6c3RyZnRpbWUoJmJ1ZmZlclswXSwgc2l6ZW9mKGJ1ZmZlciksICIlYyIsIHN0ZDo6bG9jYWx0aW1lKCZub3cpKTsKKyAgZnByaW50ZihzdGF0c091dCwgIiMgVGltZSBvZiBydW46ICVzXG4iLCAmYnVmZmVyWzBdKTsKKyAgaWYgKGdldGhvc3RuYW1lKCZob3N0TmFtZVswXSwgc2l6ZW9mKGhvc3ROYW1lKSkgPT0gMCkKKyAgICBmcHJpbnRmKHN0YXRzT3V0LCAiIyBIb3N0bmFtZTogJXNcbiIsICZob3N0TmFtZVswXSk7CisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICBmcHJpbnRmKHN0YXRzT3V0LCAiIyBDUFU6ICAlc1xuIiwgJl9fa21wX2NwdWluZm8ubmFtZVswXSk7CisgIGZwcmludGYoc3RhdHNPdXQsICIjIEZhbWlseTogJWQsIE1vZGVsOiAlZCwgU3RlcHBpbmc6ICVkXG4iLAorICAgICAgICAgIF9fa21wX2NwdWluZm8uZmFtaWx5LCBfX2ttcF9jcHVpbmZvLm1vZGVsLCBfX2ttcF9jcHVpbmZvLnN0ZXBwaW5nKTsKKyAgaWYgKF9fa21wX2NwdWluZm8uZnJlcXVlbmN5ID09IDApCisgICAgZnByaW50ZihzdGF0c091dCwgIiMgTm9taW5hbCBmcmVxdWVuY3k6IFVua25vd25cbiIpOworICBlbHNlCisgICAgZnByaW50ZihzdGF0c091dCwgIiMgTm9taW5hbCBmcmVxdWVuY3k6ICVzelxuIiwKKyAgICAgICAgICAgIGZvcm1hdFNJKGRvdWJsZShfX2ttcF9jcHVpbmZvLmZyZXF1ZW5jeSksIDksICdIJykuY19zdHIoKSk7CisjZW5kaWYKK30KKwordm9pZCBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6b3V0cHV0U3RhdHMoY29uc3QgY2hhciAqaGVhZGluZykgeworICAvLyBTdG9wIGFsbCB0aGUgZXhwbGljaXQgdGltZXJzIGluIGFsbCB0aHJlYWRzCisgIC8vIERvIHRoaXMgYmVmb3JlIGRlY2xhcmluZyB0aGUgbG9jYWwgc3RhdGlzdGljcyBiZWNhdXNlIHRoYXkgaGF2ZQorICAvLyBjb25zdHJ1Y3RvcnMgc28gd2lsbCB0YWtlIHRpbWUgdG8gY3JlYXRlLgorICB3aW5kdXBFeHBsaWNpdFRpbWVycygpOworCisgIHN0YXRpc3RpYyBhbGxTdGF0c1tUSU1FUl9MQVNUXTsKKyAgc3RhdGlzdGljIHRvdGFsU3RhdHNbVElNRVJfTEFTVF07IC8qIFN5bnRoZXNpemVkLCBjcm9zcyB0aHJlYWRzIHZlcnNpb25zIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWwgdGltZXIgc3RhdHMgKi8KKyAgc3RhdGlzdGljIGFsbENvdW50ZXJzW0NPVU5URVJfTEFTVF07CisKKyAgRklMRSAqc3RhdHNPdXQgPQorICAgICAgIW91dHB1dEZpbGVOYW1lLmVtcHR5KCkgPyBmb3BlbihvdXRwdXRGaWxlTmFtZS5jX3N0cigpLCAiYSsiKSA6IHN0ZGVycjsKKyAgaWYgKCFzdGF0c091dCkKKyAgICBzdGF0c091dCA9IHN0ZGVycjsKKworICBGSUxFICpldmVudHNPdXQ7CisgIGlmIChldmVudFByaW50aW5nRW5hYmxlZCgpKSB7CisgICAgZXZlbnRzT3V0ID0gZm9wZW4oZXZlbnRzRmlsZU5hbWUsICJ3KyIpOworICB9CisKKyAgcHJpbnRIZWFkZXJJbmZvKHN0YXRzT3V0KTsKKyAgZnByaW50ZihzdGF0c091dCwgIiVzXG4iLCBoZWFkaW5nKTsKKyAgLy8gQWNjdW11bGF0ZSBhY3Jvc3MgdGhyZWFkcy4KKyAga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGl0OworICBmb3IgKGl0ID0gX19rbXBfc3RhdHNfbGlzdC0+YmVnaW4oKTsgaXQgIT0gX19rbXBfc3RhdHNfbGlzdC0+ZW5kKCk7IGl0KyspIHsKKyAgICBpbnQgdCA9ICgqaXQpLT5nZXRHdGlkKCk7CisgICAgLy8gT3V0cHV0IHBlciB0aHJlYWQgc3RhdHMgaWYgcmVxdWVzdGVkLgorICAgIGlmIChwcmludFBlclRocmVhZEZsYWcpIHsKKyAgICAgIGZwcmludGYoc3RhdHNPdXQsICJUaHJlYWQgJWRcbiIsIHQpOworICAgICAgcHJpbnRUaW1lclN0YXRzKHN0YXRzT3V0LCAoKml0KS0+Z2V0VGltZXJzKCksIDApOworICAgICAgcHJpbnRDb3VudGVycyhzdGF0c091dCwgKCppdCktPmdldENvdW50ZXJzKCkpOworICAgICAgZnByaW50ZihzdGF0c091dCwgIlxuIik7CisgICAgfQorICAgIC8vIE91dHB1dCBwZXIgdGhyZWFkIGV2ZW50cyBpZiByZXF1ZXN0ZWQuCisgICAgaWYgKGV2ZW50UHJpbnRpbmdFbmFibGVkKCkpIHsKKyAgICAgIGttcF9zdGF0c19ldmVudF92ZWN0b3IgZXZlbnRzID0gKCppdCktPmdldEV2ZW50VmVjdG9yKCk7CisgICAgICBwcmludEV2ZW50cyhldmVudHNPdXQsICZldmVudHMsIHQpOworICAgIH0KKworICAgIC8vIEFjY3VtdWxhdGUgdGltZXJzLgorICAgIGZvciAodGltZXJfZSBzID0gdGltZXJfZSgwKTsgcyA8IFRJTUVSX0xBU1Q7IHMgPSB0aW1lcl9lKHMgKyAxKSkgeworICAgICAgLy8gU2VlIGlmIHdlIHNob3VsZCBpZ25vcmUgdGhpcyB0aW1lciB3aGVuIGFnZ3JlZ2F0aW5nCisgICAgICBpZiAoKHRpbWVTdGF0OjptYXN0ZXJPbmx5KHMpICYmICh0ICE9IDApKSB8fCAvLyBUaW1lciBvbmx5IHZhbGlkIG9uIG1hc3RlcgorICAgICAgICAgIC8vIGFuZCB0aGlzIHRocmVhZCBpcyB3b3JrZXIKKyAgICAgICAgICAodGltZVN0YXQ6Ondvcmtlck9ubHkocykgJiYgKHQgPT0gMCkpIC8vIFRpbWVyIG9ubHkgdmFsaWQgb24gd29ya2VyCisgICAgICAgICAgLy8gYW5kIHRoaXMgdGhyZWFkIGlzIHRoZSBtYXN0ZXIKKyAgICAgICAgICApIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIHN0YXRpc3RpYyAqdGhyZWFkU3RhdCA9ICgqaXQpLT5nZXRUaW1lcihzKTsKKyAgICAgIGFsbFN0YXRzW3NdICs9ICp0aHJlYWRTdGF0OworCisgICAgICAvLyBBZGQgVG90YWwgc3RhdHMgZm9yIHRpbWVycyB0aGF0IGFyZSB2YWxpZCBpbiBtb3JlIHRoYW4gb25lIHRocmVhZAorICAgICAgaWYgKCF0aW1lU3RhdDo6bm9Ub3RhbChzKSkKKyAgICAgICAgdG90YWxTdGF0c1tzXS5hZGRTYW1wbGUodGhyZWFkU3RhdC0+Z2V0VG90YWwoKSk7CisgICAgfQorCisgICAgLy8gQWNjdW11bGF0ZSBjb3VudGVycy4KKyAgICBmb3IgKGNvdW50ZXJfZSBjID0gY291bnRlcl9lKDApOyBjIDwgQ09VTlRFUl9MQVNUOyBjID0gY291bnRlcl9lKGMgKyAxKSkgeworICAgICAgaWYgKGNvdW50ZXI6Om1hc3Rlck9ubHkoYykgJiYgdCAhPSAwKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGFsbENvdW50ZXJzW2NdLmFkZFNhbXBsZSgoKml0KS0+Z2V0Q291bnRlcihjKS0+Z2V0VmFsdWUoKSk7CisgICAgfQorICB9CisKKyAgaWYgKGV2ZW50UHJpbnRpbmdFbmFibGVkKCkpIHsKKyAgICBwcmludFBsb3RpY3VzRmlsZSgpOworICAgIGZjbG9zZShldmVudHNPdXQpOworICB9CisKKyAgZnByaW50ZihzdGF0c091dCwgIkFnZ3JlZ2F0ZSBmb3IgYWxsIHRocmVhZHNcbiIpOworICBwcmludFRpbWVyU3RhdHMoc3RhdHNPdXQsICZhbGxTdGF0c1swXSwgJnRvdGFsU3RhdHNbMF0pOworICBmcHJpbnRmKHN0YXRzT3V0LCAiXG4iKTsKKyAgcHJpbnRDb3VudGVyU3RhdHMoc3RhdHNPdXQsICZhbGxDb3VudGVyc1swXSk7CisKKyAgaWYgKHN0YXRzT3V0ICE9IHN0ZGVycikKKyAgICBmY2xvc2Uoc3RhdHNPdXQpOworfQorCisvKiAqKioqKioqKioqKioqICBleHBvcnRlZCBDIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKiAqLworCisvLyBubyBuYW1lIG1hbmdsaW5nIGZvciB0aGVzZSBmdW5jdGlvbnMsIHdlIHdhbnQgdGhlIGMgZmlsZXMgdG8gYmUgYWJsZSB0byBnZXQKKy8vIGF0IHRoZXNlIGZ1bmN0aW9ucworZXh0ZXJuICJDIiB7CisKK3ZvaWQgX19rbXBfcmVzZXRfc3RhdHMoKSB7CisgIGttcF9zdGF0c19saXN0OjppdGVyYXRvciBpdDsKKyAgZm9yIChpdCA9IF9fa21wX3N0YXRzX2xpc3QtPmJlZ2luKCk7IGl0ICE9IF9fa21wX3N0YXRzX2xpc3QtPmVuZCgpOyBpdCsrKSB7CisgICAgdGltZVN0YXQgKnRpbWVycyA9ICgqaXQpLT5nZXRUaW1lcnMoKTsKKyAgICBjb3VudGVyICpjb3VudGVycyA9ICgqaXQpLT5nZXRDb3VudGVycygpOworICAgIGV4cGxpY2l0VGltZXIgKmVUaW1lcnMgPSAoKml0KS0+Z2V0RXhwbGljaXRUaW1lcnMoKTsKKworICAgIGZvciAoaW50IHQgPSAwOyB0IDwgVElNRVJfTEFTVDsgdCsrKQorICAgICAgdGltZXJzW3RdLnJlc2V0KCk7CisKKyAgICBmb3IgKGludCBjID0gMDsgYyA8IENPVU5URVJfTEFTVDsgYysrKQorICAgICAgY291bnRlcnNbY10ucmVzZXQoKTsKKworICAgIGZvciAoaW50IHQgPSAwOyB0IDwgRVhQTElDSVRfVElNRVJfTEFTVDsgdCsrKQorICAgICAgZVRpbWVyc1t0XS5yZXNldCgpOworCisgICAgLy8gcmVzZXQgdGhlIGV2ZW50IHZlY3RvciBzbyBhbGwgcHJldmlvdXMgZXZlbnRzIGFyZSAiZXJhc2VkIgorICAgICgqaXQpLT5yZXNldEV2ZW50VmVjdG9yKCk7CisgIH0KK30KKworLy8gVGhpcyBmdW5jdGlvbiB3aWxsIHJlc2V0IGFsbCBzdGF0cyBhbmQgc3RvcCBhbGwgdGhyZWFkcycgZXhwbGljaXQgdGltZXJzIGlmCisvLyB0aGV5IGhhdmVuJ3QgYmVlbiBzdG9wcGVkIGFscmVhZHkuCit2b2lkIF9fa21wX291dHB1dF9zdGF0cyhjb25zdCBjaGFyICpoZWFkaW5nKSB7CisgIF9fa21wX3N0YXRzX2dsb2JhbF9vdXRwdXQtPm91dHB1dFN0YXRzKGhlYWRpbmcpOworICBfX2ttcF9yZXNldF9zdGF0cygpOworfQorCit2b2lkIF9fa21wX2FjY3VtdWxhdGVfc3RhdHNfYXRfZXhpdCh2b2lkKSB7CisgIC8vIE9ubHkgZG8gdGhpcyBvbmNlLgorICBpZiAoS01QX1hDSEdfRklYRUQzMigmc3RhdHNQcmludGVkLCAxKSAhPSAwKQorICAgIHJldHVybjsKKworICBfX2ttcF9vdXRwdXRfc3RhdHMoIlN0YXRpc3RpY3Mgb24gZXhpdCIpOworfQorCit2b2lkIF9fa21wX3N0YXRzX2luaXQodm9pZCkgeworICBfX2ttcF9pbml0X3Rhc19sb2NrKCZfX2ttcF9zdGF0c19sb2NrKTsKKyAgX19rbXBfc3RhdHNfc3RhcnRfdGltZSA9IHRzY190aWNrX2NvdW50Ojpub3coKTsKKyAgX19rbXBfc3RhdHNfZ2xvYmFsX291dHB1dCA9IG5ldyBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZSgpOworICBfX2ttcF9zdGF0c19saXN0ID0gbmV3IGttcF9zdGF0c19saXN0KCk7Cit9CisKK3ZvaWQgX19rbXBfc3RhdHNfZmluaSh2b2lkKSB7CisgIF9fa21wX2FjY3VtdWxhdGVfc3RhdHNfYXRfZXhpdCgpOworICBfX2ttcF9zdGF0c19saXN0LT5kZWFsbG9jYXRlKCk7CisgIGRlbGV0ZSBfX2ttcF9zdGF0c19nbG9iYWxfb3V0cHV0OworICBkZWxldGUgX19rbXBfc3RhdHNfbGlzdDsKK30KKworfSAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3RhdHMuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdGF0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYWQyNTcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3RhdHMuaApAQCAtMCwwICsxLDk1MCBAQAorI2lmbmRlZiBLTVBfU1RBVFNfSAorI2RlZmluZSBLTVBfU1RBVFNfSAorCisvKiogQGZpbGUga21wX3N0YXRzLmgKKyAqIEZ1bmN0aW9ucyBmb3IgY29sbGVjdGluZyBzdGF0aXN0aWNzLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wX2NvbmZpZy5oIgorCisjaWYgS01QX1NUQVRTX0VOQUJMRUQKKy8qIFN0YXRpc3RpY3MgYWNjdW11bGF0b3IuCisgICBBY2N1bXVsYXRlcyBudW1iZXIgb2Ygc2FtcGxlcyBhbmQgY29tcHV0ZXMgbWluLCBtYXgsIG1lYW4sIHN0YW5kYXJkIGRldmlhdGlvbgorICAgb24gdGhlIGZseS4KKworICAgT25saW5lIHZhcmlhbmNlIGNhbGN1bGF0aW9uIGFsZ29yaXRobSBmcm9tCisgICBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FsZ29yaXRobXNfZm9yX2NhbGN1bGF0aW5nX3ZhcmlhbmNlI09uLWxpbmVfYWxnb3JpdGhtCisgKi8KKworI2luY2x1ZGUgImttcF9zdGF0c190aW1pbmcuaCIKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPG5ldz4gLy8gcGxhY2VtZW50IG5ldworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8qIEVuYWJsZSBkZXZlbG9wZXIgc3RhdGlzdGljcyBoZXJlIGlmIHlvdSB3YW50IHRoZW0uIFRoZXkgYXJlIG1vcmUgZGV0YWlsZWQKKyAgIHRoYW4gaXMgdXNlZnVsIGZvciBhcHBsaWNhdGlvbiBjaGFyYWN0ZXJpc2F0aW9uIGFuZCBhcmUgaW50ZW5kZWQgZm9yIHRoZQorICAgcnVudGltZSBsaWJyYXJ5IGRldmVsb3Blci4gKi8KKy8vICNkZWZpbmUgS01QX0RFVkVMT1BFUl9TVEFUUyAxCisKKy8qIQorICogQGluZ3JvdXAgU1RBVFNfR0FUSEVSSU5HCisgKiBcYnJpZWYgZmxhZ3MgdG8gZGVzY3JpYmUgdGhlIHN0YXRpc3RpYyAodGltZXIgb3IgY291bnRlcikKKyAqCisgKi8KK2VudW0gc3RhdHNfZmxhZ3NfZSB7CisgIG5vVG90YWwgPSAxIDw8IDAsIC8vITwgZG8gbm90IHNob3cgYSBUT1RBTF9hZ2dyZWdhdGlvbiBmb3IgdGhpcyBzdGF0aXN0aWMKKyAgb25seUluTWFzdGVyID0gMSA8PCAxLCAvLyE8IHN0YXRpc3RpYyBpcyB2YWxpZCBvbmx5IGZvciBtYXN0ZXIKKyAgbm9Vbml0cyA9CisgICAgICAxIDw8IDIsIC8vITwgc3RhdGlzdGljIGRvZXNuJ3QgbmVlZCB1bml0cyBwcmludGVkIG5leHQgdG8gaXQgaW4gb3V0cHV0CisgIG5vdEluTWFzdGVyID0gMSA8PCAzLCAvLyE8IHN0YXRpc3RpYyBpcyB2YWxpZCBvbmx5IGZvciBub24tbWFzdGVyIHRocmVhZHMKKyAgbG9nRXZlbnQgPSAxIDw8IDQgLy8hPCBzdGF0aXN0aWMgY2FuIGJlIGxvZ2dlZCBvbiB0aGUgZXZlbnQgdGltZWxpbmUgd2hlbgorICAvLyEgS01QX1NUQVRTX0VWRU5UUyBpcyBvbiAodmFsaWQgb25seSBmb3IgdGltZXJzKQorfTsKKworLyohCisgKiBAaW5ncm91cCBTVEFUU19HQVRIRVJJTkcKKyAqIFxicmllZiB0aGUgc3RhdGVzIHdoaWNoIGEgdGhyZWFkIGNhbiBiZSBpbgorICoKKyAqLworZW51bSBzdGF0c19zdGF0ZV9lIHsKKyAgSURMRSwKKyAgU0VSSUFMX1JFR0lPTiwKKyAgRk9SS19KT0lOX0JBUlJJRVIsCisgIFBMQUlOX0JBUlJJRVIsCisgIFRBU0tXQUlULAorICBUQVNLWUlFTEQsCisgIFRBU0tHUk9VUCwKKyAgSU1QTElDSVRfVEFTSywKKyAgRVhQTElDSVRfVEFTSworfTsKKworLyohCisgKiBcYnJpZWYgQWRkIG5ldyBjb3VudGVycyB1bmRlciBLTVBfRk9SRUFDSF9DT1VOVEVSKCkgbWFjcm8gaW4ga21wX3N0YXRzLmgKKyAqCisgKiBAcGFyYW0gbWFjcm8gYSB1c2VyIGRlZmluZWQgbWFjcm8gdGhhdCB0YWtlcyB0aHJlZSBhcmd1bWVudHMgLQorICogbWFjcm8oQ09VTlRFUl9OQU1FLCBmbGFncywgYXJnKQorICogQHBhcmFtIGFyZyBhIHVzZXIgZGVmaW5lZCBhcmd1bWVudCB0byBzZW5kIHRvIHRoZSB1c2VyIGRlZmluZWQgbWFjcm8KKyAqCisgKiBcZGV0YWlscyBBIGNvdW50ZXIgY291bnRzIHRoZSBvY2N1cnJlbmNlIG9mIHNvbWUgZXZlbnQuIEVhY2ggdGhyZWFkCisgKiBhY2N1bXVsYXRlcyBpdHMgb3duIGNvdW50LCBhdCB0aGUgZW5kIG9mIGV4ZWN1dGlvbiB0aGUgY291bnRzIGFyZSBhZ2dyZWdhdGVkCisgKiB0cmVhdGluZyBlYWNoIHRocmVhZCBhcyBhIHNlcGFyYXRlIG1lYXN1cmVtZW50LiAoVW5sZXNzIG9ubHlJbk1hc3RlciBpcyBzZXQsCisgKiBpbiB3aGljaCBjYXNlIHRoZXJlJ3Mgb25seSBhIHNpbmdsZSBtZWFzdXJlbWVudCkuIFRoZSBtaW4sbWVhbixtYXggYXJlCisgKiB0aGVyZWZvcmUgdGhlIHZhbHVlcyBmb3IgdGhlIHRocmVhZHMuIEFkZGluZyB0aGUgY291bnRlciBoZXJlIGFuZCB0aGVuCisgKiBwdXR0aW5nIGEgS01QX0JMT0NLX0NPVU5URVIobmFtZSkgYXQgdGhlIHBvaW50IHlvdSB3YW50IHRvIGNvdW50IGlzIGFsbCB5b3UKKyAqIG5lZWQgdG8gZG8uIEFsbCBvZiB0aGUgdGFibGVzIGFuZCBwcmludGluZyBpcyBnZW5lcmF0ZWQgZnJvbSB0aGlzIG1hY3JvLgorICogRm9ybWF0IGlzICJtYWNybyhuYW1lLCBmbGFncywgYXJnKSIKKyAqCisgKiBAaW5ncm91cCBTVEFUU19HQVRIRVJJTkcKKyAqLworLy8gY2xhbmctZm9ybWF0IG9mZgorI2RlZmluZSBLTVBfRk9SRUFDSF9DT1VOVEVSKG1hY3JvLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbWFjcm8oT01QX1BBUkFMTEVMLCBzdGF0c19mbGFnc19lOjpvbmx5SW5NYXN0ZXIgfCBzdGF0c19mbGFnc19lOjpub1RvdGFsLCAgICBcCisgICAgICAgIGFyZykgbWFjcm8oT01QX05FU1RFRF9QQVJBTExFTCwgMCwgYXJnKSBtYWNybyhPTVBfRk9SX3N0YXRpYywgMCwgYXJnKSAgXAorICAgICAgbWFjcm8oT01QX0ZPUl9zdGF0aWNfc3RlYWwsIDAsIGFyZykgbWFjcm8oT01QX0ZPUl9keW5hbWljLCAwLCBhcmcpICAgICAgIFwKKyAgICAgICAgICBtYWNybyhPTVBfRElTVFJJQlVURSwgMCwgYXJnKSBtYWNybyhPTVBfQkFSUklFUiwgMCwgYXJnKSAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIG1hY3JvKE9NUF9DUklUSUNBTCwgMCwgYXJnKSBtYWNybyhPTVBfU0lOR0xFLCAwLCBhcmcpICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgbWFjcm8oT01QX01BU1RFUiwgMCwgYXJnKSBtYWNybyhPTVBfVEVBTVMsIDAsIGFyZykgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBtYWNybyhPTVBfc2V0X2xvY2ssIDAsIGFyZykgbWFjcm8oT01QX3Rlc3RfbG9jaywgMCwgYXJnKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvKFJFRFVDRV93YWl0LCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm8oUkVEVUNFX25vd2FpdCwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNybyhPTVBfVEFTS1lJRUxELCAwLCBhcmcpICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvKE9NUF9UQVNLTE9PUCwgMCwgYXJnKSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm8oVEFTS19leGVjdXRlZCwgMCwgYXJnKSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNybyhUQVNLX2NhbmNlbGxlZCwgMCwgYXJnKSAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvKFRBU0tfc3RvbGVuLCAwLCBhcmcpCisvLyBjbGFuZy1mb3JtYXQgb24KKworLyohCisgKiBcYnJpZWYgQWRkIG5ldyB0aW1lcnMgdW5kZXIgS01QX0ZPUkVBQ0hfVElNRVIoKSBtYWNybyBpbiBrbXBfc3RhdHMuaAorICoKKyAqIEBwYXJhbSBtYWNybyBhIHVzZXIgZGVmaW5lZCBtYWNybyB0aGF0IHRha2VzIHRocmVlIGFyZ3VtZW50cyAtCisgKiBtYWNybyhUSU1FUl9OQU1FLCBmbGFncywgYXJnKQorICogQHBhcmFtIGFyZyBhIHVzZXIgZGVmaW5lZCBhcmd1bWVudCB0byBzZW5kIHRvIHRoZSB1c2VyIGRlZmluZWQgbWFjcm8KKyAqCisgKiBcZGV0YWlscyBBIHRpbWVyIGNvbGxlY3RzIG11bHRpcGxlIHNhbXBsZXMgb2Ygc29tZSBjb3VudCBpbiBlYWNoIHRocmVhZCBhbmQKKyAqIHRoZW4gZmluYWxseSBhZ2dyZWdhdGVzIGFsbGwgb2YgdGhlIHNhbXBsZXMgZnJvbSBhbGwgb2YgdGhlIHRocmVhZHMuIEZvciBtb3N0CisgKiB0aW1lcnMgdGhlIHByaW50aW5nIGNvZGUgYWxzbyBwcm92aWRlcyBhbiBhZ2dyZWdhdGlvbiBvdmVyIHRoZSB0aHJlYWQgdG90YWxzLgorICogVGhlc2UgYXJlIHByaW50ZWQgYXMgVE9UQUxfZm9vLiBUaGUgY291bnQgaXMgbm9ybWFsbHkgYSB0aW1lIChpbiB0aWNrcyksCisgKiBoZW5jZSB0aGUgbmFtZSAidGltZXIiLiAoQnV0IGNhbiBiZSBhbnkgdmFsdWUsIHNvIHdlIHVzZSB0aGlzIGZvciAibnVtYmVyIG9mCisgKiBhcmd1bWVudHMgcGFzc2VkIHRvIGZvcmsiIGFzIHdlbGwpLiBGb3IgdGltZXJzIHRoZSB0aHJlYWRzIGFyZSBub3QKKyAqIHNpZ25pZmljYW50LCBpdCdzIHRoZSBpbmRpdmlkdWFsIG9ic2VydmF0aW9ucyB0aGF0IGNvdW50LCBzbyB0aGUgc3RhdGlzdGljcworICogYXJlIGF0IHRoYXQgbGV2ZWwuIEZvcm1hdCBpcyAibWFjcm8obmFtZSwgZmxhZ3MsIGFyZykiCisgKgorICogQGluZ3JvdXAgU1RBVFNfR0FUSEVSSU5HMgorICovCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisjZGVmaW5lIEtNUF9GT1JFQUNIX1RJTUVSKG1hY3JvLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfd29ya2VyX3RocmVhZF9saWZlLCBzdGF0c19mbGFnc19lOjpsb2dFdmVudCwgYXJnKSAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoRk9SX3N0YXRpY19zY2hlZHVsaW5nLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKEZPUl9keW5hbWljX3NjaGVkdWxpbmcsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfY3JpdGljYWwsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX2NyaXRpY2FsX3dhaXQsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9zaW5nbGUsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfbWFzdGVyLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX2lkbGUsIHN0YXRzX2ZsYWdzX2U6OmxvZ0V2ZW50LCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9wbGFpbl9iYXJyaWVyLCBzdGF0c19mbGFnc19lOjpsb2dFdmVudCwgYXJnKSAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfZm9ya19iYXJyaWVyLCBzdGF0c19mbGFnc19lOjpsb2dFdmVudCwgYXJnKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX2pvaW5fYmFycmllciwgc3RhdHNfZmxhZ3NfZTo6bG9nRXZlbnQsIGFyZykgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9wYXJhbGxlbCwgc3RhdHNfZmxhZ3NfZTo6bG9nRXZlbnQsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfdGFza19pbW1lZGlhdGUsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX3Rhc2tfdGFza3dhaXQsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF90YXNrX3Rhc2t5aWVsZCwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfdGFza190YXNrZ3JvdXAsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX3Rhc2tfam9pbl9iYXIsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF90YXNrX3BsYWluX2JhciwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfc2VyaWFsLCBzdGF0c19mbGFnc19lOjpsb2dFdmVudCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX3Rhc2tsb29wX3NjaGVkdWxpbmcsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9zZXRfbnVtdGhyZWFkcywgc3RhdHNfZmxhZ3NfZTo6bm9Vbml0cyB8IHN0YXRzX2ZsYWdzX2U6Om5vVG90YWwsXAorICAgICAgICAgICBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX1BBUkFMTEVMX2FyZ3MsIHN0YXRzX2ZsYWdzX2U6Om5vVW5pdHMgfCBzdGF0c19mbGFnc19lOjpub1RvdGFsLCBcCisgICAgICAgICAgIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChGT1Jfc3RhdGljX2l0ZXJhdGlvbnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgc3RhdHNfZmxhZ3NfZTo6bm9Vbml0cyB8IHN0YXRzX2ZsYWdzX2U6Om5vVG90YWwsIGFyZykgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKEZPUl9keW5hbWljX2l0ZXJhdGlvbnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBzdGF0c19mbGFnc19lOjpub1VuaXRzIHwgc3RhdHNfZmxhZ3NfZTo6bm9Ub3RhbCwgYXJnKSAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoRk9SX3N0YXRpY19zdGVhbF9zdG9sZW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHN0YXRzX2ZsYWdzX2U6Om5vVW5pdHMgfCBzdGF0c19mbGFnc19lOjpub1RvdGFsLCBhcmcpICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChGT1Jfc3RhdGljX3N0ZWFsX2NodW5rcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgc3RhdHNfZmxhZ3NfZTo6bm9Vbml0cyB8IHN0YXRzX2ZsYWdzX2U6Om5vVG90YWwsIGFyZykgICAgICAgICAgICAgICBcCisgICAgS01QX0ZPUkVBQ0hfREVWRUxPUEVSX1RJTUVSKG1hY3JvLCBhcmcpCisvLyBjbGFuZy1mb3JtYXQgb24KKworLy8gT01QX3N0YXJ0X2VuZCAgICAgICAgICAtLSBUaW1lIGZyb20gd2hlbiBPcGVuTVAgaXMgaW5pdGlhbGl6ZWQgdW50aWwgdGhlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzIGFyZSBwcmludGVkIGF0IGV4aXQKKy8vIE9NUF9zZXJpYWwgICAgICAgICAgICAgLS0gVGhyZWFkIHplcm8gdGltZSBleGVjdXRpbmcgc2VyaWFsIGNvZGUKKy8vIE9NUF93b3JrICAgICAgICAgICAgICAgLS0gRWxhcHNlZCB0aW1lIGluIGNvZGUgZGlzcGF0Y2hlZCBieSBhIGZvcmsgKG1lYXN1cmVkCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSB0aHJlYWQpCisvLyBPTVBfYmFycmllciAgICAgICAgICAgIC0tIFRpbWUgYXQgInJlYWwiIGJhcnJpZXJzIChpbmNsdWRlcyB0YXNrIHRpbWUpCisvLyBGT1Jfc3RhdGljX3NjaGVkdWxpbmcgIC0tIFRpbWUgc3BlbnQgZG9pbmcgc2NoZWR1bGluZyBmb3IgYSBzdGF0aWMgImZvciIKKy8vIEZPUl9keW5hbWljX3NjaGVkdWxpbmcgLS0gVGltZSBzcGVudCBkb2luZyBzY2hlZHVsaW5nIGZvciBhIGR5bmFtaWMgImZvciIKKy8vIE9NUF9pZGxlICAgICAgICAgICAgICAgLS0gV29ya2VyIHRocmVhZHMgdGltZSBzcGVudCB3YWl0aW5nIGZvciBpbmNsdXNpb24gaW4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwYXJhbGxlbCByZWdpb24KKy8vIE9NUF9wbGFpbl9iYXJyaWVyICAgICAgLS0gVGltZSBzcGVudCBpbiBhIGJhcnJpZXIgY29uc3RydWN0CisvLyBPTVBfZm9ya19qb2luX2JhcnJpZXIgIC0tIFRpbWUgc3BlbnQgaW4gYSB0aGUgZm9yay1qb2luIGJhcnJpZXIgc3Vycm91bmRpbmcgYQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbGxlbCByZWdpb24KKy8vIE9NUF9wYXJhbGxlbCAgICAgICAgICAgLS0gVGltZSBzcGVudCBpbnNpZGUgYSBwYXJhbGxlbCBjb25zdHJ1Y3QKKy8vIE9NUF90YXNrX2ltbWVkaWF0ZSAgICAgLS0gVGltZSBzcGVudCBleGVjdXRpbmcgbm9uLWRlZmVycmVkIHRhc2tzCisvLyBPTVBfdGFza190YXNrd2FpdCAgICAgIC0tIFRpbWUgc3BlbnQgZXhlY3V0aW5nIHRhc2tzIGluc2lkZSBhIHRhc2t3YWl0CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdAorLy8gT01QX3Rhc2tfdGFza3lpZWxkICAgICAtLSBUaW1lIHNwZW50IGV4ZWN1dGluZyB0YXNrcyBpbnNpZGUgYSB0YXNreWllbGQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0CisvLyBPTVBfdGFza190YXNrZ3JvdXAgICAgIC0tIFRpbWUgc3BlbnQgZXhlY3V0aW5nIHRhc2tzIGluc2lkZSBhIHRhc2t5Z3JvdXAKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0CisvLyBPTVBfdGFza19qb2luX2JhciAgICAgIC0tIFRpbWUgc3BlbnQgZXhlY3V0aW5nIHRhc2tzIGluc2lkZSBhIGpvaW4gYmFycmllcgorLy8gT01QX3Rhc2tfcGxhaW5fYmFyICAgICAtLSBUaW1lIHNwZW50IGV4ZWN1dGluZyB0YXNrcyBpbnNpZGUgYSBiYXJyaWVyCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdAorLy8gT01QX3NpbmdsZSAgICAgICAgICAgICAtLSBUaW1lIHNwZW50IGV4ZWN1dGluZyBhICJzaW5nbGUiIHJlZ2lvbgorLy8gT01QX21hc3RlciAgICAgICAgICAgICAtLSBUaW1lIHNwZW50IGV4ZWN1dGluZyBhICJtYXN0ZXIiIHJlZ2lvbgorLy8gT01QX3NldF9udW10aHJlYWRzICAgICAtLSBWYWx1ZXMgcGFzc2VkIHRvIG9tcF9zZXRfbnVtX3RocmVhZHMKKy8vIE9NUF9QQVJBTExFTF9hcmdzICAgICAgLS0gTnVtYmVyIG9mIGFyZ3VtZW50cyBwYXNzZWQgdG8gYSBwYXJhbGxlbCByZWdpb24KKy8vIEZPUl9zdGF0aWNfaXRlcmF0aW9ucyAgLS0gTnVtYmVyIG9mIGF2YWlsYWJsZSBwYXJhbGxlbCBjaHVua3Mgb2Ygd29yayBpbiBhCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBmb3IKKy8vIEZPUl9keW5hbWljX2l0ZXJhdGlvbnMgLS0gTnVtYmVyIG9mIGF2YWlsYWJsZSBwYXJhbGxlbCBjaHVua3Mgb2Ygd29yayBpbiBhCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMgZm9yCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdGggYWRqdXN0IGZvciBhbnkgY2h1bmtpbmcsIHNvIGlmIHRoZXJlIHdlcmUgYW4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0aW9uIGNvdW50IG9mIDIwIGJ1dCBhIGNodW5rIHNpemUgb2YgMTAsIHdlJ2QKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkIDIuCisKKyNpZiAoS01QX0RFVkVMT1BFUl9TVEFUUykKKy8vIFRpbWVycyB3aGljaCBhcmUgb2YgaW50ZXJlc3QgdG8gcnVudGltZSBsaWJyYXJ5IGRldmVsb3BlcnMsIG5vdCBlbmQgdXNlcnMuCisvLyBUaGVzZSBoYXZlIHRvIGJlIGV4cGxpY2l0bHkgZW5hYmxlZCBpbiBhZGRpdGlvbiB0byB0aGUgb3RoZXIgc3RhdHMuCisKKy8vIEtNUF9mb3JrX2JhcnJpZXIgICAgICAgLS0gdGltZSBpbiBfX2ttcF9mb3JrX2JhcnJpZXIKKy8vIEtNUF9qb2luX2JhcnJpZXIgICAgICAgLS0gdGltZSBpbiBfX2ttcF9qb2luX2JhcnJpZXIKKy8vIEtNUF9iYXJyaWVyICAgICAgICAgICAgLS0gdGltZSBpbiBfX2ttcF9iYXJyaWVyCisvLyBLTVBfZW5kX3NwbGl0X2JhcnJpZXIgIC0tIHRpbWUgaW4gX19rbXBfZW5kX3NwbGl0X2JhcnJpZXIKKy8vIEtNUF9zZXR1cF9pY3ZfY29weSAgICAgLS0gdGltZSBpbiBfX2ttcF9zZXR1cF9pY3ZfY29weQorLy8gS01QX2ljdl9jb3B5ICAgICAgICAgICAtLSBzdGFydC9zdG9wIHRpbWVyIGZvciBhbnkgSUNWIGNvcHlpbmcKKy8vIEtNUF9saW5lYXJfZ2F0aGVyICAgICAgLS0gdGltZSBpbiBfX2ttcF9saW5lYXJfYmFycmllcl9nYXRoZXIKKy8vIEtNUF9saW5lYXJfcmVsZWFzZSAgICAgLS0gdGltZSBpbiBfX2ttcF9saW5lYXJfYmFycmllcl9yZWxlYXNlCisvLyBLTVBfdHJlZV9nYXRoZXIgICAgICAgIC0tIHRpbWUgaW4gX19rbXBfdHJlZV9iYXJyaWVyX2dhdGhlcgorLy8gS01QX3RyZWVfcmVsZWFzZSAgICAgICAtLSB0aW1lIGluIF9fa21wX3RyZWVfYmFycmllcl9yZWxlYXNlCisvLyBLTVBfaHlwZXJfZ2F0aGVyICAgICAgIC0tIHRpbWUgaW4gX19rbXBfaHlwZXJfYmFycmllcl9nYXRoZXIKKy8vIEtNUF9oeXBlcl9yZWxlYXNlICAgICAgLS0gdGltZSBpbiBfX2ttcF9oeXBlcl9iYXJyaWVyX3JlbGVhc2UKKyNkZWZpbmUgS01QX0ZPUkVBQ0hfREVWRUxPUEVSX1RJTUVSKG1hY3JvLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG1hY3JvKEtNUF9mb3JrX2NhbGwsIDAsIGFyZykgbWFjcm8oS01QX2pvaW5fY2FsbCwgMCwgYXJnKSBtYWNybyggICAgICAgICAgICAgXAorICAgICAgS01QX2VuZF9zcGxpdF9iYXJyaWVyLCAwLCBhcmcpIG1hY3JvKEtNUF9oaWVyX2dhdGhlciwgMCwgYXJnKSAgICAgICAgICAgIFwKKyAgICAgIG1hY3JvKEtNUF9oaWVyX3JlbGVhc2UsIDAsIGFyZykgbWFjcm8oS01QX2h5cGVyX2dhdGhlciwgMCwgYXJnKSAgICAgICAgICBcCisgICAgICAgICAgbWFjcm8oS01QX2h5cGVyX3JlbGVhc2UsIDAsIGFyZykgbWFjcm8oS01QX2xpbmVhcl9nYXRoZXIsIDAsIGFyZykgICAgXAorICAgICAgICAgICAgICBtYWNybyhLTVBfbGluZWFyX3JlbGVhc2UsIDAsIGFyZykgbWFjcm8oS01QX3RyZWVfZ2F0aGVyLCAwLCBhcmcpIFwKKyAgICAgICAgICAgICAgICAgIG1hY3JvKEtNUF90cmVlX3JlbGVhc2UsIDAsIGFyZykgbWFjcm8oVVNFUl9yZXN1bWUsIDAsIGFyZykgICBcCisgICAgICAgICAgICAgICAgICAgICAgbWFjcm8oVVNFUl9zdXNwZW5kLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNybyhLTVBfYWxsb2NhdGVfdGVhbSwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvKEtNUF9zZXR1cF9pY3ZfY29weSwgMCwgYXJnKSAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm8oVVNFUl9pY3ZfY29weSwgMCwgYXJnKQorI2Vsc2UKKyNkZWZpbmUgS01QX0ZPUkVBQ0hfREVWRUxPUEVSX1RJTUVSKG1hY3JvLCBhcmcpCisjZW5kaWYKKworLyohCisgKiBcYnJpZWYgQWRkIG5ldyBleHBsaWNpdCB0aW1lcnMgdW5kZXIgS01QX0ZPUkVBQ0hfRVhQTElDSVRfVElNRVIoKSBtYWNyby4KKyAqCisgKiBAcGFyYW0gbWFjcm8gYSB1c2VyIGRlZmluZWQgbWFjcm8gdGhhdCB0YWtlcyB0aHJlZSBhcmd1bWVudHMgLQorICogbWFjcm8oVElNRVJfTkFNRSwgZmxhZ3MsIGFyZykKKyAqIEBwYXJhbSBhcmcgYSB1c2VyIGRlZmluZWQgYXJndW1lbnQgdG8gc2VuZCB0byB0aGUgdXNlciBkZWZpbmVkIG1hY3JvCisgKgorICogXHdhcm5pbmcgWU9VIE1VU1QgSEFWRSBUSEUgU0FNRSBOQU1FRCBUSU1FUiBVTkRFUiBLTVBfRk9SRUFDSF9USU1FUigpIE9SIEVMU0UKKyAqIEJBRCBUSElOR1MgV0lMTCBIQVBQRU4hCisgKgorICogXGRldGFpbHMgRXhwbGljaXQgdGltZXJzIGFyZSBvbmVzIHdoZXJlIHdlIG5lZWQgdG8gYWxsb2NhdGUgYSB0aW1lciBpdHNlbGYKKyAqIChhcyB3ZWxsIGFzIHRoZSBhY2N1bXVsYXRlZCB0aW1pbmcgc3RhdGlzdGljcykuIFdlIGFsbG9jYXRlIHRoZXNlIG9uIGEKKyAqIHBlci10aHJlYWQgYmFzaXMsIGFuZCBleHBsaWNpdGx5IHN0YXJ0IGFuZCBzdG9wIHRoZW0uIEJsb2NrIHRpbWVycyBqdXN0CisgKiBhbGxvY2F0ZSB0aGUgdGltZXIgaXRzZWxmIG9uIHRoZSBzdGFjaywgYW5kIHVzZSB0aGUgZGVzdHJ1Y3RvciB0byBub3RpY2UKKyAqIGJsb2NrIGV4aXQ7IHRoZXkgZG9uJ3QgbmVlZCB0byBiZSBkZWZpbmVkIGhlcmUuIFRoZSBuYW1lIGhlcmUgc2hvdWxkIGJlIHRoZQorICogc2FtZSBhcyB0aGF0IG9mIGEgdGltZXIgYWJvdmUuCisgKgorICogQGluZ3JvdXAgU1RBVFNfR0FUSEVSSU5HCisqLworI2RlZmluZSBLTVBfRk9SRUFDSF9FWFBMSUNJVF9USU1FUihtYWNybywgYXJnKSBLTVBfRk9SRUFDSF9USU1FUihtYWNybywgYXJnKQorCisjZGVmaW5lIEVOVU1FUkFURShuYW1lLCBpZ25vcmUsIHByZWZpeCkgcHJlZml4IyNuYW1lLAorZW51bSB0aW1lcl9lIHsgS01QX0ZPUkVBQ0hfVElNRVIoRU5VTUVSQVRFLCBUSU1FUl8pIFRJTUVSX0xBU1QgfTsKKworZW51bSBleHBsaWNpdF90aW1lcl9lIHsKKyAgS01QX0ZPUkVBQ0hfRVhQTElDSVRfVElNRVIoRU5VTUVSQVRFLCBFWFBMSUNJVF9USU1FUl8pIEVYUExJQ0lUX1RJTUVSX0xBU1QKK307CisKK2VudW0gY291bnRlcl9lIHsgS01QX0ZPUkVBQ0hfQ09VTlRFUihFTlVNRVJBVEUsIENPVU5URVJfKSBDT1VOVEVSX0xBU1QgfTsKKyN1bmRlZiBFTlVNRVJBVEUKKworY2xhc3MgdGltZXJQYWlyIHsKKyAgZXhwbGljaXRfdGltZXJfZSB0aW1lcl9pbmRleDsKKyAgdGltZXJfZSB0aW1lcjsKKworcHVibGljOgorICB0aW1lclBhaXIoZXhwbGljaXRfdGltZXJfZSB0aSwgdGltZXJfZSB0KSA6IHRpbWVyX2luZGV4KHRpKSwgdGltZXIodCkge30KKyAgaW5saW5lIGV4cGxpY2l0X3RpbWVyX2UgZ2V0X2luZGV4KCkgY29uc3QgeyByZXR1cm4gdGltZXJfaW5kZXg7IH0KKyAgaW5saW5lIHRpbWVyX2UgZ2V0X3RpbWVyKCkgY29uc3QgeyByZXR1cm4gdGltZXI7IH0KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHRpbWVyUGFpciAmcmhzKSB7CisgICAgcmV0dXJuIHRoaXMtPmdldF9pbmRleCgpID09IHJocy5nZXRfaW5kZXgoKTsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgdGltZXJQYWlyICZyaHMpIHsgcmV0dXJuICEoKnRoaXMgPT0gcmhzKTsgfQorfTsKKworY2xhc3Mgc3RhdGlzdGljIHsKKyAgZG91YmxlIG1pblZhbDsKKyAgZG91YmxlIG1heFZhbDsKKyAgZG91YmxlIG1lYW5WYWw7CisgIGRvdWJsZSBtMjsKKyAgdWludDY0X3Qgc2FtcGxlQ291bnQ7CisKK3B1YmxpYzoKKyAgc3RhdGlzdGljKCkgeyByZXNldCgpOyB9CisgIHN0YXRpc3RpYyhzdGF0aXN0aWMgY29uc3QgJm8pCisgICAgICA6IG1pblZhbChvLm1pblZhbCksIG1heFZhbChvLm1heFZhbCksIG1lYW5WYWwoby5tZWFuVmFsKSwgbTIoby5tMiksCisgICAgICAgIHNhbXBsZUNvdW50KG8uc2FtcGxlQ291bnQpIHt9CisKKyAgZG91YmxlIGdldE1pbigpIGNvbnN0IHsgcmV0dXJuIG1pblZhbDsgfQorICBkb3VibGUgZ2V0TWVhbigpIGNvbnN0IHsgcmV0dXJuIG1lYW5WYWw7IH0KKyAgZG91YmxlIGdldE1heCgpIGNvbnN0IHsgcmV0dXJuIG1heFZhbDsgfQorICB1aW50NjRfdCBnZXRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIHNhbXBsZUNvdW50OyB9CisgIGRvdWJsZSBnZXRTRCgpIGNvbnN0IHsgcmV0dXJuIHNxcnQobTIgLyBzYW1wbGVDb3VudCk7IH0KKyAgZG91YmxlIGdldFRvdGFsKCkgY29uc3QgeyByZXR1cm4gc2FtcGxlQ291bnQgKiBtZWFuVmFsOyB9CisKKyAgdm9pZCByZXNldCgpIHsKKyAgICBtaW5WYWwgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1heCgpOworICAgIG1heFZhbCA9IC1zdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1heCgpOworICAgIG1lYW5WYWwgPSAwLjA7CisgICAgbTIgPSAwLjA7CisgICAgc2FtcGxlQ291bnQgPSAwOworICB9CisgIHZvaWQgYWRkU2FtcGxlKGRvdWJsZSBzYW1wbGUpOworICB2b2lkIHNjYWxlKGRvdWJsZSBmYWN0b3IpOworICB2b2lkIHNjYWxlRG93bihkb3VibGUgZikgeyBzY2FsZSgxLiAvIGYpOyB9CisgIHN0YXRpc3RpYyAmb3BlcmF0b3IrPShzdGF0aXN0aWMgY29uc3QgJm90aGVyKTsKKworICBzdGQ6OnN0cmluZyBmb3JtYXQoY2hhciB1bml0LCBib29sIHRvdGFsID0gZmFsc2UpIGNvbnN0OworfTsKKworc3RydWN0IHN0YXRJbmZvIHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgdWludDMyX3QgZmxhZ3M7Cit9OworCitjbGFzcyB0aW1lU3RhdCA6IHB1YmxpYyBzdGF0aXN0aWMgeworICBzdGF0aWMgc3RhdEluZm8gdGltZXJJbmZvW107CisKK3B1YmxpYzoKKyAgdGltZVN0YXQoKSA6IHN0YXRpc3RpYygpIHt9CisgIHN0YXRpYyBjb25zdCBjaGFyICpuYW1lKHRpbWVyX2UgZSkgeyByZXR1cm4gdGltZXJJbmZvW2VdLm5hbWU7IH0KKyAgc3RhdGljIGJvb2wgbm9Ub3RhbCh0aW1lcl9lIGUpIHsKKyAgICByZXR1cm4gdGltZXJJbmZvW2VdLmZsYWdzICYgc3RhdHNfZmxhZ3NfZTo6bm9Ub3RhbDsKKyAgfQorICBzdGF0aWMgYm9vbCBtYXN0ZXJPbmx5KHRpbWVyX2UgZSkgeworICAgIHJldHVybiB0aW1lckluZm9bZV0uZmxhZ3MgJiBzdGF0c19mbGFnc19lOjpvbmx5SW5NYXN0ZXI7CisgIH0KKyAgc3RhdGljIGJvb2wgd29ya2VyT25seSh0aW1lcl9lIGUpIHsKKyAgICByZXR1cm4gdGltZXJJbmZvW2VdLmZsYWdzICYgc3RhdHNfZmxhZ3NfZTo6bm90SW5NYXN0ZXI7CisgIH0KKyAgc3RhdGljIGJvb2wgbm9Vbml0cyh0aW1lcl9lIGUpIHsKKyAgICByZXR1cm4gdGltZXJJbmZvW2VdLmZsYWdzICYgc3RhdHNfZmxhZ3NfZTo6bm9Vbml0czsKKyAgfQorICBzdGF0aWMgYm9vbCBsb2dFdmVudCh0aW1lcl9lIGUpIHsKKyAgICByZXR1cm4gdGltZXJJbmZvW2VdLmZsYWdzICYgc3RhdHNfZmxhZ3NfZTo6bG9nRXZlbnQ7CisgIH0KKyAgc3RhdGljIHZvaWQgY2xlYXJFdmVudEZsYWdzKCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVElNRVJfTEFTVDsgaSsrKSB7CisgICAgICB0aW1lckluZm9baV0uZmxhZ3MgJj0gKH4oc3RhdHNfZmxhZ3NfZTo6bG9nRXZlbnQpKTsKKyAgICB9CisgIH0KK307CisKKy8vIFdoZXJlIHdlIG5lZWQgZXhwbGljaXRseSB0byBzdGFydCBhbmQgZW5kIHRoZSB0aW1lciwgdGhpcyB2ZXJzaW9uIGNhbiBiZSB1c2VkCisvLyBTaW5jZSB0aGVzZSB0aW1lcnMgbm9ybWFsbHkgYXJlbid0IG5pY2VseSBzY29wZWQsIHNvIGRvbid0IGhhdmUgYSBnb29kIHBsYWNlCisvLyB0byBsaXZlIG9uIHRoZSBzdGFjayBvZiB0aGUgdGhyZWFkLCB0aGV5J3JlIG1vcmUgd29yayB0byB1c2UuCitjbGFzcyBleHBsaWNpdFRpbWVyIHsKKyAgdGltZVN0YXQgKnN0YXQ7CisgIHRzY190aWNrX2NvdW50IHN0YXJ0VGltZTsKKyAgdHNjX3RpY2tfY291bnQgcGF1c2VTdGFydFRpbWU7CisgIHRzY190aWNrX2NvdW50Ojp0c2NfaW50ZXJ2YWxfdCB0b3RhbFBhdXNlVGltZTsKKworcHVibGljOgorICBleHBsaWNpdFRpbWVyKCkKKyAgICAgIDogc3RhdCgwKSwgc3RhcnRUaW1lKDApLCBwYXVzZVN0YXJ0VGltZSgwKSwgdG90YWxQYXVzZVRpbWUoKSB7fQorICBleHBsaWNpdFRpbWVyKHRpbWVTdGF0ICpzKQorICAgICAgOiBzdGF0KHMpLCBzdGFydFRpbWUoKSwgcGF1c2VTdGFydFRpbWUoMCksIHRvdGFsUGF1c2VUaW1lKCkge30KKworICB2b2lkIHNldFN0YXQodGltZVN0YXQgKnMpIHsgc3RhdCA9IHM7IH0KKyAgdm9pZCBzdGFydCh0aW1lcl9lIHRpbWVyRW51bVZhbHVlKTsKKyAgdm9pZCBwYXVzZSgpIHsgcGF1c2VTdGFydFRpbWUgPSB0c2NfdGlja19jb3VudDo6bm93KCk7IH0KKyAgdm9pZCByZXN1bWUoKSB7IHRvdGFsUGF1c2VUaW1lICs9ICh0c2NfdGlja19jb3VudDo6bm93KCkgLSBwYXVzZVN0YXJ0VGltZSk7IH0KKyAgdm9pZCBzdG9wKHRpbWVyX2UgdGltZXJFbnVtVmFsdWUsIGttcF9zdGF0c19saXN0ICpzdGF0c19wdHIgPSBudWxscHRyKTsKKyAgdm9pZCByZXNldCgpIHsKKyAgICBzdGFydFRpbWUgPSAwOworICAgIHBhdXNlU3RhcnRUaW1lID0gMDsKKyAgICB0b3RhbFBhdXNlVGltZSA9IDA7CisgIH0KK307CisKKy8vIFdoZXJlIGFsbCB5b3UgbmVlZCBpcyB0byB0aW1lIGEgYmxvY2ssIHRoaXMgaXMgZW5vdWdoLgorLy8gKEl0IGF2b2lkcyB0aGUgbmVlZCB0byBoYXZlIGFuIGV4cGxpY2l0IGVuZCwgbGVhdmluZyB0aGUgc2NvcGUgc3VmZmljZXMuKQorY2xhc3MgYmxvY2tUaW1lciA6IHB1YmxpYyBleHBsaWNpdFRpbWVyIHsKKyAgdGltZXJfZSB0aW1lckVudW1WYWx1ZTsKKworcHVibGljOgorICBibG9ja1RpbWVyKHRpbWVTdGF0ICpzLCB0aW1lcl9lIG5ld1RpbWVyRW51bVZhbHVlKQorICAgICAgOiB0aW1lckVudW1WYWx1ZShuZXdUaW1lckVudW1WYWx1ZSksIGV4cGxpY2l0VGltZXIocykgeworICAgIHN0YXJ0KHRpbWVyRW51bVZhbHVlKTsKKyAgfQorICB+YmxvY2tUaW1lcigpIHsgc3RvcCh0aW1lckVudW1WYWx1ZSk7IH0KK307CisKKy8vIFdoZXJlIHlvdSBuZWVkIHRvIHBhcnRpdGlvbiBhIHRocmVhZHMgY2xvY2sgdGlja3MgaW50byBzZXBhcmF0ZSBzdGF0ZXMKKy8vIGUuZy4sIGEgcGFydGl0aW9uZWRUaW1lcnMgY2xhc3Mgd2l0aCB0d28gdGltZXJzIG9mIEVYRUNVVElOR19UQVNLLCBhbmQKKy8vIERPSU5HX05PVEhJTkcgd291bGQgcmVuZGVyIHRoZXNlIGNvbmRpdGlvbnM6CisvLyB0aW1lKEVYRUNVVElOR19UQVNLKSArIHRpbWUoRE9JTkdfTk9USElORykgPSB0b3RhbCB0aW1lIHRocmVhZCBpcyBhbGl2ZQorLy8gTm8gY2xvY2sgdGljayBpbiB0aGUgRVhFQ1VUSU5HX1RBU0sgaXMgYSBtZW1iZXIgb2YgRE9JTkdfTk9USElORyBhbmQgdmljZQorLy8gdmVyc2EKK2NsYXNzIHBhcnRpdGlvbmVkVGltZXJzIHsKK3ByaXZhdGU6CisgIGV4cGxpY2l0VGltZXIgKnRpbWVyc1tFWFBMSUNJVF9USU1FUl9MQVNUICsgMV07CisgIHN0ZDo6dmVjdG9yPHRpbWVyUGFpcj4gdGltZXJfc3RhY2s7CisKK3B1YmxpYzoKKyAgcGFydGl0aW9uZWRUaW1lcnMoKTsKKyAgdm9pZCBhZGRfdGltZXIoZXhwbGljaXRfdGltZXJfZSB0aW1lcl9pbmRleCwgZXhwbGljaXRUaW1lciAqdGltZXJfcG9pbnRlcik7CisgIHZvaWQgaW5pdCh0aW1lclBhaXIgdGltZXJfaW5kZXgpOworICB2b2lkIHB1c2godGltZXJQYWlyIHRpbWVyX2luZGV4KTsKKyAgdm9pZCBwb3AoKTsKKyAgdm9pZCB3aW5kdXAoKTsKK307CisKKy8vIFNwZWNpYWwgd3JhcHBlciBhcm91bmQgdGhlIHBhcnRpb25lZCB0aW1lcnMgdG8gYWlkIHRpbWluZyBjb2RlIGJsb2NrcworLy8gSXQgYXZvaWRzIHRoZSBuZWVkIHRvIGhhdmUgYW4gZXhwbGljaXQgZW5kLCBsZWF2aW5nIHRoZSBzY29wZSBzdWZmaWNlcy4KK2NsYXNzIGJsb2NrUGFydGl0aW9uZWRUaW1lciB7CisgIHBhcnRpdGlvbmVkVGltZXJzICpwYXJ0X3RpbWVyczsKKyAgdGltZXJQYWlyIHRpbWVyX3BhaXI7CisKK3B1YmxpYzoKKyAgYmxvY2tQYXJ0aXRpb25lZFRpbWVyKHBhcnRpdGlvbmVkVGltZXJzICpwdCwgdGltZXJQYWlyIHRwKQorICAgICAgOiBwYXJ0X3RpbWVycyhwdCksIHRpbWVyX3BhaXIodHApIHsKKyAgICBwYXJ0X3RpbWVycy0+cHVzaCh0aW1lcl9wYWlyKTsKKyAgfQorICB+YmxvY2tQYXJ0aXRpb25lZFRpbWVyKCkgeyBwYXJ0X3RpbWVycy0+cG9wKCk7IH0KK307CisKKy8vIFNwZWNpYWwgd3JhcHBlciBhcm91bmQgdGhlIHRocmVhZCBzdGF0ZSB0byBhaWQgaW4ga2VlcGluZyBzdGF0ZSBpbiBjb2RlCisvLyBibG9ja3MgSXQgYXZvaWRzIHRoZSBuZWVkIHRvIGhhdmUgYW4gZXhwbGljaXQgZW5kLCBsZWF2aW5nIHRoZSBzY29wZQorLy8gc3VmZmljZXMuCitjbGFzcyBibG9ja1RocmVhZFN0YXRlIHsKKyAgc3RhdHNfc3RhdGVfZSAqc3RhdGVfcG9pbnRlcjsKKyAgc3RhdHNfc3RhdGVfZSBvbGRfc3RhdGU7CisKK3B1YmxpYzoKKyAgYmxvY2tUaHJlYWRTdGF0ZShzdGF0c19zdGF0ZV9lICp0aHJlYWRfc3RhdGVfcG9pbnRlciwgc3RhdHNfc3RhdGVfZSBuZXdfc3RhdGUpCisgICAgICA6IHN0YXRlX3BvaW50ZXIodGhyZWFkX3N0YXRlX3BvaW50ZXIpLCBvbGRfc3RhdGUoKnRocmVhZF9zdGF0ZV9wb2ludGVyKSB7CisgICAgKnN0YXRlX3BvaW50ZXIgPSBuZXdfc3RhdGU7CisgIH0KKyAgfmJsb2NrVGhyZWFkU3RhdGUoKSB7ICpzdGF0ZV9wb2ludGVyID0gb2xkX3N0YXRlOyB9Cit9OworCisvLyBJZiBhbGwgeW91IHdhbnQgaXMgYSBjb3VudCwgdGhlbiB5b3UgY2FuIHVzZSB0aGlzLi4uCisvLyBUaGUgaW5kaXZpZHVhbCBwZXItdGhyZWFkIGNvdW50cyB3aWxsIGJlIGFnZ3JlZ2F0ZWQgaW50byBhIHN0YXRpc3RpYyBhdAorLy8gcHJvZ3JhbSBleGl0LgorY2xhc3MgY291bnRlciB7CisgIHVpbnQ2NF90IHZhbHVlOworICBzdGF0aWMgY29uc3Qgc3RhdEluZm8gY291bnRlckluZm9bXTsKKworcHVibGljOgorICBjb3VudGVyKCkgOiB2YWx1ZSgwKSB7fQorICB2b2lkIGluY3JlbWVudCgpIHsgdmFsdWUrKzsgfQorICB1aW50NjRfdCBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlOyB9CisgIHZvaWQgcmVzZXQoKSB7IHZhbHVlID0gMDsgfQorICBzdGF0aWMgY29uc3QgY2hhciAqbmFtZShjb3VudGVyX2UgZSkgeyByZXR1cm4gY291bnRlckluZm9bZV0ubmFtZTsgfQorICBzdGF0aWMgYm9vbCBtYXN0ZXJPbmx5KGNvdW50ZXJfZSBlKSB7CisgICAgcmV0dXJuIGNvdW50ZXJJbmZvW2VdLmZsYWdzICYgc3RhdHNfZmxhZ3NfZTo6b25seUluTWFzdGVyOworICB9Cit9OworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgQ2xhc3MgdG8gaW1wbGVtZW50IGFuIGV2ZW50CisKKyAgICBUaGVyZSBhcmUgZm91ciBjb21wb25lbnRzIHRvIGFuIGV2ZW50OiBzdGFydCB0aW1lLCBzdG9wIHRpbWUKKyAgICBuZXN0X2xldmVsLCBhbmQgdGltZXJfbmFtZS4KKyAgICBUaGUgc3RhcnQgYW5kIHN0b3AgdGltZSBzaG91bGQgYmUgb2J2aW91cyAocmVjb3JkZWQgaW4gY2xvY2sgdGlja3MpLgorICAgIFRoZSBuZXN0X2xldmVsIHJlbGF0ZXMgdG8gdGhlIGJhciB3aWR0aCBpbiB0aGUgdGltZWxpbmUgZ3JhcGguCisgICAgVGhlIHRpbWVyX25hbWUgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggdGltZXIgZXZlbnQgdHJpZ2dlcmVkIHRoaXMgZXZlbnQuCisKKyAgICB0aGUgaW50ZXJmYWNlIHRvIHRoaXMgY2xhc3MgaXMgdGhyb3VnaCBmb3VyIHJlYWQtb25seSBvcGVyYXRpb25zOgorICAgIDEpIGdldFN0YXJ0KCkgICAgIC0tIHJldHVybnMgdGhlIHN0YXJ0IHRpbWUgYXMgNjQgYml0IGludGVnZXIKKyAgICAyKSBnZXRTdG9wKCkgICAgICAtLSByZXR1cm5zIHRoZSBzdG9wIHRpbWUgYXMgNjQgYml0IGludGVnZXIKKyAgICAzKSBnZXROZXN0TGV2ZWwoKSAtLSByZXR1cm5zIHRoZSBuZXN0IGxldmVsIG9mIHRoZSBldmVudAorICAgIDQpIGdldFRpbWVyTmFtZSgpIC0tIHJldHVybnMgdGhlIHRpbWVyIG5hbWUgdGhhdCB0cmlnZ2VyZWQgZXZlbnQKKworICAgICpNT1JFIE9OIE5FU1RfTEVWRUwqCisgICAgVGhlIG5lc3QgbGV2ZWwgaXMgdXNlZCBpbiB0aGUgYmFyIGdyYXBoIHRoYXQgcmVwcmVzZW50cyB0aGUgdGltZWxpbmUuCisgICAgSXRzIG1haW4gcHVycG9zZSBpcyBmb3Igc2hvd2luZyBob3cgZXZlbnRzIGFyZSBuZXN0ZWQgaW5zaWRlIGVhY2hvdGhlci4KKyAgICBGb3IgZXhhbXBsZSwgc2F5IGV2ZW50cywgQSwgQiwgYW5kIEMgYXJlIHJlY29yZGVkLiAgSWYgdGhlIHRpbWVsaW5lCisgICAgbG9va3MgbGlrZSB0aGlzOgorCitCZWdpbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiBUaW1lCisgICAgICAgICB8ICAgIHwgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICB8CisgICAgICAgICBBICAgIEIgICAgICAgICAgQyAgICAgICAgQyAgICAgICAgICBCICAgICAgICAgICAgICBBCisgICAgICAgc3RhcnQgc3RhcnQgICAgIHN0YXJ0ICAgICBlbmQgICAgICAgIGVuZCAgICAgICAgICAgIGVuZAorCisgICAgICAgVGhlbiBBLCBCLCBDIHdpbGwgaGF2ZSBhIG5lc3QgbGV2ZWwgb2YgMSwgMiwgMyByZXNwZWN0aXZlbHkuCisgICAgICAgVGhlc2UgdmFsdWVzIGFyZSB0aGVuIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBiYXJ3aWR0aCBzbyB5b3UgY2FuCisgICAgICAgc2VlIHRoYXQgaW5zaWRlIEEsIEIgaGFzIG9jY3VycmVkLCBhbmQgaW5zaWRlIEIsIEMgaGFzIG9jY3VycmVkLgorICAgICAgIEN1cnJlbnRseSwgdGhpcyBpcyBzaG93biB3aXRoIEEncyBiYXIgd2lkdGggYmVpbmcgbGFyZ2VyIHRoYW4gQidzCisgICAgICAgYmFyIHdpZHRoLCBhbmQgQidzIGJhciB3aWR0aCBiZWluZyBsYXJnZXIgdGhhbiBDJ3MgYmFyIHdpZHRoLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitjbGFzcyBrbXBfc3RhdHNfZXZlbnQgeworICB1aW50NjRfdCBzdGFydDsKKyAgdWludDY0X3Qgc3RvcDsKKyAgaW50IG5lc3RfbGV2ZWw7CisgIHRpbWVyX2UgdGltZXJfbmFtZTsKKworcHVibGljOgorICBrbXBfc3RhdHNfZXZlbnQoKQorICAgICAgOiBzdGFydCgwKSwgc3RvcCgwKSwgbmVzdF9sZXZlbCgwKSwgdGltZXJfbmFtZShUSU1FUl9MQVNUKSB7fQorICBrbXBfc3RhdHNfZXZlbnQodWludDY0X3Qgc3RydCwgdWludDY0X3Qgc3RwLCBpbnQgbnN0LCB0aW1lcl9lIG5tZSkKKyAgICAgIDogc3RhcnQoc3RydCksIHN0b3Aoc3RwKSwgbmVzdF9sZXZlbChuc3QpLCB0aW1lcl9uYW1lKG5tZSkge30KKyAgaW5saW5lIHVpbnQ2NF90IGdldFN0YXJ0KCkgY29uc3QgeyByZXR1cm4gc3RhcnQ7IH0KKyAgaW5saW5lIHVpbnQ2NF90IGdldFN0b3AoKSBjb25zdCB7IHJldHVybiBzdG9wOyB9CisgIGlubGluZSBpbnQgZ2V0TmVzdExldmVsKCkgY29uc3QgeyByZXR1cm4gbmVzdF9sZXZlbDsgfQorICBpbmxpbmUgdGltZXJfZSBnZXRUaW1lck5hbWUoKSBjb25zdCB7IHJldHVybiB0aW1lcl9uYW1lOyB9Cit9OworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgQ2xhc3MgdG8gaW1wbGVtZW50IGEgZHluYW1pY2FsbHkgZXhwYW5kYWJsZSBhcnJheSBvZiBldmVudHMKKworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHwgZXZlbnQgMSB8IGV2ZW50IDIgfCBldmVudCAzIHwgZXZlbnQgNCB8IC4uLiB8IGV2ZW50IE4gfAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgQW4gZXZlbnQgaXMgcHVzaGVkIG9udG8gdGhlIGJhY2sgb2YgdGhpcyBhcnJheSBhdCBldmVyeQorICAgIGV4cGxpY2l0VGltZXItPnN0b3AoKSBjYWxsLiAgVGhlIGV2ZW50IHJlY29yZHMgdGhlIHRocmVhZCAjLAorICAgIHN0YXJ0IHRpbWUsIHN0b3AgdGltZSwgYW5kIG5lc3QgbGV2ZWwgcmVsYXRlZCB0byB0aGUgYmFyIHdpZHRoLgorCisgICAgVGhlIGV2ZW50IHZlY3RvciBzdGFydHMgYXQgc2l6ZSBJTklUX1NJWkUgYW5kIGdyb3dzIChkb3VibGVzIGluIHNpemUpCisgICAgaWYgbmVlZGVkLiAgQW4gaW1wbGljYXRpb24gb2YgdGhpcyBiZWhhdmlvciBpcyB0aGF0IGxvZyhOKQorICAgIHJlYWxsb2NhdGlvbnMgYXJlIG5lZWRlZCAod2hlcmUgTiBpcyBudW1iZXIgb2YgZXZlbnRzKS4gIElmIHlvdSB3YW50CisgICAgdG8gYXZvaWQgcmVhbGxvY2F0aW9ucywgdGhlbiBzZXQgSU5JVF9TSVpFIHRvIGEgbGFyZ2UgdmFsdWUuCisKKyAgICB0aGUgaW50ZXJmYWNlIHRvIHRoaXMgY2xhc3MgaXMgdGhyb3VnaCBzaXggb3BlcmF0aW9uczoKKyAgICAxKSByZXNldCgpIC0tIHNldHMgdGhlIGludGVybmFsX3NpemUgYmFjayB0byAwIGJ1dCBkb2VzIG5vdCBkZWFsbG9jYXRlIGFueQorICAgICAgIG1lbW9yeQorICAgIDIpIHNpemUoKSAgLS0gcmV0dXJucyB0aGUgbnVtYmVyIG9mIHZhbGlkIGVsZW1lbnRzIGluIHRoZSB2ZWN0b3IKKyAgICAzKSBwdXNoX2JhY2soc3RhcnQsIHN0b3AsIG5lc3QsIHRpbWVyX25hbWUpIC0tIHB1c2hlcyBhbiBldmVudCBvbnRvCisgICAgICAgdGhlIGJhY2sgb2YgdGhlIGFycmF5CisgICAgNCkgZGVhbGxvY2F0ZSgpIC0tIGZyZWVzIGFsbCBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZWN0b3IKKyAgICA1KSBzb3J0KCkgLS0gc29ydHMgdGhlIHZlY3RvciBieSBzdGFydCB0aW1lCisgICAgNikgb3BlcmF0b3JbaW5kZXhdIG9yIGF0KGluZGV4KSAtLSByZXR1cm5zIGV2ZW50IHJlZmVyZW5jZSBhdCB0aGF0IGluZGV4CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitjbGFzcyBrbXBfc3RhdHNfZXZlbnRfdmVjdG9yIHsKKyAga21wX3N0YXRzX2V2ZW50ICpldmVudHM7CisgIGludCBpbnRlcm5hbF9zaXplOworICBpbnQgYWxsb2NhdGVkX3NpemU7CisgIHN0YXRpYyBjb25zdCBpbnQgSU5JVF9TSVpFID0gMTAyNDsKKworcHVibGljOgorICBrbXBfc3RhdHNfZXZlbnRfdmVjdG9yKCkgeworICAgIGV2ZW50cyA9CisgICAgICAgIChrbXBfc3RhdHNfZXZlbnQgKilfX2ttcF9hbGxvY2F0ZShzaXplb2Yoa21wX3N0YXRzX2V2ZW50KSAqIElOSVRfU0laRSk7CisgICAgaW50ZXJuYWxfc2l6ZSA9IDA7CisgICAgYWxsb2NhdGVkX3NpemUgPSBJTklUX1NJWkU7CisgIH0KKyAgfmttcF9zdGF0c19ldmVudF92ZWN0b3IoKSB7fQorICBpbmxpbmUgdm9pZCByZXNldCgpIHsgaW50ZXJuYWxfc2l6ZSA9IDA7IH0KKyAgaW5saW5lIGludCBzaXplKCkgY29uc3QgeyByZXR1cm4gaW50ZXJuYWxfc2l6ZTsgfQorICB2b2lkIHB1c2hfYmFjayh1aW50NjRfdCBzdGFydF90aW1lLCB1aW50NjRfdCBzdG9wX3RpbWUsIGludCBuZXN0X2xldmVsLAorICAgICAgICAgICAgICAgICB0aW1lcl9lIG5hbWUpIHsKKyAgICBpbnQgaTsKKyAgICBpZiAoaW50ZXJuYWxfc2l6ZSA9PSBhbGxvY2F0ZWRfc2l6ZSkgeworICAgICAga21wX3N0YXRzX2V2ZW50ICp0bXAgPSAoa21wX3N0YXRzX2V2ZW50ICopX19rbXBfYWxsb2NhdGUoCisgICAgICAgICAgc2l6ZW9mKGttcF9zdGF0c19ldmVudCkgKiBhbGxvY2F0ZWRfc2l6ZSAqIDIpOworICAgICAgZm9yIChpID0gMDsgaSA8IGludGVybmFsX3NpemU7IGkrKykKKyAgICAgICAgdG1wW2ldID0gZXZlbnRzW2ldOworICAgICAgX19rbXBfZnJlZShldmVudHMpOworICAgICAgZXZlbnRzID0gdG1wOworICAgICAgYWxsb2NhdGVkX3NpemUgKj0gMjsKKyAgICB9CisgICAgZXZlbnRzW2ludGVybmFsX3NpemVdID0KKyAgICAgICAga21wX3N0YXRzX2V2ZW50KHN0YXJ0X3RpbWUsIHN0b3BfdGltZSwgbmVzdF9sZXZlbCwgbmFtZSk7CisgICAgaW50ZXJuYWxfc2l6ZSsrOworICAgIHJldHVybjsKKyAgfQorICB2b2lkIGRlYWxsb2NhdGUoKTsKKyAgdm9pZCBzb3J0KCk7CisgIGNvbnN0IGttcF9zdGF0c19ldmVudCAmb3BlcmF0b3JbXShpbnQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIGV2ZW50c1tpbmRleF07IH0KKyAga21wX3N0YXRzX2V2ZW50ICZvcGVyYXRvcltdKGludCBpbmRleCkgeyByZXR1cm4gZXZlbnRzW2luZGV4XTsgfQorICBjb25zdCBrbXBfc3RhdHNfZXZlbnQgJmF0KGludCBpbmRleCkgY29uc3QgeyByZXR1cm4gZXZlbnRzW2luZGV4XTsgfQorICBrbXBfc3RhdHNfZXZlbnQgJmF0KGludCBpbmRleCkgeyByZXR1cm4gZXZlbnRzW2luZGV4XTsgfQorfTsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIENsYXNzIHRvIGltcGxlbWVudCBhIGRvdWJseS1saW5rZWQsIGNpcmN1bGFyLCBzdGF0aXN0aWNzIGxpc3QKKworICAgIHwtLS18IC0tLT4gfC0tLXwgLS0tPiB8LS0tfCAtLS0+IHwtLS18IC0tLT4gLi4uIG5leHQKKyAgICB8ICAgfCAgICAgIHwgICB8ICAgICAgfCAgIHwgICAgICB8ICAgfAorICAgIHwtLS18IDwtLS0gfC0tLXwgPC0tLSB8LS0tfCA8LS0tIHwtLS18IDwtLS0gLi4uIHByZXYKKyAgICBTZW50aW5lbCAgIGZpcnN0ICAgICAgc2Vjb25kICAgICB0aGlyZAorICAgIE5vZGUgICAgICAgbm9kZSAgICAgICBub2RlICAgICAgIG5vZGUKKworICAgIFRoZSBTZW50aW5lbCBOb2RlIGlzIHRoZSB1c2VyIGhhbmRsZSBvbiB0aGUgbGlzdC4KKyAgICBUaGUgZmlyc3Qgbm9kZSBjb3JyZXNwb25kcyB0byB0aHJlYWQgMCdzIHN0YXRpc3RpY3MuCisgICAgVGhlIHNlY29uZCBub2RlIGNvcnJlc3BvbmRzIHRvIHRocmVhZCAxJ3Mgc3RhdGlzdGljcyBhbmQgc28gb24uLi4KKworICAgIEVhY2ggbm9kZSBoYXMgYSBfdGltZXJzLCBfY291bnRlcnMsIGFuZCBfZXhwbGljaXRUaW1lcnMgYXJyYXkgdG8gaG9sZCB0aGF0CisgICAgdGhyZWFkJ3Mgc3RhdGlzdGljcy4gVGhlIF9leHBsaWNpdFRpbWVycyBwb2ludCB0byB0aGUgY29ycmVjdCBfdGltZXIgYW5kCisgICAgdXBkYXRlIGl0cyBzdGF0aXN0aWNzIGF0IGV2ZXJ5IHN0b3AoKSBjYWxsLiBUaGUgZXhwbGljaXRUaW1lcnMnIHBvaW50ZXJzIGFyZQorICAgIHNldCB1cCBpbiB0aGUgY29uc3RydWN0b3IuIEVhY2ggbm9kZSBhbHNvIGhhcyBhbiBldmVudCB2ZWN0b3IgdG8gaG9sZCB0aGF0CisgICAgdGhyZWFkJ3MgdGltaW5nIGV2ZW50cy4gVGhlIGV2ZW50IHZlY3RvciBleHBhbmRzIGFzIG5lY2Vzc2FyeSBhbmQgcmVjb3JkcworICAgIHRoZSBzdGFydC1zdG9wIHRpbWVzIGZvciBlYWNoIHRpbWVyLgorCisgICAgVGhlIG5lc3RMZXZlbCB2YXJpYWJsZSBpcyBmb3IgcGxvdHRpbmcgZXZlbnRzIGFuZCBpcyByZWxhdGVkCisgICAgdG8gdGhlIGJhciB3aWR0aCBpbiB0aGUgdGltZWxpbmUgZ3JhcGguCisKKyAgICBFdmVyeSB0aHJlYWQgd2lsbCBoYXZlIGEgX190aHJlYWQgbG9jYWwgcG9pbnRlciB0byBpdHMgbm9kZSBpbgorICAgIHRoZSBsaXN0LiAgVGhlIHNlbnRpbmVsIG5vZGUgaXMgdXNlZCBieSB0aGUgbWFzdGVyIHRocmVhZCB0bworICAgIHN0b3JlICJkdW1teSIgc3RhdGlzdGljcyBiZWZvcmUgX19rbXBfY3JlYXRlX3dvcmtlcigpIGlzIGNhbGxlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK2NsYXNzIGttcF9zdGF0c19saXN0IHsKKyAgaW50IGd0aWQ7CisgIHRpbWVTdGF0IF90aW1lcnNbVElNRVJfTEFTVCArIDFdOworICBjb3VudGVyIF9jb3VudGVyc1tDT1VOVEVSX0xBU1QgKyAxXTsKKyAgZXhwbGljaXRUaW1lciBfZXhwbGljaXRUaW1lcnNbRVhQTElDSVRfVElNRVJfTEFTVCArIDFdOworICBwYXJ0aXRpb25lZFRpbWVycyBfcGFydGl0aW9uZWRUaW1lcnM7CisgIGludCBfbmVzdExldmVsOyAvLyBvbmUgcGVyIHRocmVhZAorICBrbXBfc3RhdHNfZXZlbnRfdmVjdG9yIF9ldmVudF92ZWN0b3I7CisgIGttcF9zdGF0c19saXN0ICpuZXh0OworICBrbXBfc3RhdHNfbGlzdCAqcHJldjsKKyAgc3RhdHNfc3RhdGVfZSBzdGF0ZTsKKyAgaW50IHRocmVhZF9pc19pZGxlX2ZsYWc7CisKK3B1YmxpYzoKKyAga21wX3N0YXRzX2xpc3QoKQorICAgICAgOiBfbmVzdExldmVsKDApLCBfZXZlbnRfdmVjdG9yKCksIG5leHQodGhpcyksIHByZXYodGhpcyksIHN0YXRlKElETEUpLAorICAgICAgICB0aHJlYWRfaXNfaWRsZV9mbGFnKDApIHsKKyNkZWZpbmUgZG9Jbml0KG5hbWUsIGlnbm9yZTEsIGlnbm9yZTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdldEV4cGxpY2l0VGltZXIoRVhQTElDSVRfVElNRVJfIyNuYW1lKS0+c2V0U3RhdChnZXRUaW1lcihUSU1FUl8jI25hbWUpKTsgICAgXAorICBfcGFydGl0aW9uZWRUaW1lcnMuYWRkX3RpbWVyKEVYUExJQ0lUX1RJTUVSXyMjbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFeHBsaWNpdFRpbWVyKEVYUExJQ0lUX1RJTUVSXyMjbmFtZSkpOworICAgIEtNUF9GT1JFQUNIX0VYUExJQ0lUX1RJTUVSKGRvSW5pdCwgMCk7CisjdW5kZWYgZG9Jbml0CisgIH0KKyAgfmttcF9zdGF0c19saXN0KCkge30KKyAgaW5saW5lIHRpbWVTdGF0ICpnZXRUaW1lcih0aW1lcl9lIGlkeCkgeyByZXR1cm4gJl90aW1lcnNbaWR4XTsgfQorICBpbmxpbmUgY291bnRlciAqZ2V0Q291bnRlcihjb3VudGVyX2UgaWR4KSB7IHJldHVybiAmX2NvdW50ZXJzW2lkeF07IH0KKyAgaW5saW5lIGV4cGxpY2l0VGltZXIgKmdldEV4cGxpY2l0VGltZXIoZXhwbGljaXRfdGltZXJfZSBpZHgpIHsKKyAgICByZXR1cm4gJl9leHBsaWNpdFRpbWVyc1tpZHhdOworICB9CisgIGlubGluZSBwYXJ0aXRpb25lZFRpbWVycyAqZ2V0UGFydGl0aW9uZWRUaW1lcnMoKSB7CisgICAgcmV0dXJuICZfcGFydGl0aW9uZWRUaW1lcnM7CisgIH0KKyAgaW5saW5lIHRpbWVTdGF0ICpnZXRUaW1lcnMoKSB7IHJldHVybiBfdGltZXJzOyB9CisgIGlubGluZSBjb3VudGVyICpnZXRDb3VudGVycygpIHsgcmV0dXJuIF9jb3VudGVyczsgfQorICBpbmxpbmUgZXhwbGljaXRUaW1lciAqZ2V0RXhwbGljaXRUaW1lcnMoKSB7IHJldHVybiBfZXhwbGljaXRUaW1lcnM7IH0KKyAgaW5saW5lIGttcF9zdGF0c19ldmVudF92ZWN0b3IgJmdldEV2ZW50VmVjdG9yKCkgeyByZXR1cm4gX2V2ZW50X3ZlY3RvcjsgfQorICBpbmxpbmUgdm9pZCByZXNldEV2ZW50VmVjdG9yKCkgeyBfZXZlbnRfdmVjdG9yLnJlc2V0KCk7IH0KKyAgaW5saW5lIHZvaWQgaW5jcmVtZW50TmVzdFZhbHVlKCkgeyBfbmVzdExldmVsKys7IH0KKyAgaW5saW5lIGludCBnZXROZXN0VmFsdWUoKSB7IHJldHVybiBfbmVzdExldmVsOyB9CisgIGlubGluZSB2b2lkIGRlY3JlbWVudE5lc3RWYWx1ZSgpIHsgX25lc3RMZXZlbC0tOyB9CisgIGlubGluZSBpbnQgZ2V0R3RpZCgpIGNvbnN0IHsgcmV0dXJuIGd0aWQ7IH0KKyAgaW5saW5lIHZvaWQgc2V0R3RpZChpbnQgbmV3Z3RpZCkgeyBndGlkID0gbmV3Z3RpZDsgfQorICBpbmxpbmUgdm9pZCBzZXRTdGF0ZShzdGF0c19zdGF0ZV9lIG5ld3N0YXRlKSB7IHN0YXRlID0gbmV3c3RhdGU7IH0KKyAgaW5saW5lIHN0YXRzX3N0YXRlX2UgZ2V0U3RhdGUoKSBjb25zdCB7IHJldHVybiBzdGF0ZTsgfQorICBpbmxpbmUgc3RhdHNfc3RhdGVfZSAqZ2V0U3RhdGVQb2ludGVyKCkgeyByZXR1cm4gJnN0YXRlOyB9CisgIGlubGluZSBib29sIGlzSWRsZSgpIHsgcmV0dXJuIHRocmVhZF9pc19pZGxlX2ZsYWcgPT0gMTsgfQorICBpbmxpbmUgdm9pZCBzZXRJZGxlRmxhZygpIHsgdGhyZWFkX2lzX2lkbGVfZmxhZyA9IDE7IH0KKyAgaW5saW5lIHZvaWQgcmVzZXRJZGxlRmxhZygpIHsgdGhyZWFkX2lzX2lkbGVfZmxhZyA9IDA7IH0KKyAga21wX3N0YXRzX2xpc3QgKnB1c2hfYmFjayhpbnQgZ3RpZCk7IC8vIHJldHVybnMgbmV3bHkgY3JlYXRlZCBsaXN0IG5vZGUKKyAgaW5saW5lIHZvaWQgcHVzaF9ldmVudCh1aW50NjRfdCBzdGFydF90aW1lLCB1aW50NjRfdCBzdG9wX3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5lc3RfbGV2ZWwsIHRpbWVyX2UgbmFtZSkgeworICAgIF9ldmVudF92ZWN0b3IucHVzaF9iYWNrKHN0YXJ0X3RpbWUsIHN0b3BfdGltZSwgbmVzdF9sZXZlbCwgbmFtZSk7CisgIH0KKyAgdm9pZCBkZWFsbG9jYXRlKCk7CisgIGNsYXNzIGl0ZXJhdG9yOworICBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3IgYmVnaW4oKTsKKyAga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGVuZCgpOworICBpbnQgc2l6ZSgpOworICBjbGFzcyBpdGVyYXRvciB7CisgICAga21wX3N0YXRzX2xpc3QgKnB0cjsKKyAgICBmcmllbmQga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGttcF9zdGF0c19saXN0OjpiZWdpbigpOworICAgIGZyaWVuZCBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3Iga21wX3N0YXRzX2xpc3Q6OmVuZCgpOworCisgIHB1YmxpYzoKKyAgICBpdGVyYXRvcigpOworICAgIH5pdGVyYXRvcigpOworICAgIGl0ZXJhdG9yIG9wZXJhdG9yKysoKTsKKyAgICBpdGVyYXRvciBvcGVyYXRvcisrKGludCBkdW1teSk7CisgICAgaXRlcmF0b3Igb3BlcmF0b3ItLSgpOworICAgIGl0ZXJhdG9yIG9wZXJhdG9yLS0oaW50IGR1bW15KTsKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3IgJnJocyk7CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yICZyaHMpOworICAgIGttcF9zdGF0c19saXN0ICpvcGVyYXRvciooKSBjb25zdDsgLy8gZGVyZWZlcmVuY2Ugb3BlcmF0b3IKKyAgfTsKK307CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIENsYXNzIHRvIGVuY2Fwc3VsYXRlIGFsbCBvdXRwdXQgZnVuY3Rpb25zIGFuZCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzCisKKyAgIFRoaXMgbW9kdWxlIGhvbGRzIGZpbGVuYW1lcyBmb3IgdmFyaW91cyBvdXRwdXRzIChub3JtYWwgc3RhdHMsIGV2ZW50cywgcGxvdAorICAgZmlsZSksIGFzIHdlbGwgYXMgY29sb3JpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBwbG90IGZpbGUuCisKKyAgIFRoZSBmaWxlbmFtZXMgYW5kIGZsYWdzIHZhcmlhYmxlcyBhcmUgcmVhZCBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKyAgIFRoZXNlIGFyZSByZWFkIG9uY2UgYnkgdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBnbG9iYWwgdmFyaWFibGUKKyAgIF9fa21wX3N0YXRzX291dHB1dCB3aGljaCBjYWxscyBpbml0KCkuCisKKyAgIER1cmluZyB0aGlzIGluaXQoKSBjYWxsLCBldmVudCBmbGFncyBmb3IgdGhlIHRpbWVTdGF0Ojp0aW1lckluZm9bXSBnbG9iYWwKKyAgIGFycmF5IGFyZSBjbGVhcmVkIGlmIEtNUF9TVEFUU19FVkVOVFMgaXMgbm90IHRydWUgKG9uLCAxLCB5ZXMpLgorCisgICBUaGUgb25seSBpbnRlcmZhY2UgZnVuY3Rpb24gdGhhdCBpcyBwdWJsaWMgaXMgb3V0cHV0U3RhdHMoaGVhZGluZykuICBUaGlzCisgICBmdW5jdGlvbiBzaG91bGQgcHJpbnQgb3V0IGV2ZXJ5dGhpbmcgaXQgbmVlZHMgdG8sIGVpdGhlciB0byBmaWxlcyBvciBzdGRlcnIsCisgICBkZXBlbmRpbmcgb24gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBkZXNjcmliZWQgYmVsb3cKKworICAgRU5WSVJPTk1FTlQgVkFSSUFCTEVTOgorICAgS01QX1NUQVRTX0ZJTEUgLS0gaWYgc2V0LCBhbGwgc3RhdGlzdGljcyAobm90IGV2ZW50cykgd2lsbCBiZSBwcmludGVkIHRvIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgIGZpbGUsIG90aGVyd2lzZSwgcHJpbnQgdG8gc3RkZXJyCisgICBLTVBfU1RBVFNfVEhSRUFEUyAtLSBpZiBzZXQgdG8gIm9uIiwgdGhlbiB3aWxsIHByaW50IHBlciB0aHJlYWQgc3RhdGlzdGljcyB0bworICAgICAgICAgICAgICAgICAgICAgICAgZWl0aGVyIEtNUF9TVEFUU19GSUxFIG9yIHN0ZGVycgorICAgS01QX1NUQVRTX1BMT1RfRklMRSAtLSBpZiBzZXQsIHByaW50IHRoZSBwbG90aWN1cyBwbG90IGZpbGUgdG8gdGhpcyBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlLCB0aGUgcGxvdCBmaWxlIGlzIHNlbnQgdG8gImV2ZW50cy5wbHQiCisgICBLTVBfU1RBVFNfRVZFTlRTIC0tIGlmIHNldCB0byAib24iLCB0aGVuIGxvZyBldmVudHMsIG90aGVyd2lzZSwgZG9uJ3QgbG9nCisgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cworICAgS01QX1NUQVRTX0VWRU5UU19GSUxFIC0tIGlmIHNldCwgYWxsIGV2ZW50cyBhcmUgb3V0cHV0dGVkIHRvIHRoaXMgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UsIG91dHB1dCBpcyBzZW50IHRvICJldmVudHMuZGF0IgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworY2xhc3Mga21wX3N0YXRzX291dHB1dF9tb2R1bGUgeworCitwdWJsaWM6CisgIHN0cnVjdCByZ2JfY29sb3IgeworICAgIGZsb2F0IHI7CisgICAgZmxvYXQgZzsKKyAgICBmbG9hdCBiOworICB9OworCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBvdXRwdXRGaWxlTmFtZTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmV2ZW50c0ZpbGVOYW1lOworICBzdGF0aWMgY29uc3QgY2hhciAqcGxvdEZpbGVOYW1lOworICBzdGF0aWMgaW50IHByaW50UGVyVGhyZWFkRmxhZzsKKyAgc3RhdGljIGludCBwcmludFBlclRocmVhZEV2ZW50c0ZsYWc7CisgIHN0YXRpYyBjb25zdCByZ2JfY29sb3IgZ2xvYmFsQ29sb3JBcnJheVtdOworICBzdGF0aWMgcmdiX2NvbG9yIHRpbWVyQ29sb3JJbmZvW107CisKKyAgdm9pZCBpbml0KCk7CisgIHN0YXRpYyB2b2lkIHNldHVwRXZlbnRDb2xvcnMoKTsKKyAgc3RhdGljIHZvaWQgcHJpbnRQbG90aWN1c0ZpbGUoKTsKKyAgc3RhdGljIHZvaWQgcHJpbnRIZWFkZXJJbmZvKEZJTEUgKnN0YXRzT3V0KTsKKyAgc3RhdGljIHZvaWQgcHJpbnRUaW1lclN0YXRzKEZJTEUgKnN0YXRzT3V0LCBzdGF0aXN0aWMgY29uc3QgKnRoZVN0YXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGlzdGljIGNvbnN0ICp0b3RhbFN0YXRzKTsKKyAgc3RhdGljIHZvaWQgcHJpbnRDb3VudGVyU3RhdHMoRklMRSAqc3RhdHNPdXQsIHN0YXRpc3RpYyBjb25zdCAqdGhlU3RhdHMpOworICBzdGF0aWMgdm9pZCBwcmludENvdW50ZXJzKEZJTEUgKnN0YXRzT3V0LCBjb3VudGVyIGNvbnN0ICp0aGVDb3VudGVycyk7CisgIHN0YXRpYyB2b2lkIHByaW50RXZlbnRzKEZJTEUgKmV2ZW50c091dCwga21wX3N0YXRzX2V2ZW50X3ZlY3RvciAqdGhlRXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3RpZCk7CisgIHN0YXRpYyByZ2JfY29sb3IgZ2V0RXZlbnRDb2xvcih0aW1lcl9lIGUpIHsgcmV0dXJuIHRpbWVyQ29sb3JJbmZvW2VdOyB9CisgIHN0YXRpYyB2b2lkIHdpbmR1cEV4cGxpY2l0VGltZXJzKCk7CisgIGJvb2wgZXZlbnRQcmludGluZ0VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBwcmludFBlclRocmVhZEV2ZW50c0ZsYWc7IH0KKworcHVibGljOgorICBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZSgpIHsgaW5pdCgpOyB9CisgIHZvaWQgb3V0cHV0U3RhdHMoY29uc3QgY2hhciAqaGVhZGluZyk7Cit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCit2b2lkIF9fa21wX3N0YXRzX2luaXQoKTsKK3ZvaWQgX19rbXBfc3RhdHNfZmluaSgpOwordm9pZCBfX2ttcF9yZXNldF9zdGF0cygpOwordm9pZCBfX2ttcF9vdXRwdXRfc3RhdHMoY29uc3QgY2hhciAqKTsKK3ZvaWQgX19rbXBfYWNjdW11bGF0ZV9zdGF0c19hdF9leGl0KHZvaWQpOworLy8gdGhyZWFkIGxvY2FsIHBvaW50ZXIgdG8gc3RhdHMgbm9kZSB3aXRoaW4gbGlzdAorZXh0ZXJuIF9fdGhyZWFkIGttcF9zdGF0c19saXN0ICpfX2ttcF9zdGF0c190aHJlYWRfcHRyOworLy8gaGVhZCB0byBzdGF0cyBsaXN0LgorZXh0ZXJuIGttcF9zdGF0c19saXN0ICpfX2ttcF9zdGF0c19saXN0OworLy8gbG9jayBmb3IgX19rbXBfc3RhdHNfbGlzdAorZXh0ZXJuIGttcF90YXNfbG9ja190IF9fa21wX3N0YXRzX2xvY2s7CisvLyByZWZlcmVuY2Ugc3RhcnQgdGltZQorZXh0ZXJuIHRzY190aWNrX2NvdW50IF9fa21wX3N0YXRzX3N0YXJ0X3RpbWU7CisvLyBpbnRlcmZhY2UgdG8gb3V0cHV0CitleHRlcm4ga21wX3N0YXRzX291dHB1dF9tb2R1bGUgX19rbXBfc3RhdHNfb3V0cHV0OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisvLyBTaW1wbGUsIHN0YW5kYXJkIGludGVyZmFjZXMgdGhhdCBkcm9wIG91dCBjb21wbGV0ZWx5IGlmIHN0YXRzIGFyZW4ndCBlbmFibGVkCisKKy8qIQorICogXGJyaWVmIFVzZXMgc3BlY2lmaWVkIHRpbWVyIChuYW1lKSB0byB0aW1lIGNvZGUgYmxvY2suCisgKgorICogQHBhcmFtIG5hbWUgdGltZXIgbmFtZSBhcyBzcGVjaWZpZWQgdW5kZXIgdGhlIEtNUF9GT1JFQUNIX1RJTUVSKCkgbWFjcm8KKyAqCisgKiBcZGV0YWlscyBVc2UgS01QX1RJTUVfQkxPQ0sobmFtZSkgbWFjcm8gdG8gdGltZSBhIGNvZGUgYmxvY2suICBUaGlzIHdpbGwKKyAqIHJlY29yZCB0aGUgdGltZSB0YWtlbiBpbiB0aGUgYmxvY2sgYW5kIHVzZSB0aGUgZGVzdHJ1Y3RvciB0byBzdG9wIHRoZSB0aW1lci4KKyAqIENvbnZlbmllbnQhIFdpdGggdGhpcyBkZWZpbml0aW9uIHlvdSBjYW4ndCBoYXZlIG1vcmUgdGhhbiBvbmUgS01QX1RJTUVfQkxPQ0sKKyAqIGluIHRoZSBzYW1lIGNvZGUgYmxvY2suIEkgZG9uJ3QgdGhpbmsgdGhhdCdzIGEgcHJvYmxlbS4KKyAqCisgKiBAaW5ncm91cCBTVEFUU19HQVRIRVJJTkcKKyovCisjZGVmaW5lIEtNUF9USU1FX0JMT0NLKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBibG9ja1RpbWVyIF9fQkxPQ0tUSU1FX18oX19rbXBfc3RhdHNfdGhyZWFkX3B0ci0+Z2V0VGltZXIoVElNRVJfIyNuYW1lKSwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVSXyMjbmFtZSkKKworLyohCisgKiBcYnJpZWYgQWRkcyB2YWx1ZSB0byBzcGVjaWZpZWQgdGltZXIgKG5hbWUpLgorICoKKyAqIEBwYXJhbSBuYW1lIHRpbWVyIG5hbWUgYXMgc3BlY2lmaWVkIHVuZGVyIHRoZSBLTVBfRk9SRUFDSF9USU1FUigpIG1hY3JvCisgKiBAcGFyYW0gdmFsdWUgZG91YmxlIHByZWNpc2lvbiBzYW1wbGUgdmFsdWUgdG8gYWRkIHRvIHN0YXRpc3RpY3MgZm9yIHRoZSB0aW1lcgorICoKKyAqIFxkZXRhaWxzIFVzZSBLTVBfQ09VTlRfVkFMVUUobmFtZSwgdmFsdWUpIG1hY3JvIHRvIGFkZCBhIHBhcnRpY3VsYXIgdmFsdWUgdG8KKyAqIGEgdGltZXIgc3RhdGlzdGljcy4KKyAqCisgKiBAaW5ncm91cCBTVEFUU19HQVRIRVJJTkcKKyovCisjZGVmaW5lIEtNUF9DT1VOVF9WQUxVRShuYW1lLCB2YWx1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF9zdGF0c190aHJlYWRfcHRyLT5nZXRUaW1lcihUSU1FUl8jI25hbWUpLT5hZGRTYW1wbGUodmFsdWUpCisKKy8qIQorICogXGJyaWVmIEluY3JlbWVudHMgc3BlY2lmaWVkIGNvdW50ZXIgKG5hbWUpLgorICoKKyAqIEBwYXJhbSBuYW1lIGNvdW50ZXIgbmFtZSBhcyBzcGVjaWZpZWQgdW5kZXIgdGhlIEtNUF9GT1JFQUNIX0NPVU5URVIoKSBtYWNybworICoKKyAqIFxkZXRhaWxzIFVzZSBLTVBfQ09VTlRfQkxPQ0sobmFtZSwgdmFsdWUpIG1hY3JvIHRvIGluY3JlbWVudCBhIHN0YXRpc3RpY3MKKyAqIGNvdW50ZXIgZm9yIHRoZSBleGVjdXRpbmcgdGhyZWFkLgorICoKKyAqIEBpbmdyb3VwIFNUQVRTX0dBVEhFUklORworKi8KKyNkZWZpbmUgS01QX0NPVU5UX0JMT0NLKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX3N0YXRzX3RocmVhZF9wdHItPmdldENvdW50ZXIoQ09VTlRFUl8jI25hbWUpLT5pbmNyZW1lbnQoKQorCisvKiEKKyAqIFxicmllZiAiU3RhcnRzIiBhbiBleHBsaWNpdCB0aW1lciB3aGljaCB3aWxsIG5lZWQgYSBjb3JyZXNwb25kaW5nCisgKiBLTVBfU1RPUF9FWFBMSUNJVF9USU1FUigpIG1hY3JvLgorICoKKyAqIEBwYXJhbSBuYW1lIGV4cGxpY2l0IHRpbWVyIG5hbWUgYXMgc3BlY2lmaWVkIHVuZGVyIHRoZQorICogS01QX0ZPUkVBQ0hfRVhQTElDSVRfVElNRVIoKSBtYWNybworICoKKyAqIFxkZXRhaWxzIFVzZSB0byBzdGFydCBhIHRpbWVyLiAgVGhpcyB3aWxsIG5lZWQgYSBjb3JyZXNwb25kaW5nCisgKiBLTVBfU1RPUF9FWFBMSUNJVF9USU1FUigpIG1hY3JvIHRvIHN0b3AgdGhlIHRpbWVyIHVubGlrZSB0aGUKKyAqIEtNUF9USU1FX0JMT0NLKG5hbWUpIG1hY3JvIHdoaWNoIGhhcyBhbiBpbXBsaWNpdCBzdG9wcGluZyBtYWNybyBhdCB0aGUgZW5kCisgKiBvZiB0aGUgY29kZSBibG9jay4gIEFsbCBleHBsaWNpdCB0aW1lcnMgYXJlIHN0b3BwZWQgYXQgbGlicmFyeSBleGl0IHRpbWUKKyAqIGJlZm9yZSB0aGUgZmluYWwgc3RhdGlzdGljcyBhcmUgb3V0cHV0dGVkLgorICoKKyAqIEBpbmdyb3VwIFNUQVRTX0dBVEhFUklORworKi8KKyNkZWZpbmUgS01QX1NUQVJUX0VYUExJQ0lUX1RJTUVSKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX3N0YXRzX3RocmVhZF9wdHItPmdldEV4cGxpY2l0VGltZXIoRVhQTElDSVRfVElNRVJfIyNuYW1lKSAgICAgICAgICAgICAgXAorICAgICAgLT5zdGFydChUSU1FUl8jI25hbWUpCisKKy8qIQorICogXGJyaWVmICJTdG9wcyIgYW4gZXhwbGljaXQgdGltZXIuCisgKgorICogQHBhcmFtIG5hbWUgZXhwbGljaXQgdGltZXIgbmFtZSBhcyBzcGVjaWZpZWQgdW5kZXIgdGhlCisgKiBLTVBfRk9SRUFDSF9FWFBMSUNJVF9USU1FUigpIG1hY3JvCisgKgorICogXGRldGFpbHMgVXNlIEtNUF9TVE9QX0VYUExJQ0lUX1RJTUVSKG5hbWUpIHRvIHN0b3AgYSB0aW1lci4gIFdoZW4gdGhpcyBpcworICogZG9uZSwgdGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBLTVBfU1RBUlRfRVhQTElDSVRfVElNRVIobmFtZSkgYW5kIHRoaXMKKyAqIEtNUF9TVE9QX0VYUExJQ0lUX1RJTUVSKG5hbWUpIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHRpbWVyJ3Mgc3RhdCB2YWx1ZS4gVGhlCisgKiB0aW1lciB3aWxsIHRoZW4gYmUgcmVzZXQuIEFmdGVyIHRoZSBLTVBfU1RPUF9FWFBMSUNJVF9USU1FUihuYW1lKSBtYWNybyBpcworICogY2FsbGVkLCBhbm90aGVyIGNhbGwgdG8gS01QX1NUQVJUX0VYUExJQ0lUX1RJTUVSKG5hbWUpIHdpbGwgc3RhcnQgdGhlIHRpbWVyCisgKiBvbmNlIGFnYWluLgorICoKKyAqIEBpbmdyb3VwIFNUQVRTX0dBVEhFUklORworKi8KKyNkZWZpbmUgS01QX1NUT1BfRVhQTElDSVRfVElNRVIobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX3N0YXRzX3RocmVhZF9wdHItPmdldEV4cGxpY2l0VGltZXIoRVhQTElDSVRfVElNRVJfIyNuYW1lKSAgICAgICAgICAgICAgXAorICAgICAgLT5zdG9wKFRJTUVSXyMjbmFtZSkKKworLyohCisgKiBcYnJpZWYgT3V0cHV0cyB0aGUgY3VycmVudCB0aHJlYWQgc3RhdGlzdGljcyBhbmQgcmVzZXQgdGhlbS4KKyAqCisgKiBAcGFyYW0gaGVhZGluZ19zdHJpbmcgaGVhZGluZyBwdXQgYWJvdmUgdGhlIGZpbmFsIHN0YXRzIG91dHB1dAorICoKKyAqIFxkZXRhaWxzIEV4cGxpY2l0bHkgc3RvcHMgYWxsIHRpbWVycyBhbmQgb3V0cHV0cyBhbGwgc3RhdHMuIEVudmlyb25tZW50CisgKiB2YXJpYWJsZSwgYE9NUFRCX1NUQVRTRklMRT1maWxlbmFtZWAsIGNhbiBiZSB1c2VkIHRvIG91dHB1dCB0aGUgc3RhdHMgdG8gYQorICogZmlsZW5hbWUgaW5zdGVhZCBvZiBzdGRlcnIuIEVudmlyb25tZW50IHZhcmlhYmxlLAorICogYE9NUFRCX1NUQVRTVEhSRUFEUz10cnVlfHVuZGVmaW5lZGAsIGNhbiBiZSB1c2VkIHRvIG91dHB1dCB0aHJlYWQgc3BlY2lmaWMKKyAqIHN0YXRzLiBGb3Igbm93IHRoZSBgT01QVEJfU1RBVFNUSFJFQURTYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYW4gZWl0aGVyIGJlCisgKiBkZWZpbmVkIHdpdGggYW55IHZhbHVlLCB3aGljaCB3aWxsIHByaW50IG91dCB0aHJlYWQgc3BlY2lmaWMgc3RhdHMsIG9yIGl0IGNhbgorICogYmUgdW5kZWZpbmVkIChub3Qgc3BlY2lmaWVkIGluIHRoZSBlbnZpcm9ubWVudCkgYW5kIHRocmVhZCBzcGVjaWZpYyBzdGF0cworICogd29uJ3QgYmUgcHJpbnRlZC4gSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgYWxsIHN0YXRpc3RpY3MgYXJlIHJlc2V0IHdoZW4gdGhpcworICogbWFjcm8gaXMgY2FsbGVkLgorICoKKyAqIEBpbmdyb3VwIFNUQVRTX0dBVEhFUklORworKi8KKyNkZWZpbmUgS01QX09VVFBVVF9TVEFUUyhoZWFkaW5nX3N0cmluZykgX19rbXBfb3V0cHV0X3N0YXRzKGhlYWRpbmdfc3RyaW5nKQorCisvKiEKKyAqIFxicmllZiBJbml0aWFsaXplcyB0aGUgcGFyaXRpb25lZCB0aW1lcnMgdG8gYmVnaW4gd2l0aCBuYW1lLgorICoKKyAqIEBwYXJhbSBuYW1lIHRpbWVyIHdoaWNoIHlvdSB3YW50IHRoaXMgdGhyZWFkIHRvIGJlZ2luIHdpdGgKKyAqCisgKiBAaW5ncm91cCBTVEFUU19HQVRIRVJJTkcKKyovCisjZGVmaW5lIEtNUF9JTklUX1BBUlRJVElPTkVEX1RJTUVSUyhuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2ttcF9zdGF0c190aHJlYWRfcHRyLT5nZXRQYXJ0aXRpb25lZFRpbWVycygpLT5pbml0KCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRpbWVyUGFpcihFWFBMSUNJVF9USU1FUl8jI25hbWUsIFRJTUVSXyMjbmFtZSkpCisKKyNkZWZpbmUgS01QX1RJTUVfUEFSVElUSU9ORURfQkxPQ0sobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGJsb2NrUGFydGl0aW9uZWRUaW1lciBfX1BCTE9DS1RJTUVfXyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX19rbXBfc3RhdHNfdGhyZWFkX3B0ci0+Z2V0UGFydGl0aW9uZWRUaW1lcnMoKSwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRpbWVyUGFpcihFWFBMSUNJVF9USU1FUl8jI25hbWUsIFRJTUVSXyMjbmFtZSkpCisKKyNkZWZpbmUgS01QX1BVU0hfUEFSVElUSU9ORURfVElNRVIobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fa21wX3N0YXRzX3RocmVhZF9wdHItPmdldFBhcnRpdGlvbmVkVGltZXJzKCktPnB1c2goICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdGltZXJQYWlyKEVYUExJQ0lUX1RJTUVSXyMjbmFtZSwgVElNRVJfIyNuYW1lKSkKKworI2RlZmluZSBLTVBfUE9QX1BBUlRJVElPTkVEX1RJTUVSKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfc3RhdHNfdGhyZWFkX3B0ci0+Z2V0UGFydGl0aW9uZWRUaW1lcnMoKS0+cG9wKCkKKworI2RlZmluZSBLTVBfU0VUX1RIUkVBRF9TVEFURShzdGF0ZV9uYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19rbXBfc3RhdHNfdGhyZWFkX3B0ci0+c2V0U3RhdGUoc3RhdGVfbmFtZSkKKworI2RlZmluZSBLTVBfR0VUX1RIUkVBRF9TVEFURSgpIF9fa21wX3N0YXRzX3RocmVhZF9wdHItPmdldFN0YXRlKCkKKworI2RlZmluZSBLTVBfU0VUX1RIUkVBRF9TVEFURV9CTE9DSyhzdGF0ZV9uYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYmxvY2tUaHJlYWRTdGF0ZSBfX0JUSFJFQURTVEFURV9fKF9fa21wX3N0YXRzX3RocmVhZF9wdHItPmdldFN0YXRlUG9pbnRlcigpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV9uYW1lKQorCisvKiEKKyAqIFxicmllZiByZXNldHMgYWxsIHN0YXRzIChjb3VudGVycyB0byAwLCB0aW1lcnMgdG8gMCBlbGFwc2VkIHRpY2tzKQorICoKKyAqIFxkZXRhaWxzIFJlc2V0IGFsbCBzdGF0cyBmb3IgYWxsIHRocmVhZHMuCisgKgorICogQGluZ3JvdXAgU1RBVFNfR0FUSEVSSU5HCisqLworI2RlZmluZSBLTVBfUkVTRVRfU1RBVFMoKSBfX2ttcF9yZXNldF9zdGF0cygpCisKKyNpZiAoS01QX0RFVkVMT1BFUl9TVEFUUykKKyNkZWZpbmUgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKG4pIEtNUF9USU1FX0JMT0NLKG4pCisjZGVmaW5lIEtNUF9DT1VOVF9ERVZFTE9QRVJfVkFMVUUobiwgdikgS01QX0NPVU5UX1ZBTFVFKG4sIHYpCisjZGVmaW5lIEtNUF9DT1VOVF9ERVZFTE9QRVJfQkxPQ0sobikgS01QX0NPVU5UX0JMT0NLKG4pCisjZGVmaW5lIEtNUF9TVEFSVF9ERVZFTE9QRVJfRVhQTElDSVRfVElNRVIobikgS01QX1NUQVJUX0VYUExJQ0lUX1RJTUVSKG4pCisjZGVmaW5lIEtNUF9TVE9QX0RFVkVMT1BFUl9FWFBMSUNJVF9USU1FUihuKSBLTVBfU1RPUF9FWFBMSUNJVF9USU1FUihuKQorI2RlZmluZSBLTVBfVElNRV9ERVZFTE9QRVJfUEFSVElUSU9ORURfQkxPQ0sobikgS01QX1RJTUVfUEFSVElUSU9ORURfQkxPQ0sobikKKyNlbHNlCisvLyBOdWxsIGRlZmluaXRpb25zCisjZGVmaW5lIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhuKSAoKHZvaWQpMCkKKyNkZWZpbmUgS01QX0NPVU5UX0RFVkVMT1BFUl9WQUxVRShuLCB2KSAoKHZvaWQpMCkKKyNkZWZpbmUgS01QX0NPVU5UX0RFVkVMT1BFUl9CTE9DSyhuKSAoKHZvaWQpMCkKKyNkZWZpbmUgS01QX1NUQVJUX0RFVkVMT1BFUl9FWFBMSUNJVF9USU1FUihuKSAoKHZvaWQpMCkKKyNkZWZpbmUgS01QX1NUT1BfREVWRUxPUEVSX0VYUExJQ0lUX1RJTUVSKG4pICgodm9pZCkwKQorI2RlZmluZSBLTVBfVElNRV9ERVZFTE9QRVJfUEFSVElUSU9ORURfQkxPQ0sobikgKCh2b2lkKTApCisjZW5kaWYKKworI2Vsc2UgLy8gS01QX1NUQVRTX0VOQUJMRUQKKworLy8gTnVsbCBkZWZpbml0aW9ucworI2RlZmluZSBLTVBfVElNRV9CTE9DSyhuKSAoKHZvaWQpMCkKKyNkZWZpbmUgS01QX0NPVU5UX1ZBTFVFKG4sIHYpICgodm9pZCkwKQorI2RlZmluZSBLTVBfQ09VTlRfQkxPQ0sobikgKCh2b2lkKTApCisjZGVmaW5lIEtNUF9TVEFSVF9FWFBMSUNJVF9USU1FUihuKSAoKHZvaWQpMCkKKyNkZWZpbmUgS01QX1NUT1BfRVhQTElDSVRfVElNRVIobikgKCh2b2lkKTApCisKKyNkZWZpbmUgS01QX09VVFBVVF9TVEFUUyhoZWFkaW5nX3N0cmluZykgKCh2b2lkKTApCisjZGVmaW5lIEtNUF9SRVNFVF9TVEFUUygpICgodm9pZCkwKQorCisjZGVmaW5lIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhuKSAoKHZvaWQpMCkKKyNkZWZpbmUgS01QX0NPVU5UX0RFVkVMT1BFUl9WQUxVRShuLCB2KSAoKHZvaWQpMCkKKyNkZWZpbmUgS01QX0NPVU5UX0RFVkVMT1BFUl9CTE9DSyhuKSAoKHZvaWQpMCkKKyNkZWZpbmUgS01QX1NUQVJUX0RFVkVMT1BFUl9FWFBMSUNJVF9USU1FUihuKSAoKHZvaWQpMCkKKyNkZWZpbmUgS01QX1NUT1BfREVWRUxPUEVSX0VYUExJQ0lUX1RJTUVSKG4pICgodm9pZCkwKQorI2RlZmluZSBLTVBfSU5JVF9QQVJUSVRJT05FRF9USU1FUlMobmFtZSkgKCh2b2lkKTApCisjZGVmaW5lIEtNUF9USU1FX1BBUlRJVElPTkVEX0JMT0NLKG5hbWUpICgodm9pZCkwKQorI2RlZmluZSBLTVBfVElNRV9ERVZFTE9QRVJfUEFSVElUSU9ORURfQkxPQ0sobikgKCh2b2lkKTApCisjZGVmaW5lIEtNUF9QVVNIX1BBUlRJVElPTkVEX1RJTUVSKG5hbWUpICgodm9pZCkwKQorI2RlZmluZSBLTVBfUE9QX1BBUlRJVElPTkVEX1RJTUVSKCkgKCh2b2lkKTApCisjZGVmaW5lIEtNUF9TRVRfVEhSRUFEX1NUQVRFKHN0YXRlX25hbWUpICgodm9pZCkwKQorI2RlZmluZSBLTVBfR0VUX1RIUkVBRF9TVEFURSgpICgodm9pZCkwKQorI2RlZmluZSBLTVBfU0VUX1RIUkVBRF9TVEFURV9CTE9DSyhzdGF0ZV9uYW1lKSAoKHZvaWQpMCkKKyNlbmRpZiAvLyBLTVBfU1RBVFNfRU5BQkxFRAorCisjZW5kaWYgLy8gS01QX1NUQVRTX0gKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdGF0c190aW1pbmcuY3BwIGIvZmluYWwvcnVudGltZS9zcmMva21wX3N0YXRzX3RpbWluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJkNzBmYgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdGF0c190aW1pbmcuY3BwCkBAIC0wLDAgKzEsMTMyIEBACisvKiogQGZpbGUga21wX3N0YXRzX3RpbWluZy5jcHAKKyAqIFRpbWluZyBmdW5jdGlvbnMKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX3N0YXRzX3RpbWluZy5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisjaWYgS01QX0hBVkVfVElDS19USU1FCisjaWYgS01QX01JQworZG91YmxlIHRzY190aWNrX2NvdW50Ojp0aWNrX3RpbWUoKSB7CisgIC8vIHByZXR0eSBiYWQgYXNzdW1wdGlvbiBvZiAxR0h6IGNsb2NrIGZvciBNSUMKKyAgcmV0dXJuIDEgLyAoKGRvdWJsZSkxMDAwICogMS5lNik7Cit9CisjZWxpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisjaW5jbHVkZSA8c3RyaW5nLmg+CisvLyBFeHRyYWN0IHRoZSB2YWx1ZSBmcm9tIHRoZSBDUFVJRCBpbmZvcm1hdGlvbgorZG91YmxlIHRzY190aWNrX2NvdW50Ojp0aWNrX3RpbWUoKSB7CisgIHN0YXRpYyBkb3VibGUgcmVzdWx0ID0gMC4wOworCisgIGlmIChyZXN1bHQgPT0gMC4wKSB7CisgICAga21wX2NwdWlkX3QgY3B1aW5mbzsKKyAgICBjaGFyIGJyYW5kWzI1Nl07CisKKyAgICBfX2ttcF94ODZfY3B1aWQoMHg4MDAwMDAwMCwgMCwgJmNwdWluZm8pOworICAgIG1lbXNldChicmFuZCwgMCwgc2l6ZW9mKGJyYW5kKSk7CisgICAgaW50IGlkcyA9IGNwdWluZm8uZWF4OworCisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDI7IGkgPCAoaWRzIF4gMHg4MDAwMDAwMCkgKyAyOyBpKyspCisgICAgICBfX2ttcF94ODZfY3B1aWQoaSB8IDB4ODAwMDAwMDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgKGttcF9jcHVpZF90ICopKGJyYW5kICsgKGkgLSAyKSAqIHNpemVvZihrbXBfY3B1aWRfdCkpKTsKKworICAgIGNoYXIgKnN0YXJ0ID0gJmJyYW5kWzBdOworICAgIGZvciAoOyAqc3RhcnQgPT0gJyAnOyBzdGFydCsrKQorICAgICAgOworCisgICAgY2hhciAqZW5kID0gYnJhbmQgKyBLTVBfU1RSTEVOKGJyYW5kKSAtIDM7CisgICAgdWludDY0X3QgbXVsdGlwbGllcjsKKworICAgIGlmICgqZW5kID09ICdNJykKKyAgICAgIG11bHRpcGxpZXIgPSAxMDAwTEwgKiAxMDAwTEw7CisgICAgZWxzZSBpZiAoKmVuZCA9PSAnRycpCisgICAgICBtdWx0aXBsaWVyID0gMTAwMExMICogMTAwMExMICogMTAwMExMOworICAgIGVsc2UgaWYgKCplbmQgPT0gJ1QnKQorICAgICAgbXVsdGlwbGllciA9IDEwMDBMTCAqIDEwMDBMTCAqIDEwMDBMTCAqIDEwMDBMTDsKKyAgICBlbHNlIHsKKyAgICAgIGNvdXQgPDwgIkVycm9yIGRldGVybWluaW5nIG11bHRpcGxpZXIgJyIgPDwgKmVuZCA8PCAiJ1xuIjsKKyAgICAgIGV4aXQoLTEpOworICAgIH0KKyAgICAqZW5kID0gMDsKKyAgICB3aGlsZSAoKmVuZCAhPSAnICcpCisgICAgICBlbmQtLTsKKyAgICBlbmQrKzsKKworICAgIGRvdWJsZSBmcmVxID0gc3RydG9kKGVuZCwgJnN0YXJ0KTsKKyAgICBpZiAoZnJlcSA9PSAwLjApIHsKKyAgICAgIGNvdXQgPDwgIkVycm9yIGNhbGN1bGF0aW5nIGZyZXF1ZW5jeSAiIDw8IGVuZCA8PCAiXG4iOworICAgICAgZXhpdCgtMSk7CisgICAgfQorCisgICAgcmVzdWx0ID0gKChkb3VibGUpMS4wKSAvIChmcmVxICogbXVsdGlwbGllcik7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgorI2VuZGlmCisKK3N0YXRpYyBib29sIHVzZVNJID0gdHJ1ZTsKKworLy8gUmV0dXJuIGEgZm9ybWF0dGVkIHN0cmluZyBhZnRlciBub3JtYWxpc2luZyB0aGUgdmFsdWUgaW50bworLy8gZW5naW5lZXJpbmcgc3R5bGUgYW5kIHVzaW5nIGEgc3VpdGFibGUgdW5pdCBwcmVmaXggKGUuZy4gbXMsIHVzLCBucykuCitzdGQ6OnN0cmluZyBmb3JtYXRTSShkb3VibGUgaW50ZXJ2YWwsIGludCB3aWR0aCwgY2hhciB1bml0KSB7CisgIHN0ZDo6c3RyaW5nc3RyZWFtIG9zOworCisgIGlmICh1c2VTSSkgeworICAgIC8vIFByZXNlcnZlIGFjY3VyYWN5IGZvciBzbWFsbCBudW1iZXJzLCBzaW5jZSB3ZSBvbmx5IG11bHRpcGx5IGFuZCB0aGUKKyAgICAvLyBwb3NpdGl2ZSBwb3dlcnMgb2YgdGVuIGFyZSBwcmVjaXNlbHkgcmVwcmVzZW50YWJsZS4KKyAgICBzdGF0aWMgc3RydWN0IHsKKyAgICAgIGRvdWJsZSBzY2FsZTsKKyAgICAgIGNoYXIgcHJlZml4OworICAgIH0gcmFuZ2VzW10gPSB7ezEuZTEyLCAnZid9LCAgezEuZTksICdwJ30sICAgezEuZTYsICduJ30sICAgezEuZTMsICd1J30sCisgICAgICAgICAgICAgICAgICB7MS4wLCAnbSd9LCAgICB7MS5lLTMsICcgJ30sICB7MS5lLTYsICdrJ30sICB7MS5lLTksICdNJ30sCisgICAgICAgICAgICAgICAgICB7MS5lLTEyLCAnRyd9LCB7MS5lLTE1LCAnVCd9LCB7MS5lLTE4LCAnUCd9LCB7MS5lLTIxLCAnRSd9LAorICAgICAgICAgICAgICAgICAgezEuZS0yNCwgJ1onfSwgezEuZS0yNywgJ1knfX07CisKKyAgICBpZiAoaW50ZXJ2YWwgPT0gMC4wKSB7CisgICAgICBvcyA8PCBzdGQ6OnNldHcod2lkdGggLSAzKSA8PCBzdGQ6OnJpZ2h0IDw8ICIwLjAwIiA8PCBzdGQ6OnNldHcoMykKKyAgICAgICAgIDw8IHVuaXQ7CisgICAgICByZXR1cm4gb3Muc3RyKCk7CisgICAgfQorCisgICAgYm9vbCBuZWdhdGl2ZSA9IGZhbHNlOworICAgIGlmIChpbnRlcnZhbCA8IDAuMCkgeworICAgICAgbmVnYXRpdmUgPSB0cnVlOworICAgICAgaW50ZXJ2YWwgPSAtaW50ZXJ2YWw7CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KShzaXplb2YocmFuZ2VzKSAvIHNpemVvZihyYW5nZXNbMF0pKTsgaSsrKSB7CisgICAgICBpZiAoaW50ZXJ2YWwgKiByYW5nZXNbaV0uc2NhbGUgPCAxLmUwKSB7CisgICAgICAgIGludGVydmFsID0gaW50ZXJ2YWwgKiAxMDAwLmUwICogcmFuZ2VzW2ldLnNjYWxlOworICAgICAgICBvcyA8PCBzdGQ6OmZpeGVkIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKDIpIDw8IHN0ZDo6c2V0dyh3aWR0aCAtIDMpCisgICAgICAgICAgIDw8IHN0ZDo6cmlnaHQgPDwgKG5lZ2F0aXZlID8gLWludGVydmFsIDogaW50ZXJ2YWwpIDw8IHN0ZDo6c2V0dygyKQorICAgICAgICAgICA8PCByYW5nZXNbaV0ucHJlZml4IDw8IHN0ZDo6c2V0dygxKSA8PCB1bml0OworCisgICAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgb3MgPDwgc3RkOjpzZXRwcmVjaXNpb24oMikgPDwgc3RkOjpmaXhlZCA8PCBzdGQ6OnJpZ2h0IDw8IHN0ZDo6c2V0dyh3aWR0aCAtIDMpCisgICAgIDw8IGludGVydmFsIDw8IHN0ZDo6c2V0dygzKSA8PCB1bml0OworCisgIHJldHVybiBvcy5zdHIoKTsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdGF0c190aW1pbmcuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdGF0c190aW1pbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTE5NWI5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3N0YXRzX3RpbWluZy5oCkBAIC0wLDAgKzEsMTE4IEBACisjaWZuZGVmIEtNUF9TVEFUU19USU1JTkdfSAorI2RlZmluZSBLTVBfU1RBVFNfVElNSU5HX0gKKworLyoqIEBmaWxlIGttcF9zdGF0c190aW1pbmcuaAorICogQWNjZXNzIHRvIHJlYWwgdGltZSBjbG9jayBhbmQgdGltZXJzLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wX29zLmgiCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpZiBLTVBfSEFWRV9YODZJTlRSSU5fSAorI2luY2x1ZGUgPHg4NmludHJpbi5oPgorI2VuZGlmCisKK2NsYXNzIHRzY190aWNrX2NvdW50IHsKK3ByaXZhdGU6CisgIGludDY0X3QgbXlfY291bnQ7CisKK3B1YmxpYzoKKyAgY2xhc3MgdHNjX2ludGVydmFsX3QgeworICAgIGludDY0X3QgdmFsdWU7CisgICAgZXhwbGljaXQgdHNjX2ludGVydmFsX3QoaW50NjRfdCBfdmFsdWUpIDogdmFsdWUoX3ZhbHVlKSB7fQorCisgIHB1YmxpYzoKKyAgICB0c2NfaW50ZXJ2YWxfdCgpIDogdmFsdWUoMCl7fTsgLy8gQ29uc3RydWN0IDAgdGltZSBkdXJhdGlvbgorI2lmIEtNUF9IQVZFX1RJQ0tfVElNRQorICAgIGRvdWJsZSBzZWNvbmRzKCkgY29uc3Q7IC8vIFJldHVybiB0aGUgbGVuZ3RoIG9mIGEgdGltZSBpbnRlcnZhbCBpbiBzZWNvbmRzCisjZW5kaWYKKyAgICBkb3VibGUgdGlja3MoKSBjb25zdCB7IHJldHVybiBkb3VibGUodmFsdWUpOyB9CisgICAgaW50NjRfdCBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlOyB9CisgICAgdHNjX2ludGVydmFsX3QgJm9wZXJhdG9yPShpbnQ2NF90IG52YWx1ZSkgeworICAgICAgdmFsdWUgPSBudmFsdWU7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgZnJpZW5kIGNsYXNzIHRzY190aWNrX2NvdW50OworCisgICAgZnJpZW5kIHRzY19pbnRlcnZhbF90IG9wZXJhdG9yLShjb25zdCB0c2NfdGlja19jb3VudCAmdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0c2NfdGlja19jb3VudCAmdDApOworICAgIGZyaWVuZCB0c2NfaW50ZXJ2YWxfdCBvcGVyYXRvci0oY29uc3QgdHNjX3RpY2tfY291bnQ6OnRzY19pbnRlcnZhbF90ICZpMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRzY190aWNrX2NvdW50Ojp0c2NfaW50ZXJ2YWxfdCAmaTApOworICAgIGZyaWVuZCB0c2NfaW50ZXJ2YWxfdCAmb3BlcmF0b3IrPSh0c2NfdGlja19jb3VudDo6dHNjX2ludGVydmFsX3QgJmkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0c2NfdGlja19jb3VudDo6dHNjX2ludGVydmFsX3QgJmkwKTsKKyAgfTsKKworI2lmIEtNUF9IQVZFX19fQlVJTFRJTl9SRUFEQ1lDTEVDT1VOVEVSCisgIHRzY190aWNrX2NvdW50KCkKKyAgICAgIDogbXlfY291bnQoc3RhdGljX2Nhc3Q8aW50NjRfdD4oX19idWlsdGluX3JlYWRjeWNsZWNvdW50ZXIoKSkpIHt9CisjZWxpZiBLTVBfSEFWRV9fX1JEVFNDCisgIHRzY190aWNrX2NvdW50KCkgOiBteV9jb3VudChzdGF0aWNfY2FzdDxpbnQ2NF90PihfX3JkdHNjKCkpKXt9OworI2Vsc2UKKyNlcnJvciBNdXN0IGhhdmUgaGlnaCByZXNvbHV0aW9uIHRpbWVyIGRlZmluZWQKKyNlbmRpZgorICB0c2NfdGlja19jb3VudChpbnQ2NF90IHZhbHVlKSA6IG15X2NvdW50KHZhbHVlKXt9OworICBpbnQ2NF90IGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gbXlfY291bnQ7IH0KKyAgdHNjX3RpY2tfY291bnQgbGF0ZXIodHNjX3RpY2tfY291bnQgY29uc3Qgb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gbXlfY291bnQgPiBvdGhlci5teV9jb3VudCA/ICgqdGhpcykgOiBvdGhlcjsKKyAgfQorICB0c2NfdGlja19jb3VudCBlYXJsaWVyKHRzY190aWNrX2NvdW50IGNvbnN0IG90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIG15X2NvdW50IDwgb3RoZXIubXlfY291bnQgPyAoKnRoaXMpIDogb3RoZXI7CisgIH0KKyNpZiBLTVBfSEFWRV9USUNLX1RJTUUKKyAgc3RhdGljIGRvdWJsZSB0aWNrX3RpbWUoKTsgLy8gcmV0dXJucyBzZWNvbmRzIHBlciBjeWNsZSAocGVyaW9kKSBvZiBjbG9jaworI2VuZGlmCisgIHN0YXRpYyB0c2NfdGlja19jb3VudCBub3coKSB7CisgICAgcmV0dXJuIHRzY190aWNrX2NvdW50KCk7CisgIH0gLy8gcmV0dXJucyB0aGUgcmR0c2MgcmVnaXN0ZXIgdmFsdWUKKyAgZnJpZW5kIHRzY190aWNrX2NvdW50Ojp0c2NfaW50ZXJ2YWxfdCBvcGVyYXRvci0oY29uc3QgdHNjX3RpY2tfY291bnQgJnQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0c2NfdGlja19jb3VudCAmdDApOworfTsKKworaW5saW5lIHRzY190aWNrX2NvdW50Ojp0c2NfaW50ZXJ2YWxfdCBvcGVyYXRvci0oY29uc3QgdHNjX3RpY2tfY291bnQgJnQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHNjX3RpY2tfY291bnQgJnQwKSB7CisgIHJldHVybiB0c2NfdGlja19jb3VudDo6dHNjX2ludGVydmFsX3QodDEubXlfY291bnQgLSB0MC5teV9jb3VudCk7Cit9CisKK2lubGluZSB0c2NfdGlja19jb3VudDo6dHNjX2ludGVydmFsX3QKK29wZXJhdG9yLShjb25zdCB0c2NfdGlja19jb3VudDo6dHNjX2ludGVydmFsX3QgJmkxLAorICAgICAgICAgIGNvbnN0IHRzY190aWNrX2NvdW50Ojp0c2NfaW50ZXJ2YWxfdCAmaTApIHsKKyAgcmV0dXJuIHRzY190aWNrX2NvdW50Ojp0c2NfaW50ZXJ2YWxfdChpMS52YWx1ZSAtIGkwLnZhbHVlKTsKK30KKworaW5saW5lIHRzY190aWNrX2NvdW50Ojp0c2NfaW50ZXJ2YWxfdCAmCitvcGVyYXRvcis9KHRzY190aWNrX2NvdW50Ojp0c2NfaW50ZXJ2YWxfdCAmaTEsCisgICAgICAgICAgIGNvbnN0IHRzY190aWNrX2NvdW50Ojp0c2NfaW50ZXJ2YWxfdCAmaTApIHsKKyAgaTEudmFsdWUgKz0gaTAudmFsdWU7CisgIHJldHVybiBpMTsKK30KKworI2lmIEtNUF9IQVZFX1RJQ0tfVElNRQoraW5saW5lIGRvdWJsZSB0c2NfdGlja19jb3VudDo6dHNjX2ludGVydmFsX3Q6OnNlY29uZHMoKSBjb25zdCB7CisgIHJldHVybiB2YWx1ZSAqIHRpY2tfdGltZSgpOworfQorI2VuZGlmCisKK2V4dGVybiBzdGQ6OnN0cmluZyBmb3JtYXRTSShkb3VibGUgaW50ZXJ2YWwsIGludCB3aWR0aCwgY2hhciB1bml0KTsKKworaW5saW5lIHN0ZDo6c3RyaW5nIGZvcm1hdFNlY29uZHMoZG91YmxlIGludGVydmFsLCBpbnQgd2lkdGgpIHsKKyAgcmV0dXJuIGZvcm1hdFNJKGludGVydmFsLCB3aWR0aCwgJ1MnKTsKK30KKworaW5saW5lIHN0ZDo6c3RyaW5nIGZvcm1hdFRpY2tzKGRvdWJsZSBpbnRlcnZhbCwgaW50IHdpZHRoKSB7CisgIHJldHVybiBmb3JtYXRTSShpbnRlcnZhbCwgd2lkdGgsICdUJyk7Cit9CisKKyNlbmRpZiAvLyBLTVBfU1RBVFNfVElNSU5HX0gKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdHIuY3BwIGIvZmluYWwvcnVudGltZS9zcmMva21wX3N0ci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVkMzNkZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdHIuY3BwCkBAIC0wLDAgKzEsNzM1IEBACisvKgorICoga21wX3N0ci5jcHAgLS0gU3RyaW5nIG1hbmlwdWxhdGlvbiByb3V0aW5lcy4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcF9zdHIuaCIKKworI2luY2x1ZGUgPHN0ZGFyZy5oPiAvLyB2YV8qCisjaW5jbHVkZSA8c3RkaW8uaD4gLy8gdnNucHJpbnRmKCkKKyNpbmNsdWRlIDxzdGRsaWIuaD4gLy8gbWFsbG9jKCksIHJlYWxsb2MoKQorCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKworLyogU3RyaW5nIGJ1ZmZlci4KKworICAgVXNhZ2U6CisKKyAgIC8vIERlY2xhcmUgYnVmZmVyIGFuZCBpbml0aWFsaXplIGl0LgorICAga21wX3N0cl9idWZfdCAgYnVmZmVyOworICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIGJ1ZmZlciApOworCisgICAvLyBQcmludCB0byBidWZmZXIuCisgICBfX2ttcF9zdHJfYnVmX3ByaW50KCYgYnVmZmVyLCAiRXJyb3IgaW4gZmlsZSBcIiVzXCIgbGluZSAlZFxuIiwgImZvby5jIiwgMTIpOworICAgX19rbXBfc3RyX2J1Zl9wcmludCgmIGJ1ZmZlciwgIiAgICA8JXM+XG4iLCBsaW5lKTsKKworICAgLy8gVXNlIGJ1ZmZlciBjb250ZW50cy4gYnVmZmVyLnN0ciBpcyBhIHBvaW50ZXIgdG8gZGF0YSwgYnVmZmVyLnVzZWQgaXMgYQorICAgLy8gbnVtYmVyIG9mIHByaW50ZWQgY2hhcmFjdGVycyAobm90IGluY2x1ZGluZyB0ZXJtaW5hdGluZyB6ZXJvKS4KKyAgIHdyaXRlKCBmZCwgYnVmZmVyLnN0ciwgYnVmZmVyLnVzZWQgKTsKKworICAgLy8gRnJlZSBidWZmZXIuCisgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgYnVmZmVyICk7CisKKyAgIC8vIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gZGV0YWNoIGFsbG9jYXRlZCBtZW1vcnkgZnJvbSBidWZmZXI6CisgICBfX2ttcF9zdHJfYnVmX2RldGFjaCggJiBidWZmZXIgKTsKKyAgIHJldHVybiBidWZmZXIuc3RyOyAgICAvLyBUaGF0IG1lbW9yeSBzaG91bGQgYmUgZnJlZWQgZXZlbnR1YWxseS4KKworICAgTm90ZXM6CisKKyAgICogQnVmZmVyIHVzZXJzIG1heSB1c2UgYnVmZmVyLnN0ciBhbmQgYnVmZmVyLnVzZWQuIFVzZXJzIHNob3VsZCBub3QgY2hhbmdlCisgICAgIGFueSBmaWVsZHMgb2YgYnVmZmVyIGRpcmVjdGx5LgorICAgKiBidWZmZXIuc3RyIGlzIG5ldmVyIE5VTEwuIElmIGJ1ZmZlciBpcyBlbXB0eSwgYnVmZmVyLnN0ciBwb2ludHMgdG8gZW1wdHkKKyAgICAgc3RyaW5nICgiIikuCisgICAqIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBidWZmZXIgdXNlcyBzdGFjayBtZW1vcnkgKGJ1ZmZlci5idWxrKSBmaXJzdC4gSWYKKyAgICAgc3RhY2sgbWVtb3J5IGlzIGV4aGF1c3RlZCwgYnVmZmVyIGFsbG9jYXRlcyBtZW1vcnkgb24gaGVhcCBieSBtYWxsb2MoKSwgYW5kCisgICAgIHJlYWxsb2NhdGVzIGl0IGJ5IHJlYWxsb2MoKSBhcyBhbW91bnQgb2YgdXNlZCBtZW1vcnkgZ3Jvd3MuCisgICAqIEJ1ZmZlciBkb3VibGVzIGFtb3VudCBvZiBhbGxvY2F0ZWQgbWVtb3J5IGVhY2ggdGltZSBpdCBpcyBleGhhdXN0ZWQuCisqLworCisvLyBUT0RPOiBfX2ttcF9zdHJfYnVmX3ByaW50KCkgY2FuIHVzZSB0aHJlYWQgbG9jYWwgbWVtb3J5IGFsbG9jYXRvci4KKworI2RlZmluZSBLTVBfU1RSX0JVRl9JTlZBUklBTlQoYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0RFQlVHX0FTU0VSVCgoYiktPnN0ciAhPSBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoKGIpLT5zaXplID49IHNpemVvZigoYiktPmJ1bGspKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfREVCVUdfQVNTRVJUKChiKS0+c2l6ZSAlIHNpemVvZigoYiktPmJ1bGspID09IDApOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0RFQlVHX0FTU0VSVCgodW5zaWduZWQpKGIpLT51c2VkIDwgKGIpLT5zaXplKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGIpLT5zaXplID09IHNpemVvZigoYiktPmJ1bGspID8gKGIpLT5zdHIgPT0gJihiKS0+YnVsa1swXSA6IDEpOyAgICAgICBcCisgICAgS01QX0RFQlVHX0FTU0VSVCgoYiktPnNpemUgPiBzaXplb2YoKGIpLT5idWxrKSA/IChiKS0+c3RyICE9ICYoYiktPmJ1bGtbMF0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAxKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCit2b2lkIF9fa21wX3N0cl9idWZfY2xlYXIoa21wX3N0cl9idWZfdCAqYnVmZmVyKSB7CisgIEtNUF9TVFJfQlVGX0lOVkFSSUFOVChidWZmZXIpOworICBpZiAoYnVmZmVyLT51c2VkID4gMCkgeworICAgIGJ1ZmZlci0+dXNlZCA9IDA7CisgICAgYnVmZmVyLT5zdHJbMF0gPSAwOworICB9OyAvLyBpZgorICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoYnVmZmVyKTsKK30gLy8gX19rbXBfc3RyX2J1Zl9jbGVhcgorCit2b2lkIF9fa21wX3N0cl9idWZfcmVzZXJ2ZShrbXBfc3RyX2J1Zl90ICpidWZmZXIsIGludCBzaXplKSB7CisgIEtNUF9TVFJfQlVGX0lOVkFSSUFOVChidWZmZXIpOworICBLTVBfREVCVUdfQVNTRVJUKHNpemUgPj0gMCk7CisKKyAgaWYgKGJ1ZmZlci0+c2l6ZSA8ICh1bnNpZ25lZCBpbnQpc2l6ZSkgeworICAgIC8vIENhbGN1bGF0ZSBidWZmZXIgc2l6ZS4KKyAgICBkbyB7CisgICAgICBidWZmZXItPnNpemUgKj0gMjsKKyAgICB9IHdoaWxlIChidWZmZXItPnNpemUgPCAodW5zaWduZWQgaW50KXNpemUpOworCisgICAgLy8gRW5sYXJnZSBidWZmZXIuCisgICAgaWYgKGJ1ZmZlci0+c3RyID09ICZidWZmZXItPmJ1bGtbMF0pIHsKKyAgICAgIGJ1ZmZlci0+c3RyID0gKGNoYXIgKilLTVBfSU5URVJOQUxfTUFMTE9DKGJ1ZmZlci0+c2l6ZSk7CisgICAgICBpZiAoYnVmZmVyLT5zdHIgPT0gTlVMTCkgeworICAgICAgICBLTVBfRkFUQUwoTWVtb3J5QWxsb2NGYWlsZWQpOworICAgICAgfTsgLy8gaWYKKyAgICAgIEtNUF9NRU1DUFlfUyhidWZmZXItPnN0ciwgYnVmZmVyLT5zaXplLCBidWZmZXItPmJ1bGssIGJ1ZmZlci0+dXNlZCArIDEpOworICAgIH0gZWxzZSB7CisgICAgICBidWZmZXItPnN0ciA9IChjaGFyICopS01QX0lOVEVSTkFMX1JFQUxMT0MoYnVmZmVyLT5zdHIsIGJ1ZmZlci0+c2l6ZSk7CisgICAgICBpZiAoYnVmZmVyLT5zdHIgPT0gTlVMTCkgeworICAgICAgICBLTVBfRkFUQUwoTWVtb3J5QWxsb2NGYWlsZWQpOworICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorCisgIH07IC8vIGlmCisKKyAgS01QX0RFQlVHX0FTU0VSVChidWZmZXItPnNpemUgPiAwKTsKKyAgS01QX0RFQlVHX0FTU0VSVChidWZmZXItPnNpemUgPj0gKHVuc2lnbmVkKXNpemUpOworICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoYnVmZmVyKTsKK30gLy8gX19rbXBfc3RyX2J1Zl9yZXNlcnZlCisKK3ZvaWQgX19rbXBfc3RyX2J1Zl9kZXRhY2goa21wX3N0cl9idWZfdCAqYnVmZmVyKSB7CisgIEtNUF9TVFJfQlVGX0lOVkFSSUFOVChidWZmZXIpOworCisgIC8vIElmIGludGVybmFsIGJ1bGsgaXMgdXNlZCwgYWxsb2NhdGUgbWVtb3J5IGFuZCBjb3B5IGl0LgorICBpZiAoYnVmZmVyLT5zaXplIDw9IHNpemVvZihidWZmZXItPmJ1bGspKSB7CisgICAgYnVmZmVyLT5zdHIgPSAoY2hhciAqKUtNUF9JTlRFUk5BTF9NQUxMT0MoYnVmZmVyLT5zaXplKTsKKyAgICBpZiAoYnVmZmVyLT5zdHIgPT0gTlVMTCkgeworICAgICAgS01QX0ZBVEFMKE1lbW9yeUFsbG9jRmFpbGVkKTsKKyAgICB9OyAvLyBpZgorICAgIEtNUF9NRU1DUFlfUyhidWZmZXItPnN0ciwgYnVmZmVyLT5zaXplLCBidWZmZXItPmJ1bGssIGJ1ZmZlci0+dXNlZCArIDEpOworICB9OyAvLyBpZgorfSAvLyBfX2ttcF9zdHJfYnVmX2RldGFjaAorCit2b2lkIF9fa21wX3N0cl9idWZfZnJlZShrbXBfc3RyX2J1Zl90ICpidWZmZXIpIHsKKyAgS01QX1NUUl9CVUZfSU5WQVJJQU5UKGJ1ZmZlcik7CisgIGlmIChidWZmZXItPnNpemUgPiBzaXplb2YoYnVmZmVyLT5idWxrKSkgeworICAgIEtNUF9JTlRFUk5BTF9GUkVFKGJ1ZmZlci0+c3RyKTsKKyAgfTsgLy8gaWYKKyAgYnVmZmVyLT5zdHIgPSBidWZmZXItPmJ1bGs7CisgIGJ1ZmZlci0+c2l6ZSA9IHNpemVvZihidWZmZXItPmJ1bGspOworICBidWZmZXItPnVzZWQgPSAwOworICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoYnVmZmVyKTsKK30gLy8gX19rbXBfc3RyX2J1Zl9mcmVlCisKK3ZvaWQgX19rbXBfc3RyX2J1Zl9jYXQoa21wX3N0cl9idWZfdCAqYnVmZmVyLCBjaGFyIGNvbnN0ICpzdHIsIGludCBsZW4pIHsKKyAgS01QX1NUUl9CVUZfSU5WQVJJQU5UKGJ1ZmZlcik7CisgIEtNUF9ERUJVR19BU1NFUlQoc3RyICE9IE5VTEwpOworICBLTVBfREVCVUdfQVNTRVJUKGxlbiA+PSAwKTsKKyAgX19rbXBfc3RyX2J1Zl9yZXNlcnZlKGJ1ZmZlciwgYnVmZmVyLT51c2VkICsgbGVuICsgMSk7CisgIEtNUF9NRU1DUFkoYnVmZmVyLT5zdHIgKyBidWZmZXItPnVzZWQsIHN0ciwgbGVuKTsKKyAgYnVmZmVyLT5zdHJbYnVmZmVyLT51c2VkICsgbGVuXSA9IDA7CisgIGJ1ZmZlci0+dXNlZCArPSBsZW47CisgIEtNUF9TVFJfQlVGX0lOVkFSSUFOVChidWZmZXIpOworfSAvLyBfX2ttcF9zdHJfYnVmX2NhdAorCit2b2lkIF9fa21wX3N0cl9idWZfdnByaW50KGttcF9zdHJfYnVmX3QgKmJ1ZmZlciwgY2hhciBjb25zdCAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpIHsKKyAgS01QX1NUUl9CVUZfSU5WQVJJQU5UKGJ1ZmZlcik7CisKKyAgZm9yICg7OykgeworICAgIGludCBjb25zdCBmcmVlID0gYnVmZmVyLT5zaXplIC0gYnVmZmVyLT51c2VkOworICAgIGludCByYzsKKyAgICBpbnQgc2l6ZTsKKworICAgIC8vIFRyeSB0byBmb3JtYXQgc3RyaW5nLgorICAgIHsKKy8qIE9uIExpbnV4KiBPUyBJbnRlbChSKSA2NCwgdnNucHJpbnRmKCkgbW9kaWZpZXMgYXJncyBhcmd1bWVudCwgc28gdnNucHJpbnRmKCkKKyAgIGNyYXNoZXMgaWYgaXQgaXMgY2FsbGVkIGZvciB0aGUgc2Vjb25kIHRpbWUgd2l0aCB0aGUgc2FtZSBhcmdzLiBUbyBwcmV2ZW50CisgICB0aGUgY3Jhc2gsIHdlIGhhdmUgdG8gcGFzcyBhIGZyZXNoIGludGFjdCBjb3B5IG9mIGFyZ3MgdG8gdnNucHJpbnRmKCkgb24gZWFjaAorICAgaXRlcmF0aW9uLgorCisgICBVbmZvcnR1bmF0ZWx5LCBzdGFuZGFyZCB2YV9jb3B5KCkgbWFjcm8gaXMgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzKiBPUy4KKyAgIEhvd2V2ZXIsIGl0IHNlZW1zIHZzbnByaW50ZigpIGRvZXMgbm90IG1vZGlmeSBhcmdzIGFyZ3VtZW50IG9uIFdpbmRvd3MqIE9TLgorKi8KKworI2lmICFLTVBfT1NfV0lORE9XUworICAgICAgdmFfbGlzdCBfYXJnczsKKyAgICAgIHZhX2NvcHkoX2FyZ3MsIGFyZ3MpOyAvLyBNYWtlIGNvcHkgb2YgYXJncy4KKyNkZWZpbmUgYXJncyBfYXJncyAvLyBTdWJzdGl0dXRlIGFyZ3Mgd2l0aCBpdHMgY29weSwgX2FyZ3MuCisjZW5kaWYgLy8gS01QX09TX1dJTkRPV1MKKyAgICAgIHJjID0gS01QX1ZTTlBSSU5URihidWZmZXItPnN0ciArIGJ1ZmZlci0+dXNlZCwgZnJlZSwgZm9ybWF0LCBhcmdzKTsKKyNpZiAhS01QX09TX1dJTkRPV1MKKyN1bmRlZiBhcmdzIC8vIFJlbW92ZSBzdWJzdGl0dXRpb24uCisgICAgICB2YV9lbmQoX2FyZ3MpOworI2VuZGlmIC8vIEtNUF9PU19XSU5ET1dTCisgICAgfQorCisgICAgLy8gTm8gZXJyb3JzLCBzdHJpbmcgaGFzIGJlZW4gZm9ybWF0dGVkLgorICAgIGlmIChyYyA+PSAwICYmIHJjIDwgZnJlZSkgeworICAgICAgYnVmZmVyLT51c2VkICs9IHJjOworICAgICAgYnJlYWs7CisgICAgfTsgLy8gaWYKKworICAgIC8vIEVycm9yIG9jY3VycmVkLCBidWZmZXIgaXMgdG9vIHNtYWxsLgorICAgIGlmIChyYyA+PSAwKSB7CisgICAgICAvLyBDOTktY29uZm9ybWluZyBpbXBsZW1lbnRhdGlvbiBvZiB2c25wcmludGYgcmV0dXJucyByZXF1aXJlZCBidWZmZXIgc2l6ZQorICAgICAgc2l6ZSA9IGJ1ZmZlci0+dXNlZCArIHJjICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gT2xkZXIgaW1wbGVtZW50YXRpb25zIGp1c3QgcmV0dXJuIC0xLiBEb3VibGUgYnVmZmVyIHNpemUuCisgICAgICBzaXplID0gYnVmZmVyLT5zaXplICogMjsKKyAgICB9OyAvLyBpZgorCisgICAgLy8gRW5sYXJnZSBidWZmZXIuCisgICAgX19rbXBfc3RyX2J1Zl9yZXNlcnZlKGJ1ZmZlciwgc2l6ZSk7CisKKyAgICAvLyBBbmQgdHJ5IGFnYWluLgorICB9OyAvLyBmb3JldmVyCisKKyAgS01QX0RFQlVHX0FTU0VSVChidWZmZXItPnNpemUgPiAwKTsKKyAgS01QX1NUUl9CVUZfSU5WQVJJQU5UKGJ1ZmZlcik7Cit9IC8vIF9fa21wX3N0cl9idWZfdnByaW50CisKK3ZvaWQgX19rbXBfc3RyX2J1Zl9wcmludChrbXBfc3RyX2J1Zl90ICpidWZmZXIsIGNoYXIgY29uc3QgKmZvcm1hdCwgLi4uKSB7CisgIHZhX2xpc3QgYXJnczsKKyAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKyAgX19rbXBfc3RyX2J1Zl92cHJpbnQoYnVmZmVyLCBmb3JtYXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7Cit9IC8vIF9fa21wX3N0cl9idWZfcHJpbnQKKworLyogVGhlIGZ1bmN0aW9uIHByaW50cyBzcGVjaWZpZWQgc2l6ZSB0byBidWZmZXIuIFNpemUgaXMgZXhwcmVzc2VkIHVzaW5nIGJpZ2dlc3QKKyAgIHBvc3NpYmxlIHVuaXQsIGZvciBleGFtcGxlIDEwMjQgaXMgcHJpbnRlZCBhcyAiMWsiLiAqLwordm9pZCBfX2ttcF9zdHJfYnVmX3ByaW50X3NpemUoa21wX3N0cl9idWZfdCAqYnVmLCBzaXplX3Qgc2l6ZSkgeworICBjaGFyIGNvbnN0ICpuYW1lc1tdID0geyIiLCAiayIsICJNIiwgIkciLCAiVCIsICJQIiwgIkUiLCAiWiIsICJZIn07CisgIGludCBjb25zdCB1bml0cyA9IHNpemVvZihuYW1lcykgLyBzaXplb2YoY2hhciBjb25zdCAqKTsKKyAgaW50IHUgPSAwOworICBpZiAoc2l6ZSA+IDApIHsKKyAgICB3aGlsZSAoKHNpemUgJSAxMDI0ID09IDApICYmICh1ICsgMSA8IHVuaXRzKSkgeworICAgICAgc2l6ZSA9IHNpemUgLyAxMDI0OworICAgICAgKyt1OworICAgIH07IC8vIHdoaWxlCisgIH07IC8vIGlmCisKKyAgX19rbXBfc3RyX2J1Zl9wcmludChidWYsICIlIiBLTVBfU0laRV9UX1NQRUMgIiVzIiwgc2l6ZSwgbmFtZXNbdV0pOworfSAvLyBfX2ttcF9zdHJfYnVmX3ByaW50X3NpemUKKwordm9pZCBfX2ttcF9zdHJfZm5hbWVfaW5pdChrbXBfc3RyX2ZuYW1lX3QgKmZuYW1lLCBjaGFyIGNvbnN0ICpwYXRoKSB7CisgIGZuYW1lLT5wYXRoID0gTlVMTDsKKyAgZm5hbWUtPmRpciA9IE5VTEw7CisgIGZuYW1lLT5iYXNlID0gTlVMTDsKKworICBpZiAocGF0aCAhPSBOVUxMKSB7CisgICAgY2hhciAqc2xhc2ggPSBOVUxMOyAvLyBQb2ludGVyIHRvIHRoZSBsYXN0IGNoYXJhY3RlciBvZiBkaXIuCisgICAgY2hhciAqYmFzZSA9IE5VTEw7IC8vIFBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiBiYXNlbmFtZS4KKyAgICBmbmFtZS0+cGF0aCA9IF9fa21wX3N0cl9mb3JtYXQoIiVzIiwgcGF0aCk7CisgICAgLy8gT3JpZ2luYWwgY29kZSB1c2VkIHN0cmR1cCgpIGZ1bmN0aW9uIHRvIGNvcHkgYSBzdHJpbmcsIGJ1dCBvbiBXaW5kb3dzKiBPUworICAgIC8vIEludGVsKFIpIDY0IGl0IGNhdXNlcyBhc3NlcnRpb29uIGlkIGRlYnVnIGhlYXAsIHNvIEkgaGFkIHRvIHJlcGxhY2UKKyAgICAvLyBzdHJkdXAgd2l0aCBfX2ttcF9zdHJfZm9ybWF0KCkuCisgICAgaWYgKEtNUF9PU19XSU5ET1dTKSB7CisgICAgICBfX2ttcF9zdHJfcmVwbGFjZShmbmFtZS0+cGF0aCwgJ1xcJywgJy8nKTsKKyAgICB9OyAvLyBpZgorICAgIGZuYW1lLT5kaXIgPSBfX2ttcF9zdHJfZm9ybWF0KCIlcyIsIGZuYW1lLT5wYXRoKTsKKyAgICBzbGFzaCA9IHN0cnJjaHIoZm5hbWUtPmRpciwgJy8nKTsKKyAgICBpZiAoS01QX09TX1dJTkRPV1MgJiYKKyAgICAgICAgc2xhc2ggPT0gTlVMTCkgeyAvLyBPbiBXaW5kb3dzKiBPUywgaWYgc2xhc2ggbm90IGZvdW5kLAorICAgICAgY2hhciBmaXJzdCA9IFRPTE9XRVIoZm5hbWUtPmRpclswXSk7IC8vIGxvb2sgZm9yIGRyaXZlLgorICAgICAgaWYgKCdhJyA8PSBmaXJzdCAmJiBmaXJzdCA8PSAneicgJiYgZm5hbWUtPmRpclsxXSA9PSAnOicpIHsKKyAgICAgICAgc2xhc2ggPSAmZm5hbWUtPmRpclsxXTsKKyAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyAgICBiYXNlID0gKHNsYXNoID09IE5VTEwgPyBmbmFtZS0+ZGlyIDogc2xhc2ggKyAxKTsKKyAgICBmbmFtZS0+YmFzZSA9IF9fa21wX3N0cl9mb3JtYXQoIiVzIiwgYmFzZSk7IC8vIENvcHkgYmFzZW5hbWUKKyAgICAqYmFzZSA9IDA7IC8vIGFuZCB0cnVuY2F0ZSBkaXIuCisgIH07IC8vIGlmCisKK30gLy8ga21wX3N0cl9mbmFtZV9pbml0CisKK3ZvaWQgX19rbXBfc3RyX2ZuYW1lX2ZyZWUoa21wX3N0cl9mbmFtZV90ICpmbmFtZSkgeworICBfX2ttcF9zdHJfZnJlZShDQ0FTVChjaGFyIGNvbnN0ICoqLCAmZm5hbWUtPnBhdGgpKTsKKyAgX19rbXBfc3RyX2ZyZWUoQ0NBU1QoY2hhciBjb25zdCAqKiwgJmZuYW1lLT5kaXIpKTsKKyAgX19rbXBfc3RyX2ZyZWUoQ0NBU1QoY2hhciBjb25zdCAqKiwgJmZuYW1lLT5iYXNlKSk7Cit9IC8vIGttcF9zdHJfZm5hbWVfZnJlZQorCitpbnQgX19rbXBfc3RyX2ZuYW1lX21hdGNoKGttcF9zdHJfZm5hbWVfdCBjb25zdCAqZm5hbWUsIGNoYXIgY29uc3QgKnBhdHRlcm4pIHsKKyAgaW50IGRpcl9tYXRjaCA9IDE7CisgIGludCBiYXNlX21hdGNoID0gMTsKKworICBpZiAocGF0dGVybiAhPSBOVUxMKSB7CisgICAga21wX3N0cl9mbmFtZV90IHB0cm47CisgICAgX19rbXBfc3RyX2ZuYW1lX2luaXQoJnB0cm4sIHBhdHRlcm4pOworICAgIGRpcl9tYXRjaCA9IHN0cmNtcChwdHJuLmRpciwgIiovIikgPT0gMCB8fAorICAgICAgICAgICAgICAgIChmbmFtZS0+ZGlyICE9IE5VTEwgJiYgX19rbXBfc3RyX2VxZihmbmFtZS0+ZGlyLCBwdHJuLmRpcikpOworICAgIGJhc2VfbWF0Y2ggPSBzdHJjbXAocHRybi5iYXNlLCAiKiIpID09IDAgfHwKKyAgICAgICAgICAgICAgICAgKGZuYW1lLT5iYXNlICE9IE5VTEwgJiYgX19rbXBfc3RyX2VxZihmbmFtZS0+YmFzZSwgcHRybi5iYXNlKSk7CisgICAgX19rbXBfc3RyX2ZuYW1lX2ZyZWUoJnB0cm4pOworICB9OyAvLyBpZgorCisgIHJldHVybiBkaXJfbWF0Y2ggJiYgYmFzZV9tYXRjaDsKK30gLy8gX19rbXBfc3RyX2ZuYW1lX21hdGNoCisKK2ttcF9zdHJfbG9jX3QgX19rbXBfc3RyX2xvY19pbml0KGNoYXIgY29uc3QgKnBzb3VyY2UsIGludCBpbml0X2ZuYW1lKSB7CisgIGttcF9zdHJfbG9jX3QgbG9jOworCisgIGxvYy5fYnVsayA9IE5VTEw7CisgIGxvYy5maWxlID0gTlVMTDsKKyAgbG9jLmZ1bmMgPSBOVUxMOworICBsb2MubGluZSA9IDA7CisgIGxvYy5jb2wgPSAwOworCisgIGlmIChwc291cmNlICE9IE5VTEwpIHsKKyAgICBjaGFyICpzdHIgPSBOVUxMOworICAgIGNoYXIgKmR1bW15ID0gTlVMTDsKKyAgICBjaGFyICpsaW5lID0gTlVMTDsKKyAgICBjaGFyICpjb2wgPSBOVUxMOworCisgICAgLy8gQ29weSBwc291cmNlIHRvIGtlZXAgaXQgaW50YWN0LgorICAgIGxvYy5fYnVsayA9IF9fa21wX3N0cl9mb3JtYXQoIiVzIiwgcHNvdXJjZSk7CisKKyAgICAvLyBQYXJzZSBwc291cmNlIHN0cmluZzogIjtmaWxlO2Z1bmM7bGluZTtjb2w7OyIKKyAgICBzdHIgPSBsb2MuX2J1bGs7CisgICAgX19rbXBfc3RyX3NwbGl0KHN0ciwgJzsnLCAmZHVtbXksICZzdHIpOworICAgIF9fa21wX3N0cl9zcGxpdChzdHIsICc7JywgJmxvYy5maWxlLCAmc3RyKTsKKyAgICBfX2ttcF9zdHJfc3BsaXQoc3RyLCAnOycsICZsb2MuZnVuYywgJnN0cik7CisgICAgX19rbXBfc3RyX3NwbGl0KHN0ciwgJzsnLCAmbGluZSwgJnN0cik7CisgICAgX19rbXBfc3RyX3NwbGl0KHN0ciwgJzsnLCAmY29sLCAmc3RyKTsKKworICAgIC8vIENvbnZlcnQgbGluZSBhbmQgY29sIGludG8gbnVtYmVyaWMgdmFsdWVzLgorICAgIGlmIChsaW5lICE9IE5VTEwpIHsKKyAgICAgIGxvYy5saW5lID0gYXRvaShsaW5lKTsKKyAgICAgIGlmIChsb2MubGluZSA8IDApIHsKKyAgICAgICAgbG9jLmxpbmUgPSAwOworICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorICAgIGlmIChjb2wgIT0gTlVMTCkgeworICAgICAgbG9jLmNvbCA9IGF0b2koY29sKTsKKyAgICAgIGlmIChsb2MuY29sIDwgMCkgeworICAgICAgICBsb2MuY29sID0gMDsKKyAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKworICB9OyAvLyBpZgorCisgIF9fa21wX3N0cl9mbmFtZV9pbml0KCZsb2MuZm5hbWUsIGluaXRfZm5hbWUgPyBsb2MuZmlsZSA6IE5VTEwpOworCisgIHJldHVybiBsb2M7Cit9IC8vIGttcF9zdHJfbG9jX2luaXQKKwordm9pZCBfX2ttcF9zdHJfbG9jX2ZyZWUoa21wX3N0cl9sb2NfdCAqbG9jKSB7CisgIF9fa21wX3N0cl9mbmFtZV9mcmVlKCZsb2MtPmZuYW1lKTsKKyAgX19rbXBfc3RyX2ZyZWUoQ0NBU1QoY29uc3QgY2hhciAqKiwgJihsb2MtPl9idWxrKSkpOworICBsb2MtPmZpbGUgPSBOVUxMOworICBsb2MtPmZ1bmMgPSBOVUxMOworfSAvLyBrbXBfc3RyX2xvY19mcmVlCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gY29tcGFyZSBmaWxlIG5hbWVzLiBPbiBXaW5kb3dzKiBPUyBmaWxlIG5hbWVzCisgICBhcmUgY2FzZS1pbnNlbnNpdGl2ZSwgc28gZnVuY3Rpb25zIHBlcmZvcm1zIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbi4gT24KKyAgIExpbnV4KiBPUyBpdCBwZXJmb3JtcyBjYXNlLXNlbnNpdGl2ZSBjb21wYXJpc29uLiBOb3RlOiBUaGUgZnVuY3Rpb24gcmV0dXJucworICAgKnRydWUqIGlmIHN0cmluZ3MgYXJlICplcXVhbCouICovCitpbnQgX19rbXBfc3RyX2VxZiggLy8gVHJ1ZSwgaWYgc3RyaW5ncyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS4KKyAgICBjaGFyIGNvbnN0ICpsaHMsIC8vIEZpcnN0IHN0cmluZy4KKyAgICBjaGFyIGNvbnN0ICpyaHMgLy8gU2Vjb25kIHN0cmluZy4KKyAgICApIHsKKyAgaW50IHJlc3VsdDsKKyNpZiBLTVBfT1NfV0lORE9XUworICByZXN1bHQgPSAoX3N0cmljbXAobGhzLCByaHMpID09IDApOworI2Vsc2UKKyAgcmVzdWx0ID0gKHN0cmNtcChsaHMsIHJocykgPT0gMCk7CisjZW5kaWYKKyAgcmV0dXJuIHJlc3VsdDsKK30gLy8gX19rbXBfc3RyX2VxZgorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2Ugc3ByaW50ZiwgYnV0IGl0ICphbGxvY2F0ZXMqIG5ldyBidWZmZXIsIHdoaWNoIG11c3QgYmUKKyAgIGZyZWVkIGV2ZW50dWFsbHkgYnkgX19rbXBfc3RyX2ZyZWUoKS4gVGhlIGZ1bmN0aW9uIGlzIHZlcnkgY29udmVuaWVudCBmb3IKKyAgIGNvbnN0cnVjdGluZyBzdHJpbmdzLCBpdCBzdWNjZXNzZnVsbHkgcmVwbGFjZXMgc3RyZHVwKCksIHN0cmNhdCgpLCBpdCBmcmVlcworICAgcHJvZ3JhbW1lciBmcm9tIGJ1ZmZlciBhbGxvY2F0aW9ucyBhbmQgaGVscHMgdG8gYXZvaWQgYnVmZmVyIG92ZXJmbG93cy4KKyAgIEV4YW1wbGVzOgorCisgICBzdHIgPSBfX2ttcF9zdHJfZm9ybWF0KCIlcyIsIG9yaWcpOyAvL3N0cmR1cCgpIGRvZXNuJ3QgY2FyZSBhYm91dCBidWZmZXIgc2l6ZQorICAgX19rbXBfc3RyX2ZyZWUoICYgc3RyICk7CisgICBzdHIgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMlcyIsIG9yaWcxLCBvcmlnMiApOyAvLyBzdHJjYXQoKSwgZG9lc24ndCBjYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhYm91dCBidWZmZXIgc2l6ZS4KKyAgIF9fa21wX3N0cl9mcmVlKCAmIHN0ciApOworICAgc3RyID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzLyVzLnR4dCIsIHBhdGgsIGZpbGUgKTsgLy8gY29uc3RydWN0aW5nIHN0cmluZy4KKyAgIF9fa21wX3N0cl9mcmVlKCAmIHN0ciApOworCisgICBQZXJmb3JtYW5jZSBub3RlOgorICAgVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgbWVtb3J5IHdpdGggbWFsbG9jKCkgY2FsbHMsIHNvIGRvIG5vdCBjYWxsIGl0IGZyb20KKyAgIHBlcmZvcm1hbmNlLWNyaXRpY2FsIGNvZGUuIEluIHBlcmZvcm1hbmNlLWNyaXRpY2FsIGNvZGUgY29uc2lkZXIgdXNpbmcKKyAgIGttcF9zdHJfYnVmX3QgaW5zdGVhZCwgc2luY2UgaXQgdXNlcyBzdGFjay1hbGxvY2F0ZWQgYnVmZmVyIGZvciBzaG9ydAorICAgc3RyaW5ncy4KKworICAgV2h5IGRvZXMgdGhpcyBmdW5jdGlvbiB1c2UgbWFsbG9jKCk/CisgICAxLiBfX2ttcF9hbGxvY2F0ZSgpIHJldHVybnMgY2FjaGUtYWxpZ25lZCBtZW1vcnkgYWxsb2NhdGVkIHdpdGggbWFsbG9jKCkuCisgICAgICBUaGVyZSBhcmUgbm8gcmVhc29ucyBpbiB1c2luZyBfX2ttcF9hbGxvY2F0ZSgpIGZvciBzdHJpbmdzIGR1ZSB0byBleHRyYQorICAgICAgb3ZlcmhlYWQgd2hpbGUgY2FjaGUtYWxpZ25lZCBtZW1vcnkgaXMgbm90IG5lY2Vzc2FyeS4KKyAgIDIuIF9fa21wX3RocmVhZF9tYWxsb2MoKSBjYW5ub3QgYmUgdXNlZCBiZWNhdXNlIGl0IHJlcXVpcmVzIHBvaW50ZXIgdG8gdGhyZWFkCisgICAgICBzdHJ1Y3R1cmUuIFdlIG5lZWQgdG8gcGVyZm9ybSBzdHJpbmcgb3BlcmF0aW9ucyBkdXJpbmcgbGlicmFyeSBzdGFydHVwCisgICAgICAoZm9yIGV4YW1wbGUsIGluIF9fa21wX3JlZ2lzdGVyX2xpYnJhcnlfc3RhcnR1cCgpKSB3aGVuIG5vIHRocmVhZAorICAgICAgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkIHlldC4KKyAgIFNvIHN0YW5kYXJkIG1hbGxvYygpIGlzIHRoZSBvbmx5IGF2YWlsYWJsZSBvcHRpb24uCisqLworCitjaGFyICpfX2ttcF9zdHJfZm9ybWF0KCAvLyBBbGxvY2F0ZWQgc3RyaW5nLgorICAgIGNoYXIgY29uc3QgKmZvcm1hdCwgLy8gRm9ybWF0IHN0cmluZy4KKyAgICAuLi4gLy8gT3RoZXIgcGFyYW1ldGVycy4KKyAgICApIHsKKyAgdmFfbGlzdCBhcmdzOworICBpbnQgc2l6ZSA9IDUxMjsKKyAgY2hhciAqYnVmZmVyID0gTlVMTDsKKyAgaW50IHJjOworCisgIC8vIEFsbG9jYXRlIGJ1ZmZlci4KKyAgYnVmZmVyID0gKGNoYXIgKilLTVBfSU5URVJOQUxfTUFMTE9DKHNpemUpOworICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICBLTVBfRkFUQUwoTWVtb3J5QWxsb2NGYWlsZWQpOworICB9OyAvLyBpZgorCisgIGZvciAoOzspIHsKKyAgICAvLyBUcnkgdG8gZm9ybWF0IHN0cmluZy4KKyAgICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOworICAgIHJjID0gS01QX1ZTTlBSSU5URihidWZmZXIsIHNpemUsIGZvcm1hdCwgYXJncyk7CisgICAgdmFfZW5kKGFyZ3MpOworCisgICAgLy8gTm8gZXJyb3JzLCBzdHJpbmcgaGFzIGJlZW4gZm9ybWF0dGVkLgorICAgIGlmIChyYyA+PSAwICYmIHJjIDwgc2l6ZSkgeworICAgICAgYnJlYWs7CisgICAgfTsgLy8gaWYKKworICAgIC8vIEVycm9yIG9jY3VycmVkLCBidWZmZXIgaXMgdG9vIHNtYWxsLgorICAgIGlmIChyYyA+PSAwKSB7CisgICAgICAvLyBDOTktY29uZm9ybWluZyBpbXBsZW1lbnRhdGlvbiBvZiB2c25wcmludGYgcmV0dXJucyByZXF1aXJlZCBidWZmZXIKKyAgICAgIC8vIHNpemUuCisgICAgICBzaXplID0gcmMgKyAxOworICAgIH0gZWxzZSB7CisgICAgICAvLyBPbGRlciBpbXBsZW1lbnRhdGlvbnMganVzdCByZXR1cm4gLTEuCisgICAgICBzaXplID0gc2l6ZSAqIDI7CisgICAgfTsgLy8gaWYKKworICAgIC8vIEVubGFyZ2UgYnVmZmVyIGFuZCB0cnkgYWdhaW4uCisgICAgYnVmZmVyID0gKGNoYXIgKilLTVBfSU5URVJOQUxfUkVBTExPQyhidWZmZXIsIHNpemUpOworICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgS01QX0ZBVEFMKE1lbW9yeUFsbG9jRmFpbGVkKTsKKyAgICB9OyAvLyBpZgorICB9OyAvLyBmb3JldmVyCisKKyAgcmV0dXJuIGJ1ZmZlcjsKK30gLy8gZnVuYyBfX2ttcF9zdHJfZm9ybWF0CisKK3ZvaWQgX19rbXBfc3RyX2ZyZWUoY2hhciBjb25zdCAqKnN0cikgeworICBLTVBfREVCVUdfQVNTRVJUKHN0ciAhPSBOVUxMKTsKKyAgS01QX0lOVEVSTkFMX0ZSRUUoQ0NBU1QoY2hhciAqLCAqc3RyKSk7CisgICpzdHIgPSBOVUxMOworfSAvLyBmdW5jIF9fa21wX3N0cl9mcmVlCisKKy8qIElmIGxlbiBpcyB6ZXJvLCByZXR1cm5zIHRydWUgaWZmIHRhcmdldCBhbmQgZGF0YSBoYXZlIGV4YWN0IGNhc2UtaW5zZW5zaXRpdmUKKyAgIG1hdGNoLiBJZiBsZW4gaXMgbmVnYXRpdmUsIHJldHVybnMgdHJ1ZSBpZmYgdGFyZ2V0IGlzIGEgY2FzZS1pbnNlbnNpdGl2ZQorICAgc3Vic3RyaW5nIG9mIGRhdGEuIElmIGxlbiBpcyBwb3NpdGl2ZSwgcmV0dXJucyB0cnVlIGlmZiB0YXJnZXQgaXMgYQorICAgY2FzZS1pbnNlbnNpdGl2ZSBzdWJzdHJpbmcgb2YgZGF0YSBvciB2aWNlIHZlcnNhLCBhbmQgbmVpdGhlciBpcyBzaG9ydGVyIHRoYW4KKyAgIGxlbi4gKi8KK2ludCBfX2ttcF9zdHJfbWF0Y2goY2hhciBjb25zdCAqdGFyZ2V0LCBpbnQgbGVuLCBjaGFyIGNvbnN0ICpkYXRhKSB7CisgIGludCBpOworICBpZiAodGFyZ2V0ID09IE5VTEwgfHwgZGF0YSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9OyAvLyBpZgorICBmb3IgKGkgPSAwOyB0YXJnZXRbaV0gJiYgZGF0YVtpXTsgKytpKSB7CisgICAgaWYgKFRPTE9XRVIodGFyZ2V0W2ldKSAhPSBUT0xPV0VSKGRhdGFbaV0pKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfTsgLy8gaWYKKyAgfTsgLy8gZm9yIGkKKyAgcmV0dXJuICgobGVuID4gMCkgPyBpID49IGxlbiA6ICghdGFyZ2V0W2ldICYmIChsZW4gfHwgIWRhdGFbaV0pKSk7Cit9IC8vIF9fa21wX3N0cl9tYXRjaAorCitpbnQgX19rbXBfc3RyX21hdGNoX2ZhbHNlKGNoYXIgY29uc3QgKmRhdGEpIHsKKyAgaW50IHJlc3VsdCA9CisgICAgICBfX2ttcF9zdHJfbWF0Y2goImZhbHNlIiwgMSwgZGF0YSkgfHwgX19rbXBfc3RyX21hdGNoKCJvZmYiLCAyLCBkYXRhKSB8fAorICAgICAgX19rbXBfc3RyX21hdGNoKCIwIiwgMSwgZGF0YSkgfHwgX19rbXBfc3RyX21hdGNoKCIuZmFsc2UuIiwgMiwgZGF0YSkgfHwKKyAgICAgIF9fa21wX3N0cl9tYXRjaCgiLmYuIiwgMiwgZGF0YSkgfHwgX19rbXBfc3RyX21hdGNoKCJubyIsIDEsIGRhdGEpOworICByZXR1cm4gcmVzdWx0OworfSAvLyBfX2ttcF9zdHJfbWF0Y2hfZmFsc2UKKworaW50IF9fa21wX3N0cl9tYXRjaF90cnVlKGNoYXIgY29uc3QgKmRhdGEpIHsKKyAgaW50IHJlc3VsdCA9CisgICAgICBfX2ttcF9zdHJfbWF0Y2goInRydWUiLCAxLCBkYXRhKSB8fCBfX2ttcF9zdHJfbWF0Y2goIm9uIiwgMiwgZGF0YSkgfHwKKyAgICAgIF9fa21wX3N0cl9tYXRjaCgiMSIsIDEsIGRhdGEpIHx8IF9fa21wX3N0cl9tYXRjaCgiLnRydWUuIiwgMiwgZGF0YSkgfHwKKyAgICAgIF9fa21wX3N0cl9tYXRjaCgiLnQuIiwgMiwgZGF0YSkgfHwgX19rbXBfc3RyX21hdGNoKCJ5ZXMiLCAxLCBkYXRhKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30gLy8gX19rbXBfc3RyX21hdGNoX3RydWUKKwordm9pZCBfX2ttcF9zdHJfcmVwbGFjZShjaGFyICpzdHIsIGNoYXIgc2VhcmNoX2ZvciwgY2hhciByZXBsYWNlX3dpdGgpIHsKKyAgY2hhciAqZm91bmQgPSBOVUxMOworCisgIGZvdW5kID0gc3RyY2hyKHN0ciwgc2VhcmNoX2Zvcik7CisgIHdoaWxlIChmb3VuZCkgeworICAgICpmb3VuZCA9IHJlcGxhY2Vfd2l0aDsKKyAgICBmb3VuZCA9IHN0cmNocihmb3VuZCArIDEsIHNlYXJjaF9mb3IpOworICB9OyAvLyB3aGlsZQorfSAvLyBfX2ttcF9zdHJfcmVwbGFjZQorCit2b2lkIF9fa21wX3N0cl9zcGxpdChjaGFyICpzdHIsIC8vIEk6IFN0cmluZyB0byBzcGxpdC4KKyAgICAgICAgICAgICAgICAgICAgIGNoYXIgZGVsaW0sIC8vIEk6IENoYXJhY3RlciB0byBzcGxpdCBvbi4KKyAgICAgICAgICAgICAgICAgICAgIGNoYXIgKipoZWFkLCAvLyBPOiBQb2ludGVyIHRvIGhlYWQgKG1heSBiZSBOVUxMKS4KKyAgICAgICAgICAgICAgICAgICAgIGNoYXIgKip0YWlsIC8vIE86IFBvaW50ZXIgdG8gdGFpbCAobWF5IGJlIE5VTEwpLgorICAgICAgICAgICAgICAgICAgICAgKSB7CisgIGNoYXIgKmggPSBzdHI7CisgIGNoYXIgKnQgPSBOVUxMOworICBpZiAoc3RyICE9IE5VTEwpIHsKKyAgICBjaGFyICpwdHIgPSBzdHJjaHIoc3RyLCBkZWxpbSk7CisgICAgaWYgKHB0ciAhPSBOVUxMKSB7CisgICAgICAqcHRyID0gMDsKKyAgICAgIHQgPSBwdHIgKyAxOworICAgIH07IC8vIGlmCisgIH07IC8vIGlmCisgIGlmIChoZWFkICE9IE5VTEwpIHsKKyAgICAqaGVhZCA9IGg7CisgIH07IC8vIGlmCisgIGlmICh0YWlsICE9IE5VTEwpIHsKKyAgICAqdGFpbCA9IHQ7CisgIH07IC8vIGlmCit9IC8vIF9fa21wX3N0cl9zcGxpdAorCisvKiBzdHJ0b2tfcigpIGlzIG5vdCBhdmFpbGFibGUgb24gV2luZG93cyogT1MuIFRoaXMgZnVuY3Rpb24gcmVpbXBsZW1lbnRzCisgICBzdHJ0b2tfcigpLiAqLworY2hhciAqX19rbXBfc3RyX3Rva2VuKAorICAgIGNoYXIgKnN0ciwgLy8gU3RyaW5nIHRvIHNwbGl0IGludG8gdG9rZW5zLiBOb3RlOiBTdHJpbmcgKmlzKiBtb2RpZmllZCEKKyAgICBjaGFyIGNvbnN0ICpkZWxpbSwgLy8gRGVsaW1pdGVycy4KKyAgICBjaGFyICoqYnVmIC8vIEludGVybmFsIGJ1ZmZlci4KKyAgICApIHsKKyAgY2hhciAqdG9rZW4gPSBOVUxMOworI2lmIEtNUF9PU19XSU5ET1dTCisgIC8vIE9uIFdpbmRvd3MqIE9TIHRoZXJlIGlzIG5vIHN0cnRva19yKCkgZnVuY3Rpb24uIExldCB1cyBpbXBsZW1lbnQgaXQuCisgIGlmIChzdHIgIT0gTlVMTCkgeworICAgICpidWYgPSBzdHI7IC8vIEZpcnN0IGNhbGwsIGluaXRpYWxpemUgYnVmLgorICB9OyAvLyBpZgorICAqYnVmICs9IHN0cnNwbigqYnVmLCBkZWxpbSk7IC8vIFNraXAgbGVhZGluZyBkZWxpbWl0ZXJzLgorICBpZiAoKipidWYgIT0gMCkgeyAvLyBSZXN0IG9mIHRoZSBzdHJpbmcgaXMgbm90IHlldCBlbXB0eS4KKyAgICB0b2tlbiA9ICpidWY7IC8vIFVzZSBpdCBhcyByZXN1bHQuCisgICAgKmJ1ZiArPSBzdHJjc3BuKCpidWYsIGRlbGltKTsgLy8gU2tpcCBub24tZGVsaW1pdGVycy4KKyAgICBpZiAoKipidWYgIT0gMCkgeyAvLyBSZXN0IG9mIHRoZSBzdHJpbmcgaXMgbm90IHlldCBlbXB0eS4KKyAgICAgICoqYnVmID0gMDsgLy8gVGVybWluYXRlIHRva2VuIGhlcmUuCisgICAgICAqYnVmICs9IDE7IC8vIEFkdmFuY2UgYnVmIHRvIHN0YXJ0IHdpdGggdGhlIG5leHQgdG9rZW4gbmV4dCB0aW1lLgorICAgIH07IC8vIGlmCisgIH07IC8vIGlmCisjZWxzZQorICAvLyBPbiBMaW51eCogT1MgYW5kIE9TIFgqLCBzdHJ0b2tfcigpIGlzIGF2YWlsYWJsZS4gTGV0IHVzIHVzZSBpdC4KKyAgdG9rZW4gPSBzdHJ0b2tfcihzdHIsIGRlbGltLCBidWYpOworI2VuZGlmCisgIHJldHVybiB0b2tlbjsKK307IC8vIF9fa21wX3N0cl90b2tlbgorCitpbnQgX19rbXBfc3RyX3RvX2ludChjaGFyIGNvbnN0ICpzdHIsIGNoYXIgc2VudGluZWwpIHsKKyAgaW50IHJlc3VsdCwgZmFjdG9yOworICBjaGFyIGNvbnN0ICp0OworCisgIHJlc3VsdCA9IDA7CisKKyAgZm9yICh0ID0gc3RyOyAqdCAhPSAnXDAnOyArK3QpIHsKKyAgICBpZiAoKnQgPCAnMCcgfHwgKnQgPiAnOScpCisgICAgICBicmVhazsKKyAgICByZXN1bHQgPSAocmVzdWx0ICogMTApICsgKCp0IC0gJzAnKTsKKyAgfQorCisgIHN3aXRjaCAoKnQpIHsKKyAgY2FzZSAnXDAnOiAvKiB0aGUgY3VycmVudCBkZWZhdWx0IGZvciBubyBzdWZmaXggaXMgYnl0ZXMgKi8KKyAgICBmYWN0b3IgPSAxOworICAgIGJyZWFrOworICBjYXNlICdiJzoKKyAgY2FzZSAnQic6IC8qIGJ5dGVzICovCisgICAgKyt0OworICAgIGZhY3RvciA9IDE7CisgICAgYnJlYWs7CisgIGNhc2UgJ2snOgorICBjYXNlICdLJzogLyoga2lsby1ieXRlcyAqLworICAgICsrdDsKKyAgICBmYWN0b3IgPSAxMDI0OworICAgIGJyZWFrOworICBjYXNlICdtJzoKKyAgY2FzZSAnTSc6IC8qIG1lZ2EtYnl0ZXMgKi8KKyAgICArK3Q7CisgICAgZmFjdG9yID0gKDEwMjQgKiAxMDI0KTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBpZiAoKnQgIT0gc2VudGluZWwpCisgICAgICByZXR1cm4gKC0xKTsKKyAgICB0ID0gIiI7CisgICAgZmFjdG9yID0gMTsKKyAgfQorCisgIGlmIChyZXN1bHQgPiAoSU5UX01BWCAvIGZhY3RvcikpCisgICAgcmVzdWx0ID0gSU5UX01BWDsKKyAgZWxzZQorICAgIHJlc3VsdCAqPSBmYWN0b3I7CisKKyAgcmV0dXJuICgqdCAhPSAwID8gMCA6IHJlc3VsdCk7Cit9IC8vIF9fa21wX3N0cl90b19pbnQKKworLyogVGhlIHJvdXRpbmUgcGFyc2VzIGlucHV0IHN0cmluZy4gSXQgaXMgZXhwZWN0ZWQgaXQgaXMgYSB1bnNpZ25lZCBpbnRlZ2VyIHdpdGgKKyAgIG9wdGlvbmFsIHVuaXQuIFVuaXRzIGFyZTogImIiIGZvciBieXRlcywgImtiIiBvciBqdXN0ICJrIiBmb3Iga2lsb2J5dGVzLCAibWIiCisgICBvciAibSIgZm9yIG1lZ2FieXRlcywgLi4uLCAieWIiIG9yICJ5IiBmb3IgeW90dGFieXRlcy4gOi0pIFVuaXQgbmFtZSBpcworICAgY2FzZS1pbnNlbnNpdGl2ZS4gVGhlIHJvdXRpbmUgcmV0dXJucyAwIGlmIGV2ZXJ5dGhpbmcgaXMgb2ssIG9yIGVycm9yIGNvZGU6CisgICAtMSBpbiBjYXNlIG9mIG92ZXJmbG93LCAtMiBpbiBjYXNlIG9mIHVua25vd24gdW5pdC4gKnNpemUgaXMgc2V0IHRvIHBhcnNlZAorICAgdmFsdWUuIEluIGNhc2Ugb2Ygb3ZlcmZsb3cgKnNpemUgaXMgc2V0IHRvIEtNUF9TSVpFX1RfTUFYLCBpbiBjYXNlIG9mIHVua25vd24KKyAgIHVuaXQgKnNpemUgaXMgc2V0IHRvIHplcm8uICovCit2b2lkIF9fa21wX3N0cl90b19zaXplKCAvLyBSOiBFcnJvciBjb2RlLgorICAgIGNoYXIgY29uc3QgKnN0ciwgLy8gSTogU3RyaW5nIG9mIGNoYXJhY3RlcnMsIHVuc2lnbmVkIG51bWJlciBhbmQgdW5pdCAoImIiLAorICAgIC8vICJrYiIsIGV0YykuCisgICAgc2l6ZV90ICpvdXQsIC8vIE86IFBhcnNlZCBudW1iZXIuCisgICAgc2l6ZV90IGRmYWN0b3IsIC8vIEk6IFRoZSBmYWN0b3IgaWYgbm9uZSBvZiB0aGUgbGV0dGVycyBzcGVjaWZpZWQuCisgICAgY2hhciBjb25zdCAqKmVycm9yIC8vIE86IE51bGwgaWYgZXZlcnl0aGluZyBpcyBvaywgZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UuCisgICAgKSB7CisKKyAgc2l6ZV90IHZhbHVlID0gMDsKKyAgc2l6ZV90IGZhY3RvciA9IDA7CisgIGludCBvdmVyZmxvdyA9IDA7CisgIGludCBpID0gMDsKKyAgaW50IGRpZ2l0OworCisgIEtNUF9ERUJVR19BU1NFUlQoc3RyICE9IE5VTEwpOworCisgIC8vIFNraXAgc3BhY2VzLgorICB3aGlsZSAoc3RyW2ldID09ICcgJyB8fCBzdHJbaV0gPT0gJ1x0JykgeworICAgICsraTsKKyAgfTsgLy8gd2hpbGUKKworICAvLyBQYXJzZSBudW1iZXIuCisgIGlmIChzdHJbaV0gPCAnMCcgfHwgc3RyW2ldID4gJzknKSB7CisgICAgKmVycm9yID0gS01QX0kxOE5fU1RSKE5vdEFOdW1iZXIpOworICAgIHJldHVybjsKKyAgfTsgLy8gaWYKKyAgZG8geworICAgIGRpZ2l0ID0gc3RyW2ldIC0gJzAnOworICAgIG92ZXJmbG93ID0gb3ZlcmZsb3cgfHwgKHZhbHVlID4gKEtNUF9TSVpFX1RfTUFYIC0gZGlnaXQpIC8gMTApOworICAgIHZhbHVlID0gKHZhbHVlICogMTApICsgZGlnaXQ7CisgICAgKytpOworICB9IHdoaWxlIChzdHJbaV0gPj0gJzAnICYmIHN0cltpXSA8PSAnOScpOworCisgIC8vIFNraXAgc3BhY2VzLgorICB3aGlsZSAoc3RyW2ldID09ICcgJyB8fCBzdHJbaV0gPT0gJ1x0JykgeworICAgICsraTsKKyAgfTsgLy8gd2hpbGUKKworLy8gUGFyc2UgdW5pdC4KKyNkZWZpbmUgX2Nhc2UoY2gsIGV4cCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNhc2UgY2g6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjYXNlIGNoIC0gKCdhJyAtICdBJyk6IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzaXplX3Qgc2hpZnQgPSAoZXhwKSoxMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKytpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChzaGlmdCA8IHNpemVvZihzaXplX3QpICogOCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGZhY3RvciA9IChzaXplX3QpKDEpIDw8IHNoaWZ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgb3ZlcmZsb3cgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gYnJlYWs7CisgIHN3aXRjaCAoc3RyW2ldKSB7CisgICAgX2Nhc2UoJ2snLCAxKTsgLy8gS2lsbworICAgIF9jYXNlKCdtJywgMik7IC8vIE1lZ2EKKyAgICBfY2FzZSgnZycsIDMpOyAvLyBHaWdhCisgICAgX2Nhc2UoJ3QnLCA0KTsgLy8gVGVyYQorICAgIF9jYXNlKCdwJywgNSk7IC8vIFBldGEKKyAgICBfY2FzZSgnZScsIDYpOyAvLyBFeGEKKyAgICBfY2FzZSgneicsIDcpOyAvLyBaZXR0YQorICAgIF9jYXNlKCd5JywgOCk7IC8vIFlvdHRhCisgICAgLy8gT29wcy4gTm8gbW9yZSB1bml0cy4uLgorICB9OyAvLyBzd2l0Y2gKKyN1bmRlZiBfY2FzZQorICBpZiAoc3RyW2ldID09ICdiJyB8fCBzdHJbaV0gPT0gJ0InKSB7IC8vIFNraXAgb3B0aW9uYWwgImIiLgorICAgIGlmIChmYWN0b3IgPT0gMCkgeworICAgICAgZmFjdG9yID0gMTsKKyAgICB9CisgICAgKytpOworICB9OyAvLyBpZgorICBpZiAoIShzdHJbaV0gPT0gJyAnIHx8IHN0cltpXSA9PSAnXHQnIHx8IHN0cltpXSA9PSAwKSkgeyAvLyBCYWQgdW5pdAorICAgICplcnJvciA9IEtNUF9JMThOX1NUUihCYWRVbml0KTsKKyAgICByZXR1cm47CisgIH07IC8vIGlmCisKKyAgaWYgKGZhY3RvciA9PSAwKSB7CisgICAgZmFjdG9yID0gZGZhY3RvcjsKKyAgfQorCisgIC8vIEFwcGx5IGZhY3Rvci4KKyAgb3ZlcmZsb3cgPSBvdmVyZmxvdyB8fCAodmFsdWUgPiAoS01QX1NJWkVfVF9NQVggLyBmYWN0b3IpKTsKKyAgdmFsdWUgKj0gZmFjdG9yOworCisgIC8vIFNraXAgc3BhY2VzLgorICB3aGlsZSAoc3RyW2ldID09ICcgJyB8fCBzdHJbaV0gPT0gJ1x0JykgeworICAgICsraTsKKyAgfTsgLy8gd2hpbGUKKworICBpZiAoc3RyW2ldICE9IDApIHsKKyAgICAqZXJyb3IgPSBLTVBfSTE4Tl9TVFIoSWxsZWdhbENoYXJhY3RlcnMpOworICAgIHJldHVybjsKKyAgfTsgLy8gaWYKKworICBpZiAob3ZlcmZsb3cpIHsKKyAgICAqZXJyb3IgPSBLTVBfSTE4Tl9TVFIoVmFsdWVUb29MYXJnZSk7CisgICAgKm91dCA9IEtNUF9TSVpFX1RfTUFYOworICAgIHJldHVybjsKKyAgfTsgLy8gaWYKKworICAqZXJyb3IgPSBOVUxMOworICAqb3V0ID0gdmFsdWU7Cit9IC8vIF9fa21wX3N0cl90b19zaXplCisKK3ZvaWQgX19rbXBfc3RyX3RvX3VpbnQoIC8vIFI6IEVycm9yIGNvZGUuCisgICAgY2hhciBjb25zdCAqc3RyLCAvLyBJOiBTdHJpbmcgb2YgY2hhcmFjdGVycywgdW5zaWduZWQgbnVtYmVyLgorICAgIGttcF91aW50NjQgKm91dCwgLy8gTzogUGFyc2VkIG51bWJlci4KKyAgICBjaGFyIGNvbnN0ICoqZXJyb3IgLy8gTzogTnVsbCBpZiBldmVyeXRoaW5nIGlzIG9rLCBlcnJvciBtZXNzYWdlIG90aGVyd2lzZS4KKyAgICApIHsKKyAgc2l6ZV90IHZhbHVlID0gMDsKKyAgaW50IG92ZXJmbG93ID0gMDsKKyAgaW50IGkgPSAwOworICBpbnQgZGlnaXQ7CisKKyAgS01QX0RFQlVHX0FTU0VSVChzdHIgIT0gTlVMTCk7CisKKyAgLy8gU2tpcCBzcGFjZXMuCisgIHdoaWxlIChzdHJbaV0gPT0gJyAnIHx8IHN0cltpXSA9PSAnXHQnKSB7CisgICAgKytpOworICB9OyAvLyB3aGlsZQorCisgIC8vIFBhcnNlIG51bWJlci4KKyAgaWYgKHN0cltpXSA8ICcwJyB8fCBzdHJbaV0gPiAnOScpIHsKKyAgICAqZXJyb3IgPSBLTVBfSTE4Tl9TVFIoTm90QU51bWJlcik7CisgICAgcmV0dXJuOworICB9OyAvLyBpZgorICBkbyB7CisgICAgZGlnaXQgPSBzdHJbaV0gLSAnMCc7CisgICAgb3ZlcmZsb3cgPSBvdmVyZmxvdyB8fCAodmFsdWUgPiAoS01QX1NJWkVfVF9NQVggLSBkaWdpdCkgLyAxMCk7CisgICAgdmFsdWUgPSAodmFsdWUgKiAxMCkgKyBkaWdpdDsKKyAgICArK2k7CisgIH0gd2hpbGUgKHN0cltpXSA+PSAnMCcgJiYgc3RyW2ldIDw9ICc5Jyk7CisKKyAgLy8gU2tpcCBzcGFjZXMuCisgIHdoaWxlIChzdHJbaV0gPT0gJyAnIHx8IHN0cltpXSA9PSAnXHQnKSB7CisgICAgKytpOworICB9OyAvLyB3aGlsZQorCisgIGlmIChzdHJbaV0gIT0gMCkgeworICAgICplcnJvciA9IEtNUF9JMThOX1NUUihJbGxlZ2FsQ2hhcmFjdGVycyk7CisgICAgcmV0dXJuOworICB9OyAvLyBpZgorCisgIGlmIChvdmVyZmxvdykgeworICAgICplcnJvciA9IEtNUF9JMThOX1NUUihWYWx1ZVRvb0xhcmdlKTsKKyAgICAqb3V0ID0gKGttcF91aW50NjQpLTE7CisgICAgcmV0dXJuOworICB9OyAvLyBpZgorCisgICplcnJvciA9IE5VTEw7CisgICpvdXQgPSB2YWx1ZTsKK30gLy8gX19rbXBfc3RyX3RvX3VuaXQKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdHIuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTk4MzBhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3N0ci5oCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICoga21wX3N0ci5oIC0tIFN0cmluZyBtYW5pcHVsYXRpb24gcm91dGluZXMuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX1NUUl9ICisjZGVmaW5lIEtNUF9TVFJfSAorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJrbXBfb3MuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjaWYgS01QX09TX1dJTkRPV1MKKyNkZWZpbmUgc3RyZHVwIF9zdHJkdXAKKyNlbmRpZgorCisvKiAgc29tZSBtYWNyb3MgdG8gcmVwbGFjZSBjdHlwZS5oIGZ1bmN0aW9ucyAgKi8KKyNkZWZpbmUgVE9MT1dFUihjKSAoKCgoYykgPj0gJ0EnKSAmJiAoKGMpIDw9ICdaJykpID8gKChjKSArICdhJyAtICdBJykgOiAoYykpCisKK3N0cnVjdCBrbXBfc3RyX2J1ZiB7CisgIGNoYXIgKnN0cjsgLy8gUG9pbnRlciB0byBidWZmZXIgY29udGVudCwgcmVhZCBvbmx5LgorICB1bnNpZ25lZCBpbnQgc2l6ZTsgLy8gRG8gbm90IGNoYW5nZSB0aGlzIGZpZWxkIQorICBpbnQgdXNlZDsgLy8gTnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZCB0byBidWZmZXIsIHJlYWQgb25seS4KKyAgY2hhciBidWxrWzUxMl07IC8vIERvIG5vdCB1c2UgdGhpcyBmaWVsZCEKK307IC8vIHN0cnVjdCBrbXBfc3RyX2J1ZgordHlwZWRlZiBzdHJ1Y3Qga21wX3N0cl9idWYga21wX3N0cl9idWZfdDsKKworI2RlZmluZSBfX2ttcF9zdHJfYnVmX2luaXQoYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGIpLT5zdHIgPSAoYiktPmJ1bGs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChiKS0+c2l6ZSA9IHNpemVvZigoYiktPmJ1bGspOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoYiktPnVzZWQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGIpLT5idWxrWzBdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKK3ZvaWQgX19rbXBfc3RyX2J1Zl9jbGVhcihrbXBfc3RyX2J1Zl90ICpidWZmZXIpOwordm9pZCBfX2ttcF9zdHJfYnVmX3Jlc2VydmUoa21wX3N0cl9idWZfdCAqYnVmZmVyLCBpbnQgc2l6ZSk7Cit2b2lkIF9fa21wX3N0cl9idWZfZGV0YWNoKGttcF9zdHJfYnVmX3QgKmJ1ZmZlcik7Cit2b2lkIF9fa21wX3N0cl9idWZfZnJlZShrbXBfc3RyX2J1Zl90ICpidWZmZXIpOwordm9pZCBfX2ttcF9zdHJfYnVmX2NhdChrbXBfc3RyX2J1Zl90ICpidWZmZXIsIGNoYXIgY29uc3QgKnN0ciwgaW50IGxlbik7Cit2b2lkIF9fa21wX3N0cl9idWZfdnByaW50KGttcF9zdHJfYnVmX3QgKmJ1ZmZlciwgY2hhciBjb25zdCAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IGFyZ3MpOwordm9pZCBfX2ttcF9zdHJfYnVmX3ByaW50KGttcF9zdHJfYnVmX3QgKmJ1ZmZlciwgY2hhciBjb25zdCAqZm9ybWF0LCAuLi4pOwordm9pZCBfX2ttcF9zdHJfYnVmX3ByaW50X3NpemUoa21wX3N0cl9idWZfdCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisKKy8qIEZpbGUgbmFtZSBwYXJzZXIuCisgICBVc2FnZToKKworICAga21wX3N0cl9mbmFtZV90IGZuYW1lID0gX19rbXBfc3RyX2ZuYW1lX2luaXQoIHBhdGggKTsKKyAgIC8vIFVzZSBmbmFtZS5wYXRoIChjb3B5IG9mIG9yaWdpbmFsIHBhdGggKSwgZm5hbWUuZGlyLCBmbmFtZS5iYXNlLgorICAgLy8gTm90ZSBmbmFtZS5kaXIgY29uY2F0ZW5hdGVkIHdpdGggZm5hbWUuYmFzZSBnaXZlcyBleGFjdCBjb3B5IG9mIHBhdGguCisgICBfX2ttcF9zdHJfZm5hbWVfZnJlZSggJiBmbmFtZSApOworKi8KK3N0cnVjdCBrbXBfc3RyX2ZuYW1lIHsKKyAgY2hhciAqcGF0aDsKKyAgY2hhciAqZGlyOworICBjaGFyICpiYXNlOworfTsgLy8gc3RydWN0IGttcF9zdHJfZm5hbWUKK3R5cGVkZWYgc3RydWN0IGttcF9zdHJfZm5hbWUga21wX3N0cl9mbmFtZV90Owordm9pZCBfX2ttcF9zdHJfZm5hbWVfaW5pdChrbXBfc3RyX2ZuYW1lX3QgKmZuYW1lLCBjaGFyIGNvbnN0ICpwYXRoKTsKK3ZvaWQgX19rbXBfc3RyX2ZuYW1lX2ZyZWUoa21wX3N0cl9mbmFtZV90ICpmbmFtZSk7CisvLyBDb21wYXJlcyBmaWxlIG5hbWUgd2l0aCBzcGVjaWZpZWQgcGF0ZXJuLiBJZiBwYXR0ZXJuIGlzIE5VTEwsIGFueSBmbmFtZQorLy8gbWF0Y2hlZC4KK2ludCBfX2ttcF9zdHJfZm5hbWVfbWF0Y2goa21wX3N0cl9mbmFtZV90IGNvbnN0ICpmbmFtZSwgY2hhciBjb25zdCAqcGF0dGVybik7CisKKy8qIFRoZSBjb21waWxlciBwcm92aWRlcyBzb3VyY2UgbG9jYXRpb25zIGluIHN0cmluZyBmb3JtCisgICAiO2ZpbGU7ZnVuYztsaW5lO2NvbDs7Ii4gSXQgaXMgbm90IGNvbnZlbmllbnQgZm9yIG1hbnVwdWxhdGlvbi4gVGhpcworICAgc3RydWN0dXJlIGtlZXBzIHNvdXJjZSBsb2NhdGlvbiBpbiBtb3JlIGNvbnZlbmllbnQgZm9ybS4KKyAgIFVzYWdlOgorCisgICBrbXBfc3RyX2xvY190IGxvYyA9IF9fa21wX3N0cl9sb2NfaW5pdCggaWRlbnQtPnBzb3VyY2UsIDAgKTsKKyAgIC8vIHVzZSBsb2MuZmlsZSwgbG9jLmZ1bmMsIGxvYy5saW5lLCBsb2MuY29sLgorICAgLy8gbG9jLmZuYW1lIGlzIGF2YWlsYWJsZSBpZiBzZWNvbmQgYXJndW1lbnQgb2YgX19rbXBfc3RyX2xvY19pbml0IGlzIHRydWUuCisgICBfX2ttcF9zdHJfbG9jX2ZyZWUoICYgbG9jICk7CisKKyAgIElmIHBzb3VyY2UgaXMgTlVMTCBvciBkb2VzIG5vdCBmb2xsb3cgZm9ybWF0IGFib3ZlLCBmaWxlIGFuZC9vciBmdW5jIG1heSBiZQorICAgTlVMTCBwb2ludGVycy4KKyovCitzdHJ1Y3Qga21wX3N0cl9sb2MgeworICBjaGFyICpfYnVsazsgLy8gRG8gbm90IHVzZSB0aGlkIGZpZWxkLgorICBrbXBfc3RyX2ZuYW1lX3QgZm5hbWU7IC8vIFdpbGwgYmUgaW5pdGlhbGl6ZWQgaWYgaW5pdF9mbmFtZSBpcyB0cnVlLgorICBjaGFyICpmaWxlOworICBjaGFyICpmdW5jOworICBpbnQgbGluZTsKKyAgaW50IGNvbDsKK307IC8vIHN0cnVjdCBrbXBfc3RyX2xvYwordHlwZWRlZiBzdHJ1Y3Qga21wX3N0cl9sb2Mga21wX3N0cl9sb2NfdDsKK2ttcF9zdHJfbG9jX3QgX19rbXBfc3RyX2xvY19pbml0KGNoYXIgY29uc3QgKnBzb3VyY2UsIGludCBpbml0X2ZuYW1lKTsKK3ZvaWQgX19rbXBfc3RyX2xvY19mcmVlKGttcF9zdHJfbG9jX3QgKmxvYyk7CisKK2ludCBfX2ttcF9zdHJfZXFmKGNoYXIgY29uc3QgKmxocywgY2hhciBjb25zdCAqcmhzKTsKK2NoYXIgKl9fa21wX3N0cl9mb3JtYXQoY2hhciBjb25zdCAqZm9ybWF0LCAuLi4pOwordm9pZCBfX2ttcF9zdHJfZnJlZShjaGFyIGNvbnN0ICoqc3RyKTsKK2ludCBfX2ttcF9zdHJfbWF0Y2goY2hhciBjb25zdCAqdGFyZ2V0LCBpbnQgbGVuLCBjaGFyIGNvbnN0ICpkYXRhKTsKK2ludCBfX2ttcF9zdHJfbWF0Y2hfZmFsc2UoY2hhciBjb25zdCAqZGF0YSk7CitpbnQgX19rbXBfc3RyX21hdGNoX3RydWUoY2hhciBjb25zdCAqZGF0YSk7Cit2b2lkIF9fa21wX3N0cl9yZXBsYWNlKGNoYXIgKnN0ciwgY2hhciBzZWFyY2hfZm9yLCBjaGFyIHJlcGxhY2Vfd2l0aCk7Cit2b2lkIF9fa21wX3N0cl9zcGxpdChjaGFyICpzdHIsIGNoYXIgZGVsaW0sIGNoYXIgKipoZWFkLCBjaGFyICoqdGFpbCk7CitjaGFyICpfX2ttcF9zdHJfdG9rZW4oY2hhciAqc3RyLCBjaGFyIGNvbnN0ICpkZWxpbSwgY2hhciAqKmJ1Zik7CitpbnQgX19rbXBfc3RyX3RvX2ludChjaGFyIGNvbnN0ICpzdHIsIGNoYXIgc2VudGluZWwpOworCit2b2lkIF9fa21wX3N0cl90b19zaXplKGNoYXIgY29uc3QgKnN0ciwgc2l6ZV90ICpvdXQsIHNpemVfdCBkZmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0ICoqZXJyb3IpOwordm9pZCBfX2ttcF9zdHJfdG9fdWludChjaGFyIGNvbnN0ICpzdHIsIGttcF91aW50NjQgKm91dCwgY2hhciBjb25zdCAqKmVycm9yKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjZW5kaWYgLy8gS01QX1NUUl9ICisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3R1Yi5jcHAgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3R1Yi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA5MTJhYgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF9zdHViLmNwcApAQCAtMCwwICsxLDMxNiBAQAorLyoKKyAqIGttcF9zdHViLmNwcCAtLSBzdHViIHZlcnNpb25zIG9mIHVzZXItY2FsbGFibGUgT3Blbk1QIFJUIGZ1bmN0aW9ucy4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJrbXAuaCIgLy8gS01QX0RFRkFVTFRfU1RLU0laRQorI2luY2x1ZGUgImttcF9zdHViLmgiCisjaW5jbHVkZSAib21wLmgiIC8vIEZ1bmN0aW9uIHJlbmFtaW5ncy4KKworI2lmIEtNUF9PU19XSU5ET1dTCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisKKy8vIE1vdmVkIGZyb20gb21wLmgKKyNkZWZpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyBvbXBjX3NldF9tYXhfYWN0aXZlX2xldmVscworI2RlZmluZSBvbXBfc2V0X3NjaGVkdWxlIG9tcGNfc2V0X3NjaGVkdWxlCisjZGVmaW5lIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSBvbXBjX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisjZGVmaW5lIG9tcF9nZXRfdGVhbV9zaXplIG9tcGNfZ2V0X3RlYW1fc2l6ZQorCisjZGVmaW5lIG9tcF9zZXRfbnVtX3RocmVhZHMgb21wY19zZXRfbnVtX3RocmVhZHMKKyNkZWZpbmUgb21wX3NldF9keW5hbWljIG9tcGNfc2V0X2R5bmFtaWMKKyNkZWZpbmUgb21wX3NldF9uZXN0ZWQgb21wY19zZXRfbmVzdGVkCisjZGVmaW5lIGttcF9zZXRfc3RhY2tzaXplIGttcGNfc2V0X3N0YWNrc2l6ZQorI2RlZmluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zIGttcGNfc2V0X3N0YWNrc2l6ZV9zCisjZGVmaW5lIGttcF9zZXRfYmxvY2t0aW1lIGttcGNfc2V0X2Jsb2NrdGltZQorI2RlZmluZSBrbXBfc2V0X2xpYnJhcnkga21wY19zZXRfbGlicmFyeQorI2RlZmluZSBrbXBfc2V0X2RlZmF1bHRzIGttcGNfc2V0X2RlZmF1bHRzCisjZGVmaW5lIGttcF9zZXRfZGlzcF9udW1fYnVmZmVycyBrbXBjX3NldF9kaXNwX251bV9idWZmZXJzCisjZGVmaW5lIGttcF9tYWxsb2Mga21wY19tYWxsb2MKKyNkZWZpbmUga21wX2FsaWduZWRfbWFsbG9jIGttcGNfYWxpZ25lZF9tYWxsb2MKKyNkZWZpbmUga21wX2NhbGxvYyBrbXBjX2NhbGxvYworI2RlZmluZSBrbXBfcmVhbGxvYyBrbXBjX3JlYWxsb2MKKyNkZWZpbmUga21wX2ZyZWUga21wY19mcmVlCisKK3N0YXRpYyBkb3VibGUgZnJlcXVlbmN5ID0gMC4wOworCisvLyBIZWxwZXIgZnVuY3Rpb25zLgorc3RhdGljIHNpemVfdCBfX2ttcHNfaW5pdCgpIHsKKyAgc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CisgIHN0YXRpYyBzaXplX3QgZHVtbXkgPSAwOworICBpZiAoIWluaXRpYWxpemVkKSB7CisgICAgLy8gVE9ETzogQW5hbHl6ZSBLTVBfVkVSU0lPTiBlbnZpcm9ubWVudCB2YXJpYWJsZSwgcHJpbnQKKyAgICAvLyBfX2ttcF92ZXJzaW9uX2NvcHlyaWdodCBhbmQgX19rbXBfdmVyc2lvbl9idWlsZF90aW1lLgorICAgIC8vIFdBUk5JTkc6IERvIG5vdCB1c2UgImZwcmludGYoc3RkZXJyLCAuLi4pIiBiZWNhdXNlIGl0IHdpbGwgY2F1c2UKKyAgICAvLyB1bnJlc29sdmVkICJfX2lvYiIgc3ltYm9sIChzZWUgQzcwMDgwKS4gV2UgbmVlZCB0byBleHRyYWN0IF9fa21wX3ByaW50ZigpCisgICAgLy8gc3R1ZmYgZnJvbSBrbXBfcnVudGltZS5jcHAgYW5kIHVzZSBpdC4KKworICAgIC8vIFRyaWNrIHdpdGggZHVtbXkgdmFyaWFibGUgZm9yY2VzIGxpbmtlciB0byBrZWVwIF9fa21wX3ZlcnNpb25fY29weXJpZ2h0CisgICAgLy8gYW5kIF9fa21wX3ZlcnNpb25fYnVpbGRfdGltZSBzdHJpbmdzIGluIGV4ZWN1dGFibGUgZmlsZSAoaW4gY2FzZSBvZgorICAgIC8vIHN0YXRpYyBsaW5rYWdlKS4gV2hlbiBLTVBfVkVSU0lPTiBhbmFseXNpcyBpcyBpbXBsZW1lbnRlZCwgZHVtbXkKKyAgICAvLyB2YXJpYWJsZSBzaG91bGQgYmUgZGVsZXRlZCwgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB2b2lkLgorICAgIGR1bW15ID0gX19rbXBfdmVyc2lvbl9jb3B5cmlnaHQgLSBfX2ttcF92ZXJzaW9uX2J1aWxkX3RpbWU7CisKKyNpZiBLTVBfT1NfV0lORE9XUworICAgIExBUkdFX0lOVEVHRVIgZnJlcTsKKyAgICBCT09MIHN0YXR1cyA9IFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koJmZyZXEpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgIGZyZXF1ZW5jeSA9IGRvdWJsZShmcmVxLlF1YWRQYXJ0KTsKKyAgICB9OyAvLyBpZgorI2VuZGlmCisKKyAgICBpbml0aWFsaXplZCA9IDE7CisgIH07IC8vIGlmCisgIHJldHVybiBkdW1teTsKK307IC8vIF9fa21wc19pbml0CisKKyNkZWZpbmUgaSBfX2ttcHNfaW5pdCgpOworCisvKiBzZXQgQVBJIGZ1bmN0aW9ucyAqLwordm9pZCBvbXBfc2V0X251bV90aHJlYWRzKG9tcF9pbnRfdCBudW1fdGhyZWFkcykgeyBpOyB9Cit2b2lkIG9tcF9zZXRfZHluYW1pYyhvbXBfaW50X3QgZHluYW1pYykgeworICBpOworICBfX2ttcHNfc2V0X2R5bmFtaWMoZHluYW1pYyk7Cit9Cit2b2lkIG9tcF9zZXRfbmVzdGVkKG9tcF9pbnRfdCBuZXN0ZWQpIHsKKyAgaTsKKyAgX19rbXBzX3NldF9uZXN0ZWQobmVzdGVkKTsKK30KK3ZvaWQgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyhvbXBfaW50X3QgbWF4X2FjdGl2ZV9sZXZlbHMpIHsgaTsgfQordm9pZCBvbXBfc2V0X3NjaGVkdWxlKG9tcF9zY2hlZF90IGtpbmQsIG9tcF9pbnRfdCBtb2RpZmllcikgeworICBpOworICBfX2ttcHNfc2V0X3NjaGVkdWxlKChrbXBfc2NoZWRfdClraW5kLCBtb2RpZmllcik7Cit9CitpbnQgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKG9tcF9pbnRfdCBsZXZlbCkgeworICBpOworICByZXR1cm4gKGxldmVsKSA/ICgtMSkgOiAoMCk7Cit9CitpbnQgb21wX2dldF90ZWFtX3NpemUob21wX2ludF90IGxldmVsKSB7CisgIGk7CisgIHJldHVybiAobGV2ZWwpID8gKC0xKSA6ICgxKTsKK30KK2ludCBrbXBjX3NldF9hZmZpbml0eV9tYXNrX3Byb2MoaW50IHByb2MsIHZvaWQgKiptYXNrKSB7CisgIGk7CisgIHJldHVybiAtMTsKK30KK2ludCBrbXBjX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhpbnQgcHJvYywgdm9pZCAqKm1hc2spIHsKKyAgaTsKKyAgcmV0dXJuIC0xOworfQoraW50IGttcGNfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhpbnQgcHJvYywgdm9pZCAqKm1hc2spIHsKKyAgaTsKKyAgcmV0dXJuIC0xOworfQorCisvKiBrbXAgQVBJIGZ1bmN0aW9ucyAqLwordm9pZCBrbXBfc2V0X3N0YWNrc2l6ZShvbXBfaW50X3QgYXJnKSB7CisgIGk7CisgIF9fa21wc19zZXRfc3RhY2tzaXplKGFyZyk7Cit9Cit2b2lkIGttcF9zZXRfc3RhY2tzaXplX3Moc2l6ZV90IGFyZykgeworICBpOworICBfX2ttcHNfc2V0X3N0YWNrc2l6ZShhcmcpOworfQordm9pZCBrbXBfc2V0X2Jsb2NrdGltZShvbXBfaW50X3QgYXJnKSB7CisgIGk7CisgIF9fa21wc19zZXRfYmxvY2t0aW1lKGFyZyk7Cit9Cit2b2lkIGttcF9zZXRfbGlicmFyeShvbXBfaW50X3QgYXJnKSB7CisgIGk7CisgIF9fa21wc19zZXRfbGlicmFyeShhcmcpOworfQordm9pZCBrbXBfc2V0X2RlZmF1bHRzKGNoYXIgY29uc3QgKnN0cikgeyBpOyB9Cit2b2lkIGttcF9zZXRfZGlzcF9udW1fYnVmZmVycyhvbXBfaW50X3QgYXJnKSB7IGk7IH0KKworLyogS01QIG1lbW9yeSBtYW5hZ2VtZW50IGZ1bmN0aW9ucy4gKi8KK3ZvaWQgKmttcF9tYWxsb2Moc2l6ZV90IHNpemUpIHsKKyAgaTsKKyAgcmV0dXJuIG1hbGxvYyhzaXplKTsKK30KK3ZvaWQgKmttcF9hbGlnbmVkX21hbGxvYyhzaXplX3Qgc3osIHNpemVfdCBhKSB7CisgIGk7CisjaWYgS01QX09TX1dJTkRPV1MKKyAgZXJybm8gPSBFTk9TWVM7IC8vIG5vdCBzdXBwb3J0ZWQKKyAgcmV0dXJuIE5VTEw7IC8vIG5vIHN0YW5kYXJkIGFsaWduZWQgYWxsb2NhdG9yIG9uIFdpbmRvd3MgKHByZSAtIEMxMSkKKyNlbHNlCisgIHZvaWQgKnJlczsKKyAgaW50IGVycjsKKyAgaWYgKGVyciA9IHBvc2l4X21lbWFsaWduKCZyZXMsIGEsIHN6KSkgeworICAgIGVycm5vID0gZXJyOyAvLyBjYW4gYmUgRUlOVkFMIG9yIEVOT01FTQorICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiByZXM7CisjZW5kaWYKK30KK3ZvaWQgKmttcF9jYWxsb2Moc2l6ZV90IG5lbGVtLCBzaXplX3QgZWxzaXplKSB7CisgIGk7CisgIHJldHVybiBjYWxsb2MobmVsZW0sIGVsc2l6ZSk7Cit9Cit2b2lkICprbXBfcmVhbGxvYyh2b2lkICpwdHIsIHNpemVfdCBzaXplKSB7CisgIGk7CisgIHJldHVybiByZWFsbG9jKHB0ciwgc2l6ZSk7Cit9Cit2b2lkIGttcF9mcmVlKHZvaWQgKnB0cikgeworICBpOworICBmcmVlKHB0cik7Cit9CisKK3N0YXRpYyBpbnQgX19rbXBzX2Jsb2NrdGltZSA9IElOVF9NQVg7CisKK3ZvaWQgX19rbXBzX3NldF9ibG9ja3RpbWUoaW50IGFyZykgeworICBpOworICBfX2ttcHNfYmxvY2t0aW1lID0gYXJnOworfSAvLyBfX2ttcHNfc2V0X2Jsb2NrdGltZQorCitpbnQgX19rbXBzX2dldF9ibG9ja3RpbWUodm9pZCkgeworICBpOworICByZXR1cm4gX19rbXBzX2Jsb2NrdGltZTsKK30gLy8gX19rbXBzX2dldF9ibG9ja3RpbWUKKworc3RhdGljIGludCBfX2ttcHNfZHluYW1pYyA9IDA7CisKK3ZvaWQgX19rbXBzX3NldF9keW5hbWljKGludCBhcmcpIHsKKyAgaTsKKyAgX19rbXBzX2R5bmFtaWMgPSBhcmc7Cit9IC8vIF9fa21wc19zZXRfZHluYW1pYworCitpbnQgX19rbXBzX2dldF9keW5hbWljKHZvaWQpIHsKKyAgaTsKKyAgcmV0dXJuIF9fa21wc19keW5hbWljOworfSAvLyBfX2ttcHNfZ2V0X2R5bmFtaWMKKworc3RhdGljIGludCBfX2ttcHNfbGlicmFyeSA9IDEwMDA7CisKK3ZvaWQgX19rbXBzX3NldF9saWJyYXJ5KGludCBhcmcpIHsKKyAgaTsKKyAgX19rbXBzX2xpYnJhcnkgPSBhcmc7Cit9IC8vIF9fa21wc19zZXRfbGlicmFyeQorCitpbnQgX19rbXBzX2dldF9saWJyYXJ5KHZvaWQpIHsKKyAgaTsKKyAgcmV0dXJuIF9fa21wc19saWJyYXJ5OworfSAvLyBfX2ttcHNfZ2V0X2xpYnJhcnkKKworc3RhdGljIGludCBfX2ttcHNfbmVzdGVkID0gMDsKKwordm9pZCBfX2ttcHNfc2V0X25lc3RlZChpbnQgYXJnKSB7CisgIGk7CisgIF9fa21wc19uZXN0ZWQgPSBhcmc7Cit9IC8vIF9fa21wc19zZXRfbmVzdGVkCisKK2ludCBfX2ttcHNfZ2V0X25lc3RlZCh2b2lkKSB7CisgIGk7CisgIHJldHVybiBfX2ttcHNfbmVzdGVkOworfSAvLyBfX2ttcHNfZ2V0X25lc3RlZAorCitzdGF0aWMgc2l6ZV90IF9fa21wc19zdGFja3NpemUgPSBLTVBfREVGQVVMVF9TVEtTSVpFOworCit2b2lkIF9fa21wc19zZXRfc3RhY2tzaXplKGludCBhcmcpIHsKKyAgaTsKKyAgX19rbXBzX3N0YWNrc2l6ZSA9IGFyZzsKK30gLy8gX19rbXBzX3NldF9zdGFja3NpemUKKworaW50IF9fa21wc19nZXRfc3RhY2tzaXplKHZvaWQpIHsKKyAgaTsKKyAgcmV0dXJuIF9fa21wc19zdGFja3NpemU7Cit9IC8vIF9fa21wc19nZXRfc3RhY2tzaXplCisKK3N0YXRpYyBrbXBfc2NoZWRfdCBfX2ttcHNfc2NoZWRfa2luZCA9IGttcF9zY2hlZF9kZWZhdWx0Oworc3RhdGljIGludCBfX2ttcHNfc2NoZWRfbW9kaWZpZXIgPSAwOworCit2b2lkIF9fa21wc19zZXRfc2NoZWR1bGUoa21wX3NjaGVkX3Qga2luZCwgaW50IG1vZGlmaWVyKSB7CisgIGk7CisgIF9fa21wc19zY2hlZF9raW5kID0ga2luZDsKKyAgX19rbXBzX3NjaGVkX21vZGlmaWVyID0gbW9kaWZpZXI7Cit9IC8vIF9fa21wc19zZXRfc2NoZWR1bGUKKwordm9pZCBfX2ttcHNfZ2V0X3NjaGVkdWxlKGttcF9zY2hlZF90ICpraW5kLCBpbnQgKm1vZGlmaWVyKSB7CisgIGk7CisgICpraW5kID0gX19rbXBzX3NjaGVkX2tpbmQ7CisgICptb2RpZmllciA9IF9fa21wc19zY2hlZF9tb2RpZmllcjsKK30gLy8gX19rbXBzX2dldF9zY2hlZHVsZQorCisjaWYgT01QXzQwX0VOQUJMRUQKKworc3RhdGljIGttcF9wcm9jX2JpbmRfdCBfX2ttcHNfcHJvY19iaW5kID0gcHJvY19iaW5kX2ZhbHNlOworCit2b2lkIF9fa21wc19zZXRfcHJvY19iaW5kKGttcF9wcm9jX2JpbmRfdCBhcmcpIHsKKyAgaTsKKyAgX19rbXBzX3Byb2NfYmluZCA9IGFyZzsKK30gLy8gX19rbXBzX3NldF9wcm9jX2JpbmQKKwora21wX3Byb2NfYmluZF90IF9fa21wc19nZXRfcHJvY19iaW5kKHZvaWQpIHsKKyAgaTsKKyAgcmV0dXJuIF9fa21wc19wcm9jX2JpbmQ7Cit9IC8vIF9fa21wc19nZXRfcHJvY19iaW5kCisKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCitkb3VibGUgX19rbXBzX2dldF93dGltZSh2b2lkKSB7CisgIC8vIEVsYXBzZWQgd2FsbCBjbG9jayB0aW1lIChpbiBzZWNvbmQpIGZyb20gInNvbWV0aW1lIGluIHRoZSBwYXN0Ii4KKyAgZG91YmxlIHd0aW1lID0gMC4wOworICBpOworI2lmIEtNUF9PU19XSU5ET1dTCisgIGlmIChmcmVxdWVuY3kgPiAwLjApIHsKKyAgICBMQVJHRV9JTlRFR0VSIG5vdzsKKyAgICBCT09MIHN0YXR1cyA9IFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZub3cpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgIHd0aW1lID0gZG91YmxlKG5vdy5RdWFkUGFydCkgLyBmcmVxdWVuY3k7CisgICAgfTsgLy8gaWYKKyAgfTsgLy8gaWYKKyNlbHNlCisgIC8vIGdldHRpbWVvZmRheSgpIHJldHVybnMgc2Vjb25kcyBhbmQgbWljcm9zZWNvbmRzIHNpbmNlIHRoZSBFcG9jaC4KKyAgc3RydWN0IHRpbWV2YWwgdHZhbDsKKyAgaW50IHJjOworICByYyA9IGdldHRpbWVvZmRheSgmdHZhbCwgTlVMTCk7CisgIGlmIChyYyA9PSAwKSB7CisgICAgd3RpbWUgPSAoZG91YmxlKSh0dmFsLnR2X3NlYykgKyAxLjBFLTA2ICogKGRvdWJsZSkodHZhbC50dl91c2VjKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBUT0RPOiBBc3NlcnQgb3IgYWJvcnQgaGVyZS4KKyAgfTsgLy8gaWYKKyNlbmRpZgorICByZXR1cm4gd3RpbWU7Cit9OyAvLyBfX2ttcHNfZ2V0X3d0aW1lCisKK2RvdWJsZSBfX2ttcHNfZ2V0X3d0aWNrKHZvaWQpIHsKKyAgLy8gTnVtYmVyIG9mIHNlY29uZHMgYmV0d2VlbiBzdWNjZXNzaXZlIGNsb2NrIHRpY2tzLgorICBkb3VibGUgd3RpY2sgPSAwLjA7CisgIGk7CisjaWYgS01QX09TX1dJTkRPV1MKKyAgeworICAgIERXT1JEIGluY3JlbWVudDsKKyAgICBEV09SRCBhZGp1c3RtZW50OworICAgIEJPT0wgZGlzYWJsZWQ7CisgICAgQk9PTCByYzsKKyAgICByYyA9IEdldFN5c3RlbVRpbWVBZGp1c3RtZW50KCZhZGp1c3RtZW50LCAmaW5jcmVtZW50LCAmZGlzYWJsZWQpOworICAgIGlmIChyYykgeworICAgICAgd3RpY2sgPSAxLjBFLTA3ICogKGRvdWJsZSkoZGlzYWJsZWQgPyBpbmNyZW1lbnQgOiBhZGp1c3RtZW50KTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gVE9ETzogQXNzZXJ0IG9yIGFib3J0IGhlcmUuCisgICAgICB3dGljayA9IDEuMEUtMDM7CisgICAgfTsgLy8gaWYKKyAgfQorI2Vsc2UKKyAgLy8gVE9ETzogZ2V0dGltZW9mZGF5KCkgcmV0dXJucyBpbiBtaWNyb3NlY29uZHMsIGJ1dCB3aGF0IHRoZSBwcmVjaXNpb24/CisgIHd0aWNrID0gMS4wRS0wNjsKKyNlbmRpZgorICByZXR1cm4gd3RpY2s7Cit9OyAvLyBfX2ttcHNfZ2V0X3d0aWNrCisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfc3R1Yi5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX3N0dWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDFlZmRhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3N0dWIuaApAQCAtMCwwICsxLDYxIEBACisvKgorICoga21wX3N0dWIuaAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9TVFVCX0gKKyNkZWZpbmUgS01QX1NUVUJfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKK3ZvaWQgX19rbXBzX3NldF9ibG9ja3RpbWUoaW50IGFyZyk7CitpbnQgX19rbXBzX2dldF9ibG9ja3RpbWUodm9pZCk7Cit2b2lkIF9fa21wc19zZXRfZHluYW1pYyhpbnQgYXJnKTsKK2ludCBfX2ttcHNfZ2V0X2R5bmFtaWModm9pZCk7Cit2b2lkIF9fa21wc19zZXRfbGlicmFyeShpbnQgYXJnKTsKK2ludCBfX2ttcHNfZ2V0X2xpYnJhcnkodm9pZCk7Cit2b2lkIF9fa21wc19zZXRfbmVzdGVkKGludCBhcmcpOworaW50IF9fa21wc19nZXRfbmVzdGVkKHZvaWQpOwordm9pZCBfX2ttcHNfc2V0X3N0YWNrc2l6ZShpbnQgYXJnKTsKK2ludCBfX2ttcHNfZ2V0X3N0YWNrc2l6ZSgpOworCisjaWZuZGVmIEtNUF9TQ0hFRF9UWVBFX0RFRklORUQKKyNkZWZpbmUgS01QX1NDSEVEX1RZUEVfREVGSU5FRAordHlwZWRlZiBlbnVtIGttcF9zY2hlZCB7CisgIGttcF9zY2hlZF9zdGF0aWMgPSAxLCAvLyBtYXBwZWQgdG8ga21wX3NjaF9zdGF0aWNfY2h1bmtlZCAgICAgICAgICAgKDMzKQorICBrbXBfc2NoZWRfZHluYW1pYyA9IDIsIC8vIG1hcHBlZCB0byBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCAgICAgICAgICAoMzUpCisgIGttcF9zY2hlZF9ndWlkZWQgPSAzLCAvLyBtYXBwZWQgdG8ga21wX3NjaF9ndWlkZWRfY2h1bmtlZCAgICAgICAgICAgKDM2KQorICBrbXBfc2NoZWRfYXV0byA9IDQsIC8vIG1hcHBlZCB0byBrbXBfc2NoX2F1dG8gICAgICAgICAgICAgICAgICAgICAoMzgpCisgIGttcF9zY2hlZF9kZWZhdWx0ID0ga21wX3NjaGVkX3N0YXRpYyAvLyBkZWZhdWx0IHNjaGVkdWxpbmcKK30ga21wX3NjaGVkX3Q7CisjZW5kaWYKK3ZvaWQgX19rbXBzX3NldF9zY2hlZHVsZShrbXBfc2NoZWRfdCBraW5kLCBpbnQgbW9kaWZpZXIpOwordm9pZCBfX2ttcHNfZ2V0X3NjaGVkdWxlKGttcF9zY2hlZF90ICpraW5kLCBpbnQgKm1vZGlmaWVyKTsKKworI2lmIE9NUF80MF9FTkFCTEVECit2b2lkIF9fa21wc19zZXRfcHJvY19iaW5kKGttcF9wcm9jX2JpbmRfdCBhcmcpOwora21wX3Byb2NfYmluZF90IF9fa21wc19nZXRfcHJvY19iaW5kKHZvaWQpOworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKK2RvdWJsZSBfX2ttcHNfZ2V0X3d0aW1lKCk7Citkb3VibGUgX19rbXBzX2dldF93dGljaygpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNlbmRpZiAvLyBLTVBfU1RVQl9ICisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfdGFza2RlcHMuY3BwIGIvZmluYWwvcnVudGltZS9zcmMva21wX3Rhc2tkZXBzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDk5YTU2Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3Rhc2tkZXBzLmNwcApAQCAtMCwwICsxLDYzNiBAQAorLyoKKyAqIGttcF90YXNrZGVwcy5jcHAKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLy8jZGVmaW5lIEtNUF9TVVBQT1JUX0dSQVBIX09VVFBVVCAxCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKyNpbmNsdWRlICJrbXBfd2FpdF9yZWxlYXNlLmgiCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCisvLyBUT0RPOiBJbXByb3ZlIG1lbW9yeSBhbGxvY2F0aW9uPyBrZWVwIGEgbGlzdCBvZiBwcmUtYWxsb2NhdGVkIHN0cnVjdHVyZXM/CisvLyBhbGxvY2F0ZSBpbiBibG9ja3M/IHJlLXVzZSBsaXN0IGZpbmlzaGVkIGxpc3QgZW50cmllcz8KKy8vIFRPRE86IGRvbid0IHVzZSBhdG9taWMgcmVmIGNvdW50ZXJzIGZvciBzdGFjay1hbGxvY2F0ZWQgbm9kZXMuCisvLyBUT0RPOiBmaW5kIGFuIGFsdGVybmF0ZSB0byBhdG9taWMgcmVmcyBmb3IgaGVhcC1hbGxvY2F0ZWQgbm9kZXM/CisvLyBUT0RPOiBGaW5pc2ggZ3JhcGggb3V0cHV0IHN1cHBvcnQKKy8vIFRPRE86IGttcF9sb2NrX3Qgc2VlbXMgYSB0YWQgdG8gYmlnIChhbmQgaGVhdnkgd2VpZ2h0KSBmb3IgdGhpcy4gQ2hlY2sgb3RoZXIKKy8vIHJ1bnRpbWUgbG9ja3MKKy8vIFRPRE86IEFueSBJVFQgc3VwcG9ydCBuZWVkZWQ/CisKKyNpZmRlZiBLTVBfU1VQUE9SVF9HUkFQSF9PVVRQVVQKK3N0YXRpYyBrbXBfaW50MzIga21wX25vZGVfaWRfc2VlZCA9IDA7CisjZW5kaWYKKworc3RhdGljIHZvaWQgX19rbXBfaW5pdF9ub2RlKGttcF9kZXBub2RlX3QgKm5vZGUpIHsKKyAgbm9kZS0+ZG4udGFzayA9IE5VTEw7IC8vIHNldCB0byBudWxsIGluaXRpYWxseSwgaXQgd2lsbCBwb2ludCB0byB0aGUgcmlnaHQKKyAgLy8gdGFzayBvbmNlIGRlcGVuZGVuY2VzIGhhdmUgYmVlbiBwcm9jZXNzZWQKKyAgbm9kZS0+ZG4uc3VjY2Vzc29ycyA9IE5VTEw7CisgIF9fa21wX2luaXRfbG9jaygmbm9kZS0+ZG4ubG9jayk7CisgIG5vZGUtPmRuLm5yZWZzID0gMTsgLy8gaW5pdCBjcmVhdGVzIHRoZSBmaXJzdCByZWZlcmVuY2UgdG8gdGhlIG5vZGUKKyNpZmRlZiBLTVBfU1VQUE9SVF9HUkFQSF9PVVRQVVQKKyAgbm9kZS0+ZG4uaWQgPSBLTVBfVEVTVF9USEVOX0lOQzMyKCZrbXBfbm9kZV9pZF9zZWVkKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIGttcF9kZXBub2RlX3QgKl9fa21wX25vZGVfcmVmKGttcF9kZXBub2RlX3QgKm5vZGUpIHsKKyAgS01QX1RFU1RfVEhFTl9JTkMzMihDQ0FTVChrbXBfaW50MzIgKiwgJm5vZGUtPmRuLm5yZWZzKSk7CisgIHJldHVybiBub2RlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19rbXBfbm9kZV9kZXJlZihrbXBfaW5mb190ICp0aHJlYWQsIGttcF9kZXBub2RlX3QgKm5vZGUpIHsKKyAgaWYgKCFub2RlKQorICAgIHJldHVybjsKKworICBrbXBfaW50MzIgbiA9IEtNUF9URVNUX1RIRU5fREVDMzIoQ0NBU1Qoa21wX2ludDMyICosICZub2RlLT5kbi5ucmVmcykpIC0gMTsKKyAgaWYgKG4gPT0gMCkgeworICAgIEtNUF9BU1NFUlQobm9kZS0+ZG4ubnJlZnMgPT0gMCk7CisjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgX19rbXBfZmFzdF9mcmVlKHRocmVhZCwgbm9kZSk7CisjZWxzZQorICAgIF9fa21wX3RocmVhZF9mcmVlKHRocmVhZCwgbm9kZSk7CisjZW5kaWYKKyAgfQorfQorCisjZGVmaW5lIEtNUF9BQ1FVSVJFX0RFUE5PREUoZ3RpZCwgbikgX19rbXBfYWNxdWlyZV9sb2NrKCYobiktPmRuLmxvY2ssIChndGlkKSkKKyNkZWZpbmUgS01QX1JFTEVBU0VfREVQTk9ERShndGlkLCBuKSBfX2ttcF9yZWxlYXNlX2xvY2soJihuKS0+ZG4ubG9jaywgKGd0aWQpKQorCitzdGF0aWMgdm9pZCBfX2ttcF9kZXBub2RlX2xpc3RfZnJlZShrbXBfaW5mb190ICp0aHJlYWQsIGttcF9kZXBub2RlX2xpc3QgKmxpc3QpOworCitlbnVtIHsgS01QX0RFUEhBU0hfT1RIRVJfU0laRSA9IDk3LCBLTVBfREVQSEFTSF9NQVNURVJfU0laRSA9IDk5NyB9OworCitzdGF0aWMgaW5saW5lIGttcF9pbnQzMiBfX2ttcF9kZXBoYXNoX2hhc2goa21wX2ludHB0cl90IGFkZHIsIHNpemVfdCBoc2l6ZSkgeworICAvLyBUT0RPIGFsdGVybmF0ZSB0byB0cnk6IHNldCA9ICgoKEFkZHI2NCkoYWRkclVzZWZ1bEJpdHMgKiA5LjYxOCkpICUKKyAgLy8gbV9udW1fc2V0cyApOworICByZXR1cm4gKChhZGRyID4+IDYpIF4gKGFkZHIgPj4gMikpICUgaHNpemU7Cit9CisKK3N0YXRpYyBrbXBfZGVwaGFzaF90ICpfX2ttcF9kZXBoYXNoX2NyZWF0ZShrbXBfaW5mb190ICp0aHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3Rhc2tkYXRhX3QgKmN1cnJlbnRfdGFzaykgeworICBrbXBfZGVwaGFzaF90ICpoOworCisgIHNpemVfdCBoX3NpemU7CisKKyAgaWYgKGN1cnJlbnRfdGFzay0+dGRfZmxhZ3MudGFza3R5cGUgPT0gVEFTS19JTVBMSUNJVCkKKyAgICBoX3NpemUgPSBLTVBfREVQSEFTSF9NQVNURVJfU0laRTsKKyAgZWxzZQorICAgIGhfc2l6ZSA9IEtNUF9ERVBIQVNIX09USEVSX1NJWkU7CisKKyAga21wX2ludDMyIHNpemUgPQorICAgICAgaF9zaXplICogc2l6ZW9mKGttcF9kZXBoYXNoX2VudHJ5X3QgKikgKyBzaXplb2Yoa21wX2RlcGhhc2hfdCk7CisKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgaCA9IChrbXBfZGVwaGFzaF90ICopX19rbXBfZmFzdF9hbGxvY2F0ZSh0aHJlYWQsIHNpemUpOworI2Vsc2UKKyAgaCA9IChrbXBfZGVwaGFzaF90ICopX19rbXBfdGhyZWFkX21hbGxvYyh0aHJlYWQsIHNpemUpOworI2VuZGlmCisgIGgtPnNpemUgPSBoX3NpemU7CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgaC0+bmVsZW1lbnRzID0gMDsKKyAgaC0+bmNvbmZsaWN0cyA9IDA7CisjZW5kaWYKKyAgaC0+YnVja2V0cyA9IChrbXBfZGVwaGFzaF9lbnRyeSAqKikoaCArIDEpOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaF9zaXplOyBpKyspCisgICAgaC0+YnVja2V0c1tpXSA9IDA7CisKKyAgcmV0dXJuIGg7Cit9CisKK3ZvaWQgX19rbXBfZGVwaGFzaF9mcmVlX2VudHJpZXMoa21wX2luZm9fdCAqdGhyZWFkLCBrbXBfZGVwaGFzaF90ICpoKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaC0+c2l6ZTsgaSsrKSB7CisgICAgaWYgKGgtPmJ1Y2tldHNbaV0pIHsKKyAgICAgIGttcF9kZXBoYXNoX2VudHJ5X3QgKm5leHQ7CisgICAgICBmb3IgKGttcF9kZXBoYXNoX2VudHJ5X3QgKmVudHJ5ID0gaC0+YnVja2V0c1tpXTsgZW50cnk7IGVudHJ5ID0gbmV4dCkgeworICAgICAgICBuZXh0ID0gZW50cnktPm5leHRfaW5fYnVja2V0OworICAgICAgICBfX2ttcF9kZXBub2RlX2xpc3RfZnJlZSh0aHJlYWQsIGVudHJ5LT5sYXN0X2lucyk7CisgICAgICAgIF9fa21wX25vZGVfZGVyZWYodGhyZWFkLCBlbnRyeS0+bGFzdF9vdXQpOworI2lmIFVTRV9GQVNUX01FTU9SWQorICAgICAgICBfX2ttcF9mYXN0X2ZyZWUodGhyZWFkLCBlbnRyeSk7CisjZWxzZQorICAgICAgICBfX2ttcF90aHJlYWRfZnJlZSh0aHJlYWQsIGVudHJ5KTsKKyNlbmRpZgorICAgICAgfQorICAgICAgaC0+YnVja2V0c1tpXSA9IDA7CisgICAgfQorICB9Cit9CisKK3ZvaWQgX19rbXBfZGVwaGFzaF9mcmVlKGttcF9pbmZvX3QgKnRocmVhZCwga21wX2RlcGhhc2hfdCAqaCkgeworICBfX2ttcF9kZXBoYXNoX2ZyZWVfZW50cmllcyh0aHJlYWQsIGgpOworI2lmIFVTRV9GQVNUX01FTU9SWQorICBfX2ttcF9mYXN0X2ZyZWUodGhyZWFkLCBoKTsKKyNlbHNlCisgIF9fa21wX3RocmVhZF9mcmVlKHRocmVhZCwgaCk7CisjZW5kaWYKK30KKworc3RhdGljIGttcF9kZXBoYXNoX2VudHJ5ICoKK19fa21wX2RlcGhhc2hfZmluZChrbXBfaW5mb190ICp0aHJlYWQsIGttcF9kZXBoYXNoX3QgKmgsIGttcF9pbnRwdHJfdCBhZGRyKSB7CisgIGttcF9pbnQzMiBidWNrZXQgPSBfX2ttcF9kZXBoYXNoX2hhc2goYWRkciwgaC0+c2l6ZSk7CisKKyAga21wX2RlcGhhc2hfZW50cnlfdCAqZW50cnk7CisgIGZvciAoZW50cnkgPSBoLT5idWNrZXRzW2J1Y2tldF07IGVudHJ5OyBlbnRyeSA9IGVudHJ5LT5uZXh0X2luX2J1Y2tldCkKKyAgICBpZiAoZW50cnktPmFkZHIgPT0gYWRkcikKKyAgICAgIGJyZWFrOworCisgIGlmIChlbnRyeSA9PSBOVUxMKSB7CisvLyBjcmVhdGUgZW50cnkuIFRoaXMgaXMgb25seSBkb25lIGJ5IG9uZSB0aHJlYWQgc28gbm8gbG9ja2luZyByZXF1aXJlZAorI2lmIFVTRV9GQVNUX01FTU9SWQorICAgIGVudHJ5ID0gKGttcF9kZXBoYXNoX2VudHJ5X3QgKilfX2ttcF9mYXN0X2FsbG9jYXRlKAorICAgICAgICB0aHJlYWQsIHNpemVvZihrbXBfZGVwaGFzaF9lbnRyeV90KSk7CisjZWxzZQorICAgIGVudHJ5ID0gKGttcF9kZXBoYXNoX2VudHJ5X3QgKilfX2ttcF90aHJlYWRfbWFsbG9jKAorICAgICAgICB0aHJlYWQsIHNpemVvZihrbXBfZGVwaGFzaF9lbnRyeV90KSk7CisjZW5kaWYKKyAgICBlbnRyeS0+YWRkciA9IGFkZHI7CisgICAgZW50cnktPmxhc3Rfb3V0ID0gTlVMTDsKKyAgICBlbnRyeS0+bGFzdF9pbnMgPSBOVUxMOworICAgIGVudHJ5LT5uZXh0X2luX2J1Y2tldCA9IGgtPmJ1Y2tldHNbYnVja2V0XTsKKyAgICBoLT5idWNrZXRzW2J1Y2tldF0gPSBlbnRyeTsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBoLT5uZWxlbWVudHMrKzsKKyAgICBpZiAoZW50cnktPm5leHRfaW5fYnVja2V0KQorICAgICAgaC0+bmNvbmZsaWN0cysrOworI2VuZGlmCisgIH0KKyAgcmV0dXJuIGVudHJ5OworfQorCitzdGF0aWMga21wX2RlcG5vZGVfbGlzdF90ICpfX2ttcF9hZGRfbm9kZShrbXBfaW5mb190ICp0aHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfZGVwbm9kZV9saXN0X3QgKmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfZGVwbm9kZV90ICpub2RlKSB7CisgIGttcF9kZXBub2RlX2xpc3RfdCAqbmV3X2hlYWQ7CisKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgbmV3X2hlYWQgPSAoa21wX2RlcG5vZGVfbGlzdF90ICopX19rbXBfZmFzdF9hbGxvY2F0ZSgKKyAgICAgIHRocmVhZCwgc2l6ZW9mKGttcF9kZXBub2RlX2xpc3RfdCkpOworI2Vsc2UKKyAgbmV3X2hlYWQgPSAoa21wX2RlcG5vZGVfbGlzdF90ICopX19rbXBfdGhyZWFkX21hbGxvYygKKyAgICAgIHRocmVhZCwgc2l6ZW9mKGttcF9kZXBub2RlX2xpc3RfdCkpOworI2VuZGlmCisKKyAgbmV3X2hlYWQtPm5vZGUgPSBfX2ttcF9ub2RlX3JlZihub2RlKTsKKyAgbmV3X2hlYWQtPm5leHQgPSBsaXN0OworCisgIHJldHVybiBuZXdfaGVhZDsKK30KKworc3RhdGljIHZvaWQgX19rbXBfZGVwbm9kZV9saXN0X2ZyZWUoa21wX2luZm9fdCAqdGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2RlcG5vZGVfbGlzdCAqbGlzdCkgeworICBrbXBfZGVwbm9kZV9saXN0ICpuZXh0OworCisgIGZvciAoOyBsaXN0OyBsaXN0ID0gbmV4dCkgeworICAgIG5leHQgPSBsaXN0LT5uZXh0OworCisgICAgX19rbXBfbm9kZV9kZXJlZih0aHJlYWQsIGxpc3QtPm5vZGUpOworI2lmIFVTRV9GQVNUX01FTU9SWQorICAgIF9fa21wX2Zhc3RfZnJlZSh0aHJlYWQsIGxpc3QpOworI2Vsc2UKKyAgICBfX2ttcF90aHJlYWRfZnJlZSh0aHJlYWQsIGxpc3QpOworI2VuZGlmCisgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fa21wX3RyYWNrX2RlcGVuZGVuY2Uoa21wX2RlcG5vZGVfdCAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2RlcG5vZGVfdCAqc2luaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF90YXNrX3QgKnNpbmtfdGFzaykgeworI2lmZGVmIEtNUF9TVVBQT1JUX0dSQVBIX09VVFBVVAorICBrbXBfdGFza2RhdGFfdCAqdGFza19zb3VyY2UgPSBLTVBfVEFTS19UT19UQVNLREFUQShzb3VyY2UtPmRuLnRhc2spOworICAvLyBkbyBub3QgdXNlIHNpbmstPmRuLnRhc2sgYXMgdGhhdCBpcyBvbmx5IGZpbGxlZCBhZnRlciB0aGUgZGVwZW5kZW5jaWVzCisgIC8vIGFyZSBhbHJlYWR5IHByb2Nlc3NlZCEKKyAga21wX3Rhc2tkYXRhX3QgKnRhc2tfc2luayA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHNpbmtfdGFzayk7CisKKyAgX19rbXBfcHJpbnRmKCIlZCglcykgLT4gJWQoJXMpXG4iLCBzb3VyY2UtPmRuLmlkLAorICAgICAgICAgICAgICAgdGFza19zb3VyY2UtPnRkX2lkZW50LT5wc291cmNlLCBzaW5rLT5kbi5pZCwKKyAgICAgICAgICAgICAgIHRhc2tfc2luay0+dGRfaWRlbnQtPnBzb3VyY2UpOworI2VuZGlmCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgLy8gT01QVCB0cmFja3MgZGVwZW5kZW5jZXMgYmV0d2VlbiB0YXNrIChhPXNvdXJjZSwgYj1zaW5rKSBpbiB3aGljaAorICAvLyB0YXNrIGEgYmxvY2tzIHRoZSBleGVjdXRpb24gb2YgYiB0aHJvdWdoIHRoZSBvbXB0X25ld19kZXBlbmRlbmNlX2NhbGxiYWNrCisgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90YXNrX2RlcGVuZGVuY2VfcGFpcikpIHsKKyAgICBrbXBfdGFza2RhdGFfdCAqdGFza19zb3VyY2UgPSBLTVBfVEFTS19UT19UQVNLREFUQShzb3VyY2UtPmRuLnRhc2spOworICAgIGttcF90YXNrZGF0YV90ICp0YXNrX3NpbmsgPSBLTVBfVEFTS19UT19UQVNLREFUQShzaW5rX3Rhc2spOworCisgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3Rhc2tfZGVwZW5kZW5jZV9wYWlyKSgKKyAgICAgICAgdGFza19zb3VyY2UtPm9tcHRfdGFza19pbmZvLnRhc2tfaWQsIHRhc2tfc2luay0+b21wdF90YXNrX2luZm8udGFza19pZCk7CisgIH0KKyNlbmRpZiAvKiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRSAqLworfQorCit0ZW1wbGF0ZSA8Ym9vbCBmaWx0ZXI+CitzdGF0aWMgaW5saW5lIGttcF9pbnQzMgorX19rbXBfcHJvY2Vzc19kZXBzKGttcF9pbnQzMiBndGlkLCBrbXBfZGVwbm9kZV90ICpub2RlLCBrbXBfZGVwaGFzaF90ICpoYXNoLAorICAgICAgICAgICAgICAgICAgIGJvb2wgZGVwX2JhcnJpZXIsIGttcF9pbnQzMiBuZGVwcywKKyAgICAgICAgICAgICAgICAgICBrbXBfZGVwZW5kX2luZm9fdCAqZGVwX2xpc3QsIGttcF90YXNrX3QgKnRhc2spIHsKKyAgS0FfVFJBQ0UoMzAsICgiX19rbXBfcHJvY2Vzc19kZXBzPCVkPjogVCMlZCBwcm9jZXNzaW5nICVkIGRlcGVuZGVuY2llcyA6ICIKKyAgICAgICAgICAgICAgICAiZGVwX2JhcnJpZXIgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICBmaWx0ZXIsIGd0aWQsIG5kZXBzLCBkZXBfYmFycmllcikpOworCisgIGttcF9pbmZvX3QgKnRocmVhZCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgIGttcF9pbnQzMiBucHJlZGVjZXNzb3JzID0gMDsKKyAgZm9yIChrbXBfaW50MzIgaSA9IDA7IGkgPCBuZGVwczsgaSsrKSB7CisgICAgY29uc3Qga21wX2RlcGVuZF9pbmZvX3QgKmRlcCA9ICZkZXBfbGlzdFtpXTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoZGVwLT5mbGFncy5pbik7CisKKyAgICBpZiAoZmlsdGVyICYmIGRlcC0+YmFzZV9hZGRyID09IDApCisgICAgICBjb250aW51ZTsgLy8gc2tpcCBmaWx0ZXJlZCBlbnRyaWVzCisKKyAgICBrbXBfZGVwaGFzaF9lbnRyeV90ICppbmZvID0KKyAgICAgICAgX19rbXBfZGVwaGFzaF9maW5kKHRocmVhZCwgaGFzaCwgZGVwLT5iYXNlX2FkZHIpOworICAgIGttcF9kZXBub2RlX3QgKmxhc3Rfb3V0ID0gaW5mby0+bGFzdF9vdXQ7CisKKyAgICBpZiAoZGVwLT5mbGFncy5vdXQgJiYgaW5mby0+bGFzdF9pbnMpIHsKKyAgICAgIGZvciAoa21wX2RlcG5vZGVfbGlzdF90ICpwID0gaW5mby0+bGFzdF9pbnM7IHA7IHAgPSBwLT5uZXh0KSB7CisgICAgICAgIGttcF9kZXBub2RlX3QgKmluZGVwID0gcC0+bm9kZTsKKyAgICAgICAgaWYgKGluZGVwLT5kbi50YXNrKSB7CisgICAgICAgICAgS01QX0FDUVVJUkVfREVQTk9ERShndGlkLCBpbmRlcCk7CisgICAgICAgICAgaWYgKGluZGVwLT5kbi50YXNrKSB7CisgICAgICAgICAgICBfX2ttcF90cmFja19kZXBlbmRlbmNlKGluZGVwLCBub2RlLCB0YXNrKTsKKyAgICAgICAgICAgIGluZGVwLT5kbi5zdWNjZXNzb3JzID0KKyAgICAgICAgICAgICAgICBfX2ttcF9hZGRfbm9kZSh0aHJlYWQsIGluZGVwLT5kbi5zdWNjZXNzb3JzLCBub2RlKTsKKyAgICAgICAgICAgIEtBX1RSQUNFKDQwLCAoIl9fa21wX3Byb2Nlc3NfZGVwczwlZD46IFQjJWQgYWRkaW5nIGRlcGVuZGVuY2UgZnJvbSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICIlcCB0byAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLCBndGlkLCBLTVBfVEFTS19UT19UQVNLREFUQShpbmRlcC0+ZG4udGFzayksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spKSk7CisgICAgICAgICAgICBucHJlZGVjZXNzb3JzKys7CisgICAgICAgICAgfQorICAgICAgICAgIEtNUF9SRUxFQVNFX0RFUE5PREUoZ3RpZCwgaW5kZXApOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIF9fa21wX2RlcG5vZGVfbGlzdF9mcmVlKHRocmVhZCwgaW5mby0+bGFzdF9pbnMpOworICAgICAgaW5mby0+bGFzdF9pbnMgPSBOVUxMOworCisgICAgfSBlbHNlIGlmIChsYXN0X291dCAmJiBsYXN0X291dC0+ZG4udGFzaykgeworICAgICAgS01QX0FDUVVJUkVfREVQTk9ERShndGlkLCBsYXN0X291dCk7CisgICAgICBpZiAobGFzdF9vdXQtPmRuLnRhc2spIHsKKyAgICAgICAgX19rbXBfdHJhY2tfZGVwZW5kZW5jZShsYXN0X291dCwgbm9kZSwgdGFzayk7CisgICAgICAgIGxhc3Rfb3V0LT5kbi5zdWNjZXNzb3JzID0KKyAgICAgICAgICAgIF9fa21wX2FkZF9ub2RlKHRocmVhZCwgbGFzdF9vdXQtPmRuLnN1Y2Nlc3NvcnMsIG5vZGUpOworICAgICAgICBLQV9UUkFDRSgKKyAgICAgICAgICAgIDQwLAorICAgICAgICAgICAgKCJfX2ttcF9wcm9jZXNzX2RlcHM8JWQ+OiBUIyVkIGFkZGluZyBkZXBlbmRlbmNlIGZyb20gJXAgdG8gJXBcbiIsCisgICAgICAgICAgICAgZmlsdGVyLCBndGlkLCBLTVBfVEFTS19UT19UQVNLREFUQShsYXN0X291dC0+ZG4udGFzayksCisgICAgICAgICAgICAgS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzaykpKTsKKworICAgICAgICBucHJlZGVjZXNzb3JzKys7CisgICAgICB9CisgICAgICBLTVBfUkVMRUFTRV9ERVBOT0RFKGd0aWQsIGxhc3Rfb3V0KTsKKyAgICB9CisKKyAgICBpZiAoZGVwX2JhcnJpZXIpIHsKKyAgICAgIC8vIGlmIHRoaXMgaXMgYSBzeW5jIHBvaW50IGluIHRoZSBzZXJpYWwgc2VxdWVuY2UsIHRoZW4gdGhlIHByZXZpb3VzCisgICAgICAvLyBvdXRwdXRzIGFyZSBndWFyYW50ZWVkIHRvIGJlIGNvbXBsZXRlZCBhZnRlcgorICAgICAgLy8gdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIHRhc2sgc28gdGhlIHByZXZpb3VzIG91dHB1dCBub2RlcyBjYW4gYmUgY2xlYXJlZC4KKyAgICAgIF9fa21wX25vZGVfZGVyZWYodGhyZWFkLCBsYXN0X291dCk7CisgICAgICBpbmZvLT5sYXN0X291dCA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChkZXAtPmZsYWdzLm91dCkgeworICAgICAgICBfX2ttcF9ub2RlX2RlcmVmKHRocmVhZCwgbGFzdF9vdXQpOworICAgICAgICBpbmZvLT5sYXN0X291dCA9IF9fa21wX25vZGVfcmVmKG5vZGUpOworICAgICAgfSBlbHNlCisgICAgICAgIGluZm8tPmxhc3RfaW5zID0gX19rbXBfYWRkX25vZGUodGhyZWFkLCBpbmZvLT5sYXN0X2lucywgbm9kZSk7CisgICAgfQorICB9CisKKyAgS0FfVFJBQ0UoMzAsICgiX19rbXBfcHJvY2Vzc19kZXBzPCVkPjogVCMlZCBmb3VuZCAlZCBwcmVkZWNlc3NvcnNcbiIsIGZpbHRlciwKKyAgICAgICAgICAgICAgICBndGlkLCBucHJlZGVjZXNzb3JzKSk7CisKKyAgcmV0dXJuIG5wcmVkZWNlc3NvcnM7Cit9CisKKyNkZWZpbmUgTk9fREVQX0JBUlJJRVIgKGZhbHNlKQorI2RlZmluZSBERVBfQkFSUklFUiAodHJ1ZSkKKworLy8gcmV0dXJucyB0cnVlIGlmIHRoZSB0YXNrIGhhcyBhbnkgb3V0c3RhbmRpbmcgZGVwZW5kZW5jZQorc3RhdGljIGJvb2wgX19rbXBfY2hlY2tfZGVwcyhrbXBfaW50MzIgZ3RpZCwga21wX2RlcG5vZGVfdCAqbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3Rhc2tfdCAqdGFzaywga21wX2RlcGhhc2hfdCAqaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZXBfYmFycmllciwga21wX2ludDMyIG5kZXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfZGVwZW5kX2luZm9fdCAqZGVwX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBuZGVwc19ub2FsaWFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfZGVwZW5kX2luZm9fdCAqbm9hbGlhc19kZXBfbGlzdCkgeworICBpbnQgaTsKKworI2lmIEtNUF9ERUJVRworICBrbXBfdGFza2RhdGFfdCAqdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKTsKKyNlbmRpZgorICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9jaGVja19kZXBzOiBUIyVkIGNoZWNraW5nIGRlcGVuZGVuY2llcyBmb3IgdGFzayAlcCA6ICVkICIKKyAgICAgICAgICAgICAgICAicG9zc2libHkgYWxpYXNlZCBkZXBlbmRlbmNpZXMsICVkIG5vbi1hbGlhc2VkIGRlcGVkZW5jaWVzIDogIgorICAgICAgICAgICAgICAgICJkZXBfYmFycmllcj0lZCAuXG4iLAorICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhLCBuZGVwcywgbmRlcHNfbm9hbGlhcywgZGVwX2JhcnJpZXIpKTsKKworICAvLyBGaWx0ZXIgZGVwcyBpbiBkZXBfbGlzdAorICAvLyBUT0RPOiBEaWZmZXJlbnQgYWxnb3JpdGhtIGZvciBsYXJnZSBkZXBfbGlzdCAoID4gMTAgPyApCisgIGZvciAoaSA9IDA7IGkgPCBuZGVwczsgaSsrKSB7CisgICAgaWYgKGRlcF9saXN0W2ldLmJhc2VfYWRkciAhPSAwKQorICAgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgbmRlcHM7IGorKykKKyAgICAgICAgaWYgKGRlcF9saXN0W2ldLmJhc2VfYWRkciA9PSBkZXBfbGlzdFtqXS5iYXNlX2FkZHIpIHsKKyAgICAgICAgICBkZXBfbGlzdFtpXS5mbGFncy5pbiB8PSBkZXBfbGlzdFtqXS5mbGFncy5pbjsKKyAgICAgICAgICBkZXBfbGlzdFtpXS5mbGFncy5vdXQgfD0gZGVwX2xpc3Rbal0uZmxhZ3Mub3V0OworICAgICAgICAgIGRlcF9saXN0W2pdLmJhc2VfYWRkciA9IDA7IC8vIE1hcmsgaiBlbGVtZW50IGFzIHZvaWQKKyAgICAgICAgfQorICB9CisKKyAgLy8gZG9lc24ndCBuZWVkIHRvIGJlIGF0b21pYyBhcyBubyBvdGhlciB0aHJlYWQgaXMgZ29pbmcgdG8gYmUgYWNjZXNzaW5nIHRoaXMKKyAgLy8gbm9kZSBqdXN0IHlldC4KKyAgLy8gbnByZWRlY2Vzc29ycyBpcyBzZXQgLTEgdG8gZW5zdXJlIHRoYXQgbm9uZSBvZiB0aGUgcmVsZWFzaW5nIHRhc2tzIHF1ZXVlcworICAvLyB0aGlzIHRhc2sgYmVmb3JlIHdlIGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZyBhbGwgdGhlIGRlcGVuZGVuY2llcworICBub2RlLT5kbi5ucHJlZGVjZXNzb3JzID0gLTE7CisKKyAgLy8gdXNlZCB0byBwYWNrIGFsbCBucHJlZGVjZXNzb3JzIGFkZGl0aW9ucyBpbnRvIGEgc2luZ2xlIGF0b21pYyBvcGVyYXRpb24gYXQKKyAgLy8gdGhlIGVuZAorICBpbnQgbnByZWRlY2Vzc29yczsKKworICBucHJlZGVjZXNzb3JzID0gX19rbXBfcHJvY2Vzc19kZXBzPHRydWU+KGd0aWQsIG5vZGUsIGhhc2gsIGRlcF9iYXJyaWVyLCBuZGVwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBfbGlzdCwgdGFzayk7CisgIG5wcmVkZWNlc3NvcnMgKz0gX19rbXBfcHJvY2Vzc19kZXBzPGZhbHNlPigKKyAgICAgIGd0aWQsIG5vZGUsIGhhc2gsIGRlcF9iYXJyaWVyLCBuZGVwc19ub2FsaWFzLCBub2FsaWFzX2RlcF9saXN0LCB0YXNrKTsKKworICBub2RlLT5kbi50YXNrID0gdGFzazsKKyAgS01QX01CKCk7CisKKyAgLy8gQWNjb3VudCBmb3Igb3VyIGluaXRpYWwgZmFrZSB2YWx1ZQorICBucHJlZGVjZXNzb3JzKys7CisKKyAgLy8gVXBkYXRlIHByZWRlY2Vzc29ycyBhbmQgb2J0YWluIGN1cnJlbnQgdmFsdWUgdG8gY2hlY2sgaWYgdGhlcmUgYXJlIHN0aWxsCisgIC8vIGFueSBvdXRzdGFuZGlnIGRlcGVuZGVuY2VzIChzb21lIHRhc2tzIG1heSBoYXZlIGZpbmlzaGVkIHdoaWxlIHdlIHByb2Nlc3NlZAorICAvLyB0aGUgZGVwZW5kZW5jZXMpCisgIG5wcmVkZWNlc3NvcnMgPQorICAgICAgS01QX1RFU1RfVEhFTl9BREQzMihDQ0FTVChrbXBfaW50MzIgKiwgJm5vZGUtPmRuLm5wcmVkZWNlc3NvcnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBucHJlZGVjZXNzb3JzKSArCisgICAgICBucHJlZGVjZXNzb3JzOworCisgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2NoZWNrX2RlcHM6IFQjJWQgZm91bmQgJWQgcHJlZGVjZXNzb3JzIGZvciB0YXNrICVwIFxuIiwKKyAgICAgICAgICAgICAgICBndGlkLCBucHJlZGVjZXNzb3JzLCB0YXNrZGF0YSkpOworCisgIC8vIGJleW9uZCB0aGlzIHBvaW50IHRoZSB0YXNrIGNvdWxkIGJlIHF1ZXVlZCAoYW5kIGV4ZWN1dGVkKSBieSBhIHJlbGVhc2luZworICAvLyB0YXNrLi4uCisgIHJldHVybiBucHJlZGVjZXNzb3JzID4gMCA/IHRydWUgOiBmYWxzZTsKK30KKwordm9pZCBfX2ttcF9yZWxlYXNlX2RlcHMoa21wX2ludDMyIGd0aWQsIGttcF90YXNrZGF0YV90ICp0YXNrKSB7CisgIGttcF9pbmZvX3QgKnRocmVhZCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgIGttcF9kZXBub2RlX3QgKm5vZGUgPSB0YXNrLT50ZF9kZXBub2RlOworCisgIGlmICh0YXNrLT50ZF9kZXBoYXNoKSB7CisgICAgS0FfVFJBQ0UoCisgICAgICAgIDQwLCAoIl9fa21wX3JlbGVhc2VfZGVwczogVCMlZCBmcmVlaW5nIGRlcGVuZGVuY2llcyBoYXNoIG9mIHRhc2sgJXAuXG4iLAorICAgICAgICAgICAgIGd0aWQsIHRhc2spKTsKKyAgICBfX2ttcF9kZXBoYXNoX2ZyZWUodGhyZWFkLCB0YXNrLT50ZF9kZXBoYXNoKTsKKyAgICB0YXNrLT50ZF9kZXBoYXNoID0gTlVMTDsKKyAgfQorCisgIGlmICghbm9kZSkKKyAgICByZXR1cm47CisKKyAgS0FfVFJBQ0UoMjAsICgiX19rbXBfcmVsZWFzZV9kZXBzOiBUIyVkIG5vdGlmeWluZyBzdWNjZXNzb3JzIG9mIHRhc2sgJXAuXG4iLAorICAgICAgICAgICAgICAgIGd0aWQsIHRhc2spKTsKKworICBLTVBfQUNRVUlSRV9ERVBOT0RFKGd0aWQsIG5vZGUpOworICBub2RlLT5kbi50YXNrID0KKyAgICAgIE5VTEw7IC8vIG1hcmsgdGhpcyB0YXNrIGFzIGZpbmlzaGVkLCBzbyBubyBuZXcgZGVwZW5kZW5jaWVzIGFyZSBnZW5lcmF0ZWQKKyAgS01QX1JFTEVBU0VfREVQTk9ERShndGlkLCBub2RlKTsKKworICBrbXBfZGVwbm9kZV9saXN0X3QgKm5leHQ7CisgIGZvciAoa21wX2RlcG5vZGVfbGlzdF90ICpwID0gbm9kZS0+ZG4uc3VjY2Vzc29yczsgcDsgcCA9IG5leHQpIHsKKyAgICBrbXBfZGVwbm9kZV90ICpzdWNjZXNzb3IgPSBwLT5ub2RlOworICAgIGttcF9pbnQzMiBucHJlZGVjZXNzb3JzID0KKyAgICAgICAgS01QX1RFU1RfVEhFTl9ERUMzMihDQ0FTVChrbXBfaW50MzIgKiwgJnN1Y2Nlc3Nvci0+ZG4ubnByZWRlY2Vzc29ycykpIC0KKyAgICAgICAgMTsKKyAgICAvLyBzdWNjZXNzb3IgdGFzayBjYW4gYmUgTlVMTCBmb3Igd2FpdF9kZXBlbmRzIG9yIGJlY2F1c2UgZGVwcyBhcmUgc3RpbGwKKyAgICAvLyBiZWluZyBwcm9jZXNzZWQKKyAgICBpZiAobnByZWRlY2Vzc29ycyA9PSAwKSB7CisgICAgICBLTVBfTUIoKTsKKyAgICAgIGlmIChzdWNjZXNzb3ItPmRuLnRhc2spIHsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfcmVsZWFzZV9kZXBzOiBUIyVkIHN1Y2Nlc3NvciAlcCBvZiAlcCBzY2hlZHVsZWQgIgorICAgICAgICAgICAgICAgICAgICAgICJmb3IgZXhlY3V0aW9uLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCBzdWNjZXNzb3ItPmRuLnRhc2ssIHRhc2spKTsKKyAgICAgICAgX19rbXBfb21wX3Rhc2soZ3RpZCwgc3VjY2Vzc29yLT5kbi50YXNrLCBmYWxzZSk7CisgICAgICB9CisgICAgfQorCisgICAgbmV4dCA9IHAtPm5leHQ7CisgICAgX19rbXBfbm9kZV9kZXJlZih0aHJlYWQsIHAtPm5vZGUpOworI2lmIFVTRV9GQVNUX01FTU9SWQorICAgIF9fa21wX2Zhc3RfZnJlZSh0aHJlYWQsIHApOworI2Vsc2UKKyAgICBfX2ttcF90aHJlYWRfZnJlZSh0aHJlYWQsIHApOworI2VuZGlmCisgIH0KKworICBfX2ttcF9ub2RlX2RlcmVmKHRocmVhZCwgbm9kZSk7CisKKyAgS0FfVFJBQ0UoCisgICAgICAyMCwKKyAgICAgICgiX19rbXBfcmVsZWFzZV9kZXBzOiBUIyVkIGFsbCBzdWNjZXNzb3JzIG9mICVwIG5vdGlmaWVkIG9mIGNvbXBsZXRpb25cbiIsCisgICAgICAgZ3RpZCwgdGFzaykpOworfQorCisvKiEKK0Bpbmdyb3VwIFRBU0tJTkcKK0BwYXJhbSBsb2NfcmVmIGxvY2F0aW9uIG9mIHRoZSBvcmlnaW5hbCB0YXNrIGRpcmVjdGl2ZQorQHBhcmFtIGd0aWQgR2xvYmFsIFRocmVhZCBJRCBvZiBlbmNvdW50ZXJpbmcgdGhyZWFkCitAcGFyYW0gbmV3X3Rhc2sgdGFzayB0aHVuayBhbGxvY2F0ZWQgYnkgX19rbXBfb21wX3Rhc2tfYWxsb2MoKSBmb3IgdGhlICcnbmV3Cit0YXNrJycKK0BwYXJhbSBuZGVwcyBOdW1iZXIgb2YgZGVwZW5kIGl0ZW1zIHdpdGggcG9zc2libGUgYWxpYXNpbmcKK0BwYXJhbSBkZXBfbGlzdCBMaXN0IG9mIGRlcGVuZCBpdGVtcyB3aXRoIHBvc3NpYmxlIGFsaWFzaW5nCitAcGFyYW0gbmRlcHNfbm9hbGlhcyBOdW1iZXIgb2YgZGVwZW5kIGl0ZW1zIHdpdGggbm8gYWxpYXNpbmcKK0BwYXJhbSBub2FsaWFzX2RlcF9saXN0IExpc3Qgb2YgZGVwZW5kIGl0ZW1zIHdpdGggbm8gYWxpYXNpbmcKKworQHJldHVybiBSZXR1cm5zIGVpdGhlciBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRCBpZiB0aGUgY3VycmVudCB0YXNrIHdhcyBub3QKK3N1c3BlbmRlbmQgYW5kIHF1ZXVlZCwgb3IgVEFTS19DVVJSRU5UX1FVRVVFRCBpZiBpdCB3YXMgc3VzcGVuZGVkIGFuZCBxdWV1ZWQKKworU2NoZWR1bGUgYSBub24tdGhyZWFkLXN3aXRjaGFibGUgdGFzayB3aXRoIGRlcGVuZGVuY2VzIGZvciBleGVjdXRpb24KKyovCitrbXBfaW50MzIgX19rbXBjX29tcF90YXNrX3dpdGhfZGVwcyhpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF90YXNrX3QgKm5ld190YXNrLCBrbXBfaW50MzIgbmRlcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfZGVwZW5kX2luZm9fdCAqZGVwX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbmRlcHNfbm9hbGlhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9kZXBlbmRfaW5mb190ICpub2FsaWFzX2RlcF9saXN0KSB7CisKKyAga21wX3Rhc2tkYXRhX3QgKm5ld190YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKG5ld190YXNrKTsKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX3dpdGhfZGVwcyhlbnRlcik6IFQjJWQgbG9jPSVwIHRhc2s9JXBcbiIsIGd0aWQsCisgICAgICAgICAgICAgICAgbG9jX3JlZiwgbmV3X3Rhc2tkYXRhKSk7CisKKyAga21wX2luZm9fdCAqdGhyZWFkID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAga21wX3Rhc2tkYXRhX3QgKmN1cnJlbnRfdGFzayA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgLyogT01QVCBncmFiIGFsbCBkZXBlbmRlbmNlcyBpZiByZXF1ZXN0ZWQgYnkgdGhlIHRvb2wgKi8KKyAgaWYgKG9tcHRfZW5hYmxlZCAmJiBuZGVwcyArIG5kZXBzX25vYWxpYXMgPiAwICYmCisgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGFza19kZXBlbmRlbmNlcykpIHsKKyAgICBrbXBfaW50MzIgaTsKKworICAgIG5ld190YXNrZGF0YS0+b21wdF90YXNrX2luZm8ubmRlcHMgPSBuZGVwcyArIG5kZXBzX25vYWxpYXM7CisgICAgbmV3X3Rhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby5kZXBzID0KKyAgICAgICAgKG9tcHRfdGFza19kZXBlbmRlbmNlX3QgKilLTVBfT01QVF9ERVBTX0FMTE9DKAorICAgICAgICAgICAgdGhyZWFkLCAobmRlcHMgKyBuZGVwc19ub2FsaWFzKSAqIHNpemVvZihvbXB0X3Rhc2tfZGVwZW5kZW5jZV90KSk7CisKKyAgICBLTVBfQVNTRVJUKG5ld190YXNrZGF0YS0+b21wdF90YXNrX2luZm8uZGVwcyAhPSBOVUxMKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuZGVwczsgaSsrKSB7CisgICAgICBuZXdfdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLmRlcHNbaV0udmFyaWFibGVfYWRkciA9CisgICAgICAgICAgKHZvaWQgKilkZXBfbGlzdFtpXS5iYXNlX2FkZHI7CisgICAgICBpZiAoZGVwX2xpc3RbaV0uZmxhZ3MuaW4gJiYgZGVwX2xpc3RbaV0uZmxhZ3Mub3V0KQorICAgICAgICBuZXdfdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLmRlcHNbaV0uZGVwZW5kZW5jZV9mbGFncyA9CisgICAgICAgICAgICBvbXB0X3Rhc2tfZGVwZW5kZW5jZV90eXBlX2lub3V0OworICAgICAgZWxzZSBpZiAoZGVwX2xpc3RbaV0uZmxhZ3Mub3V0KQorICAgICAgICBuZXdfdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLmRlcHNbaV0uZGVwZW5kZW5jZV9mbGFncyA9CisgICAgICAgICAgICBvbXB0X3Rhc2tfZGVwZW5kZW5jZV90eXBlX291dDsKKyAgICAgIGVsc2UgaWYgKGRlcF9saXN0W2ldLmZsYWdzLmluKQorICAgICAgICBuZXdfdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLmRlcHNbaV0uZGVwZW5kZW5jZV9mbGFncyA9CisgICAgICAgICAgICBvbXB0X3Rhc2tfZGVwZW5kZW5jZV90eXBlX2luOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbmRlcHNfbm9hbGlhczsgaSsrKSB7CisgICAgICBuZXdfdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLmRlcHNbbmRlcHMgKyBpXS52YXJpYWJsZV9hZGRyID0KKyAgICAgICAgICAodm9pZCAqKW5vYWxpYXNfZGVwX2xpc3RbaV0uYmFzZV9hZGRyOworICAgICAgaWYgKG5vYWxpYXNfZGVwX2xpc3RbaV0uZmxhZ3MuaW4gJiYgbm9hbGlhc19kZXBfbGlzdFtpXS5mbGFncy5vdXQpCisgICAgICAgIG5ld190YXNrZGF0YS0+b21wdF90YXNrX2luZm8uZGVwc1tuZGVwcyArIGldLmRlcGVuZGVuY2VfZmxhZ3MgPQorICAgICAgICAgICAgb21wdF90YXNrX2RlcGVuZGVuY2VfdHlwZV9pbm91dDsKKyAgICAgIGVsc2UgaWYgKG5vYWxpYXNfZGVwX2xpc3RbaV0uZmxhZ3Mub3V0KQorICAgICAgICBuZXdfdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLmRlcHNbbmRlcHMgKyBpXS5kZXBlbmRlbmNlX2ZsYWdzID0KKyAgICAgICAgICAgIG9tcHRfdGFza19kZXBlbmRlbmNlX3R5cGVfb3V0OworICAgICAgZWxzZSBpZiAobm9hbGlhc19kZXBfbGlzdFtpXS5mbGFncy5pbikKKyAgICAgICAgbmV3X3Rhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby5kZXBzW25kZXBzICsgaV0uZGVwZW5kZW5jZV9mbGFncyA9CisgICAgICAgICAgICBvbXB0X3Rhc2tfZGVwZW5kZW5jZV90eXBlX2luOworICAgIH0KKyAgfQorI2VuZGlmIC8qIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFICovCisKKyAgYm9vbCBzZXJpYWwgPSBjdXJyZW50X3Rhc2stPnRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8CisgICAgICAgICAgICAgICAgY3VycmVudF90YXNrLT50ZF9mbGFncy50YXNraW5nX3NlciB8fAorICAgICAgICAgICAgICAgIGN1cnJlbnRfdGFzay0+dGRfZmxhZ3MuZmluYWw7CisjaWYgT01QXzQ1X0VOQUJMRUQKKyAga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0gPSB0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbTsKKyAgc2VyaWFsID0gc2VyaWFsICYmICEodGFza190ZWFtICYmIHRhc2tfdGVhbS0+dHQudHRfZm91bmRfcHJveHlfdGFza3MpOworI2VuZGlmCisKKyAgaWYgKCFzZXJpYWwgJiYgKG5kZXBzID4gMCB8fCBuZGVwc19ub2FsaWFzID4gMCkpIHsKKyAgICAvKiBpZiBubyBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIHRyYWNrZWQgeWV0LCBjcmVhdGUgdGhlIGRlcGVuZGVuY2UgaGFzaCAqLworICAgIGlmIChjdXJyZW50X3Rhc2stPnRkX2RlcGhhc2ggPT0gTlVMTCkKKyAgICAgIGN1cnJlbnRfdGFzay0+dGRfZGVwaGFzaCA9IF9fa21wX2RlcGhhc2hfY3JlYXRlKHRocmVhZCwgY3VycmVudF90YXNrKTsKKworI2lmIFVTRV9GQVNUX01FTU9SWQorICAgIGttcF9kZXBub2RlX3QgKm5vZGUgPQorICAgICAgICAoa21wX2RlcG5vZGVfdCAqKV9fa21wX2Zhc3RfYWxsb2NhdGUodGhyZWFkLCBzaXplb2Yoa21wX2RlcG5vZGVfdCkpOworI2Vsc2UKKyAgICBrbXBfZGVwbm9kZV90ICpub2RlID0KKyAgICAgICAgKGttcF9kZXBub2RlX3QgKilfX2ttcF90aHJlYWRfbWFsbG9jKHRocmVhZCwgc2l6ZW9mKGttcF9kZXBub2RlX3QpKTsKKyNlbmRpZgorCisgICAgX19rbXBfaW5pdF9ub2RlKG5vZGUpOworICAgIG5ld190YXNrZGF0YS0+dGRfZGVwbm9kZSA9IG5vZGU7CisKKyAgICBpZiAoX19rbXBfY2hlY2tfZGVwcyhndGlkLCBub2RlLCBuZXdfdGFzaywgY3VycmVudF90YXNrLT50ZF9kZXBoYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5PX0RFUF9CQVJSSUVSLCBuZGVwcywgZGVwX2xpc3QsIG5kZXBzX25vYWxpYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgbm9hbGlhc19kZXBfbGlzdCkpIHsKKyAgICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza193aXRoX2RlcHMoZXhpdCk6IFQjJWQgdGFzayBoYWQgYmxvY2tpbmcgIgorICAgICAgICAgICAgICAgICAgICAiZGVwZW5kZW5jaWVzOiAiCisgICAgICAgICAgICAgICAgICAgICJsb2M9JXAgdGFzaz0lcCwgcmV0dXJuOiBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgbmV3X3Rhc2tkYXRhKSk7CisgICAgICByZXR1cm4gVEFTS19DVVJSRU5UX05PVF9RVUVVRUQ7CisgICAgfQorICB9IGVsc2UgeworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza193aXRoX2RlcHMoZXhpdCk6IFQjJWQgaWdub3JlZCBkZXBlbmRlbmNpZXMgIgorICAgICAgICAgICAgICAgICAgImZvciB0YXNrIChzZXJpYWxpemVkKSIKKyAgICAgICAgICAgICAgICAgICJsb2M9JXAgdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIG5ld190YXNrZGF0YSkpOworICB9CisKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX3dpdGhfZGVwcyhleGl0KTogVCMlZCB0YXNrIGhhZCBubyBibG9ja2luZyAiCisgICAgICAgICAgICAgICAgImRlcGVuZGVuY2llcyA6ICIKKyAgICAgICAgICAgICAgICAibG9jPSVwIHRhc2s9JXAsIHRyYW5zZmVycmluZyB0byBfX2ttcGNfb21wX3Rhc2tcbiIsCisgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgbmV3X3Rhc2tkYXRhKSk7CisKKyAgcmV0dXJuIF9fa21wY19vbXBfdGFzayhsb2NfcmVmLCBndGlkLCBuZXdfdGFzayk7Cit9CisKKy8qIQorQGluZ3JvdXAgVEFTS0lORworQHBhcmFtIGxvY19yZWYgbG9jYXRpb24gb2YgdGhlIG9yaWdpbmFsIHRhc2sgZGlyZWN0aXZlCitAcGFyYW0gZ3RpZCBHbG9iYWwgVGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKK0BwYXJhbSBuZGVwcyBOdW1iZXIgb2YgZGVwZW5kIGl0ZW1zIHdpdGggcG9zc2libGUgYWxpYXNpbmcKK0BwYXJhbSBkZXBfbGlzdCBMaXN0IG9mIGRlcGVuZCBpdGVtcyB3aXRoIHBvc3NpYmxlIGFsaWFzaW5nCitAcGFyYW0gbmRlcHNfbm9hbGlhcyBOdW1iZXIgb2YgZGVwZW5kIGl0ZW1zIHdpdGggbm8gYWxpYXNpbmcKK0BwYXJhbSBub2FsaWFzX2RlcF9saXN0IExpc3Qgb2YgZGVwZW5kIGl0ZW1zIHdpdGggbm8gYWxpYXNpbmcKKworQmxvY2tzIHRoZSBjdXJyZW50IHRhc2sgdW50aWwgYWxsIHNwZWNpZmllcyBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIGZ1bGZpbGxlZC4KKyovCit2b2lkIF9fa21wY19vbXBfd2FpdF9kZXBzKGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgbmRlcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9kZXBlbmRfaW5mb190ICpkZXBfbGlzdCwga21wX2ludDMyIG5kZXBzX25vYWxpYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9kZXBlbmRfaW5mb190ICpub2FsaWFzX2RlcF9saXN0KSB7CisgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfd2FpdF9kZXBzKGVudGVyKTogVCMlZCBsb2M9JXBcbiIsIGd0aWQsIGxvY19yZWYpKTsKKworICBpZiAobmRlcHMgPT0gMCAmJiBuZGVwc19ub2FsaWFzID09IDApIHsKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3dhaXRfZGVwcyhleGl0KTogVCMlZCBoYXMgbm8gZGVwZW5kZW5jaWVzIHRvICIKKyAgICAgICAgICAgICAgICAgICJ3YWl0IHVwb24gOiBsb2M9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmKSk7CisgICAgcmV0dXJuOworICB9CisKKyAga21wX2luZm9fdCAqdGhyZWFkID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAga21wX3Rhc2tkYXRhX3QgKmN1cnJlbnRfdGFzayA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrOworCisgIC8vIFdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHkgYXM6CisgIC8vIC0gZGVwZW5kZW5jZXMgYXJlIG5vdCBjb21wdXRlZCBpbiBzZXJpYWwgdGVhbXMgKGV4Y2VwdCB3aXRoIHByb3h5IHRhc2tzKQorICAvLyAtIGlmIHRoZSBkZXBoYXNoIGlzIG5vdCB5ZXQgY3JlYXRlZCBpdCBtZWFucyB3ZSBoYXZlIG5vdGhpbmcgdG8gd2FpdCBmb3IKKyAgYm9vbCBpZ25vcmUgPSBjdXJyZW50X3Rhc2stPnRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8CisgICAgICAgICAgICAgICAgY3VycmVudF90YXNrLT50ZF9mbGFncy50YXNraW5nX3NlciB8fAorICAgICAgICAgICAgICAgIGN1cnJlbnRfdGFzay0+dGRfZmxhZ3MuZmluYWw7CisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgaWdub3JlID0gaWdub3JlICYmIHRocmVhZC0+dGgudGhfdGFza190ZWFtICE9IE5VTEwgJiYKKyAgICAgICAgICAgdGhyZWFkLT50aC50aF90YXNrX3RlYW0tPnR0LnR0X2ZvdW5kX3Byb3h5X3Rhc2tzID09IEZBTFNFOworI2VuZGlmCisgIGlnbm9yZSA9IGlnbm9yZSB8fCBjdXJyZW50X3Rhc2stPnRkX2RlcGhhc2ggPT0gTlVMTDsKKworICBpZiAoaWdub3JlKSB7CisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF93YWl0X2RlcHMoZXhpdCk6IFQjJWQgaGFzIG5vIGJsb2NraW5nICIKKyAgICAgICAgICAgICAgICAgICJkZXBlbmRlbmNpZXMgOiBsb2M9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmKSk7CisgICAgcmV0dXJuOworICB9CisKKyAga21wX2RlcG5vZGVfdCBub2RlOworICBfX2ttcF9pbml0X25vZGUoJm5vZGUpOworCisgIGlmICghX19rbXBfY2hlY2tfZGVwcyhndGlkLCAmbm9kZSwgTlVMTCwgY3VycmVudF90YXNrLT50ZF9kZXBoYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgREVQX0JBUlJJRVIsIG5kZXBzLCBkZXBfbGlzdCwgbmRlcHNfbm9hbGlhcywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vYWxpYXNfZGVwX2xpc3QpKSB7CisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF93YWl0X2RlcHMoZXhpdCk6IFQjJWQgaGFzIG5vIGJsb2NraW5nICIKKyAgICAgICAgICAgICAgICAgICJkZXBlbmRlbmNpZXMgOiBsb2M9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaW50IHRocmVhZF9maW5pc2hlZCA9IEZBTFNFOworICBrbXBfZmxhZ18zMiBmbGFnKCh2b2xhdGlsZSBrbXBfdWludDMyICopJihub2RlLmRuLm5wcmVkZWNlc3NvcnMpLCAwVSk7CisgIHdoaWxlIChub2RlLmRuLm5wcmVkZWNlc3NvcnMgPiAwKSB7CisgICAgZmxhZy5leGVjdXRlX3Rhc2tzKHRocmVhZCwgZ3RpZCwgRkFMU0UsICZ0aHJlYWRfZmluaXNoZWQsCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3Rhc2tfc3RlYWxpbmdfY29uc3RyYWludCk7CisgIH0KKworICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3dhaXRfZGVwcyhleGl0KTogVCMlZCBmaW5pc2hlZCB3YWl0aW5nIDogbG9jPSVwXG4iLAorICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYpKTsKK30KKworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfdGFza2luZy5jcHAgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfdGFza2luZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ1OTY0MgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF90YXNraW5nLmNwcApAQCAtMCwwICsxLDM2MzcgQEAKKy8qCisgKiBrbXBfdGFza2luZy5jcHAgLS0gT3Blbk1QIDMuMCB0YXNraW5nIHN1cHBvcnQuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfc3RhdHMuaCIKKyNpbmNsdWRlICJrbXBfd2FpdF9yZWxlYXNlLmgiCisKKyNpZiBPTVBUX1NVUFBPUlQKKyNpbmNsdWRlICJvbXB0LXNwZWNpZmljLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInRzYW5fYW5ub3RhdGlvbnMuaCIKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLworc3RhdGljIHZvaWQgX19rbXBfZW5hYmxlX3Rhc2tpbmcoa21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW5mb190ICp0aGlzX3Rocik7CitzdGF0aWMgdm9pZCBfX2ttcF9hbGxvY190YXNrX2RlcXVlKGttcF9pbmZvX3QgKnRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhKTsKK3N0YXRpYyBpbnQgX19rbXBfcmVhbGxvY190YXNrX3RocmVhZHNfZGF0YShrbXBfaW5mb190ICp0aHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0pOworCisjaWZkZWYgT01QXzQ1X0VOQUJMRUQKK3N0YXRpYyB2b2lkIF9fa21wX2JvdHRvbV9oYWxmX2ZpbmlzaF9wcm94eShrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqcHRhc2spOworI2VuZGlmCisKKyNpZmRlZiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKKworLy8gIF9fa21wX3RyYWNlX3Rhc2tfc3RhY2s6IHByaW50IHRoZSB0aWVkIHRhc2tzIGZyb20gdGhlIHRhc2sgc3RhY2sgaW4gb3JkZXIKKy8vICBmcm9tIHRvcCBkbyBib3R0b20KKy8vCisvLyAgZ3RpZDogZ2xvYmFsIHRocmVhZCBpZGVudGlmaWVyIGZvciB0aHJlYWQgY29udGFpbmluZyBzdGFjaworLy8gIHRocmVhZF9kYXRhOiB0aHJlYWQgZGF0YSBmb3IgdGFzayB0ZWFtIHRocmVhZCBjb250YWluaW5nIHN0YWNrCisvLyAgdGhyZXNob2xkOiB2YWx1ZSBhYm92ZSB3aGljaCB0aGUgdHJhY2Ugc3RhdGVtZW50IHRyaWdnZXJzCisvLyAgbG9jYXRpb246IHN0cmluZyBpZGVudGlmeWluZyBjYWxsIHNpdGUgb2YgdGhpcyBmdW5jdGlvbiAoZm9yIHRyYWNlKQorc3RhdGljIHZvaWQgX19rbXBfdHJhY2VfdGFza19zdGFjayhrbXBfaW50MzIgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNob2xkLCBjaGFyICpsb2NhdGlvbikgeworICBrbXBfdGFza19zdGFja190ICp0YXNrX3N0YWNrID0gJnRocmVhZF9kYXRhLT50ZC50ZF9zdXNwX3RpZWRfdGFza3M7CisgIGttcF90YXNrZGF0YV90ICoqc3RhY2tfdG9wID0gdGFza19zdGFjay0+dHNfdG9wOworICBrbXBfaW50MzIgZW50cmllcyA9IHRhc2tfc3RhY2stPnRzX2VudHJpZXM7CisgIGttcF90YXNrZGF0YV90ICp0aWVkX3Rhc2s7CisKKyAgS0FfVFJBQ0UoCisgICAgICB0aHJlc2hvbGQsCisgICAgICAoIl9fa21wX3RyYWNlX3Rhc2tfc3RhY2soc3RhcnQpOiBsb2NhdGlvbiA9ICVzLCBndGlkID0gJWQsIGVudHJpZXMgPSAlZCwgIgorICAgICAgICJmaXJzdF9ibG9jayA9ICVwLCBzdGFja190b3AgPSAlcCBcbiIsCisgICAgICAgbG9jYXRpb24sIGd0aWQsIGVudHJpZXMsIHRhc2tfc3RhY2stPnRzX2ZpcnN0X2Jsb2NrLCBzdGFja190b3ApKTsKKworICBLTVBfREVCVUdfQVNTRVJUKHN0YWNrX3RvcCAhPSBOVUxMKTsKKyAgS01QX0RFQlVHX0FTU0VSVChlbnRyaWVzID4gMCk7CisKKyAgd2hpbGUgKGVudHJpZXMgIT0gMCkgeworICAgIEtNUF9ERUJVR19BU1NFUlQoc3RhY2tfdG9wICE9ICZ0YXNrX3N0YWNrLT50c19maXJzdF9ibG9jay5zYl9ibG9ja1swXSk7CisgICAgLy8gZml4IHVwIHRzX3RvcCBpZiB3ZSBuZWVkIHRvIHBvcCBmcm9tIHByZXZpb3VzIGJsb2NrCisgICAgaWYgKGVudHJpZXMgJiBUQVNLX1NUQUNLX0lOREVYX01BU0sgPT0gMCkgeworICAgICAga21wX3N0YWNrX2Jsb2NrX3QgKnN0YWNrX2Jsb2NrID0gKGttcF9zdGFja19ibG9ja190ICopKHN0YWNrX3RvcCk7CisKKyAgICAgIHN0YWNrX2Jsb2NrID0gc3RhY2tfYmxvY2stPnNiX3ByZXY7CisgICAgICBzdGFja190b3AgPSAmc3RhY2tfYmxvY2stPnNiX2Jsb2NrW1RBU0tfU1RBQ0tfQkxPQ0tfU0laRV07CisgICAgfQorCisgICAgLy8gZmluaXNoIGJvb2trZWVwaW5nCisgICAgc3RhY2tfdG9wLS07CisgICAgZW50cmllcy0tOworCisgICAgdGllZF90YXNrID0gKnN0YWNrX3RvcDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQodGllZF90YXNrICE9IE5VTEwpOworICAgIEtNUF9ERUJVR19BU1NFUlQodGllZF90YXNrLT50ZF9mbGFncy50YXNrdHlwZSA9PSBUQVNLX1RJRUQpOworCisgICAgS0FfVFJBQ0UodGhyZXNob2xkLAorICAgICAgICAgICAgICgiX19rbXBfdHJhY2VfdGFza19zdGFjayglcyk6ICAgICAgICAgICAgIGd0aWQ9JWQsIGVudHJ5PSVkLCAiCisgICAgICAgICAgICAgICJzdGFja190b3A9JXAsIHRpZWRfdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgbG9jYXRpb24sIGd0aWQsIGVudHJpZXMsIHN0YWNrX3RvcCwgdGllZF90YXNrKSk7CisgIH0KKyAgS01QX0RFQlVHX0FTU0VSVChzdGFja190b3AgPT0gJnRhc2tfc3RhY2stPnRzX2ZpcnN0X2Jsb2NrLnNiX2Jsb2NrWzBdKTsKKworICBLQV9UUkFDRSh0aHJlc2hvbGQsCisgICAgICAgICAgICgiX19rbXBfdHJhY2VfdGFza19zdGFjayhleGl0KTogbG9jYXRpb24gPSAlcywgZ3RpZCA9ICVkXG4iLAorICAgICAgICAgICAgbG9jYXRpb24sIGd0aWQpKTsKK30KKworLy8gIF9fa21wX2luaXRfdGFza19zdGFjazogaW5pdGlhbGl6ZSB0aGUgdGFzayBzdGFjayBmb3IgdGhlIGZpcnN0IHRpbWUKKy8vICBhZnRlciBhIHRocmVhZF9kYXRhIHN0cnVjdHVyZSBpcyBjcmVhdGVkLgorLy8gIEl0IHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IHRvIGRvIHRoaXMgYWdhaW4gKGFzc3VtaW5nIHRoZSBzdGFjayB3b3JrcykuCisvLworLy8gIGd0aWQ6IGdsb2JhbCB0aHJlYWQgaWRlbnRpZmllciBvZiBjYWxsaW5nIHRocmVhZAorLy8gIHRocmVhZF9kYXRhOiB0aHJlYWQgZGF0YSBmb3IgdGFzayB0ZWFtIHRocmVhZCBjb250YWluaW5nIHN0YWNrCitzdGF0aWMgdm9pZCBfX2ttcF9pbml0X3Rhc2tfc3RhY2soa21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhKSB7CisgIGttcF90YXNrX3N0YWNrX3QgKnRhc2tfc3RhY2sgPSAmdGhyZWFkX2RhdGEtPnRkLnRkX3N1c3BfdGllZF90YXNrczsKKyAga21wX3N0YWNrX2Jsb2NrX3QgKmZpcnN0X2Jsb2NrOworCisgIC8vIHNldCB1cCB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIHN0YWNrCisgIGZpcnN0X2Jsb2NrID0gJnRhc2tfc3RhY2stPnRzX2ZpcnN0X2Jsb2NrOworICB0YXNrX3N0YWNrLT50c190b3AgPSAoa21wX3Rhc2tkYXRhX3QgKiopZmlyc3RfYmxvY2s7CisgIG1lbXNldCgodm9pZCAqKWZpcnN0X2Jsb2NrLCAnXDAnLAorICAgICAgICAgVEFTS19TVEFDS19CTE9DS19TSVpFICogc2l6ZW9mKGttcF90YXNrZGF0YV90ICopKTsKKworICAvLyBpbml0aWFsaXplIHRoZSBzdGFjayB0byBiZSBlbXB0eQorICB0YXNrX3N0YWNrLT50c19lbnRyaWVzID0gVEFTS19TVEFDS19FTVBUWTsKKyAgZmlyc3RfYmxvY2stPnNiX25leHQgPSBOVUxMOworICBmaXJzdF9ibG9jay0+c2JfcHJldiA9IE5VTEw7Cit9CisKKy8vICBfX2ttcF9mcmVlX3Rhc2tfc3RhY2s6IGZyZWUgdGhlIHRhc2sgc3RhY2sgd2hlbiB0aHJlYWRfZGF0YSBpcyBkZXN0cm95ZWQuCisvLworLy8gIGd0aWQ6IGdsb2JhbCB0aHJlYWQgaWRlbnRpZmllciBmb3IgY2FsbGluZyB0aHJlYWQKKy8vICB0aHJlYWRfZGF0YTogdGhyZWFkIGluZm8gZm9yIHRocmVhZCBjb250YWluaW5nIHN0YWNrCitzdGF0aWMgdm9pZCBfX2ttcF9mcmVlX3Rhc2tfc3RhY2soa21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhKSB7CisgIGttcF90YXNrX3N0YWNrX3QgKnRhc2tfc3RhY2sgPSAmdGhyZWFkX2RhdGEtPnRkLnRkX3N1c3BfdGllZF90YXNrczsKKyAga21wX3N0YWNrX2Jsb2NrX3QgKnN0YWNrX2Jsb2NrID0gJnRhc2tfc3RhY2stPnRzX2ZpcnN0X2Jsb2NrOworCisgIEtNUF9ERUJVR19BU1NFUlQodGFza19zdGFjay0+dHNfZW50cmllcyA9PSBUQVNLX1NUQUNLX0VNUFRZKTsKKyAgLy8gZnJlZSBmcm9tIHRoZSBzZWNvbmQgYmxvY2sgb2YgdGhlIHN0YWNrCisgIHdoaWxlIChzdGFja19ibG9jayAhPSBOVUxMKSB7CisgICAga21wX3N0YWNrX2Jsb2NrX3QgKm5leHRfYmxvY2sgPSAoc3RhY2tfYmxvY2spID8gc3RhY2tfYmxvY2stPnNiX25leHQgOiBOVUxMOworCisgICAgc3RhY2tfYmxvY2stPnNiX25leHQgPSBOVUxMOworICAgIHN0YWNrX2Jsb2NrLT5zYl9wcmV2ID0gTlVMTDsKKyAgICBpZiAoc3RhY2tfYmxvY2sgIT0gJnRhc2tfc3RhY2stPnRzX2ZpcnN0X2Jsb2NrKSB7CisgICAgICBfX2ttcF90aHJlYWRfZnJlZSh0aHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGFja19ibG9jayk7IC8vIGZyZWUgdGhlIGJsb2NrLCBpZiBub3QgdGhlIGZpcnN0CisgICAgfQorICAgIHN0YWNrX2Jsb2NrID0gbmV4dF9ibG9jazsKKyAgfQorICAvLyBpbml0aWFsaXplIHRoZSBzdGFjayB0byBiZSBlbXB0eQorICB0YXNrX3N0YWNrLT50c19lbnRyaWVzID0gMDsKKyAgdGFza19zdGFjay0+dHNfdG9wID0gTlVMTDsKK30KKworLy8gIF9fa21wX3B1c2hfdGFza19zdGFjazogUHVzaCB0aGUgdGllZCB0YXNrIG9udG8gdGhlIHRhc2sgc3RhY2suCisvLyAgICAgR3JvdyB0aGUgc3RhY2sgaWYgbmVjZXNzYXJ5IGJ5IGFsbG9jYXRpbmcgYW5vdGhlciBibG9jay4KKy8vCisvLyAgZ3RpZDogZ2xvYmFsIHRocmVhZCBpZGVudGlmaWVyIGZvciBjYWxsaW5nIHRocmVhZAorLy8gIHRocmVhZDogdGhyZWFkIGluZm8gZm9yIHRocmVhZCBjb250YWluaW5nIHN0YWNrCisvLyAgdGllZF90YXNrOiB0aGUgdGFzayB0byBwdXNoIG9uIHRoZSBzdGFjaworc3RhdGljIHZvaWQgX19rbXBfcHVzaF90YXNrX3N0YWNrKGttcF9pbnQzMiBndGlkLCBrbXBfaW5mb190ICp0aHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3Rhc2tkYXRhX3QgKnRpZWRfdGFzaykgeworICAvLyBHRUggLSBuZWVkIHRvIGNvbnNpZGVyIHdoYXQgdG8gZG8gaWYgdHRfdGhyZWFkc19kYXRhIG5vdCBhbGxvY2F0ZWQgeWV0CisgIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YSA9CisgICAgICAmdGhyZWFkLT50aC50aF90YXNrX3RlYW0tPnR0LnR0X3RocmVhZHNfZGF0YVtfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpXTsKKyAga21wX3Rhc2tfc3RhY2tfdCAqdGFza19zdGFjayA9ICZ0aHJlYWRfZGF0YS0+dGQudGRfc3VzcF90aWVkX3Rhc2tzOworCisgIGlmICh0aWVkX3Rhc2stPnRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8IHRpZWRfdGFzay0+dGRfZmxhZ3MudGFza2luZ19zZXIpIHsKKyAgICByZXR1cm47IC8vIERvbid0IHB1c2ggYW55dGhpbmcgb24gc3RhY2sgaWYgdGVhbSBvciB0ZWFtIHRhc2tzIGFyZSBzZXJpYWxpemVkCisgIH0KKworICBLTVBfREVCVUdfQVNTRVJUKHRpZWRfdGFzay0+dGRfZmxhZ3MudGFza3R5cGUgPT0gVEFTS19USUVEKTsKKyAgS01QX0RFQlVHX0FTU0VSVCh0YXNrX3N0YWNrLT50c190b3AgIT0gTlVMTCk7CisKKyAgS0FfVFJBQ0UoMjAsCisgICAgICAgICAgICgiX19rbXBfcHVzaF90YXNrX3N0YWNrKGVudGVyKTogR1RJRDogJWQ7IFRIUkVBRDogJXA7IFRBU0s6ICVwXG4iLAorICAgICAgICAgICAgZ3RpZCwgdGhyZWFkLCB0aWVkX3Rhc2spKTsKKyAgLy8gU3RvcmUgZW50cnkKKyAgKih0YXNrX3N0YWNrLT50c190b3ApID0gdGllZF90YXNrOworCisgIC8vIERvIGJvb2trZWVwaW5nIGZvciBuZXh0IHB1c2gKKyAgdGFza19zdGFjay0+dHNfdG9wKys7CisgIHRhc2tfc3RhY2stPnRzX2VudHJpZXMrKzsKKworICBpZiAodGFza19zdGFjay0+dHNfZW50cmllcyAmIFRBU0tfU1RBQ0tfSU5ERVhfTUFTSyA9PSAwKSB7CisgICAgLy8gRmluZCBiZWdpbm5pbmcgb2YgdGhpcyB0YXNrIGJsb2NrCisgICAga21wX3N0YWNrX2Jsb2NrX3QgKnN0YWNrX2Jsb2NrID0KKyAgICAgICAgKGttcF9zdGFja19ibG9ja190ICopKHRhc2tfc3RhY2stPnRzX3RvcCAtIFRBU0tfU1RBQ0tfQkxPQ0tfU0laRSk7CisKKyAgICAvLyBDaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBibG9jaworICAgIGlmIChzdGFja19ibG9jay0+c2JfbmV4dCAhPQorICAgICAgICBOVUxMKSB7IC8vIHJlc2V0IHRzX3RvcCB0byBiZWdpbm5pbmcgb2YgbmV4dCBibG9jaworICAgICAgdGFza19zdGFjay0+dHNfdG9wID0gJnN0YWNrX2Jsb2NrLT5zYl9uZXh0LT5zYl9ibG9ja1swXTsKKyAgICB9IGVsc2UgeyAvLyBBbGxvYyBuZXcgYmxvY2sgYW5kIGxpbmsgaXQgdXAKKyAgICAgIGttcF9zdGFja19ibG9ja190ICpuZXdfYmxvY2sgPSAoa21wX3N0YWNrX2Jsb2NrX3QgKilfX2ttcF90aHJlYWRfY2FsbG9jKAorICAgICAgICAgIHRocmVhZCwgc2l6ZW9mKGttcF9zdGFja19ibG9ja190KSk7CisKKyAgICAgIHRhc2tfc3RhY2stPnRzX3RvcCA9ICZuZXdfYmxvY2stPnNiX2Jsb2NrWzBdOworICAgICAgc3RhY2tfYmxvY2stPnNiX25leHQgPSBuZXdfYmxvY2s7CisgICAgICBuZXdfYmxvY2stPnNiX3ByZXYgPSBzdGFja19ibG9jazsKKyAgICAgIG5ld19ibG9jay0+c2JfbmV4dCA9IE5VTEw7CisKKyAgICAgIEtBX1RSQUNFKAorICAgICAgICAgIDMwLAorICAgICAgICAgICgiX19rbXBfcHVzaF90YXNrX3N0YWNrKCk6IEdUSUQ6ICVkOyBUQVNLOiAlcDsgQWxsb2MgbmV3IGJsb2NrOiAlcFxuIiwKKyAgICAgICAgICAgZ3RpZCwgdGllZF90YXNrLCBuZXdfYmxvY2spKTsKKyAgICB9CisgIH0KKyAgS0FfVFJBQ0UoMjAsICgiX19rbXBfcHVzaF90YXNrX3N0YWNrKGV4aXQpOiBHVElEOiAlZDsgVEFTSzogJXBcbiIsIGd0aWQsCisgICAgICAgICAgICAgICAgdGllZF90YXNrKSk7Cit9CisKKy8vICBfX2ttcF9wb3BfdGFza19zdGFjazogUG9wIHRoZSB0aWVkIHRhc2sgZnJvbSB0aGUgdGFzayBzdGFjay4gIERvbid0IHJldHVybgorLy8gIHRoZSB0YXNrLCBqdXN0IGNoZWNrIHRvIG1ha2Ugc3VyZSBpdCBtYXRjaGVzIHRoZSBlbmRpbmcgdGFzayBwYXNzZWQgaW4uCisvLworLy8gIGd0aWQ6IGdsb2JhbCB0aHJlYWQgaWRlbnRpZmllciBmb3IgdGhlIGNhbGxpbmcgdGhyZWFkCisvLyAgdGhyZWFkOiB0aHJlYWQgaW5mbyBzdHJ1Y3R1cmUgY29udGFpbmluZyBzdGFjaworLy8gIHRpZWRfdGFzazogdGhlIHRhc2sgcG9wcGVkIG9mZiB0aGUgc3RhY2sKKy8vICBlbmRpbmdfdGFzazogdGhlIHRhc2sgdGhhdCBpcyBlbmRpbmcgKHNob3VsZCBtYXRjaCBwb3BwZWQgdGFzaykKK3N0YXRpYyB2b2lkIF9fa21wX3BvcF90YXNrX3N0YWNrKGttcF9pbnQzMiBndGlkLCBrbXBfaW5mb190ICp0aHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdGFza2RhdGFfdCAqZW5kaW5nX3Rhc2spIHsKKyAgLy8gR0VIIC0gbmVlZCB0byBjb25zaWRlciB3aGF0IHRvIGRvIGlmIHR0X3RocmVhZHNfZGF0YSBub3QgYWxsb2NhdGVkIHlldAorICBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEgPQorICAgICAgJnRocmVhZC0+dGgudGhfdGFza190ZWFtLT50dF90aHJlYWRzX2RhdGFbX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKV07CisgIGttcF90YXNrX3N0YWNrX3QgKnRhc2tfc3RhY2sgPSAmdGhyZWFkX2RhdGEtPnRkLnRkX3N1c3BfdGllZF90YXNrczsKKyAga21wX3Rhc2tkYXRhX3QgKnRpZWRfdGFzazsKKworICBpZiAoZW5kaW5nX3Rhc2stPnRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8IGVuZGluZ190YXNrLT50ZF9mbGFncy50YXNraW5nX3NlcikgeworICAgIC8vIERvbid0IHBvcCBhbnl0aGluZyBmcm9tIHN0YWNrIGlmIHRlYW0gb3IgdGVhbSB0YXNrcyBhcmUgc2VyaWFsaXplZAorICAgIHJldHVybjsKKyAgfQorCisgIEtNUF9ERUJVR19BU1NFUlQodGFza19zdGFjay0+dHNfdG9wICE9IE5VTEwpOworICBLTVBfREVCVUdfQVNTRVJUKHRhc2tfc3RhY2stPnRzX2VudHJpZXMgPiAwKTsKKworICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9wb3BfdGFza19zdGFjayhlbnRlcik6IEdUSUQ6ICVkOyBUSFJFQUQ6ICVwXG4iLCBndGlkLAorICAgICAgICAgICAgICAgIHRocmVhZCkpOworCisgIC8vIGZpeCB1cCB0c190b3AgaWYgd2UgbmVlZCB0byBwb3AgZnJvbSBwcmV2aW91cyBibG9jaworICBpZiAodGFza19zdGFjay0+dHNfZW50cmllcyAmIFRBU0tfU1RBQ0tfSU5ERVhfTUFTSyA9PSAwKSB7CisgICAga21wX3N0YWNrX2Jsb2NrX3QgKnN0YWNrX2Jsb2NrID0gKGttcF9zdGFja19ibG9ja190ICopKHRhc2tfc3RhY2stPnRzX3RvcCk7CisKKyAgICBzdGFja19ibG9jayA9IHN0YWNrX2Jsb2NrLT5zYl9wcmV2OworICAgIHRhc2tfc3RhY2stPnRzX3RvcCA9ICZzdGFja19ibG9jay0+c2JfYmxvY2tbVEFTS19TVEFDS19CTE9DS19TSVpFXTsKKyAgfQorCisgIC8vIGZpbmlzaCBib29ra2VlcGluZworICB0YXNrX3N0YWNrLT50c190b3AtLTsKKyAgdGFza19zdGFjay0+dHNfZW50cmllcy0tOworCisgIHRpZWRfdGFzayA9ICoodGFza19zdGFjay0+dHNfdG9wKTsKKworICBLTVBfREVCVUdfQVNTRVJUKHRpZWRfdGFzayAhPSBOVUxMKTsKKyAgS01QX0RFQlVHX0FTU0VSVCh0aWVkX3Rhc2stPnRkX2ZsYWdzLnRhc2t0eXBlID09IFRBU0tfVElFRCk7CisgIEtNUF9ERUJVR19BU1NFUlQodGllZF90YXNrID09IGVuZGluZ190YXNrKTsgLy8gSWYgd2UgYnVpbHQgdGhlIHN0YWNrIGNvcnJlY3RseQorCisgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3BvcF90YXNrX3N0YWNrKGV4aXQpOiBHVElEOiAlZDsgVEFTSzogJXBcbiIsIGd0aWQsCisgICAgICAgICAgICAgICAgdGllZF90YXNrKSk7CisgIHJldHVybjsKK30KKyNlbmRpZiAvKiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sgKi8KKworLy8gIF9fa21wX3B1c2hfdGFzazogQWRkIGEgdGFzayB0byB0aGUgdGhyZWFkJ3MgZGVxdWUKK3N0YXRpYyBrbXBfaW50MzIgX19rbXBfcHVzaF90YXNrKGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICp0YXNrKSB7CisgIGttcF9pbmZvX3QgKnRocmVhZCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgIGttcF90YXNrZGF0YV90ICp0YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spOworICBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSA9IHRocmVhZC0+dGgudGhfdGFza190ZWFtOworICBrbXBfaW50MzIgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKyAga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhOworCisgIEtBX1RSQUNFKDIwLAorICAgICAgICAgICAoIl9fa21wX3B1c2hfdGFzazogVCMlZCB0cnlpbmcgdG8gcHVzaCB0YXNrICVwLlxuIiwgZ3RpZCwgdGFza2RhdGEpKTsKKworICBpZiAodGFza2RhdGEtPnRkX2ZsYWdzLnRpZWRuZXNzID09IFRBU0tfVU5USUVEKSB7CisgICAgLy8gdW50aWVkIHRhc2sgbmVlZHMgdG8gaW5jcmVtZW50IGNvdW50ZXIgc28gdGhhdCB0aGUgdGFzayBzdHJ1Y3R1cmUgaXMgbm90CisgICAgLy8gZnJlZWQgcHJlbWF0dXJlbHkKKyAgICBrbXBfaW50MzIgY291bnRlciA9IDEgKyBLTVBfVEVTVF9USEVOX0lOQzMyKCZ0YXNrZGF0YS0+dGRfdW50aWVkX2NvdW50KTsKKyAgICBLQV9UUkFDRSgKKyAgICAgICAgMjAsCisgICAgICAgICgiX19rbXBfcHVzaF90YXNrOiBUIyVkIHVudGllZF9jb3VudCAoJWQpIGluY3JlbWVudGVkIGZvciB0YXNrICVwXG4iLAorICAgICAgICAgZ3RpZCwgY291bnRlciwgdGFza2RhdGEpKTsKKyAgfQorCisgIC8vIFRoZSBmaXJzdCBjaGVjayBhdm9pZHMgYnVpbGRpbmcgdGFza190ZWFtIHRocmVhZCBkYXRhIGlmIHNlcmlhbGl6ZWQKKyAgaWYgKHRhc2tkYXRhLT50ZF9mbGFncy50YXNrX3NlcmlhbCkgeworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3B1c2hfdGFzazogVCMlZCB0ZWFtIHNlcmlhbGl6ZWQ7IHJldHVybmluZyAiCisgICAgICAgICAgICAgICAgICAiVEFTS19OT1RfUFVTSEVEIGZvciB0YXNrICVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEpKTsKKyAgICByZXR1cm4gVEFTS19OT1RfUFVTSEVEOworICB9CisKKyAgLy8gTm93IHRoYXQgc2VyaWFsaXplZCB0YXNrcyBoYXZlIHJldHVybmVkLCB3ZSBjYW4gYXNzdW1lIHRoYXQgd2UgYXJlIG5vdCBpbgorICAvLyBpbW1lZGlhdGUgZXhlYyBtb2RlCisgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpOworICBpZiAoIUtNUF9UQVNLSU5HX0VOQUJMRUQodGFza190ZWFtKSkgeworICAgIF9fa21wX2VuYWJsZV90YXNraW5nKHRhc2tfdGVhbSwgdGhyZWFkKTsKKyAgfQorICBLTVBfREVCVUdfQVNTRVJUKFRDUl80KHRhc2tfdGVhbS0+dHQudHRfZm91bmRfdGFza3MpID09IFRSVUUpOworICBLTVBfREVCVUdfQVNTRVJUKFRDUl9QVFIodGFza190ZWFtLT50dC50dF90aHJlYWRzX2RhdGEpICE9IE5VTEwpOworCisgIC8vIEZpbmQgdGFza2luZyBkZXF1ZSBzcGVjaWZpYyB0byBlbmNvdW50ZXJpbmcgdGhyZWFkCisgIHRocmVhZF9kYXRhID0gJnRhc2tfdGVhbS0+dHQudHRfdGhyZWFkc19kYXRhW3RpZF07CisKKyAgLy8gTm8gbG9jayBuZWVkZWQgc2luY2Ugb25seSBvd25lciBjYW4gYWxsb2NhdGUKKyAgaWYgKHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZSA9PSBOVUxMKSB7CisgICAgX19rbXBfYWxsb2NfdGFza19kZXF1ZSh0aHJlYWQsIHRocmVhZF9kYXRhKTsKKyAgfQorCisgIC8vIENoZWNrIGlmIGRlcXVlIGlzIGZ1bGwKKyAgaWYgKFRDUl80KHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9udGFza3MpID49CisgICAgICBUQVNLX0RFUVVFX1NJWkUodGhyZWFkX2RhdGEtPnRkKSkgeworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3B1c2hfdGFzazogVCMlZCBkZXF1ZSBpcyBmdWxsOyByZXR1cm5pbmcgIgorICAgICAgICAgICAgICAgICAgIlRBU0tfTk9UX1BVU0hFRCBmb3IgdGFzayAlcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhKSk7CisgICAgcmV0dXJuIFRBU0tfTk9UX1BVU0hFRDsKKyAgfQorCisgIC8vIExvY2sgdGhlIGRlcXVlIGZvciB0aGUgdGFzayBwdXNoIG9wZXJhdGlvbgorICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCZ0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfbG9jayk7CisKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAvLyBOZWVkIHRvIHJlY2hlY2sgYXMgd2UgY2FuIGdldCBhIHByb3h5IHRhc2sgZnJvbSBhIHRocmVhZCBvdXRzaWRlIG9mIE9wZW5NUAorICBpZiAoVENSXzQodGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX250YXNrcykgPj0KKyAgICAgIFRBU0tfREVRVUVfU0laRSh0aHJlYWRfZGF0YS0+dGQpKSB7CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jaygmdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX2xvY2spOworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3B1c2hfdGFzazogVCMlZCBkZXF1ZSBpcyBmdWxsIG9uIDJuZCBjaGVjazsgcmV0dXJuaW5nICIKKyAgICAgICAgICAgICAgICAgICJUQVNLX05PVF9QVVNIRUQgZm9yIHRhc2sgJXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSkpOworICAgIHJldHVybiBUQVNLX05PVF9QVVNIRUQ7CisgIH0KKyNlbHNlCisgIC8vIE11c3QgaGF2ZSByb29tIHNpbmNlIG5vIHRocmVhZCBjYW4gYWRkIHRhc2tzIGJ1dCBjYWxsaW5nIHRocmVhZAorICBLTVBfREVCVUdfQVNTRVJUKFRDUl80KHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9udGFza3MpIDwKKyAgICAgICAgICAgICAgICAgICBUQVNLX0RFUVVFX1NJWkUodGhyZWFkX2RhdGEtPnRkKSk7CisjZW5kaWYKKworICB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVbdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX3RhaWxdID0KKyAgICAgIHRhc2tkYXRhOyAvLyBQdXNoIHRhc2tkYXRhCisgIC8vIFdyYXAgaW5kZXguCisgIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV90YWlsID0KKyAgICAgICh0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfdGFpbCArIDEpICYgVEFTS19ERVFVRV9NQVNLKHRocmVhZF9kYXRhLT50ZCk7CisgIFRDV180KHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9udGFza3MsCisgICAgICAgIFRDUl80KHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9udGFza3MpICsgMSk7IC8vIEFkanVzdCB0YXNrIGNvdW50CisKKyAgS0FfVFJBQ0UoMjAsICgiX19rbXBfcHVzaF90YXNrOiBUIyVkIHJldHVybmluZyBUQVNLX1NVQ0NFU1NGVUxMWV9QVVNIRUQ6ICIKKyAgICAgICAgICAgICAgICAidGFzaz0lcCBudGFza3M9JWQgaGVhZD0ldSB0YWlsPSV1XG4iLAorICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfbnRhc2tzLAorICAgICAgICAgICAgICAgIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9oZWFkLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfdGFpbCkpOworCisgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJnRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9sb2NrKTsKKworICByZXR1cm4gVEFTS19TVUNDRVNTRlVMTFlfUFVTSEVEOworfQorCisvLyBfX2ttcF9wb3BfY3VycmVudF90YXNrX2Zyb21fdGhyZWFkOiBzZXQgdXAgY3VycmVudCB0YXNrIGZyb20gY2FsbGVkIHRocmVhZAorLy8gd2hlbiB0ZWFtIGVuZHMKKy8vCisvLyB0aGlzX3RocjogdGhyZWFkIHN0cnVjdHVyZSB0byBzZXQgY3VycmVudF90YXNrIGluLgordm9pZCBfX2ttcF9wb3BfY3VycmVudF90YXNrX2Zyb21fdGhyZWFkKGttcF9pbmZvX3QgKnRoaXNfdGhyKSB7CisgIEtGX1RSQUNFKDEwLCAoIl9fa21wX3BvcF9jdXJyZW50X3Rhc2tfZnJvbV90aHJlYWQoZW50ZXIpOiBUIyVkICIKKyAgICAgICAgICAgICAgICAidGhpc190aHJlYWQ9JXAsIGN1cnRhc2s9JXAsICIKKyAgICAgICAgICAgICAgICAiY3VydGFza19wYXJlbnQ9JXBcbiIsCisgICAgICAgICAgICAgICAgMCwgdGhpc190aHIsIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2ssCisgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfcGFyZW50KSk7CisKKyAgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzayA9IHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX3BhcmVudDsKKworICBLRl9UUkFDRSgxMCwgKCJfX2ttcF9wb3BfY3VycmVudF90YXNrX2Zyb21fdGhyZWFkKGV4aXQpOiBUIyVkICIKKyAgICAgICAgICAgICAgICAidGhpc190aHJlYWQ9JXAsIGN1cnRhc2s9JXAsICIKKyAgICAgICAgICAgICAgICAiY3VydGFza19wYXJlbnQ9JXBcbiIsCisgICAgICAgICAgICAgICAgMCwgdGhpc190aHIsIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2ssCisgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfcGFyZW50KSk7Cit9CisKKy8vIF9fa21wX3B1c2hfY3VycmVudF90YXNrX3RvX3RocmVhZDogc2V0IHVwIGN1cnJlbnQgdGFzayBpbiBjYWxsZWQgdGhyZWFkIGZvciBhCisvLyBuZXcgdGVhbQorLy8KKy8vIHRoaXNfdGhyOiB0aHJlYWQgc3RydWN0dXJlIHRvIHNldCB1cAorLy8gdGVhbTogdGVhbSBmb3IgaW1wbGljaXQgdGFzayBkYXRhCisvLyB0aWQ6IHRocmVhZCB3aXRoaW4gdGVhbSB0byBzZXQgdXAKK3ZvaWQgX19rbXBfcHVzaF9jdXJyZW50X3Rhc2tfdG9fdGhyZWFkKGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfdGVhbV90ICp0ZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpZCkgeworICAvLyBjdXJyZW50IHRhc2sgb2YgdGhlIHRocmVhZCBpcyBhIHBhcmVudCBvZiB0aGUgbmV3IGp1c3QgY3JlYXRlZCBpbXBsaWNpdAorICAvLyB0YXNrcyBvZiBuZXcgdGVhbQorICBLRl9UUkFDRSgxMCwgKCJfX2ttcF9wdXNoX2N1cnJlbnRfdGFza190b190aHJlYWQoZW50ZXIpOiBUIyVkIHRoaXNfdGhyZWFkPSVwICIKKyAgICAgICAgICAgICAgICAiY3VydGFzaz0lcCAiCisgICAgICAgICAgICAgICAgInBhcmVudF90YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgIHRpZCwgdGhpc190aHIsIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2ssCisgICAgICAgICAgICAgICAgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9wYXJlbnQpKTsKKworICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyICE9IE5VTEwpOworCisgIGlmICh0aWQgPT0gMCkgeworICAgIGlmICh0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrICE9ICZ0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVswXSkgeworICAgICAgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbMF0udGRfcGFyZW50ID0KKyAgICAgICAgICB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrOworICAgICAgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzayA9ICZ0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVswXTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9wYXJlbnQgPQorICAgICAgICB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVswXS50ZF9wYXJlbnQ7CisgICAgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzayA9ICZ0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdOworICB9CisKKyAgS0ZfVFJBQ0UoMTAsICgiX19rbXBfcHVzaF9jdXJyZW50X3Rhc2tfdG9fdGhyZWFkKGV4aXQpOiBUIyVkIHRoaXNfdGhyZWFkPSVwICIKKyAgICAgICAgICAgICAgICAiY3VydGFzaz0lcCAiCisgICAgICAgICAgICAgICAgInBhcmVudF90YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgIHRpZCwgdGhpc190aHIsIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2ssCisgICAgICAgICAgICAgICAgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9wYXJlbnQpKTsKK30KKworLy8gX19rbXBfdGFza19zdGFydDogYm9va2tlZXBpbmcgZm9yIGEgdGFzayBzdGFydGluZyBleGVjdXRpb24KKy8vCisvLyBHVElEOiBnbG9iYWwgdGhyZWFkIGlkIG9mIGNhbGxpbmcgdGhyZWFkCisvLyB0YXNrOiB0YXNrIHN0YXJ0aW5nIGV4ZWN1dGlvbgorLy8gY3VycmVudF90YXNrOiB0YXNrIHN1c3BlbmRpbmcKK3N0YXRpYyB2b2lkIF9fa21wX3Rhc2tfc3RhcnQoa21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKnRhc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF90YXNrZGF0YV90ICpjdXJyZW50X3Rhc2spIHsKKyAga21wX3Rhc2tkYXRhX3QgKnRhc2tkYXRhID0gS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzayk7CisgIGttcF9pbmZvX3QgKnRocmVhZCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisKKyAgS0FfVFJBQ0UoMTAsCisgICAgICAgICAgICgiX19rbXBfdGFza19zdGFydChlbnRlcik6IFQjJWQgc3RhcnRpbmcgdGFzayAlcDogY3VycmVudF90YXNrPSVwXG4iLAorICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIGN1cnJlbnRfdGFzaykpOworCisgIEtNUF9ERUJVR19BU1NFUlQodGFza2RhdGEtPnRkX2ZsYWdzLnRhc2t0eXBlID09IFRBU0tfRVhQTElDSVQpOworCisgIC8vIG1hcmsgY3VycmVudGx5IGV4ZWN1dGluZyB0YXNrIGFzIHN1c3BlbmRlZAorICAvLyBUT0RPOiBHRUggLSBtYWtlIHN1cmUgcm9vdCB0ZWFtIGltcGxpY2l0IHRhc2sgaXMgaW5pdGlhbGl6ZWQgcHJvcGVybHkuCisgIC8vIEtNUF9ERUJVR19BU1NFUlQoIGN1cnJlbnRfdGFzayAtPiB0ZF9mbGFncy5leGVjdXRpbmcgPT0gMSApOworICBjdXJyZW50X3Rhc2stPnRkX2ZsYWdzLmV4ZWN1dGluZyA9IDA7CisKKy8vIEFkZCB0YXNrIHRvIHN0YWNrIGlmIHRpZWQKKyNpZmRlZiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKKyAgaWYgKHRhc2tkYXRhLT50ZF9mbGFncy50aWVkbmVzcyA9PSBUQVNLX1RJRUQpIHsKKyAgICBfX2ttcF9wdXNoX3Rhc2tfc3RhY2soZ3RpZCwgdGhyZWFkLCB0YXNrZGF0YSk7CisgIH0KKyNlbmRpZiAvKiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sgKi8KKworICAvLyBtYXJrIHN0YXJ0aW5nIHRhc2sgYXMgZXhlY3V0aW5nIGFuZCBhcyBjdXJyZW50IHRhc2sKKyAgdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2sgPSB0YXNrZGF0YTsKKworICBLTVBfREVCVUdfQVNTRVJUKHRhc2tkYXRhLT50ZF9mbGFncy5zdGFydGVkID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICB0YXNrZGF0YS0+dGRfZmxhZ3MudGllZG5lc3MgPT0gVEFTS19VTlRJRUQpOworICBLTVBfREVCVUdfQVNTRVJUKHRhc2tkYXRhLT50ZF9mbGFncy5leGVjdXRpbmcgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgIHRhc2tkYXRhLT50ZF9mbGFncy50aWVkbmVzcyA9PSBUQVNLX1VOVElFRCk7CisgIHRhc2tkYXRhLT50ZF9mbGFncy5zdGFydGVkID0gMTsKKyAgdGFza2RhdGEtPnRkX2ZsYWdzLmV4ZWN1dGluZyA9IDE7CisgIEtNUF9ERUJVR19BU1NFUlQodGFza2RhdGEtPnRkX2ZsYWdzLmNvbXBsZXRlID09IDApOworICBLTVBfREVCVUdfQVNTRVJUKHRhc2tkYXRhLT50ZF9mbGFncy5mcmVlZCA9PSAwKTsKKworICAvLyBHRUggVE9ETzogc2hvdWxkbid0IHdlIHBhc3Mgc29tZSBzb3J0IG9mIGxvY2F0aW9uIGlkZW50aWZpZXIgaGVyZT8KKyAgLy8gQVBUOiB5ZXMsIHdlIHdpbGwgcGFzcyBsb2NhdGlvbiBoZXJlLgorICAvLyBuZWVkIHRvIHN0b3JlIGN1cnJlbnQgdGhyZWFkIHN0YXRlIChpbiBhIHRocmVhZCBvciB0YXNrZGF0YSBzdHJ1Y3R1cmUpCisgIC8vIGJlZm9yZSBzZXR0aW5nIHdvcmtfc3RhdGUsIG90aGVyd2lzZSB3cm9uZyBzdGF0ZSBpcyBzZXQgYWZ0ZXIgZW5kIG9mIHRhc2sKKworICBLQV9UUkFDRSgxMCwgKCJfX2ttcF90YXNrX3N0YXJ0KGV4aXQpOiBUIyVkIHRhc2s9JXBcbiIsIGd0aWQsIHRhc2tkYXRhKSk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgaWYgKG9tcHRfZW5hYmxlZCAmJiBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGFza19iZWdpbikpIHsKKyAgICBrbXBfdGFza2RhdGFfdCAqcGFyZW50ID0gdGFza2RhdGEtPnRkX3BhcmVudDsKKyAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGFza19iZWdpbikoCisgICAgICAgIHBhcmVudCA/IHBhcmVudC0+b21wdF90YXNrX2luZm8udGFza19pZCA6IG9tcHRfdGFza19pZF9ub25lLAorICAgICAgICBwYXJlbnQgPyAmKHBhcmVudC0+b21wdF90YXNrX2luZm8uZnJhbWUpIDogTlVMTCwKKyAgICAgICAgdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLnRhc2tfaWQsIHRhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby5mdW5jdGlvbik7CisgIH0KKyNlbmRpZgorI2lmIE9NUF80MF9FTkFCTEVEICYmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgIC8qIE9NUFQgZW1pdCBhbGwgZGVwZW5kZW5jZXMgaWYgcmVxdWVzdGVkIGJ5IHRoZSB0b29sICovCisgIGlmIChvbXB0X2VuYWJsZWQgJiYgdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLm5kZXBzID4gMCAmJgorICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3Rhc2tfZGVwZW5kZW5jZXMpKSB7CisgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3Rhc2tfZGVwZW5kZW5jZXMpKAorICAgICAgICB0YXNrZGF0YS0+b21wdF90YXNrX2luZm8udGFza19pZCwgdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLmRlcHMsCisgICAgICAgIHRhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby5uZGVwcyk7CisgICAgLyogV2UgY2FuIG5vdyBmcmVlIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGZvciB0aGUgZGVwZW5kZW5jaWVzICovCisgICAgS01QX09NUFRfREVQU19GUkVFKHRocmVhZCwgdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLmRlcHMpOworICAgIHRhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby5kZXBzID0gTlVMTDsKKyAgICB0YXNrZGF0YS0+b21wdF90YXNrX2luZm8ubmRlcHMgPSAwOworICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgJiYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UgKi8KKworICByZXR1cm47Cit9CisKKy8vIF9fa21wY19vbXBfdGFza19iZWdpbl9pZjA6IHJlcG9ydCB0aGF0IGEgZ2l2ZW4gc2VyaWFsaXplZCB0YXNrIGhhcyBzdGFydGVkCisvLyBleGVjdXRpb24KKy8vCisvLyBsb2NfcmVmOiBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb247IHBvaW50cyB0byBiZWdpbm5pbmcgb2YgdGFzayBibG9jay4KKy8vIGd0aWQ6IGdsb2JhbCB0aHJlYWQgbnVtYmVyLgorLy8gdGFzazogdGFzayB0aHVuayBmb3IgdGhlIHN0YXJ0ZWQgdGFzay4KK3ZvaWQgX19rbXBjX29tcF90YXNrX2JlZ2luX2lmMChpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdGFza190ICp0YXNrKSB7CisgIGttcF90YXNrZGF0YV90ICp0YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spOworICBrbXBfdGFza2RhdGFfdCAqY3VycmVudF90YXNrID0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfY3VycmVudF90YXNrOworCisgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza19iZWdpbl9pZjAoZW50ZXIpOiBUIyVkIGxvYz0lcCB0YXNrPSVwICIKKyAgICAgICAgICAgICAgICAiY3VycmVudF90YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIHRhc2tkYXRhLCBjdXJyZW50X3Rhc2spKTsKKworICBpZiAodGFza2RhdGEtPnRkX2ZsYWdzLnRpZWRuZXNzID09IFRBU0tfVU5USUVEKSB7CisgICAgLy8gdW50aWVkIHRhc2sgbmVlZHMgdG8gaW5jcmVtZW50IGNvdW50ZXIgc28gdGhhdCB0aGUgdGFzayBzdHJ1Y3R1cmUgaXMgbm90CisgICAgLy8gZnJlZWQgcHJlbWF0dXJlbHkKKyAgICBrbXBfaW50MzIgY291bnRlciA9IDEgKyBLTVBfVEVTVF9USEVOX0lOQzMyKCZ0YXNrZGF0YS0+dGRfdW50aWVkX2NvdW50KTsKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcGNfb21wX3Rhc2tfYmVnaW5faWYwOiBUIyVkIHVudGllZF9jb3VudCAoJWQpICIKKyAgICAgICAgICAgICAgICAgICJpbmNyZW1lbnRlZCBmb3IgdGFzayAlcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGNvdW50ZXIsIHRhc2tkYXRhKSk7CisgIH0KKworICB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza19zZXJpYWwgPQorICAgICAgMTsgLy8gRXhlY3V0ZSB0aGlzIHRhc2sgaW1tZWRpYXRlbHksIG5vdCBkZWZlcnJlZC4KKyAgX19rbXBfdGFza19zdGFydChndGlkLCB0YXNrLCBjdXJyZW50X3Rhc2spOworCisgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza19iZWdpbl9pZjAoZXhpdCk6IFQjJWQgbG9jPSVwIHRhc2s9JXAsXG4iLCBndGlkLAorICAgICAgICAgICAgICAgIGxvY19yZWYsIHRhc2tkYXRhKSk7CisKKyAgcmV0dXJuOworfQorCisjaWZkZWYgVEFTS19VTlVTRUQKKy8vIF9fa21wY19vbXBfdGFza19iZWdpbjogcmVwb3J0IHRoYXQgYSBnaXZlbiB0YXNrIGhhcyBzdGFydGVkIGV4ZWN1dGlvbgorLy8gTkVWRVIgR0VORVJBVEVEIEJZIENPTVBJTEVSLCBERVBSRUNBVEVEISEhCit2b2lkIF9fa21wY19vbXBfdGFza19iZWdpbihpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqdGFzaykgeworICBrbXBfdGFza2RhdGFfdCAqY3VycmVudF90YXNrID0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfY3VycmVudF90YXNrOworCisgIEtBX1RSQUNFKAorICAgICAgMTAsCisgICAgICAoIl9fa21wY19vbXBfdGFza19iZWdpbihlbnRlcik6IFQjJWQgbG9jPSVwIHRhc2s9JXAgY3VycmVudF90YXNrPSVwXG4iLAorICAgICAgIGd0aWQsIGxvY19yZWYsIEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spLCBjdXJyZW50X3Rhc2spKTsKKworICBfX2ttcF90YXNrX3N0YXJ0KGd0aWQsIHRhc2ssIGN1cnJlbnRfdGFzayk7CisKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX2JlZ2luKGV4aXQpOiBUIyVkIGxvYz0lcCB0YXNrPSVwLFxuIiwgZ3RpZCwKKyAgICAgICAgICAgICAgICBsb2NfcmVmLCBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKSkpOworICByZXR1cm47Cit9CisjZW5kaWYgLy8gVEFTS19VTlVTRUQKKworLy8gX19rbXBfZnJlZV90YXNrOiBmcmVlIHRoZSBjdXJyZW50IHRhc2sgc3BhY2UgYW5kIHRoZSBzcGFjZSBmb3Igc2hhcmVkcworLy8KKy8vIGd0aWQ6IEdsb2JhbCB0aHJlYWQgSUQgb2YgY2FsbGluZyB0aHJlYWQKKy8vIHRhc2tkYXRhOiB0YXNrIHRvIGZyZWUKKy8vIHRocmVhZDogdGhyZWFkIGRhdGEgc3RydWN0dXJlIG9mIGNhbGxlcgorc3RhdGljIHZvaWQgX19rbXBfZnJlZV90YXNrKGttcF9pbnQzMiBndGlkLCBrbXBfdGFza2RhdGFfdCAqdGFza2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2luZm9fdCAqdGhyZWFkKSB7CisgIEtBX1RSQUNFKDMwLCAoIl9fa21wX2ZyZWVfdGFzazogVCMlZCBmcmVlaW5nIGRhdGEgZnJvbSB0YXNrICVwXG4iLCBndGlkLAorICAgICAgICAgICAgICAgIHRhc2tkYXRhKSk7CisKKyAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIGFsbCBmbGFncyBhbmQgY291bnRlcnMgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZXMKKyAgS01QX0RFQlVHX0FTU0VSVCh0YXNrZGF0YS0+dGRfZmxhZ3MudGFza3R5cGUgPT0gVEFTS19FWFBMSUNJVCk7CisgIEtNUF9ERUJVR19BU1NFUlQodGFza2RhdGEtPnRkX2ZsYWdzLmV4ZWN1dGluZyA9PSAwKTsKKyAgS01QX0RFQlVHX0FTU0VSVCh0YXNrZGF0YS0+dGRfZmxhZ3MuY29tcGxldGUgPT0gMSk7CisgIEtNUF9ERUJVR19BU1NFUlQodGFza2RhdGEtPnRkX2ZsYWdzLmZyZWVkID09IDApOworICBLTVBfREVCVUdfQVNTRVJUKFRDUl80KHRhc2tkYXRhLT50ZF9hbGxvY2F0ZWRfY2hpbGRfdGFza3MpID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza19zZXJpYWwgPT0gMSk7CisgIEtNUF9ERUJVR19BU1NFUlQoVENSXzQodGFza2RhdGEtPnRkX2luY29tcGxldGVfY2hpbGRfdGFza3MpID09IDApOworCisgIHRhc2tkYXRhLT50ZF9mbGFncy5mcmVlZCA9IDE7CisgIEFOTk9UQVRFX0hBUFBFTlNfQkVGT1JFKHRhc2tkYXRhKTsKKy8vIGRlYWxsb2NhdGUgdGhlIHRhc2tkYXRhIGFuZCBzaGFyZWQgdmFyaWFibGUgYmxvY2tzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRhc2sKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgX19rbXBfZmFzdF9mcmVlKHRocmVhZCwgdGFza2RhdGEpOworI2Vsc2UgLyogISBVU0VfRkFTVF9NRU1PUlkgKi8KKyAgX19rbXBfdGhyZWFkX2ZyZWUodGhyZWFkLCB0YXNrZGF0YSk7CisjZW5kaWYKKworICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9mcmVlX3Rhc2s6IFQjJWQgZnJlZWQgdGFzayAlcFxuIiwgZ3RpZCwgdGFza2RhdGEpKTsKK30KKworLy8gX19rbXBfZnJlZV90YXNrX2FuZF9hbmNlc3RvcnM6IGZyZWUgdGhlIGN1cnJlbnQgdGFzayBhbmQgYW5jZXN0b3JzIHdpdGhvdXQKKy8vIGNoaWxkcmVuCisvLworLy8gZ3RpZDogR2xvYmFsIHRocmVhZCBJRCBvZiBjYWxsaW5nIHRocmVhZAorLy8gdGFza2RhdGE6IHRhc2sgdG8gZnJlZQorLy8gdGhyZWFkOiB0aHJlYWQgZGF0YSBzdHJ1Y3R1cmUgb2YgY2FsbGVyCitzdGF0aWMgdm9pZCBfX2ttcF9mcmVlX3Rhc2tfYW5kX2FuY2VzdG9ycyhrbXBfaW50MzIgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF90YXNrZGF0YV90ICp0YXNrZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKnRocmVhZCkgeworI2lmIE9NUF80NV9FTkFCTEVECisgIC8vIFByb3h5IHRhc2tzIG11c3QgYWx3YXlzIGJlIGFsbG93ZWQgdG8gZnJlZSB0aGVpciBwYXJlbnRzCisgIC8vIGJlY2F1c2UgdGhleSBjYW4gYmUgcnVuIGluIGJhY2tncm91bmQgZXZlbiBpbiBzZXJpYWwgbW9kZS4KKyAga21wX2ludDMyIHRlYW1fc2VyaWFsID0KKyAgICAgICh0YXNrZGF0YS0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgfHwgdGFza2RhdGEtPnRkX2ZsYWdzLnRhc2tpbmdfc2VyKSAmJgorICAgICAgIXRhc2tkYXRhLT50ZF9mbGFncy5wcm94eTsKKyNlbHNlCisgIGttcF9pbnQzMiB0ZWFtX3NlcmlhbCA9CisgICAgICB0YXNrZGF0YS0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgfHwgdGFza2RhdGEtPnRkX2ZsYWdzLnRhc2tpbmdfc2VyOworI2VuZGlmCisgIEtNUF9ERUJVR19BU1NFUlQodGFza2RhdGEtPnRkX2ZsYWdzLnRhc2t0eXBlID09IFRBU0tfRVhQTElDSVQpOworCisgIGttcF9pbnQzMiBjaGlsZHJlbiA9CisgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKCZ0YXNrZGF0YS0+dGRfYWxsb2NhdGVkX2NoaWxkX3Rhc2tzKSAtIDE7CisgIEtNUF9ERUJVR19BU1NFUlQoY2hpbGRyZW4gPj0gMCk7CisKKyAgLy8gTm93LCBnbyB1cCB0aGUgYW5jZXN0b3IgdHJlZSB0byBzZWUgaWYgYW55IGFuY2VzdG9ycyBjYW4gbm93IGJlIGZyZWVkLgorICB3aGlsZSAoY2hpbGRyZW4gPT0gMCkgeworICAgIGttcF90YXNrZGF0YV90ICpwYXJlbnRfdGFza2RhdGEgPSB0YXNrZGF0YS0+dGRfcGFyZW50OworCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfZnJlZV90YXNrX2FuZF9hbmNlc3RvcnMoZW50ZXIpOiBUIyVkIHRhc2sgJXAgY29tcGxldGUgIgorICAgICAgICAgICAgICAgICAgImFuZCBmcmVlaW5nIGl0c2VsZlxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhKSk7CisKKyAgICAvLyAtLS0gRGVhbGxvY2F0ZSBteSBhbmNlc3RvciB0YXNrIC0tLQorICAgIF9fa21wX2ZyZWVfdGFzayhndGlkLCB0YXNrZGF0YSwgdGhyZWFkKTsKKworICAgIHRhc2tkYXRhID0gcGFyZW50X3Rhc2tkYXRhOworCisgICAgLy8gU3RvcCBjaGVja2luZyBhbmNlc3RvcnMgYXQgaW1wbGljaXQgdGFzayBpbnN0ZWFkIG9mIHdhbGtpbmcgdXAgYW5jZXN0b3IKKyAgICAvLyB0cmVlIHRvIGF2b2lkIHByZW1hdHVyZSBkZWFsbG9jYXRpb24gb2YgYW5jZXN0b3JzLgorICAgIGlmICh0ZWFtX3NlcmlhbCB8fCB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza3R5cGUgPT0gVEFTS19JTVBMSUNJVCkKKyAgICAgIHJldHVybjsKKworICAgIC8vIFByZWRlY3JlbWVudCBzaW11bGF0ZWQgYnkgIi0gMSIgY2FsY3VsYXRpb24KKyAgICBjaGlsZHJlbiA9IEtNUF9URVNUX1RIRU5fREVDMzIoJnRhc2tkYXRhLT50ZF9hbGxvY2F0ZWRfY2hpbGRfdGFza3MpIC0gMTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKGNoaWxkcmVuID49IDApOworICB9CisKKyAgS0FfVFJBQ0UoCisgICAgICAyMCwgKCJfX2ttcF9mcmVlX3Rhc2tfYW5kX2FuY2VzdG9ycyhleGl0KTogVCMlZCB0YXNrICVwIGhhcyAlZCBjaGlsZHJlbjsgIgorICAgICAgICAgICAibm90IGZyZWVpbmcgaXQgeWV0XG4iLAorICAgICAgICAgICBndGlkLCB0YXNrZGF0YSwgY2hpbGRyZW4pKTsKK30KKworLy8gX19rbXBfdGFza19maW5pc2g6IGJvb2trZWVwaW5nIHRvIGRvIHdoZW4gYSB0YXNrIGZpbmlzaGVzIGV4ZWN1dGlvbgorLy8KKy8vIGd0aWQ6IGdsb2JhbCB0aHJlYWQgSUQgZm9yIGNhbGxpbmcgdGhyZWFkCisvLyB0YXNrOiB0YXNrIHRvIGJlIGZpbmlzaGVkCisvLyByZXN1bWVkX3Rhc2s6IHRhc2sgdG8gYmUgcmVzdW1lZC4gIChtYXkgYmUgTlVMTCBpZiB0YXNrIGlzIHNlcmlhbGl6ZWQpCitzdGF0aWMgdm9pZCBfX2ttcF90YXNrX2ZpbmlzaChrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqdGFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF90YXNrZGF0YV90ICpyZXN1bWVkX3Rhc2spIHsKKyAga21wX3Rhc2tkYXRhX3QgKnRhc2tkYXRhID0gS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzayk7CisgIGttcF9pbmZvX3QgKnRocmVhZCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtID0KKyAgICAgIHRocmVhZC0+dGgudGhfdGFza190ZWFtOyAvLyBtaWdodCBiZSBOVUxMIGZvciBzZXJpYWwgdGVhbXMuLi4KKyAga21wX2ludDMyIGNoaWxkcmVuID0gMDsKKworI2lmIE9NUFRfU1VQUE9SVAorICBpZiAob21wdF9lbmFibGVkICYmIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90YXNrX2VuZCkpIHsKKyAgICBrbXBfdGFza2RhdGFfdCAqcGFyZW50ID0gdGFza2RhdGEtPnRkX3BhcmVudDsKKyAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGFza19lbmQpKAorICAgICAgICB0YXNrZGF0YS0+b21wdF90YXNrX2luZm8udGFza19pZCk7CisgIH0KKyNlbmRpZgorCisgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3Rhc2tfZmluaXNoKGVudGVyKTogVCMlZCBmaW5pc2hpbmcgdGFzayAlcCBhbmQgcmVzdW1pbmcgIgorICAgICAgICAgICAgICAgICJ0YXNrICVwXG4iLAorICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhLCByZXN1bWVkX3Rhc2spKTsKKworICBLTVBfREVCVUdfQVNTRVJUKHRhc2tkYXRhLT50ZF9mbGFncy50YXNrdHlwZSA9PSBUQVNLX0VYUExJQ0lUKTsKKworLy8gUG9wIHRhc2sgZnJvbSBzdGFjayBpZiB0aWVkCisjaWZkZWYgQlVJTERfVElFRF9UQVNLX1NUQUNLCisgIGlmICh0YXNrZGF0YS0+dGRfZmxhZ3MudGllZG5lc3MgPT0gVEFTS19USUVEKSB7CisgICAgX19rbXBfcG9wX3Rhc2tfc3RhY2soZ3RpZCwgdGhyZWFkLCB0YXNrZGF0YSk7CisgIH0KKyNlbmRpZiAvKiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sgKi8KKworICBpZiAodGFza2RhdGEtPnRkX2ZsYWdzLnRpZWRuZXNzID09IFRBU0tfVU5USUVEKSB7CisgICAgLy8gdW50aWVkIHRhc2sgbmVlZHMgdG8gY2hlY2sgdGhlIGNvdW50ZXIgc28gdGhhdCB0aGUgdGFzayBzdHJ1Y3R1cmUgaXMgbm90CisgICAgLy8gZnJlZWQgcHJlbWF0dXJlbHkKKyAgICBrbXBfaW50MzIgY291bnRlciA9IEtNUF9URVNUX1RIRU5fREVDMzIoJnRhc2tkYXRhLT50ZF91bnRpZWRfY291bnQpIC0gMTsKKyAgICBLQV9UUkFDRSgKKyAgICAgICAgMjAsCisgICAgICAgICgiX19rbXBfdGFza19maW5pc2g6IFQjJWQgdW50aWVkX2NvdW50ICglZCkgZGVjcmVtZW50ZWQgZm9yIHRhc2sgJXBcbiIsCisgICAgICAgICBndGlkLCBjb3VudGVyLCB0YXNrZGF0YSkpOworICAgIGlmIChjb3VudGVyID4gMCkgeworICAgICAgLy8gdW50aWVkIHRhc2sgaXMgbm90IGRvbmUsIHRvIGJlIGNvbnRpbnVlZCBwb3NzaWJseSBieSBvdGhlciB0aHJlYWQsIGRvCisgICAgICAvLyBub3QgZnJlZSBpdCBub3cKKyAgICAgIGlmIChyZXN1bWVkX3Rhc2sgPT0gTlVMTCkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRhc2tkYXRhLT50ZF9mbGFncy50YXNrX3NlcmlhbCk7CisgICAgICAgIHJlc3VtZWRfdGFzayA9IHRhc2tkYXRhLT50ZF9wYXJlbnQ7IC8vIEluIGEgc2VyaWFsaXplZCB0YXNrLCB0aGUgcmVzdW1lZAorICAgICAgICAvLyB0YXNrIGlzIHRoZSBwYXJlbnQKKyAgICAgIH0KKyAgICAgIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrID0gcmVzdW1lZF90YXNrOyAvLyByZXN0b3JlIGN1cnJlbnRfdGFzaworICAgICAgcmVzdW1lZF90YXNrLT50ZF9mbGFncy5leGVjdXRpbmcgPSAxOyAvLyByZXN1bWUgcHJldmlvdXMgdGFzaworICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfdGFza19maW5pc2goZXhpdCk6IFQjJWQgcGFydGlhbGx5IGRvbmUgdGFzayAlcCwgIgorICAgICAgICAgICAgICAgICAgICAicmVzdW1pbmcgdGFzayAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIHJlc3VtZWRfdGFzaykpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIEtNUF9ERUJVR19BU1NFUlQodGFza2RhdGEtPnRkX2ZsYWdzLmNvbXBsZXRlID09IDApOworICB0YXNrZGF0YS0+dGRfZmxhZ3MuY29tcGxldGUgPSAxOyAvLyBtYXJrIHRoZSB0YXNrIGFzIGNvbXBsZXRlZAorICBLTVBfREVCVUdfQVNTRVJUKHRhc2tkYXRhLT50ZF9mbGFncy5zdGFydGVkID09IDEpOworICBLTVBfREVCVUdfQVNTRVJUKHRhc2tkYXRhLT50ZF9mbGFncy5mcmVlZCA9PSAwKTsKKworICAvLyBPbmx5IG5lZWQgdG8ga2VlcCB0cmFjayBvZiBjb3VudCBpZiB0ZWFtIHBhcmFsbGVsIGFuZCB0YXNraW5nIG5vdAorICAvLyBzZXJpYWxpemVkCisgIGlmICghKHRhc2tkYXRhLT50ZF9mbGFncy50ZWFtX3NlcmlhbCB8fCB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza2luZ19zZXIpKSB7CisgICAgLy8gUHJlZGVjcmVtZW50IHNpbXVsYXRlZCBieSAiLSAxIiBjYWxjdWxhdGlvbgorICAgIGNoaWxkcmVuID0KKyAgICAgICAgS01QX1RFU1RfVEhFTl9ERUMzMigmdGFza2RhdGEtPnRkX3BhcmVudC0+dGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcykgLQorICAgICAgICAxOworICAgIEtNUF9ERUJVR19BU1NFUlQoY2hpbGRyZW4gPj0gMCk7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAodGFza2RhdGEtPnRkX3Rhc2tncm91cCkKKyAgICAgIEtNUF9URVNUX1RIRU5fREVDMzIoKGttcF9pbnQzMiAqKSgmdGFza2RhdGEtPnRkX3Rhc2tncm91cC0+Y291bnQpKTsKKyNpZiBPTVBfNDVfRU5BQkxFRAorICB9CisgIC8vIGlmIHdlIGZvdW5kIHByb3h5IHRhc2tzIHRoZXJlIGNvdWxkIGV4aXN0IGEgZGVwZW5kZW5jeSBjaGFpbgorICAvLyB3aXRoIHRoZSBwcm94eSB0YXNrIGFzIG9yaWdpbgorICBpZiAoISh0YXNrZGF0YS0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgfHwgdGFza2RhdGEtPnRkX2ZsYWdzLnRhc2tpbmdfc2VyKSB8fAorICAgICAgKHRhc2tfdGVhbSAmJiB0YXNrX3RlYW0tPnR0LnR0X2ZvdW5kX3Byb3h5X3Rhc2tzKSkgeworI2VuZGlmCisgICAgX19rbXBfcmVsZWFzZV9kZXBzKGd0aWQsIHRhc2tkYXRhKTsKKyNlbmRpZgorICB9CisKKyAgLy8gdGRfZmxhZ3MuZXhlY3V0aW5nIG11c3QgYmUgbWFya2VkIGFzIDAgYWZ0ZXIgX19rbXBfcmVsZWFzZV9kZXBzIGhhcyBiZWVuCisgIC8vIGNhbGxlZC4gT3RoZXJ0d2lzZSwgaWYgYSB0YXNrIGlzIGV4ZWN1dGVkIGltbWVkaWF0ZWx5IGZyb20gdGhlIHJlbGVhc2VfZGVwcworICAvLyBjb2RlLCB0aGUgZmxhZyB3aWxsIGJlIHJlc2V0IHRvIDEgYWdhaW4gYnkgdGhpcyBzYW1lIGZ1bmN0aW9uCisgIEtNUF9ERUJVR19BU1NFUlQodGFza2RhdGEtPnRkX2ZsYWdzLmV4ZWN1dGluZyA9PSAxKTsKKyAgdGFza2RhdGEtPnRkX2ZsYWdzLmV4ZWN1dGluZyA9IDA7IC8vIHN1c3BlbmQgdGhlIGZpbmlzaGluZyB0YXNrCisKKyAgS0FfVFJBQ0UoCisgICAgICAyMCwgKCJfX2ttcF90YXNrX2ZpbmlzaDogVCMlZCBmaW5pc2hlZCB0YXNrICVwLCAlZCBpbmNvbXBsZXRlIGNoaWxkcmVuXG4iLAorICAgICAgICAgICBndGlkLCB0YXNrZGF0YSwgY2hpbGRyZW4pKTsKKworI2lmIE9NUF80MF9FTkFCTEVECisgIC8qIElmIHRoZSB0YXNrcycgZGVzdHJ1Y3RvciB0aHVuayBmbGFnIGhhcyBiZWVuIHNldCwgd2UgbmVlZCB0byBpbnZva2UgdGhlCisgICAgIGRlc3RydWN0b3IgdGh1bmsgdGhhdCBoYXMgYmVlbiBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyLiBUaGUgY29kZSBpcworICAgICBwbGFjZWQgaGVyZSwgc2luY2UgYXQgdGhpcyBwb2ludCBvdGhlciB0YXNrcyBtaWdodCBoYXZlIGJlZW4gcmVsZWFzZWQKKyAgICAgaGVuY2Ugb3ZlcmxhcHBpbmcgdGhlIGRlc3RydWN0b3IgaW52b2thdGlvbnMgd2l0aCBzb21lIG90aGVyIHdvcmsgaW4gdGhlCisgICAgIHJlbGVhc2VkIHRhc2tzLiAgVGhlIE9wZW5NUCBzcGVjIGlzIG5vdCBzcGVjaWZpYyBvbiB3aGVuIHRoZSBkZXN0cnVjdG9ycworICAgICBhcmUgaW52b2tlZCwgc28gd2Ugc2hvdWxkIGJlIGZyZWUgdG8gY2hvb3NlLiAqLworICBpZiAodGFza2RhdGEtPnRkX2ZsYWdzLmRlc3RydWN0b3JzX3RodW5rKSB7CisgICAga21wX3JvdXRpbmVfZW50cnlfdCBkZXN0cl90aHVuayA9IHRhc2stPmRhdGExLmRlc3RydWN0b3JzOworICAgIEtNUF9BU1NFUlQoZGVzdHJfdGh1bmspOworICAgIGRlc3RyX3RodW5rKGd0aWQsIHRhc2spOworICB9CisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworICAvLyBib29ra2VlcGluZyBmb3IgcmVzdW1pbmcgdGFzazoKKyAgLy8gR0VIIC0gbm90ZSB0YXNraW5nX3NlciA9PiB0YXNrX3NlcmlhbAorICBLTVBfREVCVUdfQVNTRVJUKAorICAgICAgKHRhc2tkYXRhLT50ZF9mbGFncy50YXNraW5nX3NlciB8fCB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza19zZXJpYWwpID09CisgICAgICB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza19zZXJpYWwpOworICBpZiAodGFza2RhdGEtPnRkX2ZsYWdzLnRhc2tfc2VyaWFsKSB7CisgICAgaWYgKHJlc3VtZWRfdGFzayA9PSBOVUxMKSB7CisgICAgICByZXN1bWVkX3Rhc2sgPSB0YXNrZGF0YS0+dGRfcGFyZW50OyAvLyBJbiBhIHNlcmlhbGl6ZWQgdGFzaywgdGhlIHJlc3VtZWQKKyAgICAgIC8vIHRhc2sgaXMgdGhlIHBhcmVudAorICAgIH0gZWxzZQorI2lmIE9NUF80NV9FTkFCTEVECisgICAgICAgIGlmICghKHRhc2tfdGVhbSAmJiB0YXNrX3RlYW0tPnR0LnR0X2ZvdW5kX3Byb3h5X3Rhc2tzKSkKKyNlbmRpZgorICAgIHsKKyAgICAgIC8vIHZlcmlmeSByZXN1bWVkIHRhc2sgcGFzc2VkIGluIHBvaW50cyB0byBwYXJlbnQKKyAgICAgIEtNUF9ERUJVR19BU1NFUlQocmVzdW1lZF90YXNrID09IHRhc2tkYXRhLT50ZF9wYXJlbnQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHJlc3VtZWRfdGFzayAhPQorICAgICAgICAgICAgICAgICAgICAgTlVMTCk7IC8vIHZlcmlmeSB0aGF0IHJlc3VtZWQgdGFzayBpcyBwYXNzZWQgYXMgYXJndWVtbnQKKyAgfQorCisgIC8vIEZyZWUgdGhpcyB0YXNrIGFuZCB0aGVuIGFuY2VzdG9yIHRhc2tzIGlmIHRoZXkgaGF2ZSBubyBjaGlsZHJlbi4KKyAgLy8gUmVzdG9yZSB0aF9jdXJyZW50X3Rhc2sgZmlyc3QgYXMgc3VnZ2VzdGVkIGJ5IEpvaG46CisgIC8vIGpvaG5tYzogaWYgYW4gYXN5bmNocm9ub3VzIGlucXVpcnkgcGVlcnMgaW50byB0aGUgcnVudGltZSBzeXN0ZW0KKyAgLy8gaXQgZG9lc24ndCBzZWUgdGhlIGZyZWVkIHRhc2sgYXMgdGhlIGN1cnJlbnQgdGFzay4KKyAgdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2sgPSByZXN1bWVkX3Rhc2s7CisgIF9fa21wX2ZyZWVfdGFza19hbmRfYW5jZXN0b3JzKGd0aWQsIHRhc2tkYXRhLCB0aHJlYWQpOworCisgIC8vIFRPRE86IEdFSCAtIG1ha2Ugc3VyZSByb290IHRlYW0gaW1wbGljaXQgdGFzayBpcyBpbml0aWFsaXplZCBwcm9wZXJseS4KKyAgLy8gS01QX0RFQlVHX0FTU0VSVCggcmVzdW1lZF90YXNrLT50ZF9mbGFncy5leGVjdXRpbmcgPT0gMCApOworICByZXN1bWVkX3Rhc2stPnRkX2ZsYWdzLmV4ZWN1dGluZyA9IDE7IC8vIHJlc3VtZSBwcmV2aW91cyB0YXNrCisKKyAgS0FfVFJBQ0UoCisgICAgICAxMCwgKCJfX2ttcF90YXNrX2ZpbmlzaChleGl0KTogVCMlZCBmaW5pc2hlZCB0YXNrICVwLCByZXN1bWluZyB0YXNrICVwXG4iLAorICAgICAgICAgICBndGlkLCB0YXNrZGF0YSwgcmVzdW1lZF90YXNrKSk7CisKKyAgcmV0dXJuOworfQorCisvLyBfX2ttcGNfb21wX3Rhc2tfY29tcGxldGVfaWYwOiByZXBvcnQgdGhhdCBhIHRhc2sgaGFzIGNvbXBsZXRlZCBleGVjdXRpb24KKy8vCisvLyBsb2NfcmVmOiBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb247IHBvaW50cyB0byBlbmQgb2YgdGFzayBibG9jay4KKy8vIGd0aWQ6IGdsb2JhbCB0aHJlYWQgbnVtYmVyLgorLy8gdGFzazogdGFzayB0aHVuayBmb3IgdGhlIGNvbXBsZXRlZCB0YXNrLgordm9pZCBfX2ttcGNfb21wX3Rhc2tfY29tcGxldGVfaWYwKGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF90YXNrX3QgKnRhc2spIHsKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX2NvbXBsZXRlX2lmMChlbnRlcik6IFQjJWQgbG9jPSVwIHRhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzaykpKTsKKyAgLy8gdGhpcyByb3V0aW5lIHdpbGwgcHJvdmlkZSB0YXNrIHRvIHJlc3VtZQorICBfX2ttcF90YXNrX2ZpbmlzaChndGlkLCB0YXNrLCBOVUxMKTsKKworICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfY29tcGxldGVfaWYwKGV4aXQpOiBUIyVkIGxvYz0lcCB0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spKSk7CisgIHJldHVybjsKK30KKworI2lmZGVmIFRBU0tfVU5VU0VECisvLyBfX2ttcGNfb21wX3Rhc2tfY29tcGxldGU6IHJlcG9ydCB0aGF0IGEgdGFzayBoYXMgY29tcGxldGVkIGV4ZWN1dGlvbgorLy8gTkVWRVIgR0VORVJBVEVEIEJZIENPTVBJTEVSLCBERVBSRUNBVEVEISEhCit2b2lkIF9fa21wY19vbXBfdGFza19jb21wbGV0ZShpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF90YXNrX3QgKnRhc2spIHsKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX2NvbXBsZXRlKGVudGVyKTogVCMlZCBsb2M9JXAgdGFzaz0lcFxuIiwgZ3RpZCwKKyAgICAgICAgICAgICAgICBsb2NfcmVmLCBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKSkpOworCisgIF9fa21wX3Rhc2tfZmluaXNoKGd0aWQsIHRhc2ssIE5VTEwpOyAvLyBOb3Qgc3VyZSBob3cgdG8gZmluZCB0YXNrIHRvIHJlc3VtZQorCisgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza19jb21wbGV0ZShleGl0KTogVCMlZCBsb2M9JXAgdGFzaz0lcFxuIiwgZ3RpZCwKKyAgICAgICAgICAgICAgICBsb2NfcmVmLCBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKSkpOworICByZXR1cm47Cit9CisjZW5kaWYgLy8gVEFTS19VTlVTRUQKKworI2lmIE9NUFRfU1VQUE9SVAorLy8gX19rbXBfdGFza19pbml0X29tcHQ6IEluaXRpYWxpemUgT01QVCBmaWVsZHMgbWFpbnRhaW5lZCBieSBhIHRhc2suIFRoaXMgd2lsbAorLy8gIG9ubHkgYmUgY2FsbGVkIGFmdGVyIG9tcHRfdG9vbCwgc28gd2UgYWxyZWFkeSBrbm93IHdoZXRoZXIgb21wdCBpcyBlbmFibGVkCisvLyBvciBub3QuCitzdGF0aWMgaW5saW5lIHZvaWQgX19rbXBfdGFza19pbml0X29tcHQoa21wX3Rhc2tkYXRhX3QgKnRhc2ssIGludCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZnVuY3Rpb24pIHsKKyAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgIHRhc2stPm9tcHRfdGFza19pbmZvLnRhc2tfaWQgPSBfX29tcHRfdGFza19pZF9uZXcodGlkKTsKKyAgICB0YXNrLT5vbXB0X3Rhc2tfaW5mby5mdW5jdGlvbiA9IGZ1bmN0aW9uOworICAgIHRhc2stPm9tcHRfdGFza19pbmZvLmZyYW1lLmV4aXRfcnVudGltZV9mcmFtZSA9IE5VTEw7CisgICAgdGFzay0+b21wdF90YXNrX2luZm8uZnJhbWUucmVlbnRlcl9ydW50aW1lX2ZyYW1lID0gTlVMTDsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIHRhc2stPm9tcHRfdGFza19pbmZvLm5kZXBzID0gMDsKKyAgICB0YXNrLT5vbXB0X3Rhc2tfaW5mby5kZXBzID0gTlVMTDsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICB9Cit9CisjZW5kaWYKKworLy8gX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrOiBJbml0aWFsaXplIHRoZSBhcHByb3ByaWF0ZSBmaWVsZHMgaW4gdGhlIGltcGxpY2l0CisvLyB0YXNrIGZvciBhIGdpdmVuIHRocmVhZAorLy8KKy8vIGxvY19yZWY6ICByZWZlcmVuY2UgdG8gc291cmNlIGxvY2F0aW9uIG9mIHBhcmFsbGVsIHJlZ2lvbgorLy8gdGhpc190aHI6ICB0aHJlYWQgZGF0YSBzdHJ1Y3R1cmUgY29ycmVzcG9uZGluZyB0byBpbXBsaWNpdCB0YXNrCisvLyB0ZWFtOiB0ZWFtIGZvciB0aGlzX3RocgorLy8gdGlkOiB0aHJlYWQgaWQgb2YgZ2l2ZW4gdGhyZWFkIHdpdGhpbiB0ZWFtCisvLyBzZXRfY3Vycl90YXNrOiBUUlVFIGlmIG5lZWQgdG8gcHVzaCBjdXJyZW50IHRhc2sgdG8gdGhyZWFkCisvLyBOT1RFOiBSb3V0aW5lIGRvZXMgbm90IHNldCB1cCB0aGUgaW1wbGljaXQgdGFzayBJQ1ZTLiAgVGhpcyBpcyBhc3N1bWVkIHRvCisvLyBoYXZlIGFscmVhZHkgYmVlbiBkb25lIGVsc2V3aGVyZS4KKy8vIFRPRE86IEdldCBiZXR0ZXIgbG9jX3JlZi4gIFZhbHVlIHBhc3NlZCBpbiBtYXkgYmUgTlVMTAordm9pZCBfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2soaWRlbnRfdCAqbG9jX3JlZiwga21wX2luZm9fdCAqdGhpc190aHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdGVhbV90ICp0ZWFtLCBpbnQgdGlkLCBpbnQgc2V0X2N1cnJfdGFzaykgeworICBrbXBfdGFza2RhdGFfdCAqdGFzayA9ICZ0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdOworCisgIEtGX1RSQUNFKAorICAgICAgMTAsCisgICAgICAoIl9fa21wX2luaXRfaW1wbGljaXRfdGFzayhlbnRlcik6IFQjOiVkIHRlYW09JXAgdGFzaz0lcCwgcmVpbml0PSVzXG4iLAorICAgICAgIHRpZCwgdGVhbSwgdGFzaywgc2V0X2N1cnJfdGFzayA/ICJUUlVFIiA6ICJGQUxTRSIpKTsKKworICB0YXNrLT50ZF90YXNrX2lkID0gS01QX0dFTl9UQVNLX0lEKCk7CisgIHRhc2stPnRkX3RlYW0gPSB0ZWFtOworICAvLyAgICB0YXNrLT50ZF9wYXJlbnQgICA9IE5VTEw7ICAvLyBmaXggZm9yIENRMjMwMTAxIChicm9rZW4gcGFyZW50IHRhc2sgaW5mbworICAvLyAgICBpbiBkZWJ1Z2dlcikKKyAgdGFzay0+dGRfaWRlbnQgPSBsb2NfcmVmOworICB0YXNrLT50ZF90YXNrd2FpdF9pZGVudCA9IE5VTEw7CisgIHRhc2stPnRkX3Rhc2t3YWl0X2NvdW50ZXIgPSAwOworICB0YXNrLT50ZF90YXNrd2FpdF90aHJlYWQgPSAwOworCisgIHRhc2stPnRkX2ZsYWdzLnRpZWRuZXNzID0gVEFTS19USUVEOworICB0YXNrLT50ZF9mbGFncy50YXNrdHlwZSA9IFRBU0tfSU1QTElDSVQ7CisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgdGFzay0+dGRfZmxhZ3MucHJveHkgPSBUQVNLX0ZVTEw7CisjZW5kaWYKKworICAvLyBBbGwgaW1wbGljaXQgdGFza3MgYXJlIGV4ZWN1dGVkIGltbWVkaWF0ZWx5LCBub3QgZGVmZXJyZWQKKyAgdGFzay0+dGRfZmxhZ3MudGFza19zZXJpYWwgPSAxOworICB0YXNrLT50ZF9mbGFncy50YXNraW5nX3NlciA9IChfX2ttcF90YXNraW5nX21vZGUgPT0gdHNrbV9pbW1lZGlhdGVfZXhlYyk7CisgIHRhc2stPnRkX2ZsYWdzLnRlYW1fc2VyaWFsID0gKHRlYW0tPnQudF9zZXJpYWxpemVkKSA/IDEgOiAwOworCisgIHRhc2stPnRkX2ZsYWdzLnN0YXJ0ZWQgPSAxOworICB0YXNrLT50ZF9mbGFncy5leGVjdXRpbmcgPSAxOworICB0YXNrLT50ZF9mbGFncy5jb21wbGV0ZSA9IDA7CisgIHRhc2stPnRkX2ZsYWdzLmZyZWVkID0gMDsKKworI2lmIE9NUF80MF9FTkFCTEVECisgIHRhc2stPnRkX2RlcG5vZGUgPSBOVUxMOworI2VuZGlmCisKKyAgaWYgKHNldF9jdXJyX3Rhc2spIHsgLy8gb25seSBkbyB0aGlzIGluaXQgZmlyc3QgdGltZSB0aHJlYWQgaXMgY3JlYXRlZAorICAgIHRhc2stPnRkX2luY29tcGxldGVfY2hpbGRfdGFza3MgPSAwOworICAgIC8vIE5vdCB1c2VkOiBkb24ndCBuZWVkIHRvIGRlYWxsb2NhdGUgaW1wbGljaXQgdGFzaworICAgIHRhc2stPnRkX2FsbG9jYXRlZF9jaGlsZF90YXNrcyA9IDA7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICB0YXNrLT50ZF90YXNrZ3JvdXAgPSBOVUxMOyAvLyBBbiBpbXBsaWNpdCB0YXNrIGRvZXMgbm90IGhhdmUgdGFza2dyb3VwCisgICAgdGFzay0+dGRfZGVwaGFzaCA9IE5VTEw7CisjZW5kaWYKKyAgICBfX2ttcF9wdXNoX2N1cnJlbnRfdGFza190b190aHJlYWQodGhpc190aHIsIHRlYW0sIHRpZCk7CisgIH0gZWxzZSB7CisgICAgS01QX0RFQlVHX0FTU0VSVCh0YXNrLT50ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzID09IDApOworICAgIEtNUF9ERUJVR19BU1NFUlQodGFzay0+dGRfYWxsb2NhdGVkX2NoaWxkX3Rhc2tzID09IDApOworICB9CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgX19rbXBfdGFza19pbml0X29tcHQodGFzaywgdGlkLCBOVUxMKTsKKyNlbmRpZgorCisgIEtGX1RSQUNFKDEwLCAoIl9fa21wX2luaXRfaW1wbGljaXRfdGFzayhleGl0KTogVCM6JWQgdGVhbT0lcCB0YXNrPSVwXG4iLCB0aWQsCisgICAgICAgICAgICAgICAgdGVhbSwgdGFzaykpOworfQorCisvLyBfX2ttcF9maW5pc2hfaW1wbGljaXRfdGFzazogUmVsZWFzZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB0byBpbXBsaWNpdCB0YXNrcworLy8gYXQgdGhlIGVuZCBvZiBwYXJhbGxlbCByZWdpb25zLiBTb21lIHJlc291cmNlcyBhcmUga2VwdCBmb3IgcmV1c2UgaW4gdGhlIG5leHQKKy8vIHBhcmFsbGVsIHJlZ2lvbi4KKy8vCisvLyB0aHJlYWQ6ICB0aHJlYWQgZGF0YSBzdHJ1Y3R1cmUgY29ycmVzcG9uZGluZyB0byBpbXBsaWNpdCB0YXNrCit2b2lkIF9fa21wX2ZpbmlzaF9pbXBsaWNpdF90YXNrKGttcF9pbmZvX3QgKnRocmVhZCkgeworICBrbXBfdGFza2RhdGFfdCAqdGFzayA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrOworICBpZiAodGFzay0+dGRfZGVwaGFzaCkKKyAgICBfX2ttcF9kZXBoYXNoX2ZyZWVfZW50cmllcyh0aHJlYWQsIHRhc2stPnRkX2RlcGhhc2gpOworfQorCisvLyBfX2ttcF9mcmVlX2ltcGxpY2l0X3Rhc2s6IFJlbGVhc2UgcmVzb3VyY2VzIGFzc29jaWF0ZWQgdG8gaW1wbGljaXQgdGFza3MKKy8vIHdoZW4gdGhlc2UgYXJlIGRlc3Ryb3llZCByZWdpb25zCisvLworLy8gdGhyZWFkOiAgdGhyZWFkIGRhdGEgc3RydWN0dXJlIGNvcnJlc3BvbmRpbmcgdG8gaW1wbGljaXQgdGFzawordm9pZCBfX2ttcF9mcmVlX2ltcGxpY2l0X3Rhc2soa21wX2luZm9fdCAqdGhyZWFkKSB7CisgIGttcF90YXNrZGF0YV90ICp0YXNrID0gdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2s7CisgIGlmICh0YXNrLT50ZF9kZXBoYXNoKQorICAgIF9fa21wX2RlcGhhc2hfZnJlZSh0aHJlYWQsIHRhc2stPnRkX2RlcGhhc2gpOworICB0YXNrLT50ZF9kZXBoYXNoID0gTlVMTDsKK30KKworLy8gUm91bmQgdXAgYSBzaXplIHRvIGEgcG93ZXIgb2YgdHdvIHNwZWNpZmllZCBieSB2YWw6IFVzZWQgdG8gaW5zZXJ0IHBhZGRpbmcKKy8vIGJldHdlZW4gc3RydWN0dXJlcyBjby1hbGxvY2F0ZWQgdXNpbmcgYSBzaW5nbGUgbWFsbG9jKCkgY2FsbAorc3RhdGljIHNpemVfdCBfX2ttcF9yb3VuZF91cF90b192YWwoc2l6ZV90IHNpemUsIHNpemVfdCB2YWwpIHsKKyAgaWYgKHNpemUgJiAodmFsIC0gMSkpIHsKKyAgICBzaXplICY9IH4odmFsIC0gMSk7CisgICAgaWYgKHNpemUgPD0gS01QX1NJWkVfVF9NQVggLSB2YWwpIHsKKyAgICAgIHNpemUgKz0gdmFsOyAvLyBSb3VuZCB1cCBpZiB0aGVyZSBpcyBubyBvdmVyZmxvdy4KKyAgICB9OyAvLyBpZgorICB9OyAvLyBpZgorICByZXR1cm4gc2l6ZTsKK30gLy8gX19rbXBfcm91bmRfdXBfdG9fdmEKKworLy8gX19rbXBfdGFza19hbGxvYzogQWxsb2NhdGUgdGhlIHRhc2tkYXRhIGFuZCB0YXNrIGRhdGEgc3RydWN0dXJlcyBmb3IgYSB0YXNrCisvLworLy8gbG9jX3JlZjogc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCisvLyBndGlkOiBnbG9iYWwgdGhyZWFkIG51bWJlci4KKy8vIGZsYWdzOiBpbmNsdWRlIHRpZWRuZXNzICYgdGFzayB0eXBlIChleHBsaWNpdCB2cy4gaW1wbGljaXQpIG9mIHRoZSAnJ25ldycnCisvLyB0YXNrIGVuY291bnRlcmVkLiBDb252ZXJ0ZWQgZnJvbSBrbXBfaW50MzIgdG8ga21wX3Rhc2tpbmdfZmxhZ3NfdCBpbiByb3V0aW5lLgorLy8gc2l6ZW9mX2ttcF90YXNrX3Q6ICBTaXplIGluIGJ5dGVzIG9mIGttcF90YXNrX3QgZGF0YSBzdHJ1Y3R1cmUgaW5jbHVkaW5nCisvLyBwcml2YXRlIHZhcnMgYWNjZXNzZWQgaW4gdGFzay4KKy8vIHNpemVvZl9zaGFyZWRzOiAgU2l6ZSBpbiBieXRlcyBvZiBhcnJheSBvZiBwb2ludGVycyB0byBzaGFyZWQgdmFycyBhY2Nlc3NlZAorLy8gaW4gdGFzay4KKy8vIHRhc2tfZW50cnk6IFBvaW50ZXIgdG8gdGFzayBjb2RlIGVudHJ5IHBvaW50IGdlbmVyYXRlZCBieSBjb21waWxlci4KKy8vIHJldHVybnM6IGEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIGttcF90YXNrX3Qgc3RydWN0dXJlICh0YXNrKS4KK2ttcF90YXNrX3QgKl9fa21wX3Rhc2tfYWxsb2MoaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF90YXNraW5nX2ZsYWdzX3QgKmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZW9mX2ttcF90YXNrX3QsIHNpemVfdCBzaXplb2Zfc2hhcmVkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3JvdXRpbmVfZW50cnlfdCB0YXNrX2VudHJ5KSB7CisgIGttcF90YXNrX3QgKnRhc2s7CisgIGttcF90YXNrZGF0YV90ICp0YXNrZGF0YTsKKyAga21wX2luZm9fdCAqdGhyZWFkID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAga21wX3RlYW1fdCAqdGVhbSA9IHRocmVhZC0+dGgudGhfdGVhbTsKKyAga21wX3Rhc2tkYXRhX3QgKnBhcmVudF90YXNrID0gdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2s7CisgIHNpemVfdCBzaGFyZWRzX29mZnNldDsKKworICBLQV9UUkFDRSgxMCwgKCJfX2ttcF90YXNrX2FsbG9jKGVudGVyKTogVCMlZCBsb2M9JXAsIGZsYWdzPSgweCV4KSAiCisgICAgICAgICAgICAgICAgInNpemVvZl90YXNrPSVsZCBzaXplb2Zfc2hhcmVkPSVsZCBlbnRyeT0lcFxuIiwKKyAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCAqKChrbXBfaW50MzIgKilmbGFncyksIHNpemVvZl9rbXBfdGFza190LAorICAgICAgICAgICAgICAgIHNpemVvZl9zaGFyZWRzLCB0YXNrX2VudHJ5KSk7CisKKyAgaWYgKHBhcmVudF90YXNrLT50ZF9mbGFncy5maW5hbCkgeworICAgIGlmIChmbGFncy0+bWVyZ2VkX2lmMCkgeworICAgIH0KKyAgICBmbGFncy0+ZmluYWwgPSAxOworICB9CisKKyNpZiBPTVBfNDVfRU5BQkxFRAorICBpZiAoZmxhZ3MtPnByb3h5ID09IFRBU0tfUFJPWFkpIHsKKyAgICBmbGFncy0+dGllZG5lc3MgPSBUQVNLX1VOVElFRDsKKyAgICBmbGFncy0+bWVyZ2VkX2lmMCA9IDE7CisKKyAgICAvKiBhcmUgd2UgcnVubmluZyBpbiBhIHNlcXVlbnRpYWwgcGFyYWxsZWwgb3IgdHNrbV9pbW1lZGlhdGVfZXhlYy4uLiB3ZSBuZWVkCisgICAgICAgdGFza2luZyBzdXBwb3J0IGVuYWJsZWQgKi8KKyAgICBpZiAoKHRocmVhZC0+dGgudGhfdGFza190ZWFtKSA9PSBOVUxMKSB7CisgICAgICAvKiBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBpZiB0aGUgdGVhbSBpcyBzZXJpYWxpemVkCisgICAgICAgICAgc2V0dXAgYSB0YXNrIHRlYW0gYW5kIHByb3BhZ2F0ZSBpdCB0byB0aGUgdGhyZWFkICovCisgICAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0tPnQudF9zZXJpYWxpemVkKTsKKyAgICAgIEtBX1RSQUNFKDMwLAorICAgICAgICAgICAgICAgKCJUIyVkIGNyZWF0aW5nIHRhc2sgdGVhbSBpbiBfX2ttcF90YXNrX2FsbG9jIGZvciBwcm94eSB0YXNrXG4iLAorICAgICAgICAgICAgICAgIGd0aWQpKTsKKyAgICAgIF9fa21wX3Rhc2tfdGVhbV9zZXR1cCgKKyAgICAgICAgICB0aHJlYWQsIHRlYW0sCisgICAgICAgICAgMSk7IC8vIDEgaW5kaWNhdGVzIHNldHVwIHRoZSBjdXJyZW50IHRlYW0gcmVnYXJkbGVzcyBvZiBudGhyZWFkcworICAgICAgdGhyZWFkLT50aC50aF90YXNrX3RlYW0gPSB0ZWFtLT50LnRfdGFza190ZWFtW3RocmVhZC0+dGgudGhfdGFza19zdGF0ZV07CisgICAgfQorICAgIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtID0gdGhyZWFkLT50aC50aF90YXNrX3RlYW07CisKKyAgICAvKiB0YXNraW5nIG11c3QgYmUgZW5hYmxlZCBub3cgYXMgdGhlIHRhc2sgbWlnaHQgbm90IGJlIHB1c2hlZCAqLworICAgIGlmICghS01QX1RBU0tJTkdfRU5BQkxFRCh0YXNrX3RlYW0pKSB7CisgICAgICBLQV9UUkFDRSgKKyAgICAgICAgICAzMCwKKyAgICAgICAgICAoIlQjJWQgZW5hYmxpbmcgdGFza2luZyBpbiBfX2ttcF90YXNrX2FsbG9jIGZvciBwcm94eSB0YXNrXG4iLCBndGlkKSk7CisgICAgICBfX2ttcF9lbmFibGVfdGFza2luZyh0YXNrX3RlYW0sIHRocmVhZCk7CisgICAgICBrbXBfaW50MzIgdGlkID0gdGhyZWFkLT50aC50aF9pbmZvLmRzLmRzX3RpZDsKKyAgICAgIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YSA9ICZ0YXNrX3RlYW0tPnR0LnR0X3RocmVhZHNfZGF0YVt0aWRdOworICAgICAgLy8gTm8gbG9jayBuZWVkZWQgc2luY2Ugb25seSBvd25lciBjYW4gYWxsb2NhdGUKKyAgICAgIGlmICh0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWUgPT0gTlVMTCkgeworICAgICAgICBfX2ttcF9hbGxvY190YXNrX2RlcXVlKHRocmVhZCwgdGhyZWFkX2RhdGEpOworICAgICAgfQorICAgIH0KKworICAgIGlmICh0YXNrX3RlYW0tPnR0LnR0X2ZvdW5kX3Byb3h5X3Rhc2tzID09IEZBTFNFKQorICAgICAgVENXXzQodGFza190ZWFtLT50dC50dF9mb3VuZF9wcm94eV90YXNrcywgVFJVRSk7CisgIH0KKyNlbmRpZgorCisgIC8vIENhbGN1bGF0ZSBzaGFyZWQgc3RydWN0dXJlIG9mZnNldCBpbmNsdWRpbmcgcGFkZGluZyBhZnRlciBrbXBfdGFza190IHN0cnVjdAorICAvLyB0byBhbGlnbiBwb2ludGVycyBpbiBzaGFyZWQgc3RydWN0CisgIHNoYXJlZHNfb2Zmc2V0ID0gc2l6ZW9mKGttcF90YXNrZGF0YV90KSArIHNpemVvZl9rbXBfdGFza190OworICBzaGFyZWRzX29mZnNldCA9IF9fa21wX3JvdW5kX3VwX3RvX3ZhbChzaGFyZWRzX29mZnNldCwgc2l6ZW9mKHZvaWQgKikpOworCisgIC8vIEFsbG9jYXRlIGEga21wX3Rhc2tkYXRhX3QgYmxvY2sgYW5kIGEga21wX3Rhc2tfdCBibG9jay4KKyAgS0FfVFJBQ0UoMzAsICgiX19rbXBfdGFza19hbGxvYzogVCMlZCBGaXJzdCBtYWxsb2Mgc2l6ZTogJWxkXG4iLCBndGlkLAorICAgICAgICAgICAgICAgIHNoYXJlZHNfb2Zmc2V0KSk7CisgIEtBX1RSQUNFKDMwLCAoIl9fa21wX3Rhc2tfYWxsb2M6IFQjJWQgU2Vjb25kIG1hbGxvYyBzaXplOiAlbGRcbiIsIGd0aWQsCisgICAgICAgICAgICAgICAgc2l6ZW9mX3NoYXJlZHMpKTsKKworLy8gQXZvaWQgZG91YmxlIGFsbG9jYXRpb24gaGVyZSBieSBjb21iaW5pbmcgc2hhcmVkcyB3aXRoIHRhc2tkYXRhCisjaWYgVVNFX0ZBU1RfTUVNT1JZCisgIHRhc2tkYXRhID0gKGttcF90YXNrZGF0YV90ICopX19rbXBfZmFzdF9hbGxvY2F0ZSh0aHJlYWQsIHNoYXJlZHNfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZl9zaGFyZWRzKTsKKyNlbHNlIC8qICEgVVNFX0ZBU1RfTUVNT1JZICovCisgIHRhc2tkYXRhID0gKGttcF90YXNrZGF0YV90ICopX19rbXBfdGhyZWFkX21hbGxvYyh0aHJlYWQsIHNoYXJlZHNfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZl9zaGFyZWRzKTsKKyNlbmRpZiAvKiBVU0VfRkFTVF9NRU1PUlkgKi8KKyAgQU5OT1RBVEVfSEFQUEVOU19BRlRFUih0YXNrZGF0YSk7CisKKyAgdGFzayA9IEtNUF9UQVNLREFUQV9UT19UQVNLKHRhc2tkYXRhKTsKKworLy8gTWFrZSBzdXJlIHRhc2sgJiB0YXNrZGF0YSBhcmUgYWxpZ25lZCBhcHByb3ByaWF0ZWx5CisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1BQQzY0IHx8ICFLTVBfSEFWRV9RVUFECisgIEtNUF9ERUJVR19BU1NFUlQoKCgoa21wX3VpbnRwdHJfdCl0YXNrZGF0YSkgJiAoc2l6ZW9mKGRvdWJsZSkgLSAxKSkgPT0gMCk7CisgIEtNUF9ERUJVR19BU1NFUlQoKCgoa21wX3VpbnRwdHJfdCl0YXNrKSAmIChzaXplb2YoZG91YmxlKSAtIDEpKSA9PSAwKTsKKyNlbHNlCisgIEtNUF9ERUJVR19BU1NFUlQoKCgoa21wX3VpbnRwdHJfdCl0YXNrZGF0YSkgJiAoc2l6ZW9mKF9RdWFkKSAtIDEpKSA9PSAwKTsKKyAgS01QX0RFQlVHX0FTU0VSVCgoKChrbXBfdWludHB0cl90KXRhc2spICYgKHNpemVvZihfUXVhZCkgLSAxKSkgPT0gMCk7CisjZW5kaWYKKyAgaWYgKHNpemVvZl9zaGFyZWRzID4gMCkgeworICAgIC8vIEF2b2lkIGRvdWJsZSBhbGxvY2F0aW9uIGhlcmUgYnkgY29tYmluaW5nIHNoYXJlZHMgd2l0aCB0YXNrZGF0YQorICAgIHRhc2stPnNoYXJlZHMgPSAmKChjaGFyICopdGFza2RhdGEpW3NoYXJlZHNfb2Zmc2V0XTsKKyAgICAvLyBNYWtlIHN1cmUgc2hhcmVkcyBzdHJ1Y3QgaXMgYWxpZ25lZCB0byBwb2ludGVyIHNpemUKKyAgICBLTVBfREVCVUdfQVNTRVJUKCgoKGttcF91aW50cHRyX3QpdGFzay0+c2hhcmVkcykgJiAoc2l6ZW9mKHZvaWQgKikgLSAxKSkgPT0KKyAgICAgICAgICAgICAgICAgICAgIDApOworICB9IGVsc2UgeworICAgIHRhc2stPnNoYXJlZHMgPSBOVUxMOworICB9CisgIHRhc2stPnJvdXRpbmUgPSB0YXNrX2VudHJ5OworICB0YXNrLT5wYXJ0X2lkID0gMDsgLy8gQUM6IEFsd2F5cyBzdGFydCB3aXRoIDAgcGFydCBpZAorCisgIHRhc2tkYXRhLT50ZF90YXNrX2lkID0gS01QX0dFTl9UQVNLX0lEKCk7CisgIHRhc2tkYXRhLT50ZF90ZWFtID0gdGVhbTsKKyAgdGFza2RhdGEtPnRkX2FsbG9jX3RocmVhZCA9IHRocmVhZDsKKyAgdGFza2RhdGEtPnRkX3BhcmVudCA9IHBhcmVudF90YXNrOworICB0YXNrZGF0YS0+dGRfbGV2ZWwgPSBwYXJlbnRfdGFzay0+dGRfbGV2ZWwgKyAxOyAvLyBpbmNyZW1lbnQgbmVzdGluZyBsZXZlbAorICB0YXNrZGF0YS0+dGRfdW50aWVkX2NvdW50ID0gMDsKKyAgdGFza2RhdGEtPnRkX2lkZW50ID0gbG9jX3JlZjsKKyAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X2lkZW50ID0gTlVMTDsKKyAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X2NvdW50ZXIgPSAwOworICB0YXNrZGF0YS0+dGRfdGFza3dhaXRfdGhyZWFkID0gMDsKKyAgS01QX0RFQlVHX0FTU0VSVCh0YXNrZGF0YS0+dGRfcGFyZW50ICE9IE5VTEwpOworI2lmIE9NUF80NV9FTkFCTEVECisgIC8vIGF2b2lkIGNvcHlpbmcgaWN2cyBmb3IgcHJveHkgdGFza3MKKyAgaWYgKGZsYWdzLT5wcm94eSA9PSBUQVNLX0ZVTEwpCisjZW5kaWYKKyAgICBjb3B5X2ljdnMoJnRhc2tkYXRhLT50ZF9pY3ZzLCAmdGFza2RhdGEtPnRkX3BhcmVudC0+dGRfaWN2cyk7CisKKyAgdGFza2RhdGEtPnRkX2ZsYWdzLnRpZWRuZXNzID0gZmxhZ3MtPnRpZWRuZXNzOworICB0YXNrZGF0YS0+dGRfZmxhZ3MuZmluYWwgPSBmbGFncy0+ZmluYWw7CisgIHRhc2tkYXRhLT50ZF9mbGFncy5tZXJnZWRfaWYwID0gZmxhZ3MtPm1lcmdlZF9pZjA7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgdGFza2RhdGEtPnRkX2ZsYWdzLmRlc3RydWN0b3JzX3RodW5rID0gZmxhZ3MtPmRlc3RydWN0b3JzX3RodW5rOworI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVECisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgdGFza2RhdGEtPnRkX2ZsYWdzLnByb3h5ID0gZmxhZ3MtPnByb3h5OworICB0YXNrZGF0YS0+dGRfdGFza190ZWFtID0gdGhyZWFkLT50aC50aF90YXNrX3RlYW07CisgIHRhc2tkYXRhLT50ZF9zaXplX2FsbG9jID0gc2hhcmVkc19vZmZzZXQgKyBzaXplb2Zfc2hhcmVkczsKKyNlbmRpZgorICB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza3R5cGUgPSBUQVNLX0VYUExJQ0lUOworCisgIC8vIEdFSCAtIFRPRE86IGZpeCB0aGlzIHRvIGNvcHkgcGFyZW50IHRhc2sncyB2YWx1ZSBvZiB0YXNraW5nX3NlciBmbGFnCisgIHRhc2tkYXRhLT50ZF9mbGFncy50YXNraW5nX3NlciA9IChfX2ttcF90YXNraW5nX21vZGUgPT0gdHNrbV9pbW1lZGlhdGVfZXhlYyk7CisKKyAgLy8gR0VIIC0gVE9ETzogZml4IHRoaXMgdG8gY29weSBwYXJlbnQgdGFzaydzIHZhbHVlIG9mIHRlYW1fc2VyaWFsIGZsYWcKKyAgdGFza2RhdGEtPnRkX2ZsYWdzLnRlYW1fc2VyaWFsID0gKHRlYW0tPnQudF9zZXJpYWxpemVkKSA/IDEgOiAwOworCisgIC8vIEdFSCAtIE5vdGUgd2Ugc2VyaWFsaXplIHRoZSB0YXNrIGlmIHRoZSB0ZWFtIGlzIHNlcmlhbGl6ZWQgdG8gbWFrZSBzdXJlCisgIC8vIGltcGxpY2l0IHBhcmFsbGVsIHJlZ2lvbiB0YXNrcyBhcmUgbm90IGxlZnQgdW50aWwgcHJvZ3JhbSB0ZXJtaW5hdGlvbiB0bworICAvLyBleGVjdXRlLiBBbHNvLCBpdCBoZWxwcyBsb2NhbGl0eSB0byBleGVjdXRlIGltbWVkaWF0ZWx5LgorCisgIHRhc2tkYXRhLT50ZF9mbGFncy50YXNrX3NlcmlhbCA9CisgICAgICAocGFyZW50X3Rhc2stPnRkX2ZsYWdzLmZpbmFsIHx8IHRhc2tkYXRhLT50ZF9mbGFncy50ZWFtX3NlcmlhbCB8fAorICAgICAgIHRhc2tkYXRhLT50ZF9mbGFncy50YXNraW5nX3Nlcik7CisKKyAgdGFza2RhdGEtPnRkX2ZsYWdzLnN0YXJ0ZWQgPSAwOworICB0YXNrZGF0YS0+dGRfZmxhZ3MuZXhlY3V0aW5nID0gMDsKKyAgdGFza2RhdGEtPnRkX2ZsYWdzLmNvbXBsZXRlID0gMDsKKyAgdGFza2RhdGEtPnRkX2ZsYWdzLmZyZWVkID0gMDsKKworICB0YXNrZGF0YS0+dGRfZmxhZ3MubmF0aXZlID0gZmxhZ3MtPm5hdGl2ZTsKKworICB0YXNrZGF0YS0+dGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcyA9IDA7CisgIHRhc2tkYXRhLT50ZF9hbGxvY2F0ZWRfY2hpbGRfdGFza3MgPSAxOyAvLyBzdGFydCBhdCBvbmUgYmVjYXVzZSBjb3VudHMgY3VycmVudAorLy8gdGFzayBhbmQgY2hpbGRyZW4KKyNpZiBPTVBfNDBfRU5BQkxFRAorICB0YXNrZGF0YS0+dGRfdGFza2dyb3VwID0KKyAgICAgIHBhcmVudF90YXNrLT50ZF90YXNrZ3JvdXA7IC8vIHRhc2sgaW5oZXJpdHMgdGFza2dyb3VwIGZyb20gdGhlIHBhcmVudCB0YXNrCisgIHRhc2tkYXRhLT50ZF9kZXBoYXNoID0gTlVMTDsKKyAgdGFza2RhdGEtPnRkX2RlcG5vZGUgPSBOVUxMOworI2VuZGlmCisKKy8vIE9ubHkgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGNoaWxkIHRhc2sgY291bnRzIGlmIHRlYW0gcGFyYWxsZWwgYW5kIHRhc2tpbmcgbm90CisvLyBzZXJpYWxpemVkIG9yIGlmIGl0IGlzIGEgcHJveHkgdGFzaworI2lmIE9NUF80NV9FTkFCTEVECisgIGlmIChmbGFncy0+cHJveHkgPT0gVEFTS19QUk9YWSB8fAorICAgICAgISh0YXNrZGF0YS0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgfHwgdGFza2RhdGEtPnRkX2ZsYWdzLnRhc2tpbmdfc2VyKSkKKyNlbHNlCisgIGlmICghKHRhc2tkYXRhLT50ZF9mbGFncy50ZWFtX3NlcmlhbCB8fCB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza2luZ19zZXIpKQorI2VuZGlmCisgIHsKKyAgICBLTVBfVEVTVF9USEVOX0lOQzMyKCZwYXJlbnRfdGFzay0+dGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcyk7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAocGFyZW50X3Rhc2stPnRkX3Rhc2tncm91cCkKKyAgICAgIEtNUF9URVNUX1RIRU5fSU5DMzIoKGttcF9pbnQzMiAqKSgmcGFyZW50X3Rhc2stPnRkX3Rhc2tncm91cC0+Y291bnQpKTsKKyNlbmRpZgorICAgIC8vIE9ubHkgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGFsbG9jYXRlZCBjaGlsZCB0YXNrcyBmb3IgZXhwbGljaXQgdGFza3Mgc2luY2UKKyAgICAvLyBpbXBsaWNpdCBub3QgZGVhbGxvY2F0ZWQKKyAgICBpZiAodGFza2RhdGEtPnRkX3BhcmVudC0+dGRfZmxhZ3MudGFza3R5cGUgPT0gVEFTS19FWFBMSUNJVCkgeworICAgICAgS01QX1RFU1RfVEhFTl9JTkMzMigmdGFza2RhdGEtPnRkX3BhcmVudC0+dGRfYWxsb2NhdGVkX2NoaWxkX3Rhc2tzKTsKKyAgICB9CisgIH0KKworICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90YXNrX2FsbG9jKGV4aXQpOiBUIyVkIGNyZWF0ZWQgdGFzayAlcCBwYXJlbnQ9JXBcbiIsCisgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIHRhc2tkYXRhLT50ZF9wYXJlbnQpKTsKKyAgQU5OT1RBVEVfSEFQUEVOU19CRUZPUkUodGFzayk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgX19rbXBfdGFza19pbml0X29tcHQodGFza2RhdGEsIGd0aWQsICh2b2lkICopdGFza19lbnRyeSk7CisjZW5kaWYKKworICByZXR1cm4gdGFzazsKK30KKwora21wX3Rhc2tfdCAqX19rbXBjX29tcF90YXNrX2FsbG9jKGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBmbGFncywgc2l6ZV90IHNpemVvZl9rbXBfdGFza190LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplb2Zfc2hhcmVkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfcm91dGluZV9lbnRyeV90IHRhc2tfZW50cnkpIHsKKyAga21wX3Rhc2tfdCAqcmV0dmFsOworICBrbXBfdGFza2luZ19mbGFnc190ICppbnB1dF9mbGFncyA9IChrbXBfdGFza2luZ19mbGFnc190ICopJmZsYWdzOworCisgIGlucHV0X2ZsYWdzLT5uYXRpdmUgPSBGQUxTRTsKKy8vIF9fa21wX3Rhc2tfYWxsb2MoKSBzZXRzIHVwIGFsbCBvdGhlciBydW50aW1lIGZsYWdzCisKKyNpZiBPTVBfNDVfRU5BQkxFRAorICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfYWxsb2MoZW50ZXIpOiBUIyVkIGxvYz0lcCwgZmxhZ3M9KCVzICVzKSAiCisgICAgICAgICAgICAgICAgInNpemVvZl90YXNrPSVsZCBzaXplb2Zfc2hhcmVkPSVsZCBlbnRyeT0lcFxuIiwKKyAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCBpbnB1dF9mbGFncy0+dGllZG5lc3MgPyAidGllZCAgIiA6ICJ1bnRpZWQiLAorICAgICAgICAgICAgICAgIGlucHV0X2ZsYWdzLT5wcm94eSA/ICJwcm94eSIgOiAiIiwgc2l6ZW9mX2ttcF90YXNrX3QsCisgICAgICAgICAgICAgICAgc2l6ZW9mX3NoYXJlZHMsIHRhc2tfZW50cnkpKTsKKyNlbHNlCisgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza19hbGxvYyhlbnRlcik6IFQjJWQgbG9jPSVwLCBmbGFncz0oJXMpICIKKyAgICAgICAgICAgICAgICAic2l6ZW9mX3Rhc2s9JWxkIHNpemVvZl9zaGFyZWQ9JWxkIGVudHJ5PSVwXG4iLAorICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIGlucHV0X2ZsYWdzLT50aWVkbmVzcyA/ICJ0aWVkICAiIDogInVudGllZCIsCisgICAgICAgICAgICAgICAgc2l6ZW9mX2ttcF90YXNrX3QsIHNpemVvZl9zaGFyZWRzLCB0YXNrX2VudHJ5KSk7CisjZW5kaWYKKworICByZXR2YWwgPSBfX2ttcF90YXNrX2FsbG9jKGxvY19yZWYsIGd0aWQsIGlucHV0X2ZsYWdzLCBzaXplb2Zfa21wX3Rhc2tfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Zfc2hhcmVkcywgdGFza19lbnRyeSk7CisKKyAgS0FfVFJBQ0UoMjAsICgiX19rbXBjX29tcF90YXNrX2FsbG9jKGV4aXQpOiBUIyVkIHJldHZhbCAlcFxuIiwgZ3RpZCwgcmV0dmFsKSk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLy8gIF9fa21wX2ludm9rZV90YXNrOiBpbnZva2UgdGhlIHNwZWNpZmllZCB0YXNrCisvLworLy8gZ3RpZDogZ2xvYmFsIHRocmVhZCBJRCBvZiBjYWxsZXIKKy8vIHRhc2s6IHRoZSB0YXNrIHRvIGludm9rZQorLy8gY3VycmVudF90YXNrOiB0aGUgdGFzayB0byByZXN1bWUgYWZ0ZXIgdGFzayBpbnZva2F0aW9uCitzdGF0aWMgdm9pZCBfX2ttcF9pbnZva2VfdGFzayhrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqdGFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF90YXNrZGF0YV90ICpjdXJyZW50X3Rhc2spIHsKKyAga21wX3Rhc2tkYXRhX3QgKnRhc2tkYXRhID0gS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzayk7CisgIGttcF91aW50NjQgY3VyX3RpbWU7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgaW50IGRpc2NhcmQgPSAwIC8qIGZhbHNlICovOworI2VuZGlmCisgIEtBX1RSQUNFKAorICAgICAgMzAsICgiX19rbXBfaW52b2tlX3Rhc2soZW50ZXIpOiBUIyVkIGludm9raW5nIHRhc2sgJXAsIGN1cnJlbnRfdGFzaz0lcFxuIiwKKyAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIGN1cnJlbnRfdGFzaykpOworICBLTVBfREVCVUdfQVNTRVJUKHRhc2spOworI2lmIE9NUF80NV9FTkFCTEVECisgIGlmICh0YXNrZGF0YS0+dGRfZmxhZ3MucHJveHkgPT0gVEFTS19QUk9YWSAmJgorICAgICAgdGFza2RhdGEtPnRkX2ZsYWdzLmNvbXBsZXRlID09IDEpIHsKKyAgICAvLyBUaGlzIGlzIGEgcHJveHkgdGFzayB0aGF0IHdhcyBhbHJlYWR5IGNvbXBsZXRlZCBidXQgaXQgbmVlZHMgdG8gcnVuCisgICAgLy8gaXRzIGJvdHRvbS1oYWxmIGZpbmlzaAorICAgIEtBX1RSQUNFKAorICAgICAgICAzMCwKKyAgICAgICAgKCJfX2ttcF9pbnZva2VfdGFzazogVCMlZCBydW5uaW5nIGJvdHRvbSBmaW5pc2ggZm9yIHByb3h5IHRhc2sgJXBcbiIsCisgICAgICAgICBndGlkLCB0YXNrZGF0YSkpOworCisgICAgX19rbXBfYm90dG9tX2hhbGZfZmluaXNoX3Byb3h5KGd0aWQsIHRhc2spOworCisgICAgS0FfVFJBQ0UoMzAsICgiX19rbXBfaW52b2tlX3Rhc2soZXhpdCk6IFQjJWQgY29tcGxldGVkIGJvdHRvbSBmaW5pc2ggZm9yICIKKyAgICAgICAgICAgICAgICAgICJwcm94eSB0YXNrICVwLCByZXN1bWluZyB0YXNrICVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIGN1cnJlbnRfdGFzaykpOworCisgICAgcmV0dXJuOworICB9CisjZW5kaWYKKworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgaWYgKF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDMpIHsKKyAgICAvLyBHZXQgdGhlIGN1cnJlbnQgdGltZSBzdGFtcCB0byBtZWFzdXJlIHRhc2sgZXhlY3V0aW9uIHRpbWUgdG8gY29ycmVjdAorICAgIC8vIGJhcnJpZXIgaW1iYWxhbmNlIHRpbWUKKyAgICBjdXJfdGltZSA9IF9faXR0X2dldF90aW1lc3RhbXAoKTsKKyAgfQorI2VuZGlmCisKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAvLyBQcm94eSB0YXNrcyBhcmUgbm90IGhhbmRsZWQgYnkgdGhlIHJ1bnRpbWUKKyAgaWYgKHRhc2tkYXRhLT50ZF9mbGFncy5wcm94eSAhPSBUQVNLX1BST1hZKSB7CisjZW5kaWYKKyAgICBBTk5PVEFURV9IQVBQRU5TX0FGVEVSKHRhc2spOworICAgIF9fa21wX3Rhc2tfc3RhcnQoZ3RpZCwgdGFzaywgY3VycmVudF90YXNrKTsKKyNpZiBPTVBfNDVfRU5BQkxFRAorICB9CisjZW5kaWYKKworI2lmIE9NUFRfU1VQUE9SVAorICBvbXB0X3RocmVhZF9pbmZvX3Qgb2xkSW5mbzsKKyAga21wX2luZm9fdCAqdGhyZWFkOworICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgLy8gU3RvcmUgdGhlIHRocmVhZHMgc3RhdGVzIGFuZCByZXN0b3JlIHRoZW0gYWZ0ZXIgdGhlIHRhc2sKKyAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICAgIG9sZEluZm8gPSB0aHJlYWQtPnRoLm9tcHRfdGhyZWFkX2luZm87CisgICAgdGhyZWFkLT50aC5vbXB0X3RocmVhZF9pbmZvLndhaXRfaWQgPSAwOworICAgIHRocmVhZC0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd29ya19wYXJhbGxlbDsKKyAgICB0YXNrZGF0YS0+b21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lID0KKyAgICAgICAgX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMCk7CisgIH0KKyNlbmRpZgorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgLy8gVE9ETzogY2FuY2VsIHRhc2tzIGlmIHRoZSBwYXJhbGxlbCByZWdpb24gaGFzIGFsc28gYmVlbiBjYW5jZWxsZWQKKyAgLy8gVE9ETzogY2hlY2sgaWYgdGhpcyBzZXF1ZW5jZSBjYW4gYmUgaG9pc3RlZCBhYm92ZSBfX2ttcF90YXNrX3N0YXJ0CisgIC8vIGlmIGNhbmNlbGxhdGlvbiBoYXMgYmVlbiBlbmFibGVkIGZvciB0aGlzIHJ1biAuLi4KKyAgaWYgKF9fa21wX29tcF9jYW5jZWxsYXRpb24pIHsKKyAgICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAga21wX3RlYW1fdCAqdGhpc190ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgICAga21wX3Rhc2tncm91cF90ICp0YXNrZ3JvdXAgPSB0YXNrZGF0YS0+dGRfdGFza2dyb3VwOworICAgIGlmICgodGFza2dyb3VwICYmIHRhc2tncm91cC0+Y2FuY2VsX3JlcXVlc3QpIHx8CisgICAgICAgICh0aGlzX3RlYW0tPnQudF9jYW5jZWxfcmVxdWVzdCA9PSBjYW5jZWxfcGFyYWxsZWwpKSB7CisgICAgICBLTVBfQ09VTlRfQkxPQ0soVEFTS19jYW5jZWxsZWQpOworICAgICAgLy8gdGhpcyB0YXNrIGJlbG9uZ3MgdG8gYSB0YXNrIGdyb3VwIGFuZCB3ZSBuZWVkIHRvIGNhbmNlbCBpdAorICAgICAgZGlzY2FyZCA9IDEgLyogdHJ1ZSAqLzsKKyAgICB9CisgIH0KKworICAvLyBJbnZva2UgdGhlIHRhc2sgcm91dGluZSBhbmQgcGFzcyBpbiByZWxldmFudCBkYXRhLgorICAvLyBUaHVua3MgZ2VuZXJhdGVkIGJ5IGdjYyB0YWtlIGEgZGlmZmVyZW50IGFyZ3VtZW50IGxpc3QuCisgIGlmICghZGlzY2FyZCkgeworI2lmIEtNUF9TVEFUU19FTkFCTEVECisgICAgS01QX0NPVU5UX0JMT0NLKFRBU0tfZXhlY3V0ZWQpOworICAgIHN3aXRjaCAoS01QX0dFVF9USFJFQURfU1RBVEUoKSkgeworICAgIGNhc2UgRk9SS19KT0lOX0JBUlJJRVI6CisgICAgICBLTVBfUFVTSF9QQVJUSVRJT05FRF9USU1FUihPTVBfdGFza19qb2luX2Jhcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBMQUlOX0JBUlJJRVI6CisgICAgICBLTVBfUFVTSF9QQVJUSVRJT05FRF9USU1FUihPTVBfdGFza19wbGFpbl9iYXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUQVNLWUlFTEQ6CisgICAgICBLTVBfUFVTSF9QQVJUSVRJT05FRF9USU1FUihPTVBfdGFza190YXNreWllbGQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUQVNLV0FJVDoKKyAgICAgIEtNUF9QVVNIX1BBUlRJVElPTkVEX1RJTUVSKE9NUF90YXNrX3Rhc2t3YWl0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVEFTS0dST1VQOgorICAgICAgS01QX1BVU0hfUEFSVElUSU9ORURfVElNRVIoT01QX3Rhc2tfdGFza2dyb3VwKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBLTVBfUFVTSF9QQVJUSVRJT05FRF9USU1FUihPTVBfdGFza19pbW1lZGlhdGUpOworICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmIC8vIEtNUF9TVEFUU19FTkFCTEVECisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgLyogbGV0IE9NUFQga25vdyB0aGF0IHdlJ3JlIGFib3V0IHRvIHJ1biB0aGlzIHRhc2sgKi8KKyAgICBpZiAob21wdF9lbmFibGVkICYmIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90YXNrX3N3aXRjaCkpIHsKKyAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90YXNrX3N3aXRjaCkoCisgICAgICAgICAgY3VycmVudF90YXNrLT5vbXB0X3Rhc2tfaW5mby50YXNrX2lkLAorICAgICAgICAgIHRhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby50YXNrX2lkKTsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgIGlmICh0YXNrZGF0YS0+dGRfZmxhZ3MubmF0aXZlKSB7CisgICAgICAoKHZvaWQgKCopKHZvaWQgKikpKCoodGFzay0+cm91dGluZSkpKSh0YXNrLT5zaGFyZWRzKTsKKyAgICB9IGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyAgICB7CisgICAgICAoKih0YXNrLT5yb3V0aW5lKSkoZ3RpZCwgdGFzayk7CisgICAgfQorICAgIEtNUF9QT1BfUEFSVElUSU9ORURfVElNRVIoKTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgLyogbGV0IE9NUFQga25vdyB0aGF0IHdlJ3JlIHJldHVybmluZyB0byB0aGUgY2FsbGVlIHRhc2sgKi8KKyAgICBpZiAob21wdF9lbmFibGVkICYmIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90YXNrX3N3aXRjaCkpIHsKKyAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90YXNrX3N3aXRjaCkoCisgICAgICAgICAgdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLnRhc2tfaWQsCisgICAgICAgICAgY3VycmVudF90YXNrLT5vbXB0X3Rhc2tfaW5mby50YXNrX2lkKTsKKyAgICB9CisjZW5kaWYKKworI2lmIE9NUF80MF9FTkFCTEVECisgIH0KKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisjaWYgT01QVF9TVVBQT1JUCisgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICB0aHJlYWQtPnRoLm9tcHRfdGhyZWFkX2luZm8gPSBvbGRJbmZvOworICAgIHRhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby5mcmFtZS5leGl0X3J1bnRpbWVfZnJhbWUgPSBOVUxMOworICB9CisjZW5kaWYKKworI2lmIE9NUF80NV9FTkFCTEVECisgIC8vIFByb3h5IHRhc2tzIGFyZSBub3QgaGFuZGxlZCBieSB0aGUgcnVudGltZQorICBpZiAodGFza2RhdGEtPnRkX2ZsYWdzLnByb3h5ICE9IFRBU0tfUFJPWFkpIHsKKyNlbmRpZgorICAgIEFOTk9UQVRFX0hBUFBFTlNfQkVGT1JFKHRhc2tkYXRhLT50ZF9wYXJlbnQpOworICAgIF9fa21wX3Rhc2tfZmluaXNoKGd0aWQsIHRhc2ssIGN1cnJlbnRfdGFzayk7CisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgfQorI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgIC8vIEJhcnJpZXIgaW1iYWxhbmNlIC0gY29ycmVjdCBhcnJpdmUgdGltZSBhZnRlciB0aGUgdGFzayBmaW5pc2hlZAorICBpZiAoX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMykgeworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgICBpZiAodGhpc190aHItPnRoLnRoX2Jhcl9hcnJpdmVfdGltZSkgeworICAgICAgdGhpc190aHItPnRoLnRoX2Jhcl9hcnJpdmVfdGltZSArPSAoX19pdHRfZ2V0X3RpbWVzdGFtcCgpIC0gY3VyX3RpbWUpOworICAgIH0KKyAgfQorI2VuZGlmCisgIEtBX1RSQUNFKAorICAgICAgMzAsCisgICAgICAoIl9fa21wX2ludm9rZV90YXNrKGV4aXQpOiBUIyVkIGNvbXBsZXRlZCB0YXNrICVwLCByZXN1bWluZyB0YXNrICVwXG4iLAorICAgICAgIGd0aWQsIHRhc2tkYXRhLCBjdXJyZW50X3Rhc2spKTsKKyAgcmV0dXJuOworfQorCisvLyBfX2ttcGNfb21wX3Rhc2tfcGFydHM6IFNjaGVkdWxlIGEgdGhyZWFkLXN3aXRjaGFibGUgdGFzayBmb3IgZXhlY3V0aW9uCisvLworLy8gbG9jX3JlZjogbG9jYXRpb24gb2Ygb3JpZ2luYWwgdGFzayBwcmFnbWEgKGlnbm9yZWQpCisvLyBndGlkOiBHbG9iYWwgVGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKKy8vIG5ld190YXNrOiB0YXNrIHRodW5rIGFsbG9jYXRlZCBieSBfX2ttcF9vbXBfdGFza19hbGxvYygpIGZvciB0aGUgJyduZXcgdGFzaycnCisvLyBSZXR1cm5zOgorLy8gICAgVEFTS19DVVJSRU5UX05PVF9RVUVVRUQgKDApIGlmIGRpZCBub3Qgc3VzcGVuZCBhbmQgcXVldWUgY3VycmVudCB0YXNrIHRvCisvLyAgICBiZSByZXN1bWVkIGxhdGVyLgorLy8gICAgVEFTS19DVVJSRU5UX1FVRVVFRCAoMSkgaWYgc3VzcGVuZGVkIGFuZCBxdWV1ZWQgdGhlIGN1cnJlbnQgdGFzayB0byBiZQorLy8gICAgcmVzdW1lZCBsYXRlci4KK2ttcF9pbnQzMiBfX2ttcGNfb21wX3Rhc2tfcGFydHMoaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF90YXNrX3QgKm5ld190YXNrKSB7CisgIGttcF90YXNrZGF0YV90ICpuZXdfdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQShuZXdfdGFzayk7CisKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX3BhcnRzKGVudGVyKTogVCMlZCBsb2M9JXAgdGFzaz0lcFxuIiwgZ3RpZCwKKyAgICAgICAgICAgICAgICBsb2NfcmVmLCBuZXdfdGFza2RhdGEpKTsKKworICAvKiBTaG91bGQgd2UgZXhlY3V0ZSB0aGUgbmV3IHRhc2sgb3IgcXVldWUgaXQ/IEZvciBub3csIGxldCdzIGp1c3QgYWx3YXlzIHRyeQorICAgICB0byBxdWV1ZSBpdC4gIElmIHRoZSBxdWV1ZSBmaWxscyB1cCwgdGhlbiB3ZSdsbCBleGVjdXRlIGl0LiAgKi8KKworICBpZiAoX19rbXBfcHVzaF90YXNrKGd0aWQsIG5ld190YXNrKSA9PSBUQVNLX05PVF9QVVNIRUQpIC8vIGlmIGNhbm5vdCBkZWZlcgorICB7IC8vIEV4ZWN1dGUgdGhpcyB0YXNrIGltbWVkaWF0ZWx5CisgICAga21wX3Rhc2tkYXRhX3QgKmN1cnJlbnRfdGFzayA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICBuZXdfdGFza2RhdGEtPnRkX2ZsYWdzLnRhc2tfc2VyaWFsID0gMTsKKyAgICBfX2ttcF9pbnZva2VfdGFzayhndGlkLCBuZXdfdGFzaywgY3VycmVudF90YXNrKTsKKyAgfQorCisgIEtBX1RSQUNFKAorICAgICAgMTAsCisgICAgICAoIl9fa21wY19vbXBfdGFza19wYXJ0cyhleGl0KTogVCMlZCByZXR1cm5pbmcgVEFTS19DVVJSRU5UX05PVF9RVUVVRUQ6ICIKKyAgICAgICAibG9jPSVwIHRhc2s9JXAsIHJldHVybjogVEFTS19DVVJSRU5UX05PVF9RVUVVRURcbiIsCisgICAgICAgZ3RpZCwgbG9jX3JlZiwgbmV3X3Rhc2tkYXRhKSk7CisKKyAgQU5OT1RBVEVfSEFQUEVOU19CRUZPUkUobmV3X3Rhc2spOworICByZXR1cm4gVEFTS19DVVJSRU5UX05PVF9RVUVVRUQ7Cit9CisKKy8vIF9fa21wX29tcF90YXNrOiBTY2hlZHVsZSBhIG5vbi10aHJlYWQtc3dpdGNoYWJsZSB0YXNrIGZvciBleGVjdXRpb24KKy8vCisvLyBndGlkOiBHbG9iYWwgVGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKKy8vIG5ld190YXNrOm5vbi10aHJlYWQtc3dpdGNoYWJsZSB0YXNrIHRodW5rIGFsbG9jYXRlZCBieSBfX2ttcF9vbXBfdGFza19hbGxvYygpCisvLyBzZXJpYWxpemVfaW1tZWRpYXRlOiBpZiBUUlVFIHRoZW4gaWYgdGhlIHRhc2sgaXMgZXhlY3V0ZWQgaW1tZWRpYXRlbHkgaXRzCisvLyBleGVjdXRpb24gd2lsbCBiZSBzZXJpYWxpemVkCisvLyBSZXR1cm5zOgorLy8gICAgVEFTS19DVVJSRU5UX05PVF9RVUVVRUQgKDApIGlmIGRpZCBub3Qgc3VzcGVuZCBhbmQgcXVldWUgY3VycmVudCB0YXNrIHRvCisvLyAgICBiZSByZXN1bWVkIGxhdGVyLgorLy8gICAgVEFTS19DVVJSRU5UX1FVRVVFRCAoMSkgaWYgc3VzcGVuZGVkIGFuZCBxdWV1ZWQgdGhlIGN1cnJlbnQgdGFzayB0byBiZQorLy8gICAgcmVzdW1lZCBsYXRlci4KK2ttcF9pbnQzMiBfX2ttcF9vbXBfdGFzayhrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqbmV3X3Rhc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzZXJpYWxpemVfaW1tZWRpYXRlKSB7CisgIGttcF90YXNrZGF0YV90ICpuZXdfdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQShuZXdfdGFzayk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgIG5ld190YXNrZGF0YS0+b21wdF90YXNrX2luZm8uZnJhbWUucmVlbnRlcl9ydW50aW1lX2ZyYW1lID0KKyAgICAgICAgX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMSk7CisgIH0KKyNlbmRpZgorCisvKiBTaG91bGQgd2UgZXhlY3V0ZSB0aGUgbmV3IHRhc2sgb3IgcXVldWUgaXQ/IEZvciBub3csIGxldCdzIGp1c3QgYWx3YXlzIHRyeSB0bworICAgcXVldWUgaXQuICBJZiB0aGUgcXVldWUgZmlsbHMgdXAsIHRoZW4gd2UnbGwgZXhlY3V0ZSBpdC4gICovCisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgaWYgKG5ld190YXNrZGF0YS0+dGRfZmxhZ3MucHJveHkgPT0gVEFTS19QUk9YWSB8fAorICAgICAgX19rbXBfcHVzaF90YXNrKGd0aWQsIG5ld190YXNrKSA9PSBUQVNLX05PVF9QVVNIRUQpIC8vIGlmIGNhbm5vdCBkZWZlcgorI2Vsc2UKKyAgaWYgKF9fa21wX3B1c2hfdGFzayhndGlkLCBuZXdfdGFzaykgPT0gVEFTS19OT1RfUFVTSEVEKSAvLyBpZiBjYW5ub3QgZGVmZXIKKyNlbmRpZgorICB7IC8vIEV4ZWN1dGUgdGhpcyB0YXNrIGltbWVkaWF0ZWx5CisgICAga21wX3Rhc2tkYXRhX3QgKmN1cnJlbnRfdGFzayA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICBpZiAoc2VyaWFsaXplX2ltbWVkaWF0ZSkKKyAgICAgIG5ld190YXNrZGF0YS0+dGRfZmxhZ3MudGFza19zZXJpYWwgPSAxOworICAgIF9fa21wX2ludm9rZV90YXNrKGd0aWQsIG5ld190YXNrLCBjdXJyZW50X3Rhc2spOworICB9CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgIG5ld190YXNrZGF0YS0+b21wdF90YXNrX2luZm8uZnJhbWUucmVlbnRlcl9ydW50aW1lX2ZyYW1lID0gTlVMTDsKKyAgfQorI2VuZGlmCisKKyAgQU5OT1RBVEVfSEFQUEVOU19CRUZPUkUobmV3X3Rhc2spOworICByZXR1cm4gVEFTS19DVVJSRU5UX05PVF9RVUVVRUQ7Cit9CisKKy8vIF9fa21wY19vbXBfdGFzazogV3JhcHBlciBhcm91bmQgX19rbXBfb21wX3Rhc2sgdG8gc2NoZWR1bGUgYQorLy8gbm9uLXRocmVhZC1zd2l0Y2hhYmxlIHRhc2sgZnJvbSB0aGUgcGFyZW50IHRocmVhZCBvbmx5IQorLy8KKy8vIGxvY19yZWY6IGxvY2F0aW9uIG9mIG9yaWdpbmFsIHRhc2sgcHJhZ21hIChpZ25vcmVkKQorLy8gZ3RpZDogR2xvYmFsIFRocmVhZCBJRCBvZiBlbmNvdW50ZXJpbmcgdGhyZWFkCisvLyBuZXdfdGFzazogbm9uLXRocmVhZC1zd2l0Y2hhYmxlIHRhc2sgdGh1bmsgYWxsb2NhdGVkIGJ5CisvLyBfX2ttcF9vbXBfdGFza19hbGxvYygpCisvLyBSZXR1cm5zOgorLy8gICAgVEFTS19DVVJSRU5UX05PVF9RVUVVRUQgKDApIGlmIGRpZCBub3Qgc3VzcGVuZCBhbmQgcXVldWUgY3VycmVudCB0YXNrIHRvCisvLyAgICBiZSByZXN1bWVkIGxhdGVyLgorLy8gICAgVEFTS19DVVJSRU5UX1FVRVVFRCAoMSkgaWYgc3VzcGVuZGVkIGFuZCBxdWV1ZWQgdGhlIGN1cnJlbnQgdGFzayB0byBiZQorLy8gICAgcmVzdW1lZCBsYXRlci4KK2ttcF9pbnQzMiBfX2ttcGNfb21wX3Rhc2soaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF90YXNrX3QgKm5ld190YXNrKSB7CisgIGttcF9pbnQzMiByZXM7CisgIEtNUF9TRVRfVEhSRUFEX1NUQVRFX0JMT0NLKEVYUExJQ0lUX1RBU0spOworCisjaWYgS01QX0RFQlVHCisgIGttcF90YXNrZGF0YV90ICpuZXdfdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQShuZXdfdGFzayk7CisjZW5kaWYKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrKGVudGVyKTogVCMlZCBsb2M9JXAgdGFzaz0lcFxuIiwgZ3RpZCwgbG9jX3JlZiwKKyAgICAgICAgICAgICAgICBuZXdfdGFza2RhdGEpKTsKKworICByZXMgPSBfX2ttcF9vbXBfdGFzayhndGlkLCBuZXdfdGFzaywgdHJ1ZSk7CisKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrKGV4aXQpOiBUIyVkIHJldHVybmluZyAiCisgICAgICAgICAgICAgICAgIlRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEOiBsb2M9JXAgdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCBuZXdfdGFza2RhdGEpKTsKKyAgcmV0dXJuIHJlczsKK30KKworLy8gX19rbXBjX29tcF90YXNrd2FpdDogV2FpdCB1bnRpbCBhbGwgdGFza3MgZ2VuZXJhdGVkIGJ5IHRoZSBjdXJyZW50IHRhc2sgYXJlCisvLyBjb21wbGV0ZQora21wX2ludDMyIF9fa21wY19vbXBfdGFza3dhaXQoaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQpIHsKKyAga21wX3Rhc2tkYXRhX3QgKnRhc2tkYXRhOworICBrbXBfaW5mb190ICp0aHJlYWQ7CisgIGludCB0aHJlYWRfZmluaXNoZWQgPSBGQUxTRTsKKyAgS01QX1NFVF9USFJFQURfU1RBVEVfQkxPQ0soVEFTS1dBSVQpOworCisgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza3dhaXQoZW50ZXIpOiBUIyVkIGxvYz0lcFxuIiwgZ3RpZCwgbG9jX3JlZikpOworCisgIGlmIChfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYykgeworICAgIHRocmVhZCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAgdGFza2RhdGEgPSB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzazsKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgIG9tcHRfdGFza19pZF90IG15X3Rhc2tfaWQ7CisgICAgb21wdF9wYXJhbGxlbF9pZF90IG15X3BhcmFsbGVsX2lkOworCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAga21wX3RlYW1fdCAqdGVhbSA9IHRocmVhZC0+dGgudGhfdGVhbTsKKyAgICAgIG15X3Rhc2tfaWQgPSB0YXNrZGF0YS0+b21wdF90YXNrX2luZm8udGFza19pZDsKKyAgICAgIG15X3BhcmFsbGVsX2lkID0gdGVhbS0+dC5vbXB0X3RlYW1faW5mby5wYXJhbGxlbF9pZDsKKworICAgICAgdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLmZyYW1lLnJlZW50ZXJfcnVudGltZV9mcmFtZSA9CisgICAgICAgICAgX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMSk7CisgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3Rhc2t3YWl0X2JlZ2luKSkgeworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGFza3dhaXRfYmVnaW4pKG15X3BhcmFsbGVsX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15X3Rhc2tfaWQpOworICAgICAgfQorICAgIH0KKyNlbmRpZgorCisvLyBEZWJ1Z2dlcjogVGhlIHRhc2t3YWl0IGlzIGFjdGl2ZS4gU3RvcmUgbG9jYXRpb24gYW5kIHRocmVhZCBlbmNvdW50ZXJlZCB0aGUKKy8vIHRhc2t3YWl0LgorI2lmIFVTRV9JVFRfQlVJTEQKKy8vIE5vdGU6IFRoZXNlIHZhbHVlcyBhcmUgdXNlZCBieSBJVFQgZXZlbnRzIGFzIHdlbGwuCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF9jb3VudGVyICs9IDE7CisgICAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X2lkZW50ID0gbG9jX3JlZjsKKyAgICB0YXNrZGF0YS0+dGRfdGFza3dhaXRfdGhyZWFkID0gZ3RpZCArIDE7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgdm9pZCAqaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X3Rhc2t3YWl0X29iamVjdChndGlkKTsKKyAgICBpZiAoaXR0X3N5bmNfb2JqICE9IE5VTEwpCisgICAgICBfX2ttcF9pdHRfdGFza3dhaXRfc3RhcnRpbmcoZ3RpZCwgaXR0X3N5bmNfb2JqKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBib29sIG11c3Rfd2FpdCA9CisgICAgICAgICF0YXNrZGF0YS0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgJiYgIXRhc2tkYXRhLT50ZF9mbGFncy5maW5hbDsKKworI2lmIE9NUF80NV9FTkFCTEVECisgICAgbXVzdF93YWl0ID0gbXVzdF93YWl0IHx8ICh0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbSAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbS0+dHQudHRfZm91bmRfcHJveHlfdGFza3MpOworI2VuZGlmCisgICAgaWYgKG11c3Rfd2FpdCkgeworICAgICAga21wX2ZsYWdfMzIgZmxhZygKKyAgICAgICAgICBSQ0FTVCh2b2xhdGlsZSBrbXBfdWludDMyICosICZ0YXNrZGF0YS0+dGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcyksCisgICAgICAgICAgMFUpOworICAgICAgd2hpbGUgKFRDUl80KHRhc2tkYXRhLT50ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzKSAhPSAwKSB7CisgICAgICAgIGZsYWcuZXhlY3V0ZV90YXNrcyh0aHJlYWQsIGd0aWQsIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRocmVhZF9maW5pc2hlZCBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfdGFza19zdGVhbGluZ19jb25zdHJhaW50KTsKKyAgICAgIH0KKyAgICB9CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGlmIChpdHRfc3luY19vYmogIT0gTlVMTCkKKyAgICAgIF9fa21wX2l0dF90YXNrd2FpdF9maW5pc2hlZChndGlkLCBpdHRfc3luY19vYmopOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIC8vIERlYnVnZ2VyOiAgVGhlIHRhc2t3YWl0IGlzIGNvbXBsZXRlZC4gTG9jYXRpb24gcmVtYWlucywgYnV0IHRocmVhZCBpcworICAgIC8vIG5lZ2F0ZWQuCisgICAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X3RocmVhZCA9IC10YXNrZGF0YS0+dGRfdGFza3dhaXRfdGhyZWFkOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3Rhc2t3YWl0X2VuZCkpIHsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3Rhc2t3YWl0X2VuZCkobXlfcGFyYWxsZWxfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15X3Rhc2tfaWQpOworICAgICAgfQorICAgICAgdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLmZyYW1lLnJlZW50ZXJfcnVudGltZV9mcmFtZSA9IE5VTEw7CisgICAgfQorI2VuZGlmCisgICAgQU5OT1RBVEVfSEFQUEVOU19BRlRFUih0YXNrZGF0YSk7CisgIH0KKworICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2t3YWl0KGV4aXQpOiBUIyVkIHRhc2sgJXAgZmluaXNoZWQgd2FpdGluZywgIgorICAgICAgICAgICAgICAgICJyZXR1cm5pbmcgVEFTS19DVVJSRU5UX05PVF9RVUVVRURcbiIsCisgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEpKTsKKworICByZXR1cm4gVEFTS19DVVJSRU5UX05PVF9RVUVVRUQ7Cit9CisKKy8vIF9fa21wY19vbXBfdGFza3lpZWxkOiBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgdGFzawora21wX2ludDMyIF9fa21wY19vbXBfdGFza3lpZWxkKGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBpbnQgZW5kX3BhcnQpIHsKKyAga21wX3Rhc2tkYXRhX3QgKnRhc2tkYXRhOworICBrbXBfaW5mb190ICp0aHJlYWQ7CisgIGludCB0aHJlYWRfZmluaXNoZWQgPSBGQUxTRTsKKworICBLTVBfQ09VTlRfQkxPQ0soT01QX1RBU0tZSUVMRCk7CisgIEtNUF9TRVRfVEhSRUFEX1NUQVRFX0JMT0NLKFRBU0tZSUVMRCk7CisKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNreWllbGQoZW50ZXIpOiBUIyVkIGxvYz0lcCBlbmRfcGFydCA9ICVkXG4iLAorICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIGVuZF9wYXJ0KSk7CisKKyAgaWYgKF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICYmIF9fa21wX2luaXRfcGFyYWxsZWwpIHsKKyAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICAgIHRhc2tkYXRhID0gdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2s7CisvLyBTaG91bGQgd2UgbW9kZWwgdGhpcyBhcyBhIHRhc2sgd2FpdCBvciBub3Q/CisvLyBEZWJ1Z2dlcjogVGhlIHRhc2t3YWl0IGlzIGFjdGl2ZS4gU3RvcmUgbG9jYXRpb24gYW5kIHRocmVhZCBlbmNvdW50ZXJlZCB0aGUKKy8vIHRhc2t3YWl0LgorI2lmIFVTRV9JVFRfQlVJTEQKKy8vIE5vdGU6IFRoZXNlIHZhbHVlcyBhcmUgdXNlZCBieSBJVFQgZXZlbnRzIGFzIHdlbGwuCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF9jb3VudGVyICs9IDE7CisgICAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X2lkZW50ID0gbG9jX3JlZjsKKyAgICB0YXNrZGF0YS0+dGRfdGFza3dhaXRfdGhyZWFkID0gZ3RpZCArIDE7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgdm9pZCAqaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X3Rhc2t3YWl0X29iamVjdChndGlkKTsKKyAgICBpZiAoaXR0X3N5bmNfb2JqICE9IE5VTEwpCisgICAgICBfX2ttcF9pdHRfdGFza3dhaXRfc3RhcnRpbmcoZ3RpZCwgaXR0X3N5bmNfb2JqKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgaWYgKCF0YXNrZGF0YS0+dGRfZmxhZ3MudGVhbV9zZXJpYWwpIHsKKyAgICAgIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtID0gdGhyZWFkLT50aC50aF90YXNrX3RlYW07CisgICAgICBpZiAodGFza190ZWFtICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKEtNUF9UQVNLSU5HX0VOQUJMRUQodGFza190ZWFtKSkgeworICAgICAgICAgIF9fa21wX2V4ZWN1dGVfdGFza3NfMzIoCisgICAgICAgICAgICAgIHRocmVhZCwgZ3RpZCwgTlVMTCwgRkFMU0UsCisgICAgICAgICAgICAgICZ0aHJlYWRfZmluaXNoZWQgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSwKKyAgICAgICAgICAgICAgX19rbXBfdGFza19zdGVhbGluZ19jb25zdHJhaW50KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgaWYgKGl0dF9zeW5jX29iaiAhPSBOVUxMKQorICAgICAgX19rbXBfaXR0X3Rhc2t3YWl0X2ZpbmlzaGVkKGd0aWQsIGl0dF9zeW5jX29iaik7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgLy8gRGVidWdnZXI6ICBUaGUgdGFza3dhaXQgaXMgY29tcGxldGVkLiBMb2NhdGlvbiByZW1haW5zLCBidXQgdGhyZWFkIGlzCisgICAgLy8gbmVnYXRlZC4KKyAgICB0YXNrZGF0YS0+dGRfdGFza3dhaXRfdGhyZWFkID0gLXRhc2tkYXRhLT50ZF90YXNrd2FpdF90aHJlYWQ7CisgIH0KKworICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2t5aWVsZChleGl0KTogVCMlZCB0YXNrICVwIHJlc3VtaW5nLCAiCisgICAgICAgICAgICAgICAgInJldHVybmluZyBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRFxuIiwKKyAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSkpOworCisgIHJldHVybiBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRDsKK30KKworLy8gVE9ETzogY2hhbmdlIHRvIE9NUF81MF9FTkFCTEVELCBuZWVkIHRvIGNoYW5nZSBidWlsZCB0b29scyBmb3IgdGhpcyB0byB3b3JrCisjaWYgT01QXzQ1X0VOQUJMRUQKKy8vIFRhc2sgUmVkdWN0aW9uIGltcGxlbWVudGF0aW9uCisKK3R5cGVkZWYgc3RydWN0IGttcF90YXNrX3JlZF9mbGFncyB7CisgIHVuc2lnbmVkIGxhenlfcHJpdiA6IDE7IC8vIGhpbnQ6ICgxKSB1c2UgbGF6eSBhbGxvY2F0aW9uIChiaWcgb2JqZWN0cykKKyAgdW5zaWduZWQgcmVzZXJ2ZWQzMSA6IDMxOworfSBrbXBfdGFza19yZWRfZmxhZ3NfdDsKKworLy8gaW50ZXJuYWwgc3RydWN0dXJlIGZvciByZWR1Y3Rpb24gZGF0YSBpdGVtIHJlbGF0ZWQgaW5mbwordHlwZWRlZiBzdHJ1Y3Qga21wX3Rhc2tfcmVkX2RhdGEgeworICB2b2lkICpyZWR1Y2Vfc2hhcjsgLy8gc2hhcmVkIHJlZHVjdGlvbiBpdGVtCisgIHNpemVfdCByZWR1Y2Vfc2l6ZTsgLy8gc2l6ZSBvZiBkYXRhIGl0ZW0KKyAgdm9pZCAqcmVkdWNlX3ByaXY7IC8vIHRocmVhZCBzcGVjaWZpYyBkYXRhCisgIHZvaWQgKnJlZHVjZV9wZW5kOyAvLyBlbmQgb2YgcHJpdmF0ZSBkYXRhIGZvciBjb21wYXJpc29uIG9wCisgIHZvaWQgKnJlZHVjZV9pbml0OyAvLyBkYXRhIGluaXRpYWxpemF0aW9uIHJvdXRpbmUKKyAgdm9pZCAqcmVkdWNlX2Zpbmk7IC8vIGRhdGEgZmluYWxpemF0aW9uIHJvdXRpbmUKKyAgdm9pZCAqcmVkdWNlX2NvbWI7IC8vIGRhdGEgY29tYmluZXIgcm91dGluZQorICBrbXBfdGFza19yZWRfZmxhZ3NfdCBmbGFnczsgLy8gZmxhZ3MgZm9yIGFkZGl0aW9uYWwgaW5mbyBmcm9tIGNvbXBpbGVyCit9IGttcF90YXNrX3JlZF9kYXRhX3Q7CisKKy8vIHN0cnVjdHVyZSBzZW50IHVzIGJ5IGNvbXBpbGVyIC0gb25lIHBlciByZWR1Y3Rpb24gaXRlbQordHlwZWRlZiBzdHJ1Y3Qga21wX3Rhc2tfcmVkX2lucHV0IHsKKyAgdm9pZCAqcmVkdWNlX3NoYXI7IC8vIHNoYXJlZCByZWR1Y3Rpb24gaXRlbQorICBzaXplX3QgcmVkdWNlX3NpemU7IC8vIHNpemUgb2YgZGF0YSBpdGVtCisgIHZvaWQgKnJlZHVjZV9pbml0OyAvLyBkYXRhIGluaXRpYWxpemF0aW9uIHJvdXRpbmUKKyAgdm9pZCAqcmVkdWNlX2Zpbmk7IC8vIGRhdGEgZmluYWxpemF0aW9uIHJvdXRpbmUKKyAgdm9pZCAqcmVkdWNlX2NvbWI7IC8vIGRhdGEgY29tYmluZXIgcm91dGluZQorICBrbXBfdGFza19yZWRfZmxhZ3NfdCBmbGFnczsgLy8gZmxhZ3MgZm9yIGFkZGl0aW9uYWwgaW5mbyBmcm9tIGNvbXBpbGVyCit9IGttcF90YXNrX3JlZF9pbnB1dF90OworCisvKiEKK0Bpbmdyb3VwIFRBU0tJTkcKK0BwYXJhbSBndGlkICAgICAgR2xvYmFsIHRocmVhZCBJRAorQHBhcmFtIG51bSAgICAgICBOdW1iZXIgb2YgZGF0YSBpdGVtcyB0byByZWR1Y2UKK0BwYXJhbSBkYXRhICAgICAgQXJyYXkgb2YgZGF0YSBmb3IgcmVkdWN0aW9uCitAcmV0dXJuIFRoZSB0YXNrZ3JvdXAgaWRlbnRpZmllcgorCitJbml0aWFsaXplIHRhc2sgcmVkdWN0aW9uIGZvciB0aGUgdGFza2dyb3VwLgorKi8KK3ZvaWQgKl9fa21wY190YXNrX3JlZHVjdGlvbl9pbml0KGludCBndGlkLCBpbnQgbnVtLCB2b2lkICpkYXRhKSB7CisgIGttcF9pbmZvX3QgKnRocmVhZCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgIGttcF90YXNrZ3JvdXBfdCAqdGcgPSB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfdGFza2dyb3VwOworICBrbXBfaW50MzIgbnRoID0gdGhyZWFkLT50aC50aF90ZWFtX25wcm9jOworICBrbXBfdGFza19yZWRfaW5wdXRfdCAqaW5wdXQgPSAoa21wX3Rhc2tfcmVkX2lucHV0X3QgKilkYXRhOworICBrbXBfdGFza19yZWRfZGF0YV90ICphcnI7CisKKyAgLy8gY2hlY2sgaW5wdXQgZGF0YSBqdXN0IGluIGNhc2UKKyAgS01QX0FTU0VSVCh0ZyAhPSBOVUxMKTsKKyAgS01QX0FTU0VSVChkYXRhICE9IE5VTEwpOworICBLTVBfQVNTRVJUKG51bSA+IDApOworICBpZiAobnRoID09IDEpIHsKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfdGFza19yZWR1Y3Rpb25faW5pdDogVCMlZCwgdGcgJXAsIGV4aXRpbmcgbnRoPTFcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0ZykpOworICAgIHJldHVybiAodm9pZCAqKXRnOworICB9CisgIEtBX1RSQUNFKDEwLCAoIl9fa21wY190YXNrX3JlZHVjdGlvbl9pbml0OiBUIyVkLCB0YXNrZ3JvdXAgJXAsICNpdGVtcyAlZFxuIiwKKyAgICAgICAgICAgICAgICBndGlkLCB0ZywgbnVtKSk7CisgIGFyciA9IChrbXBfdGFza19yZWRfZGF0YV90ICopX19rbXBfdGhyZWFkX21hbGxvYygKKyAgICAgIHRocmVhZCwgbnVtICogc2l6ZW9mKGttcF90YXNrX3JlZF9kYXRhX3QpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07ICsraSkgeworICAgIHZvaWQgKCpmX2luaXQpKHZvaWQgKikgPSAodm9pZCAoKikodm9pZCAqKSkoaW5wdXRbaV0ucmVkdWNlX2luaXQpOworICAgIHNpemVfdCBzaXplID0gaW5wdXRbaV0ucmVkdWNlX3NpemUgLSAxOworICAgIC8vIHJvdW5kIHRoZSBzaXplIHVwIHRvIGNhY2hlIGxpbmUgcGVyIHRocmVhZC1zcGVjaWZpYyBpdGVtCisgICAgc2l6ZSArPSBDQUNIRV9MSU5FIC0gc2l6ZSAlIENBQ0hFX0xJTkU7CisgICAgS01QX0FTU0VSVChpbnB1dFtpXS5yZWR1Y2VfY29tYiAhPSBOVUxMKTsgLy8gY29tYmluZXIgaXMgbWFuZGF0b3J5CisgICAgYXJyW2ldLnJlZHVjZV9zaGFyID0gaW5wdXRbaV0ucmVkdWNlX3NoYXI7CisgICAgYXJyW2ldLnJlZHVjZV9zaXplID0gc2l6ZTsKKyAgICBhcnJbaV0ucmVkdWNlX2luaXQgPSBpbnB1dFtpXS5yZWR1Y2VfaW5pdDsKKyAgICBhcnJbaV0ucmVkdWNlX2ZpbmkgPSBpbnB1dFtpXS5yZWR1Y2VfZmluaTsKKyAgICBhcnJbaV0ucmVkdWNlX2NvbWIgPSBpbnB1dFtpXS5yZWR1Y2VfY29tYjsKKyAgICBhcnJbaV0uZmxhZ3MgPSBpbnB1dFtpXS5mbGFnczsKKyAgICBpZiAoIWlucHV0W2ldLmZsYWdzLmxhenlfcHJpdikgeworICAgICAgLy8gYWxsb2NhdGUgY2FjaGUtbGluZSBhbGlnbmVkIGJsb2NrIGFuZCBmaWxsIGl0IHdpdGggemVyb3MKKyAgICAgIGFycltpXS5yZWR1Y2VfcHJpdiA9IF9fa21wX2FsbG9jYXRlKG50aCAqIHNpemUpOworICAgICAgYXJyW2ldLnJlZHVjZV9wZW5kID0gKGNoYXIgKikoYXJyW2ldLnJlZHVjZV9wcml2KSArIG50aCAqIHNpemU7CisgICAgICBpZiAoZl9pbml0ICE9IE5VTEwpIHsKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aHJlYWQtc3BlY2lmaWMgaXRlbXMKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBudGg7ICsraikgeworICAgICAgICAgIGZfaW5pdCgoY2hhciAqKShhcnJbaV0ucmVkdWNlX3ByaXYpICsgaiAqIHNpemUpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIG9ubHkgYWxsb2NhdGUgc3BhY2UgZm9yIHBvaW50ZXJzIG5vdywKKyAgICAgIC8vIG9iamVjdHMgd2lsbCBiZSBsYXppbHkgYWxsb2NhdGVkL2luaXRpYWxpemVkIG9uY2UgcmVxdWVzdGVkCisgICAgICBhcnJbaV0ucmVkdWNlX3ByaXYgPSBfX2ttcF9hbGxvY2F0ZShudGggKiBzaXplb2Yodm9pZCAqKSk7CisgICAgfQorICB9CisgIHRnLT5yZWR1Y2VfZGF0YSA9ICh2b2lkICopYXJyOworICB0Zy0+cmVkdWNlX251bV9kYXRhID0gbnVtOworICByZXR1cm4gKHZvaWQgKil0ZzsKK30KKworLyohCitAaW5ncm91cCBUQVNLSU5HCitAcGFyYW0gZ3RpZCAgICBHbG9iYWwgdGhyZWFkIElECitAcGFyYW0gdHNrZ3JwICBUaGUgdGFza2dyb3VwIElEIChvcHRpb25hbCkKK0BwYXJhbSBkYXRhICAgIFNoYXJlZCBsb2NhdGlvbiBvZiB0aGUgaXRlbQorQHJldHVybiBUaGUgcG9pbnRlciB0byBwZXItdGhyZWFkIGRhdGEKKworR2V0IHRocmVhZC1zcGVjaWZpYyBsb2NhdGlvbiBvZiBkYXRhIGl0ZW0KKyovCit2b2lkICpfX2ttcGNfdGFza19yZWR1Y3Rpb25fZ2V0X3RoX2RhdGEoaW50IGd0aWQsIHZvaWQgKnRza2dycCwgdm9pZCAqZGF0YSkgeworICBrbXBfaW5mb190ICp0aHJlYWQgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICBrbXBfaW50MzIgbnRoID0gdGhyZWFkLT50aC50aF90ZWFtX25wcm9jOworICBpZiAobnRoID09IDEpCisgICAgcmV0dXJuIGRhdGE7IC8vIG5vdGhpbmcgdG8gZG8KKworICBrbXBfdGFza2dyb3VwX3QgKnRnID0gKGttcF90YXNrZ3JvdXBfdCAqKXRza2dycDsKKyAgaWYgKHRnID09IE5VTEwpCisgICAgdGcgPSB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfdGFza2dyb3VwOworICBLTVBfQVNTRVJUKHRnICE9IE5VTEwpOworICBrbXBfdGFza19yZWRfZGF0YV90ICphcnIgPSAoa21wX3Rhc2tfcmVkX2RhdGFfdCAqKSh0Zy0+cmVkdWNlX2RhdGEpOworICBrbXBfaW50MzIgbnVtID0gdGctPnJlZHVjZV9udW1fZGF0YTsKKyAga21wX2ludDMyIHRpZCA9IHRocmVhZC0+dGgudGhfaW5mby5kcy5kc190aWQ7CisKKyAgS01QX0FTU0VSVChkYXRhICE9IE5VTEwpOworICB3aGlsZSAodGcgIT0gTlVMTCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyArK2kpIHsKKyAgICAgIGlmICghYXJyW2ldLmZsYWdzLmxhenlfcHJpdikgeworICAgICAgICBpZiAoZGF0YSA9PSBhcnJbaV0ucmVkdWNlX3NoYXIgfHwKKyAgICAgICAgICAgIChkYXRhID49IGFycltpXS5yZWR1Y2VfcHJpdiAmJiBkYXRhIDwgYXJyW2ldLnJlZHVjZV9wZW5kKSkKKyAgICAgICAgICByZXR1cm4gKGNoYXIgKikoYXJyW2ldLnJlZHVjZV9wcml2KSArIHRpZCAqIGFycltpXS5yZWR1Y2Vfc2l6ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGNoZWNrIHNoYXJlZCBsb2NhdGlvbiBmaXJzdAorICAgICAgICB2b2lkICoqcF9wcml2ID0gKHZvaWQgKiopKGFycltpXS5yZWR1Y2VfcHJpdik7CisgICAgICAgIGlmIChkYXRhID09IGFycltpXS5yZWR1Y2Vfc2hhcikKKyAgICAgICAgICBnb3RvIGZvdW5kOworICAgICAgICAvLyBjaGVjayBpZiB3ZSBnZXQgc29tZSB0aHJlYWQgc3BlY2lmaWMgbG9jYXRpb24gYXMgcGFyYW1ldGVyCisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbnRoOyArK2opCisgICAgICAgICAgaWYgKGRhdGEgPT0gcF9wcml2W2pdKQorICAgICAgICAgICAgZ290byBmb3VuZDsKKyAgICAgICAgY29udGludWU7IC8vIG5vdCBmb3VuZCwgY29udGludWUgc2VhcmNoCisgICAgICBmb3VuZDoKKyAgICAgICAgaWYgKHBfcHJpdlt0aWRdID09IE5VTEwpIHsKKyAgICAgICAgICAvLyBhbGxvY2F0ZSB0aHJlYWQgc3BlY2lmaWMgb2JqZWN0IGxhemlseQorICAgICAgICAgIHZvaWQgKCpmX2luaXQpKHZvaWQgKikgPSAodm9pZCAoKikodm9pZCAqKSkoYXJyW2ldLnJlZHVjZV9pbml0KTsKKyAgICAgICAgICBwX3ByaXZbdGlkXSA9IF9fa21wX2FsbG9jYXRlKGFycltpXS5yZWR1Y2Vfc2l6ZSk7CisgICAgICAgICAgaWYgKGZfaW5pdCAhPSBOVUxMKSB7CisgICAgICAgICAgICBmX2luaXQocF9wcml2W3RpZF0pOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcF9wcml2W3RpZF07CisgICAgICB9CisgICAgfQorICAgIHRnID0gdGctPnBhcmVudDsKKyAgICBhcnIgPSAoa21wX3Rhc2tfcmVkX2RhdGFfdCAqKSh0Zy0+cmVkdWNlX2RhdGEpOworICAgIG51bSA9IHRnLT5yZWR1Y2VfbnVtX2RhdGE7CisgIH0KKyAgS01QX0FTU0VSVDIoMCwgIlVua25vd24gdGFzayByZWR1Y3Rpb24gaXRlbSIpOworICByZXR1cm4gTlVMTDsgLy8gRVJST1IsIHRoaXMgbGluZSBuZXZlciBleGVjdXRlZAorfQorCisvLyBGaW5hbGl6ZSB0YXNrIHJlZHVjdGlvbi4KKy8vIENhbGxlZCBmcm9tIF9fa21wY19lbmRfdGFza2dyb3VwKCkKK3N0YXRpYyB2b2lkIF9fa21wX3Rhc2tfcmVkdWN0aW9uX2Zpbmkoa21wX2luZm9fdCAqdGgsIGttcF90YXNrZ3JvdXBfdCAqdGcpIHsKKyAga21wX2ludDMyIG50aCA9IHRoLT50aC50aF90ZWFtX25wcm9jOworICBLTVBfREVCVUdfQVNTRVJUKG50aCA+IDEpOyAvLyBzaG91bGQgbm90IGJlIGNhbGxlZCBpZiBudGggPT0gMQorICBrbXBfdGFza19yZWRfZGF0YV90ICphcnIgPSAoa21wX3Rhc2tfcmVkX2RhdGFfdCAqKXRnLT5yZWR1Y2VfZGF0YTsKKyAga21wX2ludDMyIG51bSA9IHRnLT5yZWR1Y2VfbnVtX2RhdGE7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyArK2kpIHsKKyAgICB2b2lkICpzaF9kYXRhID0gYXJyW2ldLnJlZHVjZV9zaGFyOworICAgIHZvaWQgKCpmX2ZpbmkpKHZvaWQgKikgPSAodm9pZCAoKikodm9pZCAqKSkoYXJyW2ldLnJlZHVjZV9maW5pKTsKKyAgICB2b2lkICgqZl9jb21iKSh2b2lkICosIHZvaWQgKikgPQorICAgICAgICAodm9pZCAoKikodm9pZCAqLCB2b2lkICopKShhcnJbaV0ucmVkdWNlX2NvbWIpOworICAgIGlmICghYXJyW2ldLmZsYWdzLmxhenlfcHJpdikgeworICAgICAgdm9pZCAqcHJfZGF0YSA9IGFycltpXS5yZWR1Y2VfcHJpdjsKKyAgICAgIHNpemVfdCBzaXplID0gYXJyW2ldLnJlZHVjZV9zaXplOworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBudGg7ICsraikgeworICAgICAgICB2b2lkICpwcml2X2RhdGEgPSAoY2hhciAqKXByX2RhdGEgKyBqICogc2l6ZTsKKyAgICAgICAgZl9jb21iKHNoX2RhdGEsIHByaXZfZGF0YSk7IC8vIGNvbWJpbmUgcmVzdWx0cworICAgICAgICBpZiAoZl9maW5pKQorICAgICAgICAgIGZfZmluaShwcml2X2RhdGEpOyAvLyBmaW5hbGl6ZSBpZiBuZWVkZWQKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdm9pZCAqKnByX2RhdGEgPSAodm9pZCAqKikoYXJyW2ldLnJlZHVjZV9wcml2KTsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbnRoOyArK2opIHsKKyAgICAgICAgaWYgKHByX2RhdGFbal0gIT0gTlVMTCkgeworICAgICAgICAgIGZfY29tYihzaF9kYXRhLCBwcl9kYXRhW2pdKTsgLy8gY29tYmluZSByZXN1bHRzCisgICAgICAgICAgaWYgKGZfZmluaSkKKyAgICAgICAgICAgIGZfZmluaShwcl9kYXRhW2pdKTsgLy8gZmluYWxpemUgaWYgbmVlZGVkCisgICAgICAgICAgX19rbXBfZnJlZShwcl9kYXRhW2pdKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBfX2ttcF9mcmVlKGFycltpXS5yZWR1Y2VfcHJpdik7CisgIH0KKyAgX19rbXBfdGhyZWFkX2ZyZWUodGgsIGFycik7CisgIHRnLT5yZWR1Y2VfZGF0YSA9IE5VTEw7CisgIHRnLT5yZWR1Y2VfbnVtX2RhdGEgPSAwOworfQorI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorLy8gX19rbXBjX3Rhc2tncm91cDogU3RhcnQgYSBuZXcgdGFza2dyb3VwCit2b2lkIF9fa21wY190YXNrZ3JvdXAoaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCkgeworICBrbXBfaW5mb190ICp0aHJlYWQgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICBrbXBfdGFza2RhdGFfdCAqdGFza2RhdGEgPSB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzazsKKyAga21wX3Rhc2tncm91cF90ICp0Z19uZXcgPQorICAgICAgKGttcF90YXNrZ3JvdXBfdCAqKV9fa21wX3RocmVhZF9tYWxsb2ModGhyZWFkLCBzaXplb2Yoa21wX3Rhc2tncm91cF90KSk7CisgIEtBX1RSQUNFKDEwLCAoIl9fa21wY190YXNrZ3JvdXA6IFQjJWQgbG9jPSVwIGdyb3VwPSVwXG4iLCBndGlkLCBsb2MsIHRnX25ldykpOworICB0Z19uZXctPmNvdW50ID0gMDsKKyAgdGdfbmV3LT5jYW5jZWxfcmVxdWVzdCA9IGNhbmNlbF9ub3JlcTsKKyAgdGdfbmV3LT5wYXJlbnQgPSB0YXNrZGF0YS0+dGRfdGFza2dyb3VwOworLy8gVE9ETzogY2hhbmdlIHRvIE9NUF81MF9FTkFCTEVELCBuZWVkIHRvIGNoYW5nZSBidWlsZCB0b29scyBmb3IgdGhpcyB0byB3b3JrCisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgdGdfbmV3LT5yZWR1Y2VfZGF0YSA9IE5VTEw7CisgIHRnX25ldy0+cmVkdWNlX251bV9kYXRhID0gMDsKKyNlbmRpZgorICB0YXNrZGF0YS0+dGRfdGFza2dyb3VwID0gdGdfbmV3OworfQorCisvLyBfX2ttcGNfZW5kX3Rhc2tncm91cDogV2FpdCB1bnRpbCBhbGwgdGFza3MgZ2VuZXJhdGVkIGJ5IHRoZSBjdXJyZW50IHRhc2sKKy8vICAgICAgICAgICAgICAgICAgICAgICBhbmQgaXRzIGRlc2NlbmRhbnRzIGFyZSBjb21wbGV0ZQordm9pZCBfX2ttcGNfZW5kX3Rhc2tncm91cChpZGVudF90ICpsb2MsIGludCBndGlkKSB7CisgIGttcF9pbmZvX3QgKnRocmVhZCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgIGttcF90YXNrZGF0YV90ICp0YXNrZGF0YSA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrOworICBrbXBfdGFza2dyb3VwX3QgKnRhc2tncm91cCA9IHRhc2tkYXRhLT50ZF90YXNrZ3JvdXA7CisgIGludCB0aHJlYWRfZmluaXNoZWQgPSBGQUxTRTsKKworICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfZW5kX3Rhc2tncm91cChlbnRlcik6IFQjJWQgbG9jPSVwXG4iLCBndGlkLCBsb2MpKTsKKyAgS01QX0RFQlVHX0FTU0VSVCh0YXNrZ3JvdXAgIT0gTlVMTCk7CisgIEtNUF9TRVRfVEhSRUFEX1NUQVRFX0JMT0NLKFRBU0tHUk9VUCk7CisKKyAgaWYgKF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjKSB7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIC8vIEZvciBJVFQgdGhlIHRhc2tncm91cCB3YWl0IGlzIHNpbWlsYXIgdG8gdGFza3dhaXQgdW50aWwgd2UgbmVlZCB0bworICAgIC8vIGRpc3Rpbmd1aXNoIHRoZW0KKyAgICB2b2lkICppdHRfc3luY19vYmogPSBfX2ttcF9pdHRfdGFza3dhaXRfb2JqZWN0KGd0aWQpOworICAgIGlmIChpdHRfc3luY19vYmogIT0gTlVMTCkKKyAgICAgIF9fa21wX2l0dF90YXNrd2FpdF9zdGFydGluZyhndGlkLCBpdHRfc3luY19vYmopOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworI2lmIE9NUF80NV9FTkFCTEVECisgICAgaWYgKCF0YXNrZGF0YS0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgfHwKKyAgICAgICAgKHRocmVhZC0+dGgudGhfdGFza190ZWFtICE9IE5VTEwgJiYKKyAgICAgICAgIHRocmVhZC0+dGgudGhfdGFza190ZWFtLT50dC50dF9mb3VuZF9wcm94eV90YXNrcykpCisjZWxzZQorICAgIGlmICghdGFza2RhdGEtPnRkX2ZsYWdzLnRlYW1fc2VyaWFsKQorI2VuZGlmCisgICAgeworICAgICAga21wX2ZsYWdfMzIgZmxhZyhSQ0FTVChrbXBfdWludDMyICosICZ0YXNrZ3JvdXAtPmNvdW50KSwgMFUpOworICAgICAgd2hpbGUgKFRDUl80KHRhc2tncm91cC0+Y291bnQpICE9IDApIHsKKyAgICAgICAgZmxhZy5leGVjdXRlX3Rhc2tzKHRocmVhZCwgZ3RpZCwgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhyZWFkX2ZpbmlzaGVkIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF90YXNrX3N0ZWFsaW5nX2NvbnN0cmFpbnQpOworICAgICAgfQorICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBpZiAoaXR0X3N5bmNfb2JqICE9IE5VTEwpCisgICAgICBfX2ttcF9pdHRfdGFza3dhaXRfZmluaXNoZWQoZ3RpZCwgaXR0X3N5bmNfb2JqKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgIH0KKyAgS01QX0RFQlVHX0FTU0VSVCh0YXNrZ3JvdXAtPmNvdW50ID09IDApOworCisvLyBUT0RPOiBjaGFuZ2UgdG8gT01QXzUwX0VOQUJMRUQsIG5lZWQgdG8gY2hhbmdlIGJ1aWxkIHRvb2xzIGZvciB0aGlzIHRvIHdvcmsKKyNpZiBPTVBfNDVfRU5BQkxFRAorICBpZiAodGFza2dyb3VwLT5yZWR1Y2VfZGF0YSAhPSBOVUxMKSAvLyBuZWVkIHRvIHJlZHVjZT8KKyAgICBfX2ttcF90YXNrX3JlZHVjdGlvbl9maW5pKHRocmVhZCwgdGFza2dyb3VwKTsKKyNlbmRpZgorICAvLyBSZXN0b3JlIHBhcmVudCB0YXNrZ3JvdXAgZm9yIHRoZSBjdXJyZW50IHRhc2sKKyAgdGFza2RhdGEtPnRkX3Rhc2tncm91cCA9IHRhc2tncm91cC0+cGFyZW50OworICBfX2ttcF90aHJlYWRfZnJlZSh0aHJlYWQsIHRhc2tncm91cCk7CisKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX2VuZF90YXNrZ3JvdXAoZXhpdCk6IFQjJWQgdGFzayAlcCBmaW5pc2hlZCB3YWl0aW5nXG4iLAorICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhKSk7CisgIEFOTk9UQVRFX0hBUFBFTlNfQUZURVIodGFza2RhdGEpOworfQorI2VuZGlmCisKKy8vIF9fa21wX3JlbW92ZV9teV90YXNrOiByZW1vdmUgYSB0YXNrIGZyb20gbXkgb3duIGRlcXVlCitzdGF0aWMga21wX3Rhc2tfdCAqX19rbXBfcmVtb3ZlX215X3Rhc2soa21wX2luZm9fdCAqdGhyZWFkLCBrbXBfaW50MzIgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgaXNfY29uc3RyYWluZWQpIHsKKyAga21wX3Rhc2tfdCAqdGFzazsKKyAga21wX3Rhc2tkYXRhX3QgKnRhc2tkYXRhOworICBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGE7CisgIGttcF91aW50MzIgdGFpbDsKKworICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjKTsKKyAgS01QX0RFQlVHX0FTU0VSVCh0YXNrX3RlYW0tPnR0LnR0X3RocmVhZHNfZGF0YSAhPQorICAgICAgICAgICAgICAgICAgIE5VTEwpOyAvLyBDYWxsZXIgc2hvdWxkIGNoZWNrIHRoaXMgY29uZGl0aW9uCisKKyAgdGhyZWFkX2RhdGEgPSAmdGFza190ZWFtLT50dC50dF90aHJlYWRzX2RhdGFbX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKV07CisKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBfcmVtb3ZlX215X3Rhc2soZW50ZXIpOiBUIyVkIG50YXNrcz0lZCBoZWFkPSV1IHRhaWw9JXVcbiIsCisgICAgICAgICAgICAgICAgZ3RpZCwgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX250YXNrcywKKyAgICAgICAgICAgICAgICB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfaGVhZCwgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX3RhaWwpKTsKKworICBpZiAoVENSXzQodGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX250YXNrcykgPT0gMCkgeworICAgIEtBX1RSQUNFKDEwLAorICAgICAgICAgICAgICgiX19rbXBfcmVtb3ZlX215X3Rhc2soZXhpdCAjMSk6IFQjJWQgTm8gdGFza3MgdG8gcmVtb3ZlOiAiCisgICAgICAgICAgICAgICJudGFza3M9JWQgaGVhZD0ldSB0YWlsPSV1XG4iLAorICAgICAgICAgICAgICBndGlkLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfbnRhc2tzLAorICAgICAgICAgICAgICB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfaGVhZCwgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX3RhaWwpKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soJnRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9sb2NrKTsKKworICBpZiAoVENSXzQodGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX250YXNrcykgPT0gMCkgeworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJnRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9sb2NrKTsKKyAgICBLQV9UUkFDRSgxMCwKKyAgICAgICAgICAgICAoIl9fa21wX3JlbW92ZV9teV90YXNrKGV4aXQgIzIpOiBUIyVkIE5vIHRhc2tzIHRvIHJlbW92ZTogIgorICAgICAgICAgICAgICAibnRhc2tzPSVkIGhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICAgICAgICAgZ3RpZCwgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX250YXNrcywKKyAgICAgICAgICAgICAgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX2hlYWQsIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV90YWlsKSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICB0YWlsID0gKHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV90YWlsIC0gMSkgJgorICAgICAgICAgVEFTS19ERVFVRV9NQVNLKHRocmVhZF9kYXRhLT50ZCk7IC8vIFdyYXAgaW5kZXguCisgIHRhc2tkYXRhID0gdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlW3RhaWxdOworCisgIGlmIChpc19jb25zdHJhaW5lZCAmJiAodGFza2RhdGEtPnRkX2ZsYWdzLnRpZWRuZXNzID09IFRBU0tfVElFRCkpIHsKKyAgICAvLyB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBjYW5kaWRhdGUgb2JleXMgdGFzayBzY2hlZHVsaW5nIGNvbnN0cmFpbnQ6CisgICAgLy8gb25seSBjaGlsZCBvZiBjdXJyZW50IHRhc2sgY2FuIGJlIHNjaGVkdWxlZAorICAgIGttcF90YXNrZGF0YV90ICpjdXJyZW50ID0gdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2s7CisgICAga21wX2ludDMyIGxldmVsID0gY3VycmVudC0+dGRfbGV2ZWw7CisgICAga21wX3Rhc2tkYXRhX3QgKnBhcmVudCA9IHRhc2tkYXRhLT50ZF9wYXJlbnQ7CisgICAgd2hpbGUgKHBhcmVudCAhPSBjdXJyZW50ICYmIHBhcmVudC0+dGRfbGV2ZWwgPiBsZXZlbCkgeworICAgICAgcGFyZW50ID0gcGFyZW50LT50ZF9wYXJlbnQ7IC8vIGNoZWNrIGdlbmVyYXRpb24gdXAgdG8gdGhlIGxldmVsIG9mIHRoZQorICAgICAgLy8gY3VycmVudCB0YXNrCisgICAgICBLTVBfREVCVUdfQVNTRVJUKHBhcmVudCAhPSBOVUxMKTsKKyAgICB9CisgICAgaWYgKHBhcmVudCAhPSBjdXJyZW50KSB7CisgICAgICAvLyBJZiB0aGUgdGFpbCB0YXNrIGlzIG5vdCBhIGNoaWxkLCB0aGVuIG5vIG90aGVyIGNoaWxkIGNhbiBhcHBlYXIgaW4gdGhlCisgICAgICAvLyBkZXF1ZS4KKyAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJnRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9sb2NrKTsKKyAgICAgIEtBX1RSQUNFKDEwLAorICAgICAgICAgICAgICAgKCJfX2ttcF9yZW1vdmVfbXlfdGFzayhleGl0ICMyKTogVCMlZCBObyB0YXNrcyB0byByZW1vdmU6ICIKKyAgICAgICAgICAgICAgICAibnRhc2tzPSVkIGhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICAgICAgICAgICBndGlkLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfbnRhc2tzLAorICAgICAgICAgICAgICAgIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9oZWFkLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfdGFpbCkpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CisKKyAgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX3RhaWwgPSB0YWlsOworICBUQ1dfNCh0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfbnRhc2tzLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfbnRhc2tzIC0gMSk7CisKKyAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jaygmdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX2xvY2spOworCisgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3JlbW92ZV9teV90YXNrKGV4aXQgIzIpOiBUIyVkIHRhc2sgJXAgcmVtb3ZlZDogIgorICAgICAgICAgICAgICAgICJudGFza3M9JWQgaGVhZD0ldSB0YWlsPSV1XG4iLAorICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfbnRhc2tzLAorICAgICAgICAgICAgICAgIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9oZWFkLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfdGFpbCkpOworCisgIHRhc2sgPSBLTVBfVEFTS0RBVEFfVE9fVEFTSyh0YXNrZGF0YSk7CisgIHJldHVybiB0YXNrOworfQorCisvLyBfX2ttcF9zdGVhbF90YXNrOiByZW1vdmUgYSB0YXNrIGZyb20gYW5vdGhlciB0aHJlYWQncyBkZXF1ZQorLy8gQXNzdW1lIHRoYXQgY2FsbGluZyB0aHJlYWQgaGFzIGFscmVhZHkgY2hlY2tlZCBleGlzdGVuY2Ugb2YKKy8vIHRhc2tfdGVhbSB0aHJlYWRfZGF0YSBiZWZvcmUgY2FsbGluZyB0aGlzIHJvdXRpbmUuCitzdGF0aWMga21wX3Rhc2tfdCAqX19rbXBfc3RlYWxfdGFzayhrbXBfaW5mb190ICp2aWN0aW0sIGttcF9pbnQzMiBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xhdGlsZSBrbXBfaW50MzIgKnVuZmluaXNoZWRfdGhyZWFkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqdGhyZWFkX2ZpbmlzaGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGlzX2NvbnN0cmFpbmVkKSB7CisgIGttcF90YXNrX3QgKnRhc2s7CisgIGttcF90YXNrZGF0YV90ICp0YXNrZGF0YTsKKyAga21wX3RocmVhZF9kYXRhX3QgKnZpY3RpbV90ZCwgKnRocmVhZHNfZGF0YTsKKyAga21wX2ludDMyIHZpY3RpbV90aWQ7CisKKyAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyk7CisKKyAgdGhyZWFkc19kYXRhID0gdGFza190ZWFtLT50dC50dF90aHJlYWRzX2RhdGE7CisgIEtNUF9ERUJVR19BU1NFUlQodGhyZWFkc19kYXRhICE9IE5VTEwpOyAvLyBDYWxsZXIgc2hvdWxkIGNoZWNrIHRoaXMgY29uZGl0aW9uCisKKyAgdmljdGltX3RpZCA9IHZpY3RpbS0+dGgudGhfaW5mby5kcy5kc190aWQ7CisgIHZpY3RpbV90ZCA9ICZ0aHJlYWRzX2RhdGFbdmljdGltX3RpZF07CisKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBfc3RlYWxfdGFzayhlbnRlcik6IFQjJWQgdHJ5IHRvIHN0ZWFsIGZyb20gVCMlZDogIgorICAgICAgICAgICAgICAgICJ0YXNrX3RlYW09JXAgbnRhc2tzPSVkICIKKyAgICAgICAgICAgICAgICAiaGVhZD0ldSB0YWlsPSV1XG4iLAorICAgICAgICAgICAgICAgIGd0aWQsIF9fa21wX2d0aWRfZnJvbV90aHJlYWQodmljdGltKSwgdGFza190ZWFtLAorICAgICAgICAgICAgICAgIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfbnRhc2tzLCB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX2hlYWQsCisgICAgICAgICAgICAgICAgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV90YWlsKSk7CisKKyAgaWYgKChUQ1JfNCh2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX250YXNrcykgPT0KKyAgICAgICAwKSB8fCAvLyBDYWxsZXIgc2hvdWxkIG5vdCBjaGVjayB0aGlzIGNvbmRpdGlvbgorICAgICAgKFRDUl9QVFIodmljdGltLT50aC50aF90YXNrX3RlYW0pICE9CisgICAgICAgdGFza190ZWFtKSkgLy8gR0VIOiB3aHkgd291bGQgdGhpcyBoYXBwZW4/CisgIHsKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9zdGVhbF90YXNrKGV4aXQgIzEpOiBUIyVkIGNvdWxkIG5vdCBzdGVhbCBmcm9tIFQjJWQ6ICIKKyAgICAgICAgICAgICAgICAgICJ0YXNrX3RlYW09JXAgIgorICAgICAgICAgICAgICAgICAgIm50YXNrcz0lZCBoZWFkPSV1IHRhaWw9JXVcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHZpY3RpbSksIHRhc2tfdGVhbSwKKyAgICAgICAgICAgICAgICAgIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfbnRhc2tzLCB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX2hlYWQsCisgICAgICAgICAgICAgICAgICB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX3RhaWwpKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soJnZpY3RpbV90ZC0+dGQudGRfZGVxdWVfbG9jayk7CisKKyAgLy8gQ2hlY2sgYWdhaW4gYWZ0ZXIgd2UgYWNxdWlyZSB0aGUgbG9jaworICBpZiAoKFRDUl80KHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfbnRhc2tzKSA9PSAwKSB8fAorICAgICAgKFRDUl9QVFIodmljdGltLT50aC50aF90YXNrX3RlYW0pICE9CisgICAgICAgdGFza190ZWFtKSkgLy8gR0VIOiB3aHkgd291bGQgdGhpcyBoYXBwZW4/CisgIHsKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCZ2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX2xvY2spOworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3N0ZWFsX3Rhc2soZXhpdCAjMik6IFQjJWQgY291bGQgbm90IHN0ZWFsIGZyb20gVCMlZDogIgorICAgICAgICAgICAgICAgICAgInRhc2tfdGVhbT0lcCAiCisgICAgICAgICAgICAgICAgICAibnRhc2tzPSVkIGhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIF9fa21wX2d0aWRfZnJvbV90aHJlYWQodmljdGltKSwgdGFza190ZWFtLAorICAgICAgICAgICAgICAgICAgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV9udGFza3MsIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfaGVhZCwKKyAgICAgICAgICAgICAgICAgIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfdGFpbCkpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgS01QX0RFQlVHX0FTU0VSVCh2aWN0aW1fdGQtPnRkLnRkX2RlcXVlICE9IE5VTEwpOworCisgIHRhc2tkYXRhID0gdmljdGltX3RkLT50ZC50ZF9kZXF1ZVt2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX2hlYWRdOworICBpZiAoaXNfY29uc3RyYWluZWQpIHsKKyAgICAvLyB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBjYW5kaWRhdGUgb2JleXMgdGFzayBzY2hlZHVsaW5nIGNvbnN0cmFpbnQ6CisgICAgLy8gb25seSBkZXNjZW5kYW50IG9mIGN1cnJlbnQgdGFzayBjYW4gYmUgc2NoZWR1bGVkCisgICAga21wX3Rhc2tkYXRhX3QgKmN1cnJlbnQgPSBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF9jdXJyZW50X3Rhc2s7CisgICAga21wX2ludDMyIGxldmVsID0gY3VycmVudC0+dGRfbGV2ZWw7CisgICAga21wX3Rhc2tkYXRhX3QgKnBhcmVudCA9IHRhc2tkYXRhLT50ZF9wYXJlbnQ7CisgICAgd2hpbGUgKHBhcmVudCAhPSBjdXJyZW50ICYmIHBhcmVudC0+dGRfbGV2ZWwgPiBsZXZlbCkgeworICAgICAgcGFyZW50ID0gcGFyZW50LT50ZF9wYXJlbnQ7IC8vIGNoZWNrIGdlbmVyYXRpb24gdXAgdG8gdGhlIGxldmVsIG9mIHRoZQorICAgICAgLy8gY3VycmVudCB0YXNrCisgICAgICBLTVBfREVCVUdfQVNTRVJUKHBhcmVudCAhPSBOVUxMKTsKKyAgICB9CisgICAgaWYgKHBhcmVudCAhPSBjdXJyZW50KSB7CisgICAgICAvLyBJZiB0aGUgaGVhZCB0YXNrIGlzIG5vdCBhIGRlc2NlbmRhbnQgb2YgdGhlIGN1cnJlbnQgdGFzayB0aGVuIGRvIG5vdAorICAgICAgLy8gc3RlYWwgaXQuIE5vIG90aGVyIHRhc2sgaW4gdmljdGltJ3MgZGVxdWUgY2FuIGJlIGEgZGVzY2VuZGFudCBvZiB0aGUKKyAgICAgIC8vIGN1cnJlbnQgdGFzay4KKyAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJnZpY3RpbV90ZC0+dGQudGRfZGVxdWVfbG9jayk7CisgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9zdGVhbF90YXNrKGV4aXQgIzIpOiBUIyVkIGNvdWxkIG5vdCBzdGVhbCBmcm9tICIKKyAgICAgICAgICAgICAgICAgICAgIlQjJWQ6IHRhc2tfdGVhbT0lcCAiCisgICAgICAgICAgICAgICAgICAgICJudGFza3M9JWQgaGVhZD0ldSB0YWlsPSV1XG4iLAorICAgICAgICAgICAgICAgICAgICBndGlkLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRocmVhZHNfZGF0YVt2aWN0aW1fdGlkXS50ZC50ZF90aHIpLAorICAgICAgICAgICAgICAgICAgICB0YXNrX3RlYW0sIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfbnRhc2tzLAorICAgICAgICAgICAgICAgICAgICB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX2hlYWQsIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfdGFpbCkpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CisgIC8vIEJ1bXAgaGVhZCBwb2ludGVyIGFuZCBXcmFwLgorICB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX2hlYWQgPQorICAgICAgKHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfaGVhZCArIDEpICYgVEFTS19ERVFVRV9NQVNLKHZpY3RpbV90ZC0+dGQpOworICBpZiAoKnRocmVhZF9maW5pc2hlZCkgeworICAgIC8vIFdlIG5lZWQgdG8gdW4tbWFyayB0aGlzIHZpY3RpbSBhcyBhIGZpbmlzaGVkIHZpY3RpbS4gIFRoaXMgbXVzdCBiZSBkb25lCisgICAgLy8gYmVmb3JlIHJlbGVhc2luZyB0aGUgbG9jaywgb3IgZWxzZSBvdGhlciB0aHJlYWRzIChzdGFydGluZyB3aXRoIHRoZQorICAgIC8vIG1hc3RlciB2aWN0aW0pIG1pZ2h0IGJlIHByZW1hdHVyZWx5IHJlbGVhc2VkIGZyb20gdGhlIGJhcnJpZXIhISEKKyAgICBrbXBfaW50MzIgY291bnQ7CisKKyAgICBjb3VudCA9IEtNUF9URVNUX1RIRU5fSU5DMzIodW5maW5pc2hlZF90aHJlYWRzKTsKKworICAgIEtBX1RSQUNFKAorICAgICAgICAyMCwKKyAgICAgICAgKCJfX2ttcF9zdGVhbF90YXNrOiBUIyVkIGluYyB1bmZpbmlzaGVkX3RocmVhZHMgdG8gJWQ6IHRhc2tfdGVhbT0lcFxuIiwKKyAgICAgICAgIGd0aWQsIGNvdW50ICsgMSwgdGFza190ZWFtKSk7CisKKyAgICAqdGhyZWFkX2ZpbmlzaGVkID0gRkFMU0U7CisgIH0KKyAgVENXXzQodmljdGltX3RkLT50ZC50ZF9kZXF1ZV9udGFza3MsCisgICAgICAgIFRDUl80KHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfbnRhc2tzKSAtIDEpOworCisgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJnZpY3RpbV90ZC0+dGQudGRfZGVxdWVfbG9jayk7CisKKyAgS01QX0NPVU5UX0JMT0NLKFRBU0tfc3RvbGVuKTsKKyAgS0FfVFJBQ0UoCisgICAgICAxMCwKKyAgICAgICgiX19rbXBfc3RlYWxfdGFzayhleGl0ICMzKTogVCMlZCBzdG9sZSB0YXNrICVwIGZyb20gVCMlZDogdGFza190ZWFtPSVwICIKKyAgICAgICAibnRhc2tzPSVkIGhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICBndGlkLCB0YXNrZGF0YSwgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh2aWN0aW0pLCB0YXNrX3RlYW0sCisgICAgICAgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV9udGFza3MsIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfaGVhZCwKKyAgICAgICB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX3RhaWwpKTsKKworICB0YXNrID0gS01QX1RBU0tEQVRBX1RPX1RBU0sodGFza2RhdGEpOworICByZXR1cm4gdGFzazsKK30KKworLy8gX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZTogQ2hvb3NlIGFuZCBleGVjdXRlIHRhc2tzIHVudGlsIGVpdGhlciB0aGUKKy8vIGNvbmRpdGlvbiBpcyBzdGF0aXNmaWVkIChyZXR1cm4gdHJ1ZSkgb3IgdGhlcmUgYXJlIG5vbmUgbGVmdCAocmV0dXJuIGZhbHNlKS4KKy8vCisvLyBmaW5hbF9zcGluIGlzIFRSVUUgaWYgdGhpcyBpcyB0aGUgc3BpbiBhdCB0aGUgcmVsZWFzZSBiYXJyaWVyLgorLy8gdGhyZWFkX2ZpbmlzaGVkIGluZGljYXRlcyB3aGV0aGVyIHRoZSB0aHJlYWQgaXMgZmluaXNoZWQgZXhlY3V0aW5nIGFsbAorLy8gdGhlIHRhc2tzIGl0IGhhcyBvbiBpdHMgZGVxdWUsIGFuZCBpcyBhdCB0aGUgcmVsZWFzZSBiYXJyaWVyLgorLy8gc3Bpbm5lciBpcyB0aGUgbG9jYXRpb24gb24gd2hpY2ggdG8gc3Bpbi4KKy8vIHNwaW5uZXIgPT0gTlVMTCBtZWFucyBvbmx5IGV4ZWN1dGUgYSBzaW5nbGUgdGFzayBhbmQgcmV0dXJuLgorLy8gY2hlY2tlciBpcyB0aGUgdmFsdWUgdG8gY2hlY2sgdG8gdGVybWluYXRlIHRoZSBzcGluLgordGVtcGxhdGUgPGNsYXNzIEM+CitzdGF0aWMgaW5saW5lIGludCBfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlKAorICAgIGttcF9pbmZvX3QgKnRocmVhZCwga21wX2ludDMyIGd0aWQsIEMgKmZsYWcsIGludCBmaW5hbF9zcGluLAorICAgIGludCAqdGhyZWFkX2ZpbmlzaGVkIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKml0dF9zeW5jX29iaiksCisgICAga21wX2ludDMyIGlzX2NvbnN0cmFpbmVkKSB7CisgIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtID0gdGhyZWFkLT50aC50aF90YXNrX3RlYW07CisgIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRzX2RhdGE7CisgIGttcF90YXNrX3QgKnRhc2s7CisgIGttcF9pbmZvX3QgKm90aGVyX3RocmVhZDsKKyAga21wX3Rhc2tkYXRhX3QgKmN1cnJlbnRfdGFzayA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrOworICB2b2xhdGlsZSBrbXBfaW50MzIgKnVuZmluaXNoZWRfdGhyZWFkczsKKyAga21wX2ludDMyIG50aHJlYWRzLCB2aWN0aW0gPSAtMiwgdXNlX293bl90YXNrcyA9IDEsIG5ld192aWN0aW0gPSAwLAorICAgICAgICAgICAgICAgICAgICAgIHRpZCA9IHRocmVhZC0+dGgudGhfaW5mby5kcy5kc190aWQ7CisKKyAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyk7CisgIEtNUF9ERUJVR19BU1NFUlQodGhyZWFkID09IF9fa21wX3RocmVhZHNbZ3RpZF0pOworCisgIGlmICh0YXNrX3RlYW0gPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgS0FfVFJBQ0UoMTUsICgiX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZShlbnRlcik6IFQjJWQgZmluYWxfc3Bpbj0lZCAiCisgICAgICAgICAgICAgICAgIip0aHJlYWRfZmluaXNoZWQ9JWRcbiIsCisgICAgICAgICAgICAgICAgZ3RpZCwgZmluYWxfc3BpbiwgKnRocmVhZF9maW5pc2hlZCkpOworCisgIHRocmVhZC0+dGgudGhfcmVhcF9zdGF0ZSA9IEtNUF9OT1RfU0FGRV9UT19SRUFQOworICB0aHJlYWRzX2RhdGEgPSAoa21wX3RocmVhZF9kYXRhX3QgKilUQ1JfUFRSKHRhc2tfdGVhbS0+dHQudHRfdGhyZWFkc19kYXRhKTsKKyAgS01QX0RFQlVHX0FTU0VSVCh0aHJlYWRzX2RhdGEgIT0gTlVMTCk7CisKKyAgbnRocmVhZHMgPSB0YXNrX3RlYW0tPnR0LnR0X25wcm9jOworICB1bmZpbmlzaGVkX3RocmVhZHMgPSAmKHRhc2tfdGVhbS0+dHQudHRfdW5maW5pc2hlZF90aHJlYWRzKTsKKyNpZiBPTVBfNDVfRU5BQkxFRAorICBLTVBfREVCVUdfQVNTRVJUKG50aHJlYWRzID4gMSB8fCB0YXNrX3RlYW0tPnR0LnR0X2ZvdW5kX3Byb3h5X3Rhc2tzKTsKKyNlbHNlCisgIEtNUF9ERUJVR19BU1NFUlQobnRocmVhZHMgPiAxKTsKKyNlbmRpZgorICBLTVBfREVCVUdfQVNTRVJUKFRDUl80KCp1bmZpbmlzaGVkX3RocmVhZHMpID49IDApOworCisgIHdoaWxlICgxKSB7IC8vIE91dGVyIGxvb3Aga2VlcHMgdHJ5aW5nIHRvIGZpbmQgdGFza3MgaW4gY2FzZSBvZiBzaW5nbGUgdGhyZWFkCisgICAgLy8gZ2V0dGluZyB0YXNrcyBmcm9tIHRhcmdldCBjb25zdHJ1Y3RzCisgICAgd2hpbGUgKDEpIHsgLy8gSW5uZXIgbG9vcCB0byBmaW5kIGEgdGFzayBhbmQgZXhlY3V0ZSBpdAorICAgICAgdGFzayA9IE5VTEw7CisgICAgICBpZiAodXNlX293bl90YXNrcykgeyAvLyBjaGVjayBvbiBvd24gcXVldWUgZmlyc3QKKyAgICAgICAgdGFzayA9IF9fa21wX3JlbW92ZV9teV90YXNrKHRocmVhZCwgZ3RpZCwgdGFza190ZWFtLCBpc19jb25zdHJhaW5lZCk7CisgICAgICB9CisgICAgICBpZiAoKHRhc2sgPT0gTlVMTCkgJiYgKG50aHJlYWRzID4gMSkpIHsgLy8gU3RlYWwgYSB0YXNrCisgICAgICAgIGludCBhc2xlZXAgPSAxOworICAgICAgICB1c2Vfb3duX3Rhc2tzID0gMDsKKyAgICAgICAgLy8gVHJ5IHRvIHN0ZWFsIGZyb20gdGhlIGxhc3QgcGxhY2UgSSBzdG9sZSBmcm9tIHN1Y2Nlc3NmdWxseS4KKyAgICAgICAgaWYgKHZpY3RpbSA9PSAtMikgeyAvLyBoYXZlbid0IHN0b2xlbiBhbnl0aGluZyB5ZXQKKyAgICAgICAgICB2aWN0aW0gPSB0aHJlYWRzX2RhdGFbdGlkXS50ZC50ZF9kZXF1ZV9sYXN0X3N0b2xlbjsKKyAgICAgICAgICBpZiAodmljdGltICE9CisgICAgICAgICAgICAgIC0xKSAvLyBpZiB3ZSBoYXZlIGEgbGFzdCBzdG9sZW4gZnJvbSB2aWN0aW0sIGdldCB0aGUgdGhyZWFkCisgICAgICAgICAgICBvdGhlcl90aHJlYWQgPSB0aHJlYWRzX2RhdGFbdmljdGltXS50ZC50ZF90aHI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpY3RpbSAhPSAtMSkgeyAvLyBmb3VuZCBsYXN0IHZpY3RpbQorICAgICAgICAgIGFzbGVlcCA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAoIW5ld192aWN0aW0pIHsgLy8gbm8gcmVjZW50IHN0ZWFscyBhbmQgd2UgaGF2ZW4ndCBhbHJlYWR5CisgICAgICAgICAgLy8gdXNlZCBhIG5ldyB2aWN0aW07IHNlbGVjdCBhIHJhbmRvbSB0aHJlYWQKKyAgICAgICAgICBkbyB7IC8vIEZpbmQgYSBkaWZmZXJlbnQgdGhyZWFkIHRvIHN0ZWFsIHdvcmsgZnJvbS4KKyAgICAgICAgICAgIC8vIFBpY2sgYSByYW5kb20gdGhyZWFkLiBJbml0aWFsIHBsYW4gd2FzIHRvIGN5Y2xlIHRocm91Z2ggYWxsIHRoZQorICAgICAgICAgICAgLy8gdGhyZWFkcywgYW5kIG9ubHkgcmV0dXJuIGlmIHdlIHRyaWVkIHRvIHN0ZWFsIGZyb20gZXZlcnkgdGhyZWFkLAorICAgICAgICAgICAgLy8gYW5kIGZhaWxlZC4gIEFyY2ggc2F5cyB0aGF0J3Mgbm90IHN1Y2ggYSBncmVhdCBpZGVhLgorICAgICAgICAgICAgdmljdGltID0gX19rbXBfZ2V0X3JhbmRvbSh0aHJlYWQpICUgKG50aHJlYWRzIC0gMSk7CisgICAgICAgICAgICBpZiAodmljdGltID49IHRpZCkgeworICAgICAgICAgICAgICArK3ZpY3RpbTsgLy8gQWRqdXN0cyByYW5kb20gZGlzdHJpYnV0aW9uIHRvIGV4Y2x1ZGUgc2VsZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRm91bmQgYSBwb3RlbnRpYWwgdmljdGltCisgICAgICAgICAgICBvdGhlcl90aHJlYWQgPSB0aHJlYWRzX2RhdGFbdmljdGltXS50ZC50ZF90aHI7CisgICAgICAgICAgICAvLyBUaGVyZSBpcyBhIHNsaWdodCBjaGFuY2UgdGhhdCBfX2ttcF9lbmFibGVfdGFza2luZygpIGRpZCBub3Qgd2FrZQorICAgICAgICAgICAgLy8gdXAgYWxsIHRocmVhZHMgd2FpdGluZyBhdCB0aGUgYmFycmllci4gIElmIHZpY3RpbSBpcyBzbGVlcGluZywKKyAgICAgICAgICAgIC8vIHRoZW4gd2FrZSBpdCB1cC4gU2luY2Ugd2Ugd2VyZSBnb2luZyB0byBwYXkgdGhlIGNhY2hlIG1pc3MKKyAgICAgICAgICAgIC8vIHBlbmFsdHkgZm9yIHJlZmVyZW5jaW5nIGFub3RoZXIgdGhyZWFkJ3Mga21wX2luZm9fdCBzdHJ1Y3QKKyAgICAgICAgICAgIC8vIGFueXdheSwKKyAgICAgICAgICAgIC8vIHRoZSBjaGVjayBzaG91bGRuJ3QgY29zdCB0b28gbXVjaCBwZXJmb3JtYW5jZSBhdCB0aGlzIHBvaW50LiBJbgorICAgICAgICAgICAgLy8gZXh0cmEgYmFycmllciBtb2RlLCB0YXNrcyBkbyBub3Qgc2xlZXAgYXQgdGhlIHNlcGFyYXRlIHRhc2tpbmcKKyAgICAgICAgICAgIC8vIGJhcnJpZXIsIHNvIHRoaXMgaXNuJ3QgYSBwcm9ibGVtLgorICAgICAgICAgICAgYXNsZWVwID0gMDsKKyAgICAgICAgICAgIGlmICgoX19rbXBfdGFza2luZ19tb2RlID09IHRza21fdGFza190ZWFtcykgJiYKKyAgICAgICAgICAgICAgICAoX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUpICYmCisgICAgICAgICAgICAgICAgKFRDUl9QVFIoQ0NBU1Qodm9pZCAqLCBvdGhlcl90aHJlYWQtPnRoLnRoX3NsZWVwX2xvYykpICE9CisgICAgICAgICAgICAgICAgIE5VTEwpKSB7CisgICAgICAgICAgICAgIGFzbGVlcCA9IDE7CisgICAgICAgICAgICAgIF9fa21wX251bGxfcmVzdW1lX3dyYXBwZXIoX19rbXBfZ3RpZF9mcm9tX3RocmVhZChvdGhlcl90aHJlYWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX3RocmVhZC0+dGgudGhfc2xlZXBfbG9jKTsKKyAgICAgICAgICAgICAgLy8gQSBzbGVlcGluZyB0aHJlYWQgc2hvdWxkIG5vdCBoYXZlIGFueSB0YXNrcyBvbiBpdCdzIHF1ZXVlLgorICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBhIHNsaWdodCBwb3NzaWJpbGl0eSB0aGF0IGl0IHJlc3VtZXMsIHN0ZWFscyBhIHRhc2sKKyAgICAgICAgICAgICAgLy8gZnJvbSBhbm90aGVyIHRocmVhZCwgd2hpY2ggc3Bhd25zIG1vcmUgdGFza3MsIGFsbCBpbiB0aGUgdGltZQorICAgICAgICAgICAgICAvLyB0aGF0IGl0IHRha2VzIHRoaXMgdGhyZWFkIHRvIGNoZWNrID0+IGRvbid0IHdyaXRlIGFuIGFzc2VydGlvbgorICAgICAgICAgICAgICAvLyB0aGF0IHRoZSB2aWN0aW0ncyBxdWV1ZSBpcyBlbXB0eS4gIFRyeSBzdGVhbGluZyBmcm9tIGEKKyAgICAgICAgICAgICAgLy8gZGlmZmVyZW50IHRocmVhZC4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IHdoaWxlIChhc2xlZXApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFhc2xlZXApIHsKKyAgICAgICAgICAvLyBXZSBoYXZlIGEgdmljdGltIHRvIHRyeSB0byBzdGVhbCBmcm9tCisgICAgICAgICAgdGFzayA9IF9fa21wX3N0ZWFsX3Rhc2sob3RoZXJfdGhyZWFkLCBndGlkLCB0YXNrX3RlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5maW5pc2hlZF90aHJlYWRzLCB0aHJlYWRfZmluaXNoZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfY29uc3RyYWluZWQpOworICAgICAgICB9CisgICAgICAgIGlmICh0YXNrICE9IE5VTEwpIHsgLy8gc2V0IGxhc3Qgc3RvbGVuIHRvIHZpY3RpbQorICAgICAgICAgIGlmICh0aHJlYWRzX2RhdGFbdGlkXS50ZC50ZF9kZXF1ZV9sYXN0X3N0b2xlbiAhPSB2aWN0aW0pIHsKKyAgICAgICAgICAgIHRocmVhZHNfZGF0YVt0aWRdLnRkLnRkX2RlcXVlX2xhc3Rfc3RvbGVuID0gdmljdGltOworICAgICAgICAgICAgLy8gVGhlIHByZS1yZWZhY3RvcmVkIGNvZGUgZGlkIG5vdCB0cnkgbW9yZSB0aGFuIDEgc3VjY2Vzc2Z1bCBuZXcKKyAgICAgICAgICAgIC8vIHZpY2l0bSwgdW5sZXNzIHRoZSBsYXN0IG9uZSBnZW5lcmF0ZWQgbW9yZSBsb2NhbCB0YXNrczsKKyAgICAgICAgICAgIC8vIG5ld192aWN0aW0ga2VlcHMgdHJhY2sgb2YgdGhpcworICAgICAgICAgICAgbmV3X3ZpY3RpbSA9IDE7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAvLyBObyB0YXNrcyBmb3VuZDsgdW5zZXQgbGFzdF9zdG9sZW4KKyAgICAgICAgICBLTVBfQ0hFQ0tfVVBEQVRFKHRocmVhZHNfZGF0YVt0aWRdLnRkLnRkX2RlcXVlX2xhc3Rfc3RvbGVuLCAtMSk7CisgICAgICAgICAgdmljdGltID0gLTI7IC8vIG5vIHN1Y2Nlc3NmdWwgdmljdGltIGZvdW5kCisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHRhc2sgPT0gTlVMTCkgLy8gYnJlYWsgb3V0IG9mIHRhc2tpbmcgbG9vcAorICAgICAgICBicmVhazsKKworLy8gRm91bmQgYSB0YXNrOyBleGVjdXRlIGl0CisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgICAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKSB7CisgICAgICAgIGlmIChpdHRfc3luY19vYmogPT0gTlVMTCkgeyAvLyB3ZSBhcmUgYXQgZm9yayBiYXJyaWVyIHdoZXJlIHdlIGNvdWxkIG5vdAorICAgICAgICAgIC8vIGdldCB0aGUgb2JqZWN0IHJlbGlhYmx5CisgICAgICAgICAgaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KGd0aWQsIGJzX2Zvcmtqb2luX2JhcnJpZXIpOworICAgICAgICB9CisgICAgICAgIF9fa21wX2l0dF90YXNrX3N0YXJ0aW5nKGl0dF9zeW5jX29iaik7CisgICAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWSAqLworICAgICAgX19rbXBfaW52b2tlX3Rhc2soZ3RpZCwgdGFzaywgY3VycmVudF90YXNrKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICBpZiAoaXR0X3N5bmNfb2JqICE9IE5VTEwpCisgICAgICAgIF9fa21wX2l0dF90YXNrX2ZpbmlzaGVkKGl0dF9zeW5jX29iaik7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgLy8gSWYgdGhpcyB0aHJlYWQgaXMgb25seSBwYXJ0d2F5IHRocm91Z2ggdGhlIGJhcnJpZXIgYW5kIHRoZSBjb25kaXRpb24gaXMKKyAgICAgIC8vIG1ldCwgdGhlbiByZXR1cm4gbm93LCBzbyB0aGF0IHRoZSBiYXJyaWVyIGdhdGhlci9yZWxlYXNlIHBhdHRlcm4gY2FuCisgICAgICAvLyBwcm9jZWVkLiBJZiB0aGlzIHRocmVhZCBpcyBpbiB0aGUgbGFzdCBzcGluIGxvb3AgaW4gdGhlIGJhcnJpZXIsCisgICAgICAvLyB3YWl0aW5nIHRvIGJlIHJlbGVhc2VkLCB3ZSBrbm93IHRoYXQgdGhlIHRlcm1pbmF0aW9uIGNvbmRpdGlvbiB3aWxsIG5vdAorICAgICAgLy8gYmUgc2F0aXNpZmllZCwgc28gZG9uJ3Qgd2FzdGUgYW55IGN5Y2xlcyBjaGVja2luZyBpdC4KKyAgICAgIGlmIChmbGFnID09IE5VTEwgfHwgKCFmaW5hbF9zcGluICYmIGZsYWctPmRvbmVfY2hlY2soKSkpIHsKKyAgICAgICAgS0FfVFJBQ0UoCisgICAgICAgICAgICAxNSwKKyAgICAgICAgICAgICgiX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZTogVCMlZCBzcGluIGNvbmRpdGlvbiBzYXRpc2ZpZWRcbiIsCisgICAgICAgICAgICAgZ3RpZCkpOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KKyAgICAgIGlmICh0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbSA9PSBOVUxMKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgLy8gWWllbGQgYmVmb3JlIGV4ZWN1dGluZyBuZXh0IHRhc2sKKyAgICAgIEtNUF9ZSUVMRChfX2ttcF9saWJyYXJ5ID09IGxpYnJhcnlfdGhyb3VnaHB1dCk7CisgICAgICAvLyBJZiBleGVjdXRpb24gb2YgYSBzdG9sZW4gdGFzayByZXN1bHRzIGluIG1vcmUgdGFza3MgYmVpbmcgcGxhY2VkIG9uIG91cgorICAgICAgLy8gcnVuIHF1ZXVlLCByZXNldCB1c2Vfb3duX3Rhc2tzCisgICAgICBpZiAoIXVzZV9vd25fdGFza3MgJiYgVENSXzQodGhyZWFkc19kYXRhW3RpZF0udGQudGRfZGVxdWVfbnRhc2tzKSAhPSAwKSB7CisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2V4ZWN1dGVfdGFza3NfdGVtcGxhdGU6IFQjJWQgc3RvbGVuIHRhc2sgc3Bhd25lZCAiCisgICAgICAgICAgICAgICAgICAgICAgIm90aGVyIHRhc2tzLCByZXN0YXJ0XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQpKTsKKyAgICAgICAgdXNlX293bl90YXNrcyA9IDE7CisgICAgICAgIG5ld192aWN0aW0gPSAwOworICAgICAgfQorICAgIH0KKworLy8gVGhlIHRhc2sgc291cmNlIGhhcyBiZWVuIGV4aGF1c3RlZC4gSWYgaW4gZmluYWwgc3BpbiBsb29wIG9mIGJhcnJpZXIsIGNoZWNrCisvLyBpZiB0ZXJtaW5hdGlvbiBjb25kaXRpb24gaXMgc2F0aXNmaWVkLgorI2lmIE9NUF80NV9FTkFCTEVECisgICAgLy8gVGhlIHdvcmsgcXVldWUgbWF5IGJlIGVtcHR5IGJ1dCB0aGVyZSBtaWdodCBiZSBwcm94eSB0YXNrcyBzdGlsbAorICAgIC8vIGV4ZWN1dGluZworICAgIGlmIChmaW5hbF9zcGluICYmIFRDUl80KGN1cnJlbnRfdGFzay0+dGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcykgPT0gMCkKKyNlbHNlCisgICAgaWYgKGZpbmFsX3NwaW4pCisjZW5kaWYKKyAgICB7CisgICAgICAvLyBGaXJzdCwgZGVjcmVtZW50IHRoZSAjdW5maW5pc2hlZCB0aHJlYWRzLCBpZiB0aGF0IGhhcyBub3QgYWxyZWFkeSBiZWVuCisgICAgICAvLyBkb25lLiAgVGhpcyBkZWNyZW1lbnQgbWlnaHQgYmUgdG8gdGhlIHNwaW4gbG9jYXRpb24sIGFuZCByZXN1bHQgaW4gdGhlCisgICAgICAvLyB0ZXJtaW5hdGlvbiBjb25kaXRpb24gYmVpbmcgc2F0aXNmaWVkLgorICAgICAgaWYgKCEqdGhyZWFkX2ZpbmlzaGVkKSB7CisgICAgICAgIGttcF9pbnQzMiBjb3VudDsKKworICAgICAgICBjb3VudCA9IEtNUF9URVNUX1RIRU5fREVDMzIodW5maW5pc2hlZF90aHJlYWRzKSAtIDE7CisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2V4ZWN1dGVfdGFza3NfdGVtcGxhdGU6IFQjJWQgZGVjICIKKyAgICAgICAgICAgICAgICAgICAgICAidW5maW5pc2hlZF90aHJlYWRzIHRvICVkIHRhc2tfdGVhbT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCBjb3VudCwgdGFza190ZWFtKSk7CisgICAgICAgICp0aHJlYWRfZmluaXNoZWQgPSBUUlVFOworICAgICAgfQorCisgICAgICAvLyBJdCBpcyBub3cgdW5zYWZlIHRvIHJlZmVyZW5jZSB0aHJlYWQtPnRoLnRoX3RlYW0gISEhCisgICAgICAvLyBEZWNyZW1lbnRpbmcgdGFza190ZWFtLT50dC50dF91bmZpbmlzaGVkX3RocmVhZHMgY2FuIGFsbG93IHRoZSBtYXN0ZXIKKyAgICAgIC8vIHRocmVhZCB0byBwYXNzIHRocm91Z2ggdGhlIGJhcnJpZXIsIHdoZXJlIGl0IG1pZ2h0IHJlc2V0IGVhY2ggdGhyZWFkJ3MKKyAgICAgIC8vIHRoLnRoX3RlYW0gZmllbGQgZm9yIHRoZSBuZXh0IHBhcmFsbGVsIHJlZ2lvbi4gSWYgd2UgY2FuIHN0ZWFsIG1vcmUKKyAgICAgIC8vIHdvcmssIHdlIGtub3cgdGhhdCB0aGlzIGhhcyBub3QgaGFwcGVuZWQgeWV0LgorICAgICAgaWYgKGZsYWcgIT0gTlVMTCAmJiBmbGFnLT5kb25lX2NoZWNrKCkpIHsKKyAgICAgICAgS0FfVFJBQ0UoCisgICAgICAgICAgICAxNSwKKyAgICAgICAgICAgICgiX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZTogVCMlZCBzcGluIGNvbmRpdGlvbiBzYXRpc2ZpZWRcbiIsCisgICAgICAgICAgICAgZ3RpZCkpOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB0aGlzIHRocmVhZCdzIHRhc2sgdGVhbSBpcyBOVUxMLCBtYXN0ZXIgaGFzIHJlY29nbml6ZWQgdGhhdCB0aGVyZSBhcmUKKyAgICAvLyBubyBtb3JlIHRhc2tzOyBiYWlsIG91dAorICAgIGlmICh0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbSA9PSBOVUxMKSB7CisgICAgICBLQV9UUkFDRSgxNSwKKyAgICAgICAgICAgICAgICgiX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZTogVCMlZCBubyBtb3JlIHRhc2tzXG4iLCBndGlkKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICAvLyBXZSBjb3VsZCBiZSBnZXR0aW5nIHRhc2tzIGZyb20gdGFyZ2V0IGNvbnN0cnVjdHM7IGlmIHRoaXMgaXMgdGhlIG9ubHkKKyAgICAvLyB0aHJlYWQsIGtlZXAgdHJ5aW5nIHRvIGV4ZWN1dGUgdGFza3MgZnJvbSBvd24gcXVldWUKKyAgICBpZiAobnRocmVhZHMgPT0gMSkKKyAgICAgIHVzZV9vd25fdGFza3MgPSAxOworICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgIEtBX1RSQUNFKDE1LAorICAgICAgICAgICAgICAgKCJfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlOiBUIyVkIGNhbid0IGZpbmQgd29ya1xuIiwgZ3RpZCkpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfQorfQorCitpbnQgX19rbXBfZXhlY3V0ZV90YXNrc18zMigKKyAgICBrbXBfaW5mb190ICp0aHJlYWQsIGttcF9pbnQzMiBndGlkLCBrbXBfZmxhZ18zMiAqZmxhZywgaW50IGZpbmFsX3NwaW4sCisgICAgaW50ICp0aHJlYWRfZmluaXNoZWQgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqaXR0X3N5bmNfb2JqKSwKKyAgICBrbXBfaW50MzIgaXNfY29uc3RyYWluZWQpIHsKKyAgcmV0dXJuIF9fa21wX2V4ZWN1dGVfdGFza3NfdGVtcGxhdGUoCisgICAgICB0aHJlYWQsIGd0aWQsIGZsYWcsIGZpbmFsX3NwaW4sCisgICAgICB0aHJlYWRfZmluaXNoZWQgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSwgaXNfY29uc3RyYWluZWQpOworfQorCitpbnQgX19rbXBfZXhlY3V0ZV90YXNrc182NCgKKyAgICBrbXBfaW5mb190ICp0aHJlYWQsIGttcF9pbnQzMiBndGlkLCBrbXBfZmxhZ182NCAqZmxhZywgaW50IGZpbmFsX3NwaW4sCisgICAgaW50ICp0aHJlYWRfZmluaXNoZWQgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqaXR0X3N5bmNfb2JqKSwKKyAgICBrbXBfaW50MzIgaXNfY29uc3RyYWluZWQpIHsKKyAgcmV0dXJuIF9fa21wX2V4ZWN1dGVfdGFza3NfdGVtcGxhdGUoCisgICAgICB0aHJlYWQsIGd0aWQsIGZsYWcsIGZpbmFsX3NwaW4sCisgICAgICB0aHJlYWRfZmluaXNoZWQgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSwgaXNfY29uc3RyYWluZWQpOworfQorCitpbnQgX19rbXBfZXhlY3V0ZV90YXNrc19vbmNvcmUoCisgICAga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfaW50MzIgZ3RpZCwga21wX2ZsYWdfb25jb3JlICpmbGFnLCBpbnQgZmluYWxfc3BpbiwKKyAgICBpbnQgKnRocmVhZF9maW5pc2hlZCBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICppdHRfc3luY19vYmopLAorICAgIGttcF9pbnQzMiBpc19jb25zdHJhaW5lZCkgeworICByZXR1cm4gX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZSgKKyAgICAgIHRocmVhZCwgZ3RpZCwgZmxhZywgZmluYWxfc3BpbiwKKyAgICAgIHRocmVhZF9maW5pc2hlZCBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopLCBpc19jb25zdHJhaW5lZCk7Cit9CisKKy8vIF9fa21wX2VuYWJsZV90YXNraW5nOiBBbGxvY2F0ZSB0YXNrIHRlYW0gYW5kIHJlc3VtZSB0aHJlYWRzIHNsZWVwaW5nIGF0IHRoZQorLy8gbmV4dCBiYXJyaWVyIHNvIHRoZXkgY2FuIGFzc2lzdCBpbiBleGVjdXRpbmcgZW5xdWV1ZWQgdGFza3MuCisvLyBGaXJzdCB0aHJlYWQgaW4gYWxsb2NhdGVzIHRoZSB0YXNrIHRlYW0gYXRvbWljYWxseS4KK3N0YXRpYyB2b2lkIF9fa21wX2VuYWJsZV90YXNraW5nKGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2luZm9fdCAqdGhpc190aHIpIHsKKyAga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZHNfZGF0YTsKKyAgaW50IG50aHJlYWRzLCBpLCBpc19pbml0X3RocmVhZDsKKworICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9lbmFibGVfdGFza2luZyhlbnRlcik6IFQjJWRcbiIsCisgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aGlzX3RocikpKTsKKworICBLTVBfREVCVUdfQVNTRVJUKHRhc2tfdGVhbSAhPSBOVUxMKTsKKyAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3Roci0+dGgudGhfdGVhbSAhPSBOVUxMKTsKKworICBudGhyZWFkcyA9IHRhc2tfdGVhbS0+dHQudHRfbnByb2M7CisgIEtNUF9ERUJVR19BU1NFUlQobnRocmVhZHMgPiAwKTsKKyAgS01QX0RFQlVHX0FTU0VSVChudGhyZWFkcyA9PSB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC50X25wcm9jKTsKKworICAvLyBBbGxvY2F0ZSBvciBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aHJlYWRzX2RhdGEgaWYgbmVjZXNzYXJ5CisgIGlzX2luaXRfdGhyZWFkID0gX19rbXBfcmVhbGxvY190YXNrX3RocmVhZHNfZGF0YSh0aGlzX3RociwgdGFza190ZWFtKTsKKworICBpZiAoIWlzX2luaXRfdGhyZWFkKSB7CisgICAgLy8gU29tZSBvdGhlciB0aHJlYWQgYWxyZWFkeSBzZXQgdXAgdGhlIGFycmF5LgorICAgIEtBX1RSQUNFKAorICAgICAgICAyMCwKKyAgICAgICAgKCJfX2ttcF9lbmFibGVfdGFza2luZyhleGl0KTogVCMlZDogdGhyZWFkcyBhcnJheSBhbHJlYWR5IHNldCB1cC5cbiIsCisgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRoaXNfdGhyKSkpOworICAgIHJldHVybjsKKyAgfQorICB0aHJlYWRzX2RhdGEgPSAoa21wX3RocmVhZF9kYXRhX3QgKilUQ1JfUFRSKHRhc2tfdGVhbS0+dHQudHRfdGhyZWFkc19kYXRhKTsKKyAgS01QX0RFQlVHX0FTU0VSVCh0aHJlYWRzX2RhdGEgIT0gTlVMTCk7CisKKyAgaWYgKChfX2ttcF90YXNraW5nX21vZGUgPT0gdHNrbV90YXNrX3RlYW1zKSAmJgorICAgICAgKF9fa21wX2RmbHRfYmxvY2t0aW1lICE9IEtNUF9NQVhfQkxPQ0tUSU1FKSkgeworICAgIC8vIFJlbGVhc2UgYW55IHRocmVhZHMgc2xlZXBpbmcgYXQgdGhlIGJhcnJpZXIsIHNvIHRoYXQgdGhleSBjYW4gc3RlYWwKKyAgICAvLyB0YXNrcyBhbmQgZXhlY3V0ZSB0aGVtLiAgSW4gZXh0cmEgYmFycmllciBtb2RlLCB0YXNrcyBkbyBub3Qgc2xlZXAKKyAgICAvLyBhdCB0aGUgc2VwYXJhdGUgdGFza2luZyBiYXJyaWVyLCBzbyB0aGlzIGlzbid0IGEgcHJvYmxlbS4KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnRocmVhZHM7IGkrKykgeworICAgICAgdm9sYXRpbGUgdm9pZCAqc2xlZXBfbG9jOworICAgICAga21wX2luZm9fdCAqdGhyZWFkID0gdGhyZWFkc19kYXRhW2ldLnRkLnRkX3RocjsKKworICAgICAgaWYgKGkgPT0gdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfdGlkKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgLy8gU2luY2Ugd2UgaGF2ZW4ndCBsb2NrZWQgdGhlIHRocmVhZCdzIHN1c3BlbmQgbXV0ZXggbG9jayBhdCB0aGlzCisgICAgICAvLyBwb2ludCwgdGhlcmUgaXMgYSBzbWFsbCB3aW5kb3cgd2hlcmUgYSB0aHJlYWQgbWlnaHQgYmUgcHV0dGluZworICAgICAgLy8gaXRzZWxmIHRvIHNsZWVwLCBidXQgaGFzbid0IHNldCB0aGUgdGhfc2xlZXBfbG9jIGZpZWxkIHlldC4KKyAgICAgIC8vIFRvIHdvcmsgYXJvdW5kIHRoaXMsIF9fa21wX2V4ZWN1dGVfdGFza3NfdGVtcGxhdGUoKSBwZXJpb2RpY2FsbHkgY2hlY2tzCisgICAgICAvLyBzZWUgaWYgb3RoZXIgdGhyZWFkcyBhcmUgc2xlZXBpbmcgKHVzaW5nIHRoZSBzYW1lIHJhbmRvbSBtZWNoYW5pc20gdGhhdAorICAgICAgLy8gaXMgdXNlZCBmb3IgdGFzayBzdGVhbGluZykgYW5kIGF3YWtlbnMgdGhlbSBpZiB0aGV5IGFyZS4KKyAgICAgIGlmICgoc2xlZXBfbG9jID0gVENSX1BUUihDQ0FTVCh2b2lkICosIHRocmVhZC0+dGgudGhfc2xlZXBfbG9jKSkpICE9CisgICAgICAgICAgTlVMTCkgeworICAgICAgICBLRl9UUkFDRSg1MCwgKCJfX2ttcF9lbmFibGVfdGFza2luZzogVCMlZCB3YWtpbmcgdXAgdGhyZWFkIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aGlzX3RociksCisgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aHJlYWQpKSk7CisgICAgICAgIF9fa21wX251bGxfcmVzdW1lX3dyYXBwZXIoX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aHJlYWQpLCBzbGVlcF9sb2MpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgS0ZfVFJBQ0UoNTAsICgiX19rbXBfZW5hYmxlX3Rhc2tpbmc6IFQjJWQgZG9uJ3Qgd2FrZSB1cCB0aHJlYWQgVCMlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRoaXNfdGhyKSwKKyAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRocmVhZCkpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9lbmFibGVfdGFza2luZyhleGl0KTogVCMlZFxuIiwKKyAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRoaXNfdGhyKSkpOworfQorCisvKiAvLyBUT0RPOiBDaGVjayB0aGUgY29tbWVudCBjb25zaXN0ZW5jeQorICogVXRpbGl0eSByb3V0aW5lcyBmb3IgInRhc2sgdGVhbXMiLiAgQSB0YXNrIHRlYW0gKGttcF90YXNrX3QpIGlzIGtpbmQgb2YKKyAqIGxpa2UgYSBzaGFkb3cgb2YgdGhlIGttcF90ZWFtX3QgZGF0YSBzdHJ1Y3QsIHdpdGggYSBkaWZmZXJlbnQgbGlmZXRpbWUuCisgKiBBZnRlciBhIGNoaWxkICogdGhyZWFkIGNoZWNrcyBpbnRvIGEgYmFycmllciBhbmQgY2FsbHMgX19rbXBfcmVsZWFzZSgpIGZyb20KKyAqIHRoZSBwYXJ0aWN1bGFyIHZhcmlhbnQgb2YgX19rbXBfPGJhcnJpZXJfa2luZD5fYmFycmllcl9nYXRoZXIoKSwgaXQgY2FuIG5vCisgKiBsb25nZXIgYXNzdW1lIHRoYXQgdGhlIGttcF90ZWFtX3Qgc3RydWN0dXJlIGlzIGludGFjdCAoYXQgYW55IG1vbWVudCwgdGhlCisgKiBtYXN0ZXIgdGhyZWFkIG1heSBleGl0IHRoZSBiYXJyaWVyIGNvZGUgYW5kIGZyZWUgdGhlIHRlYW0gZGF0YSBzdHJ1Y3R1cmUsCisgKiBhbmQgcmV0dXJuIHRoZSB0aHJlYWRzIHRvIHRoZSB0aHJlYWQgcG9vbCkuCisgKgorICogVGhpcyBkb2VzIG5vdCB3b3JrIHdpdGggdGhlIHRoZSB0YXNraW5nIGNvZGUsIGFzIHRoZSB0aHJlYWQgaXMgc3RpbGwKKyAqIGV4cGVjdGVkIHRvIHBhcnRpY2lwYXRlIGluIHRoZSBleGVjdXRpb24gb2YgYW55IHRhc2tzIHRoYXQgbWF5IGhhdmUgYmVlbgorICogc3Bhd25lZCBteSBhIG1lbWJlciBvZiB0aGUgdGVhbSwgYW5kIHRoZSB0aHJlYWQgc3RpbGwgbmVlZHMgYWNjZXNzIHRvIGFsbAorICogdG8gZWFjaCB0aHJlYWQgaW4gdGhlIHRlYW0sIHNvIHRoYXQgaXQgY2FuIHN0ZWFsIHdvcmsgZnJvbSBpdC4KKyAqCisgKiBFbnRlciB0aGUgZXhpc3RlbmNlIG9mIHRoZSBrbXBfdGFza190ZWFtX3Qgc3RydWN0LiAgSXQgZW1wbG95cyBhIHJlZmVyZW5jZQorICogY291bnRpbmcgbWVjaGFuaW1zLCBhbmQgaXMgYWxsb2NhdGVkIGJ5IHRoZSBtYXN0ZXIgdGhyZWFkIGJlZm9yZSBjYWxsaW5nCisgKiBfX2ttcF88YmFycmllcl9raW5kPl9yZWxlYXNlLCBhbmQgdGhlbiBpcyByZWxlYXNlIGJ5IHRoZSBsYXN0IHRocmVhZCB0bworICogZXhpdCBfX2ttcF88YmFycmllcl9raW5kPl9yZWxlYXNlIGF0IHRoZSBuZXh0IGJhcnJpZXIuICBJLmUuIHRoZSBsaWZldGltZXMKKyAqIG9mIHRoZSBrbXBfdGFza190ZWFtX3Qgc3RydWN0cyBmb3IgY29uc2VjdXRpdmUgYmFycmllcnMgY2FuIG92ZXJsYXAKKyAqIChhbmQgd2lsbCwgdW5sZXNzIHRoZSBtYXN0ZXIgdGhyZWFkIGlzIHRoZSBsYXN0IHRocmVhZCB0byBleGl0IHRoZSBiYXJyaWVyCisgKiByZWxlYXNlIHBoYXNlLCB3aGljaCBpcyBub3QgdHlwaWNhbCkuCisgKgorICogVGhlIGV4aXN0ZW5jZSBvZiBzdWNoIGEgc3RydWN0IGlzIHVzZWZ1bCBvdXRzaWRlIHRoZSBjb250ZXh0IG9mIHRhc2tpbmcsCisgKiBidXQgZm9yIG5vdywgSSdtIHRyeWluZyB0byBrZWVwIGl0IHNwZWNpZmljIHRvIHRoZSBPTVBfMzBfRU5BQkxFRCBtYWNybywKKyAqIHNvIHRoYXQgYW55IHBlcmZvcm1hbmNlIGRpZmZlcmVuY2VzIHNob3cgdXAgd2hlbiBjb21wYXJpbmcgdGhlIDIuNSB2cy4gMy4wCisgKiBsaWJyYXJpZXMuCisgKgorICogV2UgY3VycmVudGx5IHVzZSB0aGUgZXhpc3RlbmNlIG9mIHRoZSB0aHJlYWRzIGFycmF5IGFzIGFuIGluZGljYXRvciB0aGF0CisgKiB0YXNrcyB3ZXJlIHNwYXduZWQgc2luY2UgdGhlIGxhc3QgYmFycmllci4gIElmIHRoZSBzdHJ1Y3R1cmUgaXMgdG8gYmUKKyAqIHVzZWZ1bCBvdXRzaWRlIHRoZSBjb250ZXh0IG9mIHRhc2tpbmcsIHRoZW4gdGhpcyB3aWxsIGhhdmUgdG8gY2hhbmdlLCBidXQKKyAqIG5vdCBzZXR0dGluZyB0aGUgZmllbGQgbWluaW1pemVzIHRoZSBwZXJmb3JtYW5jZSBpbXBhY3Qgb2YgdGFza2luZyBvbgorICogYmFycmllcnMsIHdoZW4gbm8gZXhwbGljaXQgdGFza3Mgd2VyZSBzcGF3bmVkIChwdXNoZWQsIGFjdHVhbGx5KS4KKyAqLworCitzdGF0aWMga21wX3Rhc2tfdGVhbV90ICpfX2ttcF9mcmVlX3Rhc2tfdGVhbXMgPQorICAgIE5VTEw7IC8vIEZyZWUgbGlzdCBmb3IgdGFza190ZWFtIGRhdGEgc3RydWN0dXJlcworLy8gTG9jayBmb3IgdGFzayB0ZWFtIGRhdGEgc3RydWN0dXJlcworc3RhdGljIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX3Rhc2tfdGVhbV9sb2NrID0KKyAgICBLTVBfQk9PVFNUUkFQX0xPQ0tfSU5JVElBTElaRVIoX19rbXBfdGFza190ZWFtX2xvY2spOworCisvLyBfX2ttcF9hbGxvY190YXNrX2RlcXVlOgorLy8gQWxsb2NhdGVzIGEgdGFzayBkZXF1ZSBmb3IgYSBwYXJ0aWN1bGFyIHRocmVhZCwgYW5kIGluaXRpYWxpemUgdGhlIG5lY2Vzc2FyeQorLy8gZGF0YSBzdHJ1Y3R1cmVzIHJlbGF0aW5nIHRvIHRoZSBkZXF1ZS4gIFRoaXMgb25seSBoYXBwZW5zIG9uY2UgcGVyIHRocmVhZAorLy8gcGVyIHRhc2sgdGVhbSBzaW5jZSB0YXNrIHRlYW1zIGFyZSByZWN5Y2xlZC4gTm8gbG9jayBpcyBuZWVkZWQgZHVyaW5nCisvLyBhbGxvY2F0aW9uIHNpbmNlIGVhY2ggdGhyZWFkIGFsbG9jYXRlcyBpdHMgb3duIGRlcXVlLgorc3RhdGljIHZvaWQgX19rbXBfYWxsb2NfdGFza19kZXF1ZShrbXBfaW5mb190ICp0aHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YSkgeworICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCZ0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfbG9jayk7CisgIEtNUF9ERUJVR19BU1NFUlQodGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlID09IE5VTEwpOworCisgIC8vIEluaXRpYWxpemUgbGFzdCBzdG9sZW4gdGFzayBmaWVsZCB0byAibm9uZSIKKyAgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX2xhc3Rfc3RvbGVuID0gLTE7CisKKyAgS01QX0RFQlVHX0FTU0VSVChUQ1JfNCh0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfbnRhc2tzKSA9PSAwKTsKKyAgS01QX0RFQlVHX0FTU0VSVCh0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfaGVhZCA9PSAwKTsKKyAgS01QX0RFQlVHX0FTU0VSVCh0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfdGFpbCA9PSAwKTsKKworICBLRV9UUkFDRSgKKyAgICAgIDEwLAorICAgICAgKCJfX2ttcF9hbGxvY190YXNrX2RlcXVlOiBUIyVkIGFsbG9jYXRpbmcgZGVxdWVbJWRdIGZvciB0aHJlYWRfZGF0YSAlcFxuIiwKKyAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRocmVhZCksIElOSVRJQUxfVEFTS19ERVFVRV9TSVpFLCB0aHJlYWRfZGF0YSkpOworICAvLyBBbGxvY2F0ZSBzcGFjZSBmb3IgdGFzayBkZXF1ZSwgYW5kIHplcm8gdGhlIGRlcXVlCisgIC8vIENhbm5vdCB1c2UgX19rbXBfdGhyZWFkX2NhbGxvYygpIGJlY2F1c2UgdGhyZWFkcyBub3QgYXJvdW5kIGZvcgorICAvLyBrbXBfcmVhcF90YXNrX3RlYW0oICkuCisgIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZSA9IChrbXBfdGFza2RhdGFfdCAqKilfX2ttcF9hbGxvY2F0ZSgKKyAgICAgIElOSVRJQUxfVEFTS19ERVFVRV9TSVpFICogc2l6ZW9mKGttcF90YXNrZGF0YV90ICopKTsKKyAgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX3NpemUgPSBJTklUSUFMX1RBU0tfREVRVUVfU0laRTsKK30KKworLy8gX19rbXBfcmVhbGxvY190YXNrX2RlcXVlOgorLy8gUmUtYWxsb2NhdGVzIGEgdGFzayBkZXF1ZSBmb3IgYSBwYXJ0aWN1bGFyIHRocmVhZCwgY29waWVzIHRoZSBjb250ZW50IGZyb20KKy8vIHRoZSBvbGQgZGVxdWUgYW5kIGFkanVzdHMgdGhlIG5lY2Vzc2FyeSBkYXRhIHN0cnVjdHVyZXMgcmVsYXRpbmcgdG8gdGhlCisvLyBkZXF1ZS4gVGhpcyBvcGVyYXRpb24gbXVzdCBiZSBkb25lIHdpdGggYSB0aGUgZGVxdWVfbG9jayBiZWluZyBoZWxkCitzdGF0aWMgdm9pZCBfX2ttcF9yZWFsbG9jX3Rhc2tfZGVxdWUoa21wX2luZm9fdCAqdGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YSkgeworICBrbXBfaW50MzIgc2l6ZSA9IFRBU0tfREVRVUVfU0laRSh0aHJlYWRfZGF0YS0+dGQpOworICBrbXBfaW50MzIgbmV3X3NpemUgPSAyICogc2l6ZTsKKworICBLRV9UUkFDRSgxMCwgKCJfX2ttcF9yZWFsbG9jX3Rhc2tfZGVxdWU6IFQjJWQgcmVhbGxvY2F0aW5nIGRlcXVlW2Zyb20gJWQgdG8gIgorICAgICAgICAgICAgICAgICIlZF0gZm9yIHRocmVhZF9kYXRhICVwXG4iLAorICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGhyZWFkKSwgc2l6ZSwgbmV3X3NpemUsIHRocmVhZF9kYXRhKSk7CisKKyAga21wX3Rhc2tkYXRhX3QgKipuZXdfZGVxdWUgPQorICAgICAgKGttcF90YXNrZGF0YV90ICoqKV9fa21wX2FsbG9jYXRlKG5ld19zaXplICogc2l6ZW9mKGttcF90YXNrZGF0YV90ICopKTsKKworICBpbnQgaSwgajsKKyAgZm9yIChpID0gdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX2hlYWQsIGogPSAwOyBqIDwgc2l6ZTsKKyAgICAgICBpID0gKGkgKyAxKSAmIFRBU0tfREVRVUVfTUFTSyh0aHJlYWRfZGF0YS0+dGQpLCBqKyspCisgICAgbmV3X2RlcXVlW2pdID0gdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlW2ldOworCisgIF9fa21wX2ZyZWUodGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlKTsKKworICB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfaGVhZCA9IDA7CisgIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV90YWlsID0gc2l6ZTsKKyAgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlID0gbmV3X2RlcXVlOworICB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfc2l6ZSA9IG5ld19zaXplOworfQorCisvLyBfX2ttcF9mcmVlX3Rhc2tfZGVxdWU6CisvLyBEZWFsbG9jYXRlcyBhIHRhc2sgZGVxdWUgZm9yIGEgcGFydGljdWxhciB0aHJlYWQuIEhhcHBlbnMgYXQgbGlicmFyeQorLy8gZGVhbGxvY2F0aW9uIHNvIGRvbid0IG5lZWQgdG8gcmVzZXQgYWxsIHRocmVhZCBkYXRhIGZpZWxkcy4KK3N0YXRpYyB2b2lkIF9fa21wX2ZyZWVfdGFza19kZXF1ZShrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEpIHsKKyAgaWYgKHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZSAhPSBOVUxMKSB7CisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jaygmdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX2xvY2spOworICAgIFRDV180KHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9udGFza3MsIDApOworICAgIF9fa21wX2ZyZWUodGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlKTsKKyAgICB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWUgPSBOVUxMOworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJnRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9sb2NrKTsKKyAgfQorCisjaWZkZWYgQlVJTERfVElFRF9UQVNLX1NUQUNLCisgIC8vIEdFSDogRmlndXJlIG91dCB3aGF0IHRvIGRvIGhlcmUgZm9yIHRkX3N1c3BfdGllZF90YXNrcworICBpZiAodGhyZWFkX2RhdGEtPnRkLnRkX3N1c3BfdGllZF90YXNrcy50c19lbnRyaWVzICE9IFRBU0tfU1RBQ0tfRU1QVFkpIHsKKyAgICBfX2ttcF9mcmVlX3Rhc2tfc3RhY2soX19rbXBfdGhyZWFkX2Zyb21fZ3RpZChndGlkKSwgdGhyZWFkX2RhdGEpOworICB9CisjZW5kaWYgLy8gQlVJTERfVElFRF9UQVNLX1NUQUNLCit9CisKKy8vIF9fa21wX3JlYWxsb2NfdGFza190aHJlYWRzX2RhdGE6CisvLyBBbGxvY2F0ZXMgYSB0aHJlYWRzX2RhdGEgYXJyYXkgZm9yIGEgdGFzayB0ZWFtLCBlaXRoZXIgYnkgYWxsb2NhdGluZyBhbgorLy8gaW5pdGlhbCBhcnJheSBvciBlbmxhcmdpbmcgYW4gZXhpc3RpbmcgYXJyYXkuICBPbmx5IHRoZSBmaXJzdCB0aHJlYWQgdG8gZ2V0CisvLyB0aGUgbG9jayBhbGxvY3Mgb3IgZW5sYXJnZXMgdGhlIGFycmF5IGFuZCByZS1pbml0aWFsaXplcyB0aGUgYXJyYXkgZWxlZW1udHMuCisvLyBUaGF0IHRocmVhZCByZXR1cm5zICJUUlVFIiwgdGhlIHJlc3QgcmV0dXJuICJGQUxTRSIuCisvLyBBc3N1bWVzIHRoYXQgdGhlIG5ldyBhcnJheSBzaXplIGlzIGdpdmVuIGJ5IHRhc2tfdGVhbSAtPiB0dC50dF9ucHJvYy4KKy8vIFRoZSBjdXJyZW50IHNpemUgaXMgZ2l2ZW4gYnkgdGFza190ZWFtIC0+IHR0LnR0X21heF90aHJlYWRzLgorc3RhdGljIGludCBfX2ttcF9yZWFsbG9jX3Rhc2tfdGhyZWFkc19kYXRhKGttcF9pbmZvX3QgKnRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSkgeworICBrbXBfdGhyZWFkX2RhdGFfdCAqKnRocmVhZHNfZGF0YV9wOworICBrbXBfaW50MzIgbnRocmVhZHMsIG1heHRocmVhZHM7CisgIGludCBpc19pbml0X3RocmVhZCA9IEZBTFNFOworCisgIGlmIChUQ1JfNCh0YXNrX3RlYW0tPnR0LnR0X2ZvdW5kX3Rhc2tzKSkgeworICAgIC8vIEFscmVhZHkgcmVhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkLgorICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHRocmVhZHNfZGF0YV9wID0gJnRhc2tfdGVhbS0+dHQudHRfdGhyZWFkc19kYXRhOworICBudGhyZWFkcyA9IHRhc2tfdGVhbS0+dHQudHRfbnByb2M7CisgIG1heHRocmVhZHMgPSB0YXNrX3RlYW0tPnR0LnR0X21heF90aHJlYWRzOworCisgIC8vIEFsbCB0aHJlYWRzIG11c3QgbG9jayB3aGVuIHRoZXkgZW5jb3VudGVyIHRoZSBmaXJzdCB0YXNrIG9mIHRoZSBpbXBsaWNpdAorICAvLyB0YXNrIHJlZ2lvbiB0byBtYWtlIHN1cmUgdGhyZWFkc19kYXRhIGZpZWxkcyBhcmUgKHJlKWluaXRpYWxpemVkIGJlZm9yZQorICAvLyB1c2VkLgorICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCZ0YXNrX3RlYW0tPnR0LnR0X3RocmVhZHNfbG9jayk7CisKKyAgaWYgKCFUQ1JfNCh0YXNrX3RlYW0tPnR0LnR0X2ZvdW5kX3Rhc2tzKSkgeworICAgIC8vIGZpcnN0IHRocmVhZCB0byBlbmFibGUgdGFza2luZworICAgIGttcF90ZWFtX3QgKnRlYW0gPSB0aHJlYWQtPnRoLnRoX3RlYW07CisgICAgaW50IGk7CisKKyAgICBpc19pbml0X3RocmVhZCA9IFRSVUU7CisgICAgaWYgKG1heHRocmVhZHMgPCBudGhyZWFkcykgeworCisgICAgICBpZiAoKnRocmVhZHNfZGF0YV9wICE9IE5VTEwpIHsKKyAgICAgICAga21wX3RocmVhZF9kYXRhX3QgKm9sZF9kYXRhID0gKnRocmVhZHNfZGF0YV9wOworICAgICAgICBrbXBfdGhyZWFkX2RhdGFfdCAqbmV3X2RhdGEgPSBOVUxMOworCisgICAgICAgIEtFX1RSQUNFKAorICAgICAgICAgICAgMTAsCisgICAgICAgICAgICAoIl9fa21wX3JlYWxsb2NfdGFza190aHJlYWRzX2RhdGE6IFQjJWQgcmVhbGxvY2F0aW5nICIKKyAgICAgICAgICAgICAidGhyZWFkcyBkYXRhIGZvciB0YXNrX3RlYW0gJXAsIG5ld19zaXplID0gJWQsIG9sZF9zaXplID0gJWRcbiIsCisgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aHJlYWQpLCB0YXNrX3RlYW0sIG50aHJlYWRzLCBtYXh0aHJlYWRzKSk7CisgICAgICAgIC8vIFJlYWxsb2NhdGUgdGhyZWFkc19kYXRhIHRvIGhhdmUgbW9yZSBlbGVtZW50cyB0aGFuIGN1cnJlbnQgYXJyYXkKKyAgICAgICAgLy8gQ2Fubm90IHVzZSBfX2ttcF90aHJlYWRfcmVhbGxvYygpIGJlY2F1c2UgdGhyZWFkcyBub3QgYXJvdW5kIGZvcgorICAgICAgICAvLyBrbXBfcmVhcF90YXNrX3RlYW0oICkuICBOb3RlIGFsbCBuZXcgYXJyYXkgZW50cmllcyBhcmUgaW5pdGlhbGl6ZWQKKyAgICAgICAgLy8gdG8gemVybyBieSBfX2ttcF9hbGxvY2F0ZSgpLgorICAgICAgICBuZXdfZGF0YSA9IChrbXBfdGhyZWFkX2RhdGFfdCAqKV9fa21wX2FsbG9jYXRlKAorICAgICAgICAgICAgbnRocmVhZHMgKiBzaXplb2Yoa21wX3RocmVhZF9kYXRhX3QpKTsKKyAgICAgICAgLy8gY29weSBvbGQgZGF0YSB0byBuZXcgZGF0YQorICAgICAgICBLTVBfTUVNQ1BZX1MoKHZvaWQgKiluZXdfZGF0YSwgbnRocmVhZHMgKiBzaXplb2Yoa21wX3RocmVhZF9kYXRhX3QpLAorICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilvbGRfZGF0YSwgbWF4dGhyZWFkcyAqIHNpemVvZihrbXBfdGhyZWFkX2RhdGFfdCkpOworCisjaWZkZWYgQlVJTERfVElFRF9UQVNLX1NUQUNLCisgICAgICAgIC8vIEdFSDogRmlndXJlIG91dCBpZiB0aGlzIGlzIHRoZSByaWdodCB0aGluZyB0byBkbworICAgICAgICBmb3IgKGkgPSBtYXh0aHJlYWRzOyBpIDwgbnRocmVhZHM7IGkrKykgeworICAgICAgICAgIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YSA9ICYoKnRocmVhZHNfZGF0YV9wKVtpXTsKKyAgICAgICAgICBfX2ttcF9pbml0X3Rhc2tfc3RhY2soX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aHJlYWQpLCB0aHJlYWRfZGF0YSk7CisgICAgICAgIH0KKyNlbmRpZiAvLyBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKKyAgICAgICAgLy8gSW5zdGFsbCB0aGUgbmV3IGRhdGEgYW5kIGZyZWUgdGhlIG9sZCBkYXRhCisgICAgICAgICgqdGhyZWFkc19kYXRhX3ApID0gbmV3X2RhdGE7CisgICAgICAgIF9fa21wX2ZyZWUob2xkX2RhdGEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgS0VfVFJBQ0UoMTAsICgiX19rbXBfcmVhbGxvY190YXNrX3RocmVhZHNfZGF0YTogVCMlZCBhbGxvY2F0aW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAidGhyZWFkcyBkYXRhIGZvciB0YXNrX3RlYW0gJXAsIHNpemUgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRocmVhZCksIHRhc2tfdGVhbSwgbnRocmVhZHMpKTsKKyAgICAgICAgLy8gTWFrZSB0aGUgaW5pdGlhbCBhbGxvY2F0ZSBmb3IgdGhyZWFkc19kYXRhIGFycmF5LCBhbmQgemVybyBlbnRyaWVzCisgICAgICAgIC8vIENhbm5vdCB1c2UgX19rbXBfdGhyZWFkX2NhbGxvYygpIGJlY2F1c2UgdGhyZWFkcyBub3QgYXJvdW5kIGZvcgorICAgICAgICAvLyBrbXBfcmVhcF90YXNrX3RlYW0oICkuCisgICAgICAgIEFOTk9UQVRFX0lHTk9SRV9XUklURVNfQkVHSU4oKTsKKyAgICAgICAgKnRocmVhZHNfZGF0YV9wID0gKGttcF90aHJlYWRfZGF0YV90ICopX19rbXBfYWxsb2NhdGUoCisgICAgICAgICAgICBudGhyZWFkcyAqIHNpemVvZihrbXBfdGhyZWFkX2RhdGFfdCkpOworICAgICAgICBBTk5PVEFURV9JR05PUkVfV1JJVEVTX0VORCgpOworI2lmZGVmIEJVSUxEX1RJRURfVEFTS19TVEFDSworICAgICAgICAvLyBHRUg6IEZpZ3VyZSBvdXQgaWYgdGhpcyBpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG50aHJlYWRzOyBpKyspIHsKKyAgICAgICAgICBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEgPSAmKCp0aHJlYWRzX2RhdGFfcClbaV07CisgICAgICAgICAgX19rbXBfaW5pdF90YXNrX3N0YWNrKF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGhyZWFkKSwgdGhyZWFkX2RhdGEpOworICAgICAgICB9CisjZW5kaWYgLy8gQlVJTERfVElFRF9UQVNLX1NUQUNLCisgICAgICB9CisgICAgICB0YXNrX3RlYW0tPnR0LnR0X21heF90aHJlYWRzID0gbnRocmVhZHM7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIElmIGFycmF5IGhhcyAobW9yZSB0aGFuKSBlbm91Z2ggZWxlbWVudHMsIGdvIGFoZWFkIGFuZCB1c2UgaXQKKyAgICAgIEtNUF9ERUJVR19BU1NFUlQoKnRocmVhZHNfZGF0YV9wICE9IE5VTEwpOworICAgIH0KKworICAgIC8vIGluaXRpYWxpemUgdGhyZWFkc19kYXRhIHBvaW50ZXJzIGJhY2sgdG8gdGhyZWFkX2luZm8gc3RydWN0dXJlcworICAgIGZvciAoaSA9IDA7IGkgPCBudGhyZWFkczsgaSsrKSB7CisgICAgICBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEgPSAmKCp0aHJlYWRzX2RhdGFfcClbaV07CisgICAgICB0aHJlYWRfZGF0YS0+dGQudGRfdGhyID0gdGVhbS0+dC50X3RocmVhZHNbaV07CisKKyAgICAgIGlmICh0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfbGFzdF9zdG9sZW4gPj0gbnRocmVhZHMpIHsKKyAgICAgICAgLy8gVGhlIGxhc3Qgc3RvbGVuIGZpZWxkIHN1cnZpdmVzIGFjcm9zcyB0ZWFtcyAvIGJhcnJpZXIsIGFuZCB0aGUgbnVtYmVyCisgICAgICAgIC8vIG9mIHRocmVhZHMgbWF5IGhhdmUgY2hhbmdlZC4gIEl0J3MgcG9zc2libGUgKGxpa2VseT8pIHRoYXQgYSBuZXcKKyAgICAgICAgLy8gcGFyYWxsZWwgcmVnaW9uIHdpbGwgZXhoaWJpdCB0aGUgc2FtZSBiZWhhdmlvciBhcyBwcmV2aW91cyByZWdpb24uCisgICAgICAgIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9sYXN0X3N0b2xlbiA9IC0xOworICAgICAgfQorICAgIH0KKworICAgIEtNUF9NQigpOworICAgIFRDV19TWU5DXzQodGFza190ZWFtLT50dC50dF9mb3VuZF90YXNrcywgVFJVRSk7CisgIH0KKworICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCZ0YXNrX3RlYW0tPnR0LnR0X3RocmVhZHNfbG9jayk7CisgIHJldHVybiBpc19pbml0X3RocmVhZDsKK30KKworLy8gX19rbXBfZnJlZV90YXNrX3RocmVhZHNfZGF0YToKKy8vIERlYWxsb2NhdGVzIGEgdGhyZWFkc19kYXRhIGFycmF5IGZvciBhIHRhc2sgdGVhbSwgaW5jbHVkaW5nIGFueSBhdHRhY2hlZAorLy8gdGFza2luZyBkZXF1ZXMuICBPbmx5IG9jY3VycyBhdCBsaWJyYXJ5IHNodXRkb3duLgorc3RhdGljIHZvaWQgX19rbXBfZnJlZV90YXNrX3RocmVhZHNfZGF0YShrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSkgeworICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCZ0YXNrX3RlYW0tPnR0LnR0X3RocmVhZHNfbG9jayk7CisgIGlmICh0YXNrX3RlYW0tPnR0LnR0X3RocmVhZHNfZGF0YSAhPSBOVUxMKSB7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHRhc2tfdGVhbS0+dHQudHRfbWF4X3RocmVhZHM7IGkrKykgeworICAgICAgX19rbXBfZnJlZV90YXNrX2RlcXVlKCZ0YXNrX3RlYW0tPnR0LnR0X3RocmVhZHNfZGF0YVtpXSk7CisgICAgfQorICAgIF9fa21wX2ZyZWUodGFza190ZWFtLT50dC50dF90aHJlYWRzX2RhdGEpOworICAgIHRhc2tfdGVhbS0+dHQudHRfdGhyZWFkc19kYXRhID0gTlVMTDsKKyAgfQorICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCZ0YXNrX3RlYW0tPnR0LnR0X3RocmVhZHNfbG9jayk7Cit9CisKKy8vIF9fa21wX2FsbG9jYXRlX3Rhc2tfdGVhbToKKy8vIEFsbG9jYXRlcyBhIHRhc2sgdGVhbSBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyB0ZWFtLCB0YWtpbmcgaXQgZnJvbQorLy8gdGhlIGdsb2JhbCB0YXNrIHRlYW0gZnJlZSBsaXN0IGlmIHBvc3NpYmxlLiAgQWxzbyBpbml0aWFsaXplcyBkYXRhCisvLyBzdHJ1Y3R1cmVzLgorc3RhdGljIGttcF90YXNrX3RlYW1fdCAqX19rbXBfYWxsb2NhdGVfdGFza190ZWFtKGttcF9pbmZvX3QgKnRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdGVhbV90ICp0ZWFtKSB7CisgIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtID0gTlVMTDsKKyAgaW50IG50aHJlYWRzOworCisgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2FsbG9jYXRlX3Rhc2tfdGVhbTogVCMlZCBlbnRlcmluZzsgdGVhbSA9ICVwXG4iLAorICAgICAgICAgICAgICAgICh0aHJlYWQgPyBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRocmVhZCkgOiAtMSksIHRlYW0pKTsKKworICBpZiAoVENSX1BUUihfX2ttcF9mcmVlX3Rhc2tfdGVhbXMpICE9IE5VTEwpIHsKKyAgICAvLyBUYWtlIGEgdGFzayB0ZWFtIGZyb20gdGhlIHRhc2sgdGVhbSBwb29sCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jaygmX19rbXBfdGFza190ZWFtX2xvY2spOworICAgIGlmIChfX2ttcF9mcmVlX3Rhc2tfdGVhbXMgIT0gTlVMTCkgeworICAgICAgdGFza190ZWFtID0gX19rbXBfZnJlZV90YXNrX3RlYW1zOworICAgICAgVENXX1BUUihfX2ttcF9mcmVlX3Rhc2tfdGVhbXMsIHRhc2tfdGVhbS0+dHQudHRfbmV4dCk7CisgICAgICB0YXNrX3RlYW0tPnR0LnR0X25leHQgPSBOVUxMOworICAgIH0KKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF90YXNrX3RlYW1fbG9jayk7CisgIH0KKworICBpZiAodGFza190ZWFtID09IE5VTEwpIHsKKyAgICBLRV9UUkFDRSgxMCwgKCJfX2ttcF9hbGxvY2F0ZV90YXNrX3RlYW06IFQjJWQgYWxsb2NhdGluZyAiCisgICAgICAgICAgICAgICAgICAidGFzayB0ZWFtIGZvciB0ZWFtICVwXG4iLAorICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aHJlYWQpLCB0ZWFtKSk7CisgICAgLy8gQWxsb2NhdGUgYSBuZXcgdGFzayB0ZWFtIGlmIG9uZSBpcyBub3QgYXZhaWxhYmxlLgorICAgIC8vIENhbm5vdCB1c2UgX19rbXBfdGhyZWFkX21hbGxvYygpIGJlY2F1c2UgdGhyZWFkcyBub3QgYXJvdW5kIGZvcgorICAgIC8vIGttcF9yZWFwX3Rhc2tfdGVhbSggKS4KKyAgICB0YXNrX3RlYW0gPSAoa21wX3Rhc2tfdGVhbV90ICopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKGttcF90YXNrX3RlYW1fdCkpOworICAgIF9fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soJnRhc2tfdGVhbS0+dHQudHRfdGhyZWFkc19sb2NrKTsKKyAgICAvLyBBQzogX19rbXBfYWxsb2NhdGUgemVyb2VzIHJldHVybmVkIG1lbW9yeQorICAgIC8vIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGEgPSBOVUxMOworICAgIC8vIHRhc2tfdGVhbSAtPiB0dC50dF9tYXhfdGhyZWFkcyA9IDA7CisgICAgLy8gdGFza190ZWFtIC0+IHR0LnR0X25leHQgPSBOVUxMOworICB9CisKKyAgVENXXzQodGFza190ZWFtLT50dC50dF9mb3VuZF90YXNrcywgRkFMU0UpOworI2lmIE9NUF80NV9FTkFCTEVECisgIFRDV180KHRhc2tfdGVhbS0+dHQudHRfZm91bmRfcHJveHlfdGFza3MsIEZBTFNFKTsKKyNlbmRpZgorICB0YXNrX3RlYW0tPnR0LnR0X25wcm9jID0gbnRocmVhZHMgPSB0ZWFtLT50LnRfbnByb2M7CisKKyAgVENXXzQodGFza190ZWFtLT50dC50dF91bmZpbmlzaGVkX3RocmVhZHMsIG50aHJlYWRzKTsKKyAgVENXXzQodGFza190ZWFtLT50dC50dF9hY3RpdmUsIFRSVUUpOworCisgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2FsbG9jYXRlX3Rhc2tfdGVhbTogVCMlZCBleGl0aW5nOyB0YXNrX3RlYW0gPSAlcCAiCisgICAgICAgICAgICAgICAgInVuZmluaXNoZWRfdGhyZWFkcyBpbml0J2QgdG8gJWRcbiIsCisgICAgICAgICAgICAgICAgKHRocmVhZCA/IF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGhyZWFkKSA6IC0xKSwgdGFza190ZWFtLAorICAgICAgICAgICAgICAgIHRhc2tfdGVhbS0+dHQudHRfdW5maW5pc2hlZF90aHJlYWRzKSk7CisgIHJldHVybiB0YXNrX3RlYW07Cit9CisKKy8vIF9fa21wX2ZyZWVfdGFza190ZWFtOgorLy8gRnJlZXMgdGhlIHRhc2sgdGVhbSBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyB0aHJlYWQsIGFuZCBhZGRzIGl0CisvLyB0byB0aGUgZ2xvYmFsIHRhc2sgdGVhbSBmcmVlIGxpc3QuCit2b2lkIF9fa21wX2ZyZWVfdGFza190ZWFtKGttcF9pbmZvX3QgKnRocmVhZCwga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0pIHsKKyAgS0FfVFJBQ0UoMjAsICgiX19rbXBfZnJlZV90YXNrX3RlYW06IFQjJWQgdGFza190ZWFtID0gJXBcbiIsCisgICAgICAgICAgICAgICAgdGhyZWFkID8gX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aHJlYWQpIDogLTEsIHRhc2tfdGVhbSkpOworCisgIC8vIFB1dCB0YXNrIHRlYW0gYmFjayBvbiBmcmVlIGxpc3QKKyAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jaygmX19rbXBfdGFza190ZWFtX2xvY2spOworCisgIEtNUF9ERUJVR19BU1NFUlQodGFza190ZWFtLT50dC50dF9uZXh0ID09IE5VTEwpOworICB0YXNrX3RlYW0tPnR0LnR0X25leHQgPSBfX2ttcF9mcmVlX3Rhc2tfdGVhbXM7CisgIFRDV19QVFIoX19rbXBfZnJlZV90YXNrX3RlYW1zLCB0YXNrX3RlYW0pOworCisgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJl9fa21wX3Rhc2tfdGVhbV9sb2NrKTsKK30KKworLy8gX19rbXBfcmVhcF90YXNrX3RlYW1zOgorLy8gRnJlZSBhbGwgdGhlIHRhc2sgdGVhbXMgb24gdGhlIHRhc2sgdGVhbSBmcmVlIGxpc3QuCisvLyBTaG91bGQgb25seSBiZSBkb25lIGR1cmluZyBsaWJyYXJ5IHNodXRkb3duLgorLy8gQ2Fubm90IGRvIGFueXRoaW5nIHRoYXQgbmVlZHMgYSB0aHJlYWQgc3RydWN0dXJlIG9yIGd0aWQgc2luY2UgdGhleSBhcmUKKy8vIGFscmVhZHkgZ29uZS4KK3ZvaWQgX19rbXBfcmVhcF90YXNrX3RlYW1zKHZvaWQpIHsKKyAga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW07CisKKyAgaWYgKFRDUl9QVFIoX19rbXBfZnJlZV90YXNrX3RlYW1zKSAhPSBOVUxMKSB7CisgICAgLy8gRnJlZSBhbGwgdGFza190ZWFtcyBvbiB0aGUgZnJlZSBsaXN0CisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jaygmX19rbXBfdGFza190ZWFtX2xvY2spOworICAgIHdoaWxlICgodGFza190ZWFtID0gX19rbXBfZnJlZV90YXNrX3RlYW1zKSAhPSBOVUxMKSB7CisgICAgICBfX2ttcF9mcmVlX3Rhc2tfdGVhbXMgPSB0YXNrX3RlYW0tPnR0LnR0X25leHQ7CisgICAgICB0YXNrX3RlYW0tPnR0LnR0X25leHQgPSBOVUxMOworCisgICAgICAvLyBGcmVlIHRocmVhZHNfZGF0YSBpZiBuZWNlc3NhcnkKKyAgICAgIGlmICh0YXNrX3RlYW0tPnR0LnR0X3RocmVhZHNfZGF0YSAhPSBOVUxMKSB7CisgICAgICAgIF9fa21wX2ZyZWVfdGFza190aHJlYWRzX2RhdGEodGFza190ZWFtKTsKKyAgICAgIH0KKyAgICAgIF9fa21wX2ZyZWUodGFza190ZWFtKTsKKyAgICB9CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jaygmX19rbXBfdGFza190ZWFtX2xvY2spOworICB9Cit9CisKKy8vIF9fa21wX3dhaXRfdG9fdW5yZWZfdGFza190ZWFtczoKKy8vIFNvbWUgdGhyZWFkcyBjb3VsZCBzdGlsbCBiZSBpbiB0aGUgZm9yayBiYXJyaWVyIHJlbGVhc2UgY29kZSwgcG9zc2libHkKKy8vIHRyeWluZyB0byBzdGVhbCB0YXNrcy4gIFdhaXQgZm9yIGVhY2ggdGhyZWFkIHRvIHVucmVmZXJlbmNlIGl0cyB0YXNrIHRlYW0uCit2b2lkIF9fa21wX3dhaXRfdG9fdW5yZWZfdGFza190ZWFtcyh2b2lkKSB7CisgIGttcF9pbmZvX3QgKnRocmVhZDsKKyAga21wX3VpbnQzMiBzcGluczsKKyAgaW50IGRvbmU7CisKKyAgS01QX0lOSVRfWUlFTEQoc3BpbnMpOworCisgIGZvciAoOzspIHsKKyAgICBkb25lID0gVFJVRTsKKworICAgIC8vIFRPRE86IEdFSCAtIHRoaXMgbWF5IGJlIGlzIHdyb25nIGJlY2F1c2Ugc29tZSBzeW5jIHdvdWxkIGJlIG5lY2Vzc2FyeQorICAgIC8vIGluIGNhc2UgdGhyZWFkcyBhcmUgYWRkZWQgdG8gdGhlIHBvb2wgZHVyaW5nIHRoZSB0cmF2ZXJzYWwuIE5lZWQgdG8KKyAgICAvLyB2ZXJpZnkgdGhhdCBsb2NrIGZvciB0aHJlYWQgcG9vbCBpcyBoZWxkIHdoZW4gY2FsbGluZyB0aGlzIHJvdXRpbmUuCisgICAgZm9yICh0aHJlYWQgPSBDQ0FTVChrbXBfaW5mb190ICosIF9fa21wX3RocmVhZF9wb29sKTsgdGhyZWFkICE9IE5VTEw7CisgICAgICAgICB0aHJlYWQgPSB0aHJlYWQtPnRoLnRoX25leHRfcG9vbCkgeworI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICBEV09SRCBleGl0X3ZhbDsKKyNlbmRpZgorICAgICAgaWYgKFRDUl9QVFIodGhyZWFkLT50aC50aF90YXNrX3RlYW0pID09IE5VTEwpIHsKKyAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfd2FpdF90b191bnJlZl90YXNrX3RlYW06IFQjJWQgdGFza190ZWFtID09IE5VTExcbiIsCisgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aHJlYWQpKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAvLyBUT0RPOiBHRUggLSBhZGQgdGhpcyBjaGVjayBmb3IgTGludXgqIE9TIC8gT1MgWCogYXMgd2VsbD8KKyAgICAgIGlmICghX19rbXBfaXNfdGhyZWFkX2FsaXZlKHRocmVhZCwgJmV4aXRfdmFsKSkgeworICAgICAgICB0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbSA9IE5VTEw7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIGRvbmUgPSBGQUxTRTsgLy8gQmVjYXVzZSB0aF90YXNrX3RlYW0gcG9pbnRlciBpcyBub3QgTlVMTCBmb3IgdGhpcyB0aHJlYWQKKworICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfd2FpdF90b191bnJlZl90YXNrX3RlYW06IFdhaXRpbmcgZm9yIFQjJWQgdG8gIgorICAgICAgICAgICAgICAgICAgICAidW5yZWZlcmVuY2UgdGFza190ZWFtXG4iLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRocmVhZCkpKTsKKworICAgICAgaWYgKF9fa21wX2RmbHRfYmxvY2t0aW1lICE9IEtNUF9NQVhfQkxPQ0tUSU1FKSB7CisgICAgICAgIHZvbGF0aWxlIHZvaWQgKnNsZWVwX2xvYzsKKyAgICAgICAgLy8gSWYgdGhlIHRocmVhZCBpcyBzbGVlcGluZywgYXdha2VuIGl0LgorICAgICAgICBpZiAoKHNsZWVwX2xvYyA9IFRDUl9QVFIoQ0NBU1Qodm9pZCAqLCB0aHJlYWQtPnRoLnRoX3NsZWVwX2xvYykpKSAhPQorICAgICAgICAgICAgTlVMTCkgeworICAgICAgICAgIEtBX1RSQUNFKAorICAgICAgICAgICAgICAxMCwKKyAgICAgICAgICAgICAgKCJfX2ttcF93YWl0X3RvX3VucmVmX3Rhc2tfdGVhbTogVCMlZCB3YWtpbmcgdXAgdGhyZWFkIFQjJWRcbiIsCisgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRocmVhZCksIF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGhyZWFkKSkpOworICAgICAgICAgIF9fa21wX251bGxfcmVzdW1lX3dyYXBwZXIoX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aHJlYWQpLCBzbGVlcF9sb2MpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmIChkb25lKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBhcmUgb3ZlcnN1YnNjcmliZWQsIG9yIGhhdmUgd2FpdGVkIGEgYml0IChhbmQgbGlicmFyeSBtb2RlIGlzCisgICAgLy8gdGhyb3VnaHB1dCksIHlpZWxkLiBQYXVzZSBpcyBpbiB0aGUgZm9sbG93aW5nIGNvZGUuCisgICAgS01QX1lJRUxEKFRDUl80KF9fa21wX250aCkgPiBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICBLTVBfWUlFTERfU1BJTihzcGlucyk7IC8vIFlpZWxkcyBvbmx5IGlmIEtNUF9MSUJSQVJZPXRocm91Z2hwdXQKKyAgfQorfQorCisvLyBfX2ttcF90YXNrX3RlYW1fc2V0dXA6ICBDcmVhdGUgYSB0YXNrX3RlYW0gZm9yIHRoZSBjdXJyZW50IHRlYW0sIGJ1dCB1c2UKKy8vIGFuIGFscmVhZHkgY3JlYXRlZCwgdW51c2VkIG9uZSBpZiBpdCBhbHJlYWR5IGV4aXN0cy4KK3ZvaWQgX19rbXBfdGFza190ZWFtX3NldHVwKGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfdGVhbV90ICp0ZWFtLCBpbnQgYWx3YXlzKSB7CisgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpOworCisgIC8vIElmIHRoaXMgdGFza190ZWFtIGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0LCBhbGxvY2F0ZSBpdC4gSXQgd2lsbCBiZSB1c2VkIGluCisgIC8vIHRoZSByZWdpb24gYWZ0ZXIgdGhlIG5leHQuCisgIC8vIElmIGl0IGV4aXN0cywgaXQgaXMgdGhlIGN1cnJlbnQgdGFzayB0ZWFtIGFuZCBzaG91bGRuJ3QgYmUgdG91Y2hlZCB5ZXQgYXMKKyAgLy8gaXQgbWF5IHN0aWxsIGJlIGluIHVzZS4KKyAgaWYgKHRlYW0tPnQudF90YXNrX3RlYW1bdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGVdID09IE5VTEwgJiYKKyAgICAgIChhbHdheXMgfHwgdGVhbS0+dC50X25wcm9jID4gMSkpIHsKKyAgICB0ZWFtLT50LnRfdGFza190ZWFtW3RoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlXSA9CisgICAgICAgIF9fa21wX2FsbG9jYXRlX3Rhc2tfdGVhbSh0aGlzX3RociwgdGVhbSk7CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdGFza190ZWFtX3NldHVwOiBNYXN0ZXIgVCMlZCBjcmVhdGVkIG5ldyB0YXNrX3RlYW0gJXAgIgorICAgICAgICAgICAgICAgICAgImZvciB0ZWFtICVkIGF0IHBhcml0eT0lZFxuIiwKKyAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGhpc190aHIpLAorICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3Rhc2tfdGVhbVt0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZV0sCisgICAgICAgICAgICAgICAgICAoKHRlYW0gIT0gTlVMTCkgPyB0ZWFtLT50LnRfaWQgOiAtMSksCisgICAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZSkpOworICB9CisKKyAgLy8gQWZ0ZXIgdGhyZWFkcyBleGl0IHRoZSByZWxlYXNlLCB0aGV5IHdpbGwgY2FsbCBzeW5jLCBhbmQgdGhlbiBwb2ludCB0byB0aGlzCisgIC8vIG90aGVyIHRhc2tfdGVhbTsgbWFrZSBzdXJlIGl0IGlzIGFsbG9jYXRlZCBhbmQgcHJvcGVybHkgaW5pdGlhbGl6ZWQuIEFzCisgIC8vIHRocmVhZHMgc3BpbiBpbiB0aGUgYmFycmllciByZWxlYXNlIHBoYXNlLCB0aGV5IHdpbGwgY29udGludWUgdG8gdXNlIHRoZQorICAvLyBwcmV2aW91cyB0YXNrX3RlYW0gc3RydWN0KGFib3ZlKSwgdW50aWwgdGhleSByZWNlaXZlIHRoZSBzaWduYWwgdG8gc3RvcAorICAvLyBjaGVja2luZyBmb3IgdGFza3MgKHRoZXkgY2FuJ3Qgc2FmZWx5IHJlZmVyZW5jZSB0aGUga21wX3RlYW1fdCBzdHJ1Y3QsCisgIC8vIHdoaWNoIGNvdWxkIGJlIHJlYWxsb2NhdGVkIGJ5IHRoZSBtYXN0ZXIgdGhyZWFkKS4gTm8gdGFzayB0ZWFtcyBhcmUgZm9ybWVkCisgIC8vIGZvciBzZXJpYWxpemVkIHRlYW1zLgorICBpZiAodGVhbS0+dC50X25wcm9jID4gMSkgeworICAgIGludCBvdGhlcl90ZWFtID0gMSAtIHRoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlOworICAgIGlmICh0ZWFtLT50LnRfdGFza190ZWFtW290aGVyX3RlYW1dID09IE5VTEwpIHsgLy8gc2V0dXAgb3RoZXIgdGVhbSBhcyB3ZWxsCisgICAgICB0ZWFtLT50LnRfdGFza190ZWFtW290aGVyX3RlYW1dID0KKyAgICAgICAgICBfX2ttcF9hbGxvY2F0ZV90YXNrX3RlYW0odGhpc190aHIsIHRlYW0pOworICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdGFza190ZWFtX3NldHVwOiBNYXN0ZXIgVCMlZCBjcmVhdGVkIHNlY29uZCBuZXcgIgorICAgICAgICAgICAgICAgICAgICAidGFza190ZWFtICVwIGZvciB0ZWFtICVkIGF0IHBhcml0eT0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aGlzX3RociksCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF90YXNrX3RlYW1bb3RoZXJfdGVhbV0sCisgICAgICAgICAgICAgICAgICAgICgodGVhbSAhPSBOVUxMKSA/IHRlYW0tPnQudF9pZCA6IC0xKSwgb3RoZXJfdGVhbSkpOworICAgIH0gZWxzZSB7IC8vIExlYXZlIHRoZSBvbGQgdGFzayB0ZWFtIHN0cnVjdCBpbiBwbGFjZSBmb3IgdGhlIHVwY29taW5nIHJlZ2lvbjsKKyAgICAgIC8vIGFkanVzdCBhcyBuZWVkZWQKKyAgICAgIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtID0gdGVhbS0+dC50X3Rhc2tfdGVhbVtvdGhlcl90ZWFtXTsKKyAgICAgIGlmICghdGFza190ZWFtLT50dC50dF9hY3RpdmUgfHwKKyAgICAgICAgICB0ZWFtLT50LnRfbnByb2MgIT0gdGFza190ZWFtLT50dC50dF9ucHJvYykgeworICAgICAgICBUQ1dfNCh0YXNrX3RlYW0tPnR0LnR0X25wcm9jLCB0ZWFtLT50LnRfbnByb2MpOworICAgICAgICBUQ1dfNCh0YXNrX3RlYW0tPnR0LnR0X2ZvdW5kX3Rhc2tzLCBGQUxTRSk7CisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICAgICAgVENXXzQodGFza190ZWFtLT50dC50dF9mb3VuZF9wcm94eV90YXNrcywgRkFMU0UpOworI2VuZGlmCisgICAgICAgIFRDV180KHRhc2tfdGVhbS0+dHQudHRfdW5maW5pc2hlZF90aHJlYWRzLCB0ZWFtLT50LnRfbnByb2MpOworICAgICAgICBUQ1dfNCh0YXNrX3RlYW0tPnR0LnR0X2FjdGl2ZSwgVFJVRSk7CisgICAgICB9CisgICAgICAvLyBpZiB0ZWFtIHNpemUgaGFzIGNoYW5nZWQsIHRoZSBmaXJzdCB0aHJlYWQgdG8gZW5hYmxlIHRhc2tpbmcgd2lsbAorICAgICAgLy8gcmVhbGxvYyB0aHJlYWRzX2RhdGEgaWYgbmVjZXNzYXJ5CisgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90YXNrX3RlYW1fc2V0dXA6IE1hc3RlciBUIyVkIHJlc2V0IG5leHQgdGFza190ZWFtICIKKyAgICAgICAgICAgICAgICAgICAgIiVwIGZvciB0ZWFtICVkIGF0IHBhcml0eT0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aGlzX3RociksCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF90YXNrX3RlYW1bb3RoZXJfdGVhbV0sCisgICAgICAgICAgICAgICAgICAgICgodGVhbSAhPSBOVUxMKSA/IHRlYW0tPnQudF9pZCA6IC0xKSwgb3RoZXJfdGVhbSkpOworICAgIH0KKyAgfQorfQorCisvLyBfX2ttcF90YXNrX3RlYW1fc3luYzogUHJvcGFnYXRpb24gb2YgdGFzayB0ZWFtIGRhdGEgZnJvbSB0ZWFtIHRvIHRocmVhZHMKKy8vIHdoaWNoIGhhcHBlbnMganVzdCBhZnRlciB0aGUgcmVsZWFzZSBwaGFzZSBvZiBhIHRlYW0gYmFycmllci4gIFRoaXMgbWF5IGJlCisvLyBjYWxsZWQgYnkgYW55IHRocmVhZCwgYnV0IG9ubHkgZm9yIHRlYW1zIHdpdGggIyB0aHJlYWRzID4gMS4KK3ZvaWQgX19rbXBfdGFza190ZWFtX3N5bmMoa21wX2luZm9fdCAqdGhpc190aHIsIGttcF90ZWFtX3QgKnRlYW0pIHsKKyAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyk7CisKKyAgLy8gVG9nZ2xlIHRoZSB0aF90YXNrX3N0YXRlIGZpZWxkLCB0byBzd2l0Y2ggd2hpY2ggdGFza190ZWFtIHRoaXMgdGhyZWFkCisgIC8vIHJlZmVycyB0bworICB0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZSA9IDEgLSB0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZTsKKyAgLy8gSXQgaXMgbm93IHNhZmUgdG8gcHJvcGFnYXRlIHRoZSB0YXNrIHRlYW0gcG9pbnRlciBmcm9tIHRoZSB0ZWFtIHN0cnVjdCB0bworICAvLyB0aGUgY3VycmVudCB0aHJlYWQuCisgIFRDV19QVFIodGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSwKKyAgICAgICAgICB0ZWFtLT50LnRfdGFza190ZWFtW3RoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlXSk7CisgIEtBX1RSQUNFKDIwLAorICAgICAgICAgICAoIl9fa21wX3Rhc2tfdGVhbV9zeW5jOiBUaHJlYWQgVCMlZCB0YXNrIHRlYW0gc3dpdGNoZWQgdG8gdGFza190ZWFtICIKKyAgICAgICAgICAgICIlcCBmcm9tIFRlYW0gIyVkIChwYXJpdHk9JWQpXG4iLAorICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aGlzX3RociksIHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0sCisgICAgICAgICAgICAoKHRlYW0gIT0gTlVMTCkgPyB0ZWFtLT50LnRfaWQgOiAtMSksIHRoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlKSk7Cit9CisKKy8vIF9fa21wX3Rhc2tfdGVhbV93YWl0OiBNYXN0ZXIgdGhyZWFkIHdhaXRzIGZvciBvdXRzdGFuZGluZyB0YXNrcyBhZnRlciB0aGUKKy8vIGJhcnJpZXIgZ2F0aGVyIHBoYXNlLiBPbmx5IGNhbGxlZCBieSBtYXN0ZXIgdGhyZWFkIGlmICN0aHJlYWRzIGluIHRlYW0gPiAxIG9yCisvLyBpZiBwcm94eSB0YXNrcyB3ZXJlIGNyZWF0ZWQuCisvLworLy8gd2FpdCBpcyBhIGZsYWcgdGhhdCBkZWZhdWx0cyB0byAxIChzZWUga21wLmgpLCBidXQgd2FpdGluZyBjYW4gYmUgdHVybmVkIG9mZgorLy8gYnkgcGFzc2luZyBpbiAwIG9wdGlvbmFsbHkgYXMgdGhlIGxhc3QgYXJndW1lbnQuIFdoZW4gd2FpdCBpcyB6ZXJvLCBtYXN0ZXIKKy8vIHRocmVhZCBkb2VzIG5vdCB3YWl0IGZvciB1bmZpbmlzaGVkX3RocmVhZHMgdG8gcmVhY2ggMC4KK3ZvaWQgX19rbXBfdGFza190ZWFtX3dhaXQoCisgICAga21wX2luZm9fdCAqdGhpc190aHIsCisgICAga21wX3RlYW1fdCAqdGVhbSBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICppdHRfc3luY19vYmopLCBpbnQgd2FpdCkgeworICBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSA9IHRlYW0tPnQudF90YXNrX3RlYW1bdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGVdOworCisgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpOworICBLTVBfREVCVUdfQVNTRVJUKHRhc2tfdGVhbSA9PSB0aGlzX3Roci0+dGgudGhfdGFza190ZWFtKTsKKworICBpZiAoKHRhc2tfdGVhbSAhPSBOVUxMKSAmJiBLTVBfVEFTS0lOR19FTkFCTEVEKHRhc2tfdGVhbSkpIHsKKyAgICBpZiAod2FpdCkgeworICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdGFza190ZWFtX3dhaXQ6IE1hc3RlciBUIyVkIHdhaXRpbmcgZm9yIGFsbCB0YXNrcyAiCisgICAgICAgICAgICAgICAgICAgICIoZm9yIHVuZmluaXNoZWRfdGhyZWFkcyB0byByZWFjaCAwKSBvbiB0YXNrX3RlYW0gPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aGlzX3RociksIHRhc2tfdGVhbSkpOworICAgICAgLy8gV29ya2VyIHRocmVhZHMgbWF5IGhhdmUgZHJvcHBlZCB0aHJvdWdoIHRvIHJlbGVhc2UgcGhhc2UsIGJ1dCBjb3VsZAorICAgICAgLy8gc3RpbGwgYmUgZXhlY3V0aW5nIHRhc2tzLiBXYWl0IGhlcmUgZm9yIHRhc2tzIHRvIGNvbXBsZXRlLiBUbyBhdm9pZAorICAgICAgLy8gbWVtb3J5IGNvbnRlbnRpb24sIG9ubHkgbWFzdGVyIHRocmVhZCBjaGVja3MgdGVybWluYXRpb24gY29uZGl0aW9uLgorICAgICAga21wX2ZsYWdfMzIgZmxhZygKKyAgICAgICAgICBSQ0FTVCh2b2xhdGlsZSBrbXBfdWludDMyICosICZ0YXNrX3RlYW0tPnR0LnR0X3VuZmluaXNoZWRfdGhyZWFkcyksCisgICAgICAgICAgMFUpOworICAgICAgZmxhZy53YWl0KHRoaXNfdGhyLCBUUlVFIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikpOworICAgIH0KKyAgICAvLyBEZWFjdGl2YXRlIHRoZSBvbGQgdGFzayB0ZWFtLCBzbyB0aGF0IHRoZSB3b3JrZXIgdGhyZWFkcyB3aWxsIHN0b3AKKyAgICAvLyByZWZlcmVuY2luZyBpdCB3aGlsZSBzcGlubmluZy4KKyAgICBLQV9UUkFDRSgKKyAgICAgICAgMjAsCisgICAgICAgICgiX19rbXBfdGFza190ZWFtX3dhaXQ6IE1hc3RlciBUIyVkIGRlYWN0aXZhdGluZyB0YXNrX3RlYW0gJXA6ICIKKyAgICAgICAgICJzZXR0aW5nIGFjdGl2ZSB0byBmYWxzZSwgc2V0dGluZyBsb2NhbCBhbmQgdGVhbSdzIHBvaW50ZXIgdG8gTlVMTFxuIiwKKyAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGhpc190aHIpLCB0YXNrX3RlYW0pKTsKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgIEtNUF9ERUJVR19BU1NFUlQodGFza190ZWFtLT50dC50dF9ucHJvYyA+IDEgfHwKKyAgICAgICAgICAgICAgICAgICAgIHRhc2tfdGVhbS0+dHQudHRfZm91bmRfcHJveHlfdGFza3MgPT0gVFJVRSk7CisgICAgVENXX1NZTkNfNCh0YXNrX3RlYW0tPnR0LnR0X2ZvdW5kX3Byb3h5X3Rhc2tzLCBGQUxTRSk7CisjZWxzZQorICAgIEtNUF9ERUJVR19BU1NFUlQodGFza190ZWFtLT50dC50dF9ucHJvYyA+IDEpOworI2VuZGlmCisgICAgVENXX1NZTkNfNCh0YXNrX3RlYW0tPnR0LnR0X2FjdGl2ZSwgRkFMU0UpOworICAgIEtNUF9NQigpOworCisgICAgVENXX1BUUih0aGlzX3Roci0+dGgudGhfdGFza190ZWFtLCBOVUxMKTsKKyAgfQorfQorCisvLyBfX2ttcF90YXNraW5nX2JhcnJpZXI6CisvLyBUaGlzIHJvdXRpbmUgbWF5IG9ubHkgY2FsbGVkIHdoZW4gX19rbXBfdGFza2luZ19tb2RlID09IHRza21fZXh0cmFfYmFycmllci4KKy8vIEludGVybmFsIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYWxsIHRhc2tzIHByaW9yIHRvIGEgcmVndWxhciBiYXJyaWVyIG9yIGEgam9pbgorLy8gYmFycmllci4gSXQgaXMgYSBmdWxsIGJhcnJpZXIgaXRzZWxmLCB3aGljaCB1bmZvcnR1bmF0ZWx5IHR1cm5zIHJlZ3VsYXIKKy8vIGJhcnJpZXJzIGludG8gZG91YmxlIGJhcnJpZXJzIGFuZCBqb2luIGJhcnJpZXJzIGludG8gMSAxLzIgYmFycmllcnMuCit2b2lkIF9fa21wX3Rhc2tpbmdfYmFycmllcihrbXBfdGVhbV90ICp0ZWFtLCBrbXBfaW5mb190ICp0aHJlYWQsIGludCBndGlkKSB7CisgIHZvbGF0aWxlIGttcF91aW50MzIgKnNwaW4gPSBSQ0FTVCgKKyAgICAgIHZvbGF0aWxlIGttcF91aW50MzIgKiwKKyAgICAgICZ0ZWFtLT50LnRfdGFza190ZWFtW3RocmVhZC0+dGgudGhfdGFza19zdGF0ZV0tPnR0LnR0X3VuZmluaXNoZWRfdGhyZWFkcyk7CisgIGludCBmbGFnID0gRkFMU0U7CisgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfdGFza2luZ19tb2RlID09IHRza21fZXh0cmFfYmFycmllcik7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgIEtNUF9GU1lOQ19TUElOX0lOSVQoc3BpbiwgKGttcF91aW50MzIgKilOVUxMKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgIGttcF9mbGFnXzMyIHNwaW5fZmxhZyhzcGluLCAwVSk7CisgIHdoaWxlICghc3Bpbl9mbGFnLmV4ZWN1dGVfdGFza3ModGhyZWFkLCBndGlkLCBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFnIFVTRV9JVFRfQlVJTERfQVJHKE5VTEwpLCAwKSkgeworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAvLyBUT0RPOiBXaGF0IGFib3V0IGl0dF9zeW5jX29iaj8/CisgICAgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRShDQ0FTVChrbXBfdWludDMyICosIHNwaW4pKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBpZiAoVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSkgeworICAgICAgaWYgKF9fa21wX2dsb2JhbC5nLmdfYWJvcnQpCisgICAgICAgIF9fa21wX2Fib3J0X3RocmVhZCgpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIEtNUF9ZSUVMRChUUlVFKTsgLy8gR0g6IFdlIGFsd2F5cyB5aWVsZCBoZXJlCisgIH0KKyNpZiBVU0VfSVRUX0JVSUxECisgIEtNUF9GU1lOQ19TUElOX0FDUVVJUkVEKENDQVNUKGttcF91aW50MzIgKiwgc3BpbikpOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KK30KKworI2lmIE9NUF80NV9FTkFCTEVECisKKy8vIF9fa21wX2dpdmVfdGFzayBwdXRzIGEgdGFzayBpbnRvIGEgZ2l2ZW4gdGhyZWFkIHF1ZXVlIGlmOgorLy8gIC0gdGhlIHF1ZXVlIGZvciB0aGF0IHRocmVhZCB3YXMgY3JlYXRlZAorLy8gIC0gdGhlcmUncyBzcGFjZSBpbiB0aGF0IHF1ZXVlCisvLyBCZWNhdXNlIG9mIHRoaXMsIF9fa21wX3B1c2hfdGFzayBuZWVkcyB0byBjaGVjayBpZiB0aGVyZSdzIHNwYWNlIGFmdGVyCisvLyBnZXR0aW5nIHRoZSBsb2NrCitzdGF0aWMgYm9vbCBfX2ttcF9naXZlX3Rhc2soa21wX2luZm9fdCAqdGhyZWFkLCBrbXBfaW50MzIgdGlkLCBrbXBfdGFza190ICp0YXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBwYXNzKSB7CisgIGttcF90YXNrZGF0YV90ICp0YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spOworICBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSA9IHRhc2tkYXRhLT50ZF90YXNrX3RlYW07CisKKyAgS0FfVFJBQ0UoMjAsICgiX19rbXBfZ2l2ZV90YXNrOiB0cnlpbmcgdG8gZ2l2ZSB0YXNrICVwIHRvIHRocmVhZCAlZC5cbiIsCisgICAgICAgICAgICAgICAgdGFza2RhdGEsIHRpZCkpOworCisgIC8vIElmIHRhc2tfdGVhbSBpcyBOVUxMIHNvbWV0aGluZyB3ZW50IHJlYWxseSBiYWQuLi4KKyAgS01QX0RFQlVHX0FTU0VSVCh0YXNrX3RlYW0gIT0gTlVMTCk7CisKKyAgYm9vbCByZXN1bHQgPSBmYWxzZTsKKyAga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhID0gJnRhc2tfdGVhbS0+dHQudHRfdGhyZWFkc19kYXRhW3RpZF07CisKKyAgaWYgKHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZSA9PSBOVUxMKSB7CisgICAgLy8gVGhlcmUncyBubyBxdWV1ZSBpbiB0aGlzIHRocmVhZCwgZ28gZmluZCBhbm90aGVyIG9uZQorICAgIC8vIFdlJ3JlIGd1YXJhbnRlZWQgdGhhdCBhdCBsZWFzdCBvbmUgdGhyZWFkIGhhcyBhIHF1ZXVlCisgICAgS0FfVFJBQ0UoMzAsCisgICAgICAgICAgICAgKCJfX2ttcF9naXZlX3Rhc2s6IHRocmVhZCAlZCBoYXMgbm8gcXVldWUgd2hpbGUgZ2l2aW5nIHRhc2sgJXAuXG4iLAorICAgICAgICAgICAgICB0aWQsIHRhc2tkYXRhKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIGlmIChUQ1JfNCh0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfbnRhc2tzKSA+PQorICAgICAgVEFTS19ERVFVRV9TSVpFKHRocmVhZF9kYXRhLT50ZCkpIHsKKyAgICBLQV9UUkFDRSgKKyAgICAgICAgMzAsCisgICAgICAgICgiX19rbXBfZ2l2ZV90YXNrOiBxdWV1ZSBpcyBmdWxsIHdoaWxlIGdpdmluZyB0YXNrICVwIHRvIHRocmVhZCAlZC5cbiIsCisgICAgICAgICB0YXNrZGF0YSwgdGlkKSk7CisKKyAgICAvLyBpZiB0aGlzIGRlcXVlIGlzIGJpZ2dlciB0aGFuIHRoZSBwYXNzIHJhdGlvIGdpdmUgYSBjaGFuY2UgdG8gYW5vdGhlcgorICAgIC8vIHRocmVhZAorICAgIGlmIChUQVNLX0RFUVVFX1NJWkUodGhyZWFkX2RhdGEtPnRkKSAvIElOSVRJQUxfVEFTS19ERVFVRV9TSVpFID49IHBhc3MpCisgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jaygmdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX2xvY2spOworICAgIF9fa21wX3JlYWxsb2NfdGFza19kZXF1ZSh0aHJlYWQsIHRocmVhZF9kYXRhKTsKKworICB9IGVsc2UgeworCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jaygmdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX2xvY2spOworCisgICAgaWYgKFRDUl80KHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9udGFza3MpID49CisgICAgICAgIFRBU0tfREVRVUVfU0laRSh0aHJlYWRfZGF0YS0+dGQpKSB7CisgICAgICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9naXZlX3Rhc2s6IHF1ZXVlIGlzIGZ1bGwgd2hpbGUgZ2l2aW5nIHRhc2sgJXAgdG8gIgorICAgICAgICAgICAgICAgICAgICAidGhyZWFkICVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGFza2RhdGEsIHRpZCkpOworCisgICAgICAvLyBpZiB0aGlzIGRlcXVlIGlzIGJpZ2dlciB0aGFuIHRoZSBwYXNzIHJhdGlvIGdpdmUgYSBjaGFuY2UgdG8gYW5vdGhlcgorICAgICAgLy8gdGhyZWFkCisgICAgICBpZiAoVEFTS19ERVFVRV9TSVpFKHRocmVhZF9kYXRhLT50ZCkgLyBJTklUSUFMX1RBU0tfREVRVUVfU0laRSA+PSBwYXNzKQorICAgICAgICBnb3RvIHJlbGVhc2VfYW5kX2V4aXQ7CisKKyAgICAgIF9fa21wX3JlYWxsb2NfdGFza19kZXF1ZSh0aHJlYWQsIHRocmVhZF9kYXRhKTsKKyAgICB9CisgIH0KKworICAvLyBsb2NrIGlzIGhlbGQgaGVyZSwgYW5kIHRoZXJlIGlzIHNwYWNlIGluIHRoZSBkZXF1ZQorCisgIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZVt0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfdGFpbF0gPSB0YXNrZGF0YTsKKyAgLy8gV3JhcCBpbmRleC4KKyAgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX3RhaWwgPQorICAgICAgKHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV90YWlsICsgMSkgJiBUQVNLX0RFUVVFX01BU0sodGhyZWFkX2RhdGEtPnRkKTsKKyAgVENXXzQodGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX250YXNrcywKKyAgICAgICAgVENSXzQodGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX250YXNrcykgKyAxKTsKKworICByZXN1bHQgPSB0cnVlOworICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9naXZlX3Rhc2s6IHN1Y2Nlc3NmdWxseSBnYXZlIHRhc2sgJXAgdG8gdGhyZWFkICVkLlxuIiwKKyAgICAgICAgICAgICAgICB0YXNrZGF0YSwgdGlkKSk7CisKK3JlbGVhc2VfYW5kX2V4aXQ6CisgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJnRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9sb2NrKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCisvKiBUaGUgZmluaXNoIG9mIHRoZSBwcm94eSB0YXNrcyBpcyBkaXZpZGVkIGluIHR3byBwaWVjZXM6CisgICAgLSB0aGUgdG9wIGhhbGYgaXMgdGhlIG9uZSB0aGF0IGNhbiBiZSBkb25lIGZyb20gYSB0aHJlYWQgb3V0c2lkZSB0aGUgdGVhbQorICAgIC0gdGhlIGJvdHRvbSBoYWxmIG11c3QgYmUgcnVuIGZyb20gYSB0aGVtIHdpdGhpbiB0aGUgdGVhbQorCisgICBJbiBvcmRlciB0byBydW4gdGhlIGJvdHRvbSBoYWxmIHRoZSB0YXNrIGdldHMgcXVldWVkIGJhY2sgaW50byBvbmUgb2YgdGhlCisgICB0aHJlYWRzIG9mIHRoZSB0ZWFtLiBPbmNlIHRoZSB0ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2sgY291bnRlciBvZiB0aGUgcGFyZW50CisgICBpcyBkZWNyZW1lbnRlZCB0aGUgdGhyZWFkcyBjYW4gbGVhdmUgdGhlIGJhcnJpZXJzLiBTbywgdGhlIGJvdHRvbSBoYWxmIG5lZWRzCisgICB0byBiZSBxdWV1ZWQgYmVmb3JlIHRoZSBjb3VudGVyIGlzIGRlY3JlbWVudGVkLiBUaGUgdG9wIGhhbGYgaXMgdGhlcmVmb3JlCisgICBkaXZpZGVkIGluIHR3byBwYXJ0czoKKyAgICAtIHRoaW5ncyB0aGF0IGNhbiBiZSBydW4gYmVmb3JlIHF1ZXVpbmcgdGhlIGJvdHRvbSBoYWxmCisgICAgLSB0aGluZ3MgdGhhdCBtdXN0IGJlIHJ1biBhZnRlciBxdWV1aW5nIHRoZSBib3R0b20gaGFsZgorCisgICBUaGlzIGNyZWF0ZXMgYSBzZWNvbmQgcmFjZSBhcyB0aGUgYm90dG9tIGhhbGYgY2FuIGZyZWUgdGhlIHRhc2sgYmVmb3JlIHRoZQorICAgc2Vjb25kIHRvcCBoYWxmIGlzIGV4ZWN1dGVkLiBUbyBhdm9pZCB0aGlzIHdlIHVzZSB0aGUKKyAgIHRkX2luY29tcGxldGVfY2hpbGRfdGFzayBvZiB0aGUgcHJveHkgdGFzayB0byBzeW5jaHJvbml6ZSB0aGUgdG9wIGFuZCBib3R0b20KKyAgIGhhbGYuICovCitzdGF0aWMgdm9pZCBfX2ttcF9maXJzdF90b3BfaGFsZl9maW5pc2hfcHJveHkoa21wX3Rhc2tkYXRhX3QgKnRhc2tkYXRhKSB7CisgIEtNUF9ERUJVR19BU1NFUlQodGFza2RhdGEtPnRkX2ZsYWdzLnRhc2t0eXBlID09IFRBU0tfRVhQTElDSVQpOworICBLTVBfREVCVUdfQVNTRVJUKHRhc2tkYXRhLT50ZF9mbGFncy5wcm94eSA9PSBUQVNLX1BST1hZKTsKKyAgS01QX0RFQlVHX0FTU0VSVCh0YXNrZGF0YS0+dGRfZmxhZ3MuY29tcGxldGUgPT0gMCk7CisgIEtNUF9ERUJVR19BU1NFUlQodGFza2RhdGEtPnRkX2ZsYWdzLmZyZWVkID09IDApOworCisgIHRhc2tkYXRhLT50ZF9mbGFncy5jb21wbGV0ZSA9IDE7IC8vIG1hcmsgdGhlIHRhc2sgYXMgY29tcGxldGVkCisKKyAgaWYgKHRhc2tkYXRhLT50ZF90YXNrZ3JvdXApCisgICAgS01QX1RFU1RfVEhFTl9ERUMzMigmdGFza2RhdGEtPnRkX3Rhc2tncm91cC0+Y291bnQpOworCisgIC8vIENyZWF0ZSBhbiBpbWFnaW5hcnkgY2hpbGRyZW4gZm9yIHRoaXMgdGFzayBzbyB0aGUgYm90dG9tIGhhbGYgY2Fubm90CisgIC8vIHJlbGVhc2UgdGhlIHRhc2sgYmVmb3JlIHdlIGhhdmUgY29tcGxldGVkIHRoZSBzZWNvbmQgdG9wIGhhbGYKKyAgVENJXzQodGFza2RhdGEtPnRkX2luY29tcGxldGVfY2hpbGRfdGFza3MpOworfQorCitzdGF0aWMgdm9pZCBfX2ttcF9zZWNvbmRfdG9wX2hhbGZfZmluaXNoX3Byb3h5KGttcF90YXNrZGF0YV90ICp0YXNrZGF0YSkgeworICBrbXBfaW50MzIgY2hpbGRyZW4gPSAwOworCisgIC8vIFByZWRlY3JlbWVudCBzaW11bGF0ZWQgYnkgIi0gMSIgY2FsY3VsYXRpb24KKyAgY2hpbGRyZW4gPQorICAgICAgS01QX1RFU1RfVEhFTl9ERUMzMigmdGFza2RhdGEtPnRkX3BhcmVudC0+dGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcykgLSAxOworICBLTVBfREVCVUdfQVNTRVJUKGNoaWxkcmVuID49IDApOworCisgIC8vIFJlbW92ZSB0aGUgaW1hZ2luYXJ5IGNoaWxkcmVuCisgIFRDRF80KHRhc2tkYXRhLT50ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzKTsKK30KKworc3RhdGljIHZvaWQgX19rbXBfYm90dG9tX2hhbGZfZmluaXNoX3Byb3h5KGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICpwdGFzaykgeworICBrbXBfdGFza2RhdGFfdCAqdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQShwdGFzayk7CisgIGttcF9pbmZvX3QgKnRocmVhZCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisKKyAgS01QX0RFQlVHX0FTU0VSVCh0YXNrZGF0YS0+dGRfZmxhZ3MucHJveHkgPT0gVEFTS19QUk9YWSk7CisgIEtNUF9ERUJVR19BU1NFUlQodGFza2RhdGEtPnRkX2ZsYWdzLmNvbXBsZXRlID09CisgICAgICAgICAgICAgICAgICAgMSk7IC8vIHRvcCBoYWxmIG11c3QgcnVuIGJlZm9yZSBib3R0b20gaGFsZgorCisgIC8vIFdlIG5lZWQgdG8gd2FpdCB0byBtYWtlIHN1cmUgdGhlIHRvcCBoYWxmIGlzIGZpbmlzaGVkCisgIC8vIFNwaW5uaW5nIGhlcmUgc2hvdWxkIGJlIG9rIGFzIHRoaXMgc2hvdWxkIGhhcHBlbiBxdWlja2x5CisgIHdoaWxlIChUQ1JfNCh0YXNrZGF0YS0+dGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcykgPiAwKQorICAgIDsKKworICBfX2ttcF9yZWxlYXNlX2RlcHMoZ3RpZCwgdGFza2RhdGEpOworICBfX2ttcF9mcmVlX3Rhc2tfYW5kX2FuY2VzdG9ycyhndGlkLCB0YXNrZGF0YSwgdGhyZWFkKTsKK30KKworLyohCitAaW5ncm91cCBUQVNLSU5HCitAcGFyYW0gZ3RpZCBHbG9iYWwgVGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKK0BwYXJhbSBwdGFzayBUYXNrIHdoaWNoIGV4ZWN1dGlvbiBpcyBjb21wbGV0ZWQKKworRXhlY3V0ZSB0aGUgY29tcGxldGF0aW9uIG9mIGEgcHJveHkgdGFzayBmcm9tIGEgdGhyZWFkIG9mIHRoYXQgaXMgcGFydCBvZiB0aGUKK3RlYW0uIFJ1biBmaXJzdCBhbmQgYm90dG9tIGhhbHZlcyBkaXJlY3RseS4KKyovCit2b2lkIF9fa21wY19wcm94eV90YXNrX2NvbXBsZXRlZChrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqcHRhc2spIHsKKyAgS01QX0RFQlVHX0FTU0VSVChwdGFzayAhPSBOVUxMKTsKKyAga21wX3Rhc2tkYXRhX3QgKnRhc2tkYXRhID0gS01QX1RBU0tfVE9fVEFTS0RBVEEocHRhc2spOworICBLQV9UUkFDRSgKKyAgICAgIDEwLCAoIl9fa21wX3Byb3h5X3Rhc2tfY29tcGxldGVkKGVudGVyKTogVCMlZCBwcm94eSB0YXNrICVwIGNvbXBsZXRpbmdcbiIsCisgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhKSk7CisKKyAgS01QX0RFQlVHX0FTU0VSVCh0YXNrZGF0YS0+dGRfZmxhZ3MucHJveHkgPT0gVEFTS19QUk9YWSk7CisKKyAgX19rbXBfZmlyc3RfdG9wX2hhbGZfZmluaXNoX3Byb3h5KHRhc2tkYXRhKTsKKyAgX19rbXBfc2Vjb25kX3RvcF9oYWxmX2ZpbmlzaF9wcm94eSh0YXNrZGF0YSk7CisgIF9fa21wX2JvdHRvbV9oYWxmX2ZpbmlzaF9wcm94eShndGlkLCBwdGFzayk7CisKKyAgS0FfVFJBQ0UoMTAsCisgICAgICAgICAgICgiX19rbXBfcHJveHlfdGFza19jb21wbGV0ZWQoZXhpdCk6IFQjJWQgcHJveHkgdGFzayAlcCBjb21wbGV0aW5nXG4iLAorICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEpKTsKK30KKworLyohCitAaW5ncm91cCBUQVNLSU5HCitAcGFyYW0gcHRhc2sgVGFzayB3aGljaCBleGVjdXRpb24gaXMgY29tcGxldGVkCisKK0V4ZWN1dGUgdGhlIGNvbXBsZXRhdGlvbiBvZiBhIHByb3h5IHRhc2sgZnJvbSBhIHRocmVhZCB0aGF0IGNvdWxkIG5vdCBiZWxvbmcgdG8KK3RoZSB0ZWFtLgorKi8KK3ZvaWQgX19rbXBjX3Byb3h5X3Rhc2tfY29tcGxldGVkX29vbyhrbXBfdGFza190ICpwdGFzaykgeworICBLTVBfREVCVUdfQVNTRVJUKHB0YXNrICE9IE5VTEwpOworICBrbXBfdGFza2RhdGFfdCAqdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQShwdGFzayk7CisKKyAgS0FfVFJBQ0UoCisgICAgICAxMCwKKyAgICAgICgiX19rbXBfcHJveHlfdGFza19jb21wbGV0ZWRfb29vKGVudGVyKTogcHJveHkgdGFzayBjb21wbGV0aW5nIG9vbyAlcFxuIiwKKyAgICAgICB0YXNrZGF0YSkpOworCisgIEtNUF9ERUJVR19BU1NFUlQodGFza2RhdGEtPnRkX2ZsYWdzLnByb3h5ID09IFRBU0tfUFJPWFkpOworCisgIF9fa21wX2ZpcnN0X3RvcF9oYWxmX2ZpbmlzaF9wcm94eSh0YXNrZGF0YSk7CisKKyAgLy8gRW5xdWV1ZSB0YXNrIHRvIGNvbXBsZXRlIGJvdHRvbSBoYWxmIGNvbXBsZXRpb24gZnJvbSBhIHRocmVhZCB3aXRoaW4gdGhlCisgIC8vIGNvcnJlc3BvbmRpbmcgdGVhbQorICBrbXBfdGVhbV90ICp0ZWFtID0gdGFza2RhdGEtPnRkX3RlYW07CisgIGttcF9pbnQzMiBudGhyZWFkcyA9IHRlYW0tPnQudF9ucHJvYzsKKyAga21wX2luZm9fdCAqdGhyZWFkOworCisgIC8vIFRoaXMgc2hvdWxkIGJlIHNpbWlsYXIgdG8gc3RhcnRfayA9IF9fa21wX2dldF9yYW5kb20oIHRocmVhZCApICUgbnRocmVhZHMKKyAgLy8gYnV0IHdlIGNhbm5vdCB1c2UgX19rbXBfZ2V0X3JhbmRvbSBoZXJlCisgIGttcF9pbnQzMiBzdGFydF9rID0gMDsKKyAga21wX2ludDMyIHBhc3MgPSAxOworICBrbXBfaW50MzIgayA9IHN0YXJ0X2s7CisKKyAgZG8geworICAgIC8vIEZvciBub3cgd2UncmUganVzdCBsaW5lYXJseSB0cnlpbmcgdG8gZmluZCBhIHRocmVhZAorICAgIHRocmVhZCA9IHRlYW0tPnQudF90aHJlYWRzW2tdOworICAgIGsgPSAoayArIDEpICUgbnRocmVhZHM7CisKKyAgICAvLyB3ZSBkaWQgYSBmdWxsIHBhc3MgdGhyb3VnaCBhbGwgdGhlIHRocmVhZHMKKyAgICBpZiAoayA9PSBzdGFydF9rKQorICAgICAgcGFzcyA9IHBhc3MgPDwgMTsKKworICB9IHdoaWxlICghX19rbXBfZ2l2ZV90YXNrKHRocmVhZCwgaywgcHRhc2ssIHBhc3MpKTsKKworICBfX2ttcF9zZWNvbmRfdG9wX2hhbGZfZmluaXNoX3Byb3h5KHRhc2tkYXRhKTsKKworICBLQV9UUkFDRSgKKyAgICAgIDEwLAorICAgICAgKCJfX2ttcF9wcm94eV90YXNrX2NvbXBsZXRlZF9vb28oZXhpdCk6IHByb3h5IHRhc2sgY29tcGxldGluZyBvb28gJXBcbiIsCisgICAgICAgdGFza2RhdGEpKTsKK30KKworLy8gX19rbXBfdGFza19kdXBfYWxsb2M6IEFsbG9jYXRlIHRoZSB0YXNrZGF0YSBhbmQgbWFrZSBhIGNvcHkgb2Ygc291cmNlIHRhc2sKKy8vIGZvciB0YXNrbG9vcAorLy8KKy8vIHRocmVhZDogICBhbGxvY2F0aW5nIHRocmVhZAorLy8gdGFza19zcmM6IHBvaW50ZXIgdG8gc291cmNlIHRhc2sgdG8gYmUgZHVwbGljYXRlZAorLy8gcmV0dXJuczogIGEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIGttcF90YXNrX3Qgc3RydWN0dXJlICh0YXNrKS4KK2ttcF90YXNrX3QgKl9fa21wX3Rhc2tfZHVwX2FsbG9jKGttcF9pbmZvX3QgKnRocmVhZCwga21wX3Rhc2tfdCAqdGFza19zcmMpIHsKKyAga21wX3Rhc2tfdCAqdGFzazsKKyAga21wX3Rhc2tkYXRhX3QgKnRhc2tkYXRhOworICBrbXBfdGFza2RhdGFfdCAqdGFza2RhdGFfc3JjOworICBrbXBfdGFza2RhdGFfdCAqcGFyZW50X3Rhc2sgPSB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzazsKKyAgc2l6ZV90IHNoYXJlZHNfb2Zmc2V0OworICBzaXplX3QgdGFza19zaXplOworCisgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3Rhc2tfZHVwX2FsbG9jKGVudGVyKTogVGggJXAsIHNvdXJjZSB0YXNrICVwXG4iLCB0aHJlYWQsCisgICAgICAgICAgICAgICAgdGFza19zcmMpKTsKKyAgdGFza2RhdGFfc3JjID0gS01QX1RBU0tfVE9fVEFTS0RBVEEodGFza19zcmMpOworICBLTVBfREVCVUdfQVNTRVJUKHRhc2tkYXRhX3NyYy0+dGRfZmxhZ3MucHJveHkgPT0KKyAgICAgICAgICAgICAgICAgICBUQVNLX0ZVTEwpOyAvLyBpdCBzaG91bGQgbm90IGJlIHByb3h5IHRhc2sKKyAgS01QX0RFQlVHX0FTU0VSVCh0YXNrZGF0YV9zcmMtPnRkX2ZsYWdzLnRhc2t0eXBlID09IFRBU0tfRVhQTElDSVQpOworICB0YXNrX3NpemUgPSB0YXNrZGF0YV9zcmMtPnRkX3NpemVfYWxsb2M7CisKKyAgLy8gQWxsb2NhdGUgYSBrbXBfdGFza2RhdGFfdCBibG9jayBhbmQgYSBrbXBfdGFza190IGJsb2NrLgorICBLQV9UUkFDRSgzMCwgKCJfX2ttcF90YXNrX2R1cF9hbGxvYzogVGggJXAsIG1hbGxvYyBzaXplICVsZFxuIiwgdGhyZWFkLAorICAgICAgICAgICAgICAgIHRhc2tfc2l6ZSkpOworI2lmIFVTRV9GQVNUX01FTU9SWQorICB0YXNrZGF0YSA9IChrbXBfdGFza2RhdGFfdCAqKV9fa21wX2Zhc3RfYWxsb2NhdGUodGhyZWFkLCB0YXNrX3NpemUpOworI2Vsc2UKKyAgdGFza2RhdGEgPSAoa21wX3Rhc2tkYXRhX3QgKilfX2ttcF90aHJlYWRfbWFsbG9jKHRocmVhZCwgdGFza19zaXplKTsKKyNlbmRpZiAvKiBVU0VfRkFTVF9NRU1PUlkgKi8KKyAgS01QX01FTUNQWSh0YXNrZGF0YSwgdGFza2RhdGFfc3JjLCB0YXNrX3NpemUpOworCisgIHRhc2sgPSBLTVBfVEFTS0RBVEFfVE9fVEFTSyh0YXNrZGF0YSk7CisKKyAgLy8gSW5pdGlhbGl6ZSBuZXcgdGFzayAob25seSBzcGVjaWZpYyBmaWVsZHMgbm90IGFmZmVjdGVkIGJ5IG1lbWNweSkKKyAgdGFza2RhdGEtPnRkX3Rhc2tfaWQgPSBLTVBfR0VOX1RBU0tfSUQoKTsKKyAgaWYgKHRhc2stPnNoYXJlZHMgIT0gTlVMTCkgeyAvLyBuZWVkIHNldHVwIHNoYXJlZHMgcG9pbnRlcgorICAgIHNoYXJlZHNfb2Zmc2V0ID0gKGNoYXIgKil0YXNrX3NyYy0+c2hhcmVkcyAtIChjaGFyICopdGFza2RhdGFfc3JjOworICAgIHRhc2stPnNoYXJlZHMgPSAmKChjaGFyICopdGFza2RhdGEpW3NoYXJlZHNfb2Zmc2V0XTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCgoKGttcF91aW50cHRyX3QpdGFzay0+c2hhcmVkcykgJiAoc2l6ZW9mKHZvaWQgKikgLSAxKSkgPT0KKyAgICAgICAgICAgICAgICAgICAgIDApOworICB9CisgIHRhc2tkYXRhLT50ZF9hbGxvY190aHJlYWQgPSB0aHJlYWQ7CisgIHRhc2tkYXRhLT50ZF9wYXJlbnQgPSBwYXJlbnRfdGFzazsKKyAgdGFza2RhdGEtPnRkX3Rhc2tncm91cCA9CisgICAgICBwYXJlbnRfdGFzaworICAgICAgICAgIC0+dGRfdGFza2dyb3VwOyAvLyB0YXNrIGluaGVyaXRzIHRoZSB0YXNrZ3JvdXAgZnJvbSB0aGUgcGFyZW50IHRhc2sKKworICAvLyBPbmx5IG5lZWQgdG8ga2VlcCB0cmFjayBvZiBjaGlsZCB0YXNrIGNvdW50cyBpZiB0ZWFtIHBhcmFsbGVsIGFuZCB0YXNraW5nCisgIC8vIG5vdCBzZXJpYWxpemVkCisgIGlmICghKHRhc2tkYXRhLT50ZF9mbGFncy50ZWFtX3NlcmlhbCB8fCB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza2luZ19zZXIpKSB7CisgICAgS01QX1RFU1RfVEhFTl9JTkMzMigmcGFyZW50X3Rhc2stPnRkX2luY29tcGxldGVfY2hpbGRfdGFza3MpOworICAgIGlmIChwYXJlbnRfdGFzay0+dGRfdGFza2dyb3VwKQorICAgICAgS01QX1RFU1RfVEhFTl9JTkMzMigmcGFyZW50X3Rhc2stPnRkX3Rhc2tncm91cC0+Y291bnQpOworICAgIC8vIE9ubHkgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGFsbG9jYXRlZCBjaGlsZCB0YXNrcyBmb3IgZXhwbGljaXQgdGFza3Mgc2luY2UKKyAgICAvLyBpbXBsaWNpdCBub3QgZGVhbGxvY2F0ZWQKKyAgICBpZiAodGFza2RhdGEtPnRkX3BhcmVudC0+dGRfZmxhZ3MudGFza3R5cGUgPT0gVEFTS19FWFBMSUNJVCkKKyAgICAgIEtNUF9URVNUX1RIRU5fSU5DMzIoJnRhc2tkYXRhLT50ZF9wYXJlbnQtPnRkX2FsbG9jYXRlZF9jaGlsZF90YXNrcyk7CisgIH0KKworICBLQV9UUkFDRSgyMCwKKyAgICAgICAgICAgKCJfX2ttcF90YXNrX2R1cF9hbGxvYyhleGl0KTogVGggJXAsIGNyZWF0ZWQgdGFzayAlcCwgcGFyZW50PSVwXG4iLAorICAgICAgICAgICAgdGhyZWFkLCB0YXNrZGF0YSwgdGFza2RhdGEtPnRkX3BhcmVudCkpOworI2lmIE9NUFRfU1VQUE9SVAorICBfX2ttcF90YXNrX2luaXRfb21wdCh0YXNrZGF0YSwgdGhyZWFkLT50aC50aF9pbmZvLmRzLmRzX2d0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopdGFzay0+cm91dGluZSk7CisjZW5kaWYKKyAgcmV0dXJuIHRhc2s7Cit9CisKKy8vIFJvdXRpbmUgb3B0aW9uYWxseSBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyIGZvciBzZXR0aW5nIHRoZSBsYXN0cHJpdmF0ZSBmbGFnCisvLyBhbmQgY2FsbGluZyBuZWVkZWQgY29uc3RydWN0b3JzIGZvciBwcml2YXRlL2ZpcnN0cHJpdmF0ZSBvYmplY3RzCisvLyAodXNlZCB0byBmb3JtIHRhc2tsb29wIHRhc2tzIGZyb20gcGF0dGVybiB0YXNrKQorLy8gUGFyYW1ldGVyczogZGVzdCB0YXNrLCBzcmMgdGFzaywgbGFzdHByaXZhdGUgZmxhZy4KK3R5cGVkZWYgdm9pZCAoKnBfdGFza19kdXBfdCkoa21wX3Rhc2tfdCAqLCBrbXBfdGFza190ICosIGttcF9pbnQzMik7CisKKy8vIF9fa21wX3Rhc2tsb29wX2xpbmVhcjogU3RhcnQgdGFza3Mgb2YgdGhlIHRhc2tsb29wIGxpbmVhcmx5CisvLworLy8gbG9jICAgICAgIFNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorLy8gZ3RpZCAgICAgIEdsb2JhbCB0aHJlYWQgSUQKKy8vIHRhc2sgICAgICBQYXR0ZXJuIHRhc2ssIGV4cG9zZXMgdGhlIGxvb3AgaXRlcmF0aW9uIHJhbmdlCisvLyBsYiAgICAgICAgUG9pbnRlciB0byBsb29wIGxvd2VyIGJvdW5kIGluIHRhc2sgc3RydWN0dXJlCisvLyB1YiAgICAgICAgUG9pbnRlciB0byBsb29wIHVwcGVyIGJvdW5kIGluIHRhc2sgc3RydWN0dXJlCisvLyBzdCAgICAgICAgTG9vcCBzdHJpZGUKKy8vIHViX2dsb2IgICBHbG9iYWwgdXBwZXIgYm91bmQgKHVzZWQgZm9yIGxhc3Rwcml2YXRlIGNoZWNrKQorLy8gbnVtX3Rhc2tzIE51bWJlciBvZiB0YXNrcyB0byBleGVjdXRlCisvLyBncmFpbnNpemUgTnVtYmVyIG9mIGxvb3AgaXRlcmF0aW9ucyBwZXIgdGFzaworLy8gZXh0cmFzICAgIE51bWJlciBvZiBjaHVua3Mgd2l0aCBncmFpbnNpemUrMSBpdGVyYXRpb25zCisvLyB0YyAgICAgICAgSXRlcmF0aW9ucyBjb3VudAorLy8gdGFza19kdXAgIFRhc2tzIGR1cGxpY2F0aW9uIHJvdXRpbmUKK3ZvaWQgX19rbXBfdGFza2xvb3BfbGluZWFyKGlkZW50X3QgKmxvYywgaW50IGd0aWQsIGttcF90YXNrX3QgKnRhc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDY0ICpsYiwga21wX3VpbnQ2NCAqdWIsIGttcF9pbnQ2NCBzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgdWJfZ2xvYiwga21wX3VpbnQ2NCBudW1fdGFza3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDY0IGdyYWluc2l6ZSwga21wX3VpbnQ2NCBleHRyYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDY0IHRjLCB2b2lkICp0YXNrX2R1cCkgeworICBLTVBfQ09VTlRfQkxPQ0soT01QX1RBU0tMT09QKTsKKyAgS01QX1RJTUVfUEFSVElUSU9ORURfQkxPQ0soT01QX3Rhc2tsb29wX3NjaGVkdWxpbmcpOworICBwX3Rhc2tfZHVwX3QgcHRhc2tfZHVwID0gKHBfdGFza19kdXBfdCl0YXNrX2R1cDsKKyAga21wX3VpbnQ2NCBsb3dlciA9ICpsYjsgLy8gY29tcGlsZXIgcHJvdmlkZXMgZ2xvYmFsIGJvdW5kcyBoZXJlCisgIGttcF91aW50NjQgdXBwZXIgPSAqdWI7CisgIGttcF91aW50NjQgaTsKKyAga21wX2luZm9fdCAqdGhyZWFkID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAga21wX3Rhc2tkYXRhX3QgKmN1cnJlbnRfdGFzayA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrOworICBrbXBfdGFza190ICpuZXh0X3Rhc2s7CisgIGttcF9pbnQzMiBsYXN0cHJpdiA9IDA7CisgIHNpemVfdCBsb3dlcl9vZmZzZXQgPQorICAgICAgKGNoYXIgKilsYiAtIChjaGFyICopdGFzazsgLy8gcmVtZW1iZXIgb2Zmc2V0IG9mIGxiIGluIHRoZSB0YXNrIHN0cnVjdHVyZQorICBzaXplX3QgdXBwZXJfb2Zmc2V0ID0KKyAgICAgIChjaGFyICopdWIgLSAoY2hhciAqKXRhc2s7IC8vIHJlbWVtYmVyIG9mZnNldCBvZiB1YiBpbiB0aGUgdGFzayBzdHJ1Y3R1cmUKKworICBLTVBfREVCVUdfQVNTRVJUKHRjID09IG51bV90YXNrcyAqIGdyYWluc2l6ZSArIGV4dHJhcyk7CisgIEtNUF9ERUJVR19BU1NFUlQobnVtX3Rhc2tzID4gZXh0cmFzKTsKKyAgS01QX0RFQlVHX0FTU0VSVChudW1fdGFza3MgPiAwKTsKKyAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdGFza2xvb3BfbGluZWFyOiBUIyVkOiAlbGxkIHRhc2tzLCBncmFpbnNpemUgJWxsZCwgIgorICAgICAgICAgICAgICAgICJleHRyYXMgJWxsZCwgaT0lbGxkLCVsbGQoJWQpJWxsZCwgZHVwICVwXG4iLCBndGlkLCBudW1fdGFza3MsCisgICAgICAgICAgICAgICAgZ3JhaW5zaXplLCBleHRyYXMsIGxvd2VyLCB1cHBlciwgdWJfZ2xvYiwgc3QsIHRhc2tfZHVwKSk7CisKKyAgLy8gTGF1bmNoIG51bV90YXNrcyB0YXNrcywgYXNzaWduIGdyYWluc2l6ZSBpdGVyYXRpb25zIGVhY2ggdGFzaworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3Rhc2tzOyArK2kpIHsKKyAgICBrbXBfdWludDY0IGNodW5rX21pbnVzXzE7CisgICAgaWYgKGV4dHJhcyA9PSAwKSB7CisgICAgICBjaHVua19taW51c18xID0gZ3JhaW5zaXplIC0gMTsKKyAgICB9IGVsc2UgeworICAgICAgY2h1bmtfbWludXNfMSA9IGdyYWluc2l6ZTsKKyAgICAgIC0tZXh0cmFzOyAvLyBmaXJzdCBleHRyYXMgaXRlcmF0aW9ucyBnZXQgYmlnZ2VyIGNodW5rIChncmFpbnNpemUrMSkKKyAgICB9CisgICAgdXBwZXIgPSBsb3dlciArIHN0ICogY2h1bmtfbWludXNfMTsKKyAgICBpZiAoaSA9PSBudW1fdGFza3MgLSAxKSB7CisgICAgICAvLyBzY2hlZHVsZSB0aGUgbGFzdCB0YXNrLCBzZXQgbGFzdHByaXZhdGUgZmxhZyBpZiBuZWVkZWQKKyAgICAgIGlmIChzdCA9PSAxKSB7IC8vIG1vc3QgY29tbW9uIGNhc2UKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh1cHBlciA9PSAqdWIpOworICAgICAgICBpZiAodXBwZXIgPT0gdWJfZ2xvYikKKyAgICAgICAgICBsYXN0cHJpdiA9IDE7CisgICAgICB9IGVsc2UgaWYgKHN0ID4gMCkgeyAvLyBwb3NpdGl2ZSBsb29wIHN0cmlkZQorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKChrbXBfdWludDY0KXN0ID4gKnViIC0gdXBwZXIpOworICAgICAgICBpZiAoKGttcF91aW50NjQpc3QgPiB1Yl9nbG9iIC0gdXBwZXIpCisgICAgICAgICAgbGFzdHByaXYgPSAxOworICAgICAgfSBlbHNlIHsgIC8vIG5lZ2F0aXZlIGxvb3Agc3RyaWRlCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodXBwZXIgKyBzdCA8ICp1Yik7CisgICAgICAgIGlmICh1cHBlciAtIHViX2dsb2IgPCAoa21wX3VpbnQ2NCkoLXN0KSkKKyAgICAgICAgICBsYXN0cHJpdiA9IDE7CisgICAgICB9CisgICAgfQorICAgIG5leHRfdGFzayA9IF9fa21wX3Rhc2tfZHVwX2FsbG9jKHRocmVhZCwgdGFzayk7IC8vIGFsbG9jYXRlIG5ldyB0YXNrCisgICAgLy8gYWRqdXN0IHRhc2stc3BlY2lmaWMgYm91bmRzCisgICAgKihrbXBfdWludDY0ICopKChjaGFyICopbmV4dF90YXNrICsgbG93ZXJfb2Zmc2V0KSA9IGxvd2VyOworICAgICooa21wX3VpbnQ2NCAqKSgoY2hhciAqKW5leHRfdGFzayArIHVwcGVyX29mZnNldCkgPSB1cHBlcjsKKyAgICBpZiAocHRhc2tfZHVwICE9IE5VTEwpIC8vIHNldCBsYXN0cHJpdmF0ZSBmbGFnLCBjb25zdHJ1Y3QgZmlzdHByaXZhdGVzLCBldGMuCisgICAgICBwdGFza19kdXAobmV4dF90YXNrLCB0YXNrLCBsYXN0cHJpdik7CisgICAgS0FfVFJBQ0UoNDAsICgiX19rbXBfdGFza2xvb3BfbGluZWFyOiBUIyVkOyB0YXNrICVwOiBsb3dlciAlbGxkLCAiCisgICAgICAgICAgICAgICAgICAidXBwZXIgJWxsZCAob2Zmc2V0cyAlcCAlcClcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBuZXh0X3Rhc2ssIGxvd2VyLCB1cHBlciwgbG93ZXJfb2Zmc2V0LCB1cHBlcl9vZmZzZXQpKTsKKyAgICBfX2ttcF9vbXBfdGFzayhndGlkLCBuZXh0X3Rhc2ssIHRydWUpOyAvLyBzY2hlZHVsZSBuZXcgdGFzaworICAgIGxvd2VyID0gdXBwZXIgKyBzdDsgLy8gYWRqdXN0IGxvd2VyIGJvdW5kIGZvciB0aGUgbmV4dCBpdGVyYXRpb24KKyAgfQorICAvLyBmcmVlIHRoZSBwYXR0ZXJuIHRhc2sgYW5kIGV4aXQKKyAgX19rbXBfdGFza19zdGFydChndGlkLCB0YXNrLCBjdXJyZW50X3Rhc2spOyAvLyBtYWtlIGludGVybmFsIGJvb2trZWVwaW5nCisgIC8vIGRvIG5vdCBleGVjdXRlIHRoZSBwYXR0ZXJuIHRhc2ssIGp1c3QgZG8gaW50ZXJuYWwgYm9va2tlZXBpbmcKKyAgX19rbXBfdGFza19maW5pc2goZ3RpZCwgdGFzaywgY3VycmVudF90YXNrKTsKK30KKworLy8gU3RydWN0dXJlIHRvIGtlZXAgdGFza2xvb3AgcGFyYW1ldGVycyBmb3IgYXV4aWxpYXJ5IHRhc2sKKy8vIGtlcHQgaW4gdGhlIHNoYXJlZHMgb2YgdGhlIHRhc2sgc3RydWN0dXJlLgordHlwZWRlZiBzdHJ1Y3QgX190YXNrbG9vcF9wYXJhbXMgeworICBrbXBfdGFza190ICp0YXNrOworICBrbXBfdWludDY0ICpsYjsKKyAga21wX3VpbnQ2NCAqdWI7CisgIHZvaWQgKnRhc2tfZHVwOworICBrbXBfaW50NjQgc3Q7CisgIGttcF91aW50NjQgdWJfZ2xvYjsKKyAga21wX3VpbnQ2NCBudW1fdGFza3M7CisgIGttcF91aW50NjQgZ3JhaW5zaXplOworICBrbXBfdWludDY0IGV4dHJhczsKKyAga21wX3VpbnQ2NCB0YzsKKyAga21wX3VpbnQ2NCBudW1fdF9taW47Cit9IF9fdGFza2xvb3BfcGFyYW1zX3Q7CisKK3ZvaWQgX19rbXBfdGFza2xvb3BfcmVjdXIoaWRlbnRfdCAqLCBpbnQsIGttcF90YXNrX3QgKiwga21wX3VpbnQ2NCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDY0ICosIGttcF9pbnQ2NCwga21wX3VpbnQ2NCwga21wX3VpbnQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQ2NCwga21wX3VpbnQ2NCwga21wX3VpbnQ2NCwga21wX3VpbnQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKTsKKworLy8gRXhlY3V0ZSBwYXJ0IG9mIHRoZSB0aGUgdGFza2xvb3Agc3VibWl0dGVkIGFzIGEgdGFzay4KK2ludCBfX2ttcF90YXNrbG9vcF90YXNrKGludCBndGlkLCB2b2lkICpwdGFzaykgeworICBfX3Rhc2tsb29wX3BhcmFtc190ICpwID0gKF9fdGFza2xvb3BfcGFyYW1zX3QqKSgoa21wX3Rhc2tfdCopcHRhc2spLT5zaGFyZWRzOworICBrbXBfdGFza190ICp0YXNrID0gcC0+dGFzazsKKyAga21wX3VpbnQ2NCAqbGIgPSBwLT5sYjsKKyAga21wX3VpbnQ2NCAqdWIgPSBwLT51YjsKKyAgdm9pZCAqdGFza19kdXAgPSBwLT50YXNrX2R1cDsKKy8vICBwX3Rhc2tfZHVwX3QgcHRhc2tfZHVwID0gKHBfdGFza19kdXBfdCl0YXNrX2R1cDsKKyAga21wX2ludDY0IHN0ID0gcC0+c3Q7CisgIGttcF91aW50NjQgdWJfZ2xvYiA9IHAtPnViX2dsb2I7CisgIGttcF91aW50NjQgbnVtX3Rhc2tzID0gcC0+bnVtX3Rhc2tzOworICBrbXBfdWludDY0IGdyYWluc2l6ZSA9IHAtPmdyYWluc2l6ZTsKKyAga21wX3VpbnQ2NCBleHRyYXMgPSBwLT5leHRyYXM7CisgIGttcF91aW50NjQgdGMgPSBwLT50YzsKKyAga21wX3VpbnQ2NCBudW1fdF9taW4gPSBwLT5udW1fdF9taW47CisjaWYgS01QX0RFQlVHCisgIGttcF90YXNrZGF0YV90ICp0YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spOworICBLTVBfREVCVUdfQVNTRVJUKHRhc2sgIT0gTlVMTCk7CisgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3Rhc2tsb29wX3Rhc2s6IFQjJWQsIHRhc2sgJXA6ICVsbGQgdGFza3MsIGdyYWluc2l6ZSIKKyAgICAgICAgICAgICAgICAiICVsbGQsIGV4dHJhcyAlbGxkLCBpPSVsbGQsJWxsZCglZCksIGR1cCAlcFxuIiwgZ3RpZCwgdGFza2RhdGEsCisgICAgICAgICAgICAgICAgbnVtX3Rhc2tzLCBncmFpbnNpemUsIGV4dHJhcywgKmxiLCAqdWIsIHN0LCB0YXNrX2R1cCkpOworI2VuZGlmCisgIEtNUF9ERUJVR19BU1NFUlQobnVtX3Rhc2tzKjIrMSA+IG51bV90X21pbik7CisgIGlmIChudW1fdGFza3MgPiBudW1fdF9taW4pCisgICAgX19rbXBfdGFza2xvb3BfcmVjdXIoTlVMTCwgZ3RpZCwgdGFzaywgbGIsIHViLCBzdCwgdWJfZ2xvYiwgbnVtX3Rhc2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWluc2l6ZSwgZXh0cmFzLCB0YywgbnVtX3RfbWluLCB0YXNrX2R1cCk7CisgIGVsc2UKKyAgICBfX2ttcF90YXNrbG9vcF9saW5lYXIoTlVMTCwgZ3RpZCwgdGFzaywgbGIsIHViLCBzdCwgdWJfZ2xvYiwgbnVtX3Rhc2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBncmFpbnNpemUsIGV4dHJhcywgdGMsIHRhc2tfZHVwKTsKKworICBLQV9UUkFDRSg0MCwgKCJfX2ttcF90YXNrbG9vcF90YXNrKGV4aXQpOiBUIyVkXG4iLCBndGlkKSk7CisgIHJldHVybiAwOworfQorCisvLyBTY2hlZHVsZSBwYXJ0IG9mIHRoZSB0aGUgdGFza2xvb3AgYXMgYSB0YXNrLAorLy8gZXhlY3V0ZSB0aGUgcmVzdCBvZiB0aGUgdGhlIHRhc2tsb29wLgorLy8KKy8vIGxvYyAgICAgICBTb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KKy8vIGd0aWQgICAgICBHbG9iYWwgdGhyZWFkIElECisvLyB0YXNrICAgICAgUGF0dGVybiB0YXNrLCBleHBvc2VzIHRoZSBsb29wIGl0ZXJhdGlvbiByYW5nZQorLy8gbGIgICAgICAgIFBvaW50ZXIgdG8gbG9vcCBsb3dlciBib3VuZCBpbiB0YXNrIHN0cnVjdHVyZQorLy8gdWIgICAgICAgIFBvaW50ZXIgdG8gbG9vcCB1cHBlciBib3VuZCBpbiB0YXNrIHN0cnVjdHVyZQorLy8gc3QgICAgICAgIExvb3Agc3RyaWRlCisvLyB1Yl9nbG9iICAgR2xvYmFsIHVwcGVyIGJvdW5kICh1c2VkIGZvciBsYXN0cHJpdmF0ZSBjaGVjaykKKy8vIG51bV90YXNrcyBOdW1iZXIgb2YgdGFza3MgdG8gZXhlY3V0ZQorLy8gZ3JhaW5zaXplIE51bWJlciBvZiBsb29wIGl0ZXJhdGlvbnMgcGVyIHRhc2sKKy8vIGV4dHJhcyAgICBOdW1iZXIgb2YgY2h1bmtzIHdpdGggZ3JhaW5zaXplKzEgaXRlcmF0aW9ucworLy8gdGMgICAgICAgIEl0ZXJhdGlvbnMgY291bnQKKy8vIG51bV90X21pbiBUaHJlYXNob2xkIHRvIGxhdW5jaCB0YXNrcyByZWN1cnNpdmVseQorLy8gdGFza19kdXAgIFRhc2tzIGR1cGxpY2F0aW9uIHJvdXRpbmUKK3ZvaWQgX19rbXBfdGFza2xvb3BfcmVjdXIoaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwga21wX3Rhc2tfdCAqdGFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQ2NCAqbGIsIGttcF91aW50NjQgKnViLCBrbXBfaW50NjQgc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgdWJfZ2xvYiwga21wX3VpbnQ2NCBudW1fdGFza3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgZ3JhaW5zaXplLCBrbXBfdWludDY0IGV4dHJhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQ2NCB0Yywga21wX3VpbnQ2NCBudW1fdF9taW4sIHZvaWQgKnRhc2tfZHVwKSB7CisjaWYgS01QX0RFQlVHCisgIGttcF90YXNrZGF0YV90ICp0YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spOworICBLTVBfREVCVUdfQVNTRVJUKHRhc2sgIT0gTlVMTCk7CisgIEtNUF9ERUJVR19BU1NFUlQobnVtX3Rhc2tzID4gbnVtX3RfbWluKTsKKyAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdGFza2xvb3BfcmVjdXI6IFQjJWQsIHRhc2sgJXA6ICVsbGQgdGFza3MsIGdyYWluc2l6ZSIKKyAgICAgICAgICAgICAgICAiICVsbGQsIGV4dHJhcyAlbGxkLCBpPSVsbGQsJWxsZCglZCksIGR1cCAlcFxuIiwgZ3RpZCwgdGFza2RhdGEsCisgICAgICAgICAgICAgICAgbnVtX3Rhc2tzLCBncmFpbnNpemUsIGV4dHJhcywgKmxiLCAqdWIsIHN0LCB0YXNrX2R1cCkpOworI2VuZGlmCisgIHBfdGFza19kdXBfdCBwdGFza19kdXAgPSAocF90YXNrX2R1cF90KXRhc2tfZHVwOworICBrbXBfdWludDY0IGxvd2VyID0gKmxiOworICBrbXBfdWludDY0IHVwcGVyID0gKnViOworICBrbXBfaW5mb190ICp0aHJlYWQgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworLy8gIGttcF90YXNrZGF0YV90ICpjdXJyZW50X3Rhc2sgPSB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzazsKKyAga21wX3Rhc2tfdCAqbmV4dF90YXNrOworICBrbXBfaW50MzIgbGFzdHByaXYgPSAwOworICBzaXplX3QgbG93ZXJfb2Zmc2V0ID0KKyAgICAgIChjaGFyICopbGIgLSAoY2hhciAqKXRhc2s7IC8vIHJlbWVtYmVyIG9mZnNldCBvZiBsYiBpbiB0aGUgdGFzayBzdHJ1Y3R1cmUKKyAgc2l6ZV90IHVwcGVyX29mZnNldCA9CisgICAgICAoY2hhciAqKXViIC0gKGNoYXIgKil0YXNrOyAvLyByZW1lbWJlciBvZmZzZXQgb2YgdWIgaW4gdGhlIHRhc2sgc3RydWN0dXJlCisKKyAgS01QX0RFQlVHX0FTU0VSVCh0YyA9PSBudW1fdGFza3MgKiBncmFpbnNpemUgKyBleHRyYXMpOworICBLTVBfREVCVUdfQVNTRVJUKG51bV90YXNrcyA+IGV4dHJhcyk7CisgIEtNUF9ERUJVR19BU1NFUlQobnVtX3Rhc2tzID4gMCk7CisKKyAgLy8gc3BsaXQgdGhlIGxvb3AgaW4gdHdvIGhhbHZlcworICBrbXBfdWludDY0IGxiMSwgdWIwLCB0YzAsIHRjMSwgZXh0MCwgZXh0MTsKKyAga21wX3VpbnQ2NCBncl9zaXplMCA9IGdyYWluc2l6ZTsKKyAga21wX3VpbnQ2NCBuX3RzazAgPSBudW1fdGFza3MgPj4gMTsgLy8gbnVtX3Rhc2tzLzIgdG8gZXhlY3V0ZQorICBrbXBfdWludDY0IG5fdHNrMSA9IG51bV90YXNrcyAtIG5fdHNrMDsgLy8gdG8gc2NoZWR1bGUgYXMgYSB0YXNrCisgIGlmIChuX3RzazAgPD0gZXh0cmFzKSB7CisgICAgZ3Jfc2l6ZTArKzsgLy8gaW50ZWdyYXRlIGV4dHJhcyBpbnRvIGdyYWluc2l6ZQorICAgIGV4dDAgPSAwOyAvLyBubyBleHRyYSBpdGVycyBpbiAxc3QgaGFsZgorICAgIGV4dDEgPSBleHRyYXMgLSBuX3RzazA7IC8vIHJlbWFpbmluZyBleHRyYXMKKyAgICB0YzAgPSBncl9zaXplMCAqIG5fdHNrMDsKKyAgICB0YzEgPSB0YyAtIHRjMDsKKyAgfSBlbHNlIHsgLy8gbl90c2swID4gZXh0cmFzCisgICAgZXh0MSA9IDA7IC8vIG5vIGV4dHJhIGl0ZXJzIGluIDJuZCBoYWxmCisgICAgZXh0MCA9IGV4dHJhczsKKyAgICB0YzEgPSBncmFpbnNpemUgKiBuX3RzazE7CisgICAgdGMwID0gdGMgLSB0YzE7CisgIH0KKyAgdWIwID0gbG93ZXIgKyBzdCAqICh0YzAgLSAxKTsKKyAgbGIxID0gdWIwICsgc3Q7CisKKyAgLy8gY3JlYXRlIHBhdHRlcm4gdGFzayBmb3IgMm5kIGhhbGYgb2YgdGhlIGxvb3AKKyAgbmV4dF90YXNrID0gX19rbXBfdGFza19kdXBfYWxsb2ModGhyZWFkLCB0YXNrKTsgLy8gZHVwbGljYXRlIHRoZSB0YXNrCisgIC8vIGFkanVzdCBsb3dlciBib3VuZCAodXBwZXIgYm91bmQgaXMgbm90IGNoYW5nZWQpIGZvciB0aGUgMm5kIGhhbGYKKyAgKihrbXBfdWludDY0ICopKChjaGFyICopbmV4dF90YXNrICsgbG93ZXJfb2Zmc2V0KSA9IGxiMTsKKyAgaWYgKHB0YXNrX2R1cCAhPSBOVUxMKSAvLyBjb25zdHJ1Y3QgZmlzdHByaXZhdGVzLCBldGMuCisgICAgcHRhc2tfZHVwKG5leHRfdGFzaywgdGFzaywgMCk7CisgICp1YiA9IHViMDsgLy8gYWRqdXN0IHVwcGVyIGJvdW5kIGZvciB0aGUgMXN0IGhhbGYKKworICAvLyBjcmVhdGUgYXV4aWxpYXJ5IHRhc2sgZm9yIDJuZCBoYWxmIG9mIHRoZSBsb29wCisgIGttcF90YXNrX3QgKm5ld190YXNrID0KKyAgICAgIF9fa21wY19vbXBfdGFza19hbGxvYyhsb2MsIGd0aWQsIDEsIDMgKiBzaXplb2Yodm9pZCopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihfX3Rhc2tsb29wX3BhcmFtc190KSwgJl9fa21wX3Rhc2tsb29wX3Rhc2spOworICBfX3Rhc2tsb29wX3BhcmFtc190ICogcCA9IChfX3Rhc2tsb29wX3BhcmFtc190ICopbmV3X3Rhc2stPnNoYXJlZHM7CisgIHAtPnRhc2sgPSBuZXh0X3Rhc2s7CisgIHAtPmxiID0gKGttcF91aW50NjQgKikoKGNoYXIgKiluZXh0X3Rhc2sgKyBsb3dlcl9vZmZzZXQpOworICBwLT51YiA9IChrbXBfdWludDY0ICopKChjaGFyICopbmV4dF90YXNrICsgdXBwZXJfb2Zmc2V0KTsKKyAgcC0+dGFza19kdXAgPSB0YXNrX2R1cDsKKyAgcC0+c3QgPSBzdDsKKyAgcC0+dWJfZ2xvYiA9IHViX2dsb2I7CisgIHAtPm51bV90YXNrcyA9IG5fdHNrMTsKKyAgcC0+Z3JhaW5zaXplID0gZ3JhaW5zaXplOworICBwLT5leHRyYXMgPSBleHQxOworICBwLT50YyA9IHRjMTsKKyAgcC0+bnVtX3RfbWluID0gbnVtX3RfbWluOworICBfX2ttcF9vbXBfdGFzayhndGlkLCBuZXdfdGFzaywgdHJ1ZSk7IC8vIHNjaGVkdWxlIG5ldyB0YXNrCisKKyAgLy8gZXhlY3V0ZSB0aGUgMXN0IGhhbGYgb2YgY3VycmVudCBzdWJyYW5nZQorICBpZiAobl90c2swID4gbnVtX3RfbWluKQorICAgIF9fa21wX3Rhc2tsb29wX3JlY3VyKGxvYywgZ3RpZCwgdGFzaywgbGIsIHViLCBzdCwgdWJfZ2xvYiwgbl90c2swLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdyX3NpemUwLCBleHQwLCB0YzAsIG51bV90X21pbiwgdGFza19kdXApOworICBlbHNlCisgICAgX19rbXBfdGFza2xvb3BfbGluZWFyKGxvYywgZ3RpZCwgdGFzaywgbGIsIHViLCBzdCwgdWJfZ2xvYiwgbl90c2swLAorICAgICAgICAgICAgICAgICAgICAgICAgICBncl9zaXplMCwgZXh0MCwgdGMwLCB0YXNrX2R1cCk7CisKKyAgS0FfVFJBQ0UoNDAsICgiX19rbXBjX3Rhc2tsb29wX3JlY3VyKGV4aXQpOiBUIyVkXG4iLCBndGlkKSk7Cit9CisKKy8qIQorQGluZ3JvdXAgVEFTS0lORworQHBhcmFtIGxvYyAgICAgICBTb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBndGlkICAgICAgR2xvYmFsIHRocmVhZCBJRAorQHBhcmFtIHRhc2sgICAgICBUYXNrIHN0cnVjdHVyZQorQHBhcmFtIGlmX3ZhbCAgICBWYWx1ZSBvZiB0aGUgaWYgY2xhdXNlCitAcGFyYW0gbGIgICAgICAgIFBvaW50ZXIgdG8gbG9vcCBsb3dlciBib3VuZCBpbiB0YXNrIHN0cnVjdHVyZQorQHBhcmFtIHViICAgICAgICBQb2ludGVyIHRvIGxvb3AgdXBwZXIgYm91bmQgaW4gdGFzayBzdHJ1Y3R1cmUKK0BwYXJhbSBzdCAgICAgICAgTG9vcCBzdHJpZGUKK0BwYXJhbSBub2dyb3VwICAgRmxhZywgMSBpZiBub2dyb3VwIGNsYXVzZSBzcGVjaWZpZWQsIDAgb3RoZXJ3aXNlCitAcGFyYW0gc2NoZWQgICAgIFNjaGVkdWxlIHNwZWNpZmllZCAwLzEvMiBmb3Igbm9uZS9ncmFpbnNpemUvbnVtX3Rhc2tzCitAcGFyYW0gZ3JhaW5zaXplIFNjaGVkdWxlIHZhbHVlIGlmIHNwZWNpZmllZAorQHBhcmFtIHRhc2tfZHVwICBUYXNrcyBkdXBsaWNhdGlvbiByb3V0aW5lCisKK0V4ZWN1dGUgdGhlIHRhc2tsb29wIGNvbnN0cnVjdC4KKyovCit2b2lkIF9fa21wY190YXNrbG9vcChpZGVudF90ICpsb2MsIGludCBndGlkLCBrbXBfdGFza190ICp0YXNrLCBpbnQgaWZfdmFsLAorICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQ2NCAqbGIsIGttcF91aW50NjQgKnViLCBrbXBfaW50NjQgc3QsIGludCBub2dyb3VwLAorICAgICAgICAgICAgICAgICAgICAgaW50IHNjaGVkLCBrbXBfdWludDY0IGdyYWluc2l6ZSwgdm9pZCAqdGFza19kdXApIHsKKyAga21wX3Rhc2tkYXRhX3QgKnRhc2tkYXRhID0gS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzayk7CisgIEtNUF9ERUJVR19BU1NFUlQodGFzayAhPSBOVUxMKTsKKworICBLQV9UUkFDRSgyMCwgKCJfX2ttcGNfdGFza2xvb3A6IFQjJWQsIHRhc2sgJXAsIGxiICVsbGQsIHViICVsbGQsIHN0ICVsbGQsICIKKyAgICAgICAgICAgICAgICAiZ3JhaW4gJWxsdSglZCksIGR1cCAlcFxuIiwgZ3RpZCwgdGFza2RhdGEsICpsYiwgKnViLCBzdCwKKyAgICAgICAgICAgICAgICBncmFpbnNpemUsIHNjaGVkLCB0YXNrX2R1cCkpOworCisgIGlmIChub2dyb3VwID09IDApCisgICAgX19rbXBjX3Rhc2tncm91cChsb2MsIGd0aWQpOworCisgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgLy8gY2FsY3VsYXRlIGxvb3AgcGFyYW1ldGVycworICBrbXBfdWludDY0IHRjOworICBrbXBfdWludDY0IGxvd2VyID0gKmxiOyAvLyBjb21waWxlciBwcm92aWRlcyBnbG9iYWwgYm91bmRzIGhlcmUKKyAga21wX3VpbnQ2NCB1cHBlciA9ICp1YjsKKyAga21wX3VpbnQ2NCB1Yl9nbG9iID0gdXBwZXI7IC8vIGdsb2JhbCB1cHBlciB1c2VkIHRvIGNhbGMgbGFzdHByaXZhdGUgZmxhZworICBrbXBfdWludDY0IG51bV90YXNrcyA9IDAsIGV4dHJhcyA9IDA7CisgIGttcF91aW50NjQgbnVtX3Rhc2tzX21pbiA9IF9fa21wX3Rhc2tsb29wX21pbl90YXNrczsKKyAga21wX2luZm9fdCAqdGhyZWFkID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAga21wX3Rhc2tkYXRhX3QgKmN1cnJlbnRfdGFzayA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrOworCisgIC8vIGNvbXB1dGUgdHJpcCBjb3VudAorICBpZiAoc3QgPT0gMSkgeyAvLyBtb3N0IGNvbW1vbiBjYXNlCisgICAgdGMgPSB1cHBlciAtIGxvd2VyICsgMTsKKyAgfSBlbHNlIGlmIChzdCA8IDApIHsKKyAgICB0YyA9IChsb3dlciAtIHVwcGVyKSAvICgtc3QpICsgMTsKKyAgfSBlbHNlIHsgLy8gc3QgPiAwCisgICAgdGMgPSAodXBwZXIgLSBsb3dlcikgLyBzdCArIDE7CisgIH0KKyAgaWYgKHRjID09IDApIHsKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcGNfdGFza2xvb3AoZXhpdCk6IFQjJWQgemVyby10cmlwIGxvb3BcbiIsIGd0aWQpKTsKKyAgICAvLyBmcmVlIHRoZSBwYXR0ZXJuIHRhc2sgYW5kIGV4aXQKKyAgICBfX2ttcF90YXNrX3N0YXJ0KGd0aWQsIHRhc2ssIGN1cnJlbnRfdGFzayk7CisgICAgLy8gZG8gbm90IGV4ZWN1dGUgYW55dGhpbmcgZm9yIHplcm8tdHJpcCBsb29wCisgICAgX19rbXBfdGFza19maW5pc2goZ3RpZCwgdGFzaywgY3VycmVudF90YXNrKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG51bV90YXNrc19taW4gPT0gMCkKKyAgICAvLyBUT0RPOiBjYW4gd2UgY2hvb3NlIGJldHRlciBkZWZhdWx0IGhldXJpc3RpYz8KKyAgICBudW1fdGFza3NfbWluID0gS01QX01JTih0aHJlYWQtPnRoLnRoX3RlYW1fbnByb2MgKiAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTklUSUFMX1RBU0tfREVRVUVfU0laRSk7CisKKyAgLy8gY29tcHV0ZSBudW1fdGFza3MvZ3JhaW5zaXplIGJhc2VkIG9uIHRoZSBpbnB1dCBwcm92aWRlZAorICBzd2l0Y2ggKHNjaGVkKSB7CisgIGNhc2UgMDogLy8gbm8gc2NoZWR1bGUgY2xhdXNlIHNwZWNpZmllZCwgd2UgY2FuIGNob29zZSB0aGUgZGVmYXVsdAorICAgIC8vIGxldCdzIHRyeSB0byBzY2hlZHVsZSAodGVhbV9zaXplKjEwKSB0YXNrcworICAgIGdyYWluc2l6ZSA9IHRocmVhZC0+dGgudGhfdGVhbV9ucHJvYyAqIDEwOworICBjYXNlIDI6IC8vIG51bV90YXNrcyBwcm92aWRlZAorICAgIGlmIChncmFpbnNpemUgPiB0YykgeworICAgICAgbnVtX3Rhc2tzID0gdGM7IC8vIHRvbyBiaWcgbnVtX3Rhc2tzIHJlcXVlc3RlZCwgYWRqdXN0IHZhbHVlcworICAgICAgZ3JhaW5zaXplID0gMTsKKyAgICAgIGV4dHJhcyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIG51bV90YXNrcyA9IGdyYWluc2l6ZTsKKyAgICAgIGdyYWluc2l6ZSA9IHRjIC8gbnVtX3Rhc2tzOworICAgICAgZXh0cmFzID0gdGMgJSBudW1fdGFza3M7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIDE6IC8vIGdyYWluc2l6ZSBwcm92aWRlZAorICAgIGlmIChncmFpbnNpemUgPiB0YykgeworICAgICAgbnVtX3Rhc2tzID0gMTsgLy8gdG9vIGJpZyBncmFpbnNpemUgcmVxdWVzdGVkLCBhZGp1c3QgdmFsdWVzCisgICAgICBncmFpbnNpemUgPSB0YzsKKyAgICAgIGV4dHJhcyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIG51bV90YXNrcyA9IHRjIC8gZ3JhaW5zaXplOworICAgICAgLy8gYWRqdXN0IGdyYWluc2l6ZSBmb3IgYmFsYW5jZWQgZGlzdHJpYnV0aW9uIG9mIGl0ZXJhdGlvbnMKKyAgICAgIGdyYWluc2l6ZSA9IHRjIC8gbnVtX3Rhc2tzOworICAgICAgZXh0cmFzID0gdGMgJSBudW1fdGFza3M7CisgICAgfQorICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIEtNUF9BU1NFUlQyKDAsICJ1bmtub3duIHNjaGVkdWxpbmcgb2YgdGFza2xvb3AiKTsKKyAgfQorICBLTVBfREVCVUdfQVNTRVJUKHRjID09IG51bV90YXNrcyAqIGdyYWluc2l6ZSArIGV4dHJhcyk7CisgIEtNUF9ERUJVR19BU1NFUlQobnVtX3Rhc2tzID4gZXh0cmFzKTsKKyAgS01QX0RFQlVHX0FTU0VSVChudW1fdGFza3MgPiAwKTsKKyAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIC8vIGNoZWNrIGlmIGNsYXVzZSB2YWx1ZSBmaXJzdAorICBpZiAoaWZfdmFsID09IDApIHsgLy8gaWYoMCkgc3BlY2lmaWVkLCBtYXJrIHRhc2sgYXMgc2VyaWFsCisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLnRhc2tfc2VyaWFsID0gMTsKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MudGllZG5lc3MgPSBUQVNLX1RJRUQ7IC8vIEFDOiBzZXJpYWwgdGFzayBjYW5ub3QgYmUgdW50aWVkCisgICAgLy8gYWx3YXlzIHN0YXJ0IHNlcmlhbCB0YXNrcyBsaW5lYXJseQorICAgIF9fa21wX3Rhc2tsb29wX2xpbmVhcihsb2MsIGd0aWQsIHRhc2ssIGxiLCB1Yiwgc3QsIHViX2dsb2IsIG51bV90YXNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhaW5zaXplLCBleHRyYXMsIHRjLCB0YXNrX2R1cCk7CisgIH0gZWxzZSBpZiAobnVtX3Rhc2tzID4gbnVtX3Rhc2tzX21pbikgeworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wY190YXNrbG9vcDogVCMlZCwgZ28gcmVjdXJzaXZlOiB0YyAlbGx1LCAjdGFza3MgJWxsdSIKKyAgICAgICAgICAgICAgICAgICIoJWxsZCksIGdyYWluICVsbHUsIGV4dHJhcyAlbGx1XG4iLCBndGlkLCB0YywgbnVtX3Rhc2tzLAorICAgICAgICAgICAgICAgICAgbnVtX3Rhc2tzX21pbiwgZ3JhaW5zaXplLCBleHRyYXMpKTsKKyAgICBfX2ttcF90YXNrbG9vcF9yZWN1cihsb2MsIGd0aWQsIHRhc2ssIGxiLCB1Yiwgc3QsIHViX2dsb2IsIG51bV90YXNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBncmFpbnNpemUsIGV4dHJhcywgdGMsIG51bV90YXNrc19taW4sIHRhc2tfZHVwKTsKKyAgfSBlbHNlIHsKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcGNfdGFza2xvb3A6IFQjJWQsIGdvIGxpbmVhcjogdGMgJWxsdSwgI3Rhc2tzICVsbHUiCisgICAgICAgICAgICAgICAgICAiKCVsbGQpLCBncmFpbiAlbGx1LCBleHRyYXMgJWxsdVxuIiwgZ3RpZCwgdGMsIG51bV90YXNrcywKKyAgICAgICAgICAgICAgICAgIG51bV90YXNrc19taW4sIGdyYWluc2l6ZSwgZXh0cmFzKSk7CisgICAgX19rbXBfdGFza2xvb3BfbGluZWFyKGxvYywgZ3RpZCwgdGFzaywgbGIsIHViLCBzdCwgdWJfZ2xvYiwgbnVtX3Rhc2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBncmFpbnNpemUsIGV4dHJhcywgdGMsIHRhc2tfZHVwKTsKKyAgfQorCisgIGlmIChub2dyb3VwID09IDApCisgICAgX19rbXBjX2VuZF90YXNrZ3JvdXAobG9jLCBndGlkKTsKKyAgS0FfVFJBQ0UoMjAsICgiX19rbXBjX3Rhc2tsb29wKGV4aXQpOiBUIyVkXG4iLCBndGlkKSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3Rhc2txLmNwcCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF90YXNrcS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRiN2JjZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF90YXNrcS5jcHAKQEAgLTAsMCArMSwyMDMxIEBACisvKgorICoga21wX3Rhc2txLmNwcCAtLSBUQVNLUSBzdXBwb3J0IGZvciBPcGVuTVAuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfZXJyb3IuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pby5oIgorCisjZGVmaW5lIE1BWF9NRVNTQUdFIDUxMgorCisvKiBUYXNrcSByb3V0aW5lcyBhbmQgZ2xvYmFsIHZhcmlhYmxlcyAqLworCisjZGVmaW5lIEtNUF9ERUJVR19SRUZfQ1RTKHgpIEtGX1RSQUNFKDEsIHgpOworCisjZGVmaW5lIFRIUkVBRF9BTExPQ19GT1JfVEFTS1EKKworc3RhdGljIGludCBpbl9wYXJhbGxlbF9jb250ZXh0KGttcF90ZWFtX3QgKnRlYW0pIHsKKyAgcmV0dXJuICF0ZWFtLT50LnRfc2VyaWFsaXplZDsKK30KKworc3RhdGljIHZvaWQgX19rbXBfdGFza3FfZW8oaW50ICpndGlkX3JlZiwgaW50ICpjaWRfcmVmLCBpZGVudF90ICpsb2NfcmVmKSB7CisgIGludCBndGlkID0gKmd0aWRfcmVmOworICBpbnQgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKyAga21wX3VpbnQzMiBteV90b2tlbjsKKyAga21wY190YXNrX3F1ZXVlX3QgKnRhc2txOworICBrbXBfdGFza3FfdCAqdHEgPSAmX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbS0+dC50X3Rhc2txOworCisgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICBfX2ttcF9wdXNoX3N5bmMoZ3RpZCwgY3Rfb3JkZXJlZF9pbl90YXNrcSwgbG9jX3JlZiwgTlVMTCwgMCk7CisjZWxzZQorICAgIF9fa21wX3B1c2hfc3luYyhndGlkLCBjdF9vcmRlcmVkX2luX3Rhc2txLCBsb2NfcmVmLCBOVUxMKTsKKyNlbmRpZgorCisgIGlmICghX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbS0+dC50X3NlcmlhbGl6ZWQpIHsKKyAgICBLTVBfTUIoKTsgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIC8qIEdFSCAtIG5lZWQgY2hlY2sgaGVyZSB1bmRlciBzdGF0cyB0byBtYWtlIHN1cmUgICAqLworICAgIC8qICAgICAgIGluc2lkZSB0YXNrIChjdXJyX3RodW5rWyp0aWRfcmVmXSAhPSBOVUxMKSAqLworCisgICAgbXlfdG9rZW4gPSB0cS0+dHFfY3Vycl90aHVua1t0aWRdLT50aF90YXNrbnVtOworCisgICAgdGFza3EgPSB0cS0+dHFfY3Vycl90aHVua1t0aWRdLT50aC50aF9zaGFyZWRzLT5zdl9xdWV1ZTsKKworICAgIEtNUF9XQUlUX1lJRUxEKCZ0YXNrcS0+dHFfdGFza251bV9zZXJ2aW5nLCBteV90b2tlbiwgS01QX0VRLCBOVUxMKTsKKyAgICBLTVBfTUIoKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBfX2ttcF90YXNrcV94byhpbnQgKmd0aWRfcmVmLCBpbnQgKmNpZF9yZWYsIGlkZW50X3QgKmxvY19yZWYpIHsKKyAgaW50IGd0aWQgPSAqZ3RpZF9yZWY7CisgIGludCB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworICBrbXBfdWludDMyIG15X3Rva2VuOworICBrbXBfdGFza3FfdCAqdHEgPSAmX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbS0+dC50X3Rhc2txOworCisgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spCisgICAgX19rbXBfcG9wX3N5bmMoZ3RpZCwgY3Rfb3JkZXJlZF9pbl90YXNrcSwgbG9jX3JlZik7CisKKyAgaWYgKCFfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF90ZWFtLT50LnRfc2VyaWFsaXplZCkgeworICAgIEtNUF9NQigpOyAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgLyogR0VIIC0gbmVlZCBjaGVjayBoZXJlIHVuZGVyIHN0YXRzIHRvIG1ha2Ugc3VyZSAqLworICAgIC8qICAgICAgIGluc2lkZSB0YXNrIChjdXJyX3RodW5rW3RpZF0gIT0gTlVMTCkgICAgKi8KKworICAgIG15X3Rva2VuID0gdHEtPnRxX2N1cnJfdGh1bmtbdGlkXS0+dGhfdGFza251bTsKKworICAgIEtNUF9NQigpOyAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgdHEtPnRxX2N1cnJfdGh1bmtbdGlkXS0+dGgudGhfc2hhcmVkcy0+c3ZfcXVldWUtPnRxX3Rhc2tudW1fc2VydmluZyA9CisgICAgICAgIG15X3Rva2VuICsgMTsKKworICAgIEtNUF9NQigpOyAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworICB9Cit9CisKK3N0YXRpYyB2b2lkIF9fa21wX3Rhc2txX2NoZWNrX29yZGVyZWQoa21wX2ludDMyIGd0aWQsIGttcGNfdGh1bmtfdCAqdGh1bmspIHsKKyAga21wX3VpbnQzMiBteV90b2tlbjsKKyAga21wY190YXNrX3F1ZXVlX3QgKnRhc2txOworCisgIC8qIGFzc3VtZSB3ZSBhcmUgYWx3YXlzIGNhbGxlZCBmcm9tIGFuIGFjdGl2ZSBwYXJhbGxlbCBjb250ZXh0ICovCisKKyAgS01QX01CKCk7IC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgbXlfdG9rZW4gPSB0aHVuay0+dGhfdGFza251bTsKKworICB0YXNrcSA9IHRodW5rLT50aC50aF9zaGFyZWRzLT5zdl9xdWV1ZTsKKworICBpZiAodGFza3EtPnRxX3Rhc2tudW1fc2VydmluZyA8PSBteV90b2tlbikgeworICAgIEtNUF9XQUlUX1lJRUxEKCZ0YXNrcS0+dHFfdGFza251bV9zZXJ2aW5nLCBteV90b2tlbiwgS01QX0dFLCBOVUxMKTsKKyAgICBLTVBfTUIoKTsKKyAgICB0YXNrcS0+dHFfdGFza251bV9zZXJ2aW5nID0gbXlfdG9rZW4gKyAxOworICAgIEtNUF9NQigpOworICB9Cit9CisKKyNpZmRlZiBLTVBfREVCVUcKKworc3RhdGljIHZvaWQgX19rbXBfZHVtcF9UUUYoa21wX2ludDMyIGZsYWdzKSB7CisgIGlmIChmbGFncyAmIFRRRl9JU19PUkRFUkVEKQorICAgIF9fa21wX3ByaW50ZigiT1JERVJFRCAiKTsKKyAgaWYgKGZsYWdzICYgVFFGX0lTX0xBU1RQUklWQVRFKQorICAgIF9fa21wX3ByaW50ZigiTEFTVF9QUklWICIpOworICBpZiAoZmxhZ3MgJiBUUUZfSVNfTk9XQUlUKQorICAgIF9fa21wX3ByaW50ZigiTk9XQUlUICIpOworICBpZiAoZmxhZ3MgJiBUUUZfSEVVUklTVElDUykKKyAgICBfX2ttcF9wcmludGYoIkhFVVJJU1QgIik7CisgIGlmIChmbGFncyAmIFRRRl9JTlRFUkZBQ0VfUkVTRVJWRUQxKQorICAgIF9fa21wX3ByaW50ZigiUkVTRVJWMSAiKTsKKyAgaWYgKGZsYWdzICYgVFFGX0lOVEVSRkFDRV9SRVNFUlZFRDIpCisgICAgX19rbXBfcHJpbnRmKCJSRVNFUlYyICIpOworICBpZiAoZmxhZ3MgJiBUUUZfSU5URVJGQUNFX1JFU0VSVkVEMykKKyAgICBfX2ttcF9wcmludGYoIlJFU0VSVjMgIik7CisgIGlmIChmbGFncyAmIFRRRl9JTlRFUkZBQ0VfUkVTRVJWRUQ0KQorICAgIF9fa21wX3ByaW50ZigiUkVTRVJWNCAiKTsKKyAgaWYgKGZsYWdzICYgVFFGX0lTX0xBU1RfVEFTSykKKyAgICBfX2ttcF9wcmludGYoIkxBU1RfVEFTSyAiKTsKKyAgaWYgKGZsYWdzICYgVFFGX1RBU0tRX1RBU0spCisgICAgX19rbXBfcHJpbnRmKCJUQVNLUV9UQVNLICIpOworICBpZiAoZmxhZ3MgJiBUUUZfUkVMRUFTRV9XT1JLRVJTKQorICAgIF9fa21wX3ByaW50ZigiUkVMRUFTRSAiKTsKKyAgaWYgKGZsYWdzICYgVFFGX0FMTF9UQVNLU19RVUVVRUQpCisgICAgX19rbXBfcHJpbnRmKCJBTExfUVVFVUVEICIpOworICBpZiAoZmxhZ3MgJiBUUUZfUEFSQUxMRUxfQ09OVEVYVCkKKyAgICBfX2ttcF9wcmludGYoIlBBUkFMTEVMICIpOworICBpZiAoZmxhZ3MgJiBUUUZfREVBTExPQ0FURUQpCisgICAgX19rbXBfcHJpbnRmKCJERUFMTE9DICIpOworICBpZiAoIShmbGFncyAmIChUUUZfSU5URVJOQUxfRkxBR1MgfCBUUUZfSU5URVJGQUNFX0ZMQUdTKSkpCisgICAgX19rbXBfcHJpbnRmKCIoTk9ORSkiKTsKK30KKworc3RhdGljIHZvaWQgX19rbXBfZHVtcF90aHVuayhrbXBfdGFza3FfdCAqdHEsIGttcGNfdGh1bmtfdCAqdGh1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBnbG9iYWxfdGlkKSB7CisgIGludCBpOworICBpbnQgbnByb2MgPSBfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdLT50aC50aF90ZWFtLT50LnRfbnByb2M7CisKKyAgX19rbXBfcHJpbnRmKCJcdFRodW5rIGF0ICVwIG9uICglZCk6ICAiLCB0aHVuaywgZ2xvYmFsX3RpZCk7CisKKyAgaWYgKHRodW5rICE9IE5VTEwpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnByb2M7IGkrKykgeworICAgICAgaWYgKHRxLT50cV9jdXJyX3RodW5rW2ldID09IHRodW5rKSB7CisgICAgICAgIF9fa21wX3ByaW50ZigiWyVpXSAiLCBpKTsKKyAgICAgIH0KKyAgICB9CisgICAgX19rbXBfcHJpbnRmKCJ0aF9zaGFyZWRzPSVwLCAiLCB0aHVuay0+dGgudGhfc2hhcmVkcyk7CisgICAgX19rbXBfcHJpbnRmKCJ0aF90YXNrPSVwLCAiLCB0aHVuay0+dGhfdGFzayk7CisgICAgX19rbXBfcHJpbnRmKCJ0aF9lbmNsX3RodW5rPSVwLCAiLCB0aHVuay0+dGhfZW5jbF90aHVuayk7CisgICAgX19rbXBfcHJpbnRmKCJ0aF9zdGF0dXM9JWQsICIsIHRodW5rLT50aF9zdGF0dXMpOworICAgIF9fa21wX3ByaW50ZigidGhfdGFza251bT0ldSwgIiwgdGh1bmstPnRoX3Rhc2tudW0pOworICAgIF9fa21wX3ByaW50ZigidGhfZmxhZ3M9Iik7CisgICAgX19rbXBfZHVtcF9UUUYodGh1bmstPnRoX2ZsYWdzKTsKKyAgfQorCisgIF9fa21wX3ByaW50ZigiXG4iKTsKK30KKworc3RhdGljIHZvaWQgX19rbXBfZHVtcF90aHVua19zdGFjayhrbXBjX3RodW5rX3QgKnRodW5rLCBrbXBfaW50MzIgdGhyZWFkX251bSkgeworICBrbXBjX3RodW5rX3QgKnRoOworCisgIF9fa21wX3ByaW50ZigiICAgIFRodW5rIHN0YWNrIGZvciBUIyVkOiAgIiwgdGhyZWFkX251bSk7CisKKyAgZm9yICh0aCA9IHRodW5rOyB0aCAhPSBOVUxMOyB0aCA9IHRoLT50aF9lbmNsX3RodW5rKQorICAgIF9fa21wX3ByaW50ZigiJXAgIiwgdGgpOworCisgIF9fa21wX3ByaW50ZigiXG4iKTsKK30KKworc3RhdGljIHZvaWQgX19rbXBfZHVtcF90YXNrX3F1ZXVlKGttcF90YXNrcV90ICp0cSwga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBnbG9iYWxfdGlkKSB7CisgIGludCBxcywgY291bnQsIGk7CisgIGttcGNfdGh1bmtfdCAqdGh1bms7CisgIGttcGNfdGFza19xdWV1ZV90ICp0YXNrcTsKKworICBfX2ttcF9wcmludGYoIlRhc2sgUXVldWUgYXQgJXAgb24gKCVkKTpcbiIsIHF1ZXVlLCBnbG9iYWxfdGlkKTsKKworICBpZiAocXVldWUgIT0gTlVMTCkgeworICAgIGludCBpbl9wYXJhbGxlbCA9IHF1ZXVlLT50cV9mbGFncyAmIFRRRl9QQVJBTExFTF9DT05URVhUOworCisgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfbG9jICAgICAgICAgICAgIDogIik7CisgICAgfQorICAgIGlmIChpbl9wYXJhbGxlbCkgeworCisgICAgICAvLyBpZiAocXVldWUtPnRxLnRxX3BhcmVudCAhPSAwKQorICAgICAgLy9fX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgIC8vX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgLy8gTWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbQorICAgICAgLy8gU2VlbXMgdG8gd29yayB3aXRob3V0IHRoaXMgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMAorICAgICAgS01QX01CKCk7CisKKyAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX3BhcmVudCAgICAgICAgICA6ICVwXG4iLCBxdWV1ZS0+dHEudHFfcGFyZW50KTsKKyAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX2ZpcnN0X2NoaWxkICAgICA6ICVwXG4iLCBxdWV1ZS0+dHFfZmlyc3RfY2hpbGQpOworICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfbmV4dF9jaGlsZCAgICAgIDogJXBcbiIsIHF1ZXVlLT50cV9uZXh0X2NoaWxkKTsKKyAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX3ByZXZfY2hpbGQgICAgICA6ICVwXG4iLCBxdWV1ZS0+dHFfcHJldl9jaGlsZCk7CisgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9yZWZfY291bnQgICAgICAgOiAlZFxuIiwgcXVldWUtPnRxX3JlZl9jb3VudCk7CisKKyAgICAgIC8vX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgLy8gaWYgKHF1ZXVlLT50cS50cV9wYXJlbnQgIT0gMCkKKyAgICAgIC8vX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAvL19fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cV9mcmVlX3RodW5rc19sY2ssIGdsb2JhbF90aWQpOworICAgICAgLy9fX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgLy8gTWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbQorICAgICAgLy8gU2VlbXMgdG8gd29yayB3aXRob3V0IHRoaXMgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMAorICAgICAgS01QX01CKCk7CisgICAgfQorCisgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfc2hhcmVkcyAgICAgICAgIDogIik7CisgICAgZm9yIChpID0gMDsgaSA8ICgocXVldWUgPT0gdHEtPnRxX3Jvb3QpID8gcXVldWUtPnRxX25wcm9jIDogMSk7IGkrKykKKyAgICAgIF9fa21wX3ByaW50ZigiJXAgIiwgcXVldWUtPnRxX3NoYXJlZHNbaV0uYWlfZGF0YSk7CisgICAgX19rbXBfcHJpbnRmKCJcbiIpOworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV90YXNrbnVtX3F1ZXVpbmcgOiAldVxuIiwgcXVldWUtPnRxX3Rhc2tudW1fcXVldWluZyk7CisgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV90YXNrbnVtX3NlcnZpbmcgOiAldVxuIiwgcXVldWUtPnRxX3Rhc2tudW1fc2VydmluZyk7CisgICAgfQorCisgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfcXVldWUgICAgICAgICAgIDogJXBcbiIsIHF1ZXVlLT50cV9xdWV1ZSk7CisgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfdGh1bmtfc3BhY2UgICAgIDogJXBcbiIsIHF1ZXVlLT50cV90aHVua19zcGFjZSk7CisgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfdGFza3Ffc2xvdCAgICAgIDogJXBcbiIsIHF1ZXVlLT50cV90YXNrcV9zbG90KTsKKworICAgIF9fa21wX3ByaW50ZigiICAgIHRxX2ZyZWVfdGh1bmtzICAgICA6ICIpOworICAgIGZvciAodGh1bmsgPSBxdWV1ZS0+dHFfZnJlZV90aHVua3M7IHRodW5rICE9IE5VTEw7CisgICAgICAgICB0aHVuayA9IHRodW5rLT50aC50aF9uZXh0X2ZyZWUpCisgICAgICBfX2ttcF9wcmludGYoIiVwICIsIHRodW5rKTsKKyAgICBfX2ttcF9wcmludGYoIlxuIik7CisKKyAgICBfX2ttcF9wcmludGYoIiAgICB0cV9uc2xvdHMgICAgICAgICAgOiAlZFxuIiwgcXVldWUtPnRxX25zbG90cyk7CisgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfaGVhZCAgICAgICAgICAgIDogJWRcbiIsIHF1ZXVlLT50cV9oZWFkKTsKKyAgICBfX2ttcF9wcmludGYoIiAgICB0cV90YWlsICAgICAgICAgICAgOiAlZFxuIiwgcXVldWUtPnRxX3RhaWwpOworICAgIF9fa21wX3ByaW50ZigiICAgIHRxX25mdWxsICAgICAgICAgICA6ICVkXG4iLCBxdWV1ZS0+dHFfbmZ1bGwpOworICAgIF9fa21wX3ByaW50ZigiICAgIHRxX2hpd2F0ICAgICAgICAgICA6ICVkXG4iLCBxdWV1ZS0+dHFfaGl3YXQpOworICAgIF9fa21wX3ByaW50ZigiICAgIHRxX2ZsYWdzICAgICAgICAgICA6ICIpOworICAgIF9fa21wX2R1bXBfVFFGKHF1ZXVlLT50cV9mbGFncyk7CisgICAgX19rbXBfcHJpbnRmKCJcbiIpOworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV90aF90aHVua3MgICAgICAgOiAiKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBxdWV1ZS0+dHFfbnByb2M7IGkrKykgeworICAgICAgICBfX2ttcF9wcmludGYoIiVkICIsIHF1ZXVlLT50cV90aF90aHVua3NbaV0uYWlfZGF0YSk7CisgICAgICB9CisgICAgICBfX2ttcF9wcmludGYoIlxuIik7CisgICAgfQorCisgICAgX19rbXBfcHJpbnRmKCJcbiIpOworICAgIF9fa21wX3ByaW50ZigiICAgIFF1ZXVlIHNsb3RzOlxuIik7CisKKyAgICBxcyA9IHF1ZXVlLT50cV90YWlsOworICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHF1ZXVlLT50cV9uZnVsbDsgKytjb3VudCkgeworICAgICAgX19rbXBfcHJpbnRmKCIoJWQpIiwgcXMpOworICAgICAgX19rbXBfZHVtcF90aHVuayh0cSwgcXVldWUtPnRxX3F1ZXVlW3FzXS5xc190aHVuaywgZ2xvYmFsX3RpZCk7CisgICAgICBxcyA9IChxcyArIDEpICUgcXVldWUtPnRxX25zbG90czsKKyAgICB9CisKKyAgICBfX2ttcF9wcmludGYoIlxuIik7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgIGlmIChxdWV1ZS0+dHFfdGFza3Ffc2xvdCAhPSBOVUxMKSB7CisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIFRhc2tRIHNsb3Q6XG4iKTsKKyAgICAgICAgX19rbXBfZHVtcF90aHVuayh0cSwgQ0NBU1Qoa21wY190aHVua190ICosIHF1ZXVlLT50cV90YXNrcV9zbG90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCJcbiIpOworICAgICAgfQorICAgICAgLy9fX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgIC8vX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxX2ZyZWVfdGh1bmtzX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgfQorICB9CisKKyAgX19rbXBfcHJpbnRmKCIgICAgVGFza3EgZnJlZWxpc3Q6ICIpOworCisgIC8vX19rbXBfYWNxdWlyZV9sb2NrKCAmIHRxLT50cV9mcmVlbGlzdF9sY2ssIGdsb2JhbF90aWQgKTsKKworICAvLyBNYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtCisgIC8vIFNlZW1zIHRvIHdvcmsgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMAorICBLTVBfTUIoKTsKKworICBmb3IgKHRhc2txID0gdHEtPnRxX2ZyZWVsaXN0OyB0YXNrcSAhPSBOVUxMOyB0YXNrcSA9IHRhc2txLT50cS50cV9uZXh0X2ZyZWUpCisgICAgX19rbXBfcHJpbnRmKCIlcCAiLCB0YXNrcSk7CisKKyAgLy9fX2ttcF9yZWxlYXNlX2xvY2soICYgdHEtPnRxX2ZyZWVsaXN0X2xjaywgZ2xvYmFsX3RpZCApOworCisgIF9fa21wX3ByaW50ZigiXG5cbiIpOworfQorCitzdGF0aWMgdm9pZCBfX2ttcF9hdXhfZHVtcF90YXNrX3F1ZXVlX3RyZWUoa21wX3Rhc2txX3QgKnRxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcGNfdGFza19xdWV1ZV90ICpjdXJyX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgZ2xvYmFsX3RpZCkgeworICBpbnQgaSwgY291bnQsIHFzOworICBpbnQgbnByb2MgPSBfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdLT50aC50aF90ZWFtLT50LnRfbnByb2M7CisgIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSA9IGN1cnJfcXVldWU7CisKKyAgaWYgKGN1cnJfcXVldWUgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgX19rbXBfcHJpbnRmKCIgICAgIik7CisKKyAgZm9yIChpID0gMDsgaSA8IGxldmVsOyBpKyspCisgICAgX19rbXBfcHJpbnRmKCIgICIpOworCisgIF9fa21wX3ByaW50ZigiJXAiLCBjdXJyX3F1ZXVlKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnByb2M7IGkrKykgeworICAgIGlmICh0cS0+dHFfY3Vycl90aHVua1tpXSAmJgorICAgICAgICB0cS0+dHFfY3Vycl90aHVua1tpXS0+dGgudGhfc2hhcmVkcy0+c3ZfcXVldWUgPT0gY3Vycl9xdWV1ZSkgeworICAgICAgX19rbXBfcHJpbnRmKCIgWyVpXSIsIGkpOworICAgIH0KKyAgfQorCisgIF9fa21wX3ByaW50ZigiOiIpOworCisgIC8vX19rbXBfYWNxdWlyZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKworICAvLyBNYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtCisgIC8vIFNlZW1zIHRvIHdvcmsgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMAorICBLTVBfTUIoKTsKKworICBxcyA9IGN1cnJfcXVldWUtPnRxX3RhaWw7CisKKyAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgY3Vycl9xdWV1ZS0+dHFfbmZ1bGw7ICsrY291bnQpIHsKKyAgICBfX2ttcF9wcmludGYoIiVwICIsIGN1cnJfcXVldWUtPnRxX3F1ZXVlW3FzXS5xc190aHVuayk7CisgICAgcXMgPSAocXMgKyAxKSAlIGN1cnJfcXVldWUtPnRxX25zbG90czsKKyAgfQorCisgIC8vX19rbXBfcmVsZWFzZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKworICBfX2ttcF9wcmludGYoIlxuIik7CisKKyAgaWYgKGN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkKSB7CisgICAgLy9fX2ttcF9hY3F1aXJlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAvLyBNYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtCisgICAgLy8gU2VlbXMgdG8gd29yayB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwCisgICAgS01QX01CKCk7CisKKyAgICBpZiAoY3Vycl9xdWV1ZS0+dHFfZmlyc3RfY2hpbGQpIHsKKyAgICAgIGZvciAocXVldWUgPSBDQ0FTVChrbXBjX3Rhc2tfcXVldWVfdCAqLCBjdXJyX3F1ZXVlLT50cV9maXJzdF9jaGlsZCk7CisgICAgICAgICAgIHF1ZXVlICE9IE5VTEw7IHF1ZXVlID0gcXVldWUtPnRxX25leHRfY2hpbGQpIHsKKyAgICAgICAgX19rbXBfYXV4X2R1bXBfdGFza19xdWV1ZV90cmVlKHRxLCBxdWV1ZSwgbGV2ZWwgKyAxLCBnbG9iYWxfdGlkKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvL19fa21wX3JlbGVhc2VfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBfX2ttcF9kdW1wX3Rhc2tfcXVldWVfdHJlZShrbXBfdGFza3FfdCAqdHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBjX3Rhc2tfcXVldWVfdCAqdHFyb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGdsb2JhbF90aWQpIHsKKyAgX19rbXBfcHJpbnRmKCJUYXNrUSBUcmVlIGF0IHJvb3QgJXAgb24gKCVkKTpcbiIsIHRxcm9vdCwgZ2xvYmFsX3RpZCk7CisKKyAgX19rbXBfYXV4X2R1bXBfdGFza19xdWV1ZV90cmVlKHRxLCB0cXJvb3QsIDAsIGdsb2JhbF90aWQpOworCisgIF9fa21wX3ByaW50ZigiXG4iKTsKK30KKyNlbmRpZgorCisvKiBOZXcgdGFza3Egc3RvcmFnZSByb3V0aW5lcyB0aGF0IHRyeSB0byBtaW5pbWl6ZSBvdmVyaGVhZCBvZiBtYWxsb2NzIGJ1dAorICAgc3RpbGwgcHJvdmlkZSBjYWNoZSBsaW5lIGFsaWdubWVudC4gKi8KK3N0YXRpYyB2b2lkICpfX2ttcF90YXNrcV9hbGxvY2F0ZShzaXplX3Qgc2l6ZSwga21wX2ludDMyIGdsb2JhbF90aWQpIHsKKyAgdm9pZCAqYWRkciwgKm9yaWdfYWRkcjsKKyAgc2l6ZV90IGJ5dGVzOworCisgIEtCX1RSQUNFKDUsICgiX19rbXBfdGFza3FfYWxsb2NhdGU6IGNhbGxlZCBzaXplPSVkLCBndGlkPSVkXG4iLCAoaW50KXNpemUsCisgICAgICAgICAgICAgICBnbG9iYWxfdGlkKSk7CisKKyAgYnl0ZXMgPSBzaXplb2Yodm9pZCAqKSArIENBQ0hFX0xJTkUgKyBzaXplOworCisjaWZkZWYgVEhSRUFEX0FMTE9DX0ZPUl9UQVNLUQorICBvcmlnX2FkZHIgPQorICAgICAgKHZvaWQgKilfX2ttcF90aHJlYWRfbWFsbG9jKF9fa21wX3RocmVhZF9mcm9tX2d0aWQoZ2xvYmFsX3RpZCksIGJ5dGVzKTsKKyNlbHNlCisgIEtFX1RSQUNFKDEwLCAoIiUlJSUlJSBNQUxMT0MoICVkIClcbiIsIGJ5dGVzKSk7CisgIG9yaWdfYWRkciA9ICh2b2lkICopS01QX0lOVEVSTkFMX01BTExPQyhieXRlcyk7CisjZW5kaWYgLyogVEhSRUFEX0FMTE9DX0ZPUl9UQVNLUSAqLworCisgIGlmIChvcmlnX2FkZHIgPT0gMCkKKyAgICBLTVBfRkFUQUwoT3V0T2ZIZWFwTWVtb3J5KTsKKworICBhZGRyID0gb3JpZ19hZGRyOworCisgIGlmICgoKGttcF91aW50cHRyX3QpYWRkciAmIChDQUNIRV9MSU5FIC0gMSkpICE9IDApIHsKKyAgICBLQl9UUkFDRSg1MCwgKCJfX2ttcF90YXNrcV9hbGxvY2F0ZTogIGFkanVzdCBmb3IgY2FjaGUgYWxpZ25tZW50XG4iKSk7CisgICAgYWRkciA9ICh2b2lkICopKCgoa21wX3VpbnRwdHJfdClhZGRyICsgQ0FDSEVfTElORSkgJiB+KENBQ0hFX0xJTkUgLSAxKSk7CisgIH0KKworICAoKih2b2lkICoqKWFkZHIpID0gb3JpZ19hZGRyOworCisgIEtCX1RSQUNFKDEwLAorICAgICAgICAgICAoIl9fa21wX3Rhc2txX2FsbG9jYXRlOiAgYWxsb2NhdGU6ICVwLCB1c2U6ICVwIC0gJXAsIHNpemU6ICVkLCAiCisgICAgICAgICAgICAiZ3RpZDogJWRcbiIsCisgICAgICAgICAgICBvcmlnX2FkZHIsICgodm9pZCAqKilhZGRyKSArIDEsCisgICAgICAgICAgICAoKGNoYXIgKikoKCh2b2lkICoqKWFkZHIpICsgMSkpICsgc2l6ZSAtIDEsIChpbnQpc2l6ZSwgZ2xvYmFsX3RpZCkpOworCisgIHJldHVybiAoKCh2b2lkICoqKWFkZHIpICsgMSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fa21wY190YXNrcV9mcmVlKHZvaWQgKnAsIGttcF9pbnQzMiBnbG9iYWxfdGlkKSB7CisgIEtCX1RSQUNFKDUsICgiX19rbXBjX3Rhc2txX2ZyZWU6IGNhbGxlZCBhZGRyPSVwLCBndGlkPSVkXG4iLCBwLCBnbG9iYWxfdGlkKSk7CisKKyAgS0JfVFJBQ0UoMTAsICgiX19rbXBjX3Rhc2txX2ZyZWU6ICBmcmVlaW5nOiAlcCwgZ3RpZDogJWRcbiIsCisgICAgICAgICAgICAgICAgKCooKCh2b2lkICoqKXApIC0gMSkpLCBnbG9iYWxfdGlkKSk7CisKKyNpZmRlZiBUSFJFQURfQUxMT0NfRk9SX1RBU0tRCisgIF9fa21wX3RocmVhZF9mcmVlKF9fa21wX3RocmVhZF9mcm9tX2d0aWQoZ2xvYmFsX3RpZCksICooKCh2b2lkICoqKXApIC0gMSkpOworI2Vsc2UKKyAgS01QX0lOVEVSTkFMX0ZSRUUoKigoKHZvaWQgKiopcCkgLSAxKSk7CisjZW5kaWYgLyogVEhSRUFEX0FMTE9DX0ZPUl9UQVNLUSAqLworfQorCisvKiBLZWVwIGZyZWVkIGttcGNfdGFza19xdWV1ZV90IG9uIGFuIGludGVybmFsIGZyZWVsaXN0IGFuZCByZWN5Y2xlIHNpbmNlCisgICB0aGV5J3JlIG9mIGNvbnN0YW50IHNpemUuICovCisKK3N0YXRpYyBrbXBjX3Rhc2tfcXVldWVfdCAqCitfX2ttcF9hbGxvY190YXNrcShrbXBfdGFza3FfdCAqdHEsIGludCBpbl9wYXJhbGxlbCwga21wX2ludDMyIG5zbG90cywKKyAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBudGh1bmtzLCBrbXBfaW50MzIgbnNoYXJlZHMsIGttcF9pbnQzMiBucHJvYywKKyAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplb2ZfdGh1bmssIHNpemVfdCBzaXplb2Zfc2hhcmVkcywKKyAgICAgICAgICAgICAgICAgIGttcGNfdGh1bmtfdCAqKm5ld190YXNrcV90aHVuaywga21wX2ludDMyIGdsb2JhbF90aWQpIHsKKyAga21wX2ludDMyIGk7CisgIHNpemVfdCBieXRlczsKKyAga21wY190YXNrX3F1ZXVlX3QgKm5ld19xdWV1ZTsKKyAga21wY19hbGlnbmVkX3NoYXJlZF92YXJzX3QgKnNoYXJlZF92YXJfYXJyYXk7CisgIGNoYXIgKnNoYXJlZF92YXJfc3RvcmFnZTsKKyAgY2hhciAqcHQ7IC8qIGZvciBkb2luZyBieXRlLWFkanVzdGVkIGFkZHJlc3MgY29tcHV0YXRpb25zICovCisKKyAgX19rbXBfYWNxdWlyZV9sb2NrKCZ0cS0+dHFfZnJlZWxpc3RfbGNrLCBnbG9iYWxfdGlkKTsKKworICAvLyBNYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtCisgIC8vIFNlZW1zIHRvIHdvcmsgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMAorICBLTVBfTUIoKTsKKworICBpZiAodHEtPnRxX2ZyZWVsaXN0KSB7CisgICAgbmV3X3F1ZXVlID0gdHEtPnRxX2ZyZWVsaXN0OworICAgIHRxLT50cV9mcmVlbGlzdCA9IHRxLT50cV9mcmVlbGlzdC0+dHEudHFfbmV4dF9mcmVlOworCisgICAgS01QX0RFQlVHX0FTU0VSVChuZXdfcXVldWUtPnRxX2ZsYWdzICYgVFFGX0RFQUxMT0NBVEVEKTsKKworICAgIG5ld19xdWV1ZS0+dHFfZmxhZ3MgPSAwOworCisgICAgX19rbXBfcmVsZWFzZV9sb2NrKCZ0cS0+dHFfZnJlZWxpc3RfbGNrLCBnbG9iYWxfdGlkKTsKKyAgfSBlbHNlIHsKKyAgICBfX2ttcF9yZWxlYXNlX2xvY2soJnRxLT50cV9mcmVlbGlzdF9sY2ssIGdsb2JhbF90aWQpOworCisgICAgbmV3X3F1ZXVlID0gKGttcGNfdGFza19xdWV1ZV90ICopX19rbXBfdGFza3FfYWxsb2NhdGUoCisgICAgICAgIHNpemVvZihrbXBjX3Rhc2tfcXVldWVfdCksIGdsb2JhbF90aWQpOworICAgIG5ld19xdWV1ZS0+dHFfZmxhZ3MgPSAwOworICB9CisKKyAgLyogIHNwYWNlIGluIHRoZSB0YXNrIHF1ZXVlIGZvciBxdWV1ZSBzbG90cyAoYWxsb2NhdGUgYXMgb25lIGJpZyBjaHVuayAqLworICAvKiBvZiBzdG9yYWdlIGluY2x1ZGluZyBuZXdfdGFza3FfdGFzayBzcGFjZSkgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgc2l6ZW9mX3RodW5rICs9CisgICAgICAoQ0FDSEVfTElORSAtIChzaXplb2ZfdGh1bmsgJSBDQUNIRV9MSU5FKSk7IC8qIHBhZCB0byBjYWNoZSBsaW5lIHNpemUgKi8KKyAgcHQgPSAoY2hhciAqKV9fa21wX3Rhc2txX2FsbG9jYXRlKG50aHVua3MgKiBzaXplb2ZfdGh1bmssIGdsb2JhbF90aWQpOworICBuZXdfcXVldWUtPnRxX3RodW5rX3NwYWNlID0gKGttcGNfdGh1bmtfdCAqKXB0OworICAqbmV3X3Rhc2txX3RodW5rID0gKGttcGNfdGh1bmtfdCAqKShwdCArIChudGh1bmtzIC0gMSkgKiBzaXplb2ZfdGh1bmspOworCisgIC8qICBjaGFpbiB0aGUgYWxsb2NhdGVkIHRodW5rcyBpbnRvIGEgZnJlZWxpc3QgZm9yIHRoaXMgcXVldWUgICovCisKKyAgbmV3X3F1ZXVlLT50cV9mcmVlX3RodW5rcyA9IChrbXBjX3RodW5rX3QgKilwdDsKKworICBmb3IgKGkgPSAwOyBpIDwgKG50aHVua3MgLSAyKTsgaSsrKSB7CisgICAgKChrbXBjX3RodW5rX3QgKikocHQgKyBpICogc2l6ZW9mX3RodW5rKSktPnRoLnRoX25leHRfZnJlZSA9CisgICAgICAgIChrbXBjX3RodW5rX3QgKikocHQgKyAoaSArIDEpICogc2l6ZW9mX3RodW5rKTsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAoKGttcGNfdGh1bmtfdCAqKShwdCArIGkgKiBzaXplb2ZfdGh1bmspKS0+dGhfZmxhZ3MgPSBUUUZfREVBTExPQ0FURUQ7CisjZW5kaWYKKyAgfQorCisgICgoa21wY190aHVua190ICopKHB0ICsgKG50aHVua3MgLSAyKSAqIHNpemVvZl90aHVuaykpLT50aC50aF9uZXh0X2ZyZWUgPSBOVUxMOworI2lmZGVmIEtNUF9ERUJVRworICAoKGttcGNfdGh1bmtfdCAqKShwdCArIChudGh1bmtzIC0gMikgKiBzaXplb2ZfdGh1bmspKS0+dGhfZmxhZ3MgPQorICAgICAgVFFGX0RFQUxMT0NBVEVEOworI2VuZGlmCisKKyAgLyogaW5pdGlhbGl6ZSB0aGUgbG9ja3MgKi8KKworICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICBfX2ttcF9pbml0X2xvY2soJm5ld19xdWV1ZS0+dHFfbGlua19sY2spOworICAgIF9fa21wX2luaXRfbG9jaygmbmV3X3F1ZXVlLT50cV9mcmVlX3RodW5rc19sY2spOworICAgIF9fa21wX2luaXRfbG9jaygmbmV3X3F1ZXVlLT50cV9xdWV1ZV9sY2spOworICB9CisKKyAgLyogbm93IGFsbG9jYXRlIHRoZSBzbG90cyAqLworCisgIGJ5dGVzID0gbnNsb3RzICogc2l6ZW9mKGttcGNfYWxpZ25lZF9xdWV1ZV9zbG90X3QpOworICBuZXdfcXVldWUtPnRxX3F1ZXVlID0KKyAgICAgIChrbXBjX2FsaWduZWRfcXVldWVfc2xvdF90ICopX19rbXBfdGFza3FfYWxsb2NhdGUoYnl0ZXMsIGdsb2JhbF90aWQpOworCisgIC8qICBzcGFjZSBmb3IgYXJyYXkgb2YgcG9pbnRlcnMgdG8gc2hhcmVkIHZhcmlhYmxlIHN0cnVjdHVyZXMgKi8KKyAgc2l6ZW9mX3NoYXJlZHMgKz0gc2l6ZW9mKGttcGNfdGFza19xdWV1ZV90ICopOworICBzaXplb2Zfc2hhcmVkcyArPQorICAgICAgKENBQ0hFX0xJTkUgLSAoc2l6ZW9mX3NoYXJlZHMgJSBDQUNIRV9MSU5FKSk7IC8qIHBhZCB0byBjYWNoZSBsaW5lIHNpemUgKi8KKworICBieXRlcyA9IG5zaGFyZWRzICogc2l6ZW9mKGttcGNfYWxpZ25lZF9zaGFyZWRfdmFyc190KTsKKyAgc2hhcmVkX3Zhcl9hcnJheSA9CisgICAgICAoa21wY19hbGlnbmVkX3NoYXJlZF92YXJzX3QgKilfX2ttcF90YXNrcV9hbGxvY2F0ZShieXRlcywgZ2xvYmFsX3RpZCk7CisKKyAgYnl0ZXMgPSBuc2hhcmVkcyAqIHNpemVvZl9zaGFyZWRzOworICBzaGFyZWRfdmFyX3N0b3JhZ2UgPSAoY2hhciAqKV9fa21wX3Rhc2txX2FsbG9jYXRlKGJ5dGVzLCBnbG9iYWxfdGlkKTsKKworICBmb3IgKGkgPSAwOyBpIDwgbnNoYXJlZHM7IGkrKykgeworICAgIHNoYXJlZF92YXJfYXJyYXlbaV0uYWlfZGF0YSA9CisgICAgICAgIChrbXBjX3NoYXJlZF92YXJzX3QgKikoc2hhcmVkX3Zhcl9zdG9yYWdlICsgaSAqIHNpemVvZl9zaGFyZWRzKTsKKyAgICBzaGFyZWRfdmFyX2FycmF5W2ldLmFpX2RhdGEtPnN2X3F1ZXVlID0gbmV3X3F1ZXVlOworICB9CisgIG5ld19xdWV1ZS0+dHFfc2hhcmVkcyA9IHNoYXJlZF92YXJfYXJyYXk7CisKKyAgLyogYXJyYXkgZm9yIG51bWJlciBvZiBvdXRzdGFuZGluZyB0aHVua3MgcGVyIHRocmVhZCAqLworCisgIGlmIChpbl9wYXJhbGxlbCkgeworICAgIGJ5dGVzID0gbnByb2MgKiBzaXplb2Yoa21wY19hbGlnbmVkX2ludDMyX3QpOworICAgIG5ld19xdWV1ZS0+dHFfdGhfdGh1bmtzID0KKyAgICAgICAgKGttcGNfYWxpZ25lZF9pbnQzMl90ICopX19rbXBfdGFza3FfYWxsb2NhdGUoYnl0ZXMsIGdsb2JhbF90aWQpOworICAgIG5ld19xdWV1ZS0+dHFfbnByb2MgPSBucHJvYzsKKworICAgIGZvciAoaSA9IDA7IGkgPCBucHJvYzsgaSsrKQorICAgICAgbmV3X3F1ZXVlLT50cV90aF90aHVua3NbaV0uYWlfZGF0YSA9IDA7CisgIH0KKworICByZXR1cm4gbmV3X3F1ZXVlOworfQorCitzdGF0aWMgdm9pZCBfX2ttcF9mcmVlX3Rhc2txKGttcF90YXNrcV90ICp0cSwga21wY190YXNrX3F1ZXVlX3QgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbl9wYXJhbGxlbCwga21wX2ludDMyIGdsb2JhbF90aWQpIHsKKyAgX19rbXBjX3Rhc2txX2ZyZWUocC0+dHFfdGh1bmtfc3BhY2UsIGdsb2JhbF90aWQpOworICBfX2ttcGNfdGFza3FfZnJlZShwLT50cV9xdWV1ZSwgZ2xvYmFsX3RpZCk7CisKKyAgLyogZnJlZSBzaGFyZWQgdmFyIHN0cnVjdHVyZSBzdG9yYWdlICovCisgIF9fa21wY190YXNrcV9mcmVlKENDQVNUKGttcGNfc2hhcmVkX3ZhcnNfdCAqLCBwLT50cV9zaGFyZWRzWzBdLmFpX2RhdGEpLAorICAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkKTsKKyAgLyogZnJlZSBhcnJheSBvZiBwb2ludGVycyB0byBzaGFyZWQgdmFycyBzdG9yYWdlICovCisgIF9fa21wY190YXNrcV9mcmVlKHAtPnRxX3NoYXJlZHMsIGdsb2JhbF90aWQpOworCisjaWZkZWYgS01QX0RFQlVHCisgIHAtPnRxX2ZpcnN0X2NoaWxkID0gTlVMTDsKKyAgcC0+dHFfbmV4dF9jaGlsZCA9IE5VTEw7CisgIHAtPnRxX3ByZXZfY2hpbGQgPSBOVUxMOworICBwLT50cV9yZWZfY291bnQgPSAtMTA7CisgIHAtPnRxX3NoYXJlZHMgPSBOVUxMOworICBwLT50cV90YXNrbnVtX3F1ZXVpbmcgPSAwOworICBwLT50cV90YXNrbnVtX3NlcnZpbmcgPSAwOworICBwLT50cV9xdWV1ZSA9IE5VTEw7CisgIHAtPnRxX3RodW5rX3NwYWNlID0gTlVMTDsKKyAgcC0+dHFfdGFza3Ffc2xvdCA9IE5VTEw7CisgIHAtPnRxX2ZyZWVfdGh1bmtzID0gTlVMTDsKKyAgcC0+dHFfbnNsb3RzID0gMDsKKyAgcC0+dHFfaGVhZCA9IDA7CisgIHAtPnRxX3RhaWwgPSAwOworICBwLT50cV9uZnVsbCA9IDA7CisgIHAtPnRxX2hpd2F0ID0gMDsKKworICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwLT50cV9ucHJvYzsgaSsrKQorICAgICAgcC0+dHFfdGhfdGh1bmtzW2ldLmFpX2RhdGEgPSAwOworICB9CisgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spCisgICAgcC0+dHFfbG9jID0gTlVMTDsKKyAgS01QX0RFQlVHX0FTU0VSVChwLT50cV9mbGFncyAmIFRRRl9ERUFMTE9DQVRFRCk7CisgIHAtPnRxX2ZsYWdzID0gVFFGX0RFQUxMT0NBVEVEOworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgIGlmIChpbl9wYXJhbGxlbCkgeworICAgIF9fa21wY190YXNrcV9mcmVlKHAtPnRxX3RoX3RodW5rcywgZ2xvYmFsX3RpZCk7CisgICAgX19rbXBfZGVzdHJveV9sb2NrKCZwLT50cV9saW5rX2xjayk7CisgICAgX19rbXBfZGVzdHJveV9sb2NrKCZwLT50cV9xdWV1ZV9sY2spOworICAgIF9fa21wX2Rlc3Ryb3lfbG9jaygmcC0+dHFfZnJlZV90aHVua3NfbGNrKTsKKyAgfQorI2lmZGVmIEtNUF9ERUJVRworICBwLT50cV90aF90aHVua3MgPSBOVUxMOworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgIC8vIE1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0KKyAgLy8gU2VlbXMgdG8gd29yayB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwCisgIEtNUF9NQigpOworCisgIF9fa21wX2FjcXVpcmVfbG9jaygmdHEtPnRxX2ZyZWVsaXN0X2xjaywgZ2xvYmFsX3RpZCk7CisgIHAtPnRxLnRxX25leHRfZnJlZSA9IHRxLT50cV9mcmVlbGlzdDsKKworICB0cS0+dHFfZnJlZWxpc3QgPSBwOworICBfX2ttcF9yZWxlYXNlX2xvY2soJnRxLT50cV9mcmVlbGlzdF9sY2ssIGdsb2JhbF90aWQpOworfQorCisvKiBPbmNlIGEgZ3JvdXAgb2YgdGh1bmtzIGhhcyBiZWVuIGFsbG9jYXRlZCBmb3IgdXNlIGluIGEgcGFydGljdWxhciBxdWV1ZSwKKyAgIHRoZXNlIGFyZSBtYW5hZ2VkIHZpYSBhIHBlci1xdWV1ZSBmcmVlbGlzdC4KKyAgIFdlIGZvcmNlIGEgY2hlY2sgdGhhdCB0aGVyZSdzIGFsd2F5cyBhIHRodW5rIGZyZWUgaWYgd2UgbmVlZCBvbmUuICovCisKK3N0YXRpYyBrbXBjX3RodW5rX3QgKl9fa21wX2FsbG9jX3RodW5rKGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbl9wYXJhbGxlbCwga21wX2ludDMyIGdsb2JhbF90aWQpIHsKKyAga21wY190aHVua190ICpmbDsKKworICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICBfX2ttcF9hY3F1aXJlX2xvY2soJnF1ZXVlLT50cV9mcmVlX3RodW5rc19sY2ssIGdsb2JhbF90aWQpOworICAgIC8vIE1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0KKyAgICAvLyBTZWVtcyB0byB3b3JrIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAKKyAgICBLTVBfTUIoKTsKKyAgfQorCisgIGZsID0gcXVldWUtPnRxX2ZyZWVfdGh1bmtzOworCisgIEtNUF9ERUJVR19BU1NFUlQoZmwgIT0gTlVMTCk7CisKKyAgcXVldWUtPnRxX2ZyZWVfdGh1bmtzID0gZmwtPnRoLnRoX25leHRfZnJlZTsKKyAgZmwtPnRoX2ZsYWdzID0gMDsKKworICBpZiAoaW5fcGFyYWxsZWwpCisgICAgX19rbXBfcmVsZWFzZV9sb2NrKCZxdWV1ZS0+dHFfZnJlZV90aHVua3NfbGNrLCBnbG9iYWxfdGlkKTsKKworICByZXR1cm4gZmw7Cit9CisKK3N0YXRpYyB2b2lkIF9fa21wX2ZyZWVfdGh1bmsoa21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlLCBrbXBjX3RodW5rX3QgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbl9wYXJhbGxlbCwga21wX2ludDMyIGdsb2JhbF90aWQpIHsKKyNpZmRlZiBLTVBfREVCVUcKKyAgcC0+dGhfdGFzayA9IDA7CisgIHAtPnRoX2VuY2xfdGh1bmsgPSAwOworICBwLT50aF9zdGF0dXMgPSAwOworICBwLT50aF90YXNrbnVtID0gMDsKKy8qIEFsc28gY291bGQgemVybyBwb2ludGVycyB0byBwcml2YXRlIHZhcnMgKi8KKyNlbmRpZgorCisgIGlmIChpbl9wYXJhbGxlbCkgeworICAgIF9fa21wX2FjcXVpcmVfbG9jaygmcXVldWUtPnRxX2ZyZWVfdGh1bmtzX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgLy8gTWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbQorICAgIC8vIFNlZW1zIHRvIHdvcmsgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMAorICAgIEtNUF9NQigpOworICB9CisKKyAgcC0+dGgudGhfbmV4dF9mcmVlID0gcXVldWUtPnRxX2ZyZWVfdGh1bmtzOworICBxdWV1ZS0+dHFfZnJlZV90aHVua3MgPSBwOworCisjaWZkZWYgS01QX0RFQlVHCisgIHAtPnRoX2ZsYWdzID0gVFFGX0RFQUxMT0NBVEVEOworI2VuZGlmCisKKyAgaWYgKGluX3BhcmFsbGVsKQorICAgIF9fa21wX3JlbGVhc2VfbG9jaygmcXVldWUtPnRxX2ZyZWVfdGh1bmtzX2xjaywgZ2xvYmFsX3RpZCk7Cit9CisKKy8qICByZXR1cm5zIG5vbnplcm8gaWYgdGhlIHF1ZXVlIGp1c3QgYmVjYW1lIGZ1bGwgYWZ0ZXIgdGhlIGVucXVldWUgICovCitzdGF0aWMga21wX2ludDMyIF9fa21wX2VucXVldWVfdGFzayhrbXBfdGFza3FfdCAqdHEsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wY190aHVua190ICp0aHVuaywgaW50IGluX3BhcmFsbGVsKSB7CisgIGttcF9pbnQzMiByZXQ7CisKKyAgLyogIGRrcDogY2FuIHdlIGdldCBhcm91bmQgdGhlIGxvY2sgaW4gdGhlIFRRRl9SRUxFQVNFX1dPUktFUlMgY2FzZSAob25seSB0aGUKKyAgICogbWFzdGVyIGlzIGV4ZWN1dGluZyB0aGVuKSAgKi8KKyAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgX19rbXBfYWNxdWlyZV9sb2NrKCZxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAvLyBNYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtCisgICAgLy8gU2VlbXMgdG8gd29yayB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwCisgICAgS01QX01CKCk7CisgIH0KKworICBLTVBfREVCVUdfQVNTRVJUKHF1ZXVlLT50cV9uZnVsbCA8IHF1ZXVlLT50cV9uc2xvdHMpOyAvLyBjaGVjayBxdWV1ZSBub3QgZnVsbAorCisgIHF1ZXVlLT50cV9xdWV1ZVsocXVldWUtPnRxX2hlYWQpKytdLnFzX3RodW5rID0gdGh1bms7CisKKyAgaWYgKHF1ZXVlLT50cV9oZWFkID49IHF1ZXVlLT50cV9uc2xvdHMpCisgICAgcXVldWUtPnRxX2hlYWQgPSAwOworCisgIChxdWV1ZS0+dHFfbmZ1bGwpKys7CisKKyAgS01QX01CKCk7IC8qIHRvIGFzc3VyZSB0aGF0IG5mdWxsIGlzIHNlZW4gdG8gaW5jcmVhc2UgYmVmb3JlCisgICAgICAgICAgICAgICBUUUZfQUxMX1RBU0tTX1FVRVVFRCBpcyBzZXQgKi8KKworICByZXQgPSAoaW5fcGFyYWxsZWwpID8gKHF1ZXVlLT50cV9uZnVsbCA9PSBxdWV1ZS0+dHFfbnNsb3RzKSA6IEZBTFNFOworCisgIGlmIChpbl9wYXJhbGxlbCkgeworICAgIC8qIGRvbid0IG5lZWQgdG8gd2FpdCB1bnRpbCB3b3JrZXJzIGFyZSByZWxlYXNlZCBiZWZvcmUgdW5sb2NraW5nICovCisgICAgX19rbXBfcmVsZWFzZV9sb2NrKCZxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgIGlmICh0cS0+dHFfZ2xvYmFsX2ZsYWdzICYgVFFGX1JFTEVBU0VfV09SS0VSUykgeworICAgICAgLy8gSWYganVzdCBjcmVhdGluZyB0aGUgcm9vdCBxdWV1ZSwgdGhlIHdvcmtlciB0aHJlYWRzIGFyZSB3YWl0aW5nIGF0IGEKKyAgICAgIC8vIGpvaW4gYmFycmllciB1bnRpbCBub3csIHdoZW4gdGhlcmUncyBzb21ldGhpbmcgaW4gdGhlIHF1ZXVlIGZvciB0aGVtIHRvCisgICAgICAvLyBkbzsgcmVsZWFzZSB0aGVtIG5vdyB0byBkbyB3b3JrLiBUaGlzIHNob3VsZCBvbmx5IGJlIGRvbmUgd2hlbiB0aGlzIGlzCisgICAgICAvLyB0aGUgZmlyc3QgdGFzayBlbnF1ZXVlZCwgc28gcmVzZXQgdGhlIGZsYWcgaGVyZSBhbHNvLgorICAgICAgdHEtPnRxX2dsb2JhbF9mbGFncyAmPSB+VFFGX1JFTEVBU0VfV09SS0VSUzsgLyogbm8gbG9jayBuZWVkZWQsIHdvcmtlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBzdGlsbCBpbiBzcGluIG1vZGUgKi8KKyAgICAgIC8vIGF2b2lkIHJlbGVhc2luZyBiYXJyaWVyIHR3aWNlIGlmIHRhc2txX3Rhc2sgc3dpdGNoZXMgdGhyZWFkcworICAgICAgS01QX01CKCk7CisKKyAgICAgIF9fa21wY19lbmRfYmFycmllcl9tYXN0ZXIoTlVMTCwgZ2xvYmFsX3RpZCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGttcGNfdGh1bmtfdCAqX19rbXBfZGVxdWV1ZV90YXNrKGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5fcGFyYWxsZWwpIHsKKyAga21wY190aHVua190ICpwdDsKKyAgaW50IHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoZ2xvYmFsX3RpZCk7CisKKyAgS01QX0RFQlVHX0FTU0VSVChxdWV1ZS0+dHFfbmZ1bGwgPiAwKTsgLyogIGNoZWNrIHF1ZXVlIG5vdCBlbXB0eSAgKi8KKworICBpZiAocXVldWUtPnRxLnRxX3BhcmVudCAhPSBOVUxMICYmIGluX3BhcmFsbGVsKSB7CisgICAgaW50IGN0OworICAgIF9fa21wX2FjcXVpcmVfbG9jaygmcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgIGN0ID0gKysocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgX19rbXBfcmVsZWFzZV9sb2NrKCZxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgS01QX0RFQlVHX1JFRl9DVFMoCisgICAgICAgICgibGluZSAlZCBndGlkICVkOiBRICVwIGluYyAlZFxuIiwgX19MSU5FX18sIGdsb2JhbF90aWQsIHF1ZXVlLCBjdCkpOworICB9CisKKyAgcHQgPSBxdWV1ZS0+dHFfcXVldWVbKHF1ZXVlLT50cV90YWlsKSsrXS5xc190aHVuazsKKworICBpZiAocXVldWUtPnRxX3RhaWwgPj0gcXVldWUtPnRxX25zbG90cykKKyAgICBxdWV1ZS0+dHFfdGFpbCA9IDA7CisKKyAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgcXVldWUtPnRxX3RoX3RodW5rc1t0aWRdLmFpX2RhdGErKzsKKworICAgIEtNUF9NQigpOyAvKiBuZWNlc3Nhcnkgc28gYWlfZGF0YSBpbmNyZW1lbnQgaXMgcHJvcGFnYXRlZCB0byBvdGhlciB0aHJlYWRzCisgICAgICAgICAgICAgICAgIGltbWVkaWF0ZWx5IChkaWdpdGFsKSAqLworCisgICAgS0ZfVFJBQ0UoMjAwLCAoIl9fa21wX2RlcXVldWVfdGFzazogVCMlZCg6JWQpIG5vdyBoYXMgJWQgb3V0c3RhbmRpbmcgIgorICAgICAgICAgICAgICAgICAgICJ0aHVua3MgZnJvbSBxdWV1ZSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCB0aWQsIHF1ZXVlLT50cV90aF90aHVua3NbdGlkXS5haV9kYXRhLCBxdWV1ZSkpOworICB9CisKKyAgKHF1ZXVlLT50cV9uZnVsbCktLTsKKworI2lmZGVmIEtNUF9ERUJVRworICBLTVBfTUIoKTsKKworICAvKiBuZWNlc3Nhcnkgc28gKHF1ZXVlLT50cV9uZnVsbCA+IDApIGFib3ZlIHN1Y2NlZWRzIGFmdGVyIHRxX25mdWxsIGlzCisgICAqIGRlY3JlbWVudGVkICovCisKKyAgS01QX0RFQlVHX0FTU0VSVChxdWV1ZS0+dHFfbmZ1bGwgPj0gMCk7CisKKyAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgS01QX0RFQlVHX0FTU0VSVChxdWV1ZS0+dHFfdGhfdGh1bmtzW3RpZF0uYWlfZGF0YSA8PQorICAgICAgICAgICAgICAgICAgICAgX19LTVBfVEFTS1FfVEhVTktTX1BFUl9USCk7CisgIH0KKyNlbmRpZgorCisgIHJldHVybiBwdDsKK30KKworLyogRmluZCB0aGUgbmV4dCAobm9uLW51bGwpIHRhc2sgdG8gZGVxdWV1ZSBhbmQgcmV0dXJuIGl0LgorICogVGhpcyBpcyBuZXZlciBjYWxsZWQgdW5sZXNzIGluX3BhcmFsbGVsPVRSVUUKKyAqCisgKiBIZXJlIGFyZSB0aGUgcnVsZXMgZm9yIGRlY2lkaW5nIHdoaWNoIHF1ZXVlIHRvIHRha2UgdGhlIHRhc2sgZnJvbToKKyAqIDEuICBXYWxrIHVwIHRoZSB0YXNrIHF1ZXVlIHRyZWUgZnJvbSB0aGUgY3VycmVudCBxdWV1ZSdzIHBhcmVudCBhbmQgbG9vaworICogICAgICBvbiB0aGUgd2F5IHVwIChmb3IgbG9vcCwgYmVsb3cpLgorICogMi4gIERvIGEgZGVwdGgtZmlyc3Qgc2VhcmNoIGJhY2sgZG93biB0aGUgdHJlZSBmcm9tIHRoZSByb290IGFuZAorICogICAgICBsb29rIChmaW5kX3Rhc2tfaW5fZGVzY2VuZGFudF9xdWV1ZSgpKS4KKyAqCisgKiBIZXJlIGFyZSB0aGUgcnVsZXMgZm9yIGRlY2lkaW5nIHdoaWNoIHRhc2sgdG8gdGFrZSBmcm9tIGEgcXVldWUKKyAqIChfX2ttcF9maW5kX3Rhc2tfaW5fcXVldWUgKCkpOgorICogMS4gIE5ldmVyIHRha2UgdGhlIGxhc3QgdGFzayBmcm9tIGEgcXVldWUgaWYgVFFGX0lTX0xBU1RQUklWQVRFOyB0aGlzIHRhc2sKKyAqICAgICBtdXN0IGJlIHN0YWdlZCB0byBtYWtlIHN1cmUgd2UgZXhlY3V0ZSB0aGUgbGFzdCBvbmUgd2l0aAorICogICAgIFRRRl9JU19MQVNUX1RBU0sgYXQgdGhlIGVuZCBvZiB0YXNrIHF1ZXVlIGV4ZWN1dGlvbi4KKyAqIDIuICBJZiB0aGUgcXVldWUgbGVuZ3RoIGlzIGJlbG93IHNvbWUgaGlnaCB3YXRlciBtYXJrIGFuZCB0aGUgdGFza3EgdGFzaworICogICAgIGlzIGVucXVldWVkLCBwcmVmZXIgcnVubmluZyB0aGUgdGFza3EgdGFzay4KKyAqIDMuICBPdGhlcndpc2UsIHRha2UgYSAobm9ybWFsKSB0YXNrIGZyb20gdGhlIHF1ZXVlLgorICoKKyAqIElmIHdlIGRvIGFsbCB0aGlzIGFuZCByZXR1cm4gcHQgPT0gTlVMTCBhdCB0aGUgYm90dG9tIG9mIHRoaXMgcm91dGluZSwKKyAqIHRoaXMgbWVhbnMgdGhlcmUgYXJlIG5vIG1vcmUgdGFza3MgdG8gZXhlY3V0ZSAoZXhjZXB0IHBvc3NpYmx5IGZvcgorICogVFFGX0lTX0xBU1RQUklWQVRFKS4KKyAqLworCitzdGF0aWMga21wY190aHVua190ICpfX2ttcF9maW5kX3Rhc2tfaW5fcXVldWUoa21wX2ludDMyIGdsb2JhbF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlKSB7CisgIGttcGNfdGh1bmtfdCAqcHQgPSBOVUxMOworICBpbnQgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChnbG9iYWxfdGlkKTsKKworICAvKiBUbyBwcmV2ZW50IGRlYWRsb2NrIGZyb20gdHFfcXVldWVfbGNrIGlmIHF1ZXVlIGFscmVhZHkgZGVhbGxvY2F0ZWQgKi8KKyAgaWYgKCEocXVldWUtPnRxX2ZsYWdzICYgVFFGX0RFQUxMT0NBVEVEKSkgeworCisgICAgX19rbXBfYWNxdWlyZV9sb2NrKCZxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgIC8qIENoZWNrIGFnYWluIHRvIGF2b2lkIHJhY2UgaW4gX19rbXBjX2VuZF90YXNrcSgpICovCisgICAgaWYgKCEocXVldWUtPnRxX2ZsYWdzICYgVFFGX0RFQUxMT0NBVEVEKSkgeworICAgICAgLy8gTWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbQorICAgICAgLy8gU2VlbXMgdG8gd29yayB3aXRob3V0IHRoaXMgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMAorICAgICAgS01QX01CKCk7CisKKyAgICAgIGlmICgocXVldWUtPnRxX3Rhc2txX3Nsb3QgIT0gTlVMTCkgJiYKKyAgICAgICAgICAocXVldWUtPnRxX25mdWxsIDw9IHF1ZXVlLT50cV9oaXdhdCkpIHsKKyAgICAgICAgLyogaWYgdGhlcmUncyBlbm91Z2ggcm9vbSBpbiB0aGUgcXVldWUgYW5kIHRoZSBkaXNwYXRjaGVyICovCisgICAgICAgIC8qICh0YXNrcSB0YXNrKSBpcyBhdmFpbGFibGUsIHNjaGVkdWxlIG1vcmUgdGFza3MgICAgICAgICAqLworICAgICAgICBwdCA9IENDQVNUKGttcGNfdGh1bmtfdCAqLCBxdWV1ZS0+dHFfdGFza3Ffc2xvdCk7CisgICAgICAgIHF1ZXVlLT50cV90YXNrcV9zbG90ID0gTlVMTDsKKyAgICAgIH0gZWxzZSBpZiAocXVldWUtPnRxX25mdWxsID09IDAgfHwKKyAgICAgICAgICAgICAgICAgcXVldWUtPnRxX3RoX3RodW5rc1t0aWRdLmFpX2RhdGEgPj0KKyAgICAgICAgICAgICAgICAgICAgIF9fS01QX1RBU0tRX1RIVU5LU19QRVJfVEgpIHsKKyAgICAgICAgLyogZG8gbm90aGluZyBpZiBubyB0aHVua3MgYXZhaWxhYmxlIG9yIHRoaXMgdGhyZWFkIGNhbid0ICovCisgICAgICAgIC8qIHJ1biBhbnkgYmVjYXVzZSBpdCBhbHJlYWR5IGlzIGV4ZWN1dGluZyB0b28gbWFueSAgICAgICAqLworICAgICAgICBwdCA9IE5VTEw7CisgICAgICB9IGVsc2UgaWYgKHF1ZXVlLT50cV9uZnVsbCA+IDEpIHsKKyAgICAgICAgLyogIGFsd2F5cyBzYWZlIHRvIHNjaGVkdWxlIGEgdGFzayBldmVuIGlmIFRRRl9JU19MQVNUUFJJVkFURSAgKi8KKworICAgICAgICBwdCA9IF9fa21wX2RlcXVldWVfdGFzayhnbG9iYWxfdGlkLCBxdWV1ZSwgVFJVRSk7CisgICAgICB9IGVsc2UgaWYgKCEocXVldWUtPnRxX2ZsYWdzICYgVFFGX0lTX0xBU1RQUklWQVRFKSkgeworICAgICAgICAvLyBvbmUgdGhpbmcgaW4gcXVldWUsIGFsd2F5cyBzYWZlIHRvIHNjaGVkdWxlIGlmICFUUUZfSVNfTEFTVFBSSVZBVEUKKyAgICAgICAgcHQgPSBfX2ttcF9kZXF1ZXVlX3Rhc2soZ2xvYmFsX3RpZCwgcXVldWUsIFRSVUUpOworICAgICAgfSBlbHNlIGlmIChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfSVNfTEFTVF9UQVNLKSB7CisgICAgICAgIC8qIFRRRl9JU19MQVNUUFJJVkFURSwgb25lIHRoaW5nIGluIHF1ZXVlLCBrbXBjX2VuZF90YXNrcV90YXNrKCkgICAqLworICAgICAgICAvKiBoYXMgYmVlbiBydW4gc28gdGhpcyBpcyBsYXN0IHRhc2ssIHJ1biB3aXRoIFRRRl9JU19MQVNUX1RBU0sgc28gKi8KKyAgICAgICAgLyogaW5zdHJ1bWVudGF0aW9uIGRvZXMgY29weS1vdXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIHB0ID0gX19rbXBfZGVxdWV1ZV90YXNrKGdsb2JhbF90aWQsIHF1ZXVlLCBUUlVFKTsKKyAgICAgICAgcHQtPnRoX2ZsYWdzIHw9CisgICAgICAgICAgICBUUUZfSVNfTEFTVF9UQVNLOyAvKiBkb24ndCBuZWVkIHRlc3RfdGhlbl9vciBzaW5jZSBhbHJlYWR5IGxvY2tlZCAqLworICAgICAgfQorICAgIH0KKworICAgIC8qIEdFSCAtIFdoYXQgaGFwcGVucyBoZXJlIGlmIGlzIGxhc3Rwcml2YXRlLCBidXQgbm90IGxhc3QgdGFzaz8gKi8KKyAgICBfX2ttcF9yZWxlYXNlX2xvY2soJnF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworICB9CisKKyAgcmV0dXJuIHB0OworfQorCisvKiBXYWxrIGEgdHJlZSBvZiBxdWV1ZXMgc3RhcnRpbmcgYXQgcXVldWUncyBmaXJzdCBjaGlsZCBhbmQgcmV0dXJuIGEgbm9uLU5VTEwKKyAgIHRodW5rIGlmIG9uZSBjYW4gYmUgc2NoZWR1bGVkLiBNdXN0IG9ubHkgYmUgY2FsbGVkIHdoZW4gaW5fcGFyYWxsZWw9VFJVRSAqLworCitzdGF0aWMga21wY190aHVua190ICoKK19fa21wX2ZpbmRfdGFza19pbl9kZXNjZW5kYW50X3F1ZXVlKGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wY190YXNrX3F1ZXVlX3QgKmN1cnJfcXVldWUpIHsKKyAga21wY190aHVua190ICpwdCA9IE5VTEw7CisgIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSA9IGN1cnJfcXVldWU7CisKKyAgaWYgKGN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkICE9IE5VTEwpIHsKKyAgICBfX2ttcF9hY3F1aXJlX2xvY2soJmN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAvLyBNYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtCisgICAgLy8gU2VlbXMgdG8gd29yayB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwCisgICAgS01QX01CKCk7CisKKyAgICBxdWV1ZSA9IENDQVNUKGttcGNfdGFza19xdWV1ZV90ICosIGN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkKTsKKyAgICBpZiAocXVldWUgPT0gTlVMTCkgeworICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCZjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB3aGlsZSAocXVldWUgIT0gTlVMTCkgeworICAgICAgaW50IGN0OworICAgICAga21wY190YXNrX3F1ZXVlX3QgKm5leHQ7CisKKyAgICAgIGN0ID0gKysocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJmN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgIEtNUF9ERUJVR19SRUZfQ1RTKAorICAgICAgICAgICgibGluZSAlZCBndGlkICVkOiBRICVwIGluYyAlZFxuIiwgX19MSU5FX18sIGdsb2JhbF90aWQsIHF1ZXVlLCBjdCkpOworCisgICAgICBwdCA9IF9fa21wX2ZpbmRfdGFza19pbl9xdWV1ZShnbG9iYWxfdGlkLCBxdWV1ZSk7CisKKyAgICAgIGlmIChwdCAhPSBOVUxMKSB7CisgICAgICAgIGludCBjdDsKKworICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJmN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgLy8gTWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtCisgICAgICAgIC8vIFNlZW1zIHRvIHdvcmsgd2l0aG91dCB0aGlzIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAKKyAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgY3QgPSAtLShxdWV1ZS0+dHFfcmVmX2NvdW50KTsKKyAgICAgICAgS01QX0RFQlVHX1JFRl9DVFMoKCJsaW5lICVkIGd0aWQgJWQ6IFEgJXAgZGVjICVkXG4iLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsIHF1ZXVlLCBjdCkpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHF1ZXVlLT50cV9yZWZfY291bnQgPj0gMCk7CisKKyAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCZjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgcmV0dXJuIHB0OworICAgICAgfQorCisgICAgICAvKiBhbHRob3VnaCByZWZlcmVuY2UgY291bnQgc3RheXMgYWN0aXZlIGR1cmluZyBkZXNjZW5kYW50IHdhbGssIHNob3VsZG4ndAorICAgICAgICAgbWF0dGVyICBzaW5jZSBpZiBjaGlsZHJlbiBzdGlsbCBleGlzdCwgcmVmZXJlbmNlIGNvdW50cyBhcmVuJ3QgYmVpbmcKKyAgICAgICAgIG1vbml0b3JlZCBhbnl3YXkgICAqLworCisgICAgICBwdCA9IF9fa21wX2ZpbmRfdGFza19pbl9kZXNjZW5kYW50X3F1ZXVlKGdsb2JhbF90aWQsIHF1ZXVlKTsKKworICAgICAgaWYgKHB0ICE9IE5VTEwpIHsKKyAgICAgICAgaW50IGN0OworCisgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgICAgICAvLyBNYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0KKyAgICAgICAgLy8gU2VlbXMgdG8gd29yayB3aXRob3V0IHRoaXMgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMAorICAgICAgICBLTVBfTUIoKTsKKworICAgICAgICBjdCA9IC0tKHF1ZXVlLT50cV9yZWZfY291bnQpOworICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBkZWMgJWRcbiIsIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgcXVldWUsIGN0KSk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoY3QgPj0gMCk7CisKKyAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCZjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgcmV0dXJuIHB0OworICAgICAgfQorCisgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJmN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgIC8vIE1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbQorICAgICAgLy8gU2VlbXMgdG8gd29yayB3aXRob3V0IHRoaXMgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMAorICAgICAgS01QX01CKCk7CisKKyAgICAgIG5leHQgPSBxdWV1ZS0+dHFfbmV4dF9jaGlsZDsKKworICAgICAgY3QgPSAtLShxdWV1ZS0+dHFfcmVmX2NvdW50KTsKKyAgICAgIEtNUF9ERUJVR19SRUZfQ1RTKAorICAgICAgICAgICgibGluZSAlZCBndGlkICVkOiBRICVwIGRlYyAlZFxuIiwgX19MSU5FX18sIGdsb2JhbF90aWQsIHF1ZXVlLCBjdCkpOworICAgICAgS01QX0RFQlVHX0FTU0VSVChjdCA+PSAwKTsKKworICAgICAgcXVldWUgPSBuZXh0OworICAgIH0KKworICAgIF9fa21wX3JlbGVhc2VfbG9jaygmY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICB9CisKKyAgcmV0dXJuIHB0OworfQorCisvKiBXYWxrIHVwIHRoZSB0YXNrcSB0cmVlIGxvb2tpbmcgZm9yIGEgdGFzayB0byBleGVjdXRlLiBJZiB3ZSBnZXQgdG8gdGhlIHJvb3QsCisgICBzZWFyY2ggdGhlIHRyZWUgZm9yIGEgZGVzY2VuZGVudCBxdWV1ZSB0YXNrLiBNdXN0IG9ubHkgYmUgY2FsbGVkIHdoZW4KKyAgIGluX3BhcmFsbGVsPVRSVUUgKi8KK3N0YXRpYyBrbXBjX3RodW5rX3QgKgorX19rbXBfZmluZF90YXNrX2luX2FuY2VzdG9yX3F1ZXVlKGttcF90YXNrcV90ICp0cSwga21wX2ludDMyIGdsb2JhbF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wY190YXNrX3F1ZXVlX3QgKmN1cnJfcXVldWUpIHsKKyAga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlOworICBrbXBjX3RodW5rX3QgKnB0OworCisgIHB0ID0gTlVMTDsKKworICBpZiAoY3Vycl9xdWV1ZS0+dHEudHFfcGFyZW50ICE9IE5VTEwpIHsKKyAgICBxdWV1ZSA9IGN1cnJfcXVldWUtPnRxLnRxX3BhcmVudDsKKworICAgIHdoaWxlIChxdWV1ZSAhPSBOVUxMKSB7CisgICAgICBpZiAocXVldWUtPnRxLnRxX3BhcmVudCAhPSBOVUxMKSB7CisgICAgICAgIGludCBjdDsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCZxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgIC8vIE1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbQorICAgICAgICAvLyBTZWVtcyB0byB3b3JrIHdpdGhvdXQgdGhpcyBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwCisgICAgICAgIEtNUF9NQigpOworCisgICAgICAgIGN0ID0gKysocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBpbmMgJWRcbiIsIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgcXVldWUsIGN0KSk7CisgICAgICB9CisKKyAgICAgIHB0ID0gX19rbXBfZmluZF90YXNrX2luX3F1ZXVlKGdsb2JhbF90aWQsIHF1ZXVlKTsKKyAgICAgIGlmIChwdCAhPSBOVUxMKSB7CisgICAgICAgIGlmIChxdWV1ZS0+dHEudHFfcGFyZW50ICE9IE5VTEwpIHsKKyAgICAgICAgICBpbnQgY3Q7CisgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCZxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgLy8gTWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtCisgICAgICAgICAgLy8gU2VlbXMgdG8gd29yayB3aXRob3V0IHRoaXMgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMAorICAgICAgICAgIEtNUF9NQigpOworCisgICAgICAgICAgY3QgPSAtLShxdWV1ZS0+dHFfcmVmX2NvdW50KTsKKyAgICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBkZWMgJWRcbiIsIF9fTElORV9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCBxdWV1ZSwgY3QpKTsKKyAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGN0ID49IDApOworCisgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCZxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcHQ7CisgICAgICB9CisKKyAgICAgIGlmIChxdWV1ZS0+dHEudHFfcGFyZW50ICE9IE5VTEwpIHsKKyAgICAgICAgaW50IGN0OworICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJnF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgLy8gTWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtCisgICAgICAgIC8vIFNlZW1zIHRvIHdvcmsgd2l0aG91dCB0aGlzIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAKKyAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgY3QgPSAtLShxdWV1ZS0+dHFfcmVmX2NvdW50KTsKKyAgICAgICAgS01QX0RFQlVHX1JFRl9DVFMoKCJsaW5lICVkIGd0aWQgJWQ6IFEgJXAgZGVjICVkXG4iLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsIHF1ZXVlLCBjdCkpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGN0ID49IDApOworICAgICAgfQorICAgICAgcXVldWUgPSBxdWV1ZS0+dHEudHFfcGFyZW50OworCisgICAgICBpZiAocXVldWUgIT0gTlVMTCkKKyAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCZxdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgIH0KKyAgfQorCisgIHB0ID0gX19rbXBfZmluZF90YXNrX2luX2Rlc2NlbmRhbnRfcXVldWUoZ2xvYmFsX3RpZCwgdHEtPnRxX3Jvb3QpOworCisgIHJldHVybiBwdDsKK30KKworc3RhdGljIGludCBfX2ttcF90YXNrcV90YXNrc19maW5pc2hlZChrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWUpIHsKKyAgaW50IGk7CisKKyAgLyogS01QX01CKCk7ICovIC8qIGlzIHRoaXMgcmVhbGx5IG5lY2Vzc2FyeT8gKi8KKworICBmb3IgKGkgPSAwOyBpIDwgcXVldWUtPnRxX25wcm9jOyBpKyspIHsKKyAgICBpZiAocXVldWUtPnRxX3RoX3RodW5rc1tpXS5haV9kYXRhICE9IDApCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBfX2ttcF90YXNrcV9oYXNfYW55X2NoaWxkcmVuKGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSkgeworICByZXR1cm4gKHF1ZXVlLT50cV9maXJzdF9jaGlsZCAhPSBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgX19rbXBfcmVtb3ZlX3F1ZXVlX2Zyb21fdHJlZShrbXBfdGFza3FfdCAqdHEsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbl9wYXJhbGxlbCkgeworI2lmZGVmIEtNUF9ERUJVRworICBrbXBfaW50MzIgaTsKKyAga21wY190aHVua190ICp0aHVuazsKKyNlbmRpZgorCisgIEtGX1RSQUNFKDUwLAorICAgICAgICAgICAoIkJlZm9yZSBEZWxldGlvbiBvZiBUYXNrUSBhdCAlcCBvbiAoJWQpOlxuIiwgcXVldWUsIGdsb2JhbF90aWQpKTsKKyAgS0ZfRFVNUCg1MCwgX19rbXBfZHVtcF90YXNrX3F1ZXVlKHRxLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworCisgIC8qICBzdWItcXVldWUgaW4gYSByZWN1cnNpb24sIG5vdCB0aGUgcm9vdCB0YXNrIHF1ZXVlICAqLworICBLTVBfREVCVUdfQVNTRVJUKHF1ZXVlLT50cS50cV9wYXJlbnQgIT0gTlVMTCk7CisKKyAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgX19rbXBfYWNxdWlyZV9sb2NrKCZxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgLy8gTWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbQorICAgIC8vIFNlZW1zIHRvIHdvcmsgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMAorICAgIEtNUF9NQigpOworICB9CisKKyAgS01QX0RFQlVHX0FTU0VSVChxdWV1ZS0+dHFfZmlyc3RfY2hpbGQgPT0gTlVMTCk7CisKKyAgLyogIHVubGluayBxdWV1ZSBmcm9tIGl0cyBzaWJsaW5ncyBpZiBhbnkgYXQgdGhpcyBsZXZlbCAgKi8KKyAgaWYgKHF1ZXVlLT50cV9wcmV2X2NoaWxkICE9IE5VTEwpCisgICAgcXVldWUtPnRxX3ByZXZfY2hpbGQtPnRxX25leHRfY2hpbGQgPSBxdWV1ZS0+dHFfbmV4dF9jaGlsZDsKKyAgaWYgKHF1ZXVlLT50cV9uZXh0X2NoaWxkICE9IE5VTEwpCisgICAgcXVldWUtPnRxX25leHRfY2hpbGQtPnRxX3ByZXZfY2hpbGQgPSBxdWV1ZS0+dHFfcHJldl9jaGlsZDsKKyAgaWYgKHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2ZpcnN0X2NoaWxkID09IHF1ZXVlKQorICAgIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2ZpcnN0X2NoaWxkID0gcXVldWUtPnRxX25leHRfY2hpbGQ7CisKKyAgcXVldWUtPnRxX3ByZXZfY2hpbGQgPSBOVUxMOworICBxdWV1ZS0+dHFfbmV4dF9jaGlsZCA9IE5VTEw7CisKKyAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgS01QX0RFQlVHX1JFRl9DVFMoCisgICAgICAgICgibGluZSAlZCBndGlkICVkOiBRICVwIHdhaXRpbmcgZm9yIHJlZl9jb3VudCBvZiAlZCB0byByZWFjaCAxXG4iLAorICAgICAgICAgX19MSU5FX18sIGdsb2JhbF90aWQsIHF1ZXVlLCBxdWV1ZS0+dHFfcmVmX2NvdW50KSk7CisKKyAgICAvKiB3YWl0IHVudGlsIGFsbCBvdGhlciB0aHJlYWRzIGhhdmUgc3RvcHBlZCBhY2Nlc3NpbmcgdGhpcyBxdWV1ZSAqLworICAgIHdoaWxlIChxdWV1ZS0+dHFfcmVmX2NvdW50ID4gMSkgeworICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCZxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgIEtNUF9XQUlUX1lJRUxEKCh2b2xhdGlsZSBrbXBfdWludDMyICopJnF1ZXVlLT50cV9yZWZfY291bnQsIDEsIEtNUF9MRSwKKyAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJnF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgIC8vIE1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0KKyAgICAgIC8vIFNlZW1zIHRvIHdvcmsgd2l0aG91dCB0aGlzIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAKKyAgICAgIEtNUF9NQigpOworICAgIH0KKworICAgIF9fa21wX3JlbGVhc2VfbG9jaygmcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICB9CisKKyAgS01QX0RFQlVHX1JFRl9DVFMoCisgICAgICAoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBmcmVlaW5nIHF1ZXVlXG4iLCBfX0xJTkVfXywgZ2xvYmFsX3RpZCwgcXVldWUpKTsKKworI2lmZGVmIEtNUF9ERUJVRworICBLTVBfREVCVUdfQVNTRVJUKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9BTExfVEFTS1NfUVVFVUVEKTsKKyAgS01QX0RFQlVHX0FTU0VSVChxdWV1ZS0+dHFfbmZ1bGwgPT0gMCk7CisKKyAgZm9yIChpID0gMDsgaSA8IHF1ZXVlLT50cV9ucHJvYzsgaSsrKSB7CisgICAgS01QX0RFQlVHX0FTU0VSVChxdWV1ZS0+dHFfdGhfdGh1bmtzW2ldLmFpX2RhdGEgPT0gMCk7CisgIH0KKworICBpID0gMDsKKyAgZm9yICh0aHVuayA9IHF1ZXVlLT50cV9mcmVlX3RodW5rczsgdGh1bmsgIT0gTlVMTDsKKyAgICAgICB0aHVuayA9IHRodW5rLT50aC50aF9uZXh0X2ZyZWUpCisgICAgKytpOworCisgIEtNUF9BU1NFUlQoaSA9PQorICAgICAgICAgICAgIHF1ZXVlLT50cV9uc2xvdHMgKyAocXVldWUtPnRxX25wcm9jICogX19LTVBfVEFTS1FfVEhVTktTX1BFUl9USCkpOworI2VuZGlmCisKKyAgLyogIHJlbGVhc2Ugc3RvcmFnZSBmb3IgcXVldWUgZW50cnkgICovCisgIF9fa21wX2ZyZWVfdGFza3EodHEsIHF1ZXVlLCBUUlVFLCBnbG9iYWxfdGlkKTsKKworICBLRl9UUkFDRSg1MCwgKCJBZnRlciBEZWxldGlvbiBvZiBUYXNrUSBhdCAlcCBvbiAoJWQpOlxuIiwgcXVldWUsIGdsb2JhbF90aWQpKTsKKyAgS0ZfRFVNUCg1MCwgX19rbXBfZHVtcF90YXNrX3F1ZXVlX3RyZWUodHEsIHRxLT50cV9yb290LCBnbG9iYWxfdGlkKSk7Cit9CisKKy8qIFN0YXJ0aW5nIGZyb20gaW5kaWNhdGVkIHF1ZXVlLCBwcm9jZWVkIGRvd253YXJkIHRocm91Z2ggdHJlZSBhbmQgcmVtb3ZlIGFsbAorICAgdGFza3FzIHdoaWNoIGFyZSBmaW5pc2hlZCwgYnV0IG9ubHkgZ28gZG93biB0byB0YXNrcXMgd2hpY2ggaGF2ZSB0aGUgIm5vd2FpdCIKKyAgIGNsYXVzZSBwcmVzZW50LiAgQXNzdW1lIHRoaXMgaXMgb25seSBjYWxsZWQgd2hlbiBpbl9wYXJhbGxlbD1UUlVFLiAqLworCitzdGF0aWMgdm9pZCBfX2ttcF9maW5kX2FuZF9yZW1vdmVfZmluaXNoZWRfY2hpbGRfdGFza3EoCisgICAga21wX3Rhc2txX3QgKnRxLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190YXNrX3F1ZXVlX3QgKmN1cnJfcXVldWUpIHsKKyAga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlID0gY3Vycl9xdWV1ZTsKKworICBpZiAoY3Vycl9xdWV1ZS0+dHFfZmlyc3RfY2hpbGQgIT0gTlVMTCkgeworICAgIF9fa21wX2FjcXVpcmVfbG9jaygmY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgIC8vIE1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0KKyAgICAvLyBTZWVtcyB0byB3b3JrIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAKKyAgICBLTVBfTUIoKTsKKworICAgIHF1ZXVlID0gQ0NBU1Qoa21wY190YXNrX3F1ZXVlX3QgKiwgY3Vycl9xdWV1ZS0+dHFfZmlyc3RfY2hpbGQpOworICAgIGlmIChxdWV1ZSAhPSBOVUxMKSB7CisgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJmN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3aGlsZSAocXVldWUgIT0gTlVMTCkgeworICAgICAga21wY190YXNrX3F1ZXVlX3QgKm5leHQ7CisgICAgICBpbnQgY3QgPSArKyhxdWV1ZS0+dHFfcmVmX2NvdW50KTsKKyAgICAgIEtNUF9ERUJVR19SRUZfQ1RTKAorICAgICAgICAgICgibGluZSAlZCBndGlkICVkOiBRICVwIGluYyAlZFxuIiwgX19MSU5FX18sIGdsb2JhbF90aWQsIHF1ZXVlLCBjdCkpOworCisgICAgICAvKiBhbHRob3VnaCByZWZlcmVuY2UgY291bnQgc3RheXMgYWN0aXZlIGR1cmluZyBkZXNjZW5kYW50IHdhbGssICovCisgICAgICAvKiBzaG91bGRuJ3QgbWF0dGVyIHNpbmNlIGlmIGNoaWxkcmVuIHN0aWxsIGV4aXN0LCByZWZlcmVuY2UgICAgICovCisgICAgICAvKiBjb3VudHMgYXJlbid0IGJlaW5nIG1vbml0b3JlZCBhbnl3YXkgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgIGlmIChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfSVNfTk9XQUlUKSB7CisgICAgICAgIF9fa21wX2ZpbmRfYW5kX3JlbW92ZV9maW5pc2hlZF9jaGlsZF90YXNrcSh0cSwgZ2xvYmFsX3RpZCwgcXVldWUpOworCisgICAgICAgIGlmICgocXVldWUtPnRxX2ZsYWdzICYgVFFGX0FMTF9UQVNLU19RVUVVRUQpICYmCisgICAgICAgICAgICAocXVldWUtPnRxX25mdWxsID09IDApICYmIF9fa21wX3Rhc2txX3Rhc2tzX2ZpbmlzaGVkKHF1ZXVlKSAmJgorICAgICAgICAgICAgIV9fa21wX3Rhc2txX2hhc19hbnlfY2hpbGRyZW4ocXVldWUpKSB7CisKKyAgICAgICAgICAvKiBPbmx5IHJlbW92ZSB0aGlzIGlmIHdlIGhhdmUgbm90IGFscmVhZHkgbWFya2VkIGl0IGZvciBkZWFsbG9jYXRpb24uCisgICAgICAgICAgICAgVGhpcyBzaG91bGQgcHJldmVudCBtdWx0aXBsZSB0aHJlYWRzIGZyb20gdHJ5aW5nIHRvIGZyZWUgdGhpcy4gKi8KKworICAgICAgICAgIGlmIChfX2ttcF90ZXN0X2xvY2soJnF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpKSB7CisgICAgICAgICAgICBpZiAoIShxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfREVBTExPQ0FURUQpKSB7CisgICAgICAgICAgICAgIHF1ZXVlLT50cV9mbGFncyB8PSBUUUZfREVBTExPQ0FURUQ7CisgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgICAgX19rbXBfcmVtb3ZlX3F1ZXVlX2Zyb21fdHJlZSh0cSwgZ2xvYmFsX3RpZCwgcXVldWUsIFRSVUUpOworCisgICAgICAgICAgICAgIC8qIENhbid0IGRvIGFueSBtb3JlIGhlcmUgc2luY2UgY2FuJ3QgYmUgc3VyZSB3aGVyZSBzaWJsaW5nIHF1ZXVlCisgICAgICAgICAgICAgICAqIGlzIHNvIGp1c3QgZXhpdCB0aGlzIGxldmVsICovCisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIC8qIG90aGVyd2lzZSwganVzdCBmYWxsIHRocm91Z2ggYW5kIGRlY3JlbWVudCByZWZlcmVuY2UgY291bnQgKi8KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJmN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgIC8vIE1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0KKyAgICAgIC8vIFNlZW1zIHRvIHdvcmsgd2l0aG91dCB0aGlzIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAKKyAgICAgIEtNUF9NQigpOworCisgICAgICBuZXh0ID0gcXVldWUtPnRxX25leHRfY2hpbGQ7CisKKyAgICAgIGN0ID0gLS0ocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgICBLTVBfREVCVUdfUkVGX0NUUygKKyAgICAgICAgICAoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBkZWMgJWRcbiIsIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSwgY3QpKTsKKyAgICAgIEtNUF9ERUJVR19BU1NFUlQoY3QgPj0gMCk7CisKKyAgICAgIHF1ZXVlID0gbmV4dDsKKyAgICB9CisKKyAgICBfX2ttcF9yZWxlYXNlX2xvY2soJmN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgfQorfQorCisvKiBTdGFydGluZyBmcm9tIGluZGljYXRlZCBxdWV1ZSwgcHJvY2VlZCBkb3dud2FyZCB0aHJvdWdoIHRyZWUgYW5kIHJlbW92ZSBhbGwKKyAgIHRhc2txJ3MgYXNzdW1pbmcgYWxsIGFyZSBmaW5pc2hlZCBhbmQgYXNzdW1pbmcgTk8gb3RoZXIgdGhyZWFkcyBhcmUgZXhlY3V0aW5nCisgICBhdCB0aGlzIHBvaW50LiAqLworc3RhdGljIHZvaWQgX19rbXBfcmVtb3ZlX2FsbF9jaGlsZF90YXNrcShrbXBfdGFza3FfdCAqdHEsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWUpIHsKKyAga21wY190YXNrX3F1ZXVlX3QgKm5leHRfY2hpbGQ7CisKKyAgcXVldWUgPSBDQ0FTVChrbXBjX3Rhc2tfcXVldWVfdCAqLCBxdWV1ZS0+dHFfZmlyc3RfY2hpbGQpOworCisgIHdoaWxlIChxdWV1ZSAhPSBOVUxMKSB7CisgICAgX19rbXBfcmVtb3ZlX2FsbF9jaGlsZF90YXNrcSh0cSwgZ2xvYmFsX3RpZCwgcXVldWUpOworCisgICAgbmV4dF9jaGlsZCA9IHF1ZXVlLT50cV9uZXh0X2NoaWxkOworICAgIHF1ZXVlLT50cV9mbGFncyB8PSBUUUZfREVBTExPQ0FURUQ7CisgICAgX19rbXBfcmVtb3ZlX3F1ZXVlX2Zyb21fdHJlZSh0cSwgZ2xvYmFsX3RpZCwgcXVldWUsIEZBTFNFKTsKKyAgICBxdWV1ZSA9IG5leHRfY2hpbGQ7CisgIH0KK30KKworc3RhdGljIHZvaWQgX19rbXBfZXhlY3V0ZV90YXNrX2Zyb21fcXVldWUoa21wX3Rhc2txX3QgKnRxLCBpZGVudF90ICpsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgZ2xvYmFsX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcGNfdGh1bmtfdCAqdGh1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5fcGFyYWxsZWwpIHsKKyAga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlID0gdGh1bmstPnRoLnRoX3NoYXJlZHMtPnN2X3F1ZXVlOworICBrbXBfaW50MzIgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChnbG9iYWxfdGlkKTsKKworICBLRl9UUkFDRSgxMDAsICgiQWZ0ZXIgZGVxdWV1ZWluZyB0aGlzIFRhc2sgb24gKCVkKTpcbiIsIGdsb2JhbF90aWQpKTsKKyAgS0ZfRFVNUCgxMDAsIF9fa21wX2R1bXBfdGh1bmsodHEsIHRodW5rLCBnbG9iYWxfdGlkKSk7CisgIEtGX1RSQUNFKDEwMCwgKCJUYXNrIFF1ZXVlOiAlcCBsb29rcyBsaWtlIHRoaXMgKCVkKTpcbiIsIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisgIEtGX0RVTVAoMTAwLCBfX2ttcF9kdW1wX3Rhc2tfcXVldWUodHEsIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisKKyAgLyogRm9yIHRoZSB0YXNrcSB0YXNrLCB0aGUgY3Vycl90aHVuayBwdXNoZXMgYW5kIHBvcCBwYWlycyBhcmUgc2V0IHVwIGFzCisgICAqIGZvbGxvd3M6CisgICAqCisgICAqIGhhcHBlbnMgZXhhY3RseSBvbmNlOgorICAgKiAxKSBfX2ttcGNfdGFza3EgICAgICAgICAgICAgOiBwdXNoIChpZiByZXR1cm5pbmcgdGh1bmsgb25seSkKKyAgICogNCkgX19rbXBjX2VuZF90YXNrcV90YXNrICAgIDogcG9wCisgICAqCisgICAqIG9wdGlvbmFsbHkgaGFwcGVucyAqZWFjaCogdGltZSB0YXNrcSB0YXNrIGlzIGRlcXVldWVkL2VucXVldWVkOgorICAgKiAyKSBfX2ttcGNfdGFza3FfdGFzayAgICAgICAgOiBwb3AKKyAgICogMykgX19rbXBfZXhlY3V0ZV90YXNrX2Zyb21fcXVldWUgIDogcHVzaAorICAgKgorICAgKiBleGVjdXRpb24gb3JkZXJpbmc6ICAxLCgyLDMpKiw0CisgICAqLworCisgIGlmICghKHRodW5rLT50aF9mbGFncyAmIFRRRl9UQVNLUV9UQVNLKSkgeworICAgIGttcF9pbnQzMiBpbmRleCA9IChxdWV1ZSA9PSB0cS0+dHFfcm9vdCkgPyB0aWQgOiAwOworICAgIHRodW5rLT50aC50aF9zaGFyZWRzID0KKyAgICAgICAgQ0NBU1Qoa21wY19zaGFyZWRfdmFyc190ICosIHF1ZXVlLT50cV9zaGFyZWRzW2luZGV4XS5haV9kYXRhKTsKKworICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgIF9fa21wX3B1c2hfd29ya3NoYXJlKGdsb2JhbF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAocXVldWUtPnRxX2ZsYWdzICYgVFFGX0lTX09SREVSRUQpID8gY3RfdGFza19vcmRlcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY3RfdGFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLT50cV9sb2MpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKQorICAgICAgX19rbXBfcHVzaF93b3Jrc2hhcmUoZ2xvYmFsX3RpZCwgY3RfdGFza3EsIHF1ZXVlLT50cV9sb2MpOworICB9CisKKyAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgdGh1bmstPnRoX2VuY2xfdGh1bmsgPSB0cS0+dHFfY3Vycl90aHVua1t0aWRdOworICAgIHRxLT50cV9jdXJyX3RodW5rW3RpZF0gPSB0aHVuazsKKworICAgIEtGX0RVTVAoMjAwLCBfX2ttcF9kdW1wX3RodW5rX3N0YWNrKHRxLT50cV9jdXJyX3RodW5rW3RpZF0sIGdsb2JhbF90aWQpKTsKKyAgfQorCisgIEtGX1RSQUNFKDUwLCAoIkJlZ2luIEV4ZWN1dGluZyBUaHVuayAlcCBmcm9tIHF1ZXVlICVwIG9uICglZClcbiIsIHRodW5rLAorICAgICAgICAgICAgICAgIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisgIHRodW5rLT50aF90YXNrKGdsb2JhbF90aWQsIHRodW5rKTsKKyAgS0ZfVFJBQ0UoNTAsICgiRW5kIEV4ZWN1dGluZyBUaHVuayAlcCBmcm9tIHF1ZXVlICVwIG9uICglZClcbiIsIHRodW5rLCBxdWV1ZSwKKyAgICAgICAgICAgICAgICBnbG9iYWxfdGlkKSk7CisKKyAgaWYgKCEodGh1bmstPnRoX2ZsYWdzICYgVFFGX1RBU0tRX1RBU0spKSB7CisgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykKKyAgICAgIF9fa21wX3BvcF93b3Jrc2hhcmUoZ2xvYmFsX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9JU19PUkRFUkVEKSA/IGN0X3Rhc2tfb3JkZXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY3RfdGFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUtPnRxX2xvYyk7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgIHRxLT50cV9jdXJyX3RodW5rW3RpZF0gPSB0aHVuay0+dGhfZW5jbF90aHVuazsKKyAgICAgIHRodW5rLT50aF9lbmNsX3RodW5rID0gTlVMTDsKKyAgICAgIEtGX0RVTVAoMjAwLCBfX2ttcF9kdW1wX3RodW5rX3N0YWNrKHRxLT50cV9jdXJyX3RodW5rW3RpZF0sIGdsb2JhbF90aWQpKTsKKyAgICB9CisKKyAgICBpZiAoKHRodW5rLT50aF9mbGFncyAmIFRRRl9JU19PUkRFUkVEKSAmJiBpbl9wYXJhbGxlbCkgeworICAgICAgX19rbXBfdGFza3FfY2hlY2tfb3JkZXJlZChnbG9iYWxfdGlkLCB0aHVuayk7CisgICAgfQorCisgICAgX19rbXBfZnJlZV90aHVuayhxdWV1ZSwgdGh1bmssIGluX3BhcmFsbGVsLCBnbG9iYWxfdGlkKTsKKworICAgIEtGX1RSQUNFKDEwMCwgKCJUIyVkIEFmdGVyIGZyZWVpbmcgdGh1bms6ICVwLCBUYXNrUSBsb29rcyBsaWtlIHRoaXM6XG4iLAorICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsIHRodW5rKSk7CisgICAgS0ZfRFVNUCgxMDAsIF9fa21wX2R1bXBfdGFza19xdWV1ZSh0cSwgcXVldWUsIGdsb2JhbF90aWQpKTsKKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgS01QX01CKCk7IC8qIG5lZWRlZCBzbyB0aHVuayBwdXQgb24gZnJlZSBsaXN0IGJlZm9yZSBvdXRzdGFuZGluZyB0aHVuaworICAgICAgICAgICAgICAgICAgIGNvdW50IGlzIGRlY3JlbWVudGVkICovCisKKyAgICAgIEtNUF9ERUJVR19BU1NFUlQocXVldWUtPnRxX3RoX3RodW5rc1t0aWRdLmFpX2RhdGEgPj0gMSk7CisKKyAgICAgIEtGX1RSQUNFKAorICAgICAgICAgIDIwMCwKKyAgICAgICAgICAoIl9fa21wX2V4ZWN1dGVfdGFza19mcm9tX3F1ZXVlOiBUIyVkIGhhcyAlZCB0aHVua3MgaW4gcXVldWUgJXBcbiIsCisgICAgICAgICAgIGdsb2JhbF90aWQsIHF1ZXVlLT50cV90aF90aHVua3NbdGlkXS5haV9kYXRhIC0gMSwgcXVldWUpKTsKKworICAgICAgcXVldWUtPnRxX3RoX3RodW5rc1t0aWRdLmFpX2RhdGEtLTsKKworICAgICAgLyogS01QX01CKCk7ICovIC8qIGlzIE1CIHJlYWxseSBuZWNlc3NhcnkgPyAqLworICAgIH0KKworICAgIGlmIChxdWV1ZS0+dHEudHFfcGFyZW50ICE9IE5VTEwgJiYgaW5fcGFyYWxsZWwpIHsKKyAgICAgIGludCBjdDsKKyAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgICAgY3QgPSAtLShxdWV1ZS0+dHFfcmVmX2NvdW50KTsKKyAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgICAgS01QX0RFQlVHX1JFRl9DVFMoCisgICAgICAgICAgKCJsaW5lICVkIGd0aWQgJWQ6IFEgJXAgZGVjICVkXG4iLCBfX0xJTkVfXywgZ2xvYmFsX3RpZCwgcXVldWUsIGN0KSk7CisgICAgICBLTVBfREVCVUdfQVNTRVJUKGN0ID49IDApOworICAgIH0KKyAgfQorfQorCisvKiBzdGFydHMgYSB0YXNrcTsgY3JlYXRlcyBhbmQgcmV0dXJucyBhIHRodW5rIGZvciB0aGUgdGFza3FfdGFzayAgICAgICAgKi8KKy8qIGFsc28sIHJldHVybnMgcG9pbnRlciB0byBzaGFyZWQgdmFycyBmb3IgdGhpcyB0aHJlYWQgaW4gInNoYXJlZHMiIGFyZyAqLwora21wY190aHVua190ICpfX2ttcGNfdGFza3EoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcGNfdGFza190IHRhc2txX3Rhc2ssIHNpemVfdCBzaXplb2ZfdGh1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZW9mX3NoYXJlZHMsIGttcF9pbnQzMiBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcGNfc2hhcmVkX3ZhcnNfdCAqKnNoYXJlZHMpIHsKKyAgaW50IGluX3BhcmFsbGVsOworICBrbXBfaW50MzIgbnNsb3RzLCBudGh1bmtzLCBuc2hhcmVkcywgbnByb2M7CisgIGttcGNfdGFza19xdWV1ZV90ICpuZXdfcXVldWUsICpjdXJyX3F1ZXVlOworICBrbXBjX3RodW5rX3QgKm5ld190YXNrcV90aHVuazsKKyAga21wX2luZm9fdCAqdGg7CisgIGttcF90ZWFtX3QgKnRlYW07CisgIGttcF90YXNrcV90ICp0cTsKKyAga21wX2ludDMyIHRpZDsKKworICBLRV9UUkFDRSgxMCwgKCJfX2ttcGNfdGFza3EgY2FsbGVkICglZClcbiIsIGdsb2JhbF90aWQpKTsKKworICB0aCA9IF9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF07CisgIHRlYW0gPSB0aC0+dGgudGhfdGVhbTsKKyAgdHEgPSAmdGVhbS0+dC50X3Rhc2txOworICBucHJvYyA9IHRlYW0tPnQudF9ucHJvYzsKKyAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChnbG9iYWxfdGlkKTsKKworICAvKiBmaW5kIG91dCB3aGV0aGVyIHRoaXMgaXMgYSBwYXJhbGxlbCB0YXNrcSBvciBzZXJpYWxpemVkIG9uZS4gKi8KKyAgaW5fcGFyYWxsZWwgPSBpbl9wYXJhbGxlbF9jb250ZXh0KHRlYW0pOworCisgIGlmICghdHEtPnRxX3Jvb3QpIHsKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgIC8qIFZlY3RvciBPUkRFUkVEIFNFQ1RJT04gdG8gdGFza3EgdmVyc2lvbiAqLworICAgICAgdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kZW9fZmNuID0gX19rbXBfdGFza3FfZW87CisKKyAgICAgIC8qIFZlY3RvciBPUkRFUkVEIFNFQ1RJT04gdG8gdGFza3EgdmVyc2lvbiAqLworICAgICAgdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9keG9fZmNuID0gX19rbXBfdGFza3FfeG87CisgICAgfQorCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAvLyBUaGlzIHNob3VsZG4ndCBiZSBhIGJhcnJpZXIgcmVnaW9uIGJvdW5kYXJ5LCBpdCB3aWxsIGNvbmZ1c2UgdGhlIHVzZXIuCisgICAgICAvKiBOZWVkIHRoZSBib3VuZGFyeSB0byBiZSBhdCB0aGUgZW5kIHRhc2txIGluc3RlYWQuICovCisgICAgICBpZiAoX19rbXBfYmFycmllcihic19wbGFpbl9iYXJyaWVyLCBnbG9iYWxfdGlkLCBUUlVFLCAwLCBOVUxMLCBOVUxMKSkgeworICAgICAgICAvKiBDcmVhdGluZyB0aGUgYWN0aXZlIHJvb3QgcXVldWUsIGFuZCB3ZSBhcmUgbm90IHRoZSBtYXN0ZXIgdGhyZWFkLiAqLworICAgICAgICAvKiBUaGUgbWFzdGVyIHRocmVhZCBiZWxvdyBjcmVhdGVkIHRoZSBxdWV1ZSBhbmQgdGFza3MgaGF2ZSBiZWVuICAgICAqLworICAgICAgICAvKiBlbnF1ZXVlZCwgYW5kIHRoZSBtYXN0ZXIgdGhyZWFkIHJlbGVhc2VkIHRoaXMgYmFycmllci4gIFRoaXMgICAgICAqLworICAgICAgICAvKiB3b3JrZXIgdGhyZWFkIGNhbiBub3cgcHJvY2VlZCBhbmQgZXhlY3V0ZSB0YXNrcy4gIFNlZSBhbHNvIHRoZSAgICAqLworICAgICAgICAvKiBUUUZfUkVMRUFTRV9XT1JLRVJTIHdoaWNoIGlzIHVzZWQgdG8gaGFuZGxlIHRoaXMgY2FzZS4gICAgICAgICAgICAqLworICAgICAgICAqc2hhcmVkcyA9CisgICAgICAgICAgICBDQ0FTVChrbXBjX3NoYXJlZF92YXJzX3QgKiwgdHEtPnRxX3Jvb3QtPnRxX3NoYXJlZHNbdGlkXS5haV9kYXRhKTsKKyAgICAgICAgS0VfVFJBQ0UoMTAsICgiX19rbXBjX3Rhc2txIHJldHVybiAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgfQorCisgICAgLyogbWFzdGVyIHRocmVhZCBvbmx5IGV4ZWN1dGVzIHRoaXMgY29kZSAqLworICAgIGlmICh0cS0+dHFfY3Vycl90aHVua19jYXBhY2l0eSA8IG5wcm9jKSB7CisgICAgICBpZiAodHEtPnRxX2N1cnJfdGh1bmspCisgICAgICAgIF9fa21wX2ZyZWUodHEtPnRxX2N1cnJfdGh1bmspOworICAgICAgZWxzZSB7CisgICAgICAgIC8qIG9ubHkgbmVlZCB0byBkbyB0aGlzIG9uY2UgYXQgb3V0ZXIgbGV2ZWwsIGkuZS4gd2hlbiB0cV9jdXJyX3RodW5rIGlzCisgICAgICAgICAqIHN0aWxsIE5VTEwgKi8KKyAgICAgICAgX19rbXBfaW5pdF9sb2NrKCZ0cS0+dHFfZnJlZWxpc3RfbGNrKTsKKyAgICAgIH0KKworICAgICAgdHEtPnRxX2N1cnJfdGh1bmsgPQorICAgICAgICAgIChrbXBjX3RodW5rX3QgKiopX19rbXBfYWxsb2NhdGUobnByb2MgKiBzaXplb2Yoa21wY190aHVua190ICopKTsKKyAgICAgIHRxLT50cV9jdXJyX3RodW5rX2NhcGFjaXR5ID0gbnByb2M7CisgICAgfQorCisgICAgaWYgKGluX3BhcmFsbGVsKQorICAgICAgdHEtPnRxX2dsb2JhbF9mbGFncyA9IFRRRl9SRUxFQVNFX1dPUktFUlM7CisgIH0KKworICAvKiBka3A6IGluIGZ1dHVyZSwgaWYgZmxhZ3MgJiBUUUZfSEVVUklTVElDUywgd2lsbCBjaG9vc2UgbnNsb3RzIGJhc2VkICovCisgIC8qICAgICAgb24gc29tZSBoZXVyaXN0aWNzIChlLmcuLCBkZXB0aCBvZiBxdWV1ZSBuZXN0aW5nPykuICAgICAgICAgICAgKi8KKyAgbnNsb3RzID0gKGluX3BhcmFsbGVsKSA/ICgyICogbnByb2MpIDogMTsKKworICAvKiBUaGVyZSBtdXN0IGJlIG5wcm9jICogX19LTVBfVEFTS1FfVEhVTktTX1BFUl9USCBleHRyYSBzbG90cyBmb3IgcGVuZGluZyAqLworICAvKiBqb2JzIGJlaW5nIGV4ZWN1dGVkIGJ5IG90aGVyIHRocmVhZHMsIGFuZCBvbmUgZXh0cmEgZm9yIHRhc2txIHNsb3QgKi8KKyAgbnRodW5rcyA9IChpbl9wYXJhbGxlbCkgPyAobnNsb3RzICsgKG5wcm9jICogX19LTVBfVEFTS1FfVEhVTktTX1BFUl9USCkgKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5zbG90cyArIDI7CisKKyAgLyogT25seSB0aGUgcm9vdCB0YXNrcSBnZXRzIGEgcGVyLXRocmVhZCBhcnJheSBvZiBzaGFyZWRzLiAgICAgICAqLworICAvKiBUaGUgcmVzdCBvZiB0aGUgdGFza3EncyBvbmx5IGdldCBvbmUgY29weSBvZiB0aGUgc2hhcmVkIHZhcnMuICovCisgIG5zaGFyZWRzID0gKCF0cS0+dHFfcm9vdCAmJiBpbl9wYXJhbGxlbCkgPyBucHJvYyA6IDE7CisKKyAgLyogIGNyZWF0ZSBvdmVyYWxsIHF1ZXVlIGRhdGEgc3RydWN0dXJlIGFuZCBpdHMgY29tcG9uZW50cyB0aGF0IHJlcXVpcmUKKyAgICogYWxsb2NhdGlvbiAqLworICBuZXdfcXVldWUgPSBfX2ttcF9hbGxvY190YXNrcSh0cSwgaW5fcGFyYWxsZWwsIG5zbG90cywgbnRodW5rcywgbnNoYXJlZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5wcm9jLCBzaXplb2ZfdGh1bmssIHNpemVvZl9zaGFyZWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3X3Rhc2txX3RodW5rLCBnbG9iYWxfdGlkKTsKKworICAvKiAgcmVzdCBvZiBuZXdfcXVldWUgaW5pdGlhbGl6YXRpb25zICAqLworICBuZXdfcXVldWUtPnRxX2ZsYWdzID0gZmxhZ3MgJiBUUUZfSU5URVJGQUNFX0ZMQUdTOworCisgIGlmIChpbl9wYXJhbGxlbCkgeworICAgIG5ld19xdWV1ZS0+dHFfdGFza251bV9xdWV1aW5nID0gMDsKKyAgICBuZXdfcXVldWUtPnRxX3Rhc2tudW1fc2VydmluZyA9IDA7CisgICAgbmV3X3F1ZXVlLT50cV9mbGFncyB8PSBUUUZfUEFSQUxMRUxfQ09OVEVYVDsKKyAgfQorCisgIG5ld19xdWV1ZS0+dHFfdGFza3Ffc2xvdCA9IE5VTEw7CisgIG5ld19xdWV1ZS0+dHFfbnNsb3RzID0gbnNsb3RzOworICBuZXdfcXVldWUtPnRxX2hpd2F0ID0gSElHSF9XQVRFUl9NQVJLKG5zbG90cyk7CisgIG5ld19xdWV1ZS0+dHFfbmZ1bGwgPSAwOworICBuZXdfcXVldWUtPnRxX2hlYWQgPSAwOworICBuZXdfcXVldWUtPnRxX3RhaWwgPSAwOworICBuZXdfcXVldWUtPnRxX2xvYyA9IGxvYzsKKworICBpZiAoKG5ld19xdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfSVNfT1JERVJFRCkgJiYgaW5fcGFyYWxsZWwpIHsKKyAgICAvKiBwcmVwYXJlIHRvIHNlcnZlIHRoZSBmaXJzdC1xdWV1ZWQgdGFzaydzIE9SREVSRUQgZGlyZWN0aXZlICovCisgICAgbmV3X3F1ZXVlLT50cV90YXNrbnVtX3NlcnZpbmcgPSAxOworCisgICAgLyogVmVjdG9yIE9SREVSRUQgU0VDVElPTiB0byB0YXNrcSB2ZXJzaW9uICovCisgICAgdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kZW9fZmNuID0gX19rbXBfdGFza3FfZW87CisKKyAgICAvKiBWZWN0b3IgT1JERVJFRCBTRUNUSU9OIHRvIHRhc2txIHZlcnNpb24gKi8KKyAgICB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2R4b19mY24gPSBfX2ttcF90YXNrcV94bzsKKyAgfQorCisgIC8qICBjcmVhdGUgYSBuZXcgdGh1bmsgZm9yIHRoZSB0YXNrcV90YXNrIGluIHRoZSBuZXdfcXVldWUgICovCisgICpzaGFyZWRzID0gQ0NBU1Qoa21wY19zaGFyZWRfdmFyc190ICosIG5ld19xdWV1ZS0+dHFfc2hhcmVkc1swXS5haV9kYXRhKTsKKworICBuZXdfdGFza3FfdGh1bmstPnRoLnRoX3NoYXJlZHMgPSAqc2hhcmVkczsKKyAgbmV3X3Rhc2txX3RodW5rLT50aF90YXNrID0gdGFza3FfdGFzazsKKyAgbmV3X3Rhc2txX3RodW5rLT50aF9mbGFncyA9IG5ld19xdWV1ZS0+dHFfZmxhZ3MgfCBUUUZfVEFTS1FfVEFTSzsKKyAgbmV3X3Rhc2txX3RodW5rLT50aF9zdGF0dXMgPSAwOworCisgIEtNUF9ERUJVR19BU1NFUlQobmV3X3Rhc2txX3RodW5rLT50aF9mbGFncyAmIFRRRl9UQVNLUV9UQVNLKTsKKworICAvLyBNYWtlIHN1cmUgdGhlc2UgaW5pdHMgY29tcGxldGUgYmVmb3JlIHRocmVhZHMgc3RhcnQgdXNpbmcgdGhpcyBxdWV1ZQorICAvKiBLTVBfTUIoKTsgKi8gLy8gKG5lY2Vzc2FyeT8pCisKKyAgLyogaW5zZXJ0IHRoZSBuZXcgdGFzayBxdWV1ZSBpbnRvIHRoZSB0cmVlLCBidXQgb25seSBhZnRlciBhbGwgZmllbGRzCisgICAqIGluaXRpYWxpemVkICovCisKKyAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgaWYgKCF0cS0+dHFfcm9vdCkgeworICAgICAgbmV3X3F1ZXVlLT50cS50cV9wYXJlbnQgPSBOVUxMOworICAgICAgbmV3X3F1ZXVlLT50cV9maXJzdF9jaGlsZCA9IE5VTEw7CisgICAgICBuZXdfcXVldWUtPnRxX25leHRfY2hpbGQgPSBOVUxMOworICAgICAgbmV3X3F1ZXVlLT50cV9wcmV2X2NoaWxkID0gTlVMTDsKKyAgICAgIG5ld19xdWV1ZS0+dHFfcmVmX2NvdW50ID0gMTsKKyAgICAgIHRxLT50cV9yb290ID0gbmV3X3F1ZXVlOworICAgIH0gZWxzZSB7CisgICAgICBjdXJyX3F1ZXVlID0gdHEtPnRxX2N1cnJfdGh1bmtbdGlkXS0+dGgudGhfc2hhcmVkcy0+c3ZfcXVldWU7CisgICAgICBuZXdfcXVldWUtPnRxLnRxX3BhcmVudCA9IGN1cnJfcXVldWU7CisgICAgICBuZXdfcXVldWUtPnRxX2ZpcnN0X2NoaWxkID0gTlVMTDsKKyAgICAgIG5ld19xdWV1ZS0+dHFfcHJldl9jaGlsZCA9IE5VTEw7CisgICAgICBuZXdfcXVldWUtPnRxX3JlZl9jb3VudCA9CisgICAgICAgICAgMTsgLyogZm9yIHRoaXMgdGhlIHRocmVhZCB0aGF0IGJ1aWx0IHRoZSBxdWV1ZSAqLworCisgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBhbGxvYyAlZFxuIiwgX19MSU5FX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgbmV3X3F1ZXVlLCBuZXdfcXVldWUtPnRxX3JlZl9jb3VudCkpOworCisgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJmN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgLy8gTWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbQorICAgICAgLy8gU2VlbXMgdG8gd29yayB3aXRob3V0IHRoaXMgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMAorICAgICAgS01QX01CKCk7CisKKyAgICAgIG5ld19xdWV1ZS0+dHFfbmV4dF9jaGlsZCA9CisgICAgICAgICAgQ0NBU1Qoc3RydWN0IGttcGNfdGFza19xdWV1ZV90ICosIGN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkKTsKKworICAgICAgaWYgKGN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkICE9IE5VTEwpCisgICAgICAgIGN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkLT50cV9wcmV2X2NoaWxkID0gbmV3X3F1ZXVlOworCisgICAgICBjdXJyX3F1ZXVlLT50cV9maXJzdF9jaGlsZCA9IG5ld19xdWV1ZTsKKworICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCZjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgfQorCisgICAgLyogc2V0IHVwIHRodW5rIHN0YWNrIG9ubHkgYWZ0ZXIgY29kZSB0aGF0IGRldGVybWluZXMgY3Vycl9xdWV1ZSBhYm92ZSAqLworICAgIG5ld190YXNrcV90aHVuay0+dGhfZW5jbF90aHVuayA9IHRxLT50cV9jdXJyX3RodW5rW3RpZF07CisgICAgdHEtPnRxX2N1cnJfdGh1bmtbdGlkXSA9IG5ld190YXNrcV90aHVuazsKKworICAgIEtGX0RVTVAoMjAwLCBfX2ttcF9kdW1wX3RodW5rX3N0YWNrKHRxLT50cV9jdXJyX3RodW5rW3RpZF0sIGdsb2JhbF90aWQpKTsKKyAgfSBlbHNlIHsKKyAgICBuZXdfdGFza3FfdGh1bmstPnRoX2VuY2xfdGh1bmsgPSAwOworICAgIG5ld19xdWV1ZS0+dHEudHFfcGFyZW50ID0gTlVMTDsKKyAgICBuZXdfcXVldWUtPnRxX2ZpcnN0X2NoaWxkID0gTlVMTDsKKyAgICBuZXdfcXVldWUtPnRxX25leHRfY2hpbGQgPSBOVUxMOworICAgIG5ld19xdWV1ZS0+dHFfcHJldl9jaGlsZCA9IE5VTEw7CisgICAgbmV3X3F1ZXVlLT50cV9yZWZfY291bnQgPSAxOworICB9CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgS0ZfVFJBQ0UoMTUwLCAoIkNyZWF0aW5nIFRhc2tRIFRhc2sgb24gKCVkKTpcbiIsIGdsb2JhbF90aWQpKTsKKyAgS0ZfRFVNUCgxNTAsIF9fa21wX2R1bXBfdGh1bmsodHEsIG5ld190YXNrcV90aHVuaywgZ2xvYmFsX3RpZCkpOworCisgIGlmIChpbl9wYXJhbGxlbCkgeworICAgIEtGX1RSQUNFKDI1LAorICAgICAgICAgICAgICgiQWZ0ZXIgVGFza1EgYXQgJXAgQ3JlYXRpb24gb24gKCVkKTpcbiIsIG5ld19xdWV1ZSwgZ2xvYmFsX3RpZCkpOworICB9IGVsc2UgeworICAgIEtGX1RSQUNFKDI1LCAoIkFmdGVyIFNlcmlhbCBUYXNrUSBhdCAlcCBDcmVhdGlvbiBvbiAoJWQpOlxuIiwgbmV3X3F1ZXVlLAorICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCkpOworICB9CisKKyAgS0ZfRFVNUCgyNSwgX19rbXBfZHVtcF90YXNrX3F1ZXVlKHRxLCBuZXdfcXVldWUsIGdsb2JhbF90aWQpKTsKKworICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICBLRl9EVU1QKDUwLCBfX2ttcF9kdW1wX3Rhc2tfcXVldWVfdHJlZSh0cSwgdHEtPnRxX3Jvb3QsIGdsb2JhbF90aWQpKTsKKyAgfQorI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spCisgICAgX19rbXBfcHVzaF93b3Jrc2hhcmUoZ2xvYmFsX3RpZCwgY3RfdGFza3EsIG5ld19xdWV1ZS0+dHFfbG9jKTsKKworICBLRV9UUkFDRSgxMCwgKCJfX2ttcGNfdGFza3EgcmV0dXJuICglZClcbiIsIGdsb2JhbF90aWQpKTsKKworICByZXR1cm4gbmV3X3Rhc2txX3RodW5rOworfQorCisvKiAgZW5kcyBhIHRhc2txOyBsYXN0IHRocmVhZCBvdXQgZGVzdHJveXMgdGhlIHF1ZXVlICAqLworCit2b2lkIF9fa21wY19lbmRfdGFza3EoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICBrbXBjX3RodW5rX3QgKnRhc2txX3RodW5rKSB7CisjaWZkZWYgS01QX0RFQlVHCisgIGttcF9pbnQzMiBpOworI2VuZGlmCisgIGttcF90YXNrcV90ICp0cTsKKyAgaW50IGluX3BhcmFsbGVsOworICBrbXBfaW5mb190ICp0aDsKKyAga21wX2ludDMyIGlzX291dGVybW9zdDsKKyAga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlOworICBrbXBjX3RodW5rX3QgKnRodW5rOworICBpbnQgbnByb2M7CisKKyAgS0VfVFJBQ0UoMTAsICgiX19rbXBjX2VuZF90YXNrcSBjYWxsZWQgKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworCisgIHRxID0gJl9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0tPnRoLnRoX3RlYW0tPnQudF90YXNrcTsKKyAgbnByb2MgPSBfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdLT50aC50aF90ZWFtLT50LnRfbnByb2M7CisKKyAgLyogRm9yIHRoZSBvdXRlcm1vc3QgdGFza3Egb25seSwgYWxsIGJ1dCBvbmUgdGhyZWFkIHdpbGwgaGF2ZSB0YXNrcV90aHVuayA9PQorICAgKiBOVUxMICovCisgIHF1ZXVlID0gKHRhc2txX3RodW5rID09IE5VTEwpID8gdHEtPnRxX3Jvb3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0YXNrcV90aHVuay0+dGgudGhfc2hhcmVkcy0+c3ZfcXVldWU7CisKKyAgS0VfVFJBQ0UoNTAsICgiX19rbXBjX2VuZF90YXNrcSBxdWV1ZT0lcCAoJWQpIFxuIiwgcXVldWUsIGdsb2JhbF90aWQpKTsKKyAgaXNfb3V0ZXJtb3N0ID0gKHF1ZXVlID09IHRxLT50cV9yb290KTsKKyAgaW5fcGFyYWxsZWwgPSAocXVldWUtPnRxX2ZsYWdzICYgVFFGX1BBUkFMTEVMX0NPTlRFWFQpOworCisgIGlmIChpbl9wYXJhbGxlbCkgeworICAgIGttcF91aW50MzIgc3BpbnM7CisKKyAgICAvKiB0aGlzIGlzIGp1c3QgYSBzYWZlZ3VhcmQgdG8gcmVsZWFzZSB0aGUgd2FpdGluZyB0aHJlYWRzIGlmICovCisgICAgLyogdGhlIG91dGVybW9zdCB0YXNrcSBuZXZlciBxdWV1ZXMgYSB0YXNrICAgICAgICAgICAgICAgICAgICAqLworCisgICAgaWYgKGlzX291dGVybW9zdCAmJiAoS01QX01BU1RFUl9HVElEKGdsb2JhbF90aWQpKSkgeworICAgICAgaWYgKHRxLT50cV9nbG9iYWxfZmxhZ3MgJiBUUUZfUkVMRUFTRV9XT1JLRVJTKSB7CisgICAgICAgIC8qIG5vIGxvY2sgbmVlZGVkLCB3b3JrZXJzIGFyZSBzdGlsbCBpbiBzcGluIG1vZGUgKi8KKyAgICAgICAgdHEtPnRxX2dsb2JhbF9mbGFncyAmPSB+VFFGX1JFTEVBU0VfV09SS0VSUzsKKworICAgICAgICBfX2ttcF9lbmRfc3BsaXRfYmFycmllcihic19wbGFpbl9iYXJyaWVyLCBnbG9iYWxfdGlkKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBrZWVwIGRlcXVldWVpbmcgd29yayB1bnRpbCBhbGwgdGFza3MgYXJlIHF1ZXVlZCBhbmQgZGVxdWV1ZWQgKi8KKworICAgIGRvIHsKKyAgICAgIC8qIHdhaXQgdW50aWwgc29tZXRoaW5nIGlzIGF2YWlsYWJsZSB0byBkZXF1ZXVlICovCisgICAgICBLTVBfSU5JVF9ZSUVMRChzcGlucyk7CisKKyAgICAgIHdoaWxlICgocXVldWUtPnRxX25mdWxsID09IDApICYmIChxdWV1ZS0+dHFfdGFza3Ffc2xvdCA9PSBOVUxMKSAmJgorICAgICAgICAgICAgICghX19rbXBfdGFza3FfaGFzX2FueV9jaGlsZHJlbihxdWV1ZSkpICYmCisgICAgICAgICAgICAgKCEocXVldWUtPnRxX2ZsYWdzICYgVFFGX0FMTF9UQVNLU19RVUVVRUQpKSkgeworICAgICAgICBLTVBfWUlFTERfV0hFTihUUlVFLCBzcGlucyk7CisgICAgICB9CisKKyAgICAgIC8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gZXhlY3V0ZSB0YXNrcyBpbiB0aGUgcXVldWUgKi8KKyAgICAgIHdoaWxlICgoKHF1ZXVlLT50cV9uZnVsbCAhPSAwKSB8fCAocXVldWUtPnRxX3Rhc2txX3Nsb3QgIT0gTlVMTCkpICYmCisgICAgICAgICAgICAgKHRodW5rID0gX19rbXBfZmluZF90YXNrX2luX3F1ZXVlKGdsb2JhbF90aWQsIHF1ZXVlKSkgIT0gTlVMTCkgeworICAgICAgICBLRl9UUkFDRSg1MCwgKCJGb3VuZCB0aHVuazogJXAgaW4gcHJpbWFyeSBxdWV1ZSAlcCAoJWQpXG4iLCB0aHVuaywKKyAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworICAgICAgICBfX2ttcF9leGVjdXRlX3Rhc2tfZnJvbV9xdWV1ZSh0cSwgbG9jLCBnbG9iYWxfdGlkLCB0aHVuaywgaW5fcGFyYWxsZWwpOworICAgICAgfQorCisgICAgICAvKiBzZWUgaWYgd29yayBmb3VuZCBjYW4gYmUgZm91bmQgaW4gYSBkZXNjZW5kYW50IHF1ZXVlICovCisgICAgICBpZiAoKF9fa21wX3Rhc2txX2hhc19hbnlfY2hpbGRyZW4ocXVldWUpKSAmJgorICAgICAgICAgICh0aHVuayA9IF9fa21wX2ZpbmRfdGFza19pbl9kZXNjZW5kYW50X3F1ZXVlKGdsb2JhbF90aWQsIHF1ZXVlKSkgIT0KKyAgICAgICAgICAgICAgTlVMTCkgeworCisgICAgICAgIEtGX1RSQUNFKDUwLAorICAgICAgICAgICAgICAgICAoIlN0b2xlIHRodW5rOiAlcCBpbiBkZXNjZW5kYW50IHF1ZXVlOiAlcCB3aGlsZSB3YWl0aW5nIGluICIKKyAgICAgICAgICAgICAgICAgICJxdWV1ZTogJXAgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgIHRodW5rLCB0aHVuay0+dGgudGhfc2hhcmVkcy0+c3ZfcXVldWUsIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisKKyAgICAgICAgX19rbXBfZXhlY3V0ZV90YXNrX2Zyb21fcXVldWUodHEsIGxvYywgZ2xvYmFsX3RpZCwgdGh1bmssIGluX3BhcmFsbGVsKTsKKyAgICAgIH0KKworICAgIH0gd2hpbGUgKCghKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9BTExfVEFTS1NfUVVFVUVEKSkgfHwKKyAgICAgICAgICAgICAocXVldWUtPnRxX25mdWxsICE9IDApKTsKKworICAgIEtGX1RSQUNFKDUwLCAoIkFsbCB0YXNrcyBxdWV1ZWQgYW5kIGRlcXVldWVkIGluIHF1ZXVlOiAlcCAoJWQpXG4iLCBxdWV1ZSwKKyAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQpKTsKKworICAgIC8qIHdhaXQgd2hpbGUgYWxsIHRhc2tzIGFyZSBub3QgZmluaXNoZWQgYW5kIG1vcmUgd29yayBmb3VuZAorICAgICAgIGluIGRlc2NlbmRhbnQgcXVldWVzICovCisKKyAgICB3aGlsZSAoKCFfX2ttcF90YXNrcV90YXNrc19maW5pc2hlZChxdWV1ZSkpICYmCisgICAgICAgICAgICh0aHVuayA9IF9fa21wX2ZpbmRfdGFza19pbl9kZXNjZW5kYW50X3F1ZXVlKGdsb2JhbF90aWQsIHF1ZXVlKSkgIT0KKyAgICAgICAgICAgICAgIE5VTEwpIHsKKworICAgICAgS0ZfVFJBQ0UoNTAsICgiU3RvbGUgdGh1bms6ICVwIGluIGRlc2NlbmRhbnQgcXVldWU6ICVwIHdoaWxlIHdhaXRpbmcgaW4gIgorICAgICAgICAgICAgICAgICAgICAicXVldWU6ICVwICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgIHRodW5rLCB0aHVuay0+dGgudGhfc2hhcmVkcy0+c3ZfcXVldWUsIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisKKyAgICAgIF9fa21wX2V4ZWN1dGVfdGFza19mcm9tX3F1ZXVlKHRxLCBsb2MsIGdsb2JhbF90aWQsIHRodW5rLCBpbl9wYXJhbGxlbCk7CisgICAgfQorCisgICAgS0ZfVFJBQ0UoNTAsICgiTm8gd29yayBmb3VuZCBpbiBkZXNjZW5kZW50IHF1ZXVlcyBvciBhbGwgd29yayBmaW5pc2hlZCBpbiAiCisgICAgICAgICAgICAgICAgICAicXVldWU6ICVwICglZClcbiIsCisgICAgICAgICAgICAgICAgICBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworCisgICAgaWYgKCFpc19vdXRlcm1vc3QpIHsKKyAgICAgIC8qIG5lZWQgdG8gcmV0dXJuIGlmIE5PV0FJVCBwcmVzZW50IGFuZCBub3Qgb3V0ZXJtb3N0IHRhc2txICovCisKKyAgICAgIGlmIChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfSVNfTk9XQUlUKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgICAgICBxdWV1ZS0+dHFfcmVmX2NvdW50LS07CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQocXVldWUtPnRxX3JlZl9jb3VudCA+PSAwKTsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCZxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgS0VfVFJBQ0UoCisgICAgICAgICAgICAxMCwgKCJfX2ttcGNfZW5kX3Rhc2txIHJldHVybiBmb3Igbm93YWl0IGNhc2UgKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworCisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgX19rbXBfZmluZF9hbmRfcmVtb3ZlX2ZpbmlzaGVkX2NoaWxkX3Rhc2txKHRxLCBnbG9iYWxfdGlkLCBxdWV1ZSk7CisKKyAgICAgIC8qIFdBSVQgdW50aWwgYWxsIHRhc2tzIGFyZSBmaW5pc2hlZCBhbmQgbm8gY2hpbGQgcXVldWVzIGV4aXN0IGJlZm9yZQorICAgICAgICogcHJvY2VlZGluZyAqLworICAgICAgS01QX0lOSVRfWUlFTEQoc3BpbnMpOworCisgICAgICB3aGlsZSAoIV9fa21wX3Rhc2txX3Rhc2tzX2ZpbmlzaGVkKHF1ZXVlKSB8fAorICAgICAgICAgICAgIF9fa21wX3Rhc2txX2hhc19hbnlfY2hpbGRyZW4ocXVldWUpKSB7CisgICAgICAgIHRodW5rID0gX19rbXBfZmluZF90YXNrX2luX2FuY2VzdG9yX3F1ZXVlKHRxLCBnbG9iYWxfdGlkLCBxdWV1ZSk7CisKKyAgICAgICAgaWYgKHRodW5rICE9IE5VTEwpIHsKKyAgICAgICAgICBLRl9UUkFDRSg1MCwKKyAgICAgICAgICAgICAgICAgICAoIlN0b2xlIHRodW5rOiAlcCBpbiBhbmNlc3RvciBxdWV1ZTogJXAgd2hpbGUgd2FpdGluZyBpbiAiCisgICAgICAgICAgICAgICAgICAgICJxdWV1ZTogJXAgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGh1bmssIHRodW5rLT50aC50aF9zaGFyZWRzLT5zdl9xdWV1ZSwgcXVldWUsIGdsb2JhbF90aWQpKTsKKyAgICAgICAgICBfX2ttcF9leGVjdXRlX3Rhc2tfZnJvbV9xdWV1ZSh0cSwgbG9jLCBnbG9iYWxfdGlkLCB0aHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9wYXJhbGxlbCk7CisgICAgICAgIH0KKworICAgICAgICBLTVBfWUlFTERfV0hFTih0aHVuayA9PSBOVUxMLCBzcGlucyk7CisKKyAgICAgICAgX19rbXBfZmluZF9hbmRfcmVtb3ZlX2ZpbmlzaGVkX2NoaWxkX3Rhc2txKHRxLCBnbG9iYWxfdGlkLCBxdWV1ZSk7CisgICAgICB9CisKKyAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICBpZiAoIShxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfREVBTExPQ0FURUQpKSB7CisgICAgICAgIHF1ZXVlLT50cV9mbGFncyB8PSBUUUZfREVBTExPQ0FURUQ7CisgICAgICB9CisgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJnF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAvKiBvbmx5IHRoZSBhbGxvY2F0aW5nIHRocmVhZCBjYW4gZGVhbGxvY2F0ZSB0aGUgcXVldWUgKi8KKyAgICAgIGlmICh0YXNrcV90aHVuayAhPSBOVUxMKSB7CisgICAgICAgIF9fa21wX3JlbW92ZV9xdWV1ZV9mcm9tX3RyZWUodHEsIGdsb2JhbF90aWQsIHF1ZXVlLCBUUlVFKTsKKyAgICAgIH0KKworICAgICAgS0VfVFJBQ0UoCisgICAgICAgICAgMTAsCisgICAgICAgICAgKCJfX2ttcGNfZW5kX3Rhc2txIHJldHVybiBmb3Igbm9uX291dGVybW9zdCBxdWV1ZSwgd2FpdCBjYXNlICglZClcbiIsCisgICAgICAgICAgIGdsb2JhbF90aWQpKTsKKworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE91dGVybW9zdCBRdWV1ZTogc3RlYWwgd29yayBmcm9tIGRlc2NlbmRhbnRzIHVudGlsIGFsbCB0YXNrcyBhcmUgZmluaXNoZWQKKworICAgIEtNUF9JTklUX1lJRUxEKHNwaW5zKTsKKworICAgIHdoaWxlICghX19rbXBfdGFza3FfdGFza3NfZmluaXNoZWQocXVldWUpKSB7CisgICAgICB0aHVuayA9IF9fa21wX2ZpbmRfdGFza19pbl9kZXNjZW5kYW50X3F1ZXVlKGdsb2JhbF90aWQsIHF1ZXVlKTsKKworICAgICAgaWYgKHRodW5rICE9IE5VTEwpIHsKKyAgICAgICAgS0ZfVFJBQ0UoNTAsCisgICAgICAgICAgICAgICAgICgiU3RvbGUgdGh1bms6ICVwIGluIGRlc2NlbmRhbnQgcXVldWU6ICVwIHdoaWxlIHdhaXRpbmcgaW4gIgorICAgICAgICAgICAgICAgICAgInF1ZXVlOiAlcCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgdGh1bmssIHRodW5rLT50aC50aF9zaGFyZWRzLT5zdl9xdWV1ZSwgcXVldWUsIGdsb2JhbF90aWQpKTsKKworICAgICAgICBfX2ttcF9leGVjdXRlX3Rhc2tfZnJvbV9xdWV1ZSh0cSwgbG9jLCBnbG9iYWxfdGlkLCB0aHVuaywgaW5fcGFyYWxsZWwpOworICAgICAgfQorCisgICAgICBLTVBfWUlFTERfV0hFTih0aHVuayA9PSBOVUxMLCBzcGlucyk7CisgICAgfQorCisgICAgLyogTmVlZCB0aGlzIGJhcnJpZXIgdG8gcHJldmVudCBkZXN0cnVjdGlvbiBvZiBxdWV1ZSBiZWZvcmUgdGhyZWFkcyBoYXZlIGFsbAorICAgICAqIGV4ZWN1dGVkIGFib3ZlIGNvZGUgKi8KKyAgICAvKiBUaGlzIG1heSBuZWVkIHRvIGJlIGRvbmUgZWFybGllciB3aGVuIE5PV0FJVCBpcyBpbXBsZW1lbnRlZCBmb3IgdGhlCisgICAgICogb3V0ZXJtb3N0IGxldmVsICovCisKKyAgICBpZiAoIV9fa21wX2JhcnJpZXIoYnNfcGxhaW5fYmFycmllciwgZ2xvYmFsX3RpZCwgVFJVRSwgMCwgTlVMTCwgTlVMTCkpIHsKKyAgICAgIC8qIHRoZSBxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfSVNfTk9XQUlUIGNhc2UgaXMgbm90IHlldCBoYW5kbGVkIGhlcmU7ICAgKi8KKyAgICAgIC8qIGZvciByaWdodCBub3csIGV2ZXJ5Ym9keSB3YWl0cywgYW5kIHRoZSBtYXN0ZXIgdGhyZWFkIGRlc3Ryb3lzIHRoZSAgKi8KKyAgICAgIC8qIHJlbWFpbmluZyBxdWV1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgX19rbXBfcmVtb3ZlX2FsbF9jaGlsZF90YXNrcSh0cSwgZ2xvYmFsX3RpZCwgcXVldWUpOworCisgICAgICAvKiBOb3cgZGVzdHJveSB0aGUgcm9vdCBxdWV1ZSAqLworICAgICAgS0ZfVFJBQ0UoMTAwLCAoIlQjJWQgQmVmb3JlIERlbGV0aW9uIG9mIHRvcC1sZXZlbCBUYXNrUSBhdCAlcDpcbiIsCisgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCBxdWV1ZSkpOworICAgICAgS0ZfRFVNUCgxMDAsIF9fa21wX2R1bXBfdGFza19xdWV1ZSh0cSwgcXVldWUsIGdsb2JhbF90aWQpKTsKKworI2lmZGVmIEtNUF9ERUJVRworICAgICAgLyogIHRoZSByb290IHF1ZXVlIGVudHJ5ICAqLworICAgICAgS01QX0RFQlVHX0FTU0VSVCgocXVldWUtPnRxLnRxX3BhcmVudCA9PSBOVUxMKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAocXVldWUtPnRxX25leHRfY2hpbGQgPT0gTlVMTCkpOworCisgICAgICAvKiAgY2hpbGRyZW4gbXVzdCBhbGwgYmUgZ29uZSBieSBub3cgYmVjYXVzZSBvZiBiYXJyaWVyIGFib3ZlICovCisgICAgICBLTVBfREVCVUdfQVNTRVJUKHF1ZXVlLT50cV9maXJzdF9jaGlsZCA9PSBOVUxMKTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IG5wcm9jOyBpKyspIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChxdWV1ZS0+dHFfdGhfdGh1bmtzW2ldLmFpX2RhdGEgPT0gMCk7CisgICAgICB9CisKKyAgICAgIGZvciAoaSA9IDAsIHRodW5rID0gcXVldWUtPnRxX2ZyZWVfdGh1bmtzOyB0aHVuayAhPSBOVUxMOworICAgICAgICAgICBpKyssIHRodW5rID0gdGh1bmstPnRoLnRoX25leHRfZnJlZSkKKyAgICAgICAgOworCisgICAgICBLTVBfREVCVUdfQVNTRVJUKGkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgcXVldWUtPnRxX25zbG90cyArIChucHJvYyAqIF9fS01QX1RBU0tRX1RIVU5LU19QRVJfVEgpKTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IG5wcm9jOyBpKyspIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCghdHEtPnRxX2N1cnJfdGh1bmtbaV0pOworICAgICAgfQorI2VuZGlmCisgICAgICAvKiAgdW5saW5rIHRoZSByb290IHF1ZXVlIGVudHJ5ICAqLworICAgICAgdHEtPnRxX3Jvb3QgPSBOVUxMOworCisgICAgICAvKiAgcmVsZWFzZSBzdG9yYWdlIGZvciByb290IHF1ZXVlIGVudHJ5ICAqLworICAgICAgS0ZfVFJBQ0UoNTAsICgiQWZ0ZXIgRGVsZXRpb24gb2YgdG9wLWxldmVsIFRhc2tRIGF0ICVwIG9uICglZCk6XG4iLCBxdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCkpOworCisgICAgICBxdWV1ZS0+dHFfZmxhZ3MgfD0gVFFGX0RFQUxMT0NBVEVEOworICAgICAgX19rbXBfZnJlZV90YXNrcSh0cSwgcXVldWUsIGluX3BhcmFsbGVsLCBnbG9iYWxfdGlkKTsKKworICAgICAgS0ZfRFVNUCg1MCwgX19rbXBfZHVtcF90YXNrX3F1ZXVlX3RyZWUodHEsIHRxLT50cV9yb290LCBnbG9iYWxfdGlkKSk7CisKKyAgICAgIC8qIHJlbGVhc2UgdGhlIHdvcmtlcnMgbm93IHRoYXQgdGhlIGRhdGEgc3RydWN0dXJlcyBhcmUgdXAgdG8gZGF0ZSAqLworICAgICAgX19rbXBfZW5kX3NwbGl0X2JhcnJpZXIoYnNfcGxhaW5fYmFycmllciwgZ2xvYmFsX3RpZCk7CisgICAgfQorCisgICAgdGggPSBfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdOworCisgICAgLyogUmVzZXQgT1JERVJFRCBTRUNUSU9OIHRvIHBhcmFsbGVsIHZlcnNpb24gKi8KKyAgICB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rlb19mY24gPSAwOworCisgICAgLyogUmVzZXQgT1JERVJFRCBTRUNUSU9OIHRvIHBhcmFsbGVsIHZlcnNpb24gKi8KKyAgICB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2R4b19mY24gPSAwOworICB9IGVsc2UgeworICAgIC8qIGluIHNlcmlhbCBleGVjdXRpb24gY29udGV4dCwgZGVxdWV1ZSB0aGUgbGFzdCB0YXNrICAqLworICAgIC8qIGFuZCBleGVjdXRlIGl0LCBpZiB0aGVyZSB3ZXJlIGFueSB0YXNrcyBlbmNvdW50ZXJlZCAqLworCisgICAgaWYgKHF1ZXVlLT50cV9uZnVsbCA+IDApIHsKKyAgICAgIEtNUF9ERUJVR19BU1NFUlQocXVldWUtPnRxX25mdWxsID09IDEpOworCisgICAgICB0aHVuayA9IF9fa21wX2RlcXVldWVfdGFzayhnbG9iYWxfdGlkLCBxdWV1ZSwgaW5fcGFyYWxsZWwpOworCisgICAgICBpZiAocXVldWUtPnRxX2ZsYWdzICYgVFFGX0lTX0xBU1RfVEFTSykgeworICAgICAgICAvKiBUUUZfSVNfTEFTVFBSSVZBVEUsIG9uZSB0aGluZyBpbiBxdWV1ZSwgX19rbXBjX2VuZF90YXNrcV90YXNrKCkgKi8KKyAgICAgICAgLyogaGFzIGJlZW4gcnVuIHNvIHRoaXMgaXMgbGFzdCB0YXNrLCBydW4gd2l0aCBUUUZfSVNfTEFTVF9UQVNLIHNvICovCisgICAgICAgIC8qIGluc3RydW1lbnRhdGlvbiBkb2VzIGNvcHktb3V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgIC8qIG5vIG5lZWQgZm9yIHRlc3RfdGhlbl9vciBjYWxsIHNpbmNlIGFscmVhZHkgbG9ja2VkICovCisgICAgICAgIHRodW5rLT50aF9mbGFncyB8PSBUUUZfSVNfTEFTVF9UQVNLOworICAgICAgfQorCisgICAgICBLRl9UUkFDRSg1MCwgKCJUIyVkIGZvdW5kIHRodW5rOiAlcCBpbiBzZXJpYWwgcXVldWU6ICVwXG4iLCBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgICAgICB0aHVuaywgcXVldWUpKTsKKworICAgICAgX19rbXBfZXhlY3V0ZV90YXNrX2Zyb21fcXVldWUodHEsIGxvYywgZ2xvYmFsX3RpZCwgdGh1bmssIGluX3BhcmFsbGVsKTsKKyAgICB9CisKKyAgICAvLyBkZXN0cm95IHRoZSB1bmF0dGFjaGVkIHNlcmlhbCBxdWV1ZSBub3cgdGhhdCB0aGVyZSBpcyBubyBtb3JlIHdvcmsgdG8gZG8KKyAgICBLRl9UUkFDRSgxMDAsICgiQmVmb3JlIERlbGV0aW9uIG9mIFNlcmlhbGl6ZWQgVGFza1EgYXQgJXAgb24gKCVkKTpcbiIsCisgICAgICAgICAgICAgICAgICAgcXVldWUsIGdsb2JhbF90aWQpKTsKKyAgICBLRl9EVU1QKDEwMCwgX19rbXBfZHVtcF90YXNrX3F1ZXVlKHRxLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworCisjaWZkZWYgS01QX0RFQlVHCisgICAgaSA9IDA7CisgICAgZm9yICh0aHVuayA9IHF1ZXVlLT50cV9mcmVlX3RodW5rczsgdGh1bmsgIT0gTlVMTDsKKyAgICAgICAgIHRodW5rID0gdGh1bmstPnRoLnRoX25leHRfZnJlZSkKKyAgICAgICsraTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKGkgPT0gcXVldWUtPnRxX25zbG90cyArIDEpOworI2VuZGlmCisgICAgLyogIHJlbGVhc2Ugc3RvcmFnZSBmb3IgdW5hdHRhY2hlZCBzZXJpYWwgcXVldWUgICovCisgICAgS0ZfVFJBQ0UoNTAsCisgICAgICAgICAgICAgKCJTZXJpYWxpemVkIFRhc2tRIGF0ICVwIGRlbGV0ZWQgb24gKCVkKS5cbiIsIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisKKyAgICBxdWV1ZS0+dHFfZmxhZ3MgfD0gVFFGX0RFQUxMT0NBVEVEOworICAgIF9fa21wX2ZyZWVfdGFza3EodHEsIHF1ZXVlLCBpbl9wYXJhbGxlbCwgZ2xvYmFsX3RpZCk7CisgIH0KKworICBLRV9UUkFDRSgxMCwgKCJfX2ttcGNfZW5kX3Rhc2txIHJldHVybiAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7Cit9CisKKy8qICBFbnF1ZXVlcyBhIHRhc2sgZm9yIHRodW5rIHByZXZpb3VzbHkgY3JlYXRlZCBieSBfX2ttcGNfdGFza19idWZmZXIuICovCisvKiAgUmV0dXJucyBub256ZXJvIGlmIGp1c3QgZmlsbGVkIHVwIHF1ZXVlICAqLworCitrbXBfaW50MzIgX19rbXBjX3Rhc2soaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190aHVua190ICp0aHVuaykgeworICBrbXBfaW50MzIgcmV0OworICBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWU7CisgIGludCBpbl9wYXJhbGxlbDsKKyAga21wX3Rhc2txX3QgKnRxOworCisgIEtFX1RSQUNFKDEwLCAoIl9fa21wY190YXNrIGNhbGxlZCAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgS01QX0RFQlVHX0FTU0VSVCghKHRodW5rLT50aF9mbGFncyAmCisgICAgICAgICAgICAgICAgICAgICBUUUZfVEFTS1FfVEFTSykpOyAvKiAgdGh1bmstPnRoX3Rhc2sgaXMgYSByZWd1bGFyIHRhc2sgICovCisKKyAgdHEgPSAmX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXS0+dGgudGhfdGVhbS0+dC50X3Rhc2txOworICBxdWV1ZSA9IHRodW5rLT50aC50aF9zaGFyZWRzLT5zdl9xdWV1ZTsKKyAgaW5fcGFyYWxsZWwgPSAocXVldWUtPnRxX2ZsYWdzICYgVFFGX1BBUkFMTEVMX0NPTlRFWFQpOworCisgIGlmIChpbl9wYXJhbGxlbCAmJiAodGh1bmstPnRoX2ZsYWdzICYgVFFGX0lTX09SREVSRUQpKQorICAgIHRodW5rLT50aF90YXNrbnVtID0gKytxdWV1ZS0+dHFfdGFza251bV9xdWV1aW5nOworCisgIC8qIEZvciBzZXJpYWwgZXhlY3V0aW9uIGRlcXVldWUgdGhlIHByZWNlZGluZyB0YXNrIGFuZCBleGVjdXRlIGl0LCBpZiBvbmUKKyAgICogZXhpc3RzICovCisgIC8qIFRoaXMgY2Fubm90IGJlIHRoZSBsYXN0IHRhc2suICBUaGF0IG9uZSBpcyBoYW5kbGVkIGluIF9fa21wY19lbmRfdGFza3EgKi8KKworICBpZiAoIWluX3BhcmFsbGVsICYmIHF1ZXVlLT50cV9uZnVsbCA+IDApIHsKKyAgICBrbXBjX3RodW5rX3QgKnByZXZfdGh1bms7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKHF1ZXVlLT50cV9uZnVsbCA9PSAxKTsKKworICAgIHByZXZfdGh1bmsgPSBfX2ttcF9kZXF1ZXVlX3Rhc2soZ2xvYmFsX3RpZCwgcXVldWUsIGluX3BhcmFsbGVsKTsKKworICAgIEtGX1RSQUNFKDUwLCAoIlQjJWQgZm91bmQgdGh1bms6ICVwIGluIHNlcmlhbCBxdWV1ZTogJXBcbiIsIGdsb2JhbF90aWQsCisgICAgICAgICAgICAgICAgICBwcmV2X3RodW5rLCBxdWV1ZSkpOworCisgICAgX19rbXBfZXhlY3V0ZV90YXNrX2Zyb21fcXVldWUodHEsIGxvYywgZ2xvYmFsX3RpZCwgcHJldl90aHVuaywgaW5fcGFyYWxsZWwpOworICB9CisKKyAgLyogVGhlIGluc3RydW1lbnRhdGlvbiBzZXF1ZW5jZSBpczogIF9fa21wY190YXNrX2J1ZmZlcigpLCBpbml0aWFsaXplIHByaXZhdGUKKyAgICAgdmFyaWFibGVzLCBfX2ttcGNfdGFzaygpLiAgVGhlIF9fa21wY190YXNrX2J1ZmZlciByb3V0aW5lIGNoZWNrcyB0aGF0IHRoZQorICAgICB0YXNrIHF1ZXVlIGlzIG5vdCBmdWxsIGFuZCBhbGxvY2F0ZXMgYSB0aHVuayAod2hpY2ggaXMgdGhlbiBwYXNzZWQgdG8KKyAgICAgX19rbXBjX3Rhc2soKSkuICBTbywgdGhlIGVucXVldWUgYmVsb3cgc2hvdWxkIG5ldmVyIGZhaWwgZHVlIHRvIGEgZnVsbAorICAgICBxdWV1ZS4gKi8KKworICBLRl9UUkFDRSgxMDAsICgiQWZ0ZXIgZW5xdWV1ZWluZyB0aGlzIFRhc2sgb24gKCVkKTpcbiIsIGdsb2JhbF90aWQpKTsKKyAgS0ZfRFVNUCgxMDAsIF9fa21wX2R1bXBfdGh1bmsodHEsIHRodW5rLCBnbG9iYWxfdGlkKSk7CisKKyAgcmV0ID0gX19rbXBfZW5xdWV1ZV90YXNrKHRxLCBnbG9iYWxfdGlkLCBxdWV1ZSwgdGh1bmssIGluX3BhcmFsbGVsKTsKKworICBLRl9UUkFDRSgxMDAsICgiVGFzayBRdWV1ZSBsb29rcyBsaWtlIHRoaXMgb24gKCVkKTpcbiIsIGdsb2JhbF90aWQpKTsKKyAgS0ZfRFVNUCgxMDAsIF9fa21wX2R1bXBfdGFza19xdWV1ZSh0cSwgcXVldWUsIGdsb2JhbF90aWQpKTsKKworICBLRV9UUkFDRSgxMCwgKCJfX2ttcGNfdGFzayByZXR1cm4gKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qICBlbnF1ZXVlcyBhIHRhc2txX3Rhc2sgZm9yIHRodW5rIHByZXZpb3VzbHkgY3JlYXRlZCBieSBfX2ttcGNfdGFza3EgICovCisvKiAgdGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIHVubGVzcyBpbiBhIHBhcmFsbGVsIGNvbnRleHQgICAgICAgICAgICAqLworCit2b2lkIF9fa21wY190YXNrcV90YXNrKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGh1bmtfdCAqdGh1bmssCisgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBzdGF0dXMpIHsKKyAga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlOworICBrbXBfdGFza3FfdCAqdHEgPSAmX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXS0+dGgudGhfdGVhbS0+dC50X3Rhc2txOworICBpbnQgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChnbG9iYWxfdGlkKTsKKworICBLRV9UUkFDRSgxMCwgKCJfX2ttcGNfdGFza3FfdGFzayBjYWxsZWQgKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworICBLRl9UUkFDRSgxMDAsICgiVGFza1EgVGFzayBhcmd1bWVudCB0aHVuayBvbiAoJWQpOlxuIiwgZ2xvYmFsX3RpZCkpOworICBLRl9EVU1QKDEwMCwgX19rbXBfZHVtcF90aHVuayh0cSwgdGh1bmssIGdsb2JhbF90aWQpKTsKKworICBxdWV1ZSA9IHRodW5rLT50aC50aF9zaGFyZWRzLT5zdl9xdWV1ZTsKKworICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKQorICAgIF9fa21wX3BvcF93b3Jrc2hhcmUoZ2xvYmFsX3RpZCwgY3RfdGFza3EsIGxvYyk7CisKKyAgLyogIHRodW5rLT50aF90YXNrIGlzIHRoZSB0YXNrcV90YXNrICAqLworICBLTVBfREVCVUdfQVNTRVJUKHRodW5rLT50aF9mbGFncyAmIFRRRl9UQVNLUV9UQVNLKTsKKworICAvKiAgbm90IHN1cHBvc2VkIHRvIGNhbGwgX19rbXBjX3Rhc2txX3Rhc2sgaWYgaXQncyBhbHJlYWR5IGVucXVldWVkICAqLworICBLTVBfREVCVUdfQVNTRVJUKHF1ZXVlLT50cV90YXNrcV9zbG90ID09IE5VTEwpOworCisgIC8qIGRlcXVldWUgdGFza3EgdGh1bmsgZnJvbSBjdXJyX3RodW5rIHN0YWNrICovCisgIHRxLT50cV9jdXJyX3RodW5rW3RpZF0gPSB0aHVuay0+dGhfZW5jbF90aHVuazsKKyAgdGh1bmstPnRoX2VuY2xfdGh1bmsgPSBOVUxMOworCisgIEtGX0RVTVAoMjAwLCBfX2ttcF9kdW1wX3RodW5rX3N0YWNrKHRxLT50cV9jdXJyX3RodW5rW3RpZF0sIGdsb2JhbF90aWQpKTsKKworICB0aHVuay0+dGhfc3RhdHVzID0gc3RhdHVzOworCisgIC8vIEZsdXNoIHRodW5rLT50aF9zdGF0dXMgYmVmb3JlIHRhc2txX3Rhc2sgZW5xdWV1ZWQgdG8gYXZvaWQgcmFjZSBjb25kaXRpb24KKyAgS01QX01CKCk7CisKKyAgLyogZW5xdWV1ZSB0YXNrcV90YXNrIGluIHRodW5rIGludG8gc3BlY2lhbCBzbG90IGluIHF1ZXVlICAgICAqLworICAvKiBHRUggLSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIGxvY2sgdGFza3Egc2xvdCBzaW5jZSBvbmx5IG9uZSAqLworICAvKiAgICAgICB0aHJlYWQgZW5xdWV1ZXMgJiBhbHJlYWR5IGEgbG9jayBzZXQgYXQgZGVxdWV1ZSBwb2ludCAqLworCisgIHF1ZXVlLT50cV90YXNrcV9zbG90ID0gdGh1bms7CisKKyAgS0VfVFJBQ0UoMTAsICgiX19rbXBjX3Rhc2txX3Rhc2sgcmV0dXJuICglZClcbiIsIGdsb2JhbF90aWQpKTsKK30KKworLyogZW5kcyBhIHRhc2txX3Rhc2s7IGRvbmUgZ2VuZXJhdGluZyB0YXNrcyAgKi8KKwordm9pZCBfX2ttcGNfZW5kX3Rhc2txX3Rhc2soaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcGNfdGh1bmtfdCAqdGh1bmspIHsKKyAga21wX3Rhc2txX3QgKnRxOworICBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWU7CisgIGludCBpbl9wYXJhbGxlbDsKKyAgaW50IHRpZDsKKworICBLRV9UUkFDRSgxMCwgKCJfX2ttcGNfZW5kX3Rhc2txX3Rhc2sgY2FsbGVkICglZClcbiIsIGdsb2JhbF90aWQpKTsKKworICB0cSA9ICZfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdLT50aC50aF90ZWFtLT50LnRfdGFza3E7CisgIHF1ZXVlID0gdGh1bmstPnRoLnRoX3NoYXJlZHMtPnN2X3F1ZXVlOworICBpbl9wYXJhbGxlbCA9IChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfUEFSQUxMRUxfQ09OVEVYVCk7CisgIHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoZ2xvYmFsX3RpZCk7CisKKyAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykKKyAgICBfX2ttcF9wb3Bfd29ya3NoYXJlKGdsb2JhbF90aWQsIGN0X3Rhc2txLCBsb2MpOworCisgIGlmIChpbl9wYXJhbGxlbCkgeworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICBLTVBfVEVTVF9USEVOX09SMzIoUkNBU1Qodm9sYXRpbGUga21wX3VpbnQzMiAqLCAmcXVldWUtPnRxX2ZsYWdzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgVFFGX0FMTF9UQVNLU19RVUVVRUQpOworI2Vsc2UKKyAgICB7CisgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJnF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAvLyBNYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtCisgICAgICAvLyBTZWVtcyB0byB3b3JrIHdpdGhvdXQgdGhpcyBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwCisgICAgICBLTVBfTUIoKTsKKworICAgICAgcXVldWUtPnRxX2ZsYWdzIHw9IFRRRl9BTExfVEFTS1NfUVVFVUVEOworICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCZxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICB9CisjZW5kaWYKKyAgfQorCisgIGlmICh0aHVuay0+dGhfZmxhZ3MgJiBUUUZfSVNfTEFTVFBSSVZBVEUpIHsKKyAgICAvKiBOb3JtYWxseSwgX19rbXBfZmluZF90YXNrX2luX3F1ZXVlKCkgcmVmdXNlcyB0byBzY2hlZHVsZSB0aGUgbGFzdCB0YXNrIGluCisgICAgICAgdGhlIHF1ZXVlIGlmIFRRRl9JU19MQVNUUFJJVkFURSBzbyB3ZSBjYW4gcG9zaXRpdmVseSBpZGVudGlmeSB0aGF0IGxhc3QKKyAgICAgICB0YXNrIGFuZCBydW4gaXQgd2l0aCBpdHMgVFFGX0lTX0xBU1RfVEFTSyBiaXQgdHVybmVkIG9uIGluIHRoX2ZsYWdzLgorICAgICAgIFdoZW4gX19rbXBjX2VuZF90YXNrcV90YXNrKCkgaXMgY2FsbGVkIHdlIGFyZSBkb25lIGdlbmVyYXRpbmcgYWxsIHRoZQorICAgICAgIHRhc2tzLCBzbyB3ZSBrbm93IHRoZSBsYXN0IG9uZSBpbiB0aGUgcXVldWUgaXMgdGhlIGxhc3Rwcml2YXRlIHRhc2suCisgICAgICAgTWFyayB0aGUgcXVldWUgYXMgaGF2aW5nIGdvdHRlbiB0byB0aGlzIHN0YXRlIHZpYSB0cV9mbGFncyAmCisgICAgICAgVFFGX0lTX0xBU1RfVEFTSzsgd2hlbiB0aGF0IHRhc2sgYWN0dWFsbHkgZXhlY3V0ZXMgbWFyayBpdCB2aWEgdGhfZmxhZ3MgJgorICAgICAgIFRRRl9JU19MQVNUX1RBU0sgKHRoaXMgdGhfZmxhZ3MgYml0IHNpZ25hbHMgdGhlIGluc3RydW1lbnRlZCBjb2RlIHRvIGRvCisgICAgICAgY29weS1vdXRzIGFmdGVyIGV4ZWN1dGlvbikuICovCisgICAgaWYgKCFpbl9wYXJhbGxlbCkgeworICAgICAgLyogTm8gc3luY2hyb25pemF0aW9uIG5lZWRlZCBmb3Igc2VyaWFsIGNvbnRleHQgKi8KKyAgICAgIHF1ZXVlLT50cV9mbGFncyB8PSBUUUZfSVNfTEFTVF9UQVNLOworICAgIH0gZWxzZSB7CisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAgICAgS01QX1RFU1RfVEhFTl9PUjMyKFJDQVNUKHZvbGF0aWxlIGttcF91aW50MzIgKiwgJnF1ZXVlLT50cV9mbGFncyksCisgICAgICAgICAgICAgICAgICAgICAgICAgVFFGX0lTX0xBU1RfVEFTSyk7CisjZWxzZQorICAgICAgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJnF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbQorICAgICAgICAvLyBTZWVtcyB0byB3b3JrIHdpdGhvdXQgdGhpcyBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwCisgICAgICAgIEtNUF9NQigpOworCisgICAgICAgIHF1ZXVlLT50cV9mbGFncyB8PSBUUUZfSVNfTEFTVF9UQVNLOworICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJnF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworICAgICAgfQorI2VuZGlmCisgICAgICAvKiB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uIHdoZXJlIGxhc3QgdGFzayBpcyBkZXF1ZXVlZCBidXQgKi8KKyAgICAgIC8qIGZsYWcgaXNuJ3QgdmlzaWJsZSB5ZXQgKG5vdCBzdXJlIGFib3V0IHRoaXMpICAgICAgICAgICAgICAqLworICAgICAgS01QX01CKCk7CisgICAgfQorICB9CisKKyAgLyogZGVxdWV1ZSB0YXNrcSB0aHVuayBmcm9tIGN1cnJfdGh1bmsgc3RhY2sgKi8KKyAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgdHEtPnRxX2N1cnJfdGh1bmtbdGlkXSA9IHRodW5rLT50aF9lbmNsX3RodW5rOworICAgIHRodW5rLT50aF9lbmNsX3RodW5rID0gTlVMTDsKKworICAgIEtGX0RVTVAoMjAwLCBfX2ttcF9kdW1wX3RodW5rX3N0YWNrKHRxLT50cV9jdXJyX3RodW5rW3RpZF0sIGdsb2JhbF90aWQpKTsKKyAgfQorCisgIEtFX1RSQUNFKDEwLCAoIl9fa21wY19lbmRfdGFza3FfdGFzayByZXR1cm4gKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworfQorCisvKiByZXR1cm5zIHRodW5rIGZvciBhIHJlZ3VsYXIgdGFzayBiYXNlZCBvbiB0YXNrcV90aHVuayAgICAgICAgICAgICAgKi8KKy8qIChfX2ttcGNfdGFza3FfdGFzayBkb2VzIHRoZSBhbmFsb2dvdXMgdGhpbmcgZm9yIGEgVFFGX1RBU0tRX1RBU0spICAqLworCitrbXBjX3RodW5rX3QgKl9fa21wY190YXNrX2J1ZmZlcihpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wY190aHVua190ICp0YXNrcV90aHVuaywga21wY190YXNrX3QgdGFzaykgeworICBrbXBfdGFza3FfdCAqdHE7CisgIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZTsKKyAga21wY190aHVua190ICpuZXdfdGh1bms7CisgIGludCBpbl9wYXJhbGxlbDsKKworICBLRV9UUkFDRSgxMCwgKCJfX2ttcGNfdGFza19idWZmZXIgY2FsbGVkICglZClcbiIsIGdsb2JhbF90aWQpKTsKKworICBLTVBfREVCVUdfQVNTRVJUKAorICAgICAgdGFza3FfdGh1bmstPnRoX2ZsYWdzICYKKyAgICAgIFRRRl9UQVNLUV9UQVNLKTsgLyogIHRhc2txX3RodW5rLT50aF90YXNrIGlzIHRoZSB0YXNrcV90YXNrICAqLworCisgIHRxID0gJl9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0tPnRoLnRoX3RlYW0tPnQudF90YXNrcTsKKyAgcXVldWUgPSB0YXNrcV90aHVuay0+dGgudGhfc2hhcmVkcy0+c3ZfcXVldWU7CisgIGluX3BhcmFsbGVsID0gKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9QQVJBTExFTF9DT05URVhUKTsKKworICAvKiBUaGUgaW5zdHJ1bWVudGF0aW9uIHNlcXVlbmNlIGlzOiAgX19rbXBjX3Rhc2tfYnVmZmVyKCksIGluaXRpYWxpemUgcHJpdmF0ZQorICAgICB2YXJpYWJsZXMsIF9fa21wY190YXNrKCkuICBUaGUgX19rbXBjX3Rhc2tfYnVmZmVyIHJvdXRpbmUgY2hlY2tzIHRoYXQgdGhlCisgICAgIHRhc2sgcXVldWUgaXMgbm90IGZ1bGwgYW5kIGFsbG9jYXRlcyBhIHRodW5rICh3aGljaCBpcyB0aGVuIHBhc3NlZCB0bworICAgICBfX2ttcGNfdGFzaygpKS4gIFNvLCB3ZSBjYW4gcHJlLWFsbG9jYXRlIGEgdGh1bmsgaGVyZSBhc3N1bWluZyBpdCB3aWxsIGJlCisgICAgIHRoZSBuZXh0IHRvIGJlIGVucXVldWVkIGluIF9fa21wY190YXNrKCkuICovCisKKyAgbmV3X3RodW5rID0gX19rbXBfYWxsb2NfdGh1bmsocXVldWUsIGluX3BhcmFsbGVsLCBnbG9iYWxfdGlkKTsKKyAgbmV3X3RodW5rLT50aC50aF9zaGFyZWRzID0KKyAgICAgIENDQVNUKGttcGNfc2hhcmVkX3ZhcnNfdCAqLCBxdWV1ZS0+dHFfc2hhcmVkc1swXS5haV9kYXRhKTsKKyAgbmV3X3RodW5rLT50aF9lbmNsX3RodW5rID0gTlVMTDsKKyAgbmV3X3RodW5rLT50aF90YXNrID0gdGFzazsKKworICAvKiBHRUggLSBzaG91bGRuJ3QgbmVlZCB0byBsb2NrIHRoZSByZWFkIG9mIHRxX2ZsYWdzIGhlcmUgKi8KKyAgbmV3X3RodW5rLT50aF9mbGFncyA9IHF1ZXVlLT50cV9mbGFncyAmIFRRRl9JTlRFUkZBQ0VfRkxBR1M7CisKKyAgbmV3X3RodW5rLT50aF9zdGF0dXMgPSAwOworCisgIEtNUF9ERUJVR19BU1NFUlQoIShuZXdfdGh1bmstPnRoX2ZsYWdzICYgVFFGX1RBU0tRX1RBU0spKTsKKworICBLRl9UUkFDRSgxMDAsICgiQ3JlYXRpbmcgUmVndWxhciBUYXNrIG9uICglZCk6XG4iLCBnbG9iYWxfdGlkKSk7CisgIEtGX0RVTVAoMTAwLCBfX2ttcF9kdW1wX3RodW5rKHRxLCBuZXdfdGh1bmssIGdsb2JhbF90aWQpKTsKKworICBLRV9UUkFDRSgxMCwgKCJfX2ttcGNfdGFza19idWZmZXIgcmV0dXJuICglZClcbiIsIGdsb2JhbF90aWQpKTsKKworICByZXR1cm4gbmV3X3RodW5rOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3RocmVhZHByaXZhdGUuY3BwIGIvZmluYWwvcnVudGltZS9zcmMva21wX3RocmVhZHByaXZhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MzVjN2UKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfdGhyZWFkcHJpdmF0ZS5jcHAKQEAgLTAsMCArMSw3MjAgQEAKKy8qCisgKiBrbXBfdGhyZWFkcHJpdmF0ZS5jcHAgLS0gT3Blbk1QIHRocmVhZHByaXZhdGUgc3VwcG9ydCBsaWJyYXJ5CisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKworI2RlZmluZSBVU0VfQ0hFQ0tTX0NPTU1PTgorCisjZGVmaW5lIEtNUF9JTkxJTkVfU1VCUiAxCisKK3ZvaWQga21wX3RocmVhZHByaXZhdGVfaW5zZXJ0X3ByaXZhdGVfZGF0YShpbnQgZ3RpZCwgdm9pZCAqcGNfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhX2FkZHIsIHNpemVfdCBwY19zaXplKTsKK3N0cnVjdCBwcml2YXRlX2NvbW1vbiAqa21wX3RocmVhZHByaXZhdGVfaW5zZXJ0KGludCBndGlkLCB2b2lkICpwY19hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YV9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHBjX3NpemUpOworCitzdHJ1Y3Qgc2hhcmVkX3RhYmxlIF9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZTsKKworc3RhdGljCisjaWZkZWYgS01QX0lOTElORV9TVUJSCisgICAgX19mb3JjZWlubGluZQorI2VuZGlmCisgICAgc3RydWN0IHByaXZhdGVfY29tbW9uICoKKyAgICBfX2ttcF90aHJlYWRwcml2YXRlX2ZpbmRfdGFza19jb21tb24oc3RydWN0IGNvbW1vbl90YWJsZSAqdGJsLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcGNfYWRkcikKKworeworICBzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gKnRuOworCisjaWZkZWYgS01QX1RBU0tfQ09NTU9OX0RFQlVHCisgIEtDX1RSQUNFKDEwLCAoIl9fa21wX3RocmVhZHByaXZhdGVfZmluZF90YXNrX2NvbW1vbjogdGhyZWFkIyVkLCBjYWxsZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgImFkZHJlc3MgJXBcbiIsCisgICAgICAgICAgICAgICAgZ3RpZCwgcGNfYWRkcikpOworICBkdW1wX2xpc3QoKTsKKyNlbmRpZgorCisgIGZvciAodG4gPSB0YmwtPmRhdGFbS01QX0hBU0gocGNfYWRkcildOyB0bjsgdG4gPSB0bi0+bmV4dCkgeworICAgIGlmICh0bi0+Z2JsX2FkZHIgPT0gcGNfYWRkcikgeworI2lmZGVmIEtNUF9UQVNLX0NPTU1PTl9ERUJVRworICAgICAgS0NfVFJBQ0UoMTAsICgiX19rbXBfdGhyZWFkcHJpdmF0ZV9maW5kX3Rhc2tfY29tbW9uOiB0aHJlYWQjJWQsIGZvdW5kICIKKyAgICAgICAgICAgICAgICAgICAgIm5vZGUgJXAgb24gbGlzdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgcGNfYWRkcikpOworI2VuZGlmCisgICAgICByZXR1cm4gdG47CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMKKyNpZmRlZiBLTVBfSU5MSU5FX1NVQlIKKyAgICBfX2ZvcmNlaW5saW5lCisjZW5kaWYKKyAgICBzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAqCisgICAgX19rbXBfZmluZF9zaGFyZWRfdGFza19jb21tb24oc3RydWN0IHNoYXJlZF90YWJsZSAqdGJsLCBpbnQgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwY19hZGRyKSB7CisgIHN0cnVjdCBzaGFyZWRfY29tbW9uICp0bjsKKworICBmb3IgKHRuID0gdGJsLT5kYXRhW0tNUF9IQVNIKHBjX2FkZHIpXTsgdG47IHRuID0gdG4tPm5leHQpIHsKKyAgICBpZiAodG4tPmdibF9hZGRyID09IHBjX2FkZHIpIHsKKyNpZmRlZiBLTVBfVEFTS19DT01NT05fREVCVUcKKyAgICAgIEtDX1RSQUNFKAorICAgICAgICAgIDEwLAorICAgICAgICAgICgiX19rbXBfZmluZF9zaGFyZWRfdGFza19jb21tb246IHRocmVhZCMlZCwgZm91bmQgbm9kZSAlcCBvbiBsaXN0XG4iLAorICAgICAgICAgICBndGlkLCBwY19hZGRyKSk7CisjZW5kaWYKKyAgICAgIHJldHVybiB0bjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vIENyZWF0ZSBhIHRlbXBsYXRlIGZvciB0aGUgZGF0YSBpbml0aWFsaXplZCBzdG9yYWdlLiBFaXRoZXIgdGhlIHRlbXBsYXRlIGlzCisvLyBOVUxMIGluZGljYXRpbmcgemVybyBmaWxsLCBvciB0aGUgdGVtcGxhdGUgaXMgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBkYXRhLgorc3RhdGljIHN0cnVjdCBwcml2YXRlX2RhdGEgKl9fa21wX2luaXRfY29tbW9uX2RhdGEodm9pZCAqcGNfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwY19zaXplKSB7CisgIHN0cnVjdCBwcml2YXRlX2RhdGEgKmQ7CisgIHNpemVfdCBpOworICBjaGFyICpwOworCisgIGQgPSAoc3RydWN0IHByaXZhdGVfZGF0YSAqKV9fa21wX2FsbG9jYXRlKHNpemVvZihzdHJ1Y3QgcHJpdmF0ZV9kYXRhKSk7CisgIC8qCisgICAgICBkLT5kYXRhID0gMDsgIC8vIEFDOiBjb21tZW50ZWQgb3V0IGJlY2F1c2UgX19rbXBfYWxsb2NhdGUgemVyb2VzIHRoZQorICAgICBtZW1vcnkKKyAgICAgIGQtPm5leHQgPSAwOworICAqLworICBkLT5zaXplID0gcGNfc2l6ZTsKKyAgZC0+bW9yZSA9IDE7CisKKyAgcCA9IChjaGFyICopcGNfYWRkcjsKKworICBmb3IgKGkgPSBwY19zaXplOyBpID4gMDsgLS1pKSB7CisgICAgaWYgKCpwKysgIT0gJ1wwJykgeworICAgICAgZC0+ZGF0YSA9IF9fa21wX2FsbG9jYXRlKHBjX3NpemUpOworICAgICAgS01QX01FTUNQWShkLT5kYXRhLCBwY19hZGRyLCBwY19zaXplKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiBkOworfQorCisvLyBJbml0aWFsaXplIHRoZSBkYXRhIGFyZWEgZnJvbSB0aGUgdGVtcGxhdGUuCitzdGF0aWMgdm9pZCBfX2ttcF9jb3B5X2NvbW1vbl9kYXRhKHZvaWQgKnBjX2FkZHIsIHN0cnVjdCBwcml2YXRlX2RhdGEgKmQpIHsKKyAgY2hhciAqYWRkciA9IChjaGFyICopcGNfYWRkcjsKKyAgaW50IGksIG9mZnNldDsKKworICBmb3IgKG9mZnNldCA9IDA7IGQgIT0gMDsgZCA9IGQtPm5leHQpIHsKKyAgICBmb3IgKGkgPSBkLT5tb3JlOyBpID4gMDsgLS1pKSB7CisgICAgICBpZiAoZC0+ZGF0YSA9PSAwKQorICAgICAgICBtZW1zZXQoJmFkZHJbb2Zmc2V0XSwgJ1wwJywgZC0+c2l6ZSk7CisgICAgICBlbHNlCisgICAgICAgIEtNUF9NRU1DUFkoJmFkZHJbb2Zmc2V0XSwgZC0+ZGF0YSwgZC0+c2l6ZSk7CisgICAgICBvZmZzZXQgKz0gZC0+c2l6ZTsKKyAgICB9CisgIH0KK30KKworLyogd2UgYXJlIGNhbGxlZCBmcm9tIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCkgd2l0aCBfX2ttcF9pbml0el9sb2NrIGhlbGQuICovCit2b2lkIF9fa21wX2NvbW1vbl9pbml0aWFsaXplKHZvaWQpIHsKKyAgaWYgKCFUQ1JfNChfX2ttcF9pbml0X2NvbW1vbikpIHsKKyAgICBpbnQgcTsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBpbnQgZ3RpZDsKKyNlbmRpZgorCisgICAgX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0ID0gTlVMTDsKKworI2lmZGVmIEtNUF9ERUJVRworICAgIC8qIHZlcmlmeSB0aGUgdWJlciBtYXN0ZXJzIHdlcmUgaW5pdGlhbGl6ZWQgKi8KKyAgICBmb3IgKGd0aWQgPSAwOyBndGlkIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgZ3RpZCsrKQorICAgICAgaWYgKF9fa21wX3Jvb3RbZ3RpZF0pIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9yb290W2d0aWRdLT5yLnJfdWJlcl90aHJlYWQpOworICAgICAgICBmb3IgKHEgPSAwOyBxIDwgS01QX0hBU0hfVEFCTEVfU0laRTsgKytxKQorICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoCisgICAgICAgICAgICAgICFfX2ttcF9yb290W2d0aWRdLT5yLnJfdWJlcl90aHJlYWQtPnRoLnRoX3ByaV9jb21tb24tPmRhdGFbcV0pOworICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgX19rbXBfcm9vdFsgZ2l0ZCBdLT4gci5yX3ViZXJfdGhyZWFkIC0+CisgICAgICAgICAqIHRoLnRoX3ByaV9jb21tb24gLT4gZGF0YVsgcSBdID0gMDsqLworICAgICAgfQorI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgICAgZm9yIChxID0gMDsgcSA8IEtNUF9IQVNIX1RBQkxFX1NJWkU7ICsrcSkKKyAgICAgIF9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZS5kYXRhW3FdID0gMDsKKworICAgIFRDV180KF9fa21wX2luaXRfY29tbW9uLCBUUlVFKTsKKyAgfQorfQorCisvKiBDYWxsIGFsbCBkZXN0cnVjdG9ycyBmb3IgdGhyZWFkcHJpdmF0ZSBkYXRhIGJlbG9uZ2luZyB0byBhbGwgdGhyZWFkcy4KKyAgIEN1cnJlbnRseSB1bnVzZWQhICovCit2b2lkIF9fa21wX2NvbW1vbl9kZXN0cm95KHZvaWQpIHsKKyAgaWYgKFRDUl80KF9fa21wX2luaXRfY29tbW9uKSkgeworICAgIGludCBxOworCisgICAgVENXXzQoX19rbXBfaW5pdF9jb21tb24sIEZBTFNFKTsKKworICAgIGZvciAocSA9IDA7IHEgPCBLTVBfSEFTSF9UQUJMRV9TSVpFOyArK3EpIHsKKyAgICAgIGludCBndGlkOworICAgICAgc3RydWN0IHByaXZhdGVfY29tbW9uICp0bjsKKyAgICAgIHN0cnVjdCBzaGFyZWRfY29tbW9uICpkX3RuOworCisgICAgICAvKiBDKysgZGVzdHJ1Y3RvcnMgbmVlZCB0byBiZSBjYWxsZWQgb25jZSBwZXIgdGhyZWFkIGJlZm9yZSBleGl0aW5nLgorICAgICAgICAgRG9uJ3QgY2FsbCBkZXN0cnVjdG9ycyBmb3IgbWFzdGVyIHRocmVhZCB0aG91Z2ggdW5sZXNzIHdlIHVzZWQgY29weQorICAgICAgICAgY29uc3RydWN0b3IgKi8KKworICAgICAgZm9yIChkX3RuID0gX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlLmRhdGFbcV07IGRfdG47CisgICAgICAgICAgIGRfdG4gPSBkX3RuLT5uZXh0KSB7CisgICAgICAgIGlmIChkX3RuLT5pc192ZWMpIHsKKyAgICAgICAgICBpZiAoZF90bi0+ZHQuZHRvcnYgIT0gMCkgeworICAgICAgICAgICAgZm9yIChndGlkID0gMDsgZ3RpZCA8IF9fa21wX2FsbF9udGg7ICsrZ3RpZCkgeworICAgICAgICAgICAgICBpZiAoX19rbXBfdGhyZWFkc1tndGlkXSkgeworICAgICAgICAgICAgICAgIGlmICgoX19rbXBfZm9yZWlnbl90cCkgPyAoIUtNUF9JTklUSUFMX0dUSUQoZ3RpZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICghS01QX1VCRVJfR1RJRChndGlkKSkpIHsKKyAgICAgICAgICAgICAgICAgIHRuID0gX19rbXBfdGhyZWFkcHJpdmF0ZV9maW5kX3Rhc2tfY29tbW9uKAorICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3ByaV9jb21tb24sIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgZF90bi0+Z2JsX2FkZHIpOworICAgICAgICAgICAgICAgICAgaWYgKHRuKSB7CisgICAgICAgICAgICAgICAgICAgICgqZF90bi0+ZHQuZHRvcnYpKHRuLT5wYXJfYWRkciwgZF90bi0+dmVjX2xlbik7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZF90bi0+b2JqX2luaXQgIT0gMCkgeworICAgICAgICAgICAgICAoKmRfdG4tPmR0LmR0b3J2KShkX3RuLT5vYmpfaW5pdCwgZF90bi0+dmVjX2xlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChkX3RuLT5kdC5kdG9yICE9IDApIHsKKyAgICAgICAgICAgIGZvciAoZ3RpZCA9IDA7IGd0aWQgPCBfX2ttcF9hbGxfbnRoOyArK2d0aWQpIHsKKyAgICAgICAgICAgICAgaWYgKF9fa21wX3RocmVhZHNbZ3RpZF0pIHsKKyAgICAgICAgICAgICAgICBpZiAoKF9fa21wX2ZvcmVpZ25fdHApID8gKCFLTVBfSU5JVElBTF9HVElEKGd0aWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoIUtNUF9VQkVSX0dUSUQoZ3RpZCkpKSB7CisgICAgICAgICAgICAgICAgICB0biA9IF9fa21wX3RocmVhZHByaXZhdGVfZmluZF90YXNrX2NvbW1vbigKKyAgICAgICAgICAgICAgICAgICAgICBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF9wcmlfY29tbW9uLCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgIGRfdG4tPmdibF9hZGRyKTsKKyAgICAgICAgICAgICAgICAgIGlmICh0bikgeworICAgICAgICAgICAgICAgICAgICAoKmRfdG4tPmR0LmR0b3IpKHRuLT5wYXJfYWRkcik7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZF90bi0+b2JqX2luaXQgIT0gMCkgeworICAgICAgICAgICAgICAoKmRfdG4tPmR0LmR0b3IpKGRfdG4tPm9ial9pbml0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIF9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZS5kYXRhW3FdID0gMDsKKyAgICB9CisgIH0KK30KKworLyogQ2FsbCBhbGwgZGVzdHJ1Y3RvcnMgZm9yIHRocmVhZHByaXZhdGUgZGF0YSBiZWxvbmdpbmcgdG8gdGhpcyB0aHJlYWQgKi8KK3ZvaWQgX19rbXBfY29tbW9uX2Rlc3Ryb3lfZ3RpZChpbnQgZ3RpZCkgeworICBzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gKnRuOworICBzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAqZF90bjsKKworICBpZiAoIVRDUl80KF9fa21wX2luaXRfZ3RpZCkpIHsKKyAgICAvLyBUaGlzIGlzIHBvc3NpYmxlIHdoZW4gb25lIG9mIG11bHRpcGxlIHJvb3RzIGluaXRpYXRlcyBlYXJseSBsaWJyYXJ5CisgICAgLy8gdGVybWluYXRpb24gaW4gYSBzZXF1ZW50aWFsIHJlZ2lvbiB3aGlsZSBvdGhlciB0ZWFtcyBhcmUgYWN0aXZlLCBhbmQgaXRzCisgICAgLy8gY2hpbGQgdGhyZWFkcyBhcmUgYWJvdXQgdG8gZW5kLgorICAgIHJldHVybjsKKyAgfQorCisgIEtDX1RSQUNFKDEwLCAoIl9fa21wX2NvbW1vbl9kZXN0cm95X2d0aWQ6IFQjJWQgY2FsbGVkXG4iLCBndGlkKSk7CisgIGlmICgoX19rbXBfZm9yZWlnbl90cCkgPyAoIUtNUF9JTklUSUFMX0dUSUQoZ3RpZCkpIDogKCFLTVBfVUJFUl9HVElEKGd0aWQpKSkgeworCisgICAgaWYgKFRDUl80KF9fa21wX2luaXRfY29tbW9uKSkgeworCisgICAgICAvKiBDYW5ub3QgZG8gdGhpcyBoZXJlIHNpbmNlIG5vdCBhbGwgdGhyZWFkcyBoYXZlIGRlc3Ryb3llZCB0aGVpciBkYXRhICovCisgICAgICAvKiBUQ1dfNChfX2ttcF9pbml0X2NvbW1vbiwgRkFMU0UpOyAqLworCisgICAgICBmb3IgKHRuID0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfcHJpX2hlYWQ7IHRuOyB0biA9IHRuLT5saW5rKSB7CisKKyAgICAgICAgZF90biA9IF9fa21wX2ZpbmRfc2hhcmVkX3Rhc2tfY29tbW9uKCZfX2ttcF90aHJlYWRwcml2YXRlX2RfdGFibGUsIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bi0+Z2JsX2FkZHIpOworCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoZF90bik7CisKKyAgICAgICAgaWYgKGRfdG4tPmlzX3ZlYykgeworICAgICAgICAgIGlmIChkX3RuLT5kdC5kdG9ydiAhPSAwKSB7CisgICAgICAgICAgICAodm9pZCkoKmRfdG4tPmR0LmR0b3J2KSh0bi0+cGFyX2FkZHIsIGRfdG4tPnZlY19sZW4pOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoZF90bi0+b2JqX2luaXQgIT0gMCkgeworICAgICAgICAgICAgKHZvaWQpKCpkX3RuLT5kdC5kdG9ydikoZF90bi0+b2JqX2luaXQsIGRfdG4tPnZlY19sZW4pOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoZF90bi0+ZHQuZHRvciAhPSAwKSB7CisgICAgICAgICAgICAodm9pZCkoKmRfdG4tPmR0LmR0b3IpKHRuLT5wYXJfYWRkcik7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChkX3RuLT5vYmpfaW5pdCAhPSAwKSB7CisgICAgICAgICAgICAodm9pZCkoKmRfdG4tPmR0LmR0b3IpKGRfdG4tPm9ial9pbml0KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIEtDX1RSQUNFKDMwLCAoIl9fa21wX2NvbW1vbl9kZXN0cm95X2d0aWQ6IFQjJWQgdGhyZWFkcHJpdmF0ZSBkZXN0cnVjdG9ycyAiCisgICAgICAgICAgICAgICAgICAgICJjb21wbGV0ZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCkpOworICAgIH0KKyAgfQorfQorCisjaWZkZWYgS01QX1RBU0tfQ09NTU9OX0RFQlVHCitzdGF0aWMgdm9pZCBkdW1wX2xpc3Qodm9pZCkgeworICBpbnQgcCwgcTsKKworICBmb3IgKHAgPSAwOyBwIDwgX19rbXBfYWxsX250aDsgKytwKSB7CisgICAgaWYgKCFfX2ttcF90aHJlYWRzW3BdKQorICAgICAgY29udGludWU7CisgICAgZm9yIChxID0gMDsgcSA8IEtNUF9IQVNIX1RBQkxFX1NJWkU7ICsrcSkgeworICAgICAgaWYgKF9fa21wX3RocmVhZHNbcF0tPnRoLnRoX3ByaV9jb21tb24tPmRhdGFbcV0pIHsKKyAgICAgICAgc3RydWN0IHByaXZhdGVfY29tbW9uICp0bjsKKworICAgICAgICBLQ19UUkFDRSgxMCwgKCJcdGR1bXBfbGlzdDogZ3RpZDolZCBhZGRyZXNzZXNcbiIsIHApKTsKKworICAgICAgICBmb3IgKHRuID0gX19rbXBfdGhyZWFkc1twXS0+dGgudGhfcHJpX2NvbW1vbi0+ZGF0YVtxXTsgdG47CisgICAgICAgICAgICAgdG4gPSB0bi0+bmV4dCkgeworICAgICAgICAgIEtDX1RSQUNFKDEwLAorICAgICAgICAgICAgICAgICAgICgiXHRkdW1wX2xpc3Q6IFRIUkVBRFBSSVZBVEU6IFNlcmlhbCAlcCAtPiBQYXJhbGxlbCAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgdG4tPmdibF9hZGRyLCB0bi0+cGFyX2FkZHIpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorI2VuZGlmIC8qIEtNUF9UQVNLX0NPTU1PTl9ERUJVRyAqLworCisvLyBOT1RFOiB0aGlzIHJvdXRpbmUgaXMgdG8gYmUgY2FsbGVkIG9ubHkgZnJvbSB0aGUgc2VyaWFsIHBhcnQgb2YgdGhlIHByb2dyYW0uCit2b2lkIGttcF90aHJlYWRwcml2YXRlX2luc2VydF9wcml2YXRlX2RhdGEoaW50IGd0aWQsIHZvaWQgKnBjX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YV9hZGRyLCBzaXplX3QgcGNfc2l6ZSkgeworICBzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAqKmxua190biwgKmRfdG47CisgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfdGhyZWFkc1tndGlkXSAmJgorICAgICAgICAgICAgICAgICAgIF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3Jvb3QtPnIucl9hY3RpdmUgPT0gMCk7CisKKyAgZF90biA9IF9fa21wX2ZpbmRfc2hhcmVkX3Rhc2tfY29tbW9uKCZfX2ttcF90aHJlYWRwcml2YXRlX2RfdGFibGUsIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY19hZGRyKTsKKworICBpZiAoZF90biA9PSAwKSB7CisgICAgZF90biA9IChzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAqKV9fa21wX2FsbG9jYXRlKHNpemVvZihzdHJ1Y3Qgc2hhcmVkX2NvbW1vbikpOworCisgICAgZF90bi0+Z2JsX2FkZHIgPSBwY19hZGRyOworICAgIGRfdG4tPnBvZF9pbml0ID0gX19rbXBfaW5pdF9jb21tb25fZGF0YShkYXRhX2FkZHIsIHBjX3NpemUpOworICAgIC8qCisgICAgICAgICAgICBkX3RuLT5vYmpfaW5pdCA9IDA7ICAvLyBBQzogY29tbWVudGVkIG91dCBiZWNhdXNlIF9fa21wX2FsbG9jYXRlCisgICAgICAgemVyb2VzIHRoZSBtZW1vcnkKKyAgICAgICAgICAgIGRfdG4tPmN0LmN0b3IgPSAwOworICAgICAgICAgICAgZF90bi0+Y2N0LmNjdG9yID0gMDs7CisgICAgICAgICAgICBkX3RuLT5kdC5kdG9yID0gMDsKKyAgICAgICAgICAgIGRfdG4tPmlzX3ZlYyA9IEZBTFNFOworICAgICAgICAgICAgZF90bi0+dmVjX2xlbiA9IDBMOworICAgICovCisgICAgZF90bi0+Y21uX3NpemUgPSBwY19zaXplOworCisgICAgX19rbXBfYWNxdWlyZV9sb2NrKCZfX2ttcF9nbG9iYWxfbG9jaywgZ3RpZCk7CisKKyAgICBsbmtfdG4gPSAmKF9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZS5kYXRhW0tNUF9IQVNIKHBjX2FkZHIpXSk7CisKKyAgICBkX3RuLT5uZXh0ID0gKmxua190bjsKKyAgICAqbG5rX3RuID0gZF90bjsKKworICAgIF9fa21wX3JlbGVhc2VfbG9jaygmX19rbXBfZ2xvYmFsX2xvY2ssIGd0aWQpOworICB9Cit9CisKK3N0cnVjdCBwcml2YXRlX2NvbW1vbiAqa21wX3RocmVhZHByaXZhdGVfaW5zZXJ0KGludCBndGlkLCB2b2lkICpwY19hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YV9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHBjX3NpemUpIHsKKyAgc3RydWN0IHByaXZhdGVfY29tbW9uICp0biwgKip0dDsKKyAgc3RydWN0IHNoYXJlZF9jb21tb24gKmRfdG47CisKKyAgLyogKysrKysrKysrIFNUQVJUIE9GIENSSVRJQ0FMIFNFQ1RJT04gKysrKysrKysrICovCisgIF9fa21wX2FjcXVpcmVfbG9jaygmX19rbXBfZ2xvYmFsX2xvY2ssIGd0aWQpOworCisgIHRuID0gKHN0cnVjdCBwcml2YXRlX2NvbW1vbiAqKV9fa21wX2FsbG9jYXRlKHNpemVvZihzdHJ1Y3QgcHJpdmF0ZV9jb21tb24pKTsKKworICB0bi0+Z2JsX2FkZHIgPSBwY19hZGRyOworCisgIGRfdG4gPSBfX2ttcF9maW5kX3NoYXJlZF90YXNrX2NvbW1vbigKKyAgICAgICZfX2ttcF90aHJlYWRwcml2YXRlX2RfdGFibGUsIGd0aWQsCisgICAgICBwY19hZGRyKTsgLyogT25seSB0aGUgTUFTVEVSIGRhdGEgdGFibGUgZXhpc3RzLiAqLworCisgIGlmIChkX3RuICE9IDApIHsKKyAgICAvKiBUaGlzIHRocmVhZHByaXZhdGUgdmFyaWFibGUgaGFzIGFscmVhZHkgYmVlbiBzZWVuLiAqLworCisgICAgaWYgKGRfdG4tPnBvZF9pbml0ID09IDAgJiYgZF90bi0+b2JqX2luaXQgPT0gMCkgeworICAgICAgZF90bi0+Y21uX3NpemUgPSBwY19zaXplOworCisgICAgICBpZiAoZF90bi0+aXNfdmVjKSB7CisgICAgICAgIGlmIChkX3RuLT5jdC5jdG9ydiAhPSAwKSB7CisgICAgICAgICAgLyogQ29uc3RydWN0IGZyb20gc2NyYXRjaCBzbyBubyBwcm90b3R5cGUgZXhpc3RzICovCisgICAgICAgICAgZF90bi0+b2JqX2luaXQgPSAwOworICAgICAgICB9IGVsc2UgaWYgKGRfdG4tPmNjdC5jY3RvcnYgIT0gMCkgeworICAgICAgICAgIC8qIE5vdyBkYXRhIGluaXRpYWxpemUgdGhlIHByb3RvdHlwZSBzaW5jZSBpdCB3YXMgcHJldmlvdXNseQorICAgICAgICAgICAqIHJlZ2lzdGVyZWQgKi8KKyAgICAgICAgICBkX3RuLT5vYmpfaW5pdCA9ICh2b2lkICopX19rbXBfYWxsb2NhdGUoZF90bi0+Y21uX3NpemUpOworICAgICAgICAgICh2b2lkKSgqZF90bi0+Y2N0LmNjdG9ydikoZF90bi0+b2JqX2luaXQsIHBjX2FkZHIsIGRfdG4tPnZlY19sZW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGRfdG4tPnBvZF9pbml0ID0gX19rbXBfaW5pdF9jb21tb25fZGF0YShkYXRhX2FkZHIsIGRfdG4tPmNtbl9zaXplKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGRfdG4tPmN0LmN0b3IgIT0gMCkgeworICAgICAgICAgIC8qIENvbnN0cnVjdCBmcm9tIHNjcmF0Y2ggc28gbm8gcHJvdG90eXBlIGV4aXN0cyAqLworICAgICAgICAgIGRfdG4tPm9ial9pbml0ID0gMDsKKyAgICAgICAgfSBlbHNlIGlmIChkX3RuLT5jY3QuY2N0b3IgIT0gMCkgeworICAgICAgICAgIC8qIE5vdyBkYXRhIGluaXRpYWxpemUgdGhlIHByb3RvdHlwZSBzaW5jZSBpdCB3YXMgcHJldmlvdXNseQorICAgICAgICAgICAgIHJlZ2lzdGVyZWQgKi8KKyAgICAgICAgICBkX3RuLT5vYmpfaW5pdCA9ICh2b2lkICopX19rbXBfYWxsb2NhdGUoZF90bi0+Y21uX3NpemUpOworICAgICAgICAgICh2b2lkKSgqZF90bi0+Y2N0LmNjdG9yKShkX3RuLT5vYmpfaW5pdCwgcGNfYWRkcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZF90bi0+cG9kX2luaXQgPSBfX2ttcF9pbml0X2NvbW1vbl9kYXRhKGRhdGFfYWRkciwgZF90bi0+Y21uX3NpemUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIHN0cnVjdCBzaGFyZWRfY29tbW9uICoqbG5rX3RuOworCisgICAgZF90biA9IChzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAqKV9fa21wX2FsbG9jYXRlKHNpemVvZihzdHJ1Y3Qgc2hhcmVkX2NvbW1vbikpOworICAgIGRfdG4tPmdibF9hZGRyID0gcGNfYWRkcjsKKyAgICBkX3RuLT5jbW5fc2l6ZSA9IHBjX3NpemU7CisgICAgZF90bi0+cG9kX2luaXQgPSBfX2ttcF9pbml0X2NvbW1vbl9kYXRhKGRhdGFfYWRkciwgcGNfc2l6ZSk7CisgICAgLyoKKyAgICAgICAgICAgIGRfdG4tPm9ial9pbml0ID0gMDsgIC8vIEFDOiBjb21tZW50ZWQgb3V0IGJlY2F1c2UgX19rbXBfYWxsb2NhdGUKKyAgICAgICB6ZXJvZXMgdGhlIG1lbW9yeQorICAgICAgICAgICAgZF90bi0+Y3QuY3RvciA9IDA7CisgICAgICAgICAgICBkX3RuLT5jY3QuY2N0b3IgPSAwOworICAgICAgICAgICAgZF90bi0+ZHQuZHRvciA9IDA7CisgICAgICAgICAgICBkX3RuLT5pc192ZWMgPSBGQUxTRTsKKyAgICAgICAgICAgIGRfdG4tPnZlY19sZW4gPSAwTDsKKyAgICAqLworICAgIGxua190biA9ICYoX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlLmRhdGFbS01QX0hBU0gocGNfYWRkcildKTsKKworICAgIGRfdG4tPm5leHQgPSAqbG5rX3RuOworICAgICpsbmtfdG4gPSBkX3RuOworICB9CisKKyAgdG4tPmNtbl9zaXplID0gZF90bi0+Y21uX3NpemU7CisKKyAgaWYgKChfX2ttcF9mb3JlaWduX3RwKSA/IChLTVBfSU5JVElBTF9HVElEKGd0aWQpKSA6IChLTVBfVUJFUl9HVElEKGd0aWQpKSkgeworICAgIHRuLT5wYXJfYWRkciA9ICh2b2lkICopcGNfYWRkcjsKKyAgfSBlbHNlIHsKKyAgICB0bi0+cGFyX2FkZHIgPSAodm9pZCAqKV9fa21wX2FsbG9jYXRlKHRuLT5jbW5fc2l6ZSk7CisgIH0KKworICBfX2ttcF9yZWxlYXNlX2xvY2soJl9fa21wX2dsb2JhbF9sb2NrLCBndGlkKTsKKy8qICsrKysrKysrKyBFTkQgT0YgQ1JJVElDQUwgU0VDVElPTiArKysrKysrKysgKi8KKworI2lmZGVmIFVTRV9DSEVDS1NfQ09NTU9OCisgIGlmIChwY19zaXplID4gZF90bi0+Y21uX3NpemUpIHsKKyAgICBLQ19UUkFDRSgKKyAgICAgICAgMTAsICgiX19rbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnQ6IFRIUkVBRFBSSVZBVEU6ICVwICglIiBLTVBfVUlOVFBUUl9TUEVDCisgICAgICAgICAgICAgIiAsJSIgS01QX1VJTlRQVFJfU1BFQyAiKVxuIiwKKyAgICAgICAgICAgICBwY19hZGRyLCBwY19zaXplLCBkX3RuLT5jbW5fc2l6ZSkpOworICAgIEtNUF9GQVRBTChUUENvbW1vbkJsb2Nrc0luY29uc2lzdCk7CisgIH0KKyNlbmRpZiAvKiBVU0VfQ0hFQ0tTX0NPTU1PTiAqLworCisgIHR0ID0gJihfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF9wcmlfY29tbW9uLT5kYXRhW0tNUF9IQVNIKHBjX2FkZHIpXSk7CisKKyNpZmRlZiBLTVBfVEFTS19DT01NT05fREVCVUcKKyAgaWYgKCp0dCAhPSAwKSB7CisgICAgS0NfVFJBQ0UoCisgICAgICAgIDEwLAorICAgICAgICAoIl9fa21wX3RocmVhZHByaXZhdGVfaW5zZXJ0OiBXQVJOSU5HISB0aHJlYWQjJWQ6IGNvbGxpc2lvbiBvbiAlcFxuIiwKKyAgICAgICAgIGd0aWQsIHBjX2FkZHIpKTsKKyAgfQorI2VuZGlmCisgIHRuLT5uZXh0ID0gKnR0OworICAqdHQgPSB0bjsKKworI2lmZGVmIEtNUF9UQVNLX0NPTU1PTl9ERUJVRworICBLQ19UUkFDRSgxMCwKKyAgICAgICAgICAgKCJfX2ttcF90aHJlYWRwcml2YXRlX2luc2VydDogdGhyZWFkIyVkLCBpbnNlcnRlZCBub2RlICVwIG9uIGxpc3RcbiIsCisgICAgICAgICAgICBndGlkLCBwY19hZGRyKSk7CisgIGR1bXBfbGlzdCgpOworI2VuZGlmCisKKyAgLyogTGluayB0aGUgbm9kZSBpbnRvIGEgc2ltcGxlIGxpc3QgKi8KKworICB0bi0+bGluayA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3ByaV9oZWFkOworICBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF9wcmlfaGVhZCA9IHRuOworCisjaWZkZWYgQlVJTERfVFYKKyAgX19rbXBfdHZfdGhyZWFkcHJpdmF0ZV9zdG9yZShfX2ttcF90aHJlYWRzW2d0aWRdLCB0bi0+Z2JsX2FkZHIsIHRuLT5wYXJfYWRkcik7CisjZW5kaWYKKworICBpZiAoKF9fa21wX2ZvcmVpZ25fdHApID8gKEtNUF9JTklUSUFMX0dUSUQoZ3RpZCkpIDogKEtNUF9VQkVSX0dUSUQoZ3RpZCkpKQorICAgIHJldHVybiB0bjsKKworICAvKiBpZiBDKysgb2JqZWN0IHdpdGggY29weSBjb25zdHJ1Y3RvciwgdXNlIGl0OworICAgKiBlbHNlIGlmIEMrKyBvYmplY3Qgd2l0aCBjb25zdHJ1Y3RvciwgdXNlIGl0IGZvciB0aGUgbm9uLW1hc3RlciBjb3BpZXMgb25seTsKKyAgICogZWxzZSB1c2UgcG9kX2luaXQgYW5kIG1lbWNweQorICAgKgorICAgKiBDKysgY29uc3RydWN0b3JzIG5lZWQgdG8gYmUgY2FsbGVkIG9uY2UgZm9yIGVhY2ggbm9uLW1hc3RlciB0aHJlYWQgb24KKyAgICogYWxsb2NhdGUKKyAgICogQysrIGNvcHkgY29uc3RydWN0b3JzIG5lZWQgdG8gYmUgY2FsbGVkIG9uY2UgZm9yIGVhY2ggdGhyZWFkIG9uIGFsbG9jYXRlICovCisKKyAgLyogQysrIG9iamVjdCB3aXRoIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9yczsgZG9uJ3QgY2FsbCBjb25zdHJ1Y3RvcnMgZm9yCisgICAgIG1hc3RlciB0aHJlYWQgdGhvdWdoICovCisgIGlmIChkX3RuLT5pc192ZWMpIHsKKyAgICBpZiAoZF90bi0+Y3QuY3RvcnYgIT0gMCkgeworICAgICAgKHZvaWQpKCpkX3RuLT5jdC5jdG9ydikodG4tPnBhcl9hZGRyLCBkX3RuLT52ZWNfbGVuKTsKKyAgICB9IGVsc2UgaWYgKGRfdG4tPmNjdC5jY3RvcnYgIT0gMCkgeworICAgICAgKHZvaWQpKCpkX3RuLT5jY3QuY2N0b3J2KSh0bi0+cGFyX2FkZHIsIGRfdG4tPm9ial9pbml0LCBkX3RuLT52ZWNfbGVuKTsKKyAgICB9IGVsc2UgaWYgKHRuLT5wYXJfYWRkciAhPSB0bi0+Z2JsX2FkZHIpIHsKKyAgICAgIF9fa21wX2NvcHlfY29tbW9uX2RhdGEodG4tPnBhcl9hZGRyLCBkX3RuLT5wb2RfaW5pdCk7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChkX3RuLT5jdC5jdG9yICE9IDApIHsKKyAgICAgICh2b2lkKSgqZF90bi0+Y3QuY3RvcikodG4tPnBhcl9hZGRyKTsKKyAgICB9IGVsc2UgaWYgKGRfdG4tPmNjdC5jY3RvciAhPSAwKSB7CisgICAgICAodm9pZCkoKmRfdG4tPmNjdC5jY3RvcikodG4tPnBhcl9hZGRyLCBkX3RuLT5vYmpfaW5pdCk7CisgICAgfSBlbHNlIGlmICh0bi0+cGFyX2FkZHIgIT0gdG4tPmdibF9hZGRyKSB7CisgICAgICBfX2ttcF9jb3B5X2NvbW1vbl9kYXRhKHRuLT5wYXJfYWRkciwgZF90bi0+cG9kX2luaXQpOworICAgIH0KKyAgfQorICAvKiAhQlVJTERfT1BFTk1QX0MKKyAgICAgIGlmICh0bi0+cGFyX2FkZHIgIT0gdG4tPmdibF9hZGRyKQorICAgICAgICAgIF9fa21wX2NvcHlfY29tbW9uX2RhdGEoIHRuLT5wYXJfYWRkciwgZF90bi0+cG9kX2luaXQgKTsgKi8KKworICByZXR1cm4gdG47Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogV2UgYXJlIGN1cnJlbnRseSBwYXJhbGxlbCwgYW5kIHdlIGtub3cgdGhlIHRocmVhZCBpZC4gICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyohCisgQGluZ3JvdXAgVEhSRUFEUFJJVkFURQorCisgQHBhcmFtIGxvYyBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KKyBAcGFyYW0gZGF0YSAgcG9pbnRlciB0byBkYXRhIGJlaW5nIHByaXZhdGl6ZWQKKyBAcGFyYW0gY3RvciAgcG9pbnRlciB0byBjb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3IgZGF0YQorIEBwYXJhbSBjY3RvciAgcG9pbnRlciB0byBjb3B5IGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciBkYXRhCisgQHBhcmFtIGR0b3IgIHBvaW50ZXIgdG8gZGVzdHJ1Y3RvciBmdW5jdGlvbiBmb3IgZGF0YQorCisgUmVnaXN0ZXIgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBmb3IgdGhyZWFkIHByaXZhdGUgZGF0YS4KKyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGV4ZWN1dGluZyBpbiBwYXJhbGxlbCwgd2hlbiB3ZSBrbm93IHRoZSB0aHJlYWQgaWQuCisqLwordm9pZCBfX2ttcGNfdGhyZWFkcHJpdmF0ZV9yZWdpc3RlcihpZGVudF90ICpsb2MsIHZvaWQgKmRhdGEsIGttcGNfY3RvciBjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBjX2NjdG9yIGNjdG9yLCBrbXBjX2R0b3IgZHRvcikgeworICBzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAqZF90biwgKipsbmtfdG47CisKKyAgS0NfVFJBQ0UoMTAsICgiX19rbXBjX3RocmVhZHByaXZhdGVfcmVnaXN0ZXI6IGNhbGxlZFxuIikpOworCisjaWZkZWYgVVNFX0NIRUNLU19DT01NT04KKyAgLyogY29weSBjb25zdHJ1Y3RvciBtdXN0IGJlIHplcm8gZm9yIGN1cnJlbnQgY29kZSBnZW4gKE5vdiAyMDAyIC0ganBoKSAqLworICBLTVBfQVNTRVJUKGNjdG9yID09IDApOworI2VuZGlmIC8qIFVTRV9DSEVDS1NfQ09NTU9OICovCisKKyAgLyogT25seSB0aGUgZ2xvYmFsIGRhdGEgdGFibGUgZXhpc3RzLiAqLworICBkX3RuID0gX19rbXBfZmluZF9zaGFyZWRfdGFza19jb21tb24oJl9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZSwgLTEsIGRhdGEpOworCisgIGlmIChkX3RuID09IDApIHsKKyAgICBkX3RuID0gKHN0cnVjdCBzaGFyZWRfY29tbW9uICopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKHN0cnVjdCBzaGFyZWRfY29tbW9uKSk7CisgICAgZF90bi0+Z2JsX2FkZHIgPSBkYXRhOworCisgICAgZF90bi0+Y3QuY3RvciA9IGN0b3I7CisgICAgZF90bi0+Y2N0LmNjdG9yID0gY2N0b3I7CisgICAgZF90bi0+ZHQuZHRvciA9IGR0b3I7CisgICAgLyoKKyAgICAgICAgICAgIGRfdG4tPmlzX3ZlYyA9IEZBTFNFOyAgLy8gQUM6IGNvbW1lbnRlZCBvdXQgYmVjYXVzZSBfX2ttcF9hbGxvY2F0ZQorICAgICAgIHplcm9lcyB0aGUgbWVtb3J5CisgICAgICAgICAgICBkX3RuLT52ZWNfbGVuID0gMEw7CisgICAgICAgICAgICBkX3RuLT5vYmpfaW5pdCA9IDA7CisgICAgICAgICAgICBkX3RuLT5wb2RfaW5pdCA9IDA7CisgICAgKi8KKyAgICBsbmtfdG4gPSAmKF9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZS5kYXRhW0tNUF9IQVNIKGRhdGEpXSk7CisKKyAgICBkX3RuLT5uZXh0ID0gKmxua190bjsKKyAgICAqbG5rX3RuID0gZF90bjsKKyAgfQorfQorCit2b2lkICpfX2ttcGNfdGhyZWFkcHJpdmF0ZShpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpIHsKKyAgdm9pZCAqcmV0OworICBzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gKnRuOworCisgIEtDX1RSQUNFKDEwLCAoIl9fa21wY190aHJlYWRwcml2YXRlOiBUIyVkIGNhbGxlZFxuIiwgZ2xvYmFsX3RpZCkpOworCisjaWZkZWYgVVNFX0NIRUNLU19DT01NT04KKyAgaWYgKCFfX2ttcF9pbml0X3NlcmlhbCkKKyAgICBLTVBfRkFUQUwoUlRMTm90SW5pdGlhbGl6ZWQpOworI2VuZGlmIC8qIFVTRV9DSEVDS1NfQ09NTU9OICovCisKKyAgaWYgKCFfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdLT50aC50aF9yb290LT5yLnJfYWN0aXZlICYmICFfX2ttcF9mb3JlaWduX3RwKSB7CisgICAgLyogVGhlIHBhcmFsbGVsIGFkZHJlc3Mgd2lsbCBORVZFUiBvdmVybGFwIHdpdGggdGhlIGRhdGFfYWRkcmVzcyAqLworICAgIC8qIGRrcDogM3JkIGFyZyB0byBrbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnRfcHJpdmF0ZV9kYXRhKCkgaXMgdGhlCisgICAgICogZGF0YV9hZGRyZXNzOyB1c2UgZGF0YV9hZGRyZXNzID0gZGF0YSAqLworCisgICAgS0NfVFJBQ0UoMjAsICgiX19rbXBjX3RocmVhZHByaXZhdGU6IFQjJWQgaW5zZXJ0aW5nIHByaXZhdGUgZGF0YVxuIiwKKyAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQpKTsKKyAgICBrbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnRfcHJpdmF0ZV9kYXRhKGdsb2JhbF90aWQsIGRhdGEsIGRhdGEsIHNpemUpOworCisgICAgcmV0ID0gZGF0YTsKKyAgfSBlbHNlIHsKKyAgICBLQ19UUkFDRSgKKyAgICAgICAgNTAsCisgICAgICAgICgiX19rbXBjX3RocmVhZHByaXZhdGU6IFQjJWQgdHJ5IHRvIGZpbmQgcHJpdmF0ZSBkYXRhIGF0IGFkZHJlc3MgJXBcbiIsCisgICAgICAgICBnbG9iYWxfdGlkLCBkYXRhKSk7CisgICAgdG4gPSBfX2ttcF90aHJlYWRwcml2YXRlX2ZpbmRfdGFza19jb21tb24oCisgICAgICAgIF9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0tPnRoLnRoX3ByaV9jb21tb24sIGdsb2JhbF90aWQsIGRhdGEpOworCisgICAgaWYgKHRuKSB7CisgICAgICBLQ19UUkFDRSgyMCwgKCJfX2ttcGNfdGhyZWFkcHJpdmF0ZTogVCMlZCBmb3VuZCBkYXRhXG4iLCBnbG9iYWxfdGlkKSk7CisjaWZkZWYgVVNFX0NIRUNLU19DT01NT04KKyAgICAgIGlmICgoc2l6ZV90KXNpemUgPiB0bi0+Y21uX3NpemUpIHsKKyAgICAgICAgS0NfVFJBQ0UoMTAsICgiVEhSRUFEUFJJVkFURTogJXAgKCUiIEtNUF9VSU5UUFRSX1NQRUMKKyAgICAgICAgICAgICAgICAgICAgICAiICwlIiBLTVBfVUlOVFBUUl9TUEVDICIpXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIHNpemUsIHRuLT5jbW5fc2l6ZSkpOworICAgICAgICBLTVBfRkFUQUwoVFBDb21tb25CbG9ja3NJbmNvbnNpc3QpOworICAgICAgfQorI2VuZGlmIC8qIFVTRV9DSEVDS1NfQ09NTU9OICovCisgICAgfSBlbHNlIHsKKyAgICAgIC8qIFRoZSBwYXJhbGxlbCBhZGRyZXNzIHdpbGwgTkVWRVIgb3ZlcmxhcCB3aXRoIHRoZSBkYXRhX2FkZHJlc3MgKi8KKyAgICAgIC8qIGRrcDogM3JkIGFyZyB0byBrbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnQoKSBpcyB0aGUgZGF0YV9hZGRyZXNzOyB1c2UKKyAgICAgICAqIGRhdGFfYWRkcmVzcyA9IGRhdGEgKi8KKyAgICAgIEtDX1RSQUNFKDIwLCAoIl9fa21wY190aHJlYWRwcml2YXRlOiBUIyVkIGluc2VydGluZyBkYXRhXG4iLCBnbG9iYWxfdGlkKSk7CisgICAgICB0biA9IGttcF90aHJlYWRwcml2YXRlX2luc2VydChnbG9iYWxfdGlkLCBkYXRhLCBkYXRhLCBzaXplKTsKKyAgICB9CisKKyAgICByZXQgPSB0bi0+cGFyX2FkZHI7CisgIH0KKyAgS0NfVFJBQ0UoMTAsICgiX19rbXBjX3RocmVhZHByaXZhdGU6IFQjJWQgZXhpdGluZzsgcmV0dXJuIHZhbHVlID0gJXBcbiIsCisgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgcmV0KSk7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyohCisgQGluZ3JvdXAgVEhSRUFEUFJJVkFURQorIEBwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCisgQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyCisgQHBhcmFtIGRhdGEgIHBvaW50ZXIgdG8gZGF0YSB0byBwcml2YXRpemUKKyBAcGFyYW0gc2l6ZSAgc2l6ZSBvZiBkYXRhIHRvIHByaXZhdGl6ZQorIEBwYXJhbSBjYWNoZSAgcG9pbnRlciB0byBjYWNoZQorIEByZXR1cm4gcG9pbnRlciB0byBwcml2YXRlIHN0b3JhZ2UKKworIEFsbG9jYXRlIHByaXZhdGUgc3RvcmFnZSBmb3IgdGhyZWFkcHJpdmF0ZSBkYXRhLgorKi8KK3ZvaWQgKgorX19rbXBjX3RocmVhZHByaXZhdGVfY2FjaGVkKGlkZW50X3QgKmxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgZ2xvYmFsX3RpZCwgLy8gZ3RpZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCAvLyBQb2ludGVyIHRvIG9yaWdpbmFsIGdsb2JhbCB2YXJpYWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwgLy8gU2l6ZSBvZiBvcmlnaW5hbCBnbG9iYWwgdmFyaWFibGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKipjYWNoZSkgeworICBLQ19UUkFDRSgxMCwgKCJfX2ttcGNfdGhyZWFkcHJpdmF0ZV9jYWNoZWQ6IFQjJWQgY2FsbGVkIHdpdGggY2FjaGU6ICVwLCAiCisgICAgICAgICAgICAgICAgImFkZHJlc3M6ICVwLCBzaXplOiAlIiBLTVBfU0laRV9UX1NQRUMgIlxuIiwKKyAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCAqY2FjaGUsIGRhdGEsIHNpemUpKTsKKworICBpZiAoVENSX1BUUigqY2FjaGUpID09IDApIHsKKyAgICBfX2ttcF9hY3F1aXJlX2xvY2soJl9fa21wX2dsb2JhbF9sb2NrLCBnbG9iYWxfdGlkKTsKKworICAgIGlmIChUQ1JfUFRSKCpjYWNoZSkgPT0gMCkgeworICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jaygmX19rbXBfdHBfY2FjaGVkX2xvY2spOworICAgICAgX19rbXBfdHBfY2FjaGVkID0gMTsKKyAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJl9fa21wX3RwX2NhY2hlZF9sb2NrKTsKKyAgICAgIHZvaWQgKipteV9jYWNoZTsKKyAgICAgIEtNUF9JVFRfSUdOT1JFKAorICAgICAgICAgIG15X2NhY2hlID0gKHZvaWQgKiopX19rbXBfYWxsb2NhdGUoCisgICAgICAgICAgICAgIHNpemVvZih2b2lkICopICogX19rbXBfdHBfY2FwYWNpdHkgKyBzaXplb2Yoa21wX2NhY2hlZF9hZGRyX3QpKTspOworICAgICAgLy8gTm8gbmVlZCB0byB6ZXJvIHRoZSBhbGxvY2F0ZWQgbWVtb3J5OyBfX2ttcF9hbGxvY2F0ZSBkb2VzIHRoYXQuCisgICAgICBLQ19UUkFDRSgKKyAgICAgICAgICA1MCwKKyAgICAgICAgICAoIl9fa21wY190aHJlYWRwcml2YXRlX2NhY2hlZDogVCMlZCBhbGxvY2F0ZWQgY2FjaGUgYXQgYWRkcmVzcyAlcFxuIiwKKyAgICAgICAgICAgZ2xvYmFsX3RpZCwgbXlfY2FjaGUpKTsKKworICAgICAgLyogVE9ETzogZnJlZSBhbGwgdGhpcyBtZW1vcnkgaW4gX19rbXBfY29tbW9uX2Rlc3Ryb3kgdXNpbmcKKyAgICAgICAqIF9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdCAqLworICAgICAgLyogQWRkIGFkZHJlc3Mgb2YgbXljYWNoZSB0byBsaW5rZWQgbGlzdCBmb3IgY2xlYW51cCBsYXRlciAgKi8KKyAgICAgIGttcF9jYWNoZWRfYWRkcl90ICp0cF9jYWNoZV9hZGRyOworCisgICAgICB0cF9jYWNoZV9hZGRyID0gKGttcF9jYWNoZWRfYWRkcl90ICopJm15X2NhY2hlW19fa21wX3RwX2NhcGFjaXR5XTsKKyAgICAgIHRwX2NhY2hlX2FkZHItPmFkZHIgPSBteV9jYWNoZTsKKyAgICAgIHRwX2NhY2hlX2FkZHItPm5leHQgPSBfX2ttcF90aHJlYWRwcml2X2NhY2hlX2xpc3Q7CisgICAgICBfX2ttcF90aHJlYWRwcml2X2NhY2hlX2xpc3QgPSB0cF9jYWNoZV9hZGRyOworCisgICAgICBLTVBfTUIoKTsKKworICAgICAgVENXX1BUUigqY2FjaGUsIG15X2NhY2hlKTsKKworICAgICAgS01QX01CKCk7CisgICAgfQorCisgICAgX19rbXBfcmVsZWFzZV9sb2NrKCZfX2ttcF9nbG9iYWxfbG9jaywgZ2xvYmFsX3RpZCk7CisgIH0KKworICB2b2lkICpyZXQ7CisgIGlmICgocmV0ID0gVENSX1BUUigoKmNhY2hlKVtnbG9iYWxfdGlkXSkpID09IDApIHsKKyAgICByZXQgPSBfX2ttcGNfdGhyZWFkcHJpdmF0ZShsb2MsIGdsb2JhbF90aWQsIGRhdGEsIChzaXplX3Qpc2l6ZSk7CisKKyAgICBUQ1dfUFRSKCgqY2FjaGUpW2dsb2JhbF90aWRdLCByZXQpOworICB9CisgIEtDX1RSQUNFKDEwLAorICAgICAgICAgICAoIl9fa21wY190aHJlYWRwcml2YXRlX2NhY2hlZDogVCMlZCBleGl0aW5nOyByZXR1cm4gdmFsdWUgPSAlcFxuIiwKKyAgICAgICAgICAgIGdsb2JhbF90aWQsIHJldCkpOworCisgIHJldHVybiByZXQ7Cit9CisKKy8qIQorIEBpbmdyb3VwIFRIUkVBRFBSSVZBVEUKKyBAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorIEBwYXJhbSBkYXRhICBwb2ludGVyIHRvIGRhdGEgYmVpbmcgcHJpdmF0aXplZAorIEBwYXJhbSBjdG9yICBwb2ludGVyIHRvIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciBkYXRhCisgQHBhcmFtIGNjdG9yICBwb2ludGVyIHRvIGNvcHkgY29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIGRhdGEKKyBAcGFyYW0gZHRvciAgcG9pbnRlciB0byBkZXN0cnVjdG9yIGZ1bmN0aW9uIGZvciBkYXRhCisgQHBhcmFtIHZlY3Rvcl9sZW5ndGggbGVuZ3RoIG9mIHRoZSB2ZWN0b3IgKGJ5dGVzIG9yIGVsZW1lbnRzPykKKyBSZWdpc3RlciB2ZWN0b3IgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBmb3IgdGhyZWFkIHByaXZhdGUgZGF0YS4KKyovCit2b2lkIF9fa21wY190aHJlYWRwcml2YXRlX3JlZ2lzdGVyX3ZlYyhpZGVudF90ICpsb2MsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBjX2N0b3JfdmVjIGN0b3IsIGttcGNfY2N0b3JfdmVjIGNjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wY19kdG9yX3ZlYyBkdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZlY3Rvcl9sZW5ndGgpIHsKKyAgc3RydWN0IHNoYXJlZF9jb21tb24gKmRfdG4sICoqbG5rX3RuOworCisgIEtDX1RSQUNFKDEwLCAoIl9fa21wY190aHJlYWRwcml2YXRlX3JlZ2lzdGVyX3ZlYzogY2FsbGVkXG4iKSk7CisKKyNpZmRlZiBVU0VfQ0hFQ0tTX0NPTU1PTgorICAvKiBjb3B5IGNvbnN0cnVjdG9yIG11c3QgYmUgemVybyBmb3IgY3VycmVudCBjb2RlIGdlbiAoTm92IDIwMDIgLSBqcGgpICovCisgIEtNUF9BU1NFUlQoY2N0b3IgPT0gMCk7CisjZW5kaWYgLyogVVNFX0NIRUNLU19DT01NT04gKi8KKworICBkX3RuID0gX19rbXBfZmluZF9zaGFyZWRfdGFza19jb21tb24oCisgICAgICAmX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlLCAtMSwKKyAgICAgIGRhdGEpOyAvKiBPbmx5IHRoZSBnbG9iYWwgZGF0YSB0YWJsZSBleGlzdHMuICovCisKKyAgaWYgKGRfdG4gPT0gMCkgeworICAgIGRfdG4gPSAoc3RydWN0IHNoYXJlZF9jb21tb24gKilfX2ttcF9hbGxvY2F0ZShzaXplb2Yoc3RydWN0IHNoYXJlZF9jb21tb24pKTsKKyAgICBkX3RuLT5nYmxfYWRkciA9IGRhdGE7CisKKyAgICBkX3RuLT5jdC5jdG9ydiA9IGN0b3I7CisgICAgZF90bi0+Y2N0LmNjdG9ydiA9IGNjdG9yOworICAgIGRfdG4tPmR0LmR0b3J2ID0gZHRvcjsKKyAgICBkX3RuLT5pc192ZWMgPSBUUlVFOworICAgIGRfdG4tPnZlY19sZW4gPSAoc2l6ZV90KXZlY3Rvcl9sZW5ndGg7CisgICAgLyoKKyAgICAgICAgICAgIGRfdG4tPm9ial9pbml0ID0gMDsgIC8vIEFDOiBjb21tZW50ZWQgb3V0IGJlY2F1c2UgX19rbXBfYWxsb2NhdGUKKyAgICAgICB6ZXJvZXMgdGhlIG1lbW9yeQorICAgICAgICAgICAgZF90bi0+cG9kX2luaXQgPSAwOworICAgICovCisgICAgbG5rX3RuID0gJihfX2ttcF90aHJlYWRwcml2YXRlX2RfdGFibGUuZGF0YVtLTVBfSEFTSChkYXRhKV0pOworCisgICAgZF90bi0+bmV4dCA9ICpsbmtfdG47CisgICAgKmxua190biA9IGRfdG47CisgIH0KK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF91dGlsaXR5LmNwcCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF91dGlsaXR5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjBkNGE0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3V0aWxpdHkuY3BwCkBAIC0wLDAgKzEsNDA5IEBACisvKgorICoga21wX3V0aWxpdHkuY3BwIC0tIFV0aWxpdHkgcm91dGluZXMgZm9yIHRoZSBPcGVuTVAgc3VwcG9ydCBsaWJyYXJ5LgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisjaW5jbHVkZSAia21wX3dyYXBwZXJfZ2V0cGlkLmgiCisjaW5jbHVkZSA8ZmxvYXQuaD4KKworc3RhdGljIGNvbnN0IGNoYXIgKnVua25vd24gPSAidW5rbm93biI7CisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKy8qIE5PVEU6IElmIGNhbGxlZCBiZWZvcmUgc2VyaWFsX2luaXRpYWxpemUgKGkuZS4gZnJvbSBydW50aW1lX2luaXRpYWxpemUpLCB0aGVuCisgICB0aGUgZGVidWdnaW5nIHBhY2thZ2UgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldCwgYW5kIG9ubHkgIjAiIHdpbGwgcHJpbnQKKyAgIGRlYnVnZ2luZyBvdXRwdXQgc2luY2UgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBoYXZlIG5vdCBiZWVuIHJlYWQuICovCisKKyNpZmRlZiBLTVBfREVCVUcKK3N0YXRpYyBpbnQgdHJhY2VfbGV2ZWwgPSA1OworI2VuZGlmCisKKy8qIExPR19JRF9CSVRTICA9ICggMSArIGZsb29yKCBsb2dfMiggbWF4KCBsb2dfcGVyX3BoeSAtIDEsIDEgKSkpKQorICogQVBJQ19JRCAgICAgID0gKFBIWV9JRCA8PCBMT0dfSURfQklUUykgfCBMT0dfSUQKKyAqIFBIWV9JRCAgICAgICA9IEFQSUNfSUQgPj4gTE9HX0lEX0JJVFMKKyAqLworaW50IF9fa21wX2dldF9waHlzaWNhbF9pZChpbnQgbG9nX3Blcl9waHksIGludCBhcGljX2lkKSB7CisgIGludCBpbmRleF9sc2IsIGluZGV4X21zYiwgdGVtcDsKKworICBpZiAobG9nX3Blcl9waHkgPiAxKSB7CisgICAgaW5kZXhfbHNiID0gMDsKKyAgICBpbmRleF9tc2IgPSAzMTsKKworICAgIHRlbXAgPSBsb2dfcGVyX3BoeTsKKyAgICB3aGlsZSAoKHRlbXAgJiAxKSA9PSAwKSB7CisgICAgICB0ZW1wID4+PSAxOworICAgICAgaW5kZXhfbHNiKys7CisgICAgfQorCisgICAgdGVtcCA9IGxvZ19wZXJfcGh5OworICAgIHdoaWxlICgodGVtcCAmIDB4ODAwMDAwMDApID09IDApIHsKKyAgICAgIHRlbXAgPDw9IDE7CisgICAgICBpbmRleF9tc2ItLTsKKyAgICB9CisKKyAgICAvKiBJZiA+MSBiaXRzIHdlcmUgc2V0IGluIGxvZ19wZXJfcGh5LCBjaG9vc2UgbmV4dCBoaWdoZXIgcG93ZXIgb2YgMiAqLworICAgIGlmIChpbmRleF9sc2IgIT0gaW5kZXhfbXNiKQorICAgICAgaW5kZXhfbXNiKys7CisKKyAgICByZXR1cm4gKChpbnQpKGFwaWNfaWQgPj4gaW5kZXhfbXNiKSk7CisgIH0KKworICByZXR1cm4gYXBpY19pZDsKK30KKworLyoKKyAqIExPR19JRF9CSVRTICA9ICggMSArIGZsb29yKCBsb2dfMiggbWF4KCBsb2dfcGVyX3BoeSAtIDEsIDEgKSkpKQorICogQVBJQ19JRCAgICAgID0gKFBIWV9JRCA8PCBMT0dfSURfQklUUykgfCBMT0dfSUQKKyAqIExPR19JRCAgICAgICA9IEFQSUNfSUQgJiAoKCAxIDw8IExPR19JRF9CSVRTICkgLSAxICkKKyAqLworaW50IF9fa21wX2dldF9sb2dpY2FsX2lkKGludCBsb2dfcGVyX3BoeSwgaW50IGFwaWNfaWQpIHsKKyAgdW5zaWduZWQgY3VycmVudF9iaXQ7CisgIGludCBiaXRzX3NlZW47CisKKyAgaWYgKGxvZ19wZXJfcGh5IDw9IDEpCisgICAgcmV0dXJuICgwKTsKKworICBiaXRzX3NlZW4gPSAwOworCisgIGZvciAoY3VycmVudF9iaXQgPSAxOyBsb2dfcGVyX3BoeSAhPSAwOyBjdXJyZW50X2JpdCA8PD0gMSkgeworICAgIGlmIChsb2dfcGVyX3BoeSAmIGN1cnJlbnRfYml0KSB7CisgICAgICBsb2dfcGVyX3BoeSAmPSB+Y3VycmVudF9iaXQ7CisgICAgICBiaXRzX3NlZW4rKzsKKyAgICB9CisgIH0KKworICAvKiBJZiBleGFjdGx5IDEgYml0IHdhcyBzZXQgaW4gbG9nX3Blcl9waHksIGNob29zZSBuZXh0IGxvd2VyIHBvd2VyIG9mIDIgKi8KKyAgaWYgKGJpdHNfc2VlbiA9PSAxKSB7CisgICAgY3VycmVudF9iaXQgPj49IDE7CisgIH0KKworICByZXR1cm4gKChpbnQpKChjdXJyZW50X2JpdCAtIDEpICYgYXBpY19pZCkpOworfQorCitzdGF0aWMga21wX3VpbnQ2NCBfX2ttcF9wYXJzZV9mcmVxdWVuY3koIC8vIFI6IEZyZXF1ZW5jeSBpbiBIei4KKyAgICBjaGFyIGNvbnN0ICpmcmVxdWVuY3kgLy8gSTogRmxvYXQgbnVtYmVyIGFuZCB1bml0OiBNSHosIEdIeiwgb3IgVEd6LgorICAgICkgeworCisgIGRvdWJsZSB2YWx1ZSA9IDAuMDsKKyAgY2hhciBjb25zdCAqdW5pdCA9IE5VTEw7CisgIGttcF91aW50NjQgcmVzdWx0ID0gMDsgLyogWmVybyBpcyBhIGJldHRlciB1bmtub3duIHZhbHVlIHRoYW4gYWxsIG9uZXMuICovCisKKyAgaWYgKGZyZXF1ZW5jeSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfTsgLy8gaWYKKyAgdmFsdWUgPSBzdHJ0b2QoZnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICBDQ0FTVChjaGFyICoqLCAmdW5pdCkpOyAvLyBzdHJ0b2QoKSBkb2VzIG5vdCBsaWtlICJjb25zdCIKKyAgaWYgKDAgPCB2YWx1ZSAmJgorICAgICAgdmFsdWUgPD0gREJMX01BWCkgeyAvLyBHb29kIHZhbHVlIChub3Qgb3ZlcmZsb3csIHVuZGVyZmxvdywgZXRjKS4KKyAgICBpZiAoc3RyY21wKHVuaXQsICJNSHoiKSA9PSAwKSB7CisgICAgICB2YWx1ZSA9IHZhbHVlICogMS4wRSs2OworICAgIH0gZWxzZSBpZiAoc3RyY21wKHVuaXQsICJHSHoiKSA9PSAwKSB7CisgICAgICB2YWx1ZSA9IHZhbHVlICogMS4wRSs5OworICAgIH0gZWxzZSBpZiAoc3RyY21wKHVuaXQsICJUSHoiKSA9PSAwKSB7CisgICAgICB2YWx1ZSA9IHZhbHVlICogMS4wRSsxMjsKKyAgICB9IGVsc2UgeyAvLyBXcm9uZyB1bml0LgorICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9OyAvLyBpZgorICAgIHJlc3VsdCA9IHZhbHVlOworICB9OyAvLyBpZgorICByZXR1cm4gcmVzdWx0OworCit9OyAvLyBmdW5jIF9fa21wX3BhcnNlX2NwdV9mcmVxdWVuY3kKKwordm9pZCBfX2ttcF9xdWVyeV9jcHVpZChrbXBfY3B1aW5mb190ICpwKSB7CisgIHN0cnVjdCBrbXBfY3B1aWQgYnVmOworICBpbnQgbWF4X2FyZzsKKyAgaW50IGxvZ19wZXJfcGh5OworI2lmZGVmIEtNUF9ERUJVRworICBpbnQgY2ZsdXNoX3NpemU7CisjZW5kaWYKKworICBwLT5pbml0aWFsaXplZCA9IDE7CisKKyAgcC0+c3NlMiA9IDE7IC8vIEFzc3VtZSBTU0UyIGJ5IGRlZmF1bHQuCisKKyAgX19rbXBfeDg2X2NwdWlkKDAsIDAsICZidWYpOworCisgIEtBX1RSQUNFKHRyYWNlX2xldmVsLAorICAgICAgICAgICAoIklORk86IENQVUlEICVkOiBFQVg9MHglMDhYIEVCWD0weCUwOFggRUNYPTB4JTA4WCBFRFg9MHglMDhYXG4iLCAwLAorICAgICAgICAgICAgYnVmLmVheCwgYnVmLmVieCwgYnVmLmVjeCwgYnVmLmVkeCkpOworCisgIG1heF9hcmcgPSBidWYuZWF4OworCisgIHAtPmFwaWNfaWQgPSAtMTsKKworICBpZiAobWF4X2FyZyA+PSAxKSB7CisgICAgaW50IGk7CisgICAga21wX3VpbnQzMiB0LCBkYXRhWzRdOworCisgICAgX19rbXBfeDg2X2NwdWlkKDEsIDAsICZidWYpOworICAgIEtBX1RSQUNFKHRyYWNlX2xldmVsLAorICAgICAgICAgICAgICgiSU5GTzogQ1BVSUQgJWQ6IEVBWD0weCUwOFggRUJYPTB4JTA4WCBFQ1g9MHglMDhYIEVEWD0weCUwOFhcbiIsCisgICAgICAgICAgICAgIDEsIGJ1Zi5lYXgsIGJ1Zi5lYngsIGJ1Zi5lY3gsIGJ1Zi5lZHgpKTsKKworICAgIHsKKyNkZWZpbmUgZ2V0X3ZhbHVlKHJlZywgbG8sIG1hc2spICgoKHJlZykgPj4gKGxvKSkgJiAobWFzaykpCisKKyAgICAgIHAtPnNpZ25hdHVyZSA9IGJ1Zi5lYXg7CisgICAgICBwLT5mYW1pbHkgPSBnZXRfdmFsdWUoYnVmLmVheCwgMjAsIDB4ZmYpICsgZ2V0X3ZhbHVlKGJ1Zi5lYXgsIDgsIDB4MGYpOworICAgICAgcC0+bW9kZWwgPQorICAgICAgICAgIChnZXRfdmFsdWUoYnVmLmVheCwgMTYsIDB4MGYpIDw8IDQpICsgZ2V0X3ZhbHVlKGJ1Zi5lYXgsIDQsIDB4MGYpOworICAgICAgcC0+c3RlcHBpbmcgPSBnZXRfdmFsdWUoYnVmLmVheCwgMCwgMHgwZik7CisKKyN1bmRlZiBnZXRfdmFsdWUKKworICAgICAgS0FfVFJBQ0UodHJhY2VfbGV2ZWwsICgiIGZhbWlseSA9ICVkLCBtb2RlbCA9ICVkLCBzdGVwcGluZyA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5mYW1pbHksIHAtPm1vZGVsLCBwLT5zdGVwcGluZykpOworICAgIH0KKworICAgIGZvciAodCA9IGJ1Zi5lYngsIGkgPSAwOyBpIDwgNDsgdCA+Pj0gOCwgKytpKSB7CisgICAgICBkYXRhW2ldID0gKHQgJiAweGZmKTsKKyAgICB9OyAvLyBmb3IKKworICAgIHAtPnNzZTIgPSAoYnVmLmVkeCA+PiAyNikgJiAxOworCisjaWZkZWYgS01QX0RFQlVHCisKKyAgICBpZiAoKGJ1Zi5lZHggPj4gNCkgJiAxKSB7CisgICAgICAvKiBUU0MgLSBUaW1lc3RhbXAgQ291bnRlciBBdmFpbGFibGUgKi8KKyAgICAgIEtBX1RSQUNFKHRyYWNlX2xldmVsLCAoIiBUU0MiKSk7CisgICAgfQorICAgIGlmICgoYnVmLmVkeCA+PiA4KSAmIDEpIHsKKyAgICAgIC8qIENYOCAtIENNUFhDSEc4QiBJbnN0cnVjdGlvbiBBdmFpbGFibGUgKi8KKyAgICAgIEtBX1RSQUNFKHRyYWNlX2xldmVsLCAoIiBDWDgiKSk7CisgICAgfQorICAgIGlmICgoYnVmLmVkeCA+PiA5KSAmIDEpIHsKKyAgICAgIC8qIEFQSUMgLSBMb2NhbCBBUElDIFByZXNlbnQgKG11bHRpLXByb2Nlc3NvciBvcGVyYXRpb24gc3VwcG9ydCAqLworICAgICAgS0FfVFJBQ0UodHJhY2VfbGV2ZWwsICgiIEFQSUMiKSk7CisgICAgfQorICAgIGlmICgoYnVmLmVkeCA+PiAxNSkgJiAxKSB7CisgICAgICAvKiBDTU9WIC0gQ29uZGl0aW9uYWwgTU9WZSBJbnN0cnVjdGlvbiBBdmFpbGFibGUgKi8KKyAgICAgIEtBX1RSQUNFKHRyYWNlX2xldmVsLCAoIiBDTU9WIikpOworICAgIH0KKyAgICBpZiAoKGJ1Zi5lZHggPj4gMTgpICYgMSkgeworICAgICAgLyogUFNOIC0gUHJvY2Vzc29yIFNlcmlhbCBOdW1iZXIgQXZhaWxhYmxlICovCisgICAgICBLQV9UUkFDRSh0cmFjZV9sZXZlbCwgKCIgUFNOIikpOworICAgIH0KKyAgICBpZiAoKGJ1Zi5lZHggPj4gMTkpICYgMSkgeworICAgICAgLyogQ0xGVUxTSCAtIENhY2hlIEZsdXNoIEluc3RydWN0aW9uIEF2YWlsYWJsZSAqLworICAgICAgY2ZsdXNoX3NpemUgPQorICAgICAgICAgIGRhdGFbMV0gKiA4OyAvKiBCaXRzIDE1LTA4OiBDTEZMVVNIIGxpbmUgc2l6ZSA9IDggKDY0IGJ5dGVzKSAqLworICAgICAgS0FfVFJBQ0UodHJhY2VfbGV2ZWwsICgiIENMRkxVU0goJWRiKSIsIGNmbHVzaF9zaXplKSk7CisgICAgfQorICAgIGlmICgoYnVmLmVkeCA+PiAyMSkgJiAxKSB7CisgICAgICAvKiBEVEVTIC0gRGVidWcgVHJhY2UgJiBFTU9OIFN0b3JlICovCisgICAgICBLQV9UUkFDRSh0cmFjZV9sZXZlbCwgKCIgRFRFUyIpKTsKKyAgICB9CisgICAgaWYgKChidWYuZWR4ID4+IDIyKSAmIDEpIHsKKyAgICAgIC8qIEFDUEkgLSBBQ1BJIFN1cHBvcnQgQXZhaWxhYmxlICovCisgICAgICBLQV9UUkFDRSh0cmFjZV9sZXZlbCwgKCIgQUNQSSIpKTsKKyAgICB9CisgICAgaWYgKChidWYuZWR4ID4+IDIzKSAmIDEpIHsKKyAgICAgIC8qIE1NWCAtIE11bHRpbWVkaWEgRXh0ZW5zaW9ucyAqLworICAgICAgS0FfVFJBQ0UodHJhY2VfbGV2ZWwsICgiIE1NWCIpKTsKKyAgICB9CisgICAgaWYgKChidWYuZWR4ID4+IDI1KSAmIDEpIHsKKyAgICAgIC8qIFNTRSAtIFNTRSBJbnN0cnVjdGlvbnMgKi8KKyAgICAgIEtBX1RSQUNFKHRyYWNlX2xldmVsLCAoIiBTU0UiKSk7CisgICAgfQorICAgIGlmICgoYnVmLmVkeCA+PiAyNikgJiAxKSB7CisgICAgICAvKiBTU0UyIC0gU1NFMiBJbnN0cnVjdGlvbnMgKi8KKyAgICAgIEtBX1RSQUNFKHRyYWNlX2xldmVsLCAoIiBTU0UyIikpOworICAgIH0KKyAgICBpZiAoKGJ1Zi5lZHggPj4gMjcpICYgMSkgeworICAgICAgLyogU0xGU05QIC0gU2VsZi1Tbm9vcGluZyBDYWNoZSAqLworICAgICAgS0FfVFJBQ0UodHJhY2VfbGV2ZWwsICgiIFNMRlNOUCIpKTsKKyAgICB9CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKyAgICBpZiAoKGJ1Zi5lZHggPj4gMjgpICYgMSkgeworICAgICAgLyogQml0cyAyMy0xNjogTG9naWNhbCBQcm9jZXNzb3JzIHBlciBQaHlzaWNhbCBQcm9jZXNzb3IgKDEgZm9yIFA0KSAqLworICAgICAgbG9nX3Blcl9waHkgPSBkYXRhWzJdOworICAgICAgcC0+YXBpY19pZCA9IGRhdGFbM107IC8qIEJpdHMgMzEtMjQ6IFByb2Nlc3NvciBJbml0aWFsIEFQSUMgSUQgKFgpICovCisgICAgICBLQV9UUkFDRSh0cmFjZV9sZXZlbCwgKCIgSFQoJWQgVFBVcykiLCBsb2dfcGVyX3BoeSkpOworCisgICAgICBpZiAobG9nX3Blcl9waHkgPiAxKSB7CisvKiBkZWZhdWx0IHRvIDFrIEZPUiBKVC1lbmFibGVkIHByb2Nlc3NvcnMgKDRrIG9uIE9TIFgqKSAqLworI2lmIEtNUF9PU19EQVJXSU4KKyAgICAgICAgcC0+Y3B1X3N0YWNrb2Zmc2V0ID0gNCAqIDEwMjQ7CisjZWxzZQorICAgICAgICBwLT5jcHVfc3RhY2tvZmZzZXQgPSAxICogMTAyNDsKKyNlbmRpZgorICAgICAgfQorCisgICAgICBwLT5waHlzaWNhbF9pZCA9IF9fa21wX2dldF9waHlzaWNhbF9pZChsb2dfcGVyX3BoeSwgcC0+YXBpY19pZCk7CisgICAgICBwLT5sb2dpY2FsX2lkID0gX19rbXBfZ2V0X2xvZ2ljYWxfaWQobG9nX3Blcl9waHksIHAtPmFwaWNfaWQpOworICAgIH0KKyNpZmRlZiBLTVBfREVCVUcKKyAgICBpZiAoKGJ1Zi5lZHggPj4gMjkpICYgMSkgeworICAgICAgLyogQVRIUk9UTCAtIEF1dG9tYXRpYyBUaHJvdHRsZSBDb250cm9sICovCisgICAgICBLQV9UUkFDRSh0cmFjZV9sZXZlbCwgKCIgQVRIUk9UTCIpKTsKKyAgICB9CisgICAgS0FfVFJBQ0UodHJhY2VfbGV2ZWwsICgiIF1cbiIpKTsKKworICAgIGZvciAoaSA9IDI7IGkgPD0gbWF4X2FyZzsgKytpKSB7CisgICAgICBfX2ttcF94ODZfY3B1aWQoaSwgMCwgJmJ1Zik7CisgICAgICBLQV9UUkFDRSh0cmFjZV9sZXZlbCwKKyAgICAgICAgICAgICAgICgiSU5GTzogQ1BVSUQgJWQ6IEVBWD0weCUwOFggRUJYPTB4JTA4WCBFQ1g9MHglMDhYIEVEWD0weCUwOFhcbiIsCisgICAgICAgICAgICAgICAgaSwgYnVmLmVheCwgYnVmLmVieCwgYnVmLmVjeCwgYnVmLmVkeCkpOworICAgIH0KKyNlbmRpZgorI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyAgICBwLT5ydG0gPSAwOworICAgIGlmIChtYXhfYXJnID4gNykgeworICAgICAgLyogUlRNIGJpdCBDUFVJRC4wNzpFQlgsIGJpdCAxMSAqLworICAgICAgX19rbXBfeDg2X2NwdWlkKDcsIDAsICZidWYpOworICAgICAgcC0+cnRtID0gKGJ1Zi5lYnggPj4gMTEpICYgMTsKKyAgICAgIEtBX1RSQUNFKHRyYWNlX2xldmVsLCAoIiBSVE0iKSk7CisgICAgfQorI2VuZGlmCisgIH07IC8vIGlmCisKKyAgeyAvLyBQYXJzZSBDUFUgYnJhbmQgc3RyaW5nIGZvciBmcmVxdWVuY3ksIHNhdmluZyB0aGUgc3RyaW5nIGZvciBsYXRlci4KKyAgICBpbnQgaTsKKyAgICBrbXBfY3B1aWRfdCAqYmFzZSA9IChrbXBfY3B1aWRfdCAqKSZwLT5uYW1lWzBdOworCisgICAgLy8gR2V0IENQVSBicmFuZCBzdHJpbmcuCisgICAgZm9yIChpID0gMDsgaSA8IDM7ICsraSkgeworICAgICAgX19rbXBfeDg2X2NwdWlkKDB4ODAwMDAwMDIgKyBpLCAwLCBiYXNlICsgaSk7CisgICAgfTsgLy8gZm9yCisgICAgcC0+bmFtZVtzaXplb2YocC0+bmFtZSkgLSAxXSA9IDA7IC8vIEp1c3QgaW4gY2FzZS4gOy0pCisgICAgS0FfVFJBQ0UodHJhY2VfbGV2ZWwsICgiY3B1IGJyYW5kIHN0cmluZzogXCIlc1wiXG4iLCAmcC0+bmFtZVswXSkpOworCisgICAgLy8gUGFyc2UgZnJlcXVlbmN5LgorICAgIHAtPmZyZXF1ZW5jeSA9IF9fa21wX3BhcnNlX2ZyZXF1ZW5jeShzdHJyY2hyKCZwLT5uYW1lWzBdLCAnICcpKTsKKyAgICBLQV9UUkFDRSh0cmFjZV9sZXZlbCwKKyAgICAgICAgICAgICAoImNwdSBmcmVxdWVuY3kgZnJvbSBicmFuZCBzdHJpbmc6ICUiIEtNUF9VSU5UNjRfU1BFQyAiXG4iLAorICAgICAgICAgICAgICBwLT5mcmVxdWVuY3kpKTsKKyAgfQorfQorCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCit2b2lkIF9fa21wX2V4cGFuZF9ob3N0X25hbWUoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgeworICBLTVBfREVCVUdfQVNTRVJUKHNpemUgPj0gc2l6ZW9mKHVua25vd24pKTsKKyNpZiBLTVBfT1NfV0lORE9XUworICB7CisgICAgRFdPUkQgcyA9IHNpemU7CisKKyAgICBpZiAoIUdldENvbXB1dGVyTmFtZUEoYnVmZmVyLCAmcykpCisgICAgICBLTVBfU1RSQ1BZX1MoYnVmZmVyLCBzaXplLCB1bmtub3duKTsKKyAgfQorI2Vsc2UKKyAgYnVmZmVyW3NpemUgLSAyXSA9IDA7CisgIGlmIChnZXRob3N0bmFtZShidWZmZXIsIHNpemUpIHx8IGJ1ZmZlcltzaXplIC0gMl0gIT0gMCkKKyAgICBLTVBfU1RSQ1BZX1MoYnVmZmVyLCBzaXplLCB1bmtub3duKTsKKyNlbmRpZgorfQorCisvKiBFeHBhbmQgdGhlIG1ldGEgY2hhcmFjdGVycyBpbiB0aGUgZmlsZW5hbWU6CisgKiBDdXJyZW50bHkgZGVmaW5lZCBjaGFyYWN0ZXJzIGFyZToKKyAqICVIIHRoZSBob3N0bmFtZQorICogJVAgdGhlIG51bWJlciBvZiB0aHJlYWRzIHVzZWQuCisgKiAlSSB0aGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgcnVuLgorICovCisKK3ZvaWQgX19rbXBfZXhwYW5kX2ZpbGVfbmFtZShjaGFyICpyZXN1bHQsIHNpemVfdCBybGVuLCBjaGFyICpwYXR0ZXJuKSB7CisgIGNoYXIgKnBvcyA9IHJlc3VsdCwgKmVuZCA9IHJlc3VsdCArIHJsZW4gLSAxOworICBjaGFyIGJ1ZmZlclsyNTZdOworICBpbnQgZGVmYXVsdF9jcHVfd2lkdGggPSAxOworICBpbnQgc25wX3Jlc3VsdDsKKworICBLTVBfREVCVUdfQVNTRVJUKHJsZW4gPiAwKTsKKyAgKmVuZCA9IDA7CisgIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSBfX2ttcF94cHJvYzsgaSA+PSAxMDsgaSAvPSAxMCwgKytkZWZhdWx0X2NwdV93aWR0aCkKKyAgICAgIDsKKyAgfQorCisgIGlmIChwYXR0ZXJuICE9IE5VTEwpIHsKKyAgICB3aGlsZSAoKnBhdHRlcm4gIT0gJ1wwJyAmJiBwb3MgPCBlbmQpIHsKKyAgICAgIGlmICgqcGF0dGVybiAhPSAnJScpIHsKKyAgICAgICAgKnBvcysrID0gKnBhdHRlcm4rKzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNoYXIgKm9sZF9wYXR0ZXJuID0gcGF0dGVybjsKKyAgICAgICAgaW50IHdpZHRoID0gMTsKKyAgICAgICAgaW50IGNwdV93aWR0aCA9IGRlZmF1bHRfY3B1X3dpZHRoOworCisgICAgICAgICsrcGF0dGVybjsKKworICAgICAgICBpZiAoKnBhdHRlcm4gPj0gJzAnICYmICpwYXR0ZXJuIDw9ICc5JykgeworICAgICAgICAgIHdpZHRoID0gMDsKKyAgICAgICAgICBkbyB7CisgICAgICAgICAgICB3aWR0aCA9ICh3aWR0aCAqIDEwKSArICpwYXR0ZXJuKysgLSAnMCc7CisgICAgICAgICAgfSB3aGlsZSAoKnBhdHRlcm4gPj0gJzAnICYmICpwYXR0ZXJuIDw9ICc5Jyk7CisgICAgICAgICAgaWYgKHdpZHRoIDwgMCB8fCB3aWR0aCA+IDEwMjQpCisgICAgICAgICAgICB3aWR0aCA9IDE7CisKKyAgICAgICAgICBjcHVfd2lkdGggPSB3aWR0aDsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoKnBhdHRlcm4pIHsKKyAgICAgICAgY2FzZSAnSCc6CisgICAgICAgIGNhc2UgJ2gnOiB7CisgICAgICAgICAgX19rbXBfZXhwYW5kX2hvc3RfbmFtZShidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKyAgICAgICAgICBLTVBfU1RSTkNQWShwb3MsIGJ1ZmZlciwgZW5kIC0gcG9zICsgMSk7CisgICAgICAgICAgaWYgKCplbmQgPT0gMCkgeworICAgICAgICAgICAgd2hpbGUgKCpwb3MpCisgICAgICAgICAgICAgICsrcG9zOworICAgICAgICAgICAgKytwYXR0ZXJuOworICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcG9zID0gZW5kOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlICdQJzoKKyAgICAgICAgY2FzZSAncCc6IHsKKyAgICAgICAgICBzbnBfcmVzdWx0ID0gS01QX1NOUFJJTlRGKHBvcywgZW5kIC0gcG9zICsgMSwgIiUwKmQiLCBjcHVfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoKTsKKyAgICAgICAgICBpZiAoc25wX3Jlc3VsdCA+PSAwICYmIHNucF9yZXN1bHQgPD0gZW5kIC0gcG9zKSB7CisgICAgICAgICAgICB3aGlsZSAoKnBvcykKKyAgICAgICAgICAgICAgKytwb3M7CisgICAgICAgICAgICArK3BhdHRlcm47CisgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBwb3MgPSBlbmQ7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgJ0knOgorICAgICAgICBjYXNlICdpJzogeworICAgICAgICAgIHBpZF90IGlkID0gZ2V0cGlkKCk7CisgICAgICAgICAgc25wX3Jlc3VsdCA9IEtNUF9TTlBSSU5URihwb3MsIGVuZCAtIHBvcyArIDEsICIlMCpkIiwgd2lkdGgsIGlkKTsKKyAgICAgICAgICBpZiAoc25wX3Jlc3VsdCA+PSAwICYmIHNucF9yZXN1bHQgPD0gZW5kIC0gcG9zKSB7CisgICAgICAgICAgICB3aGlsZSAoKnBvcykKKyAgICAgICAgICAgICAgKytwb3M7CisgICAgICAgICAgICArK3BhdHRlcm47CisgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBwb3MgPSBlbmQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSAnJSc6IHsKKyAgICAgICAgICAqcG9zKysgPSAnJSc7CisgICAgICAgICAgKytwYXR0ZXJuOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAqcG9zKysgPSAnJSc7CisgICAgICAgICAgcGF0dGVybiA9IG9sZF9wYXR0ZXJuICsgMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIC8qIFRPRE86IEhvdyBkbyB3ZSBnZXQgcmlkIG9mIHRoaXM/ICovCisgICAgaWYgKCpwYXR0ZXJuICE9ICdcMCcpCisgICAgICBLTVBfRkFUQUwoRmlsZU5hbWVUb29Mb25nKTsKKyAgfQorCisgICpwb3MgPSAnXDAnOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3ZlcnNpb24uY3BwIGIvZmluYWwvcnVudGltZS9zcmMva21wX3ZlcnNpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NzIwZTUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfdmVyc2lvbi5jcHAKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgKiBrbXBfdmVyc2lvbi5jcHAKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pby5oIgorI2luY2x1ZGUgImttcF92ZXJzaW9uLmgiCisKKy8vIFJlcGxhY2Ugd2l0aCBzbmFwc2hvdCBkYXRlIFlZWVlNTUREIGZvciBwcm9tb3Rpb24gYnVpbGQuCisjZGVmaW5lIEtNUF9WRVJTSU9OX0JVSUxEIDIwMTQwOTI2CisKKy8vIEhlbHBlciBtYWNyb3MgdG8gY29udmVydCB2YWx1ZSBvZiBtYWNybyB0byBzdHJpbmcgbGl0ZXJhbC4KKyNkZWZpbmUgX3N0cmluZ2VyKHgpICN4CisjZGVmaW5lIHN0cmluZ2VyKHgpIF9zdHJpbmdlcih4KQorCisvLyBEZXRlY3QgY29tcGlsZXIuCisjaWYgS01QX0NPTVBJTEVSX0lDQworI2lmIF9fSU5URUxfQ09NUElMRVIgPT0gMTAxMAorI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciAxMC4xIgorI2VsaWYgX19JTlRFTF9DT01QSUxFUiA9PSAxMTAwCisjZGVmaW5lIEtNUF9DT01QSUxFUiAiSW50ZWwgQysrIENvbXBpbGVyIDExLjAiCisjZWxpZiBfX0lOVEVMX0NPTVBJTEVSID09IDExMTAKKyNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgMTEuMSIKKyNlbGlmIF9fSU5URUxfQ09NUElMRVIgPT0gMTIwMAorI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciAxMi4wIgorI2VsaWYgX19JTlRFTF9DT01QSUxFUiA9PSAxMjEwCisjZGVmaW5lIEtNUF9DT01QSUxFUiAiSW50ZWwgQysrIENvbXBpbGVyIDEyLjEiCisjZWxpZiBfX0lOVEVMX0NPTVBJTEVSID09IDEzMDAKKyNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgMTMuMCIKKyNlbGlmIF9fSU5URUxfQ09NUElMRVIgPT0gMTMxMAorI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciAxMy4xIgorI2VsaWYgX19JTlRFTF9DT01QSUxFUiA9PSAxNDAwCisjZGVmaW5lIEtNUF9DT01QSUxFUiAiSW50ZWwgQysrIENvbXBpbGVyIDE0LjAiCisjZWxpZiBfX0lOVEVMX0NPTVBJTEVSID09IDE0MTAKKyNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgMTQuMSIKKyNlbGlmIF9fSU5URUxfQ09NUElMRVIgPT0gMTUwMAorI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciAxNS4wIgorI2VsaWYgX19JTlRFTF9DT01QSUxFUiA9PSAxNjAwCisjZGVmaW5lIEtNUF9DT01QSUxFUiAiSW50ZWwgQysrIENvbXBpbGVyIDE2LjAiCisjZWxpZiBfX0lOVEVMX0NPTVBJTEVSID09IDE3MDAKKyNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgMTcuMCIKKyNlbGlmIF9fSU5URUxfQ09NUElMRVIgPT0gOTk5OAorI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciBtYWlubGluZSIKKyNlbGlmIF9fSU5URUxfQ09NUElMRVIgPT0gOTk5OQorI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciBtYWlubGluZSIKKyNlbmRpZgorI2VsaWYgS01QX0NPTVBJTEVSX0NMQU5HCisjZGVmaW5lIEtNUF9DT01QSUxFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiQ2xhbmcgIiBzdHJpbmdlcihfX2NsYW5nX21ham9yX18pICIuIiBzdHJpbmdlcihfX2NsYW5nX21pbm9yX18pCisjZWxpZiBLTVBfQ09NUElMRVJfR0NDCisjZGVmaW5lIEtNUF9DT01QSUxFUiAiR0NDICIgc3RyaW5nZXIoX19HTlVDX18pICIuIiBzdHJpbmdlcihfX0dOVUNfTUlOT1JfXykKKyNlbGlmIEtNUF9DT01QSUxFUl9NU1ZDCisjZGVmaW5lIEtNUF9DT01QSUxFUiAiTVNWQyAiIHN0cmluZ2VyKF9NU0NfRlVMTF9WRVIpCisjZW5kaWYKKyNpZm5kZWYgS01QX0NPTVBJTEVSCisjd2FybmluZyAiVW5rbm93biBjb21waWxlciIKKyNkZWZpbmUgS01QX0NPTVBJTEVSICJ1bmtub3duIGNvbXBpbGVyIgorI2VuZGlmCisKKy8vIERldGVjdCBsaWJycmF5IHR5cGUgKHBlcmYsIHN0dWIpLgorI2lmZGVmIEtNUF9TVFVCCisjZGVmaW5lIEtNUF9MSUJfVFlQRSAic3R1YiIKKyNlbHNlCisjZGVmaW5lIEtNUF9MSUJfVFlQRSAicGVyZm9ybWFuY2UiCisjZW5kaWYgLy8gS01QX0xJQl9UWVBFCisKKy8vIERldGVjdCBsaW5rIHR5cGUgKHN0YXRpYywgZHluYW1pYykuCisjaWZkZWYgS01QX0RZTkFNSUNfTElCCisjZGVmaW5lIEtNUF9MSU5LX1RZUEUgImR5bmFtaWMiCisjZWxzZQorI2RlZmluZSBLTVBfTElOS19UWVBFICJzdGF0aWMiCisjZW5kaWYgLy8gS01QX0xJTktfVFlQRQorCisvLyBGaW5hbGx5LCBkZWZpbmUgc3RyaW5ncy4KKyNkZWZpbmUgS01QX0xJQlJBUlkgS01QX0xJQl9UWVBFICIgbGlicmFyeSAoIiBLTVBfTElOS19UWVBFICIpIgorI2RlZmluZSBLTVBfQ09QWVJJR0hUICIiCisKK2ludCBjb25zdCBfX2ttcF92ZXJzaW9uX21ham9yID0gS01QX1ZFUlNJT05fTUFKT1I7CitpbnQgY29uc3QgX19rbXBfdmVyc2lvbl9taW5vciA9IEtNUF9WRVJTSU9OX01JTk9SOworaW50IGNvbnN0IF9fa21wX3ZlcnNpb25fYnVpbGQgPSBLTVBfVkVSU0lPTl9CVUlMRDsKK2ludCBjb25zdCBfX2ttcF9vcGVubXBfdmVyc2lvbiA9CisjaWYgT01QXzUwX0VOQUJMRUQKKyAgICAyMDE2MTE7CisjZWxpZiBPTVBfNDVfRU5BQkxFRAorICAgIDIwMTUxMTsKKyNlbGlmIE9NUF80MF9FTkFCTEVECisgICAgMjAxMzA3OworI2Vsc2UKKyAgICAyMDExMDc7CisjZW5kaWYKKworLyogRG8gTk9UIGNoYW5nZSB0aGUgZm9ybWF0IG9mIHRoaXMgc3RyaW5nISAgSW50ZWwoUikgVGhyZWFkIFByb2ZpbGVyIGNoZWNrcyBmb3IKKyAgIGEgc3BlY2lmaWMgZm9ybWF0IHNvbWUgY2hhbmdlcyBpbiB0aGUgcmVjb2duaXRpb24gcm91dGluZSB0aGVyZSBuZWVkIHRvIGJlCisgICBtYWRlIGJlZm9yZSB0aGlzIGlzIGNoYW5nZWQuICovCitjaGFyIGNvbnN0IF9fa21wX2NvcHlyaWdodFtdID0gS01QX1ZFUlNJT05fUFJFRklYIEtNUF9MSUJSQVJZCisgICAgIiB2ZXIuICIgc3RyaW5nZXIoS01QX1ZFUlNJT05fTUFKT1IpICIuIiBzdHJpbmdlcigKKyAgICAgICAgS01QX1ZFUlNJT05fTUlOT1IpICIuIiBzdHJpbmdlcihLTVBfVkVSU0lPTl9CVUlMRCkgIiAiIEtNUF9DT1BZUklHSFQ7CisKK2NoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9jb3B5cmlnaHRbXSA9IEtNUF9WRVJTSU9OX1BSRUZJWCBLTVBfQ09QWVJJR0hUOworY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2xpYl92ZXJbXSA9CisgICAgS01QX1ZFUlNJT05fUFJFRklYICJ2ZXJzaW9uOiAiIHN0cmluZ2VyKEtNUF9WRVJTSU9OX01BSk9SKSAiLiIgc3RyaW5nZXIoCisgICAgICAgIEtNUF9WRVJTSU9OX01JTk9SKSAiLiIgc3RyaW5nZXIoS01QX1ZFUlNJT05fQlVJTEQpOworY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2xpYl90eXBlW10gPQorICAgIEtNUF9WRVJTSU9OX1BSRUZJWCAibGlicmFyeSB0eXBlOiAiIEtNUF9MSUJfVFlQRTsKK2NoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9saW5rX3R5cGVbXSA9CisgICAgS01QX1ZFUlNJT05fUFJFRklYICJsaW5rIHR5cGU6ICIgS01QX0xJTktfVFlQRTsKK2NoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9idWlsZF90aW1lW10gPSBLTVBfVkVSU0lPTl9QUkVGSVggImJ1aWxkIHRpbWU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vX3RpbWVzdGFtcCI7CisjaWYgS01QX01JQzIKK2NoYXIgY29uc3QgX19rbXBfdmVyc2lvbl90YXJnZXRfZW52W10gPQorICAgIEtNUF9WRVJTSU9OX1BSRUZJWCAidGFyZ2V0IGVudmlyb25tZW50OiBNSUMyIjsKKyNlbmRpZgorY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2J1aWxkX2NvbXBpbGVyW10gPQorICAgIEtNUF9WRVJTSU9OX1BSRUZJWCAiYnVpbGQgY29tcGlsZXI6ICIgS01QX0NPTVBJTEVSOworCisvLyBDYWxsZWQgYXQgc2VyaWFsIGluaXRpYWxpemF0aW9uIHRpbWUuCitzdGF0aWMgaW50IF9fa21wX3ZlcnNpb25fMV9wcmludGVkID0gRkFMU0U7CisKK3ZvaWQgX19rbXBfcHJpbnRfdmVyc2lvbl8xKHZvaWQpIHsKKyAgaWYgKF9fa21wX3ZlcnNpb25fMV9wcmludGVkKSB7CisgICAgcmV0dXJuOworICB9OyAvLyBpZgorICBfX2ttcF92ZXJzaW9uXzFfcHJpbnRlZCA9IFRSVUU7CisKKyNpZm5kZWYgS01QX1NUVUIKKyAga21wX3N0cl9idWZfdCBidWZmZXI7CisgIF9fa21wX3N0cl9idWZfaW5pdCgmYnVmZmVyKTsKKyAgLy8gUHJpbnQgdmVyc2lvbiBzdHJpbmdzIHNraXBwaW5nIGluaXRpYWwgbWFnaWMuCisgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZmZlciwgIiVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICZfX2ttcF92ZXJzaW9uX2xpYl92ZXJbS01QX1ZFUlNJT05fTUFHSUNfTEVOXSk7CisgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZmZlciwgIiVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICZfX2ttcF92ZXJzaW9uX2xpYl90eXBlW0tNUF9WRVJTSU9OX01BR0lDX0xFTl0pOworICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWZmZXIsICIlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAmX19rbXBfdmVyc2lvbl9saW5rX3R5cGVbS01QX1ZFUlNJT05fTUFHSUNfTEVOXSk7CisgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZmZlciwgIiVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICZfX2ttcF92ZXJzaW9uX2J1aWxkX3RpbWVbS01QX1ZFUlNJT05fTUFHSUNfTEVOXSk7CisjaWYgS01QX01JQworICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWZmZXIsICIlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAmX19rbXBfdmVyc2lvbl90YXJnZXRfZW52W0tNUF9WRVJTSU9OX01BR0lDX0xFTl0pOworI2VuZGlmCisgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZmZlciwgIiVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICZfX2ttcF92ZXJzaW9uX2J1aWxkX2NvbXBpbGVyW0tNUF9WRVJTSU9OX01BR0lDX0xFTl0pOworI2lmIGRlZmluZWQoS01QX0dPTVBfQ09NUEFUKQorICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWZmZXIsICIlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAmX19rbXBfdmVyc2lvbl9hbHRfY29tcFtLTVBfVkVSU0lPTl9NQUdJQ19MRU5dKTsKKyNlbmRpZiAvKiBkZWZpbmVkKEtNUF9HT01QX0NPTVBBVCkgKi8KKyAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmZmVyLCAiJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgJl9fa21wX3ZlcnNpb25fb21wX2FwaVtLTVBfVkVSU0lPTl9NQUdJQ19MRU5dKTsKKyAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmZmVyLCAiJXNkeW5hbWljIGVycm9yIGNoZWNraW5nOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBLTVBfVkVSU0lPTl9QUkVGX1NUUiwKKyAgICAgICAgICAgICAgICAgICAgICAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrID8gInllcyIgOiAibm8iKSk7CisjaWZkZWYgS01QX0RFQlVHCisgIGZvciAoaW50IGkgPSBic19wbGFpbl9iYXJyaWVyOyBpIDwgYnNfbGFzdF9iYXJyaWVyOyArK2kpIHsKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KAorICAgICAgICAmYnVmZmVyLCAiJXMlcyBiYXJyaWVyIGJyYW5jaCBiaXRzOiBnYXRoZXI9JXUsIHJlbGVhc2U9JXVcbiIsCisgICAgICAgIEtNUF9WRVJTSU9OX1BSRUZfU1RSLCBfX2ttcF9iYXJyaWVyX3R5cGVfbmFtZVtpXSwKKyAgICAgICAgX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHNbaV0sCisgICAgICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1tpXSk7IC8vIF9fa21wX3N0cl9idWZfcHJpbnQKKyAgfTsgLy8gZm9yIGkKKyAgZm9yIChpbnQgaSA9IGJzX3BsYWluX2JhcnJpZXI7IGkgPCBic19sYXN0X2JhcnJpZXI7ICsraSkgeworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoCisgICAgICAgICZidWZmZXIsICIlcyVzIGJhcnJpZXIgcGF0dGVybjogZ2F0aGVyPSVzLCByZWxlYXNlPSVzXG4iLAorICAgICAgICBLTVBfVkVSU0lPTl9QUkVGX1NUUiwgX19rbXBfYmFycmllcl90eXBlX25hbWVbaV0sCisgICAgICAgIF9fa21wX2JhcnJpZXJfcGF0dGVybl9uYW1lW19fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm5baV1dLAorICAgICAgICBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZQorICAgICAgICAgICAgW19fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuW2ldXSk7IC8vIF9fa21wX3N0cl9idWZfcHJpbnQKKyAgfTsgLy8gZm9yIGkKKyAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmZmVyLCAiJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgJl9fa21wX3ZlcnNpb25fbG9ja1tLTVBfVkVSU0lPTl9NQUdJQ19MRU5dKTsKKyNlbmRpZgorICBfX2ttcF9zdHJfYnVmX3ByaW50KAorICAgICAgJmJ1ZmZlciwgIiVzdGhyZWFkIGFmZmluaXR5IHN1cHBvcnQ6ICVzXG4iLCBLTVBfVkVSU0lPTl9QUkVGX1NUUiwKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAoS01QX0FGRklOSVRZX0NBUEFCTEUoKQorICAgICAgICAgICA/IChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUgPyAibm90IHVzZWQiIDogInllcyIpCisgICAgICAgICAgIDogIm5vIikKKyNlbHNlCisgICAgICAibm8iCisjZW5kaWYKKyAgICAgICAgICApOworICBfX2ttcF9wcmludGYoIiVzIiwgYnVmZmVyLnN0cik7CisgIF9fa21wX3N0cl9idWZfZnJlZSgmYnVmZmVyKTsKKyAgS19ESUFHKDEsICgiS01QX1ZFUlNJT04gaXMgdHJ1ZVxuIikpOworI2VuZGlmIC8vIEtNUF9TVFVCCit9IC8vIF9fa21wX3ByaW50X3ZlcnNpb25fMQorCisvLyBDYWxsZWQgYXQgcGFyYWxsZWwgaW5pdGlhbGl6YXRpb24gdGltZS4KK3N0YXRpYyBpbnQgX19rbXBfdmVyc2lvbl8yX3ByaW50ZWQgPSBGQUxTRTsKKwordm9pZCBfX2ttcF9wcmludF92ZXJzaW9uXzIodm9pZCkgeworICBpZiAoX19rbXBfdmVyc2lvbl8yX3ByaW50ZWQpIHsKKyAgICByZXR1cm47CisgIH07IC8vIGlmCisgIF9fa21wX3ZlcnNpb25fMl9wcmludGVkID0gVFJVRTsKK30gLy8gX19rbXBfcHJpbnRfdmVyc2lvbl8yCisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfdmVyc2lvbi5oIGIvZmluYWwvcnVudGltZS9zcmMva21wX3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWU1Mjg3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3ZlcnNpb24uaApAQCAtMCwwICsxLDY5IEBACisvKgorICoga21wX3ZlcnNpb24uaCAtLSB2ZXJzaW9uIG51bWJlciBmb3IgdGhpcyByZWxlYXNlCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX1ZFUlNJT05fSAorI2RlZmluZSBLTVBfVkVSU0lPTl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2lmbmRlZiBLTVBfVkVSU0lPTl9NQUpPUgorI2Vycm9yIEtNUF9WRVJTSU9OX01BSk9SIG1hY3JvIGlzIG5vdCBkZWZpbmVkLgorI2VuZGlmCisjZGVmaW5lIEtNUF9WRVJTSU9OX01JTk9SIDAKKy8qIFVzaW5nICJtYWdpYyIgcHJlZml4IGluIGFsbCB0aGUgdmVyc2lvbiBzdHJpbmdzIGlzIHJhdGhlciBjb252ZW5pZW50IHRvIGdldAorICAgc3RhdGljIHZlcnNpb24gaW5mbyBmcm9tIGJpbmFyaWVzIGJ5IHVzaW5nIHN0YW5kYXJkIHV0aWxpdGllcyAic3RyaW5ncyIgYW5kCisgICAiZ3JlcCIsIGUuIGcuOgorICAgICAgICAkIHN0cmluZ3MgbGlib21wLnNvIHwgZ3JlcCAiQCgjKSIKKyAgIGdpdmVzIGNsZWFuIGxpc3Qgb2YgYWxsIHZlcnNpb24gc3RyaW5ncyBpbiB0aGUgbGlicmFyeS4gTGVhZGluZyB6ZXJvIGhlbHBzCisgICB0byBrZWVwIHZlcnNpb24gc3RyaW5nIHNlcGFyYXRlIGZyb20gcHJpbnRhYmxlIGNoYXJhY3RlcnMgd2hpY2ggbWF5IG9jY3VycworICAganVzdCBiZWZvcmUgdmVyc2lvbiBzdHJpbmcuICovCisjZGVmaW5lIEtNUF9WRVJTSU9OX01BR0lDX1NUUiAiXHgwMEAoIykgIgorI2RlZmluZSBLTVBfVkVSU0lPTl9NQUdJQ19MRU4gNiAvLyBMZW5ndGggb2YgS01QX1ZFUlNJT05fTUFHSUNfU1RSLgorI2RlZmluZSBLTVBfVkVSU0lPTl9QUkVGX1NUUiAiSW50ZWwoUikgT01QICIKKyNkZWZpbmUgS01QX1ZFUlNJT05fUFJFRklYIEtNUF9WRVJTSU9OX01BR0lDX1NUUiBLTVBfVkVSU0lPTl9QUkVGX1NUUgorCisvKiBkZWNsYXJlIGFsbCB0aGUgdmVyc2lvbiBzdHJpbmcgY29uc3RhbnRzIGZvciBLTVBfVkVSU0lPTiBlbnYuIHZhcmlhYmxlICovCitleHRlcm4gaW50IGNvbnN0IF9fa21wX3ZlcnNpb25fbWFqb3I7CitleHRlcm4gaW50IGNvbnN0IF9fa21wX3ZlcnNpb25fbWlub3I7CitleHRlcm4gaW50IGNvbnN0IF9fa21wX3ZlcnNpb25fYnVpbGQ7CitleHRlcm4gaW50IGNvbnN0IF9fa21wX29wZW5tcF92ZXJzaW9uOworZXh0ZXJuIGNoYXIgY29uc3QKKyAgICBfX2ttcF9jb3B5cmlnaHRbXTsgLy8gT2xkIHZhcmlhYmxlLCBrZXB0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggSVRDIGFuZCBJVFAuCitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2NvcHlyaWdodFtdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9saWJfdmVyW107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2xpYl90eXBlW107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2xpbmtfdHlwZVtdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9idWlsZF90aW1lW107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX3RhcmdldF9lbnZbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fYnVpbGRfY29tcGlsZXJbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fYWx0X2NvbXBbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fb21wX2FwaVtdOworLy8gPz8/IGV4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fZGVidWdbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fbG9ja1tdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9uZXN0ZWRfc3RhdHNfcmVwb3J0aW5nW107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2Z0bnN0ZGNhbGxbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fZnRuY2RlY2xbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fZnRuZXh0cmFbXTsKKwordm9pZCBfX2ttcF9wcmludF92ZXJzaW9uXzEodm9pZCk7Cit2b2lkIF9fa21wX3ByaW50X3ZlcnNpb25fMih2b2lkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjZW5kaWYgLyogS01QX1ZFUlNJT05fSCAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3dhaXRfcmVsZWFzZS5jcHAgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfd2FpdF9yZWxlYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGQwOWVmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3dhaXRfcmVsZWFzZS5jcHAKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIGttcF93YWl0X3JlbGVhc2UuY3BwIC0tIFdhaXQvUmVsZWFzZSBpbXBsZW1lbnRhdGlvbgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImttcF93YWl0X3JlbGVhc2UuaCIKKwordm9pZCBfX2ttcF93YWl0XzY0KGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfZmxhZ182NCAqZmxhZywKKyAgICAgICAgICAgICAgICAgICBpbnQgZmluYWxfc3BpbiBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICppdHRfc3luY19vYmopKSB7CisgIF9fa21wX3dhaXRfdGVtcGxhdGUodGhpc190aHIsIGZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgZmluYWxfc3BpbiBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopKTsKK30KKwordm9pZCBfX2ttcF9yZWxlYXNlXzY0KGttcF9mbGFnXzY0ICpmbGFnKSB7IF9fa21wX3JlbGVhc2VfdGVtcGxhdGUoZmxhZyk7IH0KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF93YWl0X3JlbGVhc2UuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF93YWl0X3JlbGVhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWFjMjAyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3dhaXRfcmVsZWFzZS5oCkBAIC0wLDAgKzEsNjg4IEBACisvKgorICoga21wX3dhaXRfcmVsZWFzZS5oIC0tIFdhaXQvUmVsZWFzZSBpbXBsZW1lbnRhdGlvbgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9XQUlUX1JFTEVBU0VfSAorI2RlZmluZSBLTVBfV0FJVF9SRUxFQVNFX0gKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfc3RhdHMuaCIKKworLyohCitAZGVmZ3JvdXAgV0FJVF9SRUxFQVNFIFdhaXQvUmVsZWFzZSBvcGVyYXRpb25zCisKK1RoZSBkZWZpbml0aW9ucyBhbmQgZnVuY3Rpb25zIGhlcmUgaW1wbGVtZW50IHRoZSBsb3dlc3QgbGV2ZWwgdGhyZWFkCitzeW5jaHJvbml6YXRpb25zIG9mIHN1c3BlbmRpbmcgYSB0aHJlYWQgYW5kIGF3YWtpbmcgaXQuIFRoZXkgYXJlIHVzZWQgdG8gYnVpbGQKK2hpZ2hlciBsZXZlbCBvcGVyYXRpb25zIHN1Y2ggYXMgYmFycmllcnMgYW5kIGZvcmsvam9pbi4KKyovCisKKy8qIQorQGluZ3JvdXAgV0FJVF9SRUxFQVNFCitAeworKi8KKworLyohCisgKiBUaGUgZmxhZ190eXBlIGRlc2NyaWJlcyB0aGUgc3RvcmFnZSB1c2VkIGZvciB0aGUgZmxhZy4KKyAqLworZW51bSBmbGFnX3R5cGUgeworICBmbGFnMzIsIC8qKjwgMzIgYml0IGZsYWdzICovCisgIGZsYWc2NCwgLyoqPCA2NCBiaXQgZmxhZ3MgKi8KKyAgZmxhZ19vbmNvcmUgLyoqPCBzcGVjaWFsIDY0LWJpdCBmbGFnIGZvciBvbi1jb3JlIGJhcnJpZXIgKGhpZXJhcmNoaWNhbCkgKi8KK307CisKKy8qIQorICogQmFzZSBjbGFzcyBmb3Igd2FpdC9yZWxlYXNlIHZvbGF0aWxlIGZsYWcKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFA+IGNsYXNzIGttcF9mbGFnIHsKKyAgdm9sYXRpbGUgUAorICAgICAgKmxvYzsgLyoqPCBQb2ludGVyIHRvIHRoZSBmbGFnIHN0b3JhZ2UgdGhhdCBpcyBtb2RpZmllZCBieSBhbm90aGVyIHRocmVhZAorICAgICAgICAgICAgICovCisgIGZsYWdfdHlwZSB0OyAvKio8ICJUeXBlIiBvZiB0aGUgZmxhZyBpbiBsb2MgKi8KK3B1YmxpYzoKKyAgdHlwZWRlZiBQIGZsYWdfdDsKKyAga21wX2ZsYWcodm9sYXRpbGUgUCAqcCwgZmxhZ190eXBlIGZ0KSA6IGxvYyhwKSwgdChmdCkge30KKyAgLyohCisgICAqIEByZXN1bHQgdGhlIHBvaW50ZXIgdG8gdGhlIGFjdHVhbCBmbGFnCisgICAqLworICB2b2xhdGlsZSBQICpnZXQoKSB7IHJldHVybiBsb2M7IH0KKyAgLyohCisgICAqIEBwYXJhbSBuZXdfbG9jIGluICAgc2V0IGxvYyB0byBwb2ludCBhdCBuZXdfbG9jCisgICAqLworICB2b2lkIHNldCh2b2xhdGlsZSBQICpuZXdfbG9jKSB7IGxvYyA9IG5ld19sb2M7IH0KKyAgLyohCisgICAqIEByZXN1bHQgdGhlIGZsYWdfdHlwZQorICAgKi8KKyAgZmxhZ190eXBlIGdldF90eXBlKCkgeyByZXR1cm4gdDsgfQorICAvLyBEZXJpdmVkIGNsYXNzZXMgbXVzdCBwcm92aWRlIHRoZSBmb2xsb3dpbmc6CisgIC8qCisgIGttcF9pbmZvX3QgKiBnZXRfd2FpdGVyKGttcF91aW50MzIgaSk7CisgIGttcF91aW50MzIgZ2V0X251bV93YWl0ZXJzKCk7CisgIGJvb2wgZG9uZV9jaGVjaygpOworICBib29sIGRvbmVfY2hlY2tfdmFsKFAgb2xkX2xvYyk7CisgIGJvb2wgbm90ZG9uZV9jaGVjaygpOworICBQIGludGVybmFsX3JlbGVhc2UoKTsKKyAgdm9pZCBzdXNwZW5kKGludCB0aF9ndGlkKTsKKyAgdm9pZCByZXN1bWUoaW50IHRoX2d0aWQpOworICBQIHNldF9zbGVlcGluZygpOworICBQIHVuc2V0X3NsZWVwaW5nKCk7CisgIGJvb2wgaXNfc2xlZXBpbmcoKTsKKyAgYm9vbCBpc19hbnlfc2xlZXBpbmcoKTsKKyAgYm9vbCBpc19zbGVlcGluZ192YWwoUCBvbGRfbG9jKTsKKyAgaW50IGV4ZWN1dGVfdGFza3Moa21wX2luZm9fdCAqdGhpc190aHIsIGttcF9pbnQzMiBndGlkLCBpbnQgZmluYWxfc3BpbiwKKyAgICAgICAgICAgICAgICAgICAgaW50ICp0aHJlYWRfZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaiksIGttcF9pbnQzMgorICAgICAgICAgICAgICAgICAgICBpc19jb25zdHJhaW5lZCk7CisgICovCit9OworCisvKiBTcGluIHdhaXQgbG9vcCB0aGF0IGZpcnN0IGRvZXMgcGF1c2UsIHRoZW4geWllbGQsIHRoZW4gc2xlZXAuIEEgdGhyZWFkIHRoYXQKKyAgIGNhbGxzIF9fa21wX3dhaXRfKiAgbXVzdCBtYWtlIGNlcnRhaW4gdGhhdCBhbm90aGVyIHRocmVhZCBjYWxscyBfX2ttcF9yZWxlYXNlCisgICB0byB3YWtlIGl0IGJhY2sgdXAgdG8gcHJldmVudCBkZWFkbG9ja3MhICAqLwordGVtcGxhdGUgPGNsYXNzIEM+CitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX3dhaXRfdGVtcGxhdGUoa21wX2luZm9fdCAqdGhpc190aHIsIEMgKmZsYWcsCisgICAgICAgICAgICAgICAgICAgIGludCBmaW5hbF9zcGluIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKml0dF9zeW5jX29iaikpIHsKKyAgLy8gTk9URTogV2UgbWF5IG5vdCBiZWxvbmcgdG8gYSB0ZWFtIGF0IHRoaXMgcG9pbnQuCisgIHZvbGF0aWxlIHR5cGVuYW1lIEM6OmZsYWdfdCAqc3BpbiA9IGZsYWctPmdldCgpOworICBrbXBfdWludDMyIHNwaW5zOworICBrbXBfdWludDMyIGhpYmVybmF0ZTsKKyAgaW50IHRoX2d0aWQ7CisgIGludCB0YXNrc19jb21wbGV0ZWQgPSBGQUxTRTsKKyAgaW50IG92ZXJzdWJzY3JpYmVkOworI2lmICFLTVBfVVNFX01PTklUT1IKKyAga21wX3VpbnQ2NCBwb2xsX2NvdW50OworICBrbXBfdWludDY0IGhpYmVybmF0ZV9nb2FsOworI2VuZGlmCisKKyAgS01QX0ZTWU5DX1NQSU5fSU5JVChzcGluLCBOVUxMKTsKKyAgaWYgKGZsYWctPmRvbmVfY2hlY2soKSkgeworICAgIEtNUF9GU1lOQ19TUElOX0FDUVVJUkVEKENDQVNUKHR5cGVuYW1lIEM6OmZsYWdfdCAqLCBzcGluKSk7CisgICAgcmV0dXJuOworICB9CisgIHRoX2d0aWQgPSB0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc19ndGlkOworICBLQV9UUkFDRSgyMCwKKyAgICAgICAgICAgKCJfX2ttcF93YWl0X3NsZWVwOiBUIyVkIHdhaXRpbmcgZm9yIGZsYWcoJXApXG4iLCB0aF9ndGlkLCBmbGFnKSk7CisjaWYgS01QX1NUQVRTX0VOQUJMRUQKKyAgc3RhdHNfc3RhdGVfZSB0aHJlYWRfc3RhdGUgPSBLTVBfR0VUX1RIUkVBRF9TVEFURSgpOworI2VuZGlmCisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9CTEFNRQorICBvbXB0X3N0YXRlX3Qgb21wdF9zdGF0ZSA9IHRoaXNfdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlOworICBpZiAob21wdF9lbmFibGVkICYmIG9tcHRfc3RhdGUgIT0gb21wdF9zdGF0ZV91bmRlZmluZWQpIHsKKyAgICBpZiAob21wdF9zdGF0ZSA9PSBvbXB0X3N0YXRlX2lkbGUpIHsKKyAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaWRsZV9iZWdpbikpIHsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2lkbGVfYmVnaW4pKHRoX2d0aWQgKyAxKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF93YWl0X2JhcnJpZXJfYmVnaW4pKSB7CisgICAgICBLTVBfREVCVUdfQVNTRVJUKG9tcHRfc3RhdGUgPT0gb21wdF9zdGF0ZV93YWl0X2JhcnJpZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgb21wdF9zdGF0ZSA9PSBvbXB0X3N0YXRlX3dhaXRfYmFycmllcl9pbXBsaWNpdCB8fAorICAgICAgICAgICAgICAgICAgICAgICBvbXB0X3N0YXRlID09IG9tcHRfc3RhdGVfd2FpdF9iYXJyaWVyX2V4cGxpY2l0KTsKKworICAgICAgb21wdF9sd190YXNrdGVhbV90ICp0ZWFtID0KKyAgICAgICAgICB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC5vbXB0X3NlcmlhbGl6ZWRfdGVhbV9pbmZvOworICAgICAgb21wdF9wYXJhbGxlbF9pZF90IHBJZDsKKyAgICAgIG9tcHRfdGFza19pZF90IHRJZDsKKyAgICAgIGlmICh0ZWFtKSB7CisgICAgICAgIHBJZCA9IHRlYW0tPm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkOworICAgICAgICB0SWQgPSB0ZWFtLT5vbXB0X3Rhc2tfaW5mby50YXNrX2lkOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcElkID0gdGhpc190aHItPnRoLnRoX3RlYW0tPnQub21wdF90ZWFtX2luZm8ucGFyYWxsZWxfaWQ7CisgICAgICAgIHRJZCA9IHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPm9tcHRfdGFza19pbmZvLnRhc2tfaWQ7CisgICAgICB9CisgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfd2FpdF9iYXJyaWVyX2JlZ2luKShwSWQsIHRJZCk7CisgICAgfQorICB9CisjZW5kaWYKKworICAvLyBTZXR1cCBmb3Igd2FpdGluZworICBLTVBfSU5JVF9ZSUVMRChzcGlucyk7CisKKyAgaWYgKF9fa21wX2RmbHRfYmxvY2t0aW1lICE9IEtNUF9NQVhfQkxPQ0tUSU1FKSB7CisjaWYgS01QX1VTRV9NT05JVE9SCisvLyBUaGUgd29ya2VyIHRocmVhZHMgY2Fubm90IHJlbHkgb24gdGhlIHRlYW0gc3RydWN0IGV4aXN0aW5nIGF0IHRoaXMgcG9pbnQuCisvLyBVc2UgdGhlIGJ0IHZhbHVlcyBjYWNoZWQgaW4gdGhlIHRocmVhZCBzdHJ1Y3QgaW5zdGVhZC4KKyNpZmRlZiBLTVBfQURKVVNUX0JMT0NLVElNRQorICAgIGlmIChfX2ttcF96ZXJvX2J0ICYmICF0aGlzX3Roci0+dGgudGhfdGVhbV9idF9zZXQpCisgICAgICAvLyBGb3JjZSBpbW1lZGlhdGUgc3VzcGVuZCBpZiBub3Qgc2V0IGJ5IHVzZXIgYW5kIG1vcmUgdGhyZWFkcyB0aGFuCisgICAgICAvLyBhdmFpbGFibGUgcHJvY3MKKyAgICAgIGhpYmVybmF0ZSA9IDA7CisgICAgZWxzZQorICAgICAgaGliZXJuYXRlID0gdGhpc190aHItPnRoLnRoX3RlYW1fYnRfaW50ZXJ2YWxzOworI2Vsc2UKKyAgICBoaWJlcm5hdGUgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9idF9pbnRlcnZhbHM7CisjZW5kaWYgLyogS01QX0FESlVTVF9CTE9DS1RJTUUgKi8KKworICAgIC8qIElmIHRoZSBibG9ja3RpbWUgaXMgbm9uemVybywgd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdCB3ZSBzcGluIHdhaXQgZm9yCisgICAgICAgdGhlIGVudGlyZXR5IG9mIHRoZSBzcGVjaWZpZWQgI2ludGVydmFscywgcGx1cyB1cCB0byBvbmUgaW50ZXJ2YWwgbW9yZS4KKyAgICAgICBUaGlzIGluY3JlbWVudCBtYWtlIGNlcnRhaW4gdGhhdCB0aGlzIHRocmVhZCBkb2Vzbid0IGdvIHRvIHNsZWVwIHRvbworICAgICAgIHNvb24uICAqLworICAgIGlmIChoaWJlcm5hdGUgIT0gMCkKKyAgICAgIGhpYmVybmF0ZSsrOworCisgICAgLy8gQWRkIGluIHRoZSBjdXJyZW50IHRpbWUgdmFsdWUuCisgICAgaGliZXJuYXRlICs9IFRDUl80KF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlKTsKKyAgICBLRl9UUkFDRSgyMCwgKCJfX2ttcF93YWl0X3NsZWVwOiBUIyVkIG5vdz0lZCwgaGliZXJuYXRlPSVkLCBpbnRlcnZhbHM9JWRcbiIsCisgICAgICAgICAgICAgICAgICB0aF9ndGlkLCBfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSwgaGliZXJuYXRlLAorICAgICAgICAgICAgICAgICAgaGliZXJuYXRlIC0gX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUpKTsKKyNlbHNlCisgICAgaGliZXJuYXRlX2dvYWwgPSBLTVBfTk9XKCkgKyB0aGlzX3Roci0+dGgudGhfdGVhbV9idF9pbnRlcnZhbHM7CisgICAgcG9sbF9jb3VudCA9IDA7CisjZW5kaWYgLy8gS01QX1VTRV9NT05JVE9SCisgIH0KKworICBvdmVyc3Vic2NyaWJlZCA9IChUQ1JfNChfX2ttcF9udGgpID4gX19rbXBfYXZhaWxfcHJvYyk7CisgIEtNUF9NQigpOworCisgIC8vIE1haW4gd2FpdCBzcGluIGxvb3AKKyAgd2hpbGUgKGZsYWctPm5vdGRvbmVfY2hlY2soKSkgeworICAgIGludCBpbl9wb29sOworICAgIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtID0gTlVMTDsKKyAgICBpZiAoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyAgICAgIHRhc2tfdGVhbSA9IHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW07CisgICAgICAvKiBJZiB0aGUgdGhyZWFkJ3MgdGFzayB0ZWFtIHBvaW50ZXIgaXMgTlVMTCwgaXQgbWVhbnMgb25lIG9mIDMgdGhpbmdzOgorICAgICAgICAgMSkgQSBuZXdseS1jcmVhdGVkIHRocmVhZCBpcyBmaXJzdCBiZWluZyByZWxlYXNlZCBieQorICAgICAgICAgX19rbXBfZm9ya19iYXJyaWVyKCksIGFuZCBpdHMgdGFzayB0ZWFtIGhhcyBub3QgYmVlbiBzZXQgdXAgeWV0LgorICAgICAgICAgMikgQWxsIHRhc2tzIGhhdmUgYmVlbiBleGVjdXRlZCB0byBjb21wbGV0aW9uLgorICAgICAgICAgMykgVGFza2luZyBpcyBvZmYgZm9yIHRoaXMgcmVnaW9uLiAgVGhpcyBjb3VsZCBiZSBiZWNhdXNlIHdlIGFyZSBpbiBhCisgICAgICAgICBzZXJpYWxpemVkIHJlZ2lvbiAocGVyaGFwcyB0aGUgb3V0ZXIgb25lKSwgb3IgZWxzZSB0YXNraW5nIHdhcyBtYW51YWxseQorICAgICAgICAgZGlzYWJsZWQgKEtNUF9UQVNLSU5HPTApLiAgKi8KKyAgICAgIGlmICh0YXNrX3RlYW0gIT0gTlVMTCkgeworICAgICAgICBpZiAoVENSX1NZTkNfNCh0YXNrX3RlYW0tPnR0LnR0X2FjdGl2ZSkpIHsKKyAgICAgICAgICBpZiAoS01QX1RBU0tJTkdfRU5BQkxFRCh0YXNrX3RlYW0pKQorICAgICAgICAgICAgZmxhZy0+ZXhlY3V0ZV90YXNrcygKKyAgICAgICAgICAgICAgICB0aGlzX3RociwgdGhfZ3RpZCwgZmluYWxfc3BpbiwKKyAgICAgICAgICAgICAgICAmdGFza3NfY29tcGxldGVkIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaiksIDApOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9yZWFwX3N0YXRlID0gS01QX1NBRkVfVE9fUkVBUDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCFLTVBfTUFTVEVSX1RJRCh0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc190aWQpKTsKKyAgICAgICAgICB0aGlzX3Roci0+dGgudGhfdGFza190ZWFtID0gTlVMTDsKKyAgICAgICAgICB0aGlzX3Roci0+dGgudGhfcmVhcF9zdGF0ZSA9IEtNUF9TQUZFX1RPX1JFQVA7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9yZWFwX3N0YXRlID0gS01QX1NBRkVfVE9fUkVBUDsKKyAgICAgIH0gLy8gaWYKKyAgICB9IC8vIGlmCisKKyAgICBLTVBfRlNZTkNfU1BJTl9QUkVQQVJFKENDQVNUKHR5cGVuYW1lIEM6OmZsYWdfdCAqLCBzcGluKSk7CisgICAgaWYgKFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkpIHsKKyAgICAgIGlmIChfX2ttcF9nbG9iYWwuZy5nX2Fib3J0KQorICAgICAgICBfX2ttcF9hYm9ydF90aHJlYWQoKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIElmIHdlIGFyZSBvdmVyc3Vic2NyaWJlZCwgb3IgaGF2ZSB3YWl0ZWQgYSBiaXQgKGFuZAorICAgIC8vIEtNUF9MSUJSQVJZPXRocm91Z2hwdXQpLCB0aGVuIHlpZWxkCisgICAgLy8gVE9ETzogU2hvdWxkIGl0IGJlIG51bWJlciBvZiBjb3JlcyBpbnN0ZWFkIG9mIHRocmVhZCBjb250ZXh0cz8gTGlrZToKKyAgICAvLyBLTVBfWUlFTEQoVENSXzQoX19rbXBfbnRoKSA+IF9fa21wX25jb3Jlcyk7CisgICAgLy8gTmVlZCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBkYXRhIHRvIG1ha2UgdGhlIGNoYW5nZS4uLgorICAgIGlmIChvdmVyc3Vic2NyaWJlZCkgeworICAgICAgS01QX1lJRUxEKDEpOworICAgIH0gZWxzZSB7CisgICAgICBLTVBfWUlFTERfU1BJTihzcGlucyk7CisgICAgfQorICAgIC8vIENoZWNrIGlmIHRoaXMgdGhyZWFkIHdhcyB0cmFuc2ZlcnJlZCBmcm9tIGEgdGVhbQorICAgIC8vIHRvIHRoZSB0aHJlYWQgcG9vbCAob3IgdmljZS12ZXJzYSkgd2hpbGUgc3Bpbm5pbmcuCisgICAgaW5fcG9vbCA9ICEhVENSXzQodGhpc190aHItPnRoLnRoX2luX3Bvb2wpOworICAgIGlmIChpbl9wb29sICE9ICEhdGhpc190aHItPnRoLnRoX2FjdGl2ZV9pbl9wb29sKSB7CisgICAgICBpZiAoaW5fcG9vbCkgeyAvLyBSZWNlbnRseSB0cmFuc2ZlcnJlZCBmcm9tIHRlYW0gdG8gcG9vbAorICAgICAgICBLTVBfVEVTVF9USEVOX0lOQzMyKCZfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoKTsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX2FjdGl2ZV9pbl9wb29sID0gVFJVRTsKKyAgICAgICAgLyogSGVyZSwgd2UgY2Fubm90IGFzc2VydCB0aGF0OgorICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKFRDUl80KF9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGgpIDw9CisgICAgICAgICAgIF9fa21wX3RocmVhZF9wb29sX250aCk7CisgICAgICAgICAgIF9fa21wX3RocmVhZF9wb29sX250aCBpcyBpbmMvZGVjJ2QgYnkgdGhlIG1hc3RlciB0aHJlYWQgd2hpbGUgdGhlCisgICAgICAgICAgIGZvcmsvam9pbiBsb2NrIGlzIGhlbGQsIHdoZXJlYXMgX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCBpcworICAgICAgICAgICBpbmMvZGVjJ2QgYXN5bmNocm9ub3VzbHkgYnkgdGhlIHdvcmtlcnMuIFRoZSB0d28gY2FuIGdldCBvdXQgb2Ygc3luYworICAgICAgICAgICBmb3IgYnJpZWYgcGVyaW9kcyBvZiB0aW1lLiAgKi8KKyAgICAgIH0gZWxzZSB7IC8vIFJlY2VudGx5IHRyYW5zZmVycmVkIGZyb20gcG9vbCB0byB0ZWFtCisgICAgICAgIEtNUF9URVNUX1RIRU5fREVDMzIoJl9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGgpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKFRDUl80KF9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGgpID49IDApOworICAgICAgICB0aGlzX3Roci0+dGgudGhfYWN0aXZlX2luX3Bvb2wgPSBGQUxTRTsKKyAgICAgIH0KKyAgICB9CisKKyNpZiBLTVBfU1RBVFNfRU5BQkxFRAorICAgIC8vIENoZWNrIGlmIHRocmVhZCBoYXMgYmVlbiBzaWduYWxsZWQgdG8gaWRsZSBzdGF0ZQorICAgIC8vIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGxvZ2ljYWwgImpvaW4tYmFycmllciIgaGFzIGZpbmlzaGVkCisgICAgaWYgKHRoaXNfdGhyLT50aC50aF9zdGF0cy0+aXNJZGxlKCkgJiYKKyAgICAgICAgS01QX0dFVF9USFJFQURfU1RBVEUoKSA9PSBGT1JLX0pPSU5fQkFSUklFUikgeworICAgICAgS01QX1NFVF9USFJFQURfU1RBVEUoSURMRSk7CisgICAgICBLTVBfUFVTSF9QQVJUSVRJT05FRF9USU1FUihPTVBfaWRsZSk7CisgICAgfQorI2VuZGlmCisKKyAgICAvLyBEb24ndCBzdXNwZW5kIGlmIEtNUF9CTE9DS1RJTUUgaXMgc2V0IHRvICJpbmZpbml0ZSIKKyAgICBpZiAoX19rbXBfZGZsdF9ibG9ja3RpbWUgPT0gS01QX01BWF9CTE9DS1RJTUUpCisgICAgICBjb250aW51ZTsKKworICAgIC8vIERvbid0IHN1c3BlbmQgaWYgdGhlcmUgaXMgYSBsaWtlbGlob29kIG9mIG5ldyB0YXNrcyBiZWluZyBzcGF3bmVkLgorICAgIGlmICgodGFza190ZWFtICE9IE5VTEwpICYmIFRDUl80KHRhc2tfdGVhbS0+dHQudHRfZm91bmRfdGFza3MpKQorICAgICAgY29udGludWU7CisKKyNpZiBLTVBfVVNFX01PTklUT1IKKyAgICAvLyBJZiB3ZSBoYXZlIHdhaXRlZCBhIGJpdCBtb3JlLCBmYWxsIGFzbGVlcAorICAgIGlmIChUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSkgPCBoaWJlcm5hdGUpCisgICAgICBjb250aW51ZTsKKyNlbHNlCisgICAgaWYgKEtNUF9CTE9DS0lORyhoaWJlcm5hdGVfZ29hbCwgcG9sbF9jb3VudCsrKSkKKyAgICAgIGNvbnRpbnVlOworI2VuZGlmCisKKyAgICBLRl9UUkFDRSg1MCwgKCJfX2ttcF93YWl0X3NsZWVwOiBUIyVkIHN1c3BlbmQgdGltZSByZWFjaGVkXG4iLCB0aF9ndGlkKSk7CisgICAgZmxhZy0+c3VzcGVuZCh0aF9ndGlkKTsKKworICAgIGlmIChUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpKSB7CisgICAgICBpZiAoX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCkKKyAgICAgICAgX19rbXBfYWJvcnRfdGhyZWFkKCk7CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgaWYgKF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICYmCisgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfcmVhcF9zdGF0ZSA9PSBLTVBfU0FGRV9UT19SRUFQKSB7CisgICAgICB0aGlzX3Roci0+dGgudGhfcmVhcF9zdGF0ZSA9IEtNUF9OT1RfU0FGRV9UT19SRUFQOworICAgIH0KKyAgICAvLyBUT0RPOiBJZiB0aHJlYWQgaXMgZG9uZSB3aXRoIHdvcmsgYW5kIHRpbWVzIG91dCwgZGlzYmFuZC9mcmVlCisgIH0KKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX0JMQU1FCisgIGlmIChvbXB0X2VuYWJsZWQgJiYgb21wdF9zdGF0ZSAhPSBvbXB0X3N0YXRlX3VuZGVmaW5lZCkgeworICAgIGlmIChvbXB0X3N0YXRlID09IG9tcHRfc3RhdGVfaWRsZSkgeworICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pZGxlX2VuZCkpIHsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2lkbGVfZW5kKSh0aF9ndGlkICsgMSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfd2FpdF9iYXJyaWVyX2VuZCkpIHsKKyAgICAgIEtNUF9ERUJVR19BU1NFUlQob21wdF9zdGF0ZSA9PSBvbXB0X3N0YXRlX3dhaXRfYmFycmllciB8fAorICAgICAgICAgICAgICAgICAgICAgICBvbXB0X3N0YXRlID09IG9tcHRfc3RhdGVfd2FpdF9iYXJyaWVyX2ltcGxpY2l0IHx8CisgICAgICAgICAgICAgICAgICAgICAgIG9tcHRfc3RhdGUgPT0gb21wdF9zdGF0ZV93YWl0X2JhcnJpZXJfZXhwbGljaXQpOworCisgICAgICBvbXB0X2x3X3Rhc2t0ZWFtX3QgKnRlYW0gPQorICAgICAgICAgIHRoaXNfdGhyLT50aC50aF90ZWFtLT50Lm9tcHRfc2VyaWFsaXplZF90ZWFtX2luZm87CisgICAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcElkOworICAgICAgb21wdF90YXNrX2lkX3QgdElkOworICAgICAgaWYgKHRlYW0pIHsKKyAgICAgICAgcElkID0gdGVhbS0+b21wdF90ZWFtX2luZm8ucGFyYWxsZWxfaWQ7CisgICAgICAgIHRJZCA9IHRlYW0tPm9tcHRfdGFza19pbmZvLnRhc2tfaWQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBwSWQgPSB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC5vbXB0X3RlYW1faW5mby5wYXJhbGxlbF9pZDsKKyAgICAgICAgdElkID0gdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzay0+b21wdF90YXNrX2luZm8udGFza19pZDsKKyAgICAgIH0KKyAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF93YWl0X2JhcnJpZXJfZW5kKShwSWQsIHRJZCk7CisgICAgfQorICB9CisjZW5kaWYKKyNpZiBLTVBfU1RBVFNfRU5BQkxFRAorICAvLyBJZiB3ZSB3ZXJlIHB1dCBpbnRvIGlkbGUgc3RhdGUsIHBvcCB0aGF0IG9mZiB0aGUgc3RhdGUgc3RhY2sKKyAgaWYgKEtNUF9HRVRfVEhSRUFEX1NUQVRFKCkgPT0gSURMRSkgeworICAgIEtNUF9QT1BfUEFSVElUSU9ORURfVElNRVIoKTsKKyAgICBLTVBfU0VUX1RIUkVBRF9TVEFURSh0aHJlYWRfc3RhdGUpOworICAgIHRoaXNfdGhyLT50aC50aF9zdGF0cy0+cmVzZXRJZGxlRmxhZygpOworICB9CisjZW5kaWYKKworICBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRChDQ0FTVCh0eXBlbmFtZSBDOjpmbGFnX3QgKiwgc3BpbikpOworfQorCisvKiBSZWxlYXNlIGFueSB0aHJlYWRzIHNwZWNpZmllZCBhcyB3YWl0aW5nIG9uIHRoZSBmbGFnIGJ5IHJlbGVhc2luZyB0aGUgZmxhZworICAgYW5kIHJlc3VtZSB0aGUgd2FpdGluZyB0aHJlYWQgaWYgaW5kaWNhdGVkIGJ5IHRoZSBzbGVlcCBiaXQocykuIEEgdGhyZWFkIHRoYXQKKyAgIGNhbGxzIF9fa21wX3dhaXRfdGVtcGxhdGUgbXVzdCBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gd2FrZSB1cCB0aGUgcG90ZW50aWFsbHkKKyAgIHNsZWVwaW5nIHRocmVhZCBhbmQgcHJldmVudCBkZWFkbG9ja3MhICAqLwordGVtcGxhdGUgPGNsYXNzIEM+IHN0YXRpYyBpbmxpbmUgdm9pZCBfX2ttcF9yZWxlYXNlX3RlbXBsYXRlKEMgKmZsYWcpIHsKKyNpZmRlZiBLTVBfREVCVUcKKyAgaW50IGd0aWQgPSBUQ1JfNChfX2ttcF9pbml0X2d0aWQpID8gX19rbXBfZ2V0X2d0aWQoKSA6IC0xOworI2VuZGlmCisgIEtGX1RSQUNFKDIwLCAoIl9fa21wX3JlbGVhc2U6IFQjJWQgcmVsZWFzaW5nIGZsYWcoJXgpXG4iLCBndGlkLCBmbGFnLT5nZXQoKSkpOworICBLTVBfREVCVUdfQVNTRVJUKGZsYWctPmdldCgpKTsKKyAgS01QX0ZTWU5DX1JFTEVBU0lORyhDQ0FTVCh0eXBlbmFtZSBDOjpmbGFnX3QgKiwgZmxhZy0+Z2V0KCkpKTsKKworICBmbGFnLT5pbnRlcm5hbF9yZWxlYXNlKCk7CisKKyAgS0ZfVFJBQ0UoMTAwLCAoIl9fa21wX3JlbGVhc2U6IFQjJWQgc2V0IG5ldyBzcGluPSVkXG4iLCBndGlkLCBmbGFnLT5nZXQoKSwKKyAgICAgICAgICAgICAgICAgKihmbGFnLT5nZXQoKSkpKTsKKworICBpZiAoX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUpIHsKKyAgICAvLyBPbmx5IG5lZWQgdG8gY2hlY2sgc2xlZXAgc3R1ZmYgaWYgaW5maW5pdGUgYmxvY2sgdGltZSBub3Qgc2V0LgorICAgIC8vIEFyZSAqYW55KiB0aHJlYWRzIHdhaXRpbmcgb24gZmxhZyBzbGVlcGluZz8KKyAgICBpZiAoZmxhZy0+aXNfYW55X3NsZWVwaW5nKCkpIHsKKyAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgZmxhZy0+Z2V0X251bV93YWl0ZXJzKCk7ICsraSkgeworICAgICAgICAvLyBpZiBzbGVlcGluZyB3YWl0ZXIgZXhpc3RzIGF0IGksIHNldHMgY3VycmVudF93YWl0ZXIgdG8gaSBpbnNpZGUgZmxhZworICAgICAgICBrbXBfaW5mb190ICp3YWl0ZXIgPSBmbGFnLT5nZXRfd2FpdGVyKGkpOworICAgICAgICBpZiAod2FpdGVyKSB7CisgICAgICAgICAgaW50IHdhaXRfZ3RpZCA9IHdhaXRlci0+dGgudGhfaW5mby5kcy5kc19ndGlkOworICAgICAgICAgIC8vIFdha2UgdXAgdGhyZWFkIGlmIG5lZWRlZAorICAgICAgICAgIEtGX1RSQUNFKDUwLCAoIl9fa21wX3JlbGVhc2U6IFQjJWQgd2FraW5nIHVwIHRocmVhZCBUIyVkIHNpbmNlIHNsZWVwICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJmbGFnKCVwKSBzZXRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB3YWl0X2d0aWQsIGZsYWctPmdldCgpKSk7CisgICAgICAgICAgZmxhZy0+cmVzdW1lKHdhaXRfZ3RpZCk7IC8vIHVuc2V0cyBmbGFnJ3MgY3VycmVudF93YWl0ZXIgd2hlbiBkb25lCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEZsYWdUeXBlPiBzdHJ1Y3QgZmxhZ190cmFpdHMge307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBmbGFnX3RyYWl0czxrbXBfdWludDMyPiB7CisgIHR5cGVkZWYga21wX3VpbnQzMiBmbGFnX3Q7CisgIHN0YXRpYyBjb25zdCBmbGFnX3R5cGUgdCA9IGZsYWczMjsKKyAgc3RhdGljIGlubGluZSBmbGFnX3QgdGNyKGZsYWdfdCBmKSB7IHJldHVybiBUQ1JfNChmKTsgfQorICBzdGF0aWMgaW5saW5lIGZsYWdfdCB0ZXN0X3RoZW5fYWRkNCh2b2xhdGlsZSBmbGFnX3QgKmYpIHsKKyAgICByZXR1cm4gS01QX1RFU1RfVEhFTl9BREQ0XzMyKFJDQVNUKHZvbGF0aWxlIGttcF9pbnQzMiAqLCBmKSk7CisgIH0KKyAgc3RhdGljIGlubGluZSBmbGFnX3QgdGVzdF90aGVuX29yKHZvbGF0aWxlIGZsYWdfdCAqZiwgZmxhZ190IHYpIHsKKyAgICByZXR1cm4gS01QX1RFU1RfVEhFTl9PUjMyKGYsIHYpOworICB9CisgIHN0YXRpYyBpbmxpbmUgZmxhZ190IHRlc3RfdGhlbl9hbmQodm9sYXRpbGUgZmxhZ190ICpmLCBmbGFnX3QgdikgeworICAgIHJldHVybiBLTVBfVEVTVF9USEVOX0FORDMyKGYsIHYpOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgZmxhZ190cmFpdHM8a21wX3VpbnQ2ND4geworICB0eXBlZGVmIGttcF91aW50NjQgZmxhZ190OworICBzdGF0aWMgY29uc3QgZmxhZ190eXBlIHQgPSBmbGFnNjQ7CisgIHN0YXRpYyBpbmxpbmUgZmxhZ190IHRjcihmbGFnX3QgZikgeyByZXR1cm4gVENSXzgoZik7IH0KKyAgc3RhdGljIGlubGluZSBmbGFnX3QgdGVzdF90aGVuX2FkZDQodm9sYXRpbGUgZmxhZ190ICpmKSB7CisgICAgcmV0dXJuIEtNUF9URVNUX1RIRU5fQURENF82NChSQ0FTVCh2b2xhdGlsZSBrbXBfaW50NjQgKiwgZikpOworICB9CisgIHN0YXRpYyBpbmxpbmUgZmxhZ190IHRlc3RfdGhlbl9vcih2b2xhdGlsZSBmbGFnX3QgKmYsIGZsYWdfdCB2KSB7CisgICAgcmV0dXJuIEtNUF9URVNUX1RIRU5fT1I2NChmLCB2KTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGZsYWdfdCB0ZXN0X3RoZW5fYW5kKHZvbGF0aWxlIGZsYWdfdCAqZiwgZmxhZ190IHYpIHsKKyAgICByZXR1cm4gS01QX1RFU1RfVEhFTl9BTkQ2NChmLCB2KTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZsYWdUeXBlPiBjbGFzcyBrbXBfYmFzaWNfZmxhZyA6IHB1YmxpYyBrbXBfZmxhZzxGbGFnVHlwZT4geworICB0eXBlZGVmIGZsYWdfdHJhaXRzPEZsYWdUeXBlPiB0cmFpdHNfdHlwZTsKKyAgRmxhZ1R5cGUgY2hlY2tlcjsgLyoqPCBWYWx1ZSB0byBjb21wYXJlIGZsYWcgdG8gdG8gY2hlY2sgaWYgZmxhZyBoYXMgYmVlbgorICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlZC4gKi8KKyAga21wX2luZm9fdAorICAgICAgKndhaXRpbmdfdGhyZWFkc1sxXTsgLyoqPCBBcnJheSBvZiB0aHJlYWRzIHNsZWVwaW5nIG9uIHRoaXMgdGhyZWFkLiAqLworICBrbXBfdWludDMyCisgICAgICBudW1fd2FpdGluZ190aHJlYWRzOyAvKio8IE51bWJlciBvZiB0aHJlYWRzIHNsZWVwaW5nIG9uIHRoaXMgdGhyZWFkLiAqLworcHVibGljOgorICBrbXBfYmFzaWNfZmxhZyh2b2xhdGlsZSBGbGFnVHlwZSAqcCkKKyAgICAgIDoga21wX2ZsYWc8RmxhZ1R5cGU+KHAsIHRyYWl0c190eXBlOjp0KSwgbnVtX3dhaXRpbmdfdGhyZWFkcygwKSB7fQorICBrbXBfYmFzaWNfZmxhZyh2b2xhdGlsZSBGbGFnVHlwZSAqcCwga21wX2luZm9fdCAqdGhyKQorICAgICAgOiBrbXBfZmxhZzxGbGFnVHlwZT4ocCwgdHJhaXRzX3R5cGU6OnQpLCBudW1fd2FpdGluZ190aHJlYWRzKDEpIHsKKyAgICB3YWl0aW5nX3RocmVhZHNbMF0gPSB0aHI7CisgIH0KKyAga21wX2Jhc2ljX2ZsYWcodm9sYXRpbGUgRmxhZ1R5cGUgKnAsIEZsYWdUeXBlIGMpCisgICAgICA6IGttcF9mbGFnPEZsYWdUeXBlPihwLCB0cmFpdHNfdHlwZTo6dCksIGNoZWNrZXIoYyksCisgICAgICAgIG51bV93YWl0aW5nX3RocmVhZHMoMCkge30KKyAgLyohCisgICAqIHBhcmFtIGkgaW4gICBpbmRleCBpbnRvIHdhaXRpbmdfdGhyZWFkcworICAgKiBAcmVzdWx0IHRoZSB0aHJlYWQgdGhhdCBpcyB3YWl0aW5nIGF0IGluZGV4IGkKKyAgICovCisgIGttcF9pbmZvX3QgKmdldF93YWl0ZXIoa21wX3VpbnQzMiBpKSB7CisgICAgS01QX0RFQlVHX0FTU0VSVChpIDwgbnVtX3dhaXRpbmdfdGhyZWFkcyk7CisgICAgcmV0dXJuIHdhaXRpbmdfdGhyZWFkc1tpXTsKKyAgfQorICAvKiEKKyAgICogQHJlc3VsdCBudW1fd2FpdGluZ190aHJlYWRzCisgICAqLworICBrbXBfdWludDMyIGdldF9udW1fd2FpdGVycygpIHsgcmV0dXJuIG51bV93YWl0aW5nX3RocmVhZHM7IH0KKyAgLyohCisgICAqIEBwYXJhbSB0aHIgaW4gICB0aGUgdGhyZWFkIHdoaWNoIGlzIG5vdyB3YWl0aW5nCisgICAqCisgICAqIEluc2VydCBhIHdhaXRpbmcgdGhyZWFkIGF0IGluZGV4IDAuCisgICAqLworICB2b2lkIHNldF93YWl0ZXIoa21wX2luZm9fdCAqdGhyKSB7CisgICAgd2FpdGluZ190aHJlYWRzWzBdID0gdGhyOworICAgIG51bV93YWl0aW5nX3RocmVhZHMgPSAxOworICB9CisgIC8qIQorICAgKiBAcmVzdWx0IHRydWUgaWYgdGhlIGZsYWcgb2JqZWN0IGhhcyBiZWVuIHJlbGVhc2VkLgorICAgKi8KKyAgYm9vbCBkb25lX2NoZWNrKCkgeyByZXR1cm4gdHJhaXRzX3R5cGU6OnRjcigqKHRoaXMtPmdldCgpKSkgPT0gY2hlY2tlcjsgfQorICAvKiEKKyAgICogQHBhcmFtIG9sZF9sb2MgaW4gICBvbGQgdmFsdWUgb2YgZmxhZworICAgKiBAcmVzdWx0IHRydWUgaWYgdGhlIGZsYWcncyBvbGQgdmFsdWUgaW5kaWNhdGVzIGl0IHdhcyByZWxlYXNlZC4KKyAgICovCisgIGJvb2wgZG9uZV9jaGVja192YWwoRmxhZ1R5cGUgb2xkX2xvYykgeyByZXR1cm4gb2xkX2xvYyA9PSBjaGVja2VyOyB9CisgIC8qIQorICAgKiBAcmVzdWx0IHRydWUgaWYgdGhlIGZsYWcgb2JqZWN0IGlzIG5vdCB5ZXQgcmVsZWFzZWQuCisgICAqIFVzZWQgaW4gX19rbXBfd2FpdF90ZW1wbGF0ZSBsaWtlOgorICAgKiBAY29kZQorICAgKiB3aGlsZSAoZmxhZy5ub3Rkb25lX2NoZWNrKCkpIHsgcGF1c2UoKTsgfQorICAgKiBAZW5kY29kZQorICAgKi8KKyAgYm9vbCBub3Rkb25lX2NoZWNrKCkgeyByZXR1cm4gdHJhaXRzX3R5cGU6OnRjcigqKHRoaXMtPmdldCgpKSkgIT0gY2hlY2tlcjsgfQorICAvKiEKKyAgICogQHJlc3VsdCBBY3R1YWwgZmxhZyB2YWx1ZSBiZWZvcmUgcmVsZWFzZSB3YXMgYXBwbGllZC4KKyAgICogVHJpZ2dlciBhbGwgd2FpdGluZyB0aHJlYWRzIHRvIHJ1biBieSBtb2RpZnlpbmcgZmxhZyB0byByZWxlYXNlIHN0YXRlLgorICAgKi8KKyAgdm9pZCBpbnRlcm5hbF9yZWxlYXNlKCkgeworICAgICh2b2lkKXRyYWl0c190eXBlOjp0ZXN0X3RoZW5fYWRkNCgodm9sYXRpbGUgRmxhZ1R5cGUgKil0aGlzLT5nZXQoKSk7CisgIH0KKyAgLyohCisgICAqIEByZXN1bHQgQWN0dWFsIGZsYWcgdmFsdWUgYmVmb3JlIHNsZWVwIGJpdChzKSBzZXQuCisgICAqIE5vdGVzIHRoYXQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHRocmVhZCBzbGVlcGluZyBvbiB0aGUgZmxhZyBieSBzZXR0aW5nCisgICAqIHNsZWVwIGJpdChzKS4KKyAgICovCisgIEZsYWdUeXBlIHNldF9zbGVlcGluZygpIHsKKyAgICByZXR1cm4gdHJhaXRzX3R5cGU6OnRlc3RfdGhlbl9vcigodm9sYXRpbGUgRmxhZ1R5cGUgKil0aGlzLT5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQkFSUklFUl9TTEVFUF9TVEFURSk7CisgIH0KKyAgLyohCisgICAqIEByZXN1bHQgQWN0dWFsIGZsYWcgdmFsdWUgYmVmb3JlIHNsZWVwIGJpdChzKSBjbGVhcmVkLgorICAgKiBOb3RlcyB0aGF0IHRoZXJlIGFyZSBubyBsb25nZXIgdGhyZWFkcyBzbGVlcGluZyBvbiB0aGUgZmxhZyBieSBjbGVhcmluZworICAgKiBzbGVlcCBiaXQocykuCisgICAqLworICBGbGFnVHlwZSB1bnNldF9zbGVlcGluZygpIHsKKyAgICByZXR1cm4gdHJhaXRzX3R5cGU6OnRlc3RfdGhlbl9hbmQoKHZvbGF0aWxlIEZsYWdUeXBlICopdGhpcy0+Z2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5LTVBfQkFSUklFUl9TTEVFUF9TVEFURSk7CisgIH0KKyAgLyohCisgICAqIEBwYXJhbSBvbGRfbG9jIGluICAgb2xkIHZhbHVlIG9mIGZsYWcKKyAgICogVGVzdCB3aGV0aGVyIHRoZXJlIGFyZSB0aHJlYWRzIHNsZWVwaW5nIG9uIHRoZSBmbGFnJ3Mgb2xkIHZhbHVlIGluIG9sZF9sb2MuCisgICAqLworICBib29sIGlzX3NsZWVwaW5nX3ZhbChGbGFnVHlwZSBvbGRfbG9jKSB7CisgICAgcmV0dXJuIG9sZF9sb2MgJiBLTVBfQkFSUklFUl9TTEVFUF9TVEFURTsKKyAgfQorICAvKiEKKyAgICogVGVzdCB3aGV0aGVyIHRoZXJlIGFyZSB0aHJlYWRzIHNsZWVwaW5nIG9uIHRoZSBmbGFnLgorICAgKi8KKyAgYm9vbCBpc19zbGVlcGluZygpIHsgcmV0dXJuIGlzX3NsZWVwaW5nX3ZhbCgqKHRoaXMtPmdldCgpKSk7IH0KKyAgYm9vbCBpc19hbnlfc2xlZXBpbmcoKSB7IHJldHVybiBpc19zbGVlcGluZ192YWwoKih0aGlzLT5nZXQoKSkpOyB9CisgIGttcF91aW50OCAqZ2V0X3N0b2xlbigpIHsgcmV0dXJuIE5VTEw7IH0KKyAgZW51bSBiYXJyaWVyX3R5cGUgZ2V0X2J0KCkgeyByZXR1cm4gYnNfbGFzdF9iYXJyaWVyOyB9Cit9OworCitjbGFzcyBrbXBfZmxhZ18zMiA6IHB1YmxpYyBrbXBfYmFzaWNfZmxhZzxrbXBfdWludDMyPiB7CitwdWJsaWM6CisgIGttcF9mbGFnXzMyKHZvbGF0aWxlIGttcF91aW50MzIgKnApIDoga21wX2Jhc2ljX2ZsYWc8a21wX3VpbnQzMj4ocCkge30KKyAga21wX2ZsYWdfMzIodm9sYXRpbGUga21wX3VpbnQzMiAqcCwga21wX2luZm9fdCAqdGhyKQorICAgICAgOiBrbXBfYmFzaWNfZmxhZzxrbXBfdWludDMyPihwLCB0aHIpIHt9CisgIGttcF9mbGFnXzMyKHZvbGF0aWxlIGttcF91aW50MzIgKnAsIGttcF91aW50MzIgYykKKyAgICAgIDoga21wX2Jhc2ljX2ZsYWc8a21wX3VpbnQzMj4ocCwgYykge30KKyAgdm9pZCBzdXNwZW5kKGludCB0aF9ndGlkKSB7IF9fa21wX3N1c3BlbmRfMzIodGhfZ3RpZCwgdGhpcyk7IH0KKyAgdm9pZCByZXN1bWUoaW50IHRoX2d0aWQpIHsgX19rbXBfcmVzdW1lXzMyKHRoX2d0aWQsIHRoaXMpOyB9CisgIGludCBleGVjdXRlX3Rhc2tzKGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfaW50MzIgZ3RpZCwgaW50IGZpbmFsX3NwaW4sCisgICAgICAgICAgICAgICAgICAgIGludCAqdGhyZWFkX2ZpbmlzaGVkIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKml0dF9zeW5jX29iaiksCisgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBpc19jb25zdHJhaW5lZCkgeworICAgIHJldHVybiBfX2ttcF9leGVjdXRlX3Rhc2tzXzMyKAorICAgICAgICB0aGlzX3RociwgZ3RpZCwgdGhpcywgZmluYWxfc3BpbiwKKyAgICAgICAgdGhyZWFkX2ZpbmlzaGVkIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaiksIGlzX2NvbnN0cmFpbmVkKTsKKyAgfQorICB2b2lkIHdhaXQoa21wX2luZm9fdCAqdGhpc190aHIsCisgICAgICAgICAgICBpbnQgZmluYWxfc3BpbiBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICppdHRfc3luY19vYmopKSB7CisgICAgX19rbXBfd2FpdF90ZW1wbGF0ZSh0aGlzX3RociwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsX3NwaW4gVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSk7CisgIH0KKyAgdm9pZCByZWxlYXNlKCkgeyBfX2ttcF9yZWxlYXNlX3RlbXBsYXRlKHRoaXMpOyB9CisgIGZsYWdfdHlwZSBnZXRfcHRyX3R5cGUoKSB7IHJldHVybiBmbGFnMzI7IH0KK307CisKK2NsYXNzIGttcF9mbGFnXzY0IDogcHVibGljIGttcF9iYXNpY19mbGFnPGttcF91aW50NjQ+IHsKK3B1YmxpYzoKKyAga21wX2ZsYWdfNjQodm9sYXRpbGUga21wX3VpbnQ2NCAqcCkgOiBrbXBfYmFzaWNfZmxhZzxrbXBfdWludDY0PihwKSB7fQorICBrbXBfZmxhZ182NCh2b2xhdGlsZSBrbXBfdWludDY0ICpwLCBrbXBfaW5mb190ICp0aHIpCisgICAgICA6IGttcF9iYXNpY19mbGFnPGttcF91aW50NjQ+KHAsIHRocikge30KKyAga21wX2ZsYWdfNjQodm9sYXRpbGUga21wX3VpbnQ2NCAqcCwga21wX3VpbnQ2NCBjKQorICAgICAgOiBrbXBfYmFzaWNfZmxhZzxrbXBfdWludDY0PihwLCBjKSB7fQorICB2b2lkIHN1c3BlbmQoaW50IHRoX2d0aWQpIHsgX19rbXBfc3VzcGVuZF82NCh0aF9ndGlkLCB0aGlzKTsgfQorICB2b2lkIHJlc3VtZShpbnQgdGhfZ3RpZCkgeyBfX2ttcF9yZXN1bWVfNjQodGhfZ3RpZCwgdGhpcyk7IH0KKyAgaW50IGV4ZWN1dGVfdGFza3Moa21wX2luZm9fdCAqdGhpc190aHIsIGttcF9pbnQzMiBndGlkLCBpbnQgZmluYWxfc3BpbiwKKyAgICAgICAgICAgICAgICAgICAgaW50ICp0aHJlYWRfZmluaXNoZWQgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqaXR0X3N5bmNfb2JqKSwKKyAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGlzX2NvbnN0cmFpbmVkKSB7CisgICAgcmV0dXJuIF9fa21wX2V4ZWN1dGVfdGFza3NfNjQoCisgICAgICAgIHRoaXNfdGhyLCBndGlkLCB0aGlzLCBmaW5hbF9zcGluLAorICAgICAgICB0aHJlYWRfZmluaXNoZWQgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSwgaXNfY29uc3RyYWluZWQpOworICB9CisgIHZvaWQgd2FpdChrbXBfaW5mb190ICp0aGlzX3RociwKKyAgICAgICAgICAgIGludCBmaW5hbF9zcGluIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKml0dF9zeW5jX29iaikpIHsKKyAgICBfX2ttcF93YWl0X3RlbXBsYXRlKHRoaXNfdGhyLCB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxfc3BpbiBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopKTsKKyAgfQorICB2b2lkIHJlbGVhc2UoKSB7IF9fa21wX3JlbGVhc2VfdGVtcGxhdGUodGhpcyk7IH0KKyAgZmxhZ190eXBlIGdldF9wdHJfdHlwZSgpIHsgcmV0dXJuIGZsYWc2NDsgfQorfTsKKworLy8gSGllcmFyY2hpY2FsIDY0LWJpdCBvbi1jb3JlIGJhcnJpZXIgaW5zdGFudGlhdGlvbgorY2xhc3Mga21wX2ZsYWdfb25jb3JlIDogcHVibGljIGttcF9mbGFnPGttcF91aW50NjQ+IHsKKyAga21wX3VpbnQ2NCBjaGVja2VyOworICBrbXBfaW5mb190ICp3YWl0aW5nX3RocmVhZHNbMV07CisgIGttcF91aW50MzIgbnVtX3dhaXRpbmdfdGhyZWFkczsKKyAga21wX3VpbnQzMgorICAgICAgb2Zmc2V0OyAvKio8IFBvcnRpb24gb2YgZmxhZyB0aGF0IGlzIG9mIGludGVyZXN0IGZvciBhbiBvcGVyYXRpb24uICovCisgIGJvb2wgZmxhZ19zd2l0Y2g7IC8qKjwgSW5kaWNhdGVzIGEgc3dpdGNoIGluIGZsYWcgbG9jYXRpb24uICovCisgIGVudW0gYmFycmllcl90eXBlIGJ0OyAvKio8IEJhcnJpZXIgdHlwZS4gKi8KKyAga21wX2luZm9fdCAqdGhpc190aHI7IC8qKjwgVGhyZWFkIHRoYXQgbWF5IGJlIHJlZGlyZWN0ZWQgdG8gZGlmZmVyZW50IGZsYWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLiAqLworI2lmIFVTRV9JVFRfQlVJTEQKKyAgdm9pZCAqCisgICAgICBpdHRfc3luY19vYmo7IC8qKjwgSVRUIG9iamVjdCB0aGF0IG11c3QgYmUgcGFzc2VkIHRvIG5ldyBmbGFnIGxvY2F0aW9uLiAqLworI2VuZGlmCisgIHVuc2lnbmVkIGNoYXIgJmJ5dGVyZWYodm9sYXRpbGUga21wX3VpbnQ2NCAqbG9jLCBzaXplX3Qgb2Zmc2V0KSB7CisgICAgcmV0dXJuIChSQ0FTVCh1bnNpZ25lZCBjaGFyICosIENDQVNUKGttcF91aW50NjQgKiwgbG9jKSkpW29mZnNldF07CisgIH0KKworcHVibGljOgorICBrbXBfZmxhZ19vbmNvcmUodm9sYXRpbGUga21wX3VpbnQ2NCAqcCkKKyAgICAgIDoga21wX2ZsYWc8a21wX3VpbnQ2ND4ocCwgZmxhZ19vbmNvcmUpLCBudW1fd2FpdGluZ190aHJlYWRzKDApLAorICAgICAgICBmbGFnX3N3aXRjaChmYWxzZSkge30KKyAga21wX2ZsYWdfb25jb3JlKHZvbGF0aWxlIGttcF91aW50NjQgKnAsIGttcF91aW50MzIgaWR4KQorICAgICAgOiBrbXBfZmxhZzxrbXBfdWludDY0PihwLCBmbGFnX29uY29yZSksIG51bV93YWl0aW5nX3RocmVhZHMoMCksCisgICAgICAgIG9mZnNldChpZHgpLCBmbGFnX3N3aXRjaChmYWxzZSkge30KKyAga21wX2ZsYWdfb25jb3JlKHZvbGF0aWxlIGttcF91aW50NjQgKnAsIGttcF91aW50NjQgYywga21wX3VpbnQzMiBpZHgsCisgICAgICAgICAgICAgICAgICBlbnVtIGJhcnJpZXJfdHlwZSBiYXJfdCwga21wX2luZm9fdCAqdGhyCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAgdm9pZCAqaXR0CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICkKKyAgICAgIDoga21wX2ZsYWc8a21wX3VpbnQ2ND4ocCwgZmxhZ19vbmNvcmUpLCBjaGVja2VyKGMpLAorICAgICAgICBudW1fd2FpdGluZ190aHJlYWRzKDApLCBvZmZzZXQoaWR4KSwgZmxhZ19zd2l0Y2goZmFsc2UpLCBidChiYXJfdCksCisgICAgICAgIHRoaXNfdGhyKHRocikKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICwKKyAgICAgICAgaXR0X3N5bmNfb2JqKGl0dCkKKyNlbmRpZgorICB7CisgIH0KKyAga21wX2luZm9fdCAqZ2V0X3dhaXRlcihrbXBfdWludDMyIGkpIHsKKyAgICBLTVBfREVCVUdfQVNTRVJUKGkgPCBudW1fd2FpdGluZ190aHJlYWRzKTsKKyAgICByZXR1cm4gd2FpdGluZ190aHJlYWRzW2ldOworICB9CisgIGttcF91aW50MzIgZ2V0X251bV93YWl0ZXJzKCkgeyByZXR1cm4gbnVtX3dhaXRpbmdfdGhyZWFkczsgfQorICB2b2lkIHNldF93YWl0ZXIoa21wX2luZm9fdCAqdGhyKSB7CisgICAgd2FpdGluZ190aHJlYWRzWzBdID0gdGhyOworICAgIG51bV93YWl0aW5nX3RocmVhZHMgPSAxOworICB9CisgIGJvb2wgZG9uZV9jaGVja192YWwoa21wX3VpbnQ2NCBvbGRfbG9jKSB7CisgICAgcmV0dXJuIGJ5dGVyZWYoJm9sZF9sb2MsIG9mZnNldCkgPT0gY2hlY2tlcjsKKyAgfQorICBib29sIGRvbmVfY2hlY2soKSB7IHJldHVybiBkb25lX2NoZWNrX3ZhbCgqZ2V0KCkpOyB9CisgIGJvb2wgbm90ZG9uZV9jaGVjaygpIHsKKyAgICAvLyBDYWxjdWxhdGUgZmxhZ19zd2l0Y2gKKyAgICBpZiAodGhpc190aHItPnRoLnRoX2JhcltidF0uYmIud2FpdF9mbGFnID09IEtNUF9CQVJSSUVSX1NXSVRDSF9UT19PV05fRkxBRykKKyAgICAgIGZsYWdfc3dpdGNoID0gdHJ1ZTsKKyAgICBpZiAoYnl0ZXJlZihnZXQoKSwgb2Zmc2V0KSAhPSAxICYmICFmbGFnX3N3aXRjaCkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGVsc2UgaWYgKGZsYWdfc3dpdGNoKSB7CisgICAgICB0aGlzX3Roci0+dGgudGhfYmFyW2J0XS5iYi53YWl0X2ZsYWcgPSBLTVBfQkFSUklFUl9TV0lUQ0hJTkc7CisgICAgICBrbXBfZmxhZ182NCBmbGFnKCZ0aGlzX3Roci0+dGgudGhfYmFyW2J0XS5iYi5iX2dvLAorICAgICAgICAgICAgICAgICAgICAgICAoa21wX3VpbnQ2NClLTVBfQkFSUklFUl9TVEFURV9CVU1QKTsKKyAgICAgIF9fa21wX3dhaXRfNjQodGhpc190aHIsICZmbGFnLCBUUlVFCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICAgIGl0dF9zeW5jX29iagorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorICB2b2lkIGludGVybmFsX3JlbGVhc2UoKSB7CisgICAgaWYgKF9fa21wX2RmbHRfYmxvY2t0aW1lID09IEtNUF9NQVhfQkxPQ0tUSU1FKSB7CisgICAgICBieXRlcmVmKGdldCgpLCBvZmZzZXQpID0gMTsKKyAgICB9IGVsc2UgeworICAgICAga21wX3VpbnQ2NCBtYXNrID0gMDsKKyAgICAgIGJ5dGVyZWYoJm1hc2ssIG9mZnNldCkgPSAxOworICAgICAgS01QX1RFU1RfVEhFTl9PUjY0KGdldCgpLCBtYXNrKTsKKyAgICB9CisgIH0KKyAga21wX3VpbnQ2NCBzZXRfc2xlZXBpbmcoKSB7CisgICAgcmV0dXJuIEtNUF9URVNUX1RIRU5fT1I2NChnZXQoKSwgS01QX0JBUlJJRVJfU0xFRVBfU1RBVEUpOworICB9CisgIGttcF91aW50NjQgdW5zZXRfc2xlZXBpbmcoKSB7CisgICAgcmV0dXJuIEtNUF9URVNUX1RIRU5fQU5ENjQoZ2V0KCksIH5LTVBfQkFSUklFUl9TTEVFUF9TVEFURSk7CisgIH0KKyAgYm9vbCBpc19zbGVlcGluZ192YWwoa21wX3VpbnQ2NCBvbGRfbG9jKSB7CisgICAgcmV0dXJuIG9sZF9sb2MgJiBLTVBfQkFSUklFUl9TTEVFUF9TVEFURTsKKyAgfQorICBib29sIGlzX3NsZWVwaW5nKCkgeyByZXR1cm4gaXNfc2xlZXBpbmdfdmFsKCpnZXQoKSk7IH0KKyAgYm9vbCBpc19hbnlfc2xlZXBpbmcoKSB7IHJldHVybiBpc19zbGVlcGluZ192YWwoKmdldCgpKTsgfQorICB2b2lkIHdhaXQoa21wX2luZm9fdCAqdGhpc190aHIsIGludCBmaW5hbF9zcGluKSB7CisgICAgX19rbXBfd2FpdF90ZW1wbGF0ZTxrbXBfZmxhZ19vbmNvcmU+KAorICAgICAgICB0aGlzX3RociwgdGhpcywgZmluYWxfc3BpbiBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopKTsKKyAgfQorICB2b2lkIHJlbGVhc2UoKSB7IF9fa21wX3JlbGVhc2VfdGVtcGxhdGUodGhpcyk7IH0KKyAgdm9pZCBzdXNwZW5kKGludCB0aF9ndGlkKSB7IF9fa21wX3N1c3BlbmRfb25jb3JlKHRoX2d0aWQsIHRoaXMpOyB9CisgIHZvaWQgcmVzdW1lKGludCB0aF9ndGlkKSB7IF9fa21wX3Jlc3VtZV9vbmNvcmUodGhfZ3RpZCwgdGhpcyk7IH0KKyAgaW50IGV4ZWN1dGVfdGFza3Moa21wX2luZm9fdCAqdGhpc190aHIsIGttcF9pbnQzMiBndGlkLCBpbnQgZmluYWxfc3BpbiwKKyAgICAgICAgICAgICAgICAgICAgaW50ICp0aHJlYWRfZmluaXNoZWQgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqaXR0X3N5bmNfb2JqKSwKKyAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGlzX2NvbnN0cmFpbmVkKSB7CisgICAgcmV0dXJuIF9fa21wX2V4ZWN1dGVfdGFza3Nfb25jb3JlKAorICAgICAgICB0aGlzX3RociwgZ3RpZCwgdGhpcywgZmluYWxfc3BpbiwKKyAgICAgICAgdGhyZWFkX2ZpbmlzaGVkIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaiksIGlzX2NvbnN0cmFpbmVkKTsKKyAgfQorICBrbXBfdWludDggKmdldF9zdG9sZW4oKSB7IHJldHVybiBOVUxMOyB9CisgIGVudW0gYmFycmllcl90eXBlIGdldF9idCgpIHsgcmV0dXJuIGJ0OyB9CisgIGZsYWdfdHlwZSBnZXRfcHRyX3R5cGUoKSB7IHJldHVybiBmbGFnX29uY29yZTsgfQorfTsKKworLy8gVXNlZCB0byB3YWtlIHVwIHRocmVhZHMsIHZvbGF0aWxlIHZvaWQqIGZsYWcgaXMgdXN1YWxseSB0aGUgdGhfc2xlZXBfbG9jCisvLyBhc3NvY2lhdGVkIHdpdGggaW50IGd0aWQuCitzdGF0aWMgaW5saW5lIHZvaWQgX19rbXBfbnVsbF9yZXN1bWVfd3JhcHBlcihpbnQgZ3RpZCwgdm9sYXRpbGUgdm9pZCAqZmxhZykgeworICBpZiAoIWZsYWcpCisgICAgcmV0dXJuOworCisgIHN3aXRjaCAoUkNBU1Qoa21wX2ZsYWdfNjQgKiwgQ0NBU1Qodm9pZCAqLCBmbGFnKSktPmdldF90eXBlKCkpIHsKKyAgY2FzZSBmbGFnMzI6CisgICAgX19rbXBfcmVzdW1lXzMyKGd0aWQsIE5VTEwpOworICAgIGJyZWFrOworICBjYXNlIGZsYWc2NDoKKyAgICBfX2ttcF9yZXN1bWVfNjQoZ3RpZCwgTlVMTCk7CisgICAgYnJlYWs7CisgIGNhc2UgZmxhZ19vbmNvcmU6CisgICAgX19rbXBfcmVzdW1lX29uY29yZShndGlkLCBOVUxMKTsKKyAgICBicmVhazsKKyAgfQorfQorCisvKiEKK0B9CisqLworCisjZW5kaWYgLy8gS01QX1dBSVRfUkVMRUFTRV9ICmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9rbXBfd3JhcHBlcl9nZXRwaWQuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL2ttcF93cmFwcGVyX2dldHBpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MGU1Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfd3JhcHBlcl9nZXRwaWQuaApAQCAtMCwwICsxLDcwIEBACisvKgorICoga21wX3dyYXBwZXJfZ2V0cGlkLmggLS0gZ2V0cGlkKCkgZGVjbGFyYXRpb24uCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX1dSQVBQRVJfR0VUUElEX0gKKyNkZWZpbmUgS01QX1dSQVBQRVJfR0VUUElEX0gKKworI2lmIEtNUF9PU19VTklYCisKKy8vIE9uIFVuaXgtbGlrZSBzeXN0ZW1zIChMaW51eCogT1MgYW5kIE9TIFgqKSBnZXRwaWQoKSBpcyBkZWNsYXJlZCBpbiBzdGFuZGFyZAorLy8gaGVhZGVycy4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2lmIEtNUF9PU19EQVJXSU4KKy8vIE9TIFgKKyNkZWZpbmUgX19rbXBfZ2V0dGlkKCkgc3lzY2FsbChTWVNfdGhyZWFkX3NlbGZpZCkKKyNlbGlmIGRlZmluZWQoU1lTX2dldHRpZCkKKy8vIEhvcGVmdWxseSBvdGhlciBVbml4IHN5c3RlbXMgZGVmaW5lIFNZU19nZXR0aWQgc3lzY2FsbCBmb3IgZ2V0dGluZyBvcyB0aHJlYWQKKy8vIGlkCisjZGVmaW5lIF9fa21wX2dldHRpZCgpIHN5c2NhbGwoU1lTX2dldHRpZCkKKyNlbHNlCisjd2FybmluZyBObyBnZXR0aWQgZm91bmQsIHVzZSBnZXRwaWQgaW5zdGVhZAorI2RlZmluZSBfX2ttcF9nZXR0aWQoKSBnZXRwaWQoKQorI2VuZGlmCisKKyNlbGlmIEtNUF9PU19XSU5ET1dTCisKKy8vIE9uIFdpbmRvd3MqIE9TIF9nZXRwaWQoKSByZXR1cm5zIGludCAobm90IHBpZF90KSBhbmQgaXMgZGVjbGFyZWQgaW4KKy8vICJwcm9jZXNzLmgiLgorI2luY2x1ZGUgPHByb2Nlc3MuaD4KKy8vIExldCB1cyBzaW11bGF0ZSBVbml4LgordHlwZWRlZiBpbnQgcGlkX3Q7CisjZGVmaW5lIGdldHBpZCBfZ2V0cGlkCisjZGVmaW5lIF9fa21wX2dldHRpZCgpIEdldEN1cnJlbnRUaHJlYWRJZCgpCisKKyNlbHNlCisKKyNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TLgorCisjZW5kaWYKKworLyogVE9ETzogQWxsIHRoZSBsaWJvbXAgc291cmNlIGNvZGUgdXNlcyBwaWRfdCB0eXBlIGZvciBzdG9yaW5nIHRoZSByZXN1bHQgb2YKKyAgIGdldHBpZCgpLCBpdCBpcyBnb29kLiBCdXQgb2Z0ZW4gaXQgcHJpbnRlZCBhcyAiJWQiLCB0aGF0IGlzIG5vdCBnb29kLCBiZWNhdXNlCisgICBpdCBpZ25vcmVzIHBpZF90IGRlZmluaXRpb24gKG1heSBwaWRfdCBiZSBsb25nZXIgdGhhdCBpbnQ/KS4gSXQgc2VlbXMgYWxsIHBpZAorICAgcHJpbnRzIHNob3VsZCBiZSByZXdyaXR0ZW4gYXM6CisKKyAgIHByaW50ZiggIiUiIEtNUF9VSU5UNjRfU1BFQywgKGttcF91aW50NjQpIHBpZCApOworCisgICBvciAoYXQgbGVhc3QpIGFzCisKKyAgIHByaW50ZiggIiUiIEtNUF9VSU5UMzJfU1BFQywgKGttcF91aW50MzIpIHBpZCApOworCisgICAoa21wX3VpbnQzMiwga21wX3VpbnQ2NCwgS01QX1VJTlQ2NF9TUEVDLCBhbmQgS01QX1VOSVQzMl9TUEVDIGFyZSBkZWZpbmVkIGluCisgICAia21wX29zLmgiLikgICovCisKKyNlbmRpZiAvLyBLTVBfV1JBUFBFUl9HRVRQSURfSAorCisvLyBlbmQgb2YgZmlsZSAvLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMva21wX3dyYXBwZXJfbWFsbG9jLmggYi9maW5hbC9ydW50aW1lL3NyYy9rbXBfd3JhcHBlcl9tYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTc0MTZkCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMva21wX3dyYXBwZXJfbWFsbG9jLmgKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBrbXBfd3JhcHBlcl9tYWxsb2MuaCAtLSBXcmFwcGVycyBmb3IgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIChtYWxsb2MoKSwgZnJlZSgpLCBhbmQgb3RoZXJzKS4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfV1JBUFBFUl9NQUxMT0NfSAorI2RlZmluZSBLTVBfV1JBUFBFUl9NQUxMT0NfSAorCisvKiBUaGlzIGhlYWRlciBzZXJ2ZXMgZm9yIDMgcHVycG9zZXM6CisgICAxLiBEZWNsYXJpbmcgc3RhbmRhcmQgbWVtb3J5IGFsbG9jYXRpb24gcm91cmluZXMgaW4gT1MtaW5kZXBlbmRlbnQgd2F5LgorICAgMi4gUGFzc2luZyBzb3VyY2UgbG9jYXRpb24gaW5mbyB0aHJvdWdoIG1lbW9yeSBhbGxvY2F0aW9uIHdyYXBwZXJzLgorICAgMy4gRW5hYmxpbmcgbmF0aXZlIG1lbW9yeSBkZWJ1Z2dpbmcgY2FwYWJpbGl0aWVzLgorCisgICAxLiBEZWNsYXJpbmcgc3RhbmRhcmQgbWVtb3J5IGFsbG9jYXRpb24gcm91cmluZXMgaW4gT1MtaW5kZXBlbmRlbnQgd2F5LgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIE9uIExpbnV4KiBPUywgYWxsb2NhKCkgZnVuY3Rpb24gaXMgZGVjbGFyZWQgaW4gPGFsbG9jYS5oPiBoZWFkZXIsIHdoaWxlIG9uCisgICBXaW5kb3dzKiBPUyB0aGVyZSBpcyBubyA8YWxsb2NhLmg+IGhlYWRlciwgZnVuY3Rpb24gX2FsbG9jYSgpIChub3RlCisgICB1bmRlcnNjb3JlISkgaXMgZGVjbGFyZWQgaW4gPG1hbGxvYy5oPi4gVGhpcyBoZWFkZXIgZWxpbWluYXRlcyB0aGVzZQorICAgZGlmZmVyZW5jZXMsIHNvIGNsaWVudCBjb2RlIGluY2x1aWRpbmcgImttcF93cmFwcGVyX21hbGxvYy5oIiBjYW4gcmVseSBvbgorICAgZm9sbG93aW5nIHJvdXRpbmVzOgorCisgICAgICAgIG1hbGxvYworICAgICAgICBjYWxsb2MKKyAgICAgICAgcmVhbGxvYworICAgICAgICBmcmVlCisgICAgICAgIGFsbG9jYQorCisgICBpbiBPUy1pbmRlcGVuZGVudCB3YXkuIEl0IGFsc28gZW5hYmxlcyBtZW1vcnkgdHJhY2tpbmcgY2FwYWJpbGl0aWVzIGluIGRlYnVnCisgICBidWlsZC4gKEN1cnJlbnRseSBpdCBpcyBhdmFpbGFibGUgb25seSBvbiBXaW5kb3dzKiBPUy4pCisKKyAgIDIuIFBhc3Npbmcgc291cmNlIGxvY2F0aW9uIGluZm8gdGhyb3VnaCBtZW1vcnkgYWxsb2NhdGlvbiB3cmFwcGVycy4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFNvbWUgdG9vbHMgbWF5IGhlbHAgZGVidWdnaW5nIG1lbW9yeSBlcnJvcnMsIGZvciBleGFtcGxlLCByZXBvcnQgbWVtb3J5CisgICBsZWFrcy4gSG93ZXZlciwgbWVtb3J5IGFsbG9jYXRpb24gd3JhcHBlcnMgbWF5IGhpbmRlciBzb3VyY2UgbG9jYXRpb24uCisgICBGb3IgZXhhbXBsZToKKworICAgdm9pZCAqIGFsaWduZWRfbWFsbG9jKCBpbnQgc2l6ZSApIHsKKyAgICAgdm9pZCAqIHB0ciA9IG1hbGxvYyggc2l6ZSApOyAvLyBBbGwgdGhlIG1lbW9yeSBsZWFrcyB3aWxsIGJlIHJlcG9ydGVkIGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBsaW5lLgorICAgICAvLyBzb21lIGFkanVzdG1lbnRzLi4uCisgICAgIHJldHVybiBwdHI7CisgICB9OworCisgICBwdHIgPSBhbGlnbmVkX21hbGxvYyggc2l6ZSApOyAvLyBNZW1vcnkgbGVhayB3aWxsICpub3QqIGJlIGRldGVjdGVkIGhlcmUuIDotKAorCisgICBUbyBvdmVyY29tZSB0aGUgcHJvYmxlbSwgaW5mb3JtYXRpb24gYWJvdXQgb3JpZ2luYWwgc291cmNlIGxvY2F0aW9uIHNob3VsZAorICAgYmUgcGFzc2VkIHRocm91Z2ggYWxsIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiB3cmFwcGVycywgZm9yIGV4YW1wbGU6CisKKyAgIHZvaWQgKiBhbGlnbmVkX21hbGxvYyggaW50IHNpemUsIGNoYXIgY29uc3QgKiBmaWxlLCBpbnQgbGluZSApIHsKKyAgICAgdm9pZCAqIHB0ciA9IF9tYWxsb2NfZGJnKCBzaXplLCBmaWxlLCBsaW5lICk7CisgICAgIC8vIHNvbWUgYWRqdXN0bWVudHMuLi4KKyAgICAgcmV0dXJuIHB0cjsKKyAgIH07CisgICB2b2lkICogcHRyID0gYWxpZ25lZF9tYWxsb2MoIHNpemUsIF9fRklMRV9fLCBfX0xJTkVfXyApOworCisgICBUaGlzIGlzIGEgZ29vZCBpZGVhIGZvciBkZWJ1ZywgYnV0IHBhc3NpbmcgYWRkaXRpb25hbCBhcmd1bWVudHMgaW1wYWN0cworICAgcGVyZm9ybWFuY2UuIERpc2FibGluZyBleHRyYSBhcmd1bWVudHMgaW4gcmVsZWFzZSB2ZXJzaW9uIG9mIHRoZSBzb2Z0d2FyZQorICAgaW50cm9kdWNlcyB0b28gbWFueSBjb25kaXRpb25hbCBjb21waWxhdGlvbiwgd2hpY2ggbWFrZXMgY29kZSB1bnJlYWRhYmxlLgorICAgVGhpcyBoZWFkZXIgZGVmaW5lcyBmZXcgbWFjcm9zIGFuZCBmdW5jdGlvbnMgZmFjaWxpdGF0aW5nIGl0OgorCisgICB2b2lkICogX2FsaWduZWRfbWFsbG9jKCBpbnQgc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICkgeworICAgICB2b2lkICogcHRyID0gbWFsbG9jX3NyY19sb2MoIHNpemUgS01QX1NSQ19MT0NfUEFSTSApOworICAgICAvLyBzb21lIGFkanVzdG1lbnRzLi4uCisgICAgIHJldHVybiBwdHI7CisgICB9OworICAgI2RlZmluZSBhbGlnbmVkX21hbGxvYyggc2l6ZSApIF9hbGlnbmVkX21hbGxvYyggKHNpemUpIEtNUF9TUkNfTE9DX0NVUlIgKQorICAgLy8gVXNlIG1hY3JvIGluc3RlYWQgb2YgZGlyZWN0IGNhbGwgdG8gZnVuY3Rpb24uCisKKyAgIHZvaWQgKiBwdHIgPSBhbGlnbmVkX21hbGxvYyggc2l6ZSApOyAgLy8gQmluZ28hIE1lbW9yeSBsZWFrIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwb3J0ZWQgYXQgdGhpcyBsaW5lLgorCisgICAzLiBFbmFibGluZyBuYXRpdmUgbWVtb3J5IGRlYnVnZ2luZyBjYXBhYmlsaXRpZXMuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBTb21lIHBsYXRmb3JtcyBtYXkgb2ZmZXIgbWVtb3J5IGRlYnVnZ2luZyBjYXBhYmlsaXRpZXMuIEZvciBleGFtcGxlLCBkZWJ1ZworICAgdmVyc2lvbiBvZiBNaWNyb3NvZnQgUlRMIHRyYWNrcyBhbGwgbWVtb3J5IGFsbG9jYXRpb25zIGFuZCBjYW4gcmVwb3J0IG1lbW9yeQorICAgbGVha3MuIFRoaXMgaGVhZGVyIGVuYWJsZXMgdGhpcywgYW5kIG1ha2VzIHJlcG9ydCBtb3JlIHVzZWZ1bCAoc2VlICJQYXNzaW5nCisgICBzb3VyY2UgbG9jYXRpb24gaW5mbyB0aHJvdWdoIG1lbW9yeSBhbGxvY2F0aW9uIHdyYXBwZXJzIikuCisqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJrbXBfb3MuaCIKKworLy8gSW5jbHVkZSBhbGxvY2EoKSBkZWNsYXJhdGlvbi4KKyNpZiBLTVBfT1NfV0lORE9XUworI2luY2x1ZGUgPG1hbGxvYy5oPiAvLyBXaW5kb3dzKiBPUzogX2FsbG9jYSgpIGRlY2xhcmVkIGluICJtYWxsb2MuaCIuCisjZGVmaW5lIGFsbG9jYSBfYWxsb2NhIC8vIEFsbG93IHRvIHVzZSBhbGxvY2EoKSB3aXRoIG5vIHVuZGVyc2NvcmUuCisjZWxpZiBLTVBfT1NfRlJFRUJTRCB8fCBLTVBfT1NfTkVUQlNECisvLyBEZWNsYXJlZCBpbiAic3RkbGliLmgiLgorI2VsaWYgS01QX09TX1VOSVgKKyNpbmNsdWRlIDxhbGxvY2EuaD4gLy8gTGludXgqIE9TIGFuZCBPUyBYKjogYWxsb2MoKSBkZWNsYXJlZCBpbiAiYWxsb2NhIi4KKyNlbHNlCisjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUy4KKyNlbmRpZgorCisvKiBLTVBfU1JDX0xPQ19ERUNMIC0tIERlY2xhcmluZyBzb3VyY2UgbG9jYXRpb24gcGFyYW1lbXRlcnMsIHRvIGJlIHVzZWQgaW4KKyAgIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgorICAgS01QX1NSQ19MT0NfUEFSTSAtLSBTb3VyY2UgbG9jYXRpb24gcGFyYW1lbXRlcnMsIHRvIGJlIHVzZWQgdG8gcGFzcworICAgcGFyYW1ldGVycyB0byB1bmRlcmx5aW5nIGxldmVscy4KKyAgIEtNUF9TUkNfTE9DX0NVUlIgLS0gU291cmNlIGxvY2F0aW9uIGFyZ3VtZW50cyBkZXNjcmliaW5nIGN1cnJlbnQgbG9jYXRpb24sCisgICB0byBiZSB1c2VkIGF0IHRvcC1sZXZlbC4KKworICAgVHlwaWNhbCB1c2FnZToKKyAgIHZvaWQgKiBfYWxpZ25lZF9tYWxsb2MoIGludCBzaXplIEtNUF9TUkNfTE9DX0RFQ0wgKSB7CisgICAgIC8vIE5vdGU6IENvbW1hIGlzIG1pc3NlZCBiZWZvcmUgS01QX1NSQ19MT0NfREVDTC4KKyAgICAgS0VfVFJBQ0UoIDI1LCAoICJjYWxsZWQgZnJvbSAlczolZFxuIiwgS01QX1NSQ19MT0NfUEFSTSApICk7CisgICAgIC4uLgorICAgfQorICAgI2RlZmluZSBhbGlnbmVkX21hbGxvYyggc2l6ZSApIF9hbGlnbmVkX21hbGxvYyggKHNpemUpIEtNUF9TUkNfTE9DX0NVUlIgKQorICAgLy8gVXNlIG1hY3JvIGluc3RlYWQgb2YgZGlyZWN0IGNhbGwgdG8gZnVuY3Rpb24gLS0gbWFjcm8gcGFzc2VzIGluZm8KKyAgIC8vIGFib3V0IGN1cnJlbnQgc291cmNlIGxvY2F0aW9uIHRvIHRoZSBmdW5jLgorKi8KKyNpZiBLTVBfREVCVUcKKyNkZWZpbmUgS01QX1NSQ19MT0NfREVDTCAsIGNoYXIgY29uc3QgKl9maWxlXywgaW50IF9saW5lXworI2RlZmluZSBLTVBfU1JDX0xPQ19QQVJNICwgX2ZpbGVfLCBfbGluZV8KKyNkZWZpbmUgS01QX1NSQ19MT0NfQ1VSUiAsIF9fRklMRV9fLCBfX0xJTkVfXworI2Vsc2UKKyNkZWZpbmUgS01QX1NSQ19MT0NfREVDTAorI2RlZmluZSBLTVBfU1JDX0xPQ19QQVJNCisjZGVmaW5lIEtNUF9TUkNfTE9DX0NVUlIKKyNlbmRpZiAvLyBLTVBfREVCVUcKKworLyogbWFsbG9jX3NyY19sb2MoKSBhbmQgZnJlZV9zcmNfbG9jKCkgYXJlIHBzZXVkby1mdW5jdGlvbnMgKHJlYWxseSBtYWNyb3MpCisgICB3aXRoIGFjY2VwdHMgZXh0cmEgYXJndW1lbnRzIChzb3VyY2UgbG9jYXRpb24gaW5mbykgaW4gZGVidWcgbW9kZS4gVGhleQorICAgc2hvdWxkIGJlIHVzZWQgaW4gcGxhY2Ugb2YgbWFsbG9jKCkgYW5kIGZyZWUoKSwgdGhpcyBhbGxvd3MgZW5hYmxpbmcgbmF0aXZlCisgICBtZW1vcnkgZGVidWdnaW5nIGNhcGFiaWxpdGllcyAoaWYgYW55KS4KKworICAgVHlwaWNhbCB1c2FnZToKKyAgIHB0ciA9IG1hbGxvY19zcmNfbG9jKCBzaXplIEtNUF9TUkNfTE9DX1BBUk0gKTsKKyAgIC8vIEluc2lkZSBtZW1vcnkgYWxsb2NhdGlvbiB3cmFwcGVyLCBvcgorICAgcHRyID0gbWFsbG9jX3NyY19sb2MoIHNpemUgS01QX1NSQ19MT0NfQ1VSUiApOworICAgLy8gT3V0c2lkZSBvZiBtZW1vcnkgYWxsb2NhdGlvbiB3cmFwcGVyLgorKi8KKyNkZWZpbmUgbWFsbG9jX3NyY19sb2MoYXJncykgX21hbGxvY19zcmNfbG9jKGFyZ3MpCisjZGVmaW5lIGZyZWVfc3JjX2xvYyhhcmdzKSBfZnJlZV9zcmNfbG9jKGFyZ3MpCisvKiBEZXBlbmRpbmcgb24gYnVpbGQgbW9kZSAoZGVidWcgb3IgcmVsZWFzZSksIG1hbGxvY19zcmNfbG9jIGlzIGRlY2xhcmVkIHdpdGgKKyAgIDEgb3IgMyBwYXJhbWV0ZXJzLCBidXQgY2FsbHMgdG8gbWFsbG9jX3NyY19sb2MoKSBhcmUgYWx3YXlzIHRoZSBzYW1lOgorCisgICAuLi4gbWFsbG9jX3NyY19sb2MoIHNpemUgS01QX1NSQ19MT0NfUEFSTSApOyAvLyBvciBLTVBfU1JDX0xPQ19DVVJSCisKKyAgIENvbXBpbGVyIGlzc3VlcyB3YXJuaW5nL2Vycm9yICJ0b28gZmV3IGFyZ3VtZW50cyBpbiBtYWNybyBpbnZvY2F0aW9uIi4KKyAgIERlY2xhcmluZyB0d28gbWFjcm9zLCBtYWxsb2Nfc3JjX2xvYygpIGFuZCBfbWFsbG9jX3NyY19sb2MoKSwgb3ZlcmNvbWVzIHRoZQorICAgcHJvYmxlbS4gKi8KKworI2lmIEtNUF9ERUJVRworCisjaWYgS01QX09TX1dJTkRPV1MgJiYgX0RFQlVHCisvLyBLTVBfREVCVUcgIT0gX0RFQlVHLiBNUyBkZWJ1ZyBSVEwgaXMgYXZhaWxhYmxlIG9ubHkgaWYgX0RFQlVHIGlzIGRlZmluZWQuCisKKy8vIFdpbmRvd3MqIE9TIGhhcyBuYXRpdmUgbWVtb3J5IGRlYnVnZ2luZyBjYXBhYmlsaXRpZXMuIEVuYWJsZSB0aGVtLgorCisjaW5jbHVkZSA8Y3J0ZGJnLmg+CisKKyNkZWZpbmUgS01QX01FTV9CTE9DSyBfQ0xJRU5UX0JMT0NLCisjZGVmaW5lIG1hbGxvYyhzaXplKSBfbWFsbG9jX2RiZygoc2l6ZSksIEtNUF9NRU1fQkxPQ0ssIF9fRklMRV9fLCBfX0xJTkVfXykKKyNkZWZpbmUgY2FsbG9jKG51bSwgc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9jYWxsb2NfZGJnKChudW0pLCAoc2l6ZSksIEtNUF9NRU1fQkxPQ0ssIF9fRklMRV9fLCBfX0xJTkVfXykKKyNkZWZpbmUgcmVhbGxvYyhwdHIsIHNpemUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9yZWFsbG9jX2RiZygocHRyKSwgKHNpemUpLCBLTVBfTUVNX0JMT0NLLCBfX0ZJTEVfXywgX19MSU5FX18pCisjZGVmaW5lIGZyZWUocHRyKSBfZnJlZV9kYmcoKHB0ciksIEtNUF9NRU1fQkxPQ0spCisKKyNkZWZpbmUgX21hbGxvY19zcmNfbG9jKHNpemUsIGZpbGUsIGxpbmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9tYWxsb2NfZGJnKChzaXplKSwgS01QX01FTV9CTE9DSywgKGZpbGUpLCAobGluZSkpCisjZGVmaW5lIF9mcmVlX3NyY19sb2MocHRyLCBmaWxlLCBsaW5lKSBfZnJlZV9kYmcoKHB0ciksIEtNUF9NRU1fQkxPQ0spCisKKyNlbHNlCisKKy8vIExpbnV4KiBPUywgT1MgWCosIG9yIG5vbi1kZWJ1ZyBXaW5kb3dzKiBPUy4KKworI2RlZmluZSBfbWFsbG9jX3NyY19sb2Moc2l6ZSwgZmlsZSwgbGluZSkgbWFsbG9jKChzaXplKSkKKyNkZWZpbmUgX2ZyZWVfc3JjX2xvYyhwdHIsIGZpbGUsIGxpbmUpIGZyZWUoKHB0cikpCisKKyNlbmRpZgorCisjZWxzZQorCisvLyBJbiByZWxlYXNlIGJ1aWxkIG1hbGxvY19zcmNfbG9jKCkgYW5kIGZyZWVfc3JjX2xvYygpIGRvIG5vdCBoYXZlIGV4dHJhCisvLyBwYXJhbWV0ZXJzLgorI2RlZmluZSBfbWFsbG9jX3NyY19sb2Moc2l6ZSkgbWFsbG9jKChzaXplKSkKKyNkZWZpbmUgX2ZyZWVfc3JjX2xvYyhwdHIpIGZyZWUoKHB0cikpCisKKyNlbmRpZiAvLyBLTVBfREVCVUcKKworI2VuZGlmIC8vIEtNUF9XUkFQUEVSX01BTExPQ19ICisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9saWJvbXAucmMudmFyIGIvZmluYWwvcnVudGltZS9zcmMvbGlib21wLnJjLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjZhOWM5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvbGlib21wLnJjLnZhcgpAQCAtMCwwICsxLDcwIEBACisvLyBsaWJvbXAucmMudmFyCisKKy8vCisvLy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8vCisvLy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vLy8KKy8vLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8vLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vLy8KKy8vLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisKKyNpbmNsdWRlICJ3aW5yZXMuaCIKKyNpbmNsdWRlICJrbXBfY29uZmlnLmgiCisKK0xBTkdVQUdFIExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX1VTICAgIC8vIEVuZ2xpc2ggKFUuUy4pIHJlc291cmNlcworI3ByYWdtYSBjb2RlX3BhZ2UoMTI1MikKKworVlNfVkVSU0lPTl9JTkZPIFZFUlNJT05JTkZPCisgICAgLy8gUGFydHMgb2YgRklMRVZFUlNJT04gYW5kIFBST0RVQ1RWRVJTSU9OIGFyZSAxNi1iaXQgZmllbGRzLCBlbnRpcmUgYnVpbGQgZGF0ZSB5eXl5bW1kZAorICAgIC8vIGRvZXMgbm90IGZpdCBpbnRvIG9uZSB2ZXJzaW9uIHBhcnQsIHNvIHdlIG5lZWQgdG8gc3BsaXQgaXQgaW50byB5eXl5IGFuZCBtbWRkOgorICAgIEZJTEVWRVJTSU9OICAgIEBMSUJPTVBfVkVSU0lPTl9NQUpPUkAsQExJQk9NUF9WRVJTSU9OX01JTk9SQCxATElCT01QX1ZFUlNJT05fQlVJTERfWUVBUkAsQExJQk9NUF9WRVJTSU9OX0JVSUxEX01PTlRIX0RBWUAKKyAgICBQUk9EVUNUVkVSU0lPTiBATElCT01QX1ZFUlNJT05fTUFKT1JALEBMSUJPTVBfVkVSU0lPTl9NSU5PUkAsQExJQk9NUF9WRVJTSU9OX0JVSUxEX1lFQVJALEBMSUJPTVBfVkVSU0lPTl9CVUlMRF9NT05USF9EQVlACisgICAgRklMRUZMQUdTTUFTSyAgVlNfRkZJX0ZJTEVGTEFHU01BU0sKKyAgICBGSUxFRkxBR1MgICAgICAwCisjaWYgS01QX0RFQlVHCisgICAgICAgIHwgVlNfRkZfREVCVUcKKyNlbmRpZgorI2lmIEBMSUJPTVBfVkVSU0lPTl9CVUlMREAgPT0gMAorICAgICAgICB8IFZTX0ZGX1BSSVZBVEVCVUlMRCB8IFZTX0ZGX1BSRVJFTEVBU0UKKyNlbmRpZgorICAgIEZJTEVPUyAgICAgICAgICBWT1NfTlRfV0lORE9XUzMyICAgIC8vIFdpbmRvd3MqIFNlcnZlciogMjAwMywgWFAqLCAyMDAwLCBvciBOVCoKKyAgICBGSUxFVFlQRSAgICAgICAgVkZUX0RMTAorICAgIEJFR0lOCisgICAgICAgIEJMT0NLICJTdHJpbmdGaWxlSW5mbyIKKyAgICAgICAgQkVHSU4KKyAgICAgICAgICAgIEJMT0NLICIwNDA5MDRiMCIgICAgICAgICAgICAvLyBVLlMuIEVuZ2xpc2gsIFVuaWNvZGUgKDB4MDRiMCA9PSAxMjAwKQorICAgICAgICAgICAgQkVHSU4KKworICAgICAgICAgICAgICAgIC8vIEZpbGVEZXNjcmlwdGlvbiBhbmQgTGVnYWxDb3B5cmlnaHQgc2hvdWxkIGJlIHNob3J0LgorICAgICAgICAgICAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAgIkxMVk0qIE9wZW5NUCogUnVudGltZSBMaWJyYXJ5XDAiCisgICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIHZhbHVlcyBtYXkgYmUgcmVsYXRpdmVseSBsb25nLgorICAgICAgICAgICAgICAgIFZBTFVFICJDb21wYW55TmFtZSIsICAgICAgIkxMVk1cMCIKKyAgICAgICAgICAgICAgICAvLyBWQUxVRSAiTGVnYWxUcmFkZW1hcmtzIiwgICJcMCIgIC8vIE5vdCB1c2VkIGZvciBub3cuCisgICAgICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgICAgICAiTExWTSogT3Blbk1QKiBSdW50aW1lIExpYnJhcnlcMCIKKyAgICAgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdFZlcnNpb24iLCAgICJATElCT01QX1ZFUlNJT05fTUFKT1JALkBMSUJPTVBfVkVSU0lPTl9NSU5PUkBcMCIKKyAgICAgICAgICAgICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLCAgICAgICJATElCT01QX1ZFUlNJT05fQlVJTERAXDAiCisgICAgICAgICAgICAgICAgVkFMVUUgIkludGVybmFsTmFtZSIsICAgICAiQExJQk9NUF9MSUJfRklMRUBcMCIKKyAgICAgICAgICAgICAgICBWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsICJATElCT01QX0xJQl9GSUxFQFwwIgorICAgICAgICAgICAgICAgIFZBTFVFICJDb21tZW50cyIsCisgICAgICAgICAgICAgICAgICAgICJMTFZNKiBPcGVuTVAqIEBMSUJPTVBfTEVHQUxfVFlQRUAgTGlicmFyeSAiCisgICAgICAgICAgICAgICAgICAgICJ2ZXJzaW9uIEBMSUJPTVBfVkVSU0lPTl9NQUpPUkAuQExJQk9NUF9WRVJTSU9OX01JTk9SQC5ATElCT01QX1ZFUlNJT05fQlVJTERAICIKKyAgICAgICAgICAgICAgICAgICAgImZvciBATElCT01QX0xFR0FMX0FSQ0hAIGFyY2hpdGVjdHVyZSBidWlsdCBvbiBATElCT01QX0JVSUxEX0RBVEVALlwwIgorI2lmIEBMSUJPTVBfVkVSU0lPTl9CVUlMREAgPT0gMAorICAgICAgICAgICAgICAgICAgICBWQUxVRSAiUHJpdmF0ZUJ1aWxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIGEgZGV2ZWxvcG1lbnQgYnVpbGQuXDAiCisjZW5kaWYKKyAgICAgICAgICAgICAgICAvLyBWQUxVRSAiU3BlY2lhbEJ1aWxkIiwgICAgICJcMCIgICAgLy8gTm90IHVzZWQgZm9yIG5vdy4KKworICAgICAgICAgICAgRU5ECisgICAgICAgIEVORAorICAgICAgICBCTE9DSyAiVmFyRmlsZUluZm8iCisgICAgICAgIEJFR0lOCisgICAgICAgICAgICBWQUxVRSAiVHJhbnNsYXRpb24iLCAxMDMzLCAxMjAwCisgICAgICAgICAgICAvLyAxMDMzIC0tIFUuUy4gRW5nbGlzaCwgMTIwMCAtLSBVbmljb2RlCisgICAgICAgIEVORAorICAgIEVORAorCisvLyBlbmQgb2YgZmlsZSAvLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvb21wdC1ldmVudC1zcGVjaWZpYy5oIGIvZmluYWwvcnVudGltZS9zcmMvb21wdC1ldmVudC1zcGVjaWZpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZWI2N2MKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy9vbXB0LWV2ZW50LXNwZWNpZmljLmgKQEAgLTAsMCArMSwxNTMgQEAKKyNpZm5kZWYgX19PTVBUX0VWRU5UX1NQRUNJRklDX0hfXworI2RlZmluZSBfX09NUFRfRVZFTlRfU1BFQ0lGSUNfSF9fCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZpbGU6IG9tcHQtZXZlbnQtc3BlY2lmaWMuaAorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqICAgc3BlY2lmeSB3aGljaCBvZiB0aGUgT01QVCBldmVudHMgYXJlIGltcGxlbWVudGVkIGJ5IHRoaXMgcnVudGltZSBzeXN0ZW0KKyAqICAgYW5kIHRoZSBsZXZlbCBvZiB0aGVpciBpbXBsZW1lbnRhdGlvbiBieSBhIHJ1bnRpbWUgc3lzdGVtLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIF9vbXB0X3Rva2VucGFzdGVfaGVscGVyKHgsIHkpIHgjI3kKKyNkZWZpbmUgX29tcHRfdG9rZW5wYXN0ZSh4LCB5KSBfb21wdF90b2tlbnBhc3RlX2hlbHBlcih4LCB5KQorI2RlZmluZSBvbXB0X2V2ZW50X2ltcGxlbWVudGF0aW9uX3N0YXR1cyhlKSBfb21wdF90b2tlbnBhc3RlKGUsIF9pbXBsZW1lbnRlZCkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgfCBTcGVjaWZ5IHdoZXRoZXIgYW4gZXZlbnQgbWF5IG9jY3VyIG9yIG5vdCwgYW5kIHdoZXRoZXIgZXZlbnQgY2FsbGJhY2tzCisgfCBuZXZlciwgc29tZXRpbWVzLCBvciBhbHdheXMgb2NjdXIuCisgfAorIHwgVGhlIHZhbHVlcyBmb3IgdGhlc2UgY29uc3RhbnRzIGFyZSBkZWZpbmVkIGluIHNlY3Rpb24gNi4xLjIgb2YKKyB8IHRoZSBPTVBUIFRSLiBUaGV5IGFyZSBleHBvc2VkIHRvIHRvb2xzIHRocm91Z2ggb21wdF9zZXRfY2FsbGJhY2suCisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBvbXB0X2V2ZW50X05FVkVSIG9tcHRfc2V0X3Jlc3VsdF9ldmVudF9uZXZlcl9vY2N1cnMKKyNkZWZpbmUgb21wdF9ldmVudF9VTklNUExFTUVOVEVEIG9tcHRfc2V0X3Jlc3VsdF9ldmVudF9tYXlfb2NjdXJfbm9fY2FsbGJhY2sKKyNkZWZpbmUgb21wdF9ldmVudF9NQVlfQ09OVkVOSUVOVCBvbXB0X3NldF9yZXN1bHRfZXZlbnRfbWF5X29jY3VyX2NhbGxiYWNrX3NvbWUKKyNkZWZpbmUgb21wdF9ldmVudF9NQVlfQUxXQVlTIG9tcHRfc2V0X3Jlc3VsdF9ldmVudF9tYXlfb2NjdXJfY2FsbGJhY2tfYWx3YXlzCisKKyNpZiBPTVBUX1RSQUNFCisjZGVmaW5lIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRSBvbXB0X2V2ZW50X01BWV9BTFdBWVMKKyNlbHNlCisjZGVmaW5lIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRSBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKyNlbmRpZgorCisjaWYgT01QVF9CTEFNRQorI2RlZmluZSBvbXB0X2V2ZW50X01BWV9BTFdBWVNfQkxBTUUgb21wdF9ldmVudF9NQVlfQUxXQVlTCisjZWxzZQorI2RlZmluZSBvbXB0X2V2ZW50X01BWV9BTFdBWVNfQkxBTUUgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgfCBNYW5kYXRvcnkgRXZlbnRzCisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luX2ltcGxlbWVudGVkIG9tcHRfZXZlbnRfTUFZX0FMV0FZUworI2RlZmluZSBvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZF9pbXBsZW1lbnRlZCBvbXB0X2V2ZW50X01BWV9BTFdBWVMKKworI2RlZmluZSBvbXB0X2V2ZW50X3Rhc2tfYmVnaW5faW1wbGVtZW50ZWQgb21wdF9ldmVudF9NQVlfQUxXQVlTCisjZGVmaW5lIG9tcHRfZXZlbnRfdGFza19lbmRfaW1wbGVtZW50ZWQgb21wdF9ldmVudF9NQVlfQUxXQVlTCisKKyNkZWZpbmUgb21wdF9ldmVudF90aHJlYWRfYmVnaW5faW1wbGVtZW50ZWQgb21wdF9ldmVudF9NQVlfQUxXQVlTCisjZGVmaW5lIG9tcHRfZXZlbnRfdGhyZWFkX2VuZF9pbXBsZW1lbnRlZCBvbXB0X2V2ZW50X01BWV9BTFdBWVMKKworI2RlZmluZSBvbXB0X2V2ZW50X2NvbnRyb2xfaW1wbGVtZW50ZWQgb21wdF9ldmVudF9NQVlfQUxXQVlTCisKKyNkZWZpbmUgb21wdF9ldmVudF9ydW50aW1lX3NodXRkb3duX2ltcGxlbWVudGVkIG9tcHRfZXZlbnRfTUFZX0FMV0FZUworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB8IE9wdGlvbmFsIEV2ZW50cyAoYmxhbWUgc2hpZnRpbmcpCisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBvbXB0X2V2ZW50X2lkbGVfYmVnaW5faW1wbGVtZW50ZWQgb21wdF9ldmVudF9NQVlfQUxXQVlTX0JMQU1FCisjZGVmaW5lIG9tcHRfZXZlbnRfaWRsZV9lbmRfaW1wbGVtZW50ZWQgb21wdF9ldmVudF9NQVlfQUxXQVlTX0JMQU1FCisKKyNkZWZpbmUgb21wdF9ldmVudF93YWl0X2JhcnJpZXJfYmVnaW5faW1wbGVtZW50ZWQgb21wdF9ldmVudF9NQVlfQUxXQVlTX0JMQU1FCisjZGVmaW5lIG9tcHRfZXZlbnRfd2FpdF9iYXJyaWVyX2VuZF9pbXBsZW1lbnRlZCBvbXB0X2V2ZW50X01BWV9BTFdBWVNfQkxBTUUKKworI2RlZmluZSBvbXB0X2V2ZW50X3dhaXRfdGFza3dhaXRfYmVnaW5faW1wbGVtZW50ZWQgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisjZGVmaW5lIG9tcHRfZXZlbnRfd2FpdF90YXNrd2FpdF9lbmRfaW1wbGVtZW50ZWQgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisKKyNkZWZpbmUgb21wdF9ldmVudF93YWl0X3Rhc2tncm91cF9iZWdpbl9pbXBsZW1lbnRlZCBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKyNkZWZpbmUgb21wdF9ldmVudF93YWl0X3Rhc2tncm91cF9lbmRfaW1wbGVtZW50ZWQgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisKKyNkZWZpbmUgb21wdF9ldmVudF9yZWxlYXNlX2xvY2tfaW1wbGVtZW50ZWQgb21wdF9ldmVudF9NQVlfQUxXQVlTX0JMQU1FCisjZGVmaW5lIG9tcHRfZXZlbnRfcmVsZWFzZV9uZXN0X2xvY2tfbGFzdF9pbXBsZW1lbnRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfQkxBTUUKKyNkZWZpbmUgb21wdF9ldmVudF9yZWxlYXNlX2NyaXRpY2FsX2ltcGxlbWVudGVkIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19CTEFNRQorI2RlZmluZSBvbXB0X2V2ZW50X3JlbGVhc2VfYXRvbWljX2ltcGxlbWVudGVkIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19CTEFNRQorI2RlZmluZSBvbXB0X2V2ZW50X3JlbGVhc2Vfb3JkZXJlZF9pbXBsZW1lbnRlZCBvbXB0X2V2ZW50X01BWV9BTFdBWVNfQkxBTUUKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgfCBPcHRpb25hbCBFdmVudHMgKHN5bmNocm9ub3VzIGV2ZW50cykKKyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbl9pbXBsZW1lbnRlZCBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKyNkZWZpbmUgb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZF9pbXBsZW1lbnRlZCBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKworI2RlZmluZSBvbXB0X2V2ZW50X2luaXRpYWxfdGFza19iZWdpbl9pbXBsZW1lbnRlZCBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKyNkZWZpbmUgb21wdF9ldmVudF9pbml0aWFsX3Rhc2tfZW5kX2ltcGxlbWVudGVkIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorCisjZGVmaW5lIG9tcHRfZXZlbnRfdGFza19zd2l0Y2hfaW1wbGVtZW50ZWQgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisKKyNkZWZpbmUgb21wdF9ldmVudF9sb29wX2JlZ2luX2ltcGxlbWVudGVkIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorI2RlZmluZSBvbXB0X2V2ZW50X2xvb3BfZW5kX2ltcGxlbWVudGVkIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorCisjZGVmaW5lIG9tcHRfZXZlbnRfc2VjdGlvbnNfYmVnaW5faW1wbGVtZW50ZWQgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisjZGVmaW5lIG9tcHRfZXZlbnRfc2VjdGlvbnNfZW5kX2ltcGxlbWVudGVkIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorCisjZGVmaW5lIG9tcHRfZXZlbnRfc2luZ2xlX2luX2Jsb2NrX2JlZ2luX2ltcGxlbWVudGVkIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorI2RlZmluZSBvbXB0X2V2ZW50X3NpbmdsZV9pbl9ibG9ja19lbmRfaW1wbGVtZW50ZWQgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisjZGVmaW5lIG9tcHRfZXZlbnRfc2luZ2xlX290aGVyc19iZWdpbl9pbXBsZW1lbnRlZCBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKyNkZWZpbmUgb21wdF9ldmVudF9zaW5nbGVfb3RoZXJzX2VuZF9pbXBsZW1lbnRlZCBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKworI2RlZmluZSBvbXB0X2V2ZW50X3dvcmtzaGFyZV9iZWdpbl9pbXBsZW1lbnRlZCBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKyNkZWZpbmUgb21wdF9ldmVudF93b3Jrc2hhcmVfZW5kX2ltcGxlbWVudGVkIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorCisjZGVmaW5lIG9tcHRfZXZlbnRfbWFzdGVyX2JlZ2luX2ltcGxlbWVudGVkIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorI2RlZmluZSBvbXB0X2V2ZW50X21hc3Rlcl9lbmRfaW1wbGVtZW50ZWQgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisKKyNkZWZpbmUgb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luX2ltcGxlbWVudGVkIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorI2RlZmluZSBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kX2ltcGxlbWVudGVkIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorCisjZGVmaW5lIG9tcHRfZXZlbnRfdGFza3dhaXRfYmVnaW5faW1wbGVtZW50ZWQgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisjZGVmaW5lIG9tcHRfZXZlbnRfdGFza3dhaXRfZW5kX2ltcGxlbWVudGVkIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorCisjZGVmaW5lIG9tcHRfZXZlbnRfdGFza2dyb3VwX2JlZ2luX2ltcGxlbWVudGVkIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorI2RlZmluZSBvbXB0X2V2ZW50X3Rhc2tncm91cF9lbmRfaW1wbGVtZW50ZWQgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisKKyNkZWZpbmUgb21wdF9ldmVudF9yZWxlYXNlX25lc3RfbG9ja19wcmV2X2ltcGxlbWVudGVkICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorI2RlZmluZSBvbXB0X2V2ZW50X3dhaXRfbG9ja19pbXBsZW1lbnRlZCBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKyNkZWZpbmUgb21wdF9ldmVudF93YWl0X25lc3RfbG9ja19pbXBsZW1lbnRlZCBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKyNkZWZpbmUgb21wdF9ldmVudF93YWl0X2NyaXRpY2FsX2ltcGxlbWVudGVkIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorI2RlZmluZSBvbXB0X2V2ZW50X3dhaXRfYXRvbWljX2ltcGxlbWVudGVkIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorI2RlZmluZSBvbXB0X2V2ZW50X3dhaXRfb3JkZXJlZF9pbXBsZW1lbnRlZCBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKworI2RlZmluZSBvbXB0X2V2ZW50X2FjcXVpcmVkX2xvY2tfaW1wbGVtZW50ZWQgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisjZGVmaW5lIG9tcHRfZXZlbnRfYWNxdWlyZWRfbmVzdF9sb2NrX2ZpcnN0X2ltcGxlbWVudGVkICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKyNkZWZpbmUgb21wdF9ldmVudF9hY3F1aXJlZF9uZXN0X2xvY2tfbmV4dF9pbXBsZW1lbnRlZCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorI2RlZmluZSBvbXB0X2V2ZW50X2FjcXVpcmVkX2NyaXRpY2FsX2ltcGxlbWVudGVkIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorI2RlZmluZSBvbXB0X2V2ZW50X2FjcXVpcmVkX2F0b21pY19pbXBsZW1lbnRlZCBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKyNkZWZpbmUgb21wdF9ldmVudF9hY3F1aXJlZF9vcmRlcmVkX2ltcGxlbWVudGVkIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorCisjZGVmaW5lIG9tcHRfZXZlbnRfaW5pdF9sb2NrX2ltcGxlbWVudGVkIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorI2RlZmluZSBvbXB0X2V2ZW50X2luaXRfbmVzdF9sb2NrX2ltcGxlbWVudGVkIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorCisjZGVmaW5lIG9tcHRfZXZlbnRfZGVzdHJveV9sb2NrX2ltcGxlbWVudGVkIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorI2RlZmluZSBvbXB0X2V2ZW50X2Rlc3Ryb3lfbmVzdF9sb2NrX2ltcGxlbWVudGVkIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorCisjZGVmaW5lIG9tcHRfZXZlbnRfZmx1c2hfaW1wbGVtZW50ZWQgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisKKyNpZiBPTVBfNDBfRU5BQkxFRAorI2RlZmluZSBvbXB0X2V2ZW50X3Rhc2tfZGVwZW5kZW5jZXNfaW1wbGVtZW50ZWQgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisjZGVmaW5lIG9tcHRfZXZlbnRfdGFza19kZXBlbmRlbmNlX3BhaXJfaW1wbGVtZW50ZWQgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisjZWxzZQorI2RlZmluZSBvbXB0X2V2ZW50X3Rhc2tfZGVwZW5kZW5jZXNfaW1wbGVtZW50ZWQgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisjZGVmaW5lIG9tcHRfZXZlbnRfdGFza19kZXBlbmRlbmNlX3BhaXJfaW1wbGVtZW50ZWQgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy9vbXB0LWdlbmVyYWwuY3BwIGIvZmluYWwvcnVudGltZS9zcmMvb21wdC1nZW5lcmFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTY2ZDljCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvb21wdC1nZW5lcmFsLmNwcApAQCAtMCwwICsxLDQ2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzeXN0ZW0gaW5jbHVkZSBmaWxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogb21wdCBpbmNsdWRlIGZpbGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIm9tcHQtc3BlY2lmaWMuY3BwIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG1hY3JvcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgb21wdF9nZXRfY2FsbGJhY2tfc3VjY2VzcyAxCisjZGVmaW5lIG9tcHRfZ2V0X2NhbGxiYWNrX2ZhaWx1cmUgMAorCisjZGVmaW5lIG5vX3Rvb2xfcHJlc2VudCAwCisKKyNkZWZpbmUgT01QVF9BUElfUk9VVElORSBzdGF0aWMKKworI2lmbmRlZiBPTVBUX1NUUl9NQVRDSAorI2RlZmluZSBPTVBUX1NUUl9NQVRDSChoYXlzdGFjaywgbmVlZGxlKSAoIXN0cmNhc2VjbXAoaGF5c3RhY2ssIG5lZWRsZSkpCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB0eXBlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgY2hhciAqc3RhdGVfbmFtZTsKKyAgb21wdF9zdGF0ZV90IHN0YXRlX2lkOworfSBvbXB0X3N0YXRlX2luZm9fdDsKKworZW51bSB0b29sX3NldHRpbmdfZSB7CisgIG9tcF90b29sX2Vycm9yLAorICBvbXBfdG9vbF91bnNldCwKKyAgb21wX3Rvb2xfZGlzYWJsZWQsCisgIG9tcF90b29sX2VuYWJsZWQKK307CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfaW5pdGlhbGl6ZV90KShvbXB0X2Z1bmN0aW9uX2xvb2t1cF90IG9tcHRfZm5fbG9va3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG9tcHRfdmVyc2lvbik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2xvYmFsIHZhcmlhYmxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBvbXB0X2VuYWJsZWQgPSAwOworCitvbXB0X3N0YXRlX2luZm9fdCBvbXB0X3N0YXRlX2luZm9bXSA9IHsKKyNkZWZpbmUgb21wdF9zdGF0ZV9tYWNybyhzdGF0ZSwgY29kZSkgeyNzdGF0ZSwgc3RhdGV9LAorICAgIEZPUkVBQ0hfT01QVF9TVEFURShvbXB0X3N0YXRlX21hY3JvKQorI3VuZGVmIG9tcHRfc3RhdGVfbWFjcm8KK307CisKK29tcHRfY2FsbGJhY2tzX3Qgb21wdF9jYWxsYmFja3M7CisKK3N0YXRpYyBvbXB0X2luaXRpYWxpemVfdCBvbXB0X2luaXRpYWxpemVfZm4gPSBOVUxMOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGZvcndhcmQgZGVjbGFyYXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIG9tcHRfaW50ZXJmYWNlX2ZuX3Qgb21wdF9mbl9sb29rdXAoY29uc3QgY2hhciAqcyk7CisKK09NUFRfQVBJX1JPVVRJTkUgb21wdF90aHJlYWRfaWRfdCBvbXB0X2dldF90aHJlYWRfaWQodm9pZCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaW5pdGlhbGl6YXRpb24gYW5kIGZpbmFsaXphdGlvbiAocHJpdmF0ZSBvcGVyYXRpb25zKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE9uIFVuaXgtbGlrZSBzeXN0ZW1zIHRoYXQgc3VwcG9ydCB3ZWFrIHN5bWJvbHMgdGhlIGZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbgorICogb2Ygb21wdF90b29sKCkgd2lsbCBiZSB1c2VkIGluIGNhc2Ugbm8gdG9vbC1zdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZgorICogdGhpcyBmdW5jdGlvbiBpcyBwcmVzZW50IGluIHRoZSBhZGRyZXNzIHNwYWNlIG9mIGEgcHJvY2Vzcy4KKyAqCisgKiBPbiBXaW5kb3dzLCB0aGUgb21wdF90b29sX3dpbmRvd3MgZnVuY3Rpb24gaXMgdXNlZCB0byBmaW5kIHRoZQorICogb21wdF90b29sIHN5bWJvbCBhY3Jvc3MgYWxsIG1vZHVsZXMgbG9hZGVkIGJ5IGEgcHJvY2Vzcy4gSWYgb21wdF90b29sIGlzCisgKiBmb3VuZCwgb21wdF90b29sJ3MgcmV0dXJuIHZhbHVlIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgdG9vbC4gT3RoZXJ3aXNlLAorICogTlVMTCBpcyByZXR1cm5lZCBhbmQgT01QVCB3b24ndCBiZSBlbmFibGVkICovCisjaWYgT01QVF9IQVZFX1dFQUtfQVRUUklCVVRFCitfT01QX0VYVEVSTgorX19hdHRyaWJ1dGVfXygod2VhaykpIG9tcHRfaW5pdGlhbGl6ZV90IG9tcHRfdG9vbCgpIHsKKyNpZiBPTVBUX0RFQlVHCisgIHByaW50Zigib21wdF90b29sKCkgaXMgY2FsbGVkIGZyb20gdGhlIFJUTFxuIik7CisjZW5kaWYKKyAgcmV0dXJuIE5VTEw7Cit9CisKKyNlbGlmIE9NUFRfSEFWRV9QU0FQSQorCisjaW5jbHVkZSA8cHNhcGkuaD4KKyNwcmFnbWEgY29tbWVudChsaWIsICJwc2FwaS5saWIiKQorI2RlZmluZSBvbXB0X3Rvb2wgb21wdF90b29sX3dpbmRvd3MKKworLy8gVGhlIG51bWJlciBvZiBsb2FkZWQgbW9kdWxlcyB0byBzdGFydCBlbnVtZXJhdGlvbiB3aXRoIEVudW1Qcm9jZXNzTW9kdWxlcygpCisjZGVmaW5lIE5VTV9NT0RVTEVTIDEyOAorCitzdGF0aWMgb21wdF9pbml0aWFsaXplX3Qgb21wdF90b29sX3dpbmRvd3MoKSB7CisgIGludCBpOworICBEV09SRCBuZWVkZWQsIG5ld19zaXplOworICBITU9EVUxFICptb2R1bGVzOworICBIQU5ETEUgcHJvY2VzcyA9IEdldEN1cnJlbnRQcm9jZXNzKCk7CisgIG1vZHVsZXMgPSAoSE1PRFVMRSAqKW1hbGxvYyhOVU1fTU9EVUxFUyAqIHNpemVvZihITU9EVUxFKSk7CisgIG9tcHRfaW5pdGlhbGl6ZV90ICgqb21wdF90b29sX3ApKCkgPSBOVUxMOworCisjaWYgT01QVF9ERUJVRworICBwcmludGYoIm9tcHRfdG9vbF93aW5kb3dzKCk6IGxvb2tpbmcgZm9yIG9tcHRfdG9vbFxuIik7CisjZW5kaWYKKyAgaWYgKCFFbnVtUHJvY2Vzc01vZHVsZXMocHJvY2VzcywgbW9kdWxlcywgTlVNX01PRFVMRVMgKiBzaXplb2YoSE1PRFVMRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuZWVkZWQpKSB7CisgICAgLy8gUmVnYXJkbGVzcyBvZiB0aGUgZXJyb3IgcmVhc29uIHVzZSB0aGUgc3R1YiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgorICAgIGZyZWUobW9kdWxlcyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgLy8gQ2hlY2sgaWYgTlVNX01PRFVMRVMgaXMgZW5vdWdoIHRvIGxpc3QgYWxsIG1vZHVsZXMKKyAgbmV3X3NpemUgPSBuZWVkZWQgLyBzaXplb2YoSE1PRFVMRSk7CisgIGlmIChuZXdfc2l6ZSA+IE5VTV9NT0RVTEVTKSB7CisjaWYgT01QVF9ERUJVRworICAgIHByaW50Zigib21wdF90b29sX3dpbmRvd3MoKTogcmVzaXplIGJ1ZmZlciB0byAlZCBieXRlc1xuIiwgbmVlZGVkKTsKKyNlbmRpZgorICAgIG1vZHVsZXMgPSAoSE1PRFVMRSAqKXJlYWxsb2MobW9kdWxlcywgbmVlZGVkKTsKKyAgICAvLyBJZiByZXNpemluZyBmYWlsZWQgdXNlIHRoZSBzdHViIGZ1bmN0aW9uLgorICAgIGlmICghRW51bVByb2Nlc3NNb2R1bGVzKHByb2Nlc3MsIG1vZHVsZXMsIG5lZWRlZCwgJm5lZWRlZCkpIHsKKyAgICAgIGZyZWUobW9kdWxlcyk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IG5ld19zaXplOyArK2kpIHsKKyAgICAoRkFSUFJPQyAmKW9tcHRfdG9vbF9wID0gR2V0UHJvY0FkZHJlc3MobW9kdWxlc1tpXSwgIm9tcHRfdG9vbCIpOworICAgIGlmIChvbXB0X3Rvb2xfcCkgeworI2lmIE9NUFRfREVCVUcKKyAgICAgIFRDSEFSIG1vZE5hbWVbTUFYX1BBVEhdOworICAgICAgaWYgKEdldE1vZHVsZUZpbGVOYW1lKG1vZHVsZXNbaV0sIG1vZE5hbWUsIE1BWF9QQVRIKSkKKyAgICAgICAgcHJpbnRmKCJvbXB0X3Rvb2xfd2luZG93cygpOiBvbXB0X3Rvb2wgZm91bmQgaW4gbW9kdWxlICVzXG4iLCBtb2ROYW1lKTsKKyNlbmRpZgorICAgICAgZnJlZShtb2R1bGVzKTsKKyAgICAgIHJldHVybiBvbXB0X3Rvb2xfcCgpOworICAgIH0KKyNpZiBPTVBUX0RFQlVHCisgICAgZWxzZSB7CisgICAgICBUQ0hBUiBtb2ROYW1lW01BWF9QQVRIXTsKKyAgICAgIGlmIChHZXRNb2R1bGVGaWxlTmFtZShtb2R1bGVzW2ldLCBtb2ROYW1lLCBNQVhfUEFUSCkpCisgICAgICAgIHByaW50Zigib21wdF90b29sX3dpbmRvd3MoKTogb21wdF90b29sIG5vdCBmb3VuZCBpbiBtb2R1bGUgJXNcbiIsCisgICAgICAgICAgICAgICBtb2ROYW1lKTsKKyAgICB9CisjZW5kaWYKKyAgfQorICBmcmVlKG1vZHVsZXMpOworICByZXR1cm4gTlVMTDsKK30KKyNlbHNlCisjZXJyb3IgRWl0aGVyIF9fYXR0cmlidXRlX18oKHdlYWspKSBvciBwc2FwaS5kbGwgYXJlIHJlcXVpcmVkIGZvciBPTVBUIHN1cHBvcnQKKyNlbmRpZiAvLyBPTVBUX0hBVkVfV0VBS19BVFRSSUJVVEUKKwordm9pZCBvbXB0X3ByZV9pbml0KCkgeworICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIEV4ZWN1dGUgdGhlIHByZS1pbml0aWFsaXphdGlvbiBsb2dpYyBvbmx5IG9uY2UuCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgc3RhdGljIGludCBvbXB0X3ByZV9pbml0aWFsaXplZCA9IDA7CisKKyAgaWYgKG9tcHRfcHJlX2luaXRpYWxpemVkKQorICAgIHJldHVybjsKKworICBvbXB0X3ByZV9pbml0aWFsaXplZCA9IDE7CisKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBVc2UgYSB0b29sIGlmZiBhIHRvb2wgaXMgZW5hYmxlZCBhbmQgYXZhaWxhYmxlLgorICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGNvbnN0IGNoYXIgKm9tcHRfZW52X3ZhciA9IGdldGVudigiT01QX1RPT0wiKTsKKyAgdG9vbF9zZXR0aW5nX2UgdG9vbF9zZXR0aW5nID0gb21wX3Rvb2xfZXJyb3I7CisKKyAgaWYgKCFvbXB0X2Vudl92YXIgfHwgIXN0cmNtcChvbXB0X2Vudl92YXIsICIiKSkKKyAgICB0b29sX3NldHRpbmcgPSBvbXBfdG9vbF91bnNldDsKKyAgZWxzZSBpZiAoT01QVF9TVFJfTUFUQ0gob21wdF9lbnZfdmFyLCAiZGlzYWJsZWQiKSkKKyAgICB0b29sX3NldHRpbmcgPSBvbXBfdG9vbF9kaXNhYmxlZDsKKyAgZWxzZSBpZiAoT01QVF9TVFJfTUFUQ0gob21wdF9lbnZfdmFyLCAiZW5hYmxlZCIpKQorICAgIHRvb2xfc2V0dGluZyA9IG9tcF90b29sX2VuYWJsZWQ7CisKKyNpZiBPTVBUX0RFQlVHCisgIHByaW50Zigib21wdF9wcmVfaW5pdCgpOiB0b29sX3NldHRpbmcgPSAlZFxuIiwgdG9vbF9zZXR0aW5nKTsKKyNlbmRpZgorICBzd2l0Y2ggKHRvb2xfc2V0dGluZykgeworICBjYXNlIG9tcF90b29sX2Rpc2FibGVkOgorICAgIGJyZWFrOworCisgIGNhc2Ugb21wX3Rvb2xfdW5zZXQ6CisgIGNhc2Ugb21wX3Rvb2xfZW5hYmxlZDoKKyAgICBvbXB0X2luaXRpYWxpemVfZm4gPSBvbXB0X3Rvb2woKTsKKyAgICBpZiAob21wdF9pbml0aWFsaXplX2ZuKSB7CisgICAgICBvbXB0X2VuYWJsZWQgPSAxOworICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIG9tcF90b29sX2Vycm9yOgorICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogT01QX1RPT0wgaGFzIGludmFsaWQgdmFsdWUgXCIlc1wiLlxuIgorICAgICAgICAgICAgICAgICAgICAiICBsZWdhbCB2YWx1ZXMgYXJlIChOVUxMLFwiXCIsXCJkaXNhYmxlZFwiLCIKKyAgICAgICAgICAgICAgICAgICAgIlwiZW5hYmxlZFwiKS5cbiIsCisgICAgICAgICAgICBvbXB0X2Vudl92YXIpOworICAgIGJyZWFrOworICB9CisjaWYgT01QVF9ERUJVRworICBwcmludGYoIm9tcHRfcHJlX2luaXQoKTogb21wdF9lbmFibGVkID0gJWRcbiIsIG9tcHRfZW5hYmxlZCk7CisjZW5kaWYKK30KKwordm9pZCBvbXB0X3Bvc3RfaW5pdCgpIHsKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBFeGVjdXRlIHRoZSBwb3N0LWluaXRpYWxpemF0aW9uIGxvZ2ljIG9ubHkgb25jZS4KKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBzdGF0aWMgaW50IG9tcHRfcG9zdF9pbml0aWFsaXplZCA9IDA7CisKKyAgaWYgKG9tcHRfcG9zdF9pbml0aWFsaXplZCkKKyAgICByZXR1cm47CisKKyAgb21wdF9wb3N0X2luaXRpYWxpemVkID0gMTsKKworICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIEluaXRpYWxpemUgdGhlIHRvb2wgaWYgc28gaW5kaWNhdGVkLgorICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICBvbXB0X2luaXRpYWxpemVfZm4ob21wdF9mbl9sb29rdXAsIG9tcHRfZ2V0X3J1bnRpbWVfdmVyc2lvbigpLAorICAgICAgICAgICAgICAgICAgICAgICBPTVBUX1ZFUlNJT04pOworCisgICAgb21wdF90aHJlYWRfdCAqcm9vdF90aHJlYWQgPSBvbXB0X2dldF90aHJlYWQoKTsKKworICAgIG9tcHRfc2V0X3RocmVhZF9zdGF0ZShyb290X3RocmVhZCwgb21wdF9zdGF0ZV9vdmVyaGVhZCk7CisKKyAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3RocmVhZF9iZWdpbikpIHsKKyAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90aHJlYWRfYmVnaW4pKAorICAgICAgICAgIG9tcHRfdGhyZWFkX2luaXRpYWwsIG9tcHRfZ2V0X3RocmVhZF9pZCgpKTsKKyAgICB9CisKKyAgICBvbXB0X3NldF90aHJlYWRfc3RhdGUocm9vdF90aHJlYWQsIG9tcHRfc3RhdGVfd29ya19zZXJpYWwpOworICB9Cit9CisKK3ZvaWQgb21wdF9maW5pKCkgeworICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9ydW50aW1lX3NodXRkb3duKSkgeworICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3J1bnRpbWVfc2h1dGRvd24pKCk7CisgICAgfQorICB9CisKKyAgb21wdF9lbmFibGVkID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBpbnRlcmZhY2Ugb3BlcmF0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc3RhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitPTVBUX0FQSV9ST1VUSU5FIGludCBvbXB0X2VudW1lcmF0ZV9zdGF0ZShpbnQgY3VycmVudF9zdGF0ZSwgaW50ICpuZXh0X3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKm5leHRfc3RhdGVfbmFtZSkgeworICBjb25zdCBzdGF0aWMgaW50IGxlbiA9IHNpemVvZihvbXB0X3N0YXRlX2luZm8pIC8gc2l6ZW9mKG9tcHRfc3RhdGVfaW5mb190KTsKKyAgaW50IGkgPSAwOworCisgIGZvciAoaSA9IDA7IGkgPCBsZW4gLSAxOyBpKyspIHsKKyAgICBpZiAob21wdF9zdGF0ZV9pbmZvW2ldLnN0YXRlX2lkID09IGN1cnJlbnRfc3RhdGUpIHsKKyAgICAgICpuZXh0X3N0YXRlID0gb21wdF9zdGF0ZV9pbmZvW2kgKyAxXS5zdGF0ZV9pZDsKKyAgICAgICpuZXh0X3N0YXRlX25hbWUgPSBvbXB0X3N0YXRlX2luZm9baSArIDFdLnN0YXRlX25hbWU7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0KKworICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjYWxsYmFja3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitPTVBUX0FQSV9ST1VUSU5FIGludCBvbXB0X3NldF9jYWxsYmFjayhvbXB0X2V2ZW50X3QgZXZpZCwgb21wdF9jYWxsYmFja190IGNiKSB7CisgIHN3aXRjaCAoZXZpZCkgeworCisjZGVmaW5lIG9tcHRfZXZlbnRfbWFjcm8oZXZlbnRfbmFtZSwgY2FsbGJhY2tfdHlwZSwgZXZlbnRfaWQpICAgICAgICAgICAgICAgICAgXAorICBjYXNlIGV2ZW50X25hbWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAob21wdF9ldmVudF9pbXBsZW1lbnRhdGlvbl9zdGF0dXMoZXZlbnRfbmFtZSkpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKGV2ZW50X25hbWUpID0gKGNhbGxiYWNrX3R5cGUpY2I7ICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gb21wdF9ldmVudF9pbXBsZW1lbnRhdGlvbl9zdGF0dXMoZXZlbnRfbmFtZSk7CisKKyAgICBGT1JFQUNIX09NUFRfRVZFTlQob21wdF9ldmVudF9tYWNybykKKworI3VuZGVmIG9tcHRfZXZlbnRfbWFjcm8KKworICBkZWZhdWx0OgorICAgIHJldHVybiBvbXB0X3NldF9yZXN1bHRfcmVnaXN0cmF0aW9uX2Vycm9yOworICB9Cit9CisKK09NUFRfQVBJX1JPVVRJTkUgaW50IG9tcHRfZ2V0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdCBldmlkLCBvbXB0X2NhbGxiYWNrX3QgKmNiKSB7CisgIHN3aXRjaCAoZXZpZCkgeworCisjZGVmaW5lIG9tcHRfZXZlbnRfbWFjcm8oZXZlbnRfbmFtZSwgY2FsbGJhY2tfdHlwZSwgZXZlbnRfaWQpICAgICAgICAgICAgICAgICAgXAorICBjYXNlIGV2ZW50X25hbWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAob21wdF9ldmVudF9pbXBsZW1lbnRhdGlvbl9zdGF0dXMoZXZlbnRfbmFtZSkpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBvbXB0X2NhbGxiYWNrX3QgbXljYiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChvbXB0X2NhbGxiYWNrX3Qpb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhldmVudF9uYW1lKTsgICAgICAgICAgIFwKKyAgICAgIGlmIChteWNiKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICpjYiA9IG15Y2I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gb21wdF9nZXRfY2FsbGJhY2tfc3VjY2VzczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBvbXB0X2dldF9jYWxsYmFja19mYWlsdXJlOworCisgICAgRk9SRUFDSF9PTVBUX0VWRU5UKG9tcHRfZXZlbnRfbWFjcm8pCisKKyN1bmRlZiBvbXB0X2V2ZW50X21hY3JvCisKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gb21wdF9nZXRfY2FsbGJhY2tfZmFpbHVyZTsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHBhcmFsbGVsIHJlZ2lvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitPTVBUX0FQSV9ST1VUSU5FIG9tcHRfcGFyYWxsZWxfaWRfdCBvbXB0X2dldF9wYXJhbGxlbF9pZChpbnQgYW5jZXN0b3JfbGV2ZWwpIHsKKyAgcmV0dXJuIF9fb21wdF9nZXRfcGFyYWxsZWxfaWRfaW50ZXJuYWwoYW5jZXN0b3JfbGV2ZWwpOworfQorCitPTVBUX0FQSV9ST1VUSU5FIGludCBvbXB0X2dldF9wYXJhbGxlbF90ZWFtX3NpemUoaW50IGFuY2VzdG9yX2xldmVsKSB7CisgIHJldHVybiBfX29tcHRfZ2V0X3BhcmFsbGVsX3RlYW1fc2l6ZV9pbnRlcm5hbChhbmNlc3Rvcl9sZXZlbCk7Cit9CisKK09NUFRfQVBJX1JPVVRJTkUgdm9pZCAqb21wdF9nZXRfcGFyYWxsZWxfZnVuY3Rpb24oaW50IGFuY2VzdG9yX2xldmVsKSB7CisgIHJldHVybiBfX29tcHRfZ2V0X3BhcmFsbGVsX2Z1bmN0aW9uX2ludGVybmFsKGFuY2VzdG9yX2xldmVsKTsKK30KKworT01QVF9BUElfUk9VVElORSBvbXB0X3N0YXRlX3Qgb21wdF9nZXRfc3RhdGUob21wdF93YWl0X2lkX3QgKm9tcHRfd2FpdF9pZCkgeworICBvbXB0X3N0YXRlX3QgdGhyZWFkX3N0YXRlID0gX19vbXB0X2dldF9zdGF0ZV9pbnRlcm5hbChvbXB0X3dhaXRfaWQpOworCisgIGlmICh0aHJlYWRfc3RhdGUgPT0gb21wdF9zdGF0ZV91bmRlZmluZWQpIHsKKyAgICB0aHJlYWRfc3RhdGUgPSBvbXB0X3N0YXRlX3dvcmtfc2VyaWFsOworICB9CisKKyAgcmV0dXJuIHRocmVhZF9zdGF0ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB0aHJlYWRzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworT01QVF9BUElfUk9VVElORSB2b2lkICpvbXB0X2dldF9pZGxlX2ZyYW1lKCkgeworICByZXR1cm4gX19vbXB0X2dldF9pZGxlX2ZyYW1lX2ludGVybmFsKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogdGFza3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitPTVBUX0FQSV9ST1VUSU5FIG9tcHRfdGhyZWFkX2lkX3Qgb21wdF9nZXRfdGhyZWFkX2lkKHZvaWQpIHsKKyAgcmV0dXJuIF9fb21wdF9nZXRfdGhyZWFkX2lkX2ludGVybmFsKCk7Cit9CisKK09NUFRfQVBJX1JPVVRJTkUgb21wdF90YXNrX2lkX3Qgb21wdF9nZXRfdGFza19pZChpbnQgZGVwdGgpIHsKKyAgcmV0dXJuIF9fb21wdF9nZXRfdGFza19pZF9pbnRlcm5hbChkZXB0aCk7Cit9CisKK09NUFRfQVBJX1JPVVRJTkUgb21wdF9mcmFtZV90ICpvbXB0X2dldF90YXNrX2ZyYW1lKGludCBkZXB0aCkgeworICByZXR1cm4gX19vbXB0X2dldF90YXNrX2ZyYW1lX2ludGVybmFsKGRlcHRoKTsKK30KKworT01QVF9BUElfUk9VVElORSB2b2lkICpvbXB0X2dldF90YXNrX2Z1bmN0aW9uKGludCBkZXB0aCkgeworICByZXR1cm4gX19vbXB0X2dldF90YXNrX2Z1bmN0aW9uX2ludGVybmFsKGRlcHRoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwbGFjZWhvbGRlcnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBEb24ndCBkZWZpbmUgdGhpcyBhcyBzdGF0aWMuIFRoZSBsb2FkZXIgbWF5IGNob29zZSB0byBlbGltaW5hdGUgdGhlIHN5bWJvbAorLy8gZXZlbiB0aG91Z2ggaXQgaXMgbmVlZGVkIGJ5IHRvb2xzLgorI2RlZmluZSBPTVBUX0FQSV9QTEFDRUhPTERFUgorCisvLyBFbnN1cmUgdGhhdCBwbGFjZWhvbGRlcnMgZG9uJ3QgaGF2ZSBtYW5nbGVkIG5hbWVzIGluIHRoZSBzeW1ib2wgdGFibGUuCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK09NUFRfQVBJX1BMQUNFSE9MREVSIHZvaWQgb21wdF9pZGxlKHZvaWQpIHsKKyAgLy8gVGhpcyBmdW5jdGlvbiBpcyBhIHBsYWNlaG9sZGVyIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBjYWxsaW5nIGNvbnRleHQgb2YKKyAgLy8gaWRsZSBPcGVuTVAgd29ya2VyIHRocmVhZHMuIEl0IGlzIG5vdCBtZWFudCB0byBiZSBpbnZva2VkLgorICBhc3NlcnQoMCk7Cit9CisKK09NUFRfQVBJX1BMQUNFSE9MREVSIHZvaWQgb21wdF9vdmVyaGVhZCh2b2lkKSB7CisgIC8vIFRoaXMgZnVuY3Rpb24gaXMgYSBwbGFjZWhvbGRlciB1c2VkIHRvIHJlcHJlc2VudCB0aGUgT3Blbk1QIGNvbnRleHQgb2YKKyAgLy8gdGhyZWFkcyB3b3JraW5nIGluIHRoZSBPcGVuTVAgcnVudGltZS4gIEl0IGlzIG5vdCBtZWFudCB0byBiZSBpbnZva2VkLgorICBhc3NlcnQoMCk7Cit9CisKK09NUFRfQVBJX1BMQUNFSE9MREVSIHZvaWQgb21wdF9iYXJyaWVyX3dhaXQodm9pZCkgeworICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGEgcGxhY2Vob2xkZXIgdXNlZCB0byByZXByZXNlbnQgdGhlIE9wZW5NUCBjb250ZXh0IG9mCisgIC8vIHRocmVhZHMgd2FpdGluZyBmb3IgYSBiYXJyaWVyIGluIHRoZSBPcGVuTVAgcnVudGltZS4gSXQgaXMgbm90IG1lYW50CisgIC8vIHRvIGJlIGludm9rZWQuCisgIGFzc2VydCgwKTsKK30KKworT01QVF9BUElfUExBQ0VIT0xERVIgdm9pZCBvbXB0X3Rhc2tfd2FpdCh2b2lkKSB7CisgIC8vIFRoaXMgZnVuY3Rpb24gaXMgYSBwbGFjZWhvbGRlciB1c2VkIHRvIHJlcHJlc2VudCB0aGUgT3Blbk1QIGNvbnRleHQgb2YKKyAgLy8gdGhyZWFkcyB3YWl0aW5nIGZvciBhIHRhc2sgaW4gdGhlIE9wZW5NUCBydW50aW1lLiBJdCBpcyBub3QgbWVhbnQKKyAgLy8gdG8gYmUgaW52b2tlZC4KKyAgYXNzZXJ0KDApOworfQorCitPTVBUX0FQSV9QTEFDRUhPTERFUiB2b2lkIG9tcHRfbXV0ZXhfd2FpdCh2b2lkKSB7CisgIC8vIFRoaXMgZnVuY3Rpb24gaXMgYSBwbGFjZWhvbGRlciB1c2VkIHRvIHJlcHJlc2VudCB0aGUgT3Blbk1QIGNvbnRleHQgb2YKKyAgLy8gdGhyZWFkcyB3YWl0aW5nIGZvciBhIG11dGV4IGluIHRoZSBPcGVuTVAgcnVudGltZS4gSXQgaXMgbm90IG1lYW50CisgIC8vIHRvIGJlIGludm9rZWQuCisgIGFzc2VydCgwKTsKK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY29tcGF0YWJpbGl0eQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK09NUFRfQVBJX1JPVVRJTkUgaW50IG9tcHRfZ2V0X29tcHRfdmVyc2lvbigpIHsgcmV0dXJuIE9NUFRfVkVSU0lPTjsgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGFwcGxpY2F0aW9uLWZhY2luZyBBUEkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB8IGNvbnRyb2wKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitfT01QX0VYVEVSTiB2b2lkIG9tcHRfY29udHJvbCh1aW50NjRfdCBjb21tYW5kLCB1aW50NjRfdCBtb2RpZmllcikgeworICBpZiAob21wdF9lbmFibGVkICYmIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9jb250cm9sKSkgeworICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9jb250cm9sKShjb21tYW5kLCBtb2RpZmllcik7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBUEkgaW5xdWlyeSBmb3IgdG9vbAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBvbXB0X2ludGVyZmFjZV9mbl90IG9tcHRfZm5fbG9va3VwKGNvbnN0IGNoYXIgKnMpIHsKKworI2RlZmluZSBvbXB0X2ludGVyZmFjZV9mbihmbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKHN0cmNtcChzLCAjZm4pID09IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIChvbXB0X2ludGVyZmFjZV9mbl90KWZuOworCisgIEZPUkVBQ0hfT01QVF9JTlFVSVJZX0ZOKG9tcHRfaW50ZXJmYWNlX2ZuKQorCisgIEZPUkVBQ0hfT01QVF9QTEFDRUhPTERFUl9GTihvbXB0X2ludGVyZmFjZV9mbikKKworICByZXR1cm4gKG9tcHRfaW50ZXJmYWNlX2ZuX3QpMDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL29tcHQtaW50ZXJuYWwuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL29tcHQtaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDkyOWVmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvb21wdC1pbnRlcm5hbC5oCkBAIC0wLDAgKzEsODUgQEAKKyNpZm5kZWYgX19PTVBUX0lOVEVSTkFMX0hfXworI2RlZmluZSBfX09NUFRfSU5URVJOQUxfSF9fCisKKyNpbmNsdWRlICJvbXB0LWV2ZW50LXNwZWNpZmljLmgiCisjaW5jbHVkZSAib21wdC5oIgorCisjZGVmaW5lIE9NUFRfVkVSU0lPTiAxCisKKyNkZWZpbmUgX09NUF9FWFRFUk4gZXh0ZXJuICJDIgorCisjZGVmaW5lIE9NUFRfSU5WT0tFUih4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKHggPT0gZm9ya19jb250ZXh0X2dudSkgPyBvbXB0X2ludm9rZXJfcHJvZ3JhbSA6IG9tcHRfaW52b2tlcl9ydW50aW1lKQorCisjZGVmaW5lIG9tcHRfY2FsbGJhY2soZSkgZSMjX2NhbGxiYWNrCisKK3R5cGVkZWYgc3RydWN0IG9tcHRfY2FsbGJhY2tzX3MgeworI2RlZmluZSBvbXB0X2V2ZW50X21hY3JvKGV2ZW50LCBjYWxsYmFjaywgZXZlbnRpZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2FsbGJhY2sgb21wdF9jYWxsYmFjayhldmVudCk7CisKKyAgRk9SRUFDSF9PTVBUX0VWRU5UKG9tcHRfZXZlbnRfbWFjcm8pCisKKyN1bmRlZiBvbXB0X2V2ZW50X21hY3JvCit9IG9tcHRfY2FsbGJhY2tzX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgb21wdF9mcmFtZV90IGZyYW1lOworICB2b2lkICpmdW5jdGlvbjsKKyAgb21wdF90YXNrX2lkX3QgdGFza19pZDsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICBpbnQgbmRlcHM7CisgIG9tcHRfdGFza19kZXBlbmRlbmNlX3QgKmRlcHM7CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KK30gb21wdF90YXNrX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQ7CisgIHZvaWQgKm1pY3JvdGFzazsKK30gb21wdF90ZWFtX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3Qgb21wdF9sd190YXNrdGVhbV9zIHsKKyAgb21wdF90ZWFtX2luZm9fdCBvbXB0X3RlYW1faW5mbzsKKyAgb21wdF90YXNrX2luZm9fdCBvbXB0X3Rhc2tfaW5mbzsKKyAgc3RydWN0IG9tcHRfbHdfdGFza3RlYW1fcyAqcGFyZW50OworfSBvbXB0X2x3X3Rhc2t0ZWFtX3Q7CisKK3R5cGVkZWYgc3RydWN0IG9tcHRfcGFyYWxsZWxfaW5mb19zIHsKKyAgb21wdF90YXNrX2lkX3QgcGFyZW50X3Rhc2tfaWQ7IC8qIGlkIG9mIHBhcmVudCB0YXNrICAgICAgICAgICAgKi8KKyAgb21wdF9wYXJhbGxlbF9pZF90IHBhcmFsbGVsX2lkOyAvKiBpZCBvZiBwYXJhbGxlbCByZWdpb24gICAgICAgICovCisgIG9tcHRfZnJhbWVfdCAqcGFyZW50X3Rhc2tfZnJhbWU7IC8qIGZyYW1lIGRhdGEgb2YgcGFyZW50IHRhc2sgICAgKi8KKyAgdm9pZCAqcGFyYWxsZWxfZnVuY3Rpb247IC8qIHBvaW50ZXIgdG8gb3V0bGluZWQgZnVuY3Rpb24gKi8KK30gb21wdF9wYXJhbGxlbF9pbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgb21wdF9zdGF0ZV90IHN0YXRlOworICBvbXB0X3dhaXRfaWRfdCB3YWl0X2lkOworICB2b2lkICppZGxlX2ZyYW1lOworfSBvbXB0X3RocmVhZF9pbmZvX3Q7CisKK2V4dGVybiBvbXB0X2NhbGxiYWNrc190IG9tcHRfY2FsbGJhY2tzOworCisjaWYgT01QXzQwX0VOQUJMRUQgJiYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyNkZWZpbmUgS01QX09NUFRfREVQU19BTExPQyBfX2ttcF9mYXN0X2FsbG9jYXRlCisjZGVmaW5lIEtNUF9PTVBUX0RFUFNfRlJFRSBfX2ttcF9mYXN0X2ZyZWUKKyNlbHNlCisjZGVmaW5lIEtNUF9PTVBUX0RFUFNfQUxMT0MgX19rbXBfdGhyZWFkX21hbGxvYworI2RlZmluZSBLTVBfT01QVF9ERVBTX0ZSRUUgX19rbXBfdGhyZWFkX2ZyZWUKKyNlbmRpZgorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICYmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordm9pZCBvbXB0X3ByZV9pbml0KHZvaWQpOwordm9pZCBvbXB0X3Bvc3RfaW5pdCh2b2lkKTsKK3ZvaWQgb21wdF9maW5pKHZvaWQpOworCitleHRlcm4gaW50IG9tcHRfZW5hYmxlZDsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvb21wdC1zcGVjaWZpYy5jcHAgYi9maW5hbC9ydW50aW1lL3NyYy9vbXB0LXNwZWNpZmljLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTBkMWVlCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvb21wdC1zcGVjaWZpYy5jcHAKQEAgLTAsMCArMSwyODIgQEAKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBpbmNsdWRlIGZpbGVzCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAib21wdC1pbnRlcm5hbC5oIgorI2luY2x1ZGUgIm9tcHQtc3BlY2lmaWMuaCIKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIG1hY3JvcworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworI2RlZmluZSBHVElEX1RPX09NUFRfVEhSRUFEX0lEKGlkKSAoKG9tcHRfdGhyZWFkX2lkX3QpKGlkID49IDApID8gaWQgKyAxIDogMCkKKworI2RlZmluZSBMV1RfRlJPTV9URUFNKHRlYW0pICh0ZWFtKS0+dC5vbXB0X3NlcmlhbGl6ZWRfdGVhbV9pbmZvOworCisjZGVmaW5lIE9NUFRfVEhSRUFEX0lEX0JJVFMgMTYKKworLy8gMjAxMyAwOCAyNCAtIEpvaG4gTWVsbG9yLUNydW1tZXkKKy8vICAgaWRlYWxseSwgYSB0aHJlYWQgc2hvdWxkIGFzc2lnbiBpdHMgb3duIGlkcyBiYXNlZCBvbiB0aHJlYWQgcHJpdmF0ZSBkYXRhLgorLy8gICBob3dldmVyLCB0aGUgd2F5IHRoZSBpbnRlbCBydW50aW1lIHJlaW5pdGlhbGl6ZXMgdGhyZWFkIGRhdGEgc3RydWN0dXJlcworLy8gICB3aGVuIGl0IGNyZWF0ZXMgdGVhbXMgbWFrZXMgaXQgZGlmZmljdWx0IHRvIG1haW50YWluIHBlcnNpc3RlbnQgdGhyZWFkCisvLyAgIGRhdGEuIHVzaW5nIGEgc2hhcmVkIHZhcmlhYmxlIGluc3RlYWQgaXMgc2ltcGxlLiBJIGxlYXZlIGl0IHRvIGludGVsIHRvCisvLyAgIHNvcnQgb3V0IGhvdyB0byBpbXBsZW1lbnQgYSBoaWdoZXIgcGVyZm9ybWFuY2UgdmVyc2lvbiBpbiB0aGVpciBydW50aW1lLgorCisvLyB3aGVuIHVzaW5nIGZldGNoX2FuZF9hZGQgdG8gZ2VuZXJhdGUgdGhlIElEcywgdGhlcmUgaXNuJ3QgYW55IHJlYXNvbiB0byB3YXN0ZQorLy8gYml0cyBmb3IgdGhyZWFkIGlkLgorI2lmIDAKKyNkZWZpbmUgTkVYVF9JRChpZF9wdHIsIHRpZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICgoS01QX1RFU1RfVEhFTl9JTkM2NChpZF9wdHIpIDw8IE9NUFRfVEhSRUFEX0lEX0JJVFMpIHwgKHRpZCkpCisjZWxzZQorI2RlZmluZSBORVhUX0lEKGlkX3B0ciwgdGlkKSAoS01QX1RFU1RfVEhFTl9JTkM2NCgodm9sYXRpbGUga21wX2ludDY0ICopaWRfcHRyKSkKKyNlbmRpZgorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gcHJpdmF0ZSBvcGVyYXRpb25zCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHRyYXZlcnNlIHRoZSB0ZWFtIGFuZCB0YXNrIGhpZXJhcmNoeQorLy8gbm90ZTogX19vbXB0X2dldF90ZWFtaW5mbyBhbmQgX19vbXB0X2dldF90YXNraW5mbworLy8gICAgICAgdHJhdmVyc2UgdGhlIGhpZXJhcmNoeSBzaW1pbGFybHkgYW5kIG5lZWQgdG8gYmUKKy8vICAgICAgIGtlcHQgY29uc2lzdGVudAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK29tcHRfdGVhbV9pbmZvX3QgKl9fb21wdF9nZXRfdGVhbWluZm8oaW50IGRlcHRoLCBpbnQgKnNpemUpIHsKKyAga21wX2luZm9fdCAqdGhyID0gb21wdF9nZXRfdGhyZWFkKCk7CisKKyAgaWYgKHRocikgeworICAgIGttcF90ZWFtICp0ZWFtID0gdGhyLT50aC50aF90ZWFtOworICAgIGlmICh0ZWFtID09IE5VTEwpCisgICAgICByZXR1cm4gTlVMTDsKKworICAgIG9tcHRfbHdfdGFza3RlYW1fdCAqbHd0ID0gTFdUX0ZST01fVEVBTSh0ZWFtKTsKKworICAgIHdoaWxlIChkZXB0aCA+IDApIHsKKyAgICAgIC8vIG5leHQgbGlnaHR3ZWlnaHQgdGVhbSAoaWYgYW55KQorICAgICAgaWYgKGx3dCkKKyAgICAgICAgbHd0ID0gbHd0LT5wYXJlbnQ7CisKKyAgICAgIC8vIG5leHQgaGVhdnl3ZWlnaHQgdGVhbSAoaWYgYW55KSBhZnRlcgorICAgICAgLy8gbGlnaHR3ZWlnaHQgdGVhbXMgYXJlIGV4aGF1c3RlZAorICAgICAgaWYgKCFsd3QgJiYgdGVhbSkgeworICAgICAgICB0ZWFtID0gdGVhbS0+dC50X3BhcmVudDsKKyAgICAgICAgaWYgKHRlYW0pIHsKKyAgICAgICAgICBsd3QgPSBMV1RfRlJPTV9URUFNKHRlYW0pOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGRlcHRoLS07CisgICAgfQorCisgICAgaWYgKGx3dCkgeworICAgICAgLy8gbGlnaHR3ZWlnaHQgdGVhbXMgaGF2ZSBvbmUgdGFzaworICAgICAgaWYgKHNpemUpCisgICAgICAgICpzaXplID0gMTsKKworICAgICAgLy8gcmV0dXJuIHRlYW0gaW5mbyBmb3IgbGlnaHR3ZWlnaHQgdGVhbQorICAgICAgcmV0dXJuICZsd3QtPm9tcHRfdGVhbV9pbmZvOworICAgIH0gZWxzZSBpZiAodGVhbSkgeworICAgICAgLy8gZXh0cmFjdCBzaXplIGZyb20gaGVhdnl3ZWlnaHQgdGVhbQorICAgICAgaWYgKHNpemUpCisgICAgICAgICpzaXplID0gdGVhbS0+dC50X25wcm9jOworCisgICAgICAvLyByZXR1cm4gdGVhbSBpbmZvIGZvciBoZWF2eXdlaWdodCB0ZWFtCisgICAgICByZXR1cm4gJnRlYW0tPnQub21wdF90ZWFtX2luZm87CisgICAgfQorICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK29tcHRfdGFza19pbmZvX3QgKl9fb21wdF9nZXRfdGFza2luZm8oaW50IGRlcHRoKSB7CisgIG9tcHRfdGFza19pbmZvX3QgKmluZm8gPSBOVUxMOworICBrbXBfaW5mb190ICp0aHIgPSBvbXB0X2dldF90aHJlYWQoKTsKKworICBpZiAodGhyKSB7CisgICAga21wX3Rhc2tkYXRhX3QgKnRhc2tkYXRhID0gdGhyLT50aC50aF9jdXJyZW50X3Rhc2s7CisgICAgb21wdF9sd190YXNrdGVhbV90ICpsd3QgPSBMV1RfRlJPTV9URUFNKHRhc2tkYXRhLT50ZF90ZWFtKTsKKworICAgIHdoaWxlIChkZXB0aCA+IDApIHsKKyAgICAgIC8vIG5leHQgbGlnaHR3ZWlnaHQgdGVhbSAoaWYgYW55KQorICAgICAgaWYgKGx3dCkKKyAgICAgICAgbHd0ID0gbHd0LT5wYXJlbnQ7CisKKyAgICAgIC8vIG5leHQgaGVhdnl3ZWlnaHQgdGVhbSAoaWYgYW55KSBhZnRlcgorICAgICAgLy8gbGlnaHR3ZWlnaHQgdGVhbXMgYXJlIGV4aGF1c3RlZAorICAgICAgaWYgKCFsd3QgJiYgdGFza2RhdGEpIHsKKyAgICAgICAgdGFza2RhdGEgPSB0YXNrZGF0YS0+dGRfcGFyZW50OworICAgICAgICBpZiAodGFza2RhdGEpIHsKKyAgICAgICAgICBsd3QgPSBMV1RfRlJPTV9URUFNKHRhc2tkYXRhLT50ZF90ZWFtKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZGVwdGgtLTsKKyAgICB9CisKKyAgICBpZiAobHd0KSB7CisgICAgICBpbmZvID0gJmx3dC0+b21wdF90YXNrX2luZm87CisgICAgfSBlbHNlIGlmICh0YXNrZGF0YSkgeworICAgICAgaW5mbyA9ICZ0YXNrZGF0YS0+b21wdF90YXNrX2luZm87CisgICAgfQorICB9CisKKyAgcmV0dXJuIGluZm87Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBpbnRlcmZhY2Ugb3BlcmF0aW9ucworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0aHJlYWQgc3VwcG9ydAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK29tcHRfcGFyYWxsZWxfaWRfdCBfX29tcHRfdGhyZWFkX2lkX25ldygpIHsKKyAgc3RhdGljIHVpbnQ2NF90IG9tcHRfdGhyZWFkX2lkID0gMTsKKyAgcmV0dXJuIE5FWFRfSUQoJm9tcHRfdGhyZWFkX2lkLCAwKTsKK30KKwordm9pZCBfX29tcHRfdGhyZWFkX2JlZ2luKG9tcHRfdGhyZWFkX3R5cGVfdCB0aHJlYWRfdHlwZSwgaW50IGd0aWQpIHsKKyAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3RocmVhZF9iZWdpbikoCisgICAgICB0aHJlYWRfdHlwZSwgR1RJRF9UT19PTVBUX1RIUkVBRF9JRChndGlkKSk7Cit9CisKK3ZvaWQgX19vbXB0X3RocmVhZF9lbmQob21wdF90aHJlYWRfdHlwZV90IHRocmVhZF90eXBlLCBpbnQgZ3RpZCkgeworICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGhyZWFkX2VuZCkoCisgICAgICB0aHJlYWRfdHlwZSwgR1RJRF9UT19PTVBUX1RIUkVBRF9JRChndGlkKSk7Cit9CisKK29tcHRfdGhyZWFkX2lkX3QgX19vbXB0X2dldF90aHJlYWRfaWRfaW50ZXJuYWwoKSB7CisgIC8vIEZJWE1FOiB1bnRpbCB3ZSBoYXZlIGEgYmV0dGVyIHdheSBvZiBhc3NpZ25pbmcgaWRzLCB1c2UgX19rbXBfZ2V0X2d0aWQKKyAgLy8gc2luY2UgdGhlIHJldHVybiB2YWx1ZSBtaWdodCBiZSBuZWdhdGl2ZSwgd2UgbmVlZCB0byB0ZXN0IHRoYXQgYmVmb3JlCisgIC8vIGFzc2lnbmluZyBpdCB0byBhbiBvbXB0X3RocmVhZF9pZF90LCB3aGljaCBpcyB1bnNpZ25lZC4KKyAgaW50IGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgYXNzZXJ0KGlkID49IDApOworCisgIHJldHVybiBHVElEX1RPX09NUFRfVEhSRUFEX0lEKGlkKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBzdGF0ZSBzdXBwb3J0CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBfX29tcHRfdGhyZWFkX2Fzc2lnbl93YWl0X2lkKHZvaWQgKnZhcmlhYmxlKSB7CisgIGludCBndGlkID0gX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKTsKKyAga21wX2luZm9fdCAqdGkgPSBvbXB0X2dldF90aHJlYWRfZ3RpZChndGlkKTsKKworICB0aS0+dGgub21wdF90aHJlYWRfaW5mby53YWl0X2lkID0gKG9tcHRfd2FpdF9pZF90KXZhcmlhYmxlOworfQorCitvbXB0X3N0YXRlX3QgX19vbXB0X2dldF9zdGF0ZV9pbnRlcm5hbChvbXB0X3dhaXRfaWRfdCAqb21wdF93YWl0X2lkKSB7CisgIGttcF9pbmZvX3QgKnRpID0gb21wdF9nZXRfdGhyZWFkKCk7CisKKyAgaWYgKHRpKSB7CisgICAgaWYgKG9tcHRfd2FpdF9pZCkKKyAgICAgICpvbXB0X3dhaXRfaWQgPSB0aS0+dGgub21wdF90aHJlYWRfaW5mby53YWl0X2lkOworICAgIHJldHVybiB0aS0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZTsKKyAgfQorICByZXR1cm4gb21wdF9zdGF0ZV91bmRlZmluZWQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gaWRsZSBmcmFtZSBzdXBwb3J0CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCAqX19vbXB0X2dldF9pZGxlX2ZyYW1lX2ludGVybmFsKHZvaWQpIHsKKyAga21wX2luZm9fdCAqdGkgPSBvbXB0X2dldF90aHJlYWQoKTsKKyAgcmV0dXJuIHRpID8gdGktPnRoLm9tcHRfdGhyZWFkX2luZm8uaWRsZV9mcmFtZSA6IE5VTEw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcGFyYWxsZWwgcmVnaW9uIHN1cHBvcnQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitvbXB0X3BhcmFsbGVsX2lkX3QgX19vbXB0X3BhcmFsbGVsX2lkX25ldyhpbnQgZ3RpZCkgeworICBzdGF0aWMgdWludDY0X3Qgb21wdF9wYXJhbGxlbF9pZCA9IDE7CisgIHJldHVybiBndGlkID49IDAgPyBORVhUX0lEKCZvbXB0X3BhcmFsbGVsX2lkLCBndGlkKSA6IDA7Cit9CisKK3ZvaWQgKl9fb21wdF9nZXRfcGFyYWxsZWxfZnVuY3Rpb25faW50ZXJuYWwoaW50IGRlcHRoKSB7CisgIG9tcHRfdGVhbV9pbmZvX3QgKmluZm8gPSBfX29tcHRfZ2V0X3RlYW1pbmZvKGRlcHRoLCBOVUxMKTsKKyAgdm9pZCAqZnVuY3Rpb24gPSBpbmZvID8gaW5mby0+bWljcm90YXNrIDogTlVMTDsKKyAgcmV0dXJuIGZ1bmN0aW9uOworfQorCitvbXB0X3BhcmFsbGVsX2lkX3QgX19vbXB0X2dldF9wYXJhbGxlbF9pZF9pbnRlcm5hbChpbnQgZGVwdGgpIHsKKyAgb21wdF90ZWFtX2luZm9fdCAqaW5mbyA9IF9fb21wdF9nZXRfdGVhbWluZm8oZGVwdGgsIE5VTEwpOworICBvbXB0X3BhcmFsbGVsX2lkX3QgaWQgPSBpbmZvID8gaW5mby0+cGFyYWxsZWxfaWQgOiAwOworICByZXR1cm4gaWQ7Cit9CisKK2ludCBfX29tcHRfZ2V0X3BhcmFsbGVsX3RlYW1fc2l6ZV9pbnRlcm5hbChpbnQgZGVwdGgpIHsKKyAgLy8gaW5pdGlhbGl6ZSB0aGUgcmV0dXJuIHZhbHVlIHdpdGggdGhlIGVycm9yIHZhbHVlLgorICAvLyBpZiB0aGVyZSBpcyBhIHRlYW0gYXQgdGhlIHNwZWNpZmllZCBkZXB0aCwgdGhlIGRlZmF1bHQKKyAgLy8gdmFsdWUgd2lsbCBiZSBvdmVyd3JpdHRlbiB0aGUgc2l6ZSBvZiB0aGF0IHRlYW0uCisgIGludCBzaXplID0gLTE7CisgICh2b2lkKV9fb21wdF9nZXRfdGVhbWluZm8oZGVwdGgsICZzaXplKTsKKyAgcmV0dXJuIHNpemU7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbGlnaHR3ZWlnaHQgdGFzayB0ZWFtIHN1cHBvcnQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIF9fb21wdF9sd190YXNrdGVhbV9pbml0KG9tcHRfbHdfdGFza3RlYW1fdCAqbHd0LCBrbXBfaW5mb190ICp0aHIsIGludCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptaWNyb3Rhc2ssIG9tcHRfcGFyYWxsZWxfaWRfdCBvbXB0X3BpZCkgeworICBsd3QtPm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkID0gb21wdF9waWQ7CisgIGx3dC0+b21wdF90ZWFtX2luZm8ubWljcm90YXNrID0gbWljcm90YXNrOworICBsd3QtPm9tcHRfdGFza19pbmZvLnRhc2tfaWQgPSAwOworICBsd3QtPm9tcHRfdGFza19pbmZvLmZyYW1lLnJlZW50ZXJfcnVudGltZV9mcmFtZSA9IE5VTEw7CisgIGx3dC0+b21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lID0gTlVMTDsKKyAgbHd0LT5vbXB0X3Rhc2tfaW5mby5mdW5jdGlvbiA9IE5VTEw7CisgIGx3dC0+cGFyZW50ID0gMDsKK30KKwordm9pZCBfX29tcHRfbHdfdGFza3RlYW1fbGluayhvbXB0X2x3X3Rhc2t0ZWFtX3QgKmx3dCwga21wX2luZm9fdCAqdGhyKSB7CisgIG9tcHRfbHdfdGFza3RlYW1fdCAqbXlfcGFyZW50ID0gdGhyLT50aC50aF90ZWFtLT50Lm9tcHRfc2VyaWFsaXplZF90ZWFtX2luZm87CisgIGx3dC0+cGFyZW50ID0gbXlfcGFyZW50OworICB0aHItPnRoLnRoX3RlYW0tPnQub21wdF9zZXJpYWxpemVkX3RlYW1faW5mbyA9IGx3dDsKK30KKworb21wdF9sd190YXNrdGVhbV90ICpfX29tcHRfbHdfdGFza3RlYW1fdW5saW5rKGttcF9pbmZvX3QgKnRocikgeworICBvbXB0X2x3X3Rhc2t0ZWFtX3QgKmx3dGFzayA9IHRoci0+dGgudGhfdGVhbS0+dC5vbXB0X3NlcmlhbGl6ZWRfdGVhbV9pbmZvOworICBpZiAobHd0YXNrKQorICAgIHRoci0+dGgudGhfdGVhbS0+dC5vbXB0X3NlcmlhbGl6ZWRfdGVhbV9pbmZvID0gbHd0YXNrLT5wYXJlbnQ7CisgIHJldHVybiBsd3Rhc2s7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdGFzayBzdXBwb3J0CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworb21wdF90YXNrX2lkX3QgX19vbXB0X3Rhc2tfaWRfbmV3KGludCBndGlkKSB7CisgIHN0YXRpYyB1aW50NjRfdCBvbXB0X3Rhc2tfaWQgPSAxOworICByZXR1cm4gTkVYVF9JRCgmb21wdF90YXNrX2lkLCBndGlkKTsKK30KKworb21wdF90YXNrX2lkX3QgX19vbXB0X2dldF90YXNrX2lkX2ludGVybmFsKGludCBkZXB0aCkgeworICBvbXB0X3Rhc2tfaW5mb190ICppbmZvID0gX19vbXB0X2dldF90YXNraW5mbyhkZXB0aCk7CisgIG9tcHRfdGFza19pZF90IHRhc2tfaWQgPSBpbmZvID8gaW5mby0+dGFza19pZCA6IDA7CisgIHJldHVybiB0YXNrX2lkOworfQorCit2b2lkICpfX29tcHRfZ2V0X3Rhc2tfZnVuY3Rpb25faW50ZXJuYWwoaW50IGRlcHRoKSB7CisgIG9tcHRfdGFza19pbmZvX3QgKmluZm8gPSBfX29tcHRfZ2V0X3Rhc2tpbmZvKGRlcHRoKTsKKyAgdm9pZCAqZnVuY3Rpb24gPSBpbmZvID8gaW5mby0+ZnVuY3Rpb24gOiBOVUxMOworICByZXR1cm4gZnVuY3Rpb247Cit9CisKK29tcHRfZnJhbWVfdCAqX19vbXB0X2dldF90YXNrX2ZyYW1lX2ludGVybmFsKGludCBkZXB0aCkgeworICBvbXB0X3Rhc2tfaW5mb190ICppbmZvID0gX19vbXB0X2dldF90YXNraW5mbyhkZXB0aCk7CisgIG9tcHRfZnJhbWVfdCAqZnJhbWUgPSBpbmZvID8gZnJhbWUgPSAmaW5mby0+ZnJhbWUgOiBOVUxMOworICByZXR1cm4gZnJhbWU7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdGVhbSBzdXBwb3J0CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBfX29tcHRfdGVhbV9hc3NpZ25faWQoa21wX3RlYW1fdCAqdGVhbSwgb21wdF9wYXJhbGxlbF9pZF90IG9tcHRfcGlkKSB7CisgIHRlYW0tPnQub21wdF90ZWFtX2luZm8ucGFyYWxsZWxfaWQgPSBvbXB0X3BpZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL29tcHQtc3BlY2lmaWMuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL29tcHQtc3BlY2lmaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGYwOWE0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvb21wdC1zcGVjaWZpYy5oCkBAIC0wLDAgKzEsNzMgQEAKKyNpZm5kZWYgT01QVF9TUEVDSUZJQ19ICisjZGVmaW5lIE9NUFRfU1BFQ0lGSUNfSAorCisjaW5jbHVkZSAia21wLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogdHlwZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIGttcF9pbmZvX3Qgb21wdF90aHJlYWRfdDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBmb3J3YXJkIGRlY2xhcmF0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgX19vbXB0X3RlYW1fYXNzaWduX2lkKGttcF90ZWFtX3QgKnRlYW0sIG9tcHRfcGFyYWxsZWxfaWRfdCBvbXB0X3BpZCk7Cit2b2lkIF9fb21wdF90aHJlYWRfYXNzaWduX3dhaXRfaWQodm9pZCAqdmFyaWFibGUpOworCit2b2lkIF9fb21wdF9sd190YXNrdGVhbV9pbml0KG9tcHRfbHdfdGFza3RlYW1fdCAqbHd0LCBvbXB0X3RocmVhZF90ICp0aHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBndGlkLCB2b2lkICptaWNyb3Rhc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBvbXB0X3BpZCk7CisKK3ZvaWQgX19vbXB0X2x3X3Rhc2t0ZWFtX2xpbmsob21wdF9sd190YXNrdGVhbV90ICpsd3QsIG9tcHRfdGhyZWFkX3QgKnRocik7CisKK29tcHRfbHdfdGFza3RlYW1fdCAqX19vbXB0X2x3X3Rhc2t0ZWFtX3VubGluayhvbXB0X3RocmVhZF90ICp0aHIpOworCitvbXB0X3BhcmFsbGVsX2lkX3QgX19vbXB0X3BhcmFsbGVsX2lkX25ldyhpbnQgZ3RpZCk7CitvbXB0X3Rhc2tfaWRfdCBfX29tcHRfdGFza19pZF9uZXcoaW50IGd0aWQpOworCitvbXB0X3RlYW1faW5mb190ICpfX29tcHRfZ2V0X3RlYW1pbmZvKGludCBkZXB0aCwgaW50ICpzaXplKTsKKworb21wdF90YXNrX2luZm9fdCAqX19vbXB0X2dldF90YXNraW5mbyhpbnQgZGVwdGgpOworCit2b2lkIF9fb21wdF90aHJlYWRfYmVnaW4ob21wdF90aHJlYWRfdHlwZV90IHRocmVhZF90eXBlLCBpbnQgZ3RpZCk7CisKK3ZvaWQgX19vbXB0X3RocmVhZF9lbmQob21wdF90aHJlYWRfdHlwZV90IHRocmVhZF90eXBlLCBpbnQgZ3RpZCk7CisKK2ludCBfX29tcHRfZ2V0X3BhcmFsbGVsX3RlYW1fc2l6ZV9pbnRlcm5hbChpbnQgYW5jZXN0b3JfbGV2ZWwpOworCitvbXB0X3Rhc2tfaWRfdCBfX29tcHRfZ2V0X3Rhc2tfaWRfaW50ZXJuYWwoaW50IGRlcHRoKTsKKworb21wdF9mcmFtZV90ICpfX29tcHRfZ2V0X3Rhc2tfZnJhbWVfaW50ZXJuYWwoaW50IGRlcHRoKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBtYWNyb3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE9NUFRfSEFWRV9XRUFLX0FUVFJJQlVURSBLTVBfSEFWRV9XRUFLX0FUVFJJQlVURQorI2RlZmluZSBPTVBUX0hBVkVfUFNBUEkgS01QX0hBVkVfUFNBUEkKKyNkZWZpbmUgT01QVF9TVFJfTUFUQ0goaGF5c3RhY2ssIG5lZWRsZSkgX19rbXBfc3RyX21hdGNoKGhheXN0YWNrLCAwLCBuZWVkbGUpCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBpbmxpbmUgZnVuY3Rpb25zCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitpbmxpbmUgb21wdF90aHJlYWRfdCAqb21wdF9nZXRfdGhyZWFkX2d0aWQoaW50IGd0aWQpIHsKKyAgcmV0dXJuIChndGlkID49IDApID8gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZChndGlkKSA6IE5VTEw7Cit9CisKK2lubGluZSBvbXB0X3RocmVhZF90ICpvbXB0X2dldF90aHJlYWQoKSB7CisgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgcmV0dXJuIG9tcHRfZ2V0X3RocmVhZF9ndGlkKGd0aWQpOworfQorCitpbmxpbmUgdm9pZCBvbXB0X3NldF90aHJlYWRfc3RhdGUob21wdF90aHJlYWRfdCAqdGhyZWFkLCBvbXB0X3N0YXRlX3Qgc3RhdGUpIHsKKyAgdGhyZWFkLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gc3RhdGU7Cit9CisKK2lubGluZSBjb25zdCBjaGFyICpvbXB0X2dldF9ydW50aW1lX3ZlcnNpb24oKSB7CisgIHJldHVybiAmX19rbXBfdmVyc2lvbl9saWJfdmVyW0tNUF9WRVJTSU9OX01BR0lDX0xFTl07Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvdGVzdC10b3VjaC5jIGIvZmluYWwvcnVudGltZS9zcmMvdGVzdC10b3VjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZTUyOWEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy90ZXN0LXRvdWNoLmMKQEAgLTAsMCArMSwzMSBAQAorLy8gdGVzdC10b3VjaC5jIC8vCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCitleHRlcm4gZG91YmxlIG9tcF9nZXRfd3RpbWUoKTsKK2V4dGVybiBpbnQgICAgb21wX2dldF9udW1fdGhyZWFkcygpOworZXh0ZXJuIGludCAgICBvbXBfZ2V0X21heF90aHJlYWRzKCk7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCitpbnQgbWFpbigpIHsKKyAgICBvbXBfZ2V0X3d0aW1lKCk7CisgICAgb21wX2dldF9udW1fdGhyZWFkcygpOworICAgIG9tcF9nZXRfbWF4X3RocmVhZHMoKTsKKyAgICByZXR1cm4gMDsKK30KKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2Rpc2FibGVfd2FybmluZ3MuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2Rpc2FibGVfd2FybmluZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjI0MmZkCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvZGlzYWJsZV93YXJuaW5ncy5oCkBAIC0wLDAgKzEsMjkgQEAKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIml0dG5vdGlmeV9jb25maWcuaCIKKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6IDU5MykgICAvKiBwYXJhbWV0ZXIgIlhYWFgiIHdhcyBzZXQgYnV0IG5ldmVyIHVzZWQgICAgICAgICAgICAgICAgICovCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6IDM0NCkgICAvKiB0eXBlZGVmIG5hbWUgaGFzIGFscmVhZHkgYmVlbiBkZWNsYXJlZCAod2l0aCBzYW1lIHR5cGUpICovCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6IDE3NCkgICAvKiBleHByZXNzaW9uIGhhcyBubyBlZmZlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6IDQxMjcpICAvKiBjb25kaXRpb25hbCBleHByZXNzaW9uIGlzIGNvbnN0YW50ICAgICAgICAgICAgICAgICAgICAgICovCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6IDQzMDYpICAvKiBjb252ZXJzaW9uIGZyb20gJz8nIHRvICc/JyBvZiBncmVhdGVyIHNpemUgICAgICAgICAgICAgICovCisKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworI2lmIGRlZmluZWQgX19JTlRFTF9DT01QSUxFUgorCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6IDg2OSkgIC8qIHBhcmFtZXRlciAiWFhYWFgiIHdhcyBuZXZlciByZWZlcmVuY2VkICAgICAgICAgICAgICAgICAgKi8KKyNwcmFnbWEgd2FybmluZyAoZGlzYWJsZTogMTQxOCkgLyogZXh0ZXJuYWwgZnVuY3Rpb24gZGVmaW5pdGlvbiB3aXRoIG5vIHByaW9yIGRlY2xhcmF0aW9uICAqLworI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlOiAxNDE5KSAvKiBleHRlcm5hbCBkZWNsYXJhdGlvbiBpbiBwcmltYXJ5IHNvdXJjZSBmaWxlICAgICAgICAgICAgICovCisKKyNlbmRpZiAvKiBfX0lOVEVMX0NPTVBJTEVSICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnkuaCBiL2ZpbmFsL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NGUyNTcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnkuaApAQCAtMCwwICsxLDM4MDQgQEAKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfSVRUTk9USUZZX0hfCisjZGVmaW5lIF9JVFROT1RJRllfSF8KKworLyoqCitAZmlsZQorQGJyaWVmIFB1YmxpYyBVc2VyIEFQSSBmdW5jdGlvbnMgYW5kIHR5cGVzCitAbWFpbnBhZ2UKKworVGhlIElUVCBBUEkgaXMgdXNlZCB0byBhbm5vdGF0ZSBhIHVzZXIncyBwcm9ncmFtIHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbgordGhhdCBjYW4gYmUgdXNlZCBieSBjb3JyZWN0bmVzcyBhbmQgcGVyZm9ybWFuY2UgdG9vbHMuIFRoZSB1c2VyIGluc2VydHMKK2NhbGxzIGluIHRoZWlyIHByb2dyYW0uIFRob3NlIGNhbGxzIGdlbmVyYXRlIGluZm9ybWF0aW9uIHRoYXQgaXMgY29sbGVjdGVkCithdCBydW50aW1lLCBhbmQgdXNlZCBieSBJbnRlbChSKSBUaHJlYWRpbmcgVG9vbHMuCisKK0BzZWN0aW9uIEFQSSBDb25jZXB0cworVGhlIGZvbGxvd2luZyBnZW5lcmFsIGNvbmNlcHRzIGFyZSB1c2VkIHRocm91Z2hvdXQgdGhlIEFQSS4KKworQHN1YnNlY3Rpb24gVW5pY29kZSBTdXBwb3J0CitNYW55IEFQSSBmdW5jdGlvbnMgdGFrZSBjaGFyYWN0ZXIgc3RyaW5nIGFyZ3VtZW50cy4gT24gV2luZG93cywgdGhlcmUKK2FyZSB0d28gdmVyc2lvbnMgb2YgZWFjaCBzdWNoIGZ1bmN0aW9uLiBUaGUgZnVuY3Rpb24gbmFtZSBpcyBzdWZmaXhlZAorYnkgVyBpZiBVbmljb2RlIHN1cHBvcnQgaXMgZW5hYmxlZCwgYW5kIGJ5IEEgb3RoZXJ3aXNlLiBBbnkgQVBJIGZ1bmN0aW9uCit0aGF0IHRha2VzIGEgY2hhcmFjdGVyIHN0cmluZyBhcmd1bWVudCBhZGhlcmVzIHRvIHRoaXMgY29udmVudGlvbi4KKworQHN1YnNlY3Rpb24gQ29uZGl0aW9uYWwgQ29tcGlsYXRpb24KK01hbnkgdXNlcnMgcHJlZmVyIGhhdmluZyBhbiBvcHRpb24gdG8gbW9kaWZ5IElUVCBBUEkgY29kZSB3aGVuIGxpbmtpbmcgaXQKK2luc2lkZSB0aGVpciBydW50aW1lcy4gSVRUIEFQSSBoZWFkZXIgZmlsZSBwcm92aWRlcyBhIG1lY2hhbmlzbSB0byByZXBsYWNlCitJVFQgQVBJIGZ1bmN0aW9uIG5hbWVzIGluc2lkZSB5b3VyIGNvZGUgd2l0aCBlbXB0eSBzdHJpbmdzLiBUbyBkbyB0aGlzLAorZGVmaW5lIHRoZSBtYWNyb3MgSU5URUxfTk9fSVRUTk9USUZZX0FQSSBkdXJpbmcgY29tcGlsYXRpb24gYW5kIHJlbW92ZSB0aGUKK3N0YXRpYyBsaWJyYXJ5IGZyb20gdGhlIGxpbmtlciBzY3JpcHQuCisKK0BzdWJzZWN0aW9uIERvbWFpbnMKK1tzZWUgZG9tYWluc10KK0RvbWFpbnMgcHJvdmlkZSBhIHdheSB0byBzZXBhcmF0ZSBub3RpZmljYXRpb24gZm9yIGRpZmZlcmVudCBtb2R1bGVzIG9yCitsaWJyYXJpZXMgaW4gYSBwcm9ncmFtLiBEb21haW5zIGFyZSBzcGVjaWZpZWQgYnkgZG90dGVkIGNoYXJhY3RlciBzdHJpbmdzLAorZS5nLiBUQkIuSW50ZXJuYWwuQ29udHJvbC4KKworQSBtZWNoYW5pc20gKHRvIGJlIHNwZWNpZmllZCkgaXMgcHJvdmlkZWQgdG8gZW5hYmxlIGFuZCBkaXNhYmxlCitkb21haW5zLiBCeSBkZWZhdWx0LCBhbGwgZG9tYWlucyBhcmUgZW5hYmxlZC4KK0BzdWJzZWN0aW9uIE5hbWVkIEVudGl0aWVzIGFuZCBJbnN0YW5jZXMKK05hbWVkIGVudGl0aWVzIChmcmFtZXMsIHJlZ2lvbnMsIHRhc2tzLCBhbmQgbWFya2VycykgY29tbXVuaWNhdGUKK2luZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9ncmFtIHRvIHRoZSBhbmFseXNpcyB0b29scy4gQSBuYW1lZCBlbnRpdHkgb2Z0ZW4KK3JlZmVycyB0byBhIHNlY3Rpb24gb2YgcHJvZ3JhbSBjb2RlLCBvciB0byBzb21lIHNldCBvZiBsb2dpY2FsIGNvbmNlcHRzCit0aGF0IHRoZSBwcm9ncmFtbWVyIHdhbnRzIHRvIGdyb3VwIHRvZ2V0aGVyLgorCitOYW1lZCBlbnRpdGllcyByZWxhdGUgdG8gdGhlIHByb2dyYW1tZXIncyBzdGF0aWMgdmlldyBvZiB0aGUgcHJvZ3JhbS4gV2hlbgordGhlIHByb2dyYW0gYWN0dWFsbHkgZXhlY3V0ZXMsIG1hbnkgaW5zdGFuY2VzIG9mIGEgZ2l2ZW4gbmFtZWQgZW50aXR5CittYXkgYmUgY3JlYXRlZC4KKworVGhlIEFQSSBhbm5vdGF0aW9ucyBkZW5vdGUgaW5zdGFuY2VzIG9mIG5hbWVkIGVudGl0aWVzLiBUaGUgYWN0dWFsCituYW1lZCBlbnRpdGllcyBhcmUgZGlzcGxheWVkIHVzaW5nIHRoZSBhbmFseXNpcyB0b29scy4gSW4gb3RoZXIgd29yZHMsCit0aGUgbmFtZWQgZW50aXRpZXMgY29tZSBpbnRvIGV4aXN0ZW5jZSB3aGVuIGluc3RhbmNlcyBhcmUgY3JlYXRlZC4KKworSW5zdGFuY2VzIG9mIG5hbWVkIGVudGl0aWVzIG1heSBoYXZlIGluc3RhbmNlIGlkZW50aWZpZXJzIChJRHMpLiBTb21lCitBUEkgY2FsbHMgdXNlIGluc3RhbmNlIGlkZW50aWZpZXJzIHRvIGNyZWF0ZSByZWxhdGlvbnNoaXBzIGJldHdlZW4KK2RpZmZlcmVudCBpbnN0YW5jZXMgb2YgbmFtZWQgZW50aXRpZXMuIE90aGVyIEFQSSBjYWxscyBhc3NvY2lhdGUgZGF0YQord2l0aCBpbnN0YW5jZXMgb2YgbmFtZWQgZW50aXRpZXMuCisKK1NvbWUgbmFtZWQgZW50aXRpZXMgbXVzdCBhbHdheXMgaGF2ZSBpbnN0YW5jZSBJRHMuIEluIHBhcnRpY3VsYXIsIHJlZ2lvbnMKK2FuZCBmcmFtZXMgYWx3YXlzIGhhdmUgSURzLiBUYXNrIGFuZCBtYXJrZXJzIG5lZWQgSURzIG9ubHkgaWYgdGhlIElEIGlzCituZWVkZWQgaW4gYW5vdGhlciBBUEkgY2FsbCAoc3VjaCBhcyBhZGRpbmcgYSByZWxhdGlvbiBvciBtZXRhZGF0YSkuCisKK1RoZSBsaWZldGltZSBvZiBpbnN0YW5jZSBJRHMgaXMgZGlzdGluY3QgZnJvbSB0aGUgbGlmZXRpbWUgb2YKK2luc3RhbmNlcy4gVGhpcyBhbGxvd3MgdmFyaW91cyByZWxhdGlvbnNoaXBzIHRvIGJlIHNwZWNpZmllZCBzZXBhcmF0ZQorZnJvbSB0aGUgYWN0dWFsIGV4ZWN1dGlvbiBvZiBpbnN0YW5jZXMuIFRoaXMgZmxleGliaWxpdHkgY29tZXMgYXQgdGhlCitleHBlbnNlIG9mIGV4dHJhIEFQSSBjYWxscy4KKworVGhlIHNhbWUgSUQgbWF5IG5vdCBiZSByZXVzZWQgZm9yIGRpZmZlcmVudCBpbnN0YW5jZXMsIHVubGVzcyBhIHByZXZpb3VzCitbcmVmXSBfX2l0dF9pZF9kZXN0cm95IGNhbGwgZm9yIHRoYXQgSUQgaGFzIGJlZW4gaXNzdWVkLgorKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElUVF9PU19XSU4KKyMgIGRlZmluZSBJVFRfT1NfV0lOICAgMQorI2VuZGlmIC8qIElUVF9PU19XSU4gKi8KKworI2lmbmRlZiBJVFRfT1NfTElOVVgKKyMgIGRlZmluZSBJVFRfT1NfTElOVVggMgorI2VuZGlmIC8qIElUVF9PU19MSU5VWCAqLworCisjaWZuZGVmIElUVF9PU19NQUMKKyMgIGRlZmluZSBJVFRfT1NfTUFDICAgMworI2VuZGlmIC8qIElUVF9PU19NQUMgKi8KKworI2lmbmRlZiBJVFRfT1MKKyMgIGlmIGRlZmluZWQgV0lOMzIgfHwgZGVmaW5lZCBfV0lOMzIKKyMgICAgZGVmaW5lIElUVF9PUyBJVFRfT1NfV0lOCisjICBlbGlmIGRlZmluZWQoIF9fQVBQTEVfXyApICYmIGRlZmluZWQoIF9fTUFDSF9fICkKKyMgICAgZGVmaW5lIElUVF9PUyBJVFRfT1NfTUFDCisjICBlbHNlCisjICAgIGRlZmluZSBJVFRfT1MgSVRUX09TX0xJTlVYCisjICBlbmRpZgorI2VuZGlmIC8qIElUVF9PUyAqLworCisjaWZuZGVmIElUVF9QTEFURk9STV9XSU4KKyMgIGRlZmluZSBJVFRfUExBVEZPUk1fV0lOIDEKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk1fV0lOICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNX1BPU0lYCisjICBkZWZpbmUgSVRUX1BMQVRGT1JNX1BPU0lYIDIKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk1fUE9TSVggKi8KKworI2lmbmRlZiBJVFRfUExBVEZPUk1fTUFDCisjICBkZWZpbmUgSVRUX1BMQVRGT1JNX01BQyAzCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNX01BQyAqLworCisjaWZuZGVmIElUVF9QTEFURk9STQorIyAgaWYgSVRUX09TPT1JVFRfT1NfV0lOCisjICAgIGRlZmluZSBJVFRfUExBVEZPUk0gSVRUX1BMQVRGT1JNX1dJTgorIyAgZWxpZiBJVFRfT1M9PUlUVF9PU19NQUMKKyMgICAgZGVmaW5lIElUVF9QTEFURk9STSBJVFRfUExBVEZPUk1fTUFDCisjICBlbHNlCisjICAgIGRlZmluZSBJVFRfUExBVEZPUk0gSVRUX1BMQVRGT1JNX1BPU0lYCisjICBlbmRpZgorI2VuZGlmIC8qIElUVF9QTEFURk9STSAqLworCisjaWYgZGVmaW5lZChfVU5JQ09ERSkgJiYgIWRlZmluZWQoVU5JQ09ERSkKKyNkZWZpbmUgVU5JQ09ERQorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNpbmNsdWRlIDx0Y2hhci5oPgorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2luY2x1ZGUgPHN0ZGludC5oPgorI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyNpbmNsdWRlIDx3Y2hhci5oPgorI2VuZGlmIC8qIFVOSUNPREUgfHwgX1VOSUNPREUgKi8KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworI2lmbmRlZiBDREVDTAorIyAgaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjICAgIGRlZmluZSBDREVDTCBfX2NkZWNsCisjICBlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworIyAgICBpZiBkZWZpbmVkIF9NX0lYODYgfHwgZGVmaW5lZCBfX2kzODZfXworIyAgICAgIGRlZmluZSBDREVDTCBfX2F0dHJpYnV0ZV9fICgoY2RlY2wpKQorIyAgICBlbHNlICAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICAgICAgZGVmaW5lIENERUNMIC8qIGFjdHVhbCBvbmx5IG9uIHg4NiBwbGF0Zm9ybSAqLworIyAgICBlbmRpZiAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICBlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBDREVDTCAqLworCisjaWZuZGVmIFNURENBTEwKKyMgIGlmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorIyAgICBkZWZpbmUgU1REQ0FMTCBfX3N0ZGNhbGwKKyMgIGVsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjICAgIGlmIGRlZmluZWQgX01fSVg4NiB8fCBkZWZpbmVkIF9faTM4Nl9fCisjICAgICAgZGVmaW5lIFNURENBTEwgX19hdHRyaWJ1dGVfXyAoKHN0ZGNhbGwpKQorIyAgICBlbHNlICAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICAgICAgZGVmaW5lIFNURENBTEwgLyogc3VwcG9ydGVkIG9ubHkgb24geDg2IHBsYXRmb3JtICovCisjICAgIGVuZGlmIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgIGVuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIFNURENBTEwgKi8KKworI2RlZmluZSBJVFRBUEkgICAgQ0RFQ0wKKyNkZWZpbmUgTElCSVRUQVBJIENERUNMCisKKy8qIFRPRE86IFRlbXBvcmFyeSBmb3IgY29tcGF0aWJpbGl0eSEgKi8KKyNkZWZpbmUgSVRUQVBJX0NBTEwgICAgQ0RFQ0wKKyNkZWZpbmUgTElCSVRUQVBJX0NBTEwgQ0RFQ0wKKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorLyogdXNlIF9fZm9yY2VpbmxpbmUgKFZDKysgc3BlY2lmaWMpICovCisjZGVmaW5lIElUVF9JTkxJTkUgICAgICAgICAgIF9fZm9yY2VpbmxpbmUKKyNkZWZpbmUgSVRUX0lOTElORV9BVFRSSUJVVEUgLyogbm90aGluZyAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworLyoKKyAqIEdlbmVyYWxseSwgZnVuY3Rpb25zIGFyZSBub3QgaW5saW5lZCB1bmxlc3Mgb3B0aW1pemF0aW9uIGlzIHNwZWNpZmllZC4KKyAqIEZvciBmdW5jdGlvbnMgZGVjbGFyZWQgaW5saW5lLCB0aGlzIGF0dHJpYnV0ZSBpbmxpbmVzIHRoZSBmdW5jdGlvbiBldmVuCisgKiBpZiBubyBvcHRpbWl6YXRpb24gbGV2ZWwgd2FzIHNwZWNpZmllZC4KKyAqLworI2lmZGVmIF9fU1RSSUNUX0FOU0lfXworI2RlZmluZSBJVFRfSU5MSU5FICAgICAgICAgICBzdGF0aWMKKyNkZWZpbmUgSVRUX0lOTElORV9BVFRSSUJVVEUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkKKyNlbHNlICAvKiBfX1NUUklDVF9BTlNJX18gKi8KKyNkZWZpbmUgSVRUX0lOTElORSAgICAgICAgICAgc3RhdGljIGlubGluZQorI2RlZmluZSBJVFRfSU5MSU5FX0FUVFJJQlVURSBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lLCB1bnVzZWQpKQorI2VuZGlmIC8qIF9fU1RSSUNUX0FOU0lfXyAqLworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworLyoqIEBlbmRjb25kICovCisKKyNpZmRlZiBJTlRFTF9JVFROT1RJRllfRU5BQkxFX0xFR0FDWQorIyAgaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjICAgIHByYWdtYSBtZXNzYWdlKCJXQVJOSU5HISEhIERlcHJlY2F0ZWQgQVBJIGlzIHVzZWQuIFBsZWFzZSB1bmRlZmluZSBJTlRFTF9JVFROT1RJRllfRU5BQkxFX0xFR0FDWSBtYWNybyIpCisjICBlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworIyAgICB3YXJuaW5nICJEZXByZWNhdGVkIEFQSSBpcyB1c2VkLiBQbGVhc2UgdW5kZWZpbmUgSU5URUxfSVRUTk9USUZZX0VOQUJMRV9MRUdBQ1kgbWFjcm8iCisjICBlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyMgIGluY2x1ZGUgImxlZ2FjeS9pdHRub3RpZnkuaCIKKyNlbmRpZiAvKiBJTlRFTF9JVFROT1RJRllfRU5BQkxFX0xFR0FDWSAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKy8qIEhlbHBlciBtYWNybyBmb3Igam9pbmluZyB0b2tlbnMgKi8KKyNkZWZpbmUgSVRUX0pPSU5fQVVYKHAsbikgcCMjbgorI2RlZmluZSBJVFRfSk9JTihwLG4pICAgICBJVFRfSk9JTl9BVVgocCxuKQorCisjaWZkZWYgSVRUX01BSk9SCisjdW5kZWYgSVRUX01BSk9SCisjZW5kaWYKKyNpZmRlZiBJVFRfTUlOT1IKKyN1bmRlZiBJVFRfTUlOT1IKKyNlbmRpZgorI2RlZmluZSBJVFRfTUFKT1IgICAgIDMKKyNkZWZpbmUgSVRUX01JTk9SICAgICAwCisKKy8qIFN0YW5kYXJkIHZlcnNpb25pbmcgb2YgYSB0b2tlbiB3aXRoIG1ham9yIGFuZCBtaW5vciB2ZXJzaW9uIG51bWJlcnMgKi8KKyNkZWZpbmUgSVRUX1ZFUlNJT05JWkUoeCkgICAgXAorICAgIElUVF9KT0lOKHgsICAgICAgICAgICAgICBcCisgICAgSVRUX0pPSU4oXywgICAgICAgICAgICAgIFwKKyAgICBJVFRfSk9JTihJVFRfTUFKT1IsICAgICAgXAorICAgIElUVF9KT0lOKF8sIElUVF9NSU5PUikpKSkKKworI2lmbmRlZiBJTlRFTF9JVFROT1RJRllfUFJFRklYCisjICBkZWZpbmUgSU5URUxfSVRUTk9USUZZX1BSRUZJWCBfX2l0dF8KKyNlbmRpZiAvKiBJTlRFTF9JVFROT1RJRllfUFJFRklYICovCisjaWZuZGVmIElOVEVMX0lUVE5PVElGWV9QT1NURklYCisjICBkZWZpbmUgSU5URUxfSVRUTk9USUZZX1BPU1RGSVggX3B0cl8KKyNlbmRpZiAvKiBJTlRFTF9JVFROT1RJRllfUE9TVEZJWCAqLworCisjZGVmaW5lIElUVE5PVElGWV9OQU1FX0FVWChuKSBJVFRfSk9JTihJTlRFTF9JVFROT1RJRllfUFJFRklYLG4pCisjZGVmaW5lIElUVE5PVElGWV9OQU1FKG4pICAgICBJVFRfVkVSU0lPTklaRShJVFROT1RJRllfTkFNRV9BVVgoSVRUX0pPSU4obixJTlRFTF9JVFROT1RJRllfUE9TVEZJWCkpKQorCisjZGVmaW5lIElUVE5PVElGWV9WT0lEKG4pICghSVRUTk9USUZZX05BTUUobikpID8gKHZvaWQpMCA6IElUVE5PVElGWV9OQU1FKG4pCisjZGVmaW5lIElUVE5PVElGWV9EQVRBKG4pICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pCisKKyNkZWZpbmUgSVRUTk9USUZZX1ZPSURfRDAobixkKSAgICAgICAoIShkKS0+ZmxhZ3MpID8gKHZvaWQpMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gKHZvaWQpMCA6IElUVE5PVElGWV9OQU1FKG4pKGQpCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0QxKG4sZCx4KSAgICAgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkLHgpCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0QyKG4sZCx4LHkpICAgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSkKKyNkZWZpbmUgSVRUTk9USUZZX1ZPSURfRDMobixkLHgseSx6KSAoIShkKS0+ZmxhZ3MpID8gKHZvaWQpMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gKHZvaWQpMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHopCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0Q0KG4sZCx4LHkseixhKSAgICAgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6LGEpCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0Q1KG4sZCx4LHkseixhLGIpICAgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6LGEsYikKKyNkZWZpbmUgSVRUTk9USUZZX1ZPSURfRDYobixkLHgseSx6LGEsYixjKSAoIShkKS0+ZmxhZ3MpID8gKHZvaWQpMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gKHZvaWQpMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHosYSxiLGMpCisjZGVmaW5lIElUVE5PVElGWV9EQVRBX0QwKG4sZCkgICAgICAgKCEoZCktPmZsYWdzKSA/ICAgICAgIDAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKShkKQorI2RlZmluZSBJVFROT1RJRllfREFUQV9EMShuLGQseCkgICAgICghKGQpLT5mbGFncykgPyAgICAgICAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCx4KQorI2RlZmluZSBJVFROT1RJRllfREFUQV9EMihuLGQseCx5KSAgICghKGQpLT5mbGFncykgPyAgICAgICAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkpCisjZGVmaW5lIElUVE5PVElGWV9EQVRBX0QzKG4sZCx4LHkseikgKCEoZCktPmZsYWdzKSA/ICAgICAgIDAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6KQorI2RlZmluZSBJVFROT1RJRllfREFUQV9ENChuLGQseCx5LHosYSkgICAgICghKGQpLT5mbGFncykgPyAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhKQorI2RlZmluZSBJVFROT1RJRllfREFUQV9ENShuLGQseCx5LHosYSxiKSAgICghKGQpLT5mbGFncykgPyAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhLGIpCisjZGVmaW5lIElUVE5PVElGWV9EQVRBX0Q2KG4sZCx4LHkseixhLGIsYykgKCEoZCktPmZsYWdzKSA/IDAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6LGEsYixjKQorCisjaWZkZWYgSVRUX1NUVUIKKyN1bmRlZiBJVFRfU1RVQgorI2VuZGlmCisjaWZkZWYgSVRUX1NUVUJWCisjdW5kZWYgSVRUX1NUVUJWCisjZW5kaWYKKyNkZWZpbmUgSVRUX1NUVUJWKGFwaSx0eXBlLG5hbWUsYXJncykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0eXBlZGVmIHR5cGUgKGFwaSogSVRUX0pPSU4oSVRUTk9USUZZX05BTUUobmFtZSksX3QpKSBhcmdzOyAgIFwKKyAgICBleHRlcm4gSVRUX0pPSU4oSVRUTk9USUZZX05BTUUobmFtZSksX3QpIElUVE5PVElGWV9OQU1FKG5hbWUpOworI2RlZmluZSBJVFRfU1RVQiBJVFRfU1RVQlYKKy8qKiBAZW5kY29uZCAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZ3BhX2RvY3VtZW50YXRpb24gKi8KKy8qKgorICogQGRlZmdyb3VwIHB1YmxpYyBQdWJsaWMgQVBJCisgKiBAeworICogQH0KKyAqLworCisvKioKKyAqIEBkZWZncm91cCBjb250cm9sIENvbGxlY3Rpb24gQ29udHJvbAorICogQGluZ3JvdXAgcHVibGljCisgKiBHZW5lcmFsIGJlaGF2aW9yOiBhcHBsaWNhdGlvbiBjb250aW51ZXMgdG8gcnVuLCBidXQgbm8gcHJvZmlsaW5nIGluZm9ybWF0aW9uIGlzIGJlaW5nIGNvbGxlY3RlZAorICoKKyAqIFBhdXNpbmcgb2NjdXJzIG5vdCBvbmx5IGZvciB0aGUgY3VycmVudCB0aHJlYWQgYnV0IGZvciBhbGwgcHJvY2VzcyBhcyB3ZWxsIGFzIHNwYXduZWQgcHJvY2Vzc2VzCisgKiAtIEludGVsKFIpIFBhcmFsbGVsIEluc3BlY3RvciBhbmQgSW50ZWwoUikgSW5zcGVjdG9yIFhFOgorICogICAtIERvZXMgbm90IGFuYWx5emUgb3IgcmVwb3J0IGVycm9ycyB0aGF0IGludm9sdmUgbWVtb3J5IGFjY2Vzcy4KKyAqICAgLSBPdGhlciBlcnJvcnMgYXJlIHJlcG9ydGVkIGFzIHVzdWFsLiBQYXVzaW5nIGRhdGEgY29sbGVjdGlvbiBpbgorICogICAgIEludGVsKFIpIFBhcmFsbGVsIEluc3BlY3RvciBhbmQgSW50ZWwoUikgSW5zcGVjdG9yIFhFCisgKiAgICAgb25seSBwYXVzZXMgdHJhY2luZyBhbmQgYW5hbHl6aW5nIG1lbW9yeSBhY2Nlc3MuCisgKiAgICAgSXQgZG9lcyBub3QgcGF1c2UgdHJhY2luZyBvciBhbmFseXppbmcgdGhyZWFkaW5nIEFQSXMuCisgKiAgIC4KKyAqIC0gSW50ZWwoUikgUGFyYWxsZWwgQW1wbGlmaWVyIGFuZCBJbnRlbChSKSBWVHVuZShUTSkgQW1wbGlmaWVyIFhFOgorICogICAtIERvZXMgY29udGludWUgdG8gcmVjb3JkIHdoZW4gbmV3IHRocmVhZHMgYXJlIHN0YXJ0ZWQuCisgKiAgIC4KKyAqIC0gT3RoZXIgZWZmZWN0czoKKyAqICAgLSBQb3NzaWJsZSByZWR1Y3Rpb24gb2YgcnVudGltZSBvdmVyaGVhZC4KKyAqICAgLgorICogQHsKKyAqLworLyoqIEBicmllZiBQYXVzZSBjb2xsZWN0aW9uICovCit2b2lkIElUVEFQSSBfX2l0dF9wYXVzZSh2b2lkKTsKKy8qKiBAYnJpZWYgUmVzdW1lIGNvbGxlY3Rpb24gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Jlc3VtZSh2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcGF1c2UsICAodm9pZCkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCByZXN1bWUsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfcGF1c2UgICAgICBJVFROT1RJRllfVk9JRChwYXVzZSkKKyNkZWZpbmUgX19pdHRfcGF1c2VfcHRyICBJVFROT1RJRllfTkFNRShwYXVzZSkKKyNkZWZpbmUgX19pdHRfcmVzdW1lICAgICBJVFROT1RJRllfVk9JRChyZXN1bWUpCisjZGVmaW5lIF9faXR0X3Jlc3VtZV9wdHIgSVRUTk9USUZZX05BTUUocmVzdW1lKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfcGF1c2UoKQorI2RlZmluZSBfX2l0dF9wYXVzZV9wdHIgIDAKKyNkZWZpbmUgX19pdHRfcmVzdW1lKCkKKyNkZWZpbmUgX19pdHRfcmVzdW1lX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfcGF1c2VfcHRyICAwCisjZGVmaW5lIF9faXR0X3Jlc3VtZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGNvbnRyb2wgZ3JvdXAgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZWZncm91cCB0aHJlYWRzIFRocmVhZHMKKyAqIEBpbmdyb3VwIHB1YmxpYworICogR2l2ZSBuYW1lcyB0byB0aHJlYWRzCisgKiBAeworICovCisvKioKKyAqIEBicmllZiBTZXRzIHRocmVhZCBuYW1lIG9mIGNhbGxpbmcgdGhyZWFkCisgKiBAcGFyYW1baW5dIG5hbWUgLSBuYW1lIG9mIHRocmVhZAorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCit2b2lkIElUVEFQSSBfX2l0dF90aHJlYWRfc2V0X25hbWVBKGNvbnN0IGNoYXIgICAgKm5hbWUpOwordm9pZCBJVFRBUEkgX19pdHRfdGhyZWFkX3NldF9uYW1lVyhjb25zdCB3Y2hhcl90ICpuYW1lKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lICAgICBfX2l0dF90aHJlYWRfc2V0X25hbWVXCisjICBkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lX3B0ciBfX2l0dF90aHJlYWRfc2V0X25hbWVXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZSAgICAgX19pdHRfdGhyZWFkX3NldF9uYW1lQQorIyAgZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZV9wdHIgX19pdHRfdGhyZWFkX3NldF9uYW1lQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCit2b2lkIElUVEFQSSBfX2l0dF90aHJlYWRfc2V0X25hbWUoY29uc3QgY2hhciAqbmFtZSk7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRocmVhZF9zZXRfbmFtZUEsIChjb25zdCBjaGFyICAgICpuYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRocmVhZF9zZXRfbmFtZVcsIChjb25zdCB3Y2hhcl90ICpuYW1lKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRocmVhZF9zZXRfbmFtZSwgIChjb25zdCBjaGFyICAgICpuYW1lKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lQSAgICAgSVRUTk9USUZZX1ZPSUQodGhyZWFkX3NldF9uYW1lQSkKKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lQV9wdHIgSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lQSkKKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lVyAgICAgSVRUTk9USUZZX1ZPSUQodGhyZWFkX3NldF9uYW1lVykKKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lV19wdHIgSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWUgICAgIElUVE5PVElGWV9WT0lEKHRocmVhZF9zZXRfbmFtZSkKKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lX3B0ciBJVFROT1RJRllfTkFNRSh0aHJlYWRfc2V0X25hbWUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVBKG5hbWUpCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lVyhuYW1lKQorI2RlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lKG5hbWUpCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2dwYV9kb2N1bWVudGF0aW9uICovCisKKy8qKgorICogQGJyaWVmIE1hcmsgY3VycmVudCB0aHJlYWQgYXMgaWdub3JlZCBmcm9tIHRoaXMgcG9pbnQgb24sIGZvciB0aGUgZHVyYXRpb24gb2YgaXRzIGV4aXN0ZW5jZS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGhyZWFkX2lnbm9yZSh2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGhyZWFkX2lnbm9yZSwgKHZvaWQpKQorI2RlZmluZSBfX2l0dF90aHJlYWRfaWdub3JlICAgICBJVFROT1RJRllfVk9JRCh0aHJlYWRfaWdub3JlKQorI2RlZmluZSBfX2l0dF90aHJlYWRfaWdub3JlX3B0ciBJVFROT1RJRllfTkFNRSh0aHJlYWRfaWdub3JlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfdGhyZWFkX2lnbm9yZSgpCisjZGVmaW5lIF9faXR0X3RocmVhZF9pZ25vcmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF90aHJlYWRfaWdub3JlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gdGhyZWFkcyBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBzdXBwcmVzcyBFcnJvciBzdXBwcmVzc2lvbgorICogQGluZ3JvdXAgcHVibGljCisgKiBHZW5lcmFsIGJlaGF2aW9yOiBhcHBsaWNhdGlvbiBjb250aW51ZXMgdG8gcnVuLCBidXQgZXJyb3JzIGFyZSBzdXBwcmVzc2VkCisgKgorICogQHsKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqCisgKiBAbmFtZSBncm91cCBvZiBmdW5jdGlvbnMgdXNlZCBmb3IgZXJyb3Igc3VwcHJlc3Npb24gaW4gY29ycmVjdG5lc3MgdG9vbHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQHsgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogQGJyaWVmIHBvc3NpYmxlIHZhbHVlIGZvciBzdXBwcmVzc2lvbiBtYXNrCisgKi8KKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfYWxsX2Vycm9ycyAweDdmZmZmZmZmCisKKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogQGJyaWVmIHBvc3NpYmxlIHZhbHVlIGZvciBzdXBwcmVzc2lvbiBtYXNrIChzdXBwcmVzc2VzIGVycm9ycyBmcm9tIHRocmVhZGluZyBhbmFseXNpcykKKyAqLworI2RlZmluZSBfX2l0dF9zdXBwcmVzc190aHJlYWRpbmdfZXJyb3JzIDB4MDAwMDAwZmYKKworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBAYnJpZWYgcG9zc2libGUgdmFsdWUgZm9yIHN1cHByZXNzaW9uIG1hc2sgKHN1cHByZXNzZXMgZXJyb3JzIGZyb20gbWVtb3J5IGFuYWx5c2lzKQorICovCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX21lbW9yeV9lcnJvcnMgMHgwMDAwZmYwMAorCisvKioKKyAqIEBicmllZiBTdGFydCBzdXBwcmVzc2luZyBlcnJvcnMgaWRlbnRpZmllZCBpbiBtYXNrIG9uIHRoaXMgdGhyZWFkCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N1cHByZXNzX3B1c2godW5zaWduZWQgaW50IG1hc2spOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdXBwcmVzc19wdXNoLCAodW5zaWduZWQgaW50IG1hc2spKQorI2RlZmluZSBfX2l0dF9zdXBwcmVzc19wdXNoICAgICBJVFROT1RJRllfVk9JRChzdXBwcmVzc19wdXNoKQorI2RlZmluZSBfX2l0dF9zdXBwcmVzc19wdXNoX3B0ciBJVFROT1RJRllfTkFNRShzdXBwcmVzc19wdXNoKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcHVzaChtYXNrKQorI2RlZmluZSBfX2l0dF9zdXBwcmVzc19wdXNoX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcHVzaF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBVbmRvIHRoZSBlZmZlY3RzIG9mIHRoZSBtYXRjaGluZyBjYWxsIHRvIF9faXR0X3N1cHByZXNzX3B1c2gKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc3VwcHJlc3NfcG9wKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdXBwcmVzc19wb3AsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcG9wICAgICBJVFROT1RJRllfVk9JRChzdXBwcmVzc19wb3ApCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX3BvcF9wdHIgSVRUTk9USUZZX05BTUUoc3VwcHJlc3NfcG9wKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcG9wKCkKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcG9wX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcG9wX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGVudW0gX19pdHRfbW9kZWxfZGlzYWJsZQorICogQGJyaWVmIEVudW1lcmF0b3IgZm9yIHRoZSBkaXNhYmxlIG1ldGhvZHMKKyAqLwordHlwZWRlZiBlbnVtIF9faXR0X3N1cHByZXNzX21vZGUgeworICAgIF9faXR0X3Vuc3VwcHJlc3NfcmFuZ2UsCisgICAgX19pdHRfc3VwcHJlc3NfcmFuZ2UKK30gX19pdHRfc3VwcHJlc3NfbW9kZV90OworCisvKioKKyAqIEBicmllZiBNYXJrIGEgcmFuZ2Ugb2YgbWVtb3J5IGZvciBlcnJvciBzdXBwcmVzc2lvbiBvciB1bnN1cHByZXNzaW9uIGZvciBlcnJvciB0eXBlcyBpbmNsdWRlZCBpbiBtYXNrCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N1cHByZXNzX21hcmtfcmFuZ2UoX19pdHRfc3VwcHJlc3NfbW9kZV90IG1vZGUsIHVuc2lnbmVkIGludCBtYXNrLCB2b2lkICogYWRkcmVzcywgc2l6ZV90IHNpemUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdXBwcmVzc19tYXJrX3JhbmdlLCAoX19pdHRfc3VwcHJlc3NfbW9kZV90IG1vZGUsIHVuc2lnbmVkIGludCBtYXNrLCB2b2lkICogYWRkcmVzcywgc2l6ZV90IHNpemUpKQorI2RlZmluZSBfX2l0dF9zdXBwcmVzc19tYXJrX3JhbmdlICAgICBJVFROT1RJRllfVk9JRChzdXBwcmVzc19tYXJrX3JhbmdlKQorI2RlZmluZSBfX2l0dF9zdXBwcmVzc19tYXJrX3JhbmdlX3B0ciBJVFROT1RJRllfTkFNRShzdXBwcmVzc19tYXJrX3JhbmdlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfbWFya19yYW5nZShtYXNrKQorI2RlZmluZSBfX2l0dF9zdXBwcmVzc19tYXJrX3JhbmdlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfbWFya19yYW5nZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBVbmRvIHRoZSBlZmZlY3Qgb2YgYSBtYXRjaGluZyBjYWxsIHRvIF9faXR0X3N1cHByZXNzX21hcmtfcmFuZ2UuICAgSWYgbm90IG1hdGNoaW5nCisgKiAgICAgICAgY2FsbCBpcyBmb3VuZCwgbm90aGluZyBpcyBjaGFuZ2VkLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9zdXBwcmVzc19jbGVhcl9yYW5nZShfX2l0dF9zdXBwcmVzc19tb2RlX3QgbW9kZSwgdW5zaWduZWQgaW50IG1hc2ssIHZvaWQgKiBhZGRyZXNzLCBzaXplX3Qgc2l6ZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN1cHByZXNzX2NsZWFyX3JhbmdlLCAoX19pdHRfc3VwcHJlc3NfbW9kZV90IG1vZGUsIHVuc2lnbmVkIGludCBtYXNrLCB2b2lkICogYWRkcmVzcywgc2l6ZV90IHNpemUpKQorI2RlZmluZSBfX2l0dF9zdXBwcmVzc19jbGVhcl9yYW5nZSAgICAgSVRUTk9USUZZX1ZPSUQoc3VwcHJlc3NfY2xlYXJfcmFuZ2UpCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX2NsZWFyX3JhbmdlX3B0ciBJVFROT1RJRllfTkFNRShzdXBwcmVzc19jbGVhcl9yYW5nZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX2NsZWFyX3JhbmdlKG1hc2spCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX2NsZWFyX3JhbmdlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfY2xlYXJfcmFuZ2VfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSAqLworLyoqIEB9IHN1cHByZXNzIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIHN5bmMgU3luY2hyb25pemF0aW9uCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIEluZGljYXRlIHVzZXItd3JpdHRlbiBzeW5jaHJvbml6YXRpb24gY29kZQorICogQHsKKyAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBAYnJpZWYgcG9zc2libGUgdmFsdWUgb2YgYXR0cmlidXRlIGFyZ3VtZW50IGZvciBzeW5jIG9iamVjdCB0eXBlCisgKi8KKyNkZWZpbmUgX19pdHRfYXR0cl9iYXJyaWVyIDEKKworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBAYnJpZWYgcG9zc2libGUgdmFsdWUgb2YgYXR0cmlidXRlIGFyZ3VtZW50IGZvciBzeW5jIG9iamVjdCB0eXBlCisgKi8KKyNkZWZpbmUgX19pdHRfYXR0cl9tdXRleCAgIDIKKworLyoqCitAYnJpZWYgTmFtZSBhIHN5bmNocm9uaXphdGlvbiBvYmplY3QKK0BwYXJhbVtpbl0gYWRkciAgICAgICBIYW5kbGUgZm9yIHRoZSBzeW5jaHJvbml6YXRpb24gb2JqZWN0LiBZb3Ugc2hvdWxkCit1c2UgYSByZWFsIGFkZHJlc3MgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhlIHN5bmNocm9uaXphdGlvbiBvYmplY3QuCitAcGFyYW1baW5dIG9ianR5cGUgICAgbnVsbC10ZXJtaW5hdGVkIG9iamVjdCB0eXBlIHN0cmluZy4gSWYgTlVMTCBpcworcGFzc2VkLCB0aGUgbmFtZSB3aWxsIGJlICJVc2VyIFN5bmNocm9uaXphdGlvbiIuCitAcGFyYW1baW5dIG9iam5hbWUgICAgbnVsbC10ZXJtaW5hdGVkIG9iamVjdCBuYW1lIHN0cmluZy4gSWYgTlVMTCwKK25vIG5hbWUgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgb2JqZWN0LgorQHBhcmFtW2luXSBhdHRyaWJ1dGUgIG9uZSBvZiBbI19faXR0X2F0dHJfYmFycmllciwgI19faXR0X2F0dHJfbXV0ZXhdCisgKi8KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgordm9pZCBJVFRBUEkgX19pdHRfc3luY19jcmVhdGVBKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpOwordm9pZCBJVFRBUEkgX19pdHRfc3luY19jcmVhdGVXKHZvaWQgKmFkZHIsIGNvbnN0IHdjaGFyX3QgKm9ianR5cGUsIGNvbnN0IHdjaGFyX3QgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZSAgICAgX19pdHRfc3luY19jcmVhdGVXCisjICBkZWZpbmUgX19pdHRfc3luY19jcmVhdGVfcHRyIF9faXR0X3N5bmNfY3JlYXRlV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZSAgICAgX19pdHRfc3luY19jcmVhdGVBCisjICBkZWZpbmUgX19pdHRfc3luY19jcmVhdGVfcHRyIF9faXR0X3N5bmNfY3JlYXRlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N5bmNfY3JlYXRlICh2b2lkICphZGRyLCBjb25zdCBjaGFyICpvYmp0eXBlLCBjb25zdCBjaGFyICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19jcmVhdGVBLCAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX2NyZWF0ZVcsICh2b2lkICphZGRyLCBjb25zdCB3Y2hhcl90ICpvYmp0eXBlLCBjb25zdCB3Y2hhcl90ICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfY3JlYXRlLCAgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIqICAgIG9ianR5cGUsIGNvbnN0IGNoYXIqICAgIG9iam5hbWUsIGludCBhdHRyaWJ1dGUpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZUEgICAgIElUVE5PVElGWV9WT0lEKHN5bmNfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfc3luY19jcmVhdGVBX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlVyAgICAgSVRUTk9USUZZX1ZPSUQoc3luY19jcmVhdGVXKQorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZVdfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfY3JlYXRlVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZSAgICAgSVRUTk9USUZZX1ZPSUQoc3luY19jcmVhdGUpCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX2NyZWF0ZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlQShhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZVcoYWRkciwgb2JqdHlwZSwgb2JqbmFtZSwgYXR0cmlidXRlKQorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZShhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3luY19jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorQGJyaWVmIFJlbmFtZSBhIHN5bmNocm9uaXphdGlvbiBvYmplY3QKKworWW91IGNhbiB1c2UgdGhlIHJlbmFtZSBjYWxsIHRvIGFzc2lnbiBvciByZWFzc2lnbiBhIG5hbWUgdG8gYSBnaXZlbgorc3luY2hyb25pemF0aW9uIG9iamVjdC4KK0BwYXJhbVtpbl0gYWRkciAgaGFuZGxlIGZvciB0aGUgc3luY2hyb25pemF0aW9uIG9iamVjdC4KK0BwYXJhbVtpbl0gbmFtZSAgbnVsbC10ZXJtaW5hdGVkIG9iamVjdCBuYW1lIHN0cmluZy4KKyovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCit2b2lkIElUVEFQSSBfX2l0dF9zeW5jX3JlbmFtZUEodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqbmFtZSk7Cit2b2lkIElUVEFQSSBfX2l0dF9zeW5jX3JlbmFtZVcodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqbmFtZSk7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lICAgICBfX2l0dF9zeW5jX3JlbmFtZVcKKyMgIGRlZmluZSBfX2l0dF9zeW5jX3JlbmFtZV9wdHIgX19pdHRfc3luY19yZW5hbWVXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lICAgICBfX2l0dF9zeW5jX3JlbmFtZUEKKyMgIGRlZmluZSBfX2l0dF9zeW5jX3JlbmFtZV9wdHIgX19pdHRfc3luY19yZW5hbWVBX3B0cgorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLwordm9pZCBJVFRBUEkgX19pdHRfc3luY19yZW5hbWUodm9pZCAqYWRkciwgY29uc3QgY2hhciAqbmFtZSk7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfcmVuYW1lQSwgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19yZW5hbWVXLCAodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqbmFtZSkpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3JlbmFtZSwgICh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpuYW1lKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVBICAgICBJVFROT1RJRllfVk9JRChzeW5jX3JlbmFtZUEpCisjZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lQV9wdHIgSVRUTk9USUZZX05BTUUoc3luY19yZW5hbWVBKQorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZVcgICAgIElUVE5PVElGWV9WT0lEKHN5bmNfcmVuYW1lVykKKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVXX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX3JlbmFtZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWUgICAgIElUVE5PVElGWV9WT0lEKHN5bmNfcmVuYW1lKQorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZV9wdHIgSVRUTk9USUZZX05BTUUoc3luY19yZW5hbWUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZUEoYWRkciwgbmFtZSkKKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVBX3B0ciAwCisjZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lVyhhZGRyLCBuYW1lKQorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZShhZGRyLCBuYW1lKQorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lQV9wdHIgMAorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyBAYnJpZWYgRGVzdHJveSBhIHN5bmNocm9uaXphdGlvbiBvYmplY3QuCisgQHBhcmFtIGFkZHIgSGFuZGxlIGZvciB0aGUgc3luY2hyb25pemF0aW9uIG9iamVjdC4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc3luY19kZXN0cm95KHZvaWQgKmFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX2Rlc3Ryb3ksICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfc3luY19kZXN0cm95ICAgICBJVFROT1RJRllfVk9JRChzeW5jX2Rlc3Ryb3kpCisjZGVmaW5lIF9faXR0X3N5bmNfZGVzdHJveV9wdHIgSVRUTk9USUZZX05BTUUoc3luY19kZXN0cm95KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3luY19kZXN0cm95KGFkZHIpCisjZGVmaW5lIF9faXR0X3N5bmNfZGVzdHJveV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N5bmNfZGVzdHJveV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqCisgKiBAbmFtZSBncm91cCBvZiBmdW5jdGlvbnMgaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnQgdG9vbHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQHsgKi8KKy8qKgorICogQGJyaWVmIEVudGVyIHNwaW4gbG9vcCBvbiB1c2VyLWRlZmluZWQgc3luYyBvYmplY3QKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc3luY19wcmVwYXJlKHZvaWQqIGFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3ByZXBhcmUsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfc3luY19wcmVwYXJlICAgICBJVFROT1RJRllfVk9JRChzeW5jX3ByZXBhcmUpCisjZGVmaW5lIF9faXR0X3N5bmNfcHJlcGFyZV9wdHIgSVRUTk9USUZZX05BTUUoc3luY19wcmVwYXJlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3luY19wcmVwYXJlKGFkZHIpCisjZGVmaW5lIF9faXR0X3N5bmNfcHJlcGFyZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N5bmNfcHJlcGFyZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBRdWl0IHNwaW4gbG9vcCB3aXRob3V0IGFjcXVpcmluZyBzcGluIG9iamVjdAorICovCit2b2lkIElUVEFQSSBfX2l0dF9zeW5jX2NhbmNlbCh2b2lkICphZGRyKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19jYW5jZWwsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfc3luY19jYW5jZWwgICAgIElUVE5PVElGWV9WT0lEKHN5bmNfY2FuY2VsKQorI2RlZmluZSBfX2l0dF9zeW5jX2NhbmNlbF9wdHIgSVRUTk9USUZZX05BTUUoc3luY19jYW5jZWwpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9zeW5jX2NhbmNlbChhZGRyKQorI2RlZmluZSBfX2l0dF9zeW5jX2NhbmNlbF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N5bmNfY2FuY2VsX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFN1Y2Nlc3NmdWwgc3BpbiBsb29wIGNvbXBsZXRpb24gKHN5bmMgb2JqZWN0IGFjcXVpcmVkKQorICovCit2b2lkIElUVEFQSSBfX2l0dF9zeW5jX2FjcXVpcmVkKHZvaWQgKmFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX2FjcXVpcmVkLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X3N5bmNfYWNxdWlyZWQgICAgIElUVE5PVElGWV9WT0lEKHN5bmNfYWNxdWlyZWQpCisjZGVmaW5lIF9faXR0X3N5bmNfYWNxdWlyZWRfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfYWNxdWlyZWQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9zeW5jX2FjcXVpcmVkKGFkZHIpCisjZGVmaW5lIF9faXR0X3N5bmNfYWNxdWlyZWRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zeW5jX2FjcXVpcmVkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFN0YXJ0IHN5bmMgb2JqZWN0IHJlbGVhc2luZyBjb2RlLiBJcyBjYWxsZWQgYmVmb3JlIHRoZSBsb2NrIHJlbGVhc2UgY2FsbC4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc3luY19yZWxlYXNpbmcodm9pZCogYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfcmVsZWFzaW5nLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X3N5bmNfcmVsZWFzaW5nICAgICBJVFROT1RJRllfVk9JRChzeW5jX3JlbGVhc2luZykKKyNkZWZpbmUgX19pdHRfc3luY19yZWxlYXNpbmdfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfcmVsZWFzaW5nKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3luY19yZWxlYXNpbmcoYWRkcikKKyNkZWZpbmUgX19pdHRfc3luY19yZWxlYXNpbmdfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zeW5jX3JlbGVhc2luZ19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9ICovCisKKy8qKiBAfSBzeW5jIGdyb3VwICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioKKyAqIEBuYW1lIGdyb3VwIG9mIGZ1bmN0aW9ucyBpcyB1c2VkIGZvciBjb3JyZWN0bmVzcyBjaGVja2luZyB0b29scworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAeyAqLworLyoqCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBGYXN0IHN5bmNocm9uaXphdGlvbiB3aGljaCBkb2VzIG5vIHJlcXVpcmUgc3Bpbm5pbmcuCisgKiAtIFRoaXMgc3BlY2lhbCBmdW5jdGlvbiBpcyB0byBiZSB1c2VkIGJ5IFRCQiBhbmQgT3Blbk1QIGxpYnJhcmllcyBvbmx5IHdoZW4gdGhleSBrbm93CisgKiAgIHRoZXJlIGlzIG5vIHNwaW4gYnV0IHRoZXkgbmVlZCB0byBzdXBwcmVzcyBUQyB3YXJuaW5ncyBhYm91dCBzaGFyZWQgdmFyaWFibGUgbW9kaWZpY2F0aW9ucy4KKyAqIC0gSXQgb25seSBoYXMgY29ycmVzcG9uZGluZyBwb2ludGVycyBpbiBzdGF0aWMgbGlicmFyeSBhbmQgZG9lcyBub3QgaGF2ZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uCisgKiAgIGluIGR5bmFtaWMgbGlicmFyeS4KKyAqIEBzZWUgdm9pZCBfX2l0dF9zeW5jX3ByZXBhcmUodm9pZCogYWRkcik7CisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2ZzeW5jX3ByZXBhcmUodm9pZCogYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZzeW5jX3ByZXBhcmUsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfZnN5bmNfcHJlcGFyZSAgICAgSVRUTk9USUZZX1ZPSUQoZnN5bmNfcHJlcGFyZSkKKyNkZWZpbmUgX19pdHRfZnN5bmNfcHJlcGFyZV9wdHIgSVRUTk9USUZZX05BTUUoZnN5bmNfcHJlcGFyZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2ZzeW5jX3ByZXBhcmUoYWRkcikKKyNkZWZpbmUgX19pdHRfZnN5bmNfcHJlcGFyZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2ZzeW5jX3ByZXBhcmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBGYXN0IHN5bmNocm9uaXphdGlvbiB3aGljaCBkb2VzIG5vIHJlcXVpcmUgc3Bpbm5pbmcuCisgKiAtIFRoaXMgc3BlY2lhbCBmdW5jdGlvbiBpcyB0byBiZSB1c2VkIGJ5IFRCQiBhbmQgT3Blbk1QIGxpYnJhcmllcyBvbmx5IHdoZW4gdGhleSBrbm93CisgKiAgIHRoZXJlIGlzIG5vIHNwaW4gYnV0IHRoZXkgbmVlZCB0byBzdXBwcmVzcyBUQyB3YXJuaW5ncyBhYm91dCBzaGFyZWQgdmFyaWFibGUgbW9kaWZpY2F0aW9ucy4KKyAqIC0gSXQgb25seSBoYXMgY29ycmVzcG9uZGluZyBwb2ludGVycyBpbiBzdGF0aWMgbGlicmFyeSBhbmQgZG9lcyBub3QgaGF2ZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uCisgKiAgIGluIGR5bmFtaWMgbGlicmFyeS4KKyAqIEBzZWUgdm9pZCBfX2l0dF9zeW5jX2NhbmNlbCh2b2lkICphZGRyKTsKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfZnN5bmNfY2FuY2VsKHZvaWQgKmFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmc3luY19jYW5jZWwsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfZnN5bmNfY2FuY2VsICAgICBJVFROT1RJRllfVk9JRChmc3luY19jYW5jZWwpCisjZGVmaW5lIF9faXR0X2ZzeW5jX2NhbmNlbF9wdHIgSVRUTk9USUZZX05BTUUoZnN5bmNfY2FuY2VsKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfZnN5bmNfY2FuY2VsKGFkZHIpCisjZGVmaW5lIF9faXR0X2ZzeW5jX2NhbmNlbF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2ZzeW5jX2NhbmNlbF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIGxlZ2FjeQorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIEZhc3Qgc3luY2hyb25pemF0aW9uIHdoaWNoIGRvZXMgbm8gcmVxdWlyZSBzcGlubmluZy4KKyAqIC0gVGhpcyBzcGVjaWFsIGZ1bmN0aW9uIGlzIHRvIGJlIHVzZWQgYnkgVEJCIGFuZCBPcGVuTVAgbGlicmFyaWVzIG9ubHkgd2hlbiB0aGV5IGtub3cKKyAqICAgdGhlcmUgaXMgbm8gc3BpbiBidXQgdGhleSBuZWVkIHRvIHN1cHByZXNzIFRDIHdhcm5pbmdzIGFib3V0IHNoYXJlZCB2YXJpYWJsZSBtb2RpZmljYXRpb25zLgorICogLSBJdCBvbmx5IGhhcyBjb3JyZXNwb25kaW5nIHBvaW50ZXJzIGluIHN0YXRpYyBsaWJyYXJ5IGFuZCBkb2VzIG5vdCBoYXZlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb24KKyAqICAgaW4gZHluYW1pYyBsaWJyYXJ5LgorICogQHNlZSB2b2lkIF9faXR0X3N5bmNfYWNxdWlyZWQodm9pZCAqYWRkcik7CisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2ZzeW5jX2FjcXVpcmVkKHZvaWQgKmFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmc3luY19hY3F1aXJlZCwgKHZvaWQgKmFkZHIpKQorI2RlZmluZSBfX2l0dF9mc3luY19hY3F1aXJlZCAgICAgSVRUTk9USUZZX1ZPSUQoZnN5bmNfYWNxdWlyZWQpCisjZGVmaW5lIF9faXR0X2ZzeW5jX2FjcXVpcmVkX3B0ciBJVFROT1RJRllfTkFNRShmc3luY19hY3F1aXJlZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2ZzeW5jX2FjcXVpcmVkKGFkZHIpCisjZGVmaW5lIF9faXR0X2ZzeW5jX2FjcXVpcmVkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfZnN5bmNfYWNxdWlyZWRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBGYXN0IHN5bmNocm9uaXphdGlvbiB3aGljaCBkb2VzIG5vIHJlcXVpcmUgc3Bpbm5pbmcuCisgKiAtIFRoaXMgc3BlY2lhbCBmdW5jdGlvbiBpcyB0byBiZSB1c2VkIGJ5IFRCQiBhbmQgT3Blbk1QIGxpYnJhcmllcyBvbmx5IHdoZW4gdGhleSBrbm93CisgKiAgIHRoZXJlIGlzIG5vIHNwaW4gYnV0IHRoZXkgbmVlZCB0byBzdXBwcmVzcyBUQyB3YXJuaW5ncyBhYm91dCBzaGFyZWQgdmFyaWFibGUgbW9kaWZpY2F0aW9ucy4KKyAqIC0gSXQgb25seSBoYXMgY29ycmVzcG9uZGluZyBwb2ludGVycyBpbiBzdGF0aWMgbGlicmFyeSBhbmQgZG9lcyBub3QgaGF2ZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uCisgKiAgIGluIGR5bmFtaWMgbGlicmFyeS4KKyAqIEBzZWUgdm9pZCBfX2l0dF9zeW5jX3JlbGVhc2luZyh2b2lkKiBhZGRyKTsKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfZnN5bmNfcmVsZWFzaW5nKHZvaWQqIGFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmc3luY19yZWxlYXNpbmcsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfZnN5bmNfcmVsZWFzaW5nICAgICBJVFROT1RJRllfVk9JRChmc3luY19yZWxlYXNpbmcpCisjZGVmaW5lIF9faXR0X2ZzeW5jX3JlbGVhc2luZ19wdHIgSVRUTk9USUZZX05BTUUoZnN5bmNfcmVsZWFzaW5nKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfZnN5bmNfcmVsZWFzaW5nKGFkZHIpCisjZGVmaW5lIF9faXR0X2ZzeW5jX3JlbGVhc2luZ19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2ZzeW5jX3JlbGVhc2luZ19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9ICovCisKKy8qKgorICogQGRlZmdyb3VwIG1vZGVsIE1vZGVsaW5nIGJ5IEludGVsKFIpIFBhcmFsbGVsIEFkdmlzb3IKKyAqIEBpbmdyb3VwIHB1YmxpYworICogVGhpcyBpcyB0aGUgc3Vic2V0IG9mIGl0dCB1c2VkIGZvciBtb2RlbGluZyBieSBJbnRlbChSKSBQYXJhbGxlbCBBZHZpc29yLgorICogVGhpcyBBUEkgaXMgY2FsbGVkIE9OTFkgdXNpbmcgYW5ub3RhdGUuaCwgYnkgIkFubm90YXRpb24iIG1hY3JvcworICogdGhlIHVzZXIgcGxhY2VzIGluIHRoZWlyIHNvdXJjZXMgZHVyaW5nIHRoZSBwYXJhbGxlbGlzbSBtb2RlbGluZyBzdGVwcy4KKyAqCisgKiBzaXRlX2JlZ2luL2VuZCBhbmQgdGFza19iZWdpbi9lbmQgdGFrZSB0aGUgYWRkcmVzcyBvZiBoYW5kbGUgdmFyaWFibGVzLAorICogd2hpY2ggYXJlIHdyaXRlYWJsZSBieSB0aGUgQVBJLiAgSGFuZGxlcyBtdXN0IGJlIDAgaW5pdGlhbGl6ZWQgcHJpb3IKKyAqIHRvIHRoZSBmaXJzdCBjYWxsIHRvIGJlZ2luLCBvciBtYXkgY2F1c2UgYSBydW4tdGltZSBmYWlsdXJlLgorICogVGhlIGhhbmRsZXMgYXJlIGluaXRpYWxpemVkIGluIGEgbXVsdGktdGhyZWFkIHNhZmUgd2F5IGJ5IHRoZSBBUEkgaWYKKyAqIHRoZSBoYW5kbGUgaXMgMC4gIFRoZSBjb21tb25seSBleHBlY3RlZCBpZGlvbSBpcyBvbmUgc3RhdGljIGhhbmRsZSB0bworICogaWRlbnRpZnkgYSBzaXRlIG9yIHRhc2suICBJZiBhIHNpdGUgb3IgdGFzayBvZiB0aGUgc2FtZSBuYW1lIGhhcyBhbHJlYWR5CisgKiBiZWVuIHN0YXJ0ZWQgZHVyaW5nIHRoaXMgY29sbGVjdGlvbiwgdGhlIHNhbWUgaGFuZGxlIE1BWSBiZSByZXR1cm5lZCwKKyAqIGJ1dCBpcyBub3QgcmVxdWlyZWQgdG8gYmUgLSBpdCBpcyB1bnNwZWNpZmllZCBpZiBkYXRhIG1lcmdpbmcgaXMgZG9uZQorICogYmFzZWQgb24gbmFtZS4gIFRoZXNlIHJvdXRpbmVzIGFsc28gdGFrZSBhbiBpbnN0YW5jZSB2YXJpYWJsZS4gIExpa2UKKyAqIHRoZSBsZXhpY2FsIGluc3RhbmNlLCB0aGVzZSBtdXN0IGJlIDAgaW5pdGlhbGl6ZWQuICBVbmxpa2UgdGhlIGxleGljYWwKKyAqIGluc3RhbmNlLCB0aGlzIGlzIHVzZWQgdG8gdHJhY2sgYSBzaW5nbGUgZHluYW1pYyBpbnN0YW5jZS4KKyAqCisgKiBBUEkgdXNlZCBieSB0aGUgSW50ZWwoUikgUGFyYWxsZWwgQWR2aXNvciB0byBkZXNjcmliZSBwb3RlbnRpYWwgY29uY3VycmVuY3kKKyAqIGFuZCByZWxhdGVkIGFjdGl2aXRpZXMuIFVzZXItYWRkZWQgc291cmNlIGFubm90YXRpb25zIGV4cGFuZCB0byBjYWxscworICogdG8gdGhlc2UgcHJvY2VkdXJlcyB0byBlbmFibGUgbW9kZWxpbmcgb2YgYSBoeXBvdGhldGljYWwgY29uY3VycmVudAorICogZXhlY3V0aW9uIHNlcmlhbGx5LgorICogQHsKKyAqLworI2lmICFkZWZpbmVkKF9BRFZJU09SX0FOTk9UQVRFX0hfKSB8fCBkZWZpbmVkKEFOTk9UQVRFX0VYUEFORF9OVUxMKQorCit0eXBlZGVmIHZvaWQqIF9faXR0X21vZGVsX3NpdGU7ICAgICAgICAgICAgIC8qITwgQGJyaWVmIGhhbmRsZSBmb3IgbGV4aWNhbCBzaXRlICAgICAqLwordHlwZWRlZiB2b2lkKiBfX2l0dF9tb2RlbF9zaXRlX2luc3RhbmNlOyAgICAvKiE8IEBicmllZiBoYW5kbGUgZm9yIGR5bmFtaWMgaW5zdGFuY2UgKi8KK3R5cGVkZWYgdm9pZCogX19pdHRfbW9kZWxfdGFzazsgICAgICAgICAgICAgLyohPCBAYnJpZWYgaGFuZGxlIGZvciBsZXhpY2FsIHNpdGUgICAgICovCit0eXBlZGVmIHZvaWQqIF9faXR0X21vZGVsX3Rhc2tfaW5zdGFuY2U7ICAgIC8qITwgQGJyaWVmIGhhbmRsZSBmb3IgZHluYW1pYyBpbnN0YW5jZSAqLworCisvKioKKyAqIEBlbnVtIF9faXR0X21vZGVsX2Rpc2FibGUKKyAqIEBicmllZiBFbnVtZXJhdG9yIGZvciB0aGUgZGlzYWJsZSBtZXRob2RzCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgX19pdHRfbW9kZWxfZGlzYWJsZV9vYnNlcnZhdGlvbiwKKyAgICBfX2l0dF9tb2RlbF9kaXNhYmxlX2NvbGxlY3Rpb24KK30gX19pdHRfbW9kZWxfZGlzYWJsZTsKKworI2VuZGlmIC8qICFfQURWSVNPUl9BTk5PVEFURV9IXyB8fCBBTk5PVEFURV9FWFBBTkRfTlVMTCAqLworCisvKioKKyAqIEBicmllZiBBTk5PVEFURV9TSVRFX0JFR0lOL0FOTk9UQVRFX1NJVEVfRU5EIHN1cHBvcnQuCisgKgorICogc2l0ZV9iZWdpbi9lbmQgbW9kZWwgYSBwb3RlbnRpYWwgY29uY3VycmVuY3kgc2l0ZS4KKyAqIHNpdGUgaW5zdGFuY2VzIG1heSBiZSByZWN1cnNpdmVseSBuZXN0ZWQgd2l0aCB0aGVtc2VsdmVzLgorICogc2l0ZV9lbmQgZXhpdHMgdGhlIG1vc3QgcmVjZW50bHkgc3RhcnRlZCBidXQgdW5lbmRlZCBzaXRlIGZvciB0aGUgY3VycmVudAorICogdGhyZWFkLiAgVGhlIGhhbmRsZSBwYXNzZWQgdG8gZW5kIG1heSBiZSB1c2VkIHRvIHZhbGlkYXRlIHN0cnVjdHVyZS4KKyAqIEluc3RhbmNlcyBvZiBhIHNpdGUgZW5jb3VudGVyZWQgb24gZGlmZmVyZW50IHRocmVhZHMgY29uY3VycmVudGx5CisgKiBhcmUgY29uc2lkZXJlZCBjb21wbGV0ZWx5IGRpc3RpbmN0LiBJZiB0aGUgc2l0ZSBuYW1lIGZvciB0d28gZGlmZmVyZW50CisgKiBsZXhpY2FsIHNpdGVzIG1hdGNoLCBpdCBpcyB1bnNwZWNpZmllZCB3aGV0aGVyIHRoZXkgYXJlIHRyZWF0ZWQgYXMgdGhlCisgKiBzYW1lIG9yIGRpZmZlcmVudCBmb3IgZGF0YSBwcmVzZW50YXRpb24uCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3NpdGVfYmVnaW4oX19pdHRfbW9kZWxfc2l0ZSAqc2l0ZSwgX19pdHRfbW9kZWxfc2l0ZV9pbnN0YW5jZSAqaW5zdGFuY2UsIGNvbnN0IGNoYXIgKm5hbWUpOworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfc2l0ZV9iZWdpblcoY29uc3Qgd2NoYXJfdCAqbmFtZSk7CisjZW5kaWYKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3NpdGVfYmVnaW5BKGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbkFMKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBzaXRlTmFtZUxlbik7Cit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9zaXRlX2VuZCAgKF9faXR0X21vZGVsX3NpdGUgKnNpdGUsIF9faXR0X21vZGVsX3NpdGVfaW5zdGFuY2UgKmluc3RhbmNlKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3NpdGVfZW5kXzIodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfYmVnaW4sICAoX19pdHRfbW9kZWxfc2l0ZSAqc2l0ZSwgX19pdHRfbW9kZWxfc2l0ZV9pbnN0YW5jZSAqaW5zdGFuY2UsIGNvbnN0IGNoYXIgKm5hbWUpKQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfc2l0ZV9iZWdpblcsICAoY29uc3Qgd2NoYXJfdCAqbmFtZSkpCisjZW5kaWYKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfYmVnaW5BLCAgKGNvbnN0IGNoYXIgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfc2l0ZV9iZWdpbkFMLCAgKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBzaXRlTmFtZUxlbikpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9zaXRlX2VuZCwgICAgKF9faXR0X21vZGVsX3NpdGUgKnNpdGUsIF9faXR0X21vZGVsX3NpdGVfaW5zdGFuY2UgKmluc3RhbmNlKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfZW5kXzIsICAodm9pZCkpCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfYmVnaW4gICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9zaXRlX2JlZ2luKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luX3B0ciAgSVRUTk9USUZZX05BTUUobW9kZWxfc2l0ZV9iZWdpbikKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpblcgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9zaXRlX2JlZ2luVykKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbldfcHRyICBJVFROT1RJRllfTkFNRShtb2RlbF9zaXRlX2JlZ2luVykKKyNlbmRpZgorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQSAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3NpdGVfYmVnaW5BKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQV9wdHIgIElUVE5PVElGWV9OQU1FKG1vZGVsX3NpdGVfYmVnaW5BKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQUwgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9zaXRlX2JlZ2luQUwpCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfYmVnaW5BTF9wdHIgIElUVE5PVElGWV9OQU1FKG1vZGVsX3NpdGVfYmVnaW5BTCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9lbmQgICAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3NpdGVfZW5kKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2VuZF9wdHIgICAgSVRUTk9USUZZX05BTUUobW9kZWxfc2l0ZV9lbmQpCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfZW5kXzIgICAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3NpdGVfZW5kXzIpCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfZW5kXzJfcHRyICAgIElUVE5PVElGWV9OQU1FKG1vZGVsX3NpdGVfZW5kXzIpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luKHNpdGUsIGluc3RhbmNlLCBuYW1lKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luX3B0ciAgMAorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luVyhuYW1lKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luV19wdHIgIDAKKyNlbmRpZgorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQShuYW1lKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQV9wdHIgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbkFMKG5hbWUsIHNpdGVOYW1lTGVuKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQUxfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfZW5kKHNpdGUsIGluc3RhbmNlKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2VuZF9wdHIgICAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2VuZF8yKCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9lbmRfMl9wdHIgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfYmVnaW5fcHRyICAwCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfYmVnaW5XX3B0ciAgMAorI2VuZGlmCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfYmVnaW5BX3B0ciAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQUxfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfZW5kX3B0ciAgICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfZW5kXzJfcHRyICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgQU5OT1RBVEVfVEFTS19CRUdJTi9BTk5PVEFURV9UQVNLX0VORCBzdXBwb3J0CisgKgorICogdGFza19iZWdpbi9lbmQgbW9kZWwgYSBwb3RlbnRpYWwgdGFzaywgd2hpY2ggaXMgY29udGFpbmVkIHdpdGhpbiB0aGUgbW9zdAorICogY2xvc2VseSBlbmNsb3NpbmcgZHluYW1pYyBzaXRlLiAgdGFza19lbmQgZXhpdHMgdGhlIG1vc3QgcmVjZW50bHkgc3RhcnRlZAorICogYnV0IHVuZW5kZWQgdGFzay4gIFRoZSBoYW5kbGUgcGFzc2VkIHRvIGVuZCBtYXkgYmUgdXNlZCB0byB2YWxpZGF0ZQorICogc3RydWN0dXJlLiAgSXQgaXMgdW5zcGVjaWZpZWQgaWYgYmFkIGR5bmFtaWMgbmVzdGluZyBpcyBkZXRlY3RlZC4gIElmIGl0CisgKiBpcywgaXQgc2hvdWxkIGJlIGVuY29kZWQgaW4gdGhlIHJlc3VsdGluZyBkYXRhIGNvbGxlY3Rpb24uICBUaGUgY29sbGVjdG9yCisgKiBzaG91bGQgbm90IGZhaWwgZHVlIHRvIGNvbnN0cnVjdCBuZXN0aW5nIGlzc3Vlcywgbm9yIGF0dGVtcHQgdG8gZGlyZWN0bHkKKyAqIGluZGljYXRlIHRoZSBwcm9ibGVtLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luKF9faXR0X21vZGVsX3Rhc2sgKnRhc2ssIF9faXR0X21vZGVsX3Rhc2tfaW5zdGFuY2UgKmluc3RhbmNlLCBjb25zdCBjaGFyICpuYW1lKTsKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5XKGNvbnN0IHdjaGFyX3QgKm5hbWUpOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tXKGNvbnN0IHdjaGFyX3QgKm5hbWUpOworI2VuZGlmCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQShjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5BTChjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgdGFza05hbWVMZW4pOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tBKGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tBTChjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgdGFza05hbWVMZW4pOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfdGFza19lbmQgIChfX2l0dF9tb2RlbF90YXNrICp0YXNrLCBfX2l0dF9tb2RlbF90YXNrX2luc3RhbmNlICppbnN0YW5jZSk7Cit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF90YXNrX2VuZF8yKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2JlZ2luLCAgKF9faXR0X21vZGVsX3Rhc2sgKnRhc2ssIF9faXR0X21vZGVsX3Rhc2tfaW5zdGFuY2UgKmluc3RhbmNlLCBjb25zdCBjaGFyICpuYW1lKSkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3Rhc2tfYmVnaW5XLCAgKGNvbnN0IHdjaGFyX3QgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfaXRlcmF0aW9uX3Rhc2tXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSkpCisjZW5kaWYKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3Rhc2tfYmVnaW5BLCAgKGNvbnN0IGNoYXIgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfdGFza19iZWdpbkFMLCAgKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCB0YXNrTmFtZUxlbikpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9pdGVyYXRpb25fdGFza0EsICAoY29uc3QgY2hhciAqbmFtZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9pdGVyYXRpb25fdGFza0FMLCAgKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCB0YXNrTmFtZUxlbikpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2VuZCwgICAgKF9faXR0X21vZGVsX3Rhc2sgKnRhc2ssIF9faXR0X21vZGVsX3Rhc2tfaW5zdGFuY2UgKmluc3RhbmNlKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3Rhc2tfZW5kXzIsICAodm9pZCkpCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfYmVnaW4gICAgICBJVFROT1RJRllfVk9JRChtb2RlbF90YXNrX2JlZ2luKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luX3B0ciAgSVRUTk9USUZZX05BTUUobW9kZWxfdGFza19iZWdpbikKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpblcgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3Rhc2tfYmVnaW5XKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luV19wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfdGFza19iZWdpblcpCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrVyAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfaXRlcmF0aW9uX3Rhc2tXKQorI2RlZmluZSBfX2l0dF9tb2RlbF9pdGVyYXRpb25fdGFza1dfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX2l0ZXJhdGlvbl90YXNrVykKKyNlbmRpZgorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQSAgICBJVFROT1RJRllfVk9JRChtb2RlbF90YXNrX2JlZ2luQSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbkFfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX3Rhc2tfYmVnaW5BKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQUwgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfdGFza19iZWdpbkFMKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQUxfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX3Rhc2tfYmVnaW5BTCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tBICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2l0ZXJhdGlvbl90YXNrQSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tBX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF9pdGVyYXRpb25fdGFza0EpCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQUwgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfaXRlcmF0aW9uX3Rhc2tBTCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tBTF9wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfaXRlcmF0aW9uX3Rhc2tBTCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19lbmQgICAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3Rhc2tfZW5kKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2VuZF9wdHIgICAgSVRUTk9USUZZX05BTUUobW9kZWxfdGFza19lbmQpCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfZW5kXzIgICAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3Rhc2tfZW5kXzIpCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfZW5kXzJfcHRyICAgIElUVE5PVElGWV9OQU1FKG1vZGVsX3Rhc2tfZW5kXzIpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luKHRhc2ssIGluc3RhbmNlLCBuYW1lKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luX3B0ciAgMAorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luVyhuYW1lKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luV19wdHIgIDAKKyNlbmRpZgorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQShuYW1lKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQV9wdHIgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbkFMKG5hbWUsIHNpdGVOYW1lTGVuKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQUxfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQShuYW1lKQorI2RlZmluZSBfX2l0dF9tb2RlbF9pdGVyYXRpb25fdGFza0FfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQUwobmFtZSwgc2l0ZU5hbWVMZW4pCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQUxfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfZW5kKHRhc2ssIGluc3RhbmNlKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2VuZF9wdHIgICAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2VuZF8yKCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19lbmRfMl9wdHIgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5fcHRyICAwCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5XX3B0ciAwCisjZW5kaWYKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbkFfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5BTF9wdHIgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tBX3B0ciAgICAwCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQUxfcHRyICAgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19lbmRfcHRyICAgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19lbmRfMl9wdHIgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBBTk5PVEFURV9MT0NLX0FDUVVJUkUvQU5OT1RBVEVfTE9DS19SRUxFQVNFIHN1cHBvcnQKKyAqCisgKiBsb2NrX2FjcXVpcmUvcmVsZWFzZSBtb2RlbCBhIHBvdGVudGlhbCBsb2NrIGZvciBib3RoIGxvY2tzZXQgYW5kCisgKiBwZXJmb3JtYW5jZSBtb2RlbGluZy4gIEVhY2ggdW5pcXVlIGFkZHJlc3MgaXMgbW9kZWxlZCBhcyBhIHNlcGFyYXRlCisgKiBsb2NrLCB3aXRoIGludmFsaWQgYWRkcmVzc2VzIGJlaW5nIHZhbGlkIGxvY2sgSURzLiAgU3BlY2lmaWNhbGx5OgorICogbm8gc3RvcmFnZSBpcyBhY2Nlc3NlZCBieSB0aGUgQVBJIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcyAtIGl0IGlzIG9ubHkKKyAqIHVzZWQgZm9yIGxvY2sgaWRlbnRpZmljYXRpb24uICBMb2NrIGFjcXVpcmVzIG1heSBiZSBzZWxmLW5lc3RlZCBhbmQgYXJlCisgKiB1bmxvY2tlZCBieSBhIGNvcnJlc3BvbmRpbmcgbnVtYmVyIG9mIHJlbGVhc2VzLgorICogKFRoZXNlIGNsb3NlbHkgY29ycmVzcG9uZCB0byBfX2l0dF9zeW5jX2FjcXVpcmVkL19faXR0X3N5bmNfcmVsZWFzaW5nLAorICogYnV0IG1heSBub3QgaGF2ZSBpZGVudGljYWwgc2VtYW50aWNzLikKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlKHZvaWQgKmxvY2spOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlXzIodm9pZCAqbG9jayk7Cit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2Uodm9pZCAqbG9jayk7Cit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2VfMih2b2lkICpsb2NrKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfbG9ja19hY3F1aXJlLCAodm9pZCAqbG9jaykpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9sb2NrX2FjcXVpcmVfMiwgKHZvaWQgKmxvY2spKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfbG9ja19yZWxlYXNlLCAodm9pZCAqbG9jaykpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9sb2NrX3JlbGVhc2VfMiwgKHZvaWQgKmxvY2spKQorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX2FjcXVpcmUgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2xvY2tfYWNxdWlyZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF9sb2NrX2FjcXVpcmUpCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfYWNxdWlyZV8yICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9sb2NrX2FjcXVpcmVfMikKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlXzJfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX2xvY2tfYWNxdWlyZV8yKQorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2UgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2xvY2tfcmVsZWFzZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19yZWxlYXNlX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF9sb2NrX3JlbGVhc2UpCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfcmVsZWFzZV8yICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9sb2NrX3JlbGVhc2VfMikKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19yZWxlYXNlXzJfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX2xvY2tfcmVsZWFzZV8yKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlKGxvY2spCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfYWNxdWlyZV9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX2FjcXVpcmVfMihsb2NrKQorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX2FjcXVpcmVfMl9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2UobG9jaykKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19yZWxlYXNlX3B0ciAwCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfcmVsZWFzZV8yKGxvY2spCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfcmVsZWFzZV8yX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlX3B0ciAwCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfYWNxdWlyZV8yX3B0ciAwCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfcmVsZWFzZV9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2VfMl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBBTk5PVEFURV9SRUNPUkRfQUxMT0NBVElPTi9BTk5PVEFURV9SRUNPUkRfREVBTExPQ0FUSU9OIHN1cHBvcnQKKyAqCisgKiByZWNvcmRfYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24gZGVzY3JpYmUgdXNlci1kZWZpbmVkIG1lbW9yeSBhbGxvY2F0b3IKKyAqIGJlaGF2aW9yLCB3aGljaCBtYXkgYmUgcmVxdWlyZWQgZm9yIGNvcnJlY3RuZXNzIG1vZGVsaW5nIHRvIHVuZGVyc3RhbmQKKyAqIHdoZW4gc3RvcmFnZSBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgYWN0dWFsbHkgcmV1c2VkIGFjcm9zcyB0aHJlYWRzLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9yZWNvcmRfYWxsb2NhdGlvbiAgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3JlY29yZF9kZWFsbG9jYXRpb24odm9pZCAqYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3JlY29yZF9hbGxvY2F0aW9uLCAgICh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9yZWNvcmRfZGVhbGxvY2F0aW9uLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X21vZGVsX3JlY29yZF9hbGxvY2F0aW9uICAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3JlY29yZF9hbGxvY2F0aW9uKQorI2RlZmluZSBfX2l0dF9tb2RlbF9yZWNvcmRfYWxsb2NhdGlvbl9wdHIgICBJVFROT1RJRllfTkFNRShtb2RlbF9yZWNvcmRfYWxsb2NhdGlvbikKKyNkZWZpbmUgX19pdHRfbW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbiAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbikKKyNkZWZpbmUgX19pdHRfbW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbl9wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21vZGVsX3JlY29yZF9hbGxvY2F0aW9uKGFkZHIsIHNpemUpCisjZGVmaW5lIF9faXR0X21vZGVsX3JlY29yZF9hbGxvY2F0aW9uX3B0ciAgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbihhZGRyKQorI2RlZmluZSBfX2l0dF9tb2RlbF9yZWNvcmRfZGVhbGxvY2F0aW9uX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfcmVjb3JkX2FsbG9jYXRpb25fcHRyICAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9yZWNvcmRfZGVhbGxvY2F0aW9uX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIEFOTk9UQVRFX0lORFVDVElPTl9VU0VTIHN1cHBvcnQKKyAqCisgKiBOb3RlIHBhcnRpY3VsYXIgc3RvcmFnZSBpcyBpbmR1Y3RpdmUgdGhyb3VnaCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHNpdGUKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfaW5kdWN0aW9uX3VzZXModm9pZCogYWRkciwgc2l6ZV90IHNpemUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9pbmR1Y3Rpb25fdXNlcywgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfaW5kdWN0aW9uX3VzZXMgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2luZHVjdGlvbl91c2VzKQorI2RlZmluZSBfX2l0dF9tb2RlbF9pbmR1Y3Rpb25fdXNlc19wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfaW5kdWN0aW9uX3VzZXMpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9pbmR1Y3Rpb25fdXNlcyhhZGRyLCBzaXplKQorI2RlZmluZSBfX2l0dF9tb2RlbF9pbmR1Y3Rpb25fdXNlc19wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfaW5kdWN0aW9uX3VzZXNfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBBTk5PVEFURV9SRURVQ1RJT05fVVNFUyBzdXBwb3J0CisgKgorICogTm90ZSBwYXJ0aWN1bGFyIHN0b3JhZ2UgaXMgdXNlZCBmb3IgcmVkdWN0aW9uIHRocm91Z2ggdGhlIGVuZAorICogb2YgdGhlIGN1cnJlbnQgc2l0ZQorICovCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9yZWR1Y3Rpb25fdXNlcyh2b2lkKiBhZGRyLCBzaXplX3Qgc2l6ZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3JlZHVjdGlvbl91c2VzLCAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpKQorI2RlZmluZSBfX2l0dF9tb2RlbF9yZWR1Y3Rpb25fdXNlcyAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfcmVkdWN0aW9uX3VzZXMpCisjZGVmaW5lIF9faXR0X21vZGVsX3JlZHVjdGlvbl91c2VzX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF9yZWR1Y3Rpb25fdXNlcykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21vZGVsX3JlZHVjdGlvbl91c2VzKGFkZHIsIHNpemUpCisjZGVmaW5lIF9faXR0X21vZGVsX3JlZHVjdGlvbl91c2VzX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9yZWR1Y3Rpb25fdXNlc19wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIEFOTk9UQVRFX09CU0VSVkVfVVNFUyBzdXBwb3J0CisgKgorICogSGF2ZSBjb3JyZWN0bmVzcyBtb2RlbGluZyByZWNvcmQgb2JzZXJ2YXRpb25zIGFib3V0IHVzZXMgb2Ygc3RvcmFnZQorICogdGhyb3VnaCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHNpdGUKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfb2JzZXJ2ZV91c2VzKHZvaWQqIGFkZHIsIHNpemVfdCBzaXplKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfb2JzZXJ2ZV91c2VzLCAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpKQorI2RlZmluZSBfX2l0dF9tb2RlbF9vYnNlcnZlX3VzZXMgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX29ic2VydmVfdXNlcykKKyNkZWZpbmUgX19pdHRfbW9kZWxfb2JzZXJ2ZV91c2VzX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF9vYnNlcnZlX3VzZXMpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9vYnNlcnZlX3VzZXMoYWRkciwgc2l6ZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfb2JzZXJ2ZV91c2VzX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9vYnNlcnZlX3VzZXNfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBBTk5PVEFURV9DTEVBUl9VU0VTIHN1cHBvcnQKKyAqCisgKiBDbGVhciB0aGUgc3BlY2lhbCBoYW5kbGluZyBvZiBhIHBpZWNlIG9mIHN0b3JhZ2UgcmVsYXRlZCB0byBpbmR1Y3Rpb24sCisgKiByZWR1Y3Rpb24gb3Igb2JzZXJ2ZV91c2VzCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX2NsZWFyX3VzZXModm9pZCogYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2NsZWFyX3VzZXMsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfY2xlYXJfdXNlcyAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfY2xlYXJfdXNlcykKKyNkZWZpbmUgX19pdHRfbW9kZWxfY2xlYXJfdXNlc19wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfY2xlYXJfdXNlcykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21vZGVsX2NsZWFyX3VzZXMoYWRkcikKKyNkZWZpbmUgX19pdHRfbW9kZWxfY2xlYXJfdXNlc19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21vZGVsX2NsZWFyX3VzZXNfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgQU5OT1RBVEVfRElTQUJMRV8qX1BVU0gvQU5OT1RBVEVfRElTQUJMRV8qX1BPUCBzdXBwb3J0CisgKgorICogZGlzYWJsZV9wdXNoL2Rpc2FibGVfcG9wIHB1c2ggYW5kIHBvcCBkaXNhYmxpbmcgYmFzZWQgb24gYSBwYXJhbWV0ZXIuCisgKiBEaXNhYmxpbmcgb2JzZXJ2YXRpb25zIHN0b3BzIHByb2Nlc3Npbmcgb2YgbWVtb3J5IHJlZmVyZW5jZXMgZHVyaW5nCisgKiBjb3JyZWN0bmVzcyBtb2RlbGluZywgYW5kIGFsbCBhbm5vdGF0aW9ucyB0aGF0IG9jY3VyIGluIHRoZSBkaXNhYmxlZAorICogcmVnaW9uLiAgVGhpcyBhbGxvd3MgZGVzY3JpcHRpb24gb2YgY29kZSB0aGF0IGlzIGV4cGVjdGVkIHRvIGJlIGhhbmRsZWQKKyAqIHNwZWNpYWxseSBkdXJpbmcgY29udmVyc2lvbiB0byBwYXJhbGxlbGlzbSBvciB0aGF0IGlzIG5vdCByZWNvZ25pemVkCisgKiBieSB0b29scyAoZS5nLiBzb21lIGtpbmRzIG9mIHN5bmNocm9uaXphdGlvbiBvcGVyYXRpb25zLikKKyAqIFRoaXMgbWVjaGFuaXNtIGNhdXNlcyBhbGwgYW5ub3RhdGlvbnMgaW4gdGhlIGRpc2FibGVkIHJlZ2lvbiwgb3RoZXIKKyAqIHRoYW4gZGlzYWJsZV9wdXNoIGFuZCBkaXNhYmxlX3BvcCwgdG8gYmUgaWdub3JlZC4gIChGb3IgZXhhbXBsZSwgdGhpcworICogbWlnaHQgdmFsaWRseSBiZSB1c2VkIHRvIGRpc2FibGUgYW4gZW50aXJlIHBhcmFsbGVsIHNpdGUgYW5kIHRoZSBjb250YWluZWQKKyAqIHRhc2tzIGFuZCBsb2NraW5nIGluIGl0IGZvciBkYXRhIGNvbGxlY3Rpb24gcHVycG9zZXMuKQorICogVGhlIGRpc2FibGUgZm9yIGNvbGxlY3Rpb24gaXMgYSBtb3JlIGV4cGVuc2l2ZSBvcGVyYXRpb24sIGJ1dCByZWR1Y2VzCisgKiBjb2xsZWN0b3Igb3ZlcmhlYWQgc2lnbmlmaWNhbnRseS4gIFRoaXMgYXBwbGllcyB0byBCT1RIIGNvcnJlY3RuZXNzIGRhdGEKKyAqIGNvbGxlY3Rpb24gYW5kIHBlcmZvcm1hbmNlIGRhdGEgY29sbGVjdGlvbi4gIEZvciBleGFtcGxlLCBhIHNpdGUKKyAqIGNvbnRhaW5pbmcgYSB0YXNrIG1pZ2h0IG9ubHkgZW5hYmxlIGRhdGEgY29sbGVjdGlvbiBmb3IgdGhlIGZpcnN0IDEwCisgKiBpdGVyYXRpb25zLiAgQm90aCBwZXJmb3JtYW5jZSBhbmQgY29ycmVjdG5lc3MgZGF0YSBzaG91bGQgcmVmbGVjdCB0aGlzLAorICogYW5kIHRoZSBwcm9ncmFtIHNob3VsZCBydW4gYXMgY2xvc2UgdG8gZnVsbCBzcGVlZCBhcyBwb3NzaWJsZSB3aGVuCisgKiBjb2xsZWN0aW9uIGlzIGRpc2FibGVkLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9kaXNhYmxlX3B1c2goX19pdHRfbW9kZWxfZGlzYWJsZSB4KTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX2Rpc2FibGVfcG9wKHZvaWQpOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfYWdncmVnYXRlX3Rhc2soc2l6ZV90IHgpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9kaXNhYmxlX3B1c2gsIChfX2l0dF9tb2RlbF9kaXNhYmxlIHgpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfZGlzYWJsZV9wb3AsICAodm9pZCkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9hZ2dyZWdhdGVfdGFzaywgKHNpemVfdCB4KSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfZGlzYWJsZV9wdXNoICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9kaXNhYmxlX3B1c2gpCisjZGVmaW5lIF9faXR0X21vZGVsX2Rpc2FibGVfcHVzaF9wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfZGlzYWJsZV9wdXNoKQorI2RlZmluZSBfX2l0dF9tb2RlbF9kaXNhYmxlX3BvcCAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2Rpc2FibGVfcG9wKQorI2RlZmluZSBfX2l0dF9tb2RlbF9kaXNhYmxlX3BvcF9wdHIgIElUVE5PVElGWV9OQU1FKG1vZGVsX2Rpc2FibGVfcG9wKQorI2RlZmluZSBfX2l0dF9tb2RlbF9hZ2dyZWdhdGVfdGFzayAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2FnZ3JlZ2F0ZV90YXNrKQorI2RlZmluZSBfX2l0dF9tb2RlbF9hZ2dyZWdhdGVfdGFza19wdHIgIElUVE5PVElGWV9OQU1FKG1vZGVsX2FnZ3JlZ2F0ZV90YXNrKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfZGlzYWJsZV9wdXNoKHgpCisjZGVmaW5lIF9faXR0X21vZGVsX2Rpc2FibGVfcHVzaF9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9kaXNhYmxlX3BvcCgpCisjZGVmaW5lIF9faXR0X21vZGVsX2Rpc2FibGVfcG9wX3B0ciAwCisjZGVmaW5lIF9faXR0X21vZGVsX2FnZ3JlZ2F0ZV90YXNrKHgpCisjZGVmaW5lIF9faXR0X21vZGVsX2FnZ3JlZ2F0ZV90YXNrX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfZGlzYWJsZV9wdXNoX3B0ciAwCisjZGVmaW5lIF9faXR0X21vZGVsX2Rpc2FibGVfcG9wX3B0ciAwCisjZGVmaW5lIF9faXR0X21vZGVsX2FnZ3JlZ2F0ZV90YXNrX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gbW9kZWwgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgaGVhcCBIZWFwCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIEhlYXAgZ3JvdXAKKyAqIEB7CisgKi8KKwordHlwZWRlZiB2b2lkKiBfX2l0dF9oZWFwX2Z1bmN0aW9uOworCisvKioKKyAqIEBicmllZiBDcmVhdGUgYW4gaWRlbnRpZmljYXRpb24gZm9yIGhlYXAgZnVuY3Rpb24KKyAqIEByZXR1cm4gbm9uLXplcm8gaWRlbnRpZmllciBvciBOVUxMCisgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK19faXR0X2hlYXBfZnVuY3Rpb24gSVRUQVBJIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlQShjb25zdCBjaGFyKiAgICBuYW1lLCBjb25zdCBjaGFyKiAgICBkb21haW4pOworX19pdHRfaGVhcF9mdW5jdGlvbiBJVFRBUEkgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVXKGNvbnN0IHdjaGFyX3QqIG5hbWUsIGNvbnN0IHdjaGFyX3QqIGRvbWFpbik7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlICAgICBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZVcKKyMgIGRlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZV9wdHIgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVXX3B0cgorI2Vsc2UKKyMgIGRlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZSAgICAgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVBCisjICBkZWZpbmUgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVfcHRyIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitfX2l0dF9oZWFwX2Z1bmN0aW9uIElUVEFQSSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZShjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiBkb21haW4pOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2hlYXBfZnVuY3Rpb24sIGhlYXBfZnVuY3Rpb25fY3JlYXRlQSwgKGNvbnN0IGNoYXIqICAgIG5hbWUsIGNvbnN0IGNoYXIqICAgIGRvbWFpbikpCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2hlYXBfZnVuY3Rpb24sIGhlYXBfZnVuY3Rpb25fY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QqIG5hbWUsIGNvbnN0IHdjaGFyX3QqIGRvbWFpbikpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2hlYXBfZnVuY3Rpb24sIGhlYXBfZnVuY3Rpb25fY3JlYXRlLCAgKGNvbnN0IGNoYXIqICAgIG5hbWUsIGNvbnN0IGNoYXIqICAgIGRvbWFpbikpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlQSAgICAgSVRUTk9USUZZX0RBVEEoaGVhcF9mdW5jdGlvbl9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZUFfcHRyIElUVE5PVElGWV9OQU1FKGhlYXBfZnVuY3Rpb25fY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVXICAgICBJVFROT1RJRllfREFUQShoZWFwX2Z1bmN0aW9uX2NyZWF0ZVcpCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlV19wdHIgSVRUTk9USUZZX05BTUUoaGVhcF9mdW5jdGlvbl9jcmVhdGVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlICAgICAgSVRUTk9USUZZX0RBVEEoaGVhcF9mdW5jdGlvbl9jcmVhdGUpCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlX3B0ciAgSVRUTk9USUZZX05BTUUoaGVhcF9mdW5jdGlvbl9jcmVhdGUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZUEobmFtZSwgZG9tYWluKSAoX19pdHRfaGVhcF9mdW5jdGlvbikwCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZVcobmFtZSwgZG9tYWluKSAoX19pdHRfaGVhcF9mdW5jdGlvbikwCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlKG5hbWUsIGRvbWFpbikgIChfX2l0dF9oZWFwX2Z1bmN0aW9uKTAKKyNkZWZpbmUgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBSZWNvcmQgYW4gYWxsb2NhdGlvbiBiZWdpbiBvY2N1cnJlbmNlLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX2FsbG9jYXRlX2JlZ2luKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgc2l6ZV90IHNpemUsIGludCBpbml0aWFsaXplZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfYWxsb2NhdGVfYmVnaW4sIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHNpemVfdCBzaXplLCBpbnQgaW5pdGlhbGl6ZWQpKQorI2RlZmluZSBfX2l0dF9oZWFwX2FsbG9jYXRlX2JlZ2luICAgICBJVFROT1RJRllfVk9JRChoZWFwX2FsbG9jYXRlX2JlZ2luKQorI2RlZmluZSBfX2l0dF9oZWFwX2FsbG9jYXRlX2JlZ2luX3B0ciBJVFROT1RJRllfTkFNRShoZWFwX2FsbG9jYXRlX2JlZ2luKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9iZWdpbihoLCBzaXplLCBpbml0aWFsaXplZCkKKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9iZWdpbl9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9iZWdpbl9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFJlY29yZCBhbiBhbGxvY2F0aW9uIGVuZCBvY2N1cnJlbmNlLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX2FsbG9jYXRlX2VuZChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqKiBhZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGluaXRpYWxpemVkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9hbGxvY2F0ZV9lbmQsIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqKiBhZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGluaXRpYWxpemVkKSkKKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9lbmQgICAgIElUVE5PVElGWV9WT0lEKGhlYXBfYWxsb2NhdGVfZW5kKQorI2RlZmluZSBfX2l0dF9oZWFwX2FsbG9jYXRlX2VuZF9wdHIgSVRUTk9USUZZX05BTUUoaGVhcF9hbGxvY2F0ZV9lbmQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9oZWFwX2FsbG9jYXRlX2VuZChoLCBhZGRyLCBzaXplLCBpbml0aWFsaXplZCkKKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9lbmRfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2hlYXBfYWxsb2NhdGVfZW5kX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgUmVjb3JkIGFuIGZyZWUgYmVnaW4gb2NjdXJyZW5jZS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfaGVhcF9mcmVlX2JlZ2luKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfZnJlZV9iZWdpbiwgKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogYWRkcikpCisjZGVmaW5lIF9faXR0X2hlYXBfZnJlZV9iZWdpbiAgICAgSVRUTk9USUZZX1ZPSUQoaGVhcF9mcmVlX2JlZ2luKQorI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfYmVnaW5fcHRyIElUVE5PVElGWV9OQU1FKGhlYXBfZnJlZV9iZWdpbikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2hlYXBfZnJlZV9iZWdpbihoLCBhZGRyKQorI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfYmVnaW5fcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2hlYXBfZnJlZV9iZWdpbl9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFJlY29yZCBhbiBmcmVlIGVuZCBvY2N1cnJlbmNlLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX2ZyZWVfZW5kKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfZnJlZV9lbmQsIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqIGFkZHIpKQorI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfZW5kICAgICBJVFROT1RJRllfVk9JRChoZWFwX2ZyZWVfZW5kKQorI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfZW5kX3B0ciBJVFROT1RJRllfTkFNRShoZWFwX2ZyZWVfZW5kKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9mcmVlX2VuZChoLCBhZGRyKQorI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfZW5kX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfZW5kX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgUmVjb3JkIGFuIHJlYWxsb2NhdGlvbiBiZWdpbiBvY2N1cnJlbmNlLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfYmVnaW4oX19pdHRfaGVhcF9mdW5jdGlvbiBoLCB2b2lkKiBhZGRyLCBzaXplX3QgbmV3X3NpemUsIGludCBpbml0aWFsaXplZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfcmVhbGxvY2F0ZV9iZWdpbiwgKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogYWRkciwgc2l6ZV90IG5ld19zaXplLCBpbnQgaW5pdGlhbGl6ZWQpKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfYmVnaW4gICAgIElUVE5PVElGWV9WT0lEKGhlYXBfcmVhbGxvY2F0ZV9iZWdpbikKKyNkZWZpbmUgX19pdHRfaGVhcF9yZWFsbG9jYXRlX2JlZ2luX3B0ciBJVFROT1RJRllfTkFNRShoZWFwX3JlYWxsb2NhdGVfYmVnaW4pCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfYmVnaW4oaCwgYWRkciwgbmV3X3NpemUsIGluaXRpYWxpemVkKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfYmVnaW5fcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2hlYXBfcmVhbGxvY2F0ZV9iZWdpbl9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFJlY29yZCBhbiByZWFsbG9jYXRpb24gZW5kIG9jY3VycmVuY2UuCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2hlYXBfcmVhbGxvY2F0ZV9lbmQoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCB2b2lkKiBhZGRyLCB2b2lkKiogbmV3X2FkZHIsIHNpemVfdCBuZXdfc2l6ZSwgaW50IGluaXRpYWxpemVkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9yZWFsbG9jYXRlX2VuZCwgKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogYWRkciwgdm9pZCoqIG5ld19hZGRyLCBzaXplX3QgbmV3X3NpemUsIGludCBpbml0aWFsaXplZCkpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVhbGxvY2F0ZV9lbmQgICAgIElUVE5PVElGWV9WT0lEKGhlYXBfcmVhbGxvY2F0ZV9lbmQpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVhbGxvY2F0ZV9lbmRfcHRyIElUVE5PVElGWV9OQU1FKGhlYXBfcmVhbGxvY2F0ZV9lbmQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfZW5kKGgsIGFkZHIsIG5ld19hZGRyLCBuZXdfc2l6ZSwgaW5pdGlhbGl6ZWQpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVhbGxvY2F0ZV9lbmRfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2hlYXBfcmVhbGxvY2F0ZV9lbmRfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKiogQGJyaWVmIGludGVybmFsIGFjY2VzcyBiZWdpbiAqLwordm9pZCBJVFRBUEkgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfYmVnaW4odm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfaW50ZXJuYWxfYWNjZXNzX2JlZ2luLCAgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19iZWdpbiAgICAgIElUVE5PVElGWV9WT0lEKGhlYXBfaW50ZXJuYWxfYWNjZXNzX2JlZ2luKQorI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19iZWdpbl9wdHIgIElUVE5PVElGWV9OQU1FKGhlYXBfaW50ZXJuYWxfYWNjZXNzX2JlZ2luKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfYmVnaW4oKQorI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19iZWdpbl9wdHIgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19iZWdpbl9wdHIgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBicmllZiBpbnRlcm5hbCBhY2Nlc3MgZW5kICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19lbmQodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfaW50ZXJuYWxfYWNjZXNzX2VuZCwgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19lbmQgICAgIElUVE5PVElGWV9WT0lEKGhlYXBfaW50ZXJuYWxfYWNjZXNzX2VuZCkKKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfZW5kX3B0ciBJVFROT1RJRllfTkFNRShoZWFwX2ludGVybmFsX2FjY2Vzc19lbmQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19lbmQoKQorI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19lbmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19lbmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBicmllZiByZWNvcmQgbWVtb3J5IGdyb3d0aCBiZWdpbiAqLwordm9pZCBJVFRBUEkgX19pdHRfaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9iZWdpbih2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9iZWdpbiwgICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9iZWdpbiAgICAgIElUVE5PVElGWV9WT0lEKGhlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW4pCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW5fcHRyICBJVFROT1RJRllfTkFNRShoZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2JlZ2luKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9iZWdpbigpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW5fcHRyICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9iZWdpbl9wdHIgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBicmllZiByZWNvcmQgbWVtb3J5IGdyb3d0aCBlbmQgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfZW5kKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2VuZCwgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2VuZCAgICAgSVRUTk9USUZZX1ZPSUQoaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9lbmQpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfZW5kX3B0ciBJVFROT1RJRllfTkFNRShoZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2VuZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfZW5kKCkKKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9lbmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2VuZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBTcGVjaWZ5IHRoZSB0eXBlIG9mIGhlYXAgZGV0ZWN0aW9uL3JlcG9ydGluZyB0byBtb2RpZnkuCisgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogQGJyaWVmIFJlcG9ydCBvbiBtZW1vcnkgbGVha3MuCisgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9sZWFrcyAweDAwMDAwMDAxCisKKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogQGJyaWVmIFJlcG9ydCBvbiBtZW1vcnkgZ3Jvd3RoLgorICovCisjZGVmaW5lIF9faXR0X2hlYXBfZ3Jvd3RoIDB4MDAwMDAwMDIKKworCisvKiogQGJyaWVmIGhlYXAgcmVzZXQgZGV0ZWN0aW9uICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX3Jlc2V0X2RldGVjdGlvbih1bnNpZ25lZCBpbnQgcmVzZXRfbWFzayk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfcmVzZXRfZGV0ZWN0aW9uLCAgKHVuc2lnbmVkIGludCByZXNldF9tYXNrKSkKKyNkZWZpbmUgX19pdHRfaGVhcF9yZXNldF9kZXRlY3Rpb24gICAgICBJVFROT1RJRllfVk9JRChoZWFwX3Jlc2V0X2RldGVjdGlvbikKKyNkZWZpbmUgX19pdHRfaGVhcF9yZXNldF9kZXRlY3Rpb25fcHRyICBJVFROT1RJRllfTkFNRShoZWFwX3Jlc2V0X2RldGVjdGlvbikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2hlYXBfcmVzZXRfZGV0ZWN0aW9uKCkKKyNkZWZpbmUgX19pdHRfaGVhcF9yZXNldF9kZXRlY3Rpb25fcHRyICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9yZXNldF9kZXRlY3Rpb25fcHRyICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAYnJpZWYgcmVwb3J0ICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX3JlY29yZCh1bnNpZ25lZCBpbnQgcmVjb3JkX21hc2spOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX3JlY29yZCwgKHVuc2lnbmVkIGludCByZWNvcmRfbWFzaykpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkICAgICBJVFROT1RJRllfVk9JRChoZWFwX3JlY29yZCkKKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmRfcHRyIElUVE5PVElGWV9OQU1FKGhlYXBfcmVjb3JkKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmQoKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlY29yZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAfSBoZWFwIGdyb3VwICovCisvKiogQGVuZGNvbmQgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogQGRlZmdyb3VwIGRvbWFpbnMgRG9tYWlucworICogQGluZ3JvdXAgcHVibGljCisgKiBEb21haW5zIGdyb3VwCisgKiBAeworICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI3ByYWdtYSBwYWNrKHB1c2gsIDgpCisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9kb21haW4KK3sKKyAgICB2b2xhdGlsZSBpbnQgZmxhZ3M7IC8qITwgWmVybyBpZiBkaXNhYmxlZCwgbm9uLXplcm8gaWYgZW5hYmxlZC4gVGhlIG1lYW5pbmcgb2YgZGlmZmVyZW50IG5vbi16ZXJvIHZhbHVlcyBpcyByZXNlcnZlZCB0byB0aGUgcnVudGltZSAqLworICAgIGNvbnN0IGNoYXIqIG5hbWVBOyAgLyohPCBDb3B5IG9mIG9yaWdpbmFsIG5hbWUgaW4gQVNDSUkuICovCisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorICAgIGNvbnN0IHdjaGFyX3QqIG5hbWVXOyAvKiE8IENvcHkgb2Ygb3JpZ2luYWwgbmFtZSBpbiBVTklDT0RFLiAqLworI2Vsc2UgIC8qIFVOSUNPREUgfHwgX1VOSUNPREUgKi8KKyAgICB2b2lkKiBuYW1lVzsKKyNlbmRpZiAvKiBVTklDT0RFIHx8IF9VTklDT0RFICovCisgICAgaW50ICAgZXh0cmExOyAvKiE8IFJlc2VydmVkIHRvIHRoZSBydW50aW1lICovCisgICAgdm9pZCogZXh0cmEyOyAvKiE8IFJlc2VydmVkIHRvIHRoZSBydW50aW1lICovCisgICAgc3RydWN0IF9fX2l0dF9kb21haW4qIG5leHQ7Cit9IF9faXR0X2RvbWFpbjsKKworI3ByYWdtYSBwYWNrKHBvcCkKKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIGRvbWFpbnMKKyAqIEBicmllZiBDcmVhdGUgYSBkb21haW4uCisgKiBDcmVhdGUgZG9tYWluIHVzaW5nIHNvbWUgZG9tYWluIG5hbWU6IHRoZSBVUkkgbmFtaW5nIHN0eWxlIGlzIHJlY29tbWVuZGVkLgorICogQmVjYXVzZSB0aGUgc2V0IG9mIGRvbWFpbnMgaXMgZXhwZWN0ZWQgdG8gYmUgc3RhdGljIG92ZXIgdGhlIGFwcGxpY2F0aW9uJ3MKKyAqIGV4ZWN1dGlvbiB0aW1lLCB0aGVyZSBpcyBubyBtZWNoYW5pc20gdG8gZGVzdHJveSBhIGRvbWFpbi4KKyAqIEFueSBkb21haW4gY2FuIGJlIGFjY2Vzc2VkIGJ5IGFueSB0aHJlYWQgaW4gdGhlIHByb2Nlc3MsIHJlZ2FyZGxlc3Mgb2YKKyAqIHdoaWNoIHRocmVhZCBjcmVhdGVkIHRoZSBkb21haW4uIFRoaXMgY2FsbCBpcyB0aHJlYWQtc2FmZS4KKyAqIEBwYXJhbVtpbl0gbmFtZSBuYW1lIG9mIGRvbWFpbgorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitfX2l0dF9kb21haW4qIElUVEFQSSBfX2l0dF9kb21haW5fY3JlYXRlQShjb25zdCBjaGFyICAgICpuYW1lKTsKK19faXR0X2RvbWFpbiogSVRUQVBJIF9faXR0X2RvbWFpbl9jcmVhdGVXKGNvbnN0IHdjaGFyX3QgKm5hbWUpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlICAgICBfX2l0dF9kb21haW5fY3JlYXRlVworIyAgZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVfcHRyIF9faXR0X2RvbWFpbl9jcmVhdGVXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGUgICAgIF9faXR0X2RvbWFpbl9jcmVhdGVBCisjICBkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZV9wdHIgX19pdHRfZG9tYWluX2NyZWF0ZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworX19pdHRfZG9tYWluKiBJVFRBUEkgX19pdHRfZG9tYWluX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9kb21haW4qLCBkb21haW5fY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUpKQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9kb21haW4qLCBkb21haW5fY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9kb21haW4qLCBkb21haW5fY3JlYXRlLCAgKGNvbnN0IGNoYXIgICAgKm5hbWUpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlQSAgICAgSVRUTk9USUZZX0RBVEEoZG9tYWluX2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVBX3B0ciBJVFROT1RJRllfTkFNRShkb21haW5fY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZVcgICAgIElUVE5PVElGWV9EQVRBKGRvbWFpbl9jcmVhdGVXKQorI2RlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlV19wdHIgSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZSAgICAgSVRUTk9USUZZX0RBVEEoZG9tYWluX2NyZWF0ZSkKKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZV9wdHIgSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVBKG5hbWUpIChfX2l0dF9kb21haW4qKTAKKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZVcobmFtZSkgKF9faXR0X2RvbWFpbiopMAorI2RlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGUobmFtZSkgIChfX2l0dF9kb21haW4qKTAKKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBkb21haW5zIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIGlkcyBJRHMKKyAqIEBpbmdyb3VwIHB1YmxpYworICogSURzIGdyb3VwCisgKiBAeworICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI3ByYWdtYSBwYWNrKHB1c2gsIDgpCisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9pZAoreworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBkMSwgZDIsIGQzOworfSBfX2l0dF9pZDsKKworI3ByYWdtYSBwYWNrKHBvcCkKKy8qKiBAZW5kY29uZCAqLworCitzdGF0aWMgY29uc3QgX19pdHRfaWQgX19pdHRfbnVsbCA9IHsgMCwgMCwgMCB9OworCisvKioKKyAqIEBpbmdyb3VwIGlkcworICogQGJyaWVmIEEgY29udmVuaWVuY2UgZnVuY3Rpb24gaXMgcHJvdmlkZWQgdG8gY3JlYXRlIGFuIElEIHdpdGhvdXQgZG9tYWluIGNvbnRyb2wuCisgKiBAYnJpZWYgVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgYW4gX19pdHRfaWQgc3RydWN0dXJlLgorICogQWZ0ZXIgeW91IG1ha2UgdGhlIElEIHdpdGggdGhpcyBmdW5jdGlvbiwgeW91IHN0aWxsIG11c3QgY3JlYXRlIGl0IHdpdGggdGhlCisgKiBfX2l0dF9pZF9jcmVhdGUgZnVuY3Rpb24gYmVmb3JlIHVzaW5nIHRoZSBJRCB0byBpZGVudGlmeSBhIG5hbWVkIGVudGl0eS4KKyAqIEBwYXJhbVtpbl0gYWRkciBUaGUgYWRkcmVzcyBvZiBvYmplY3Q7IGhpZ2ggUVdPUkQgb2YgdGhlIElEIHZhbHVlLgorICogQHBhcmFtW2luXSBleHRyYSBUaGUgZXh0cmEgZGF0YSB0byB1bmlxdWUgaWRlbnRpZnkgb2JqZWN0OyBsb3cgUVdPUkQgb2YgdGhlIElEIHZhbHVlLgorICovCisKK0lUVF9JTkxJTkUgX19pdHRfaWQgSVRUQVBJIF9faXR0X2lkX21ha2Uodm9pZCogYWRkciwgdW5zaWduZWQgbG9uZyBsb25nIGV4dHJhKSBJVFRfSU5MSU5FX0FUVFJJQlVURTsKK0lUVF9JTkxJTkUgX19pdHRfaWQgSVRUQVBJIF9faXR0X2lkX21ha2Uodm9pZCogYWRkciwgdW5zaWduZWQgbG9uZyBsb25nIGV4dHJhKQoreworICAgIF9faXR0X2lkIGlkID0gX19pdHRfbnVsbDsKKyAgICBpZC5kMSA9ICh1bnNpZ25lZCBsb25nIGxvbmcpKCh1aW50cHRyX3QpYWRkcik7CisgICAgaWQuZDIgPSAodW5zaWduZWQgbG9uZyBsb25nKWV4dHJhOworICAgIGlkLmQzID0gKHVuc2lnbmVkIGxvbmcgbG9uZykwOyAvKiBSZXNlcnZlZC4gTXVzdCBiZSB6ZXJvICovCisgICAgcmV0dXJuIGlkOworfQorCisvKioKKyAqIEBpbmdyb3VwIGlkcworICogQGJyaWVmIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBpZGVudGlmaWVyLgorICogVGhpcyBlc3RhYmxpc2hlcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaWZldGltZSBvZiBhbiBpbnN0YW5jZSBvZgorICogdGhlIGdpdmVuIElEIGluIHRoZSB0cmFjZS4gT25jZSB0aGlzIGxpZmV0aW1lIHN0YXJ0cywgdGhlIElECisgKiBjYW4gYmUgdXNlZCB0byB0YWcgbmFtZWQgZW50aXR5IGluc3RhbmNlcyBpbiBjYWxscyBzdWNoIGFzCisgKiBfX2l0dF90YXNrX2JlZ2luLCBhbmQgdG8gc3BlY2lmeSByZWxhdGlvbnNoaXBzIGFtb25nCisgKiBpZGVudGlmaWVkIG5hbWVkIGVudGl0eSBpbnN0YW5jZXMsIHVzaW5nIHRoZSBccmVmIHJlbGF0aW9ucyBBUElzLgorICogSW5zdGFuY2UgSURzIGFyZSBub3QgZG9tYWluIHNwZWNpZmljIQorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gaWQgVGhlIElEIHRvIGNyZWF0ZS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfaWRfY3JlYXRlKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGlkX2NyZWF0ZSwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCkpCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZShkLHgpIElUVE5PVElGWV9WT0lEX0QxKGlkX2NyZWF0ZSxkLHgpCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZV9wdHIgIElUVE5PVElGWV9OQU1FKGlkX2NyZWF0ZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZShkb21haW4saWQpCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIGlkcworICogQGJyaWVmIERlc3Ryb3kgYW4gaW5zdGFuY2Ugb2YgaWRlbnRpZmllci4KKyAqIFRoaXMgZW5kcyB0aGUgbGlmZXRpbWUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIElEIHZhbHVlIGluIHRoZSB0cmFjZS4KKyAqIEFueSByZWxhdGlvbnNoaXBzIHRoYXQgYXJlIGVzdGFibGlzaGVkIGFmdGVyIHRoaXMgbGlmZXRpbWUgZW5kcyBhcmUgaW52YWxpZC4KKyAqIFRoaXMgY2FsbCBtdXN0IGJlIHBlcmZvcm1lZCBiZWZvcmUgdGhlIGdpdmVuIElEIHZhbHVlIGNhbiBiZSByZXVzZWQgZm9yIGEgZGlmZmVyZW50CisgKiBuYW1lZCBlbnRpdHkgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSBpZCBUaGUgSUQgdG8gZGVzdHJveS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfaWRfZGVzdHJveShjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBpZF9kZXN0cm95LCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkKSkKKyNkZWZpbmUgX19pdHRfaWRfZGVzdHJveShkLHgpIElUVE5PVElGWV9WT0lEX0QxKGlkX2Rlc3Ryb3ksZCx4KQorI2RlZmluZSBfX2l0dF9pZF9kZXN0cm95X3B0ciAgSVRUTk9USUZZX05BTUUoaWRfZGVzdHJveSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2lkX2Rlc3Ryb3koZG9tYWluLGlkKQorI2RlZmluZSBfX2l0dF9pZF9kZXN0cm95X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaWRfZGVzdHJveV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGlkcyBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBoYW5kbGVzcyBTdHJpbmcgSGFuZGxlcworICogQGluZ3JvdXAgcHVibGljCisgKiBTdHJpbmcgSGFuZGxlcyBncm91cAorICogQHsKKyAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNwcmFnbWEgcGFjayhwdXNoLCA4KQorCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfc3RyaW5nX2hhbmRsZQoreworICAgIGNvbnN0IGNoYXIqIHN0ckE7IC8qITwgQ29weSBvZiBvcmlnaW5hbCBzdHJpbmcgaW4gQVNDSUkuICovCisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorICAgIGNvbnN0IHdjaGFyX3QqIHN0clc7IC8qITwgQ29weSBvZiBvcmlnaW5hbCBzdHJpbmcgaW4gVU5JQ09ERS4gKi8KKyNlbHNlICAvKiBVTklDT0RFIHx8IF9VTklDT0RFICovCisgICAgdm9pZCogc3RyVzsKKyNlbmRpZiAvKiBVTklDT0RFIHx8IF9VTklDT0RFICovCisgICAgaW50ICAgZXh0cmExOyAvKiE8IFJlc2VydmVkLiBNdXN0IGJlIHplcm8gICAqLworICAgIHZvaWQqIGV4dHJhMjsgLyohPCBSZXNlcnZlZC4gTXVzdCBiZSB6ZXJvICAgKi8KKyAgICBzdHJ1Y3QgX19faXR0X3N0cmluZ19oYW5kbGUqIG5leHQ7Cit9IF9faXR0X3N0cmluZ19oYW5kbGU7CisKKyNwcmFnbWEgcGFjayhwb3ApCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBoYW5kbGVzCisgKiBAYnJpZWYgQ3JlYXRlIGEgc3RyaW5nIGhhbmRsZS4KKyAqIENyZWF0ZSBhbmQgcmV0dXJuIGhhbmRsZSB2YWx1ZSB0aGF0IGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYSBzdHJpbmcuCisgKiBDb25zZWN1dGl2ZSBjYWxscyB0byBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZSB3aXRoIHRoZSBzYW1lIG5hbWUKKyAqIHJldHVybiB0aGUgc2FtZSB2YWx1ZS4gQmVjYXVzZSB0aGUgc2V0IG9mIHN0cmluZyBoYW5kbGVzIGlzIGV4cGVjdGVkIHRvIHJlbWFpbgorICogc3RhdGljIGR1cmluZyB0aGUgYXBwbGljYXRpb24ncyBleGVjdXRpb24gdGltZSwgdGhlcmUgaXMgbm8gbWVjaGFuaXNtIHRvIGRlc3Ryb3kgYSBzdHJpbmcgaGFuZGxlLgorICogQW55IHN0cmluZyBoYW5kbGUgY2FuIGJlIGFjY2Vzc2VkIGJ5IGFueSB0aHJlYWQgaW4gdGhlIHByb2Nlc3MsIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggdGhyZWFkIGNyZWF0ZWQKKyAqIHRoZSBzdHJpbmcgaGFuZGxlLiBUaGlzIGNhbGwgaXMgdGhyZWFkLXNhZmUuCisgKiBAcGFyYW1baW5dIG5hbWUgVGhlIGlucHV0IHN0cmluZworICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitfX2l0dF9zdHJpbmdfaGFuZGxlKiBJVFRBUEkgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVBKGNvbnN0IGNoYXIgICAgKm5hbWUpOworX19pdHRfc3RyaW5nX2hhbmRsZSogSVRUQVBJIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlVyhjb25zdCB3Y2hhcl90ICpuYW1lKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUgICAgIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlVworIyAgZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlX3B0ciBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZVdfcHRyCisjZWxzZSAvKiBVTklDT0RFICovCisjICBkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUgICAgIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlQQorIyAgZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlX3B0ciBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworX19pdHRfc3RyaW5nX2hhbmRsZSogSVRUQVBJIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUpOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3N0cmluZ19oYW5kbGUqLCBzdHJpbmdfaGFuZGxlX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lKSkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfc3RyaW5nX2hhbmRsZSosIHN0cmluZ19oYW5kbGVfY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9zdHJpbmdfaGFuZGxlKiwgc3RyaW5nX2hhbmRsZV9jcmVhdGUsICAoY29uc3QgY2hhciAgICAqbmFtZSkpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlQSAgICAgSVRUTk9USUZZX0RBVEEoc3RyaW5nX2hhbmRsZV9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZUFfcHRyIElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVXICAgICBJVFROT1RJRllfREFUQShzdHJpbmdfaGFuZGxlX2NyZWF0ZVcpCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlV19wdHIgSVRUTk9USUZZX05BTUUoc3RyaW5nX2hhbmRsZV9jcmVhdGVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlICAgICBJVFROT1RJRllfREFUQShzdHJpbmdfaGFuZGxlX2NyZWF0ZSkKKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVfcHRyIElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVBKG5hbWUpIChfX2l0dF9zdHJpbmdfaGFuZGxlKikwCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZVcobmFtZSkgKF9faXR0X3N0cmluZ19oYW5kbGUqKTAKKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUobmFtZSkgIChfX2l0dF9zdHJpbmdfaGFuZGxlKikwCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGhhbmRsZXMgZ3JvdXAgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2l0dF90aW1lc3RhbXA7CisvKiogQGVuZGNvbmQgKi8KKworc3RhdGljIGNvbnN0IF9faXR0X3RpbWVzdGFtcCBfX2l0dF90aW1lc3RhbXBfbm9uZSA9IChfX2l0dF90aW1lc3RhbXApLTFMTDsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9ncGFfZG9jdW1lbnRhdGlvbiAqLworCisvKioKKyAqIEBpbmdyb3VwIHRpbWVzdGFtcHMKKyAqIEBicmllZiBSZXR1cm4gdGltZXN0YW1wIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQgbW9tZW50LgorICogVGhpcyByZXR1cm5zIHRoZSB0aW1lc3RhbXAgaW4gdGhlIGZvcm1hdCB0aGF0IGlzIHRoZSBtb3N0IHJlbGV2YW50IGZvciB0aGUgY3VycmVudAorICogaG9zdCBvciBwbGF0Zm9ybSAoUkRUU0MsIFFQQywgYW5kIG90aGVycykuIFlvdSBjYW4gdXNlIHRoZSAiPCIgb3BlcmF0b3IgdG8KKyAqIGNvbXBhcmUgX19pdHRfdGltZXN0YW1wIHZhbHVlcy4KKyAqLworX19pdHRfdGltZXN0YW1wIElUVEFQSSBfX2l0dF9nZXRfdGltZXN0YW1wKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3RpbWVzdGFtcCwgZ2V0X3RpbWVzdGFtcCwgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9nZXRfdGltZXN0YW1wICAgICAgSVRUTk9USUZZX0RBVEEoZ2V0X3RpbWVzdGFtcCkKKyNkZWZpbmUgX19pdHRfZ2V0X3RpbWVzdGFtcF9wdHIgIElUVE5PVElGWV9OQU1FKGdldF90aW1lc3RhbXApCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9nZXRfdGltZXN0YW1wKCkKKyNkZWZpbmUgX19pdHRfZ2V0X3RpbWVzdGFtcF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2dldF90aW1lc3RhbXBfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSB0aW1lc3RhbXBzICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9ncGFfZG9jdW1lbnRhdGlvbiAqLworCisvKioKKyAqIEBkZWZncm91cCByZWdpb25zIFJlZ2lvbnMKKyAqIEBpbmdyb3VwIHB1YmxpYworICogUmVnaW9ucyBncm91cAorICogQHsKKyAqLworLyoqCisgKiBAaW5ncm91cCByZWdpb25zCisgKiBAYnJpZWYgQmVnaW4gb2YgcmVnaW9uIGluc3RhbmNlLgorICogU3VjY2Vzc2l2ZSBjYWxscyB0byBfX2l0dF9yZWdpb25fYmVnaW4gd2l0aCB0aGUgc2FtZSBJRCBhcmUgaWdub3JlZAorICogdW50aWwgYSBjYWxsIHRvIF9faXR0X3JlZ2lvbl9lbmQgd2l0aCB0aGUgc2FtZSBJRAorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyByZWdpb24gaW5zdGFuY2UKKyAqIEBwYXJhbVtpbl0gaWQgVGhlIGluc3RhbmNlIElEIGZvciB0aGlzIHJlZ2lvbiBpbnN0YW5jZS4gTXVzdCBub3QgYmUgX19pdHRfbnVsbAorICogQHBhcmFtW2luXSBwYXJlbnRpZCBUaGUgaW5zdGFuY2UgSUQgZm9yIHRoZSBwYXJlbnQgb2YgdGhpcyByZWdpb24gaW5zdGFuY2UsIG9yIF9faXR0X251bGwKKyAqIEBwYXJhbVtpbl0gbmFtZSBUaGUgbmFtZSBvZiB0aGlzIHJlZ2lvbgorICovCit2b2lkIElUVEFQSSBfX2l0dF9yZWdpb25fYmVnaW4oY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSk7CisKKy8qKgorICogQGluZ3JvdXAgcmVnaW9ucworICogQGJyaWVmIEVuZCBvZiByZWdpb24gaW5zdGFuY2UuCisgKiBUaGUgZmlyc3QgY2FsbCB0byBfX2l0dF9yZWdpb25fZW5kIHdpdGggYSBnaXZlbiBJRCBlbmRzIHRoZQorICogcmVnaW9uLiBTdWNjZXNzaXZlIGNhbGxzIHdpdGggdGhlIHNhbWUgSUQgYXJlIGlnbm9yZWQsIGFzIGFyZQorICogY2FsbHMgdGhhdCBkbyBub3QgaGF2ZSBhIG1hdGNoaW5nIF9faXR0X3JlZ2lvbl9iZWdpbiBjYWxsLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyByZWdpb24gaW5zdGFuY2UKKyAqIEBwYXJhbVtpbl0gaWQgVGhlIGluc3RhbmNlIElEIGZvciB0aGlzIHJlZ2lvbiBpbnN0YW5jZQorICovCit2b2lkIElUVEFQSSBfX2l0dF9yZWdpb25fZW5kKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlZ2lvbl9iZWdpbiwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVnaW9uX2VuZCwgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkKSkKKyNkZWZpbmUgX19pdHRfcmVnaW9uX2JlZ2luKGQseCx5LHopIElUVE5PVElGWV9WT0lEX0QzKHJlZ2lvbl9iZWdpbixkLHgseSx6KQorI2RlZmluZSBfX2l0dF9yZWdpb25fYmVnaW5fcHRyICAgICAgSVRUTk9USUZZX05BTUUocmVnaW9uX2JlZ2luKQorI2RlZmluZSBfX2l0dF9yZWdpb25fZW5kKGQseCkgICAgICAgSVRUTk9USUZZX1ZPSURfRDEocmVnaW9uX2VuZCxkLHgpCisjZGVmaW5lIF9faXR0X3JlZ2lvbl9lbmRfcHRyICAgICAgICBJVFROT1RJRllfTkFNRShyZWdpb25fZW5kKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfcmVnaW9uX2JlZ2luKGQseCx5LHopCisjZGVmaW5lIF9faXR0X3JlZ2lvbl9iZWdpbl9wdHIgMAorI2RlZmluZSBfX2l0dF9yZWdpb25fZW5kKGQseCkKKyNkZWZpbmUgX19pdHRfcmVnaW9uX2VuZF9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfcmVnaW9uX2JlZ2luX3B0ciAwCisjZGVmaW5lIF9faXR0X3JlZ2lvbl9lbmRfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IHJlZ2lvbnMgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgZnJhbWVzIEZyYW1lcworICogQGluZ3JvdXAgcHVibGljCisgKiBGcmFtZXMgYXJlIHNpbWlsYXIgdG8gcmVnaW9ucywgYnV0IGFyZSBpbnRlbmRlZCB0byBiZSBlYXNpZXIgdG8gdXNlIGFuZCB0byBpbXBsZW1lbnQuCisgKiBJbiBwYXJ0aWN1bGFyOgorICogLSBGcmFtZXMgYWx3YXlzIHJlcHJlc2VudCBwZXJpb2RzIG9mIGVsYXBzZWQgdGltZQorICogLSBCeSBkZWZhdWx0LCBmcmFtZXMgaGF2ZSBubyBuZXN0aW5nIHJlbGF0aW9uc2hpcHMKKyAqIEB7CisgKi8KKworLyoqCisgKiBAaW5ncm91cCBmcmFtZXMKKyAqIEBicmllZiBCZWdpbiBhIGZyYW1lIGluc3RhbmNlLgorICogU3VjY2Vzc2l2ZSBjYWxscyB0byBfX2l0dF9mcmFtZV9iZWdpbiB3aXRoIHRoZQorICogc2FtZSBJRCBhcmUgaWdub3JlZCB1bnRpbCBhIGNhbGwgdG8gX19pdHRfZnJhbWVfZW5kIHdpdGggdGhlIHNhbWUgSUQuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIGZyYW1lIGluc3RhbmNlCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhpcyBmcmFtZSBpbnN0YW5jZSBvciBOVUxMCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2ZyYW1lX2JlZ2luX3YzKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCAqaWQpOworCisvKioKKyAqIEBpbmdyb3VwIGZyYW1lcworICogQGJyaWVmIEVuZCBhIGZyYW1lIGluc3RhbmNlLgorICogVGhlIGZpcnN0IGNhbGwgdG8gX19pdHRfZnJhbWVfZW5kIHdpdGggYSBnaXZlbiBJRAorICogZW5kcyB0aGUgZnJhbWUuIFN1Y2Nlc3NpdmUgY2FsbHMgd2l0aCB0aGUgc2FtZSBJRCBhcmUgaWdub3JlZCwgYXMgYXJlCisgKiBjYWxscyB0aGF0IGRvIG5vdCBoYXZlIGEgbWF0Y2hpbmcgX19pdHRfZnJhbWVfYmVnaW4gY2FsbC4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgZnJhbWUgaW5zdGFuY2UKKyAqIEBwYXJhbVtpbl0gaWQgVGhlIGluc3RhbmNlIElEIGZvciB0aGlzIGZyYW1lIGluc3RhbmNlIG9yIE5VTEwgZm9yIGN1cnJlbnQKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfZnJhbWVfZW5kX3YzKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCAqaWQpOworCisvKioKKyAqIEBpbmdyb3VwIGZyYW1lcworICogQGJyaWVmIFN1Ym1pdHMgYSBmcmFtZSBpbnN0YW5jZS4KKyAqIFN1Y2Nlc3NpdmUgY2FsbHMgdG8gX19pdHRfZnJhbWVfYmVnaW4gb3IgX19pdHRfZnJhbWVfc3VibWl0IHdpdGggdGhlCisgKiBzYW1lIElEIGFyZSBpZ25vcmVkIHVudGlsIGEgY2FsbCB0byBfX2l0dF9mcmFtZV9lbmQgb3IgX19pdHRfZnJhbWVfc3VibWl0CisgKiB3aXRoIHRoZSBzYW1lIElELgorICogUGFzc2luZyBzcGVjaWFsIF9faXR0X3RpbWVzdGFtcF9ub25lIHZhbHVlIGFzICJlbmQiIGFyZ3VtZW50IG1lYW5zCisgKiB0YWtlIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBhcyB0aGUgZW5kIHRpbWVzdGFtcC4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgZnJhbWUgaW5zdGFuY2UKKyAqIEBwYXJhbVtpbl0gaWQgVGhlIGluc3RhbmNlIElEIGZvciB0aGlzIGZyYW1lIGluc3RhbmNlIG9yIE5VTEwKKyAqIEBwYXJhbVtpbl0gYmVnaW4gVGltZXN0YW1wIG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZyYW1lCisgKiBAcGFyYW1baW5dIGVuZCBUaW1lc3RhbXAgb2YgdGhlIGVuZCBvZiB0aGUgZnJhbWUKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfZnJhbWVfc3VibWl0X3YzKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCAqaWQsCisgICAgX19pdHRfdGltZXN0YW1wIGJlZ2luLCBfX2l0dF90aW1lc3RhbXAgZW5kKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnJhbWVfYmVnaW5fdjMsICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkICppZCkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmcmFtZV9lbmRfdjMsICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgKmlkKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZyYW1lX3N1Ym1pdF92MywgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCAqaWQsIF9faXR0X3RpbWVzdGFtcCBiZWdpbiwgX19pdHRfdGltZXN0YW1wIGVuZCkpCisjZGVmaW5lIF9faXR0X2ZyYW1lX2JlZ2luX3YzKGQseCkgICAgICBJVFROT1RJRllfVk9JRF9EMShmcmFtZV9iZWdpbl92MyxkLHgpCisjZGVmaW5lIF9faXR0X2ZyYW1lX2JlZ2luX3YzX3B0ciAgICAgICBJVFROT1RJRllfTkFNRShmcmFtZV9iZWdpbl92MykKKyNkZWZpbmUgX19pdHRfZnJhbWVfZW5kX3YzKGQseCkgICAgICAgIElUVE5PVElGWV9WT0lEX0QxKGZyYW1lX2VuZF92MyxkLHgpCisjZGVmaW5lIF9faXR0X2ZyYW1lX2VuZF92M19wdHIgICAgICAgICBJVFROT1RJRllfTkFNRShmcmFtZV9lbmRfdjMpCisjZGVmaW5lIF9faXR0X2ZyYW1lX3N1Ym1pdF92MyhkLHgsYixlKSBJVFROT1RJRllfVk9JRF9EMyhmcmFtZV9zdWJtaXRfdjMsZCx4LGIsZSkKKyNkZWZpbmUgX19pdHRfZnJhbWVfc3VibWl0X3YzX3B0ciAgICAgIElUVE5PVElGWV9OQU1FKGZyYW1lX3N1Ym1pdF92MykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2ZyYW1lX2JlZ2luX3YzKGRvbWFpbixpZCkKKyNkZWZpbmUgX19pdHRfZnJhbWVfYmVnaW5fdjNfcHRyIDAKKyNkZWZpbmUgX19pdHRfZnJhbWVfZW5kX3YzKGRvbWFpbixpZCkKKyNkZWZpbmUgX19pdHRfZnJhbWVfZW5kX3YzX3B0ciAgIDAKKyNkZWZpbmUgX19pdHRfZnJhbWVfc3VibWl0X3YzKGRvbWFpbixpZCxiZWdpbixlbmQpCisjZGVmaW5lIF9faXR0X2ZyYW1lX3N1Ym1pdF92M19wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfZnJhbWVfYmVnaW5fdjNfcHRyIDAKKyNkZWZpbmUgX19pdHRfZnJhbWVfZW5kX3YzX3B0ciAgIDAKKyNkZWZpbmUgX19pdHRfZnJhbWVfc3VibWl0X3YzX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBmcmFtZXMgZ3JvdXAgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZWZncm91cCB0YXNrZ3JvdXAgVGFzayBHcm91cAorICogQGluZ3JvdXAgcHVibGljCisgKiBUYXNrIEdyb3VwCisgKiBAeworICovCisvKioKKyAqIEBpbmdyb3VwIHRhc2tfZ3JvdXBzCisgKiBAYnJpZWYgRGVub3RlcyBhIHRhc2tfZ3JvdXAgaW5zdGFuY2UuCisgKiBTdWNjZXNzaXZlIGNhbGxzIHRvIF9faXR0X3Rhc2tfZ3JvdXAgd2l0aCB0aGUgc2FtZSBJRCBhcmUgaWdub3JlZC4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgdGFza19ncm91cCBpbnN0YW5jZQorICogQHBhcmFtW2luXSBpZCBUaGUgaW5zdGFuY2UgSUQgZm9yIHRoaXMgdGFza19ncm91cCBpbnN0YW5jZS4gTXVzdCBub3QgYmUgX19pdHRfbnVsbC4KKyAqIEBwYXJhbVtpbl0gcGFyZW50aWQgVGhlIGluc3RhbmNlIElEIGZvciB0aGUgcGFyZW50IG9mIHRoaXMgdGFza19ncm91cCBpbnN0YW5jZSwgb3IgX19pdHRfbnVsbC4KKyAqIEBwYXJhbVtpbl0gbmFtZSBUaGUgbmFtZSBvZiB0aGlzIHRhc2tfZ3JvdXAKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGFza19ncm91cChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19ncm91cCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpKQorI2RlZmluZSBfX2l0dF90YXNrX2dyb3VwKGQseCx5LHopIElUVE5PVElGWV9WT0lEX0QzKHRhc2tfZ3JvdXAsZCx4LHkseikKKyNkZWZpbmUgX19pdHRfdGFza19ncm91cF9wdHIgICAgICBJVFROT1RJRllfTkFNRSh0YXNrX2dyb3VwKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfdGFza19ncm91cChkLHgseSx6KQorI2RlZmluZSBfX2l0dF90YXNrX2dyb3VwX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfdGFza19ncm91cF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IHRhc2tncm91cCBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCB0YXNrcyBUYXNrcworICogQGluZ3JvdXAgcHVibGljCisgKiBBIHRhc2sgaW5zdGFuY2UgcmVwcmVzZW50cyBhIHBpZWNlIG9mIHdvcmsgcGVyZm9ybWVkIGJ5IGEgcGFydGljdWxhcgorICogdGhyZWFkIGZvciBhIHBlcmlvZCBvZiB0aW1lLiBBIGNhbGwgdG8gX19pdHRfdGFza19iZWdpbiBjcmVhdGVzIGEKKyAqIHRhc2sgaW5zdGFuY2UuIFRoaXMgYmVjb21lcyB0aGUgY3VycmVudCBpbnN0YW5jZSBmb3IgdGhhdCB0YXNrIG9uIHRoYXQKKyAqIHRocmVhZC4gQSBmb2xsb3dpbmcgY2FsbCB0byBfX2l0dF90YXNrX2VuZCBvbiB0aGUgc2FtZSB0aHJlYWQgZW5kcyB0aGUKKyAqIGluc3RhbmNlLiBUaGVyZSBtYXkgYmUgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIGluc3RhbmNlcyBvZiB0YXNrcyB3aXRoIHRoZQorICogc2FtZSBuYW1lIG9uIGRpZmZlcmVudCB0aHJlYWRzLiBJZiBhbiBJRCBpcyBzcGVjaWZpZWQsIHRoZSB0YXNrIGluc3RhbmNlCisgKiByZWNlaXZlcyB0aGF0IElELiBOZXN0ZWQgdGFza3MgYXJlIGFsbG93ZWQuCisgKgorICogTm90ZTogVGhlIHRhc2sgaXMgZGVmaW5lZCBieSB0aGUgYnJhY2tldGluZyBvZiBfX2l0dF90YXNrX2JlZ2luIGFuZAorICogX19pdHRfdGFza19lbmQgb24gdGhlIHNhbWUgdGhyZWFkLiBJZiBzb21lIHNjaGVkdWxpbmcgbWVjaGFuaXNtIGNhdXNlcworICogdGFzayBzd2l0Y2hpbmcgKHRoZSB0aHJlYWQgZXhlY3V0ZXMgYSBkaWZmZXJlbnQgdXNlciB0YXNrKSBvciB0YXNrCisgKiBzd2l0Y2hpbmcgKHRoZSB1c2VyIHRhc2sgc3dpdGNoZXMgdG8gYSBkaWZmZXJlbnQgdGhyZWFkKSB0aGVuIHRoaXMgYnJlYWtzCisgKiB0aGUgbm90aW9uIG9mICBjdXJyZW50IGluc3RhbmNlLiBBZGRpdGlvbmFsIEFQSSBjYWxscyBhcmUgcmVxdWlyZWQgdG8KKyAqIGRlYWwgd2l0aCB0aGF0IHBvc3NpYmlsaXR5LgorICogQHsKKyAqLworCisvKioKKyAqIEBpbmdyb3VwIHRhc2tzCisgKiBAYnJpZWYgQmVnaW4gYSB0YXNrIGluc3RhbmNlLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyB0YXNrCisgKiBAcGFyYW1baW5dIHRhc2tpZCBUaGUgaW5zdGFuY2UgSUQgZm9yIHRoaXMgdGFzayBpbnN0YW5jZSwgb3IgX19pdHRfbnVsbAorICogQHBhcmFtW2luXSBwYXJlbnRpZCBUaGUgcGFyZW50IGluc3RhbmNlIHRvIHdoaWNoIHRoaXMgdGFzayBpbnN0YW5jZSBiZWxvbmdzLCBvciBfX2l0dF9udWxsCisgKiBAcGFyYW1baW5dIG5hbWUgVGhlIG5hbWUgb2YgdGhpcyB0YXNrCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Rhc2tfYmVnaW4oY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIHRhc2tpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpOworCisvKioKKyAqIEBpbmdyb3VwIHRhc2tzCisgKiBAYnJpZWYgQmVnaW4gYSB0YXNrIGluc3RhbmNlLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyB0YXNrCisgKiBAcGFyYW1baW5dIHRhc2tpZCBUaGUgaWRlbnRpZmllciBmb3IgdGhpcyB0YXNrIGluc3RhbmNlIChtYXkgYmUgMCkKKyAqIEBwYXJhbVtpbl0gcGFyZW50aWQgVGhlIHBhcmVudCBvZiB0aGlzIHRhc2sgKG1heSBiZSAwKQorICogQHBhcmFtW2luXSBmbiBUaGUgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24geW91IGFyZSB0cmFjaW5nCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Rhc2tfYmVnaW5fZm4oY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIHRhc2tpZCwgX19pdHRfaWQgcGFyZW50aWQsIHZvaWQqIGZuKTsKKworLyoqCisgKiBAaW5ncm91cCB0YXNrcworICogQGJyaWVmIEVuZCB0aGUgY3VycmVudCB0YXNrIGluc3RhbmNlLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyB0YXNrCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Rhc2tfZW5kKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19iZWdpbiwgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19iZWdpbl9mbiwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50aWQsIHZvaWQqIGZuKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfZW5kLCAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbikpCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW4oZCx4LHkseikgICAgSVRUTk9USUZZX1ZPSURfRDModGFza19iZWdpbixkLHgseSx6KQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX3B0ciAgICAgICAgIElUVE5PVElGWV9OQU1FKHRhc2tfYmVnaW4pCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZm4oZCx4LHkseikgSVRUTk9USUZZX1ZPSURfRDModGFza19iZWdpbl9mbixkLHgseSx6KQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2ZuX3B0ciAgICAgIElUVE5PVElGWV9OQU1FKHRhc2tfYmVnaW5fZm4pCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kKGQpICAgICAgICAgICAgSVRUTk9USUZZX1ZPSURfRDAodGFza19lbmQsZCkKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfcHRyICAgICAgICAgICBJVFROT1RJRllfTkFNRSh0YXNrX2VuZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW4oZG9tYWluLGlkLHBhcmVudGlkLG5hbWUpCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fcHRyICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9mbihkb21haW4saWQscGFyZW50aWQsZm4pCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZm5fcHRyIDAKKyNkZWZpbmUgX19pdHRfdGFza19lbmQoZG9tYWluKQorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9wdHIgICAgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9wdHIgICAgMAorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2ZuX3B0ciAwCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX3B0ciAgICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSB0YXNrcyBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBjb3VudGVycyBDb3VudGVycworICogQGluZ3JvdXAgcHVibGljCisgKiBDb3VudGVycyBhcmUgdXNlci1kZWZpbmVkIG9iamVjdHMgd2l0aCBhIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZworICogdmFsdWUuIENvdW50ZXIgdmFsdWVzIGFyZSA2NC1iaXQgdW5zaWduZWQgaW50ZWdlcnMuIENvdW50ZXIgdmFsdWVzCisgKiBhcmUgdHJhY2tlZCBwZXItdGhyZWFkLiBDb3VudGVycyBoYXZlIG5hbWVzIHRoYXQgY2FuIGJlIGRpc3BsYXllZCBpbgorICogdGhlIHRvb2xzLgorICogQHsKKyAqLworCisvKioKKyAqIEBpbmdyb3VwIGNvdW50ZXJzCisgKiBAYnJpZWYgSW5jcmVtZW50IGEgY291bnRlciBieSBvbmUuCisgKiBUaGUgZmlyc3QgY2FsbCB3aXRoIGEgZ2l2ZW4gbmFtZSBjcmVhdGVzIGEgY291bnRlciBieSB0aGF0IG5hbWUgYW5kIHNldHMgaXRzCisgKiB2YWx1ZSB0byB6ZXJvIG9uIGV2ZXJ5IHRocmVhZC4gU3VjY2Vzc2l2ZSBjYWxscyBpbmNyZW1lbnQgdGhlIGNvdW50ZXIgdmFsdWUKKyAqIG9uIHRoZSB0aHJlYWQgb24gd2hpY2ggdGhlIGNhbGwgaXMgaXNzdWVkLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBjb250cm9sbGluZyB0aGUgY2FsbC4gQ291bnRlciBuYW1lcyBhcmUgbm90IGRvbWFpbiBzcGVjaWZpYy4KKyAqICAgICAgICAgICAgVGhlIGRvbWFpbiBhcmd1bWVudCBpcyB1c2VkIG9ubHkgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIEFQSSBjYWxscy4KKyAqIEBwYXJhbVtpbl0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY291bnRlcgorICovCit2b2lkIElUVEFQSSBfX2l0dF9jb3VudGVyX2luY192Myhjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSk7CisKKy8qKgorICogQGluZ3JvdXAgY291bnRlcnMKKyAqIEBicmllZiBJbmNyZW1lbnQgYSBjb3VudGVyIGJ5IHRoZSB2YWx1ZSBzcGVjaWZpZWQgaW4gZGVsdGEuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBjYWxsLiBDb3VudGVyIG5hbWVzIGFyZSBub3QgZG9tYWluIHNwZWNpZmljLgorICogICAgICAgICAgICBUaGUgZG9tYWluIGFyZ3VtZW50IGlzIHVzZWQgb25seSB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgQVBJIGNhbGxzLgorICogQHBhcmFtW2luXSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjb3VudGVyCisgKiBAcGFyYW1baW5dIGRlbHRhIFRoZSBhbW91bnQgYnkgd2hpY2ggdG8gaW5jcmVtZW50IHRoZSBjb3VudGVyCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2NvdW50ZXJfaW5jX2RlbHRhX3YzKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lLCB1bnNpZ25lZCBsb25nIGxvbmcgZGVsdGEpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBjb3VudGVyX2luY192MywgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGNvdW50ZXJfaW5jX2RlbHRhX3YzLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbG9uZyBkZWx0YSkpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX3YzKGQseCkgICAgICAgICBJVFROT1RJRllfVk9JRF9EMShjb3VudGVyX2luY192MyxkLHgpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX3YzX3B0ciAgICAgICAgICBJVFROT1RJRllfTkFNRShjb3VudGVyX2luY192MykKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfZGVsdGFfdjMoZCx4LHkpIElUVE5PVElGWV9WT0lEX0QyKGNvdW50ZXJfaW5jX2RlbHRhX3YzLGQseCx5KQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19kZWx0YV92M19wdHIgICAgSVRUTk9USUZZX05BTUUoY291bnRlcl9pbmNfZGVsdGFfdjMpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY192Myhkb21haW4sbmFtZSkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfdjNfcHRyICAgICAgIDAKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfZGVsdGFfdjMoZG9tYWluLG5hbWUsZGVsdGEpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX2RlbHRhX3YzX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfdjNfcHRyICAgICAgIDAKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfZGVsdGFfdjNfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBjb3VudGVycyBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBtYXJrZXJzIE1hcmtlcnMKKyAqIE1hcmtlcnMgcmVwcmVzZW50IGEgc2luZ2xlIGRpc2NyZWV0IGV2ZW50IGluIHRpbWUuIE1hcmtlcnMgaGF2ZSBhIHNjb3BlLAorICogZGVzY3JpYmVkIGJ5IGFuIGVudW1lcmF0ZWQgdHlwZSBfX2l0dF9zY29wZS4gTWFya2VycyBhcmUgY3JlYXRlZCBieQorICogdGhlIEFQSSBjYWxsIF9faXR0X21hcmtlci4gQSBtYXJrZXIgaW5zdGFuY2UgY2FuIGJlIGdpdmVuIGFuIElEIGZvciB1c2UgaW4KKyAqIGFkZGluZyBtZXRhZGF0YS4KKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgRGVzY3JpYmVzIHRoZSBzY29wZSBvZiBhbiBldmVudCBvYmplY3QgaW4gdGhlIHRyYWNlLgorICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBfX2l0dF9zY29wZV91bmtub3duID0gMCwKKyAgICBfX2l0dF9zY29wZV9nbG9iYWwsCisgICAgX19pdHRfc2NvcGVfdHJhY2tfZ3JvdXAsCisgICAgX19pdHRfc2NvcGVfdHJhY2ssCisgICAgX19pdHRfc2NvcGVfdGFzaywKKyAgICBfX2l0dF9zY29wZV9tYXJrZXIKK30gX19pdHRfc2NvcGU7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2RlZmluZSBfX2l0dF9tYXJrZXJfc2NvcGVfdW5rbm93biAgX19pdHRfc2NvcGVfdW5rbm93bgorI2RlZmluZSBfX2l0dF9tYXJrZXJfc2NvcGVfZ2xvYmFsICAgX19pdHRfc2NvcGVfZ2xvYmFsCisjZGVmaW5lIF9faXR0X21hcmtlcl9zY29wZV9wcm9jZXNzICBfX2l0dF9zY29wZV90cmFja19ncm91cAorI2RlZmluZSBfX2l0dF9tYXJrZXJfc2NvcGVfdGhyZWFkICAgX19pdHRfc2NvcGVfdHJhY2sKKyNkZWZpbmUgX19pdHRfbWFya2VyX3Njb3BlX3Rhc2sgICAgIF9faXR0X3Njb3BlX3Rhc2sKKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIG1hcmtlcnMKKyAqIEBicmllZiBDcmVhdGUgYSBtYXJrZXIgaW5zdGFuY2UKKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgbWFya2VyCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhpcyBtYXJrZXIgb3IgX19pdHRfbnVsbAorICogQHBhcmFtW2luXSBuYW1lIFRoZSBuYW1lIGZvciB0aGlzIG1hcmtlcgorICogQHBhcmFtW2luXSBzY29wZSBUaGUgc2NvcGUgZm9yIHRoaXMgbWFya2VyCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X21hcmtlcihjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUsIF9faXR0X3Njb3BlIHNjb3BlKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWFya2VyLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lLCBfX2l0dF9zY29wZSBzY29wZSkpCisjZGVmaW5lIF9faXR0X21hcmtlcihkLHgseSx6KSBJVFROT1RJRllfVk9JRF9EMyhtYXJrZXIsZCx4LHkseikKKyNkZWZpbmUgX19pdHRfbWFya2VyX3B0ciAgICAgIElUVE5PVElGWV9OQU1FKG1hcmtlcikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21hcmtlcihkb21haW4saWQsbmFtZSxzY29wZSkKKyNkZWZpbmUgX19pdHRfbWFya2VyX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbWFya2VyX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gbWFya2VycyBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBtZXRhZGF0YSBNZXRhZGF0YQorICogVGhlIG1ldGFkYXRhIEFQSSBpcyB1c2VkIHRvIGF0dGFjaCBleHRyYSBpbmZvcm1hdGlvbiB0byBuYW1lZAorICogZW50aXRpZXMuIE1ldGFkYXRhIGNhbiBiZSBhdHRhY2hlZCB0byBhbiBpZGVudGlmaWVkIG5hbWVkIGVudGl0eSBieSBJRCwKKyAqIG9yIHRvIHRoZSBjdXJyZW50IGVudGl0eSAod2hpY2ggaXMgYWx3YXlzIGEgdGFzaykuCisgKgorICogQ29uY2VwdHVhbGx5IG1ldGFkYXRhIGhhcyBhIHR5cGUgKHdoYXQga2luZCBvZiBtZXRhZGF0YSksIGEga2V5ICh0aGUKKyAqIG5hbWUgb2YgdGhlIG1ldGFkYXRhKSwgYW5kIGEgdmFsdWUgKHRoZSBhY3R1YWwgZGF0YSkuIFRoZSBlbmNvZGluZyBvZgorICogdGhlIHZhbHVlIGRlcGVuZHMgb24gdGhlIHR5cGUgb2YgdGhlIG1ldGFkYXRhLgorICoKKyAqIFRoZSB0eXBlIG9mIG1ldGFkYXRhIGlzIHNwZWNpZmllZCBieSBhbiBlbnVtZXJhdGVkIHR5cGUgX19pdHRfbWV0ZGF0YV90eXBlLgorICogQHsKKyAqLworCisvKioKKyAqIEBpbmdyb3VwIHBhcmFtZXRlcnMKKyAqIEBicmllZiBkZXNjcmliZXMgdGhlIHR5cGUgb2YgbWV0YWRhdGEKKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBfX2l0dF9tZXRhZGF0YV91bmtub3duID0gMCwKKyAgICBfX2l0dF9tZXRhZGF0YV91NjQsICAgICAvKio8IFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCisgICAgX19pdHRfbWV0YWRhdGFfczY0LCAgICAgLyoqPCBTaWduZWQgNjQtYml0IGludGVnZXIgKi8KKyAgICBfX2l0dF9tZXRhZGF0YV91MzIsICAgICAvKio8IFVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyICovCisgICAgX19pdHRfbWV0YWRhdGFfczMyLCAgICAgLyoqPCBTaWduZWQgMzItYml0IGludGVnZXIgKi8KKyAgICBfX2l0dF9tZXRhZGF0YV91MTYsICAgICAvKio8IFVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyICovCisgICAgX19pdHRfbWV0YWRhdGFfczE2LCAgICAgLyoqPCBTaWduZWQgMTYtYml0IGludGVnZXIgKi8KKyAgICBfX2l0dF9tZXRhZGF0YV9mbG9hdCwgICAvKio8IFNpZ25lZCAzMi1iaXQgZmxvYXRpbmctcG9pbnQgKi8KKyAgICBfX2l0dF9tZXRhZGF0YV9kb3VibGUgICAvKio8IFNJZ25lZCA2NC1iaXQgZmxvYXRpbmctcG9pbnQgKi8KK30gX19pdHRfbWV0YWRhdGFfdHlwZTsKKworLyoqCisgKiBAaW5ncm91cCBwYXJhbWV0ZXJzCisgKiBAYnJpZWYgQWRkIG1ldGFkYXRhIHRvIGFuIGluc3RhbmNlIG9mIGEgbmFtZWQgZW50aXR5LgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBjb250cm9sbGluZyB0aGUgY2FsbAorICogQHBhcmFtW2luXSBpZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgaW5zdGFuY2UgdG8gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIHRvIGJlIGFkZGVkLCBvciBfX2l0dF9udWxsIHRvIGFkZCB0byB0aGUgY3VycmVudCB0YXNrCisgKiBAcGFyYW1baW5dIGtleSBUaGUgbmFtZSBvZiB0aGUgbWV0YWRhdGEKKyAqIEBwYXJhbVtpbl0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgbWV0YWRhdGEKKyAqIEBwYXJhbVtpbl0gY291bnQgVGhlIG51bWJlciBvZiBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gdHlwZS4gSWYgY291bnQgPT0gMCwgbm8gbWV0YWRhdGEgd2lsbCBiZSBhZGRlZC4KKyAqIEBwYXJhbVtpbl0gZGF0YSBUaGUgbWV0YWRhdGEgaXRzZWxmCisqLwordm9pZCBJVFRBUEkgX19pdHRfbWV0YWRhdGFfYWRkKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBfX2l0dF9tZXRhZGF0YV90eXBlIHR5cGUsIHNpemVfdCBjb3VudCwgdm9pZCAqZGF0YSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX2FkZCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBfX2l0dF9tZXRhZGF0YV90eXBlIHR5cGUsIHNpemVfdCBjb3VudCwgdm9pZCAqZGF0YSkpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX2FkZChkLHgseSx6LGEsYikgSVRUTk9USUZZX1ZPSURfRDUobWV0YWRhdGFfYWRkLGQseCx5LHosYSxiKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9hZGRfcHRyICAgICAgICAgIElUVE5PVElGWV9OQU1FKG1ldGFkYXRhX2FkZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX2FkZChkLHgseSx6LGEsYikKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfYWRkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfYWRkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgcGFyYW1ldGVycworICogQGJyaWVmIEFkZCBzdHJpbmcgbWV0YWRhdGEgdG8gYW4gaW5zdGFuY2Ugb2YgYSBuYW1lZCBlbnRpdHkuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBjYWxsCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBpbnN0YW5jZSB0byB3aGljaCB0aGUgbWV0YWRhdGEgaXMgdG8gYmUgYWRkZWQsIG9yIF9faXR0X251bGwgdG8gYWRkIHRvIHRoZSBjdXJyZW50IHRhc2sKKyAqIEBwYXJhbVtpbl0ga2V5IFRoZSBuYW1lIG9mIHRoZSBtZXRhZGF0YQorICogQHBhcmFtW2luXSBkYXRhIFRoZSBtZXRhZGF0YSBpdHNlbGYKKyAqIEBwYXJhbVtpbl0gbGVuZ3RoIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nLCBvciAtMSBpZiB0aGUgbGVuZ3RoIGlzIHVua25vd24gYnV0IHRoZSBzdHJpbmcgaXMgbnVsbC10ZXJtaW5hdGVkCisqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgordm9pZCBJVFRBUEkgX19pdHRfbWV0YWRhdGFfc3RyX2FkZEEoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW5ndGgpOwordm9pZCBJVFRBUEkgX19pdHRfbWV0YWRhdGFfc3RyX2FkZFcoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IHdjaGFyX3QgKmRhdGEsIHNpemVfdCBsZW5ndGgpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkICAgICBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkVworIyAgZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfcHRyIF9faXR0X21ldGFkYXRhX3N0cl9hZGRXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGQgICAgIF9faXR0X21ldGFkYXRhX3N0cl9hZGRBCisjICBkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF9wdHIgX19pdHRfbWV0YWRhdGFfc3RyX2FkZEFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCit2b2lkIElUVEFQSSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuZ3RoKTsKKyNlbmRpZgorCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9zdHJfYWRkQSwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuZ3RoKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX3N0cl9hZGRXLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IHdjaGFyX3QgKmRhdGEsIHNpemVfdCBsZW5ndGgpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfc3RyX2FkZCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuZ3RoKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZEEoZCx4LHkseixhKSBJVFROT1RJRllfVk9JRF9ENChtZXRhZGF0YV9zdHJfYWRkQSxkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRBX3B0ciAgICAgICAgSVRUTk9USUZZX05BTUUobWV0YWRhdGFfc3RyX2FkZEEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRXKGQseCx5LHosYSkgSVRUTk9USUZZX1ZPSURfRDQobWV0YWRhdGFfc3RyX2FkZFcsZCx4LHkseixhKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkV19wdHIgICAgICAgIElUVE5PVElGWV9OQU1FKG1ldGFkYXRhX3N0cl9hZGRXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGQoZCx4LHkseixhKSAgSVRUTk9USUZZX1ZPSURfRDQobWV0YWRhdGFfc3RyX2FkZCxkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfcHRyICAgICAgICAgSVRUTk9USUZZX05BTUUobWV0YWRhdGFfc3RyX2FkZCkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRBKGQseCx5LHosYSkKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZEFfcHRyIDAKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZFcoZCx4LHkseixhKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGQoZCx4LHkseixhKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZEFfcHRyIDAKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZFdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIHBhcmFtZXRlcnMKKyAqIEBicmllZiBBZGQgbWV0YWRhdGEgdG8gYW4gaW5zdGFuY2Ugb2YgYSBuYW1lZCBlbnRpdHkuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBjYWxsCisgKiBAcGFyYW1baW5dIHNjb3BlIFRoZSBzY29wZSBvZiB0aGUgaW5zdGFuY2UgdG8gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIHRvIGJlIGFkZGVkCisKKyAqIEBwYXJhbVtpbl0gaWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGluc3RhbmNlIHRvIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyB0byBiZSBhZGRlZCwgb3IgX19pdHRfbnVsbCB0byBhZGQgdG8gdGhlIGN1cnJlbnQgdGFzaworCisgKiBAcGFyYW1baW5dIGtleSBUaGUgbmFtZSBvZiB0aGUgbWV0YWRhdGEKKyAqIEBwYXJhbVtpbl0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgbWV0YWRhdGEKKyAqIEBwYXJhbVtpbl0gY291bnQgVGhlIG51bWJlciBvZiBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gdHlwZS4gSWYgY291bnQgPT0gMCwgbm8gbWV0YWRhdGEgd2lsbCBiZSBhZGRlZC4KKyAqIEBwYXJhbVtpbl0gZGF0YSBUaGUgbWV0YWRhdGEgaXRzZWxmCisqLwordm9pZCBJVFRBUEkgX19pdHRfbWV0YWRhdGFfYWRkX3dpdGhfc2NvcGUoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3Njb3BlIHNjb3BlLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIF9faXR0X21ldGFkYXRhX3R5cGUgdHlwZSwgc2l6ZV90IGNvdW50LCB2b2lkICpkYXRhKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfYWRkX3dpdGhfc2NvcGUsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgX19pdHRfbWV0YWRhdGFfdHlwZSB0eXBlLCBzaXplX3QgY291bnQsIHZvaWQgKmRhdGEpKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9hZGRfd2l0aF9zY29wZShkLHgseSx6LGEsYikgSVRUTk9USUZZX1ZPSURfRDUobWV0YWRhdGFfYWRkX3dpdGhfc2NvcGUsZCx4LHkseixhLGIpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX2FkZF93aXRoX3Njb3BlX3B0ciAgICAgICAgICBJVFROT1RJRllfTkFNRShtZXRhZGF0YV9hZGRfd2l0aF9zY29wZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX2FkZF93aXRoX3Njb3BlKGQseCx5LHosYSxiKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9hZGRfd2l0aF9zY29wZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX2FkZF93aXRoX3Njb3BlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgcGFyYW1ldGVycworICogQGJyaWVmIEFkZCBzdHJpbmcgbWV0YWRhdGEgdG8gYW4gaW5zdGFuY2Ugb2YgYSBuYW1lZCBlbnRpdHkuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBjYWxsCisgKiBAcGFyYW1baW5dIHNjb3BlIFRoZSBzY29wZSBvZiB0aGUgaW5zdGFuY2UgdG8gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIHRvIGJlIGFkZGVkCisKKyAqIEBwYXJhbVtpbl0gaWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGluc3RhbmNlIHRvIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyB0byBiZSBhZGRlZCwgb3IgX19pdHRfbnVsbCB0byBhZGQgdG8gdGhlIGN1cnJlbnQgdGFzaworCisgKiBAcGFyYW1baW5dIGtleSBUaGUgbmFtZSBvZiB0aGUgbWV0YWRhdGEKKyAqIEBwYXJhbVtpbl0gZGF0YSBUaGUgbWV0YWRhdGEgaXRzZWxmCisgKiBAcGFyYW1baW5dIGxlbmd0aCBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZywgb3IgLTEgaWYgdGhlIGxlbmd0aCBpcyB1bmtub3duIGJ1dCB0aGUgc3RyaW5nIGlzIG51bGwtdGVybWluYXRlZAorKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK3ZvaWQgSVRUQVBJIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZUEoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3Njb3BlIHNjb3BlLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW5ndGgpOwordm9pZCBJVFRBUEkgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlVyhjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3Qgd2NoYXJfdCAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZSAgICAgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlVworIyAgZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZV9wdHIgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGUgICAgIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZUEKKyMgIGRlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVfcHRyIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCit2b2lkIElUVEFQSSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGUoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3Njb3BlIHNjb3BlLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW5ndGgpOworI2VuZGlmCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZUEsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbmd0aCkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3Njb3BlIHNjb3BlLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IHdjaGFyX3QgKmRhdGEsIHNpemVfdCBsZW5ndGgpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3Njb3BlIHNjb3BlLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW5ndGgpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVBKGQseCx5LHosYSkgSVRUTk9USUZZX1ZPSURfRDQobWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQSxkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZUFfcHRyICAgICAgICBJVFROT1RJRllfTkFNRShtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVBKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXKGQseCx5LHosYSkgSVRUTk9USUZZX1ZPSURfRDQobWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlVyxkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZVdfcHRyICAgICAgICBJVFROT1RJRllfTkFNRShtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZShkLHgseSx6LGEpICBJVFROT1RJRllfVk9JRF9ENChtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGUsZCx4LHkseixhKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVfcHRyICAgICAgICAgSVRUTk9USUZZX05BTUUobWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQShkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZUFfcHRyICAwCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZVcoZCx4LHkseixhKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXX3B0ciAgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZShkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZV9wdHIgICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQV9wdHIgIDAKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlV19wdHIgIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVfcHRyICAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKiogQH0gbWV0YWRhdGEgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgcmVsYXRpb25zIFJlbGF0aW9ucworICogSW5zdGFuY2VzIG9mIG5hbWVkIGVudGl0aWVzIGNhbiBiZSBleHBsaWNpdGx5IGFzc29jaWF0ZWQgd2l0aCBvdGhlcgorICogaW5zdGFuY2VzIHVzaW5nIGluc3RhbmNlIElEcyBhbmQgdGhlIHJlbGF0aW9uc2hpcCBBUEkgY2FsbHMuCisgKgorICogQHsKKyAqLworCisvKioKKyAqIEBpbmdyb3VwIHJlbGF0aW9ucworICogQGJyaWVmIFRoZSBraW5kIG9mIHJlbGF0aW9uIGJldHdlZW4gdHdvIGluc3RhbmNlcyBpcyBzcGVjaWZpZWQgYnkgdGhlIGVudW1lcmF0ZWQgdHlwZSBfX2l0dF9yZWxhdGlvbi4KKyAqIFJlbGF0aW9ucyBiZXR3ZWVuIGluc3RhbmNlcyBjYW4gYmUgYWRkZWQgd2l0aCBhbiBBUEkgY2FsbC4gVGhlIHJlbGF0aW9uCisgKiBBUEkgdXNlcyBpbnN0YW5jZSBJRHMuIFJlbGF0aW9ucyBjYW4gYmUgYWRkZWQgYmVmb3JlIG9yIGFmdGVyIHRoZSBhY3R1YWwKKyAqIGluc3RhbmNlcyBhcmUgY3JlYXRlZCBhbmQgcGVyc2lzdCBpbmRlcGVuZGVudGx5IG9mIHRoZSBpbnN0YW5jZXMuIFRoaXMKKyAqIGlzIHRoZSBtb3RpdmF0aW9uIGZvciBoYXZpbmcgZGlmZmVyZW50IGxpZmV0aW1lcyBmb3IgaW5zdGFuY2UgSURzIGFuZAorICogdGhlIGFjdHVhbCBpbnN0YW5jZXMuCisgKi8KK3R5cGVkZWYgZW51bQoreworICAgIF9faXR0X3JlbGF0aW9uX2lzX3Vua25vd24gPSAwLAorICAgIF9faXR0X3JlbGF0aW9uX2lzX2RlcGVuZGVudF9vbiwgICAgICAgICAvKio8ICJBIGlzIGRlcGVuZGVudCBvbiBCIiBtZWFucyB0aGF0IEEgY2Fubm90IHN0YXJ0IHVudGlsIEIgY29tcGxldGVzICovCisgICAgX19pdHRfcmVsYXRpb25faXNfc2libGluZ19vZiwgICAgICAgICAgIC8qKjwgIkEgaXMgc2libGluZyBvZiBCIiBtZWFucyB0aGF0IEEgYW5kIEIgd2VyZSBjcmVhdGVkIGFzIGEgZ3JvdXAgKi8KKyAgICBfX2l0dF9yZWxhdGlvbl9pc19wYXJlbnRfb2YsICAgICAgICAgICAgLyoqPCAiQSBpcyBwYXJlbnQgb2YgQiIgbWVhbnMgdGhhdCBBIGNyZWF0ZWQgQiAqLworICAgIF9faXR0X3JlbGF0aW9uX2lzX2NvbnRpbnVhdGlvbl9vZiwgICAgICAvKio8ICJBIGlzIGNvbnRpbnVhdGlvbiBvZiBCIiBtZWFucyB0aGF0IEEgYXNzdW1lcyB0aGUgZGVwZW5kZW5jaWVzIG9mIEIgKi8KKyAgICBfX2l0dF9yZWxhdGlvbl9pc19jaGlsZF9vZiwgICAgICAgICAgICAgLyoqPCAiQSBpcyBjaGlsZCBvZiBCIiBtZWFucyB0aGF0IEEgd2FzIGNyZWF0ZWQgYnkgQiAoaW52ZXJzZSBvZiBpc19wYXJlbnRfb2YpICovCisgICAgX19pdHRfcmVsYXRpb25faXNfY29udGludWVkX2J5LCAgICAgICAgIC8qKjwgIkEgaXMgY29udGludWVkIGJ5IEIiIG1lYW5zIHRoYXQgQiBhc3N1bWVzIHRoZSBkZXBlbmRlbmNpZXMgb2YgQSAoaW52ZXJzZSBvZiBpc19jb250aW51YXRpb25fb2YpICovCisgICAgX19pdHRfcmVsYXRpb25faXNfcHJlZGVjZXNzb3JfdG8gICAgICAgIC8qKjwgIkEgaXMgcHJlZGVjZXNzb3IgdG8gQiIgbWVhbnMgdGhhdCBCIGNhbm5vdCBzdGFydCB1bnRpbCBBIGNvbXBsZXRlcyAoaW52ZXJzZSBvZiBpc19kZXBlbmRlbnRfb24pICovCit9IF9faXR0X3JlbGF0aW9uOworCisvKioKKyAqIEBpbmdyb3VwIHJlbGF0aW9ucworICogQGJyaWVmIEFkZCBhIHJlbGF0aW9uIHRvIHRoZSBjdXJyZW50IHRhc2sgaW5zdGFuY2UuCisgKiBUaGUgY3VycmVudCB0YXNrIGluc3RhbmNlIGlzIHRoZSBoZWFkIG9mIHRoZSByZWxhdGlvbi4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhpcyBjYWxsCisgKiBAcGFyYW1baW5dIHJlbGF0aW9uIFRoZSBraW5kIG9mIHJlbGF0aW9uCisgKiBAcGFyYW1baW5dIHRhaWwgVGhlIElEIGZvciB0aGUgdGFpbCBvZiB0aGUgcmVsYXRpb24KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfcmVsYXRpb25fYWRkX3RvX2N1cnJlbnQoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKTsKKworLyoqCisgKiBAaW5ncm91cCByZWxhdGlvbnMKKyAqIEBicmllZiBBZGQgYSByZWxhdGlvbiBiZXR3ZWVuIHR3byBpbnN0YW5jZSBpZGVudGlmaWVycy4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhpcyBjYWxsCisgKiBAcGFyYW1baW5dIGhlYWQgVGhlIElEIGZvciB0aGUgaGVhZCBvZiB0aGUgcmVsYXRpb24KKyAqIEBwYXJhbVtpbl0gcmVsYXRpb24gVGhlIGtpbmQgb2YgcmVsYXRpb24KKyAqIEBwYXJhbVtpbl0gdGFpbCBUaGUgSUQgZm9yIHRoZSB0YWlsIG9mIHRoZSByZWxhdGlvbgorICovCit2b2lkIElUVEFQSSBfX2l0dF9yZWxhdGlvbl9hZGQoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGhlYWQsIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVsYXRpb25fYWRkX3RvX2N1cnJlbnQsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfcmVsYXRpb24gcmVsYXRpb24sIF9faXR0X2lkIHRhaWwpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVsYXRpb25fYWRkLCAgICAgICAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaGVhZCwgX19pdHRfcmVsYXRpb24gcmVsYXRpb24sIF9faXR0X2lkIHRhaWwpKQorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfdG9fY3VycmVudChkLHgseSkgSVRUTk9USUZZX1ZPSURfRDIocmVsYXRpb25fYWRkX3RvX2N1cnJlbnQsZCx4LHkpCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF90b19jdXJyZW50X3B0ciAgICBJVFROT1RJRllfTkFNRShyZWxhdGlvbl9hZGRfdG9fY3VycmVudCkKKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkKGQseCx5LHopICAgICAgICAgIElUVE5PVElGWV9WT0lEX0QzKHJlbGF0aW9uX2FkZCxkLHgseSx6KQorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfcHRyICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUocmVsYXRpb25fYWRkKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkX3RvX2N1cnJlbnQoZCx4LHkpCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF90b19jdXJyZW50X3B0ciAwCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZChkLHgseSx6KQorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfdG9fY3VycmVudF9wdHIgMAorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSByZWxhdGlvbnMgZ3JvdXAgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjcHJhZ21hIHBhY2socHVzaCwgOCkKKwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X2Nsb2NrX2luZm8KK3sKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgY2xvY2tfZnJlcTsgLyohPCBDbG9jayBkb21haW4gZnJlcXVlbmN5ICovCisgICAgdW5zaWduZWQgbG9uZyBsb25nIGNsb2NrX2Jhc2U7IC8qITwgQ2xvY2sgZG9tYWluIGJhc2UgdGltZXN0YW1wICovCit9IF9faXR0X2Nsb2NrX2luZm87CisKKyNwcmFnbWEgcGFjayhwb3ApCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCit0eXBlZGVmIHZvaWQgKElUVEFQSSAqX19pdHRfZ2V0X2Nsb2NrX2luZm9fZm4pKF9faXR0X2Nsb2NrX2luZm8qIGNsb2NrX2luZm8sIHZvaWQqIGRhdGEpOworLyoqIEBlbmRjb25kICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI3ByYWdtYSBwYWNrKHB1c2gsIDgpCisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9jbG9ja19kb21haW4KK3sKKyAgICBfX2l0dF9jbG9ja19pbmZvIGluZm87ICAgICAgLyohPCBNb3N0IHJlY2VudCBjbG9jayBkb21haW4gaW5mbyAqLworICAgIF9faXR0X2dldF9jbG9ja19pbmZvX2ZuIGZuOyAvKiE8IENhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgICB2b2lkKiBmbl9kYXRhOyAgICAgICAgICAgICAgLyohPCBJbnB1dCBhcmd1bWVudCBmb3IgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCisgICAgaW50ICAgZXh0cmExOyAgICAgICAgICAgICAgIC8qITwgUmVzZXJ2ZWQuIE11c3QgYmUgemVybyAqLworICAgIHZvaWQqIGV4dHJhMjsgICAgICAgICAgICAgICAvKiE8IFJlc2VydmVkLiBNdXN0IGJlIHplcm8gKi8KKyAgICBzdHJ1Y3QgX19faXR0X2Nsb2NrX2RvbWFpbiogbmV4dDsKK30gX19pdHRfY2xvY2tfZG9tYWluOworCisjcHJhZ21hIHBhY2socG9wKQorLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgY2xvY2tkb21haW5zCisgKiBAYnJpZWYgQ3JlYXRlIGEgY2xvY2sgZG9tYWluLgorICogQ2VydGFpbiBhcHBsaWNhdGlvbnMgcmVxdWlyZSB0aGUgY2FwYWJpbGl0eSB0byB0cmFjZSB0aGVpciBhcHBsaWNhdGlvbiB1c2luZworICogYSBjbG9jayBkb21haW4gZGlmZmVyZW50IHRoYW4gdGhlIENQVSwgZm9yIGluc3RhbmNlIHRoZSBpbnN0cnVtZW50YXRpb24gb2YgZXZlbnRzCisgKiB0aGF0IG9jY3VyIG9uIGEgR1BVLgorICogQmVjYXVzZSB0aGUgc2V0IG9mIGRvbWFpbnMgaXMgZXhwZWN0ZWQgdG8gYmUgc3RhdGljIG92ZXIgdGhlIGFwcGxpY2F0aW9uJ3MgZXhlY3V0aW9uIHRpbWUsCisgKiB0aGVyZSBpcyBubyBtZWNoYW5pc20gdG8gZGVzdHJveSBhIGRvbWFpbi4KKyAqIEFueSBkb21haW4gY2FuIGJlIGFjY2Vzc2VkIGJ5IGFueSB0aHJlYWQgaW4gdGhlIHByb2Nlc3MsIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggdGhyZWFkIGNyZWF0ZWQKKyAqIHRoZSBkb21haW4uIFRoaXMgY2FsbCBpcyB0aHJlYWQtc2FmZS4KKyAqIEBwYXJhbVtpbl0gZm4gQSBwb2ludGVyIHRvIGEgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggcmV0cmlldmVzIGFsdGVybmF0aXZlIENQVSB0aW1lc3RhbXBzCisgKiBAcGFyYW1baW5dIGZuX2RhdGEgQXJndW1lbnQgZm9yIGEgY2FsbGJhY2sgZnVuY3Rpb247IG1heSBiZSBOVUxMCisgKi8KK19faXR0X2Nsb2NrX2RvbWFpbiogSVRUQVBJIF9faXR0X2Nsb2NrX2RvbWFpbl9jcmVhdGUoX19pdHRfZ2V0X2Nsb2NrX2luZm9fZm4gZm4sIHZvaWQqIGZuX2RhdGEpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2Nsb2NrX2RvbWFpbiosIGNsb2NrX2RvbWFpbl9jcmVhdGUsIChfX2l0dF9nZXRfY2xvY2tfaW5mb19mbiBmbiwgdm9pZCogZm5fZGF0YSkpCisjZGVmaW5lIF9faXR0X2Nsb2NrX2RvbWFpbl9jcmVhdGUgICAgIElUVE5PVElGWV9EQVRBKGNsb2NrX2RvbWFpbl9jcmVhdGUpCisjZGVmaW5lIF9faXR0X2Nsb2NrX2RvbWFpbl9jcmVhdGVfcHRyIElUVE5PVElGWV9OQU1FKGNsb2NrX2RvbWFpbl9jcmVhdGUpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9jbG9ja19kb21haW5fY3JlYXRlKGZuLGZuX2RhdGEpIChfX2l0dF9jbG9ja19kb21haW4qKTAKKyNkZWZpbmUgX19pdHRfY2xvY2tfZG9tYWluX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2Nsb2NrX2RvbWFpbl9jcmVhdGVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBjbG9ja2RvbWFpbnMKKyAqIEBicmllZiBSZWNhbGN1bGF0ZSBjbG9jayBkb21haW5zIGZyZXF1ZW5jZXMgYW5kIGNsb2NrIGJhc2UgdGltZXN0YW1wcy4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfY2xvY2tfZG9tYWluX3Jlc2V0KHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBjbG9ja19kb21haW5fcmVzZXQsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfY2xvY2tfZG9tYWluX3Jlc2V0ICAgICBJVFROT1RJRllfVk9JRChjbG9ja19kb21haW5fcmVzZXQpCisjZGVmaW5lIF9faXR0X2Nsb2NrX2RvbWFpbl9yZXNldF9wdHIgSVRUTk9USUZZX05BTUUoY2xvY2tfZG9tYWluX3Jlc2V0KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfY2xvY2tfZG9tYWluX3Jlc2V0KCkKKyNkZWZpbmUgX19pdHRfY2xvY2tfZG9tYWluX3Jlc2V0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfY2xvY2tfZG9tYWluX3Jlc2V0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgY2xvY2tkb21haW4KKyAqIEBicmllZiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgaWRlbnRpZmllci4gVGhpcyBlc3RhYmxpc2hlcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaWZldGltZSBvZgorICogYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIElEIGluIHRoZSB0cmFjZS4gT25jZSB0aGlzIGxpZmV0aW1lIHN0YXJ0cywgdGhlIElEIGNhbiBiZSB1c2VkIHRvCisgKiB0YWcgbmFtZWQgZW50aXR5IGluc3RhbmNlcyBpbiBjYWxscyBzdWNoIGFzIF9faXR0X3Rhc2tfYmVnaW4sIGFuZCB0byBzcGVjaWZ5IHJlbGF0aW9uc2hpcHMgYW1vbmcKKyAqIGlkZW50aWZpZWQgbmFtZWQgZW50aXR5IGluc3RhbmNlcywgdXNpbmcgdGhlIFxyZWYgcmVsYXRpb25zIEFQSXMuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSBjbG9ja19kb21haW4gVGhlIGNsb2NrIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gdGltZXN0YW1wIFRoZSB1c2VyIGRlZmluZWQgdGltZXN0YW1wLgorICogQHBhcmFtW2luXSBpZCBUaGUgSUQgdG8gY3JlYXRlLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9pZF9jcmVhdGVfZXgoY29uc3QgX19pdHRfZG9tYWluKiBkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBpZCk7CisKKy8qKgorICogQGluZ3JvdXAgY2xvY2tkb21haW4KKyAqIEBicmllZiBEZXN0cm95IGFuIGluc3RhbmNlIG9mIGlkZW50aWZpZXIuIFRoaXMgZW5kcyB0aGUgbGlmZXRpbWUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgdGhlCisgKiBnaXZlbiBJRCB2YWx1ZSBpbiB0aGUgdHJhY2UuIEFueSByZWxhdGlvbnNoaXBzIHRoYXQgYXJlIGVzdGFibGlzaGVkIGFmdGVyIHRoaXMgbGlmZXRpbWUgZW5kcyBhcmUKKyAqIGludmFsaWQuIFRoaXMgY2FsbCBtdXN0IGJlIHBlcmZvcm1lZCBiZWZvcmUgdGhlIGdpdmVuIElEIHZhbHVlIGNhbiBiZSByZXVzZWQgZm9yIGEgZGlmZmVyZW50CisgKiBuYW1lZCBlbnRpdHkgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSBjbG9ja19kb21haW4gVGhlIGNsb2NrIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gdGltZXN0YW1wIFRoZSB1c2VyIGRlZmluZWQgdGltZXN0YW1wLgorICogQHBhcmFtW2luXSBpZCBUaGUgSUQgdG8gZGVzdHJveS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfaWRfZGVzdHJveV9leChjb25zdCBfX2l0dF9kb21haW4qIGRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaWRfY3JlYXRlX2V4LCAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaWRfZGVzdHJveV9leCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQpKQorI2RlZmluZSBfX2l0dF9pZF9jcmVhdGVfZXgoZCx4LHkseikgIElUVE5PVElGWV9WT0lEX0QzKGlkX2NyZWF0ZV9leCxkLHgseSx6KQorI2RlZmluZSBfX2l0dF9pZF9jcmVhdGVfZXhfcHRyICAgICAgIElUVE5PVElGWV9OQU1FKGlkX2NyZWF0ZV9leCkKKyNkZWZpbmUgX19pdHRfaWRfZGVzdHJveV9leChkLHgseSx6KSBJVFROT1RJRllfVk9JRF9EMyhpZF9kZXN0cm95X2V4LGQseCx5LHopCisjZGVmaW5lIF9faXR0X2lkX2Rlc3Ryb3lfZXhfcHRyICAgICAgSVRUTk9USUZZX05BTUUoaWRfZGVzdHJveV9leCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZV9leChkb21haW4sY2xvY2tfZG9tYWluLHRpbWVzdGFtcCxpZCkKKyNkZWZpbmUgX19pdHRfaWRfY3JlYXRlX2V4X3B0ciAgICAwCisjZGVmaW5lIF9faXR0X2lkX2Rlc3Ryb3lfZXgoZG9tYWluLGNsb2NrX2RvbWFpbix0aW1lc3RhbXAsaWQpCisjZGVmaW5lIF9faXR0X2lkX2Rlc3Ryb3lfZXhfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9pZF9jcmVhdGVfZXhfcHRyICAgIDAKKyNkZWZpbmUgX19pdHRfaWRfZGVzdHJveV9leF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIGNsb2NrZG9tYWluCisgKiBAYnJpZWYgQmVnaW4gYSB0YXNrIGluc3RhbmNlLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyB0YXNrCisgKiBAcGFyYW1baW5dIGNsb2NrX2RvbWFpbiBUaGUgY2xvY2sgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSB0aW1lc3RhbXAgVGhlIHVzZXIgZGVmaW5lZCB0aW1lc3RhbXAuCisgKiBAcGFyYW1baW5dIHRhc2tpZCBUaGUgaW5zdGFuY2UgSUQgZm9yIHRoaXMgdGFzayBpbnN0YW5jZSwgb3IgX19pdHRfbnVsbAorICogQHBhcmFtW2luXSBwYXJlbnRpZCBUaGUgcGFyZW50IGluc3RhbmNlIHRvIHdoaWNoIHRoaXMgdGFzayBpbnN0YW5jZSBiZWxvbmdzLCBvciBfX2l0dF9udWxsCisgKiBAcGFyYW1baW5dIG5hbWUgVGhlIG5hbWUgb2YgdGhpcyB0YXNrCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Rhc2tfYmVnaW5fZXgoY29uc3QgX19pdHRfZG9tYWluKiBkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCB0YXNraWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlKiBuYW1lKTsKKworLyoqCisgKiBAaW5ncm91cCBjbG9ja2RvbWFpbgorICogQGJyaWVmIEJlZ2luIGEgdGFzayBpbnN0YW5jZS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgdGFzaworICogQHBhcmFtW2luXSBjbG9ja19kb21haW4gVGhlIGNsb2NrIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gdGltZXN0YW1wIFRoZSB1c2VyIGRlZmluZWQgdGltZXN0YW1wLgorICogQHBhcmFtW2luXSB0YXNraWQgVGhlIGlkZW50aWZpZXIgZm9yIHRoaXMgdGFzayBpbnN0YW5jZSwgb3IgX19pdHRfbnVsbAorICogQHBhcmFtW2luXSBwYXJlbnRpZCBUaGUgcGFyZW50IG9mIHRoaXMgdGFzaywgb3IgX19pdHRfbnVsbAorICogQHBhcmFtW2luXSBmbiBUaGUgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24geW91IGFyZSB0cmFjaW5nCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Rhc2tfYmVnaW5fZm5fZXgoY29uc3QgX19pdHRfZG9tYWluKiBkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCB0YXNraWQsIF9faXR0X2lkIHBhcmVudGlkLCB2b2lkKiBmbik7CisKKy8qKgorICogQGluZ3JvdXAgY2xvY2tkb21haW4KKyAqIEBicmllZiBFbmQgdGhlIGN1cnJlbnQgdGFzayBpbnN0YW5jZS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgdGFzaworICogQHBhcmFtW2luXSBjbG9ja19kb21haW4gVGhlIGNsb2NrIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gdGltZXN0YW1wIFRoZSB1c2VyIGRlZmluZWQgdGltZXN0YW1wLgorICovCit2b2lkIElUVEFQSSBfX2l0dF90YXNrX2VuZF9leChjb25zdCBfX2l0dF9kb21haW4qIGRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXApOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2JlZ2luX2V4LCAgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW5fZm5fZXgsICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50aWQsIHZvaWQqIGZuKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfZW5kX2V4LCAgICAgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wKSkKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9leChkLHgseSx6LGEsYikgICAgICBJVFROT1RJRllfVk9JRF9ENSh0YXNrX2JlZ2luX2V4LGQseCx5LHosYSxiKQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2V4X3B0ciAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRhc2tfYmVnaW5fZXgpCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZm5fZXgoZCx4LHkseixhLGIpICAgSVRUTk9USUZZX1ZPSURfRDUodGFza19iZWdpbl9mbl9leCxkLHgseSx6LGEsYikKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9mbl9leF9wdHIgICAgICAgICAgICBJVFROT1RJRllfTkFNRSh0YXNrX2JlZ2luX2ZuX2V4KQorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9leChkLHgseSkgICAgICAgICAgICAgIElUVE5PVElGWV9WT0lEX0QyKHRhc2tfZW5kX2V4LGQseCx5KQorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9leF9wdHIgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRhc2tfZW5kX2V4KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9leChkb21haW4sY2xvY2tfZG9tYWluLHRpbWVzdGFtcCxpZCxwYXJlbnRpZCxuYW1lKQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2V4X3B0ciAgICAgICAgICAwCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZm5fZXgoZG9tYWluLGNsb2NrX2RvbWFpbix0aW1lc3RhbXAsaWQscGFyZW50aWQsZm4pCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZm5fZXhfcHRyICAgICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfZXgoZG9tYWluLGNsb2NrX2RvbWFpbix0aW1lc3RhbXApCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX2V4X3B0ciAgICAgICAgICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2V4X3B0ciAgICAgICAgICAwCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZm5fZXhfcHRyICAgICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfZXhfcHRyICAgICAgICAgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIG1hcmtlcnMKKyAqIEBicmllZiBDcmVhdGUgYSBtYXJrZXIgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIG1hcmtlcgorICogQHBhcmFtW2luXSBjbG9ja19kb21haW4gVGhlIGNsb2NrIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gdGltZXN0YW1wIFRoZSB1c2VyIGRlZmluZWQgdGltZXN0YW1wLgorICogQHBhcmFtW2luXSBpZCBUaGUgaW5zdGFuY2UgSUQgZm9yIHRoaXMgbWFya2VyLCBvciBfX2l0dF9udWxsCisgKiBAcGFyYW1baW5dIG5hbWUgVGhlIG5hbWUgZm9yIHRoaXMgbWFya2VyCisgKiBAcGFyYW1baW5dIHNjb3BlIFRoZSBzY29wZSBmb3IgdGhpcyBtYXJrZXIKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfbWFya2VyX2V4KGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCAgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lLCBfX2l0dF9zY29wZSBzY29wZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1hcmtlcl9leCwgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCAgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lLCBfX2l0dF9zY29wZSBzY29wZSkpCisjZGVmaW5lIF9faXR0X21hcmtlcl9leChkLHgseSx6LGEsYikgICAgSVRUTk9USUZZX1ZPSURfRDUobWFya2VyX2V4LGQseCx5LHosYSxiKQorI2RlZmluZSBfX2l0dF9tYXJrZXJfZXhfcHRyICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKG1hcmtlcl9leCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21hcmtlcl9leChkb21haW4sY2xvY2tfZG9tYWluLHRpbWVzdGFtcCxpZCxuYW1lLHNjb3BlKQorI2RlZmluZSBfX2l0dF9tYXJrZXJfZXhfcHRyICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tYXJrZXJfZXhfcHRyICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBjbG9ja2RvbWFpbgorICogQGJyaWVmIEFkZCBhIHJlbGF0aW9uIHRvIHRoZSBjdXJyZW50IHRhc2sgaW5zdGFuY2UuCisgKiBUaGUgY3VycmVudCB0YXNrIGluc3RhbmNlIGlzIHRoZSBoZWFkIG9mIHRoZSByZWxhdGlvbi4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhpcyBjYWxsCisgKiBAcGFyYW1baW5dIGNsb2NrX2RvbWFpbiBUaGUgY2xvY2sgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSB0aW1lc3RhbXAgVGhlIHVzZXIgZGVmaW5lZCB0aW1lc3RhbXAuCisgKiBAcGFyYW1baW5dIHJlbGF0aW9uIFRoZSBraW5kIG9mIHJlbGF0aW9uCisgKiBAcGFyYW1baW5dIHRhaWwgVGhlIElEIGZvciB0aGUgdGFpbCBvZiB0aGUgcmVsYXRpb24KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfcmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfZXgoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sICBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfcmVsYXRpb24gcmVsYXRpb24sIF9faXR0X2lkIHRhaWwpOworCisvKioKKyAqIEBpbmdyb3VwIGNsb2NrZG9tYWluCisgKiBAYnJpZWYgQWRkIGEgcmVsYXRpb24gYmV0d2VlbiB0d28gaW5zdGFuY2UgaWRlbnRpZmllcnMuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoaXMgY2FsbAorICogQHBhcmFtW2luXSBjbG9ja19kb21haW4gVGhlIGNsb2NrIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gdGltZXN0YW1wIFRoZSB1c2VyIGRlZmluZWQgdGltZXN0YW1wLgorICogQHBhcmFtW2luXSBoZWFkIFRoZSBJRCBmb3IgdGhlIGhlYWQgb2YgdGhlIHJlbGF0aW9uCisgKiBAcGFyYW1baW5dIHJlbGF0aW9uIFRoZSBraW5kIG9mIHJlbGF0aW9uCisgKiBAcGFyYW1baW5dIHRhaWwgVGhlIElEIGZvciB0aGUgdGFpbCBvZiB0aGUgcmVsYXRpb24KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfcmVsYXRpb25fYWRkX2V4KGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCAgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGhlYWQsIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfZXgsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlbGF0aW9uX2FkZF9leCwgICAgICAgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBoZWFkLCBfX2l0dF9yZWxhdGlvbiByZWxhdGlvbiwgX19pdHRfaWQgdGFpbCkpCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF90b19jdXJyZW50X2V4KGQseCx5LHosYSkgSVRUTk9USUZZX1ZPSURfRDQocmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfZXgsZCx4LHkseixhKQorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfdG9fY3VycmVudF9leF9wdHIgICAgICAgIElUVE5PVElGWV9OQU1FKHJlbGF0aW9uX2FkZF90b19jdXJyZW50X2V4KQorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfZXgoZCx4LHkseixhLGIpICAgICAgICAgIElUVE5PVElGWV9WT0lEX0Q1KHJlbGF0aW9uX2FkZF9leCxkLHgseSx6LGEsYikKKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkX2V4X3B0ciAgICAgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRShyZWxhdGlvbl9hZGRfZXgpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfdG9fY3VycmVudF9leChkb21haW4sY2xvY2tfZG9tYWluLHRpbWVzdGFtZSxyZWxhdGlvbix0YWlsKQorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfdG9fY3VycmVudF9leF9wdHIgMAorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfZXgoZG9tYWluLGNsb2NrX2RvbWFpbix0aW1lc3RhbXAsaGVhZCxyZWxhdGlvbix0YWlsKQorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfZXhfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfdG9fY3VycmVudF9leF9wdHIgMAorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfZXhfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCit0eXBlZGVmIGVudW0gX19faXR0X3RyYWNrX2dyb3VwX3R5cGUKK3sKKyAgICBfX2l0dF90cmFja19ncm91cF90eXBlX25vcm1hbCA9IDAKK30gX19pdHRfdHJhY2tfZ3JvdXBfdHlwZTsKKy8qKiBAZW5kY29uZCAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNwcmFnbWEgcGFjayhwdXNoLCA4KQorCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfdHJhY2tfZ3JvdXAKK3sKKyAgICBfX2l0dF9zdHJpbmdfaGFuZGxlKiBuYW1lOyAgICAgLyohPCBOYW1lIG9mIHRoZSB0cmFjayBncm91cCAqLworICAgIHN0cnVjdCBfX19pdHRfdHJhY2sqIHRyYWNrOyAgICAvKiE8IExpc3Qgb2YgY2hpbGQgdHJhY2tzICAgICovCisgICAgX19pdHRfdHJhY2tfZ3JvdXBfdHlwZSB0Z3R5cGU7IC8qITwgVHlwZSBvZiB0aGUgdHJhY2sgZ3JvdXAgKi8KKyAgICBpbnQgICBleHRyYTE7ICAgICAgICAgICAgICAgICAgLyohPCBSZXNlcnZlZC4gTXVzdCBiZSB6ZXJvICAqLworICAgIHZvaWQqIGV4dHJhMjsgICAgICAgICAgICAgICAgICAvKiE8IFJlc2VydmVkLiBNdXN0IGJlIHplcm8gICovCisgICAgc3RydWN0IF9fX2l0dF90cmFja19ncm91cCogbmV4dDsKK30gX19pdHRfdHJhY2tfZ3JvdXA7CisKKyNwcmFnbWEgcGFjayhwb3ApCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgUGxhY2Vob2xkZXIgZm9yIGN1c3RvbSB0cmFjayB0eXBlcy4gQ3VycmVudGx5LCAibm9ybWFsIiBjdXN0b20gdHJhY2sKKyAqIGlzIHRoZSBvbmx5IGF2YWlsYWJsZSB0cmFjayB0eXBlLgorICovCit0eXBlZGVmIGVudW0gX19faXR0X3RyYWNrX3R5cGUKK3sKKyAgICBfX2l0dF90cmFja190eXBlX25vcm1hbCA9IDAKKyNpZmRlZiBJTlRFTF9JVFROT1RJRllfQVBJX1BSSVZBVEUKKyAgICAsIF9faXR0X3RyYWNrX3R5cGVfcXVldWUKKyNlbmRpZiAvKiBJTlRFTF9JVFROT1RJRllfQVBJX1BSSVZBVEUgKi8KK30gX19pdHRfdHJhY2tfdHlwZTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjcHJhZ21hIHBhY2socHVzaCwgOCkKKwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X3RyYWNrCit7CisgICAgX19pdHRfc3RyaW5nX2hhbmRsZSogbmFtZTsgLyohPCBOYW1lIG9mIHRoZSB0cmFjayBncm91cCAqLworICAgIF9faXR0X3RyYWNrX2dyb3VwKiBncm91cDsgIC8qITwgUGFyZW50IGdyb3VwIHRvIGEgdHJhY2sgKi8KKyAgICBfX2l0dF90cmFja190eXBlIHR0eXBlOyAgICAvKiE8IFR5cGUgb2YgdGhlIHRyYWNrICAgICAgICovCisgICAgaW50ICAgZXh0cmExOyAgICAgICAgICAgICAgLyohPCBSZXNlcnZlZC4gTXVzdCBiZSB6ZXJvICAqLworICAgIHZvaWQqIGV4dHJhMjsgICAgICAgICAgICAgIC8qITwgUmVzZXJ2ZWQuIE11c3QgYmUgemVybyAgKi8KKyAgICBzdHJ1Y3QgX19faXR0X3RyYWNrKiBuZXh0OworfSBfX2l0dF90cmFjazsKKworI3ByYWdtYSBwYWNrKHBvcCkKKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBDcmVhdGUgbG9naWNhbCB0cmFjayBncm91cC4KKyAqLworX19pdHRfdHJhY2tfZ3JvdXAqIElUVEFQSSBfX2l0dF90cmFja19ncm91cF9jcmVhdGUoX19pdHRfc3RyaW5nX2hhbmRsZSogbmFtZSwgX19pdHRfdHJhY2tfZ3JvdXBfdHlwZSB0cmFja19ncm91cF90eXBlKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF90cmFja19ncm91cCosIHRyYWNrX2dyb3VwX2NyZWF0ZSwgKF9faXR0X3N0cmluZ19oYW5kbGUqIG5hbWUsIF9faXR0X3RyYWNrX2dyb3VwX3R5cGUgdHJhY2tfZ3JvdXBfdHlwZSkpCisjZGVmaW5lIF9faXR0X3RyYWNrX2dyb3VwX2NyZWF0ZSAgICAgSVRUTk9USUZZX0RBVEEodHJhY2tfZ3JvdXBfY3JlYXRlKQorI2RlZmluZSBfX2l0dF90cmFja19ncm91cF9jcmVhdGVfcHRyIElUVE5PVElGWV9OQU1FKHRyYWNrX2dyb3VwX2NyZWF0ZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3RyYWNrX2dyb3VwX2NyZWF0ZShuYW1lKSAgKF9faXR0X3RyYWNrX2dyb3VwKikwCisjZGVmaW5lIF9faXR0X3RyYWNrX2dyb3VwX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3RyYWNrX2dyb3VwX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBDcmVhdGUgbG9naWNhbCB0cmFjay4KKyAqLworX19pdHRfdHJhY2sqIElUVEFQSSBfX2l0dF90cmFja19jcmVhdGUoX19pdHRfdHJhY2tfZ3JvdXAqIHRyYWNrX2dyb3VwLCBfX2l0dF9zdHJpbmdfaGFuZGxlKiBuYW1lLCBfX2l0dF90cmFja190eXBlIHRyYWNrX3R5cGUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3RyYWNrKiwgdHJhY2tfY3JlYXRlLCAoX19pdHRfdHJhY2tfZ3JvdXAqIHRyYWNrX2dyb3VwLF9faXR0X3N0cmluZ19oYW5kbGUqIG5hbWUsIF9faXR0X3RyYWNrX3R5cGUgdHJhY2tfdHlwZSkpCisjZGVmaW5lIF9faXR0X3RyYWNrX2NyZWF0ZSAgICAgSVRUTk9USUZZX0RBVEEodHJhY2tfY3JlYXRlKQorI2RlZmluZSBfX2l0dF90cmFja19jcmVhdGVfcHRyIElUVE5PVElGWV9OQU1FKHRyYWNrX2NyZWF0ZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3RyYWNrX2NyZWF0ZSh0cmFja19ncm91cCxuYW1lLHRyYWNrX3R5cGUpICAoX19pdHRfdHJhY2sqKTAKKyNkZWZpbmUgX19pdHRfdHJhY2tfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfdHJhY2tfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFNldCB0aGUgbG9naWNhbCB0cmFjay4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc2V0X3RyYWNrKF9faXR0X3RyYWNrKiB0cmFjayk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHNldF90cmFjaywgKF9faXR0X3RyYWNrICp0cmFjaykpCisjZGVmaW5lIF9faXR0X3NldF90cmFjayAgICAgSVRUTk9USUZZX1ZPSUQoc2V0X3RyYWNrKQorI2RlZmluZSBfX2l0dF9zZXRfdHJhY2tfcHRyIElUVE5PVElGWV9OQU1FKHNldF90cmFjaykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3NldF90cmFjayh0cmFjaykKKyNkZWZpbmUgX19pdHRfc2V0X3RyYWNrX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc2V0X3RyYWNrX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2dwYV9kb2N1bWVudGF0aW9uICovCisvKioKKyAqIEBkZWZncm91cCBldmVudHMgRXZlbnRzCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIEV2ZW50cyBncm91cAorICogQHsKKyAqLworLyoqIEBicmllZiB1c2VyIGV2ZW50IHR5cGUgKi8KK3R5cGVkZWYgaW50IF9faXR0X2V2ZW50OworCisvKioKKyAqIEBicmllZiBDcmVhdGUgYW4gZXZlbnQgbm90aWZpY2F0aW9uCisgKiBAbm90ZSBuYW1lIG9yIG5hbWVsZW4gYmVpbmcgbnVsbC9uYW1lIGFuZCBuYW1lbGVuIG5vdCBtYXRjaGluZywgdXNlciBldmVudCBmZWF0dXJlIG5vdCBlbmFibGVkCisgKiBAcmV0dXJuIG5vbi16ZXJvIGV2ZW50IGlkZW50aWZpZXIgdXBvbiBzdWNjZXNzIGFuZCBfX2l0dF9lcnIgb3RoZXJ3aXNlCisgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK19faXR0X2V2ZW50IExJQklUVEFQSSBfX2l0dF9ldmVudF9jcmVhdGVBKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKTsKK19faXR0X2V2ZW50IExJQklUVEFQSSBfX2l0dF9ldmVudF9jcmVhdGVXKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGludCBuYW1lbGVuKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlICAgICBfX2l0dF9ldmVudF9jcmVhdGVXCisjICBkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlX3B0ciBfX2l0dF9ldmVudF9jcmVhdGVXX3B0cgorI2Vsc2UKKyMgIGRlZmluZSBfX2l0dF9ldmVudF9jcmVhdGUgICAgIF9faXR0X2V2ZW50X2NyZWF0ZUEKKyMgIGRlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVfcHRyIF9faXR0X2V2ZW50X2NyZWF0ZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworX19pdHRfZXZlbnQgTElCSVRUQVBJIF9faXR0X2V2ZW50X2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbik7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfZXZlbnQsIGV2ZW50X2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lLCBpbnQgbmFtZWxlbikpCitJVFRfU1RVQihMSUJJVFRBUEksIF9faXR0X2V2ZW50LCBldmVudF9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSwgaW50IG5hbWVsZW4pKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9ldmVudCwgZXZlbnRfY3JlYXRlLCAgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlQSAgICAgSVRUTk9USUZZX0RBVEEoZXZlbnRfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlQV9wdHIgSVRUTk9USUZZX05BTUUoZXZlbnRfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlVyAgICAgSVRUTk9USUZZX0RBVEEoZXZlbnRfY3JlYXRlVykKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlV19wdHIgSVRUTk9USUZZX05BTUUoZXZlbnRfY3JlYXRlVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGUgICAgICBJVFROT1RJRllfREFUQShldmVudF9jcmVhdGUpCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZV9wdHIgIElUVE5PVElGWV9OQU1FKGV2ZW50X2NyZWF0ZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZUEobmFtZSwgbmFtZWxlbikgKF9faXR0X2V2ZW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVXKG5hbWUsIG5hbWVsZW4pIChfX2l0dF9ldmVudCkwCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGUobmFtZSwgbmFtZWxlbikgIChfX2l0dF9ldmVudCkwCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFJlY29yZCBhbiBldmVudCBvY2N1cnJlbmNlLgorICogQHJldHVybiBfX2l0dF9lcnIgdXBvbiBmYWlsdXJlIChpbnZhbGlkIGV2ZW50IGlkL3VzZXIgZXZlbnQgZmVhdHVyZSBub3QgZW5hYmxlZCkKKyAqLworaW50IExJQklUVEFQSSBfX2l0dF9ldmVudF9zdGFydChfX2l0dF9ldmVudCBldmVudCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCBldmVudF9zdGFydCwgKF9faXR0X2V2ZW50IGV2ZW50KSkKKyNkZWZpbmUgX19pdHRfZXZlbnRfc3RhcnQgICAgIElUVE5PVElGWV9EQVRBKGV2ZW50X3N0YXJ0KQorI2RlZmluZSBfX2l0dF9ldmVudF9zdGFydF9wdHIgSVRUTk9USUZZX05BTUUoZXZlbnRfc3RhcnQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9ldmVudF9zdGFydChldmVudCkgKGludCkwCisjZGVmaW5lIF9faXR0X2V2ZW50X3N0YXJ0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfZXZlbnRfc3RhcnRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgUmVjb3JkIGFuIGV2ZW50IGVuZCBvY2N1cnJlbmNlLgorICogQG5vdGUgSXQgaXMgb3B0aW9uYWwgaWYgZXZlbnRzIGRvIG5vdCBoYXZlIGR1cmF0aW9ucy4KKyAqIEByZXR1cm4gX19pdHRfZXJyIHVwb24gZmFpbHVyZSAoaW52YWxpZCBldmVudCBpZC91c2VyIGV2ZW50IGZlYXR1cmUgbm90IGVuYWJsZWQpCisgKi8KK2ludCBMSUJJVFRBUEkgX19pdHRfZXZlbnRfZW5kKF9faXR0X2V2ZW50IGV2ZW50KTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIGV2ZW50X2VuZCwgKF9faXR0X2V2ZW50IGV2ZW50KSkKKyNkZWZpbmUgX19pdHRfZXZlbnRfZW5kICAgICBJVFROT1RJRllfREFUQShldmVudF9lbmQpCisjZGVmaW5lIF9faXR0X2V2ZW50X2VuZF9wdHIgSVRUTk9USUZZX05BTUUoZXZlbnRfZW5kKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfZXZlbnRfZW5kKGV2ZW50KSAoaW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfZW5kX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfZXZlbnRfZW5kX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gZXZlbnRzIGdyb3VwICovCisKKworLyoqCisgKiBAZGVmZ3JvdXAgYXJyYXlzIEFycmF5cyBWaXN1YWxpemVyCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIFZpc3VhbGl6ZSBhcnJheXMKKyAqIEB7CisgKi8KKworLyoqCisgKiBAZW51bSBfX2l0dF9hdl9kYXRhX3R5cGUKKyAqIEBicmllZiBEZWZpbmVzIHR5cGVzIG9mIGFycmF5cyBkYXRhIChmb3IgQy9DKysgaW50cmluc2ljIHR5cGVzKQorICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBfX2l0dF9lX2ZpcnN0ID0gMCwKKyAgICBfX2l0dF9lX2NoYXIgPSAwLCAgLyogMS1ieXRlIGludGVnZXIgKi8KKyAgICBfX2l0dF9lX3VjaGFyLCAgICAgLyogMS1ieXRlIHVuc2lnbmVkIGludGVnZXIgKi8KKyAgICBfX2l0dF9lX2ludDE2LCAgICAgLyogMi1ieXRlIGludGVnZXIgKi8KKyAgICBfX2l0dF9lX3VpbnQxNiwgICAgLyogMi1ieXRlIHVuc2lnbmVkIGludGVnZXIgICovCisgICAgX19pdHRfZV9pbnQzMiwgICAgIC8qIDQtYnl0ZSBpbnRlZ2VyICovCisgICAgX19pdHRfZV91aW50MzIsICAgIC8qIDQtYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyICovCisgICAgX19pdHRfZV9pbnQ2NCwgICAgIC8qIDgtYnl0ZSBpbnRlZ2VyICovCisgICAgX19pdHRfZV91aW50NjQsICAgIC8qIDgtYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyICovCisgICAgX19pdHRfZV9mbG9hdCwgICAgIC8qIDQtYnl0ZSBmbG9hdGluZyAqLworICAgIF9faXR0X2VfZG91YmxlLCAgICAvKiA4LWJ5dGUgZmxvYXRpbmcgKi8KKyAgICBfX2l0dF9lX2xhc3QgPSBfX2l0dF9lX2RvdWJsZQorfSBfX2l0dF9hdl9kYXRhX3R5cGU7CisKKy8qKgorICogQGJyaWVmIFNhdmUgYW4gYXJyYXkgZGF0YSB0byBhIGZpbGUuCisgKiBPdXRwdXQgZm9ybWF0IGlzIGRlZmluZWQgYnkgdGhlIGZpbGUgZXh0ZW5zaW9uLiBUaGUgY3N2IGFuZCBibXAgZm9ybWF0cyBhcmUgc3VwcG9ydGVkIChibXAgLSBmb3IgMi1kaW1lbnNpb25hbCBhcnJheSBvbmx5KS4KKyAqIEBwYXJhbVtpbl0gZGF0YSAtIHBvaW50ZXIgdG8gdGhlIGFycmF5IGRhdGEKKyAqIEBwYXJhbVtpbl0gcmFuayAtIHRoZSByYW5rIG9mIHRoZSBhcnJheQorICogQHBhcmFtW2luXSBkaW1lbnNpb25zIC0gcG9pbnRlciB0byBhbiBhcnJheSBvZiBpbnRlZ2Vycywgd2hpY2ggc3BlY2lmaWVzIHRoZSBhcnJheSBkaW1lbnNpb25zLgorICogVGhlIHNpemUgb2YgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIHRvIHRoZSByYW5rCisgKiBAcGFyYW1baW5dIHR5cGUgLSB0aGUgdHlwZSBvZiB0aGUgYXJyYXksIHNwZWNpZmllZCBhcyBvbmUgb2YgdGhlIF9faXR0X2F2X2RhdGFfdHlwZSB2YWx1ZXMgKGZvciBpbnRyaW5zaWMgdHlwZXMpCisgKiBAcGFyYW1baW5dIGZpbGVQYXRoIC0gdGhlIGZpbGUgcGF0aDsgdGhlIG91dHB1dCBmb3JtYXQgaXMgZGVmaW5lZCBieSB0aGUgZmlsZSBleHRlbnNpb24KKyAqIEBwYXJhbVtpbl0gY29sdW1uT3JkZXIgLSBkZWZpbmVzIGhvdyB0aGUgYXJyYXkgaXMgc3RvcmVkIGluIHRoZSBsaW5lYXIgbWVtb3J5LgorICogSXQgc2hvdWxkIGJlIDEgZm9yIGNvbHVtbi1tYWpvciBvcmRlciAoZS5nLiBpbiBGT1JUUkFOKSBvciAwIC0gZm9yIHJvdy1tYWpvciBvcmRlciAoZS5nLiBpbiBDKS4KKyAqLworCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitpbnQgSVRUQVBJIF9faXR0X2F2X3NhdmVBKHZvaWQgKmRhdGEsIGludCByYW5rLCBjb25zdCBpbnQgKmRpbWVuc2lvbnMsIGludCB0eXBlLCBjb25zdCBjaGFyICpmaWxlUGF0aCwgaW50IGNvbHVtbk9yZGVyKTsKK2ludCBJVFRBUEkgX19pdHRfYXZfc2F2ZVcodm9pZCAqZGF0YSwgaW50IHJhbmssIGNvbnN0IGludCAqZGltZW5zaW9ucywgaW50IHR5cGUsIGNvbnN0IHdjaGFyX3QgKmZpbGVQYXRoLCBpbnQgY29sdW1uT3JkZXIpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9hdl9zYXZlICAgICBfX2l0dF9hdl9zYXZlVworIyAgZGVmaW5lIF9faXR0X2F2X3NhdmVfcHRyIF9faXR0X2F2X3NhdmVXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X2F2X3NhdmUgICAgIF9faXR0X2F2X3NhdmVBCisjICBkZWZpbmUgX19pdHRfYXZfc2F2ZV9wdHIgX19pdHRfYXZfc2F2ZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworaW50IElUVEFQSSBfX2l0dF9hdl9zYXZlKHZvaWQgKmRhdGEsIGludCByYW5rLCBjb25zdCBpbnQgKmRpbWVuc2lvbnMsIGludCB0eXBlLCBjb25zdCBjaGFyICpmaWxlUGF0aCwgaW50IGNvbHVtbk9yZGVyKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBpbnQsIGF2X3NhdmVBLCAodm9pZCAqZGF0YSwgaW50IHJhbmssIGNvbnN0IGludCAqZGltZW5zaW9ucywgaW50IHR5cGUsIGNvbnN0IGNoYXIgKmZpbGVQYXRoLCBpbnQgY29sdW1uT3JkZXIpKQorSVRUX1NUVUIoSVRUQVBJLCBpbnQsIGF2X3NhdmVXLCAodm9pZCAqZGF0YSwgaW50IHJhbmssIGNvbnN0IGludCAqZGltZW5zaW9ucywgaW50IHR5cGUsIGNvbnN0IHdjaGFyX3QgKmZpbGVQYXRoLCBpbnQgY29sdW1uT3JkZXIpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBpbnQsIGF2X3NhdmUsICAodm9pZCAqZGF0YSwgaW50IHJhbmssIGNvbnN0IGludCAqZGltZW5zaW9ucywgaW50IHR5cGUsIGNvbnN0IGNoYXIgKmZpbGVQYXRoLCBpbnQgY29sdW1uT3JkZXIpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9hdl9zYXZlQSAgICAgSVRUTk9USUZZX0RBVEEoYXZfc2F2ZUEpCisjZGVmaW5lIF9faXR0X2F2X3NhdmVBX3B0ciBJVFROT1RJRllfTkFNRShhdl9zYXZlQSkKKyNkZWZpbmUgX19pdHRfYXZfc2F2ZVcgICAgIElUVE5PVElGWV9EQVRBKGF2X3NhdmVXKQorI2RlZmluZSBfX2l0dF9hdl9zYXZlV19wdHIgSVRUTk9USUZZX05BTUUoYXZfc2F2ZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfYXZfc2F2ZSAgICAgSVRUTk9USUZZX0RBVEEoYXZfc2F2ZSkKKyNkZWZpbmUgX19pdHRfYXZfc2F2ZV9wdHIgSVRUTk9USUZZX05BTUUoYXZfc2F2ZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2F2X3NhdmVBKG5hbWUpCisjZGVmaW5lIF9faXR0X2F2X3NhdmVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2F2X3NhdmVXKG5hbWUpCisjZGVmaW5lIF9faXR0X2F2X3NhdmVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfYXZfc2F2ZShuYW1lKQorI2RlZmluZSBfX2l0dF9hdl9zYXZlX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfYXZfc2F2ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfYXZfc2F2ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9hdl9zYXZlX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKK3ZvaWQgSVRUQVBJIF9faXR0X2VuYWJsZV9hdHRhY2godm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGVuYWJsZV9hdHRhY2gsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfZW5hYmxlX2F0dGFjaCAgICAgSVRUTk9USUZZX1ZPSUQoZW5hYmxlX2F0dGFjaCkKKyNkZWZpbmUgX19pdHRfZW5hYmxlX2F0dGFjaF9wdHIgSVRUTk9USUZZX05BTUUoZW5hYmxlX2F0dGFjaCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2VuYWJsZV9hdHRhY2goKQorI2RlZmluZSBfX2l0dF9lbmFibGVfYXR0YWNoX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfZW5hYmxlX2F0dGFjaF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2dwYV9kb2N1bWVudGF0aW9uICovCisKKy8qKiBAfSBhcnJheXMgZ3JvdXAgKi8KKworLyoqIEBlbmRjb25kICovCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9JVFROT1RJRllfSF8gKi8KKworI2lmZGVmIElOVEVMX0lUVE5PVElGWV9BUElfUFJJVkFURQorCisjaWZuZGVmIF9JVFROT1RJRllfUFJJVkFURV8KKyNkZWZpbmUgX0lUVE5PVElGWV9QUklWQVRFXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qKgorICogQGluZ3JvdXAgdGFza3MKKyAqIEBicmllZiBCZWdpbiBhbiBvdmVybGFwcGVkIHRhc2sgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIHRhc2suCisgKiBAcGFyYW1baW5dIHRhc2tpZCBUaGUgaWRlbnRpZmllciBmb3IgdGhpcyB0YXNrIGluc3RhbmNlLCAqY2Fubm90KiBiZSBfX2l0dF9udWxsLgorICogQHBhcmFtW2luXSBwYXJlbnRpZCBUaGUgcGFyZW50IG9mIHRoaXMgdGFzaywgb3IgX19pdHRfbnVsbC4KKyAqIEBwYXJhbVtpbl0gbmFtZSBUaGUgbmFtZSBvZiB0aGlzIHRhc2suCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Rhc2tfYmVnaW5fb3ZlcmxhcHBlZChjb25zdCBfX2l0dF9kb21haW4qIGRvbWFpbiwgX19pdHRfaWQgdGFza2lkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSogbmFtZSk7CisKKy8qKgorICogQGluZ3JvdXAgY2xvY2tkb21haW4KKyAqIEBicmllZiBCZWdpbiBhbiBvdmVybGFwcGVkIHRhc2sgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIHRhc2sKKyAqIEBwYXJhbVtpbl0gY2xvY2tfZG9tYWluIFRoZSBjbG9jayBkb21haW4gY29udHJvbGxpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNhbGwuCisgKiBAcGFyYW1baW5dIHRpbWVzdGFtcCBUaGUgdXNlciBkZWZpbmVkIHRpbWVzdGFtcC4KKyAqIEBwYXJhbVtpbl0gdGFza2lkIFRoZSBpZGVudGlmaWVyIGZvciB0aGlzIHRhc2sgaW5zdGFuY2UsICpjYW5ub3QqIGJlIF9faXR0X251bGwuCisgKiBAcGFyYW1baW5dIHBhcmVudGlkIFRoZSBwYXJlbnQgb2YgdGhpcyB0YXNrLCBvciBfX2l0dF9udWxsLgorICogQHBhcmFtW2luXSBuYW1lIFRoZSBuYW1lIG9mIHRoaXMgdGFzay4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkX2V4KGNvbnN0IF9faXR0X2RvbWFpbiogZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgdGFza2lkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSogbmFtZSk7CisKKy8qKgorICogQGluZ3JvdXAgdGFza3MKKyAqIEBicmllZiBFbmQgYW4gb3ZlcmxhcHBlZCB0YXNrIGluc3RhbmNlLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyB0YXNrCisgKiBAcGFyYW1baW5dIHRhc2tpZCBFeHBsaWNpdCBJRCBvZiBmaW5pc2hlZCB0YXNrCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWQoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIHRhc2tpZCk7CisKKy8qKgorICogQGluZ3JvdXAgY2xvY2tkb21haW4KKyAqIEBicmllZiBFbmQgYW4gb3ZlcmxhcHBlZCB0YXNrIGluc3RhbmNlLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyB0YXNrCisgKiBAcGFyYW1baW5dIGNsb2NrX2RvbWFpbiBUaGUgY2xvY2sgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSB0aW1lc3RhbXAgVGhlIHVzZXIgZGVmaW5lZCB0aW1lc3RhbXAuCisgKiBAcGFyYW1baW5dIHRhc2tpZCBFeHBsaWNpdCBJRCBvZiBmaW5pc2hlZCB0YXNrCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWRfZXgoY29uc3QgX19pdHRfZG9tYWluKiBkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCB0YXNraWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2JlZ2luX292ZXJsYXBwZWQsICAgICAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgdGFza2lkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2JlZ2luX292ZXJsYXBwZWRfZXgsICAgICAgIChjb25zdCBfX2l0dF9kb21haW4qIGRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIHRhc2tpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUqIG5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19lbmRfb3ZlcmxhcHBlZCwgICAgICAgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIHRhc2tpZCkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2VuZF9vdmVybGFwcGVkX2V4LCAgICAgICAgIChjb25zdCBfX2l0dF9kb21haW4qIGRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIHRhc2tpZCkpCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fb3ZlcmxhcHBlZChkLHgseSx6KSAgICAgICAgICAgIElUVE5PVElGWV9WT0lEX0QzKHRhc2tfYmVnaW5fb3ZlcmxhcHBlZCxkLHgseSx6KQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX292ZXJsYXBwZWRfcHRyICAgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRSh0YXNrX2JlZ2luX292ZXJsYXBwZWQpCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fb3ZlcmxhcHBlZF9leChkLHgseSx6LGEsYikgICAgIElUVE5PVElGWV9WT0lEX0Q1KHRhc2tfYmVnaW5fb3ZlcmxhcHBlZF9leCxkLHgseSx6LGEsYikKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkX2V4X3B0ciAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGFza19iZWdpbl9vdmVybGFwcGVkX2V4KQorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9vdmVybGFwcGVkKGQseCkgICAgICAgICAgICAgICAgICBJVFROT1RJRllfVk9JRF9EMSh0YXNrX2VuZF9vdmVybGFwcGVkLGQseCkKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfb3ZlcmxhcHBlZF9wdHIgICAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGFza19lbmRfb3ZlcmxhcHBlZCkKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfb3ZlcmxhcHBlZF9leChkLHgseSx6KSAgICAgICAgICAgSVRUTk9USUZZX1ZPSURfRDModGFza19lbmRfb3ZlcmxhcHBlZF9leCxkLHgseSx6KQorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9vdmVybGFwcGVkX2V4X3B0ciAgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRSh0YXNrX2VuZF9vdmVybGFwcGVkX2V4KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkKGRvbWFpbix0YXNraWQscGFyZW50aWQsbmFtZSkKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkX3B0ciAgICAgICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkX2V4KGRvbWFpbixjbG9ja19kb21haW4sdGltZXN0YW1wLHRhc2tpZCxwYXJlbnRpZCxuYW1lKQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX292ZXJsYXBwZWRfZXhfcHRyICAgICAgMAorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9vdmVybGFwcGVkKGRvbWFpbix0YXNraWQpCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWRfcHRyICAgICAgICAgICAwCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWRfZXgoZG9tYWluLGNsb2NrX2RvbWFpbix0aW1lc3RhbXAsdGFza2lkKQorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9vdmVybGFwcGVkX2V4X3B0ciAgICAgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fb3ZlcmxhcHBlZF9wdHIgICAgICAgICAwCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fb3ZlcmxhcHBlZF9leF9wdHIgICAgICAwCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWRfcHRyICAgICAgICAgICAwCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWRfZXhfcHRyICAgICAgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlZmdyb3VwIG1ha3JzX2ludGVybmFsIE1hcmtzCisgKiBAaW5ncm91cCBpbnRlcm5hbAorICogTWFya3MgZ3JvdXAKKyAqIEB3YXJuaW5nIEludGVybmFsIEFQSToKKyAqICAgLSBJdCBpcyBub3Qgc2hpcHBlZCB0byBvdXRzaWRlIG9mIEludGVsCisgKiAgIC0gSXQgaXMgZGVsaXZlcmVkIHRvIGludGVybmFsIEludGVsIHRlYW1zIHVzaW5nIGUtbWFpbCBvciBTVk4gYWNjZXNzIG9ubHkKKyAqIEB7CisgKi8KKy8qKiBAYnJpZWYgdXNlciBtYXJrIHR5cGUgKi8KK3R5cGVkZWYgaW50IF9faXR0X21hcmtfdHlwZTsKKworLyoqCisgKiBAYnJpZWYgQ3JlYXRlcyBhIHVzZXIgbWFyayB0eXBlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHVzaW5nIGNoYXIgb3IgVW5pY29kZSBzdHJpbmcuCisgKiBAcGFyYW1baW5dIG5hbWUgLSBuYW1lIG9mIG1hcmsgdG8gY3JlYXRlCisgKiBAcmV0dXJuIFJldHVybnMgYSBoYW5kbGUgdG8gdGhlIG1hcmsgdHlwZQorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitfX2l0dF9tYXJrX3R5cGUgSVRUQVBJIF9faXR0X21hcmtfY3JlYXRlQShjb25zdCBjaGFyICAgICpuYW1lKTsKK19faXR0X21hcmtfdHlwZSBJVFRBUEkgX19pdHRfbWFya19jcmVhdGVXKGNvbnN0IHdjaGFyX3QgKm5hbWUpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZSAgICAgX19pdHRfbWFya19jcmVhdGVXCisjICBkZWZpbmUgX19pdHRfbWFya19jcmVhdGVfcHRyIF9faXR0X21hcmtfY3JlYXRlV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZSAgICAgX19pdHRfbWFya19jcmVhdGVBCisjICBkZWZpbmUgX19pdHRfbWFya19jcmVhdGVfcHRyIF9faXR0X21hcmtfY3JlYXRlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK19faXR0X21hcmtfdHlwZSBJVFRBUEkgX19pdHRfbWFya19jcmVhdGUoY29uc3QgY2hhciAqbmFtZSk7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfbWFya190eXBlLCBtYXJrX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lKSkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfbWFya190eXBlLCBtYXJrX2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpuYW1lKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfbWFya190eXBlLCBtYXJrX2NyZWF0ZSwgIChjb25zdCBjaGFyICpuYW1lKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVBICAgICBJVFROT1RJRllfREFUQShtYXJrX2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlQV9wdHIgSVRUTk9USUZZX05BTUUobWFya19jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZVcgICAgIElUVE5PVElGWV9EQVRBKG1hcmtfY3JlYXRlVykKKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVXX3B0ciBJVFROT1RJRllfTkFNRShtYXJrX2NyZWF0ZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGUgICAgICBJVFROT1RJRllfREFUQShtYXJrX2NyZWF0ZSkKKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVfcHRyICBJVFROT1RJRllfTkFNRShtYXJrX2NyZWF0ZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlQShuYW1lKSAoX19pdHRfbWFya190eXBlKTAKKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlVyhuYW1lKSAoX19pdHRfbWFya190eXBlKTAKKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGUobmFtZSkgIChfX2l0dF9tYXJrX3R5cGUpMAorI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIENyZWF0ZXMgYSAiZGlzY3JldGUiIHVzZXIgbWFyayB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBhbmQgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHVzaW5nIGNoYXIgb3IgVW5pY29kZSBzdHJpbmcuCisgKgorICogLSBUaGUgbWFyayBvZiAiZGlzY3JldGUiIHR5cGUgaXMgcGxhY2VkIHRvIGNvbGxlY3Rpb24gcmVzdWx0cyBpbiBjYXNlIG9mIHN1Y2Nlc3MuIEl0IGFwcGVhcnMgaW4gb3ZlcnRpbWUgdmlldyhzKSBhcyBhIHNwZWNpYWwgdGljayBzaWduLgorICogLSBUaGUgY2FsbCBpcyAic3luY2hyb25vdXMiIC0gZnVuY3Rpb24gcmV0dXJucyBhZnRlciBtYXJrIGlzIGFjdHVhbGx5IGFkZGVkIHRvIHJlc3VsdHMuCisgKiAtIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsLCBmb3IgZXhhbXBsZSwgdG8gbWFyayBkaWZmZXJlbnQgcGhhc2VzIG9mIGFwcGxpY2F0aW9uCisgKiAgIChiZWdpbm5pbmcgb2YgdGhlIG5leHQgbWFyayBhdXRvbWF0aWNhbGx5IG1lYW5kIGVuZCBvZiBjdXJyZW50IHJlZ2lvbikuCisgKiAtIENhbiBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggImNvbnRpbnVvdXMiIG1hcmtzIChzZWUgYmVsb3cpIGF0IHRoZSBzYW1lIGNvbGxlY3Rpb24gc2Vzc2lvbgorICogQHBhcmFtW2luXSBtdCAtIG1hcmssIGNyZWF0ZWQgYnkgX19pdHRfbWFya19jcmVhdGUoY29uc3QgY2hhciogbmFtZSkgZnVuY3Rpb24KKyAqIEBwYXJhbVtpbl0gcGFyYW1ldGVyIC0gc3RyaW5nIHBhcmFtZXRlciBvZiBtYXJrCisgKiBAcmV0dXJuIFJldHVybnMgemVybyB2YWx1ZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIG5vbi16ZXJvIHZhbHVlIG90aGVyd2lzZS4KKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgoraW50IElUVEFQSSBfX2l0dF9tYXJrQShfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IGNoYXIgICAgKnBhcmFtZXRlcik7CitpbnQgSVRUQVBJIF9faXR0X21hcmtXKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3Qgd2NoYXJfdCAqcGFyYW1ldGVyKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfbWFyayAgICAgX19pdHRfbWFya1cKKyMgIGRlZmluZSBfX2l0dF9tYXJrX3B0ciBfX2l0dF9tYXJrV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgICovCisjICBkZWZpbmUgX19pdHRfbWFyayAgICAgX19pdHRfbWFya0EKKyMgIGRlZmluZSBfX2l0dF9tYXJrX3B0ciBfX2l0dF9tYXJrQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK2ludCBJVFRBUEkgX19pdHRfbWFyayhfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IGNoYXIgKnBhcmFtZXRlcik7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgaW50LCBtYXJrQSwgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciAgICAqcGFyYW1ldGVyKSkKK0lUVF9TVFVCKElUVEFQSSwgaW50LCBtYXJrVywgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3Qgd2NoYXJfdCAqcGFyYW1ldGVyKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgaW50LCBtYXJrLCAgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciAqcGFyYW1ldGVyKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWFya0EgICAgIElUVE5PVElGWV9EQVRBKG1hcmtBKQorI2RlZmluZSBfX2l0dF9tYXJrQV9wdHIgSVRUTk9USUZZX05BTUUobWFya0EpCisjZGVmaW5lIF9faXR0X21hcmtXICAgICBJVFROT1RJRllfREFUQShtYXJrVykKKyNkZWZpbmUgX19pdHRfbWFya1dfcHRyIElUVE5PVElGWV9OQU1FKG1hcmtXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21hcmsgICAgICBJVFROT1RJRllfREFUQShtYXJrKQorI2RlZmluZSBfX2l0dF9tYXJrX3B0ciAgSVRUTk9USUZZX05BTUUobWFyaykKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21hcmtBKG10LCBwYXJhbWV0ZXIpIChpbnQpMAorI2RlZmluZSBfX2l0dF9tYXJrQV9wdHIgMAorI2RlZmluZSBfX2l0dF9tYXJrVyhtdCwgcGFyYW1ldGVyKSAoaW50KTAKKyNkZWZpbmUgX19pdHRfbWFya1dfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tYXJrKG10LCBwYXJhbWV0ZXIpICAoaW50KTAKKyNkZWZpbmUgX19pdHRfbWFya19wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tYXJrQV9wdHIgMAorI2RlZmluZSBfX2l0dF9tYXJrV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21hcmtfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFVzZSB0aGlzIGlmIG5lY2Vzc2FyeSB0byBjcmVhdGUgYSAiZGlzY3JldGUiIHVzZXIgZXZlbnQgdHlwZSAobWFyaykgZm9yIHByb2Nlc3MKKyAqIHJhdGhlciB0aGVuIGZvciBvbmUgdGhyZWFkCisgKiBAc2VlIGludCBfX2l0dF9tYXJrKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciogcGFyYW1ldGVyKTsKKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgoraW50IElUVEFQSSBfX2l0dF9tYXJrX2dsb2JhbEEoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICAgICpwYXJhbWV0ZXIpOworaW50IElUVEFQSSBfX2l0dF9tYXJrX2dsb2JhbFcoX19pdHRfbWFya190eXBlIG10LCBjb25zdCB3Y2hhcl90ICpwYXJhbWV0ZXIpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9tYXJrX2dsb2JhbCAgICAgX19pdHRfbWFya19nbG9iYWxXCisjICBkZWZpbmUgX19pdHRfbWFya19nbG9iYWxfcHRyIF9faXR0X21hcmtfZ2xvYmFsV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgICovCisjICBkZWZpbmUgX19pdHRfbWFya19nbG9iYWwgICAgIF9faXR0X21hcmtfZ2xvYmFsQQorIyAgZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsX3B0ciBfX2l0dF9tYXJrX2dsb2JhbEFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitpbnQgSVRUQVBJIF9faXR0X21hcmtfZ2xvYmFsKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciAqcGFyYW1ldGVyKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBpbnQsIG1hcmtfZ2xvYmFsQSwgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciAgICAqcGFyYW1ldGVyKSkKK0lUVF9TVFVCKElUVEFQSSwgaW50LCBtYXJrX2dsb2JhbFcsIChfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IHdjaGFyX3QgKnBhcmFtZXRlcikpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIGludCwgbWFya19nbG9iYWwsICAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICpwYXJhbWV0ZXIpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbEEgICAgIElUVE5PVElGWV9EQVRBKG1hcmtfZ2xvYmFsQSkKKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxBX3B0ciBJVFROT1RJRllfTkFNRShtYXJrX2dsb2JhbEEpCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsVyAgICAgSVRUTk9USUZZX0RBVEEobWFya19nbG9iYWxXKQorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbFdfcHRyIElUVE5PVElGWV9OQU1FKG1hcmtfZ2xvYmFsVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbCAgICAgIElUVE5PVElGWV9EQVRBKG1hcmtfZ2xvYmFsKQorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbF9wdHIgIElUVE5PVElGWV9OQU1FKG1hcmtfZ2xvYmFsKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxBKG10LCBwYXJhbWV0ZXIpIChpbnQpMAorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbEFfcHRyIDAKKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxXKG10LCBwYXJhbWV0ZXIpIChpbnQpMAorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbFdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbChtdCwgcGFyYW1ldGVyKSAgKGludCkwCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsQV9wdHIgMAorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbFdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbF9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgQ3JlYXRlcyBhbiAiZW5kIiBwb2ludCBmb3IgImNvbnRpbnVvdXMiIG1hcmsgd2l0aCBzcGVjaWZpZWQgbmFtZS4KKyAqCisgKiAtIFJldHVybnMgemVybyB2YWx1ZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIG5vbi16ZXJvIHZhbHVlIG90aGVyd2lzZS4KKyAqICAgQWxzbyByZXR1cm5zIG5vbi16ZXJvIHZhbHVlIHdoZW4gcHJlY2VkaW5nICJiZWdpbiIgcG9pbnQgZm9yIHRoZQorICogICBtYXJrIHdpdGggdGhlIHNhbWUgbmFtZSBmYWlsZWQgdG8gYmUgY3JlYXRlZCBvciBub3QgY3JlYXRlZC4KKyAqIC0gVGhlIG1hcmsgb2YgImNvbnRpbnVvdXMiIHR5cGUgaXMgcGxhY2VkIHRvIGNvbGxlY3Rpb24gcmVzdWx0cyBpbgorICogICBjYXNlIG9mIHN1Y2Nlc3MuIEl0IGFwcGVhcnMgaW4gb3ZlcnRpbWUgdmlldyhzKSBhcyBhIHNwZWNpYWwgdGljaworICogICBzaWduIChkaWZmZXJlbnQgZnJvbSAiZGlzY3JldGUiIG1hcmspIHRvZ2V0aGVyIHdpdGggbGluZSBmcm9tCisgKiAgIGNvcnJlc3BvbmRpbmcgImJlZ2luIiBtYXJrIHRvICJlbmQiIG1hcmsuCisgKiBAbm90ZSBDb250aW51b3VzIG1hcmtzIGNhbiBvdmVybGFwIGFuZCBiZSBuZXN0ZWQgaW5zaWRlIGVhY2ggb3RoZXIuCisgKiBEaXNjcmV0ZSBtYXJrIGNhbiBiZSBuZXN0ZWQgaW5zaWRlIG1hcmtlZCByZWdpb24KKyAqIEBwYXJhbVtpbl0gbXQgLSBtYXJrLCBjcmVhdGVkIGJ5IF9faXR0X21hcmtfY3JlYXRlKGNvbnN0IGNoYXIqIG5hbWUpIGZ1bmN0aW9uCisgKiBAcmV0dXJuIFJldHVybnMgemVybyB2YWx1ZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIG5vbi16ZXJvIHZhbHVlIG90aGVyd2lzZS4KKyAqLworaW50IElUVEFQSSBfX2l0dF9tYXJrX29mZihfX2l0dF9tYXJrX3R5cGUgbXQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihJVFRBUEksIGludCwgbWFya19vZmYsIChfX2l0dF9tYXJrX3R5cGUgbXQpKQorI2RlZmluZSBfX2l0dF9tYXJrX29mZiAgICAgSVRUTk9USUZZX0RBVEEobWFya19vZmYpCisjZGVmaW5lIF9faXR0X21hcmtfb2ZmX3B0ciBJVFROT1RJRllfTkFNRShtYXJrX29mZikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21hcmtfb2ZmKG10KSAoaW50KTAKKyNkZWZpbmUgX19pdHRfbWFya19vZmZfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tYXJrX29mZl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBVc2UgdGhpcyBpZiBuZWNlc3NhcnkgdG8gY3JlYXRlIGFuICJlbmQiIHBvaW50IGZvciBtYXJrIG9mIHByb2Nlc3MKKyAqIEBzZWUgaW50IF9faXR0X21hcmtfb2ZmKF9faXR0X21hcmtfdHlwZSBtdCk7CisgKi8KK2ludCBJVFRBUEkgX19pdHRfbWFya19nbG9iYWxfb2ZmKF9faXR0X21hcmtfdHlwZSBtdCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKElUVEFQSSwgaW50LCBtYXJrX2dsb2JhbF9vZmYsIChfX2l0dF9tYXJrX3R5cGUgbXQpKQorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbF9vZmYgICAgIElUVE5PVElGWV9EQVRBKG1hcmtfZ2xvYmFsX29mZikKKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxfb2ZmX3B0ciBJVFROT1RJRllfTkFNRShtYXJrX2dsb2JhbF9vZmYpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbF9vZmYobXQpIChpbnQpMAorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbF9vZmZfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbF9vZmZfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBtYXJrcyBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBjb3VudGVyc19pbnRlcm5hbCBDb3VudGVycworICogQGluZ3JvdXAgaW50ZXJuYWwKKyAqIENvdW50ZXJzIGdyb3VwCisgKiBAeworICovCisvKioKKyAqIEBicmllZiBvcGFxdWUgc3RydWN0dXJlIGZvciBjb3VudGVyIGlkZW50aWZpY2F0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9jb3VudGVyICpfX2l0dF9jb3VudGVyOworCisvKioKKyAqIEBicmllZiBDcmVhdGUgYSBjb3VudGVyIHdpdGggZ2l2ZW4gbmFtZS9kb21haW4gZm9yIHRoZSBjYWxsaW5nIHRocmVhZAorICoKKyAqIEFmdGVyIF9faXR0X2NvdW50ZXJfY3JlYXRlKCkgaXMgY2FsbGVkLCBfX2l0dF9jb3VudGVyX2luYygpIC8gX19pdHRfY291bnRlcl9pbmNfZGVsdGEoKSBjYW4gYmUgdXNlZAorICogdG8gaW5jcmVtZW50IHRoZSBjb3VudGVyIG9uIGFueSB0aHJlYWQKKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorX19pdHRfY291bnRlciBJVFRBUEkgX19pdHRfY291bnRlcl9jcmVhdGVBKGNvbnN0IGNoYXIgICAgKm5hbWUsIGNvbnN0IGNoYXIgICAgKmRvbWFpbik7CitfX2l0dF9jb3VudGVyIElUVEFQSSBfX2l0dF9jb3VudGVyX2NyZWF0ZVcoY29uc3Qgd2NoYXJfdCAqbmFtZSwgY29uc3Qgd2NoYXJfdCAqZG9tYWluKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGUgICAgIF9faXR0X2NvdW50ZXJfY3JlYXRlVworIyAgZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlX3B0ciBfX2l0dF9jb3VudGVyX2NyZWF0ZVdfcHRyCisjZWxzZSAvKiBVTklDT0RFICovCisjICBkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGUgICAgIF9faXR0X2NvdW50ZXJfY3JlYXRlQQorIyAgZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlX3B0ciBfX2l0dF9jb3VudGVyX2NyZWF0ZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitfX2l0dF9jb3VudGVyIElUVEFQSSBfX2l0dF9jb3VudGVyX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4pOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2NvdW50ZXIsIGNvdW50ZXJfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGNvbnN0IGNoYXIgICAgKmRvbWFpbikpCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2NvdW50ZXIsIGNvdW50ZXJfY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGNvbnN0IHdjaGFyX3QgKmRvbWFpbikpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2NvdW50ZXIsIGNvdW50ZXJfY3JlYXRlLCAgKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbikpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlQSAgICAgSVRUTk9USUZZX0RBVEEoY291bnRlcl9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZUFfcHRyIElUVE5PVElGWV9OQU1FKGNvdW50ZXJfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVXICAgICBJVFROT1RJRllfREFUQShjb3VudGVyX2NyZWF0ZVcpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlV19wdHIgSVRUTk9USUZZX05BTUUoY291bnRlcl9jcmVhdGVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlICAgICBJVFROT1RJRllfREFUQShjb3VudGVyX2NyZWF0ZSkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVfcHRyIElUVE5PVElGWV9OQU1FKGNvdW50ZXJfY3JlYXRlKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVBKG5hbWUsIGRvbWFpbikKKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlVyhuYW1lLCBkb21haW4pCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlKG5hbWUsIGRvbWFpbikKKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBEZXN0cm95IHRoZSBjb3VudGVyIGlkZW50aWZpZWQgYnkgdGhlIHBvaW50ZXIgcHJldmlvdXNseSByZXR1cm5lZCBieSBfX2l0dF9jb3VudGVyX2NyZWF0ZSgpCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2NvdW50ZXJfZGVzdHJveShfX2l0dF9jb3VudGVyIGlkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgY291bnRlcl9kZXN0cm95LCAoX19pdHRfY291bnRlciBpZCkpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfZGVzdHJveSAgICAgSVRUTk9USUZZX1ZPSUQoY291bnRlcl9kZXN0cm95KQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2Rlc3Ryb3lfcHRyIElUVE5PVElGWV9OQU1FKGNvdW50ZXJfZGVzdHJveSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfZGVzdHJveShpZCkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9kZXN0cm95X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfY291bnRlcl9kZXN0cm95X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIEluY3JlbWVudCB0aGUgY291bnRlciB2YWx1ZQorICovCit2b2lkIElUVEFQSSBfX2l0dF9jb3VudGVyX2luYyhfX2l0dF9jb3VudGVyIGlkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgY291bnRlcl9pbmMsIChfX2l0dF9jb3VudGVyIGlkKSkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmMgICAgIElUVE5PVElGWV9WT0lEKGNvdW50ZXJfaW5jKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19wdHIgSVRUTk9USUZZX05BTUUoY291bnRlcl9pbmMpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9jb3VudGVyX2luYyhpZCkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBJbmNyZW1lbnQgdGhlIGNvdW50ZXIgdmFsdWUgd2l0aCB4CisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2NvdW50ZXJfaW5jX2RlbHRhKF9faXR0X2NvdW50ZXIgaWQsIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGNvdW50ZXJfaW5jX2RlbHRhLCAoX19pdHRfY291bnRlciBpZCwgdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlKSkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfZGVsdGEgICAgIElUVE5PVElGWV9WT0lEKGNvdW50ZXJfaW5jX2RlbHRhKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19kZWx0YV9wdHIgSVRUTk9USUZZX05BTUUoY291bnRlcl9pbmNfZGVsdGEpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19kZWx0YShpZCwgdmFsdWUpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX2RlbHRhX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfZGVsdGFfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBjb3VudGVycyBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBzdGl0Y2ggU3RhY2sgU3RpdGNoaW5nCisgKiBAaW5ncm91cCBpbnRlcm5hbAorICogU3RhY2sgU3RpdGNoaW5nIGdyb3VwCisgKiBAeworICovCisvKioKKyAqIEBicmllZiBvcGFxdWUgc3RydWN0dXJlIGZvciBjb3VudGVyIGlkZW50aWZpY2F0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9jYWxsZXIgKl9faXR0X2NhbGxlcjsKKworLyoqCisgKiBAYnJpZWYgQ3JlYXRlIHRoZSBzdGl0Y2ggcG9pbnQgZS5nLiBhIHBvaW50IGluIGNhbGwgc3RhY2sgd2hlcmUgb3RoZXIgc3RhY2tzIHNob3VsZCBiZSBzdGl0Y2hlZCB0by4KKyAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIGEgdW5pcXVlIGlkZW50aWZpZXIgd2hpY2ggaXMgdXNlZCB0byBtYXRjaCB0aGUgY3V0IHBvaW50cyB3aXRoIGNvcnJlc3BvbmRpbmcgc3RpdGNoIHBvaW50cy4KKyAqLworX19pdHRfY2FsbGVyIElUVEFQSSBfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2NhbGxlciwgc3RhY2tfY2FsbGVyX2NyZWF0ZSwgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlICAgICBJVFROT1RJRllfREFUQShzdGFja19jYWxsZXJfY3JlYXRlKQorI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlX3B0ciBJVFROT1RJRllfTkFNRShzdGFja19jYWxsZXJfY3JlYXRlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZSgpIChfX2l0dF9jYWxsZXIpMAorI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBEZXN0cm95IHRoZSBpbmZvcmFtdGlvbiBhYm91dCBzdGl0Y2ggcG9pbnQgaWRlbnRpZmllZCBieSB0aGUgcG9pbnRlciBwcmV2aW91c2x5IHJldHVybmVkIGJ5IF9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGUoKQorICovCit2b2lkIElUVEFQSSBfX2l0dF9zdGFja19jYWxsZXJfZGVzdHJveShfX2l0dF9jYWxsZXIgaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdGFja19jYWxsZXJfZGVzdHJveSwgKF9faXR0X2NhbGxlciBpZCkpCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlcl9kZXN0cm95ICAgICBJVFROT1RJRllfVk9JRChzdGFja19jYWxsZXJfZGVzdHJveSkKKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVyX2Rlc3Ryb3lfcHRyIElUVE5PVElGWV9OQU1FKHN0YWNrX2NhbGxlcl9kZXN0cm95KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVyX2Rlc3Ryb3koaWQpCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlcl9kZXN0cm95X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVyX2Rlc3Ryb3lfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgU2V0cyB0aGUgY3V0IHBvaW50LiBTdGFjayBmcm9tIGVhY2ggZXZlbnQgd2hpY2ggb2NjdXJzIGFmdGVyIHRoaXMgY2FsbCB3aWxsIGJlIGN1dAorICogYXQgdGhlIHNhbWUgc3RhY2sgbGV2ZWwgdGhlIGZ1bmN0aW9uIHdhcyBjYWxsZWQgYW5kIHN0aXRjaGVkIHRvIHRoZSBjb3JyZXNwb25kaW5nIHN0aXRjaCBwb2ludC4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc3RhY2tfY2FsbGVlX2VudGVyKF9faXR0X2NhbGxlciBpZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN0YWNrX2NhbGxlZV9lbnRlciwgKF9faXR0X2NhbGxlciBpZCkpCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlZV9lbnRlciAgICAgSVRUTk9USUZZX1ZPSUQoc3RhY2tfY2FsbGVlX2VudGVyKQorI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZWVfZW50ZXJfcHRyIElUVE5PVElGWV9OQU1FKHN0YWNrX2NhbGxlZV9lbnRlcikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlZV9lbnRlcihpZCkKKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVlX2VudGVyX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVlX2VudGVyX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFRoaXMgZnVuY3Rpb24gZWxpbWluYXRlcyB0aGUgY3V0IHBvaW50IHdoaWNoIHdhcyBzZXQgYnkgbGF0ZXN0IF9faXR0X3N0YWNrX2NhbGxlZV9lbnRlcigpLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9zdGFja19jYWxsZWVfbGVhdmUoX19pdHRfY2FsbGVyIGlkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3RhY2tfY2FsbGVlX2xlYXZlLCAoX19pdHRfY2FsbGVyIGlkKSkKKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVlX2xlYXZlICAgICBJVFROT1RJRllfVk9JRChzdGFja19jYWxsZWVfbGVhdmUpCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlZV9sZWF2ZV9wdHIgSVRUTk9USUZZX05BTUUoc3RhY2tfY2FsbGVlX2xlYXZlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVlX2xlYXZlKGlkKQorI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZWVfbGVhdmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZWVfbGVhdmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEB9IHN0aXRjaCBncm91cCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLwordHlwZWRlZiBlbnVtIF9faXR0X2Vycm9yX2NvZGUKK3sKKyAgICBfX2l0dF9lcnJvcl9zdWNjZXNzICAgICAgID0gMCwgLyohPCBubyBlcnJvciAqLworICAgIF9faXR0X2Vycm9yX25vX21vZHVsZSAgICAgPSAxLCAvKiE8IG1vZHVsZSBjYW4ndCBiZSBsb2FkZWQgKi8KKyAgICAvKiAlMSRzIC0tIGxpYnJhcnkgbmFtZTsgd2luOiAlMiRkIC0tIHN5c3RlbSBlcnJvciBjb2RlOyB1bng6ICUyJHMgLS0gc3lzdGVtIGVycm9yIG1lc3NhZ2UuICovCisgICAgX19pdHRfZXJyb3Jfbm9fc3ltYm9sICAgICA9IDIsIC8qITwgc3ltYm9sIG5vdCBmb3VuZCAqLworICAgIC8qICUxJHMgLS0gbGlicmFyeSBuYW1lLCAlMiRzIC0tIHN5bWJvbCBuYW1lLiAqLworICAgIF9faXR0X2Vycm9yX3Vua25vd25fZ3JvdXAgPSAzLCAvKiE8IHVua25vd24gZ3JvdXAgc3BlY2lmaWVkICovCisgICAgLyogJTEkcyAtLSBlbnYgdmFyIG5hbWUsICUyJHMgLS0gZ3JvdXAgbmFtZS4gKi8KKyAgICBfX2l0dF9lcnJvcl9jYW50X3JlYWRfZW52ID0gNCwgLyohPCBHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCkgZmFpbGVkICovCisgICAgLyogJTEkcyAtLSBlbnYgdmFyIG5hbWUsICUyJGQgLS0gc3lzdGVtIGVycm9yLiAqLworICAgIF9faXR0X2Vycm9yX2Vudl90b29fbG9uZyAgPSA1LCAvKiE8IHZhcmlhYmxlIHZhbHVlIHRvbyBsb25nICovCisgICAgLyogJTEkcyAtLSBlbnYgdmFyIG5hbWUsICUyJGQgLS0gYWN0dWFsIGxlbmd0aCBvZiB0aGUgdmFyLCAlMyRkIC0tIG1heCBhbGxvd2VkIGxlbmd0aC4gKi8KKyAgICBfX2l0dF9lcnJvcl9zeXN0ZW0gICAgICAgID0gNiAgLyohPCBwdGhyZWFkX211dGV4YXR0cl9pbml0IG9yIHB0aHJlYWRfbXV0ZXhfaW5pdCBmYWlsZWQgKi8KKyAgICAvKiAlMSRzIC0tIGZ1bmN0aW9uIG5hbWUsICUyJGQgLS0gZXJybm8uICovCit9IF9faXR0X2Vycm9yX2NvZGU7CisKK3R5cGVkZWYgdm9pZCAoX19pdHRfZXJyb3JfaGFuZGxlcl90KShfX2l0dF9lcnJvcl9jb2RlIGNvZGUsIHZhX2xpc3QpOworX19pdHRfZXJyb3JfaGFuZGxlcl90KiBfX2l0dF9zZXRfZXJyb3JfaGFuZGxlcihfX2l0dF9lcnJvcl9oYW5kbGVyX3QqKTsKKworY29uc3QgY2hhciogSVRUQVBJIF9faXR0X2FwaV92ZXJzaW9uKHZvaWQpOworLyoqIEBlbmRjb25kICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNkZWZpbmUgX19pdHRfZXJyb3JfaGFuZGxlciBJVFRfSk9JTihJTlRFTF9JVFROT1RJRllfUFJFRklYLCBlcnJvcl9oYW5kbGVyKQordm9pZCBfX2l0dF9lcnJvcl9oYW5kbGVyKF9faXR0X2Vycm9yX2NvZGUgY29kZSwgdmFfbGlzdCBhcmdzKTsKK2V4dGVybiBjb25zdCBpbnQgSVRUTk9USUZZX05BTUUoZXJyKTsKKyNkZWZpbmUgX19pdHRfZXJyIElUVE5PVElGWV9OQU1FKGVycikKK0lUVF9TVFVCKElUVEFQSSwgY29uc3QgY2hhciosIGFwaV92ZXJzaW9uLCAodm9pZCkpCisjZGVmaW5lIF9faXR0X2FwaV92ZXJzaW9uICAgICBJVFROT1RJRllfREFUQShhcGlfdmVyc2lvbikKKyNkZWZpbmUgX19pdHRfYXBpX3ZlcnNpb25fcHRyIElUVE5PVElGWV9OQU1FKGFwaV92ZXJzaW9uKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfYXBpX3ZlcnNpb24oKSAgIChjb25zdCBjaGFyKikwCisjZGVmaW5lIF9faXR0X2FwaV92ZXJzaW9uX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfYXBpX3ZlcnNpb25fcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9JVFROT1RJRllfUFJJVkFURV8gKi8KKworI2VuZGlmIC8qIElOVEVMX0lUVE5PVElGWV9BUElfUFJJVkFURSAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X2NvbmZpZy5oIGIvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZGUwMmMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfY29uZmlnLmgKQEAgLTAsMCArMSw0OTAgQEAKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfSVRUTk9USUZZX0NPTkZJR19IXworI2RlZmluZSBfSVRUTk9USUZZX0NPTkZJR19IXworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSVRUX09TX1dJTgorIyAgZGVmaW5lIElUVF9PU19XSU4gICAxCisjZW5kaWYgLyogSVRUX09TX1dJTiAqLworCisjaWZuZGVmIElUVF9PU19MSU5VWAorIyAgZGVmaW5lIElUVF9PU19MSU5VWCAyCisjZW5kaWYgLyogSVRUX09TX0xJTlVYICovCisKKyNpZm5kZWYgSVRUX09TX01BQworIyAgZGVmaW5lIElUVF9PU19NQUMgICAzCisjZW5kaWYgLyogSVRUX09TX01BQyAqLworCisjaWZuZGVmIElUVF9PUworIyAgaWYgZGVmaW5lZCBXSU4zMiB8fCBkZWZpbmVkIF9XSU4zMgorIyAgICBkZWZpbmUgSVRUX09TIElUVF9PU19XSU4KKyMgIGVsaWYgZGVmaW5lZCggX19BUFBMRV9fICkgJiYgZGVmaW5lZCggX19NQUNIX18gKQorIyAgICBkZWZpbmUgSVRUX09TIElUVF9PU19NQUMKKyMgIGVsc2UKKyMgICAgZGVmaW5lIElUVF9PUyBJVFRfT1NfTElOVVgKKyMgIGVuZGlmCisjZW5kaWYgLyogSVRUX09TICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNX1dJTgorIyAgZGVmaW5lIElUVF9QTEFURk9STV9XSU4gMQorI2VuZGlmIC8qIElUVF9QTEFURk9STV9XSU4gKi8KKworI2lmbmRlZiBJVFRfUExBVEZPUk1fUE9TSVgKKyMgIGRlZmluZSBJVFRfUExBVEZPUk1fUE9TSVggMgorI2VuZGlmIC8qIElUVF9QTEFURk9STV9QT1NJWCAqLworCisjaWZuZGVmIElUVF9QTEFURk9STV9NQUMKKyMgIGRlZmluZSBJVFRfUExBVEZPUk1fTUFDIDMKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk1fTUFDICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNCisjICBpZiBJVFRfT1M9PUlUVF9PU19XSU4KKyMgICAgZGVmaW5lIElUVF9QTEFURk9STSBJVFRfUExBVEZPUk1fV0lOCisjICBlbGlmIElUVF9PUz09SVRUX09TX01BQworIyAgICBkZWZpbmUgSVRUX1BMQVRGT1JNIElUVF9QTEFURk9STV9NQUMKKyMgIGVsc2UKKyMgICAgZGVmaW5lIElUVF9QTEFURk9STSBJVFRfUExBVEZPUk1fUE9TSVgKKyMgIGVuZGlmCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNICovCisKKyNpZiBkZWZpbmVkKF9VTklDT0RFKSAmJiAhZGVmaW5lZChVTklDT0RFKQorI2RlZmluZSBVTklDT0RFCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2luY2x1ZGUgPHRjaGFyLmg+CisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorI2luY2x1ZGUgPHdjaGFyLmg+CisjZW5kaWYgLyogVU5JQ09ERSB8fCBfVU5JQ09ERSAqLworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisjaWZuZGVmIENERUNMCisjICBpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyMgICAgZGVmaW5lIENERUNMIF9fY2RlY2wKKyMgIGVsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjICAgIGlmIGRlZmluZWQgX01fSVg4NiB8fCBkZWZpbmVkIF9faTM4Nl9fCisjICAgICAgZGVmaW5lIENERUNMIF9fYXR0cmlidXRlX18gKChjZGVjbCkpCisjICAgIGVsc2UgIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgICAgICBkZWZpbmUgQ0RFQ0wgLyogYWN0dWFsIG9ubHkgb24geDg2IHBsYXRmb3JtICovCisjICAgIGVuZGlmIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgIGVuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIENERUNMICovCisKKyNpZm5kZWYgU1REQ0FMTAorIyAgaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjICAgIGRlZmluZSBTVERDQUxMIF9fc3RkY2FsbAorIyAgZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyMgICAgaWYgZGVmaW5lZCBfTV9JWDg2IHx8IGRlZmluZWQgX19pMzg2X18KKyMgICAgICBkZWZpbmUgU1REQ0FMTCBfX2F0dHJpYnV0ZV9fICgoc3RkY2FsbCkpCisjICAgIGVsc2UgIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgICAgICBkZWZpbmUgU1REQ0FMTCAvKiBzdXBwb3J0ZWQgb25seSBvbiB4ODYgcGxhdGZvcm0gKi8KKyMgICAgZW5kaWYgLyogX01fSVg4NiB8fCBfX2kzODZfXyAqLworIyAgZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogU1REQ0FMTCAqLworCisjZGVmaW5lIElUVEFQSSAgICBDREVDTAorI2RlZmluZSBMSUJJVFRBUEkgQ0RFQ0wKKworLyogVE9ETzogVGVtcG9yYXJ5IGZvciBjb21wYXRpYmlsaXR5ISAqLworI2RlZmluZSBJVFRBUElfQ0FMTCAgICBDREVDTAorI2RlZmluZSBMSUJJVFRBUElfQ0FMTCBDREVDTAorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisvKiB1c2UgX19mb3JjZWlubGluZSAoVkMrKyBzcGVjaWZpYykgKi8KKyNkZWZpbmUgSVRUX0lOTElORSAgICAgICAgICAgX19mb3JjZWlubGluZQorI2RlZmluZSBJVFRfSU5MSU5FX0FUVFJJQlVURSAvKiBub3RoaW5nICovCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisvKgorICogR2VuZXJhbGx5LCBmdW5jdGlvbnMgYXJlIG5vdCBpbmxpbmVkIHVubGVzcyBvcHRpbWl6YXRpb24gaXMgc3BlY2lmaWVkLgorICogRm9yIGZ1bmN0aW9ucyBkZWNsYXJlZCBpbmxpbmUsIHRoaXMgYXR0cmlidXRlIGlubGluZXMgdGhlIGZ1bmN0aW9uIGV2ZW4KKyAqIGlmIG5vIG9wdGltaXphdGlvbiBsZXZlbCB3YXMgc3BlY2lmaWVkLgorICovCisjaWZkZWYgX19TVFJJQ1RfQU5TSV9fCisjZGVmaW5lIElUVF9JTkxJTkUgICAgICAgICAgIHN0YXRpYworI2RlZmluZSBJVFRfSU5MSU5FX0FUVFJJQlVURSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorI2Vsc2UgIC8qIF9fU1RSSUNUX0FOU0lfXyAqLworI2RlZmluZSBJVFRfSU5MSU5FICAgICAgICAgICBzdGF0aWMgaW5saW5lCisjZGVmaW5lIElUVF9JTkxJTkVfQVRUUklCVVRFIF9fYXR0cmlidXRlX18oKGFsd2F5c19pbmxpbmUsIHVudXNlZCkpCisjZW5kaWYgLyogX19TVFJJQ1RfQU5TSV9fICovCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisvKiogQGVuZGNvbmQgKi8KKworI2lmbmRlZiBJVFRfQVJDSF9JQTMyCisjICBkZWZpbmUgSVRUX0FSQ0hfSUEzMiAgMQorI2VuZGlmIC8qIElUVF9BUkNIX0lBMzIgKi8KKworI2lmbmRlZiBJVFRfQVJDSF9JQTMyRQorIyAgZGVmaW5lIElUVF9BUkNIX0lBMzJFIDIKKyNlbmRpZiAvKiBJVFRfQVJDSF9JQTMyRSAqLworCisvKiBXYXMgdGhlcmUgYSBtYWdpY2FsIHJlYXNvbiB3ZSBkaWRuJ3QgaGF2ZSAzIGhlcmUgYmVmb3JlPyAqLworI2lmbmRlZiBJVFRfQVJDSF9BQVJDSDY0CisjICBkZWZpbmUgSVRUX0FSQ0hfQUFSQ0g2NCAgMworI2VuZGlmIC8qIElUVF9BUkNIX0FBUkNINjQgKi8KKworI2lmbmRlZiBJVFRfQVJDSF9BUk0KKyMgIGRlZmluZSBJVFRfQVJDSF9BUk0gIDQKKyNlbmRpZiAvKiBJVFRfQVJDSF9BUk0gKi8KKworI2lmbmRlZiBJVFRfQVJDSF9QUEM2NAorIyAgZGVmaW5lIElUVF9BUkNIX1BQQzY0ICA1CisjZW5kaWYgLyogSVRUX0FSQ0hfUFBDNjQgKi8KKworI2lmbmRlZiBJVFRfQVJDSF9NSVBTCisjICBkZWZpbmUgSVRUX0FSQ0hfTUlQUyAgNgorI2VuZGlmIC8qIElUVF9BUkNIX01JUFMgKi8KKworI2lmbmRlZiBJVFRfQVJDSF9NSVBTNjQKKyMgIGRlZmluZSBJVFRfQVJDSF9NSVBTNjQgIDYKKyNlbmRpZiAvKiBJVFRfQVJDSF9NSVBTNjQgKi8KKworCisjaWZuZGVmIElUVF9BUkNICisjICBpZiBkZWZpbmVkIF9NX0lYODYgfHwgZGVmaW5lZCBfX2kzODZfXworIyAgICBkZWZpbmUgSVRUX0FSQ0ggSVRUX0FSQ0hfSUEzMgorIyAgZWxpZiBkZWZpbmVkIF9NX1g2NCB8fCBkZWZpbmVkIF9NX0FNRDY0IHx8IGRlZmluZWQgX194ODZfNjRfXworIyAgICBkZWZpbmUgSVRUX0FSQ0ggSVRUX0FSQ0hfSUEzMkUKKyMgIGVsaWYgZGVmaW5lZCBfTV9JQTY0IHx8IGRlZmluZWQgX19pYTY0X18KKyMgICAgZGVmaW5lIElUVF9BUkNIIElUVF9BUkNIX0lBNjQKKyMgIGVsaWYgZGVmaW5lZCBfTV9BUk0gfHwgX19hcm1fXworIyAgICBkZWZpbmUgSVRUX0FSQ0ggSVRUX0FSQ0hfQVJNCisjICBlbGlmIGRlZmluZWQgX19wb3dlcnBjNjRfXworIyAgICBkZWZpbmUgSVRUX0FSQ0ggSVRUX0FSQ0hfUFBDNjQKKyMgIGVsaWYgZGVmaW5lZCBfX2FhcmNoNjRfXworIyAgICBkZWZpbmUgSVRUX0FSQ0ggSVRUX0FSQ0hfQUFSQ0g2NAorIyAgZWxpZiBkZWZpbmVkIF9fbWlwc19fICYmICFkZWZpbmVkIF9fbWlwczY0CisjICAgIGRlZmluZSBJVFRfQVJDSCBJVFRfQVJDSF9NSVBTCisjICBlbGlmIGRlZmluZWQgX19taXBzX18gJiYgZGVmaW5lZCBfX21pcHM2NAorIyAgICBkZWZpbmUgSVRUX0FSQ0ggSVRUX0FSQ0hfTUlQUzY0CisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworIyAgZGVmaW5lIElUVF9FWFRFUk5fQyBleHRlcm4gIkMiCisjICBkZWZpbmUgSVRUX0VYVEVSTl9DX0JFR0lOIGV4dGVybiAiQyIgeworIyAgZGVmaW5lIElUVF9FWFRFUk5fQ19FTkQgfQorI2Vsc2UKKyMgIGRlZmluZSBJVFRfRVhURVJOX0MgLyogbm90aGluZyAqLworIyAgZGVmaW5lIElUVF9FWFRFUk5fQ19CRUdJTiAvKiBub3RoaW5nICovCisjICBkZWZpbmUgSVRUX0VYVEVSTl9DX0VORCAvKiBub3RoaW5nICovCisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2RlZmluZSBJVFRfVE9fU1RSX0FVWCh4KSAjeAorI2RlZmluZSBJVFRfVE9fU1RSKHgpICAgICBJVFRfVE9fU1RSX0FVWCh4KQorCisjZGVmaW5lIF9fSVRUX0JVSUxEX0FTU0VSVChleHByLCBzdWZmaXgpIGRvIHsgXAorICAgIHN0YXRpYyBjaGFyIF9faXR0X2J1aWxkX2NoZWNrXyMjc3VmZml4WyhleHByKSA/IDEgOiAtMV07IFwKKyAgICBfX2l0dF9idWlsZF9jaGVja18jI3N1ZmZpeFswXSA9IDA7IFwKK30gd2hpbGUoMCkKKyNkZWZpbmUgX0lUVF9CVUlMRF9BU1NFUlQoZXhwciwgc3VmZml4KSAgX19JVFRfQlVJTERfQVNTRVJUKChleHByKSwgc3VmZml4KQorI2RlZmluZSBJVFRfQlVJTERfQVNTRVJUKGV4cHIpICAgICAgICAgICBfSVRUX0JVSUxEX0FTU0VSVCgoZXhwciksIF9fTElORV9fKQorCisjZGVmaW5lIElUVF9NQUdJQyB7IDB4RUQsIDB4QUIsIDB4QUIsIDB4RUMsIDB4MEQsIDB4RUUsIDB4REEsIDB4MzAgfQorCisvKiBSZXBsYWNlIHdpdGggc25hcHNob3QgZGF0ZSBZWVlZTU1ERCBmb3IgcHJvbW90aW9uIGJ1aWxkLiAqLworI2RlZmluZSBBUElfVkVSU0lPTl9CVUlMRCAgICAyMDExMTExMQorCisjaWZuZGVmIEFQSV9WRVJTSU9OX05VTQorI2RlZmluZSBBUElfVkVSU0lPTl9OVU0gMC4wLjAKKyNlbmRpZiAvKiBBUElfVkVSU0lPTl9OVU0gKi8KKworI2RlZmluZSBBUElfVkVSU0lPTiAiSVRULUFQSS1WZXJzaW9uICIgSVRUX1RPX1NUUihBUElfVkVSU0lPTl9OVU0pIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoIiBJVFRfVE9fU1RSKEFQSV9WRVJTSU9OX0JVSUxEKSAiKSIKKworLyogT1MgY29tbXVuaWNhdGlvbiBmdW5jdGlvbnMgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+Cit0eXBlZGVmIEhNT0RVTEUgICAgICAgICAgIGxpYl90OwordHlwZWRlZiBEV09SRCAgICAgICAgICAgICBUSURUOwordHlwZWRlZiBDUklUSUNBTF9TRUNUSU9OICBtdXRleF90OworI2RlZmluZSBNVVRFWF9JTklUSUFMSVpFUiB7IDAgfQorI2RlZmluZSBzdHJvbmdfYWxpYXMobmFtZSwgYWxpYXNuYW1lKSAvKiBlbXB0eSBmb3IgV2luZG93cyAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2luY2x1ZGUgPGRsZmNuLmg+CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorI2luY2x1ZGUgPHdjaGFyLmg+CisjZW5kaWYgLyogVU5JQ09ERSAqLworI2lmbmRlZiBfR05VX1NPVVJDRQorI2RlZmluZSBfR05VX1NPVVJDRSAxIC8qIG5lZWQgZm9yIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFICovCisjZW5kaWYgLyogX0dOVV9TT1VSQ0UgKi8KKyNpZm5kZWYgX19VU0VfVU5JWDk4CisjZGVmaW5lIF9fVVNFX1VOSVg5OCAxIC8qIG5lZWQgZm9yIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFLCBvbiBTTEVTMTEuMSB3aXRoIGdjYyA0LjMuNCB3aGVyZWluIHB0aHJlYWQuaCBtaXNzaW5nIGRlcGVuZGVuY3kgb24gX19VU0VfWE9QRU4ySzggKi8KKyNlbmRpZiAvKl9fVVNFX1VOSVg5OCovCisjaW5jbHVkZSA8cHRocmVhZC5oPgordHlwZWRlZiB2b2lkKiAgICAgICAgICAgICBsaWJfdDsKK3R5cGVkZWYgcHRocmVhZF90ICAgICAgICAgVElEVDsKK3R5cGVkZWYgcHRocmVhZF9tdXRleF90ICAgbXV0ZXhfdDsKKyNkZWZpbmUgTVVURVhfSU5JVElBTElaRVIgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUgorI2RlZmluZSBfc3Ryb25nX2FsaWFzKG5hbWUsIGFsaWFzbmFtZSkgXAorICAgICAgICAgICAgZXh0ZXJuIF9fdHlwZW9mIChuYW1lKSBhbGlhc25hbWUgX19hdHRyaWJ1dGVfXyAoKGFsaWFzICgjbmFtZSkpKTsKKyNkZWZpbmUgc3Ryb25nX2FsaWFzKG5hbWUsIGFsaWFzbmFtZSkgX3N0cm9uZ19hbGlhcyhuYW1lLCBhbGlhc25hbWUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfZ2V0X3Byb2MobGliLCBuYW1lKSBHZXRQcm9jQWRkcmVzcyhsaWIsIG5hbWUpCisjZGVmaW5lIF9faXR0X211dGV4X2luaXQobXV0ZXgpICAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihtdXRleCkKKyNkZWZpbmUgX19pdHRfbXV0ZXhfbG9jayhtdXRleCkgICBFbnRlckNyaXRpY2FsU2VjdGlvbihtdXRleCkKKyNkZWZpbmUgX19pdHRfbXV0ZXhfdW5sb2NrKG11dGV4KSBMZWF2ZUNyaXRpY2FsU2VjdGlvbihtdXRleCkKKyNkZWZpbmUgX19pdHRfbG9hZF9saWIobmFtZSkgICAgICBMb2FkTGlicmFyeUEobmFtZSkKKyNkZWZpbmUgX19pdHRfdW5sb2FkX2xpYihoYW5kbGUpICBGcmVlTGlicmFyeShoYW5kbGUpCisjZGVmaW5lIF9faXR0X3N5c3RlbV9lcnJvcigpICAgICAgKGludClHZXRMYXN0RXJyb3IoKQorI2RlZmluZSBfX2l0dF9mc3RyY21wKHMxLCBzMikgICAgIGxzdHJjbXBBKHMxLCBzMikKKyNkZWZpbmUgX19pdHRfZnN0cmxlbihzKSAgICAgICAgICBsc3RybGVuQShzKQorI2RlZmluZSBfX2l0dF9mc3RyY3B5bihzMSwgczIsIGwpIGxzdHJjcHluQShzMSwgczIsIGwpCisjZGVmaW5lIF9faXR0X2ZzdHJkdXAocykgICAgICAgICAgX3N0cmR1cChzKQorI2RlZmluZSBfX2l0dF90aHJlYWRfaWQoKSAgICAgICAgIEdldEN1cnJlbnRUaHJlYWRJZCgpCisjZGVmaW5lIF9faXR0X3RocmVhZF95aWVsZCgpICAgICAgU3dpdGNoVG9UaHJlYWQoKQorI2lmbmRlZiBJVFRfU0lNUExFX0lOSVQKK0lUVF9JTkxJTkUgbG9uZworX19pdHRfaW50ZXJsb2NrZWRfaW5jcmVtZW50KHZvbGF0aWxlIGxvbmcqIHB0cikgSVRUX0lOTElORV9BVFRSSUJVVEU7CitJVFRfSU5MSU5FIGxvbmcgX19pdHRfaW50ZXJsb2NrZWRfaW5jcmVtZW50KHZvbGF0aWxlIGxvbmcqIHB0cikKK3sKKyAgICByZXR1cm4gSW50ZXJsb2NrZWRJbmNyZW1lbnQocHRyKTsKK30KKyNlbmRpZiAvKiBJVFRfU0lNUExFX0lOSVQgKi8KKyNlbHNlIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9nZXRfcHJvYyhsaWIsIG5hbWUpIGRsc3ltKGxpYiwgbmFtZSkKKyNkZWZpbmUgX19pdHRfbXV0ZXhfaW5pdChtdXRleCkgICB7XAorICAgIHB0aHJlYWRfbXV0ZXhhdHRyX3QgbXV0ZXhfYXR0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgZXJyb3JfY29kZSA9IHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoJm11dGV4X2F0dHIpOyAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGVycm9yX2NvZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2l0dF9yZXBvcnRfZXJyb3IoX19pdHRfZXJyb3Jfc3lzdGVtLCAicHRocmVhZF9tdXRleGF0dHJfaW5pdCIsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NvZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXJyb3JfY29kZSA9IHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUoJm11dGV4X2F0dHIsICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFKTsgICAgICAgIFwKKyAgICBpZiAoZXJyb3JfY29kZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9faXR0X3JlcG9ydF9lcnJvcihfX2l0dF9lcnJvcl9zeXN0ZW0sICJwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlIiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlcnJvcl9jb2RlID0gcHRocmVhZF9tdXRleF9pbml0KG11dGV4LCAmbXV0ZXhfYXR0cik7ICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGVycm9yX2NvZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2l0dF9yZXBvcnRfZXJyb3IoX19pdHRfZXJyb3Jfc3lzdGVtLCAicHRocmVhZF9tdXRleF9pbml0IiwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NvZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXJyb3JfY29kZSA9IHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3koJm11dGV4X2F0dHIpOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChlcnJvcl9jb2RlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19pdHRfcmVwb3J0X2Vycm9yKF9faXR0X2Vycm9yX3N5c3RlbSwgInB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kiLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jb2RlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2RlZmluZSBfX2l0dF9tdXRleF9sb2NrKG11dGV4KSAgIHB0aHJlYWRfbXV0ZXhfbG9jayhtdXRleCkKKyNkZWZpbmUgX19pdHRfbXV0ZXhfdW5sb2NrKG11dGV4KSBwdGhyZWFkX211dGV4X3VubG9jayhtdXRleCkKKyNkZWZpbmUgX19pdHRfbG9hZF9saWIobmFtZSkgICAgICBkbG9wZW4obmFtZSwgUlRMRF9MQVpZKQorI2RlZmluZSBfX2l0dF91bmxvYWRfbGliKGhhbmRsZSkgIGRsY2xvc2UoaGFuZGxlKQorI2RlZmluZSBfX2l0dF9zeXN0ZW1fZXJyb3IoKSAgICAgIGVycm5vCisjZGVmaW5lIF9faXR0X2ZzdHJjbXAoczEsIHMyKSAgICAgc3RyY21wKHMxLCBzMikKKyNkZWZpbmUgX19pdHRfZnN0cmxlbihzKSAgICAgICAgICBzdHJsZW4ocykKKyNkZWZpbmUgX19pdHRfZnN0cmNweW4oczEsIHMyLCBsKSBzdHJuY3B5KHMxLCBzMiwgbCkKKyNkZWZpbmUgX19pdHRfZnN0cmR1cChzKSAgICAgICAgICBzdHJkdXAocykKKyNkZWZpbmUgX19pdHRfdGhyZWFkX2lkKCkgICAgICAgICBwdGhyZWFkX3NlbGYoKQorI2RlZmluZSBfX2l0dF90aHJlYWRfeWllbGQoKSAgICAgIHNjaGVkX3lpZWxkKCkKKyNpZiBJVFRfQVJDSD09SVRUX0FSQ0hfSUE2NAorI2lmZGVmIF9fSU5URUxfQ09NUElMRVIKKyNkZWZpbmUgX19UQkJfbWFjaGluZV9mZXRjaGFkZDQoYWRkciwgdmFsKSBfX2ZldGNoYWRkNF9hY3EoKHZvaWQgKilhZGRyLCB2YWwpCisjZWxzZSAgLyogX19JTlRFTF9DT01QSUxFUiAqLworLyogVE9ETzogQWRkIFN1cHBvcnQgZm9yIG5vdCBJbnRlbCBjb21waWxlcnMgZm9yIElBLTY0IGFyY2hpdGVjdHVyZSAqLworI2VuZGlmIC8qIF9fSU5URUxfQ09NUElMRVIgKi8KKyNlbGlmIElUVF9BUkNIPT1JVFRfQVJDSF9JQTMyIHx8IElUVF9BUkNIPT1JVFRfQVJDSF9JQTMyRSAvKiBJVFRfQVJDSCE9SVRUX0FSQ0hfSUE2NCAqLworSVRUX0lOTElORSBsb25nCitfX1RCQl9tYWNoaW5lX2ZldGNoYWRkNCh2b2xhdGlsZSB2b2lkKiBwdHIsIGxvbmcgYWRkZW5kKSBJVFRfSU5MSU5FX0FUVFJJQlVURTsKK0lUVF9JTkxJTkUgbG9uZyBfX1RCQl9tYWNoaW5lX2ZldGNoYWRkNCh2b2xhdGlsZSB2b2lkKiBwdHIsIGxvbmcgYWRkZW5kKQoreworICAgIGxvbmcgcmVzdWx0OworICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJsb2NrXG54YWRkICUwLCUxIgorICAgICAgICAgICAgICAgICAgICAgICAgICA6ICI9ciIocmVzdWx0KSwiPW0iKCoodm9sYXRpbGUgaW50KilwdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogIjAiKGFkZGVuZCksICJtIigqKHZvbGF0aWxlIGludCopcHRyKQorICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJtZW1vcnkiKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorI2VsaWYgSVRUX0FSQ0g9PUlUVF9BUkNIX0FSTSB8fCBJVFRfQVJDSD09SVRUX0FSQ0hfUFBDNjQgfHwgSVRUX0FSQ0g9PUlUVF9BUkNIX0FBUkNINjQgfHwgSVRUX0FSQ0g9PUlUVF9BUkNIX01JUFMgfHwgIElUVF9BUkNIPT1JVFRfQVJDSF9NSVBTNjQKKyNkZWZpbmUgX19UQkJfbWFjaGluZV9mZXRjaGFkZDQoYWRkciwgdmFsKSBfX3N5bmNfZmV0Y2hfYW5kX2FkZChhZGRyLCB2YWwpCisjZW5kaWYgLyogSVRUX0FSQ0g9PUlUVF9BUkNIX0lBNjQgKi8KKyNpZm5kZWYgSVRUX1NJTVBMRV9JTklUCitJVFRfSU5MSU5FIGxvbmcKK19faXR0X2ludGVybG9ja2VkX2luY3JlbWVudCh2b2xhdGlsZSBsb25nKiBwdHIpIElUVF9JTkxJTkVfQVRUUklCVVRFOworSVRUX0lOTElORSBsb25nIF9faXR0X2ludGVybG9ja2VkX2luY3JlbWVudCh2b2xhdGlsZSBsb25nKiBwdHIpCit7CisgICAgcmV0dXJuIF9fVEJCX21hY2hpbmVfZmV0Y2hhZGQ0KHB0ciwgMSkgKyAxTDsKK30KKyNlbmRpZiAvKiBJVFRfU0lNUExFX0lOSVQgKi8KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBfX2l0dF9jb2xsZWN0aW9uX25vcm1hbCA9IDAsCisgICAgX19pdHRfY29sbGVjdGlvbl9wYXVzZWQgPSAxCit9IF9faXR0X2NvbGxlY3Rpb25fc3RhdGU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgX19pdHRfdGhyZWFkX25vcm1hbCAgPSAwLAorICAgIF9faXR0X3RocmVhZF9pZ25vcmVkID0gMQorfSBfX2l0dF90aHJlYWRfc3RhdGU7CisKKyNwcmFnbWEgcGFjayhwdXNoLCA4KQorCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfdGhyZWFkX2luZm8KK3sKKyAgICBjb25zdCBjaGFyKiBuYW1lQTsgLyohPCBDb3B5IG9mIG9yaWdpbmFsIG5hbWUgaW4gQVNDSUkuICovCisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorICAgIGNvbnN0IHdjaGFyX3QqIG5hbWVXOyAvKiE8IENvcHkgb2Ygb3JpZ2luYWwgbmFtZSBpbiBVTklDT0RFLiAqLworI2Vsc2UgIC8qIFVOSUNPREUgfHwgX1VOSUNPREUgKi8KKyAgICB2b2lkKiBuYW1lVzsKKyNlbmRpZiAvKiBVTklDT0RFIHx8IF9VTklDT0RFICovCisgICAgVElEVCAgICAgICAgICAgICAgIHRpZDsKKyAgICBfX2l0dF90aHJlYWRfc3RhdGUgc3RhdGU7ICAgLyohPCBUaHJlYWQgc3RhdGUgKHBhdXNlZCBvciBub3JtYWwpICovCisgICAgaW50ICAgICAgICAgICAgICAgIGV4dHJhMTsgIC8qITwgUmVzZXJ2ZWQgdG8gdGhlIHJ1bnRpbWUgKi8KKyAgICB2b2lkKiAgICAgICAgICAgICAgZXh0cmEyOyAgLyohPCBSZXNlcnZlZCB0byB0aGUgcnVudGltZSAqLworICAgIHN0cnVjdCBfX19pdHRfdGhyZWFkX2luZm8qIG5leHQ7Cit9IF9faXR0X3RocmVhZF9pbmZvOworCisjaW5jbHVkZSAiaXR0bm90aWZ5X3R5cGVzLmgiIC8qIEZvciBfX2l0dF9ncm91cF9pZCBkZWZpbml0aW9uICovCisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9hcGlfaW5mb18yMDEwMTAwMQoreworICAgIGNvbnN0IGNoYXIqICAgIG5hbWU7CisgICAgdm9pZCoqICAgICAgICAgZnVuY19wdHI7CisgICAgdm9pZCogICAgICAgICAgaW5pdF9mdW5jOworICAgIF9faXR0X2dyb3VwX2lkIGdyb3VwOworfSAgX19pdHRfYXBpX2luZm9fMjAxMDEwMDE7CisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9hcGlfaW5mbworeworICAgIGNvbnN0IGNoYXIqICAgIG5hbWU7CisgICAgdm9pZCoqICAgICAgICAgZnVuY19wdHI7CisgICAgdm9pZCogICAgICAgICAgaW5pdF9mdW5jOworICAgIHZvaWQqICAgICAgICAgIG51bGxfZnVuYzsKKyAgICBfX2l0dF9ncm91cF9pZCBncm91cDsKK30gIF9faXR0X2FwaV9pbmZvOworCitzdHJ1Y3QgX19faXR0X2RvbWFpbjsKK3N0cnVjdCBfX19pdHRfc3RyaW5nX2hhbmRsZTsKKwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X2dsb2JhbAoreworICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgbWFnaWNbOF07CisgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICB2ZXJzaW9uX21ham9yOworICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgdmVyc2lvbl9taW5vcjsKKyAgICB1bnNpZ25lZCBsb25nICAgICAgICAgIHZlcnNpb25fYnVpbGQ7CisgICAgdm9sYXRpbGUgbG9uZyAgICAgICAgICBhcGlfaW5pdGlhbGl6ZWQ7CisgICAgdm9sYXRpbGUgbG9uZyAgICAgICAgICBtdXRleF9pbml0aWFsaXplZDsKKyAgICB2b2xhdGlsZSBsb25nICAgICAgICAgIGF0b21pY19jb3VudGVyOworICAgIG11dGV4X3QgICAgICAgICAgICAgICAgbXV0ZXg7CisgICAgbGliX3QgICAgICAgICAgICAgICAgICBsaWI7CisgICAgdm9pZCogICAgICAgICAgICAgICAgICBlcnJvcl9oYW5kbGVyOworICAgIGNvbnN0IGNoYXIqKiAgICAgICAgICAgZGxsX3BhdGhfcHRyOworICAgIF9faXR0X2FwaV9pbmZvKiAgICAgICAgYXBpX2xpc3RfcHRyOworICAgIHN0cnVjdCBfX19pdHRfZ2xvYmFsKiAgbmV4dDsKKyAgICAvKiBKb2luYWJsZSBzdHJ1Y3R1cmVzIGJlbG93ICovCisgICAgX19pdHRfdGhyZWFkX2luZm8qICAgICB0aHJlYWRfbGlzdDsKKyAgICBzdHJ1Y3QgX19faXR0X2RvbWFpbiogIGRvbWFpbl9saXN0OworICAgIHN0cnVjdCBfX19pdHRfc3RyaW5nX2hhbmRsZSogc3RyaW5nX2xpc3Q7CisgICAgX19pdHRfY29sbGVjdGlvbl9zdGF0ZSBzdGF0ZTsKK30gX19pdHRfZ2xvYmFsOworCisjcHJhZ21hIHBhY2socG9wKQorCisjZGVmaW5lIE5FV19USFJFQURfSU5GT19XKGdwdHIsaCxoX3RhaWwsdCxzLG4pIHsgXAorICAgIGggPSAoX19pdHRfdGhyZWFkX2luZm8qKW1hbGxvYyhzaXplb2YoX19pdHRfdGhyZWFkX2luZm8pKTsgXAorICAgIGlmIChoICE9IE5VTEwpIHsgXAorICAgICAgICBoLT50aWQgICAgPSB0OyBcCisgICAgICAgIGgtPm5hbWVBICA9IE5VTEw7IFwKKyAgICAgICAgaC0+bmFtZVcgID0gbiA/IF93Y3NkdXAobikgOiBOVUxMOyBcCisgICAgICAgIGgtPnN0YXRlICA9IHM7IFwKKyAgICAgICAgaC0+ZXh0cmExID0gMDsgICAgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5leHRyYTIgPSBOVUxMOyAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPm5leHQgICA9IE5VTEw7IFwKKyAgICAgICAgaWYgKGhfdGFpbCA9PSBOVUxMKSBcCisgICAgICAgICAgICAoZ3B0ciktPnRocmVhZF9saXN0ID0gaDsgXAorICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgIGhfdGFpbC0+bmV4dCA9IGg7IFwKKyAgICB9IFwKK30KKworI2RlZmluZSBORVdfVEhSRUFEX0lORk9fQShncHRyLGgsaF90YWlsLHQscyxuKSB7IFwKKyAgICBoID0gKF9faXR0X3RocmVhZF9pbmZvKiltYWxsb2Moc2l6ZW9mKF9faXR0X3RocmVhZF9pbmZvKSk7IFwKKyAgICBpZiAoaCAhPSBOVUxMKSB7IFwKKyAgICAgICAgaC0+dGlkICAgID0gdDsgXAorICAgICAgICBoLT5uYW1lQSAgPSBuID8gX19pdHRfZnN0cmR1cChuKSA6IE5VTEw7IFwKKyAgICAgICAgaC0+bmFtZVcgID0gTlVMTDsgXAorICAgICAgICBoLT5zdGF0ZSAgPSBzOyBcCisgICAgICAgIGgtPmV4dHJhMSA9IDA7ICAgIC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+ZXh0cmEyID0gTlVMTDsgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5uZXh0ICAgPSBOVUxMOyBcCisgICAgICAgIGlmIChoX3RhaWwgPT0gTlVMTCkgXAorICAgICAgICAgICAgKGdwdHIpLT50aHJlYWRfbGlzdCA9IGg7IFwKKyAgICAgICAgZWxzZSBcCisgICAgICAgICAgICBoX3RhaWwtPm5leHQgPSBoOyBcCisgICAgfSBcCit9CisKKyNkZWZpbmUgTkVXX0RPTUFJTl9XKGdwdHIsaCxoX3RhaWwsbmFtZSkgeyBcCisgICAgaCA9IChfX2l0dF9kb21haW4qKW1hbGxvYyhzaXplb2YoX19pdHRfZG9tYWluKSk7IFwKKyAgICBpZiAoaCAhPSBOVUxMKSB7IFwKKyAgICAgICAgaC0+ZmxhZ3MgID0gMDsgICAgLyogZG9tYWluIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgKi8gXAorICAgICAgICBoLT5uYW1lQSAgPSBOVUxMOyBcCisgICAgICAgIGgtPm5hbWVXICA9IG5hbWUgPyBfd2NzZHVwKG5hbWUpIDogTlVMTDsgXAorICAgICAgICBoLT5leHRyYTEgPSAwOyAgICAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPmV4dHJhMiA9IE5VTEw7IC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+bmV4dCAgID0gTlVMTDsgXAorICAgICAgICBpZiAoaF90YWlsID09IE5VTEwpIFwKKyAgICAgICAgICAgIChncHRyKS0+ZG9tYWluX2xpc3QgPSBoOyBcCisgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgaF90YWlsLT5uZXh0ID0gaDsgXAorICAgIH0gXAorfQorCisjZGVmaW5lIE5FV19ET01BSU5fQShncHRyLGgsaF90YWlsLG5hbWUpIHsgXAorICAgIGggPSAoX19pdHRfZG9tYWluKiltYWxsb2Moc2l6ZW9mKF9faXR0X2RvbWFpbikpOyBcCisgICAgaWYgKGggIT0gTlVMTCkgeyBcCisgICAgICAgIGgtPmZsYWdzICA9IDA7ICAgIC8qIGRvbWFpbiBpcyBkaXNhYmxlZCBieSBkZWZhdWx0ICovIFwKKyAgICAgICAgaC0+bmFtZUEgID0gbmFtZSA/IF9faXR0X2ZzdHJkdXAobmFtZSkgOiBOVUxMOyBcCisgICAgICAgIGgtPm5hbWVXICA9IE5VTEw7IFwKKyAgICAgICAgaC0+ZXh0cmExID0gMDsgICAgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5leHRyYTIgPSBOVUxMOyAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPm5leHQgICA9IE5VTEw7IFwKKyAgICAgICAgaWYgKGhfdGFpbCA9PSBOVUxMKSBcCisgICAgICAgICAgICAoZ3B0ciktPmRvbWFpbl9saXN0ID0gaDsgXAorICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgIGhfdGFpbC0+bmV4dCA9IGg7IFwKKyAgICB9IFwKK30KKworI2RlZmluZSBORVdfU1RSSU5HX0hBTkRMRV9XKGdwdHIsaCxoX3RhaWwsbmFtZSkgeyBcCisgICAgaCA9IChfX2l0dF9zdHJpbmdfaGFuZGxlKiltYWxsb2Moc2l6ZW9mKF9faXR0X3N0cmluZ19oYW5kbGUpKTsgXAorICAgIGlmIChoICE9IE5VTEwpIHsgXAorICAgICAgICBoLT5zdHJBICAgPSBOVUxMOyBcCisgICAgICAgIGgtPnN0clcgICA9IG5hbWUgPyBfd2NzZHVwKG5hbWUpIDogTlVMTDsgXAorICAgICAgICBoLT5leHRyYTEgPSAwOyAgICAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPmV4dHJhMiA9IE5VTEw7IC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+bmV4dCAgID0gTlVMTDsgXAorICAgICAgICBpZiAoaF90YWlsID09IE5VTEwpIFwKKyAgICAgICAgICAgIChncHRyKS0+c3RyaW5nX2xpc3QgPSBoOyBcCisgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgaF90YWlsLT5uZXh0ID0gaDsgXAorICAgIH0gXAorfQorCisjZGVmaW5lIE5FV19TVFJJTkdfSEFORExFX0EoZ3B0cixoLGhfdGFpbCxuYW1lKSB7IFwKKyAgICBoID0gKF9faXR0X3N0cmluZ19oYW5kbGUqKW1hbGxvYyhzaXplb2YoX19pdHRfc3RyaW5nX2hhbmRsZSkpOyBcCisgICAgaWYgKGggIT0gTlVMTCkgeyBcCisgICAgICAgIGgtPnN0ckEgICA9IG5hbWUgPyBfX2l0dF9mc3RyZHVwKG5hbWUpIDogTlVMTDsgXAorICAgICAgICBoLT5zdHJXICAgPSBOVUxMOyBcCisgICAgICAgIGgtPmV4dHJhMSA9IDA7ICAgIC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+ZXh0cmEyID0gTlVMTDsgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5uZXh0ICAgPSBOVUxMOyBcCisgICAgICAgIGlmIChoX3RhaWwgPT0gTlVMTCkgXAorICAgICAgICAgICAgKGdwdHIpLT5zdHJpbmdfbGlzdCA9IGg7IFwKKyAgICAgICAgZWxzZSBcCisgICAgICAgICAgICBoX3RhaWwtPm5leHQgPSBoOyBcCisgICAgfSBcCit9CisKKyNlbmRpZiAvKiBfSVRUTk9USUZZX0NPTkZJR19IXyAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X3N0YXRpYy5jIGIvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X3N0YXRpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYzg3Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfc3RhdGljLmMKQEAgLTAsMCArMSwxMDU3IEBACisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJrbXBfY29uZmlnLmgiCisjaW5jbHVkZSAiaXR0bm90aWZ5X2NvbmZpZy5oIgorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIFBBVEhfTUFYIDUxMgorI2Vsc2UgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgSU5URUxfTk9fTUFDUk9fQk9EWQorI2RlZmluZSBJTlRFTF9JVFROT1RJRllfQVBJX1BSSVZBVEUKKyNpbmNsdWRlICJpdHRub3RpZnkuaCIKKyNpbmNsdWRlICJsZWdhY3kvaXR0bm90aWZ5LmgiCisKKyNpbmNsdWRlICJkaXNhYmxlX3dhcm5pbmdzLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIGFwaV92ZXJzaW9uW10gPSBBUElfVkVSU0lPTiAiXDBcbkAoIykgJFJldmlzaW9uOiA0MzM3NSAkXG4iOworCisjZGVmaW5lIF9OXyhuKSBJVFRfSk9JTihJTlRFTF9JVFROT1RJRllfUFJFRklYLG4pCisKKyNpZiBJVFRfT1M9PUlUVF9PU19XSU4KK3N0YXRpYyBjb25zdCBjaGFyKiBpdHRub3RpZnlfbGliX25hbWUgPSAibGliaXR0bm90aWZ5LmRsbCI7CisjZWxpZiBJVFRfT1M9PUlUVF9PU19MSU5VWAorc3RhdGljIGNvbnN0IGNoYXIqIGl0dG5vdGlmeV9saWJfbmFtZSA9ICJsaWJpdHRub3RpZnkuc28iOworI2VsaWYgSVRUX09TPT1JVFRfT1NfTUFDCitzdGF0aWMgY29uc3QgY2hhciogaXR0bm90aWZ5X2xpYl9uYW1lID0gImxpYml0dG5vdGlmeS5keWxpYiI7CisjZWxzZQorI2Vycm9yIFVuc3VwcG9ydGVkIG9yIHVua25vd24gT1MuCisjZW5kaWYKKworI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSA8YW5kcm9pZC9sb2cuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4KKworI2lmZGVmIElUVF9BTkRST0lEX0xPRworICAgICNkZWZpbmUgSVRUX0FORFJPSURfTE9HX1RBRyAgICJJTlRFTF9WVFVORV9VU0VSQVBJIgorICAgICNkZWZpbmUgSVRUX0FORFJPSURfTE9HSSguLi4pICgodm9pZClfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0lORk8sIElUVF9BTkRST0lEX0xPR19UQUcsIF9fVkFfQVJHU19fKSkKKyAgICAjZGVmaW5lIElUVF9BTkRST0lEX0xPR1coLi4uKSAoKHZvaWQpX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19XQVJOLCBJVFRfQU5EUk9JRF9MT0dfVEFHLCBfX1ZBX0FSR1NfXykpCisgICAgI2RlZmluZSBJVFRfQU5EUk9JRF9MT0dFKC4uLikgKCh2b2lkKV9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfRVJST1IsSVRUX0FORFJPSURfTE9HX1RBRywgX19WQV9BUkdTX18pKQorICAgICNkZWZpbmUgSVRUX0FORFJPSURfTE9HRCguLi4pICgodm9pZClfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0RFQlVHLElUVF9BTkRST0lEX0xPR19UQUcsIF9fVkFfQVJHU19fKSkKKyNlbHNlCisgICAgI2RlZmluZSBJVFRfQU5EUk9JRF9MT0dJKC4uLikKKyAgICAjZGVmaW5lIElUVF9BTkRST0lEX0xPR1coLi4uKQorICAgICNkZWZpbmUgSVRUX0FORFJPSURfTE9HRSguLi4pCisgICAgI2RlZmluZSBJVFRfQU5EUk9JRF9MT0dEKC4uLikKKyNlbmRpZgorCisvKiBkZWZhdWx0IGxvY2F0aW9uIG9mIHVzZXJhcGkgY29sbGVjdG9yIG9uIEFuZHJvaWQgKi8KKyNkZWZpbmUgQU5EUk9JRF9JVFROT1RJRllfREVGQVVMVF9QQVRIICAiL2RhdGEvZGF0YS9jb20uaW50ZWwudnR1bmUvaW50ZWwvbGliaXR0bm90aWZ5LnNvIgorI2VuZGlmCisKKworI2lmbmRlZiBMSUJfVkFSX05BTUUKKyNpZiBJVFRfQVJDSD09SVRUX0FSQ0hfSUEzMiB8fCBJVFRfQVJDSD09SVRUX0FSQ0hfQVJNIHx8IElUVF9BUkNIPT1JVFRfQVJDSF9NSVBTCisjZGVmaW5lIExJQl9WQVJfTkFNRSBJTlRFTF9MSUJJVFROT1RJRlkzMgorI2Vsc2UKKyNkZWZpbmUgTElCX1ZBUl9OQU1FIElOVEVMX0xJQklUVE5PVElGWTY0CisjZW5kaWYKKyNlbmRpZiAvKiBMSUJfVkFSX05BTUUgKi8KKworI2RlZmluZSBJVFRfTVVURVhfSU5JVF9BTkRfTE9DSyhwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIXAubXV0ZXhfaW5pdGlhbGl6ZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKF9faXR0X2ludGVybG9ja2VkX2luY3JlbWVudCgmcC5hdG9taWNfY291bnRlcikgPT0gMSkgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9faXR0X211dGV4X2luaXQoJnAubXV0ZXgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHAubXV0ZXhfaW5pdGlhbGl6ZWQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHdoaWxlICghcC5tdXRleF9pbml0aWFsaXplZCkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBfX2l0dF90aHJlYWRfeWllbGQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2l0dF9tdXRleF9sb2NrKCZwLm11dGV4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitjb25zdCBpbnQgX05fKGVycikgPSAwOworCit0eXBlZGVmIGludCAoX19pdHRfaW5pdF9pdHRsaWJfdCkoY29uc3QgY2hhciosIF9faXR0X2dyb3VwX2lkKTsKKworLyogdGhpcyBkZWZpbmUgdXNlZCB0byBjb250cm9sIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIG5hbWUuICovCisjaWZuZGVmIF9faXR0X2luaXRfaXR0bGliX25hbWUKK0lUVF9FWFRFUk5fQyBpbnQgX05fKGluaXRfaXR0bGliKShjb25zdCBjaGFyKiwgX19pdHRfZ3JvdXBfaWQpOworc3RhdGljIF9faXR0X2luaXRfaXR0bGliX3QqIF9faXR0X2luaXRfaXR0bGliX3B0ciA9IF9OXyhpbml0X2l0dGxpYik7CisjZGVmaW5lIF9faXR0X2luaXRfaXR0bGliX25hbWUgX19pdHRfaW5pdF9pdHRsaWJfcHRyCisjZW5kaWYgLyogX19pdHRfaW5pdF9pdHRsaWJfbmFtZSAqLworCit0eXBlZGVmIHZvaWQgKF9faXR0X2ZpbmlfaXR0bGliX3QpKHZvaWQpOworCisvKiB0aGlzIGRlZmluZSB1c2VkIHRvIGNvbnRyb2wgZmluYWxpemF0aW9uIGZ1bmN0aW9uIG5hbWUuICovCisjaWZuZGVmIF9faXR0X2ZpbmlfaXR0bGliX25hbWUKK0lUVF9FWFRFUk5fQyB2b2lkIF9OXyhmaW5pX2l0dGxpYikodm9pZCk7CitzdGF0aWMgX19pdHRfZmluaV9pdHRsaWJfdCogX19pdHRfZmluaV9pdHRsaWJfcHRyID0gX05fKGZpbmlfaXR0bGliKTsKKyNkZWZpbmUgX19pdHRfZmluaV9pdHRsaWJfbmFtZSBfX2l0dF9maW5pX2l0dGxpYl9wdHIKKyNlbmRpZiAvKiBfX2l0dF9maW5pX2l0dGxpYl9uYW1lICovCisKKy8qIGJ1aWxkaW5nIHBvaW50ZXJzIHRvIGltcG9ydGVkIGZ1bmNzICovCisjdW5kZWYgSVRUX1NUVUJWCisjdW5kZWYgSVRUX1NUVUIKKyNkZWZpbmUgSVRUX1NUVUIoYXBpLHR5cGUsbmFtZSxhcmdzLHBhcmFtcyxwdHIsZ3JvdXAsZm9ybWF0KSAgIFwKK3N0YXRpYyB0eXBlIGFwaSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKSBhcmdzO1wKK3R5cGVkZWYgdHlwZSBhcGkgSVRUX0pPSU4oX05fKG5hbWUpLF90KSBhcmdzOyAgICAgICAgICAgICAgICAgIFwKK0lUVF9FWFRFUk5fQ19CRUdJTiBJVFRfSk9JTihfTl8obmFtZSksX3QpKiBJVFROT1RJRllfTkFNRShuYW1lKSA9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpOyBJVFRfRVhURVJOX0NfRU5EIFwKK3N0YXRpYyB0eXBlIGFwaSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKSBhcmdzIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7ICAgICAgICAgICAgIFwKKyAgICBpZiAoSVRUTk9USUZZX05BTUUobmFtZSkgJiYgSVRUTk9USUZZX05BTUUobmFtZSkgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSkpIFwKKyAgICAgICAgcmV0dXJuIElUVE5PVElGWV9OQU1FKG5hbWUpIHBhcmFtczsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuICh0eXBlKTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBJVFRfU1RVQlYoYXBpLHR5cGUsbmFtZSxhcmdzLHBhcmFtcyxwdHIsZ3JvdXAsZm9ybWF0KSAgXAorc3RhdGljIHR5cGUgYXBpIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpIGFyZ3M7XAordHlwZWRlZiB0eXBlIGFwaSBJVFRfSk9JTihfTl8obmFtZSksX3QpIGFyZ3M7ICAgICAgICAgICAgICAgICAgXAorSVRUX0VYVEVSTl9DX0JFR0lOIElUVF9KT0lOKF9OXyhuYW1lKSxfdCkqIElUVE5PVElGWV9OQU1FKG5hbWUpID0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSk7IElUVF9FWFRFUk5fQ19FTkQgXAorc3RhdGljIHR5cGUgYXBpIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpIGFyZ3MgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9faXR0X2luaXRfaXR0bGliX25hbWUoTlVMTCwgX19pdHRfZ3JvdXBfYWxsKTsgICAgICAgICAgICAgXAorICAgIGlmIChJVFROT1RJRllfTkFNRShuYW1lKSAmJiBJVFROT1RJRllfTkFNRShuYW1lKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKSkgXAorICAgICAgICBJVFROT1RJRllfTkFNRShuYW1lKSBwYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjdW5kZWYgX19JVFRfSU5URVJOQUxfSU5JVAorI2luY2x1ZGUgIml0dG5vdGlmeV9zdGF0aWMuaCIKKworI3VuZGVmIElUVF9TVFVCCisjdW5kZWYgSVRUX1NUVUJWCisjZGVmaW5lIElUVF9TVFVCKGFwaSx0eXBlLG5hbWUsYXJncyxwYXJhbXMscHRyLGdyb3VwLGZvcm1hdCkgICBcCitzdGF0aWMgdHlwZSBhcGkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSkgYXJncztcCit0eXBlZGVmIHR5cGUgYXBpIElUVF9KT0lOKF9OXyhuYW1lKSxfdCkgYXJnczsgICAgICAgICAgICAgICAgICBcCitJVFRfRVhURVJOX0NfQkVHSU4gSVRUX0pPSU4oX05fKG5hbWUpLF90KSogSVRUTk9USUZZX05BTUUobmFtZSkgPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKTsgSVRUX0VYVEVSTl9DX0VORAorCisjZGVmaW5lIElUVF9TVFVCVihhcGksdHlwZSxuYW1lLGFyZ3MscGFyYW1zLHB0cixncm91cCxmb3JtYXQpICBcCitzdGF0aWMgdHlwZSBhcGkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSkgYXJncztcCit0eXBlZGVmIHR5cGUgYXBpIElUVF9KT0lOKF9OXyhuYW1lKSxfdCkgYXJnczsgICAgICAgICAgICAgICAgICBcCitJVFRfRVhURVJOX0NfQkVHSU4gSVRUX0pPSU4oX05fKG5hbWUpLF90KSogSVRUTk9USUZZX05BTUUobmFtZSkgPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKTsgSVRUX0VYVEVSTl9DX0VORAorCisjZGVmaW5lIF9fSVRUX0lOVEVSTkFMX0lOSVQKKyNpbmNsdWRlICJpdHRub3RpZnlfc3RhdGljLmgiCisjdW5kZWYgX19JVFRfSU5URVJOQUxfSU5JVAorCitJVFRfR1JPVVBfTElTVChncm91cF9saXN0KTsKKworI3ByYWdtYSBwYWNrKHB1c2gsIDgpCisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9ncm91cF9hbGlhcworeworICAgIGNvbnN0IGNoYXIqICAgIGVudl92YXI7CisgICAgX19pdHRfZ3JvdXBfaWQgZ3JvdXBzOworfSBfX2l0dF9ncm91cF9hbGlhczsKKworc3RhdGljIF9faXR0X2dyb3VwX2FsaWFzIGdyb3VwX2FsaWFzW10gPSB7CisgICAgeyAiS01QX0ZPUl9UUFJPRklMRSIsIChfX2l0dF9ncm91cF9pZCkoX19pdHRfZ3JvdXBfY29udHJvbCB8IF9faXR0X2dyb3VwX3RocmVhZCB8IF9faXR0X2dyb3VwX3N5bmMgIHwgX19pdHRfZ3JvdXBfbWFyaykgfSwKKyAgICB7ICJLTVBfRk9SX1RDSEVDSyIsICAgKF9faXR0X2dyb3VwX2lkKShfX2l0dF9ncm91cF9jb250cm9sIHwgX19pdHRfZ3JvdXBfdGhyZWFkIHwgX19pdHRfZ3JvdXBfc3luYyAgfCBfX2l0dF9ncm91cF9mc3luYyB8IF9faXR0X2dyb3VwX21hcmsgfCBfX2l0dF9ncm91cF9zdXBwcmVzcykgfSwKKyAgICB7IE5VTEwsICAgICAgICAgICAgICAgKF9faXR0X2dyb3VwX25vbmUpIH0sCisgICAgeyBhcGlfdmVyc2lvbiwgICAgICAgIChfX2l0dF9ncm91cF9ub25lKSB9IC8qICEhISBKdXN0IHRvIGF2b2lkIHVudXNlZCBjb2RlIGVsaW1pbmF0aW9uICEhISAqLworfTsKKworI3ByYWdtYSBwYWNrKHBvcCkKKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI3ByYWdtYSB3YXJuaW5nKHB1c2gpCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDA1NCkgLyogd2FybmluZyBDNDA1NDogJ3R5cGUgY2FzdCcgOiBmcm9tIGZ1bmN0aW9uIHBvaW50ZXIgJ1hYWCcgdG8gZGF0YSBwb2ludGVyICd2b2lkIConICovCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKK3N0YXRpYyBfX2l0dF9hcGlfaW5mbyBhcGlfbGlzdFtdID0geworLyogRGVmaW5lIGZ1bmN0aW9ucyB3aXRoIHN0YXRpYyBpbXBsZW1lbnRhdGlvbiAqLworI3VuZGVmIElUVF9TVFVCCisjdW5kZWYgSVRUX1NUVUJWCisjZGVmaW5lIElUVF9TVFVCKGFwaSx0eXBlLG5hbWUsYXJncyxwYXJhbXMsbmFtZWluZGxsLGdyb3VwLGZvcm1hdCkgeyBJVFRfVE9fU1RSKElUVF9KT0lOKF9faXR0XyxuYW1laW5kbGwpKSwgKHZvaWQqKikodm9pZCopJklUVE5PVElGWV9OQU1FKG5hbWUpLCAodm9pZCopKHNpemVfdCkmSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSksICh2b2lkKikoc2l6ZV90KSZJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKSwgKF9faXR0X2dyb3VwX2lkKShncm91cCl9LAorI2RlZmluZSBJVFRfU1RVQlYgSVRUX1NUVUIKKyNkZWZpbmUgX19JVFRfSU5URVJOQUxfSU5JVAorI2luY2x1ZGUgIml0dG5vdGlmeV9zdGF0aWMuaCIKKyN1bmRlZiBfX0lUVF9JTlRFUk5BTF9JTklUCisvKiBEZWZpbmUgZnVuY3Rpb25zIHdpdGhvdXQgc3RhdGljIGltcGxlbWVudGF0aW9uICovCisjdW5kZWYgSVRUX1NUVUIKKyN1bmRlZiBJVFRfU1RVQlYKKyNkZWZpbmUgSVRUX1NUVUIoYXBpLHR5cGUsbmFtZSxhcmdzLHBhcmFtcyxuYW1laW5kbGwsZ3JvdXAsZm9ybWF0KSB7SVRUX1RPX1NUUihJVFRfSk9JTihfX2l0dF8sbmFtZWluZGxsKSksICh2b2lkKiopKHZvaWQqKSZJVFROT1RJRllfTkFNRShuYW1lKSwgKHZvaWQqKShzaXplX3QpJklUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpLCBOVUxMLCAoX19pdHRfZ3JvdXBfaWQpKGdyb3VwKX0sCisjZGVmaW5lIElUVF9TVFVCViBJVFRfU1RVQgorI2luY2x1ZGUgIml0dG5vdGlmeV9zdGF0aWMuaCIKKyAgICB7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgX19pdHRfZ3JvdXBfbm9uZX0KK307CisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNwcmFnbWEgd2FybmluZyhwb3ApCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qIHByaXZhdGUsIGluaXQgdGhyZWFkIGluZm8gaXRlbS4gdXNlZCBmb3IgaW50ZXJuYWwgcHVycG9zZXMgKi8KK3N0YXRpYyBfX2l0dF90aHJlYWRfaW5mbyBpbml0X3RocmVhZF9pbmZvID0geworICAgIChjb25zdCBjaGFyKilOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5hbWVBICovCisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorICAgIChjb25zdCB3Y2hhcl90KilOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIG5hbWVXICovCisjZWxzZQorICAgICh2b2lkKilOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5hbWVXICovCisjZW5kaWYKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aWQgKi8KKyAgICBfX2l0dF90aHJlYWRfbm9ybWFsLCAgICAgICAgICAgICAgICAgICAgICAvKiBzdGF0ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4dHJhMSAqLworICAgICh2b2lkKilOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4dHJhMiAqLworICAgIChfX2l0dF90aHJlYWRfaW5mbyopTlVMTCAgICAgICAgICAgICAgICAgIC8qIG5leHQgKi8KK307CisKKy8qIHByaXZhdGUsIE5VTEwgZG9tYWluIGl0ZW0uIHVzZWQgZm9yIGludGVybmFsIHB1cnBvc2VzICovCitzdGF0aWMgX19pdHRfZG9tYWluIG51bGxfZG9tYWluID0geworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWdzOiAgZGlzYWJsZWQgYnkgZGVmYXVsdCAqLworICAgIChjb25zdCBjaGFyKilOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5hbWVBICovCisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorICAgIChjb25zdCB3Y2hhcl90KilOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIG5hbWVXICovCisjZWxzZQorICAgICh2b2lkKilOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5hbWVXICovCisjZW5kaWYKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBleHRyYTEgKi8KKyAgICAodm9pZCopTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBleHRyYTIgKi8KKyAgICAoX19pdHRfZG9tYWluKilOVUxMICAgICAgICAgICAgICAgICAgICAgICAvKiBuZXh0ICovCit9OworCisvKiBwcml2YXRlLCBOVUxMIHN0cmluZyBoYW5kbGUgaXRlbS4gdXNlZCBmb3IgaW50ZXJuYWwgcHVycG9zZXMgKi8KK3N0YXRpYyBfX2l0dF9zdHJpbmdfaGFuZGxlIG51bGxfc3RyaW5nX2hhbmRsZSA9IHsKKyAgICAoY29uc3QgY2hhciopTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdHJBICovCisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorICAgIChjb25zdCB3Y2hhcl90KilOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIHN0clcgKi8KKyNlbHNlCisgICAgKHZvaWQqKU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RyVyAqLworI2VuZGlmCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXh0cmExICovCisgICAgKHZvaWQqKU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXh0cmEyICovCisgICAgKF9faXR0X3N0cmluZ19oYW5kbGUqKU5VTEwgICAgICAgICAgICAgICAgLyogbmV4dCAqLworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgZGxsX3BhdGhbUEFUSF9NQVhdID0geyAwIH07CisKKy8qIHN0YXRpYyBwYXJ0IGRlc2NyaXB0b3Igd2hpY2ggaGFuZGxlcy4gYWxsIG5vdGlmaWNhdGlvbiBhcGkgYXR0cmlidXRlcy4gKi8KK19faXR0X2dsb2JhbCBfTl8oX2l0dGFwaV9nbG9iYWwpID0geworICAgIElUVF9NQUdJQywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWRlbnRpZmljYXRpb24gaW5mbyAqLworICAgIElUVF9NQUpPUiwgSVRUX01JTk9SLCBBUElfVkVSU0lPTl9CVUlMRCwgICAgICAgLyogdmVyc2lvbiBpbmZvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcGlfaW5pdGlhbGl6ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11dGV4X2luaXRpYWxpemVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhdG9taWNfY291bnRlciAqLworICAgIE1VVEVYX0lOSVRJQUxJWkVSLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXV0ZXggKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMgbGlicmFyeSBoYW5kbGUgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVycm9yX2hhbmRsZXIgKi8KKyAgICAoY29uc3QgY2hhcioqKSZkbGxfcGF0aCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGRsbF9wYXRoX3B0ciAqLworICAgIChfX2l0dF9hcGlfaW5mbyopJmFwaV9saXN0LCAgICAgICAgICAgICAgICAgICAgLyogYXBpX2xpc3RfcHRyICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IF9faXR0X2dsb2JhbCAqLworICAgIChfX2l0dF90aHJlYWRfaW5mbyopJmluaXRfdGhyZWFkX2luZm8sICAgICAgICAgLyogdGhyZWFkX2xpc3QgKi8KKyAgICAoX19pdHRfZG9tYWluKikmbnVsbF9kb21haW4sICAgICAgICAgICAgICAgICAgIC8qIGRvbWFpbl9saXN0ICovCisgICAgKF9faXR0X3N0cmluZ19oYW5kbGUqKSZudWxsX3N0cmluZ19oYW5kbGUsICAgICAvKiBzdHJpbmdfbGlzdCAqLworICAgIF9faXR0X2NvbGxlY3Rpb25fbm9ybWFsICAgICAgICAgICAgICAgICAgICAgICAgLyogY29sbGVjdGlvbiBzdGF0ZSAqLworfTsKKwordHlwZWRlZiB2b2lkIChfX2l0dF9hcGlfaW5pdF90KShfX2l0dF9nbG9iYWwqLCBfX2l0dF9ncm91cF9pZCk7Cit0eXBlZGVmIHZvaWQgKF9faXR0X2FwaV9maW5pX3QpKF9faXR0X2dsb2JhbCopOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyNpZmRlZiBJVFRfTk9USUZZX0VYVF9SRVBPUlQKK0lUVF9FWFRFUk5fQyB2b2lkIF9OXyhlcnJvcl9oYW5kbGVyKShfX2l0dF9lcnJvcl9jb2RlLCB2YV9saXN0IGFyZ3MpOworI2VuZGlmIC8qIElUVF9OT1RJRllfRVhUX1JFUE9SVCAqLworCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjcHJhZ21hIHdhcm5pbmcocHVzaCkKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0MDU1KSAvKiB3YXJuaW5nIEM0MDU1OiAndHlwZSBjYXN0JyA6IGZyb20gZGF0YSBwb2ludGVyICd2b2lkIConIHRvIGZ1bmN0aW9uIHBvaW50ZXIgJ1hYWCcgKi8KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworc3RhdGljIHZvaWQgX19pdHRfcmVwb3J0X2Vycm9yKHVuc2lnbmVkIGNvZGVfYXJnLCAuLi4pCit7CisgICAgdmFfbGlzdCBhcmdzOworICAgIHZhX3N0YXJ0KGFyZ3MsIGNvZGVfYXJnKTsKKworICAgIC8vIFdlIHVzZSB1bnNpZ25lZCBmb3IgdGhlIGNvZGUgYXJndW1lbnQgYW5kIGV4cGxpY2l0bHkgY2FzdCBpdCBoZXJlIHRvIHRoZQorICAgIC8vIHJpZ2h0IGVudW1lcmF0b3IgYmVjYXVzZSB2YXJpYWRpYyBmdW5jdGlvbnMgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGgKKyAgICAvLyBkZWZhdWx0IHByb21vdGlvbnMuCisgICAgX19pdHRfZXJyb3JfY29kZSBjb2RlID0gKF9faXR0X2Vycm9yX2NvZGUpY29kZV9hcmc7CisKKyAgICBpZiAoX05fKF9pdHRhcGlfZ2xvYmFsKS5lcnJvcl9oYW5kbGVyICE9IE5VTEwpCisgICAgeworICAgICAgICBfX2l0dF9lcnJvcl9oYW5kbGVyX3QqIGhhbmRsZXIgPSAoX19pdHRfZXJyb3JfaGFuZGxlcl90Kikoc2l6ZV90KV9OXyhfaXR0YXBpX2dsb2JhbCkuZXJyb3JfaGFuZGxlcjsKKyAgICAgICAgaGFuZGxlcihjb2RlLCBhcmdzKTsKKyAgICB9CisjaWZkZWYgSVRUX05PVElGWV9FWFRfUkVQT1JUCisgICAgX05fKGVycm9yX2hhbmRsZXIpKGNvZGUsIGFyZ3MpOworI2VuZGlmIC8qIElUVF9OT1RJRllfRVhUX1JFUE9SVCAqLworICAgIHZhX2VuZChhcmdzKTsKK30KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI3ByYWdtYSB3YXJuaW5nKHBvcCkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorc3RhdGljIF9faXR0X2RvbWFpbiogSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhkb21haW5fY3JlYXRlVyksX2luaXQpKShjb25zdCB3Y2hhcl90KiBuYW1lKQoreworICAgIF9faXR0X2RvbWFpbiAqaF90YWlsLCAqaDsKKworICAgIGlmICghX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgJiYgX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdC0+dGlkID09IDApCisgICAgeworICAgICAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7CisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRShkb21haW5fY3JlYXRlVykgJiYgSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZVcpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhkb21haW5fY3JlYXRlVyksX2luaXQpKSkKKyAgICAgICAgICAgIHJldHVybiBJVFROT1RJRllfTkFNRShkb21haW5fY3JlYXRlVykobmFtZSk7CisgICAgfQorCisgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIF9OXyhfaXR0YXBpX2dsb2JhbCkuZG9tYWluX2xpc3Q7CisKKyAgICBJVFRfTVVURVhfSU5JVF9BTkRfTE9DSyhfTl8oX2l0dGFwaV9nbG9iYWwpKTsKKyAgICBmb3IgKGhfdGFpbCA9IE5VTEwsIGggPSBfTl8oX2l0dGFwaV9nbG9iYWwpLmRvbWFpbl9saXN0OyBoICE9IE5VTEw7IGhfdGFpbCA9IGgsIGggPSBoLT5uZXh0KQorICAgICAgICBpZiAoaC0+bmFtZVcgIT0gTlVMTCAmJiAhd2NzY21wKGgtPm5hbWVXLCBuYW1lKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIGlmIChoID09IE5VTEwpIHsKKyAgICAgICAgTkVXX0RPTUFJTl9XKCZfTl8oX2l0dGFwaV9nbG9iYWwpLGgsaF90YWlsLG5hbWUpOworICAgIH0KKyAgICBfX2l0dF9tdXRleF91bmxvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworICAgIHJldHVybiBoOworfQorCitzdGF0aWMgX19pdHRfZG9tYWluKiBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKGRvbWFpbl9jcmVhdGVBKSxfaW5pdCkpKGNvbnN0IGNoYXIqIG5hbWUpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitzdGF0aWMgX19pdHRfZG9tYWluKiBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKGRvbWFpbl9jcmVhdGUpLF9pbml0KSkoY29uc3QgY2hhciogbmFtZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK3sKKyAgICBfX2l0dF9kb21haW4gKmhfdGFpbCwgKmg7CisKKyAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkICYmIF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3QtPnRpZCA9PSAwKQorICAgIHsKKyAgICAgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZUEpICYmIElUVE5PVElGWV9OQU1FKGRvbWFpbl9jcmVhdGVBKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oZG9tYWluX2NyZWF0ZUEpLF9pbml0KSkpCisgICAgICAgICAgICByZXR1cm4gSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZUEpKG5hbWUpOworI2Vsc2UKKyAgICAgICAgaWYgKElUVE5PVElGWV9OQU1FKGRvbWFpbl9jcmVhdGUpICYmIElUVE5PVElGWV9OQU1FKGRvbWFpbl9jcmVhdGUpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhkb21haW5fY3JlYXRlKSxfaW5pdCkpKQorICAgICAgICAgICAgcmV0dXJuIElUVE5PVElGWV9OQU1FKGRvbWFpbl9jcmVhdGUpKG5hbWUpOworI2VuZGlmCisgICAgfQorCisgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIF9OXyhfaXR0YXBpX2dsb2JhbCkuZG9tYWluX2xpc3Q7CisKKyAgICBJVFRfTVVURVhfSU5JVF9BTkRfTE9DSyhfTl8oX2l0dGFwaV9nbG9iYWwpKTsKKyAgICBmb3IgKGhfdGFpbCA9IE5VTEwsIGggPSBfTl8oX2l0dGFwaV9nbG9iYWwpLmRvbWFpbl9saXN0OyBoICE9IE5VTEw7IGhfdGFpbCA9IGgsIGggPSBoLT5uZXh0KQorICAgICAgICBpZiAoaC0+bmFtZUEgIT0gTlVMTCAmJiAhX19pdHRfZnN0cmNtcChoLT5uYW1lQSwgbmFtZSkpCisgICAgICAgICAgICBicmVhazsKKyAgICBpZiAoaCA9PSBOVUxMKSB7CisgICAgICAgIE5FV19ET01BSU5fQSgmX05fKF9pdHRhcGlfZ2xvYmFsKSxoLGhfdGFpbCxuYW1lKTsKKyAgICB9CisgICAgX19pdHRfbXV0ZXhfdW5sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKKyAgICByZXR1cm4gaDsKK30KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorc3RhdGljIF9faXR0X3N0cmluZ19oYW5kbGUqIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oc3RyaW5nX2hhbmRsZV9jcmVhdGVXKSxfaW5pdCkpKGNvbnN0IHdjaGFyX3QqIG5hbWUpCit7CisgICAgX19pdHRfc3RyaW5nX2hhbmRsZSAqaF90YWlsLCAqaDsKKworICAgIGlmICghX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgJiYgX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdC0+dGlkID09IDApCisgICAgeworICAgICAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7CisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRShzdHJpbmdfaGFuZGxlX2NyZWF0ZVcpICYmIElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlVykgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHN0cmluZ19oYW5kbGVfY3JlYXRlVyksX2luaXQpKSkKKyAgICAgICAgICAgIHJldHVybiBJVFROT1RJRllfTkFNRShzdHJpbmdfaGFuZGxlX2NyZWF0ZVcpKG5hbWUpOworICAgIH0KKworICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgIHJldHVybiBfTl8oX2l0dGFwaV9nbG9iYWwpLnN0cmluZ19saXN0OworCisgICAgSVRUX01VVEVYX0lOSVRfQU5EX0xPQ0soX05fKF9pdHRhcGlfZ2xvYmFsKSk7CisgICAgZm9yIChoX3RhaWwgPSBOVUxMLCBoID0gX05fKF9pdHRhcGlfZ2xvYmFsKS5zdHJpbmdfbGlzdDsgaCAhPSBOVUxMOyBoX3RhaWwgPSBoLCBoID0gaC0+bmV4dCkKKyAgICAgICAgaWYgKGgtPnN0clcgIT0gTlVMTCAmJiAhd2NzY21wKGgtPnN0clcsIG5hbWUpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgaWYgKGggPT0gTlVMTCkgeworICAgICAgICBORVdfU1RSSU5HX0hBTkRMRV9XKCZfTl8oX2l0dGFwaV9nbG9iYWwpLGgsaF90YWlsLG5hbWUpOworICAgIH0KKyAgICBfX2l0dF9tdXRleF91bmxvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworICAgIHJldHVybiBoOworfQorCitzdGF0aWMgX19pdHRfc3RyaW5nX2hhbmRsZSogSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhzdHJpbmdfaGFuZGxlX2NyZWF0ZUEpLF9pbml0KSkoY29uc3QgY2hhciogbmFtZSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK3N0YXRpYyBfX2l0dF9zdHJpbmdfaGFuZGxlKiBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHN0cmluZ19oYW5kbGVfY3JlYXRlKSxfaW5pdCkpKGNvbnN0IGNoYXIqIG5hbWUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCit7CisgICAgX19pdHRfc3RyaW5nX2hhbmRsZSAqaF90YWlsLCAqaDsKKworICAgIGlmICghX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgJiYgX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdC0+dGlkID09IDApCisgICAgeworICAgICAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7CisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRShzdHJpbmdfaGFuZGxlX2NyZWF0ZUEpICYmIElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlQSkgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHN0cmluZ19oYW5kbGVfY3JlYXRlQSksX2luaXQpKSkKKyAgICAgICAgICAgIHJldHVybiBJVFROT1RJRllfTkFNRShzdHJpbmdfaGFuZGxlX2NyZWF0ZUEpKG5hbWUpOworI2Vsc2UKKyAgICAgICAgaWYgKElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlKSAmJiBJVFROT1RJRllfTkFNRShzdHJpbmdfaGFuZGxlX2NyZWF0ZSkgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHN0cmluZ19oYW5kbGVfY3JlYXRlKSxfaW5pdCkpKQorICAgICAgICAgICAgcmV0dXJuIElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlKShuYW1lKTsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgIHJldHVybiBfTl8oX2l0dGFwaV9nbG9iYWwpLnN0cmluZ19saXN0OworCisgICAgSVRUX01VVEVYX0lOSVRfQU5EX0xPQ0soX05fKF9pdHRhcGlfZ2xvYmFsKSk7CisgICAgZm9yIChoX3RhaWwgPSBOVUxMLCBoID0gX05fKF9pdHRhcGlfZ2xvYmFsKS5zdHJpbmdfbGlzdDsgaCAhPSBOVUxMOyBoX3RhaWwgPSBoLCBoID0gaC0+bmV4dCkKKyAgICAgICAgaWYgKGgtPnN0ckEgIT0gTlVMTCAmJiAhX19pdHRfZnN0cmNtcChoLT5zdHJBLCBuYW1lKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIGlmIChoID09IE5VTEwpIHsKKyAgICAgICAgTkVXX1NUUklOR19IQU5ETEVfQSgmX05fKF9pdHRhcGlfZ2xvYmFsKSxoLGhfdGFpbCxuYW1lKTsKKyAgICB9CisgICAgX19pdHRfbXV0ZXhfdW5sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKKyAgICByZXR1cm4gaDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhwYXVzZSksX2luaXQpKSh2b2lkKQoreworICAgIGlmICghX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgJiYgX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdC0+dGlkID09IDApCisgICAgeworICAgICAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7CisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRShwYXVzZSkgJiYgSVRUTk9USUZZX05BTUUocGF1c2UpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhwYXVzZSksX2luaXQpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSVRUTk9USUZZX05BTUUocGF1c2UpKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgX05fKF9pdHRhcGlfZ2xvYmFsKS5zdGF0ZSA9IF9faXR0X2NvbGxlY3Rpb25fcGF1c2VkOworfQorCitzdGF0aWMgdm9pZCBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHJlc3VtZSksX2luaXQpKSh2b2lkKQoreworICAgIGlmICghX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgJiYgX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdC0+dGlkID09IDApCisgICAgeworICAgICAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7CisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRShyZXN1bWUpICYmIElUVE5PVElGWV9OQU1FKHJlc3VtZSkgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHJlc3VtZSksX2luaXQpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSVRUTk9USUZZX05BTUUocmVzdW1lKSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIF9OXyhfaXR0YXBpX2dsb2JhbCkuc3RhdGUgPSBfX2l0dF9jb2xsZWN0aW9uX25vcm1hbDsKK30KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorc3RhdGljIHZvaWQgSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJlYWRfc2V0X25hbWVXKSxfaW5pdCkpKGNvbnN0IHdjaGFyX3QqIG5hbWUpCit7CisgICAgVElEVCB0aWQgPSBfX2l0dF90aHJlYWRfaWQoKTsKKyAgICBfX2l0dF90aHJlYWRfaW5mbyAqaF90YWlsLCAqaDsKKworICAgIGlmICghX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgJiYgX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdC0+dGlkID09IDApCisgICAgeworICAgICAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7CisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRSh0aHJlYWRfc2V0X25hbWVXKSAmJiBJVFROT1RJRllfTkFNRSh0aHJlYWRfc2V0X25hbWVXKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX3NldF9uYW1lVyksX2luaXQpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lVykobmFtZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX2l0dF9tdXRleF9sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKKyAgICBmb3IgKGhfdGFpbCA9IE5VTEwsIGggPSBfTl8oX2l0dGFwaV9nbG9iYWwpLnRocmVhZF9saXN0OyBoICE9IE5VTEw7IGhfdGFpbCA9IGgsIGggPSBoLT5uZXh0KQorICAgICAgICBpZiAoaC0+dGlkID09IHRpZCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIGlmIChoID09IE5VTEwpIHsKKyAgICAgICAgTkVXX1RIUkVBRF9JTkZPX1coJl9OXyhfaXR0YXBpX2dsb2JhbCksIGgsIGhfdGFpbCwgdGlkLCBfX2l0dF90aHJlYWRfbm9ybWFsLCBuYW1lKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaC0+bmFtZVcgPSBuYW1lID8gX3djc2R1cChuYW1lKSA6IE5VTEw7CisgICAgfQorICAgIF9faXR0X211dGV4X3VubG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7Cit9CisKK3N0YXRpYyBpbnQgSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJfbmFtZV9zZXRXKSxfaW5pdCkpKGNvbnN0IHdjaGFyX3QqIG5hbWUsIGludCBuYW1lbGVuKQoreworICAgIG5hbWVsZW4gPSBuYW1lbGVuOworICAgIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJlYWRfc2V0X25hbWVXKSxfaW5pdCkpKG5hbWUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9zZXRfbmFtZUEpLF9pbml0KSkoY29uc3QgY2hhciogbmFtZSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK3N0YXRpYyB2b2lkIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX3NldF9uYW1lKSxfaW5pdCkpKGNvbnN0IGNoYXIqIG5hbWUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCit7CisgICAgVElEVCB0aWQgPSBfX2l0dF90aHJlYWRfaWQoKTsKKyAgICBfX2l0dF90aHJlYWRfaW5mbyAqaF90YWlsLCAqaDsKKworICAgIGlmICghX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgJiYgX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdC0+dGlkID09IDApCisgICAgeworICAgICAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7CisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRSh0aHJlYWRfc2V0X25hbWVBKSAmJiBJVFROT1RJRllfTkFNRSh0aHJlYWRfc2V0X25hbWVBKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX3NldF9uYW1lQSksX2luaXQpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lQSkobmFtZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyAgICAgICAgaWYgKElUVE5PVElGWV9OQU1FKHRocmVhZF9zZXRfbmFtZSkgJiYgSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX3NldF9uYW1lKSxfaW5pdCkpKQorICAgICAgICB7CisgICAgICAgICAgICBJVFROT1RJRllfTkFNRSh0aHJlYWRfc2V0X25hbWUpKG5hbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisgICAgfQorCisgICAgX19pdHRfbXV0ZXhfbG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7CisgICAgZm9yIChoX3RhaWwgPSBOVUxMLCBoID0gX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdDsgaCAhPSBOVUxMOyBoX3RhaWwgPSBoLCBoID0gaC0+bmV4dCkKKyAgICAgICAgaWYgKGgtPnRpZCA9PSB0aWQpCisgICAgICAgICAgICBicmVhazsKKyAgICBpZiAoaCA9PSBOVUxMKSB7CisgICAgICAgIE5FV19USFJFQURfSU5GT19BKCZfTl8oX2l0dGFwaV9nbG9iYWwpLCBoLCBoX3RhaWwsIHRpZCwgX19pdHRfdGhyZWFkX25vcm1hbCwgbmFtZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGgtPm5hbWVBID0gbmFtZSA/IF9faXR0X2ZzdHJkdXAobmFtZSkgOiBOVUxMOworICAgIH0KKyAgICBfX2l0dF9tdXRleF91bmxvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworfQorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitzdGF0aWMgaW50IElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyX25hbWVfc2V0QSksX2luaXQpKShjb25zdCBjaGFyKiBuYW1lLCBpbnQgbmFtZWxlbikKK3sKKyAgICBuYW1lbGVuID0gbmFtZWxlbjsKKyAgICBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX3NldF9uYW1lQSksX2luaXQpKShuYW1lKTsKKyAgICByZXR1cm4gMDsKK30KKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK3N0YXRpYyBpbnQgSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJfbmFtZV9zZXQpLF9pbml0KSkoY29uc3QgY2hhciogbmFtZSwgaW50IG5hbWVsZW4pCit7CisgICAgbmFtZWxlbiA9IG5hbWVsZW47CisgICAgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9zZXRfbmFtZSksX2luaXQpKShuYW1lKTsKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworc3RhdGljIHZvaWQgSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJlYWRfaWdub3JlKSxfaW5pdCkpKHZvaWQpCit7CisgICAgVElEVCB0aWQgPSBfX2l0dF90aHJlYWRfaWQoKTsKKyAgICBfX2l0dF90aHJlYWRfaW5mbyAqaF90YWlsLCAqaDsKKworICAgIGlmICghX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgJiYgX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdC0+dGlkID09IDApCisgICAgeworICAgICAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7CisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRSh0aHJlYWRfaWdub3JlKSAmJiBJVFROT1RJRllfTkFNRSh0aHJlYWRfaWdub3JlKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX2lnbm9yZSksX2luaXQpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGhyZWFkX2lnbm9yZSkoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9faXR0X211dGV4X2xvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworICAgIGZvciAoaF90YWlsID0gTlVMTCwgaCA9IF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3Q7IGggIT0gTlVMTDsgaF90YWlsID0gaCwgaCA9IGgtPm5leHQpCisgICAgICAgIGlmIChoLT50aWQgPT0gdGlkKQorICAgICAgICAgICAgYnJlYWs7CisgICAgaWYgKGggPT0gTlVMTCkgeworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogbmFtZSA9ICJ1bmtub3duIjsKKyAgICAgICAgTkVXX1RIUkVBRF9JTkZPX0EoJl9OXyhfaXR0YXBpX2dsb2JhbCksIGgsIGhfdGFpbCwgdGlkLCBfX2l0dF90aHJlYWRfaWdub3JlZCwgbmFtZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGgtPnN0YXRlID0gX19pdHRfdGhyZWFkX2lnbm9yZWQ7CisgICAgfQorICAgIF9faXR0X211dGV4X3VubG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyX2lnbm9yZSksX2luaXQpKSh2b2lkKQoreworICAgIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJlYWRfaWdub3JlKSxfaW5pdCkpKCk7Cit9CisKK3N0YXRpYyB2b2lkIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oZW5hYmxlX2F0dGFjaCksX2luaXQpKSh2b2lkKQoreworI2lmZGVmIF9fQU5EUk9JRF9fCisgICAgLyoKKyAgICAgKiBpZiBMSUJfVkFSX05BTUUgZW52IHZhcmlhYmxlIHdlcmUgc2V0IGJlZm9yZSB0aGVuIHN0YXkgcHJldmlvdXMgdmFsdWUKKyAgICAgKiBlbHNlIHNldCBkZWZhdWx0IHBhdGgKKyAgICAqLworICAgIHNldGVudihJVFRfVE9fU1RSKExJQl9WQVJfTkFNRSksIEFORFJPSURfSVRUTk9USUZZX0RFRkFVTFRfUEFUSCwgMCk7CisjZW5kaWYKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGNvbnN0IGNoYXIqIF9faXR0X2ZzcGxpdChjb25zdCBjaGFyKiBzLCBjb25zdCBjaGFyKiBzZXAsIGNvbnN0IGNoYXIqKiBvdXQsIGludCogbGVuKQoreworICAgIGludCBpOworICAgIGludCBqOworCisgICAgaWYgKCFzIHx8ICFzZXAgfHwgIW91dCB8fCAhbGVuKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGZvciAoaSA9IDA7IHNbaV07IGkrKykKKyAgICB7CisgICAgICAgIGludCBiID0gMDsKKyAgICAgICAgZm9yIChqID0gMDsgc2VwW2pdOyBqKyspCisgICAgICAgICAgICBpZiAoc1tpXSA9PSBzZXBbal0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYiA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGlmICghYikKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghc1tpXSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAqbGVuID0gMDsKKyAgICAqb3V0ID0gJnNbaV07CisKKyAgICBmb3IgKDsgc1tpXTsgaSsrLCAoKmxlbikrKykKKyAgICB7CisgICAgICAgIGludCBiID0gMDsKKyAgICAgICAgZm9yIChqID0gMDsgc2VwW2pdOyBqKyspCisgICAgICAgICAgICBpZiAoc1tpXSA9PSBzZXBbal0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYiA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGlmIChiKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZm9yICg7IHNbaV07IGkrKykKKyAgICB7CisgICAgICAgIGludCBiID0gMDsKKyAgICAgICAgZm9yIChqID0gMDsgc2VwW2pdOyBqKyspCisgICAgICAgICAgICBpZiAoc1tpXSA9PSBzZXBbal0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYiA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGlmICghYikKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiAmc1tpXTsKK30KKworLyogVGhpcyBmdW5jdGlvbiByZXR1cm4gdmFsdWUgb2YgZW52IHZhcmlhYmxlIHRoYXQgcGxhY2VkIGludG8gc3RhdGljIGJ1ZmZlci4KKyAqICEhISBUaGUgc2FtZSBzdGF0aWMgYnVmZmVyIGlzIHVzZWQgZm9yIHN1YnNlcXVlbnQgY2FsbHMuICEhIQorICogVGhpcyB3YXMgZG9uZSB0byBhdmlvZCBkeW5hbWljIGFsbG9jYXRpb24gZm9yIGZldyBjYWxscy4KKyAqIEFjdHVhbGx5IHdlIG5lZWQgdGhpcyBmdW5jdGlvbiBvbmx5IGZvdXIgdGltZXMuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyKiBfX2l0dF9nZXRfZW52X3Zhcihjb25zdCBjaGFyKiBuYW1lKQoreworI2RlZmluZSBNQVhfRU5WX1ZBTFVFX1NJWkUgNDA4NgorICAgIHN0YXRpYyBjaGFyICBlbnZfYnVmZltNQVhfRU5WX1ZBTFVFX1NJWkVdOworICAgIHN0YXRpYyBjaGFyKiBlbnZfdmFsdWUgPSAoY2hhciopZW52X2J1ZmY7CisKKyAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgIHsKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyAgICAgICAgc2l6ZV90IG1heF9sZW4gPSBNQVhfRU5WX1ZBTFVFX1NJWkUgLSAoc2l6ZV90KShlbnZfdmFsdWUgLSBlbnZfYnVmZik7CisgICAgICAgIERXT1JEIHJjID0gR2V0RW52aXJvbm1lbnRWYXJpYWJsZUEobmFtZSwgZW52X3ZhbHVlLCAoRFdPUkQpbWF4X2xlbik7CisgICAgICAgIGlmIChyYyA+PSBtYXhfbGVuKQorICAgICAgICAgICAgX19pdHRfcmVwb3J0X2Vycm9yKF9faXR0X2Vycm9yX2Vudl90b29fbG9uZywgbmFtZSwgKHNpemVfdClyYyAtIDEsIChzaXplX3QpKG1heF9sZW4gLSAxKSk7CisgICAgICAgIGVsc2UgaWYgKHJjID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgY2hhciogcmV0ID0gKGNvbnN0IGNoYXIqKWVudl92YWx1ZTsKKyAgICAgICAgICAgIGVudl92YWx1ZSArPSByYyArIDE7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogSWYgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgZW1wdHksIEdldEVudmlyb3JubWVudFZhcmlhYmxlcygpCisgICAgICAgICAgICAgKiByZXR1cm5zIHplcm8gKG51bWJlciBvZiBjaGFyYWN0ZXJzIChub3QgaW5jbHVkaW5nIHRlcm1pbmF0aW5nIG51bGwpLAorICAgICAgICAgICAgICogYW5kIEdldExhc3RFcnJvcigpIHJldHVybnMgRVJST1JfU1VDQ0VTUy4gKi8KKyAgICAgICAgICAgIERXT1JEIGVyciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9TVUNDRVNTKQorICAgICAgICAgICAgICAgIHJldHVybiBlbnZfdmFsdWU7CisKKyAgICAgICAgICAgIGlmIChlcnIgIT0gRVJST1JfRU5WVkFSX05PVF9GT1VORCkKKyAgICAgICAgICAgICAgICBfX2l0dF9yZXBvcnRfZXJyb3IoX19pdHRfZXJyb3JfY2FudF9yZWFkX2VudiwgbmFtZSwgKGludCllcnIpOworICAgICAgICB9CisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCisgICAgICAgIGNoYXIqIGVudiA9IGdldGVudihuYW1lKTsKKyAgICAgICAgaWYgKGVudiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBzaXplX3QgbGVuID0gc3RybGVuKGVudik7CisgICAgICAgICAgICBzaXplX3QgbWF4X2xlbiA9IE1BWF9FTlZfVkFMVUVfU0laRSAtIChzaXplX3QpKGVudl92YWx1ZSAtIGVudl9idWZmKTsKKyAgICAgICAgICAgIGlmIChsZW4gPCBtYXhfbGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHJldCA9IChjb25zdCBjaGFyKillbnZfdmFsdWU7CisgICAgICAgICAgICAgICAgc3RybmNweShlbnZfdmFsdWUsIGVudiwgbGVuICsgMSk7CisgICAgICAgICAgICAgICAgZW52X3ZhbHVlICs9IGxlbiArIDE7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIF9faXR0X3JlcG9ydF9lcnJvcihfX2l0dF9lcnJvcl9lbnZfdG9vX2xvbmcsIG5hbWUsIChzaXplX3QpbGVuLCAoc2l6ZV90KShtYXhfbGVuIC0gMSkpOworICAgICAgICB9CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgY2hhciogX19pdHRfZ2V0X2xpYl9uYW1lKHZvaWQpCit7CisgICAgY29uc3QgY2hhciogbGliX25hbWUgPSBfX2l0dF9nZXRfZW52X3ZhcihJVFRfVE9fU1RSKExJQl9WQVJfTkFNRSkpOworCisjaWZkZWYgX19BTkRST0lEX18KKyAgICBpZiAobGliX25hbWUgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IHN5c3RlbV93aWRlX21hcmtlcl9maWxlbmFtZSA9ICIvZGF0YS9sb2NhbC90bXAvY29tLmludGVsLml0dC5jb2xsZWN0b3JfbGliIjsKKyAgICAgICAgaW50IGl0dF9tYXJrZXJfZmlsZV9mZCA9IG9wZW4oc3lzdGVtX3dpZGVfbWFya2VyX2ZpbGVuYW1lLCBPX1JET05MWSk7CisgICAgICAgIHNzaXplX3QgcmVzID0gMDsKKworICAgICAgICBpZiAoaXR0X21hcmtlcl9maWxlX2ZkID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBwaWRfdCBteV9waWQgPSBnZXRwaWQoKTsKKyAgICAgICAgICAgIGNoYXIgY21kbGluZV9wYXRoW1BBVEhfTUFYXSA9IHswfTsKKyAgICAgICAgICAgIGNoYXIgcGFja2FnZV9uYW1lW1BBVEhfTUFYXSA9IHswfTsKKyAgICAgICAgICAgIGNoYXIgYXBwX3NhbmRib3hfZmlsZVtQQVRIX01BWF0gPSB7MH07CisgICAgICAgICAgICBpbnQgY21kbGluZV9mZCA9IDA7CisKKyAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0koIlVuYWJsZSB0byBvcGVuIHN5c3RlbS13aWRlIG1hcmtlciBmaWxlLiIpOworICAgICAgICAgICAgc25wcmludGYoY21kbGluZV9wYXRoLCBQQVRIX01BWCAtIDEsICIvcHJvYy8lZC9jbWRsaW5lIiwgbXlfcGlkKTsKKyAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0koIkNNRCBmaWxlOiAlc1xuIiwgY21kbGluZV9wYXRoKTsKKyAgICAgICAgICAgIGNtZGxpbmVfZmQgPSBvcGVuKGNtZGxpbmVfcGF0aCwgT19SRE9OTFkpOworICAgICAgICAgICAgaWYgKGNtZGxpbmVfZmQgPT0gLTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSVRUX0FORFJPSURfTE9HRSgiVW5hYmxlIHRvIG9wZW4gJXMgZmlsZSEiLCBjbWRsaW5lX3BhdGgpOworICAgICAgICAgICAgICAgIHJldHVybiBsaWJfbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcyA9IHJlYWQoY21kbGluZV9mZCwgcGFja2FnZV9uYW1lLCBQQVRIX01BWCAtIDEpOworICAgICAgICAgICAgaWYgKHJlcyA9PSAtMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dFKCJVbmFibGUgdG8gcmVhZCAlcyBmaWxlISIsIGNtZGxpbmVfcGF0aCk7CisgICAgICAgICAgICAgICAgcmVzID0gY2xvc2UoY21kbGluZV9mZCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSAtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0UoIlVuYWJsZSB0byBjbG9zZSAlcyBmaWxlISIsIGNtZGxpbmVfcGF0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBsaWJfbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcyA9IGNsb3NlKGNtZGxpbmVfZmQpOworICAgICAgICAgICAgaWYgKHJlcyA9PSAtMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dFKCJVbmFibGUgdG8gY2xvc2UgJXMgZmlsZSEiLCBjbWRsaW5lX3BhdGgpOworICAgICAgICAgICAgICAgIHJldHVybiBsaWJfbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0koIlBhY2thZ2UgbmFtZTogJXNcbiIsIHBhY2thZ2VfbmFtZSk7CisgICAgICAgICAgICBzbnByaW50ZihhcHBfc2FuZGJveF9maWxlLCBQQVRIX01BWCAtIDEsICIvZGF0YS9kYXRhLyVzL2NvbS5pbnRlbC5pdHQuY29sbGVjdG9yX2xpYiIsIHBhY2thZ2VfbmFtZSk7CisgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dJKCJMaWIgbWFya2VyIGZpbGUgbmFtZTogJXNcbiIsIGFwcF9zYW5kYm94X2ZpbGUpOworICAgICAgICAgICAgaXR0X21hcmtlcl9maWxlX2ZkID0gb3BlbihhcHBfc2FuZGJveF9maWxlLCBPX1JET05MWSk7CisgICAgICAgICAgICBpZiAoaXR0X21hcmtlcl9maWxlX2ZkID09IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0UoIlVuYWJsZSB0byBvcGVuIGFwcCBtYXJrZXIgZmlsZSEiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGliX25hbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICBjaGFyIGl0dF9saWJfbmFtZVtQQVRIX01BWF0gPSB7MH07CisKKyAgICAgICAgICAgIHJlcyA9IHJlYWQoaXR0X21hcmtlcl9maWxlX2ZkLCBpdHRfbGliX25hbWUsIFBBVEhfTUFYIC0gMSk7CisgICAgICAgICAgICBpZiAocmVzID09IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0UoIlVuYWJsZSB0byByZWFkICVzIGZpbGUhIiwgaXR0X21hcmtlcl9maWxlX2ZkKTsKKyAgICAgICAgICAgICAgICByZXMgPSBjbG9zZShpdHRfbWFya2VyX2ZpbGVfZmQpOworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gLTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dFKCJVbmFibGUgdG8gY2xvc2UgJXMgZmlsZSEiLCBpdHRfbWFya2VyX2ZpbGVfZmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbGliX25hbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dJKCJJVFQgTGliIHBhdGg6ICVzIiwgaXR0X2xpYl9uYW1lKTsKKyAgICAgICAgICAgIHJlcyA9IGNsb3NlKGl0dF9tYXJrZXJfZmlsZV9mZCk7CisgICAgICAgICAgICBpZiAocmVzID09IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0UoIlVuYWJsZSB0byBjbG9zZSAlcyBmaWxlISIsIGl0dF9tYXJrZXJfZmlsZV9mZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpYl9uYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSVRUX0FORFJPSURfTE9HSSgiU2V0IGVudiIpOworICAgICAgICAgICAgcmVzID0gc2V0ZW52KElUVF9UT19TVFIoTElCX1ZBUl9OQU1FKSwgaXR0X2xpYl9uYW1lLCAwKTsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gLTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSVRUX0FORFJPSURfTE9HRSgiVW5hYmxlIHRvIHNldCBlbnYgdmFyISIpOworICAgICAgICAgICAgICAgIHJldHVybiBsaWJfbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpYl9uYW1lID0gX19pdHRfZ2V0X2Vudl92YXIoSVRUX1RPX1NUUihMSUJfVkFSX05BTUUpKTsKKyAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0koIklUVCBMaWIgcGF0aCBmcm9tIGVudjogJXMiLCBpdHRfbGliX25hbWUpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gbGliX25hbWU7Cit9CisKKyNpZm5kZWYgbWluCisjZGVmaW5lIG1pbihhLGIpIChhKSA8IChiKSA/IChhKSA6IChiKQorI2VuZGlmIC8qIG1pbiAqLworCitzdGF0aWMgX19pdHRfZ3JvdXBfaWQgX19pdHRfZ2V0X2dyb3Vwcyh2b2lkKQoreworICAgIGludCBpOworICAgIF9faXR0X2dyb3VwX2lkIHJlcyA9IF9faXR0X2dyb3VwX25vbmU7CisgICAgY29uc3QgY2hhciogdmFyX25hbWUgID0gIklOVEVMX0lUVE5PVElGWV9HUk9VUFMiOworICAgIGNvbnN0IGNoYXIqIGdyb3VwX3N0ciA9IF9faXR0X2dldF9lbnZfdmFyKHZhcl9uYW1lKTsKKworICAgIGlmIChncm91cF9zdHIgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludCBsZW47CisgICAgICAgIGNoYXIgZ3JbMjU1XTsKKyAgICAgICAgY29uc3QgY2hhciogY2h1bms7CisgICAgICAgIHdoaWxlICgoZ3JvdXBfc3RyID0gX19pdHRfZnNwbGl0KGdyb3VwX3N0ciwgIiw7ICIsICZjaHVuaywgJmxlbikpICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9faXR0X2ZzdHJjcHluKGdyLCBjaHVuaywgc2l6ZW9mKGdyKSAtIDEpOworICAgICAgICAgICAgZ3JbbWluKGxlbiwgKGludCkoc2l6ZW9mKGdyKSAtIDEpKV0gPSAwOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBncm91cF9saXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghX19pdHRfZnN0cmNtcChnciwgZ3JvdXBfbGlzdFtpXS5uYW1lKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IChfX2l0dF9ncm91cF9pZCkocmVzIHwgZ3JvdXBfbGlzdFtpXS5pZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBUT0RPOiAhISEgV29ya2Fyb3VuZCBmb3IgYnVnIHdpdGggd2FybmluZyBmb3IgdW5rbm93biBncm91cCAhISEKKyAgICAgICAgICogU2hvdWxkIGJlIGZpeGVkIGluIG5ldyBpbml0aWFsaXphdGlvbiBzY2hlbWUuCisgICAgICAgICAqIE5vdyB0aGUgZm9sbG93aW5nIGdyb3VwcyBzaG91bGQgYmUgc2V0IGFsd2F5cy4gKi8KKyAgICAgICAgZm9yIChpID0gMDsgZ3JvdXBfbGlzdFtpXS5pZCAhPSBfX2l0dF9ncm91cF9ub25lOyBpKyspCisgICAgICAgICAgICBpZiAoZ3JvdXBfbGlzdFtpXS5pZCAhPSBfX2l0dF9ncm91cF9hbGwgJiYKKyAgICAgICAgICAgICAgICBncm91cF9saXN0W2ldLmlkID4gX19pdHRfZ3JvdXBfc3BsaXR0ZXJfbWluICYmCisgICAgICAgICAgICAgICAgZ3JvdXBfbGlzdFtpXS5pZCA8IF9faXR0X2dyb3VwX3NwbGl0dGVyX21heCkKKyAgICAgICAgICAgICAgICByZXMgPSAoX19pdHRfZ3JvdXBfaWQpKHJlcyB8IGdyb3VwX2xpc3RbaV0uaWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBncm91cF9hbGlhc1tpXS5lbnZfdmFyICE9IE5VTEw7IGkrKykKKyAgICAgICAgICAgIGlmIChfX2l0dF9nZXRfZW52X3Zhcihncm91cF9hbGlhc1tpXS5lbnZfdmFyKSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBncm91cF9hbGlhc1tpXS5ncm91cHM7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBfX2l0dF9saWJfdmVyc2lvbihsaWJfdCBsaWIpCit7CisgICAgaWYgKGxpYiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoX19pdHRfZ2V0X3Byb2MobGliLCAiX19pdHRfYXBpX2luaXQiKSkKKyAgICAgICAgcmV0dXJuIDI7CisgICAgaWYgKF9faXR0X2dldF9wcm9jKGxpYiwgIl9faXR0X2FwaV92ZXJzaW9uIikpCisgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCisvKiBJdCdzIG5vdCB1c2VkIHJpZ2h0IG5vdyEgQ29tbWVudCBpdCBvdXQgdG8gYXZvaWQgd2FybmluZ3MuCitzdGF0aWMgdm9pZCBfX2l0dF9yZWluaXRfYWxsX3BvaW50ZXJzKHZvaWQpCit7CisgICAgaW50IGk7CisgICAgLy8gRmlsbCBhbGwgcG9pbnRlcnMgd2l0aCBpbml0aWFsIHN0dWJzCisgICAgZm9yIChpID0gMDsgX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisgICAgICAgICpfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5mdW5jX3B0ciA9IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmluaXRfZnVuYzsKK30KKyovCisKK3N0YXRpYyB2b2lkIF9faXR0X251bGxpZnlfYWxsX3BvaW50ZXJzKHZvaWQpCit7CisgICAgaW50IGk7CisgICAgLyogTnVsaWZ5IGFsbCBwb2ludGVycyBleGNlcHQgZG9tYWluX2NyZWF0ZSBhbmQgc3RyaW5nX2hhbmRsZV9jcmVhdGUgKi8KKyAgICBmb3IgKGkgPSAwOyBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5uYW1lICE9IE5VTEw7IGkrKykKKyAgICAgICAgKl9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmZ1bmNfcHRyID0gX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0ubnVsbF9mdW5jOworfQorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjcHJhZ21hIHdhcm5pbmcocHVzaCkKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0MDU0KSAvKiB3YXJuaW5nIEM0MDU0OiAndHlwZSBjYXN0JyA6IGZyb20gZnVuY3Rpb24gcG9pbnRlciAnWFhYJyB0byBkYXRhIHBvaW50ZXIgJ3ZvaWQgKicgKi8KKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0MDU1KSAvKiB3YXJuaW5nIEM0MDU1OiAndHlwZSBjYXN0JyA6IGZyb20gZGF0YSBwb2ludGVyICd2b2lkIConIHRvIGZ1bmN0aW9uIHBvaW50ZXIgJ1hYWCcgKi8KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworSVRUX0VYVEVSTl9DIHZvaWQgX05fKGZpbmlfaXR0bGliKSh2b2lkKQoreworICAgIF9faXR0X2FwaV9maW5pX3QqIF9faXR0X2FwaV9maW5pX3B0cjsKKyAgICBzdGF0aWMgdm9sYXRpbGUgVElEVCBjdXJyZW50X3RocmVhZCA9IDA7CisKKyAgICBpZiAoX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQpCisgICAgeworICAgICAgICBfX2l0dF9tdXRleF9sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKKyAgICAgICAgaWYgKF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY3VycmVudF90aHJlYWQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50X3RocmVhZCA9IF9faXR0X3RocmVhZF9pZCgpOworICAgICAgICAgICAgICAgIF9faXR0X2FwaV9maW5pX3B0ciA9IChfX2l0dF9hcGlfZmluaV90Kikoc2l6ZV90KV9faXR0X2dldF9wcm9jKF9OXyhfaXR0YXBpX2dsb2JhbCkubGliLCAiX19pdHRfYXBpX2ZpbmkiKTsKKyAgICAgICAgICAgICAgICBpZiAoX19pdHRfYXBpX2ZpbmlfcHRyKQorICAgICAgICAgICAgICAgICAgICBfX2l0dF9hcGlfZmluaV9wdHIoJl9OXyhfaXR0YXBpX2dsb2JhbCkpOworCisgICAgICAgICAgICAgICAgX19pdHRfbnVsbGlmeV9hbGxfcG9pbnRlcnMoKTsKKworIC8qIFRPRE86ICEhISBub3Qgc2FmZSAhISEgZG9uJ3Qgc3VwcG9ydCB1bmxvYWQgc28gZmFyLgorICAqICAgICAgICAgICAgIGlmIChfTl8oX2l0dGFwaV9nbG9iYWwpLmxpYiAhPSBOVUxMKQorICAqICAgICAgICAgICAgICAgICBfX2l0dF91bmxvYWRfbGliKF9OXyhfaXR0YXBpX2dsb2JhbCkubGliKTsKKyAgKiAgICAgICAgICAgICBfTl8oX2l0dGFwaV9nbG9iYWwpLmxpYiA9IE5VTEw7CisgICovCisgICAgICAgICAgICAgICAgX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgPSAwOworICAgICAgICAgICAgICAgIGN1cnJlbnRfdGhyZWFkID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBfX2l0dF9tdXRleF91bmxvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworICAgIH0KK30KKworSVRUX0VYVEVSTl9DIGludCBfTl8oaW5pdF9pdHRsaWIpKGNvbnN0IGNoYXIqIGxpYl9uYW1lLCBfX2l0dF9ncm91cF9pZCBpbml0X2dyb3VwcykKK3sKKyAgICBpbnQgaTsKKyAgICBfX2l0dF9ncm91cF9pZCBncm91cHM7CisjaWZkZWYgSVRUX0NPTVBMRVRFX0dST1VQCisgICAgX19pdHRfZ3JvdXBfaWQgemVyb19ncm91cCA9IF9faXR0X2dyb3VwX25vbmU7CisjZW5kaWYgLyogSVRUX0NPTVBMRVRFX0dST1VQICovCisgICAgc3RhdGljIHZvbGF0aWxlIFRJRFQgY3VycmVudF90aHJlYWQgPSAwOworCisgICAgaWYgKCFfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCkKKyAgICB7CisjaWZuZGVmIElUVF9TSU1QTEVfSU5JVAorICAgICAgICBJVFRfTVVURVhfSU5JVF9BTkRfTE9DSyhfTl8oX2l0dGFwaV9nbG9iYWwpKTsKKyNlbmRpZiAvKiBJVFRfU0lNUExFX0lOSVQgKi8KKworICAgICAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY3VycmVudF90aHJlYWQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50X3RocmVhZCA9IF9faXR0X3RocmVhZF9pZCgpOworICAgICAgICAgICAgICAgIF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3QtPnRpZCA9IGN1cnJlbnRfdGhyZWFkOworICAgICAgICAgICAgICAgIGlmIChsaWJfbmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBsaWJfbmFtZSA9IF9faXR0X2dldF9saWJfbmFtZSgpOworICAgICAgICAgICAgICAgIGdyb3VwcyA9IF9faXR0X2dldF9ncm91cHMoKTsKKyAgICAgICAgICAgICAgICBpZiAoZ3JvdXBzICE9IF9faXR0X2dyb3VwX25vbmUgfHwgbGliX25hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9OXyhfaXR0YXBpX2dsb2JhbCkubGliID0gX19pdHRfbG9hZF9saWIoKGxpYl9uYW1lID09IE5VTEwpID8gaXR0bm90aWZ5X2xpYl9uYW1lIDogbGliX25hbWUpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChfTl8oX2l0dGFwaV9nbG9iYWwpLmxpYiAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9hcGlfaW5pdF90KiBfX2l0dF9hcGlfaW5pdF9wdHI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGliX3ZlcnNpb24gPSBfX2l0dF9saWJfdmVyc2lvbihfTl8oX2l0dGFwaV9nbG9iYWwpLmxpYik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobGliX3ZlcnNpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHMgPSBfX2l0dF9ncm91cF9sZWdhY3k7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsbCBhbGwgcG9pbnRlcnMgZnJvbSBkeW5hbWljIGxpYnJhcnkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5uYW1lICE9IE5VTEw7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5ncm91cCAmIGdyb3VwcyAmIGluaXRfZ3JvdXBzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uZnVuY19wdHIgPSAodm9pZCopX19pdHRfZ2V0X3Byb2MoX05fKF9pdHRhcGlfZ2xvYmFsKS5saWIsIF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5mdW5jX3B0ciA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc3RvcmUgcG9pbnRlcnMgZm9yIGZ1bmN0aW9uIHdpdGggc3RhdGljIGltcGxlbWVudGF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKl9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmZ1bmNfcHRyID0gX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0ubnVsbF9mdW5jOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXR0X3JlcG9ydF9lcnJvcihfX2l0dF9lcnJvcl9ub19zeW1ib2wsIGxpYl9uYW1lLCBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5uYW1lKTsKKyNpZmRlZiBJVFRfQ09NUExFVEVfR1JPVVAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvX2dyb3VwID0gKF9faXR0X2dyb3VwX2lkKSh6ZXJvX2dyb3VwIHwgX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uZ3JvdXApOworI2VuZGlmIC8qIElUVF9DT01QTEVURV9HUk9VUCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5mdW5jX3B0ciA9IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm51bGxfZnVuYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBzID09IF9faXR0X2dyb3VwX2xlZ2FjeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgdG9vbHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGhyZWFkX2lnbm9yZSkgID0gSVRUTk9USUZZX05BTUUodGhyX2lnbm9yZSk7CisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHN5bmNfY3JlYXRlQSkgICA9IElUVE5PVElGWV9OQU1FKHN5bmNfc2V0X25hbWVBKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUoc3luY19jcmVhdGVXKSAgID0gSVRUTk9USUZZX05BTUUoc3luY19zZXRfbmFtZVcpOworI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRShzeW5jX2NyZWF0ZSkgICAgPSBJVFROT1RJRllfTkFNRShzeW5jX3NldF9uYW1lKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUoc3luY19wcmVwYXJlKSAgID0gSVRUTk9USUZZX05BTUUobm90aWZ5X3N5bmNfcHJlcGFyZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHN5bmNfY2FuY2VsKSAgICA9IElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX2NhbmNlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHN5bmNfYWNxdWlyZWQpICA9IElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX2FjcXVpcmVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUoc3luY19yZWxlYXNpbmcpID0gSVRUTk9USUZZX05BTUUobm90aWZ5X3N5bmNfcmVsZWFzaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyNpZmRlZiBJVFRfQ09NUExFVEVfR1JPVVAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5uYW1lICE9IE5VTEw7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmdyb3VwICYgemVyb19ncm91cCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5mdW5jX3B0ciA9IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm51bGxfZnVuYzsKKyNlbmRpZiAvKiBJVFRfQ09NUExFVEVfR1JPVVAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9hcGlfaW5pdF9wdHIgPSAoX19pdHRfYXBpX2luaXRfdCopKHNpemVfdClfX2l0dF9nZXRfcHJvYyhfTl8oX2l0dGFwaV9nbG9iYWwpLmxpYiwgIl9faXR0X2FwaV9pbml0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9faXR0X2FwaV9pbml0X3B0cikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pdHRfYXBpX2luaXRfcHRyKCZfTl8oX2l0dGFwaV9nbG9iYWwpLCBpbml0X2dyb3Vwcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9udWxsaWZ5X2FsbF9wb2ludGVycygpOworCisgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9yZXBvcnRfZXJyb3IoX19pdHRfZXJyb3Jfbm9fbW9kdWxlLCBsaWJfbmFtZSwKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9zeXN0ZW1fZXJyb3IoKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRsZXJyb3IoKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfX2l0dF9udWxsaWZ5X2FsbF9wb2ludGVycygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCA9IDE7CisgICAgICAgICAgICAgICAgY3VycmVudF90aHJlYWQgPSAwOworICAgICAgICAgICAgICAgIC8qICEhISBKdXN0IHRvIGF2b2lkIHVudXNlZCBjb2RlIGVsaW1pbmF0aW9uICEhISAqLworICAgICAgICAgICAgICAgIGlmIChfX2l0dF9maW5pX2l0dGxpYl9wdHIgPT0gX05fKGZpbmlfaXR0bGliKSkgY3VycmVudF90aHJlYWQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyNpZm5kZWYgSVRUX1NJTVBMRV9JTklUCisgICAgICAgIF9faXR0X211dGV4X3VubG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7CisjZW5kaWYgLyogSVRUX1NJTVBMRV9JTklUICovCisgICAgfQorCisgICAgLyogRXZhbHVhdGluZyBpZiBhbnkgZnVuY3Rpb24gcHRyIGlzIG5vbiBlbXB0eSBhbmQgaXQncyBpbiBpbml0X2dyb3VwcyAqLworICAgIGZvciAoaSA9IDA7IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorICAgICAgICBpZiAoKl9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmZ1bmNfcHRyICE9IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm51bGxfZnVuYyAmJgorICAgICAgICAgICAgX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uZ3JvdXAgJiBpbml0X2dyb3VwcykKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCitJVFRfRVhURVJOX0MgX19pdHRfZXJyb3JfaGFuZGxlcl90KiBfTl8oc2V0X2Vycm9yX2hhbmRsZXIpKF9faXR0X2Vycm9yX2hhbmRsZXJfdCogaGFuZGxlcikKK3sKKyAgICBfX2l0dF9lcnJvcl9oYW5kbGVyX3QqIHByZXYgPSAoX19pdHRfZXJyb3JfaGFuZGxlcl90Kikoc2l6ZV90KV9OXyhfaXR0YXBpX2dsb2JhbCkuZXJyb3JfaGFuZGxlcjsKKyAgICBfTl8oX2l0dGFwaV9nbG9iYWwpLmVycm9yX2hhbmRsZXIgPSAodm9pZCopKHNpemVfdCloYW5kbGVyOworICAgIHJldHVybiBwcmV2OworfQorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjcHJhZ21hIHdhcm5pbmcocG9wKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfc3RhdGljLmggYi9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfc3RhdGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIxOGNjOAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9zdGF0aWMuaApAQCAtMCwwICsxLDMxNiBAQAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAiaXR0bm90aWZ5X2NvbmZpZy5oIgorCisjaWZuZGVmIElUVF9GT1JNQVRfREVGSU5FRAorIyAgaWZuZGVmIElUVF9GT1JNQVQKKyMgICAgZGVmaW5lIElUVF9GT1JNQVQKKyMgIGVuZGlmIC8qIElUVF9GT1JNQVQgKi8KKyMgIGlmbmRlZiBJVFRfTk9fUEFSQU1TCisjICAgIGRlZmluZSBJVFRfTk9fUEFSQU1TCisjICBlbmRpZiAvKiBJVFRfTk9fUEFSQU1TICovCisjZW5kaWYgLyogSVRUX0ZPUk1BVF9ERUZJTkVEICovCisKKy8qCisgKiBwYXJhbWV0ZXJzIGZvciBtYWNybyBleHBlY3RlZDoKKyAqIElUVF9TVFVCKGFwaSwgdHlwZSwgZnVuY19uYW1lLCBhcmd1bWVudHMsIHBhcmFtcywgZnVuY19uYW1lX2luX2RsbCwgZ3JvdXAsIHByaW50Zl9mbXQpCisgKi8KKyNpZmRlZiBfX0lUVF9JTlRFUk5BTF9JTklUCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9kb21haW4qLCBkb21haW5fY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgZG9tYWluX2NyZWF0ZUEsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIlwiJXNcIiIpCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2RvbWFpbiosIGRvbWFpbl9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCBkb21haW5fY3JlYXRlVywgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiXCIlU1wiIikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZG9tYWluKiwgZG9tYWluX2NyZWF0ZSwgIChjb25zdCBjaGFyICAgICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIGRvbWFpbl9jcmVhdGUsICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICJcIiVzXCIiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3N0cmluZ19oYW5kbGUqLCBzdHJpbmdfaGFuZGxlX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIHN0cmluZ19oYW5kbGVfY3JlYXRlQSwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiXCIlc1wiIikKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfc3RyaW5nX2hhbmRsZSosIHN0cmluZ19oYW5kbGVfY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgc3RyaW5nX2hhbmRsZV9jcmVhdGVXLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICJcIiVTXCIiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9zdHJpbmdfaGFuZGxlKiwgc3RyaW5nX2hhbmRsZV9jcmVhdGUsICAoY29uc3QgY2hhciAgICAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCBzdHJpbmdfaGFuZGxlX2NyZWF0ZSwgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIlwiJXNcIiIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHBhdXNlLCAgKHZvaWQpLCAoSVRUX05PX1BBUkFNUyksIHBhdXNlLCAgX19pdHRfZ3JvdXBfY29udHJvbCB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIm5vIGFyZ3MiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVzdW1lLCAodm9pZCksIChJVFRfTk9fUEFSQU1TKSwgcmVzdW1lLCBfX2l0dF9ncm91cF9jb250cm9sIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAibm8gYXJncyIpCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRocmVhZF9zZXRfbmFtZUEsIChjb25zdCBjaGFyICAgICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIHRocmVhZF9zZXRfbmFtZUEsIF9faXR0X2dyb3VwX3RocmVhZCwgIlwiJXNcIiIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0aHJlYWRfc2V0X25hbWVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCB0aHJlYWRfc2V0X25hbWVXLCBfX2l0dF9ncm91cF90aHJlYWQsICJcIiVTXCIiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGhyZWFkX3NldF9uYW1lLCAgKGNvbnN0IGNoYXIgICAgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgdGhyZWFkX3NldF9uYW1lLCAgX19pdHRfZ3JvdXBfdGhyZWFkLCAiXCIlc1wiIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRocmVhZF9pZ25vcmUsICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCB0aHJlYWRfaWdub3JlLCBfX2l0dF9ncm91cF90aHJlYWQsICJubyBhcmdzIikKKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsICB0aHJfbmFtZV9zZXRBLCAoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBuYW1lbGVuKSwgdGhyX25hbWVfc2V0QSwgX19pdHRfZ3JvdXBfdGhyZWFkIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiXCIlc1wiLCAlZCIpCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgIHRocl9uYW1lX3NldFcsIChjb25zdCB3Y2hhcl90ICpuYW1lLCBpbnQgbmFtZWxlbiksIChJVFRfRk9STUFUIG5hbWUsIG5hbWVsZW4pLCB0aHJfbmFtZV9zZXRXLCBfX2l0dF9ncm91cF90aHJlYWQgfCBfX2l0dF9ncm91cF9sZWdhY3ksICJcIiVTXCIsICVkIikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCAgdGhyX25hbWVfc2V0LCAgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKSwgKElUVF9GT1JNQVQgbmFtZSwgbmFtZWxlbiksIHRocl9uYW1lX3NldCwgIF9faXR0X2dyb3VwX3RocmVhZCB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIlwiJXNcIiwgJWQiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgdGhyX2lnbm9yZSwgICAodm9pZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX05PX1BBUkFNUyksICAgICAgICAgICAgdGhyX2lnbm9yZSwgICAgX19pdHRfZ3JvdXBfdGhyZWFkIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAibm8gYXJncyIpCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBlbmFibGVfYXR0YWNoLCAodm9pZCksIChJVFRfTk9fUEFSQU1TKSwgZW5hYmxlX2F0dGFjaCwgX19pdHRfZ3JvdXBfYWxsLCAibm8gYXJncyIpCisKKyNlbHNlICAvKiBfX0lUVF9JTlRFUk5BTF9JTklUICovCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfY3JlYXRlQSwgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpLCBzeW5jX2NyZWF0ZUEsIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYywgIiVwLCBcIiVzXCIsIFwiJXNcIiwgJXgiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19jcmVhdGVXLCAodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqb2JqdHlwZSwgY29uc3Qgd2NoYXJfdCAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSksIChJVFRfRk9STUFUIGFkZHIsIG9ianR5cGUsIG9iam5hbWUsIGF0dHJpYnV0ZSksIHN5bmNfY3JlYXRlVywgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jLCAiJXAsIFwiJVNcIiwgXCIlU1wiLCAleCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3JlbmFtZUEsICh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpuYW1lKSwgKElUVF9GT1JNQVQgYWRkciwgbmFtZSksIHN5bmNfcmVuYW1lQSwgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jLCAiJXAsIFwiJXNcIiIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3JlbmFtZVcsICh2b2lkICphZGRyLCBjb25zdCB3Y2hhcl90ICpuYW1lKSwgKElUVF9GT1JNQVQgYWRkciwgbmFtZSksIHN5bmNfcmVuYW1lVywgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jLCAiJXAsIFwiJVNcIiIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX2NyZWF0ZSwgICh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpvYmp0eXBlLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKSwgKElUVF9GT1JNQVQgYWRkciwgb2JqdHlwZSwgb2JqbmFtZSwgYXR0cmlidXRlKSwgc3luY19jcmVhdGUsICBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMsICIlcCwgXCIlc1wiLCBcIiVzXCIsICV4IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfcmVuYW1lLCAgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm5hbWUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBuYW1lKSwgc3luY19yZW5hbWUsICBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMsICIlcCwgXCIlc1wiIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfZGVzdHJveSwgICAgKHZvaWQgKmFkZHIpLCAoSVRUX0ZPUk1BVCBhZGRyKSwgc3luY19kZXN0cm95LCAgIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYywgIiVwIikKKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19wcmVwYXJlLCAgICAodm9pZCogYWRkciksIChJVFRfRk9STUFUIGFkZHIpLCBzeW5jX3ByZXBhcmUsICAgX19pdHRfZ3JvdXBfc3luYywgICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX2NhbmNlbCwgICAgICh2b2lkICphZGRyKSwgKElUVF9GT1JNQVQgYWRkciksIHN5bmNfY2FuY2VsLCAgICBfX2l0dF9ncm91cF9zeW5jLCAgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfYWNxdWlyZWQsICAgKHZvaWQgKmFkZHIpLCAoSVRUX0ZPUk1BVCBhZGRyKSwgc3luY19hY3F1aXJlZCwgIF9faXR0X2dyb3VwX3N5bmMsICAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19yZWxlYXNpbmcsICAodm9pZCogYWRkciksIChJVFRfRk9STUFUIGFkZHIpLCBzeW5jX3JlbGVhc2luZywgX19pdHRfZ3JvdXBfc3luYywgICIlcCIpCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN1cHByZXNzX3B1c2gsICAgICAgICh1bnNpZ25lZCBpbnQgbWFzayksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBtYXNrKSwgc3VwcHJlc3NfcHVzaCwgIF9faXR0X2dyb3VwX3N1cHByZXNzLCAgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN1cHByZXNzX3BvcCwgICAgICAgICh2b2lkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX05PX1BBUkFNUyksICAgc3VwcHJlc3NfcG9wLCAgIF9faXR0X2dyb3VwX3N1cHByZXNzLCAgIm5vIGFyZ3MiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3VwcHJlc3NfbWFya19yYW5nZSwgKF9faXR0X3N1cHByZXNzX21vZGVfdCBtb2RlLCB1bnNpZ25lZCBpbnQgbWFzaywgdm9pZCAqIGFkZHJlc3MsIHNpemVfdCBzaXplKSwoSVRUX0ZPUk1BVCBtb2RlLCBtYXNrLCBhZGRyZXNzLCBzaXplKSwgc3VwcHJlc3NfbWFya19yYW5nZSwgX19pdHRfZ3JvdXBfc3VwcHJlc3MsICIlZCwgJXAsICVwLCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdXBwcmVzc19jbGVhcl9yYW5nZSwoX19pdHRfc3VwcHJlc3NfbW9kZV90IG1vZGUsIHVuc2lnbmVkIGludCBtYXNrLCB2b2lkICogYWRkcmVzcywgc2l6ZV90IHNpemUpLChJVFRfRk9STUFUIG1vZGUsIG1hc2ssIGFkZHJlc3MsIHNpemUpLCBzdXBwcmVzc19jbGVhcl9yYW5nZSxfX2l0dF9ncm91cF9zdXBwcmVzcywgIiVkLCAlcCwgJXAsICVkIikKKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnN5bmNfcHJlcGFyZSwgICAodm9pZCogYWRkciksIChJVFRfRk9STUFUIGFkZHIpLCBzeW5jX3ByZXBhcmUsICAgX19pdHRfZ3JvdXBfZnN5bmMsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmc3luY19jYW5jZWwsICAgICh2b2lkICphZGRyKSwgKElUVF9GT1JNQVQgYWRkciksIHN5bmNfY2FuY2VsLCAgICBfX2l0dF9ncm91cF9mc3luYywgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZzeW5jX2FjcXVpcmVkLCAgKHZvaWQgKmFkZHIpLCAoSVRUX0ZPUk1BVCBhZGRyKSwgc3luY19hY3F1aXJlZCwgIF9faXR0X2dyb3VwX2ZzeW5jLCAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnN5bmNfcmVsZWFzaW5nLCAodm9pZCogYWRkciksIChJVFRfRk9STUFUIGFkZHIpLCBzeW5jX3JlbGVhc2luZywgX19pdHRfZ3JvdXBfZnN5bmMsICIlcCIpCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfYmVnaW4sICAgICAgICAgIChfX2l0dF9tb2RlbF9zaXRlICpzaXRlLCBfX2l0dF9tb2RlbF9zaXRlX2luc3RhbmNlICppbnN0YW5jZSwgY29uc3QgY2hhciAqbmFtZSksIChJVFRfRk9STUFUIHNpdGUsIGluc3RhbmNlLCBuYW1lKSwgbW9kZWxfc2l0ZV9iZWdpbiwgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCwgJXAsIFwiJXNcIiIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9zaXRlX2VuZCwgICAgICAgICAgICAoX19pdHRfbW9kZWxfc2l0ZSAqc2l0ZSwgX19pdHRfbW9kZWxfc2l0ZV9pbnN0YW5jZSAqaW5zdGFuY2UpLCAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBzaXRlLCBpbnN0YW5jZSksICAgICAgIG1vZGVsX3NpdGVfZW5kLCAgIF9faXR0X2dyb3VwX21vZGVsLCAiJXAsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3Rhc2tfYmVnaW4sICAgICAgICAgIChfX2l0dF9tb2RlbF90YXNrICp0YXNrLCBfX2l0dF9tb2RlbF90YXNrX2luc3RhbmNlICppbnN0YW5jZSwgY29uc3QgY2hhciAqbmFtZSksIChJVFRfRk9STUFUIHRhc2ssIGluc3RhbmNlLCBuYW1lKSwgbW9kZWxfdGFza19iZWdpbiwgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCwgJXAsIFwiJXNcIiIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2VuZCwgICAgICAgICAgICAoX19pdHRfbW9kZWxfdGFzayAqdGFzaywgX19pdHRfbW9kZWxfdGFza19pbnN0YW5jZSAqaW5zdGFuY2UpLCAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCB0YXNrLCBpbnN0YW5jZSksICAgICAgIG1vZGVsX3Rhc2tfZW5kLCAgIF9faXR0X2dyb3VwX21vZGVsLCAiJXAsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2xvY2tfYWNxdWlyZSwgICAgICAgICh2b2lkICpsb2NrKSwgKElUVF9GT1JNQVQgbG9jayksIG1vZGVsX2xvY2tfYWNxdWlyZSwgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9sb2NrX3JlbGVhc2UsICAgICAgICAodm9pZCAqbG9jayksIChJVFRfRk9STUFUIGxvY2spLCBtb2RlbF9sb2NrX3JlbGVhc2UsIF9faXR0X2dyb3VwX21vZGVsLCAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfcmVjb3JkX2FsbG9jYXRpb24sICAgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKSwgKElUVF9GT1JNQVQgYWRkciwgc2l6ZSksIG1vZGVsX3JlY29yZF9hbGxvY2F0aW9uLCAgIF9faXR0X2dyb3VwX21vZGVsLCAiJXAsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3JlY29yZF9kZWFsbG9jYXRpb24sICh2b2lkICphZGRyKSwgICAgICAgICAgICAgIChJVFRfRk9STUFUIGFkZHIpLCAgICAgICBtb2RlbF9yZWNvcmRfZGVhbGxvY2F0aW9uLCBfX2l0dF9ncm91cF9tb2RlbCwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2luZHVjdGlvbl91c2VzLCAgICAgICh2b2lkKiBhZGRyLCBzaXplX3Qgc2l6ZSksIChJVFRfRk9STUFUIGFkZHIsIHNpemUpLCBtb2RlbF9pbmR1Y3Rpb25fdXNlcywgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVwLCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9yZWR1Y3Rpb25fdXNlcywgICAgICAodm9pZCogYWRkciwgc2l6ZV90IHNpemUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBzaXplKSwgbW9kZWxfcmVkdWN0aW9uX3VzZXMsICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfb2JzZXJ2ZV91c2VzLCAgICAgICAgKHZvaWQqIGFkZHIsIHNpemVfdCBzaXplKSwgKElUVF9GT1JNQVQgYWRkciwgc2l6ZSksIG1vZGVsX29ic2VydmVfdXNlcywgICAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAiJXAsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2NsZWFyX3VzZXMsICAgICAgICAgICh2b2lkKiBhZGRyKSwgICAgICAgICAgICAgIChJVFRfRk9STUFUIGFkZHIpLCAgICAgICBtb2RlbF9jbGVhcl91c2VzLCAgICAgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVwIikKKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9zaXRlX2JlZ2luVywgICAgICAgICAoY29uc3Qgd2NoYXJfdCAqbmFtZSksICAgICAoSVRUX0ZPUk1BVCBuYW1lKSwgICAgICAgbW9kZWxfc2l0ZV9iZWdpblcsICAgICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICJcIiVzXCIiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfdGFza19iZWdpblcsICAgICAgICAgKGNvbnN0IHdjaGFyX3QgKm5hbWUpLCAgICAgKElUVF9GT1JNQVQgbmFtZSksICAgICAgIG1vZGVsX3Rhc2tfYmVnaW5XLCAgICAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAiXCIlc1wiIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2l0ZXJhdGlvbl90YXNrVywgICAgIChjb25zdCB3Y2hhcl90ICpuYW1lKSwgICAgIChJVFRfRk9STUFUIG5hbWUpLCAgICAgICBtb2RlbF9pdGVyYXRpb25fdGFza1csICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIlwiJXNcIiIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9zaXRlX2JlZ2luQSwgICAgICAgICAoY29uc3QgY2hhciAqbmFtZSksICAgICAgICAoSVRUX0ZPUk1BVCBuYW1lKSwgICAgICAgbW9kZWxfc2l0ZV9iZWdpbkEsICAgICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICJcIiVzXCIiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfc2l0ZV9iZWdpbkFMLCAgICAgICAgKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBsZW4pLCBtb2RlbF9zaXRlX2JlZ2luQUwsICAgIF9faXR0X2dyb3VwX21vZGVsLCAiXCIlc1wiLCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2JlZ2luQSwgICAgICAgICAoY29uc3QgY2hhciAqbmFtZSksICAgICAgICAoSVRUX0ZPUk1BVCBuYW1lKSwgICAgICAgbW9kZWxfdGFza19iZWdpbkEsICAgICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICJcIiVzXCIiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfdGFza19iZWdpbkFMLCAgICAgICAgKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBsZW4pLCBtb2RlbF90YXNrX2JlZ2luQUwsICAgIF9faXR0X2dyb3VwX21vZGVsLCAiXCIlc1wiLCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9pdGVyYXRpb25fdGFza0EsICAgICAoY29uc3QgY2hhciAqbmFtZSksICAgICAgICAoSVRUX0ZPUk1BVCBuYW1lKSwgICAgICAgbW9kZWxfaXRlcmF0aW9uX3Rhc2tBLCAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICJcIiVzXCIiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfaXRlcmF0aW9uX3Rhc2tBTCwgICAgKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBsZW4pLCBtb2RlbF9pdGVyYXRpb25fdGFza0FMLCBfX2l0dF9ncm91cF9tb2RlbCwgIlwiJXNcIiwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfc2l0ZV9lbmRfMiwgICAgICAgICAgKHZvaWQpLCAgICAgICAgICAgICAgICAgICAgKElUVF9OT19QQVJBTVMpLCAgICAgICAgIG1vZGVsX3NpdGVfZW5kXzIsICAgICAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAibm8gYXJncyIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2VuZF8yLCAgICAgICAgICAodm9pZCksICAgICAgICAgICAgICAgICAgICAoSVRUX05PX1BBUkFNUyksICAgICAgICAgbW9kZWxfdGFza19lbmRfMiwgICAgICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICJubyBhcmdzIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2xvY2tfYWNxdWlyZV8yLCAgICAgICh2b2lkICpsb2NrKSwgICAgICAgICAgICAgIChJVFRfRk9STUFUIGxvY2spLCAgICAgICBtb2RlbF9sb2NrX2FjcXVpcmVfMiwgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2xvY2tfcmVsZWFzZV8yLCAgICAgICh2b2lkICpsb2NrKSwgICAgICAgICAgICAgIChJVFRfRk9STUFUIGxvY2spLCAgICAgICBtb2RlbF9sb2NrX3JlbGVhc2VfMiwgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2FnZ3JlZ2F0ZV90YXNrLCAgICAgIChzaXplX3QgY291bnQpLCAgICAgICAgICAgIChJVFRfRk9STUFUIGNvdW50KSwgICAgICBtb2RlbF9hZ2dyZWdhdGVfdGFzaywgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2Rpc2FibGVfcHVzaCwgICAgICAgIChfX2l0dF9tb2RlbF9kaXNhYmxlIHgpLCAgIChJVFRfRk9STUFUIHgpLCAgICAgICAgICBtb2RlbF9kaXNhYmxlX3B1c2gsICAgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2Rpc2FibGVfcG9wLCAgICAgICAgICh2b2lkKSwgICAgICAgICAgICAgICAgICAgIChJVFRfTk9fUEFSQU1TKSwgICAgICAgICBtb2RlbF9kaXNhYmxlX3BvcCwgICAgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIm5vIGFyZ3MiKQorI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2hlYXBfZnVuY3Rpb24sIGhlYXBfZnVuY3Rpb25fY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGNvbnN0IGNoYXIgICAgKmRvbWFpbiksIChJVFRfRk9STUFUIG5hbWUsIGRvbWFpbiksIGhlYXBfZnVuY3Rpb25fY3JlYXRlQSwgX19pdHRfZ3JvdXBfaGVhcCwgIlwiJXNcIiwgXCIlc1wiIikKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfaGVhcF9mdW5jdGlvbiwgaGVhcF9mdW5jdGlvbl9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSwgY29uc3Qgd2NoYXJfdCAqZG9tYWluKSwgKElUVF9GT1JNQVQgbmFtZSwgZG9tYWluKSwgaGVhcF9mdW5jdGlvbl9jcmVhdGVXLCBfX2l0dF9ncm91cF9oZWFwLCAiXCIlc1wiLCBcIiVzXCIiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9oZWFwX2Z1bmN0aW9uLCBoZWFwX2Z1bmN0aW9uX2NyZWF0ZSwgIChjb25zdCBjaGFyICAgICpuYW1lLCBjb25zdCBjaGFyICAgICpkb21haW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBkb21haW4pLCBoZWFwX2Z1bmN0aW9uX2NyZWF0ZSwgIF9faXR0X2dyb3VwX2hlYXAsICJcIiVzXCIsIFwiJXNcIiIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9hbGxvY2F0ZV9iZWdpbiwgICAoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCBzaXplX3Qgc2l6ZSwgaW50IGluaXRpYWxpemVkKSwgICAgICAgICAgICAgKElUVF9GT1JNQVQgaCwgc2l6ZSwgaW5pdGlhbGl6ZWQpLCAgICAgICBoZWFwX2FsbG9jYXRlX2JlZ2luLCBfX2l0dF9ncm91cF9oZWFwLCAiJXAsICVsdSwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9hbGxvY2F0ZV9lbmQsICAgICAoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCB2b2lkKiogYWRkciwgc2l6ZV90IHNpemUsIGludCBpbml0aWFsaXplZCksIChJVFRfRk9STUFUIGgsIGFkZHIsIHNpemUsIGluaXRpYWxpemVkKSwgaGVhcF9hbGxvY2F0ZV9lbmQsICAgX19pdHRfZ3JvdXBfaGVhcCwgIiVwLCAlcCwgJWx1LCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX2ZyZWVfYmVnaW4sICAgICAgIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqICBhZGRyKSwgKElUVF9GT1JNQVQgaCwgYWRkciksIGhlYXBfZnJlZV9iZWdpbiwgX19pdHRfZ3JvdXBfaGVhcCwgIiVwLCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX2ZyZWVfZW5kLCAgICAgICAgIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqICBhZGRyKSwgKElUVF9GT1JNQVQgaCwgYWRkciksIGhlYXBfZnJlZV9lbmQsICAgX19pdHRfZ3JvdXBfaGVhcCwgIiVwLCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX3JlYWxsb2NhdGVfYmVnaW4sIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqICBhZGRyLCBzaXplX3QgbmV3X3NpemUsIGludCBpbml0aWFsaXplZCksICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgaCwgYWRkciwgbmV3X3NpemUsIGluaXRpYWxpemVkKSwgICAgICAgICAgIGhlYXBfcmVhbGxvY2F0ZV9iZWdpbiwgX19pdHRfZ3JvdXBfaGVhcCwgIiVwLCAlcCwgJWx1LCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX3JlYWxsb2NhdGVfZW5kLCAgIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqICBhZGRyLCB2b2lkKiogbmV3X2FkZHIsIHNpemVfdCBuZXdfc2l6ZSwgaW50IGluaXRpYWxpemVkKSwgKElUVF9GT1JNQVQgaCwgYWRkciwgbmV3X2FkZHIsIG5ld19zaXplLCBpbml0aWFsaXplZCksIGhlYXBfcmVhbGxvY2F0ZV9lbmQsICAgX19pdHRfZ3JvdXBfaGVhcCwgIiVwLCAlcCwgJXAsICVsdSwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9pbnRlcm5hbF9hY2Nlc3NfYmVnaW4sICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCBoZWFwX2ludGVybmFsX2FjY2Vzc19iZWdpbiwgX19pdHRfZ3JvdXBfaGVhcCwgIm5vIGFyZ3MiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9pbnRlcm5hbF9hY2Nlc3NfZW5kLCAgICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCBoZWFwX2ludGVybmFsX2FjY2Vzc19lbmQsICAgX19pdHRfZ3JvdXBfaGVhcCwgIm5vIGFyZ3MiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9iZWdpbiwgKHZvaWQpLCAoSVRUX05PX1BBUkFNUyksIGhlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW4sIF9faXR0X2dyb3VwX2hlYXAsICJubyBhcmdzIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfZW5kLCAgICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCBoZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2VuZCwgICBfX2l0dF9ncm91cF9oZWFwLCAibm8gYXJncyIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX3Jlc2V0X2RldGVjdGlvbiwgKHVuc2lnbmVkIGludCByZXNldF9tYXNrKSwgIChJVFRfRk9STUFUIHJlc2V0X21hc2spLCBoZWFwX3Jlc2V0X2RldGVjdGlvbiwgX19pdHRfZ3JvdXBfaGVhcCwgIiV1IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfcmVjb3JkLCAgICAgICAgICAodW5zaWduZWQgaW50IHJlY29yZF9tYXNrKSwgKElUVF9GT1JNQVQgcmVjb3JkX21hc2spLCAgaGVhcF9yZWNvcmQsICAgICAgICBfX2l0dF9ncm91cF9oZWFwLCAiJXUiKQorCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBpZF9jcmVhdGUsICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkKSwgKElUVF9GT1JNQVQgZG9tYWluLCBpZCksIGlkX2NyZWF0ZSwgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaWRfZGVzdHJveSwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCksIChJVFRfRk9STUFUIGRvbWFpbiwgaWQpLCBpZF9kZXN0cm95LCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1IikKKworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF90aW1lc3RhbXAsIGdldF90aW1lc3RhbXAsICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCBnZXRfdGltZXN0YW1wLCAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAibm8gYXJncyIpCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlZ2lvbl9iZWdpbiwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50LCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSwgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwgcGFyZW50LCBuYW1lKSwgcmVnaW9uX2JlZ2luLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1LCAlbHUsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlZ2lvbl9lbmQsICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBpZCksICAgICAgICAgICAgICAgcmVnaW9uX2VuZCwgICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1IikKKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmcmFtZV9iZWdpbl92MywgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgKmlkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4sIGlkKSwgICAgICAgICAgICAgZnJhbWVfYmVnaW5fdjMsICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnJhbWVfZW5kX3YzLCAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkICppZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBpZCksICAgICAgICAgICAgIGZyYW1lX2VuZF92MywgICAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZyYW1lX3N1Ym1pdF92MywgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCAqaWQsIF9faXR0X3RpbWVzdGFtcCBiZWdpbiwgX19pdHRfdGltZXN0YW1wIGVuZCksIChJVFRfRk9STUFUIGRvbWFpbiwgaWQsIGJlZ2luLCBlbmQpLCBmcmFtZV9zdWJtaXRfdjMsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlbHUiKQorI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19ncm91cCwgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGlkLCBwYXJlbnQsIG5hbWUpLCB0YXNrX2dyb3VwLCAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSwgJWx1LCAlcCIpCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW4sICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSksIChJVFRfRk9STUFUIGRvbWFpbiwgaWQsIHBhcmVudCwgbmFtZSksIHRhc2tfYmVnaW4sICAgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVsdSwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19iZWdpbl9mbiwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50LCB2b2lkKiBmbiksICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwgcGFyZW50LCBmbiksICAgdGFza19iZWdpbl9mbiwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSwgJWx1LCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2VuZCwgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4pLCAgICAgICAgICAgICAgICAgICB0YXNrX2VuZCwgICAgICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCIpCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGNvdW50ZXJfaW5jX3YzLCAgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGRvbWFpbiwgbmFtZSksICAgICAgICBjb3VudGVyX2luY192MywgICAgICAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGNvdW50ZXJfaW5jX2RlbHRhX3YzLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZSksIChJVFRfRk9STUFUIGRvbWFpbiwgbmFtZSwgdmFsdWUpLCBjb3VudGVyX2luY19kZWx0YV92MywgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUiKQorCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtYXJrZXIsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUsIF9faXR0X3Njb3BlIHNjb3BlKSwgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwgbmFtZSwgc2NvcGUpLCBtYXJrZXIsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVwLCAlZCIpCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX2FkZCwgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIF9faXR0X21ldGFkYXRhX3R5cGUgdHlwZSwgc2l6ZV90IGNvdW50LCB2b2lkICpkYXRhKSwgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwga2V5LCB0eXBlLCBjb3VudCwgZGF0YSksIG1ldGFkYXRhX2FkZCwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSwgJXAsICVkLCAlbHUsICVwIikKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX3N0cl9hZGRBLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBsZW5ndGgpLCAgICAoSVRUX0ZPUk1BVCBkb21haW4sIGlkLCBrZXksIGRhdGEsIGxlbmd0aCksIG1ldGFkYXRhX3N0cl9hZGRBLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1LCAlcCwgJXAsICVsdSIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9zdHJfYWRkVywgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCB3Y2hhcl90KiBkYXRhLCBzaXplX3QgbGVuZ3RoKSwgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwga2V5LCBkYXRhLCBsZW5ndGgpLCBtZXRhZGF0YV9zdHJfYWRkVywgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSwgJXAsICVwLCAlbHUiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfc3RyX2FkZCwgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IGxlbmd0aCksICAgIChJVFRfRk9STUFUIGRvbWFpbiwgaWQsIGtleSwgZGF0YSwgbGVuZ3RoKSwgbWV0YWRhdGFfc3RyX2FkZCwgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVwLCAlcCwgJWx1IikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVsYXRpb25fYWRkX3RvX2N1cnJlbnQsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfcmVsYXRpb24gcmVsYXRpb24sIF9faXR0X2lkIHRhaWwpLCAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4sIHJlbGF0aW9uLCB0YWlsKSwgICAgICAgcmVsYXRpb25fYWRkX3RvX2N1cnJlbnQsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlbGF0aW9uX2FkZCwgICAgICAgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGhlYWQsIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKSwgKElUVF9GT1JNQVQgZG9tYWluLCBoZWFkLCByZWxhdGlvbiwgdGFpbCksIHJlbGF0aW9uX2FkZCwgICAgICAgICAgICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVsdSwgJXAiKQorCisjaWZuZGVmIF9fSVRUX0lOVEVSTkFMX0JPRFkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfZXZlbnQsIGV2ZW50X2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lLCBpbnQgbmFtZWxlbiksIChJVFRfRk9STUFUIG5hbWUsIG5hbWVsZW4pLCBldmVudF9jcmVhdGVBLCBfX2l0dF9ncm91cF9tYXJrIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiXCIlc1wiLCAlZCIpCitJVFRfU1RVQihMSUJJVFRBUEksIF9faXR0X2V2ZW50LCBldmVudF9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSwgaW50IG5hbWVsZW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBuYW1lbGVuKSwgZXZlbnRfY3JlYXRlVywgX19pdHRfZ3JvdXBfbWFyayB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIlwiJVNcIiwgJWQiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9ldmVudCwgZXZlbnRfY3JlYXRlLCAgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKSwgKElUVF9GT1JNQVQgbmFtZSwgbmFtZWxlbiksIGV2ZW50X2NyZWF0ZSwgIF9faXR0X2dyb3VwX21hcmsgfCBfX2l0dF9ncm91cF9sZWdhY3ksICJcIiVzXCIsICVkIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCAgZXZlbnRfc3RhcnQsICAgICAgICAgIChfX2l0dF9ldmVudCBldmVudCksICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGV2ZW50KSwgICAgICAgICBldmVudF9zdGFydCwgICBfX2l0dF9ncm91cF9tYXJrIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJWQiKQorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsICBldmVudF9lbmQsICAgICAgICAgICAgKF9faXR0X2V2ZW50IGV2ZW50KSwgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZXZlbnQpLCAgICAgICAgIGV2ZW50X2VuZCwgICAgIF9faXR0X2dyb3VwX21hcmsgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlZCIpCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworCisjaWZuZGVmIF9fSVRUX0lOVEVSTkFMX0JPRFkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfc2V0X25hbWVBLCAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSksIChJVFRfRk9STUFUIGFkZHIsIG9ianR5cGUsIG9iam5hbWUsIGF0dHJpYnV0ZSksIHN5bmNfc2V0X25hbWVBLCBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlcCwgXCIlc1wiLCBcIiVzXCIsICV4IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfc2V0X25hbWVXLCAodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqb2JqdHlwZSwgY29uc3Qgd2NoYXJfdCAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSksIChJVFRfRk9STUFUIGFkZHIsIG9ianR5cGUsIG9iam5hbWUsIGF0dHJpYnV0ZSksIHN5bmNfc2V0X25hbWVXLCBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlcCwgXCIlU1wiLCBcIiVTXCIsICV4IikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfc2V0X25hbWUsICAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSksIChJVFRfRk9STUFUIGFkZHIsIG9ianR5cGUsIG9iam5hbWUsIGF0dHJpYnV0ZSksIHN5bmNfc2V0X25hbWUsICBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICJwLCBcIiVzXCIsIFwiJXNcIiwgJXgiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgbm90aWZ5X3N5bmNfbmFtZUEsICh2b2lkICpwLCBjb25zdCBjaGFyICAgICpvYmp0eXBlLCBpbnQgdHlwZWxlbiwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IG5hbWVsZW4sIGludCBhdHRyaWJ1dGUpLCAoSVRUX0ZPUk1BVCBwLCBvYmp0eXBlLCB0eXBlbGVuLCBvYmpuYW1lLCBuYW1lbGVuLCBhdHRyaWJ1dGUpLCBub3RpZnlfc3luY19uYW1lQSwgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAsIFwiJXNcIiwgJWQsIFwiJXNcIiwgJWQsICV4IikKK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCBub3RpZnlfc3luY19uYW1lVywgKHZvaWQgKnAsIGNvbnN0IHdjaGFyX3QgKm9ianR5cGUsIGludCB0eXBlbGVuLCBjb25zdCB3Y2hhcl90ICpvYmpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGF0dHJpYnV0ZSksIChJVFRfRk9STUFUIHAsIG9ianR5cGUsIHR5cGVsZW4sIG9iam5hbWUsIG5hbWVsZW4sIGF0dHJpYnV0ZSksIG5vdGlmeV9zeW5jX25hbWVXLCBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlcCwgXCIlU1wiLCAlZCwgXCIlU1wiLCAlZCwgJXgiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIG5vdGlmeV9zeW5jX25hbWUsICAodm9pZCAqcCwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgaW50IHR5cGVsZW4sIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBuYW1lbGVuLCBpbnQgYXR0cmlidXRlKSwgKElUVF9GT1JNQVQgcCwgb2JqdHlwZSwgdHlwZWxlbiwgb2JqbmFtZSwgbmFtZWxlbiwgYXR0cmlidXRlKSwgbm90aWZ5X3N5bmNfbmFtZSwgIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYyB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVwLCBcIiVzXCIsICVkLCBcIiVzXCIsICVkLCAleCIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG5vdGlmeV9zeW5jX3ByZXBhcmUsICAgKHZvaWQgKnApLCAoSVRUX0ZPUk1BVCBwKSwgbm90aWZ5X3N5bmNfcHJlcGFyZSwgICBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlcCIpCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBub3RpZnlfc3luY19jYW5jZWwsICAgICh2b2lkICpwKSwgKElUVF9GT1JNQVQgcCksIG5vdGlmeV9zeW5jX2NhbmNlbCwgICAgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAiKQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbm90aWZ5X3N5bmNfYWNxdWlyZWQsICAodm9pZCAqcCksIChJVFRfRk9STUFUIHApLCBub3RpZnlfc3luY19hY3F1aXJlZCwgIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYyB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVwIikKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG5vdGlmeV9zeW5jX3JlbGVhc2luZywgKHZvaWQgKnApLCAoSVRUX0ZPUk1BVCBwKSwgbm90aWZ5X3N5bmNfcmVsZWFzaW5nLCBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlcCIpCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBtZW1vcnlfcmVhZCwgICAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBzaXplKSwgbWVtb3J5X3JlYWQsICAgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAsICVsdSIpCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBtZW1vcnlfd3JpdGUsICAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBzaXplKSwgbWVtb3J5X3dyaXRlLCAgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAsICVsdSIpCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBtZW1vcnlfdXBkYXRlLCAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBzaXplKSwgbWVtb3J5X3VwZGF0ZSwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAsICVsdSIpCisKK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfc3RhdGVfdCwgICAgIHN0YXRlX2dldCwgICAgKHZvaWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfTk9fUEFSQU1TKSwgICBzdGF0ZV9nZXQsICAgIF9faXR0X2dyb3VwX2xlZ2FjeSwgIm5vIGFyZ3MiKQorSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9zdGF0ZV90LCAgICAgc3RhdGVfc2V0LCAgICAoX19pdHRfc3RhdGVfdCBzKSwgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgcyksICAgIHN0YXRlX3NldCwgICAgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJWQiKQorSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9vYmpfc3RhdGVfdCwgb2JqX21vZGVfc2V0LCAoX19pdHRfb2JqX3Byb3BfdCBwLCBfX2l0dF9vYmpfc3RhdGVfdCBzKSwgKElUVF9GT1JNQVQgcCwgcyksIG9ial9tb2RlX3NldCwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJWQsICVkIikKK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfdGhyX3N0YXRlX3QsIHRocl9tb2RlX3NldCwgKF9faXR0X3Rocl9wcm9wX3QgcCwgX19pdHRfdGhyX3N0YXRlX3QgcyksIChJVFRfRk9STUFUIHAsIHMpLCB0aHJfbW9kZV9zZXQsIF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVkLCAlZCIpCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9mcmFtZSwgZnJhbWVfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKmRvbWFpbiksIChJVFRfRk9STUFUIGRvbWFpbiksIGZyYW1lX2NyZWF0ZUEsIF9faXR0X2dyb3VwX2ZyYW1lLCAiXCIlc1wiIikKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZnJhbWUsIGZyYW1lX2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpkb21haW4pLCAoSVRUX0ZPUk1BVCBkb21haW4pLCBmcmFtZV9jcmVhdGVXLCBfX2l0dF9ncm91cF9mcmFtZSwgIlwiJXNcIiIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2ZyYW1lLCBmcmFtZV9jcmVhdGUsICAoY29uc3QgY2hhciAgICAqZG9tYWluKSwgKElUVF9GT1JNQVQgZG9tYWluKSwgZnJhbWVfY3JlYXRlLCAgX19pdHRfZ3JvdXBfZnJhbWUsICJcIiVzXCIiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZyYW1lX2JlZ2luLCAgICAgICAgIChfX2l0dF9mcmFtZSBmcmFtZSksICAgICAoSVRUX0ZPUk1BVCBmcmFtZSksICBmcmFtZV9iZWdpbiwgICBfX2l0dF9ncm91cF9mcmFtZSwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZyYW1lX2VuZCwgICAgICAgICAgIChfX2l0dF9mcmFtZSBmcmFtZSksICAgICAoSVRUX0ZPUk1BVCBmcmFtZSksICBmcmFtZV9lbmQsICAgICBfX2l0dF9ncm91cF9mcmFtZSwgIiVwIikKKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2NvdW50ZXIsIGNvdW50ZXJfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGNvbnN0IGNoYXIgICAgKmRvbWFpbiksIChJVFRfRk9STUFUIG5hbWUsIGRvbWFpbiksIGNvdW50ZXJfY3JlYXRlQSwgX19pdHRfZ3JvdXBfY291bnRlciwgIlwiJXNcIiwgXCIlc1wiIikKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfY291bnRlciwgY291bnRlcl9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSwgY29uc3Qgd2NoYXJfdCAqZG9tYWluKSwgKElUVF9GT1JNQVQgbmFtZSwgZG9tYWluKSwgY291bnRlcl9jcmVhdGVXLCBfX2l0dF9ncm91cF9jb3VudGVyLCAiXCIlc1wiLCBcIiVzXCIiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9jb3VudGVyLCBjb3VudGVyX2NyZWF0ZSwgIChjb25zdCBjaGFyICAgICpuYW1lLCBjb25zdCBjaGFyICAgICpkb21haW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBkb21haW4pLCBjb3VudGVyX2NyZWF0ZSwgIF9faXR0X2dyb3VwX2NvdW50ZXIsICJcIiVzXCIsIFwiJXNcIiIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgY291bnRlcl9kZXN0cm95LCAgIChfX2l0dF9jb3VudGVyIGlkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBpZCksICAgICAgICBjb3VudGVyX2Rlc3Ryb3ksICAgX19pdHRfZ3JvdXBfY291bnRlciwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGNvdW50ZXJfaW5jLCAgICAgICAoX19pdHRfY291bnRlciBpZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgaWQpLCAgICAgICAgY291bnRlcl9pbmMsICAgICAgIF9faXR0X2dyb3VwX2NvdW50ZXIsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBjb3VudGVyX2luY19kZWx0YSwgKF9faXR0X2NvdW50ZXIgaWQsIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZSksIChJVFRfRk9STUFUIGlkLCB2YWx1ZSksIGNvdW50ZXJfaW5jX2RlbHRhLCBfX2l0dF9ncm91cF9jb3VudGVyLCAiJXAsICVsdSIpCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9tYXJrX3R5cGUsIG1hcmtfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgbWFya19jcmVhdGVBLCBfX2l0dF9ncm91cF9tYXJrLCAiXCIlc1wiIikKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfbWFya190eXBlLCBtYXJrX2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIG1hcmtfY3JlYXRlVywgX19pdHRfZ3JvdXBfbWFyaywgIlwiJVNcIiIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIF9faXR0X21hcmtfdHlwZSwgbWFya19jcmVhdGUsICAoY29uc3QgY2hhciAgICAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCBtYXJrX2NyZWF0ZSwgIF9faXR0X2dyb3VwX21hcmssICJcIiVzXCIiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgaW50LCAgbWFya0EsICAgICAgICAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICAgICpwYXJhbWV0ZXIpLCAoSVRUX0ZPUk1BVCBtdCwgcGFyYW1ldGVyKSwgbWFya0EsIF9faXR0X2dyb3VwX21hcmssICIlZCwgXCIlc1wiIikKK0lUVF9TVFVCKElUVEFQSSwgaW50LCAgbWFya1csICAgICAgICAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCB3Y2hhcl90ICpwYXJhbWV0ZXIpLCAoSVRUX0ZPUk1BVCBtdCwgcGFyYW1ldGVyKSwgbWFya1csIF9faXR0X2dyb3VwX21hcmssICIlZCwgXCIlU1wiIikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgaW50LCAgbWFyaywgICAgICAgICAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICAgICpwYXJhbWV0ZXIpLCAoSVRUX0ZPUk1BVCBtdCwgcGFyYW1ldGVyKSwgbWFyaywgIF9faXR0X2dyb3VwX21hcmssICIlZCwgXCIlc1wiIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgaW50LCAgbWFya19vZmYsIChfX2l0dF9tYXJrX3R5cGUgbXQpLCAoSVRUX0ZPUk1BVCBtdCksIG1hcmtfb2ZmLCBfX2l0dF9ncm91cF9tYXJrLCAiJWQiKQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBpbnQsICBtYXJrX2dsb2JhbEEsIChfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IGNoYXIgICAgKnBhcmFtZXRlciksIChJVFRfRk9STUFUIG10LCBwYXJhbWV0ZXIpLCBtYXJrX2dsb2JhbEEsIF9faXR0X2dyb3VwX21hcmssICIlZCwgXCIlc1wiIikKK0lUVF9TVFVCKElUVEFQSSwgaW50LCAgbWFya19nbG9iYWxXLCAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCB3Y2hhcl90ICpwYXJhbWV0ZXIpLCAoSVRUX0ZPUk1BVCBtdCwgcGFyYW1ldGVyKSwgbWFya19nbG9iYWxXLCBfX2l0dF9ncm91cF9tYXJrLCAiJWQsIFwiJVNcIiIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIGludCwgIG1hcmtfZ2xvYmFsLCAgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciAgICAqcGFyYW1ldGVyKSwgKElUVF9GT1JNQVQgbXQsIHBhcmFtZXRlciksIG1hcmtfZ2xvYmFsLCAgX19pdHRfZ3JvdXBfbWFyaywgIiVkLCBcIiVTXCIiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBpbnQsICBtYXJrX2dsb2JhbF9vZmYsIChfX2l0dF9tYXJrX3R5cGUgbXQpLCAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIG10KSwgICAgICAgICAgICBtYXJrX2dsb2JhbF9vZmYsIF9faXR0X2dyb3VwX21hcmssICIlZCIpCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9jYWxsZXIsIHN0YWNrX2NhbGxlcl9jcmVhdGUsICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCBzdGFja19jYWxsZXJfY3JlYXRlLCAgX19pdHRfZ3JvdXBfc3RpdGNoLCAibm8gYXJncyIpCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3RhY2tfY2FsbGVyX2Rlc3Ryb3ksIChfX2l0dF9jYWxsZXIgaWQpLCAoSVRUX0ZPUk1BVCBpZCksIHN0YWNrX2NhbGxlcl9kZXN0cm95LCBfX2l0dF9ncm91cF9zdGl0Y2gsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdGFja19jYWxsZWVfZW50ZXIsICAgKF9faXR0X2NhbGxlciBpZCksIChJVFRfRk9STUFUIGlkKSwgc3RhY2tfY2FsbGVlX2VudGVyLCAgIF9faXR0X2dyb3VwX3N0aXRjaCwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN0YWNrX2NhbGxlZV9sZWF2ZSwgICAoX19pdHRfY2FsbGVyIGlkKSwgKElUVF9GT1JNQVQgaWQpLCBzdGFja19jYWxsZWVfbGVhdmUsICAgX19pdHRfZ3JvdXBfc3RpdGNoLCAiJXAiKQorCitJVFRfU1RVQihJVFRBUEksICBfX2l0dF9jbG9ja19kb21haW4qLCBjbG9ja19kb21haW5fY3JlYXRlLCAoX19pdHRfZ2V0X2Nsb2NrX2luZm9fZm4gZm4sIHZvaWQqIGZuX2RhdGEpLCAoSVRUX0ZPUk1BVCBmbiwgZm5fZGF0YSksIGNsb2NrX2RvbWFpbl9jcmVhdGUsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCAgICAgICAgICAgICAgICBjbG9ja19kb21haW5fcmVzZXQsICAodm9pZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX05PX1BBUkFNUyksICAgICAgICAgIGNsb2NrX2RvbWFpbl9yZXNldCwgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIm5vIGFyZ3MiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaWRfY3JlYXRlX2V4LCAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGNsb2NrX2RvbWFpbiwgdGltZXN0YW1wLCBpZCksIGlkX2NyZWF0ZV9leCwgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlbHUiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaWRfZGVzdHJveV9leCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGNsb2NrX2RvbWFpbiwgdGltZXN0YW1wLCBpZCksIGlkX2Rlc3Ryb3lfZXgsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlbHUiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19iZWdpbl9leCwgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSwgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCwgaWQsIHBhcmVudGlkLCBuYW1lKSwgdGFza19iZWdpbl9leCwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUsICVsdSwgJWx1LCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2JlZ2luX2ZuX2V4LCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50aWQsIHZvaWQqIGZuKSwgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4sIGNsb2NrX2RvbWFpbiwgdGltZXN0YW1wLCBpZCwgcGFyZW50aWQsIGZuKSwgdGFza19iZWdpbl9mbl9leCwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUsICVsdSwgJWx1LCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2VuZF9leCwgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4sIGNsb2NrX2RvbWFpbiwgdGltZXN0YW1wKSwgdGFza19lbmRfZXgsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW5fb3ZlcmxhcHBlZCwgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50LCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwgcGFyZW50LCBuYW1lKSwgdGFza19iZWdpbl9vdmVybGFwcGVkLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1LCAlbHUsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW5fb3ZlcmxhcHBlZF9leCwgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSwgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCwgaWQsIHBhcmVudGlkLCBuYW1lKSwgdGFza19iZWdpbl9vdmVybGFwcGVkX2V4LCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVsdSwgJWx1LCAlbHUsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfZW5kX292ZXJsYXBwZWQsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBpZCksIHRhc2tfZW5kX292ZXJsYXBwZWQsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19lbmRfb3ZlcmxhcHBlZF9leCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4sIGNsb2NrX2RvbWFpbiwgdGltZXN0YW1wLCBpZCksIHRhc2tfZW5kX292ZXJsYXBwZWRfZXgsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlbHUiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWFya2VyX2V4LCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSwgX19pdHRfc2NvcGUgc2NvcGUpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGNsb2NrX2RvbWFpbiwgdGltZXN0YW1wLCBpZCwgbmFtZSwgc2NvcGUpLCBtYXJrZXJfZXgsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlbHUsICVwLCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9hZGRfd2l0aF9zY29wZSwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zY29wZSBzY29wZSwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBfX2l0dF9tZXRhZGF0YV90eXBlIHR5cGUsIHNpemVfdCBjb3VudCwgdm9pZCAqZGF0YSksIChJVFRfRk9STUFUIGRvbWFpbiwgc2NvcGUsIGtleSwgdHlwZSwgY291bnQsIGRhdGEpLCBtZXRhZGF0YV9hZGRfd2l0aF9zY29wZSwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVkLCAlcCwgJWQsICVsdSwgJXAiKQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQSwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zY29wZSBzY29wZSwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuZ3RoKSwgICAgKElUVF9GT1JNQVQgZG9tYWluLCBzY29wZSwga2V5LCBkYXRhLCBsZW5ndGgpLCBtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVBLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWQsICVwLCAlcCwgJWx1IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZVcsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3Qgd2NoYXJfdCAqZGF0YSwgc2l6ZV90IGxlbmd0aCksIChJVFRfRk9STUFUIGRvbWFpbiwgc2NvcGUsIGtleSwgZGF0YSwgbGVuZ3RoKSwgbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlVywgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVkLCAlcCwgJXAsICVsdSIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGUsICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3Njb3BlIHNjb3BlLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW5ndGgpLCAgICAoSVRUX0ZPUk1BVCBkb21haW4sIHNjb3BlLCBrZXksIGRhdGEsIGxlbmd0aCksIG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZSwgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlZCwgJXAsICVwLCAlbHUiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfZXgsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKSwgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCwgcmVsYXRpb24sIHRhaWwpLCAgICAgICByZWxhdGlvbl9hZGRfdG9fY3VycmVudF9leCwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUsICVkLCAlbHUiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVsYXRpb25fYWRkX2V4LCAgICAgICAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGhlYWQsIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKSwgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCwgaGVhZCwgcmVsYXRpb24sIHRhaWwpLCByZWxhdGlvbl9hZGRfZXgsICAgICAgICAgICAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUsICVsdSwgJWQsICVsdSIpCitJVFRfU1RVQihJVFRBUEksICBfX2l0dF90cmFja19ncm91cCosIHRyYWNrX2dyb3VwX2NyZWF0ZSwgKF9faXR0X3N0cmluZ19oYW5kbGUqIG5hbWUsIF9faXR0X3RyYWNrX2dyb3VwX3R5cGUgdHJhY2tfZ3JvdXBfdHlwZSksICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBuYW1lLCB0cmFja19ncm91cF90eXBlKSwgICAgICAgIHRyYWNrX2dyb3VwX2NyZWF0ZSwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVkIikKK0lUVF9TVFVCKElUVEFQSSwgIF9faXR0X3RyYWNrKiwgICAgICAgdHJhY2tfY3JlYXRlLCAgICAgICAoX19pdHRfdHJhY2tfZ3JvdXAqIHRyYWNrX2dyb3VwLF9faXR0X3N0cmluZ19oYW5kbGUqIG5hbWUsIF9faXR0X3RyYWNrX3R5cGUgdHJhY2tfdHlwZSksIChJVFRfRk9STUFUIHRyYWNrX2dyb3VwLCBuYW1lLCB0cmFja190eXBlKSwgdHJhY2tfY3JlYXRlLCAgICAgICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsICAgICAgICAgICAgICAgc2V0X3RyYWNrLCAgICAgICAgICAoX19pdHRfdHJhY2sgKnRyYWNrKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIHRyYWNrKSwgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3RyYWNrLCAgICAgICAgICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCIpCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorSVRUX1NUVUIoSVRUQVBJLCBjb25zdCBjaGFyKiwgYXBpX3ZlcnNpb24sICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCBhcGlfdmVyc2lvbiwgX19pdHRfZ3JvdXBfYWxsICYgfl9faXR0X2dyb3VwX2xlZ2FjeSwgIm5vIGFyZ3MiKQorI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIGludCwgYXZfc2F2ZUEsICh2b2lkICpkYXRhLCBpbnQgcmFuaywgY29uc3QgaW50ICpkaW1lbnNpb25zLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqZmlsZVBhdGgsIGludCBjb2x1bW5PcmRlciksIChJVFRfRk9STUFUIGRhdGEsIHJhbmssIGRpbWVuc2lvbnMsIHR5cGUsIGZpbGVQYXRoLCBjb2x1bW5PcmRlciksIGF2X3NhdmVBLCBfX2l0dF9ncm91cF9hcnJheXMsICIlcCwgJWQsICVwLCAlZCwgXCIlc1wiLCAlZCIpCitJVFRfU1RVQihJVFRBUEksIGludCwgYXZfc2F2ZVcsICh2b2lkICpkYXRhLCBpbnQgcmFuaywgY29uc3QgaW50ICpkaW1lbnNpb25zLCBpbnQgdHlwZSwgY29uc3Qgd2NoYXJfdCAqZmlsZVBhdGgsIGludCBjb2x1bW5PcmRlciksIChJVFRfRk9STUFUIGRhdGEsIHJhbmssIGRpbWVuc2lvbnMsIHR5cGUsIGZpbGVQYXRoLCBjb2x1bW5PcmRlciksIGF2X3NhdmVXLCBfX2l0dF9ncm91cF9hcnJheXMsICIlcCwgJWQsICVwLCAlZCwgXCIlU1wiLCAlZCIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIGludCwgYXZfc2F2ZSwgICh2b2lkICpkYXRhLCBpbnQgcmFuaywgY29uc3QgaW50ICpkaW1lbnNpb25zLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqZmlsZVBhdGgsIGludCBjb2x1bW5PcmRlciksIChJVFRfRk9STUFUIGRhdGEsIHJhbmssIGRpbWVuc2lvbnMsIHR5cGUsIGZpbGVQYXRoLCBjb2x1bW5PcmRlciksIGF2X3NhdmUsICBfX2l0dF9ncm91cF9hcnJheXMsICIlcCwgJWQsICVwLCAlZCwgXCIlc1wiLCAlZCIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfQk9EWSAqLworCisjZW5kaWYgLyogX19JVFRfSU5URVJOQUxfSU5JVCAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X3R5cGVzLmggYi9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjk1YTY3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X3R5cGVzLmgKQEAgLTAsMCArMSw2NyBAQAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIF9JVFROT1RJRllfVFlQRVNfSF8KKyNkZWZpbmUgX0lUVE5PVElGWV9UWVBFU19IXworCit0eXBlZGVmIGVudW0gX19faXR0X2dyb3VwX2lkCit7CisgICAgX19pdHRfZ3JvdXBfbm9uZSAgICAgID0gMCwKKyAgICBfX2l0dF9ncm91cF9sZWdhY3kgICAgPSAxPDwwLAorICAgIF9faXR0X2dyb3VwX2NvbnRyb2wgICA9IDE8PDEsCisgICAgX19pdHRfZ3JvdXBfdGhyZWFkICAgID0gMTw8MiwKKyAgICBfX2l0dF9ncm91cF9tYXJrICAgICAgPSAxPDwzLAorICAgIF9faXR0X2dyb3VwX3N5bmMgICAgICA9IDE8PDQsCisgICAgX19pdHRfZ3JvdXBfZnN5bmMgICAgID0gMTw8NSwKKyAgICBfX2l0dF9ncm91cF9qaXQgICAgICAgPSAxPDw2LAorICAgIF9faXR0X2dyb3VwX21vZGVsICAgICA9IDE8PDcsCisgICAgX19pdHRfZ3JvdXBfc3BsaXR0ZXJfbWluID0gMTw8NywKKyAgICBfX2l0dF9ncm91cF9jb3VudGVyICAgPSAxPDw4LAorICAgIF9faXR0X2dyb3VwX2ZyYW1lICAgICA9IDE8PDksCisgICAgX19pdHRfZ3JvdXBfc3RpdGNoICAgID0gMTw8MTAsCisgICAgX19pdHRfZ3JvdXBfaGVhcCAgICAgID0gMTw8MTEsCisgICAgX19pdHRfZ3JvdXBfc3BsaXR0ZXJfbWF4ID0gMTw8MTIsCisgICAgX19pdHRfZ3JvdXBfc3RydWN0dXJlID0gMTw8MTIsCisgICAgX19pdHRfZ3JvdXBfc3VwcHJlc3MgPSAxPDwxMywKKyAgICBfX2l0dF9ncm91cF9hcnJheXMgICAgPSAxPDwxNCwKKyAgICBfX2l0dF9ncm91cF9hbGwgICAgICAgPSAtMQorfSBfX2l0dF9ncm91cF9pZDsKKworI3ByYWdtYSBwYWNrKHB1c2gsIDgpCisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9ncm91cF9saXN0Cit7CisgICAgX19pdHRfZ3JvdXBfaWQgaWQ7CisgICAgY29uc3QgY2hhciogICAgbmFtZTsKK30gX19pdHRfZ3JvdXBfbGlzdDsKKworI3ByYWdtYSBwYWNrKHBvcCkKKworI2RlZmluZSBJVFRfR1JPVVBfTElTVCh2YXJuYW1lKSBcCisgICAgc3RhdGljIF9faXR0X2dyb3VwX2xpc3QgdmFybmFtZVtdID0geyAgICAgICBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfYWxsLCAgICAgICAiYWxsIiAgICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfY29udHJvbCwgICAiY29udHJvbCIgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfdGhyZWFkLCAgICAidGhyZWFkIiAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfbWFyaywgICAgICAibWFyayIgICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfc3luYywgICAgICAic3luYyIgICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfZnN5bmMsICAgICAiZnN5bmMiICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfaml0LCAgICAgICAiaml0IiAgICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfbW9kZWwsICAgICAibW9kZWwiICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfY291bnRlciwgICAiY291bnRlciIgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfZnJhbWUsICAgICAiZnJhbWUiICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfc3RpdGNoLCAgICAic3RpdGNoIiAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfaGVhcCwgICAgICAiaGVhcCIgICAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAic3RydWN0dXJlIiB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfc3VwcHJlc3MsICAic3VwcHJlc3MiICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfYXJyYXlzLCAgICAiYXJyYXlzIiAgICB9LCBcCisgICAgICAgIHsgX19pdHRfZ3JvdXBfbm9uZSwgICAgICBOVUxMICAgICAgICB9ICBcCisgICAgfQorCisjZW5kaWYgLyogX0lUVE5PVElGWV9UWVBFU19IXyAqLwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvbGVnYWN5L2l0dG5vdGlmeS5oIGIvZmluYWwvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvbGVnYWN5L2l0dG5vdGlmeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYzJjMGIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9sZWdhY3kvaXR0bm90aWZ5LmgKQEAgLTAsMCArMSw5NzIgQEAKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTEVHQUNZX0lUVE5PVElGWV9IXworI2RlZmluZSBfTEVHQUNZX0lUVE5PVElGWV9IXworCisvKioKKyAqIEBmaWxlCisgKiBAYnJpZWYgTGVnYWN5IFVzZXIgQVBJIGZ1bmN0aW9ucyBhbmQgdHlwZXMKKyAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSVRUX09TX1dJTgorIyAgZGVmaW5lIElUVF9PU19XSU4gICAxCisjZW5kaWYgLyogSVRUX09TX1dJTiAqLworCisjaWZuZGVmIElUVF9PU19MSU5VWAorIyAgZGVmaW5lIElUVF9PU19MSU5VWCAyCisjZW5kaWYgLyogSVRUX09TX0xJTlVYICovCisKKyNpZm5kZWYgSVRUX09TX01BQworIyAgZGVmaW5lIElUVF9PU19NQUMgICAzCisjZW5kaWYgLyogSVRUX09TX01BQyAqLworCisjaWZuZGVmIElUVF9PUworIyAgaWYgZGVmaW5lZCBXSU4zMiB8fCBkZWZpbmVkIF9XSU4zMgorIyAgICBkZWZpbmUgSVRUX09TIElUVF9PU19XSU4KKyMgIGVsaWYgZGVmaW5lZCggX19BUFBMRV9fICkgJiYgZGVmaW5lZCggX19NQUNIX18gKQorIyAgICBkZWZpbmUgSVRUX09TIElUVF9PU19NQUMKKyMgIGVsc2UKKyMgICAgZGVmaW5lIElUVF9PUyBJVFRfT1NfTElOVVgKKyMgIGVuZGlmCisjZW5kaWYgLyogSVRUX09TICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNX1dJTgorIyAgZGVmaW5lIElUVF9QTEFURk9STV9XSU4gMQorI2VuZGlmIC8qIElUVF9QTEFURk9STV9XSU4gKi8KKworI2lmbmRlZiBJVFRfUExBVEZPUk1fUE9TSVgKKyMgIGRlZmluZSBJVFRfUExBVEZPUk1fUE9TSVggMgorI2VuZGlmIC8qIElUVF9QTEFURk9STV9QT1NJWCAqLworCisjaWZuZGVmIElUVF9QTEFURk9STV9NQUMKKyMgIGRlZmluZSBJVFRfUExBVEZPUk1fTUFDIDMKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk1fTUFDICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNCisjICBpZiBJVFRfT1M9PUlUVF9PU19XSU4KKyMgICAgZGVmaW5lIElUVF9QTEFURk9STSBJVFRfUExBVEZPUk1fV0lOCisjICBlbGlmIElUVF9PUz09SVRUX09TX01BQworIyAgICBkZWZpbmUgSVRUX1BMQVRGT1JNIElUVF9QTEFURk9STV9NQUMKKyMgIGVsc2UKKyMgICAgZGVmaW5lIElUVF9QTEFURk9STSBJVFRfUExBVEZPUk1fUE9TSVgKKyMgIGVuZGlmCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNICovCisKKyNpZiBkZWZpbmVkKF9VTklDT0RFKSAmJiAhZGVmaW5lZChVTklDT0RFKQorI2RlZmluZSBVTklDT0RFCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2luY2x1ZGUgPHRjaGFyLmg+CisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorI2luY2x1ZGUgPHdjaGFyLmg+CisjZW5kaWYgLyogVU5JQ09ERSB8fCBfVU5JQ09ERSAqLworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisjaWZuZGVmIENERUNMCisjICBpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyMgICAgZGVmaW5lIENERUNMIF9fY2RlY2wKKyMgIGVsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjICAgIGlmIGRlZmluZWQgX01fSVg4NiB8fCBkZWZpbmVkIF9faTM4Nl9fCisjICAgICAgZGVmaW5lIENERUNMIF9fYXR0cmlidXRlX18gKChjZGVjbCkpCisjICAgIGVsc2UgIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgICAgICBkZWZpbmUgQ0RFQ0wgLyogYWN0dWFsIG9ubHkgb24geDg2IHBsYXRmb3JtICovCisjICAgIGVuZGlmIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgIGVuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIENERUNMICovCisKKyNpZm5kZWYgU1REQ0FMTAorIyAgaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjICAgIGRlZmluZSBTVERDQUxMIF9fc3RkY2FsbAorIyAgZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyMgICAgaWYgZGVmaW5lZCBfTV9JWDg2IHx8IGRlZmluZWQgX19pMzg2X18KKyMgICAgICBkZWZpbmUgU1REQ0FMTCBfX2F0dHJpYnV0ZV9fICgoc3RkY2FsbCkpCisjICAgIGVsc2UgIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgICAgICBkZWZpbmUgU1REQ0FMTCAvKiBzdXBwb3J0ZWQgb25seSBvbiB4ODYgcGxhdGZvcm0gKi8KKyMgICAgZW5kaWYgLyogX01fSVg4NiB8fCBfX2kzODZfXyAqLworIyAgZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogU1REQ0FMTCAqLworCisjZGVmaW5lIElUVEFQSSAgICBDREVDTAorI2RlZmluZSBMSUJJVFRBUEkgQ0RFQ0wKKworLyogVE9ETzogVGVtcG9yYXJ5IGZvciBjb21wYXRpYmlsaXR5ISAqLworI2RlZmluZSBJVFRBUElfQ0FMTCAgICBDREVDTAorI2RlZmluZSBMSUJJVFRBUElfQ0FMTCBDREVDTAorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisvKiB1c2UgX19mb3JjZWlubGluZSAoVkMrKyBzcGVjaWZpYykgKi8KKyNkZWZpbmUgSVRUX0lOTElORSAgICAgICAgICAgX19mb3JjZWlubGluZQorI2RlZmluZSBJVFRfSU5MSU5FX0FUVFJJQlVURSAvKiBub3RoaW5nICovCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisvKgorICogR2VuZXJhbGx5LCBmdW5jdGlvbnMgYXJlIG5vdCBpbmxpbmVkIHVubGVzcyBvcHRpbWl6YXRpb24gaXMgc3BlY2lmaWVkLgorICogRm9yIGZ1bmN0aW9ucyBkZWNsYXJlZCBpbmxpbmUsIHRoaXMgYXR0cmlidXRlIGlubGluZXMgdGhlIGZ1bmN0aW9uIGV2ZW4KKyAqIGlmIG5vIG9wdGltaXphdGlvbiBsZXZlbCB3YXMgc3BlY2lmaWVkLgorICovCisjaWZkZWYgX19TVFJJQ1RfQU5TSV9fCisjZGVmaW5lIElUVF9JTkxJTkUgICAgICAgICAgIHN0YXRpYworI2RlZmluZSBJVFRfSU5MSU5FX0FUVFJJQlVURSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorI2Vsc2UgIC8qIF9fU1RSSUNUX0FOU0lfXyAqLworI2RlZmluZSBJVFRfSU5MSU5FICAgICAgICAgICBzdGF0aWMgaW5saW5lCisjZGVmaW5lIElUVF9JTkxJTkVfQVRUUklCVVRFIF9fYXR0cmlidXRlX18oKGFsd2F5c19pbmxpbmUsIHVudXNlZCkpCisjZW5kaWYgLyogX19TVFJJQ1RfQU5TSV9fICovCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisvKiBIZWxwZXIgbWFjcm8gZm9yIGpvaW5pbmcgdG9rZW5zICovCisjZGVmaW5lIElUVF9KT0lOX0FVWChwLG4pIHAjI24KKyNkZWZpbmUgSVRUX0pPSU4ocCxuKSAgICAgSVRUX0pPSU5fQVVYKHAsbikKKworI2lmZGVmIElUVF9NQUpPUgorI3VuZGVmIElUVF9NQUpPUgorI2VuZGlmCisjaWZkZWYgSVRUX01JTk9SCisjdW5kZWYgSVRUX01JTk9SCisjZW5kaWYKKyNkZWZpbmUgSVRUX01BSk9SICAgICAzCisjZGVmaW5lIElUVF9NSU5PUiAgICAgMAorCisvKiBTdGFuZGFyZCB2ZXJzaW9uaW5nIG9mIGEgdG9rZW4gd2l0aCBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBudW1iZXJzICovCisjZGVmaW5lIElUVF9WRVJTSU9OSVpFKHgpICAgIFwKKyAgICBJVFRfSk9JTih4LCAgICAgICAgICAgICAgXAorICAgIElUVF9KT0lOKF8sICAgICAgICAgICAgICBcCisgICAgSVRUX0pPSU4oSVRUX01BSk9SLCAgICAgIFwKKyAgICBJVFRfSk9JTihfLCBJVFRfTUlOT1IpKSkpCisKKyNpZm5kZWYgSU5URUxfSVRUTk9USUZZX1BSRUZJWAorIyAgZGVmaW5lIElOVEVMX0lUVE5PVElGWV9QUkVGSVggX19pdHRfCisjZW5kaWYgLyogSU5URUxfSVRUTk9USUZZX1BSRUZJWCAqLworI2lmbmRlZiBJTlRFTF9JVFROT1RJRllfUE9TVEZJWAorIyAgZGVmaW5lIElOVEVMX0lUVE5PVElGWV9QT1NURklYIF9wdHJfCisjZW5kaWYgLyogSU5URUxfSVRUTk9USUZZX1BPU1RGSVggKi8KKworI2RlZmluZSBJVFROT1RJRllfTkFNRV9BVVgobikgSVRUX0pPSU4oSU5URUxfSVRUTk9USUZZX1BSRUZJWCxuKQorI2RlZmluZSBJVFROT1RJRllfTkFNRShuKSAgICAgSVRUX1ZFUlNJT05JWkUoSVRUTk9USUZZX05BTUVfQVVYKElUVF9KT0lOKG4sSU5URUxfSVRUTk9USUZZX1BPU1RGSVgpKSkKKworI2RlZmluZSBJVFROT1RJRllfVk9JRChuKSAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKQorI2RlZmluZSBJVFROT1RJRllfREFUQShuKSAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKQorCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0QwKG4sZCkgICAgICAgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkKQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9EMShuLGQseCkgICAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4KQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9EMihuLGQseCx5KSAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkpCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0QzKG4sZCx4LHkseikgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6KQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9ENChuLGQseCx5LHosYSkgICAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhKQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9ENShuLGQseCx5LHosYSxiKSAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhLGIpCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0Q2KG4sZCx4LHkseixhLGIsYykgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6LGEsYixjKQorI2RlZmluZSBJVFROT1RJRllfREFUQV9EMChuLGQpICAgICAgICghKGQpLT5mbGFncykgPyAgICAgICAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCkKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDEobixkLHgpICAgICAoIShkKS0+ZmxhZ3MpID8gICAgICAgMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCkKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDIobixkLHgseSkgICAoIShkKS0+ZmxhZ3MpID8gICAgICAgMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5KQorI2RlZmluZSBJVFROT1RJRllfREFUQV9EMyhuLGQseCx5LHopICghKGQpLT5mbGFncykgPyAgICAgICAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseikKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDQobixkLHgseSx6LGEpICAgICAoIShkKS0+ZmxhZ3MpID8gMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHosYSkKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDUobixkLHgseSx6LGEsYikgICAoIShkKS0+ZmxhZ3MpID8gMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHosYSxiKQorI2RlZmluZSBJVFROT1RJRllfREFUQV9ENihuLGQseCx5LHosYSxiLGMpICghKGQpLT5mbGFncykgPyAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhLGIsYykKKworI2lmZGVmIElUVF9TVFVCCisjdW5kZWYgSVRUX1NUVUIKKyNlbmRpZgorI2lmZGVmIElUVF9TVFVCVgorI3VuZGVmIElUVF9TVFVCVgorI2VuZGlmCisjZGVmaW5lIElUVF9TVFVCVihhcGksdHlwZSxuYW1lLGFyZ3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZWRlZiB0eXBlIChhcGkqIElUVF9KT0lOKElUVE5PVElGWV9OQU1FKG5hbWUpLF90KSkgYXJnczsgICBcCisgICAgZXh0ZXJuIElUVF9KT0lOKElUVE5PVElGWV9OQU1FKG5hbWUpLF90KSBJVFROT1RJRllfTkFNRShuYW1lKTsKKyNkZWZpbmUgSVRUX1NUVUIgSVRUX1NUVUJWCisvKiogQGVuZGNvbmQgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisvKioKKyAqIEBkZWZncm91cCBsZWdhY3kgTGVnYWN5IEFQSQorICogQHsKKyAqIEB9CisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbGVnYWN5X2NvbnRyb2wgQ29sbGVjdGlvbiBDb250cm9sCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIEdlbmVyYWwgYmVoYXZpb3I6IGFwcGxpY2F0aW9uIGNvbnRpbnVlcyB0byBydW4sIGJ1dCBubyBwcm9maWxpbmcgaW5mb3JtYXRpb24gaXMgYmVpbmcgY29sbGVjdGVkCisgKgorICogUGF1c2luZyBvY2N1cnMgbm90IG9ubHkgZm9yIHRoZSBjdXJyZW50IHRocmVhZCBidXQgZm9yIGFsbCBwcm9jZXNzIGFzIHdlbGwgYXMgc3Bhd25lZCBwcm9jZXNzZXMKKyAqIC0gSW50ZWwoUikgUGFyYWxsZWwgSW5zcGVjdG9yIGFuZCBJbnRlbChSKSBJbnNwZWN0b3IgWEU6CisgKiAgIC0gRG9lcyBub3QgYW5hbHl6ZSBvciByZXBvcnQgZXJyb3JzIHRoYXQgaW52b2x2ZSBtZW1vcnkgYWNjZXNzLgorICogICAtIE90aGVyIGVycm9ycyBhcmUgcmVwb3J0ZWQgYXMgdXN1YWwuIFBhdXNpbmcgZGF0YSBjb2xsZWN0aW9uIGluCisgKiAgICAgSW50ZWwoUikgUGFyYWxsZWwgSW5zcGVjdG9yIGFuZCBJbnRlbChSKSBJbnNwZWN0b3IgWEUKKyAqICAgICBvbmx5IHBhdXNlcyB0cmFjaW5nIGFuZCBhbmFseXppbmcgbWVtb3J5IGFjY2Vzcy4KKyAqICAgICBJdCBkb2VzIG5vdCBwYXVzZSB0cmFjaW5nIG9yIGFuYWx5emluZyB0aHJlYWRpbmcgQVBJcy4KKyAqICAgLgorICogLSBJbnRlbChSKSBQYXJhbGxlbCBBbXBsaWZpZXIgYW5kIEludGVsKFIpIFZUdW5lKFRNKSBBbXBsaWZpZXIgWEU6CisgKiAgIC0gRG9lcyBjb250aW51ZSB0byByZWNvcmQgd2hlbiBuZXcgdGhyZWFkcyBhcmUgc3RhcnRlZC4KKyAqICAgLgorICogLSBPdGhlciBlZmZlY3RzOgorICogICAtIFBvc3NpYmxlIHJlZHVjdGlvbiBvZiBydW50aW1lIG92ZXJoZWFkLgorICogICAuCisgKiBAeworICovCisjaWZuZGVmIF9JVFROT1RJRllfSF8KKy8qKiBAYnJpZWYgUGF1c2UgY29sbGVjdGlvbiAqLwordm9pZCBJVFRBUEkgX19pdHRfcGF1c2Uodm9pZCk7CisvKiogQGJyaWVmIFJlc3VtZSBjb2xsZWN0aW9uICovCit2b2lkIElUVEFQSSBfX2l0dF9yZXN1bWUodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHBhdXNlLCAgICh2b2lkKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlc3VtZSwgICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfcGF1c2UgICAgICBJVFROT1RJRllfVk9JRChwYXVzZSkKKyNkZWZpbmUgX19pdHRfcGF1c2VfcHRyICBJVFROT1RJRllfTkFNRShwYXVzZSkKKyNkZWZpbmUgX19pdHRfcmVzdW1lICAgICBJVFROT1RJRllfVk9JRChyZXN1bWUpCisjZGVmaW5lIF9faXR0X3Jlc3VtZV9wdHIgSVRUTk9USUZZX05BTUUocmVzdW1lKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfcGF1c2UoKQorI2RlZmluZSBfX2l0dF9wYXVzZV9wdHIgIDAKKyNkZWZpbmUgX19pdHRfcmVzdW1lKCkKKyNkZWZpbmUgX19pdHRfcmVzdW1lX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfcGF1c2VfcHRyICAwCisjZGVmaW5lIF9faXR0X3Jlc3VtZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworI2VuZGlmIC8qIF9JVFROT1RJRllfSF8gKi8KKy8qKiBAfSBsZWdhY3lfY29udHJvbCBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBsZWdhY3lfdGhyZWFkcyBUaHJlYWRzCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIFRocmVhZHMgZ3JvdXAKKyAqIEB3YXJuaW5nIExlZ2FjeSBBUEkKKyAqIEB7CisgKi8KKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIFNldCBuYW1lIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aHJlYWQgaW4gYW5hbHlzaXMgR1VJLgorICogQHJldHVybiBfX2l0dF9lcnIgdXBvbiBmYWlsdXJlIChuYW1lIG9yIG5hbWVsZW4gYmVpbmcgbnVsbCxuYW1lIGFuZCBuYW1lbGVuIG1pc21hdGNoZWQpCisgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK2ludCBMSUJJVFRBUEkgX19pdHRfdGhyX25hbWVfc2V0QShjb25zdCBjaGFyICAgICpuYW1lLCBpbnQgbmFtZWxlbik7CitpbnQgTElCSVRUQVBJIF9faXR0X3Rocl9uYW1lX3NldFcoY29uc3Qgd2NoYXJfdCAqbmFtZSwgaW50IG5hbWVsZW4pOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF90aHJfbmFtZV9zZXQgICAgIF9faXR0X3Rocl9uYW1lX3NldFcKKyMgIGRlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRfcHRyIF9faXR0X3Rocl9uYW1lX3NldFdfcHRyCisjZWxzZQorIyAgZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldCAgICAgX19pdHRfdGhyX25hbWVfc2V0QQorIyAgZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldF9wdHIgX19pdHRfdGhyX25hbWVfc2V0QV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK2ludCBMSUJJVFRBUEkgX19pdHRfdGhyX25hbWVfc2V0KGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIHRocl9uYW1lX3NldEEsIChjb25zdCBjaGFyICAgICpuYW1lLCBpbnQgbmFtZWxlbikpCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgdGhyX25hbWVfc2V0VywgKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGludCBuYW1lbGVuKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCB0aHJfbmFtZV9zZXQsICAoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRBICAgICBJVFROT1RJRllfREFUQSh0aHJfbmFtZV9zZXRBKQorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRBX3B0ciBJVFROT1RJRllfTkFNRSh0aHJfbmFtZV9zZXRBKQorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRXICAgICBJVFROT1RJRllfREFUQSh0aHJfbmFtZV9zZXRXKQorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRXX3B0ciBJVFROT1RJRllfTkFNRSh0aHJfbmFtZV9zZXRXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldCAgICAgSVRUTk9USUZZX0RBVEEodGhyX25hbWVfc2V0KQorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRfcHRyIElUVE5PVElGWV9OQU1FKHRocl9uYW1lX3NldCkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldEEobmFtZSwgbmFtZWxlbikKKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0QV9wdHIgMAorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRXKG5hbWUsIG5hbWVsZW4pCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldFdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXQobmFtZSwgbmFtZWxlbikKKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0X3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0QV9wdHIgMAorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0X3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIE1hcmsgY3VycmVudCB0aHJlYWQgYXMgaWdub3JlZCBmcm9tIHRoaXMgcG9pbnQgb24sIGZvciB0aGUgZHVyYXRpb24gb2YgaXRzIGV4aXN0ZW5jZS4KKyAqLwordm9pZCBMSUJJVFRBUEkgX19pdHRfdGhyX2lnbm9yZSh2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgdGhyX2lnbm9yZSwgKHZvaWQpKQorI2RlZmluZSBfX2l0dF90aHJfaWdub3JlICAgICBJVFROT1RJRllfVk9JRCh0aHJfaWdub3JlKQorI2RlZmluZSBfX2l0dF90aHJfaWdub3JlX3B0ciBJVFROT1RJRllfTkFNRSh0aHJfaWdub3JlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfdGhyX2lnbm9yZSgpCisjZGVmaW5lIF9faXR0X3Rocl9pZ25vcmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF90aHJfaWdub3JlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gbGVnYWN5X3RocmVhZHMgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbGVnYWN5X3N5bmMgU3luY2hyb25pemF0aW9uCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIFN5bmNocm9uaXphdGlvbiBncm91cAorICogQHdhcm5pbmcgTGVnYWN5IEFQSQorICogQHsKKyAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBAYnJpZWYgcG9zc2libGUgdmFsdWUgb2YgYXR0cmlidXRlIGFyZ3VtZW50IGZvciBzeW5jIG9iamVjdCB0eXBlCisgKi8KKyNkZWZpbmUgX19pdHRfYXR0cl9iYXJyaWVyIDEKKworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBAYnJpZWYgcG9zc2libGUgdmFsdWUgb2YgYXR0cmlidXRlIGFyZ3VtZW50IGZvciBzeW5jIG9iamVjdCB0eXBlCisgKi8KKyNkZWZpbmUgX19pdHRfYXR0cl9tdXRleCAgIDIKKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgQXNzaWduIGEgbmFtZSB0byBhIHN5bmMgb2JqZWN0IHVzaW5nIGNoYXIgb3IgVW5pY29kZSBzdHJpbmcKKyAqIEBwYXJhbVtpbl0gYWRkciAgICAtIHBvaW50ZXIgdG8gdGhlIHN5bmMgb2JqZWN0LiBZb3Ugc2hvdWxkIHVzZSBhIHJlYWwgcG9pbnRlciB0byB5b3VyIG9iamVjdAorICogICAgICAgICAgICAgICAgICAgICAgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHZhbHVlcyBkb24ndCBjbGFzaCB3aXRoIG90aGVyIG9iamVjdCBhZGRyZXNzZXMKKyAqIEBwYXJhbVtpbl0gb2JqdHlwZSAtIG51bGwtdGVybWluYXRlZCBvYmplY3QgdHlwZSBzdHJpbmcuIElmIE5VTEwgaXMgcGFzc2VkLCB0aGUgb2JqZWN0IHdpbGwKKyAqICAgICAgICAgICAgICAgICAgICAgIGJlIGFzc3VtZWQgdG8gYmUgb2YgZ2VuZXJpYyAiVXNlciBTeW5jaHJvbml6YXRpb24iIHR5cGUKKyAqIEBwYXJhbVtpbl0gb2JqbmFtZSAtIG51bGwtdGVybWluYXRlZCBvYmplY3QgbmFtZSBzdHJpbmcuIElmIE5VTEwsIG5vIG5hbWUgd2lsbCBiZSBhc3NpZ25lZAorICogICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIG9iamVjdCAtLSB5b3UgY2FuIHVzZSB0aGUgX19pdHRfc3luY19yZW5hbWUgY2FsbCBsYXRlciB0byBhc3NpZ24KKyAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBuYW1lCisgKiBAcGFyYW1baW5dIGF0dHJpYnV0ZSAtIG9uZSBvZiBbI19faXR0X2F0dHJfYmFycmllciwgI19faXR0X2F0dHJfbXV0ZXhdIHZhbHVlcyB3aGljaCBkZWZpbmVzIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgZXhhY3Qgc2VtYW50aWNzIG9mIGhvdyBwcmVwYXJlL2FjcXVpcmVkL3JlbGVhc2luZyBjYWxscyB3b3JrLgorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCit2b2lkIElUVEFQSSBfX2l0dF9zeW5jX3NldF9uYW1lQSh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpvYmp0eXBlLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKTsKK3ZvaWQgSVRUQVBJIF9faXR0X3N5bmNfc2V0X25hbWVXKHZvaWQgKmFkZHIsIGNvbnN0IHdjaGFyX3QgKm9ianR5cGUsIGNvbnN0IHdjaGFyX3QgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lICAgICBfX2l0dF9zeW5jX3NldF9uYW1lVworIyAgZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVfcHRyIF9faXR0X3N5bmNfc2V0X25hbWVXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWUgICAgIF9faXR0X3N5bmNfc2V0X25hbWVBCisjICBkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZV9wdHIgX19pdHRfc3luY19zZXRfbmFtZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCit2b2lkIElUVEFQSSBfX2l0dF9zeW5jX3NldF9uYW1lKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIqIG9ianR5cGUsIGNvbnN0IGNoYXIqIG9iam5hbWUsIGludCBhdHRyaWJ1dGUpOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3NldF9uYW1lQSwgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19zZXRfbmFtZVcsICh2b2lkICphZGRyLCBjb25zdCB3Y2hhcl90ICpvYmp0eXBlLCBjb25zdCB3Y2hhcl90ICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfc2V0X25hbWUsICAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSkpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVBICAgICBJVFROT1RJRllfVk9JRChzeW5jX3NldF9uYW1lQSkKKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZUFfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfc2V0X25hbWVBKQorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lVyAgICAgSVRUTk9USUZZX1ZPSUQoc3luY19zZXRfbmFtZVcpCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVXX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX3NldF9uYW1lVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lICAgICBJVFROT1RJRllfVk9JRChzeW5jX3NldF9uYW1lKQorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX3NldF9uYW1lKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZUEoYWRkciwgb2JqdHlwZSwgb2JqbmFtZSwgYXR0cmlidXRlKQorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lQV9wdHIgMAorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lVyhhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZShhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lQV9wdHIgMAorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgQXNzaWduIGEgbmFtZSBhbmQgdHlwZSB0byBhIHN5bmMgb2JqZWN0IHVzaW5nIGNoYXIgb3IgVW5pY29kZSBzdHJpbmcKKyAqIEBwYXJhbVtpbl0gYWRkciAtICAgICAgcG9pbnRlciB0byB0aGUgc3luYyBvYmplY3QuIFlvdSBzaG91bGQgdXNlIGEgcmVhbCBwb2ludGVyIHRvIHlvdXIgb2JqZWN0CisgKiAgICAgICAgICAgICAgICAgICAgICAgIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB2YWx1ZXMgZG9uJ3QgY2xhc2ggd2l0aCBvdGhlciBvYmplY3QgYWRkcmVzc2VzCisgKiBAcGFyYW1baW5dIG9ianR5cGUgLSAgIG51bGwtdGVybWluYXRlZCBvYmplY3QgdHlwZSBzdHJpbmcuIElmIE5VTEwgaXMgcGFzc2VkLCB0aGUgb2JqZWN0IHdpbGwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYmUgYXNzdW1lZCB0byBiZSBvZiBnZW5lcmljICJVc2VyIFN5bmNocm9uaXphdGlvbiIgdHlwZQorICogQHBhcmFtW2luXSBvYmpuYW1lIC0gICBudWxsLXRlcm1pbmF0ZWQgb2JqZWN0IG5hbWUgc3RyaW5nLiBJZiBOVUxMLCBubyBuYW1lIHdpbGwgYmUgYXNzaWduZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIG9iamVjdCAtLSB5b3UgY2FuIHVzZSB0aGUgX19pdHRfc3luY19yZW5hbWUgY2FsbCBsYXRlciB0byBhc3NpZ24KKyAqICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG5hbWUKKyAqIEBwYXJhbVtpbl0gdHlwZWxlbiwgbmFtZWxlbiAtICAgYSBsZW5ndGggb2Ygc3RyaW5nIGZvciBhcHByb3ByaWF0ZSBvYmp0eXBlIGFuZCBvYmpuYW1lIHBhcmFtZXRlcgorICogQHBhcmFtW2luXSBhdHRyaWJ1dGUgLSBvbmUgb2YgWyNfX2l0dF9hdHRyX2JhcnJpZXIsICNfX2l0dF9hdHRyX211dGV4XSB2YWx1ZXMgd2hpY2ggZGVmaW5lcyB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Qgc2VtYW50aWNzIG9mIGhvdyBwcmVwYXJlL2FjcXVpcmVkL3JlbGVhc2luZyBjYWxscyB3b3JrLgorICogQHJldHVybiBfX2l0dF9lcnIgdXBvbiBmYWlsdXJlIChuYW1lIG9yIG5hbWVsZW4gYmVpbmcgbnVsbCxuYW1lIGFuZCBuYW1lbGVuIG1pc21hdGNoZWQpCisgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK2ludCBMSUJJVFRBUEkgX19pdHRfbm90aWZ5X3N5bmNfbmFtZUEodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgaW50IHR5cGVsZW4sIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBuYW1lbGVuLCBpbnQgYXR0cmlidXRlKTsKK2ludCBMSUJJVFRBUEkgX19pdHRfbm90aWZ5X3N5bmNfbmFtZVcodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqb2JqdHlwZSwgaW50IHR5cGVsZW4sIGNvbnN0IHdjaGFyX3QgKm9iam5hbWUsIGludCBuYW1lbGVuLCBpbnQgYXR0cmlidXRlKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lVworI2Vsc2UKKyMgIGRlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lIF9faXR0X25vdGlmeV9zeW5jX25hbWVBCisjZW5kaWYKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworaW50IExJQklUVEFQSSBfX2l0dF9ub3RpZnlfc3luY19uYW1lKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgKm9ianR5cGUsIGludCB0eXBlbGVuLCBjb25zdCBjaGFyICpvYmpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGF0dHJpYnV0ZSk7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCBub3RpZnlfc3luY19uYW1lQSwgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGludCB0eXBlbGVuLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGF0dHJpYnV0ZSkpCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgbm90aWZ5X3N5bmNfbmFtZVcsICh2b2lkICphZGRyLCBjb25zdCB3Y2hhcl90ICpvYmp0eXBlLCBpbnQgdHlwZWxlbiwgY29uc3Qgd2NoYXJfdCAqb2JqbmFtZSwgaW50IG5hbWVsZW4sIGludCBhdHRyaWJ1dGUpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIG5vdGlmeV9zeW5jX25hbWUsICAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgaW50IHR5cGVsZW4sIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBuYW1lbGVuLCBpbnQgYXR0cmlidXRlKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZUEgICAgIElUVE5PVElGWV9EQVRBKG5vdGlmeV9zeW5jX25hbWVBKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lQV9wdHIgSVRUTk9USUZZX05BTUUobm90aWZ5X3N5bmNfbmFtZUEpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVXICAgICBJVFROT1RJRllfREFUQShub3RpZnlfc3luY19uYW1lVykKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZVdfcHRyIElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX25hbWVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWUgICAgIElUVE5PVElGWV9EQVRBKG5vdGlmeV9zeW5jX25hbWUpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVfcHRyIElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX25hbWUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lQShhZGRyLCBvYmp0eXBlLCB0eXBlbGVuLCBvYmpuYW1lLCBuYW1lbGVuLCBhdHRyaWJ1dGUpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVBX3B0ciAwCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVXKGFkZHIsIG9ianR5cGUsIHR5cGVsZW4sIG9iam5hbWUsIG5hbWVsZW4sIGF0dHJpYnV0ZSkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lKGFkZHIsIG9ianR5cGUsIHR5cGVsZW4sIG9iam5hbWUsIG5hbWVsZW4sIGF0dHJpYnV0ZSkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVBX3B0ciAwCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBFbnRlciBzcGluIGxvb3Agb24gdXNlci1kZWZpbmVkIHN5bmMgb2JqZWN0CisgKi8KK3ZvaWQgTElCSVRUQVBJIF9faXR0X25vdGlmeV9zeW5jX3ByZXBhcmUodm9pZCogYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG5vdGlmeV9zeW5jX3ByZXBhcmUsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfcHJlcGFyZSAgICAgSVRUTk9USUZZX1ZPSUQobm90aWZ5X3N5bmNfcHJlcGFyZSkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfcHJlcGFyZV9wdHIgSVRUTk9USUZZX05BTUUobm90aWZ5X3N5bmNfcHJlcGFyZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX3ByZXBhcmUoYWRkcikKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfcHJlcGFyZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX3ByZXBhcmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgUXVpdCBzcGluIGxvb3Agd2l0aG91dCBhY3F1aXJpbmcgc3BpbiBvYmplY3QKKyAqLwordm9pZCBMSUJJVFRBUEkgX19pdHRfbm90aWZ5X3N5bmNfY2FuY2VsKHZvaWQgKmFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBub3RpZnlfc3luY19jYW5jZWwsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfY2FuY2VsICAgICBJVFROT1RJRllfVk9JRChub3RpZnlfc3luY19jYW5jZWwpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2NhbmNlbF9wdHIgSVRUTk9USUZZX05BTUUobm90aWZ5X3N5bmNfY2FuY2VsKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfY2FuY2VsKGFkZHIpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2NhbmNlbF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2NhbmNlbF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBTdWNjZXNzZnVsIHNwaW4gbG9vcCBjb21wbGV0aW9uIChzeW5jIG9iamVjdCBhY3F1aXJlZCkKKyAqLwordm9pZCBMSUJJVFRBUEkgX19pdHRfbm90aWZ5X3N5bmNfYWNxdWlyZWQodm9pZCAqYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG5vdGlmeV9zeW5jX2FjcXVpcmVkLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2FjcXVpcmVkICAgICBJVFROT1RJRllfVk9JRChub3RpZnlfc3luY19hY3F1aXJlZCkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfYWNxdWlyZWRfcHRyIElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX2FjcXVpcmVkKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfYWNxdWlyZWQoYWRkcikKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfYWNxdWlyZWRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19hY3F1aXJlZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBTdGFydCBzeW5jIG9iamVjdCByZWxlYXNpbmcgY29kZS4gSXMgY2FsbGVkIGJlZm9yZSB0aGUgbG9jayByZWxlYXNlIGNhbGwuCisgKi8KK3ZvaWQgTElCSVRUQVBJIF9faXR0X25vdGlmeV9zeW5jX3JlbGVhc2luZyh2b2lkKiBhZGRyKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbm90aWZ5X3N5bmNfcmVsZWFzaW5nLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX3JlbGVhc2luZyAgICAgSVRUTk9USUZZX1ZPSUQobm90aWZ5X3N5bmNfcmVsZWFzaW5nKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19yZWxlYXNpbmdfcHRyIElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX3JlbGVhc2luZykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX3JlbGVhc2luZyhhZGRyKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19yZWxlYXNpbmdfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19yZWxlYXNpbmdfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBsZWdhY3lfc3luYyBncm91cCAqLworCisjaWZuZGVmIF9JVFROT1RJRllfSF8KKy8qKgorICogQGRlZmdyb3VwIGxlZ2FjeV9ldmVudHMgRXZlbnRzCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIEV2ZW50cyBncm91cAorICogQHsKKyAqLworCisvKiogQGJyaWVmIHVzZXIgZXZlbnQgdHlwZSAqLwordHlwZWRlZiBpbnQgX19pdHRfZXZlbnQ7CisKKy8qKgorICogQGJyaWVmIENyZWF0ZSBhbiBldmVudCBub3RpZmljYXRpb24KKyAqIEBub3RlIG5hbWUgb3IgbmFtZWxlbiBiZWluZyBudWxsL25hbWUgYW5kIG5hbWVsZW4gbm90IG1hdGNoaW5nLCB1c2VyIGV2ZW50IGZlYXR1cmUgbm90IGVuYWJsZWQKKyAqIEByZXR1cm4gbm9uLXplcm8gZXZlbnQgaWRlbnRpZmllciB1cG9uIHN1Y2Nlc3MgYW5kIF9faXR0X2VyciBvdGhlcndpc2UKKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorX19pdHRfZXZlbnQgTElCSVRUQVBJIF9faXR0X2V2ZW50X2NyZWF0ZUEoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pOworX19pdHRfZXZlbnQgTElCSVRUQVBJIF9faXR0X2V2ZW50X2NyZWF0ZVcoY29uc3Qgd2NoYXJfdCAqbmFtZSwgaW50IG5hbWVsZW4pOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9ldmVudF9jcmVhdGUgICAgIF9faXR0X2V2ZW50X2NyZWF0ZVcKKyMgIGRlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVfcHRyIF9faXR0X2V2ZW50X2NyZWF0ZVdfcHRyCisjZWxzZQorIyAgZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZSAgICAgX19pdHRfZXZlbnRfY3JlYXRlQQorIyAgZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZV9wdHIgX19pdHRfZXZlbnRfY3JlYXRlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitfX2l0dF9ldmVudCBMSUJJVFRBUEkgX19pdHRfZXZlbnRfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9ldmVudCwgZXZlbnRfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKSkKK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfZXZlbnQsIGV2ZW50X2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpuYW1lLCBpbnQgbmFtZWxlbikpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihMSUJJVFRBUEksIF9faXR0X2V2ZW50LCBldmVudF9jcmVhdGUsICAoY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVBICAgICBJVFROT1RJRllfREFUQShldmVudF9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVBX3B0ciBJVFROT1RJRllfTkFNRShldmVudF9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVXICAgICBJVFROT1RJRllfREFUQShldmVudF9jcmVhdGVXKQorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVXX3B0ciBJVFROT1RJRllfTkFNRShldmVudF9jcmVhdGVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZSAgICAgIElUVE5PVElGWV9EQVRBKGV2ZW50X2NyZWF0ZSkKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlX3B0ciAgSVRUTk9USUZZX05BTUUoZXZlbnRfY3JlYXRlKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlQShuYW1lLCBuYW1lbGVuKSAoX19pdHRfZXZlbnQpMAorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZVcobmFtZSwgbmFtZWxlbikgKF9faXR0X2V2ZW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZShuYW1lLCBuYW1lbGVuKSAgKF9faXR0X2V2ZW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgUmVjb3JkIGFuIGV2ZW50IG9jY3VycmVuY2UuCisgKiBAcmV0dXJuIF9faXR0X2VyciB1cG9uIGZhaWx1cmUgKGludmFsaWQgZXZlbnQgaWQvdXNlciBldmVudCBmZWF0dXJlIG5vdCBlbmFibGVkKQorICovCitpbnQgTElCSVRUQVBJIF9faXR0X2V2ZW50X3N0YXJ0KF9faXR0X2V2ZW50IGV2ZW50KTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIGV2ZW50X3N0YXJ0LCAoX19pdHRfZXZlbnQgZXZlbnQpKQorI2RlZmluZSBfX2l0dF9ldmVudF9zdGFydCAgICAgSVRUTk9USUZZX0RBVEEoZXZlbnRfc3RhcnQpCisjZGVmaW5lIF9faXR0X2V2ZW50X3N0YXJ0X3B0ciBJVFROT1RJRllfTkFNRShldmVudF9zdGFydCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2V2ZW50X3N0YXJ0KGV2ZW50KSAoaW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfc3RhcnRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9ldmVudF9zdGFydF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBSZWNvcmQgYW4gZXZlbnQgZW5kIG9jY3VycmVuY2UuCisgKiBAbm90ZSBJdCBpcyBvcHRpb25hbCBpZiBldmVudHMgZG8gbm90IGhhdmUgZHVyYXRpb25zLgorICogQHJldHVybiBfX2l0dF9lcnIgdXBvbiBmYWlsdXJlIChpbnZhbGlkIGV2ZW50IGlkL3VzZXIgZXZlbnQgZmVhdHVyZSBub3QgZW5hYmxlZCkKKyAqLworaW50IExJQklUVEFQSSBfX2l0dF9ldmVudF9lbmQoX19pdHRfZXZlbnQgZXZlbnQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgZXZlbnRfZW5kLCAoX19pdHRfZXZlbnQgZXZlbnQpKQorI2RlZmluZSBfX2l0dF9ldmVudF9lbmQgICAgIElUVE5PVElGWV9EQVRBKGV2ZW50X2VuZCkKKyNkZWZpbmUgX19pdHRfZXZlbnRfZW5kX3B0ciBJVFROT1RJRllfTkFNRShldmVudF9lbmQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9ldmVudF9lbmQoZXZlbnQpIChpbnQpMAorI2RlZmluZSBfX2l0dF9ldmVudF9lbmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9ldmVudF9lbmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBsZWdhY3lfZXZlbnRzIGdyb3VwICovCisjZW5kaWYgLyogX0lUVE5PVElGWV9IXyAqLworCisvKioKKyAqIEBkZWZncm91cCBsZWdhY3lfbWVtb3J5IE1lbW9yeSBBY2Nlc3NlcworICogQGluZ3JvdXAgbGVnYWN5CisgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgSW5mb3JtIHRoZSB0b29sIG9mIG1lbW9yeSBhY2Nlc3NlcyBvbiByZWFkaW5nCisgKi8KK3ZvaWQgTElCSVRUQVBJIF9faXR0X21lbW9yeV9yZWFkKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbWVtb3J5X3JlYWQsICh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSkpCisjZGVmaW5lIF9faXR0X21lbW9yeV9yZWFkICAgICBJVFROT1RJRllfVk9JRChtZW1vcnlfcmVhZCkKKyNkZWZpbmUgX19pdHRfbWVtb3J5X3JlYWRfcHRyIElUVE5PVElGWV9OQU1FKG1lbW9yeV9yZWFkKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbWVtb3J5X3JlYWQoYWRkciwgc2l6ZSkKKyNkZWZpbmUgX19pdHRfbWVtb3J5X3JlYWRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tZW1vcnlfcmVhZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBJbmZvcm0gdGhlIHRvb2wgb2YgbWVtb3J5IGFjY2Vzc2VzIG9uIHdyaXRpbmcKKyAqLwordm9pZCBMSUJJVFRBUEkgX19pdHRfbWVtb3J5X3dyaXRlKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbWVtb3J5X3dyaXRlLCAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpKQorI2RlZmluZSBfX2l0dF9tZW1vcnlfd3JpdGUgICAgIElUVE5PVElGWV9WT0lEKG1lbW9yeV93cml0ZSkKKyNkZWZpbmUgX19pdHRfbWVtb3J5X3dyaXRlX3B0ciBJVFROT1RJRllfTkFNRShtZW1vcnlfd3JpdGUpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tZW1vcnlfd3JpdGUoYWRkciwgc2l6ZSkKKyNkZWZpbmUgX19pdHRfbWVtb3J5X3dyaXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbWVtb3J5X3dyaXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIEluZm9ybSB0aGUgdG9vbCBvZiBtZW1vcnkgYWNjZXNzZXMgb24gdXBkYXRpbmcKKyAqLwordm9pZCBMSUJJVFRBUEkgX19pdHRfbWVtb3J5X3VwZGF0ZSh2b2lkICphZGRyZXNzLCBzaXplX3Qgc2l6ZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG1lbW9yeV91cGRhdGUsICh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSkpCisjZGVmaW5lIF9faXR0X21lbW9yeV91cGRhdGUgICAgIElUVE5PVElGWV9WT0lEKG1lbW9yeV91cGRhdGUpCisjZGVmaW5lIF9faXR0X21lbW9yeV91cGRhdGVfcHRyIElUVE5PVElGWV9OQU1FKG1lbW9yeV91cGRhdGUpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tZW1vcnlfdXBkYXRlKGFkZHIsIHNpemUpCisjZGVmaW5lIF9faXR0X21lbW9yeV91cGRhdGVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tZW1vcnlfdXBkYXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gbGVnYWN5X21lbW9yeSBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBsZWdhY3lfc3RhdGUgVGhyZWFkIGFuZCBPYmplY3QgU3RhdGVzCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqLworCisvKiogQGJyaWVmIHN0YXRlIHR5cGUgKi8KK3R5cGVkZWYgaW50IF9faXR0X3N0YXRlX3Q7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLwordHlwZWRlZiBlbnVtIF9faXR0X29ial9zdGF0ZSB7CisgICAgX19pdHRfb2JqX3N0YXRlX2VyciA9IDAsCisgICAgX19pdHRfb2JqX3N0YXRlX2NsciA9IDEsCisgICAgX19pdHRfb2JqX3N0YXRlX3NldCA9IDIsCisgICAgX19pdHRfb2JqX3N0YXRlX3VzZSA9IDMKK30gX19pdHRfb2JqX3N0YXRlX3Q7CisKK3R5cGVkZWYgZW51bSBfX2l0dF90aHJfc3RhdGUgeworICAgIF9faXR0X3Rocl9zdGF0ZV9lcnIgPSAwLAorICAgIF9faXR0X3Rocl9zdGF0ZV9jbHIgPSAxLAorICAgIF9faXR0X3Rocl9zdGF0ZV9zZXQgPSAyCit9IF9faXR0X3Rocl9zdGF0ZV90OworCit0eXBlZGVmIGVudW0gX19pdHRfb2JqX3Byb3AgeworICAgIF9faXR0X29ial9wcm9wX3dhdGNoICAgID0gMSwKKyAgICBfX2l0dF9vYmpfcHJvcF9pZ25vcmUgICA9IDIsCisgICAgX19pdHRfb2JqX3Byb3Bfc2hhcmFibGUgPSAzCit9IF9faXR0X29ial9wcm9wX3Q7CisKK3R5cGVkZWYgZW51bSBfX2l0dF90aHJfcHJvcCB7CisgICAgX19pdHRfdGhyX3Byb3BfcXVpZXQgPSAxCit9IF9faXR0X3Rocl9wcm9wX3Q7CisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgbWFuYWdpbmcgdGhyZWFkIGFuZCBvYmplY3Qgc3RhdGVzCisgKi8KK19faXR0X3N0YXRlX3QgTElCSVRUQVBJIF9faXR0X3N0YXRlX2dldCh2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9zdGF0ZV90LCBzdGF0ZV9nZXQsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfc3RhdGVfZ2V0ICAgICBJVFROT1RJRllfREFUQShzdGF0ZV9nZXQpCisjZGVmaW5lIF9faXR0X3N0YXRlX2dldF9wdHIgSVRUTk9USUZZX05BTUUoc3RhdGVfZ2V0KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3RhdGVfZ2V0KHZvaWQpIChfX2l0dF9zdGF0ZV90KTAKKyNkZWZpbmUgX19pdHRfc3RhdGVfZ2V0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3RhdGVfZ2V0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIG1hbmFnaW5nIHRocmVhZCBhbmQgb2JqZWN0IHN0YXRlcworICovCitfX2l0dF9zdGF0ZV90IExJQklUVEFQSSBfX2l0dF9zdGF0ZV9zZXQoX19pdHRfc3RhdGVfdCBzKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9zdGF0ZV90LCBzdGF0ZV9zZXQsIChfX2l0dF9zdGF0ZV90IHMpKQorI2RlZmluZSBfX2l0dF9zdGF0ZV9zZXQgICAgIElUVE5PVElGWV9EQVRBKHN0YXRlX3NldCkKKyNkZWZpbmUgX19pdHRfc3RhdGVfc2V0X3B0ciBJVFROT1RJRllfTkFNRShzdGF0ZV9zZXQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9zdGF0ZV9zZXQocykgKF9faXR0X3N0YXRlX3QpMAorI2RlZmluZSBfX2l0dF9zdGF0ZV9zZXRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zdGF0ZV9zZXRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgbWFuYWdpbmcgdGhyZWFkIGFuZCBvYmplY3QgbW9kZXMKKyAqLworX19pdHRfdGhyX3N0YXRlX3QgTElCSVRUQVBJIF9faXR0X3Rocl9tb2RlX3NldChfX2l0dF90aHJfcHJvcF90IHAsIF9faXR0X3Rocl9zdGF0ZV90IHMpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3Rocl9zdGF0ZV90LCB0aHJfbW9kZV9zZXQsIChfX2l0dF90aHJfcHJvcF90IHAsIF9faXR0X3Rocl9zdGF0ZV90IHMpKQorI2RlZmluZSBfX2l0dF90aHJfbW9kZV9zZXQgICAgIElUVE5PVElGWV9EQVRBKHRocl9tb2RlX3NldCkKKyNkZWZpbmUgX19pdHRfdGhyX21vZGVfc2V0X3B0ciBJVFROT1RJRllfTkFNRSh0aHJfbW9kZV9zZXQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF90aHJfbW9kZV9zZXQocCwgcykgKF9faXR0X3Rocl9zdGF0ZV90KTAKKyNkZWZpbmUgX19pdHRfdGhyX21vZGVfc2V0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfdGhyX21vZGVfc2V0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIG1hbmFnaW5nIHRocmVhZCBhbmQgb2JqZWN0IG1vZGVzCisgKi8KK19faXR0X29ial9zdGF0ZV90IExJQklUVEFQSSBfX2l0dF9vYmpfbW9kZV9zZXQoX19pdHRfb2JqX3Byb3BfdCBwLCBfX2l0dF9vYmpfc3RhdGVfdCBzKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9vYmpfc3RhdGVfdCwgb2JqX21vZGVfc2V0LCAoX19pdHRfb2JqX3Byb3BfdCBwLCBfX2l0dF9vYmpfc3RhdGVfdCBzKSkKKyNkZWZpbmUgX19pdHRfb2JqX21vZGVfc2V0ICAgICBJVFROT1RJRllfREFUQShvYmpfbW9kZV9zZXQpCisjZGVmaW5lIF9faXR0X29ial9tb2RlX3NldF9wdHIgSVRUTk9USUZZX05BTUUob2JqX21vZGVfc2V0KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfb2JqX21vZGVfc2V0KHAsIHMpIChfX2l0dF9vYmpfc3RhdGVfdCkwCisjZGVmaW5lIF9faXR0X29ial9tb2RlX3NldF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X29ial9tb2RlX3NldF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGxlZ2FjeV9zdGF0ZSBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBmcmFtZXMgRnJhbWVzCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIEZyYW1lcyBncm91cAorICogQHsKKyAqLworLyoqCisgKiBAYnJpZWYgb3BhcXVlIHN0cnVjdHVyZSBmb3IgZnJhbWUgaWRlbnRpZmljYXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX19pdHRfZnJhbWVfdCAqX19pdHRfZnJhbWU7CisKKy8qKgorICogQGJyaWVmIENyZWF0ZSBhIGdsb2JhbCBmcmFtZSB3aXRoIGdpdmVuIGRvbWFpbgorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitfX2l0dF9mcmFtZSBJVFRBUEkgX19pdHRfZnJhbWVfY3JlYXRlQShjb25zdCBjaGFyICAgICpkb21haW4pOworX19pdHRfZnJhbWUgSVRUQVBJIF9faXR0X2ZyYW1lX2NyZWF0ZVcoY29uc3Qgd2NoYXJfdCAqZG9tYWluKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlICAgICBfX2l0dF9mcmFtZV9jcmVhdGVXCisjICBkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlX3B0ciBfX2l0dF9mcmFtZV9jcmVhdGVXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZSAgICAgX19pdHRfZnJhbWVfY3JlYXRlQQorIyAgZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZV9wdHIgX19pdHRfZnJhbWVfY3JlYXRlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK19faXR0X2ZyYW1lIElUVEFQSSBfX2l0dF9mcmFtZV9jcmVhdGUoY29uc3QgY2hhciAqZG9tYWluKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9mcmFtZSwgZnJhbWVfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKmRvbWFpbikpCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2ZyYW1lLCBmcmFtZV9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqZG9tYWluKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZnJhbWUsIGZyYW1lX2NyZWF0ZSwgIChjb25zdCBjaGFyICpkb21haW4pKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVBICAgICBJVFROT1RJRllfREFUQShmcmFtZV9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVBX3B0ciBJVFROT1RJRllfTkFNRShmcmFtZV9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVXICAgICBJVFROT1RJRllfREFUQShmcmFtZV9jcmVhdGVXKQorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVXX3B0ciBJVFROT1RJRllfTkFNRShmcmFtZV9jcmVhdGVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZSAgICAgSVRUTk9USUZZX0RBVEEoZnJhbWVfY3JlYXRlKQorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVfcHRyIElUVE5PVElGWV9OQU1FKGZyYW1lX2NyZWF0ZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZUEoZG9tYWluKQorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZVcoZG9tYWluKQorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlKGRvbWFpbikKKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBicmllZiBSZWNvcmQgYW4gZnJhbWUgYmVnaW4gb2NjdXJyZW5jZS4gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2ZyYW1lX2JlZ2luKF9faXR0X2ZyYW1lIGZyYW1lKTsKKy8qKiBAYnJpZWYgUmVjb3JkIGFuIGZyYW1lIGVuZCBvY2N1cnJlbmNlLiAqLwordm9pZCBJVFRBUEkgX19pdHRfZnJhbWVfZW5kICAoX19pdHRfZnJhbWUgZnJhbWUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmcmFtZV9iZWdpbiwgKF9faXR0X2ZyYW1lIGZyYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZyYW1lX2VuZCwgICAoX19pdHRfZnJhbWUgZnJhbWUpKQorI2RlZmluZSBfX2l0dF9mcmFtZV9iZWdpbiAgICAgSVRUTk9USUZZX1ZPSUQoZnJhbWVfYmVnaW4pCisjZGVmaW5lIF9faXR0X2ZyYW1lX2JlZ2luX3B0ciBJVFROT1RJRllfTkFNRShmcmFtZV9iZWdpbikKKyNkZWZpbmUgX19pdHRfZnJhbWVfZW5kICAgICAgIElUVE5PVElGWV9WT0lEKGZyYW1lX2VuZCkKKyNkZWZpbmUgX19pdHRfZnJhbWVfZW5kX3B0ciAgIElUVE5PVElGWV9OQU1FKGZyYW1lX2VuZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2ZyYW1lX2JlZ2luKGZyYW1lKQorI2RlZmluZSBfX2l0dF9mcmFtZV9iZWdpbl9wdHIgMAorI2RlZmluZSBfX2l0dF9mcmFtZV9lbmQoZnJhbWUpCisjZGVmaW5lIF9faXR0X2ZyYW1lX2VuZF9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfZnJhbWVfYmVnaW5fcHRyIDAKKyNkZWZpbmUgX19pdHRfZnJhbWVfZW5kX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBmcmFtZXMgZ3JvdXAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9MRUdBQ1lfSVRUTk9USUZZX0hfICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy90c2FuX2Fubm90YXRpb25zLmNwcCBiL2ZpbmFsL3J1bnRpbWUvc3JjL3RzYW5fYW5ub3RhdGlvbnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2Mjk3ODgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy90c2FuX2Fubm90YXRpb25zLmNwcApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIHRzYW5fYW5ub3RhdGlvbnMuY3BwIC0tIFRocmVhZFNhbml0aXplciBhbm5vdGF0aW9ucyB0byBzdXBwb3J0IGRhdGEKKyAqIHJhY2UgZGV0ZWN0aW9uIGluIE9wZW5NUCBwcm9ncmFtcy4KKyAqLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAidHNhbl9hbm5vdGF0aW9ucy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHVwdHI7Cit0eXBlZGVmIHNpZ25lZCBsb25nIHNwdHI7CisKK2V4dGVybiAiQyIgX19hdHRyaWJ1dGVfXygod2VhaykpIHZvaWQgQW5ub3RhdGVIYXBwZW5zQmVmb3JlKGNvbnN0IGNoYXIgKmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbCwgdXB0ciBhZGRyKSB7fQorZXh0ZXJuICJDIiBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgdm9pZCBBbm5vdGF0ZUhhcHBlbnNBZnRlcihjb25zdCBjaGFyICpmLCBpbnQgbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXB0ciBhZGRyKSB7fQorZXh0ZXJuICJDIiBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgdm9pZCBBbm5vdGF0ZUNvbmRWYXJTaWduYWwoY29uc3QgY2hhciAqZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsLCB1cHRyIGN2KSB7fQorZXh0ZXJuICJDIiBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgdm9pZCBBbm5vdGF0ZUNvbmRWYXJTaWduYWxBbGwoY29uc3QgY2hhciAqZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsLCB1cHRyIGN2KSB7Cit9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkIEFubm90YXRlTXV0ZXhJc05vdFBIQihjb25zdCBjaGFyICpmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGwsIHVwdHIgbXUpIHt9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkIEFubm90YXRlQ29uZFZhcldhaXQoY29uc3QgY2hhciAqZiwgaW50IGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXB0ciBjdiwgdXB0ciBsb2NrKSB7fQorZXh0ZXJuICJDIiBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgdm9pZCBBbm5vdGF0ZVJXTG9ja0NyZWF0ZShjb25zdCBjaGFyICpmLCBpbnQgbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXB0ciBtKSB7fQorZXh0ZXJuICJDIiBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgdm9pZAorQW5ub3RhdGVSV0xvY2tDcmVhdGVTdGF0aWMoY29uc3QgY2hhciAqZiwgaW50IGwsIHVwdHIgbSkge30KK2V4dGVybiAiQyIgX19hdHRyaWJ1dGVfXygod2VhaykpIHZvaWQgQW5ub3RhdGVSV0xvY2tEZXN0cm95KGNvbnN0IGNoYXIgKmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbCwgdXB0ciBtKSB7fQorZXh0ZXJuICJDIiBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgdm9pZAorQW5ub3RhdGVSV0xvY2tBY3F1aXJlZChjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBtLCB1cHRyIGlzX3cpIHt9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkCitBbm5vdGF0ZVJXTG9ja1JlbGVhc2VkKGNvbnN0IGNoYXIgKmYsIGludCBsLCB1cHRyIG0sIHVwdHIgaXNfdykge30KK2V4dGVybiAiQyIgX19hdHRyaWJ1dGVfXygod2VhaykpIHZvaWQgQW5ub3RhdGVUcmFjZU1lbW9yeShjb25zdCBjaGFyICpmLCBpbnQgbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHRyIG1lbSkge30KK2V4dGVybiAiQyIgX19hdHRyaWJ1dGVfXygod2VhaykpIHZvaWQgQW5ub3RhdGVGbHVzaFN0YXRlKGNvbnN0IGNoYXIgKmYsIGludCBsKSB7Cit9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkIEFubm90YXRlTmV3TWVtb3J5KGNvbnN0IGNoYXIgKmYsIGludCBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHRyIG1lbSwgdXB0ciBzaXplKSB7fQorZXh0ZXJuICJDIiBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgdm9pZCBBbm5vdGF0ZU5vT3AoY29uc3QgY2hhciAqZiwgaW50IGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHRyIG1lbSkge30KK2V4dGVybiAiQyIgX19hdHRyaWJ1dGVfXygod2VhaykpIHZvaWQgQW5ub3RhdGVGbHVzaEV4cGVjdGVkUmFjZXMoY29uc3QgY2hhciAqZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGwpIHt9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkCitBbm5vdGF0ZUVuYWJsZVJhY2VEZXRlY3Rpb24oY29uc3QgY2hhciAqZiwgaW50IGwsIGludCBlbmFibGUpIHt9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkCitBbm5vdGF0ZU11dGV4SXNVc2VkQXNDb25kVmFyKGNvbnN0IGNoYXIgKmYsIGludCBsLCB1cHRyIG11KSB7fQorZXh0ZXJuICJDIiBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgdm9pZCBBbm5vdGF0ZVBDUUdldChjb25zdCBjaGFyICpmLCBpbnQgbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXB0ciBwY3EpIHt9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkIEFubm90YXRlUENRUHV0KGNvbnN0IGNoYXIgKmYsIGludCBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHRyIHBjcSkge30KK2V4dGVybiAiQyIgX19hdHRyaWJ1dGVfXygod2VhaykpIHZvaWQgQW5ub3RhdGVQQ1FEZXN0cm95KGNvbnN0IGNoYXIgKmYsIGludCBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXB0ciBwY3EpIHt9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkIEFubm90YXRlUENRQ3JlYXRlKGNvbnN0IGNoYXIgKmYsIGludCBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHRyIHBjcSkge30KK2V4dGVybiAiQyIgX19hdHRyaWJ1dGVfXygod2VhaykpIHZvaWQgQW5ub3RhdGVFeHBlY3RSYWNlKGNvbnN0IGNoYXIgKmYsIGludCBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXB0ciBtZW0sIGNoYXIgKmRlc2MpIHsKK30KK2V4dGVybiAiQyIgX19hdHRyaWJ1dGVfXygod2VhaykpIHZvaWQKK0Fubm90YXRlQmVuaWduUmFjZVNpemVkKGNvbnN0IGNoYXIgKmYsIGludCBsLCB1cHRyIG1lbSwgdXB0ciBzaXplLCBjaGFyICpkZXNjKSB7Cit9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkIEFubm90YXRlQmVuaWduUmFjZShjb25zdCBjaGFyICpmLCBpbnQgbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwdHIgbWVtLCBjaGFyICpkZXNjKSB7Cit9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkIEFubm90YXRlSWdub3JlUmVhZHNCZWdpbihjb25zdCBjaGFyICpmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGwpIHt9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkIEFubm90YXRlSWdub3JlUmVhZHNFbmQoY29uc3QgY2hhciAqZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbCkge30KK2V4dGVybiAiQyIgX19hdHRyaWJ1dGVfXygod2VhaykpIHZvaWQgQW5ub3RhdGVJZ25vcmVXcml0ZXNCZWdpbihjb25zdCBjaGFyICpmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsKSB7fQorZXh0ZXJuICJDIiBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgdm9pZCBBbm5vdGF0ZUlnbm9yZVdyaXRlc0VuZChjb25zdCBjaGFyICpmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbCkge30KK2V4dGVybiAiQyIgX19hdHRyaWJ1dGVfXygod2VhaykpIHZvaWQgQW5ub3RhdGVJZ25vcmVTeW5jQmVnaW4oY29uc3QgY2hhciAqZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGwpIHt9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkIEFubm90YXRlSWdub3JlU3luY0VuZChjb25zdCBjaGFyICpmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGwpIHt9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkCitBbm5vdGF0ZVB1Ymxpc2hNZW1vcnlSYW5nZShjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBhZGRyLCB1cHRyIHNpemUpIHt9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkCitBbm5vdGF0ZVVucHVibGlzaE1lbW9yeVJhbmdlKGNvbnN0IGNoYXIgKmYsIGludCBsLCB1cHRyIGFkZHIsIHVwdHIgc2l6ZSkge30KK2V4dGVybiAiQyIgX19hdHRyaWJ1dGVfXygod2VhaykpIHZvaWQgQW5ub3RhdGVUaHJlYWROYW1lKGNvbnN0IGNoYXIgKmYsIGludCBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqbmFtZSkge30KK2V4dGVybiAiQyIgX19hdHRyaWJ1dGVfXygod2VhaykpIHZvaWQKK1dURkFubm90YXRlSGFwcGVuc0JlZm9yZShjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBhZGRyKSB7fQorZXh0ZXJuICJDIiBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgdm9pZAorV1RGQW5ub3RhdGVIYXBwZW5zQWZ0ZXIoY29uc3QgY2hhciAqZiwgaW50IGwsIHVwdHIgYWRkcikge30KK2V4dGVybiAiQyIgX19hdHRyaWJ1dGVfXygod2VhaykpIHZvaWQKK1dURkFubm90YXRlQmVuaWduUmFjZVNpemVkKGNvbnN0IGNoYXIgKmYsIGludCBsLCB1cHRyIG1lbSwgdXB0ciBzeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmRlc2MpIHt9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSBpbnQgUnVubmluZ09uVmFsZ3JpbmQoKSB7IHJldHVybiAwOyB9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSBkb3VibGUgVmFsZ3JpbmRTbG93ZG93bih2b2lkKSB7IHJldHVybiAwOyB9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSBjb25zdCBjaGFyIF9fYXR0cmlidXRlX18oKHdlYWspKSAqCisgICAgVGhyZWFkU2FuaXRpemVyUXVlcnkoY29uc3QgY2hhciAqcXVlcnkpIHsKKyAgcmV0dXJuIDA7Cit9CitleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHdlYWspKSB2b2lkCitBbm5vdGF0ZU1lbW9yeUlzSW5pdGlhbGl6ZWQoY29uc3QgY2hhciAqZiwgaW50IGwsIHVwdHIgbWVtLCB1cHRyIHN6KSB7fQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvdHNhbl9hbm5vdGF0aW9ucy5oIGIvZmluYWwvcnVudGltZS9zcmMvdHNhbl9hbm5vdGF0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYmJmYWYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy90c2FuX2Fubm90YXRpb25zLmgKQEAgLTAsMCArMSwxNzAgQEAKKy8qISBcZmlsZSAqLworLyoKKyAqIHRzYW5fYW5ub3RhdGlvbnMuaCAtLSBUaHJlYWRTYW5pdGl6ZXIgYW5ub3RhdGlvbnMgdG8gc3VwcG9ydCBkYXRhCisgKiByYWNlIGRldGVjdGlvbiBpbiBPcGVuTVAgcHJvZ3JhbXMuCisgKi8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBUU0FOX0FOTk9UQVRJT05TX0gKKyNkZWZpbmUgVFNBTl9BTk5PVEFUSU9OU19ICisKKyNpbmNsdWRlICJrbXBfY29uZmlnLmgiCisKKy8qIHR5cGVzIGFzIHVzZWQgaW4gdHNhbi9ydGwvdHNhbl9pbnRlcmZhY2VfYW5uLmNjICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdXB0cjsKK3R5cGVkZWYgc2lnbmVkIGxvbmcgc3B0cjsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBEZWNsYXJhdGlvbiBvZiBhbGwgYW5ub3RhdGlvbiBmdW5jdGlvbnMgaW4gdHNhbi9ydGwvdHNhbl9pbnRlcmZhY2VfYW5uLmNjICovCit2b2lkIEFubm90YXRlSGFwcGVuc0JlZm9yZShjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBhZGRyKTsKK3ZvaWQgQW5ub3RhdGVIYXBwZW5zQWZ0ZXIoY29uc3QgY2hhciAqZiwgaW50IGwsIHVwdHIgYWRkcik7Cit2b2lkIEFubm90YXRlQ29uZFZhclNpZ25hbChjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBjdik7Cit2b2lkIEFubm90YXRlQ29uZFZhclNpZ25hbEFsbChjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBjdik7Cit2b2lkIEFubm90YXRlTXV0ZXhJc05vdFBIQihjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBtdSk7Cit2b2lkIEFubm90YXRlQ29uZFZhcldhaXQoY29uc3QgY2hhciAqZiwgaW50IGwsIHVwdHIgY3YsIHVwdHIgbG9jayk7Cit2b2lkIEFubm90YXRlUldMb2NrQ3JlYXRlKGNvbnN0IGNoYXIgKmYsIGludCBsLCB1cHRyIG0pOwordm9pZCBBbm5vdGF0ZVJXTG9ja0NyZWF0ZVN0YXRpYyhjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBtKTsKK3ZvaWQgQW5ub3RhdGVSV0xvY2tEZXN0cm95KGNvbnN0IGNoYXIgKmYsIGludCBsLCB1cHRyIG0pOwordm9pZCBBbm5vdGF0ZVJXTG9ja0FjcXVpcmVkKGNvbnN0IGNoYXIgKmYsIGludCBsLCB1cHRyIG0sIHVwdHIgaXNfdyk7Cit2b2lkIEFubm90YXRlUldMb2NrUmVsZWFzZWQoY29uc3QgY2hhciAqZiwgaW50IGwsIHVwdHIgbSwgdXB0ciBpc193KTsKK3ZvaWQgQW5ub3RhdGVUcmFjZU1lbW9yeShjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBtZW0pOwordm9pZCBBbm5vdGF0ZUZsdXNoU3RhdGUoY29uc3QgY2hhciAqZiwgaW50IGwpOwordm9pZCBBbm5vdGF0ZU5ld01lbW9yeShjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBtZW0sIHVwdHIgc2l6ZSk7Cit2b2lkIEFubm90YXRlTm9PcChjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBtZW0pOwordm9pZCBBbm5vdGF0ZUZsdXNoRXhwZWN0ZWRSYWNlcyhjb25zdCBjaGFyICpmLCBpbnQgbCk7Cit2b2lkIEFubm90YXRlRW5hYmxlUmFjZURldGVjdGlvbihjb25zdCBjaGFyICpmLCBpbnQgbCwgaW50IGVuYWJsZSk7Cit2b2lkIEFubm90YXRlTXV0ZXhJc1VzZWRBc0NvbmRWYXIoY29uc3QgY2hhciAqZiwgaW50IGwsIHVwdHIgbXUpOwordm9pZCBBbm5vdGF0ZVBDUUdldChjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBwY3EpOwordm9pZCBBbm5vdGF0ZVBDUVB1dChjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBwY3EpOwordm9pZCBBbm5vdGF0ZVBDUURlc3Ryb3koY29uc3QgY2hhciAqZiwgaW50IGwsIHVwdHIgcGNxKTsKK3ZvaWQgQW5ub3RhdGVQQ1FDcmVhdGUoY29uc3QgY2hhciAqZiwgaW50IGwsIHVwdHIgcGNxKTsKK3ZvaWQgQW5ub3RhdGVFeHBlY3RSYWNlKGNvbnN0IGNoYXIgKmYsIGludCBsLCB1cHRyIG1lbSwgY2hhciAqZGVzYyk7Cit2b2lkIEFubm90YXRlQmVuaWduUmFjZVNpemVkKGNvbnN0IGNoYXIgKmYsIGludCBsLCB1cHRyIG1lbSwgdXB0ciBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpkZXNjKTsKK3ZvaWQgQW5ub3RhdGVCZW5pZ25SYWNlKGNvbnN0IGNoYXIgKmYsIGludCBsLCB1cHRyIG1lbSwgY2hhciAqZGVzYyk7Cit2b2lkIEFubm90YXRlSWdub3JlUmVhZHNCZWdpbihjb25zdCBjaGFyICpmLCBpbnQgbCk7Cit2b2lkIEFubm90YXRlSWdub3JlUmVhZHNFbmQoY29uc3QgY2hhciAqZiwgaW50IGwpOwordm9pZCBBbm5vdGF0ZUlnbm9yZVdyaXRlc0JlZ2luKGNvbnN0IGNoYXIgKmYsIGludCBsKTsKK3ZvaWQgQW5ub3RhdGVJZ25vcmVXcml0ZXNFbmQoY29uc3QgY2hhciAqZiwgaW50IGwpOwordm9pZCBBbm5vdGF0ZUlnbm9yZVN5bmNCZWdpbihjb25zdCBjaGFyICpmLCBpbnQgbCk7Cit2b2lkIEFubm90YXRlSWdub3JlU3luY0VuZChjb25zdCBjaGFyICpmLCBpbnQgbCk7Cit2b2lkIEFubm90YXRlUHVibGlzaE1lbW9yeVJhbmdlKGNvbnN0IGNoYXIgKmYsIGludCBsLCB1cHRyIGFkZHIsIHVwdHIgc2l6ZSk7Cit2b2lkIEFubm90YXRlVW5wdWJsaXNoTWVtb3J5UmFuZ2UoY29uc3QgY2hhciAqZiwgaW50IGwsIHVwdHIgYWRkciwgdXB0ciBzaXplKTsKK3ZvaWQgQW5ub3RhdGVUaHJlYWROYW1lKGNvbnN0IGNoYXIgKmYsIGludCBsLCBjaGFyICpuYW1lKTsKK3ZvaWQgV1RGQW5ub3RhdGVIYXBwZW5zQmVmb3JlKGNvbnN0IGNoYXIgKmYsIGludCBsLCB1cHRyIGFkZHIpOwordm9pZCBXVEZBbm5vdGF0ZUhhcHBlbnNBZnRlcihjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBhZGRyKTsKK3ZvaWQgV1RGQW5ub3RhdGVCZW5pZ25SYWNlU2l6ZWQoY29uc3QgY2hhciAqZiwgaW50IGwsIHVwdHIgbWVtLCB1cHRyIHN6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpkZXNjKTsKK2ludCBSdW5uaW5nT25WYWxncmluZCgpOworZG91YmxlIFZhbGdyaW5kU2xvd2Rvd24odm9pZCk7Citjb25zdCBjaGFyICpUaHJlYWRTYW5pdGl6ZXJRdWVyeShjb25zdCBjaGFyICpxdWVyeSk7Cit2b2lkIEFubm90YXRlTWVtb3J5SXNJbml0aWFsaXplZChjb25zdCBjaGFyICpmLCBpbnQgbCwgdXB0ciBtZW0sIHVwdHIgc3opOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjaWZkZWYgVFNBTl9TVVBQT1JUCisjZGVmaW5lIEFOTk9UQVRFX0hBUFBFTlNfQUZURVIoYWRkcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBbm5vdGF0ZUhhcHBlbnNBZnRlcihfX0ZJTEVfXywgX19MSU5FX18sICh1cHRyKWFkZHIpCisjZGVmaW5lIEFOTk9UQVRFX0hBUFBFTlNfQkVGT1JFKGFkZHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBbm5vdGF0ZUhhcHBlbnNCZWZvcmUoX19GSUxFX18sIF9fTElORV9fLCAodXB0cilhZGRyKQorI2RlZmluZSBBTk5PVEFURV9JR05PUkVfV1JJVEVTX0JFR0lOKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQW5ub3RhdGVJZ25vcmVXcml0ZXNCZWdpbihfX0ZJTEVfXywgX19MSU5FX18pCisjZGVmaW5lIEFOTk9UQVRFX0lHTk9SRV9XUklURVNfRU5EKCkgQW5ub3RhdGVJZ25vcmVXcml0ZXNFbmQoX19GSUxFX18sIF9fTElORV9fKQorI2RlZmluZSBBTk5PVEFURV9SV0xPQ0tfQ1JFQVRFKGxjaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQW5ub3RhdGVSV0xvY2tDcmVhdGUoX19GSUxFX18sIF9fTElORV9fLCAodXB0cilsY2spCisjZGVmaW5lIEFOTk9UQVRFX1JXTE9DS19SRUxFQVNFRChsY2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBbm5vdGF0ZVJXTG9ja0FjcXVpcmVkKF9fRklMRV9fLCBfX0xJTkVfXywgKHVwdHIpbGNrLCAxKQorI2RlZmluZSBBTk5PVEFURV9SV0xPQ0tfQUNRVUlSRUQobGNrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQW5ub3RhdGVSV0xvY2tSZWxlYXNlZChfX0ZJTEVfXywgX19MSU5FX18sICh1cHRyKWxjaywgMSkKKyNkZWZpbmUgQU5OT1RBVEVfQkFSUklFUl9CRUdJTihhZGRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFubm90YXRlSGFwcGVuc0JlZm9yZShfX0ZJTEVfXywgX19MSU5FX18sICh1cHRyKWFkZHIpCisjZGVmaW5lIEFOTk9UQVRFX0JBUlJJRVJfRU5EKGFkZHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBbm5vdGF0ZUhhcHBlbnNBZnRlcihfX0ZJTEVfXywgX19MSU5FX18sICh1cHRyKWFkZHIpCisjZGVmaW5lIEFOTk9UQVRFX1JFRFVDRV9BRlRFUihhZGRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBbm5vdGF0ZUhhcHBlbnNBZnRlcihfX0ZJTEVfXywgX19MSU5FX18sICh1cHRyKWFkZHIpCisjZGVmaW5lIEFOTk9UQVRFX1JFRFVDRV9CRUZPUkUoYWRkcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBbm5vdGF0ZUhhcHBlbnNCZWZvcmUoX19GSUxFX18sIF9fTElORV9fLCAodXB0cilhZGRyKQorI2Vsc2UKKyNkZWZpbmUgQU5OT1RBVEVfSEFQUEVOU19BRlRFUihhZGRyKQorI2RlZmluZSBBTk5PVEFURV9IQVBQRU5TX0JFRk9SRShhZGRyKQorI2RlZmluZSBBTk5PVEFURV9JR05PUkVfV1JJVEVTX0JFR0lOKCkKKyNkZWZpbmUgQU5OT1RBVEVfSUdOT1JFX1dSSVRFU19FTkQoKQorI2RlZmluZSBBTk5PVEFURV9SV0xPQ0tfQ1JFQVRFKGxjaykKKyNkZWZpbmUgQU5OT1RBVEVfUldMT0NLX1JFTEVBU0VEKGxjaykKKyNkZWZpbmUgQU5OT1RBVEVfUldMT0NLX0FDUVVJUkVEKGxjaykKKyNkZWZpbmUgQU5OT1RBVEVfQkFSUklFUl9CRUdJTihhZGRyKQorI2RlZmluZSBBTk5PVEFURV9CQVJSSUVSX0VORChhZGRyKQorI2RlZmluZSBBTk5PVEFURV9SRURVQ0VfQUZURVIoYWRkcikKKyNkZWZpbmUgQU5OT1RBVEVfUkVEVUNFX0JFRk9SRShhZGRyKQorI2VuZGlmCisKKyNkZWZpbmUgQU5OT1RBVEVfUVVFVUlORworI2RlZmluZSBBTk5PVEFURV9USUNLRVQKKyNkZWZpbmUgQU5OT1RBVEVfRlVURVgKKyNkZWZpbmUgQU5OT1RBVEVfVEFTCisjZGVmaW5lIEFOTk9UQVRFX0RSRFBBCisKKyNpZmRlZiBBTk5PVEFURV9RVUVVSU5HCisjZGVmaW5lIEFOTk9UQVRFX1FVRVVJTkdfQ1JFQVRFKGxjaykKKyNkZWZpbmUgQU5OT1RBVEVfUVVFVUlOR19SRUxFQVNFRChsY2spIEFOTk9UQVRFX0hBUFBFTlNfQkVGT1JFKGxjaykKKyNkZWZpbmUgQU5OT1RBVEVfUVVFVUlOR19BQ1FVSVJFRChsY2spIEFOTk9UQVRFX0hBUFBFTlNfQUZURVIobGNrKQorI2Vsc2UKKyNkZWZpbmUgQU5OT1RBVEVfUVVFVUlOR19DUkVBVEUobGNrKQorI2RlZmluZSBBTk5PVEFURV9RVUVVSU5HX1JFTEVBU0VEKGxjaykKKyNkZWZpbmUgQU5OT1RBVEVfUVVFVUlOR19BQ1FVSVJFRChsY2spCisjZW5kaWYKKworI2lmZGVmIEFOTk9UQVRFX1RJQ0tFVAorI2RlZmluZSBBTk5PVEFURV9USUNLRVRfQ1JFQVRFKGxjaykKKyNkZWZpbmUgQU5OT1RBVEVfVElDS0VUX1JFTEVBU0VEKGxjaykgQU5OT1RBVEVfSEFQUEVOU19CRUZPUkUobGNrKQorI2RlZmluZSBBTk5PVEFURV9USUNLRVRfQUNRVUlSRUQobGNrKSBBTk5PVEFURV9IQVBQRU5TX0FGVEVSKGxjaykKKyNlbHNlCisjZGVmaW5lIEFOTk9UQVRFX1RJQ0tFVF9DUkVBVEUobGNrKQorI2RlZmluZSBBTk5PVEFURV9USUNLRVRfUkVMRUFTRUQobGNrKQorI2RlZmluZSBBTk5PVEFURV9USUNLRVRfQUNRVUlSRUQobGNrKQorI2VuZGlmCisKKyNpZmRlZiBBTk5PVEFURV9GVVRFWAorI2RlZmluZSBBTk5PVEFURV9GVVRFWF9DUkVBVEUobGNrKQorI2RlZmluZSBBTk5PVEFURV9GVVRFWF9SRUxFQVNFRChsY2spIEFOTk9UQVRFX0hBUFBFTlNfQkVGT1JFKGxjaykKKyNkZWZpbmUgQU5OT1RBVEVfRlVURVhfQUNRVUlSRUQobGNrKSBBTk5PVEFURV9IQVBQRU5TX0FGVEVSKGxjaykKKyNlbHNlCisjZGVmaW5lIEFOTk9UQVRFX0ZVVEVYX0NSRUFURShsY2spCisjZGVmaW5lIEFOTk9UQVRFX0ZVVEVYX1JFTEVBU0VEKGxjaykKKyNkZWZpbmUgQU5OT1RBVEVfRlVURVhfQUNRVUlSRUQobGNrKQorI2VuZGlmCisKKyNpZmRlZiBBTk5PVEFURV9UQVMKKyNkZWZpbmUgQU5OT1RBVEVfVEFTX0NSRUFURShsY2spCisjZGVmaW5lIEFOTk9UQVRFX1RBU19SRUxFQVNFRChsY2spIEFOTk9UQVRFX0hBUFBFTlNfQkVGT1JFKGxjaykKKyNkZWZpbmUgQU5OT1RBVEVfVEFTX0FDUVVJUkVEKGxjaykgQU5OT1RBVEVfSEFQUEVOU19BRlRFUihsY2spCisjZWxzZQorI2RlZmluZSBBTk5PVEFURV9UQVNfQ1JFQVRFKGxjaykKKyNkZWZpbmUgQU5OT1RBVEVfVEFTX1JFTEVBU0VEKGxjaykKKyNkZWZpbmUgQU5OT1RBVEVfVEFTX0FDUVVJUkVEKGxjaykKKyNlbmRpZgorCisjaWZkZWYgQU5OT1RBVEVfRFJEUEEKKyNkZWZpbmUgQU5OT1RBVEVfRFJEUEFfQ1JFQVRFKGxjaykKKyNkZWZpbmUgQU5OT1RBVEVfRFJEUEFfUkVMRUFTRUQobGNrKSBBTk5PVEFURV9IQVBQRU5TX0JFRk9SRShsY2spCisjZGVmaW5lIEFOTk9UQVRFX0RSRFBBX0FDUVVJUkVEKGxjaykgQU5OT1RBVEVfSEFQUEVOU19BRlRFUihsY2spCisjZWxzZQorI2RlZmluZSBBTk5PVEFURV9EUkRQQV9DUkVBVEUobGNrKQorI2RlZmluZSBBTk5PVEFURV9EUkRQQV9SRUxFQVNFRChsY2spCisjZGVmaW5lIEFOTk9UQVRFX0RSRFBBX0FDUVVJUkVEKGxjaykKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL3pfTGludXhfYXNtLlMgYi9maW5hbC9ydW50aW1lL3NyYy96X0xpbnV4X2FzbS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZmJjMjMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy96X0xpbnV4X2FzbS5TCkBAIC0wLDAgKzEsMTczMCBAQAorLy8gIHpfTGludXhfYXNtLlM6ICAtIG1pY3JvdGFza2luZyByb3V0aW5lcyBzcGVjaWZpY2FsbHkKKy8vICAgICAgICAgICAgICAgICAgICB3cml0dGVuIGZvciBJbnRlbCBwbGF0Zm9ybXMgcnVubmluZyBMaW51eCogT1MKKworLy8KKy8vLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLy8KKy8vLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8vLworLy8vLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8vLworLy8vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1hY3JvcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2luY2x1ZGUgImttcF9jb25maWcuaCIKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworIyBpZiBLTVBfTUlDCisvLyB0aGUgJ2RlbGF5IHIxNi9yMzIvcjY0JyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSAncGF1c2UnLgorLy8gVGhlIGRlbGF5IG9wZXJhdGlvbiBoYXMgdGhlIGVmZmVjdCBvZiByZW1vdmluZyB0aGUgY3VycmVudCB0aHJlYWQgZnJvbQorLy8gdGhlIHJvdW5kLXJvYmluIEhUIG1lY2hhbmlzbSwgYW5kIHRoZXJlZm9yZSBzcGVlZHMgdXAgdGhlIGlzc3VlIHJhdGUgb2YKKy8vIHRoZSBvdGhlciB0aHJlYWRzIG9uIHRoZSBzYW1lIGNvcmUuCisvLworLy8gQSB2YWx1ZSBvZiAwIHdvcmtzIGZpbmUgZm9yIDw9IDIgdGhyZWFkcyBwZXIgY29yZSwgYnV0IGNhdXNlcyB0aGUgRVBDQworLy8gYmFycmllciB0aW1lIHRvIGluY3JlYXNlIGdyZWF0bHkgZm9yIDMgb3IgbW9yZSB0aHJlYWRzIHBlciBjb3JlLgorLy8KKy8vIEEgdmFsdWUgb2YgMTAwIHdvcmtzIHByZXR0eSB3ZWxsIGZvciB1cCB0byA0IHRocmVhZHMgcGVyIGNvcmUsIGJ1dCBpc24ndAorLy8gcXVpdGUgYXMgZmFzdCBhcyAwIGZvciAyIHRocmVhZHMgcGVyIGNvcmUuCisvLworLy8gV2UgbmVlZCB0byBjaGVjayB3aGF0IGhhcHBlbnMgZm9yIG92ZXJzdWJzY3JpcHRpb24gLyA+IDQgdGhyZWFkcyBwZXIgY29yZS4KKy8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgd2UgbmVlZCB0byBwYXNzIHRoZSBkZWxheSB2YWx1ZSBpbiBhcyBhIHBhcmFtZXRlcgorLy8gdGhhdCB0aGUgY2FsbGVyIGRldGVybWluZXMgYmFzZWQgb24gdGhlIHRvdGFsICMgdGhyZWFkcyAvICMgY29yZXMuCisvLworLy8ubWFjcm8gcGF1c2Vfb3AKKy8vCW1vdiAgICAkMTAwLCAlcmF4CisvLwlkZWxheSAgJXJheAorLy8uZW5kbQorIyBlbHNlCisjICBkZWZpbmUgcGF1c2Vfb3AgICAuYnl0ZSAweGYzLDB4OTAKKyMgZW5kaWYgLy8gS01QX01JQworCisjIGlmIEtNUF9PU19EQVJXSU4KKyMgIGRlZmluZSBLTVBfUFJFRklYX1VOREVSU0NPUkUoeCkgXyMjeCAgLy8gZXh0cmEgdW5kZXJzY29yZSBmb3IgT1MgWCogc3ltYm9scworIyAgZGVmaW5lIEtNUF9MQUJFTCh4KSBMXyMjeCAgICAgICAgICAgICAvLyBmb3JtIHRoZSBuYW1lIG9mIGxhYmVsCisubWFjcm8gS01QX0NGSV9ERUZfT0ZGU0VUCisuZW5kbWFjcm8KKy5tYWNybyBLTVBfQ0ZJX09GRlNFVAorLmVuZG1hY3JvCisubWFjcm8gS01QX0NGSV9SRUdJU1RFUgorLmVuZG1hY3JvCisubWFjcm8gS01QX0NGSV9ERUYKKy5lbmRtYWNybworLm1hY3JvIEFMSUdOCisJLmFsaWduICQwCisuZW5kbWFjcm8KKy5tYWNybyBERUJVR19JTkZPCisvKiBOb3Qgc3VyZSB3aGF0IC5zaXplIGRvZXMgaW4gaWNjLCBub3Qgc3VyZSBpZiB3ZSBuZWVkIHRvIGRvIHNvbWV0aGluZworICAgc2ltaWxhciBmb3IgT1MgWCouCisqLworLmVuZG1hY3JvCisubWFjcm8gUFJPQworCUFMSUdOICA0CisJLmdsb2JsIEtNUF9QUkVGSVhfVU5ERVJTQ09SRSgkMCkKK0tNUF9QUkVGSVhfVU5ERVJTQ09SRSgkMCk6CisuZW5kbWFjcm8KKyMgZWxzZSAvLyBLTVBfT1NfREFSV0lOCisjICBkZWZpbmUgS01QX1BSRUZJWF9VTkRFUlNDT1JFKHgpIHggLy9ubyBleHRyYSB1bmRlcnNjb3JlIGZvciBMaW51eCogT1Mgc3ltYm9scworLy8gRm9ybWF0IGxhYmVscyBzbyB0aGF0IHRoZXkgZG9uJ3Qgb3ZlcnJpZGUgZnVuY3Rpb24gbmFtZXMgaW4gZ2RiJ3MgYmFja3RyYWNlcworLy8gTUlDIGFzc2VtYmxlciBkb2Vzbid0IGFjY2VwdCAuTCBzeW50YXgsIHRoZSBMIHdvcmtzIGZpbmUgdGhlcmUgKGFzIHdlbGwgYXMKKy8vIG9uIE9TIFgqKQorIyBpZiBLTVBfTUlDCisjICBkZWZpbmUgS01QX0xBQkVMKHgpIExfIyN4ICAgICAgICAgIC8vIGxvY2FsIGxhYmVsCisjIGVsc2UKKyMgIGRlZmluZSBLTVBfTEFCRUwoeCkgLkxfIyN4ICAgICAgICAgLy8gbG9jYWwgbGFiZWwgaGlkZGVuIGZyb20gYmFja3RyYWNlcworIyBlbmRpZiAvLyBLTVBfTUlDCisubWFjcm8gQUxJR04gc2l6ZQorCS5hbGlnbiAxPDwoXHNpemUpCisuZW5kbQorLm1hY3JvIERFQlVHX0lORk8gcHJvYworCS5jZmlfZW5kcHJvYworLy8gTm90IHN1cmUgd2h5IHdlIG5lZWQgLnR5cGUgYW5kIC5zaXplIGZvciB0aGUgZnVuY3Rpb25zCisJLmFsaWduIDE2CisJLnR5cGUgIFxwcm9jLEBmdW5jdGlvbgorICAgICAgICAuc2l6ZSAgXHByb2MsLi1ccHJvYworLmVuZG0KKy5tYWNybyBQUk9DIHByb2MKKwlBTElHTiAgNAorICAgICAgICAuZ2xvYmwgS01QX1BSRUZJWF9VTkRFUlNDT1JFKFxwcm9jKQorS01QX1BSRUZJWF9VTkRFUlNDT1JFKFxwcm9jKToKKwkuY2ZpX3N0YXJ0cHJvYworLmVuZG0KKy5tYWNybyBLTVBfQ0ZJX0RFRl9PRkZTRVQgc3oKKwkuY2ZpX2RlZl9jZmFfb2Zmc2V0CVxzegorLmVuZG0KKy5tYWNybyBLTVBfQ0ZJX09GRlNFVCByZWcsIHN6CisJLmNmaV9vZmZzZXQJXHJlZyxcc3oKKy5lbmRtCisubWFjcm8gS01QX0NGSV9SRUdJU1RFUiByZWcKKwkuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIJXHJlZworLmVuZG0KKy5tYWNybyBLTVBfQ0ZJX0RFRiByZWcsIHN6CisJLmNmaV9kZWZfY2ZhCVxyZWcsXHN6CisuZW5kbQorIyBlbmRpZiAvLyBLTVBfT1NfREFSV0lOCisjZW5kaWYgLy8gS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX3g4Nl82NAorCisjaWYgKEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfREFSV0lOKSAmJiBLTVBfQVJDSF9BQVJDSDY0CisKKyMgaWYgS01QX09TX0RBUldJTgorIyAgZGVmaW5lIEtNUF9QUkVGSVhfVU5ERVJTQ09SRSh4KSBfIyN4ICAvLyBleHRyYSB1bmRlcnNjb3JlIGZvciBPUyBYKiBzeW1ib2xzCisjICBkZWZpbmUgS01QX0xBQkVMKHgpIExfIyN4ICAgICAgICAgICAgIC8vIGZvcm0gdGhlIG5hbWUgb2YgbGFiZWwKKworLm1hY3JvIEFMSUdOCisJLmFsaWduICQwCisuZW5kbWFjcm8KKworLm1hY3JvIERFQlVHX0lORk8KKy8qIE5vdCBzdXJlIHdoYXQgLnNpemUgZG9lcyBpbiBpY2MsIG5vdCBzdXJlIGlmIHdlIG5lZWQgdG8gZG8gc29tZXRoaW5nCisgICBzaW1pbGFyIGZvciBPUyBYKi4KKyovCisuZW5kbWFjcm8KKworLm1hY3JvIFBST0MKKwlBTElHTiAgNAorCS5nbG9ibCBLTVBfUFJFRklYX1VOREVSU0NPUkUoJDApCitLTVBfUFJFRklYX1VOREVSU0NPUkUoJDApOgorLmVuZG1hY3JvCisjIGVsc2UgLy8gS01QX09TX0RBUldJTgorIyAgZGVmaW5lIEtNUF9QUkVGSVhfVU5ERVJTQ09SRSh4KSB4ICAvLyBubyBleHRyYSB1bmRlcnNjb3JlIGZvciBMaW51eCogT1Mgc3ltYm9scworLy8gRm9ybWF0IGxhYmVscyBzbyB0aGF0IHRoZXkgZG9uJ3Qgb3ZlcnJpZGUgZnVuY3Rpb24gbmFtZXMgaW4gZ2RiJ3MgYmFja3RyYWNlcworIyAgZGVmaW5lIEtNUF9MQUJFTCh4KSAuTF8jI3ggICAgICAgICAvLyBsb2NhbCBsYWJlbCBoaWRkZW4gZnJvbSBiYWNrdHJhY2VzCisKKy5tYWNybyBBTElHTiBzaXplCisJLmFsaWduIDE8PChcc2l6ZSkKKy5lbmRtCisKKy5tYWNybyBERUJVR19JTkZPIHByb2MKKwkuY2ZpX2VuZHByb2MKKy8vIE5vdCBzdXJlIHdoeSB3ZSBuZWVkIC50eXBlIGFuZCAuc2l6ZSBmb3IgdGhlIGZ1bmN0aW9ucworCUFMSUdOIDIKKwkudHlwZSAgXHByb2MsQGZ1bmN0aW9uCisJLnNpemUgIFxwcm9jLC4tXHByb2MKKy5lbmRtCisKKy5tYWNybyBQUk9DIHByb2MKKwlBTElHTiAyCisJLmdsb2JsIEtNUF9QUkVGSVhfVU5ERVJTQ09SRShccHJvYykKK0tNUF9QUkVGSVhfVU5ERVJTQ09SRShccHJvYyk6CisJLmNmaV9zdGFydHByb2MKKy5lbmRtCisjIGVuZGlmIC8vIEtNUF9PU19EQVJXSU4KKworI2VuZGlmIC8vIChLTVBfT1NfTElOVVggfHwgS01QX09TX0RBUldJTikgJiYgS01QX0FSQ0hfQUFSQ0g2NAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZGF0YQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorCisvLyBTdXBwb3J0IGZvciB1bm5hbWVkIGNvbW1vbiBibG9ja3MuCisvLworLy8gQmVjYXVzZSB0aGUgc3ltYm9sICIuZ29tcF9jcml0aWNhbF91c2VyXyIgY29udGFpbnMgYSAiLiIsIHdlIGhhdmUgdG8KKy8vIHB1dCB0aGlzIHN0dWZmIGluIGFzc2VtYmx5LgorCisjIGlmIEtNUF9BUkNIX1g4NgorIyAgaWYgS01QX09TX0RBUldJTgorICAgICAgICAuZGF0YQorICAgICAgICAuY29tbSAuZ29tcF9jcml0aWNhbF91c2VyXywzMgorICAgICAgICAuZGF0YQorICAgICAgICAuZ2xvYmwgX19fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcgorX19fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcjoKKyAgICAgICAgLmxvbmcgLmdvbXBfY3JpdGljYWxfdXNlcl8KKyMgIGVsc2UgLyogTGludXgqIE9TICovCisgICAgICAgIC5kYXRhCisgICAgICAgIC5jb21tIC5nb21wX2NyaXRpY2FsX3VzZXJfLDMyLDgKKyAgICAgICAgLmRhdGEKKwlBTElHTiA0CisgICAgICAgIC5nbG9iYWwgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyCitfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHI6CisgICAgICAgIC40Ynl0ZSAuZ29tcF9jcml0aWNhbF91c2VyXworICAgICAgICAudHlwZSBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIsQG9iamVjdAorICAgICAgICAuc2l6ZSBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIsNAorIyAgZW5kaWYgLyogS01QX09TX0RBUldJTiAqLworIyBlbmRpZiAvKiBLTVBfQVJDSF9YODYgKi8KKworIyBpZiBLTVBfQVJDSF9YODZfNjQKKyMgIGlmIEtNUF9PU19EQVJXSU4KKyAgICAgICAgLmRhdGEKKyAgICAgICAgLmNvbW0gLmdvbXBfY3JpdGljYWxfdXNlcl8sMzIKKyAgICAgICAgLmRhdGEKKyAgICAgICAgLmdsb2JsIF9fX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIKK19fX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHI6CisgICAgICAgIC5xdWFkIC5nb21wX2NyaXRpY2FsX3VzZXJfCisjICBlbHNlIC8qIExpbnV4KiBPUyAqLworICAgICAgICAuZGF0YQorICAgICAgICAuY29tbSAuZ29tcF9jcml0aWNhbF91c2VyXywzMiw4CisgICAgICAgIC5kYXRhCisJQUxJR04gOAorICAgICAgICAuZ2xvYmFsIF9fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcgorX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyOgorICAgICAgICAuOGJ5dGUgLmdvbXBfY3JpdGljYWxfdXNlcl8KKyAgICAgICAgLnR5cGUgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyLEBvYmplY3QKKyAgICAgICAgLnNpemUgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyLDgKKyMgIGVuZGlmIC8qIEtNUF9PU19EQVJXSU4gKi8KKyMgZW5kaWYgLyogS01QX0FSQ0hfWDg2XzY0ICovCisKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworCisjaWYgS01QX0FSQ0hfWDg2ICYmICFLTVBfQVJDSF9QUEM2NAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbWljcm90YXNraW5nIHJvdXRpbmVzIHNwZWNpZmljYWxseSB3cml0dGVuIGZvciBJQS0zMiBhcmNoaXRlY3R1cmUKKy8vIHJ1bm5pbmcgTGludXgqIE9TCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJLmlkZW50ICJJbnRlbCBDb3Jwb3JhdGlvbiIKKwkuZGF0YQorCUFMSUdOIDQKKy8vIHZvaWQKKy8vIF9fa21wX3g4Nl9wYXVzZSggdm9pZCApOworCisgICAgICAgIC50ZXh0CisJUFJPQyAgX19rbXBfeDg2X3BhdXNlCisKKyAgICAgICAgcGF1c2Vfb3AKKyAgICAgICAgcmV0CisKKwlERUJVR19JTkZPIF9fa21wX3g4Nl9wYXVzZQorCisvLyB2b2lkCisvLyBfX2ttcF94ODZfY3B1aWQoIGludCBtb2RlLCBpbnQgbW9kZTIsIHZvaWQgKmNwdWlkX2J1ZmZlciApOworCisJUFJPQyAgX19rbXBfeDg2X2NwdWlkCisKKwlwdXNobCAlZWJwCisJbW92bCAgJWVzcCwlZWJwCisgICAgICAgIHB1c2hsICVlZGkKKyAgICAgICAgcHVzaGwgJWVieAorICAgICAgICBwdXNobCAlZWN4CisgICAgICAgIHB1c2hsICVlZHgKKworCW1vdmwgIDgoJWVicCksICVlYXgKKwltb3ZsICAxMiglZWJwKSwgJWVjeAorCWNwdWlkCQkvLyBRdWVyeSB0aGUgQ1BVSUQgZm9yIHRoZSBjdXJyZW50IHByb2Nlc3NvcgorCisJbW92bCAgMTYoJWVicCksICVlZGkKKwltb3ZsICAlZWF4LCAwKCVlZGkpCisJbW92bCAgJWVieCwgNCglZWRpKQorCW1vdmwgICVlY3gsIDgoJWVkaSkKKwltb3ZsICAlZWR4LCAxMiglZWRpKQorCisgICAgICAgIHBvcGwgICVlZHgKKyAgICAgICAgcG9wbCAgJWVjeAorICAgICAgICBwb3BsICAlZWJ4CisgICAgICAgIHBvcGwgICVlZGkKKyAgICAgICAgbW92bCAgJWVicCwgJWVzcAorICAgICAgICBwb3BsICAlZWJwCisJcmV0CisKKwlERUJVR19JTkZPIF9fa21wX3g4Nl9jcHVpZAorCisKKyMgaWYgIUtNUF9BU01fSU5UUklOUworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8ga21wX2ludDMyCisvLyBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKTsKKworICAgICAgICBQUk9DICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyCisKKyAgICAgICAgbW92bCAgICAgIDQoJWVzcCksICVlY3gKKyAgICAgICAgbW92bCAgICAgIDgoJWVzcCksICVlYXgKKyAgICAgICAgbG9jaworICAgICAgICB4YWRkbCAgICAgJWVheCwoJWVjeCkKKyAgICAgICAgcmV0CisKKwlERUJVR19JTkZPIF9fa21wX3Rlc3RfdGhlbl9hZGQzMgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRlVOQ1RJT04gX19rbXBfeGNoZ19maXhlZDgKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX3hjaGdfZml4ZWQ4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggZCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJNCglZXNwKQorLy8gCWQ6CTgoJWVzcCkKKy8vCisvLyByZXR1cm46CSVhbAorICAgICAgICBQUk9DICBfX2ttcF94Y2hnX2ZpeGVkOAorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4ICAgIC8vICJwIgorICAgICAgICBtb3ZiICAgICAgOCglZXNwKSwgJWFsCS8vICJkIgorCisgICAgICAgIGxvY2sKKyAgICAgICAgeGNoZ2IgICAgICVhbCwoJWVjeCkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94Y2hnX2ZpeGVkOAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGVU5DVElPTiBfX2ttcF94Y2hnX2ZpeGVkMTYKKy8vCisvLyBrbXBfaW50MTYKKy8vIF9fa21wX3hjaGdfZml4ZWQxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgZCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJNCglZXNwKQorLy8gCWQ6CTgoJWVzcCkKKy8vIHJldHVybjogICAgICVheAorICAgICAgICBQUk9DICBfX2ttcF94Y2hnX2ZpeGVkMTYKKworICAgICAgICBtb3ZsICAgICAgNCglZXNwKSwgJWVjeCAgICAvLyAicCIKKyAgICAgICAgbW92dyAgICAgIDgoJWVzcCksICVheAkvLyAiZCIKKworICAgICAgICBsb2NrCisgICAgICAgIHhjaGd3ICAgICAlYXgsKCVlY3gpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfeGNoZ19maXhlZDE2CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZVTkNUSU9OIF9fa21wX3hjaGdfZml4ZWQzMgorLy8KKy8vIGttcF9pbnQzMgorLy8gX19rbXBfeGNoZ19maXhlZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBkICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgk0KCVlc3ApCisvLyAJZDoJOCglZXNwKQorLy8KKy8vIHJldHVybjoJJWVheAorICAgICAgICBQUk9DICBfX2ttcF94Y2hnX2ZpeGVkMzIKKworICAgICAgICBtb3ZsICAgICAgNCglZXNwKSwgJWVjeCAgICAvLyAicCIKKyAgICAgICAgbW92bCAgICAgIDgoJWVzcCksICVlYXgJLy8gImQiCisKKyAgICAgICAgbG9jaworICAgICAgICB4Y2hnbCAgICAgJWVheCwoJWVjeCkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94Y2hnX2ZpeGVkMzIKKworCisvLyBrbXBfaW50OAorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsIGttcF9pbnQ4IHN2ICk7CisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOAorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4CisgICAgICAgIG1vdmIgICAgICA4KCVlc3ApLCAlYWwKKyAgICAgICAgbW92YiAgICAgIDEyKCVlc3ApLCAlZGwKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hnYiAgJWRsLCglZWN4KQorICAgICAgICBzZXRlICAgICAgJWFsICAgICAgICAgICAvLyBpZiAlYWwgPT0gKCVlY3gpIHNldCAlYWwgPSAxIGVsc2Ugc2V0ICVhbCA9IDAKKyAgICAgICAgYW5kICAgICAgICQxLCAlZWF4ICAgICAgLy8gc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKKworLy8ga21wX2ludDE2CisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2KHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YpOworICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2CisKKyAgICAgICAgbW92bCAgICAgIDQoJWVzcCksICVlY3gKKyAgICAgICAgbW92dyAgICAgIDgoJWVzcCksICVheAorICAgICAgICBtb3Z3ICAgICAgMTIoJWVzcCksICVkeAorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGd3ICAlZHgsKCVlY3gpCisgICAgICAgIHNldGUgICAgICAlYWwgICAgICAgICAgIC8vIGlmICVheCA9PSAoJWVjeCkgc2V0ICVhbCA9IDEgZWxzZSBzZXQgJWFsID0gMAorICAgICAgICBhbmQgICAgICAgJDEsICVlYXggICAgICAvLyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbgorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYKKworLy8ga21wX2ludDMyCisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YpOworICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyCisKKyAgICAgICAgbW92bCAgICAgIDQoJWVzcCksICVlY3gKKyAgICAgICAgbW92bCAgICAgIDgoJWVzcCksICVlYXgKKyAgICAgICAgbW92bCAgICAgIDEyKCVlc3ApLCAlZWR4CisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZ2wgICVlZHgsKCVlY3gpCisgICAgICAgIHNldGUgICAgICAlYWwgICAgICAgICAgLy8gaWYgJWVheCA9PSAoJWVjeCkgc2V0ICVhbCA9IDEgZWxzZSBzZXQgJWFsID0gMAorICAgICAgICBhbmQgICAgICAgJDEsICVlYXggICAgIC8vIHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMgorCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQodm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgY3YsIGttcF9pbnQ2NCBzICk7CisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQKKworICAgICAgICBwdXNobCAgICAgJWVicAorICAgICAgICBtb3ZsICAgICAgJWVzcCwgJWVicAorICAgICAgICBwdXNobCAgICAgJWVieAorICAgICAgICBwdXNobCAgICAgJWVkaQorICAgICAgICBtb3ZsICAgICAgOCglZWJwKSwgJWVkaQorICAgICAgICBtb3ZsICAgICAgMTIoJWVicCksICVlYXggICAgICAgIC8vICJjdiIgbG93IG9yZGVyIHdvcmQKKyAgICAgICAgbW92bCAgICAgIDE2KCVlYnApLCAlZWR4ICAgICAgICAvLyAiY3YiIGhpZ2ggb3JkZXIgd29yZAorICAgICAgICBtb3ZsICAgICAgMjAoJWVicCksICVlYnggICAgICAgIC8vICJzdiIgbG93IG9yZGVyIHdvcmQKKyAgICAgICAgbW92bCAgICAgIDI0KCVlYnApLCAlZWN4ICAgICAgICAvLyAic3YiIGhpZ2ggb3JkZXIgd29yZAorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGc4YiAoJWVkaSkKKyAgICAgICAgc2V0ZSAgICAgICVhbCAgICAgIC8vIGlmICVlZHg6ZWF4ID09ICglZWRpKSBzZXQgJWFsID0gMSBlbHNlIHNldCAlYWwgPSAwCisgICAgICAgIGFuZCAgICAgICAkMSwgJWVheCAvLyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbgorICAgICAgICBwb3BsICAgICAgJWVkaQorICAgICAgICBwb3BsICAgICAgJWVieAorICAgICAgICBtb3ZsICAgICAgJWVicCwgJWVzcAorICAgICAgICBwb3BsICAgICAgJWVicAorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQKKworLy8ga21wX2ludDgKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgodm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGN2LCBrbXBfaW50OCBzdik7CisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgKKworICAgICAgICBtb3ZsICAgICAgNCglZXNwKSwgJWVjeAorICAgICAgICBtb3ZiICAgICAgOCglZXNwKSwgJWFsCisgICAgICAgIG1vdmIgICAgICAxMiglZXNwKSwgJWRsCisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZ2IgICVkbCwoJWVjeCkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4CisKKy8vIGttcF9pbnQxNgorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYodm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MTYgc3YpOworICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNgorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4CisgICAgICAgIG1vdncgICAgICA4KCVlc3ApLCAlYXgKKyAgICAgICAgbW92dyAgICAgIDEyKCVlc3ApLCAlZHgKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hndyAgJWR4LCglZWN4KQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2CisKKy8vIGttcF9pbnQzMgorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIodm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgc3YpOworICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMgorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4CisgICAgICAgIG1vdmwgICAgICA4KCVlc3ApLCAlZWF4CisgICAgICAgIG1vdmwgICAgICAxMiglZXNwKSwgJWVkeAorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGdsICAlZWR4LCglZWN4KQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyCisKKy8vIGttcF9pbnQ2NAorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQodm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgY3YsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgc3YpOworICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NAorCisgICAgICAgIHB1c2hsICAgICAlZWJwCisgICAgICAgIG1vdmwgICAgICAlZXNwLCAlZWJwCisgICAgICAgIHB1c2hsICAgICAlZWJ4CisgICAgICAgIHB1c2hsICAgICAlZWRpCisgICAgICAgIG1vdmwgICAgICA4KCVlYnApLCAlZWRpCisgICAgICAgIG1vdmwgICAgICAxMiglZWJwKSwgJWVheCAgICAgICAgLy8gImN2IiBsb3cgb3JkZXIgd29yZAorICAgICAgICBtb3ZsICAgICAgMTYoJWVicCksICVlZHggICAgICAgIC8vICJjdiIgaGlnaCBvcmRlciB3b3JkCisgICAgICAgIG1vdmwgICAgICAyMCglZWJwKSwgJWVieCAgICAgICAgLy8gInN2IiBsb3cgb3JkZXIgd29yZAorICAgICAgICBtb3ZsICAgICAgMjQoJWVicCksICVlY3ggICAgICAgIC8vICJzdiIgaGlnaCBvcmRlciB3b3JkCisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZzhiICglZWRpKQorICAgICAgICBwb3BsICAgICAgJWVkaQorICAgICAgICBwb3BsICAgICAgJWVieAorICAgICAgICBtb3ZsICAgICAgJWVicCwgJWVzcAorICAgICAgICBwb3BsICAgICAgJWVicAorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZVTkNUSU9OIF9fa21wX3hjaGdfcmVhbDMyCisvLworLy8ga21wX3JlYWwzMgorLy8gX19rbXBfeGNoZ19yZWFsMzIoIHZvbGF0aWxlIGttcF9yZWFsMzIgKmFkZHIsIGttcF9yZWFsMzIgZGF0YSApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJYWRkcjoJNCglZXNwKQorLy8gCWRhdGE6CTgoJWVzcCkKKy8vCisvLyByZXR1cm46CSVlYXgKKyAgICAgICAgUFJPQyAgX19rbXBfeGNoZ19yZWFsMzIKKworICAgICAgICBwdXNobCAgICVlYnAKKyAgICAgICAgbW92bCAgICAlZXNwLCAlZWJwCisgICAgICAgIHN1YmwgICAgJDQsICVlc3AKKyAgICAgICAgcHVzaGwgICAlZXNpCisKKyAgICAgICAgbW92bCAgICA0KCVlYnApLCAlZXNpCisgICAgICAgIGZsZHMgICAgKCVlc2kpCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkIDxhZGRyPgorICAgICAgICBmc3RzICAgIC00KCVlYnApCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZSBvbGQgdmFsdWUKKworICAgICAgICBtb3ZsICAgIDgoJWVicCksICVlYXgKKworICAgICAgICBsb2NrCisgICAgICAgIHhjaGdsICAgJWVheCwgKCVlc2kpCisKKyAgICAgICAgZmxkcyAgICAtNCglZWJwKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIG9sZCB2YWx1ZQorCisgICAgICAgIHBvcGwgICAgJWVzaQorICAgICAgICBtb3ZsICAgICVlYnAsICVlc3AKKyAgICAgICAgcG9wbCAgICAlZWJwCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfeGNoZ19yZWFsMzIKKworIyBlbmRpZiAvKiAhS01QX0FTTV9JTlRSSU5TICovCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZVTkNUSU9OIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQKKy8vCisvLyB2b2lkCisvLyBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CTQoJWVzcCkKKyAgICAgICAgUFJPQyAgX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZAorCisgICAgICAgIG1vdmwgIDQoJWVzcCksICVlYXgKKyAgICAgICAgZmxkY3cgKCVlYXgpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGVU5DVElPTiBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZAorLy8KKy8vIHZvaWQKKy8vIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CTQoJWVzcCkKKyAgICAgICAgUFJPQyAgX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQKKworICAgICAgICBtb3ZsICA0KCVlc3ApLCAlZWF4CisgICAgICAgIGZzdGN3ICglZWF4KQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZVTkNUSU9OIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQKKy8vCisvLyB2b2lkCisvLyBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkKCk7CisgICAgICAgIFBST0MgIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQKKworICAgICAgICBmbmNsZXgKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHR5cGVkZWYgdm9pZAkoKm1pY3JvdGFza190KSggaW50ICpndGlkLCBpbnQgKnRpZCwgLi4uICk7CisvLworLy8gaW50CisvLyBfX2ttcF9pbnZva2VfbWljcm90YXNrKCBtaWNyb3Rhc2tfdCBwa2ZuLCBpbnQgZ3RpZCwgaW50IHRpZCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmdjLCB2b2lkICpwX2FyZ3ZbXSApIHsKKy8vICAgICgqcGtmbikoICYgZ3RpZCwgJiBndGlkLCBhcmd2WzBdLCAuLi4gKTsKKy8vICAgIHJldHVybiAxOworLy8gfQorCisvLyAtLSBCZWdpbiBfX2ttcF9pbnZva2VfbWljcm90YXNrCisvLyBtYXJrX2JlZ2luOworCVBST0MgIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKworCXB1c2hsICVlYnAKKwlLTVBfQ0ZJX0RFRl9PRkZTRVQgOAorCUtNUF9DRklfT0ZGU0VUIGVicCwtOAorCW1vdmwgJWVzcCwlZWJwCQkvLyBlc3RhYmxpc2ggdGhlIGJhc2UgcG9pbnRlciBmb3IgdGhpcyByb3V0aW5lLgorCUtNUF9DRklfUkVHSVNURVIgZWJwCisJc3VibCAkOCwlZXNwCQkvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgdHdvIGxvY2FsIHZhcmlhYmxlcy4KKwkJCQkvLyBUaGVzZSB2YXJpYmFsZXMgYXJlOgorCQkJCS8vCWFyZ3Y6IC00KCVlYnApCisJCQkJLy8JdGVtcDogLTgoJWVicCkKKwkJCQkvLworCXB1c2hsICVlYngJCS8vIHNhdmUgJWVieCB0byB1c2UgZHVyaW5nIHRoaXMgcm91dGluZQorCQkJCS8vCisjaWYgT01QVF9TVVBQT1JUCisJbW92bCAyOCglZWJwKSwlZWJ4CS8vIGdldCBleGl0X2ZyYW1lIGFkZHJlc3MKKwltb3ZsICVlYnAsKCVlYngpCS8vIHNhdmUgZXhpdF9mcmFtZQorI2VuZGlmCisKKwltb3ZsIDIwKCVlYnApLCVlYngJLy8gU3RhY2sgYWxpZ25tZW50IC0gIyBhcmdzCisJYWRkbCAkMiwlZWJ4CQkvLyAjYXJncyArMiAgQWx3YXlzIHBhc3MgYXQgbGVhc3QgMiBhcmdzIChndGlkIGFuZCB0aWQpCisJc2hsbCAkMiwlZWJ4CQkvLyBOdW1iZXIgb2YgYnl0ZXMgdXNlZCBvbiBzdGFjazogKCNhcmdzKzIpKjQKKwltb3ZsICVlc3AsJWVheAkJLy8KKwlzdWJsICVlYngsJWVheAkJLy8gJWVzcC0oKCNhcmdzKzIpKjQpIC0+ICVlYXggLS0gd2l0aG91dCBtb2RzLCBzdGFjayBwdHIgd291bGQgYmUgdGhpcworCW1vdmwgJWVheCwlZWJ4CQkvLyBTYXZlIHRvICVlYngKKwlhbmRsICQweEZGRkZGRjgwLCVlYXgJLy8gbWFzayBvZmYgNyBiaXRzCisJc3VibCAlZWF4LCVlYngJCS8vIEFtb3VudCB0byBzdWJ0cmFjdCBmcm9tICVlc3AKKwlzdWJsICVlYngsJWVzcAkJLy8gUHJlcGFyZSB0aGUgc3RhY2sgcHRyIC0tCisJCQkJLy8gICBub3cgaXQgd2lsbCBiZSBhbGlnbmVkIG9uIDEyOC1ieXRlIGJvdW5kYXJ5IGF0IHRoZSBjYWxsCisKKwltb3ZsIDI0KCVlYnApLCVlYXgJLy8gY29weSBmcm9tIHBfYXJndltdCisJbW92bCAlZWF4LC00KCVlYnApCS8vIGludG8gdGhlIGxvY2FsIHZhcmlhYmxlICphcmd2LgorCisJbW92bCAyMCglZWJwKSwlZWJ4CS8vIGFyZ2MgaXMgMjAoJWVicCkKKwlzaGxsICQyLCVlYngKKworS01QX0xBQkVMKGludm9rZV8yKToKKwljbXBsICQwLCVlYngKKwlqZyAgS01QX0xBQkVMKGludm9rZV80KQorCWptcCBLTVBfTEFCRUwoaW52b2tlXzMpCisJQUxJR04gMgorS01QX0xBQkVMKGludm9rZV80KToKKwltb3ZsIC00KCVlYnApLCVlYXgKKwlzdWJsICQ0LCVlYngJCQkvLyBkZWNyZW1lbnQgYXJnYy4KKwlhZGRsICVlYngsJWVheAkJCS8vIGluZGV4IGludG8gYXJndi4KKwltb3ZsICglZWF4KSwlZWR4CisJcHVzaGwgJWVkeAorCisJam1wIEtNUF9MQUJFTChpbnZva2VfMikKKwlBTElHTiAyCitLTVBfTEFCRUwoaW52b2tlXzMpOgorCWxlYWwgMTYoJWVicCksJWVheAkJLy8gcHVzaCAmIHRpZAorCXB1c2hsICVlYXgKKworCWxlYWwgMTIoJWVicCksJWVheAkJLy8gcHVzaCAmIGd0aWQKKwlwdXNobCAlZWF4CisKKwltb3ZsIDgoJWVicCksJWVieAorCWNhbGwgKiVlYngJCQkvLyBjYWxsICgqcGtmbikoKTsKKworCW1vdmwgJDEsJWVheAkJCS8vIHJldHVybiAxOworCisJbW92bCAtMTIoJWVicCksJWVieAkJLy8gcmVzdG9yZSAlZWJ4CisJbGVhdmUKKwlLTVBfQ0ZJX0RFRiBlc3AsNAorCXJldAorCisJREVCVUdfSU5GTyBfX2ttcF9pbnZva2VfbWljcm90YXNrCisvLyAtLSBFbmQgIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKworCisvLyBrbXBfdWludDY0CisvLyBfX2ttcF9oYXJkd2FyZV90aW1lc3RhbXAodm9pZCkKKwlQUk9DICBfX2ttcF9oYXJkd2FyZV90aW1lc3RhbXAKKwlyZHRzYworCXJldAorCisJREVCVUdfSU5GTyBfX2ttcF9oYXJkd2FyZV90aW1lc3RhbXAKKy8vIC0tIEVuZCAgX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wCisKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgKi8KKworCisjaWYgS01QX0FSQ0hfWDg2XzY0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBtaWNyb3Rhc2tpbmcgcm91dGluZXMgc3BlY2lmaWNhbGx5IHdyaXR0ZW4gZm9yIElBLTMyIGFyY2hpdGVjdHVyZSBhbmQKKy8vIEludGVsKFIpIDY0IHJ1bm5pbmcgTGludXgqIE9TCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLSBNYWNoaW5lIHR5cGUgUAorLy8gbWFya19kZXNjcmlwdGlvbiAiSW50ZWwgQ29ycG9yYXRpb24iOworCS5pZGVudCAiSW50ZWwgQ29ycG9yYXRpb24iCisvLyAtLQkuZmlsZSAiel9MaW51eF9hc20uUyIKKwkuZGF0YQorCUFMSUdOIDQKKworLy8gVG8gcHJldmVudCBnZXR0aW5nIG91ciBjb2RlIGludG8gLmRhdGEgc2VjdGlvbiAudGV4dCBhZGRlZCB0byBldmVyeSByb3V0aW5lCisvLyBkZWZpbml0aW9uIGZvciB4ODZfNjQuCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRlVOQ1RJT04gX19rbXBfeDg2X2NwdWlkCisvLworLy8gdm9pZAorLy8gX19rbXBfeDg2X2NwdWlkKCBpbnQgbW9kZSwgaW50IG1vZGUyLCB2b2lkICpjcHVpZF9idWZmZXIgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCW1vZGU6CQklZWRpCisvLyAJbW9kZTI6CQklZXNpCisvLyAJY3B1aWRfYnVmZmVyOgklcmR4CisgICAgICAgIC50ZXh0CisJUFJPQyAgX19rbXBfeDg2X2NwdWlkCisKKwlwdXNocSAgJXJicAorCW1vdnEgICAlcnNwLCVyYnAKKyAgICAgICAgcHVzaHEgICVyYngJCQkvLyBjYWxsZWUtc2F2ZSByZWdpc3RlcgorCisJbW92bCAgICVlc2ksICVlY3gJCS8vICJtb2RlMiIKKwltb3ZsICAgJWVkaSwgJWVheAkJLy8gIm1vZGUiCisgICAgICAgIG1vdnEgICAlcmR4LCAlcnNpICAgICAgICAgICAgICAgLy8gY3B1aWRfYnVmZmVyCisJY3B1aWQJCQkJLy8gUXVlcnkgdGhlIENQVUlEIGZvciB0aGUgY3VycmVudCBwcm9jZXNzb3IKKworCW1vdmwgICAlZWF4LCAwKCVyc2kpCQkvLyBzdG9yZSByZXN1bHRzIGludG8gYnVmZmVyCisJbW92bCAgICVlYngsIDQoJXJzaSkKKwltb3ZsICAgJWVjeCwgOCglcnNpKQorCW1vdmwgICAlZWR4LCAxMiglcnNpKQorCisgICAgICAgIHBvcHEgICAlcmJ4CQkJLy8gY2FsbGVlLXNhdmUgcmVnaXN0ZXIKKyAgICAgICAgbW92cSAgICVyYnAsICVyc3AKKyAgICAgICAgcG9wcSAgICVyYnAKKwlyZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3g4Nl9jcHVpZAorCisKKworIyBpZiAhS01QX0FTTV9JTlRSSU5TCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGVU5DVElPTiBfX2ttcF90ZXN0X3RoZW5fYWRkMzIKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWQ6CSVlc2kKKy8vCisvLyByZXR1cm46CSVlYXgKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfdGVzdF90aGVuX2FkZDMyCisKKyAgICAgICAgbW92bCAgICAgICVlc2ksICVlYXgJLy8gImQiCisgICAgICAgIGxvY2sKKyAgICAgICAgeGFkZGwgICAgICVlYXgsKCVyZGkpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfdGVzdF90aGVuX2FkZDMyCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZVTkNUSU9OIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NAorLy8KKy8vIGttcF9pbnQ2NAorLy8gX19rbXBfdGVzdF90aGVuX2FkZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJZDoJJXJzaQorLy8JcmV0dXJuOgklcmF4CisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NAorCisgICAgICAgIG1vdnEgICAgICAlcnNpLCAlcmF4CS8vICJkIgorICAgICAgICBsb2NrCisgICAgICAgIHhhZGRxICAgICAlcmF4LCglcmRpKQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGVU5DVElPTiBfX2ttcF94Y2hnX2ZpeGVkOAorLy8KKy8vIGttcF9pbnQzMgorLy8gX19rbXBfeGNoZ19maXhlZDgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBkICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJZDoJJXNpbAorLy8KKy8vIHJldHVybjoJJWFsCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX3hjaGdfZml4ZWQ4CisKKyAgICAgICAgbW92YiAgICAgICVzaWwsICVhbAkvLyAiZCIKKworICAgICAgICBsb2NrCisgICAgICAgIHhjaGdiICAgICAlYWwsKCVyZGkpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfeGNoZ19maXhlZDgKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRlVOQ1RJT04gX19rbXBfeGNoZ19maXhlZDE2CisvLworLy8ga21wX2ludDE2CisvLyBfX2ttcF94Y2hnX2ZpeGVkMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGQgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAlkOgklc2kKKy8vIHJldHVybjogICAgICVheAorICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF94Y2hnX2ZpeGVkMTYKKworICAgICAgICBtb3Z3ICAgICAgJXNpLCAlYXgJLy8gImQiCisKKyAgICAgICAgbG9jaworICAgICAgICB4Y2hndyAgICAgJWF4LCglcmRpKQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3hjaGdfZml4ZWQxNgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGVU5DVElPTiBfX2ttcF94Y2hnX2ZpeGVkMzIKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX3hjaGdfZml4ZWQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWQ6CSVlc2kKKy8vCisvLyByZXR1cm46CSVlYXgKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfeGNoZ19maXhlZDMyCisKKyAgICAgICAgbW92bCAgICAgICVlc2ksICVlYXgJLy8gImQiCisKKyAgICAgICAgbG9jaworICAgICAgICB4Y2hnbCAgICAgJWVheCwoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94Y2hnX2ZpeGVkMzIKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRlVOQ1RJT04gX19rbXBfeGNoZ19maXhlZDY0CisvLworLy8ga21wX2ludDY0CisvLyBfX2ttcF94Y2hnX2ZpeGVkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGQgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAlkOgklcnNpCisvLyByZXR1cm46CSVyYXgKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfeGNoZ19maXhlZDY0CisKKyAgICAgICAgbW92cSAgICAgICVyc2ksICVyYXgJLy8gImQiCisKKyAgICAgICAgbG9jaworICAgICAgICB4Y2hncSAgICAgJXJheCwoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94Y2hnX2ZpeGVkNjQKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4CisvLworLy8ga21wX2ludDgKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGN2LCBrbXBfaW50OCBzdiApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWN2OgklZXNpCisvLwlzdjoJJWVkeAorLy8KKy8vIHJldHVybjoJJWVheAorICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKKworICAgICAgICBtb3ZiICAgICAgJXNpbCwgJWFsCS8vICJjdiIKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hnYiAgJWRsLCglcmRpKQorICAgICAgICBzZXRlICAgICAgJWFsICAgICAgICAgICAvLyBpZiAlYWwgPT0gKCVyZGkpIHNldCAlYWwgPSAxIGVsc2Ugc2V0ICVhbCA9IDAKKyAgICAgICAgYW5kcSAgICAgICQxLCAlcmF4ICAgICAgLy8gc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gZm9yIHJldHVybiB2YWx1ZQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2CisvLworLy8ga21wX2ludDE2CisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiBjdiwga21wX2ludDE2IHN2ICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJY3Y6CSVzaQorLy8Jc3Y6CSVkeAorLy8KKy8vIHJldHVybjoJJWVheAorICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2CisKKyAgICAgICAgbW92dyAgICAgICVzaSwgJWF4CS8vICJjdiIKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hndyAgJWR4LCglcmRpKQorICAgICAgICBzZXRlICAgICAgJWFsICAgICAgICAgICAvLyBpZiAlYXggPT0gKCVyZGkpIHNldCAlYWwgPSAxIGVsc2Ugc2V0ICVhbCA9IDAKKyAgICAgICAgYW5kcSAgICAgICQxLCAlcmF4ICAgICAgLy8gc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gZm9yIHJldHVybiB2YWx1ZQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMgorLy8KKy8vIGttcF9pbnQzMgorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsIGttcF9pbnQzMiBzdiApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWN2OgklZXNpCisvLwlzdjoJJWVkeAorLy8KKy8vIHJldHVybjoJJWVheAorICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyCisKKyAgICAgICAgbW92bCAgICAgICVlc2ksICVlYXgJLy8gImN2IgorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGdsICAlZWR4LCglcmRpKQorICAgICAgICBzZXRlICAgICAgJWFsICAgICAgICAgICAvLyBpZiAlZWF4ID09ICglcmRpKSBzZXQgJWFsID0gMSBlbHNlIHNldCAlYWwgPSAwCisgICAgICAgIGFuZHEgICAgICAkMSwgJXJheCAgICAgIC8vIHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uIGZvciByZXR1cm4gdmFsdWUKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAljdjoJJXJzaQorLy8Jc3Y6CSVyZHgKKy8vCXJldHVybjoJJWVheAorICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0CisKKyAgICAgICAgbW92cSAgICAgICVyc2ksICVyYXggICAgLy8gImN2IgorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGdxICAlcmR4LCglcmRpKQorICAgICAgICBzZXRlICAgICAgJWFsICAgICAgICAgICAvLyBpZiAlcmF4ID09ICglcmRpKSBzZXQgJWFsID0gMSBlbHNlIHNldCAlYWwgPSAwCisgICAgICAgIGFuZHEgICAgICAkMSwgJXJheCAgICAgIC8vIHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uIGZvciByZXR1cm4gdmFsdWUKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4CisvLworLy8ga21wX2ludDgKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBjdiwga21wX2ludDggc3YgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAljdjoJJWVzaQorLy8Jc3Y6CSVlZHgKKy8vCisvLyByZXR1cm46CSVlYXgKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorCisgICAgICAgIG1vdmIgICAgICAlc2lsLCAlYWwJLy8gImN2IgorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGdiICAlZGwsKCVyZGkpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNgorLy8KKy8vIGttcF9pbnQxNgorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNl9yZXQoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAljdjoJJXNpCisvLwlzdjoJJWR4CisvLworLy8gcmV0dXJuOgklZWF4CisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2CisKKyAgICAgICAgbW92dyAgICAgICVzaSwgJWF4CS8vICJjdiIKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hndyAgJWR4LCglcmRpKQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyCisvLworLy8ga21wX2ludDMyCisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsIGttcF9pbnQzMiBzdiApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWN2OgklZXNpCisvLwlzdjoJJWVkeAorLy8KKy8vIHJldHVybjoJJWVheAorICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMgorCisgICAgICAgIG1vdmwgICAgICAlZXNpLCAlZWF4CS8vICJjdiIKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hnbCAgJWVkeCwoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NAorLy8KKy8vIGttcF9pbnQ2NAorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAljdjoJJXJzaQorLy8Jc3Y6CSVyZHgKKy8vCXJldHVybjoJJWVheAorICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NAorCisgICAgICAgIG1vdnEgICAgICAlcnNpLCAlcmF4ICAgIC8vICJjdiIKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hncSAgJXJkeCwoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NAorCisjIGVuZGlmIC8qICFLTVBfQVNNX0lOVFJJTlMgKi8KKworCisjIGlmICFLTVBfTUlDCisKKyMgaWYgIUtNUF9BU01fSU5UUklOUworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRlVOQ1RJT04gX19rbXBfeGNoZ19yZWFsMzIKKy8vCisvLyBrbXBfcmVhbDMyCisvLyBfX2ttcF94Y2hnX3JlYWwzMiggdm9sYXRpbGUga21wX3JlYWwzMiAqYWRkciwga21wX3JlYWwzMiBkYXRhICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlhZGRyOgklcmRpCisvLyAJZGF0YToJJXhtbTAgKGxvd2VyIDQgYnl0ZXMpCisvLworLy8gcmV0dXJuOgkleG1tMCAobG93ZXIgNCBieXRlcykKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfeGNoZ19yZWFsMzIKKworCW1vdmQJJXhtbTAsICVlYXgJLy8gbG9hZCAiZGF0YSIgdG8gZWF4CisKKyAgICAgICAgIGxvY2sKKyAgICAgICAgIHhjaGdsICVlYXgsICglcmRpKQorCisJbW92ZAklZWF4LCAleG1tMAkvLyBsb2FkIG9sZCB2YWx1ZSBpbnRvIHJldHVybiByZWdpc3RlcgorCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfeGNoZ19yZWFsMzIKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRlVOQ1RJT04gX19rbXBfeGNoZ19yZWFsNjQKKy8vCisvLyBrbXBfcmVhbDY0CisvLyBfX2ttcF94Y2hnX3JlYWw2NCggdm9sYXRpbGUga21wX3JlYWw2NCAqYWRkciwga21wX3JlYWw2NCBkYXRhICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vICAgICAgYWRkcjogICAlcmRpCisvLyAgICAgIGRhdGE6ICAgJXhtbTAgKGxvd2VyIDggYnl0ZXMpCisvLyAgICAgIHJldHVybjogJXhtbTAgKGxvd2VyIDggYnl0ZXMpCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX3hjaGdfcmVhbDY0CisKKwltb3ZkCSV4bW0wLCAlcmF4CS8vIGxvYWQgImRhdGEiIHRvIHJheAorCisgICAgICAgICBsb2NrCisJeGNoZ3EgICVyYXgsICglcmRpKQorCisJbW92ZAklcmF4LCAleG1tMAkvLyBsb2FkIG9sZCB2YWx1ZSBpbnRvIHJldHVybiByZWdpc3RlcgorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3hjaGdfcmVhbDY0CisKKworIyBlbmRpZiAvKiAhS01QX01JQyAqLworCisjIGVuZGlmIC8qICFLTVBfQVNNX0lOVFJJTlMgKi8KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRlVOQ1RJT04gX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZAorLy8KKy8vIHZvaWQKKy8vIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQoIGttcF9pbnQxNiAqcCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCisKKyAgICAgICAgZmxkY3cgKCVyZGkpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGVU5DVElPTiBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZAorLy8KKy8vIHZvaWQKKy8vIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQKKworICAgICAgICBmc3RjdyAoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGVU5DVElPTiBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkCisvLworLy8gdm9pZAorLy8gX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCgpOworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkCisKKyNpZiBLTVBfTUlDCisvLyBUT0RPOiByZW1vdmUgdGhlIHdvcmthcm91bmQgZm9yIHByb2JsZW0gd2l0aCBmbmNsZXggaW5zdHJ1Y3Rpb24gKG5vIENRIGtub3duKQorICAgICAgICBmc3RlbnYgIC0zMiglcnNwKSAgICAgICAgICAgICAgLy8gc3RvcmUgRlAgZW52CisgICAgICAgIGFuZHcgICAgJH4weDgwZmYsIDQtMzIoJXJzcCkgICAvLyBjbGVhciAwLTcsMTUgYml0cyBvZiBGUCBTVworICAgICAgICBmbGRlbnYgIC0zMiglcnNwKSAgICAgICAgICAgICAgLy8gbG9hZCBGUCBlbnYgYmFjaworICAgICAgICByZXQKKyNlbHNlCisgICAgICAgIGZuY2xleAorICAgICAgICByZXQKKyNlbmRpZgorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0eXBlZGVmIHZvaWQJKCptaWNyb3Rhc2tfdCkoIGludCAqZ3RpZCwgaW50ICp0aWQsIC4uLiApOworLy8KKy8vIGludAorLy8gX19rbXBfaW52b2tlX21pY3JvdGFzayggdm9pZCAoKnBrZm4pIChpbnQgZ3RpZCwgaW50IHRpZCwgLi4uKSwKKy8vCQkgICAgICAgICAgIGludCBndGlkLCBpbnQgdGlkLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsIHZvaWQgKnBfYXJndltdICkgeworLy8gICAgKCpwa2ZuKSggJiBndGlkLCAmIHRpZCwgYXJndlswXSwgLi4uICk7CisvLyAgICByZXR1cm4gMTsKKy8vIH0KKy8vCisvLyBub3RlOiBhdCBjYWxsIHRvIHBrZm4gbXVzdCBoYXZlICVyc3AgMTI4LWJ5dGUgYWxpZ25lZCBmb3IgY29tcGlsZXIKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gICAgICAlcmRpOiAgCXBrZm4KKy8vCSVlc2k6CWd0aWQKKy8vCSVlZHg6CXRpZAorLy8JJWVjeDoJYXJnYworLy8JJXI4OglwX2FyZ3YKKy8vCSVyOToJJmV4aXRfZnJhbWUKKy8vCisvLyBsb2NhbHM6CisvLwlfX2d0aWQ6CWd0aWQgcGFybSBwdXNoZWQgb24gc3RhY2sgc28gY2FuIHBhc3MgJmd0aWQgdG8gcGtmbgorLy8JX190aWQ6CXRpZCBwYXJtIHB1c2hlZCBvbiBzdGFjayBzbyBjYW4gcGFzcyAmdGlkIHRvIHBrZm4KKy8vCisvLyByZWcgdGVtcHM6CisvLwklcmF4Ogl1c2VkIGFsbCBvdmVyIHRoZSBwbGFjZQorLy8JJXJkeDoJdXNlZCBpbiBzdGFjayBwb2ludGVyIGFsaWdubWVudCBjYWxjdWxhdGlvbgorLy8JJXIxMToJdXNlZCB0byB0cmF2ZXJzZSBwX2FyZ3YgYXJyYXkKKy8vCSVyc2k6CXVzZWQgYXMgdGVtcG9yYXJ5IGZvciBzdGFjayBwYXJhbWV0ZXJzCisvLwkJdXNlZCBhcyB0ZW1wb3JhcnkgZm9yIG51bWJlciBvZiBwa2ZuIHBhcm1zIHRvIHB1c2gKKy8vCSVyYng6CXVzZWQgdG8gaG9sZCBwa2ZuIGFkZHJlc3MsIGFuZCB6ZXJvIGNvbnN0YW50LCBjYWxsZWUtc2F2ZQorLy8KKy8vIHJldHVybjoJJWVheCAJKGFsd2F5cyAxL1RSVUUpCitfX2d0aWQgPSAtMTYKK19fdGlkID0gLTI0CisKKy8vIC0tIEJlZ2luIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKy8vIG1hcmtfYmVnaW47CisgICAgICAgIC50ZXh0CisJUFJPQyAgX19rbXBfaW52b2tlX21pY3JvdGFzaworCisJcHVzaHEgCSVyYnAJCS8vIHNhdmUgYmFzZSBwb2ludGVyCisJS01QX0NGSV9ERUZfT0ZGU0VUIDE2CisJS01QX0NGSV9PRkZTRVQgcmJwLC0xNgorCW1vdnEgCSVyc3AsJXJicAkvLyBlc3RhYmxpc2ggdGhlIGJhc2UgcG9pbnRlciBmb3IgdGhpcyByb3V0aW5lLgorCUtNUF9DRklfUkVHSVNURVIgcmJwCisKKyNpZiBPTVBUX1NVUFBPUlQKKwltb3ZxCSVyYnAsICglcjkpCS8vIHNhdmUgZXhpdF9mcmFtZQorI2VuZGlmCisKKwlwdXNocSAJJXJieAkJLy8gJXJieCBpcyBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXIKKwlwdXNocQklcnNpCQkvLyBQdXQgZ3RpZCBvbiBzdGFjayBzbyBjYW4gcGFzcyAmdGdpZCB0byBwa2ZuCisJcHVzaHEJJXJkeAkJLy8gUHV0IHRpZCBvbiBzdGFjayBzbyBjYW4gcGFzcyAmdGlkIHRvIHBrZm4KKworCW1vdnEJJXJjeCwgJXJheAkvLyBTdGFjayBhbGlnbm1lbnQgY2FsY3VsYXRpb24gYmVnaW5zOyBhcmdjIC0+ICVyYXgKKwltb3ZxCSQwLCAlcmJ4CS8vIGNvbnN0YW50IGZvciBjbW92cyBsYXRlcgorCXN1YnEJJDQsICVyYXgJLy8gc3VidHJhY3QgZm91ciBhcmdzIHBhc3NlZCBpbiByZWdpc3RlcnMgdG8gcGtmbgorI2lmIEtNUF9NSUMKKwlqcwlLTVBfTEFCRUwoa21wXzApCS8vIGp1bXAgdG8gbW92cQorCWptcAlLTVBfTEFCRUwoa21wXzBfZXhpdCkJLy8ganVtcCBhaGVhZAorS01QX0xBQkVMKGttcF8wKToKKwltb3ZxCSVyYngsICVyYXgJLy8gemVybyBuZWdhdGl2ZSB2YWx1ZSBpbiAlcmF4IDwtIG1heCgwLCBhcmdjLTQpCitLTVBfTEFCRUwoa21wXzBfZXhpdCk6CisjZWxzZQorCWNtb3ZzcQklcmJ4LCAlcmF4CS8vIHplcm8gbmVnYXRpdmUgdmFsdWUgaW4gJXJheCA8LSBtYXgoMCwgYXJnYy00KQorI2VuZGlmIC8vIEtNUF9NSUMKKworCW1vdnEJJXJheCwgJXJzaQkvLyBzYXZlIG1heCgwLCBhcmdjLTQpIC0+ICVyc2kgZm9yIGxhdGVyCisJc2hscSAJJDMsICVyYXgJLy8gTnVtYmVyIG9mIGJ5dGVzIHVzZWQgb24gc3RhY2s6IG1heCgwLCBhcmdjLTQpKjgKKworCW1vdnEgCSVyc3AsICVyZHgJLy8KKwlzdWJxIAklcmF4LCAlcmR4CS8vICVyc3AtKG1heCgwLGFyZ2MtNCkqOCkgLT4gJXJkeCAtLQorCQkJCS8vIHdpdGhvdXQgYWxpZ24sIHN0YWNrIHB0ciB3b3VsZCBiZSB0aGlzCisJbW92cSAJJXJkeCwgJXJheAkvLyBTYXZlIHRvICVyYXgKKworCWFuZHEgCSQweEZGRkZGRkZGRkZGRkZGODAsICVyYXggIC8vIG1hc2sgb2ZmIGxvd2VyIDcgYml0cyAoMTI4IGJ5dGVzIGFsaWduKQorCXN1YnEgCSVyYXgsICVyZHgJLy8gQW1vdW50IHRvIHN1YnRyYWN0IGZyb20gJXJzcAorCXN1YnEgCSVyZHgsICVyc3AJLy8gUHJlcGFyZSB0aGUgc3RhY2sgcHRyIC0tCisJCQkJLy8gbm93ICVyc3Agd2lsbCBhbGlnbiB0byAxMjgtYnl0ZSBib3VuZGFyeSBhdCBjYWxsIHNpdGUKKworCQkJCS8vIHNldHVwIHBrZm4gcGFyYW1ldGVyIHJlZyBhbmQgc3RhY2sKKwltb3ZxCSVyY3gsICVyYXgJLy8gYXJnYyAtPiAlcmF4CisJY21wcQkkMCwgJXJzaQorCWplCUtNUF9MQUJFTChrbXBfaW52b2tlX3Bhc3NfcGFybXMpCS8vIGp1bXAgYWhlYWQgaWYgbm8gcGFybXMgdG8gcHVzaAorCXNobHEJJDMsICVyY3gJLy8gYXJnYyo4IC0+ICVyY3gKKwltb3ZxIAklcjgsICVyZHgJLy8gcF9hcmd2IC0+ICVyZHgKKwlhZGRxCSVyY3gsICVyZHgJLy8gJnBfYXJndlthcmdjXSAtPiAlcmR4CisKKwltb3ZxCSVyc2ksICVyY3gJLy8gbWF4ICgwLCBhcmdjLTQpIC0+ICVyY3gKKworS01QX0xBQkVMKGttcF9pbnZva2VfcHVzaF9wYXJtcyk6CisJLy8gcHVzaCBudGggLSA3dGggcGFybXMgdG8gcGtmbiBvbiBzdGFjaworCXN1YnEJJDgsICVyZHgJLy8gZGVjcmVtZW50IHBfYXJndiBwb2ludGVyIHRvIHByZXZpb3VzIHBhcm0KKwltb3ZxCSglcmR4KSwgJXJzaQkvLyBwX2FyZ3ZbJXJjeC0xXSAtPiAlcnNpCisJcHVzaHEJJXJzaQkJLy8gcHVzaCBwX2FyZ3ZbJXJjeC0xXSBvbnRvIHN0YWNrIChyZXZlcnNlIG9yZGVyKQorCXN1YmwJJDEsICVlY3gKKworLy8gQzY5NTcwOiAiWDg2XzY0X1JFTE9DX0JSQU5DSCBub3Qgc3VwcG9ydGVkIiBlcnJvciBhdCBsaW5raW5nIG9uIG1hY18zMmUKKy8vCQlpZiB0aGUgbmFtZSBvZiB0aGUgbGFiZWwgdGhhdCBpcyBhbiBvcGVyYW5kIG9mIHRoaXMgamVjeHogc3RhcnRzIHdpdGggYSBkb3QgKCIuIik7CisvLwkgICBBcHBsZSdzIGxpbmtlciBkb2VzIG5vdCBzdXBwb3J0IDEtYnl0ZSBsZW5ndGggcmVsb2NhdGlvbjsKKy8vICAgICAgICAgUmVzb2x1dGlvbjogcmVwbGFjZSBhbGwgLmxhYmVsWCBlbnRyaWVzIHdpdGggTF9sYWJlbFguCisKKwlqZWN4eiAgIEtNUF9MQUJFTChrbXBfaW52b2tlX3Bhc3NfcGFybXMpICAvLyBzdG9wIHdoZW4gZm91ciBwX2FyZ3ZbXSBwYXJtcyBsZWZ0CisJam1wCUtNUF9MQUJFTChrbXBfaW52b2tlX3B1c2hfcGFybXMpCisJQUxJR04gMworS01QX0xBQkVMKGttcF9pbnZva2VfcGFzc19wYXJtcyk6CS8vIHB1dCAxc3QgLSA2dGggcGFybXMgdG8gcGtmbiBpbiByZWdpc3RlcnMuCisJCQkJLy8gb3JkZXIgaGVyZSBpcyBpbXBvcnRhbnQgdG8gYXZvaWQgdHJhc2hpbmcKKwkJCQkvLyByZWdpc3RlcnMgdXNlZCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IHBhcm1zIQorCW1vdnEJJXJkaSwgJXJieAkvLyBwa2ZuIC0+ICVyYngKKwlsZWFxCV9fZ3RpZCglcmJwKSwgJXJkaSAvLyAmZ3RpZCAtPiAlcmRpIChzdG9yZSAxc3QgcGFybSB0byBwa2ZuKQorCWxlYXEJX190aWQoJXJicCksICVyc2kgIC8vICZ0aWQgLT4gJXJzaSAoc3RvcmUgMm5kIHBhcm0gdG8gcGtmbikKKworCW1vdnEJJXI4LCAlcjExCS8vIHBfYXJndiAtPiAlcjExCisKKyNpZiBLTVBfTUlDCisJY21wcQkkNCwgJXJheAkvLyBhcmdjID49IDQ/CisJam5zCUtNUF9MQUJFTChrbXBfNCkJLy8ganVtcCB0byBtb3ZxCisJam1wCUtNUF9MQUJFTChrbXBfNF9leGl0KQkvLyBqdW1wIGFoZWFkCitLTVBfTEFCRUwoa21wXzQpOgorCW1vdnEJMjQoJXIxMSksICVyOQkvLyBwX2FyZ3ZbM10gLT4gJXI5IChzdG9yZSA2dGggcGFybSB0byBwa2ZuKQorS01QX0xBQkVMKGttcF80X2V4aXQpOgorCisJY21wcQkkMywgJXJheAkvLyBhcmdjID49IDM/CisJam5zCUtNUF9MQUJFTChrbXBfMykJLy8ganVtcCB0byBtb3ZxCisJam1wCUtNUF9MQUJFTChrbXBfM19leGl0KQkvLyBqdW1wIGFoZWFkCitLTVBfTEFCRUwoa21wXzMpOgorCW1vdnEJMTYoJXIxMSksICVyOAkvLyBwX2FyZ3ZbMl0gLT4gJXI4IChzdG9yZSA1dGggcGFybSB0byBwa2ZuKQorS01QX0xBQkVMKGttcF8zX2V4aXQpOgorCisJY21wcQkkMiwgJXJheAkvLyBhcmdjID49IDI/CisJam5zCUtNUF9MQUJFTChrbXBfMikJLy8ganVtcCB0byBtb3ZxCisJam1wCUtNUF9MQUJFTChrbXBfMl9leGl0KQkvLyBqdW1wIGFoZWFkCitLTVBfTEFCRUwoa21wXzIpOgorCW1vdnEJOCglcjExKSwgJXJjeAkvLyBwX2FyZ3ZbMV0gLT4gJXJjeCAoc3RvcmUgNHRoIHBhcm0gdG8gcGtmbikKK0tNUF9MQUJFTChrbXBfMl9leGl0KToKKworCWNtcHEJJDEsICVyYXgJLy8gYXJnYyA+PSAxPworCWpucwlLTVBfTEFCRUwoa21wXzEpCS8vIGp1bXAgdG8gbW92cQorCWptcAlLTVBfTEFCRUwoa21wXzFfZXhpdCkJLy8ganVtcCBhaGVhZAorS01QX0xBQkVMKGttcF8xKToKKwltb3ZxCSglcjExKSwgJXJkeAkvLyBwX2FyZ3ZbMF0gLT4gJXJkeCAoc3RvcmUgM3JkIHBhcm0gdG8gcGtmbikKK0tNUF9MQUJFTChrbXBfMV9leGl0KToKKyNlbHNlCisJY21wcQkkNCwgJXJheAkvLyBhcmdjID49IDQ/CisJY21vdm5zcQkyNCglcjExKSwgJXI5CS8vIHBfYXJndlszXSAtPiAlcjkgKHN0b3JlIDZ0aCBwYXJtIHRvIHBrZm4pCisKKwljbXBxCSQzLCAlcmF4CS8vIGFyZ2MgPj0gMz8KKwljbW92bnNxCTE2KCVyMTEpLCAlcjgJLy8gcF9hcmd2WzJdIC0+ICVyOCAoc3RvcmUgNXRoIHBhcm0gdG8gcGtmbikKKworCWNtcHEJJDIsICVyYXgJLy8gYXJnYyA+PSAyPworCWNtb3Zuc3EJOCglcjExKSwgJXJjeAkvLyBwX2FyZ3ZbMV0gLT4gJXJjeCAoc3RvcmUgNHRoIHBhcm0gdG8gcGtmbikKKworCWNtcHEJJDEsICVyYXgJLy8gYXJnYyA+PSAxPworCWNtb3Zuc3EJKCVyMTEpLCAlcmR4CS8vIHBfYXJndlswXSAtPiAlcmR4IChzdG9yZSAzcmQgcGFybSB0byBwa2ZuKQorI2VuZGlmIC8vIEtNUF9NSUMKKworCWNhbGwJKiVyYngJCS8vIGNhbGwgKCpwa2ZuKSgpOworCW1vdnEJJDEsICVyYXgJLy8gbW92ZSAxIGludG8gcmV0dXJuIHJlZ2lzdGVyOworCisJbW92cQktOCglcmJwKSwgJXJieAkvLyByZXN0b3JlICVyYngJdXNpbmcgJXJicCBzaW5jZSAlcnNwIHdhcyBtb2RpZmllZAorCW1vdnEgCSVyYnAsICVyc3AJLy8gcmVzdG9yZSBzdGFjayBwb2ludGVyCisJcG9wcSAJJXJicAkJLy8gcmVzdG9yZSBmcmFtZSBwb2ludGVyCisJS01QX0NGSV9ERUYgcnNwLDgKKwlyZXQKKworCURFQlVHX0lORk8gX19rbXBfaW52b2tlX21pY3JvdGFzaworLy8gLS0gRW5kICBfX2ttcF9pbnZva2VfbWljcm90YXNrCisKKy8vIGttcF91aW50NjQKKy8vIF9fa21wX2hhcmR3YXJlX3RpbWVzdGFtcCh2b2lkKQorICAgICAgICAudGV4dAorCVBST0MgIF9fa21wX2hhcmR3YXJlX3RpbWVzdGFtcAorCXJkdHNjCisJc2hscSAgICAkMzIsICVyZHgKKwlvcnEgICAgICVyZHgsICVyYXgKKwlyZXQKKworCURFQlVHX0lORk8gX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wCisvLyAtLSBFbmQgIF9fa21wX2hhcmR3YXJlX3RpbWVzdGFtcAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRlVOQ1RJT04gX19rbXBfYnNyMzIKKy8vCisvLyBpbnQKKy8vIF9fa21wX2JzcjMyKCBpbnQgKTsKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfYnNyMzIKKworICAgICAgICBic3IgICAgJWVkaSwlZWF4CisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfYnNyMzIKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VuZGlmIC8qIEtNUF9BUkNIX1g4Nl82NCAqLworCisvLyAnCisjaWYgKEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfREFSV0lOKSAmJiBLTVBfQVJDSF9BQVJDSDY0CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gdHlwZWRlZiB2b2lkCSgqbWljcm90YXNrX3QpKCBpbnQgKmd0aWQsIGludCAqdGlkLCAuLi4gKTsKKy8vCisvLyBpbnQKKy8vIF9fa21wX2ludm9rZV9taWNyb3Rhc2soIHZvaWQgKCpwa2ZuKSAoaW50IGd0aWQsIGludCB0aWQsIC4uLiksCisvLwkJICAgICAgICAgICBpbnQgZ3RpZCwgaW50IHRpZCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmdjLCB2b2lkICpwX2FyZ3ZbXSApIHsKKy8vICAgICgqcGtmbikoICYgZ3RpZCwgJiB0aWQsIGFyZ3ZbMF0sIC4uLiApOworLy8gICAgcmV0dXJuIDE7CisvLyB9CisvLworLy8gcGFyYW1ldGVyczoKKy8vCXgwOglwa2ZuCisvLwl3MToJZ3RpZAorLy8JdzI6CXRpZAorLy8JdzM6CWFyZ2MKKy8vCXg0OglwX2FyZ3YKKy8vCXg1OgkmZXhpdF9mcmFtZQorLy8KKy8vIGxvY2FsczoKKy8vCV9fZ3RpZDoJZ3RpZCBwYXJtIHB1c2hlZCBvbiBzdGFjayBzbyBjYW4gcGFzcyAmZ3RpZCB0byBwa2ZuCisvLwlfX3RpZDoJdGlkIHBhcm0gcHVzaGVkIG9uIHN0YWNrIHNvIGNhbiBwYXNzICZ0aWQgdG8gcGtmbgorLy8KKy8vIHJlZyB0ZW1wczoKKy8vCSB4ODoJdXNlZCB0byBob2xkIHBrZm4gYWRkcmVzcworLy8JIHc5Ogl1c2VkIGFzIHRlbXBvcmFyeSBmb3IgbnVtYmVyIG9mIHBrZm4gcGFybXMKKy8vCXgxMDoJdXNlZCB0byB0cmF2ZXJzZSBwX2FyZ3YgYXJyYXkKKy8vCXgxMToJdXNlZCBhcyB0ZW1wb3JhcnkgZm9yIHN0YWNrIHBsYWNlbWVudCBjYWxjdWxhdGlvbgorLy8JeDEyOgl1c2VkIGFzIHRlbXBvcmFyeSBmb3Igc3RhY2sgcGFyYW1ldGVycworLy8JeDE5Ogl1c2VkIHRvIHByZXNlcnZlIGV4aXRfZnJhbWVfcHRyLCBjYWxsZWUtc2F2ZQorLy8KKy8vIHJldHVybjoJdzAJKGFsd2F5cyAxL1RSVUUpCisvLworCitfX2d0aWQgPSA0CitfX3RpZCA9IDgKKworLy8gLS0gQmVnaW4gX19rbXBfaW52b2tlX21pY3JvdGFzaworLy8gbWFya19iZWdpbjsKKwkudGV4dAorCVBST0MgX19rbXBfaW52b2tlX21pY3JvdGFzaworCisJc3RwCXgyOSwgeDMwLCBbc3AsICMtMTZdIQorIyBpZiBPTVBUX1NVUFBPUlQKKwlzdHAJeDE5LCB4MjAsIFtzcCwgIy0xNl0hCisjIGVuZGlmCisJbW92CXgyOSwgc3AKKworCW9ycgl3OSwgd3pyLCAjMQorCWFkZAl3OSwgdzksIHczLCBsc3IgIzEKKwlzdWIJc3AsIHNwLCB3OSwgbHNsICM0CisJbW92CXgxMSwgc3AKKworCW1vdgl4OCwgeDAKKwlzdHIJdzEsIFt4MjksICMtX19ndGlkXQorCXN0cgl3MiwgW3gyOSwgIy1fX3RpZF0KKwltb3YJdzksIHczCisJbW92CXgxMCwgeDQKKyMgaWYgT01QVF9TVVBQT1JUCisJbW92CXgxOSwgeDUKKwlzdHIJeDI5LCBbeDE5XQorIyBlbmRpZgorCisJc3ViCXgwLCB4MjksICNfX2d0aWQKKwlzdWIJeDEsIHgyOSwgI19fdGlkCisKKwljYnoJdzksIEtNUF9MQUJFTChrbXBfMSkKKwlsZHIJeDIsIFt4MTBdCisKKwlzdWIJdzksIHc5LCAjMQorCWNiegl3OSwgS01QX0xBQkVMKGttcF8xKQorCWxkcgl4MywgW3gxMCwgIzhdIQorCisJc3ViCXc5LCB3OSwgIzEKKwljYnoJdzksIEtNUF9MQUJFTChrbXBfMSkKKwlsZHIJeDQsIFt4MTAsICM4XSEKKworCXN1Ygl3OSwgdzksICMxCisJY2J6CXc5LCBLTVBfTEFCRUwoa21wXzEpCisJbGRyCXg1LCBbeDEwLCAjOF0hCisKKwlzdWIJdzksIHc5LCAjMQorCWNiegl3OSwgS01QX0xBQkVMKGttcF8xKQorCWxkcgl4NiwgW3gxMCwgIzhdIQorCisJc3ViCXc5LCB3OSwgIzEKKwljYnoJdzksIEtNUF9MQUJFTChrbXBfMSkKKwlsZHIJeDcsIFt4MTAsICM4XSEKKworS01QX0xBQkVMKGttcF8wKToKKwlzdWIJdzksIHc5LCAjMQorCWNiegl3OSwgS01QX0xBQkVMKGttcF8xKQorCWxkcgl4MTIsIFt4MTAsICM4XSEKKwlzdHIJeDEyLCBbeDExXSwgIzgKKwliCUtNUF9MQUJFTChrbXBfMCkKK0tNUF9MQUJFTChrbXBfMSk6CisJYmxyCXg4CisJb3JyCXcwLCB3enIsICMxCisJbW92CXNwLCB4MjkKKyMgaWYgT01QVF9TVVBQT1JUCisJc3RyCXh6ciwgW3gxOV0KKwlsZHAJeDE5LCB4MjAsIFtzcF0sICMxNgorIyBlbmRpZgorCWxkcAl4MjksIHgzMCwgW3NwXSwgIzE2CisJcmV0CisKKwlERUJVR19JTkZPIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKy8vIC0tIEVuZCAgX19rbXBfaW52b2tlX21pY3JvdGFzaworCisjZW5kaWYgLyogKEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfREFSV0lOKSAmJiBLTVBfQVJDSF9BQVJDSDY0ICovCisKKyNpZiBLTVBfQVJDSF9QUEM2NAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIHR5cGVkZWYgdm9pZAkoKm1pY3JvdGFza190KSggaW50ICpndGlkLCBpbnQgKnRpZCwgLi4uICk7CisvLworLy8gaW50CisvLyBfX2ttcF9pbnZva2VfbWljcm90YXNrKCB2b2lkICgqcGtmbikgKGludCBndGlkLCBpbnQgdGlkLCAuLi4pLAorLy8JCSAgICAgICAgICAgaW50IGd0aWQsIGludCB0aWQsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnYywgdm9pZCAqcF9hcmd2W10gKSB7CisvLyAgICAoKnBrZm4pKCAmIGd0aWQsICYgdGlkLCBhcmd2WzBdLCAuLi4gKTsKKy8vICAgIHJldHVybiAxOworLy8gfQorLy8KKy8vIHBhcmFtZXRlcnM6CisvLwlyMzoJcGtmbgorLy8JcjQ6CWd0aWQKKy8vCXI1Ogl0aWQKKy8vCXI2OglhcmdjCisvLwlyNzoJcF9hcmd2CisvLwlyODoJJmV4aXRfZnJhbWUKKy8vCisvLyByZXR1cm46CXIzCShhbHdheXMgMS9UUlVFKQorLy8KKwkudGV4dAorIyBpZiBLTVBfQVJDSF9QUEM2NF9MRQorCS5hYml2ZXJzaW9uIDIKKyMgZW5kaWYKKwkuZ2xvYmwJX19rbXBfaW52b2tlX21pY3JvdGFzaworCisjIGlmIEtNUF9BUkNIX1BQQzY0X0xFCisJLnAyYWxpZ24JNAorIyBlbHNlCisJLnAyYWxpZ24JMgorIyBlbmRpZgorCisJLnR5cGUJX19rbXBfaW52b2tlX21pY3JvdGFzayxAZnVuY3Rpb24KKworIyBpZiBLTVBfQVJDSF9QUEM2NF9MRQorX19rbXBfaW52b2tlX21pY3JvdGFzazoKKy5MZnVuY19iZWdpbjA6CisuTGZ1bmNfZ2VwMDoKKwlhZGRpcyAyLCAxMiwgLlRPQy4tLkxmdW5jX2dlcDBAaGEKKwlhZGRpIDIsIDIsIC5UT0MuLS5MZnVuY19nZXAwQGwKKy5MZnVuY19sZXAwOgorCS5sb2NhbGVudHJ5CV9fa21wX2ludm9rZV9taWNyb3Rhc2ssIC5MZnVuY19sZXAwLS5MZnVuY19nZXAwCisjIGVsc2UKKwkuc2VjdGlvbgkub3BkLCJhdyIsQHByb2diaXRzCitfX2ttcF9pbnZva2VfbWljcm90YXNrOgorCS5wMmFsaWduCTMKKwkucXVhZAkuTGZ1bmNfYmVnaW4wCisJLnF1YWQJLlRPQy5AdG9jYmFzZQorCS5xdWFkCTAKKwkudGV4dAorLkxmdW5jX2JlZ2luMDoKKyMgZW5kaWYKKworLy8gLS0gQmVnaW4gX19rbXBfaW52b2tlX21pY3JvdGFzaworLy8gbWFya19iZWdpbjsKKworLy8gV2UgbmVlZCB0byBhbGxvY2F0ZSBhIHN0YWNrIGZyYW1lIGxhcmdlIGVub3VnaCB0byBob2xkIGFsbCBvZiB0aGUgcGFyYW1ldGVycworLy8gb24gdGhlIHN0YWNrIGZvciB0aGUgbWljcm90YXNrIHBsdXMgd2hhdCB0aGlzIGZ1bmN0aW9uIG5lZWRzLiBUaGF0J3MgNDgKKy8vIGJ5dGVzIHVuZGVyIHRoZSBFTEZ2MSBBQkkgKDMyIGJ5dGVzIHVuZGVyIEVMRnYyKSwgcGx1cyA4KigyICsgYXJnYykgZm9yIHRoZQorLy8gcGFyYW1ldGVycyB0byB0aGUgbWljcm90YXNrLCBwbHVzIDggYnl0ZXMgdG8gc3RvcmUgdGhlIHZhbHVlcyBvZiByNCBhbmQgcjUsCisvLyBhbmQgOCBieXRlcyB0byBzdG9yZSByMzEuIFdpdGggT01QLVQgc3VwcG9ydCwgd2UgbmVlZCBhbiBhZGRpdGlvbmFsIDggYnl0ZXMKKy8vIHRvIHNhdmUgcjMwIHRvIGhvbGQgYSBjb3B5IG9mIHI4LgorCisJLmNmaV9zdGFydHByb2MKKwltZmxyIDAKKwlzdGQgMzEsIC04KDEpCisJc3RkIDAsIDE2KDEpCisKKy8vIFRoaXMgaXMgdW51c3VhbCBiZWNhdXNlIG5vcm1hbGx5IHdlJ2Qgc2V0IHIzMSBlcXVhbCB0byByMSBhZnRlciB0aGUgc3RhY2sKKy8vIGZyYW1lIGlzIGVzdGFibGlzaGVkLiBJbiB0aGlzIGNhc2UsIGhvd2V2ZXIsIHdlIG5lZWQgdG8gZHluYW1pY2FsbHkgY29tcHV0ZQorLy8gdGhlIHN0YWNrIGZyYW1lIHNpemUsIGFuZCBzbyB3ZSBrZWVwIGEgZGlyZWN0IGNvcHkgb2YgcjEgdG8gYWNjZXNzIG91cgorLy8gcmVnaXN0ZXIgc2F2ZSBhcmVhcyBhbmQgcmVzdG9yZSB0aGUgcjEgdmFsdWUgYmVmb3JlIHJldHVybmluZy4KKwltciAzMSwgMQorCS5jZmlfZGVmX2NmYV9yZWdpc3RlciByMzEKKwkuY2ZpX29mZnNldCByMzEsIC04CisJLmNmaV9vZmZzZXQgbHIsIDE2CisKKy8vIENvbXB1dGUgdGhlIHNpemUgbmVjZXNzYXJ5IGZvciB0aGUgbG9jYWwgc3RhY2sgZnJhbWUuCisjIGlmIEtNUF9BUkNIX1BQQzY0X0xFCisJbGkgMTIsIDcyCisjIGVsc2UKKwlsaSAxMiwgODgKKyMgZW5kaWYKKwlzbGRpIDAsIDYsIDMKKwlhZGQgMTIsIDAsIDEyCisJbmVnIDEyLCAxMgorCisvLyBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzdGFjayBmcmFtZSBzdGF5cyBhbGlnbmVkICh0byAxNiBieXRlcywgZXhjZXB0CisvLyB1bmRlciB0aGUgQkcvUSBDTkssIHdoZXJlIGl0IG11c3QgYmUgdG8gMzIgYnl0ZXMpLgorIyBpZiBLTVBfT1NfQ05LCisJbGkgMCwgLTMyCisjIGVsc2UKKwlsaSAwLCAtMTYKKyMgZW5kaWYKKwlhbmQgMTIsIDAsIDEyCisKKy8vIEVzdGFibGlzaCB0aGUgbG9jYWwgc3RhY2sgZnJhbWUuCisJc3RkdXggMSwgMSwgMTIKKworIyBpZiBPTVBUX1NVUFBPUlQKKwkuY2ZpX29mZnNldCByMzAsIC0xNgorCXN0ZCAzMCwgLTE2KDMxKQorCXN0ZCAxLCAwKDgpCisJbXIgMzAsIDgKKyMgZW5kaWYKKworLy8gU3RvcmUgZ3RpZCBhbmQgdGlkIHRvIHRoZSBzdGFjayBiZWNhdXNlIHRoZXkncmUgcGFzc2VkIGJ5IHJlZmVyZW5jZSB0byB0aGUgbWljcm90YXNrLgorCXN0dyA0LCAtMjAoMzEpCisJc3R3IDUsIC0yNCgzMSkKKworCW1yIDEyLCA2CisJbXIgNCwgNworCisJY21wd2kgMCwgMTIsIDEKKwlibHQJIDAsIC5MY2FsbAorCisJbGQgNSwgMCg0KQorCisJY21wd2kgMCwgMTIsIDIKKwlibHQJIDAsIC5MY2FsbAorCisJbGQgNiwgOCg0KQorCisJY21wd2kgMCwgMTIsIDMKKwlibHQJIDAsIC5MY2FsbAorCisJbGQgNywgMTYoNCkKKworCWNtcHdpIDAsIDEyLCA0CisJYmx0CSAwLCAuTGNhbGwKKworCWxkIDgsIDI0KDQpCisKKwljbXB3aSAwLCAxMiwgNQorCWJsdAkgMCwgLkxjYWxsCisKKwlsZCA5LCAzMig0KQorCisJY21wd2kgMCwgMTIsIDYKKwlibHQJIDAsIC5MY2FsbAorCisJbGQgMTAsIDQwKDQpCisKKwljbXB3aSAwLCAxMiwgNworCWJsdAkgMCwgLkxjYWxsCisKKy8vIFRoZXJlIGFyZSBtb3JlIHRoYW4gNiBtaWNyb3Rhc2sgcGFyYW1ldGVycywgc28gd2UgbmVlZCB0byBzdG9yZSB0aGUKKy8vIHJlbWFpbmRlciB0byB0aGUgc3RhY2suCisJYWRkaSAxMiwgMTIsIC02CisJbXRjdHIgMTIKKworLy8gVGhlc2UgYXJlIHNldCB0byA4IGJ5dGVzIGJlZm9yZSB0aGUgZmlyc3QgZGVzaXJlZCBzdG9yZSBhZGRyZXNzICh3ZSdyZSB1c2luZworLy8gcHJlLWluY3JlbWVudCBsb2FkcyBhbmQgc3RvcmVzIGluIHRoZSBsb29wIGJlbG93KS4gVGhlIHBhcmFtZXRlciBzYXZlIGFyZWEKKy8vIGZvciB0aGUgbWljcm90YXNrIGJlZ2lucyA0OCArIDgqOCA9PSAxMTIgYnl0ZXMgYWJvdmUgcjEgZm9yIEVMRnYxIGFuZAorLy8gMzIgKyA4KjggPT0gOTYgYnl0ZXMgYWJvdmUgcjEgZm9yIEVMRnYyLgorCWFkZGkgNCwgNCwgNDAKKyMgaWYgS01QX0FSQ0hfUFBDNjRfTEUKKwlhZGRpIDEyLCAxLCA4OAorIyBlbHNlCisJYWRkaSAxMiwgMSwgMTA0CisjIGVuZGlmCisKKy5MbmV4dDoKKwlsZHUgMCwgOCg0KQorCXN0ZHUgMCwgOCgxMikKKwliZG56IC5MbmV4dAorCisuTGNhbGw6CisjIGlmIEtNUF9BUkNIX1BQQzY0X0xFCisJc3RkIDIsIDI0KDEpCisJbXIgMTIsIDMKKyNlbHNlCisJc3RkIDIsIDQwKDEpCisvLyBGb3IgRUxGdjEsIHdlIG5lZWQgdG8gbG9hZCB0aGUgYWN0dWFsIGZ1bmN0aW9uIGFkZHJlc3MgZnJvbSB0aGUgZnVuY3Rpb24gZGVzY3JpcHRvci4KKwlsZCAxMiwgMCgzKQorCWxkIDIsIDgoMykKKwlsZCAxMSwgMTYoMykKKyNlbmRpZgorCisJYWRkaSAzLCAzMSwgLTIwCisJYWRkaSA0LCAzMSwgLTI0CisKKwltdGN0ciAxMgorCWJjdHJsCisjIGlmIEtNUF9BUkNIX1BQQzY0X0xFCisJbGQgMiwgMjQoMSkKKyMgZWxzZQorCWxkIDIsIDQwKDEpCisjIGVuZGlmCisKKyMgaWYgT01QVF9TVVBQT1JUCisJbGkgMywgMAorCXN0ZCAzLCAwKDMwKQorIyBlbmRpZgorCisJbGkgMywgMQorCisjIGlmIE9NUFRfU1VQUE9SVAorCWxkIDMwLCAtMTYoMzEpCisjIGVuZGlmCisKKwltciAxLCAzMQorCWxkIDAsIDE2KDEpCisJbGQgMzEsIC04KDEpCisJbXRsciAwCisJYmxyCisKKwkubG9uZwkwCisJLnF1YWQJMAorLkxmdW5jX2VuZDA6CisJLnNpemUJX19rbXBfaW52b2tlX21pY3JvdGFzaywgLkxmdW5jX2VuZDAtLkxmdW5jX2JlZ2luMAorCS5jZmlfZW5kcHJvYworCisvLyAtLSBFbmQgIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKworI2VuZGlmIC8qIEtNUF9BUkNIX1BQQzY0ICovCisKKyNpZiBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfTUlQUworICAgIC5kYXRhCisgICAgLmNvbW0gLmdvbXBfY3JpdGljYWxfdXNlcl8sMzIsOAorICAgIC5kYXRhCisgICAgLmFsaWduIDQKKyAgICAuZ2xvYmFsIF9fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcgorX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyOgorICAgIC40Ynl0ZSAuZ29tcF9jcml0aWNhbF91c2VyXworICAgIC5zaXplIF9fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkciw0CisjZW5kaWYgLyogS01QX0FSQ0hfQVJNICovCisKKyNpZiBLTVBfQVJDSF9QUEM2NCB8fCBLTVBfQVJDSF9BQVJDSDY0IHx8IEtNUF9BUkNIX01JUFM2NAorICAgIC5kYXRhCisgICAgLmNvbW0gLmdvbXBfY3JpdGljYWxfdXNlcl8sMzIsOAorICAgIC5kYXRhCisgICAgLmFsaWduIDgKKyAgICAuZ2xvYmFsIF9fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcgorX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyOgorICAgIC44Ynl0ZSAuZ29tcF9jcml0aWNhbF91c2VyXworICAgIC5zaXplIF9fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkciw4CisjZW5kaWYgLyogS01QX0FSQ0hfUFBDNjQgfHwgS01QX0FSQ0hfQUFSQ0g2NCAqLworCisjaWYgS01QX09TX0xJTlVYCisjIGlmIEtNUF9BUkNIX0FSTQorLnNlY3Rpb24gLm5vdGUuR05VLXN0YWNrLCIiLCVwcm9nYml0cworIyBlbHNlCisuc2VjdGlvbiAubm90ZS5HTlUtc3RhY2ssIiIsQHByb2diaXRzCisjIGVuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvc3JjL3pfTGludXhfdXRpbC5jcHAgYi9maW5hbC9ydW50aW1lL3NyYy96X0xpbnV4X3V0aWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZGEwNGIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3NyYy96X0xpbnV4X3V0aWwuY3BwCkBAIC0wLDAgKzEsMjQxMiBAQAorLyoKKyAqIHpfTGludXhfdXRpbC5jcHAgLS0gcGxhdGZvcm0gc3BlY2lmaWMgcm91dGluZXMuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfYWZmaW5pdHkuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pby5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfbG9jay5oIgorI2luY2x1ZGUgImttcF9zdGF0cy5oIgorI2luY2x1ZGUgImttcF9zdHIuaCIKKyNpbmNsdWRlICJrbXBfd2FpdF9yZWxlYXNlLmgiCisjaW5jbHVkZSAia21wX3dyYXBwZXJfZ2V0cGlkLmgiCisKKyNpZiAhS01QX09TX0ZSRUVCU0QgJiYgIUtNUF9PU19ORVRCU0QKKyNpbmNsdWRlIDxhbGxvY2EuaD4KKyNlbmRpZgorI2luY2x1ZGUgPG1hdGguaD4gLy8gSFVHRV9WQUwuCisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWYgS01QX09TX0xJTlVYICYmICFLTVBfT1NfQ05LCisjaW5jbHVkZSA8c3lzL3N5c2luZm8uaD4KKyNpZiBLTVBfVVNFX0ZVVEVYCisvLyBXZSBzaG91bGQgcmVhbGx5IGluY2x1ZGUgPGZ1dGV4Lmg+LCBidXQgdGhhdCBjYXVzZXMgY29tcGF0aWJpbGl0eSBwcm9ibGVtcyBvbgorLy8gZGlmZmVyZW50IExpbnV4KiBPUyBkaXN0cmlidXRpb25zIHRoYXQgZWl0aGVyIHJlcXVpcmUgdGhhdCB5b3UgaW5jbHVkZSAob3IKKy8vIGJyZWFrIHdoZW4geW91IHRyeSB0byBpbmNsdWRlKSA8cGNpL3R5cGVzLmg+LiBTaW5jZSBhbGwgd2UgbmVlZCBpcyB0aGUgdHdvCisvLyBtYWNyb3MgYmVsb3cgKHdoaWNoIGFyZSBwYXJ0IG9mIHRoZSBrZXJuZWwgQUJJLCBzbyBjYW4ndCBjaGFuZ2UpIHdlIGp1c3QKKy8vIGRlZmluZSB0aGUgY29uc3RhbnRzIGhlcmUgYW5kIGRvbid0IGluY2x1ZGUgPGZ1dGV4Lmg+CisjaWZuZGVmIEZVVEVYX1dBSVQKKyNkZWZpbmUgRlVURVhfV0FJVCAwCisjZW5kaWYKKyNpZm5kZWYgRlVURVhfV0FLRQorI2RlZmluZSBGVVRFWF9XQUtFIDEKKyNlbmRpZgorI2VuZGlmCisjZWxpZiBLTVBfT1NfREFSV0lOCisjaW5jbHVkZSA8bWFjaC9tYWNoLmg+CisjaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgorI2VsaWYgS01QX09TX0ZSRUVCU0QKKyNpbmNsdWRlIDxwdGhyZWFkX25wLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgInRzYW5fYW5ub3RhdGlvbnMuaCIKKworc3RydWN0IGttcF9zeXNfdGltZXIgeworICBzdHJ1Y3QgdGltZXNwZWMgc3RhcnQ7Cit9OworCisvLyBDb252ZXJ0IHRpbWVzcGVjIHRvIG5hbm9zZWNvbmRzLgorI2RlZmluZSBUUzJOUyh0aW1lc3BlYykgKCgodGltZXNwZWMpLnR2X3NlYyAqIDFlOSkgKyAodGltZXNwZWMpLnR2X25zZWMpCisKK3N0YXRpYyBzdHJ1Y3Qga21wX3N5c190aW1lciBfX2ttcF9zeXNfdGltZXJfZGF0YTsKKworI2lmIEtNUF9IQU5ETEVfU0lHTkFMUwordHlwZWRlZiB2b2lkICgqc2lnX2Z1bmNfdCkoaW50KTsKK1NUQVRJQ19FRkkyX1dPUktBUk9VTkQgc3RydWN0IHNpZ2FjdGlvbiBfX2ttcF9zaWdobGRyc1tOU0lHXTsKK3N0YXRpYyBzaWdzZXRfdCBfX2ttcF9zaWdzZXQ7CisjZW5kaWYKKworc3RhdGljIGludCBfX2ttcF9pbml0X3J1bnRpbWUgPSBGQUxTRTsKKworc3RhdGljIGludCBfX2ttcF9mb3JrX2NvdW50ID0gMDsKKworc3RhdGljIHB0aHJlYWRfY29uZGF0dHJfdCBfX2ttcF9zdXNwZW5kX2NvbmRfYXR0cjsKK3N0YXRpYyBwdGhyZWFkX211dGV4YXR0cl90IF9fa21wX3N1c3BlbmRfbXV0ZXhfYXR0cjsKKworc3RhdGljIGttcF9jb25kX2FsaWduX3QgX19rbXBfd2FpdF9jdjsKK3N0YXRpYyBrbXBfbXV0ZXhfYWxpZ25fdCBfX2ttcF93YWl0X214OworCitrbXBfdWludDY0IF9fa21wX3RpY2tzX3Blcl9tc2VjID0gMTAwMDAwMDsKKworI2lmZGVmIERFQlVHX1NVU1BFTkQKK3N0YXRpYyB2b2lkIF9fa21wX3ByaW50X2NvbmQoY2hhciAqYnVmZmVyLCBrbXBfY29uZF9hbGlnbl90ICpjb25kKSB7CisgIEtNUF9TTlBSSU5URihidWZmZXIsIDEyOCwgIihjb25kIChsb2NrICglbGQsICVkKSksIChkZXNjciAoJXApKSkiLAorICAgICAgICAgICAgICAgY29uZC0+Y19jb25kLl9fY19sb2NrLl9fc3RhdHVzLCBjb25kLT5jX2NvbmQuX19jX2xvY2suX19zcGlubG9jaywKKyAgICAgICAgICAgICAgIGNvbmQtPmNfY29uZC5fX2Nfd2FpdGluZyk7Cit9CisjZW5kaWYKKworI2lmIChLTVBfT1NfTElOVVggJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRCkKKworLyogQWZmaW5pdHkgc3VwcG9ydCAqLworCit2b2lkIF9fa21wX2FmZmluaXR5X2JpbmRfdGhyZWFkKGludCB3aGljaCkgeworICBLTVBfQVNTRVJUMihLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpLAorICAgICAgICAgICAgICAiSWxsZWdhbCBzZXQgYWZmaW5pdHkgb3BlcmF0aW9uIHdoZW4gbm90IGNhcGFibGUiKTsKKworICBrbXBfYWZmaW5fbWFza190ICptYXNrOworICBLTVBfQ1BVX0FMTE9DX09OX1NUQUNLKG1hc2spOworICBLTVBfQ1BVX1pFUk8obWFzayk7CisgIEtNUF9DUFVfU0VUKHdoaWNoLCBtYXNrKTsKKyAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eShtYXNrLCBUUlVFKTsKKyAgS01QX0NQVV9GUkVFX0ZST01fU1RBQ0sobWFzayk7Cit9CisKKy8qIERldGVybWluZSBpZiB3ZSBjYW4gYWNjZXNzIGFmZmluaXR5IGZ1bmN0aW9uYWxpdHkgb24gdGhpcyB2ZXJzaW9uIG9mCisgKiBMaW51eCogT1MgYnkgY2hlY2tpbmcgX19OUl9zY2hlZF97Z2V0LHNldH1hZmZpbml0eSBzeXN0ZW0gY2FsbHMsIGFuZCBzZXQKKyAqIF9fa21wX2FmZmluX21hc2tfc2l6ZSB0byB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgKDAgbWVhbnMgbm90IGNhcGFibGUpLiAqLwordm9pZCBfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZShjb25zdCBjaGFyICplbnZfdmFyKSB7CisvLyBDaGVjayBhbmQgc2VlIGlmIHRoZSBPUyBzdXBwb3J0cyB0aHJlYWQgYWZmaW5pdHkuCisKKyNkZWZpbmUgS01QX0NQVV9TRVRfU0laRV9MSU1JVCAoMTAyNCAqIDEwMjQpCisKKyAgaW50IGdDb2RlOworICBpbnQgc0NvZGU7CisgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKyAgYnVmID0gKHVuc2lnbmVkIGNoYXIgKilLTVBfSU5URVJOQUxfTUFMTE9DKEtNUF9DUFVfU0VUX1NJWkVfTElNSVQpOworCisgIC8vIElmIExpbnV4KiBPUzoKKyAgLy8gSWYgdGhlIHN5c2NhbGwgZmFpbHMgb3IgcmV0dXJucyBhIHN1Z2dlc3Rpb24gZm9yIHRoZSBzaXplLAorICAvLyB0aGVuIHdlIGRvbid0IGhhdmUgdG8gc2VhcmNoIGZvciBhbiBhcHByb3ByaWF0ZSBzaXplLgorICBnQ29kZSA9IHN5c2NhbGwoX19OUl9zY2hlZF9nZXRhZmZpbml0eSwgMCwgS01QX0NQVV9TRVRfU0laRV9MSU1JVCwgYnVmKTsKKyAgS0FfVFJBQ0UoMzAsICgiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICAgICAgICAgICAiaW5pdGlhbCBnZXRhZmZpbml0eSBjYWxsIHJldHVybmVkICVkIGVycm5vID0gJWRcbiIsCisgICAgICAgICAgICAgICAgZ0NvZGUsIGVycm5vKSk7CisKKyAgLy8gaWYgKChnQ29kZSA8IDApICYmIChlcnJubyA9PSBFTk9TWVMpKQorICBpZiAoZ0NvZGUgPCAwKSB7CisgICAgLy8gU3lzdGVtIGNhbGwgbm90IHN1cHBvcnRlZAorICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8CisgICAgICAgIChfX2ttcF9hZmZpbml0eV93YXJuaW5ncyAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKSAmJgorICAgICAgICAgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZGVmYXVsdCkgJiYKKyAgICAgICAgIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2Rpc2FibGVkKSkpIHsKKyAgICAgIGludCBlcnJvciA9IGVycm5vOworICAgICAga21wX21zZ190IGVycl9jb2RlID0gS01QX0VSUihlcnJvcik7CisgICAgICBfX2ttcF9tc2coa21wX21zX3dhcm5pbmcsIEtNUF9NU0coR2V0QWZmU3lzQ2FsbE5vdFN1cHBvcnRlZCwgZW52X3ZhciksCisgICAgICAgICAgICAgICAgZXJyX2NvZGUsIF9fa21wX21zZ19udWxsKTsKKyAgICAgIGlmIChfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA9PSBrbXBfd2FybmluZ3Nfb2ZmKSB7CisgICAgICAgIF9fa21wX3N0cl9mcmVlKCZlcnJfY29kZS5zdHIpOworICAgICAgfQorICAgIH0KKyAgICBLTVBfQUZGSU5JVFlfRElTQUJMRSgpOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKGJ1Zik7CisgICAgcmV0dXJuOworICB9CisgIGlmIChnQ29kZSA+IDApIHsgLy8gTGludXgqIE9TIG9ubHkKKyAgICAvLyBUaGUgb3B0aW1hbCBzaXR1YXRpb246IHRoZSBPUyByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgaXQgZXhwZWN0cy4KKyAgICAvLworICAgIC8vIEEgdmVyaWZpY2F0aW9uIG9mIGNvcnJlY3QgYmVoYXZpb3IgaXMgdGhhdCBJc2V0YWZmaW5pdHkgb24gYSBOVUxMCisgICAgLy8gYnVmZmVyIHdpdGggdGhlIHNhbWUgc2l6ZSBmYWlscyB3aXRoIGVycm5vIHNldCB0byBFRkFVTFQuCisgICAgc0NvZGUgPSBzeXNjYWxsKF9fTlJfc2NoZWRfc2V0YWZmaW5pdHksIDAsIGdDb2RlLCBOVUxMKTsKKyAgICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgICAgICAgICAgICAgInNldGFmZmluaXR5IGZvciBtYXNrIHNpemUgJWQgcmV0dXJuZWQgJWQgZXJybm8gPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGdDb2RlLCBzQ29kZSwgZXJybm8pKTsKKyAgICBpZiAoc0NvZGUgPCAwKSB7CisgICAgICBpZiAoZXJybm8gPT0gRU5PU1lTKSB7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8CisgICAgICAgICAgICAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MgJiYKKyAgICAgICAgICAgICAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKSAmJgorICAgICAgICAgICAgIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2RlZmF1bHQpICYmCisgICAgICAgICAgICAgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZGlzYWJsZWQpKSkgeworICAgICAgICAgIGludCBlcnJvciA9IGVycm5vOworICAgICAgICAgIGttcF9tc2dfdCBlcnJfY29kZSA9IEtNUF9FUlIoZXJyb3IpOworICAgICAgICAgIF9fa21wX21zZyhrbXBfbXNfd2FybmluZywgS01QX01TRyhTZXRBZmZTeXNDYWxsTm90U3VwcG9ydGVkLCBlbnZfdmFyKSwKKyAgICAgICAgICAgICAgICAgICAgZXJyX2NvZGUsIF9fa21wX21zZ19udWxsKTsKKyAgICAgICAgICBpZiAoX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPT0ga21wX3dhcm5pbmdzX29mZikgeworICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoJmVycl9jb2RlLnN0cik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEtNUF9BRkZJTklUWV9ESVNBQkxFKCk7CisgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKGJ1Zik7CisgICAgICB9CisgICAgICBpZiAoZXJybm8gPT0gRUZBVUxUKSB7CisgICAgICAgIEtNUF9BRkZJTklUWV9FTkFCTEUoZ0NvZGUpOworICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgICAgICAgICAgICAgICAgICJhZmZpbml0eSBzdXBwb3J0ZWQgKG1hc2sgc2l6ZSAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgKGludClfX2ttcF9hZmZpbl9tYXNrX3NpemUpKTsKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoYnVmKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIENhbGwgdGhlIGdldGFmZmluaXR5IHN5c3RlbSBjYWxsIHJlcGVhdGVkbHkgd2l0aCBpbmNyZWFzaW5nIHNldCBzaXplcworICAvLyB1bnRpbCB3ZSBzdWNjZWVkLCBvciByZWFjaCBhbiB1cHBlciBib3VuZCBvbiB0aGUgc2VhcmNoLgorICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgICAgICAgICAgICJzZWFyY2hpbmcgZm9yIHByb3BlciBzZXQgc2l6ZVxuIikpOworICBpbnQgc2l6ZTsKKyAgZm9yIChzaXplID0gMTsgc2l6ZSA8PSBLTVBfQ1BVX1NFVF9TSVpFX0xJTUlUOyBzaXplICo9IDIpIHsKKyAgICBnQ29kZSA9IHN5c2NhbGwoX19OUl9zY2hlZF9nZXRhZmZpbml0eSwgMCwgc2l6ZSwgYnVmKTsKKyAgICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgICAgICAgICAgICAgImdldGFmZmluaXR5IGZvciBtYXNrIHNpemUgJWQgcmV0dXJuZWQgJWQgZXJybm8gPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIHNpemUsIGdDb2RlLCBlcnJubykpOworCisgICAgaWYgKGdDb2RlIDwgMCkgeworICAgICAgaWYgKGVycm5vID09IEVOT1NZUykgeworICAgICAgICAvLyBXZSBzaG91bGRuJ3QgZ2V0IGhlcmUKKyAgICAgICAgS0FfVFJBQ0UoMzAsICgiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAiaW5jb25zaXN0ZW50IE9TIGNhbGwgYmVoYXZpb3I6IGVycm5vID09IEVOT1NZUyBmb3IgbWFzayAiCisgICAgICAgICAgICAgICAgICAgICAgInNpemUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZSkpOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fAorICAgICAgICAgICAgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzICYmCisgICAgICAgICAgICAgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkgJiYKKyAgICAgICAgICAgICAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kZWZhdWx0KSAmJgorICAgICAgICAgICAgIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2Rpc2FibGVkKSkpIHsKKyAgICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgICBrbXBfbXNnX3QgZXJyX2NvZGUgPSBLTVBfRVJSKGVycm9yKTsKKyAgICAgICAgICBfX2ttcF9tc2coa21wX21zX3dhcm5pbmcsIEtNUF9NU0coR2V0QWZmU3lzQ2FsbE5vdFN1cHBvcnRlZCwgZW52X3ZhciksCisgICAgICAgICAgICAgICAgICAgIGVycl9jb2RlLCBfX2ttcF9tc2dfbnVsbCk7CisgICAgICAgICAgaWYgKF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID09IGttcF93YXJuaW5nc19vZmYpIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCZlcnJfY29kZS5zdHIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBLTVBfQUZGSU5JVFlfRElTQUJMRSgpOworICAgICAgICBLTVBfSU5URVJOQUxfRlJFRShidWYpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBzQ29kZSA9IHN5c2NhbGwoX19OUl9zY2hlZF9zZXRhZmZpbml0eSwgMCwgZ0NvZGUsIE5VTEwpOworICAgIEtBX1RSQUNFKDMwLCAoIl9fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlOiAiCisgICAgICAgICAgICAgICAgICAic2V0YWZmaW5pdHkgZm9yIG1hc2sgc2l6ZSAlZCByZXR1cm5lZCAlZCBlcnJubyA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgZ0NvZGUsIHNDb2RlLCBlcnJubykpOworICAgIGlmIChzQ29kZSA8IDApIHsKKyAgICAgIGlmIChlcnJubyA9PSBFTk9TWVMpIHsgLy8gTGludXgqIE9TIG9ubHkKKyAgICAgICAgLy8gV2Ugc2hvdWxkbid0IGdldCBoZXJlCisgICAgICAgIEtBX1RSQUNFKDMwLCAoIl9fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlOiAiCisgICAgICAgICAgICAgICAgICAgICAgImluY29uc2lzdGVudCBPUyBjYWxsIGJlaGF2aW9yOiBlcnJubyA9PSBFTk9TWVMgZm9yIG1hc2sgIgorICAgICAgICAgICAgICAgICAgICAgICJzaXplICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHNpemUpKTsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwKKyAgICAgICAgICAgIChfX2ttcF9hZmZpbml0eV93YXJuaW5ncyAmJgorICAgICAgICAgICAgIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpICYmCisgICAgICAgICAgICAgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZGVmYXVsdCkgJiYKKyAgICAgICAgICAgICAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kaXNhYmxlZCkpKSB7CisgICAgICAgICAgaW50IGVycm9yID0gZXJybm87CisgICAgICAgICAga21wX21zZ190IGVycl9jb2RlID0gS01QX0VSUihlcnJvcik7CisgICAgICAgICAgX19rbXBfbXNnKGttcF9tc193YXJuaW5nLCBLTVBfTVNHKFNldEFmZlN5c0NhbGxOb3RTdXBwb3J0ZWQsIGVudl92YXIpLAorICAgICAgICAgICAgICAgICAgICBlcnJfY29kZSwgX19rbXBfbXNnX251bGwpOworICAgICAgICAgIGlmIChfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA9PSBrbXBfd2FybmluZ3Nfb2ZmKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSgmZXJyX2NvZGUuc3RyKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgS01QX0FGRklOSVRZX0RJU0FCTEUoKTsKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoYnVmKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgaWYgKGVycm5vID09IEVGQVVMVCkgeworICAgICAgICBLTVBfQUZGSU5JVFlfRU5BQkxFKGdDb2RlKTsKKyAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAiYWZmaW5pdHkgc3VwcG9ydGVkIChtYXNrIHNpemUgJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgIChpbnQpX19rbXBfYWZmaW5fbWFza19zaXplKSk7CisgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKGJ1Zik7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLy8gc2F2ZSB1bmNhdWdodCBlcnJvciBjb2RlCisgIC8vIGludCBlcnJvciA9IGVycm5vOworICBLTVBfSU5URVJOQUxfRlJFRShidWYpOworICAvLyByZXN0b3JlIHVuY2F1Z2h0IGVycm9yIGNvZGUsIHdpbGwgYmUgcHJpbnRlZCBhdCB0aGUgbmV4dCBLTVBfV0FSTklORyBiZWxvdworICAvLyBlcnJubyA9IGVycm9yOworCisgIC8vIEFmZmluaXR5IGlzIG5vdCBzdXBwb3J0ZWQKKyAgS01QX0FGRklOSVRZX0RJU0FCTEUoKTsKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICAgICAgICAgICAiY2Fubm90IGRldGVybWluZSBtYXNrIHNpemUgLSBhZmZpbml0eSBub3Qgc3VwcG9ydGVkXG4iKSk7CisgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8CisgICAgICAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkgJiYKKyAgICAgICAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kZWZhdWx0KSAmJgorICAgICAgIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2Rpc2FibGVkKSkpIHsKKyAgICBLTVBfV0FSTklORyhBZmZDYW50R2V0TWFza1NpemUsIGVudl92YXIpOworICB9Cit9CisKKyNlbmRpZiAvLyBLTVBfT1NfTElOVVggJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorCisjaWYgS01QX1VTRV9GVVRFWAorCitpbnQgX19rbXBfZnV0ZXhfZGV0ZXJtaW5lX2NhcGFibGUoKSB7CisgIGludCBsb2MgPSAwOworICBpbnQgcmMgPSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZsb2MsIEZVVEVYX1dBS0UsIDEsIE5VTEwsIE5VTEwsIDApOworICBpbnQgcmV0dmFsID0gKHJjID09IDApIHx8IChlcnJubyAhPSBFTk9TWVMpOworCisgIEtBX1RSQUNFKDEwLAorICAgICAgICAgICAoIl9fa21wX2Z1dGV4X2RldGVybWluZV9jYXBhYmxlOiByYyA9ICVkIGVycm5vID0gJWRcbiIsIHJjLCBlcnJubykpOworICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9mdXRleF9kZXRlcm1pbmVfY2FwYWJsZTogZnV0ZXggc3lzY2FsbCVzIHN1cHBvcnRlZFxuIiwKKyAgICAgICAgICAgICAgICByZXR2YWwgPyAiIiA6ICIgbm90IikpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKyNlbmRpZiAvLyBLTVBfVVNFX0ZVVEVYCisKKyNpZiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCkgJiYgKCFLTVBfQVNNX0lOVFJJTlMpCisvKiBPbmx5IDMyLWJpdCAiYWRkLWV4Y2hhbmdlIiBpbnN0cnVjdGlvbiBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgY2F1c2VzIHVzIHRvCisgICB1c2UgY29tcGFyZV9hbmRfc3RvcmUgZm9yIHRoZXNlIHJvdXRpbmVzICovCisKK2ttcF9pbnQ4IF9fa21wX3Rlc3RfdGhlbl9vcjgodm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGQpIHsKKyAga21wX2ludDggb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgb2xkX3ZhbHVlID0gVENSXzEoKnApOworICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworCisgIHdoaWxlICghS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDgocCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpKSB7CisgICAgS01QX0NQVV9QQVVTRSgpOworICAgIG9sZF92YWx1ZSA9IFRDUl8xKCpwKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworICB9CisgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKK2ttcF9pbnQ4IF9fa21wX3Rlc3RfdGhlbl9hbmQ4KHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBkKSB7CisgIGttcF9pbnQ4IG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgIG9sZF92YWx1ZSA9IFRDUl8xKCpwKTsKKyAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICYgZDsKKworICB3aGlsZSAoIUtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw4KHAsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlKSkgeworICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICBvbGRfdmFsdWUgPSBUQ1JfMSgqcCk7CisgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICYgZDsKKyAgfQorICByZXR1cm4gb2xkX3ZhbHVlOworfQorCitrbXBfdWludDMyIF9fa21wX3Rlc3RfdGhlbl9vcjMyKHZvbGF0aWxlIGttcF91aW50MzIgKnAsIGttcF91aW50MzIgZCkgeworICBrbXBfdWludDMyIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgIG9sZF92YWx1ZSA9IFRDUl80KCpwKTsKKyAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlIHwgZDsKKworICB3aGlsZSAoIUtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUwzMihwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSkpIHsKKyAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgb2xkX3ZhbHVlID0gVENSXzQoKnApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSB8IGQ7CisgIH0KKyAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKwora21wX3VpbnQzMiBfX2ttcF90ZXN0X3RoZW5fYW5kMzIodm9sYXRpbGUga21wX3VpbnQzMiAqcCwga21wX3VpbnQzMiBkKSB7CisgIGttcF91aW50MzIgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgb2xkX3ZhbHVlID0gVENSXzQoKnApOworICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgJiBkOworCisgIHdoaWxlICghS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDMyKHAsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlKSkgeworICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICBvbGRfdmFsdWUgPSBUQ1JfNCgqcCk7CisgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICYgZDsKKyAgfQorICByZXR1cm4gb2xkX3ZhbHVlOworfQorCisjaWYgS01QX0FSQ0hfWDg2CitrbXBfaW50OCBfX2ttcF90ZXN0X3RoZW5fYWRkOCh2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggZCkgeworICBrbXBfaW50OCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICBvbGRfdmFsdWUgPSBUQ1JfMSgqcCk7CisgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSArIGQ7CisKKyAgd2hpbGUgKCFLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMOChwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSkpIHsKKyAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgb2xkX3ZhbHVlID0gVENSXzEoKnApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSArIGQ7CisgIH0KKyAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKwora21wX2ludDY0IF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCh2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkKSB7CisgIGttcF9pbnQ2NCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICBvbGRfdmFsdWUgPSBUQ1JfOCgqcCk7CisgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSArIGQ7CisKKyAgd2hpbGUgKCFLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMNjQocCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpKSB7CisgICAgS01QX0NQVV9QQVVTRSgpOworICAgIG9sZF92YWx1ZSA9IFRDUl84KCpwKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgKyBkOworICB9CisgIHJldHVybiBvbGRfdmFsdWU7Cit9CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2ICovCisKK2ttcF91aW50NjQgX19rbXBfdGVzdF90aGVuX29yNjQodm9sYXRpbGUga21wX3VpbnQ2NCAqcCwga21wX3VpbnQ2NCBkKSB7CisgIGttcF91aW50NjQgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgb2xkX3ZhbHVlID0gVENSXzgoKnApOworICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworICB3aGlsZSAoIUtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw2NChwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSkpIHsKKyAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgb2xkX3ZhbHVlID0gVENSXzgoKnApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSB8IGQ7CisgIH0KKyAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKwora21wX3VpbnQ2NCBfX2ttcF90ZXN0X3RoZW5fYW5kNjQodm9sYXRpbGUga21wX3VpbnQ2NCAqcCwga21wX3VpbnQ2NCBkKSB7CisgIGttcF91aW50NjQgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgb2xkX3ZhbHVlID0gVENSXzgoKnApOworICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgJiBkOworICB3aGlsZSAoIUtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw2NChwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSkpIHsKKyAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgb2xkX3ZhbHVlID0gVENSXzgoKnApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSAmIGQ7CisgIH0KKyAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKworI2VuZGlmIC8qIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0KSAmJiAoISBLTVBfQVNNX0lOVFJJTlMpICovCisKK3ZvaWQgX19rbXBfdGVybWluYXRlX3RocmVhZChpbnQgZ3RpZCkgeworICBpbnQgc3RhdHVzOworICBrbXBfaW5mb190ICp0aCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisKKyAgaWYgKCF0aCkKKyAgICByZXR1cm47CisKKyNpZmRlZiBLTVBfQ0FOQ0VMX1RIUkVBRFMKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBfdGVybWluYXRlX3RocmVhZDoga2lsbCAoJWQpXG4iLCBndGlkKSk7CisgIHN0YXR1cyA9IHB0aHJlYWRfY2FuY2VsKHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCk7CisgIGlmIChzdGF0dXMgIT0gMCAmJiBzdGF0dXMgIT0gRVNSQ0gpIHsKKyAgICBfX2ttcF9tc2coa21wX21zX2ZhdGFsLCBLTVBfTVNHKENhbnRUZXJtaW5hdGVXb3JrZXJUaHJlYWQpLCBLTVBfRVJSKHN0YXR1cyksCisgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsKTsKKyAgfTsgLy8gaWYKKyNlbmRpZgorICBfX2ttcF95aWVsZChUUlVFKTsKK30gLy8KKworLyogU2V0IHRocmVhZCBzdGFjayBpbmZvIGFjY29yZGluZyB0byB2YWx1ZXMgcmV0dXJuZWQgYnkgcHRocmVhZF9nZXRhdHRyX25wKCkuCisgICBJZiB2YWx1ZXMgYXJlIHVucmVhc29uYWJsZSwgYXNzdW1lIGNhbGwgZmFpbGVkIGFuZCB1c2UgaW5jcmVtZW50YWwgc3RhY2sKKyAgIHJlZmluZW1lbnQgbWV0aG9kIGluc3RlYWQuIFJldHVybnMgVFJVRSBpZiB0aGUgc3RhY2sgcGFyYW1ldGVycyBjb3VsZCBiZQorICAgZGV0ZXJtaW5lZCBleGFjdGx5LCBGQUxTRSBpZiBpbmNyZW1lbnRhbCByZWZpbmVtZW50IGlzIG5lY2Vzc2FyeS4gKi8KK3N0YXRpYyBrbXBfaW50MzIgX19rbXBfc2V0X3N0YWNrX2luZm8oaW50IGd0aWQsIGttcF9pbmZvX3QgKnRoKSB7CisgIGludCBzdGFja19kYXRhOworI2lmIEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfRlJFRUJTRCB8fCBLTVBfT1NfTkVUQlNECisgIC8qIExpbnV4KiBPUyBvbmx5IC0tIG5vIHB0aHJlYWRfZ2V0YXR0cl9ucCBzdXBwb3J0IG9uIE9TIFgqICovCisgIHB0aHJlYWRfYXR0cl90IGF0dHI7CisgIGludCBzdGF0dXM7CisgIHNpemVfdCBzaXplID0gMDsKKyAgdm9pZCAqYWRkciA9IDA7CisKKyAgLyogQWx3YXlzIGRvIGluY3JlbWVudGFsIHN0YWNrIHJlZmluZW1lbnQgZm9yIHViZXJtYXN0ZXIgdGhyZWFkcyBzaW5jZSB0aGUKKyAgICAgaW5pdGlhbCB0aHJlYWQgc3RhY2sgcmFuZ2UgY2FuIGJlIHJlZHVjZWQgYnkgc2libGluZyB0aHJlYWQgY3JlYXRpb24gc28KKyAgICAgcHRocmVhZF9hdHRyX2dldHN0YWNrIG1heSBjYXVzZSB0aHJlYWQgZ3RpZCBhbGlhc2luZyAqLworICBpZiAoIUtNUF9VQkVSX0dUSUQoZ3RpZCkpIHsKKworICAgIC8qIEZldGNoIHRoZSByZWFsIHRocmVhZCBhdHRyaWJ1dGVzICovCisgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX2luaXQoJmF0dHIpOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCJwdGhyZWFkX2F0dHJfaW5pdCIsIHN0YXR1cyk7CisjaWYgS01QX09TX0ZSRUVCU0QgfHwgS01QX09TX05FVEJTRAorICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9nZXRfbnAocHRocmVhZF9zZWxmKCksICZhdHRyKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCgicHRocmVhZF9hdHRyX2dldF9ucCIsIHN0YXR1cyk7CisjZWxzZQorICAgIHN0YXR1cyA9IHB0aHJlYWRfZ2V0YXR0cl9ucChwdGhyZWFkX3NlbGYoKSwgJmF0dHIpOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCJwdGhyZWFkX2dldGF0dHJfbnAiLCBzdGF0dXMpOworI2VuZGlmCisgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX2dldHN0YWNrKCZhdHRyLCAmYWRkciwgJnNpemUpOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCJwdGhyZWFkX2F0dHJfZ2V0c3RhY2siLCBzdGF0dXMpOworICAgIEtBX1RSQUNFKDYwLAorICAgICAgICAgICAgICgiX19rbXBfc2V0X3N0YWNrX2luZm86IFQjJWQgcHRocmVhZF9hdHRyX2dldHN0YWNrIHJldHVybmVkIHNpemU6IgorICAgICAgICAgICAgICAiICVsdSwgbG93IGFkZHI6ICVwXG4iLAorICAgICAgICAgICAgICBndGlkLCBzaXplLCBhZGRyKSk7CisgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX2Rlc3Ryb3koJmF0dHIpOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCJwdGhyZWFkX2F0dHJfZGVzdHJveSIsIHN0YXR1cyk7CisgIH0KKworICBpZiAoc2l6ZSAhPSAwICYmIGFkZHIgIT0gMCkgeyAvLyB3YXMgc3RhY2sgcGFyYW1ldGVyIGRldGVybWluYXRpb24gc3VjY2Vzc2Z1bD8KKyAgICAvKiBTdG9yZSB0aGUgY29ycmVjdCBiYXNlIGFuZCBzaXplICovCisgICAgVENXX1BUUih0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2Jhc2UsICgoKGNoYXIgKilhZGRyKSArIHNpemUpKTsKKyAgICBUQ1dfUFRSKHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSwgc2l6ZSk7CisgICAgVENXXzQodGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tncm93LCBGQUxTRSk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyNlbmRpZiAvKiBLTVBfT1NfTElOVVggfHwgS01QX09TX0ZSRUVCU0QgfHwgS01QX09TX05FVEJTRCAqLworICAvKiBVc2UgaW5jcmVtZW50YWwgcmVmaW5lbWVudCBzdGFydGluZyBmcm9tIGluaXRpYWwgY29uc2VydmF0aXZlIGVzdGltYXRlICovCisgIFRDV19QVFIodGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplLCAwKTsKKyAgVENXX1BUUih0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2Jhc2UsICZzdGFja19kYXRhKTsKKyAgVENXXzQodGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tncm93LCBUUlVFKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZCAqX19rbXBfbGF1bmNoX3dvcmtlcih2b2lkICp0aHIpIHsKKyAgaW50IHN0YXR1cywgb2xkX3R5cGUsIG9sZF9zdGF0ZTsKKyNpZmRlZiBLTVBfQkxPQ0tfU0lHTkFMUworICBzaWdzZXRfdCBuZXdfc2V0LCBvbGRfc2V0OworI2VuZGlmIC8qIEtNUF9CTE9DS19TSUdOQUxTICovCisgIHZvaWQgKmV4aXRfdmFsOworI2lmIEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfRlJFRUJTRCB8fCBLTVBfT1NfTkVUQlNECisgIHZvaWQgKnZvbGF0aWxlIHBhZGRpbmcgPSAwOworI2VuZGlmCisgIGludCBndGlkOworCisgIGd0aWQgPSAoKGttcF9pbmZvX3QgKil0aHIpLT50aC50aF9pbmZvLmRzLmRzX2d0aWQ7CisgIF9fa21wX2d0aWRfc2V0X3NwZWNpZmljKGd0aWQpOworI2lmZGVmIEtNUF9UREFUQV9HVElECisgIF9fa21wX2d0aWQgPSBndGlkOworI2VuZGlmCisjaWYgS01QX1NUQVRTX0VOQUJMRUQKKyAgLy8gc2V0IF9fdGhyZWFkIGxvY2FsIGluZGV4IHRvIHBvaW50IHRvIHRocmVhZC1zcGVjaWZpYyBzdGF0cworICBfX2ttcF9zdGF0c190aHJlYWRfcHRyID0gKChrbXBfaW5mb190ICopdGhyKS0+dGgudGhfc3RhdHM7CisgIEtNUF9TVEFSVF9FWFBMSUNJVF9USU1FUihPTVBfd29ya2VyX3RocmVhZF9saWZlKTsKKyAgS01QX1NFVF9USFJFQURfU1RBVEUoSURMRSk7CisgIEtNUF9JTklUX1BBUlRJVElPTkVEX1RJTUVSUyhPTVBfaWRsZSk7CisjZW5kaWYKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgX19rbXBfaXR0X3RocmVhZF9uYW1lKGd0aWQpOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgX19rbXBfYWZmaW5pdHlfc2V0X2luaXRfbWFzayhndGlkLCBGQUxTRSk7CisjZW5kaWYKKworI2lmZGVmIEtNUF9DQU5DRUxfVEhSRUFEUworICBzdGF0dXMgPSBwdGhyZWFkX3NldGNhbmNlbHR5cGUoUFRIUkVBRF9DQU5DRUxfQVNZTkNIUk9OT1VTLCAmb2xkX3R5cGUpOworICBLTVBfQ0hFQ0tfU1lTRkFJTCgicHRocmVhZF9zZXRjYW5jZWx0eXBlIiwgc3RhdHVzKTsKKyAgLy8gam9zaCB0b2RvOiBpc24ndCBQVEhSRUFEX0NBTkNFTF9FTkFCTEUgZGVmYXVsdCBmb3IgbmV3bHktY3JlYXRlZCB0aHJlYWRzPworICBzdGF0dXMgPSBwdGhyZWFkX3NldGNhbmNlbHN0YXRlKFBUSFJFQURfQ0FOQ0VMX0VOQUJMRSwgJm9sZF9zdGF0ZSk7CisgIEtNUF9DSEVDS19TWVNGQUlMKCJwdGhyZWFkX3NldGNhbmNlbHN0YXRlIiwgc3RhdHVzKTsKKyNlbmRpZgorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAvLyBTZXQgRlAgY29udHJvbCByZWdzIHRvIGJlIGEgY29weSBvZiB0aGUgcGFyYWxsZWwgaW5pdGlhbGl6YXRpb24gdGhyZWFkJ3MuCisgIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQoKTsKKyAgX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCgmX19rbXBfaW5pdF94ODdfZnB1X2NvbnRyb2xfd29yZCk7CisgIF9fa21wX2xvYWRfbXhjc3IoJl9fa21wX2luaXRfbXhjc3IpOworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworI2lmZGVmIEtNUF9CTE9DS19TSUdOQUxTCisgIHN0YXR1cyA9IHNpZ2ZpbGxzZXQoJm5ld19zZXQpOworICBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTygic2lnZmlsbHNldCIsIHN0YXR1cyk7CisgIHN0YXR1cyA9IHB0aHJlYWRfc2lnbWFzayhTSUdfQkxPQ0ssICZuZXdfc2V0LCAmb2xkX3NldCk7CisgIEtNUF9DSEVDS19TWVNGQUlMKCJwdGhyZWFkX3NpZ21hc2siLCBzdGF0dXMpOworI2VuZGlmIC8qIEtNUF9CTE9DS19TSUdOQUxTICovCisKKyNpZiBLTVBfT1NfTElOVVggfHwgS01QX09TX0ZSRUVCU0QgfHwgS01QX09TX05FVEJTRAorICBpZiAoX19rbXBfc3Rrb2Zmc2V0ID4gMCAmJiBndGlkID4gMCkgeworICAgIHBhZGRpbmcgPSBLTVBfQUxMT0NBKGd0aWQgKiBfX2ttcF9zdGtvZmZzZXQpOworICB9CisjZW5kaWYKKworICBLTVBfTUIoKTsKKyAgX19rbXBfc2V0X3N0YWNrX2luZm8oZ3RpZCwgKGttcF9pbmZvX3QgKil0aHIpOworCisgIF9fa21wX2NoZWNrX3N0YWNrX292ZXJsYXAoKGttcF9pbmZvX3QgKil0aHIpOworCisgIGV4aXRfdmFsID0gX19rbXBfbGF1bmNoX3RocmVhZCgoa21wX2luZm9fdCAqKXRocik7CisKKyNpZmRlZiBLTVBfQkxPQ0tfU0lHTkFMUworICBzdGF0dXMgPSBwdGhyZWFkX3NpZ21hc2soU0lHX1NFVE1BU0ssICZvbGRfc2V0LCBOVUxMKTsKKyAgS01QX0NIRUNLX1NZU0ZBSUwoInB0aHJlYWRfc2lnbWFzayIsIHN0YXR1cyk7CisjZW5kaWYgLyogS01QX0JMT0NLX1NJR05BTFMgKi8KKworICByZXR1cm4gZXhpdF92YWw7Cit9CisKKyNpZiBLTVBfVVNFX01PTklUT1IKKy8qIFRoZSBtb25pdG9yIHRocmVhZCBjb250cm9scyBhbGwgb2YgdGhlIHRocmVhZHMgaW4gdGhlIGNvbXBsZXggKi8KKworc3RhdGljIHZvaWQgKl9fa21wX2xhdW5jaF9tb25pdG9yKHZvaWQgKnRocikgeworICBpbnQgc3RhdHVzLCBvbGRfdHlwZSwgb2xkX3N0YXRlOworI2lmZGVmIEtNUF9CTE9DS19TSUdOQUxTCisgIHNpZ3NldF90IG5ld19zZXQ7CisjZW5kaWYgLyogS01QX0JMT0NLX1NJR05BTFMgKi8KKyAgc3RydWN0IHRpbWVzcGVjIGludGVydmFsOworICBpbnQgeWllbGRfY291bnQ7CisgIGludCB5aWVsZF9jeWNsZXMgPSAwOworCisgIEtNUF9NQigpOyAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2xhdW5jaF9tb25pdG9yOiAjMSBsYXVuY2hlZFxuIikpOworCisgIC8qIHJlZ2lzdGVyIHVzIGFzIHRoZSBtb25pdG9yIHRocmVhZCAqLworICBfX2ttcF9ndGlkX3NldF9zcGVjaWZpYyhLTVBfR1RJRF9NT05JVE9SKTsKKyNpZmRlZiBLTVBfVERBVEFfR1RJRAorICBfX2ttcF9ndGlkID0gS01QX0dUSURfTU9OSVRPUjsKKyNlbmRpZgorCisgIEtNUF9NQigpOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAvLyBJbnN0cnVjdCBJbnRlbChSKSBUaHJlYWRpbmcgVG9vbHMgdG8gaWdub3JlIG1vbml0b3IgdGhyZWFkLgorICBfX2ttcF9pdHRfdGhyZWFkX2lnbm9yZSgpOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICBfX2ttcF9zZXRfc3RhY2tfaW5mbygoKGttcF9pbmZvX3QgKil0aHIpLT50aC50aF9pbmZvLmRzLmRzX2d0aWQsCisgICAgICAgICAgICAgICAgICAgICAgIChrbXBfaW5mb190ICopdGhyKTsKKworICBfX2ttcF9jaGVja19zdGFja19vdmVybGFwKChrbXBfaW5mb190ICopdGhyKTsKKworI2lmZGVmIEtNUF9DQU5DRUxfVEhSRUFEUworICBzdGF0dXMgPSBwdGhyZWFkX3NldGNhbmNlbHR5cGUoUFRIUkVBRF9DQU5DRUxfQVNZTkNIUk9OT1VTLCAmb2xkX3R5cGUpOworICBLTVBfQ0hFQ0tfU1lTRkFJTCgicHRocmVhZF9zZXRjYW5jZWx0eXBlIiwgc3RhdHVzKTsKKyAgLy8gam9zaCB0b2RvOiBpc24ndCBQVEhSRUFEX0NBTkNFTF9FTkFCTEUgZGVmYXVsdCBmb3IgbmV3bHktY3JlYXRlZCB0aHJlYWRzPworICBzdGF0dXMgPSBwdGhyZWFkX3NldGNhbmNlbHN0YXRlKFBUSFJFQURfQ0FOQ0VMX0VOQUJMRSwgJm9sZF9zdGF0ZSk7CisgIEtNUF9DSEVDS19TWVNGQUlMKCJwdGhyZWFkX3NldGNhbmNlbHN0YXRlIiwgc3RhdHVzKTsKKyNlbmRpZgorCisjaWYgS01QX1JFQUxfVElNRV9GSVgKKyAgLy8gVGhpcyBpcyBhIHBvdGVudGlhbCBmaXggd2hpY2ggYWxsb3dzIGFwcGxpY2F0aW9uIHdpdGggcmVhbC10aW1lIHNjaGVkdWxpbmcKKyAgLy8gcG9saWN5IHdvcmsuIEhvd2V2ZXIsIGRlY2lzaW9uIGFib3V0IHRoZSBmaXggaXMgbm90IG1hZGUgeWV0LCBzbyBpdCBpcworICAvLyBkaXNhYmxlZCBieSBkZWZhdWx0LgorICB7IC8vIEFyZSBwcm9ncmFtIHN0YXJ0ZWQgd2l0aCByZWFsLXRpbWUgc2NoZWR1bGluZyBwb2xpY3k/CisgICAgaW50IHNjaGVkID0gc2NoZWRfZ2V0c2NoZWR1bGVyKDApOworICAgIGlmIChzY2hlZCA9PSBTQ0hFRF9GSUZPIHx8IHNjaGVkID09IFNDSEVEX1JSKSB7CisgICAgICAvLyBZZXMsIHdlIGFyZSBhIHBhcnQgb2YgcmVhbC10aW1lIGFwcGxpY2F0aW9uLiBUcnkgdG8gaW5jcmVhc2UgdGhlCisgICAgICAvLyBwcmlvcml0eSBvZiB0aGUgbW9uaXRvci4KKyAgICAgIHN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbTsKKyAgICAgIGludCBtYXhfcHJpb3JpdHkgPSBzY2hlZF9nZXRfcHJpb3JpdHlfbWF4KHNjaGVkKTsKKyAgICAgIGludCByYzsKKyAgICAgIEtNUF9XQVJOSU5HKFJlYWxUaW1lU2NoZWROb3RTdXBwb3J0ZWQpOworICAgICAgc2NoZWRfZ2V0cGFyYW0oMCwgJnBhcmFtKTsKKyAgICAgIGlmIChwYXJhbS5zY2hlZF9wcmlvcml0eSA8IG1heF9wcmlvcml0eSkgeworICAgICAgICBwYXJhbS5zY2hlZF9wcmlvcml0eSArPSAxOworICAgICAgICByYyA9IHNjaGVkX3NldHNjaGVkdWxlcigwLCBzY2hlZCwgJnBhcmFtKTsKKyAgICAgICAgaWYgKHJjICE9IDApIHsKKyAgICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgICBrbXBfbXNnX3QgZXJyX2NvZGUgPSBLTVBfRVJSKGVycm9yKTsKKyAgICAgICAgICBfX2ttcF9tc2coa21wX21zX3dhcm5pbmcsIEtNUF9NU0coQ2FudENoYW5nZU1vbml0b3JQcmlvcml0eSksCisgICAgICAgICAgICAgICAgICAgIGVycl9jb2RlLCBLTVBfTVNHKE1vbml0b3JXaWxsU3RhcnZlKSwgX19rbXBfbXNnX251bGwpOworICAgICAgICAgIGlmIChfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA9PSBrbXBfd2FybmluZ3Nfb2ZmKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSgmZXJyX2NvZGUuc3RyKTsKKyAgICAgICAgICB9CisgICAgICAgIH07IC8vIGlmCisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBXZSBjYW5ub3QgYWJvcnQgaGVyZSwgYmVjYXVzZSBudW1iZXIgb2YgQ1BVcyBtYXkgYmUgZW5vdWdoIGZvciBhbGwKKyAgICAgICAgLy8gdGhlIHRocmVhZHMsIGluY2x1ZGluZyB0aGUgbW9uaXRvciB0aHJlYWQsIHNvIGFwcGxpY2F0aW9uIGNvdWxkCisgICAgICAgIC8vIHBvdGVudGlhbGx5IHdvcmsuLi4KKyAgICAgICAgX19rbXBfbXNnKGttcF9tc193YXJuaW5nLCBLTVBfTVNHKFJ1bm5pbmdBdE1heFByaW9yaXR5KSwKKyAgICAgICAgICAgICAgICAgIEtNUF9NU0coTW9uaXRvcldpbGxTdGFydmUpLCBLTVBfSE5UKFJ1bm5pbmdBdE1heFByaW9yaXR5KSwKKyAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsKTsKKyAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyAgICAvLyBBQzogZnJlZSB0aHJlYWQgdGhhdCB3YWl0cyBmb3IgbW9uaXRvciBzdGFydGVkCisgICAgVENXXzQoX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUsIDApOworICB9CisjZW5kaWYgLy8gS01QX1JFQUxfVElNRV9GSVgKKworICBLTVBfTUIoKTsgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICBpZiAoX19rbXBfbW9uaXRvcl93YWtldXBzID09IDEpIHsKKyAgICBpbnRlcnZhbC50dl9zZWMgPSAxOworICAgIGludGVydmFsLnR2X25zZWMgPSAwOworICB9IGVsc2UgeworICAgIGludGVydmFsLnR2X3NlYyA9IDA7CisgICAgaW50ZXJ2YWwudHZfbnNlYyA9IChLTVBfTlNFQ19QRVJfU0VDIC8gX19rbXBfbW9uaXRvcl93YWtldXBzKTsKKyAgfQorCisgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2xhdW5jaF9tb25pdG9yOiAjMiBtb25pdG9yXG4iKSk7CisKKyAgaWYgKF9fa21wX3lpZWxkX2N5Y2xlKSB7CisgICAgX19rbXBfeWllbGRpbmdfb24gPSAwOyAvKiBTdGFydCBvdXQgd2l0aCB5aWVsZGluZyBzaHV0IG9mZiAqLworICAgIHlpZWxkX2NvdW50ID0gX19rbXBfeWllbGRfb2ZmX2NvdW50OworICB9IGVsc2UgeworICAgIF9fa21wX3lpZWxkaW5nX29uID0gMTsgLyogWWllbGRpbmcgaXMgb24gcGVybWFuZW50bHkgKi8KKyAgfQorCisgIHdoaWxlICghVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSkgeworICAgIHN0cnVjdCB0aW1lc3BlYyBub3c7CisgICAgc3RydWN0IHRpbWV2YWwgdHZhbDsKKworICAgIC8qICBUaGlzIHRocmVhZCBtb25pdG9ycyB0aGUgc3RhdGUgb2YgdGhlIHN5c3RlbSAqLworCisgICAgS0FfVFJBQ0UoMTUsICgiX19rbXBfbGF1bmNoX21vbml0b3I6IHVwZGF0ZVxuIikpOworCisgICAgc3RhdHVzID0gZ2V0dGltZW9mZGF5KCZ0dmFsLCBOVUxMKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTygiZ2V0dGltZW9mZGF5Iiwgc3RhdHVzKTsKKyAgICBUSU1FVkFMX1RPX1RJTUVTUEVDKCZ0dmFsLCAmbm93KTsKKworICAgIG5vdy50dl9zZWMgKz0gaW50ZXJ2YWwudHZfc2VjOworICAgIG5vdy50dl9uc2VjICs9IGludGVydmFsLnR2X25zZWM7CisKKyAgICBpZiAobm93LnR2X25zZWMgPj0gS01QX05TRUNfUEVSX1NFQykgeworICAgICAgbm93LnR2X3NlYyArPSAxOworICAgICAgbm93LnR2X25zZWMgLT0gS01QX05TRUNfUEVSX1NFQzsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soJl9fa21wX3dhaXRfbXgubV9tdXRleCk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoInB0aHJlYWRfbXV0ZXhfbG9jayIsIHN0YXR1cyk7CisgICAgLy8gQUM6IHRoZSBtb25pdG9yIHNob3VsZCBub3QgZmFsbCBhc2xlZXAgaWYgZ19kb25lIGhhcyBiZWVuIHNldAorICAgIGlmICghVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSkgeyAvLyBjaGVjayBvbmNlIG1vcmUgdW5kZXIgbXV0ZXgKKyAgICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF90aW1lZHdhaXQoJl9fa21wX3dhaXRfY3YuY19jb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX19rbXBfd2FpdF9teC5tX211dGV4LCAmbm93KTsKKyAgICAgIGlmIChzdGF0dXMgIT0gMCkgeworICAgICAgICBpZiAoc3RhdHVzICE9IEVUSU1FRE9VVCAmJiBzdGF0dXMgIT0gRUlOVFIpIHsKKyAgICAgICAgICBLTVBfU1lTRkFJTCgicHRocmVhZF9jb25kX3RpbWVkd2FpdCIsIHN0YXR1cyk7CisgICAgICAgIH07CisgICAgICB9OworICAgIH07CisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soJl9fa21wX3dhaXRfbXgubV9tdXRleCk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoInB0aHJlYWRfbXV0ZXhfdW5sb2NrIiwgc3RhdHVzKTsKKworICAgIGlmIChfX2ttcF95aWVsZF9jeWNsZSkgeworICAgICAgeWllbGRfY3ljbGVzKys7CisgICAgICBpZiAoKHlpZWxkX2N5Y2xlcyAlIHlpZWxkX2NvdW50KSA9PSAwKSB7CisgICAgICAgIGlmIChfX2ttcF95aWVsZGluZ19vbikgeworICAgICAgICAgIF9fa21wX3lpZWxkaW5nX29uID0gMDsgLyogVHVybiBpdCBvZmYgbm93ICovCisgICAgICAgICAgeWllbGRfY291bnQgPSBfX2ttcF95aWVsZF9vZmZfY291bnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgX19rbXBfeWllbGRpbmdfb24gPSAxOyAvKiBUdXJuIGl0IG9uIG5vdyAqLworICAgICAgICAgIHlpZWxkX2NvdW50ID0gX19rbXBfeWllbGRfb25fY291bnQ7CisgICAgICAgIH0KKyAgICAgICAgeWllbGRfY3ljbGVzID0gMDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgX19rbXBfeWllbGRpbmdfb24gPSAxOworICAgIH0KKworICAgIFRDV180KF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlLAorICAgICAgICAgIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlKSArIDEpOworCisgICAgS01QX01CKCk7IC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgIH0KKworICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9sYXVuY2hfbW9uaXRvcjogIzMgY2xlYW51cFxuIikpOworCisjaWZkZWYgS01QX0JMT0NLX1NJR05BTFMKKyAgc3RhdHVzID0gc2lnZmlsbHNldCgmbmV3X3NldCk7CisgIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCJzaWdmaWxsc2V0Iiwgc3RhdHVzKTsKKyAgc3RhdHVzID0gcHRocmVhZF9zaWdtYXNrKFNJR19VTkJMT0NLLCAmbmV3X3NldCwgTlVMTCk7CisgIEtNUF9DSEVDS19TWVNGQUlMKCJwdGhyZWFkX3NpZ21hc2siLCBzdGF0dXMpOworI2VuZGlmIC8qIEtNUF9CTE9DS19TSUdOQUxTICovCisKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBfbGF1bmNoX21vbml0b3I6ICM0IGZpbmlzaGVkXG4iKSk7CisKKyAgaWYgKF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgIT0gMCkgeworICAgIC8qIG5vdyB3ZSBuZWVkIHRvIHRlcm1pbmF0ZSB0aGUgd29ya2VyIHRocmVhZHMgICovCisgICAgLyogdGhlIHZhbHVlIG9mIHRfYWJvcnQgaXMgdGhlIHNpZ25hbCB3ZSBjYXVnaHQgKi8KKworICAgIGludCBndGlkOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfbGF1bmNoX21vbml0b3I6ICM1IHRlcm1pbmF0ZSBzaWc9JWRcbiIsCisgICAgICAgICAgICAgICAgICBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0KSk7CisKKyAgICAvKiB0ZXJtaW5hdGUgdGhlIE9wZW5NUCB3b3JrZXIgdGhyZWFkcyAqLworICAgIC8qIFRPRE8gdGhpcyBpcyBub3QgdmFsaWQgZm9yIHNpYmxpbmcgdGhyZWFkcyEhCisgICAgICogdGhlIHViZXIgbWFzdGVyIG1pZ2h0IG5vdCBiZSAwIGFueW1vcmUuLiAqLworICAgIGZvciAoZ3RpZCA9IDE7IGd0aWQgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyArK2d0aWQpCisgICAgICBfX2ttcF90ZXJtaW5hdGVfdGhyZWFkKGd0aWQpOworCisgICAgX19rbXBfY2xlYW51cCgpOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfbGF1bmNoX21vbml0b3I6ICM2IHJhaXNlIHNpZz0lZFxuIiwKKyAgICAgICAgICAgICAgICAgIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQpKTsKKworICAgIGlmIChfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ID4gMCkKKyAgICAgIHJhaXNlKF9fa21wX2dsb2JhbC5nLmdfYWJvcnQpOworICB9CisKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBfbGF1bmNoX21vbml0b3I6ICM3IGV4aXRcbiIpKTsKKworICByZXR1cm4gdGhyOworfQorI2VuZGlmIC8vIEtNUF9VU0VfTU9OSVRPUgorCit2b2lkIF9fa21wX2NyZWF0ZV93b3JrZXIoaW50IGd0aWQsIGttcF9pbmZvX3QgKnRoLCBzaXplX3Qgc3RhY2tfc2l6ZSkgeworICBwdGhyZWFkX3QgaGFuZGxlOworICBwdGhyZWFkX2F0dHJfdCB0aHJlYWRfYXR0cjsKKyAgaW50IHN0YXR1czsKKworICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkID0gZ3RpZDsKKworI2lmIEtNUF9TVEFUU19FTkFCTEVECisgIC8vIHNldHMgdXAgd29ya2VyIHRocmVhZCBzdGF0cworICBfX2ttcF9hY3F1aXJlX3Rhc19sb2NrKCZfX2ttcF9zdGF0c19sb2NrLCBndGlkKTsKKworICAvLyB0aC0+dGgudGhfc3RhdHMgaXMgdXNlZCB0byB0cmFuc2ZlciB0aHJlYWQtc3BlY2lmaWMgc3RhdHMtcG9pbnRlciB0bworICAvLyBfX2ttcF9sYXVuY2hfd29ya2VyLiBTbyB3aGVuIHRocmVhZCBpcyBjcmVhdGVkIChnb2VzIGludG8KKyAgLy8gX19rbXBfbGF1bmNoX3dvcmtlcikgaXQgd2lsbCBzZXQgaXRzIF9fdGhyZWFkIGxvY2FsIHBvaW50ZXIgdG8KKyAgLy8gdGgtPnRoLnRoX3N0YXRzCisgIGlmICghS01QX1VCRVJfR1RJRChndGlkKSkgeworICAgIHRoLT50aC50aF9zdGF0cyA9IF9fa21wX3N0YXRzX2xpc3QtPnB1c2hfYmFjayhndGlkKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBGb3Igcm9vdCB0aHJlYWRzLCBfX2ttcF9zdGF0c190aHJlYWRfcHRyIGlzIHNldCBpbiBfX2ttcF9yZWdpc3Rlcl9yb290KCksCisgICAgLy8gc28gc2V0IHRoZSB0aC0+dGgudGhfc3RhdHMgZmllbGQgdG8gaXQuCisgICAgdGgtPnRoLnRoX3N0YXRzID0gX19rbXBfc3RhdHNfdGhyZWFkX3B0cjsKKyAgfQorICBfX2ttcF9yZWxlYXNlX3Rhc19sb2NrKCZfX2ttcF9zdGF0c19sb2NrLCBndGlkKTsKKworI2VuZGlmIC8vIEtNUF9TVEFUU19FTkFCTEVECisKKyAgaWYgKEtNUF9VQkVSX0dUSUQoZ3RpZCkpIHsKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9jcmVhdGVfd29ya2VyOiB1YmVyIHRocmVhZCAoJWQpXG4iLCBndGlkKSk7CisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkID0gcHRocmVhZF9zZWxmKCk7CisgICAgX19rbXBfc2V0X3N0YWNrX2luZm8oZ3RpZCwgdGgpOworICAgIF9fa21wX2NoZWNrX3N0YWNrX292ZXJsYXAodGgpOworICAgIHJldHVybjsKKyAgfTsgLy8gaWYKKworICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9jcmVhdGVfd29ya2VyOiB0cnkgdG8gY3JlYXRlIHRocmVhZCAoJWQpXG4iLCBndGlkKSk7CisKKyAgS01QX01CKCk7IC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyNpZmRlZiBLTVBfVEhSRUFEX0FUVFIKKyAgc3RhdHVzID0gcHRocmVhZF9hdHRyX2luaXQoJnRocmVhZF9hdHRyKTsKKyAgaWYgKHN0YXR1cyAhPSAwKSB7CisgICAgX19rbXBfbXNnKGttcF9tc19mYXRhbCwgS01QX01TRyhDYW50SW5pdFRocmVhZEF0dHJzKSwgS01QX0VSUihzdGF0dXMpLAorICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCk7CisgIH07IC8vIGlmCisgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmdGhyZWFkX2F0dHIsIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFKTsKKyAgaWYgKHN0YXR1cyAhPSAwKSB7CisgICAgX19rbXBfbXNnKGttcF9tc19mYXRhbCwgS01QX01TRyhDYW50U2V0V29ya2VyU3RhdGUpLCBLTVBfRVJSKHN0YXR1cyksCisgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsKTsKKyAgfTsgLy8gaWYKKworICAvKiBTZXQgc3RhY2sgc2l6ZSBmb3IgdGhpcyB0aHJlYWQgbm93LgorICAgICBUaGUgbXVsdGlwbGUgb2YgMiBpcyB0aGVyZSBiZWNhdXNlIG9uIHNvbWUgbWFjaGluZXMsIHJlcXVlc3RpbmcgYW4gdW51c3VhbAorICAgICBzdGFja3NpemUgY2F1c2VzIHRoZSB0aHJlYWQgdG8gaGF2ZSBhbiBvZmZzZXQgYmVmb3JlIHRoZSBkdW1teSBhbGxvY2EoKQorICAgICB0YWtlcyBwbGFjZSB0byBjcmVhdGUgdGhlIG9mZnNldC4gIFNpbmNlIHdlIHdhbnQgdGhlIHVzZXIgdG8gaGF2ZSBhCisgICAgIHN1ZmZpY2llbnQgc3RhY2tzaXplIEFORCBzdXBwb3J0IGEgc3RhY2sgb2Zmc2V0LCB3ZSBhbGxvY2EoKSB0d2ljZSB0aGUKKyAgICAgb2Zmc2V0IHNvIHRoYXQgdGhlIHVwY29taW5nIGFsbG9jYSgpIGRvZXMgbm90IGVsaW1pbmF0ZSBhbnkgcHJlbWFkZSBvZmZzZXQsCisgICAgIGFuZCBhbHNvIGdpdmVzIHRoZSB1c2VyIHRoZSBzdGFjayBzcGFjZSB0aGV5IHJlcXVlc3RlZCBmb3IgYWxsIHRocmVhZHMgKi8KKyAgc3RhY2tfc2l6ZSArPSBndGlkICogX19rbXBfc3Rrb2Zmc2V0ICogMjsKKworICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9jcmVhdGVfd29ya2VyOiBUIyVkLCBkZWZhdWx0IHN0YWNrc2l6ZSA9ICVsdSBieXRlcywgIgorICAgICAgICAgICAgICAgICJfX2ttcF9zdGtzaXplID0gJWx1IGJ5dGVzLCBmaW5hbCBzdGFja3NpemUgPSAlbHUgYnl0ZXNcbiIsCisgICAgICAgICAgICAgICAgZ3RpZCwgS01QX0RFRkFVTFRfU1RLU0laRSwgX19rbXBfc3Rrc2l6ZSwgc3RhY2tfc2l6ZSkpOworCisjaWZkZWYgX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRQorICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplKCZ0aHJlYWRfYXR0ciwgc3RhY2tfc2l6ZSk7CisjaWZkZWYgS01QX0JBQ0tVUF9TVEtTSVpFCisgIGlmIChzdGF0dXMgIT0gMCkgeworICAgIGlmICghX19rbXBfZW52X3N0a3NpemUpIHsKKyAgICAgIHN0YWNrX3NpemUgPSBLTVBfQkFDS1VQX1NUS1NJWkUgKyBndGlkICogX19rbXBfc3Rrb2Zmc2V0OworICAgICAgX19rbXBfc3Rrc2l6ZSA9IEtNUF9CQUNLVVBfU1RLU0laRTsKKyAgICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2NyZWF0ZV93b3JrZXI6IFQjJWQsIGRlZmF1bHQgc3RhY2tzaXplID0gJWx1IGJ5dGVzLCAiCisgICAgICAgICAgICAgICAgICAgICJfX2ttcF9zdGtzaXplID0gJWx1IGJ5dGVzLCAoYmFja3VwKSBmaW5hbCBzdGFja3NpemUgPSAlbHUgIgorICAgICAgICAgICAgICAgICAgICAiYnl0ZXNcbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIEtNUF9ERUZBVUxUX1NUS1NJWkUsIF9fa21wX3N0a3NpemUsIHN0YWNrX3NpemUpKTsKKyAgICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUoJnRocmVhZF9hdHRyLCBzdGFja19zaXplKTsKKyAgICB9OyAvLyBpZgorICB9OyAvLyBpZgorI2VuZGlmIC8qIEtNUF9CQUNLVVBfU1RLU0laRSAqLworICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICBfX2ttcF9tc2coa21wX21zX2ZhdGFsLCBLTVBfTVNHKENhbnRTZXRXb3JrZXJTdGFja1NpemUsIHN0YWNrX3NpemUpLAorICAgICAgICAgICAgICBLTVBfRVJSKHN0YXR1cyksIEtNUF9ITlQoQ2hhbmdlV29ya2VyU3RhY2tTaXplKSwgX19rbXBfbXNnX251bGwpOworICB9OyAvLyBpZgorI2VuZGlmIC8qIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUgKi8KKworI2VuZGlmIC8qIEtNUF9USFJFQURfQVRUUiAqLworCisgIHN0YXR1cyA9CisgICAgICBwdGhyZWFkX2NyZWF0ZSgmaGFuZGxlLCAmdGhyZWFkX2F0dHIsIF9fa21wX2xhdW5jaF93b3JrZXIsICh2b2lkICopdGgpOworICBpZiAoc3RhdHVzICE9IDAgfHwgIWhhbmRsZSkgeyAvLyA/Pz8gV2h5IGRvIHdlIGNoZWNrIGhhbmRsZT8/CisjaWZkZWYgX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRQorICAgIGlmIChzdGF0dXMgPT0gRUlOVkFMKSB7CisgICAgICBfX2ttcF9tc2coa21wX21zX2ZhdGFsLCBLTVBfTVNHKENhbnRTZXRXb3JrZXJTdGFja1NpemUsIHN0YWNrX3NpemUpLAorICAgICAgICAgICAgICAgIEtNUF9FUlIoc3RhdHVzKSwgS01QX0hOVChJbmNyZWFzZVdvcmtlclN0YWNrU2l6ZSksCisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwpOworICAgIH07CisgICAgaWYgKHN0YXR1cyA9PSBFTk9NRU0pIHsKKyAgICAgIF9fa21wX21zZyhrbXBfbXNfZmF0YWwsIEtNUF9NU0coQ2FudFNldFdvcmtlclN0YWNrU2l6ZSwgc3RhY2tfc2l6ZSksCisgICAgICAgICAgICAgICAgS01QX0VSUihzdGF0dXMpLCBLTVBfSE5UKERlY3JlYXNlV29ya2VyU3RhY2tTaXplKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCk7CisgICAgfTsKKyNlbmRpZiAvKiBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFICovCisgICAgaWYgKHN0YXR1cyA9PSBFQUdBSU4pIHsKKyAgICAgIF9fa21wX21zZyhrbXBfbXNfZmF0YWwsIEtNUF9NU0coTm9SZXNvdXJjZXNGb3JXb3JrZXJUaHJlYWQpLAorICAgICAgICAgICAgICAgIEtNUF9FUlIoc3RhdHVzKSwgS01QX0hOVChEZWNyZWFzZV9OVU1fVEhSRUFEUyksIF9fa21wX21zZ19udWxsKTsKKyAgICB9OyAvLyBpZgorICAgIEtNUF9TWVNGQUlMKCJwdGhyZWFkX2NyZWF0ZSIsIHN0YXR1cyk7CisgIH07IC8vIGlmCisKKyAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkID0gaGFuZGxlOworCisjaWZkZWYgS01QX1RIUkVBRF9BVFRSCisgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9kZXN0cm95KCZ0aHJlYWRfYXR0cik7CisgIGlmIChzdGF0dXMpIHsKKyAgICBrbXBfbXNnX3QgZXJyX2NvZGUgPSBLTVBfRVJSKHN0YXR1cyk7CisgICAgX19rbXBfbXNnKGttcF9tc193YXJuaW5nLCBLTVBfTVNHKENhbnREZXN0cm95VGhyZWFkQXR0cnMpLCBlcnJfY29kZSwKKyAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwpOworICAgIGlmIChfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA9PSBrbXBfd2FybmluZ3Nfb2ZmKSB7CisgICAgICBfX2ttcF9zdHJfZnJlZSgmZXJyX2NvZGUuc3RyKTsKKyAgICB9CisgIH07IC8vIGlmCisjZW5kaWYgLyogS01QX1RIUkVBRF9BVFRSICovCisKKyAgS01QX01CKCk7IC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBfY3JlYXRlX3dvcmtlcjogZG9uZSBjcmVhdGluZyB0aHJlYWQgKCVkKVxuIiwgZ3RpZCkpOworCit9IC8vIF9fa21wX2NyZWF0ZV93b3JrZXIKKworI2lmIEtNUF9VU0VfTU9OSVRPUgordm9pZCBfX2ttcF9jcmVhdGVfbW9uaXRvcihrbXBfaW5mb190ICp0aCkgeworICBwdGhyZWFkX3QgaGFuZGxlOworICBwdGhyZWFkX2F0dHJfdCB0aHJlYWRfYXR0cjsKKyAgc2l6ZV90IHNpemU7CisgIGludCBzdGF0dXM7CisgIGludCBhdXRvX2Fkal9zaXplID0gRkFMU0U7CisKKyAgaWYgKF9fa21wX2RmbHRfYmxvY2t0aW1lID09IEtNUF9NQVhfQkxPQ0tUSU1FKSB7CisgICAgLy8gV2UgZG9uJ3QgbmVlZCBtb25pdG9yIHRocmVhZCBpbiBjYXNlIG9mIE1BWF9CTE9DS1RJTUUKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9jcmVhdGVfbW9uaXRvcjogc2tpcHBpbmcgbW9uaXRvciB0aHJlYWQgYmVjYXVzZSBvZiAiCisgICAgICAgICAgICAgICAgICAiTUFYIGJsb2NrdGltZVxuIikpOworICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RpZCA9IDA7IC8vIHRoaXMgbWFrZXMgcmVhcF9tb25pdG9yIG5vLW9wCisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCA9IDA7CisgICAgcmV0dXJuOworICB9CisgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2NyZWF0ZV9tb25pdG9yOiB0cnkgdG8gY3JlYXRlIG1vbml0b3JcbiIpKTsKKworICBLTVBfTUIoKTsgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICB0aC0+dGgudGhfaW5mby5kcy5kc190aWQgPSBLTVBfR1RJRF9NT05JVE9SOworICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkID0gS01QX0dUSURfTU9OSVRPUjsKKyNpZiBLTVBfUkVBTF9USU1FX0ZJWAorICBUQ1dfNChfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSwKKyAgICAgICAgLTEpOyAvLyBXaWxsIHVzZSBpdCBmb3Igc3luY2hyb25pemF0aW9uIGEgYml0IGxhdGVyLgorI2Vsc2UKKyAgVENXXzQoX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUsIDApOworI2VuZGlmIC8vIEtNUF9SRUFMX1RJTUVfRklYCisKKyNpZmRlZiBLTVBfVEhSRUFEX0FUVFIKKyAgaWYgKF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA9PSAwKSB7CisgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplID0gS01QX0RFRkFVTFRfTU9OSVRPUl9TVEtTSVpFOworICAgIGF1dG9fYWRqX3NpemUgPSBUUlVFOworICB9CisgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9pbml0KCZ0aHJlYWRfYXR0cik7CisgIGlmIChzdGF0dXMgIT0gMCkgeworICAgIF9fa21wX21zZyhrbXBfbXNfZmF0YWwsIEtNUF9NU0coQ2FudEluaXRUaHJlYWRBdHRycyksIEtNUF9FUlIoc3RhdHVzKSwKKyAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwpOworICB9OyAvLyBpZgorICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJnRocmVhZF9hdHRyLCBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSk7CisgIGlmIChzdGF0dXMgIT0gMCkgeworICAgIF9fa21wX21zZyhrbXBfbXNfZmF0YWwsIEtNUF9NU0coQ2FudFNldE1vbml0b3JTdGF0ZSksIEtNUF9FUlIoc3RhdHVzKSwKKyAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwpOworICB9OyAvLyBpZgorCisjaWZkZWYgX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRQorICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfZ2V0c3RhY2tzaXplKCZ0aHJlYWRfYXR0ciwgJnNpemUpOworICBLTVBfQ0hFQ0tfU1lTRkFJTCgicHRocmVhZF9hdHRyX2dldHN0YWNrc2l6ZSIsIHN0YXR1cyk7CisjZWxzZQorICBzaXplID0gX19rbXBfc3lzX21pbl9zdGtzaXplOworI2VuZGlmIC8qIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUgKi8KKyNlbmRpZiAvKiBLTVBfVEhSRUFEX0FUVFIgKi8KKworICBpZiAoX19rbXBfbW9uaXRvcl9zdGtzaXplID09IDApIHsKKyAgICBfX2ttcF9tb25pdG9yX3N0a3NpemUgPSBLTVBfREVGQVVMVF9NT05JVE9SX1NUS1NJWkU7CisgIH0KKyAgaWYgKF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA8IF9fa21wX3N5c19taW5fc3Rrc2l6ZSkgeworICAgIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA9IF9fa21wX3N5c19taW5fc3Rrc2l6ZTsKKyAgfQorCisgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2NyZWF0ZV9tb25pdG9yOiBkZWZhdWx0IHN0YWNrc2l6ZSA9ICVsdSBieXRlcywiCisgICAgICAgICAgICAgICAgInJlcXVlc3RlZCBzdGFja3NpemUgPSAlbHUgYnl0ZXNcbiIsCisgICAgICAgICAgICAgICAgc2l6ZSwgX19rbXBfbW9uaXRvcl9zdGtzaXplKSk7CisKK3JldHJ5OgorCisvKiBTZXQgc3RhY2sgc2l6ZSBmb3IgdGhpcyB0aHJlYWQgbm93LiAqLworI2lmZGVmIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBfY3JlYXRlX21vbml0b3I6IHNldHRpbmcgc3RhY2tzaXplID0gJWx1IGJ5dGVzLCIsCisgICAgICAgICAgICAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplKSk7CisgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUoJnRocmVhZF9hdHRyLCBfX2ttcF9tb25pdG9yX3N0a3NpemUpOworICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICBpZiAoYXV0b19hZGpfc2l6ZSkgeworICAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplICo9IDI7CisgICAgICBnb3RvIHJldHJ5OworICAgIH0KKyAgICBrbXBfbXNnX3QgZXJyX2NvZGUgPSBLTVBfRVJSKHN0YXR1cyk7CisgICAgX19rbXBfbXNnKGttcF9tc193YXJuaW5nLCAvLyBzaG91bGQgdGhpcyBiZSBmYXRhbD8gIEJCCisgICAgICAgICAgICAgIEtNUF9NU0coQ2FudFNldE1vbml0b3JTdGFja1NpemUsIChsb25nIGludClfX2ttcF9tb25pdG9yX3N0a3NpemUpLAorICAgICAgICAgICAgICBlcnJfY29kZSwgS01QX0hOVChDaGFuZ2VNb25pdG9yU3RhY2tTaXplKSwgX19rbXBfbXNnX251bGwpOworICAgIGlmIChfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA9PSBrbXBfd2FybmluZ3Nfb2ZmKSB7CisgICAgICBfX2ttcF9zdHJfZnJlZSgmZXJyX2NvZGUuc3RyKTsKKyAgICB9CisgIH07IC8vIGlmCisjZW5kaWYgLyogX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRSAqLworCisgIHN0YXR1cyA9CisgICAgICBwdGhyZWFkX2NyZWF0ZSgmaGFuZGxlLCAmdGhyZWFkX2F0dHIsIF9fa21wX2xhdW5jaF9tb25pdG9yLCAodm9pZCAqKXRoKTsKKworICBpZiAoc3RhdHVzICE9IDApIHsKKyNpZmRlZiBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFCisgICAgaWYgKHN0YXR1cyA9PSBFSU5WQUwpIHsKKyAgICAgIGlmIChhdXRvX2Fkal9zaXplICYmIChfX2ttcF9tb25pdG9yX3N0a3NpemUgPCAoc2l6ZV90KTB4NDAwMDAwMDApKSB7CisgICAgICAgIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSAqPSAyOworICAgICAgICBnb3RvIHJldHJ5OworICAgICAgfQorICAgICAgX19rbXBfbXNnKAorICAgICAgICAgIGttcF9tc19mYXRhbCwgS01QX01TRyhDYW50U2V0TW9uaXRvclN0YWNrU2l6ZSwgX19rbXBfbW9uaXRvcl9zdGtzaXplKSwKKyAgICAgICAgICBLTVBfRVJSKHN0YXR1cyksIEtNUF9ITlQoSW5jcmVhc2VNb25pdG9yU3RhY2tTaXplKSwgX19rbXBfbXNnX251bGwpOworICAgIH07IC8vIGlmCisgICAgaWYgKHN0YXR1cyA9PSBFTk9NRU0pIHsKKyAgICAgIF9fa21wX21zZygKKyAgICAgICAgICBrbXBfbXNfZmF0YWwsIEtNUF9NU0coQ2FudFNldE1vbml0b3JTdGFja1NpemUsIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSksCisgICAgICAgICAgS01QX0VSUihzdGF0dXMpLCBLTVBfSE5UKERlY3JlYXNlTW9uaXRvclN0YWNrU2l6ZSksIF9fa21wX21zZ19udWxsKTsKKyAgICB9OyAvLyBpZgorI2VuZGlmIC8qIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUgKi8KKyAgICBpZiAoc3RhdHVzID09IEVBR0FJTikgeworICAgICAgX19rbXBfbXNnKGttcF9tc19mYXRhbCwgS01QX01TRyhOb1Jlc291cmNlc0Zvck1vbml0b3JUaHJlYWQpLAorICAgICAgICAgICAgICAgIEtNUF9FUlIoc3RhdHVzKSwgS01QX0hOVChEZWNyZWFzZU51bWJlck9mVGhyZWFkc0luVXNlKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCk7CisgICAgfTsgLy8gaWYKKyAgICBLTVBfU1lTRkFJTCgicHRocmVhZF9jcmVhdGUiLCBzdGF0dXMpOworICB9OyAvLyBpZgorCisgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCA9IGhhbmRsZTsKKworI2lmIEtNUF9SRUFMX1RJTUVfRklYCisgIC8vIFdhaXQgZm9yIHRoZSBtb25pdG9yIHRocmVhZCBpcyByZWFsbHkgc3RhcnRlZCBhbmQgc2V0IGl0cyAqcHJpb3JpdHkqLgorICBLTVBfREVCVUdfQVNTRVJUKHNpemVvZihrbXBfdWludDMyKSA9PQorICAgICAgICAgICAgICAgICAgIHNpemVvZihfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSkpOworICBfX2ttcF93YWl0X3lpZWxkXzQoKGttcF91aW50MzIgdm9sYXRpbGUgKikmX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAtMSwgJl9fa21wX25lcV80LCBOVUxMKTsKKyNlbmRpZiAvLyBLTVBfUkVBTF9USU1FX0ZJWAorCisjaWZkZWYgS01QX1RIUkVBRF9BVFRSCisgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9kZXN0cm95KCZ0aHJlYWRfYXR0cik7CisgIGlmIChzdGF0dXMgIT0gMCkgeworICAgIGttcF9tc2dfdCBlcnJfY29kZSA9IEtNUF9FUlIoc3RhdHVzKTsKKyAgICBfX2ttcF9tc2coa21wX21zX3dhcm5pbmcsIEtNUF9NU0coQ2FudERlc3Ryb3lUaHJlYWRBdHRycyksIGVycl9jb2RlLAorICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCk7CisgICAgaWYgKF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID09IGttcF93YXJuaW5nc19vZmYpIHsKKyAgICAgIF9fa21wX3N0cl9mcmVlKCZlcnJfY29kZS5zdHIpOworICAgIH0KKyAgfTsgLy8gaWYKKyNlbmRpZgorCisgIEtNUF9NQigpOyAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2NyZWF0ZV9tb25pdG9yOiBtb25pdG9yIGNyZWF0ZWQgJSMuOGx4XG4iLAorICAgICAgICAgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCkpOworCit9IC8vIF9fa21wX2NyZWF0ZV9tb25pdG9yCisjZW5kaWYgLy8gS01QX1VTRV9NT05JVE9SCisKK3ZvaWQgX19rbXBfZXhpdF90aHJlYWQoaW50IGV4aXRfc3RhdHVzKSB7CisgIHB0aHJlYWRfZXhpdCgodm9pZCAqKShpbnRwdHJfdClleGl0X3N0YXR1cyk7Cit9IC8vIF9fa21wX2V4aXRfdGhyZWFkCisKKyNpZiBLTVBfVVNFX01PTklUT1IKK3ZvaWQgX19rbXBfcmVzdW1lX21vbml0b3IoKTsKKwordm9pZCBfX2ttcF9yZWFwX21vbml0b3Ioa21wX2luZm9fdCAqdGgpIHsKKyAgaW50IHN0YXR1czsKKyAgdm9pZCAqZXhpdF92YWw7CisKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBfcmVhcF9tb25pdG9yOiB0cnkgdG8gcmVhcCBtb25pdG9yIHRocmVhZCB3aXRoIGhhbmRsZSIKKyAgICAgICAgICAgICAgICAiICUjLjhseFxuIiwKKyAgICAgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQpKTsKKworICAvLyBJZiBtb25pdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIGl0cyB0aWQgYW5kIGd0aWQgc2hvdWxkIGJlIEtNUF9HVElEX01PTklUT1IuCisgIC8vIElmIGJvdGggdGlkIGFuZCBndGlkIGFyZSAwLCBpdCBtZWFucyB0aGUgbW9uaXRvciBkaWQgbm90IGV2ZXIgc3RhcnQuCisgIC8vIElmIGJvdGggdGlkIGFuZCBndGlkIGFyZSBLTVBfR1RJRF9ETkUsIHRoZSBtb25pdG9yIGhhcyBiZWVuIHNodXQgZG93bi4KKyAgS01QX0RFQlVHX0FTU0VSVCh0aC0+dGgudGhfaW5mby5kcy5kc190aWQgPT0gdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCk7CisgIGlmICh0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkICE9IEtNUF9HVElEX01PTklUT1IpIHsKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9yZWFwX21vbml0b3I6IG1vbml0b3IgZGlkIG5vdCBzdGFydCwgcmV0dXJuaW5nXG4iKSk7CisgICAgcmV0dXJuOworICB9OyAvLyBpZgorCisgIEtNUF9NQigpOyAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgIC8qIEZpcnN0LCBjaGVjayB0byBzZWUgd2hldGhlciB0aGUgbW9uaXRvciB0aHJlYWQgZXhpc3RzIHRvIHdha2UgaXQgdXAuIFRoaXMKKyAgICAgaXMgdG8gYXZvaWQgcGVyZm9ybWFuY2UgcHJvYmxlbSB3aGVuIHRoZSBtb25pdG9yIHNsZWVwcyBkdXJpbmcKKyAgICAgYmxvY2t0aW1lLXNpemUgaW50ZXJ2YWwgKi8KKworICBzdGF0dXMgPSBwdGhyZWFkX2tpbGwodGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkLCAwKTsKKyAgaWYgKHN0YXR1cyAhPSBFU1JDSCkgeworICAgIF9fa21wX3Jlc3VtZV9tb25pdG9yKCk7IC8vIFdha2UgdXAgdGhlIG1vbml0b3IgdGhyZWFkCisgIH0KKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBfcmVhcF9tb25pdG9yOiB0cnkgdG8gam9pbiB3aXRoIG1vbml0b3JcbiIpKTsKKyAgc3RhdHVzID0gcHRocmVhZF9qb2luKHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCwgJmV4aXRfdmFsKTsKKyAgaWYgKGV4aXRfdmFsICE9IHRoKSB7CisgICAgX19rbXBfbXNnKGttcF9tc19mYXRhbCwgS01QX01TRyhSZWFwTW9uaXRvckVycm9yKSwgS01QX0VSUihzdGF0dXMpLAorICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCk7CisgIH0KKworICB0aC0+dGgudGhfaW5mby5kcy5kc190aWQgPSBLTVBfR1RJRF9ETkU7CisgIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgPSBLTVBfR1RJRF9ETkU7CisKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBfcmVhcF9tb25pdG9yOiBkb25lIHJlYXBpbmcgbW9uaXRvciB0aHJlYWQgd2l0aCBoYW5kbGUiCisgICAgICAgICAgICAgICAgIiAlIy44bHhcbiIsCisgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkKSk7CisKKyAgS01QX01CKCk7IC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCit9CisjZW5kaWYgLy8gS01QX1VTRV9NT05JVE9SCisKK3ZvaWQgX19rbXBfcmVhcF93b3JrZXIoa21wX2luZm9fdCAqdGgpIHsKKyAgaW50IHN0YXR1czsKKyAgdm9pZCAqZXhpdF92YWw7CisKKyAgS01QX01CKCk7IC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgS0FfVFJBQ0UoCisgICAgICAxMCwgKCJfX2ttcF9yZWFwX3dvcmtlcjogdHJ5IHRvIHJlYXAgVCMlZFxuIiwgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCkpOworCisgIHN0YXR1cyA9IHB0aHJlYWRfam9pbih0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQsICZleGl0X3ZhbCk7CisjaWZkZWYgS01QX0RFQlVHCisgIC8qIERvbid0IGV4cG9zZSB0aGVzZSB0byB0aGUgdXNlciB1bnRpbCB3ZSB1bmRlcnN0YW5kIHdoZW4gdGhleSB0cmlnZ2VyICovCisgIGlmIChzdGF0dXMgIT0gMCkgeworICAgIF9fa21wX21zZyhrbXBfbXNfZmF0YWwsIEtNUF9NU0coUmVhcFdvcmtlckVycm9yKSwgS01QX0VSUihzdGF0dXMpLAorICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCk7CisgIH0KKyAgaWYgKGV4aXRfdmFsICE9IHRoKSB7CisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfcmVhcF93b3JrZXI6IHdvcmtlciBUIyVkIGRpZCBub3QgcmVhcCBwcm9wZXJseSwgIgorICAgICAgICAgICAgICAgICAgImV4aXRfdmFsID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkLCBleGl0X3ZhbCkpOworICB9CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBfcmVhcF93b3JrZXI6IGRvbmUgcmVhcGluZyBUIyVkXG4iLAorICAgICAgICAgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQpKTsKKworICBLTVBfTUIoKTsgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KK30KKworI2lmIEtNUF9IQU5ETEVfU0lHTkFMUworCitzdGF0aWMgdm9pZCBfX2ttcF9udWxsX2hhbmRsZXIoaW50IHNpZ25vKSB7CisgIC8vICBEbyBub3RoaW5nLCBmb3IgZG9pbmcgU0lHX0lHTi10eXBlIGFjdGlvbnMuCit9IC8vIF9fa21wX251bGxfaGFuZGxlcgorCitzdGF0aWMgdm9pZCBfX2ttcF90ZWFtX2hhbmRsZXIoaW50IHNpZ25vKSB7CisgIGlmIChfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ID09IDApIHsKKy8qIFN0YWdlIDEgc2lnbmFsIGhhbmRsZXIsIGxldCdzIHNodXQgZG93biBhbGwgb2YgdGhlIHRocmVhZHMgKi8KKyNpZmRlZiBLTVBfREVCVUcKKyAgICBfX2ttcF9kZWJ1Z19wcmludGYoIl9fa21wX3RlYW1faGFuZGxlcjogY2F1Z2h0IHNpZ25hbCA9ICVkXG4iLCBzaWdubyk7CisjZW5kaWYKKyAgICBzd2l0Y2ggKHNpZ25vKSB7CisgICAgY2FzZSBTSUdIVVA6CisgICAgY2FzZSBTSUdJTlQ6CisgICAgY2FzZSBTSUdRVUlUOgorICAgIGNhc2UgU0lHSUxMOgorICAgIGNhc2UgU0lHQUJSVDoKKyAgICBjYXNlIFNJR0ZQRToKKyAgICBjYXNlIFNJR0JVUzoKKyAgICBjYXNlIFNJR1NFR1Y6CisjaWZkZWYgU0lHU1lTCisgICAgY2FzZSBTSUdTWVM6CisjZW5kaWYKKyAgICBjYXNlIFNJR1RFUk06CisgICAgICBpZiAoX19rbXBfZGVidWdfYnVmKSB7CisgICAgICAgIF9fa21wX2R1bXBfZGVidWdfYnVmZmVyKCk7CisgICAgICB9OyAvLyBpZgorICAgICAgS01QX01CKCk7IC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICAgIFRDV180KF9fa21wX2dsb2JhbC5nLmdfYWJvcnQsIHNpZ25vKTsKKyAgICAgIEtNUF9NQigpOyAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCisgICAgICBUQ1dfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUsIFRSVUUpOworICAgICAgS01QX01CKCk7IC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisjaWZkZWYgS01QX0RFQlVHCisgICAgICBfX2ttcF9kZWJ1Z19wcmludGYoIl9fa21wX3RlYW1faGFuZGxlcjogdW5rbm93biBzaWduYWwgdHlwZSIpOworI2VuZGlmCisgICAgICBicmVhazsKKyAgICB9OyAvLyBzd2l0Y2gKKyAgfTsgLy8gaWYKK30gLy8gX19rbXBfdGVhbV9oYW5kbGVyCisKK3N0YXRpYyB2b2lkIF9fa21wX3NpZ2FjdGlvbihpbnQgc2lnbnVtLCBjb25zdCBzdHJ1Y3Qgc2lnYWN0aW9uICphY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNpZ2FjdGlvbiAqb2xkYWN0KSB7CisgIGludCByYyA9IHNpZ2FjdGlvbihzaWdudW0sIGFjdCwgb2xkYWN0KTsKKyAgS01QX0NIRUNLX1NZU0ZBSUxfRVJSTk8oInNpZ2FjdGlvbiIsIHJjKTsKK30KKworc3RhdGljIHZvaWQgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlcihpbnQgc2lnLCBzaWdfZnVuY190IGhhbmRsZXJfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhcmFsbGVsX2luaXQpIHsKKyAgS01QX01CKCk7IC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgS0JfVFJBQ0UoNjAsCisgICAgICAgICAgICgiX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggJWQsIC4uLiwgJWQgKVxuIiwgc2lnLCBwYXJhbGxlbF9pbml0KSk7CisgIGlmIChwYXJhbGxlbF9pbml0KSB7CisgICAgc3RydWN0IHNpZ2FjdGlvbiBuZXdfYWN0aW9uOworICAgIHN0cnVjdCBzaWdhY3Rpb24gb2xkX2FjdGlvbjsKKyAgICBuZXdfYWN0aW9uLnNhX2hhbmRsZXIgPSBoYW5kbGVyX2Z1bmM7CisgICAgbmV3X2FjdGlvbi5zYV9mbGFncyA9IDA7CisgICAgc2lnZmlsbHNldCgmbmV3X2FjdGlvbi5zYV9tYXNrKTsKKyAgICBfX2ttcF9zaWdhY3Rpb24oc2lnLCAmbmV3X2FjdGlvbiwgJm9sZF9hY3Rpb24pOworICAgIGlmIChvbGRfYWN0aW9uLnNhX2hhbmRsZXIgPT0gX19rbXBfc2lnaGxkcnNbc2lnXS5zYV9oYW5kbGVyKSB7CisgICAgICBzaWdhZGRzZXQoJl9fa21wX3NpZ3NldCwgc2lnKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gUmVzdG9yZS9rZWVwIHVzZXIncyBoYW5kbGVyIGlmIG9uZSBwcmV2aW91c2x5IGluc3RhbGxlZC4KKyAgICAgIF9fa21wX3NpZ2FjdGlvbihzaWcsICZvbGRfYWN0aW9uLCBOVUxMKTsKKyAgICB9OyAvLyBpZgorICB9IGVsc2UgeworICAgIC8vIFNhdmUgaW5pdGlhbC9zeXN0ZW0gc2lnbmFsIGhhbmRsZXJzIHRvIHNlZSBpZiB1c2VyIGhhbmRsZXJzIGluc3RhbGxlZC4KKyAgICBfX2ttcF9zaWdhY3Rpb24oc2lnLCBOVUxMLCAmX19rbXBfc2lnaGxkcnNbc2lnXSk7CisgIH07IC8vIGlmCisgIEtNUF9NQigpOyAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCit9IC8vIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIKKworc3RhdGljIHZvaWQgX19rbXBfcmVtb3ZlX29uZV9oYW5kbGVyKGludCBzaWcpIHsKKyAgS0JfVFJBQ0UoNjAsICgiX19rbXBfcmVtb3ZlX29uZV9oYW5kbGVyKCAlZCApXG4iLCBzaWcpKTsKKyAgaWYgKHNpZ2lzbWVtYmVyKCZfX2ttcF9zaWdzZXQsIHNpZykpIHsKKyAgICBzdHJ1Y3Qgc2lnYWN0aW9uIG9sZDsKKyAgICBLTVBfTUIoKTsgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgIF9fa21wX3NpZ2FjdGlvbihzaWcsICZfX2ttcF9zaWdobGRyc1tzaWddLCAmb2xkKTsKKyAgICBpZiAoKG9sZC5zYV9oYW5kbGVyICE9IF9fa21wX3RlYW1faGFuZGxlcikgJiYKKyAgICAgICAgKG9sZC5zYV9oYW5kbGVyICE9IF9fa21wX251bGxfaGFuZGxlcikpIHsKKyAgICAgIC8vIFJlc3RvcmUgdGhlIHVzZXJzIHNpZ25hbCBoYW5kbGVyLgorICAgICAgS0JfVFJBQ0UoMTAsICgiX19rbXBfcmVtb3ZlX29uZV9oYW5kbGVyOiBvb3BzLCBub3Qgb3VyIGhhbmRsZXIsICIKKyAgICAgICAgICAgICAgICAgICAgInJlc3RvcmluZzogc2lnPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICBzaWcpKTsKKyAgICAgIF9fa21wX3NpZ2FjdGlvbihzaWcsICZvbGQsIE5VTEwpOworICAgIH07IC8vIGlmCisgICAgc2lnZGVsc2V0KCZfX2ttcF9zaWdzZXQsIHNpZyk7CisgICAgS01QX01CKCk7IC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgfTsgLy8gaWYKK30gLy8gX19rbXBfcmVtb3ZlX29uZV9oYW5kbGVyCisKK3ZvaWQgX19rbXBfaW5zdGFsbF9zaWduYWxzKGludCBwYXJhbGxlbF9pbml0KSB7CisgIEtCX1RSQUNFKDEwLCAoIl9fa21wX2luc3RhbGxfc2lnbmFscyggJWQgKVxuIiwgcGFyYWxsZWxfaW5pdCkpOworICBpZiAoX19rbXBfaGFuZGxlX3NpZ25hbHMgfHwgIXBhcmFsbGVsX2luaXQpIHsKKyAgICAvLyBJZiAhIHBhcmFsbGVsX2luaXQsIHdlIGRvIG5vdCBpbnN0YWxsIGhhbmRsZXJzLCBqdXN0IHNhdmUgb3JpZ2luYWwKKyAgICAvLyBoYW5kbGVycy4gTGV0IHVzIGRvIGl0IGV2ZW4gX19oYW5kbGVfc2lnbmFscyBpcyAwLgorICAgIHNpZ2VtcHR5c2V0KCZfX2ttcF9zaWdzZXQpOworICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoU0lHSFVQLCBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQpOworICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoU0lHSU5ULCBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQpOworICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoU0lHUVVJVCwgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0KTsKKyAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKFNJR0lMTCwgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0KTsKKyAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKFNJR0FCUlQsIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCk7CisgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlcihTSUdGUEUsIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCk7CisgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlcihTSUdCVVMsIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCk7CisgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlcihTSUdTRUdWLCBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQpOworI2lmZGVmIFNJR1NZUworICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoU0lHU1lTLCBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQpOworI2VuZGlmIC8vIFNJR1NZUworICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoU0lHVEVSTSwgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0KTsKKyNpZmRlZiBTSUdQSVBFCisgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlcihTSUdQSVBFLCBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQpOworI2VuZGlmIC8vIFNJR1BJUEUKKyAgfTsgLy8gaWYKK30gLy8gX19rbXBfaW5zdGFsbF9zaWduYWxzCisKK3ZvaWQgX19rbXBfcmVtb3ZlX3NpZ25hbHModm9pZCkgeworICBpbnQgc2lnOworICBLQl9UUkFDRSgxMCwgKCJfX2ttcF9yZW1vdmVfc2lnbmFscygpXG4iKSk7CisgIGZvciAoc2lnID0gMTsgc2lnIDwgTlNJRzsgKytzaWcpIHsKKyAgICBfX2ttcF9yZW1vdmVfb25lX2hhbmRsZXIoc2lnKTsKKyAgfTsgLy8gZm9yIHNpZworfSAvLyBfX2ttcF9yZW1vdmVfc2lnbmFscworCisjZW5kaWYgLy8gS01QX0hBTkRMRV9TSUdOQUxTCisKK3ZvaWQgX19rbXBfZW5hYmxlKGludCBuZXdfc3RhdGUpIHsKKyNpZmRlZiBLTVBfQ0FOQ0VMX1RIUkVBRFMKKyAgaW50IHN0YXR1cywgb2xkX3N0YXRlOworICBzdGF0dXMgPSBwdGhyZWFkX3NldGNhbmNlbHN0YXRlKG5ld19zdGF0ZSwgJm9sZF9zdGF0ZSk7CisgIEtNUF9DSEVDS19TWVNGQUlMKCJwdGhyZWFkX3NldGNhbmNlbHN0YXRlIiwgc3RhdHVzKTsKKyAgS01QX0RFQlVHX0FTU0VSVChvbGRfc3RhdGUgPT0gUFRIUkVBRF9DQU5DRUxfRElTQUJMRSk7CisjZW5kaWYKK30KKwordm9pZCBfX2ttcF9kaXNhYmxlKGludCAqb2xkX3N0YXRlKSB7CisjaWZkZWYgS01QX0NBTkNFTF9USFJFQURTCisgIGludCBzdGF0dXM7CisgIHN0YXR1cyA9IHB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUoUFRIUkVBRF9DQU5DRUxfRElTQUJMRSwgb2xkX3N0YXRlKTsKKyAgS01QX0NIRUNLX1NZU0ZBSUwoInB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUiLCBzdGF0dXMpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIF9fa21wX2F0Zm9ya19wcmVwYXJlKHZvaWQpIHsgLyogIG5vdGhpbmcgdG8gZG8gICovCit9CisKK3N0YXRpYyB2b2lkIF9fa21wX2F0Zm9ya19wYXJlbnQodm9pZCkgeyAvKiAgbm90aGluZyB0byBkbyAgKi8KK30KKworLyogUmVzZXQgdGhlIGxpYnJhcnkgc28gZXhlY3V0aW9uIGluIHRoZSBjaGlsZCBzdGFydHMgImFsbCBvdmVyIGFnYWluIiB3aXRoCisgICBjbGVhbiBkYXRhIHN0cnVjdHVyZXMgaW4gaW5pdGlhbCBzdGF0ZXMuICBEb24ndCB3b3JyeSBhYm91dCBmcmVlaW5nIG1lbW9yeQorICAgYWxsb2NhdGVkIGJ5IHBhcmVudCwganVzdCBhYmFuZG9uIGl0IHRvIGJlIHNhZmUuICovCitzdGF0aWMgdm9pZCBfX2ttcF9hdGZvcmtfY2hpbGQodm9pZCkgeworICAvKiBUT0RPIG1ha2Ugc3VyZSB0aGlzIGlzIGRvbmUgcmlnaHQgZm9yIG5lc3RlZC9zaWJsaW5nICovCisgIC8vIEFUVDogIE1lbW9yeSBsZWFrcyBhcmUgaGVyZT8gVE9ETzogQ2hlY2sgaXQgYW5kIGZpeC4KKyAgLyogS01QX0FTU0VSVCggMCApOyAqLworCisgICsrX19rbXBfZm9ya19jb3VudDsKKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyNpZiBLTVBfT1NfTElOVVgKKyAgLy8gcmVzZXQgdGhlIGFmZmluaXR5IGluIHRoZSBjaGlsZCB0byB0aGUgaW5pdGlhbCB0aHJlYWQKKyAgLy8gYWZmaW5pdHkgaW4gdGhlIHBhcmVudAorICBrbXBfc2V0X3RocmVhZF9hZmZpbml0eV9tYXNrX2luaXRpYWwoKTsKKyNlbmRpZgorICAvLyBTZXQgZGVmYXVsdCBub3QgdG8gYmluZCB0aHJlYWRzIHRpZ2h0bHkgaW4gdGhlIGNoaWxkICh3ZeKAmXJlIGV4cGVjdGluZworICAvLyBvdmVyLXN1YnNjcmlwdGlvbiBhZnRlciB0aGUgZm9yayBhbmQgdGhpcyBjYW4gaW1wcm92ZSB0aGluZ3MgZm9yCisgIC8vIHNjcmlwdGluZyBsYW5ndWFnZXMgdGhhdCB1c2UgT3Blbk1QIGluc2lkZSBwcm9jZXNzLXBhcmFsbGVsIGNvZGUpLgorICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfbm9uZTsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICBpZiAoX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzICE9IE5VTEwpIHsKKyAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfZmFsc2U7CisgIH0KKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorI2VuZGlmIC8vIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKworICBfX2ttcF9pbml0X3J1bnRpbWUgPSBGQUxTRTsKKyNpZiBLTVBfVVNFX01PTklUT1IKKyAgX19rbXBfaW5pdF9tb25pdG9yID0gMDsKKyNlbmRpZgorICBfX2ttcF9pbml0X3BhcmFsbGVsID0gRkFMU0U7CisgIF9fa21wX2luaXRfbWlkZGxlID0gRkFMU0U7CisgIF9fa21wX2luaXRfc2VyaWFsID0gRkFMU0U7CisgIFRDV180KF9fa21wX2luaXRfZ3RpZCwgRkFMU0UpOworICBfX2ttcF9pbml0X2NvbW1vbiA9IEZBTFNFOworCisgIFRDV180KF9fa21wX2luaXRfdXNlcl9sb2NrcywgRkFMU0UpOworI2lmICFLTVBfVVNFX0RZTkFNSUNfTE9DSworICBfX2ttcF91c2VyX2xvY2tfdGFibGUudXNlZCA9IDE7CisgIF9fa21wX3VzZXJfbG9ja190YWJsZS5hbGxvY2F0ZWQgPSAwOworICBfX2ttcF91c2VyX2xvY2tfdGFibGUudGFibGUgPSBOVUxMOworICBfX2ttcF9sb2NrX2Jsb2NrcyA9IE5VTEw7CisjZW5kaWYKKworICBfX2ttcF9hbGxfbnRoID0gMDsKKyAgVENXXzQoX19rbXBfbnRoLCAwKTsKKworICAvKiBNdXN0IGFjdHVhbGx5IHplcm8gYWxsIHRoZSAqY2FjaGUgYXJndW1lbnRzIHBhc3NlZCB0byBfX2ttcGNfdGhyZWFkcHJpdmF0ZQorICAgICBoZXJlIHNvIHRocmVhZHByaXZhdGUgZG9lc24ndCB1c2Ugc3RhbGUgZGF0YSAqLworICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9hdGZvcmtfY2hpbGQ6IGNoZWNraW5nIGNhY2hlIGFkZHJlc3MgbGlzdCAlcFxuIiwKKyAgICAgICAgICAgICAgICBfX2ttcF90aHJlYWRwcml2X2NhY2hlX2xpc3QpKTsKKworICB3aGlsZSAoX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0ICE9IE5VTEwpIHsKKworICAgIGlmICgqX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0LT5hZGRyICE9IE5VTEwpIHsKKyAgICAgIEtDX1RSQUNFKDUwLCAoIl9fa21wX2F0Zm9ya19jaGlsZDogemVyb2luZyBjYWNoZSBhdCBhZGRyZXNzICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAmKCpfX2ttcF90aHJlYWRwcml2X2NhY2hlX2xpc3QtPmFkZHIpKSk7CisKKyAgICAgICpfX2ttcF90aHJlYWRwcml2X2NhY2hlX2xpc3QtPmFkZHIgPSBOVUxMOworICAgIH0KKyAgICBfX2ttcF90aHJlYWRwcml2X2NhY2hlX2xpc3QgPSBfX2ttcF90aHJlYWRwcml2X2NhY2hlX2xpc3QtPm5leHQ7CisgIH0KKworICBfX2ttcF9pbml0X3J1bnRpbWUgPSBGQUxTRTsKKworICAvKiByZXNldCBzdGF0aWNhbGx5IGluaXRpYWxpemVkIGxvY2tzICovCisgIF9fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soJl9fa21wX2luaXR6X2xvY2spOworICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF9zdGRpb19sb2NrKTsKKyAgX19rbXBfaW5pdF9ib290c3RyYXBfbG9jaygmX19rbXBfY29uc29sZV9sb2NrKTsKKworICAvKiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgbm8gc3RhbGUgZGF0YSBpcyBsZWZ0IGFyb3VuZCAqLworICAvKiBBQzogY3VzdG9tZXJzIGNvbXBsYWluIHRoYXQgd2UgdXNlIHVuc2FmZSByb3V0aW5lcyBpbiB0aGUgYXRmb3JrCisgICAgIGhhbmRsZXIuIE1hdGh3b3JrczogZGxzeW0oKSBpcyB1bnNhZmUuIFdlIGNhbGwgZGxzeW0gYW5kIGRsb3BlbgorICAgICBpbiBkeW5hbWljX2xpbmsgd2hlbiBjaGVjayB0aGUgcHJlc2VuY2Ugb2Ygc2hhcmVkIHRiYm1hbGxvYyBsaWJyYXJ5LgorICAgICBTdWdnZXN0aW9uIGlzIHRvIG1ha2UgdGhlIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gbGF6aWVyLCBzaW1pbGFyCisgICAgIHRvIHdoYXQgZG9uZSBmb3IgX19rbXBjX2JlZ2luKCkuICovCisgIC8vIFRPRE86IHN5bmNocm9uaXplIGFsbCBzdGF0aWMgaW5pdGlhbGl6YXRpb25zIHdpdGggcmVndWxhciBsaWJyYXJ5CisgIC8vICAgICAgIHN0YXJ0dXA7IGxvb2sgYXQga21wX2dsb2JhbC5jcHAgYW5kIGV0Yy4KKyAgLy9fX2ttcF9pbnRlcm5hbF9iZWdpbiAoKTsKK30KKwordm9pZCBfX2ttcF9yZWdpc3Rlcl9hdGZvcmsodm9pZCkgeworICBpZiAoX19rbXBfbmVlZF9yZWdpc3Rlcl9hdGZvcmspIHsKKyAgICBpbnQgc3RhdHVzID0gcHRocmVhZF9hdGZvcmsoX19rbXBfYXRmb3JrX3ByZXBhcmUsIF9fa21wX2F0Zm9ya19wYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2F0Zm9ya19jaGlsZCk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoInB0aHJlYWRfYXRmb3JrIiwgc3RhdHVzKTsKKyAgICBfX2ttcF9uZWVkX3JlZ2lzdGVyX2F0Zm9yayA9IEZBTFNFOworICB9Cit9CisKK3ZvaWQgX19rbXBfc3VzcGVuZF9pbml0aWFsaXplKHZvaWQpIHsKKyAgaW50IHN0YXR1czsKKyAgc3RhdHVzID0gcHRocmVhZF9tdXRleGF0dHJfaW5pdCgmX19rbXBfc3VzcGVuZF9tdXRleF9hdHRyKTsKKyAgS01QX0NIRUNLX1NZU0ZBSUwoInB0aHJlYWRfbXV0ZXhhdHRyX2luaXQiLCBzdGF0dXMpOworICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRhdHRyX2luaXQoJl9fa21wX3N1c3BlbmRfY29uZF9hdHRyKTsKKyAgS01QX0NIRUNLX1NZU0ZBSUwoInB0aHJlYWRfY29uZGF0dHJfaW5pdCIsIHN0YXR1cyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZV90aHJlYWQoa21wX2luZm9fdCAqdGgpIHsKKyAgQU5OT1RBVEVfSEFQUEVOU19BRlRFUigmdGgtPnRoLnRoX3N1c3BlbmRfaW5pdF9jb3VudCk7CisgIGlmICh0aC0+dGgudGhfc3VzcGVuZF9pbml0X2NvdW50IDw9IF9fa21wX2ZvcmtfY291bnQpIHsKKyAgICAvKiB0aGlzIG1lYW5zIHdlIGhhdmVuJ3QgaW5pdGlhbGl6ZWQgdGhlIHN1c3BlbnNpb24gcHRocmVhZCBvYmplY3RzIGZvciB0aGlzCisgICAgICAgdGhyZWFkIGluIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIHByb2Nlc3MgKi8KKyAgICBpbnQgc3RhdHVzOworICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF9pbml0KCZ0aC0+dGgudGhfc3VzcGVuZF9jdi5jX2NvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9fa21wX3N1c3BlbmRfY29uZF9hdHRyKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCgicHRocmVhZF9jb25kX2luaXQiLCBzdGF0dXMpOworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfaW5pdCgmdGgtPnRoLnRoX3N1c3BlbmRfbXgubV9tdXRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9fa21wX3N1c3BlbmRfbXV0ZXhfYXR0cik7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoInB0aHJlYWRfbXV0ZXhfaW5pdCIsIHN0YXR1cyk7CisgICAgKih2b2xhdGlsZSBpbnQgKikmdGgtPnRoLnRoX3N1c3BlbmRfaW5pdF9jb3VudCA9IF9fa21wX2ZvcmtfY291bnQgKyAxOworICAgIEFOTk9UQVRFX0hBUFBFTlNfQkVGT1JFKCZ0aC0+dGgudGhfc3VzcGVuZF9pbml0X2NvdW50KTsKKyAgfTsKK30KKwordm9pZCBfX2ttcF9zdXNwZW5kX3VuaW5pdGlhbGl6ZV90aHJlYWQoa21wX2luZm9fdCAqdGgpIHsKKyAgaWYgKHRoLT50aC50aF9zdXNwZW5kX2luaXRfY291bnQgPiBfX2ttcF9mb3JrX2NvdW50KSB7CisgICAgLyogdGhpcyBtZWFucyB3ZSBoYXZlIGluaXRpYWxpemUgdGhlIHN1c3BlbnNpb24gcHRocmVhZCBvYmplY3RzIGZvciB0aGlzCisgICAgICAgdGhyZWFkIGluIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIHByb2Nlc3MgKi8KKyAgICBpbnQgc3RhdHVzOworCisgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX2Rlc3Ryb3koJnRoLT50aC50aF9zdXNwZW5kX2N2LmNfY29uZCk7CisgICAgaWYgKHN0YXR1cyAhPSAwICYmIHN0YXR1cyAhPSBFQlVTWSkgeworICAgICAgS01QX1NZU0ZBSUwoInB0aHJlYWRfY29uZF9kZXN0cm95Iiwgc3RhdHVzKTsKKyAgICB9OworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmdGgtPnRoLnRoX3N1c3BlbmRfbXgubV9tdXRleCk7CisgICAgaWYgKHN0YXR1cyAhPSAwICYmIHN0YXR1cyAhPSBFQlVTWSkgeworICAgICAgS01QX1NZU0ZBSUwoInB0aHJlYWRfbXV0ZXhfZGVzdHJveSIsIHN0YXR1cyk7CisgICAgfTsKKyAgICAtLXRoLT50aC50aF9zdXNwZW5kX2luaXRfY291bnQ7CisgICAgS01QX0RFQlVHX0FTU0VSVCh0aC0+dGgudGhfc3VzcGVuZF9pbml0X2NvdW50ID09IF9fa21wX2ZvcmtfY291bnQpOworICB9Cit9CisKKworLyogVGhpcyByb3V0aW5lIHB1dHMgdGhlIGNhbGxpbmcgdGhyZWFkIHRvIHNsZWVwIGFmdGVyIHNldHRpbmcgdGhlCisgICBzbGVlcCBiaXQgZm9yIHRoZSBpbmRpY2F0ZWQgZmxhZyB2YXJpYWJsZSB0byB0cnVlLiAqLwordGVtcGxhdGUgPGNsYXNzIEM+CitzdGF0aWMgaW5saW5lIHZvaWQgX19rbXBfc3VzcGVuZF90ZW1wbGF0ZShpbnQgdGhfZ3RpZCwgQyAqZmxhZykgeworICBLTVBfVElNRV9ERVZFTE9QRVJfUEFSVElUSU9ORURfQkxPQ0soVVNFUl9zdXNwZW5kKTsKKyAga21wX2luZm9fdCAqdGggPSBfX2ttcF90aHJlYWRzW3RoX2d0aWRdOworICBpbnQgc3RhdHVzOworICB0eXBlbmFtZSBDOjpmbGFnX3Qgb2xkX3NwaW47CisKKyAgS0ZfVFJBQ0UoMzAsICgiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogVCMlZCBlbnRlciBmb3IgZmxhZyA9ICVwXG4iLCB0aF9ndGlkLAorICAgICAgICAgICAgICAgIGZsYWctPmdldCgpKSk7CisKKyAgX19rbXBfc3VzcGVuZF9pbml0aWFsaXplX3RocmVhZCh0aCk7CisKKyAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCZ0aC0+dGgudGhfc3VzcGVuZF9teC5tX211dGV4KTsKKyAgS01QX0NIRUNLX1NZU0ZBSUwoInB0aHJlYWRfbXV0ZXhfbG9jayIsIHN0YXR1cyk7CisKKyAgS0ZfVFJBQ0UoMTAsICgiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogVCMlZCBzZXR0aW5nIHNsZWVwIGJpdCBmb3Igc3BpbiglcClcbiIsCisgICAgICAgICAgICAgICAgdGhfZ3RpZCwgZmxhZy0+Z2V0KCkpKTsKKworICAvKiBUT0RPOiBzaG91bGRuJ3QgdGhpcyB1c2UgcmVsZWFzZSBzZW1hbnRpY3MgdG8gZW5zdXJlIHRoYXQKKyAgICAgX19rbXBfc3VzcGVuZF9pbml0aWFsaXplX3RocmVhZCBnZXRzIGNhbGxlZCBmaXJzdD8gKi8KKyAgb2xkX3NwaW4gPSBmbGFnLT5zZXRfc2xlZXBpbmcoKTsKKworICBLRl9UUkFDRSg1LCAoIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgc2V0IHNsZWVwIGJpdCBmb3Igc3BpbiglcCk9PSV4LCIKKyAgICAgICAgICAgICAgICIgd2FzICV4XG4iLAorICAgICAgICAgICAgICAgdGhfZ3RpZCwgZmxhZy0+Z2V0KCksICooZmxhZy0+Z2V0KCkpLCBvbGRfc3BpbikpOworCisgIGlmIChmbGFnLT5kb25lX2NoZWNrX3ZhbChvbGRfc3BpbikpIHsKKyAgICBvbGRfc3BpbiA9IGZsYWctPnVuc2V0X3NsZWVwaW5nKCk7CisgICAgS0ZfVFJBQ0UoNSwgKCJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIGZhbHNlIGFsYXJtLCByZXNldCBzbGVlcCBiaXQgIgorICAgICAgICAgICAgICAgICAiZm9yIHNwaW4oJXApXG4iLAorICAgICAgICAgICAgICAgICB0aF9ndGlkLCBmbGFnLT5nZXQoKSkpOworICB9IGVsc2UgeworICAgIC8qIEVuY2Fwc3VsYXRlIGluIGEgbG9vcCBhcyB0aGUgZG9jdW1lbnRhdGlvbiBzdGF0ZXMgdGhhdCB0aGlzIG1heQorICAgICAgICJ3aXRoIGxvdyBwcm9iYWJpbGl0eSIgcmV0dXJuIHdoZW4gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSBoYXMKKyAgICAgICBub3QgYmVlbiBzaWduYWxlZCBvciBicm9hZGNhc3QgKi8KKyAgICBpbnQgZGVhY3RpdmF0ZWQgPSBGQUxTRTsKKyAgICBUQ1dfUFRSKHRoLT50aC50aF9zbGVlcF9sb2MsICh2b2lkICopZmxhZyk7CisKKyAgICB3aGlsZSAoZmxhZy0+aXNfc2xlZXBpbmcoKSkgeworI2lmZGVmIERFQlVHX1NVU1BFTkQKKyAgICAgIGNoYXIgYnVmZmVyWzEyOF07CisgICAgICBfX2ttcF9zdXNwZW5kX2NvdW50Kys7CisgICAgICBfX2ttcF9wcmludF9jb25kKGJ1ZmZlciwgJnRoLT50aC50aF9zdXNwZW5kX2N2KTsKKyAgICAgIF9fa21wX3ByaW50ZigiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogc3VzcGVuZGluZyBUIyVkOiAlc1xuIiwgdGhfZ3RpZCwKKyAgICAgICAgICAgICAgICAgICBidWZmZXIpOworI2VuZGlmCisgICAgICAvLyBNYXJrIHRoZSB0aHJlYWQgYXMgbm8gbG9uZ2VyIGFjdGl2ZSAob25seSBpbiB0aGUgZmlyc3QgaXRlcmF0aW9uIG9mIHRoZQorICAgICAgLy8gbG9vcCkuCisgICAgICBpZiAoIWRlYWN0aXZhdGVkKSB7CisgICAgICAgIHRoLT50aC50aF9hY3RpdmUgPSBGQUxTRTsKKyAgICAgICAgaWYgKHRoLT50aC50aF9hY3RpdmVfaW5fcG9vbCkgeworICAgICAgICAgIHRoLT50aC50aF9hY3RpdmVfaW5fcG9vbCA9IEZBTFNFOworICAgICAgICAgIEtNUF9URVNUX1RIRU5fREVDMzIoJl9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGgpOworICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoVENSXzQoX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCkgPj0gMCk7CisgICAgICAgIH0KKyAgICAgICAgZGVhY3RpdmF0ZWQgPSBUUlVFOworICAgICAgfQorCisjaWYgVVNFX1NVU1BFTkRfVElNRU9VVAorICAgICAgc3RydWN0IHRpbWVzcGVjIG5vdzsKKyAgICAgIHN0cnVjdCB0aW1ldmFsIHR2YWw7CisgICAgICBpbnQgbXNlY3M7CisKKyAgICAgIHN0YXR1cyA9IGdldHRpbWVvZmRheSgmdHZhbCwgTlVMTCk7CisgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTygiZ2V0dGltZW9mZGF5Iiwgc3RhdHVzKTsKKyAgICAgIFRJTUVWQUxfVE9fVElNRVNQRUMoJnR2YWwsICZub3cpOworCisgICAgICBtc2VjcyA9ICg0ICogX19rbXBfZGZsdF9ibG9ja3RpbWUpICsgMjAwOworICAgICAgbm93LnR2X3NlYyArPSBtc2VjcyAvIDEwMDA7CisgICAgICBub3cudHZfbnNlYyArPSAobXNlY3MgJSAxMDAwKSAqIDEwMDA7CisKKyAgICAgIEtGX1RSQUNFKDE1LCAoIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgYWJvdXQgdG8gcGVyZm9ybSAiCisgICAgICAgICAgICAgICAgICAgICJwdGhyZWFkX2NvbmRfdGltZWR3YWl0XG4iLAorICAgICAgICAgICAgICAgICAgICB0aF9ndGlkKSk7CisgICAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCZ0aC0+dGgudGhfc3VzcGVuZF9jdi5jX2NvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aC0+dGgudGhfc3VzcGVuZF9teC5tX211dGV4LCAmbm93KTsKKyNlbHNlCisgICAgICBLRl9UUkFDRSgxNSwgKCJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIGFib3V0IHRvIHBlcmZvcm0iCisgICAgICAgICAgICAgICAgICAgICIgcHRocmVhZF9jb25kX3dhaXRcbiIsCisgICAgICAgICAgICAgICAgICAgIHRoX2d0aWQpKTsKKyAgICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF93YWl0KCZ0aC0+dGgudGhfc3VzcGVuZF9jdi5jX2NvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGgtPnRoLnRoX3N1c3BlbmRfbXgubV9tdXRleCk7CisjZW5kaWYKKworICAgICAgaWYgKChzdGF0dXMgIT0gMCkgJiYgKHN0YXR1cyAhPSBFSU5UUikgJiYgKHN0YXR1cyAhPSBFVElNRURPVVQpKSB7CisgICAgICAgIEtNUF9TWVNGQUlMKCJwdGhyZWFkX2NvbmRfd2FpdCIsIHN0YXR1cyk7CisgICAgICB9CisjaWZkZWYgS01QX0RFQlVHCisgICAgICBpZiAoc3RhdHVzID09IEVUSU1FRE9VVCkgeworICAgICAgICBpZiAoZmxhZy0+aXNfc2xlZXBpbmcoKSkgeworICAgICAgICAgIEtGX1RSQUNFKDEwMCwKKyAgICAgICAgICAgICAgICAgICAoIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgdGltZW91dCB3YWtldXBcbiIsIHRoX2d0aWQpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBLRl9UUkFDRSgyLCAoIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgdGltZW91dCB3YWtldXAsIHNsZWVwIGJpdCAiCisgICAgICAgICAgICAgICAgICAgICAgICJub3Qgc2V0IVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdGhfZ3RpZCkpOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKGZsYWctPmlzX3NsZWVwaW5nKCkpIHsKKyAgICAgICAgS0ZfVFJBQ0UoMTAwLAorICAgICAgICAgICAgICAgICAoIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgc3B1cmlvdXMgd2FrZXVwXG4iLCB0aF9ndGlkKSk7CisgICAgICB9CisjZW5kaWYKKyAgICB9IC8vIHdoaWxlCisKKyAgICAvLyBNYXJrIHRoZSB0aHJlYWQgYXMgYWN0aXZlIGFnYWluIChpZiBpdCB3YXMgcHJldmlvdXMgbWFya2VkIGFzIGluYWN0aXZlKQorICAgIGlmIChkZWFjdGl2YXRlZCkgeworICAgICAgdGgtPnRoLnRoX2FjdGl2ZSA9IFRSVUU7CisgICAgICBpZiAoVENSXzQodGgtPnRoLnRoX2luX3Bvb2wpKSB7CisgICAgICAgIEtNUF9URVNUX1RIRU5fSU5DMzIoJl9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGgpOworICAgICAgICB0aC0+dGgudGhfYWN0aXZlX2luX3Bvb2wgPSBUUlVFOworICAgICAgfQorICAgIH0KKyAgfQorI2lmZGVmIERFQlVHX1NVU1BFTkQKKyAgeworICAgIGNoYXIgYnVmZmVyWzEyOF07CisgICAgX19rbXBfcHJpbnRfY29uZChidWZmZXIsICZ0aC0+dGgudGhfc3VzcGVuZF9jdik7CisgICAgX19rbXBfcHJpbnRmKCJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIGhhcyBhd2FrZW5lZDogJXNcbiIsIHRoX2d0aWQsCisgICAgICAgICAgICAgICAgIGJ1ZmZlcik7CisgIH0KKyNlbmRpZgorCisgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0aC0+dGgudGhfc3VzcGVuZF9teC5tX211dGV4KTsKKyAgS01QX0NIRUNLX1NZU0ZBSUwoInB0aHJlYWRfbXV0ZXhfdW5sb2NrIiwgc3RhdHVzKTsKKyAgS0ZfVFJBQ0UoMzAsICgiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogVCMlZCBleGl0XG4iLCB0aF9ndGlkKSk7Cit9CisKK3ZvaWQgX19rbXBfc3VzcGVuZF8zMihpbnQgdGhfZ3RpZCwga21wX2ZsYWdfMzIgKmZsYWcpIHsKKyAgX19rbXBfc3VzcGVuZF90ZW1wbGF0ZSh0aF9ndGlkLCBmbGFnKTsKK30KK3ZvaWQgX19rbXBfc3VzcGVuZF82NChpbnQgdGhfZ3RpZCwga21wX2ZsYWdfNjQgKmZsYWcpIHsKKyAgX19rbXBfc3VzcGVuZF90ZW1wbGF0ZSh0aF9ndGlkLCBmbGFnKTsKK30KK3ZvaWQgX19rbXBfc3VzcGVuZF9vbmNvcmUoaW50IHRoX2d0aWQsIGttcF9mbGFnX29uY29yZSAqZmxhZykgeworICBfX2ttcF9zdXNwZW5kX3RlbXBsYXRlKHRoX2d0aWQsIGZsYWcpOworfQorCisvKiBUaGlzIHJvdXRpbmUgc2lnbmFscyB0aGUgdGhyZWFkIHNwZWNpZmllZCBieSB0YXJnZXRfZ3RpZCB0byB3YWtlIHVwCisgICBhZnRlciBzZXR0aW5nIHRoZSBzbGVlcCBiaXQgaW5kaWNhdGVkIGJ5IHRoZSBmbGFnIGFyZ3VtZW50IHRvIEZBTFNFLgorICAgVGhlIHRhcmdldCB0aHJlYWQgbXVzdCBhbHJlYWR5IGhhdmUgY2FsbGVkIF9fa21wX3N1c3BlbmRfdGVtcGxhdGUoKSAqLwordGVtcGxhdGUgPGNsYXNzIEM+CitzdGF0aWMgaW5saW5lIHZvaWQgX19rbXBfcmVzdW1lX3RlbXBsYXRlKGludCB0YXJnZXRfZ3RpZCwgQyAqZmxhZykgeworICBLTVBfVElNRV9ERVZFTE9QRVJfUEFSVElUSU9ORURfQkxPQ0soVVNFUl9yZXN1bWUpOworICBrbXBfaW5mb190ICp0aCA9IF9fa21wX3RocmVhZHNbdGFyZ2V0X2d0aWRdOworICBpbnQgc3RhdHVzOworCisjaWZkZWYgS01QX0RFQlVHCisgIGludCBndGlkID0gVENSXzQoX19rbXBfaW5pdF9ndGlkKSA/IF9fa21wX2dldF9ndGlkKCkgOiAtMTsKKyNlbmRpZgorCisgIEtGX1RSQUNFKDMwLCAoIl9fa21wX3Jlc3VtZV90ZW1wbGF0ZTogVCMlZCB3YW50cyB0byB3YWtldXAgVCMlZCBlbnRlclxuIiwKKyAgICAgICAgICAgICAgICBndGlkLCB0YXJnZXRfZ3RpZCkpOworICBLTVBfREVCVUdfQVNTRVJUKGd0aWQgIT0gdGFyZ2V0X2d0aWQpOworCisgIF9fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZV90aHJlYWQodGgpOworCisgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmdGgtPnRoLnRoX3N1c3BlbmRfbXgubV9tdXRleCk7CisgIEtNUF9DSEVDS19TWVNGQUlMKCJwdGhyZWFkX211dGV4X2xvY2siLCBzdGF0dXMpOworCisgIGlmICghZmxhZykgeyAvLyBjb21pbmcgZnJvbSBfX2ttcF9udWxsX3Jlc3VtZV93cmFwcGVyCisgICAgZmxhZyA9IChDICopQ0NBU1Qodm9pZCAqLCB0aC0+dGgudGhfc2xlZXBfbG9jKTsKKyAgfQorCisgIC8vIEZpcnN0LCBjaGVjayBpZiB0aGUgZmxhZyBpcyBudWxsIG9yIGl0cyB0eXBlIGhhcyBjaGFuZ2VkLiBJZiBzbywgc29tZW9uZQorICAvLyBlbHNlIHdva2UgaXQgdXAuCisgIGlmICghZmxhZyB8fCBmbGFnLT5nZXRfdHlwZSgpICE9IGZsYWctPmdldF9wdHJfdHlwZSgpKSB7IC8vIGdldF9wdHJfdHlwZQorICAgIC8vIHNpbXBseSBzaG93cyB3aGF0CisgICAgLy8gZmxhZyB3YXMgY2FzdCB0bworICAgIEtGX1RSQUNFKDUsICgiX19rbXBfcmVzdW1lX3RlbXBsYXRlOiBUIyVkIGV4aXRpbmcsIHRocmVhZCBUIyVkIGFscmVhZHkgIgorICAgICAgICAgICAgICAgICAiYXdha2U6IGZsYWcoJXApXG4iLAorICAgICAgICAgICAgICAgICBndGlkLCB0YXJnZXRfZ3RpZCwgTlVMTCkpOworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0aC0+dGgudGhfc3VzcGVuZF9teC5tX211dGV4KTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCgicHRocmVhZF9tdXRleF91bmxvY2siLCBzdGF0dXMpOworICAgIHJldHVybjsKKyAgfSBlbHNlIHsgLy8gaWYgbXVsdGlwbGUgdGhyZWFkcyBhcmUgc2xlZXBpbmcsIGZsYWcgc2hvdWxkIGJlIGludGVybmFsbHkKKyAgICAvLyByZWZlcnJpbmcgdG8gYSBzcGVjaWZpYyB0aHJlYWQgaGVyZQorICAgIHR5cGVuYW1lIEM6OmZsYWdfdCBvbGRfc3BpbiA9IGZsYWctPnVuc2V0X3NsZWVwaW5nKCk7CisgICAgaWYgKCFmbGFnLT5pc19zbGVlcGluZ192YWwob2xkX3NwaW4pKSB7CisgICAgICBLRl9UUkFDRSg1LCAoIl9fa21wX3Jlc3VtZV90ZW1wbGF0ZTogVCMlZCBleGl0aW5nLCB0aHJlYWQgVCMlZCBhbHJlYWR5ICIKKyAgICAgICAgICAgICAgICAgICAiYXdha2U6IGZsYWcoJXApOiAiCisgICAgICAgICAgICAgICAgICAgIiV1ID0+ICV1XG4iLAorICAgICAgICAgICAgICAgICAgIGd0aWQsIHRhcmdldF9ndGlkLCBmbGFnLT5nZXQoKSwgb2xkX3NwaW4sICpmbGFnLT5nZXQoKSkpOworICAgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soJnRoLT50aC50aF9zdXNwZW5kX214Lm1fbXV0ZXgpOworICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoInB0aHJlYWRfbXV0ZXhfdW5sb2NrIiwgc3RhdHVzKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgS0ZfVFJBQ0UoNSwgKCJfX2ttcF9yZXN1bWVfdGVtcGxhdGU6IFQjJWQgYWJvdXQgdG8gd2FrZXVwIFQjJWQsIHJlc2V0ICIKKyAgICAgICAgICAgICAgICAgInNsZWVwIGJpdCBmb3IgZmxhZydzIGxvYyglcCk6ICIKKyAgICAgICAgICAgICAgICAgIiV1ID0+ICV1XG4iLAorICAgICAgICAgICAgICAgICBndGlkLCB0YXJnZXRfZ3RpZCwgZmxhZy0+Z2V0KCksIG9sZF9zcGluLCAqZmxhZy0+Z2V0KCkpKTsKKyAgfQorICBUQ1dfUFRSKHRoLT50aC50aF9zbGVlcF9sb2MsIE5VTEwpOworCisjaWZkZWYgREVCVUdfU1VTUEVORAorICB7CisgICAgY2hhciBidWZmZXJbMTI4XTsKKyAgICBfX2ttcF9wcmludF9jb25kKGJ1ZmZlciwgJnRoLT50aC50aF9zdXNwZW5kX2N2KTsKKyAgICBfX2ttcF9wcmludGYoIl9fa21wX3Jlc3VtZV90ZW1wbGF0ZTogVCMlZCByZXN1bWluZyBUIyVkOiAlc1xuIiwgZ3RpZCwKKyAgICAgICAgICAgICAgICAgdGFyZ2V0X2d0aWQsIGJ1ZmZlcik7CisgIH0KKyNlbmRpZgorICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfc2lnbmFsKCZ0aC0+dGgudGhfc3VzcGVuZF9jdi5jX2NvbmQpOworICBLTVBfQ0hFQ0tfU1lTRkFJTCgicHRocmVhZF9jb25kX3NpZ25hbCIsIHN0YXR1cyk7CisgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0aC0+dGgudGhfc3VzcGVuZF9teC5tX211dGV4KTsKKyAgS01QX0NIRUNLX1NZU0ZBSUwoInB0aHJlYWRfbXV0ZXhfdW5sb2NrIiwgc3RhdHVzKTsKKyAgS0ZfVFJBQ0UoMzAsICgiX19rbXBfcmVzdW1lX3RlbXBsYXRlOiBUIyVkIGV4aXRpbmcgYWZ0ZXIgc2lnbmFsaW5nIHdha2UgdXAiCisgICAgICAgICAgICAgICAgIiBmb3IgVCMlZFxuIiwKKyAgICAgICAgICAgICAgICBndGlkLCB0YXJnZXRfZ3RpZCkpOworfQorCit2b2lkIF9fa21wX3Jlc3VtZV8zMihpbnQgdGFyZ2V0X2d0aWQsIGttcF9mbGFnXzMyICpmbGFnKSB7CisgIF9fa21wX3Jlc3VtZV90ZW1wbGF0ZSh0YXJnZXRfZ3RpZCwgZmxhZyk7Cit9Cit2b2lkIF9fa21wX3Jlc3VtZV82NChpbnQgdGFyZ2V0X2d0aWQsIGttcF9mbGFnXzY0ICpmbGFnKSB7CisgIF9fa21wX3Jlc3VtZV90ZW1wbGF0ZSh0YXJnZXRfZ3RpZCwgZmxhZyk7Cit9Cit2b2lkIF9fa21wX3Jlc3VtZV9vbmNvcmUoaW50IHRhcmdldF9ndGlkLCBrbXBfZmxhZ19vbmNvcmUgKmZsYWcpIHsKKyAgX19rbXBfcmVzdW1lX3RlbXBsYXRlKHRhcmdldF9ndGlkLCBmbGFnKTsKK30KKworI2lmIEtNUF9VU0VfTU9OSVRPUgordm9pZCBfX2ttcF9yZXN1bWVfbW9uaXRvcigpIHsKKyAgS01QX1RJTUVfREVWRUxPUEVSX1BBUlRJVElPTkVEX0JMT0NLKFVTRVJfcmVzdW1lKTsKKyAgaW50IHN0YXR1czsKKyNpZmRlZiBLTVBfREVCVUcKKyAgaW50IGd0aWQgPSBUQ1JfNChfX2ttcF9pbml0X2d0aWQpID8gX19rbXBfZ2V0X2d0aWQoKSA6IC0xOworICBLRl9UUkFDRSgzMCwgKCJfX2ttcF9yZXN1bWVfbW9uaXRvcjogVCMlZCB3YW50cyB0byB3YWtldXAgVCMlZCBlbnRlclxuIiwgZ3RpZCwKKyAgICAgICAgICAgICAgICBLTVBfR1RJRF9NT05JVE9SKSk7CisgIEtNUF9ERUJVR19BU1NFUlQoZ3RpZCAhPSBLTVBfR1RJRF9NT05JVE9SKTsKKyNlbmRpZgorICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soJl9fa21wX3dhaXRfbXgubV9tdXRleCk7CisgIEtNUF9DSEVDS19TWVNGQUlMKCJwdGhyZWFkX211dGV4X2xvY2siLCBzdGF0dXMpOworI2lmZGVmIERFQlVHX1NVU1BFTkQKKyAgeworICAgIGNoYXIgYnVmZmVyWzEyOF07CisgICAgX19rbXBfcHJpbnRfY29uZChidWZmZXIsICZfX2ttcF93YWl0X2N2LmNfY29uZCk7CisgICAgX19rbXBfcHJpbnRmKCJfX2ttcF9yZXN1bWVfbW9uaXRvcjogVCMlZCByZXN1bWluZyBUIyVkOiAlc1xuIiwgZ3RpZCwKKyAgICAgICAgICAgICAgICAgS01QX0dUSURfTU9OSVRPUiwgYnVmZmVyKTsKKyAgfQorI2VuZGlmCisgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF9zaWduYWwoJl9fa21wX3dhaXRfY3YuY19jb25kKTsKKyAgS01QX0NIRUNLX1NZU0ZBSUwoInB0aHJlYWRfY29uZF9zaWduYWwiLCBzdGF0dXMpOworICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jaygmX19rbXBfd2FpdF9teC5tX211dGV4KTsKKyAgS01QX0NIRUNLX1NZU0ZBSUwoInB0aHJlYWRfbXV0ZXhfdW5sb2NrIiwgc3RhdHVzKTsKKyAgS0ZfVFJBQ0UoMzAsICgiX19rbXBfcmVzdW1lX21vbml0b3I6IFQjJWQgZXhpdGluZyBhZnRlciBzaWduYWxpbmcgd2FrZSB1cCIKKyAgICAgICAgICAgICAgICAiIGZvciBUIyVkXG4iLAorICAgICAgICAgICAgICAgIGd0aWQsIEtNUF9HVElEX01PTklUT1IpKTsKK30KKyNlbmRpZiAvLyBLTVBfVVNFX01PTklUT1IKKwordm9pZCBfX2ttcF95aWVsZChpbnQgY29uZCkgeworICBpZiAoIWNvbmQpCisgICAgcmV0dXJuOworI2lmIEtNUF9VU0VfTU9OSVRPUgorICBpZiAoIV9fa21wX3lpZWxkaW5nX29uKQorICAgIHJldHVybjsKKyNlbHNlCisgIGlmIChfX2ttcF95aWVsZF9jeWNsZSAmJiAhS01QX1lJRUxEX05PVygpKQorICAgIHJldHVybjsKKyNlbmRpZgorICBzY2hlZF95aWVsZCgpOworfQorCit2b2lkIF9fa21wX2d0aWRfc2V0X3NwZWNpZmljKGludCBndGlkKSB7CisgIGlmIChfX2ttcF9pbml0X2d0aWQpIHsKKyAgICBpbnQgc3RhdHVzOworICAgIHN0YXR1cyA9IHB0aHJlYWRfc2V0c3BlY2lmaWMoX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKGludHB0cl90KShndGlkICsgMSkpOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCJwdGhyZWFkX3NldHNwZWNpZmljIiwgc3RhdHVzKTsKKyAgfSBlbHNlIHsKKyAgICBLQV9UUkFDRSg1MCwgKCJfX2ttcF9ndGlkX3NldF9zcGVjaWZpYzogcnVudGltZSBzaHV0ZG93biwgcmV0dXJuaW5nXG4iKSk7CisgIH0KK30KKworaW50IF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCkgeworICBpbnQgZ3RpZDsKKyAgaWYgKCFfX2ttcF9pbml0X2d0aWQpIHsKKyAgICBLQV9UUkFDRSg1MCwgKCJfX2ttcF9ndGlkX2dldF9zcGVjaWZpYzogcnVudGltZSBzaHV0ZG93biwgcmV0dXJuaW5nICIKKyAgICAgICAgICAgICAgICAgICJLTVBfR1RJRF9TSFVURE9XTlxuIikpOworICAgIHJldHVybiBLTVBfR1RJRF9TSFVURE9XTjsKKyAgfQorICBndGlkID0gKGludCkoc2l6ZV90KXB0aHJlYWRfZ2V0c3BlY2lmaWMoX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSk7CisgIGlmIChndGlkID09IDApIHsKKyAgICBndGlkID0gS01QX0dUSURfRE5FOworICB9IGVsc2UgeworICAgIGd0aWQtLTsKKyAgfQorICBLQV9UUkFDRSg1MCwgKCJfX2ttcF9ndGlkX2dldF9zcGVjaWZpYzoga2V5OiVkIGd0aWQ6JWRcbiIsCisgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSwgZ3RpZCkpOworICByZXR1cm4gZ3RpZDsKK30KKworZG91YmxlIF9fa21wX3JlYWRfY3B1X3RpbWUodm9pZCkgeworICAvKmNsb2NrX3QgICB0OyovCisgIHN0cnVjdCB0bXMgYnVmZmVyOworCisgIC8qdCA9Ki90aW1lcygmYnVmZmVyKTsKKworICByZXR1cm4gKGJ1ZmZlci50bXNfdXRpbWUgKyBidWZmZXIudG1zX2N1dGltZSkgLyAoZG91YmxlKUNMT0NLU19QRVJfU0VDOworfQorCitpbnQgX19rbXBfcmVhZF9zeXN0ZW1faW5mbyhzdHJ1Y3Qga21wX3N5c19pbmZvICppbmZvKSB7CisgIGludCBzdGF0dXM7CisgIHN0cnVjdCBydXNhZ2Ugcl91c2FnZTsKKworICBtZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7CisKKyAgc3RhdHVzID0gZ2V0cnVzYWdlKFJVU0FHRV9TRUxGLCAmcl91c2FnZSk7CisgIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCJnZXRydXNhZ2UiLCBzdGF0dXMpOworCisgIC8vIFRoZSBtYXhpbXVtIHJlc2lkZW50IHNldCBzaXplIHV0aWxpemVkIChpbiBraWxvYnl0ZXMpCisgIGluZm8tPm1heHJzcyA9IHJfdXNhZ2UucnVfbWF4cnNzOworICAvLyBUaGUgbnVtYmVyIG9mIHBhZ2UgZmF1bHRzIHNlcnZpY2VkIHdpdGhvdXQgYW55IEkvTworICBpbmZvLT5taW5mbHQgPSByX3VzYWdlLnJ1X21pbmZsdDsKKyAgLy8gVGhlIG51bWJlciBvZiBwYWdlIGZhdWx0cyBzZXJ2aWNlZCB0aGF0IHJlcXVpcmVkIEkvTworICBpbmZvLT5tYWpmbHQgPSByX3VzYWdlLnJ1X21hamZsdDsKKyAgLy8gVGhlIG51bWJlciBvZiB0aW1lcyBhIHByb2Nlc3Mgd2FzICJzd2FwcGVkIiBvdXQgb2YgbWVtb3J5CisgIGluZm8tPm5zd2FwID0gcl91c2FnZS5ydV9uc3dhcDsKKyAgLy8gVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZmlsZSBzeXN0ZW0gaGFkIHRvIHBlcmZvcm0gaW5wdXQKKyAgaW5mby0+aW5ibG9jayA9IHJfdXNhZ2UucnVfaW5ibG9jazsKKyAgLy8gVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZmlsZSBzeXN0ZW0gaGFkIHRvIHBlcmZvcm0gb3V0cHV0CisgIGluZm8tPm91YmxvY2sgPSByX3VzYWdlLnJ1X291YmxvY2s7CisgIC8vIFRoZSBudW1iZXIgb2YgdGltZXMgYSBjb250ZXh0IHN3aXRjaCB3YXMgdm9sdW50YXJpbHkKKyAgaW5mby0+bnZjc3cgPSByX3VzYWdlLnJ1X252Y3N3OworICAvLyBUaGUgbnVtYmVyIG9mIHRpbWVzIGEgY29udGV4dCBzd2l0Y2ggd2FzIGZvcmNlZAorICBpbmZvLT5uaXZjc3cgPSByX3VzYWdlLnJ1X25pdmNzdzsKKworICByZXR1cm4gKHN0YXR1cyAhPSAwKTsKK30KKwordm9pZCBfX2ttcF9yZWFkX3N5c3RlbV90aW1lKGRvdWJsZSAqZGVsdGEpIHsKKyAgZG91YmxlIHRfbnM7CisgIHN0cnVjdCB0aW1ldmFsIHR2YWw7CisgIHN0cnVjdCB0aW1lc3BlYyBzdG9wOworICBpbnQgc3RhdHVzOworCisgIHN0YXR1cyA9IGdldHRpbWVvZmRheSgmdHZhbCwgTlVMTCk7CisgIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCJnZXR0aW1lb2ZkYXkiLCBzdGF0dXMpOworICBUSU1FVkFMX1RPX1RJTUVTUEVDKCZ0dmFsLCAmc3RvcCk7CisgIHRfbnMgPSBUUzJOUyhzdG9wKSAtIFRTMk5TKF9fa21wX3N5c190aW1lcl9kYXRhLnN0YXJ0KTsKKyAgKmRlbHRhID0gKHRfbnMgKiAxZS05KTsKK30KKwordm9pZCBfX2ttcF9jbGVhcl9zeXN0ZW1fdGltZSh2b2lkKSB7CisgIHN0cnVjdCB0aW1ldmFsIHR2YWw7CisgIGludCBzdGF0dXM7CisgIHN0YXR1cyA9IGdldHRpbWVvZmRheSgmdHZhbCwgTlVMTCk7CisgIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCJnZXR0aW1lb2ZkYXkiLCBzdGF0dXMpOworICBUSU1FVkFMX1RPX1RJTUVTUEVDKCZ0dmFsLCAmX19rbXBfc3lzX3RpbWVyX2RhdGEuc3RhcnQpOworfQorCisjaWZkZWYgQlVJTERfVFYKKwordm9pZCBfX2ttcF90dl90aHJlYWRwcml2YXRlX3N0b3JlKGttcF9pbmZvX3QgKnRoLCB2b2lkICpnbG9iYWxfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp0aHJlYWRfYWRkcikgeworICBzdHJ1Y3QgdHZfZGF0YSAqcDsKKworICBwID0gKHN0cnVjdCB0dl9kYXRhICopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKCpwKSk7CisKKyAgcC0+dS50cC5nbG9iYWxfYWRkciA9IGdsb2JhbF9hZGRyOworICBwLT51LnRwLnRocmVhZF9hZGRyID0gdGhyZWFkX2FkZHI7CisKKyAgcC0+dHlwZSA9ICh2b2lkICopMTsKKworICBwLT5uZXh0ID0gdGgtPnRoLnRoX2xvY2FsLnR2X2RhdGE7CisgIHRoLT50aC50aF9sb2NhbC50dl9kYXRhID0gcDsKKworICBpZiAocC0+bmV4dCA9PSAwKSB7CisgICAgaW50IHJjID0gcHRocmVhZF9zZXRzcGVjaWZpYyhfX2ttcF90dl9rZXksIHApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCJwdGhyZWFkX3NldHNwZWNpZmljIiwgcmMpOworICB9Cit9CisKKyNlbmRpZiAvKiBCVUlMRF9UViAqLworCitzdGF0aWMgaW50IF9fa21wX2dldF94cHJvYyh2b2lkKSB7CisKKyAgaW50IHIgPSAwOworCisjaWYgS01QX09TX0xJTlVYIHx8IEtNUF9PU19GUkVFQlNEIHx8IEtNUF9PU19ORVRCU0QKKworICByID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisKKyNlbGlmIEtNUF9PU19EQVJXSU4KKworICAvLyBCdWcgQzc3MDExIEhpZ2ggIk9wZW5NUCBUaHJlYWRzIGFuZCBudW1iZXIgb2YgYWN0aXZlIGNvcmVzIi4KKworICAvLyBGaW5kIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIENQVXMuCisgIGtlcm5fcmV0dXJuX3QgcmM7CisgIGhvc3RfYmFzaWNfaW5mb19kYXRhX3QgaW5mbzsKKyAgbWFjaF9tc2dfdHlwZV9udW1iZXJfdCBudW0gPSBIT1NUX0JBU0lDX0lORk9fQ09VTlQ7CisgIHJjID0gaG9zdF9pbmZvKG1hY2hfaG9zdF9zZWxmKCksIEhPU1RfQkFTSUNfSU5GTywgKGhvc3RfaW5mb190KSZpbmZvLCAmbnVtKTsKKyAgaWYgKHJjID09IDAgJiYgbnVtID09IEhPU1RfQkFTSUNfSU5GT19DT1VOVCkgeworICAgIC8vIENhbm5vdCB1c2UgS0FfVFJBQ0UoKSBoZXJlIGJlY2F1c2UgdGhpcyBjb2RlIHdvcmtzIGJlZm9yZSB0cmFjZSBzdXBwb3J0CisgICAgLy8gaXMgaW5pdGlhbGl6ZWQuCisgICAgciA9IGluZm8uYXZhaWxfY3B1czsKKyAgfSBlbHNlIHsKKyAgICBLTVBfV0FSTklORyhDYW50R2V0TnVtQXZhaWxDUFUpOworICAgIEtNUF9JTkZPUk0oQXNzdW1lZE51bUNQVSk7CisgIH07IC8vIGlmCisKKyNlbHNlCisKKyNlcnJvciAiVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUy4iCisKKyNlbmRpZgorCisgIHJldHVybiByID4gMCA/IHIgOiAyOyAvKiBndWVzcyB2YWx1ZSBvZiAyIGlmIE9TIHRvbGQgdXMgMCAqLworCit9IC8vIF9fa21wX2dldF94cHJvYworCitpbnQgX19rbXBfcmVhZF9mcm9tX2ZpbGUoY2hhciBjb25zdCAqcGF0aCwgY2hhciBjb25zdCAqZm9ybWF0LCAuLi4pIHsKKyAgaW50IHJlc3VsdDsKKyAgdmFfbGlzdCBhcmdzOworCisgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisgIEZJTEUgKmYgPSBmb3BlbihwYXRoLCAicmIiKTsKKyAgaWYgKGYgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKyAgcmVzdWx0ID0gdmZzY2FuZihmLCBmb3JtYXQsIGFyZ3MpOworICBmY2xvc2UoZik7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBfX2ttcF9ydW50aW1lX2luaXRpYWxpemUodm9pZCkgeworICBpbnQgc3RhdHVzOworICBwdGhyZWFkX211dGV4YXR0cl90IG11dGV4X2F0dHI7CisgIHB0aHJlYWRfY29uZGF0dHJfdCBjb25kX2F0dHI7CisKKyAgaWYgKF9fa21wX2luaXRfcnVudGltZSkgeworICAgIHJldHVybjsKKyAgfTsgLy8gaWYKKworI2lmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0KQorICBpZiAoIV9fa21wX2NwdWluZm8uaW5pdGlhbGl6ZWQpIHsKKyAgICBfX2ttcF9xdWVyeV9jcHVpZCgmX19rbXBfY3B1aW5mbyk7CisgIH07IC8vIGlmCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisgIF9fa21wX3hwcm9jID0gX19rbXBfZ2V0X3hwcm9jKCk7CisKKyAgaWYgKHN5c2NvbmYoX1NDX1RIUkVBRFMpKSB7CisKKyAgICAvKiBRdWVyeSB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGhyZWFkcyAqLworICAgIF9fa21wX3N5c19tYXhfbnRoID0gc3lzY29uZihfU0NfVEhSRUFEX1RIUkVBRFNfTUFYKTsKKyAgICBpZiAoX19rbXBfc3lzX21heF9udGggPT0gLTEpIHsKKyAgICAgIC8qIFVubGltaXRlZCB0aHJlYWRzIGZvciBOUFRMICovCisgICAgICBfX2ttcF9zeXNfbWF4X250aCA9IElOVF9NQVg7CisgICAgfSBlbHNlIGlmIChfX2ttcF9zeXNfbWF4X250aCA8PSAxKSB7CisgICAgICAvKiBDYW4ndCB0ZWxsLCBqdXN0IHVzZSBQVEhSRUFEX1RIUkVBRFNfTUFYICovCisgICAgICBfX2ttcF9zeXNfbWF4X250aCA9IEtNUF9NQVhfTlRIOworICAgIH0KKworICAgIC8qIFF1ZXJ5IHRoZSBtaW5pbXVtIHN0YWNrIHNpemUgKi8KKyAgICBfX2ttcF9zeXNfbWluX3N0a3NpemUgPSBzeXNjb25mKF9TQ19USFJFQURfU1RBQ0tfTUlOKTsKKyAgICBpZiAoX19rbXBfc3lzX21pbl9zdGtzaXplIDw9IDEpIHsKKyAgICAgIF9fa21wX3N5c19taW5fc3Rrc2l6ZSA9IEtNUF9NSU5fU1RLU0laRTsKKyAgICB9CisgIH0KKworICAvKiBTZXQgdXAgbWluaW11bSBudW1iZXIgb2YgdGhyZWFkcyB0byBzd2l0Y2ggdG8gVExTIGd0aWQgKi8KKyAgX19rbXBfdGxzX2d0aWRfbWluID0gS01QX1RMU19HVElEX01JTjsKKworI2lmZGVmIEJVSUxEX1RWCisgIHsKKyAgICBpbnQgcmMgPSBwdGhyZWFkX2tleV9jcmVhdGUoJl9fa21wX3R2X2tleSwgMCk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoInB0aHJlYWRfa2V5X2NyZWF0ZSIsIHJjKTsKKyAgfQorI2VuZGlmCisKKyAgc3RhdHVzID0gcHRocmVhZF9rZXlfY3JlYXRlKCZfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfaW50ZXJuYWxfZW5kX2Rlc3QpOworICBLTVBfQ0hFQ0tfU1lTRkFJTCgicHRocmVhZF9rZXlfY3JlYXRlIiwgc3RhdHVzKTsKKyAgc3RhdHVzID0gcHRocmVhZF9tdXRleGF0dHJfaW5pdCgmbXV0ZXhfYXR0cik7CisgIEtNUF9DSEVDS19TWVNGQUlMKCJwdGhyZWFkX211dGV4YXR0cl9pbml0Iiwgc3RhdHVzKTsKKyAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9pbml0KCZfX2ttcF93YWl0X214Lm1fbXV0ZXgsICZtdXRleF9hdHRyKTsKKyAgS01QX0NIRUNLX1NZU0ZBSUwoInB0aHJlYWRfbXV0ZXhfaW5pdCIsIHN0YXR1cyk7CisgIHN0YXR1cyA9IHB0aHJlYWRfY29uZGF0dHJfaW5pdCgmY29uZF9hdHRyKTsKKyAgS01QX0NIRUNLX1NZU0ZBSUwoInB0aHJlYWRfY29uZGF0dHJfaW5pdCIsIHN0YXR1cyk7CisgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF9pbml0KCZfX2ttcF93YWl0X2N2LmNfY29uZCwgJmNvbmRfYXR0cik7CisgIEtNUF9DSEVDS19TWVNGQUlMKCJwdGhyZWFkX2NvbmRfaW5pdCIsIHN0YXR1cyk7CisjaWYgVVNFX0lUVF9CVUlMRAorICBfX2ttcF9pdHRfaW5pdGlhbGl6ZSgpOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICBfX2ttcF9pbml0X3J1bnRpbWUgPSBUUlVFOworfQorCit2b2lkIF9fa21wX3J1bnRpbWVfZGVzdHJveSh2b2lkKSB7CisgIGludCBzdGF0dXM7CisKKyAgaWYgKCFfX2ttcF9pbml0X3J1bnRpbWUpIHsKKyAgICByZXR1cm47IC8vIE5vdGhpbmcgdG8gZG8uCisgIH07CisKKyNpZiBVU0VfSVRUX0JVSUxECisgIF9fa21wX2l0dF9kZXN0cm95KCk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgIHN0YXR1cyA9IHB0aHJlYWRfa2V5X2RlbGV0ZShfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5KTsKKyAgS01QX0NIRUNLX1NZU0ZBSUwoInB0aHJlYWRfa2V5X2RlbGV0ZSIsIHN0YXR1cyk7CisjaWZkZWYgQlVJTERfVFYKKyAgc3RhdHVzID0gcHRocmVhZF9rZXlfZGVsZXRlKF9fa21wX3R2X2tleSk7CisgIEtNUF9DSEVDS19TWVNGQUlMKCJwdGhyZWFkX2tleV9kZWxldGUiLCBzdGF0dXMpOworI2VuZGlmCisKKyAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9kZXN0cm95KCZfX2ttcF93YWl0X214Lm1fbXV0ZXgpOworICBpZiAoc3RhdHVzICE9IDAgJiYgc3RhdHVzICE9IEVCVVNZKSB7CisgICAgS01QX1NZU0ZBSUwoInB0aHJlYWRfbXV0ZXhfZGVzdHJveSIsIHN0YXR1cyk7CisgIH0KKyAgc3RhdHVzID0gcHRocmVhZF9jb25kX2Rlc3Ryb3koJl9fa21wX3dhaXRfY3YuY19jb25kKTsKKyAgaWYgKHN0YXR1cyAhPSAwICYmIHN0YXR1cyAhPSBFQlVTWSkgeworICAgIEtNUF9TWVNGQUlMKCJwdGhyZWFkX2NvbmRfZGVzdHJveSIsIHN0YXR1cyk7CisgIH0KKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgIF9fa21wX2FmZmluaXR5X3VuaW5pdGlhbGl6ZSgpOworI2VuZGlmCisKKyAgX19rbXBfaW5pdF9ydW50aW1lID0gRkFMU0U7Cit9CisKKy8qIFB1dCB0aGUgdGhyZWFkIHRvIHNsZWVwIGZvciBhIHRpbWUgcGVyaW9kICovCisvKiBOT1RFOiBub3QgY3VycmVudGx5IHVzZWQgYW55d2hlcmUgKi8KK3ZvaWQgX19rbXBfdGhyZWFkX3NsZWVwKGludCBtaWxsaXMpIHsgc2xlZXAoKG1pbGxpcyArIDUwMCkgLyAxMDAwKTsgfQorCisvKiBDYWxjdWxhdGUgdGhlIGVsYXBzZWQgd2FsbCBjbG9jayB0aW1lIGZvciB0aGUgdXNlciAqLwordm9pZCBfX2ttcF9lbGFwc2VkKGRvdWJsZSAqdCkgeworICBpbnQgc3RhdHVzOworI2lmZGVmIEZJWF9TR0lfQ0xPQ0sKKyAgc3RydWN0IHRpbWVzcGVjIHRzOworCisgIHN0YXR1cyA9IGNsb2NrX2dldHRpbWUoQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lELCAmdHMpOworICBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTygiY2xvY2tfZ2V0dGltZSIsIHN0YXR1cyk7CisgICp0ID0KKyAgICAgIChkb3VibGUpdHMudHZfbnNlYyAqICgxLjAgLyAoZG91YmxlKUtNUF9OU0VDX1BFUl9TRUMpICsgKGRvdWJsZSl0cy50dl9zZWM7CisjZWxzZQorICBzdHJ1Y3QgdGltZXZhbCB0djsKKworICBzdGF0dXMgPSBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKyAgS01QX0NIRUNLX1NZU0ZBSUxfRVJSTk8oImdldHRpbWVvZmRheSIsIHN0YXR1cyk7CisgICp0ID0KKyAgICAgIChkb3VibGUpdHYudHZfdXNlYyAqICgxLjAgLyAoZG91YmxlKUtNUF9VU0VDX1BFUl9TRUMpICsgKGRvdWJsZSl0di50dl9zZWM7CisjZW5kaWYKK30KKworLyogQ2FsY3VsYXRlIHRoZSBlbGFwc2VkIHdhbGwgY2xvY2sgdGljayBmb3IgdGhlIHVzZXIgKi8KK3ZvaWQgX19rbXBfZWxhcHNlZF90aWNrKGRvdWJsZSAqdCkgeyAqdCA9IDEgLyAoZG91YmxlKUNMT0NLU19QRVJfU0VDOyB9CisKKy8qIFJldHVybiB0aGUgY3VycmVudCB0aW1lIHN0YW1wIGluIG5zZWMgKi8KK2ttcF91aW50NjQgX19rbXBfbm93X25zZWMoKSB7CisgIHN0cnVjdCB0aW1ldmFsIHQ7CisgIGdldHRpbWVvZmRheSgmdCwgTlVMTCk7CisgIHJldHVybiBLTVBfTlNFQ19QRVJfU0VDICogdC50dl9zZWMgKyAxMDAwICogdC50dl91c2VjOworfQorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorLyogTWVhc3VyZSBjbG9jayB0aWNrcyBwZXIgbWlsbGlzZWNvbmQgKi8KK3ZvaWQgX19rbXBfaW5pdGlhbGl6ZV9zeXN0ZW1fdGljaygpIHsKKyAga21wX3VpbnQ2NCBkZWxheSA9IDEwMDAwMDsgLy8gNTB+MTAwIHVzZWMgb24gbW9zdCBtYWNoaW5lcy4KKyAga21wX3VpbnQ2NCBuc2VjID0gX19rbXBfbm93X25zZWMoKTsKKyAga21wX3VpbnQ2NCBnb2FsID0gX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wKCkgKyBkZWxheTsKKyAga21wX3VpbnQ2NCBub3c7CisgIHdoaWxlICgobm93ID0gX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wKCkpIDwgZ29hbCkKKyAgICA7CisgIF9fa21wX3RpY2tzX3Blcl9tc2VjID0KKyAgICAgIChrbXBfdWludDY0KSgxZTYgKiAoZGVsYXkgKyAobm93IC0gZ29hbCkpIC8gKF9fa21wX25vd19uc2VjKCkgLSBuc2VjKSk7Cit9CisjZW5kaWYKKworLyogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIGFkZHJlc3MgaXMgbWFwcGVkIGludG8gdGhlIGN1cnJlbnQgYWRkcmVzcworICAgc3BhY2UuICovCisKK2ludCBfX2ttcF9pc19hZGRyZXNzX21hcHBlZCh2b2lkICphZGRyKSB7CisKKyAgaW50IGZvdW5kID0gMDsKKyAgaW50IHJjOworCisjaWYgS01QX09TX0xJTlVYIHx8IEtNUF9PU19GUkVFQlNECisKKyAgLyogT24gTGludXgqIE9TLCByZWFkIHRoZSAvcHJvYy88cGlkPi9tYXBzIHBzZXVkby1maWxlIHRvIGdldCBhbGwgdGhlIGFkZHJlc3MKKyAgICAgcmFuZ2VzIG1hcHBlZCBpbnRvIHRoZSBhZGRyZXNzIHNwYWNlLiAqLworCisgIGNoYXIgKm5hbWUgPSBfX2ttcF9zdHJfZm9ybWF0KCIvcHJvYy8lZC9tYXBzIiwgZ2V0cGlkKCkpOworICBGSUxFICpmaWxlID0gTlVMTDsKKworICBmaWxlID0gZm9wZW4obmFtZSwgInIiKTsKKyAgS01QX0FTU0VSVChmaWxlICE9IE5VTEwpOworCisgIGZvciAoOzspIHsKKworICAgIHZvaWQgKmJlZ2lubmluZyA9IE5VTEw7CisgICAgdm9pZCAqZW5kaW5nID0gTlVMTDsKKyAgICBjaGFyIHBlcm1zWzVdOworCisgICAgcmMgPSBmc2NhbmYoZmlsZSwgIiVwLSVwICU0cyAlKlteXG5dXG4iLCAmYmVnaW5uaW5nLCAmZW5kaW5nLCBwZXJtcyk7CisgICAgaWYgKHJjID09IEVPRikgeworICAgICAgYnJlYWs7CisgICAgfTsgLy8gaWYKKyAgICBLTVBfQVNTRVJUKHJjID09IDMgJiYKKyAgICAgICAgICAgICAgIEtNUF9TVFJMRU4ocGVybXMpID09IDQpOyAvLyBNYWtlIHN1cmUgYWxsIGZpZWxkcyBhcmUgcmVhZC4KKworICAgIC8vIEVuZGluZyBhZGRyZXNzIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVnaW9uLCBidXQgYmVnaW5uaW5nIGlzLgorICAgIGlmICgoYWRkciA+PSBiZWdpbm5pbmcpICYmIChhZGRyIDwgZW5kaW5nKSkgeworICAgICAgcGVybXNbMl0gPSAwOyAvLyAzdGggYW5kIDR0aCBjaGFyYWN0ZXIgZG9lcyBub3QgbWF0dGVyLgorICAgICAgaWYgKHN0cmNtcChwZXJtcywgInJ3IikgPT0gMCkgeworICAgICAgICAvLyBNZW1vcnkgd2UgYXJlIGxvb2tpbmcgZm9yIHNob3VsZCBiZSByZWFkYWJsZSBhbmQgd3JpdGFibGUuCisgICAgICAgIGZvdW5kID0gMTsKKyAgICAgIH07IC8vIGlmCisgICAgICBicmVhazsKKyAgICB9OyAvLyBpZgorCisgIH07IC8vIGZvcmV2ZXIKKworICAvLyBGcmVlIHJlc291cmNlcy4KKyAgZmNsb3NlKGZpbGUpOworICBLTVBfSU5URVJOQUxfRlJFRShuYW1lKTsKKworI2VsaWYgS01QX09TX0RBUldJTgorCisgIC8qIE9uIE9TIFgqLCAvcHJvYyBwc2V1ZG8gZmlsZXN5c3RlbSBpcyBub3QgYXZhaWxhYmxlLiBUcnkgdG8gcmVhZCBtZW1vcnkKKyAgICAgdXNpbmcgdm0gaW50ZXJmYWNlLiAqLworCisgIGludCBidWZmZXI7CisgIHZtX3NpemVfdCBjb3VudDsKKyAgcmMgPSB2bV9yZWFkX292ZXJ3cml0ZSgKKyAgICAgIG1hY2hfdGFza19zZWxmKCksIC8vIFRhc2sgdG8gcmVhZCBtZW1vcnkgb2YuCisgICAgICAodm1fYWRkcmVzc190KShhZGRyKSwgLy8gQWRkcmVzcyB0byByZWFkIGZyb20uCisgICAgICAxLCAvLyBOdW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVhZC4KKyAgICAgICh2bV9hZGRyZXNzX3QpKCZidWZmZXIpLCAvLyBBZGRyZXNzIG9mIGJ1ZmZlciB0byBzYXZlIHJlYWQgYnl0ZXMgaW4uCisgICAgICAmY291bnQgLy8gQWRkcmVzcyBvZiB2YXIgdG8gc2F2ZSBudW1iZXIgb2YgcmVhZCBieXRlcyBpbi4KKyAgICAgICk7CisgIGlmIChyYyA9PSAwKSB7CisgICAgLy8gTWVtb3J5IHN1Y2Nlc3NmdWxseSByZWFkLgorICAgIGZvdW5kID0gMTsKKyAgfTsgLy8gaWYKKworI2VsaWYgS01QX09TX0ZSRUVCU0QgfHwgS01QX09TX05FVEJTRAorCisgIC8vIEZJWE1FKEZyZWVCU0QsIE5ldEJTRCk6IEltcGxlbWVudCB0aGlzCisgIGZvdW5kID0gMTsKKworI2Vsc2UKKworI2Vycm9yICJVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TIgorCisjZW5kaWYKKworICByZXR1cm4gZm91bmQ7CisKK30gLy8gX19rbXBfaXNfYWRkcmVzc19tYXBwZWQKKworI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKKworI2lmIEtNUF9PU19EQVJXSU4KKworLy8gVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJvdW5kZWQgdmFsdWUgb2YgdGhlIHN5c3RlbSBsb2FkIGF2ZXJhZ2UKKy8vIGR1cmluZyBnaXZlbiB0aW1lIGludGVydmFsIHdoaWNoIGRlcGVuZHMgb24gdGhlIHZhbHVlIG9mCisvLyBfX2ttcF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwgdmFyaWFibGUgKGRlZmF1bHQgaXMgNjAgc2VjLCBvdGhlciB2YWx1ZXMKKy8vIG1heSBiZSAzMDAgc2VjIG9yIDkwMCBzZWMpLgorLy8gSXQgcmV0dXJucyAtMSBpbiBjYXNlIG9mIGVycm9yLgoraW50IF9fa21wX2dldF9sb2FkX2JhbGFuY2UoaW50IG1heCkgeworICBkb3VibGUgYXZlcmFnZXNbM107CisgIGludCByZXRfYXZnID0gMDsKKworICBpbnQgcmVzID0gZ2V0bG9hZGF2ZyhhdmVyYWdlcywgMyk7CisKKyAgLy8gQ2hlY2sgX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsIHRvIGRldGVybWluZSB3aGljaCBvZiBhdmVyYWdlcyB0byB1c2UuCisgIC8vIGdldGxvYWRhdmcoKSBtYXkgcmV0dXJuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBsZXNzIHRoYW4gcmVxdWVzdGVkIHRoYXQgaXMKKyAgLy8gbGVzcyB0aGFuIDMuCisgIGlmIChfX2ttcF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwgPCAxODAgJiYgKHJlcyA+PSAxKSkgeworICAgIHJldF9hdmcgPSBhdmVyYWdlc1swXTsgLy8gMSBtaW4KKyAgfSBlbHNlIGlmICgoX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsID49IDE4MCAmJgorICAgICAgICAgICAgICBfX2ttcF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwgPCA2MDApICYmCisgICAgICAgICAgICAgKHJlcyA+PSAyKSkgeworICAgIHJldF9hdmcgPSBhdmVyYWdlc1sxXTsgLy8gNSBtaW4KKyAgfSBlbHNlIGlmICgoX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsID49IDYwMCkgJiYgKHJlcyA9PSAzKSkgeworICAgIHJldF9hdmcgPSBhdmVyYWdlc1syXTsgLy8gMTUgbWluCisgIH0gZWxzZSB7IC8vIEVycm9yIG9jY3VycmVkCisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0dXJuIHJldF9hdmc7Cit9CisKKyNlbHNlIC8vIExpbnV4KiBPUworCisvLyBUaGUgZnVjdGlvbiByZXR1cm5zIG51bWJlciBvZiBydW5uaW5nIChub3Qgc2xlZXBpbmcpIHRocmVhZHMsIG9yIC0xIGluIGNhc2UKKy8vIG9mIGVycm9yLiBFcnJvciBjb3VsZCBiZSByZXBvcnRlZCBpZiBMaW51eCogT1Mga2VybmVsIHRvbyBvbGQgKHdpdGhvdXQKKy8vICIvcHJvYyIgc3VwcG9ydCkuIENvdW50aW5nIHJ1bm5pbmcgdGhyZWFkcyBzdG9wcyBpZiBtYXggcnVubmluZyB0aHJlYWRzCisvLyBlbmNvdW50ZXJlZC4KK2ludCBfX2ttcF9nZXRfbG9hZF9iYWxhbmNlKGludCBtYXgpIHsKKyAgc3RhdGljIGludCBwZXJtYW5lbnRfZXJyb3IgPSAwOworICBzdGF0aWMgaW50IGdsYl9ydW5uaW5nX3RocmVhZHMgPSAwOyAvLyBTYXZlZCBjb3VudCBvZiB0aGUgcnVubmluZyB0aHJlYWRzIGZvcgorICAvLyB0aGUgdGhyZWFkIGJhbGFuY2UgYWxnb3J0aWhtCisgIHN0YXRpYyBkb3VibGUgZ2xiX2NhbGxfdGltZSA9IDA7IC8qIFRocmVhZCBiYWxhbmNlIGFsZ29yaXRobSBjYWxsIHRpbWUgKi8KKworICBpbnQgcnVubmluZ190aHJlYWRzID0gMDsgLy8gTnVtYmVyIG9mIHJ1bm5pbmcgdGhyZWFkcyBpbiB0aGUgc3lzdGVtLgorCisgIERJUiAqcHJvY19kaXIgPSBOVUxMOyAvLyBIYW5kbGUgb2YgIi9wcm9jLyIgZGlyZWN0b3J5LgorICBzdHJ1Y3QgZGlyZW50ICpwcm9jX2VudHJ5ID0gTlVMTDsKKworICBrbXBfc3RyX2J1Zl90IHRhc2tfcGF0aDsgLy8gIi9wcm9jLzxwaWQ+L3Rhc2svPHRpZD4vIiBwYXRoLgorICBESVIgKnRhc2tfZGlyID0gTlVMTDsgLy8gSGFuZGxlIG9mICIvcHJvYy88cGlkPi90YXNrLzx0aWQ+LyIgZGlyZWN0b3J5LgorICBzdHJ1Y3QgZGlyZW50ICp0YXNrX2VudHJ5ID0gTlVMTDsKKyAgaW50IHRhc2tfcGF0aF9maXhlZF9sZW47CisKKyAga21wX3N0cl9idWZfdCBzdGF0X3BhdGg7IC8vICIvcHJvYy88cGlkPi90YXNrLzx0aWQ+L3N0YXQiIHBhdGguCisgIGludCBzdGF0X2ZpbGUgPSAtMTsKKyAgaW50IHN0YXRfcGF0aF9maXhlZF9sZW47CisKKyAgaW50IHRvdGFsX3Byb2Nlc3NlcyA9IDA7IC8vIFRvdGFsIG51bWJlciBvZiBwcm9jZXNzZXMgaW4gc3lzdGVtLgorICBpbnQgdG90YWxfdGhyZWFkcyA9IDA7IC8vIFRvdGFsIG51bWJlciBvZiB0aHJlYWRzIGluIHN5c3RlbS4KKworICBkb3VibGUgY2FsbF90aW1lID0gMC4wOworCisgIF9fa21wX3N0cl9idWZfaW5pdCgmdGFza19wYXRoKTsKKyAgX19rbXBfc3RyX2J1Zl9pbml0KCZzdGF0X3BhdGgpOworCisgIF9fa21wX2VsYXBzZWQoJmNhbGxfdGltZSk7CisKKyAgaWYgKGdsYl9jYWxsX3RpbWUgJiYKKyAgICAgIChjYWxsX3RpbWUgLSBnbGJfY2FsbF90aW1lIDwgX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsKSkgeworICAgIHJ1bm5pbmdfdGhyZWFkcyA9IGdsYl9ydW5uaW5nX3RocmVhZHM7CisgICAgZ290byBmaW5pc2g7CisgIH0KKworICBnbGJfY2FsbF90aW1lID0gY2FsbF90aW1lOworCisgIC8vIERvIG5vdCBzcGVuZCB0aW1lIG9uIHNjYW5uaW5nICIvcHJvYy8iIGlmIHdlIGhhdmUgYSBwZXJtYW5lbnQgZXJyb3IuCisgIGlmIChwZXJtYW5lbnRfZXJyb3IpIHsKKyAgICBydW5uaW5nX3RocmVhZHMgPSAtMTsKKyAgICBnb3RvIGZpbmlzaDsKKyAgfTsgLy8gaWYKKworICBpZiAobWF4IDw9IDApIHsKKyAgICBtYXggPSBJTlRfTUFYOworICB9OyAvLyBpZgorCisgIC8vIE9wZW4gIi9wcm9jLyIgZGlyZWN0b3J5LgorICBwcm9jX2RpciA9IG9wZW5kaXIoIi9wcm9jIik7CisgIGlmIChwcm9jX2RpciA9PSBOVUxMKSB7CisgICAgLy8gQ2Fubm90IG9wZW4gIi9wcnJvYy8iLiBQcm9iYWJseSB0aGUga2VybmVsIGRvZXMgbm90IHN1cHBvcnQgaXQuIFJldHVybiBhbgorICAgIC8vIGVycm9yIG5vdyBhbmQgaW4gc3Vic2VxdWVudCBjYWxscy4KKyAgICBydW5uaW5nX3RocmVhZHMgPSAtMTsKKyAgICBwZXJtYW5lbnRfZXJyb3IgPSAxOworICAgIGdvdG8gZmluaXNoOworICB9OyAvLyBpZgorCisgIC8vIEluaXRpYWxpemUgZml4ZWQgcGFydCBvZiB0YXNrX3BhdGguIFRoaXMgcGFydCB3aWxsIG5vdCBjaGFuZ2UuCisgIF9fa21wX3N0cl9idWZfY2F0KCZ0YXNrX3BhdGgsICIvcHJvYy8iLCA2KTsKKyAgdGFza19wYXRoX2ZpeGVkX2xlbiA9IHRhc2tfcGF0aC51c2VkOyAvLyBSZW1lbWJlciBudW1iZXIgb2YgdXNlZCBjaGFyYWN0ZXJzLgorCisgIHByb2NfZW50cnkgPSByZWFkZGlyKHByb2NfZGlyKTsKKyAgd2hpbGUgKHByb2NfZW50cnkgIT0gTlVMTCkgeworICAgIC8vIFByb2MgZW50cnkgaXMgYSBkaXJlY3RvcnkgYW5kIG5hbWUgc3RhcnRzIHdpdGggYSBkaWdpdC4gQXNzdW1lIGl0IGlzIGEKKyAgICAvLyBwcm9jZXNzJyBkaXJlY3RvcnkuCisgICAgaWYgKHByb2NfZW50cnktPmRfdHlwZSA9PSBEVF9ESVIgJiYgaXNkaWdpdChwcm9jX2VudHJ5LT5kX25hbWVbMF0pKSB7CisKKyAgICAgICsrdG90YWxfcHJvY2Vzc2VzOworICAgICAgLy8gTWFrZSBzdXJlIGluaXQgcHJvY2VzcyBpcyB0aGUgdmVyeSBmaXJzdCBpbiAiL3Byb2MiLCBzbyB3ZSBjYW4gcmVwbGFjZQorICAgICAgLy8gc3RyY21wKCBwcm9jX2VudHJ5LT5kX25hbWUsICIxIiApID09IDAgd2l0aCBzaW1wbGVyIHRvdGFsX3Byb2Nlc3NlcyA9PQorICAgICAgLy8gMS4gV2UgYXJlIGdvaW5nIHRvIGNoZWNrIHRoYXQgdG90YWxfcHJvY2Vzc2VzID09IDEgPT4gZF9uYW1lID09ICIxIiBpcworICAgICAgLy8gdHJ1ZSAod2hlcmUgIj0+IiBpcyBpbXBsaWNhdGlvbikuIFNpbmNlIEMrKyBkb2VzIG5vdCBoYXZlID0+IG9wZXJhdG9yLAorICAgICAgLy8gbGV0IHVzIHJlcGxhY2UgaXQgd2l0aCBpdHMgZXF1aXZhbGVudDogYSA9PiBiID09ICEgYSB8fCBiLgorICAgICAgS01QX0RFQlVHX0FTU0VSVCh0b3RhbF9wcm9jZXNzZXMgIT0gMSB8fAorICAgICAgICAgICAgICAgICAgICAgICBzdHJjbXAocHJvY19lbnRyeS0+ZF9uYW1lLCAiMSIpID09IDApOworCisgICAgICAvLyBDb25zdHJ1Y3QgdGFza19wYXRoLgorICAgICAgdGFza19wYXRoLnVzZWQgPSB0YXNrX3BhdGhfZml4ZWRfbGVuOyAvLyBSZXNldCB0YXNrX3BhdGggdG8gIi9wcm9jLyIuCisgICAgICBfX2ttcF9zdHJfYnVmX2NhdCgmdGFza19wYXRoLCBwcm9jX2VudHJ5LT5kX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfU1RSTEVOKHByb2NfZW50cnktPmRfbmFtZSkpOworICAgICAgX19rbXBfc3RyX2J1Zl9jYXQoJnRhc2tfcGF0aCwgIi90YXNrIiwgNSk7CisKKyAgICAgIHRhc2tfZGlyID0gb3BlbmRpcih0YXNrX3BhdGguc3RyKTsKKyAgICAgIGlmICh0YXNrX2RpciA9PSBOVUxMKSB7CisgICAgICAgIC8vIFByb2Nlc3MgY2FuIGZpbmlzaCBiZXR3ZWVuIHJlYWRpbmcgIi9wcm9jLyIgZGlyZWN0b3J5IGVudHJ5IGFuZAorICAgICAgICAvLyBvcGVuaW5nIHByb2Nlc3MnICJ0YXNrLyIgZGlyZWN0b3J5LiBTbywgaW4gZ2VuZXJhbCBjYXNlIHdlIHNob3VsZCBub3QKKyAgICAgICAgLy8gY29tcGxhaW4sIGJ1dCBoYXZlIHRvIHNraXAgdGhpcyBwcm9jZXNzIGFuZCByZWFkIHRoZSBuZXh0IG9uZS4gQnV0IG9uCisgICAgICAgIC8vIHN5c3RlbXMgd2l0aCBubyAidGFzay8iIHN1cHBvcnQgd2Ugd2lsbCBzcGVuZCBsb3Qgb2YgdGltZSB0byBzY2FuCisgICAgICAgIC8vICIvcHJvYy8iIHRyZWUgYWdhaW4gYW5kIGFnYWluIHdpdGhvdXQgYW55IGJlbmVmaXQuICJpbml0IiBwcm9jZXNzCisgICAgICAgIC8vIChpdHMgcGlkIGlzIDEpIHNob3VsZCBleGlzdCBhbHdheXMsIHNvLCBpZiB3ZSBjYW5ub3Qgb3BlbgorICAgICAgICAvLyAiL3Byb2MvMS90YXNrLyIgZGlyZWN0b3J5LCBpdCBtZWFucyAidGFzay8iIGlzIG5vdCBzdXBwb3J0ZWQgYnkKKyAgICAgICAgLy8ga2VybmVsLiBSZXBvcnQgYW4gZXJyb3Igbm93IGFuZCBpbiB0aGUgZnV0dXJlLgorICAgICAgICBpZiAoc3RyY21wKHByb2NfZW50cnktPmRfbmFtZSwgIjEiKSA9PSAwKSB7CisgICAgICAgICAgcnVubmluZ190aHJlYWRzID0gLTE7CisgICAgICAgICAgcGVybWFuZW50X2Vycm9yID0gMTsKKyAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIENvbnN0cnVjdCBmaXhlZCBwYXJ0IG9mIHN0YXQgZmlsZSBwYXRoLgorICAgICAgICBfX2ttcF9zdHJfYnVmX2NsZWFyKCZzdGF0X3BhdGgpOworICAgICAgICBfX2ttcF9zdHJfYnVmX2NhdCgmc3RhdF9wYXRoLCB0YXNrX3BhdGguc3RyLCB0YXNrX3BhdGgudXNlZCk7CisgICAgICAgIF9fa21wX3N0cl9idWZfY2F0KCZzdGF0X3BhdGgsICIvIiwgMSk7CisgICAgICAgIHN0YXRfcGF0aF9maXhlZF9sZW4gPSBzdGF0X3BhdGgudXNlZDsKKworICAgICAgICB0YXNrX2VudHJ5ID0gcmVhZGRpcih0YXNrX2Rpcik7CisgICAgICAgIHdoaWxlICh0YXNrX2VudHJ5ICE9IE5VTEwpIHsKKyAgICAgICAgICAvLyBJdCBpcyBhIGRpcmVjdG9yeSBhbmQgbmFtZSBzdGFydHMgd2l0aCBhIGRpZ2l0LgorICAgICAgICAgIGlmIChwcm9jX2VudHJ5LT5kX3R5cGUgPT0gRFRfRElSICYmIGlzZGlnaXQodGFza19lbnRyeS0+ZF9uYW1lWzBdKSkgeworICAgICAgICAgICAgKyt0b3RhbF90aHJlYWRzOworCisgICAgICAgICAgICAvLyBDb25zcnVjdCBjb21wbGV0ZSBzdGF0IGZpbGUgcGF0aC4gRWFzaWVzdCB3YXkgd291bGQgYmU6CisgICAgICAgICAgICAvLyAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBzdGF0X3BhdGgsICIlcy8lcy9zdGF0IiwgdGFza19wYXRoLnN0ciwKKyAgICAgICAgICAgIC8vICB0YXNrX2VudHJ5LT5kX25hbWUgKTsKKyAgICAgICAgICAgIC8vIGJ1dCBzZXJpYWUgb2YgX19rbXBfc3RyX2J1Zl9jYXQgd29ya3MgYSBiaXQgZmFzdGVyLgorICAgICAgICAgICAgc3RhdF9wYXRoLnVzZWQgPQorICAgICAgICAgICAgICAgIHN0YXRfcGF0aF9maXhlZF9sZW47IC8vIFJlc2V0IHN0YXQgcGF0aCB0byBpdHMgZml4ZWQgcGFydC4KKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfY2F0KCZzdGF0X3BhdGgsIHRhc2tfZW50cnktPmRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9TVFJMRU4odGFza19lbnRyeS0+ZF9uYW1lKSk7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2NhdCgmc3RhdF9wYXRoLCAiL3N0YXQiLCA1KTsKKworICAgICAgICAgICAgLy8gTm90ZTogTG93LWxldmVsIEFQSSAob3Blbi9yZWFkL2Nsb3NlKSBpcyB1c2VkLiBIaWdoLWxldmVsIEFQSQorICAgICAgICAgICAgLy8gKGZvcGVuL2ZjbG9zZSkgIHdvcmtzIH4gMzAgJSBzbG93ZXIuCisgICAgICAgICAgICBzdGF0X2ZpbGUgPSBvcGVuKHN0YXRfcGF0aC5zdHIsIE9fUkRPTkxZKTsKKyAgICAgICAgICAgIGlmIChzdGF0X2ZpbGUgPT0gLTEpIHsKKyAgICAgICAgICAgICAgLy8gV2UgY2Fubm90IHJlcG9ydCBhbiBlcnJvciBiZWNhdXNlIHRhc2sgKHRocmVhZCkgY2FuIHRlcm1pbmF0ZQorICAgICAgICAgICAgICAvLyBqdXN0IGJlZm9yZSByZWFkaW5nIHRoaXMgZmlsZS4KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIC8qIENvbnRlbnQgb2YgInN0YXQiIGZpbGUgbG9va3MgbGlrZToKKyAgICAgICAgICAgICAgICAgMjQyODUgKHByb2dyYW0pIFMgLi4uCisKKyAgICAgICAgICAgICAgICAgSXQgaXMgYSBzaW5nbGUgbGluZSAoaWYgcHJvZ3JhbSBuYW1lIGRvZXMgbm90IGluY2x1ZGUgZnVubnkKKyAgICAgICAgICAgICAgICAgc3ltYm9scykuIEZpcnN0IG51bWJlciBpcyBhIHRocmVhZCBpZCwgdGhlbiBuYW1lIG9mIGV4ZWN1dGFibGUKKyAgICAgICAgICAgICAgICAgZmlsZSBuYW1lIGluIHBhcmV0aGVzZXMsIHRoZW4gc3RhdGUgb2YgdGhlIHRocmVhZC4gV2UgbmVlZCBqdXN0CisgICAgICAgICAgICAgICAgIHRocmVhZCBzdGF0ZS4KKworICAgICAgICAgICAgICAgICBHb29kIG5ld3M6IExlbmd0aCBvZiBwcm9ncmFtIG5hbWUgaXMgMTUgY2hhcmFjdGVycyBtYXguIExvbmdlcgorICAgICAgICAgICAgICAgICBuYW1lcyBhcmUgdHJ1bmNhdGVkLgorCisgICAgICAgICAgICAgICAgIFRodXMsIHdlIG5lZWQgcmF0aGVyIHNob3J0IGJ1ZmZlcjogMTUgY2hhcnMgZm9yIHByb2dyYW0gbmFtZSArCisgICAgICAgICAgICAgICAgIDIgcGFyZW50aGVzaXMsICsgMyBzcGFjZXMgKyB+NyBkaWdpdHMgb2YgcGlkID0gMzcuCisKKyAgICAgICAgICAgICAgICAgQmFkIG5ld3M6IFByb2dyYW0gbmFtZSBtYXkgY29udGFpbiBzcGVjaWFsIHN5bWJvbHMgbGlrZSBzcGFjZSwKKyAgICAgICAgICAgICAgICAgY2xvc2luZyBwYXJlbnRoZXNpcywgb3IgZXZlbiBuZXcgbGluZS4gVGhpcyBtYWtlcyBwYXJzaW5nCisgICAgICAgICAgICAgICAgICJzdGF0IiBmaWxlIG5vdCAxMDAgJSByZWxpYWJsZS4gSW4gY2FzZSBvZiBmYW5ueSBwcm9ncmFtIG5hbWVzCisgICAgICAgICAgICAgICAgIHBhcnNpbmcgbWF5IGZhaWwgKHJlcG9ydCBpbmNvcnJlY3QgdGhyZWFkIHN0YXRlKS4KKworICAgICAgICAgICAgICAgICBQYXJzaW5nICJzdGF0dXMiIGZpbGUgbG9va3MgbW9yZSBwcm9taXNzaW5nIChkdWUgdG8gZGlmZmVyZW50CisgICAgICAgICAgICAgICAgIGZpbGUgc3RydWN0dXJlIGFuZCBlc2NhcGluZyBzcGVjaWFsIHN5bWJvbHMpIGJ1dCByZWFkaW5nIGFuZAorICAgICAgICAgICAgICAgICBwYXJzaW5nIG9mICJzdGF0dXMiIGZpbGUgd29ya3Mgc2xvd2VyLgorICAgICAgICAgICAgICAgICAgLS0gbG4KKyAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgY2hhciBidWZmZXJbNjVdOworICAgICAgICAgICAgICBpbnQgbGVuOworICAgICAgICAgICAgICBsZW4gPSByZWFkKHN0YXRfZmlsZSwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSAtIDEpOworICAgICAgICAgICAgICBpZiAobGVuID49IDApIHsKKyAgICAgICAgICAgICAgICBidWZmZXJbbGVuXSA9IDA7CisgICAgICAgICAgICAgICAgLy8gVXNpbmcgc2NhbmY6CisgICAgICAgICAgICAgICAgLy8gICAgIHNzY2FuZiggYnVmZmVyLCAiJSpkICglKnMpICVjICIsICYgc3RhdGUgKTsKKyAgICAgICAgICAgICAgICAvLyBsb29rcyB2ZXJ5IG5pY2UsIGJ1dCBzZWFyY2hpbmcgZm9yIGEgY2xvc2luZyBwYXJlbnRoZXNpcworICAgICAgICAgICAgICAgIC8vIHdvcmtzIGEgYml0IGZhc3Rlci4KKyAgICAgICAgICAgICAgICBjaGFyICpjbG9zZV9wYXJlbnQgPSBzdHJzdHIoYnVmZmVyLCAiKSAiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xvc2VfcGFyZW50ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgIGNoYXIgc3RhdGUgPSAqKGNsb3NlX3BhcmVudCArIDIpOworICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09ICdSJykgeworICAgICAgICAgICAgICAgICAgICArK3J1bm5pbmdfdGhyZWFkczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bm5pbmdfdGhyZWFkcyA+PSBtYXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgY2xvc2Uoc3RhdF9maWxlKTsKKyAgICAgICAgICAgICAgc3RhdF9maWxlID0gLTE7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgdGFza19lbnRyeSA9IHJlYWRkaXIodGFza19kaXIpOworICAgICAgICB9OyAvLyB3aGlsZQorICAgICAgICBjbG9zZWRpcih0YXNrX2Rpcik7CisgICAgICAgIHRhc2tfZGlyID0gTlVMTDsKKyAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyAgICBwcm9jX2VudHJ5ID0gcmVhZGRpcihwcm9jX2Rpcik7CisgIH07IC8vIHdoaWxlCisKKyAgLy8gVGhlcmUgX21pZ2h0XyBiZSBhIHRpbWluZyBob2xlIHdoZXJlIHRoZSB0aHJlYWQgZXhlY3V0aW5nIHRoaXMKKyAgLy8gY29kZSBnZXQgc2tpcHBlZCBpbiB0aGUgbG9hZCBiYWxhbmNlLCBhbmQgcnVubmluZ190aHJlYWRzIGlzIDAuCisgIC8vIEFzc2VydCBpbiB0aGUgZGVidWcgYnVpbGRzIG9ubHkhISEKKyAgS01QX0RFQlVHX0FTU0VSVChydW5uaW5nX3RocmVhZHMgPiAwKTsKKyAgaWYgKHJ1bm5pbmdfdGhyZWFkcyA8PSAwKSB7CisgICAgcnVubmluZ190aHJlYWRzID0gMTsKKyAgfQorCitmaW5pc2g6IC8vIENsZWFuIHVwIGFuZCBleGl0LgorICBpZiAocHJvY19kaXIgIT0gTlVMTCkgeworICAgIGNsb3NlZGlyKHByb2NfZGlyKTsKKyAgfTsgLy8gaWYKKyAgX19rbXBfc3RyX2J1Zl9mcmVlKCZ0YXNrX3BhdGgpOworICBpZiAodGFza19kaXIgIT0gTlVMTCkgeworICAgIGNsb3NlZGlyKHRhc2tfZGlyKTsKKyAgfTsgLy8gaWYKKyAgX19rbXBfc3RyX2J1Zl9mcmVlKCZzdGF0X3BhdGgpOworICBpZiAoc3RhdF9maWxlICE9IC0xKSB7CisgICAgY2xvc2Uoc3RhdF9maWxlKTsKKyAgfTsgLy8gaWYKKworICBnbGJfcnVubmluZ190aHJlYWRzID0gcnVubmluZ190aHJlYWRzOworCisgIHJldHVybiBydW5uaW5nX3RocmVhZHM7CisKK30gLy8gX19rbXBfZ2V0X2xvYWRfYmFsYW5jZQorCisjZW5kaWYgLy8gS01QX09TX0RBUldJTgorCisjZW5kaWYgLy8gVVNFX0xPQURfQkFMQU5DRQorCisjaWYgIShLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9NSUMgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKChLTVBfT1NfTElOVVggfHwgS01QX09TX0RBUldJTikgJiYgS01QX0FSQ0hfQUFSQ0g2NCkgfHwgS01QX0FSQ0hfUFBDNjQpCisKKy8vIHdlIHJlYWxseSBvbmx5IG5lZWQgdGhlIGNhc2Ugd2l0aCAxIGFyZ3VtZW50LCBiZWNhdXNlIENMQU5HIGFsd2F5cyBidWlsZAorLy8gYSBzdHJ1Y3Qgb2YgcG9pbnRlcnMgdG8gc2hhcmVkIHZhcmlhYmxlcyByZWZlcmVuY2VkIGluIHRoZSBvdXRsaW5lZCBmdW5jdGlvbgoraW50IF9fa21wX2ludm9rZV9taWNyb3Rhc2sobWljcm90YXNrX3QgcGtmbiwgaW50IGd0aWQsIGludCB0aWQsIGludCBhcmdjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcF9hcmd2W10KKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipleGl0X2ZyYW1lX3B0cgorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKKyNpZiBPTVBUX1NVUFBPUlQKKyAgKmV4aXRfZnJhbWVfcHRyID0gX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMCk7CisjZW5kaWYKKworICBzd2l0Y2ggKGFyZ2MpIHsKKyAgZGVmYXVsdDoKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlRvbyBtYW55IGFyZ3MgdG8gbWljcm90YXNrOiAlZCFcbiIsIGFyZ2MpOworICAgIGZmbHVzaChzdGRlcnIpOworICAgIGV4aXQoLTEpOworICBjYXNlIDA6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCk7CisgICAgYnJlYWs7CisgIGNhc2UgMToKKyAgICAoKnBrZm4pKCZndGlkLCAmdGlkLCBwX2FyZ3ZbMF0pOworICAgIGJyZWFrOworICBjYXNlIDI6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0pOworICAgIGJyZWFrOworICBjYXNlIDM6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSk7CisgICAgYnJlYWs7CisgIGNhc2UgNDoKKyAgICAoKnBrZm4pKCZndGlkLCAmdGlkLCBwX2FyZ3ZbMF0sIHBfYXJndlsxXSwgcF9hcmd2WzJdLCBwX2FyZ3ZbM10pOworICAgIGJyZWFrOworICBjYXNlIDU6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSwgcF9hcmd2WzNdLCBwX2FyZ3ZbNF0pOworICAgIGJyZWFrOworICBjYXNlIDY6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSwgcF9hcmd2WzNdLCBwX2FyZ3ZbNF0sCisgICAgICAgICAgICBwX2FyZ3ZbNV0pOworICAgIGJyZWFrOworICBjYXNlIDc6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSwgcF9hcmd2WzNdLCBwX2FyZ3ZbNF0sCisgICAgICAgICAgICBwX2FyZ3ZbNV0sIHBfYXJndls2XSk7CisgICAgYnJlYWs7CisgIGNhc2UgODoKKyAgICAoKnBrZm4pKCZndGlkLCAmdGlkLCBwX2FyZ3ZbMF0sIHBfYXJndlsxXSwgcF9hcmd2WzJdLCBwX2FyZ3ZbM10sIHBfYXJndls0XSwKKyAgICAgICAgICAgIHBfYXJndls1XSwgcF9hcmd2WzZdLCBwX2FyZ3ZbN10pOworICAgIGJyZWFrOworICBjYXNlIDk6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSwgcF9hcmd2WzNdLCBwX2FyZ3ZbNF0sCisgICAgICAgICAgICBwX2FyZ3ZbNV0sIHBfYXJndls2XSwgcF9hcmd2WzddLCBwX2FyZ3ZbOF0pOworICAgIGJyZWFrOworICBjYXNlIDEwOgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0sIHBfYXJndlszXSwgcF9hcmd2WzRdLAorICAgICAgICAgICAgcF9hcmd2WzVdLCBwX2FyZ3ZbNl0sIHBfYXJndls3XSwgcF9hcmd2WzhdLCBwX2FyZ3ZbOV0pOworICAgIGJyZWFrOworICBjYXNlIDExOgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0sIHBfYXJndlszXSwgcF9hcmd2WzRdLAorICAgICAgICAgICAgcF9hcmd2WzVdLCBwX2FyZ3ZbNl0sIHBfYXJndls3XSwgcF9hcmd2WzhdLCBwX2FyZ3ZbOV0sIHBfYXJndlsxMF0pOworICAgIGJyZWFrOworICBjYXNlIDEyOgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0sIHBfYXJndlszXSwgcF9hcmd2WzRdLAorICAgICAgICAgICAgcF9hcmd2WzVdLCBwX2FyZ3ZbNl0sIHBfYXJndls3XSwgcF9hcmd2WzhdLCBwX2FyZ3ZbOV0sIHBfYXJndlsxMF0sCisgICAgICAgICAgICBwX2FyZ3ZbMTFdKTsKKyAgICBicmVhazsKKyAgY2FzZSAxMzoKKyAgICAoKnBrZm4pKCZndGlkLCAmdGlkLCBwX2FyZ3ZbMF0sIHBfYXJndlsxXSwgcF9hcmd2WzJdLCBwX2FyZ3ZbM10sIHBfYXJndls0XSwKKyAgICAgICAgICAgIHBfYXJndls1XSwgcF9hcmd2WzZdLCBwX2FyZ3ZbN10sIHBfYXJndls4XSwgcF9hcmd2WzldLCBwX2FyZ3ZbMTBdLAorICAgICAgICAgICAgcF9hcmd2WzExXSwgcF9hcmd2WzEyXSk7CisgICAgYnJlYWs7CisgIGNhc2UgMTQ6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSwgcF9hcmd2WzNdLCBwX2FyZ3ZbNF0sCisgICAgICAgICAgICBwX2FyZ3ZbNV0sIHBfYXJndls2XSwgcF9hcmd2WzddLCBwX2FyZ3ZbOF0sIHBfYXJndls5XSwgcF9hcmd2WzEwXSwKKyAgICAgICAgICAgIHBfYXJndlsxMV0sIHBfYXJndlsxMl0sIHBfYXJndlsxM10pOworICAgIGJyZWFrOworICBjYXNlIDE1OgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0sIHBfYXJndlszXSwgcF9hcmd2WzRdLAorICAgICAgICAgICAgcF9hcmd2WzVdLCBwX2FyZ3ZbNl0sIHBfYXJndls3XSwgcF9hcmd2WzhdLCBwX2FyZ3ZbOV0sIHBfYXJndlsxMF0sCisgICAgICAgICAgICBwX2FyZ3ZbMTFdLCBwX2FyZ3ZbMTJdLCBwX2FyZ3ZbMTNdLCBwX2FyZ3ZbMTRdKTsKKyAgICBicmVhazsKKyAgfQorCisjaWYgT01QVF9TVVBQT1JUCisgICpleGl0X2ZyYW1lX3B0ciA9IDA7CisjZW5kaWYKKworICByZXR1cm4gMTsKK30KKworI2VuZGlmCisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy96X1dpbmRvd3NfTlQtNTg2X2FzbS5hc20gYi9maW5hbC9ydW50aW1lL3NyYy96X1dpbmRvd3NfTlQtNTg2X2FzbS5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFjZTcxOAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL3pfV2luZG93c19OVC01ODZfYXNtLmFzbQpAQCAtMCwwICsxLDEyOTkgQEAKKzsgIHpfV2luZG93c19OVC01ODZfYXNtLmFzbTogIC0gbWljcm90YXNraW5nIHJvdXRpbmVzIHNwZWNpZmljYWxseQorOyAgICB3cml0dGVuIGZvciBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0IHJ1bm5pbmcgV2luZG93cyogT1MKKworOworOy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCis7Ly8KKzsvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCis7Ly8KKzsvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCis7Ly8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCis7Ly8KKzsvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworOworCisgICAgICAgIFRJVExFICAgel9XaW5kb3dzX05ULTU4Nl9hc20uYXNtCisKKzsgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSUEtMzIgYXJjaGl0ZWN0dXJlID09PT09PT09PT09PT09PT09PT09PT09PT09CitpZmRlZiBfTV9JQTMyCisKKyAgICAgICAgLjU4NlAKKworaWYgQFZlcnNpb24gZ3QgNTEwCisgICAgICAgIC5tb2RlbCBIVUdFCitlbHNlCitfVEVYVCAgIFNFR01FTlQgUEFSQSBVU0UzMiBQVUJMSUMgJ0NPREUnCitfVEVYVCAgIEVORFMKK19EQVRBICAgU0VHTUVOVCBEV09SRCBVU0UzMiBQVUJMSUMgJ0RBVEEnCitfREFUQSAgIEVORFMKK0NPTlNUICAgU0VHTUVOVCBEV09SRCBVU0UzMiBQVUJMSUMgJ0NPTlNUJworQ09OU1QgICBFTkRTCitfQlNTICAgIFNFR01FTlQgRFdPUkQgVVNFMzIgUFVCTElDICdCU1MnCitfQlNTICAgIEVORFMKKyQkU1lNQk9MUyAgICAgICBTRUdNRU5UIEJZVEUgVVNFMzIgJ0RFQlNZTScKKyQkU1lNQk9MUyAgICAgICBFTkRTCiskJFRZUEVTIFNFR01FTlQgQllURSBVU0UzMiAnREVCVFlQJworJCRUWVBFUyBFTkRTCitfVExTICAgIFNFR01FTlQgRFdPUkQgVVNFMzIgUFVCTElDICdUTFMnCitfVExTICAgIEVORFMKK0ZMQVQgICAgR1JPVVAgX0RBVEEsIENPTlNULCBfQlNTCisgICAgICAgIEFTU1VNRSAgQ1M6IEZMQVQsIERTOiBGTEFULCBTUzogRkxBVAorZW5kaWYKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEZVTkNUSU9OIF9fX2ttcF94ODZfcGF1c2UKKzsKKzsgdm9pZAorOyBfX2ttcF94ODZfcGF1c2UoIHZvaWQgKQorUFVCTElDICBfX19rbXBfeDg2X3BhdXNlCitfcCQgPSA0CitfZCQgPSA4CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fX2ttcF94ODZfcGF1c2UgUFJPQyBORUFSCisKKyAgICAgICAgZGIgICAgICAwZjNICisgICAgICAgIGRiICAgICAgMDkwSCAgICA7OyBwYXVzZQorICAgICAgICByZXQKKworX19fa21wX3g4Nl9wYXVzZSBFTkRQCitfVEVYVCAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBGVU5DVElPTiBfX19rbXBfeDg2X2NwdWlkCis7Cis7IHZvaWQKKzsgX19rbXBfeDg2X2NwdWlkKCBpbnQgbW9kZSwgaW50IG1vZGUyLCBzdHJ1Y3Qga21wX2NwdWlkICpwICk7CitQVUJMSUMgIF9fX2ttcF94ODZfY3B1aWQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX21vZGUkICA9IDgKK19tb2RlMiQgPSAxMgorX3AkICAgICA9IDE2CitfZWF4JCAgID0gMAorX2VieCQgICA9IDQKK19lY3gkICAgPSA4CitfZWR4JCAgID0gMTIKKworX19fa21wX3g4Nl9jcHVpZCBQUk9DIE5FQVIKKworICAgICAgICBwdXNoICAgICAgZWJwCisgICAgICAgIG1vdiAgICAgICBlYnAsIGVzcAorCisgICAgICAgIHB1c2ggICAgICBlZGkKKyAgICAgICAgcHVzaCAgICAgIGVieAorICAgICAgICBwdXNoICAgICAgZWN4CisgICAgICAgIHB1c2ggICAgICBlZHgKKworICAgICAgICBtb3YJICBlYXgsIERXT1JEIFBUUiBfbW9kZSRbZWJwXQorICAgICAgICBtb3YJICBlY3gsIERXT1JEIFBUUiBfbW9kZTIkW2VicF0KKwljcHVpZAkJCQkJOyBRdWVyeSB0aGUgQ1BVSUQgZm9yIHRoZSBjdXJyZW50IHByb2Nlc3NvcgorCisgICAgICAgIG1vdiAgICAgICBlZGksIERXT1JEIFBUUiBfcCRbZWJwXQorCW1vdiAJICBEV09SRCBQVFIgX2VheCRbIGVkaSBdLCBlYXgKKwltb3YgCSAgRFdPUkQgUFRSIF9lYngkWyBlZGkgXSwgZWJ4CisJbW92IAkgIERXT1JEIFBUUiBfZWN4JFsgZWRpIF0sIGVjeAorCW1vdiAJICBEV09SRCBQVFIgX2VkeCRbIGVkaSBdLCBlZHgKKworICAgICAgICBwb3AgICAgICAgZWR4CisgICAgICAgIHBvcCAgICAgICBlY3gKKyAgICAgICAgcG9wICAgICAgIGVieAorICAgICAgICBwb3AgICAgICAgZWRpCisKKyAgICAgICAgbW92ICAgICAgIGVzcCwgZWJwCisgICAgICAgIHBvcCAgICAgICBlYnAKKyAgICAgICAgcmV0CisKK19fX2ttcF94ODZfY3B1aWQgRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBGVU5DVElPTiBfX19rbXBfdGVzdF90aGVuX2FkZDMyCis7Cis7IGttcF9pbnQzMgorOyBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKTsKK1BVQkxJQyAgX19fa21wX3Rlc3RfdGhlbl9hZGQzMgorX3AkID0gNAorX2QkID0gOAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfX19rbXBfdGVzdF90aGVuX2FkZDMyIFBST0MgTkVBUgorCisgICAgICAgIG1vdiAgICAgZWF4LCBEV09SRCBQVFIgX2QkW2VzcF0KKyAgICAgICAgbW92ICAgICBlY3gsIERXT1JEIFBUUiBfcCRbZXNwXQorbG9jayAgICB4YWRkICAgIERXT1JEIFBUUiBbZWN4XSwgZWF4CisgICAgICAgIHJldAorCitfX19rbXBfdGVzdF90aGVuX2FkZDMyIEVORFAKK19URVhUICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEZVTkNUSU9OIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKKzsKKzsga21wX2ludDgKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsIGttcF9pbnQ4IHN2ICk7CitQVUJMSUMgIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorX2N2JCA9IDgKK19zdiQgPSAxMgorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4IFBST0MgTkVBUgorCisgICAgICAgIG1vdiAgICAgICBlY3gsIERXT1JEIFBUUiBfcCRbZXNwXQorICAgICAgICBtb3YgICAgICAgYWwsIEJZVEUgUFRSIF9jdiRbZXNwXQorICAgICAgICBtb3YgICAgICAgZGwsIEJZVEUgUFRSIF9zdiRbZXNwXQorbG9jayAgICBjbXB4Y2hnICAgQllURSBQVFIgW2VjeF0sIGRsCisgICAgICAgIHNldGUgICAgICBhbCAgICAgICAgICAgOyBpZiBhbCA9PSBbZWN4XSBzZXQgYWwgPSAxIGVsc2Ugc2V0IGFsID0gMAorICAgICAgICBhbmQgICAgICAgZWF4LCAxICAgICAgIDsgc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTggRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBGVU5DVElPTiBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNgorOworOyBrbXBfaW50MTYKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworUFVCTElDICBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNgorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA0CitfY3YkID0gOAorX3N2JCA9IDEyCisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2IFBST0MgTkVBUgorCisgICAgICAgIG1vdiAgICAgICBlY3gsIERXT1JEIFBUUiBfcCRbZXNwXQorICAgICAgICBtb3YgICAgICAgYXgsIFdPUkQgUFRSIF9jdiRbZXNwXQorICAgICAgICBtb3YgICAgICAgZHgsIFdPUkQgUFRSIF9zdiRbZXNwXQorbG9jayAgICBjbXB4Y2hnICAgV09SRCBQVFIgW2VjeF0sIGR4CisgICAgICAgIHNldGUgICAgICBhbCAgICAgICAgICAgOyBpZiBheCA9PSBbZWN4XSBzZXQgYWwgPSAxIGVsc2Ugc2V0IGFsID0gMAorICAgICAgICBhbmQgICAgICAgZWF4LCAxICAgICAgIDsgc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2IEVORFAKK19URVhUICAgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRlVOQ1RJT04gX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIKKzsKKzsga21wX2ludDMyCis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKK1BVQkxJQyAgX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorX2N2JCA9IDgKK19zdiQgPSAxMgorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgICAgZWN4LCBEV09SRCBQVFIgX3AkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGVheCwgRFdPUkQgUFRSIF9jdiRbZXNwXQorICAgICAgICBtb3YgICAgICAgZWR4LCBEV09SRCBQVFIgX3N2JFtlc3BdCitsb2NrICAgIGNtcHhjaGcgICBEV09SRCBQVFIgW2VjeF0sIGVkeAorICAgICAgICBzZXRlICAgICAgYWwgICAgICAgICAgIDsgaWYgZWF4ID09IFtlY3hdIHNldCBhbCA9IDEgZWxzZSBzZXQgYWwgPSAwCisgICAgICAgIGFuZCAgICAgICBlYXgsIDEgICAgICAgOyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbgorICAgICAgICByZXQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIgRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBGVU5DVElPTiBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NAorOworOyBrbXBfaW50MzIKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgY3YsIGttcF9pbnQ2NCBzdiApOworUFVCTElDICBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA4CitfY3ZfbG93JCA9IDEyCitfY3ZfaGlnaCQgPSAxNgorX3N2X2xvdyQgPSAyMAorX3N2X2hpZ2gkID0gMjQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQgUFJPQyBORUFSCisKKyAgICAgICAgcHVzaCAgICAgIGVicAorICAgICAgICBtb3YgICAgICAgZWJwLCBlc3AKKyAgICAgICAgcHVzaCAgICAgIGVieAorICAgICAgICBwdXNoICAgICAgZWRpCisgICAgICAgIG1vdiAgICAgICBlZGksIERXT1JEIFBUUiBfcCRbZWJwXQorICAgICAgICBtb3YgICAgICAgZWF4LCBEV09SRCBQVFIgX2N2X2xvdyRbZWJwXQorICAgICAgICBtb3YgICAgICAgZWR4LCBEV09SRCBQVFIgX2N2X2hpZ2gkW2VicF0KKyAgICAgICAgbW92ICAgICAgIGVieCwgRFdPUkQgUFRSIF9zdl9sb3ckW2VicF0KKyAgICAgICAgbW92ICAgICAgIGVjeCwgRFdPUkQgUFRSIF9zdl9oaWdoJFtlYnBdCitsb2NrICAgIGNtcHhjaGc4YiBRV09SRCBQVFIgW2VkaV0KKyAgICAgICAgc2V0ZSAgICAgIGFsICAgICAgICAgICA7IGlmIGVkeDplYXggPT0gW2VkaV0gc2V0IGFsID0gMSBlbHNlIHNldCBhbCA9IDAKKyAgICAgICAgYW5kICAgICAgIGVheCwgMSAgICAgICA7IHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uCisgICAgICAgIHBvcCAgICAgICBlZGkKKyAgICAgICAgcG9wICAgICAgIGVieAorICAgICAgICBtb3YgICAgICAgZXNwLCBlYnAKKyAgICAgICAgcG9wICAgICAgIGVicAorICAgICAgICByZXQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQgRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBGVU5DVElPTiBfX19rbXBfeGNoZ19maXhlZDgKKzsKKzsga21wX2ludDgKKzsgX19rbXBfeGNoZ19maXhlZDgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBkICk7CitQVUJMSUMgIF9fX2ttcF94Y2hnX2ZpeGVkOAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA0CitfZCQgPSA4CisKK19fX2ttcF94Y2hnX2ZpeGVkOCBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgICAgZWN4LCBEV09SRCBQVFIgX3AkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGFsLCAgQllURSBQVFIgX2QkW2VzcF0KK2xvY2sgICAgeGNoZyAgICAgIEJZVEUgUFRSIFtlY3hdLCBhbAorICAgICAgICByZXQKKworX19fa21wX3hjaGdfZml4ZWQ4IEVORFAKK19URVhUICAgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRlVOQ1RJT04gX19fa21wX3hjaGdfZml4ZWQxNgorOworOyBrbXBfaW50MTYKKzsgX19rbXBfeGNoZ19maXhlZDE2KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiBkICk7CitQVUJMSUMgIF9fX2ttcF94Y2hnX2ZpeGVkMTYKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorX2QkID0gOAorCitfX19rbXBfeGNoZ19maXhlZDE2IFBST0MgTkVBUgorCisgICAgICAgIG1vdiAgICAgICBlY3gsIERXT1JEIFBUUiBfcCRbZXNwXQorICAgICAgICBtb3YgICAgICAgYXgsICBXT1JEIFBUUiAgX2QkW2VzcF0KK2xvY2sgICAgeGNoZyAgICAgIFdPUkQgUFRSIFtlY3hdLCBheAorICAgICAgICByZXQKKworX19fa21wX3hjaGdfZml4ZWQxNiBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEZVTkNUSU9OIF9fX2ttcF94Y2hnX2ZpeGVkMzIKKzsKKzsga21wX2ludDMyCis7IF9fa21wX3hjaGdfZml4ZWQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApOworUFVCTElDICBfX19rbXBfeGNoZ19maXhlZDMyCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDQKK19kJCA9IDgKKworX19fa21wX3hjaGdfZml4ZWQzMiBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgICAgZWN4LCBEV09SRCBQVFIgX3AkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGVheCwgRFdPUkQgUFRSIF9kJFtlc3BdCitsb2NrICAgIHhjaGcgICAgICBEV09SRCBQVFIgW2VjeF0sIGVheAorICAgICAgICByZXQKKworX19fa21wX3hjaGdfZml4ZWQzMiBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRlVOQ1RJT04gX19fa21wX3hjaGdfcmVhbDMyCis7Cis7IGttcF9yZWFsMzIKKzsgX19rbXBfeGNoZ19yZWFsMzIoIHZvbGF0aWxlIGttcF9yZWFsMzIgKnAsIGttcF9yZWFsMzIgZCApOworUFVCTElDICBfX19rbXBfeGNoZ19yZWFsMzIKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gOAorX2QkID0gMTIKK19vbGRfdmFsdWUkID0gLTQKKworX19fa21wX3hjaGdfcmVhbDMyIFBST0MgTkVBUgorCisgICAgICAgIHB1c2ggICAgZWJwCisgICAgICAgIG1vdiAgICAgZWJwLCBlc3AKKyAgICAgICAgc3ViICAgICBlc3AsIDQKKyAgICAgICAgcHVzaCAgICBlc2kKKyAgICAgICAgbW92ICAgICBlc2ksIERXT1JEIFBUUiBfcCRbZWJwXQorCisgICAgICAgIGZsZCAgICAgRFdPUkQgUFRSIFtlc2ldCisgICAgICAgICAgICAgICAgICAgICAgICA7OyBsb2FkIDxhZGRyPgorICAgICAgICBmc3QgICAgIERXT1JEIFBUUiBfb2xkX3ZhbHVlJFtlYnBdCisgICAgICAgICAgICAgICAgICAgICAgICA7OyBzdG9yZSBpbnRvIG9sZF92YWx1ZQorCisgICAgICAgIG1vdiAgICAgZWF4LCBEV09SRCBQVFIgX2QkW2VicF0KKworbG9jayAgICB4Y2hnICAgIERXT1JEIFBUUiBbZXNpXSwgZWF4CisKKyAgICAgICAgZmxkICAgICBEV09SRCBQVFIgX29sZF92YWx1ZSRbZWJwXQorICAgICAgICAgICAgICAgICAgICAgICAgOzsgcmV0dXJuIG9sZF92YWx1ZQorICAgICAgICBwb3AgICAgIGVzaQorICAgICAgICBtb3YgICAgIGVzcCwgZWJwCisgICAgICAgIHBvcCAgICAgZWJwCisgICAgICAgIHJldAorCitfX19rbXBfeGNoZ19yZWFsMzIgRU5EUAorX1RFWFQgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBGVU5DVElPTiBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorOworOyBrbXBfaW50OAorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsIGttcF9pbnQ4IHN2ICk7CitQVUJMSUMgIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDQKK19jdiQgPSA4Citfc3YkID0gMTIKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDggUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVjeCwgRFdPUkQgUFRSIF9wJFtlc3BdCisgICAgICAgIG1vdiAgICAgICBhbCwgQllURSBQVFIgX2N2JFtlc3BdCisgICAgICAgIG1vdiAgICAgICBkbCwgQllURSBQVFIgX3N2JFtlc3BdCitsb2NrICAgIGNtcHhjaGcgICBCWVRFIFBUUiBbZWN4XSwgZGwKKyAgICAgICAgcmV0CisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4IEVORFAKK19URVhUICAgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRlVOQ1RJT04gX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2Cis7Cis7IGttcF9pbnQxNgorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworUFVCTElDICBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorX2N2JCA9IDgKK19zdiQgPSAxMgorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYgUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVjeCwgRFdPUkQgUFRSIF9wJFtlc3BdCisgICAgICAgIG1vdiAgICAgICBheCwgV09SRCBQVFIgX2N2JFtlc3BdCisgICAgICAgIG1vdiAgICAgICBkeCwgV09SRCBQVFIgX3N2JFtlc3BdCitsb2NrICAgIGNtcHhjaGcgICBXT1JEIFBUUiBbZWN4XSwgZHgKKyAgICAgICAgcmV0CisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNiBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEZVTkNUSU9OIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMgorOworOyBrbXBfaW50MzIKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKK1BVQkxJQyAgX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDQKK19jdiQgPSA4Citfc3YkID0gMTIKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyIFBST0MgTkVBUgorCisgICAgICAgIG1vdiAgICAgICBlY3gsIERXT1JEIFBUUiBfcCRbZXNwXQorICAgICAgICBtb3YgICAgICAgZWF4LCBEV09SRCBQVFIgX2N2JFtlc3BdCisgICAgICAgIG1vdiAgICAgICBlZHgsIERXT1JEIFBUUiBfc3YkW2VzcF0KK2xvY2sgICAgY21weGNoZyAgIERXT1JEIFBUUiBbZWN4XSwgZWR4CisgICAgICAgIHJldAorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIgRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBGVU5DVElPTiBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQKKzsKKzsga21wX2ludDY0Cis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7CitQVUJMSUMgIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA4CitfY3ZfbG93JCA9IDEyCitfY3ZfaGlnaCQgPSAxNgorX3N2X2xvdyQgPSAyMAorX3N2X2hpZ2gkID0gMjQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0IFBST0MgTkVBUgorCisgICAgICAgIHB1c2ggICAgICBlYnAKKyAgICAgICAgbW92ICAgICAgIGVicCwgZXNwCisgICAgICAgIHB1c2ggICAgICBlYngKKyAgICAgICAgcHVzaCAgICAgIGVkaQorICAgICAgICBtb3YgICAgICAgZWRpLCBEV09SRCBQVFIgX3AkW2VicF0KKyAgICAgICAgbW92ICAgICAgIGVheCwgRFdPUkQgUFRSIF9jdl9sb3ckW2VicF0KKyAgICAgICAgbW92ICAgICAgIGVkeCwgRFdPUkQgUFRSIF9jdl9oaWdoJFtlYnBdCisgICAgICAgIG1vdiAgICAgICBlYngsIERXT1JEIFBUUiBfc3ZfbG93JFtlYnBdCisgICAgICAgIG1vdiAgICAgICBlY3gsIERXT1JEIFBUUiBfc3ZfaGlnaCRbZWJwXQorbG9jayAgICBjbXB4Y2hnOGIgUVdPUkQgUFRSIFtlZGldCisgICAgICAgIHBvcCAgICAgICBlZGkKKyAgICAgICAgcG9wICAgICAgIGVieAorICAgICAgICBtb3YgICAgICAgZXNwLCBlYnAKKyAgICAgICAgcG9wICAgICAgIGVicAorICAgICAgICByZXQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0IEVORFAKK19URVhUICAgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRlVOQ1RJT04gX19fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQKKzsKKzsgdm9pZAorOyBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsgICAgICAgcDogICAgICA0KCVlc3ApCitQVUJMSUMgIF9fX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDQKKworX19fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQgUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVheCwgRFdPUkQgUFRSIF9wJFtlc3BdCisgICAgICAgIGZsZGN3ICAgICBXT1JEIFBUUiBbZWF4XQorICAgICAgICByZXQKKworX19fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQgRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBGVU5DVElPTiBfX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQKKzsKKzsgdm9pZAorOyBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZCgga21wX2ludDE2ICpwICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7ICAgICAgIHA6ICAgICAgNCglZXNwKQorUFVCTElDICBfX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorCitfX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQgUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVheCwgRFdPUkQgUFRSIF9wJFtlc3BdCisgICAgICAgIGZzdGN3ICAgICBXT1JEIFBUUiBbZWF4XQorICAgICAgICByZXQKKworX19fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkIEVORFAKK19URVhUICAgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRlVOQ1RJT04gX19fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQKKzsKKzsgdm9pZAorOyBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkKCk7CitQVUJMSUMgIF9fX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQgUFJPQyBORUFSCisKKyAgICAgICAgZm5jbGV4CisgICAgICAgIHJldAorCitfX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRlVOQ1RJT04gX19fa21wX2ludm9rZV9taWNyb3Rhc2sKKzsKKzsgdHlwZWRlZiB2b2lkICAoKm1pY3JvdGFza190KSggaW50ICpndGlkLCBpbnQgKnRpZCwgLi4uICk7Cis7Cis7IGludAorOyBfX2ttcF9pbnZva2VfbWljcm90YXNrKCBtaWNyb3Rhc2tfdCBwa2ZuLAorOyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3RpZCwgaW50IHRpZCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsIHZvaWQgKnBfYXJndltdICkKK1BVQkxJQyAgX19fa21wX2ludm9rZV9taWNyb3Rhc2sKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3BrZm4kID0gOAorX2d0aWQkID0gMTIKK190aWQkID0gMTYKK19hcmdjJCA9IDIwCitfYXJndiQgPSAyNAoraWYgT01QVF9TVVBQT1JUCitfZXhpdF9mcmFtZSQgPSAyOAorZW5kaWYKK19pJCA9IC04Citfc3RrX2FkaiQgPSAtMTYKK192cHRyJCA9IC0xMgorX3FwdHIkID0gLTQKKworX19fa21wX2ludm9rZV9taWNyb3Rhc2sgUFJPQyBORUFSCis7IExpbmUgMTAyCisgICAgICAgIHB1c2ggICAgZWJwCisgICAgICAgIG1vdiAgICAgZWJwLCBlc3AKKyAgICAgICAgc3ViICAgICBlc3AsIDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAwMDAwMDAxMEgKKyAgICAgICAgcHVzaCAgICBlYngKKyAgICAgICAgcHVzaCAgICBlc2kKKyAgICAgICAgcHVzaCAgICBlZGkKK2lmIE9NUFRfU1VQUE9SVAorICAgICAgICBtb3YgICAgIGVheCwgRFdPUkQgUFRSIF9leGl0X2ZyYW1lJFtlYnBdCisgICAgICAgIG1vdiAgICAgRFdPUkQgUFRSIFtlYXhdLCBlYnAKK2VuZGlmCis7IExpbmUgMTE0CisgICAgICAgIG1vdiAgICAgZWF4LCBEV09SRCBQVFIgX2FyZ2MkW2VicF0KKyAgICAgICAgbW92ICAgICBEV09SRCBQVFIgX2kkW2VicF0sIGVheAorCis7OyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlsZWEgICAgIGVkeCwgRFdPUkQgUFRSIFtlYXgqNCs4XQorCW1vdiAgICAgZWN4LCBlc3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgU2F2ZSBjdXJyZW50IFNQIGludG8gRUNYCisJbW92CWVheCxlZHgJCTsgU2F2ZSB0aGUgc2l6ZSBvZiB0aGUgYXJncyBpbiBlYXgKKwlzdWIJZWN4LGVkeAkJOyBlc3AtKCgjYXJncysyKSo0KSAtPiBlY3ggLS0gd2l0aG91dCBtb2RzLCBzdGFjayBwdHIgd291bGQgYmUgdGhpcworCW1vdgllZHgsZWN4CQk7IFNhdmUgdG8gZWR4CisJYW5kCWVjeCwtMTI4CTsgTWFzayBvZmYgNyBiaXRzCisJc3ViCWVkeCxlY3gJCTsgQW1vdW50IHRvIHN1YnRyYWN0IGZyb20gZXNwCisJc3ViCWVzcCxlZHgJCTsgUHJlcGFyZSBzdGFjayBwdHItLSBOb3cgaXQgd2lsbCBiZSBhbGlnbmVkIG9uIDEyOC1ieXRlIGJvdW5kYXJ5IGF0IHRoZSBjYWxsCisKKwlhZGQJZWR4LGVheAkJOyBDYWxjdWxhdGUgdG90YWwgc2l6ZSBvZiB0aGUgc3RhY2sgZGVjcmVtZW50LgorICAgICAgICBtb3YgICAgIERXT1JEIFBUUiBfc3RrX2FkaiRbZWJwXSwgZWR4Cis7OyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICBqbXAgICAgIFNIT1JUICRMMjIyMzcKKyRMMjIyMzg6CisgICAgICAgIG1vdiAgICAgZWN4LCBEV09SRCBQVFIgX2kkW2VicF0KKyAgICAgICAgc3ViICAgICBlY3gsIDEKKyAgICAgICAgbW92ICAgICBEV09SRCBQVFIgX2kkW2VicF0sIGVjeAorJEwyMjIzNzoKKyAgICAgICAgY21wICAgICBEV09SRCBQVFIgX2kkW2VicF0sIDAKKyAgICAgICAgamxlICAgICBTSE9SVCAkTDIyMjM5Cis7IExpbmUgMTE2CisgICAgICAgIG1vdiAgICAgZWR4LCBEV09SRCBQVFIgX2kkW2VicF0KKyAgICAgICAgbW92ICAgICBlYXgsIERXT1JEIFBUUiBfYXJndiRbZWJwXQorICAgICAgICBtb3YgICAgIGVjeCwgRFdPUkQgUFRSIFtlYXgrZWR4KjQtNF0KKyAgICAgICAgbW92ICAgICBEV09SRCBQVFIgX3ZwdHIkW2VicF0sIGVjeAorOyBMaW5lIDEyMworICAgICAgICBtb3YgICAgIGVheCwgRFdPUkQgUFRSIF92cHRyJFtlYnBdCis7IExpbmUgMTI0CisgICAgICAgIHB1c2ggICAgZWF4Cis7IExpbmUgMTI3CisgICAgICAgIGptcCAgICAgU0hPUlQgJEwyMjIzOAorJEwyMjIzOToKKzsgTGluZSAxMjkKKyAgICAgICAgbGVhICAgICBlZHgsIERXT1JEIFBUUiBfdGlkJFtlYnBdCisgICAgICAgIG1vdiAgICAgRFdPUkQgUFRSIF92cHRyJFtlYnBdLCBlZHgKKzsgTGluZSAxMzAKKyAgICAgICAgbGVhICAgICBlYXgsIERXT1JEIFBUUiBfZ3RpZCRbZWJwXQorICAgICAgICBtb3YgICAgIERXT1JEIFBUUiBfcXB0ciRbZWJwXSwgZWF4Cis7IExpbmUgMTQzCisgICAgICAgIG1vdiAgICAgZWF4LCBEV09SRCBQVFIgX3ZwdHIkW2VicF0KKzsgTGluZSAxNDQKKyAgICAgICAgcHVzaCAgICBlYXgKKzsgTGluZSAxNDUKKyAgICAgICAgbW92ICAgICBlYXgsIERXT1JEIFBUUiBfcXB0ciRbZWJwXQorOyBMaW5lIDE0NgorICAgICAgICBwdXNoICAgIGVheAorOyBMaW5lIDE0NworICAgICAgICBjYWxsICAgIERXT1JEIFBUUiBfcGtmbiRbZWJwXQorOyBMaW5lIDE0OAorICAgICAgICBhZGQgICAgIGVzcCwgRFdPUkQgUFRSIF9zdGtfYWRqJFtlYnBdCis7IExpbmUgMTUyCisgICAgICAgIG1vdiAgICAgZWF4LCAxCis7IExpbmUgMTUzCisgICAgICAgIHBvcCAgICAgZWRpCisgICAgICAgIHBvcCAgICAgZXNpCisgICAgICAgIHBvcCAgICAgZWJ4CisgICAgICAgIG1vdiAgICAgZXNwLCBlYnAKKyAgICAgICAgcG9wICAgICBlYnAKKyAgICAgICAgcmV0ICAgICAwCitfX19rbXBfaW52b2tlX21pY3JvdGFzayBFTkRQCitfVEVYVCAgIEVORFMKKworZW5kaWYKKworOyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSW50ZWwoUikgNjQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworaWZkZWYgX01fQU1ENjQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBGVU5DVElPTiBfX2ttcF94ODZfY3B1aWQKKzsKKzsgdm9pZAorOyBfX2ttcF94ODZfY3B1aWQoIGludCBtb2RlLCBpbnQgbW9kZTIsIHN0cnVjdCBrbXBfY3B1aWQgKnAgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsJbW9kZToJCWVjeAorOwltb2RlMjoJCWVkeAorOwljcHVpZF9idWZmZXI6IAlyOAorUFVCTElDICBfX2ttcF94ODZfY3B1aWQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF94ODZfY3B1aWQgUFJPQyBGUkFNRSA7TkVBUgorCisgICAgICAgIHB1c2ggICAgICByYnAKKyAgICAgICAgLnB1c2hyZWcgIHJicAorICAgICAgICBtb3YgICAgICAgcmJwLCByc3AKKyAgICAgICAgLnNldGZyYW1lIHJicCwgMAorICAgICAgICBwdXNoICAgICAgcmJ4CQkJCTsgY2FsbGVlLXNhdmUgcmVnaXN0ZXIKKyAgICAgICAgLnB1c2hyZWcgIHJieAorICAgICAgICAuRU5EUFJPTE9HCisKKwltb3YJICByMTAsIHI4ICAgICAgICAgICAgICAgICAgICAgICA7IHAgcGFyYW1ldGVyCisgICAgICAgIG1vdgkgIGVheCwgZWN4CQkJOyBtb2RlIHBhcmFtZXRlcgorICAgICAgICBtb3YJICBlY3gsIGVkeCAgICAgICAgICAgICAgICAgICAgICA7IG1vZGUyIHBhcmFtZXRlcgorCWNwdWlkCQkJCQk7IFF1ZXJ5IHRoZSBDUFVJRCBmb3IgdGhlIGN1cnJlbnQgcHJvY2Vzc29yCisKKwltb3YgCSAgRFdPUkQgUFRSIDBbIHIxMCBdLCBlYXgJOyBzdG9yZSByZXN1bHRzIGludG8gYnVmZmVyCisJbW92IAkgIERXT1JEIFBUUiA0WyByMTAgXSwgZWJ4CisJbW92IAkgIERXT1JEIFBUUiA4WyByMTAgXSwgZWN4CisJbW92IAkgIERXT1JEIFBUUiAxMlsgcjEwIF0sIGVkeAorCisgICAgICAgIHBvcCAgICAgICByYngJCQkJOyBjYWxsZWUtc2F2ZSByZWdpc3RlcgorICAgICAgICBtb3YgICAgICAgcnNwLCByYnAKKyAgICAgICAgcG9wICAgICAgIHJicAorICAgICAgICByZXQKKworX19rbXBfeDg2X2NwdWlkIEVORFAKK19URVhUICAgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBGVU5DVElPTiBfX2ttcF90ZXN0X3RoZW5fYWRkMzIKKzsKKzsga21wX2ludDMyCis7IF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApOworOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJZDoJZWR4Cis7Cis7IHJldHVybjogCWVheAorUFVCTElDICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19rbXBfdGVzdF90aGVuX2FkZDMyIFBST0MgO05FQVIKKworICAgICAgICBtb3YgICAgIGVheCwgZWR4Citsb2NrICAgIHhhZGQgICAgRFdPUkQgUFRSIFtyY3hdLCBlYXgKKyAgICAgICAgcmV0CisKK19fa21wX3Rlc3RfdGhlbl9hZGQzMiBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEZVTkNUSU9OIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NAorOworOyBrbXBfaW50MzIKKzsgX19rbXBfdGVzdF90aGVuX2FkZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwlkOglyZHgKKzsKKzsgcmV0dXJuOiAJcmF4CitQVUJMSUMgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfX2ttcF90ZXN0X3RoZW5fYWRkNjQgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgcmF4LCByZHgKK2xvY2sgICAgeGFkZCAgICBRV09SRCBQVFIgW3JjeF0sIHJheAorICAgICAgICByZXQKKworX19rbXBfdGVzdF90aGVuX2FkZDY0IEVORFAKK19URVhUICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4Cis7Cis7IGttcF9pbnQ4Cis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGN2LCBrbXBfaW50OCBzdiApOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJY3Y6CWVkeAorOwlzdjoJcjhkCis7Cis7IHJldHVybjoJZWF4CitQVUJMSUMgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICAgIGFsLCBkbAk7ICJjdiIKKwltb3YJICBlZHgsIHI4ZAk7ICJzdiIKK2xvY2sgICAgY21weGNoZyAgIEJZVEUgUFRSIFtyY3hdLCBkbAorICAgICAgICBzZXRlICAgICAgYWwgICAgICAgICAgIAk7IGlmIGFsID09IFtyY3hdIHNldCBhbCA9IDEgZWxzZSBzZXQgYWwgPSAwCisgICAgICAgIGFuZCAgICAgICByYXgsIDEgICAgICAgCTsgc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNgorOworOyBrbXBfaW50MTYKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJY3Y6CWVkeAorOwlzdjoJcjhkCis7Cis7IHJldHVybjoJZWF4CitQVUJMSUMgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2IFBST0MgO05FQVIKKworICAgICAgICBtb3YgICAgICAgYXgsIGR4CTsgImN2IgorCW1vdgkgIGVkeCwgcjhkCTsgInN2IgorbG9jayAgICBjbXB4Y2hnICAgV09SRCBQVFIgW3JjeF0sIGR4CisgICAgICAgIHNldGUgICAgICBhbCAgICAgICAgICAgCTsgaWYgYXggPT0gW3JjeF0gc2V0IGFsID0gMSBlbHNlIHNldCBhbCA9IDAKKyAgICAgICAgYW5kICAgICAgIHJheCwgMSAgICAgICAJOyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbgorICAgICAgICByZXQKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMgorOworOyBrbXBfaW50MzIKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsIGttcF9pbnQzMiBzdiApOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJY3Y6CWVkeAorOwlzdjoJcjhkCis7Cis7IHJldHVybjoJZWF4CitQVUJMSUMgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyIFBST0MgO05FQVIKKworICAgICAgICBtb3YgICAgICAgZWF4LCBlZHgJOyAiY3YiCisJbW92CSAgZWR4LCByOGQJOyAic3YiCitsb2NrICAgIGNtcHhjaGcgICBEV09SRCBQVFIgW3JjeF0sIGVkeAorICAgICAgICBzZXRlICAgICAgYWwgICAgICAgICAgIAk7IGlmIGVheCA9PSBbcmN4XSBzZXQgYWwgPSAxIGVsc2Ugc2V0IGFsID0gMAorICAgICAgICBhbmQgICAgICAgcmF4LCAxICAgICAgIAk7IHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uCisgICAgICAgIHJldAorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyIEVORFAKK19URVhUICAgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0Cis7Cis7IGttcF9pbnQzMgorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwljdjoJcmR4Cis7CXN2OglyOAorOworOyByZXR1cm46CWVheAorUFVCTElDICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICAgIHJheCwgcmR4CTsgImN2IgorCW1vdgkgIHJkeCwgcjgJOyAic3YiCitsb2NrICAgIGNtcHhjaGcgICBRV09SRCBQVFIgW3JjeF0sIHJkeAorICAgICAgICBzZXRlICAgICAgYWwgICAgICAgICAgIDsgaWYgcmF4ID09IFtyY3hdIHNldCBhbCA9IDEgZWxzZSBzZXQgYWwgPSAwCisgICAgICAgIGFuZCAgICAgICByYXgsIDEgICAgICAgOyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbgorICAgICAgICByZXQKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRlVOQ1RJT04gX19fa21wX3hjaGdfZml4ZWQ4Cis7Cis7IGttcF9pbnQ4Cis7IF9fa21wX3hjaGdfZml4ZWQ4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggZCApOworOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJZDoJZGwKKzsKKzsgcmV0dXJuOiAJYWwKK1BVQkxJQyAgX19rbXBfeGNoZ19maXhlZDgKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF94Y2hnX2ZpeGVkOCBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICAgIGFsLCAgZGwKK2xvY2sgICAgeGNoZyAgICAgIEJZVEUgUFRSIFtyY3hdLCBhbAorICAgICAgICByZXQKKworX19rbXBfeGNoZ19maXhlZDggRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEZVTkNUSU9OIF9fX2ttcF94Y2hnX2ZpeGVkMTYKKzsKKzsga21wX2ludDE2Cis7IF9fa21wX3hjaGdfZml4ZWQxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgZCApOworOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJZDoJZHgKKzsKKzsgcmV0dXJuOiAJYXgKK1BVQkxJQyAgX19rbXBfeGNoZ19maXhlZDE2CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfeGNoZ19maXhlZDE2IFBST0MgO05FQVIKKworICAgICAgICBtb3YgICAgICAgYXgsICBkeAorbG9jayAgICB4Y2hnICAgICAgV09SRCBQVFIgW3JjeF0sIGF4CisgICAgICAgIHJldAorCitfX2ttcF94Y2hnX2ZpeGVkMTYgRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEZVTkNUSU9OIF9fX2ttcF94Y2hnX2ZpeGVkMzIKKzsKKzsga21wX2ludDMyCis7IF9fa21wX3hjaGdfZml4ZWQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApOworOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJZDoJZWR4Cis7Cis7IHJldHVybjogCWVheAorUFVCTElDICBfX2ttcF94Y2hnX2ZpeGVkMzIKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19rbXBfeGNoZ19maXhlZDMyIFBST0MgO05FQVIKKworICAgICAgICBtb3YgICAgIGVheCwgZWR4Citsb2NrICAgIHhjaGcgICAgRFdPUkQgUFRSIFtyY3hdLCBlYXgKKyAgICAgICAgcmV0CisKK19fa21wX3hjaGdfZml4ZWQzMiBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEZVTkNUSU9OIF9fX2ttcF94Y2hnX2ZpeGVkNjQKKzsKKzsga21wX2ludDY0Cis7IF9fa21wX3hjaGdfZml4ZWQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgZCApOworOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJZDoJcmR4Cis7Cis7IHJldHVybjogCXJheAorUFVCTElDICBfX2ttcF94Y2hnX2ZpeGVkNjQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19rbXBfeGNoZ19maXhlZDY0IFBST0MgO05FQVIKKworICAgICAgICBtb3YgICAgIHJheCwgcmR4Citsb2NrICAgIHhjaGcgICAgUVdPUkQgUFRSIFtyY3hdLCByYXgKKyAgICAgICAgcmV0CisKK19fa21wX3hjaGdfZml4ZWQ2NCBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgKKzsKKzsga21wX2ludDgKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGN2LCBrbXBfaW50OCBzdiApOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJY3Y6CWVkeAorOwlzdjoJcjhkCis7Cis7IHJldHVybjoJZWF4CitQVUJMSUMgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4IFBST0MgO05FQVIKKyAgICAgICAgbW92ICAgICAgIGFsLCBkbAk7ICJjdiIKKwltb3YJICBlZHgsIHI4ZAk7ICJzdiIKK2xvY2sgICAgY21weGNoZyAgIEJZVEUgUFRSIFtyY3hdLCBkbAorICAgICAgICAgICAgICAgICAgICAgICAgOyBDb21wYXJlIEFMIHdpdGggW3JjeF0uICBJZiBlcXVhbCBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIDsgWkYgYW5kIGV4Y2hhbmdlIERMIHdpdGggW3JjeF0uICBFbHNlLCBjbGVhcgorICAgICAgICAgICAgICAgICAgICAgICAgOyBaRiBhbmQgbG9hZCBbcmN4XSBpbnRvIEFMLgorICAgICAgICByZXQKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYKKzsKKzsga21wX2ludDE2Cis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiBjdiwga21wX2ludDE2IHN2ICk7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwljdjoJZWR4Cis7CXN2OglyOGQKKzsKKzsgcmV0dXJuOgllYXgKK1BVQkxJQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNiBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICAgIGF4LCBkeAk7ICJjdiIKKwltb3YJICBlZHgsIHI4ZAk7ICJzdiIKK2xvY2sgICAgY21weGNoZyAgIFdPUkQgUFRSIFtyY3hdLCBkeAorICAgICAgICByZXQKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYgRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyCis7Cis7IGttcF9pbnQzMgorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsIGttcF9pbnQzMiBzdiApOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJY3Y6CWVkeAorOwlzdjoJcjhkCis7Cis7IHJldHVybjoJZWF4CitQVUJMSUMgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICBlYXgsIGVkeAk7ICJjdiIKKwltb3YJICBlZHgsIHI4ZAk7ICJzdiIKK2xvY2sgICAgY21weGNoZyAgIERXT1JEIFBUUiBbcmN4XSwgZWR4CisgICAgICAgIHJldAorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQKKzsKKzsga21wX2ludDY0Cis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwljdjoJcmR4Cis7CXN2OglyOAorOworOyByZXR1cm46CXJheAorUFVCTElDICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0IFBST0MgO05FQVIKKworICAgICAgICBtb3YgICAgICAgcmF4LCByZHgJOyAiY3YiCisJbW92CSAgcmR4LCByOAk7ICJzdiIKK2xvY2sgICAgY21weGNoZyAgIFFXT1JEIFBUUiBbcmN4XSwgcmR4CisgICAgICAgIHJldAorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NCBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfbG9vcDgKKzsKKzsga21wX2ludDgKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfbG9vcDgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBjdiwga21wX2ludDggc3YgKTsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWN2OgllZHgKKzsJc3Y6CXI4ZAorOworOyByZXR1cm46CWFsCitQVUJMSUMgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX2xvb3A4CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfbG9vcDggUFJPQyA7TkVBUgorJF9fa21wX2xvb3A6CisgICAgICAgIG1vdiAgICAgICBhbCwgZGwJOyAiY3YiCisJbW92CSAgZWR4LCByOGQJOyAic3YiCitsb2NrICAgIGNtcHhjaGcgICBCWVRFIFBUUiBbcmN4XSwgZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDsgQ29tcGFyZSBBTCB3aXRoIFtyY3hdLiAgSWYgZXF1YWwgc2V0CisgICAgICAgICAgICAgICAgICAgICAgICA7IFpGIGFuZCBleGNoYW5nZSBETCB3aXRoIFtyY3hdLiAgRWxzZSwgY2xlYXIKKyAgICAgICAgICAgICAgICAgICAgICAgIDsgWkYgYW5kIGxvYWQgW3JjeF0gaW50byBBTC4KKyAgICAgICAganogICAgIAlTSE9SVCAkX19rbXBfc3VjY2VzcworCisgICAgICAgIGRiICAgICAgMGYzSAorICAgICAgICBkYiAgICAgIDA5MEggICAgCQk7IHBhdXNlCisKKwlqbXAJU0hPUlQgJF9fa21wX2xvb3AKKworJF9fa21wX3N1Y2Nlc3M6CisgICAgICAgIHJldAorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9sb29wOCBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRlVOQ1RJT04gX19rbXBfeGNoZ19yZWFsMzIKKzsKKzsga21wX3JlYWwzMgorOyBfX2ttcF94Y2hnX3JlYWwzMiggdm9sYXRpbGUga21wX3JlYWwzMiAqcCwga21wX3JlYWwzMiBkICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOyAgICAgICBkOgl4bW0xIChsb3dlciA0IGJ5dGVzKQorOworOyByZXR1cm46CXhtbTAgKGxvd2VyIDQgYnl0ZXMpCitQVUJMSUMgIF9fa21wX3hjaGdfcmVhbDMyCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX3hjaGdfcmVhbDMyIFBST0MgO05FQVIKKworCW1vdmQJZWF4LCB4bW0xCQk7IGxvYWQgZAorCitsb2NrICAgIHhjaGcgICAgRFdPUkQgUFRSIFtyY3hdLCBlYXgKKworCW1vdmQJeG1tMCwgZWF4CQk7IGxvYWQgb2xkIHZhbHVlIGludG8gcmV0dXJuIHJlZ2lzdGVyCisgICAgICAgIHJldAorCitfX2ttcF94Y2hnX3JlYWwzMiBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEZVTkNUSU9OIF9fa21wX3hjaGdfcmVhbDY0Cis7Cis7IGttcF9yZWFsNjQKKzsgX19rbXBfeGNoZ19yZWFsNjQoIHZvbGF0aWxlIGttcF9yZWFsNjQgKnAsIGttcF9yZWFsNjQgZCApOworOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJZDoJeG1tMSAobG93ZXIgOCBieXRlcykKKzsKKzsgcmV0dXJuOgl4bW0wIChsb3dlciA4IGJ5dGVzKQorUFVCTElDICBfX2ttcF94Y2hnX3JlYWw2NAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfX2ttcF94Y2hnX3JlYWw2NCBQUk9DIDtORUFSCisKKwltb3ZkCXJheCwgeG1tMQkJOyBsb2FkICJkIgorCitsb2NrICAgIHhjaGcgICAgUVdPUkQgUFRSIFtyY3hdLCByYXgKKworCW1vdmQJeG1tMCwgcmF4CQk7IGxvYWQgb2xkIHZhbHVlIGludG8gcmV0dXJuIHJlZ2lzdGVyCisgICAgICAgIHJldAorCitfX2ttcF94Y2hnX3JlYWw2NCBFTkRQCitfVEVYVCAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBGVU5DVElPTiBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCis7Cis7IHZvaWQKKzsgX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCgga21wX2ludDE2ICpwICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorUFVCTElDICBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQgUFJPQyA7TkVBUgorCisgICAgICAgIGZsZGN3ICAgV09SRCBQVFIgW3JjeF0KKyAgICAgICAgcmV0CisKK19fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQgRU5EUAorX1RFWFQgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBGVU5DVElPTiBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZAorOworOyB2b2lkCis7IF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4CitQVUJMSUMgIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkIFBST0MgO05FQVIKKworICAgICAgICBmc3RjdyAgIFdPUkQgUFRSIFtyY3hdCisgICAgICAgIHJldAorCitfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZCBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEZVTkNUSU9OIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQKKzsKKzsgdm9pZAorOyBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkKCkKK1BVQkxJQyAgX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkIFBST0MgO05FQVIKKworICAgICAgICBmbmNsZXgKKyAgICAgICAgcmV0CisKK19fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQgRU5EUAorX1RFWFQgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBGVU5DVElPTiBfX2ttcF9pbnZva2VfbWljcm90YXNrCis7Cis7IHR5cGVkZWYgdm9pZCAgKCptaWNyb3Rhc2tfdCkoIGludCAqZ3RpZCwgaW50ICp0aWQsIC4uLiApOworOworOyBpbnQKKzsgX19rbXBfaW52b2tlX21pY3JvdGFzayggbWljcm90YXNrX3QgcGtmbiwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGd0aWQsIGludCB0aWQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmdjLCB2b2lkICpwX2FyZ3ZbXSApIHsKKzsKKzsgICAgICgqcGtmbikgKCAmZ3RpZCwgJnRpZCwgYXJndlswXSwgLi4uICk7Cis7ICAgICByZXR1cm4gMTsKKzsgfQorOworOyBub3RlOgorOyAgICAgIGp1c3QgYmVmb3JlIGNhbGwgdG8gcGtmbiBtdXN0IGhhdmUgcnNwIDEyOC1ieXRlIGFsaWduZWQgZm9yIGNvbXBpbGVyCis7Cis7IHBhcmFtZXRlcnM6Cis7ICAgICAgcmN4OiAgIHBrZm4JMTZbcmJwXQorOyAgICAgIGVkeDogICBndGlkCTI0W3JicF0KKzsgICAgICByOGQ6ICAgdGlkCTMyW3JicF0KKzsgICAgICByOWQ6ICAgYXJnYwk0MFtyYnBdCis7ICAgICAgW3N0XTogIHBfYXJndgk0OFtyYnBdCis7Cis7IHJlZyB0ZW1wczoKKzsgICAgICByYXg6ICAgdXNlZCBhbGwgb3ZlciB0aGUgcGxhY2UKKzsgICAgICByZHg6ICAgdXNlZCBhbGwgb3ZlciB0aGUgcGxhY2UKKzsgICAgICByY3g6ICAgdXNlZCBhcyBhcmd1bWVudCBjb3VudGVyIGZvciBwdXNoIHBhcm1zIGxvb3AKKzsgICAgICByMTA6ICAgdXNlZCB0byBob2xkIHBrZm4gZnVuY3Rpb24gcG9pbnRlciBhcmd1bWVudAorOworOyByZXR1cm46ICAgICAgZWF4ICAgIChhbHdheXMgMS9UUlVFKQorJF9wa2ZuICAgPSAxNgorJF9ndGlkICAgPSAyNAorJF90aWQgICAgPSAzMgorJF9hcmdjICAgPSA0MAorJF9wX2FyZ3YgPSA0OAoraWYgT01QVF9TVVBQT1JUCiskX2V4aXRfZnJhbWUgPSA1NgorZW5kaWYKKworUFVCTElDICBfX2ttcF9pbnZva2VfbWljcm90YXNrCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfaW52b2tlX21pY3JvdGFzayBQUk9DIEZSQU1FIDtORUFSCisJbW92CVFXT1JEIFBUUiAxNltyc3BdLCByZHgJOyBob21lIGd0aWQgcGFyYW1ldGVyCisJbW92IAlRV09SRCBQVFIgMjRbcnNwXSwgcjgJOyBob21lIHRpZCBwYXJhbWV0ZXIKKyAgICAgICAgcHVzaCAgICByYnAJCTsgc2F2ZSBiYXNlIHBvaW50ZXIKKyAgICAgICAgLnB1c2hyZWcgcmJwCisJc3ViCXJzcCwgMAkJOyBubyBmaXhlZCBhbGxvY2F0aW9uIG5lY2Vzc2FyeSAtIGVuZCBwcm9sb2cKKworICAgICAgICBsZWEgICAgIHJicCwgUVdPUkQgUFRSIFtyc3BdICAgCTsgZXN0YWJsaXNoIHRoZSBiYXNlIHBvaW50ZXIKKyAgICAgICAgLnNldGZyYW1lIHJicCwgMAorICAgICAgICAuRU5EUFJPTE9HCitpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgbW92ICAgICByYXgsIFFXT1JEIFBUUiAkX2V4aXRfZnJhbWVbcmJwXQorICAgICAgICBtb3YgICAgIFFXT1JEIFBUUiBbcmF4XSwgcmJwCitlbmRpZgorCW1vdglyMTAsIHJjeAk7IHNhdmUgcGtmbiBwb2ludGVyIGZvciBsYXRlcgorCis7OyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgbW92ICAgICByYXgsIHI5CQk7IHJheCA8PSBhcmdjCisgICAgICAgIGNtcCAgICAgcmF4LCAyCisgICAgICAgIGpnZSAgICAgU0hPUlQgJF9rbXBfaW52b2tlX3N0YWNrX2FsaWduCisgICAgICAgIG1vdiAgICAgcmF4LCAyICAgICAgICAgIDsgc2V0IDQgaG9tZXMgaWYgbGVzcyB0aGFuIDIgcGFybXMKKyRfa21wX2ludm9rZV9zdGFja19hbGlnbjoKKwlsZWEgICAgIHJkeCwgUVdPUkQgUFRSIFtyYXgqOCsxNl0gOyByYXggPD0gKGFyZ2MgKyAyKSAqIDgKKwltb3YgICAgIHJheCwgcnNwICAgICAgICA7IFNhdmUgY3VycmVudCBTUCBpbnRvIHJheAorCXN1YglyYXgsIHJkeAk7IHJzcCAtICgoYXJnYysyKSo4KSAtPiByYXgKKwkJCQk7IHdpdGhvdXQgYWxpZ24sIHJzcCB3b3VsZCBiZSB0aGlzCisJYW5kICAgICByYXgsIC0xMjggICAgICAgOyBNYXNrIG9mZiA3IGJpdHMgKDEyOC1ieXRlIGFsaWduKQorCWFkZCAgICAgcmF4LCByZHggICAgICAgIDsgYWRkIHNwYWNlIGZvciBwdXNoJ3MgaW4gYSBsb29wIGJlbG93CisJbW92ICAgICByc3AsIHJheCAgICAgICAgOyBQcmVwYXJlIHRoZSBzdGFjayBwdHIKKwkJCQk7IE5vdyBpdCB3aWxsIGFsaWduIHRvIDEyOC1ieXRlIGF0IHRoZSBjYWxsCis7OyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCQkJOyBzZXR1cCBwa2ZuIHBhcmFtZXRlciBzdGFjaworCW1vdglyYXgsIHI5CQk7IHJheCA8PSBhcmdjCisJc2hsCXJheCwgMwkJOyByYXggPD0gYXJnYyo4CisJbW92CXJkeCwgUVdPUkQgUFRSICRfcF9hcmd2W3JicF0JOyByZHggPD0gcF9hcmd2CisJYWRkCXJkeCwgcmF4CTsgcmR4IDw9ICZwX2FyZ3ZbYXJnY10KKwltb3YJcmN4LCByOQkJOyByY3ggPD0gYXJnYworCWplY3h6CVNIT1JUICRfa21wX2ludm9rZV9wYXNzX3Bhcm1zCTsgbm90aGluZyB0byBwdXNoIGlmIGFyZ2M9MAorCWNtcAllY3gsIDEJCTsgaWYgYXJnYz0xIGJyYW5jaCBhaGVhZAorCWplCVNIT1JUICRfa21wX2ludm9rZV9vbmVfcGFybQorCXN1YgllY3gsIDIJCTsgaWYgYXJnYz0yIGJyYW5jaCBhaGVhZCwgc3VidHJhY3QgdHdvIGZyb20KKwlqZQlTSE9SVCAkX2ttcF9pbnZva2VfdHdvX3Bhcm1zCisKKyRfa21wX2ludm9rZV9wdXNoX3Bhcm1zOgk7IHB1c2ggbGFzdCAtIDV0aCBwYXJtcyB0byBwa2ZuIG9uIHN0YWNrCisJc3ViCXJkeCwgOAkJOyBkZWNyZW1lbnQgcF9hcmd2IHBvaW50ZXIgdG8gcHJldmlvdXMgcGFybQorCW1vdiAJcjgsIFFXT1JEIFBUUiBbcmR4XSA7IHI4IDw9IHBfYXJndltyY3gtMV0KKwlwdXNoCXI4CQk7IHB1c2ggcF9hcmd2W3JjeC0xXSBvbnRvIHN0YWNrIChyZXZlcnNlIG9yZGVyKQorCXN1YgllY3gsIDEKKwlqZWN4eglTSE9SVCAkX2ttcF9pbnZva2VfdHdvX3Bhcm1zCisJam1wCVNIT1JUICRfa21wX2ludm9rZV9wdXNoX3Bhcm1zCisKKyRfa21wX2ludm9rZV90d29fcGFybXM6CisJc3ViCXJkeCwgOAkJOyBwdXQgNHRoIHBhcm0gdG8gcGtmbiBpbiByOQorCW1vdglyOSwgUVdPUkQgUFRSIFtyZHhdIDsgcjkgPD0gcF9hcmd2WzFdCisKKyRfa21wX2ludm9rZV9vbmVfcGFybToKKyAgICAgICAgc3ViCXJkeCwgOAkJOyBwdXQgM3JkIHBhcm0gdG8gcGtmbiBpbiByOAorCW1vdglyOCwgUVdPUkQgUFRSIFtyZHhdIDsgcjggPD0gcF9hcmd2WzBdCisKKyRfa21wX2ludm9rZV9wYXNzX3Bhcm1zOgk7IHB1dCAxc3QgJiAybmQgcGFybXMgdG8gcGtmbiBpbiByZWdpc3RlcnMKKwlsZWEJcmR4LCBRV09SRCBQVFIgJF90aWRbcmJwXSAgOyByZHggPD0gJnRpZCAoMm5kIHBhcm0gdG8gcGtmbikKKwlsZWEJcmN4LCBRV09SRCBQVFIgJF9ndGlkW3JicF0gOyByY3ggPD0gJmd0aWQgKDFzdCBwYXJtIHRvIHBrZm4pCisgICAgICAgIHN1YiAgICAgcnNwLCAzMiAgICAgICAgIDsgYWRkIHN0YWNrIHNwYWNlIGZvciBmaXJzdCBmb3VyIHBhcm1zCisJbW92CXJheCwgcjEwCTsgcmF4IDw9IHBrZm4KKwljYWxsCXJheAkJOyBjYWxsICgqcGtmbikoKQorCW1vdglyYXgsIDEJCTsgbW92ZSAxIGludG8gcmV0dXJuIHJlZ2lzdGVyOworCisgICAgICAgIGxlYSAgICAgcnNwLCBRV09SRCBQVFIgW3JicF0JOyByZXN0b3JlIHN0YWNrIHBvaW50ZXIKKworOwlhZGQJcnNwLCAwCQk7IG5vIGZpeGVkIGFsbG9jYXRpb24gbmVjZXNzYXJ5IC0gc3RhcnQgZXBpbG9nCisgICAgICAgIHBvcCAgICAgcmJwCQk7IHJlc3RvcmUgZnJhbWUgcG9pbnRlcgorICAgICAgICByZXQKK19fa21wX2ludm9rZV9taWNyb3Rhc2sgRU5EUAorX1RFWFQgICBFTkRTCisKK2VuZGlmCisKK0VORApkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS9zcmMvel9XaW5kb3dzX05ULTU4Nl91dGlsLmNwcCBiL2ZpbmFsL3J1bnRpbWUvc3JjL3pfV2luZG93c19OVC01ODZfdXRpbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg4ZmY1YgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL3pfV2luZG93c19OVC01ODZfdXRpbC5jcHAKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiB6X1dpbmRvd3NfTlQtNTg2X3V0aWwuY3BwIC0tIHBsYXRmb3JtIHNwZWNpZmljIHJvdXRpbmVzLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisKKyNpZiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCkKKy8qIE9ubHkgMzItYml0ICJhZGQtZXhjaGFuZ2UiIGluc3RydWN0aW9uIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBjYXVzZXMgdXMgdG8KKyAgIHVzZSBjb21wYXJlX2FuZF9zdG9yZSBmb3IgdGhlc2Ugcm91dGluZXMgKi8KKwora21wX2ludDggX19rbXBfdGVzdF90aGVuX29yOCh2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggZCkgeworICBrbXBfaW50OCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICBvbGRfdmFsdWUgPSBUQ1JfMSgqcCk7CisgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSB8IGQ7CisKKyAgd2hpbGUgKCFfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgocCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpKSB7CisgICAgS01QX0NQVV9QQVVTRSgpOworICAgIG9sZF92YWx1ZSA9IFRDUl8xKCpwKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworICB9CisgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKK2ttcF9pbnQ4IF9fa21wX3Rlc3RfdGhlbl9hbmQ4KHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBkKSB7CisgIGttcF9pbnQ4IG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgIG9sZF92YWx1ZSA9IFRDUl8xKCpwKTsKKyAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICYgZDsKKworICB3aGlsZSAoIV9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOChwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSkpIHsKKyAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgb2xkX3ZhbHVlID0gVENSXzEoKnApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSAmIGQ7CisgIH0KKyAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKwora21wX3VpbnQzMiBfX2ttcF90ZXN0X3RoZW5fb3IzMih2b2xhdGlsZSBrbXBfdWludDMyICpwLCBrbXBfdWludDMyIGQpIHsKKyAga21wX3VpbnQzMiBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICBvbGRfdmFsdWUgPSBUQ1JfNCgqcCk7CisgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSB8IGQ7CisKKyAgd2hpbGUgKCFfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKCh2b2xhdGlsZSBrbXBfaW50MzIgKilwLCBvbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfdmFsdWUpKSB7CisgICAgS01QX0NQVV9QQVVTRSgpOworICAgIG9sZF92YWx1ZSA9IFRDUl80KCpwKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworICB9CisgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKK2ttcF91aW50MzIgX19rbXBfdGVzdF90aGVuX2FuZDMyKHZvbGF0aWxlIGttcF91aW50MzIgKnAsIGttcF91aW50MzIgZCkgeworICBrbXBfdWludDMyIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgIG9sZF92YWx1ZSA9IFRDUl80KCpwKTsKKyAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICYgZDsKKworICB3aGlsZSAoIV9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIoKHZvbGF0aWxlIGttcF9pbnQzMiAqKXAsIG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld192YWx1ZSkpIHsKKyAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgb2xkX3ZhbHVlID0gVENSXzQoKnApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSAmIGQ7CisgIH0KKyAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKwora21wX2ludDggX19rbXBfdGVzdF90aGVuX2FkZDgodm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGQpIHsKKyAga21wX2ludDY0IG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgIG9sZF92YWx1ZSA9IFRDUl8xKCpwKTsKKyAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICsgZDsKKyAgd2hpbGUgKCFfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgocCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpKSB7CisgICAgS01QX0NQVV9QQVVTRSgpOworICAgIG9sZF92YWx1ZSA9IFRDUl8xKCpwKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgKyBkOworICB9CisgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKKyNpZiBLTVBfQVJDSF9YODYKK2ttcF9pbnQ2NCBfX2ttcF90ZXN0X3RoZW5fYWRkNjQodm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgZCkgeworICBrbXBfaW50NjQgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgb2xkX3ZhbHVlID0gVENSXzgoKnApOworICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgKyBkOworICB3aGlsZSAoIV9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQocCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpKSB7CisgICAgS01QX0NQVV9QQVVTRSgpOworICAgIG9sZF92YWx1ZSA9IFRDUl84KCpwKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgKyBkOworICB9CisgIHJldHVybiBvbGRfdmFsdWU7Cit9CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2ICovCisKK2ttcF91aW50NjQgX19rbXBfdGVzdF90aGVuX29yNjQodm9sYXRpbGUga21wX3VpbnQ2NCAqcCwga21wX3VpbnQ2NCBkKSB7CisgIGttcF91aW50NjQgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgb2xkX3ZhbHVlID0gVENSXzgoKnApOworICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworICB3aGlsZSAoIV9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoKHZvbGF0aWxlIGttcF9pbnQ2NCAqKXAsIG9sZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld192YWx1ZSkpIHsKKyAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgb2xkX3ZhbHVlID0gVENSXzgoKnApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSB8IGQ7CisgIH0KKworICByZXR1cm4gb2xkX3ZhbHVlOworfQorCitrbXBfdWludDY0IF9fa21wX3Rlc3RfdGhlbl9hbmQ2NCh2b2xhdGlsZSBrbXBfdWludDY0ICpwLCBrbXBfdWludDY0IGQpIHsKKyAga21wX3VpbnQ2NCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICBvbGRfdmFsdWUgPSBUQ1JfOCgqcCk7CisgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSAmIGQ7CisgIHdoaWxlICghX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCgodm9sYXRpbGUga21wX2ludDY0ICopcCwgb2xkX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3ZhbHVlKSkgeworICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICBvbGRfdmFsdWUgPSBUQ1JfOCgqcCk7CisgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICYgZDsKKyAgfQorCisgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3NyYy96X1dpbmRvd3NfTlRfdXRpbC5jcHAgYi9maW5hbC9ydW50aW1lL3NyYy96X1dpbmRvd3NfTlRfdXRpbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkyOTVhNQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvc3JjL3pfV2luZG93c19OVF91dGlsLmNwcApAQCAtMCwwICsxLDE1NzggQEAKKy8qCisgKiB6X1dpbmRvd3NfTlRfdXRpbC5jcHAgLS0gcGxhdGZvcm0gc3BlY2lmaWMgcm91dGluZXMuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfYWZmaW5pdHkuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pby5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfd2FpdF9yZWxlYXNlLmgiCisKKy8qIFRoaXMgY29kZSBpcyByZWxhdGVkIHRvIE50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbigpIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uCisgICBpcyB1c2VkIGluIHRoZSBMb2FkIGJhbGFuY2UgYWxnb3JpdGhtIGZvciBPTVBfRFlOQU1JQz10cnVlIHRvIGZpbmQgdGhlCisgICBudW1iZXIgb2YgcnVubmluZyB0aHJlYWRzIGluIHRoZSBzeXN0ZW0uICovCisKKyNpbmNsdWRlIDxudHNlY2FwaS5oPiAvLyBVTklDT0RFX1NUUklORworI2luY2x1ZGUgPG50c3RhdHVzLmg+CisKK2VudW0gU1lTVEVNX0lORk9STUFUSU9OX0NMQVNTIHsKKyAgU3lzdGVtUHJvY2Vzc0luZm9ybWF0aW9uID0gNQorfTsgLy8gU1lTVEVNX0lORk9STUFUSU9OX0NMQVNTCisKK3N0cnVjdCBDTElFTlRfSUQgeworICBIQU5ETEUgVW5pcXVlUHJvY2VzczsKKyAgSEFORExFIFVuaXF1ZVRocmVhZDsKK307IC8vIHN0cnVjdCBDTElFTlRfSUQKKworZW51bSBUSFJFQURfU1RBVEUgeworICBTdGF0ZUluaXRpYWxpemVkLAorICBTdGF0ZVJlYWR5LAorICBTdGF0ZVJ1bm5pbmcsCisgIFN0YXRlU3RhbmRieSwKKyAgU3RhdGVUZXJtaW5hdGVkLAorICBTdGF0ZVdhaXQsCisgIFN0YXRlVHJhbnNpdGlvbiwKKyAgU3RhdGVVbmtub3duCit9OyAvLyBlbnVtIFRIUkVBRF9TVEFURQorCitzdHJ1Y3QgVk1fQ09VTlRFUlMgeworICBTSVpFX1QgUGVha1ZpcnR1YWxTaXplOworICBTSVpFX1QgVmlydHVhbFNpemU7CisgIFVMT05HIFBhZ2VGYXVsdENvdW50OworICBTSVpFX1QgUGVha1dvcmtpbmdTZXRTaXplOworICBTSVpFX1QgV29ya2luZ1NldFNpemU7CisgIFNJWkVfVCBRdW90YVBlYWtQYWdlZFBvb2xVc2FnZTsKKyAgU0laRV9UIFF1b3RhUGFnZWRQb29sVXNhZ2U7CisgIFNJWkVfVCBRdW90YVBlYWtOb25QYWdlZFBvb2xVc2FnZTsKKyAgU0laRV9UIFF1b3RhTm9uUGFnZWRQb29sVXNhZ2U7CisgIFNJWkVfVCBQYWdlZmlsZVVzYWdlOworICBTSVpFX1QgUGVha1BhZ2VmaWxlVXNhZ2U7CisgIFNJWkVfVCBQcml2YXRlUGFnZUNvdW50OworfTsgLy8gc3RydWN0IFZNX0NPVU5URVJTCisKK3N0cnVjdCBTWVNURU1fVEhSRUFEIHsKKyAgTEFSR0VfSU5URUdFUiBLZXJuZWxUaW1lOworICBMQVJHRV9JTlRFR0VSIFVzZXJUaW1lOworICBMQVJHRV9JTlRFR0VSIENyZWF0ZVRpbWU7CisgIFVMT05HIFdhaXRUaW1lOworICBMUFZPSUQgU3RhcnRBZGRyZXNzOworICBDTElFTlRfSUQgQ2xpZW50SWQ7CisgIERXT1JEIFByaW9yaXR5OworICBMT05HIEJhc2VQcmlvcml0eTsKKyAgVUxPTkcgQ29udGV4dFN3aXRjaENvdW50OworICBUSFJFQURfU1RBVEUgU3RhdGU7CisgIFVMT05HIFdhaXRSZWFzb247Cit9OyAvLyBTWVNURU1fVEhSRUFECisKK0tNUF9CVUlMRF9BU1NFUlQob2Zmc2V0b2YoU1lTVEVNX1RIUkVBRCwgS2VybmVsVGltZSkgPT0gMCk7CisjaWYgS01QX0FSQ0hfWDg2CitLTVBfQlVJTERfQVNTRVJUKG9mZnNldG9mKFNZU1RFTV9USFJFQUQsIFN0YXJ0QWRkcmVzcykgPT0gMjgpOworS01QX0JVSUxEX0FTU0VSVChvZmZzZXRvZihTWVNURU1fVEhSRUFELCBTdGF0ZSkgPT0gNTIpOworI2Vsc2UKK0tNUF9CVUlMRF9BU1NFUlQob2Zmc2V0b2YoU1lTVEVNX1RIUkVBRCwgU3RhcnRBZGRyZXNzKSA9PSAzMik7CitLTVBfQlVJTERfQVNTRVJUKG9mZnNldG9mKFNZU1RFTV9USFJFQUQsIFN0YXRlKSA9PSA2OCk7CisjZW5kaWYKKworc3RydWN0IFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OIHsKKyAgVUxPTkcgTmV4dEVudHJ5T2Zmc2V0OworICBVTE9ORyBOdW1iZXJPZlRocmVhZHM7CisgIExBUkdFX0lOVEVHRVIgUmVzZXJ2ZWRbM107CisgIExBUkdFX0lOVEVHRVIgQ3JlYXRlVGltZTsKKyAgTEFSR0VfSU5URUdFUiBVc2VyVGltZTsKKyAgTEFSR0VfSU5URUdFUiBLZXJuZWxUaW1lOworICBVTklDT0RFX1NUUklORyBJbWFnZU5hbWU7CisgIERXT1JEIEJhc2VQcmlvcml0eTsKKyAgSEFORExFIFByb2Nlc3NJZDsKKyAgSEFORExFIFBhcmVudFByb2Nlc3NJZDsKKyAgVUxPTkcgSGFuZGxlQ291bnQ7CisgIFVMT05HIFJlc2VydmVkMlsyXTsKKyAgVk1fQ09VTlRFUlMgVk1Db3VudGVyczsKKyAgSU9fQ09VTlRFUlMgSU9Db3VudGVyczsKKyAgU1lTVEVNX1RIUkVBRCBUaHJlYWRzWzFdOworfTsgLy8gU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04KK3R5cGVkZWYgU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04gKlBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTjsKKworS01QX0JVSUxEX0FTU0VSVChvZmZzZXRvZihTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiwgTmV4dEVudHJ5T2Zmc2V0KSA9PSAwKTsKK0tNUF9CVUlMRF9BU1NFUlQob2Zmc2V0b2YoU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIENyZWF0ZVRpbWUpID09IDMyKTsKK0tNUF9CVUlMRF9BU1NFUlQob2Zmc2V0b2YoU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIEltYWdlTmFtZSkgPT0gNTYpOworI2lmIEtNUF9BUkNIX1g4NgorS01QX0JVSUxEX0FTU0VSVChvZmZzZXRvZihTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiwgUHJvY2Vzc0lkKSA9PSA2OCk7CitLTVBfQlVJTERfQVNTRVJUKG9mZnNldG9mKFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBIYW5kbGVDb3VudCkgPT0gNzYpOworS01QX0JVSUxEX0FTU0VSVChvZmZzZXRvZihTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiwgVk1Db3VudGVycykgPT0gODgpOworS01QX0JVSUxEX0FTU0VSVChvZmZzZXRvZihTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiwgSU9Db3VudGVycykgPT0gMTM2KTsKK0tNUF9CVUlMRF9BU1NFUlQob2Zmc2V0b2YoU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIFRocmVhZHMpID09IDE4NCk7CisjZWxzZQorS01QX0JVSUxEX0FTU0VSVChvZmZzZXRvZihTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiwgUHJvY2Vzc0lkKSA9PSA4MCk7CitLTVBfQlVJTERfQVNTRVJUKG9mZnNldG9mKFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBIYW5kbGVDb3VudCkgPT0gOTYpOworS01QX0JVSUxEX0FTU0VSVChvZmZzZXRvZihTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiwgVk1Db3VudGVycykgPT0gMTEyKTsKK0tNUF9CVUlMRF9BU1NFUlQob2Zmc2V0b2YoU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIElPQ291bnRlcnMpID09IDIwOCk7CitLTVBfQlVJTERfQVNTRVJUKG9mZnNldG9mKFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBUaHJlYWRzKSA9PSAyNTYpOworI2VuZGlmCisKK3R5cGVkZWYgTlRTVEFUVVMoTlRBUEkgKk50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbl90KShTWVNURU1fSU5GT1JNQVRJT05fQ0xBU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFZPSUQsIFVMT05HLCBQVUxPTkcpOworTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uX3QgTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uID0gTlVMTDsKKworSE1PRFVMRSBudGRsbCA9IE5VTEw7CisKKy8qIEVuZCBvZiBOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb24oKS1yZWxhdGVkIGNvZGUgKi8KKworc3RhdGljIEhNT0RVTEUga2VybmVsMzIgPSBOVUxMOworCisjaWYgS01QX0hBTkRMRV9TSUdOQUxTCit0eXBlZGVmIHZvaWQgKCpzaWdfZnVuY190KShpbnQpOworc3RhdGljIHNpZ19mdW5jX3QgX19rbXBfc2lnaGxkcnNbTlNJR107CitzdGF0aWMgaW50IF9fa21wX3NpZ2luc3RhbGxlZFtOU0lHXTsKKyNlbmRpZgorCisjaWYgS01QX1VTRV9NT05JVE9SCitzdGF0aWMgSEFORExFIF9fa21wX21vbml0b3JfZXY7CisjZW5kaWYKK3N0YXRpYyBrbXBfaW50NjQgX19rbXBfd2luMzJfdGltZTsKK2RvdWJsZSBfX2ttcF93aW4zMl90aWNrOworCitpbnQgX19rbXBfaW5pdF9ydW50aW1lID0gRkFMU0U7CitDUklUSUNBTF9TRUNUSU9OIF9fa21wX3dpbjMyX3NlY3Rpb247CisKK3ZvaWQgX19rbXBfd2luMzJfbXV0ZXhfaW5pdChrbXBfd2luMzJfbXV0ZXhfdCAqbXgpIHsKKyAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbigmbXgtPmNzKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgIF9fa21wX2l0dF9zeXN0ZW1fb2JqZWN0X2NyZWF0ZWQoJm14LT5jcywgIkNyaXRpY2FsIFNlY3Rpb24iKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCit9CisKK3ZvaWQgX19rbXBfd2luMzJfbXV0ZXhfZGVzdHJveShrbXBfd2luMzJfbXV0ZXhfdCAqbXgpIHsKKyAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKCZteC0+Y3MpOworfQorCit2b2lkIF9fa21wX3dpbjMyX211dGV4X2xvY2soa21wX3dpbjMyX211dGV4X3QgKm14KSB7CisgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZteC0+Y3MpOworfQorCit2b2lkIF9fa21wX3dpbjMyX211dGV4X3VubG9jayhrbXBfd2luMzJfbXV0ZXhfdCAqbXgpIHsKKyAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJm14LT5jcyk7Cit9CisKK3ZvaWQgX19rbXBfd2luMzJfY29uZF9pbml0KGttcF93aW4zMl9jb25kX3QgKmN2KSB7CisgIGN2LT53YWl0ZXJzX2NvdW50XyA9IDA7CisgIGN2LT53YWl0X2dlbmVyYXRpb25fY291bnRfID0gMDsKKyAgY3YtPnJlbGVhc2VfY291bnRfID0gMDsKKworICAvKiBJbml0aWFsaXplIHRoZSBjcml0aWNhbCBzZWN0aW9uICovCisgIF9fa21wX3dpbjMyX211dGV4X2luaXQoJmN2LT53YWl0ZXJzX2NvdW50X2xvY2tfKTsKKworICAvKiBDcmVhdGUgYSBtYW51YWwtcmVzZXQgZXZlbnQuICovCisgIGN2LT5ldmVudF8gPSBDcmVhdGVFdmVudChOVUxMLCAvLyBubyBzZWN1cml0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwgLy8gbWFudWFsLXJlc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgLy8gbm9uLXNpZ25hbGVkIGluaXRpYWxseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7IC8vIHVubmFtZWQKKyNpZiBVU0VfSVRUX0JVSUxECisgIF9fa21wX2l0dF9zeXN0ZW1fb2JqZWN0X2NyZWF0ZWQoY3YtPmV2ZW50XywgIkV2ZW50Iik7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworfQorCit2b2lkIF9fa21wX3dpbjMyX2NvbmRfZGVzdHJveShrbXBfd2luMzJfY29uZF90ICpjdikgeworICBfX2ttcF93aW4zMl9tdXRleF9kZXN0cm95KCZjdi0+d2FpdGVyc19jb3VudF9sb2NrXyk7CisgIF9fa21wX2ZyZWVfaGFuZGxlKGN2LT5ldmVudF8pOworICBtZW1zZXQoY3YsICdcMCcsIHNpemVvZigqY3YpKTsKK30KKworLyogVE9ETyBhc3NvY2lhdGUgY3Ygd2l0aCBhIHRlYW0gaW5zdGVhZCBvZiBhIHRocmVhZCBzbyBhcyB0byBvcHRpbWl6ZQorICAgdGhlIGNhc2Ugd2hlcmUgd2Ugd2FrZSB1cCBhIHdob2xlIHRlYW0gKi8KKwordm9pZCBfX2ttcF93aW4zMl9jb25kX3dhaXQoa21wX3dpbjMyX2NvbmRfdCAqY3YsIGttcF93aW4zMl9tdXRleF90ICpteCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKnRoLCBpbnQgbmVlZF9kZWNyZWFzZV9sb2FkKSB7CisgIGludCBteV9nZW5lcmF0aW9uOworICBpbnQgbGFzdF93YWl0ZXI7CisKKyAgLyogQXZvaWQgcmFjZSBjb25kaXRpb25zICovCisgIF9fa21wX3dpbjMyX211dGV4X2xvY2soJmN2LT53YWl0ZXJzX2NvdW50X2xvY2tfKTsKKworICAvKiBJbmNyZW1lbnQgY291bnQgb2Ygd2FpdGVycyAqLworICBjdi0+d2FpdGVyc19jb3VudF8rKzsKKworICAvKiBTdG9yZSBjdXJyZW50IGdlbmVyYXRpb24gaW4gb3VyIGFjdGl2YXRpb24gcmVjb3JkLiAqLworICBteV9nZW5lcmF0aW9uID0gY3YtPndhaXRfZ2VuZXJhdGlvbl9jb3VudF87CisKKyAgX19rbXBfd2luMzJfbXV0ZXhfdW5sb2NrKCZjdi0+d2FpdGVyc19jb3VudF9sb2NrXyk7CisgIF9fa21wX3dpbjMyX211dGV4X3VubG9jayhteCk7CisKKyAgZm9yICg7OykgeworICAgIGludCB3YWl0X2RvbmU7CisKKyAgICAvKiBXYWl0IHVudGlsIHRoZSBldmVudCBpcyBzaWduYWxlZCAqLworICAgIFdhaXRGb3JTaW5nbGVPYmplY3QoY3YtPmV2ZW50XywgSU5GSU5JVEUpOworCisgICAgX19rbXBfd2luMzJfbXV0ZXhfbG9jaygmY3YtPndhaXRlcnNfY291bnRfbG9ja18pOworCisgICAgLyogRXhpdCB0aGUgbG9vcCB3aGVuIHRoZSA8Y3YtPmV2ZW50Xz4gaXMgc2lnbmFsZWQgYW5kIHRoZXJlIGFyZSBzdGlsbAorICAgICAgIHdhaXRpbmcgdGhyZWFkcyBmcm9tIHRoaXMgPHdhaXRfZ2VuZXJhdGlvbj4gdGhhdCBoYXZlbid0IGJlZW4gcmVsZWFzZWQKKyAgICAgICBmcm9tIHRoaXMgd2FpdCB5ZXQuICovCisgICAgd2FpdF9kb25lID0gKGN2LT5yZWxlYXNlX2NvdW50XyA+IDApICYmCisgICAgICAgICAgICAgICAgKGN2LT53YWl0X2dlbmVyYXRpb25fY291bnRfICE9IG15X2dlbmVyYXRpb24pOworCisgICAgX19rbXBfd2luMzJfbXV0ZXhfdW5sb2NrKCZjdi0+d2FpdGVyc19jb3VudF9sb2NrXyk7CisKKyAgICAvKiB0aGVyZSB1c2VkIHRvIGJlIGEgc2VtaWNvbG9uIGFmdGVyIHRoZSBpZiBzdGF0ZW1lbnQsIGl0IGxvb2tlZCBsaWtlIGEKKyAgICAgICBidWcsIHNvIGkgcmVtb3ZlZCBpdCAqLworICAgIGlmICh3YWl0X2RvbmUpCisgICAgICBicmVhazsKKyAgfQorCisgIF9fa21wX3dpbjMyX211dGV4X2xvY2sobXgpOworICBfX2ttcF93aW4zMl9tdXRleF9sb2NrKCZjdi0+d2FpdGVyc19jb3VudF9sb2NrXyk7CisKKyAgY3YtPndhaXRlcnNfY291bnRfLS07CisgIGN2LT5yZWxlYXNlX2NvdW50Xy0tOworCisgIGxhc3Rfd2FpdGVyID0gKGN2LT5yZWxlYXNlX2NvdW50XyA9PSAwKTsKKworICBfX2ttcF93aW4zMl9tdXRleF91bmxvY2soJmN2LT53YWl0ZXJzX2NvdW50X2xvY2tfKTsKKworICBpZiAobGFzdF93YWl0ZXIpIHsKKyAgICAvKiBXZSdyZSB0aGUgbGFzdCB3YWl0ZXIgdG8gYmUgbm90aWZpZWQsIHNvIHJlc2V0IHRoZSBtYW51YWwgZXZlbnQuICovCisgICAgUmVzZXRFdmVudChjdi0+ZXZlbnRfKTsKKyAgfQorfQorCit2b2lkIF9fa21wX3dpbjMyX2NvbmRfYnJvYWRjYXN0KGttcF93aW4zMl9jb25kX3QgKmN2KSB7CisgIF9fa21wX3dpbjMyX211dGV4X2xvY2soJmN2LT53YWl0ZXJzX2NvdW50X2xvY2tfKTsKKworICBpZiAoY3YtPndhaXRlcnNfY291bnRfID4gMCkgeworICAgIFNldEV2ZW50KGN2LT5ldmVudF8pOworICAgIC8qIFJlbGVhc2UgYWxsIHRoZSB0aHJlYWRzIGluIHRoaXMgZ2VuZXJhdGlvbi4gKi8KKworICAgIGN2LT5yZWxlYXNlX2NvdW50XyA9IGN2LT53YWl0ZXJzX2NvdW50XzsKKworICAgIC8qIFN0YXJ0IGEgbmV3IGdlbmVyYXRpb24uICovCisgICAgY3YtPndhaXRfZ2VuZXJhdGlvbl9jb3VudF8rKzsKKyAgfQorCisgIF9fa21wX3dpbjMyX211dGV4X3VubG9jaygmY3YtPndhaXRlcnNfY291bnRfbG9ja18pOworfQorCit2b2lkIF9fa21wX3dpbjMyX2NvbmRfc2lnbmFsKGttcF93aW4zMl9jb25kX3QgKmN2KSB7CisgIF9fa21wX3dpbjMyX2NvbmRfYnJvYWRjYXN0KGN2KTsKK30KKwordm9pZCBfX2ttcF9lbmFibGUoaW50IG5ld19zdGF0ZSkgeworICBpZiAoX19rbXBfaW5pdF9ydW50aW1lKQorICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZfX2ttcF93aW4zMl9zZWN0aW9uKTsKK30KKwordm9pZCBfX2ttcF9kaXNhYmxlKGludCAqb2xkX3N0YXRlKSB7CisgICpvbGRfc3RhdGUgPSAwOworCisgIGlmIChfX2ttcF9pbml0X3J1bnRpbWUpCisgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJl9fa21wX3dpbjMyX3NlY3Rpb24pOworfQorCit2b2lkIF9fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZSh2b2lkKSB7IC8qIGRvIG5vdGhpbmcgKi8KK30KKworc3RhdGljIHZvaWQgX19rbXBfc3VzcGVuZF9pbml0aWFsaXplX3RocmVhZChrbXBfaW5mb190ICp0aCkgeworICBpZiAoIVRDUl80KHRoLT50aC50aF9zdXNwZW5kX2luaXQpKSB7CisgICAgLyogdGhpcyBtZWFucyB3ZSBoYXZlbid0IGluaXRpYWxpemVkIHRoZSBzdXNwZW5zaW9uIHB0aHJlYWQgb2JqZWN0cyBmb3IgdGhpcworICAgICAgIHRocmVhZCBpbiB0aGlzIGluc3RhbmNlIG9mIHRoZSBwcm9jZXNzICovCisgICAgX19rbXBfd2luMzJfY29uZF9pbml0KCZ0aC0+dGgudGhfc3VzcGVuZF9jdik7CisgICAgX19rbXBfd2luMzJfbXV0ZXhfaW5pdCgmdGgtPnRoLnRoX3N1c3BlbmRfbXgpOworICAgIFRDV180KHRoLT50aC50aF9zdXNwZW5kX2luaXQsIFRSVUUpOworICB9Cit9CisKK3ZvaWQgX19rbXBfc3VzcGVuZF91bmluaXRpYWxpemVfdGhyZWFkKGttcF9pbmZvX3QgKnRoKSB7CisgIGlmIChUQ1JfNCh0aC0+dGgudGhfc3VzcGVuZF9pbml0KSkgeworICAgIC8qIHRoaXMgbWVhbnMgd2UgaGF2ZSBpbml0aWFsaXplIHRoZSBzdXNwZW5zaW9uIHB0aHJlYWQgb2JqZWN0cyBmb3IgdGhpcworICAgICAgIHRocmVhZCBpbiB0aGlzIGluc3RhbmNlIG9mIHRoZSBwcm9jZXNzICovCisgICAgX19rbXBfd2luMzJfY29uZF9kZXN0cm95KCZ0aC0+dGgudGhfc3VzcGVuZF9jdik7CisgICAgX19rbXBfd2luMzJfbXV0ZXhfZGVzdHJveSgmdGgtPnRoLnRoX3N1c3BlbmRfbXgpOworICAgIFRDV180KHRoLT50aC50aF9zdXNwZW5kX2luaXQsIEZBTFNFKTsKKyAgfQorfQorCisvKiBUaGlzIHJvdXRpbmUgcHV0cyB0aGUgY2FsbGluZyB0aHJlYWQgdG8gc2xlZXAgYWZ0ZXIgc2V0dGluZyB0aGUKKyAgIHNsZWVwIGJpdCBmb3IgdGhlIGluZGljYXRlZCBmbGFnIHZhcmlhYmxlIHRvIHRydWUuICovCit0ZW1wbGF0ZSA8Y2xhc3MgQz4KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2ttcF9zdXNwZW5kX3RlbXBsYXRlKGludCB0aF9ndGlkLCBDICpmbGFnKSB7CisgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfdGhyZWFkc1t0aF9ndGlkXTsKKyAgaW50IHN0YXR1czsKKyAgdHlwZW5hbWUgQzo6ZmxhZ190IG9sZF9zcGluOworCisgIEtGX1RSQUNFKDMwLCAoIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgZW50ZXIgZm9yIGZsYWcncyBsb2MoJXApXG4iLAorICAgICAgICAgICAgICAgIHRoX2d0aWQsIGZsYWctPmdldCgpKSk7CisKKyAgX19rbXBfc3VzcGVuZF9pbml0aWFsaXplX3RocmVhZCh0aCk7CisgIF9fa21wX3dpbjMyX211dGV4X2xvY2soJnRoLT50aC50aF9zdXNwZW5kX214KTsKKworICBLRl9UUkFDRSgxMCwgKCJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIHNldHRpbmcgc2xlZXAgYml0IGZvciBmbGFnJ3MiCisgICAgICAgICAgICAgICAgIiBsb2MoJXApXG4iLAorICAgICAgICAgICAgICAgIHRoX2d0aWQsIGZsYWctPmdldCgpKSk7CisKKyAgLyogVE9ETzogc2hvdWxkbid0IHRoaXMgdXNlIHJlbGVhc2Ugc2VtYW50aWNzIHRvIGVuc3VyZSB0aGF0CisgICAgIF9fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZV90aHJlYWQgZ2V0cyBjYWxsZWQgZmlyc3Q/ICovCisgIG9sZF9zcGluID0gZmxhZy0+c2V0X3NsZWVwaW5nKCk7CisKKyAgS0ZfVFJBQ0UoNSwgKCJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIHNldCBzbGVlcCBiaXQgZm9yIGZsYWcncyIKKyAgICAgICAgICAgICAgICIgbG9jKCVwKT09JWRcbiIsCisgICAgICAgICAgICAgICB0aF9ndGlkLCBmbGFnLT5nZXQoKSwgKihmbGFnLT5nZXQoKSkpKTsKKworICBpZiAoZmxhZy0+ZG9uZV9jaGVja192YWwob2xkX3NwaW4pKSB7CisgICAgb2xkX3NwaW4gPSBmbGFnLT51bnNldF9zbGVlcGluZygpOworICAgIEtGX1RSQUNFKDUsICgiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogVCMlZCBmYWxzZSBhbGFybSwgcmVzZXQgc2xlZXAgYml0ICIKKyAgICAgICAgICAgICAgICAgImZvciBmbGFnJ3MgbG9jKCVwKVxuIiwKKyAgICAgICAgICAgICAgICAgdGhfZ3RpZCwgZmxhZy0+Z2V0KCkpKTsKKyAgfSBlbHNlIHsKKyNpZmRlZiBERUJVR19TVVNQRU5ECisgICAgX19rbXBfc3VzcGVuZF9jb3VudCsrOworI2VuZGlmCisgICAgLyogRW5jYXBzdWxhdGUgaW4gYSBsb29wIGFzIHRoZSBkb2N1bWVudGF0aW9uIHN0YXRlcyB0aGF0IHRoaXMgbWF5ICJ3aXRoCisgICAgICAgbG93IHByb2JhYmlsaXR5IiByZXR1cm4gd2hlbiB0aGUgY29uZGl0aW9uIHZhcmlhYmxlIGhhcyBub3QgYmVlbiBzaWduYWxlZAorICAgICAgIG9yIGJyb2FkY2FzdCAqLworICAgIGludCBkZWFjdGl2YXRlZCA9IEZBTFNFOworICAgIFRDV19QVFIodGgtPnRoLnRoX3NsZWVwX2xvYywgKHZvaWQgKilmbGFnKTsKKyAgICB3aGlsZSAoZmxhZy0+aXNfc2xlZXBpbmcoKSkgeworICAgICAgS0ZfVFJBQ0UoMTUsICgiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogVCMlZCBhYm91dCB0byBwZXJmb3JtICIKKyAgICAgICAgICAgICAgICAgICAgImttcF93aW4zMl9jb25kX3dhaXQoKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGhfZ3RpZCkpOworICAgICAgLy8gTWFyayB0aGUgdGhyZWFkIGFzIG5vIGxvbmdlciBhY3RpdmUgKG9ubHkgaW4gdGhlIGZpcnN0IGl0ZXJhdGlvbiBvZiB0aGUKKyAgICAgIC8vIGxvb3ApLgorICAgICAgaWYgKCFkZWFjdGl2YXRlZCkgeworICAgICAgICB0aC0+dGgudGhfYWN0aXZlID0gRkFMU0U7CisgICAgICAgIGlmICh0aC0+dGgudGhfYWN0aXZlX2luX3Bvb2wpIHsKKyAgICAgICAgICB0aC0+dGgudGhfYWN0aXZlX2luX3Bvb2wgPSBGQUxTRTsKKyAgICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKChrbXBfaW50MzIgKikmX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCk7CisgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChUQ1JfNChfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoKSA+PSAwKTsKKyAgICAgICAgfQorICAgICAgICBkZWFjdGl2YXRlZCA9IFRSVUU7CisKKyAgICAgICAgX19rbXBfd2luMzJfY29uZF93YWl0KCZ0aC0+dGgudGhfc3VzcGVuZF9jdiwgJnRoLT50aC50aF9zdXNwZW5kX214LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF93aW4zMl9jb25kX3dhaXQoJnRoLT50aC50aF9zdXNwZW5kX2N2LCAmdGgtPnRoLnRoX3N1c3BlbmRfbXgsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgIH0KKworI2lmZGVmIEtNUF9ERUJVRworICAgICAgaWYgKGZsYWctPmlzX3NsZWVwaW5nKCkpIHsKKyAgICAgICAgS0ZfVFJBQ0UoMTAwLAorICAgICAgICAgICAgICAgICAoIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgc3B1cmlvdXMgd2FrZXVwXG4iLCB0aF9ndGlkKSk7CisgICAgICB9CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKyAgICB9IC8vIHdoaWxlCisKKyAgICAvLyBNYXJrIHRoZSB0aHJlYWQgYXMgYWN0aXZlIGFnYWluIChpZiBpdCB3YXMgcHJldmlvdXMgbWFya2VkIGFzIGluYWN0aXZlKQorICAgIGlmIChkZWFjdGl2YXRlZCkgeworICAgICAgdGgtPnRoLnRoX2FjdGl2ZSA9IFRSVUU7CisgICAgICBpZiAoVENSXzQodGgtPnRoLnRoX2luX3Bvb2wpKSB7CisgICAgICAgIEtNUF9URVNUX1RIRU5fSU5DMzIoKGttcF9pbnQzMiAqKSZfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoKTsKKyAgICAgICAgdGgtPnRoLnRoX2FjdGl2ZV9pbl9wb29sID0gVFJVRTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBfX2ttcF93aW4zMl9tdXRleF91bmxvY2soJnRoLT50aC50aF9zdXNwZW5kX214KTsKKworICBLRl9UUkFDRSgzMCwgKCJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIGV4aXRcbiIsIHRoX2d0aWQpKTsKK30KKwordm9pZCBfX2ttcF9zdXNwZW5kXzMyKGludCB0aF9ndGlkLCBrbXBfZmxhZ18zMiAqZmxhZykgeworICBfX2ttcF9zdXNwZW5kX3RlbXBsYXRlKHRoX2d0aWQsIGZsYWcpOworfQordm9pZCBfX2ttcF9zdXNwZW5kXzY0KGludCB0aF9ndGlkLCBrbXBfZmxhZ182NCAqZmxhZykgeworICBfX2ttcF9zdXNwZW5kX3RlbXBsYXRlKHRoX2d0aWQsIGZsYWcpOworfQordm9pZCBfX2ttcF9zdXNwZW5kX29uY29yZShpbnQgdGhfZ3RpZCwga21wX2ZsYWdfb25jb3JlICpmbGFnKSB7CisgIF9fa21wX3N1c3BlbmRfdGVtcGxhdGUodGhfZ3RpZCwgZmxhZyk7Cit9CisKKy8qIFRoaXMgcm91dGluZSBzaWduYWxzIHRoZSB0aHJlYWQgc3BlY2lmaWVkIGJ5IHRhcmdldF9ndGlkIHRvIHdha2UgdXAKKyAgIGFmdGVyIHNldHRpbmcgdGhlIHNsZWVwIGJpdCBpbmRpY2F0ZWQgYnkgdGhlIGZsYWcgYXJndW1lbnQgdG8gRkFMU0UgKi8KK3RlbXBsYXRlIDxjbGFzcyBDPgorc3RhdGljIGlubGluZSB2b2lkIF9fa21wX3Jlc3VtZV90ZW1wbGF0ZShpbnQgdGFyZ2V0X2d0aWQsIEMgKmZsYWcpIHsKKyAga21wX2luZm9fdCAqdGggPSBfX2ttcF90aHJlYWRzW3RhcmdldF9ndGlkXTsKKyAgaW50IHN0YXR1czsKKworI2lmZGVmIEtNUF9ERUJVRworICBpbnQgZ3RpZCA9IFRDUl80KF9fa21wX2luaXRfZ3RpZCkgPyBfX2ttcF9nZXRfZ3RpZCgpIDogLTE7CisjZW5kaWYKKworICBLRl9UUkFDRSgzMCwgKCJfX2ttcF9yZXN1bWVfdGVtcGxhdGU6IFQjJWQgd2FudHMgdG8gd2FrZXVwIFQjJWQgZW50ZXJcbiIsCisgICAgICAgICAgICAgICAgZ3RpZCwgdGFyZ2V0X2d0aWQpKTsKKworICBfX2ttcF9zdXNwZW5kX2luaXRpYWxpemVfdGhyZWFkKHRoKTsKKyAgX19rbXBfd2luMzJfbXV0ZXhfbG9jaygmdGgtPnRoLnRoX3N1c3BlbmRfbXgpOworCisgIGlmICghZmxhZykgeyAvLyBjb21pbmcgZnJvbSBfX2ttcF9udWxsX3Jlc3VtZV93cmFwcGVyCisgICAgZmxhZyA9IChDICopdGgtPnRoLnRoX3NsZWVwX2xvYzsKKyAgfQorCisgIC8vIEZpcnN0LCBjaGVjayBpZiB0aGUgZmxhZyBpcyBudWxsIG9yIGl0cyB0eXBlIGhhcyBjaGFuZ2VkLiBJZiBzbywgc29tZW9uZQorICAvLyBlbHNlIHdva2UgaXQgdXAuCisgIGlmICghZmxhZyB8fCBmbGFnLT5nZXRfdHlwZSgpICE9IGZsYWctPmdldF9wdHJfdHlwZSgpKSB7IC8vIGdldF9wdHJfdHlwZQorICAgIC8vIHNpbXBseSBzaG93cyB3aGF0CisgICAgLy8gZmxhZyB3YXMgY2FzdCB0bworICAgIEtGX1RSQUNFKDUsICgiX19rbXBfcmVzdW1lX3RlbXBsYXRlOiBUIyVkIGV4aXRpbmcsIHRocmVhZCBUIyVkIGFscmVhZHkgIgorICAgICAgICAgICAgICAgICAiYXdha2U6IGZsYWcncyBsb2MoJXApXG4iLAorICAgICAgICAgICAgICAgICBndGlkLCB0YXJnZXRfZ3RpZCwgTlVMTCkpOworICAgIF9fa21wX3dpbjMyX211dGV4X3VubG9jaygmdGgtPnRoLnRoX3N1c3BlbmRfbXgpOworICAgIHJldHVybjsKKyAgfSBlbHNlIHsKKyAgICB0eXBlbmFtZSBDOjpmbGFnX3Qgb2xkX3NwaW4gPSBmbGFnLT51bnNldF9zbGVlcGluZygpOworICAgIGlmICghZmxhZy0+aXNfc2xlZXBpbmdfdmFsKG9sZF9zcGluKSkgeworICAgICAgS0ZfVFJBQ0UoNSwgKCJfX2ttcF9yZXN1bWVfdGVtcGxhdGU6IFQjJWQgZXhpdGluZywgdGhyZWFkIFQjJWQgYWxyZWFkeSAiCisgICAgICAgICAgICAgICAgICAgImF3YWtlOiBmbGFnJ3MgbG9jKCVwKTogJXUgPT4gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFyZ2V0X2d0aWQsIGZsYWctPmdldCgpLCBvbGRfc3BpbiwgKihmbGFnLT5nZXQoKSkpKTsKKyAgICAgIF9fa21wX3dpbjMyX211dGV4X3VubG9jaygmdGgtPnRoLnRoX3N1c3BlbmRfbXgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBUQ1dfUFRSKHRoLT50aC50aF9zbGVlcF9sb2MsIE5VTEwpOworICBLRl9UUkFDRSg1LCAoIl9fa21wX3Jlc3VtZV90ZW1wbGF0ZTogVCMlZCBhYm91dCB0byB3YWtldXAgVCMlZCwgcmVzZXQgc2xlZXAgIgorICAgICAgICAgICAgICAgImJpdCBmb3IgZmxhZydzIGxvYyglcClcbiIsCisgICAgICAgICAgICAgICBndGlkLCB0YXJnZXRfZ3RpZCwgZmxhZy0+Z2V0KCkpKTsKKworICBfX2ttcF93aW4zMl9jb25kX3NpZ25hbCgmdGgtPnRoLnRoX3N1c3BlbmRfY3YpOworICBfX2ttcF93aW4zMl9tdXRleF91bmxvY2soJnRoLT50aC50aF9zdXNwZW5kX214KTsKKworICBLRl9UUkFDRSgzMCwgKCJfX2ttcF9yZXN1bWVfdGVtcGxhdGU6IFQjJWQgZXhpdGluZyBhZnRlciBzaWduYWxpbmcgd2FrZSB1cCIKKyAgICAgICAgICAgICAgICAiIGZvciBUIyVkXG4iLAorICAgICAgICAgICAgICAgIGd0aWQsIHRhcmdldF9ndGlkKSk7Cit9CisKK3ZvaWQgX19rbXBfcmVzdW1lXzMyKGludCB0YXJnZXRfZ3RpZCwga21wX2ZsYWdfMzIgKmZsYWcpIHsKKyAgX19rbXBfcmVzdW1lX3RlbXBsYXRlKHRhcmdldF9ndGlkLCBmbGFnKTsKK30KK3ZvaWQgX19rbXBfcmVzdW1lXzY0KGludCB0YXJnZXRfZ3RpZCwga21wX2ZsYWdfNjQgKmZsYWcpIHsKKyAgX19rbXBfcmVzdW1lX3RlbXBsYXRlKHRhcmdldF9ndGlkLCBmbGFnKTsKK30KK3ZvaWQgX19rbXBfcmVzdW1lX29uY29yZShpbnQgdGFyZ2V0X2d0aWQsIGttcF9mbGFnX29uY29yZSAqZmxhZykgeworICBfX2ttcF9yZXN1bWVfdGVtcGxhdGUodGFyZ2V0X2d0aWQsIGZsYWcpOworfQorCit2b2lkIF9fa21wX3lpZWxkKGludCBjb25kKSB7CisgIGlmIChjb25kKQorICAgIFNsZWVwKDApOworfQorCit2b2lkIF9fa21wX2d0aWRfc2V0X3NwZWNpZmljKGludCBndGlkKSB7CisgIGlmIChfX2ttcF9pbml0X2d0aWQpIHsKKyAgICBLQV9UUkFDRSg1MCwgKCJfX2ttcF9ndGlkX3NldF9zcGVjaWZpYzogVCMlZCBrZXk6JWRcbiIsIGd0aWQsCisgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5KSk7CisgICAgaWYgKCFUbHNTZXRWYWx1ZShfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5LCAoTFBWT0lEKShndGlkICsgMSkpKQorICAgICAgS01QX0ZBVEFMKFRMU1NldFZhbHVlRmFpbGVkKTsKKyAgfSBlbHNlIHsKKyAgICBLQV9UUkFDRSg1MCwgKCJfX2ttcF9ndGlkX3NldF9zcGVjaWZpYzogcnVudGltZSBzaHV0ZG93biwgcmV0dXJuaW5nXG4iKSk7CisgIH0KK30KKworaW50IF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCkgeworICBpbnQgZ3RpZDsKKyAgaWYgKCFfX2ttcF9pbml0X2d0aWQpIHsKKyAgICBLQV9UUkFDRSg1MCwgKCJfX2ttcF9ndGlkX2dldF9zcGVjaWZpYzogcnVudGltZSBzaHV0ZG93biwgcmV0dXJuaW5nICIKKyAgICAgICAgICAgICAgICAgICJLTVBfR1RJRF9TSFVURE9XTlxuIikpOworICAgIHJldHVybiBLTVBfR1RJRF9TSFVURE9XTjsKKyAgfQorICBndGlkID0gKGludCkoa21wX2ludHB0cl90KVRsc0dldFZhbHVlKF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXkpOworICBpZiAoZ3RpZCA9PSAwKSB7CisgICAgZ3RpZCA9IEtNUF9HVElEX0RORTsKKyAgfSBlbHNlIHsKKyAgICBndGlkLS07CisgIH0KKyAgS0FfVFJBQ0UoNTAsICgiX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWM6IGtleTolZCBndGlkOiVkXG4iLAorICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXksIGd0aWQpKTsKKyAgcmV0dXJuIGd0aWQ7Cit9CisKK3ZvaWQgX19rbXBfYWZmaW5pdHlfYmluZF90aHJlYWQoaW50IHByb2MpIHsKKyAgaWYgKF9fa21wX251bV9wcm9jX2dyb3VwcyA+IDEpIHsKKyAgICAvLyBGb3JtIHRoZSBHUk9VUF9BRkZJTklUWSBzdHJ1Y3QgZGlyZWN0bHksIHJhdGhlciB0aGFuIGZpbGxpbmcKKyAgICAvLyBvdXQgYSBiaXQgdmVjdG9yIGFuZCBjYWxsaW5nIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkoKS4KKyAgICBHUk9VUF9BRkZJTklUWSBnYTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKChwcm9jID49IDApICYmIChwcm9jIDwgKF9fa21wX251bV9wcm9jX2dyb3VwcyAqIENIQVJfQklUICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihEV09SRF9QVFIpKSkpOworICAgIGdhLkdyb3VwID0gcHJvYyAvIChDSEFSX0JJVCAqIHNpemVvZihEV09SRF9QVFIpKTsKKyAgICBnYS5NYXNrID0gKHVuc2lnbmVkIGxvbmcgbG9uZykxIDw8IChwcm9jICUgKENIQVJfQklUICogc2l6ZW9mKERXT1JEX1BUUikpKTsKKyAgICBnYS5SZXNlcnZlZFswXSA9IGdhLlJlc2VydmVkWzFdID0gZ2EuUmVzZXJ2ZWRbMl0gPSAwOworCisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5ICE9IE5VTEwpOworICAgIGlmIChfX2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5KEdldEN1cnJlbnRUaHJlYWQoKSwgJmdhLCBOVUxMKSA9PSAwKSB7CisgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsgLy8gQUM6IGNvbnRpbnVlIHNpbGVudGx5IGlmIG5vdCB2ZXJib3NlCisgICAgICAgIGttcF9tc2dfdCBlcnJfY29kZSA9IEtNUF9FUlIoZXJyb3IpOworICAgICAgICBfX2ttcF9tc2coa21wX21zX3dhcm5pbmcsIEtNUF9NU0coQ2FudFNldFRocmVhZEFmZk1hc2spLCBlcnJfY29kZSwKKyAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsKTsKKyAgICAgICAgaWYgKF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID09IGttcF93YXJuaW5nc19vZmYpIHsKKyAgICAgICAgICBfX2ttcF9zdHJfZnJlZSgmZXJyX2NvZGUuc3RyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBrbXBfYWZmaW5fbWFza190ICptYXNrOworICAgIEtNUF9DUFVfQUxMT0NfT05fU1RBQ0sobWFzayk7CisgICAgS01QX0NQVV9aRVJPKG1hc2spOworICAgIEtNUF9DUFVfU0VUKHByb2MsIG1hc2spOworICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkobWFzaywgVFJVRSk7CisgICAgS01QX0NQVV9GUkVFX0ZST01fU1RBQ0sobWFzayk7CisgIH0KK30KKwordm9pZCBfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZShjb25zdCBjaGFyICplbnZfdmFyKSB7CisvLyBBbGwgdmVyc2lvbnMgb2YgV2luZG93cyogT1MgKHNpbmNlIFdpbiAnOTUpIHN1cHBvcnQgU2V0VGhyZWFkQWZmaW5pdHlNYXNrKCkuCisKKyNpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKyAgS01QX0FGRklOSVRZX0VOQUJMRShfX2ttcF9udW1fcHJvY19ncm91cHMgKiBzaXplb2YoRFdPUkRfUFRSKSk7CisjZWxzZQorICBLTVBfQUZGSU5JVFlfRU5BQkxFKHNpemVvZihEV09SRF9QVFIpKTsKKyNlbmRpZgorCisgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlOiAiCisgICAgICAgICAgICAgICAgIldpbmRvd3MqIE9TIGFmZmluaXR5IGludGVyZmFjZSBmdW5jdGlvbmFsIChtYXNrIHNpemUgPSAiCisgICAgICAgICAgICAgICAgIiUiIEtNUF9TSVpFX1RfU1BFQyAiKS5cbiIsCisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5fbWFza19zaXplKSk7Cit9CisKK2RvdWJsZSBfX2ttcF9yZWFkX2NwdV90aW1lKHZvaWQpIHsKKyAgRklMRVRJTUUgQ3JlYXRpb25UaW1lLCBFeGl0VGltZSwgS2VybmVsVGltZSwgVXNlclRpbWU7CisgIGludCBzdGF0dXM7CisgIGRvdWJsZSBjcHVfdGltZTsKKworICBjcHVfdGltZSA9IDA7CisKKyAgc3RhdHVzID0gR2V0UHJvY2Vzc1RpbWVzKEdldEN1cnJlbnRQcm9jZXNzKCksICZDcmVhdGlvblRpbWUsICZFeGl0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZLZXJuZWxUaW1lLCAmVXNlclRpbWUpOworCisgIGlmIChzdGF0dXMpIHsKKyAgICBkb3VibGUgc2VjID0gMDsKKworICAgIHNlYyArPSBLZXJuZWxUaW1lLmR3SGlnaERhdGVUaW1lOworICAgIHNlYyArPSBVc2VyVGltZS5kd0hpZ2hEYXRlVGltZTsKKworICAgIC8qIFNoaWZ0IGxlZnQgYnkgMzIgYml0cyAqLworICAgIHNlYyAqPSAoZG91YmxlKSgxIDw8IDE2KSAqIChkb3VibGUpKDEgPDwgMTYpOworCisgICAgc2VjICs9IEtlcm5lbFRpbWUuZHdMb3dEYXRlVGltZTsKKyAgICBzZWMgKz0gVXNlclRpbWUuZHdMb3dEYXRlVGltZTsKKworICAgIGNwdV90aW1lICs9IChzZWMgKiAxMDAuMCkgLyBLTVBfTlNFQ19QRVJfU0VDOworICB9CisKKyAgcmV0dXJuIGNwdV90aW1lOworfQorCitpbnQgX19rbXBfcmVhZF9zeXN0ZW1faW5mbyhzdHJ1Y3Qga21wX3N5c19pbmZvICppbmZvKSB7CisgIGluZm8tPm1heHJzcyA9IDA7IC8qIHRoZSBtYXhpbXVtIHJlc2lkZW50IHNldCBzaXplIHV0aWxpemVkIChpbiBraWxvYnl0ZXMpICovCisgIGluZm8tPm1pbmZsdCA9IDA7IC8qIHRoZSBudW1iZXIgb2YgcGFnZSBmYXVsdHMgc2VydmljZWQgd2l0aG91dCBhbnkgSS9PICovCisgIGluZm8tPm1hamZsdCA9IDA7IC8qIHRoZSBudW1iZXIgb2YgcGFnZSBmYXVsdHMgc2VydmljZWQgdGhhdCByZXF1aXJlZCBJL08gKi8KKyAgaW5mby0+bnN3YXAgPSAwOyAvLyB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgcHJvY2VzcyB3YXMgInN3YXBwZWQiIG91dCBvZiBtZW1vcnkKKyAgaW5mby0+aW5ibG9jayA9IDA7IC8vIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZpbGUgc3lzdGVtIGhhZCB0byBwZXJmb3JtIGlucHV0CisgIGluZm8tPm91YmxvY2sgPSAwOyAvLyBudW1iZXIgb2YgdGltZXMgdGhlIGZpbGUgc3lzdGVtIGhhZCB0byBwZXJmb3JtIG91dHB1dAorICBpbmZvLT5udmNzdyA9IDA7IC8qIHRoZSBudW1iZXIgb2YgdGltZXMgYSBjb250ZXh0IHN3aXRjaCB3YXMgdm9sdW50YXJpbHkgKi8KKyAgaW5mby0+bml2Y3N3ID0gMDsgLyogdGhlIG51bWJlciBvZiB0aW1lcyBhIGNvbnRleHQgc3dpdGNoIHdhcyBmb3JjZWQgKi8KKworICByZXR1cm4gMTsKK30KKwordm9pZCBfX2ttcF9ydW50aW1lX2luaXRpYWxpemUodm9pZCkgeworICBTWVNURU1fSU5GTyBpbmZvOworICBrbXBfc3RyX2J1Zl90IHBhdGg7CisgIFVJTlQgcGF0aF9zaXplOworCisgIGlmIChfX2ttcF9pbml0X3J1bnRpbWUpIHsKKyAgICByZXR1cm47CisgIH07CisKKyNpZiBLTVBfRFlOQU1JQ19MSUIKKyAgLyogUGluIGR5bmFtaWMgbGlicmFyeSBmb3IgdGhlIGxpZmV0aW1lIG9mIGFwcGxpY2F0aW9uICovCisgIHsKKyAgICAvLyBGaXJzdCwgdHVybiBvZmYgZXJyb3IgbWVzc2FnZSBib3hlcworICAgIFVJTlQgZXJyX21vZGUgPSBTZXRFcnJvck1vZGUoU0VNX0ZBSUxDUklUSUNBTEVSUk9SUyk7CisgICAgSE1PRFVMRSBoOworICAgIEJPT0wgcmV0ID0gR2V0TW9kdWxlSGFuZGxlRXgoR0VUX01PRFVMRV9IQU5ETEVfRVhfRkxBR19GUk9NX0FERFJFU1MgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9NT0RVTEVfSEFORExFX0VYX0ZMQUdfUElOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQ1RTVFIpJl9fa21wX3NlcmlhbF9pbml0aWFsaXplLCAmaCk7CisgICAgS01QX0RFQlVHX0FTU0VSVDIoaCAmJiByZXQsICJPcGVuTVAgUlRMIGNhbm5vdCBmaW5kIGl0c2VsZiBsb2FkZWQiKTsKKyAgICBTZXRFcnJvck1vZGUoZXJyX21vZGUpOyAvLyBSZXN0b3JlIGVycm9yIG1vZGUKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9ydW50aW1lX2luaXRpYWxpemU6IGR5bmFtaWMgbGlicmFyeSBwaW5uZWRcbiIpKTsKKyAgfQorI2VuZGlmCisKKyAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbigmX19rbXBfd2luMzJfc2VjdGlvbik7CisjaWYgVVNFX0lUVF9CVUlMRAorICBfX2ttcF9pdHRfc3lzdGVtX29iamVjdF9jcmVhdGVkKCZfX2ttcF93aW4zMl9zZWN0aW9uLCAiQ3JpdGljYWwgU2VjdGlvbiIpOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgX19rbXBfaW5pdGlhbGl6ZV9zeXN0ZW1fdGljaygpOworCisjaWYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpCisgIGlmICghX19rbXBfY3B1aW5mby5pbml0aWFsaXplZCkgeworICAgIF9fa21wX3F1ZXJ5X2NwdWlkKCZfX2ttcF9jcHVpbmZvKTsKKyAgfTsgLy8gaWYKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKy8qIFNldCB1cCBtaW5pbXVtIG51bWJlciBvZiB0aHJlYWRzIHRvIHN3aXRjaCB0byBUTFMgZ3RpZCAqLworI2lmIEtNUF9PU19XSU5ET1dTICYmICFkZWZpbmVkIEtNUF9EWU5BTUlDX0xJQgorICAvLyBXaW5kb3dzKiBPUywgc3RhdGljIGxpYnJhcnkuCisgIC8qIE5ldyB0aHJlYWQgbWF5IHVzZSBzdGFjayBzcGFjZSBwcmV2aW91c2x5IHVzZWQgYnkgYW5vdGhlciB0aHJlYWQsCisgICAgIGN1cnJlbnRseSB0ZXJtaW5hdGVkLiBPbiBXaW5kb3dzKiBPUywgaW4gY2FzZSBvZiBzdGF0aWMgbGlua2luZywgd2UgZG8gbm90CisgICAgIGtub3cgdGhlIG1vbWVudCBvZiB0aHJlYWQgdGVybWluYXRpb24sIGFuZCBvdXIgc3RydWN0dXJlcyAoX19rbXBfdGhyZWFkcworICAgICBhbmQgX19rbXBfcm9vdCBhcnJheXMpIGFyZSBzdGlsbCBrZWVwIGluZm8gYWJvdXQgZGVhZCB0aHJlYWRzLiBUaGlzIGxlYWRzCisgICAgIHRvIHByb2JsZW0gaW4gX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWQoKSBmdW5jdGlvbjogaXQgd3JvbmdseSBmaW5kcyBndGlkCisgICAgIChieSBzZWFyY2hpbmcgdGhyb3VnaCBzdGFjayBhZGRyZXNzZXMgb2YgYWxsIGtub3duIHRocmVhZHMpIGZvcgorICAgICB1bnJlZ2lzdGVyZWQgZm9yZWlnbiB0cmVhZC4KKworICAgICBTZXR0aW5nIF9fa21wX3Rsc19ndGlkX21pbiB0byAwIHdvcmthcm91bmRzIHRoaXMgcHJvYmxlbToKKyAgICAgX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWQoKSBkb2VzIG5vdCBzZWFyY2ggdGhyb3VnaCBzdGFja3MsIGJ1dCBnZXQgZ3RpZAorICAgICBmcm9tIFRMUyBpbW1lZGlhdGVseS4KKyAgICAgIC0tbG4KKyAgKi8KKyAgX19rbXBfdGxzX2d0aWRfbWluID0gMDsKKyNlbHNlCisgIF9fa21wX3Rsc19ndGlkX21pbiA9IEtNUF9UTFNfR1RJRF9NSU47CisjZW5kaWYKKworICAvKiBmb3IgdGhlIHN0YXRpYyBsaWJyYXJ5ICovCisgIGlmICghX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSkgeworICAgIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXkgPSBUbHNBbGxvYygpOworICAgIGlmIChfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5ID09IFRMU19PVVRfT0ZfSU5ERVhFUykgeworICAgICAgS01QX0ZBVEFMKFRMU091dE9mSW5kZXhlcyk7CisgICAgfQorICB9CisKKyAgLy8gTG9hZCBudGRsbC5kbGwuCisgIC8qIFNpbXBsZSBHZXRNb2R1bGVIYW5kbGUoICJudGRsbC5kbCIgKSBpcyBub3Qgc3VpdGFibGUgZHVlIHRvIHNlY3VyaXR5IGlzc3VlCisgICAgIChzZWUgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3RlY2huZXQvc2VjdXJpdHkvYWR2aXNvcnkvMjI2OTYzNy5tc3B4KS4gV2UKKyAgICAgaGF2ZSB0byBzcGVjaWZ5IGZ1bGwgcGF0aCB0byB0aGUgbGlicmFyeS4gKi8KKyAgX19rbXBfc3RyX2J1Zl9pbml0KCZwYXRoKTsKKyAgcGF0aF9zaXplID0gR2V0U3lzdGVtRGlyZWN0b3J5KHBhdGguc3RyLCBwYXRoLnNpemUpOworICBLTVBfREVCVUdfQVNTRVJUKHBhdGhfc2l6ZSA+IDApOworICBpZiAocGF0aF9zaXplID49IHBhdGguc2l6ZSkgeworICAgIC8vIEJ1ZmZlciBpcyB0b28gc2hvcnQuICBFeHBhbmQgdGhlIGJ1ZmZlciBhbmQgdHJ5IGFnYWluLgorICAgIF9fa21wX3N0cl9idWZfcmVzZXJ2ZSgmcGF0aCwgcGF0aF9zaXplKTsKKyAgICBwYXRoX3NpemUgPSBHZXRTeXN0ZW1EaXJlY3RvcnkocGF0aC5zdHIsIHBhdGguc2l6ZSk7CisgICAgS01QX0RFQlVHX0FTU0VSVChwYXRoX3NpemUgPiAwKTsKKyAgfTsgLy8gaWYKKyAgaWYgKHBhdGhfc2l6ZSA+IDAgJiYgcGF0aF9zaXplIDwgcGF0aC5zaXplKSB7CisgICAgLy8gTm93IHdlIGhhdmUgc3lzdGVtIGRpcmVjdG9yeSBuYW1lIGluIHRoZSBidWZmZXIuCisgICAgLy8gQXBwZW5kIGJhY2tzbGFzaCBhbmQgbmFtZSBvZiBkbGwgdG8gZm9ybSBmdWxsIHBhdGgsCisgICAgcGF0aC51c2VkID0gcGF0aF9zaXplOworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJnBhdGgsICJcXCVzIiwgIm50ZGxsLmRsbCIpOworCisgICAgLy8gTm93IGxvYWQgbnRkbGwgdXNpbmcgZnVsbCBwYXRoLgorICAgIG50ZGxsID0gR2V0TW9kdWxlSGFuZGxlKHBhdGguc3RyKTsKKyAgfQorCisgIEtNUF9ERUJVR19BU1NFUlQobnRkbGwgIT0gTlVMTCk7CisgIGlmIChudGRsbCAhPSBOVUxMKSB7CisgICAgTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uID0gKE50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbl90KUdldFByb2NBZGRyZXNzKAorICAgICAgICBudGRsbCwgIk50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbiIpOworICB9CisgIEtNUF9ERUJVR19BU1NFUlQoTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uICE9IE5VTEwpOworCisjaWYgS01QX0dST1VQX0FGRklOSVRZCisgIC8vIExvYWQga2VybmVsMzIuZGxsLgorICAvLyBTYW1lIGNhdmVhdCAtIG11c3QgdXNlIGZ1bGwgc3lzdGVtIHBhdGggbmFtZS4KKyAgaWYgKHBhdGhfc2l6ZSA+IDAgJiYgcGF0aF9zaXplIDwgcGF0aC5zaXplKSB7CisgICAgLy8gVHJ1bmNhdGUgdGhlIGJ1ZmZlciBiYWNrIHRvIGp1c3QgdGhlIHN5c3RlbSBwYXRoIGxlbmd0aCwKKyAgICAvLyBkaXNjYXJkaW5nICJcXG50ZGxsLmRsbCIsIGFuZCByZXBsYWNpbmcgaXQgd2l0aCAia2VybmVsMzIuZGxsIi4KKyAgICBwYXRoLnVzZWQgPSBwYXRoX3NpemU7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmcGF0aCwgIlxcJXMiLCAia2VybmVsMzIuZGxsIik7CisKKyAgICAvLyBMb2FkIGtlcm5lbDMyLmRsbCB1c2luZyBmdWxsIHBhdGguCisgICAga2VybmVsMzIgPSBHZXRNb2R1bGVIYW5kbGUocGF0aC5zdHIpOworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZToga2VybmVsMzIuZGxsID0gJXNcbiIsIHBhdGguc3RyKSk7CisKKyAgICAvLyBMb2FkIHRoZSBmdW5jdGlvbiBwb2ludGVycyB0byBrZXJuZWwzMi5kbGwgcm91dGluZXMKKyAgICAvLyB0aGF0IG1heSBvciBtYXkgbm90IGV4aXN0IG9uIHRoaXMgc3lzdGVtLgorICAgIGlmIChrZXJuZWwzMiAhPSBOVUxMKSB7CisgICAgICBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudCA9CisgICAgICAgICAgKGttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudF90KUdldFByb2NBZGRyZXNzKAorICAgICAgICAgICAgICBrZXJuZWwzMiwgIkdldEFjdGl2ZVByb2Nlc3NvckNvdW50Iik7CisgICAgICBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JHcm91cENvdW50ID0KKyAgICAgICAgICAoa21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnRfdClHZXRQcm9jQWRkcmVzcygKKyAgICAgICAgICAgICAga2VybmVsMzIsICJHZXRBY3RpdmVQcm9jZXNzb3JHcm91cENvdW50Iik7CisgICAgICBfX2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5ID0KKyAgICAgICAgICAoa21wX0dldFRocmVhZEdyb3VwQWZmaW5pdHlfdClHZXRQcm9jQWRkcmVzcygKKyAgICAgICAgICAgICAga2VybmVsMzIsICJHZXRUaHJlYWRHcm91cEFmZmluaXR5Iik7CisgICAgICBfX2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5ID0KKyAgICAgICAgICAoa21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHlfdClHZXRQcm9jQWRkcmVzcygKKyAgICAgICAgICAgICAga2VybmVsMzIsICJTZXRUaHJlYWRHcm91cEFmZmluaXR5Iik7CisKKyAgICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZTogX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnQiCisgICAgICAgICAgICAgICAgICAgICIgPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnQpKTsKKyAgICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZTogIgorICAgICAgICAgICAgICAgICAgICAiX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudCA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JHcm91cENvdW50KSk7CisgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9ydW50aW1lX2luaXRpYWxpemU6X19rbXBfR2V0VGhyZWFkR3JvdXBBZmZpbml0eSIKKyAgICAgICAgICAgICAgICAgICAgIiA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5KSk7CisgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9ydW50aW1lX2luaXRpYWxpemU6IF9fa21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHkiCisgICAgICAgICAgICAgICAgICAgICIgPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eSkpOworICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfcnVudGltZV9pbml0aWFsaXplOiBzaXplb2Yoa21wX2FmZmluX21hc2tfdCkgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF9hZmZpbl9tYXNrX3QpKSk7CisKKyAgICAgIC8vIFNlZSBpZiBncm91cCBhZmZpbml0eSBpcyBzdXBwb3J0ZWQgb24gdGhpcyBzeXN0ZW0uCisgICAgICAvLyBJZiBzbywgY2FsY3VsYXRlIHRoZSAjZ3JvdXBzIGFuZCAjcHJvY3MuCisgICAgICAvLworICAgICAgLy8gR3JvdXAgYWZmaW5pdHkgd2FzIGludHJvZHVjZWQgd2l0aCBXaW5kb3dzKiA3IE9TIGFuZAorICAgICAgLy8gV2luZG93cyogU2VydmVyIDIwMDggUjIgT1MuCisgICAgICBpZiAoKF9fa21wX0dldEFjdGl2ZVByb2Nlc3NvckNvdW50ICE9IE5VTEwpICYmCisgICAgICAgICAgKF9fa21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnQgIT0gTlVMTCkgJiYKKyAgICAgICAgICAoX19rbXBfR2V0VGhyZWFkR3JvdXBBZmZpbml0eSAhPSBOVUxMKSAmJgorICAgICAgICAgIChfX2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5ICE9IE5VTEwpICYmCisgICAgICAgICAgKChfX2ttcF9udW1fcHJvY19ncm91cHMgPSBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JHcm91cENvdW50KCkpID4KKyAgICAgICAgICAgMSkpIHsKKyAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSB0b3RhbCBudW1iZXIgb2YgYWN0aXZlIE9TIHByb2NzLgorICAgICAgICBpbnQgaTsKKworICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9ydW50aW1lX2luaXRpYWxpemU6ICVkIHByb2Nlc3NvciBncm91cHMiCisgICAgICAgICAgICAgICAgICAgICAgIiBkZXRlY3RlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9udW1fcHJvY19ncm91cHMpKTsKKworICAgICAgICBfX2ttcF94cHJvYyA9IDA7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IF9fa21wX251bV9wcm9jX2dyb3VwczsgaSsrKSB7CisgICAgICAgICAgRFdPUkQgc2l6ZSA9IF9fa21wX0dldEFjdGl2ZVByb2Nlc3NvckNvdW50KGkpOworICAgICAgICAgIF9fa21wX3hwcm9jICs9IHNpemU7CisgICAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfcnVudGltZV9pbml0aWFsaXplOiBwcm9jIGdyb3VwICVkIHNpemUgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIHNpemUpKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfcnVudGltZV9pbml0aWFsaXplOiAlZCBwcm9jZXNzb3IgZ3JvdXBzIgorICAgICAgICAgICAgICAgICAgICAgICIgZGV0ZWN0ZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbnVtX3Byb2NfZ3JvdXBzKSk7CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChfX2ttcF9udW1fcHJvY19ncm91cHMgPD0gMSkgeworICAgIEdldFN5c3RlbUluZm8oJmluZm8pOworICAgIF9fa21wX3hwcm9jID0gaW5mby5kd051bWJlck9mUHJvY2Vzc29yczsKKyAgfQorI2Vsc2UKKyAgR2V0U3lzdGVtSW5mbygmaW5mbyk7CisgIF9fa21wX3hwcm9jID0gaW5mby5kd051bWJlck9mUHJvY2Vzc29yczsKKyNlbmRpZiAvKiBLTVBfR1JPVVBfQUZGSU5JVFkgKi8KKworICAvLyBJZiB0aGUgT1Mgc2FpZCB0aGVyZSB3ZXJlIDAgcHJvY3MsIHRha2UgYSBndWVzcyBhbmQgdXNlIGEgdmFsdWUgb2YgMi4KKyAgLy8gVGhpcyBpcyBkb25lIGZvciBMaW51eCogT1MsIGFsc28uICBEbyB3ZSBuZWVkIGVycm9yIC8gd2FybmluZz8KKyAgaWYgKF9fa21wX3hwcm9jIDw9IDApIHsKKyAgICBfX2ttcF94cHJvYyA9IDI7CisgIH0KKworICBLQV9UUkFDRSg1LAorICAgICAgICAgICAoIl9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZTogdG90YWwgcHJvY2Vzc29ycyA9ICVkXG4iLCBfX2ttcF94cHJvYykpOworCisgIF9fa21wX3N0cl9idWZfZnJlZSgmcGF0aCk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgIF9fa21wX2l0dF9pbml0aWFsaXplKCk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgIF9fa21wX2luaXRfcnVudGltZSA9IFRSVUU7Cit9IC8vIF9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZQorCit2b2lkIF9fa21wX3J1bnRpbWVfZGVzdHJveSh2b2lkKSB7CisgIGlmICghX19rbXBfaW5pdF9ydW50aW1lKSB7CisgICAgcmV0dXJuOworICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgIF9fa21wX2l0dF9kZXN0cm95KCk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgIC8qIHdlIGNhbid0IERlbGV0ZUNyaXRpY2Fsc2VjdGlvbiggJiBfX2ttcF93aW4zMl9zZWN0aW9uICk7ICovCisgIC8qIGR1ZSB0byB0aGUgS1hfVFJBQ0UoKSBjb21tYW5kcyAqLworICBLQV9UUkFDRSg0MCwgKCJfX2ttcF9ydW50aW1lX2Rlc3Ryb3lcbiIpKTsKKworICBpZiAoX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSkgeworICAgIFRsc0ZyZWUoX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSk7CisgICAgX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSA9IDA7CisgIH0KKworICBfX2ttcF9hZmZpbml0eV91bmluaXRpYWxpemUoKTsKKyAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKCZfX2ttcF93aW4zMl9zZWN0aW9uKTsKKworICBudGRsbCA9IE5VTEw7CisgIE50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbiA9IE5VTEw7CisKKyNpZiBLTVBfQVJDSF9YODZfNjQKKyAga2VybmVsMzIgPSBOVUxMOworICBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudCA9IE5VTEw7CisgIF9fa21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnQgPSBOVUxMOworICBfX2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5ID0gTlVMTDsKKyAgX19rbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eSA9IE5VTEw7CisjZW5kaWYgLy8gS01QX0FSQ0hfWDg2XzY0CisKKyAgX19rbXBfaW5pdF9ydW50aW1lID0gRkFMU0U7Cit9CisKK3ZvaWQgX19rbXBfdGVybWluYXRlX3RocmVhZChpbnQgZ3RpZCkgeworICBrbXBfaW5mb190ICp0aCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisKKyAgaWYgKCF0aCkKKyAgICByZXR1cm47CisKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBfdGVybWluYXRlX3RocmVhZDoga2lsbCAoJWQpXG4iLCBndGlkKSk7CisKKyAgaWYgKFRlcm1pbmF0ZVRocmVhZCh0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQsIChEV09SRCktMSkgPT0gRkFMU0UpIHsKKyAgICAvKiBJdCdzIE9LLCB0aGUgdGhyZWFkIG1heSBoYXZlIGV4aXRlZCBhbHJlYWR5ICovCisgIH0KKyAgX19rbXBfZnJlZV9oYW5kbGUodGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkKTsKK30KKwordm9pZCBfX2ttcF9jbGVhcl9zeXN0ZW1fdGltZSh2b2lkKSB7CisgIEJPT0wgc3RhdHVzOworICBMQVJHRV9JTlRFR0VSIHRpbWU7CisgIHN0YXR1cyA9IFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZ0aW1lKTsKKyAgX19rbXBfd2luMzJfdGltZSA9IChrbXBfaW50NjQpdGltZS5RdWFkUGFydDsKK30KKwordm9pZCBfX2ttcF9pbml0aWFsaXplX3N5c3RlbV90aWNrKHZvaWQpIHsKKyAgeworICAgIEJPT0wgc3RhdHVzOworICAgIExBUkdFX0lOVEVHRVIgZnJlcTsKKworICAgIHN0YXR1cyA9IFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koJmZyZXEpOworICAgIGlmICghc3RhdHVzKSB7CisgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgX19rbXBfbXNnKGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICBLTVBfTVNHKEZ1bmN0aW9uRXJyb3IsICJRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KCkiKSwKKyAgICAgICAgICAgICAgICBLTVBfRVJSKGVycm9yKSwgX19rbXBfbXNnX251bGwpOworCisgICAgfSBlbHNlIHsKKyAgICAgIF9fa21wX3dpbjMyX3RpY2sgPSAoKGRvdWJsZSkxLjApIC8gKGRvdWJsZSlmcmVxLlF1YWRQYXJ0OworICAgIH0KKyAgfQorfQorCisvKiBDYWxjdWxhdGUgdGhlIGVsYXBzZWQgd2FsbCBjbG9jayB0aW1lIGZvciB0aGUgdXNlciAqLworCit2b2lkIF9fa21wX2VsYXBzZWQoZG91YmxlICp0KSB7CisgIEJPT0wgc3RhdHVzOworICBMQVJHRV9JTlRFR0VSIG5vdzsKKyAgc3RhdHVzID0gUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoJm5vdyk7CisgICp0ID0gKChkb3VibGUpbm93LlF1YWRQYXJ0KSAqIF9fa21wX3dpbjMyX3RpY2s7Cit9CisKKy8qIENhbGN1bGF0ZSB0aGUgZWxhcHNlZCB3YWxsIGNsb2NrIHRpY2sgZm9yIHRoZSB1c2VyICovCisKK3ZvaWQgX19rbXBfZWxhcHNlZF90aWNrKGRvdWJsZSAqdCkgeyAqdCA9IF9fa21wX3dpbjMyX3RpY2s7IH0KKwordm9pZCBfX2ttcF9yZWFkX3N5c3RlbV90aW1lKGRvdWJsZSAqZGVsdGEpIHsKKyAgaWYgKGRlbHRhICE9IE5VTEwpIHsKKyAgICBCT09MIHN0YXR1czsKKyAgICBMQVJHRV9JTlRFR0VSIG5vdzsKKworICAgIHN0YXR1cyA9IFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZub3cpOworCisgICAgKmRlbHRhID0gKChkb3VibGUpKCgoa21wX2ludDY0KW5vdy5RdWFkUGFydCkgLSBfX2ttcF93aW4zMl90aW1lKSkgKgorICAgICAgICAgICAgIF9fa21wX3dpbjMyX3RpY2s7CisgIH0KK30KKworLyogUmV0dXJuIHRoZSBjdXJyZW50IHRpbWUgc3RhbXAgaW4gbnNlYyAqLwora21wX3VpbnQ2NCBfX2ttcF9ub3dfbnNlYygpIHsKKyAgTEFSR0VfSU5URUdFUiBub3c7CisgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZub3cpOworICByZXR1cm4gMWU5ICogX19rbXBfd2luMzJfdGljayAqIG5vdy5RdWFkUGFydDsKK30KKwordm9pZCAqX19zdGRjYWxsIF9fa21wX2xhdW5jaF93b3JrZXIodm9pZCAqYXJnKSB7CisgIHZvbGF0aWxlIHZvaWQgKnN0YWNrX2RhdGE7CisgIHZvaWQgKmV4aXRfdmFsOworICB2b2lkICpwYWRkaW5nID0gMDsKKyAga21wX2luZm9fdCAqdGhpc190aHIgPSAoa21wX2luZm9fdCAqKWFyZzsKKyAgaW50IGd0aWQ7CisKKyAgZ3RpZCA9IHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX2d0aWQ7CisgIF9fa21wX2d0aWRfc2V0X3NwZWNpZmljKGd0aWQpOworI2lmZGVmIEtNUF9UREFUQV9HVElECisjZXJyb3IgIlRoaXMgZGVmaW5lIGNhdXNlcyBwcm9ibGVtcyB3aXRoIExvYWRMaWJyYXJ5KCkgKyBkZWNsc3BlYyh0aHJlYWQpICIgXAorICAgICAgICAib24gV2luZG93cyogT1MuICBTZWUgQ1E1MDU2NCwgdGVzdHMga21wX2xvYWRfbGlicmFyeSouYyBhbmQgdGhpcyBNU0ROICIgXAorICAgICAgICAicmVmZXJlbmNlOiBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2tiLzExODgxNiIKKy8vX19rbXBfZ3RpZCA9IGd0aWQ7CisjZW5kaWYKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgX19rbXBfaXR0X3RocmVhZF9uYW1lKGd0aWQpOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICBfX2ttcF9hZmZpbml0eV9zZXRfaW5pdF9tYXNrKGd0aWQsIEZBTFNFKTsKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgLy8gU2V0IEZQIGNvbnRyb2wgcmVncyB0byBiZSBhIGNvcHkgb2YgdGhlIHBhcmFsbGVsIGluaXRpYWxpemF0aW9uIHRocmVhZCdzLgorICBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkKCk7CisgIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQoJl9fa21wX2luaXRfeDg3X2ZwdV9jb250cm9sX3dvcmQpOworICBfX2ttcF9sb2FkX214Y3NyKCZfX2ttcF9pbml0X214Y3NyKTsKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgaWYgKF9fa21wX3N0a29mZnNldCA+IDAgJiYgZ3RpZCA+IDApIHsKKyAgICBwYWRkaW5nID0gS01QX0FMTE9DQShndGlkICogX19rbXBfc3Rrb2Zmc2V0KTsKKyAgfQorCisgIEtNUF9GU1lOQ19SRUxFQVNJTkcoJnRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX2FsaXZlKTsKKyAgdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkX2lkID0gR2V0Q3VycmVudFRocmVhZElkKCk7CisgIFRDV180KHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX2FsaXZlLCBUUlVFKTsKKworICBpZiAoVENSXzQoX19rbXBfZ3RpZF9tb2RlKSA8CisgICAgICAyKSB7IC8vIGNoZWNrIHN0YWNrIG9ubHkgaWYgaXQgaXMgdXNlZCB0byBnZXQgZ3RpZAorICAgIFRDV19QVFIodGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tiYXNlLCAmc3RhY2tfZGF0YSk7CisgICAgS01QX0FTU0VSVCh0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc19zdGFja2dyb3cgPT0gRkFMU0UpOworICAgIF9fa21wX2NoZWNrX3N0YWNrX292ZXJsYXAodGhpc190aHIpOworICB9CisgIEtNUF9NQigpOworICBleGl0X3ZhbCA9IF9fa21wX2xhdW5jaF90aHJlYWQodGhpc190aHIpOworICBLTVBfRlNZTkNfUkVMRUFTSU5HKCZ0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc19hbGl2ZSk7CisgIFRDV180KHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX2FsaXZlLCBGQUxTRSk7CisgIEtNUF9NQigpOworICByZXR1cm4gZXhpdF92YWw7Cit9CisKKyNpZiBLTVBfVVNFX01PTklUT1IKKy8qIFRoZSBtb25pdG9yIHRocmVhZCBjb250cm9scyBhbGwgb2YgdGhlIHRocmVhZHMgaW4gdGhlIGNvbXBsZXggKi8KKwordm9pZCAqX19zdGRjYWxsIF9fa21wX2xhdW5jaF9tb25pdG9yKHZvaWQgKmFyZykgeworICBEV09SRCB3YWl0X3N0YXR1czsKKyAga21wX3RocmVhZF90IG1vbml0b3I7CisgIGludCBzdGF0dXM7CisgIGludCBpbnRlcnZhbDsKKyAga21wX2luZm9fdCAqdGhpc190aHIgPSAoa21wX2luZm9fdCAqKWFyZzsKKworICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2luaXRfbW9uaXRvcik7CisgIFRDV180KF9fa21wX2luaXRfbW9uaXRvciwgMik7IC8vIEFDOiBTaWduYWwgbGlicmFyeSB0aGF0IG1vbml0b3IgaGFzIHN0YXJ0ZWQKKyAgLy8gVE9ETzogaGlkZSAiMiIgaW4gZW51bSAobGlrZSB7dHJ1ZSxmYWxzZSxzdGFydGVkfSkKKyAgdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkX2lkID0gR2V0Q3VycmVudFRocmVhZElkKCk7CisgIFRDV180KHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX2FsaXZlLCBUUlVFKTsKKworICBLTVBfTUIoKTsgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBfbGF1bmNoX21vbml0b3I6IGxhdW5jaGVkXG4iKSk7CisKKyAgbW9uaXRvciA9IEdldEN1cnJlbnRUaHJlYWQoKTsKKworICAvKiBzZXQgdGhyZWFkIHByaW9yaXR5ICovCisgIHN0YXR1cyA9IFNldFRocmVhZFByaW9yaXR5KG1vbml0b3IsIFRIUkVBRF9QUklPUklUWV9ISUdIRVNUKTsKKyAgaWYgKCFzdGF0dXMpIHsKKyAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgIF9fa21wX21zZyhrbXBfbXNfZmF0YWwsIEtNUF9NU0coQ2FudFNldFRocmVhZFByaW9yaXR5KSwgS01QX0VSUihlcnJvciksCisgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsKTsKKyAgfQorCisgIC8qIHJlZ2lzdGVyIHVzIGFzIG1vbml0b3IgKi8KKyAgX19rbXBfZ3RpZF9zZXRfc3BlY2lmaWMoS01QX0dUSURfTU9OSVRPUik7CisjaWZkZWYgS01QX1REQVRBX0dUSUQKKyNlcnJvciAiVGhpcyBkZWZpbmUgY2F1c2VzIHByb2JsZW1zIHdpdGggTG9hZExpYnJhcnkoKSArIGRlY2xzcGVjKHRocmVhZCkgIiBcCisgICAgICAgICJvbiBXaW5kb3dzKiBPUy4gIFNlZSBDUTUwNTY0LCB0ZXN0cyBrbXBfbG9hZF9saWJyYXJ5Ki5jIGFuZCB0aGlzIE1TRE4gIiBcCisgICAgICAgICJyZWZlcmVuY2U6IGh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20va2IvMTE4ODE2IgorLy9fX2ttcF9ndGlkID0gS01QX0dUSURfTU9OSVRPUjsKKyNlbmRpZgorCisjaWYgVVNFX0lUVF9CVUlMRAorICBfX2ttcF9pdHRfdGhyZWFkX2lnbm9yZSgpOyAvLyBJbnN0cnVjdCBJbnRlbChSKSBUaHJlYWRpbmcgVG9vbHMgdG8gaWdub3JlCisvLyBtb25pdG9yIHRocmVhZC4KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgS01QX01CKCk7IC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgaW50ZXJ2YWwgPSAoMTAwMCAvIF9fa21wX21vbml0b3Jfd2FrZXVwcyk7IC8qIGluIG1pbGxpc2Vjb25kcyAqLworCisgIHdoaWxlICghVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSkgeworICAgIC8qICBUaGlzIHRocmVhZCBtb25pdG9ycyB0aGUgc3RhdGUgb2YgdGhlIHN5c3RlbSAqLworCisgICAgS0FfVFJBQ0UoMTUsICgiX19rbXBfbGF1bmNoX21vbml0b3I6IHVwZGF0ZVxuIikpOworCisgICAgd2FpdF9zdGF0dXMgPSBXYWl0Rm9yU2luZ2xlT2JqZWN0KF9fa21wX21vbml0b3JfZXYsIGludGVydmFsKTsKKworICAgIGlmICh3YWl0X3N0YXR1cyA9PSBXQUlUX1RJTUVPVVQpIHsKKyAgICAgIFRDV180KF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlLAorICAgICAgICAgICAgVENSXzQoX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUpICsgMSk7CisgICAgfQorCisgICAgS01QX01CKCk7IC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgIH0KKworICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9sYXVuY2hfbW9uaXRvcjogZmluaXNoZWRcbiIpKTsKKworICBzdGF0dXMgPSBTZXRUaHJlYWRQcmlvcml0eShtb25pdG9yLCBUSFJFQURfUFJJT1JJVFlfTk9STUFMKTsKKyAgaWYgKCFzdGF0dXMpIHsKKyAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgIF9fa21wX21zZyhrbXBfbXNfZmF0YWwsIEtNUF9NU0coQ2FudFNldFRocmVhZFByaW9yaXR5KSwgS01QX0VSUihlcnJvciksCisgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsKTsKKyAgfQorCisgIGlmIChfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ICE9IDApIHsKKyAgICAvKiBub3cgd2UgbmVlZCB0byB0ZXJtaW5hdGUgdGhlIHdvcmtlciB0aHJlYWRzICAgKi8KKyAgICAvKiB0aGUgdmFsdWUgb2YgdF9hYm9ydCBpcyB0aGUgc2lnbmFsIHdlIGNhdWdodCAqLworICAgIGludCBndGlkOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfbGF1bmNoX21vbml0b3I6IHRlcm1pbmF0ZSBzaWc9JWRcbiIsCisgICAgICAgICAgICAgICAgICAoX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCkpKTsKKworICAgIC8qIHRlcm1pbmF0ZSB0aGUgT3Blbk1QIHdvcmtlciB0aHJlYWRzICovCisgICAgLyogVE9ETyB0aGlzIGlzIG5vdCB2YWxpZCBmb3Igc2libGluZyB0aHJlYWRzISEKKyAgICAgKiB0aGUgdWJlciBtYXN0ZXIgbWlnaHQgbm90IGJlIDAgYW55bW9yZS4uICovCisgICAgZm9yIChndGlkID0gMTsgZ3RpZCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7ICsrZ3RpZCkKKyAgICAgIF9fa21wX3Rlcm1pbmF0ZV90aHJlYWQoZ3RpZCk7CisKKyAgICBfX2ttcF9jbGVhbnVwKCk7CisKKyAgICBTbGVlcCgwKTsKKworICAgIEtBX1RSQUNFKDEwLAorICAgICAgICAgICAgICgiX19rbXBfbGF1bmNoX21vbml0b3I6IHJhaXNlIHNpZz0lZFxuIiwgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCkpOworCisgICAgaWYgKF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgPiAwKSB7CisgICAgICByYWlzZShfX2ttcF9nbG9iYWwuZy5nX2Fib3J0KTsKKyAgICB9CisgIH0KKworICBUQ1dfNCh0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc19hbGl2ZSwgRkFMU0UpOworCisgIEtNUF9NQigpOworICByZXR1cm4gYXJnOworfQorI2VuZGlmCisKK3ZvaWQgX19rbXBfY3JlYXRlX3dvcmtlcihpbnQgZ3RpZCwga21wX2luZm9fdCAqdGgsIHNpemVfdCBzdGFja19zaXplKSB7CisgIGttcF90aHJlYWRfdCBoYW5kbGU7CisgIERXT1JEIGlkVGhyZWFkOworCisgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2NyZWF0ZV93b3JrZXI6IHRyeSB0byBjcmVhdGUgdGhyZWFkICglZClcbiIsIGd0aWQpKTsKKworICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkID0gZ3RpZDsKKworICBpZiAoS01QX1VCRVJfR1RJRChndGlkKSkgeworICAgIGludCBzdGFja19kYXRhOworCisgICAgLyogVE9ETzogR2V0Q3VycmVudFRocmVhZCgpIHJldHVybnMgYSBwc2V1ZG8taGFuZGxlIHRoYXQgaXMgdW5zdWl0YWJsZSBmb3IKKyAgICAgICBvdGhlciB0aHJlYWRzIHRvIHVzZS4gSXMgaXQgYXBwcm9wcmlhdGUgdG8ganVzdCB1c2UgR2V0Q3VycmVudFRocmVhZD8KKyAgICAgICBXaGVuIHNob3VsZCB3ZSBjbG9zZSB0aGlzIGhhbmRsZT8gIFdoZW4gdW5yZWdpc3RlcmluZyB0aGUgcm9vdD8gKi8KKyAgICB7CisgICAgICBCT09MIHJjOworICAgICAgcmMgPSBEdXBsaWNhdGVIYW5kbGUoR2V0Q3VycmVudFByb2Nlc3MoKSwgR2V0Q3VycmVudFRocmVhZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Q3VycmVudFByb2Nlc3MoKSwgJnRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCBEVVBMSUNBVEVfU0FNRV9BQ0NFU1MpOworICAgICAgS01QX0FTU0VSVChyYyk7CisgICAgICBLQV9UUkFDRSgxMCwgKCIgX19rbXBfY3JlYXRlX3dvcmtlcjogUk9PVCBIYW5kbGUgZHVwbGljYXRlZCwgdGggPSAlcCwgIgorICAgICAgICAgICAgICAgICAgICAiaGFuZGxlID0gJSIgS01QX1VJTlRQVFJfU1BFQyAiXG4iLAorICAgICAgICAgICAgICAgICAgICAoTFBWT0lEKXRoLCB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQpKTsKKyAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZF9pZCA9IEdldEN1cnJlbnRUaHJlYWRJZCgpOworICAgIH0KKyAgICBpZiAoVENSXzQoX19rbXBfZ3RpZF9tb2RlKSA8IDIpIHsgLy8gY2hlY2sgc3RhY2sgb25seSBpZiB1c2VkIHRvIGdldCBndGlkCisgICAgICAvKiB3ZSB3aWxsIGR5bmFtaWNhbGx5IHVwZGF0ZSB0aGUgc3RhY2sgcmFuZ2UgaWYgZ3RpZF9tb2RlID09IDEgKi8KKyAgICAgIFRDV19QVFIodGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tiYXNlLCAmc3RhY2tfZGF0YSk7CisgICAgICBUQ1dfUFRSKHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSwgMCk7CisgICAgICBUQ1dfNCh0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2dyb3csIFRSVUUpOworICAgICAgX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcCh0aCk7CisgICAgfQorICB9IGVsc2UgeworICAgIEtNUF9NQigpOyAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgLyogU2V0IHN0YWNrIHNpemUgZm9yIHRoaXMgdGhyZWFkIG5vdy4gKi8KKyAgICBLQV9UUkFDRSgxMCwKKyAgICAgICAgICAgICAoIl9fa21wX2NyZWF0ZV93b3JrZXI6IHN0YWNrX3NpemUgPSAlIiBLTVBfU0laRV9UX1NQRUMgIiBieXRlc1xuIiwKKyAgICAgICAgICAgICAgc3RhY2tfc2l6ZSkpOworCisgICAgc3RhY2tfc2l6ZSArPSBndGlkICogX19rbXBfc3Rrb2Zmc2V0OworCisgICAgVENXX1BUUih0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUsIHN0YWNrX3NpemUpOworICAgIFRDV180KHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrZ3JvdywgRkFMU0UpOworCisgICAgS0FfVFJBQ0UoMTAsCisgICAgICAgICAgICAgKCJfX2ttcF9jcmVhdGVfd29ya2VyOiAoYmVmb3JlKSBzdGFja19zaXplID0gJSIgS01QX1NJWkVfVF9TUEVDCisgICAgICAgICAgICAgICIgYnl0ZXMsICZfX2ttcF9sYXVuY2hfd29ya2VyID0gJXAsIHRoID0gJXAsICZpZFRocmVhZCA9ICVwXG4iLAorICAgICAgICAgICAgICAoU0laRV9UKXN0YWNrX3NpemUsIChMUFRIUkVBRF9TVEFSVF9ST1VUSU5FKSZfX2ttcF9sYXVuY2hfd29ya2VyLAorICAgICAgICAgICAgICAoTFBWT0lEKXRoLCAmaWRUaHJlYWQpKTsKKworICAgIGhhbmRsZSA9IENyZWF0ZVRocmVhZCgKKyAgICAgICAgTlVMTCwgKFNJWkVfVClzdGFja19zaXplLCAoTFBUSFJFQURfU1RBUlRfUk9VVElORSlfX2ttcF9sYXVuY2hfd29ya2VyLAorICAgICAgICAoTFBWT0lEKXRoLCBTVEFDS19TSVpFX1BBUkFNX0lTX0FfUkVTRVJWQVRJT04sICZpZFRocmVhZCk7CisKKyAgICBLQV9UUkFDRSgxMCwKKyAgICAgICAgICAgICAoIl9fa21wX2NyZWF0ZV93b3JrZXI6IChhZnRlcikgc3RhY2tfc2l6ZSA9ICUiIEtNUF9TSVpFX1RfU1BFQworICAgICAgICAgICAgICAiIGJ5dGVzLCAmX19rbXBfbGF1bmNoX3dvcmtlciA9ICVwLCB0aCA9ICVwLCAiCisgICAgICAgICAgICAgICJpZFRocmVhZCA9ICV1LCBoYW5kbGUgPSAlIiBLTVBfVUlOVFBUUl9TUEVDICJcbiIsCisgICAgICAgICAgICAgIChTSVpFX1Qpc3RhY2tfc2l6ZSwgKExQVEhSRUFEX1NUQVJUX1JPVVRJTkUpJl9fa21wX2xhdW5jaF93b3JrZXIsCisgICAgICAgICAgICAgIChMUFZPSUQpdGgsIGlkVGhyZWFkLCBoYW5kbGUpKTsKKworICAgIGlmIChoYW5kbGUgPT0gMCkgeworICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgIF9fa21wX21zZyhrbXBfbXNfZmF0YWwsIEtNUF9NU0coQ2FudENyZWF0ZVRocmVhZCksIEtNUF9FUlIoZXJyb3IpLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsKTsKKyAgICB9IGVsc2UgeworICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkID0gaGFuZGxlOworICAgIH0KKworICAgIEtNUF9NQigpOyAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworICB9CisKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBfY3JlYXRlX3dvcmtlcjogZG9uZSBjcmVhdGluZyB0aHJlYWQgKCVkKVxuIiwgZ3RpZCkpOworfQorCitpbnQgX19rbXBfc3RpbGxfcnVubmluZyhrbXBfaW5mb190ICp0aCkgeworICByZXR1cm4gKFdBSVRfVElNRU9VVCA9PSBXYWl0Rm9yU2luZ2xlT2JqZWN0KHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCwgMCkpOworfQorCisjaWYgS01QX1VTRV9NT05JVE9SCit2b2lkIF9fa21wX2NyZWF0ZV9tb25pdG9yKGttcF9pbmZvX3QgKnRoKSB7CisgIGttcF90aHJlYWRfdCBoYW5kbGU7CisgIERXT1JEIGlkVGhyZWFkOworICBpbnQgaWRlYWwsIG5ld19pZGVhbDsKKworICBpZiAoX19rbXBfZGZsdF9ibG9ja3RpbWUgPT0gS01QX01BWF9CTE9DS1RJTUUpIHsKKyAgICAvLyBXZSBkb24ndCBuZWVkIG1vbml0b3IgdGhyZWFkIGluIGNhc2Ugb2YgTUFYX0JMT0NLVElNRQorICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2NyZWF0ZV9tb25pdG9yOiBza2lwcGluZyBtb25pdG9yIHRocmVhZCBiZWNhdXNlIG9mICIKKyAgICAgICAgICAgICAgICAgICJNQVggYmxvY2t0aW1lXG4iKSk7CisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkID0gMDsgLy8gdGhpcyBtYWtlcyByZWFwX21vbml0b3Igbm8tb3AKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkID0gMDsKKyAgICBUQ1dfNChfX2ttcF9pbml0X21vbml0b3IsIDIpOyAvLyBTaWduYWwgdG8gc3RvcCB3YWl0aW5nIGZvciBtb25pdG9yIGNyZWF0aW9uCisgICAgcmV0dXJuOworICB9CisgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2NyZWF0ZV9tb25pdG9yOiB0cnkgdG8gY3JlYXRlIG1vbml0b3JcbiIpKTsKKworICBLTVBfTUIoKTsgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICBfX2ttcF9tb25pdG9yX2V2ID0gQ3JlYXRlRXZlbnQoTlVMTCwgVFJVRSwgRkFMU0UsIE5VTEwpOworICBpZiAoX19rbXBfbW9uaXRvcl9ldiA9PSBOVUxMKSB7CisgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICBfX2ttcF9tc2coa21wX21zX2ZhdGFsLCBLTVBfTVNHKENhbnRDcmVhdGVFdmVudCksIEtNUF9FUlIoZXJyb3IpLAorICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCk7CisgIH07IC8vIGlmCisjaWYgVVNFX0lUVF9CVUlMRAorICBfX2ttcF9pdHRfc3lzdGVtX29iamVjdF9jcmVhdGVkKF9fa21wX21vbml0b3JfZXYsICJFdmVudCIpOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICB0aC0+dGgudGhfaW5mby5kcy5kc190aWQgPSBLTVBfR1RJRF9NT05JVE9SOworICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkID0gS01QX0dUSURfTU9OSVRPUjsKKworICAvLyBGSVhNRSAtIG9uIFdpbmRvd3MqIE9TLCBpZiBfX2ttcF9tb25pdG9yX3N0a3NpemUgPSAwLCBmaWd1cmUgb3V0IGhvdworICAvLyB0byBhdXRvbWF0aWNhbGx5IGV4cGFuZCBzdGFja3NpemUgYmFzZWQgb24gQ3JlYXRlVGhyZWFkIGVycm9yIGNvZGUuCisgIGlmIChfX2ttcF9tb25pdG9yX3N0a3NpemUgPT0gMCkgeworICAgIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA9IEtNUF9ERUZBVUxUX01PTklUT1JfU1RLU0laRTsKKyAgfQorICBpZiAoX19rbXBfbW9uaXRvcl9zdGtzaXplIDwgX19rbXBfc3lzX21pbl9zdGtzaXplKSB7CisgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplID0gX19rbXBfc3lzX21pbl9zdGtzaXplOworICB9CisKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBfY3JlYXRlX21vbml0b3I6IHJlcXVlc3RlZCBzdGFja3NpemUgPSAlZCBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAoaW50KV9fa21wX21vbml0b3Jfc3Rrc2l6ZSkpOworCisgIFRDV180KF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlLCAwKTsKKworICBoYW5kbGUgPQorICAgICAgQ3JlYXRlVGhyZWFkKE5VTEwsIChTSVpFX1QpX19rbXBfbW9uaXRvcl9zdGtzaXplLAorICAgICAgICAgICAgICAgICAgIChMUFRIUkVBRF9TVEFSVF9ST1VUSU5FKV9fa21wX2xhdW5jaF9tb25pdG9yLCAoTFBWT0lEKXRoLAorICAgICAgICAgICAgICAgICAgIFNUQUNLX1NJWkVfUEFSQU1fSVNfQV9SRVNFUlZBVElPTiwgJmlkVGhyZWFkKTsKKyAgaWYgKGhhbmRsZSA9PSAwKSB7CisgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICBfX2ttcF9tc2coa21wX21zX2ZhdGFsLCBLTVBfTVNHKENhbnRDcmVhdGVUaHJlYWQpLCBLTVBfRVJSKGVycm9yKSwKKyAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwpOworICB9IGVsc2UKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgPSBoYW5kbGU7CisKKyAgS01QX01CKCk7IC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBfY3JlYXRlX21vbml0b3I6IG1vbml0b3IgY3JlYXRlZCAlcFxuIiwKKyAgICAgICAgICAgICAgICAodm9pZCAqKXRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCkpOworfQorI2VuZGlmCisKKy8qIENoZWNrIHRvIHNlZSBpZiB0aHJlYWQgaXMgc3RpbGwgYWxpdmUuCisgICBOT1RFOiAgVGhlIEV4aXRQcm9jZXNzKGNvZGUpIHN5c3RlbSBjYWxsIGNhdXNlcyBhbGwgdGhyZWFkcyB0byBUZXJtaW5hdGUKKyAgIHdpdGggYSBleGl0X3ZhbCA9IGNvZGUuICBCZWNhdXNlIG9mIHRoaXMgd2UgY2FuIG5vdCByZWx5IG9uIGV4aXRfdmFsIGhhdmluZworICAgYW55IHBhcnRpY3VsYXIgdmFsdWUuICBTbyB0aGlzIHJvdXRpbmUgbWF5IHJldHVybiBTVElMTF9BTElWRSBpbiBleGl0X3ZhbAorICAgZXZlbiBhZnRlciB0aGUgdGhyZWFkIGlzIGRlYWQuICovCisKK2ludCBfX2ttcF9pc190aHJlYWRfYWxpdmUoa21wX2luZm9fdCAqdGgsIERXT1JEICpleGl0X3ZhbCkgeworICBEV09SRCByYzsKKyAgcmMgPSBHZXRFeGl0Q29kZVRocmVhZCh0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQsIGV4aXRfdmFsKTsKKyAgaWYgKHJjID09IDApIHsKKyAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgIF9fa21wX21zZyhrbXBfbXNfZmF0YWwsIEtNUF9NU0coRnVuY3Rpb25FcnJvciwgIkdldEV4aXRDb2RlVGhyZWFkKCkiKSwKKyAgICAgICAgICAgICAgS01QX0VSUihlcnJvciksIF9fa21wX21zZ19udWxsKTsKKyAgfTsgLy8gaWYKKyAgcmV0dXJuICgqZXhpdF92YWwgPT0gU1RJTExfQUNUSVZFKTsKK30KKwordm9pZCBfX2ttcF9leGl0X3RocmVhZChpbnQgZXhpdF9zdGF0dXMpIHsKKyAgRXhpdFRocmVhZChleGl0X3N0YXR1cyk7Cit9IC8vIF9fa21wX2V4aXRfdGhyZWFkCisKKy8vIFRoaXMgaXMgYSBjb21tb24gcGFydCBmb3IgYm90aCBfX2ttcF9yZWFwX3dvcmtlcigpIGFuZCBfX2ttcF9yZWFwX21vbml0b3IoKS4KK3N0YXRpYyB2b2lkIF9fa21wX3JlYXBfY29tbW9uKGttcF9pbmZvX3QgKnRoKSB7CisgIERXT1JEIGV4aXRfdmFsOworCisgIEtNUF9NQigpOyAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgIEtBX1RSQUNFKAorICAgICAgMTAsICgiX19rbXBfcmVhcF9jb21tb246IHRyeSB0byByZWFwICglZClcbiIsIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQpKTsKKworICAvKiAyMDA2LTEwLTE5OgorICAgICBUaGVyZSBhcmUgdHdvIG9wcG9zaXRlIHNpdHVhdGlvbnM6CisgICAgIDEuIFdpbmRvd3MqIE9TIGtlZXAgdGhyZWFkIGFsaXZlIGFmdGVyIGl0IHJlc2V0cyBkc19hbGl2ZSBmbGFnIGFuZAorICAgICBleGl0cyBmcm9tIHRocmVhZCBmdW5jdGlvbi4gKEZvciBleGFtcGxlLCBzZWUgQzcwNzcwL1EzOTQyODEgInVubG9hZGluZyBvZgorICAgICBkbGwgYmFzZWQgb24gT01QIGlzIHZlcnkgc2xvdyIuKQorICAgICAyLiBXaW5kb3dzKiBPUyBtYXkga2lsbCB0aHJlYWQgYmVmb3JlIGl0IHJlc2V0cyBkc19hbGl2ZSBmbGFnLgorCisgICAgIFJpZ2h0IHNvbHV0aW9uIHNlZW1zIHRvIGJlIHdhaXRpbmcgZm9yICplaXRoZXIqIHRocmVhZCB0ZXJtaW5hdGlvbiAqb3IqCisgICAgIGRzX2FsaXZlIHJlc2V0dGluZy4gKi8KKyAgeworICAgIC8vIFRPRE86IFRoaXMgY29kZSBpcyB2ZXJ5IHNpbWlsYXIgdG8gS01QX1dBSVRfWUlFTEQuIE5lZWQgdG8gZ2VuZXJhbGl6ZQorICAgIC8vIEtNUF9XQUlUX1lJRUxEIHRvIGNvdmVyIHRoaXMgdXNhZ2UgYWxzby4KKyAgICB2b2lkICpvYmogPSBOVUxMOworICAgIGttcF91aW50MzIgc3BpbnM7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIEtNUF9GU1lOQ19TUElOX0lOSVQob2JqLCAodm9pZCAqKSZ0aC0+dGgudGhfaW5mby5kcy5kc19hbGl2ZSk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIEtNUF9JTklUX1lJRUxEKHNwaW5zKTsKKyAgICBkbyB7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRShvYmopOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgIF9fa21wX2lzX3RocmVhZF9hbGl2ZSh0aCwgJmV4aXRfdmFsKTsKKyAgICAgIEtNUF9ZSUVMRChUQ1JfNChfX2ttcF9udGgpID4gX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICBLTVBfWUlFTERfU1BJTihzcGlucyk7CisgICAgfSB3aGlsZSAoZXhpdF92YWwgPT0gU1RJTExfQUNUSVZFICYmIFRDUl80KHRoLT50aC50aF9pbmZvLmRzLmRzX2FsaXZlKSk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGlmIChleGl0X3ZhbCA9PSBTVElMTF9BQ1RJVkUpIHsKKyAgICAgIEtNUF9GU1lOQ19DQU5DRUwob2JqKTsKKyAgICB9IGVsc2UgeworICAgICAgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQob2JqKTsKKyAgICB9OyAvLyBpZgorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgfQorCisgIF9fa21wX2ZyZWVfaGFuZGxlKHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCk7CisKKyAgLyogTk9URTogIFRoZSBFeGl0UHJvY2Vzcyhjb2RlKSBzeXN0ZW0gY2FsbCBjYXVzZXMgYWxsIHRocmVhZHMgdG8gVGVybWluYXRlCisgICAgIHdpdGggYSBleGl0X3ZhbCA9IGNvZGUuICBCZWNhdXNlIG9mIHRoaXMgd2UgY2FuIG5vdCByZWx5IG9uIGV4aXRfdmFsIGhhdmluZworICAgICBhbnkgcGFydGljdWxhciB2YWx1ZS4gKi8KKyAgaWYgKGV4aXRfdmFsID09IFNUSUxMX0FDVElWRSkgeworICAgIEtBX1RSQUNFKDEsICgiX19rbXBfcmVhcF9jb21tb246IHRocmVhZCBzdGlsbCBhY3RpdmUuXG4iKSk7CisgIH0gZWxzZSBpZiAoKHZvaWQgKilleGl0X3ZhbCAhPSAodm9pZCAqKXRoKSB7CisgICAgS0FfVFJBQ0UoMSwgKCJfX2ttcF9yZWFwX2NvbW1vbjogRXhpdFByb2Nlc3MgLyBUZXJtaW5hdGVUaHJlYWQgdXNlZD9cbiIpKTsKKyAgfTsgLy8gaWYKKworICBLQV9UUkFDRSgxMCwKKyAgICAgICAgICAgKCJfX2ttcF9yZWFwX2NvbW1vbjogZG9uZSByZWFwaW5nICglZCksIGhhbmRsZSA9ICUiIEtNUF9VSU5UUFRSX1NQRUMKKyAgICAgICAgICAgICJcbiIsCisgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkLCB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQpKTsKKworICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgPSAwOworICB0aC0+dGgudGhfaW5mby5kcy5kc190aWQgPSBLTVBfR1RJRF9ETkU7CisgIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgPSBLTVBfR1RJRF9ETkU7CisgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZF9pZCA9IDA7CisKKyAgS01QX01CKCk7IC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCit9CisKKyNpZiBLTVBfVVNFX01PTklUT1IKK3ZvaWQgX19rbXBfcmVhcF9tb25pdG9yKGttcF9pbmZvX3QgKnRoKSB7CisgIGludCBzdGF0dXM7CisKKyAgS0FfVFJBQ0UoMTAsICgiX19rbXBfcmVhcF9tb25pdG9yOiB0cnkgdG8gcmVhcCAlcFxuIiwKKyAgICAgICAgICAgICAgICAodm9pZCAqKXRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCkpOworCisgIC8vIElmIG1vbml0b3IgaGFzIGJlZW4gY3JlYXRlZCwgaXRzIHRpZCBhbmQgZ3RpZCBzaG91bGQgYmUgS01QX0dUSURfTU9OSVRPUi4KKyAgLy8gSWYgYm90aCB0aWQgYW5kIGd0aWQgYXJlIDAsIGl0IG1lYW5zIHRoZSBtb25pdG9yIGRpZCBub3QgZXZlciBzdGFydC4KKyAgLy8gSWYgYm90aCB0aWQgYW5kIGd0aWQgYXJlIEtNUF9HVElEX0RORSwgdGhlIG1vbml0b3IgaGFzIGJlZW4gc2h1dCBkb3duLgorICBLTVBfREVCVUdfQVNTRVJUKHRoLT50aC50aF9pbmZvLmRzLmRzX3RpZCA9PSB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkKTsKKyAgaWYgKHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgIT0gS01QX0dUSURfTU9OSVRPUikgeworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3JlYXBfbW9uaXRvcjogbW9uaXRvciBkaWQgbm90IHN0YXJ0LCByZXR1cm5pbmdcbiIpKTsKKyAgICByZXR1cm47CisgIH07IC8vIGlmCisKKyAgS01QX01CKCk7IC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgc3RhdHVzID0gU2V0RXZlbnQoX19rbXBfbW9uaXRvcl9ldik7CisgIGlmIChzdGF0dXMgPT0gRkFMU0UpIHsKKyAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgIF9fa21wX21zZyhrbXBfbXNfZmF0YWwsIEtNUF9NU0coQ2FudFNldEV2ZW50KSwgS01QX0VSUihlcnJvciksCisgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsKTsKKyAgfQorICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9yZWFwX21vbml0b3I6IHJlYXBpbmcgdGhyZWFkICglZClcbiIsCisgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCkpOworICBfX2ttcF9yZWFwX2NvbW1vbih0aCk7CisKKyAgX19rbXBfZnJlZV9oYW5kbGUoX19rbXBfbW9uaXRvcl9ldik7CisKKyAgS01QX01CKCk7IC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCit9CisjZW5kaWYKKwordm9pZCBfX2ttcF9yZWFwX3dvcmtlcihrbXBfaW5mb190ICp0aCkgeworICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9yZWFwX3dvcmtlcjogcmVhcGluZyB0aHJlYWQgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkKSk7CisgIF9fa21wX3JlYXBfY29tbW9uKHRoKTsKK30KKworI2lmIEtNUF9IQU5ETEVfU0lHTkFMUworCitzdGF0aWMgdm9pZCBfX2ttcF90ZWFtX2hhbmRsZXIoaW50IHNpZ25vKSB7CisgIGlmIChfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ID09IDApIHsKKyAgICAvLyBTdGFnZSAxIHNpZ25hbCBoYW5kbGVyLCBsZXQncyBzaHV0IGRvd24gYWxsIG9mIHRoZSB0aHJlYWRzLgorICAgIGlmIChfX2ttcF9kZWJ1Z19idWYpIHsKKyAgICAgIF9fa21wX2R1bXBfZGVidWdfYnVmZmVyKCk7CisgICAgfTsgLy8gaWYKKyAgICBLTVBfTUIoKTsgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgIFRDV180KF9fa21wX2dsb2JhbC5nLmdfYWJvcnQsIHNpZ25vKTsKKyAgICBLTVBfTUIoKTsgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgIFRDV180KF9fa21wX2dsb2JhbC5nLmdfZG9uZSwgVFJVRSk7CisgICAgS01QX01CKCk7IC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgfQorfSAvLyBfX2ttcF90ZWFtX2hhbmRsZXIKKworc3RhdGljIHNpZ19mdW5jX3QgX19rbXBfc2lnbmFsKGludCBzaWdudW0sIHNpZ19mdW5jX3QgaGFuZGxlcikgeworICBzaWdfZnVuY190IG9sZCA9IHNpZ25hbChzaWdudW0sIGhhbmRsZXIpOworICBpZiAob2xkID09IFNJR19FUlIpIHsKKyAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICBfX2ttcF9tc2coa21wX21zX2ZhdGFsLCBLTVBfTVNHKEZ1bmN0aW9uRXJyb3IsICJzaWduYWwiKSwgS01QX0VSUihlcnJvciksCisgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsKTsKKyAgfTsgLy8gaWYKKyAgcmV0dXJuIG9sZDsKK30KKworc3RhdGljIHZvaWQgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlcihpbnQgc2lnLCBzaWdfZnVuY190IGhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXJhbGxlbF9pbml0KSB7CisgIHNpZ19mdW5jX3Qgb2xkOworICBLTVBfTUIoKTsgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKyAgS0JfVFJBQ0UoNjAsICgiX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlcjogY2FsbGVkOiBzaWc9JWRcbiIsIHNpZykpOworICBpZiAocGFyYWxsZWxfaW5pdCkgeworICAgIG9sZCA9IF9fa21wX3NpZ25hbChzaWcsIGhhbmRsZXIpOworICAgIC8vIFNJR19ERkwgb24gV2luZG93cyogT1MgaW4gTlVMTCBvciAwLgorICAgIGlmIChvbGQgPT0gX19rbXBfc2lnaGxkcnNbc2lnXSkgeworICAgICAgX19rbXBfc2lnaW5zdGFsbGVkW3NpZ10gPSAxOworICAgIH0gZWxzZSB7IC8vIFJlc3RvcmUva2VlcCB1c2VyJ3MgaGFuZGxlciBpZiBvbmUgcHJldmlvdXNseSBpbnN0YWxsZWQuCisgICAgICBvbGQgPSBfX2ttcF9zaWduYWwoc2lnLCBvbGQpOworICAgIH07IC8vIGlmCisgIH0gZWxzZSB7CisgICAgLy8gU2F2ZSBpbml0aWFsL3N5c3RlbSBzaWduYWwgaGFuZGxlcnMgdG8gc2VlIGlmIHVzZXIgaGFuZGxlcnMgaW5zdGFsbGVkLgorICAgIC8vIDIwMDktMDktMjM6IEl0IGlzIGEgZGVhZCBjb2RlLiBPbiBXaW5kb3dzKiBPUyBfX2ttcF9pbnN0YWxsX3NpZ25hbHMKKyAgICAvLyBjYWxsZWQgb25jZSB3aXRoIHBhcmFsbGVsX2luaXQgPT0gVFJVRS4KKyAgICBvbGQgPSBfX2ttcF9zaWduYWwoc2lnLCBTSUdfREZMKTsKKyAgICBfX2ttcF9zaWdobGRyc1tzaWddID0gb2xkOworICAgIF9fa21wX3NpZ25hbChzaWcsIG9sZCk7CisgIH07IC8vIGlmCisgIEtNUF9NQigpOyAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworfSAvLyBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyCisKK3N0YXRpYyB2b2lkIF9fa21wX3JlbW92ZV9vbmVfaGFuZGxlcihpbnQgc2lnKSB7CisgIGlmIChfX2ttcF9zaWdpbnN0YWxsZWRbc2lnXSkgeworICAgIHNpZ19mdW5jX3Qgb2xkOworICAgIEtNUF9NQigpOyAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCisgICAgS0JfVFJBQ0UoNjAsICgiX19rbXBfcmVtb3ZlX29uZV9oYW5kbGVyOiBjYWxsZWQ6IHNpZz0lZFxuIiwgc2lnKSk7CisgICAgb2xkID0gX19rbXBfc2lnbmFsKHNpZywgX19rbXBfc2lnaGxkcnNbc2lnXSk7CisgICAgaWYgKG9sZCAhPSBfX2ttcF90ZWFtX2hhbmRsZXIpIHsKKyAgICAgIEtCX1RSQUNFKDEwLCAoIl9fa21wX3JlbW92ZV9vbmVfaGFuZGxlcjogb29wcywgbm90IG91ciBoYW5kbGVyLCAiCisgICAgICAgICAgICAgICAgICAgICJyZXN0b3Jpbmc6IHNpZz0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgc2lnKSk7CisgICAgICBvbGQgPSBfX2ttcF9zaWduYWwoc2lnLCBvbGQpOworICAgIH07IC8vIGlmCisgICAgX19rbXBfc2lnaGxkcnNbc2lnXSA9IE5VTEw7CisgICAgX19rbXBfc2lnaW5zdGFsbGVkW3NpZ10gPSAwOworICAgIEtNUF9NQigpOyAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCisgIH07IC8vIGlmCit9IC8vIF9fa21wX3JlbW92ZV9vbmVfaGFuZGxlcgorCit2b2lkIF9fa21wX2luc3RhbGxfc2lnbmFscyhpbnQgcGFyYWxsZWxfaW5pdCkgeworICBLQl9UUkFDRSgxMCwgKCJfX2ttcF9pbnN0YWxsX3NpZ25hbHM6IGNhbGxlZFxuIikpOworICBpZiAoIV9fa21wX2hhbmRsZV9zaWduYWxzKSB7CisgICAgS0JfVFJBQ0UoMTAsICgiX19rbXBfaW5zdGFsbF9zaWduYWxzOiBLTVBfSEFORExFX1NJR05BTFMgaXMgZmFsc2UgLSAiCisgICAgICAgICAgICAgICAgICAiaGFuZGxlcnMgbm90IGluc3RhbGxlZFxuIikpOworICAgIHJldHVybjsKKyAgfTsgLy8gaWYKKyAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlcihTSUdJTlQsIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCk7CisgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoU0lHSUxMLCBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQpOworICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKFNJR0FCUlQsIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCk7CisgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoU0lHRlBFLCBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQpOworICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKFNJR1NFR1YsIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCk7CisgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoU0lHVEVSTSwgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0KTsKK30gLy8gX19rbXBfaW5zdGFsbF9zaWduYWxzCisKK3ZvaWQgX19rbXBfcmVtb3ZlX3NpZ25hbHModm9pZCkgeworICBpbnQgc2lnOworICBLQl9UUkFDRSgxMCwgKCJfX2ttcF9yZW1vdmVfc2lnbmFsczogY2FsbGVkXG4iKSk7CisgIGZvciAoc2lnID0gMTsgc2lnIDwgTlNJRzsgKytzaWcpIHsKKyAgICBfX2ttcF9yZW1vdmVfb25lX2hhbmRsZXIoc2lnKTsKKyAgfTsgLy8gZm9yIHNpZworfSAvLyBfX2ttcF9yZW1vdmVfc2lnbmFscworCisjZW5kaWYgLy8gS01QX0hBTkRMRV9TSUdOQUxTCisKKy8qIFB1dCB0aGUgdGhyZWFkIHRvIHNsZWVwIGZvciBhIHRpbWUgcGVyaW9kICovCit2b2lkIF9fa21wX3RocmVhZF9zbGVlcChpbnQgbWlsbGlzKSB7CisgIERXT1JEIHN0YXR1czsKKworICBzdGF0dXMgPSBTbGVlcEV4KChEV09SRCltaWxsaXMsIEZBTFNFKTsKKyAgaWYgKHN0YXR1cykgeworICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgX19rbXBfbXNnKGttcF9tc19mYXRhbCwgS01QX01TRyhGdW5jdGlvbkVycm9yLCAiU2xlZXBFeCgpIiksIEtNUF9FUlIoZXJyb3IpLAorICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCk7CisgIH0KK30KKworLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIGFkZHJlc3MgaXMgbWFwcGVkIGludG8gdGhlIGN1cnJlbnQgYWRkcmVzcyBzcGFjZS4KK2ludCBfX2ttcF9pc19hZGRyZXNzX21hcHBlZCh2b2lkICphZGRyKSB7CisgIERXT1JEIHN0YXR1czsKKyAgTUVNT1JZX0JBU0lDX0lORk9STUFUSU9OIGxwQnVmZmVyOworICBTSVpFX1QgZHdMZW5ndGg7CisKKyAgZHdMZW5ndGggPSBzaXplb2YoTUVNT1JZX0JBU0lDX0lORk9STUFUSU9OKTsKKworICBzdGF0dXMgPSBWaXJ0dWFsUXVlcnkoYWRkciwgJmxwQnVmZmVyLCBkd0xlbmd0aCk7CisKKyAgcmV0dXJuICEoKChscEJ1ZmZlci5TdGF0ZSA9PSBNRU1fUkVTRVJWRSkgfHwgKGxwQnVmZmVyLlN0YXRlID09IE1FTV9GUkVFKSkgfHwKKyAgICAgICAgICAgKChscEJ1ZmZlci5Qcm90ZWN0ID09IFBBR0VfTk9BQ0NFU1MpIHx8CisgICAgICAgICAgICAobHBCdWZmZXIuUHJvdGVjdCA9PSBQQUdFX0VYRUNVVEUpKSk7Cit9CisKK2ttcF91aW50NjQgX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wKHZvaWQpIHsKKyAga21wX3VpbnQ2NCByID0gMDsKKworICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigoTEFSR0VfSU5URUdFUiAqKSZyKTsKKyAgcmV0dXJuIHI7Cit9CisKKy8qIEZyZWUgaGFuZGxlIGFuZCBjaGVjayB0aGUgZXJyb3IgY29kZSAqLwordm9pZCBfX2ttcF9mcmVlX2hhbmRsZShrbXBfdGhyZWFkX3QgdEhhbmRsZSkgeworICAvKiBjYWxsZWQgd2l0aCBwYXJhbWV0ZXIgdHlwZSBIQU5ETEUgYWxzbywgdGh1cyBzdXBwb3NlIGttcF90aHJlYWRfdCBkZWZpbmVkCisgICAqIGFzIEhBTkRMRSAqLworICBCT09MIHJjOworICByYyA9IENsb3NlSGFuZGxlKHRIYW5kbGUpOworICBpZiAoIXJjKSB7CisgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICBfX2ttcF9tc2coa21wX21zX2ZhdGFsLCBLTVBfTVNHKENhbnRDbG9zZUhhbmRsZSksIEtNUF9FUlIoZXJyb3IpLAorICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCk7CisgIH0KK30KKworaW50IF9fa21wX2dldF9sb2FkX2JhbGFuY2UoaW50IG1heCkgeworICBzdGF0aWMgVUxPTkcgZ2xiX2J1ZmZfc2l6ZSA9IDEwMCAqIDEwMjQ7CisKKyAgLy8gU2F2ZWQgY291bnQgb2YgdGhlIHJ1bm5pbmcgdGhyZWFkcyBmb3IgdGhlIHRocmVhZCBiYWxhbmNlIGFsZ29ydGlobQorICBzdGF0aWMgaW50IGdsYl9ydW5uaW5nX3RocmVhZHMgPSAwOworICBzdGF0aWMgZG91YmxlIGdsYl9jYWxsX3RpbWUgPSAwOyAvKiBUaHJlYWQgYmFsYW5jZSBhbGdvcml0aG0gY2FsbCB0aW1lICovCisKKyAgaW50IHJ1bm5pbmdfdGhyZWFkcyA9IDA7IC8vIE51bWJlciBvZiBydW5uaW5nIHRocmVhZHMgaW4gdGhlIHN5c3RlbS4KKyAgTlRTVEFUVVMgc3RhdHVzID0gMDsKKyAgVUxPTkcgYnVmZl9zaXplID0gMDsKKyAgVUxPTkcgaW5mb19zaXplID0gMDsKKyAgdm9pZCAqYnVmZmVyID0gTlVMTDsKKyAgUFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OIHNwaSA9IE5VTEw7CisgIGludCBmaXJzdF90aW1lID0gMTsKKworICBkb3VibGUgY2FsbF90aW1lID0gMC4wOyAvLyBzdGFydCwgZmluaXNoOworCisgIF9fa21wX2VsYXBzZWQoJmNhbGxfdGltZSk7CisKKyAgaWYgKGdsYl9jYWxsX3RpbWUgJiYKKyAgICAgIChjYWxsX3RpbWUgLSBnbGJfY2FsbF90aW1lIDwgX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsKSkgeworICAgIHJ1bm5pbmdfdGhyZWFkcyA9IGdsYl9ydW5uaW5nX3RocmVhZHM7CisgICAgZ290byBmaW5pc2g7CisgIH0KKyAgZ2xiX2NhbGxfdGltZSA9IGNhbGxfdGltZTsKKworICAvLyBEbyBub3Qgc3BlbmQgdGltZSBvbiBydW5uaW5nIGFsZ29yaXRobSBpZiB3ZSBoYXZlIGEgcGVybWFuZW50IGVycm9yLgorICBpZiAoTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uID09IE5VTEwpIHsKKyAgICBydW5uaW5nX3RocmVhZHMgPSAtMTsKKyAgICBnb3RvIGZpbmlzaDsKKyAgfTsgLy8gaWYKKworICBpZiAobWF4IDw9IDApIHsKKyAgICBtYXggPSBJTlRfTUFYOworICB9OyAvLyBpZgorCisgIGRvIHsKKworICAgIGlmIChmaXJzdF90aW1lKSB7CisgICAgICBidWZmX3NpemUgPSBnbGJfYnVmZl9zaXplOworICAgIH0gZWxzZSB7CisgICAgICBidWZmX3NpemUgPSAyICogYnVmZl9zaXplOworICAgIH0KKworICAgIGJ1ZmZlciA9IEtNUF9JTlRFUk5BTF9SRUFMTE9DKGJ1ZmZlciwgYnVmZl9zaXplKTsKKyAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICAgIHJ1bm5pbmdfdGhyZWFkcyA9IC0xOworICAgICAgZ290byBmaW5pc2g7CisgICAgfTsgLy8gaWYKKyAgICBzdGF0dXMgPSBOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb24oU3lzdGVtUHJvY2Vzc0luZm9ybWF0aW9uLCBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZfc2l6ZSwgJmluZm9fc2l6ZSk7CisgICAgZmlyc3RfdGltZSA9IDA7CisKKyAgfSB3aGlsZSAoc3RhdHVzID09IFNUQVRVU19JTkZPX0xFTkdUSF9NSVNNQVRDSCk7CisgIGdsYl9idWZmX3NpemUgPSBidWZmX3NpemU7CisKKyNkZWZpbmUgQ0hFQ0soY29uZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoY29uZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIShjb25kKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBydW5uaW5nX3RocmVhZHMgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZ290byBmaW5pc2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworICBDSEVDSyhidWZmX3NpemUgPj0gaW5mb19zaXplKTsKKyAgc3BpID0gUFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OKGJ1ZmZlcik7CisgIGZvciAoOzspIHsKKyAgICBwdHJkaWZmX3Qgb2Zmc2V0ID0gdWludHB0cl90KHNwaSkgLSB1aW50cHRyX3QoYnVmZmVyKTsKKyAgICBDSEVDSygwIDw9IG9mZnNldCAmJgorICAgICAgICAgIG9mZnNldCArIHNpemVvZihTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTikgPCBpbmZvX3NpemUpOworICAgIEhBTkRMRSBwaWQgPSBzcGktPlByb2Nlc3NJZDsKKyAgICBVTE9ORyBudW0gPSBzcGktPk51bWJlck9mVGhyZWFkczsKKyAgICBDSEVDSyhudW0gPj0gMSk7CisgICAgc2l6ZV90IHNwaV9zaXplID0KKyAgICAgICAgc2l6ZW9mKFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OKSArIHNpemVvZihTWVNURU1fVEhSRUFEKSAqIChudW0gLSAxKTsKKyAgICBDSEVDSyhvZmZzZXQgKyBzcGlfc2l6ZSA8CisgICAgICAgICAgaW5mb19zaXplKTsgLy8gTWFrZSBzdXJlIHByb2Nlc3MgaW5mbyByZWNvcmQgZml0cyB0aGUgYnVmZmVyLgorICAgIGlmIChzcGktPk5leHRFbnRyeU9mZnNldCAhPSAwKSB7CisgICAgICBDSEVDSyhzcGlfc2l6ZSA8PQorICAgICAgICAgICAgc3BpLT5OZXh0RW50cnlPZmZzZXQpOyAvLyBBbmQgZG8gbm90IG92ZXJsYXAgd2l0aCB0aGUgbmV4dCByZWNvcmQuCisgICAgfTsgLy8gaWYKKyAgICAvLyBwaWQgPT0gMCBjb3JyZXNwb25kcyB0byB0aGUgU3lzdGVtIElkbGUgUHJvY2Vzcy4gSXQgYWx3YXlzIGhhcyBydW5uaW5nCisgICAgLy8gdGhyZWFkcyBvbiBhbGwgY29yZXMuIFNvLCB3ZSBkb24ndCBjb25zaWRlciB0aGUgcnVubmluZyB0aHJlYWRzIG9mIHRoaXMKKyAgICAvLyBwcm9jZXNzLgorICAgIGlmIChwaWQgIT0gMCkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07ICsraSkgeworICAgICAgICBUSFJFQURfU1RBVEUgc3RhdGUgPSBzcGktPlRocmVhZHNbaV0uU3RhdGU7CisgICAgICAgIC8vIENvdW50IHRocmVhZHMgdGhhdCBoYXZlIFJlYWR5IG9yIFJ1bm5pbmcgc3RhdGUuCisgICAgICAgIC8vICEhISBUT0RPOiBXaHkgY29tbWVudCBkb2VzIG5vdCBtYXRjaCB0aGUgY29kZT8/PworICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGVSdW5uaW5nKSB7CisgICAgICAgICAgKytydW5uaW5nX3RocmVhZHM7CisgICAgICAgICAgLy8gU3RvcCBjb3VudGluZyBydW5uaW5nIHRocmVhZHMgaWYgdGhlIG51bWJlciBpcyBhbHJlYWR5IGdyZWF0ZXIgdGhhbgorICAgICAgICAgIC8vIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGNvcmVzCisgICAgICAgICAgaWYgKHJ1bm5pbmdfdGhyZWFkcyA+PSBtYXgpIHsKKyAgICAgICAgICAgIGdvdG8gZmluaXNoOworICAgICAgICAgIH0KKyAgICAgICAgfSAvLyBpZgorICAgICAgfTsgLy8gZm9yIGkKKyAgICB9IC8vIGlmCisgICAgaWYgKHNwaS0+TmV4dEVudHJ5T2Zmc2V0ID09IDApIHsKKyAgICAgIGJyZWFrOworICAgIH07IC8vIGlmCisgICAgc3BpID0gUFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OKHVpbnRwdHJfdChzcGkpICsgc3BpLT5OZXh0RW50cnlPZmZzZXQpOworICB9OyAvLyBmb3JldmVyCisKKyN1bmRlZiBDSEVDSworCitmaW5pc2g6IC8vIENsZWFuIHVwIGFuZCBleGl0LgorCisgIGlmIChidWZmZXIgIT0gTlVMTCkgeworICAgIEtNUF9JTlRFUk5BTF9GUkVFKGJ1ZmZlcik7CisgIH07IC8vIGlmCisKKyAgZ2xiX3J1bm5pbmdfdGhyZWFkcyA9IHJ1bm5pbmdfdGhyZWFkczsKKworICByZXR1cm4gcnVubmluZ190aHJlYWRzOworfSAvL19fa21wX2dldF9sb2FkX2JhbGFuY2UoKQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L0NNYWtlTGlzdHMudHh0IGIvZmluYWwvcnVudGltZS90ZXN0L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YzAyYzgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxMDkgQEAKKyMgQ01ha2VMaXN0cy50eHQgZmlsZSBmb3IgdW5pdCB0ZXN0aW5nIE9wZW5NUCBMaWJyYXJ5CitpbmNsdWRlKEZpbmRQeXRob25JbnRlcnApCitpbmNsdWRlKENoZWNrVHlwZVNpemUpCitpbmNsdWRlKENoZWNrRnVuY3Rpb25FeGlzdHMpCitpbmNsdWRlKENoZWNrTGlicmFyeUV4aXN0cykKKworaWYoTk9UIFBZVEhPTklOVEVSUF9GT1VORCkKKyAgbGlib21wX3dhcm5pbmdfc2F5KCJDb3VsZCBub3QgZmluZCBQeXRob24uIikKKyAgbGlib21wX3dhcm5pbmdfc2F5KCJUaGUgY2hlY2stbGlib21wIHRhcmdldCB3aWxsIG5vdCBiZSBhdmFpbGFibGUhIikKKyAgcmV0dXJuKCkKK2VuZGlmKCkKKworIyBTb21lIHRlc3RzIHVzZSBtYXRoIGZ1bmN0aW9ucworY2hlY2tfbGlicmFyeV9leGlzdHMobSBzcXJ0ICIiIExJQk9NUF9IQVZFX0xJQk0pCisjIFdoZW4gdXNpbmcgbGliZ2NjLCAtbGF0b21pYyBtYXkgYmUgbmVlZGVkIGZvciBhdG9taWNzCisjIChidXQgd2hlbiB1c2luZyBjb21waWxlci1ydCwgdGhlIGF0b21pY3Mgd2lsbCBiZSBidWlsdC1pbikKKyMgTm90ZTogd2UgY2FuIG5vdCBjaGVjayBmb3IgX19hdG9taWNfbG9hZCBiZWNhdXNlIGNsYW5nIHRyZWF0cyBpdAorIyBhcyBzcGVjaWFsIGJ1aWx0LWluIGFuZCB0aGF0IGJyZWFrcyBDTWFrZSBjaGVja3MKK2NoZWNrX2Z1bmN0aW9uX2V4aXN0cyhfX2F0b21pY19sb2FkXzEgTElCT01QX0hBVkVfQlVJTFRJTl9BVE9NSUMpCitpZihOT1QgTElCT01QX0hBVkVfQlVJTFRJTl9BVE9NSUMpCisgIGNoZWNrX2xpYnJhcnlfZXhpc3RzKGF0b21pYyBfX2F0b21pY19sb2FkXzEgIiIgTElCT01QX0hBVkVfTElCQVRPTUlDKQorZWxzZSgpCisgICMgbm90IG5lZWRlZAorICBzZXQoTElCT01QX0hBVkVfTElCQVRPTUlDIDApCitlbmRpZigpCisKK21hY3JvKHB5dGhvbml6ZV9ib29sIHZhcikKKyAgaWYgKCR7dmFyfSkKKyAgICBzZXQoJHt2YXJ9IFRydWUpCisgIGVsc2UoKQorICAgIHNldCgke3Zhcn0gRmFsc2UpCisgIGVuZGlmKCkKK2VuZG1hY3JvKCkKKworcHl0aG9uaXplX2Jvb2woTElCT01QX1VTRV9IV0xPQykKK3B5dGhvbml6ZV9ib29sKExJQk9NUF9PTVBUX1NVUFBPUlQpCitweXRob25pemVfYm9vbChMSUJPTVBfT01QVF9CTEFNRSkKK3B5dGhvbml6ZV9ib29sKExJQk9NUF9PTVBUX1RSQUNFKQorcHl0aG9uaXplX2Jvb2woTElCT01QX0hBVkVfTElCTSkKK3B5dGhvbml6ZV9ib29sKExJQk9NUF9IQVZFX0xJQkFUT01JQykKKworc2V0KExJQk9NUF9URVNUX0NGTEFHUyAiIiBDQUNIRSBTVFJJTkcKKyAgIkV4dHJhIGNvbXBpbGVyIGZsYWdzIHRvIHNlbmQgdG8gdGhlIHRlc3QgY29tcGlsZXIiKQorCitpZigke0xJQk9NUF9TVEFOREFMT05FX0JVSUxEfSkKKyAgIyBNYWtlIHN1cmUgd2UgY2FuIHVzZSB0aGUgY29uc29sZSBwb29sIGZvciByZWNlbnQgY21ha2UgYW5kIG5pbmphID4gMS41CisgIGlmKENNQUtFX1ZFUlNJT04gVkVSU0lPTl9MRVNTIDMuMS4yMDE0MTExNykKKyAgICBzZXQoY21ha2VfM18yX1VTRVNfVEVSTUlOQUwpCisgIGVsc2UoKQorICAgIHNldChjbWFrZV8zXzJfVVNFU19URVJNSU5BTCBVU0VTX1RFUk1JTkFMKQorICBlbmRpZigpCisgIHNldChMSUJPTVBfVEVTVF9DT01QSUxFUiAke0NNQUtFX0NfQ09NUElMRVJ9IENBQ0hFIFNUUklORworICAgICJDb21waWxlciB0byB1c2UgZm9yIHRlc3RpbmcgT3Blbk1QIGxpYnJhcnkiKQorICBzZXQoTElCT01QX1RFU1RfT1BFTk1QX0ZMQUcgLWZvcGVubXAgQ0FDSEUgU1RSSU5HCisgICAgIk9wZW5NUCBjb21waWxlciBmbGFnIHRvIHVzZSBmb3IgdGVzdGluZyBPcGVuTVAgbGlicmFyeSIpCisgIGZpbmRfcHJvZ3JhbShMSUJPTVBfTExWTV9MSVRfRVhFQ1VUQUJMRQorICAgIE5BTUVTIGxsdm0tbGl0IGxpdC5weSBsaXQKKyAgICBQQVRIUyAke09QRU5NUF9MTFZNX1RPT0xTX0RJUn0pCisgIGlmKE5PVCBMSUJPTVBfTExWTV9MSVRfRVhFQ1VUQUJMRSkKKyAgICBsaWJvbXBfc2F5KCJDYW5ub3QgZmluZCBsbHZtLWxpdC4iKQorICAgIGxpYm9tcF9zYXkoIlBsZWFzZSBwdXQgbGx2bS1saXQgaW4geW91ciBQQVRILCBzZXQgTElCT01QX0xMVk1fTElUX0VYRUNVVEFCTEUgdG8gaXRzIGZ1bGwgcGF0aCBvciBwb2ludCBPUEVOTVBfTExWTV9UT09MU19ESVIgdG8gaXRzIGRpcmVjdG9yeSIpCisgICAgbGlib21wX3dhcm5pbmdfc2F5KCJUaGUgY2hlY2stbGlib21wIHRhcmdldCB3aWxsIG5vdCBiZSBhdmFpbGFibGUhIikKKyAgICByZXR1cm4oKQorICBlbmRpZigpCisgIGZpbmRfcHJvZ3JhbShGSUxFQ0hFQ0tfRVhFQ1VUQUJMRQorICAgIE5BTUVTIEZpbGVDaGVjaworICAgIFBBVEhTICR7T1BFTk1QX0xMVk1fVE9PTFNfRElSfSkKKyAgaWYgKE5PVCBGSUxFQ0hFQ0tfRVhFQ1VUQUJMRSkKKyAgICAjIHNldCB0byBlbXB0eSBzdHJpbmcgc28gdGhhdCBsaXQgY2FuIGRpc2FibGUgZGVwZW5kZW50IHRlc3RzCisgICAgc2V0KEZJTEVDSEVDS19FWEVDVVRBQkxFICIiKQorICBlbmRpZigpCisgICMgU2V0IGxpdCBhcmd1bWVudHMKKyAgIyBUaGUgLWogMSBsZXRzIHRoZSBhY3R1YWwgdGVzdHMgcnVuIHdpdGggdGhlIGVudGlyZSBtYWNoaW5lLgorICAjIFdlIGhhdmUgb25lIHRlc3QgdGhyZWFkIHRoYXQgc3Bhd25zIHRoZSB0ZXN0cyBzZXJpYWxseS4gIFRoaXMgYWxsb3dzCisgICMgRWFjaCB0ZXN0IHRvIHVzZSB0aGUgZW50aXJlIG1hY2hpbmUuCisgIHNldChMSUJPTVBfTElUX0FSR1NfREVGQVVMVCAiLXN2IC0tc2hvdy11bnN1cHBvcnRlZCAtLXNob3cteGZhaWwiKQorICBpZihNU1ZDIE9SIFhDT0RFKQorICAgIHNldChMSUJPTVBfTElUX0FSR1NfREVGQVVMVCAiJHtMSUJPTVBfTElUX0FSR1NfREVGQVVMVH0gLS1uby1wcm9ncmVzcy1iYXIiKQorICBlbmRpZigpCisgIHNldChMSUJPTVBfTElUX0FSR1MgIiR7TElCT01QX0xJVF9BUkdTX0RFRkFVTFR9IiBDQUNIRSBTVFJJTkcKKyAgICAiRGVmYXVsdCBvcHRpb25zIGZvciBsaXQiKQorICBzZXBhcmF0ZV9hcmd1bWVudHMoTElCT01QX0xJVF9BUkdTKQorICBhZGRfY3VzdG9tX3RhcmdldChjaGVjay1saWJvbXAKKyAgICBDT01NQU5EICR7UFlUSE9OX0VYRUNVVEFCTEV9ICR7TElCT01QX0xMVk1fTElUX0VYRUNVVEFCTEV9ICR7TElCT01QX0xJVF9BUkdTfSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKyAgICBERVBFTkRTIG9tcAorICAgIENPTU1FTlQgIlJ1bm5pbmcgbGlib21wIHRlc3RzIgorICAgICR7Y21ha2VfM18yX1VTRVNfVEVSTUlOQUx9CisgICkKK2Vsc2UoKQorICAjIExMVk0gc291cmNlIHRyZWUgYnVpbGQsIHRlc3QganVzdC1idWlsdCBjbGFuZworICBpZihOT1QgTVNWQykKKyAgICBzZXQoTElCT01QX1RFU1RfQ09NUElMRVIgJHtMTFZNX1JVTlRJTUVfT1VUUFVUX0lOVERJUn0vY2xhbmcpCisgIGVsc2UoKQorICAgIHNldChMSUJPTVBfVEVTVF9DT01QSUxFUiAke0xMVk1fUlVOVElNRV9PVVRQVVRfSU5URElSfS9jbGFuZy5leGUpCisgIGVuZGlmKCkKKyAgc2V0KExJQk9NUF9URVNUX09QRU5NUF9GTEFHIC1mb3Blbm1wPWxpYm9tcCkKKyAgc2V0KEZJTEVDSEVDS19FWEVDVVRBQkxFICR7TExWTV9SVU5USU1FX09VVFBVVF9JTlRESVJ9L0ZpbGVDaGVjaykKKyAgIyBVc2UgYWRkX2xpdF90ZXN0c3VpdGUoKSBmcm9tIExMVk0gQ01ha2UuCisgIGFkZF9saXRfdGVzdHN1aXRlKGNoZWNrLWxpYm9tcAorICAgICJSdW5uaW5nIGxpYm9tcCB0ZXN0cyIKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKyAgICBERVBFTkRTIGNsYW5nIGNsYW5nLWhlYWRlcnMgRmlsZUNoZWNrIG9tcAorICApCitlbmRpZigpCisKKyMgQ29uZmlndXJlIHRoZSBsaXQuc2l0ZS5jZmcuaW4gZmlsZQorc2V0KEFVVE9fR0VOX0NPTU1FTlQgIiMjIEF1dG9nZW5lcmF0ZWQgYnkgbGlib21wIGNvbmZpZ3VyYXRpb24uXG4jIERvIG5vdCBlZGl0ISIpCitjb25maWd1cmVfZmlsZShsaXQuc2l0ZS5jZmcuaW4gbGl0LnNpdGUuY2ZnIEBPTkxZKQorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvYXBpL2hhc19vcGVubXAuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9hcGkvaGFzX29wZW5tcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhOTVmNTkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvYXBpL2hhc19vcGVubXAuYwpAQCAtMCwwICsxLDIzIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X2hhc19vcGVubXAoKQoreworICBpbnQgcnZhbHVlID0gMDsKKyNpZmRlZiBfT1BFTk1QCisgIHJ2YWx1ZSA9IDE7CisjZW5kaWYKKyAgcmV0dXJuIChydmFsdWUpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworICBpZighdGVzdF9oYXNfb3Blbm1wKCkpIHsKKyAgICBudW1fZmFpbGVkKys7CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvYXBpL2ttcF9hbGlnbmVkX21hbGxvYy5jIGIvZmluYWwvcnVudGltZS90ZXN0L2FwaS9rbXBfYWxpZ25lZF9tYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzAyZmVjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L2FwaS9rbXBfYWxpZ25lZF9tYWxsb2MuYwpAQCAtMCwwICsxLDYyIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxvbXAuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCBhbGlnbm1lbnRzW10gPSB7NjQsIDEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDgsIDQwOTZ9OworCit1bnNpZ25lZCBhbGlnbmVkX2J5KHVpbnQ2NF90IGFkZHIpIHsKKyAgICB1aW50NjRfdCBhbGlnbm1lbnQgPSAxOworICAgIHdoaWxlKChhZGRyICYgKGFsaWdubWVudC0xKSkgPT0gMCkgeworICAgICAgICBhbGlnbm1lbnQgPDw9IDE7CisgICAgfQorICAgIHJldHVybiAoYWxpZ25tZW50ID4+IDEpOworfQorCitpbnQgdGVzdF9rbXBfYWxpZ25lZF9tYWxsb2MoKQoreworICBpbnQgZXJyID0gMDsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKGVycikKKyAgeworICAgIGludCBpOworICAgIGludCogcHRyOworICAgIHVpbnQ2NF90IGFkZHI7CisgICAgaW50IHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworCisgICAgZm9yKGkgPSAwOyBpIDwgc2l6ZW9mKGFsaWdubWVudHMpL3NpemVvZihpbnQpOyBpKyspIHsKKyAgICAgIGludCBhbGlnbm1lbnQgPSBhbGlnbm1lbnRzW2ldOworICAgICAgLy8gYWxsb2NhdGUgNjQgYnl0ZXMgd2l0aCA2NC1ieXRlIGFsaWdubWVudAorICAgICAgLy8gYWxsb2NhdGUgMTI4IGJ5dGVzIHdpdGggMTI4LWJ5dGUgYWxpZ25tZW50LCBldGMuCisgICAgICBwdHIgPSAoaW50KilrbXBfYWxpZ25lZF9tYWxsb2MoYWxpZ25tZW50LCBhbGlnbm1lbnQpOworICAgICAgYWRkciA9ICh1aW50NjRfdClwdHI7CisgICAgICBpZihhZGRyICYgKGFsaWdubWVudC0xKSkgeworICAgICAgICBwcmludGYoInRocmVhZCAlZDogYWRkciA9ICVwIChhbGlnbmVkIHRvICV1IGJ5dGVzKSBidXQgZXhwZWN0ZWQgIgorICAgICAgICAgICAgICAgIiBhbGlnbm1lbnQgPSAlZFxuIiwgdGlkLCBwdHIsIGFsaWduZWRfYnkoYWRkciksIGFsaWdubWVudCk7CisgICAgICAgIGVyciA9IDE7CisgICAgICB9CisgICAgICBrbXBfZnJlZShwdHIpOworICAgIH0KKworICAgIHB0ciA9IGttcF9hbGlnbmVkX21hbGxvYygxMjgsIDEyNyk7CisgICAgaWYgKHB0ciAhPSBOVUxMKSB7CisgICAgICBwcmludGYoInRocmVhZCAlZDoga21wX2FsaWduZWRfbWFsbG9jKCkgZGlkbid0IHJldHVybiBOVUxMIHdoZW4gIgorICAgICAgICAgICAgICJhbGlnbm1lbnQgd2FzIG5vdCBwb3dlciBvZiAyXG4iLCB0aWQpOworICAgICAgZXJyID0gMTsKKyAgICB9CisgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisgIHJldHVybiAhZXJyOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9rbXBfYWxpZ25lZF9tYWxsb2MoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9hcGkva21wX3NldF9kZWZhdWx0c19sb2NrX2J1Zy5jIGIvZmluYWwvcnVudGltZS90ZXN0L2FwaS9rbXBfc2V0X2RlZmF1bHRzX2xvY2tfYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNhN2FmYgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9hcGkva21wX3NldF9kZWZhdWx0c19sb2NrX2J1Zy5jCkBAIC0wLDAgKzEsNTMgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKy8qIFRoZSBidWcgb2NjdXJzIGlmIHRoZSBsb2NrIHRhYmxlIGlzIHJlYWxsb2NhdGVkIGFmdGVyCisgICBrbXBfc2V0X2RlZmF1bHRzKCkgaXMgY2FsbGVkLiAgSWYgdGhlIHRhYmxlIGlzIHJlYWxsb2NhdGVkLAorICAgdGhlbiB0aGUgbG9jayB3aWxsIG5vdCBwb2ludCB0byBhIHZhbGlkIGxvY2sgb2JqZWN0IGFmdGVyIHRoZQorICAga21wX3NldF9kZWZhdWx0cygpIGNhbGwuKi8KK29tcF9sb2NrX3QgbG9jazsKKworaW50IHRlc3Rfa21wX3NldF9kZWZhdWx0c19sb2NrX2J1ZygpCit7CisgIC8qIGNoZWNrcyB0aGF0IG9tcF9nZXRfbnVtX3RocmVhZHMgaXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZgorICAgICB0aHJlYWRzICovCisgIGludCBudGhyZWFkc19saWI7CisgIGludCBudGhyZWFkcyA9IDA7CisKKyAgbnRocmVhZHNfbGliID0gLTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIG9tcF9zZXRfbG9jaygmbG9jayk7CisgICAgbnRocmVhZHMrKzsKKyAgICBvbXBfdW5zZXRfbG9jaygmbG9jayk7CisgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgbnRocmVhZHNfbGliID0gb21wX2dldF9udW1fdGhyZWFkcyAoKTsKKyAgICB9ICAvKiBlbmQgb2Ygc2luZ2xlICovCisgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisgIGttcF9zZXRfZGVmYXVsdHMoIk9NUF9OVU1fVEhSRUFEUyIpOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgb21wX3NldF9sb2NrKCZsb2NrKTsKKyAgICBudGhyZWFkcysrOworICAgIG9tcF91bnNldF9sb2NrKCZsb2NrKTsKKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICByZXR1cm4gKG50aHJlYWRzID09IDIqbnRocmVhZHNfbGliKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKyAgb21wX2luaXRfbG9jaygmbG9jayk7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X2ttcF9zZXRfZGVmYXVsdHNfbG9ja19idWcoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICBvbXBfZGVzdHJveV9sb2NrKCZsb2NrKTsKKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvYXBpL29tcF9nZXRfbnVtX3RocmVhZHMuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9hcGkvb21wX2dldF9udW1fdGhyZWFkcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZjI4NmQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvYXBpL29tcF9nZXRfbnVtX3RocmVhZHMuYwpAQCAtMCwwICsxLDM5IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9nZXRfbnVtX3RocmVhZHMoKQoreworICAvKiBjaGVja3MgdGhhdCBvbXBfZ2V0X251bV90aHJlYWRzIGlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YKKyAgICAgdGhyZWFkcyAqLworICBpbnQgbnRocmVhZHNfbGliOworICBpbnQgbnRocmVhZHMgPSAwOworCisgIG50aHJlYWRzX2xpYiA9IC0xOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgIHsKKyAgICAgIG50aHJlYWRzKys7CisgICAgfSAvKiBlbmQgb2YgY3JpdGljYWwgKi8KKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICBudGhyZWFkc19saWIgPSBvbXBfZ2V0X251bV90aHJlYWRzICgpOworICAgIH0gIC8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAgcmV0dXJuIChudGhyZWFkcyA9PSBudGhyZWFkc19saWIpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfZ2V0X251bV90aHJlYWRzKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvYXBpL29tcF9nZXRfd3RpY2suYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9hcGkvb21wX2dldF93dGljay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMzUyMjYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvYXBpL29tcF9nZXRfd3RpY2suYwpAQCAtMCwwICsxLDI0IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9nZXRfd3RpY2soKQoreworICBkb3VibGUgdGljazsKKyAgdGljayA9IC0xLjsKKyAgdGljayA9IG9tcF9nZXRfd3RpY2sgKCk7CisgIHJldHVybiAoKHRpY2sgPiAwLjApICYmICh0aWNrIDwgMC4wMSkpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfZ2V0X3d0aWNrKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvYXBpL29tcF9nZXRfd3RpbWUuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9hcGkvb21wX2dldF93dGltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMDk0NDAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvYXBpL29tcF9nZXRfd3RpbWUuYwpAQCAtMCwwICsxLDMzIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCB0ZXN0X29tcF9nZXRfd3RpbWUoKQoreworICBkb3VibGUgc3RhcnQ7CisgIGRvdWJsZSBlbmQ7CisgIGRvdWJsZSBtZWFzdXJlZF90aW1lOworICBkb3VibGUgd2FpdF90aW1lID0gNS4wOworICBzdGFydCA9IDA7CisgIGVuZCA9IDA7CisgIHN0YXJ0ID0gb21wX2dldF93dGltZSgpOworICBteV9zbGVlcCAod2FpdF90aW1lKTsKKyAgZW5kID0gb21wX2dldF93dGltZSgpOworICBtZWFzdXJlZF90aW1lID0gZW5kLXN0YXJ0OworICByZXR1cm4gKChtZWFzdXJlZF90aW1lID4gMC45NyAqIHdhaXRfdGltZSkgJiYgKG1lYXN1cmVkX3RpbWUgPCAxLjAzICogd2FpdF90aW1lKSkgOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfZ2V0X3d0aW1lKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvYXBpL29tcF9pbl9wYXJhbGxlbC5jIGIvZmluYWwvcnVudGltZS90ZXN0L2FwaS9vbXBfaW5fcGFyYWxsZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDkzMTNlCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L2FwaS9vbXBfaW5fcGFyYWxsZWwuYwpAQCAtMCwwICsxLDM5IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8qCisgKiBDaGVja3MgdGhhdCBmYWxzZSBpcyByZXR1cm5lZCB3aGVuIGNhbGxlZCBmcm9tIHNlcmlhbCByZWdpb24KKyAqIGFuZCB0cnVlIGlzIHJldHVybmVkIHdoZW4gY2FsbGVkIHdpdGhpbiBwYXJhbGxlbCByZWdpb24uCisgKi8KK2ludCB0ZXN0X29tcF9pbl9wYXJhbGxlbCgpCit7CisgIGludCBzZXJpYWw7CisgIGludCBpc3BhcmFsbGVsOworCisgIHNlcmlhbCA9IDE7CisgIGlzcGFyYWxsZWwgPSAwOworICBzZXJpYWwgPSBvbXBfaW5fcGFyYWxsZWwoKTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgaXNwYXJhbGxlbCA9IG9tcF9pbl9wYXJhbGxlbCgpOworICAgIH0KKyAgfQorICByZXR1cm4gKCEoc2VyaWFsKSAmJiBpc3BhcmFsbGVsKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2luX3BhcmFsbGVsKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvYXRvbWljL29tcF9hdG9taWMuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9hdG9taWMvb21wX2F0b21pYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZGQzMGQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvYXRvbWljL29tcF9hdG9taWMuYwpAQCAtMCwwICsxLDM2NiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworI2RlZmluZSBET1VCTEVfRElHSVRTIDIwICAvKiBkdF5ET1VCTEVfRElHSVRTICovCisjZGVmaW5lIE1BWF9GQUNUT1IgMTAKKyNkZWZpbmUgS05PV05fUFJPRFVDVCAzNjI4ODAwICAvKiAxMCEgKi8KKworaW50IHRlc3Rfb21wX2F0b21pYygpCit7CisgIGludCBzdW07CisgIGludCBkaWZmOworICBkb3VibGUgZHN1bSA9IDA7CisgIGRvdWJsZSBkdCA9IDAuNTsgIC8qIGJhc2Ugb2YgZ2VvbWV0cmljIHJvdyBmb3IgKyBhbmQgLSB0ZXN0Ki8KKyAgZG91YmxlIGRkaWZmOworICBpbnQgcHJvZHVjdDsKKyAgaW50IHg7CisgIGludCAqbG9naWNzOworICBpbnQgYml0X2FuZCA9IDE7CisgIGludCBiaXRfb3IgPSAwOworICBpbnQgZXhjbHVzaXZfYml0X29yID0gMDsKKyAgaW50IGo7CisgIGludCBrbm93bl9zdW07CisgIGludCBrbm93bl9kaWZmOworICBpbnQga25vd25fcHJvZHVjdDsKKyAgaW50IHJlc3VsdCA9IDA7CisgIGludCBsb2dpY19hbmQgPSAxOworICBpbnQgbG9naWNfb3IgPSAwOworICBkb3VibGUgZGtub3duX3N1bTsKKyAgZG91YmxlIHJvdW5kaW5nX2Vycm9yID0gMS5FLTk7CisgIGRvdWJsZSBkcHQsIGRpdjsKKyAgaW50IGxvZ2ljc0FycmF5W0xPT1BDT1VOVF07CisgIGxvZ2ljcyA9IGxvZ2ljc0FycmF5OworCisgIHN1bSA9IDA7CisgIGRpZmYgPSAwOworICBwcm9kdWN0ID0gMTsKKworICAvLyBzdW0gb2YgaW50ZWdlcnMgdGVzdAorICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICBzdW0gKz0gaTsKKyAgICB9CisKKyAgfQorICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgIGlmIChrbm93bl9zdW0gIT0gc3VtKQorICB7CisgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZC5cbiIsCisgICAgICBzdW0sIGtub3duX3N1bSk7CisgICAgcmVzdWx0Kys7CisgIH0KKworICAvLyBkaWZmZXJlbmNlIG9mIGludGVnZXJzIHRlc3QKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICBkaWZmIC09IGk7CisgICAgfQorICB9CisgIGtub3duX2RpZmYgPSAoKExPT1BDT1VOVCAtIDEpICogTE9PUENPVU5UKSAvIDIgKiAtMTsKKyAgaWYgKGRpZmYgIT0ga25vd25fZGlmZikKKyAgeworICAgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICJFcnJvciBpbiBkaWZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAwLlxuIiwKKyAgICAgIGRpZmYpOworICAgIHJlc3VsdCsrOworICB9CisKKyAgLy8gc3VtIG9mIGRvdWJsZXMgdGVzdAorICBkc3VtID0gMDsKKyAgZHB0ID0gMTsKKyAgZm9yIChqID0gMDsgaiA8IERPVUJMRV9ESUdJVFM7ICsraikgeworICAgIGRwdCAqPSBkdDsKKyAgfQorICBka25vd25fc3VtID0gKDEgLSBkcHQpIC8gKDEgLWR0KTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDA7IGkgPCBET1VCTEVfRElHSVRTOyArK2kpIHsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgZHN1bSArPSBwb3cgKGR0LCBpKTsKKyAgICB9CisgIH0KKyAgaWYgKGRzdW0gIT0gZGtub3duX3N1bSAmJiAoZmFicyAoZHN1bSAtIGRrbm93bl9zdW0pID4gcm91bmRpbmdfZXJyb3IpKSB7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlZiIKKyAgICAgICIgaW5zdGVhZCBvZjogJWYgKERpZmZlcmVuY2U6ICVFKVxuIiwKKyAgICAgIGRzdW0sIGRrbm93bl9zdW0sIGRzdW0gLSBka25vd25fc3VtKTsKKyAgICByZXN1bHQrKzsKKyAgfQorCisgIC8vIGRpZmZlcmVuY2Ugb2YgZG91YmxlcyB0ZXN0CisgIGRwdCA9IDE7CisgIGZvciAoaiA9IDA7IGogPCBET1VCTEVfRElHSVRTOyArK2opIHsKKyAgICBkcHQgKj0gZHQ7CisgIH0KKyAgZGRpZmYgPSAoMSAtIGRwdCkgLyAoMSAtIGR0KTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDA7IGkgPCBET1VCTEVfRElHSVRTOyArK2kpIHsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgZGRpZmYgLT0gcG93IChkdCwgaSk7CisgICAgfQorICB9CisgIGlmIChmYWJzIChkZGlmZikgPiByb3VuZGluZ19lcnJvcikgeworICAgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICJFcnJvciBpbiBkaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSBpbnN0ZWFkIG9mIDAuMFxuIiwKKyAgICAgIGRkaWZmKTsKKyAgICByZXN1bHQrKzsKKyAgfQorCisgIC8vIHByb2R1Y3Qgb2YgaW50ZWdlcnMgdGVzdAorICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMTsgaSA8PSBNQVhfRkFDVE9SOyBpKyspIHsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgcHJvZHVjdCAqPSBpOworICAgIH0KKyAgfQorICBrbm93bl9wcm9kdWN0ID0gS05PV05fUFJPRFVDVDsKKyAgaWYgKGtub3duX3Byb2R1Y3QgIT0gcHJvZHVjdCkgeworICAgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICJFcnJvciBpbiBwcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuIiwKKyAgICAgIHByb2R1Y3QsIGtub3duX3Byb2R1Y3QpOworICAgIHJlc3VsdCsrOworICB9CisKKyAgLy8gZGl2aXNpb24gb2YgaW50ZWdlcnMgdGVzdAorICBwcm9kdWN0ID0gS05PV05fUFJPRFVDVDsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAxOyBpIDw9IE1BWF9GQUNUT1I7ICsraSkgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICBwcm9kdWN0IC89IGk7CisgICAgfQorICB9CisgIGlmIChwcm9kdWN0ICE9IDEpIHsKKyAgICBmcHJpbnRmIChzdGRlcnIsCisgICAgICAiRXJyb3IgaW4gcHJvZHVjdCBkaXZpc2lvbiB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIgorICAgICAgIiBpbnN0ZWFkIG9mIDFcbiIsCisgICAgICBwcm9kdWN0KTsKKyAgICByZXN1bHQrKzsKKyAgfQorCisgIC8vIGRpdmlzaW9uIG9mIGRvdWJsZXMgdGVzdAorICBkaXYgPSA1LjBFKzU7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAxOyBpIDw9IE1BWF9GQUNUT1I7IGkrKykgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICBkaXYgLz0gaTsKKyAgICB9CisgIH0KKyAgaWYgKGZhYnMoZGl2LTAuMTM3Nzg3KSA+PSAxLjBFLTQgKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gZGl2aXNpb24gd2l0aCBkb3VibGU6IFJlc3VsdCB3YXMgJWYiCisgICAgICAiIGluc3RlYWQgb2YgMC4xMzc3ODdcbiIsIGRpdik7CisgIH0KKworICAvLyArKyB0ZXN0CisgIHggPSAwOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKSB7CisgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgIHgrKzsKKyAgICB9CisgIH0KKyAgaWYgKHggIT0gTE9PUENPVU5UKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gKytcbiIpOworICB9CisKKyAgLy8gLS0gdGVzdAorICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKSB7CisgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgIHgtLTsKKyAgICB9CisgIH0KKyAgaWYgKHggIT0gMCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluIC0tXG4iKTsKKyAgfQorCisgIC8vIGJpdC1hbmQgdGVzdCBwYXJ0IDEKKyAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKSB7CisgICAgbG9naWNzW2pdID0gMTsKKyAgfQorICBiaXRfYW5kID0gMTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpIHsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgYml0X2FuZCAmPSBsb2dpY3NbaV07CisgICAgfQorICB9CisgIGlmICghYml0X2FuZCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluIEJJVCBBTkQgcGFydCAxXG4iKTsKKyAgfQorCisgIC8vIGJpdC1hbmQgdGVzdCBwYXJ0IDIKKyAgYml0X2FuZCA9IDE7CisgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDA7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpIHsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgYml0X2FuZCAmPSBsb2dpY3NbaV07CisgICAgfQorICB9CisgIGlmIChiaXRfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDJcbiIpOworICB9CisKKyAgLy8gYml0LW9yIHRlc3QgcGFydCAxCisgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7IGorKykgeworICAgIGxvZ2ljc1tqXSA9IDA7CisgIH0KKyAgYml0X29yID0gMDsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICBiaXRfb3IgfD0gbG9naWNzW2ldOworICAgIH0KKyAgfQorICBpZiAoYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gQklUIE9SIHBhcnQgMVxuIik7CisgIH0KKworICAvLyBiaXQtb3IgdGVzdCBwYXJ0IDIKKyAgYml0X29yID0gMDsKKyAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworCisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKSB7CisgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgIGJpdF9vciB8PSBsb2dpY3NbaV07CisgICAgfQorICB9CisgIGlmICghYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gQklUIE9SIHBhcnQgMlxuIik7CisgIH0KKworICAvLyBiaXQteG9yIHRlc3QgcGFydCAxCisgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7IGorKykgeworICAgIGxvZ2ljc1tqXSA9IDA7CisgIH0KKyAgZXhjbHVzaXZfYml0X29yID0gMDsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICBleGNsdXNpdl9iaXRfb3IgXj0gbG9naWNzW2ldOworICAgIH0KKyAgfQorICBpZiAoZXhjbHVzaXZfYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMVxuIik7CisgIH0KKworICAvLyBiaXQteG9yIHRlc3QgcGFydCAyCisgIGV4Y2x1c2l2X2JpdF9vciA9IDA7CisgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDE7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpIHsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgZXhjbHVzaXZfYml0X29yIF49IGxvZ2ljc1tpXTsKKyAgICB9CisKKyAgfQorICBpZiAoIWV4Y2x1c2l2X2JpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDJcbiIpOworICB9CisKKyAgLy8gbGVmdCBzaGlmdCB0ZXN0CisgIHggPSAxOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMDsgaSA8IDEwOyArK2kpIHsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgeCA8PD0gMTsKKyAgICB9CisKKyAgfQorICBpZiAoIHggIT0gMTAyNCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluIDw8XG4iKTsKKyAgICB4ID0gMTAyNDsKKyAgfQorCisgIC8vIHJpZ2h0IHNoaWZ0IHRlc3QKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgIHggPj49IDE7CisgICAgfQorICB9CisgIGlmICh4ICE9IDEpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiA+PlxuIik7CisgIH0KKworICByZXR1cm4gKHJlc3VsdCA9PSAwKTsKK30gLy8gdGVzdF9vbXBfYXRvbWljKCkKKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2F0b21pYygpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L2JhcnJpZXIvb21wX2JhcnJpZXIuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9iYXJyaWVyL29tcF9iYXJyaWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNmYjA2MAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9iYXJyaWVyL29tcF9iYXJyaWVyLmMKQEAgLTAsMCArMSw0NCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgdGVzdF9vbXBfYmFycmllcigpCit7CisgIGludCByZXN1bHQxOworICBpbnQgcmVzdWx0MjsKKyAgcmVzdWx0MSA9IDA7CisgIHJlc3VsdDIgPSAwOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgcmFuazsKKyAgICByYW5rID0gb21wX2dldF90aHJlYWRfbnVtICgpOworICAgIGlmIChyYW5rID09MSkgeworICAgICAgbXlfc2xlZXAoKChkb3VibGUpU0xFRVBUSU1FKS9SRVBFVElUSU9OUyk7IC8vIGdpdmUgMSBzZWMgdG8gd2hvbGUgdGVzdAorICAgICAgcmVzdWx0MiA9IDM7CisgICAgfQorICAgICNwcmFnbWEgb21wIGJhcnJpZXIKKyAgICBpZiAocmFuayA9PSAyKSB7CisgICAgICByZXN1bHQxID0gcmVzdWx0MjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIChyZXN1bHQxID09IDMpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisjaWZkZWYgX09QRU5NUAorICBvbXBfc2V0X2R5bmFtaWMoMCk7IC8vIHByZXZlbnQgcnVudGltZSB0byBjaGFuZ2UgbnVtYmVyIG9mIHRocmVhZHMKKyAgb21wX3NldF9udW1fdGhyZWFkcyg0KTsgLy8gdGhlIHRlc3QgZXhwZWN0cyBhdCBsZWFzdCAzIHRocmVhZHMKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9iYXJyaWVyKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyNlbmRpZgorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9jcml0aWNhbC9vbXBfY3JpdGljYWwuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9jcml0aWNhbC9vbXBfY3JpdGljYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDdkYmNiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L2NyaXRpY2FsL29tcF9jcml0aWNhbC5jCkBAIC0wLDAgKzEsMzcgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX2NyaXRpY2FsKCkKK3sKKyAgaW50IHN1bTsKKyAgaW50IGtub3duX3N1bTsKKworICBzdW09MDsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBteXN1bT0wOworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspCisgICAgICBteXN1bSA9IG15c3VtICsgaTsKKworICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgc3VtID0gbXlzdW0gK3N1bTsKKyAgfQorICBrbm93bl9zdW0gPSA5OTkgKiAxMDAwIC8gMjsKKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2NyaXRpY2FsKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvZW52L2ttcF9hZmZfZGlzYWJsZV9od2xvYy5jIGIvZmluYWwvcnVudGltZS90ZXN0L2Vudi9rbXBfYWZmX2Rpc2FibGVfaHdsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Zjg0OGFjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L2Vudi9rbXBfYWZmX2Rpc2FibGVfaHdsb2MuYwpAQCAtMCwwICsxLDIxIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZSAmJiBlbnYgS01QX0FGRklOSVRZPWRpc2FibGVkIEtNUF9UT1BPTE9HWV9NRVRIT0Q9aHdsb2MgJWxpYm9tcC1ydW4KKy8vIFJFUVVJUkVTOiBod2xvYworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8vIFRlc3Qgd2lsbCBhc3NlcnQoKSB3aXRob3V0IGZpeAoraW50IHRlc3RfYWZmaW5pdHlfZGlzYWJsZWRfcGx1c19od2xvYygpIHsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAge30KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICBpbnQgaSwgajsKKyAgaW50IGZhaWxlZCA9IDA7CisKKyAgaWYgKCF0ZXN0X2FmZmluaXR5X2Rpc2FibGVkX3BsdXNfaHdsb2MoKSkgeworICAgIGZhaWxlZCA9IDE7CisgIH0KKyAgcmV0dXJuIGZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9lbnYva21wX3NldF9kaXNwYXRjaF9idWYuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9lbnYva21wX3NldF9kaXNwYXRjaF9idWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWViN2I1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L2Vudi9rbXBfc2V0X2Rpc3BhdGNoX2J1Zi5jCkBAIC0wLDAgKzEsNzYgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlICYmIGVudiBLTVBfRElTUF9OVU1fQlVGRkVSUz0wICVsaWJvbXAtcnVuCisvLyBSVU46IGVudiBLTVBfRElTUF9OVU1fQlVGRkVSUz0xICVsaWJvbXAtcnVuICYmIGVudiBLTVBfRElTUF9OVU1fQlVGRkVSUz0zICVsaWJvbXAtcnVuCisvLyBSVU46IGVudiBLTVBfRElTUF9OVU1fQlVGRkVSUz00ICVsaWJvbXAtcnVuICYmIGVudiBLTVBfRElTUF9OVU1fQlVGRkVSUz03ICVsaWJvbXAtcnVuCisvLyBSVU46ICVsaWJvbXAtY29tcGlsZSAtRE1ZX1NDSEVEVUxFPWd1aWRlZCAmJiBlbnYgS01QX0RJU1BfTlVNX0JVRkZFUlM9MSAlbGlib21wLXJ1bgorLy8gUlVOOiBlbnYgS01QX0RJU1BfTlVNX0JVRkZFUlM9MyAlbGlib21wLXJ1biAmJiBlbnYgS01QX0RJU1BfTlVNX0JVRkZFUlM9NCAlbGlib21wLXJ1bgorLy8gUlVOOiBlbnYgS01QX0RJU1BfTlVNX0JVRkZFUlM9NyAlbGlib21wLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b21wLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisjZGVmaW5lIElOQ1IgNworI2RlZmluZSBNWV9NQVggMjAwCisjZGVmaW5lIE1ZX01JTiAtMjAwCisjZGVmaW5lIE5VTV9MT09QUyAxMDAKKyNpZm5kZWYgTVlfU0NIRURVTEUKKyMgZGVmaW5lIE1ZX1NDSEVEVUxFIGR5bmFtaWMKKyNlbmRpZgorCitpbnQgYSwgYiwgYV9rbm93bl92YWx1ZSwgYl9rbm93bl92YWx1ZTsKKworaW50IHRlc3Rfa21wX3NldF9kaXNwX251bV9idWZmZXJzKCkKK3sKKyAgaW50IHN1Y2Nlc3MgPSAxOworICBhID0gMDsKKyAgYiA9IDA7CisgIC8vIHJ1biBtYW55IHNtYWxsIGR5bmFtaWMgbG9vcHMgdG8gc3RyZXNzIHRoZSBkaXNwYXRjaCBidWZmZXIgc3lzdGVtCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaSxqOworICAgIGZvciAoaiA9IDA7IGogPCBOVU1fTE9PUFM7IGorKykgeworICAgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKE1ZX1NDSEVEVUxFKSBub3dhaXQKKyAgICAgIGZvciAoaSA9IE1ZX01JTjsgaSA8IE1ZX01BWDsgaSs9SU5DUikgeworICAgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgICAgYSsrOworICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKE1ZX1NDSEVEVUxFKSBub3dhaXQKKyAgICAgIGZvciAoaSA9IE1ZX01BWDsgaSA+PSBNWV9NSU47IGktPUlOQ1IpIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICAgIGIrKzsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLy8gZGV0ZWN0IGZhaWx1cmUKKyAgaWYgKGEgIT0gYV9rbm93bl92YWx1ZSB8fCBiICE9IGJfa25vd25fdmFsdWUpIHsKKyAgICBzdWNjZXNzID0gMDsKKyAgICBwcmludGYoImEgPSAlZCAoc2hvdWxkIGJlICVkKSwgYiA9ICVkIChzaG91bGQgYmUgJWQpXG4iLCBhLCBhX2tub3duX3ZhbHVlLAorICAgICAgICAgICBiLCBiX2tub3duX3ZhbHVlKTsKKyAgfQorICByZXR1cm4gc3VjY2VzczsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICBpbnQgaSxqOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIC8vIGZpZ3VyZSBvdXQgdGhlIGtub3duIHZhbHVlcyB0byBjb21wYXJlIHdpdGggY2FsY3VsYXRlZCByZXN1bHQKKyAgYV9rbm93bl92YWx1ZSA9IDA7CisgIGJfa25vd25fdmFsdWUgPSAwOworCisgIGZvciAoaiA9IDA7IGogPCBOVU1fTE9PUFM7IGorKykgeworICAgIGZvciAoaSA9IE1ZX01JTjsgaSA8IE1ZX01BWDsgaSs9SU5DUikKKyAgICAgIGFfa25vd25fdmFsdWUrKzsKKyAgICBmb3IgKGkgPSBNWV9NQVg7IGkgPj0gTVlfTUlOOyBpLT1JTkNSKQorICAgICAgYl9rbm93bl92YWx1ZSsrOworICB9CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X2ttcF9zZXRfZGlzcF9udW1fYnVmZmVycygpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L2Vudi9vbXBfd2FpdF9wb2xpY3kuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9lbnYvb21wX3dhaXRfcG9saWN5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI2MGNlNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9lbnYvb21wX3dhaXRfcG9saWN5LmMKQEAgLTAsMCArMSw0MCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUgJiYgZW52IE9NUF9XQUlUX1BPTElDWT1hY3RpdmUgJWxpYm9tcC1ydW4gYWN0aXZlCisvLyBSVU46ICVsaWJvbXAtY29tcGlsZSAmJiBlbnYgT01QX1dBSVRfUE9MSUNZPXBhc3NpdmUgJWxpYm9tcC1ydW4gcGFzc2l2ZQorLy8KKy8vIE9NUF9XQUlUX1BPTElDWT1hY3RpdmUgc2hvdWxkIGltcGx5IGJsb2NrdGltZSA9PSBJTlRfTUFYCisvLyBpLmUuLCB0aHJlYWRzIHNwaW4td2FpdCBmb3JldmVyCisvLyBPTVBfV0FJVF9QT0xJQ1k9cGFzc2l2ZSBzaG91bGQgaW1wbHkgYmxvY2t0aW1lID09IDAKKy8vIGkuZS4sIHRocmVhZHMgaW1tZWRpYXRlbHkgc2xlZXAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKwordm9pZCB1c2FnZSgpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiBvbXBfd2FpdF9wb2xpY3kgYWN0aXZlfHBhc3NpdmVcbiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgIGludCBibG9ja3RpbWUsIHJldHZhbD0xOworICBjb25zdCBjaGFyKiBlbnZfdmFyX3ZhbHVlOworCisgIGlmIChhcmdjICE9IDIpIHsKKyAgICB1c2FnZSgpOworICAgIHJldHVybiAxOworICB9CisKKyAgYmxvY2t0aW1lID0ga21wX2dldF9ibG9ja3RpbWUoKTsKKworICBlbnZfdmFyX3ZhbHVlID0gYXJndlsxXTsKKyAgaWYgKCFzdHJjbXAoZW52X3Zhcl92YWx1ZSwgImFjdGl2ZSIpKSB7CisgICAgcmV0dmFsID0gKGJsb2NrdGltZSAhPSBJTlRfTUFYKTsKKyAgfSBlbHNlIGlmICghc3RyY21wKGVudl92YXJfdmFsdWUsICJwYXNzaXZlIikpIHsKKyAgICByZXR2YWwgPSAoYmxvY2t0aW1lICE9IDApOworICB9IGVsc2UgeworICAgIHVzYWdlKCk7CisgICAgcmV0dmFsID0gMTsKKyAgfQorCisgIHJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvZmx1c2gvb21wX2ZsdXNoLmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvZmx1c2gvb21wX2ZsdXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZkM2NkZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9mbHVzaC9vbXBfZmx1c2guYwpAQCAtMCwwICsxLDQ1IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCB0ZXN0X29tcF9mbHVzaCgpCit7CisgIGludCByZXN1bHQxOworICBpbnQgcmVzdWx0MjsKKyAgaW50IGR1bW15OworCisgIHJlc3VsdDEgPSAwOworICByZXN1bHQyID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IHJhbms7CisgICAgcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKyAgICAjcHJhZ21hIG9tcCBiYXJyaWVyCisgICAgaWYgKHJhbmsgPT0gMSkgeworICAgICAgcmVzdWx0MiA9IDM7CisgICAgICAjcHJhZ21hIG9tcCBmbHVzaCAocmVzdWx0MikKKyAgICAgIGR1bW15ID0gcmVzdWx0MjsKKyAgICB9CisgICAgaWYgKHJhbmsgPT0gMCkgeworICAgICAgbXlfc2xlZXAoU0xFRVBUSU1FKTsKKyAgICAgICNwcmFnbWEgb21wIGZsdXNoIChyZXN1bHQyKQorICAgICAgcmVzdWx0MSA9IHJlc3VsdDI7CisgICAgfQorICB9ICAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAgcmV0dXJuICgocmVzdWx0MSA9PSByZXN1bHQyKSAmJiAocmVzdWx0MiA9PSBkdW1teSkgJiYgKHJlc3VsdDIgPT0gMykpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvciAoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2ZsdXNoKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvbGl0LmNmZyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9saXQuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZWVhZTgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvbGl0LmNmZwpAQCAtMCwwICsxLDEwOCBAQAorIyAtKi0gUHl0aG9uIC0qLSB2aW06IHNldCBmdD1weXRob24gdHM9NCBzdz00IGV4cGFuZHRhYiB0dz03OToKKyMgQ29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgJ2xpdCcgdGVzdCBydW5uZXIuCisKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IGxpdC5mb3JtYXRzCisKKyMgVGVsbCBweWxpbnQgdGhhdCB3ZSBrbm93IGNvbmZpZyBhbmQgbGl0X2NvbmZpZyBleGlzdCBzb21ld2hlcmUuCitpZiAnUFlMSU5UX0lNUE9SVCcgaW4gb3MuZW52aXJvbjoKKyAgICBjb25maWcgPSBvYmplY3QoKQorICAgIGxpdF9jb25maWcgPSBvYmplY3QoKQorCitkZWYgYXBwZW5kX2R5bmFtaWNfbGlicmFyeV9wYXRoKHBhdGgpOgorICAgIGlmIGNvbmZpZy5vcGVyYXRpbmdfc3lzdGVtID09ICdXaW5kb3dzJzoKKyAgICAgICAgbmFtZSA9ICdQQVRIJworICAgICAgICBzZXAgPSAnOycKKyAgICBlbGlmIGNvbmZpZy5vcGVyYXRpbmdfc3lzdGVtID09ICdEYXJ3aW4nOgorICAgICAgICBuYW1lID0gJ0RZTERfTElCUkFSWV9QQVRIJworICAgICAgICBzZXAgPSAnOicKKyAgICBlbHNlOgorICAgICAgICBuYW1lID0gJ0xEX0xJQlJBUllfUEFUSCcKKyAgICAgICAgc2VwID0gJzonCisgICAgaWYgbmFtZSBpbiBjb25maWcuZW52aXJvbm1lbnQ6CisgICAgICAgIGNvbmZpZy5lbnZpcm9ubWVudFtuYW1lXSA9IHBhdGggKyBzZXAgKyBjb25maWcuZW52aXJvbm1lbnRbbmFtZV0KKyAgICBlbHNlOgorICAgICAgICBjb25maWcuZW52aXJvbm1lbnRbbmFtZV0gPSBwYXRoCisKKyMgbmFtZTogVGhlIG5hbWUgb2YgdGhpcyB0ZXN0IHN1aXRlLgorY29uZmlnLm5hbWUgPSAnbGlib21wJworCisjIHN1ZmZpeGVzOiBBIGxpc3Qgb2YgZmlsZSBleHRlbnNpb25zIHRvIHRyZWF0IGFzIHRlc3QgZmlsZXMuCitjb25maWcuc3VmZml4ZXMgPSBbJy5jJ10KKworIyB0ZXN0X3NvdXJjZV9yb290OiBUaGUgcm9vdCBwYXRoIHdoZXJlIHRlc3RzIGFyZSBsb2NhdGVkLgorY29uZmlnLnRlc3Rfc291cmNlX3Jvb3QgPSBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pCisKKyMgdGVzdF9leGVjX3Jvb3Q6IFRoZSByb290IG9iamVjdCBkaXJlY3Rvcnkgd2hlcmUgb3V0cHV0IGlzIHBsYWNlZAorY29uZmlnLnRlc3RfZXhlY19yb290ID0gY29uZmlnLmxpYm9tcF9vYmpfcm9vdAorCisjIHRlc3QgZm9ybWF0Citjb25maWcudGVzdF9mb3JtYXQgPSBsaXQuZm9ybWF0cy5TaFRlc3QoKQorCisjIGNvbXBpbGVyIGZsYWdzCitjb25maWcudGVzdF9jZmxhZ3MgPSBjb25maWcudGVzdF9vcGVubXBfZmxhZyArIFwKKyAgICAiIC1JICIgKyBjb25maWcudGVzdF9zb3VyY2Vfcm9vdCArIFwKKyAgICAiIC1JICIgKyBjb25maWcub21wX2hlYWRlcl9kaXJlY3RvcnkgKyBcCisgICAgIiAtTCAiICsgY29uZmlnLmxpYnJhcnlfZGlyICsgXAorICAgICIgIiArIGNvbmZpZy50ZXN0X2V4dHJhX2NmbGFncworCisjIGV4dHJhIGxpYnJhcmllcworbGlicyA9ICIiCitpZiBjb25maWcuaGFzX2xpYm06CisgICAgbGlicyArPSAiIC1sbSIKK2lmIGNvbmZpZy5oYXNfbGliYXRvbWljOgorICAgIGxpYnMgKz0gIiAtbGF0b21pYyIKKworIyBBbGxvdyBYRkFJTCB0byB3b3JrCitjb25maWcudGFyZ2V0X3RyaXBsZSA9IFsgXQoraWYgcmUuc2VhcmNoKCdnY2MnLCBjb25maWcudGVzdF9jb21waWxlcikgaXMgbm90IE5vbmU6CisgICAgY29uZmlnLmF2YWlsYWJsZV9mZWF0dXJlcy5hZGQoJ2djYycpCisKKyMgU2V0dXAgZW52aXJvbm1lbnQgdG8gZmluZCBkeW5hbWljIGxpYnJhcnkgYXQgcnVudGltZQorYXBwZW5kX2R5bmFtaWNfbGlicmFyeV9wYXRoKGNvbmZpZy5saWJyYXJ5X2RpcikKK2lmIGNvbmZpZy51c2luZ19od2xvYzoKKyAgICBhcHBlbmRfZHluYW1pY19saWJyYXJ5X3BhdGgoY29uZmlnLmh3bG9jX2xpYnJhcnlfZGlyKQorICAgIGNvbmZpZy5hdmFpbGFibGVfZmVhdHVyZXMuYWRkKCdod2xvYycpCisKKyMgUnBhdGggbW9kaWZpY2F0aW9ucyBmb3IgRGFyd2luCitpZiBjb25maWcub3BlcmF0aW5nX3N5c3RlbSA9PSAnRGFyd2luJzoKKyAgICBjb25maWcudGVzdF9jZmxhZ3MgKz0gIiAtV2wsLXJwYXRoLCIgKyBjb25maWcubGlicmFyeV9kaXIKKyAgICBpZiBjb25maWcudXNpbmdfaHdsb2M6CisgICAgICAgIGNvbmZpZy50ZXN0X2NmbGFncyArPSAiIC1XbCwtcnBhdGgsIiArIGNvbmZpZy5od2xvY19saWJyYXJ5X2RpcgorCisjIEZpbmQgdGhlIFNESyBvbiBEYXJ3aW4KK2lmIGNvbmZpZy5vcGVyYXRpbmdfc3lzdGVtID09ICdEYXJ3aW4nOgorICBjbWQgPSBzdWJwcm9jZXNzLlBvcGVuKFsneGNydW4nLCAnLS1zaG93LXNkay1wYXRoJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgb3V0LCBlcnIgPSBjbWQuY29tbXVuaWNhdGUoKQorICBvdXQgPSBvdXQuc3RyaXAoKQorICByZXMgPSBjbWQud2FpdCgpCisgIGlmIHJlcyA9PSAwIGFuZCBvdXQ6CisgICAgY29uZmlnLnRlc3RfY2ZsYWdzICs9ICIgLWlzeXNyb290ICIgKyBvdXQKKworIyBEaXNhYmxlIE9NUFQgdGVzdHMgaWYgRmlsZUNoZWNrIHdhcyBub3QgZm91bmQKK2lmIGNvbmZpZy5oYXNfb21wdCBhbmQgY29uZmlnLnRlc3RfZmlsZWNoZWNrID09ICIiOgorICAgIGxpdF9jb25maWcubm90ZSgiTm90IHRlc3RpbmcgT01QVCBiZWNhdXNlIEZpbGVDaGVjayB3YXMgbm90IGZvdW5kIikKKyAgICBjb25maWcuaGFzX29tcHQgPSBGYWxzZQorCitpZiBjb25maWcuaGFzX29tcHQ6CisgICAgY29uZmlnLmF2YWlsYWJsZV9mZWF0dXJlcy5hZGQoIm9tcHQiKQorICAgICMgZm9yIGNhbGxiYWNrLmgKKyAgICBjb25maWcudGVzdF9jZmxhZ3MgKz0gIiAtSSAiICsgY29uZmlnLnRlc3Rfc291cmNlX3Jvb3QgKyAiL29tcHQiCisKKyMgc3Vic3RpdHV0aW9ucworaWYgY29uZmlnLmhhc19vbXB0OgorICAgIGNvbmZpZy5zdWJzdGl0dXRpb25zLmFwcGVuZCgoIkZpbGVDaGVjayIsIGNvbmZpZy50ZXN0X2ZpbGVjaGVjaykpCisgICAgY29uZmlnLnN1YnN0aXR1dGlvbnMuYXBwZW5kKCgiJXNvcnQtdGhyZWFkcyIsICJzb3J0IC0tbnVtZXJpYy1zb3J0IC0tc3RhYmxlIikpCisKK2NvbmZpZy5zdWJzdGl0dXRpb25zLmFwcGVuZCgoIiVsaWJvbXAtY29tcGlsZS1hbmQtcnVuIiwgXAorICAgICIlbGlib21wLWNvbXBpbGUgJiYgJWxpYm9tcC1ydW4iKSkKK2NvbmZpZy5zdWJzdGl0dXRpb25zLmFwcGVuZCgoIiVsaWJvbXAtY29tcGlsZSIsIFwKKyAgICAiJWNsYW5nICVjZmxhZ3MgJXMgLW8gJXQiICsgbGlicykpCitjb25maWcuc3Vic3RpdHV0aW9ucy5hcHBlbmQoKCIlbGlib21wLXJ1biIsICIldCIpKQorY29uZmlnLnN1YnN0aXR1dGlvbnMuYXBwZW5kKCgiJWNsYW5nIiwgY29uZmlnLnRlc3RfY29tcGlsZXIpKQorY29uZmlnLnN1YnN0aXR1dGlvbnMuYXBwZW5kKCgiJW9wZW5tcF9mbGFnIiwgY29uZmlnLnRlc3Rfb3Blbm1wX2ZsYWcpKQorY29uZmlnLnN1YnN0aXR1dGlvbnMuYXBwZW5kKCgiJWNmbGFncyIsIGNvbmZpZy50ZXN0X2NmbGFncykpCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9saXQuc2l0ZS5jZmcuaW4gYi9maW5hbC9ydW50aW1lL3Rlc3QvbGl0LnNpdGUuY2ZnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZDU3Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvbGl0LnNpdGUuY2ZnLmluCkBAIC0wLDAgKzEsMTggQEAKK0BBVVRPX0dFTl9DT01NRU5UQAorCitjb25maWcudGVzdF9jb21waWxlciA9ICJATElCT01QX1RFU1RfQ09NUElMRVJAIgorY29uZmlnLnRlc3RfZmlsZWNoZWNrID0gIkBGSUxFQ0hFQ0tfRVhFQ1VUQUJMRUAiCitjb25maWcudGVzdF9vcGVubXBfZmxhZyA9ICJATElCT01QX1RFU1RfT1BFTk1QX0ZMQUdAIgorY29uZmlnLnRlc3RfZXh0cmFfY2ZsYWdzID0gIkBMSUJPTVBfVEVTVF9DRkxBR1NAIgorY29uZmlnLmxpYm9tcF9vYmpfcm9vdCA9ICJAQ01BS0VfQ1VSUkVOVF9CSU5BUllfRElSQCIKK2NvbmZpZy5saWJyYXJ5X2RpciA9ICJATElCT01QX0xJQlJBUllfRElSQCIKK2NvbmZpZy5vbXBfaGVhZGVyX2RpcmVjdG9yeSA9ICJATElCT01QX0JJTkFSWV9ESVJAL3NyYyIKK2NvbmZpZy5vcGVyYXRpbmdfc3lzdGVtID0gIkBDTUFLRV9TWVNURU1fTkFNRUAiCitjb25maWcuaHdsb2NfbGlicmFyeV9kaXIgPSAiQExJQk9NUF9IV0xPQ19MSUJSQVJZX0RJUkAiCitjb25maWcudXNpbmdfaHdsb2MgPSBATElCT01QX1VTRV9IV0xPQ0AKK2NvbmZpZy5oYXNfb21wdCA9IEBMSUJPTVBfT01QVF9TVVBQT1JUQCBhbmQgQExJQk9NUF9PTVBUX0JMQU1FQCBhbmQgQExJQk9NUF9PTVBUX1RSQUNFQAorY29uZmlnLmhhc19saWJtID0gQExJQk9NUF9IQVZFX0xJQk1ACitjb25maWcuaGFzX2xpYmF0b21pYyA9IEBMSUJPTVBfSEFWRV9MSUJBVE9NSUNACisKKyMgTGV0IHRoZSBtYWluIGNvbmZpZyBkbyB0aGUgcmVhbCB3b3JrLgorbGl0X2NvbmZpZy5sb2FkX2NvbmZpZyhjb25maWcsICJATElCT01QX0JBU0VfRElSQC90ZXN0L2xpdC5jZmciKQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L2xvY2svb21wX2luaXRfbG9jay5jIGIvZmluYWwvcnVudGltZS90ZXN0L2xvY2svb21wX2luaXRfbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YjYwZDEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvbG9jay9vbXBfaW5pdF9sb2NrLmMKQEAgLTAsMCArMSw0MiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorCisvLyBUaGlzIHNob3VsZCBiZSBzbGlnaHRseSBsZXNzIHRoYW4gS01QX0lfTE9DS19DSFVOSywgd2hpY2ggaXMgMTAyNAorI2RlZmluZSBMT0NLU19QRVJfSVRFUiAxMDAwCisjZGVmaW5lIElURVJBVElPTlMgKFJFUEVUSVRJT05TICsgMSkKKworLy8gVGhpcyB0ZXN0cyBjb25jdXJyZW50bHkgdXNpbmcgbG9ja3Mgb24gb25lIHRocmVhZCB3aGlsZSBpbml0aWFsaXppbmcgbmV3CisvLyBvbmVzIG9uIGFub3RoZXIgdGhyZWFkLiAgVGhpcyBleGVyY2lzZXMgdGhlIGdsb2JhbCBsb2NrIHBvb2wuCitpbnQgdGVzdF9vbXBfaW5pdF9sb2NrKCkgeworICBpbnQgaTsKKyAgb21wX2xvY2tfdCBsY2tzW0lURVJBVElPTlMgKiBMT0NLU19QRVJfSVRFUl07CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoc3RhdGljKSBudW1fdGhyZWFkcyhOVU1fVEFTS1MpCisgIGZvciAoaSA9IDA7IGkgPCBJVEVSQVRJT05TOyBpKyspIHsKKyAgICBpbnQgajsKKyAgICBvbXBfbG9ja190ICpteV9sY2tzID0gJmxja3NbaSAqIExPQ0tTX1BFUl9JVEVSXTsKKyAgICBmb3IgKGogPSAwOyBqIDwgTE9DS1NfUEVSX0lURVI7IGorKykgeworICAgICAgb21wX2luaXRfbG9jaygmbXlfbGNrc1tqXSk7CisgICAgfQorICAgIGZvciAoaiA9IDA7IGogPCBMT0NLU19QRVJfSVRFUiAqIDEwMDsgaisrKSB7CisgICAgICBvbXBfc2V0X2xvY2soJm15X2xja3NbaiAlIExPQ0tTX1BFUl9JVEVSXSk7CisgICAgICBvbXBfdW5zZXRfbG9jaygmbXlfbGNrc1tqICUgTE9DS1NfUEVSX0lURVJdKTsKKyAgICB9CisgIH0KKyAgLy8gV2FpdCB1bnRpbCBhbGwgcmVwaXRpdGlvbnMgYXJlIGRvbmUuICBUaGUgdGVzdCBpcyBleGVyY2lzaW5nIGdyb3d0aCBvZgorICAvLyB0aGUgZ2xvYmFsIGxvY2sgcG9vbCwgd2hpY2ggZG9lcyBub3Qgc2hyaW5rIHdoZW4gbm8gbG9ja3MgYXJlIGFsbG9jYXRlZC4KKyAgeworICAgIGludCBqOworICAgIGZvciAoaiA9IDA7IGogPCBJVEVSQVRJT05TICogTE9DS1NfUEVSX0lURVI7IGorKykgeworICAgICAgb21wX2Rlc3Ryb3lfbG9jaygmbGNrc1tqXSk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKCkgeworICAvLyBObyB1c2UgcmVwZWF0aW5nIHRoaXMgdGVzdCwgc2luY2UgaXQncyBleGVyY2lzaW5nIGEgcHJpdmF0ZSBnbG9iYWwgcG9vbAorICAvLyB3aGljaCBpcyBub3QgcmVzZXQgYmV0d2VlbiB0ZXN0IGl0ZXJhdGlvbnMuCisgIHJldHVybiB0ZXN0X29tcF9pbml0X2xvY2soKTsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9sb2NrL29tcF9sb2NrLmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvbG9jay9vbXBfbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMDFmMjcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvbG9jay9vbXBfbG9jay5jCkBAIC0wLDAgKzEsNDcgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKy8vIFJVTjogZW52IEtNUF9MT0NLX0tJTkQ9dGFzIEtNUF9TUElOX0JBQ0tPRkZfUEFSQU1TPTIwNDgsMjAwICVsaWJvbXAtcnVuCisvLyBSVU46IGVudiBLTVBfTE9DS19LSU5EPWZ1dGV4ICVsaWJvbXAtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK29tcF9sb2NrX3QgbGNrOworCitpbnQgdGVzdF9vbXBfbG9jaygpCit7CisgIGludCBucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisgIGludCByZXN1bHQgPSAwOworICBpbnQgbnJfaXRlcmF0aW9ucyA9IDA7CisgIGludCBpOworCisgIG9tcF9pbml0X2xvY2soJmxjayk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZChsY2spCisgIHsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykgeworICAgICAgb21wX3NldF9sb2NrKCZsY2spOworICAgICAgI3ByYWdtYSBvbXAgZmx1c2gKKyAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlKys7CisgICAgICAjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgbnJfaXRlcmF0aW9ucysrOworICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUtLTsKKyAgICAgIHJlc3VsdCA9IHJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlOworICAgICAgb21wX3Vuc2V0X2xvY2soJmxjayk7CisgICAgfQorICB9CisgIG9tcF9kZXN0cm95X2xvY2soJmxjayk7CisKKyAgcmV0dXJuICgocmVzdWx0ID09IDApICYmIChucl9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfbG9jaygpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L2xvY2svb21wX25lc3RfbG9jay5jIGIvZmluYWwvcnVudGltZS90ZXN0L2xvY2svb21wX25lc3RfbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZDdjNmEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvbG9jay9vbXBfbmVzdF9sb2NrLmMKQEAgLTAsMCArMSw0NSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitvbXBfbmVzdF9sb2NrX3QgbGNrOworCitpbnQgdGVzdF9vbXBfbmVzdF9sb2NrKCkKK3sKKyAgaW50IG5yX3RocmVhZHNfaW5fc2luZ2xlID0gMDsKKyAgaW50IHJlc3VsdCA9IDA7CisgIGludCBucl9pdGVyYXRpb25zID0gMDsKKyAgaW50IGk7CisKKyAgb21wX2luaXRfbmVzdF9sb2NrKCZsY2spOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQobGNrKQorICB7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspIHsKKyAgICAgIG9tcF9zZXRfbmVzdF9sb2NrKCZsY2spOworICAgICAgI3ByYWdtYSBvbXAgZmx1c2gKKyAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlKys7CisgICAgICAjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgbnJfaXRlcmF0aW9ucysrOworICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUtLTsKKyAgICAgIHJlc3VsdCA9IHJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlOworICAgICAgb21wX3Vuc2V0X25lc3RfbG9jaygmbGNrKTsKKyAgICB9CisgIH0KKyAgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKCZsY2spOworCisgIHJldHVybiAoKHJlc3VsdCA9PSAwKSAmJiAobnJfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX25lc3RfbG9jaygpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L2xvY2svb21wX3Rlc3RfbG9jay5jIGIvZmluYWwvcnVudGltZS90ZXN0L2xvY2svb21wX3Rlc3RfbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MTIwNTUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvbG9jay9vbXBfdGVzdF9sb2NrLmMKQEAgLTAsMCArMSw0NyBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorLy8gUlVOOiBlbnYgS01QX0xPQ0tfS0lORD10YXMgJWxpYm9tcC1ydW4KKy8vIFJVTjogZW52IEtNUF9MT0NLX0tJTkQ9ZnV0ZXggJWxpYm9tcC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworb21wX2xvY2tfdCBsY2s7CisKK2ludCB0ZXN0X29tcF90ZXN0X2xvY2soKQoreworICBpbnQgbnJfdGhyZWFkc19pbl9zaW5nbGUgPSAwOworICBpbnQgcmVzdWx0ID0gMDsKKyAgaW50IG5yX2l0ZXJhdGlvbnMgPSAwOworICBpbnQgaTsKKworICBvbXBfaW5pdF9sb2NrICgmbGNrKTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKGxjaykKKyAgeworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykgeworICAgICAgd2hpbGUgKCFvbXBfdGVzdF9sb2NrICgmbGNrKSkKKyAgICAgIHt9OworICAgICAgI3ByYWdtYSBvbXAgZmx1c2gKKyAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlKys7CisgICAgICAjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgbnJfaXRlcmF0aW9ucysrOworICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUtLTsKKyAgICAgIHJlc3VsdCA9IHJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlOworICAgICAgb21wX3Vuc2V0X2xvY2sgKCZsY2spOworICAgIH0KKyAgfQorICBvbXBfZGVzdHJveV9sb2NrKCZsY2spOworICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF90ZXN0X2xvY2soKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9sb2NrL29tcF90ZXN0X25lc3RfbG9jay5jIGIvZmluYWwvcnVudGltZS90ZXN0L2xvY2svb21wX3Rlc3RfbmVzdF9sb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZhNmZkMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9sb2NrL29tcF90ZXN0X25lc3RfbG9jay5jCkBAIC0wLDAgKzEsNDcgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworc3RhdGljIG9tcF9uZXN0X2xvY2tfdCBsY2s7CisKK2ludCB0ZXN0X29tcF90ZXN0X25lc3RfbG9jaygpCit7CisgIGludCBucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisgIGludCByZXN1bHQgPSAwOworICBpbnQgbnJfaXRlcmF0aW9ucyA9IDA7CisgIGludCBpOworCisgIG9tcF9pbml0X25lc3RfbG9jayAoJmxjayk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZChsY2spCisgIHsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisgICAgeworICAgICAgLypvbXBfc2V0X2xvY2soJmxjayk7Ki8KKyAgICAgIHdoaWxlKCFvbXBfdGVzdF9uZXN0X2xvY2sgKCZsY2spKQorICAgICAge307CisgICAgICAjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUrKzsKKyAgICAgICNwcmFnbWEgb21wIGZsdXNoCisgICAgICBucl9pdGVyYXRpb25zKys7CisgICAgICBucl90aHJlYWRzX2luX3NpbmdsZS0tOworICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisgICAgICBvbXBfdW5zZXRfbmVzdF9sb2NrICgmbGNrKTsKKyAgICB9CisgIH0KKyAgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrICgmbGNrKTsKKyAgcmV0dXJuICgocmVzdWx0ID09IDApICYmIChucl9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfdGVzdF9uZXN0X2xvY2soKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9tYXN0ZXIvb21wX21hc3Rlci5jIGIvZmluYWwvcnVudGltZS90ZXN0L21hc3Rlci9vbXBfbWFzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNjN2Y5ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9tYXN0ZXIvb21wX21hc3Rlci5jCkBAIC0wLDAgKzEsMzggQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX21hc3RlcigpCit7CisgIGludCBudGhyZWFkczsKKyAgaW50IGV4ZWN1dGluZ190aHJlYWQ7CisKKyAgbnRocmVhZHMgPSAwOworICBleGVjdXRpbmdfdGhyZWFkID0gLTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIG1hc3RlcgorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisgICAgICAgIG50aHJlYWRzKys7CisgICAgICB9CisgICAgICBleGVjdXRpbmdfdGhyZWFkID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgfSAvKiBlbmQgb2YgbWFzdGVyKi8KKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwqLworICByZXR1cm4gKChudGhyZWFkcyA9PSAxKSAmJiAoZXhlY3V0aW5nX3RocmVhZCA9PSAwKSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9tYXN0ZXIoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9tYXN0ZXIvb21wX21hc3Rlcl8zLmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvbWFzdGVyL29tcF9tYXN0ZXJfMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlOWZkZjgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvbWFzdGVyL29tcF9tYXN0ZXJfMy5jCkBAIC0wLDAgKzEsNDQgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX21hc3Rlcl8zKCkKK3sKKyAgaW50IG50aHJlYWRzOworICBpbnQgZXhlY3V0aW5nX3RocmVhZDsKKyAgaW50IHRpZF9yZXN1bHQgPSAwOyAvKiBjb3VudHMgdXAgdGhlIG51bWJlciBvZiB3cm9uZyB0aHJlYWQgbm8uIGZvcgorICAgICAgICAgICAgICAgdGhlIG1hc3RlciB0aHJlYWQuIChNdXN0IGJlIDApICovCisgIG50aHJlYWRzID0gMDsKKyAgZXhlY3V0aW5nX3RocmVhZCA9IC0xOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBtYXN0ZXIKKyAgICB7CisgICAgICBpbnQgdGlkID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICBpZiAodGlkICE9IDApIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgeyB0aWRfcmVzdWx0Kys7IH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisgICAgICAgIG50aHJlYWRzKys7CisgICAgICB9CisgICAgICBleGVjdXRpbmdfdGhyZWFkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworICAgIH0gLyogZW5kIG9mIG1hc3RlciovCisgIH0gLyogZW5kIG9mIHBhcmFsbGVsKi8KKyAgcmV0dXJuICgobnRocmVhZHMgPT0gMSkgJiYgKGV4ZWN1dGluZ190aHJlYWQgPT0gMCkgJiYgKHRpZF9yZXN1bHQgPT0gMCkpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfbWFzdGVyXzMoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9taXNjX2J1Z3MvY2FuY2VsbGF0aW9uX2Zvcl9zZWN0aW9ucy5jIGIvZmluYWwvcnVudGltZS90ZXN0L21pc2NfYnVncy9jYW5jZWxsYXRpb25fZm9yX3NlY3Rpb25zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU0NDVkNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9taXNjX2J1Z3MvY2FuY2VsbGF0aW9uX2Zvcl9zZWN0aW9ucy5jCkBAIC0wLDAgKzEsNjIgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlICYmIGVudiBPTVBfQ0FOQ0VMTEFUSU9OPXRydWUgJWxpYm9tcC1ydW4KKy8vIFhGQUlMOiBnY2MKKy8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgYSBidWcgaW4gY2FuY2VsbGF0aW9uIHRvIGNvdmVyIGVmZmVjdCBvZiBgI3ByYWdtYSBvbXAgY2FuY2VsYAorLy8gaW4gYSBsb29wIGNvbnN0cnVjdCwgb24gc2VjdGlvbnMgY29uc3RydWN0LgorLy8gUGFzcyBjb25kaXRpb246IENhbmNlbGxhdGlvbiBzdGF0dXMgZnJvbSBgZm9yYCBkb2VzIG5vdCBwZXJzaXN0CisvLyB0byBgc2VjdGlvbnNgLgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvbXAuaD4KKworaW50IHJlc3VsdFsyXSA9IHswLCAwfTsKKwordm9pZCBjcTQxNjg1MF9mb3Jfc2VjdGlvbnMoKSB7CisKKyAgICB1bnNpZ25lZCBpOworICAgICAvLyAxKSBsb29wCisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMDsgaSA8IDE7IGkrKykgeworICAgICAgICByZXN1bHRbMF0gPSAxOworICAgICAgICAjcHJhZ21hIG9tcCBjYW5jZWwgZm9yCisgICAgICAgIHJlc3VsdFswXSA9IDI7CisgICAgfQorCisvLyAgICAgICAgcHJpbnRmKCJ0aHJlYWQgJWQ6IHJlc3VsdFswXSA9ICVkLCByZXN1bHRbMV0gPSAlZCBcbiIsICBvbXBfZ2V0X3RocmVhZF9udW0oKSwgcmVzdWx0WzBdLCByZXN1bHRbMV0pOworCisKKyAgICAvLyAyKSBzZWN0aW9ucworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zCisgICAgeworICAgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdFsxXSA9IDE7CisgICAgICAgICAgICAjcHJhZ21hIG9tcCBjYW5jZWxsYXRpb24gcG9pbnQgc2VjdGlvbnMKKyAgICAgICAgICAgIHJlc3VsdFsxXSA9IDI7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludCBtYWluKHZvaWQpIHsKKyAgICBpZighb21wX2dldF9jYW5jZWxsYXRpb24oKSkgeworICAgICAgICBwcmludGYoIkNhbmNlbGxhdGlvbiBub3QgZW5hYmxlZCFcbiIpOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisKKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyg0KQorICAgIHsKKyAgICAgICAgY3E0MTY4NTBfZm9yX3NlY3Rpb25zKCk7CisgICAgfQorCisgICAgaWYgKHJlc3VsdFswXSAhPSAxIHx8IHJlc3VsdFsxXSAhPSAyKSB7CisgICAgICAgIHByaW50ZigiSW5jb3JyZWN0IHZhbHVlcy4gIgorICAgICAgICAgICAgICAgInJlc3VsdFswXSA9ICVkIChleHBlY3RlZCAxKSwgIgorICAgICAgICAgICAgICAgInJlc3VsdFsxXSA9ICVkIChleHBlY3RlZCAyKS5cbiIsCisgICAgICAgICAgICAgICByZXN1bHRbMF0sIHJlc3VsdFsxXSk7CisgICAgICAgIHByaW50ZigiRkFJTEVEXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHJpbnRmKCJQQVNTRURcbiIpOworICAgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvbWlzY19idWdzL21hbnktbWljcm90YXNrLWFyZ3MuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9taXNjX2J1Z3MvbWFueS1taWNyb3Rhc2stYXJncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NDQ1MTUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvbWlzY19idWdzL21hbnktbWljcm90YXNrLWFyZ3MuYwpAQCAtMCwwICsxLDM5IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IG1haW4oKQoreworCisgIGludCBpOworICBpbnQgaTEgPSAwOworICBpbnQgaTIgPSAxOworICBpbnQgaTMgPSAyOworICBpbnQgaTQgPSAzOworICBpbnQgaTUgPSA0OworICBpbnQgaTYgPSA2OworICBpbnQgaTcgPSA3OworICBpbnQgaTggPSA4OworICBpbnQgaTkgPSA5OworICBpbnQgaTEwID0gMTA7CisgIGludCBpMTEgPSAxMTsKKyAgaW50IGkxMiA9IDEyOworICBpbnQgaTEzID0gMTM7CisgIGludCBpMTQgPSAxNDsKKyAgaW50IGkxNSA9IDE1OworICBpbnQgaTE2ID0gMTY7CisgCisgIGludCByID0gMDsgCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBmaXJzdHByaXZhdGUoaTEsIGkyLCBpMywgaTQsIGk1LCBpNiwgaTcsIGk4LCBpOSwgaTEwLCBpMTEsIGkxMiwgaTEzLCBpMTQsIGkxNSwgaTE2KSByZWR1Y3Rpb24oKzpyKQorICBmb3IgKGkgPSAwOyBpIDwgaTE2OyBpKyspIHsKKyAgICByICs9IGkgKyBpMSArIGkyICsgaTMgKyBpNCArIGk1ICsgaTYgKyBpNyArIGk4ICsgaTkgKyBpMTAgKyBpMTEgKyBpMTIgKyBpMTMgKyBpMTQgKyBpMTUgKyBpMTY7CisgIH0KKworICBpbnQgcmYgPSAyMjE2OworICBpZiAociAhPSByZikgeworICAgIGZwcmludGYoc3RkZXJyLCAiciBzaG91bGQgYmUgJWQgYnV0IGluc3RlYWQgZXF1YWxzICVkXG4iLCByZiwgcik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L21pc2NfYnVncy9vbXBfZm9yZWlnbl90aHJlYWRfdGVhbV9yZXVzZS5jIGIvZmluYWwvcnVudGltZS90ZXN0L21pc2NfYnVncy9vbXBfZm9yZWlnbl90aHJlYWRfdGVhbV9yZXVzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNzBkNDcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvbWlzY19idWdzL29tcF9mb3JlaWduX3RocmVhZF90ZWFtX3JldXNlLmMKQEAgLTAsMCArMSw4MSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUgLWxwdGhyZWFkICYmICVsaWJvbXAtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKyNkZWZpbmUgTlVNX1RIUkVBRFMgMTAKKworLyoKKyBBZnRlciBob3QgdGVhbXMgd2VyZSBlbmFibGVkIGJ5IGRlZmF1bHQsIHRoZSBsaWJyYXJ5IHN0YXJ0ZWQgdXNpbmcgbGV2ZWxzCisga2VwdCBpbiB0aGUgdGVhbSBzdHJ1Y3R1cmUuICBUaGUgbGV2ZWxzIGFyZSBicm9rZW4gaW4gY2FzZSBmb3JlaWduIHRocmVhZAorIGV4aXRzIGFuZCBwdXRzIGl0cyB0ZWFtIGludG8gdGhlIHBvb2wgd2hpY2ggaXMgdGhlbiByZS11c2VkIGJ5IGFub3RoZXIgZm9yZWlnbgorIHRocmVhZC4gVGhlIGJyb2tlbiBiZWhhdmlvciBvYnNlcnZlZCBpcyB3aGVuIHByaW50aW5nIHRoZSBsZXZlbHMgZm9yIGVhY2gKKyBuZXcgdGVhbSwgb25lIGdldHMgMSwgMiwgMSwgMiwgMSwgMiwgZXRjLiAgVGhpcyBtYWtlcyB0aGUgbGlicmFyeSBiZWxpZXZlIHRoYXQKKyBldmVyeSBvdGhlciB0ZWFtIGlzIG5lc3RlZCB3aGljaCBpcyBpbmNvcnJlY3QuICBXaGF0IGlzIHdhbnRlZCBpcyBmb3IgdGhlCisgbGV2ZWxzIHRvIGJlIDEsIDEsIDEsIGV0Yy4KKyovCisKK2ludCBhID0gMDsKK2ludCBsZXZlbDsKKwordHlwZWRlZiBzdHJ1Y3QgdGhyZWFkX2FyZ190IHsKKyAgaW50IGl0ZXJhdGlvbnM7Cit9IHRocmVhZF9hcmdfdDsKKwordm9pZCogdGhyZWFkX2Z1bmN0aW9uKHZvaWQqIGFyZykgeworICBpbnQgaTsKKyAgdGhyZWFkX2FyZ190KiB0YXJnID0gKHRocmVhZF9hcmdfdCopYXJnOworICBpbnQgaXRlcmF0aW9ucyA9IHRhcmctPml0ZXJhdGlvbnM7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUoaSkKKyAgeworICAgIC8vIGxldmVsIHNob3VsZCBhbHdheXMgYmUgMQorICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgIGxldmVsID0gb21wX2dldF9sZXZlbCgpOworCisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yKGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgaSsrKSB7CisgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgIGErKzsKKyAgICB9CisgIH0KK30KKworaW50IHRlc3Rfb21wX3RlYW1fcmV1c2UoKQoreworICBpbnQgaTsKKyAgaW50IHN1Y2Nlc3MgPSAxOworICBwdGhyZWFkX3QgdGhyZWFkW05VTV9USFJFQURTXTsKKyAgdGhyZWFkX2FyZ190IHRocmVhZF9hcmdbTlVNX1RIUkVBRFNdOworICAvLyBsYXVuY2ggTlVNX1RIUkVBRFMgdGhyZWFkcywgb25lIGF0IGEgdGltZSB0byBwZXJmb3JtIHRocmVhZF9mdW5jdGlvbigpCisgIGZvcihpID0gMDsgaSA8IE5VTV9USFJFQURTOyBpKyspIHsKKyAgICB0aHJlYWRfYXJnW2ldLml0ZXJhdGlvbnMgPSBpICsgMTsKKyAgICBwdGhyZWFkX2NyZWF0ZSh0aHJlYWQraSwgTlVMTCwgdGhyZWFkX2Z1bmN0aW9uLCB0aHJlYWRfYXJnK2kpOworICAgIHB0aHJlYWRfam9pbigqKHRocmVhZCtpKSwgTlVMTCk7CisgICAgLy8gbGV2ZWwgcmVhZCBpbiB0aHJlYWRfZnVuY3Rpb24oKSdzIHBhcmFsbGVsIHJlZ2lvbiBzaG91bGQgYmUgMQorICAgIGlmKGxldmVsICE9IDEpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3I6IGZvciBwdGhyZWFkICVkIGxldmVsIHNob3VsZCBiZSAxIGJ1dCAiCisgICAgICAgICAgICAgICAgICAgICAgImluc3RlYWQgZXF1YWxzICVkXG4iLCBpLCBsZXZlbCk7CisgICAgICBzdWNjZXNzID0gMDsKKyAgICB9CisgIH0KKyAgLy8gbWFrZSBzdXJlIHRoZSBmb3IgbG9vcCB3b3JrcworICBpbnQga25vd25fc3VtID0gKE5VTV9USFJFQURTICogKE5VTV9USFJFQURTKzEpKSAvIDI7CisgIGlmKGEgIT0ga25vd25fc3VtKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJhIHNob3VsZCBiZSAlZCBidXQgaW5zdGVhZCBlcXVhbHMgJWRcbiIsIGtub3duX3N1bSwgYSk7CisgICAgc3VjY2VzcyA9IDA7CisgIH0KKyAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGEgPSAwOworICAgIGlmKCF0ZXN0X29tcF90ZWFtX3JldXNlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvbWlzY19idWdzL3RlYW1zLW5vLXBhci5jIGIvZmluYWwvcnVudGltZS90ZXN0L21pc2NfYnVncy90ZWFtcy1uby1wYXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWY4ZDlhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L21pc2NfYnVncy90ZWFtcy1uby1wYXIuYwpAQCAtMCwwICsxLDY0IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisvLworLy8gVGhlIHRlc3QgY2hlY2tzIHRoZSB0ZWFtcyBjb25zdHJ1Y3QgcHNldWRvY29kZSBleGVjdXRlZCBvbiBob3N0CisvLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvbXAuaD4KKworI2lmbmRlZiBOX1RFQU1TCisjZGVmaW5lIE5fVEVBTVMgNAorI2VuZGlmCisjaWZuZGVmIE5fVEhSCisjZGVmaW5lIE5fVEhSIDMKKyNlbmRpZgorCitzdGF0aWMgaW50IGVyciA9IDA7CisKKy8vIEludGVybmFsIGxpYnJhcnkgc3RhZmYgdG8gZW11bGF0ZSBjb21waWxlcidzIGNvZGUgZ2VuZXJhdGlvbjoKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgcmVzZXJ2ZWRfMTsKKyAgaW50IGZsYWdzOworICBpbnQgcmVzZXJ2ZWRfMjsKKyAgaW50IHJlc2VydmVkXzM7CisgIGNoYXIgKnBzb3VyY2U7Cit9IGlkZW50X3Q7CisKK3N0YXRpYyBpZGVudF90IGR1bW15X2xvYyA9IHswLCAyLCAwLCAwLCAiO2R1bW15RmlsZTtkdW1teUZ1bmM7MDswOzsifTsKKworaW50IF9fa21wY19nbG9iYWxfdGhyZWFkX251bSh2b2lkKik7Cit2b2lkIF9fa21wY19wdXNoX251bV90ZWFtcyhpZGVudF90IGNvbnN0KiwgaW50LCBpbnQsIGludCk7Cit2b2lkIF9fa21wY19mb3JrX3RlYW1zKGlkZW50X3QgY29uc3QqLCBpbnQgYXJnYywgdm9pZCAqbWljcm90YXNrLCAuLi4pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisvLyBPdXRsaW5lZCBlbnRyeSBwb2ludDoKK3ZvaWQgZm9vKGludCAqZ3RpZCwgaW50ICp0aWQsIGludCAqbnQpCit7IC8vIHN0YXJ0ICJzZXJpYWwiIGV4ZWN1dGlvbiBieSBtYXN0ZXIgdGhyZWFkcyBvZiBlYWNoIHRlYW0KKyAgaWYgKCBudCApIHsKKyAgICBwcmludGYoIiB0ZWFtICVkLCBwYXJhbSAlZFxuIiwgb21wX2dldF90ZWFtX251bSgpLCAqbnQpOworICB9IGVsc2UgeworICAgIHByaW50ZigiRVJST1I6IHRlYW1zIGJlZm9yZSBwYXJhbGxlbDogZ3RpZCwgdGlkOiAlZCAlZCwgYmFkIHBvaW50ZXI6ICVwXG4iLCAqZ3RpZCwgKnRpZCwgbnQpOworICAgIGVycisrOworICAgIHJldHVybjsKKyAgfQorfQorCitpbnQgbWFpbigpCit7CisgIGludCBudCA9IDQ7CisgIGludCB0aCA9IF9fa21wY19nbG9iYWxfdGhyZWFkX251bShOVUxMKTsgLy8gcmVnaXN0ZXJzIGluaXRpYWwgdGhyZWFkCisgIF9fa21wY19wdXNoX251bV90ZWFtcygmZHVtbXlfbG9jLCB0aCwgTl9URUFNUywgTl9USFIpOworICBfX2ttcGNfZm9ya190ZWFtcygmZHVtbXlfbG9jLCAxLCAmZm9vLCAmbnQpOyAvLyBwYXNzIDEgc2hhcmVkIHBhcmFtZXRlciAibnQiCisgIGlmIChlcnIpCisgICAgcHJpbnRmKCJmYWlsZWQgd2l0aCAlZCBlcnJvcnNcbiIsZXJyKTsKKyAgZWxzZQorICAgIHByaW50ZigicGFzc2VkXG4iKTsKKyAgcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9vbXBfbXlfc2xlZXAuaCBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9vbXBfbXlfc2xlZXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzhkOTMwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L29tcF9teV9zbGVlcC5oCkBAIC0wLDAgKzEsMzMgQEAKKyNpZm5kZWYgTVlfU0xFRVBfSAorI2RlZmluZSBNWV9TTEVFUF9ICisKKy8qISBVdGlsaXR5IGZ1bmN0aW9uIHRvIGhhdmUgYSBzbGVlcCBmdW5jdGlvbiB3aXRoIGJldHRlciByZXNvbHV0aW9uIGFuZAorICogIHdoaWNoIG9ubHkgc3RvcHMgb25lIHRocmVhZC4gKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpZiBkZWZpbmVkKF9XSU4zMikKKyMgaW5jbHVkZSA8d2luZG93cy5oPgorLy8gV2luZG93cyB2ZXJzaW9uIG9mIG15X3NsZWVwKCkgZnVuY3Rpb24KK3N0YXRpYyB2b2lkIG15X3NsZWVwKGRvdWJsZSBzbGVlcHRpbWUpIHsKKyAgRFdPUkQgbXMgPSAoRFdPUkQpIChzbGVlcHRpbWUgKiAxMDAwLjApOworICBTbGVlcChtcyk7Cit9CisKKworI2Vsc2UgLy8gX1dJTjMyCisKKy8vIFVuaWNlcyB2ZXJzaW9uIG9mIG15X3NsZWVwKCkgZnVuY3Rpb24KK3N0YXRpYyB2b2lkIG15X3NsZWVwKGRvdWJsZSBzbGVlcHRpbWUpIHsKKyAgc3RydWN0IHRpbWVzcGVjIHRzOworICB0cy50dl9zZWMgPSAodGltZV90KXNsZWVwdGltZTsKKyAgdHMudHZfbnNlYyA9IChsb25nKSgoc2xlZXB0aW1lIC0gKGRvdWJsZSl0cy50dl9zZWMpICogMUU5KTsKKyAgbmFub3NsZWVwKCZ0cywgTlVMTCk7Cit9CisKKyNlbmRpZiAvLyBfV0lOMzIKKworI2VuZGlmIC8vIE1ZX1NMRUVQX0gKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9vbXBfdGVzdHN1aXRlLmggYi9maW5hbC9ydW50aW1lL3Rlc3Qvb21wX3Rlc3RzdWl0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZjU0NzAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvb21wX3Rlc3RzdWl0ZS5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qIEdsb2JhbCBoZWFkZXJmaWxlIG9mIHRoZSBPcGVuTVAgVGVzdHN1aXRlICovCisKKyNpZm5kZWYgT01QX1RFU1RTVUlURV9ICisjZGVmaW5lIE9NUF9URVNUU1VJVEVfSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxvbXAuaD4KKworLyogR2VuZXJhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTE9PUENPVU5UIDEwMDAgLyogTnVtYmVyIG9mIGl0ZXJhdGlvbnMgdG8gc2xpdCBhbW9uZ3N0IHRocmVhZHMgKi8KKyNkZWZpbmUgUkVQRVRJVElPTlMgMTAgLyogTnVtYmVyIG9mIHRpbWVzIHRvIHJ1biBlYWNoIHRlc3QgKi8KKworLyogZm9sbG93aW5nIHRpbWVzIGFyZSBpbiBzZWNvbmRzICovCisjZGVmaW5lIFNMRUVQVElNRSAxCisKKy8qIERlZmluaXRpb25zIGZvciB0YXNrcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE5VTV9UQVNLUyAyNQorI2RlZmluZSBNQVhfVEFTS1NfUEVSX1RIUkVBRCA1CisKKyNpZmRlZiAgX1dJTjMyCisvLyBXaW5kb3dzIHZlcnNpb25zIG9mIHB0aHJlYWRfY3JlYXRlKCkgYW5kIHB0aHJlYWRfam9pbigpCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KK3R5cGVkZWYgSEFORExFIHB0aHJlYWRfdDsKKworLy8gZW5jYXBzdWxhdGVzIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhIHB0aHJlYWQtY2FsbGFibGUgZnVuY3Rpb24KK3N0cnVjdCB0aHJlYWRfZnVuY19pbmZvX3QgeworICB2b2lkKiAoKnN0YXJ0X3JvdXRpbmUpKHZvaWQqKTsKKyAgdm9pZCogYXJnOworfTsKKworLy8gY2FsbCB0aGUgdm9pZCogc3RhcnRfcm91dGluZSh2b2lkKik7CitzdGF0aWMgRFdPUkQgX190aHJlYWRfZnVuY193cmFwcGVyKExQVk9JRCBscFBhcmFtZXRlcikgeworICBzdHJ1Y3QgdGhyZWFkX2Z1bmNfaW5mb190KiBmdW5jdGlvbl9pbmZvcm1hdGlvbjsKKyAgZnVuY3Rpb25faW5mb3JtYXRpb24gPSAoc3RydWN0IHRocmVhZF9mdW5jX2luZm9fdCopbHBQYXJhbWV0ZXI7CisgIGZ1bmN0aW9uX2luZm9ybWF0aW9uLT5zdGFydF9yb3V0aW5lKGZ1bmN0aW9uX2luZm9ybWF0aW9uLT5hcmcpOworICBmcmVlKGZ1bmN0aW9uX2luZm9ybWF0aW9uKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIGF0dHIgaXMgaWdub3JlZAorc3RhdGljIGludCBwdGhyZWFkX2NyZWF0ZShwdGhyZWFkX3QgKnRocmVhZCwgdm9pZCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKCpzdGFydF9yb3V0aW5lKSAodm9pZCAqKSwgdm9pZCAqYXJnKSB7CisgIHB0aHJlYWRfdCBwdGhyZWFkOworICBzdHJ1Y3QgdGhyZWFkX2Z1bmNfaW5mb190KiBpbmZvOworICBpbmZvID0gKHN0cnVjdCB0aHJlYWRfZnVuY19pbmZvX3QqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHRocmVhZF9mdW5jX2luZm9fdCkpOworICBpbmZvLT5zdGFydF9yb3V0aW5lID0gc3RhcnRfcm91dGluZTsKKyAgaW5mby0+YXJnID0gYXJnOworICBwdGhyZWFkID0gQ3JlYXRlVGhyZWFkKE5VTEwsIDAsIF9fdGhyZWFkX2Z1bmNfd3JhcHBlciwgaW5mbywgMCwgTlVMTCk7CisgIGlmIChwdGhyZWFkID09IE5VTEwpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkNyZWF0ZVRocmVhZCgpIGZhaWxlZDogRXJyb3IgIyV1LlxuIiwgR2V0TGFzdEVycm9yKCkpOworICAgIGV4aXQoMSk7CisgIH0KKyAgKnRocmVhZCA9IHB0aHJlYWQ7CisgIHJldHVybiAwOworfQorLy8gcmV0dmFsIGlzIGlnbm9yZWQgZm9yIG5vdworc3RhdGljIGludCBwdGhyZWFkX2pvaW4ocHRocmVhZF90IHRocmVhZCwgdm9pZCAqKnJldHZhbCkgeworICBpbnQgcmM7CisgIHJjID0gV2FpdEZvclNpbmdsZU9iamVjdCh0aHJlYWQsIElORklOSVRFKTsKKyAgaWYgKHJjID09IFdBSVRfRkFJTEVEKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJXYWl0Rm9yU2luZ2xlT2JqZWN0KCkgZmFpbGVkOiBFcnJvciAjJXUuXG4iLAorICAgICAgICAgICAgR2V0TGFzdEVycm9yKCkpOworICAgIGV4aXQoMSk7CisgIH0KKyAgcmMgPSBDbG9zZUhhbmRsZSh0aHJlYWQpOworICBpZiAocmMgPT0gMCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiQ2xvc2VIYW5kbGUoKSBmYWlsZWQ6IEVycm9yICMldS5cbiIsIEdldExhc3RFcnJvcigpKTsKKyAgICBleGl0KDEpOworICB9CisgIHJldHVybiAwOworfQorI2Vsc2UKKyMgaW5jbHVkZSA8cHRocmVhZC5oPgorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L29tcHQvY2FsbGJhY2suaCBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9vbXB0L2NhbGxiYWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJkODk2NgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9vbXB0L2NhbGxiYWNrLmgKQEAgLTAsMCArMSwxMTkgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8b21wdC5oPgorCitzdGF0aWMgb21wdF9nZXRfdGFza19pZF90IG9tcHRfZ2V0X3Rhc2tfaWQ7CitzdGF0aWMgb21wdF9nZXRfdGFza19mcmFtZV90IG9tcHRfZ2V0X3Rhc2tfZnJhbWU7CitzdGF0aWMgb21wdF9nZXRfdGhyZWFkX2lkX3Qgb21wdF9nZXRfdGhyZWFkX2lkOworc3RhdGljIG9tcHRfZ2V0X3BhcmFsbGVsX2lkX3Qgb21wdF9nZXRfcGFyYWxsZWxfaWQ7CisKK3N0YXRpYyB2b2lkIHByaW50X2lkcyhpbnQgbGV2ZWwpCit7CisgIG9tcHRfZnJhbWVfdCogZnJhbWUgPSBvbXB0X2dldF90YXNrX2ZyYW1lKGxldmVsKTsKKyAgcHJpbnRmKCIlIiBQUkl1NjQgIjogbGV2ZWwgJWQ6IHBhcmFsbGVsX2lkPSUiIFBSSXU2NCAiLCB0YXNrX2lkPSUiIFBSSXU2NCAiLCBleGl0X2ZyYW1lPSVwLCByZWVudGVyX2ZyYW1lPSVwXG4iLCBvbXB0X2dldF90aHJlYWRfaWQoKSwgbGV2ZWwsIG9tcHRfZ2V0X3BhcmFsbGVsX2lkKGxldmVsKSwgb21wdF9nZXRfdGFza19pZChsZXZlbCksIGZyYW1lLT5leGl0X3J1bnRpbWVfZnJhbWUsIGZyYW1lLT5yZWVudGVyX3J1bnRpbWVfZnJhbWUpOworfQorCisjZGVmaW5lIHByaW50X2ZyYW1lKGxldmVsKVwKK2RvIHtcCisgIHByaW50ZigiJSIgUFJJdTY0ICI6IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKCVkKT0lcFxuIiwgb21wdF9nZXRfdGhyZWFkX2lkKCksIGxldmVsLCBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcyhsZXZlbCkpO1wKK30gd2hpbGUoMCkKKworCitzdGF0aWMgdm9pZAorb25fb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luKAorICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsCisgIG9tcHRfdGFza19pZF90IHRhc2tfaWQpCit7CisgIHByaW50ZigiJSIgUFJJdTY0ICI6IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9JSIgUFJJdTY0ICIsIHRhc2tfaWQ9JSIgUFJJdTY0ICJcbiIsIG9tcHRfZ2V0X3RocmVhZF9pZCgpLCBwYXJhbGxlbF9pZCwgdGFza19pZCk7CisgIHByaW50X2lkcygwKTsKK30KKworc3RhdGljIHZvaWQKK29uX29tcHRfZXZlbnRfYmFycmllcl9lbmQoCisgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwKKyAgb21wdF90YXNrX2lkX3QgdGFza19pZCkKK3sKKyAgcHJpbnRmKCIlIiBQUkl1NjQgIjogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9JSIgUFJJdTY0ICIsIHRhc2tfaWQ9JSIgUFJJdTY0ICJcbiIsIG9tcHRfZ2V0X3RocmVhZF9pZCgpLCBwYXJhbGxlbF9pZCwgdGFza19pZCk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9vbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW4oCisgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwKKyAgb21wdF90YXNrX2lkX3QgdGFza19pZCkKK3sKKyAgcHJpbnRmKCIlIiBQUkl1NjQgIjogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD0lIiBQUkl1NjQgIiwgdGFza19pZD0lIiBQUkl1NjQgIlxuIiwgb21wdF9nZXRfdGhyZWFkX2lkKCksIHBhcmFsbGVsX2lkLCB0YXNrX2lkKTsKK30KKworc3RhdGljIHZvaWQKK29uX29tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQoCisgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwKKyAgb21wdF90YXNrX2lkX3QgdGFza19pZCkKK3sKKyAgcHJpbnRmKCIlIiBQUkl1NjQgIjogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9JSIgUFJJdTY0ICIsIHRhc2tfaWQ9JSIgUFJJdTY0ICJcbiIsIG9tcHRfZ2V0X3RocmVhZF9pZCgpLCBwYXJhbGxlbF9pZCwgdGFza19pZCk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9vbXB0X2V2ZW50X2xvb3BfYmVnaW4oCisgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwKKyAgb21wdF90YXNrX2lkX3QgcGFyZW50X3Rhc2tfaWQsCisgIHZvaWQgKndvcmtzaGFyZV9mdW5jdGlvbikKK3sKKyAgcHJpbnRmKCIlIiBQUkl1NjQgIjogb21wdF9ldmVudF9sb29wX2JlZ2luOiBwYXJhbGxlbF9pZD0lIiBQUkl1NjQgIiwgcGFyZW50X3Rhc2tfaWQ9JSIgUFJJdTY0ICIsIHdvcmtzaGFyZV9mdW5jdGlvbj0lcFxuIiwgb21wdF9nZXRfdGhyZWFkX2lkKCksIHBhcmFsbGVsX2lkLCBwYXJlbnRfdGFza19pZCwgd29ya3NoYXJlX2Z1bmN0aW9uKTsKK30KKworc3RhdGljIHZvaWQKK29uX29tcHRfZXZlbnRfbG9vcF9lbmQoCisgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwKKyAgb21wdF90YXNrX2lkX3QgdGFza19pZCkKK3sKKyAgcHJpbnRmKCIlIiBQUkl1NjQgIjogb21wdF9ldmVudF9sb29wX2VuZDogcGFyYWxsZWxfaWQ9JSIgUFJJdTY0ICIsIHRhc2tfaWQ9JSIgUFJJdTY0ICJcbiIsIG9tcHRfZ2V0X3RocmVhZF9pZCgpLCBwYXJhbGxlbF9pZCwgdGFza19pZCk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9vbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luKAorICBvbXB0X3Rhc2tfaWRfdCBwYXJlbnRfdGFza19pZCwKKyAgb21wdF9mcmFtZV90ICpwYXJlbnRfdGFza19mcmFtZSwKKyAgb21wdF9wYXJhbGxlbF9pZF90IHBhcmFsbGVsX2lkLAorICB1aW50MzJfdCByZXF1ZXN0ZWRfdGVhbV9zaXplLAorICB2b2lkICpwYXJhbGxlbF9mdW5jdGlvbiwKKyAgb21wdF9pbnZva2VyX3QgaW52b2tlcikKK3sKKyAgcHJpbnRmKCIlIiBQUkl1NjQgIjogb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbjogcGFyZW50X3Rhc2tfaWQ9JSIgUFJJdTY0ICIsIHBhcmVudF90YXNrX2ZyYW1lLmV4aXQ9JXAsIHBhcmVudF90YXNrX2ZyYW1lLnJlZW50ZXI9JXAsIHBhcmFsbGVsX2lkPSUiIFBSSXU2NCAiLCByZXF1ZXN0ZWRfdGVhbV9zaXplPSUiIFBSSXUzMiAiLCBwYXJhbGxlbF9mdW5jdGlvbj0lcCwgaW52b2tlcj0lZFxuIiwgb21wdF9nZXRfdGhyZWFkX2lkKCksIHBhcmVudF90YXNrX2lkLCBwYXJlbnRfdGFza19mcmFtZS0+ZXhpdF9ydW50aW1lX2ZyYW1lLCBwYXJlbnRfdGFza19mcmFtZS0+cmVlbnRlcl9ydW50aW1lX2ZyYW1lLCBwYXJhbGxlbF9pZCwgcmVxdWVzdGVkX3RlYW1fc2l6ZSwgcGFyYWxsZWxfZnVuY3Rpb24sIGludm9rZXIpOworfQorCitzdGF0aWMgdm9pZAorb25fb21wdF9ldmVudF9wYXJhbGxlbF9lbmQoCisgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwKKyAgb21wdF90YXNrX2lkX3QgdGFza19pZCwKKyAgb21wdF9pbnZva2VyX3QgaW52b2tlcikKK3sKKyAgcHJpbnRmKCIlIiBQUkl1NjQgIjogb21wdF9ldmVudF9wYXJhbGxlbF9lbmQ6IHBhcmFsbGVsX2lkPSUiIFBSSXU2NCAiLCB0YXNrX2lkPSUiIFBSSXU2NCAiLCBpbnZva2VyPSVkXG4iLCBvbXB0X2dldF90aHJlYWRfaWQoKSwgcGFyYWxsZWxfaWQsIHRhc2tfaWQsIGludm9rZXIpOworfQorCisKK3ZvaWQgb21wdF9pbml0aWFsaXplKAorICBvbXB0X2Z1bmN0aW9uX2xvb2t1cF90IGxvb2t1cCwKKyAgY29uc3QgY2hhciAqcnVudGltZV92ZXJzaW9uLAorICB1bnNpZ25lZCBpbnQgb21wdF92ZXJzaW9uKQoreworICBvbXB0X3NldF9jYWxsYmFja190IG9tcHRfc2V0X2NhbGxiYWNrID0gKG9tcHRfc2V0X2NhbGxiYWNrX3QpIGxvb2t1cCgib21wdF9zZXRfY2FsbGJhY2siKTsKKyAgb21wdF9nZXRfdGFza19pZCA9IChvbXB0X2dldF90YXNrX2lkX3QpIGxvb2t1cCgib21wdF9nZXRfdGFza19pZCIpOworICBvbXB0X2dldF90YXNrX2ZyYW1lID0gKG9tcHRfZ2V0X3Rhc2tfZnJhbWVfdCkgbG9va3VwKCJvbXB0X2dldF90YXNrX2ZyYW1lIik7CisgIG9tcHRfZ2V0X3RocmVhZF9pZCA9IChvbXB0X2dldF90aHJlYWRfaWRfdCkgbG9va3VwKCJvbXB0X2dldF90aHJlYWRfaWQiKTsKKyAgb21wdF9nZXRfcGFyYWxsZWxfaWQgPSAob21wdF9nZXRfcGFyYWxsZWxfaWRfdCkgbG9va3VwKCJvbXB0X2dldF9wYXJhbGxlbF9pZCIpOworCisgIG9tcHRfc2V0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbiwgKG9tcHRfY2FsbGJhY2tfdCkgJm9uX29tcHRfZXZlbnRfYmFycmllcl9iZWdpbik7CisgIG9tcHRfc2V0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYmFycmllcl9lbmQsIChvbXB0X2NhbGxiYWNrX3QpICZvbl9vbXB0X2V2ZW50X2JhcnJpZXJfZW5kKTsKKyAgb21wdF9zZXRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luLCAob21wdF9jYWxsYmFja190KSAmb25fb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luKTsKKyAgb21wdF9zZXRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZCwgKG9tcHRfY2FsbGJhY2tfdCkgJm9uX29tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQpOworICBvbXB0X3NldF9jYWxsYmFjayhvbXB0X2V2ZW50X2xvb3BfYmVnaW4sIChvbXB0X2NhbGxiYWNrX3QpICZvbl9vbXB0X2V2ZW50X2xvb3BfYmVnaW4pOworICBvbXB0X3NldF9jYWxsYmFjayhvbXB0X2V2ZW50X2xvb3BfZW5kLCAob21wdF9jYWxsYmFja190KSAmb25fb21wdF9ldmVudF9sb29wX2VuZCk7CisgIG9tcHRfc2V0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcGFyYWxsZWxfYmVnaW4sIChvbXB0X2NhbGxiYWNrX3QpICZvbl9vbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luKTsKKyAgb21wdF9zZXRfY2FsbGJhY2sob21wdF9ldmVudF9wYXJhbGxlbF9lbmQsIChvbXB0X2NhbGxiYWNrX3QpICZvbl9vbXB0X2V2ZW50X3BhcmFsbGVsX2VuZCk7CisgIHByaW50ZigiMDogTlVMTF9QT0lOVEVSPSVwXG4iLCBOVUxMKTsKK30KKworb21wdF9pbml0aWFsaXplX3Qgb21wdF90b29sKCkKK3sKKyAgcmV0dXJuICZvbXB0X2luaXRpYWxpemU7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvb21wdC9wYXJhbGxlbC9uZXN0ZWQuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9vbXB0L3BhcmFsbGVsL25lc3RlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjN2I2OGQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvb21wdC9wYXJhbGxlbC9uZXN0ZWQuYwpAQCAtMCwwICsxLDI2NCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1biB8IEZpbGVDaGVjayAlcworLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1biB8ICVzb3J0LXRocmVhZHMgfCBGaWxlQ2hlY2sgLS1jaGVjay1wcmVmaXg9VEhSRUFEUyAlcworLy8gUkVRVUlSRVM6IG9tcHQKKyNpbmNsdWRlICJjYWxsYmFjay5oIgorI2luY2x1ZGUgPG9tcC5oPgorCitpbnQgbWFpbigpCit7CisgIG9tcF9zZXRfbmVzdGVkKDEpOworICBwcmludF9mcmFtZSgwKTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyg0KQorICB7CisgICAgcHJpbnRfZnJhbWUoMSk7CisgICAgcHJpbnRfaWRzKDApOworICAgIHByaW50X2lkcygxKTsKKyAgICBwcmludF9mcmFtZSgwKTsKKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyg0KQorICAgIHsKKyAgICAgIHByaW50X2ZyYW1lKDEpOworICAgICAgcHJpbnRfaWRzKDApOworICAgICAgcHJpbnRfaWRzKDEpOworICAgICAgcHJpbnRfaWRzKDIpOworICAgICAgcHJpbnRfZnJhbWUoMCk7CisgICAgICAjcHJhZ21hIG9tcCBiYXJyaWVyCisgICAgICBwcmludF9pZHMoMCk7CisgICAgfQorICAgIHByaW50X2lkcygwKTsKKyAgfQorCisgIC8vIENIRUNLOiAwOiBOVUxMX1BPSU5URVI9W1tOVUxMOi4qJF1dCisgIC8vIENIRUNLOiB7e159fVtbTUFTVEVSX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luOiBwYXJlbnRfdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEOlswLTldK11dLCBwYXJlbnRfdGFza19mcmFtZS5leGl0PVtbTlVMTF1dLCBwYXJlbnRfdGFza19mcmFtZS5yZWVudGVyPXt7MHhbMC1mXSt9fSwgcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT00LCBwYXJhbGxlbF9mdW5jdGlvbj0weHt7WzAtZl0rfX0sIGludm9rZXI9W1tQQVJBTExFTF9JTlZPS0VSOi4rXV0KKworICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIENIRUNLLURBRzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBOb3RlIHRoYXQgd2UgY2Fubm90IGVuc3VyZSB0aGF0IHRoZSB3b3JrZXIgdGhyZWFkcyBoYXZlIGFscmVhZHkgY2FsbGVkIGJhcnJpZXJfZW5kIGFuZCBpbXBsaWNpdF90YXNrX2VuZCBiZWZvcmUgcGFyYWxsZWxfZW5kIQorCisgIC8vIENIRUNLLURBRzoge3tefX1bW1RIUkVBRF9JRDpbMC05XStdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIENIRUNLLURBRzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIENIRUNLLURBRzoge3tefX1bW1RIUkVBRF9JRDpbMC05XStdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIENIRUNLLURBRzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIENIRUNLLURBRzoge3tefX1bW1RIUkVBRF9JRDpbMC05XStdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIENIRUNLLURBRzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIENIRUNLOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisKKworICAvLyBUSFJFQURTOiB7e159fTA6IE5VTExfUE9JTlRFUj1bW05VTEw6LiokXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRDpbMC05XStdXTogX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMCk9W1tNQUlOX1JFRU5URVI6MHhbMC1mXStdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfYmVnaW46IHBhcmVudF90YXNrX2lkPVtbUEFSRU5UX1RBU0tfSUQ6WzAtOV0rXV0sIHBhcmVudF90YXNrX2ZyYW1lLmV4aXQ9W1tOVUxMXV0sIHBhcmVudF90YXNrX2ZyYW1lLnJlZW50ZXI9W1tNQUlOX1JFRU5URVJdXSwgcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT00LCBwYXJhbGxlbF9mdW5jdGlvbj0weHt7WzAtZl0rfX0sIGludm9rZXI9W1tQQVJBTExFTF9JTlZPS0VSOi4rXV0KKworICAvLyBuZXN0ZWQgcGFyYWxsZWwgbWFzdGVycworICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDEpPVtbRVhJVDoweFswLWZdK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbRVhJVF1dLCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogbGV2ZWwgMTogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9W1tOVUxMXV0sIHJlZW50ZXJfZnJhbWU9W1tNQUlOX1JFRU5URVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApPVtbUkVFTlRFUjoweFswLWZdK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbjogcGFyZW50X3Rhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIHBhcmVudF90YXNrX2ZyYW1lLmV4aXQ9W1tFWElUXV0sIHBhcmVudF90YXNrX2ZyYW1lLnJlZW50ZXI9W1tSRUVOVEVSXV0sIHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCByZXF1ZXN0ZWRfdGVhbV9zaXplPTQsIHBhcmFsbGVsX2Z1bmN0aW9uPVtbTkVTVEVEX1BBUkFMTEVMX0ZVTkNUSU9OOjB4WzAtZl0rXV0sIGludm9rZXI9W1tQQVJBTExFTF9JTlZPS0VSXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDEpPVtbTkVTVEVEX0VYSVQ6MHhbMC1mXStdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTkVTVEVEX0VYSVRdXSwgcmVlbnRlcl9mcmFtZT1bW05VTExdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW0VYSVRdXSwgcmVlbnRlcl9mcmFtZT1bW1JFRU5URVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IGxldmVsIDI6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTlVMTF1dLCByZWVudGVyX2ZyYW1lPVtbTUFJTl9SRUVOVEVSXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKT1bW05FU1RFRF9SRUVOVEVSOjB4WzAtZl0rXV0KKyAgLy8gVEhSRUFEUy1OT1Q6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZAorICAvLyBleHBsaWNpdCBiYXJyaWVyCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTkVTVEVEX0VYSVRdXSwgcmVlbnRlcl9mcmFtZT1bW05FU1RFRF9SRUVOVEVSXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTkVTVEVEX0VYSVRdXSwgcmVlbnRlcl9mcmFtZT1bW05VTExdXQorICAvLyBpbXBsaWNpdCBiYXJyaWVyCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTlVMTF1dLCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9W1tFWElUXV0sIHJlZW50ZXJfZnJhbWU9W1tOVUxMXV0KKyAgLy8gaW1wbGljaXQgYmFycmllcgorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTlVMTF1dLCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRDpbMC05XStdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMTogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luOiBwYXJlbnRfdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgcGFyZW50X3Rhc2tfZnJhbWUuZXhpdD17ezB4WzAtZl0rfX0sIHBhcmVudF90YXNrX2ZyYW1lLnJlZW50ZXI9e3sweFswLWZdK319LCBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT00LCBwYXJhbGxlbF9mdW5jdGlvbj1bW05FU1RFRF9QQVJBTExFTF9GVU5DVElPTl1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDI6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbjogcGFyZW50X3Rhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIHBhcmVudF90YXNrX2ZyYW1lLmV4aXQ9e3sweFswLWZdK319LCBwYXJlbnRfdGFza19mcmFtZS5yZWVudGVyPXt7MHhbMC1mXSt9fSwgcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHJlcXVlc3RlZF90ZWFtX3NpemU9NCwgcGFyYWxsZWxfZnVuY3Rpb249W1tORVNURURfUEFSQUxMRUxfRlVOQ1RJT05dXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfYmVnaW46IHBhcmVudF90YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBwYXJlbnRfdGFza19mcmFtZS5leGl0PXt7MHhbMC1mXSt9fSwgcGFyZW50X3Rhc2tfZnJhbWUucmVlbnRlcj17ezB4WzAtZl0rfX0sIHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCByZXF1ZXN0ZWRfdGVhbV9zaXplPTQsIHBhcmFsbGVsX2Z1bmN0aW9uPVtbTkVTVEVEX1BBUkFMTEVMX0ZVTkNUSU9OXV0sIGludm9rZXI9W1tQQVJBTExFTF9JTlZPS0VSXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMTogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMjogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUy1OT1Q6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZAorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9wYXJhbGxlbF9lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGludm9rZXI9W1tQQVJBTExFTF9JTlZPS0VSXV0KKyAgLy8gVEhSRUFEUy1OT1Q6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZAorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gbmVzdGVkIHBhcmFsbGVsIHdvcmtlciB0aHJlYWRzCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBjYW4ndCByZWxpYWJseSB0ZWxsIHdoaWNoIHBhcmFsbGVsIHJlZ2lvbiBpcyB0aGUgcGFyZW50Li4uCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMTogcGFyYWxsZWxfaWQ9e3tbMC05XSt9fSwgdGFza19pZD17e1swLTldK319CisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMjogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUy1OT1Q6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZAorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRDpbMC05XStdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gY2FuJ3QgcmVsaWFibHkgdGVsbCB3aGljaCBwYXJhbGxlbCByZWdpb24gaXMgdGhlIHBhcmVudC4uLgorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPXt7WzAtOV0rfX0sIHRhc2tfaWQ9e3tbMC05XSt9fQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDI6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBjYW4ndCByZWxpYWJseSB0ZWxsIHdoaWNoIHBhcmFsbGVsIHJlZ2lvbiBpcyB0aGUgcGFyZW50Li4uCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMTogcGFyYWxsZWxfaWQ9e3tbMC05XSt9fSwgdGFza19pZD17e1swLTldK319CisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMjogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUy1OT1Q6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZAorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRDpbMC05XStdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gY2FuJ3QgcmVsaWFibHkgdGVsbCB3aGljaCBwYXJhbGxlbCByZWdpb24gaXMgdGhlIHBhcmVudC4uLgorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPXt7WzAtOV0rfX0sIHRhc2tfaWQ9e3tbMC05XSt9fQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDI6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBjYW4ndCByZWxpYWJseSB0ZWxsIHdoaWNoIHBhcmFsbGVsIHJlZ2lvbiBpcyB0aGUgcGFyZW50Li4uCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMTogcGFyYWxsZWxfaWQ9e3tbMC05XSt9fSwgdGFza19pZD17e1swLTldK319CisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMjogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUy1OT1Q6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZAorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRDpbMC05XStdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gY2FuJ3QgcmVsaWFibHkgdGVsbCB3aGljaCBwYXJhbGxlbCByZWdpb24gaXMgdGhlIHBhcmVudC4uLgorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPXt7WzAtOV0rfX0sIHRhc2tfaWQ9e3tbMC05XSt9fQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDI6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBjYW4ndCByZWxpYWJseSB0ZWxsIHdoaWNoIHBhcmFsbGVsIHJlZ2lvbiBpcyB0aGUgcGFyZW50Li4uCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMTogcGFyYWxsZWxfaWQ9e3tbMC05XSt9fSwgdGFza19pZD17e1swLTldK319CisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMjogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUy1OT1Q6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZAorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRDpbMC05XStdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gY2FuJ3QgcmVsaWFibHkgdGVsbCB3aGljaCBwYXJhbGxlbCByZWdpb24gaXMgdGhlIHBhcmVudC4uLgorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPXt7WzAtOV0rfX0sIHRhc2tfaWQ9e3tbMC05XSt9fQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDI6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L29tcHQvcGFyYWxsZWwvbmVzdGVkX2x3dC5jIGIvZmluYWwvcnVudGltZS90ZXN0L29tcHQvcGFyYWxsZWwvbmVzdGVkX2x3dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMjg4MTYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvb21wdC9wYXJhbGxlbC9uZXN0ZWRfbHd0LmMKQEAgLTAsMCArMSwyOTkgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4gfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4gfCAlc29ydC10aHJlYWRzIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PVRIUkVBRFMgJXMKKy8vIFJFUVVJUkVTOiBvbXB0CisjaW5jbHVkZSAiY2FsbGJhY2suaCIKKyNpbmNsdWRlIDxvbXAuaD4KKworaW50IG1haW4oKQoreworICBvbXBfc2V0X25lc3RlZCgxKTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyg0KQorICB7CisgICAgcHJpbnRfaWRzKDApOworICAgIHByaW50X2lkcygxKTsKKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcygxKQorICAgIHsKKyAgICAgIHByaW50X2lkcygwKTsKKyAgICAgIHByaW50X2lkcygxKTsKKyAgICAgIHByaW50X2lkcygyKTsKKyAgICAgICNwcmFnbWEgb21wIHBhcmFsbGVsIG51bV90aHJlYWRzKDQpCisgICAgICB7CisgICAgICAgIHByaW50X2lkcygwKTsKKyAgICAgICAgcHJpbnRfaWRzKDEpOworICAgICAgICBwcmludF9pZHMoMik7CisgICAgICAgIHByaW50X2lkcygzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBDSEVDSzogMDogTlVMTF9QT0lOVEVSPVtbTlVMTDouKiRdXQorICAvLyBDSEVDSzoge3tefX1bW01BU1RFUl9JRDpbMC05XStdXTogb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbjogcGFyZW50X3Rhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRDpbMC05XStdXSwgcGFyZW50X3Rhc2tfZnJhbWUuZXhpdD1bW05VTExdXSwgcGFyZW50X3Rhc2tfZnJhbWUucmVlbnRlcj17ezB4WzAtZl0rfX0sIHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHJlcXVlc3RlZF90ZWFtX3NpemU9NCwgcGFyYWxsZWxfZnVuY3Rpb249MHh7e1swLWZdK319LCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUjouK11dCisKKyAgLy8gQ0hFQ0stREFHOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gTm90ZSB0aGF0IHdlIGNhbm5vdCBlbnN1cmUgdGhhdCB0aGUgd29ya2VyIHRocmVhZHMgaGF2ZSBhbHJlYWR5IGNhbGxlZCBiYXJyaWVyX2VuZCBhbmQgaW1wbGljaXRfdGFza19lbmQgYmVmb3JlIHBhcmFsbGVsX2VuZCEKKworICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBDSEVDSzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorCisKKyAgLy8gVEhSRUFEUzogMDogTlVMTF9QT0lOVEVSPVtbTlVMTDouKiRdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luOiBwYXJlbnRfdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEOlswLTldK11dLCBwYXJlbnRfdGFza19mcmFtZS5leGl0PVtbTlVMTF1dLCBwYXJlbnRfdGFza19mcmFtZS5yZWVudGVyPVtbVEFTS19GUkFNRV9FTlRFUjoweFswLWZdK11dLCBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEOlswLTldK11dLCByZXF1ZXN0ZWRfdGVhbV9zaXplPTQsIHBhcmFsbGVsX2Z1bmN0aW9uPTB4e3tbMC1mXSt9fSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVI6LitdXQorCisgIC8vIG5lc3RlZCBwYXJhbGxlbCBtYXN0ZXJzCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTkVTVEVEX1RBU0tfRlJBTUVfRVhJVDoweFswLWZdK11dLCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogbGV2ZWwgMTogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9W1tOVUxMXV0sIHJlZW50ZXJfZnJhbWU9W1tUQVNLX0ZSQU1FX0VOVEVSXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfYmVnaW46IHBhcmVudF90YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBwYXJlbnRfdGFza19mcmFtZS5leGl0PVtbTkVTVEVEX1RBU0tfRlJBTUVfRVhJVF1dLCBwYXJlbnRfdGFza19mcmFtZS5yZWVudGVyPVtbTkVTVEVEX1RBU0tfRlJBTUVfRU5URVI6MHhbMC1mXStdXSwgcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHJlcXVlc3RlZF90ZWFtX3NpemU9MSwgcGFyYWxsZWxfZnVuY3Rpb249W1tORVNURURfUEFSQUxMRUxfRlVOQ1RJT046MHhbMC1mXStdXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9W1tORVNURURfTkVTVEVEX1RBU0tfRlJBTUVfRVhJVDoweFswLWZdK11dLCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogbGV2ZWwgMTogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTkVTVEVEX1RBU0tfRlJBTUVfRVhJVF1dLCByZWVudGVyX2ZyYW1lPVtbTkVTVEVEX1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IGxldmVsIDI6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTlVMTF1dLCByZWVudGVyX2ZyYW1lPVtbVEFTS19GUkFNRV9FTlRFUl1dCisKKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luOiBwYXJlbnRfdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0sIHBhcmVudF90YXNrX2ZyYW1lLmV4aXQ9W1tORVNURURfTkVTVEVEX1RBU0tfRlJBTUVfRVhJVF1dLCBwYXJlbnRfdGFza19mcmFtZS5yZWVudGVyPVtbTkVTVEVEX05FU1RFRF9UQVNLX0ZSQU1FX0VOVEVSOjB4WzAtZl0rXV0sIHBhcmFsbGVsX2lkPVtbTkVTVEVEX05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT00LCBwYXJhbGxlbF9mdW5jdGlvbj1bW05FU1RFRF9ORVNURURfUEFSQUxMRUxfRlVOQ1RJT046MHhbMC1mXStdXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfTkVTVEVEX0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9ORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9ORVNURURfSU1QTElDSVRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTkVTVEVEX05FU1RFRF9ORVNURURfVEFTS19GUkFNRV9FWElUOjB4WzAtZl0rXV0sIHJlZW50ZXJfZnJhbWU9W1tOVUxMXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05FU1RFRF9ORVNURURfVEFTS19GUkFNRV9FWElUXV0sIHJlZW50ZXJfZnJhbWU9W1tORVNURURfTkVTVEVEX1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IGxldmVsIDI6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05FU1RFRF9UQVNLX0ZSQU1FX0VYSVRdXSwgcmVlbnRlcl9mcmFtZT1bW05FU1RFRF9UQVNLX0ZSQU1FX0VOVEVSXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9ORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9ORVNURURfSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05FU1RFRF9UQVNLX0ZSQU1FX0VYSVQ6MHhbMC1mXStdXSwgcmVlbnRlcl9mcmFtZT1bW05VTExdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTlVMTF1dLCByZWVudGVyX2ZyYW1lPVtbVEFTS19GUkFNRV9FTlRFUl1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbjogcGFyZW50X3Rhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIHBhcmVudF90YXNrX2ZyYW1lLmV4aXQ9W1tORVNURURfVEFTS19GUkFNRV9FWElUXV0sIHBhcmVudF90YXNrX2ZyYW1lLnJlZW50ZXI9W1tORVNURURfVEFTS19GUkFNRV9FTlRFUjoweFswLWZdK11dLCBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT0xLCBwYXJhbGxlbF9mdW5jdGlvbj1bW05FU1RFRF9QQVJBTExFTF9GVU5DVElPTl1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05FU1RFRF9ORVNURURfVEFTS19GUkFNRV9FWElUOjB4WzAtZl0rXV0sIHJlZW50ZXJfZnJhbWU9W1tOVUxMXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9W1tORVNURURfVEFTS19GUkFNRV9FWElUXV0sIHJlZW50ZXJfZnJhbWU9W1tORVNURURfVEFTS19GUkFNRV9FTlRFUl1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMjogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9W1tOVUxMXV0sIHJlZW50ZXJfZnJhbWU9W1tUQVNLX0ZSQU1FX0VOVEVSXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luOiBwYXJlbnRfdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0sIHBhcmVudF90YXNrX2ZyYW1lLmV4aXQ9W1tORVNURURfTkVTVEVEX1RBU0tfRlJBTUVfRVhJVF1dLCBwYXJlbnRfdGFza19mcmFtZS5yZWVudGVyPVtbTkVTVEVEX05FU1RFRF9UQVNLX0ZSQU1FX0VOVEVSOjB4WzAtZl0rXV0sIHBhcmFsbGVsX2lkPVtbTkVTVEVEX05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT00LCBwYXJhbGxlbF9mdW5jdGlvbj1bW05FU1RFRF9ORVNURURfUEFSQUxMRUxfRlVOQ1RJT05dXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfTkVTVEVEX0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9ORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9ORVNURURfSU1QTElDSVRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTkVTVEVEX05FU1RFRF9ORVNURURfVEFTS19GUkFNRV9FWElUOjB4WzAtZl0rXV0sIHJlZW50ZXJfZnJhbWU9W1tOVUxMXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05FU1RFRF9ORVNURURfVEFTS19GUkFNRV9FWElUXV0sIHJlZW50ZXJfZnJhbWU9W1tORVNURURfTkVTVEVEX1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDI6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05FU1RFRF9UQVNLX0ZSQU1FX0VYSVRdXSwgcmVlbnRlcl9mcmFtZT1bW05FU1RFRF9UQVNLX0ZSQU1FX0VOVEVSXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9ORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9ORVNURURfSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05FU1RFRF9UQVNLX0ZSQU1FX0VYSVQ6MHhbMC1mXStdXSwgcmVlbnRlcl9mcmFtZT1bW05VTExdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTlVMTF1dLCByZWVudGVyX2ZyYW1lPVtbVEFTS19GUkFNRV9FTlRFUl1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbjogcGFyZW50X3Rhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIHBhcmVudF90YXNrX2ZyYW1lLmV4aXQ9W1tORVNURURfVEFTS19GUkFNRV9FWElUXV0sIHBhcmVudF90YXNrX2ZyYW1lLnJlZW50ZXI9W1tORVNURURfVEFTS19GUkFNRV9FTlRFUjoweFswLWZdK11dLCBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT0xLCBwYXJhbGxlbF9mdW5jdGlvbj1bW05FU1RFRF9QQVJBTExFTF9GVU5DVElPTl1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05FU1RFRF9ORVNURURfVEFTS19GUkFNRV9FWElUOjB4WzAtZl0rXV0sIHJlZW50ZXJfZnJhbWU9W1tOVUxMXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9W1tORVNURURfVEFTS19GUkFNRV9FWElUXV0sIHJlZW50ZXJfZnJhbWU9W1tORVNURURfVEFTS19GUkFNRV9FTlRFUl1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMjogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9W1tOVUxMXV0sIHJlZW50ZXJfZnJhbWU9W1tUQVNLX0ZSQU1FX0VOVEVSXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luOiBwYXJlbnRfdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0sIHBhcmVudF90YXNrX2ZyYW1lLmV4aXQ9W1tORVNURURfTkVTVEVEX1RBU0tfRlJBTUVfRVhJVF1dLCBwYXJlbnRfdGFza19mcmFtZS5yZWVudGVyPVtbTkVTVEVEX05FU1RFRF9UQVNLX0ZSQU1FX0VOVEVSOjB4WzAtZl0rXV0sIHBhcmFsbGVsX2lkPVtbTkVTVEVEX05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT00LCBwYXJhbGxlbF9mdW5jdGlvbj1bW05FU1RFRF9ORVNURURfUEFSQUxMRUxfRlVOQ1RJT05dXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfTkVTVEVEX0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9ORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9ORVNURURfSU1QTElDSVRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTkVTVEVEX05FU1RFRF9ORVNURURfVEFTS19GUkFNRV9FWElUOjB4WzAtZl0rXV0sIHJlZW50ZXJfZnJhbWU9W1tOVUxMXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05FU1RFRF9ORVNURURfVEFTS19GUkFNRV9FWElUXV0sIHJlZW50ZXJfZnJhbWU9W1tORVNURURfTkVTVEVEX1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDI6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05FU1RFRF9UQVNLX0ZSQU1FX0VYSVRdXSwgcmVlbnRlcl9mcmFtZT1bW05FU1RFRF9UQVNLX0ZSQU1FX0VOVEVSXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9ORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9ORVNURURfSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05FU1RFRF9UQVNLX0ZSQU1FX0VYSVQ6MHhbMC1mXStdXSwgcmVlbnRlcl9mcmFtZT1bW05VTExdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTlVMTF1dLCByZWVudGVyX2ZyYW1lPVtbVEFTS19GUkFNRV9FTlRFUl1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbjogcGFyZW50X3Rhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIHBhcmVudF90YXNrX2ZyYW1lLmV4aXQ9W1tORVNURURfVEFTS19GUkFNRV9FWElUXV0sIHBhcmVudF90YXNrX2ZyYW1lLnJlZW50ZXI9W1tORVNURURfVEFTS19GUkFNRV9FTlRFUjoweFswLWZdK11dLCBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT0xLCBwYXJhbGxlbF9mdW5jdGlvbj1bW05FU1RFRF9QQVJBTExFTF9GVU5DVElPTl1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05FU1RFRF9ORVNURURfVEFTS19GUkFNRV9FWElUOjB4WzAtZl0rXV0sIHJlZW50ZXJfZnJhbWU9W1tOVUxMXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9W1tORVNURURfVEFTS19GUkFNRV9FWElUXV0sIHJlZW50ZXJfZnJhbWU9W1tORVNURURfVEFTS19GUkFNRV9FTlRFUl1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMjogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9W1tOVUxMXV0sIHJlZW50ZXJfZnJhbWU9W1tUQVNLX0ZSQU1FX0VOVEVSXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luOiBwYXJlbnRfdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0sIHBhcmVudF90YXNrX2ZyYW1lLmV4aXQ9W1tORVNURURfTkVTVEVEX1RBU0tfRlJBTUVfRVhJVF1dLCBwYXJlbnRfdGFza19mcmFtZS5yZWVudGVyPVtbTkVTVEVEX05FU1RFRF9UQVNLX0ZSQU1FX0VOVEVSOjB4WzAtZl0rXV0sIHBhcmFsbGVsX2lkPVtbTkVTVEVEX05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT00LCBwYXJhbGxlbF9mdW5jdGlvbj1bW05FU1RFRF9ORVNURURfUEFSQUxMRUxfRlVOQ1RJT05dXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfTkVTVEVEX0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9ORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9ORVNURURfSU1QTElDSVRfVEFTS19JRF1dLCBleGl0X2ZyYW1lPVtbTkVTVEVEX05FU1RFRF9ORVNURURfVEFTS19GUkFNRV9FWElUOjB4WzAtZl0rXV0sIHJlZW50ZXJfZnJhbWU9W1tOVUxMXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05FU1RFRF9ORVNURURfVEFTS19GUkFNRV9FWElUXV0sIHJlZW50ZXJfZnJhbWU9W1tORVNURURfTkVTVEVEX1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDI6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05FU1RFRF9UQVNLX0ZSQU1FX0VYSVRdXSwgcmVlbnRlcl9mcmFtZT1bW05FU1RFRF9UQVNLX0ZSQU1FX0VOVEVSXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9ORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9ORVNURURfSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIG5lc3RlZCBwYXJhbGxlbCB3b3JrZXIgdGhyZWFkcworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9e3sweFswLWZdK319LCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9e3sweFswLWZdK319LCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9e3sweFswLWZdK319LCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9e3sweFswLWZdK319LCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9e3sweFswLWZdK319LCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9e3sweFswLWZdK319LCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9e3sweFswLWZdK319LCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9e3sweFswLWZdK319LCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9e3sweFswLWZdK319LCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9e3sweFswLWZdK319LCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9e3sweFswLWZdK319LCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGV4aXRfZnJhbWU9e3sweFswLWZdK319LCByZWVudGVyX2ZyYW1lPVtbTlVMTF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAzOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgZXhpdF9mcmFtZT1bW05VTExdXSwgcmVlbnRlcl9mcmFtZT1bW1RBU0tfRlJBTUVfRU5URVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L29tcHQvcGFyYWxsZWwvbmVzdGVkX3NlcmlhbGl6ZWQuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9vbXB0L3BhcmFsbGVsL25lc3RlZF9zZXJpYWxpemVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQzMzIzZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9vbXB0L3BhcmFsbGVsL25lc3RlZF9zZXJpYWxpemVkLmMKQEAgLTAsMCArMSwxMDcgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4gfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4gfCAlc29ydC10aHJlYWRzIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PVRIUkVBRFMgJXMKKy8vIFJFUVVJUkVTOiBvbXB0CisjaW5jbHVkZSAiY2FsbGJhY2suaCIKKyNpbmNsdWRlIDxvbXAuaD4KKworaW50IG1haW4oKQoreworICBvbXBfc2V0X25lc3RlZCgwKTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyg0KQorICB7CisgICAgcHJpbnRfaWRzKDApOworICAgIHByaW50X2lkcygxKTsKKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyg0KQorICAgIHsKKyAgICAgIHByaW50X2lkcygwKTsKKyAgICAgIHByaW50X2lkcygxKTsKKyAgICAgIHByaW50X2lkcygyKTsKKyAgICB9CisgIH0KKworICAvLyBDSEVDSzogMDogTlVMTF9QT0lOVEVSPVtbTlVMTDouKiRdXQorICAvLyBDSEVDSzoge3tefX1bW01BU1RFUl9JRDpbMC05XStdXTogb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbjogcGFyZW50X3Rhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRDpbMC05XStdXSwgcGFyZW50X3Rhc2tfZnJhbWUuZXhpdD1bW05VTExdXSwgcGFyZW50X3Rhc2tfZnJhbWUucmVlbnRlcj17ezB4WzAtZl0rfX0sIHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHJlcXVlc3RlZF90ZWFtX3NpemU9NCwgcGFyYWxsZWxfZnVuY3Rpb249MHh7e1swLWZdK319LCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUjouK11dCisKKyAgLy8gQ0hFQ0stREFHOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gTm90ZSB0aGF0IHdlIGNhbm5vdCBlbnN1cmUgdGhhdCB0aGUgd29ya2VyIHRocmVhZHMgaGF2ZSBhbHJlYWR5IGNhbGxlZCBiYXJyaWVyX2VuZCBhbmQgaW1wbGljaXRfdGFza19lbmQgYmVmb3JlIHBhcmFsbGVsX2VuZCEKKworICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBDSEVDSzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorCisKKyAgLy8gVEhSRUFEUzogMDogTlVMTF9QT0lOVEVSPVtbTlVMTDouKiRdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luOiBwYXJlbnRfdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEOlswLTldK11dLCBwYXJlbnRfdGFza19mcmFtZS5leGl0PVtbTlVMTF1dLCBwYXJlbnRfdGFza19mcmFtZS5yZWVudGVyPXt7MHhbMC1mXSt9fSwgcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT00LCBwYXJhbGxlbF9mdW5jdGlvbj0weHt7WzAtZl0rfX0sIGludm9rZXI9W1tQQVJBTExFTF9JTlZPS0VSOi4rXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbjogcGFyZW50X3Rhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIHBhcmVudF90YXNrX2ZyYW1lLmV4aXQ9e3sweFswLWZdK319LCBwYXJlbnRfdGFza19mcmFtZS5yZWVudGVyPXt7MHhbMC1mXSt9fSwgcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHJlcXVlc3RlZF90ZWFtX3NpemU9NCwgcGFyYWxsZWxfZnVuY3Rpb249W1tORVNURURfUEFSQUxMRUxfRlVOQ1RJT046MHhbMC1mXStdXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9wYXJhbGxlbF9lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGludm9rZXI9W1tQQVJBTExFTF9JTlZPS0VSXV0KKyAgLy8gVEhSRUFEUy1OT1Q6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZAorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRDpbMC05XStdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMTogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luOiBwYXJlbnRfdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgcGFyZW50X3Rhc2tfZnJhbWUuZXhpdD17ezB4WzAtZl0rfX0sIHBhcmVudF90YXNrX2ZyYW1lLnJlZW50ZXI9e3sweFswLWZdK319LCBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT00LCBwYXJhbGxlbF9mdW5jdGlvbj1bW05FU1RFRF9QQVJBTExFTF9GVU5DVElPTl1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDI6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfYmVnaW46IHBhcmVudF90YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBwYXJlbnRfdGFza19mcmFtZS5leGl0PXt7MHhbMC1mXSt9fSwgcGFyZW50X3Rhc2tfZnJhbWUucmVlbnRlcj17ezB4WzAtZl0rfX0sIHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCByZXF1ZXN0ZWRfdGVhbV9zaXplPTQsIHBhcmFsbGVsX2Z1bmN0aW9uPVtbTkVTVEVEX1BBUkFMTEVMX0ZVTkNUSU9OXV0sIGludm9rZXI9W1tQQVJBTExFTF9JTlZPS0VSXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMTogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMjogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbjogcGFyZW50X3Rhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIHBhcmVudF90YXNrX2ZyYW1lLmV4aXQ9e3sweFswLWZdK319LCBwYXJlbnRfdGFza19mcmFtZS5yZWVudGVyPXt7MHhbMC1mXSt9fSwgcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHJlcXVlc3RlZF90ZWFtX3NpemU9NCwgcGFyYWxsZWxfZnVuY3Rpb249W1tORVNURURfUEFSQUxMRUxfRlVOQ1RJT05dXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9wYXJhbGxlbF9lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGludm9rZXI9W1tQQVJBTExFTF9JTlZPS0VSXV0KKyAgLy8gVEhSRUFEUy1OT1Q6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZAorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvb21wdC9wYXJhbGxlbC9ub3JtYWwuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9vbXB0L3BhcmFsbGVsL25vcm1hbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZjU3ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvb21wdC9wYXJhbGxlbC9ub3JtYWwuYwpAQCAtMCwwICsxLDcwIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuIHwgJXNvcnQtdGhyZWFkcyB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1USFJFQURTICVzCisvLyBSRVFVSVJFUzogb21wdAorI2luY2x1ZGUgImNhbGxiYWNrLmgiCisKK2ludCBtYWluKCkKK3sKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMoNCkKKyAgeworICAgIHByaW50X2lkcygwKTsKKyAgICBwcmludF9pZHMoMSk7CisgIH0KKworICAvLyBDSEVDSzogMDogTlVMTF9QT0lOVEVSPVtbTlVMTDouKiRdXQorICAvLyBDSEVDSzoge3tefX1bW01BU1RFUl9JRDpbMC05XStdXTogb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbjogcGFyZW50X3Rhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRDpbMC05XStdXSwgcGFyZW50X3Rhc2tfZnJhbWUuZXhpdD1bW05VTExdXSwgcGFyZW50X3Rhc2tfZnJhbWUucmVlbnRlcj17ezB4WzAtZl0rfX0sIHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHJlcXVlc3RlZF90ZWFtX3NpemU9NCwgcGFyYWxsZWxfZnVuY3Rpb249MHh7e1swLWZdK319LCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUjouK11dCisKKyAgLy8gQ0hFQ0stREFHOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gTm90ZSB0aGF0IHdlIGNhbm5vdCBlbnN1cmUgdGhhdCB0aGUgd29ya2VyIHRocmVhZHMgaGF2ZSBhbHJlYWR5IGNhbGxlZCBiYXJyaWVyX2VuZCBhbmQgaW1wbGljaXRfdGFza19lbmQgYmVmb3JlIHBhcmFsbGVsX2VuZCEKKworICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBDSEVDSzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorCisKKyAgLy8gVEhSRUFEUzogMDogTlVMTF9QT0lOVEVSPVtbTlVMTDouKiRdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luOiBwYXJlbnRfdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEOlswLTldK11dLCBwYXJlbnRfdGFza19mcmFtZS5leGl0PVtbTlVMTF1dLCBwYXJlbnRfdGFza19mcmFtZS5yZWVudGVyPXt7MHhbMC1mXSt9fSwgcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT00LCBwYXJhbGxlbF9mdW5jdGlvbj0weHt7WzAtZl0rfX0sIGludm9rZXI9e3suKn19CisKKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9vbXB0L3BhcmFsbGVsL3NlcmlhbGl6ZWQuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9vbXB0L3BhcmFsbGVsL3NlcmlhbGl6ZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWI2NGRhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L29tcHQvcGFyYWxsZWwvc2VyaWFsaXplZC5jCkBAIC0wLDAgKzEsMjQgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4gfCBGaWxlQ2hlY2sgJXMKKy8vIFJFUVVJUkVTOiBvbXB0CisjaW5jbHVkZSAiY2FsbGJhY2suaCIKKworaW50IG1haW4oKQoreworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcygxKQorICB7CisgICAgcHJpbnRfaWRzKDApOworICAgIHByaW50X2lkcygxKTsKKyAgfQorCisgIC8vIENIRUNLOiAwOiBOVUxMX1BPSU5URVI9W1tOVUxMOi4qJF1dCisgIC8vIENIRUNLOiB7e159fVtbTUFTVEVSX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luOiBwYXJlbnRfdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEOlswLTldK11dLCBwYXJlbnRfdGFza19mcmFtZS5leGl0PVtbTlVMTF1dLCBwYXJlbnRfdGFza19mcmFtZS5yZWVudGVyPXt7MHhbMC1mXSt9fSwgcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT0xLCBwYXJhbGxlbF9mdW5jdGlvbj0weHt7WzAtZl0rfX0sIGludm9rZXI9W1tQQVJBTExFTF9JTlZPS0VSOi4rXV0KKworICAvLyBDSEVDSzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gQ0hFQ0s6IHt7Xn19W1tNQVNURVJfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIENIRUNLOiB7e159fVtbTUFTVEVSX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dCisgIC8vIENIRUNLOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIENIRUNLOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3IvYXV0by5jIGIvZmluYWwvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL2F1dG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2QyNmY1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL2F1dG8uYwpAQCAtMCwwICsxLDcgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4gfCAlc29ydC10aHJlYWRzIHwgRmlsZUNoZWNrICVTL2Jhc2UuaAorLy8gUkVRVUlSRVM6IG9tcHQKKy8vIEdDQyBkb2Vzbid0IGNhbGwgcnVudGltZSBmb3IgYXV0byA9IHN0YXRpYyBzY2hlZHVsZQorLy8gWEZBSUw6IGdjYworCisjZGVmaW5lIFNDSEVEVUxFIGF1dG8KKyNpbmNsdWRlICJiYXNlLmgiCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3IvYXV0b19zZXJpYWxpemVkLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3IvYXV0b19zZXJpYWxpemVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc1NjE2NgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9hdXRvX3NlcmlhbGl6ZWQuYwpAQCAtMCwwICsxLDcgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4gfCAlc29ydC10aHJlYWRzIHwgRmlsZUNoZWNrICVTL2Jhc2Vfc2VyaWFsaXplZC5oCisvLyBSRVFVSVJFUzogb21wdAorLy8gR0NDIGRvZXNuJ3QgY2FsbCBydW50aW1lIGZvciBhdXRvID0gc3RhdGljIHNjaGVkdWxlCisvLyBYRkFJTDogZ2NjCisKKyNkZWZpbmUgU0NIRURVTEUgYXV0bworI2luY2x1ZGUgImJhc2Vfc2VyaWFsaXplZC5oIgpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL2Jhc2UuaCBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM5ODg3OQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9iYXNlLmgKQEAgLTAsMCArMSwzNiBAQAorI2luY2x1ZGUgImNhbGxiYWNrLmgiCisjaW5jbHVkZSA8b21wLmg+CisKK2ludCBtYWluKCkKK3sKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIG51bV90aHJlYWRzKDQpIHNjaGVkdWxlKFNDSEVEVUxFKQorICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgIH0KKworICAvLyBDSEVDSzogMDogTlVMTF9QT0lOVEVSPVtbTlVMTDouKiRdXQorICAvLyBDSEVDSzoge3tefX1bW01BU1RFUl9JRDpbMC05XStdXTogb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbjogcGFyZW50X3Rhc2tfaWQ9e3tbMC05XSt9fSwgcGFyZW50X3Rhc2tfZnJhbWUuZXhpdD1bW05VTExdXSwgcGFyZW50X3Rhc2tfZnJhbWUucmVlbnRlcj17ezB4WzAtZl0rfX0sIHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHJlcXVlc3RlZF90ZWFtX3NpemU9NCwgcGFyYWxsZWxfZnVuY3Rpb249MHh7e1swLWZdK319LCBpbnZva2VyPXt7Lip9fQorCisgIC8vIENIRUNLOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2xvb3BfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgcGFyZW50X3Rhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIHdvcmtzaGFyZV9mdW5jdGlvbj0weHt7WzAtZl0rfX0KKyAgLy8gQ0hFQ0s6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9sb29wX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIENIRUNLOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIENIRUNLOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gQ0hFQ0s6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9sb29wX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHBhcmVudF90YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCB3b3Jrc2hhcmVfZnVuY3Rpb249MHh7e1swLWZdK319CisgIC8vIENIRUNLOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfbG9vcF9lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBDSEVDSzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBDSEVDSzoge3tefX1bW1RIUkVBRF9JRDpbMC05XStdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIENIRUNLOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfbG9vcF9iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCBwYXJlbnRfdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgd29ya3NoYXJlX2Z1bmN0aW9uPTB4e3tbMC1mXSt9fQorICAvLyBDSEVDSzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2xvb3BfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gQ0hFQ0s6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gQ0hFQ0s6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2xvb3BfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgcGFyZW50X3Rhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIHdvcmtzaGFyZV9mdW5jdGlvbj0weHt7WzAtZl0rfX0KKyAgLy8gQ0hFQ0s6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9sb29wX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIENIRUNLOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL2Jhc2Vfc2VyaWFsaXplZC5oIGIvZmluYWwvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL2Jhc2Vfc2VyaWFsaXplZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOGIyMjYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3IvYmFzZV9zZXJpYWxpemVkLmgKQEAgLTAsMCArMSwyMSBAQAorI2luY2x1ZGUgImNhbGxiYWNrLmgiCisjaW5jbHVkZSA8b21wLmg+CisKK2ludCBtYWluKCkKK3sKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIG51bV90aHJlYWRzKDEpIHNjaGVkdWxlKFNDSEVEVUxFKQorICBmb3IgKGkgPSAwOyBpIDwgMTsgaSsrKSB7CisgIH0KKworICAvLyBDSEVDSzogMDogTlVMTF9QT0lOVEVSPVtbTlVMTDouKiRdXQorICAvLyBDSEVDSzoge3tefX1bW01BU1RFUl9JRDpbMC05XStdXTogb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbjogcGFyZW50X3Rhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRDpbMC05XStdXSwgcGFyZW50X3Rhc2tfZnJhbWUuZXhpdD1bW05VTExdXSwgcGFyZW50X3Rhc2tfZnJhbWUucmVlbnRlcj17ezB4WzAtZl0rfX0sIHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHJlcXVlc3RlZF90ZWFtX3NpemU9MSwgcGFyYWxsZWxfZnVuY3Rpb249MHh7e1swLWZdK319LCBpbnZva2VyPXt7Lit9fQorCisgIC8vIENIRUNLOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2xvb3BfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgcGFyZW50X3Rhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIHdvcmtzaGFyZV9mdW5jdGlvbj0weHt7WzAtZl0rfX0KKyAgLy8gQ0hFQ0s6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9sb29wX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIENIRUNLOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL2R5bmFtaWMuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9keW5hbWljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E1YWUxMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9keW5hbWljLmMKQEAgLTAsMCArMSw1IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuIHwgJXNvcnQtdGhyZWFkcyB8IEZpbGVDaGVjayAlUy9iYXNlLmgKKy8vIFJFUVVJUkVTOiBvbXB0CisKKyNkZWZpbmUgU0NIRURVTEUgZHluYW1pYworI2luY2x1ZGUgImJhc2UuaCIKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9keW5hbWljX3NlcmlhbGl6ZWQuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9keW5hbWljX3NlcmlhbGl6ZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjgwOTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL2R5bmFtaWNfc2VyaWFsaXplZC5jCkBAIC0wLDAgKzEsNSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1biB8ICVzb3J0LXRocmVhZHMgfCBGaWxlQ2hlY2sgJVMvYmFzZV9zZXJpYWxpemVkLmgKKy8vIFJFUVVJUkVTOiBvbXB0CisKKyNkZWZpbmUgU0NIRURVTEUgZHluYW1pYworI2luY2x1ZGUgImJhc2Vfc2VyaWFsaXplZC5oIgpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL2d1aWRlZC5jIGIvZmluYWwvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL2d1aWRlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYmZmNGUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3IvZ3VpZGVkLmMKQEAgLTAsMCArMSw1IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuIHwgJXNvcnQtdGhyZWFkcyB8IEZpbGVDaGVjayAlUy9iYXNlLmgKKy8vIFJFUVVJUkVTOiBvbXB0CisKKyNkZWZpbmUgU0NIRURVTEUgZ3VpZGVkCisjaW5jbHVkZSAiYmFzZS5oIgpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL2d1aWRlZF9zZXJpYWxpemVkLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3IvZ3VpZGVkX3NlcmlhbGl6ZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjUwOTZkCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL2d1aWRlZF9zZXJpYWxpemVkLmMKQEAgLTAsMCArMSw1IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuIHwgJXNvcnQtdGhyZWFkcyB8IEZpbGVDaGVjayAlUy9iYXNlX3NlcmlhbGl6ZWQuaAorLy8gUkVRVUlSRVM6IG9tcHQKKworI2RlZmluZSBTQ0hFRFVMRSBndWlkZWQKKyNpbmNsdWRlICJiYXNlX3NlcmlhbGl6ZWQuaCIKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9ydW50aW1lLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3IvcnVudGltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZjE2MGYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3IvcnVudGltZS5jCkBAIC0wLDAgKzEsNSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1biB8ICVzb3J0LXRocmVhZHMgfCBGaWxlQ2hlY2sgJVMvYmFzZS5oCisvLyBSRVFVSVJFUzogb21wdAorCisjZGVmaW5lIFNDSEVEVUxFIHJ1bnRpbWUKKyNpbmNsdWRlICJiYXNlLmgiCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3IvcnVudGltZV9zZXJpYWxpemVkLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3IvcnVudGltZV9zZXJpYWxpemVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMxZDY3ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9ydW50aW1lX3NlcmlhbGl6ZWQuYwpAQCAtMCwwICsxLDUgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4gfCAlc29ydC10aHJlYWRzIHwgRmlsZUNoZWNrICVTL2Jhc2Vfc2VyaWFsaXplZC5oCisvLyBSRVFVSVJFUzogb21wdAorCisjZGVmaW5lIFNDSEVEVUxFIHJ1bnRpbWUKKyNpbmNsdWRlICJiYXNlX3NlcmlhbGl6ZWQuaCIKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9zdGF0aWMuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9zdGF0aWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDk5MDU5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL3N0YXRpYy5jCkBAIC0wLDAgKzEsNyBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1biB8ICVzb3J0LXRocmVhZHMgfCBGaWxlQ2hlY2sgJVMvYmFzZS5oCisvLyBSRVFVSVJFUzogb21wdAorLy8gR0NDIGRvZXNuJ3QgY2FsbCBydW50aW1lIGZvciBzdGF0aWMgc2NoZWR1bGUKKy8vIFhGQUlMOiBnY2MKKworI2RlZmluZSBTQ0hFRFVMRSBzdGF0aWMKKyNpbmNsdWRlICJiYXNlLmgiCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3Ivc3RhdGljX3NlcmlhbGl6ZWQuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9zdGF0aWNfc2VyaWFsaXplZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NjBkNDkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3Ivc3RhdGljX3NlcmlhbGl6ZWQuYwpAQCAtMCwwICsxLDcgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4gfCAlc29ydC10aHJlYWRzIHwgRmlsZUNoZWNrICVTL2Jhc2Vfc2VyaWFsaXplZC5oCisvLyBSRVFVSVJFUzogb21wdAorLy8gR0NDIGRvZXNuJ3QgY2FsbCBydW50aW1lIGZvciBzdGF0aWMgc2NoZWR1bGUKKy8vIFhGQUlMOiBnY2MKKworI2RlZmluZSBTQ0hFRFVMRSBzdGF0aWMKKyNpbmNsdWRlICJiYXNlX3NlcmlhbGl6ZWQuaCIKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfbmVzdGVkLmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX25lc3RlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNzgwODgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX25lc3RlZC5jCkBAIC0wLDAgKzEsNDYgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLyoKKyAqIFRlc3QgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIG5lc3RlZCBwYXJhbGxlbGlzbQorICogQnkgQ2h1bmh1YSBMaWFvLCBVbml2ZXJzaXR5IG9mIEhvdXN0b24KKyAqIE9jdC4gMjAwNQorICovCitpbnQgdGVzdF9vbXBfbmVzdGVkKCkKK3sKKyNpZmRlZiBfT1BFTk1QCisgIGlmIChvbXBfZ2V0X21heF90aHJlYWRzKCkgPiA0KQorICAgIG9tcF9zZXRfbnVtX3RocmVhZHMoNCk7CisjZW5kaWYKKworICBpbnQgY291bnRlciA9IDA7CisjaWZkZWYgX09QRU5NUAorICBvbXBfc2V0X25lc3RlZCgxKTsKKyNlbmRpZgorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZChjb3VudGVyKQorICB7CisgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICBjb3VudGVyKys7CisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgY291bnRlci0tOworICAgIH0KKyAgfQorICByZXR1cm4gKGNvdW50ZXIgIT0gMCk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9uZXN0ZWQoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfY29weWluLmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX2NvcHlpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMGY5YjcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX2NvcHlpbi5jCkBAIC0wLDAgKzEsNDcgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworc3RhdGljIGludCBzdW0xID0gNzg5OworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShzdW0xKQorCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfY29weWluKCkKK3sKKyAgaW50IHN1bSwgbnVtX3RocmVhZHM7CisgIGludCBrbm93bl9zdW07CisKKyAgc3VtID0gMDsKKyAgc3VtMSA9IDc7CisgIG51bV90aHJlYWRzID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBjb3B5aW4oc3VtMSkKKyAgeworICAgIC8qcHJpbnRmKCJzdW0xPSVkXG4iLHN1bTEpOyovCisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMTsgaSA8IDEwMDA7IGkrKykgeworICAgICAgc3VtMSA9IHN1bTEgKyBpOworICAgIH0gLyplbmQgb2YgZm9yKi8KKyAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgIHsKKyAgICAgIHN1bSA9IHN1bSArIHN1bTE7CisgICAgICBudW1fdGhyZWFkcysrOworICAgIH0gLyplbmQgb2YgY3JpdGljYWwqLworICB9IC8qIGVuZCBvZiBwYXJhbGxlbCovCisgIGtub3duX3N1bSA9ICg5OTkgKiAxMDAwKSAvIDIgKyA3ICogbnVtX3RocmVhZHM7CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9jb3B5aW4oKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfZGVmYXVsdC5jIGIvZmluYWwvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9kZWZhdWx0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE4ZTA5ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfZGVmYXVsdC5jCkBAIC0wLDAgKzEsNDMgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2RlZmF1bHQoKQoreworICBpbnQgaTsKKyAgaW50IHN1bTsKKyAgaW50IG15c3VtOworICBpbnQga25vd25fc3VtOworICBzdW0gPTA7CisgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMiA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZGVmYXVsdChzaGFyZWQpIHByaXZhdGUoaSkgcHJpdmF0ZShteXN1bSkKKyAgeworICAgIG15c3VtID0gMDsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKSB7CisgICAgICBteXN1bSA9IG15c3VtICsgaTsKKyAgICB9CisgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICB7CisgICAgICBzdW0gPSBzdW0gKyBteXN1bTsKKyAgICB9ICAgLyogZW5kIG9mIGNyaXRpY2FsICovCisgIH0gICAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAgaWYgKGtub3duX3N1bSAhPSBzdW0pIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIktOT1dOX1NVTSA9ICVkOyBTVU0gPSAlZFxuIiwga25vd25fc3VtLCBzdW0pOworICB9CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9kZWZhdWx0KCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX2ZpcnN0cHJpdmF0ZS5jIGIvZmluYWwvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmVlNzZjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDQ2IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8vc3RhdGljIGludCBzdW0xID0gNzg5OworCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZmlyc3Rwcml2YXRlKCkKK3sKKyAgaW50IHN1bSwgbnVtX3RocmVhZHMsc3VtMTsKKyAgaW50IGtub3duX3N1bTsKKworICBzdW0gPSAwOworICBzdW0xPTc7CisgIG51bV90aHJlYWRzID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGUoc3VtMSkKKyAgeworICAgIC8qcHJpbnRmKCJzdW0xPSVkXG4iLHN1bTEpOyovCisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMTsgaSA8IDEwMDA7IGkrKykgeworICAgICAgc3VtMSA9IHN1bTEgKyBpOworICAgIH0gLyplbmQgb2YgZm9yKi8KKyAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgIHsKKyAgICAgIHN1bSA9IHN1bSArIHN1bTE7CisgICAgICBudW1fdGhyZWFkcysrOworICAgIH0gLyplbmQgb2YgY3JpdGljYWwqLworICB9IC8qIGVuZCBvZiBwYXJhbGxlbCovCisgIGtub3duX3N1bSA9ICg5OTkgKiAxMDAwKSAvIDIgKyA3ICogbnVtX3RocmVhZHM7CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9maXJzdHByaXZhdGUoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfaWYuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmJmM2NkCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9pZi5jCkBAIC0wLDAgKzEsNDAgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2lmKCkKK3sKKyAgaW50IGk7CisgIGludCBzdW07CisgIGludCBrbm93bl9zdW07CisgIGludCBteXN1bTsKKyAgaW50IGNvbnRyb2w9MTsKKworICBzdW0gPTA7CisgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMiA7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUoaSkgaWYoY29udHJvbD09MCkKKyAgeworICAgIG15c3VtID0gMDsKKyAgICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKSB7CisgICAgICBteXN1bSA9IG15c3VtICsgaTsKKyAgICB9CisgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICB7CisgICAgICBzdW0gPSBzdW0gKyBteXN1bTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3BhcmFsbGVsX2lmKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX251bV90aHJlYWRzLmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX251bV90aHJlYWRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFmMWY5ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfbnVtX3RocmVhZHMuYwpAQCAtMCwwICsxLDQ2IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9udW1fdGhyZWFkcygpCit7CisgIGludCBudW1fZmFpbGVkOworICBpbnQgdGhyZWFkczsKKyAgaW50IG50aHJlYWRzOworICBpbnQgbWF4X3RocmVhZHMgPSAwOworCisgIG51bV9mYWlsZWQgPSAwOworCisgIC8qIGZpcnN0IHdlIGNoZWNrIGhvdyBtYW55IHRocmVhZHMgYXJlIGF2YWlsYWJsZSAqLworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgbWFzdGVyCisgICAgbWF4X3RocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzICgpOworICB9CisKKyAgLyogd2UgaW5jcmVhc2UgdGhlIG51bWJlciBvZiB0aHJlYWRzIGZyb20gb25lIHRvIG1heGltdW06Ki8KKyAgZm9yKHRocmVhZHMgPSAxOyB0aHJlYWRzIDw9IG1heF90aHJlYWRzOyB0aHJlYWRzKyspIHsKKyAgICBudGhyZWFkcyA9IDA7CisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgcmVkdWN0aW9uKCs6bnVtX2ZhaWxlZCkgbnVtX3RocmVhZHModGhyZWFkcykKKyAgICB7CisgICAgICBudW1fZmFpbGVkID0gbnVtX2ZhaWxlZCArICEodGhyZWFkcyA9PSBvbXBfZ2V0X251bV90aHJlYWRzKCkpOworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICBudGhyZWFkcyArPSAxOworICAgIH0KKyAgICBudW1fZmFpbGVkID0gbnVtX2ZhaWxlZCArICEobnRocmVhZHMgPT0gdGhyZWFkcyk7CisgIH0KKyAgcmV0dXJuICghbnVtX2ZhaWxlZCk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9udW1fdGhyZWFkcygpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9wcml2YXRlLmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzhlODA2Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9wcml2YXRlLmMKQEAgLTAsMCArMSw0NiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisvL3N0YXRpYyBpbnQgc3VtMSA9IDc4OTsKKworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3ByaXZhdGUoKQoreworICBpbnQgc3VtLCBudW1fdGhyZWFkcyxzdW0xOworICBpbnQga25vd25fc3VtOworCisgIHN1bSA9IDA7CisgIG51bV90aHJlYWRzID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKHN1bTEpCisgIHsKKyAgICBpbnQgaTsKKyAgICBzdW0xID0gNzsKKyAgICAvKnByaW50Zigic3VtMT0lZFxuIixzdW0xKTsqLworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDE7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgIHN1bTEgPSBzdW0xICsgaTsKKyAgICB9CisgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICB7CisgICAgICBzdW0gPSBzdW0gKyBzdW0xOworICAgICAgbnVtX3RocmVhZHMrKzsKKyAgICB9CisgIH0KKyAga25vd25fc3VtID0gKDk5OSAqIDEwMDApIC8gMiArIDcgKiBudW1fdGhyZWFkczsKKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3BhcmFsbGVsX3ByaXZhdGUoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfcmVkdWN0aW9uLmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX3JlZHVjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMDA5MzkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX3JlZHVjdGlvbi5jCkBAIC0wLDAgKzEsMjU0IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisjZGVmaW5lIERPVUJMRV9ESUdJVFMgMjAgICAgLyogZHReRE9VQkxFX0RJR0lUUyAqLworI2RlZmluZSBNQVhfRkFDVE9SIDEwCisjZGVmaW5lIEtOT1dOX1BST0RVQ1QgMzYyODgwMCAgLyogMTAhICovCisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24oKQoreworICBpbnQgc3VtOworICBpbnQga25vd25fc3VtOworICBkb3VibGUgZHN1bTsKKyAgZG91YmxlIGRrbm93bl9zdW07CisgIGRvdWJsZSBkdD0wLjU7IC8qIGJhc2Ugb2YgZ2VvbWV0cmljIHJvdyBmb3IgKyBhbmQgLSB0ZXN0Ki8KKyAgZG91YmxlIHJvdW5kaW5nX2Vycm9yPSAxLkUtOTsKKyAgaW50IGRpZmY7CisgIGRvdWJsZSBkZGlmZjsKKyAgaW50IHByb2R1Y3Q7CisgIGludCBrbm93bl9wcm9kdWN0OworICBpbnQgbG9naWNfYW5kOworICBpbnQgbG9naWNfb3I7CisgIGludCBiaXRfYW5kOworICBpbnQgYml0X29yOworICBpbnQgZXhjbHVzaXZfYml0X29yOworICBpbnQgbG9naWNzW0xPT1BDT1VOVF07CisgIGludCBpOworICBkb3VibGUgZHB0OworICBpbnQgcmVzdWx0OworCisgIHN1bSA9MDsKKyAgZHN1bT0wOworICBwcm9kdWN0PTE7CisgIGxvZ2ljX2FuZD0xOworICBsb2dpY19vcj0wOworICBiaXRfYW5kPTE7CisgIGJpdF9vcj0wOworICBleGNsdXNpdl9iaXRfb3I9MDsKKyAgcmVzdWx0PTA7CisgIGR0ID0gMS4vMy47CisgIGtub3duX3N1bSA9IChMT09QQ09VTlQqKExPT1BDT1VOVCsxKSkvMjsKKworICAvKiBUZXN0cyBmb3IgaW50ZWdlcnMgKi8KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oKzpzdW0pCisgIGZvciAoaT0xO2k8PUxPT1BDT1VOVDtpKyspIHsKKyAgICBzdW09c3VtK2k7CisgIH0KKworICBpZihrbm93bl9zdW0hPXN1bSkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkXG4iLHN1bSxrbm93bl9zdW0pOworICB9CisKKyAgZGlmZiA9IChMT09QQ09VTlQqKExPT1BDT1VOVCsxKSkvMjsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oLTpkaWZmKQorICBmb3IgKGk9MTtpPD1MT09QQ09VTlQ7KytpKSB7CisgICAgZGlmZj1kaWZmLWk7CisgIH0KKworICBpZihkaWZmICE9IDApIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gZGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgMC5cbiIsZGlmZik7CisgIH0KKworICAvKiBUZXN0cyBmb3IgZG91YmxlcyAqLworICBkc3VtPTA7CisgIGRwdD0xOworICBmb3IgKGk9MDtpPERPVUJMRV9ESUdJVFM7KytpKSB7CisgICAgZHB0Kj1kdDsKKyAgfQorICBka25vd25fc3VtID0gKDEtZHB0KS8oMS1kdCk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKCs6ZHN1bSkKKyAgZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkgeworICAgIGRzdW0gKz0gcG93KGR0LGkpOworICB9CisKKyAgaWYoIGZhYnMoZHN1bS1ka25vd25fc3VtKSA+IHJvdW5kaW5nX2Vycm9yICkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVmIGluc3RlYWQgb2YgJWYgKERpZmZlcmVuY2U6ICVFKVxuIixkc3VtLGRrbm93bl9zdW0sIGRzdW0tZGtub3duX3N1bSk7CisgIH0KKworICBkcHQ9MTsKKworICBmb3IgKGk9MDtpPERPVUJMRV9ESUdJVFM7KytpKSB7CisgICAgZHB0Kj1kdDsKKyAgfQorICBmcHJpbnRmKHN0ZGVyciwiXG4iKTsKKyAgZGRpZmYgPSAoMS1kcHQpLygxLWR0KTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oLTpkZGlmZikKKyAgZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkgeworICAgIGRkaWZmIC09IHBvdyhkdCxpKTsKKyAgfQorICBpZiggZmFicyhkZGlmZikgPiByb3VuZGluZ19lcnJvcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSBpbnN0ZWFkIG9mIDAuMFxuIixkZGlmZik7CisgIH0KKworICAvKiBUZXN0cyBmb3IgcHJvZHVjdCBvZiBpbnRlZ2VycyAqLworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIHJlZHVjdGlvbigqOnByb2R1Y3QpCisgIGZvcihpPTE7aTw9TUFYX0ZBQ1RPUjtpKyspIHsKKyAgICBwcm9kdWN0ICo9IGk7CisgIH0KKworICBrbm93bl9wcm9kdWN0ID0gS05PV05fUFJPRFVDVDsKKyAgaWYoa25vd25fcHJvZHVjdCAhPSBwcm9kdWN0KSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIFByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkXG5cbiIscHJvZHVjdCxrbm93bl9wcm9kdWN0KTsKKyAgfQorCisgIC8qIFRlc3RzIGZvciBsb2dpY2FsIGFuZCAqLworICBmb3IoaT0wO2k8TE9PUENPVU5UO2krKykgeworICAgIGxvZ2ljc1tpXT0xOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oJiY6bG9naWNfYW5kKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKyAgfQorICBpZighbG9naWNfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDEuXG4iKTsKKyAgfQorCisgIGxvZ2ljX2FuZCA9IDE7CisgIGxvZ2ljc1tMT09QQ09VTlQvMl09MDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIHJlZHVjdGlvbigmJjpsb2dpY19hbmQpCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgbG9naWNfYW5kID0gbG9naWNfYW5kICYmIGxvZ2ljc1tpXTsKKyAgfQorICBpZihsb2dpY19hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMi5cbiIpOworICB9CisKKyAgLyogVGVzdHMgZm9yIGxvZ2ljYWwgb3IgKi8KKyAgZm9yKGk9MDtpPExPT1BDT1VOVDtpKyspIHsKKyAgICBsb2dpY3NbaV09MDsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKHx8OmxvZ2ljX29yKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGxvZ2ljX29yID0gbG9naWNfb3IgfHwgbG9naWNzW2ldOworICB9CisgIGlmKGxvZ2ljX29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMS5cbiIpOworICB9CisgIGxvZ2ljX29yID0gMDsKKyAgbG9naWNzW0xPT1BDT1VOVC8yXT0xOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKHx8OmxvZ2ljX29yKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGxvZ2ljX29yID0gbG9naWNfb3IgfHwgbG9naWNzW2ldOworICB9CisgIGlmKCFsb2dpY19vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDIuXG4iKTsKKyAgfQorCisgIC8qIFRlc3RzIGZvciBiaXR3aXNlIGFuZCAqLworICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGxvZ2ljc1tpXT0xOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oJjpiaXRfYW5kKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGJpdF9hbmQgPSAoYml0X2FuZCAmIGxvZ2ljc1tpXSk7CisgIH0KKyAgaWYoIWJpdF9hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDEuXG4iKTsKKyAgfQorCisgIGJpdF9hbmQgPSAxOworICBsb2dpY3NbTE9PUENPVU5ULzJdPTA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oJjpiaXRfYW5kKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworICB9CisgIGlmKGJpdF9hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDIuXG4iKTsKKyAgfQorCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKSB7CisgICAgbG9naWNzW2ldPTA7CisgIH0KKworICAvKiBUZXN0cyBmb3IgYml0d2lzZSBvciAqLworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIHJlZHVjdGlvbih8OmJpdF9vcikKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBiaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisgIH0KKyAgaWYoYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDFcbiIpOworICB9CisgIGJpdF9vciA9IDA7CisgIGxvZ2ljc1tMT09QQ09VTlQvMl09MTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIHJlZHVjdGlvbih8OmJpdF9vcikKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBiaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisgIH0KKyAgaWYoIWJpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBCSVQgT1IgcGFydCAyXG4iKTsKKyAgfQorCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKSB7CisgICAgbG9naWNzW2ldPTA7CisgIH0KKworICAvKiBUZXN0cyBmb3IgYml0d2lzZSB4b3IgKi8KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICB9CisgIGlmKGV4Y2x1c2l2X2JpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAxXG4iKTsKKyAgfQorCisgIGV4Y2x1c2l2X2JpdF9vciA9IDA7CisgIGxvZ2ljc1tMT09QQ09VTlQvMl09MTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIHJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcikKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisgIH0KKyAgaWYoIWV4Y2x1c2l2X2JpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAyXG4iKTsKKyAgfQorCisgIC8qcHJpbnRmKCJcblJlc3VsdDolZFxuIixyZXN1bHQpOyovCisgIHJldHVybiAocmVzdWx0PT0wKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3BhcmFsbGVsX3JlZHVjdGlvbigpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9zaGFyZWQuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfc2hhcmVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE0NmNhNgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfc2hhcmVkLmMKQEAgLTAsMCArMSw0NiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfc2hhcmVkKCkKK3sKKyAgaW50IGk7CisgIGludCBzdW07CisgIGludCBrbm93bl9zdW07CisKKyAgc3VtID0gMDsKKyAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyIDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKGkpIHNoYXJlZChzdW0pCisgIHsKKworICAgIGludCBteXN1bSA9IDA7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykgeworICAgICAgbXlzdW0gPSBteXN1bSArIGk7CisgICAgfQorICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgeworICAgICAgc3VtID0gc3VtICsgbXlzdW07CisgICAgfQorCisKKyAgfQorICBpZiAoa25vd25fc3VtICE9IHN1bSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiS05PV05fU1VNID0gJWQ7IFNVTSA9ICVkXG4iLCBrbm93bl9zdW0sIHN1bSk7CisgIH0KKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3BhcmFsbGVsX3NoYXJlZCgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvYnVnX25lc3RlZF9wcm94eV90YXNrLmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9idWdfbmVzdGVkX3Byb3h5X3Rhc2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzAwODIyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvYnVnX25lc3RlZF9wcm94eV90YXNrLmMKQEAgLTAsMCArMSwxMzEgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlIC1scHRocmVhZCAmJiAlbGlib21wLXJ1bgorLy8gVGhlIHJ1bnRpbWUgY3VycmVudGx5IGRvZXMgbm90IGdldCBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGZyb20gR0NDLgorLy8gVU5TVVBQT1JURUQ6IGdjYworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvbXAuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKKy8qCisgV2l0aCB0YXNrIGRlcGVuZGVuY2llcyBvbmUgY2FuIGdlbmVyYXRlIHByb3h5IHRhc2tzIGZyb20gYW4gZXhwbGljaXQgdGFzaworIGJlaW5nIGV4ZWN1dGVkIGJ5IGEgc2VyaWFsIHRhc2sgdGVhbS4gVGhlIE9wZW5NUCBydW50aW1lIGxpYnJhcnkgZGlkbid0CisgZXhwZWN0IHRoYXQgYW5kIHRyaWVzIHRvIGZyZWUgdGhlIGV4cGxpY2l0IHRhc2sgdGhhdCBpcyB0aGUgcGFyZW50IG9mIHRoZQorIHByb3h5IHRhc2sgc3RpbGwgd29ya2luZyBpbiBiYWNrZ3JvdW5kLiBJdCB0aGVyZWZvcmUgaGFzIGluY29tcGxldGUgY2hpbGRyZW4KKyB3aGljaCB0cmlnZ2VycyBhIGRlYnVnZ2luZyBhc3NlcnRpb24uCisqLworCisvLyBDb21waWxlci1nZW5lcmF0ZWQgY29kZSAoZW11bGF0aW9uKQordHlwZWRlZiBsb25nIGttcF9pbnRwdHJfdDsKK3R5cGVkZWYgaW50IGttcF9pbnQzMjsKKwordHlwZWRlZiBjaGFyIGJvb2w7CisKK3R5cGVkZWYgc3RydWN0IGlkZW50IHsKKyAgICBrbXBfaW50MzIgcmVzZXJ2ZWRfMTsgICAvKio8ICBtaWdodCBiZSB1c2VkIGluIEZvcnRyYW47IHNlZSBhYm92ZSAgKi8KKyAgICBrbXBfaW50MzIgZmxhZ3M7ICAgICAgICAvKio8ICBhbHNvIGYuZmxhZ3M7IEtNUF9JREVOVF94eHggZmxhZ3M7IEtNUF9JREVOVF9LTVBDIGlkZW50aWZpZXMgdGhpcyB1bmlvbiBtZW1iZXIgICovCisgICAga21wX2ludDMyIHJlc2VydmVkXzI7ICAgLyoqPCAgbm90IHJlYWxseSB1c2VkIGluIEZvcnRyYW4gYW55IG1vcmU7IHNlZSBhYm92ZSAqLworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgYnV0IGN1cnJlbnRseSB1c2VkIGZvciBzdG9yaW5nIHJlZ2lvbi1zcGVjaWZpYyBJVFQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgY29udGV4dHVhbCBpbmZvcm1hdGlvbi4gKi8KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAga21wX2ludDMyIHJlc2VydmVkXzM7ICAgLyoqPCBzb3VyY2VbNF0gaW4gRm9ydHJhbiwgZG8gbm90IHVzZSBmb3IgQysrICAqLworICAgIGNoYXIgY29uc3QgKnBzb3VyY2U7ICAgIC8qKjwgU3RyaW5nIGRlc2NyaWJpbmcgdGhlIHNvdXJjZSBsb2NhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgc3RyaW5nIGlzIGNvbXBvc2VkIG9mIHNlbWktY29sb24gc2VwYXJhdGVkIGZpZWxkcyB3aGljaCBkZXNjcmliZSB0aGUgc291cmNlIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZ1bmN0aW9uIGFuZCBhIHBhaXIgb2YgbGluZSBudW1iZXJzIHRoYXQgZGVsaW1pdCB0aGUgY29uc3RydWN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBpZGVudF90OworCit0eXBlZGVmIHN0cnVjdCBrbXBfZGVwZW5kX2luZm8geworICAgICBrbXBfaW50cHRyX3QgICAgICAgICAgICAgICBiYXNlX2FkZHI7CisgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgIGxlbjsKKyAgICAgc3RydWN0IHsKKyAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgaW46MTsKKyAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgb3V0OjE7CisgICAgIH0gZmxhZ3M7Cit9IGttcF9kZXBlbmRfaW5mb190OworCitzdHJ1Y3Qga21wX3Rhc2s7Cit0eXBlZGVmIGttcF9pbnQzMiAoKiBrbXBfcm91dGluZV9lbnRyeV90KSgga21wX2ludDMyLCBzdHJ1Y3Qga21wX3Rhc2sgKiApOworCit0eXBlZGVmIHN0cnVjdCBrbXBfdGFzayB7ICAgICAgICAgICAgICAgICAgIC8qIEdFSDogU2hvdWxkbid0IHRoaXMgYmUgYWxpZ25lZCBzb21laG93PyAqLworICAgIHZvaWQgKiAgICAgICAgICAgICAgc2hhcmVkczsgICAgICAgICAgICAvKio8IHBvaW50ZXIgdG8gYmxvY2sgb2YgcG9pbnRlcnMgdG8gc2hhcmVkIHZhcnMgICAqLworICAgIGttcF9yb3V0aW5lX2VudHJ5X3Qgcm91dGluZTsgICAgICAgICAgICAvKio8IHBvaW50ZXIgdG8gcm91dGluZSB0byBjYWxsIGZvciBleGVjdXRpbmcgdGFzayAqLworICAgIGttcF9pbnQzMiAgICAgICAgICAgcGFydF9pZDsgICAgICAgICAgICAvKio8IHBhcnQgaWQgZm9yIHRoZSB0YXNrICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBrbXBfdGFza190OworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCitrbXBfaW50MzIgIF9fa21wY19nbG9iYWxfdGhyZWFkX251bSAgKCBpZGVudF90ICogKTsKK2ttcF90YXNrX3QqCitfX2ttcGNfb21wX3Rhc2tfYWxsb2MoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplb2Zfa21wX3Rhc2tfdCwgc2l6ZV90IHNpemVvZl9zaGFyZWRzLAorICAgICAgICAgICAgICAgICAgICAgICBrbXBfcm91dGluZV9lbnRyeV90IHRhc2tfZW50cnkgKTsKK3ZvaWQgX19rbXBjX3Byb3h5X3Rhc2tfY29tcGxldGVkX29vbyAoIGttcF90YXNrX3QgKnB0YXNrICk7CitrbXBfaW50MzIgX19rbXBjX29tcF90YXNrX3dpdGhfZGVwcyAoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogbmV3X3Rhc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBuZGVwcywga21wX2RlcGVuZF9pbmZvX3QgKmRlcF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbmRlcHNfbm9hbGlhcywga21wX2RlcGVuZF9pbmZvX3QgKm5vYWxpYXNfZGVwX2xpc3QgKTsKK2ttcF9pbnQzMgorX19rbXBjX29tcF90YXNrKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIG5ld190YXNrICk7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCit2b2lkICp0YXJnZXQodm9pZCAqdGFzaykKK3sKKyAgICBteV9zbGVlcCggMC4xICk7CisgICAgX19rbXBjX3Byb3h5X3Rhc2tfY29tcGxldGVkX29vbygoa21wX3Rhc2tfdCopIHRhc2spOworICAgIHJldHVybiBOVUxMOworfQorCitwdGhyZWFkX3QgdGFyZ2V0X3RocmVhZDsKKworLy8gVXNlcidzIGNvZGUKK2ludCB0YXNrX2VudHJ5KGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICp0YXNrKQoreworICAgIHB0aHJlYWRfY3JlYXRlKCZ0YXJnZXRfdGhyZWFkLCBOVUxMLCAmdGFyZ2V0LCB0YXNrKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IG1haW4oKQoreworICAgIGludCBkZXA7CisKKyNwcmFnbWEgb21wIHRhc2tncm91cAoreworLyoKKyAqICBDb3JyZXNwb25kcyB0bzoKKyAgICAjcHJhZ21hIG9tcCB0YXJnZXQgbm93YWl0IGRlcGVuZChvdXQ6IGRlcCkKKyAgICB7CisgICAgICAgIG15X3NsZWVwKCAwLjEgKTsKKyAgICB9CisqLworICAgIGttcF9kZXBlbmRfaW5mb190IGRlcF9pbmZvOworICAgIGRlcF9pbmZvLmJhc2VfYWRkciA9IChsb25nKSAmZGVwOworICAgIGRlcF9pbmZvLmxlbiA9IHNpemVvZihpbnQpOworICAgIC8vIG91dCA9IGlub3V0IHBlciBzcGVjIGFuZCBydW50aW1lIGV4cGVjdHMgdGhpcworICAgIGRlcF9pbmZvLmZsYWdzLmluID0gMTsKKyAgICBkZXBfaW5mby5mbGFncy5vdXQgPSAxOworCisgICAga21wX2ludDMyIGd0aWQgPSBfX2ttcGNfZ2xvYmFsX3RocmVhZF9udW0oTlVMTCk7CisgICAga21wX3Rhc2tfdCAqcHJveHlfdGFzayA9IF9fa21wY19vbXBfdGFza19hbGxvYyhOVUxMLGd0aWQsMTcsc2l6ZW9mKGttcF90YXNrX3QpLDAsJnRhc2tfZW50cnkpOworICAgIF9fa21wY19vbXBfdGFza193aXRoX2RlcHMoTlVMTCxndGlkLHByb3h5X3Rhc2ssMSwmZGVwX2luZm8sMCxOVUxMKTsKKworICAgICNwcmFnbWEgb21wIHRhc2sgZGVwZW5kKGluOiBkZXApCisgICAgeworLyoKKyAqICAgICAgQ29ycmVzcG9uZHMgdG86CisgICAgICAgICNwcmFnbWEgb21wIHRhcmdldCBub3dhaXQKKyAgICAgICAgeworICAgICAgICAgICAgbXlfc2xlZXAoIDAuMSApOworICAgICAgICB9CisqLworICAgICAgICBrbXBfdGFza190ICpuZXN0ZWRfcHJveHlfdGFzayA9IF9fa21wY19vbXBfdGFza19hbGxvYyhOVUxMLGd0aWQsMTcsc2l6ZW9mKGttcF90YXNrX3QpLDAsJnRhc2tfZW50cnkpOworICAgICAgICBfX2ttcGNfb21wX3Rhc2soTlVMTCxndGlkLG5lc3RlZF9wcm94eV90YXNrKTsKKyAgICB9Cit9CisKKyAgICAvLyBvbmx5IGNoZWNrIHRoYXQgaXQgZGlkbid0IGNyYXNoCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9idWdfcHJveHlfdGFza19kZXBfd2FpdGluZy5jIGIvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvYnVnX3Byb3h5X3Rhc2tfZGVwX3dhaXRpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmRkODk1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvYnVnX3Byb3h5X3Rhc2tfZGVwX3dhaXRpbmcuYwpAQCAtMCwwICsxLDEzNCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUgLWxwdGhyZWFkICYmICVsaWJvbXAtcnVuCisvLyBUaGUgcnVudGltZSBjdXJyZW50bHkgZG9lcyBub3QgZ2V0IGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gZnJvbSBHQ0MuCisvLyBVTlNVUFBPUlRFRDogZ2NjCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9tcC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworLyoKKyBBbiBleHBsaWNpdCB0YXNrIGNhbiBoYXZlIGEgZGVwZW5kZW5jeSBvbiBhIHRhcmdldCB0YXNrLiBJZiBpdCBpcyBub3QKKyBkaXJlY3RseSBzYXRpc2ZpZWQsIHRoZSBydW50aW1lIHNob3VsZCBub3Qgd2FpdCBidXQgcmVzdW1lIGV4ZWN1dGlvbi4KKyovCisKKy8vIENvbXBpbGVyLWdlbmVyYXRlZCBjb2RlIChlbXVsYXRpb24pCit0eXBlZGVmIGxvbmcga21wX2ludHB0cl90OwordHlwZWRlZiBpbnQga21wX2ludDMyOworCit0eXBlZGVmIGNoYXIgYm9vbDsKKwordHlwZWRlZiBzdHJ1Y3QgaWRlbnQgeworICAgIGttcF9pbnQzMiByZXNlcnZlZF8xOyAgIC8qKjwgIG1pZ2h0IGJlIHVzZWQgaW4gRm9ydHJhbjsgc2VlIGFib3ZlICAqLworICAgIGttcF9pbnQzMiBmbGFnczsgICAgICAgIC8qKjwgIGFsc28gZi5mbGFnczsgS01QX0lERU5UX3h4eCBmbGFnczsgS01QX0lERU5UX0tNUEMgaWRlbnRpZmllcyB0aGlzIHVuaW9uIG1lbWJlciAgKi8KKyAgICBrbXBfaW50MzIgcmVzZXJ2ZWRfMjsgICAvKio8ICBub3QgcmVhbGx5IHVzZWQgaW4gRm9ydHJhbiBhbnkgbW9yZTsgc2VlIGFib3ZlICovCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBidXQgY3VycmVudGx5IHVzZWQgZm9yIHN0b3JpbmcgcmVnaW9uLXNwZWNpZmljIElUVCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBjb250ZXh0dWFsIGluZm9ybWF0aW9uLiAqLworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICBrbXBfaW50MzIgcmVzZXJ2ZWRfMzsgICAvKio8IHNvdXJjZVs0XSBpbiBGb3J0cmFuLCBkbyBub3QgdXNlIGZvciBDKysgICovCisgICAgY2hhciBjb25zdCAqcHNvdXJjZTsgICAgLyoqPCBTdHJpbmcgZGVzY3JpYmluZyB0aGUgc291cmNlIGxvY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBzdHJpbmcgaXMgY29tcG9zZWQgb2Ygc2VtaS1jb2xvbiBzZXBhcmF0ZWQgZmllbGRzIHdoaWNoIGRlc2NyaWJlIHRoZSBzb3VyY2UgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZnVuY3Rpb24gYW5kIGEgcGFpciBvZiBsaW5lIG51bWJlcnMgdGhhdCBkZWxpbWl0IHRoZSBjb25zdHJ1Y3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9IGlkZW50X3Q7CisKK3R5cGVkZWYgc3RydWN0IGttcF9kZXBlbmRfaW5mbyB7CisgICAgIGttcF9pbnRwdHJfdCAgICAgICAgICAgICAgIGJhc2VfYWRkcjsKKyAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgbGVuOworICAgICBzdHJ1Y3QgeworICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICBpbjoxOworICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICBvdXQ6MTsKKyAgICAgfSBmbGFnczsKK30ga21wX2RlcGVuZF9pbmZvX3Q7CisKK3N0cnVjdCBrbXBfdGFzazsKK3R5cGVkZWYga21wX2ludDMyICgqIGttcF9yb3V0aW5lX2VudHJ5X3QpKCBrbXBfaW50MzIsIHN0cnVjdCBrbXBfdGFzayAqICk7CisKK3R5cGVkZWYgc3RydWN0IGttcF90YXNrIHsgICAgICAgICAgICAgICAgICAgLyogR0VIOiBTaG91bGRuJ3QgdGhpcyBiZSBhbGlnbmVkIHNvbWVob3c/ICovCisgICAgdm9pZCAqICAgICAgICAgICAgICBzaGFyZWRzOyAgICAgICAgICAgIC8qKjwgcG9pbnRlciB0byBibG9jayBvZiBwb2ludGVycyB0byBzaGFyZWQgdmFycyAgICovCisgICAga21wX3JvdXRpbmVfZW50cnlfdCByb3V0aW5lOyAgICAgICAgICAgIC8qKjwgcG9pbnRlciB0byByb3V0aW5lIHRvIGNhbGwgZm9yIGV4ZWN1dGluZyB0YXNrICovCisgICAga21wX2ludDMyICAgICAgICAgICBwYXJ0X2lkOyAgICAgICAgICAgIC8qKjwgcGFydCBpZCBmb3IgdGhlIHRhc2sgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9IGttcF90YXNrX3Q7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK2ttcF9pbnQzMiAgX19rbXBjX2dsb2JhbF90aHJlYWRfbnVtICAoIGlkZW50X3QgKiApOwora21wX3Rhc2tfdCoKK19fa21wY19vbXBfdGFza19hbGxvYyggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemVvZl9rbXBfdGFza190LCBzaXplX3Qgc2l6ZW9mX3NoYXJlZHMsCisgICAgICAgICAgICAgICAgICAgICAgIGttcF9yb3V0aW5lX2VudHJ5X3QgdGFza19lbnRyeSApOwordm9pZCBfX2ttcGNfcHJveHlfdGFza19jb21wbGV0ZWRfb29vICgga21wX3Rhc2tfdCAqcHRhc2sgKTsKK2ttcF9pbnQzMiBfX2ttcGNfb21wX3Rhc2tfd2l0aF9kZXBzICggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiBuZXdfdGFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIG5kZXBzLCBrbXBfZGVwZW5kX2luZm9fdCAqZGVwX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBuZGVwc19ub2FsaWFzLCBrbXBfZGVwZW5kX2luZm9fdCAqbm9hbGlhc19kZXBfbGlzdCApOwora21wX2ludDMyCitfX2ttcGNfb21wX3Rhc2soIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogbmV3X3Rhc2sgKTsKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKK3ZvaWQgKnRhcmdldCh2b2lkICp0YXNrKQoreworICAgIG15X3NsZWVwKCAwLjEgKTsKKyAgICBfX2ttcGNfcHJveHlfdGFza19jb21wbGV0ZWRfb29vKChrbXBfdGFza190KikgdGFzayk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3B0aHJlYWRfdCB0YXJnZXRfdGhyZWFkOworCisvLyBVc2VyJ3MgY29kZQoraW50IHRhc2tfZW50cnkoa21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKnRhc2spCit7CisgICAgcHRocmVhZF9jcmVhdGUoJnRhcmdldF90aHJlYWQsIE5VTEwsICZ0YXJnZXQsIHRhc2spOworICAgIHJldHVybiAwOworfQorCitpbnQgbWFpbigpCit7CisgICAgaW50IGRlcDsKKworLyoKKyAqICBDb3JyZXNwb25kcyB0bzoKKyAgICAjcHJhZ21hIG9tcCB0YXJnZXQgbm93YWl0IGRlcGVuZChvdXQ6IGRlcCkKKyAgICB7CisgICAgICAgIG15X3NsZWVwKCAwLjEgKTsKKyAgICB9CisqLworICAgIGttcF9kZXBlbmRfaW5mb190IGRlcF9pbmZvOworICAgIGRlcF9pbmZvLmJhc2VfYWRkciA9IChsb25nKSAmZGVwOworICAgIGRlcF9pbmZvLmxlbiA9IHNpemVvZihpbnQpOworICAgIC8vIG91dCA9IGlub3V0IHBlciBzcGVjIGFuZCBydW50aW1lIGV4cGVjdHMgdGhpcworICAgIGRlcF9pbmZvLmZsYWdzLmluID0gMTsKKyAgICBkZXBfaW5mby5mbGFncy5vdXQgPSAxOworCisgICAga21wX2ludDMyIGd0aWQgPSBfX2ttcGNfZ2xvYmFsX3RocmVhZF9udW0oTlVMTCk7CisgICAga21wX3Rhc2tfdCAqcHJveHlfdGFzayA9IF9fa21wY19vbXBfdGFza19hbGxvYyhOVUxMLGd0aWQsMTcsc2l6ZW9mKGttcF90YXNrX3QpLDAsJnRhc2tfZW50cnkpOworICAgIF9fa21wY19vbXBfdGFza193aXRoX2RlcHMoTlVMTCxndGlkLHByb3h5X3Rhc2ssMSwmZGVwX2luZm8sMCxOVUxMKTsKKworICAgIGludCBmaXJzdF90YXNrX2ZpbmlzaGVkID0gMDsKKyAgICAjcHJhZ21hIG9tcCB0YXNrIHNoYXJlZChmaXJzdF90YXNrX2ZpbmlzaGVkKSBkZXBlbmQoaW5vdXQ6IGRlcCkKKyAgICB7CisgICAgICAgIGZpcnN0X3Rhc2tfZmluaXNoZWQgPSAxOworICAgIH0KKworICAgIGludCBzZWNvbmRfdGFza19maW5pc2hlZCA9IDA7CisgICAgI3ByYWdtYSBvbXAgdGFzayBzaGFyZWQoc2Vjb25kX3Rhc2tfZmluaXNoZWQpIGRlcGVuZChpbjogZGVwKQorICAgIHsKKyAgICAgICAgc2Vjb25kX3Rhc2tfZmluaXNoZWQgPSAxOworICAgIH0KKworICAgIC8vIGNoZWNrIHRoYXQgZXhlY3V0aW9uIGhhcyBiZWVuIHJlc3VtZWQgYW5kIHRoZSBydW50aW1lIGhhcyBub3Qgd2FpdGVkCisgICAgLy8gZm9yIHRoZSBkZXBlbmRlbmNpZXMgdG8gYmUgc2F0aXNmaWVkLgorICAgIGludCBlcnJvciA9IChmaXJzdF90YXNrX2ZpbmlzaGVkID09IDEpOworICAgIGVycm9yICs9IChzZWNvbmRfdGFza19maW5pc2hlZCA9PSAxKTsKKworICAgICNwcmFnbWEgb21wIHRhc2t3YWl0CisKKyAgICAvLyBieSBub3cgYWxsIHRhc2tzIHNob3VsZCBoYXZlIGZpbmlzaGVkCisgICAgZXJyb3IgKz0gKGZpcnN0X3Rhc2tfZmluaXNoZWQgIT0gMSk7CisgICAgZXJyb3IgKz0gKHNlY29uZF90YXNrX2ZpbmlzaGVkICE9IDEpOworCisgICAgcmV0dXJuIGVycm9yOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvYnVnX3NlcmlhbF90YXNrZ3JvdXAuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL2J1Z19zZXJpYWxfdGFza2dyb3VwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUwYmM5MAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL2J1Z19zZXJpYWxfdGFza2dyb3VwLmMKQEAgLTAsMCArMSwxNiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorCisvKgorIEdDQyBmYWlsZWQgdGhpcyB0ZXN0IGJlY2F1c2UgX19rbXBfZ2V0X2d0aWQoKSBpbnN0ZWFkIG9mIF9fa21wX2VudHJ5X2d0aWQoKQorIHdhcyBjYWxsZWQgaW4geGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9UQVNLR1JPVVBfU1RBUlQpKHZvaWQpLgorIF9fa21wX2VudHJ5X2d0aWQoKSB3aWxsIGluaXRpYWxpemUgdGhlIHJ1bnRpbWUgaWYgbm90IHlldCBkb25lIHdoaWNoIGRvZXMgbm90CisgaGFwcGVuIHdpdGggX19rbXBfZ2V0X2d0aWQoKS4KKyAqLworCitpbnQgbWFpbigpCit7CisgICAgI3ByYWdtYSBvbXAgdGFza2dyb3VwCisgICAgeyB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL2ttcF90YXNrX3JlZHVjdGlvbl9uZXN0LmNwcCBiL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL2ttcF90YXNrX3JlZHVjdGlvbl9uZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTRkZTU5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcva21wX3Rhc2tfcmVkdWN0aW9uX25lc3QuY3BwCkBAIC0wLDAgKzEsMzc0IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisvLyBSVU46ICVsaWJvbXAtY29tcGlsZSAtREZMRz0xICYmICVsaWJvbXAtcnVuCisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8b21wLmg+CisKKy8vIFRvdGFsIG51bWJlciBvZiBsb29wIGl0ZXJhdGlvbnMsIHNob3VsZCBiZSBtdWx0aXBsZSBvZiBUIGZvciB0aGlzIHRlc3QKKyNkZWZpbmUgTiAxMDAwMAorCisvLyBGbGFnIHRvIHJlcXVlc3QgbGF6eSAoMSkgb3IgZWFnZXIgKDApIGFsbG9jYXRpb24gb2YgcmVkdWN0aW9uIG9iamVjdHMKKyNpZm5kZWYgRkxHCisjZGVmaW5lIEZMRyAwCisjZW5kaWYKKworLyoKKyAgLy8gaW5pdGlhbCB1c2VyJ3MgY29kZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHBzZXVkbyBjb2RlIG9mIHRoZSB0ZXN0CisgICNwcmFnbWEgb21wIHRhc2tncm91cCB0YXNrX3JlZHVjdGlvbigrOmksaikgdGFza19yZWR1Y3Rpb24oKjp4KQorICB7CisgICAgZm9yKCBpbnQgbCA9IDA7IGwgPCBOOyArK2wgKSB7CisgICAgICAjcHJhZ21hIG9tcCB0YXNrIGZpcnN0cHJpdmF0ZShsKSBpbl9yZWR1Y3Rpb24oKzppKSBpbl9yZWR1Y3Rpb24oKjp4KQorICAgICAgeworICAgICAgICBpICs9IGw7CisgICAgICAgIGlmKCBsJTIgKQorICAgICAgICAgIHggKj0gMS4wIC8gKGwgKyAxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHggKj0gKGwgKyAxKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAjcHJhZ21hIG9tcCB0YXNrZ3JvdXAgdGFza19yZWR1Y3Rpb24oLTppLGspIHRhc2tfcmVkdWN0aW9uKCs6eSkKKyAgICB7CisgICAgICBmb3IoIGludCBsID0gMDsgbCA8IE47ICsrbCApIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgdGFzayBmaXJzdHByaXZhdGUobCkgaW5fcmVkdWN0aW9uKCs6aix5KSBcCisgICAgICAgICAgICBpbl9yZWR1Y3Rpb24oKjp4KSBpbl9yZWR1Y3Rpb24oLTprKQorICAgICAgICB7CisgICAgICAgICAgaiArPSBsOworICAgICAgICAgIGsgLT0gbDsKKyAgICAgICAgICB5ICs9IChkb3VibGUpbDsKKyAgICAgICAgICBpZiggbCUyICkKKyAgICAgICAgICAgIHggKj0gMS4wIC8gKGwgKyAxKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB4ICo9IChsICsgMSk7CisgICAgICAgIH0KKyAgICAgICAgI3ByYWdtYSBvbXAgdGFzayBmaXJzdHByaXZhdGUobCkgaW5fcmVkdWN0aW9uKCs6eSkgaW5fcmVkdWN0aW9uKC06aSxrKQorICAgICAgICB7CisgICAgICAgICAgaSAtPSBsOworICAgICAgICAgIGsgLT0gbDsKKyAgICAgICAgICB5ICs9IChkb3VibGUpbDsKKyAgICAgICAgfQorICAgICAgICAjcHJhZ21hIG9tcCB0YXNrIGZpcnN0cHJpdmF0ZShsKSBpbl9yZWR1Y3Rpb24oKzpqKSBpbl9yZWR1Y3Rpb24oKjp4KQorICAgICAgICB7CisgICAgICAgICAgaiArPSBsOworICAgICAgICAgIGlmKCBsJTIgKQorICAgICAgICAgICAgeCAqPSAxLjAgLyAobCArIDEpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHggKj0gKGwgKyAxKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gLy8gaW5uZXIgcmVkdWN0aW9uCisKKyAgICBmb3IoIGludCBsID0gMDsgbCA8IE47ICsrbCApIHsKKyAgICAgICNwcmFnbWEgb21wIHRhc2sgZmlyc3Rwcml2YXRlKGwpIGluX3JlZHVjdGlvbigrOmopCisgICAgICAgIGogKz0gbDsKKyAgICB9CisgIH0gLy8gb3V0ZXIgcmVkdWN0aW9uCisqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3Blbk1QIHJ1bnRpbWUgbGlicmFyeSByb3V0aW5lcworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorZXh0ZXJuIHZvaWQqIF9fa21wY190YXNrX3JlZHVjdGlvbl9nZXRfdGhfZGF0YShpbnQgZ3RpZCwgdm9pZCogdGcsIHZvaWQqIGl0ZW0pOworZXh0ZXJuIHZvaWQqIF9fa21wY190YXNrX3JlZHVjdGlvbl9pbml0KGludCBndGlkLCBpbnQgbnVtLCB2b2lkKiBkYXRhKTsKK2V4dGVybiBpbnQgX19rbXBjX2dsb2JhbF90aHJlYWRfbnVtKHZvaWQqKTsKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb21waWxlci1nZW5lcmF0ZWQgY29kZQorCit0eXBlZGVmIHN0cnVjdCBfdGFza19yZWRfaXRlbSB7CisgICAgdm9pZCAgICAgICAqc2hhcjsgLy8gc2hhcmVkIHJlZHVjdGlvbiBpdGVtCisgICAgc2l6ZV90ICAgICAgc2l6ZTsgLy8gc2l6ZSBvZiBkYXRhIGl0ZW0KKyAgICB2b2lkICAgICAgICpmX2luaXQ7IC8vIGRhdGEgaW5pdGlhbGl6YXRpb24gcm91dGluZQorICAgIHZvaWQgICAgICAgKmZfZmluaTsgLy8gZGF0YSBmaW5hbGl6YXRpb24gcm91dGluZQorICAgIHZvaWQgICAgICAgKmZfY29tYjsgLy8gZGF0YSBjb21iaW5lciByb3V0aW5lCisgICAgdW5zaWduZWQgICAgZmxhZ3M7Cit9IF90YXNrX3JlZF9pdGVtX3Q7CisKKy8vIGludDorICAgbm8gbmVlZCBpbiBpbml0L2ZpbmkgY2FsbGJhY2tzLCB2YWxpZCBmb3Igc3VidHJhY3Rpb24KK3ZvaWQgX19yZWRfaW50X2FkZF9jb21iKHZvaWQgKmxocywgdm9pZCAqcmhzKSAvLyBjb21iaW5lcgoreyAqKGludCopbGhzICs9ICooaW50KilyaHM7IH0KKworLy8gbG9uZyBsb25nOisgICBubyBuZWVkIGluIGluaXQvZmluaSBjYWxsYmFja3MsIHZhbGlkIGZvciBzdWJ0cmFjdGlvbgordm9pZCBfX3JlZF9sbG9uZ19hZGRfY29tYih2b2lkICpsaHMsIHZvaWQgKnJocykgLy8gY29tYmluZXIKK3sgKihsb25nIGxvbmcqKWxocyArPSAqKGxvbmcgbG9uZyopcmhzOyB9CisKKy8vIGRvdWJsZToqICAgbm8gbmVlZCBpbiBmaW5pIGNhbGxiYWNrCit2b2lkIF9fcmVkX2RibF9tdWxfaW5pdCh2b2lkICpkYXRhKSAvLyBpbml0aWFsaXplcgoreyAqKGRvdWJsZSopZGF0YSA9IDEuMDsgfQordm9pZCBfX3JlZF9kYmxfbXVsX2NvbWIodm9pZCAqbGhzLCB2b2lkICpyaHMpIC8vIGNvbWJpbmVyCit7ICooZG91YmxlKilsaHMgKj0gKihkb3VibGUqKXJoczsgfQorCisvLyBkb3VibGU6KyAgIG5vIG5lZWQgaW4gaW5pdC9maW5pIGNhbGxiYWNrcwordm9pZCBfX3JlZF9kYmxfYWRkX2NvbWIodm9pZCAqbGhzLCB2b2lkICpyaHMpIC8vIGNvbWJpbmVyCit7ICooZG91YmxlKilsaHMgKz0gKihkb3VibGUqKXJoczsgfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCBjYWxjX3NlcmlhbChpbnQgKnBpLCBsb25nIGxvbmcgKnBqLCBkb3VibGUgKnB4LCBsb25nIGxvbmcgKnBrLCBkb3VibGUgKnB5KQoreworICAgIGZvciggaW50IGwgPSAwOyBsIDwgTjsgKytsICkgeworICAgICAgICAqcGkgKz0gbDsKKyAgICAgICAgaWYoIGwlMiApCisgICAgICAgICAgKnB4ICo9IDEuMCAvIChsICsgMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAqcHggKj0gKGwgKyAxKTsKKyAgICB9CisgICAgZm9yKCBpbnQgbCA9IDA7IGwgPCBOOyArK2wgKSB7CisgICAgICAgICpwaiArPSBsOworICAgICAgICAqcGsgLT0gbDsKKyAgICAgICAgKnB5ICs9IChkb3VibGUpbDsKKyAgICAgICAgaWYoIGwlMiApCisgICAgICAgICAgICAqcHggKj0gMS4wIC8gKGwgKyAxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKnB4ICo9IChsICsgMSk7CisKKyAgICAgICAgKnBpIC09IGw7CisgICAgICAgICpwayAtPSBsOworICAgICAgICAqcHkgKz0gKGRvdWJsZSlsOworCisgICAgICAgICpwaiArPSBsOworICAgICAgICBpZiggbCUyICkKKyAgICAgICAgICAgICpweCAqPSAxLjAgLyAobCArIDEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqcHggKj0gKGwgKyAxKTsKKyAgICB9CisgICAgZm9yKCBpbnQgbCA9IDA7IGwgPCBOOyArK2wgKSB7CisgICAgICAgICpwaiArPSBsOworICAgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRlc3QgY2FzZQoraW50IG1haW4oKQoreworICBpbnQgbnRocmVhZHMgPSBvbXBfZ2V0X21heF90aHJlYWRzKCk7CisgIGludCBlcnIgPSAwOworICB2b2lkKiogcHRycyA9ICh2b2lkKiopbWFsbG9jKG50aHJlYWRzKnNpemVvZih2b2lkKikpOworCisgIC8vIHVzZXIncyBjb2RlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIC8vIHZhcmlhYmxlcyBmb3Igc2VyaWFsIGNhbGN1bGF0aW9uczoKKyAgaW50IGlzID0gMzsKKyAgbG9uZyBsb25nIGpzID0gLTk5OTk5OTk7CisgIGRvdWJsZSB4cyA9IDk5OTk5LjA7CisgIGxvbmcgbG9uZyBrcyA9IDk5OTk5OTk5OworICBkb3VibGUgeXMgPSAtOTk5OTk5OTkuMDsKKyAgLy8gdmFyaWFibGVzIGZvciBwYXJhbGxlbCBjYWxjdWxhdGlvbnM6CisgIGludCBpcCA9IDM7CisgIGxvbmcgbG9uZyBqcCA9IC05OTk5OTk5OworICBkb3VibGUgeHAgPSA5OTk5OS4wOworICBsb25nIGxvbmcga3AgPSA5OTk5OTk5OTsKKyAgZG91YmxlIHlwID0gLTk5OTk5OTk5LjA7CisKKyAgY2FsY19zZXJpYWwoJmlzLCAmanMsICZ4cywgJmtzLCAmeXMpOworICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBmb3IgKGludCBpID0gMDsgaSA8IG50aHJlYWRzOyArK2kpCisgICAgcHRyc1tpXSA9IE5VTEw7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUgbm93YWl0CisgICAgeworICAgICAgLy8gb3V0ZXIgdGFza2dyb3VwIHJlZHVjZXMgKGksaix4KQorICAgICAgI3ByYWdtYSBvbXAgdGFza2dyb3VwIC8vIHRhc2tfcmVkdWN0aW9uKCs6aSxqKSB0YXNrX3JlZHVjdGlvbigqOngpCisgICAgICB7CisgICAgICAgIF90YXNrX3JlZF9pdGVtX3QgcmVkX2RhdGFbM107CisgICAgICAgIHJlZF9kYXRhWzBdLnNoYXIgPSAmaXA7CisgICAgICAgIHJlZF9kYXRhWzBdLnNpemUgPSBzaXplb2YoaXApOworICAgICAgICByZWRfZGF0YVswXS5mX2luaXQgPSBOVUxMOyAvLyBSVEwgd2lsbCB6ZXJvIHRocmVhZC1zcGVjaWZpYyBvYmplY3RzCisgICAgICAgIHJlZF9kYXRhWzBdLmZfZmluaSA9IE5VTEw7IC8vIG5vIGRlc3RydWN0b3JzIG5lZWRlZAorICAgICAgICByZWRfZGF0YVswXS5mX2NvbWIgPSAodm9pZCopJl9fcmVkX2ludF9hZGRfY29tYjsKKyAgICAgICAgcmVkX2RhdGFbMF0uZmxhZ3MgPSBGTEc7CisgICAgICAgIHJlZF9kYXRhWzFdLnNoYXIgPSAmanA7CisgICAgICAgIHJlZF9kYXRhWzFdLnNpemUgPSBzaXplb2YoanApOworICAgICAgICByZWRfZGF0YVsxXS5mX2luaXQgPSBOVUxMOyAvLyBSVEwgd2lsbCB6ZXJvIHRocmVhZC1zcGVjaWZpYyBvYmplY3RzCisgICAgICAgIHJlZF9kYXRhWzFdLmZfZmluaSA9IE5VTEw7IC8vIG5vIGRlc3RydWN0b3JzIG5lZWRlZAorICAgICAgICByZWRfZGF0YVsxXS5mX2NvbWIgPSAodm9pZCopJl9fcmVkX2xsb25nX2FkZF9jb21iOworICAgICAgICByZWRfZGF0YVsxXS5mbGFncyA9IEZMRzsKKyAgICAgICAgcmVkX2RhdGFbMl0uc2hhciA9ICZ4cDsKKyAgICAgICAgcmVkX2RhdGFbMl0uc2l6ZSA9IHNpemVvZih4cCk7CisgICAgICAgIHJlZF9kYXRhWzJdLmZfaW5pdCA9ICh2b2lkKikmX19yZWRfZGJsX211bF9pbml0OworICAgICAgICByZWRfZGF0YVsyXS5mX2ZpbmkgPSBOVUxMOyAvLyBubyBkZXN0cnVjdG9ycyBuZWVkZWQKKyAgICAgICAgcmVkX2RhdGFbMl0uZl9jb21iID0gKHZvaWQqKSZfX3JlZF9kYmxfbXVsX2NvbWI7CisgICAgICAgIHJlZF9kYXRhWzJdLmZsYWdzID0gRkxHOworICAgICAgICBpbnQgZ3RpZCA9IF9fa21wY19nbG9iYWxfdGhyZWFkX251bShOVUxMKTsKKyAgICAgICAgdm9pZCogdGcxID0gX19rbXBjX3Rhc2tfcmVkdWN0aW9uX2luaXQoZ3RpZCwgMywgcmVkX2RhdGEpOworCisgICAgICAgIGZvciggaW50IGwgPSAwOyBsIDwgTjsgbCArPSAyICkgeworICAgICAgICAgIC8vIDIgaXRlcmF0aW9ucyBwZXIgdGFzayB0byBnZXQgY29ycmVjdCB4IHZhbHVlOyBhY3R1YWxseSBhbnkgZXZlbgorICAgICAgICAgIC8vIG51bWJlciBvZiBpdGVycyBwZXIgdGFzayB3aWxsIHdvcmssIG90aGVyd2lzZSB4IGxvb3NlcyBwcmVjaXNpb24KKyAgICAgICAgICAjcHJhZ21hIG9tcCB0YXNrIGZpcnN0cHJpdmF0ZShsKSAvL2luX3JlZHVjdGlvbigrOmkpIGluX3JlZHVjdGlvbigqOngpCisgICAgICAgICAgeworICAgICAgICAgICAgaW50IGd0aWQgPSBfX2ttcGNfZ2xvYmFsX3RocmVhZF9udW0oTlVMTCk7CisgICAgICAgICAgICBpbnQgKnBfaXAgPSAoaW50KilfX2ttcGNfdGFza19yZWR1Y3Rpb25fZ2V0X3RoX2RhdGEoZ3RpZCwgdGcxLCAmaXApOworICAgICAgICAgICAgZG91YmxlICpwX3hwID0gKGRvdWJsZSopX19rbXBjX3Rhc2tfcmVkdWN0aW9uX2dldF90aF9kYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRnMSwgJnhwKTsKKyAgICAgICAgICAgIGlmICghcHRyc1tndGlkXSkgcHRyc1tndGlkXSA9IHBfeHA7CisKKyAgICAgICAgICAgIC8vIHVzZXIncyBwc2V1ZG8tY29kZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICpwX2lwICs9IGw7CisgICAgICAgICAgICAqcF94cCAqPSAobCArIDEpOworCisgICAgICAgICAgICAqcF9pcCArPSBsICsgMTsKKyAgICAgICAgICAgICpwX3hwICo9IDEuMCAvIChsICsgMik7CisgICAgICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBpbm5lciB0YXNrZ3JvdXAgcmVkdWNlcyAoaSxrLHkpLCBpIGlzIHNhbWUgb2JqZWN0IGFzIGluIG91dGVyIG9uZQorICAgICAgICAjcHJhZ21hIG9tcCB0YXNrZ3JvdXAgLy8gdGFza19yZWR1Y3Rpb24oLTppLGspIHRhc2tfcmVkdWN0aW9uKCs6eSkKKyAgICAgICAgeworICAgICAgICAgIF90YXNrX3JlZF9pdGVtX3QgcmVkX2RhdGFbM107CisgICAgICAgICAgcmVkX2RhdGFbMF0uc2hhciA9ICZpcDsKKyAgICAgICAgICByZWRfZGF0YVswXS5zaXplID0gc2l6ZW9mKGlwKTsKKyAgICAgICAgICByZWRfZGF0YVswXS5mX2luaXQgPSBOVUxMOyAvLyBSVEwgd2lsbCB6ZXJvIHRocmVhZC1zcGVjaWZpYyBvYmplY3RzCisgICAgICAgICAgcmVkX2RhdGFbMF0uZl9maW5pID0gTlVMTDsgLy8gbm8gZGVzdHJ1Y3RvcnMgbmVlZGVkCisgICAgICAgICAgcmVkX2RhdGFbMF0uZl9jb21iID0gKHZvaWQqKSZfX3JlZF9pbnRfYWRkX2NvbWI7CisgICAgICAgICAgcmVkX2RhdGFbMF0uZmxhZ3MgPSBGTEc7CisgICAgICAgICAgcmVkX2RhdGFbMV0uc2hhciA9ICZrcDsKKyAgICAgICAgICByZWRfZGF0YVsxXS5zaXplID0gc2l6ZW9mKGtwKTsKKyAgICAgICAgICByZWRfZGF0YVsxXS5mX2luaXQgPSBOVUxMOyAvLyBSVEwgd2lsbCB6ZXJvIHRocmVhZC1zcGVjaWZpYyBvYmplY3RzCisgICAgICAgICAgcmVkX2RhdGFbMV0uZl9maW5pID0gTlVMTDsgLy8gbm8gZGVzdHJ1Y3RvcnMgbmVlZGVkCisgICAgICAgICAgcmVkX2RhdGFbMV0uZl9jb21iID0gKHZvaWQqKSZfX3JlZF9sbG9uZ19hZGRfY29tYjsgLy8gc2FtZSBmb3IgKyBhbmQgLQorICAgICAgICAgIHJlZF9kYXRhWzFdLmZsYWdzID0gRkxHOworICAgICAgICAgIHJlZF9kYXRhWzJdLnNoYXIgPSAmeXA7CisgICAgICAgICAgcmVkX2RhdGFbMl0uc2l6ZSA9IHNpemVvZih5cCk7CisgICAgICAgICAgcmVkX2RhdGFbMl0uZl9pbml0ID0gTlVMTDsgLy8gUlRMIHdpbGwgemVybyB0aHJlYWQtc3BlY2lmaWMgb2JqZWN0cworICAgICAgICAgIHJlZF9kYXRhWzJdLmZfZmluaSA9IE5VTEw7IC8vIG5vIGRlc3RydWN0b3JzIG5lZWRlZAorICAgICAgICAgIHJlZF9kYXRhWzJdLmZfY29tYiA9ICh2b2lkKikmX19yZWRfZGJsX2FkZF9jb21iOworICAgICAgICAgIHJlZF9kYXRhWzJdLmZsYWdzID0gRkxHOworICAgICAgICAgIGludCBndGlkID0gX19rbXBjX2dsb2JhbF90aHJlYWRfbnVtKE5VTEwpOworICAgICAgICAgIHZvaWQqIHRnMiA9IF9fa21wY190YXNrX3JlZHVjdGlvbl9pbml0KGd0aWQsIDMsIHJlZF9kYXRhKTsKKworICAgICAgICAgIGZvciggaW50IGwgPSAwOyBsIDwgTjsgbCArPSAyICkgeworICAgICAgICAgICAgI3ByYWdtYSBvbXAgdGFzayBmaXJzdHByaXZhdGUobCkKKyAgICAgICAgICAgIC8vIGluX3JlZHVjdGlvbigrOmoseSkgaW5fcmVkdWN0aW9uKCo6eCkgaW5fcmVkdWN0aW9uKC06aykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaW50IGd0aWQgPSBfX2ttcGNfZ2xvYmFsX3RocmVhZF9udW0oTlVMTCk7CisgICAgICAgICAgICAgIGxvbmcgbG9uZyAqcF9qcCA9IChsb25nIGxvbmcqKV9fa21wY190YXNrX3JlZHVjdGlvbl9nZXRfdGhfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRnMSwgJmpwKTsKKyAgICAgICAgICAgICAgbG9uZyBsb25nICpwX2twID0gKGxvbmcgbG9uZyopX19rbXBjX3Rhc2tfcmVkdWN0aW9uX2dldF90aF9kYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGcyLCAma3ApOworICAgICAgICAgICAgICBkb3VibGUgKnBfeHAgPSAoZG91YmxlKilfX2ttcGNfdGFza19yZWR1Y3Rpb25fZ2V0X3RoX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZzEsICZ4cCk7CisgICAgICAgICAgICAgIGRvdWJsZSAqcF95cCA9IChkb3VibGUqKV9fa21wY190YXNrX3JlZHVjdGlvbl9nZXRfdGhfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRnMiwgJnlwKTsKKyAgICAgICAgICAgICAgLy8gdXNlcidzIHBzZXVkby1jb2RlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAqcF9qcCArPSBsOworICAgICAgICAgICAgICAqcF9rcCAtPSBsOworICAgICAgICAgICAgICAqcF95cCArPSAoZG91YmxlKWw7CisgICAgICAgICAgICAgICpwX3hwICo9IChsICsgMSk7CisKKyAgICAgICAgICAgICAgKnBfanAgKz0gbCArIDE7CisgICAgICAgICAgICAgICpwX2twIC09IGwgKyAxOworICAgICAgICAgICAgICAqcF95cCArPSAoZG91YmxlKShsICsgMSk7CisgICAgICAgICAgICAgICpwX3hwICo9IDEuMCAvIChsICsgMik7CisgICAgICAgICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3sKKyAgLy8gdGhlIGZvbGxvd2luZyBjb2RlIGlzIGhlcmUganVzdCB0byBjaGVjayBfX2ttcGNfdGFza19yZWR1Y3Rpb25fZ2V0X3RoX2RhdGE6CisgIGludCB0aWQgPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgdm9pZCAqYWRkcjE7CisgIHZvaWQgKmFkZHIyOworICBhZGRyMSA9IF9fa21wY190YXNrX3JlZHVjdGlvbl9nZXRfdGhfZGF0YShndGlkLCB0ZzEsICZ4cCk7IC8vIGZyb20gc2hhcmVkCisgIGFkZHIyID0gX19rbXBjX3Rhc2tfcmVkdWN0aW9uX2dldF90aF9kYXRhKGd0aWQsIHRnMSwgYWRkcjEpOyAvLyBmcm9tIHByaXZhdGUKKyAgaWYgKGFkZHIxICE9IGFkZHIyKSB7CisgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICArK2VycjsKKyAgICBwcmludGYoIldyb25nIHRocmVhZC1zcGVjaWZpYyBhZGRyZXNzZXMgJWQgczolcCBwOiVwXG4iLCB0aWQsIGFkZHIxLCBhZGRyMik7CisgIH0KKyAgLy8gZnJvbSBuZWlnaGJvdXIgdy9vIHRhc2tncm91cCAoc2hvdWxkIHN0YXJ0IGxvb2t1cCBmcm9tIGN1cnJlbnQgdGcyKQorICBpZiAodGlkID4gMCkgeworICAgIGlmIChwdHJzW3RpZC0xXSkgeworICAgICAgYWRkcjIgPSBfX2ttcGNfdGFza19yZWR1Y3Rpb25fZ2V0X3RoX2RhdGEoZ3RpZCwgTlVMTCwgcHRyc1t0aWQtMV0pOworICAgICAgaWYgKGFkZHIxICE9IGFkZHIyKSB7CisgICAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgICAgICsrZXJyOworICAgICAgICBwcmludGYoIldyb25nIHRocmVhZC1zcGVjaWZpYyBhZGRyZXNzZXMgJWQgczolcCBuOiVwXG4iLAorICAgICAgICAgICAgICAgdGlkLCBhZGRyMSwgYWRkcjIpOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAocHRyc1tudGhyZWFkcy0xXSkgeworICAgICAgYWRkcjIgPSBfX2ttcGNfdGFza19yZWR1Y3Rpb25fZ2V0X3RoX2RhdGEoZ3RpZCwgTlVMTCwgcHRyc1tudGhyZWFkcy0xXSk7CisgICAgICBpZiAoYWRkcjEgIT0gYWRkcjIpIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICAgICAgKytlcnI7CisgICAgICAgIHByaW50ZigiV3JvbmcgdGhyZWFkLXNwZWNpZmljIGFkZHJlc3NlcyAlZCBzOiVwIG46JXBcbiIsCisgICAgICAgICAgICAgICB0aWQsIGFkZHIxLCBhZGRyMik7CisgICAgICB9CisgICAgfQorICB9CisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK30KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNwcmFnbWEgb21wIHRhc2sgZmlyc3Rwcml2YXRlKGwpCisgICAgICAgICAgICAvLyBpbl9yZWR1Y3Rpb24oKzp5KSBpbl9yZWR1Y3Rpb24oLTppLGspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGludCBndGlkID0gX19rbXBjX2dsb2JhbF90aHJlYWRfbnVtKE5VTEwpOworICAgICAgICAgICAgICBpbnQgKnBfaXAgPSAoaW50KilfX2ttcGNfdGFza19yZWR1Y3Rpb25fZ2V0X3RoX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZzIsICZpcCk7CisgICAgICAgICAgICAgIGxvbmcgbG9uZyAqcF9rcCA9IChsb25nIGxvbmcqKV9fa21wY190YXNrX3JlZHVjdGlvbl9nZXRfdGhfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRnMiwgJmtwKTsKKyAgICAgICAgICAgICAgZG91YmxlICpwX3lwID0gKGRvdWJsZSopX19rbXBjX3Rhc2tfcmVkdWN0aW9uX2dldF90aF9kYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGcyLCAmeXApOworCisgICAgICAgICAgICAgIC8vIHVzZXIncyBwc2V1ZG8tY29kZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgKnBfaXAgLT0gbDsKKyAgICAgICAgICAgICAgKnBfa3AgLT0gbDsKKyAgICAgICAgICAgICAgKnBfeXAgKz0gKGRvdWJsZSlsOworCisgICAgICAgICAgICAgICpwX2lwIC09IGwgKyAxOworICAgICAgICAgICAgICAqcF9rcCAtPSBsICsgMTsKKyAgICAgICAgICAgICAgKnBfeXAgKz0gKGRvdWJsZSkobCArIDEpOworICAgICAgICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjcHJhZ21hIG9tcCB0YXNrIGZpcnN0cHJpdmF0ZShsKQorICAgICAgICAgICAgLy8gaW5fcmVkdWN0aW9uKCs6aikgaW5fcmVkdWN0aW9uKCo6eCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaW50IGd0aWQgPSBfX2ttcGNfZ2xvYmFsX3RocmVhZF9udW0oTlVMTCk7CisgICAgICAgICAgICAgIGxvbmcgbG9uZyAqcF9qcCA9IChsb25nIGxvbmcqKV9fa21wY190YXNrX3JlZHVjdGlvbl9nZXRfdGhfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRnMSwgJmpwKTsKKyAgICAgICAgICAgICAgZG91YmxlICpwX3hwID0gKGRvdWJsZSopX19rbXBjX3Rhc2tfcmVkdWN0aW9uX2dldF90aF9kYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGcxLCAmeHApOworICAgICAgICAgICAgICAvLyB1c2VyJ3MgcHNldWRvLWNvZGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAgICpwX2pwICs9IGw7CisgICAgICAgICAgICAgICpwX3hwICo9IChsICsgMSk7CisKKyAgICAgICAgICAgICAgKnBfanAgKz0gbCArIDE7CisgICAgICAgICAgICAgICpwX3hwICo9IDEuMCAvIChsICsgMik7CisgICAgICAgICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gLy8gaW5uZXIgcmVkdWN0aW9uCisKKyAgICAgICAgZm9yKCBpbnQgbCA9IDA7IGwgPCBOOyBsICs9IDIgKSB7CisgICAgICAgICAgI3ByYWdtYSBvbXAgdGFzayBmaXJzdHByaXZhdGUobCkgLy8gaW5fcmVkdWN0aW9uKCs6aikKKyAgICAgICAgICB7CisgICAgICAgICAgICBpbnQgZ3RpZCA9IF9fa21wY19nbG9iYWxfdGhyZWFkX251bShOVUxMKTsKKyAgICAgICAgICAgIGxvbmcgbG9uZyAqcF9qcCA9IChsb25nIGxvbmcqKV9fa21wY190YXNrX3JlZHVjdGlvbl9nZXRfdGhfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZzEsICZqcCk7CisgICAgICAgICAgICAvLyB1c2VyJ3MgcHNldWRvLWNvZGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgICAqcF9qcCArPSBsOworICAgICAgICAgICAgKnBfanAgKz0gbCArIDE7CisgICAgICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IC8vIG91dGVyIHJlZHVjdGlvbgorICAgIH0gLy8gZW5kIHNpbmdsZQorICB9IC8vIGVuZCBwYXJhbGxlbAorICAvLyBjaGVjayByZXN1bHRzCisjaWYgX0RFQlVHCisgIHByaW50ZigicmVkdWN0aW9uIGZsYWdzID0gJXVcbiIsIEZMRyk7CisjZW5kaWYKKyAgaWYgKGlwID09IGlzICYmIGpwID09IGpzICYmIGtzID09IGtwICYmCisgICAgICBmYWJzKHhwIC0geHMpIDwgMC4wMSAmJiBmYWJzKHlwIC0geXMpIDwgMC4wMSkKKyAgICBwcmludGYoInBhc3NlZFxuIik7CisgIGVsc2UKKyAgICBwcmludGYoImZhaWxlZCxcbiBzZXI6KCVkICVsbGQgJWYgJWxsZCAlZilcbiBwYXI6KCVkICVsbGQgJWYgJWxsZCAlZilcbiIsCisgICAgICBpcywganMsIHhzLCBrcywgeXMsCisgICAgICBpcCwganAsIHhwLCBrcCwgeXApOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL2ttcF90YXNrbG9vcC5jIGIvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcva21wX3Rhc2tsb29wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIxMzc5MwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL2ttcF90YXNrbG9vcC5jCkBAIC0wLDAgKzEsMTU5IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisvLyBSVU46ICVsaWJvbXAtY29tcGlsZSAmJiBlbnYgS01QX1RBU0tMT09QX01JTl9UQVNLUz0xICVsaWJvbXAtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvbXAuaD4KKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworI2RlZmluZSBOIDQKKyNkZWZpbmUgR1JBSU4gMTAKKyNkZWZpbmUgU1RSSURFIDMKKworLy8gZ2xvYmFscworaW50IHRoX2NvdW50ZXJbTl07CitpbnQgY291bnRlcjsKKworCisvLyBDb21waWxlci1nZW5lcmF0ZWQgY29kZSAoZW11bGF0aW9uKQordHlwZWRlZiBzdHJ1Y3QgaWRlbnQgeworICAgIHZvaWQqIGR1bW15OworfSBpZGVudF90OworCit0eXBlZGVmIHN0cnVjdCBzaGFyIHsKKyAgICBpbnQoKnB0aF9jb3VudGVyKVtOXTsKKyAgICBpbnQgKnBjb3VudGVyOworICAgIGludCAqcGo7Cit9ICpwc2hhcmVkczsKKwordHlwZWRlZiBzdHJ1Y3QgdGFzayB7CisgICAgcHNoYXJlZHMgc2hhcmVkczsKKyAgICBpbnQoKiByb3V0aW5lKShpbnQsc3RydWN0IHRhc2sqKTsKKyAgICBpbnQgcGFydF9pZDsKKy8vIHByaXZhdGVzOgorICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBsYjsgLy8gbGlicmFyeSBhbHdheXMgdXNlcyBVTE9ORworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB1YjsKKyAgICBpbnQgc3Q7CisgICAgaW50IGxhc3Q7CisgICAgaW50IGk7CisgICAgaW50IGo7CisgICAgaW50IHRoOworfSAqcHRhc2ssIGttcF90YXNrX3Q7CisKK3R5cGVkZWYgaW50KCogdGFza19lbnRyeV90KSggaW50LCBwdGFzayApOworCit2b2lkCitfX3Rhc2tfZHVwX2VudHJ5KHB0YXNrIHRhc2tfZHN0LCBwdGFzayB0YXNrX3NyYywgaW50IGxhc3Rwcml2KQoreworLy8gc2V0dXAgbGFzdHByaXZhdGUgZmxhZworICAgIHRhc2tfZHN0LT5sYXN0ID0gbGFzdHByaXY7CisvLyBjb3VsZCBiZSBjb25zdHJ1Y3RvciBjYWxscyBoZXJlLi4uCit9CisKKworLy8gT3Blbk1QIFJUTCBpbnRlcmZhY2VzCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBrbXBfdWludDY0OwordHlwZWRlZiBsb25nIGxvbmcga21wX2ludDY0OworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCit2b2lkCitfX2ttcGNfdGFza2xvb3AoaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwga21wX3Rhc2tfdCAqdGFzaywgaW50IGlmX3ZhbCwKKyAgICAgICAgICAgICAgICBrbXBfdWludDY0ICpsYiwga21wX3VpbnQ2NCAqdWIsIGttcF9pbnQ2NCBzdCwKKyAgICAgICAgICAgICAgICBpbnQgbm9ncm91cCwgaW50IHNjaGVkLCBrbXBfaW50NjQgZ3JhaW5zaXplLCB2b2lkICp0YXNrX2R1cCApOworcHRhc2sKK19fa21wY19vbXBfdGFza19hbGxvYyggaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemVvZl9rbXBfdGFza190LCBzaXplX3Qgc2l6ZW9mX3NoYXJlZHMsCisgICAgICAgICAgICAgICAgICB0YXNrX2VudHJ5X3QgdGFza19lbnRyeSApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGQodm9pZCAqaWRfcmVmLCBpbnQgZ3RpZCwgaW50ICogbGhzLCBpbnQgcmhzKTsKK2ludCAgX19rbXBjX2dsb2JhbF90aHJlYWRfbnVtKHZvaWQgKmlkX3JlZik7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKKy8vIFVzZXIncyBjb2RlCitpbnQgdGFza19lbnRyeShpbnQgZ3RpZCwgcHRhc2sgdGFzaykKK3sKKyAgICBwc2hhcmVkcyBwc2hhciA9IHRhc2stPnNoYXJlZHM7CisgICAgZm9yKCB0YXNrLT5pID0gdGFzay0+bGI7IHRhc2stPmkgPD0gKGludCl0YXNrLT51YjsgdGFzay0+aSArPSB0YXNrLT5zdCApIHsKKyAgICAgICAgdGFzay0+dGggPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfYWRkKE5VTEwsZ3RpZCxwc2hhci0+cGNvdW50ZXIsMSk7CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZChOVUxMLGd0aWQsJigoKnBzaGFyLT5wdGhfY291bnRlcilbdGFzay0+dGhdKSwxKTsKKyAgICAgICAgdGFzay0+aiA9IHRhc2stPmk7CisgICAgfQorICAgIG15X3NsZWVwKCAwLjEgKTsgLy8gc2xlZXAgMTAwIG1zIGluIG9yZGVyIHRvIGFsbG93IG90aGVyIHRocmVhZHMgdG8gc3RlYWwgdGFza3MKKyAgICBpZiggdGFzay0+bGFzdCApIHsKKyAgICAgICAgKihwc2hhci0+cGopID0gdGFzay0+ajsgLy8gbGFzdHByaXZhdGUKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgICBpbnQgaSwgaiwgZ3RpZCA9IF9fa21wY19nbG9iYWxfdGhyZWFkX251bShOVUxMKTsKKyAgICBwdGFzayB0YXNrOworICAgIHBzaGFyZWRzIHBzaDsKKyAgICBvbXBfc2V0X2R5bmFtaWMoMCk7CisgICAgY291bnRlciA9IDA7CisgICAgZm9yKCBpPTA7IGk8TjsgKytpICkKKyAgICAgICAgdGhfY291bnRlcltpXSA9IDA7CisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMoTikKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBtYXN0ZXIKKyAgICAgIHsKKyAgICAgICAgaW50IGd0aWQgPSBfX2ttcGNfZ2xvYmFsX3RocmVhZF9udW0oTlVMTCk7CisvKgorICogIFRoaXMgaXMgd2hhdCB0aGUgT3Blbk1QIHJ1bnRpbWUgY2FsbHMgY29ycmVzcG9uZCB0bzoKKyAgICAjcHJhZ21hIG9tcCB0YXNrbG9vcCBudW1fdGFza3MoTikgbGFzdHByaXZhdGUoaikKKyAgICBmb3IoIGk9MDsgaTxOKkdSQUlOKlNUUklERS0xOyBpKz1TVFJJREUgKQorICAgIHsKKyAgICAgICAgaW50IHRoID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgICAgICAgY291bnRlcisrOworICAgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgICAgICAgIHRoX2NvdW50ZXJbdGhdKys7CisgICAgICAgIGogPSBpOworICAgIH0KKyovCisgICAgdGFzayA9IF9fa21wY19vbXBfdGFza19hbGxvYyhOVUxMLGd0aWQsMSxzaXplb2Yoc3RydWN0IHRhc2spLHNpemVvZihzdHJ1Y3Qgc2hhciksJnRhc2tfZW50cnkpOworICAgIHBzaCA9IHRhc2stPnNoYXJlZHM7CisgICAgcHNoLT5wdGhfY291bnRlciA9ICZ0aF9jb3VudGVyOworICAgIHBzaC0+cGNvdW50ZXIgPSAmY291bnRlcjsKKyAgICBwc2gtPnBqID0gJmo7CisgICAgdGFzay0+bGIgPSAwOworICAgIHRhc2stPnViID0gTipHUkFJTipTVFJJREUtMjsKKyAgICB0YXNrLT5zdCA9IFNUUklERTsKKworICAgIF9fa21wY190YXNrbG9vcCgKKyAgICAgICAgTlVMTCwgICAgICAgICAgICAgLy8gbG9jYXRpb24KKyAgICAgICAgZ3RpZCwgICAgICAgICAgICAgLy8gZ3RpZAorICAgICAgICB0YXNrLCAgICAgICAgICAgICAvLyB0YXNrIHN0cnVjdHVyZQorICAgICAgICAxLCAgICAgICAgICAgICAgICAvLyBpZiBjbGF1c2UgdmFsdWUKKyAgICAgICAgJnRhc2stPmxiLCAgICAgICAgLy8gbG93ZXIgYm91bmQKKyAgICAgICAgJnRhc2stPnViLCAgICAgICAgLy8gdXBwZXIgYm91bmQKKyAgICAgICAgU1RSSURFLCAgICAgICAgICAgLy8gbG9vcCBpbmNyZW1lbnQKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgLy8gMSBpZiBub2dyb3VwIHNwZWNpZmllZAorICAgICAgICAyLCAgICAgICAgICAgICAgICAvLyBzY2hlZHVsZSB0eXBlOiAwLW5vbmUsIDEtZ3JhaW5zaXplLCAyLW51bV90YXNrcworICAgICAgICBOLCAgICAgICAgICAgICAgICAvLyBzY2hlZHVsZSB2YWx1ZSAoaWdub3JlZCBmb3IgdHlwZSAwKQorICAgICAgICAodm9pZCopJl9fdGFza19kdXBfZW50cnkgLy8gdGFza3MgZHVwbGljYXRpb24gcm91dGluZQorICAgICAgICApOworICAgICAgfSAvLyBlbmQgbWFzdGVyCisgICAgfSAvLyBlbmQgcGFyYWxsZWwKKy8vIGNoZWNrIHJlc3VsdHMKKyAgICBpZiggaiAhPSBOKkdSQUlOKlNUUklERS1TVFJJREUgKSB7CisgICAgICAgIHByaW50ZigiRXJyb3IgaW4gbGFzdHByaXZhdGUsICVkICE9ICVkXG4iLGosTipHUkFJTipTVFJJREUtU1RSSURFKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmKCBjb3VudGVyICE9IE4qR1JBSU4gKSB7CisgICAgICAgIHByaW50ZigiRXJyb3IsIGNvdW50ZXIgJWQgIT0gJWRcbiIsY291bnRlcixOKkdSQUlOKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGZvciggaT0wOyBpPE47ICsraSApIHsKKyAgICAgICAgaWYoIHRoX2NvdW50ZXJbaV0gJSBHUkFJTiApIHsKKyAgICAgICAgICAgIHByaW50ZigiRXJyb3IsIHRoX2NvdW50ZXJbJWRdID0gJWRcbiIsaSx0aF9jb3VudGVyW2ldKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorICAgIHByaW50ZigicGFzc2VkXG4iKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL25lc3RlZF9wYXJhbGxlbF90YXNraW5nLmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9uZXN0ZWRfcGFyYWxsZWxfdGFza2luZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNzRkNmUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9uZXN0ZWRfcGFyYWxsZWxfdGFza2luZy5jCkBAIC0wLDAgKzEsMzIgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9tcC5oPgorCisvKgorICogVGhpcyB0ZXN0IHdvdWxkIGhhbmcgd2hlbiBsZXZlbCBpbnN0ZWFkIG9mIGFjdGl2ZSBsZXZlbAorICogdXNlZCB0byBwdXNoIHRhc2sgc3RhdGUuCisgKi8KKworaW50IG1haW4oKQoreworICAvLyBJZiBudW1fdGhyZWFkcyBpcyBjaGFuZ2VkIHRvIGEgdmFsdWUgZ3JlYXRlciB0aGFuIDEsIHRoZW4gdGhlIHRlc3QgcGFzc2VzCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIG51bV90aHJlYWRzKDEpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHByaW50ZigiSGVsbG8gV29ybGQgZnJvbSB0aHJlYWQgJWRcbiIsIG9tcF9nZXRfdGhyZWFkX251bSgpKTsKKyAgfQorCisgIHByaW50Zigib21wX251bV90aHJlYWRzOiAlZFxuIiwgb21wX2dldF9tYXhfdGhyZWFkcygpKTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgbWFzdGVyCisgICAgI3ByYWdtYSBvbXAgdGFzayBkZWZhdWx0KG5vbmUpCisgICAgeworICAgICAgcHJpbnRmKCIlZCBpcyBleGVjdXRpbmcgdGhpcyB0YXNrXG4iLCBvbXBfZ2V0X3RocmVhZF9udW0oKSk7CisgICAgfQorICB9CisKKyAgcHJpbnRmKCJwYXNzXG4iKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9uZXN0ZWRfdGFza19jcmVhdGlvbi5jIGIvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvbmVzdGVkX3Rhc2tfY3JlYXRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2MyNWZjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvbmVzdGVkX3Rhc2tfY3JlYXRpb24uYwpAQCAtMCwwICsxLDM1IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvbXAuaD4KKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworLyoKKyAqIFRoaXMgdGVzdCBjcmVhdGVzIHRhc2tzIHRoYXQgdGhlbXNlbHZlcyBjcmVhdGUgYSBuZXcgdGFzay4KKyAqIFRoZSBydW50aW1lIGhhcyB0byB0YWtlIGNhcmUgdGhhdCB0aGV5IGFyZSBjb3JyZWN0bHkgZnJlZWQuCisgKi8KKworaW50IG1haW4oKQoreworICAjcHJhZ21hIG9tcCB0YXNrCisgIHsKKyAgICAjcHJhZ21hIG9tcCB0YXNrCisgICAgeworICAgICAgbXlfc2xlZXAoIDAuMSApOworICAgIH0KKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIG51bV90aHJlYWRzKDIpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICAjcHJhZ21hIG9tcCB0YXNrCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgdGFzaworICAgICAgeworICAgICAgICBteV9zbGVlcCggMC4xICk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpbnRmKCJwYXNzXG4iKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFzay5jIGIvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTM0YWJlCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2suYwpAQCAtMCwwICsxLDUyIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgdGVzdF9vbXBfdGFzaygpCit7CisgIGludCB0aWRzW05VTV9UQVNLU107CisgIGludCBpOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgLyogRmlyc3Qgd2UgaGF2ZSB0byBzdG9yZSB0aGUgdmFsdWUgb2YgdGhlIGxvb3AgaW5kZXggaW4gYSBuZXcgdmFyaWFibGUKKyAgICAgICAgICogd2hpY2ggd2lsbCBiZSBwcml2YXRlIGZvciBlYWNoIHRhc2sgYmVjYXVzZSBvdGhlcndpc2UgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbgorICAgICAgICAgKiBpZiB0aGUgZXhlY3V0aW9uIG9mIHRoZSB0YXNrIHRha2VzIGxvbmdlciB0aGFuIHRoZSB0aW1lIHdoaWNoIGlzIG5lZWRlZCB0bworICAgICAgICAgKiBlbnRlciB0aGUgbmV4dCBzdGVwIG9mIHRoZSBsb29wIQorICAgICAgICAgKi8KKyAgICAgICAgaW50IG15aTsKKyAgICAgICAgbXlpID0gaTsKKyAgICAgICAgI3ByYWdtYSBvbXAgdGFzaworICAgICAgICB7CisgICAgICAgICAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisgICAgICAgICAgdGlkc1tteWldID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKyAgICB9IC8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgfSAvKmVuZCBvZiBwYXJhbGxlbCAqLworCisgIC8qIE5vdyB3ZSBja2VjayBpZiBtb3JlIHRoYW4gb25lIHRocmVhZCBleGVjdXRlZCB0aGUgdGFza3MuICovCisgIGZvciAoaSA9IDE7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgIGlmICh0aWRzWzBdICE9IHRpZHNbaV0pCisgICAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30gLyogZW5kIG9mIGNoZWNrX3BhcmFsbGVsX2Zvcl9wcml2YXRlICovCisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF90YXNrKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza19maW5hbC5jIGIvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2tfZmluYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTMxYWY2Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2tfZmluYWwuYwpAQCAtMCwwICsxLDY1IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgdGVzdF9vbXBfdGFza19maW5hbCgpCit7CisgIGludCB0aWRzW05VTV9UQVNLU107CisgIGludCBpbmNsdWRlZHRpZHNbTlVNX1RBU0tTXTsKKyAgaW50IGk7CisgIGludCBlcnJvciA9IDA7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgLyogRmlyc3Qgd2UgaGF2ZSB0byBzdG9yZSB0aGUgdmFsdWUgb2YgdGhlIGxvb3AgaW5kZXggaW4gYSBuZXcgdmFyaWFibGUKKyAgICAgICAgICogd2hpY2ggd2lsbCBiZSBwcml2YXRlIGZvciBlYWNoIHRhc2sgYmVjYXVzZSBvdGhlcndpc2UgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbgorICAgICAgICAgKiBpZiB0aGUgZXhlY3V0aW9uIG9mIHRoZSB0YXNrIHRha2VzIGxvbmdlciB0aGFuIHRoZSB0aW1lIHdoaWNoIGlzIG5lZWRlZCB0bworICAgICAgICAgKiBlbnRlciB0aGUgbmV4dCBzdGVwIG9mIHRoZSBsb29wIQorICAgICAgICAgKi8KKyAgICAgICAgaW50IG15aTsKKyAgICAgICAgbXlpID0gaTsKKworICAgICAgICAjcHJhZ21hIG9tcCB0YXNrIGZpbmFsKGk+PTEwKQorICAgICAgICB7CisgICAgICAgICAgdGlkc1tteWldID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgLyogd2UgZ2VuZXJhdGUgaW5jbHVkZWQgdGFza3MgZm9yIGZpbmFsIHRhc2tzICovCisgICAgICAgICAgaWYobXlpID49IDEwKSB7CisgICAgICAgICAgICBpbnQgaW5jbHVkZWQgPSBteWk7CisgICAgICAgICAgICAjcHJhZ21hIG9tcCB0YXNrCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG15X3NsZWVwIChTTEVFUFRJTUUpOworICAgICAgICAgICAgICBpbmNsdWRlZHRpZHNbaW5jbHVkZWRdID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgICB9IC8qIGVuZCBvZiBvbXAgaW5jbHVkZWQgdGFzayBvZiB0aGUgZmluYWwgdGFzayAqLworICAgICAgICAgICAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisgICAgICAgICAgfSAvKiBlbmQgb2YgaWYgaXQgaXMgYSBmaW5hbCB0YXNrKi8KKyAgICAgICAgfSAvKiBlbmQgb2Ygb21wIHRhc2sgKi8KKyAgICAgIH0gLyogZW5kIG9mIGZvciAqLworICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworICB9IC8qZW5kIG9mIHBhcmFsbGVsICovCisKKyAgLyogTm93IHdlIGNrZWNrIGlmIG1vcmUgdGhhbiBvbmUgdGhyZWFkIGV4ZWN1dGVkIHRoZSBmaW5hbCB0YXNrIGFuZCBpdHMgaW5jbHVkZWQgdGFzay4gKi8KKyAgZm9yIChpID0gMTA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgIGlmICh0aWRzW2ldICE9IGluY2x1ZGVkdGlkc1tpXSkgeworICAgICAgZXJyb3IrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIChlcnJvcj09MCk7Cit9IC8qIGVuZCBvZiBjaGVja19wYXJhbGVsX2Zvcl9wcml2YXRlICovCisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF90YXNrX2ZpbmFsKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrX2ZpcnN0cHJpdmF0ZS5jIGIvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2tfZmlyc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFmN2MzNQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrX2ZpcnN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTEgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF90YXNrX2ZpcnN0cHJpdmF0ZSgpCit7CisgIGludCBpOworICBpbnQgc3VtID0gMTIzNDsKKyAgaW50IGtub3duX3N1bTsKKyAgaW50IHJlc3VsdCA9IDA7IC8qIGNvdW50cyB0aGUgd3Jvbmcgc3VtcyBmcm9tIHRhc2tzICovCisKKyAga25vd25fc3VtID0gMTIzNCArIChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgICNwcmFnbWEgb21wIHRhc2sgZmlyc3Rwcml2YXRlKHN1bSkKKyAgICAgICAgeworICAgICAgICAgIGludCBqOworICAgICAgICAgIGZvciAoaiA9IDA7IGogPD0gTE9PUENPVU5UOyBqKyspIHsKKyAgICAgICAgICAgICNwcmFnbWEgb21wIGZsdXNoCisgICAgICAgICAgICBzdW0gKz0gajsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBjaGVjayBpZiBjYWxjdWxhdGVkIHN1bSB3YXMgcmlnaHQgKi8KKyAgICAgICAgICBpZiAoc3VtICE9IGtub3duX3N1bSkgeworICAgICAgICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgICAgIHsgcmVzdWx0Kys7IH0KKyAgICAgICAgICB9CisgICAgICAgIH0gLyogb21wIHRhc2sgKi8KKyAgICAgIH0gLyogZm9yIGxvb3AgKi8KKyAgICB9IC8qIG9tcCBzaW5nbGUgKi8KKyAgfSAvKiBvbXAgcGFyYWxsZWwgKi8KKyAgcmV0dXJuIChyZXN1bHQgPT0gMCk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF90YXNrX2ZpcnN0cHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2tfaWYuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrX2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI0NzI4ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrX2lmLmMKQEAgLTAsMCArMSw0MyBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IHRlc3Rfb21wX3Rhc2tfaWYoKQoreworICBpbnQgY29uZGl0aW9uX2ZhbHNlOworICBpbnQgY291bnQ7CisgIGludCByZXN1bHQ7CisKKyAgY291bnQ9MDsKKyAgY29uZGl0aW9uX2ZhbHNlID0gKGNvdW50ID09IDEpOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgdGFzayBpZiAoY29uZGl0aW9uX2ZhbHNlKSBzaGFyZWQoY291bnQsIHJlc3VsdCkKKyAgICAgIHsKKyAgICAgICAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisgICAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICAgIHJlc3VsdCA9ICgwID09IGNvdW50KTsKKyAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgY291bnQgPSAxOworICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworICB9IC8qZW5kIG9mIHBhcmFsbGVsICovCisgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF90YXNrX2lmKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza19pbXBfZmlyc3Rwcml2YXRlLmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza19pbXBfZmlyc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA1YWI5YQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrX2ltcF9maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDQ3IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisvKiBVdGlsaXR5IGZ1bmN0aW9uIGRvIHNwZW5kIHNvbWUgdGltZSBpbiBhIGxvb3AgKi8KK2ludCB0ZXN0X29tcF90YXNrX2ltcF9maXJzdHByaXZhdGUoKQoreworICBpbnQgaT01OworICBpbnQgayA9IDA7CisgIGludCByZXN1bHQgPSAwOworICBpbnQgdGFza19yZXN1bHQgPSAxOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGUoaSkKKyAgeworICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIGZvciAoayA9IDA7IGsgPCBOVU1fVEFTS1M7IGsrKykgeworICAgICAgICAjcHJhZ21hIG9tcCB0YXNrIHNoYXJlZChyZXN1bHQgLCB0YXNrX3Jlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgIGludCBqOworICAgICAgICAgIC8vY2hlY2sgaWYgaSBpcyBwcml2YXRlCisgICAgICAgICAgaWYoaSAhPSA1KQorICAgICAgICAgICAgdGFza19yZXN1bHQgPSAwOworICAgICAgICAgIGZvcihqID0gMDsgaiA8IE5VTV9UQVNLUzsgaisrKQorICAgICAgICAgICAgaSsrOworICAgICAgICAgIC8vdGhpcyBzaG91bGQgYmUgZmlyc3Rwcml2YXRlIGltcGxpY2l0bHkKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgdGFza3dhaXQKKyAgICAgIHJlc3VsdCA9ICh0YXNrX3Jlc3VsdCAmJiBpPT01KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3Rhc2tfaW1wX2ZpcnN0cHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2tfcHJpb3JpdHkuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrX3ByaW9yaXR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I2MjM2MAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrX3ByaW9yaXR5LmMKQEAgLTAsMCArMSwyMiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUgJiYgZW52IE9NUF9NQVhfVEFTS19QUklPUklUWT00MiAlbGlib21wLXJ1bgorLy8gVGVzdCBPTVAgNC41IHRhc2sgcHJpb3JpdGllcworLy8gQ3VycmVudGx5IG9ubHkgQVBJIGZ1bmN0aW9uIGFuZCBlbnZpcmFibGUgcGFyc2luZyBpbXBsZW1lbnRlZC4KKy8vIFRlc3QgZW52aXJvbm1lbnQgc2V0cyBlbnZpcmFibGU6IE9NUF9NQVhfVEFTS19QUklPUklUWT00MiBhcyB0ZXN0ZWQgYmVsb3cuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvbXAuaD4KKworaW50IG1haW4gKHZvaWQpIHsKKyAgICBpbnQgcGFzc2VkOworCisgICAgcGFzc2VkID0gKG9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkoKSA9PSA0Mik7CisgICAgcHJpbnRmKCJHb3QgJWRcbiIsIG9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkoKSk7CisKKyAgICBpZiAocGFzc2VkKSB7CisgICAgICAgcHJpbnRmKCJwYXNzZWRcbiIpOworICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHByaW50ZigiZmFpbGVkXG4iKTsKKyAgICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2tfcHJpdmF0ZS5jIGIvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2tfcHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhOTM3MTYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza19wcml2YXRlLmMKQEAgLTAsMCArMSw1MyBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLyogVXRpbGl0eSBmdW5jdGlvbiBkbyBzcGVuZCBzb21lIHRpbWUgaW4gYSBsb29wICovCitpbnQgdGVzdF9vbXBfdGFza19wcml2YXRlKCkKK3sKKyAgaW50IGk7CisgIGludCBrbm93bl9zdW07CisgIGludCBzdW0gPSAwOworICBpbnQgcmVzdWx0ID0gMDsgLyogY291bnRzIHRoZSB3cm9uZyBzdW1zIGZyb20gdGFza3MgKi8KKworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICAjcHJhZ21hIG9tcCB0YXNrIHByaXZhdGUoc3VtKSBzaGFyZWQocmVzdWx0LCBrbm93bl9zdW0pCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAvL2lmIHN1bSBpcyBwcml2YXRlLCBpbml0aWFsaXplIHRvIDAKKyAgICAgICAgICBzdW0gPSAwOworICAgICAgICAgIGZvciAoaiA9IDA7IGogPD0gTE9PUENPVU5UOyBqKyspIHsKKyAgICAgICAgICAgICNwcmFnbWEgb21wIGZsdXNoCisgICAgICAgICAgICBzdW0gKz0gajsKKyAgICAgICAgICB9CisgICAgICAgICAgLyogY2hlY2sgaWYgY2FsY3VsYXRlZCBzdW0gd2FzIHJpZ2h0ICovCisgICAgICAgICAgaWYgKHN1bSAhPSBrbm93bl9zdW0pIHsKKyAgICAgICAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgICB9CisgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKyAgICB9IC8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwqLworICByZXR1cm4gKHJlc3VsdCA9PSAwKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3Rhc2tfcHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2tfc2hhcmVkLmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza19zaGFyZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzA0MDI2Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2tfc2hhcmVkLmMKQEAgLTAsMCArMSw0MSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLyogVXRpbGl0eSBmdW5jdGlvbiBkbyBzcGVuZCBzb21lIHRpbWUgaW4gYSBsb29wICovCitpbnQgdGVzdF9vbXBfdGFza19pbXBfc2hhcmVkKCkKK3sKKyAgaW50IGk7CisgIGludCBrID0gMDsKKyAgaW50IHJlc3VsdCA9IDA7CisgIGk9MDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgZm9yIChrID0gMDsgayA8IE5VTV9UQVNLUzsgaysrKSB7CisgICAgICAjcHJhZ21hIG9tcCB0YXNrIHNoYXJlZChpKQorICAgICAgeworICAgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgICAgaSsrOworICAgICAgICAvL3RoaXMgc2hvdWxkIGJlIHNoYXJlZCBpbXBsaWNpdGx5CisgICAgICB9CisgICAgfQorICB9CisgIHJlc3VsdCA9IGk7CisgIHJldHVybiAoKHJlc3VsdCA9PSBOVU1fVEFTS1MpKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3Rhc2tfaW1wX3NoYXJlZCgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2tsb29wX2dyYWluc2l6ZS5jIGIvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2tsb29wX2dyYWluc2l6ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NDNkMGEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza2xvb3BfZ3JhaW5zaXplLmMKQEAgLTAsMCArMSwxMDkgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKy8vIFJVTjogJWxpYm9tcC1jb21waWxlICYmIGVudiBLTVBfVEFTS0xPT1BfTUlOX1RBU0tTPTEgJWxpYm9tcC1ydW4KKy8vIFVOU1VQUE9SVEVEOiBnY2MKKy8vIFdlIGRvIG5vdCB5ZXQgaGF2ZSB0aGUgR09NUCBpbnRlcmZhY2UgZm9yIHRhc2tsb29wCisvKgorICogVGVzdCBmb3IgdGFza2xvb3AKKyAqIE1ldGhvZDogY2FjdWxhdGUgaG93IG1hbnkgdGltZXMgdGhlIGl0ZXJhdGlvbiBzcGFjZSBpcyBkaXNwYXRjaGVkCisgKiAgICAgYW5kIGp1ZGdlIGlmIGVhY2ggZGlzcGF0Y2ggaGFzIHRoZSByZXF1ZXN0ZWQgZ3JhaW5zaXplCisgKiBJdCBpcyBwb3NzaWJsZSBmb3IgdHdvIGFkamFjZW50IGNodW5rcyBhcmUgZXhlY3V0ZWQgYnkgdGhlIHNhbWUgdGhyZWFkCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9tcC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworI2RlZmluZSBDRkRNQVhfU0laRSAxMTIwCisKK2ludCB0ZXN0X29tcF90YXNrbG9vcF9ncmFpbnNpemUoKQoreworICBpbnQgcmVzdWx0ID0gMDsKKyAgaW50IGksIGdyYWluc2l6ZSwgY291bnQsIHRtcF9jb3VudCwgbnVtX29mZjsKKyAgaW50ICp0bXAsICp0aWRzLCAqdGlkc0FycmF5OworCisgIHRpZHNBcnJheSA9IChpbnQgKiltYWxsb2Moc2l6ZW9mKGludCkgKiBDRkRNQVhfU0laRSk7CisgIHRpZHMgPSB0aWRzQXJyYXk7CisKKyAgZm9yIChncmFpbnNpemUgPSAxOyBncmFpbnNpemUgPCA0ODsgKytncmFpbnNpemUpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkdyYWluc2l6ZSAlZFxuIiwgZ3JhaW5zaXplKTsKKyAgICBjb3VudCA9IHRtcF9jb3VudCA9IG51bV9vZmYgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IENGRE1BWF9TSVpFOyArK2kpIHsKKyAgICAgIHRpZHNbaV0gPSAtMTsKKyAgICB9CisKKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcykKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBtYXN0ZXIKKyAgICAgICNwcmFnbWEgb21wIHRhc2tsb29wIGdyYWluc2l6ZShncmFpbnNpemUpCisgICAgICBmb3IgKGkgPSAwOyBpIDwgQ0ZETUFYX1NJWkU7IGkrKykgeworICAgICAgICB0aWRzW2ldID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IENGRE1BWF9TSVpFOyArK2kpIHsKKyAgICAgIGlmICh0aWRzW2ldID09IC0xKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICBJdGVyYXRpb24gJWQgbm90IHRvdWNoZWQhXG4iLCBpKTsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IENGRE1BWF9TSVpFIC0gMTsgKytpKSB7CisgICAgICBpZiAodGlkc1tpXSAhPSB0aWRzW2kgKyAxXSkgeworICAgICAgICBjb3VudCsrOworICAgICAgfQorICAgIH0KKworICAgIHRtcCA9IChpbnQgKiltYWxsb2Moc2l6ZW9mKGludCkgKiAoY291bnQgKyAxKSk7CisgICAgdG1wWzBdID0gMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBDRkRNQVhfU0laRSAtIDE7ICsraSkgeworICAgICAgaWYgKHRtcF9jb3VudCA+IGNvdW50KSB7CisgICAgICAgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS1cblRlc3RpbnRlcm5hbCBFcnJvcjogTGlzdCB0b28gIgorICAgICAgICAgICAgICAgInNtYWxsISEhXG4tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKHRpZHNbaV0gIT0gdGlkc1tpICsgMV0pIHsKKyAgICAgICAgdG1wX2NvdW50Kys7CisgICAgICAgIHRtcFt0bXBfY291bnRdID0gMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRtcFt0bXBfY291bnRdKys7CisgICAgICB9CisgICAgfQorCisgICAgLy8gaXMgZ3JhaW5zaXplIHN0YXRlbWVudCB3b3JraW5nPworICAgIGludCBudW1fdGFza3MgPSBDRkRNQVhfU0laRSAvIGdyYWluc2l6ZTsKKyAgICBpbnQgbXVsdGlwbGUxID0gQ0ZETUFYX1NJWkUgLyBudW1fdGFza3M7CisgICAgaW50IG11bHRpcGxlMiA9IENGRE1BWF9TSVpFIC8gbnVtX3Rhc2tzICsgMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgLy8gaXQgaXMgcG9zc2libGUgZm9yIDIgYWRqYWNlbnQgY2h1bmtzIGFzc2lnbmVkIHRvIGEgc2FtZSB0aHJlYWQKKyAgICAgIGlmICh0bXBbaV0gJSBtdWx0aXBsZTEgIT0gMCAmJiB0bXBbaV0gJSBtdWx0aXBsZTIgIT0gMCkgeworICAgICAgICBudW1fb2ZmKys7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG51bV9vZmYgPiAxKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgVGhlIG51bWJlciBvZiBiYWQgY2h1bmtzIGlzICVkXG4iLCBudW1fb2ZmKTsKKyAgICAgIHJlc3VsdCsrOworICAgIH0gZWxzZSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgRXZlcnl0aGluZyBva1xuIik7CisgICAgfQorCisgICAgZnJlZSh0bXApOworICB9CisgIGZyZWUodGlkc0FycmF5KTsKKyAgcmV0dXJuIChyZXN1bHQ9PTApOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvciAoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYgKCF0ZXN0X29tcF90YXNrbG9vcF9ncmFpbnNpemUoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrbG9vcF9udW1fdGFza3MuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrbG9vcF9udW1fdGFza3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTQ2NDYwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2tsb29wX251bV90YXNrcy5jCkBAIC0wLDAgKzEsNjkgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKy8vIFJVTjogJWxpYm9tcC1jb21waWxlICYmIGVudiBLTVBfVEFTS0xPT1BfTUlOX1RBU0tTPTEgJWxpYm9tcC1ydW4KKy8vIFVOU1VQUE9SVEVEOiBnY2MKKy8vIFdlIGRvIG5vdCB5ZXQgaGF2ZSB0aGUgR09NUCBpbnRlcmZhY2UgZm9yIHRhc2tsb29wCisvKgorICogVGVzdCBmb3IgdGFza2xvb3AKKyAqIE1ldGhvZDogY2FjdWxhdGUgaG93IG1hbnkgdGltZXMgdGhlIGl0ZXJhdGlvbiBzcGFjZSBpcyBkaXNwYXRjaGVkCisgKiAgICAgYW5kIGp1ZGdlIGlmIGVhY2ggZGlzcGF0Y2ggaGFzIHRoZSByZXF1ZXN0ZWQgZ3JhaW5zaXplCisgKiBJdCBpcyBwb3NzaWJsZSBmb3IgdHdvIGFkamFjZW50IGNodW5rcyBhcmUgZXhlY3V0ZWQgYnkgdGhlIHNhbWUgdGhyZWFkCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9tcC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworI2RlZmluZSBDRkRNQVhfU0laRSAxMTIwCisKK2ludCB0ZXN0X29tcF90YXNrbG9vcF9udW1fdGFza3MoKQoreworICBpbnQgaTsKKyAgaW50ICp0aWRzOworICBpbnQgKnRpZHNBcnJheTsKKyAgaW50IGNvdW50OworICBpbnQgcmVzdWx0ID0gMDsKKyAgaW50IG51bV90YXNrczsKKworICBmb3IgKG51bV90YXNrcyA9IDE7IG51bV90YXNrcyA8IDEyMDsgKytudW1fdGFza3MpIHsKKyAgICBjb3VudCA9IDA7CisgICAgdGlkc0FycmF5ID0gKGludCAqKW1hbGxvYyhzaXplb2YoaW50KSAqIENGRE1BWF9TSVpFKTsKKyAgICB0aWRzID0gdGlkc0FycmF5OworCisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKHRpZHMpCisgICAgeworICAgICAgaW50IGk7CisgICAgICAjcHJhZ21hIG9tcCBtYXN0ZXIKKyAgICAgICNwcmFnbWEgb21wIHRhc2tsb29wIG51bV90YXNrcyhudW1fdGFza3MpCisgICAgICBmb3IgKGkgPSAwOyBpIDwgQ0ZETUFYX1NJWkU7IGkrKykgeworICAgICAgICB0aWRzW2ldID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IENGRE1BWF9TSVpFIC0gMTsgKytpKSB7CisgICAgICBpZiAodGlkc1tpXSAhPSB0aWRzW2kgKyAxXSkgeworICAgICAgICBjb3VudCsrOworICAgICAgfQorICAgIH0KKworICAgIGlmIChjb3VudCA+IG51bV90YXNrcykgeworICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VudGVkIHRvbyBtYW55IHRhc2tzOiAod2FudGVkICVkLCBnb3QgJWQpXG4iLAorICAgICAgICAgICAgICBudW1fdGFza3MsIGNvdW50KTsKKyAgICAgIHJlc3VsdCsrOworICAgIH0KKyAgfQorCisgIHJldHVybiAocmVzdWx0PT0wKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IgKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmICghdGVzdF9vbXBfdGFza2xvb3BfbnVtX3Rhc2tzKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza3dhaXQuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrd2FpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYTBlYTcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza3dhaXQuYwpAQCAtMCwwICsxLDc0IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgdGVzdF9vbXBfdGFza3dhaXQoKQoreworICBpbnQgcmVzdWx0MSA9IDA7ICAgLyogU3RvcmVzIG51bWJlciBvZiBub3QgZmluaXNoZWQgdGFza3MgYWZ0ZXIgdGhlIHRhc2t3YWl0ICovCisgIGludCByZXN1bHQyID0gMDsgICAvKiBTdG9yZXMgbnVtYmVyIG9mIHdyb25nIGFycmF5IGVsZW1lbnRzIGF0IHRoZSBlbmQgKi8KKyAgaW50IGFycmF5W05VTV9UQVNLU107CisgIGludCBpOworCisgIC8qIGZpbGwgYXJyYXkgKi8KKyAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKQorICAgIGFycmF5W2ldID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgIC8qIEZpcnN0IHdlIGhhdmUgdG8gc3RvcmUgdGhlIHZhbHVlIG9mIHRoZSBsb29wIGluZGV4IGluIGEgbmV3IHZhcmlhYmxlCisgICAgICAgICAqIHdoaWNoIHdpbGwgYmUgcHJpdmF0ZSBmb3IgZWFjaCB0YXNrIGJlY2F1c2Ugb3RoZXJ3aXNlIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4KKyAgICAgICAgICogaWYgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgdGFzayB0YWtlcyBsb25nZXIgdGhhbiB0aGUgdGltZSB3aGljaCBpcyBuZWVkZWQgdG8KKyAgICAgICAgICogZW50ZXIgdGhlIG5leHQgc3RlcCBvZiB0aGUgbG9vcCEKKyAgICAgICAgICovCisgICAgICAgIGludCBteWk7CisgICAgICAgIG15aSA9IGk7CisgICAgICAgICNwcmFnbWEgb21wIHRhc2sKKyAgICAgICAgeworICAgICAgICAgIG15X3NsZWVwIChTTEVFUFRJTUUpOworICAgICAgICAgIGFycmF5W215aV0gPSAxOworICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgfSAvKiBlbmQgb2YgZm9yICovCisgICAgICAjcHJhZ21hIG9tcCB0YXNrd2FpdAorICAgICAgLyogY2hlY2sgaWYgYWxsIHRhc2tzIHdlcmUgZmluaXNoZWQgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykKKyAgICAgICAgaWYgKGFycmF5W2ldICE9IDEpCisgICAgICAgICAgcmVzdWx0MSsrOworCisgICAgICAvKiBnZW5lcmF0ZSBzb21lIG1vcmUgdGFza3Mgd2hpY2ggbm93IHNoYWxsIG92ZXJ3cml0ZQorICAgICAgICogdGhlIHZhbHVlcyBpbiB0aGUgdGlkcyBhcnJheSAqLworICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgIGludCBteWk7CisgICAgICAgIG15aSA9IGk7CisgICAgICAgICNwcmFnbWEgb21wIHRhc2sKKyAgICAgICAgeworICAgICAgICAgIGFycmF5W215aV0gPSAyOworICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgfSAvKiBlbmQgb2YgZm9yICovCisgICAgfSAvKiBlbmQgb2Ygc2luZ2xlICovCisgIH0gLyplbmQgb2YgcGFyYWxsZWwgKi8KKworICAvKiBmaW5hbCBjaGVjaywgaWYgYWxsIGFycmF5IGVsZW1lbnRzIGNvbnRhaW4gdGhlIHJpZ2h0IHZhbHVlczogKi8KKyAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgaWYgKGFycmF5W2ldICE9IDIpCisgICAgICByZXN1bHQyKys7CisgIH0KKyAgcmV0dXJuICgocmVzdWx0MSA9PSAwKSAmJiAocmVzdWx0MiA9PSAwKSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF90YXNrd2FpdCgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2t5aWVsZC5jIGIvZmluYWwvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2t5aWVsZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYjY5ODQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza3lpZWxkLmMKQEAgLTAsMCArMSw1OCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IHRlc3Rfb21wX3Rhc2t5aWVsZCgpCit7CisgIGludCBpOworICBpbnQgY291bnQgPSAwOworICBpbnQgc3RhcnRfdGlkW05VTV9UQVNLU107CisgIGludCBjdXJyZW50X3RpZFtOVU1fVEFTS1NdOworCisgIGZvciAoaT0wOyBpPCBOVU1fVEFTS1M7IGkrKykgeworICAgIHN0YXJ0X3RpZFtpXT0wOworICAgIGN1cnJlbnRfdGlkW2ldPTA7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgIGludCBteWkgPSBpOworICAgICAgICAjcHJhZ21hIG9tcCB0YXNrIHVudGllZAorICAgICAgICB7CisgICAgICAgICAgbXlfc2xlZXAoU0xFRVBUSU1FKTsKKyAgICAgICAgICBzdGFydF90aWRbbXlpXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgICNwcmFnbWEgb21wIHRhc2t5aWVsZAorICAgICAgICAgIGlmKChzdGFydF90aWRbbXlpXSAlMikgPT0wKXsKKyAgICAgICAgICAgIG15X3NsZWVwKFNMRUVQVElNRSk7CisgICAgICAgICAgICBjdXJyZW50X3RpZFtteWldID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgfSAvKmVuZCBvZiBpZiovCisgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKyAgICB9IC8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAgZm9yIChpPTA7aTxOVU1fVEFTS1M7IGkrKykgeworICAgIC8vcHJpbnRmKCJzdGFydF90aWRbJWRdPSVkLCBjdXJyZW50X3RpZFslZF09JWRcbiIsCisgICAgICAvL2ksIHN0YXJ0X3RpZFtpXSwgaSAsIGN1cnJlbnRfdGlkW2ldKTsKKyAgICBpZiAoY3VycmVudF90aWRbaV0gPT0gc3RhcnRfdGlkW2ldKQorICAgICAgY291bnQrKzsKKyAgfQorICByZXR1cm4gKGNvdW50PE5VTV9UQVNLUyk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF90YXNreWllbGQoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC90aHJlYWRwcml2YXRlL29tcF90aHJlYWRwcml2YXRlLmMgYi9maW5hbC9ydW50aW1lL3Rlc3QvdGhyZWFkcHJpdmF0ZS9vbXBfdGhyZWFkcHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZGQ4MGQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3QvdGhyZWFkcHJpdmF0ZS9vbXBfdGhyZWFkcHJpdmF0ZS5jCkBAIC0wLDAgKzEsMTAyIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisvKgorICogVGhyZWFkcHJpdmF0ZSBpcyB0ZXN0ZWQgaW4gMiB3YXlzOgorICogMS4gVGhlIGdsb2JhbCB2YXJpYWJsZSBkZWNsYXJlZCBhcyB0aHJlYWRwcml2YXRlIHNob3VsZCBoYXZlCisgKiAgbG9jYWwgY29weSBmb3IgZWFjaCB0aHJlYWQuIE90aGVyd2lzZSByYWNlIGNvbmRpdGlvbiBhbmQKKyAqICB3cm9uZyByZXN1bHQuCisgKiAyLiBJZiB0aGUgdmFsdWUgb2YgbG9jYWwgY29weSBpcyByZXRhaW5lZCBmb3IgdGhlIHR3byBhZGphY2VudAorICogIHBhcmFsbGVsIHJlZ2lvbnMKKyAqLworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitzdGF0aWMgaW50IHN1bTA9MDsKK3N0YXRpYyBpbnQgbXl2YWx1ZSA9IDA7CisKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoc3VtMCkKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUobXl2YWx1ZSkKKworaW50IHRlc3Rfb21wX3RocmVhZHByaXZhdGUoKQoreworICBpbnQgc3VtID0gMDsKKyAgaW50IGtub3duX3N1bTsKKyAgaW50IGk7CisgIGludCBpdGVyOworICBpbnQgKmRhdGE7CisgIGludCBzaXplOworICBpbnQgbnVtX2ZhaWxlZCA9IDA7CisgIGludCBteV9yYW5kb207CisgIG9tcF9zZXRfZHluYW1pYygwKTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKGkpCisgIHsKKyAgICBzdW0wID0gMDsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKSB7CisgICAgICBzdW0wID0gc3VtMCArIGk7CisgICAgfSAvKmVuZCBvZiBmb3IqLworICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgeworICAgICAgc3VtID0gc3VtICsgc3VtMDsKKyAgICB9IC8qZW5kIG9mIGNyaXRpY2FsICovCisgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgaWYgKGtub3duX3N1bSAhPSBzdW0gKSB7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiIGtub3duX3N1bSA9ICVkLCBzdW0gPSAlZFxuIiwga25vd25fc3VtLCBzdW0pOworICB9CisKKyAgLyogdGhlIG5leHQgcGFyYWxsZWwgcmVnaW9uIGlzIGp1c3QgdXNlZCB0byBnZXQgdGhlIG51bWJlciBvZiB0aHJlYWRzKi8KKyAgb21wX3NldF9keW5hbWljKDApOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgbWFzdGVyCisgICAgeworICAgICAgc2l6ZT1vbXBfZ2V0X251bV90aHJlYWRzKCk7CisgICAgICBkYXRhPShpbnQqKSBtYWxsb2Moc2l6ZSpzaXplb2YoaW50KSk7CisgICAgfQorICB9LyogZW5kIHBhcmFsbGVsKi8KKworICBzcmFuZCg0NSk7CisgIGZvciAoaXRlciA9IDA7IGl0ZXIgPCAxMDA7IGl0ZXIrKykgeworICAgIG15X3JhbmRvbSA9IHJhbmQoKTsgLyogcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgaXMKKyAgICAgICAgICAgICAgICAgY2FsbGVkIGluc2lkZSBzZXJpYWwgcmVnaW9uKi8KKworICAgIC8qIHRoZSBmaXJzdCBwYXJhbGxlbCByZWdpb24gaXMgdXNlZCB0byBpbml0aWFsaXllIG15dmFsdWUKKyAgICAgICBhbmQgdGhlIGFycmF5IHdpdGggbXlfcmFuZG9tK3JhbmsgKi8KKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgIGludCByYW5rOworICAgICAgcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKyAgICAgIG15dmFsdWUgPSBkYXRhW3JhbmtdID0gbXlfcmFuZG9tICsgcmFuazsKKyAgICB9CisKKyAgICAvKiB0aGUgc2Vjb25kIHBhcmFsbGVsIHJlZ2lvbiB2ZXJpZmllcyB0aGF0IHRoZQorICAgICAgIHZhbHVlIG9mICJteXZhbHVlIiBpcyByZXRhaW5lZCAqLworICAgICNwcmFnbWEgb21wIHBhcmFsbGVsIHJlZHVjdGlvbigrOm51bV9mYWlsZWQpCisgICAgeworICAgICAgaW50IHJhbms7CisgICAgICByYW5rID0gb21wX2dldF90aHJlYWRfbnVtICgpOworICAgICAgbnVtX2ZhaWxlZCA9IG51bV9mYWlsZWQgKyAobXl2YWx1ZSAhPSBkYXRhW3JhbmtdKTsKKyAgICAgIGlmKG15dmFsdWUgIT0gZGF0YVtyYW5rXSkgeworICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIgbXl2YWx1ZSA9ICVkLCBkYXRhW3JhbmtdPSAlZFxuIiwKKyAgICAgICAgICBteXZhbHVlLCBkYXRhW3JhbmtdKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZnJlZSAoZGF0YSk7CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSkgJiYgIW51bV9mYWlsZWQ7Cit9IC8qIGVuZCBvZiBjaGVja190aHJlYWRwcml2YXRlKi8KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3RocmVhZHByaXZhdGUoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC90aHJlYWRwcml2YXRlL29tcF90aHJlYWRwcml2YXRlX2Zvci5jIGIvZmluYWwvcnVudGltZS90ZXN0L3RocmVhZHByaXZhdGUvb21wX3RocmVhZHByaXZhdGVfZm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM0MmU2MwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC90aHJlYWRwcml2YXRlL29tcF90aHJlYWRwcml2YXRlX2Zvci5jCkBAIC0wLDAgKzEsNDggQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIGludCBpOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShpKQorCitpbnQgdGVzdF9vbXBfdGhyZWFkcHJpdmF0ZV9mb3IoKQoreworICBpbnQga25vd25fc3VtOworICBpbnQgc3VtOworCisgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgc3VtID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IHN1bTAgPSAwLCBpMDsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkwID0gMTsgaTAgPD0gTE9PUENPVU5UOyBpMCsrKSB7CisgICAgICBpID0gaTA7CisgICAgICBzdW0wID0gc3VtMCArIGk7CisgICAgfQorICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgeworICAgICAgc3VtID0gc3VtICsgc3VtMDsKKyAgICB9CisgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisKKyAgaWYgKGtub3duX3N1bSAhPSBzdW0gKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIga25vd25fc3VtID0gJWQsIHN1bSA9ICVkXG4iLCBrbm93bl9zdW0sIHN1bSk7CisgIH0KKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30gLyogZW5kIG9mIGNoZWNrX3RocmVhZHByaXZhdGUqLworCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfdGhyZWFkcHJpdmF0ZV9mb3IoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3IvYnVnX3NldF9zY2hlZHVsZV8wLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL2J1Z19zZXRfc2NoZWR1bGVfMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4OWUyMzkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL2J1Z19zZXRfc2NoZWR1bGVfMC5jCkBAIC0wLDAgKzEsNDAgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9tcC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLyogVGVzdCB0aGF0IHRoZSBjaHVuayBzaXplIGlzIHNldCB0byBkZWZhdWx0ICgxKSB3aGVuCisgICBjaHVuayBzaXplIDw9IDAgaXMgc3BlY2lmaWVkICovCitpbnQgYSA9IDA7CisKK2ludCB0ZXN0X3NldF9zY2hlZHVsZV8wKCkKK3sKKyAgaW50IGk7CisgIGEgPSAwOworICBvbXBfc2V0X3NjaGVkdWxlKG9tcF9zY2hlZF9keW5hbWljLDApOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUocnVudGltZSkKKyAgICBmb3IoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgIGErKzsKKyAgICAgIGlmKGEgPiAxMCkKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGE9PTEwOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9zZXRfc2NoZWR1bGVfMCgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9rbXBfZG9hY3Jvc3NfY2hlY2suYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Iva21wX2RvYWNyb3NzX2NoZWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA4ODk2NQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Iva21wX2RvYWNyb3NzX2NoZWNrLmMKQEAgLTAsMCArMSw1NiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNkZWZpbmUgTiAgIDEwMDAKKworc3RydWN0IGRpbSB7CisgIGxvbmcgbG9uZyBsbzsgLy8gbG93ZXIKKyAgbG9uZyBsb25nIHVwOyAvLyB1cHBlcgorICBsb25nIGxvbmcgc3Q7IC8vIHN0cmlkZQorfTsKK2V4dGVybiB2b2lkIF9fa21wY19kb2Fjcm9zc19pbml0KHZvaWQqLCBpbnQsIGludCwgc3RydWN0IGRpbSAqKTsKK2V4dGVybiB2b2lkIF9fa21wY19kb2Fjcm9zc193YWl0KHZvaWQqLCBpbnQsIGxvbmcgbG9uZyopOworZXh0ZXJuIHZvaWQgX19rbXBjX2RvYWNyb3NzX3Bvc3Qodm9pZCosIGludCwgbG9uZyBsb25nKik7CitleHRlcm4gdm9pZCBfX2ttcGNfZG9hY3Jvc3NfZmluaSh2b2lkKiwgaW50KTsKK2V4dGVybiBpbnQgX19rbXBjX2dsb2JhbF90aHJlYWRfbnVtKHZvaWQqKTsKKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IGl0ZXJbTl07CisgIHN0cnVjdCBkaW0gZGltczsKKyAgZm9yKCBpID0gMDsgaSA8IE47ICsraSApCisgICAgaXRlcltpXSA9IDE7CisgIGRpbXMubG8gPSAxOworICBkaW1zLnVwID0gTi0xOworICBkaW1zLnN0ID0gMTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMoNCkKKyAgeworICAgIGludCBpLCBndGlkOworICAgIGxvbmcgbG9uZyB2ZWM7CisgICAgZ3RpZCA9IF9fa21wY19nbG9iYWxfdGhyZWFkX251bShOVUxMKTsKKyAgICBfX2ttcGNfZG9hY3Jvc3NfaW5pdChOVUxMLGd0aWQsMSwmZGltcyk7IC8vIHRocmVhZCBzdGFydHMgdGhlIGxvb3AKKyAgICAjcHJhZ21hIG9tcCBmb3Igbm93YWl0IHNjaGVkdWxlKGR5bmFtaWMpCisgICAgZm9yKCBpID0gMTsgaSA8IE47ICsraSApCisgICAgeworICAgICAgLy8gcnVudGltZSBjYWxsIGNvcnJlc3BvbmRpbmcgdG8gI3ByYWdtYSBvbXAgb3JkZXJlZCBkZXBlbmQoc2luazppLTEpCisgICAgICB2ZWM9aS0xOworICAgICAgX19rbXBjX2RvYWNyb3NzX3dhaXQoTlVMTCxndGlkLCZ2ZWMpOworICAgICAgLy8gdXNlcidzIGNvZGUKKyAgICAgIGl0ZXJbaV0gPSBpdGVyW2ktMV0gKyAxOworICAgICAgLy8gcnVudGltZSBjYWxsIGNvcnJlc3BvbmRpbmcgdG8gI3ByYWdtYSBvbXAgb3JkZXJlZCBkZXBlbmQoc291cmNlKQorICAgICAgdmVjPWk7CisgICAgICBfX2ttcGNfZG9hY3Jvc3NfcG9zdChOVUxMLGd0aWQsJnZlYyk7CisgICAgfQorICAgIC8vIHRocmVhZCBmaW5pc2hlcyB0aGUgbG9vcCAoc2hvdWxkIGJlIGJlZm9yZSB0aGUgbG9vcCBiYXJyaWVyKQorICAgIF9fa21wY19kb2Fjcm9zc19maW5pKE5VTEwsZ3RpZCk7CisgIH0KKyAgaWYoIGl0ZXJbTi0xXSA9PSBOICkgeworICAgIHByaW50ZigicGFzc2VkXG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoImZhaWxlZCAlZCAhPSAlZFxuIiwgaXRlcltOLTFdLCBOKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9rbXBfc2NoX3NpbWRfZ3VpZGVkLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL2ttcF9zY2hfc2ltZF9ndWlkZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzZmOTRiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9rbXBfc2NoX3NpbWRfZ3VpZGVkLmMKQEAgLTAsMCArMSw0MTAgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKy8qCisgIFRlc3QgZm9yIHRoZSAnc2NoZWR1bGUoc2ltZDpndWlkZWQpJyBjbGF1c2UuCisgIENvbXBpbGVyIG5lZWRzIHRvIGdlbmVyYXRlIGEgZHluYW1pYyBkaXNwYXRjaGluZyBhbmQgcGFzcyB0aGUgc2NoZWR1bGUKKyAgdmFsdWUgNDYgdG8gdGhlIE9wZW5NUCBSVEwuIFRlc3QgdXNlcyBudW1lcm91cyBsb29wIHBhcmFtZXRlciBjb21iaW5hdGlvbnMuCisqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b21wLmg+CisKKyNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMikKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZGVmaW5lIGRlbGF5KCkgU2xlZXAoMSk7CisjZWxzZQorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2RlZmluZSBkZWxheSgpIHVzbGVlcCgxMCk7CisjZW5kaWYKKworLy8gdW5jb21tZW50IGZvciBkZWJ1ZyBkaWFnbm9zdGljczoKKy8vI2RlZmluZSBERUJVRworCisjZGVmaW5lIFNJTURfTEVOIDQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWYXJpb3VzIGRlZmluaXRpb25zIGNvcGllZCBmcm9tIE9wZW5NUCBSVEwKK2VudW0gc2NoZWQgeworICBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZF9jaHVua2VkID0gNDUsCisgIGttcF9zY2hfZ3VpZGVkX3NpbWQgPSA0NiwKKyAga21wX3NjaF9ydW50aW1lX3NpbWQgPSA0NywKK307Cit0eXBlZGVmIHVuc2lnbmVkIHUzMjsKK3R5cGVkZWYgbG9uZyBsb25nIGk2NDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHU2NDsKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IHJlc2VydmVkXzE7CisgIGludCBmbGFnczsKKyAgaW50IHJlc2VydmVkXzI7CisgIGludCByZXNlcnZlZF8zOworICBjaGFyICpwc291cmNlOworfSBpZDsKKworZXh0ZXJuIGludCBfX2ttcGNfZ2xvYmFsX3RocmVhZF9udW0oaWQqKTsKK2V4dGVybiB2b2lkIF9fa21wY19iYXJyaWVyKGlkKiwgaW50IGd0aWQpOworZXh0ZXJuIHZvaWQgX19rbXBjX2Rpc3BhdGNoX2luaXRfNChpZCosIGludCwgZW51bSBzY2hlZCwgaW50LCBpbnQsIGludCwgaW50KTsKK2V4dGVybiB2b2lkIF9fa21wY19kaXNwYXRjaF9pbml0XzgoaWQqLCBpbnQsIGVudW0gc2NoZWQsIGk2NCwgaTY0LCBpNjQsIGk2NCk7CitleHRlcm4gaW50IF9fa21wY19kaXNwYXRjaF9uZXh0XzQoaWQqLCBpbnQsIHZvaWQqLCB2b2lkKiwgdm9pZCosIHZvaWQqKTsKK2V4dGVybiBpbnQgX19rbXBjX2Rpc3BhdGNoX25leHRfOChpZCosIGludCwgdm9pZCosIHZvaWQqLCB2b2lkKiwgdm9pZCopOworLy8gRW5kIG9mIGRlZmluaXRpb25zIGNvcGllZCBmcm9tIE9wZW5NUCBSVEwuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyBpZCBsb2MgPSB7MCwgMiwgMCwgMCwgIjtmaWxlO2Z1bmM7MDswOzsifTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgcnVuX2xvb3BfNjQoaTY0IGxvb3BfbGIsIGk2NCBsb29wX3ViLCBpNjQgbG9vcF9zdCwgaW50IGxvb3BfY2h1bmspIHsKKyAgaW50IGVyciA9IDA7CisgIHN0YXRpYyBpbnQgdm9sYXRpbGUgbG9vcF9zeW5jID0gMDsKKyAgaTY0IGxiOyAgIC8vIENodW5rIGxvd2VyIGJvdW5kCisgIGk2NCB1YjsgICAvLyBDaHVuayB1cHBlciBib3VuZAorICBpNjQgc3Q7ICAgLy8gQ2h1bmsgc3RyaWRlCisgIGludCByYzsKKyAgaW50IHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICBpbnQgZ3RpZCA9IHRpZDsKKyAgaW50IGxhc3Q7CisjaWYgREVCVUcKKyAgcHJpbnRmKCJydW5fbG9vcF88JWQ+KGxiPSVkLCB1Yj0lZCwgc3Q9JWQsIGNoPSVkKVxuIiwKKyAgICAoaW50KXNpemVvZihpNjQpLCBndGlkLCB0aWQsCisgICAgKGludClsb29wX2xiLCAoaW50KWxvb3BfdWIsIChpbnQpbG9vcF9zdCwgbG9vcF9jaHVuayk7CisjZW5kaWYKKyAgLy8gRG9uJ3QgdGVzdCBkZWdlbmVyYXRlIGNhc2VzIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBkaXNjb3ZlcmVkIGJ5IGNvZGVnZW4KKyAgaWYgKGxvb3Bfc3QgPT0gMCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKGxvb3Bfc3QgPiAwID8gbG9vcF9sYiA+IGxvb3BfdWIgOiBsb29wX2xiIDwgbG9vcF91YikKKyAgICByZXR1cm4gMDsKKworICBfX2ttcGNfZGlzcGF0Y2hfaW5pdF84KCZsb2MsIGd0aWQsIGttcF9zY2hfZ3VpZGVkX3NpbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcF9sYiwgbG9vcF91YiwgbG9vcF9zdCwgbG9vcF9jaHVuayk7CisgIGlmICh0aWQgPT0gMCkgeworICAgIC8vIExldCB0aGUgbWFzdGVyIHRocmVhZCBoYW5kbGUgdGhlIGNodW5rcyBhbG9uZQorICAgIGludCBjaHVuazsgICAgICAvLyBObyBvZiBjdXJyZW50IGNodW5rCisgICAgaTY0IG5leHRfbGI7ICAgIC8vIExvd2VyIGJvdW5kIG9mIHRoZSBuZXh0IGNodW5rCisgICAgaTY0IGxhc3RfdWI7ICAgIC8vIFVwcGVyIGJvdW5kIG9mIHRoZSBsYXN0IHByb2Nlc3NlZCBjaHVuaworICAgIHU2NCBjdXI7ICAgICAgICAvLyBOdW1iZXIgb2YgaW50ZXJhdGlvbnMgaW4gIGN1cnJlbnQgY2h1bmsKKyAgICB1NjQgbWF4OyAgICAgICAgLy8gTWF4IGFsbG93ZWQgaXRlcmF0aW9ucyBmb3IgY3VycmVudCBjaHVuaworICAgIGludCB1bmRlcnNpemVkID0gMDsKKworICAgIGNodW5rID0gMDsKKyAgICBuZXh0X2xiID0gbG9vcF9sYjsKKyAgICBtYXggPSAobG9vcF91YiAtIGxvb3BfbGIpIC8gbG9vcF9zdCArIDE7CisgICAgLy8gVGhlIGZpcnN0IGNodW5rIGNhbiBjb25zdW1lIGFsbCBpdGVyYXRpb25zCisgICAgd2hpbGUgKF9fa21wY19kaXNwYXRjaF9uZXh0XzgoJmxvYywgZ3RpZCwgJmxhc3QsICZsYiwgJnViLCAmc3QpKSB7CisgICAgICArKyBjaHVuazsKKyNpZiBERUJVRworICAgICAgcHJpbnRmKCJjaHVuaz0lZCwgbGI9JWQsIHViPSVkXG4iLCBjaHVuaywgKGludClsYiwgKGludCl1Yik7CisjZW5kaWYKKyAgICAgIC8vIENoZWNrIGlmIHByZXZpb3VzIGNodW5rIChpdCBpcyBub3QgdGhlIGZpbmFsIGNodW5rKSBpcyB1bmRlcnNpemVkCisgICAgICBpZiAodW5kZXJzaXplZCkgeworICAgICAgICBwcmludGYoIkVycm9yIHdpdGggY2h1bmsgJWRcbiIsIGNodW5rKTsKKyAgICAgICAgZXJyKys7CisgICAgICB9CisgICAgICAvLyBDaGVjayBsb3dlciBhbmQgdXBwZXIgYm91bmRzCisgICAgICBpZiAobGIgIT0gbmV4dF9sYikgeworICAgICAgICBwcmludGYoIkVycm9yIHdpdGggbGIgJWQsICVkLCBjaCAlZFxuIiwgKGludClsYiwgKGludCluZXh0X2xiLCBjaHVuayk7CisgICAgICAgIGVycisrOworICAgICAgfQorICAgICAgaWYgKGxvb3Bfc3QgPiAwKSB7CisgICAgICAgIGlmICghKHViIDw9IGxvb3BfdWIpKSB7CisgICAgICAgICAgcHJpbnRmKCJFcnJvciB3aXRoIHViICVkLCAlZCwgY2ggJWRcbiIsIChpbnQpdWIsIChpbnQpbG9vcF91YiwgY2h1bmspOworICAgICAgICAgIGVycisrOworICAgICAgICB9CisgICAgICAgIGlmICghKGxiIDw9IHViKSkgeworICAgICAgICAgIHByaW50ZigiRXJyb3Igd2l0aCBib3VuZHMgJWQsICVkLCAlZFxuIiwgKGludClsYiwgKGludCl1YiwgY2h1bmspOworICAgICAgICAgIGVycisrOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoISh1YiA+PSBsb29wX3ViKSkgeworICAgICAgICAgIHByaW50ZigiRXJyb3Igd2l0aCB1YiAlZCwgJWQsICVkXG4iLCAoaW50KXViLCAoaW50KWxvb3BfdWIsIGNodW5rKTsKKyAgICAgICAgICBlcnIrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShsYiA+PSB1YikpIHsKKyAgICAgICAgICBwcmludGYoIkVycm9yIHdpdGggYm91bmRzICVkLCAlZCwgJWRcbiIsIChpbnQpbGIsIChpbnQpdWIsIGNodW5rKTsKKyAgICAgICAgICBlcnIrKzsKKyAgICAgICAgfQorICAgICAgfTsgLy8gaWYKKyAgICAgIC8vIFN0cmlkZSBzaG91bGQgbm90IGNoYW5nZQorICAgICAgaWYgKCEoc3QgPT0gbG9vcF9zdCkpIHsKKyAgICAgICAgcHJpbnRmKCJFcnJvciB3aXRoIHN0ICVkLCAlZCwgY2ggJWRcbiIsIChpbnQpc3QsIChpbnQpbG9vcF9zdCwgY2h1bmspOworICAgICAgICBlcnIrKzsKKyAgICAgIH0KKyAgICAgIGN1ciA9ICh1YiAtIGxiKSAvIGxvb3Bfc3QgKyAxOworICAgICAgLy8gR3VpZGVkIHNjaGVkdWxpbmcgdXNlcyBGUCBjb21wdXRhdGlvbnMsIHNvIGN1cnJlbnQgY2h1bmsgbWF5CisgICAgICAvLyBiZSBhIGJpdCBiaWdnZXIgKCsxKSB0aGFuIGFsbG93ZWQgbWF4aW11bQorICAgICAgaWYgKCEoY3VyIDw9IG1heCArIDEpKSB7CisgICAgICAgIHByaW50ZigiRXJyb3Igd2l0aCBpdGVyICVkLCAlZFxuIiwgY3VyLCBtYXgpOworICAgICAgICBlcnIrKzsKKyAgICAgIH0KKyAgICAgIC8vIFVwZGF0ZSBtYXhpbXVtIGZvciB0aGUgbmV4dCBjaHVuaworICAgICAgaWYgKGN1ciA8IG1heCkKKyAgICAgICAgbWF4ID0gY3VyOworICAgICAgbmV4dF9sYiA9IHViICsgbG9vcF9zdDsKKyAgICAgIGxhc3RfdWIgPSB1YjsKKyAgICAgIHVuZGVyc2l6ZWQgPSAoY3VyIDwgbG9vcF9jaHVuayk7CisgICAgfTsgLy8gd2hpbGUKKyAgICAvLyBNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGNodW5rCisgICAgaWYgKCEoY2h1bmsgPiAwKSkgeworICAgICAgcHJpbnRmKCJFcnJvciB3aXRoIGNodW5rICVkXG4iLCBjaHVuayk7CisgICAgICBlcnIrKzsKKyAgICB9CisgICAgLy8gTXVzdCBoYXZlIHRoZSByaWdodCBsYXN0IGl0ZXJhdGlvbiBpbmRleAorICAgIGlmIChsb29wX3N0ID4gMCkgeworICAgICAgaWYgKCEobGFzdF91YiA8PSBsb29wX3ViKSkgeworICAgICAgICBwcmludGYoIkVycm9yIHdpdGggbGFzdDEgJWQsICVkLCBjaCAlZFxuIiwKKyAgICAgICAgICAgICAgIChpbnQpbGFzdF91YiwgKGludClsb29wX3ViLCBjaHVuayk7CisgICAgICAgIGVycisrOworICAgICAgfQorICAgICAgaWYgKCEobGFzdF91YiArIGxvb3Bfc3QgPiBsb29wX3ViKSkgeworICAgICAgICBwcmludGYoIkVycm9yIHdpdGggbGFzdDIgJWQsICVkLCAlZCwgY2ggJWRcbiIsCisgICAgICAgICAgICAgICAoaW50KWxhc3RfdWIsIChpbnQpbG9vcF9zdCwgKGludClsb29wX3ViLCBjaHVuayk7CisgICAgICAgIGVycisrOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoIShsYXN0X3ViID49IGxvb3BfdWIpKSB7CisgICAgICAgIHByaW50ZigiRXJyb3Igd2l0aCBsYXN0MSAlZCwgJWQsIGNoICVkXG4iLAorICAgICAgICAgICAgICAgKGludClsYXN0X3ViLCAoaW50KWxvb3BfdWIsIGNodW5rKTsKKyAgICAgICAgZXJyKys7CisgICAgICB9CisgICAgICBpZiAoIShsYXN0X3ViICsgbG9vcF9zdCA8IGxvb3BfdWIpKSB7CisgICAgICAgIHByaW50ZigiRXJyb3Igd2l0aCBsYXN0MiAlZCwgJWQsICVkLCBjaCAlZFxuIiwKKyAgICAgICAgICAgICAgIChpbnQpbGFzdF91YiwgKGludClsb29wX3N0LCAoaW50KWxvb3BfdWIsIGNodW5rKTsKKyAgICAgICAgZXJyKys7CisgICAgICB9CisgICAgfTsgLy8gaWYKKyAgICAvLyBMZXQgbm9uLW1hc3RlciB0aHJlYWRzIGdvCisgICAgbG9vcF9zeW5jID0gMTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgaTsKKyAgICAvLyBXb3JrZXJzIHdhaXQgZm9yIG1hc3RlciB0aHJlYWQgdG8gZmluaXNoLCB0aGVuIGNhbGwgX19rbXBjX2Rpc3BhdGNoX25leHQKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTAwMDAwMDsgKysgaSkgeworICAgICAgaWYgKGxvb3Bfc3luYyAhPSAwKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBmb3IgaQorICAgIHdoaWxlIChsb29wX3N5bmMgPT0gMCkgeworICAgICAgZGVsYXkoKTsKKyAgICB9OyAvLyB3aGlsZQorICAgIC8vIEF0IHRoaXMgbW9tZW50IHdlIGRvIG5vdCBoYXZlIGFueSBtb3JlIGNodW5rcyAtLSBhbGwgdGhlIGNodW5rcyBhbHJlYWR5CisgICAgLy8gcHJvY2Vzc2VkIGJ5IG1hc3RlciB0aHJlYWQKKyAgICByYyA9IF9fa21wY19kaXNwYXRjaF9uZXh0XzgoJmxvYywgZ3RpZCwgJmxhc3QsICZsYiwgJnViLCAmc3QpOworICAgIGlmIChyYykgeworICAgICAgcHJpbnRmKCJFcnJvciByZXR1cm4gdmFsdWVcbiIpOworICAgICAgZXJyKys7CisgICAgfQorICB9OyAvLyBpZgorCisgIF9fa21wY19iYXJyaWVyKCZsb2MsIGd0aWQpOworICBpZiAodGlkID09IDApIHsKKyAgICAgIGxvb3Bfc3luYyA9IDA7ICAgIC8vIFJlc3RvcmUgb3JpZ2luYWwgc3RhdGUKKyNpZiBERUJVRworICAgICAgcHJpbnRmKCJydW5fbG9vcF82NCgpOiBhdCB0aGUgZW5kXG4iKTsKKyNlbmRpZgorICB9OyAvLyBpZgorICBfX2ttcGNfYmFycmllcigmbG9jLCBndGlkKTsKKyAgcmV0dXJuIGVycjsKK30gLy8gcnVuX2xvb3AKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgcnVuX2xvb3BfMzIoaW50IGxvb3BfbGIsIGludCBsb29wX3ViLCBpbnQgbG9vcF9zdCwgaW50IGxvb3BfY2h1bmspIHsKKyAgaW50IGVyciA9IDA7CisgIHN0YXRpYyBpbnQgdm9sYXRpbGUgbG9vcF9zeW5jID0gMDsKKyAgaW50IGxiOyAgIC8vIENodW5rIGxvd2VyIGJvdW5kCisgIGludCB1YjsgICAvLyBDaHVuayB1cHBlciBib3VuZAorICBpbnQgc3Q7ICAgLy8gQ2h1bmsgc3RyaWRlCisgIGludCByYzsKKyAgaW50IHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICBpbnQgZ3RpZCA9IHRpZDsKKyAgaW50IGxhc3Q7CisjaWYgREVCVUcKKyAgcHJpbnRmKCJydW5fbG9vcF88JWQ+KGxiPSVkLCB1Yj0lZCwgc3Q9JWQsIGNoPSVkKVxuIiwKKyAgICAoaW50KXNpemVvZihpbnQpLCBndGlkLCB0aWQsCisgICAgKGludClsb29wX2xiLCAoaW50KWxvb3BfdWIsIChpbnQpbG9vcF9zdCwgbG9vcF9jaHVuayk7CisjZW5kaWYKKyAgLy8gRG9uJ3QgdGVzdCBkZWdlbmVyYXRlIGNhc2VzIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBkaXNjb3ZlcmVkIGJ5IGNvZGVnZW4KKyAgaWYgKGxvb3Bfc3QgPT0gMCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKGxvb3Bfc3QgPiAwID8gbG9vcF9sYiA+IGxvb3BfdWIgOiBsb29wX2xiIDwgbG9vcF91YikKKyAgICByZXR1cm4gMDsKKworICBfX2ttcGNfZGlzcGF0Y2hfaW5pdF80KCZsb2MsIGd0aWQsIGttcF9zY2hfZ3VpZGVkX3NpbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcF9sYiwgbG9vcF91YiwgbG9vcF9zdCwgbG9vcF9jaHVuayk7CisgIGlmICh0aWQgPT0gMCkgeworICAgIC8vIExldCB0aGUgbWFzdGVyIHRocmVhZCBoYW5kbGUgdGhlIGNodW5rcyBhbG9uZQorICAgIGludCBjaHVuazsgICAgICAvLyBObyBvZiBjdXJyZW50IGNodW5rCisgICAgaW50IG5leHRfbGI7ICAgIC8vIExvd2VyIGJvdW5kIG9mIHRoZSBuZXh0IGNodW5rCisgICAgaW50IGxhc3RfdWI7ICAgIC8vIFVwcGVyIGJvdW5kIG9mIHRoZSBsYXN0IHByb2Nlc3NlZCBjaHVuaworICAgIHU2NCBjdXI7ICAgICAgICAvLyBOdW1iZXIgb2YgaW50ZXJhdGlvbnMgaW4gIGN1cnJlbnQgY2h1bmsKKyAgICB1NjQgbWF4OyAgICAgICAgLy8gTWF4IGFsbG93ZWQgaXRlcmF0aW9ucyBmb3IgY3VycmVudCBjaHVuaworICAgIGludCB1bmRlcnNpemVkID0gMDsKKworICAgIGNodW5rID0gMDsKKyAgICBuZXh0X2xiID0gbG9vcF9sYjsKKyAgICBtYXggPSAobG9vcF91YiAtIGxvb3BfbGIpIC8gbG9vcF9zdCArIDE7CisgICAgLy8gVGhlIGZpcnN0IGNodW5rIGNhbiBjb25zdW1lIGFsbCBpdGVyYXRpb25zCisgICAgd2hpbGUgKF9fa21wY19kaXNwYXRjaF9uZXh0XzQoJmxvYywgZ3RpZCwgJmxhc3QsICZsYiwgJnViLCAmc3QpKSB7CisgICAgICArKyBjaHVuazsKKyNpZiBERUJVRworICAgICAgcHJpbnRmKCJjaHVuaz0lZCwgbGI9JWQsIHViPSVkXG4iLCBjaHVuaywgKGludClsYiwgKGludCl1Yik7CisjZW5kaWYKKyAgICAgIC8vIENoZWNrIGlmIHByZXZpb3VzIGNodW5rIChpdCBpcyBub3QgdGhlIGZpbmFsIGNodW5rKSBpcyB1bmRlcnNpemVkCisgICAgICBpZiAodW5kZXJzaXplZCkgeworICAgICAgICBwcmludGYoIkVycm9yIHdpdGggY2h1bmsgJWRcbiIsIGNodW5rKTsKKyAgICAgICAgZXJyKys7CisgICAgICB9CisgICAgICAvLyBDaGVjayBsb3dlciBhbmQgdXBwZXIgYm91bmRzCisgICAgICBpZiAobGIgIT0gbmV4dF9sYikgeworICAgICAgICBwcmludGYoIkVycm9yIHdpdGggbGIgJWQsICVkLCBjaCAlZFxuIiwgKGludClsYiwgKGludCluZXh0X2xiLCBjaHVuayk7CisgICAgICAgIGVycisrOworICAgICAgfQorICAgICAgaWYgKGxvb3Bfc3QgPiAwKSB7CisgICAgICAgIGlmICghKHViIDw9IGxvb3BfdWIpKSB7CisgICAgICAgICAgcHJpbnRmKCJFcnJvciB3aXRoIHViICVkLCAlZCwgY2ggJWRcbiIsIChpbnQpdWIsIChpbnQpbG9vcF91YiwgY2h1bmspOworICAgICAgICAgIGVycisrOworICAgICAgICB9CisgICAgICAgIGlmICghKGxiIDw9IHViKSkgeworICAgICAgICAgIHByaW50ZigiRXJyb3Igd2l0aCBib3VuZHMgJWQsICVkLCAlZFxuIiwgKGludClsYiwgKGludCl1YiwgY2h1bmspOworICAgICAgICAgIGVycisrOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoISh1YiA+PSBsb29wX3ViKSkgeworICAgICAgICAgIHByaW50ZigiRXJyb3Igd2l0aCB1YiAlZCwgJWQsICVkXG4iLCAoaW50KXViLCAoaW50KWxvb3BfdWIsIGNodW5rKTsKKyAgICAgICAgICBlcnIrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShsYiA+PSB1YikpIHsKKyAgICAgICAgICBwcmludGYoIkVycm9yIHdpdGggYm91bmRzICVkLCAlZCwgJWRcbiIsIChpbnQpbGIsIChpbnQpdWIsIGNodW5rKTsKKyAgICAgICAgICBlcnIrKzsKKyAgICAgICAgfQorICAgICAgfTsgLy8gaWYKKyAgICAgIC8vIFN0cmlkZSBzaG91bGQgbm90IGNoYW5nZQorICAgICAgaWYgKCEoc3QgPT0gbG9vcF9zdCkpIHsKKyAgICAgICAgcHJpbnRmKCJFcnJvciB3aXRoIHN0ICVkLCAlZCwgY2ggJWRcbiIsIChpbnQpc3QsIChpbnQpbG9vcF9zdCwgY2h1bmspOworICAgICAgICBlcnIrKzsKKyAgICAgIH0KKyAgICAgIGN1ciA9ICh1YiAtIGxiKSAvIGxvb3Bfc3QgKyAxOworICAgICAgLy8gR3VpZGVkIHNjaGVkdWxpbmcgdXNlcyBGUCBjb21wdXRhdGlvbnMsIHNvIGN1cnJlbnQgY2h1bmsgbWF5CisgICAgICAvLyBiZSBhIGJpdCBiaWdnZXIgKCsxKSB0aGFuIGFsbG93ZWQgbWF4aW11bQorICAgICAgaWYgKCEoY3VyIDw9IG1heCArIDEpKSB7CisgICAgICAgIHByaW50ZigiRXJyb3Igd2l0aCBpdGVyICVkLCAlZFxuIiwgY3VyLCBtYXgpOworICAgICAgICBlcnIrKzsKKyAgICAgIH0KKyAgICAgIC8vIFVwZGF0ZSBtYXhpbXVtIGZvciB0aGUgbmV4dCBjaHVuaworICAgICAgaWYgKGN1ciA8IG1heCkKKyAgICAgICAgbWF4ID0gY3VyOworICAgICAgbmV4dF9sYiA9IHViICsgbG9vcF9zdDsKKyAgICAgIGxhc3RfdWIgPSB1YjsKKyAgICAgIHVuZGVyc2l6ZWQgPSAoY3VyIDwgbG9vcF9jaHVuayk7CisgICAgfTsgLy8gd2hpbGUKKyAgICAvLyBNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGNodW5rCisgICAgaWYgKCEoY2h1bmsgPiAwKSkgeworICAgICAgcHJpbnRmKCJFcnJvciB3aXRoIGNodW5rICVkXG4iLCBjaHVuayk7CisgICAgICBlcnIrKzsKKyAgICB9CisgICAgLy8gTXVzdCBoYXZlIHRoZSByaWdodCBsYXN0IGl0ZXJhdGlvbiBpbmRleAorICAgIGlmIChsb29wX3N0ID4gMCkgeworICAgICAgaWYgKCEobGFzdF91YiA8PSBsb29wX3ViKSkgeworICAgICAgICBwcmludGYoIkVycm9yIHdpdGggbGFzdDEgJWQsICVkLCBjaCAlZFxuIiwKKyAgICAgICAgICAgICAgIChpbnQpbGFzdF91YiwgKGludClsb29wX3ViLCBjaHVuayk7CisgICAgICAgIGVycisrOworICAgICAgfQorICAgICAgaWYgKCEobGFzdF91YiArIGxvb3Bfc3QgPiBsb29wX3ViKSkgeworICAgICAgICBwcmludGYoIkVycm9yIHdpdGggbGFzdDIgJWQsICVkLCAlZCwgY2ggJWRcbiIsCisgICAgICAgICAgICAgICAoaW50KWxhc3RfdWIsIChpbnQpbG9vcF9zdCwgKGludClsb29wX3ViLCBjaHVuayk7CisgICAgICAgIGVycisrOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoIShsYXN0X3ViID49IGxvb3BfdWIpKSB7CisgICAgICAgIHByaW50ZigiRXJyb3Igd2l0aCBsYXN0MSAlZCwgJWQsIGNoICVkXG4iLAorICAgICAgICAgICAgICAgKGludClsYXN0X3ViLCAoaW50KWxvb3BfdWIsIGNodW5rKTsKKyAgICAgICAgZXJyKys7CisgICAgICB9CisgICAgICBpZiAoIShsYXN0X3ViICsgbG9vcF9zdCA8IGxvb3BfdWIpKSB7CisgICAgICAgIHByaW50ZigiRXJyb3Igd2l0aCBsYXN0MiAlZCwgJWQsICVkLCBjaCAlZFxuIiwKKyAgICAgICAgICAgICAgIChpbnQpbGFzdF91YiwgKGludClsb29wX3N0LCAoaW50KWxvb3BfdWIsIGNodW5rKTsKKyAgICAgICAgZXJyKys7CisgICAgICB9CisgICAgfTsgLy8gaWYKKyAgICAvLyBMZXQgbm9uLW1hc3RlciB0aHJlYWRzIGdvCisgICAgbG9vcF9zeW5jID0gMTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgaTsKKyAgICAvLyBXb3JrZXJzIHdhaXQgZm9yIG1hc3RlciB0aHJlYWQgdG8gZmluaXNoLCB0aGVuIGNhbGwgX19rbXBjX2Rpc3BhdGNoX25leHQKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTAwMDAwMDsgKysgaSkgeworICAgICAgaWYgKGxvb3Bfc3luYyAhPSAwKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBmb3IgaQorICAgIHdoaWxlIChsb29wX3N5bmMgPT0gMCkgeworICAgICAgZGVsYXkoKTsKKyAgICB9OyAvLyB3aGlsZQorICAgIC8vIEF0IHRoaXMgbW9tZW50IHdlIGRvIG5vdCBoYXZlIGFueSBtb3JlIGNodW5rcyAtLSBhbGwgdGhlIGNodW5rcyBhbHJlYWR5CisgICAgLy8gcHJvY2Vzc2VkIGJ5IHRoZSBtYXN0ZXIgdGhyZWFkCisgICAgcmMgPSBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80KCZsb2MsIGd0aWQsICZsYXN0LCAmbGIsICZ1YiwgJnN0KTsKKyAgICBpZiAocmMpIHsKKyAgICAgIHByaW50ZigiRXJyb3IgcmV0dXJuIHZhbHVlXG4iKTsKKyAgICAgIGVycisrOworICAgIH0KKyAgfTsgLy8gaWYKKworICBfX2ttcGNfYmFycmllcigmbG9jLCBndGlkKTsKKyAgaWYgKHRpZCA9PSAwKSB7CisgICAgICBsb29wX3N5bmMgPSAwOyAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIHN0YXRlCisjaWYgREVCVUcKKyAgICAgIHByaW50ZigicnVuX2xvb3A8PigpOiBhdCB0aGUgZW5kXG4iKTsKKyNlbmRpZgorICB9OyAvLyBpZgorICBfX2ttcGNfYmFycmllcigmbG9jLCBndGlkKTsKKyAgcmV0dXJuIGVycjsKK30gLy8gcnVuX2xvb3AKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgcnVuXzY0KGludCBudW1fdGgpCit7CisgaW50IGVyciA9IDA7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyhudW1fdGgpCisgeworICBpbnQgY2h1bms7CisgIGk2NCBzdCwgbGIsIHViOworICBmb3IgKGNodW5rID0gU0lNRF9MRU47IGNodW5rIDw9IDMqU0lNRF9MRU47IGNodW5rICs9IFNJTURfTEVOKSB7CisgICAgZm9yIChzdCA9IDE7IHN0IDw9IDM7ICsrIHN0KSB7CisgICAgICBmb3IgKGxiID0gLTMgKiBudW1fdGggKiBzdDsgbGIgPD0gMyAqIG51bV90aCAqIHN0OyArKyBsYikgeworICAgICAgICBmb3IgKHViID0gbGI7IHViIDwgbGIgKyBudW1fdGggKiAoY2h1bmsrMSkgKiBzdDsgKysgdWIpIHsKKyAgICAgICAgICBlcnIgKz0gcnVuX2xvb3BfNjQobGIsIHViLCAgc3QsIGNodW5rKTsKKyAgICAgICAgICBlcnIgKz0gcnVuX2xvb3BfNjQodWIsIGxiLCAtc3QsIGNodW5rKTsKKyAgICAgICAgfTsgLy8gZm9yIHViCisgICAgICB9OyAvLyBmb3IgbGIKKyAgICB9OyAvLyBmb3Igc3QKKyAgfTsgLy8gZm9yIGNodW5rCisgfQorIHJldHVybiBlcnI7Cit9IC8vIHJ1bl9hbGwKKworaW50IHJ1bl8zMihpbnQgbnVtX3RoKQoreworIGludCBlcnIgPSAwOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMobnVtX3RoKQorIHsKKyAgaW50IGNodW5rLCBzdCwgbGIsIHViOworICBmb3IgKGNodW5rID0gU0lNRF9MRU47IGNodW5rIDw9IDMqU0lNRF9MRU47IGNodW5rICs9IFNJTURfTEVOKSB7CisgICAgZm9yIChzdCA9IDE7IHN0IDw9IDM7ICsrIHN0KSB7CisgICAgICBmb3IgKGxiID0gLTMgKiBudW1fdGggKiBzdDsgbGIgPD0gMyAqIG51bV90aCAqIHN0OyArKyBsYikgeworICAgICAgICBmb3IgKHViID0gbGI7IHViIDwgbGIgKyBudW1fdGggKiAoY2h1bmsrMSkgKiBzdDsgKysgdWIpIHsKKyAgICAgICAgICBlcnIgKz0gcnVuX2xvb3BfMzIobGIsIHViLCAgc3QsIGNodW5rKTsKKyAgICAgICAgICBlcnIgKz0gcnVuX2xvb3BfMzIodWIsIGxiLCAtc3QsIGNodW5rKTsKKyAgICAgICAgfTsgLy8gZm9yIHViCisgICAgICB9OyAvLyBmb3IgbGIKKyAgICB9OyAvLyBmb3Igc3QKKyAgfTsgLy8gZm9yIGNodW5rCisgfQorIHJldHVybiBlcnI7Cit9IC8vIHJ1bl9hbGwKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgbWFpbigpCit7CisgIGludCBuLCBlcnIgPSAwOworICBmb3IgKG4gPSAxOyBuIDw9IDQ7ICsrIG4pIHsKKyAgICBlcnIgKz0gcnVuXzMyKG4pOworICAgIGVyciArPSBydW5fNjQobik7CisgIH07IC8vIGZvciBuCisgIGlmIChlcnIpCisgICAgcHJpbnRmKCJmYWlsZWQgd2l0aCAlZCBlcnJvcnNcbiIsIGVycik7CisgIGVsc2UKKyAgICBwcmludGYoInBhc3NlZFxuIik7CisgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL2ttcF9zY2hfc2ltZF9ydW50aW1lX2FwaS5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9rbXBfc2NoX3NpbWRfcnVudGltZV9hcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjUzOGQxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9rbXBfc2NoX3NpbWRfcnVudGltZV9hcGkuYwpAQCAtMCwwICsxLDIyMSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorCisvLyBUaGUgdGVzdCBjaGVja3Mgc2NoZWR1bGUoc2ltZDpydW50aW1lKQorLy8gaW4gY29tYmluYXRpb24gd2l0aCBvbXBfc2V0X3NjaGVkdWxlKCkKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG9tcC5oPgorCisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzIpCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2RlZmluZSBkZWxheSgpIFNsZWVwKDEpOworI2RlZmluZSBzZXRlbihhLGIsYykgX3B1dGVudl9zKChhKSwoYikpCisjZWxzZQorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2RlZmluZSBkZWxheSgpIHVzbGVlcCgxMCk7CisjZGVmaW5lIHNldGVuKGEsYixjKSBzZXRlbnYoKGEpLChiKSwoYykpCisjZW5kaWYKKworI2RlZmluZSBTSU1EX0xFTiA0CitpbnQgZXJyID0gMDsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWYXJpb3VzIGRlZmluaXRpb25zIGNvcGllZCBmcm9tIE9wZW5NUCBSVEwuCitlbnVtIHNjaGVkIHsKKyAga21wX3NjaF9zdGF0aWNfYmFsYW5jZWRfY2h1bmtlZCA9IDQ1LAorICBrbXBfc2NoX2d1aWRlZF9zaW1kID0gNDYsCisgIGttcF9zY2hfcnVudGltZV9zaW1kID0gNDcsCit9OwordHlwZWRlZiB1bnNpZ25lZCB1MzI7Cit0eXBlZGVmIGxvbmcgbG9uZyBpNjQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1NjQ7Cit0eXBlZGVmIHN0cnVjdCB7CisgIGludCByZXNlcnZlZF8xOworICBpbnQgZmxhZ3M7CisgIGludCByZXNlcnZlZF8yOworICBpbnQgcmVzZXJ2ZWRfMzsKKyAgY2hhciAqcHNvdXJjZTsKK30gaWQ7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKyAgaW50IF9fa21wY19nbG9iYWxfdGhyZWFkX251bShpZCopOworICB2b2lkIF9fa21wY19iYXJyaWVyKGlkKiwgaW50IGd0aWQpOworICB2b2lkIF9fa21wY19kaXNwYXRjaF9pbml0XzQoaWQqLCBpbnQsIGVudW0gc2NoZWQsIGludCwgaW50LCBpbnQsIGludCk7CisgIHZvaWQgX19rbXBjX2Rpc3BhdGNoX2luaXRfOChpZCosIGludCwgZW51bSBzY2hlZCwgaTY0LCBpNjQsIGk2NCwgaTY0KTsKKyAgaW50IF9fa21wY19kaXNwYXRjaF9uZXh0XzQoaWQqLCBpbnQsIHZvaWQqLCB2b2lkKiwgdm9pZCosIHZvaWQqKTsKKyAgaW50IF9fa21wY19kaXNwYXRjaF9uZXh0XzgoaWQqLCBpbnQsIHZvaWQqLCB2b2lkKiwgdm9pZCosIHZvaWQqKTsKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKy8vIEVuZCBvZiBkZWZpbml0aW9ucyBjb3BpZWQgZnJvbSBPcGVuTVAgUlRMLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgaWQgbG9jID0gezAsIDIsIDAsIDAsICI7ZmlsZTtmdW5jOzA7MDs7In07CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZAorcnVuX2xvb3AoCisgICAgaW50IGxvb3BfbGIsICAgLy8gTG9vcCBsb3dlciBib3VuZC4KKyAgICBpbnQgbG9vcF91YiwgICAvLyBMb29wIHVwcGVyIGJvdW5kLgorICAgIGludCBsb29wX3N0LCAgIC8vIExvb3Agc3RyaWRlLgorICAgIGludCBsY2h1bmsKKykgeworICBzdGF0aWMgaW50IHZvbGF0aWxlIGxvb3Bfc3luYyA9IDA7CisgIGludCBsYjsgICAvLyBDaHVuayBsb3dlciBib3VuZC4KKyAgaW50IHViOyAgIC8vIENodW5rIHVwcGVyIGJvdW5kLgorICBpbnQgc3Q7ICAgLy8gQ2h1bmsgc3RyaWRlLgorICBpbnQgcmM7CisgIGludCB0aWQgPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgaW50IGd0aWQgPSBfX2ttcGNfZ2xvYmFsX3RocmVhZF9udW0oJmxvYyk7CisgIGludCBsYXN0OworICBpbnQgdGMgPSAobG9vcF91YiAtIGxvb3BfbGIpIC8gbG9vcF9zdCArIDE7CisgIGludCBjaDsKKyAgaW50IG5vX2NodW5rID0gMDsKKyAgaWYgKGxjaHVuayA9PSAwKSB7CisgICAgbm9fY2h1bmsgPSAxOworICAgIGxjaHVuayA9IDE7CisgIH0KKyAgY2ggPSBsY2h1bmsgKiBTSU1EX0xFTjsKKyNpZiBfREVCVUcgPiAxCisgIHByaW50ZigicnVuX2xvb3AgZ3RpZCAlZCB0aWQgJWQgKGxiPSVkLCB1Yj0lZCwgc3Q9JWQsIGNoPSVkKVxuIiwKKyAgICAgICAgIGd0aWQsIHRpZCwgKGludClsb29wX2xiLCAoaW50KWxvb3BfdWIsIChpbnQpbG9vcF9zdCwgbGNodW5rKTsKKyNlbmRpZgorICAvLyBEb24ndCB0ZXN0IGRlZ2VuZXJhdGUgY2FzZXMgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIGRpc2NvdmVyZWQgYnkgY29kZWdlbi4KKyAgaWYgKGxvb3Bfc3QgPT0gMCkKKyAgICByZXR1cm47CisgIGlmIChsb29wX3N0ID4gMCA/IGxvb3BfbGIgPiBsb29wX3ViIDogbG9vcF9sYiA8IGxvb3BfdWIpCisgICAgcmV0dXJuOworICBfX2ttcGNfZGlzcGF0Y2hfaW5pdF80KCZsb2MsIGd0aWQsIGttcF9zY2hfcnVudGltZV9zaW1kLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BfbGIsIGxvb3BfdWIsIGxvb3Bfc3QsIFNJTURfTEVOKTsKKyAgeworICAgIC8vIExldCB0aGUgbWFzdGVyIHRocmVhZCBoYW5kbGUgdGhlIGNodW5rcyBhbG9uZS4KKyAgICBpbnQgY2h1bms7ICAgICAgLy8gTm8gb2YgY3VycmVudCBjaHVuay4KKyAgICBpbnQgbGFzdF91YjsgICAgLy8gVXBwZXIgYm91bmQgb2YgdGhlIGxhc3QgcHJvY2Vzc2VkIGNodW5rLgorICAgIHU2NCBjdXI7ICAgICAgICAvLyBOdW1iZXIgb2YgaW50ZXJhdGlvbnMgaW4gIGN1cnJlbnQgY2h1bmsuCisgICAgdTY0IG1heDsgICAgICAgIC8vIE1heCBhbGxvd2VkIGl0ZXJhdGlvbnMgZm9yIGN1cnJlbnQgY2h1bmsuCisgICAgaW50IHVuZGVyc2l6ZWQgPSAwOworICAgIGxhc3RfdWIgPSBsb29wX3ViOworICAgIGNodW5rID0gMDsKKyAgICBtYXggPSAobG9vcF91YiAtIGxvb3BfbGIpIC8gbG9vcF9zdCArIDE7CisgICAgLy8gVGhlIGZpcnN0IGNodW5rIGNhbiBjb25zdW1lIGFsbCBpdGVyYXRpb25zLgorICAgIHdoaWxlIChfX2ttcGNfZGlzcGF0Y2hfbmV4dF80KCZsb2MsIGd0aWQsICZsYXN0LCAmbGIsICZ1YiwgJnN0KSkgeworICAgICAgKysgY2h1bms7CisjaWYgX0RFQlVHCisgICAgICBwcmludGYoInRoICVkOiBjaHVuaz0lZCwgbGI9JWQsIHViPSVkIGNoICVkXG4iLAorICAgICAgICAgICAgIHRpZCwgY2h1bmssIChpbnQpbGIsIChpbnQpdWIsIChpbnQpKHViLWxiKzEpKTsKKyNlbmRpZgorICAgICAgLy8gQ2hlY2sgaWYgcHJldmlvdXMgY2h1bmsgKGl0IGlzIG5vdCB0aGUgZmluYWwgY2h1bmspIGlzIHVuZGVyc2l6ZWQuCisgICAgICBpZiAodW5kZXJzaXplZCkKKyAgICAgICAgcHJpbnRmKCJFcnJvciB3aXRoIGNodW5rICVkLCB0aCAlZCwgZXJyICVkXG4iLCBjaHVuaywgdGlkLCArK2Vycik7CisgICAgICBpZiAobG9vcF9zdCA+IDApIHsKKyAgICAgICAgaWYgKCEodWIgPD0gbG9vcF91YikpCisgICAgICAgICAgcHJpbnRmKCJFcnJvciB3aXRoIHViICVkLCAlZCwgY2ggJWQsIGVyciAlZFxuIiwKKyAgICAgICAgICAgICAgICAgKGludCl1YiwgKGludClsb29wX3ViLCBjaHVuaywgKytlcnIpOworICAgICAgICBpZiAoIShsYiA8PSB1YikpCisgICAgICAgICAgcHJpbnRmKCJFcnJvciB3aXRoIGJvdW5kcyAlZCwgJWQsICVkLCBlcnIgJWRcbiIsCisgICAgICAgICAgICAgICAgIChpbnQpbGIsIChpbnQpdWIsIGNodW5rLCArK2Vycik7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoISh1YiA+PSBsb29wX3ViKSkKKyAgICAgICAgICBwcmludGYoIkVycm9yIHdpdGggdWIgJWQsICVkLCAlZCwgZXJyICVkXG4iLAorICAgICAgICAgICAgICAgICAoaW50KXViLCAoaW50KWxvb3BfdWIsIGNodW5rLCArK2Vycik7CisgICAgICAgIGlmICghKGxiID49IHViKSkKKyAgICAgICAgICBwcmludGYoIkVycm9yIHdpdGggYm91bmRzICVkLCAlZCwgJWQsIGVyciAlZFxuIiwKKyAgICAgICAgICAgICAgICAgKGludClsYiwgKGludCl1YiwgY2h1bmssICsrZXJyKTsKKyAgICAgIH07IC8vIGlmCisgICAgICAvLyBTdHJpZGUgc2hvdWxkIG5vdCBjaGFuZ2UuCisgICAgICBpZiAoIShzdCA9PSBsb29wX3N0KSkKKyAgICAgICAgcHJpbnRmKCJFcnJvciB3aXRoIHN0ICVkLCAlZCwgY2ggJWQsIGVyciAlZFxuIiwKKyAgICAgICAgICAgICAgIChpbnQpc3QsIChpbnQpbG9vcF9zdCwgY2h1bmssICsrZXJyKTsKKyAgICAgIGN1ciA9ICggdWIgLSBsYiApIC8gbG9vcF9zdCArIDE7CisgICAgICAvLyBHdWlkZWQgc2NoZWR1bGluZyB1c2VzIEZQIGNvbXB1dGF0aW9ucywgc28gY3VycmVudCBjaHVuayBtYXkKKyAgICAgIC8vIGJlIGEgYml0IGJpZ2dlciAoKzEpIHRoYW4gYWxsb3dlZCBtYXhpbXVtLgorICAgICAgaWYgKCEoIGN1ciA8PSBtYXggKyAxKSkKKyAgICAgICAgcHJpbnRmKCJFcnJvciB3aXRoIGl0ZXIgJWQsICVkLCBlcnIgJWRcbiIsIGN1ciwgbWF4LCArK2Vycik7CisgICAgICAvLyBVcGRhdGUgbWF4aW11bSBmb3IgdGhlIG5leHQgY2h1bmsuCisgICAgICBpZiAobGFzdCkgeworICAgICAgICBpZiAoIW5vX2NodW5rICYmIGN1ciA+IGNoKQorICAgICAgICAgIHByaW50ZigiRXJyb3I6IHRvbyBiaWcgbGFzdCBjaHVuayAlZCAoJWQpLCB0aWQgJWQsIGVyciAlZFxuIiwKKyAgICAgICAgICAgICAgICAgKGludCljdXIsIGNoLCB0aWQsICsrZXJyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChjdXIgJSBjaCkKKyAgICAgICAgICBwcmludGYoIkVycm9yIHdpdGggY2h1bmsgJWQsICVkLCBjaCAlZCwgdGlkICVkLCBlcnIgJWRcbiIsCisgICAgICAgICAgICAgICAgIGNodW5rLCAoaW50KWN1ciwgY2gsIHRpZCwgKytlcnIpOworICAgICAgfQorICAgICAgaWYgKGN1ciA8IG1heCkKKyAgICAgICAgbWF4ID0gY3VyOworICAgICAgbGFzdF91YiA9IHViOworICAgICAgdW5kZXJzaXplZCA9IChjdXIgPCBjaCk7CisjaWYgX0RFQlVHID4gMQorICAgICAgaWYgKGxhc3QpCisgICAgICAgIHByaW50ZigidW5kZXIlZCBjdXIgJWQsIGNoICVkLCB0aWQgJWQsIHViICVkLCBsYiAlZCwgc3QgJWQgPT09PT09PVxuIiwKKyAgICAgICAgICAgICAgIHVuZGVyc2l6ZWQsY3VyLGNoLHRpZCx1YixsYixsb29wX3N0KTsKKyNlbmRpZgorICAgIH0gLy8gd2hpbGUKKyAgICAvLyBNdXN0IGhhdmUgdGhlIHJpZ2h0IGxhc3QgaXRlcmF0aW9uIGluZGV4LgorICAgIGlmIChsb29wX3N0ID4gMCkgeworICAgICAgaWYgKCEobGFzdF91YiA8PSBsb29wX3ViKSkKKyAgICAgICAgcHJpbnRmKCJFcnJvciB3aXRoIGxhc3QxICVkLCAlZCwgY2ggJWQsIGVyciAlZFxuIiwKKyAgICAgICAgICAgICAgIChpbnQpbGFzdF91YiwgKGludClsb29wX3ViLCBjaHVuaywgKytlcnIpOworICAgICAgaWYgKGxhc3QgJiYgIShsYXN0X3ViICsgbG9vcF9zdCA+IGxvb3BfdWIpKQorICAgICAgICBwcmludGYoIkVycm9yIHdpdGggbGFzdDIgJWQsICVkLCAlZCwgY2ggJWQsIGVyciAlZFxuIiwKKyAgICAgICAgICAgICAgIChpbnQpbGFzdF91YiwgKGludClsb29wX3N0LCAoaW50KWxvb3BfdWIsIGNodW5rLCArK2Vycik7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghKGxhc3RfdWIgPj0gbG9vcF91YikpCisgICAgICAgIHByaW50ZigiRXJyb3Igd2l0aCBsYXN0MSAlZCwgJWQsIGNoICVkLCBlcnIgJWRcbiIsCisgICAgICAgICAgICAgICAoaW50KWxhc3RfdWIsIChpbnQpbG9vcF91YiwgY2h1bmssICsrZXJyKTsKKyAgICAgIGlmIChsYXN0ICYmICEobGFzdF91YiArIGxvb3Bfc3QgPCBsb29wX3ViKSkKKyAgICAgICAgcHJpbnRmKCJFcnJvciB3aXRoIGxhc3QyICVkLCAlZCwgJWQsIGNoICVkLCBlcnIgJWRcbiIsCisgICAgICAgICAgICAgICAoaW50KWxhc3RfdWIsIChpbnQpbG9vcF9zdCwgKGludClsb29wX3ViLCBjaHVuaywgKytlcnIpOworICAgIH0gLy8gaWYKKyAgfQorICBfX2ttcGNfYmFycmllcigmbG9jLCBndGlkKTsKK30gLy8gcnVuX2xvb3AKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgaW50IGNodW5rID0gMDsKKy8vIHN0YXRpYyAobm8gY2h1bmspCisgIG9tcF9zZXRfc2NoZWR1bGUob21wX3NjaGVkX3N0YXRpYywwKTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsLy8gbnVtX3RocmVhZHMobnVtX3RoKQorICBydW5fbG9vcCgwLCAyNiwgMSwgY2h1bmspOworCisvLyBhdXRvIChjaHVuayBzaG91bGQgYmUgaWdub3J0ZWQpCisgIG9tcF9zZXRfc2NoZWR1bGUob21wX3NjaGVkX2F1dG8sMCk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbC8vIG51bV90aHJlYWRzKG51bV90aCkKKyAgcnVuX2xvb3AoMCwgMjYsIDEsIGNodW5rKTsKKworLy8gc3RhdGljLDEKKyAgY2h1bmsgPSAxOworICBvbXBfc2V0X3NjaGVkdWxlKG9tcF9zY2hlZF9zdGF0aWMsMSk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbC8vIG51bV90aHJlYWRzKG51bV90aCkKKyAgcnVuX2xvb3AoMCwgMjYsIDEsIGNodW5rKTsKKworLy8gZHluYW1pYywxCisgIG9tcF9zZXRfc2NoZWR1bGUob21wX3NjaGVkX2R5bmFtaWMsMSk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbC8vIG51bV90aHJlYWRzKG51bV90aCkKKyAgcnVuX2xvb3AoMCwgMjYsIDEsIGNodW5rKTsKKworLy8gZ3VpZGVkLDEKKyAgb21wX3NldF9zY2hlZHVsZShvbXBfc2NoZWRfZ3VpZGVkLDEpOworI3ByYWdtYSBvbXAgcGFyYWxsZWwvLyBudW1fdGhyZWFkcyhudW1fdGgpCisgIHJ1bl9sb29wKDAsIDI2LCAxLCBjaHVuayk7CisKKy8vIGR5bmFtaWMsMCAtIHVzZSBkZWZhdWx0IGNodW5rIHNpemUgMQorICBvbXBfc2V0X3NjaGVkdWxlKG9tcF9zY2hlZF9keW5hbWljLDApOworI3ByYWdtYSBvbXAgcGFyYWxsZWwvLyBudW1fdGhyZWFkcyhudW1fdGgpCisgIHJ1bl9sb29wKDAsIDI2LCAxLCBjaHVuayk7CisKKy8vIGd1aWRlZCwwIC0gdXNlIGRlZmF1bHQgY2h1bmsgc2l6ZSAxCisgIG9tcF9zZXRfc2NoZWR1bGUob21wX3NjaGVkX2d1aWRlZCwwKTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsLy8gbnVtX3RocmVhZHMobnVtX3RoKQorICBydW5fbG9vcCgwLCAyNiwgMSwgY2h1bmspOworCisgIGlmIChlcnIpIHsKKyAgICBwcmludGYoImZhaWxlZCwgZXJyID0gJWRcbiIsIGVycik7CisgICAgcmV0dXJuIDE7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJwYXNzZWRcbiIpOworICAgIHJldHVybiAwOworICB9Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL2ttcF9zY2hfc2ltZF9ydW50aW1lX2d1aWRlZC5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9rbXBfc2NoX3NpbWRfcnVudGltZV9ndWlkZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTM3ODMxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9rbXBfc2NoX3NpbWRfcnVudGltZV9ndWlkZWQuYwpAQCAtMCwwICsxLDE5NiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUKKy8vIFJVTjogZW52IE9NUF9TQ0hFRFVMRT1ndWlkZWQgICAgJWxpYm9tcC1ydW4KKy8vIFJVTjogZW52IE9NUF9TQ0hFRFVMRT1ndWlkZWQsMSAgJWxpYm9tcC1ydW4gMQorLy8gUlVOOiBlbnYgT01QX1NDSEVEVUxFPWd1aWRlZCwyICAlbGlib21wLXJ1biAyCisvLyBSVU46IGVudiBPTVBfU0NIRURVTEU9ZHluYW1pYyAgICVsaWJvbXAtcnVuCisvLyBSVU46IGVudiBPTVBfU0NIRURVTEU9ZHluYW1pYywxICVsaWJvbXAtcnVuIDEKKy8vIFJVTjogZW52IE9NUF9TQ0hFRFVMRT1keW5hbWljLDIgJWxpYm9tcC1ydW4gMgorLy8gUlVOOiBlbnYgT01QX1NDSEVEVUxFPWF1dG8gICAgICAlbGlib21wLXJ1bgorCisvLyBUaGUgdGVzdCBjaGVja3Mgc2NoZWR1bGUoc2ltZDpydW50aW1lKQorLy8gaW4gY29tYmluYXRpb24gd2l0aCBPTVBfU0NIRURVTEU9Z3VpZGVkWyxjaHVua10KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG9tcC5oPgorCisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzIpCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2RlZmluZSBkZWxheSgpIFNsZWVwKDEpOworI2RlZmluZSBzZXRlbihhLGIsYykgX3B1dGVudl9zKChhKSwoYikpCisjZWxzZQorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2RlZmluZSBkZWxheSgpIHVzbGVlcCgxMCk7CisjZGVmaW5lIHNldGVuKGEsYixjKSBzZXRlbnYoKGEpLChiKSwoYykpCisjZW5kaWYKKworI2RlZmluZSBVQk9VTkQgMTAwCisjZGVmaW5lIFNJTURfTEVOIDQKK2ludCBlcnIgPSAwOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZhcmlvdXMgZGVmaW5pdGlvbnMgY29waWVkIGZyb20gT3Blbk1QIFJUTC4KK2VudW0gc2NoZWQgeworICBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZF9jaHVua2VkID0gNDUsCisgIGttcF9zY2hfZ3VpZGVkX3NpbWQgPSA0NiwKKyAga21wX3NjaF9ydW50aW1lX3NpbWQgPSA0NywKK307Cit0eXBlZGVmIHVuc2lnbmVkIHUzMjsKK3R5cGVkZWYgbG9uZyBsb25nIGk2NDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHU2NDsKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IHJlc2VydmVkXzE7CisgIGludCBmbGFnczsKKyAgaW50IHJlc2VydmVkXzI7CisgIGludCByZXNlcnZlZF8zOworICBjaGFyICpwc291cmNlOworfSBpZDsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorICBpbnQgX19rbXBjX2dsb2JhbF90aHJlYWRfbnVtKGlkKik7CisgIHZvaWQgX19rbXBjX2JhcnJpZXIoaWQqLCBpbnQgZ3RpZCk7CisgIHZvaWQgX19rbXBjX2Rpc3BhdGNoX2luaXRfNChpZCosIGludCwgZW51bSBzY2hlZCwgaW50LCBpbnQsIGludCwgaW50KTsKKyAgdm9pZCBfX2ttcGNfZGlzcGF0Y2hfaW5pdF84KGlkKiwgaW50LCBlbnVtIHNjaGVkLCBpNjQsIGk2NCwgaTY0LCBpNjQpOworICBpbnQgX19rbXBjX2Rpc3BhdGNoX25leHRfNChpZCosIGludCwgdm9pZCosIHZvaWQqLCB2b2lkKiwgdm9pZCopOworICBpbnQgX19rbXBjX2Rpc3BhdGNoX25leHRfOChpZCosIGludCwgdm9pZCosIHZvaWQqLCB2b2lkKiwgdm9pZCopOworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8vIGV4dGVybiAiQyIKKyNlbmRpZgorLy8gRW5kIG9mIGRlZmluaXRpb25zIGNvcGllZCBmcm9tIE9wZW5NUCBSVEwuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyBpZCBsb2MgPSB7MCwgMiwgMCwgMCwgIjtmaWxlO2Z1bmM7MDswOzsifTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkCitydW5fbG9vcCgKKyAgICBpbnQgbG9vcF9sYiwgICAvLyBMb29wIGxvd2VyIGJvdW5kLgorICAgIGludCBsb29wX3ViLCAgIC8vIExvb3AgdXBwZXIgYm91bmQuCisgICAgaW50IGxvb3Bfc3QsICAgLy8gTG9vcCBzdHJpZGUuCisgICAgaW50IGxjaHVuaworKSB7CisgIHN0YXRpYyBpbnQgdm9sYXRpbGUgbG9vcF9zeW5jID0gMDsKKyAgaW50IGxiOyAgIC8vIENodW5rIGxvd2VyIGJvdW5kLgorICBpbnQgdWI7ICAgLy8gQ2h1bmsgdXBwZXIgYm91bmQuCisgIGludCBzdDsgICAvLyBDaHVuayBzdHJpZGUuCisgIGludCByYzsKKyAgaW50IHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICBpbnQgZ3RpZCA9IF9fa21wY19nbG9iYWxfdGhyZWFkX251bSgmbG9jKTsKKyAgaW50IGxhc3Q7CisgIGludCB0YyA9IChsb29wX3ViIC0gbG9vcF9sYikgLyBsb29wX3N0ICsgMTsKKyAgaW50IGNoOworICBpbnQgbm9fY2h1bmsgPSAwOworICBpZiAobGNodW5rID09IDApIHsKKyAgICBub19jaHVuayA9IDE7CisgICAgbGNodW5rID0gMTsKKyAgfQorICBjaCA9IGxjaHVuayAqIFNJTURfTEVOOworI2lmIF9ERUJVRyA+IDEKKyAgcHJpbnRmKCJydW5fbG9vcCBndGlkICVkIHRpZCAlZCAobGI9JWQsIHViPSVkLCBzdD0lZCwgY2g9JWQpXG4iLAorICAgICAgICAgZ3RpZCwgdGlkLCAoaW50KWxvb3BfbGIsIChpbnQpbG9vcF91YiwgKGludClsb29wX3N0LCBsY2h1bmspOworI2VuZGlmCisgIC8vIERvbid0IHRlc3QgZGVnZW5lcmF0ZSBjYXNlcyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gZGlzY292ZXJlZCBieSBjb2RlZ2VuLgorICBpZiAobG9vcF9zdCA9PSAwKQorICAgIHJldHVybjsKKyAgaWYgKGxvb3Bfc3QgPiAwID8gbG9vcF9sYiA+IGxvb3BfdWIgOiBsb29wX2xiIDwgbG9vcF91YikKKyAgICByZXR1cm47CisgIF9fa21wY19kaXNwYXRjaF9pbml0XzQoJmxvYywgZ3RpZCwga21wX3NjaF9ydW50aW1lX3NpbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcF9sYiwgbG9vcF91YiwgbG9vcF9zdCwgU0lNRF9MRU4pOworICB7CisgICAgLy8gTGV0IHRoZSBtYXN0ZXIgdGhyZWFkIGhhbmRsZSB0aGUgY2h1bmtzIGFsb25lLgorICAgIGludCBjaHVuazsgICAgICAvLyBObyBvZiBjdXJyZW50IGNodW5rLgorICAgIGludCBsYXN0X3ViOyAgICAvLyBVcHBlciBib3VuZCBvZiB0aGUgbGFzdCBwcm9jZXNzZWQgY2h1bmsuCisgICAgdTY0IGN1cjsgICAgICAgIC8vIE51bWJlciBvZiBpbnRlcmF0aW9ucyBpbiAgY3VycmVudCBjaHVuay4KKyAgICB1NjQgbWF4OyAgICAgICAgLy8gTWF4IGFsbG93ZWQgaXRlcmF0aW9ucyBmb3IgY3VycmVudCBjaHVuay4KKyAgICBpbnQgdW5kZXJzaXplZCA9IDA7CisgICAgbGFzdF91YiA9IGxvb3BfdWI7CisgICAgY2h1bmsgPSAwOworICAgIG1heCA9IChsb29wX3ViIC0gbG9vcF9sYikgLyBsb29wX3N0ICsgMTsKKyAgICAvLyBUaGUgZmlyc3QgY2h1bmsgY2FuIGNvbnN1bWUgYWxsIGl0ZXJhdGlvbnMuCisgICAgd2hpbGUgKF9fa21wY19kaXNwYXRjaF9uZXh0XzQoJmxvYywgZ3RpZCwgJmxhc3QsICZsYiwgJnViLCAmc3QpKSB7CisgICAgICArKyBjaHVuazsKKyNpZiBfREVCVUcKKyAgICAgIHByaW50ZigidGggJWQ6IGNodW5rPSVkLCBsYj0lZCwgdWI9JWQgY2ggJWRcbiIsCisgICAgICAgICAgICAgdGlkLCBjaHVuaywgKGludClsYiwgKGludCl1YiwgKGludCkodWItbGIrMSkpOworI2VuZGlmCisgICAgICAvLyBDaGVjayBpZiBwcmV2aW91cyBjaHVuayAoaXQgaXMgbm90IHRoZSBmaW5hbCBjaHVuaykgaXMgdW5kZXJzaXplZC4KKyAgICAgIGlmICh1bmRlcnNpemVkKQorICAgICAgICBwcmludGYoIkVycm9yIHdpdGggY2h1bmsgJWQsIHRoICVkLCBlcnIgJWRcbiIsIGNodW5rLCB0aWQsICsrZXJyKTsKKyAgICAgIGlmIChsb29wX3N0ID4gMCkgeworICAgICAgICBpZiAoISh1YiA8PSBsb29wX3ViKSkKKyAgICAgICAgICBwcmludGYoIkVycm9yIHdpdGggdWIgJWQsICVkLCBjaCAlZCwgZXJyICVkXG4iLAorICAgICAgICAgICAgICAgICAoaW50KXViLCAoaW50KWxvb3BfdWIsIGNodW5rLCArK2Vycik7CisgICAgICAgIGlmICghKGxiIDw9IHViKSkKKyAgICAgICAgICBwcmludGYoIkVycm9yIHdpdGggYm91bmRzICVkLCAlZCwgJWQsIGVyciAlZFxuIiwKKyAgICAgICAgICAgICAgICAgKGludClsYiwgKGludCl1YiwgY2h1bmssICsrZXJyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghKHViID49IGxvb3BfdWIpKQorICAgICAgICAgIHByaW50ZigiRXJyb3Igd2l0aCB1YiAlZCwgJWQsICVkLCBlcnIgJWRcbiIsCisgICAgICAgICAgICAgICAgIChpbnQpdWIsIChpbnQpbG9vcF91YiwgY2h1bmssICsrZXJyKTsKKyAgICAgICAgaWYgKCEobGIgPj0gdWIpKQorICAgICAgICAgIHByaW50ZigiRXJyb3Igd2l0aCBib3VuZHMgJWQsICVkLCAlZCwgZXJyICVkXG4iLAorICAgICAgICAgICAgICAgICAoaW50KWxiLCAoaW50KXViLCBjaHVuaywgKytlcnIpOworICAgICAgfTsgLy8gaWYKKyAgICAgIC8vIFN0cmlkZSBzaG91bGQgbm90IGNoYW5nZS4KKyAgICAgIGlmICghKHN0ID09IGxvb3Bfc3QpKQorICAgICAgICBwcmludGYoIkVycm9yIHdpdGggc3QgJWQsICVkLCBjaCAlZCwgZXJyICVkXG4iLAorICAgICAgICAgICAgICAgKGludClzdCwgKGludClsb29wX3N0LCBjaHVuaywgKytlcnIpOworICAgICAgY3VyID0gKCB1YiAtIGxiICkgLyBsb29wX3N0ICsgMTsKKyAgICAgIC8vIEd1aWRlZCBzY2hlZHVsaW5nIHVzZXMgRlAgY29tcHV0YXRpb25zLCBzbyBjdXJyZW50IGNodW5rIG1heQorICAgICAgLy8gYmUgYSBiaXQgYmlnZ2VyICgrMSkgdGhhbiBhbGxvd2VkIG1heGltdW0uCisgICAgICBpZiAoISggY3VyIDw9IG1heCArIDEpKQorICAgICAgICBwcmludGYoIkVycm9yIHdpdGggaXRlciAlZCwgJWQsIGVyciAlZFxuIiwgY3VyLCBtYXgsICsrZXJyKTsKKyAgICAgIC8vIFVwZGF0ZSBtYXhpbXVtIGZvciB0aGUgbmV4dCBjaHVuay4KKyAgICAgIGlmICghbGFzdCAmJiBjdXIgJSBjaCkKKyAgICAgICAgcHJpbnRmKCJFcnJvciB3aXRoIGNodW5rICVkLCAlZCwgY2ggJWQsIHRpZCAlZCwgZXJyICVkXG4iLAorICAgICAgICAgICAgICAgY2h1bmssIChpbnQpY3VyLCBjaCwgdGlkLCArK2Vycik7CisgICAgICBpZiAobGFzdCAmJiAhbm9fY2h1bmsgJiYgY3VyID4gY2gpCisgICAgICAgIHByaW50ZigiRXJyb3I6IHRvbyBiaWcgbGFzdCBjaHVuayAlZCAoJWQpLCB0aWQgJWQsIGVyciAlZFxuIiwKKyAgICAgICAgICAgICAgIChpbnQpY3VyLCBjaCwgdGlkLCArK2Vycik7CisgICAgICBpZiAoY3VyIDwgbWF4KQorICAgICAgICBtYXggPSBjdXI7CisgICAgICBsYXN0X3ViID0gdWI7CisgICAgICB1bmRlcnNpemVkID0gKGN1ciA8IGNoKTsKKyNpZiBfREVCVUcgPiAxCisgICAgICBpZiAobGFzdCkKKyAgICAgICAgcHJpbnRmKCJ1bmRlciVkIGN1ciAlZCwgY2ggJWQsIHRpZCAlZCwgdWIgJWQsIGxiICVkLCBzdCAlZCA9PT09PT09XG4iLAorICAgICAgICAgICAgICAgdW5kZXJzaXplZCxjdXIsY2gsdGlkLHViLGxiLGxvb3Bfc3QpOworI2VuZGlmCisgICAgfSAvLyB3aGlsZQorICAgIC8vIE11c3QgaGF2ZSB0aGUgcmlnaHQgbGFzdCBpdGVyYXRpb24gaW5kZXguCisgICAgaWYgKGxvb3Bfc3QgPiAwKSB7CisgICAgICBpZiAoIShsYXN0X3ViIDw9IGxvb3BfdWIpKQorICAgICAgICBwcmludGYoIkVycm9yIHdpdGggbGFzdDEgJWQsICVkLCBjaCAlZCwgZXJyICVkXG4iLAorICAgICAgICAgICAgICAgKGludClsYXN0X3ViLCAoaW50KWxvb3BfdWIsIGNodW5rLCArK2Vycik7CisgICAgICBpZiAobGFzdCAmJiAhKGxhc3RfdWIgKyBsb29wX3N0ID4gbG9vcF91YikpCisgICAgICAgIHByaW50ZigiRXJyb3Igd2l0aCBsYXN0MiAlZCwgJWQsICVkLCBjaCAlZCwgZXJyICVkXG4iLAorICAgICAgICAgICAgICAgKGludClsYXN0X3ViLCAoaW50KWxvb3Bfc3QsIChpbnQpbG9vcF91YiwgY2h1bmssICsrZXJyKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCEobGFzdF91YiA+PSBsb29wX3ViKSkKKyAgICAgICAgcHJpbnRmKCJFcnJvciB3aXRoIGxhc3QxICVkLCAlZCwgY2ggJWQsIGVyciAlZFxuIiwKKyAgICAgICAgICAgICAgIChpbnQpbGFzdF91YiwgKGludClsb29wX3ViLCBjaHVuaywgKytlcnIpOworICAgICAgaWYgKGxhc3QgJiYgIShsYXN0X3ViICsgbG9vcF9zdCA8IGxvb3BfdWIpKQorICAgICAgICBwcmludGYoIkVycm9yIHdpdGggbGFzdDIgJWQsICVkLCAlZCwgY2ggJWQsIGVyciAlZFxuIiwKKyAgICAgICAgICAgICAgIChpbnQpbGFzdF91YiwgKGludClsb29wX3N0LCAoaW50KWxvb3BfdWIsIGNodW5rLCArK2Vycik7CisgICAgfSAvLyBpZgorICB9CisgIF9fa21wY19iYXJyaWVyKCZsb2MsIGd0aWQpOworfSAvLyBydW5fbG9vcAorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBpbnQgY2h1bmsgPSAwOworICBpZiAoYXJnYyA+IDEpIHsKKyAgICAvLyBleHBlY3QgY2h1bmsgc2l6ZSBhcyBhIHBhcmFtZXRlcgorICAgIGNodW5rID0gYXRvaShhcmd2WzFdKTsKKyAgfQorI3ByYWdtYSBvbXAgcGFyYWxsZWwgLy9udW1fdGhyZWFkcyhudW1fdGgpCisgIHJ1bl9sb29wKDAsIFVCT1VORCwgMSwgY2h1bmspOworICBpZiAoZXJyKSB7CisgICAgcHJpbnRmKCJmYWlsZWQsIGVyciA9ICVkXG4iLCBlcnIpOworICAgIHJldHVybiAxOworICB9IGVsc2UgeworICAgIHByaW50ZigicGFzc2VkXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9rbXBfc2NoX3NpbWRfcnVudGltZV9zdGF0aWMuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Iva21wX3NjaF9zaW1kX3J1bnRpbWVfc3RhdGljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNiMTVkNgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Iva21wX3NjaF9zaW1kX3J1bnRpbWVfc3RhdGljLmMKQEAgLTAsMCArMSwyMDEgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlICYmICVsaWJvbXAtcnVuCisvLyBSVU46ICVsaWJvbXAtcnVuIDEgJiYgJWxpYm9tcC1ydW4gMgorCisvLyBUaGUgdGVzdCBjaGVja3Mgc2NoZWR1bGUoc2ltZDpydW50aW1lKQorLy8gaW4gY29tYmluYXRpb24gd2l0aCBPTVBfU0NIRURVTEU9c3RhdGljWyxjaHVua10KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG9tcC5oPgorCisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lOMzIpCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2RlZmluZSBkZWxheSgpIFNsZWVwKDEpOworI2RlZmluZSBzZXRlbihhLGIsYykgX3B1dGVudl9zKChhKSwoYikpCisjZWxzZQorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2RlZmluZSBkZWxheSgpIHVzbGVlcCgxMCk7CisjZGVmaW5lIHNldGVuKGEsYixjKSBzZXRlbnYoKGEpLChiKSwoYykpCisjZW5kaWYKKworI2RlZmluZSBTSU1EX0xFTiA0CitpbnQgZXJyID0gMDsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWYXJpb3VzIGRlZmluaXRpb25zIGNvcGllZCBmcm9tIE9wZW5NUCBSVEwuCitlbnVtIHNjaGVkIHsKKyAga21wX3NjaF9zdGF0aWNfYmFsYW5jZWRfY2h1bmtlZCA9IDQ1LAorICBrbXBfc2NoX2d1aWRlZF9zaW1kID0gNDYsCisgIGttcF9zY2hfcnVudGltZV9zaW1kID0gNDcsCit9OwordHlwZWRlZiB1bnNpZ25lZCB1MzI7Cit0eXBlZGVmIGxvbmcgbG9uZyBpNjQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1NjQ7Cit0eXBlZGVmIHN0cnVjdCB7CisgIGludCByZXNlcnZlZF8xOworICBpbnQgZmxhZ3M7CisgIGludCByZXNlcnZlZF8yOworICBpbnQgcmVzZXJ2ZWRfMzsKKyAgY2hhciAqcHNvdXJjZTsKK30gaWQ7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKyAgaW50IF9fa21wY19nbG9iYWxfdGhyZWFkX251bShpZCopOworICB2b2lkIF9fa21wY19iYXJyaWVyKGlkKiwgaW50IGd0aWQpOworICB2b2lkIF9fa21wY19kaXNwYXRjaF9pbml0XzQoaWQqLCBpbnQsIGVudW0gc2NoZWQsIGludCwgaW50LCBpbnQsIGludCk7CisgIHZvaWQgX19rbXBjX2Rpc3BhdGNoX2luaXRfOChpZCosIGludCwgZW51bSBzY2hlZCwgaTY0LCBpNjQsIGk2NCwgaTY0KTsKKyAgaW50IF9fa21wY19kaXNwYXRjaF9uZXh0XzQoaWQqLCBpbnQsIHZvaWQqLCB2b2lkKiwgdm9pZCosIHZvaWQqKTsKKyAgaW50IF9fa21wY19kaXNwYXRjaF9uZXh0XzgoaWQqLCBpbnQsIHZvaWQqLCB2b2lkKiwgdm9pZCosIHZvaWQqKTsKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKy8vIEVuZCBvZiBkZWZpbml0aW9ucyBjb3BpZWQgZnJvbSBPcGVuTVAgUlRMLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgaWQgbG9jID0gezAsIDIsIDAsIDAsICI7ZmlsZTtmdW5jOzA7MDs7In07CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZAorcnVuX2xvb3AoCisgICAgaW50IGxvb3BfbGIsICAgLy8gTG9vcCBsb3dlciBib3VuZC4KKyAgICBpbnQgbG9vcF91YiwgICAvLyBMb29wIHVwcGVyIGJvdW5kLgorICAgIGludCBsb29wX3N0LCAgIC8vIExvb3Agc3RyaWRlLgorICAgIGludCBsY2h1bmsKKykgeworICBzdGF0aWMgaW50IHZvbGF0aWxlIGxvb3Bfc3luYyA9IDA7CisgIGludCBsYjsgICAvLyBDaHVuayBsb3dlciBib3VuZC4KKyAgaW50IHViOyAgIC8vIENodW5rIHVwcGVyIGJvdW5kLgorICBpbnQgc3Q7ICAgLy8gQ2h1bmsgc3RyaWRlLgorICBpbnQgcmM7CisgIGludCB0aWQgPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgaW50IGd0aWQgPSBfX2ttcGNfZ2xvYmFsX3RocmVhZF9udW0oJmxvYyk7CisgIGludCBsYXN0OworICBpbnQgdGMgPSAobG9vcF91YiAtIGxvb3BfbGIpIC8gbG9vcF9zdCArIDE7CisgIGludCBjaDsKKyAgaW50IG5vX2NodW5rID0gMDsKKyAgaWYgKGxjaHVuayA9PSAwKSB7CisgICAgbm9fY2h1bmsgPSAxOworICAgIGxjaHVuayA9IDE7CisgIH0KKyAgY2ggPSBsY2h1bmsgKiBTSU1EX0xFTjsKKyNpZiBfREVCVUcgPiAxCisgIHByaW50ZigicnVuX2xvb3AgZ3RpZCAlZCB0aWQgJWQgKGxiPSVkLCB1Yj0lZCwgc3Q9JWQsIGNoPSVkKVxuIiwKKyAgICAgICAgIGd0aWQsIHRpZCwgKGludClsb29wX2xiLCAoaW50KWxvb3BfdWIsIChpbnQpbG9vcF9zdCwgbGNodW5rKTsKKyNlbmRpZgorICAvLyBEb24ndCB0ZXN0IGRlZ2VuZXJhdGUgY2FzZXMgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIGRpc2NvdmVyZWQgYnkgY29kZWdlbi4KKyAgaWYgKGxvb3Bfc3QgPT0gMCkKKyAgICByZXR1cm47CisgIGlmIChsb29wX3N0ID4gMCA/IGxvb3BfbGIgPiBsb29wX3ViIDogbG9vcF9sYiA8IGxvb3BfdWIpCisgICAgcmV0dXJuOworICBfX2ttcGNfZGlzcGF0Y2hfaW5pdF80KCZsb2MsIGd0aWQsIGttcF9zY2hfcnVudGltZV9zaW1kLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BfbGIsIGxvb3BfdWIsIGxvb3Bfc3QsIFNJTURfTEVOKTsKKyAgeworICAgIC8vIExldCB0aGUgbWFzdGVyIHRocmVhZCBoYW5kbGUgdGhlIGNodW5rcyBhbG9uZS4KKyAgICBpbnQgY2h1bms7ICAgICAgLy8gTm8gb2YgY3VycmVudCBjaHVuay4KKyAgICBpbnQgbGFzdF91YjsgICAgLy8gVXBwZXIgYm91bmQgb2YgdGhlIGxhc3QgcHJvY2Vzc2VkIGNodW5rLgorICAgIHU2NCBjdXI7ICAgICAgICAvLyBOdW1iZXIgb2YgaW50ZXJhdGlvbnMgaW4gIGN1cnJlbnQgY2h1bmsuCisgICAgdTY0IG1heDsgICAgICAgIC8vIE1heCBhbGxvd2VkIGl0ZXJhdGlvbnMgZm9yIGN1cnJlbnQgY2h1bmsuCisgICAgaW50IHVuZGVyc2l6ZWQgPSAwOworICAgIGxhc3RfdWIgPSBsb29wX3ViOworICAgIGNodW5rID0gMDsKKyAgICBtYXggPSAobG9vcF91YiAtIGxvb3BfbGIpIC8gbG9vcF9zdCArIDE7CisgICAgLy8gVGhlIGZpcnN0IGNodW5rIGNhbiBjb25zdW1lIGFsbCBpdGVyYXRpb25zLgorICAgIHdoaWxlIChfX2ttcGNfZGlzcGF0Y2hfbmV4dF80KCZsb2MsIGd0aWQsICZsYXN0LCAmbGIsICZ1YiwgJnN0KSkgeworICAgICAgKysgY2h1bms7CisjaWYgX0RFQlVHCisgICAgICBwcmludGYoInRoICVkOiBjaHVuaz0lZCwgbGI9JWQsIHViPSVkIGNoICVkXG4iLAorICAgICAgICAgICAgIHRpZCwgY2h1bmssIChpbnQpbGIsIChpbnQpdWIsIChpbnQpKHViLWxiKzEpKTsKKyNlbmRpZgorICAgICAgLy8gQ2hlY2sgaWYgcHJldmlvdXMgY2h1bmsgKGl0IGlzIG5vdCB0aGUgZmluYWwgY2h1bmspIGlzIHVuZGVyc2l6ZWQuCisgICAgICBpZiAodW5kZXJzaXplZCkKKyAgICAgICAgcHJpbnRmKCJFcnJvciB3aXRoIGNodW5rICVkLCB0aCAlZCwgZXJyICVkXG4iLCBjaHVuaywgdGlkLCArK2Vycik7CisgICAgICBpZiAobG9vcF9zdCA+IDApIHsKKyAgICAgICAgaWYgKCEodWIgPD0gbG9vcF91YikpCisgICAgICAgICAgcHJpbnRmKCJFcnJvciB3aXRoIHViICVkLCAlZCwgY2ggJWQsIGVyciAlZFxuIiwKKyAgICAgICAgICAgICAgICAgKGludCl1YiwgKGludClsb29wX3ViLCBjaHVuaywgKytlcnIpOworICAgICAgICBpZiAoIShsYiA8PSB1YikpCisgICAgICAgICAgcHJpbnRmKCJFcnJvciB3aXRoIGJvdW5kcyAlZCwgJWQsICVkLCBlcnIgJWRcbiIsCisgICAgICAgICAgICAgICAgIChpbnQpbGIsIChpbnQpdWIsIGNodW5rLCArK2Vycik7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoISh1YiA+PSBsb29wX3ViKSkKKyAgICAgICAgICBwcmludGYoIkVycm9yIHdpdGggdWIgJWQsICVkLCAlZCwgZXJyICVkXG4iLAorICAgICAgICAgICAgICAgICAoaW50KXViLCAoaW50KWxvb3BfdWIsIGNodW5rLCArK2Vycik7CisgICAgICAgIGlmICghKGxiID49IHViKSkKKyAgICAgICAgICBwcmludGYoIkVycm9yIHdpdGggYm91bmRzICVkLCAlZCwgJWQsIGVyciAlZFxuIiwKKyAgICAgICAgICAgICAgICAgKGludClsYiwgKGludCl1YiwgY2h1bmssICsrZXJyKTsKKyAgICAgIH07IC8vIGlmCisgICAgICAvLyBTdHJpZGUgc2hvdWxkIG5vdCBjaGFuZ2UuCisgICAgICBpZiAoIShzdCA9PSBsb29wX3N0KSkKKyAgICAgICAgcHJpbnRmKCJFcnJvciB3aXRoIHN0ICVkLCAlZCwgY2ggJWQsIGVyciAlZFxuIiwKKyAgICAgICAgICAgICAgIChpbnQpc3QsIChpbnQpbG9vcF9zdCwgY2h1bmssICsrZXJyKTsKKyAgICAgIGN1ciA9ICggdWIgLSBsYiApIC8gbG9vcF9zdCArIDE7CisgICAgICAvLyBHdWlkZWQgc2NoZWR1bGluZyB1c2VzIEZQIGNvbXB1dGF0aW9ucywgc28gY3VycmVudCBjaHVuayBtYXkKKyAgICAgIC8vIGJlIGEgYml0IGJpZ2dlciAoKzEpIHRoYW4gYWxsb3dlZCBtYXhpbXVtLgorICAgICAgaWYgKCEoIGN1ciA8PSBtYXggKyAxKSkKKyAgICAgICAgcHJpbnRmKCJFcnJvciB3aXRoIGl0ZXIgJWQsICVkLCBlcnIgJWRcbiIsIGN1ciwgbWF4LCArK2Vycik7CisgICAgICAvLyBVcGRhdGUgbWF4aW11bSBmb3IgdGhlIG5leHQgY2h1bmsuCisgICAgICBpZiAobGFzdCkgeworICAgICAgICBpZiAoIW5vX2NodW5rICYmIGN1ciA+IGNoKQorICAgICAgICAgIHByaW50ZigiRXJyb3I6IHRvbyBiaWcgbGFzdCBjaHVuayAlZCAoJWQpLCB0aWQgJWQsIGVyciAlZFxuIiwKKyAgICAgICAgICAgICAgICAgKGludCljdXIsIGNoLCB0aWQsICsrZXJyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChjdXIgJSBjaCkKKyAgICAgICAgICBwcmludGYoIkVycm9yIHdpdGggY2h1bmsgJWQsICVkLCBjaCAlZCwgdGlkICVkLCBlcnIgJWRcbiIsCisgICAgICAgICAgICAgICAgIGNodW5rLCAoaW50KWN1ciwgY2gsIHRpZCwgKytlcnIpOworICAgICAgfQorICAgICAgaWYgKGN1ciA8IG1heCkKKyAgICAgICAgbWF4ID0gY3VyOworICAgICAgbGFzdF91YiA9IHViOworICAgICAgdW5kZXJzaXplZCA9IChjdXIgPCBjaCk7CisjaWYgX0RFQlVHID4gMQorICAgICAgaWYgKGxhc3QpCisgICAgICAgIHByaW50ZigidW5kZXIlZCBjdXIgJWQsIGNoICVkLCB0aWQgJWQsIHViICVkLCBsYiAlZCwgc3QgJWQgPT09PT09PVxuIiwKKyAgICAgICAgICAgICAgIHVuZGVyc2l6ZWQsY3VyLGNoLHRpZCx1YixsYixsb29wX3N0KTsKKyNlbmRpZgorICAgIH0gLy8gd2hpbGUKKyAgICAvLyBNdXN0IGhhdmUgdGhlIHJpZ2h0IGxhc3QgaXRlcmF0aW9uIGluZGV4LgorICAgIGlmIChsb29wX3N0ID4gMCkgeworICAgICAgaWYgKCEobGFzdF91YiA8PSBsb29wX3ViKSkKKyAgICAgICAgcHJpbnRmKCJFcnJvciB3aXRoIGxhc3QxICVkLCAlZCwgY2ggJWQsIGVyciAlZFxuIiwKKyAgICAgICAgICAgICAgIChpbnQpbGFzdF91YiwgKGludClsb29wX3ViLCBjaHVuaywgKytlcnIpOworICAgICAgaWYgKGxhc3QgJiYgIShsYXN0X3ViICsgbG9vcF9zdCA+IGxvb3BfdWIpKQorICAgICAgICBwcmludGYoIkVycm9yIHdpdGggbGFzdDIgJWQsICVkLCAlZCwgY2ggJWQsIGVyciAlZFxuIiwKKyAgICAgICAgICAgICAgIChpbnQpbGFzdF91YiwgKGludClsb29wX3N0LCAoaW50KWxvb3BfdWIsIGNodW5rLCArK2Vycik7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghKGxhc3RfdWIgPj0gbG9vcF91YikpCisgICAgICAgIHByaW50ZigiRXJyb3Igd2l0aCBsYXN0MSAlZCwgJWQsIGNoICVkLCBlcnIgJWRcbiIsCisgICAgICAgICAgICAgICAoaW50KWxhc3RfdWIsIChpbnQpbG9vcF91YiwgY2h1bmssICsrZXJyKTsKKyAgICAgIGlmIChsYXN0ICYmICEobGFzdF91YiArIGxvb3Bfc3QgPCBsb29wX3ViKSkKKyAgICAgICAgcHJpbnRmKCJFcnJvciB3aXRoIGxhc3QyICVkLCAlZCwgJWQsIGNoICVkLCBlcnIgJWRcbiIsCisgICAgICAgICAgICAgICAoaW50KWxhc3RfdWIsIChpbnQpbG9vcF9zdCwgKGludClsb29wX3ViLCBjaHVuaywgKytlcnIpOworICAgIH0gLy8gaWYKKyAgfQorICBfX2ttcGNfYmFycmllcigmbG9jLCBndGlkKTsKK30gLy8gcnVuX2xvb3AKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgaW50IGNodW5rID0gMDsKKyAgaWYgKGFyZ2MgPiAxKSB7CisgICAgY2hhciAqYnVmID0gbWFsbG9jKDggKyBzdHJsZW4oYXJndlsxXSkpOworICAgIC8vIGV4cGVjdCBjaHVuayBzaXplIGFzIGEgcGFyYW1ldGVyCisgICAgY2h1bmsgPSBhdG9pKGFyZ3ZbMV0pOworICAgIHN0cmNweShidWYsInN0YXRpYywiKTsKKyAgICBzdHJjYXQoYnVmLGFyZ3ZbMV0pOworICAgIHNldGVuKCJPTVBfU0NIRURVTEUiLGJ1ZiwxKTsKKyAgICBwcmludGYoIlRlc3Rpbmcgc2NoZWR1bGUoc2ltZDolcylcbiIsIGJ1Zik7CisgICAgZnJlZShidWYpOworICB9IGVsc2UgeworICAgIHNldGVuKCJPTVBfU0NIRURVTEUiLCJzdGF0aWMiLDEpOworICAgIHByaW50ZigiVGVzdGluZyBzY2hlZHVsZShzaW1kOnN0YXRpYylcbiIpOworICB9CisjcHJhZ21hIG9tcCBwYXJhbGxlbC8vIG51bV90aHJlYWRzKG51bV90aCkKKyAgcnVuX2xvb3AoMCwgMjYsIDEsIGNodW5rKTsKKyAgaWYgKGVycikgeworICAgIHByaW50ZigiZmFpbGVkLCBlcnIgPSAlZFxuIiwgZXJyKTsKKyAgICByZXR1cm4gMTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoInBhc3NlZFxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Iva21wX3NldF9kaXNwYXRjaF9idWYuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Iva21wX3NldF9kaXNwYXRjaF9idWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjM3OGZlCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9rbXBfc2V0X2Rpc3BhdGNoX2J1Zi5jCkBAIC0wLDAgKzEsOTEgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlICYmICVsaWJvbXAtcnVuIDcKKy8vIFJVTjogJWxpYm9tcC1ydW4gMCAmJiAlbGlib21wLXJ1biAtMQorLy8gUlVOOiAlbGlib21wLXJ1biAxICYmICVsaWJvbXAtcnVuIDIgJiYgJWxpYm9tcC1ydW4gNQorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUgLURNWV9TQ0hFRFVMRT1ndWlkZWQgJiYgJWxpYm9tcC1ydW4gNworLy8gUlVOOiAlbGlib21wLXJ1biAxICYmICVsaWJvbXAtcnVuIDIgJiYgJWxpYm9tcC1ydW4gNQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b21wLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisjZGVmaW5lIElOQ1IgNworI2RlZmluZSBNWV9NQVggMjAwCisjZGVmaW5lIE1ZX01JTiAtMjAwCisjaWZuZGVmIE1ZX1NDSEVEVUxFCisjIGRlZmluZSBNWV9TQ0hFRFVMRSBkeW5hbWljCisjZW5kaWYKKworaW50IG51bV9kaXNwX2J1ZmZlcnMsIG51bV9sb29wczsKK2ludCBhLCBiLCBhX2tub3duX3ZhbHVlLCBiX2tub3duX3ZhbHVlOworCitpbnQgdGVzdF9rbXBfc2V0X2Rpc3BfbnVtX2J1ZmZlcnMoKQoreworICBpbnQgc3VjY2VzcyA9IDE7CisgIGEgPSAwOworICBiID0gMDsKKyAgLy8gcnVuIG1hbnkgc21hbGwgZHluYW1pYyBsb29wcyB0byBzdHJlc3MgdGhlIGRpc3BhdGNoIGJ1ZmZlciBzeXN0ZW0KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpLGo7CisgICAgZm9yIChqID0gMDsgaiA8IG51bV9sb29wczsgaisrKSB7CisgICAgICAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoTVlfU0NIRURVTEUpIG5vd2FpdAorICAgICAgZm9yIChpID0gTVlfTUlOOyBpIDwgTVlfTUFYOyBpKz1JTkNSKSB7CisgICAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgICBhKys7CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoTVlfU0NIRURVTEUpIG5vd2FpdAorICAgICAgZm9yIChpID0gTVlfTUFYOyBpID49IE1ZX01JTjsgaS09SU5DUikgeworICAgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgICAgYisrOworICAgICAgfQorICAgIH0KKyAgfQorICAvLyBkZXRlY3QgZmFpbHVyZQorICBpZiAoYSAhPSBhX2tub3duX3ZhbHVlIHx8IGIgIT0gYl9rbm93bl92YWx1ZSkgeworICAgIHN1Y2Nlc3MgPSAwOworICAgIHByaW50ZigiYSA9ICVkIChzaG91bGQgYmUgJWQpLCBiID0gJWQgKHNob3VsZCBiZSAlZClcbiIsIGEsIGFfa25vd25fdmFsdWUsCisgICAgICAgICAgIGIsIGJfa25vd25fdmFsdWUpOworICB9CisgIHJldHVybiBzdWNjZXNzOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgIGludCBpLGo7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgaWYgKGFyZ2MgIT0gMikgeworICAgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6ICVzIG51bV9kaXNwX2J1ZmZlcnNcbiIsIGFyZ3ZbMF0pOworICAgIGV4aXQoMSk7CisgIH0KKworICAvLyBzZXQgdGhlIG51bWJlciBvZiBkaXNwYXRjaCBidWZmZXJzCisgIG51bV9kaXNwX2J1ZmZlcnMgPSBhdG9pKGFyZ3ZbMV0pOworICBrbXBfc2V0X2Rpc3BfbnVtX2J1ZmZlcnMobnVtX2Rpc3BfYnVmZmVycyk7CisKKyAgLy8gZmlndXJlIG91dCB0aGUga25vd24gdmFsdWVzIHRvIGNvbXBhcmUgd2l0aCBjYWxjdWxhdGVkIHJlc3VsdAorICBhX2tub3duX3ZhbHVlID0gMDsKKyAgYl9rbm93bl92YWx1ZSA9IDA7CisKKyAgLy8gaWYgc3BlY2lmaWVkIHRvIHVzZSBiYWQgbnVtX2Rpc3BfYnVmZmVycyBzZXQgbnVtX2xvb3BzCisgIC8vIHRvIHNvbWV0aGluZyByZWFzb25hYmxlCisgIGlmIChudW1fZGlzcF9idWZmZXJzIDw9IDApCisgICAgbnVtX2xvb3BzID0gMTA7CisgIGVsc2UKKyAgICBudW1fbG9vcHMgPSBudW1fZGlzcF9idWZmZXJzKjEwOworCisgIGZvciAoaiA9IDA7IGogPCBudW1fbG9vcHM7IGorKykgeworICAgIGZvciAoaSA9IE1ZX01JTjsgaSA8IE1ZX01BWDsgaSs9SU5DUikKKyAgICAgIGFfa25vd25fdmFsdWUrKzsKKyAgICBmb3IgKGkgPSBNWV9NQVg7IGkgPj0gTVlfTUlOOyBpLT1JTkNSKQorICAgICAgYl9rbm93bl92YWx1ZSsrOworICB9CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X2ttcF9zZXRfZGlzcF9udW1fYnVmZmVycygpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX2JpZ2JvdW5kcy5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX2JpZ2JvdW5kcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZjU3OWIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3JfYmlnYm91bmRzLmMKQEAgLTAsMCArMSw2NyBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUgLURNWV9TQ0hFRFVMRT1zdGF0aWMgJiYgJWxpYm9tcC1ydW4KKy8vIFJVTjogJWxpYm9tcC1jb21waWxlIC1ETVlfU0NIRURVTEU9ZHluYW1pYyAmJiAlbGlib21wLXJ1bgorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUgLURNWV9TQ0hFRFVMRT1ndWlkZWQgJiYgJWxpYm9tcC1ydW4KKy8vIFhGQUlMOiAqCisvKgorICogVGVzdCB0aGF0IGxhcmdlIGJvdW5kcyBhcmUgaGFuZGxlZCBwcm9wZXJseSBhbmQgY2FsY3VsYXRpb25zIG9mCisgKiBsb29wIGl0ZXJhdGlvbnMgZG9uJ3QgYWNjaWRlbnRseSBvdmVyZmxvdworICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvbXAuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKyNkZWZpbmUgSU5DUiA1MDAwMDAwMAorI2RlZmluZSBNWV9NQVggMjAwMDAwMDAwMAorI2RlZmluZSBNWV9NSU4gLTIwMDAwMDAwMDAKKyNpZm5kZWYgTVlfU0NIRURVTEUKKyMgZGVmaW5lIE1ZX1NDSEVEVUxFIHN0YXRpYworI2VuZGlmCisKK2ludCBhLCBiLCBhX2tub3duX3ZhbHVlLCBiX2tub3duX3ZhbHVlOworCitpbnQgdGVzdF9vbXBfZm9yX2JpZ2JvdW5kcygpCit7CisgIGEgPSAwOworICBiID0gMDsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShNWV9TQ0hFRFVMRSkKKyAgICBmb3IgKGkgPSBJTlRfTUlOOyBpIDwgTVlfTUFYOyBpKz1JTkNSKSB7CisgICAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgICBhKys7CisgICAgfQorICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShNWV9TQ0hFRFVMRSkKKyAgICBmb3IgKGkgPSBJTlRfTUFYOyBpID49IE1ZX01JTjsgaS09SU5DUikgeworICAgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgICAgYisrOworICAgIH0KKyAgfQorICBwcmludGYoImEgPSAlZCAoc2hvdWxkIGJlICVkKSwgYiA9ICVkIChzaG91bGQgYmUgJWQpXG4iLCBhLCBhX2tub3duX3ZhbHVlLCBiLCBiX2tub3duX3ZhbHVlKTsKKyAgcmV0dXJuIChhID09IGFfa25vd25fdmFsdWUgJiYgYiA9PSBiX2tub3duX3ZhbHVlKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBhX2tub3duX3ZhbHVlID0gMDsKKyAgZm9yIChpID0gSU5UX01JTjsgaSA8IE1ZX01BWDsgaSs9SU5DUikgeworICAgICAgYV9rbm93bl92YWx1ZSsrOworICB9CisKKyAgYl9rbm93bl92YWx1ZSA9IDA7CisgIGZvciAoaSA9IElOVF9NQVg7IGkgPj0gTVlfTUlOOyBpLT1JTkNSKSB7CisgICAgICBiX2tub3duX3ZhbHVlKys7CisgIH0KKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2Zvcl9iaWdib3VuZHMoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9jb2xsYXBzZS5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX2NvbGxhcHNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA4MDg2ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9jb2xsYXBzZS5jCkBAIC0wLDAgKzEsNTEgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgdGhhdCBpIGlzIGluY3JlYXNpbmcgbW9ub3RvbmljYWxseQorICAgd2l0aCBlYWNoIGNhbGwgKi8KK3N0YXRpYyBpbnQgY2hlY2tfaV9pc2xhcmdlciAoaW50IGkpCit7CisgIHN0YXRpYyBpbnQgbGFzdF9pOworICBpbnQgaXNsYXJnZXI7CisgIGlmIChpPT0xKQorICAgIGxhc3RfaT0wOworICBpc2xhcmdlciA9ICgoaSA+PSBsYXN0X2kpJiYoaSAtIGxhc3RfaTw9MSkpOworICBsYXN0X2kgPSBpOworICByZXR1cm4gKGlzbGFyZ2VyKTsKK30KKworaW50IHRlc3Rfb21wX2Zvcl9jb2xsYXBzZSgpCit7CisgIGludCBpc19sYXJnZXIgPSAxOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaSxqOworICAgIGludCBteV9pc2xhcmdlciA9IDE7CisgICAgI3ByYWdtYSBvbXAgZm9yIHByaXZhdGUoaSxqKSBzY2hlZHVsZShzdGF0aWMsMSkgY29sbGFwc2UoMikgb3JkZXJlZAorICAgIGZvciAoaSA9IDE7IGkgPCAxMDA7IGkrKykgeworICAgICAgZm9yIChqID0xOyBqIDwxMDA7IGorKykgeworICAgICAgICAjcHJhZ21hIG9tcCBvcmRlcmVkCisgICAgICAgIG15X2lzbGFyZ2VyID0gY2hlY2tfaV9pc2xhcmdlcihpKSYmbXlfaXNsYXJnZXI7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgaXNfbGFyZ2VyID0gaXNfbGFyZ2VyICYmIG15X2lzbGFyZ2VyOworICB9CisgIHJldHVybiAoaXNfbGFyZ2VyKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2Zvcl9jb2xsYXBzZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX2ZpcnN0cHJpdmF0ZS5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX2ZpcnN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNDEyMWMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3JfZmlyc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw1NSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHN1bTE7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKHN1bTEpCisKK2ludCB0ZXN0X29tcF9mb3JfZmlyc3Rwcml2YXRlKCkKK3sKKyAgaW50IHN1bTsKKyAgaW50IHN1bTA7CisgIGludCBrbm93bl9zdW07CisgIGludCB0aHJlYWRzbnVtOworCisgIHN1bSA9IDA7CisgIHN1bTAgPSAxMjM0NTsKKyAgc3VtMSA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIHRocmVhZHNudW09b21wX2dldF9udW1fdGhyZWFkcygpOworICAgIH0KKyAgICAvKiBzdW0wID0gMDsgKi8KKworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvciBmaXJzdHByaXZhdGUoc3VtMCkKKyAgICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKSB7CisgICAgICBzdW0wID0gc3VtMCArIGk7CisgICAgICBzdW0xID0gc3VtMDsKKyAgICB9ICAvKiBlbmQgb2YgZm9yICovCisKKyAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgIHsKKyAgICAgIHN1bSA9IHN1bSArIHN1bTE7CisgICAgfSAgLyogZW5kIG9mIGNyaXRpY2FsICovCisgIH0gIC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICBrbm93bl9zdW0gPSAxMjM0NSogdGhyZWFkc251bSsgKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfZm9yX2ZpcnN0cHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX2xhc3Rwcml2YXRlLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3JfbGFzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODY5NGI4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX2xhc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw1MiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHN1bTA7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKHN1bTApCisKK2ludCB0ZXN0X29tcF9mb3JfbGFzdHByaXZhdGUoKQoreworICBpbnQgc3VtID0gMDsKKyAgaW50IGtub3duX3N1bTsKKyAgaW50IGkwOworCisgIGkwID0gLTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIHN1bTAgPSAwOworICAgIHsgIC8qIEJlZ2luIG9mIG9ycGhhbmVkIGJsb2NrICovCisgICAgICBpbnQgaTsKKyAgICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShzdGF0aWMsNykgbGFzdHByaXZhdGUoaTApCisgICAgICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKSB7CisgICAgICAgIHN1bTAgPSBzdW0wICsgaTsKKyAgICAgICAgaTAgPSBpOworICAgICAgfSAgLyogZW5kIG9mIGZvciAqLworICAgIH0gIC8qIGVuZCBvZiBvcnBoYW5lZCBibG9jayAqLworCisgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICB7CisgICAgICBzdW0gPSBzdW0gKyBzdW0wOworICAgIH0gIC8qIGVuZCBvZiBjcml0aWNhbCAqLworICB9ICAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgIGZwcmludGYoc3RkZXJyLCAia25vd25fc3VtID0gJWQgLCBzdW0gPSAlZFxuIixrbm93bl9zdW0sc3VtKTsKKyAgZnByaW50ZihzdGRlcnIsICJMT09QQ09VTlQgPSAlZCAsIGkwID0gJWRcbiIsTE9PUENPVU5ULGkwKTsKKyAgcmV0dXJuICgoa25vd25fc3VtID09IHN1bSkgJiYgKGkwID09IExPT1BDT1VOVCkpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvciAoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2Zvcl9sYXN0cHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX25vd2FpdC5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX25vd2FpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YTQ3NzUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfbm93YWl0LmMKQEAgLTAsMCArMSw3NyBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisvKgorICogVGhpcyB0ZXN0IHdpbGwgaGFuZyBpZiB0aGUgbm93YWl0IGlzIG5vdCB3b3JraW5nIHByb3Blcmx5LgorICoKKyAqIEl0IHJlbGllcyBvbiBhIHRocmVhZCBza2lwcGluZyB0byB0aGUgc2Vjb25kIGZvciBjb25zdHJ1Y3QgdG8KKyAqIHJlbGVhc2UgdGhlIHRocmVhZHMgaW4gdGhlIGZpcnN0IGZvciBjb25zdHJ1Y3QuCisgKgorICogQWxzbywgd2UgdXNlIHN0YXRpYyBzY2hlZHVsaW5nIHRvIGd1YXJhbnRlZSB0aGF0IG9uZQorICogdGhyZWFkIHdpbGwgbWFrZSBpdCB0byB0aGUgc2Vjb25kIGZvciBjb25zdHJ1Y3QuCisgKi8KK3ZvbGF0aWxlIGludCByZWxlYXNlOwordm9sYXRpbGUgaW50IGNvdW50OworCit2b2lkIHdhaXRfZm9yX3JlbGVhc2VfdGhlbl9pbmNyZW1lbnQoaW50IHJhbmspCit7CisgIGZwcmludGYoc3RkZXJyLCAiVGhyZWFkIG5yICVkIGVudGVycyBmaXJzdCBmb3IgY29uc3RydWN0IgorICAgICIgYW5kIHdhaXRzLlxuIiwgcmFuayk7CisgIHdoaWxlIChyZWxlYXNlID09IDApOworICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgY291bnQrKzsKK30KKwordm9pZCByZWxlYXNlX2FuZF9pbmNyZW1lbnQoaW50IHJhbmspCit7CisgIGZwcmludGYoc3RkZXJyLCAiVGhyZWFkIG5yICVkIHNldHMgcmVsZWFzZSB0byAxXG4iLCByYW5rKTsKKyAgcmVsZWFzZSA9IDE7CisgICNwcmFnbWEgb21wIGF0b21pYworICBjb3VudCsrOworfQorCitpbnQgdGVzdF9vbXBfZm9yX25vd2FpdCgpCit7CisgIHJlbGVhc2UgPSAwOworICBjb3VudCA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMoNCkKKyAgeworICAgIGludCByYW5rOworICAgIGludCBpOworCisgICAgcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworCisgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKHN0YXRpYykgbm93YWl0CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgaWYgKGkgPCAzKQorICAgICAgICB3YWl0X2Zvcl9yZWxlYXNlX3RoZW5faW5jcmVtZW50KHJhbmspOworICAgICAgZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVGhyZWFkIG5yICVkIGVudGVycyBmaXJzdCBmb3IgYW5kIGdvZXMgIgorICAgICAgICAgICJpbW1lZGlhdGVseSB0byB0aGUgbmV4dCBmb3IgY29uc3RydWN0IHRvIHJlbGVhc2UuXG4iLCByYW5rKTsKKyAgICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICAgIGNvdW50Kys7CisgICAgICB9CisgICAgfQorCisgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKHN0YXRpYykKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIHJlbGVhc2VfYW5kX2luY3JlbWVudChyYW5rKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIChjb3VudD09OCk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9mb3Jfbm93YWl0KCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfb3JkZXJlZC5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX29yZGVyZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGFjN2ViCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX29yZGVyZWQuYwpAQCAtMCwwICsxLDYwIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitzdGF0aWMgaW50IGxhc3RfaSA9IDA7CisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgdGhhdCBpIGlzIGluY3JlYXNpbmcgbW9ub3RvbmljYWxseQorICAgd2l0aCBlYWNoIGNhbGwgKi8KK3N0YXRpYyBpbnQgY2hlY2tfaV9pc2xhcmdlciAoaW50IGkpCit7CisgIGludCBpc2xhcmdlcjsKKyAgaXNsYXJnZXIgPSAoaSA+IGxhc3RfaSk7CisgIGxhc3RfaSA9IGk7CisgIHJldHVybiAoaXNsYXJnZXIpOworfQorCitpbnQgdGVzdF9vbXBfZm9yX29yZGVyZWQoKQoreworICBpbnQgc3VtOworICBpbnQgaXNfbGFyZ2VyID0gMTsKKyAgaW50IGtub3duX3N1bTsKKworICBsYXN0X2kgPSAwOworICBzdW0gPSAwOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaTsKKyAgICBpbnQgbXlfaXNsYXJnZXIgPSAxOworICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShzdGF0aWMsMSkgb3JkZXJlZAorICAgIGZvciAoaSA9IDE7IGkgPCAxMDA7IGkrKykgeworICAgICAgI3ByYWdtYSBvbXAgb3JkZXJlZAorICAgICAgeworICAgICAgICBteV9pc2xhcmdlciA9IGNoZWNrX2lfaXNsYXJnZXIoaSkgJiYgbXlfaXNsYXJnZXI7CisgICAgICAgIHN1bSA9IHN1bSArIGk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgeworICAgICAgaXNfbGFyZ2VyID0gaXNfbGFyZ2VyICYmIG15X2lzbGFyZ2VyOworICAgIH0KKyAgfQorCisgIGtub3duX3N1bT0oOTkgKiAxMDApIC8gMjsKKyAgcmV0dXJuICgoa25vd25fc3VtID09IHN1bSkgJiYgaXNfbGFyZ2VyKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2Zvcl9vcmRlcmVkKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3JfcHJpdmF0ZS5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjUzN2I5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX3ByaXZhdGUuYwpAQCAtMCwwICsxLDYzIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisvKiBVdGlsaXR5IGZ1bmN0aW9uIGRvIHNwZW5kIHNvbWUgdGltZSBpbiBhIGxvb3AgKi8KK3N0YXRpYyB2b2lkIGRvX3NvbWVfd29yaygpCit7CisgIGludCBpOworICBkb3VibGUgc3VtID0gMDsKKyAgZm9yKGkgPSAwOyBpIDwgMTAwMDsgaSsrKXsKKyAgc3VtICs9IHNxcnQgKChkb3VibGUpIGkpOworICB9Cit9CisKK2ludCBzdW0xOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShzdW0xKQorCitpbnQgdGVzdF9vbXBfZm9yX3ByaXZhdGUoKQoreworICBpbnQgc3VtID0gMDsKKyAgaW50IHN1bTA7CisgIGludCBrbm93bl9zdW07CisKKyAgc3VtMCA9IDA7ICAvKiBzZXR0aW5nIChnbG9iYWwpIHN1bTAgPSAwICovCisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIHN1bTEgPSAwOyAgLyogc2V0dGluZyBzdW0xIGluIGVhY2ggdGhyZWFkIHRvIDAgKi8KKyAgICB7ICAvKiBiZWdpbiBvZiBvcnBoYW5lZCBibG9jayAqLworICAgICAgaW50IGk7CisgICAgICAjcHJhZ21hIG9tcCBmb3IgcHJpdmF0ZShzdW0wKSBzY2hlZHVsZShzdGF0aWMsMSkKKyAgICAgIGZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspIHsKKyAgICAgICAgc3VtMCA9IHN1bTE7CisgICAgICAgICNwcmFnbWEgb21wIGZsdXNoCisgICAgICAgIHN1bTAgPSBzdW0wICsgaTsKKyAgICAgICAgZG9fc29tZV93b3JrICgpOworICAgICAgICAjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgICBzdW0xID0gc3VtMDsKKyAgICAgIH0KKyAgICB9ICAvKiBlbmQgb2Ygb3JwaGFuZWQgYmxvY2sgKi8KKworICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgeworICAgICAgc3VtID0gc3VtICsgc3VtMTsKKyAgICB9ICAvKmVuZCBvZiBjcml0aWNhbCovCisgIH0gIC8qIGVuZCBvZiBwYXJhbGxlbCovCisgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2Zvcl9wcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3JfcmVkdWN0aW9uLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3JfcmVkdWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhmMDkwNwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9yZWR1Y3Rpb24uYwpAQCAtMCwwICsxLDMzOSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworI2RlZmluZSBET1VCTEVfRElHSVRTIDIwICAvKiBkdF5ET1VCTEVfRElHSVRTICovCisjZGVmaW5lIE1BWF9GQUNUT1IgMTAKKyNkZWZpbmUgS05PV05fUFJPRFVDVCAzNjI4ODAwICAvKiAxMCEgKi8KKworaW50IHRlc3Rfb21wX2Zvcl9yZWR1Y3Rpb24gKCkKK3sKKyAgZG91YmxlIGR0OworICBpbnQgc3VtOworICBpbnQgZGlmZjsKKyAgaW50IHByb2R1Y3QgPSAxOworICBkb3VibGUgZHN1bTsKKyAgZG91YmxlIGRrbm93bl9zdW07CisgIGRvdWJsZSBkZGlmZjsKKyAgaW50IGxvZ2ljX2FuZDsKKyAgaW50IGxvZ2ljX29yOworICBpbnQgYml0X2FuZDsKKyAgaW50IGJpdF9vcjsKKyAgaW50IGV4Y2x1c2l2X2JpdF9vcjsKKyAgaW50ICpsb2dpY3M7CisgIGludCBpOworICBpbnQga25vd25fc3VtOworICBpbnQga25vd25fcHJvZHVjdDsKKyAgZG91YmxlIHJvdW5kaW5nX2Vycm9yID0gMS5FLTk7IC8qIG92ZXIgYWxsIHJvdW5kaW5nIGVycm9yIHRvIGJlCisgICAgICAgICAgICAgICAgICAgIGlnbm9yZWQgaW4gdGhlIGRvdWJsZSB0ZXN0cyAqLworICBkb3VibGUgZHB0OworICBpbnQgcmVzdWx0ID0gMDsKKyAgaW50IGxvZ2ljc0FycmF5W0xPT1BDT1VOVF07CisKKyAgLyogVmFyaWFibGVzIGZvciBpbnRlZ2VyIHRlc3RzICovCisgIHN1bSA9IDA7CisgIHByb2R1Y3QgPSAxOworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgIC8qIHZhcmlhYmVscyBmb3IgZG91YmxlIHRlc3RzICovCisgIGR0ID0gMS4gLyAzLjsgIC8qIGJhc2Ugb2YgZ2VvbWV0cmljIHJvdyBmb3IgKyBhbmQgLSB0ZXN0Ki8KKyAgZHN1bSA9IDAuOworICAvKiBWYXJpYWJlbGVzIGZvciBsb2dpYyAgdGVzdHMgKi8KKyAgbG9naWNzID0gbG9naWNzQXJyYXk7CisgIGxvZ2ljX2FuZCA9IDE7CisgIGxvZ2ljX29yID0gMDsKKyAgLyogVmFyaWFiZWxlcyBmb3IgYml0IG9wZXJhdG9ycyB0ZXN0cyAqLworICBiaXRfYW5kID0gMTsKKyAgYml0X29yID0gMDsKKyAgLyogVmFyaWFibGVzIGZvciBleGNsdXNpdiBiaXQgb3IgKi8KKyAgZXhjbHVzaXZfYml0X29yID0gMDsKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiogVGVzdHMgZm9yIGludGVnZXJzICAgICAgICAgICAgICAgICAgICAgICAgICoqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qKioqIFRlc3RpbmcgaW50ZWdlciBhZGRpdGlvbiAqKioqLworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGo7CisgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcmVkdWN0aW9uKCs6c3VtKQorICAgIGZvciAoaiA9IDE7IGogPD0gTE9PUENPVU5UOyBqKyspIHsKKyAgICAgIHN1bSA9IHN1bSArIGo7CisgICAgfQorICB9CisgIGlmIChrbm93bl9zdW0gIT0gc3VtKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQiCisgICAgICAiIGluc3RlYWQgb2YgJWQuXG4iLCBzdW0sIGtub3duX3N1bSk7CisgIH0KKworICAvKioqKiBUZXN0aW5nIGludGVnZXIgc3VidHJhY3RvbiAqKioqLworICBkaWZmID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGo7CisgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcmVkdWN0aW9uKC06ZGlmZikKKyAgICBmb3IgKGogPSAxOyBqIDw9IExPT1BDT1VOVDsgaisrKSB7CisgICAgICBkaWZmID0gZGlmZiAtIGo7CisgICAgfQorICB9CisgIGlmIChkaWZmICE9IDApIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiBkaWZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQiCisgICAgICAiIGluc3RlYWQgb2YgMC5cbiIsIGRpZmYpOworICB9CisKKyAgLyoqKiogVGVzdGluZyBpbnRlZ2VyIG11bHRpcGxpY2F0aW9uICoqKiovCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgajsKKyAgICAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSByZWR1Y3Rpb24oKjpwcm9kdWN0KQorICAgIGZvciAoaiA9IDE7IGogPD0gTUFYX0ZBQ1RPUjsgaisrKSB7CisgICAgICBwcm9kdWN0ICo9IGo7CisgICAgfQorICB9CisgIGtub3duX3Byb2R1Y3QgPSBLTk9XTl9QUk9EVUNUOworICBpZihrbm93bl9wcm9kdWN0ICE9IHByb2R1Y3QpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsIkVycm9yIGluIFByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCIKKyAgICAgICIgaW5zdGVhZCBvZiAlZFxuIixwcm9kdWN0LGtub3duX3Byb2R1Y3QpOworICB9CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqIFRlc3RzIGZvciBkb3VibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAvKioqKiBUZXN0aW5nIGRvdWJsZSBhZGRpdGlvbiAqKioqLworICBkc3VtID0gMC47CisgIGRwdCA9IDEuOworICBmb3IgKGkgPSAwOyBpIDwgRE9VQkxFX0RJR0lUUzsgKytpKSB7CisgICAgZHB0ICo9IGR0OworICB9CisgIGRrbm93bl9zdW0gPSAoMSAtIGRwdCkgLyAoMSAtIGR0KTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBqOworICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHJlZHVjdGlvbigrOmRzdW0pCisgICAgZm9yIChqID0gMDsgaiA8IERPVUJMRV9ESUdJVFM7IGorKykgeworICAgICAgZHN1bSArPSBwb3cgKGR0LCBqKTsKKyAgICB9CisgIH0KKyAgaWYgKGZhYnMgKGRzdW0gLSBka25vd25fc3VtKSA+IHJvdW5kaW5nX2Vycm9yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiXG5FcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVmIgorICAgICAgIiBpbnN0ZWFkIG9mOiAlZiAoRGlmZmVyZW5jZTogJUUpXG4iLAorICAgICAgZHN1bSwgZGtub3duX3N1bSwgZHN1bS1ka25vd25fc3VtKTsKKyAgfQorCisgIC8qKioqIFRlc3RpbmcgZG91YmxlIHN1YnRyYWN0aW9uICoqKiovCisgIGRkaWZmID0gKDEgLSBkcHQpIC8gKDEgLSBkdCk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgajsKKyAgICAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSByZWR1Y3Rpb24oLTpkZGlmZikKKyAgICBmb3IgKGogPSAwOyBqIDwgRE9VQkxFX0RJR0lUUzsgKytqKSB7CisgICAgICBkZGlmZiAtPSBwb3cgKGR0LCBqKTsKKyAgICB9CisgIH0KKyAgaWYgKGZhYnMgKGRkaWZmKSA+IHJvdW5kaW5nX2Vycm9yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJUUiCisgICAgICAiIGluc3RlYWQgb2YgMC4wXG4iLCBkZGlmZik7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKiBUZXN0cyBmb3IgbG9naWNhbCB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICoqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qKioqIFRlc3RpbmcgbG9naWMgYW5kICoqKiovCisgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykgeworICAgIGxvZ2ljc1tpXSA9IDE7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGo7CisgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCkKKyAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opIHsKKyAgICAgIGxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2pdKTsKKyAgICB9CisgIH0KKyAgaWYoIWxvZ2ljX2FuZCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDFcbiIpOworICB9CisKKyAgbG9naWNfYW5kID0gMTsKKyAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGo7CisgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCkKKyAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opIHsKKyAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAmJiBsb2dpY3Nbal07CisgICAgfQorICB9CisgIGlmKGxvZ2ljX2FuZCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDJcbiIpOworICB9CisKKyAgLyoqKiogVGVzdGluZyBsb2dpYyBvciAqKioqLworICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspIHsKKyAgICBsb2dpY3NbaV0gPSAwOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBqOworICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHJlZHVjdGlvbih8fDpsb2dpY19vcikKKyAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opIHsKKyAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgfHwgbG9naWNzW2pdOworICAgIH0KKyAgfQorICBpZiAobG9naWNfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDFcbiIpOworICB9CisKKyAgbG9naWNfb3IgPSAwOworICBsb2dpY3NbTE9PUENPVU5UIC8gMl0gPSAxOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgajsKKyAgICAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSByZWR1Y3Rpb24ofHw6bG9naWNfb3IpCisgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKSB7CisgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tqXTsKKyAgICB9CisgIH0KKyAgaWYoIWxvZ2ljX29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyXG4iKTsKKyAgfQorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKiBUZXN0cyBmb3IgYml0IHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAvKioqKiBUZXN0aW5nIGJpdCBhbmQgKioqKi8KKyAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKSB7CisgICAgbG9naWNzW2ldID0gMTsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgajsKKyAgICAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSByZWR1Y3Rpb24oJjpiaXRfYW5kKQorICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikgeworICAgICAgYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2pdKTsKKyAgICB9CisgIH0KKyAgaWYgKCFiaXRfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDFcbiIpOworICB9CisKKyAgYml0X2FuZCA9IDE7CisgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBqOworICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHJlZHVjdGlvbigmOmJpdF9hbmQpCisgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKSB7CisgICAgICBiaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tqXTsKKyAgICB9CisgIH0KKyAgaWYgKGJpdF9hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMlxuIik7CisgIH0KKworICAvKioqKiBUZXN0aW5nIGJpdCBvciAqKioqLworICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspIHsKKyAgICBsb2dpY3NbaV0gPSAwOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBqOworICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHJlZHVjdGlvbih8OmJpdF9vcikKKyAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opIHsKKyAgICAgIGJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tqXTsKKyAgICB9CisgIH0KKyAgaWYgKGJpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluIEJJVCBPUiBwYXJ0IDFcbiIpOworICB9CisKKyAgYml0X29yID0gMDsKKyAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGo7CisgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcmVkdWN0aW9uKHw6Yml0X29yKQorICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikgeworICAgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2pdOworICAgIH0KKyAgfQorICBpZiAoIWJpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluIEJJVCBPUiBwYXJ0IDJcbiIpOworICB9CisKKyAgLyoqKiogVGVzdGluZyBleGNsdXNpdmUgYml0IG9yICoqKiovCisgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykgeworICAgIGxvZ2ljc1tpXSA9IDA7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGo7CisgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKQorICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikgeworICAgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2pdOworICAgIH0KKyAgfQorICBpZiAoZXhjbHVzaXZfYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMVxuIik7CisgIH0KKworICBleGNsdXNpdl9iaXRfb3IgPSAwOworICBsb2dpY3NbTE9PUENPVU5UIC8gMl0gPSAxOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgajsKKyAgICAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSByZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpCisgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKSB7CisgICAgICBleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3Nbal07CisgICAgfQorICB9CisgIGlmICghZXhjbHVzaXZfYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMlxuIik7CisgIH0KKworICByZXR1cm4gKHJlc3VsdCA9PSAwKTsKKyAgZnJlZSAobG9naWNzKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2Zvcl9yZWR1Y3Rpb24oKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9zY2hlZHVsZV9hdXRvLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfc2NoZWR1bGVfYXV0by5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NTYxN2MKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfc2NoZWR1bGVfYXV0by5jCkBAIC0wLDAgKzEsNjkgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCBzdW0xOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShzdW0xKQorCitpbnQgdGVzdF9vbXBfZm9yX2F1dG8oKQoreworICBpbnQgajsKKyAgaW50IHN1bTsKKyAgaW50IHN1bTA7CisgIGludCBrbm93bl9zdW07CisgIGludCB0aHJlYWRzbnVtOworCisgIHN1bSA9IDA7CisgIHN1bTAgPSAxMjM0NTsKKworICAvLyBhcnJheSB3aGljaCBrZWVwcyB0cmFjayBvZiB3aGljaCB0aHJlYWRzIHBhcnRpY2lwYXRlZCBpbiB0aGUgZm9yIGxvb3AKKyAgLy8gZS5nLiwgZ2l2ZW4gNCB0aHJlYWRzLCBbIDAgfCAxIHwgMSB8IDAgXSBpbXBsaWVzCisgIC8vICAgICAgIHRocmVhZHMgMCBhbmQgMyBkaWQgbm90LCB0aHJlYWRzIDEgYW5kIDIgZGlkCisgIGludCBtYXhfdGhyZWFkcyA9IG9tcF9nZXRfbWF4X3RocmVhZHMoKTsKKyAgaW50KiBhY3RpdmVfdGhyZWFkcyA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSptYXhfdGhyZWFkcyk7CisgIGZvcihqID0gMDsgaiA8IG1heF90aHJlYWRzOyBqKyspCisgICAgYWN0aXZlX3RocmVhZHNbal0gPSAwOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaTsKKyAgICBzdW0xID0gMDsKKyAgICAjcHJhZ21hIG9tcCBmb3IgZmlyc3Rwcml2YXRlKHN1bTApIHNjaGVkdWxlKGF1dG8pCisgICAgZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykgeworICAgICAgYWN0aXZlX3RocmVhZHNbb21wX2dldF90aHJlYWRfbnVtKCldID0gMTsKKyAgICAgIHN1bTAgPSBzdW0wICsgaTsKKyAgICAgIHN1bTEgPSBzdW0wOworICAgIH0KKworICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgeworICAgICAgc3VtID0gc3VtICsgc3VtMTsKKyAgICB9CisgIH0KKworICAvLyBjb3VudCB0aGUgdGhyZWFkcyB0aGF0IHBhcnRpY2lwYXRlZCAoc3VtIGlzIHN0b3JlZCBpbiB0aHJlYWRzbnVtKQorICB0aHJlYWRzbnVtPTA7CisgIGZvcihqID0gMDsgaiA8IG1heF90aHJlYWRzOyBqKyspIHsKKyAgICBpZihhY3RpdmVfdGhyZWFkc1tqXSkKKyAgICAgIHRocmVhZHNudW0rKzsKKyAgfQorICBmcmVlKGFjdGl2ZV90aHJlYWRzKTsKKworICBrbm93bl9zdW0gPSAxMjM0NSAqIHRocmVhZHNudW0gKyAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9mb3JfYXV0bygpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX3NjaGVkdWxlX2R5bmFtaWMuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9zY2hlZHVsZV9keW5hbWljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ0ZjU5YgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9zY2hlZHVsZV9keW5hbWljLmMKQEAgLTAsMCArMSw4OSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorLyoKKyAqIFRlc3QgZm9yIGR5bmFtaWMgc2NoZWR1bGluZyB3aXRoIGNodW5rIHNpemUKKyAqIE1ldGhvZDogY2FjdWxhdGUgaG93IG1hbnkgdGltZXMgdGhlIGl0ZXJhdGlvbiBzcGFjZSBpcyBkaXNwYXRjaGVkCisgKiAgICAgYW5kIGp1ZGdlIGlmIGVhY2ggZGlzcGF0Y2ggaGFzIHRoZSByZXF1ZXN0ZWQgY2h1bmsgc2l6ZQorICogICAgIHVubGVzcyBpdCBpcyB0aGUgbGFzdCBvbmUuCisgKiBJdCBpcyBwb3NzaWJsZSBmb3IgdHdvIGFkamFjZW50IGNodW5rcyBhcmUgYXNzaWduZWQgdG8gdGhlIHNhbWUgdGhyZWFkCisgKiBNb2RpZmllZCBieSBDaHVuaHVhIExpYW8KKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b21wLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisjZGVmaW5lIENGRE1BWF9TSVpFIDEwMAorY29uc3QgaW50IGNodW5rX3NpemUgPSA3OworCitpbnQgdGVzdF9vbXBfZm9yX3NjaGVkdWxlX2R5bmFtaWMoKQoreworICBpbnQgdGlkOworICBpbnQgKnRpZHM7CisgIGludCBpOworICBpbnQgdGlkc0FycmF5W0NGRE1BWF9TSVpFXTsKKyAgaW50IGNvdW50ID0gMDsKKyAgaW50IHRtcF9jb3VudCA9IDA7IC8qZGlzcGF0Y2ggdGltZXMqLworICBpbnQgKnRtcDsgIC8qc3RvcmUgY2h1bmsgc2l6ZSBmb3IgZWFjaCBkaXNwYXRjaCovCisgIGludCByZXN1bHQgPSAwOworCisgIHRpZHMgPSB0aWRzQXJyYXk7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZSh0aWQpIHNoYXJlZCh0aWRzKQorICB7ICAgICAgICAvKiBiZWdpbiBvZiBwYXJhbGxlbCAqLworICAgIGludCB0aWQ7CisgICAgdGlkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLGNodW5rX3NpemUpCisgICAgZm9yIChpID0gMDsgaSA8IENGRE1BWF9TSVpFOyBpKyspIHsKKyAgICAgIHRpZHNbaV0gPSB0aWQ7CisgICAgfQorICB9CisKKyAgZm9yIChpID0gMDsgaSA8IENGRE1BWF9TSVpFIC0gMTsgKytpKSB7CisgICAgaWYgKHRpZHNbaV0gIT0gdGlkc1tpICsgMV0pIHsKKyAgICAgIGNvdW50Kys7CisgICAgfQorICB9CisKKyAgdG1wID0gKGludCAqKSBtYWxsb2MgKHNpemVvZiAoaW50KSAqIChjb3VudCArIDEpKTsKKyAgdG1wWzBdID0gMTsKKworICBmb3IgKGkgPSAwOyBpIDwgQ0ZETUFYX1NJWkUgLSAxOyArK2kpIHsKKyAgICBpZiAodG1wX2NvdW50ID4gY291bnQpIHsKKyAgICAgIHByaW50ZiAoIi0tLS0tLS0tLS0tLS0tLS0tLS0tXG5UZXN0aW50ZXJuYWwgRXJyb3I6IExpc3QgdG9vIHNtYWxsISEhXG4tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7ICAvKiBFcnJvciBoYW5kbGluZyAqLworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICh0aWRzW2ldICE9IHRpZHNbaSArIDFdKSB7CisgICAgICB0bXBfY291bnQrKzsKKyAgICAgIHRtcFt0bXBfY291bnRdID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgdG1wW3RtcF9jb3VudF0rKzsKKyAgICB9CisgIH0KKyAgLyogaXMgZHluYW1pYyBzdGF0ZW1lbnQgd29ya2luZz8gKi8KKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICBpZiAoKHRtcFtpXSVjaHVua19zaXplKSE9MCkgeworICAgICAgLyogaXQgaXMgcG9zc2libGUgZm9yIDIgYWRqYWNlbnQgY2h1bmtzIGFzc2lnbmVkIHRvIGEgc2FtZSB0aHJlYWQgKi8KKyAgICAgIHJlc3VsdCsrOworICAgICAgZnByaW50ZihzdGRlcnIsIlRoZSBpbnRlcm1lZGlhdGUgZGlzcGF0Y2ggaGFzIHdyb25nIGNodW5rc2l6ZS5cbiIpOworICAgICAgLyogcmVzdWx0ICs9ICgodG1wW2ldIC8gY2h1bmtfc2l6ZSkgLSAxKTsgKi8KKyAgICB9CisgIH0KKyAgaWYgKCh0bXBbY291bnRdJWNodW5rX3NpemUpIT0oQ0ZETUFYX1NJWkUlY2h1bmtfc2l6ZSkpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwidGhlIGxhc3QgZGlzcGF0Y2ggaGFzIHdyb25nIGNodW5rc2l6ZS5cbiIpOworICB9CisgIC8qIGZvciAoaW50IGk9MDtpPGNvdW50KzE7KytpKSBwcmludGYoIiVkXHQ6PVx0JWRcbiIsaSsxLHRtcFtpXSk7ICovCisgIHJldHVybiAocmVzdWx0PT0wKTsKK30KK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9mb3Jfc2NoZWR1bGVfZHluYW1pYygpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX3NjaGVkdWxlX2d1aWRlZC5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX3NjaGVkdWxlX2d1aWRlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZTc0NDkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfc2NoZWR1bGVfZ3VpZGVkLmMKQEAgLTAsMCArMSwyMTcgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKworLyogVGVzdCBmb3IgZ3VpZGVkIHNjaGVkdWxpbmcKKyAqIEVuc3VyZSB0aHJlYWRzIGdldCBjaHVua3MgaW50ZXJsZWF2ZWx5IGZpcnN0CisgKiBUaGVuIGp1ZGdlIHRoZSBjaHVuayBzaXplcyBhcmUgZGVjcmVhc2luZyB0byBhIHN0YWJsZSB2YWx1ZQorICogTW9kaWZpZWQgYnkgQ2h1bmh1YSBMaWFvCisgKiBGb3IgZXhhbXBsZSwgMTAwIGl0ZXJhdGlvbiBvbiAyIHRocmVhZHMsIGNodW5rc2l6ZSA3CisgKiBvbmUgbGluZSBmb3IgZWFjaCBkaXNwYXRjaCwgMC8xIG1lYW5zIHRocmVhZCBpZAorICogMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgIDI0CisgKiAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAgICAgICAgMTgKKyAqIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAgICAgICAgICAgIDE0CisgKiAxIDEgMSAxIDEgMSAxIDEgMSAxICAgICAgICAgICAgICAgIDEwCisgKiAwIDAgMCAwIDAgMCAwIDAgICAgICAgICAgICAgICAgICAgOAorICogMSAxIDEgMSAxIDEgMSAgICAgICAgICAgICAgICAgICA3CisgKiAwIDAgMCAwIDAgMCAwICAgICAgICAgICAgICAgICAgIDcKKyAqIDEgMSAxIDEgMSAxIDEgICAgICAgICAgICAgICAgICAgNworICogMCAwIDAgMCAwICAgICAgICAgICAgICAgICAgICAgNQorKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworI2RlZmluZSBDRlNNQVhfU0laRSAxMDAwCisjZGVmaW5lIE1BWF9USU1FICAwLjAwNQorCisjaWZkZWYgU0xFRVBUSU1FCisjdW5kZWYgU0xFRVBUSU1FCisjZGVmaW5lIFNMRUVQVElNRSAwLjAwMDEKKyNlbmRpZgorCitpbnQgdGVzdF9vbXBfZm9yX3NjaGVkdWxlX2d1aWRlZCgpCit7CisgIGludCAqIHRpZHM7CisgIGludCAqIGNodW5rc2l6ZXM7CisgIGludCBub3RvdXQ7CisgIGludCBtYXhpdGVyOworICBpbnQgdGhyZWFkczsKKyAgaW50IGk7CisgIGludCByZXN1bHQ7CisKKyAgdGlkcyA9IChpbnQgKikgbWFsbG9jIChzaXplb2YgKGludCkgKiAoQ0ZTTUFYX1NJWkUgKyAxKSk7CisgIG1heGl0ZXIgPSAwOworICByZXN1bHQgPSAxOworICBub3RvdXQgPSAxOworCisgIC8qIFRlc3RpbmcgaWYgZW5vdWdoIHRocmVhZHMgYXJlIGF2YWlsYWJsZSBmb3IgdGhpcyBjaGVjay4gKi8KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIHRocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzKCk7CisgICAgfQorICB9CisKKyAgLyogZW5zdXJlIHRoZXJlIGFyZSBhdCBsZWFzdCB0d28gdGhyZWFkcyAqLworICBpZiAodGhyZWFkcyA8IDIpIHsKKyAgICBvbXBfc2V0X251bV90aHJlYWRzKDIpOworICAgIHRocmVhZHMgPSAyOworICB9CisKKyAgLyogTm93IHRoZSByZWFsIHBhcmFsbGVsIHdvcms6CisgICAqIEVhY2ggdGhyZWFkIHdpbGwgc3RhcnQgaW1tZWRpYXRlbHkgd2l0aCB0aGUgZmlyc3QgY2h1bmsuCisgICAqLworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcyxtYXhpdGVyKQorICB7ICAvKiBiZWdpbiBvZiBwYXJhbGxlbCAqLworICAgIGRvdWJsZSBjb3VudDsKKyAgICBpbnQgdGlkOworICAgIGludCBqOworCisgICAgdGlkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCisgICAgI3ByYWdtYSBvbXAgZm9yIG5vd2FpdCBzY2hlZHVsZShndWlkZWQpCisgICAgZm9yKGogPSAwOyBqIDwgQ0ZTTUFYX1NJWkU7ICsraikgeworICAgICAgY291bnQgPSAwLjsKKyAgICAgICNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIpCisgICAgICBpZiAoaiA+IG1heGl0ZXIpIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgeworICAgICAgICAgIG1heGl0ZXIgPSBqOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKnByaW50ZiAoInRocmVhZCAlZCBzbGVlcGluZ1xuIiwgdGlkKTsqLworICAgICAgI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCisgICAgICB3aGlsZSAobm90b3V0ICYmIChjb3VudCA8IE1BWF9USU1FKSAmJiAobWF4aXRlciA9PSBqKSkgeworICAgICAgICAjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyLG5vdG91dCkKKyAgICAgICAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisgICAgICAgIGNvdW50ICs9IFNMRUVQVElNRTsKKyNpZmRlZiBWRVJCT1NFCisgICAgICAgIHByaW50ZigiLiIpOworI2VuZGlmCisgICAgICB9CisjaWZkZWYgVkVSQk9TRQorICAgICAgaWYgKGNvdW50ID4gMC4pIHByaW50ZigiIHdhaXRlZCAlbGYgc1xuIiwgY291bnQpOworI2VuZGlmCisgICAgICAvKnByaW50ZiAoInRocmVhZCAlZCBhd2FrZVxuIiwgdGlkKTsqLworICAgICAgdGlkc1tqXSA9IHRpZDsKKyNpZmRlZiBWRVJCT1NFCisgICAgICBwcmludGYoIiVkIGZpbmlzaGVkIGJ5ICVkXG4iLGosdGlkKTsKKyNlbmRpZgorICAgIH0gLyogZW5kIG9mIGZvciAqLworICAgIG5vdG91dCA9IDA7CisgICAgI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCisgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICogZXZhbHVhdGlvbiBvZiB0aGUgdmFsdWVzICAgICAgICAgICAgICAqCisgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICB7CisgICAgaW50IGRldGVybWluZWRfY2h1bmtzaXplID0gMTsKKyAgICBpbnQgbGFzdF90aHJlYWRuciA9IHRpZHNbMF07CisgICAgaW50IGdsb2JhbF9jaHVua25yID0gMDsKKyAgICBpbnQgb3BlbndvcmsgPSBDRlNNQVhfU0laRTsKKyAgICBpbnQgZXhwZWN0ZWRfY2h1bmtfc2l6ZTsKKyAgICBpbnQqIGxvY2FsX2NodW5rbnIgPSAoaW50KiltYWxsb2ModGhyZWFkcyAqIHNpemVvZihpbnQpKTsKKyAgICBkb3VibGUgYyA9IDE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGhyZWFkczsgaSsrKQorICAgICAgbG9jYWxfY2h1bmtucltpXSA9IDA7CisKKyAgICB0aWRzW0NGU01BWF9TSVpFXSA9IC0xOworCisgICAgLyoKKyAgICAgKiBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBnbG9iYWwgY2h1bmtzCisgICAgICovCisgICAgLy8gZnByaW50ZihzdGRlcnIsIiMgZ2xvYmFsX2NodW5rbnIgdGhyZWFkIGxvY2FsX2NodW5rbnIgY2h1bmtzaXplXG4iKTsKKyAgICBmb3IoaSA9IDE7IGkgPD0gQ0ZTTUFYX1NJWkU7ICsraSkgeworICAgICAgaWYgKGxhc3RfdGhyZWFkbnI9PXRpZHNbaV0pIHsKKyAgICAgICAgZGV0ZXJtaW5lZF9jaHVua3NpemUrKzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGZwcmludGYoc3RkZXJyLCAiJWRcdCVkXHQlZFx0JWRcbiIsIGdsb2JhbF9jaHVua25yLAorICAgICAgICAgICBsYXN0X3RocmVhZG5yLCBsb2NhbF9jaHVua25yW2xhc3RfdGhyZWFkbnJdLCBtKTsgKi8KKyAgICAgICAgZ2xvYmFsX2NodW5rbnIrKzsKKyAgICAgICAgbG9jYWxfY2h1bmtucltsYXN0X3RocmVhZG5yXSsrOworICAgICAgICBsYXN0X3RocmVhZG5yID0gdGlkc1tpXTsKKyAgICAgICAgZGV0ZXJtaW5lZF9jaHVua3NpemUgPSAxOworICAgICAgfQorICAgIH0KKyAgICAvKiBub3cgYWxsb2NhdGUgdGhlIG1lbW9yeSBmb3Igc2F2aW5nIHRoZSBzaXplcyBvZiB0aGUgZ2xvYmFsIGNodW5rcyAqLworICAgIGNodW5rc2l6ZXMgPSAoaW50KiltYWxsb2MoZ2xvYmFsX2NodW5rbnIgKiBzaXplb2YoaW50KSk7CisKKyAgICAvKgorICAgICogRXZhbHVhdGUgdGhlIHNpemVzIG9mIHRoZSBnbG9iYWwgY2h1bmtzCisgICAgKi8KKyAgICBnbG9iYWxfY2h1bmtuciA9IDA7CisgICAgZGV0ZXJtaW5lZF9jaHVua3NpemUgPSAxOworICAgIGxhc3RfdGhyZWFkbnIgPSB0aWRzWzBdOworICAgIGZvciAoaSA9IDE7IGkgPD0gQ0ZTTUFYX1NJWkU7ICsraSkgeworICAgICAgLyogSWYgdGhlIHRocmVhZG51bWJlciB3YXMgdGhlIHNhbWUgYXMgYmVmb3JlIGluY3JlYXNlIHRoZQorICAgICAgICogZGV0ZWN0ZWQgY2h1bmtzaXplIGZvciB0aGlzIGNodW5rIG90aGVyd2lzZSBzZXQgdGhlIGRldGVjdGVkCisgICAgICAgKiBjaHVua3NpemUgYWdhaW4gdG8gb25lIGFuZCBzYXZlIHRoZSBudW1iZXIgb2YgdGhlIG5leHQKKyAgICAgICAqIHRocmVhZCBpbiBsYXN0X3RocmVhZG5yLgorICAgICAgICovCisgICAgICBpZiAobGFzdF90aHJlYWRuciA9PSB0aWRzW2ldKSB7CisgICAgICAgIGRldGVybWluZWRfY2h1bmtzaXplKys7CisgICAgICB9IGVsc2UgeworICAgICAgICBjaHVua3NpemVzW2dsb2JhbF9jaHVua25yXSA9IGRldGVybWluZWRfY2h1bmtzaXplOworICAgICAgICBnbG9iYWxfY2h1bmtucisrOworICAgICAgICBsb2NhbF9jaHVua25yW2xhc3RfdGhyZWFkbnJdKys7CisgICAgICAgIGxhc3RfdGhyZWFkbnIgPSB0aWRzW2ldOworICAgICAgICBkZXRlcm1pbmVkX2NodW5rc2l6ZSA9IDE7CisgICAgICB9CisgICAgfQorCisjaWZkZWYgVkVSQk9TRQorICAgIGZwcmludGYoc3RkZXJyLCAiZm91bmRcdGV4cGVjdGVkXHRjb25zdGFudFxuIik7CisjZW5kaWYKKworICAgIC8qIGlkZW50aWZ5IHRoZSBjb25zdGFudCBjIGZvciB0aGUgZXhwb25lbnRpYWwKKyAgICAgICBkZWNyZWFzZSBvZiB0aGUgY2h1bmtzaXplICovCisgICAgZXhwZWN0ZWRfY2h1bmtfc2l6ZSA9IG9wZW53b3JrIC8gdGhyZWFkczsKKyAgICBjID0gKGRvdWJsZSkgY2h1bmtzaXplc1swXSAvIGV4cGVjdGVkX2NodW5rX3NpemU7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZ2xvYmFsX2NodW5rbnI7IGkrKykgeworICAgICAgLyogY2FsY3VsYXRlIHRoZSBuZXcgZXhwZWN0ZWQgY2h1bmtzaXplICovCisgICAgICBpZiAoZXhwZWN0ZWRfY2h1bmtfc2l6ZSA+IDEpCisgICAgICAgIGV4cGVjdGVkX2NodW5rX3NpemUgPSBjICogb3BlbndvcmsgLyB0aHJlYWRzOworI2lmZGVmIFZFUkJPU0UKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJThkXHQlOGRcdCVsZlxuIiwgY2h1bmtzaXplc1tpXSwKKyAgICAgICAgZXhwZWN0ZWRfY2h1bmtfc2l6ZSwgYyAqIGNodW5rc2l6ZXNbaV0vZXhwZWN0ZWRfY2h1bmtfc2l6ZSk7CisjZW5kaWYKKyAgICAgIC8qIGNoZWNrIGlmIGNodW5rc2l6ZSBpcyBpbnNpZGUgdGhlIHJvdW5kaW5nIGVycm9ycyAqLworICAgICAgaWYgKGFicyAoY2h1bmtzaXplc1tpXSAtIGV4cGVjdGVkX2NodW5rX3NpemUpID49IDIpIHsKKyAgICAgICAgcmVzdWx0ID0gMDsKKyNpZm5kZWYgVkVSQk9TRQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNodW5rc2l6ZSBkaWZmZXJlZCBmcm9tIGV4cGVjdGVkICIKKyAgICAgICAgICAidmFsdWU6ICVkIGluc3RlYWQgb2YgJWRcbiIsIGNodW5rc2l6ZXNbaV0sCisgICAgICAgICAgZXhwZWN0ZWRfY2h1bmtfc2l6ZSk7CisgICAgICAgIHJldHVybiAwOworI2VuZGlmCisgICAgICB9IC8qIGVuZCBpZiAqLworCisjaWZuZGVmIFZFUkJPU0UKKyAgICAgIGlmIChleHBlY3RlZF9jaHVua19zaXplIC0gY2h1bmtzaXplc1tpXSA8IDApCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2h1bmtzaXplIGRpZCBub3QgZGVjcmVhc2U6ICVkIgorICAgICAgICAgICIgaW5zdGVhZCBvZiAlZFxuIiwgY2h1bmtzaXplc1tpXSxleHBlY3RlZF9jaHVua19zaXplKTsKKyNlbmRpZgorCisgICAgICAvKiBjYWxjdWxhdGluZyB0aGUgcmVtYWluaW5nIGFtb3VudCBvZiB3b3JrICovCisgICAgICBvcGVud29yayAtPSBjaHVua3NpemVzW2ldOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfZm9yX3NjaGVkdWxlX2d1aWRlZCgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX3NjaGVkdWxlX3J1bnRpbWUuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9zY2hlZHVsZV9ydW50aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk1N2ZjMwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9zY2hlZHVsZV9ydW50aW1lLmMKQEAgLTAsMCArMSw4MiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUKKy8vIFJVTjogZW52IE9NUF9TQ0hFRFVMRT1zdGF0aWMgJWxpYm9tcC1ydW4gMSAwCisvLyBSVU46IGVudiBPTVBfU0NIRURVTEU9c3RhdGljLDEwICVsaWJvbXAtcnVuIDEgMTAKKy8vIFJVTjogZW52IE9NUF9TQ0hFRFVMRT1keW5hbWljICVsaWJvbXAtcnVuIDIgMQorLy8gUlVOOiBlbnYgT01QX1NDSEVEVUxFPWR5bmFtaWMsMTEgJWxpYm9tcC1ydW4gMiAxMQorLy8gUlVOOiBlbnYgT01QX1NDSEVEVUxFPWd1aWRlZCAlbGlib21wLXJ1biAzIDEKKy8vIFJVTjogZW52IE9NUF9TQ0hFRFVMRT1ndWlkZWQsMTIgJWxpYm9tcC1ydW4gMyAxMgorLy8gUlVOOiBlbnYgT01QX1NDSEVEVUxFPWF1dG8gJWxpYm9tcC1ydW4gNCAxCisvLyBSVU46IGVudiBPTVBfU0NIRURVTEU9dHJhcGV6b2lkYWwgJWxpYm9tcC1ydW4gMTAxIDEKKy8vIFJVTjogZW52IE9NUF9TQ0hFRFVMRT10cmFwZXpvaWRhbCwxMyAlbGlib21wLXJ1biAxMDEgMTMKKy8vIFJVTjogZW52IE9NUF9TQ0hFRFVMRT1zdGF0aWNfc3RlYWwgJWxpYm9tcC1ydW4gMTAyIDEKKy8vIFJVTjogZW52IE9NUF9TQ0hFRFVMRT1zdGF0aWNfc3RlYWwsMTQgJWxpYm9tcC1ydW4gMTAyIDE0CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgc3VtOworY2hhciogY29ycmVjdF9raW5kX3N0cmluZzsKK29tcF9zY2hlZF90IGNvcnJlY3Rfa2luZDsKK2ludCBjb3JyZWN0X2NodW5rX3NpemU7CisKK2ludCB0ZXN0X29tcF9mb3JfcnVudGltZSgpCit7CisgIGludCBzdW07CisgIGludCBrbm93bl9zdW07CisgIGludCBjaHVua19zaXplOworICBpbnQgZXJyb3I7CisgIG9tcF9zY2hlZF90IGtpbmQ7CisKKyAgc3VtID0gMDsKKyAgZXJyb3IgPSAwOworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgIG9tcF9nZXRfc2NoZWR1bGUoJmtpbmQsICZjaHVua19zaXplKTsKKworICBwcmludGYoIm9tcF9nZXRfc2NoZWR1bGUoKSByZXR1cm5zOiBTY2hlZHVsZSA9ICVkLCBDaHVuayBTaXplID0gJWRcbiIsCisgICAgICAgICBraW5kLCBjaHVua19zaXplKTsKKyAgaWYgKGtpbmQgIT0gY29ycmVjdF9raW5kKSB7CisgICAgcHJpbnRmKCJraW5kKCVkKSAhPSBjb3JyZWN0X2tpbmQoJWQpXG4iLCBraW5kLCBjb3JyZWN0X2tpbmQpOworICAgIGVycm9yID0gMTsKKyAgfQorICBpZiAoY2h1bmtfc2l6ZSAhPSBjb3JyZWN0X2NodW5rX3NpemUpIHsKKyAgICBwcmludGYoImNodW5rX3NpemUoJWQpICE9IGNvcnJlY3RfY2h1bmtfc2l6ZSglZClcbiIsIGNodW5rX3NpemUsCisgICAgICAgICAgIGNvcnJlY3RfY2h1bmtfc2l6ZSk7CisgICAgZXJyb3IgPSAxOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShydW50aW1lKQorICAgIGZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtKz1pOworICAgIH0KKyAgfQorICBpZiAoa25vd25fc3VtICE9IHN1bSkgeworICAgIHByaW50ZigiS25vd24gU3VtID0gJWQsIENhbGN1bGF0ZWQgU3VtID0gJWRcbiIsIGtub3duX3N1bSwgc3VtKTsKKyAgICBlcnJvciA9IDE7CisgIH0KKyAgcmV0dXJuICFlcnJvcjsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKyAgaWYgKGFyZ2MgIT0gMykgeworICAgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6ICVzIHNjaGVkdWxlX2tpbmQgY2h1bmtfc2l6ZVxuIiwgYXJndlswXSk7CisgICAgZnByaW50ZihzdGRlcnIsICIgIFJ1biB3aXRoIGVudmlyYWJsZSBPTVBfU0NIRURVTEU9a2luZFssY2h1bmtfc2l6ZV1cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGNvcnJlY3Rfa2luZCA9IGF0b2koYXJndlsxXSk7CisgIGNvcnJlY3RfY2h1bmtfc2l6ZSA9IGF0b2koYXJndlsyXSk7CisKKyAgZm9yIChpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZiAoIXRlc3Rfb21wX2Zvcl9ydW50aW1lKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ2YTU0NAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWMuYwpAQCAtMCwwICsxLDE1NCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCisjZGVmaW5lIENGU01BWF9TSVpFIDEwMDAKKyNkZWZpbmUgTUFYX1RJTUUgMC4wMQorCisjaWZkZWYgU0xFRVBUSU1FCisjdW5kZWYgU0xFRVBUSU1FCisjZGVmaW5lIFNMRUVQVElNRSAwLjAwMDUKKyNlbmRpZgorCitpbnQgdGVzdF9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpYygpCit7CisgIGludCB0aHJlYWRzOworICBpbnQgaSxsYXN0dGlkOworICBpbnQgKiB0aWRzOworICBpbnQgbm90b3V0OworICBpbnQgbWF4aXRlcjsKKyAgaW50IGNodW5rX3NpemU7CisgIGludCBjb3VudGVyID0gMDsKKyAgaW50IHRtcF9jb3VudD0xOworICBpbnQgbGFzdHRocmVhZHNzdGFydHRpZCA9IC0xOworICBpbnQgcmVzdWx0ID0gMTsKKworICBjaHVua19zaXplID0gNzsKKyAgdGlkcyA9IChpbnQgKikgbWFsbG9jIChzaXplb2YgKGludCkgKiAoQ0ZTTUFYX1NJWkUgKyAxKSk7CisgIG5vdG91dCA9IDE7CisgIG1heGl0ZXIgPSAwOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZCh0aWRzLGNvdW50ZXIpCisgIHsgIC8qIGJlZ2luIG9mIHBhcmFsbGVsKi8KKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICB0aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcyAoKTsKKyAgICB9ICAvKiBlbmQgb2Ygc2luZ2xlICovCisgIH0gIC8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgIGlmICh0aHJlYWRzIDwgMikgeworICAgIG9tcF9zZXRfbnVtX3RocmVhZHMoMik7CisgICAgdGhyZWFkcyA9IDI7CisgIH0KKyAgZnByaW50ZiAoc3RkZXJyLCJVc2luZyBhbiBpbnRlcm5hbCBjb3VudCBvZiAlZFxuVXNpbmcgYSBzcGVjaWZpZWQiCisgICAgIiBjaHVua3NpemUgb2YgJWRcbiIsIENGU01BWF9TSVpFLCBjaHVua19zaXplKTsKKyAgdGlkc1tDRlNNQVhfU0laRV0gPSAtMTsgIC8qIHNldHRpbmcgZW5kZmxhZyAqLworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcykKKyAgeyAvKiBiZWdpbiBvZiBwYXJhbGxlbCAqLworICAgIGRvdWJsZSBjb3VudDsKKyAgICBpbnQgdGlkOworICAgIGludCBqOworCisgICAgdGlkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCisgICAgI3ByYWdtYSBvbXAgZm9yIG5vd2FpdCBzY2hlZHVsZShzdGF0aWMsY2h1bmtfc2l6ZSkKKyAgICBmb3IoaiA9IDA7IGogPCBDRlNNQVhfU0laRTsgKytqKSB7CisgICAgICBjb3VudCA9IDAuOworICAgICAgI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcikKKyAgICAgIGlmIChqID4gbWF4aXRlcikgeworICAgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgICB7CisgICAgICAgICAgbWF4aXRlciA9IGo7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qcHJpbnRmICgidGhyZWFkICVkIHNsZWVwaW5nXG4iLCB0aWQpOyovCisgICAgICB3aGlsZSAobm90b3V0ICYmIChjb3VudCA8IE1BWF9USU1FKSAmJiAobWF4aXRlciA9PSBqKSkgeworICAgICAgICAjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyLG5vdG91dCkKKyAgICAgICAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisgICAgICAgIGNvdW50ICs9IFNMRUVQVElNRTsKKyAgICAgICAgcHJpbnRmKCIuIik7CisgICAgICB9CisjaWZkZWYgVkVSQk9TRQorICAgICAgaWYgKGNvdW50ID4gMC4pIHByaW50ZigiIHdhaXRlZCAlbGYgc1xuIiwgY291bnQpOworI2VuZGlmCisgICAgICAvKnByaW50ZiAoInRocmVhZCAlZCBhd2FrZVxuIiwgdGlkKTsqLworICAgICAgdGlkc1tqXSA9IHRpZDsKKyNpZmRlZiBWRVJCT1NFCisgICAgICBwcmludGYoIiVkIGZpbmlzaGVkIGJ5ICVkXG4iLGosdGlkKTsKKyNlbmRpZgorICAgIH0gLyogZW5kIG9mIGZvciAqLworICAgIG5vdG91dCA9IDA7CisgICAgI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCisgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisKKyAgLyoqKiogYW5hbHlzaW5nIHRoZSBkYXRhIGluIGFycmF5IHRpZHMgKioqKi8KKworICBsYXN0dGlkID0gdGlkc1swXTsKKyAgdG1wX2NvdW50ID0gMDsKKworICBmb3IgKGkgPSAwOyBpIDwgQ0ZTTUFYX1NJWkUgKyAxOyArK2kpIHsKKyAgICAvKiBJZiB0aGUgd29yayAgd2FzIGRvbmUgYnkgdGhlIHNhbWUgdGhyZWFkIGluY3JlYXNlIHRtcF9jb3VudCBieSBvbmUuICovCisgICAgaWYgKHRpZHNbaV0gPT0gbGFzdHRpZCkgeworICAgICAgdG1wX2NvdW50Kys7CisjaWZkZWYgVkVSQk9TRQorICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJWQ6ICVkIFxuIiwgaSwgdGlkc1tpXSk7CisjZW5kaWYKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIENoZWNrIGlmIHRoZSBuZXh0IHRocmVhZCBoYWQgaGFzIHRoZSByaWdodCB0aHJlYWQgbnVtYmVyLiBXaGVuIGZpbmRpbmcKKyAgICAgKiB0aHJlYWRudW1iZXIgLTEgdGhlIGVuZCBzaG91bGQgYmUgcmVhY2hlZC4KKyAgICAgKi8KKyAgICBpZiAodGlkc1tpXSA9PSAobGFzdHRpZCArIDEpICUgdGhyZWFkcyB8fCB0aWRzW2ldID09IC0xKSB7CisgICAgICAvKiBjaGVja2luZyBmb3IgdGhlIHJpZ2h0IGNodW5rIHNpemUgKi8KKyAgICAgIGlmICh0bXBfY291bnQgPT0gY2h1bmtfc2l6ZSkgeworICAgICAgICB0bXBfY291bnQgPSAxOworICAgICAgICBsYXN0dGlkID0gdGlkc1tpXTsKKyNpZmRlZiBWRVJCT1NFCisgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIk9LXG4iKTsKKyNlbmRpZgorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogSWYgdGhlIGNodW5rIHNpemUgd2FzIHdyb25nLCBjaGVjayBpZiB0aGUgZW5kIHdhcyByZWFjaGVkICovCisgICAgICAgIGlmICh0aWRzW2ldID09IC0xKSB7CisgICAgICAgICAgaWYgKGkgPT0gQ0ZTTUFYX1NJWkUpIHsKKyAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkxhc3QgdGhyZWFkIGhhZCBjaHVuayBzaXplICVkXG4iLAorICAgICAgICAgICAgICB0bXBfY291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVSUk9SOiBMYXN0IHRocmVhZCAodGhyZWFkIHdpdGgiCisgICAgICAgICAgICAgICIgbnVtYmVyIC0xKSB3YXMgZm91bmQgYmVmb3JlIHRoZSBlbmQuXG4iKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVSUk9SOiBjaHVuayBzaXplIHdhcyAlZC4gKGFzc2lnbmVkIgorICAgICAgICAgICAgIiB3YXMgJWQpXG4iLCB0bXBfY291bnQsIGNodW5rX3NpemUpOworICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogRm91bmQgdGhyZWFkIHdpdGggbnVtYmVyICVkIChzaG91bGQgYmUiCisgICAgICAgICIgaW5iZXR3ZWVuIDAgYW5kICVkKS4iLCB0aWRzW2ldLCB0aHJlYWRzIC0gMSk7CisgICAgICByZXN1bHQgPSAwOworICAgIH0KKyNpZmRlZiBWRVJCT1NFCisgICAgZnByaW50ZiAoc3RkZXJyLCAiJWQ6ICVkIFxuIiwgaSwgdGlkc1tpXSk7CisjZW5kaWYKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljXzMuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWNfMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMmYyN2EKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljXzMuYwpAQCAtMCwwICsxLDIwMiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCisjZGVmaW5lIENGU01BWF9TSVpFIDEwMDAKKyNkZWZpbmUgTUFYX1RJTUUgMC4wMQorCisjaWZkZWYgU0xFRVBUSU1FCisjdW5kZWYgU0xFRVBUSU1FCisjZGVmaW5lIFNMRUVQVElNRSAwLjAwMDUKKyNlbmRpZgorCisjZGVmaW5lIFZFUkJPU0UgMAorCitpbnQgdGVzdF9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpY18zKCkKK3sKKyAgaW50IHRocmVhZHM7CisgIGludCBpLGxhc3R0aWQ7CisKKyAgaW50ICogdGlkczsKKyAgaW50ICogdGlkczI7CisgIGludCBub3RvdXQ7CisgIGludCBtYXhpdGVyOworICBpbnQgY2h1bmtfc2l6ZTsKKworICBpbnQgY291bnRlciA9IDA7CisgIGludCB0bXBfY291bnQ9MTsKKyAgaW50IGxhc3R0aHJlYWRzc3RhcnR0aWQgPSAtMTsKKyAgaW50IHJlc3VsdCA9IDE7CisgIGNodW5rX3NpemUgPSA3OworCisgIHRpZHMgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogKENGU01BWF9TSVpFICsgMSkpOworICBub3RvdXQgPSAxOworICBtYXhpdGVyID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcyxjb3VudGVyKQorICB7ICAvKiBiZWdpbiBvZiBwYXJhbGxlbCovCisgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMgKCk7CisgICAgfSAgLyogZW5kIG9mIHNpbmdsZSAqLworICB9ICAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICAvKiBFbnN1cmUgdGhhdCBhdCBsZWFzdCB0d28gdGhyZWFkcyBhcmUgY3JlYXRlZCAqLworICBpZiAodGhyZWFkcyA8IDIpIHsKKyAgICBvbXBfc2V0X251bV90aHJlYWRzKDIpOworICAgIHRocmVhZHMgPSAyOworICB9CisgIGZwcmludGYgKHN0ZGVyciwiVXNpbmcgYW4gaW50ZXJuYWwgY291bnQgb2YgJWRcblVzaW5nIGEiCisgICAgIiBzcGVjaWZpZWQgY2h1bmtzaXplIG9mICVkXG4iLCBDRlNNQVhfU0laRSwgY2h1bmtfc2l6ZSk7CisgIHRpZHNbQ0ZTTUFYX1NJWkVdID0gLTE7ICAvKiBzZXR0aW5nIGVuZGZsYWcgKi8KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcykKKyAgeyAgLyogYmVnaW4gb2YgcGFyYWxsZWwgKi8KKyAgICBkb3VibGUgY291bnQ7CisgICAgaW50IHRpZDsKKyAgICBpbnQgajsKKworICAgIHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKworICAgICNwcmFnbWEgb21wIGZvciBub3dhaXQgc2NoZWR1bGUoc3RhdGljLGNodW5rX3NpemUpCisgICAgZm9yKGogPSAwOyBqIDwgQ0ZTTUFYX1NJWkU7ICsraikgeworICAgICAgY291bnQgPSAwLjsKKyAgICAgICNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIpCisgICAgICBpZiAoaiA+IG1heGl0ZXIpIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgeworICAgICAgICAgIG1heGl0ZXIgPSBqOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKnByaW50ZiAoInRocmVhZCAlZCBzbGVlcGluZ1xuIiwgdGlkKTsqLworICAgICAgd2hpbGUgKG5vdG91dCAmJiAoY291bnQgPCBNQVhfVElNRSkgJiYgKG1heGl0ZXIgPT0gaikpIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCisgICAgICAgIG15X3NsZWVwIChTTEVFUFRJTUUpOworICAgICAgICBjb3VudCArPSBTTEVFUFRJTUU7CisgICAgICAgIHByaW50ZigiLiIpOworICAgICAgfQorI2lmZGVmIFZFUkJPU0UKKyAgICAgIGlmIChjb3VudCA+IDAuKSBwcmludGYoIiB3YWl0ZWQgJWxmIHNcbiIsIGNvdW50KTsKKyNlbmRpZgorICAgICAgLypwcmludGYgKCJ0aHJlYWQgJWQgYXdha2VcbiIsIHRpZCk7Ki8KKyAgICAgIHRpZHNbal0gPSB0aWQ7CisjaWZkZWYgVkVSQk9TRQorICAgICAgcHJpbnRmKCIlZCBmaW5pc2hlZCBieSAlZFxuIixqLHRpZCk7CisjZW5kaWYKKyAgICB9IC8qIGVuZCBvZiBvbXAgcGFyYWxsZWwgZm9yICovCisKKyAgICBub3RvdXQgPSAwOworICAgICNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIsbm90b3V0KQorICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgIC8qKioqIGFuYWx5c2luZyB0aGUgZGF0YSBpbiBhcnJheSB0aWRzICoqKiovCisKKyAgbGFzdHRpZCA9IHRpZHNbMF07CisgIHRtcF9jb3VudCA9IDA7CisKKyAgZm9yIChpID0gMDsgaSA8IENGU01BWF9TSVpFICsgMTsgKytpKSB7CisgICAgLyogSWYgdGhlIHdvcmsgIHdhcyBkb25lIGJ5IHRoZSBzYW1lIHRocmVhZAorICAgICAgIGluY3JlYXNlIHRtcF9jb3VudCBieSBvbmUuICovCisgICAgaWYgKHRpZHNbaV0gPT0gbGFzdHRpZCkgeworICAgICAgdG1wX2NvdW50Kys7CisjaWZkZWYgVkVSQk9TRQorICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJWQ6ICVkIFxuIiwgaSwgdGlkc1tpXSk7CisjZW5kaWYKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIENoZWNrIGlmIHRoZSBuZXh0IHRocmVhZCBoYWQgaGFzIHRoZSByaWdodCB0aHJlYWQgbnVtYmVyLgorICAgICAqIFdoZW4gZmluZGluZyB0aHJlYWRudW1iZXIgLTEgdGhlIGVuZCBzaG91bGQgYmUgcmVhY2hlZC4KKyAgICAgKi8KKyAgICBpZiAodGlkc1tpXSA9PSAobGFzdHRpZCArIDEpICUgdGhyZWFkcyB8fCB0aWRzW2ldID09IC0xKSB7CisgICAgICAvKiBjaGVja2luZyBmb3IgdGhlIHJpZ2h0IGNodW5rIHNpemUgKi8KKyAgICAgIGlmICh0bXBfY291bnQgPT0gY2h1bmtfc2l6ZSkgeworICAgICAgICB0bXBfY291bnQgPSAxOworICAgICAgICBsYXN0dGlkID0gdGlkc1tpXTsKKyNpZmRlZiBWRVJCT1NFCisgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIk9LXG4iKTsKKyNlbmRpZgorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLyogSWYgdGhlIGNodW5rIHNpemUgd2FzIHdyb25nLCBjaGVjayBpZiB0aGUgZW5kIHdhcyByZWFjaGVkICovCisgICAgICAgIGlmICh0aWRzW2ldID09IC0xKSB7CisgICAgICAgICAgaWYgKGkgPT0gQ0ZTTUFYX1NJWkUpIHsKKyAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkxhc3QgdGhyZWFkIGhhZCBjaHVuayBzaXplICVkXG4iLAorICAgICAgICAgICAgICB0bXBfY291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVSUk9SOiBMYXN0IHRocmVhZCAodGhyZWFkIHdpdGgiCisgICAgICAgICAgICAgICIgbnVtYmVyIC0xKSB3YXMgZm91bmQgYmVmb3JlIHRoZSBlbmQuXG4iKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkVSUk9SOiBjaHVuayBzaXplIHdhcyAlZC4gKGFzc2lnbmVkIgorICAgICAgICAgICAgIiB3YXMgJWQpXG4iLCB0bXBfY291bnQsIGNodW5rX3NpemUpOworICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogRm91bmQgdGhyZWFkIHdpdGggbnVtYmVyICVkIChzaG91bGQgYmUiCisgICAgICAgICIgaW5iZXR3ZWVuIDAgYW5kICVkKS4iLCB0aWRzW2ldLCB0aHJlYWRzIC0gMSk7CisgICAgICByZXN1bHQgPSAwOworICAgIH0KKyNpZmRlZiBWRVJCT1NFCisgICAgZnByaW50ZiAoc3RkZXJyLCAiJWQ6ICVkIFxuIiwgaSwgdGlkc1tpXSk7CisjZW5kaWYKKyAgfQorCisgIC8qIE5vdyB3ZSBjaGVjayBpZiBzZXZlcmFsIGxvb3AgcmVnaW9ucyBpbiBvbmUgcGFyYWxsZWwgcmVnaW9uIGhhdmUgdGhlCisgICAqIHNhbWUgbG9naWNhbCBhc3NpZ25lbWVudCBvZiBjaHVua3MgdG8gdGhyZWFkcy4gV2UgdXNlIHRoZSBub3dhaXQKKyAgICogY2xhdXNlIHRvIGluY3JlYXNlIHRoZSBwcm9iYWJpbGl0eSB0byBnZXQgYW4gZXJyb3IuICovCisKKyAgLyogRmlyc3Qgd2UgYWxsb2NhdGUgc29tZSBtb3JlIG1lbW1vcnkgKi8KKyAgZnJlZSAodGlkcyk7CisgIHRpZHMgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogTE9PUENPVU5UKTsKKyAgdGlkczIgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogTE9PUENPVU5UKTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgeworICAgICAgaW50IG47CisgICAgICAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoc3RhdGljKSBub3dhaXQKKyAgICAgIGZvciAobiA9IDA7IG4gPCBMT09QQ09VTlQ7IG4rKykgeworICAgICAgICBpZiAoTE9PUENPVU5UID09IG4gKyAxICkKKyAgICAgICAgICBteV9zbGVlcChTTEVFUFRJTUUpOworCisgICAgICAgIHRpZHNbbl0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgaW50IG07CisgICAgICAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoc3RhdGljKSBub3dhaXQKKyAgICAgIGZvciAobSA9IDE7IG0gPD0gTE9PUENPVU5UOyBtKyspIHsKKyAgICAgICAgdGlkczJbbS0xXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKyAgaWYgKHRpZHNbaV0gIT0gdGlkczJbaV0pIHsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJDaHVuayBuby4gJWQgd2FzIGFzc2lnbmVkIG9uY2UgdG8gdGhyZWFkICVkIGFuZCIKKyAgICAgICIgbGF0ZXIgdG8gdGhyZWFkICVkLlxuIiwgaSwgdGlkc1tpXSx0aWRzMltpXSk7CisgICAgcmVzdWx0ID0gMDsKKyAgfQorCisgIGZyZWUgKHRpZHMpOworICBmcmVlICh0aWRzMik7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yIChpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpY18zKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9wYXJhbGxlbF9mb3JfZmlyc3Rwcml2YXRlLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9wYXJhbGxlbF9mb3JfZmlyc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IzYmY3ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDM1IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9mb3JfZmlyc3Rwcml2YXRlKCkKK3sKKyAgaW50IHN1bSA7CisgIGludCBpMjsKKyAgaW50IGk7CisgIGludCBrbm93bl9zdW07CisKKyAgc3VtPTA7CisgIGkyPTM7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbigrOnN1bSkgcHJpdmF0ZShpKSBmaXJzdHByaXZhdGUoaTIpCisgIGZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspIHsKKyAgICBzdW0gPSBzdW0gKyAoaSArIGkyKTsKKyAgfQorCisgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMiArIGkyICogTE9PUENPVU5UOworICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfSAvKiBlbmQgb2YgY2hlY2tfcGFyYWxsZWxfZm9yX2Zpc3Rwcml2YXRlICovCisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9mb3JfZmlyc3Rwcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9wYXJhbGxlbF9mb3JfaWYuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9pZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZmU0OTgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9wYXJhbGxlbF9mb3JfaWYuYwpAQCAtMCwwICsxLDQyIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZm9yX2lmKCkKK3sKKyAgaW50IGtub3duX3N1bTsKKyAgaW50IG51bV90aHJlYWRzOworICBpbnQgc3VtLCBzdW0yOworICBpbnQgaTsKKyAgaW50IGNvbnRyb2w7CisKKyAgY29udHJvbCA9IDA7CisgIG51bV90aHJlYWRzPTA7CisgIHN1bSA9IDA7CisgIHN1bTIgPSAwOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBwcml2YXRlKGkpIGlmIChjb250cm9sPT0xKQorICBmb3IgKGk9MDsgaSA8PSBMT09QQ09VTlQ7IGkrKykgeworICAgIG51bV90aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcygpOworICAgIHN1bSA9IHN1bSArIGk7CisgIH0KKworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgIGZwcmludGYoc3RkZXJyLCAiTnVtYmVyIG9mIHRocmVhZHMgZGV0ZXJtaW5lZCBieSIKKyAgICAiIG9tcF9nZXRfbnVtX3RocmVhZHM6ICVkXG4iLCBudW1fdGhyZWFkcyk7CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSAmJiBudW1fdGhyZWFkcyA9PSAxKTsKK30gLyogZW5kIG9mIGNoZWNrX3BhcmFsbGVsX2Zvcl9wcml2YXRlICovCisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9mb3JfaWYoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9sYXN0cHJpdmF0ZS5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUzY2ZiMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9sYXN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsMzcgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9sYXN0cHJpdmF0ZSgpCit7CisgIGludCBzdW07CisgIGludCBpOworICBpbnQgaTA7CisgIGludCBrbm93bl9zdW07CisKKyAgc3VtID0wOworICBpMCA9IC0xOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24oKzpzdW0pIFwKKyAgICBzY2hlZHVsZShzdGF0aWMsNykgcHJpdmF0ZShpKSBsYXN0cHJpdmF0ZShpMCkKKyAgZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykgeworICAgIHN1bSA9IHN1bSArIGk7CisgICAgaTAgPSBpOworICB9IC8qIGVuZCBvZiBwYXJhbGxlbCBmb3IgKi8KKworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgIHJldHVybiAoKGtub3duX3N1bSA9PSBzdW0pICYmIChpMCA9PSBMT09QQ09VTlQpKTsKK30gLyogZW5kIG9mIGNoZWNrX3BhcmFsbGVsX2Zvcl9sYXN0cHJpdmF0ZSAqLworCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9wYXJhbGxlbF9mb3Jfb3JkZXJlZC5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmVmNDYwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQuYwpAQCAtMCwwICsxLDY0IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK3N0YXRpYyBpbnQgbGFzdF9pID0gMDsKKworaW50IGk7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKGkpCisKKy8qIFZhcmlhYmxlIGlpIGlzIHVzZWQgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBhIHRocmVhZHByaXZhdGUgdmFyaWFibGUgdXNlZCBhcyBhIGxvb3AKKyAqIGluZGV4LiBTZWUgdGVzdCBvbXBfdGhyZWFkcHJpdmF0ZV9mb3IuCisgKi8KK3N0YXRpYyBpbnQgaWk7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKGlpKQorCisvKiEKKyAgVXRpbGl0eSBmdW5jdGlvbjogcmV0dXJucyB0cnVlIGlmIHRoZSBwYXNzZWQgYXJndW1lbnQgaXMgbGFyZ2VyIHRoYW4KKyAgdGhlIGFyZ3VtZW50IG9mIHRoZSBsYXN0IGNhbGwgb2YgdGhpcyBmdW5jdGlvbi4KKyAqLworc3RhdGljIGludCBjaGVja19pX2lzbGFyZ2VyMihpbnQgaSkKK3sKKyAgaW50IGlzbGFyZ2VyOworICBpc2xhcmdlciA9IChpID4gbGFzdF9pKTsKKyAgbGFzdF9pID0gaTsKKyAgcmV0dXJuIChpc2xhcmdlcik7Cit9CisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9mb3Jfb3JkZXJlZCgpCit7CisgIGludCBzdW07CisgIGludCBpc19sYXJnZXI7CisgIGludCBrbm93bl9zdW07CisgIGludCBpOworCisgIHN1bSA9IDA7CisgIGlzX2xhcmdlciA9IDE7CisgIGxhc3RfaSA9IDA7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShzdGF0aWMsMSkgcHJpdmF0ZShpKSBvcmRlcmVkCisgIGZvciAoaSA9IDE7IGkgPCAxMDA7IGkrKykgeworICAgIGlpID0gaTsKKyAgICAjcHJhZ21hIG9tcCBvcmRlcmVkCisgICAgeworICAgICAgaXNfbGFyZ2VyID0gY2hlY2tfaV9pc2xhcmdlcjIgKGlpKSAmJiBpc19sYXJnZXI7CisgICAgICBzdW0gID0gc3VtICsgaWk7CisgICAgfQorICB9CisgIGtub3duX3N1bSA9ICg5OSAqIDEwMCkgLyAyOworICBmcHJpbnRmIChzdGRlcnIsIiBrbm93bl9zdW0gPSAlZCAsIHN1bSA9ICVkIFxuIiwga25vd25fc3VtLCBzdW0pOworICBmcHJpbnRmIChzdGRlcnIsIiBpc19sYXJnZXIgPSAlZFxuIiwgaXNfbGFyZ2VyKTsKKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKSAmJiBpc19sYXJnZXI7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9mb3Jfb3JkZXJlZCgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfcGFyYWxsZWxfZm9yX3ByaXZhdGUuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9wcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIzMWQzNgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9wcml2YXRlLmMKQEAgLTAsMCArMSw1MCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLyohIFV0aWxpdHkgZnVuY3Rpb24gdG8gc3BlbmQgc29tZSB0aW1lIGluIGEgbG9vcCAqLworc3RhdGljIHZvaWQgZG9fc29tZV93b3JrICh2b2lkKQoreworICBpbnQgaTsKKyAgZG91YmxlIHN1bSA9IDA7CisgIGZvcihpID0gMDsgaSA8IDEwMDA7IGkrKyl7CisgICAgc3VtICs9IHNxcnQgKGkpOworICB9Cit9CisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZSgpCit7CisgIGludCBzdW07CisgIGludCBpOworICBpbnQgaTI7CisgIGludCBrbm93bl9zdW07CisKKyAgc3VtID0wOworICBpMj0wOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24oKzpzdW0pIHNjaGVkdWxlKHN0YXRpYywxKSBwcml2YXRlKGkpIHByaXZhdGUoaTIpCisgIGZvciAoaT0xO2k8PUxPT1BDT1VOVDtpKyspCisgIHsKKyAgICBpMiA9IGk7CisgICAgI3ByYWdtYSBvbXAgZmx1c2gKKyAgICBkb19zb21lX3dvcmsgKCk7CisgICAgI3ByYWdtYSBvbXAgZmx1c2gKKyAgICBzdW0gPSBzdW0gKyBpMjsKKyAgfSAvKmVuZCBvZiBmb3IqLworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9IC8qIGVuZCBvZiBjaGVja19wYXJhbGxlbF9mb3JfcHJpdmF0ZSAqLworCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfZm9yX3ByaXZhdGUoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24uYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMThkNzMwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfcGFyYWxsZWxfZm9yX3JlZHVjdGlvbi5jCkBAIC0wLDAgKzEsMjY2IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisjZGVmaW5lIERPVUJMRV9ESUdJVFMgMjAgICAgLyogZHReRE9VQkxFX0RJR0lUUyAqLworI2RlZmluZSBNQVhfRkFDVE9SIDEwCisjZGVmaW5lIEtOT1dOX1BST0RVQ1QgMzYyODgwMCAgLyogMTAhICovCisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9mb3JfcmVkdWN0aW9uKCkKK3sKKyAgaW50IHN1bTsKKyAgaW50IGtub3duX3N1bTsKKyAgZG91YmxlIGRzdW07CisgIGRvdWJsZSBka25vd25fc3VtOworICBkb3VibGUgZHQ9MC41OyAgLyogYmFzZSBvZiBnZW9tZXRyaWMgcm93IGZvciArIGFuZCAtIHRlc3QqLworICBkb3VibGUgcm91bmRpbmdfZXJyb3I9IDEuRS05OworICBpbnQgZGlmZjsKKyAgZG91YmxlIGRkaWZmOworICBpbnQgcHJvZHVjdDsKKyAgaW50IGtub3duX3Byb2R1Y3Q7CisgIGludCBsb2dpY19hbmQ7CisgIGludCBsb2dpY19vcjsKKyAgaW50IGJpdF9hbmQ7CisgIGludCBiaXRfb3I7CisgIGludCBleGNsdXNpdl9iaXRfb3I7CisgIGludCBsb2dpY3NbTE9PUENPVU5UXTsKKyAgaW50IGk7CisgIGRvdWJsZSBkcHQ7CisgIGludCByZXN1bHQ7CisKKyAgc3VtID0wOworICBkc3VtPTA7CisgIGR0ID0gMS4vMy47CisgIHJlc3VsdCA9IDA7CisgIHByb2R1Y3QgPSAxOworICBsb2dpY19hbmQ9MTsKKyAgbG9naWNfb3I9MDsKKyAgYml0X2FuZD0xOworICBiaXRfb3I9MDsKKyAgZXhjbHVzaXZfYml0X29yPTA7CisKKyAgLyogVGVzdHMgZm9yIGludGVnZXJzICovCisgIGtub3duX3N1bSA9IChMT09QQ09VTlQqKExPT1BDT1VOVCsxKSkvMjsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oKzpzdW0pCisgIGZvciAoaT0xO2k8PUxPT1BDT1VOVDtpKyspIHsKKyAgICBzdW09c3VtK2k7CisgIH0KKyAgaWYoa25vd25fc3VtIT1zdW0pIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQiCisgICAgICAiIGluc3RlYWQgb2YgJWRcbiIsc3VtLGtub3duX3N1bSk7CisgIH0KKworICBkaWZmID0gKExPT1BDT1VOVCooTE9PUENPVU5UKzEpKS8yOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIHJlZHVjdGlvbigtOmRpZmYpCisgIGZvciAoaT0xO2k8PUxPT1BDT1VOVDsrK2kpIHsKKyAgICBkaWZmPWRpZmYtaTsKKyAgfQorICBpZihkaWZmICE9IDApIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gZGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIgorICAgICAgIiBpbnN0ZWFkIG9mIDAuXG4iLGRpZmYpOworICB9CisKKyAgLyogVGVzdHMgZm9yIGRvdWJsZXMgKi8KKyAgZHN1bT0wOworICBkcHQ9MTsKKyAgZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkgeworICAgIGRwdCo9ZHQ7CisgIH0KKyAgZGtub3duX3N1bSA9ICgxLWRwdCkvKDEtZHQpOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIHJlZHVjdGlvbigrOmRzdW0pCisgIGZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpIHsKKyAgICBkc3VtICs9IHBvdyhkdCxpKTsKKyAgfQorICBpZiggZmFicyhkc3VtLWRrbm93bl9zdW0pID4gcm91bmRpbmdfZXJyb3IgKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJWYiCisgICAgICAiIGluc3RlYWQgb2YgJWYgKERpZmZlcmVuY2U6ICVFKVxuIiwKKyAgICAgIGRzdW0sIGRrbm93bl9zdW0sIGRzdW0tZGtub3duX3N1bSk7CisgIH0KKworICBkcHQ9MTsKKworICBmb3IgKGk9MDtpPERPVUJMRV9ESUdJVFM7KytpKSB7CisgICAgZHB0Kj1kdDsKKyAgfQorICBmcHJpbnRmKHN0ZGVyciwiXG4iKTsKKyAgZGRpZmYgPSAoMS1kcHQpLygxLWR0KTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oLTpkZGlmZikKKyAgZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkgeworICAgIGRkaWZmIC09IHBvdyhkdCxpKTsKKyAgfQorICBpZiggZmFicyhkZGlmZikgPiByb3VuZGluZ19lcnJvcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSIKKyAgICAgICIgaW5zdGVhZCBvZiAwLjBcbiIsZGRpZmYpOworICB9CisKKyAgLyogVGVzdHMgZm9yIGludGVnZXJzICovCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKCo6cHJvZHVjdCkKKyAgZm9yKGk9MTtpPD1NQVhfRkFDVE9SO2krKykgeworICAgIHByb2R1Y3QgKj0gaTsKKyAgfQorICBrbm93bl9wcm9kdWN0ID0gS05PV05fUFJPRFVDVDsKKyAgaWYoa25vd25fcHJvZHVjdCAhPSBwcm9kdWN0KSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIFByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCIKKyAgICAgICIgaW5zdGVhZCBvZiAlZFxuXG4iLHByb2R1Y3Qsa25vd25fcHJvZHVjdCk7CisgIH0KKworICAvKiBUZXN0cyBmb3IgbG9naWMgQU5EICovCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKSB7CisgICAgbG9naWNzW2ldPTE7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIFwKKyAgICByZWR1Y3Rpb24oJiY6bG9naWNfYW5kKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKyAgfQorICBpZighbG9naWNfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDEuXG4iKTsKKyAgfQorCisgIGxvZ2ljX2FuZCA9IDE7CisgIGxvZ2ljc1tMT09QQ09VTlQvMl09MDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIFwKKyAgICByZWR1Y3Rpb24oJiY6bG9naWNfYW5kKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV07CisgIH0KKyAgaWYobG9naWNfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDIuXG4iKTsKKyAgfQorCisgIC8qIFRlc3RzIGZvciBsb2dpYyBPUiAqLworICBmb3IoaT0wO2k8TE9PUENPVU5UO2krKykgeworICAgIGxvZ2ljc1tpXT0wOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSBcCisgICAgcmVkdWN0aW9uKHx8OmxvZ2ljX29yKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGxvZ2ljX29yID0gbG9naWNfb3IgfHwgbG9naWNzW2ldOworICB9CisgIGlmKGxvZ2ljX29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMS5cbiIpOworICB9CisgIGxvZ2ljX29yID0gMDsKKyAgbG9naWNzW0xPT1BDT1VOVC8yXT0xOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgXAorICAgIHJlZHVjdGlvbih8fDpsb2dpY19vcikKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tpXTsKKyAgfQorICBpZighbG9naWNfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyLlxuIik7CisgIH0KKworICAvKiBUZXN0cyBmb3IgYml0d2lzZSBBTkQgKi8KKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBsb2dpY3NbaV09MTsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgXAorICAgIHJlZHVjdGlvbigmOmJpdF9hbmQpCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKyAgfQorICBpZighYml0X2FuZCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMS5cbiIpOworICB9CisKKyAgYml0X2FuZCA9IDE7CisgIGxvZ2ljc1tMT09QQ09VTlQvMl09MDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIFwKKyAgICByZWR1Y3Rpb24oJjpiaXRfYW5kKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworICB9CisgIGlmKGJpdF9hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDIuXG4iKTsKKyAgfQorCisgIC8qIFRlc3RzIGZvciBiaXR3aXNlIE9SICovCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKSB7CisgICAgbG9naWNzW2ldPTA7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIFwKKyAgICByZWR1Y3Rpb24ofDpiaXRfb3IpCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworICB9CisgIGlmKGJpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBCSVQgT1IgcGFydCAxXG4iKTsKKyAgfQorICBiaXRfb3IgPSAwOworICBsb2dpY3NbTE9PUENPVU5ULzJdPTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSBcCisgICAgcmVkdWN0aW9uKHw6Yml0X29yKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKyAgfQorICBpZighYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDJcbiIpOworICB9CisKKyAgLyogVGVzdHMgZm9yIGJpdHdpc2UgWE9SICovCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKSB7CisgICAgbG9naWNzW2ldPTA7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIFwKKyAgICByZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICB9CisgIGlmKGV4Y2x1c2l2X2JpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAxXG4iKTsKKyAgfQorCisgIGV4Y2x1c2l2X2JpdF9vciA9IDA7CisgIGxvZ2ljc1tMT09QQ09VTlQvMl09MTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIFwKKyAgICByZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICB9CisgIGlmKCFleGNsdXNpdl9iaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMlxuIik7CisgIH0KKworICAvKnByaW50ZigiXG5SZXN1bHQ6JWRcbiIscmVzdWx0KTsqLworICByZXR1cm4gKHJlc3VsdD09MCk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9mb3JfcmVkdWN0aW9uKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3BhcmFsbGVsX3NlY3Rpb25zX2ZpcnN0cHJpdmF0ZS5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9wYXJhbGxlbF9zZWN0aW9uc19maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzgwZmFiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9wYXJhbGxlbF9zZWN0aW9uc19maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDU0IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19maXJzdHByaXZhdGUoKQoreworICBpbnQgc3VtOworICBpbnQgc3VtMDsKKyAgaW50IGtub3duX3N1bTsKKworICBzdW0gPTc7CisgIHN1bTA9MTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgZmlyc3Rwcml2YXRlKHN1bTApCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKyAgICAgICAgc3VtPSBzdW0rc3VtMDsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisgICAgICAgIHN1bT0gc3VtK3N1bTA7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworICAgICAgICBzdW09IHN1bStzdW0wOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGtub3duX3N1bT0xMSozKzc7CisgIHJldHVybiAoa25vd25fc3VtPT1zdW0pOworfSAvKiBlbmQgb2YgY2hlY2tfc2VjdGlvbl9maXJzdHByaXZhdGUqLworCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfZmlyc3Rwcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI3NzVlYwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfbGFzdHByaXZhdGUuYwpAQCAtMCwwICsxLDcxIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19sYXN0cHJpdmF0ZSgpCit7CisgIGludCBzdW07CisgIGludCBzdW0wOworICBpbnQgaTsKKyAgaW50IGkwOworICBpbnQga25vd25fc3VtOworICBzdW0gPTA7CisgIHN1bTAgPSAwOworICBpMCA9IC0xOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSxzdW0wKSBsYXN0cHJpdmF0ZShpMCkKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBzdW0wPTA7CisgICAgICBmb3IgKGk9MTtpPDQwMDtpKyspIHsKKyAgICAgICAgc3VtMD1zdW0wK2k7CisgICAgICAgIGkwPWk7CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworICAgICAgICBzdW09IHN1bStzdW0wOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgc3VtMD0wOworICAgICAgZm9yKGk9NDAwO2k8NzAwO2krKykgeworICAgICAgICBzdW0wPXN1bTAraTsKKyAgICAgICAgaTA9aTsKKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisgICAgICAgIHN1bT0gc3VtK3N1bTA7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBzdW0wPTA7CisgICAgICBmb3IoaT03MDA7aTwxMDAwO2krKykgeworICAgICAgICBzdW0wPXN1bTAraTsKKyAgICAgICAgaTA9aTsKKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisgICAgICAgIHN1bT0gc3VtK3N1bTA7CisgICAgICB9CisgICAgfQorICB9CisKKyAga25vd25fc3VtPSg5OTkqMTAwMCkvMjsKKyAgcmV0dXJuICgoa25vd25fc3VtPT1zdW0pICYmIChpMD09OTk5KSApOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfbGFzdHByaXZhdGUoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZS5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9wYXJhbGxlbF9zZWN0aW9uc19wcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RhYjI5NQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNjQgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX3ByaXZhdGUoKQoreworICBpbnQgc3VtOworICBpbnQgc3VtMDsKKyAgaW50IGk7CisgIGludCBrbm93bl9zdW07CisKKyAgc3VtID0gNzsKKyAgc3VtMD0wOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoc3VtMCwgaSkKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBzdW0wPTA7CisgICAgICBmb3IgKGk9MTtpPDQwMDtpKyspCisgICAgICAgIHN1bTA9c3VtMCtpOworICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKyAgICAgICAgc3VtPSBzdW0rc3VtMDsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIHN1bTA9MDsKKyAgICAgIGZvcihpPTQwMDtpPDcwMDtpKyspCisgICAgICAgIHN1bTA9c3VtMCtpOworICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKyAgICAgICAgc3VtPSBzdW0rc3VtMDsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIHN1bTA9MDsKKyAgICAgIGZvcihpPTcwMDtpPDEwMDA7aSsrKQorICAgICAgICBzdW0wPXN1bTAraTsKKyAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisgICAgICAgIHN1bT0gc3VtK3N1bTA7CisgICAgICB9CisgICAgfQorICB9CisKKyAga25vd25fc3VtPSg5OTkqMTAwMCkvMis3OworICByZXR1cm4gKGtub3duX3N1bT09c3VtKTsKK30gLyogZW5kIG9mIGNoZWNrX3NlY3Rpb25fcHJpdmF0ZSovCisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19wcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3BhcmFsbGVsX3NlY3Rpb25zX3JlZHVjdGlvbi5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDQ5ODY1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb24uYwpAQCAtMCwwICsxLDUwOCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX3JlZHVjdGlvbigpCit7CisgIGludCBzdW07CisgIGludCBrbm93bl9zdW07CisgIGRvdWJsZSBkcHQ7CisgIGRvdWJsZSBkc3VtOworICBkb3VibGUgZGtub3duX3N1bTsKKyAgZG91YmxlIGR0PTAuNTsgLyogYmFzZSBvZiBnZW9tZXRyaWMgcm93IGZvciArIGFuZCAtIHRlc3QqLworICBkb3VibGUgcm91bmRpbmdfZXJyb3I9IDEuRS01OworICBpbnQgZGlmZjsKKyAgZG91YmxlIGRkaWZmOworICBpbnQgcHJvZHVjdDsKKyAgaW50IGtub3duX3Byb2R1Y3Q7CisgIGludCBsb2dpY19hbmQ7CisgIGludCBiaXRfYW5kOworICBpbnQgbG9naWNfb3I7CisgIGludCBiaXRfb3I7CisgIGludCBleGNsdXNpdl9iaXRfb3I7CisgIGludCBsb2dpY3NbMTAwMF07CisgIGludCBpOworICBpbnQgcmVzdWx0OworCisgIHN1bSA9IDc7CisgIGRzdW09MDsKKyAgcHJvZHVjdCA9MTsKKyAgZHB0ID0gMTsKKyAgbG9naWNfYW5kPTE7CisgIGJpdF9hbmQ9MTsKKyAgbG9naWNfb3I9MDsKKyAgYml0X29yPTA7CisgIGV4Y2x1c2l2X2JpdF9vcj0wOworICByZXN1bHQgPTA7CisgIC8qICBpbnQgbXlfaXNsYXJnZXI7Ki8KKyAgLyppbnQgaXNfbGFyZ2VyPTE7Ki8KKworICAvLyBUZXN0IHN1bW1hdGlvbiBvZiBpbnRlZ2VycworICBrbm93bl9zdW0gPSAoOTk5KjEwMDApLzIrNzsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oKzpzdW0pCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTE7aTwzMDA7aSsrKSB7CisgICAgICAgIHN1bT1zdW0raTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT0zMDA7aTw3MDA7aSsrKSB7CisgICAgICAgIHN1bT1zdW0raTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT03MDA7aTwxMDAwO2krKykgeworICAgICAgICBzdW09c3VtK2k7CisgICAgICB9CisgICAgfQorICB9CisgIGlmKGtub3duX3N1bSE9c3VtKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIgorICAgICAgIiBpbnN0ZWFkIG9mICVkLlxuIixzdW0sIGtub3duX3N1bSk7CisgIH0KKworICAvLyBUZXN0IGRpZmZlcmVuY2VzIG9mIGludGVnZXJzCisgIGRpZmYgPSAoOTk5KjEwMDApLzI7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKC06ZGlmZikKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9MTtpPDMwMDtpKyspIHsKKyAgICAgICAgZGlmZj1kaWZmLWk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9MzAwO2k8NzAwO2krKykgeworICAgICAgICBkaWZmPWRpZmYtaTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT03MDA7aTwxMDAwO2krKykgeworICAgICAgICBkaWZmPWRpZmYtaTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoZGlmZiAhPSAwKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCIKKyAgICAgICIgaW5zdGVhZCBvZiAwLlxuIixkaWZmKTsKKyAgfQorCisgIC8vIFRlc3Qgc3VtbWF0aW9uIG9mIGRvdWJsZXMKKyAgZm9yIChpPTA7aTwyMDsrK2kpIHsKKyAgICBkcHQqPWR0OworICB9CisgIGRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oKzpkc3VtKQorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT0wO2k8NjsrK2kpIHsKKyAgICAgICAgZHN1bSArPSBwb3coZHQsaSk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9NjtpPDEyOysraSkgeworICAgICAgICBkc3VtICs9IHBvdyhkdCxpKTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT0xMjtpPDIwOysraSkgeworICAgICAgICBkc3VtICs9IHBvdyhkdCxpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoIGZhYnMoZHN1bS1ka25vd25fc3VtKSA+IHJvdW5kaW5nX2Vycm9yICkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVmIgorICAgICAgIiBpbnN0ZWFkIG9mICVmIChEaWZmZXJlbmNlOiAlRSlcbiIsCisgICAgICBkc3VtLCBka25vd25fc3VtLCBkc3VtLWRrbm93bl9zdW0pOworICB9CisKKyAgLy8gVGVzdCBkaWZmZXJlbmNlcyBvZiBkb3VibGVzCisgIGRwdD0xOworICBmb3IgKGk9MDtpPDIwOysraSkgeworICAgIGRwdCo9ZHQ7CisgIH0KKyAgZnByaW50ZihzdGRlcnIsIlxuIik7CisgIGRkaWZmID0gKDEtZHB0KS8oMS1kdCk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKC06ZGRpZmYpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTA7aTw2OysraSkgeworICAgICAgICBkZGlmZiAtPSBwb3coZHQsaSk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9NjtpPDEyOysraSkgeworICAgICAgICBkZGlmZiAtPSBwb3coZHQsaSk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9MTI7aTwyMDsrK2kpIHsKKyAgICAgICAgZGRpZmYgLT0gcG93KGR0LGkpOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiggZmFicyhkZGlmZikgPiByb3VuZGluZ19lcnJvcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSIKKyAgICAgICIgaW5zdGVhZCBvZiAwLjBcbiIsZGRpZmYpOworICB9CisKKyAgLy8gVGVzdCBwcm9kdWN0IG9mIGludGVnZXJzCisgIGtub3duX3Byb2R1Y3QgPSAzNjI4ODAwOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbigqOnByb2R1Y3QpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9MTtpPDM7aSsrKSB7CisgICAgICAgIHByb2R1Y3QgKj0gaTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvcihpPTM7aTw3O2krKykgeworICAgICAgICBwcm9kdWN0ICo9IGk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IoaT03O2k8MTE7aSsrKSB7CisgICAgICAgIHByb2R1Y3QgKj0gaTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoa25vd25fcHJvZHVjdCAhPSBwcm9kdWN0KSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIFByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCIKKyAgICAgICIgaW5zdGVhZCBvZiAlZFxuIixwcm9kdWN0LGtub3duX3Byb2R1Y3QpOworICB9CisKKyAgLy8gVGVzdCBsb2dpY2FsIEFORAorICBmb3IoaT0wO2k8MTAwMDtpKyspIHsKKyAgICBsb2dpY3NbaV09MTsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCkKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9MTtpPDMwMDtpKyspIHsKKyAgICAgICAgbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTMwMDtpPDcwMDtpKyspIHsKKyAgICAgICAgbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTcwMDtpPDEwMDA7aSsrKSB7CisgICAgICAgIGxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoIWxvZ2ljX2FuZCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxXG4iKTsKKyAgfQorICBsb2dpY19hbmQgPSAxOworICBsb2dpY3NbNTAxXSA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oJiY6bG9naWNfYW5kKQorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT0xO2k8MzAwO2krKykgeworICAgICAgICBsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9MzAwO2k8NzAwO2krKykgeworICAgICAgICBsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9NzAwO2k8MTAwMDtpKyspIHsKKyAgICAgICAgbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworICAgICAgfQorICAgIH0KKyAgfQorICBpZihsb2dpY19hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMiIpOworICB9CisKKyAgLy8gVGVzdCBsb2dpY2FsIE9SCisgIGZvcihpPTA7aTwxMDAwO2krKykgeworICAgIGxvZ2ljc1tpXT0wOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24ofHw6bG9naWNfb3IpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTE7aTwzMDA7aSsrKSB7CisgICAgICAgIGxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9MzAwO2k8NzAwO2krKykgeworICAgICAgICBsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTcwMDtpPDEwMDA7aSsrKSB7CisgICAgICAgIGxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisgICAgICB9CisgICAgfQorICB9CisgIGlmKGxvZ2ljX29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMVxuIik7CisgIH0KKworICBsb2dpY19vciA9IDA7CisgIGxvZ2ljc1s1MDFdPTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24ofHw6bG9naWNfb3IpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTE7aTwzMDA7aSsrKSB7CisgICAgICAgIGxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9MzAwO2k8NzAwO2krKykgeworICAgICAgICBsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTcwMDtpPDEwMDA7aSsrKSB7CisgICAgICAgIGxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisgICAgICB9CisgICAgfQorICB9CisgIGlmKCFsb2dpY19vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDJcbiIpOworICB9CisKKyAgLy8gVGVzdCBiaXR3aXNlIEFORAorICBmb3IoaT0wO2k8MTAwMDsrK2kpIHsKKyAgICBsb2dpY3NbaV09MTsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKCY6Yml0X2FuZCkKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IoaT0wO2k8MzAwOysraSkgeworICAgICAgICBiaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9MzAwO2k8NzAwOysraSkgeworICAgICAgICBiaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9NzAwO2k8MTAwMDsrK2kpIHsKKyAgICAgICAgYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoIWJpdF9hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDFcbiIpOworICB9CisKKyAgYml0X2FuZCA9IDE7CisgIGxvZ2ljc1s1MDFdPTA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oJjpiaXRfYW5kKQorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvcihpPTA7aTwzMDA7KytpKSB7CisgICAgICAgIGJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9MzAwO2k8NzAwOysraSkgeworICAgICAgICBiaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvcihpPTcwMDtpPDEwMDA7KytpKSB7CisgICAgICAgIGJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworICAgICAgfQorICAgIH0KKyAgfQorICBpZihiaXRfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEJJVCBBTkQgcGFydCAyIik7CisgIH0KKworICAvLyBUZXN0IGJpdHdpc2UgT1IKKyAgZm9yKGk9MDtpPDEwMDA7aSsrKSB7CisgICAgbG9naWNzW2ldPTA7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbih8OmJpdF9vcikKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IoaT0wO2k8MzAwOysraSkgeworICAgICAgICBiaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IoaT0zMDA7aTw3MDA7KytpKSB7CisgICAgICAgIGJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvcihpPTcwMDtpPDEwMDA7KytpKSB7CisgICAgICAgIGJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDFcbiIpOworICB9CisgIGJpdF9vciA9IDA7CisgIGxvZ2ljc1s1MDFdPTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24ofDpiaXRfb3IpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9MDtpPDMwMDsrK2kpIHsKKyAgICAgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9MzAwO2k8NzAwOysraSkgeworICAgICAgICBiaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IoaT03MDA7aTwxMDAwOysraSkgeworICAgICAgICBiaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisgICAgICB9CisgICAgfQorICB9CisgIGlmKCFiaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMlxuIik7CisgIH0KKworICAvLyBUZXN0IGJpdHdpc2UgWE9SCisgIGZvcihpPTA7aTwxMDAwO2krKykgeworICAgIGxvZ2ljc1tpXT0wOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9MDtpPDMwMDsrK2kpIHsKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9MzAwO2k8NzAwOysraSkgeworICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IoaT03MDA7aTwxMDAwOysraSkgeworICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisgICAgICB9CisgICAgfQorICB9CisgIGlmKGV4Y2x1c2l2X2JpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAxXG4iKTsKKyAgfQorCisgIGV4Y2x1c2l2X2JpdF9vciA9IDA7CisgIGxvZ2ljc1s1MDFdPTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9MDtpPDMwMDsrK2kpIHsKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9MzAwO2k8NzAwOysraSkgeworICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IoaT03MDA7aTwxMDAwOysraSkgeworICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisgICAgICB9CisgICAgfQorICB9CisgIGlmKCFleGNsdXNpdl9iaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMlxuIik7CisgIH0KKworICAvKnByaW50ZigiXG5SZXN1bHQ6JWRcbiIscmVzdWx0KTsqLworICByZXR1cm4gKHJlc3VsdD09MCk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb24oKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfc2VjdGlvbl9maXJzdHByaXZhdGUuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfc2VjdGlvbl9maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTI2NDc1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9zZWN0aW9uX2ZpcnN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTUgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX3NlY3Rpb25fZmlyc3Rwcml2YXRlKCkKK3sKKyAgaW50IHN1bTsKKyAgaW50IHN1bTA7CisgIGludCBrbm93bl9zdW07CisKKyAgc3VtMCA9IDExOworICBzdW0gPSA3OworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgIHNlY3Rpb25zIGZpcnN0cHJpdmF0ZShzdW0wKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgeworICAgICAgICAgIHN1bSA9IHN1bSArIHN1bTA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgeworICAgICAgICAgIHN1bSA9IHN1bSArIHN1bTA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgeworICAgICAgICAgIHN1bSA9IHN1bSArIHN1bTA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAga25vd25fc3VtID0gMTEgKiAzICsgNzsKKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30gLyogZW5kIG9mIGNoZWNrX3NlY3Rpb25fZmlyc3Rwcml2YXRlKi8KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3NlY3Rpb25fZmlyc3Rwcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3NlY3Rpb25fbGFzdHByaXZhdGUuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfc2VjdGlvbl9sYXN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYmJlYTkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3NlY3Rpb25fbGFzdHByaXZhdGUuYwpAQCAtMCwwICsxLDc2IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9zZWN0aW9uX2xhc3Rwcml2YXRlKCkKK3sKKyAgaW50IGkwID0gLTE7CisgIGludCBzdW0gPSAwOworICBpbnQgaTsKKyAgaW50IHN1bTAgPSAwOworICBpbnQga25vd25fc3VtOworCisgIGkwID0gLTE7CisgIHN1bSA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIGxhc3Rwcml2YXRlKGkwKSBwcml2YXRlKGksc3VtMCkKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIHN1bTAgPSAwOworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgNDAwOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGk7CisgICAgICAgICAgaTAgPSBpOworICAgICAgICB9CisgICAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICAgIHsKKyAgICAgICAgICBzdW0gPSBzdW0gKyBzdW0wOworICAgICAgICB9IC8qZW5kIG9mIGNyaXRpY2FsKi8KKyAgICAgIH0gLyogZW5kIG9mIHNlY3Rpb24gKi8KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgc3VtMCA9IDA7CisgICAgICAgIGZvcihpID0gNDAwOyBpIDwgNzAwOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGk7CisgICAgICAgICAgaTAgPSBpOworICAgICAgICB9CisgICAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICAgIHsKKyAgICAgICAgICBzdW0gPSBzdW0gKyBzdW0wOworICAgICAgICB9IC8qZW5kIG9mIGNyaXRpY2FsKi8KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgc3VtMCA9IDA7CisgICAgICAgIGZvcihpID0gNzAwOyBpIDwgMTAwMDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpOworICAgICAgICAgIGkwID0gaTsKKyAgICAgICAgfQorICAgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgICB7CisgICAgICAgICAgc3VtID0gc3VtICsgc3VtMDsKKyAgICAgICAgfSAvKmVuZCBvZiBjcml0aWNhbCovCisgICAgICB9IC8qIGVuZCBvZiBzZWN0aW9uICovCisgICAgfSAvKiBlbmQgb2Ygc2VjdGlvbnMqLworICB9IC8qIGVuZCBvZiBwYXJhbGxlbCovCisgIGtub3duX3N1bSA9ICg5OTkgKiAxMDAwKSAvIDI7CisgIHJldHVybiAoKGtub3duX3N1bSA9PSBzdW0pICYmIChpMCA9PSA5OTkpICk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9zZWN0aW9uX2xhc3Rwcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3NlY3Rpb25fcHJpdmF0ZS5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9zZWN0aW9uX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjJhMzBkCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9zZWN0aW9uX3ByaXZhdGUuYwpAQCAtMCwwICsxLDY2IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9zZWN0aW9uX3ByaXZhdGUoKQoreworICBpbnQgc3VtOworICBpbnQgc3VtMDsKKyAgaW50IGk7CisgIGludCBrbm93bl9zdW07CisKKyAgc3VtID0gNzsKKyAgc3VtMCA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoc3VtMCxpKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgc3VtMCA9IDA7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCA0MDA7IGkrKykKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGk7CisgICAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICAgIHsKKyAgICAgICAgICBzdW0gPSBzdW0gKyBzdW0wOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIHN1bTAgPSAwOworICAgICAgICBmb3IgKGkgPSA0MDA7IGkgPCA3MDA7IGkrKykKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGk7CisgICAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICAgIHsKKyAgICAgICAgICBzdW0gPSBzdW0gKyBzdW0wOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIHN1bTAgPSAwOworICAgICAgICBmb3IgKGkgPSA3MDA7IGkgPCAxMDAwOyBpKyspCisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpOworICAgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgICB7CisgICAgICAgICAgc3VtID0gc3VtICsgc3VtMDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gLyplbmQgb2Ygc2VjdGlvbnMqLworICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICBrbm93bl9zdW0gPSAoOTk5ICogMTAwMCkgLyAyICsgNzsKKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30gLyogZW5kIG9mIGNoZWNrX3NlY3Rpb25fcHJpdmF0ZSovCisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9zZWN0aW9uX3ByaXZhdGUoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfc2VjdGlvbnNfbm93YWl0LmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3NlY3Rpb25zX25vd2FpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZmYyNTQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3NlY3Rpb25zX25vd2FpdC5jCkBAIC0wLDAgKzEsMTA0IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8qCisgKiBUaGlzIHRlc3Qgd2lsbCBoYW5nIGlmIHRoZSBub3dhaXQgaXMgbm90IHdvcmtpbmcgcHJvcGVybHkKKyAqCisgKiBJdCByZWxpZXMgb24gYSB0aHJlYWQgc2tpcHBpbmcgdG8gdGhlIHNlY29uZCBzZWN0aW9ucyBjb25zdHJ1Y3QgdG8KKyAqIHJlbGVhc2UgdGhlIHRocmVhZHMgaW4gdGhlIGZpcnN0IHNlY3Rpb25zIGNvbnN0cnVjdAorICoKKyAqIEFsc28sIHNpbmNlIHNjaGVkdWxpbmcgb2Ygc2VjdGlvbnMgaXMgaW1wbGVtZW50YXRpb24gZGVmaW5lZCwgaXQgaXMKKyAqIG5lY2Vzc2FyeSB0byBoYXZlIGFsbCBmb3VyIHNlY3Rpb25zIGluIHRoZSBzZWNvbmQgc2VjdGlvbnMgY29uc3RydWN0CisgKiByZWxlYXNlIHRoZSB0aHJlYWRzIHNpbmNlIHdlIGNhbid0IGd1YXJhbnRlZSB3aGljaCBzZWN0aW9uIGEgc2luZ2xlIHRocmVhZAorICogd2lsbCBleGVjdXRlLgorICovCit2b2xhdGlsZSBpbnQgcmVsZWFzZTsKK3ZvbGF0aWxlIGludCBjb3VudDsKKwordm9pZCB3YWl0X2Zvcl9yZWxlYXNlX3RoZW5faW5jcmVtZW50KGludCByYW5rKQoreworICBmcHJpbnRmKHN0ZGVyciwgIlRocmVhZCBuciAlZCBlbnRlcnMgZmlyc3Qgc2VjdGlvbiIKKyAgICAiIGFuZCB3YWl0cy5cbiIsIHJhbmspOworICB3aGlsZSAocmVsZWFzZSA9PSAwKTsKKyAgI3ByYWdtYSBvbXAgYXRvbWljCisgIGNvdW50Kys7Cit9CisKK3ZvaWQgcmVsZWFzZV9hbmRfaW5jcmVtZW50KGludCByYW5rKQoreworICBmcHJpbnRmKHN0ZGVyciwgIlRocmVhZCBuciAlZCBzZXRzIHJlbGVhc2UgdG8gMVxuIiwgcmFuayk7CisgIHJlbGVhc2UgPSAxOworICAjcHJhZ21hIG9tcCBmbHVzaChyZWxlYXNlKQorICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgY291bnQrKzsKK30KKworaW50IHRlc3Rfb21wX3NlY3Rpb25zX25vd2FpdCgpCit7CisgIHJlbGVhc2UgPSAwOworICBjb3VudCA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMoNCkKKyAgeworICAgIGludCByYW5rOworICAgIHJhbmsgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMgbm93YWl0CisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICB3YWl0X2Zvcl9yZWxlYXNlX3RoZW5faW5jcmVtZW50KHJhbmspOworICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICB3YWl0X2Zvcl9yZWxlYXNlX3RoZW5faW5jcmVtZW50KHJhbmspOworICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICB3YWl0X2Zvcl9yZWxlYXNlX3RoZW5faW5jcmVtZW50KHJhbmspOworICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlRocmVhZCBuciAlZCBlbnRlcnMgZmlyc3Qgc2VjdGlvbnMgYW5kIGdvZXMgIgorICAgICAgICAgICJpbW1lZGlhdGVseSB0byBuZXh0IHNlY3Rpb25zIGNvbnN0cnVjdCB0byByZWxlYXNlLlxuIiwgcmFuayk7CisgICAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgICBjb3VudCsrOworICAgICAgfQorICAgIH0KKyAgICAvKiBCZWdpbiBvZiBzZWNvbmQgc2VjdGlvbnMgZW52aXJvbm1lbnQgKi8KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9ucworICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgcmVsZWFzZV9hbmRfaW5jcmVtZW50KHJhbmspOworICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICByZWxlYXNlX2FuZF9pbmNyZW1lbnQocmFuayk7CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIHJlbGVhc2VfYW5kX2luY3JlbWVudChyYW5rKTsKKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgcmVsZWFzZV9hbmRfaW5jcmVtZW50KHJhbmspOworICAgICAgfQorICAgIH0KKyAgfQorICAvLyBDaGVjayB0byBtYWtlIHN1cmUgYWxsIGVpZ2h0IHNlY3Rpb25zIHdlcmUgZXhlY3V0ZWQKKyAgcmV0dXJuIChjb3VudD09OCk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9zZWN0aW9uc19ub3dhaXQoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfc2VjdGlvbnNfcmVkdWN0aW9uLmMgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3NlY3Rpb25zX3JlZHVjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZGI1ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3NlY3Rpb25zX3JlZHVjdGlvbi5jCkBAIC0wLDAgKzEsNTQzIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfc2VjdGlvbnNfcmVkdWN0aW9uKCkKK3sKKyAgaW50IHN1bTsKKyAgaW50IGtub3duX3N1bTsKKyAgZG91YmxlIGRwdCxkc3VtOworICBkb3VibGUgZGtub3duX3N1bTsKKyAgZG91YmxlIGR0PTAuNTsgLyogYmFzZSBvZiBnZW9tZXRyaWMgcm93IGZvciArIGFuZCAtIHRlc3QqLworICBkb3VibGUgcm91bmRpbmdfZXJyb3I9IDEuRS05OworICBpbnQgZGlmZjsKKyAgZG91YmxlIGRkaWZmOworICBpbnQgcHJvZHVjdDsKKyAgaW50IGtub3duX3Byb2R1Y3Q7CisgIGludCBsb2dpY19hbmQ7CisgIGludCBiaXRfYW5kOworICBpbnQgbG9naWNfb3I7CisgIGludCBiaXRfb3I7CisgIGludCBleGNsdXNpdl9iaXRfb3I7CisgIGludCBsb2dpY3NbMTAwMF07CisgIGludCBpOworICBpbnQgcmVzdWx0OworICAvKiBpbnQgbXlfaXNsYXJnZXI7ICovCisgIC8qaW50IGlzX2xhcmdlcj0xOyovCisgIHN1bSA9NzsKKyAgZHB0ID0xOworICBkc3VtPTA7CisgIHByb2R1Y3QgPTE7CisgIGxvZ2ljX2FuZD0xOworICBiaXRfYW5kPTE7CisgIGxvZ2ljX29yPTA7CisgIGJpdF9vcj0wOworICBleGNsdXNpdl9iaXRfb3I9MDsKKyAgcmVzdWx0ID0gMDsKKyAgZHQgPSAxLi8zLjsKKworICBrbm93bl9zdW0gPSAoOTk5KjEwMDApLzIrNzsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKCs6c3VtKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTE7aTwzMDA7aSsrKSB7CisgICAgICAgICAgc3VtPXN1bStpOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT0zMDA7aTw3MDA7aSsrKSB7CisgICAgICAgICAgc3VtPXN1bStpOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT03MDA7aTwxMDAwO2krKykgeworICAgICAgICAgIHN1bT1zdW0raTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZihrbm93bl9zdW0hPXN1bSkgeworICAgICsrcmVzdWx0OworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCIKKyAgICAgICIgaW5zdGVhZCBvZiAlZFxuIiwgc3VtLGtub3duX3N1bSk7CisgIH0KKworICBkaWZmID0gKDk5OSoxMDAwKS8yOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oLTpkaWZmKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTE7aTwzMDA7aSsrKSB7CisgICAgICAgICAgZGlmZj1kaWZmLWk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTMwMDtpPDcwMDtpKyspIHsKKyAgICAgICAgICBkaWZmPWRpZmYtaTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9NzAwO2k8MTAwMDtpKyspIHsKKyAgICAgICAgICBkaWZmPWRpZmYtaTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZihkaWZmICE9IDApIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIgorICAgICAgIiBpbnN0ZWFkIG9mIDAuXG4iLGRpZmYpOworICB9CisKKyAgZm9yIChpPTA7aTwyMDsrK2kpIHsKKyAgICBkcHQqPWR0OworICB9CisgIGRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKCs6ZHN1bSkKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT0wO2k8NjsrK2kpIHsKKyAgICAgICAgICBkc3VtICs9IHBvdyhkdCxpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9NjtpPDEyOysraSkgeworICAgICAgICAgIGRzdW0gKz0gcG93KGR0LGkpOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT0xMjtpPDIwOysraSkgeworICAgICAgICAgIGRzdW0gKz0gcG93KGR0LGkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmKCBmYWJzKGRzdW0tZGtub3duX3N1bSkgPiByb3VuZGluZ19lcnJvciApIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlZiIKKyAgICAgICIgaW5zdGVhZCBvZiAlZiAoRGlmZmVyZW5jZTogJUUpXG4iLAorICAgICAgZHN1bSwgZGtub3duX3N1bSwgZHN1bS1ka25vd25fc3VtKTsKKyAgfQorCisgIGRwdD0xOworICBmb3IgKGk9MDtpPDIwOysraSkgeworICAgIGRwdCo9ZHQ7CisgIH0KKyAgZnByaW50ZihzdGRlcnIsIlxuIik7CisgIGRkaWZmID0gKDEtZHB0KS8oMS1kdCk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbigtOmRkaWZmKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTA7aTw2OysraSkgeworICAgICAgICAgIGRkaWZmIC09IHBvdyhkdCxpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9NjtpPDEyOysraSkgeworICAgICAgICAgIGRkaWZmIC09IHBvdyhkdCxpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9MTI7aTwyMDsrK2kpIHsKKyAgICAgICAgICBkZGlmZiAtPSBwb3coZHQsaSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZihmYWJzKGRkaWZmKSA+IHJvdW5kaW5nX2Vycm9yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVFIgorICAgICAgIiBpbnN0ZWFkIG9mIDAuMFxuIixkZGlmZik7CisgIH0KKworICBrbm93bl9wcm9kdWN0ID0gMzYyODgwMDsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKCo6cHJvZHVjdCkKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTE7aTwzO2krKykgeworICAgICAgICAgIHByb2R1Y3QgKj0gaTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IoaT0zO2k8NztpKyspIHsKKyAgICAgICAgICBwcm9kdWN0ICo9IGk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yKGk9NztpPDExO2krKykgeworICAgICAgICAgIHByb2R1Y3QgKj0gaTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZihrbm93bl9wcm9kdWN0ICE9IHByb2R1Y3QpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gUHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIgorICAgICAgIiBpbnN0ZWFkIG9mICVkXG4iLHByb2R1Y3Qsa25vd25fcHJvZHVjdCk7CisgIH0KKworICBmb3IoaT0wO2k8MTAwMDtpKyspIHsKKyAgICBsb2dpY3NbaV09MTsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbigmJjpsb2dpY19hbmQpCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9MTtpPDMwMDtpKyspIHsKKyAgICAgICAgICBsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTMwMDtpPDcwMDtpKyspIHsKKyAgICAgICAgICBsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTcwMDtpPDEwMDA7aSsrKSB7CisgICAgICAgICAgbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmKCFsb2dpY19hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMVxuIik7CisgIH0KKworICBsb2dpY19hbmQgPSAxOworICBsb2dpY3NbNTAxXSA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCkKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT0xO2k8MzAwO2krKykgeworICAgICAgICAgIGxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9MzAwO2k8NzAwO2krKykgeworICAgICAgICAgIGxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9NzAwO2k8MTAwMDtpKyspIHsKKyAgICAgICAgICBsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYobG9naWNfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDJcbiIpOworICB9CisKKyAgZm9yKGk9MDtpPDEwMDA7aSsrKSB7CisgICAgbG9naWNzW2ldPTA7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24ofHw6bG9naWNfb3IpCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9MTtpPDMwMDtpKyspIHsKKyAgICAgICAgICBsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT0zMDA7aTw3MDA7aSsrKSB7CisgICAgICAgICAgbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9NzAwO2k8MTAwMDtpKyspIHsKKyAgICAgICAgICBsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmKGxvZ2ljX29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIlxuRXJyb3IgaW4gbG9naWMgT1IgcGFydCAxXG4iKTsKKyAgfQorCisgIGxvZ2ljX29yID0gMDsKKyAgbG9naWNzWzUwMV09MTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24ofHw6bG9naWNfb3IpCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9MTtpPDMwMDtpKyspIHsKKyAgICAgICAgICBsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT0zMDA7aTw3MDA7aSsrKSB7CisgICAgICAgICAgbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9NzAwO2k8MTAwMDtpKyspIHsKKyAgICAgICAgICBsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmKCFsb2dpY19vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDJcbiIpOworICB9CisKKyAgZm9yKGk9MDtpPDEwMDA7KytpKSB7CisgICAgbG9naWNzW2ldPTE7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oJjpiaXRfYW5kKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yKGk9MDtpPDMwMDsrK2kpIHsKKyAgICAgICAgICBiaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTMwMDtpPDcwMDsrK2kpIHsKKyAgICAgICAgICBiaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTcwMDtpPDEwMDA7KytpKSB7CisgICAgICAgICAgYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZighYml0X2FuZCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMVxuIik7CisgIH0KKworICBiaXRfYW5kID0gMTsKKyAgbG9naWNzWzUwMV09MDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oJjpiaXRfYW5kKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yKGk9MDtpPDMwMDsrK2kpIHsKKyAgICAgICAgICBiaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IoaT0zMDA7aTw3MDA7KytpKSB7CisgICAgICAgICAgYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3NbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yKGk9NzAwO2k8MTAwMDsrK2kpIHsKKyAgICAgICAgICBiaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZihiaXRfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEJJVCBBTkQgcGFydCAyXG4iKTsKKyAgfQorCisgIGZvcihpPTA7aTwxMDAwO2krKykgeworICAgIGxvZ2ljc1tpXT0wOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKHw6Yml0X29yKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yKGk9MDtpPDMwMDsrK2kpIHsKKyAgICAgICAgICBiaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yKGk9MzAwO2k8NzAwOysraSkgeworICAgICAgICAgIGJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IoaT03MDA7aTwxMDAwOysraSkgeworICAgICAgICAgIGJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZihiaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMVxuIik7CisgIH0KKyAgYml0X29yID0gMDsKKyAgbG9naWNzWzUwMV09MTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24ofDpiaXRfb3IpCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IoaT0wO2k8MzAwOysraSkgeworICAgICAgICAgIGJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IoaT0zMDA7aTw3MDA7KytpKSB7CisgICAgICAgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTcwMDtpPDEwMDA7KytpKSB7CisgICAgICAgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmKCFiaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMlxuIik7CisgIH0KKworICBmb3IoaT0wO2k8MTAwMDtpKyspIHsKKyAgICBsb2dpY3NbaV09MDsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcikKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTA7aTwzMDA7KytpKSB7CisgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTMwMDtpPDcwMDsrK2kpIHsKKyAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yKGk9NzAwO2k8MTAwMDsrK2kpIHsKKyAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoZXhjbHVzaXZfYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDFcbiIpOworICB9CisKKyAgZXhjbHVzaXZfYml0X29yID0gMDsKKyAgbG9naWNzWzUwMV09MTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IoaT0wO2k8MzAwOysraSkgeworICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IoaT0zMDA7aTw3MDA7KytpKSB7CisgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTcwMDtpPDEwMDA7KytpKSB7CisgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmKCFleGNsdXNpdl9iaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMlxuIik7CisgIH0KKworICAvKnByaW50ZigiXG5SZXN1bHQ6JWRcbiIscmVzdWx0KTsqLworICByZXR1cm4gKHJlc3VsdD09MCk7Cit9CitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfc2VjdGlvbnNfcmVkdWN0aW9uKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2luZ2xlL29tcF9zaW5nbGUuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zaW5nbGUvb21wX3NpbmdsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NjM1NzkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2luZ2xlL29tcF9zaW5nbGUuYwpAQCAtMCwwICsxLDQ0IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9zaW5nbGUoKQoreworICBpbnQgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisgIGludCByZXN1bHQ7CisgIGludCBucl9pdGVyYXRpb25zOworICBpbnQgaTsKKworICBucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisgIHJlc3VsdCA9IDA7CisgIG5yX2l0ZXJhdGlvbnMgPSAwOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUoaSkKKyAgeworICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykgeworICAgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgICB7CisgICAgICAgICNwcmFnbWEgb21wIGZsdXNoCisgICAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlKys7CisgICAgICAgICNwcmFnbWEgb21wIGZsdXNoCisgICAgICAgIG5yX2l0ZXJhdGlvbnMrKzsKKyAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUtLTsKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAoKHJlc3VsdCA9PSAwKSAmJiAobnJfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKK30gLyogZW5kIG9mIGNoZWNrX3NpbmdsZSovCisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9zaW5nbGUoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zaW5nbGUvb21wX3NpbmdsZV9jb3B5cHJpdmF0ZS5jIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NpbmdsZS9vbXBfc2luZ2xlX2NvcHlwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY1Y2Q5NQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zaW5nbGUvb21wX3NpbmdsZV9jb3B5cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNjAgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKyNkZWZpbmUgREVCVUdfVEVTVCAwCisKK2ludCBqOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShqKQorCitpbnQgdGVzdF9vbXBfc2luZ2xlX2NvcHlwcml2YXRlKCkKK3sKKyAgaW50IHJlc3VsdDsKKyAgaW50IG5yX2l0ZXJhdGlvbnM7CisKKyAgcmVzdWx0ID0gMDsKKyAgbnJfaXRlcmF0aW9ucyA9IDA7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisgICAgeworI2lmIERFQlVHX1RFU1QKKyAgICAgICAgIGludCB0aHJlYWQ7CisgICAgICAgICB0aHJlYWQgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisjZW5kaWYKKyAgICAgICNwcmFnbWEgb21wIHNpbmdsZSBjb3B5cHJpdmF0ZShqKQorICAgICAgeworICAgICAgICBucl9pdGVyYXRpb25zKys7CisgICAgICAgIGogPSBpOworI2lmIERFQlVHX1RFU1QKKyAgICAgICAgcHJpbnRmICgidGhyZWFkICVkIGFzc2lnbnMsIGogPSAlZCwgaSA9ICVkXG4iLCB0aHJlYWQsIGosIGkpOworI2VuZGlmCisgICAgICB9CisjaWYgREVCVUdfVEVTVAorICAgICAgI3ByYWdtYSBvbXAgYmFycmllcgorI2VuZGlmCisgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworI2lmIERFQlVHX1RFU1QKKyAgICAgICAgcHJpbnRmICgidGhyZWFkID0gJWQsIGogPSAlZCwgaSA9ICVkXG4iLCB0aHJlYWQsIGosIGkpOworI2VuZGlmCisgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIGogLSBpOworICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgYmFycmllcgorICAgIH0gLyogZW5kIG9mIGZvciAqLworICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9zaW5nbGVfY29weXByaXZhdGUoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zaW5nbGUvb21wX3NpbmdsZV9ub3dhaXQuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zaW5nbGUvb21wX3NpbmdsZV9ub3dhaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmY4OTMwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NpbmdsZS9vbXBfc2luZ2xlX25vd2FpdC5jCkBAIC0wLDAgKzEsNzMgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLyoKKyAqIFRoaXMgdGVzdCB3aWxsIGhhbmcgaWYgdGhlIG5vd2FpdCBpcyBub3Qgd29ya2luZyBwcm9wZXJseQorICoKKyAqIEl0IHJlbGllcyBvbiBhIG9uZSB0aHJlYWQgc2tpcHBpbmcgdG8gdGhlIGxhc3Qgc2luZ2xlIGNvbnN0cnVjdCB0bworICogcmVsZWFzZSB0aGUgdGhyZWFkcyBpbiB0aGUgZmlyc3QgdGhyZWUgc2luZ2xlIGNvbnN0cnVjdHMKKyAqLwordm9sYXRpbGUgaW50IHJlbGVhc2U7Cit2b2xhdGlsZSBpbnQgY291bnQ7CisKK3ZvaWQgd2FpdF9mb3JfcmVsZWFzZV90aGVuX2luY3JlbWVudChpbnQgcmFuaykKK3sKKyAgZnByaW50ZihzdGRlcnIsICJUaHJlYWQgbnIgJWQgZW50ZXJzIGZpcnN0IHNlY3Rpb24iCisgICAgIiBhbmQgd2FpdHMuXG4iLCByYW5rKTsKKyAgd2hpbGUgKHJlbGVhc2UgPT0gMCk7CisgICNwcmFnbWEgb21wIGF0b21pYworICBjb3VudCsrOworfQorCit2b2lkIHJlbGVhc2VfYW5kX2luY3JlbWVudChpbnQgcmFuaykKK3sKKyAgZnByaW50ZihzdGRlcnIsICJUaHJlYWQgbnIgJWQgc2V0cyByZWxlYXNlIHRvIDFcbiIsIHJhbmspOworICByZWxlYXNlID0gMTsKKyAgI3ByYWdtYSBvbXAgYXRvbWljCisgIGNvdW50Kys7Cit9CisKK2ludCB0ZXN0X29tcF9zaW5nbGVfbm93YWl0KCkKK3sKKyAgcmVsZWFzZSA9IDA7CisgIGNvdW50ID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyg0KQorICB7CisgICAgaW50IHJhbms7CisgICAgcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUgbm93YWl0CisgICAgeworICAgICAgd2FpdF9mb3JfcmVsZWFzZV90aGVuX2luY3JlbWVudChyYW5rKTsKKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2luZ2xlIG5vd2FpdAorICAgIHsKKyAgICAgIHdhaXRfZm9yX3JlbGVhc2VfdGhlbl9pbmNyZW1lbnQocmFuayk7CisgICAgfQorICAgICNwcmFnbWEgb21wIHNpbmdsZSBub3dhaXQKKyAgICB7CisgICAgICB3YWl0X2Zvcl9yZWxlYXNlX3RoZW5faW5jcmVtZW50KHJhbmspOworICAgIH0KKworICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIHJlbGVhc2VfYW5kX2luY3JlbWVudChyYW5rKTsKKyAgICB9CisgIH0KKyAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIGFsbCBmb3VyIHNpbmdsZXMgd2VyZSBleGVjdXRlZAorICByZXR1cm4gKGNvdW50PT00KTsKK30gLyogZW5kIG9mIGNoZWNrX3NpbmdsZV9ub3dhaXQqLworCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfc2luZ2xlX25vd2FpdCgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NpbmdsZS9vbXBfc2luZ2xlX3ByaXZhdGUuYyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zaW5nbGUvb21wX3NpbmdsZV9wcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI3ZjhkZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zaW5nbGUvb21wX3NpbmdsZV9wcml2YXRlLmMKQEAgLTAsMCArMSw1NyBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgbXlpdCA9IDA7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKG15aXQpCitpbnQgbXlyZXN1bHQgPSAwOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShteXJlc3VsdCkKKworaW50IHRlc3Rfb21wX3NpbmdsZV9wcml2YXRlKCkKK3sKKyAgaW50IG5yX3RocmVhZHNfaW5fc2luZ2xlOworICBpbnQgcmVzdWx0OworICBpbnQgbnJfaXRlcmF0aW9uczsKKyAgaW50IGk7CisKKyAgbXlpdCA9IDA7CisgIG5yX3RocmVhZHNfaW5fc2luZ2xlID0gMDsKKyAgbnJfaXRlcmF0aW9ucyA9IDA7CisgIHJlc3VsdCA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKQorICB7CisgICAgbXlyZXN1bHQgPSAwOworICAgIG15aXQgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykgeworICAgICAgI3ByYWdtYSBvbXAgc2luZ2xlIHByaXZhdGUobnJfdGhyZWFkc19pbl9zaW5nbGUpIG5vd2FpdAorICAgICAgeworICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisgICAgICAgICNwcmFnbWEgb21wIGZsdXNoCisgICAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlKys7CisgICAgICAgICNwcmFnbWEgb21wIGZsdXNoCisgICAgICAgIG15aXQrKzsKKyAgICAgICAgbXlyZXN1bHQgPSBteXJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgIHsKKyAgICAgIHJlc3VsdCArPSBucl90aHJlYWRzX2luX3NpbmdsZTsKKyAgICAgIG5yX2l0ZXJhdGlvbnMgKz0gbXlpdDsKKyAgICB9CisgIH0KKyAgcmV0dXJuICgocmVzdWx0ID09IDApICYmIChucl9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworfSAvKiBlbmQgb2YgY2hlY2tfc2luZ2xlIHByaXZhdGUgKi8KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3NpbmdsZV9wcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rvb2xzL2NoZWNrLWRlcGVuZHMucGwgYi9maW5hbC9ydW50aW1lL3Rvb2xzL2NoZWNrLWRlcGVuZHMucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDdlN2U1YQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvY2hlY2stZGVwZW5kcy5wbApAQCAtMCwwICsxLDUwNiBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBGaW5kQmluOwordXNlIGxpYiAiJEZpbmRCaW46OkJpbi9saWIiOworCit1c2UgdG9vbHM7CisKK291ciAkVkVSU0lPTiA9ICIwLjAwNSI7CitteSAkdGFyZ2V0X29zOworbXkgJHRhcmdldF9hcmNoOworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE91cHV0IHBhcnNlIGVycm9yLgorIyAgICAgJHRvb2wgLS0gTmFtZSBvZiB0b29sLgorIyAgICAgQGJ1bGsgLS0gT3V0cHV0IG9mIHRoZSB0b29sLgorIyAgICAgJG4gICAgLS0gTnVtYmVyIG9mIGxpbmUgY2F1c2VkIHBhcnNlIGVycm9yLgorc3ViIHBhcnNlX2Vycm9yKCRcQCQpIHsKKyAgICBteSAoICR0b29sLCAkYnVsaywgJG4gKSA9IEBfOworICAgIG15IEBidWxrOworICAgIGZvciAoIG15ICRpID0gMDsgJGkgPCBAJGJ1bGs7ICsrICRpICkgeworICAgICAgICBwdXNoKCBAYnVsaywgKCAkaSA9PSAkbiA/ICI+Pj4gIiA6ICIgICAgIiApIC4gJGJ1bGstPlsgJGkgXSApOworICAgIH07ICMgZm9yICRpCisgICAgcnVudGltZV9lcnJvciggIkZhaWwgdG8gcGFyc2UgJHRvb2wgb3V0cHV0OiIsIEBidWxrLCAiKGVvZikiICk7Cit9OyAjIHN1YiBwYXJzZV9lcnJvcgorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTGludXgqIE9TIHZlcnNpb24gb2YgZ2V0X2RlcHMoKSBwYXJzZXMgb3V0cHV0IG9mIGxkZDoKKyMKKyMgJCBsZGQgbGlibmFtZS5zbworIyAgIGxpYmMuc28uNiA9PiAvbGliNjQvbGliYy5zby42ICgweDAwMDAyYjYwZmVkZDgwMDApCisjICAgbGliZGwuc28uMiA9PiAvbGliNjQvbGliZGwuc28uMiAoMHgwMDAwMmI2MGZmMTJiMDAwKQorIyAgIGxpYnB0aHJlYWQuc28uMCA9PiAvbGliNjQvbGlicHRocmVhZC5zby4wICgweDAwMDAyYjYwZmYzMmYwMDApCisjICAgL2xpYjY0L2xkLWxpbnV4LXg4Ni02NC5zby4yICgweDAwMDAwMDM4Nzk0MDAwMDApCisjCisjIE5vdGU6IGxkZCBwcmludGQgYWxsIHRoZSBkZXBlbmRlbmNpZXMsIGRpcmVjdCBhbmQgaW5kaXJlY3QuIChGb3IgZXhhbXBsZSwgaWYgc3BlY2lmaWVkIGxpYnJhcnkKKyMgcmVxdWlyZXMgbGliZGwuc28sIGFuZCBsaWJkbC5zbyByZXF1aXJlcyAvbGliL2xkLWxpbnV4LnNvLCBsZGQgcHJpbnRzIGJvdGggbGliZGwuc28gYW5kCisjIC9saWIvbGQtbGludXguc28pLiBJZiB5b3UgZG8gbm90IHdhbnQgaW5kaXJlY3QgZGVwZW5kZW5jaWVzLCBsb29rIGF0IHJlYWRlbGYgdG9vbC4KKyMKK3N1YiBnZXRfZGVwc19sZGQoJCkgeworCisgICAgbXkgJGxpYiA9IHNoaWZ0ICggQF8gKTsKKyAgICBteSAkdG9vbCA9ICJsZGQiOworICAgIG15IEBidWxrOworICAgIG15IEBkZXBzOworCisgICAgZXhlY3V0ZSggWyAkdG9vbCwgJGxpYiBdLCAtc3Rkb3V0ID0+IFxAYnVsayApOworICAgIGRlYnVnKCBAYnVsaywgIihlb2YpIiApOworCisgICAgZm9yZWFjaCBteSAkaSAoIDAgLi4gQGJ1bGsgLSAxICkgeworICAgICAgICBteSAkbGluZSA9ICRidWxrWyAkaSBdOworICAgICAgICBpZiAoICRsaW5lICF+IG17XlxzKig/OihbX2EtejAtOS4rLS9dKilccys9PlxzKyk/KFtfYS16MC05ListL10qKVxzK1woMHhbMC05YS16XSpcKSR9aSApIHsKKyAgICAgICAgICAgIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgbXkgJGRlcCA9ICggZGVmaW5lZCggJDEgKSA/ICQxIDogJDIgKTsKKyAgICAgICAgcHVzaCggQGRlcHMsICRkZXAgKTsKKyAgICB9OyAjIGZvcmVhY2ggJGkKKworICAgIHJldHVybiBAZGVwczsKKworfTsgIyBzdWIgZ2V0X2RlcHNfbGRkCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBbm90aGVyIExpbnV4KiBPUyB2ZXJzaW9uIG9mIGdldF9kZXBzKCkgcGFyc2VzIG91dHB1dCBvZiByZWFkZWxmOgorIworIyAkIHJlYWRlbGYgLWQgZXhwb3J0cy9saW5fMzJlL2xpYi9saWJvbXAuc28KKyMKKyMgRHluYW1pYyBzZWdtZW50IGF0IG9mZnNldCAweDg3MDA4IGNvbnRhaW5zIDI0IGVudHJpZXM6CisjICAgVGFnICAgICAgICBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUvVmFsdWUKKyMgIDB4MDAwMDAwMDAwMDAwMDAwMSAoTkVFREVEKSAgICAgICAgICAgICBTaGFyZWQgbGlicmFyeTogW2xpYmMuc28uNl0KKyMgIDB4MDAwMDAwMDAwMDAwMDAwMSAoTkVFREVEKSAgICAgICAgICAgICBTaGFyZWQgbGlicmFyeTogW2xpYmRsLnNvLjJdCisjICAweDAwMDAwMDAwMDAwMDAwMDEgKE5FRURFRCkgICAgICAgICAgICAgU2hhcmVkIGxpYnJhcnk6IFtsaWJwdGhyZWFkLnNvLjBdCisjICAweDAwMDAwMDAwMDAwMDAwMGUgKFNPTkFNRSkgICAgICAgICAgICAgTGlicmFyeSBzb25hbWU6IFtsaWJvbXAuc29dCisjICAweDAwMDAwMDAwMDAwMDAwMGQgKEZJTkkpICAgICAgICAgICAgICAgMHg1MWNhYQorIyAgMHgwMDAwMDAwMDAwMDAwMDA0IChIQVNIKSAgICAgICAgICAgICAgIDB4MTU4CisjICAweDAwMDAwMDAwMDAwMDAwMDUgKFNUUlRBQikgICAgICAgICAgICAgMHg5MzUwCisjICAuLi4KKyMKKyMgTm90ZTogSW4gY29udHJhc3QgdG8gbGRkLCByZWFkbGVmIHNob3dzIG9ubHkgZGlyZWN0IGRlcGVuZGVuY2llcy4KKyMKK3N1YiBnZXRfZGVwc19yZWFkZWxmKCQpIHsKKworICAgIG15ICRmaWxlID0gc2hpZnQgKCBAXyApOworICAgIG15ICR0b29sOworICAgIG15IEBidWxrOworICAgIG15IEBkZXBzOworCisgICAgaWYoJHRhcmdldF9hcmNoIGVxICJtaWMiKSB7CisgICAgICAgICR0b29sID0gIng4Nl82NC1rMW9tLWxpbnV4LXJlYWRlbGYiOworICAgIH0gZWxzZSB7CisgICAgICAgICR0b29sID0gInJlYWRlbGYiOworICAgIH0KKworICAgICMgRm9yY2UgdGhlIHJlYWRlbGYgY2FsbCB0byBiZSBpbiBFbmdsaXNoLiBGb3IgZXhhbXBsZSwgd2hlbiByZWFkZWxmCisgICAgIyBpcyBjYWxsZWQgb24gYSBmcmVuY2ggbG9jYWxpemF0aW9uLCBpdCB3aWxsIGZpbmQgIkxpYnJhaXJpZSBwYXJ0YWdlZXMiCisgICAgIyBpbnN0ZWFkIG9mIHNoYXJlZCBsaWJyYXJ5CisgICAgJEVOVnsgTEFORyB9ID0gIkMiOworCisgICAgZXhlY3V0ZSggWyAkdG9vbCwgIi1kIiwgJGZpbGUgXSwgLXN0ZG91dCA9PiBcQGJ1bGsgKTsKKyAgICBkZWJ1ZyggQGJ1bGssICIoZW9mKSIgKTsKKworICAgIG15ICRpID0gMDsKKyAgICAjIFBhcnNlIGhlYWRlci4KKyAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17XlxzKiR9ICkKKyAgICAgICAgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICArKyAkaTsKKyAgICBpZiAoICRpID09IEBidWxrIC0gMSBhbmQgJGJ1bGtbICRpIF0gPX4gbXteVGhlcmUgaXMgbm8gZHluYW1pYyBzZWN0aW9uIGluIHRoaXMgZmlsZVwuXHMqJH0gKSB7CisgICAgICAgICMgVGhpcyBpcyBub3QgZHluYW1pYyBleGVjdXRhYmxlID0+IG5vIGRlcGVuZGVuY2llcy4KKyAgICAgICAgcmV0dXJuIEBkZXBzOworICAgIH07ICMgaWYKKyAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17XkR5bmFtaWMgKD86c2VnbWVudHxzZWN0aW9uKSBhdCBvZmZzZXQgMHhbMC05YS1mXSsgY29udGFpbnMgXGQrIGVudHJpZXM6XHMqJH0gKQorICAgICAgICBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOworICAgICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteXHMqVGFnXHMrVHlwZVxzK05hbWUvVmFsdWVccyokfSApCisgICAgICAgIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7CisgICAgKysgJGk7CisgICAgIyBQYXJzZSBib2R5LgorICAgIHdoaWxlICggJGkgPCBAYnVsayApIHsKKyAgICAgICAgbXkgJGxpbmUgPSAkYnVsa1sgJGkgXTsKKyAgICAgICAgaWYgKCAkbGluZSAhfiBte15ccyoweFswLTlhLWZdK1xzK1woKFtfQS1aMC05XSspXClccysoLiopXHMqJH1pICkgeworICAgICAgICAgICAgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBteSAoICR0eXBlLCAkdmFsdWUgKSA9ICggJDEsICQyICk7CisgICAgICAgIGlmICggJHR5cGUgZXEgIk5FRURFRCIgKSB7CisgICAgICAgICAgICBpZiAoICR2YWx1ZSAhfiBte1xBU2hhcmVkIGxpYnJhcnk6IFxbKC4qKVxdXHp9ICkgeworICAgICAgICAgICAgICAgIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICBteSAkZGVwID0gJDE7CisgICAgICAgICAgICBwdXNoKCBAZGVwcywgJGRlcCApOworICAgICAgICB9OyAjIGlmCisgICAgICAgICsrICRpOworICAgIH07ICMgZm9yZWFjaCAkaQorCisgICAgcmV0dXJuIEBkZXBzOworCit9OyAjIHN1YiBnZXRfZGVwc19yZWFkZWxmCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBPUyBYKiB2ZXJzaW9uIG9mIGdldF9kZXBzKCkgcGFyc2VzIG91dHB1dCBvZiBvdG9vbDoKKyMKKyMgJCBvdG9vbCAtTCBsaWJuYW1lLmR5bGliCisjIGV4cG9ydHMvbWFjXzMyL2xpYi50aGluL2xpYm9tcC5keWxpYjoKKyMgICAgICAgIGxpYm9tcC5keWxpYiAoY29tcGF0aWJpbGl0eSB2ZXJzaW9uIDUuMC4wLCBjdXJyZW50IHZlcnNpb24gNS4wLjApCisjICAgICAgICAvdXNyL2xpYi9saWJTeXN0ZW0uQi5keWxpYiAoY29tcGF0aWJpbGl0eSB2ZXJzaW9uIDEuMC4wLCBjdXJyZW50IHZlcnNpb24gODguMS4zKQorIworc3ViIGdldF9kZXBzX290b29sKCQpIHsKKworICAgIG15ICRmaWxlID0gc2hpZnQgKCBAXyApOworICAgIG15ICRuYW1lID0gZ2V0X2ZpbGUoICRmaWxlICk7CisgICAgbXkgJHRvb2wgPSAib3Rvb2wiOworICAgIG15IEBidWxrOworICAgIG15IEBkZXBzOworCisgICAgaWYgKCAkdGFyZ2V0X2FyY2ggZXEgIjMyZSIgKSB7CisgICAgICAgICMgT24gb2xkZXIgKFRpZ2VyKSBzeXN0ZW1zIG90b29sIGRvZXMgbm90IHJlY29nbml6ZSA2NC1iaXQgYmluYXJpZXMsIHNvIHRyeSB0byBsb2NhdGUKKyAgICAgICAgIyBvdG9vbDY0LgorICAgICAgICBteSAkcGF0aCA9IHdoaWNoKCAib3Rvb2w2NCIgKTsKKyAgICAgICAgaWYgKCBkZWZpbmVkICggJHBhdGggKSApIHsKKyAgICAgICAgICAgICR0b29sID0gIm90b29sNjQiOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorCisgICAgZXhlY3V0ZSggWyAkdG9vbCwgIi1MIiwgJGZpbGUgXSwgLXN0ZG91dCA9PiBcQGJ1bGsgKTsKKyAgICBkZWJ1ZyggQGJ1bGssICIoZW9mKSIgKTsKKworICAgIG15ICRpID0gMDsKKyAgICAjIFBhcnNlIHRoZSBmaXJzdCBvbmUgb3IgdHdvIGxpbmVzIHNlcGFyYXRlbHkuCisgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte15cUSRmaWxlXEU6JH0gKQorICAgICAgICBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOworICAgICsrICRpOworICAgIGlmICggJG5hbWUgPX4gbXtcLmR5bGliXHp9ICkgeworICAgICAgICAjIEFkZGVkICJAcnBhdGgvIiBlbmFibGVzIGR5bmFtaWMgbG9hZCBvZiB0aGUgbGlicmFyeSBkZXNpZ25hdGVkIGF0IGxpbmsgdGltZS4KKyAgICAgICAgJG5hbWUgPSAnQHJwYXRoLycgLiAkbmFtZTsKKyAgICAgICAgIyBJbiBjYXNlIG9mIGR5bmFtaWMgbGlicmFyeSBvdG9vbCBwcmludCB0aGUgbGlicmFyeSBpdHNlbGYgYXMgYSBkZXBlbmRlbnQgbGlicmFyeS4KKyAgICAgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte15ccytcUSRuYW1lXEVccytcKGNvbXBhdGliaWxpdHkgdmVyc2lvbi4qXCkkfSApCisgICAgICAgICAgICBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOworICAgICAgICArKyAkaTsKKyAgICB9OyAjIGlmCisKKyAgICAjIFRoZW4gcGFyc2UgdGhlIHJlc3QuCisgICAgd2hpbGUgKCAkaSA8IEBidWxrICkgeworICAgICAgICBteSAkbGluZSA9ICRidWxrWyAkaSBdOworICAgICAgICBpZiAoICRsaW5lICF+IG0vXlxzKiguKilccytcKGNvbXBhdGliaWxpdHkgdmVyc2lvblxzLipcKSQvICkgeworICAgICAgICAgICAgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBteSAoICRkZXAgKSA9ICggJDEgKTsKKyAgICAgICAgcHVzaCggQGRlcHMsICRkZXAgKTsKKyAgICAgICAgKysgJGk7CisgICAgfTsgIyB3aGlsZQorCisgICAgcmV0dXJuIEBkZXBzOworCit9OyAjIHN1YiBnZXRfZGVwc19vdG9vbAorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgV2luZG93cyogT1MgdmVyc2lvbiBvZiBnZXRfZGVwcygpIHBhcnNlcyBvdXRwdXQgb2YgbGluazoKKyMKKyMgPiBsaW5rIC1kdW1wIC1kZXBlbmRlbnRzIGxpYm5hbWUuZGxsCisjIE1pY3Jvc29mdCAoUikgQ09GRi9QRSBEdW1wZXIgVmVyc2lvbiA4LjAwLjQwMzEwLjM5CisjIENvcHlyaWdodCAoQykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgRHVtcCBvZiBmaWxlIFM6XFByb2plY3RzLk9NUFx1c2Vyc1xvbWFseXNoZVxvbXBcbGlib21wXGV4cG9ydHNcd2luXzY0XGxpYlxsaWJvbXBtZC5kbGwKKyMgRmlsZSBUeXBlOiBETEwKKyMgICBJbWFnZSBoYXMgdGhlIGZvbGxvd2luZyBkZXBlbmRlbmNpZXM6CisjICAgICBLRVJORUwzMi5kbGwKKyMgICBTdW1tYXJ5CisjICAgICAgICAgQzAwMCAuZGF0YQorIyAgICAgICAgIDYwMDAgLnBkYXRhCisjICAgICAgICAxODAwMCAucmRhdGEKKyMgICAgICAgIC4uLgorIworIyA+IGxpbmsgLWR1bXAgLWRpcmVjdGl2ZXMgbGlibmFtZS5saWIKKyMgTWljcm9zb2Z0IChSKSBDT0ZGL1BFIER1bXBlciBWZXJzaW9uIDguMDAuNDAzMTAuMzkKKyMgQ29weXJpZ2h0IChDKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBEdW1wIG9mIGZpbGUgUzpcUHJvamVjdHMuT01QXHVzZXJzXG9tYWx5c2hlXG9tcFxsaWJvbXBcZXhwb3J0c1x3aW5fMzJlXGxpYlxsaWJpbXA1bXQubGliCisjIEZpbGUgVHlwZTogTElCUkFSWQorIyAgIExpbmtlciBEaXJlY3RpdmVzCisjICAgLS0tLS0tLS0tLS0tLS0tLS0KKyMgICAtZGVmYXVsdGxpYjoidXVpZC5saWIiCisjICAgLWRlZmF1bHRsaWI6InV1aWQubGliIgorIyAgIC4uLi4uCisjICAgU3VtbWFyeQorIyAgICAgICAzMjUwIC5ic3MKKyMgICAgICAgM0ZCQyAuZGF0YQorIyAgICAgICAgIDM0IC5kYXRhMQorIyAgICAgICAuLi4uCitzdWIgZ2V0X2RlcHNfbGluaygkKSB7CisKKyAgICBteSAoICRsaWIgKSA9IEBfOworICAgIG15ICR0b29sID0gImxpbmsiOworICAgIG15IEBidWxrOworICAgIG15IEBkZXBzOworCisgICAgbXkgJGV4dCA9IGxjKCBnZXRfZXh0KCAkbGliICkgKTsKKyAgICBpZiAoICRleHQgIX4gbXtcQVwuKD86bGlifGRsbHxleGUpXHp9aSApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIkluY29ycmVjdCBmaWxlIGlzIHNwZWNpZmllZDogYCRsaWInOyBvbmx5IGBsaWInLCBgZGxsJyBvciBgZXhlJyBmaWxlIGV4cGVjdGVkIiApOworICAgIH07ICMgaWYKKworICAgIGV4ZWN1dGUoCisgICAgICAgIFsgJHRvb2wsICIvZHVtcCIsICggJGV4dCBlcSAiLmxpYiIgPyAiL2RpcmVjdGl2ZXMiIDogIi9kZXBlbmRlbnRzIiApLCAkbGliIF0sCisgICAgICAgIC1zdGRvdXQgPT4gXEBidWxrCisgICAgKTsKKworICAgIGRlYnVnKCBAYnVsaywgIihlb2YpIiApOworCisgICAgbXkgJGkgPSAwOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteTWljcm9zb2Z0IFwoUlwpIENPRkZcL1BFIER1bXBlciBWZXJzaW9uLiokfSApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteQ29weXJpZ2h0IFwoQ1wpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvblwuLiokfSApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteXHMqJH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteXHMqJH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteRHVtcCBvZiBmaWxlXHNcUSRsaWJcRSR9ICAgICAgICAgICAgICAgICAgICApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteXHMqJH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteRmlsZSBUeXBlOlxzKC4qKSR9ICAgICAgICAgICAgICAgICAgICAgICAgICApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteXHMqJH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7ICsrICRpOworCisgICAgaWYgKCAkZXh0IGVxICIubGliIiApIHsKKworICAgICAgICBteSAlZGVwczsKKyAgICAgICAgd2hpbGUgKCAkaSA8IEBidWxrICkgeworICAgICAgICAgICAgbXkgJGxpbmUgPSAkYnVsa1sgJGkgXTsKKyAgICAgICAgICAgIGlmICggMCApIHsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccypbLS9dZGVmYXVsdGxpYlw6KC4qKVxzKiR9aSApIHsKKyAgICAgICAgICAgICAgICBteSAkZGVwID0gJDE7CisgICAgICAgICAgICAgICAgIyBOb3JtYWxpemUgbGlicmFyeSBuYW1lOgorICAgICAgICAgICAgICAgICRkZXAgPSBsYyggJDEgKTsgICAgICAgICAgICAgICMgQ29udmVydCB0byBsb3dlciBjYXNlLgorICAgICAgICAgICAgICAgICRkZXAgPX4gc3tcQSIoLiopIlx6fXskMX07ICAgICMgRHJvcCBzdXJyb3VuZGluZyBxdW90ZXMgKGlmIGFueSkuCisgICAgICAgICAgICAgICAgJGRlcCA9fiBze1wubGliXHp9e307ICAgICAgICAgIyBEcm9wIC5saWIgc3VmZml4IChpZiBhbnkpLgorICAgICAgICAgICAgICAgICRkZXBzeyAkZGVwIH0gPSAxOworICAgICAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKkxpbmtlciBEaXJlY3RpdmVzXHMqJH0gKSB7CisgICAgICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqLStccyokfSApIHsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyovYWx0ZXJuYXRlbmFtZVw6LiokfSApIHsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyokfSApIHsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyovRkFJTElGTUlTTUFUQ0hcOi4qJH0gKSB7CisgICAgICAgICAgICAgICAgIyBUaGlzIGRpcmVjdGl2ZSBpcyBwcm9kdWNlZCBvbmx5IGJ5IF9NU0NfVkVSPTE2MDAKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccypTdW1tYXJ5XHMqJH0gKSB7CisgICAgICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICsrICRpOworICAgICAgICB9ICMgd2hpbGUKKyAgICAgICAgQGRlcHMgPSBrZXlzKCAlZGVwcyApOworCisgICAgfSBlbHNlIHsKKworICAgICAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17XHMqSW1hZ2UgaGFzIHRoZSBmb2xsb3dpbmcgZGVwZW5kZW5jaWVzXDokfSApCisgICAgICAgICAgICBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOworICAgICAgICArKyAkaTsKKyAgICAgICAgd2hpbGUgKCAkaSA8IEBidWxrICkgeworICAgICAgICAgICAgbXkgJGxpbmUgPSAkYnVsa1sgJGkgXTsKKyAgICAgICAgICAgIGlmICggMCApIHsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyokfSApIHsKKyAgICAgICAgICAgICAgICAjIElnbm9yZSBlbXB0eSBsaW5lcy4KKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyooLipcLmRsbCkkfWkgKSB7CisgICAgICAgICAgICAgICAgbXkgJGRlcCA9IGxjKCAkMSApOworICAgICAgICAgICAgICAgIHB1c2goIEBkZXBzLCAkZGVwICk7CisgICAgICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqU3VtbWFyeSR9ICkgeworICAgICAgICAgICAgICAgIGxhc3Q7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICArKyAkaTsKKyAgICAgICAgfTsgIyB3aGlsZQorCisgICAgfTsgIyBpZgorCisgICAgcmV0dXJuIEBkZXBzOworCit9OyAjIHN1YiBnZXRfZGVwc19saW5rCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNYWluLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFBhcnNlIGNvbW1hbmQgbGluZS4KK215ICRleHBlY3RlZDsKK215ICRiYXJlOworR2V0b3B0OjpMb25nOjpDb25maWd1cmUoICJwZXJtdXRlIiApOworZ2V0X29wdGlvbnMoCisgICAgIm9zPXMiICAgICAgID0+IFwkdGFyZ2V0X29zLAorICAgICJhcmNoPXMiICAgICA9PiBcJHRhcmdldF9hcmNoLAorICAgICJiYXJlIiAgICAgICA9PiBcJGJhcmUsCisgICAgImV4cGVjdGVkPXMiID0+IFwkZXhwZWN0ZWQsCispOworbXkgQGV4cGVjdGVkOworaWYgKCBkZWZpbmVkKCAkZXhwZWN0ZWQgKSApIHsKKyAgICBpZiAoICRleHBlY3RlZCBuZSAibm9uZSIgKSB7CisgICAgICAgIEBleHBlY3RlZCA9IHNvcnQoIHNwbGl0KCAiLCIsICRleHBlY3RlZCApICk7CisgICAgICAgIGlmICggJHRhcmdldF9vcyBlcSAid2luIiApIHsKKyAgICAgICAgICAgIEBleHBlY3RlZCA9IG1hcCggbGMoICRfICksIEBleHBlY3RlZCApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorfTsgIyBpZgoraWYgKCBAQVJHViA8IDEgKSB7CisgICAgY21kbGluZV9lcnJvciggIlNwZWNpZnkgYSBsaWJyYXJ5IG5hbWUgdG8gY2hlY2sgZm9yIGRlcGVuZGVuY2llcyIgKTsKK307ICMgaWYKK2lmICggQEFSR1YgPiAxICkgeworICAgIGNtZGxpbmVfZXJyb3IoICJUb28gbWFueSBhcmd1bWVudHMiICk7Cit9OyAjIGlmCitteSAkbGliID0gc2hpZnQoIEBBUkdWICk7CitpZiAoIG5vdCAtZSAkbGliICl7CisgICAgcnVudGltZV9lcnJvciggIlNwZWNpZmllZCBmaWxlIGRvZXMgbm90IGV4aXN0OiBcIiRsaWJcIiIgKTsKK307ICMgaWYKKworIyBTZWxlY3QgYXBwcm9wcmlhdGUgZ2V0X2RlcHMgaW1wbGVtZW50YXRpb24uCitpZiAoIDAgKSB7Cit9IGVsc2lmICggJHRhcmdldF9vcyBlcSAibGluIiApIHsKKyAgICAqZ2V0X2RlcHMgPSBcKmdldF9kZXBzX3JlYWRlbGY7Cit9IGVsc2lmICggJHRhcmdldF9vcyBlcSAibWFjIiApIHsKKyAgICAqZ2V0X2RlcHMgPSBcKmdldF9kZXBzX290b29sOworfSBlbHNpZiAoICR0YXJnZXRfb3MgZXEgIndpbiIgKSB7CisgICAgKmdldF9kZXBzID0gXCpnZXRfZGVwc19saW5rOworfSBlbHNlIHsKKyAgICBydW50aW1lX2Vycm9yKCAiT1MgXCIkdGFyZ2V0X29zXCIgbm90IHN1cHBvcnRlZCIgKTsKK307ICMgaWYKKworIyBEbyB0aGUgd29yay4KK215IEBkZXBzID0gc29ydCggZ2V0X2RlcHMoICRsaWIgKSApOworaWYgKCAkYmFyZSApIHsKKyAgICBwcmludCggbWFwKCAiJF9cbiIsIEBkZXBzICkgKTsKK30gZWxzZSB7CisgICAgaW5mbyggIkRlcGVuZGVuY2llczoiLCBAZGVwcyA/IG1hcCggIiAgICAkXyIsIEBkZXBzICkgOiAiKG5vbmUpIiApOworfTsgIyBpZgoraWYgKCBkZWZpbmVkKCAkZXhwZWN0ZWQgKSApIHsKKyAgICBteSAlZGVwcyA9IG1hcCggKCAkXyA9PiAxICksIEBkZXBzICk7CisgICAgZm9yZWFjaCBteSAkZGVwICggQGV4cGVjdGVkICkgeworICAgICAgICBkZWxldGUoICRkZXBzeyAkZGVwIH0gKTsKKyAgICB9OyAjIGZvcmVhY2gKKyAgICBteSBAdW5leHBlY3RlZCA9IHNvcnQoIGtleXMoICVkZXBzICkgKTsKKyAgICBpZiAoIEB1bmV4cGVjdGVkICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiVW5leHBlY3RlZCBkZXBlbmRlbmNpZXM6IiwgbWFwKCAiICAgICRfIiwgQHVuZXhwZWN0ZWQgKSApOworICAgIH07ICMgaWYKK307ICMgaWYKKworZXhpdCggMCApOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworQjxjaGVjay1kZXBlbmRzLnBsPiAtLSBDaGVjayBkZXBlbmRlbmNpZXMgZm9yIGEgc3BlY2lmaWVkIGxpYnJhcnkuCisKKz1oZWFkMSBTWU5PUFNJUworCitCPGNoZWNrLWRlcGVuZHMucGw+IEk8T1BUSU9OUz4uLi4gSTxsaWJyYXJ5PgorCis9aGVhZDEgREVTQ1JJUFRJT04KKworQzxjaGVjay1kZXBlbmRzLnBsPiBmaW5kcyBkaXJlY3QgZGVwZW5kZW5jaWVzIGZvciBhIHNwZWNpZmllZCBsaWJyYXJ5LiBMaXN0IG9mIGFjdHVhbCBkZXBlbmRlbmNpZXMKK2lzIHNvcnRlZCBhbHBoYWJldGljYWxseSBhbmQgcHJpbnRlZC4gSWYgbGlzdCBvZiBleHBlY3RlZCBkZXBlbmRlbmNpZXMgaXMgc3BlY2lmaWVkLCB0aGUgc2NyaXB0cworY2hlY2tzIHRoZSBsaWJyYXJ5IGhhcyBvbmx5IGFsbG93ZWQgZGVwZW5kZW5jaWVzLiBJbiBjYXNlIG9mIG5vdCBleHBlY3RlZCBkZXBuZGVuY2llcyB0aGUgc2NyaXB0Citpc3N1ZXMgZXJyb3IgbWVzc2FnZSBhbmQgZXhpdHMgd2l0aCBub24temVybyBjb2RlLgorCitMaW51eCogT1MgYW5kIE9TIFgqOiBUaGUgc2NyaXB0IGZpbmRzIGRlcGVuZGVuY2llcyBvbmx5IGZvciBkeW1hbWljIGxpYnJhcmllcy4gV2luZG93cyogT1M6IFRoZSBzY3JpcHQKK2ZpbmRzIGRlcGVuZGVuY2llcyBmb3IgZWl0aGVyIHN0YXRpYyBvciBkeW1hbWljIGxpYnJhcmllcy4KKworVGhlIHNjcmlwdCB1c2VzIGV4dGVybmFsIHRvb2xzLiBPbiBMaW51eCogT1MsIGl0IHJ1bnMgRjxyZWFkZWxmPiwgb24gT1MgWCogLS0gRjxvdG9vbD4gKG9yIEY8b3Rvb2w2ND4pLAorb24gV2luZG93cyogT1MgLS0gRjxsaW5rPi4KKworT24gV2luZG93cyogT1MgZGVwZW5kZW5jaWVzIGFyZSBwcmludGVkIGluIGxvd2VyIGNhc2UsIGNhc2Ugb2YgZXhwZWN0ZWQgZGVwZW5kZW5jaWVzIGlnbm9yZWQuCisKKz1oZWFkMSBPUFRJT05TCisKKz1vdmVyCisKKz1pdGVtIEI8LS1iYXJlPgorCitEbyBub3QgdXNlIGZhbmN5IGZvcm1hdHRpbmc7IHByb2R1Y2UgcGxhaW4sIGJhcmUgb3V0cHV0OiBqdXN0IGEgbGlzdCBvZiBsaWJyYXJpZXMsCithIGxpYnJhcnkgcGVyIGxpbmUuCisKKz1pdGVtIEI8LS1leHBlY3RlZD0+STxsaXN0PgorCitJPGxpc3Q+IGlzIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGV4cGVjdGVkIGRlcGVuZGVuY2llcyAob3IgQzxub25lPikuCitJZiBDPC0tZXhwZWN0ZWQ+IG9wdGlvbiBzcGVjaWZpZWQsIEM8Y2hlY2stZGVwZW5kcy5wbD4gY2hlY2tzIHRoZSBzcGVjaWZpZWQgbGlicmFyeQoraGFzIG9ubHkgZXhwZWN0ZWQgZGVwZW5kZW5jaWVzLgorCis9aXRlbSBCPC0tb3M9Pkk8c3RyPgorCitTcGVjaWZ5IHRhcmdldCBPUyAodG9vbCB0byB1c2UpIG1hbnVhbGx5LgorVXNlZnVsIGZvciBjcm9zcy1idWlsZCwgd2hlbiBob3N0IE9TIGlzIG5vdCB0aGUgc2FtZSBhcyB0YXJnZXQgT1MuCitJPHN0cj4gc2hvdWxkIGJlIGVpdGhlciBDPGxpbj4sIEM8bWFjPiwgb3IgQzx3aW4+LgorCis9YmFjaworCis9aGVhZDIgU3RhbmRhcmQgT3B0aW9ucworCis9b3ZlcgorCis9aXRlbSBCPC0taGVscD4KKworUHJpbnQgc2hvcnQgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tZG9jPgorCis9aXRlbSBCPC0tbWFudWFsPgorCitQcmludCBmdWxsIGRvY3VtZW50YXRpb24gYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1xdWlldD4KKworRG8gbm90IG91dHB1dCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgorCis9aXRlbSBCPC0tdmVyc2lvbj4KKworUHJpbnQgdmVyc2lvbiBhbmQgZXhpdC4KKworPWJhY2sKKworPWhlYWQxIEFSR1VNRU5UUworCis9b3ZlcgorCis9aXRlbSBJPGxpYnJhcnk+CisKK0EgbmFtZSBvZiBsaWJyYXJ5IHRvIGZpbmQgb3IgY2hlY2sgZGVwZW5kZW5jaWVzLgorCis9YmFjaworCis9aGVhZDEgRVhBTVBMRVMKKworSnVzdCBwcmludCBsaWJyYXJ5IGRlcGVuZGVuY2llcyAoV2luZG93cyogT1MpOgorCisgICAgPiBjaGVjay1kZXBlbmRzLnBsIGV4cG9ydHMvd2luXzMyL2xpYi9saWJvbXBtZC5kbGwKKyAgICBjaGVjay1kZXBlbmRzLnBsOiAoaSkgRGVwZW5kZW5jaWVzOgorICAgIGNoZWNrLWRlcGVuZHMucGw6IChpKSAgICAga2VybmVsMzIuZGxsCisKK1ByaW50IGxpYnJhcnkgZGVwZW5kZW5jaWVzLCB1c2UgYmFyZSBvdXRwdXQgKExpbnV4KiBPUyk6CisKKyAgICAkIGNoZWNrLWRlcGVuZHMucGwgLS1iYXJlIGV4cG9ydHMvbGluXzMyZS9saWIvbGlib21wX2RiLnNvCisgICAgbGliYy5zby42CisgICAgbGliZGwuc28uMgorICAgIGxpYnB0aHJlYWQuc28uMAorCitDaGVjayB0aGUgbGlicmFyeSBkb2VzIG5vdCBoYXZlIGFueSBkZXBlbmRlbmNpZXMgKE9TIFgqKToKKworICAgICQgY2hlY2stZGVwZW5kcy5wbCAtLWV4cGVjdGVkPW5vbmUgZXhwb3J0cy9tYWNfMzIvbGliL2xpYm9tcC5keWxpYgorICAgIGNoZWNrLWRlcGVuZHMucGw6IChpKSBEZXBlbmRlbmNpZXM6CisgICAgY2hlY2stZGVwZW5kcy5wbDogKGkpICAgICAvdXNyL2xpYi9saWJTeXN0ZW0uQi5keWxpYgorICAgIGNoZWNrLWRlcGVuZHMucGw6ICh4KSBVbmV4cGVjdGVkIGRlcGVuZGVuY2llczoKKyAgICBjaGVjay1kZXBlbmRzLnBsOiAoeCkgICAgIC91c3IvbGliL2xpYlN5c3RlbS5CLmR5bGliCisgICAgJCBlY2hvICQ/CisgICAgMgorCis9Y3V0CisKKyMgZW5kIG9mIGZpbGUgIworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rvb2xzL2NoZWNrLWV4ZWNzdGFjay5wbCBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvY2hlY2stZXhlY3N0YWNrLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNmMjQ3NDIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rvb2xzL2NoZWNrLWV4ZWNzdGFjay5wbApAQCAtMCwwICsxLDE0NiBAQAorIyEvdXNyL2Jpbi9wZXJsCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIEZpbmRCaW47Cit1c2UgbGliICIkRmluZEJpbjo6QmluL2xpYiI7CisKK3VzZSB0b29sczsKKworb3VyICRWRVJTSU9OID0gIjAuMDAyIjsKK215ICR0YXJnZXRfYXJjaDsKKworc3ViIGV4ZWNzdGFjaygkKSB7CisgICAgbXkgKCAkZmlsZSApID0gQF87CisgICAgbXkgQG91dHB1dDsKKyAgICBteSBAc3RhY2s7CisgICAgbXkgJHRvb2w7CisgICAgaWYoJHRhcmdldF9hcmNoIGVxICJtaWMiKSB7CisgICAgICAgICR0b29sID0gIng4Nl82NC1rMW9tLWxpbnV4LXJlYWRlbGYiOworICAgIH0gZWxzZSB7CisgICAgICAgICR0b29sID0gInJlYWRlbGYiOworICAgIH0KKyAgICBleGVjdXRlKCBbICR0b29sLCAiLWwiLCAiLVciLCAkZmlsZSBdLCAtc3Rkb3V0ID0+IFxAb3V0cHV0ICk7CisgICAgQHN0YWNrID0gZ3JlcCggJF8gPX4gbXtcQVxzKig/OkdOVV8pP1NUQUNLXHMrfSwgQG91dHB1dCApOworICAgIGlmICggbm90IEBzdGFjayApIHsKKyAgICAgICAgIyBJbnRlcnByZXQgbWlzc2VkICJTVEFDSyIgbGluZSBhcyBlcnJvci4KKyAgICAgICAgcnVudGltZV9lcnJvciggIiRmaWxlOiBObyBzdGFjayBzZWdtZW50IGZvdW5kOyBsb29rcyBsaWtlIHN0YWNrIHdvdWxkIGJlIGV4ZWN1dGFibGUuIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIEBzdGFjayA+IDEgKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkZmlsZTogTW9yZSB0aGFuIG9uZSBzdGFjayBzZWdtZW50IGZvdW5kLiIsICJyZWFkZWxmIG91dHB1dDoiLCBAb3V0cHV0LCAiKGVvZikiICk7CisgICAgfTsgIyBpZgorICAgICMgVHlwaWNhbCBzdGFjayBsaW5lcyBhcmU6CisgICAgIyBMaW51eCogT1MgSUEtMzIgYXJjaGl0ZWN0dXJlOgorICAgICMgICAgR05VX1NUQUNLICAgICAgMHgwMDAwMDAgMHgwMDAwMDAwMCAweDAwMDAwMDAwIDB4MDAwMDAgMHgwMDAwMCBSV0UgMHg0CisgICAgIyBMaW51eCogT1MgSW50ZWwoUikgNjQ6CisgICAgIyAgICBHTlVfU1RBQ0sgICAgICAweDAwMDAwMCAweDAwMDAwMDAwMDAwMDAwMDAgMHgwMDAwMDAwMDAwMDAwMDAwIDB4MDAwMDAwIDB4MDAwMDAwIFJXRSAweDgKKyAgICBpZiAoICRzdGFja1sgMCBdICF+IG17XEFccyooPzpHTlVfKT9TVEFDSyg/OlxzKzB4WzAtOWEtZl0rKXs1fVxzKyhbUiBdW1cgXVtFIF0pXHMrMHhbMC05YS1mXStccypcen0gKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkZmlsZTogQ2Fubm90IHBhcnNlIHN0YWNrIHNlZ21lbnQgbGluZToiLCAiPj4+ICRzdGFja1sgMCBdIiApOworICAgIH07ICMgaWYKKyAgICBteSAkYXR0cnMgPSAkMTsKKyAgICBpZiAoICRhdHRycyA9fiBte0V9ICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJGZpbGU6IFN0YWNrIGlzIGV4ZWN1dGFibGUiICk7CisgICAgfTsgIyBpZgorfTsgIyBzdWIgZXhlY3N0YWNrCisKK2dldF9vcHRpb25zKAorICAgICJhcmNoPXMiID0+IFwkdGFyZ2V0X2FyY2gsCispOworCitmb3JlYWNoIG15ICRmaWxlICggQEFSR1YgKSB7CisgICAgZXhlY3N0YWNrKCAkZmlsZSApOworfTsgIyBmb3JlYWNoICRmaWxlCisKK2V4aXQoIDAgKTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK0I8Y2hlY2stZXhlY3N0YWNrLnBsPiAtLSBDaGVjayB3aGV0aGVyIHN0YWNrIGlzIGV4ZWN1dGFibGUsIGlzc3VlIGFuIGVycm9yIGlmIHNvLgorCis9aGVhZDEgU1lOT1BTSVMKKworQjxjaGVjay1leGVjc3RhY2sucGw+IEk8b3B0aWlvbj4uLi4gSTxmaWxlPi4uLgorCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhlIHNjcmlwdCBjaGVja3Mgd2hldGhlciBzdGFjayBvZiBzcGVjaWZpZWQgZXhlY3V0YWJsZSBmaWxlLCBhbmQgaXNzdWVzIGVycm9yIGlmIHN0YWNrIGlzCitleGVjdXRhYmxlLiBJZiBzdGFjayBpcyBub3QgZXhlY3V0YWJsZSwgdGhlIHNjcmlwdCBleGl0cyBzaWxlbnRseSB3aXRoIHplcm8gZXhpdCBjb2RlLgorCitUaGUgc2NyaXB0IHJ1bnMgQzxyZWFkZWxmPiB1dGlsaXR5IHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCBzcGVjaWZpZWQgZXhlY3V0YWJsZSBmaWxlLiBTbywgdGhlCitzY3JpcHQgZmFpbHMgaWYgQzxyZWFkZWxmPiBpcyBub3QgYXZhaWxhYmxlLiBFZmZlY3RpdmVseSBpdCBtZWFucyB0aGUgc2NyaXB0IHdvcmtzIG9ubHkgb24gTGludXgqIE9TCisoYW5kLCBwcm9iYWJseSwgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlKS4KKworPWhlYWQxIE9QVElPTlMKKworPW92ZXIKKworPWl0ZW0gU3RhbmRhcmQgT3B0aW9ucworCis9b3ZlcgorCis9aXRlbSBCPC0tZG9jPgorCis9aXRlbSBCPC0tbWFudWFsPgorCitQcmludCBmdWxsIGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLWhlbHA+CisKK1ByaW50IHNob3J0IGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXVzYWdlPgorCitQcmludCB2ZXJ5IHNob3J0IHVzYWdlIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS12ZXJib3NlPgorCitEbyBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgorCis9aXRlbSBCPC0tdmVyc2lvbj4KKworUHJpbnQgcHJvZ3JhbSB2ZXJzaW9uIGFuZCBleGl0LgorCis9aXRlbSBCPC0tcXVpZXQ+CisKK1dvcmsgcXVpZXQsIGRvIG5vdCBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgorCis9YmFjaworCis9YmFjaworCis9aGVhZDEgQVJHVU1FTlRTCisKKz1vdmVyCisKKz1pdGVtIEk8ZmlsZT4KKworQSBuYW1lIG9mIGV4ZWN1dGFibGUgb3Igc2hhcmVkIG9iamVjdCB0byBjaGVjay4gTXVsdGlwbGUgZmlsZXMgbWF5IGJlIHNwZWNpZmllZC4KKworPWJhY2sKKworPWhlYWQxIEVYQU1QTEVTCisKK0NoZWNrIGxpYm9tcC5zbyBsaWJyYXJ5OgorCisgICAgJCBjaGVjay1leGVjc3RhY2sucGwgbGlib21wLnNvCisKKz1jdXQKKworIyBlbmQgb2YgZmlsZSAjCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdG9vbHMvY2hlY2staW5zdHJ1Y3Rpb24tc2V0LnBsIGIvZmluYWwvcnVudGltZS90b29scy9jaGVjay1pbnN0cnVjdGlvbi1zZXQucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjUwNWU0OAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvY2hlY2staW5zdHJ1Y3Rpb24tc2V0LnBsCkBAIC0wLDAgKzEsMzIxIEBACisjIS91c3IvYmluL3BlcmwKKworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgRmluZEJpbjsKK3VzZSBsaWIgIiRGaW5kQmluOjpCaW4vbGliIjsKKwordXNlIHRvb2xzOworCitvdXIgJFZFUlNJT04gPSAiMC4wMDQiOworbXkgJHRhcmdldF9vczsKK215ICR0YXJnZXRfYXJjaDsKK215ICR0YXJnZXRfbWljX2FyY2g7CisKK215ICRoZXggPSBxcntbMC05YS1mXX1pOyAgICAjIGhleCBkaWdpdC4KKworIyBtaWMtc3BlY2lmaWMgZGV0YWlscy4KKworc3ViIGJhZF9taWNfZm10KCQpIHsKKyAgICAjIEJlZm9yZSB3ZSBhbGxvd2VkIGJvdGggZWxmNjQteDg2LTY0LWZyZWVic2QgYW5kIGVsZi1sMW9tLWZyZWVic2QuCisgICAgIyBOb3cgdGhlIGZpcnN0IG9uZSBpcyBvYnNvbGV0ZSwgb25seSBlbGY2NC1sMW9tLWZyZWVic2QgaXMgYWxsb3dlZC4KKyAgICBteSAoICRmbXQgKSA9IEBfOworICAgIGlmICggMCApIHsKKyAgICB9IGVsc2lmICggIiR0YXJnZXRfbWljX2FyY2giIGVxICJrbmYiICkgeworCSAgICByZXR1cm4gJGZtdCAhfiBte1xBZWxmNjQtbDFvbT9cen07CisgICAgfSBlbHNpZiAoICIkdGFyZ2V0X21pY19hcmNoIiBlcSAia25jIiApIHsKKwkgICAgcmV0dXJuICRmbXQgIX4gbXtcQWVsZjY0LWsxb20/XHp9OworCX0gZWxzZSB7CisJICAgIHJldHVybiAxOworCX07Cit9OyAjIHN1YiBiYWRfbWljX2ZtdAorCisjIFVuZGVzaXJlZCBpbnN0cnVjdGlvbnMgZm9yIG1pYzogYWxsIHg4NyBhbmQgc29tZSBvdGhlci4KKyMgQUM6IFNpbmNlIGNvbXBpbGVyIDIwMTAtMDYtMzAgeDg3IGluc3RydWN0aW9ucyBhcmUgc3VwcG9ydGVkLCByZW1vdmVkIHRoZSBjaGVjayBvZiB4ODcuCitteSAkbWljX2JhZF9yZTsKK3N1YiBiYWRfbWljX2luc3RyKCQkKSB7CisgICAgbXkgKCAkaW5zdHIsICRhcmdzICkgPSBAXzsKKyAgICBpZiAoICIkdGFyZ2V0X21pY19hcmNoIiBlcSAia25jIiApIHsKKwkjIHdvcmthcm91bmQgb2YgYmFkIGNvZGUgZ2VuZXJhdGlvbiBvbiBLTkYgTGludXgqIE9TOgorCXJldHVybiAoIGRlZmluZWQoICRpbnN0ciApIGFuZCAkaW5zdHIgPX4gJG1pY19iYWRfcmUgKTsKKyAgICB9IGVsc2UgeworCXJldHVybiAoIGRlZmluZWQoICRpbnN0ciApIGFuZCAkaW5zdHIgPX4gJG1pY19iYWRfcmUgb3IgZGVmaW5lZCggJGFyZ3MgKSBhbmQgJGFyZ3MgPX4gbXt4bW19aSApOworICAgIH0KK307ICMgc3ViIGJhZF9taWNfaW5zdHIKKworIyBsaW5fMzItc3BlY2lmaWMgZGV0YWlscy4KKworc3ViIGJhZF9pYTMyX2ZtdCgkKSB7CisgICAgbXkgKCAkZm10ICkgPSBAXzsKKyAgICByZXR1cm4gJGZtdCAhfiBte1xBZWxmMzItaTM4Nlx6fTsKK307ICMgc3ViIGJhZF9pYTMyX2ZtdAorCitteSBAc3NlMiA9CisgICAgcXd7CisgICAgICAgIG1vdmFwZCBtb3Z1cGQgbW92aHBkIG1vdmxwZCBtb3Ztc2twZCBtb3ZzZAorICAgICAgICBhZGRwZCBhZGRzZCBzdWJwZCBzdWJzZCBtdWxwZCBtdWxzZCBkaXZwZCBkaXZzZCBzcXJ0cGQgc3FydHNkIG1heHBkIG1heHNkIG1pbnBkIG1pbnNkCisgICAgICAgIGFuZHBkIGFuZG5wZCBvcnBkIHhvcnBkCisgICAgICAgIGNtcHBkIGNtcHNkIGNvbWlzZCB1Y29taXNkCisgICAgICAgIHNodWZwZCB1bnBja2hwZCB1bnBja2xwZAorICAgICAgICBjdnRwZDJwaSBjdnR0cGQycGkgY3Z0cGkycGQgY3Z0cGQyZHEgY3Z0dHBkMmRxIGN2dGRxMnBkIGN2dHBzMnBkIGN2dHBkMnBzIGN2dHNzMnNkIGN2dHNkMnNzCisgICAgICAgIGN2dHNkMnNpIGN2dHRzZDJzaSBjdnRzaTJzZCBjdnRkcTJwcyBjdnRwczJkcSBjdnR0cHMyZHEgbW92ZHFhIG1vdmRxdSBtb3ZxMmRxIG1vdmRxMnEKKyAgICAgICAgcG11bHVkcSBwYWRkcSBwc3VicSBwc2h1Zmx3IHBzaHVmaHcgcHNodWZkIHBzbGxkcSBwc3JsZHEgcHVucGNraHFkcSBwdW5wY2tscWRxIGNsZmx1c2gKKyAgICAgICAgbGZlbmNlIG1mZW5jZSBtYXNrbW92ZHF1IG1vdm50cGQgbW92bnRkcSBtb3ZudGkKKyAgICB9OworbXkgQHNzZTMgPQorICAgIHF3eworICAgICAgICBmaXN0dHAgbGRkcXUgYWRkc3VicHMgYWRkc3VicGQgaGFkZHBzIGhzdWJwcyBoYWRkcGQgaHN1YnBkIG1vdnNoZHVwIG1vdnNsZHVwIG1vdmRkdXAgbW9uaXRvcgorICAgICAgICBtd2FpdAorICAgIH07CitteSBAc3NzZTMgPQorICAgIHF3eworICAgICAgICBwaGFkZHcgcGhhZGRzdyBwaGFkZGQgcGhzdWJ3IHBoc3Vic3cgcGhzdWJkIHBhYnNiIHBhYnN3IHBhYnNkIHBtYWRkdWJzdyBwbXVsaHJzdyBwc2h1ZmIKKyAgICAgICAgcHNpZ25iIHBzaWdudyBwc2lnbmQgcGFsaWducgorICAgIH07CitteSBAc3NlNCA9CisgICAgKAorICAgICAgICAjIFNTRTQuMQorICAgICAgICBxd3sKKyAgICAgICAgICAgIHBtdWxsZCBwbXVsZHEgZHBwZCBkcHBzIG1vdm50ZHFhIGJsZW5kcGQgYmxlbmRwcyBibGVuZHZwZCBibGVuZHZwcyBwYmxlbmR2YiBwYmxlbmR3IHBtaW51dworICAgICAgICAgICAgcG1pbnVkIHBtaW5zYiBwbWluc2QgcG1heHV3IHBtYXh1ZCBwbWF4c2IgcG1heHNkIHJvdW5kcHMgcm91bmRwZCByb3VuZHNzIHJvdW5kc2QgZXh0cmFjdHBzCisgICAgICAgICAgICBpbnNlcnRwcyBwaW5zcmIgcGluc3JkIHBpbnNycSBwZXh0cmIgcGV4dHJ3IHBleHRyZCBwZXh0cnEgcG1vdnN4YncgcG1vdnp4YncgcG1vdnN4YmQKKyAgICAgICAgICAgIHBtb3Z6eGJkIHBtb3ZzeHdkIHBtb3Z6eHdkIHBtb3ZzeGJxIHBtb3Z6eGJxIHBtb3ZzeHdxIHBtb3Z6eHdxIHBtb3ZzeGRxIHBtb3Z6eGRxIG1wc2FkYncKKyAgICAgICAgICAgIHBobWlucG9zdXcgcHRlc3QgcGNtcGVxcSBwYWNrdXNkdworICAgICAgICB9LAorICAgICAgICAjIFNTRTQuMgorICAgICAgICBxd3sKKyAgICAgICAgICAgIHBjbXBlc3RyaSBwY21wZXN0cm0gcGNtcGlzdHJpIHBjbXBpc3RybSBwY21wZ3RxIGNyYzMyIHBvcGNudAorICAgICAgICB9CisgICAgKTsKKworIyBVbmRlc2lyZWQgaW5zdHJ1Y3Rpb25zIGZvciBJQS0zMiBhcmNoaXRlY3R1cmU6IFBlbnRpdW0gNCAoU1NFMikgYW5kIG5ld2VyLgorIyBUT0RPOiBJdCB3b3VsZCBiZSBtdWNoIG1vcmUgcmVsaWFibGUgdG8gbGlzdCAqYWxsb3dlZCogaW5zdHJ1Y3Rpb25zIHJhdGhlciB0aGFuIGxpc3QgdW5kZXNpcmVkCisjIGluc3RydWN0aW9ucy4gSW4gc3VjaCBhIGNhc2UgdGhlIGxpc3Qgd2lsbCBiZSBzdGFibGUgYW5kIG5vdCByZXF1aXJlIHVwZGF0ZSB3aGVuIFNTRTUgaXMgcmVsZWFzZWQuCitteSBAaWEzMl9iYWRfbGlzdCA9ICggQHNzZTIsIEBzc2UzLCBAc3NzZTMsIEBzc2U0ICk7CisKK215ICRpYTMyX2JhZF9yZSA9IHFye0B7WyAiXig/OiIgLiBqb2luKCAifCIsIEBpYTMyX2JhZF9saXN0ICkgLiAiKSIgXX19aTsKKworc3ViIGJhZF9pYTMyX2luc3RyKCQkKSB7CisgICAgbXkgKCAkaW5zdHIsICRhcmdzICkgPSBAXzsKKyAgICByZXR1cm4gKCBkZWZpbmVkKCAkaW5zdHIgKSBhbmQgJGluc3RyID1+ICRpYTMyX2JhZF9yZSApOworfTsgIyBzdWIgYmFkX2lhMzJfaW5zdHIKKworc3ViIGNoZWNrX2ZpbGUoJDskJCkgeworCisgICAgbXkgKCAkZmlsZSwgJHNob3dfaW5zdHJ1Y3Rpb25zLCAkbWF4X2luc3RydWN0aW9ucyApID0gQF87CisgICAgbXkgQGJ1bGs7CisKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkbWF4X2luc3RydWN0aW9ucyApICkgeworICAgICAgICAkbWF4X2luc3RydWN0aW9ucyA9IDEwMDsKKyAgICB9OyAjIGlmCisKKyAgICBleGVjdXRlKCBbICJ4ODZfNjQtazFvbS1saW51eC1vYmpkdW1wIiwgIi1kIiwgJGZpbGUgXSwgLXN0ZG91dCA9PiBcQGJ1bGsgKTsKKworICAgIG15ICRuID0gMDsKKyAgICBteSAkZXJyb3JzID0gMDsKKyAgICBteSAkY3VycmVudF9mdW5jICA9ICIiOyAgICAjIE5hbWUgb2YgY3VycmVudCBmdWN0aW9uLgorICAgIG15ICRyZXBvcnRlZF9mdW5jID0gIiI7ICAgICMgbmFtZSBvZiBsYXN0IHJlcG9ydGVkIGZ1bmN0aW9uLgorICAgIGZvcmVhY2ggbXkgJGxpbmUgKCBAYnVsayApIHsKKyAgICAgICAgKysgJG47CisgICAgICAgIGlmICggMCApIHsKKyAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKiR9ICkgeworICAgICAgICAgICAgIyBFbXB0eSBsaW5lLgorICAgICAgICAgICAgIyBJZ25vcmUuCisgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15JbiBhcmNoaXZlICguKj8pOlxzKiR9ICkgeworICAgICAgICAgICAgIyBJbiBhcmNoaXZlIGxpYm9tcC5hOgorICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteKD86Lio/KTpccypmaWxlIGZvcm1hdCAoLio/KVxzKiR9ICkgeworICAgICAgICAgICAgIyBsaWJvbXAuc286ICAgICBmaWxlIGZvcm1hdCBlbGY2NC14ODYtNjQtZnJlZWJzZAorICAgICAgICAgICAgIyBrbXBfZnRuX2NkZWNsLm86ICAgICBmaWxlIGZvcm1hdCBlbGY2NC14ODYtNjQKKyAgICAgICAgICAgIG15ICRmbXQgPSAkMTsKKyAgICAgICAgICAgIGlmICggYmFkX2ZtdCggJGZtdCApICkgeworICAgICAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICJJbnZhbGlkIGZpbGUgZm9ybWF0OiAkZm10LiIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XkRpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gKC4qPyk6XHMqJH0gKSB7CisgICAgICAgICAgICAjIERpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnBsdDoKKyAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XiRoZXgrIDwoW14+XSspPjpccyokfSApIHsKKyAgICAgICAgICAgICMgMDAwMDAwMDAwMDAxN2U5OCA8X19rbXBfc3RyX2Zvcm1hdEBwbHQtMHgxMD46CisgICAgICAgICAgICAkY3VycmVudF9mdW5jID0gJDE7CisgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccypcLnszfVxzKiR9ICkgeworICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqKCRoZXgrKTpccysoJGhleCRoZXgoPzogJGhleCRoZXgpKilccysoPzpsb2NrXHMrfHJleFsuYS16XSpccyspPyhbXiBdKykoPzpccysoW14jXSs/KSk/XHMqKD86I3wkKX0gKSB7CisgICAgICAgICAgICAjICAgMTdlOTg6ICAgICAgIGZmIDM1IGZhIDdkIDI2IDAwICAgICAgIHB1c2hxICAweDI2N2RmYSglcmlwKSAgICAgICAgIyAyN2ZjOTggPF9HTE9CQUxfT0ZGU0VUX1RBQkxFPgorICAgICAgICAgICAgbXkgKCAkYWRkciwgJGR1bXAsICRpbnN0ciwgJGFyZ3MgKSA9ICggJDEsICQyLCAkMywgJDQgKTsKKyAgICAgICAgICAgICMgQ2hlY2sgdGhpcyBpcyBub3QgYSBiYWQgaW5zdHJ1Y3Rpb24gYW5kIHhtbSByZWdpc3RlcnMgYXJlIG5vdCB1c2VkLgorICAgICAgICAgICAgaWYgKCBiYWRfaW5zdHIoICRpbnN0ciwgJGFyZ3MgKSApIHsKKyAgICAgICAgICAgICAgICBpZiAoICRlcnJvcnMgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgd2FybmluZyggIkludmFsaWQgaW5zdHJ1Y3Rpb25zIGZvdW5kIGluIGAkZmlsZSc6IiApOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICBpZiAoICRjdXJyZW50X2Z1bmMgbmUgJHJlcG9ydGVkX2Z1bmMgKSB7CisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoICIgICAgJGN1cnJlbnRfZnVuYyIgKTsKKyAgICAgICAgICAgICAgICAgICAgJHJlcG9ydGVkX2Z1bmMgPSAkY3VycmVudF9mdW5jOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICArKyAkZXJyb3JzOworICAgICAgICAgICAgICAgIGlmICggJHNob3dfaW5zdHJ1Y3Rpb25zICkgeworICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCAiICAgICAgICAkbGluZSIgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgaWYgKCAkZXJyb3JzID49ICRtYXhfaW5zdHJ1Y3Rpb25zICkgeworICAgICAgICAgICAgICAgICAgICBpbmZvKCAiJGVycm9ycyBpbnZhbGlkIGluc3RydWN0aW9ucyBmb3VuZDsgc2Nhbm5pbmcgc3RvcHBlZC4iICk7CisgICAgICAgICAgICAgICAgICAgIGxhc3Q7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcnVudGltZV9lcnJvciggIkVycm9yIHBhcnNpbmcgb2JqZHVtcCBvdXRwdXQgbGluZSAkbjpcbj4+Pj4gJGxpbmVcbiIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaCAkbGluZQorCisgICAgcmV0dXJuICRlcnJvcnM7CisKK307ICMgc3ViIGNoZWNrX2ZpbGUKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFBhcnNlIGNvbW1hbmQgbGluZS4KK215ICRtYXhfaW5zdHJ1Y3Rpb25zOworbXkgJHNob3dfaW5zdHJ1Y3Rpb25zOworZ2V0X29wdGlvbnMoCisgICAgIm9zPXMiICAgICAgICAgICAgICAgPT4gXCR0YXJnZXRfb3MsCisgICAgImFyY2g9cyIgICAgICAgICAgICAgPT4gXCR0YXJnZXRfYXJjaCwKKyAgICAibWljLWFyY2g9cyIgICAgICAgICA9PiBcJHRhcmdldF9taWNfYXJjaCwKKyAgICAibWF4LWluc3RydWN0aW9ucz1pIiA9PiBcJG1heF9pbnN0cnVjdGlvbnMsCisgICAgInNob3ctaW5zdHJ1Y3Rpb25zISIgPT4gXCRzaG93X2luc3RydWN0aW9ucywKKyk7CitteSAkdGFyZ2V0X3BsYXRmb3JtID0gJHRhcmdldF9vcyAuICJfIiAuICR0YXJnZXRfYXJjaDsKK2lmICggIiR0YXJnZXRfb3MiIGVxICJsaW4iIGFuZCAiJHRhcmdldF9taWNfYXJjaCIgZXEgImtuZiIgKSB7CisgICAgJG1pY19iYWRfcmUgPSBxcnteKD86cGF1c2V8W3NsbV1mZW5jZXxzY2F0dGVyfGdhdGhlcnxjbXB4Y2hnMTZifGNsZXZpY3RbMTJdKX1pOworfSBlbHNlIHsKKyAgICAkbWljX2JhZF9yZSA9IHFye14oPzpwYXVzZXxbc2xtXWZlbmNlfHNjYXR0ZXJ8Z2F0aGVyfGNtb3Z8Y21weGNoZzE2YnxjbGV2aWN0WzEyXSl9aTsKK307CitpZiAoIDAgKSB7Cit9IGVsc2lmICggJHRhcmdldF9wbGF0Zm9ybSBlcSAibGluX21pYyIgKSB7CisgICAgKmJhZF9pbnN0ciA9IFwqYmFkX21pY19pbnN0cjsKKyAgICAqYmFkX2ZtdCAgID0gXCpiYWRfbWljX2ZtdDsKK30gZWxzaWYgKCAkdGFyZ2V0X3BsYXRmb3JtIGVxICJsaW5fMzIiICkgeworICAgICpiYWRfaW5zdHIgPSBcKmJhZF9pYTMyX2luc3RyOworICAgICpiYWRfZm10ICAgPSBcKmJhZF9pYTMyX2ZtdDsKK30gZWxzZSB7CisgICAgcnVudGltZV9lcnJvciggIk9ubHkgd29ya3Mgb24gbGluXzMyIGFuZCBsaW5fbWljIHBsYXRmb3Jtcy4iICk7Cit9OyAjIGlmCisKKyMgRG8gdGhlIHdvcmsuCitteSAkcmMgPSAwOworaWYgKCBub3QgQEFSR1YgKSB7CisgICAgaW5mbyggIk5vIGFyZ3VtZW50cyBzcGVjaWZpZWQgLS0gbm90aGluZyB0byBkby4iICk7Cit9IGVsc2UgeworICAgIGZvcmVhY2ggbXkgJGFyZyAoIEBBUkdWICkgeworICAgICAgICBteSAkZXJycyA9IGNoZWNrX2ZpbGUoICRhcmcsICRzaG93X2luc3RydWN0aW9ucywgJG1heF9pbnN0cnVjdGlvbnMgKTsKKyAgICAgICAgaWYgKCAkZXJycyA+IDAgKSB7CisgICAgICAgICAgICAkcmMgPSAzOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoICRhcmcKK307ICMgaWYKKworZXhpdCggJHJjICk7CisKK19fRU5EX18KKworPXBvZAorCis9aGVhZDEgTkFNRQorCitCPGNoZWNrLWluc3RydWN0aW9uLXNldC5wbD4gLS0gTWFrZSBzdXJlIGJpbmFyeSBmaWxlIGRvZXMgbm90IGNvbnRhaW4gdW5kZXNpcmVkIGluc3RydWN0aW9ucy4KKworPWhlYWQxIFNZTk9QU0lTCisKK0I8Y2hlY2staW5zdHJ1Y3Rpb25zLnBsPiBJPG9wdGlvbj4uLi4gSTxmaWxlPi4uLgorCis9aGVhZDEgT1BUSU9OUworCis9b3ZlcgorCis9aXRlbSBCPC0tYXJjaGl0ZWN0dXJlPT5JPGFyY2g+CisKK1NwZWNpZnkgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KKworPWl0ZW0gQjwtLW1heC1pbnN0cnVjdGlvbnM9Pkk8bnVtYmVyPgorCitTdG9wIHNjYW5uaW5nIGlmIEk8bnVtYmVyPiBpbnZhbGlkIGluc3RydWN0aW9ucyBmb3VuZC4gMTAwIGJ5IGRlZmF1bHQuCisKKz1pdGVtIEI8LS1vcz0+STxvcz4KKworU3BlY2lmeSB0YXJnZXQgT1MuCisKKz1pdGVtIEI8LS0+W0I8bm8tPl1CPHNob3ctaW5zdHJ1Y3Rpb25zPgorCitTaG93IGludmFsaWQgaW5zdHJ1Y3Rpb25zIGZvdW5kIGluIHRoZSBmaWxlLiBCdSBkZWZhdWx0LCBpbnN0cnVjdGlvbnMgYXJlIG5vdCBzaG93bi4KKworPWl0ZW0gU3RhbmRhcmQgT3B0aW9ucworCis9b3ZlcgorCis9aXRlbSBCPC0tZG9jPgorCis9aXRlbSBCPC0tbWFudWFsPgorCitQcmludCBmdWxsIGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLWhlbHA+CisKK1ByaW50IHNob3J0IGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXVzYWdlPgorCitQcmludCB2ZXJ5IHNob3J0IHVzYWdlIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS12ZXJib3NlPgorCitEbyBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgorCis9aXRlbSBCPC0tdmVyc2lvbj4KKworUHJpbnQgcHJvZ3JhbSB2ZXJzaW9uIGFuZCBleGl0LgorCis9aXRlbSBCPC0tcXVpZXQ+CisKK1dvcmsgcXVpZXQsIGRvIG5vdCBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgorCis9YmFjaworCis9YmFjaworCis9aGVhZDEgQVJHVU1FTlRTCisKKz1vdmVyCisKKz1pdGVtIEk8ZmlsZT4KKworRmlsZSAob2JqZWN0IGZpbGUgb3IgbGlicmFyeSwgZWl0aGVyIHN0YXRpYyBvciBkeW5hbWljKSB0byBjaGVjay4KKworPWJhY2sKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoZSBzY3JpcHQgcnVucyBGPG9iamR1bXA+IHV0aWxpdHkgdG8gZ2V0IGRpc2Fzc2VtYmxlciBsaXN0aW5nIGFuZCBjaGVja3MgdGhlIGZpbGUgZG9lcyBub3QgY29udGFpbgordW53YW50ZWQgaW5zdHJ1Y3Rpb25zLgorCitDdXJyZW50bHkgdGhlIHNjcmlwdCB3b3JrcyBvbmx5IGZvcjoKKworPW92ZXIKKworPWl0ZW0gQzxsaW5fbWljPgorCitJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgdGFyZ2V0IE9TLiBVbmRlc2lyZWQgdW5zdHJ1Y3Rpb25zIGFyZTogYWxsIHg4NyBpbnN0cnVjdGlvbnMgYW5kIHNvbWUgb3RoZXJzLgorCis9aXRlbSBDPGxpbl8zMj4KKworVW5kZXNpcmVkIGluc3RydWN0aW9ucyBhcmUgaW5zdHJ1Y3Rpb25zIG5vdCB2YWxpZCBmb3IgUGVudGl1bSAzIHByb2Nlc3NvciAoU1NFMiBhbmQgbmV3ZXIpLgorCis9YmFjaworCis9Y3V0CisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdG9vbHMvZ2VuZXJhdGUtZGVmLnBsIGIvZmluYWwvcnVudGltZS90b29scy9nZW5lcmF0ZS1kZWYucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2MyYjBmMwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvZ2VuZXJhdGUtZGVmLnBsCkBAIC0wLDAgKzEsMzIxIEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyBTb21lIHByYWdtYXMuCit1c2Ugc3RyaWN0OyAgICAgICAgICAjIFJlc3RyaWN0IHVuc2FmZSBjb25zdHJ1Y3RzLgordXNlIHdhcm5pbmdzOyAgICAgICAgIyBFbmFibGUgYWxsIHdhcm5pbmdzLgorCit1c2UgRmluZEJpbjsKK3VzZSBsaWIgIiRGaW5kQmluOjpCaW4vbGliIjsKKwordXNlIHRvb2xzOworCitvdXIgJFZFUlNJT04gPSAiMC4wMDQiOworCisjCisjIFN1YnJvdXRpbmVzLgorIworCitzdWIgcGFyc2VfaW5wdXQoJFwlKSB7CisKKyAgICBteSAoICRpbnB1dCwgJGRlZnMgKSA9IEBfOworICAgIG15IEBidWxrID0gcmVhZF9maWxlKCAkaW5wdXQgKTsKKyAgICBteSAlZW50cmllczsKKyAgICBteSAlb3JkaW5hbHM7CisgICAgbXkgQGRpcnM7CisgICAgbXkgJHZhbHVlID0gMTsKKworICAgIG15ICRlcnJvciA9CisgICAgICAgIHN1YiB7CisgICAgICAgICAgICBteSAoICRtc2csICRsLCAkbGluZSApID0gQF87CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKAorICAgICAgICAgICAgICAgICJFcnJvciBwYXJzaW5nIGZpbGUgXCIkaW5wdXRcIiBsaW5lICRsOlxuIiAuCisgICAgICAgICAgICAgICAgIiAgICAkbGluZSIgLgorICAgICAgICAgICAgICAgICggJG1zZyA/ICRtc2cgLiAiXG4iIDogKCkgKQorICAgICAgICAgICAgKTsKKyAgICAgICAgfTsgIyBzdWIKKworICAgIG15ICRuID0gMDsgICAgIyBMaW5lIG51bWJlci4KKyAgICBmb3JlYWNoIG15ICRsaW5lICggQGJ1bGsgKSB7CisgICAgICAgICsrICRuOworICAgICAgICBpZiAoIDAgKSB7CisgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyooPzojfFxuKX0gKSB7CisgICAgICAgICAgICAjIEVtcHR5IGxpbmUgb3IgY29tbWVudC4gU2tpcCBpdC4KKyAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKiV9ICkgeworICAgICAgICAgICAgIyBBIGRpcmVjdGl2ZS4KKyAgICAgICAgICAgIGlmICggMCAgKSB7CisgICAgICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqJVxzKmlmKG4pP2RlZlxzKyhbQS1aYS16MC05X10rKVxzKig/OiN8XG4pfSApIHsKKyAgICAgICAgICAgICAgICBteSAoICRuZWdhdGlvbiwgJG5hbWUgKSA9ICggJDEsICQyICk7CisgICAgICAgICAgICAgICAgbXkgJGRpciA9IHsgbiA9PiAkbiwgbGluZSA9PiAkbGluZSwgbmFtZSA9PiAkbmFtZSwgdmFsdWUgPT4gJHZhbHVlIH07CisgICAgICAgICAgICAgICAgcHVzaCggQGRpcnMsICRkaXIgKTsKKyAgICAgICAgICAgICAgICAkdmFsdWUgPSAoICR2YWx1ZSBhbmQgKCAkbmVnYXRpb24geG9yICRkZWZzLT57ICRuYW1lIH0gKSApOworICAgICAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKiVccyplbmRpZlxzKig/OiN8XG4pfSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIG5vdCBAZGlycyApIHsKKyAgICAgICAgICAgICAgICAgICAgJGVycm9yLT4oICJPcnBoYW4gJWVuZGlmIGRpcmVjdGl2ZS4iLCAkbiwgJGxpbmUgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgbXkgJGRpciA9IHBvcCggQGRpcnMgKTsKKyAgICAgICAgICAgICAgICAkdmFsdWUgPSAkZGlyLT57IHZhbHVlIH07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRlcnJvci0+KCAiQmFkIGRpcmVjdGl2ZS4iLCAkbiwgJGxpbmUgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKigtKT9ccyooW0EtWmEtejAtOV9dKykoPzpccysoXGQrfERBVEEpKT9ccyooPzojfFxuKX0gKSB7CisgICAgICAgICAgICBteSAoICRvYnNvbGV0ZSwgJGVudHJ5LCAkb3JkaW5hbCApID0gKCAkMSwgJDIsICQzICk7CisgICAgICAgICAgICBpZiAoICR2YWx1ZSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIGV4aXN0cyggJGVudHJpZXN7ICRlbnRyeSB9ICkgKSB7CisgICAgICAgICAgICAgICAgICAgICRlcnJvci0+KCAiRW50cnkgXCIkZW50cnlcIiBoYXMgYWxyZWFkeSBiZWVuIHNwZWNpZmllZC4iLCAkbiwgJGxpbmUgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgJGVudHJpZXN7ICRlbnRyeSB9ID0geyBvcmRpbmFsID0+ICRvcmRpbmFsLCBvYnNvbGV0ZSA9PiBkZWZpbmVkKCAkb2Jzb2xldGUgKSB9OworICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCggJG9yZGluYWwgKSBhbmQgJG9yZGluYWwgbmUgIkRBVEEiICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoICRvcmRpbmFsID49IDEwMDAgYW5kICRlbnRyeSA9fiBte1xBW29rXW1wX30gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkZXJyb3ItPiggIk9yZGluYWwgb2YgdXNlci1jYWxsYWJsZSBlbnRyeSBtdXN0IGJlIDwgMTAwMCIsICRuLCAkbGluZSApOworICAgICAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgICAgIGlmICggJG9yZGluYWwgPj0gMTAwMCBhbmQgJG9yZGluYWwgPCAyMDAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgJGVycm9yLT4oICJPcmRpbmFscyBiZXR3ZWVuIDEwMDAgYW5kIDE5OTkgYXJlIHJlc2VydmVkLiIsICRuLCAkbGluZSApOworICAgICAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgICAgIGlmICggZXhpc3RzKCAkb3JkaW5hbHN7ICRvcmRpbmFsIH0gKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRlcnJvci0+KCAiT3JkaW5hbCAkb3JkaW5hbCBoYXMgYWxyZWFkeSBiZWVuIHVzZWQuIiwgJG4sICRsaW5lICk7CisgICAgICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICAgICAgJG9yZGluYWxzeyAkb3JkaW5hbCB9ID0gJGVudHJ5OworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRlcnJvci0+KCAiIiwgJG4sICRsaW5lICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2gKKworICAgIGlmICggQGRpcnMgKSB7CisgICAgICAgIG15ICRkaXIgPSBwb3AoIEBkaXJzICk7CisgICAgICAgICRlcnJvci0+KCAiVW50ZXJtaW5hdGVkICVpZiBkaXJlY2l2ZS4iLCAkZGlyLT57IG4gfSwgJGRpci0+eyBsaW5lIH0gKTsKKyAgICB9OyAjIHdoaWxlCisKKyAgICByZXR1cm4gJWVudHJpZXM7CisKK307ICMgc3ViIHBhcnNlX2lucHV0CisKK3N1YiBwcm9jZXNzKFwlKSB7CisKKyAgICBteSAoICRlbnRyaWVzICkgPSBAXzsKKworICAgIGZvcmVhY2ggbXkgJGVudHJ5ICgga2V5cyggJSRlbnRyaWVzICkgKSB7CisgICAgICAgIGlmICggbm90ICRlbnRyaWVzLT57ICRlbnRyeSB9LT57IG9ic29sZXRlIH0gKSB7CisgICAgICAgICAgICBteSAkb3JkaW5hbCA9ICRlbnRyaWVzLT57ICRlbnRyeSB9LT57IG9yZGluYWwgfTsKKyAgICAgICAgICAgIGlmICggJGVudHJ5ID1+IG17XEFbb2tdbXBffSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIG5vdCBkZWZpbmVkKCAkb3JkaW5hbCApIG9yICRvcmRpbmFsIGVxICJEQVRBIiApIHsKKyAgICAgICAgICAgICAgICAgICAgcnVudGltZV9lcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgZW50cnkgXCIkZW50cnlcIjogb3JkaW5hbCBudW1iZXIgaXMgbm90IHNwZWNpZmllZC4iCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgICRlbnRyaWVzLT57IHVjKCAkZW50cnkgKSB9ID0geyBvcmRpbmFsID0+IDEwMDAgKyAkb3JkaW5hbCB9OworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoCisKKyAgICByZXR1cm4gJSRlbnRyaWVzOworCit9OyAjIHN1YiBwcm9jZXNzCisKK3N1YiBnZW5lcmF0ZV9vdXRwdXQoXCUkKSB7CisKKyAgICBteSAoICRlbnRyaWVzLCAkb3V0cHV0ICkgPSBAXzsKKyAgICBteSAkYnVsazsKKworICAgICRidWxrID0gIkVYUE9SVFNcbiI7CisgICAgZm9yZWFjaCBteSAkZW50cnkgKCBzb3J0KCBrZXlzKCAlJGVudHJpZXMgKSApICkgeworICAgICAgICBpZiAoIG5vdCAkZW50cmllcy0+eyAkZW50cnkgfS0+eyBvYnNvbGV0ZSB9ICkgeworICAgICAgICAgICAgJGJ1bGsgLj0gc3ByaW50ZiggIiAgICAlLTQwcyAiLCAkZW50cnkgKTsKKyAgICAgICAgICAgIG15ICRvcmRpbmFsID0gJGVudHJpZXMtPnsgJGVudHJ5IH0tPnsgb3JkaW5hbCB9OworICAgICAgICAgICAgaWYgKCBkZWZpbmVkKCAkb3JkaW5hbCApICkgeworICAgICAgICAgICAgICAgIGlmICggJG9yZGluYWwgZXEgIkRBVEEiICkgeworICAgICAgICAgICAgICAgICAgICAkYnVsayAuPSAiREFUQSI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJGJ1bGsgLj0gIlxAIiAuICRvcmRpbmFsOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICRidWxrIC49ICJcbiI7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2gKKyAgICBpZiAoIGRlZmluZWQoICRvdXRwdXQgKSApIHsKKyAgICAgICAgd3JpdGVfZmlsZSggJG91dHB1dCwgXCRidWxrICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnQoICRidWxrICk7CisgICAgfTsgIyBpZgorCit9OyAjIHN1YiBnZW5lcmF0ZV9vdXB1dAorCisjCisjIFBhcnNlIGNvbW1hbmQgbGluZS4KKyMKKworbXkgJGlucHV0OyAgICMgVGhlIG5hbWUgb2YgaW5wdXQgZmlsZS4KK215ICRvdXRwdXQ7ICAjIFRoZSBuYW1lIG9mIG91dHB1dCBmaWxlLgorbXkgJWRlZnM7CisKK2dldF9vcHRpb25zKAorICAgICJvdXRwdXQ9cyIgICAgPT4gXCRvdXRwdXQsCisgICAgIkR8ZGVmaW5lPXMiICA9PgorICAgICAgICBzdWIgeworICAgICAgICAgICAgbXkgKCAkb3B0X25hbWUsICRvcHRfdmFsdWUgKSA9IEBfOworICAgICAgICAgICAgbXkgKCAkZGVmX25hbWUsICRkZWZfdmFsdWUgKTsKKyAgICAgICAgICAgIGlmICggJG9wdF92YWx1ZSA9fiBte1xBKC4qPyk9KC4qKVx6fSApIHsKKyAgICAgICAgICAgICAgICAoICRkZWZfbmFtZSwgJGRlZl92YWx1ZSApID0gKCAkMSwgJDIgKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKCAkZGVmX25hbWUsICRkZWZfdmFsdWUgKSA9ICggJG9wdF92YWx1ZSwgMSApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgJGRlZnN7ICRkZWZfbmFtZSB9ID0gJGRlZl92YWx1ZTsKKyAgICAgICAgfSwKKyk7CisKK2lmICggQEFSR1YgPT0gMCApIHsKKyAgICBjbWRsaW5lX2Vycm9yKCAiTm90IGVub3VnaCBhcmd1bWVudHMuIiApOworfTsgIyBpZgoraWYgKCBAQVJHViA+IDEgKSB7CisgICAgY21kbGluZV9lcnJvciggIlRvbyBtYW55IGFyZ3VtZW50cy4iICk7Cit9OyAjIGlmCiskaW5wdXQgPSBzaGlmdCggQEFSR1YgKTsKKworIworIyBXb3JrLgorIworCitteSAlZGF0YSA9IHBhcnNlX2lucHV0KCAkaW5wdXQsICVkZWZzICk7CislZGF0YSA9IHByb2Nlc3MoICVkYXRhICk7CitnZW5lcmF0ZV9vdXRwdXQoICVkYXRhLCAkb3V0cHV0ICk7CitleGl0KCAwICk7CisKK19fRU5EX18KKworIworIyBFbWJlZGRlZCBkb2N1bWVudGF0aW9uLgorIworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK0I8Z2VuZXJhdGUtZGVmLnBsPiAtLSBHZW5lcmF0ZSBkZWYgZmlsZSBmb3IgT3Blbk1QIFJUTC4KKworPWhlYWQxIFNZTk9QU0lTCisKK0I8Z2VuZXJhdGUtZGVmLnBsPiBJPE9QVElPTj4uLi4gSTxmaWxlPgorCis9aGVhZDEgT1BUSU9OUworCis9b3ZlcgorCis9aXRlbSBCPC0tZGVmaW5lPT5JPG5hbWU+Wz1JPHZhbHVlPl0KKworPWl0ZW0gQjwtRD4gSTxuYW1lPls9STx2YWx1ZT5dCisKK0RlZmluZSBzcGVjaWZpZWQgbmFtZS4gSWYgSTx2YWx1ZT4gaXMgb21pdHRlZCwgSTxuYW1lPiBpcyBkZWZpbmVkIHRvIDEuIElmIEk8dmFsdWU+IGlzIDAgb3IgZW1wdHksCituYW1lIGlzIEI8bm90PiBkZWZpbmVkLgorCis9aXRlbSBCPC0tb3V0cHV0PT5JPGZpbGU+CisKKz1pdGVtIEI8LW8+IEk8ZmlsZT4KKworU3BlY2lmeSBvdXRwdXQgZmlsZSBuYW1lLiBJZiBvcHRpb24gaXMgbm90IHByZXNlbnQsIHJlc3VsdCBpcyBwcmludGVkIHRvIHN0ZG91dC4KKworPWl0ZW0gQjwtLWRvYz4KKworPWl0ZW0gQjwtLW1hbnVhbD4KKworUHJpbnQgZnVsbCBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1oZWxwPgorCitQcmludCBzaG9ydCBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS11c2FnZT4KKworUHJpbnQgdmVyeSBzaG9ydCB1c2FnZSBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdmVyYm9zZT4KKworRG8gcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4KKworPWl0ZW0gQjwtLXZlcnNpb24+CisKK1ByaW50IHZlcnNpb24gYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1xdWlldD4KKworV29yayBxdWlldCwgZG8gbm90IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCisKKz1iYWNrCisKKz1oZWFkMSBBUkdVTUVOVFMKKworPW92ZXIKKworPWl0ZW0gSTxmaWxlPgorCitBIG5hbWUgb2YgaW5wdXQgZmlsZS4KKworPWJhY2sKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoZSBzY3JpcHQgcmVhZHMgaW5wdXQgZmlsZSwgcHJvY2VzcyBjb25kaXRpb25hbCBkaXJlY3RpdmVzLCBjaGVja3MgY29udGVudCBmb3IgY29uc2lzdGVuY3ksIGFuZAorZ2VuZXJhdGVzIG91cHRwdXQgZmlsZSBzdWl0YWJsZSBmb3IgbGlua2VyLgorCis9aGVhZDIgSW5wdXQgRmlsZSBGb3JtYXQKKworPW92ZXIKKworPWl0ZW0gQ29tbWVudHMKKworICAgICMgSXQncyBhIGNvbW1lbnQuCisKK0NvbW1lbnRzIHN0YXJ0IHdpdGggQzwjPiBzeW1ib2wgYW5kIGNvbnRpbnVlIHRvIHRoZSBlbmQgb2YgbGluZS4KKworPWl0ZW0gQ29uZGl0aW9uYWwgRGlyZWN0aXZlcworCisgICAgJWlmZGVmIG5hbWUKKyAgICAlaWZuZGVmIG5hbWUKKyAgICAlZW5kaWYKKworQSBwYXJ0IG9mIGZpbGUgc3Vycm91bmRlZCBieSBDPCVpZmRlZiBJPG5hbWU+PiBhbmQgQzwlZW5kaWY+IGRpcmVjdGl2ZXMgaXMgYSBjb25kaXRpb25hbCBwYXJ0IC0tIGl0CitoYXMgZWZmZWN0IG9ubHkgaWYgSTxuYW1lPiBpcyBkZWZpbmVkIGluIHRoZSBjb21tYW4gbGluZSBieSBCPC0tZGVmaW5lPiBvcHRpb24uIEM8JWlmbmRlZj4gaXMgYQorbmVnYXRlZCB2ZXJzaW9uIG9mIEM8JWlmZGVmPiAtLSBjb25kaXRpb25hbCBwYXJ0IGhhcyBhbiBlZmZlY3Qgb25seSBpZiBJPG5hbWU+IGlzIEI8bm90PiBkZWZpbmVkLgorCitDb25kaXRpb25hbCBwYXJ0cyBtYXkgYmUgbmVzdGVkLgorCis9aXRlbSBFeHBvcnQgRGVmaW5pdGlvbnMKKworICAgIHN5bWJvbAorICAgIHN5bWJvbCBvcmRpbmFsCisgICAgc3ltYm9sIERBVEEKKworU3ltYm9scyBzdGFydGluZyB3aXRoIEM8b21wXz4gb3IgQzxrbXBfPiBtdXN0IGhhdmUgb3JkaW5hbCBzcGVjaWZpZWQuIFRoZXkgYXJlIHN1YmplY3RzIGZvciBzcGVjaWFsCitwcm9jZXNzaW5nOiBlYWNoIHN5bWJvbCBnZW5lcmF0ZXMgdHdvIG91dHB1dCBsaW5lczogb3JpZ2luYWwgb25lIGFuZCB1cHBlciBjYXNlIHZlcnNpb24uIFRoZSBvcmRpbmFsCitudW1iZXIgb2YgdGhlIHNlY29uZCBpcyBvcmlnaW5hbCBvcmRpbmFsIGluY3JlYXNlZCBieSAxMDAwLgorCis9aXRlbSBPYnNvbGV0ZSBTeW1ib2xzCisKKyAgICAtIHN5bWJvbAorICAgIC0gc3ltYm9sIG9yZGluYWwKKyAgICAtIHN5bWJvbCBEQVRBCisKK09ic29sZXRlIHN5bWJvbHMgbG9vayBsaWtlIGV4cG9ydCBkZWZpbml0aW9ucyBwcmVmaXhlZCB3aXRoIG1pbnVzIHNpZ24uIE9ic29sZXRlIHN5bWJvbHMgZG8gbm90CithZmZlY3QgdGhlIG91dHB1dCwgYnV0IG9ic29sZXRlIHN5bWJvbHMgYW5kIHRoZWlyIG9yZGluYWxzIGNhbm5vdCBiZSAocmUpdXNlZCBpbiBleHBvcnQgZGVmaW5pdGlvbnMuCisKKz1iYWNrCisKKz1oZWFkMSBFWEFNUExFUworCisgICAgJCBnZW5lcmF0ZS1kZWYucGwgLUQgc3R1YiAtRCBVU0VfVENIRUNLPTAgLW8gbGliZ3VpZGUuZGVmIGRsbGV4cG9ydAorCis9Y3V0CisKKyMgZW5kIG9mIGZpbGUgIworCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rvb2xzL2xpYi9CdWlsZC5wbSBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbGliL0J1aWxkLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNjcxNTYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rvb2xzL2xpYi9CdWlsZC5wbQpAQCAtMCwwICsxLDI2NCBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworcGFja2FnZSBCdWlsZDsKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIEN3ZCBxd3t9OworCit1c2UgTGliT01QOwordXNlIHRvb2xzOwordXNlIFVuYW1lOwordXNlIFBsYXRmb3JtICI6dmFycyI7CisKK215ICRob3N0ID0gVW5hbWU6Omhvc3RfbmFtZSgpOworbXkgJHJvb3QgPSAkRU5WeyBMSUJPTVBfV09SSyAgICB9OworbXkgJHRtcCAgPSAkRU5WeyBMSUJPTVBfVE1QICAgICB9OworbXkgJG91dCAgPSAkRU5WeyBMSUJPTVBfRVhQT1JUUyB9OworCitteSBAam9iczsKK291ciAkc3RhcnQgPSB0aW1lKCk7CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSGVscGVyIGZ1bmN0aW9ucy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyB0c3RyIC0tIFRpbWUgc3RyaW5nLiBSZXR1cm5zIHN0cmluZyAieXl5eS1kZC1tbSBoaDptbTpzcyBVVEMiLgorc3ViIHRzdHIoOyQpIHsKKyAgICBteSAoICR0aW1lICkgPSBAXzsKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkdGltZSApICkgeworICAgICAgICAkdGltZSA9IHRpbWUoKTsKKyAgICB9OyAjIGlmCisgICAgbXkgKCAkc2VjLCAkbWluLCAkaG91ciwgJGRheSwgJG1vbnRoLCAkeWVhciApID0gZ210aW1lKCAkdGltZSApOworICAgICRtb250aCArPSAxOworICAgICR5ZWFyICArPSAxOTAwOworICAgIG15ICRzdHIgPSBzcHJpbnRmKCAiJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQgVVRDIiwgJHllYXIsICRtb250aCwgJGRheSwgJGhvdXIsICRtaW4sICRzZWMgKTsKKyAgICByZXR1cm4gJHN0cjsKK307ICMgc3ViIHRzdHIKKworIyBkc3RyIC0tIER1cmF0aW9uIHN0cmluZy4gUmV0dXJucyBzdHJpbmcgImhoOm1tOnNzIi4KK3N1YiBkc3RyKCQpIHsKKyAgICAjIEdldCB0aW1lIGluIHNlY29uZHMgYW5kIGZvcm1hdCBpdCBhcyB0aW1lIGluIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLgorICAgIG15ICggJHNlYyApID0gQF87CisgICAgbXkgKCAkaCwgJG0sICRzICk7CisgICAgJGggICA9IGludCggJHNlYyAvIDM2MDAgKTsKKyAgICAkc2VjID0gJHNlYyAtICRoICogMzYwMDsKKyAgICAkbSAgID0gaW50KCAkc2VjIC8gNjAgKTsKKyAgICAkc2VjID0gJHNlYyAtICRtICogNjA7CisgICAgJHMgICA9IGludCggJHNlYyApOworICAgICRzZWMgPSAkc2VjIC0gJHM7CisgICAgcmV0dXJuIHNwcmludGYoICIlMDJkOiUwMmQ6JTAyZCIsICRoLCAkbSwgJHMgKTsKK307ICMgc3ViIGRzdHIKKworIyByc3RyIC0tIFJlc3VsdCBzdHJpbmcuCitzdWIgcnN0cigkKSB7CisgICAgbXkgKCAkcmMgKSA9IEBfOworICAgIHJldHVybiAoICRyYyA9PSAwID8gIisrKyBTdWNjZXNzICsrKyIgOiAiLS0tIEZhaWx1cmUgLS0tIiApOworfTsgIyBzdWIgcnN0cgorCitzdWIgc2hvcnRlcigkOyQpIHsKKyAgICAjIFJldHVybiBzaG9ydGVyIHZhcmlhbnQgb2YgcGF0aCAtLSBlaXRoZXIgYWJzb2x1dGUgb3IgcmVsYXRpdmUuCisgICAgbXkgKCAkcGF0aCwgJGJhc2UgKSA9IEBfOworICAgIG15ICRhYnMgPSBhYnNfcGF0aCggJHBhdGggKTsKKyAgICBteSAkcmVsID0gcmVsX3BhdGgoICRwYXRoLCAkYmFzZSApOworICAgIGlmICggJHJlbCBlcSAiIiApIHsKKyAgICAgICAgJHJlbCA9ICIuIjsKKyAgICB9OyAjIGlmCisgICAgJHBhdGggPSAoIGxlbmd0aCggJHJlbCApIDwgbGVuZ3RoKCAkYWJzICkgPyAkcmVsIDogJGFicyApOworICAgIGlmICggJHRhcmdldF9vcyBlcSAid2luIiApIHsKKyAgICAgICAgJHBhdGggPX4gc3tcXH17L31nOworICAgIH07ICMgaWYKKyAgICByZXR1cm4gJHBhdGg7Cit9OyAjIHN1YiBzaG9ydGVyCisKK3N1YiB0ZWUoJCQpIHsKKworICAgIG15ICggJGFjdGlvbiwgJGZpbGUgKSA9IEBfOworICAgIG15ICRwaWQgPSAwOworCisgICAgbXkgJHNhdmVfc3Rkb3V0ID0gU3ltYm9sOjpnZW5zeW0oKTsKKyAgICBteSAkc2F2ZV9zdGRlcnIgPSBTeW1ib2w6OmdlbnN5bSgpOworCisgICAgIyAtLS0gcmVkaXJlY3Qgc3Rkb3V0IC0tLQorICAgIFNURE9VVC0+Zmx1c2goKTsKKyAgICAjIFNhdmUgc3Rkb3V0IGluICRzYXZlX3N0ZG91dC4KKyAgICBvcGVuKCAkc2F2ZV9zdGRvdXQsICI+JiIgLiBTVERPVVQtPmZpbGVubygpICkKKyAgICAgICAgb3IgZGllKCAiQ2Fubm90IGR1cCBmaWxlaGFuZGxlOiAkITsgc3RvcHBlZCIgKTsKKyAgICAjIFJlZGlyZWN0IHN0ZG91dCB0byB0ZWUgb3IgdG8gZmlsZS4KKyAgICBpZiAoICR0b29sczo6dmVyYm9zZSApIHsKKyAgICAgICAgJHBpZCA9IG9wZW4oIFNURE9VVCwgInwgdGVlIC1hIFwiJGZpbGVcIiIgKQorICAgICAgICAgICAgb3IgZGllICJDYW5ub3Qgb3BlbiBwaXBlIHRvIFwidGVlXCI6ICQhOyBzdG9wcGVkIjsKKyAgICB9IGVsc2UgeworICAgICAgICBvcGVuKCBTVERPVVQsICI+PiRmaWxlIiApCisgICAgICAgICAgICBvciBkaWUgIkNhbm5vdCBvcGVuIGZpbGUgXCIkZmlsZVwiIGZvciB3cml0aW5nOiAkITsgc3RvcHBlZCI7CisgICAgfTsgIyBpZgorCisgICAgIyAtLS0gcmVkaXJlY3Qgc3RkZXJyIC0tLQorICAgIFNUREVSUi0+Zmx1c2goKTsKKyAgICAjIFNhdmUgc3RkZXJyIGluICRzYXZlX3N0ZGVyci4KKyAgICBvcGVuKCAkc2F2ZV9zdGRlcnIsICI+JiIgLiBTVERFUlItPmZpbGVubygpICkKKyAgICAgICAgb3IgZGllKCAiQ2Fubm90IGR1cCBmaWxlaGFuZGxlOiAkITsgc3RvcHBlZCIgKTsKKyAgICAjIFJlZGlyZWN0IHN0ZGVyciB0byBzdGRvdXQuCisgICAgb3BlbiggU1RERVJSLCAiPiYiIC4gU1RET1VULT5maWxlbm8oKSApCisgICAgICAgIG9yIGRpZSggIkNhbm5vdCBkdXAgZmlsZWhhbmRsZTogJCE7IHN0b3BwZWQiICk7CisKKyAgICAjIFBlcmZvcm0gYWN0aW9ucy4KKyAgICAkYWN0aW9uLT4oKTsKKworICAgICMgLS0tIHJlc3RvcmUgc3RkZXJyIC0tLQorICAgIFNUREVSUi0+Zmx1c2goKTsKKyAgICAjIFJlc3RvcmUgc3RkZXJyIGZyb20gJHNhdmVfc3RkZXJyLgorICAgIG9wZW4oIFNUREVSUiwgIj4mIiAuICRzYXZlX3N0ZGVyci0+ZmlsZW5vKCkgKQorICAgICAgICBvciBkaWUoICJDYW5ub3QgZHVwIGZpbGVoYW5kbGU6ICQhOyBzdG9wcGVkIiApOworICAgICMgQ2xvc2UgJHNhdmVfc3RkZXJyLgorICAgICRzYXZlX3N0ZGVyci0+Y2xvc2UoKSBvciBkaWUgKCAiQ2Fubm90IGNsb3NlIGZpbGVoYW5kbGU6ICQhOyBzdG9wcGVkIiApOworCisgICAgIyAtLS0gcmVzdG9yZSBzdGRvdXQgLS0tCisgICAgU1RET1VULT5mbHVzaCgpOworICAgICMgUmVzdG9yZSBzdGRvdXQgZnJvbSAkc2F2ZV9zdGRvdXQuCisgICAgb3BlbiggU1RET1VULCAiPiYiIC4gJHNhdmVfc3Rkb3V0LT5maWxlbm8oKSApCisgICAgICAgIG9yIGRpZSggIkNhbm5vdCBkdXAgZmlsZWhhbmRsZTogJCE7IHN0b3BwZWQiICk7CisgICAgIyBDbG9zZSAkc2F2ZV9zdGRvdXQuCisgICAgJHNhdmVfc3Rkb3V0LT5jbG9zZSgpIG9yIGRpZSAoICJDYW5ub3QgY2xvc2UgZmlsZWhhbmRsZTogJCE7IHN0b3BwZWQiICk7CisKKyAgICAjIFdhaXQgZm9yIHRoZSBjaGlsZCB0ZWUgcHJvY2Vzcywgb3RoZXJ3aXNlIG91dHB1dCBvZiBtYWtlIGFuZCBidWlsZC5wbCBpbnRlcmxlYXZlcy4KKyAgICBpZiAoICRwaWQgIT0gMCApIHsKKyAgICAgICAgd2FpdHBpZCggJHBpZCwgMCApOworICAgIH07ICMgaWYKKworfTsgIyBzdWIgdGVlCisKK3N1YiBsb2dfaXQoJCRAKSB7CisgICAgbXkgKCAkdGl0bGUsICRmb3JtYXQsIEBhcmdzICkgPSBAXzsKKyAgICBteSAkbWVzc2FnZSAgPSBzcHJpbnRmKCAkZm9ybWF0LCBAYXJncyApOworICAgIG15ICRwcm9ncmVzcyA9IGNhdF9maWxlKCAkdG1wLCBzcHJpbnRmKCAiJXMtJXMubG9nIiwgJHRhcmdldF9wbGF0Zm9ybSwgVW5hbWU6Omhvc3RfbmFtZSgpICkgKTsKKyAgICBpZiAoICR0aXRsZSBuZSAiIiBhbmQgJG1lc3NhZ2UgbmUgIiIgKSB7CisgICAgICAgIG15ICRsaW5lID0gc3ByaW50ZiggIiUtMTVzIDogJXNcbiIsICR0aXRsZSwgJG1lc3NhZ2UgKTsKKyAgICAgICAgaW5mbyggJGxpbmUgKTsKKyAgICAgICAgd3JpdGVfZmlsZSggJHByb2dyZXNzLCB0c3RyKCkgLiAiOiAiIC4gJGxpbmUsIC1hcHBlbmQgPT4gMSApOworICAgIH0gZWxzZSB7CisgICAgICAgIHdyaXRlX2ZpbGUoICRwcm9ncmVzcywgIlxuIiwgLWFwcGVuZCA9PiAxICk7CisgICAgfTsgIyBpZgorfTsgIyBzdWIgbG9nX2l0CisKK3N1YiBwcm9ncmVzcygkJEApIHsKKyAgICBteSAoICR0aXRsZSwgJGZvcm1hdCwgQGFyZ3MgKSA9IEBfOworICAgIGxvZ19pdCggJHRpdGxlLCAkZm9ybWF0LCBAYXJncyApOworfTsgIyBzdWIgcHJvZ3Jlc3MKKworc3ViIHN1bW1hcnkoKSB7CisgICAgbXkgJHRvdGFsICAgPSBAam9iczsKKyAgICBteSAkc3VjY2VzcyA9IDA7CisgICAgbXkgJGZpbmlzaCA9IHRpbWUoKTsKKyAgICBmb3JlYWNoIG15ICRqb2IgKCBAam9icyApIHsKKyAgICAgICAgbXkgKCAkYnVpbGRfZGlyLCAkcmMgKSA9ICggJGpvYi0+eyBidWlsZF9kaXIgfSwgJGpvYi0+eyByYyB9ICk7CisgICAgICAgIHByb2dyZXNzKCByc3RyKCAkcmMgKSwgIiVzIiwgJGJ1aWxkX2RpciApOworICAgICAgICBpZiAoICRyYyA9PSAwICkgeworICAgICAgICAgICAgKysgJHN1Y2Nlc3M7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2ggJGpvYgorICAgIG15ICRmYWlsdXJlID0gJHRvdGFsIC0gJHN1Y2Nlc3M7CisgICAgcHJvZ3Jlc3MoICJTdWNjZXNzZXMiLCAgICAgICIlM2Qgb2YgJTNkIiwgJHN1Y2Nlc3MsICR0b3RhbCApOworICAgIHByb2dyZXNzKCAiRmFpbHVyZXMiLCAgICAgICAiJTNkIG9mICUzZCIsICRmYWlsdXJlLCAkdG90YWwgKTsKKyAgICBwcm9ncmVzcyggIlRpbWUgZWxhcHNlZCIsICAgIiAgJXMiLCBkc3RyKCAkZmluaXNoIC0gJHN0YXJ0ICkgKTsKKyAgICBwcm9ncmVzcyggIk92ZXJhbGwgcmVzdWx0IiwgIiVzIiwgcnN0ciggJGZhaWx1cmUgKSApOworICAgIHJldHVybiAkZmFpbHVyZTsKK307ICMgc3ViIHN1bW1hcnkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBXb3JrZXIgZnVuY3Rpb25zLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdWIgaW5pdCgpIHsKKyAgICBtYWtlX2RpciggJHRtcCApOworfTsgIyBzdWIgaW5pdAorCitzdWIgY2xlYW4oQCkgeworICAgICMgQ2xlYW4gZGlyZWN0b3JpZXMuCisgICAgbXkgKCBAZGlycyApID0gQF87CisgICAgbXkgJGV4aXQgPSAwOworICAgICMgTWltaXNjIG1ha2VmaWxlIC0tIHByaW50IGEgY29tbWFuZC4KKyAgICBwcmludCggInJtIC1mIC1yICIgLiBqb2luKCAiICIsIG1hcCggc2hvcnRlciggJF8gKSAuICIvKiIsIEBkaXJzICkgKSAuICJcbiIgKTsKKyAgICAkZXhpdCA9CisgICAgICAgIGV4ZWN1dGUoCisgICAgICAgICAgICBbICReWCwgY2F0X2ZpbGUoICRFTlZ7IExJQk9NUF9XT1JLIH0sICJ0b29scyIsICJjbGVhbi1kaXIucGwiICksIEBkaXJzIF0sCisgICAgICAgICAgICAtaWdub3JlX3N0YXR1cyA9PiAxLAorICAgICAgICAgICAgKCAkdG9vbHM6OnZlcmJvc2UgPyAoKSA6ICggLXN0ZG91dCA9PiB1bmRlZiwgLXN0ZGVyciA9PiAiIiApICksCisgICAgICAgICk7CisgICAgcmV0dXJuICRleGl0OworfTsgIyBzdWIgY2xlYW4KKworc3ViIG1ha2UoJCQkKSB7CisgICAgIyBDaGFuZ2UgZGlyIHRvIGJ1aWxkIG9uZSBhbmQgcnVuIG1ha2UuCisgICAgbXkgKCAkam9iLCAkY2xlYW4sICRtYXJrZXIgKSA9IEBfOworICAgIG15ICRkaXIgICAgICA9ICRqb2ItPnsgYnVpbGRfZGlyIH07CisgICAgbXkgJG1ha2VmaWxlID0gJGpvYi0+eyBtYWtlZmlsZSB9OworICAgIG15ICRhcmdzICAgICA9ICRqb2ItPnsgbWFrZV9hcmdzIH07CisgICAgbXkgJGN3ZCAgICAgID0gQ3dkOjpjd2QoKTsKKyAgICBteSAkd2lkdGggICAgPSAtMTA7CisKKyAgICBteSAkZXhpdDsKKyAgICAkZGlyID0gY2F0X2RpciggJHRtcCwgJGRpciApOworICAgIG1ha2VfZGlyKCAkZGlyICk7CisgICAgY2hhbmdlX2RpciggJGRpciApOworCisgICAgbXkgJGFjdGlvbnMgPQorICAgICAgICBzdWIgeworICAgICAgICAgICAgbXkgJHN0YXJ0ID0gdGltZSgpOworICAgICAgICAgICAgJG1ha2VmaWxlID0gc2hvcnRlciggJG1ha2VmaWxlICk7CisgICAgICAgICAgICBwcmludCggIi0iIHggNzksICJcbiIgKTsKKyAgICAgICAgICAgIHByaW50ZiggIiUke3dpZHRofXM6ICVzXG4iLCAiU3RhcnRlZCIsICAgdHN0ciggJHN0YXJ0ICkgKTsKKyAgICAgICAgICAgIHByaW50ZiggIiUke3dpZHRofXM6ICVzXG4iLCAiUm9vdCBkaXIiLCAgJHJvb3QgKTsKKyAgICAgICAgICAgIHByaW50ZiggIiUke3dpZHRofXM6ICVzXG4iLCAiQnVpbGQgZGlyIiwgc2hvcnRlciggJGRpciwgJHJvb3QgKSApOworICAgICAgICAgICAgcHJpbnRmKCAiJSR7d2lkdGh9czogJXNcbiIsICJNYWtlZmlsZSIsICAkbWFrZWZpbGUgKTsKKyAgICAgICAgICAgIHByaW50KCAiLSIgeCA3OSwgIlxuIiApOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICMgVXNlIHNob3J0ZXIgTElCT01QX1dPUksgdG8gaGF2ZSBzaG9ydGVyIGNvbW1hbmQgbGluZXMuCisgICAgICAgICAgICAgICAgIyBOb3RlOiBTb21lIHRvb2xzIG1heSBub3Qgd29yayBpZiBjdXJyZW50IGRpciBpcyBjaGFuZ2VkLgorICAgICAgICAgICAgICAgIGxvY2FsICRFTlZ7IExJQk9NUF9XT1JLIH0gPSBzaG9ydGVyKCAkRU5WeyBMSUJPTVBfV09SSyB9ICk7CisgICAgICAgICAgICAgICAgJGV4aXQgPQorICAgICAgICAgICAgICAgICAgICBleGVjdXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWtlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICItZiIsICRtYWtlZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJjaD0iIC4gJHRhcmdldF9hcmNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXJrZXI9JG1hcmtlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCRhcmdzCisgICAgICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICAgICAgLWlnbm9yZV9zdGF0dXMgPT4gMQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIGlmICggJGNsZWFuIGFuZCAkZXhpdCA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAkZXhpdCA9IGNsZWFuKCAkZGlyICk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgbXkgJGZpbmlzaCA9IHRpbWUoKTsKKyAgICAgICAgICAgIHByaW50KCAiLSIgeCA3OSwgIlxuIiApOworICAgICAgICAgICAgcHJpbnRmKCAiJSR7d2lkdGh9czogJXNcbiIsICJGaW5pc2hlZCIsIHRzdHIoICRmaW5pc2ggKSApOworICAgICAgICAgICAgcHJpbnRmKCAiJSR7d2lkdGh9czogJXNcbiIsICJFbGFwc2VkIiwgZHN0ciggJGZpbmlzaCAtICRzdGFydCApICk7CisgICAgICAgICAgICBwcmludGYoICIlJHt3aWR0aH1zOiAlc1xuIiwgIlJlc3VsdCIsIHJzdHIoICRleGl0ICkgKTsKKyAgICAgICAgICAgIHByaW50KCAiLSIgeCA3OSwgIlxuIiApOworICAgICAgICAgICAgcHJpbnQoICJcbiIgKTsKKyAgICAgICAgfTsgIyBzdWIKKyAgICB0ZWUoICRhY3Rpb25zLCAiYnVpbGQubG9nIiApOworCisgICAgY2hhbmdlX2RpciggJGN3ZCApOworCisgICAgIyBTYXZlIGNvbXBsZXRlZCBqb2IgdG8gYmUgYWJsZSBwcmludCBzdW1tYXJ5IGxhdGVyLgorICAgICRqb2ItPnsgcmMgfSA9ICRleGl0OworICAgIHB1c2goIEBqb2JzLCAkam9iICk7CisKKyAgICByZXR1cm4gJGV4aXQ7CisKK307ICMgc3ViIG1ha2UKKworMTsKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbGliL0xpYk9NUC5wbSBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbGliL0xpYk9NUC5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTI3NjdlCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90b29scy9saWIvTGliT01QLnBtCkBAIC0wLDAgKzEsODUgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKK3BhY2thZ2UgTGliT01QOworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgdG9vbHM7CisKK3N1YiBlbXB0eSgkKSB7CisgICAgbXkgKCAkdmFyICkgPSBAXzsKKyAgICByZXR1cm4gKG5vdCBleGlzdHMoJEVOVnskdmFyfSkpIG9yIChub3QgZGVmaW5lZCgkRU5WeyR2YXJ9KSkgb3IgKCRFTlZ7JHZhcn0gZXEgIiIpOworfTsgIyBzdWIgZW1wdHkKKworbXkgKCAkYmFzZSwgJG91dCwgJHRtcCApOworaWYgKCBlbXB0eSggIkxJQk9NUF9XT1JLIiApICkgeworICAgICMgJEZpbmRCaW46OkJpbiBpcyBub3QgdXNlZCBpbnRlbnRpb25hbGx5IGJlY2F1c2UgaXQgZ2l2ZXMgcmVhbCBwYXRoLiBJIHdhbnQgdG8gdXNlIGFic29sdXRlLAorICAgICMgYnV0IG5vdCByZWFsIG9uZSAocmVhbCBwYXRoIGRvZXMgbm90IGNvbnRhaW4gc3ltbGlua3Mgd2hpbGUgYWJzb2x1dGUgcGF0aCBtYXkgY29udGFpbgorICAgICMgc3ltbGlua3MpLgorICAgICRiYXNlID0gZ2V0X2RpciggZ2V0X2RpciggYWJzX3BhdGgoICQwICkgKSApOworfSBlbHNlIHsKKyAgICAkYmFzZSA9IGFic19wYXRoKCAkRU5WeyBMSUJPTVBfV09SSyB9ICk7Cit9OyAjIGlmCisKK2lmICggZW1wdHkoICJMSUJPTVBfRVhQT1JUUyIgKSApIHsKKyAgICAkb3V0ID0gY2F0X2RpciggJGJhc2UsICJleHBvcnRzIiApOworfSBlbHNlIHsKKyAgICAkb3V0ID0gYWJzX3BhdGgoICRFTlZ7IExJQk9NUF9FWFBPUlRTIH0gKTsKK307ICMgaWYKKworaWYgKCBlbXB0eSggIkxJQk9NUF9UTVAiICkgKSB7CisgICAgJHRtcCA9IGNhdF9kaXIoICRiYXNlLCAidG1wIiApOworfSBlbHNlIHsKKyAgICAkdG1wID0gYWJzX3BhdGgoICRFTlZ7IExJQk9NUF9UTVAgfSApOworfTsgIyBpZgorCiskRU5WeyBMSUJPTVBfV09SSyAgICB9ID0gJGJhc2U7CiskRU5WeyBMSUJPTVBfRVhQT1JUUyB9ID0gJG91dDsKKyRFTlZ7IExJQk9NUF9UTVAgICAgIH0gPSAkdG1wOworCityZXR1cm4gMTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK0I8TGliT01QLnBtPiAtLQorCis9aGVhZDEgU1lOT1BTSVMKKworICAgIHVzZSBGaW5kQmluOworICAgIHVzZSBsaWIgIiRGaW5kQmluOjpCaW4vbGliIjsKKyAgICB1c2UgTGliT01QOworCisgICAgJEVOVnsgTElCT01QX1dPUksgICAgfQorICAgICRFTlZ7IExJQk9NUF9UTVAgICAgIH0KKyAgICAkRU5WeyBMSUJPTVBfRVhQT1JUUyB9CisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGUgbW9kdWxlIGNoZWNrcyBDPExJQk9NUF9XT1JLPiwgQzxMSUJPTVBfRVhQT1JUUz4sIGFuZCBDPExJQk9NUF9UTVA+IGVudmlyb25tZW50cyB2YXJpYWJsZXMuCitJZiBhIHZhcmlhYmxlIHNldCwgdGhlIG1vZHVsZSBtYWtlcyBzdXJlIGl0IGlzIGFic29sdXRlLiBJZiBhIHZhcmlhYmxlIGRvZXMgbm90IGV4aXN0LCB0aGUgbW9kdWxlCitzZXRzIGl0IHRvIGRlZmF1bHQgdmFsdWUuCisKK0RlZmF1bHQgdmFsdWUgZm9yIEM8TElCT01QX0VYUE9SVFM+IGlzIEM8JExJQk9NUF9XT1JLL2V4cG9ydHM+LCBmb3IgQzxMSUJPTVBfVE1QPiAtLQorQzwkTElCT01QX1dPUksvdG1wPi4KKworVmFsdWUgZm9yIEM8TElCT01QX1dPUks+IGlzIGd1ZXNzZWQuIFRoZSBtb2R1bGUgYXNzdW1lcyB0aGUgc2NyaXB0ICh3aGljaCB1c2VzIHRoZSBtb2R1bGUpIGlzCitsb2NhdGVkIGluIEM8dG9vbHMvPiBkaXJlY3Rvcnkgb2YgbGlib21wIGRpcmVjdG9yeSB0cmVlLCBhbmQgdXNlcyBwYXRoIG9mIHRoZSBzY3JpcHQgdG8gY2FsY3VsYXRlCitDPExJQk9NUF9XT1JLPiwKKworPWN1dAorCisjIGVuZCBvZiBmaWxlICMKKwpkaWZmIC0tZ2l0IGEvZmluYWwvcnVudGltZS90b29scy9saWIvUGxhdGZvcm0ucG0gYi9maW5hbC9ydW50aW1lL3Rvb2xzL2xpYi9QbGF0Zm9ybS5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmU2MzU5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90b29scy9saWIvUGxhdGZvcm0ucG0KQEAgLTAsMCArMSw0ODQgQEAKKyMKKyMgVGhpcyBpcyBub3QgYSBydW5uYWJsZSBzY3JpcHQsIGl0IGlzIGEgUGVybCBtb2R1bGUsIGEgY29sbGVjdGlvbiBvZiB2YXJpYWJsZXMsIHN1YnJvdXRpbmVzLCBldGMuCisjIHRvIGJlIHVzZWQgaW4gUGVybCBzY3JpcHRzLgorIworIyBUbyBnZXQgaGVscCBhYm91dCBleHBvcnRlZCB2YXJpYWJsZXMgYW5kIHN1YnJvdXRpbmVzLCBleGVjdXRlIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKyMKKyMgICAgIHBlcmxkb2MgUGxhdGZvcm0ucG0KKyMKKyMgb3Igc2VlIFBPRCAoUGxhaW4gT2xkIERvY3VtZW50YXRpb24pIGltYmVkZGVkIHRvIHRoZSBzb3VyY2UuLi4KKyMKKyMKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworcGFja2FnZSBQbGF0Zm9ybTsKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIGJhc2UgIkV4cG9ydGVyIjsKKwordXNlIFVuYW1lOworCitteSBAdmFyczsKKworQkVHSU4geworICAgIEB2YXJzID0gcXd7ICRob3N0X2FyY2ggJGhvc3Rfb3MgJGhvc3RfcGxhdGZvcm0gJHRhcmdldF9hcmNoICR0YXJnZXRfbWljX2FyY2ggJHRhcmdldF9vcyAkdGFyZ2V0X3BsYXRmb3JtIH07Cit9CisKK291ciAkVkVSU0lPTiAgICAgPSAiMC4wMTQiOworb3VyIEBFWFBPUlQgICAgICA9IHF3e307CitvdXIgQEVYUE9SVF9PSyAgID0gKCBxd3sgY2Fub25fYXJjaCBjYW5vbl9vcyBjYW5vbl9taWNfYXJjaCBsZWdhbF9hcmNoIGFyY2hfb3B0IH0sIEB2YXJzICk7CitvdXIgJUVYUE9SVF9UQUdTID0gKCBhbGwgPT4gWyBARVhQT1JUX09LIF0sIHZhcnMgPT4gXEB2YXJzICk7CisKKyMgQ2Fub25pemUgYXJjaGl0ZWN0dXJlIG5hbWUuCitzdWIgY2Fub25fYXJjaCgkKSB7CisgICAgbXkgKCAkYXJjaCApID0gQF87CisgICAgaWYgKCBkZWZpbmVkKCAkYXJjaCApICkgeworICAgICAgICBpZiAoICRhcmNoID1+IG17XEFccyooPzozMnxJQS0/MzJ8SUEtPzMyIGFyY2hpdGVjdHVyZXxpWzM0NTZdODZ8eDg2KVxzKlx6fWkgKSB7CisgICAgICAgICAgICAkYXJjaCA9ICIzMiI7CisgICAgICAgIH0gZWxzaWYgKCAkYXJjaCA9fiBte1xBXHMqKD86NDh8KD86aWEpPzMyZXxJbnRlbFxzKjY0fEludGVsXChSXClccyo2NHx4ODZbXy1dNjR8eDY0fEFNRDY0KVxzKlx6fWkgKSB7CisgICAgICAgICAgICAkYXJjaCA9ICIzMmUiOworICAgICAgICB9IGVsc2lmICggJGFyY2ggPX4gbXtcQWFybSg/OnY3XEQqKT9cen0gKSB7CisgICAgICAgICAgICAkYXJjaCA9ICJhcm0iOworICAgICAgICB9IGVsc2lmICggJGFyY2ggPX4gbXtcQXBwYzY0bGV9ICkgeworCQkJJGFyY2ggPSAicHBjNjRsZSI7CisgICAgICAgIH0gZWxzaWYgKCAkYXJjaCA9fiBte1xBcHBjNjR9ICkgeworICAgICAgICAJJGFyY2ggPSAicHBjNjQiOworICAgICAgICB9IGVsc2lmICggJGFyY2ggPX4gbXtcQWFhcmNoNjR9ICkgeworICAgICAgICAgICAgICAgICRhcmNoID0gImFhcmNoNjQiOworICAgICAgICB9IGVsc2lmICggJGFyY2ggPX4gbXtcQW1pY30gKSB7CisgICAgICAgICAgICAkYXJjaCA9ICJtaWMiOworICAgICAgICB9IGVsc2lmICggJGFyY2ggPX4gbXtcQW1pcHM2NH0gKSB7CisgICAgICAgICAgICAkYXJjaCA9ICJtaXBzNjQiOworICAgICAgICB9IGVsc2lmICggJGFyY2ggPX4gbXtcQW1pcHN9ICkgeworICAgICAgICAgICAgJGFyY2ggPSAibWlwcyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkYXJjaCA9IHVuZGVmOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorICAgIHJldHVybiAkYXJjaDsKK307ICMgc3ViIGNhbm9uX2FyY2gKKworIyBDYW5vbml6ZSBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgbmFtZS4KK3N1YiBjYW5vbl9taWNfYXJjaCgkKSB7CisgICAgbXkgKCAkbWljX2FyY2ggKSA9IEBfOworICAgIGlmICggZGVmaW5lZCggJG1pY19hcmNoICkgKSB7CisgICAgICAgIGlmICggJG1pY19hcmNoID1+IG17XEFrbmZ9ICkgeworICAgICAgICAgICAgJG1pY19hcmNoID0gImtuZiI7CisgICAgICAgIH0gZWxzaWYgKCAkbWljX2FyY2ggPX4gbXtcQWtuY30pIHsKKyAgICAgICAgICAgICRtaWNfYXJjaCA9ICJrbmMiOworICAgICAgICB9IGVsc2lmICggJG1pY19hcmNoID1+IG17XEFrbmx9ICkgeworICAgICAgICAgICAgJG1pY19hcmNoID0gImtubCI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkbWljX2FyY2ggPSB1bmRlZjsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKyAgICByZXR1cm4gJG1pY19hcmNoOworfTsgIyBzdWIgY2Fub25fbWljX2FyY2gKKworeyAgIyBSZXR1cm4gbGVnYWwgYXBwcm92ZWQgYXJjaGl0ZWN0dXJlIG5hbWUuCisgICAgbXkgJWxlZ2FsID0gKAorICAgICAgICAiMzIiICA9PiAiSUEtMzIgYXJjaGl0ZWN0dXJlIiwKKyAgICAgICAgIjMyZSIgPT4gIkludGVsKFIpIDY0IiwKKyAgICAgICAgImFybSIgPT4gIkFSTSIsCisgICAgICAgICJhYXJjaDY0IiA9PiAiQUFyY2g2NCIsCisgICAgICAgICJtaWMiID0+ICJJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUiLAorICAgICAgICAibWlwcyIgPT4gIk1JUFMiLAorICAgICAgICAibWlwczY0IiA9PiAiTUlQUzY0IiwKKyAgICApOworCisgICAgc3ViIGxlZ2FsX2FyY2goJCkgeworICAgICAgICBteSAoICRhcmNoICkgPSBAXzsKKyAgICAgICAgJGFyY2ggPSBjYW5vbl9hcmNoKCAkYXJjaCApOworICAgICAgICBpZiAoIGRlZmluZWQoICRhcmNoICkgKSB7CisgICAgICAgICAgICAkYXJjaCA9ICRsZWdhbHsgJGFyY2ggfTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICByZXR1cm4gJGFyY2g7CisgICAgfTsgIyBzdWIgbGVnYWxfYXJjaAorfQorCit7ICAjIFJldHVybiBhcmNoaXRlY3R1cmUgbmFtZSBzdWl0YWJsZSBmb3IgSW50ZWwgY29tcGlsZXIgc2V0dXAgc2NyaXB0cy4KKyAgICBteSAlb3B0aW9uID0gKAorICAgICAgICAiMzIiICA9PiAiaWEzMiIsCisgICAgICAgICIzMmUiID0+ICJpbnRlbDY0IiwKKyAgICAgICAgIjY0IiAgPT4gImlhNjQiLAorICAgICAgICAiYXJtIiA9PiAiYXJtIiwKKyAgICAgICAgImFhcmNoNjQiID0+ICJhYXJjaCIsCisgICAgICAgICJtaWMiID0+ICJpbnRlbDY0IiwKKyAgICAgICAgIm1pcHMiID0+ICJtaXBzIiwKKyAgICAgICAgIm1pcHM2NCIgPT4gIk1JUFM2NCIsCisgICAgKTsKKworICAgIHN1YiBhcmNoX29wdCgkKSB7CisgICAgICAgIG15ICggJGFyY2ggKSA9IEBfOworICAgICAgICAkYXJjaCA9IGNhbm9uX2FyY2goICRhcmNoICk7CisgICAgICAgIGlmICggZGVmaW5lZCggJGFyY2ggKSApIHsKKyAgICAgICAgICAgICRhcmNoID0gJG9wdGlvbnsgJGFyY2ggfTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICByZXR1cm4gJGFyY2g7CisgICAgfTsgIyBzdWIgYXJjaF9vcHQKK30KKworIyBDYW5vbml6ZSBPUyBuYW1lLgorc3ViIGNhbm9uX29zKCQpIHsKKyAgICBteSAoICRvcyApID0gQF87CisgICAgaWYgKCBkZWZpbmVkKCAkb3MgKSApIHsKKyAgICAgICAgaWYgKCAkb3MgPX4gbXtcQVxzKig/OkxpbnV4fGxpbnxsKVxzKlx6fWkgKSB7CisgICAgICAgICAgICAkb3MgPSAibGluIjsKKyAgICAgICAgfSBlbHNpZiAoICRvcyA9fiBte1xBXHMqKD86TWFjKD86XHMqT1MoPzpccypYKT8pP3xtYWN8bXxEYXJ3aW4pXHMqXHp9aSApIHsKKyAgICAgICAgICAgICRvcyA9ICJtYWMiOworICAgICAgICB9IGVsc2lmICggJG9zID1+IG17XEFccyooPzpXaW4oPzpkb3dzKT8oPzooPzpffFxzKik/KD86TlR8WFB8OTV8OTh8MjAwMykpP3x3KVxzKlx6fWkgKSB7CisgICAgICAgICAgICAkb3MgPSAid2luIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRvcyA9IHVuZGVmOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorICAgIHJldHVybiAkb3M7Cit9OyAjIHN1YiBjYW5vbl9vcworCitteSAoICRfaG9zdF9vcywgJF9ob3N0X2FyY2gsICRfdGFyZ2V0X29zLCAkX3RhcmdldF9hcmNoLCAkX3RhcmdldF9taWNfYXJjaCwgJF9kZWZhdWx0X21pY19hcmNoKTsKKworIyBTZXQgdGhlIGRlZmF1bHQgbWljLWFyY2ggdmFsdWUuCiskX2RlZmF1bHRfbWljX2FyY2ggPSAia25jIjsKKworc3ViIHNldF90YXJnZXRfYXJjaCgkKSB7CisgICAgbXkgKCAkYXJjaCApID0gY2Fub25fYXJjaCggJF9bIDAgXSApOworICAgIGlmICggZGVmaW5lZCggJGFyY2ggKSApIHsKKyAgICAgICAgJF90YXJnZXRfYXJjaCAgICAgICA9ICRhcmNoOworICAgICAgICAkRU5WeyBMSUJPTVBfQVJDSCB9ID0gJGFyY2g7CisgICAgfTsgIyBpZgorICAgIHJldHVybiAkYXJjaDsKK307ICMgc3ViIHNldF90YXJnZXRfYXJjaAorCitzdWIgc2V0X3RhcmdldF9taWNfYXJjaCgkKSB7CisgICAgbXkgKCAkbWljX2FyY2ggKSA9IGNhbm9uX21pY19hcmNoKCAkX1sgMCBdICk7CisgICAgaWYgKCBkZWZpbmVkKCAkbWljX2FyY2ggKSApIHsKKyAgICAgICAgJF90YXJnZXRfbWljX2FyY2ggICAgICAgPSAkbWljX2FyY2g7CisgICAgICAgICRFTlZ7IExJQk9NUF9NSUNfQVJDSCB9ID0gJG1pY19hcmNoOworICAgIH07ICMgaWYKKyAgICByZXR1cm4gJG1pY19hcmNoOworfTsgIyBzdWIgc2V0X3RhcmdldF9taWNfYXJjaAorCitzdWIgc2V0X3RhcmdldF9vcygkKSB7CisgICAgbXkgKCAkb3MgKSA9IGNhbm9uX29zKCAkX1sgMCBdICk7CisgICAgaWYgKCBkZWZpbmVkKCAkb3MgKSApIHsKKyAgICAgICAgJF90YXJnZXRfb3MgICAgICAgPSAkb3M7CisgICAgICAgICRFTlZ7IExJQk9NUF9PUyB9ID0gJG9zOworICAgIH07ICMgaWYKKyAgICByZXR1cm4gJG9zOworfTsgIyBzdWIgc2V0X3RhcmdldF9vcworCitzdWIgdGFyZ2V0X29wdGlvbnMoKSB7CisgICAgbXkgQG9wdGlvbnMgPSAoCisgICAgICAgICJ0YXJnZXQtb3N8b3M9cyIgPT4KKyAgICAgICAgICAgIHN1YiB7CisgICAgICAgICAgICAgICAgc2V0X3RhcmdldF9vcyggJF9bIDEgXSApIG9yCisgICAgICAgICAgICAgICAgICAgIGRpZSAiQmFkIHZhbHVlIG9mIC0tdGFyZ2V0LW9zIG9wdGlvbjogXCIkX1sgMSBdXCJcbiI7CisgICAgICAgICAgICB9LAorICAgICAgICAidGFyZ2V0LWFyY2hpdGVjdHVyZXx0YXJnZXJ0LWFyY2h8YXJjaGl0ZWN0dXJlfGFyY2g9cyIgPT4KKyAgICAgICAgICAgc3ViIHsKKyAgICAgICAgICAgICAgIHNldF90YXJnZXRfYXJjaCggJF9bIDEgXSApIG9yCisgICAgICAgICAgICAgICAgICAgZGllICJCYWQgdmFsdWUgb2YgLS10YXJnZXQtYXJjaGl0ZWN0dXJlIG9wdGlvbjogXCIkX1sgMSBdXCJcbiI7CisgICAgICAgICAgIH0sCisgICAgICAgICJ0YXJnZXQtbWljLWFyY2hpdGVjdHVyZXx0YXJnZXJ0LW1pYy1hcmNofG1pYy1hcmNoaXRlY3R1cmV8bWljLWFyY2g9cyIgPT4KKyAgICAgICAgICAgc3ViIHsKKyAgICAgICAgICAgICAgIHNldF90YXJnZXRfbWljX2FyY2goICRfWyAxIF0gKSBvcgorICAgICAgICAgICAgICAgICAgIGRpZSAiQmFkIHZhbHVlIG9mIC0tdGFyZ2V0LW1pYy1hcmNoaXRlY3R1cmUgb3B0aW9uOiBcIiRfWyAxIF1cIlxuIjsKKyAgICAgICAgICAgfSwKKyAgICApOworICAgIHJldHVybiBAb3B0aW9uczsKK307ICMgc3ViIHRhcmdldF9vcHRpb25zCisKKyMgRGV0ZWN0IGhvc3QgYXJjaC4KK3sKKyAgICBteSAkaGFyZHdhcmVfcGxhdGZvcm0gPSBVbmFtZTo6aGFyZHdhcmVfcGxhdGZvcm0oKTsKKyAgICBpZiAoIDAgKSB7CisgICAgfSBlbHNpZiAoICRoYXJkd2FyZV9wbGF0Zm9ybSBlcSAiaTM4NiIgKSB7CisgICAgICAgICRfaG9zdF9hcmNoID0gIjMyIjsKKyAgICB9IGVsc2lmICggJGhhcmR3YXJlX3BsYXRmb3JtIGVxICJpYTY0IiApIHsKKyAgICAgICAgJF9ob3N0X2FyY2ggPSAiNjQiOworICAgIH0gZWxzaWYgKCAkaGFyZHdhcmVfcGxhdGZvcm0gZXEgIng4Nl82NCIgKSB7CisgICAgICAgICRfaG9zdF9hcmNoID0gIjMyZSI7CisgICAgfSBlbHNpZiAoICRoYXJkd2FyZV9wbGF0Zm9ybSBlcSAiYXJtIiApIHsKKyAgICAgICAgJF9ob3N0X2FyY2ggPSAiYXJtIjsKKyAgICB9IGVsc2lmICggJGhhcmR3YXJlX3BsYXRmb3JtIGVxICJwcGM2NGxlIiApIHsKKyAgICAgICAgJF9ob3N0X2FyY2ggPSAicHBjNjRsZSI7CisgICAgfSBlbHNpZiAoICRoYXJkd2FyZV9wbGF0Zm9ybSBlcSAicHBjNjQiICkgeworICAgICAgICAkX2hvc3RfYXJjaCA9ICJwcGM2NCI7CisgICAgfSBlbHNpZiAoICRoYXJkd2FyZV9wbGF0Zm9ybSBlcSAiYWFyY2g2NCIgKSB7CisgICAgICAgICRfaG9zdF9hcmNoID0gImFhcmNoNjQiOworICAgIH0gZWxzaWYgKCAkaGFyZHdhcmVfcGxhdGZvcm0gZXEgIm1pcHM2NCIgKSB7CisgICAgICAgICRfaG9zdF9hcmNoID0gIm1pcHM2NCI7CisgICAgfSBlbHNpZiAoICRoYXJkd2FyZV9wbGF0Zm9ybSBlcSAibWlwcyIgKSB7CisgICAgICAgICRfaG9zdF9hcmNoID0gIm1pcHMiOworICAgIH0gZWxzZSB7CisgICAgICAgIGRpZSAiVW5zdXBwb3J0ZWQgaG9zdCBoYXJkd2FyZSBwbGF0Zm9ybTogXCIkaGFyZHdhcmVfcGxhdGZvcm1cIjsgc3RvcHBlZCI7CisgICAgfTsgIyBpZgorfQorCisjIERldGVjdCBob3N0IE9TLgoreworICAgIG15ICRvcGVyYXRpbmdfc3lzdGVtID0gVW5hbWU6Om9wZXJhdGluZ19zeXN0ZW0oKTsKKyAgICBpZiAoIDAgKSB7CisgICAgfSBlbHNpZiAoICRvcGVyYXRpbmdfc3lzdGVtIGVxICJHTlUvTGludXgiICkgeworICAgICAgICAkX2hvc3Rfb3MgPSAibGluIjsKKyAgICB9IGVsc2lmICggJG9wZXJhdGluZ19zeXN0ZW0gZXEgIkZyZWVCU0QiICkgeworICAgICAgICAjIEhvc3QgT1MgcmVzZW1ibGVzIExpbnV4LgorICAgICAgICAkX2hvc3Rfb3MgPSAibGluIjsKKyAgICB9IGVsc2lmICggJG9wZXJhdGluZ19zeXN0ZW0gZXEgIk5ldEJTRCIgKSB7CisgICAgICAgICMgSG9zdCBPUyByZXNlbWJsZXMgTGludXguCisgICAgICAgICRfaG9zdF9vcyA9ICJsaW4iOworICAgIH0gZWxzaWYgKCAkb3BlcmF0aW5nX3N5c3RlbSBlcSAiRGFyd2luIiApIHsKKyAgICAgICAgJF9ob3N0X29zID0gIm1hYyI7CisgICAgfSBlbHNpZiAoICRvcGVyYXRpbmdfc3lzdGVtIGVxICJNUyBXaW5kb3dzIiApIHsKKyAgICAgICAgJF9ob3N0X29zID0gIndpbiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGllICJVbnN1cHBvcnRlZCBob3N0IG9wZXJhdGluZyBzeXN0ZW06IFwiJG9wZXJhdGluZ19zeXN0ZW1cIjsgc3RvcHBlZCI7CisgICAgfTsgIyBpZgorfQorCisjIERldGVjdCB0YXJnZXQgYXJjaC4KK2lmICggZGVmaW5lZCggJEVOVnsgTElCT01QX0FSQ0ggfSApICkgeworICAgICMgVXNlIGFyY2ggc3BlY2lmaWVkIGluIExJQk9NUF9BUkNILgorICAgICRfdGFyZ2V0X2FyY2ggPSBjYW5vbl9hcmNoKCAkRU5WeyBMSUJPTVBfQVJDSCB9ICk7CisgICAgaWYgKCBub3QgZGVmaW5lZCggJF90YXJnZXRfYXJjaCApICkgeworICAgICAgICBkaWUgIlVua25vd24gYXJjaGl0ZWN0dXJlIHNwZWNpZmllZCBpbiBMSUJPTVBfQVJDSCBlbnZpcm9ubWVudCB2YXJpYWJsZTogXCIkRU5WeyBMSUJPTVBfQVJDSCB9XCIiOworICAgIH07ICMgaWYKK30gZWxzZSB7CisgICAgIyBPdGhlcndpc2UgdXNlIGhvc3QgYXJjaGl0ZWN0dXJlLgorICAgICRfdGFyZ2V0X2FyY2ggPSAkX2hvc3RfYXJjaDsKK307ICMgaWYKKyRFTlZ7IExJQk9NUF9BUkNIIH0gPSAkX3RhcmdldF9hcmNoOworCisjIERldGVjdCB0YXJnZXQgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlLgoraWYgKCBkZWZpbmVkKCAkRU5WeyBMSUJPTVBfTUlDX0FSQ0ggfSApICkgeworICAgICMgVXNlIG1pYyBhcmNoIHNwZWNpZmllZCBpbiBMSUJPTVBfTUlDX0FSQ0guCisgICAgJF90YXJnZXRfbWljX2FyY2ggPSBjYW5vbl9taWNfYXJjaCggJEVOVnsgTElCT01QX01JQ19BUkNIIH0gKTsKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkX3RhcmdldF9taWNfYXJjaCApICkgeworICAgICAgICBkaWUgIlVua25vd24gYXJjaGl0ZWN0dXJlIHNwZWNpZmllZCBpbiBMSUJPTVBfTUlDX0FSQ0ggZW52aXJvbm1lbnQgdmFyaWFibGU6IFwiJEVOVnsgTElCT01QX01JQ19BUkNIIH1cIiI7CisgICAgfTsgIyBpZgorfSBlbHNlIHsKKyAgICAjIE90aGVyd2lzZSB1c2UgZGVmYXVsdCBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUuCisgICAgJF90YXJnZXRfbWljX2FyY2ggPSAkX2RlZmF1bHRfbWljX2FyY2g7Cit9OyAjIGlmCiskRU5WeyBMSUJPTVBfTUlDX0FSQ0ggfSA9ICRfdGFyZ2V0X21pY19hcmNoOworCisjIERldGVjdCB0YXJnZXQgT1MuCitpZiAoIGRlZmluZWQoICRFTlZ7IExJQk9NUF9PUyB9ICkgKSB7CisgICAgIyBVc2UgT1Mgc3BlY2lmaWVkIGluIExJQk9NUF9PUy4KKyAgICAkX3RhcmdldF9vcyA9IGNhbm9uX29zKCAkRU5WeyBMSUJPTVBfT1MgfSApOworICAgIGlmICggbm90IGRlZmluZWQoICRfdGFyZ2V0X29zICkgKSB7CisgICAgICAgIGRpZSAiVW5rbm93biBPUyBzcGVjaWZpZWQgaW4gTElCT01QX09TIGVudmlyb25tZW50IHZhcmlhYmxlOiBcIiRFTlZ7IExJQk9NUF9PUyB9XCIiOworICAgIH07ICMgaWYKK30gZWxzZSB7CisgICAgIyBPdGhlcndpc2UgdXNlIGhvc3QgT1MuCisgICAgJF90YXJnZXRfb3MgPSAkX2hvc3Rfb3M7Cit9OyAjIGlmCiskRU5WeyBMSUJPTVBfT1MgfSA9ICRfdGFyZ2V0X29zOworCit1c2UgdmFycyBAdmFyczsKKwordGllKCAkaG9zdF9hcmNoLCAgICAgICAiUGxhdGZvcm06Omhvc3RfYXJjaCIgKTsKK3RpZSggJGhvc3Rfb3MsICAgICAgICAgIlBsYXRmb3JtOjpob3N0X29zIiApOwordGllKCAkaG9zdF9wbGF0Zm9ybSwgICAiUGxhdGZvcm06Omhvc3RfcGxhdGZvcm0iICk7Cit0aWUoICR0YXJnZXRfYXJjaCwgICAgICJQbGF0Zm9ybTo6dGFyZ2V0X2FyY2giICk7Cit0aWUoICR0YXJnZXRfbWljX2FyY2gsICJQbGF0Zm9ybTo6dGFyZ2V0X21pY19hcmNoIiApOwordGllKCAkdGFyZ2V0X29zLCAgICAgICAiUGxhdGZvcm06OnRhcmdldF9vcyIgKTsKK3RpZSggJHRhcmdldF9wbGF0Zm9ybSwgIlBsYXRmb3JtOjp0YXJnZXRfcGxhdGZvcm0iICk7CisKK3sgcGFja2FnZSBQbGF0Zm9ybTo6YmFzZTsKKworICAgIHVzZSBDYXJwOworCisgICAgdXNlIFRpZTo6U2NhbGFyOworICAgIHVzZSBiYXNlICJUaWU6OlN0ZFNjYWxhciI7CisKKyAgICBzdWIgU1RPUkUgeworICAgICAgICBteSAkc2VsZiA9IHNoaWZ0KCBAXyApOworICAgICAgICBjcm9hayggIk1vZGlmeWluZyBcJCIgLiByZWYoICRzZWxmICkgLiAiIGlzIG5vdCBhbGxvd2VkOyBzdG9wcGVkIiApOworICAgIH07ICMgc3ViIFNUT1JFCisKK30gIyBwYWNrYWdlIFBsYXRmb3JtOjpiYXNlCisKK3sgcGFja2FnZSBQbGF0Zm9ybTo6aG9zdF9hcmNoOworICAgIHVzZSBiYXNlICJQbGF0Zm9ybTo6YmFzZSI7CisgICAgc3ViIEZFVENIIHsKKyAgICAgICAgcmV0dXJuICRfaG9zdF9hcmNoOworICAgIH07ICMgc3ViIEZFVENICit9ICMgcGFja2FnZSBQbGF0Zm9ybTo6aG9zdF9hcmNoCisKK3sgcGFja2FnZSBQbGF0Zm9ybTo6aG9zdF9vczsKKyAgICB1c2UgYmFzZSAiUGxhdGZvcm06OmJhc2UiOworICAgIHN1YiBGRVRDSCB7CisgICAgICAgIHJldHVybiAkX2hvc3Rfb3M7CisgICAgfTsgIyBzdWIgRkVUQ0gKK30gIyBwYWNrYWdlIFBsYXRmb3JtOjpob3N0X29zCisKK3sgcGFja2FnZSBQbGF0Zm9ybTo6aG9zdF9wbGF0Zm9ybTsKKyAgICB1c2UgYmFzZSAiUGxhdGZvcm06OmJhc2UiOworICAgIHN1YiBGRVRDSCB7CisgICAgICAgIHJldHVybiAiJHtfaG9zdF9vc31fJHtfaG9zdF9hcmNofSI7CisgICAgfTsgIyBzdWIgRkVUQ0gKK30gIyBwYWNrYWdlIFBsYXRmb3JtOjpob3N0X3BsYXRmb3JtCisKK3sgcGFja2FnZSBQbGF0Zm9ybTo6dGFyZ2V0X2FyY2g7CisgICAgdXNlIGJhc2UgIlBsYXRmb3JtOjpiYXNlIjsKKyAgICBzdWIgRkVUQ0ggeworICAgICAgICByZXR1cm4gJF90YXJnZXRfYXJjaDsKKyAgICB9OyAjIHN1YiBGRVRDSAorfSAjIHBhY2thZ2UgUGxhdGZvcm06OnRhcmdldF9hcmNoCisKK3sgcGFja2FnZSBQbGF0Zm9ybTo6dGFyZ2V0X21pY19hcmNoOworICAgIHVzZSBiYXNlICJQbGF0Zm9ybTo6YmFzZSI7CisgICAgc3ViIEZFVENIIHsKKyAgICAgICAgcmV0dXJuICRfdGFyZ2V0X21pY19hcmNoOworICAgIH07ICMgc3ViIEZFVENICit9ICMgcGFja2FnZSBQbGF0Zm9ybTo6dGFyZ2V0X21pY19hcmNoCisKK3sgcGFja2FnZSBQbGF0Zm9ybTo6dGFyZ2V0X29zOworICAgIHVzZSBiYXNlICJQbGF0Zm9ybTo6YmFzZSI7CisgICAgc3ViIEZFVENIIHsKKyAgICAgICAgcmV0dXJuICRfdGFyZ2V0X29zOworICAgIH07ICMgc3ViIEZFVENICit9ICMgcGFja2FnZSBQbGF0Zm9ybTo6dGFyZ2V0X29zCisKK3sgcGFja2FnZSBQbGF0Zm9ybTo6dGFyZ2V0X3BsYXRmb3JtOworICAgIHVzZSBiYXNlICJQbGF0Zm9ybTo6YmFzZSI7CisgICAgc3ViIEZFVENIIHsKKyAgICAgICAgaWYgKCRfdGFyZ2V0X2FyY2ggZXEgIm1pYyIpIHsKKyAgICAgICAgICAgIHJldHVybiAiJHtfdGFyZ2V0X29zfV8ke190YXJnZXRfbWljX2FyY2h9IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICIke190YXJnZXRfb3N9XyR7X3RhcmdldF9hcmNofSI7CisgICAgICAgIH0KKyAgICB9OyAjIHN1YiBGRVRDSAorfSAjIHBhY2thZ2UgUGxhdGZvcm06OnRhcmdldF9wbGF0Zm9ybQorCisKK3JldHVybiAxOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworQjxQbGF0Zm9ybS5wbT4gLS0gRmV3IHN1YnJvdXRpbmVzIHRvIGdldCBPUywgYXJjaGl0ZWN0dXJlIGFuZCBwbGF0Zm9ybSBuYW1lIGluIGZvcm0gc3VpdGFibGUgZm9yCituYW1pbmcgZmlsZXMsIGRpcmVjdG9yaWVzLCBtYWNyb3MsIGV0Yy4KKworPWhlYWQxIFNZTk9QU0lTCisKKyAgICB1c2UgUGxhdGZvcm0gIjphbGwiOworICAgIHVzZSB0b29sczsKKworICAgIG15ICRhcmNoICAgPSBjYW5vbl9hcmNoKCAiZW02NFQiICk7ICAgICAgICAjIFJldHVybnMgIjMyZSIuCisgICAgbXkgJGxlZ2FsICA9IGxlZ2FsX2FyY2goICJlbTY0dCIgKTsgICAgICAgICMgUmV0dXJucyAiSW50ZWwoUikgNjQiLgorICAgIG15ICRvcHRpb24gPSBhcmNoX29wdCggImVtNjR0IiApOyAgICAgICAgICAjIFJldHVybnMgImludGVsNjQiLgorICAgIG15ICRvcyAgICAgPSBjYW5vbl9vcyggIldpbmRvd3MgTlQiICk7ICAgICAjIFJldHVybnMgIndpbiIuCisKKyAgICBwcmludCggJGhvc3RfYXJjaCwgJGhvc3Rfb3MsICRob3N0X3BsYXRmb3JtICk7CisgICAgcHJpbnQoICR0YXJlZ3RfYXJjaCwgJHRhcmdldF9vcywgJHRhcmdldF9wbGF0Zm9ybSApOworCisgICAgdG9vbHM6OmdldF9vcHRpb25zKAorICAgICAgICBQbGF0Zm9ybTo6dGFyZ2V0X29wdGlvbnMoKSwKKyAgICAgICAgLi4uCisgICAgKTsKKworCis9aGVhZDEgREVTQ1JJUFRJT04KKworRW52aXJvbm1lbnQgdmFyaWFibGUgTElCT01QX09TIHNwZWNpZmllcyB0YXJnZXQgT1MgdG8gcmVwb3J0LiBJZiBMSUJPTVBfT1MgaWQgbm90IGRlZmluZWQsCit0aGUgc2NyaXB0IGFzc3VtZXMgaG9zdCBPUyBpcyB0YXJnZXQgT1MuCisKK0Vudmlyb25tZW50IHZhcmlhYmxlIExJQk9NUF9BUkNIIHNwZWNpZmllcyB0YXJnZXQgYXJjaGl0ZWN0dXJlIHRvIHJlcG9ydC4gSWYgTElCT01QX0FSQ0ggaXMgbm90IGRlZmluZWQsCit0aGUgc2NyaXB0IGFzc3VtZXMgaG9zdCBhcmNoaXRlY3R1cmUgaXMgdGFyZ2V0IG9uZS4KKworPWhlYWQyIEZ1bmN0aW9ucy4KKworPW92ZXIKKworPWl0ZW0gQjxjYW5vbl9hcmNoKCAkYXJjaCApPgorCitJbnB1dCBzdHJpbmcgaXMgYW4gYXJjaGl0ZWN0dXJlIG5hbWUgdG8gY2Fub25pemUuIFRoZSBmdW5jdGlvbiByZWNvZ25pemVzIG1hbnkgdmFyaWFudHMsIGZvciBleGFtcGxlOgorQzwzMmU+LCBDPEludGVsNjQ+LCBDPEludGVsKFIpIDY0PiwgZXRjLiBSZXR1cm5lZCBzdHJpbmcgaXMgYSBjYW5vbm9uaXplZCBhcmNoaXRlY3R1cmUgbmFtZSwKK29uZSBvZjogQzwzMj4sIEM8MzJlPiwgQzw2ND4sIEM8YXJtPiwgQzxwcGM2NGxlPiwgQzxwcGM2ND4sIEM8bWljPiwgQzxtaXBzPiwgQzxtaXBzNjQ+LCBvciBDPHVuZGVmPiBpcyBpbnB1dCBzdHJpbmcgaXMgbm90IHJlY29nbml6ZWQuCisKKz1pdGVtIEI8bGVnYWxfYXJjaCggJGFyY2ggKT4KKworSW5wdXQgc3RyaW5nIGlzIGFyY2hpdGVjdHVyZSBuYW1lLiBUaGUgZnVuY3Rpb24gcmVjb2duaXplcyB0aGUgc2FtZSB2YXJpYW50cyBhcyBDPGFyY2hfY2Fub24oKT4gZG9lcy4KK1JldHVybmVkIHN0cmluZyBpcyBhIG5hbWUgYXBwcm92ZWQgYnkgSW50ZWwgTGVnYWwsIG9uZSBvZjogQzxJQS0zMiBhcmNoaXRlY3R1cmU+LCBDPEludGVsKFIpIDY0Pgorb3IgQzx1bmRlZj4gaWYgaW5wdXQgc3RyaW5nIGlzIG5vdCByZWNvZ25pemVkLgorCis9aXRlbSBCPGFyY2hfb3B0KCAkYXJjaCApPgorCitJbnB1dCBzdHJpbmcgaXMgYXJjaGl0ZWN0dXJlIG5hbWUuIFRoZSBmdW5jdGlvbiByZWNvZ25pemVzIHRoZSBzYW1lIHZhcmlhbnRzIGFzIEM8YXJjaF9jYW5vbigpPiBkb2VzLgorUmV0dXJuZWQgc3RyaW5nIGlzIGFuIGFyY2hpdGVjdHVyZSBuYW1lIHN1aXRhYmxlIGZvciBwYXNzaW5nIHRvIGNvbXBpbGVyIHNldHVwIHNjcmlwdHMKKyhlLiBnLiBDPGljY3ZhcnMuc2g+KSwgb25lIG9mOiBDPElBLTMyIGFyY2hpdGVjdHVyZT4sIEM8SW50ZWwoUikgNjQ+IG9yIEM8dW5kZWY+IGlmIGlucHV0IHN0cmluZyBpcyBub3QKK3JlY29nbml6ZWQuCisKKz1pdGVtIEI8Y2Fub25fb3MoICRvcyApPgorCitJbnB1dCBzdHJpbmcgaXMgT1MgbmFtZSB0byBjYW5vbml6ZS4gVGhlIGZ1bmN0aW9uIHJlY29nbml6ZXMgbWFueSB2YXJpYW50cywgZm9yIGV4YW1wbGU6IEM8bWFjPiwgQzxPUyBYPiwgZXRjLiBSZXR1cm5lZCBzdHJpbmcgaXMgYSBjYW5vbml6ZWQgT1MgbmFtZSwgb25lIG9mOiBDPGxpbj4sCitDPG1hYz4sIEM8d2luPiwgb3IgQzx1bmRlZj4gaXMgaW5wdXQgc3RyaW5nIGlzIG5vdCByZWNvZ25pemVkLgorCis9aXRlbSBCPHRhcmdldF9vcHRpb25zKCk+CisKK1JldHVybnMgYXJyYXkgc3VpdGFibGUgZm9yIHBhc3NpbmcgdG8gQzx0b29sczo6Z2V0X29wdGlvbnMoKT4gdG8gbGV0IGEgc2NyaXB0IHJlY29nbml6ZQorQzwtLXRhcmdldC1hcmNoaXRlY3R1cmU9STxzdHI+PiBhbmQgQzwtLXRhcmdldC1vcz1JPHN0cj4+IG9wdGlvbnMuIFR5cGljYWwgdXNhZ2UgaXM6CisKKyAgICB1c2UgdG9vbHM7CisgICAgdXNlIFBsYXRmb3JtOworCisgICAgbXkgKCAkb3MsICRhcmNoLCAkcGxhdGZvcm0gKTsgICAgIyBHbG9iYWwgdmFyaWFibGVzLCBub3QgaW5pdGlhbGl6ZWQuCisKKyAgICAuLi4KKworICAgIGdldF9vcHRpb25zKAorICAgICAgICBQbGF0Zm9ybTo6dGFyZ2V0X29wdGlvbnMoKSwgICMgTGV0IHNjcmlwdCByZWNvZ25pemUgLS10YXJnZXQtb3MgYW5kIC0tdGFyZ2V0LWFyY2ggb3B0aW9ucy4KKyAgICAgICAgLi4uCisgICAgKTsKKyAgICAjIEluaXRpYWxpemUgdmFyaWFibHMgYWZ0ZXIgcGFyc2luZyBjb21tYW5kIGxpbmUuCisgICAgKCAkb3MsICRhcmNoLCAkcGxhdGZvcm0gKSA9ICggUGxhdGZvcm06OnRhcmdldF9vcygpLCBQbGF0Zm9ybTo6dGFyZ2V0X2FyY2goKSwgUGxhdGZvcm06OnRhcmdldF9wbGF0Zm9ybSgpICk7CisKKz1iYWNrCisKKz1oZWFkMiBWYXJpYWJsZXMKKworPWl0ZW0gQjwkaG9zdF9hcmNoPgorCitDYW5vbml6ZWQgbmFtZSBvZiBob3N0IGFyY2hpdGVjdHVyZS4KKworPWl0ZW0gQjwkaG9zdF9vcz4KKworQ2Fub25pemVkIG5hbWUgb2YgaG9zdCBPUy4KKworPWl0ZW0gQjwkaG9zdF9wbGF0Zm9ybT4KKworSG9zdCBwbGF0Zm9ybSBuYW1lIChjb25jYXRlbmF0ZWQgY2Fub25pemVkIE9TIG5hbWUsIHVuZGVyc2NvcmUsIGFuZCBjYW5vbml6ZWQgYXJjaGl0ZWN0dXJlIG5hbWUpLgorCis9aXRlbSBCPCR0YXJnZXRfYXJjaD4KKworQ2Fub25pemVkIG5hbWUgb2YgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KKworPWl0ZW0gQjwkdGFyZ2V0X29zPgorCitDYW5vbml6ZWQgbmFtZSBvZiB0YXJnZXQgT1MuCisKKz1pdGVtIEI8JHRhcmdldF9wbGF0Zm9ybT4KKworVGFyZ2V0IHBsYXRmb3JtIG5hbWUgKGNvbmNhdGVuYXRlZCBjYW5vbml6ZWQgT1MgbmFtZSwgdW5kZXJzY29yZSwgYW5kIGNhbm9uaXplZCBhcmNoaXRlY3R1cmUgbmFtZSkuCisKKz1iYWNrCisKKz1jdXQKKworIyBlbmQgb2YgZmlsZSAjCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rvb2xzL2xpYi9VbmFtZS5wbSBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbGliL1VuYW1lLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NWUxZWUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC9ydW50aW1lL3Rvb2xzL2xpYi9VbmFtZS5wbQpAQCAtMCwwICsxLDYzOSBAQAorIworIyBUaGlzIGlzIG5vdCBhIHJ1bm5hYmxlIHNjcmlwdCwgaXQgaXMgYSBQZXJsIG1vZHVsZSwgYSBjb2xsZWN0aW9uIG9mIHZhcmlhYmxlcywgc3Vicm91dGluZXMsIGV0Yy4KKyMgVG8gZ2V0IGhlbHAgYWJvdXQgZXhwb3J0ZWQgdmFyaWFibGVzIGFuZCBzdWJyb3V0aW5lcywgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisjCisjICAgICBwZXJsZG9jIFVuYW1lLnBtCisjCisjIG9yIHNlZSBQT0QgKFBsYWluIE9sZCBEb2N1bWVudGF0aW9uKSBlbWJlZGRlZCB0byB0aGUgc291cmNlLi4uCisjCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKK3BhY2thZ2UgVW5hbWU7CisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2Ugd2FybmluZ3M6OnJlZ2lzdGVyOwordXNlIEV4cG9ydGVyOworCit1c2UgUE9TSVg7Cit1c2UgRmlsZTo6R2xvYiAiOmdsb2IiOwordXNlIE5ldDo6RG9tYWluIHF3e307CisKKyMgRm9sbG93aW5nIGNvZGUgZG9lcyBub3Qgd29yayB3aXRoIFBlcmwgNS42IG9uIExpbnV4KiBPUyBhbmQgV2luZG93cyogT1M6CisjCisjICAgICB1c2UgaWYgJF5PIGVxICJkYXJ3aW4iLCB0b29scyA9PiBxd3t9OworIworIyBUaGUgd29ya2Fyb3VuZCBmb3IgUGVybCA1LjY6CisjCitCRUdJTiB7CisgICAgaWYgKCAkXk8gZXEgImRhcndpbiIgb3IgJF5PIGVxICJsaW51eCIgKSB7CisJcmVxdWlyZSB0b29sczsKKyAgICAgICAgaW1wb3J0IHRvb2xzOworICAgIH07ICMgaWYKKyAgICBpZiAoICReTyBlcSAiTVNXaW4zMiIgKSB7CisgICAgICAgIHJlcXVpcmUgV2luMzI7CisgICAgfTsgIyBpZgorfTsgIyBCRUdJTgorCitteSAkbXN3aW4gPSBxcntcQSg/Ok1TV2luMzJ8V2luZG93c19OVClcen07CisKK215IEBwb3NpeCA9IHF3eyBrZXJuZWxfbmFtZSBmcWRuIGtlcm5lbF9yZWxlYXNlIGtlcm5lbF92ZXJzaW9uIG1hY2hpbmUgfTsKKyAgICAjIFByb3BlcnRpZXMgc3VwcG9ydGVkIGJ5IFBPU0lYOjp1bmFtZSgpLgorbXkgQGxpbnV4ID0KKyAgICBxd3sgcHJvY2Vzc29yIGhhcmR3YXJlX3BsYXRmb3JtIG9wZXJhdGluZ19zeXN0ZW0gfTsKKyAgICAjIFByb3BlcnRpZXMgcmVwb3J0ZWQgYnkgdW5hbWUgaW4gTGludXgqIE9TLgorbXkgQGJhc2UgPSAoIEBwb3NpeCwgQGxpbnV4ICk7CisgICAgIyBCYXNlIHByb3BlcnRpZXMuCitteSBAYXV4ID0KKyAgICAoCisgICAgICAgIHF3eyBob3N0X25hbWUgZG9tYWluX25hbWUgfSwKKyAgICAgICAgbWFwKCAib3BlcmF0aW5nX3N5c3RlbV8kXyIsIHF3eyBuYW1lIHJlbGVhc2UgY29kZW5hbWUgZGVzY3JpcHRpb24gfSApCisgICAgKTsKKyAgICAjIEF1eGlsaWFyeSBwcm9wZXJ0aWVzLgorbXkgQGFsbCA9ICggQGJhc2UsIEBhdXggKTsKKyAgICAjIEFsbCB0aGUgcHJvcGVydGllcy4KK215IEBtZXRhID0gcXd7IGJhc2VfbmFtZXMgYWxsX25hbWVzIHZhbHVlIH07CisgICAgIyBNZXRhIGZ1bmN0aW9ucy4KKworb3VyICRWRVJTSU9OICAgICA9ICIwLjA3IjsKK291ciBASVNBICAgICAgICAgPSBxd3sgRXhwb3J0ZXIgfTsKK291ciBARVhQT1JUICAgICAgPSBxd3t9Oworb3VyIEBFWFBPUlRfT0sgICA9ICggQGFsbCwgQG1ldGEgKTsKK291ciAlRVhQT1JUX1RBR1MgPQorICAgICgKKyAgICAgICAgYmFzZSA9PiBbIEBiYXNlIF0sCisgICAgICAgIGFsbCAgPT4gWyBAYWxsICBdLAorICAgICAgICBtZXRhID0+IFsgQG1ldGEgXSwKKyAgICApOworCitteSAldmFsdWVzOworICAgICMgSGFzaCBvZiB2YWx1ZXMuIFNvbWUgdmFsdWVzIGFyZSBzdHJpbmdzLCBzb21lIG1heSBiZSByZWZlcmVuY2VzIHRvIGNvZGUgd2hpY2ggc2hvdWxkIGJlCisgICAgIyBldmFsdWF0ZWQgdG8gZ2V0IHJlYWwgdmFsdWUuIFRoaXMgdHJpY2sgaXMgaW1wbGVtZW50ZWQgYmVjYXVzZSBjYWxsIHRvIE5ldDo6RG9tYWluOjpob3N0ZnFkbigpCisgICAgIyBpcyByZWxhdGl2ZWx5IHNsb3cuCisKKyMgR2V0IHZhbHVlcyBmcm9tIFBPU0lYOjp1bmFtZSgpLgorQHZhbHVlc3sgQHBvc2l4IH0gPSBQT1NJWDo6dW5hbWUoKTsKKworIyBPbiBzb21lIHN5c3RlbXMgUE9TSVg6OnVuYW1lKCkgcmV0dXJucyAic2hvcnQiIG5vZGUgbmFtZSAod2l0aG91dCBkb21haW4gbmFtZSkuIFRvIGJlIGNvbnNpc3RlbnQKKyMgb24gYWxsIHN5c3RlbXMsIHdlIHdpbGwgZ2V0IG5vZGUgbmFtZSBmcm9tIGFsdGVybmF0aXZlIHNvdXJjZS4KK2lmICggJF5PID1+IG0vY3lnd2luL2kgKSB7CisgICAgIyBGdW5jdGlvbiBmcm9tIE5ldDo6RG9tYWluIG1vZHVsZSB3b3JrcyB3ZWxsLCBidXQgb24gQ3lnd2luIGl0IHByaW50cyB0bworICAgICMgc3RkZXJyICJkb21haW5uYW1lOiBub3QgZm91bmQiLiBTbyB3ZSB3aWxsIHVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIG5vdy4KKyAgICAkdmFsdWVzeyBmcWRuIH0gPSBsYyggJEVOVnsgQ09NUFVURVJOQU1FIH0gLiAiLiIgLiAkRU5WeyBVU0VSRE5TRE9NQUlOIH0gKTsKK30gZWxzZSB7CisgICAgIyBPbiBzeXN0ZW1zIG90aGVyIHRoYW4gQ3lnd2luLCBsZXQgdXMgdXNlIE5ldDo6RG9tYWluOjpob3N0ZnFkbigpLCBidXQgZG8gaXQgb25seSBub2RlIG5hbWUKKyAgICAjIGlzIHJlYWxseSByZXF1ZXN0ZWQuCisgICAgJHZhbHVlc3sgZnFkbiB9ID0KKyAgICAgICAgc3ViIHsKKyAgICAgICAgICAgIG15ICRmcWRuID0gTmV0OjpEb21haW46Omhvc3RmcWRuKCk7ICMgImZxZG4iIHN0YW5kcyBmb3IgImZ1bGx5IHF1YWxpZmllZCBkb2FtYWluIG5hbWUiLgorICAgICAgICAgICAgIyBPbiBzb21lIHN5c3RlbXMgUE9TSVg6OnVuYW1lKCkgYW5kIE5ldDo6RG9tYWluOjpob3N0ZnFkbigpIHJlcG9ydHMgZGlmZmVyZW50IG5hbWVzLgorICAgICAgICAgICAgIyBMZXQgdXMgaXNzdWUgYSB3YXJuaW5nIGlmIHRoZXkgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQuIE5hbWVzIGFyZSBpbnNpZ25pZmljYW50bHkKKyAgICAgICAgICAgICMgZGlmZmVyZW50IGlmIFBPU0lYOjp1bmFtZSgpIG1hdGNoZXMgdGhlIGJlZ2lubmluZyBvZiBOZXQ6OkRvbWFpbjo6aG9zdGZxZG4oKS4KKyAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAkZnFkbiBlcSBzdWJzdHIoICRmcWRuLCAwLCBsZW5ndGgoICRmcWRuICkgKQorICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgICBsZW5ndGgoICRmcWRuICkgPT0gbGVuZ3RoKCAkZnFkbiApCisgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAgICAgICAgIHN1YnN0ciggJGZxZG4sIGxlbmd0aCggJGZxZG4gKSwgMSApIGVxICIuIgorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICMgT2suCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdhcm5pbmdzOjp3YXJuaWYoCisgICAgICAgICAgICAgICAgICAgICJQT1NJWDo6dW5hbWUoKSBhbmQgTmV0OjpEb21haW46Omhvc3RmcWRuKCkgcmVwb3J0ZWQgZGlmZmVyZW50IG5hbWVzOiAiIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICJcIiR2YWx1ZXN7IGZxZG4gfVwiIGFuZCBcIiRmcWRuXCIgcmVzcGVjdGl2ZWx5XG4iCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIHJldHVybiAkZnFkbjsKKyAgICAgICAgfTsgIyBzdWIKK307ICMgaWYKKworaWYgKCAkXk8gPX4gJG1zd2luICkgeworICAgIGlmICgKKyAgICAgICAgJHZhbHVlc3sgbWFjaGluZSB9ID1+IG17XEEoPzp4ODZ8WzU2XTg2KVx6fQorICAgICAgICBhbmQKKyAgICAgICAgZXhpc3RzKCAkRU5WeyBQUk9DRVNTT1JfQVJDSElURUNUVVJFIH0gKSBhbmQgJEVOVnsgUFJPQ0VTU09SX0FSQ0hJVEVDVFVSRSB9IGVxICJ4ODYiCisgICAgICAgIGFuZAorICAgICAgICBleGlzdHMoICRFTlZ7IFBST0NFU1NPUl9BUkNISVRFVzY0MzIgfSApCisgICAgKSB7CisgICAgICAgIGlmICggJEVOVnsgUFJPQ0VTU09SX0FSQ0hJVEVXNjQzMiB9IGVxICJBTUQ2NCIgKSB7CisgICAgICAgICAgICAkdmFsdWVzeyBtYWNoaW5lIH0gPSAieDg2XzY0IjsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKK307ICMgaWYKKworIyBTb21lIHZhbHVlcyBhcmUgbm90IHJldHVybmVkIGJ5IFBPU0lYOjp1bmFtZSgpLCBsZXQgdXMgY29tcHV0ZSB0aGVtLgorCisjIHByb2Nlc3Nvci4KKyR2YWx1ZXN7IHByb2Nlc3NvciB9ID0gJHZhbHVlc3sgbWFjaGluZSB9OworCisjIGhhcmR3YXJlX3BsYXRmb3JtLgoraWYgKCAwICkgeworfSBlbHNpZiAoICReTyBlcSAibGludXgiIG9yICReTyBlcSAiZnJlZWJzZCIgb3IgJF5PIGVxICJuZXRic2QiICkgeworICAgIGlmICggMCApIHsKKyAgICB9IGVsc2lmICggJHZhbHVlc3sgbWFjaGluZSB9ID1+IG17XEFpWzM0NTZdODZcen0gKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAiaTM4NiI7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSA9fiBte1xBKHg4Nl82NHxhbWQ2NClcen0gKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAieDg2XzY0IjsKKyAgICB9IGVsc2lmICggJHZhbHVlc3sgbWFjaGluZSB9ID1+IG17XEFhcm12N1xEKlx6fSApIHsKKyAgICAgICAgJHZhbHVlc3sgaGFyZHdhcmVfcGxhdGZvcm0gfSA9ICJhcm0iOworICAgIH0gZWxzaWYgKCAkdmFsdWVzeyBtYWNoaW5lIH0gPX4gbXtcQXBwYzY0bGVcen0gKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAicHBjNjRsZSI7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSA9fiBte1xBcHBjNjRcen0gKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAicHBjNjQiOworICAgIH0gZWxzaWYgKCAkdmFsdWVzeyBtYWNoaW5lIH0gPX4gbXtcQWFhcmNoNjRcen0gKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAiYWFyY2g2NCI7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSA9fiBte1xBbWlwczY0XHp9ICkgeworICAgICAgICAkdmFsdWVzeyBoYXJkd2FyZV9wbGF0Zm9ybSB9ID0gIm1pcHM2NCI7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSA9fiBte1xBbWlwc1x6fSApIHsKKyAgICAgICAgJHZhbHVlc3sgaGFyZHdhcmVfcGxhdGZvcm0gfSA9ICJtaXBzIjsKKyAgICB9IGVsc2UgeworICAgICAgICBkaWUgIlVuc3VwcG9ydGVkIG1hY2hpbmUgKFwiJHZhbHVlc3sgbWFjaGluZSB9XCIpIHJldHVybmVkIGJ5IFBPU0lYOjp1bmFtZSgpOyBzdG9wcGVkIjsKKyAgICB9OyAjIGlmCit9IGVsc2lmICggJF5PIGVxICJkYXJ3aW4iICkgeworICAgIGlmICggMCApIHsKKyAgICB9IGVsc2lmICggJHZhbHVlc3sgbWFjaGluZSB9IGVxICJ4ODYiIG9yICR2YWx1ZXN7IG1hY2hpbmUgfSBlcSAiaTM4NiIgKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPQorICAgICAgICAgICAgc3ViIHsKKyAgICAgICAgICAgICAgICBteSAkcGxhdGZvcm0gPSAiaTM4NiI7CisgICAgICAgICAgICAgICAgIyBTb21lIE9TZXMgb24gSW50ZWwoUikgNjQgc3RpbGwgcmVwb3J0cyAiaTM4NiIgbWFjaGluZS4gVmVyaWZ5IGl0IGJ5IHVzaW5nCisgICAgICAgICAgICAgICAgIyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgJ3N5c2N0bCAtbiBody5vcHRpb25hbC54ODZfNjQnLiBPbiBJbnRlbChSKSA2NC1iaXQgc3lzdGVtcyB0aGUKKyAgICAgICAgICAgICAgICAjIHZhbHVlID09IDE7IG9uIDMyLWJpdCBzeXN0ZW1zIHRoZSAnaHcub3B0aW9uYWwueDg2XzY0JyBwcm9wZXJ0eSBlaXRoZXIgZG9lcyBub3QgZXhpc3QKKyAgICAgICAgICAgICAgICAjIG9yIHRoZSB2YWx1ZSA9PSAwLiBUaGUgcGF0aCB2YXJpYWJsZSBkb2VzIG5vdCBjb250YWluIGEgcGF0aCB0byBzeXNjdGwgd2hlbgorICAgICAgICAgICAgICAgICMgc3RhcnRlZCBieSBjcm9udGFiLgorICAgICAgICAgICAgICAgIG15ICRzeXNjdGwgPSAoIHdoaWNoKCAic3lzY3RsIiApIG9yICIvdXNyL3NiaW4vc3lzY3RsIiApOworICAgICAgICAgICAgICAgIG15ICRvdXRwdXQ7CisgICAgICAgICAgICAgICAgZGVidWcoICJFeGVjdXRpbmcgJHN5c2N0bC4uLiIgKTsKKyAgICAgICAgICAgICAgICBleGVjdXRlKCBbICRzeXNjdGwsICItbiIsICJody5vcHRpb25hbC54ODZfNjQiIF0sIC1zdGRvdXQgPT4gXCRvdXRwdXQsIC1zdGRlcnIgPT4gdW5kZWYgKTsKKyAgICAgICAgICAgICAgICBjaG9tcCggJG91dHB1dCApOworICAgICAgICAgICAgICAgIGlmICggMCApIHsKKyAgICAgICAgICAgICAgICB9IGVsc2lmICggIiRvdXRwdXQiIGVxICIiIG9yICIkb3V0cHV0IiBlcSAiMCIgKSB7CisgICAgICAgICAgICAgICAgICAgICRwbGF0Zm9ybSA9ICJpMzg2IjsKKyAgICAgICAgICAgICAgICB9IGVsc2lmICggIiRvdXRwdXQiIGVxICIxIiApIHsKKyAgICAgICAgICAgICAgICAgICAgJHBsYXRmb3JtID0gIng4Nl82NCI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGllICJVbnN1cHBvcnRlZCB2YWx1ZSAoXCIkb3V0cHV0XCIpIHJldHVybmVkIGJ5IFwiJHN5c2N0bCAtbiBody5vcHRpb25hbC54ODZfNjRcIjsgc3RvcHBlZCI7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgIHJldHVybiAkcGxhdGZvcm07CisgICAgICAgICAgICB9OyAjIHN1YiB7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSBlcSAieDg2XzY0IiApIHsKKwkjIFNvbWUgT1MgWCogdmVyc2lvbnMgcmVwb3J0ICJ4ODZfNjQiLgorCSR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAieDg2XzY0IjsKKyAgICB9IGVsc2UgeworICAgICAgICBkaWUgIlVuc3VwcG9ydGVkIG1hY2hpbmUgKFwiJHZhbHVlc3sgbWFjaGluZSB9XCIpIHJldHVybmVkIGJ5IFBPU0lYOjp1bmFtZSgpOyBzdG9wcGVkIjsKKyAgICB9OyAjIGlmCit9IGVsc2lmICggJF5PID1+ICRtc3dpbiApIHsKKyAgICBpZiAoIDAgKSB7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSA9fiBte1xBKD86eDg2fFs1Nl04Nilcen0gKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAiaTM4NiI7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSBlcSAieDg2XzY0IiBvciAkdmFsdWVzeyBtYWNoaW5lIH0gZXEgImFtZDY0IiApIHsKKyAgICAgICAgIyBBY3RpdmVQZXJsIGZvciBJQS0zMiBhcmNoaXRlY3R1cmUgcmV0dXJucyAieDg2XzY0Iiwgd2hpbGUgQWN0aXZlUGVybCBmb3IgSW50ZWwoUikgNjQgcmV0dXJucyAiYW1kNjQiLgorICAgICAgICAkdmFsdWVzeyBoYXJkd2FyZV9wbGF0Zm9ybSB9ID0gIng4Nl82NCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGllICJVbnN1cHBvcnRlZCBtYWNoaW5lIChcIiR2YWx1ZXN7IG1hY2hpbmUgfVwiKSByZXR1cm5lZCBieSBQT1NJWDo6dW5hbWUoKTsgc3RvcHBlZCI7CisgICAgfTsgIyBpZgorfSBlbHNpZiAoICReTyBlcSAiY3lnd2luIiApIHsKKyAgICBpZiAoIDAgKSB7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSA9fiBte1xBaVszNDU2XTg2XHp9ICkgeworICAgICAgICAkdmFsdWVzeyBoYXJkd2FyZV9wbGF0Zm9ybSB9ID0gImkzODYiOworICAgIH0gZWxzaWYgKCAkdmFsdWVzeyBtYWNoaW5lIH0gZXEgIng4Nl82NCIgKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAieDg2XzY0IjsKKyAgICB9IGVsc2UgeworICAgICAgICBkaWUgIlVuc3VwcG9ydGVkIG1hY2hpbmUgKFwiJHZhbHVlc3sgbWFjaGluZSB9XCIpIHJldHVybmVkIGJ5IFBPU0lYOjp1bmFtZSgpOyBzdG9wcGVkIjsKKyAgICB9OyAjIGlmCit9IGVsc2UgeworICAgIGRpZSAiVW5zdXBwb3J0ZWQgT1MgKFwiJF5PXCIpOyBzdG9wcGVkIjsKK307ICMgaWYKKworIyBvcGVyYXRpbmdfc3lzdGVtLgoraWYgKCAwICkgeworfSBlbHNpZiAoICR2YWx1ZXN7IGtlcm5lbF9uYW1lIH0gZXEgIkxpbnV4IiApIHsKKyAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtIH0gPSAiR05VL0xpbnV4IjsKKyAgICBteSAkcmVsZWFzZTsgICAgIyBOYW1lIG9mIGNob3NlbiAiKi1yZWxlYXNlIiBmaWxlLgorICAgIG15ICRidWxrOyAgICAgICAjIENvbnRlbnQgb2YgcmVsZWFzZSBmaWxlLgorICAgICMgT24gVWJ1bnR1LCBsc2ItcmVsZWFzZSBpcyBxdWl0ZSBpbmZvcm1hdGl2ZSwgZS4gZy46CisgICAgIyAgICAgRElTVFJJQl9JRD1VYnVudHUKKyAgICAjICAgICBESVNUUklCX1JFTEVBU0U9OS4wNAorICAgICMgICAgIERJU1RSSUJfQ09ERU5BTUU9amF1bnR5CisgICAgIyAgICAgRElTVFJJQl9ERVNDUklQVElPTj0iVWJ1bnR1IDkuMDQiCisgICAgIyBUcnkgbHNiLXJlbGVhc2UgZmlyc3QuIEJ1dCBvbiBzb21lIG9sZGVyIHN5c3RlbXMgbHNiLXJlbGVhc2UgaXMgbm90IGluZm9ybWF0aXZlLgorICAgICMgSXQgbWF5IGNvbnRhaW4ganVzdCBvbmUgbGluZToKKyAgICAjICAgICBMU0JfVkVSU0lPTj0iMS4zIgorICAgICRyZWxlYXNlID0gIi9ldGMvbHNiLXJlbGVhc2UiOworICAgIGlmICggLWUgJHJlbGVhc2UgKSB7CisgICAgICAgICRidWxrID0gcmVhZF9maWxlKCAkcmVsZWFzZSApOworICAgIH0gZWxzZSB7CisgICAgICAgICRidWxrID0gIiI7CisgICAgfTsgIyBpZgorICAgIGlmICggJGJ1bGsgPX4gbXteRElTVFJJQl99ICkgeworICAgICAgICAjIE9rLCB0aGlzIGxzYi1yZWxlYXNlIGlzIGluZm9ybWF0aXZlLgorICAgICAgICAkYnVsayA9fiBte15ESVNUUklCX0lEXHMqPVxzKiguKj8pXHMqJH1tCisgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6IFRoZXJlIGlzIG5vIERJU1RSSUJfSUQ6IiwgJGJ1bGssICIoZW9mKSIgKTsKKyAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9uYW1lIH0gPSAkMTsKKyAgICAgICAgJGJ1bGsgPX4gbXteRElTVFJJQl9SRUxFQVNFXHMqPVxzKiguKj8pXHMqJH1tCisgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6IFRoZXJlIGlzIG5vIERJU1RSSUJfUkVMRUFTRToiLCAkYnVsaywgIihlb2YpIiApOworICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX3JlbGVhc2UgfSA9ICQxOworICAgICAgICAkYnVsayA9fiBte15ESVNUUklCX0NPREVOQU1FXHMqPVxzKiguKj8pXHMqJH1tCisgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6IFRoZXJlIGlzIG5vIERJU1RSSUJfQ09ERU5BTUU6IiwgJGJ1bGssICIoZW9mKSIgKTsKKyAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9jb2RlbmFtZSB9ID0gJDE7CisgICAgICAgICRidWxrID1+IG17XkRJU1RSSUJfREVTQ1JJUFRJT05ccyo9Ij9ccyooLio/KSI/XHMqJH1tCisgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6IFRoZXJlIGlzIG5vIERJU1RSSUJfREVTQ1JJUFRJT046IiwgJGJ1bGssICIoZW9mKSIgKTsKKyAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9kZXNjcmlwdGlvbiB9ID0gJDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgIyBPb3BzLiBsc2ItcmVsZWFzZSBpcyBtaXNzZWQgb3Igbm90IGluZm9ybWF0aXZlLiBUcnkgb3RoZXIgKi1yZWxlYXNlIGZpbGVzLgorICAgICAgICAkcmVsZWFzZSA9ICIvZXRjL3N5c3RlbS1yZWxlYXNlIjsKKyAgICAgICAgaWYgKCBub3QgLWUgJHJlbGVhc2UgKSB7ICAgICMgVXNlIC9ldGMvc3lzdGVtLXJlbGVhc2UiIGlmIHN1Y2ggZmlsZSBleGlzdHMuCisgICAgICAgICAgICAjIE90aGVyd2lzZSB0cnkgb3RoZXIgIi9ldGMvKi1yZWxlYXNlIiBmaWxlcywgYnV0IGlnbm9yZSAiL2V0Yy9sc2ItcmVsZWFzZSIuCisgICAgICAgICAgICBteSBAcmVsZWFzZXMgPSBncmVwKCAkXyBuZSAiL2V0Yy9sc2ItcmVsZWFzZSIsIGJzZF9nbG9iKCAiL2V0Yy8qLXJlbGVhc2UiICkgKTsKKyAgICAgICAgICAgICMgT24gc29tZSBGZWRvcmEgc3lzdGVtcyB0aGVyZSBhcmUgdHdvIGZpbGVzOiBmZWRvcmEtcmVsZWFzZSBhbmQgcmVkaGF0LXJlbGVhc2UKKyAgICAgICAgICAgICMgd2l0aCBpZGVudGljYWwgY29udGVudC4gSWYgZmVkb3JhLXJlbGVhc2UgcHJlc2VudCwgaWdub3JlIHJlZGphdC1yZWxlYXNlLgorICAgICAgICAgICAgaWYgKCBncmVwKCAkXyBlcSAiL2V0Yy9mZWRvcmEtcmVsZWFzZSIsIEByZWxlYXNlcyApICkgeworICAgICAgICAgICAgICAgIEByZWxlYXNlcyA9IGdyZXAoICRfIG5lICIvZXRjL3JlZGhhdC1yZWxlYXNlIiwgQHJlbGVhc2VzICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICBpZiAoIEByZWxlYXNlcyA9PSAxICkgeworICAgICAgICAgICAgICAgICRyZWxlYXNlID0gJHJlbGVhc2VzWyAwIF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICggQHJlbGVhc2VzID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICMgTm8gKi1yZWxlYXNlIGZpbGVzIGZvdW5kLCB0cnkgZGViaWFuX3ZlcnNpb24uCisgICAgICAgICAgICAgICAgICAgICRyZWxlYXNlID0gIi9ldGMvZGViaWFuX3ZlcnNpb24iOworICAgICAgICAgICAgICAgICAgICBpZiAoIG5vdCAtZSAkcmVsZWFzZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRyZWxlYXNlID0gdW5kZWY7CisgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCAiTm8gcmVsZWFzZSBmaWxlcyBmb3VuZCBpbiBcIi9ldGMvXCIgZGlyZWN0b3J5LiIgKTsKKyAgICAgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRyZWxlYXNlID0gdW5kZWY7CisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoICJNb3JlIHRoYW4gb25lIHJlbGVhc2UgZmlsZXMgZm91bmQgaW4gXCIvZXRjL1wiIGRpcmVjdG9yeToiLCBAcmVsZWFzZXMgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkcmVsZWFzZSApICkgeworICAgICAgICAgICAgJGJ1bGsgPSByZWFkX2ZpbGUoICRyZWxlYXNlICk7CisgICAgICAgICAgICBpZiAoICRyZWxlYXNlID1+IG17c3lzdGVtfHJlZGhhdHxmZWRvcmF9ICkgeworICAgICAgICAgICAgICAgICMgUmVkIEhhdCBvciBGZWRvcmEuIFBhcnNlIHRoZSBmaXJzdCBsaW5lIG9mIGZpbGUuCisgICAgICAgICAgICAgICAgIyBUeXBpY2FsIHZhbHVlcyBvZiAqLXJlbGVhc2UgKG9uZSBvZik6CisgICAgICAgICAgICAgICAgIyAgICAgUmVkIEhhdCBFbnRlcnByaXNlIExpbnV4KiBPUyBTZXJ2ZXIgcmVsZWFzZSA1LjIgKFRpa2FuZ2EpCisgICAgICAgICAgICAgICAgIyAgICAgUmVkIEhhdCBFbnRlcnByaXNlIExpbnV4KiBPUyBBUyByZWxlYXNlIDMgKFRhcm9vbiBVcGRhdGUgNCkKKyAgICAgICAgICAgICAgICAjICAgICBGZWRvcmEgcmVsZWFzZSAxMCAoQ2FtYnJpZGdlKQorICAgICAgICAgICAgICAgICRidWxrID1+IG17XEEoLiopJH1tCisgICAgICAgICAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICIkcmVsZWFzZTogQ2Fubm90IGZpbmQgdGhlIGZpcnN0IGxpbmU6IiwgJGJ1bGssICIoZW9mKSIgKTsKKyAgICAgICAgICAgICAgICBteSAkZmlyc3RfbGluZSA9ICQxOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fZGVzY3JpcHRpb24gfSA9ICRmaXJzdF9saW5lOworICAgICAgICAgICAgICAgICRmaXJzdF9saW5lID1+IG17XEEoLio/KVxzK3JlbGVhc2VccysoLio/KSg/OlxzK1woKC4qPykoPzpccytVcGRhdGVccysoLio/KSk/XCkpP1xzKiR9CisgICAgICAgICAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICIkcmVsZWFzZToxOiBDYW5ub3QgcGFyc2UgbGluZToiLCAkZmlyc3RfbGluZSApOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fbmFtZSAgICB9ICA9ICQxOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fcmVsZWFzZSB9ICA9ICQyIC4gKCBkZWZpbmVkKCAkNCApID8gIi4kNCIgOiAiIiApOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fY29kZW5hbWUgfSA9ICQzOworICAgICAgICAgICAgfSBlbHNpZiAoICRyZWxlYXNlID1+IG17U3VTRX0gKSB7CisgICAgICAgICAgICAgICAgIyBUeXBpY2FsIFN1U0UtcmVsZWFzZToKKyAgICAgICAgICAgICAgICAjICAgICBTVVNFIExpbnV4KiBPUyBFbnRlcnByaXNlIFNlcnZlciAxMCAoeDg2XzY0KQorICAgICAgICAgICAgICAgICMgICAgIFZFUlNJT04gPSAxMAorICAgICAgICAgICAgICAgICMgICAgIFBBVENITEVWRUwgPSAyCisgICAgICAgICAgICAgICAgJGJ1bGsgPX4gbXtcQSguKikkfW0KKyAgICAgICAgICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIiRyZWxlYXNlOiBDYW5ub3QgZmluZCB0aGUgZmlyc3QgbGluZToiLCAkYnVsaywgIihlb2YpIiApOworICAgICAgICAgICAgICAgIG15ICRmaXJzdF9saW5lID0gJDE7CisgICAgICAgICAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9kZXNjcmlwdGlvbiB9ID0gJGZpcnN0X2xpbmU7CisgICAgICAgICAgICAgICAgJGZpcnN0X2xpbmUgPX4gbXteKC4qPylccyooXGQrKVxzKlwoLio/XClccyokfQorICAgICAgICAgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6MTogQ2Fubm90IHBhcnNlIGxpbmU6IiwgJGZpcnN0X2xpbmUgKTsKKyAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX25hbWUgfSA9ICQxOworICAgICAgICAgICAgICAgICRidWxrID1+IG17XlZFUlNJT05ccyo9XHMqKC4qKVxzKiR9bQorICAgICAgICAgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6IFRoZXJlIGlzIG5vIFZFUlNJT046IiwgJGJ1bGssICIoZW9mKSIgKTsKKyAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX3JlbGVhc2UgfSA9ICQxOworICAgICAgICAgICAgICAgIGlmICggJGJ1bGsgPX4gbXteUEFUQ0hMRVZFTFxzKj1ccyooLiopXHMqJH1tICkgeworICAgICAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX3JlbGVhc2UgfSAuPSAiLiQxIjsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICB9IGVsc2lmICggJHJlbGVhc2UgPX4gbXtkZWJpYW5fdmVyc2lvbn0gKSB7CisgICAgICAgICAgICAgICAgIyBEZWJpYW4uIFRoZSBmaWxlIGRlYmlhbl92ZXJzaW9uIGNvbnRhaW5zIGp1c3QgdmVyc2lvbiBudW1iZXIsIG5vdGhpbmcgbW9yZToKKyAgICAgICAgICAgICAgICAjICAgICA0LjAKKyAgICAgICAgICAgICAgICBteSAkbmFtZSA9ICJEZWJpYW4iOworICAgICAgICAgICAgICAgICRidWxrID1+IG17XEEoLiopJH1tCisgICAgICAgICAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICIkcmVsZWFzZTogQ2Fubm90IGZpbmQgdGhlIGZpcnN0IGxpbmU6IiwgJGJ1bGssICIoZW9mKSIgKTsKKyAgICAgICAgICAgICAgICBteSAkdmVyc2lvbiA9ICQxOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fbmFtZSAgICAgICAgfSA9ICRuYW1lOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fcmVsZWFzZSAgICAgfSA9ICR2ZXJzaW9uOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fY29kZW5hbWUgICAgfSA9ICJ1bmtub3duIjsKKyAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX2Rlc2NyaXB0aW9uIH0gPSBzcHJpbnRmKCAiJXMgJXMiLCAkbmFtZSwgJHZlcnNpb24gKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX25hbWUgfSApICkgeworICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX25hbWUgfSA9ICJHTlUvTGludXgiOworICAgIH07ICMgaWYKK30gZWxzaWYgKCAkdmFsdWVzeyBrZXJuZWxfbmFtZSB9IGVxICJEYXJ3aW4iICkgeworICAgIG15ICVjb2RlbmFtZXMgPSAoCisgICAgICAgIDEwLjQgPT4gIlRpZ2VyIiwKKyAgICAgICAgMTAuNSA9PiAiTGVvcGFyZCIsCisgICAgICAgIDEwLjYgPT4gIlNub3cgTGVvcGFyZCIsCisgICAgKTsKKyAgIG15ICRkYXJ3aW47CisgICBteSAkZ2V0X29zX2luZm8gPQorICAgICAgIHN1YiB7CisgICAgICAgICAgIG15ICggJG5hbWUgKSA9IEBfOworICAgICAgICAgICBpZiAoIG5vdCBkZWZpbmVkICRkYXJ3aW4gKSB7CisgICAgICAgICAgICAgICAkZGFyd2luLT57IG9wZXJhdGluZ19zeXN0ZW0gfSA9ICJEYXJ3aW4iOworICAgICAgICAgICAgICAgIyBzd192ZXJzIHByaW50cyBPUyBYKiB2ZXJzaW9uIHRvIHN0ZG91dDoKKyAgICAgICAgICAgICAgICMgICAgIFByb2R1Y3ROYW1lOiAgICAgICBPUyBYKgorICAgICAgICAgICAgICAgIyAgICAgUHJvZHVjdFZlcnNpb246ICAgIDEwLjQuMTEKKyAgICAgICAgICAgICAgICMgICAgIEJ1aWxkVmVyc2lvbjogICAgICA4UzIxNjcKKyAgICAgICAgICAgICAgICMgSXQgZG9lcyBub3QgcHJpbnQgY29kZW5hbWUsIHNvIHdlIGNvZGUgT1MgWCogY29kZW5hbWVzIGhlcmUuCisgICAgICAgICAgICAgICBteSAkc3dfdmVycyA9IHdoaWNoKCAic3dfdmVycyIgKSB8fCAiL3Vzci9iaW4vc3dfdmVycyI7CisgICAgICAgICAgICAgICBteSAkb3V0cHV0OworICAgICAgICAgICAgICAgZGVidWcoICJFeGVjdXRpbmcgJHN3X3ZlcnMuLi4iICk7CisgICAgICAgICAgICAgICBleGVjdXRlKCBbICRzd192ZXJzIF0sIC1zdGRvdXQgPT4gXCRvdXRwdXQsIC1zdGRlcnIgPT4gdW5kZWYgKTsKKyAgICAgICAgICAgICAgICRvdXRwdXQgPX4gbXteUHJvZHVjdE5hbWU6XHMqKC4qKVxzKiR9bQorICAgICAgICAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICJUaGVyZSBpcyBubyBQcm9kdWN0TmFtZSBpbiBzd192ZXJzIG91dHB1dDoiLCAkb3V0cHV0LCAiKGVvZikiICk7CisgICAgICAgICAgICAgICBteSAkbmFtZSA9ICQxOworICAgICAgICAgICAgICAgJG91dHB1dCA9fiBte15Qcm9kdWN0VmVyc2lvbjpccyooLiopXHMqJH1tCisgICAgICAgICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIlRoZXJlIGlzIG5vIFByb2R1Y3RWZXJzaW9uIGluIHN3X3ZlcnMgb3V0cHV0OiIsICRvdXRwdXQsICIoZW9mKSIgKTsKKyAgICAgICAgICAgICAgIG15ICRyZWxlYXNlID0gJDE7CisgICAgICAgICAgICAgICAjIFNvbWV0aW1lcyByZWxlYXNlIHJlcG9ydGVkIGFzICIxMC40LjExIiAoMyBjb21wb25lbnRlcyksIHNvbWV0aW1lcyBhcyAiMTAuNiIuCisgICAgICAgICAgICAgICAjIEhhbmRsZSBib3RoIHZhcmlhbnRzLgorICAgICAgICAgICAgICAgJHJlbGVhc2UgPX4gbXteKFxkKy5cZCspKD86XC5cZCspPyg/PVxzfCQpfQorICAgICAgICAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICJDYW5ub3QgcGFyc2UgT1MgWCogdmVyc2lvbjogJHJlbGVhc2UiICk7CisgICAgICAgICAgICAgICBteSAkdmVyc2lvbiA9ICQxOworICAgICAgICAgICAgICAgbXkgJGNvZGVuYW1lID0gKCAkY29kZW5hbWVzeyAkdmVyc2lvbiB9IG9yICJ1bmtub3duIiApOworICAgICAgICAgICAgICAgJGRhcndpbi0+eyBvcGVyYXRpbmdfc3lzdGVtX25hbWUgICAgICAgIH0gPSAkbmFtZTsKKyAgICAgICAgICAgICAgICRkYXJ3aW4tPnsgb3BlcmF0aW5nX3N5c3RlbV9yZWxlYXNlICAgICB9ID0gJHJlbGVhc2U7CisgICAgICAgICAgICAgICAkZGFyd2luLT57IG9wZXJhdGluZ19zeXN0ZW1fY29kZW5hbWUgICAgfSA9ICRjb2RlbmFtZTsKKyAgICAgICAgICAgICAgICRkYXJ3aW4tPnsgb3BlcmF0aW5nX3N5c3RlbV9kZXNjcmlwdGlvbiB9ID0gc3ByaW50ZiggIiVzICVzICglcykiLCAkbmFtZSwgJHJlbGVhc2UsICRjb2RlbmFtZSApOworICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgIHJldHVybiAkZGFyd2luLT57ICRuYW1lIH07CisgICAgICAgfTsgIyBzdWIKKyAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtICAgICAgICAgICAgIH0gPSBzdWIgeyAkZ2V0X29zX2luZm8tPiggIm9wZXJhdGluZ19zeXN0ZW0iICAgICAgICAgICAgICk7IH07CisgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9uYW1lICAgICAgICB9ID0gc3ViIHsgJGdldF9vc19pbmZvLT4oICJvcGVyYXRpbmdfc3lzdGVtX25hbWUiICAgICAgICApOyB9OworICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fcmVsZWFzZSAgICAgfSA9IHN1YiB7ICRnZXRfb3NfaW5mby0+KCAib3BlcmF0aW5nX3N5c3RlbV9yZWxlYXNlIiAgICAgKTsgfTsKKyAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX2NvZGVuYW1lICAgIH0gPSBzdWIgeyAkZ2V0X29zX2luZm8tPiggIm9wZXJhdGluZ19zeXN0ZW1fY29kZW5hbWUiICAgICk7IH07CisgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9kZXNjcmlwdGlvbiB9ID0gc3ViIHsgJGdldF9vc19pbmZvLT4oICJvcGVyYXRpbmdfc3lzdGVtX2Rlc2NyaXB0aW9uIiApOyB9OworfSBlbHNpZiAoICR2YWx1ZXN7IGtlcm5lbF9uYW1lIH0gPX4gbXtcQVdpbmRvd3NbIF9dTlRcen0gKSB7CisgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbSB9ID0gIk1TIFdpbmRvd3MiOworICAgICMgbXkgQG9zX25hbWUgPSBXaW4zMjo6R2V0T1NOYW1lKCk7CisgICAgIyAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX3JlbGVhc2UgfSA9ICRvc19uYW1lWyAwIF07CisgICAgIyAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX3VwZGF0ZSAgfSA9ICRvc19uYW1lWyAxIF07Cit9IGVsc2lmICggJHZhbHVlc3sga2VybmVsX25hbWUgfSA9fiBte1xBQ1lHV0lOX05ULX0gKSB7CisgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbSB9ID0gIk1TIFdpbmRvd3MiOworfSBlbHNpZiAoICR2YWx1ZXN7IGtlcm5lbF9uYW1lIH0gPX4gbXtcQUZyZWVCU0R9ICkgeworICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW0gfSA9ICJGcmVlQlNEIjsKK30gZWxzaWYgKCAkdmFsdWVzeyBrZXJuZWxfbmFtZSB9ID1+IG17XEFOZXRCU0R9ICkgeworICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW0gfSA9ICJOZXRCU0QiOworfSBlbHNlIHsKKyAgICBkaWUgIlVuc3VwcG9ydGVkIGtlcm5lbF9uYW1lIChcIiR2YWx1ZXN7IGtlcm5lbF9uYW1lIH1cIikgcmV0dXJuZWQgYnkgUE9TSVg6OnVuYW1lKCk7IHN0b3BwZWQiOworfTsgIyBpZgorCisjIGhvc3RfbmFtZSBhbmQgZG9tYWluX25hbWUKKyR2YWx1ZXN7IGhvc3RfbmFtZSB9ID0KKyAgICBzdWIgeworICAgICAgICBteSAkZnFkbiA9IHZhbHVlKCAiZnFkbiIgKTsKKyAgICAgICAgJGZxZG4gPX4gbXtcQShbXi5dKikoPzpcLiguKikpP1x6fTsKKyAgICAgICAgbXkgJGhvc3RfbmFtZSA9ICQxOworICAgICAgICBpZiAoIG5vdCBkZWZpbmVkKCAkaG9zdF9uYW1lICkgb3IgJGhvc3RfbmFtZSBlcSAiIiApIHsKKyAgICAgICAgICAgIGRpZSAiVW5leHBlY3RlZCBlcnJvcjogdW5kZWZpbmVkIG9yIGVtcHR5IGhvc3QgbmFtZTsgc3RvcHBlZCI7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgcmV0dXJuICRob3N0X25hbWU7CisgICAgfTsKKyR2YWx1ZXN7IGRvbWFpbl9uYW1lIH0gPQorICAgIHN1YiB7CisgICAgICAgIG15ICRmcWRuID0gdmFsdWUoICJmcWRuIiApOworICAgICAgICAkZnFkbiA9fiBte1xBKFteLl0qKSg/OlwuKC4qKSk/XHp9OworICAgICAgICBteSAkZG9tYWluX25hbWUgPSAkMjsKKyAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJGRvbWFpbl9uYW1lICkgb3IgJGRvbWFpbl9uYW1lIGVxICIiICkgeworICAgICAgICAgICAgZGllICJVbmV4cGVjdGVkIGVycm9yOiB1bmRlZmluZWQgb3IgZW1wdHkgZG9tYWluIG5hbWU7IHN0b3BwZWQiOworICAgICAgICB9OyAjIGlmCisgICAgICAgIHJldHVybiAkZG9tYWluX25hbWU7CisgICAgfTsKKworIyBSZXBsYWNlIHVuZGVmaW5lZCB2YWx1ZXMgd2l0aCAidW5rbm93biIuCitmb3JlYWNoIG15ICRuYW1lICggQGFsbCApIHsKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkdmFsdWVzeyAkbmFtZSB9ICkgKSB7CisgICAgICAgICR2YWx1ZXN7ICRuYW1lIH0gPSAidW5rbm93biI7CisgICAgfTsgIyBpZgorfTsgIyBmb3JlYWNoICRuYW1lCisKKyMgRXhwb3J0IGZ1bmN0aW9ucyByZXBvcnRpbmcgcHJvcGVydGllcy4KK2ZvcmVhY2ggbXkgJG5hbWUgKCBAYWxsICkgeworICAgIG5vIHN0cmljdCAicmVmcyI7CisgICAgKiRuYW1lID0gc3ViIHsgcmV0dXJuIHZhbHVlKCAkbmFtZSApOyB9OworfTsgIyBmb3JlYWNoICRuYW1lCisKKyMgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGJhc2UgbmFtZXMuCitzdWIgYmFzZV9uYW1lcyB7CisgICAgcmV0dXJuIEBiYXNlOworfTsgIyBzdWIgYmFzZV9uYW1lcworCisjIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbGwgdGhlIG5hbWVzLgorc3ViIGFsbF9uYW1lcyB7CisgICAgcmV0dXJuIEBhbGw7Cit9OyAjIHN1YiBhbGxfbmFtZXMKKworIyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdmFsdWUgYnkgdGhlIHNwZWNpZmllZCBuYW1lLgorc3ViIHZhbHVlKCQpIHsKKyAgICBteSAkbmFtZSA9IHNoaWZ0KCBAXyApOworICAgIGlmICggcmVmKCAkdmFsdWVzeyAkbmFtZSB9ICkgKSB7CisgICAgICAgIG15ICR2YWx1ZSA9ICR2YWx1ZXN7ICRuYW1lIH0tPigpOworICAgICAgICAkdmFsdWVzeyAkbmFtZSB9ID0gJHZhbHVlOworICAgIH07ICMgaWYKKyAgICByZXR1cm4gJHZhbHVlc3sgJG5hbWUgfTsKK307ICMgc3ViIHZhbHVlCisKK3JldHVybiAxOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworQjxVbmFtZS5wbT4gLS0gQSBmZXcgc3Vicm91dGluZXMgdG8gZ2V0IHN5c3RlbSBpbmZvcm1hdGlvbiB1c3VhbGx5IHByb3ZpZGVkIGJ5CitDPC9iaW4vdW5hbWU+IGFuZCBDPFBPU0lYOjp1bmFtZSgpPi4KKworPWhlYWQxIFNZTk9QU0lTCisKKyAgICB1c2UgVW5hbWU7CisKKyAgICAjIEJhc2UgcHJvcGVydHkgZnVuY3Rpb25zLgorICAgICRrZXJuZWxfbmFtZSAgICAgICA9IFVuYW1lOjprZXJuZWxfbmFtZSgpOworICAgICRmcWRuICAgICAgICAgICAgICA9IFVuYW1lOjpmcWRuKCk7CisgICAgJGtlcm5lbF9yZWxlYXNlICAgID0gVW5hbWU6Omtlcm5lbF9yZWxlYXNlKCk7CisgICAgJGtlcm5lbF92ZXJzaW9uICAgID0gVW5hbWU6Omtlcm5lbF92ZXJzaW9uKCk7CisgICAgJG1hY2hpbmUgICAgICAgICAgID0gVW5hbWU6Om1hY2hpbmUoKTsKKyAgICAkcHJvY2Vzc29yICAgICAgICAgPSBVbmFtZTo6cHJvY2Vzc29yKCk7CisgICAgJGhhcmR3YXJlX3BsYXRmb3JtID0gVW5hbWU6OmhhcmR3YXJlX3BsYXRmb3JtKCk7CisgICAgJG9wZXJhdGluZ19zeXN0ZW0gID0gVW5hbWU6Om9wZXJhdGluZ19zeXN0ZW0oKTsKKworICAgICMgQXV4aWxpYXJ5IHByb3BlcnR5IGZ1bmN0aW9ucy4KKyAgICAkaG9zdF9uYW1lICAgICAgICAgPSBVbmFtZTo6aG9zdF9uYW1lKCk7CisgICAgJGRvbWFpbl9uYW1lICAgICAgID0gVW5hbWU6OmRvbWFpbl9uYW1lKCk7CisgICAgJG9zX25hbWUgICAgICAgICAgID0gVW5hbWU6Om9wZXJhdGluZ19zeXN0ZW1fbmFtZSgpOworICAgICRvc19yZWxlYXNlICAgICAgICA9IFVuYW1lOjpvcGVyYXRpbmdfc3lzdGVtX3JlbGVhc2UoKTsKKyAgICAkb3NfY29kZW5hbWUgICAgICAgPSBVbmFtZTo6b3BlcmF0aW5nX3N5c3RlbV9jb2RlbmFtZSgpOworICAgICRvc19kZXNjcmlwdGlvbiAgICA9IFVuYW1lOjpvcGVyYXRpbmdfc3lzdGVtX2Rlc2NyaXB0aW9uKCk7CisKKyAgICAjIE1ldGEgZnVuY3Rpb25zLgorICAgIEBiYXNlX25hbWVzICA9IFVuYW1lOjpiYXNlX25hbWVzKCk7CisgICAgQGFsbF9uYW1lcyAgID0gVW5hbWU6OmFsbF9uYW1lcygpOworICAgICRrZXJuZWxfbmFtZSA9IFVuYW1lOjp2YWx1ZSggImtlcm5lbF9uYW1lIiApOworCis9aGVhZDEgREVTQ1JJUFRJT04KKworQjxVbmFtZS5wbT4gcmVzZW1ibGVzIGZ1bmN0aW9uYWxpdHkgZm91bmQgaW4gQzxQT1NJWDo6dW5hbWUoKT4gZnVuY3Rpb24gb3IgaW4gQzx1bmFtZT4gcHJvZ3JhbS4KK0hvd2V2ZXIsIGJvdGggQzxQT1NJWDo6dW5hbWUoKT4gYW5kIEM8L2Jpbi91bmFtZT4gaGF2ZSBzb21lIGRpc2FkdmFudGFnZXM6CisKKz1vdmVyCisKKz1pdGVtICoKKworQzx1bmFtZT4gbWF5IGJlIG5vdCBhdmFpbGFibGUgaW4gc29tZSBlbnZpcm9ubWVudHMsIGZvciBleGFtcGxlLCBpbiBXaW5kb3dzKiBPUworKEM8dW5hbWU+IG1heSBiZSBmb3VuZCBpbiBzb21lIHRoaXJkLXBhcnR5IHNvZnR3YXJlIHBhY2thZ2VzLCBsaWtlIE1LUyBUb29sa2l0IG9yIEN5Z3dpbiwgYnV0IGl0IGlzCitub3QgYSBwYXJ0IG9mIE9TKS4KKworPWl0ZW0gKgorCitUaGVyZSBhcmUgbWFueSBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgQzx1bmFtZT4uIEZvciBleGFtcGxlLCBDPHVuYW1lPiBvbiBPUyBYKiBkb2VzIG5vdAorcmVjb2duaXplIG9wdGlvbnMgQzwtaT4sIEM8LW8+LCBhbmQgYW55IGxvbmcgb3B0aW9ucy4KKworPWl0ZW0gKgorCitEaWZmZXJlbnQgdmVyc2lvbnMgb2YgQzx1bmFtZT4gbWF5IHJlcG9ydCB0aGUgc2FtZSBwcm9wZXJ0eSBkaWZmZXJlbnRseS4gRm9yIGV4YW1wbGUsCitDPHVuYW1lPiBvbiBMaW51eCogT1MgcmVwb3J0cyBtYWNoaW5lIGFzIEM8aTY4Nj4sIHdoaWxlIEM8dW5hbWU+IG9uIE9TIFgqIHJlcG9ydHMgdGhlIHNhbWUgbWFjaGluZSBhcworQzx4ODY+LgorCis9aXRlbSAqCisKK0M8UE9TSVg6OnVuYW1lKCk+IHJldHVybnMgbGlzdCBvZiB2YWx1ZXMuIEkgY2Fubm90IHJlY2FsbCB3aGF0IGlzIHRoZSBmb3VydGggZWxlbWVudCBvZiB0aGUgbGlzdC4KKworPWJhY2sKKworPWhlYWQyIEJhc2UgRnVuY3Rpb25zCisKK0Jhc2UgcHJvcGVydHkgZnVuY3Rpb25zIHByb3ZpZGUgdGhlIGluZm9ybWF0aW9uIGFzIEM8dW5hbWU+IHByb2dyYW0uCisKKz1vdmVyCisKKz1pdGVtIEI8a2VybmVsX25hbWUoKT4KKworUmV0dXJucyB0aGUga2VybmVsIG5hbWUsIGFzIHJlcG9ydGVkIGJ5IEM8UE9TSVg6OnVuYW1lKCk+LgorCis9aXRlbSBCPGZxZG4oKT4KKworUmV0dXJucyB0aGUgRlFETiwgZnVsbHkgcXVhbGlmaWVkIGRvbWFpbiBuYW1lLiBPbiBzb21lIHN5c3RlbXMgQzxQT1NJWDo6dW5hbWUoKT4gcmVwb3J0cyBzaG9ydCBub2RlCituYW1lICh3aXRoIG5vIGRvbWFpbiBuYW1lKSwgb24gb3RoZXJzIEM8UE9TSVg6OnVuYW1lKCk+IHJlcG9ydHMgZnVsbCBub2RlIG5hbWUuIFRoaXMKK2Z1bmN0aW9uIHN0cml2ZSB0byByZXR1cm4gRlFETiBhbHdheXMgKGJ5IHJlZmluaW5nIEM8UE9TSVg6OnVuYW1lKCk+IHdpdGgKK0M8TmV0OjpEb21haW46Omhvc3RmcWRuKCk+KS4KKworPWl0ZW0gQjxrZXJuZWxfcmVsZWFzZSgpPgorCitSZXR1cm5zIHRoZSBrZXJuZWwgcmVsZWFzZSBzdHJpbmcsIGFzIHJlcG9ydGVkIGJ5IEM8UE9TSVg6OnVuYW1lKCk+LiBVc3VhbGx5IHRoZSBzdHJpbmcgY29uc2lzdHMgb2YKK3NldmVyYWwgbnVtYmVycywgc2VwYXJhdGVkIGJ5IGRvdHMgYW5kIGRhc2hlcywgYnV0IG1heSBhbHNvIGluY2x1ZGUgc29tZSBub24tbnVtZXJpYyBzdWJzdHJpbmdzIGxpa2UKKyJzbXAiLgorCis9aXRlbSBCPGtlcm5lbF92ZXJzaW9uKCk+CisKK1JldHVybnMgdGhlIGtlcm5lbCB2ZXJzaW9uIHN0cmluZywgYXMgcmVwb3J0ZWQgYnkgQzxQT1NJWDo6dW5hbWUoKT4uIEl0IGlzIEI8bm90PiBzZXZlcmFsCitkb3Qtc2VwYXJhdGVkIG51bWJlcnMgYnV0IG11Y2ggbG9uZ2VyIHN0cmluZyBkZXNjcmliaW5nIHRoZSBrZXJuZWwuCitGb3IgZXhhbXBsZSwgb24gTGludXgqIE9TIGl0IGluY2x1ZGVzIGJ1aWxkIGRhdGUuCitJZiB5b3UgbG9vayBmb3Igc29tZXRoaW5nIGlkZW50aWZ5aW5nIHRoZSBrZXJuZWwsIGxvb2sgYXQgTDxrZXJuZWxfcmVsZWFzZT4uCisKKz1pdGVtIEI8bWFjaGluZSgpPgorCitSZXR1cm5zIHRoZSBtYWNoaW5lIGhhcmR3YXJlIG5hbWUsIGFzIHJlcG9ydGVkIGJ5IFBPU0lYOjp1bmFtZSgpLiBOb3QgcmVsaWFibGUuIERpZmZlcmVudCBPU2VzIG1heQorcmVwb3J0IHRoZSBzYW1lIG1hY2hpbmUgaGFyZHdhcmUgbmFtZSBkaWZmZXJlbnRseS4gRm9yIGV4YW1wbGUsIExpbnV4KiBPUyByZXBvcnRzIEM8aTY4Nj4sIHdoaWxlIE9TIFgqCityZXBvcnRzIEM8eDg2PiBvbiB0aGUgc2FtZSBtYWNoaW5lLgorCis9aXRlbSBCPHByb2Nlc3NvcigpPgorCitSZXR1cm5zIHRoZSBwcm9jZXNzb3IgdHlwZS4gTm90IHJlbGlhYmxlLiBVc3VhbGx5IHRoZSBzYW1lIGFzIEM8bWFjaGluZT4uCisKKz1pdGVtIEI8aGFyZHdhcmVfcGxhdGZvcm0oKT4KKworT25lIG9mOiBDPGkzODY+IG9yIEM8eDg2XzY0Pi4KKworPWl0ZW0gQjxvcGVyYXRpbmdfc3lzdGVtKCk+CisKK09uZSBvZjogQzxHTlUvTGludXg+LCBDPE9TIFgqPiwgb3IgQzxNUyBXaW5kb3dzPi4KKworPWJhY2sKKworPWhlYWQyIEF1eGlsaWFyeSBGdW5jdGlvbnMKKworQXV4aWxpYXJ5IGZ1bmN0aW9ucyBleHRlbmRzIGJhc2UgZnVuY3Rpb25zIHdpdGggaW5mb3JtYXRpb24gbm90IHJlcG9ydGVkIGJ5IEM8dW5hbWU+IHByb2dyYW0uCisKK0F1eGlsaWFyeSBmdW5jdGlvbnMgY29sbGVjdCBpbmZvcm1hdGlvbiBmcm9tIGRpZmZlcmVudCBzb3VyY2VzLiBGb3IgZXhhbXBsZSwgb24gT1MgWCosIHRoZXkgbWF5CitjYWxsIEM8c3dfdmVycz4gcHJvZ3JhbSB0byBmaW5kIG91dCBPUyByZWxlYXNlOyBvbiBMaW51eCogT1MgdGhleSBtYXkgcGFyc2UgQzwvZXRjL3JlZGhhdC1yZWxlYXNlPiBmaWxlLAorZXRjLgorCis9b3ZlcgorCis9aXRlbSBCPGhvc3RfbmFtZSgpPgorCitSZXR1cm5zIGhvc3QgbmFtZSAoRlFETiB3aXRoIGRyb3BwZWQgZG9tYWluIHBhcnQpLgorCis9aXRlbSBCPGRvbWFpbl9uYW1lKCk+CisKK1JldHVybnMgZG9tYWluIG5hbWUgKEZRRE4gd2l0aCBkcm9wcGVkIGhvc3QgcGFydCkuCisKKz1pdGVtIEI8b3BlcmF0aW5nX3N5c3RlbV9uYW1lPgorCitOYW1lIG9mIG9wZXJhdGluZyBzeXN0ZW0gb3IgbmFtZSBvZiBMaW51eCogT1MgZGlzdHJpYnV0aW9uLCBsaWtlICJGZWRvcmEiIG9yCisiUmVkIEhhdCBFbnRlcnByaXNlIExpbnV4KiBPUyBTZXJ2ZXIiLgorCis9aXRlbSBCPG9wZXJhdGluZ19zeXN0ZW1fcmVsZWFzZT4KKworUmVsZWFzZSAodmVyc2lvbikgb2Ygb3BlcmF0aW5nIHN5c3RlbSBvciBMaW51eCogT1MgZGlzdHJpYnV0aW9uLiBVc3VhbGx5IGl0IGlzIGEgc2VyaWVzIG9mCitkb3Qtc2VwYXJhdGVkIG51bWJlcnMuCisKKz1pdGVtIEI8b3BlcmF0aW5nX3N5c3RlbV9jb2RlbmFtZT4KKworQ29kZW5hbWUgb2Ygb3BlcmF0aW5nIHN5c3RlbSByZWxlYXNlIG9yIExpbnV4KiBPUyBkaXN0cmlidXRpb24uIEZvciBleGFtcGxlLCBGZWRvcmEgMTAgaXMgIkNhbWJyaWRnZSIKK3doaWxlIE9TIFgqIDEwLjQgaXMgIlRpZ2VyIi4KKworPWl0ZW0gQjxvcGVyYXRpbmdfc3lzdGVtX2Rlc2NyaXB0aW9uPgorCitMb25nZXIgc3RyaW5nLiBVc3VhbGx5IGl0IGluY2x1ZGVzIGFsbCB0aGUgb3BlcmF0aW5nIHN5c3RlbSBwcm9wZXJ0aW5nIG1lbnRpb25lZCBhYm92ZSAtLSBuYW1lLAorcmVsZWFzZSwgY29kZW5hbWUgaW4gcGFyZW50aGVzZXMuCisKKz1iYWNrCisKKz1oZWFkMiBNZXRhIEZ1bmN0aW9ucworCis9b3ZlcgorCis9aXRlbSBCPGJhc2VfbmFtZXMoKT4KKworVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBsaXN0IG9mIGJhc2UgcHJvcGVydHkgbmFtZXMuCisKKz1pdGVtIEI8YWxsX25hbWVzKCk+CisKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbGlzdCBvZiBhbGwgcHJvcGVydHkgbmFtZXMuCisKKz1pdGVtIEI8dmFsdWUoPiBJPG5hbWU+IEI8KT4KKworVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgc3BlY2lmaWVkIGJ5IEk8bmFtZT4uCisKKz1iYWNrCisKKz1oZWFkMSBFWEFNUExFUworCisgICAgdXNlIFVuYW1lOworCisgICAgcHJpbnQoIFVuYW1lOjpzdHJpbmcoKSwgIlxuIiApOworCisgICAgZm9yZWFjaCBteSAkbmFtZSAoIFVuYW1lOjphbGxfbmFtZXMoKSApIHsKKyAgICAgICAgcHJpbnQoICIkbmFtZT1cIiIgLiBVbmFtZTo6dmFsdWUoICRuYW1lICkgLiAiXCJcbiIgKTsKKyAgICB9OyAjIGZvcmVhY2ggJG5hbWUKKworPWhlYWQxIFNFRSBBTFNPCisKK0w8UE9TSVg6OnVuYW1lPiwgTDx1bmFtZT4uCisKKz1jdXQKKworIyBlbmQgb2YgZmlsZSAjCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbGliL3Rvb2xzLnBtIGIvZmluYWwvcnVudGltZS90b29scy9saWIvdG9vbHMucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U1Y2Y0NAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3J1bnRpbWUvdG9vbHMvbGliL3Rvb2xzLnBtCkBAIC0wLDAgKzEsMTk4MSBAQAorIworIyBUaGlzIGlzIG5vdCBhIHJ1bm5hYmxlIHNjcmlwdCwgaXQgaXMgYSBQZXJsIG1vZHVsZSwgYSBjb2xsZWN0aW9uIG9mIHZhcmlhYmxlcywgc3Vicm91dGluZXMsIGV0Yy4KKyMgdG8gYmUgdXNlZCBpbiBvdGhlciBzY3JpcHRzLgorIworIyBUbyBnZXQgaGVscCBhYm91dCBleHBvcnRlZCB2YXJpYWJsZXMgYW5kIHN1YnJvdXRpbmVzLCBwbGVhc2UgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisjCisjICAgICBwZXJsZG9jIHRvb2xzLnBtCisjCisjIG9yIHNlZSBQT0QgKFBsYWluIE9sZCBEb2N1bWVudGF0aW9uKSBpbWJlZGRlZCB0byB0aGUgc291cmNlLi4uCisjCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKz1oZWFkMSBOQU1FCisKK0I8dG9vbHMucG0+IC0tIEEgY29sbGVjdGlvbiBvZiBzdWJyb3V0aW5lcyB3aGljaCBhcmUgd2lkZWx5IHVzZWQgaW4gUGVybCBzY3JpcHRzLgorCis9aGVhZDEgU1lOT1BTSVMKKworICAgIHVzZSBGaW5kQmluOworICAgIHVzZSBsaWIgIiRGaW5kQmluOjpCaW4vbGliIjsKKyAgICB1c2UgdG9vbHM7CisKKz1oZWFkMSBERVNDUklQVElPTgorCitCPE5vdGU6PiBCZWNhdXNlIHRoaXMgY29sbGVjdGlvbiBpcyBzbWFsbCBhbmQgaW50ZW5kZWQgZm9yIHdpZGVseSB1c2luZyBpbiBwYXJ0aWN1bGFyIHByb2plY3QsCithbGwgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGJ5IGRlZmF1bHQuCisKK0I8Tm90ZTo+IEkgaGF2ZSBzb21lIGlkZWFzIGhvdyB0byBpbXByb3ZlIHRoaXMgY29sbGVjdGlvbiwgYnV0IGl0IGlzIGluIG15IGxvbmctdGVybSBwbGFucy4KK0N1cnJlbnQgc2hhcGUgaXMgbm90IGlkZWFsLCBidXQgZ29vZCBlbm91Z2ggdG8gdXNlLgorCis9Y3V0CisKK3BhY2thZ2UgdG9vbHM7CisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSB2YXJzIHF3KCBASVNBIEBFWFBPUlQgQEVYUE9SVF9PSyAlRVhQT1JUX1RBR1MgKTsKK3JlcXVpcmUgRXhwb3J0ZXI7CitASVNBID0gcXcoIEV4cG9ydGVyICk7CisKK215IEB2YXJzICAgPSBxdyggJHRvb2wgKTsKK215IEB1dGlscyAgPSBxdyggY2hlY2tfb3B0cyB2YWxpZGF0ZSApOworbXkgQG9wdHMgICA9IHF3KCBnZXRfb3B0aW9ucyApOworbXkgQHByaW50ICA9IHF3KCBkZWJ1ZyBpbmZvIHdhcm5pbmcgY21kbGluZV9lcnJvciBydW50aW1lX2Vycm9yIHF1ZXN0aW9uICk7CitteSBAbmFtZSAgID0gcXcoIGdldF92b2wgZ2V0X2RpciBnZXRfZmlsZSBnZXRfbmFtZSBnZXRfZXh0IGNhdF9maWxlIGNhdF9kaXIgKTsKK215IEBmaWxlICAgPSBxdyggd2hpY2ggYWJzX3BhdGggcmVsX3BhdGggcmVhbF9wYXRoIG1ha2VfZGlyIGNsZWFuX2RpciBjb3B5X2RpciBtb3ZlX2RpciBkZWxfZGlyIGNoYW5nZV9kaXIgY29weV9maWxlIG1vdmVfZmlsZSBkZWxfZmlsZSApOworbXkgQGlvICAgICA9IHF3KCByZWFkX2ZpbGUgd3JpdGVfZmlsZSApOworbXkgQGV4ZWMgICA9IHF3KCBleGVjdXRlIGJhY2t0aWNrcyApOworbXkgQHN0cmluZyA9IHF3eyBwYWQgfTsKK0BFWFBPUlQgPSAoIEB1dGlscywgQG9wdHMsIEB2YXJzLCBAcHJpbnQsIEBuYW1lLCBAZmlsZSwgQGlvLCBAZXhlYywgQHN0cmluZyApOworCit1c2UgVU5JVkVSU0FMICAgICgpOworCit1c2UgRmluZEJpbjsKK3VzZSBJTzo6SGFuZGxlOwordXNlIElPOjpGaWxlOwordXNlIElPOjpEaXI7CisjIE5vdCBhdmFpbGFibGUgb24gc29tZSBtYWNoaW5lczogdXNlIElPOjpabGliOworCit1c2UgR2V0b3B0OjpMb25nICgpOwordXNlIFBvZDo6VXNhZ2UgICAoKTsKK3VzZSBDYXJwICAgICAgICAgKCk7Cit1c2UgRmlsZTo6Q29weSAgICgpOwordXNlIEZpbGU6OlBhdGggICAoKTsKK3VzZSBGaWxlOjpUZW1wICAgKCk7Cit1c2UgRmlsZTo6U3BlYyAgICgpOwordXNlIFBPU0lYICAgICAgICBxd3sgOmZjbnRsX2ggOmVycm5vX2ggfTsKK3VzZSBDd2QgICAgICAgICAgKCk7Cit1c2UgU3ltYm9sICAgICAgICgpOworCit1c2UgRGF0YTo6RHVtcGVyOworCit1c2UgdmFycyBxdyggJHRvb2wgJHZlcmJvc2UgJHRpbWVzdGFtcHMgKTsKKyR0b29sID0gJEZpbmRCaW46OlNjcmlwdDsKKworbXkgQHdhcm5pbmcgPSAoIHN1YiB7fSwgXCZ3YXJuaW5nLCBcJnJ1bnRpbWVfZXJyb3IgKTsKKworCitzdWIgY2hlY2tfb3B0cyhcJSQ7JCkgeworCisgICAgbXkgJG9wdHMgPSBzaGlmdCggQF8gKTsgICMgUmVmZXJlbnNlIHRvIGhhc2ggY29udGFpbmluZyByZWFsIG9wdGlvbnMgYW5kIHRoZWlyIHZhbHVlcy4KKyAgICBteSAkZ29vZCA9IHNoaWZ0KCBAXyApOyAgIyBSZWZlcmVuY2UgdG8gYW4gYXJyYXkgY29udGFpbmluZyBhbGwga25vd24gb3B0aW9uIG5hbWVzLgorICAgIG15ICRtc2cgID0gc2hpZnQoIEBfICk7ICAjIE9wdGlvbmFsIChub24tbWFuZGF0b3J5KSBtZXNzYWdlLgorCisgICAgaWYgKCBub3QgZGVmaW5lZCggJG1zZyApICkgeworICAgICAgICAkbXNnID0gInVua25vd24gb3B0aW9uKHMpIHBhc3NlZCI7ICAgIyBEZWZhdWx0IHZhbHVlIGZvciAkbXNnLgorICAgIH07ICMgaWYKKworICAgICMgSSdsbCB1c2UgdGhlc2UgaGFzaGVzIGFzIHNldHMgb2Ygb3B0aW9ucy4KKyAgICBteSAlZ29vZCA9IG1hcCggKCAkXyA9PiAxICksIEAkZ29vZCApOyAgICMgJWdvb2Qgbm93IGlzIGZpbGxlZCB3aXRoIGFsbCBrbm93biBvcHRpb25zLgorICAgIG15ICViYWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAlYmFkIGlzIGVtcHR5LgorCisgICAgZm9yZWFjaCBteSAkb3B0ICgga2V5cyggJSRvcHRzICkgKSB7ICAgICAjIEZvciBlYWNoIHJlYWwgb3B0aW9uLi4uCisgICAgICAgIGlmICggbm90IGV4aXN0cyggJGdvb2R7ICRvcHQgfSApICkgeyAjIExvb2sgaXRzIG5hbWUgaW4gdGhlIHNldCBvZiBrbm93biBvcHRpb25zLi4uCisgICAgICAgICAgICAkYmFkeyAkb3B0IH0gPSAxOyAgICAgICAgICAgICAgICAjIEFkZCB1bmtub3duIG9wdGlvbiB0byAlYmFkIHNldC4KKyAgICAgICAgICAgIGRlbGV0ZSggJG9wdHMtPnsgJG9wdCB9ICk7ICAgICAgICMgQW5kIGRlbGV0ZSBvcmlnaW5hbCBvcHRpb24uCisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2ggJG9wdAorICAgIGlmICggJWJhZCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBJZiAlYmFkIHNldCBpcyBub3QgZW1wdHkuLi4KKyAgICAgICAgbXkgQGNhbGxlciA9IGNhbGxlciggMSApOyAgICAgICAgICAgICMgSXNzdWUgYSB3YXJuaW5nLgorICAgICAgICBsb2NhbCAkQ2FycDo6Q2FycExldmVsID0gMjsKKyAgICAgICAgQ2FycDo6Y2x1Y2soICRjYWxsZXJbIDMgXSAuICI6ICIgLiAkbXNnIC4gIjogIiAuIGpvaW4oICIsICIsIHNvcnQoIGtleXMoICViYWQgKSApICkgKTsKKyAgICB9OyAjIGlmCisKKyAgICByZXR1cm4gMTsKKworfTsgIyBzdWIgY2hlY2tfb3B0cworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHVycG9zZToKKyMgICAgIENoZWNrIHN1YnJvdXRpbmUgYXJndW1lbnRzLgorIyBTeW5vcHNpczoKKyMgICAgIG15ICVvcHRzID0gdmFsaWRhdGUoIHBhcmFtcyA9PiBcQF8sIHNwZWMgPT4geyAuLi4gfSwgY2FsbGVyID0+IG4gKTsKKyMgQXJndW1lbnRzOgorIyAgICAgcGFyYW1zIC0tIEEgcmVmZXJlbmNlIHRvIHN1YnJvdXRpbmUncyBhY3R1YWwgYXJndW1lbnRzLgorIyAgICAgc3BlYyAgIC0tIFNwZWNpZmljYXRpb24gb2YgZXhwZWN0ZWQgYXJndW1lbnRzLgorIyAgICAgY2FsbGVyIC0tIC4uLgorIyBSZXR1cm4gdmFsdWU6CisjICAgICBBIGhhc2ggb2YgdmFsaWRhdGVkIG9wdGlvbnMuCisjIERlc2NyaXB0aW9uOgorIyAgICAgSSB3b3VsZCBsaWtlIHRvIHVzZSBQYXJhbXM6OlZhbGlkYXRlIG1vZHVsZSwgYnV0IGl0IGlzIG5vdCBhIHBhcnQgb2YgZGVmYXVsdCBQZXJsCisjICAgICBkaXN0cmlidXRpb24sIHNvIEkgY2Fubm90IHJlbHkgb24gaXQuIFRoaXMgc3Vicm91dGluZSByZXNlbWJsZXMgdG8gc29tZSBleHRlbnQgdG8KKyMgICAgIFBhcmFtczo6VmFsaWRhdGU6OnZhbGlkYXRlX3dpdGgoKS4KKyMgICAgIFNwZWNpZmljYXRpb24gb2YgZXhwZWN0ZWQgYXJndW1lbnRzOgorIyAgICAgICAgeyAkb3B0ID0+IHsgdHlwZSA9PiAkdHlwZSwgZGVmYXVsdCA9PiAkZGVmYXVsdCB9LCAuLi4gfQorIyAgICAgICAgJG9wdCAgICAgLS0gU3RyaW5nLCBvcHRpb24gbmFtZS4KKyMgICAgICAgICR0eXBlICAgIC0tIFN0cmluZywgZXhwZWN0ZWQgdHlwZShzKS4gQWxsb3dlZCB2YWx1ZXMgYXJlICJTQ0FMQVIiLCAiVU5ERUYiLCAiQk9PTEVBTiIsCisjICAgICAgICAgICAgICAgICAgICAiQVJSQVlSRUYiLCAiSEFTSFJFRiIsICJDT0RFUkVGIi4gTXVsdGlwbGUgdHlwZXMgbWF5IGxpc3RlZCB1c2luZyBiYXI6CisjICAgICAgICAgICAgICAgICAgICAiU0NBTEFSfEFSUkFZUkVGIi4gVGhlIHR5cGUgc3RyaW5nIGlzIGNhc2UtaW5zZW5zaXRpdmUuCisjICAgICAgICAkZGVmYXVsdCAtLSBEZWZhdWx0IHZhbHVlIGZvciBhbiBvcHRpb24uIFdpbGwgYmUgdXNlZCBpZiBvcHRpb24gaXMgbm90IHNwZWNpZmllZCBvcgorIyAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLgorIworc3ViIHZhbGlkYXRlKEApIHsKKworICAgIG15ICVvcHRzID0gQF87ICAgICMgVGVtcG9yYXJ5IHVzZSAlb3B0cyBmb3IgcGFyYW1ldGVycyBvZiBgdmFsaWRhdGUnIHN1YnJvdXRpbmUuCisgICAgbXkgJHBhcmFtcyA9ICRvcHRzeyBwYXJhbXMgfTsKKyAgICBteSAkY2FsbGVyID0gKCAkb3B0c3sgY2FsbGVyIH0gb3IgMCApICsgMTsKKyAgICBteSAkc3BlYyAgID0gJG9wdHN7IHNwZWMgfTsKKyAgICB1bmRlZiggJW9wdHMgKTsgICAjIE9rLCBDbGVhbiAlb3B0cywgbm93IHdlIHdpbGwgY29sbGVjdCByZXN1bHQgb2YgdGhlIHN1YnJvdXRpbmUuCisKKyAgICAjIEZpbmQgb3V0IGNhbGxlciBwYWNrYWdlLCBmaWxlbmFtZSwgbGluZSwgYW5kIHN1YnJvdXRpbmUgbmFtZS4KKyAgICBteSAoICRwa2csICRmaWxlLCAkbGluZSwgJHN1YnIgKSA9IGNhbGxlciggJGNhbGxlciApOworICAgIG15IEBlcnJvcnM7ICAgICMgV2Ugd2lsbCBjb2xsZWN0IGVycm9ycyBpbiBhcnJheSBub3QgdG8gc3RvcCBvbiB0aGUgZmlyc3QgZm91bmQgZXJyb3IuCisgICAgbXkgJGVycm9yID0KKyAgICAgICAgc3ViICgkKSB7CisgICAgICAgICAgICBteSAkbXNnID0gc2hpZnQoIEBfICk7CisgICAgICAgICAgICBwdXNoKCBAZXJyb3JzLCAiJG1zZyBhdCAkZmlsZSBsaW5lICRsaW5lLlxuIiApOworICAgICAgICB9OyAjIHN1YgorCisgICAgIyBDaGVjayBvcHRpb25zLgorICAgIHdoaWxlICggQCRwYXJhbXMgKSB7CisgICAgICAgICMgQ2hlY2sgb3B0aW9uIG5hbWUuCisgICAgICAgIG15ICRvcHQgPSBzaGlmdCggQCRwYXJhbXMgKTsKKyAgICAgICAgaWYgKCBub3QgZXhpc3RzKCAkc3BlYy0+eyAkb3B0IH0gKSApIHsKKyAgICAgICAgICAgICRlcnJvci0+KCAiSW52YWxpZCBvcHRpb24gYCRvcHQnIiApOworICAgICAgICAgICAgc2hpZnQoIEAkcGFyYW1zICk7ICMgU2tpcCB2YWx1ZSBvZiB1bmtub3cgb3B0aW9uLgorICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAjIENoZWNrIG9wdGlvbiB2YWx1ZSBleGlzdHMuCisgICAgICAgIGlmICggbm90IEAkcGFyYW1zICkgeworICAgICAgICAgICAgJGVycm9yLT4oICJPcHRpb24gYCRvcHQnIGRvZXMgbm90IGhhdmUgYSB2YWx1ZSIgKTsKKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgbXkgJHZhbCA9IHNoaWZ0KCBAJHBhcmFtcyApOworICAgICAgICAjIENoZWNrIG9wdGlvbiB2YWx1ZSB0eXBlLgorICAgICAgICBpZiAoIGV4aXN0cyggJHNwZWMtPnsgJG9wdCB9LT57IHR5cGUgfSApICkgeworICAgICAgICAgICAgIyBUeXBlIHNwZWNpZmljYXRpb24gZXhpc3RzLiBDaGVjayBvcHRpb24gdmFsdWUgdHlwZS4KKyAgICAgICAgICAgIG15ICRhY3R1YWxfdHlwZTsKKyAgICAgICAgICAgIGlmICggcmVmKCAkdmFsICkgbmUgIiIgKSB7CisgICAgICAgICAgICAgICAgJGFjdHVhbF90eXBlID0gcmVmKCAkdmFsICkgLiAiUkVGIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJGFjdHVhbF90eXBlID0gKCBkZWZpbmVkKCAkdmFsICkgPyAiU0NBTEFSIiA6ICJVTkRFRiIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIG15IEB3YW50ZWRfdHlwZXMgPSBzcGxpdCggbXtcfH0sIGxjKCAkc3BlYy0+eyAkb3B0IH0tPnsgdHlwZSB9ICkgKTsKKyAgICAgICAgICAgIG15ICR3YW50ZWRfdHlwZXMgPSBqb2luKCAifCIsIG1hcCggJF8gZXEgImJvb2xlYW4iID8gInNjYWxhcnx1bmRlZiIgOiBxdW90ZW1ldGEoICRfICksIEB3YW50ZWRfdHlwZXMgKSApOworICAgICAgICAgICAgaWYgKCAkYWN0dWFsX3R5cGUgIX4gbXtcQSg/OiR3YW50ZWRfdHlwZXMpXHp9aSApIHsKKyAgICAgICAgICAgICAgICAkYWN0dWFsX3R5cGUgPSBsYyggJGFjdHVhbF90eXBlICk7CisgICAgICAgICAgICAgICAgJHdhbnRlZF90eXBlcyA9IGxjKCBqb2luKCAiIG9yICIsIG1hcCggImAkXyciLCBAd2FudGVkX3R5cGVzICkgKSApOworICAgICAgICAgICAgICAgICRlcnJvci0+KCAiT3B0aW9uIGAkb3B0JyB2YWx1ZSB0eXBlIGlzIGAkYWN0dWFsX3R5cGUnIGJ1dCBleHBlY3RlZCB0byBiZSAkd2FudGVkX3R5cGVzIiApOworICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCBleGlzdHMoICRzcGVjLT57ICRvcHQgfS0+eyB2YWx1ZXMgfSApICApIHsKKyAgICAgICAgICAgIG15ICR2YWx1ZXMgPSAkc3BlYy0+eyAkb3B0IH0tPnsgdmFsdWVzIH07CisgICAgICAgICAgICBpZiAoIG5vdCBncmVwKCAkXyBlcSAkdmFsLCBAJHZhbHVlcyApICkgeworICAgICAgICAgICAgICAgICR2YWx1ZXMgPSBqb2luKCAiLCAiLCBtYXAoICJgJF8nIiwgQCR2YWx1ZXMgKSApOworICAgICAgICAgICAgICAgICRlcnJvci0+KCAiT3B0aW9uIGAkb3B0JyB2YWx1ZSBpcyBgJHZhbCcgYnV0IGV4cGVjdGVkIHRvIGJlIG9uZSBvZiAkdmFsdWVzIiApOworICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgaWYKKyAgICAgICAgJG9wdHN7ICRvcHQgfSA9ICR2YWw7CisgICAgfTsgIyB3aGlsZQorCisgICAgIyBBc3NpZ24gZGVmYXVsdCB2YWx1ZXMuCisgICAgZm9yZWFjaCBteSAkb3B0ICgga2V5cyggJSRzcGVjICkgKSB7CisgICAgICAgIGlmICggbm90IGRlZmluZWQoICRvcHRzeyAkb3B0IH0gKSBhbmQgZXhpc3RzKCAkc3BlYy0+eyAkb3B0IH0tPnsgZGVmYXVsdCB9ICkgKSB7CisgICAgICAgICAgICAkb3B0c3sgJG9wdCB9ID0gJHNwZWMtPnsgJG9wdCB9LT57IGRlZmF1bHQgfTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaCAkb3B0CisKKyAgICAjIElmIHdlIGZvdW5kIGFueSBlcnJvcnMsIHJhaXNlIHRoZW0uCisgICAgaWYgKCBAZXJyb3JzICkgeworICAgICAgICBkaWUgam9pbiggIiIsIEBlcnJvcnMgKTsKKyAgICB9OyAjIGlmCisKKyAgICByZXR1cm4gJW9wdHM7CisKK307ICMgc3ViIHZhbGlkYXRlCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBHZXQgb3B0aW9uIGhlbHBlcnMuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworPWhlYWQyIEdldCBvcHRpb24gaGVscGVycy4KKworPWN1dAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWhlYWQzIGdldF9vcHRpb25zCisKK0I8U3lub3BzaXM6PgorCisgICAgZ2V0X29wdGlvbnMoIEBhcmd1bWVudHMgKQorCitCPERlc2NyaXB0aW9uOj4KKworSXQgaXMgdmVyeSBzaW1wbGUgd3JhcHBlciBhcm91bmYgR2V0b3B0OjpMb25nOjpHZXRPcHRpb25zLiBJdCBwYXNzZXMgYWxsIGFyZ3VtZW50cyB0byBHZXRPcHRpb25zLAorYW5kIGFkZCBkZWZpbml0aW9ucyBmb3Igc3RhbmRhcmQgaGVscCBvcHRpb25zOiAtLWhlbHAsIC0tZG9jLCAtLXZlcmJvc2UsIGFuZCAtLXF1aWV0LgorV2hlbiBHZXRPcHRpb25zIGZpbmloZXMsIHRoaXMgc3Vicm91dGluZSBjaGVja3MgZXhpdCBjb2RlLCBpZiBpdCBpcyBub24temVybywgc3RhbmRhcmQgZXJyb3IKK21lc3NhZ2UgaXMgaXNzdWVkIGFuZCBzY3JpcHQgdGVybWluYXRlZC4KKworSWYgLS12ZXJib3NlIG9yIC0tcXVpZXQgb3B0aW9uIGlzIHNwZWNpZmllZCwgQzx0b29scy5wbV92ZXJib3NlPiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQuCitJdCBpcyB0aGUgd2F5IHRvIHByb3BhZ2F0ZSB2ZXJib3NlL3F1aWV0IG1vZGUgdG8gY2FsbGVlIFBlcmwgc2NyaXB0cy4KKworPWN1dAorCitzdWIgZ2V0X29wdGlvbnMgeworCisgICAgR2V0b3B0OjpMb25nOjpDb25maWd1cmUoICJub19pZ25vcmVfY2FzZSIgKTsKKyAgICBHZXRvcHQ6Okxvbmc6OkdldE9wdGlvbnMoCisgICAgICAgICJoMHx1c2FnZSIgICAgICAgID0+IHN1YiB7IFBvZDo6VXNhZ2U6OnBvZDJ1c2FnZSggLWV4aXR2YWwgPT4gMCwgLXZlcmJvc2UgPT4gMCApOyB9LAorICAgICAgICAiaDF8aHxoZWxwIiAgICAgICA9PiBzdWIgeyBQb2Q6OlVzYWdlOjpwb2QydXNhZ2UoIC1leGl0dmFsID0+IDAsIC12ZXJib3NlID0+IDEgKTsgfSwKKyAgICAgICAgImgyfGRvY3xtYW51YWwiICAgPT4gc3ViIHsgUG9kOjpVc2FnZTo6cG9kMnVzYWdlKCAtZXhpdHZhbCA9PiAwLCAtdmVyYm9zZSA9PiAyICk7IH0sCisgICAgICAgICJ2ZXJzaW9uIiAgICAgICAgID0+IHN1YiB7IHByaW50KCAiJHRvb2wgdmVyc2lvbiAkbWFpbjo6VkVSU0lPTlxuIiApOyBleGl0KCAwICk7IH0sCisgICAgICAgICJ2fHZlcmJvc2UiICAgICAgID0+IHN1YiB7ICsrICR2ZXJib3NlOyAgICAgJEVOVnsgInRvb2xzLnBtX3ZlcmJvc2UiICAgIH0gPSAkdmVyYm9zZTsgICAgfSwKKyAgICAgICAgInF1aWV0IiAgICAgICAgICAgPT4gc3ViIHsgLS0gJHZlcmJvc2U7ICAgICAkRU5WeyAidG9vbHMucG1fdmVyYm9zZSIgICAgfSA9ICR2ZXJib3NlOyAgICB9LAorICAgICAgICAid2l0aC10aW1lc3RhbXBzIiA9PiBzdWIgeyAkdGltZXN0YW1wcyA9IDE7ICRFTlZ7ICJ0b29scy5wbV90aW1lc3RhbXBzIiB9ID0gJHRpbWVzdGFtcHM7IH0sCisgICAgICAgIEBfLCAjIENhbGxlciBhcmd1bWV0c2EgYXJlIGF0IHRoZSBlbmQgc28gY2FsbGVyIG9wdGlvbnMgb3ZlcnJpZGVzIHN0YW5kYXJkLgorICAgICkgb3IgY21kbGluZV9lcnJvcigpOworCit9OyAjIHN1YiBnZXRfb3B0aW9ucworCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBQcmludCB1dGlsaXRpZXMuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworPXBvZAorCis9aGVhZDIgUHJpbnQgdXRpbGl0aWVzLgorCitFYWNoIG9mIHRoZSBwcmludCBzdWJyb3V0aW5lcyBwcmVwZW5kcyBlYWNoIGxpbmUgb2YgaXRzIG91dHB1dCB3aXRoIHRoZSBuYW1lIG9mIGN1cnJlbnQgc2NyaXB0IGFuZAordGhlIHR5cGUgb2YgaW5mb3JtYXRpb24sIGZvciBleGFtcGxlOgorCisgICAgaW5mbyggIldyaXRpbmcgZmlsZS4uLiIgKTsKKword2lsbCBwcmludAorCisgICAgPHNjcmlwdD46IChpKTogV3JpdGluZyBmaWxlLi4uCisKK3doaWxlCisKKyAgICB3YXJuaW5nKCAiRmlsZSBkb2VzIG5vdCBleGlzdCEiICk7CisKK3dpbGwgcHJpbnQKKworICAgIDxzY3JpcHQ+OiAoISk6IEZpbGUgZG9lcyBub3QgZXhpc3QhCisKK0hlcmUgYXJlIGV4cG9ydGVkIGl0ZW1zOgorCis9Y3V0CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdWIgX2Zvcm1hdF9tZXNzYWdlKCRcQDskKSB7CisKKyAgICBteSAkcHJlZml4ICA9IHNoaWZ0KCBAXyApOworICAgIG15ICRhcmdzICAgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJG5vX2VvbCAgPSBzaGlmdCggQF8gKTsgICMgRG8gbm90IGFwcGVuZCAiXG4iIHRvIHRoZSBsYXN0IGxpbmUuCisgICAgbXkgJG1lc3NhZ2UgPSAiIjsKKworICAgIG15ICR0cyA9ICIiOworICAgIGlmICggJHRpbWVzdGFtcHMgKSB7CisgICAgICAgIG15ICggJHNlYywgJG1pbiwgJGhvdXIsICRkYXksICRtb250aCwgJHllYXIgKSA9IGdtdGltZSgpOworICAgICAgICAkbW9udGggKz0gMTsKKyAgICAgICAgJHllYXIgICs9IDE5MDA7CisgICAgICAgICR0cyA9IHNwcmludGYoICIlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZCBVVEM6ICIsICR5ZWFyLCAkbW9udGgsICRkYXksICRob3VyLCAkbWluLCAkc2VjICk7CisgICAgfTsgIyBpZgorICAgIGZvciBteSAkaSAoIDEgLi4gQCRhcmdzICkgeworICAgICAgICBteSBAbGluZXMgPSBzcGxpdCggIlxuIiwgJGFyZ3MtPlsgJGkgLSAxIF0gKTsKKyAgICAgICAgZm9yIG15ICRqICggMSAuLiBAbGluZXMgKSB7CisgICAgICAgICAgICBteSAkbGluZSA9ICRsaW5lc1sgJGogLSAxIF07CisgICAgICAgICAgICBteSAkbGFzdF9saW5lID0gKCAoICRpID09IEAkYXJncyApIGFuZCAoICRqID09IEBsaW5lcyApICk7CisgICAgICAgICAgICBteSAkZW9sID0gKCAoIHN1YnN0ciggJGxpbmUsIC0xICkgZXEgIlxuIiApIG9yIGRlZmluZWQoICRub19lb2wgKSA/ICIiIDogIlxuIiApOworICAgICAgICAgICAgJG1lc3NhZ2UgLj0gIiR0cyR0b29sOiAoJHByZWZpeCkgIiAuICRsaW5lIC4gJGVvbDsKKyAgICAgICAgfTsgIyBmb3JlYWNoICRqCisgICAgfTsgIyBmb3JlYWNoICRpCisgICAgcmV0dXJuICRtZXNzYWdlOworCit9OyAjIHN1YiBfZm9ybWF0X21lc3NhZ2UKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1wb2QKKworPWhlYWQzICR2ZXJib3NlCisKK0I8U3lub3BzaXM6PgorCisgICAgJHZlcmJvc2UKKworQjxEZXNjcmlwdGlvbjo+CisKK1BhY2thZ2UgdmFyaWFibGUuIEl0IGRldGVybWluZXMgdmVyYm9zaXR5IGxldmVsLCB3aGljaCBhZmZlY3RzIEM8d2FybmluZygpPiwgQzxpbmZvKCk+LCBhbmQKK0M8ZGVidWcoKT4gc3Vicm91dG5lcyAuCisKK1RoZSB2YXJpYWJsZSBnZXRzIGluaXRpYWwgdmFsdWUgZnJvbSBDPHRvb2xzLnBtX3ZlcmJvc2U+IGVudmlyb25tZW50IHZhcmlhYmxlIGlmIGl0IGlzIGV4aXN0cy4KK0lmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBkb2VzIG5vdCBleGlzdCwgdmFyaWFibGUgaXMgc2V0IHRvIDIuCisKK0luaXRpYWwgdmFsdWUgbWF5IGJlIG92ZXJyaWRkZW4gbGF0ZXIgZGlyZWN0bHkgb3IgYnkgQzxnZXRfb3B0aW9ucz4gZnVuY3Rpb24uCisKKz1jdXQKKworJHZlcmJvc2UgPSBleGlzdHMoICRFTlZ7ICJ0b29scy5wbV92ZXJib3NlIiB9ICkgPyAkRU5WeyAidG9vbHMucG1fdmVyYm9zZSIgfSA6IDI7CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9cG9kCisKKz1oZWFkMyAkdGltZXN0YW1wcworCitCPFN5bm9wc2lzOj4KKworICAgICR0aW1lc3RhbXBzCisKK0I8RGVzY3JpcHRpb246PgorCitQYWNrYWdlIHZhcmlhYmxlLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgQzxkZWJ1ZygpPiwgQzxpbmZvKCk+LCBDPHdhcm5pbmcoKT4sIEM8cnVudGltZV9lcnJvcigpPgorc3Vicm91dG5lcyBwcmludCB0aW1lc3RhbXBzIG9yIG5vdC4KKworVGhlIHZhcmlhYmxlIGdldHMgaW5pdGlhbCB2YWx1ZSBmcm9tIEM8dG9vbHMucG1fdGltZXN0YW1wcz4gZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgaXQgaXMgZXhpc3RzLgorSWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGRvZXMgbm90IGV4aXN0LCB2YXJpYWJsZSBpcyBzZXQgdG8gZmFsc2UuCisKK0luaXRpYWwgdmFsdWUgbWF5IGJlIG92ZXJyaWRkZW4gbGF0ZXIgZGlyZWN0bHkgb3IgYnkgQzxnZXRfb3B0aW9ucygpPiBmdW5jdGlvbi4KKworPWN1dAorCiskdGltZXN0YW1wcyA9IGV4aXN0cyggJEVOVnsgInRvb2xzLnBtX3RpbWVzdGFtcHMiIH0gKSA/ICRFTlZ7ICJ0b29scy5wbV90aW1lc3RhbXBzIiB9IDogMDsKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1wb2QKKworPWhlYWQzIGRlYnVnCisKK0I8U3lub3BzaXM6PgorCisgICAgZGVidWcoIEBtZXNzYWdlcyApCisKK0I8RGVzY3JpcHRpb246PgorCitJZiB2ZXJib3NpdHkgbGV2ZWwgaXMgMyBvciBoaWdoZXIsIHByaW50IGRlYnVnIGluZm9ybWF0aW9uIHRvIHRoZSBzdGRlcnIsIHByZXBlbmRpbmcgaXQgd2l0aCAiKCMpIgorcHJlZml4LgorCis9Y3V0CisKK3N1YiBkZWJ1ZyhAKSB7CisKKyAgICBpZiAoICR2ZXJib3NlID49IDMgKSB7CisgICAgICAgIFNURE9VVC0+Zmx1c2goKTsKKyAgICAgICAgU1RERVJSLT5wcmludCggX2Zvcm1hdF9tZXNzYWdlKCAiIyIsIEBfICkgKTsKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuIDE7CisKK307ICMgc3ViIGRlYnVnCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9cG9kCisKKz1oZWFkMyBpbmZvCisKK0I8U3lub3BzaXM6PgorCisgICAgaW5mbyggQG1lc3NhZ2VzICkKKworQjxEZXNjcmlwdGlvbjo+CisKK0lmIHZlcmJvc2l0eSBsZXZlbCBpcyAyIG9yIGhpZ2hlciwgcHJpbnQgaW5mb3JtYXRpb24gdG8gdGhlIHN0ZGVyciwgcHJlcGVuZGluZyBpdCB3aXRoICIoaSkiIHByZWZpeC4KKworPWN1dAorCitzdWIgaW5mbyhAKSB7CisKKyAgICBpZiAoICR2ZXJib3NlID49IDIgKSB7CisgICAgICAgIFNURE9VVC0+Zmx1c2goKTsKKyAgICAgICAgU1RERVJSLT5wcmludCggX2Zvcm1hdF9tZXNzYWdlKCAiaSIsIEBfICApICk7CisgICAgfTsgIyBpZgorCit9OyAjIHN1YiBpbmZvCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aGVhZDMgd2FybmluZworCitCPFN5bm9wc2lzOj4KKworICAgIHdhcm5pbmcoIEBtZXNzYWdlcyApCisKK0I8RGVzY3JpcHRpb246PgorCitJZiB2ZXJib3NpdHkgbGV2ZWwgaXMgMSBvciBoaWdoZXIsIGlzc3VlIGEgd2FybmluZywgcHJlcGVuZGluZyBpdCB3aXRoICIoISkiIHByZWZpeC4KKworPWN1dAorCitzdWIgd2FybmluZyhAKSB7CisKKyAgICBpZiAoICR2ZXJib3NlID49IDEgKSB7CisgICAgICAgIFNURE9VVC0+Zmx1c2goKTsKKyAgICAgICAgd2FybiggX2Zvcm1hdF9tZXNzYWdlKCAiISIsIEBfICApICk7CisgICAgfTsgIyBpZgorCit9OyAjIHN1YiB3YXJuaW5nCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aGVhZDMgY21kbGluZV9lcnJvcgorCitCPFN5bm9wc2lzOj4KKworICAgIGNtZGxpbmVfZXJyb3IoIEBtZXNzYWdlICkKKworQjxEZXNjcmlwdGlvbjo+CisKK1ByaW50IGVycm9yIG1lc3NhZ2UgYW5kIGV4aXQgdGhlIHByb2dyYW0gd2l0aCBzdGF0dXMgMi4KKworVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBjb21wbGFpbiBvbiBjb21tYW5kIGxpbmUgZXJyb3JzLCBlLiBnLiB1bmtub3duCitvcHRpb25zLCBpbnZhbGlkIGFyZ3VtZW50cywgZXRjLgorCis9Y3V0CisKK3N1YiBjbWRsaW5lX2Vycm9yKDskKSB7CisKKyAgICBteSAkbWVzc2FnZSA9IHNoaWZ0KCBAXyApOworCisgICAgaWYgKCBkZWZpbmVkKCAkbWVzc2FnZSApICkgeworICAgICAgICBpZiAoIHN1YnN0ciggJG1lc3NhZ2UsIC0xLCAxICkgbmUgIlxuIiApIHsKKyAgICAgICAgICAgICRtZXNzYWdlIC49ICJcbiI7CisgICAgICAgIH07ICMgaWYKKyAgICB9IGVsc2UgeworICAgICAgICAkbWVzc2FnZSA9ICIiOworICAgIH07ICMgaWYKKyAgICBTVERPVVQtPmZsdXNoKCk7CisgICAgZGllICRtZXNzYWdlIC4gIlRyeSAtLWhlbHAgb3B0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuIjsKKworfTsgIyBzdWIgY21kbGluZV9lcnJvcgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWhlYWQzIHJ1bnRpbWVfZXJyb3IKKworQjxTeW5vcHNpczo+CisKKyAgICBydW50aW1lX2Vycm9yKCBAbWVzc2FnZSApCisKK0I8RGVzY3JpcHRpb246PgorCitQcmludCBlcnJvciBtZXNzYWdlIGFuZCBleGl0cyB0aGUgcHJvZ3JhbSB3aXRoIHN0YXR1cyAzLgorCitUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGNvbXBsYWluIG9uIHJ1bnRpbWUgZXJyb3JzLCBlLiBnLgorZGlyZWN0b3JpZXMgd2hpY2ggYXJlIG5vdCBmb3VuZCwgbm9uLXdyaXRhYmxlIGZpbGVzLCBldGMuCisKKz1jdXQKKworc3ViIHJ1bnRpbWVfZXJyb3IoQCkgeworCisgICAgU1RET1VULT5mbHVzaCgpOworICAgIGRpZSBfZm9ybWF0X21lc3NhZ2UoICJ4IiwgQF8gKTsKKworfTsgIyBzdWIgcnVudGltZV9lcnJvcgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWhlYWQzIHF1ZXN0aW9uCisKK0I8U3lub3BzaXM6PgorCisgICAgcXVlc3Rpb24oICRwcm9tcHQ7ICRhbnN3ZXIsICRjaG9pY2VzICApCisKK0I8RGVzY3JpcHRpb246PgorCitQcmludCAkcHJvbXAgdG8gdGhlIHN0ZGVyciwgcHJlcGVuZGluZyBpdCB3aXRoICJxdWVzdGlvbjoiIHByZWZpeC4gUmVhZCBhIGxpbmUgZnJvbSBzdGRpbiwgY2hvcAorIlxuIiBmcm9tIHRoZSBlbmQsIGl0IGlzIGFuc3dlci4KKworSWYgJGFuc3dlciBpcyBkZWZpbmVkLCBpdCBpcyB0cmVhdGVkIGFzIGZpcnN0IHVzZXIgaW5wdXQuCisKK0lmICRjaG9pY2VzIGlzIHNwZWNpZmllZCwgaXQgY291bGQgYmUgYSByZWdleHAgZm9yIHZhbGlkYXRpbmcgdXNlciBpbnB1dCwgb3IgYSBzdHJpbmcuIEluIGxhdHRlcgorY2FzZSBpdCBpbnRlcnByZXRlZCBhcyBsaXN0IG9mIGNoYXJhY3RlcnMsIGFjY2VwdGFibGUgKGNhc2UtaW5zZW5zaXRpdmUpIGNob2ljZXMuIElmIHVzZXIgZW50ZXJzCitub24tYWNjZXB0YWJsZSBhbnN3ZXIsIHF1ZXN0aW9uIGNvbnRpbnVlIGFza2luZyB1bnRpbCBhbnN3ZXIgaXMgYWNjZXB0YWJsZS4KK0lmICRjaG9pY2VzIGlzIG5vdCBzcGVjaWZpZWQsIGFueSBhbnN3ZXIgaXMgYWNjZXB0YWJsZS4KKworSW4gY2FzZSBvZiBlbmQtb2YtZmlsZSAob3IgQ3RybCtEIHByZXNzZWQgYnkgdXNlciksICRhbnN3ZXIgaXMgQzx1bmRlZj4uCisKK0I8RXhhbXBsZXM6PgorCisgICAgbXkgJGFuc3dlcjsKKyAgICBxdWVzdGlvbiggIlNhdmUgZmlsZSBbeW5dPyAiLCAkYW5zd2VyLCAieW4iICk7CisgICAgICAgICMgV2UgYWNjZXB0cyBvbmx5ICJ5IiwgIlkiLCAibiIsIG9yICJOIi4KKyAgICBxdWVzdGlvbiggIlByZXNzIGVudGVyIHRvIGNvbnRpbnVlIG9yIEN0cmwrQyB0byBhYm9ydC4uLiIgKTsKKyAgICAgICAgIyBXZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gYW5zd2VyIHZhbHVlIC0tIGluIGNhc2Ugb2YgQ3RybCtDIHRoZSBzY3JpcHQgd2lsbCBiZSB0ZXJtaW5hdGVkLAorICAgICAgICAjIG90aGVyd2lzZSB3ZSBjb250aW51ZSBleGVjdXRpb24uCisgICAgcXVlc3Rpb24oICJGaWxlIG5hbWU/ICIsICRhbnN3ZXIgKTsKKyAgICAgICAgIyBBbnkgYW5zd2VyIGlzIGFjY2VwdGFibGUuCisKKz1jdXQKKworc3ViIHF1ZXN0aW9uKCQ7XCQkKSB7CisKKyAgICBteSAkcHJvbXB0ICA9IHNoaWZ0KCBAXyApOworICAgIG15ICRhbnN3ZXIgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJGNob2ljZXMgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkYSAgICAgICA9ICggZGVmaW5lZCggJGFuc3dlciApID8gJCRhbnN3ZXIgOiB1bmRlZiApOworCisgICAgaWYgKCByZWYoICRjaG9pY2VzICkgZXEgIlJlZ2V4cCIgKSB7CisgICAgICAgICMgSXQgaXMgYWxyZWFkeSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiwgZG8gbm90aGluZy4KKyAgICB9IGVsc2lmICggZGVmaW5lZCggJGNob2ljZXMgKSApIHsKKyAgICAgICAgIyBDb252ZXJ0IHN0cmluZyB0byBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgICAgJGNob2ljZXMgPSBxci9bQHsgWyBxdW90ZW1ldGEoICRjaG9pY2VzICkgXSB9XS9pOworICAgIH07ICMgaWYKKworICAgIGZvciAoIDsgOyApIHsKKyAgICAgICAgU1RERVJSLT5wcmludCggX2Zvcm1hdF9tZXNzYWdlKCAiPyIsIEB7IFsgJHByb21wdCBdIH0sICJub19lb2wiICkgKTsKKyAgICAgICAgU1RERVJSLT5mbHVzaCgpOworICAgICAgICBpZiAoIGRlZmluZWQoICRhICkgKSB7CisgICAgICAgICAgICBTVERPVVQtPnByaW50KCAkYSAuICJcbiIgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRhID0gPFNURElOPjsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoIG5vdCBkZWZpbmVkKCAkYSApICkgeworICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBjaG9tcCggJGEgKTsKKyAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJGNob2ljZXMgKSBvciAoICRhID1+IG0vXiRjaG9pY2VzJC8gKSApIHsKKyAgICAgICAgICAgIGxhc3Q7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgJGEgPSB1bmRlZjsKKyAgICB9OyAjIGZvcmV2ZXIKKyAgICBpZiAoIGRlZmluZWQoICRhbnN3ZXIgKSApIHsKKyAgICAgICAgJCRhbnN3ZXIgPSAkYTsKKyAgICB9OyAjIGlmCisKK307ICMgc3ViIHF1ZXN0aW9uCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFJldHVybnMgdm9sdW1lIHBhcnQgb2YgcGF0aC4KK3N1YiBnZXRfdm9sKCQpIHsKKworICAgIG15ICRwYXRoID0gc2hpZnQoIEBfICk7CisgICAgbXkgKCAkdm9sLCB1bmRlZiwgdW5kZWYgKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggJHBhdGggKTsKKyAgICByZXR1cm4gJHZvbDsKKworfTsgIyBzdWIgZ2V0X3ZvbAorCisjIFJldHVybnMgZGlyZWN0b3J5IHBhcnQgb2YgcGF0aC4KK3N1YiBnZXRfZGlyKCQpIHsKKworICAgIG15ICRwYXRoID0gRmlsZTo6U3BlYy0+Y2Fub25wYXRoKCBzaGlmdCggQF8gKSApOworICAgIG15ICggJHZvbCwgJGRpciwgdW5kZWYgKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggJHBhdGggKTsKKyAgICBteSBAZGlycyA9IEZpbGU6OlNwZWMtPnNwbGl0ZGlyKCAkZGlyICk7CisgICAgcG9wKCBAZGlycyApOworICAgICRkaXIgPSBGaWxlOjpTcGVjLT5jYXRkaXIoIEBkaXJzICk7CisgICAgJGRpciA9IEZpbGU6OlNwZWMtPmNhdHBhdGgoICR2b2wsICRkaXIsIHVuZGVmICk7CisgICAgcmV0dXJuICRkaXI7CisKK307ICMgc3ViIGdldF9kaXIKKworIyBSZXR1cm5zIGZpbGUgcGFydCBvZiBwYXRoLgorc3ViIGdldF9maWxlKCQpIHsKKworICAgIG15ICRwYXRoID0gc2hpZnQoIEBfICk7CisgICAgbXkgKCB1bmRlZiwgdW5kZWYsICRmaWxlICkgPSBGaWxlOjpTcGVjLT5zcGxpdHBhdGgoICRwYXRoICk7CisgICAgcmV0dXJuICRmaWxlOworCit9OyAjIHN1YiBnZXRfZmlsZQorCisjIFJldHVybnMgZmlsZSBwYXJ0IG9mIHBhdGggd2l0aG91dCBsYXN0IHN1ZmZpeC4KK3N1YiBnZXRfbmFtZSgkKSB7CisKKyAgICBteSAkcGF0aCA9IHNoaWZ0KCBAXyApOworICAgIG15ICggdW5kZWYsIHVuZGVmLCAkZmlsZSApID0gRmlsZTo6U3BlYy0+c3BsaXRwYXRoKCAkcGF0aCApOworICAgICRmaWxlID1+IHN7XC5bXi5dKlx6fXt9OworICAgIHJldHVybiAkZmlsZTsKKworfTsgIyBzdWIgZ2V0X25hbWUKKworIyBSZXR1cm5zIGxhc3Qgc3VmZml4IG9mIGZpbGUgcGFydCBvZiBwYXRoLgorc3ViIGdldF9leHQoJCkgeworCisgICAgbXkgJHBhdGggPSBzaGlmdCggQF8gKTsKKyAgICBteSAoIHVuZGVmLCB1bmRlZiwgJGZpbGUgKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggJHBhdGggKTsKKyAgICBteSAkZXh0ID0gIiI7CisgICAgaWYgKCAkZmlsZSA9fiBteyhcLlteLl0qKVx6fSApIHsKKyAgICAgICAgJGV4dCA9ICQxOworICAgIH07ICMgaWYKKyAgICByZXR1cm4gJGV4dDsKKworfTsgIyBzdWIgZ2V0X2V4dAorCitzdWIgY2F0X2ZpbGUoQCkgeworCisgICAgbXkgJHBhdGggPSBzaGlmdCggQF8gKTsKKyAgICBteSAkZmlsZSA9IHBvcCggQF8gKTsKKyAgICBteSBAZGlycyA9IEBfOworCisgICAgbXkgKCAkdm9sLCAkZGlycyApID0gRmlsZTo6U3BlYy0+c3BsaXRwYXRoKCAkcGF0aCwgIm5vX2ZpbGUiICk7CisgICAgQGRpcnMgPSAoIEZpbGU6OlNwZWMtPnNwbGl0ZGlyKCAkZGlycyApLCBAZGlycyApOworICAgICRkaXJzID0gRmlsZTo6U3BlYy0+Y2F0ZGlyKCBAZGlycyApOworICAgICRwYXRoID0gRmlsZTo6U3BlYy0+Y2F0cGF0aCggJHZvbCwgJGRpcnMsICRmaWxlICk7CisKKyAgICByZXR1cm4gJHBhdGg7CisKK307ICMgc3ViIGNhdF9maWxlCisKK3N1YiBjYXRfZGlyKEApIHsKKworICAgIG15ICRwYXRoID0gc2hpZnQoIEBfICk7CisgICAgbXkgQGRpcnMgPSBAXzsKKworICAgIG15ICggJHZvbCwgJGRpcnMgKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggJHBhdGgsICJub19maWxlIiApOworICAgIEBkaXJzID0gKCBGaWxlOjpTcGVjLT5zcGxpdGRpciggJGRpcnMgKSwgQGRpcnMgKTsKKyAgICAkZGlycyA9IEZpbGU6OlNwZWMtPmNhdGRpciggQGRpcnMgKTsKKyAgICAkcGF0aCA9IEZpbGU6OlNwZWMtPmNhdHBhdGgoICR2b2wsICRkaXJzLCAiIiApOworCisgICAgcmV0dXJuICRwYXRoOworCit9OyAjIHN1YiBjYXRfZGlyCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBGaWxlIGFuZCBkaXJlY3RvcnkgbWFuaXB1bGF0aW9uIHN1YnJvdXRpbmVzLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKz1oZWFkMiBGaWxlIGFuZCBkaXJlY3RvcnkgbWFuaXB1bGF0aW9uIHN1YnJvdXRpbmVzLgorCis9b3ZlcgorCis9Y3V0CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBDPHdoaWNoKCAkZmlsZSwgQG9wdGlvbnMgKT4KKworU2VhcmNoZXMgZm9yIHNwZWNpZmllZCBleGVjdXRhYmxlIGZpbGUgaW4gdGhlIChzcGVjaWZpZWQpIGRpcmVjdG9yaWVzLgorUmFpc2VzIGEgcnVudGltZSBlcm9yb3IgaWYgbm8gZXhlY3V0YWJsZSBmaWxlIGZvdW5kLiBSZXR1cm5zIGEgZnVsbCBwYXRoIG9mIGZvdW5kIGV4ZWN1dGFibGUocykuCisKK09wdGlvbnM6CisKKz1vdmVyCisKKz1pdGVtIEM8LWFsbD4gPUU8Z3Q+IEk8Ym9vbD4KKworRG8gbm90IHN0b3Agb24gdGhlIGZpcnN0IGZvdW5kIGZpbGUuIE5vdGUsIHRoYXQgbGlzdCBvZiBmdWxsIHBhdGhzIGlzIHJldHVybmVkIGluIHRoaXMgY2FzZS4KKworPWl0ZW0gQzwtZGlycz4gPUU8Z3Q+IEk8cmVmX3RvX2FycmF5PgorCitTcGVjaWZ5IGRpcmVjdG9yeSBsaXN0IHRvIHNlYXJjaCB0aHJvdWdoLiBJZiBvcHRpb24gaXMgbm90IHBhc3NlZCwgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZQoraXMgdXNlZCBmb3IgZGlyZWN0b3J5IGxpc3QuCisKKz1pdGVtIEM8LWV4ZWM+ID1FPGd0PiBJPGJvb2w+CisKK1doZXRoZXIgY2hlY2sgZm9yIGV4ZWN1dGFibGUgZmlsZXMgb3Igbm90LiBCeSBkZWZhdWx0LCBDPHdoaWNoPiBzZWFyY2hlcyBleGVjdXRhYmxlIGZpbGVzLgorSG93ZXZlciwgb24gQ3lnd2luIGV4ZWN1dGFibGUgY2hlY2sgbmV2ZXIgcGVyZm9ybWVkLgorCis9YmFjaworCitFeGFtcGxlczoKKworTG9vayBmb3IgImVjaG8iIGluIHRoZSBkaXJlY3RvcmllcyBzcGVjaWZpZWQgaW4gUEFUSDoKKworICAgIG15ICRlY2hvID0gd2hpY2goICJlY2hvIiApOworCitMb29rIGZvciBhbGwgb2NjdXJlbnNlcyBvZiAiY3AiIGluIHRoZSBQQVRIOgorCisgICAgbXkgQGNwcyA9IHdoaWNoKCAiY3AiLCAtYWxsID0+IDEgKTsKKworTG9vayBmb3IgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgImljYyIgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcmllczoKKworICAgIG15ICRpY2MgPSB3aGljaCggImljYyIsIC1kaXJzID0+IFsgIi4iLCAiL3Vzci9sb2NhbC9iaW4iLCAiL3Vzci9iaW4iLCAiL2JpbiIgXSApOworCitMb29rIGZvciB0aGUgdGhlIEM8b21wX2xpYi5mPiBmaWxlOgorCisgICAgbXkgQG9tcF9saWIgPSB3aGljaCggIm9tcF9saWIuZiIsIC1hbGwgPT4gMSwgLWV4ZWMgPT4gMCwgLWRpcnMgPT4gWyBAaW5jbHVkZSBdICk7CisKKz1jdXQKKworc3ViIHdoaWNoKCRAKSB7CisKKyAgICBteSAkZmlsZSA9IHNoaWZ0KCBAXyApOworICAgIG15ICVvcHRzID0gQF87CisKKyAgICBjaGVja19vcHRzKCAlb3B0cywgWyBxdyggLWFsbCAtZGlycyAtZXhlYyApIF0gKTsKKyAgICBpZiAoICRvcHRzeyAtYWxsIH0gYW5kIG5vdCB3YW50YXJyYXkoKSApIHsKKyAgICAgICAgbG9jYWwgJENhcnA6OkNhcnBMZXZlbCA9IDE7CisgICAgICAgIENhcnA6OmNsdWNrKCAiYC1hbGwnIG9wdGlvbiBwYXNzZWQgdG8gYHdoaWNoJyBidXQgbGlzdCBpcyBub3QgZXhwZWN0ZWQiICk7CisgICAgfTsgIyBpZgorICAgIGlmICggbm90IGRlZmluZWQoICRvcHRzeyAtZXhlYyB9ICkgKSB7CisgICAgICAgICRvcHRzeyAtZXhlYyB9ID0gMTsKKyAgICB9OyAjIGlmCisKKyAgICBteSAkZGlycyA9ICggZXhpc3RzKCAkb3B0c3sgLWRpcnMgfSApID8gJG9wdHN7IC1kaXJzIH0gOiBbIEZpbGU6OlNwZWMtPnBhdGgoKSBdICk7CisgICAgbXkgQGZvdW5kOworCisgICAgbXkgQGV4dHMgPSAoICIiICk7CisgICAgaWYgKCAkXk8gZXEgIk1TV2luMzIiIGFuZCAkb3B0c3sgLWV4ZWMgfSApIHsKKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkRU5WeyBQQVRIRVhUIH0gKSApIHsKKyAgICAgICAgICAgIHB1c2goIEBleHRzLCBzcGxpdCggIjsiLCAkRU5WeyBQQVRIRVhUIH0gKSApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIyBJZiBQQVRIRVhUIGRvZXMgbm90IGV4aXN0LCB1c2UgZGVmYXVsdCB2YWx1ZS4KKyAgICAgICAgICAgIHB1c2goIEBleHRzLCBxd3sgLkNPTSAuRVhFIC5CQVQgLkNNRCB9ICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisKKyAgICBsb29wOgorICAgIGZvcmVhY2ggbXkgJGRpciAoIEAkZGlycyApIHsKKyAgICAgICAgZm9yZWFjaCBteSAkZXh0ICggQGV4dHMgKSB7CisgICAgICAgICAgICBteSAkcGF0aCA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoICRkaXIsICRmaWxlIC4gJGV4dCApOworICAgICAgICAgICAgaWYgKCAtZSAkcGF0aCApIHsKKyAgICAgICAgICAgICAgICAjIEV4ZWN1dGFibGUgYml0IGlzIG5vdCByZWxpYWJsZSBvbiBDeWd3aW4sIGRvIG5vdCBjaGVjayBpdC4KKyAgICAgICAgICAgICAgICBpZiAoIG5vdCAkb3B0c3sgLWV4ZWMgfSBvciAteCAkcGF0aCBvciAkXk8gZXEgImN5Z3dpbiIgKSB7CisgICAgICAgICAgICAgICAgICAgIHB1c2goIEBmb3VuZCwgJHBhdGggKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBub3QgJG9wdHN7IC1hbGwgfSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgbG9vcDsKKyAgICAgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBmb3JlYWNoICRleHQKKyAgICB9OyAjIGZvcmVhY2ggJGRpcgorCisgICAgaWYgKCBub3QgQGZvdW5kICkgeworICAgICAgICAjIFRCRDogV2UgbmVlZCB0byBpbnRyb2R1Y2UgYW4gb3B0aW9uIGZvciBjb25kaXRpb25hbCBlbmFibGluZyB0aGlzIGVycm9yLgorICAgICAgICAjIHJ1bnRpbWVfZXJyb3IoICJDb3VsZCBub3QgZmluZCBcIiRmaWxlXCIgZXhlY3V0YWJsZSBmaWxlIGluIFBBVEguIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIEBmb3VuZCA+IDEgKSB7CisgICAgICAgICMgVEJEOiBJc3N1ZSBhIHdhcm5pbmc/CisgICAgfTsgIyBpZgorCisgICAgaWYgKCAkb3B0c3sgLWFsbCB9ICkgeworICAgICAgICByZXR1cm4gQGZvdW5kOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAkZm91bmRbIDAgXTsKKyAgICB9OyAjIGlmCisKK307ICMgc3ViIHdoaWNoCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBDPGFic19wYXRoKCAkcGF0aCwgJGJhc2UgKT4KKworUmV0dXJuIGFic29sdXRlIHBhdGggZm9yIGFuIGFyZ3VtZW50LgorCitNb3N0IG9mIHRoZSB3b3JrIGlzIGRvbmUgYnkgQzxGaWxlOjpTcGVjLT5yZWwyYWJzKCk+LiBDPGFic19wYXRoKCk+IGFkZGl0aW9uYWxseSBjb2xsYXBzZXMKK0M8ZGlyMS8uLi9kaXIyPiB0byBDPGRpcjI+LgorCitJdCBpcyBub3Qgc28gbmFpdmUgYW5kIG1hZGUgaW50ZW50aW9uYWxseS4gRm9yIGV4YW1wbGUgb24gTGludXgqIE9TIGluIEJhc2ggaWYgRjxsaW5rLz4gaXMgYSBzeW1ib2xpYworbGluayB0byBkaXJlY3RvcnkgRjxzb21lX2Rpci8+CisKKyAgICAkIGNkIGxpbmsKKyAgICAkIGNkIC4uCisKK2JyaW5ncyB5b3UgYmFjayB0byBGPGxpbmsvPidzIHBhcmVudCwgbm90IHRvIHBhcmVudCBvZiBGPHNvbWVfZGlyLz4sCisKKz1jdXQKKworc3ViIGFic19wYXRoKCQ7JCkgeworCisgICAgbXkgKCAkcGF0aCwgJGJhc2UgKSA9IEBfOworICAgICRwYXRoID0gRmlsZTo6U3BlYy0+cmVsMmFicyggJHBhdGgsICggZGVmaW5lZCggJGJhc2UgKSA/ICRiYXNlIDogJEVOVnsgUFdEIH0gKSApOworICAgIG15ICggJHZvbCwgJGRpciwgJGZpbGUgKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggJHBhdGggKTsKKyAgICB3aGlsZSAoICRkaXIgPX4gc3svKD8hXC5cLilbXi9dKi9cLlwuKD86L3xceil9ey99ICkgeworICAgIH07ICMgd2hpbGUKKyAgICAkcGF0aCA9IEZpbGU6OlNwZWMtPmNhbm9ucGF0aCggRmlsZTo6U3BlYy0+Y2F0cGF0aCggJHZvbCwgJGRpciwgJGZpbGUgKSApOworICAgIHJldHVybiAkcGF0aDsKKworfTsgIyBzdWIgYWJzX3BhdGgKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8cmVsX3BhdGgoICRwYXRoLCAkYmFzZSApPgorCitSZXR1cm4gcmVsYXRpdmUgcGF0aCBmb3IgYW4gYXJndW1lbnQuCisKKz1jdXQKKworc3ViIHJlbF9wYXRoKCQ7JCkgeworCisgICAgbXkgKCAkcGF0aCwgJGJhc2UgKSA9IEBfOworICAgICRwYXRoID0gRmlsZTo6U3BlYy0+YWJzMnJlbCggYWJzX3BhdGgoICRwYXRoICksICRiYXNlICk7CisgICAgcmV0dXJuICRwYXRoOworCit9OyAjIHN1YiByZWxfcGF0aAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWl0ZW0gQzxyZWFsX3BhdGgoICRkaXIgKT4KKworUmV0dXJuIHJlYWwgYWJzb2x1dGUgcGF0aCBmb3IgYW4gYXJndW1lbnQuIEluIHRoZSByZXN1bHQgYWxsIHJlbGF0aXZlIGNvbXBvbmVudHMgKEY8Lj4gYW5kIEY8Li4+KQorYW5kIFU8c3ltYm9saWMgbGlua3MgYXJlIHJlc29sdmVkPi4KKworSW4gbW9zdCBjYXNlcyBpdCBpcyBub3Qgd2hhdCB5b3Ugd2FudC4gQ29uc2lkZXIgdXNpbmcgQzxhYnNfcGF0aD4gZmlyc3QuCisKK0M8YWJzX3BhdGg+IGZ1bmN0aW9uIGZyb20gQjxDd2Q+IG1vZHVsZSB3b3JrcyB3aXRoIGRpcmVjdG9yaWVzIG9ubHkuIFRoaXMgZnVuY3Rpb24gd29ya3Mgd2l0aCBmaWxlcworYXMgd2VsbC4gQnV0LCBpZiBmaWxlIGlzIGEgc3ltYm9saWMgbGluaywgZnVuY3Rpb24gZG9lcyBub3QgcmVzb2x2ZSBpdCAoeWV0KS4KKworVGhlIGZ1bmN0aW9uIHVzZXMgQzxydW50aW1lX2Vycm9yPiB0byByYWlzZSBhbiBlcnJvciBpZiBzb21ldGhpbmcgd3JvbmcuCisKKz1jdXQKKworc3ViIHJlYWxfcGF0aCgkKSB7CisKKyAgICBteSAkb3JpZ19wYXRoID0gc2hpZnQoIEBfICk7CisgICAgbXkgJHJlYWxfcGF0aDsKKyAgICBteSAkbWVzc2FnZSA9ICIiOworICAgIGlmICggbm90IC1lICRvcmlnX3BhdGggKSB7CisgICAgICAgICRtZXNzYWdlID0gIlwiJG9yaWdfcGF0aFwiIGRvZXMgbm90IGV4aXN0cyI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgIyBDd2Q6OmFic19wYXRoIGRvZXMgbm90IHdvcmsgd2l0aCBmaWxlcywgc28gaW4gdGhpcyBjYXNlIHdlIHNob3VsZCBoYW5kbGUgZmlsZSBzZXBhcmF0ZWx5LgorICAgICAgICBteSAkZmlsZTsKKyAgICAgICAgaWYgKCBub3QgLWQgJG9yaWdfcGF0aCApIHsKKyAgICAgICAgICAgICggbXkgJHZvbCwgbXkgJGRpciwgJGZpbGUgKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggRmlsZTo6U3BlYy0+cmVsMmFicyggJG9yaWdfcGF0aCApICk7CisgICAgICAgICAgICAkb3JpZ19wYXRoID0gRmlsZTo6U3BlYy0+Y2F0cGF0aCggJHZvbCwgJGRpciApOworICAgICAgICB9OyAjIGlmCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2FsICRTSUd7IF9fV0FSTl9fIH0gPSBzdWIgeyAkbWVzc2FnZSA9ICRfWyAwIF07IH07CisgICAgICAgICAgICAkcmVhbF9wYXRoID0gQ3dkOjphYnNfcGF0aCggJG9yaWdfcGF0aCApOworICAgICAgICB9OworICAgICAgICBpZiAoIGRlZmluZWQoICRmaWxlICkgKSB7CisgICAgICAgICAgICAkcmVhbF9wYXRoID0gRmlsZTo6U3BlYy0+Y2F0ZmlsZSggJHJlYWxfcGF0aCwgJGZpbGUgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkcmVhbF9wYXRoICkgb3IgJG1lc3NhZ2UgbmUgIiIgKSB7CisgICAgICAgICRtZXNzYWdlID1+IHMvXnN0YXRcKC4qXCk6ICguKilccythdCAuKj8gbGluZSBcZCtccypcei8kMS87CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICJDb3VsZCBub3QgZmluZCByZWFsIHBhdGggZm9yIFwiJG9yaWdfcGF0aFwiIiAuICggJG1lc3NhZ2UgbmUgIiIgPyAiOiAkbWVzc2FnZSIgOiAiIiApICk7CisgICAgfTsgIyBpZgorICAgIHJldHVybiAkcmVhbF9wYXRoOworCit9OyAjIHN1YiByZWFsX3BhdGgKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8bWFrZV9kaXIoICRkaXIsIEBvcHRpb25zICk+CisKK01ha2UgYSBkaXJlY3RvcnkuCisKK1RoaXMgZnVuY3Rpb24gbWFrZXMgYSBkaXJlY3RvcnkuIElmIG5lY2Vzc2FyeSwgbW9yZSB0aGFuIG9uZSBsZXZlbCBjYW4gYmUgY3JlYXRlZC4KK0lmIGRpcmVjdG9yeSBleGlzdHMsIHdhcm5pbmcgaXNzdWVzICh0aGUgc2NyaXB0IGJlaGF2aW9yIGRlcGVuZHMgb24gdmFsdWUgb2YKK0M8LXdhcm5pbmdfbGV2ZWw+IG9wdGlvbikuIElmIGRpcmVjdG9yeSBjcmVhdGlvbiBmYWlscyBvciBDPCRkaXI+IGV4aXN0cyBidXQgaXQgaXMgbm90IGEKK2RpcmVjdG9yeSwgZXJyb3IgaXNzc3Vlcy4KKworT3B0aW9uczoKKworPW92ZXIKKworPWl0ZW0gQzwtbW9kZT4KKworVGhlIG51bWVyaWMgbW9kZSBmb3IgbmV3IGRpcmVjdG9yaWVzLCAwNzUwIChyd3hyLXgtLS0pIGJ5IGRlZmF1bHQuCisKKz1iYWNrCisKKz1jdXQKKworc3ViIG1ha2VfZGlyKCRAKSB7CisKKyAgICBteSAkZGlyICAgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJW9wdHMgICA9CisgICAgICAgIHZhbGlkYXRlKAorICAgICAgICAgICAgcGFyYW1zID0+IFxAXywKKyAgICAgICAgICAgIHNwZWMgPT4geworICAgICAgICAgICAgICAgIHBhcmVudHMgPT4geyB0eXBlID0+ICJib29sZWFuIiwgZGVmYXVsdCA9PiAxICAgIH0sCisgICAgICAgICAgICAgICAgbW9kZSAgICA9PiB7IHR5cGUgPT4gInNjYWxhciIsICBkZWZhdWx0ID0+IDA3NzcgfSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICk7CisKKyAgICBteSAkcHJlZml4ID0gIkNvdWxkIG5vdCBjcmVhdGUgZGlyZWN0b3J5IFwiJGRpclwiIjsKKworICAgIGlmICggLWUgJGRpciApIHsKKyAgICAgICAgaWYgKCAtZCAkZGlyICkgeworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IGl0IGV4aXN0cywgYnV0IG5vdCBhIGRpcmVjdG9yeS4iICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9IGVsc2UgeworICAgICAgICBldmFsIHsKKyAgICAgICAgICAgIEZpbGU6OlBhdGg6Om1rcGF0aCggJGRpciwgMCwgJG9wdHN7IG1vZGUgfSApOworICAgICAgICB9OyAjIGV2YWwKKyAgICAgICAgaWYgKCAkQCApIHsKKyAgICAgICAgICAgICRAID1+IHN7XHMrYXQgKD86W2EtekEtWjAtOSAvXy5dKi8pP3Rvb2xzXC5wbSBsaW5lIFxkK1xzKn17fTsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiAkQCIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoIG5vdCAtZCAkZGlyICkgeyAjIEp1c3QgaW4gY2FzZSwgY2hlY2sgaXQgb25lIG1vcmUgdGltZS4uLgorICAgICAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXguIiApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorCit9OyAjIHN1YiBtYWtlX2RpcgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWl0ZW0gQzxjb3B5X2RpciggJHNyY19kaXIsICRkc3RfZGlyLCBAb3B0aW9ucyApPgorCitDb3B5IGRpcmVjdG9yeSByZWN1cnNpdmVseS4KKworVGhpcyBmdW5jdGlvbiBjb3BpZXMgYSBkaXJlY3RvcnkgcmVjdXJzaXZlbHkuCitJZiBzb3VyY2UgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0IG9yIG5vdCBhIGRpcmVjdG9yeSwgZXJyb3IgaXNzdWVzLgorCitPcHRpb25zOgorCis9b3ZlcgorCis9aXRlbSBDPC1vdmVyd3JpdGU+CisKK092ZXJ3cml0ZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnksIGlmIGl0IGV4aXN0cy4KKworPWJhY2sKKworPWN1dAorCitzdWIgY29weV9kaXIoJCRAKSB7CisKKyAgICBteSAkc3JjICA9IHNoaWZ0KCBAXyApOworICAgIG15ICRkc3QgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJW9wdHMgPSBAXzsKKyAgICBteSAkcHJlZml4ID0gIkNvdWxkIG5vdCBjb3B5IGRpcmVjdG9yeSBcIiRzcmNcIiB0byBcIiRkc3RcIiI7CisKKyAgICBpZiAoIG5vdCAtZSAkc3JjICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkc3JjXCIgZG9lcyBub3QgZXhpc3QuIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIG5vdCAtZCAkc3JjICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkc3JjXCIgaXMgbm90IGEgZGlyZWN0b3J5LiIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCAtZSAkZHN0ICkgeworICAgICAgICBpZiAoIC1kICRkc3QgKSB7CisgICAgICAgICAgICBpZiAoICRvcHRzeyAtb3ZlcndyaXRlIH0gKSB7CisgICAgICAgICAgICAgICAgZGVsX2RpciggJGRzdCApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkZHN0XCIgYWxyZWFkeSBleGlzdHMuIiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJGRzdFwiIGlzIG5vdCBhIGRpcmVjdG9yeS4iICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisKKyAgICBleGVjdXRlKCBbICJjcCIsICItUiIsICRzcmMsICRkc3QgXSApOworCit9OyAjIHN1YiBjb3B5X2RpcgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWl0ZW0gQzxtb3ZlX2RpciggJHNyY19kaXIsICRkc3RfZGlyLCBAb3B0aW9ucyApPgorCitNb3ZlIGRpcmVjdG9yeS4KKworT3B0aW9uczoKKworPW92ZXIKKworPWl0ZW0gQzwtb3ZlcndyaXRlPgorCitPdmVyd3JpdGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LCBpZiBpdCBleGlzdHMuCisKKz1iYWNrCisKKz1jdXQKKworc3ViIG1vdmVfZGlyKCQkQCkgeworCisgICAgbXkgJHNyYyAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkZHN0ICA9IHNoaWZ0KCBAXyApOworICAgIG15ICVvcHRzID0gQF87CisgICAgbXkgJHByZWZpeCA9ICJDb3VsZCBub3QgY29weSBkaXJlY3RvcnkgXCIkc3JjXCIgdG8gXCIkZHN0XCIiOworCisgICAgaWYgKCBub3QgLWUgJHNyYyApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJHNyY1wiIGRvZXMgbm90IGV4aXN0LiIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBub3QgLWQgJHNyYyApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJHNyY1wiIGlzIG5vdCBhIGRpcmVjdG9yeS4iICk7CisgICAgfTsgIyBpZgorICAgIGlmICggLWUgJGRzdCApIHsKKyAgICAgICAgaWYgKCAtZCAkZHN0ICkgeworICAgICAgICAgICAgaWYgKCAkb3B0c3sgLW92ZXJ3cml0ZSB9ICkgeworICAgICAgICAgICAgICAgIGRlbF9kaXIoICRkc3QgKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJGRzdFwiIGFscmVhZHkgZXhpc3RzLiIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRkc3RcIiBpcyBub3QgYSBkaXJlY3RvcnkuIiApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorCisgICAgZXhlY3V0ZSggWyAibXYiLCAkc3JjLCAkZHN0IF0gKTsKKworfTsgIyBzdWIgbW92ZV9kaXIKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8Y2xlYW5fZGlyKCAkZGlyLCBAb3B0aW9ucyApPgorCitDbGVhbiBhIGRpcmVjdG9yeTogZGVsZXRlIGFsbCB0aGUgZW50cmllcyAocmVjdXJzaXZlbHkpLCBidXQgbGVhdmUgdGhlIGRpcmVjdG9yeS4KKworT3B0aW9uczoKKworPW92ZXIKKworPWl0ZW0gQzwtZm9yY2U+ID0+IGJvb2wKKworSWYgYSBkaXJlY3RvcnkgaXMgbm90IHdyaXRhYmxlLCB0cnkgdG8gY2hhbmdlIHBlcm1pc3Npb25zIGZpcnN0LCB0aGVuIGNsZWFuIGl0LgorCis9aXRlbSBDPC1za2lwPiA9PiByZWdleHAKKworUmVnZXhwLiBJZiBhIGRpcmVjdG9yeSBlbnRyeSBtYWNoZWQgdGhlIHJlZ2V4cCwgaXQgaXMgc2tpcHBlZCwgbm90IGRlbGV0ZWQuIChBcyBhIHN1YnNlcXVlbmNlLAorYSBkaXJlY3RvcnkgY29udGFpbmluZyBza2lwcGVkIGVudHJpZXMgaXMgbm90IGRlbGV0ZWQuKQorCis9YmFjaworCis9Y3V0CisKK3N1YiBfY2xlYW5fZGlyKCQpOworCitzdWIgX2NsZWFuX2RpcigkKSB7CisgICAgb3VyICVfY2xlYW5fZGlyX29wdHM7CisgICAgbXkgKCAkZGlyICkgPSBAXzsKKyAgICBteSAkc2tpcCAgICA9ICRfY2xlYW5fZGlyX29wdHN7IHNraXAgfTsgICAgIyBSZWdleHAuCisgICAgbXkgJHNraXBwZWQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTnVtYmVyIG9mIHNraXBwZWQgZmlsZXMuCisgICAgbXkgJHByZWZpeCAgPSAiQ2xlYW5pbmcgYCRkaXInIGZhaWxlZDoiOworICAgIG15IEBzdGF0ICAgID0gc3RhdCggJGRpciApOworICAgIG15ICRtb2RlICAgID0gJHN0YXRbIDIgXTsKKyAgICBpZiAoIG5vdCBAc3RhdCApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggJHByZWZpeCwgIkNhbm5vdCBzdGF0IGAkZGlyJzogJCEiICk7CisgICAgfTsgIyBpZgorICAgIGlmICggbm90IC1kIF8gKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICRwcmVmaXgsICJJdCBpcyBub3QgYSBkaXJlY3RvcnkuIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIG5vdCAtdyBfICkgeyAgICAgICAgIyBEaXJlY3RvcnkgaXMgbm90IHdyaXRhYmxlLgorICAgICAgICBpZiAoIG5vdCAtbyBfIG9yIG5vdCAkX2NsZWFuX2Rpcl9vcHRzeyBmb3JjZSB9ICkgeworICAgICAgICAgICAgcnVudGltZV9lcnJvciggJHByZWZpeCwgIkRpcmVjdG9yeSBpcyBub3Qgd3JpdGFibGUuIiApOworICAgICAgICB9OyAjIGlmCisgICAgICAgICMgRGlyZWN0b3J5IGlzIG5vdCB3cml0YWJsZSBidXQgbWluZS4gVHJ5IHRvIGNoYW5nZSBwZXJtaXNzaW9ucy4KKyAgICAgICAgY2htb2QoICRtb2RlIHwgU19JV1VTUiwgJGRpciApCisgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAkcHJlZml4LCAiQ2Fubm90IG1ha2UgZGlyZWN0b3J5IHdyaXRhYmxlOiAkISIgKTsKKyAgICB9OyAjIGlmCisgICAgbXkgJGhhbmRsZSAgID0gSU86OkRpci0+bmV3KCAkZGlyICkgb3IgcnVudGltZV9lcnJvciggJHByZWZpeCwgIkNhbm5vdCByZWFkIGRpcmVjdG9yeTogJCEiICk7CisgICAgbXkgQGVudHJpZXMgID0gRmlsZTo6U3BlYy0+bm9fdXB3YXJkcyggJGhhbmRsZS0+cmVhZCgpICk7CisgICAgJGhhbmRsZS0+Y2xvc2UoKSBvciBydW50aW1lX2Vycm9yKCAkcHJlZml4LCAiQ2Fubm90IHJlYWQgZGlyZWN0b3J5OiAkISIgKTsKKyAgICBmb3JlYWNoIG15ICRlbnRyeSAoIEBlbnRyaWVzICkgeworICAgICAgICBteSAkcGF0aCA9IGNhdF9maWxlKCAkZGlyLCAkZW50cnkgKTsKKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkc2tpcCApIGFuZCAkZW50cnkgPX4gJHNraXAgKSB7CisgICAgICAgICAgICArKyAkc2tpcHBlZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICggLWwgJHBhdGggKSB7CisgICAgICAgICAgICAgICAgdW5saW5rKCAkcGF0aCApIG9yIHJ1bnRpbWVfZXJyb3IoICRwcmVmaXgsICJDYW5ub3QgZGVsZXRlIHN5bWxpbmsgYCRwYXRoJzogJCEiICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXQoICRwYXRoICkgb3IgcnVudGltZV9lcnJvciggJHByZWZpeCwgIkNhbm5vdCBzdGF0IGAkcGF0aCc6ICQhICIgKTsKKyAgICAgICAgICAgICAgICBpZiAoIC1mIF8gKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbF9maWxlKCAkcGF0aCApOworICAgICAgICAgICAgICAgIH0gZWxzaWYgKCAtZCBfICkgeworICAgICAgICAgICAgICAgICAgICBteSAkcmMgPSBfY2xlYW5fZGlyKCAkcGF0aCApOworICAgICAgICAgICAgICAgICAgICBpZiAoICRyYyA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgcm1kaXIoICRwYXRoICkgb3IgcnVudGltZV9lcnJvciggJHByZWZpeCwgIkNhbm5vdCBkZWxldGUgZGlyZWN0b3J5IGAkcGF0aCc6ICQhIiApOworICAgICAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgICAgICRza2lwcGVkICs9ICRyYzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAkcHJlZml4LCAiYCRwYXRoJyBpcyBuZWl0aGVyIGEgZmlsZSBub3IgYSBkaXJlY3RvcnkuIiApOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaAorICAgIHJldHVybiAkc2tpcHBlZDsKK307ICMgc3ViIF9jbGVhbl9kaXIKKworCitzdWIgY2xlYW5fZGlyKCRAKSB7CisgICAgbXkgJGRpciAgPSBzaGlmdCggQF8gKTsKKyAgICBvdXIgJV9jbGVhbl9kaXJfb3B0czsKKyAgICBsb2NhbCAlX2NsZWFuX2Rpcl9vcHRzID0KKyAgICAgICAgdmFsaWRhdGUoCisgICAgICAgICAgICBwYXJhbXMgPT4gXEBfLAorICAgICAgICAgICAgc3BlYyA9PiB7CisgICAgICAgICAgICAgICAgc2tpcCAgPT4geyB0eXBlID0+ICJyZWdleHByZWYiIH0sCisgICAgICAgICAgICAgICAgZm9yY2UgPT4geyB0eXBlID0+ICJib29sZWFuIiAgIH0sCisgICAgICAgICAgICB9LAorICAgICAgICApOworICAgIG15ICRza2lwcGVkID0gX2NsZWFuX2RpciggJGRpciApOworICAgIHJldHVybiAkc2tpcHBlZDsKK307ICMgc3ViIGNsZWFuX2RpcgorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBDPGRlbF9kaXIoICRkaXIsIEBvcHRpb25zICk+CisKK0RlbGV0ZSBhIGRpcmVjdG9yeSByZWN1cnNpdmVseS4KKworVGhpcyBmdW5jdGlvbiBkZWxldGVzIGEgZGlyZWN0b3J5LiBJZiBkaXJlY3RvcnkgY2FuIG5vdCBiZSBkZWxldGVkIG9yIGl0IGlzIG5vdCBhIGRpcmVjdG9yeSwgZXJyb3IKK21lc3NhZ2UgaXNzdWVzIChhbmQgc2NyaXB0IGV4aXN0cykuCisKK09wdGlvbnM6CisKKz1vdmVyCisKKz1iYWNrCisKKz1jdXQKKworc3ViIGRlbF9kaXIoJEApIHsKKworICAgIG15ICRkaXIgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJW9wdHMgPSBAXzsKKyAgICBteSAkcHJlZml4ID0gIkRlbGV0aW5nIGRpcmVjdG9yeSBcIiRkaXJcIiBmYWlsZWQiOworICAgIG91ciAlX2NsZWFuX2Rpcl9vcHRzOworICAgIGxvY2FsICVfY2xlYW5fZGlyX29wdHMgPQorICAgICAgICB2YWxpZGF0ZSgKKyAgICAgICAgICAgIHBhcmFtcyA9PiBcQF8sCisgICAgICAgICAgICBzcGVjID0+IHsKKyAgICAgICAgICAgICAgICBmb3JjZSA9PiB7IHR5cGUgPT4gImJvb2xlYW4iIH0sCisgICAgICAgICAgICB9LAorICAgICAgICApOworCisgICAgaWYgKCBub3QgLWUgJGRpciApIHsKKyAgICAgICAgIyBOb3RoaW5nIHRvIGRvLgorICAgICAgICByZXR1cm47CisgICAgfTsgIyBpZgorICAgIGlmICggbm90IC1kICRkaXIgKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBpdCBpcyBub3QgYSBkaXJlY3RvcnkuIiApOworICAgIH07ICMgaWYKKyAgICBfY2xlYW5fZGlyKCAkZGlyICk7CisgICAgcm1kaXIoICRkaXIgKSBvciBydW50aW1lX2Vycm9yKCAiJHByZWZpeC4iICk7CisKK307ICMgc3ViIGRlbF9kaXIKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8Y2hhbmdlX2RpciggJGRpciApPgorCitDaGFuZ2UgY3VycmVudCBkaXJlY3RvcnkuCisKK0lmIGFueSBlcnJvciBvY2N1cnJlZCwgZXJyb3IgaXNzdWVzIGFuZCBzY3JpcHQgZXhpdHMuCisKKz1jdXQKKworc3ViIGNoYW5nZV9kaXIoJCkgeworCisgICAgbXkgJGRpciA9IHNoaWZ0KCBAXyApOworCisgICAgQ3dkOjpjaGRpciggJGRpciApCisgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICJDb3VsZCBub3QgY2hkaXIgdG8gXCIkZGlyXCI6ICQhIiApOworCit9OyAjIHN1YiBjaGFuZ2VfZGlyCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8Y29weV9maWxlKCAkc3JjX2ZpbGUsICRkc3RfZmlsZSwgQG9wdGlvbnMgKT4KKworQ29weSBmaWxlLgorCitUaGlzIGZ1bmN0aW9uIGNvcGllcyBhIGZpbGUuIElmIHNvdXJjZSBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYSBmaWxlLCBlcnJvciBpc3N1ZXMuCisKK09wdGlvbnM6CisKKz1vdmVyCisKKz1pdGVtIEM8LW92ZXJ3cml0ZT4KKworT3ZlcndyaXRlIGRlc3RpbmF0aW9uIGZpbGUsIGlmIGl0IGV4aXN0cy4KKworPWJhY2sKKworPWN1dAorCitzdWIgY29weV9maWxlKCQkQCkgeworCisgICAgbXkgJHNyYyAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkZHN0ICA9IHNoaWZ0KCBAXyApOworICAgIG15ICVvcHRzID0gQF87CisgICAgbXkgJHByZWZpeCA9ICJDb3VsZCBub3QgY29weSBmaWxlIFwiJHNyY1wiIHRvIFwiJGRzdFwiIjsKKworICAgIGlmICggbm90IC1lICRzcmMgKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRzcmNcIiBkb2VzIG5vdCBleGlzdC4iICk7CisgICAgfTsgIyBpZgorICAgIGlmICggbm90IC1mICRzcmMgKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRzcmNcIiBpcyBub3QgYSBmaWxlLiIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCAtZSAkZHN0ICkgeworICAgICAgICBpZiAoIC1mICRkc3QgKSB7CisgICAgICAgICAgICBpZiAoICRvcHRzeyAtb3ZlcndyaXRlIH0gKSB7CisgICAgICAgICAgICAgICAgZGVsX2ZpbGUoICRkc3QgKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJGRzdFwiIGFscmVhZHkgZXhpc3RzLiIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRkc3RcIiBpcyBub3QgYSBmaWxlLiIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKworICAgIEZpbGU6OkNvcHk6OmNvcHkoICRzcmMsICRkc3QgKSBvciBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogJCEiICk7CisgICAgIyBPbiBXaW5kb3dzKiBPUyBGaWxlOjpDb3B5IHByZXNlcnZlcyBmaWxlIGF0dHJpYnV0ZXMsIGJ1dCBvbiBMaW51eCogT1MgaXQgZG9lc24ndC4KKyAgICAjIFNvIHdlIHNob3VsZCBkbyBpdCBtYW51YWxseS4uLgorICAgIGlmICggJF5PID1+IG0vXmxpbnV4XHovICkgeworICAgICAgICBteSAkbW9kZSA9ICggc3RhdCggJHNyYyApIClbIDIgXQorICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IGNhbm5vdCBnZXQgc3RhdHVzIGluZm8gZm9yIHNvdXJjZSBmaWxlLiIgKTsKKyAgICAgICAgY2htb2QoICRtb2RlLCAkZHN0ICkKKyAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBjYW5ub3QgY2hhbmdlIG1vZGUgb2YgZGVzdGluYXRpb24gZmlsZS4iICk7CisgICAgfTsgIyBpZgorCit9OyAjIHN1YiBjb3B5X2ZpbGUKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N1YiBtb3ZlX2ZpbGUoJCRAKSB7CisKKyAgICBteSAkc3JjICA9IHNoaWZ0KCBAXyApOworICAgIG15ICRkc3QgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJW9wdHMgPSBAXzsKKyAgICBteSAkcHJlZml4ID0gIkNvdWxkIG5vdCBtb3ZlIGZpbGUgXCIkc3JjXCIgdG8gXCIkZHN0XCIiOworCisgICAgY2hlY2tfb3B0cyggJW9wdHMsIFsgcXcoIC1vdmVyd3JpdGUgKSBdICk7CisKKyAgICBpZiAoIG5vdCAtZSAkc3JjICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkc3JjXCIgZG9lcyBub3QgZXhpc3QuIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIG5vdCAtZiAkc3JjICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkc3JjXCIgaXMgbm90IGEgZmlsZS4iICk7CisgICAgfTsgIyBpZgorICAgIGlmICggLWUgJGRzdCApIHsKKyAgICAgICAgaWYgKCAtZiAkZHN0ICkgeworICAgICAgICAgICAgaWYgKCAkb3B0c3sgLW92ZXJ3cml0ZSB9ICkgeworICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJGRzdFwiIGFscmVhZHkgZXhpc3RzLiIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRkc3RcIiBpcyBub3QgYSBmaWxlLiIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKworICAgIEZpbGU6OkNvcHk6Om1vdmUoICRzcmMsICRkc3QgKSBvciBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogJCEiICk7CisKK307ICMgc3ViIG1vdmVfZmlsZQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3ViIGRlbF9maWxlKCQpIHsKKyAgICBteSAkZmlsZXMgPSBzaGlmdCggQF8gKTsKKyAgICBpZiAoIHJlZiggJGZpbGVzICkgZXEgIiIgKSB7CisgICAgICAgICRmaWxlcyA9IFsgJGZpbGVzIF07CisgICAgfTsgIyBpZgorICAgIGZvcmVhY2ggbXkgJGZpbGUgKCBAJGZpbGVzICkgeworICAgICAgICBkZWJ1ZyggIkRlbGV0aW5nIGZpbGUgYCRmaWxlJy4uLiIgKTsKKyAgICAgICAgbXkgJHJjID0gdW5saW5rKCAkZmlsZSApOworICAgICAgICBpZiAoICRyYyA9PSAwICYmICQhICE9IEVOT0VOVCApIHsKKyAgICAgICAgICAgICMgUmVwb3JuIGFuIGVycm9yLCBidXQgaWdub3JlIEVOT0VOVCwgYmVjYXVzZSB0aGUgZ29hbCBpcyBhY2hpZXZlZC4KKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICJEZWxldGluZyBmaWxlIGAkZmlsZScgZmFpbGVkOiAkISIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaCAkZmlsZQorfTsgIyBzdWIgZGVsX2ZpbGUKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1iYWNrCisKKz1jdXQKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEZpbGUgSS9PIHN1YnJvdXRpbmVzLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKz1oZWFkMiBGaWxlIEkvTyBzdWJyb3V0aW5lcy4KKworPWN1dAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWhlYWQzIHJlYWRfZmlsZQorCitCPFN5bm9wc2lzOj4KKworICAgIHJlYWRfZmlsZSggJGZpbGUsIEBvcHRpb25zICkKKworQjxEZXNjcmlwdGlvbjo+CisKK1JlYWQgZmlsZSBhbmQgcmV0dXJuIGl0cyBjb250ZW50LiBJbiBzY2FsYXIgY29udGV4dCBmdW5jdGlvbiByZXR1cm5zIGEgc2NhbGFyLCBpbiBsaXN0IGNvbnRleHQKK2Z1bmN0aW9uIHJldHVybnMgbGlzdCBvZiBsaW5lcy4KKworTm90ZTogSWYgdGhlIGxhc3Qgb2YgZmlsZSBkb2VzIG5vdCB0ZXJtaW5hdGUgd2l0aCBuZXdsaW5lLCBmdW5jdGlvbiB3aWxsIGFwcGVuZCBpdC4KKworQjxBcmd1bWVudHM6PgorCis9b3ZlcgorCis9aXRlbSBCPCRmaWxlPgorCitBIG5hbWUgb3IgaGFuZGxlIG9mIGZpbGUgdG8gcmVhZCBmcm9tLgorCis9YmFjaworCitCPE9wdGlvbnM6PgorCis9b3ZlcgorCis9aXRlbSBCPC1iaW5hcnk+CisKK0lmIHRydWUsIGZpbGUgdHJlYXRzIGFzIGEgYmluYXJ5IGZpbGU6IG5vIG5ld2xpbmUgY29udmVyc2lvbiwgbm8gdHJ1bmNhdGluZyB0cmFpbGluZyBzcGFjZSwgbm8KK25ld2xpbmUgcmVtb3ZpbmcgcGVyZm9ybWVkLiBFbnRpcmUgZmlsZSByZXR1cm5lZCBhcyBhIHNjYWxhci4KKworPWl0ZW0gQjwtYnVsaz4KKworVGhpcyBvcHRpb24gaXMgYWxsb3dlZCBvbmx5IGluIGJpbmFyeSBtb2RlLiBPcHRpb24ncyB2YWx1ZSBzaG91bGQgYmUgYSByZWZlcmVuY2UgdG8gYSBzY2FsYXIuCitJZiBvcHRpb24gcHJlc2VudCwgZmlsZSBjb250ZW50IHBsYWNlZCB0byBwb2ludGVlIHNjYWxhciBhbmQgZnVuY3Rpb24gcmV0dXJucyB0cnVlICgxKS4KKworPWl0ZW0gQjwtY2hvbXA+CisKK0lmIHRydWUsIG5ld2xpbmUgY2hhcmFjdGVycyBhcmUgcmVtb3ZlZCBmcm9tIGZpbGUgY29udGVudC4gQnkgZGVmYXVsdCBuZXdsaW5lIGNoYXJhY3RlcnMgcmVtYWluLgorVGhpcyBvcHRpb24gaXMgbm90IGFwcGxpY2FibGUgaW4gYmluYXJ5IG1vZGUuCisKKz1pdGVtIEI8LWtlZXBfdHJhaWxpbmdfc3BhY2U+CisKK0lmIHRydWUsIHRyYWlubGluZyBzcGFjZSByZW1haW4gYXQgdGhlIGVuZHMgb2YgbGluZXMuIEJ5IGRlZmF1bHQgYWxsIHRyYWlsaW5nIHNwYWNlcyBhcmUgcmVtb3ZlZC4KK1RoaXMgb3B0aW9uIGlzIG5vdCBhcHBsaWNhYmxlIGluIGJpbmFyeSBtb2RlLgorCis9YmFjaworCitCPEV4YW1wbGVzOj4KKworUmV0dXJuIGZpbGUgYXMgc2luZ2xlIGxpbmUsIHJlbW92ZSB0cmFpbGluZyBzcGFjZXMuCisKKyAgICBteSAkYnVsayA9IHJlYWRfZmlsZSggIm1lc3NhZ2UudHh0IiApOworCitSZXR1cm4gZmlsZSBhcyBsaXN0IG9mIGxpbmVzIHdpdGggcmVtb3ZlZCB0cmFpbGluZyBzcGFjZSBhbmQKK25ld2xpbmUgY2hhcmFjdGVycy4KKworICAgIG15IEBidWxrID0gcmVhZF9maWxlKCAibWVzc2FnZS50eHQiLCAtY2hvbXAgPT4gMSApOworCitSZWFkIGEgYmluYXJ5IGZpbGU6CisKKyAgICBteSAkYnVsayA9IHJlYWRfZmlsZSggIm1lc3NhZ2UudHh0IiwgLWJpbmFyeSA9PiAxICk7CisKK1JlYWQgYSBiaWcgYmluYXJ5IGZpbGU6CisKKyAgICBteSAkYnVsazsKKyAgICByZWFkX2ZpbGUoICJiaWdfYmluYXJ5X2ZpbGUiLCAtYmluYXJ5ID0+IDEsIC1idWxrID0+IFwkYnVsayApOworCitSZWFkIGZyb20gc3RhbmRhcmQgaW5wdXQ6CisKKyAgICBteSBAYnVsayA9IHJlYWRfZmlsZSggXCpTVERJTiApOworCis9Y3V0CisKK3N1YiByZWFkX2ZpbGUoJEApIHsKKworICAgIG15ICRmaWxlID0gc2hpZnQoIEBfICk7ICAjIFRoZSBuYW1lIG9yIGhhbmRsZSBvZiBmaWxlIHRvIHJlYWQgZnJvbS4KKyAgICBteSAlb3B0cyA9IEBfOyAgICAgICAgICAgIyBPcHRpb25zLgorCisgICAgbXkgJG5hbWU7CisgICAgbXkgJGhhbmRsZTsKKyAgICBteSBAYnVsazsKKyAgICBteSAkZXJyb3IgPSBcJnJ1bnRpbWVfZXJyb3I7CisKKyAgICBteSBAYmlub3B0cyA9IHF3KCAtYmluYXJ5IC1lcnJvciAtYnVsayApOyAgICAgICAgICAgICAgICAgICAgICAgIyBPcHRpb25zIGF2YWlsYWJsZSBpbiBiaW5hcnkgbW9kZS4KKyAgICBteSBAdHh0b3B0cyA9IHF3KCAtYmluYXJ5IC1lcnJvciAta2VlcF90cmFpbGluZ19zcGFjZSAtY2hvbXAgLWxheWVyICk7ICMgT3B0aW9ucyBhdmFpbGFibGUgaW4gdGV4dCAobm9uLWJpbmFyeSkgbW9kZS4KKyAgICBjaGVja19vcHRzKCAlb3B0cywgWyBAYmlub3B0cywgQHR4dG9wdHMgXSApOworICAgIGlmICggJG9wdHN7IC1iaW5hcnkgfSApIHsKKyAgICAgICAgY2hlY2tfb3B0cyggJW9wdHMsIFsgQGJpbm9wdHMgXSwgInRoZXNlIG9wdGlvbnMgY2Fubm90IGJlIHVzZWQgd2l0aCAtYmluYXJ5IiApOworICAgIH0gZWxzZSB7CisgICAgICAgIGNoZWNrX29wdHMoICVvcHRzLCBbIEB0eHRvcHRzIF0sICJ0aGVzZSBvcHRpb25zIGNhbm5vdCBiZSB1c2VkIHdpdGhvdXQgLWJpbmFyeSIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBub3QgZXhpc3RzKCAkb3B0c3sgLWVycm9yIH0gKSApIHsKKyAgICAgICAgJG9wdHN7IC1lcnJvciB9ID0gImVycm9yIjsKKyAgICB9OyAjIGlmCisgICAgaWYgKCAkb3B0c3sgLWVycm9yIH0gZXEgIndhcm5pbmciICkgeworICAgICAgICAkZXJyb3IgPSBcJndhcm5pbmc7CisgICAgfSBlbHNpZiggJG9wdHN7IC1lcnJvciB9IGVxICJpZ25vcmUiICkgeworICAgICAgICAkZXJyb3IgPSBzdWIge307CisgICAgfSBlbHNpZiAoIHJlZiggJG9wdHN7IC1lcnJvciB9ICkgZXEgIkFSUkFZIiApIHsKKyAgICAgICAgJGVycm9yID0gc3ViIHsgcHVzaCggQHsgJG9wdHN7IC1lcnJvciB9IH0sICRfWyAwIF0gKTsgfTsKKyAgICB9OyAjIGlmCisKKyAgICBpZiAoICggcmVmKCAkZmlsZSApIGVxICJHTE9CIiApIG9yIFVOSVZFUlNBTDo6aXNhKCAkZmlsZSwgIklPOjpIYW5kbGUiICkgKSB7CisgICAgICAgICRuYW1lID0gInVua25vd24iOworICAgICAgICAkaGFuZGxlID0gJGZpbGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgJG5hbWUgPSAkZmlsZTsKKyAgICAgICAgaWYgKCBnZXRfZXh0KCAkZmlsZSApIGVxICIuZ3oiIGFuZCBub3QgJG9wdHN7IC1iaW5hcnkgfSApIHsKKyAgICAgICAgICAgICRoYW5kbGUgPSBJTzo6WmxpYi0+bmV3KCAkbmFtZSwgInJiIiApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGhhbmRsZSA9IElPOjpGaWxlLT5uZXcoICRuYW1lLCAiciIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoIG5vdCBkZWZpbmVkKCAkaGFuZGxlICkgKSB7CisgICAgICAgICAgICAkZXJyb3ItPiggIkZpbGUgXCIkbmFtZVwiIGNvdWxkIG5vdCBiZSBvcGVuZWQgZm9yIGlucHV0OiAkISIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKyAgICBpZiAoIGRlZmluZWQoICRoYW5kbGUgKSApIHsKKyAgICAgICAgaWYgKCAkb3B0c3sgLWJpbmFyeSB9ICkgeworICAgICAgICAgICAgYmlubW9kZSggJGhhbmRsZSApOworICAgICAgICAgICAgbG9jYWwgJC8gPSB1bmRlZjsgICAjIFNldCBpbnB1dCByZWNvcmQgc2VwYXJhdG9yIHRvIHVuZGVmIHRvIHJlYWQgZW50aXJlIGZpbGUgYXMgb25lIGxpbmUuCisgICAgICAgICAgICBpZiAoIGV4aXN0cyggJG9wdHN7IC1idWxrIH0gKSApIHsKKyAgICAgICAgICAgICAgICAkeyAkb3B0c3sgLWJ1bGsgfSB9ID0gJGhhbmRsZS0+Z2V0bGluZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkYnVsa1sgMCBdID0gJGhhbmRsZS0+Z2V0bGluZSgpOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCBkZWZpbmVkKCAkb3B0c3sgLWxheWVyIH0gKSApIHsKKyAgICAgICAgICAgICAgICBiaW5tb2RlKCAkaGFuZGxlLCAkb3B0c3sgLWxheWVyIH0gKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIEBidWxrID0gJGhhbmRsZS0+Z2V0bGluZXMoKTsKKyAgICAgICAgICAgICMgU3BlY2lhbCB0cmljayBmb3IgVVRGLTggZmlsZXM6IERlbGV0ZSBCT00sIGlmIGFueS4KKyAgICAgICAgICAgIGlmICggZGVmaW5lZCggJG9wdHN7IC1sYXllciB9ICkgYW5kICRvcHRzeyAtbGF5ZXIgfSBlcSAiOnV0ZjgiICkgeworICAgICAgICAgICAgICAgIGlmICggc3Vic3RyKCAkYnVsa1sgMCBdLCAwLCAxICkgZXEgIlx4e0ZFRkZ9IiApIHsKKyAgICAgICAgICAgICAgICAgICAgc3Vic3RyKCAkYnVsa1sgMCBdLCAwLCAxICkgPSAiIjsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgaWYKKyAgICAgICAgJGhhbmRsZS0+Y2xvc2UoKQorICAgICAgICAgICAgb3IgJGVycm9yLT4oICJGaWxlIFwiJG5hbWVcIiBjb3VsZCBub3QgYmUgY2xvc2VkIGFmdGVyIGlucHV0OiAkISIgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoICRvcHRzeyAtYmluYXJ5IH0gYW5kIGV4aXN0cyggJG9wdHN7IC1idWxrIH0gKSApIHsKKyAgICAgICAgICAgICR7ICRvcHRzeyAtYnVsayB9IH0gPSAiIjsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKyAgICBpZiAoICRvcHRzeyAtYmluYXJ5IH0gKSB7CisgICAgICAgIGlmICggZXhpc3RzKCAkb3B0c3sgLWJ1bGsgfSApICkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gJGJ1bGtbIDAgXTsKKyAgICAgICAgfTsgIyBpZgorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICggKCBAYnVsayA+IDAgKSBhbmQgKCBzdWJzdHIoICRidWxrWyAtMSBdLCAtMSwgMSApIG5lICJcbiIgKSApIHsKKyAgICAgICAgICAgICRidWxrWyAtMSBdIC49ICJcbiI7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCBub3QgJG9wdHN7IC1rZWVwX3RyYWlsaW5nX3NwYWNlIH0gKSB7CisgICAgICAgICAgICBtYXAoICRfID1+IHMvXHMrXG5cei9cbi8sIEBidWxrICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCAkb3B0c3sgLWNob21wIH0gKSB7CisgICAgICAgICAgICBjaG9tcCggQGJ1bGsgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoIHdhbnRhcnJheSgpICkgeworICAgICAgICAgICAgcmV0dXJuIEBidWxrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGpvaW4oICIiLCBAYnVsayApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorCit9OyAjIHN1YiByZWFkX2ZpbGUKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1oZWFkMyB3cml0ZV9maWxlCisKK0I8U3lub3BzaXM6PgorCisgICAgd3JpdGVfZmlsZSggJGZpbGUsICRidWxrLCBAb3B0aW9ucyApCisKK0I8RGVzY3JpcHRpb246PgorCitXcml0ZSBmaWxlLgorCitCPEFyZ3VtZW50czo+CisKKz1vdmVyCisKKz1pdGVtIEI8JGZpbGU+CisKK1RoZSBuYW1lIG9yIGhhbmRsZSBvZiBmaWxlIHRvIHdyaXR0ZSB0by4KKworPWl0ZW0gQjwkYnVsaz4KKworQnVsayB0byB3cml0ZSB0byBhIGZpbGUuIENhbiBiZSBhIHNjYWxhciwgb3IgYSByZWZlcmVuY2UgdG8gc2NhbGFyIG9yIGFuIGFycmF5LgorCis9YmFjaworCitCPE9wdGlvbnM6PgorCis9b3ZlcgorCis9aXRlbSBCPC1iYWNrdXA+CisKK0lmIHRydWUsIGNyZWF0ZSBhIGJhY2t1cCBjb3B5IG9mIGZpbGUgb3ZlcndyaXR0ZW4uIEJhY2t1cCBjb3B5IGlzIHBsYWNlZCBpbnRvIHRoZSBzYW1lIGRpcmVjdG9yeS4KK1RoZSBuYW1lIG9mIGJhY2t1cCBjb3B5IGlzIHRoZSBzYW1lIGFzIHRoZSBuYW1lIG9mIGZpbGUgd2l0aCBgficgYXBwZW5kZWQuIEJ5IGRlZmF1bHQgYmFja3VwIGNvcHkKK2lzIG5vdCBjcmVhdGVkLgorCis9aXRlbSBCPC1hcHBlbmQ+CisKK0lmIHRydWUsIHRoZSB0ZXh0IHdpbGwgYmUgYWRkZWQgdG8gZXhpc3RpbmcgZmlsZS4KKworPWJhY2sKKworQjxFeGFtcGxlczo+CisKKyAgICB3cml0ZV9maWxlKCAibWVzc2FnZS50eHQiLCBcJGJ1bGsgKTsKKyAgICAgICAgIyBXcml0ZSBmaWxlLCB0YWtlIGNvbnRlbnQgZnJvbSBhIHNjYWxhci4KKworICAgIHdyaXRlX2ZpbGUoICJtZXNzYWdlLnR4dCIsIFxAYnVsaywgLWJhY2t1cCA9PiAxICk7CisgICAgICAgICMgV3JpdGUgZmlsZSwgdGFrZSBjb250ZW50IGZyb20gYW4gYXJyYXksIGNyZWF0ZSBhIGJhY2t1cCBjb3B5LgorCis9Y3V0CisKK3N1YiB3cml0ZV9maWxlKCQkQCkgeworCisgICAgbXkgJGZpbGUgPSBzaGlmdCggQF8gKTsgICMgVGhlIG5hbWUgb3IgaGFuZGxlIG9mIGZpbGUgdG8gd3JpdGUgdG8uCisgICAgbXkgJGJ1bGsgPSBzaGlmdCggQF8gKTsgICMgVGhlIHRleHQgdG8gd3JpdGUuIENhbiBiZSByZWZlcmVuY2UgdG8gYXJyYXkgb3Igc2NhbGFyLgorICAgIG15ICVvcHRzID0gQF87ICAgICAgICAgICAjIE9wdGlvbnMuCisKKyAgICBteSAkbmFtZTsKKyAgICBteSAkaGFuZGxlOworCisgICAgY2hlY2tfb3B0cyggJW9wdHMsIFsgcXcoIC1hcHBlbmQgLWJhY2t1cCAtYmluYXJ5IC1sYXllciApIF0gKTsKKworICAgIG15ICRtb2RlID0gJG9wdHN7IC1hcHBlbmQgfSA/ICJhIjogInciOworICAgIGlmICggKCByZWYoICRmaWxlICkgZXEgIkdMT0IiICkgb3IgVU5JVkVSU0FMOjppc2EoICRmaWxlLCAiSU86OkhhbmRsZSIgKSApIHsKKyAgICAgICAgJG5hbWUgPSAidW5rbm93biI7CisgICAgICAgICRoYW5kbGUgPSAkZmlsZTsKKyAgICB9IGVsc2UgeworICAgICAgICAkbmFtZSA9ICRmaWxlOworICAgICAgICBpZiAoICRvcHRzeyAtYmFja3VwIH0gYW5kICggLWYgJG5hbWUgKSApIHsKKyAgICAgICAgICAgIGNvcHlfZmlsZSggJG5hbWUsICRuYW1lIC4gIn4iLCAtb3ZlcndyaXRlID0+IDEgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAkaGFuZGxlID0gSU86OkZpbGUtPm5ldyggJG5hbWUsICRtb2RlICkKKyAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICJGaWxlIFwiJG5hbWVcIiBjb3VsZCBub3QgYmUgb3BlbmVkIGZvciBvdXRwdXQ6ICQhIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoICRvcHRzeyAtYmluYXJ5IH0gKSB7CisgICAgICAgIGJpbm1vZGUoICRoYW5kbGUgKTsKKyAgICB9IGVsc2lmICggJG9wdHN7IC1sYXllciB9ICkgeworICAgICAgICBiaW5tb2RlKCAkaGFuZGxlLCAkb3B0c3sgLWxheWVyIH0gKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCByZWYoICRidWxrICkgZXEgIiIgKSB7CisgICAgICAgIGlmICggZGVmaW5lZCggJGJ1bGsgKSApIHsKKyAgICAgICAgICAgICRoYW5kbGUtPnByaW50KCAkYnVsayApOworICAgICAgICAgICAgaWYgKCBub3QgJG9wdHN7IC1iaW5hcnkgfSBhbmQgKCBzdWJzdHIoICRidWxrLCAtMSApIG5lICJcbiIgKSApIHsKKyAgICAgICAgICAgICAgICAkaGFuZGxlLT5wcmludCggIlxuIiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9OyAjIGlmCisgICAgfSBlbHNpZiAoIHJlZiggJGJ1bGsgKSBlcSAiU0NBTEFSIiApIHsKKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkJGJ1bGsgKSApIHsKKyAgICAgICAgICAgICRoYW5kbGUtPnByaW50KCAkJGJ1bGsgKTsKKyAgICAgICAgICAgIGlmICggbm90ICRvcHRzeyAtYmluYXJ5IH0gYW5kICggc3Vic3RyKCAkJGJ1bGssIC0xICkgbmUgIlxuIiApICkgeworICAgICAgICAgICAgICAgICRoYW5kbGUtPnByaW50KCAiXG4iICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgaWYKKyAgICB9IGVsc2lmICggcmVmKCAkYnVsayApIGVxICJBUlJBWSIgKSB7CisgICAgICAgIGZvcmVhY2ggbXkgJGxpbmUgKCBAJGJ1bGsgKSB7CisgICAgICAgICAgICBpZiAoIGRlZmluZWQoICRsaW5lICkgKSB7CisgICAgICAgICAgICAgICAgJGhhbmRsZS0+cHJpbnQoICRsaW5lICk7CisgICAgICAgICAgICAgICAgaWYgKCBub3QgJG9wdHN7IC1iaW5hcnkgfSBhbmQgKCBzdWJzdHIoICRsaW5lLCAtMSApIG5lICJcbiIgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgJGhhbmRsZS0+cHJpbnQoICJcbiIgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgZm9yZWFjaAorICAgIH0gZWxzZSB7CisgICAgICAgIENhcnA6OmNyb2FrKCAid3JpdGVfZmlsZTogXCRidWxrIG11c3QgYmUgYSBzY2FsYXIgb3IgcmVmZXJlbmNlIHRvIChzY2FsYXIgb3IgYXJyYXkpIiApOworICAgIH07ICMgaWYKKyAgICAkaGFuZGxlLT5jbG9zZSgpCisgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICJGaWxlIFwiJG5hbWVcIiBjb3VsZCBub3QgYmUgY2xvc2VkIGFmdGVyIG91dHB1dDogJCEiICk7CisKK307ICMgc3ViIHdyaXRlX2ZpbGUKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1jdXQKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEV4ZWN1dGlvbiBzdWJyb3V0aW5lcy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis9aGVhZDIgRXhlY3V0aW9uIHN1YnJvdXRpbmVzLgorCis9b3ZlcgorCis9Y3V0CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdWIgX3ByZSB7CisKKyAgICBteSAkYXJnID0gc2hpZnQoIEBfICk7CisKKyAgICAjIElmIHJlZGlyZWN0aW9uIGlzIG5vdCByZXF1aXJlZCwgZXhpdC4KKyAgICBpZiAoIG5vdCBleGlzdHMoICRhcmctPnsgcmVkaXIgfSApICkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9OyAjIGlmCisKKyAgICAjIElucHV0IHBhcmFtZXRlcnMuCisgICAgbXkgJG1vZGUgICA9ICRhcmctPnsgbW9kZSAgIH07ICMgTW9kZSwgIjwiIChpbnB1dCApIG9yICI+IiAob3V0cHV0KS4KKyAgICBteSAkaGFuZGxlID0gJGFyZy0+eyBoYW5kbGUgfTsgIyBIYW5kbGUgdG8gbWFuaXB1bGF0ZS4KKyAgICBteSAkcmVkaXIgID0gJGFyZy0+eyByZWRpciAgfTsgIyBEYXRhLCBhIGZpbGUgbmFtZSBpZiBhIHNjYWxhciwgb3IgZmlsZSBjb250ZW50cywgaWYgYSByZWZlcmVuY2UuCisKKyAgICAjIE91dHB1dCBwYXJhbWV0ZXJzLgorICAgIG15ICRzYXZlX2hhbmRsZTsKKyAgICBteSAkdGVtcF9oYW5kbGU7CisgICAgbXkgJHRlbXBfbmFtZTsKKworICAgICMgU2F2ZSBvcmlnaW5hbCBoYW5kbGUgKGJ5IGR1cGluZyBpdCkuCisgICAgJHNhdmVfaGFuZGxlID0gU3ltYm9sOjpnZW5zeW0oKTsKKyAgICAkaGFuZGxlLT5mbHVzaCgpOworICAgIG9wZW4oICRzYXZlX2hhbmRsZSwgJG1vZGUgLiAiJiIgLiAkaGFuZGxlLT5maWxlbm8oKSApCisgICAgICAgIG9yIGRpZSggIkNhbm5vdCBkdXAgZmlsZWhhbmRsZTogJCEiICk7CisKKyAgICAjIFByZXBhcmUgYSBmaWxlIHRvIElPLgorICAgIGlmICggVU5JVkVSU0FMOjppc2EoICRyZWRpciwgIklPOjpIYW5kbGUiICkgb3IgKCByZWYoICRyZWRpciApIGVxICJHTE9CIiApICkgeworICAgICAgICAjICRyZWRpciBpcyByZWZlcmVuY2UgdG8gYW4gb2JqZWN0IG9mIElPOjpIYW5kbGUgY2xhc3MgKG9yIGl0cyBkZWNlZGFudCkuCisgICAgICAgICR0ZW1wX2hhbmRsZSA9ICRyZWRpcjsKKyAgICB9IGVsc2lmICggcmVmKCAkcmVkaXIgKSApIHsKKyAgICAgICAgIyAkcmVkaXIgaXMgYSByZWZlcmVuY2UgdG8gY29udGVudCB0byBiZSByZWFkL3dyaXR0ZW4uCisgICAgICAgICMgUHJlcGFyZSB0ZW1wIGZpbGUuCisgICAgICAgICggJHRlbXBfaGFuZGxlLCAkdGVtcF9uYW1lICkgPQorICAgICAgICAgICAgRmlsZTo6VGVtcDo6dGVtcGZpbGUoCisgICAgICAgICAgICAgICAgIiR0b29sLlhYWFhYWFhYIiwKKyAgICAgICAgICAgICAgICBESVIgICAgPT4gRmlsZTo6U3BlYy0+dG1wZGlyKCksCisgICAgICAgICAgICAgICAgU1VGRklYID0+ICIudG1wIiwKKyAgICAgICAgICAgICAgICBVTkxJTksgPT4gMQorICAgICAgICAgICAgKTsKKyAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJHRlbXBfaGFuZGxlICkgKSB7CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiQ291bGQgbm90IGNyZWF0ZSB0ZW1wIGZpbGUuIiApOworICAgICAgICB9OyAjIGlmCisgICAgICAgIGlmICggJG1vZGUgZXEgIjwiICkgeworICAgICAgICAgICAgIyBJdCBpcyBhIGZpbGUgdG8gYmUgcmVhZCBieSBjaGlsZCwgcHJlcGFyZSBmaWxlIGNvbnRlbnQgdG8gYmUgcmVhZC4KKyAgICAgICAgICAgICR0ZW1wX2hhbmRsZS0+cHJpbnQoIHJlZiggJHJlZGlyICkgZXEgIlNDQUxBUiIgPyAkeyAkcmVkaXIgfSA6IEB7ICRyZWRpciB9ICk7CisgICAgICAgICAgICAkdGVtcF9oYW5kbGUtPmZsdXNoKCk7CisgICAgICAgICAgICBzZWVrKCAkdGVtcF9oYW5kbGUsIDAsIDAgKTsKKyAgICAgICAgICAgICAgICAjIFVuZm9ydHVuYXRlbGx5LCBJIGNvdWxkIG5vdCB1c2UgT08gaW50ZXJmYWNlIHRvIHNlZWsuCisgICAgICAgICAgICAgICAgIyBBY3RpdmVQZXJsIDUuNi4xIGNvbXBsYWlucyBvbiBib3RoIGZvcm1zOgorICAgICAgICAgICAgICAgICMgICAgJHRlbXBfaGFuZGxlLT5zZWVrKCAwICk7ICAgICMgQXMgZGVjbGFyZWQgaW4gSU86OlNlZWthYmxlLgorICAgICAgICAgICAgICAgICMgICAgJHRlbXBfaGFuZGxlLT5zZXRwb3MoIDAgKTsgICMgQXMgZGVzY3JpYmVkIGluIGRvY3VtZW50YXRpb24uCisgICAgICAgIH0gZWxzaWYgKCAkbW9kZSBlcSAiPiIgKSB7CisgICAgICAgICAgICAjIEl0IGlzIGEgZmlsZSBmb3Igb3V0cHV0LiBDbGVhciBvdXRwdXQgdmFyaWFibGUuCisgICAgICAgICAgICBpZiAoIHJlZiggJHJlZGlyICkgZXEgIlNDQUxBUiIgKSB7CisgICAgICAgICAgICAgICAgJHsgJHJlZGlyIH0gPSAiIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQHsgJHJlZGlyIH0gPSAoKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgIH0gZWxzZSB7CisgICAgICAgICMgJHJlZGlyIGlzIGEgbmFtZSBvZiBmaWxlIHRvIGJlIHJlYWQvd3JpdHRlbi4KKyAgICAgICAgIyBKdXN0IG9wZW4gZmlsZS4KKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkcmVkaXIgKSApIHsKKyAgICAgICAgICAgICR0ZW1wX25hbWUgPSAkcmVkaXI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdGVtcF9uYW1lID0gRmlsZTo6U3BlYy0+ZGV2bnVsbCgpOworICAgICAgICB9OyAjIGlmCisgICAgICAgICR0ZW1wX2hhbmRsZSA9IElPOjpGaWxlLT5uZXcoICR0ZW1wX25hbWUsICRtb2RlICkKKyAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICJmaWxlIFwiJHRlbXBfbmFtZVwiIGNvdWxkIG5vdCBiZSBvcGVuZWQgZm9yICIgLiAoICRtb2RlIGVxICI8IiA/ICJpbnB1dCIgOiAib3V0cHV0IiApIC4gIjogJCEiICk7CisgICAgfTsgIyBpZgorCisgICAgIyBSZWRpcmVjdCBoYW5kbGUgdG8gdGVtcCBmaWxlLgorICAgIG9wZW4oICRoYW5kbGUsICRtb2RlIC4gIiYiIC4gJHRlbXBfaGFuZGxlLT5maWxlbm8oKSApCisgICAgICAgIG9yIGRpZSggIkNhbm5vdCBkdXAgZmlsZWhhbmRsZTogJCEiICk7CisKKyAgICAjIFNhdmUgb3V0cHV0IHBhcmFtZXRlcnMuCisgICAgJGFyZy0+eyBzYXZlX2hhbmRsZSB9ID0gJHNhdmVfaGFuZGxlOworICAgICRhcmctPnsgdGVtcF9oYW5kbGUgfSA9ICR0ZW1wX2hhbmRsZTsKKyAgICAkYXJnLT57IHRlbXBfbmFtZSAgIH0gPSAkdGVtcF9uYW1lOworCit9OyAjIHN1YiBfcHJlCisKKworc3ViIF9wb3N0IHsKKworICAgIG15ICRhcmcgPSBzaGlmdCggQF8gKTsKKworICAgICMgSW5wdXQgcGFyYW1ldGVycy4KKyAgICBteSAkbW9kZSAgID0gJGFyZy0+eyBtb2RlICAgfTsgIyBNb2RlLCAiPCIgb3IgIj4iLgorICAgIG15ICRoYW5kbGUgPSAkYXJnLT57IGhhbmRsZSB9OyAjIEhhbmRsZSB0byBzYXZlIGFuZCBzZXQuCisgICAgbXkgJHJlZGlyICA9ICRhcmctPnsgcmVkaXIgIH07ICMgRGF0YSwgYSBmaWxlIG5hbWUgaWYgYSBzY2FsYXIsIG9yIGZpbGUgY29udGVudHMsIGlmIGEgcmVmZXJlbmNlLgorCisgICAgIyBQYXJhbWV0ZXJzIHNhdmVkIGR1cmluZyBwcmVwcm9jZXNzaW5nLgorICAgIG15ICRzYXZlX2hhbmRsZSA9ICRhcmctPnsgc2F2ZV9oYW5kbGUgfTsKKyAgICBteSAkdGVtcF9oYW5kbGUgPSAkYXJnLT57IHRlbXBfaGFuZGxlIH07CisgICAgbXkgJHRlbXBfbmFtZSAgID0gJGFyZy0+eyB0ZW1wX25hbWUgICB9OworCisgICAgIyBJZiBubyBoYW5kbGUgd2FzIHNhdmVkLCBleGl0LgorICAgIGlmICggbm90ICRzYXZlX2hhbmRsZSApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfTsgIyBpZgorCisgICAgIyBDbG9zZSBoYW5kbGUuCisgICAgJGhhbmRsZS0+Y2xvc2UoKQorICAgICAgICBvciBkaWUoICIkISIgKTsKKworICAgICMgUmVhZCB0aGUgY29udGVudCBvZiB0ZW1wIGZpbGUsIGlmIG5lY2Vzc2FyeSwgYW5kIGNsb3NlIHRlbXAgZmlsZS4KKyAgICBpZiAoICggJG1vZGUgbmUgIjwiICkgYW5kIHJlZiggJHJlZGlyICkgKSB7CisgICAgICAgICR0ZW1wX2hhbmRsZS0+Zmx1c2goKTsKKyAgICAgICAgc2VlayggJHRlbXBfaGFuZGxlLCAwLCAwICk7CisgICAgICAgIGlmICggJF5PID1+IG0vTVNXaW4vICkgeworICAgICAgICAgICAgYmlubW9kZSggJHRlbXBfaGFuZGxlLCAiOmNybGYiICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCByZWYoICRyZWRpciApIGVxICJTQ0FMQVIiICkgeworICAgICAgICAgICAgJHsgJHJlZGlyIH0gLj0gam9pbiggIiIsICR0ZW1wX2hhbmRsZS0+Z2V0bGluZXMoKSApOworICAgICAgICB9IGVsc2lmICggcmVmKCAkcmVkaXIgKSBlcSAiQVJSQVkiICkgeworICAgICAgICAgICAgcHVzaCggQHsgJHJlZGlyIH0sICR0ZW1wX2hhbmRsZS0+Z2V0bGluZXMoKSApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorICAgIGlmICggbm90IFVOSVZFUlNBTDo6aXNhKCAkcmVkaXIsICJJTzo6SGFuZGxlIiApICkgeworICAgICAgICAkdGVtcF9oYW5kbGUtPmNsb3NlKCkKKyAgICAgICAgICAgIG9yIGRpZSggIiQhIiApOworICAgIH07ICMgaWYKKworICAgICMgUmVzdG9yZSBoYW5kbGUgdG8gb3JpZ2luYWwgdmFsdWUuCisgICAgJHNhdmVfaGFuZGxlLT5mbHVzaCgpOworICAgIG9wZW4oICRoYW5kbGUsICRtb2RlIC4gIiYiIC4gJHNhdmVfaGFuZGxlLT5maWxlbm8oKSApCisgICAgICAgIG9yIGRpZSggIkNhbm5vdCBkdXAgZmlsZWhhbmRsZTogJCEiICk7CisKKyAgICAjIENsb3NlIHNhdmUgaGFuZGxlLgorICAgICRzYXZlX2hhbmRsZS0+Y2xvc2UoKQorICAgICAgICBvciBkaWUoICIkISIgKTsKKworICAgICMgRGVsZXRlIHBhcmFtZXRlcnMgc2F2ZWQgZHVyaW5nIHByZXByb2Nlc3NpbmcuCisgICAgZGVsZXRlKCAkYXJnLT57IHNhdmVfaGFuZGxlIH0gKTsKKyAgICBkZWxldGUoICRhcmctPnsgdGVtcF9oYW5kbGUgfSApOworICAgIGRlbGV0ZSggJGFyZy0+eyB0ZW1wX25hbWUgICB9ICk7CisKK307ICMgc3ViIF9wb3N0CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBDPGV4ZWN1dGUoIFsgQGNvbW1hbmQgXSwgQG9wdGlvbnMgKT4KKworRXhlY3V0ZSBzcGVjaWZpZWQgcHJvZ3JhbSBvciBzaGVsbCBjb21tYW5kLgorCitQcm9ncmFtIGlzIHNwZWNpZmllZCBieSByZWZlcmVuY2UgdG8gYW4gYXJyYXksIHRoYXQgYXJyYXkgaXMgcGFzc2VkIHRvIEM8c3lzdGVtKCk+IGZ1bmN0aW9uIHdoaWNoCitleGVjdXRlcyB0aGUgY29tbWFuZC4gU2VlIEw8cGVybGZ1bmM+IGZvciBkZXRhaWxzIGhvdyBDPHN5c3RlbSgpPiBpbnRlcnByZXRzIHZhcmlvdXMgZm9ybXMgb2YKK0M8QGNvbW1hbmQ+LgorCitCeSBkZWZhdWx0LCBpbiBjYXNlIG9mIGFueSBlcnJvciBlcnJvciBtZXNzYWdlIGlzIGlzc3VlZCBhbmQgc2NyaXB0IHRlcm1pbmF0ZWQgKGJ5IHJ1bnRpbWVfZXJyb3IoKSkuCitGdW5jdGlvbiByZXR1cm5zIGFuIGV4aXQgY29kZSBvZiBwcm9ncmFtLgorCitBbHRlcm5hdGl2ZWx5LCBoZSBmdW5jdGlvbiBtYXkgcmV0dXJuIGV4aXQgc3RhdHVzIG9mIHRoZSBwcm9ncmFtIChzZWUgQzwtaWdub3JlX3N0YXR1cz4pIG9yIHNpZ25hbAorKHNlZSBDPC1pZ25vcmVfc2lnbmFsPikgc28gY2FsbGVyIG1heSBhbmFseXplIGl0IGFuZCBjb250aW51ZSBleGVjdXRpb24uCisKK09wdGlvbnM6CisKKz1vdmVyCisKKz1pdGVtIEM8LXN0ZGluPgorCitSZWRpcmVjdCBzdGRpbiBvZiBwcm9ncmFtLiBUaGUgdmFsdWUgb2Ygb3B0aW9uIGNhbiBiZToKKworPW92ZXIKKworPWl0ZW0gQzx1bmRlZj4KKworU3RkaW4gb2YgY2hpbGQgaXMgYXR0YWNoZWQgdG8gbnVsbCBkZXZpY2UuCisKKz1pdGVtIGEgc3RyaW5nCisKK1N0ZGluIG9mIGNoaWxkIGlzIGF0dGFjaGVkIHRvIGEgZmlsZSB3aXRoIG5hbWUgc3BlY2lmaWVkIGJ5IG9wdGlvbi4KKworPWl0ZW0gYSByZWZlcmVuY2UgdG8gYSBzY2FsYXIKKworQSBkZXJlZmVyZW5jZWQgc2NhbGFyIGlzIHdyaXR0ZW4gdG8gYSB0ZW1wIGZpbGUsIGFuZCBjaGlsZCdzIHN0ZGluIGlzIGF0dGFjaGVkIHRvIHRoYXQgZmlsZS4KKworPWl0ZW0gYSByZWZlcmVuY2UgdG8gYW4gYXJyYXkKKworQSBkZXJlZmVyZW5jZWQgYXJyYXkgaXMgd3JpdHRlbiB0byBhIHRlbXAgZmlsZSwgYW5kIGNoaWxkJ3Mgc3RkaW4gaXMgYXR0YWNoZWQgdG8gdGhhdCBmaWxlLgorCis9YmFjaworCis9aXRlbSBDPC1zdGRvdXQ+CisKK1JlZGlyZWN0IHN0ZG91dC4gUG9zc2libGUgdmFsdWVzIGFyZSB0aGUgc2FtZSBhcyBmb3IgQzwtc3RkaW4+IG9wdGlvbi4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpcworcmVmZXJlbmNlIHNwZWNpZmllcyBhIHZhcmlhYmxlIHJlY2VpdmluZyBwcm9ncmFtJ3Mgb3V0cHV0LgorCis9aXRlbSBDPC1zdGRlcnI+CisKK0l0IHNpbWlsYXIgdG8gQzwtc3Rkb3V0PiwgYnV0IHJlZGlyZWN0cyBzdGRlcnIuIFRoZXJlIGlzIG9ubHkgb25lIGFkZGl0aW9uYWwgdmFsdWU6CisKKz1vdmVyCisKKz1pdGVtIGFuIGVtcHR5IHN0cmluZworCittZWFucyB0aGF0IHN0ZGVyciBzaG91bGQgYmUgcmVkaXJlY3RlZCB0byB0aGUgc2FtZSBwbGFjZSB3aGVyZSBzdGRvdXQgaXMgcmVkaXJlY3RlZCB0by4KKworPWJhY2sKKworPWl0ZW0gQzwtYXBwZW5kPgorCitSZWRpcmVjdGVkIHN0cmVhbSB3aWxsIG5vdCBvdmVyd3JpdGUgcHJldmlvdXMgY29udGVudCBvZiBmaWxlIChvciB2YXJpYWJsZSkuCitOb3RlLCB0aGF0IG9wdGlvbiBhZmZlY3RzIGJvdGggc3Rkb3V0IGFuZCBzdGRlcnIuCisKKz1pdGVtIEM8LWlnbm9yZV9zdGF0dXM+CisKK0J5IGRlZmF1bHQsIHN1YnJvdXRpbmUgcmFpc2VzIGFuIGVycm9yIGFuZCBleGl0cyB0aGUgc2NyaXB0IGlmIHByb2dyYW0gcmV0dXJucyBub24tZXhpdCBzdGF0dXMuIElmCit0aGlzIG9wdGlvbnMgaXMgdHJ1ZSwgbm8gZXJyb3IgaXMgcmFpc2VkLiBJbnN0ZWFkLCBzdGF0dXMgaXMgcmV0dXJuZWQgYXMgZnVuY3Rpb24gcmVzdWx0IChhbmQgJEAgaXMKK3NldCB0byBlcnJvciBtZXNzYWdlKS4KKworPWl0ZW0gQzwtaWdub3JlX3NpZ25hbD4KKworQnkgZGVmYXVsdCwgc3Vicm91dGluZSByYWlzZXMgYW4gZXJyb3IgYW5kIGV4aXRzIHRoZSBzY3JpcHQgaWYgcHJvZ3JhbSBkaWUgd2l0aCBzaWduYWwuIElmCit0aGlzIG9wdGlvbnMgaXMgdHJ1ZSwgbm8gZXJyb3IgaXMgcmFpc2VkIGluIHN1Y2ggYSBjYXNlLiBJbnN0ZWFkLCBzaWduYWwgbnVtYmVyIGlzIHJldHVybmVkIChhcworbmVnYXRpdmUgdmFsdWUpLCBlcnJvciBtZXNzYWdlIGlzIHBsYWNlZCB0byBDPCRAPiB2YXJpYWJsZS4KKworSWYgY29tbWFuZCBpcyBub3QgZXZlbiBzdGFydGVkLCAtMjU2IGlzIHJldHVybmVkLgorCis9YmFjaworCitFeGFtcGxlczoKKworICAgIGV4ZWN1dGUoIFsgImNtZC5leGUiLCAiL2MiLCAiZGlyIiBdICk7CisgICAgICAgICMgRXhlY3V0ZSBOVCBzaGVsbCB3aXRoIHNwZWNpZmllZCBvcHRpb25zLCBubyByZWRpcmVjdGlvbnMgYXJlCisgICAgICAgICMgbWFkZS4KKworICAgIG15ICRvdXRwdXQ7CisgICAgZXhlY3V0ZSggWyAiY3ZzIiwgIi1uIiwgIi1xIiwgInVwZGF0ZSIsICIuIiBdLCAtc3Rkb3V0ID0+IFwkb3V0cHV0ICk7CisgICAgICAgICMgRXhlY3V0ZSAiY3ZzIC1uIC1xIHVwZGF0ZSAuIiBjb21tYW5kLCBvdXRwdXQgaXMgc2F2ZWQKKyAgICAgICAgIyBpbiAkb3V0cHV0IHZhcmlhYmxlLgorCisgICAgbXkgQG91dHB1dDsKKyAgICBleGVjdXRlKCBbIHF3KCBjdnMgLW4gLXEgdXBkYXRlIC4gKSBdLCAtc3Rkb3V0ID0+IFxAb3V0cHV0LCAtc3RkZXJyID0+IHVuZGVmICk7CisgICAgICAgICMgRXhlY3V0ZSBzcGVjaWZpZWQgY29tbWFuZCwgIG91dHB1dCBpcyBzYXZlZCBpbiBAb3V0cHV0CisgICAgICAgICMgdmFyaWFibGUsIHN0ZGVyciBzdHJlYW0gaXMgcmVkaXJlY3RlZCB0byBudWxsIGRldmljZQorICAgICAgICAjICgvZGV2L251bGwgaW4gTGludXgqIE9TIGFuIG51bCBpbiBXaW5kb3dzKiBPUykuCisKKz1jdXQKKworc3ViIGV4ZWN1dGUoJEApIHsKKworICAgICMgISEhIEFkZCBzb21ldGhpbmcgdG8gY29tcGxhaW4gb24gdW5rbm93biBvcHRpb25zLi4uCisKKyAgICBteSAkY29tbWFuZCA9IHNoaWZ0KCBAXyApOworICAgIG15ICVvcHRzICAgID0gQF87CisgICAgbXkgJHByZWZpeCAgPSAiQ291bGQgbm90IGV4ZWN1dGUgJGNvbW1hbmQtPlsgMCBdIjsKKworICAgIGNoZWNrX29wdHMoICVvcHRzLCBbIHF3KCAtc3RkaW4gLXN0ZG91dCAtc3RkZXJyIC1hcHBlbmQgLWlnbm9yZV9zdGF0dXMgLWlnbm9yZV9zaWduYWwgKSBdICk7CisKKyAgICBpZiAoIHJlZiggJGNvbW1hbmQgKSBuZSAiQVJSQVkiICkgeworICAgICAgICBDYXJwOjpjcm9hayggImV4ZWN1dGU6ICRjb21tYW5kIG11c3QgYmUgYSByZWZlcmVuY2UgdG8gYXJyYXkiICk7CisgICAgfTsgIyBpZgorCisgICAgbXkgJHN0ZGluICA9IHsgaGFuZGxlID0+IFwqU1RESU4sICBtb2RlID0+ICI8IiB9OworICAgIG15ICRzdGRvdXQgPSB7IGhhbmRsZSA9PiBcKlNURE9VVCwgbW9kZSA9PiAiPiIgfTsKKyAgICBteSAkc3RkZXJyID0geyBoYW5kbGUgPT4gXCpTVERFUlIsIG1vZGUgPT4gIj4iIH07CisgICAgbXkgJHN0cmVhbXMgPSB7CisgICAgICAgIHN0ZGluICA9PiAkc3RkaW4sCisgICAgICAgIHN0ZG91dCA9PiAkc3Rkb3V0LAorICAgICAgICBzdGRlcnIgPT4gJHN0ZGVycgorICAgIH07ICMgJHN0cmVhbXMKKworICAgIGZvciBteSAkc3RyZWFtICggcXcoIHN0ZGluIHN0ZG91dCBzdGRlcnIgKSApIHsKKyAgICAgICAgaWYgKCBleGlzdHMoICRvcHRzeyAiLSRzdHJlYW0iIH0gKSApIHsKKyAgICAgICAgICAgIGlmICggcmVmKCAkb3B0c3sgIi0kc3RyZWFtIiB9ICkgIX4gbS9cQSh8U0NBTEFSfEFSUkFZKVx6LyApIHsKKyAgICAgICAgICAgICAgICBDYXJwOjpjcm9hayggImV4ZWN1dGU6IC0kc3RyZWFtIG9wdGlvbjogbXVzdCBoYXZlIHZhbHVlIG9mIHNjYWxhciwgb3IgcmVmZXJlbmNlIHRvIChzY2FsYXIgb3IgYXJyYXkpLiIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICRzdHJlYW1zLT57ICRzdHJlYW0gfS0+eyByZWRpciB9ID0gJG9wdHN7ICItJHN0cmVhbSIgfTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoICRvcHRzeyAtYXBwZW5kIH0gYW5kICggJHN0cmVhbXMtPnsgJHN0cmVhbSB9LT57IG1vZGUgfSApIGVxICI+IiApIHsKKyAgICAgICAgICAgICRzdHJlYW1zLT57ICRzdHJlYW0gfS0+eyBtb2RlIH0gPSAiPj4iOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoICRzdHJlYW0KKworICAgIF9wcmUoICRzdGRpbiAgKTsKKyAgICBfcHJlKCAkc3Rkb3V0ICk7CisgICAgaWYgKCBkZWZpbmVkKCAkc3RkZXJyLT57IHJlZGlyIH0gKSBhbmQgbm90IHJlZiggJHN0ZGVyci0+eyByZWRpciB9ICkgYW5kICggJHN0ZGVyci0+eyByZWRpciB9IGVxICIiICkgKSB7CisgICAgICAgIGlmICggZXhpc3RzKCAkc3Rkb3V0LT57IHJlZGlyIH0gKSApIHsKKyAgICAgICAgICAgICRzdGRlcnItPnsgcmVkaXIgfSA9ICRzdGRvdXQtPnsgdGVtcF9oYW5kbGUgfTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRzdGRlcnItPnsgcmVkaXIgfSA9ICR7ICRzdGRvdXQtPnsgaGFuZGxlIH0gfTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKyAgICBfcHJlKCAkc3RkZXJyICk7CisgICAgbXkgJHJjID0gc3lzdGVtKCBAJGNvbW1hbmQgKTsKKyAgICBteSAkZXJybm8gPSAkITsKKyAgICBteSAkY2hpbGQgPSAkPzsKKyAgICBfcG9zdCggJHN0ZGVyciApOworICAgIF9wb3N0KCAkc3Rkb3V0ICk7CisgICAgX3Bvc3QoICRzdGRpbiAgKTsKKworICAgIG15ICRleGl0ID0gMDsKKyAgICBteSAkc2lnbmFsX251bSAgPSAkY2hpbGQgJiAxMjc7CisgICAgbXkgJGV4aXRfc3RhdHVzID0gJGNoaWxkID4+IDg7CisgICAgJEAgPSAiIjsKKworICAgIGlmICggJHJjID09IC0xICkgeworICAgICAgICAkQCA9ICJcIiRjb21tYW5kLT5bIDAgXVwiIGZhaWxlZDogJGVycm5vIjsKKyAgICAgICAgJGV4aXQgPSAtMjU2OworICAgICAgICBpZiAoIG5vdCAkb3B0c3sgLWlnbm9yZV9zaWduYWwgfSApIHsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICRAICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9IGVsc2lmICggJHNpZ25hbF9udW0gIT0gMCApIHsKKyAgICAgICAgJEAgPSAiXCIkY29tbWFuZC0+WyAwIF1cIiBmYWlsZWQgZHVlIHRvIHNpZ25hbCAkc2lnbmFsX251bS4iOworICAgICAgICAkZXhpdCA9IC0gJHNpZ25hbF9udW07CisgICAgICAgIGlmICggbm90ICRvcHRzeyAtaWdub3JlX3NpZ25hbCB9ICkgeworICAgICAgICAgICAgcnVudGltZV9lcnJvciggJEAgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH0gZWxzaWYgKCAkZXhpdF9zdGF0dXMgIT0gMCApIHsKKyAgICAgICAgJEAgPSAiXCIkY29tbWFuZC0+WyAwIF1cIiByZXR1cm5lZCBub24temVybyBzdGF0dXMgJGV4aXRfc3RhdHVzLiI7CisgICAgICAgICRleGl0ID0gJGV4aXRfc3RhdHVzOworICAgICAgICBpZiAoIG5vdCAkb3B0c3sgLWlnbm9yZV9zdGF0dXMgfSApIHsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICRAICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisKKyAgICByZXR1cm4gJGV4aXQ7CisKK307ICMgc3ViIGV4ZWN1dGUKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8YmFja3RpY2tzKCBbIEBjb21tYW5kIF0sIEBvcHRpb25zICk+CisKK1J1biBzcGVjaWZpZWQgcHJvZ3JhbSBvciBzaGVsbCBjb21tYW5kIGFuZCByZXR1cm4gb3V0cHV0LgorCitJbiBzY2FsYXIgY29udGV4dCBlbnRpcmUgb3V0cHV0IGlzIHJldHVybmVkIGluIGEgc2luZ2xlIHN0cmluZy4gSW4gbGlzdCBjb250ZXh0IGxpc3Qgb2Ygc3RyaW5ncworaXMgcmV0dXJuZWQuIEZ1bmN0aW9uIGlzc3VlcyBhbiBlcnJvciBhbmQgZXhpdHMgc2NyaXB0IGlmIGFueSBlcnJvciBvY2N1cnMuCisKKz1jdXQKKworCitzdWIgYmFja3RpY2tzKCRAKSB7CisKKyAgICBteSAkY29tbWFuZCA9IHNoaWZ0KCBAXyApOworICAgIG15ICVvcHRzICAgID0gQF87CisgICAgbXkgQG91dHB1dDsKKworICAgIGNoZWNrX29wdHMoICVvcHRzLCBbIHF3KCAtY2hvbXAgKSBdICk7CisKKyAgICBleGVjdXRlKCAkY29tbWFuZCwgLXN0ZG91dCA9PiBcQG91dHB1dCApOworCisgICAgaWYgKCAkb3B0c3sgLWNob21wIH0gKSB7CisgICAgICAgIGNob21wKCBAb3V0cHV0ICk7CisgICAgfTsgIyBpZgorCisgICAgcmV0dXJuICggd2FudGFycmF5KCkgPyBAb3V0cHV0IDogam9pbiggIiIsIEBvdXRwdXQgKSApOworCit9OyAjIHN1YiBiYWNrdGlja3MKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N1YiBwYWQoJCQkKSB7CisgICAgbXkgKCAkc3RyLCAkbGVuZ3RoLCAkcGFkICkgPSBAXzsKKyAgICBteSAkbHN0ciA9IGxlbmd0aCggJHN0ciApOyAgICAjIExlbmd0aCBvZiBzb3VyY2Ugc3RyaW5nLgorICAgIGlmICggJGxzdHIgPCAkbGVuZ3RoICkgeworICAgICAgICBteSAkbHBhZCAgPSBsZW5ndGgoICRwYWQgKTsgICAgICAgICAgICAgICAgICAgICAgICAgIyBMZW5ndGggb2YgcGFkLgorICAgICAgICBteSAkY291bnQgPSBpbnQoICggJGxlbmd0aCAtICRsc3RyICkgLyAkbHBhZCApOyAgICAgIyBOdW1iZXIgb2YgcGFkIHJlcGV0aXRpb25zLgorICAgICAgICBteSAkdGFpbCAgPSAkbGVuZ3RoIC0gKCAkbHN0ciArICRscGFkICogJGNvdW50ICk7CisgICAgICAgICRzdHIgPSAkc3RyIC4gKCAkcGFkIHggJGNvdW50ICkgLiBzdWJzdHIoICRwYWQsIDAsICR0YWlsICk7CisgICAgfTsgIyBpZgorICAgIHJldHVybiAkc3RyOworfTsgIyBzdWIgcGFkCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWJhY2sKKworPWN1dAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcmV0dXJuIDE7CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9Y3V0CisKKyMgRW5kIG9mIGZpbGUuCmRpZmYgLS1naXQgYS9maW5hbC9ydW50aW1lL3Rvb2xzL21lc3NhZ2UtY29udmVydGVyLnBsIGIvZmluYWwvcnVudGltZS90b29scy9tZXNzYWdlLWNvbnZlcnRlci5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMjJjOTI4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvcnVudGltZS90b29scy9tZXNzYWdlLWNvbnZlcnRlci5wbApAQCAtMCwwICsxLDc3NSBAQAorIyEvdXNyL2Jpbi9wZXJsCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIEZpbGU6Okdsb2IgIjpnbG9iIjsKK3VzZSBFbmNvZGUgcXd7IGVuY29kZSB9OworCit1c2UgRmluZEJpbjsKK3VzZSBsaWIgIiRGaW5kQmluOjpCaW4vbGliIjsKKwordXNlIHRvb2xzOworCitvdXIgJFZFUlNJT04gPSAiMC4wNCI7CitteSAkZXNjYXBlICAgICAgPSBxcnslfTsKK215ICRwbGFjZWhvbGRlciA9IHFyeyhcZClcJChzfGw/W2R1XSl9OworbXkgJHRhcmdldF9vczsKKworbXkgJHNlY3Rpb25zID0KKyAgICB7CisgICAgICAgIG1ldGEgICAgID0+IHsgc2hvcnQgPT4gInBycCIgfSwgIyAicHJwIiBzdGFuZHMgZm9yICJwcm9wZXJ0eSIuCisgICAgICAgIHN0cmluZ3MgID0+IHsgc2hvcnQgPT4gInN0ciIgfSwKKyAgICAgICAgZm9ybWF0cyAgPT4geyBzaG9ydCA9PiAiZm10IiB9LAorICAgICAgICBtZXNzYWdlcyA9PiB7IHNob3J0ID0+ICJtc2ciIH0sCisgICAgICAgIGhpbnRzICAgID0+IHsgc2hvcnQgPT4gImhudCIgfSwKKyAgICB9OworbXkgQHNlY3Rpb25zID0gcXd7IG1ldGEgc3RyaW5ncyBmb3JtYXRzIG1lc3NhZ2VzIGhpbnRzIH07CisjIEFzc2lnbiBzZWN0aW9uIHByb3BlcnRpZXM6IGxvbmcgbmFtZSwgc2V0IG51bWJlciwgYmFzZSBudW1iZXIuCittYXAoICRzZWN0aW9ucy0+eyAkc2VjdGlvbnNbICRfIF0gfS0+eyBsb25nIH0gPSAkc2VjdGlvbnNbICRfIF0sICAgICAgKCAwIC4uIEBzZWN0aW9ucyAtIDEgKSApOworbWFwKCAkc2VjdGlvbnMtPnsgJHNlY3Rpb25zWyAkXyBdIH0tPnsgc2V0ICB9ID0gKCAkXyArIDEgKSwgICAgICAgICAgICggMCAuLiBAc2VjdGlvbnMgLSAxICkgKTsKK21hcCggJHNlY3Rpb25zLT57ICRzZWN0aW9uc1sgJF8gXSB9LT57IGJhc2UgfSA9ICggKCAkXyArIDEgKSA8PCAxNiApLCAoIDAgLi4gQHNlY3Rpb25zIC0gMSApICk7CisKKyMgUHJvcGVydGllcyBvZiBNZXRhIHNlY3Rpb24uCitteSBAcHJvcGVydGllcyA9IHF3eyBMYW5ndWFnZSBDb3VudHJ5IExhbmdJZCBWZXJzaW9uIFJldmlzaW9uIH07CisKKworc3ViIF9nZW5lcmF0ZV9jb21tZW50KCQkJCkgeworCisgICAgbXkgKCAkZGF0YSwgJG9wZW4sICRjbG9zZSApID0gQF87CisgICAgbXkgJGJ1bGsgPQorICAgICAgICAkb3BlbiAuICIgRG8gbm90IGVkaXQgdGhpcyBmaWxlISAiIC4gJGNsb3NlIC4gIlxuIiAuCisgICAgICAgICRvcGVuIC4gIiBUaGUgZmlsZSB3YXMgZ2VuZXJhdGVkIGZyb20gIiAuIGdldF9maWxlKCAkZGF0YS0+eyAiJW1ldGEiIH0tPnsgc291cmNlIH0gKSAuCisgICAgICAgICAgICAiIGJ5ICIgLiAkdG9vbCAuICIgb24gIiAuIGxvY2FsdGltZSgpIC4gIi4gIiAuICRjbG9zZSAuICJcbiI7CisgICAgcmV0dXJuICRidWxrOworCit9OyAjIHN1YiBfZ2VuZXJhdGVfY29tbWVudAorCisKK3N1YiBtc2cyc2duKCQpIHsKKworICAgICMgQ29udmVydCBtZXNzYWdlIHN0cmluZyB0byBzaWduYXR1cmUuIFNpZ25hdHVyZSBpcyBhIGxpc3Qgb2YgcGxhY2Vob2xkZXJzIGluIHNvcnRlZCBvcmRlci4KKyAgICAjIEZvciBleGFtcGxlLCBzaWduYXR1cmUgb2YgIiUxJHMgdmFsdWUgXCIlMiRzXCIgaXMgaW52YWxpZC4iIGlzICIlMSRzICUyJHMiLgorCisgICAgbXkgKCAkbXNnICkgPSBAXzsKKyAgICBteSBAcGxhY2Vob2xkZXJzOworICAgIHBvcyggJG1zZyApID0gMDsKKyAgICB3aGlsZSAoICRtc2cgPX4gbXtcRy4qPyRlc2NhcGUkcGxhY2Vob2xkZXJ9ZyApIHsKKyAgICAgICAgJHBsYWNlaG9sZGVyc1sgJDEgLSAxIF0gPSAiJSQxXCQkMiI7CisgICAgfTsgIyB3aGlsZQorICAgIGZvciAoIG15ICRpID0gMTsgJGkgPD0gQHBsYWNlaG9sZGVyczsgKysgJGkgKSB7CisgICAgICAgIGlmICggbm90IGRlZmluZWQoICRwbGFjZWhvbGRlcnNbICRpIC0gMSBdICkgKSB7CisgICAgICAgICAgICAkcGxhY2Vob2xkZXJzWyAkaSAtIDEgXSA9ICIlJGlcJC0iOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3IgJGkKKyAgICByZXR1cm4gam9pbiggIiAiLCBAcGxhY2Vob2xkZXJzICk7CisKK307ICMgc3ViIG1zZzJzZ24KKworCitzdWIgbXNnMnNyYygkKSB7CisKKyAgICAjIENvbnZlcnQgbWVzc2FnZSBzdHJpbmcgdG8gYSBDIHN0cmluZyBjb25zdGFudC4KKworICAgIG15ICggJG1zZyApID0gQF87CisgICAgaWYgKCAkdGFyZ2V0X29zIGVxICJ3aW4iICkgeworICAgICAgICAkbXNnID1+IHN7JGVzY2FwZSRwbGFjZWhvbGRlcn17XCUkMSEkMiF9ZzsKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuICRtc2c7CisKK307ICMgc3ViIG1zZzJzcmMKKworCitteSAkc3BlY2lhbCA9CisgICAgeworICAgICAgICAibiIgPT4gIlxuIiwKKyAgICAgICAgInQiID0+ICJcdCIsCisgICAgfTsKKworc3ViIG1zZzJtYygkKSB7CisgICAgbXkgKCAkbXNnICkgPSBAXzsKKyAgICAkbXNnID0gbXNnMnNyYyggJG1zZyApOyAjIEdldCB3aW5kb3dzIHN0eWxlIHBsYWNlaG9sZGVycy4KKyAgICAkbXNnID1+IHN7XFwoLil9eyBleGlzdHMoICRzcGVjaWFsLT57ICQxIH0gKSA/ICRzcGVjaWFsLT57ICQxIH0gOiAkMSB9Z2U7CisgICAgcmV0dXJuICRtc2c7Cit9OyAjIHN1YiBtc2cybWMKKworCisKK3N1YiBwYXJzZV9tZXNzYWdlKCQpIHsKKworICAgIG15ICggJG1zZyApID0gQF87CisgICAgcG9zKCAkbXNnICkgPSAwOworICAgIGZvciAoIDsgOyApIHsKKyAgICAgICAgaWYgKCAkbXNnICF+IG17XEcuKj8kZXNjYXBlfWdjICkgeworICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoICRtc2cgIX4gbXtcRyRwbGFjZWhvbGRlcn1nYyApIHsKKyAgICAgICAgICAgIHJldHVybiAiQmFkICUtc2VxdWVuY2UgbmVhciBcIiUiIC4gc3Vic3RyKCAkbXNnLCBwb3MoICRtc2cgKSwgNyApIC4gIlwiIjsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZXZlcgorICAgIHJldHVybiB1bmRlZjsKKworfTsgIyBzdWIgcGFyc2VfbWVzc2FnZQorCisKK3N1YiBwYXJzZV9zb3VyY2UoJCkgeworCisgICAgbXkgKCAkbmFtZSApID0gQF87CisKKyAgICBteSBAYnVsayA9IHJlYWRfZmlsZSggJG5hbWUsIC1sYXllciA9PiAiOnV0ZjgiICk7CisgICAgbXkgJGRhdGEgPSB7fTsKKworICAgIG15ICRsaW5lOworICAgIG15ICRuID0gMDsgICAgICAgICAjIExpbmUgbnVtYmVyLgorICAgIG15ICRvYnNvbGV0ZSA9IDA7ICAjIENvdW50ZXIgb2Ygb2Jzb2xldGUgZW50cmllcy4KKyAgICBteSAkbGFzdF9pZHg7CisgICAgbXkgJWlkZW50czsKKyAgICBteSAkc2VjdGlvbjsKKworICAgIG15ICRlcnJvciA9CisgICAgICAgIHN1YiB7CisgICAgICAgICAgICBteSAoICRuLCAkbGluZSwgJG1zZyApID0gQF87CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiRXJyb3IgcGFyc2luZyAkbmFtZSBsaW5lICRuOiAiIC4gIiRtc2c6XG4iIC4gIiAgICAkbGluZSIgKTsKKyAgICAgICAgfTsgIyBzdWIKKworICAgIGZvcmVhY2ggJGxpbmUgKCBAYnVsayApIHsKKyAgICAgICAgKysgJG47CisgICAgICAgICMgU2tpcCBlbXB0eSBsaW5lcyBhbmQgY29tbWVudHMuCisgICAgICAgIGlmICggJGxpbmUgPX4gbXtcQVxzKihcbnwjKX0gKSB7CisgICAgICAgICAgICAkbGFzdF9pZHggPSB1bmRlZjsKKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgIyBQYXJzZSBzZWN0aW9uIGhlYWRlci4KKyAgICAgICAgaWYgKCAkbGluZSA9fiBte1xBLVwqLVxzKihbQS1aX10qKVxzKi1cKi1ccypcblx6fWkgKSB7CisgICAgICAgICAgICAkc2VjdGlvbiA9ICggbGMoICQxICkgKTsKKyAgICAgICAgICAgIGlmICggbm90IGdyZXAoICRzZWN0aW9uIGVxICRfLCBAc2VjdGlvbnMgKSApIHsKKyAgICAgICAgICAgICAgICAkZXJyb3ItPiggJG4sICRsaW5lLCAiVW5rbm93biBzZWN0aW9uIFwiJHNlY3Rpb25cIiBzcGVjaWZpZWQiICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICBpZiAoIGV4aXN0cyggJGRhdGEtPnsgJHNlY3Rpb24gfSApICkgeworICAgICAgICAgICAgICAgICRlcnJvci0+KCAkbiwgJGxpbmUsICJNdWx0aXBsZSBzZWN0aW9ucyBvZiB0aGUgc2FtZSB0eXBlIHNwZWNpZmllZCIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICVpZGVudHMgPSAoKTsgICAgICMgQ2xlYW4gbGlzdCBvZiBrbm93biBtZXNzYWdlIGlkZW50aWZpZXJzLgorICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoIG5vdCBkZWZpbmVkKCAkc2VjdGlvbiApICkgeworICAgICAgICAgICAgJGVycm9yLT4oICRuLCAkbGluZSwgIlNlY3Rpb24gaGVhZGluZyBleHBlY3RlZCIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAjIFBhcnNlIHNlY3Rpb24gYm9keS4KKyAgICAgICAgaWYgKCAkc2VjdGlvbiBlcSAibWV0YSIgKSB7CisgICAgICAgICAgICBpZiAoICRsaW5lID1+IG17XEEoW0EtWl9dW0EtWl8wLTldKilccysiKC4qKSJccyo/XG4/XHp9aSApIHsKKyAgICAgICAgICAgICAgICAjIFBhcnNlIG1ldGEgcHJvcGVydGllcyAoc3VjaCBhcyBMYW5ndWFnZSwgQ291bnRyeSwgYW5kIExhbmdJZCkuCisgICAgICAgICAgICAgICAgbXkgKCAkcHJvcGVydHksICR2YWx1ZSApID0gKCAkMSwgJDIgKTsKKyAgICAgICAgICAgICAgICBpZiAoIG5vdCBncmVwKCAkXyBlcSAkcHJvcGVydHkgLCBAcHJvcGVydGllcyApICkgeworICAgICAgICAgICAgICAgICAgICAkZXJyb3ItPiggJG4sICRsaW5lLCAiVW5rbm93biBwcm9wZXJ0eSBcIiRwcm9wZXJ0eVwiIHNwZWNpZmllZCIgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgaWYgKCBleGlzdHMoICRkYXRhLT57ICIlbWV0YSIgfS0+eyAkcHJvcGVydHkgfSApICkgeworICAgICAgICAgICAgICAgICAgICAkZXJyb3ItPiggJG4sICRsaW5lLCAiUHJvcGVydHkgXCIkcHJvcGVydHlcIiBoYXMgYWxyZWFkeSBiZWVuIHNwZWNpZmllZCIgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgJGRhdGEtPnsgIiVtZXRhIiB9LT57ICRwcm9wZXJ0eSB9ID0gJHZhbHVlOworICAgICAgICAgICAgICAgICRsYXN0X2lkeCA9IHVuZGVmOworICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAkZXJyb3ItPiggJG4sICRsaW5lLCAiUHJvcGVydHkgbGluZSBleHBlY3RlZCIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAjIFBhcnNlIG1lc3NhZ2UuCisgICAgICAgIGlmICggJGxpbmUgPX4gbXtcQShbQS1aX11bQS1aXzAtOV0qKVxzKyIoLiopIlxzKj9cbj9cen1pICkgeworICAgICAgICAgICAgbXkgKCAkaWRlbnQsICRtZXNzYWdlICkgPSAoICQxLCAkMiApOworICAgICAgICAgICAgaWYgKCAkaWRlbnQgZXEgIk9CU09MRVRFIiApIHsKKyAgICAgICAgICAgICAgICAjIElmIGlkIGlzICJPQlNPTEVURSIsIGFkZCBhIHVuaXF1ZSBzdWZmaXguIEl0IHByb3ZpZGVzIGNvbnZlbmllbnQgd2F5IHRvIG1hcmsKKyAgICAgICAgICAgICAgICAjIG9ic29sZXRlIG1lc3NhZ2VzLgorICAgICAgICAgICAgICAgICsrICRvYnNvbGV0ZTsKKyAgICAgICAgICAgICAgICAkaWRlbnQgLj0gJG9ic29sZXRlOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgaWYgKCBleGlzdHMoICRpZGVudHN7ICRpZGVudCB9ICkgKSB7CisgICAgICAgICAgICAgICAgJGVycm9yLT4oICRuLCAkbGluZSwgIklkZW50aWZpZXIgXCIkaWRlbnRcIiBpcyByZWRlZmluZWQiICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAjIENoZWNrICUtc2VxdWVuY2VzLgorICAgICAgICAgICAgbXkgJGVyciA9IHBhcnNlX21lc3NhZ2UoICRtZXNzYWdlICk7CisgICAgICAgICAgICBpZiAoICRlcnIgKSB7CisgICAgICAgICAgICAgICAgJGVycm9yLT4oICRuLCAkbGluZSwgJGVyciApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgIyBTYXZlIG1lc3NhZ2UuCisgICAgICAgICAgICBwdXNoKCBAeyAkZGF0YS0+eyAkc2VjdGlvbiB9IH0sIFsgJGlkZW50LCAkbWVzc2FnZSBdICk7CisgICAgICAgICAgICAkaWRlbnRzeyAkaWRlbnQgfSA9IDE7CisgICAgICAgICAgICAkbGFzdF9pZHggPSBAeyAkZGF0YS0+eyAkc2VjdGlvbiB9IH0gLSAxOworICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAjIFBhcnNlIGNvbnRpbnVhdGlvbiBsaW5lLgorICAgICAgICBpZiAoICRsaW5lID1+IG17XEFccyoiKC4qKSJccypcen0gKSB7CisgICAgICAgICAgICBteSAkbWVzc2FnZSA9ICQxOworICAgICAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJGxhc3RfaWR4ICkgICkgeworICAgICAgICAgICAgICAgICRlcnJvci0+KCAkbiwgJGxpbmUsICJVbmV4cGVjdGVkIGNvbnRpbnVhdGlvbiBsaW5lIiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgIyBDaGVjayAlLXNlcXVlbmNlcy4KKyAgICAgICAgICAgIG15ICRlcnIgPSBwYXJzZV9tZXNzYWdlKCAkbWVzc2FnZSApOworICAgICAgICAgICAgaWYgKCAkZXJyICkgeworICAgICAgICAgICAgICAgICRlcnJvci0+KCAkbiwgJGxpbmUsICRlcnIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICMgU2F2ZSBjb250aW51YXRpb24uCisgICAgICAgICAgICAkZGF0YS0+eyAkc2VjdGlvbiB9LT5bICRsYXN0X2lkeCBdLT5bIDEgXSAuPSAkbWVzc2FnZTsKKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgJGVycm9yLT4oICRuLCAkbGluZSwgIk1lc3NhZ2UgZGVmaW5pdGlvbiBleHBlY3RlZCIgKTsKKyAgICB9OyAjIGZvcmVhY2gKKyAgICAkZGF0YS0+eyAiJW1ldGEiIH0tPnsgc291cmNlIH0gPSAkbmFtZTsKKyAgICBmb3JlYWNoIG15ICRzZWN0aW9uICggQHNlY3Rpb25zICkgeworICAgICAgICBpZiAoIG5vdCBleGlzdHMoICRkYXRhLT57ICRzZWN0aW9uIH0gKSApIHsKKyAgICAgICAgICAgICRkYXRhLT57ICRzZWN0aW9uIH0gPSBbXTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaCAkc2VjdGlvbgorCisgICAgZm9yZWFjaCBteSAkcHJvcGVydHkgKCBAcHJvcGVydGllcyApIHsKKyAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJGRhdGEtPnsgIiVtZXRhIiB9LT57ICRwcm9wZXJ0eSB9ICkgKSB7CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKAorICAgICAgICAgICAgICAgICJFcnJvciBwYXJzaW5nICRuYW1lOiAiIC4KKyAgICAgICAgICAgICAgICAgICAgIlJlcXVpcmVkIFwiJHByb3BlcnR5XCIgcHJvcGVydHkgaXMgbm90IHNwZWNpZmllZCIKKyAgICAgICAgICAgICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgcHVzaCggQHsgJGRhdGEtPnsgbWV0YSB9IH0sIFsgJHByb3BlcnR5LCAkZGF0YS0+eyAiJW1ldGEiIH0tPnsgJHByb3BlcnR5IH0gXSApOworICAgIH07ICMgZm9yZWFjaAorCisgICAgcmV0dXJuICRkYXRhOworCit9OyAjIHN1YiBwYXJzZV9zb3VyY2UKKworCitzdWIgZ2VuZXJhdGVfZW51bSgkJCQpIHsKKworICAgIG15ICggJGRhdGEsICRmaWxlLCAkcHJlZml4ICkgPSBAXzsKKyAgICBteSAkYnVsayA9ICIiOworCisgICAgJGJ1bGsgPQorICAgICAgICBfZ2VuZXJhdGVfY29tbWVudCggJGRhdGEsICIvLyIsICIvLyIgKSAuCisgICAgICAgICJcbiIgLgorICAgICAgICAiZW51bSAke3ByZWZpeH1faWQge1xuXG4iIC4KKyAgICAgICAgIiAgICAvLyBBIHNwZWNpYWwgaWQgZm9yIGFic2VuY2Ugb2YgbWVzc2FnZS5cbiIgLgorICAgICAgICAiICAgICR7cHJlZml4fV9udWxsID0gMCxcblxuIjsKKworICAgIGZvcmVhY2ggbXkgJHNlY3Rpb24gKCBAc2VjdGlvbnMgKSB7CisgICAgICAgIG15ICRwcm9wcyA9ICRzZWN0aW9ucy0+eyAkc2VjdGlvbiB9OyAgICAjIFNlY3Rpb24gcHJvcGVydGllcy4KKyAgICAgICAgbXkgJHNob3J0ID0gJHByb3BzLT57IHNob3J0IH07ICAgICAgICAgICMgU2hvcnQgc2VjdGlvbiBuYW1lLCBmcmVxdWVudGx5IHVzZWQuCisgICAgICAgICRidWxrIC49CisgICAgICAgICAgICAiICAgIC8vIFNldCAjJHByb3BzLT57IHNldCB9LCAkcHJvcHMtPnsgbG9uZyB9LlxuIiAuCisgICAgICAgICAgICAiICAgICR7cHJlZml4fV8ke3Nob3J0fV9maXJzdCA9ICRwcm9wcy0+eyBiYXNlIH0sXG4iOworICAgICAgICBmb3JlYWNoIG15ICRpdGVtICggQHsgJGRhdGEtPnsgJHNlY3Rpb24gfSB9ICkgeworICAgICAgICAgICAgbXkgKCAkaWRlbnQsIHVuZGVmICkgPSBAJGl0ZW07CisgICAgICAgICAgICAkYnVsayAuPSAiICAgICR7cHJlZml4fV8ke3Nob3J0fV8ke2lkZW50fSxcbiI7CisgICAgICAgIH07ICMgZm9yZWFjaAorICAgICAgICAkYnVsayAuPSAiICAgICR7cHJlZml4fV8ke3Nob3J0fV9sYXN0LFxuXG4iOworICAgIH07ICMgZm9yZWFjaCAkdHlwZQorICAgICRidWxrIC49ICIgICAgJHtwcmVmaXh9X3h4eF9sYXN0ZXN0XG5cbiI7CisKKyAgICAkYnVsayAuPQorICAgICAgICAifTsgLy8gZW51bSAke3ByZWZpeH1faWRcbiIgLgorICAgICAgICAiXG4iIC4KKyAgICAgICAgInR5cGVkZWYgZW51bSAke3ByZWZpeH1faWQgICR7cHJlZml4fV9pZF90O1xuIiAuCisgICAgICAgICJcbiI7CisKKyAgICAkYnVsayAuPQorICAgICAgICAiXG4iIC4KKyAgICAgICAgIi8vIGVuZCBvZiBmaWxlIC8vXG4iOworCisgICAgd3JpdGVfZmlsZSggJGZpbGUsIFwkYnVsayApOworCit9OyAjIHN1YiBnZW5lcmF0ZV9lbnVtCisKKworc3ViIGdlbmVyYXRlX3NpZ25hdHVyZSgkJCkgeworCisgICAgbXkgKCAkZGF0YSwgJGZpbGUgKSA9IEBfOworICAgIG15ICRidWxrID0gIiI7CisKKyAgICAkYnVsayAuPSAiLy8gbWVzc2FnZSBjYXRhbG9nIHNpZ25hdHVyZSBmaWxlIC8vXG5cbiI7CisKKyAgICBmb3JlYWNoIG15ICRzZWN0aW9uICggQHNlY3Rpb25zICkgeworICAgICAgICBteSAkcHJvcHMgPSAkc2VjdGlvbnMtPnsgJHNlY3Rpb24gfTsgICAgIyBTZWN0aW9uIHByb3BlcnRpZXMuCisgICAgICAgIG15ICRzaG9ydCA9ICRwcm9wcy0+eyBzaG9ydCB9OyAgICAgICAgICAjIFNob3J0IHNlY3Rpb24gbmFtZSwgZnJlcXVlbnRseSB1c2VkLgorICAgICAgICAkYnVsayAuPSAiLSotICIgLiB1YyggJHByb3BzLT57IGxvbmcgfSApIC4gIi0qLVxuXG4iOworICAgICAgICBmb3JlYWNoIG15ICRpdGVtICggQHsgJGRhdGEtPnsgJHNlY3Rpb24gfSB9ICkgeworICAgICAgICAgICAgbXkgKCAkaWRlbnQsICRtc2cgKSA9IEAkaXRlbTsKKyAgICAgICAgICAgICRidWxrIC49IHNwcmludGYoICIlLTQwcyAlc1xuIiwgJGlkZW50LCBtc2cyc2duKCAkbXNnICkgKTsKKyAgICAgICAgfTsgIyBmb3JlYWNoCisgICAgICAgICRidWxrIC49ICJcbiI7CisgICAgfTsgIyBmb3JlYWNoICR0eXBlCisKKyAgICAkYnVsayAuPSAiLy8gZW5kIG9mIGZpbGUgLy9cbiI7CisKKyAgICB3cml0ZV9maWxlKCAkZmlsZSwgXCRidWxrICk7CisKK307ICMgc3ViIGdlbmVyYXRlX3NpZ25hdHVyZQorCisKK3N1YiBnZW5lcmF0ZV9kZWZhdWx0KCQkJCkgeworCisgICAgbXkgKCAkZGF0YSwgJGZpbGUsICRwcmVmaXggKSA9IEBfOworICAgIG15ICRidWxrID0gIiI7CisKKyAgICAkYnVsayAuPQorICAgICAgICBfZ2VuZXJhdGVfY29tbWVudCggJGRhdGEsICIvLyIsICIvLyIgKSAuCisgICAgICAgICJcbiI7CisKKyAgICBmb3JlYWNoIG15ICRzZWN0aW9uICggQHNlY3Rpb25zICkgeworICAgICAgICAkYnVsayAuPQorICAgICAgICAgICAgInN0YXRpYyBjaGFyIGNvbnN0ICpcbiIgLgorICAgICAgICAgICAgIl9fJHtwcmVmaXh9X2RlZmF1bHRfJHtzZWN0aW9ufSIgLiAiW10gPVxuIiAuCisgICAgICAgICAgICAiICAgIHtcbiIgLgorICAgICAgICAgICAgIiAgICAgICAgTlVMTCxcbiI7CisgICAgICAgIGZvcmVhY2ggbXkgJGl0ZW0gKCBAeyAkZGF0YS0+eyAkc2VjdGlvbiB9IH0gKSB7CisgICAgICAgICAgICBteSAoIHVuZGVmLCAkbXNnICkgPSBAJGl0ZW07CisgICAgICAgICAgICAkYnVsayAuPSAiICAgICAgICBcIiIgLiBtc2cyc3JjKCAkbXNnICkgLiAiXCIsXG4iOworICAgICAgICB9OyAjIHdoaWxlCisgICAgICAgICRidWxrIC49CisgICAgICAgICAgICAiICAgICAgICBOVUxMXG4iIC4KKyAgICAgICAgICAgICIgICAgfTtcbiIgLgorICAgICAgICAgICAgIlxuIjsKKyAgICB9OyAjIGZvcmVhY2ggJHR5cGUKKworICAgICRidWxrIC49CisgICAgICAgICJzdHJ1Y3Qga21wX2kxOG5fc2VjdGlvbiB7XG4iIC4KKyAgICAgICAgIiAgICBpbnQgICAgICAgICAgIHNpemU7XG4iIC4KKyAgICAgICAgIiAgICBjaGFyIGNvbnN0ICoqIHN0cjtcbiIgLgorICAgICAgICAifTsgLy8gc3RydWN0IGttcF9pMThuX3NlY3Rpb25cbiIgLgorICAgICAgICAidHlwZWRlZiBzdHJ1Y3Qga21wX2kxOG5fc2VjdGlvbiAga21wX2kxOG5fc2VjdGlvbl90O1xuIiAuCisgICAgICAgICJcbiIgLgorICAgICAgICAic3RhdGljIGttcF9pMThuX3NlY3Rpb25fdFxuIiAuCisgICAgICAgICJfXyR7cHJlZml4fV9zZWN0aW9uc1tdID1cbiIgLgorICAgICAgICAiICAgIHtcbiIgLgorICAgICAgICAiICAgICAgICB7IDAsIE5VTEwgfSxcbiI7CisgICAgZm9yZWFjaCBteSAkc2VjdGlvbiAoIEBzZWN0aW9ucyApIHsKKyAgICAgICAgJGJ1bGsgLj0KKyAgICAgICAgICAgICIgICAgICAgIHsgIiAuIEB7ICRkYXRhLT57ICRzZWN0aW9uIH0gfSAuICIsIF9fJHtwcmVmaXh9X2RlZmF1bHRfJHtzZWN0aW9ufSB9LFxuIjsKKyAgICB9OyAjIGZvcmVhY2ggJHR5cGUKKyAgICAkYnVsayAuPQorICAgICAgICAiICAgICAgICB7IDAsIE5VTEwgfVxuIiAuCisgICAgICAgICIgICAgfTtcbiIgLgorICAgICAgICAiXG4iOworCisgICAgJGJ1bGsgLj0KKyAgICAgICAgInN0cnVjdCBrbXBfaTE4bl90YWJsZSB7XG4iIC4KKyAgICAgICAgIiAgICBpbnQgICAgICAgICAgICAgICAgICAgc2l6ZTtcbiIgLgorICAgICAgICAiICAgIGttcF9pMThuX3NlY3Rpb25fdCAqICBzZWN0O1xuIiAuCisgICAgICAgICJ9OyAvLyBzdHJ1Y3Qga21wX2kxOG5fdGFibGVcbiIgLgorICAgICAgICAidHlwZWRlZiBzdHJ1Y3Qga21wX2kxOG5fdGFibGUgIGttcF9pMThuX3RhYmxlX3Q7XG4iIC4KKyAgICAgICAgIlxuIiAuCisgICAgICAgICJzdGF0aWMga21wX2kxOG5fdGFibGVfdCBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUgPVxuIiAuCisgICAgICAgICIgICAge1xuIiAuCisgICAgICAgICIgICAgICAgICIgLiBAc2VjdGlvbnMgLiAiLFxuIiAuCisgICAgICAgICIgICAgICAgIF9fa21wX2kxOG5fc2VjdGlvbnNcbiIgLgorICAgICAgICAiICAgIH07XG4iIC4KKyAgICAgICAgIlxuIiAuCisgICAgICAgICIvLyBlbmQgb2YgZmlsZSAvL1xuIjsKKworICAgIHdyaXRlX2ZpbGUoICRmaWxlLCBcJGJ1bGsgKTsKKworfTsgIyBzdWIgZ2VuZXJhdGVfZGVmYXVsdAorCisKK3N1YiBnZW5lcmF0ZV9tZXNzYWdlX3VuaXgoJCQpIHsKKworICAgIG15ICggJGRhdGEsICRmaWxlICkgPSBAXzsKKyAgICBteSAkYnVsayAgICAgPSAiIjsKKworICAgICRidWxrIC49CisgICAgICAgIF9nZW5lcmF0ZV9jb21tZW50KCAkZGF0YSwgIlwkIiwgIlwkIiApIC4KKyAgICAgICAgIlxuIiAuCisgICAgICAgICJcJHF1b3RlIFwiXG5cbiI7CisKKyAgICBmb3JlYWNoIG15ICRzZWN0aW9uICggQHNlY3Rpb25zICkgeworICAgICAgICAkYnVsayAuPQorICAgICAgICAgICAgIlwkICIgLiAoICItIiB4IDc4ICkgLiAiXG5cJCAkc2VjdGlvblxuXCQgIiAuICggIi0iIHggNzggKSAuICJcblxuIiAuCisgICAgICAgICAgICAiXCRzZXQgJHNlY3Rpb25zLT57ICRzZWN0aW9uIH0tPnsgc2V0IH1cbiIgLgorICAgICAgICAgICAgIlxuIjsKKyAgICAgICAgbXkgJG4gPSAwOworICAgICAgICBmb3JlYWNoIG15ICRpdGVtICggQHsgJGRhdGEtPnsgJHNlY3Rpb24gfSB9ICkgeworICAgICAgICAgICAgbXkgKCB1bmRlZiwgJG1zZyApID0gQCRpdGVtOworICAgICAgICAgICAgKysgJG47CisgICAgICAgICAgICAkYnVsayAuPSAiJG4gXCIiIC4gbXNnMnNyYyggJG1zZyApIC4gIlwiXG4iOworICAgICAgICB9OyAjIGZvcmVhY2gKKyAgICAgICAgJGJ1bGsgLj0gIlxuIjsKKyAgICB9OyAjIGZvcmVhY2ggJHR5cGUKKworICAgICRidWxrIC49CisgICAgICAgICJcbiIgLgorICAgICAgICAiXCQgZW5kIG9mIGZpbGUgXCRcbiI7CisKKyAgICB3cml0ZV9maWxlKCAkZmlsZSwgXCRidWxrLCAtbGF5ZXIgPT4gIjp1dGY4IiApOworCit9OyAjIHN1YiBnZW5lcmF0ZV9tZXNzYWdlX2xpbnV4CisKKworc3ViIGdlbmVyYXRlX21lc3NhZ2Vfd2luZG93cygkJCkgeworCisgICAgbXkgKCAkZGF0YSwgJGZpbGUgKSA9IEBfOworICAgIG15ICRidWxrID0gIiI7CisgICAgbXkgJGxhbmd1YWdlID0gJGRhdGEtPnsgIiVtZXRhIiB9LT57IExhbmd1YWdlIH07CisgICAgbXkgJGxhbmdpZCAgID0gJGRhdGEtPnsgIiVtZXRhIiB9LT57IExhbmdJZCB9OworCisgICAgJGJ1bGsgLj0KKyAgICAgICAgX2dlbmVyYXRlX2NvbW1lbnQoICRkYXRhLCAiOyIsICI7IiApIC4KKyAgICAgICAgIlxuIiAuCisgICAgICAgICJMYW5ndWFnZU5hbWVzID0gKCRsYW5ndWFnZT0kbGFuZ2lkOm1zZ18kbGFuZ2lkKVxuIiAuCisgICAgICAgICJcbiI7CisKKyAgICAkYnVsayAuPQorICAgICAgICAiRmFjaWxpdHlOYW1lcz0oXG4iOworICAgIGZvcmVhY2ggbXkgJHNlY3Rpb24gKCBAc2VjdGlvbnMgKSB7CisgICAgICAgIG15ICRwcm9wcyA9ICRzZWN0aW9ucy0+eyAkc2VjdGlvbiB9OyAgICAjIFNlY3Rpb24gcHJvcGVydGllcy4KKyAgICAgICAgJGJ1bGsgLj0KKyAgICAgICAgICAgICIgJHByb3BzLT57IHNob3J0IH09IiAuICRwcm9wcy0+eyBzZXQgfSAuIlxuIjsKKyAgICB9OyAjIGZvcmVhY2ggJHNlY3Rpb24KKyAgICAkYnVsayAuPQorICAgICAgICAiKVxuXG4iOworCisgICAgZm9yZWFjaCBteSAkc2VjdGlvbiAoIEBzZWN0aW9ucyApIHsKKyAgICAgICAgbXkgJHNob3J0ID0gJHNlY3Rpb25zLT57ICRzZWN0aW9uIH0tPnsgc2hvcnQgfTsKKyAgICAgICAgbXkgJG4gPSAwOworICAgICAgICBmb3JlYWNoIG15ICRpdGVtICggQHsgJGRhdGEtPnsgJHNlY3Rpb24gfSB9ICkgeworICAgICAgICAgICAgbXkgKCB1bmRlZiwgJG1zZyApID0gQCRpdGVtOworICAgICAgICAgICAgKysgJG47CisgICAgICAgICAgICAkYnVsayAuPQorICAgICAgICAgICAgICAgICJNZXNzYWdlSWQ9JG5cbiIgLgorICAgICAgICAgICAgICAgICJGYWNpbGl0eT0kc2hvcnRcbiIgLgorICAgICAgICAgICAgICAgICJMYW5ndWFnZT0kbGFuZ3VhZ2VcbiIgLgorICAgICAgICAgICAgICAgIG1zZzJtYyggJG1zZyApIC4gIlxuLlxuXG4iOworICAgICAgICB9OyAjIGZvcmVhY2ggJGl0ZW0KKyAgICB9OyAjIGZvcmVhY2ggJHNlY3Rpb24KKworICAgICRidWxrIC49CisgICAgICAgICJcbiIgLgorICAgICAgICAiOyBlbmQgb2YgZmlsZSA7XG4iOworCisgICAgJGJ1bGsgPSBlbmNvZGUoICJVVEYtMTZMRSIsICRidWxrICk7ICMgQ29udmVydCB0ZXh0IHRvIFVURi0xNkxFIHVzZWQgaW4gV2luZG93cyogT1MuCisgICAgd3JpdGVfZmlsZSggJGZpbGUsIFwkYnVsaywgLWJpbmFyeSA9PiAxICk7CisKK307ICMgc3ViIGdlbmVyYXRlX21lc3NhZ2Vfd2luZG93cworCisKKyMKKyMgUGFyc2UgY29tbWFuZCBsaW5lLgorIworCitteSAkaW5wdXRfZmlsZTsKK215ICRlbnVtX2ZpbGU7CitteSAkc2lnbmF0dXJlX2ZpbGU7CitteSAkZGVmYXVsdF9maWxlOworbXkgJG1lc3NhZ2VfZmlsZTsKK215ICRpZDsKK215ICRwcmVmaXggPSAiIjsKK2dldF9vcHRpb25zKAorICAgICJvcz1zIiAgICAgICAgICAgICA9PiBcJHRhcmdldF9vcywKKyAgICAiZW51bS1maWxlPXMiICAgICAgPT4gXCRlbnVtX2ZpbGUsCisgICAgInNpZ25hdHVyZS1maWxlPXMiID0+IFwkc2lnbmF0dXJlX2ZpbGUsCisgICAgImRlZmF1bHQtZmlsZT1zIiAgID0+IFwkZGVmYXVsdF9maWxlLAorICAgICJtZXNzYWdlLWZpbGU9cyIgICA9PiBcJG1lc3NhZ2VfZmlsZSwKKyAgICAiaWR8bGFuZy1pZCIgICAgICAgPT4gXCRpZCwKKyAgICAicHJlZml4PXMiCSAgICAgICA9PiBcJHByZWZpeCwKKyk7CitpZiAoIEBBUkdWID09IDAgKSB7CisgICAgY21kbGluZV9lcnJvciggIk5vIHNvdXJjZSBmaWxlIHNwZWNpZmllZCAtLSBub3RoaW5nIHRvIGRvIiApOworfTsgIyBpZgoraWYgKCBAQVJHViA+IDEgKSB7CisgICAgY21kbGluZV9lcnJvciggIlRvbyBtYW55IHNvdXJjZSBmaWxlcyBzcGVjaWZpZWQiICk7Cit9OyAjIGlmCiskaW5wdXRfZmlsZSA9ICRBUkdWWyAwIF07CisKKworbXkgJGdlbmVyYXRlX21lc3NhZ2U7CitpZiAoICR0YXJnZXRfb3MgPX4gbXtcQSg/OmxpbnxtYWMpXHp9ICkgeworICAgICRnZW5lcmF0ZV9tZXNzYWdlID0gXCZnZW5lcmF0ZV9tZXNzYWdlX3VuaXg7Cit9IGVsc2lmICggJHRhcmdldF9vcyBlcSAid2luIiApIHsKKyAgICAkZ2VuZXJhdGVfbWVzc2FnZSA9IFwmZ2VuZXJhdGVfbWVzc2FnZV93aW5kb3dzOworfSBlbHNlIHsKKyAgICBydW50aW1lX2Vycm9yKCAiT1MgXCIkdGFyZ2V0X29zXCIgaXMgbm90IHN1cHBvcnRlZCIgKTsKK307ICMgaWYKKworCisjCisjIERvIHRoZSB3b3JrLgorIworCitteSAkZGF0YSA9IHBhcnNlX3NvdXJjZSggJGlucHV0X2ZpbGUgKTsKK2lmICggZGVmaW5lZCggJGlkICkgKSB7CisgICAgcHJpbnQoICRkYXRhLT57ICIlbWV0YSIgfS0+eyBMYW5nSWQgfSwgIlxuIiApOworfTsgIyBpZgoraWYgKCBkZWZpbmVkKCAkZW51bV9maWxlICkgKSB7CisgICAgZ2VuZXJhdGVfZW51bSggJGRhdGEsICRlbnVtX2ZpbGUsICRwcmVmaXggKTsKK307ICMgaWYKK2lmICggZGVmaW5lZCggJHNpZ25hdHVyZV9maWxlICkgKSB7CisgICAgZ2VuZXJhdGVfc2lnbmF0dXJlKCAkZGF0YSwgJHNpZ25hdHVyZV9maWxlICk7Cit9OyAjIGlmCitpZiAoIGRlZmluZWQoICRkZWZhdWx0X2ZpbGUgKSApIHsKKyAgICBnZW5lcmF0ZV9kZWZhdWx0KCAkZGF0YSwgJGRlZmF1bHRfZmlsZSwgJHByZWZpeCApOworfTsgIyBpZgoraWYgKCBkZWZpbmVkKCAkbWVzc2FnZV9maWxlICkgKSB7CisgICAgJGdlbmVyYXRlX21lc3NhZ2UtPiggJGRhdGEsICRtZXNzYWdlX2ZpbGUgKTsKK307ICMgaWYKKworZXhpdCggMCApOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworQjxtZXNzYWdlLWNvbnZlcnRlci5wbD4gLS0gQ29udmVydCBtZXNzYWdlIGNhdGFsb2cgc291cmNlIGZpbGUgaW50byBhbm90aGVyIHRleHQgZm9ybXMuCisKKz1oZWFkMSBTWU5PUFNJUworCitCPG1lc3NhZ2UtY29udmVydGVyLnBsPiBJPG9wdGlvbj4uLi4gPGZpbGU+CisKKz1oZWFkMSBPUFRJT05TCisKKz1vdmVyCisKKz1pdGVtIEI8LS1lbnVtLWZpbGU9Pkk8ZmlsZT4KKworR2VuZXJhdGUgZW51bSBmaWxlIG5hbWVkIEk8ZmlsZT4uCisKKz1pdGVtIEI8LS1kZWZhdWx0LWZpbGU9Pkk8ZmlsZT4KKworR2VuZXJhdGUgZGVmYXVsdCBtZXNzYWdlcyBmaWxlIG5hbWVkIEk8ZmlsZT4uCisKKz1pdGVtIEI8LS1sYW5nLWlkPgorCitQcmludCBsYW5ndWFnZSBpZGVudGlmaWVyIG9mIHRoZSBtZXNzYWdlIGNhdGFsb2cgc291cmNlIGZpbGUuCisKKz1pdGVtIEI8LS1tZXNzYWdlLWZpbGU9Pkk8ZmlsZT4KKworR2VuZXJhdGUgbWVzc2FnZSBmaWxlLgorCis9aXRlbSBCPC0tc2lnbmF0dXJlLWZpbGU9Pkk8ZmlsZT4KKworR2VuZXJhdGUgc2lnbmF0dXJlIGZpbGUuCisKK1NpZ25hdHVyZXMgYXJlIHVzZWQgZm9yIGNoZWNraW5nIGNvbXBhdGliaWxpdHkuIEZvciBleGFtcGxlLCB0byBjaGVjayBhIHByaW1hcnkKK2NhdGFsb2cgYW5kIGl0cyB0cmFuc2xhdGlvbiB0byBhbm90aGVyIGxhbmd1YWdlLCBzaWduYXR1cmVzIG9mIGJvdGggY2F0YWxvZ3Mgc2hvdWxkIGJlIGdlbmVyYXRlZAorYW5kIGNvbXBhcmVkLiBJZiBzaWduYXR1cmVzIGFyZSBpZGVudGljYWwsIGNhdGFsb2dzIGFyZSBjb21wYXRpYmxlLgorCis9aXRlbSBCPC0tcHJlZml4PT5JPHByZWZpeD4KKworUHJlZml4IHRvIGJlIHVzZWQgZm9yIGFsbCBDIGlkZW50aWZpZXJzICh0eXBlIGFuZCB2YXJpYWJsZSBuYW1lcykgaW4gZW51bSBhbmQgZGVmYXVsdCBtZXNzYWdlcworZmlsZXMuCisKKz1pdGVtIEI8LS1vcz0+STxzdHI+CisKK1NwZWNpZnkgT1MgbmFtZSB0aGUgbWVzc2FnZSBmb3JtYXRzIHRvIGJlIGNvbnZlcnRlZCBmb3IuIElmIG5vdCBzcGVjaWZpZWQgZXhwb2xpY2l0bHksIHZhbHVlIG9mCitMSUJPTVBfT1MgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgdXNlZC4gSWYgTElCT01QX09TIGlzIG5vdCBkZWZpbmVkLCBob3N0IE9TIGlzIGRldGVjdGVkLgorCitEZXBlbmRpbmcgb24gT1MsIEI8bWVzc2FnZS1jb252ZXJ0ZXIucGw+IGNvbnZlcnRzIG1lc3NhZ2UgZm9ybWF0cyB0byBHTlUgc3R5bGUgb3IgTVMgc3R5bGUuCisKKz1pdGVtIFN0YW5kYXJkIE9wdGlvbnMKKworPW92ZXIKKworPWl0ZW0gQjwtLWRvYz4KKworPWl0ZW0gQjwtLW1hbnVhbD4KKworUHJpbnQgZnVsbCBkb2N1bWVudGF0aW9uIGFuZCBleGl0LgorCis9aXRlbSBCPC0taGVscD4KKworUHJpbnQgc2hvcnQgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdmVyc2lvbj4KKworUHJpbnQgdmVyc2lvbiBzdHJpbmcgYW5kIGV4aXQuCisKKz1iYWNrCisKKz1iYWNrCisKKz1oZWFkMSBBUkdVTUVOVFMKKworPW92ZXIKKworPWl0ZW0gSTxmaWxlPgorCitBIG5hbWUgb2YgaW5wdXQgZmlsZS4KKworPWJhY2sKKworPWhlYWQxIERFU0NSSVBUSU9OCisKKz1oZWFkMiBNZXNzYWdlIENhdGFsb2cgRmlsZSBGb3JtYXQKKworSXQgaXMgcGxhaW4gdGV4dCBmaWxlIGluIFVURi04IGVuY29kaW5nLiBFbXB0eSBsaW5lcyBhbmQgbGluZXMgYmVnaW5uaW5nIHdpdGggc2hhcnAgc2lnbiAoQzwjPikgYXJlCitpZ25vcmVkLiBFQk5GIHN5bnRheCBvZiBjb250ZW50OgorCisgICAgY2F0YWxvZyAgICA9IHsgc2VjdGlvbiB9OworICAgIHNlY3Rpb24gICAgPSBoZWFkZXIgYm9keTsKKyAgICBoZWFkZXIgICAgID0gIi0qLSAiIHNlY3Rpb24taWQgIiAtKi0iICJcbiI7CisgICAgYm9keSAgICAgICA9IHsgbWVzc2FnZSB9OworICAgIG1lc3NhZ2UgICAgPSBtZXNzYWdlLWlkIHN0cmluZyAiXG4iIHsgc3RyaW5nICJcbiIgfTsKKyAgICBzZWN0aW9uLWlkID0gaWRlbnRpZmllcjsKKyAgICBtZXNzYWdlLWlkID0gIk9CU09MRVRFIiB8IGlkZW50aWZpZXI7CisgICAgaWRlbnRpZmllciA9IGxldHRlciB7IGxldHRlciB8IGRpZ2l0IHwgIl8iIH07CisgICAgc3RyaW5nICAgICA9ICIiIiB7IGNoYXJhY3RlciB9ICIiIjsKKworSWRlbnRpZmllciBzdGFydHMgd2l0aCBsZXR0ZXIsIHdpdGggZm9sbG93aW5nIGxldHRlcnMsIGRpZ2l0cywgYW5kIHVuZGVyc2NvcmVzLiBJZGVudGlmaWVycyBhcmUKK2Nhc2Utc2Vuc2l0aXZlLiBTZXRpb24gaWRlbnRpZmllcnMgYXJlIGZpeGVkOiBDPE1FVEE+LCBDPFNUUklOR1M+LCBDPEZPUk1BVFM+LCBDPE1FU1NBR0VTPiBhbmQKK0M8SElOVFM+LiBNZXNzYWdlIGlkZW50aWZpZXJzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBzZWN0aW9uLiBTcGVjaWFsIEM8T0JTT0xFVEU+IHBzZXVkby1pZGVudGlmaWVyCittYXkgYmUgdXNlZCBtYW55IHRpbWVzLgorCitTdHJpbmcgaXMgYSBDIHN0cmluZyBsaXRlcmFsIHdoaWNoIG11c3Qgbm90IGNyb3NzIGxpbmUgYm91bmRhcmllcy4KK0xvbmcgbWVzc2FnZXMgbWF5IG9jY3VweSBtdWx0aXBsZSBsaW5lcywgYSBzdHJpbmcgcGVyIGxpbmUuCisKK01lc3NhZ2UgbWF5IGluY2x1ZGUgcHJpbnRmLWxpa2UgR05VLXN0eWxlIHBsYWNlaG9sZGVycyBmb3IgYXJndW1lbnRzOiBDPCVJPG4+JEk8dD4+LAord2hlcmUgSTxuPiBpcyBhcmd1bWVudCBudW1iZXIgKEM8MT4sIEM8Mj4sIC4uLiksCitJPHQ+IC0tIGFyZ3VtZW50IHR5cGUsIEM8cz4gKHN0cmluZykgb3IgQzxkPiAoMzItYml0IGludGVnZXIpLgorCitTZWUgYWxzbyBjb21tZW50cyBpbiBGPGkxOG4vZW5fVVMudHh0Pi4KKworPWhlYWQyIE91dHB1dCBGaWxlcworCitUaGlzIHNjcmlwdCBjYW4gZ2VuZXJhdGUgMyBkaWZmZXJlbnQgdGV4dCBmaWxlcyBmcm9tIHNpbmdsZSBzb3VyY2U6CisKKz1vdmVyCisKKz1pdGVtIEVudW0gZmlsZS4KKworRW51bSBmaWxlIGlzIGEgQyBpbmNsdWRlIGZpbGUsIGNvbnRhaW5pbmcgZGVmaW5pdGlvbnMgb2YgbWVzc2FnZSBpZGVudGlmaWVycywgZS4gZy46CisKKyAgICBlbnVtIGttcF9pMThuX2lkIHsKKworICAgICAgICAvLyBTZXQgIzEsIG1ldGEuCisgICAgICAgIGttcF9pMThuX3BycF9maXJzdCA9IDY1NTM2LAorICAgICAgICBrbXBfaTE4bl9wcnBfTGFuZ3VhZ2UsCisgICAgICAgIGttcF9pMThuX3BycF9Db3VudHJ5LAorICAgICAgICBrbXBfaTE4bl9wcnBfTGFuZ0lkLAorICAgICAgICBrbXBfaTE4bl9wcnBfVmVyc2lvbiwKKyAgICAgICAga21wX2kxOG5fcHJwX1JldmlzaW9uLAorICAgICAgICBrbXBfaTE4bl9wcnBfbGFzdCwKKworICAgICAgICAvLyBTZXQgIzIsIHN0cmluZ3MuCisgICAgICAgIGttcF9pMThuX3N0cl9maXJzdCA9IDEzMTA3MiwKKyAgICAgICAga21wX2kxOG5fc3RyX0Vycm9yLAorICAgICAgICBrbXBfaTE4bl9zdHJfVW5rbm93bkZpbGUsCisgICAgICAgIGttcF9pMThuX3N0cl9Ob3RBTnVtYmVyLAorICAgICAgICAuLi4KKworICAgICAgICAvLyBTZXQgIzMsIGZvdHJtYXRzLgorICAgICAgICAuLi4KKworICAgICAgICBrbXBfaTE4bl94eHhfbGFzdGVzdAorCisgICAgfTsgLy8gZW51bSBrbXBfaTE4bl9pZAorCisgICAgdHlwZWRlZiBlbnVtIGttcF9pMThuX2lkICBrbXBfaTE4bl9pZF90OworCis9aXRlbSBEZWZhdWx0IG1lc3NhZ2VzIGZpbGUuCisKK0RlZmF1bHQgbWVzc2FnZXMgZmlsZSBpcyBhIEMgaW5jbHVkZSBmaWxlIGNvbnRhaW5pbmcgZGVmYXVsdCBtZXNzYWdlcyB0byBiZSBlbWJlZGRlZCBpbnRvCithcHBsaWNhdGlvbiAoYW5kIHVzZWQgaWYgZXh0ZXJuYWwgbWVzc2FnZSBjYXRhbG9nIGRvZXMgbm90IGV4aXN0IG9yIGNvdWxkIG5vdCBiZSBvcGVuKToKKworICAgIHN0YXRpYyBjaGFyIGNvbnN0ICoKKyAgICBfX2ttcF9pMThuX2RlZmF1bHRfbWV0YVtdID0KKyAgICAgICAgeworICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICJFbmdsaXNoIiwKKyAgICAgICAgICAgICJVU0EiLAorICAgICAgICAgICAgIjEwMzMiLAorICAgICAgICAgICAgIjIiLAorICAgICAgICAgICAgIjIwMDkwODA2IiwKKyAgICAgICAgICAgIE5VTEwKKyAgICAgICAgfTsKKworICAgIHN0YXRpYyBjaGFyIGNvbnN0ICoKKyAgICBfX2ttcF9pMThuX2RlZmF1bHRfc3RyaW5nc1tdID0KKyAgICAgICAgeworICAgICAgICAgICAgIkVycm9yIiwKKyAgICAgICAgICAgICIodW5rbm93biBmaWxlKSIsCisgICAgICAgICAgICAibm90IGEgbnVtYmVyIiwKKyAgICAgICAgICAgIC4uLgorICAgICAgICAgICAgTlVMTAorICAgICAgICB9OworCisgICAgLi4uCisKKz1pdGVtIE1lc3NhZ2UgZmlsZS4KKworTWVzc2FnZSBmaWxlIGlzIGFuIGlucHV0IGZvciBtZXNzYWdlIGNvbXBpbGVyLCBGPGdlbmNhdD4gb24gTGludXgqIE9TIGFuZCBPUyBYKiwgb3IgRjxtYy5leGU+IG9uCitXaW5kb3dzKiBPUy4KKworSGVyZSBpcyB0aGUgZXhhbXBsZSBvZiBMaW51eCogT1MgbWVzc2FnZSBmaWxlOgorCisgICAgJHF1b3RlICIKKyAgICAxICJKYXBhbmVzZSIKKyAgICAyICJKYXBhbiIKKyAgICAzICIxMDQxIgorICAgIDQgIjIiCisgICAgNSAiQmFzZWQgb24gRW5saXNoIG1lc3NhZ2UgY2F0YWxvZyByZXZpc2lvbiAyMDA5MDgwNiIKKyAgICAuLi4KKworRXhhbXBsZSBvZiBXaW5kb3dzKiBPUyBtZXNzYWdlIGZpbGU6CisKKyAgICBMYW5ndWFnZU5hbWVzID0gKEphcGFuZXNlPTEwMDQxOm1zZ18xMDQxKQorCisgICAgRmFjaWxpdHlOYW1lcyA9ICgKKyAgICAgcHJwPTEKKyAgICAgc3RyPTIKKyAgICAgZm10PTMKKyAgICAgLi4uCisgICAgKQorCisgICAgTWVzc2FnZUlkPTEKKyAgICBGYWNpbGl0eT1wcnAKKyAgICBMYW5ndWFnZT1KYXBhbmVzZQorICAgIEphcGFuZXNlCisgICAgLgorCisgICAgLi4uCisKKz1pdGVtIFNpZ25hdHVyZS4KKworU2lnbmF0dXJlIGlzIGEgcHJvY2Vzc2VkIHNvdXJjZSBmaWxlOiBjb21tZW50cyBzdHJpcHBlZCwgc3RyaW5ncyBkZWxldGVkLCBidXQgcGxhY2Vob2xkZXJzIGtlcHQgYW5kCitzb3J0ZWQuCisKKyAgICAtKi0gRk9STUFUUy0qLQorCisgICAgSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlMSRkICUyJHMKKyAgICBXYXJuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUxJGQgJTIkcworICAgIEZhdGFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTEkZCAlMiRzCisgICAgU3lzRXJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlMSRkICUyJHMKKyAgICBIaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUxJC0gJTIkcworICAgIFByYWdtYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTEkcyAlMiRzICUzJHMgJTQkcworCitUaGUgcHVycG9zZSBvZiBzaWduYXR1cmVzIC0tIGNvbXBhcmUgdHdvIG1lc3NhZ2Ugc291cmNlIGZpbGVzIGZvciBjb21wYXRpYmlsaXR5LiBJZiBzaWduYXR1cmVzIG9mCit0d28gbWVzc2FnZSBzb3VyY2VzIGFyZSB0aGUgc2FtZSwgYmluYXJ5IG1lc3NhZ2UgY2F0YWxvZ3Mgd2lsbCBiZSBjb21wYXRpYmxlLgorCis9YmFjaworCis9aGVhZDEgRVhBTVBMRVMKKworR2VuZXJhdGUgaW5jbHVkZSBmaWxlIGNvbnRhaW5pbmcgbWVzc2FnZSBpZGVudGlmaWVyczoKKworICAgICQgbWVzc2FnZS1jb252ZXJ0ZXIucGwgLS1lbnVtLWZpbGU9a21wX2kxOG5faWQuaW5jIGVuX1VTLnR4dAorCitHZW5lcmF0ZSBpbmNsdWRlIGZpbGUgY29udGF0aW5nIGRlZmF1bHQgbWVzc2FnZXM6CisKKyAgICAkIG1lc3NhZ2UtY29udmVydGVyLnBsIC0tZGVmYXVsdC1maWxlPWttcF9pMThuX2RlZmF1bHQuaW5jIGVuX1VTLnR4dAorCitHZW5lcmF0ZSBpbnB1dCBmaWxlIGZvciBtZXNzYWdlIGNvbXBpbGVyLCBMaW51eCogT1MgZXhhbXBsZToKKworICAgICQgbWVzc2FnZS1jb252ZXJ0ZXIucGwgLS1tZXNzYWdlLWZpbGU9cnVfUlUuVVRGLTgubXNnIHJ1X1JVLnR4dAorCitHZW5lcmF0ZSBpbnB1dCBmaWxlIGZvciBtZXNzYWdlIGNvbXBpbGVyLCBXaW5kb3dzKiBPUyBleGFtcGxlOgorCisgICAgPiBtZXNzYWdlLWNvbnZlcnRlci5wbCAtLW1lc3NhZ2UtZmlsZT1ydV9SVS5VVEYtOC5tYyBydV9SVS50eHQKKworPWN1dAorCisjIGVuZCBvZiBmaWxlICMKKwpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL0xJQ0VOU0UgYi9maW5hbC90ZXN0c3VpdGUvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTlmYjAxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL0xJQ0VOU0UKQEAgLTAsMCArMSwzNCBAQAorICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgCisgIFVuaXZlcnNpdHkgb2YgSG91c3RvbiBTeXN0ZW0KKyAgCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgIAorICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgIGFyZSBtZXQ6CisgIAorICBvIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAKKyAgbyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAKKyAgbyBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG9mIEhvdXN0b24gU3lzdGVtIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0bworICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljCisgICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAKKyAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKKyAgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAKKwpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL0xMVk0tSVIvbGl0LmNmZyBiL2ZpbmFsL3Rlc3RzdWl0ZS9MTFZNLUlSL2xpdC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk1NzgxOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9MTFZNLUlSL2xpdC5jZmcKQEAgLTAsMCArMSw3OCBAQAorIyAtKi0gUHl0aG9uIC0qLQorCisjIENvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlICdsaXQnIHRlc3QgcnVubmVyLgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCByZQoraW1wb3J0IHBsYXRmb3JtCisKK3RyeToKKyAgIGltcG9ydCBsaXQudXRpbAorICAgaW1wb3J0IGxpdC5mb3JtYXRzCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICBwYXNzCisKKyMgbmFtZTogVGhlIG5hbWUgb2YgdGhpcyB0ZXN0IHN1aXRlLgorY29uZmlnLm5hbWUgPSAnT3Blbk1QVmFsaWRhdGlvblN1aXRlJworCisjIHRlc3RGb3JtYXQ6IFRoZSB0ZXN0IGZvcm1hdCB0byB1c2UgdG8gaW50ZXJwcmV0IHRlc3RzLgorY29uZmlnLnRlc3RfZm9ybWF0ID0gbGl0LmZvcm1hdHMuU2hUZXN0KGV4ZWN1dGVfZXh0ZXJuYWw9RmFsc2UpCisKKyMgc3VmZml4ZXM6IEEgbGlzdCBvZiBmaWxlIGV4dGVuc2lvbnMgdG8gdHJlYXQgYXMgdGVzdCBmaWxlcworIyBOb3RlIHRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgbGl0LmxvY2FsLmNmZyBmaWxlcworY29uZmlnLnN1ZmZpeGVzID0gWycubGwnXQorCisjIHRlc3Rfc291cmNlX3Jvb3Q6IFRoZSByb290IHBhdGggd2hlcmUgdGVzdHMgYXJlIGxvY2F0ZWQuCisjY29uZmlnLnRlc3Rfc291cmNlX3Jvb3QgPSAiL2hvbWUvaWNob3lqeC9pbnN0YWxsL29wZW5tcC90ZXN0c3VpdGUvYmluIgorI29zLnBhdGguZGlybmFtZShfX2ZpbGVfXykKKworIyB0ZXN0X2V4ZWNfcm9vdDogVGhlIHJvb3QgcGF0aCB3aGVyZSB0ZXN0cyBzaG91bGQgYmUgcnVuLgorI21wdnNfb2JqX3Jvb3QgPSBnZXRhdHRyKGNvbmZpZywgJ21wdnNfb2JqX3Jvb3QnLCBOb25lKQorI2lmIG1wdnNfb2JqX3Jvb3QgaXMgbm90IE5vbmU6Citjb25maWcudGVzdF9leGVjX3Jvb3QgPSAiLi8iCisjb3MucGF0aC5qb2luKG1wdnNfb2JqX3Jvb3QsICdzcmMnKQorCisjIERpc2NvdmVyIHRoZSAnY2xhbmcnIGFuZCAnY2xhbmdjYycgdG8gdXNlLgorCitpbXBvcnQgb3MKKworZGVmIGluZmVyQ2xhbmcoUEFUSCk6CisgICAgIyBEZXRlcm1pbmUgd2hpY2ggY2xhbmcgdG8gdXNlLgorICAgIGNsYW5nID0gb3MuZ2V0ZW52KCdDTEFORycpCisKKyAgICAjIElmIHRoZSB1c2VyIHNldCBjbGFuZyBpbiB0aGUgZW52aXJvbm1lbnQsIGRlZmluaXRlbHkgdXNlIHRoYXQgYW5kIGRvbid0CisgICAgIyB0cnkgdG8gdmFsaWRhdGUuCisgICAgaWYgY2xhbmc6CisgICAgICAgIHJldHVybiBjbGFuZworCisgICAgIyBPdGhlcndpc2UgbG9vayBpbiB0aGUgcGF0aC4KKyAgICBjbGFuZyA9IGxpdC51dGlsLndoaWNoKCdjbGFuZycsIFBBVEgpCisKKyAgICBpZiBub3QgY2xhbmc6CisgICAgICAgIGxpdF9jb25maWcuZmF0YWwoImNvdWxkbid0IGZpbmQgJ2NsYW5nJyBwcm9ncmFtLCB0cnkgc2V0dGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIkNMQU5HIGluIHlvdXIgZW52aXJvbm1lbnQiKQorCisgICAgcmV0dXJuIGNsYW5nCisKK2NvbmZpZy5jbGFuZyA9IGluZmVyQ2xhbmcoY29uZmlnLmVudmlyb25tZW50WydQQVRIJ10pLnJlcGxhY2UoJ1xcJywgJy8nKQorY29uZmlnLnN1YnN0aXR1dGlvbnMuYXBwZW5kKCAoJyVjbGFuZycsICcgJyArIGNvbmZpZy5jbGFuZyArICcgJykgKQorCisjIFByb3BvZ2F0ZSBzb21lIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRlc3QgZW52aXJvbm1lbnQuCitkZWYgYWRkRW52KG5hbWUpOgorICAgIGlmIG5hbWUgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgY29uZmlnLmVudmlyb25tZW50W25hbWVdID0gb3MuZW52aXJvbltuYW1lXQorCithZGRFbnYoJ0hPTUUnKQorYWRkRW52KCdQV0QnKQorCisKK2FkZEVudignQ19JTkNMVURFX1BBVEgnKQorYWRkRW52KCdDUExVU19JTkNMVURFX1BBVEgnKQorYWRkRW52KCdMSUJSQVJZX1BBVEgnKQorYWRkRW52KCdMRF9MSUJSQVJZX1BBVEgnKQorYWRkRW52KCdEWUxEX0xJQlJBUllfUEFUSCcpCisKKyMgQ2hlY2sgdGhhdCB0aGUgb2JqZWN0IHJvb3QgaXMga25vd24uCitpZiBjb25maWcudGVzdF9leGVjX3Jvb3QgaXMgTm9uZToKKyAgICBsaXQuZmF0YWwoJ3Rlc3QgZXhlY3V0aW9uIHJvb3Qgbm90IHNldCEnKQpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL0xMVk0tSVIvbGl0LnNpdGUuY2ZnLmluIGIvZmluYWwvdGVzdHN1aXRlL0xMVk0tSVIvbGl0LnNpdGUuY2ZnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExODY2ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvTExWTS1JUi9saXQuc2l0ZS5jZmcuaW4KQEAgLTAsMCArMSwzMCBAQAorIyMgQXV0b2dlbmVyYXRlZCBieSBMTFZNL0NsYW5nIGNvbmZpZ3VyYXRpb24uCisjY29uZmlnLm1wdnNfc3JjX3Jvb3QgPSAiL2hvbWUvaWNob3lqeC9pbnN0YWxsL29wZW5tcC90ZXN0c3VpdGUvYmluL2MiCitjb25maWcubXB2c19vYmpfcm9vdCA9ICIvdG1wIgorY29uZmlnLmxsdm1fdG9vbHNfZGlyID0gIkBMTFZNX1RPT0xTX0RJUkAiCisKKworIyBOZWVkZWQgdG8gY2hlY2sgaWYgYSBoYWNrIG5lZWRzIHRvIGJlIGFwcGxpZWQKK2NvbmZpZy5sbHZtX3ZlcnNpb25fbWFqb3IgPSAiQExMVk1fVkVSU0lPTl9NQUpPUkAiCisKKyMgQ29tcGlsZXJzCisjIEZJWE1FOiB1c2UgbGx2bWNjIG5vdCBsbHZtZ2NjCitjb25maWcubGx2bWNsYW5nID0gImNsYW5nIgorCisjIEZlYXR1cmVzCitjb25maWcuZW5hYmxlX3VjbGliYyA9IFRydWUgaWYgQEVOQUJMRV9VQ0xJQkNAID09IDEgZWxzZSBGYWxzZQorY29uZmlnLmVuYWJsZV9wb3NpeF9ydW50aW1lID0gVHJ1ZSBpZiBARU5BQkxFX1BPU0lYX1JVTlRJTUVAID09IDEgZWxzZSBGYWxzZQorY29uZmlnLmhhdmVfc2VsaW51eCA9IFRydWUgaWYgQEhBVkVfU0VMSU5VWEAgPT0gMSBlbHNlIEZhbHNlCisKKyMgQ3VycmVudCB0YXJnZXQKK2NvbmZpZy50YXJnZXRfdHJpcGxlID0gIkBUQVJHRVRfVFJJUExFQCIKKworIyBMZXQgdGhlIG1haW4gY29uZmlnIGRvIHRoZSByZWFsIHdvcmsuCit0cnk6CisgIGxpdAorZXhjZXB0IE5hbWVFcnJvcjoKKyAgIyBVc2UgbGl0X2NvbmZpZyBjbGFzcworICBsaXRfY29uZmlnLmxvYWRfY29uZmlnKGNvbmZpZywgIkBNUFZTX1NPVVJDRV9ESVJAL2xpdC5jZmciKQorZWxzZToKKyAgIyBVc2Ugb2xkIGxpdCBjbGFzcworICBsaXQubG9hZF9jb25maWcoY29uZmlnLCAiQE1QVlNfU09VUkNFX0RJUkAvbGl0LmNmZyIpCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvTExWTS1JUi9saXQudG1wIGIvZmluYWwvdGVzdHN1aXRlL0xMVk0tSVIvbGl0LnRtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWQzMGZiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL0xMVk0tSVIvbGl0LnRtcApAQCAtMCwwICsxIEBACisuLi9MTFZNLUlSL2xpbl8zMmUvCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvTWFrZWZpbGUgYi9maW5hbC90ZXN0c3VpdGUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RiYzNkYwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9NYWtlZmlsZQpAQCAtMCwwICsxLDI1NCBAQAorIyBHZW5lcmFsIE1ha2VmaWxlIGNvbnRhaW5pbmcgYWxsIHRoZSBuZWNlc3NhcnkgY29tcGlsZXIgZmxhZ3MgZm9yIHRoZSB0ZXN0cworCisjIG1vZGlmeSBDQyBhbmQgQ0ZMQUdTIGZvciBPcGVuTVAgQyBjb21waWxlcnMKKyMgbW9kaWZ5IEZDIGFuZCBGRkxBR1MgZm9yIE9wZW5NUCBGb3J0cmFuIGNvbXBpbGVycworCisKKyMgQ29udGVudDoKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIDEuIEJhc2ljIHVzYWdlCisjIDIuIEdlbmVyYWwgdGVzdHN1aXRlIHNldHRpbmdzCisjIDMuIENvbXBpbGVyIHNlbGVjdGlvbiBhbmQgRmxhZ3MKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIDEuIEJhc2ljIHVzYWdlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgCW1ha2UgY3Rlc3QJCWdlbmVyYXRlIGMgdGVzdCAiY3Rlc3QiCisjIAltYWtlIGZ0ZXN0CQlnZW5lcmF0ZSBmb3J0cmFuIHRlc3QgImZ0ZXN0IgorIwltYWtlIGNsZWFuCQlyZW1vdmVzIGFsbCBzb3VyY2VzIGFuZCBiaW5hcmllcworIyAJbWFrZSBjbGVhbmFsbAlyZW1vdmVzIHNvdXJjZXMsYmluYXJpZXMgYW5kIGxvZ2ZpbGVzCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIDIuIEdlbmVyYWwgdGVzdHN1aXRlIHNldHRpbmdzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBGb3IgZ2VuZXJhbCB0ZXN0c3VpdGUgc2V0dGluZ3Mgc2VlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUKKyMgb21wdHMuY29uZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgMy4gQ29tcGlsZXIgc2VsZWN0aW9uIGFuZCBGbGFncworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgQ0xBTkcgQ29tcGlsZXIKK0NDICAgICA9IGNsYW5nCitDRkxBR1MgPSAtZm9wZW5tcCAtUyAtZW1pdC1sbHZtCitGQyAgICAgPSBnZm9ydHJhbgorRkZMQUdTID0gLWZvcGVubXAgLWxtCitGRkxBR1MgPSAtZm9wZW5tcCAtbG0gLU8zCisKKyMgR05VIENvbXBpbGVyCisjIENDICAgICA9IGdjYworIyBDRkxBR1MgPSAtZm9wZW5tcCAtbG0gLU8zCisjIEZDICAgICA9IGdmb3J0cmFuIAorIyBGRkxBR1MgPSAtZm9wZW5tcCAtbG0KKyMgRkZMQUdTID0gLWZvcGVubXAgLWxtIC1PMworCisjIEZ1aml0c3UgQ29tcGlsZXJzOgorI0NDID0gZmNjCisjQ0ZMQUdTID0gLUtPTVAsZmFzdF9HUDI9MgorI0ZDPWZydAorI0ZGTEFHUz0tS09NUCxmYXN0X0dQMj0yIC13IC1BbSAtWDkgLUZpeGVkCisKKworIyBQR0kgY29tcGlsZXJzCisjQ0MgPSBwZ2NjCisjQ0ZMQUdTID0gLW1wCisjQ0ZMQUdTID0gLW1wIC1EVkVSQk9TRQorI0NGTEFHUyA9IC1mYXN0IC1tcAorCisjRkMgPSBwZ2Y5MAorI0ZGTEFHUyA9IC1mYXN0IC1tcAorI0ZGTEFHUyA9IC1tcCAtZworCisKKyMgSW50ZWwgY29tcGlsZXJzOgorI0NDID0gaWNjCisjQ0ZMQUdTID0gLU8zIC1pcCAtb3Blbm1wCisjQ0ZMQUdTID0gLVdhbGwgLU8wIC1vcGVubXAKKyNDRkxBR1MgPSAgLW9wZW5tcCAtbG0KKyNDRkxBR1MgPSAgLW9wZW5tcCAtbG0gLURWRVJCT1NFCisKKyNGQyA9IGlmb3J0CisjRkZMQUdTID0gLW9wZW5tcCAtbG0gLWZwcAorCisjIE9tbmkgY29tcGlsZXJzOgorI0NDID0gb21wY2MKKyNDRkxBR1MgPSAtTzMgLWxtCisKKworIyBBc3N1cmUgY29tcGlsZXJzOgorI0NDID0gYXNzdXJlYworI0NGTEFHUyA9IC1PMyAtV0FwbmFtZT1wcm9qZWN0IC1EVVNFX0FTU1VSRT0xCisjRkMgPQorI0ZGTEFHUyA9CisKKyMgTkVDOgorI0NDID0gYysrCisjQ0MgPSBzeGMrKworI0NGTEFHUyA9IC1Qb3Blbm1wCisKKyNGQz1zeGY5MAorI0ZGTEFHUz0gLVBvcGVubXAKKworCisjIEhpdGFjaGk6CisjQ0MgPSB4Y2MKKyNDRkxBR1MgPSAtTzQgLXB2ZWMgK09wIC1wYXJhbGxlbCAtb21wCisjRkMgPQorI0ZGTEFHUyA9CisKKworIyBTR0k6CisjQ0MgPSBjYworI0NGTEFHUyA9IC1tcCAtbG0KKyNGQyA9CisjRkZMQUdTID0KKworCisjIElCTSBjb21waWxlcnM6CisjQ0MgPSB4bGNfcgorI0NGTEFHUyA9IC1xc21wPW9tcCAtbG0KKworCisjRkM9eGxmOTBfcgorI0ZGTEFHUz0tcXNtcD1vbXAgLXFmaXhlZD0xMzIgLXFsYW5nbHZsPWV4dGVuZGVkCisKKworIyBTVU4gY29tcGlsZXJzCisjQ0MgPSBjYworI0NGTEFHUyA9IC1mYXN0IC14b3Blbm1wIC1sbQorCisjRkMgPWY5MAorI0ZGTEFHUyA9IC14b3Blbm1wIC1mYXN0IC1sbQorCisKKyMgb3BlbjY0IGNvbXBpbGVycworIyByZW1hcms6IC1JLiB3YXMgYSB3b3JrYXJvdW5kIGJlY2F1c2UgdGhlIGluc3RhbGxhdGlvbiBjYW1lIHdpdGhvdXQgb21wLmggZmlsZQorI0NDID0gb3BlbmNjCisjQ0ZMQUdTID0gLU8wIC1vcGVubXAgLWxtIC1JLiAtbG9tcCAtbHB0aHJlYWQKKyNDRkxBR1MgPSAtTzAgLW9wZW5tcCAtbG0gLUkgL2hvbWUvbWF0dGhldy9vcHQvdXNyL2luY2x1ZGUgLWxwdGhyZWFkCisjQ0ZMQUdTID0gLW9wZW5tcCAtbG0KKworI0ZDID0gb3BlbmY5MAorI0ZGTEFHUyA9IC1PMCAtb3Blbm1wIC1sbSAgLWxvbXAgLWxwdGhyZWFkCisKKworI1BhdGhzY2FsZSBDb21waWxlcgorI0NDID0gcGF0aGNjCisjQ0ZMQUdTID0gLW1wIC1PZmFzdCAtbG0KKworI0ZDPXBhdGhmOTAKKyNGRkxBR1M9IC1tcCAtT2Zhc3QgLWxtCisKKworI09wZW5VSCBDb21waWxlcgorI0NDID0gdWhjYworI0NGTEFHUyA9IC1tcAorCisjRkMgPSB1aGY5MAorI0ZGTEFHUyA9IC1tcAorCisjIENoZWNrIHBhdGgKK0ZJTEU9TExWTS1JUi9saXQudG1wCitDSEVDS19QQVRIPWBjYXQgJChGSUxFKWAKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitoZWxwOgorCUBlY2hvICJPcGVuTVAgVmFsaWRhdGlvbiBTdWl0ZSwgdjMuMCIKKwlAZWNobyAiKEMpIFVuaXZlcnNpdHkgb2YgU3R1dHRnYXJ0LCBVbml2ZXJzaXR5IG9mIEhvdXN0b24iCisJQGVjaG8gIiIKKwlAZWNobyAiRG8gbWFrZSBbcnVsZV0sIHdoZXJlIHJ1bGUgbWF5IGJlIG9uZSBvZjoiCisJQGVjaG8gIiAgY3Rlc3QiCisJQGVjaG8gIiAgICBCdWlsZCBhbmQgcnVuIHRoZSBPcGVuTVAvQyB2YWxpZGF0aW9uIHRlc3RzLiIKKwlAZWNobyAiICBmdGVzdCIKKwlAZWNobyAiICAgIEJ1aWxkIGFuZCBydW4gdGhlIE9wZW5NUC9Gb3J0cmFuIHZhbGlkYXRpb24gdGVzdHMuIgorCUBlY2hvICIgIHByaW50X2NvbXBpbGVfb3B0aW9ucyIKKwlAZWNobyAiICAgIERpc3BsYXkgdGhlIGRlZmF1bHQgY29tcGlsZXIgYW5kIGNvbXBpbGVyIG9wdGlvbnMgYmVpbmcgdGVzdGVkIgorCUBlY2hvICIgIGNsZWFuc3JjcyIKKwlAZWNobyAiICAgIFJlbW92ZSBzb3VyY2VzIGdlbmVyYXRlZCBmcm9tIHRoZSB0ZW1wbGF0ZXMiCisJQGVjaG8gIiAgY2xlYW5iaW5zIgorCUBlY2hvICIgICAgUmVtb3ZlIGV4ZWN1dGFibGVzIGZyb20gYmluLyBkaXJlY3RvcnkiCisJQGVjaG8gIiAgY2xlYW5vdXRzIgorCUBlY2hvICIgICAgUmVtb3ZlIGFsbCAqLm91dCBmaWxlcyBmcm9tIGJpbi8gZGlyZWN0b3J5IgorCUBlY2hvICIgIGNsZWFubG9ncyIKKwlAZWNobyAiICAgIFJlbW92ZSBhbGwgKi5sb2cgZmlsZXMgZnJvbSBiaW4vIGRpcmVjdG9yeSIKKwlAZWNobyAiICBjbGVhbiIKKwlAZWNobyAiICAgIENsZWFuIG91dCBhbmQgbG9nIGZpbGVzIgorCUBlY2hvICIgIGRpc3RjbGVhbiIKKwlAZWNobyAiICAgIENsZWFuIGFyY2ggdGVzdCBkaXJlY3Rvcnkgd2l0aCBjbGVhbiIKKwlAZWNobyAiICB2ZXJ5Y2xlYW4iCisJQGVjaG8gIiAgICBSZW1vdmUgdGhlIGVudGlyZSBiaW4vYyBkaXJlY3Rvcnkgd2l0aCBkaXN0Y2xlYW4iCisKK29tcF9teV9zbGVlcDoKKwlta2RpciAtcCBiaW4vYworCWNwIG9tcF9teV9zbGVlcC5oIGJpbi9jLworb21wX3Rlc3RzdWl0ZTogb21wX3Rlc3RzdWl0ZS5oCisJbWtkaXIgLXAgYmluL2MKKwljcCBvbXBfdGVzdHN1aXRlLmggYmluL2MvCitvbXBfdGVzdHN1aXRlLmg6IG9tcHRzLWMuY29uZiBjLyoKKwkuL29tcHRzX21ha2VIZWFkZXIucGwgLWY9b21wdHMtYy5jb25mIC10PWMKKy5jLm86IG9tcF90ZXN0c3VpdGUgb21wX215X3NsZWVwCisJJChDQykgJChDRkxBR1MpIC1jICQ8CisKK2N0ZXN0OiBvbXBfbXlfc2xlZXAgb21wX3Rlc3RzdWl0ZQorCS4vcnVudGVzdC5wbCAtLWxhbmc9YyB0ZXN0bGlzdC1jLnR4dAorCWNkIGJpbi87IG1ha2UgLWoKKworZnRlc3Q6CisJbWtkaXIgLXAgYmluL2ZvcnRyYW4KKwljcCBvbXBfdGVzdHN1aXRlLmYgYmluL2ZvcnRyYW4KKwljcCBvbXBfbXlfc2xlZXAuZiBiaW4vZm9ydHJhbgorCS4vcnVudGVzdC5wbCAtLWxhbmc9Zm9ydHJhbiB0ZXN0bGlzdC1mLnR4dAorCitwcmludF9jb21waWxlX29wdGlvbnM6CisJQGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0iCisJQGVjaG8gIkMgY29tcGlsZXIiCisJQGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0iCisJQGVjaG8gImNvbXBpbGF0aW9uOiAkKENDKSAkKENGTEFHUykiCisJQCQoQ0MpIC0tdmVyc2lvbgorCUBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tIgorCUBlY2hvICJGb3J0cmFuIGNvbXBpbGVyIgorCUBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tIgorCUBlY2hvICJjb21waWxhdGlvbjogJChGQykgJChGRkxBR1MpIgorCUAkKEZDKSAtLXZlcnNpb24KKworCisKK3BhdGhfdG9fYXJjaD0kKHNoZWxsIC4uL3J1bnRpbWUvdG9vbHMvY2hlY2stb3Blbm1wLXRlc3QucGwpCisKK2NsZWFuc3JjczoKKwlmaW5kIGJpbi8gLWluYW1lICIqLltjZl0iIC1leGVjIHJtIC1yZiB7fSBcOworY2xlYW5iaW5zOgorCWZpbmQgYmluL2MgLXBlcm0gL2EreCAtdHlwZSBmIC1leGVjIHJtIC1yZiB7fSBcOworCWZpbmQgLi9iaW4vYyAtbm90IC1uYW1lICIqLmMiIC1hIC1ub3QgLW5hbWUgIioubGwiIC10eXBlIGYgLWV4ZWMgcm0gLXJmIHt9IFw7CitjbGVhbm91dHM6CisJZmluZCBiaW4vIC1pbmFtZSAiKi5vdXQiIC1leGVjIHJtIC1yZiB7fSBcOworY2xlYW5sb2dzOgorCWZpbmQgYmluLyAtaW5hbWUgIioubG9nIiAtZXhlYyBybSAtcmYge30gXDsKKwlybSAtcmYgLi8kKHBhdGhfdG9fYXJjaCkKKworY2xlYW46IGNsZWFub3V0cyBjbGVhbmxvZ3MgY2xlYW5iaW5zIGNsZWFuc3JjcworCitkaXN0Y2xlYW46IGNsZWFuCisJcm0gLXJmIGJpbi9jLyoKKwlybSAtcmYgTExWTS1JUi8kKENIRUNLX1BBVEgpCisKK3ZlcnljbGVhbjogZGlzdGNsZWFuCisJcm0gLXJmIGJpbi9jLworCXJtIC1yZiBiaW4vZm9ydHJhbi8KKworCitjbGVhbmFsbDogCisJcm0gLXJmIC4vYmluL2MvCisJcm0gLXJmIC4vYmluL2ZvcnRyYW4vCisJcm0gLXJmIC4vTExWTS1JUi8kKHBhdGhfdG9fYXJjaCkKKwlybSAtcmYgLi8kKHBhdGhfdG9fYXJjaCkKKwlybSAtcmYgLi8qLmxvZworCisKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9SRUFETUVfTExWTV9PUEVOTVAgYi9maW5hbC90ZXN0c3VpdGUvUkVBRE1FX0xMVk1fT1BFTk1QCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwOGNhZGEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvUkVBRE1FX0xMVk1fT1BFTk1QCkBAIC0wLDAgKzEsNDYgQEAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit8ICAgICAgICAgICAgICBUbyB1c2UgdGhlIE9wZW5NUCBWYWxpZGF0aW9uIFN1aXRlIGZvciB0ZXN0aW5nICAgICAgICAgICAgICAgIHwgCit8IAkJCUxMVk0gT3Blbk1QIEltcGxlbWVudGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAgICAgICAJICAgSGlnaCBQZXJmb3JtYW5jZSBDb21wdXRpbmcgYW5kIFRvb2xzLCAgICAgICAgICAgICAgICAgICAgIHwgCit8CQkJVW5pdmVyc2l0eSBvZiBIb3VzdG9uICAgICAgICAgIAkJCSAgICAgfAorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmFuLiAyMDE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUd28gbmV3IGZpbGVzIGhhdmUgYmVlbiBhZGRlZCB0byBvcGVubXAvcnVudGltZTogY2hlY2stb3Blbm1wLnBsIGFuZCBjaGVjay1vcGVubXAtdGVzdC5wbCAKK0dvIHRvIC9vcGVubXAvcnVudGltZSwgcnVuOgorbWFrZSB0ZXN0IGNvbXBpbGVyPWNsYW5nCittYWtlIHRlc3QtY2xlYW4gIAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0ZvciB0aGUgT3Blbk1QLUxMVk0gUHJvamVjdCwgZm9sbG93aW5nIGFyZSB0aGUgRmlsZXMgYW5kIERpcmVjdG9yaWVzIHRvIGtub3cgYWJvdXQ6IAorCisKKyAgYyAgICAgICAgICAgICAgICAgICAgICAgICAJIERpcmVjdG9yeSBjb250YWluaW5nIHRoZSB0ZW1wbGF0ZXMgZm9yIHRoZSBjIHRlc3RzCisgIGZvcnRyYW4gICAgICAgICAgICAgICAgICAgCSBEaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdGVtcGxhdGVzIGZvciB0aGUgRm9ydHJhbgorICBNYWtlZmlsZSAgICAgICAgICAgICAgICAgIAkgTWFrZWZpbGUgY29udGFpbmluZyBvcHRpb25zIGZvciBjb21waWxhdGlvbgorICBSRUFETUVfTExWTV9PUEVOTVAgICAgICAgICAgICAgUkVBRE1FIGZpbGUgZm9yIHRvIHVzZSB0aGUgT3Blbk1QIHRlc3Qtc3VpdGUgCisgIFJFQURNRV9PcGVuTVBfVmFsaWRhdGlvbl9TdWl0ZSBSRUFETUUgZmlsZSBvbiB0aGUgVmFsaWRhdGlvbiBTdWl0ZSwgdGVtcGxhdGVzLCBldGMuLCAKKwkJCQkgYXMgYSBiYXNpcyBmb3IgdGVzdGluZyB0aGUgTExWTSBPcGVuTVAgaW1wbGVtZW50YXRpb24uIAorICBMTFZNX0lSCQkJIERpcmVjdG9yeSBjb250YWluaW5nIHRhcmdldC1zcGVjaWZpYyBJUiBmaWxlcworICBiaW4vbGl0IGZpbGVzCQkgICAgICAgICBJbiB0aGUgbGl0IG1vZGVsLCBldmVyeSB0ZXN0IG11c3QgZXhpc3QgaW5zaWRlIHNvbWUgdGVzdCBzdWl0ZS4gCisJCQkJIGxpdCByZXNvbHZlcyB0aGUgaW5wdXRzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIHRvIAorCQkJCSB0ZXN0IHN1aXRlcyBieSBzZWFyY2hpbmcgdXB3YXJkcyBmcm9tIHRoZSBpbnB1dCBwYXRoIAorCQkJCSB1bnRpbCBpdCBmaW5kcyBhIGxpdC5jZmcgb3IgbGl0LnNpdGUuY2ZnIGZpbGUuIAorCQkJCSBUaGVzZSBmaWxlcyBzZXJ2ZSBhcyBib3RoIGEgbWFya2VyIG9mIHRlc3Qgc3VpdGVzIGFuZCAKKwkJCQkgYXMgY29uZmlndXJhdGlvbiBmaWxlcyB3aGljaCBsaXQgbG9hZHMgaW4gb3JkZXIgdG8gCisJCQkJIHVuZGVyc3RhbmQgaG93IHRvIGZpbmQgYW5kIHJ1biB0aGUgdGVzdHMgaW5zaWRlIHRoZSB0ZXN0IHN1aXRlLgkKKyAgYmluL2hlYWRlcgkJCSBIZWFkZXIgZm9yIHRoZSB0ZXN0cywgY2FsbHMgY2xhbmcgZHJpdmVyIGZvciB0aGUgdGVzdCwgCisJCQkJIGFuZCBleGVjdXRlcyB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUJCQkKKyAgYmluL01ha2VmaWxlIAkJCSBUbyBnZW5lcmF0ZSBMTFZNX0lSIGZpbGVzIAorICBiaW4vZGlzdHJpYnV0ZS5zaCAJCSBHZW5lcmF0ZXMgTExWTV9JUiBmaWxlcywgZmluZHMgdGhlIGFyY2hpdGVjdHVyZSBhbmQgT1MsIG1vdmVzIAorCQkJCSB0aGUgZ2VuZXJhdGVkIElSIGZpbGVzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGZvbGRlciAKKyAgcnVudGltZS90b29scy9jaGVjay1vcGVubXAucGwgIFJldHJpZXZpbmcgdGhlIHJpZ2h0IHBhdGggCisgIHJ1bnRpbWUvdG9vbHMvCisgIGNoZWNrLW9wZW5tcC10ZXN0LnBsCQkgUmV0dXJucyB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBPUywgZS5nLiBsaW5fMzJlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ29udGFjdCBhbmQgU3VwcG9ydAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NvbnRhY3Q6IGh0dHA6Ly93d3cuY3MudWguZWR1L35ocGN0b29scy8KK0VtYWlsOiBzdW5pdGFAY3MudWguZWR1CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvUkVBRE1FX09wZW5NUF9WYWxpZGF0aW9uX1N1aXRlIGIvZmluYWwvdGVzdHN1aXRlL1JFQURNRV9PcGVuTVBfVmFsaWRhdGlvbl9TdWl0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2E3YzYxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL1JFQURNRV9PcGVuTVBfVmFsaWRhdGlvbl9TdWl0ZQpAQCAtMCwwICsxLDMzNCBAQAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3wgICAgICAgICAgICAgICAgICAgT3Blbk1QIFZhbGlkYXRpb24gU3VpdGUgIFYgMy4wICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAgICAgICAgICAgICAgSGlnaCBQZXJmb3JtYW5jZSBDb21wdXRpbmcgQ2VudGVyLCBTdHV0dGdhcnQgICAgICAgICAgICAgICAgICB8Cit8ICAgICAgIEhpZ2ggUGVyZm9ybWFuY2UgQ29tcHV0aW5nIGFuZCBUb29scywgVW5pdmVyc2l0eSBvZiBIb3VzdG9uICAgICAgICAgIHwKK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYW4uIDIwMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCitUQUJMRSBPRiBDT05URU5UUworCitJICAgIAlJTlRST0RVQ1RJT04KK0kuMS4JICBBaW1zIGFuZCBnZW5lcmFsIGZ1bmN0aW9uCitJLjIuIAkgIEZpbGVzIGFuZCBkaXJlY3RvcmllcworCitJSQkJVVNBR0UKK0lJLjEuCSAgRmlyc3QgcnVuIHdpdGggbWFrZQorSUkuMgkgIFdoZXJlIHRvIHNlYXJjaCBmb3IgcmVzdWx0cworSUkuMy4JICBVc2luZyB0aGUgcnVudGVzdCBzY3JpcHQKKworSUlJCQlBZGRpbmcgYW5kIG1vZGlmeWluZyB0ZXN0cworSUlJLjEuCSAgVGhlIHRlbXBsYXRlIHN0cnVjdHVyZQorCitJVgkJS25vd24gSXNzdWVzIGFuZCBXb3JrYXJvdW5kCisKK1YgICAgICAgQ29udGFjdCBhbmQgU3VwcG9ydAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSS4gIElOVFJPRFVDVElPTgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0kuMS4gIEFpbXMgYW5kIGdlbmVyYWwgZnVuY3Rpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBPcGVuTVAgdmFsaWRhdGlvbiBzdWl0ZSBpcyBkZXNpZ25lZCB0byB2ZXJpZnkgdGhlIGNvcnJlY3QgaW1wbGVtZW50YXRpb24KK29mIE9wZW5NUCBpbiBjb21waWxlcnMuIEl0IGlzIGNhcGFibGUgb2YgY2hlY2tpbmcgRm9ydHJhbiBhcyB3ZWxsIGFzIGMKK2NvbXBpbGVyLgorCitUZXN0aW5nIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBzdGF0aXN0aWNzLiBFYWNoIGRpcmVjdGl2ZSBpcyB0ZXN0ZWQKK2J5IGNvbXB1dGluZyBhbmQgdmVyaWZ5aW5nIHRoZSByZXN1bHQgd2l0aCB0aGUgYWxyZWFkeSBrbm93biB2YWx1ZS4gSW4gbW9zdAorY2FzZXMgYSB3cm9uZyBpbXBsZW1lbnRhdGlvbiBjYW4gcmVzdWx0IGluIHRoZSByaWdodCB2YWx1ZXMuIFNvIHRoZSB0ZXN0cyBhcmUKK3J1biBzZXZlcmFsIHRpbWVzLgorCitBZGRpdGlvbmFsbHksIHRoZSB2YWxpZGF0aW9uIHN1aXRlIGNyZWF0ZXMgc28gY2FsbGVkIGNyb3NzdGVzdHMgZm9yIGVhY2gKK2RpcmVjdGl2ZS4gVGhlc2UgYXJlIHRlc3RzIGluIHdoaWNoIGVpdGhlciB0aGUgZGlyZWN0aXZlIGlzIG1pc3Npbmcgb3IgdXNlZAord2l0aCBkaWZmZXJlbnQgYXJndW1lbnRzLiBJZiB0aGlzIHNvIGNhbGxlZCBjcm9zc3Rlc3QgZmFpbHMsIHRoaXMgaW5kaWNhdGVzCitzdHJvbmdseSB0aGF0IHRoZSBwcmV2aW91cyB0ZXN0IGlzIGNhcGFibGUgb2YgdGVzdGluZyB0aGUgZGlyZWN0aXZlLgorCitMYXN0bHksIGFuIG9ycGhhbmVkIHRlc3QgaXMgYWxzbyBydW4gdG8gZGV0ZXJtaW5lIGlmIHRoZSBkaXJlY3RpdmUgYmVpbmcKK3Rlc3RlZCBpcyBhYmxlIHRvIGNvcnJlY3RseSBydW4gd2hlbiAnb3JwaGFuZWQnIGZyb20gdGhlIG1haW4gZnVuY3Rpb24uCitFc3NlbnRpYWxseSwgdGhlIGRpcmVjdGl2ZSdzIGNvZGUgaXMgcGxhY2VkIGludG8gaXRzIG93biBmdW5jdGlvbiB3aGljaCBpcworY2FsbGVkIGR1cmluZyBleGVjdXRpb24gb2YgdGhlIG1haW4gZnVuY3Rpb24gYW5kIG9mdGVuIGluc2lkZSBhIHBhcmFsbGVsCityZWdpb24uCisKKworSS4yLiAgRmlsZXMgYW5kIGRpcmVjdG9yaWVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworZCBjICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSB0ZW1wbGF0ZXMgZm9yIHRoZSBjIHRlc3RzCitkIGZvcnRyYW4gICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHRlbXBsYXRlcyBmb3IgdGhlIEZvcnRyYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0cworICBNYWtlZmlsZSAgICAgICAgICAgICAgICAgIE1ha2VmaWxlIGNvbnRhaW5pbmcgb3B0aW9ucyBmb3IgY29tcGlsYXRpb24KKyAgY29tbW9uX3V0aWxpdHkuZgorICBvbXBfbXlfc2xlZXAuaCAgICAgICAgICAgIHRocmVhZCBzYXZlIHNsZWVwIGZ1bmN0aW9uCisgIG9tcF90ZXN0c3VpdGUuZiAgICAgICAgICAgRm9ydHJhbiBoZWFkZXIgZmlsZQorICBvbXBfdGVzdHN1aXRlLmggICAgICAgICAgIGF1dG9nZW5lcmF0ZWQgYy1oZWFkZXIgZmlsZQorICBvbXB0cy1jLmNvbmYgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIGMgdGVzdHMgYWJvdXQgaG93IG9mdGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRlc3RzIHNoYWxsIGJlIGV4ZWN1dGVkIG9yIGhvdyBsYXJnZSB0aGUgbG9vcCBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMKKyAgb21wdHNfbWFrZUhlYWRlci5wbAkgICAgcGVybCBtb2R1bGUgZm9yIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGlvbiBvZiBhbiB1cAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGRhdGUgaGVhZGVyIGZpbGUKKyAgb21wdHNfcGFyc2VyRnVuY3Rpb25zLnBtCXBlcmwgbW9kdWxlIGNvbnRhaW5pbmcgZ2VuZXJhbCBmdW5jdGlvbnMgZm9yCisJCQkJICAgICAgICAgICAgdGhlIHBhcnNlci5wbCBzY3JpcHQKKyAgb21wdHNfcGFyc2VyLnBsCSAgICAgICAgc2NyaXB0IGZvciBnZW5lcmF0aW5nIHRoZSBzb3VyY2UgY29kZSBvdXQgb2YgdGhlIHRlbXBsYXRlcworICBvbXB0c19zdGFuZGFsb25lUHJvYy5jCWZyYW1ld29yayBmb3IgdGhlIGMgdGVzdHMKKyAgb21wdHNfc3RhbmRhbG9uZVByb2MuZglmcmFtZXdvcmsgZm9yIHRoZSBGb3J0cmFuIHRlc3RzCisgIFJFQURNRQkJICAgICAgICAgICAgdGhlIFJFQURNRSBmaWxlIHlvdSd2ZSBhbHJlYWR5IGZvdW5kIDstKQorICBMSUNFTlNFICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIGxpY2Vuc2UgaW5mb3JtYXRpb24KKyAgcnVudGVzdC5wbAkJICAgICAgICB0aGUgZnJhbWUgcHJvZ3JhbSBvZiB0aGUgdGVzdCBzdWl0ZQorICB0ZXN0bGlzdC1mLnR4dAkgICAgICAgIHRlc3QgbGlzdCBjb250YWluaW5nIHRoZSBhdmFpbGFibGUgdGVzdHMgZm9yIEZvcnRyYW4KKyAgdGVzdGxpc3QtYy50eHQJICAgICAgICB0ZXN0IGxpc3QgY29udGFpbmluZyB0aGUgYXZhaWxhYmxlIHRlc3RzIGZvciBjCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lJLiAgVVNBR0UKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKK0lJLjEuIEZpcnN0IHJ1biB3aXRoIG1ha2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworWW91IGNhbiBkbyBhIGZpcnN0IHNpbXBsZSBydW4gb2YgdGhlIHRlc3RzdWl0ZSBvbmx5IGFmdGVyIG9uZSBzdGVwIG9mCitjb25maWd1cmF0aW9uOgorCisxKSBNb2RpZnkgdGhlIG9tcHRzLmNvbmYgYW5kIG9tcHRzLWMuY29uZiBmaWxlLCBjaGFuZ2UgdGhlIG51bWJlciBvZiB0aHJlYWRzCithbmQgbnVtYmVyIG9mIHJlcGV0aXRpb25zIG9mIGVhY2ggdGVzdC4KKworMikgTW9kaWZ5IHRoZSBNYWtlZmlsZSwgdW5jb21tZW50aW5nIHRoZSBDQy9GQyBhbmQgQ0ZMQUdTL0ZGTEFHUyB2YXJpYWJsZXMgZm9yCit0aGUgY29tcGlsZXIgb2YgeW91ciBjaG9pY2UuCisKK0FuZCBub3cgeW91IGNhbiBydW4gdGhlIHRlc3RzdWl0ZSBlaXRoZXIgZm9yIGEgQyBjb21waWxlciB3aXRoOgorCis+CW1ha2UgY3Rlc3QKKworb3IgZm9yIGEgRm9ydHJhbiBjb21waWxlciB3aXRoOgorCis+CW1ha2UgZnRlc3QKKworCitJSS4yLiBSdW5uaW5nIGN1c3RvbSB0ZXN0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitJbiBvcmRlciB0byBydW4gc2luZ2xlIHRlc3RzIG9yIGN1c3RvbSBncm91cHMgb2YgdGVzdHMsIHR3byBtYWtlIGNvbW1tYW5kcworYXJlIGRlZmluZWQ6IG1ha2Ugc3Rlc3QgYW5kIG1ha2UgZnN0ZXN0LiBUaGVzZSB0d28gY29tbWFuZCByZWZlcmVuY2UgdGhlIGZpbGUKK2N1c3RvbXRlc3QudHh0IHdoZW4gbG9va2luZyBmb3IgYSB0ZXN0bGlzdCB0byB1c2UuIFNpbXBseSBlZGl0IGN1c3RvbXRlc3QudHh0Cit0byBpbmNsdWRlIHRoZSBkZXNpcmVkIHRlc3Qgb3IgdGVzdHMuIElmIGN1c3RvbXRlc3QudHh0IGNvbnRhaW5zIGMgdGVzdHMsCisKKz4gICAgICBtYWtlIHN0ZXN0CisKK29yIGZvciBmb3J0cmFuIHRlc3RzCisKKz4gICAgICBtYWtlIGZzdGVzdAorCitJbiBvcmRlciB0byBjaGFuZ2UgdGhlIG51bWJlciBvZiB0aHJlYWRzIHVzZWQgaW4gdGhlIHRlc3RzLCBzaW1wbHkgZWRpdCB0aGUKK01ha2VmaWxlIHZhcmlhYmxlcyBNSU5USFJFQURTIGFuZCBNQVhUSFJFQURTLiBCeSBkZWZhdWx0LCB0aGV5IGFyZSBjb25maWd1cmVkCit0byB1c2UgMiB0aHJlYWRzLiBUbyBjaGFuZ2UgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIHRlc3QgaXMgcnVuLCBmb3IgYyB0ZXN0cworZWRpdCB0aGUgUkVQRVRJVElPTlMgdmFyaWFibGUgaW4gdGhlIGZpbGUgb21wdHMtYy5jb25mLiBUaGUgTE9PUENPVU5UIGFuZAorU0xFRVBUSU1FIHZhcmlhYmxlcyBjYW4gYWxzbyBiZSBjaGFuZ2VkIGhlcmUuIEZvciBmb3J0cmFuIHRlc3RzLCBlZGl0IHRoZSBmaWxlCitvbXBfdGVzdHN1aXRlLmYgdG8gY2hhbmdlIGJvdGggdGhlIExPT1BDT1VOVCBhbmQgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIHRlc3QKK2lzIHJ1bi4KKworCisKK0lJLjMuIFVuZGVyc3RhbmRpbmcgdGhlIHJlc3VsdHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK1doZW4gcnVubmluZyB0aGUgdGVzdHN1aXRlIHRoZSByZXN1bHRzIHdpbGwgYmUgc2hvd24gb24gdGhlIHNjcmVlbi4KKworSWYgeW91IG5lZWQgdGhlIHJlc3VsdHMgZm9yIGZ1cnRoZXIgcHVycG9zZSB5b3UgY2FuIHVzZSB0aGUgcmVzdWx0cy50eHQsIHdoaWNoCitpcyBhIHNpbXBsZSBsaXN0IGNvbnRhaW5pbmcgdGhlIHJlc3VsdHMgZm9yIGVhY2ggZGlyZWN0aXZlCitpbiBhIHNpbmdsZSBsaW5lLiBFYWNoIGxpbmUgc3RhcnRzIHdpdGggdGhlIG5hbWUgb2YgdGhlIGRpcmVjdGl2ZS4gVGhlbiBmb2xsb3dzCit0aGUgcmVzdWx0IG9mIHRoZSB0ZXN0IGdpdmVuIGluIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBwYXNzZWQgdGVzdHMuIElmIDEwMCUgb2YKK3RoZSB0ZXN0cyBwYXNzZWQgc3VjY2Vzc2Z1bGx5LCB0aGUgc2Vjb25kIG51bWJlciBnaXZlcyB0aGUgcmVzdWx0IG9mIHRoZQorY29ycmVzcG9uZGluZyBjcm9zc3Rlc3QuIENyb3NzdGVzdHMgd2lsbCBvbmx5IGJlIHJ1biBpZiB0aGUgbm9ybWFsIHRlc3QgcGFzc2VzCit3aXRoIDEwMCUgYWNjdXJhY3kuIElmIGEgY3Jvc3N0ZXN0IHdhcyBub3QgcnVuIG9yIGEgdGVzdCBkb2VzIG5vdCBleGlzdCwgaXQgaXMKK2Rlbm90YXRlZCBieSBhICItIi4KK0FmdGVyIHRoZSByZXN1bHRzIG9mIHRoZSBub3JtYWwgdGVzdHMsIHRoZXJlIGZvbGxvdyBhIHNlcmllcyBvZiB0ZXN0cyBpbiB0aGUKK29ycGhhbmVkIG1vZGUuIElmIHRoZXJlIHdlcmUgbm8gb3JwaGFuZWQgdGVzdHMgYXZhaWxhYmxlIHRoaXMgaXMgc2hvd24gYnkgYSAiLSIuCisKK0lmIHlvdSBydW4gdGhlIHRlc3RzdWl0ZSB3aXRoIGRpZmZlcmVudCBudW1iZXJzIG9mIHRocmVhZHMgKGUuZy4gdXNpbmcgdGhlCitydW50ZXN0LnBsIHNjcmlwdCkgdGhlIHJlc3VsdHMgYXJlIHNob3duIGluIGJsb2NrcyBvZiA0IGNvbHVtbnMgZm9yIGVhY2ggbnVtYmVyCitvZiB0aHJlYWRzLgorCitJZiBhIHRlc3QgZmFpbHMgeW91IGNhbiBmaW5kIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gaW4gdGhlIG9tcHRzLmxvZywKK2Jpbi9jLyoub3V0IGFuZCAqLmxvZyBmaWxlcy4gV2hpbGUgdGhlIG9tcHRzLmxvZyBmaWxlIGNvbnRhaW5zIGFsbCBjb21waWxlcgorZXJyb3IgbWVzc2FnZXMgZm9yIGFsbCB0ZXN0cywgdGhlICoub3V0IGFuZCAqLmxvZyBmaWxlcyBjb250YWluIGRldGFpbGVkIGluZm9yYW10aW9uCitvbiB0aGUgZXhlY3V0aW9uIHByb2Nlc3Mgb2YgdGhlIHNpbmdsZSB0ZXN0cy4KK0luIHRoZSAqLm91dCBmaWxlcyB0aGVyZSBhcmUgbGlzdGVkIGFsbCB0aGUgcmVzdWx0cyBvZiB0aGUgc2luZ2xlIGV4ZWN1dGlvbnMgb2YKK3RoZSB0ZXN0cy4gSW4gdGhlICoubG9nIGZpbGVzIHRoZXJlIGFyZSBlcnJvciBtZXNzYWdlcyBvZiB0aGUgdGVzdHMgaXRzZWxmLgorCisKK0lJLjQuIENsZWFuaW5nIFVwCistLS0tLS0tLS0tLS0tLS0tLQorCisKK0JlY2F1c2UgbWFueSBmaWxlcyBhcmUgZ2VuZXJhdGVkIGZvciBlYWNoIHRlc3RlZCBkaXJlY3RpdmUsIGl0IGlzIG9mdGVuIG5lY2Vzc2FyeQordG8gY2xlYW4gdGhlIG1haW4gZGlyZWN0b3J5IGFmdGVyIGEgYmF0dGVyeSBvZiB0ZXN0cy4gVG8gY2xlYW4gYWxsIGdlbmVyYXRlZCBmaWxlcworaW4gdGhlIG1haW4gZGlyZWN0b3J5IGluY2x1ZGluZyB0aGUgcmVzdWx0cyBhbmQgbG9nIGZpbGVzLAorCis+ICAgICBtYWtlIGNsZWFuCisKKworVG8gY2xlYW4gb25seSB0aGUgbG9ncyBhbmQgb3V0IGZpbGVzLAorCis+ICAgICBtYWtlIGNsZWFubG9ncworCitUbyBjbGVhbiBvbmx5IHRoZSByZXN1bHRzLAorCis+ICAgICBtYWtlIGNsZWFucmVzdWx0cworCisKKworSUkuNC4gVXNpbmcgdGhlIHJ1bnRlc3Qgc2NyaXB0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworU28gZm9yIHNwZWNpYWwgcHVycG9zZSB5b3UgY2FuIHVzZSB0aGUgcnVudGVzdC5wbCBzY3JpcHQsIHdoaWNoIGFsbG93cyBhIGxvdAorbW9yZSBvcHRpb25zIGZvciB0aGUgZXhlY3V0aW9uIHByb2Nlc3MgdGhhbiB0aGUgZXhlY3V0aW9uIHdpdGggbWFrZS4KKworVXNpbmcgdGhlIHJ1bnRlc3QucGwgc2NyaXB0IGlzIHJhdGhlciBlYXN5LiBZb3UgY2FuIHVzZSB0aGUgdGhlIHRlc3Qgc3VpdGUgb25seQorYWZ0ZXIgdHdvIHN0ZXBzIG9mIG1vZGlmaWNhdGlvbnM6CisKKzEuKSBNb2RpZnkgdGhlIE1ha2VmaWxlIHRvIHlvdXIgd2lzaGVzIGNob29zaW5nIHlvdXIgY29tcGlsZXIgYW5kIHRoZSBuZWNlc3NhcnkKKyAgICBjb21waWxlciBmbGFncy4KKzIuKSBJZiBuZWNlc3NhcnkgZWRpdCBvbmUgb2YgdGhlIHRlc3QgbGlzdHMgKHRlc3RsaXN0LWMudHh0KSBhbmQgY29tbWVudCBvdXQgdGhlCisgICAgdGVzdHMgeW91IGRvIG5vdCB3YW50IHRvIHJ1biB1c2luZyAjIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiBUZXN0bGlzdHMgZm9yIEZvcnRyYW4gZW5kCisgICAgd2l0aCAtZi50eHQgd2hpbGUgdGVzdCBsaXN0cyBmb3IgYyB3aXRoIC1jLnR4dC4KKworQW5kIG5vdyB5b3UgY2FuIHJ1biB0aGUgdGVzdCBzdWl0ZSBlaXRoZXIgZm9yIEZvcnRyYW4gdXNpbmcKKwkjCT4gIC4vcnVudGVzdC5wbCAtbGFuZz1mb3J0cmFuIC1kPWZvcnRyYW4gdGVzdGxpc3QtZi50eHQKK29yIGZvciBjCisJIwk+ICAuL3J1bnRlc3QucGwgLWxhbmc9YyAtZD1jIHRlc3RsaXN0LWMudHh0CisKK1dpdGggdGhlIC0taGVscCBvcHRpb24geW91IGNhbiBzaG93IHRoZSBjb21wbGV0ZSBsaXN0IG9mIG9wdGlvbnMgYW5kIHRoZWlyCitleHBsYW5hdGlvbnMuCisKK1RoZSB0ZXN0IHJlc3VsdHMgYXJlIHN1bW1hcml6ZWQgaW4gY3Jlc3VsdHMgb3IgZnJlc3VsdHMudHh0IHdoaWxlICoubG9nIGtlZXAKK2RldGFpbHMgZm9yIGluZGl2aWR1YWwgdGVzdHMuIFRoZXJlIGlzIGFsc28gYSBmaWxlIChvbXB0cy5sb2cpIGtlZXBpbmcKK2NvbXBpbGF0aW9uIGluZm9ybWF0aW9uLiAoc2VlIHNlY3Rpb24gSUkuMiApCisKK0lmIHlvdSBkb24ndCB3YW50IHRvIHRlc3QgdGhlIGRpcmVjdGl2ZXMgaW4gb3JwaGFuZWQgbW9kZSB5b3UgY2FuIHVzZSB0aGUKKy1ub3JwaGFuIG9wdGlvbi4gWW91IGFsc28gY2FuIHVzZSB0aGUgcnVudGVzdC5wbCBzY3JpcHQgZWl0aGVyIHRvIGNvbXBpbGUgYWxsCit0ZXN0cyBvciBydW4gY29tcGlsZWQgdGVzdHMgZS5nLiBmb3IgY3Jvc3MgY29tcGlsYXRpb24gb24gb3RoZXIgcGxhdGZvcm1zLiBGb3IKK3RoaXMgdGhlcmUgYXJlIHRoZSBvcHRpb25zIC1ub3J1biBhbmQgLW5vY29tcGlsZS4KKworSGFwcHkgdGVzdGluZyEKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSUlJLglIb3cgdG8gYWRkIG5ldyB0ZXN0cyAvIFRoZSBzdHJ1Y3R1cmUgb2YgdGVzdCB0ZW1wbGF0ZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJSUkuMSAgVGhlIHRlbXBsYXRlIHN0cnVjdHVyZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSB0ZXN0IHN1aXRlIGlzIGJhc2VkIG9uIHRlbXBsYXRlcyBzbyB0aGF0IHlvdSBvbmx5IGhhdmUgb25lIGZpbGUgZm9yIHRlc3QsCitjcm9zc3Rlc3QgYW5kIHRoZSBvcnBoYW5lZCB2ZXJzaW9ucyBvZiB0aGVtLgorCisJQSkgRGVzY3JpcHRpb24gb2YgdGhlIHRlbXBsYXRlIHN0cnVjdHVyZQorCitUaGUgc3ludGF4IG9mIHRoZSB0ZW1wbGF0ZXMgaXMgbXVjaCBsaWtlIHhtbC4gU28gZWFjaCB0ZXN0IGJlZ2lucyB3aXRoCisnPG9tcHRzOnRlc3Q+JyBhbmQgZW5kcyB3aXRoICc8L29tcHRzOnRlc3Q+Jy4KKworSW4gYmV0d2VlbiB0aGVyZSBhcmUgc2V2ZXJhbCBvdGhlciBibG9ja3MgaG9sZGluZyBpbmZvcm1hdGlvbjoKKworLSA8b21wdHM6dGVzdGRlc2NyaXB0aW9uPiA8L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4gSW4gYmV0d2VlbiB0aGlzIHRhZyB5b3UgY2FuCisgIGdpdmUgYSBkZXNjcmlwdGlvbiBvbiB3aGF0IHRoZSB0ZXN0IGNoZWNrcyBhbmQgaG93IGl0IHdvcmtzLgorCistIDxvbXB0czpvbXB2ZXJzaW9uPiA8L29tcHRzOnZlcnNpb24+IFRoaXMgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUKKyAgT3Blbk1QLXZlcnNpb24gd2hpY2ggaW5jbHVkZXMgdGhlIHRlc3RlZCBkaXJlY3RpdmUuCisKKy0gPG9tcHRzOmRpcmVjdGl2ZT4gPC9vbXB0czpkaXJlY3RpdmU+IFVzZWQgdG8gc3BlY2lmeSB0aGUgZGlyZWN0aXZlIGhvdyBpdCBpcworICBjYWxsZWQgaW4gdGhlIHByb2dyYW1taW5nIGxhbmd1YWdlLgorCistIDxvbXB0czpkZXBlbmRlbmNlcz4gPC9vbXB0czpkZXBlbmRlbmNlcz4gV2l0aCB0aGlzIHRhZyB5b3UgY2FuIHNwZWNpZnkgb3RoZXIKKyAgb21wIGRpcmVjdGl2ZXMgd2hpY2ggYXJlIG5lY2Vzc2FyeSBmb3IgdGhlIGNvcnJlY3QgZXhlY3V0aW9uIG9mIHlvdXIgdGVzdC4KK1RoZSBkaXJlY3RpdmVzIGhhdmUgdG8gYmUgbGlzdGVkIGJ5IHRoZWlyIGRpcmVjdGl2ZSBuYW1lcyBhcyBpdCBpcyBjYWxsZWQgaW4KK3RoZSBwcm9ncmFtbWluZyBsYW5ndWFnZS4gTXVsdGlwbGUgZGlyZWN0aXZlcyBhcmUgc2VwYXJhdGVkIGJ5ICcsJy4KKworLSA8b21wdHM6dGVzdGNvZGU+IDwvb21wdHM6dGVzdGNvZGU+IEluIHRoaXMgdGFnIHN0YW5kcyB0aGUgd2hvbGUgc291cmNlIGNvZGUKK2ZvciB0aGUgdGVzdCAvIGNyb3NzdGVzdC4gIEVhY2ggdGVzdCBoYXMgdG8gYmUgd3JpdHRlbiBhcyBhIGZ1bmN0aW9uLiBUaGUKK3N5bnRheCBvZiB0aGUgZnVuY3Rpb25zIGRpZmZlcnMgYmV0d2VlbiBDIGFuZCBGb3J0cmFuOiBJbiBDIGl0IGhhcyB0byB0YWtlIGEKK2ZpbGUgcG9pbnRlciAnRklMRSAqIGxvZ0ZpbGUnIGFuZCByZXR1cm4gYW4gaW50LiBJZiB0aGUgdGVzdCBoYXMgYmVlbiBwYXNzZWQKK3N1Y2Nlc3NmdWwgaXQgaGFzIHRvIHJldHVybiBhIHZhbHVlIHVuZXF1YWwgdG8gMC4gVGhlIGZpbGUgcG9pbnRlciBjYW4gYmUgdXNlZAordG8gd3JpdGUgaW5mb3JtYXRpb24gaW50byBhIGxvZyBmaWxlLiAgSW4gRm9ydHJhbiB0aGUgZnVuY3Rpb24gdGFrZXMgbm8KK2FyZ3VtZW50IGFuZCB0aGUgZnVuY3Rpb24gbmFtZSBtdXN0IG5vdCBleGNlZWQgWFggY2hhcmFjdGVycy4gIFRoZSByZXR1cm4gdmFsdWUKK2hhcyB0byBiZSBzcGVjaWZpZWQgdXNpbmcgdGhlICc8dGVzdGZ1bmN0aW9ubmFtZT4nIHRhZ3MuIEl0IGhhcyB0byBiZSAxIGlmIHRoZQordGVzdCBzdWNjZWVkZWQgYW5kIDAgaWYgdGhlIHRlc3QgZmFpbGVkLiBGb3IgZGV0YWlscyBzZWUgdGhlIGV4YW1wbGUuCisKK1RvIHRlbGwgdGhlIHRlc3Qgc3VpdGUgdGhlIG5hbWUgb2YgeW91ciB0ZXN0IGZ1bmN0aW9uIHlvdSBoYXZlIHRvIGVuY2xvc2UgaXQKK2ludG8gdGhlICc8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiA8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4nIHRhZy4KKworSWYgdGhlcmUgYXJlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGVzdCBhbmQgY3Jvc3N0ZXN0IHlvdSBjYW4gdXNlIHRoZQorPG9tcHRzOmNoZWNrPiA8L29tcHRzOmNoZWNrPiBhbmQgPG9tcHRzOmNyb3NzY2hlY2s+IDwvb21wdHM6Y3Jvc3NjaGVjaz4gdGFnLgorV2hlbiBnZW5lcmF0aW5nIHRoZSB0ZXN0IHRoZSBwYXJzZXIgd2lsbCB1c2UgdGhlIGNvZGUgZW5jbG9zZWQgaW4KKzxvbXB0czpjaGVjaz4gdGFncyBhbmQgY3V0IG91dCB0aGUgY29kZSB3cml0dGVuIGluIDxvbXB0czpjcm9zc2NoZWNrPiB0YWdzLiBTbworeW91IGhhdmUgdHdvIHBvc3NpYmlsaXRpZXMgdG8gd3JpdGUgeW91ciB0ZW1wbGF0ZSBmb3IgdGVzdCBhbmQgY3Jvc3N0ZXN0OiBUaGUKK2ZpcnN0IHdheSB5b3UgY2FuIHdyaXRlIHRoZSBjb21wbGV0ZSBjb2RlIGlzIHRvIHdyaXRlIHRoZSB0ZXN0IGluIG9uZQorPG9tcHRzOmNoZWNrPiB0YWcgYW5kIGxhdGVyIHRoZSBjcm9zc3Rlc3QgaW4gb25lIDxvbXB0czpjcm9zc2NoZWNrPiB0YWcuICBUaGUKK3NlY29uZCB3YXkgaXMgdG8gd3JpdGUgYm90aCB0ZXN0cyBvbmx5IGJ5IGVuY2xvc2luZyBkaWZmZXJpbmcgcGFydHMgaW4KK2NvcnJlc3BvbmRpbmcgdGFncy4KKworVGhlIGZpcnN0IG1ldGhvZCBzaG91bGQgYmUgcHJlZmVycmVkIGlmIHRlc3QgYW5kIGNyb3NzdGVzdCBkaWZmZXIgbXVjaCBmcm9tCitlYWNoIG90aGVyLiBUaGUgc2Vjb25kIGUuZy4gaWYgeW91IG9ubHkgd2FudCB0byBjaGFuZ2UgYSBmZXcgb3B0aW9ucyBsaWtlCityZXBsYWNpbmcgYW4gb21wIHNpbmdsZXByaXZhdGUgY2xhdXNlIGJ5IGFuIG9tcCBwcml2YXRlIGNsYXVzZSBvciB0byBjdXQgb3V0CithIGRpcmVjdGl2ZSBsaWtlIG9tcCBmbHVzaC4gIFdoZW4geW91IHVzZSB0aGUgZmlyc3Qgd2F5IHlvdSBoYXZlIHRvIHRha2UgY2FyZQorb2YgdGhlIGZ1bmN0aW9uIG5hbWUhIFlvdSBoYXZlIHRvIGRlY2xhcmUgaXQgdHdpY2Ugd2l0aAorPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4hCisKKy0gPG9tcHRzOm9ycGhhbj4gPC9vbXB0czpvcnBoYW4+IFRoaXMgdGFnIGNhbiBiZSB1c2VkIGlmIHlvdSB3YW50IHRvIGVuYWJsZQorICB5b3VyIHRlc3QgdG8gY2hlY2sgdGhlIGRpcmVjdGl2ZSBpbiBvcnBoYW4gcmVnaW9ucywgdG9vLiAgVGhlIGNvZGUgZW5jbG9zZWQKK2luIHRoaXMgcGFydCB3aWxsIGJlIHdyaXR0ZW4gdG8gYSBzZXBhcmF0ZSBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIGNhbGxlZAoraW5zdGVhZC4gIElmIHlvdSBoYXZlIHZhcmlhYmxlcyB3aGljaCBhcmUgdXNlZCBvdXRzaWRlIHRoaXMgcmVnaW9uIHlvdSBoYXZlIHRvCitkZWNsYXJlIHRoZW0gYXMgZ2xvYmFsIHZhcmlhYmxlcyBlbmNsb3NlZCBpbiBhbiA8b21wdHM6b3JwaGFuOnZhcnM+IHRhZy4gRm9yCitmdXJ0aGVyIGluZm9ybWF0aW9uIHNlZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIDxvbXB0czpvcnBoYW46dmFycz4gdGFnLgorCistIDxvbXB0czpvcnBoYW46dmFycz4gPC9vbXB0czpvcnBoYW46dmFycz4gVGhpcyB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IGdsb2JhbAorICB2YXJpYWJsZXMgZm9yIGFuIG9ycGhhbiByZWdpb24gd2hpY2ggYWxsb3cgdGhlIGV4Y2hhbmdlIG9mIHZhbHVlcyBiZXR3ZWVuCit0aGUgbWFpbiBwcm9ncmFtIGFuZCB0aGUgb3JwaGFuZWQgZnVuY3Rpb25zLiBUaGUgdXNhZ2UgZGlmZmVycyBiZXR3ZWVuIEMgYW5kCitGb3J0cmFuLiAgSW4gQyB5b3UgaGF2ZSB0byB1c2UgYSBzaW5nbGUgZGVjbGFyYXRpb24gZm9yIGVhY2ggdmFyaWFibGUuIFlvdSBjYW4KK2VpdGhlciBkZWNsYXJlIGFsbCB2YXJpYWJsZXMgaW4gb25lIHNpbmdsZSBvciBpbiBzZXZlcmFsIGRpZmZlcmVudCByZWdpb25zLiBZb3UKK211c3Qgbm90IGluaXRpYWxpemUgdGhlIHZhcmlhYmxlcyBpbnNpZGUhICBJbiBGb3J0cmFuIHlvdSBoYXZlIHRvIHB1dCBhbGwKK2RlY2xhcmF0aW9ucyBpbiBvbmUgc2luZ2xlIHRhZy4gQmVjYXVzZSB0aGVyZSBleGlzdCBubyBnbG9iYWwgdmFyaWFibGVzIGFzIGluCitDIHlvdSBoYXZlIHRvIHVzZSBjb21tb24gYmxvY2tzLiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiBzZWUgdGhlIGV4YW1wbGVzLgorCitJSUkuMi4gIEFkZGluZyB0ZXN0cyB0byB0aGUgdGVzdCBsaXN0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQWZ0ZXIgeW91IGhhdmUgY3JlYXRlZCBhIG5ldyB0ZXN0IHlvdSBoYXZlIHRvIGFkZCB0aGVtIHRvIGEgdGVzdGxpc3QuIFNpbXBseQorYWRkIHRoZSBmdW5jdGlvbiBuYW1lIGluIGEgbmV3IExpbmUgaW50byBhIGZpbGUuCisKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitJVi4gICBLbm93biBJc3N1ZXMgYW5kIFdvcmthcm91bmQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgU3VuIE9TIGhhcyBhIHByb2JsZW0gd2l0aCB0aGUgLW1heGRlcHRoIG9wdGlvbiBvbiB0aGUgJ21ha2UgY2xlYW5hbGwnCitjb21tYW5kLiBUaGlzIHByZXZlbnRzIHRoZSB0ZXN0cyBmcm9tIGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgd29ya2luZyBkaXJlY3RvcnkKK2FuZCBjYW4gY2F1c2UgcHJvYmxlbXMgd2l0aCBmdXR1cmUgdGVzdHMuIFRvIHJlbWVkeSwgZWRpdCB0aGUgbWFrZWZpbGUgbGluZQordW5kZXIgdGhlIGNsZWFuIGNvbW1hbmQ6CisKKyAgICAgLXJtIFtjZl10ZXN0Ki5bY2ZdIFtjZl1jcm9zc3Rlc3QqLltjZl0gW2NmXWN0ZXN0Ki5bY2ZdIFtjZl1vcnBoYW4qLltjZl0KKworQ2hhbmdlIHRvOgorCisgICAgIC1ybSBbY2ZddGVzdCogW2NmXWNyb3NzdGVzdCogW2NmXWN0ZXN0KiBbY2Zdb3JwaGFuKgorCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1YuICAgQ29udGFjdCBhbmQgU3VwcG9ydAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NvbnRhY3Q6IGh0dHA6Ly93d3cuY3MudWguZWR1L35ocGN0b29scwpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2FkZGluZ194ZmFpbHMucHkgYi9maW5hbC90ZXN0c3VpdGUvYWRkaW5nX3hmYWlscy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYWQ0OGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2FkZGluZ194ZmFpbHMucHkKQEAgLTAsMCArMSwzMiBAQAorCitpbXBvcnQgb3MKK2ltcG9ydCBjb21tYW5kcworCitwZXJsID0gIi91c3IvYmluL3BlcmwiCitMTFZNID0gIi4vTExWTS1JUi8iCit0ZW1wX2ZpbGVuYW1lID0gInRlbXAiCitYRkFJTF90ZXh0ID0gIjsgWEZBSUw6ICpcbiIKKworCithcmNoX2ZpbGVfbGlzdCA9IGRpY3QoKQorYXJjaF9maWxlX2xpc3RbJ2xpbl8zMmUnXSA9IFsndGVzdF9vbXBfdGFza19maW5hbC5sbCcsICd0ZXN0X29tcF90YXNrX3VudGllZC5sbCddCisKKworYXJjaF9zY3JpcHQgPSAiLi4vcnVudGltZS90b29scy9jaGVjay1vcGVubXAtdGVzdC5wbCIKK2FyY2hfY21kID0gcGVybCArICIgIiArIGFyY2hfc2NyaXB0CithcmNoID0gY29tbWFuZHMuZ2V0b3V0cHV0KGFyY2hfY21kKQorYXJjaCA9IGFyY2hbOmxlbihhcmNoKS0xXQorCitwcmludCAiQWRkaW5nIFhGQUlMUyAuLi4iCisKK2ZvciBmIGluIGFyY2hfZmlsZV9saXN0W2FyY2hdOgorCWZpbGVuYW1lID0gTExWTSArIGFyY2ggKyAiLyIgKyBmCisJbGluZXMgPSBvcGVuKGZpbGVuYW1lKS5yZWFkbGluZXMoKQorCWxpbmVzLmluc2VydCgxLCBYRkFJTF90ZXh0KQorCWYyID0gb3Blbih0ZW1wX2ZpbGVuYW1lLCAidyIpCisJZm9yIGwgaW4gbGluZXM6CisJCWYyLndyaXRlKGwpCisJZjIuY2xvc2UoKQorCisJb3Muc3lzdGVtKCJtdiAiICsgdGVtcF9maWxlbmFtZSArICIgIiArIGZpbGVuYW1lKQorCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYmluL01ha2VmaWxlIGIvZmluYWwvdGVzdHN1aXRlL2Jpbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGJkM2JhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Jpbi9NYWtlZmlsZQpAQCAtMCwwICsxLDIzIEBACitDQyAgICAgPSBjbGFuZworQ0ZMQUdTID0gLWZvcGVubXAgLVMgLWVtaXQtbGx2bQorSU5DTCA9CitMSUJTID0KKworQklOID0KK1NSQ19ESVIgPSAuL2MKK1NSQ19GSUxFUyA6PSAkKGZvcmVhY2ggRElSLCAkKFNSQ19ESVIpLCAkKHdpbGRjYXJkICQoU1JDX0RJUikvKi5jKSkKK09CSlMgOj0gJChwYXRzdWJzdCAlLmMsICUubywgJChTUkNfRklMRVMpKQorVEFSR0VUTElTVCA6PSAkKHBhdHN1YnN0ICUuYywgJSwgJChTUkNfRklMRVMpKQorCithbGw6JChUQVJHRVRMSVNUKQorCS4vZGlzdHJpYnV0ZS5zaAorCUAgZWNobyBhbGwgZG9uZQorCisuUEhPTlk6IGNsZWFuCisKKyQoVEFSR0VUTElTVCk6ICQoU1JDX0ZJTEVTKQorCSQoQ0MpICQoQ0ZMQUdTKSAkKExJQlMpICQoSU5DTCkgJEAuYyAtbyAkQC5sbAorCitjbGVhbjoKKwlAIHJtIC1yZiBjLyoKKwlAIGVjaG8gY2xlYW4gYmluIGRvbmUKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9iaW4vZGlzdHJpYnV0ZS5zaCBiL2ZpbmFsL3Rlc3RzdWl0ZS9iaW4vZGlzdHJpYnV0ZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kYmIwZjVmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Jpbi9kaXN0cmlidXRlLnNoCkBAIC0wLDAgKzEsMTI1IEBACisjIS9iaW4vYmFzaAorCisjIGFkZCBoZWFkZXIgZm9yIC5sbCBmaWxlcworCisjIGdldCB0bXAgaGVhZGVyCitjcCBoZWFkZXIgL3RtcC90bXAuaGVhZGVyCitlY2hvID4+IC90bXAvdG1wLmhlYWRlcgorCisjIGNyZWF0ZSB0ZW1wb3JhcnkgdGVzdCBwYWNrYWdlCitta2RpciBjLSRNQUNIVFlQRSRPU1RZUEUKK2BjcCBjLyoubGwgYy0kTUFDSFRZUEUkT1NUWVBFL2AKKworIyBhZGQgbmV3IGhlYWRlciBpbnRvIC5sbCBmaWxlcworZm9yIGZpbGUgaW4gYy0kTUFDSFRZUEUkT1NUWVBFLyoKK2RvCisgICAgY3AgJGZpbGUgL3RtcC90bXAubGwuYmYKKyAgICBjYXQgL3RtcC90bXAuaGVhZGVyIC90bXAvdG1wLmxsLmJmID4gL3RtcC90bXAubGwKKyAgICBtdiAvdG1wL3RtcC5sbCAkZmlsZQorZG9uZQorCisKKyMgaW4gYmluLywgdGFyZ2V0IGlzIC4uL0xMVk0tSVIvQVJDSC9PUworTEVWRUw9Li4vTExWTS1JUi8KK0FSQ0hfUEFUSD0uLi9MTFZNLUlSLworT1NfUEFUSD0uLi9MTFZNLUlSLworCisjIGZvciBsaW51eCBzeXN0ZW0sIGFkZCB5b3VyIGFyY2ggYW5kIG9zIGhlcmUKK2RlY2xhcmUgLWEgQVJDSGVzPSh4ODYgeDg2XzY0IHBvd2VycGMgYXJtIG1pcHMgZGFyd2luKQorZGVjbGFyZSAtYSBPU2VzPShsaW51eCBtYWNvc3ggd2luZG93cyBkYXJ3aW4pCisKK2RlY2xhcmUgbG93ZXJBUkNICitkZWNsYXJlIGxvd2VyT1MKKworIyB0YXJnZXQgZGlyZWN0b3J5IG5hbWUKK2RlY2xhcmUgdXBwZXJBUkNICitkZWNsYXJlIHVwcGVyT1MKKworbG93ZXJBUkNIPSQoZWNobyAiJE1BQ0hUWVBFIiB8IHRyICdbOnVwcGVyOl0nICdbOmxvd2VyOl0nKQorbG93ZXJPUz0kKGVjaG8gIiRPU1RZUEUiIHwgdHIgJ1s6dXBwZXI6XScgJ1s6bG93ZXI6XScpCisKKyMgQVJDSAorZm9yIGkgaW4gJHtBUkNIZXNbQF19CitkbworICAgIHJlc3VsdD0kKGVjaG8gIiR7bG93ZXJBUkNIfSIgfCBncmVwICRpKQorICAgIGlmIFtbICIkcmVzdWx0IiAhPSAiIiBdXQorICAgIHRoZW4KKyAgICAgICAgIyB1cHBlckFSQ0g9JGkKKwkJdXBwZXJBUkNIPSQoZWNobyAiJGkiIHwgdHIgJ1s6bG93ZXI6XScgJ1s6dXBwZXI6XScpCisgICAgZmkKK2RvbmUKKworaWYgW1sgIiR1cHBlckFSQ0giID09ICIiIF1dCit0aGVuCisgICAgZWNobyAiTm90IGZvdW5kICR7bG93ZXJBUkNIfSBpbiB0aGUgWyR7QVJDSGVzW0BdfV0hIgorICAgIGV4aXQKK2ZpCisKKyMgT1MKK2ZvciBpIGluICR7T1Nlc1tAXX0KK2RvCisgICAgcmVzdWx0PSQoZWNobyAiJHtsb3dlck9TfSIgfCBncmVwICRpKQorICAgIGlmIFtbICIkcmVzdWx0IiAhPSAiIiBdXQorICAgIHRoZW4KKyAgICAgICAgIyB1cHBlck9TPSRpCisJCXVwcGVyT1M9JChlY2hvICIkaSIgfCB0ciAnWzpsb3dlcjpdJyAnWzp1cHBlcjpdJykKKyAgICBmaQorZG9uZQorCitpZiBbWyAiJHVwcGVyT1MiID09ICIiIF1dCit0aGVuCisgICAgZWNobyAiTm90IGZvdW5kICR7bG93ZXJPU30gaW4gdGhlIFske09TZXNbQF19XSEiCisgICAgZXhpdAorZmkKKworIyBzdXJ2aXZlZCwgYXNzZW1ibGUgdGhlIHBhdGgKKyMgQVJDSF9QQVRIKz0kdXBwZXJBUkNILworIyBPU19QQVRIKz0kdXBwZXJBUkNILyR1cHBlck9TLworQVJDSF9uZXdGb3JtYXQ9LgoraWYgWyAkdXBwZXJBUkNIID0gIlg4NiIgXTsgdGhlbgorICAgIEFSQ0hfbmV3Rm9ybWF0PTMyCitlbHNlCisgICAgQVJDSF9uZXdGb3JtYXQ9MzJlCitmaQorT1NfbmV3Rm9ybWF0PS4KK2lmIFsgJHVwcGVyT1MgPSAiTElOVVgiIF07IHRoZW4KKyAgICBPU19uZXdGb3JtYXQ9bGluCitlbGlmIFsgJHVwcGVyT1MgPSAiTUFDT1NYIiBdOyB0aGVuCisgICAgT1NfbmV3Rm9ybWF0PW1hYworZWxpZiBbICR1cHBlck9TID0gIldJTkRPV1MiIF07IHRoZW4KKyAgICBPU19uZXdGb3JtYXQ9d2luCitlbGlmIFsgJHVwcGVyT1MgPSAiREFSV0lOIiBdOyB0aGVuCisgICAgT1NfbmV3Rm9ybWF0PWRhcgorZWxzZQorICAgIE9TX25ld0Zvcm1hdD11bmtub3duCitmaQorT1NfUEFUSCs9JE9TX25ld0Zvcm1hdCJfIiRBUkNIX25ld0Zvcm1hdAorCisjIHRlc3QgYW5kIGNyZWF0ZSBkaXJlY3RvcnkKK2lmIFsgISAtZCAiJExFVkVMIiBdOyB0aGVuCisgICAgbWtkaXIgJExFVkVMCisgICAgbWtkaXIgJE9TX1BBVEgKK2Vsc2UKKyAgICBpZiBbICEgLWQgIiRPU19QQVRIIiBdOyB0aGVuCisgICAgICAgIG1rZGlyICRPU19QQVRICisgICAgZmkKK2ZpCisKKyMgcmVzZXJ2ZSB0aGUgdG1wIHBhdGggdG8gTExWTS1JUi9BUkNIL09TCitlY2hvICRPU19QQVRIIi8iID4gbGl0LnRtcAorCisjIE9TX0FSQ0g9JE9TX25ld0Zvcm1hdCJfIiRBUkNIX25ld0Zvcm1hdAorIyBlY2hvIC1lICJpZiBub3QgJyRPU19BUkNIJyBpbiBjb25maWcucm9vdC50YXJnZXRzOiIgPiAkT1NfUEFUSCcvJ2xpdC5sb2NhbC5jZmcKKyMgZWNobyAtZSAiXHRjb25maWcudW5zdXBwb3J0ZWQgPSBUcnVlIiA+PiAkT1NfUEFUSCcvJ2xpdC5sb2NhbC5jZmcKKworIyBjb3B5ICoubGwgZmlsZXMgdG8gQVJDSC9PUworYGNwIGxpdC4qICRMRVZFTGAKKworIyBvbWl0IG9ycGggdGVzdAorYHJtIGMtJE1BQ0hUWVBFJE9TVFlQRS9jdGVzdF8qLmxsYAorYHJtIGMtJE1BQ0hUWVBFJE9TVFlQRS9vcnBoX2N0ZXN0XyoubGxgCitgY3AgYy0kTUFDSFRZUEUkT1NUWVBFLyoubGwgJE9TX1BBVEhgCisKKyMgY2xlYW4KK2BybSAvdG1wL3RtcC4qYAorcm0gLXJmIGMtJE1BQ0hUWVBFJE9TVFlQRS8KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9iaW4vaGVhZGVyIGIvZmluYWwvdGVzdHN1aXRlL2Jpbi9oZWFkZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc0MWU2MgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9iaW4vaGVhZGVyCkBAIC0wLDAgKzEsNiBAQAorOyBSVU46ICVjbGFuZyAtbG9tcCAtbG0gJXMgLW8gJXQgJiYgJXQgMj4mMSB8IEZpbGVDaGVjayAlcworOyBDSEVDSy1OT1Q6IFRlc3QgZmFpbGVkCis7IENIRUNLOiBEaXJlY3RpdmUgd29ya2VkIHdpdGhvdXQgZXJyb3JzCisKKworCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYmluL2xpdC5jZmcgYi9maW5hbC90ZXN0c3VpdGUvYmluL2xpdC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk1NzgxOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9iaW4vbGl0LmNmZwpAQCAtMCwwICsxLDc4IEBACisjIC0qLSBQeXRob24gLSotCisKKyMgQ29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgJ2xpdCcgdGVzdCBydW5uZXIuCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHJlCitpbXBvcnQgcGxhdGZvcm0KKwordHJ5OgorICAgaW1wb3J0IGxpdC51dGlsCisgICBpbXBvcnQgbGl0LmZvcm1hdHMKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgIHBhc3MKKworIyBuYW1lOiBUaGUgbmFtZSBvZiB0aGlzIHRlc3Qgc3VpdGUuCitjb25maWcubmFtZSA9ICdPcGVuTVBWYWxpZGF0aW9uU3VpdGUnCisKKyMgdGVzdEZvcm1hdDogVGhlIHRlc3QgZm9ybWF0IHRvIHVzZSB0byBpbnRlcnByZXQgdGVzdHMuCitjb25maWcudGVzdF9mb3JtYXQgPSBsaXQuZm9ybWF0cy5TaFRlc3QoZXhlY3V0ZV9leHRlcm5hbD1GYWxzZSkKKworIyBzdWZmaXhlczogQSBsaXN0IG9mIGZpbGUgZXh0ZW5zaW9ucyB0byB0cmVhdCBhcyB0ZXN0IGZpbGVzCisjIE5vdGUgdGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBsaXQubG9jYWwuY2ZnIGZpbGVzCitjb25maWcuc3VmZml4ZXMgPSBbJy5sbCddCisKKyMgdGVzdF9zb3VyY2Vfcm9vdDogVGhlIHJvb3QgcGF0aCB3aGVyZSB0ZXN0cyBhcmUgbG9jYXRlZC4KKyNjb25maWcudGVzdF9zb3VyY2Vfcm9vdCA9ICIvaG9tZS9pY2hveWp4L2luc3RhbGwvb3Blbm1wL3Rlc3RzdWl0ZS9iaW4iCisjb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKQorCisjIHRlc3RfZXhlY19yb290OiBUaGUgcm9vdCBwYXRoIHdoZXJlIHRlc3RzIHNob3VsZCBiZSBydW4uCisjbXB2c19vYmpfcm9vdCA9IGdldGF0dHIoY29uZmlnLCAnbXB2c19vYmpfcm9vdCcsIE5vbmUpCisjaWYgbXB2c19vYmpfcm9vdCBpcyBub3QgTm9uZToKK2NvbmZpZy50ZXN0X2V4ZWNfcm9vdCA9ICIuLyIKKyNvcy5wYXRoLmpvaW4obXB2c19vYmpfcm9vdCwgJ3NyYycpCisKKyMgRGlzY292ZXIgdGhlICdjbGFuZycgYW5kICdjbGFuZ2NjJyB0byB1c2UuCisKK2ltcG9ydCBvcworCitkZWYgaW5mZXJDbGFuZyhQQVRIKToKKyAgICAjIERldGVybWluZSB3aGljaCBjbGFuZyB0byB1c2UuCisgICAgY2xhbmcgPSBvcy5nZXRlbnYoJ0NMQU5HJykKKworICAgICMgSWYgdGhlIHVzZXIgc2V0IGNsYW5nIGluIHRoZSBlbnZpcm9ubWVudCwgZGVmaW5pdGVseSB1c2UgdGhhdCBhbmQgZG9uJ3QKKyAgICAjIHRyeSB0byB2YWxpZGF0ZS4KKyAgICBpZiBjbGFuZzoKKyAgICAgICAgcmV0dXJuIGNsYW5nCisKKyAgICAjIE90aGVyd2lzZSBsb29rIGluIHRoZSBwYXRoLgorICAgIGNsYW5nID0gbGl0LnV0aWwud2hpY2goJ2NsYW5nJywgUEFUSCkKKworICAgIGlmIG5vdCBjbGFuZzoKKyAgICAgICAgbGl0X2NvbmZpZy5mYXRhbCgiY291bGRuJ3QgZmluZCAnY2xhbmcnIHByb2dyYW0sIHRyeSBzZXR0aW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiQ0xBTkcgaW4geW91ciBlbnZpcm9ubWVudCIpCisKKyAgICByZXR1cm4gY2xhbmcKKworY29uZmlnLmNsYW5nID0gaW5mZXJDbGFuZyhjb25maWcuZW52aXJvbm1lbnRbJ1BBVEgnXSkucmVwbGFjZSgnXFwnLCAnLycpCitjb25maWcuc3Vic3RpdHV0aW9ucy5hcHBlbmQoICgnJWNsYW5nJywgJyAnICsgY29uZmlnLmNsYW5nICsgJyAnKSApCisKKyMgUHJvcG9nYXRlIHNvbWUgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGVzdCBlbnZpcm9ubWVudC4KK2RlZiBhZGRFbnYobmFtZSk6CisgICAgaWYgbmFtZSBpbiBvcy5lbnZpcm9uOgorICAgICAgICBjb25maWcuZW52aXJvbm1lbnRbbmFtZV0gPSBvcy5lbnZpcm9uW25hbWVdCisKK2FkZEVudignSE9NRScpCithZGRFbnYoJ1BXRCcpCisKKworYWRkRW52KCdDX0lOQ0xVREVfUEFUSCcpCithZGRFbnYoJ0NQTFVTX0lOQ0xVREVfUEFUSCcpCithZGRFbnYoJ0xJQlJBUllfUEFUSCcpCithZGRFbnYoJ0xEX0xJQlJBUllfUEFUSCcpCithZGRFbnYoJ0RZTERfTElCUkFSWV9QQVRIJykKKworIyBDaGVjayB0aGF0IHRoZSBvYmplY3Qgcm9vdCBpcyBrbm93bi4KK2lmIGNvbmZpZy50ZXN0X2V4ZWNfcm9vdCBpcyBOb25lOgorICAgIGxpdC5mYXRhbCgndGVzdCBleGVjdXRpb24gcm9vdCBub3Qgc2V0IScpCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYmluL2xpdC5zaXRlLmNmZy5pbiBiL2ZpbmFsL3Rlc3RzdWl0ZS9iaW4vbGl0LnNpdGUuY2ZnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExODY2ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYmluL2xpdC5zaXRlLmNmZy5pbgpAQCAtMCwwICsxLDMwIEBACisjIyBBdXRvZ2VuZXJhdGVkIGJ5IExMVk0vQ2xhbmcgY29uZmlndXJhdGlvbi4KKyNjb25maWcubXB2c19zcmNfcm9vdCA9ICIvaG9tZS9pY2hveWp4L2luc3RhbGwvb3Blbm1wL3Rlc3RzdWl0ZS9iaW4vYyIKK2NvbmZpZy5tcHZzX29ial9yb290ID0gIi90bXAiCitjb25maWcubGx2bV90b29sc19kaXIgPSAiQExMVk1fVE9PTFNfRElSQCIKKworCisjIE5lZWRlZCB0byBjaGVjayBpZiBhIGhhY2sgbmVlZHMgdG8gYmUgYXBwbGllZAorY29uZmlnLmxsdm1fdmVyc2lvbl9tYWpvciA9ICJATExWTV9WRVJTSU9OX01BSk9SQCIKKworIyBDb21waWxlcnMKKyMgRklYTUU6IHVzZSBsbHZtY2Mgbm90IGxsdm1nY2MKK2NvbmZpZy5sbHZtY2xhbmcgPSAiY2xhbmciCisKKyMgRmVhdHVyZXMKK2NvbmZpZy5lbmFibGVfdWNsaWJjID0gVHJ1ZSBpZiBARU5BQkxFX1VDTElCQ0AgPT0gMSBlbHNlIEZhbHNlCitjb25maWcuZW5hYmxlX3Bvc2l4X3J1bnRpbWUgPSBUcnVlIGlmIEBFTkFCTEVfUE9TSVhfUlVOVElNRUAgPT0gMSBlbHNlIEZhbHNlCitjb25maWcuaGF2ZV9zZWxpbnV4ID0gVHJ1ZSBpZiBASEFWRV9TRUxJTlVYQCA9PSAxIGVsc2UgRmFsc2UKKworIyBDdXJyZW50IHRhcmdldAorY29uZmlnLnRhcmdldF90cmlwbGUgPSAiQFRBUkdFVF9UUklQTEVAIgorCisjIExldCB0aGUgbWFpbiBjb25maWcgZG8gdGhlIHJlYWwgd29yay4KK3RyeToKKyAgbGl0CitleGNlcHQgTmFtZUVycm9yOgorICAjIFVzZSBsaXRfY29uZmlnIGNsYXNzCisgIGxpdF9jb25maWcubG9hZF9jb25maWcoY29uZmlnLCAiQE1QVlNfU09VUkNFX0RJUkAvbGl0LmNmZyIpCitlbHNlOgorICAjIFVzZSBvbGQgbGl0IGNsYXNzCisgIGxpdC5sb2FkX2NvbmZpZyhjb25maWcsICJATVBWU19TT1VSQ0VfRElSQC9saXQuY2ZnIikKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9iaW4vbGl0LnRtcCBiL2ZpbmFsL3Rlc3RzdWl0ZS9iaW4vbGl0LnRtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWQzMGZiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Jpbi9saXQudG1wCkBAIC0wLDAgKzEgQEAKKy4uL0xMVk0tSVIvbGluXzMyZS8KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL2hhc19vcGVubXAuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL2hhc19vcGVubXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODNhOTczCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2MvaGFzX29wZW5tcC5jCkBAIC0wLDAgKzEsMzAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgT3Blbk1wIHN1cHBvcnQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPl9PUEVOTVA8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5oYXNfb3Blbm1wPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IHJ2YWx1ZSA9IDA7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIDxvbXB0czpvcnBoYW4+CisgICAgPG9tcHRzOmNoZWNrPgorI2lmZGVmIF9PUEVOTVAKKwlydmFsdWUgPSAxOworI2VuZGlmCisgICAgPC9vbXB0czpjaGVjaz4KKyAgICA8b21wdHM6Y3Jvc3NjaGVjaz4KKyNpZiAwCisJcnZhbHVlID0gMTsKKyNlbmRpZgorICAgIDwvb21wdHM6Y3Jvc3NjaGVjaz4KKyAgICAgIDwvb21wdHM6b3JwaGFuPgorCXJldHVybiAocnZhbHVlKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfYXRvbWljLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfYXRvbWljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMyZDFhYQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9hdG9taWMuYwpAQCAtMCwwICsxLDQzNCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgYXRvbWljIGRpcmVjdGl2ZSBieSBjb3VudGluZyB1cCBhIHZhcmlhYmxlIGluIGEgcGFyYWxsZWxpemVkIGxvb3Agd2l0aCBhbiBhdG9taWMgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgYXRvbWljPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9hdG9taWM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc3VtOworICAgICAgICBpbnQgZGlmZjsKKyAgICAgICAgZG91YmxlIGRzdW0gPSAwOworICAgICAgICBkb3VibGUgZHQgPSAwLjU7CS8qIGJhc2Ugb2YgZ2VvbWV0cmljIHJvdyBmb3IgKyBhbmQgLSB0ZXN0Ki8KKyAgICAgICAgZG91YmxlIGRkaWZmOworICAgICAgICBpbnQgcHJvZHVjdDsKKyAgICAgICAgaW50IHg7CisgICAgICAgIGludCAqbG9naWNzOworICAgICAgICBpbnQgYml0X2FuZCA9IDE7CisgICAgICAgIGludCBiaXRfb3IgPSAwOworICAgICAgICBpbnQgZXhjbHVzaXZfYml0X29yID0gMDsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisjZGVmaW5lIERPVUJMRV9ESUdJVFMgMjAJLyogZHReRE9VQkxFX0RJR0lUUyAqLworI2RlZmluZSBNQVhfRkFDVE9SIDEwCisjZGVmaW5lIEtOT1dOX1BST0RVQ1QgMzYyODgwMAkvKiAxMCEgKi8KKyAgICBpbnQgajsKKyAgICBpbnQga25vd25fc3VtOworICAgIGludCBrbm93bl9kaWZmOworICAgIGludCBrbm93bl9wcm9kdWN0OworICAgIGludCByZXN1bHQgPSAwOworICAgIGludCBsb2dpY19hbmQgPSAxOworICAgIGludCBsb2dpY19vciA9IDA7CisgICAgZG91YmxlIGRrbm93bl9zdW07CisgICAgZG91YmxlIHJvdW5kaW5nX2Vycm9yID0gMS5FLTk7CisgICAgZG91YmxlIGRwdCwgZGl2OworICAgIGludCBsb2dpY3NBcnJheVtMT09QQ09VTlRdOworICAgIGxvZ2ljcyA9IGxvZ2ljc0FycmF5OworICAgIAorICAgIHN1bSA9IDA7CisgICAgZGlmZiA9IDA7CisgICAgcHJvZHVjdCA9IDE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisJICAgIGZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisJICAgIHsKKwkJPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisJCXN1bSArPSBpOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgICBpZiAoa25vd25fc3VtICE9IHN1bSkKKyAgICB7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsIAorICAgICAgICAgICAgICAgICAiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZC5cbiIsIAorICAgICAgICAgICAgICAgICBzdW0sIGtub3duX3N1bSk7CisgICAgICAgIHJlc3VsdCsrOworICAgIH0KKyAgICAKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPiAgIAorICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgIGRpZmYgLT0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorICAgIGtub3duX2RpZmYgPSAoKExPT1BDT1VOVCAtIDEpICogTE9PUENPVU5UKSAvIDIgKiAtMTsKKyAgICBpZiAoZGlmZiAhPSBrbm93bl9kaWZmKQorICAgIHsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwKKyAgICAgICAgICAgICAgIkVycm9yIGluIGRpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mIDAuXG4iLAorICAgICAgICAgICAgICAgZGlmZik7CisgICAgICAgIHJlc3VsdCsrOworICAgIH0KKworICAgIC8qIFRlc3RzIGZvciBkb3VibGVzICovCisgICAgZHN1bSA9IDA7CisgICAgZHB0ID0gMTsKKworICAgIGZvciAoaiA9IDA7IGogPCBET1VCTEVfRElHSVRTOyArK2opCisgICAgICB7CisgICAgICAgIGRwdCAqPSBkdDsKKyAgICAgIH0KKyAgICBka25vd25fc3VtID0gKDEgLSBkcHQpIC8gKDEgLWR0KTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBET1VCTEVfRElHSVRTOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgZHN1bSArPSBwb3cgKGR0LCBpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKGRzdW0gIT0gZGtub3duX3N1bSAmJiAoZmFicyAoZHN1bSAtIGRrbm93bl9zdW0pID4gcm91bmRpbmdfZXJyb3IpKQorICAgIHsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwKKyAgICAgICAgICAgICAgICAgIkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJWYgaW5zdGVhZCBvZjogJWYgKERpZmZlcmVuY2U6ICVFKVxuIiwKKyAgICAgICAgICAgICAgICAgZHN1bSwgZGtub3duX3N1bSwgZHN1bSAtIGRrbm93bl9zdW0pOworICAgICAgICByZXN1bHQrKzsKKyAgICB9CisKKyAgICBkcHQgPSAxOworCisgICAgZm9yIChqID0gMDsgaiA8IERPVUJMRV9ESUdJVFM7ICsraikKKyAgICB7CisgICAgICAgIGRwdCAqPSBkdDsKKyAgICB9CisgICAgZGRpZmYgPSAoMSAtIGRwdCkgLyAoMSAtIGR0KTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICB7CisgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBET1VCTEVfRElHSVRTOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgZGRpZmYgLT0gcG93IChkdCwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9IAorICAgIGlmIChmYWJzIChkZGlmZikgPiByb3VuZGluZ19lcnJvcikKKyAgICB7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsCisgICAgICAgICAgICAgICAgICJFcnJvciBpbiBkaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSBpbnN0ZWFkIG9mIDAuMFxuIiwKKyAgICAgICAgICAgICAgICAgZGRpZmYpOworICAgICAgICByZXN1bHQrKzsKKyAgICB9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IE1BWF9GQUNUT1I7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICBwcm9kdWN0ICo9IGk7CisgICAgICAgICAgICB9CisgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisgICAgCisgICAga25vd25fcHJvZHVjdCA9IEtOT1dOX1BST0RVQ1Q7CisgICAgaWYgKGtub3duX3Byb2R1Y3QgIT0gcHJvZHVjdCkKKyAgICB7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsCisgICAgICAgICAgICAgICAgICJFcnJvciBpbiBwcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgcHJvZHVjdCwga25vd25fcHJvZHVjdCk7CisgICAgICAgIHJlc3VsdCsrOworICAgIH0KKworICAgIHByb2R1Y3QgPSBLTk9XTl9QUk9EVUNUOworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IE1BWF9GQUNUT1I7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICBwcm9kdWN0IC89IGk7CisgICAgICAgICAgICB9CisgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAocHJvZHVjdCAhPSAxKQorICAgIHsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwKKyAgICAgICAgICAgICAgICAgIkVycm9yIGluIHByb2R1Y3QgZGl2aXNpb24gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mIDFcbiIsCisgICAgICAgICAgICAgICAgIHByb2R1Y3QpOworICAgICAgICByZXN1bHQrKzsKKyAgICB9CisgICAgCisgICAgZGl2ID0gNS4wRSs1OworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8PSBNQVhfRkFDVE9SOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgZGl2IC89IGk7CisgICAgICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZhYnMoZGl2LTAuMTM3Nzg3KSA+PSAxLjBFLTQgKQorICAgIHsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsCisgICAgICAgICAgICAgICAgICJFcnJvciBpbiBkaXZpc2lvbiB3aXRoIGRvdWJsZTogUmVzdWx0IHdhcyAlZiBpbnN0ZWFkIG9mIDAuMTM3Nzg3XG4iLCBkaXYpOworICAgIH0KKworICAgIHggPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgeCsrOworICAgICAgICAgICAgfQorICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKHggIT0gTE9PUENPVU5UKQorICAgIHsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiArK1xuIik7CisgICAgfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgeC0tOworICAgICAgICAgICAgfQorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAoeCAhPSAwKQorICAgIHsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiAtLVxuIik7CisgICAgfQorCisgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKQorICAgIHsKKyAgICAgICAgbG9naWNzW2pdID0gMTsKKyAgICB9CisgICAgYml0X2FuZCA9IDE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIGJpdF9hbmQgJj0gbG9naWNzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKCFiaXRfYW5kKQorICAgIHsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMVxuIik7CisgICAgfQorCisgICAgYml0X2FuZCA9IDE7CisgICAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIGJpdF9hbmQgJj0gbG9naWNzW2ldOworICAgICAgICAgICAgfQorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAoYml0X2FuZCkKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDJcbiIpOworICAgIH0KKworICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7IGorKykKKyAgICB7CisgICAgICAgIGxvZ2ljc1tqXSA9IDA7CisgICAgfQorICAgIGJpdF9vciA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICBiaXRfb3IgfD0gbG9naWNzW2ldOworICAgICAgICAgICAgfQorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAoYml0X29yKQorICAgIHsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBCSVQgT1IgcGFydCAxXG4iKTsKKyAgICB9CisgICAgYml0X29yID0gMDsKKyAgICBsb2dpY3NbTE9PUENPVU5UIC8gMl0gPSAxOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgYml0X29yIHw9IGxvZ2ljc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBpZiAoIWJpdF9vcikKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gQklUIE9SIHBhcnQgMlxuIik7CisgICAgfQorCisgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgaisrKQorICAgIHsKKyAgICAgICAgbG9naWNzW2pdID0gMDsKKyAgICB9CisgICAgZXhjbHVzaXZfYml0X29yID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+IAorICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciBePSBsb2dpY3NbaV07CisgICAgICAgICAgICB9CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgaWYgKGV4Y2x1c2l2X2JpdF9vcikgCisgICAgeworICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDFcbiIpOworICAgIH0KKworICAgIGV4Y2x1c2l2X2JpdF9vciA9IDA7CisgICAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMTsKKyAgICAKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPiAKKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgXj0gbG9naWNzW2ldOworICAgICAgICAgICAgfQorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGlmICghZXhjbHVzaXZfYml0X29yKSAKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMlxuIik7CisgICAgfQorCisgICAgeCA9IDE7CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTA7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgIHggPDw9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmICggeCAhPSAxMDI0KQorICAgIHsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiA8PFxuIik7CisgICAgICAgIHggPSAxMDI0OworICAgIH0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEwOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgeCA+Pj0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKHggIT0gMSkKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gPj5cbiIpOworICAgIH0KKworICAgIHJldHVybiAocmVzdWx0ID09IDApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9iYXJyaWVyLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfYmFycmllci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNjY5ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfYmFycmllci5jCkBAIC0wLDAgKzEsNDEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGJhcnJpZXIgZGlyZWN0aXZlLiBUaGUgdGVzdCBjcmVhdGVzIHNldmVyYWwgdGhyZWFkcyBhbmQgc2VuZHMgb25lIG9mIHRoZW0gc2xlZXBpbmcgYmVmb3JlIHNldHRpbmcgYSBmbGFnLiBBZnRlciB0aGUgYmFycmllciB0aGUgb3RoZXIgb25lcyBkbyBzb21lIGxpdHRsZSB3b3JrIGRlcGVuZGluZyBvbiB0aGUgZmxhZy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGJhcnJpZXI8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfYmFycmllcjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCByZXN1bHQxOworCWludCByZXN1bHQyOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICByZXN1bHQxID0gMDsKKyAgICByZXN1bHQyID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgPG9tcHRzOm9ycGhhbj4KKwlpbnQgcmFuazsKKwlyYW5rID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCWlmIChyYW5rID09MSkgeworICAgICAgICBteV9zbGVlcChTTEVFUFRJTUVfTE9ORyk7CisgICAgICAgIHJlc3VsdDIgPSAzOworCX0KKzxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBiYXJyaWVyPC9vbXB0czpjaGVjaz4KKwlpZiAocmFuayA9PSAyKSB7CisJICAgIHJlc3VsdDEgPSByZXN1bHQyOworCX0KKyAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisgICAgcHJpbnRmKCJyZXN1bHQxPSVkXG4iLHJlc3VsdDEpOworICAgIHJldHVybiAocmVzdWx0MSA9PSAzKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfY3JpdGljYWwuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9jcml0aWNhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiM2YyNjQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfY3JpdGljYWwuYwpAQCAtMCwwICsxLDQyIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBjcml0aWNhbCBkaXJlY3RpdmUgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIHBhcmFsbGVsaXplZCBsb29wIHdpdGhpbiBhIGNyaXRpY2FsIHNlY3Rpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBjcml0aWNhbDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9jcml0aWNhbDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzdW07CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBzdW09MDsKKyAgICBpbnQga25vd25fc3VtOworCSAgCisgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgIGludCBteXN1bT0wOworICAgICAgaW50IGk7CisgICAgICAKKyAgICAgICNwcmFnbWEgb21wIGZvcgorCSAgICBmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKQorCSAgICAgIG15c3VtID0gbXlzdW0gKyBpOworCisgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGNyaXRpY2FsPC9vbXB0czpjaGVjaz4KKwkgICAgc3VtID0gbXlzdW0gK3N1bTsKKyAgICAgICAgCisgICAgfQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAKKyAgICBwcmludGYoInN1bT0lZFxuIixzdW0pOworICAgIGtub3duX3N1bSA9IDk5OSAqIDEwMDAgLyAyOworICAgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7CisKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZmx1c2guYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mbHVzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYWJmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZmx1c2guYwpAQCAtMCwwICsxLDUwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBmbHVzaCBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmbHVzaDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBiYXJyaWVyPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZmx1c2g8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgcmVzdWx0MTsKKwlpbnQgcmVzdWx0MjsKKwlpbnQgZHVtbXk7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworCXJlc3VsdDEgPSAwOworCXJlc3VsdDIgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKwlpbnQgcmFuazsKKwlyYW5rID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCisjcHJhZ21hIG9tcCBiYXJyaWVyCisJaWYgKHJhbmsgPT0gMSkgeworCSAgICByZXN1bHQyID0gMzsKKwkgICAgPG9tcHRzOm9ycGhhbj4KKwkJPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGZsdXNoIChyZXN1bHQyKTwvb21wdHM6Y2hlY2s+CisJCWR1bW15ID0gcmVzdWx0MjsKKwkgICAgPC9vbXB0czpvcnBoYW4+CisJfQorCisJaWYgKHJhbmsgPT0gMCkgeworCSAgICA8b21wdHM6Y2hlY2s+bXlfc2xlZXAoU0xFRVBUSU1FX0xPTkcpOzwvb21wdHM6Y2hlY2s+CisJICAgIDxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBmbHVzaCAocmVzdWx0Mik8L29tcHRzOmNoZWNrPgorCQlyZXN1bHQxID0gcmVzdWx0MjsKKwkgICAgPC9vbXB0czpvcnBoYW4+CisJfQorICAgIH0JLyogZW5kIG9mIHBhcmFsbGVsICovCisKKyAgICByZXR1cm4gKChyZXN1bHQxID09IHJlc3VsdDIpICYmIChyZXN1bHQyID09IGR1bW15KSAmJiAocmVzdWx0MiA9PSAzKSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9jb2xsYXBzZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9jb2xsYXBzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMTZmNDAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX2NvbGxhcHNlLmMKQEAgLTAsMCArMSw1NiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2l0aCBvbXAgZm9yIGNvbGxhcHNlIGNsYXVzZS4gQmluZCB3aXRoIHR3byBsb29wcy4gV2l0aG91dCB0aGUgY29sbGFwc2UgY2xhdXNlLCB0aGUgZmlyc3QgbG9vcCB3aWxsIG5vdCBiZSBvcmRlcmVkPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmb3IgY29sbGFwc2U8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIGZvciBzY2hlZHVsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKworLyogVXRpbGl0eSBmdW5jdGlvbiB0byBjaGVjayB0aGF0IGkgaXMgaW5jcmVhc2luZyBtb25vdG9uaWNhbGx5IAorICAgd2l0aCBlYWNoIGNhbGwgKi8KK3N0YXRpYyBpbnQgY2hlY2tfaV9pc2xhcmdlciAoaW50IGkpCit7CisgICAgc3RhdGljIGludCBsYXN0X2k7CisgICAgaW50IGlzbGFyZ2VyOworICAgIGlmIChpPT0xKQorICAgICAgbGFzdF9pPTA7CisgICAgaXNsYXJnZXIgPSAoKGkgPj0gbGFzdF9pKSYmKGkgLSBsYXN0X2k8PTEpKTsKKyAgICBsYXN0X2kgPSBpOworICAgIHJldHVybiAoaXNsYXJnZXIpOworfQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZm9yX2NvbGxhcHNlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IGlzX2xhcmdlciA9IDE7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICBpbnQgaSxqOworCSAgaW50IG15X2lzbGFyZ2VyID0gMTsKKyAgICAgICNwcmFnbWEgb21wIGZvciBwcml2YXRlKGksaikgc2NoZWR1bGUoc3RhdGljLDEpIDxvbXB0czpjaGVjaz5jb2xsYXBzZSgyKTwvb21wdHM6Y2hlY2s+IG9yZGVyZWQKKwkgICAgZm9yIChpID0gMTsgaSA8IDEwMDsgaSsrKXsKKyAgICAgICAgICA8b21wdHM6Y3Jvc3NjaGVjaz5teV9pc2xhcmdlciA9IGNoZWNrX2lfaXNsYXJnZXIoaSkmJiBteV9pc2xhcmdlcjs8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgICAgICAgZm9yIChqID0xOyBqIDwxMDA7IGorKykKKyAgICAgICAgICB7CisgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CisJCSAgICAjcHJhZ21hIG9tcCBvcmRlcmVkCisJCSAgICAgIG15X2lzbGFyZ2VyID0gY2hlY2tfaV9pc2xhcmdlcihpKSYmbXlfaXNsYXJnZXI7CisgICAgICAgICAgICA8L29tcHRzOmNoZWNrPgorCSAgICAgIH0JLyogZW5kIG9mIGZvciAqLworICAgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorCQlpc19sYXJnZXIgPSBpc19sYXJnZXIgJiYgbXlfaXNsYXJnZXI7CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgcmV0dXJuIChpc19sYXJnZXIpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3JfZmlyc3Rwcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX2ZpcnN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNzIwMTQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX2ZpcnN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGZvciBmaXJzdHByaXZhdGUgY2xhdXNlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgbG9vcC4gRWFjaCB0aHJlYWQgaGFzIGEgZmlyc3Rwcml2YXRlIHZhcmlhYmxlICgxKSBhbmQgYW4gdmFyaWFibGUgKDIpIGRlY2xhcmVkIGJ5IGZvciBmaXJzdHByaXZhdGUuIEZpcnN0IGl0IHN0b3JlcyB0aGUgcmVzdWx0IG9mIGl0cyBsYXN0IGl0ZXJhdGlvbiBpbiB2YXJpYWJsZSAoMikuIFRoZW4gaXQgc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgKDIpIGluIGl0cyBmaXJzdHByaXZhdGUgdmFyaWFibGUgKDEpLiBBdCB0aGUgZW5kIGFsbCBmaXJzdHByaXZhdGUgdmFyaWFibGVzICgxKSBhcmUgYWRkZWQgdG8gYSB0b3RhbCBzdW0gaW4gYSBjcml0aWNhbCBzZWN0aW9uIGFuZCBjb21wYXJlZCB3aXRoIHRoZSBjb3JyZWN0IHJlc3VsdC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZvciBmaXJzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCBzdW0xOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShzdW0xKQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZm9yX2ZpcnN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgaW50IHN1bTsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHN1bTA7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIGludCBrbm93bl9zdW07CisgICAgaW50IHRocmVhZHNudW07CisKKyAgICBzdW0gPSAwOworICAgIHN1bTAgPSAxMjM0NTsKKyAgICBzdW0xID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICAgICAgeworICAgICAgICAgICAgdGhyZWFkc251bT1vbXBfZ2V0X251bV90aHJlYWRzKCk7CisgICAgICAgIH0KKwkvKiBzdW0wID0gMDsgKi8KKwk8b21wdHM6b3JwaGFuPgorCWludCBpOworI3ByYWdtYSBvbXAgZm9yIDxvbXB0czpjaGVjaz5maXJzdHByaXZhdGUoc3VtMCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoc3VtMCk8L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKwl7CisJICAgIHN1bTAgPSBzdW0wICsgaTsKKwkgICAgc3VtMSA9IHN1bTA7CisJfQkvKiBlbmQgb2YgZm9yICovCisJPC9vbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgICAgc3VtID0gc3VtICsgc3VtMTsKKwl9CS8qIGVuZCBvZiBjcml0aWNhbCAqLworICAgIH0JLyogZW5kIG9mIHBhcmFsbGVsICovICAgIAorCisgICAga25vd25fc3VtID0gMTIzNDUqIHRocmVhZHNudW0rIChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3JfbGFzdHByaXZhdGUuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3JfbGFzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjA4MGEyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9sYXN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGZvciBsYXN0cHJpdmF0ZSBjbGF1c2UgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIHBhcmFsbGVsaXplZCBsb29wLiBFYWNoIHRocmVhZCBzYXZlcyB0aGUgbmV4dCBzdW1tYW5kIGluIGEgbGFzdHByaXZhdGUgdmFyaWFibGUgaTAuIEF0IHRoZSBlbmQgaTAgaXMgY29tcGFyZWQgdG8gdGhlIHZhbHVlIG9mIHRoZSBleHBlY3RlZCBsYXN0IHN1bW1hbmQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmb3IgbGFzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZSxvbXAgc2NoZWR1bGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgc3VtMDsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoc3VtMCkKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9sYXN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisJaW50IHN1bSA9IDA7CisJaW50IGtub3duX3N1bTsKKwk8b21wdHM6b3JwaGFuOnZhcnM+CisJICAgIGludCBpMDsKKwk8L29tcHRzOm9ycGhhbjp2YXJzPgorCisJaTAgPSAtMTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisJICAgIHN1bTAgPSAwOworCSAgICB7CS8qIEJlZ2luIG9mIG9ycGhhbmVkIGJsb2NrICovCisJICAgIDxvbXB0czpvcnBoYW4+CisJCWludCBpOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKHN0YXRpYyw3KSA8b21wdHM6Y2hlY2s+bGFzdHByaXZhdGUoaTApPC9vbXB0czpjaGVjaz4KKwkJZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKwkJeworCQkgICAgc3VtMCA9IHN1bTAgKyBpOworCQkgICAgaTAgPSBpOworCQl9CS8qIGVuZCBvZiBmb3IgKi8KKwkgICAgPC9vbXB0czpvcnBoYW4+CisJICAgIH0JLyogZW5kIG9mIG9ycGhhbmVkIGJsb2NrICovCisKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJICAgIHsKKwkJc3VtID0gc3VtICsgc3VtMDsKKwkgICAgfQkvKiBlbmQgb2YgY3JpdGljYWwgKi8KKwl9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLyAgICAKKworCWtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKwlmcHJpbnRmKGxvZ0ZpbGUsIiBrbm93bl9zdW0gPSAlZCAsIHN1bSA9ICVkIFxuIixrbm93bl9zdW0sc3VtKTsKKwlmcHJpbnRmKGxvZ0ZpbGUsIiBMT09QQ09VTlQgPSAlZCAsIGkwID0gJWQgXG4iLExPT1BDT1VOVCxpMCk7CisJcmV0dXJuICgoa25vd25fc3VtID09IHN1bSkgJiYgKGkwID09IExPT1BDT1VOVCkgKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX25vd2FpdC5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9ub3dhaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2VjNDBiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9ub3dhaXQuYwpAQCAtMCwwICsxLDU3IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czpkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGZvciBub3dhaXQgZGlyZWN0aXZlLiBJdCBmaWxscyBhbiBhcnJheSB3aXRoIHZhbHVlcyBhbmQgb3BlcmF0ZXMgb24gdGhlc2UgaW4gdGhlIGZvbGxvd2luZy48L29tcHRzOmRlc2NyaXB0aW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZm9yIG5vd2FpdDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnZlcnNpb24+MS4wPC9vbXB0czp2ZXJzaW9uPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJhbGxlbCBmb3IsIG9tcCBmbHVzaDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9ub3dhaXQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworCTxvbXB0czpvcnBoYW46dmFycz4KKwkJaW50IHJlc3VsdDsKKwkJaW50IGNvdW50OworCTwvb21wdHM6b3JwaGFuOnZhcnM+CisJaW50IGo7CisJaW50IG15YXJyYXlbTE9PUENPVU5UXTsKKworCXJlc3VsdCA9IDA7CisJY291bnQgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKwl7CisJPG9tcHRzOm9ycGhhbj4KKwkJaW50IHJhbms7CisJCWludCBpOworCisJCXJhbmsgPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKworI3ByYWdtYSBvbXAgZm9yIDxvbXB0czpjaGVjaz5ub3dhaXQ8L29tcHRzOmNoZWNrPiAKKwkJZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKSB7CisJCQlpZiAoaSA9PSAwKSB7CisJCQkJZnByaW50ZiAobG9nRmlsZSwgIlRocmVhZCBuciAlZCBlbnRlcmluZyBmb3IgbG9vcCBhbmQgZ29pbmcgdG8gc2xlZXAuXG4iLCByYW5rKTsKKwkJCQlteV9zbGVlcChTTEVFUFRJTUUpOworCQkJCWNvdW50ID0gMTsKKyNwcmFnbWEgb21wIGZsdXNoKGNvdW50KQorCQkJCWZwcmludGYgKGxvZ0ZpbGUsICJUaHJlYWQgbnIgJWQgd29rZSB1cCBhbmQgc2V0IGNvdW50ID0gMS5cbiIsIHJhbmspOworCQkJfQorCQl9CisJCQorCQlmcHJpbnRmIChsb2dGaWxlLCAiVGhyZWFkIG5yICVkIGV4aXRlZCBmaXJzdCBmb3IgbG9vcCBhbmQgZW50ZXJzIHRoZSBzZWNvbmQuXG4iLCByYW5rKTsKKyNwcmFnbWEgb21wIGZvcgorCQlmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspIAorCQl7CisjcHJhZ21hIG9tcCBmbHVzaChjb3VudCkKKwkJCWlmIChjb3VudCA9PSAwKQorCQkJCXJlc3VsdCA9IDE7CisJCX0KKwk8L29tcHRzOm9ycGhhbj4KKwl9CisJCisJcmV0dXJuIHJlc3VsdDsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX29yZGVyZWQuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfb3JkZXJlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOTdkMDQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX29yZGVyZWQuYwpAQCAtMCwwICsxLDYwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBvcmRlcmVkIGRpcmVjdGl2ZSBieSBjb3VudGluZyB1cCBhbiB2YXJpYWJsZSBpbiBhbiBwYXJhbGxlbGl6ZWQgbG9vcCBhbmQgd2F0Y2hpbmcgZWFjaCBpdGVyYXRpb24gaWYgdGhlIHN1bWFuZCBpcyBsYXJnZXIgYXMgdGhlIGxhc3Qgb25lLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIG9yZGVyZWQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIGZvciBzY2hlZHVsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK3N0YXRpYyBpbnQgbGFzdF9pID0gMDsKKworLyogVXRpbGl0eSBmdW5jdGlvbiB0byBjaGVjayB0aGF0IGkgaXMgaW5jcmVhc2luZyBtb25vdG9uaWNhbGx5IAorICAgd2l0aCBlYWNoIGNhbGwgKi8KK3N0YXRpYyBpbnQgY2hlY2tfaV9pc2xhcmdlciAoaW50IGkpCit7CisgICAgaW50IGlzbGFyZ2VyOworICAgIGlzbGFyZ2VyID0gKGkgPiBsYXN0X2kpOworICAgIGxhc3RfaSA9IGk7CisgICAgcmV0dXJuIChpc2xhcmdlcik7Cit9CisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3Jfb3JkZXJlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzdW07CisJaW50IGlzX2xhcmdlciA9IDE7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQga25vd25fc3VtOworCisgICAgbGFzdF9pID0gMDsKKyAgICBzdW0gPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgaTsKKwkgICAgaW50IG15X2lzbGFyZ2VyID0gMTsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShzdGF0aWMsMSkgb3JkZXJlZAorCSAgICBmb3IgKGkgPSAxOyBpIDwgMTAwOyBpKyspCisJICAgIHsKKwkJPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIG9yZGVyZWQ8L29tcHRzOmNoZWNrPgorCQl7CisJCSAgICBteV9pc2xhcmdlciA9IGNoZWNrX2lfaXNsYXJnZXIoaSkgJiYgbXlfaXNsYXJnZXI7CisJCSAgICBzdW0gPSBzdW0gKyBpOworCQl9CS8qIGVuZCBvZiBvcmRlcmVkICovCisJICAgIH0JLyogZW5kIG9mIGZvciAqLworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkgICAgeworCQlpc19sYXJnZXIgPSBpc19sYXJnZXIgJiYgbXlfaXNsYXJnZXI7CisJICAgIH0JLyogZW5kIG9mIGNyaXRpY2FsICovCisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAga25vd25fc3VtPSg5OSAqIDEwMCkgLyAyOworICAgIHJldHVybiAoKGtub3duX3N1bSA9PSBzdW0pICYmIGlzX2xhcmdlcik7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9wcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTY1MTEwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9wcml2YXRlLmMKQEAgLTAsMCArMSw2NCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgZm9yIHByaXZhdGUgY2xhdXNlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgbG9vcC4gRWFjaCB0aHJlYWQgaGFzIGEgcHJpdmF0ZSB2YXJpYWJsZSAoMSkgYW5kIGEgdmFyaWFibGUgKDIpIGRlY2xhcmVkIGJ5IGZvciBwcml2YXRlLiBGaXJzdCBpdCBzdG9yZXMgdGhlIHJlc3VsdCBvZiBpdHMgbGFzdCBpdGVyYXRpb24gaW4gdmFyaWFibGUgKDIpLiBUaGVuIHRoaXMgdGhyZWFkIHdhaXRzIHNvbWUgdGltZSBiZWZvcmUgaXQgc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgKDIpIGluIGl0cyBwcml2YXRlIHZhcmlhYmxlICgxKS4gQXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBpdGVyYXRpb24gdGhlIHZhbHVlIG9mICgxKSBpcyBhc3NpZ25lZCB0byAoMikuIEF0IHRoZSBlbmQgYWxsIHByaXZhdGUgdmFyaWFibGVzICgxKSBhcmUgYWRkZWQgdG8gYSB0b3RhbCBzdW0gaW4gYSBjcml0aWNhbCBzZWN0aW9uIGFuZCBjb21wYXJlZCB3aXRoIHRoZSBjb3JyZWN0IHJlc3VsdC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZvciBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmFsbGVsLG9tcCBmbHVzaCxvbXAgY3JpdGljYWwsb21wIHRocmVhZHByaXZhdGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLyogVXRpbGl0eSBmdW5jdGlvbiBkbyBzcGVuZCBzb21lIHRpbWUgaW4gYSBsb29wICovCitzdGF0aWMgdm9pZCBkb19zb21lX3dvcmsgKCl7CisgICAgaW50IGk7CisgICAgZG91YmxlIHN1bSA9IDA7CisgICAgZm9yKGkgPSAwOyBpIDwgMTAwMDsgaSsrKXsKKwlzdW0gKz0gc3FydCAoKGRvdWJsZSkgaSk7CisgICAgfQorfQorCitpbnQgc3VtMTsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoc3VtMSkKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9wcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICBpbnQgc3VtID0gMDsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHN1bTA7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIGludCBrbm93bl9zdW07CisKKyAgICBzdW0wID0gMDsJLyogc2V0dGluZyAoZ2xvYmFsKSBzdW0wID0gMCAqLworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKwlzdW0xID0gMDsJLyogc2V0dGluZyBzdW0xIGluIGVhY2ggdGhyZWFkIHRvIDAgKi8KKworCXsJLyogYmVnaW4gb2Ygb3JwaGFuZWQgYmxvY2sgKi8KKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvciA8b21wdHM6Y2hlY2s+cHJpdmF0ZShzdW0wKTwvb21wdHM6Y2hlY2s+IHNjaGVkdWxlKHN0YXRpYywxKQorCSAgICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorCSAgICB7CisJCXN1bTAgPSBzdW0xOworI3ByYWdtYSBvbXAgZmx1c2gKKwkJc3VtMCA9IHN1bTAgKyBpOworCQlkb19zb21lX3dvcmsgKCk7CisjcHJhZ21hIG9tcCBmbHVzaAorCQlzdW0xID0gc3VtMDsKKwkgICAgfQkvKiBlbmQgb2YgZm9yICovCisJPC9vbXB0czpvcnBoYW4+CisJfQkvKiBlbmQgb2Ygb3JwaGFuZWQgYmxvY2sgKi8KKworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICAgIHN1bSA9IHN1bSArIHN1bTE7CisJfQkvKmVuZCBvZiBjcml0aWNhbCovCisgICAgfQkvKiBlbmQgb2YgcGFyYWxsZWwqLyAgICAKKworICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9yZWR1Y3Rpb24uYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3JfcmVkdWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRkMTkxNwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3JfcmVkdWN0aW9uLmMKQEAgLTAsMCArMSw0MjkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGZvciByZWR1Y3Rpb24gZGlyZWN0aXZlIHdpY2ggYWxsIGl0cyBvcHRpb25zLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIHJlZHVjdGlvbjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3JfcmVkdWN0aW9uPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJZG91YmxlIGR0OworCWludCBzdW07CisJaW50IGRpZmY7CisJaW50IHByb2R1Y3QgPSAxOworCWRvdWJsZSBkc3VtOworCWRvdWJsZSBka25vd25fc3VtOworCWRvdWJsZSBkZGlmZjsKKwlpbnQgbG9naWNfYW5kOworCWludCBsb2dpY19vcjsKKwlpbnQgYml0X2FuZDsKKwlpbnQgYml0X29yOworCWludCBleGNsdXNpdl9iaXRfb3I7CisJaW50ICpsb2dpY3M7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworI2RlZmluZSBET1VCTEVfRElHSVRTIDIwCS8qIGR0XkRPVUJMRV9ESUdJVFMgKi8KKyNkZWZpbmUgTUFYX0ZBQ1RPUiAxMAorI2RlZmluZSBLTk9XTl9QUk9EVUNUIDM2Mjg4MDAJLyogMTAhICovCisKKyAgICBpbnQgaTsKKyAgICBpbnQga25vd25fc3VtOworICAgIGludCBrbm93bl9wcm9kdWN0OworICAgIGRvdWJsZSByb3VuZGluZ19lcnJvciA9IDEuRS05OwkvKiBvdmVyIGFsbCByb3VuZGluZyBlcnJvciB0byBiZSBpZ25vcmVkIGluIHRoZSBkb3VibGUgdGVzdHMgKi8KKyAgICBkb3VibGUgZHB0OworICAgIGludCByZXN1bHQgPSAwOworICAgIGludCBsb2dpY3NBcnJheVtMT09QQ09VTlRdOworCisgICAgLyogVmFyaWFibGVzIGZvciBpbnRlZ2VyIHRlc3RzICovCisgICAgc3VtID0gMDsKKyAgICBwcm9kdWN0ID0gMTsKKyAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgICAgLyogdmFyaWFiZWxzIGZvciBkb3VibGUgdGVzdHMgKi8KKyAgICBkdCA9IDEuIC8gMy47CS8qIGJhc2Ugb2YgZ2VvbWV0cmljIHJvdyBmb3IgKyBhbmQgLSB0ZXN0Ki8KKyAgICBkc3VtID0gMC47CisgICAgLyogVmFyaWFiZWxlcyBmb3IgbG9naWMgIHRlc3RzICovCisgICAgbG9naWNzID0gbG9naWNzQXJyYXk7CisgICAgbG9naWNfYW5kID0gMTsKKyAgICBsb2dpY19vciA9IDA7CisgICAgLyogVmFyaWFiZWxlcyBmb3IgYml0IG9wZXJhdG9ycyB0ZXN0cyAqLworICAgIGJpdF9hbmQgPSAxOworICAgIGJpdF9vciA9IDA7CisgICAgLyogVmFyaWFibGVzIGZvciBleGNsdXNpdiBiaXQgb3IgKi8KKyAgICBleGNsdXNpdl9iaXRfb3IgPSAwOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIFRlc3RzIGZvciBpbnRlZ2VycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKiBUZXN0aW5nIGludGVnZXIgYWRkaXRpb24gKioqKi8KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOnN1bSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkgICAgZm9yIChqID0gMTsgaiA8PSBMT09QQ09VTlQ7IGorKykKKwkgICAgeworCQlzdW0gPSBzdW0gKyBqOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKGtub3duX3N1bSAhPSBzdW0pIHsKKwlyZXN1bHQrKzsKKwlmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZC5cbiIsIHN1bSwga25vd25fc3VtKTsgCisgICAgfQorCisKKy8qKioqIFRlc3RpbmcgaW50ZWdlciBzdWJ0cmFjdG9uICoqKiovCisKKyAgICBkaWZmID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigtOmRpZmYpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJICAgIGZvciAoaiA9IDE7IGogPD0gTE9PUENPVU5UOyBqKyspCisJICAgIHsKKwkJZGlmZiA9IGRpZmYgLSBqOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKGRpZmYgIT0gMCkgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBkaWZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAwLlxuIiwgZGlmZik7CisgICAgfQorCisKKy8qKioqIFRlc3RpbmcgaW50ZWdlciBtdWx0aXBsaWNhdGlvbiAqKioqLworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCo6cHJvZHVjdCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkgICAgZm9yIChqID0gMTsgaiA8PSBNQVhfRkFDVE9SOyBqKyspCisJICAgIHsKKwkJcHJvZHVjdCAqPSBqOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAga25vd25fcHJvZHVjdCA9IEtOT1dOX1BST0RVQ1Q7CisgICAgaWYoa25vd25fcHJvZHVjdCAhPSBwcm9kdWN0KQorICAgIHsKKwlyZXN1bHQrKzsKKwlmcHJpbnRmIChsb2dGaWxlLCJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuIixwcm9kdWN0LGtub3duX3Byb2R1Y3QpOworICAgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBUZXN0cyBmb3IgZG91YmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKiogVGVzdGluZyBkb3VibGUgYWRkaXRpb24gKioqKi8KKworICAgIGRzdW0gPSAwLjsKKyAgICBkcHQgPSAxLjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBET1VCTEVfRElHSVRTOyArK2kpCisgICAgeworCWRwdCAqPSBkdDsKKyAgICB9CisgICAgZGtub3duX3N1bSA9ICgxIC0gZHB0KSAvICgxIC0gZHQpOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6ZHN1bSk8L29tcHRzOmNoZWNrPgorCSAgICBmb3IgKGogPSAwOyBqIDwgRE9VQkxFX0RJR0lUUzsgaisrKQorCSAgICB7CQorCQlkc3VtICs9IHBvdyAoZHQsIGopOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKGZhYnMgKGRzdW0gLSBka25vd25fc3VtKSA+IHJvdW5kaW5nX2Vycm9yKSB7CisJcmVzdWx0Kys7IAorCWZwcmludGYgKGxvZ0ZpbGUsICJcbkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJWYgaW5zdGVhZCBvZjogJWYgKERpZmZlcmVuY2U6ICVFKVxuIiwgZHN1bSwgZGtub3duX3N1bSwgZHN1bS1ka25vd25fc3VtKTsKKyAgICB9CisKKyNpZiAwCisgICAgZHB0ID0gMS47CisgICAgZm9yIChpID0gMDsgaSA8IERPVUJMRV9ESUdJVFM7ICsraSkKKyAgICB7CisJZHB0ICo9IGR0OworICAgIH0KKyNlbmRpZgorCisKKy8qKioqIFRlc3RpbmcgZG91YmxlIHN1YnRyYWN0aW9uICoqKiovCisKKyAgICBkZGlmZiA9ICgxIC0gZHB0KSAvICgxIC0gZHQpOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGRpZmYpPC9vbXB0czpjaGVjaz4KKwkgICAgZm9yIChqID0gMDsgaiA8IERPVUJMRV9ESUdJVFM7ICsraikKKwkgICAgeworCQlkZGlmZiAtPSBwb3cgKGR0LCBqKTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmIChmYWJzIChkZGlmZikgPiByb3VuZGluZ19lcnJvcikgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSBpbnN0ZWFkIG9mIDAuMFxuIiwgZGRpZmYpOworICAgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBUZXN0cyBmb3IgbG9naWNhbCB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKiogVGVzdGluZyBsb2dpYyBhbmQgKioqKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKyAgICB7CisJbG9naWNzW2ldID0gMTsKKyAgICB9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKwkgICAgeworCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tqXSk7CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZighbG9naWNfYW5kKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDFcbiIpOworICAgIH0KKworICAgIGxvZ2ljX2FuZCA9IDE7CisgICAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmJjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKwkgICAgeworCQlsb2dpY19hbmQgPSBsb2dpY19hbmQgJiYgbG9naWNzW2pdOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYobG9naWNfYW5kKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDJcbiIpOworICAgIH0KKworCisvKioqKiBUZXN0aW5nIGxvZ2ljIG9yICoqKiovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisgICAgeworCWxvZ2ljc1tpXSA9IDA7CisgICAgfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHx8OmxvZ2ljX29yKSAgPC9vbXB0czpjaGVjaz4KKwkgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKQorCSAgICB7CisJCWxvZ2ljX29yID0gbG9naWNfb3IgfHwgbG9naWNzW2pdOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKGxvZ2ljX29yKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMVxuIik7CisgICAgfQorCisgICAgbG9naWNfb3IgPSAwOworICAgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofHw6bG9naWNfb3IpPC9vbXB0czpjaGVjaz4KKwkgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKQorCSAgICB7CisJCWxvZ2ljX29yID0gbG9naWNfb3IgfHwgbG9naWNzW2pdOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYoIWxvZ2ljX29yKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMlxuIik7CisgICAgfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqIFRlc3RzIGZvciBiaXQgdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKiBUZXN0aW5nIGJpdCBhbmQgKioqKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkKKyAgICB7CisJbG9naWNzW2ldID0gMTsKKyAgICB9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJjpiaXRfYW5kKSAgPC9vbXB0czpjaGVjaz4KKwkgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKQorCSAgICB7CisJCWJpdF9hbmQgPSAoYml0X2FuZCAmIGxvZ2ljc1tqXSk7CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAoIWJpdF9hbmQpIHsKKwlyZXN1bHQrKzsKKwlmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDFcbiIpOworICAgIH0KKworICAgIGJpdF9hbmQgPSAxOworICAgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJjpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKwkgICAgeworCQliaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tqXTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICBpZiAoYml0X2FuZCkgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMlxuIik7CisgICAgfQorCisKKy8qKioqIFRlc3RpbmcgYml0IG9yICoqKiovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisgICAgeworCWxvZ2ljc1tpXSA9IDA7CisgICAgfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHw6Yml0X29yKTwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKwkgICAgeworCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3Nbal07CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAoYml0X29yKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEJJVCBPUiBwYXJ0IDFcbiIpOworICAgIH0KKworICAgIGJpdF9vciA9IDA7CisgICAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8OmJpdF9vcik8L29tcHRzOmNoZWNrPgorCSAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opCisJICAgIHsKKwkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2pdOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorICAgIGlmICghYml0X29yKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEJJVCBPUiBwYXJ0IDJcbiIpOworICAgIH0KKworCisvKioqKiBUZXN0aW5nIGV4Y2x1c2l2ZSBiaXQgb3IgKioqKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKyAgICB7CisJbG9naWNzW2ldID0gMDsKKyAgICB9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz4KKwkgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKQorCSAgICB7CisJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tqXTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICBpZiAoZXhjbHVzaXZfYml0X29yKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDFcbiIpOworICAgIH0KKworICAgIGV4Y2x1c2l2X2JpdF9vciA9IDA7CisgICAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPgorCSAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opCisJICAgIHsKKwkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2pdOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorICAgIGlmICghZXhjbHVzaXZfYml0X29yKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDJcbiIpOworICAgIH0KKworICAgIC8qZnByaW50ZiAoIlxuUmVzdWx0OiVkXG4iLCByZXN1bHQpOyovCisgICAgcmV0dXJuIChyZXN1bHQgPT0gMCk7CisKKyAgICBmcmVlIChsb2dpY3MpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfYXV0by5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9hdXRvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYxYTFjNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfYXV0by5jCkBAIC0wLDAgKzEsNTUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdpdGggb21wIGZvciBzY2hlZHVsZSBhdXRvPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmb3IgYXV0bzwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxvbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHN1bTE7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKHN1bTEpCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3JfYXV0bzwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgaW50IHN1bTsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHN1bTA7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIGludCBrbm93bl9zdW07CisgICAgaW50IHRocmVhZHNudW07CisKKyAgICBzdW0gPSAwOworICAgIHN1bTAgPSAxMjM0NTsKKyAgICBzdW0xID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICAgICAgeworICAgICAgICAgICAgdGhyZWFkc251bT1vbXBfZ2V0X251bV90aHJlYWRzKCk7CisgICAgICAgIH0KKwkvKiBzdW0wID0gMDsgKi8KKwk8b21wdHM6b3JwaGFuPgorCWludCBpOworI3ByYWdtYSBvbXAgZm9yIDxvbXB0czpjaGVjaz5maXJzdHByaXZhdGUoc3VtMCkgc2NoZWR1bGUoYXV0byk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoc3VtMCk8L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKwl7CisJICAgIHN1bTAgPSBzdW0wICsgaTsKKwkgICAgc3VtMSA9IHN1bTA7CisJfQkvKiBlbmQgb2YgZm9yICovCisJPC9vbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgICAgc3VtID0gc3VtICsgc3VtMTsKKwl9CS8qIGVuZCBvZiBjcml0aWNhbCAqLworICAgIH0JLyogZW5kIG9mIHBhcmFsbGVsICovICAgIAorCisgICAga25vd25fc3VtID0gMTIzNDUqIHRocmVhZHNudW0rIChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfZHluYW1pYy5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9keW5hbWljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJjZGE1NgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfZHluYW1pYy5jCkBAIC0wLDAgKzEsMTExIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIGR5bmFtaWMgb3B0aW9uIG9mIHRoZSBvbXAgZm9yIHNjaGVkdWxlIGRpcmVjdGl2ZTwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMpPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoLG9tcCBmb3Igbm93YWl0LG9tcCBjcml0aWNhbCxvbXAgc2luZ2xlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKworLyoKKyogVGVzdCBmb3IgZHluYW1pYyBzY2hlZHVsaW5nIHdpdGggY2h1bmsgc2l6ZQorKiBNZXRob2Q6IGNhY3VsYXRlIGhvdyBtYW55IHRpbWVzIHRoZSBpdGVyYXRpb24gc3BhY2UgaXMgZGlzcGF0Y2hlZAorKiAgICAgICAgIGFuZCBqdWRnZSBpZiBlYWNoIGRpc3BhdGNoIGhhcyB0aGUgcmVxdWVzdGVkIGNodW5rIHNpemUKKyogICAgICAgICB1bmxlc3MgaXQgaXMgdGhlIGxhc3Qgb25lLgorKiBJdCBpcyBwb3NzaWJsZSBmb3IgdHdvIGFkamFjZW50IGNodW5rcyBhcmUgYXNzaWduZWQgdG8gdGhlIHNhbWUgdGhyZWFkCisqIE1vZGlmeWllZCBieSBDaHVuaHVhIExpYW8KKyovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvbXAuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworI2RlZmluZSBDRkRNQVhfU0laRSAxMDAKK2NvbnN0IGludCBjaHVua19zaXplID0gNzsKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9zY2hlZHVsZV9keW5hbWljPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgaW50IHRpZDsKKzxvbXB0czpvcnBoYW46dmFycz4gIAorICBpbnQgKnRpZHM7CisgIGludCBpOworPC9vbXB0czpvcnBoYW46dmFycz4KKworICBpbnQgdGlkc0FycmF5W0NGRE1BWF9TSVpFXTsKKyAgaW50IGNvdW50ID0gMDsKKyAgaW50IHRtcF9jb3VudCA9IDA7IC8qZGlzcGF0Y2ggdGltZXMqLworICBpbnQgKnRtcDsgIC8qc3RvcmUgY2h1bmsgc2l6ZSBmb3IgZWFjaCBkaXNwYXRjaCovCisgIGludCByZXN1bHQgPSAwOworICAKKyAgdGlkcyA9IHRpZHNBcnJheTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZSh0aWQpIHNoYXJlZCh0aWRzKQorICB7CQkJCS8qIGJlZ2luIG9mIHBhcmFsbGVsICovCisgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICBpbnQgdGlkOworCisgICAgdGlkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworI3ByYWdtYSBvbXAgZm9yIDxvbXB0czpjaGVjaz5zY2hlZHVsZShkeW5hbWljLGNodW5rX3NpemUpPC9vbXB0czpjaGVjaz4KKyAgICBmb3IgKGkgPSAwOyBpIDwgQ0ZETUFYX1NJWkU7IGkrKykKKyAgICAgIHsKKwl0aWRzW2ldID0gdGlkOworICAgICAgfQorICAgICA8L29tcHRzOm9ycGhhbj4KKyAgfQkJCQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgQ0ZETUFYX1NJWkUgLSAxOyArK2kpCisgICAgeworICAgICAgaWYgKHRpZHNbaV0gIT0gdGlkc1tpICsgMV0pCisJeworCSAgY291bnQrKzsKKwl9CisgICAgfQorCisgIHRtcCA9IChpbnQgKikgbWFsbG9jIChzaXplb2YgKGludCkgKiAoY291bnQgKyAxKSk7CisgIHRtcFswXSA9IDE7CisKKyAgZm9yIChpID0gMDsgaSA8IENGRE1BWF9TSVpFIC0gMTsgKytpKQorICAgIHsKKyAgICAgIGlmICh0bXBfY291bnQgPiBjb3VudCkKKwl7CisJICBwcmludGYgKCItLS0tLS0tLS0tLS0tLS0tLS0tLVxuVGVzdGludGVybmFsIEVycm9yOiBMaXN0IHRvbyBzbWFsbCEhIVxuLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwkvKiBFcnJvciBoYW5kbGluZyAqLworCSAgYnJlYWs7CisJfQorICAgICAgaWYgKHRpZHNbaV0gIT0gdGlkc1tpICsgMV0pCisJeworCSAgdG1wX2NvdW50Kys7CisJICB0bXBbdG1wX2NvdW50XSA9IDE7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHRtcFt0bXBfY291bnRdKys7CisJfQorICAgIH0KKy8qCitwcmludGYoImRlYnVnLS0tLVxuIik7CisgICAgZm9yIChpID0gMDsgaSA8IENGRE1BWF9TSVpFOyArK2kpCisJcHJpbnRmKCIlZCAiLHRpZHNbaV0pOworcHJpbnRmKCJkZWJ1Zy0tLS1cbiIpOworKi8KKy8qIGlzIGR5bmFtaWMgc3RhdGVtZW50IHdvcmtpbmc/ICovCisgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgIHsKKyAgICAgIGlmICgodG1wW2ldJWNodW5rX3NpemUpIT0wKSAKKy8qaXQgaXMgcG9zc2libGUgZm9yIDIgYWRqYWNlbnQgY2h1bmtzIGFzc2lnbmVkIHRvIGEgc2FtZSB0aHJlYWQqLworCXsKKyAgICAgICAgIHJlc3VsdCsrOworICBmcHJpbnRmKGxvZ0ZpbGUsIlRoZSBpbnRlcm1lZGlhdGUgZGlzcGF0Y2ggaGFzIHdyb25nIGNodW5rc2l6ZS5cbiIpOworCSAgLypyZXN1bHQgKz0gKCh0bXBbaV0gLyBjaHVua19zaXplKSAtIDEpOyovCisJfQorICAgIH0KKyAgaWYgKCh0bXBbY291bnRdJWNodW5rX3NpemUpIT0oQ0ZETUFYX1NJWkUlY2h1bmtfc2l6ZSkpCisgICB7IAorICAgcmVzdWx0Kys7CisgIGZwcmludGYobG9nRmlsZSwidGhlIGxhc3QgZGlzcGF0Y2ggaGFzIHdyb25nIGNodW5rc2l6ZS5cbiIpOworICAgfQorICAvKiBmb3IgKGludCBpPTA7aTxjb3VudCsxOysraSkgcHJpbnRmKCIlZFx0Oj1cdCVkXG4iLGkrMSx0bXBbaV0pOyAqLworICByZXR1cm4gKHJlc3VsdD09MCk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9ndWlkZWQuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfZ3VpZGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM1NjRhNQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfZ3VpZGVkLmMKQEAgLTAsMCArMSwyMjUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgZ3VpZGVkIG9wdGlvbiBvZiB0aGUgb21wIGZvciBzY2hlZHVsZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmb3Igc2NoZWR1bGUoZ3VpZGVkKTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmbHVzaCxvbXAgZm9yIG5vd2FpdCxvbXAgY3JpdGljYWwsb21wIHNpbmdsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisvKiBUZXN0IGZvciBndWlkZWQgc2NoZWR1bGluZworICogRW5zdXJlIHRocmVhZHMgZ2V0IGNodW5rcyBpbnRlcmxlYXZlbHkgZmlyc3QKKyAqIFRoZW4ganVkZ2UgdGhlIGNodW5rIHNpemVzIGFyZSBkZWNyZWFzaW5nIHRvIGEgc3RhYmxlIHZhbHVlCisgKiBNb2RpZmllZCBieSBDaHVuaHVhIExpYW8KKyAqIEZvciBleGFtcGxlLCAxMDAgaXRlcmF0aW9uIG9uIDIgdGhyZWFkcywgY2h1bmtzaXplIDcKKyAqIG9uZSBsaW5lIGZvciBlYWNoIGRpc3BhdGNoLCAwLzEgbWVhbnMgdGhyZWFkIGlkCisgKiAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAgMjQKKyAqIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAxICAgICAgICAgICAgICAxOAorICogMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwICAgICAgICAgICAgICAgICAgICAgIDE0CisgKiAxIDEgMSAxIDEgMSAxIDEgMSAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAKKyAqIDAgMCAwIDAgMCAwIDAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOAorICogMSAxIDEgMSAxIDEgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3CisgKiAwIDAgMCAwIDAgMCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcKKyAqIDEgMSAxIDEgMSAxIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNworICogMCAwIDAgMCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CisqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKKyNkZWZpbmUgTlVNQkVSX09GX1RIUkVBRFMgMTAKKyNkZWZpbmUgQ0ZTTUFYX1NJWkUgMTAwMAorI2RlZmluZSBNQVhfVElNRSAgMC4wMDUKKworI2lmZGVmIFNMRUVQVElNRQorI3VuZGVmIFNMRUVQVElNRQorI2RlZmluZSBTTEVFUFRJTUUgMC4wMDAxCisjZW5kaWYKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9zY2hlZHVsZV9ndWlkZWQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgKiB0aWRzOworCWludCAqIGNodW5rc2l6ZXM7CisJaW50IG5vdG91dDsKKwlpbnQgbWF4aXRlcjsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgaW50IHRocmVhZHM7CisgICAgaW50IGk7CisgICAgaW50IHJlc3VsdDsKKworICAgIHRpZHMgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogKENGU01BWF9TSVpFICsgMSkpOworCW1heGl0ZXIgPSAwOworICAgIHJlc3VsdCA9IDE7CisgICAgbm90b3V0ID0gMTsKKworLyogVGVzdGluZyBpZiBlbm91Z2h0IHRocmVhZHMgYXJlIGF2YWlsYWJsZSBmb3IgdGhpcyBjaGVjay4gKi8KKyNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworI3ByYWdtYSBvbXAgc2luZ2xlCisJICB7CisJCXRocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzICgpOworCSAgfSAvKiBlbmQgb2Ygc2luZ2xlICovCisJfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworCWlmICh0aHJlYWRzIDwgMikgeworCSAgcHJpbnRmICgiVGhpcyB0ZXN0IG9ubHkgd29ya3Mgd2l0aCBhdCBsZWFzdCB0d28gdGhyZWFkcyAuXG4iKTsKKwkgIGZwcmludGYgKGxvZ0ZpbGUsICJUaGlzIHRlc3Qgb25seSB3b3JrcyB3aXRoIGF0IGxlYXN0IHR3byB0aHJlYWRzLiBBdmFpbGFibGUgd2VyZSBvbmx5ICVkIHRocmVhZChzKS5cbiIsIHRocmVhZHMpOworCSAgcmV0dXJuICgwKTsKKwl9IC8qIGVuZCBpZiAqLworCisKKyAgICAvKiBOb3cgdGhlIHJlYWwgcGFyYWxsZWwgd29yazogIAorICAgICAqCisJICogRWFjaCB0aHJlYWQgd2lsbCBzdGFydCBpbW1lZGlhdGVseSB3aXRoIHRoZSBmaXJzdCBjaHVuay4KKyAgICAgKi8KKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZCh0aWRzLG1heGl0ZXIpCisgICAgewkvKiBiZWdpbiBvZiBwYXJhbGxlbCAqLworICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgIGRvdWJsZSBjb3VudDsKKyAgICAgIGludCB0aWQ7CisgICAgICBpbnQgajsKKworICAgICAgdGlkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCisjcHJhZ21hIG9tcCBmb3Igbm93YWl0IDxvbXB0czpjaGVjaz5zY2hlZHVsZShndWlkZWQpPC9vbXB0czpjaGVjaz4KKyAgICAgIGZvcihqID0gMDsgaiA8IENGU01BWF9TSVpFOyArK2opCisgICAgICB7CisJY291bnQgPSAwLjsKKyNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIpCisJaWYgKGogPiBtYXhpdGVyKQorCXsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJICB7CisJICAgIG1heGl0ZXIgPSBqOworCSAgfQkvKiBlbmQgb2YgY3JpdGljYWwgKi8gCisJfQorCS8qcHJpbnRmICgidGhyZWFkICVkIHNsZWVwaW5nXG4iLCB0aWQpOyovCisjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyLG5vdG91dCkJCisJd2hpbGUgKG5vdG91dCAmJiAoY291bnQgPCBNQVhfVElNRSkgJiYgKG1heGl0ZXIgPT0gaikpCisJeworI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCisJICBteV9zbGVlcCAoU0xFRVBUSU1FKTsKKwkgIGNvdW50ICs9IFNMRUVQVElNRTsKKyNpZmRlZiBWRVJCT1NFCisJICBwcmludGYoIi4iKTsKKyNlbmRpZgorCX0KKyNpZmRlZiBWRVJCT1NFCisJaWYgKGNvdW50ID4gMC4pIHByaW50ZigiIHdhaXRlZCAlbGYgc1xuIiwgY291bnQpOworI2VuZGlmCisJLypwcmludGYgKCJ0aHJlYWQgJWQgYXdha2VcbiIsIHRpZCk7Ki8KKwl0aWRzW2pdID0gdGlkOworI2lmZGVmIFZFUkJPU0UKKwlwcmludGYoIiVkIGZpbmlzaGVkIGJ5ICVkXG4iLGosdGlkKTsKKyNlbmRpZgorICAgICAgfQkvKiBlbmQgb2YgZm9yICovCisKKyAgICAgIG5vdG91dCA9IDA7CisjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyLG5vdG91dCkKKyAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0JLyogZW5kIG9mIHBhcmFsbGVsICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBldmFsdWF0aW9uIG9mIHRoZSB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJeworCSAgaW50IGRldGVybWluZWRfY2h1bmtzaXplID0gMTsKKwkgIGludCBsYXN0X3RocmVhZG5yID0gdGlkc1swXTsKKwkgIGludCBnbG9iYWxfY2h1bmtuciA9IDA7CisJICBpbnQgbG9jYWxfY2h1bmtucltOVU1CRVJfT0ZfVEhSRUFEU107CisJICBpbnQgb3BlbndvcmsgPSBDRlNNQVhfU0laRTsKKwkgIGludCBleHBlY3RlZF9jaHVua19zaXplOworCSAgZG91YmxlIGMgPSAxOworCisJICBmb3IgKGkgPSAwOyBpIDwgTlVNQkVSX09GX1RIUkVBRFM7IGkrKykKKwkJbG9jYWxfY2h1bmtucltpXSA9IDA7CisKKwkgIHRpZHNbQ0ZTTUFYX1NJWkVdID0gLTE7CisKKyAgICAgIC8qCisJICAgKiBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBnbG9iYWwgY2h1bmtzCisJICAgKi8KKwkgIC8qZnByaW50Zihsb2dGaWxlLCIjIGdsb2JhbF9jaHVua25yIHRocmVhZCBsb2NhbF9jaHVua25yIGNodW5rc2l6ZVxuIik7ICovCisJICBmb3IoaSA9IDE7IGkgPD0gQ0ZTTUFYX1NJWkU7ICsraSkKKwkgIHsKKwkJaWYgKGxhc3RfdGhyZWFkbnI9PXRpZHNbaV0pIHsgCisJCSAgZGV0ZXJtaW5lZF9jaHVua3NpemUrKzsgCisJCX0KKwkJZWxzZQorCQl7CisJCSAgLyogZnByaW50ZiAobG9nRmlsZSwgIiVkXHQlZFx0JWRcdCVkXG4iLCBnbG9iYWxfY2h1bmtucixsYXN0X3RocmVhZG5yLCBsb2NhbF9jaHVua25yW2xhc3RfdGhyZWFkbnJdLCBtKTsgKi8KKwkJICBnbG9iYWxfY2h1bmtucisrOworCQkgIGxvY2FsX2NodW5rbnJbbGFzdF90aHJlYWRucl0rKzsKKwkJICBsYXN0X3RocmVhZG5yID0gdGlkc1tpXTsKKwkJICBkZXRlcm1pbmVkX2NodW5rc2l6ZSA9IDE7CisJCX0KKwkgIH0KKwkgIC8qIG5vdyBhbGxvY2F0ZSB0aGUgbWVtb3J5IGZvciBzYXZpbmcgdGhlIHNpemVzIG9mIHRoZSBnbG9iYWwgY2h1bmtzICovCisJICBjaHVua3NpemVzID0gKGludCopbWFsbG9jKGdsb2JhbF9jaHVua25yICogc2l6ZW9mKGludCkpOworCisgICAgICAvKgorCSAgICogRXZhbHVhdGUgdGhlIHNpemVzIG9mIHRoZSBnbG9iYWwgY2h1bmtzCisJICAgKi8KKwkgIGdsb2JhbF9jaHVua25yID0gMDsKKwkgIGRldGVybWluZWRfY2h1bmtzaXplID0gMTsKKwkgIGxhc3RfdGhyZWFkbnIgPSB0aWRzWzBdOwkgICAgCisJICBmb3IgKGkgPSAxOyBpIDw9IENGU01BWF9TSVpFOyArK2kpCisJICB7CisJCS8qIElmIHRoZSB0aHJlYWRudW1iZXIgd2FzIHRoZSBzYW1lIGFzIGJlZm9yZSBpbmNyZWFzZSB0aGUgZGV0ZWN0ZWQgY2h1bmtzaXplIGZvciB0aGlzIGNodW5rCisJCSAqIG90aGVyd2lzZSBzZXQgdGhlIGRldGVjdGVkIGNodW5rc2l6ZSBhZ2FpbiB0byBvbmUgYW5kIHNhdmUgdGhlIG51bWJlciBvZiB0aGUgbmV4dCB0aHJlYWQgaW4gbGFzdF90aHJlYWRuci4gCisJCSAqLworCQlpZiAobGFzdF90aHJlYWRuciA9PSB0aWRzW2ldKSB7IAorCQkgIGRldGVybWluZWRfY2h1bmtzaXplKys7IAorCQl9CisJCWVsc2UgeworCQkgIGNodW5rc2l6ZXNbZ2xvYmFsX2NodW5rbnJdID0gZGV0ZXJtaW5lZF9jaHVua3NpemU7CisJCSAgZ2xvYmFsX2NodW5rbnIrKzsKKwkJICBsb2NhbF9jaHVua25yW2xhc3RfdGhyZWFkbnJdKys7CisJCSAgbGFzdF90aHJlYWRuciA9IHRpZHNbaV07CisJCSAgZGV0ZXJtaW5lZF9jaHVua3NpemUgPSAxOworCQl9CisJICB9CisKKyNpZmRlZiBWRVJCT1NFCisJICBmcHJpbnRmIChsb2dGaWxlLCAiZm91bmRcdGV4cGVjdGVkXHRjb25zdGFudFxuIik7CisjZW5kaWYKKworCSAgLyogaWRlbnRpZnkgdGhlIGNvbnN0YW50IGMgZm9yIHRoZSBleHBvbmVudGlhbCBkZWNyZWFzZSBvZiB0aGUgY2h1bmtzaXplICovCisJICBleHBlY3RlZF9jaHVua19zaXplID0gb3BlbndvcmsgLyB0aHJlYWRzOworCSAgYyA9IChkb3VibGUpIGNodW5rc2l6ZXNbMF0gLyBleHBlY3RlZF9jaHVua19zaXplOworCSAgCisJICBmb3IgKGkgPSAwOyBpIDwgZ2xvYmFsX2NodW5rbnI7IGkrKykKKwkgIHsKKwkJLyogY2FsY3VsYXRlIHRoZSBuZXcgZXhwZWN0ZWQgY2h1bmtzaXplICovCisJCWlmIChleHBlY3RlZF9jaHVua19zaXplID4gMSkgCisJCSAgZXhwZWN0ZWRfY2h1bmtfc2l6ZSA9IGMgKiBvcGVud29yayAvIHRocmVhZHM7CisJCQorI2lmZGVmIFZFUkJPU0UKKwkJZnByaW50ZiAobG9nRmlsZSwgIiU4ZFx0JThkXHQlbGZcbiIsIGNodW5rc2l6ZXNbaV0sIGV4cGVjdGVkX2NodW5rX3NpemUsIGMgKiBjaHVua3NpemVzW2ldL2V4cGVjdGVkX2NodW5rX3NpemUpOworI2VuZGlmCisJCQorCQkvKiBjaGVjayBpZiBjaHVua3NpemUgaXMgaW5zaWRlIHRoZSByb3VuZGluZyBlcnJvcnMgKi8KKwkJaWYgKGFicyAoY2h1bmtzaXplc1tpXSAtIGV4cGVjdGVkX2NodW5rX3NpemUpID49IDIpIHsKKwkJICByZXN1bHQgPSAwOworI2lmbmRlZiBWRVJCT1NFCisJCSAgZnByaW50ZiAobG9nRmlsZSwgIkNodW5rc2l6ZSBkaWZmZXJlZCBmcm9tIGV4cGVjdGVkIHZhbHVlOiAlZCBpbnN0ZWFkIG9mICVkXG4iLCBjaHVua3NpemVzW2ldLCBleHBlY3RlZF9jaHVua19zaXplKTsKKwkJICByZXR1cm4gMDsKKyNlbmRpZgorCQl9IC8qIGVuZCBpZiAqLworCisjaWZuZGVmIFZFUkJPU0UKKwkJaWYgKGV4cGVjdGVkX2NodW5rX3NpemUgLSBjaHVua3NpemVzW2ldIDwgMCApCisJCSAgZnByaW50ZiAobG9nRmlsZSwgIkNodW5rc2l6ZSBkaWQgbm90IGRlY3JlYXNlOiAlZCBpbnN0ZWFkIG9mICVkXG4iLCBjaHVua3NpemVzW2ldLGV4cGVjdGVkX2NodW5rX3NpemUpOworI2VuZGlmCisKKwkJLyogY2FsY3VsYXRpbmcgdGhlIHJlbWFpbmluZyBhbW91bnQgb2Ygd29yayAqLworCQlvcGVud29yayAtPSBjaHVua3NpemVzW2ldOworCSAgfQkKKwl9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CisKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MWQ3ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpYy5jCkBAIC0wLDAgKzEsMTY1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIHN0YXRpYyBvcHRpb24gb2YgdGhlIG9tcCBmb3Igc2NoZWR1bGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIHNjaGVkdWxlKHN0YXRpYyk8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZm9yIG5vd2FpdCxvbXAgZmx1c2gsb21wIGNyaXRpY2FsLG9tcCBzaW5nbGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKKyNkZWZpbmUgTlVNQkVSX09GX1RIUkVBRFMgMTAKKyNkZWZpbmUgQ0ZTTUFYX1NJWkUgMTAwMAorI2RlZmluZSBNQVhfVElNRSAwLjAxCisKKyNpZmRlZiBTTEVFUFRJTUUKKyN1bmRlZiBTTEVFUFRJTUUKKyNkZWZpbmUgU0xFRVBUSU1FIDAuMDAwNQorI2VuZGlmCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9zY2hlZHVsZV9zdGF0aWM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICBpbnQgdGhyZWFkczsKKyAgaW50IGksbGFzdHRpZDsKKyAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgKiB0aWRzOworICBpbnQgbm90b3V0OworICBpbnQgbWF4aXRlcjsKKyAgaW50IGNodW5rX3NpemU7CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBjb3VudGVyID0gMDsKKyAgaW50IHRtcF9jb3VudD0xOworICBpbnQgbGFzdHRocmVhZHNzdGFydHRpZCA9IC0xOworICBpbnQgcmVzdWx0ID0gMTsKKyAgY2h1bmtfc2l6ZSA9IDc7CisKKyAgdGlkcyA9IChpbnQgKikgbWFsbG9jIChzaXplb2YgKGludCkgKiAoQ0ZTTUFYX1NJWkUgKyAxKSk7CisgIG5vdG91dCA9IDE7CisgIG1heGl0ZXIgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcyxjb3VudGVyKQorICB7CS8qIGJlZ2luIG9mIHBhcmFsbGVsKi8KKyNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIHRocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzICgpOworICAgIH0JLyogZW5kIG9mIHNpbmdsZSAqLworICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgIGlmICh0aHJlYWRzIDwgMikKKyAgeworICAgIHByaW50ZiAoIlRoaXMgdGVzdCBvbmx5IHdvcmtzIHdpdGggYXQgbGVhc3QgdHdvIHRocmVhZHMiKTsKKyAgICBmcHJpbnRmIChsb2dGaWxlLCJUaGlzIHRlc3Qgb25seSB3b3JrcyB3aXRoIGF0IGxlYXN0IHR3byB0aHJlYWRzIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZWxzZSAKKyAgeworICAgIGZwcmludGYgKGxvZ0ZpbGUsIlVzaW5nIGFuIGludGVybmFsIGNvdW50IG9mICVkXG5Vc2luZyBhIHNwZWNpZmllZCBjaHVua3NpemUgb2YgJWRcbiIsIENGU01BWF9TSVpFLCBjaHVua19zaXplKTsKKyAgICB0aWRzW0NGU01BWF9TSVpFXSA9IC0xOwkvKiBzZXR0aW5nIGVuZGZsYWcgKi8KKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZCh0aWRzKQorICAgIHsJLyogYmVnaW4gb2YgcGFyYWxsZWwgKi8KKyAgICAgIDxvbXB0czpvcnBoYW4+CisJZG91YmxlIGNvdW50OworICAgICAgaW50IHRpZDsKKyAgICAgIGludCBqOworCisgICAgICB0aWQgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisKKyNwcmFnbWEgb21wIGZvciBub3dhaXQgPG9tcHRzOmNoZWNrPnNjaGVkdWxlKHN0YXRpYyxjaHVua19zaXplKTwvb21wdHM6Y2hlY2s+CisgICAgICBmb3IoaiA9IDA7IGogPCBDRlNNQVhfU0laRTsgKytqKQorICAgICAgeworCWNvdW50ID0gMC47CisjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyKQorCWlmIChqID4gbWF4aXRlcikKKwl7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCSAgeworCSAgICBtYXhpdGVyID0gajsKKwkgIH0JLyogZW5kIG9mIGNyaXRpY2FsICovIAorCX0KKwkvKnByaW50ZiAoInRocmVhZCAlZCBzbGVlcGluZ1xuIiwgdGlkKTsqLworCXdoaWxlIChub3RvdXQgJiYgKGNvdW50IDwgTUFYX1RJTUUpICYmIChtYXhpdGVyID09IGopKQorCXsKKyNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIsbm90b3V0KQorCSAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisJICBjb3VudCArPSBTTEVFUFRJTUU7CisJICBwcmludGYoIi4iKTsKKwl9CisjaWZkZWYgVkVSQk9TRQorCWlmIChjb3VudCA+IDAuKSBwcmludGYoIiB3YWl0ZWQgJWxmIHNcbiIsIGNvdW50KTsKKyNlbmRpZgorCS8qcHJpbnRmICgidGhyZWFkICVkIGF3YWtlXG4iLCB0aWQpOyovCisJdGlkc1tqXSA9IHRpZDsKKyNpZmRlZiBWRVJCT1NFCisJcHJpbnRmKCIlZCBmaW5pc2hlZCBieSAlZFxuIixqLHRpZCk7CisjZW5kaWYKKyAgICAgIH0JLyogZW5kIG9mIGZvciAqLworCisgICAgICBub3RvdXQgPSAwOworI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCisgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgICAgLyoqKiogYW5hbHlzaW5nIHRoZSBkYXRhIGluIGFycmF5IHRpZHMgKioqKi8KKworICAgIGxhc3R0aWQgPSB0aWRzWzBdOworICAgIHRtcF9jb3VudCA9IDA7IAorCisgICAgZm9yIChpID0gMDsgaSA8IENGU01BWF9TSVpFICsgMTsgKytpKQorICAgIHsKKyAgICAgIC8qIElmIHRoZSB3b3JrICB3YXMgZG9uZSBieSB0aGUgc2FtZSB0aHJlYWQgaW5jcmVhc2UgdG1wX2NvdW50IGJ5IG9uZS4gKi8KKyAgICAgIGlmICh0aWRzW2ldID09IGxhc3R0aWQpIHsKKwl0bXBfY291bnQrKzsKKyNpZmRlZiBWRVJCT1NFCisJZnByaW50ZiAobG9nRmlsZSwgIiVkOiAlZCBcbiIsIGksIHRpZHNbaV0pOworI2VuZGlmCisJY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8qIENoZWNrIGlmIHRoZSBuZXh0IHRocmVhZCBoYWQgaGFzIHRoZSByaWdodCB0aHJlYWQgbnVtYmVyLiBXaGVuIGZpbmRpbmcgCisgICAgICAgKiB0aHJlYWRudW1iZXIgLTEgdGhlIGVuZCBzaG91bGQgYmUgcmVhY2hlZC4gCisgICAgICAgKi8JICAKKyAgICAgIGlmICh0aWRzW2ldID09IChsYXN0dGlkICsgMSkgJSB0aHJlYWRzIHx8IHRpZHNbaV0gPT0gLTEpIHsKKwkvKiBjaGVja2luZyBmb3IgdGhlIHJpZ2h0IGNodW5rIHNpemUgKi8KKwlpZiAodG1wX2NvdW50ID09IGNodW5rX3NpemUpIHsKKwkgIHRtcF9jb3VudCA9IDE7CisJICBsYXN0dGlkID0gdGlkc1tpXTsKKyNpZmRlZiBWRVJCT1NFCisJICBmcHJpbnRmIChsb2dGaWxlLCAiT0tcbiIpOworI2VuZGlmCisJfQorCS8qIElmIHRoZSBjaHVuayBzaXplIHdhcyB3cm9uZywgY2hlY2sgaWYgdGhlIGVuZCB3YXMgcmVhY2hlZCAqLworCWVsc2UgeworCSAgaWYgKHRpZHNbaV0gPT0gLTEpIHsKKwkgICAgaWYgKGkgPT0gQ0ZTTUFYX1NJWkUpIHsKKwkgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiTGFzdCB0aHJlYWQgaGFkIGNodW5rIHNpemUgJWRcbiIsIHRtcF9jb3VudCk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgICAgZWxzZSB7CisJICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkVSUk9SOiBMYXN0IHRocmVhZCAodGhyZWFkIHdpdGggbnVtYmVyIC0xKSB3YXMgZm91bmQgYmVmb3JlIHRoZSBlbmQuXG4iKTsKKwkgICAgICByZXN1bHQgPSAwOworCSAgICB9CisJICB9CisJICBlbHNlIHsKKwkgICAgZnByaW50ZiAobG9nRmlsZSwgIkVSUk9SOiBjaHVuayBzaXplIHdhcyAlZC4gKGFzc2lnbmVkIHdhcyAlZClcbiIsIHRtcF9jb3VudCwgY2h1bmtfc2l6ZSk7CisJICAgIHJlc3VsdCA9IDA7CisJICB9CisJfQorICAgICAgfQorICAgICAgZWxzZSB7CisJZnByaW50Zihsb2dGaWxlLCAiRVJST1I6IEZvdW5kIHRocmVhZCB3aXRoIG51bWJlciAlZCAoc2hvdWxkIGJlIGluYmV0d2VlbiAwIGFuZCAlZCkuIiwgdGlkc1tpXSwgdGhyZWFkcyAtIDEpOworCXJlc3VsdCA9IDA7CisgICAgICB9CisjaWZkZWYgVkVSQk9TRQorICAgICAgZnByaW50ZiAobG9nRmlsZSwgIiVkOiAlZCBcbiIsIGksIHRpZHNbaV0pOworI2VuZGlmCisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpY18zLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpY18zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI4NjY3ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljXzMuYwpAQCAtMCwwICsxLDIxMiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBzdGF0aWMgb3B0aW9uIG9mIHRoZSBvbXAgZm9yIHNjaGVkdWxlIGRpcmVjdGl2ZSBjb25zaWRlcmluZyB0aGUgc3BlY2lmaWNhdGlvbnMgZm9yIHRoZSBjaHVuayBkaXN0cmlidXRpb24gb2Ygc2V2ZXJhbCBsb29wIHJlZ2lvbnMgaXMgdGhlIHNhbWUgYXMgc3BlY2lmaWVkIGluIHRoZSBPcGVuIE1QIHN0YW5kYXJkIHZlcnNpb24gMy4wLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIHNjaGVkdWxlKHN0YXRpYyk8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZm9yIG5vd2FpdCxvbXAgZmx1c2gsb21wIGNyaXRpY2FsLG9tcCBzaW5nbGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKKyNkZWZpbmUgTlVNQkVSX09GX1RIUkVBRFMgMTAKKyNkZWZpbmUgQ0ZTTUFYX1NJWkUgMTAwMAorI2RlZmluZSBNQVhfVElNRSAwLjAxCisKKyNpZmRlZiBTTEVFUFRJTUUKKyN1bmRlZiBTTEVFUFRJTUUKKyNkZWZpbmUgU0xFRVBUSU1FIDAuMDAwNQorI2VuZGlmCisKKyNkZWZpbmUgVkVSQk9TRSAwCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9zY2hlZHVsZV9zdGF0aWNfMzwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgIGludCB0aHJlYWRzOworICBpbnQgaSxsYXN0dGlkOworICA8b21wdHM6b3JwaGFuOnZhcnM+CisgIGludCAqIHRpZHM7CisgIGludCAqIHRpZHMyOworICBpbnQgbm90b3V0OworICBpbnQgbWF4aXRlcjsKKyAgaW50IGNodW5rX3NpemU7CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBjb3VudGVyID0gMDsKKyAgaW50IHRtcF9jb3VudD0xOworICBpbnQgbGFzdHRocmVhZHNzdGFydHRpZCA9IC0xOworICBpbnQgcmVzdWx0ID0gMTsKKyAgY2h1bmtfc2l6ZSA9IDc7CisKKyAgdGlkcyA9IChpbnQgKikgbWFsbG9jIChzaXplb2YgKGludCkgKiAoQ0ZTTUFYX1NJWkUgKyAxKSk7CisgIG5vdG91dCA9IDE7CisgIG1heGl0ZXIgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcyxjb3VudGVyKQorICB7CS8qIGJlZ2luIG9mIHBhcmFsbGVsKi8KKyNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIHRocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzICgpOworICAgIH0JLyogZW5kIG9mIHNpbmdsZSAqLworICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgIGlmICh0aHJlYWRzIDwgMikKKyAgeworICAgIHByaW50ZiAoIlRoaXMgdGVzdCBvbmx5IHdvcmtzIHdpdGggYXQgbGVhc3QgdHdvIHRocmVhZHMiKTsKKyAgICBmcHJpbnRmIChsb2dGaWxlLCJUaGlzIHRlc3Qgb25seSB3b3JrcyB3aXRoIGF0IGxlYXN0IHR3byB0aHJlYWRzIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZWxzZSAKKyAgeworICAgIGZwcmludGYgKGxvZ0ZpbGUsIlVzaW5nIGFuIGludGVybmFsIGNvdW50IG9mICVkXG5Vc2luZyBhIHNwZWNpZmllZCBjaHVua3NpemUgb2YgJWRcbiIsIENGU01BWF9TSVpFLCBjaHVua19zaXplKTsKKyAgICB0aWRzW0NGU01BWF9TSVpFXSA9IC0xOwkvKiBzZXR0aW5nIGVuZGZsYWcgKi8KKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZCh0aWRzKQorICAgIHsJLyogYmVnaW4gb2YgcGFyYWxsZWwgKi8KKyAgICAgIDxvbXB0czpvcnBoYW4+CisJZG91YmxlIGNvdW50OworICAgICAgaW50IHRpZDsKKyAgICAgIGludCBqOworCisgICAgICB0aWQgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisKKyNwcmFnbWEgb21wIGZvciBub3dhaXQgPG9tcHRzOmNoZWNrPnNjaGVkdWxlKHN0YXRpYyxjaHVua19zaXplKTwvb21wdHM6Y2hlY2s+CisgICAgICBmb3IoaiA9IDA7IGogPCBDRlNNQVhfU0laRTsgKytqKQorICAgICAgeworCWNvdW50ID0gMC47CisjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyKQorCWlmIChqID4gbWF4aXRlcikKKwl7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCSAgeworCSAgICBtYXhpdGVyID0gajsKKwkgIH0JLyogZW5kIG9mIGNyaXRpY2FsICovIAorCX0KKwkvKnByaW50ZiAoInRocmVhZCAlZCBzbGVlcGluZ1xuIiwgdGlkKTsqLworCXdoaWxlIChub3RvdXQgJiYgKGNvdW50IDwgTUFYX1RJTUUpICYmIChtYXhpdGVyID09IGopKQorCXsKKyNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIsbm90b3V0KQorCSAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisJICBjb3VudCArPSBTTEVFUFRJTUU7CisJICBwcmludGYoIi4iKTsKKwl9CisjaWZkZWYgVkVSQk9TRQorCWlmIChjb3VudCA+IDAuKSBwcmludGYoIiB3YWl0ZWQgJWxmIHNcbiIsIGNvdW50KTsKKyNlbmRpZgorCS8qcHJpbnRmICgidGhyZWFkICVkIGF3YWtlXG4iLCB0aWQpOyovCisJdGlkc1tqXSA9IHRpZDsKKyNpZmRlZiBWRVJCT1NFCisJcHJpbnRmKCIlZCBmaW5pc2hlZCBieSAlZFxuIixqLHRpZCk7CisjZW5kaWYKKyAgICAgIH0JLyogZW5kIG9mIGZvciAqLworCisgICAgICBub3RvdXQgPSAwOworI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCisgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgICAgLyoqKiogYW5hbHlzaW5nIHRoZSBkYXRhIGluIGFycmF5IHRpZHMgKioqKi8KKworICAgIGxhc3R0aWQgPSB0aWRzWzBdOworICAgIHRtcF9jb3VudCA9IDA7IAorCisgICAgZm9yIChpID0gMDsgaSA8IENGU01BWF9TSVpFICsgMTsgKytpKQorICAgIHsKKyAgICAgIC8qIElmIHRoZSB3b3JrICB3YXMgZG9uZSBieSB0aGUgc2FtZSB0aHJlYWQgaW5jcmVhc2UgdG1wX2NvdW50IGJ5IG9uZS4gKi8KKyAgICAgIGlmICh0aWRzW2ldID09IGxhc3R0aWQpIHsKKwl0bXBfY291bnQrKzsKKyNpZmRlZiBWRVJCT1NFCisJZnByaW50ZiAobG9nRmlsZSwgIiVkOiAlZCBcbiIsIGksIHRpZHNbaV0pOworI2VuZGlmCisJY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8qIENoZWNrIGlmIHRoZSBuZXh0IHRocmVhZCBoYWQgaGFzIHRoZSByaWdodCB0aHJlYWQgbnVtYmVyLiBXaGVuIGZpbmRpbmcgCisgICAgICAgKiB0aHJlYWRudW1iZXIgLTEgdGhlIGVuZCBzaG91bGQgYmUgcmVhY2hlZC4gCisgICAgICAgKi8JICAKKyAgICAgIGlmICh0aWRzW2ldID09IChsYXN0dGlkICsgMSkgJSB0aHJlYWRzIHx8IHRpZHNbaV0gPT0gLTEpIHsKKwkvKiBjaGVja2luZyBmb3IgdGhlIHJpZ2h0IGNodW5rIHNpemUgKi8KKwlpZiAodG1wX2NvdW50ID09IGNodW5rX3NpemUpIHsKKwkgIHRtcF9jb3VudCA9IDE7CisJICBsYXN0dGlkID0gdGlkc1tpXTsKKyNpZmRlZiBWRVJCT1NFCisJICBmcHJpbnRmIChsb2dGaWxlLCAiT0tcbiIpOworI2VuZGlmCisJfQorCS8qIElmIHRoZSBjaHVuayBzaXplIHdhcyB3cm9uZywgY2hlY2sgaWYgdGhlIGVuZCB3YXMgcmVhY2hlZCAqLworCWVsc2UgeworCSAgaWYgKHRpZHNbaV0gPT0gLTEpIHsKKwkgICAgaWYgKGkgPT0gQ0ZTTUFYX1NJWkUpIHsKKwkgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiTGFzdCB0aHJlYWQgaGFkIGNodW5rIHNpemUgJWRcbiIsIHRtcF9jb3VudCk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgICAgZWxzZSB7CisJICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkVSUk9SOiBMYXN0IHRocmVhZCAodGhyZWFkIHdpdGggbnVtYmVyIC0xKSB3YXMgZm91bmQgYmVmb3JlIHRoZSBlbmQuXG4iKTsKKwkgICAgICByZXN1bHQgPSAwOworCSAgICB9CisJICB9CisJICBlbHNlIHsKKwkgICAgZnByaW50ZiAobG9nRmlsZSwgIkVSUk9SOiBjaHVuayBzaXplIHdhcyAlZC4gKGFzc2lnbmVkIHdhcyAlZClcbiIsIHRtcF9jb3VudCwgY2h1bmtfc2l6ZSk7CisJICAgIHJlc3VsdCA9IDA7CisJICB9CisJfQorICAgICAgfQorICAgICAgZWxzZSB7CisJZnByaW50Zihsb2dGaWxlLCAiRVJST1I6IEZvdW5kIHRocmVhZCB3aXRoIG51bWJlciAlZCAoc2hvdWxkIGJlIGluYmV0d2VlbiAwIGFuZCAlZCkuIiwgdGlkc1tpXSwgdGhyZWFkcyAtIDEpOworCXJlc3VsdCA9IDA7CisgICAgICB9CisjaWZkZWYgVkVSQk9TRQorICAgICAgZnByaW50ZiAobG9nRmlsZSwgIiVkOiAlZCBcbiIsIGksIHRpZHNbaV0pOworI2VuZGlmCisgICAgfQorICB9CisKKyAgLyogTm93IHdlIGNoZWNrIGlmIHNldmVyYWwgbG9vcCByZWdpb25zIGluIG9uZSBwYXJhbGxlbCByZWdpb24gaGF2ZSB0aGUgc2FtZSAKKyAgICogbG9naWNhbCBhc3NpZ25lbWVudCBvZiBjaHVua3MgdG8gdGhyZWFkcy4KKyAgICogV2UgdXNlIHRoZSBub3dhaXQgY2xhdXNlIHRvIGluY3JlYXNlIHRoZSBwcm9iYWJpbGl0eSB0byBnZXQgYW4gZXJyb3IuICovCisKKyAgLyogRmlyc3Qgd2UgYWxsb2NhdGUgc29tZSBtb3JlIG1lbW1vcnkgKi8KKyBmcmVlICh0aWRzKTsKKyAgdGlkcyA9IChpbnQgKikgbWFsbG9jIChzaXplb2YgKGludCkgKiBMT09QQ09VTlQpOworICB0aWRzMiA9IChpbnQgKikgbWFsbG9jIChzaXplb2YgKGludCkgKiBMT09QQ09VTlQpOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgeworICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgIHsKKyAgICAgICAgICBpbnQgbjsKKyNwcmFnbWEgb21wIGZvciA8b21wdHM6Y2hlY2s+c2NoZWR1bGUoc3RhdGljKTwvb21wdHM6Y2hlY2s+IG5vd2FpdAorICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBMT09QQ09VTlQ7IG4rKykKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmIChMT09QQ09VTlQgPT0gbiArIDEgKQorICAgICAgICAgICAgICAgICAgbXlfc2xlZXAoU0xFRVBUSU1FKTsKKworICAgICAgICAgICAgICB0aWRzW25dID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgeworICAgICAgICAgIGludCBtOworI3ByYWdtYSBvbXAgZm9yIDxvbXB0czpjaGVjaz5zY2hlZHVsZShzdGF0aWMpPC9vbXB0czpjaGVjaz4gbm93YWl0CisgICAgICAgICAgZm9yIChtID0gMTsgbSA8PSBMT09QQ09VTlQ7IG0rKykKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIHRpZHMyW20tMV0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKyAgICAgIGlmICh0aWRzW2ldICE9IHRpZHMyW2ldKSB7CisgICAgICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkNodW5rIG5vLiAlZCB3YXMgYXNzaWduZWQgb25jZSB0byB0aHJlYWQgJWQgYW5kIGxhdGVyIHRvIHRocmVhZCAlZC5cbiIsIGksIHRpZHNbaV0sdGlkczJbaV0pOworICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICB9CisKKyAgZnJlZSAodGlkcyk7CisgIGZyZWUgKHRpZHMyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZ2V0X251bV90aHJlYWRzLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZ2V0X251bV90aHJlYWRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIwOTJiYQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9nZXRfbnVtX3RocmVhZHMuYwpAQCAtMCwwICsxLDM5IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhhdCB0aGUgb21wX2dldF9udW1fdGhyZWFkcyByZXR1cm5zIHRoZSBjb3JyZWN0IG51bWJlciBvZiB0aHJlYWRzLiBUaGVyZWZvciBpdCBjb3VudHMgdXAgYSB2YXJpYWJsZSBpbiBhIHBhcmFsbGVsaXplZCBzZWN0aW9uIGFuZCBjb21wYXJzIHRoaXMgdmFsdWUgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBvbXBfZ2V0X251bV90aHJlYWRzIGZ1bmN0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfZ2V0X251bV90aHJlYWRzPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2dldF9udW1fdGhyZWFkczwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgLyogY2hlY2tzIHRoYXQgb21wX2dldF9udW1fdGhyZWFkcyBpcyBlcXVhbCB0byB0aGUgbnVtYmVyIG9mCisgICAgICAgdGhyZWFkcyAqLworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgbnRocmVhZHNfbGliOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IG50aHJlYWRzID0gMDsKKworICAgIG50aHJlYWRzX2xpYiA9IC0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgICAgbnRocmVhZHMrKzsKKwl9CS8qIGVuZCBvZiBjcml0aWNhbCAqLworI3ByYWdtYSBvbXAgc2luZ2xlCisJeyAKKzxvbXB0czpvcnBoYW4+CisJICAgIDxvbXB0czpjaGVjaz5udGhyZWFkc19saWIgPSBvbXBfZ2V0X251bV90aHJlYWRzICgpOzwvb21wdHM6Y2hlY2s+Cis8L29tcHRzOm9ycGhhbj4KKwl9CS8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisJZnByaW50ZiAobG9nRmlsZSwgIkNvdW50ZWQgJWQgdGhyZWFkcy4gZ2V0X251bV90aHJlYWRzIHJldHVybmVkICVkLlxuIiwgbnRocmVhZHMsIG50aHJlYWRzX2xpYik7CisgICAgcmV0dXJuIChudGhyZWFkcyA9PSBudGhyZWFkc19saWIpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9nZXRfd3RpY2suYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9nZXRfd3RpY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODJiNTdmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2dldF93dGljay5jCkBAIC0wLDAgKzEsMjQgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wX2dldF93dGljayBmdW5jdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2dldF93dGljazwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGU8c3RkaW8uaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2dldF93dGljazwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJZG91YmxlIHRpY2s7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICB0aWNrID0gLTEuOworCisgICAgPG9tcHRzOm9ycGhhbj4KKwk8b21wdHM6Y2hlY2s+dGljayA9IG9tcF9nZXRfd3RpY2sgKCk7PC9vbXB0czpjaGVjaz4KKyAgICA8L29tcHRzOm9ycGhhbj4KKyAgICBmcHJpbnRmIChsb2dGaWxlLCAiV29yayB0b29rICVsZiBzZWMuIHRpbWUuXG4iLCB0aWNrKTsKKyAgICByZXR1cm4gKCh0aWNrID4gMC4wKSAmJiAodGljayA8IDAuMDEpKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZ2V0X3d0aW1lLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfZ2V0X3d0aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwMjI2ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9nZXRfd3RpbWUuYwpAQCAtMCwwICsxLDM4IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF9nZXRfd3RpbWUgZnVuY3Rpb24uIEl0IGNvbXBhcmVzIHRoZSB0aW1lIHdpdGggd2hpY2ggaXMgY2FsbGVkIGEgc2xlZXAgZnVuY3Rpb24gd2l0aCB0aGUgdGltZSBpdCB0b29rIGJ5IG1lc3N1cmluZyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjYWxsIG9mIHRoZSBzbGVlcCBmdW5jdGlvbiBhbmQgaXRzIGVuZC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2dldF93dGltZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGU8c3RkaW8uaD4KKyNpbmNsdWRlPHN0ZGxpYi5oPgorI2luY2x1ZGU8dW5pc3RkLmg+CisKKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2dldF93dGltZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJZG91YmxlIHN0YXJ0OworCWRvdWJsZSBlbmQ7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBkb3VibGUgbWVhc3VyZWRfdGltZTsKKyAgICBpbnQgd2FpdF90aW1lID0gMTsgCisKKyAgICBzdGFydCA9IDA7CisgICAgZW5kID0gMDsKKworICAgIDxvbXB0czpvcnBoYW4+CisJPG9tcHRzOmNoZWNrPnN0YXJ0ID0gb21wX2dldF93dGltZSAoKTs8L29tcHRzOmNoZWNrPgorICAgIDwvb21wdHM6b3JwaGFuPgorCW15X3NsZWVwICh3YWl0X3RpbWUpOyAKKyAgICA8b21wdHM6b3JwaGFuPgorCTxvbXB0czpjaGVjaz5lbmQgPSBvbXBfZ2V0X3d0aW1lICgpOzwvb21wdHM6Y2hlY2s+CisgICAgPC9vbXB0czpvcnBoYW4+CisJbWVhc3VyZWRfdGltZSA9IGVuZC1zdGFydDsKKyAgICBmcHJpbnRmKGxvZ0ZpbGUsICJXb3JrIHRvb2sgJWxmIHNlYy4gdGltZS5cbiIsIG1lYXN1cmVkX3RpbWUpOworICAgIHJldHVybiAoKG1lYXN1cmVkX3RpbWUgPiAwLjk5ICogd2FpdF90aW1lKSAmJiAobWVhc3VyZWRfdGltZSA8IDEuMDEgKiB3YWl0X3RpbWUpKSA7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2luX3BhcmFsbGVsLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfaW5fcGFyYWxsZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWI2MTExCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2luX3BhcmFsbGVsLmMKQEAgLTAsMCArMSw1MSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoYXQgb21wX2luX3BhcmFsbGVsIHJldHVybnMgZmFsc2Ugd2hlbiBjYWxsZWQgZnJvbSBhIHNlcmlhbCByZWdpb24gYW5kIHRydWUgd2hlbiBjYWxsZWQgd2l0aGluIGEgcGFyYWxsZWwgcmVnaW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfaW5fcGFyYWxsZWw8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKy8qCisgKiBDaGVja3MgdGhhdCBmYWxzZSBpcyByZXR1cm5lZCB3aGVuIGNhbGxlZCBmcm9tIHNlcmlhbCByZWdpb24KKyAqIGFuZCB0cnVlIGlzIHJldHVybmVkIHdoZW4gY2FsbGVkIHdpdGhpbiBwYXJhbGxlbCByZWdpb24uIAorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9pbl9wYXJhbGxlbDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzZXJpYWw7CisJaW50IGlzcGFyYWxsZWw7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIHNlcmlhbCA9IDE7CisgICAgaXNwYXJhbGxlbCA9IDA7CisKKyAgICA8b21wdHM6Y2hlY2s+CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgc2VyaWFsID0gb21wX2luX3BhcmFsbGVsICgpOworCTwvb21wdHM6b3JwaGFuPgorCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyNwcmFnbWEgb21wIHNpbmdsZQorCXsKKwkgICAgPG9tcHRzOm9ycGhhbj4KKwkJaXNwYXJhbGxlbCA9IG9tcF9pbl9wYXJhbGxlbCAoKTsKKwkgICAgPC9vbXB0czpvcnBoYW4+CisJfQorICAgIH0KKyAgICA8L29tcHRzOmNoZWNrPgorCisgICAgPG9tcHRzOmNyb3NzY2hlY2s+CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKyNwcmFnbWEgb21wIHNpbmdsZQorCSAgICB7CisKKwkgICAgfQorCX0KKyAgICA8L29tcHRzOmNyb3NzY2hlY2s+CisKKwlyZXR1cm4gKCEoc2VyaWFsKSAmJiBpc3BhcmFsbGVsKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfbG9jay5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTI5YzA3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX2xvY2suYwpAQCAtMCwwICsxLDQ1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF9zZXRfbG9jayAgYW5kIHRoZSBvbXBfdW5zZXRfbG9jayBmdW5jdGlvbiBieSBjb3VudGluZyB0aGUgdGhyZWFkcyBlbnRlcmluZyBhbmQgZXhpdGluZyBhIHNpbmdsZSByZWdpb24gd2l0aCBsb2Nrcy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2xvY2s8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitvbXBfbG9ja190IGxjazsKKyAgICAKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9sb2NrPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICBpbnQgbnJfdGhyZWFkc19pbl9zaW5nbGUgPSAwOworICBpbnQgcmVzdWx0ID0gMDsKKyAgaW50IG5yX2l0ZXJhdGlvbnMgPSAwOworICBpbnQgaTsKKyAgb21wX2luaXRfbG9jayAoJmxjayk7CisgIAorI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKGxjaykKKyAgeworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvcihpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorICAgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIDxvbXB0czpjaGVjaz5vbXBfc2V0X2xvY2sgKCZsY2spOzwvb21wdHM6Y2hlY2s+CisJPC9vbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBmbHVzaAorCW5yX3RocmVhZHNfaW5fc2luZ2xlKys7CisjcHJhZ21hIG9tcCBmbHVzaCAgICAgICAgICAgCisJbnJfaXRlcmF0aW9ucysrOworCW5yX3RocmVhZHNfaW5fc2luZ2xlLS07CisJcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgPG9tcHRzOmNoZWNrPm9tcF91bnNldF9sb2NrKCZsY2spOzwvb21wdHM6Y2hlY2s+CisJPC9vbXB0czpvcnBoYW4+CisgICAgICB9CisgIH0KKyAgb21wX2Rlc3Ryb3lfbG9jayAoJmxjayk7CisgIAorICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7CisgIAorfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9tYXN0ZXIuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9tYXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGIyZjFlCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX21hc3Rlci5jCkBAIC0wLDAgKzEsMzcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIG1hc3RlciBkaXJlY3RpdmUgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIG9tcCBtYXN0ZXIgc2VjdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIG1hc3Rlcjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9tYXN0ZXI8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBudGhyZWFkczsKKwlpbnQgZXhlY3V0aW5nX3RocmVhZDsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgbnRocmVhZHMgPSAwOworICAgIGV4ZWN1dGluZ190aHJlYWQgPSAtMTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIG1hc3RlciA8L29tcHRzOmNoZWNrPgorCSAgICB7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQl7CisJCSAgICBudGhyZWFkcysrOworCQl9CisJCWV4ZWN1dGluZ190aHJlYWQgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisKKwkgICAgfSAvKiBlbmQgb2YgbWFzdGVyKi8KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCovCisgICAgcmV0dXJuICgobnRocmVhZHMgPT0gMSkgJiYgKGV4ZWN1dGluZ190aHJlYWQgPT0gMCkpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9tYXN0ZXJfMy5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX21hc3Rlcl8zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU5ODEyOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9tYXN0ZXJfMy5jCkBAIC0wLDAgKzEsNDQgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIG1hc3RlciBkaXJlY3RpdmUgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIG9tcCBtYXN0ZXIgc2VjdGlvbi4gSXQgYWxzbyBjaGVja3MgdGhhdCB0aGUgbWFzdGVyIHRocmVhZCBoYXMgdGhlIHRocmVhZCBudW1iZXIgMCBhcyBzcGVjaWZpZWQgaW4gdGhlIE9wZW4gTVAgc3RhbmRhcmQgdmVyc2lvbiAzLjAuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBtYXN0ZXI8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfbWFzdGVyXzM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBudGhyZWFkczsKKwlpbnQgZXhlY3V0aW5nX3RocmVhZDsKKyAgICAgICAgaW50IHRpZF9yZXN1bHQgPSAwOyAvKiBjb3VudHMgdXAgdGhlIG51bWJlciBvZiB3cm9uZyB0aHJlYWQgbm8uIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXN0ZXIgdGhyZWFkLiAoTXVzdCBiZSAwKSAqLworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBudGhyZWFkcyA9IDA7CisgICAgZXhlY3V0aW5nX3RocmVhZCA9IC0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgbWFzdGVyIDwvb21wdHM6Y2hlY2s+CisJICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgdGlkID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgICAgICAgaWYgKHRpZCAhPSAwKSB7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgICAgICAgICAgICAgICB7IHRpZF9yZXN1bHQrKzsgfQorICAgICAgICAgICAgICAgIH0KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCXsKKwkJICAgIG50aHJlYWRzKys7CisJCX0KKwkJZXhlY3V0aW5nX3RocmVhZCA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKworCSAgICB9IC8qIGVuZCBvZiBtYXN0ZXIqLworCTwvb21wdHM6b3JwaGFuPgorICAgIH0gLyogZW5kIG9mIHBhcmFsbGVsKi8KKyAgICByZXR1cm4gKChudGhyZWFkcyA9PSAxKSAmJiAoZXhlY3V0aW5nX3RocmVhZCA9PSAwKSAmJiAodGlkX3Jlc3VsdCA9PSAwKSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX25lc3RfbG9jay5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX25lc3RfbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZGUzODkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfbmVzdF9sb2NrLmMKQEAgLTAsMCArMSw0NSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXBfc2V0X25lc3RfbG9jayBhbmQgdGhlIG9tcF91bnNldF9uZXN0X2xvY2sgZnVuY3Rpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF9uZXN0X2xvY2s8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitvbXBfbmVzdF9sb2NrX3QgbGNrOworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfbmVzdF9sb2NrPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIGludCBucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisgICAgaW50IHJlc3VsdCA9IDA7CisgICAgaW50IG5yX2l0ZXJhdGlvbnMgPSAwOworICAgIGludCBpOworCisgICAgb21wX2luaXRfbmVzdF9sb2NrICgmbGNrKTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKGxjaykgIAorICAgIHsKKyNwcmFnbWEgb21wIGZvcgorCWZvcihpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorCXsKKwkgICAgPG9tcHRzOm9ycGhhbj4KKwkJPG9tcHRzOmNoZWNrPm9tcF9zZXRfbmVzdF9sb2NrICgmbGNrKTs8L29tcHRzOmNoZWNrPgorCSAgICA8L29tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIGZsdXNoCisJCW5yX3RocmVhZHNfaW5fc2luZ2xlKys7CisjcHJhZ21hIG9tcCBmbHVzaCAgICAgICAgICAgCisJICAgIG5yX2l0ZXJhdGlvbnMrKzsKKwkgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUtLTsKKwkgICAgcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisJICAgIDxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz5vbXBfdW5zZXRfbmVzdF9sb2NrICgmbGNrKTs8L29tcHRzOmNoZWNrPgorCSAgICA8L29tcHRzOm9ycGhhbj4KKwl9CisgICAgfQorICAgIG9tcF9kZXN0cm95X25lc3RfbG9jayAoJmxjayk7CisKKyAgICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX25lc3RlZC5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX25lc3RlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NTdiYzgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfbmVzdGVkLmMKQEAgLTAsMCArMSw0MiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXBfbmVzdGVkIGZ1bmN0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfbmVzdGVkPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKy8qCisgKiBUZXN0IGlmIHRoZSBjb21waWxlciBzdXBwb3J0cyBuZXN0ZWQgcGFyYWxsZWxpc20KKyAqIEJ5IENodW5odWEgTGlhbywgVW5pdmVyc2l0eSBvZiBIb3VzdG9uCisgKiBPY3QuIDIwMDUKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfbmVzdGVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworCisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBpbnQgY291bnRlciA9IDA7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworI2lmZGVmIF9PUEVOTVAKKyAgICA8b21wdHM6Y2hlY2s+b21wX3NldF9uZXN0ZWQoMSk7PC9vbXB0czpjaGVjaz4KKyAgICA8b21wdHM6Y3Jvc3NjaGVjaz5vbXBfc2V0X25lc3RlZCgwKTs8L29tcHRzOmNyb3NzY2hlY2s+CisjZW5kaWYKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKGNvdW50ZXIpCit7Cis8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICBjb3VudGVyICsrOworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgICBjb3VudGVyIC0tOworICAgIH0KKzwvb21wdHM6b3JwaGFuPgorfQorICAgIHJldHVybiAoY291bnRlciAhPSAwKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfY29weWluLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfY29weWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgyYmZhMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9jb3B5aW4uYwpAQCAtMCwwICsxLDQ3IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBjb3B5aW4gZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgY29weWluPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCB0aHJlYWRwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworc3RhdGljIGludCBzdW0xID0gNzg5OworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShzdW0xKQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfY29weWluPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc3VtLCBudW1fdGhyZWFkczsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBrbm93bl9zdW07CisKKyAgICBzdW0gPSAwOworICAgIHN1bTEgPSA3OworICAgIG51bV90aHJlYWRzID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgPG9tcHRzOmNoZWNrPmNvcHlpbihzdW0xKTwvb21wdHM6Y2hlY2s+CisgICAgeworCS8qcHJpbnRmKCJzdW0xPSVkXG4iLHN1bTEpOyovCisJPG9tcHRzOm9ycGhhbj4KKwlpbnQgaTsKKyNwcmFnbWEgb21wIGZvciAKKwkgICAgZm9yIChpID0gMTsgaSA8IDEwMDA7IGkrKykKKwkgICAgeworCQlzdW0xID0gc3VtMSArIGk7CisJICAgIH0gLyplbmQgb2YgZm9yKi8KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJeworCSAgICBzdW0gPSBzdW0gKyBzdW0xOworICAgICAgICAgICAgbnVtX3RocmVhZHMrKzsKKwl9IC8qZW5kIG9mIGNyaXRpY2FsKi8KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCovICAgIAorICAgIGtub3duX3N1bSA9ICg5OTkgKiAxMDAwKSAvIDIgKyA3ICogbnVtX3RocmVhZHM7CisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKKworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9kZWZhdWx0LmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZGVmYXVsdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjODczNzEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZGVmYXVsdC5jCkBAIC0wLDAgKzEsNDQgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgZGVmYXVsdCBvcHRpb24gb2YgdGhlIHBhcmFsbGVsIGNvbnN0cnVjdC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGRlZmF1bHQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfZGVmYXVsdDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgaW50IGk7CisgIGludCBzdW07CisgIGludCBteXN1bTsKKyAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgCisgIGludCBrbm93bl9zdW07CisgIHN1bSA9MDsKKyAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyIDsKKworICA8b21wdHM6b3JwaGFuPgorICAjcHJhZ21hIG9tcCBwYXJhbGxlbCA8b21wdHM6Y2hlY2s+ZGVmYXVsdChzaGFyZWQpPC9vbXB0czpjaGVjaz4gcHJpdmF0ZShpKSBwcml2YXRlKG15c3VtPG9tcHRzOmNyb3NzY2hlY2s+LHN1bTwvb21wdHM6Y3Jvc3NjaGVjaz4pCisgIHsKKwlteXN1bSA9IDA7CisgICNwcmFnbWEgb21wIGZvcgorCWZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisJeworCSAgbXlzdW0gPSBteXN1bSArIGk7CisJfSAKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJeworCSAgc3VtID0gc3VtICsgbXlzdW07CisJfSAgIC8qIGVuZCBvZiBjcml0aWNhbCAqLworICB9ICAgLyogZW5kIG9mIHBhcmFsbGVsICovCisgIDwvb21wdHM6b3JwaGFuPgorICBpZiAoa25vd25fc3VtICE9IHN1bSkgeworICAJZnByaW50Zihsb2dGaWxlLCAiS05PV05fU1VNID0gJWQ7IFNVTSA9ICVkXG4iLCBrbm93bl9zdW0sIHN1bSk7CisgIH0KKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZmlyc3Rwcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZmlyc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxNWI0YwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDQ4IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZvciBvbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisvL3N0YXRpYyBpbnQgc3VtMSA9IDc4OTsKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX2ZpcnN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHN1bSwgbnVtX3RocmVhZHMsc3VtMTsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBrbm93bl9zdW07CisKKyAgICBzdW0gPSAwOworICAgIHN1bTE9NzsKKyAgICBudW1fdGhyZWFkcyA9IDA7CisKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgPG9tcHRzOmNoZWNrPmZpcnN0cHJpdmF0ZShzdW0xKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShzdW0xKTwvb21wdHM6Y3Jvc3NjaGVjaz4KKyAgICB7CisKKwkvKnByaW50Zigic3VtMT0lZFxuIixzdW0xKTsqLworCTxvbXB0czpvcnBoYW4+CisJaW50IGk7CisjcHJhZ21hIG9tcCBmb3IgCisJICAgIGZvciAoaSA9IDE7IGkgPCAxMDAwOyBpKyspCisJICAgIHsKKwkJc3VtMSA9IHN1bTEgKyBpOworCSAgICB9IC8qZW5kIG9mIGZvciovCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgICAgc3VtID0gc3VtICsgc3VtMTsKKyAgICAgICAgICAgIG51bV90aHJlYWRzKys7CisJfSAvKmVuZCBvZiBjcml0aWNhbCovCisJPC9vbXB0czpvcnBoYW4+CisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwqLyAgICAKKyAgICBrbm93bl9zdW0gPSAoOTk5ICogMTAwMCkgLyAyICsgNyAqIG51bV90aHJlYWRzOworICAgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7CisKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX2ZpcnN0cHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2I0OTI2Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDM2IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBmb3IgZmlyc3Rwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGZvciBmaXJzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbixvbXAgcGFyYWxsZWwgZm9yIHByaXZhdGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfZm9yX2ZpcnN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IHN1bSA7CisgICAgaW50IGkyOworICAgIGludCBpOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgCisgICAgc3VtPTA7CisgICAgaTI9MzsKKyAgICBpbnQga25vd25fc3VtOworCisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbigrOnN1bSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+Zmlyc3Rwcml2YXRlKGkyKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpMik8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgPG9tcHRzOm9ycGhhbj4KKyAgICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorICAgIHsKKwkgIHN1bSA9IHN1bSArIChpICsgaTIpOworICAgIH0gLyplbmQgb2YgZm9yKi8KKyAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAKKyAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIgKyBpMiAqIExPT1BDT1VOVDsKKyAgICAKKyAgICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworCit9IC8qIGVuZCBvZiBjaGVja19wYXJhbGxlbF9mb3JfZmlzdHByaXZhdGUgKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX2lmLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI4ODZiYQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfaWYuYwpAQCAtMCwwICsxLDM4IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBmb3IgaWYgZGlyZWN0aXZlLiBOZWVkcyBhdCBsZWFzdCB0d28gdGhyZWFkcy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGZvciBpZjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPjwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfZm9yX2lmPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgICBpbnQga25vd25fc3VtOworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgbnVtX3RocmVhZHM7CisgICAgaW50IHN1bSwgc3VtMjsKKyAgICBpbnQgaTsKKyAgICBpbnQgY29udHJvbDsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIGNvbnRyb2wgPSAwOworICAgIG51bV90aHJlYWRzPTA7CisgICAgc3VtID0gMDsKKyAgICBzdW0yID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPmlmIChjb250cm9sPT0xKTwvb21wdHM6Y2hlY2s+CisgICAgPG9tcHRzOm9ycGhhbj4KKyAgICBmb3IgKGk9MDsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKyAgICB7CisgICAgICAgIG51bV90aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcygpOworCXN1bSA9IHN1bSArIGk7CisgICAgfSAvKmVuZCBvZiBmb3IqLworCisgICAgPC9vbXB0czpvcnBoYW4+CisgICAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICAgIGZwcmludGYgKGxvZ0ZpbGUsICJOdW1iZXIgb2YgdGhyZWFkcyBkZXRlcm1pbmVkIGJ5IG9tcF9nZXRfbnVtX3RocmVhZHM6ICVkXG4iLCBudW1fdGhyZWFkcyk7CisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtICYmIG51bV90aHJlYWRzID09IDEpOworfSAvKiBlbmQgb2YgY2hlY2tfcGFyYWxsZWxfZm9yX3ByaXZhdGUgKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA5ZGViYQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfbGFzdHByaXZhdGUuYwpAQCAtMCwwICsxLDM0IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBmb3IgbGFzdHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZm9yIGxhc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24sb21wIHBhcmFsbGVsIGZvciBwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX2Zvcl9sYXN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBzdW07CisgICAgaW50IGk7CisgICAgaW50IGkwOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBzdW0gPTA7CisgICAgaTAgPSAtMTsKKyAgICBpbnQga25vd25fc3VtOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3IgcmVkdWN0aW9uKCs6c3VtKSBzY2hlZHVsZShzdGF0aWMsNykgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+bGFzdHByaXZhdGUoaTApPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKGkwKTwvb21wdHM6Y3Jvc3NjaGVjaz4KKyAgICA8b21wdHM6b3JwaGFuPgorICAgIGZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisgICAgeworCXN1bSA9IHN1bSArIGk7CisJaTAgPSBpOworICAgIH0gLyplbmQgb2YgZm9yKi8KKyAgICAvKiBlbmQgb2YgcGFyYWxsZWwqLyAgICAKKyAgICA8L29tcHRzOm9ycGhhbj4KKyAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgICAgcmV0dXJuICgoa25vd25fc3VtID09IHN1bSkgJiYgKGkwID09IExPT1BDT1VOVCkpOworfSAvKiBlbmQgb2YgY2hlY2tfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlICovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9vcmRlcmVkLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWE0YmM5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9vcmRlcmVkLmMKQEAgLTAsMCArMSw2MiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZm9yIG9yZGVyZWQgZGlyZWN0aXZlPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBmb3Igb3JkZXJlZDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJhbGxlbCBzY2hlZHVsZShzdGF0aWMpPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworc3RhdGljIGludCBsYXN0X2kgPSAwOworaW50IGk7CisKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoaSkKKworLyogVmFyaWFibGUgaWkgaXMgdXNlZCB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIGEgdGhyZWFkcHJpdmF0ZSB2YXJpYWJsZSB1c2VkIGFzIGEgbG9vcAorICogaW5kZXguIFNlZSB0ZXN0IG9tcF90aHJlYWRwcml2YXRlX2Zvci4KKyAqLworc3RhdGljIGludCBpaTsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoaWkpCisKKy8qISAKKyAgVXRpbGl0eSBmdW5jdGlvbjogcmV0dXJucyB0cnVlIGlmIHRoZSBwYXNzZWQgYXJndW1lbnQgaXMgbGFyZ2VyIHRoYW4gCisgIHRoZSBhcmd1bWVudCBvZiB0aGUgbGFzdCBjYWxsIG9mIHRoaXMgZnVuY3Rpb24uCisgICovCitzdGF0aWMgaW50IGNoZWNrX2lfaXNsYXJnZXIyIChpbnQgaSl7CisJaW50IGlzbGFyZ2VyOworCWlzbGFyZ2VyID0gKGkgPiBsYXN0X2kpOworCWxhc3RfaSA9IGk7CisJcmV0dXJuIChpc2xhcmdlcik7Cit9CisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9mb3Jfb3JkZXJlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisJPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzdW07CisJaW50IGlzX2xhcmdlcjsKKwk8L29tcHRzOm9ycGhhbjp2YXJzPgorCisJaW50IGtub3duX3N1bTsKKwlpbnQgaTsKKwkKKwlzdW0gPSAwOworCWlzX2xhcmdlciA9IDE7CisJbGFzdF9pID0gMDsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShzdGF0aWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+b3JkZXJlZDwvb21wdHM6Y2hlY2s+CisJZm9yIChpID0gMTsgaSA8IDEwMDsgaSsrKQorCXsKKwkJaWkgPSBpOworCTxvbXB0czpvcnBoYW4+Cis8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgb3JkZXJlZDwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisJCQlpc19sYXJnZXIgPSBjaGVja19pX2lzbGFyZ2VyMiAoaWkpICYmIGlzX2xhcmdlcjsKKwkJCXN1bSAgPSBzdW0gKyBpaTsKKwkJfQorCTwvb21wdHM6b3JwaGFuPgorCX0KKwlrbm93bl9zdW0gPSAoOTkgKiAxMDApIC8gMjsKKwlmcHJpbnRmIChsb2dGaWxlLCIga25vd25fc3VtID0gJWQgLCBzdW0gPSAlZCBcbiIsIGtub3duX3N1bSwgc3VtKTsKKwlmcHJpbnRmIChsb2dGaWxlLCIgaXNfbGFyZ2VyID0gJWRcbiIsIGlzX2xhcmdlcik7CisJcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKSAmJiBpc19sYXJnZXI7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9wcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDI4MGNjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9wcml2YXRlLmMKQEAgLTAsMCArMSw0OCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZm9yIHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZm9yIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbixvbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLyohIFV0aWxpdHkgZnVuY3Rpb24gdG8gc3BlbmQgc29tZSB0aW1lIGluIGEgbG9vcCAqLworc3RhdGljIHZvaWQgZG9fc29tZV93b3JrICh2b2lkKXsKKyAgICBpbnQgaTsKKyAgICBkb3VibGUgc3VtID0gMDsKKyAgICBmb3IoaSA9IDA7IGkgPCAxMDAwOyBpKyspeworCXN1bSArPSBzcXJ0IChpKTsKKyAgICB9Cit9CisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBzdW07CisgICAgaW50IGk7CisgICAgaW50IGkyOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgCisgICAgc3VtID0wOworICAgIGkyPTA7CisgICAgaW50IGtub3duX3N1bTsKKyAgCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3IgcmVkdWN0aW9uKCs6c3VtKSBzY2hlZHVsZShzdGF0aWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cHJpdmF0ZShpMik8L29tcHRzOmNoZWNrPgorICAgIDxvbXB0czpvcnBoYW4+CisgICAgCisgICAgZm9yIChpPTE7aTw9TE9PUENPVU5UO2krKykKKyAgICB7CisJaTIgPSBpOworI3ByYWdtYSBvbXAgZmx1c2gKKwlkb19zb21lX3dvcmsgKCk7CisjcHJhZ21hIG9tcCBmbHVzaAorCXN1bSA9IHN1bSArIGkyOworICAgIH0gLyplbmQgb2YgZm9yKi8KKyAgICA8L29tcHRzOm9ycGhhbj4KKworICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfSAvKiBlbmQgb2YgY2hlY2tfcGFyYWxsZWxfZm9yX3ByaXZhdGUgKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX3JlZHVjdGlvbi5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yzk5MWY3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24uYwpAQCAtMCwwICsxLDI4MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbiBkaXJlY3RpdmUgd2l0aCBhbGwgaXRzIG9wdGlvbnMuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBmb3IgcmVkdWN0aW9uPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9mb3JfcmVkdWN0aW9uPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKwk8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IHN1bTsKKwlpbnQga25vd25fc3VtOworCWRvdWJsZSBkc3VtOworCWRvdWJsZSBka25vd25fc3VtOworCWRvdWJsZSBkdD0wLjU7CQkJCS8qIGJhc2Ugb2YgZ2VvbWV0cmljIHJvdyBmb3IgKyBhbmQgLSB0ZXN0Ki8KKwlkb3VibGUgcm91bmRpbmdfZXJyb3I9IDEuRS05OworI2RlZmluZSBET1VCTEVfRElHSVRTIDIwCQkvKiBkdF5ET1VCTEVfRElHSVRTICovCisJaW50IGRpZmY7CisJZG91YmxlIGRkaWZmOworCWludCBwcm9kdWN0OworCWludCBrbm93bl9wcm9kdWN0OworI2RlZmluZSBNQVhfRkFDVE9SIDEwCisjZGVmaW5lIEtOT1dOX1BST0RVQ1QgMzYyODgwMAkvKiAxMCEgKi8KKwlpbnQgbG9naWNfYW5kOworCWludCBsb2dpY19vcjsKKwlpbnQgYml0X2FuZDsKKwlpbnQgYml0X29yOworCWludCBleGNsdXNpdl9iaXRfb3I7CisJaW50IGxvZ2ljc1tMT09QQ09VTlRdOworCWludCBpOworCWRvdWJsZSBkcHQ7CisJaW50IHJlc3VsdDsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgc3VtID0wOworICAgIGRzdW09MDsKKwlkdCA9IDEuLzMuOworICAgIHJlc3VsdCA9IDA7CisgICAgcHJvZHVjdCA9IDE7CisJbG9naWNfYW5kPTE7CisJbG9naWNfb3I9MDsKKwliaXRfYW5kPTE7CisJYml0X29yPTA7CisJZXhjbHVzaXZfYml0X29yPTA7CisKKwlrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzI7Cis8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6c3VtKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvciAoaT0xO2k8PUxPT1BDT1VOVDtpKyspCisJeworCQlzdW09c3VtK2k7CisJfQorCisJaWYoa25vd25fc3VtIT1zdW0pCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkXG4iLHN1bSxrbm93bl9zdW0pOyAKKwl9CisKKwlkaWZmID0gKExPT1BDT1VOVCooTE9PUENPVU5UKzEpKS8yOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGlmZik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IgKGk9MTtpPD1MT09QQ09VTlQ7KytpKQorCXsKKwkJZGlmZj1kaWZmLWk7CisJfQorCisJaWYoZGlmZiAhPSAwKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gZGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgMC5cbiIsZGlmZik7CisJfQorCisJLyogVGVzdHMgZm9yIGRvdWJsZXMgKi8KKwlkc3VtPTA7CisJZHB0PTE7CisJZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkKKwl7CisJCWRwdCo9ZHQ7CisJfQorCWRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOmRzdW0pPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkKKwl7CisJCWRzdW0gKz0gcG93KGR0LGkpOworCX0KKworCWlmKCBmYWJzKGRzdW0tZGtub3duX3N1bSkgPiByb3VuZGluZ19lcnJvciApCisJeworCQlyZXN1bHQrKzsgCisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlZiBpbnN0ZWFkIG9mICVmIChEaWZmZXJlbmNlOiAlRSlcbiIsZHN1bSxka25vd25fc3VtLCBkc3VtLWRrbm93bl9zdW0pOworCX0KKworCWRwdD0xOworCisJZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkKKwl7CisJCWRwdCo9ZHQ7CisJfQorCWZwcmludGYobG9nRmlsZSwiXG4iKTsKKwlkZGlmZiA9ICgxLWRwdCkvKDEtZHQpOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGRpZmYpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkKKwl7CisJCWRkaWZmIC09IHBvdyhkdCxpKTsKKwl9CisJaWYoIGZhYnMoZGRpZmYpID4gcm91bmRpbmdfZXJyb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSBpbnN0ZWFkIG9mIDAuMFxuIixkZGlmZik7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKjpwcm9kdWN0KTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTE7aTw9TUFYX0ZBQ1RPUjtpKyspCisJeworCQlwcm9kdWN0ICo9IGk7CisJfQorCisJa25vd25fcHJvZHVjdCA9IEtOT1dOX1BST0RVQ1Q7CisJaWYoa25vd25fcHJvZHVjdCAhPSBwcm9kdWN0KQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gUHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWRcblxuIixwcm9kdWN0LGtub3duX3Byb2R1Y3QpOworCX0KKworCWZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKQorCXsKKwkJbG9naWNzW2ldPTE7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCX0KKwlpZighbG9naWNfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMS5cbiIpOworCX0KKworCWxvZ2ljX2FuZCA9IDE7CisJbG9naWNzW0xPT1BDT1VOVC8yXT0wOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJbG9naWNfYW5kID0gbG9naWNfYW5kICYmIGxvZ2ljc1tpXTsKKwl9CisJaWYobG9naWNfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMi5cbiIpOworCX0KKworCWZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofHw6bG9naWNfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tpXTsKKwl9CisJaWYobG9naWNfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDEuXG4iKTsKKwl9CisJbG9naWNfb3IgPSAwOworCWxvZ2ljc1tMT09QQ09VTlQvMl09MTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHx8OmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJbG9naWNfb3IgPSBsb2dpY19vciB8fCBsb2dpY3NbaV07CisJfQorCWlmKCFsb2dpY19vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMi5cbiIpOworCX0KKworCisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlsb2dpY3NbaV09MTsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmOmJpdF9hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQliaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworCX0KKwlpZighYml0X2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBBTkQgcGFydCAxLlxuIik7CisJfQorCisJYml0X2FuZCA9IDE7CisJbG9naWNzW0xPT1BDT1VOVC8yXT0wOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJjpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3NbaV07CisJfQorCWlmKGJpdF9hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMi5cbiIpOworCX0KKworCWZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofDpiaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJfQorCWlmKGJpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDFcbiIpOworCX0KKwliaXRfb3IgPSAwOworCWxvZ2ljc1tMT09QQ09VTlQvMl09MTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHw6Yml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCX0KKwlpZighYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMlxuIik7CisJfQorCisJZm9yKGk9MDtpPExPT1BDT1VOVDtpKyspCisJeworCQlsb2dpY3NbaV09MDsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwl9CisJaWYoZXhjbHVzaXZfYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMVxuIik7CisJfQorCisJZXhjbHVzaXZfYml0X29yID0gMDsKKwlsb2dpY3NbTE9PUENPVU5ULzJdPTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwl9CisJaWYoIWV4Y2x1c2l2X2JpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDJcbiIpOworCX0KKzwvb21wdHM6b3JwaGFuPgorCS8qcHJpbnRmKCJcblJlc3VsdDolZFxuIixyZXN1bHQpOyovCisJcmV0dXJuIChyZXN1bHQ9PTApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9pZi5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNmNDViMQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9pZi5jCkBAIC0wLDAgKzEsNDAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgaWYgb3B0aW9uIG9mIHRoZSBwYXJhbGxlbCBjb25zdHJ1Y3QuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBpZjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9pZjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7Cis8b21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBpOworICBpbnQgc3VtOworICBpbnQga25vd25fc3VtOworICBpbnQgbXlzdW07CisgIGludCBjb250cm9sPTE7Cis8L29tcHRzOm9ycGhhbjp2YXJzPgorICBzdW0gPTA7CisgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMiA7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5pZihjb250cm9sPT0wKTwvb21wdHM6Y2hlY2s+CisgIHsKKwk8b21wdHM6b3JwaGFuPgorICAgIG15c3VtID0gMDsKKwlmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorCXsKKwkgIG15c3VtID0gbXlzdW0gKyBpOworCX0gCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgIHN1bSA9IHN1bSArIG15c3VtOworCX0gICAvKiBlbmQgb2YgY3JpdGljYWwgKi8KKyAgPC9vbXB0czpvcnBoYW4+CisgIH0gICAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9udW1fdGhyZWFkcy5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX251bV90aHJlYWRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk3ZmVkMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9udW1fdGhyZWFkcy5jCkBAIC0wLDAgKzEsNDYgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wX3BhcmFsbGVsX251bV90aHJlYWRzIGRpcmVjdGl2ZSBieSBjb3VudGluZyB0aGUgdGhyZWFkcyBpbiBhIHBhcmFsbGVsIHJlZ2lvbiB3aGljaCB3YXMgc3RhcnRlZCB3aXRoIGFuIGV4cGxpY2l0bHkgc3RhdGVkIG51bWJlciBvZiB0aHJlYWRzLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyZWxsZWwgbnVtX3RocmVhZHM8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgbWFzdGVyLG9tcCBwYXJhbGxlbCByZWR1Y3Rpb24sb21wIGF0b21pYzwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9udW1fdGhyZWFkczwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBmYWlsZWQ7CisJaW50IHRocmVhZHM7CisJaW50IG50aHJlYWRzOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBpbnQgbWF4X3RocmVhZHMgPSAwOworCisgICAgZmFpbGVkID0gMDsKKworICAgIC8qIGZpcnN0IHdlIGNoZWNrIGhvdyBtYW55IHRocmVhZHMgYXJlIGF2YWlsYWJsZSAqLworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisjcHJhZ21hIG9tcCBtYXN0ZXIKKwltYXhfdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMgKCk7CisgICAgfQorCisgICAgLyogd2UgaW5jcmVhc2UgdGhlIG51bWJlciBvZiB0aHJlYWRzIGZyb20gb25lIHRvIG1heGltdW06Ki8KKyAgICBmb3IgKHRocmVhZHMgPSAxOyB0aHJlYWRzIDw9IG1heF90aHJlYWRzOyB0aHJlYWRzKyspCisgICAgeworCW50aHJlYWRzID0gMDsKKworCTxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBwYXJhbGxlbCByZWR1Y3Rpb24oKzpmYWlsZWQpIDxvbXB0czpjaGVjaz5udW1fdGhyZWFkcyh0aHJlYWRzKTwvb21wdHM6Y2hlY2s+CisJICAgIHsKKwkJZmFpbGVkID0gZmFpbGVkICsgISh0aHJlYWRzID09IG9tcF9nZXRfbnVtX3RocmVhZHMgKCkpOworI3ByYWdtYSBvbXAgYXRvbWljCisJICAgIG50aHJlYWRzICs9IDE7CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKwlmYWlsZWQgPSBmYWlsZWQgKyAhKG50aHJlYWRzID09IHRocmVhZHMpOworICAgIH0KKyAgICByZXR1cm4gKCFmYWlsZWQpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9wcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfcHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkY2NjMDkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmb3Igb21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLy9zdGF0aWMgaW50IHN1bTEgPSA3ODk7CisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9wcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc3VtLCBudW1fdGhyZWFkcyxzdW0xOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IGtub3duX3N1bTsKKworICAgIHN1bSA9IDA7CisgICAgPG9tcHRzOmNyb3NzY2hlY2s+IHN1bTE9MDsgPC9vbXB0czpjcm9zc2NoZWNrPgorICAgIG51bV90aHJlYWRzID0gMDsKKworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCA8b21wdHM6Y2hlY2s+cHJpdmF0ZShzdW0xKTwvb21wdHM6Y2hlY2s+CisgICAgeworCTxvbXB0czpjaGVjaz4KKwlzdW0xID0gNzsKKwk8L29tcHRzOmNoZWNrPgorCS8qcHJpbnRmKCJzdW0xPSVkXG4iLHN1bTEpOyovCisJPG9tcHRzOm9ycGhhbj4KKwlpbnQgaTsKKyNwcmFnbWEgb21wIGZvciAKKwkgICAgZm9yIChpID0gMTsgaSA8IDEwMDA7IGkrKykKKwkgICAgeworCQlzdW0xID0gc3VtMSArIGk7CisJICAgIH0gLyplbmQgb2YgZm9yKi8KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJeworCSAgICBzdW0gPSBzdW0gKyBzdW0xOworICAgICAgICAgICAgbnVtX3RocmVhZHMrKzsKKwl9IC8qZW5kIG9mIGNyaXRpY2FsKi8KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCovICAgIAorICAgIGtub3duX3N1bSA9ICg5OTkgKiAxMDAwKSAvIDIgKyA3ICogbnVtX3RocmVhZHM7CisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKKworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24uYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmY4Mzk0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3JlZHVjdGlvbi5jCkBAIC0wLDAgKzEsMjc4IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCByZWR1Y3Rpb24gZGlyZWN0aXZlIHdpdGggYWxsIGl0cyBvcHRpb25zLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgcmVkdWN0aW9uPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9yZWR1Y3Rpb248L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworCTxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgc3VtOworCWludCBrbm93bl9zdW07CisJZG91YmxlIGRzdW07CisJZG91YmxlIGRrbm93bl9zdW07CisJZG91YmxlIGR0PTAuNTsJCQkJLyogYmFzZSBvZiBnZW9tZXRyaWMgcm93IGZvciArIGFuZCAtIHRlc3QqLworCWRvdWJsZSByb3VuZGluZ19lcnJvcj0gMS5FLTk7CisjZGVmaW5lIERPVUJMRV9ESUdJVFMgMjAJCS8qIGR0XkRPVUJMRV9ESUdJVFMgKi8KKwlpbnQgZGlmZjsKKwlkb3VibGUgZGRpZmY7CisJaW50IHByb2R1Y3Q7CisJaW50IGtub3duX3Byb2R1Y3Q7CisjZGVmaW5lIE1BWF9GQUNUT1IgMTAKKyNkZWZpbmUgS05PV05fUFJPRFVDVCAzNjI4ODAwCS8qIDEwISAqLworCWludCBsb2dpY19hbmQ7CisJaW50IGxvZ2ljX29yOworCWludCBiaXRfYW5kOworCWludCBiaXRfb3I7CisJaW50IGV4Y2x1c2l2X2JpdF9vcjsKKwlpbnQgbG9naWNzW0xPT1BDT1VOVF07CisJaW50IGk7CisJZG91YmxlIGRwdDsKKwlpbnQgcmVzdWx0OworPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBzdW0gPTA7CisgICAgZHN1bT0wOworICAgIHByb2R1Y3Q9MTsKKwlsb2dpY19hbmQ9MTsKKwlsb2dpY19vcj0wOworCWJpdF9hbmQ9MTsKKwliaXRfb3I9MDsKKwlleGNsdXNpdl9iaXRfb3I9MDsKKyAgICByZXN1bHQ9MDsKKwlkdCA9IDEuLzMuOworCWtub3duX3N1bSA9IChMT09QQ09VTlQqKExPT1BDT1VOVCsxKSkvMjsKKzxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpzdW0pPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yIChpPTE7aTw9TE9PUENPVU5UO2krKykKKwl7CisJCXN1bT1zdW0raTsKKwl9CisKKwlpZihrbm93bl9zdW0hPXN1bSkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWRcbiIsc3VtLGtub3duX3N1bSk7IAorCX0KKworCWRpZmYgPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzI7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkaWZmKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvciAoaT0xO2k8PUxPT1BDT1VOVDsrK2kpCisJeworCQlkaWZmPWRpZmYtaTsKKwl9CisKKwlpZihkaWZmICE9IDApCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBkaWZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAwLlxuIixkaWZmKTsKKwl9CisKKwkvKiBUZXN0cyBmb3IgZG91YmxlcyAqLworCWRzdW09MDsKKwlkcHQ9MTsKKwlmb3IgKGk9MDtpPERPVUJMRV9ESUdJVFM7KytpKQorCXsKKwkJZHB0Kj1kdDsKKwl9CisJZGtub3duX3N1bSA9ICgxLWRwdCkvKDEtZHQpOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6ZHN1bSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IgKGk9MDtpPERPVUJMRV9ESUdJVFM7KytpKQorCXsKKwkJZHN1bSArPSBwb3coZHQsaSk7CisJfQorCisJaWYoIGZhYnMoZHN1bS1ka25vd25fc3VtKSA+IHJvdW5kaW5nX2Vycm9yICkKKwl7CisJCXJlc3VsdCsrOyAKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVmIGluc3RlYWQgb2YgJWYgKERpZmZlcmVuY2U6ICVFKVxuIixkc3VtLGRrbm93bl9zdW0sIGRzdW0tZGtub3duX3N1bSk7CisJfQorCisJZHB0PTE7CisKKwlmb3IgKGk9MDtpPERPVUJMRV9ESUdJVFM7KytpKQorCXsKKwkJZHB0Kj1kdDsKKwl9CisJZnByaW50Zihsb2dGaWxlLCJcbiIpOworCWRkaWZmID0gKDEtZHB0KS8oMS1kdCk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkZGlmZik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IgKGk9MDtpPERPVUJMRV9ESUdJVFM7KytpKQorCXsKKwkJZGRpZmYgLT0gcG93KGR0LGkpOworCX0KKwlpZiggZmFicyhkZGlmZikgPiByb3VuZGluZ19lcnJvcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVFIGluc3RlYWQgb2YgMC4wXG4iLGRkaWZmKTsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigqOnByb2R1Y3QpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MTtpPD1NQVhfRkFDVE9SO2krKykKKwl7CisJCXByb2R1Y3QgKj0gaTsKKwl9CisKKwlrbm93bl9wcm9kdWN0ID0gS05PV05fUFJPRFVDVDsKKwlpZihrbm93bl9wcm9kdWN0ICE9IHByb2R1Y3QpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuXG4iLHByb2R1Y3Qsa25vd25fcHJvZHVjdCk7CisJfQorCisJZm9yKGk9MDtpPExPT1BDT1VOVDtpKyspCisJeworCQlsb2dpY3NbaV09MTsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmJjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJfQorCWlmKCFsb2dpY19hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxLlxuIik7CisJfQorCisJbG9naWNfYW5kID0gMTsKKwlsb2dpY3NbTE9PUENPVU5ULzJdPTA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmJjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlsb2dpY19hbmQgPSBsb2dpY19hbmQgJiYgbG9naWNzW2ldOworCX0KKwlpZihsb2dpY19hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAyLlxuIik7CisJfQorCisJZm9yKGk9MDtpPExPT1BDT1VOVDtpKyspCisJeworCQlsb2dpY3NbaV09MDsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8fDpsb2dpY19vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWxvZ2ljX29yID0gbG9naWNfb3IgfHwgbG9naWNzW2ldOworCX0KKwlpZihsb2dpY19vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMS5cbiIpOworCX0KKwlsb2dpY19vciA9IDA7CisJbG9naWNzW0xPT1BDT1VOVC8yXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofHw6bG9naWNfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tpXTsKKwl9CisJaWYoIWxvZ2ljX29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyLlxuIik7CisJfQorCisKKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWxvZ2ljc1tpXT0xOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCY6Yml0X2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWJpdF9hbmQgPSAoYml0X2FuZCAmIGxvZ2ljc1tpXSk7CisJfQorCWlmKCFiaXRfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDEuXG4iKTsKKwl9CisKKwliaXRfYW5kID0gMTsKKwlsb2dpY3NbTE9PUENPVU5ULzJdPTA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmOmJpdF9hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQliaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKwl9CisJaWYoYml0X2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBBTkQgcGFydCAyLlxuIik7CisJfQorCisJZm9yKGk9MDtpPExPT1BDT1VOVDtpKyspCisJeworCQlsb2dpY3NbaV09MDsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8OmJpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwl9CisJaWYoYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMVxuIik7CisJfQorCWJpdF9vciA9IDA7CisJbG9naWNzW0xPT1BDT1VOVC8yXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofDpiaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJfQorCWlmKCFiaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgT1IgcGFydCAyXG4iKTsKKwl9CisKKwlmb3IoaT0wO2k8TE9PUENPVU5UO2krKykKKwl7CisJCWxvZ2ljc1tpXT0wOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCX0KKwlpZihleGNsdXNpdl9iaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAxXG4iKTsKKwl9CisKKwlleGNsdXNpdl9iaXRfb3IgPSAwOworCWxvZ2ljc1tMT09QQ09VTlQvMl09MTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCX0KKwlpZighZXhjbHVzaXZfYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMlxuIik7CisJfQorICAgIDwvb21wdHM6b3JwaGFuPgorCS8qcHJpbnRmKCJcblJlc3VsdDolZFxuIixyZXN1bHQpOyovCisJcmV0dXJuIChyZXN1bHQ9PTApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19maXJzdHByaXZhdGUuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTMzODM5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX2ZpcnN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNDkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIHNlY3Rpb25zIGZpcnN0cHJpdmF0ZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBzZWN0aW9ucyBmaXJzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfc2VjdGlvbnNfZmlyc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgc3VtOworICBpbnQgc3VtMDsKKyAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgaW50IGtub3duX3N1bTsKKyAgc3VtID03OworICBzdW0wPTExOworCis8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPmZpcnN0cHJpdmF0ZShzdW0wKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShzdW0wKTwvb21wdHM6Y3Jvc3NjaGVjaz4KKyAgeworI3ByYWdtYSBvbXAgc2VjdGlvbiAKKyAgICB7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworCXN1bT0gc3VtK3N1bTA7CisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qZW5kIG9mIGNyaXRpY2FsICovCisgICAgfSAgICAKKyNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworCXN1bT0gc3VtK3N1bTA7CisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qZW5kIG9mIGNyaXRpY2FsICovCisgICAgfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisJc3VtPSBzdW0rc3VtMDsKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgLyplbmQgb2YgY3JpdGljYWwgKi8KKyAgICB9ICAgICAgICAgICAgICAgCisgICAgfSAgICAgIC8qZW5kIG9mIHBhcmFsbGVsIHNlY3Rpb25zKi8KKzwvb21wdHM6b3JwaGFuPgora25vd25fc3VtPTExKjMrNzsKK3JldHVybiAoa25vd25fc3VtPT1zdW0pOyAKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2YgY2hlY2tfc2VjdGlvbl9maXJzdHByaXZhdGUqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19sYXN0cHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVhZTVmMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19sYXN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNzAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIHNlY3Rpb25zIGxhc3Rwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHNlY3Rpb25zIGxhc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgc3VtOworICBpbnQgc3VtMDsKKyAgaW50IGk7CisgIGludCBpMDsKKyAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgaW50IGtub3duX3N1bTsKKyAgc3VtID0wOworICBzdW0wID0gMDsKKyAgaTAgPSAtMTsKKyAgCisgIDxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGksc3VtMCkgPG9tcHRzOmNoZWNrPmxhc3Rwcml2YXRlKGkwKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpMCk8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgeworI3ByYWdtYSBvbXAgc2VjdGlvbiAgCisgICAgICB7CisJc3VtMD0wOworCWZvciAoaT0xO2k8NDAwO2krKykKKwkgIHsKKwkgICAgc3VtMD1zdW0wK2k7CisJICAgIGkwPWk7CisJICB9CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgIHN1bT0gc3VtK3N1bTA7CisJfSAgICAgICAgICAgICAgICAgICAgICAgICAvKmVuZCBvZiBjcml0aWNhbCovCisgICAgICB9LyogZW5kIG9mIHNlY3Rpb24gKi8KKyNwcmFnbWEgb21wIHNlY3Rpb24gCisgICAgICB7CisJc3VtMD0wOworCWZvcihpPTQwMDtpPDcwMDtpKyspCisJICB7CisJICAgIHN1bTA9c3VtMCtpOyAgICAgICAgICAgICAgICAgICAgICAgLyplbmQgb2YgZm9yKi8KKwkgICAgaTA9aTsKKwkgIH0KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJeworCSAgc3VtPSBzdW0rc3VtMDsKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qZW5kIG9mIGNyaXRpY2FsKi8KKyAgICAgIH0KKyNwcmFnbWEgb21wIHNlY3Rpb24gCisgICAgICB7CisJc3VtMD0wOworCWZvcihpPTcwMDtpPDEwMDA7aSsrKQorCSAgeworCSAgICBzdW0wPXN1bTAraTsKKyAgICAgIGkwPWk7CisJICB9CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgIHN1bT0gc3VtK3N1bTA7CisJfSAgICAgICAgICAgICAgICAgICAgICAgICAvKmVuZCBvZiBjcml0aWNhbCovCisgICAgICB9CisgICAgfS8qIGVuZCBvZiBwYXJhbGxlbCBzZWN0aW9ucyovCisgIDwvb21wdHM6b3JwaGFuPiAKKyAga25vd25fc3VtPSg5OTkqMTAwMCkvMjsKKyAgcmV0dXJuICgoa25vd25fc3VtPT1zdW0pICYmIChpMD09OTk5KSApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19wcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZmU0MTQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNjUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9zZWN0aW9uc19wcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgc3VtOworICBpbnQgc3VtMDsKKyAgaW50IGk7CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBrbm93bl9zdW07CisgIHN1bSA9IDc7CisgIHN1bTA9MDsKKworPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoPG9tcHRzOmNoZWNrPnN1bTAsPC9vbXB0czpjaGVjaz4gaSkKKyAgeworI3ByYWdtYSBvbXAgc2VjdGlvbiAKKyAgICB7CisgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICBzdW0wPTA7CisgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgZm9yIChpPTE7aTw0MDA7aSsrKQorCXN1bTA9c3VtMCtpOworI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKwlzdW09IHN1bStzdW0wOworICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAvKmVuZCBvZiBjcml0aWNhbCAqLworICAgIH0gICAgCisjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgPG9tcHRzOmNoZWNrPgorICAgICAgc3VtMD0wOworICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgIGZvcihpPTQwMDtpPDcwMDtpKyspCisJc3VtMD1zdW0wK2k7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworCXN1bT0gc3VtK3N1bTA7CisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qZW5kIG9mIGNyaXRpY2FsICovCisgICAgfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgIHN1bTA9MDsKKyAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICBmb3IoaT03MDA7aTwxMDAwO2krKykKKwlzdW0wPXN1bTAraTsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisJc3VtPSBzdW0rc3VtMDsKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgLyplbmQgb2YgY3JpdGljYWwgKi8KKyAgICB9ICAgICAgICAgICAgICAgCisgIH0gICAgICAgIC8qZW5kIG9mIHBhcmFsbGVsIHNlY3Rpb25zKi8KKzwvb21wdHM6b3JwaGFuPgora25vd25fc3VtPSg5OTkqMTAwMCkvMis3OworcmV0dXJuIChrbm93bl9zdW09PXN1bSk7IAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBvZiBjaGVja19zZWN0aW9uX3ByaXZhdGUqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb24uYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWRlYTZhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX3JlZHVjdGlvbi5jCkBAIC0wLDAgKzEsNTY4IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyByZWR1Y3Rpb24gZGlyZWN0aXZlIHdpdGggYWxsIGl0cyBvcHRpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBzZWN0aW9ucyByZWR1Y3Rpb248L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX3NlY3Rpb25zX3JlZHVjdGlvbjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisJPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBzdW07CisJaW50IGtub3duX3N1bTsJCisJZG91YmxlIGRwdDsKKyAgICBkb3VibGUgZHN1bTsKKwlkb3VibGUgZGtub3duX3N1bTsKKwlkb3VibGUgZHQ9MC41OwkJCQkvKiBiYXNlIG9mIGdlb21ldHJpYyByb3cgZm9yICsgYW5kIC0gdGVzdCovCisJZG91YmxlIHJvdW5kaW5nX2Vycm9yPSAxLkUtNTsKKwlpbnQgZGlmZjsKKwlkb3VibGUgZGRpZmY7CisJaW50IHByb2R1Y3Q7CisJaW50IGtub3duX3Byb2R1Y3Q7CisJaW50IGxvZ2ljX2FuZDsKKwlpbnQgYml0X2FuZDsKKwlpbnQgbG9naWNfb3I7CisJaW50IGJpdF9vcjsKKwlpbnQgZXhjbHVzaXZfYml0X29yOworCWludCBsb2dpY3NbMTAwMF07CisJaW50IGk7CisJaW50IHJlc3VsdDsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIAorICAgIHN1bSA9IDc7CisgICAgZHN1bT0wOworICAgIHByb2R1Y3QgPTE7CisgICAgZHB0ID0gMTsKKwlsb2dpY19hbmQ9MTsKKwliaXRfYW5kPTE7CisJbG9naWNfb3I9MDsKKwliaXRfb3I9MDsKKwlleGNsdXNpdl9iaXRfb3I9MDsKKyAgICByZXN1bHQgPTA7CisJLyogIGludCBteV9pc2xhcmdlcjsqLworCS8qaW50IGlzX2xhcmdlcj0xOyovCisJa25vd25fc3VtID0gKDk5OSoxMDAwKS8yKzc7CisKKyAgICA8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6c3VtKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJeworCQkJCXN1bT1zdW0raTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCXsKKwkJCQlzdW09c3VtK2k7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJeworCQkJCXN1bT1zdW0raTsKKwkJCX0KKwkJfQorCX0KKworCWlmKGtub3duX3N1bSE9c3VtKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZC5cbiIsc3VtLCBrbm93bl9zdW0pOworCX0KKworCWRpZmYgPSAoOTk5KjEwMDApLzI7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkaWZmKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJeworCQkJCWRpZmY9ZGlmZi1pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0zMDA7aTw3MDA7aSsrKQorCQkJeworCQkJCWRpZmY9ZGlmZi1pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCXsKKwkJCQlkaWZmPWRpZmYtaTsKKwkJCX0KKwkJfQorCX0KKworCisJaWYoZGlmZiAhPSAwKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgMC5cbiIsZGlmZik7CisJfQorCWZvciAoaT0wO2k8MjA7KytpKQorCXsKKwkJZHB0Kj1kdDsKKwl9CisJZGtub3duX3N1bSA9ICgxLWRwdCkvKDEtZHQpOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6ZHN1bSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0wO2k8NjsrK2kpCisJCQl7CisJCQkJZHN1bSArPSBwb3coZHQsaSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTY7aTwxMjsrK2kpCisJCQl7CisJCQkJZHN1bSArPSBwb3coZHQsaSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTEyO2k8MjA7KytpKQorCQkJeworCQkJCWRzdW0gKz0gcG93KGR0LGkpOworCQkJfQorCQl9CisJfQorCisKKwlpZiggZmFicyhkc3VtLWRrbm93bl9zdW0pID4gcm91bmRpbmdfZXJyb3IgKQorCXsKKwkJcmVzdWx0Kys7IAorCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJWYgaW5zdGVhZCBvZiAlZiAoRGlmZmVyZW5jZTogJUUpXG4iLGRzdW0sZGtub3duX3N1bSwgZHN1bS1ka25vd25fc3VtKTsKKwl9CisKKwlkcHQ9MTsKKworCWZvciAoaT0wO2k8MjA7KytpKQorCXsKKwkJZHB0Kj1kdDsKKwl9CisJZnByaW50Zihsb2dGaWxlLCJcbiIpOworCWRkaWZmID0gKDEtZHB0KS8oMS1kdCk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkZGlmZik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0wO2k8NjsrK2kpCisJCQl7CisJCQkJZGRpZmYgLT0gcG93KGR0LGkpOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT02O2k8MTI7KytpKQorCQkJeworCQkJCWRkaWZmIC09IHBvdyhkdCxpKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MTI7aTwyMDsrK2kpCisJCQl7CisJCQkJZGRpZmYgLT0gcG93KGR0LGkpOworCQkJfQorCQl9CisJfQorCisJaWYoIGZhYnMoZGRpZmYpID4gcm91bmRpbmdfZXJyb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSBpbnN0ZWFkIG9mIDAuMFxuIixkZGlmZik7CisJfQorCisJa25vd25fcHJvZHVjdCA9IDM2Mjg4MDA7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKjpwcm9kdWN0KTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJewkKKwkJCWZvcihpPTE7aTwzO2krKykKKwkJCXsKKwkJCQlwcm9kdWN0ICo9IGk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9MztpPDc7aSsrKQorCQkJeworCQkJCXByb2R1Y3QgKj0gaTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT03O2k8MTE7aSsrKQorCQkJeworCQkJCXByb2R1Y3QgKj0gaTsKKwkJCX0KKwkJfQorCX0KKworCisJaWYoa25vd25fcHJvZHVjdCAhPSBwcm9kdWN0KQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gUHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWRcbiIscHJvZHVjdCxrbm93bl9wcm9kdWN0KTsKKwl9CisKKwlmb3IoaT0wO2k8MTAwMDtpKyspCisJeworCQlsb2dpY3NbaV09MTsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmJjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MTtpPDMwMDtpKyspCisJCQl7CisJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0zMDA7aTw3MDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9NzAwO2k8MTAwMDtpKyspCisJCQl7CisJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJfQorCQl9CisJfQorCisJaWYoIWxvZ2ljX2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDFcbiIpOworCX0KKworCWxvZ2ljX2FuZCA9IDE7CisJbG9naWNzWzUwMV0gPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorCX0KKworCWlmKGxvZ2ljX2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDIiKTsKKwl9CisKKwlmb3IoaT0wO2k8MTAwMDtpKyspCisJeworCQlsb2dpY3NbaV09MDsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8fDpsb2dpY19vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0xO2k8MzAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0zMDA7aTw3MDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKwl9CisKKwlpZihsb2dpY19vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMVxuIik7CisJfQorCisJbG9naWNfb3IgPSAwOworCWxvZ2ljc1s1MDFdPTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8fDpsb2dpY19vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0xO2k8MzAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0zMDA7aTw3MDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKwl9CisKKwlpZighbG9naWNfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDJcbiIpOworCX0KKworCWZvcihpPTA7aTwxMDAwOysraSkKKwl7CisJCWxvZ2ljc1tpXT0xOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCY6Yml0X2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsJCisJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCXsKKwkJCQliaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsJCisJCQlmb3IoaT0zMDA7aTw3MDA7KytpKQorCQkJeworCQkJCWJpdF9hbmQgPSAoYml0X2FuZCAmIGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJewkKKwkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJeworCQkJCWJpdF9hbmQgPSAoYml0X2FuZCAmIGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKwl9CisJaWYoIWJpdF9hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMVxuIik7CisJfQorCisJYml0X2FuZCA9IDE7CisJbG9naWNzWzUwMV09MDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCY6Yml0X2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTA7aTwzMDA7KytpKQorCQkJeworCQkJCWJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQl7CisJCQkJYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQl7CisJCQkJYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3NbaV07CisJCQl9CisJCX0KKwl9CisJaWYoYml0X2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBBTkQgcGFydCAyIik7CisJfQorCisJZm9yKGk9MDtpPDEwMDA7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofDpiaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCXsKKwkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9MzAwO2k8NzAwOysraSkKKwkJCXsKKwkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQl7CisJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJfQorCQl9CisJfQorCWlmKGJpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDFcbiIpOworCX0KKwliaXRfb3IgPSAwOworCWxvZ2ljc1s1MDFdPTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8OmJpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTA7aTwzMDA7KytpKQorCQkJeworCQkJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT0zMDA7aTw3MDA7KytpKQorCQkJeworCQkJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT03MDA7aTwxMDAwOysraSkKKwkJCXsKKwkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQl9CisJCX0KKwl9CisJaWYoIWJpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDJcbiIpOworCX0KKworCWZvcihpPTA7aTwxMDAwO2krKykKKwl7CisJCWxvZ2ljc1tpXT0wOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJewkKKwkJCWZvcihpPTA7aTwzMDA7KytpKQorCQkJeworCQkJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CQorCQkJZm9yKGk9MzAwO2k8NzAwOysraSkKKwkJCXsKKwkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJewkKKwkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJeworCQkJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorCX0KKwlpZihleGNsdXNpdl9iaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAxXG4iKTsKKwl9CisKKwlleGNsdXNpdl9iaXRfb3IgPSAwOworCWxvZ2ljc1s1MDFdPTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTA7aTwzMDA7KytpKQorCQkJeworCQkJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT0zMDA7aTw3MDA7KytpKQorCQkJeworCQkJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT03MDA7aTwxMDAwOysraSkKKwkJCXsKKwkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQl9CisJCX0KKwl9CisJaWYoIWV4Y2x1c2l2X2JpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDJcbiIpOworCX0KKzwvb21wdHM6b3JwaGFuPgorCS8qcHJpbnRmKCJcblJlc3VsdDolZFxuIixyZXN1bHQpOyovCisJcmV0dXJuIChyZXN1bHQ9PTApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zaGFyZWQuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zaGFyZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjI4ZTM4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NoYXJlZC5jCkBAIC0wLDAgKzEsNDMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgc2hhcmVkIG9wdGlvbiBvZiB0aGUgcGFyYWxsZWwgY29uc3RydWN0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgc2hhcmVkPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX3NoYXJlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgaW50IGk7CisgIGludCBzdW07CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIHN1bSA9IDA7CisgIGludCBrbm93bl9zdW07CisgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMiA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnNoYXJlZChzdW0pPC9vbXB0czpjaGVjaz4gPG9tcHRzOmNyb3NzY2hlY2s+Zmlyc3Rwcml2YXRlKHN1bSk8L29tcHRzOmNyb3NzY2hlY2s+CisgIHsKKyAgICA8b21wdHM6b3JwaGFuPgorICAgIGludCBteXN1bSA9IDA7CisjcHJhZ21hIG9tcCBmb3IKKwlmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorCXsKKwkgIG15c3VtID0gbXlzdW0gKyBpOworCX0gCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgIHN1bSA9IHN1bSArIG15c3VtOworCX0gICAvKiBlbmQgb2YgY3JpdGljYWwgKi8KKzwvb21wdHM6b3JwaGFuPgorCisgIH0gICAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAgaWYgKGtub3duX3N1bSAhPSBzdW0pIHsKKyAgCWZwcmludGYobG9nRmlsZSwgIktOT1dOX1NVTSA9ICVkOyBTVU0gPSAlZFxuIiwga25vd25fc3VtLCBzdW0pOworICB9CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25fZmlyc3Rwcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbl9maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDM1ZDEwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25fZmlyc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw1MiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgc2VjdGlvbiBmaXJzdHByaXZhdGUgZGlyZWN0aXZlIGJ5IGFkZGluZyBhIHZhcmlhYmxlIHdoaWNoIGlzIGRlZmluZWQgYmVmb3JlIHRoZSBwYXJhbGxlbCByZWdpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmaXJzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfc2VjdGlvbl9maXJzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworCTxvbXB0czpvcnBoYW46dmFycz4KKwkgICAgaW50IHN1bTsKKwkgICAgaW50IHN1bTA7CisJPC9vbXB0czpvcnBoYW46dmFycz4KKwlpbnQga25vd25fc3VtOworCisJc3VtMCA9IDExOworCXN1bSA9IDc7CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKzxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPmZpcnN0cHJpdmF0ZShzdW0wKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShzdW0wKTwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbiAKKwkJCXsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCQkJeworCQkJCQlzdW0gPSBzdW0gKyBzdW0wOworCQkJCX0gLyplbmQgb2YgY3JpdGljYWwgKi8KKwkJCX0gICAgCisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQkJCXsKKwkJCQkJc3VtID0gc3VtICsgc3VtMDsKKwkJCQl9IC8qZW5kIG9mIGNyaXRpY2FsICovCisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQkJCXsKKwkJCQkJc3VtID0gc3VtICsgc3VtMDsKKwkJCQl9IC8qZW5kIG9mIGNyaXRpY2FsICovCisJCQl9ICAgICAgICAgICAgICAgCisJCX0gLyplbmQgb2Ygc2VjdGlvbnMqLworPC9vbXB0czpvcnBoYW4+CisJfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKwlrbm93bl9zdW0gPSAxMSAqIDMgKyA3OworCXJldHVybiAoa25vd25fc3VtID09IHN1bSk7IAorfSAvKiBlbmQgb2YgY2hlY2tfc2VjdGlvbl9maXJzdHByaXZhdGUqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uX2xhc3Rwcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbl9sYXN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YWUwZGYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbl9sYXN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNzMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNlY3Rpb24gbGFzdHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2VjdGlvbiBsYXN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9zZWN0aW9uX2xhc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IGkwID0gLTE7CisJaW50IHN1bSA9IDA7CisgICAgICAgIGludCBpOworICAgICAgICBpbnQgc3VtMCA9IDA7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQga25vd25fc3VtOworCisgICAgaTAgPSAtMTsKKyAgICBzdW0gPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPmxhc3Rwcml2YXRlKGkwKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpMCk8L29tcHRzOmNyb3NzY2hlY2s+IHByaXZhdGUoaSxzdW0wKQorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24gIAorCSAgICB7CisJCXN1bTAgPSAwOworCQlmb3IgKGkgPSAxOyBpIDwgNDAwOyBpKyspCisJCXsKKwkJICAgIHN1bTAgPSBzdW0wICsgaTsKKwkJICAgIGkwID0gaTsKKwkJfQorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJeworCQkgICAgc3VtID0gc3VtICsgc3VtMDsKKwkJfSAvKmVuZCBvZiBjcml0aWNhbCovCisJICAgIH0gLyogZW5kIG9mIHNlY3Rpb24gKi8KKyNwcmFnbWEgb21wIHNlY3Rpb24gCisJICAgIHsKKwkJc3VtMCA9IDA7CisJCWZvcihpID0gNDAwOyBpIDwgNzAwOyBpKyspCisJCXsKKwkJICAgIHN1bTAgPSBzdW0wICsgaTsKKwkJICAgIGkwID0gaTsKKwkJfQorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJeworCQkgICAgc3VtID0gc3VtICsgc3VtMDsKKwkJfSAvKmVuZCBvZiBjcml0aWNhbCovCisJICAgIH0KKyNwcmFnbWEgb21wIHNlY3Rpb24gCisJICAgIHsKKwkJc3VtMCA9IDA7CisJCWZvcihpID0gNzAwOyBpIDwgMTAwMDsgaSsrKQorCQl7CisJCSAgICBzdW0wID0gc3VtMCArIGk7CisJCSAgICBpMCA9IGk7CisJCX0KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCXsKKwkJICAgIHN1bSA9IHN1bSArIHN1bTA7CisJCX0gLyplbmQgb2YgY3JpdGljYWwqLworCSAgICB9CisJfSAvKiBlbmQgb2Ygc2VjdGlvbnMqLworCTwvb21wdHM6b3JwaGFuPgorICAgIH0gLyogZW5kIG9mIHBhcmFsbGVsKi8gICAgCisgICAga25vd25fc3VtID0gKDk5OSAqIDEwMDApIC8gMjsKKyAgICByZXR1cm4gKChrbm93bl9zdW0gPT0gc3VtKSAmJiAoaTAgPT0gOTk5KSApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uX3ByaXZhdGUuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTlhMmY4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25fcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNjkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNlY3Rpb24gcHJpdmF0ZSBkaXJlY3RpdmUgYnkgdXBjb3VudGluZyBhIHZhcmlhYmxlIGluIGEgdG8gc2V2ZXJhbCBzZWN0aW9ucyBzcGxpdHRlZCBsb29wLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2VjdGlvbiBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3NlY3Rpb25fcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzdW07CisJaW50IHN1bTA7CisgICAgaW50IGk7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQga25vd25fc3VtOworCisgICAgc3VtID0gNzsKKyAgICBzdW0wID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wICBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cHJpdmF0ZShzdW0wLGkpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKGkpPC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24gCisJICAgIHsKKwkJPG9tcHRzOmNoZWNrPgorICAgICAgICBzdW0wID0gMDsKKyAgICAgICAgPC9vbXB0czpjaGVjaz4KKwkJZm9yIChpID0gMTsgaSA8IDQwMDsgaSsrKQorCQkgICAgc3VtMCA9IHN1bTAgKyBpOworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJeworCQkgICAgc3VtID0gc3VtICsgc3VtMDsKKwkJfSAvKmVuZCBvZiBjcml0aWNhbCAqLworCSAgICB9ICAgIAorI3ByYWdtYSBvbXAgc2VjdGlvbgorCSAgICB7CisgICAgICAgICAgPG9tcHRzOmNoZWNrPgorCQlzdW0wID0gMDsKKyAgICAgICAgICA8L29tcHRzOmNoZWNrPgorCQlmb3IgKGkgPSA0MDA7IGkgPCA3MDA7IGkrKykKKwkJICAgIHN1bTAgPSBzdW0wICsgaTsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCXsKKwkJICAgIHN1bSA9IHN1bSArIHN1bTA7CisJCX0gLyplbmQgb2YgY3JpdGljYWwgKi8KKwkgICAgfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCSAgICB7CisgICAgICAgICAgPG9tcHRzOmNoZWNrPgorCQlzdW0wID0gMDsKKyAgICAgICAgICA8L29tcHRzOmNoZWNrPgorCQlmb3IgKGkgPSA3MDA7IGkgPCAxMDAwOyBpKyspCisJCSAgICBzdW0wID0gc3VtMCArIGk7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQl7CisJCSAgICBzdW0gPSBzdW0gKyBzdW0wOworCQl9IC8qZW5kIG9mIGNyaXRpY2FsICovCisJICAgIH0gICAgICAgICAgICAgICAKKwl9IC8qZW5kIG9mIHNlY3Rpb25zKi8KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICAgIGtub3duX3N1bSA9ICg5OTkgKiAxMDAwKSAvIDIgKyA3OworICAgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7IAorfSAvKiBlbmQgb2YgY2hlY2tfc2VjdGlvbl9wcml2YXRlKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbnNfbm93YWl0LmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbnNfbm93YWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkxYTM3NQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uc19ub3dhaXQuYwpAQCAtMCwwICsxLDY2IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czpkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGZvciBub3dhaXQgZGlyZWN0aXZlLiBJdCBmaWxscyBhbiBhcnJheSB3aXRoIHZhbHVlcyBhbmQgb3BlcmF0ZXMgb24gdGhlc2UgaW4gdGhlIGZvbGxvd2luZy48L29tcHRzOmRlc2NyaXB0aW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgc2VjdGlvbnMgbm93YWl0PC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dmVyc2lvbj4xLjA8L29tcHRzOnZlcnNpb24+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmFsbGVsIHNlY3Rpb25zLCBvbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9zZWN0aW9uc19ub3dhaXQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworCTxvbXB0czpvcnBoYW46dmFycz4KKwkJaW50IHJlc3VsdDsKKwkJaW50IGNvdW50OworCTwvb21wdHM6b3JwaGFuOnZhcnM+CisJaW50IGo7CisKKwlyZXN1bHQgPSAwOworCWNvdW50ID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworCTxvbXB0czpvcnBoYW4+CisJaW50IHJhbms7CisKKwlyYW5rID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCQorI3ByYWdtYSBvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPm5vd2FpdDwvb21wdHM6Y2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmcHJpbnRmIChsb2dGaWxlLCAiVGhyZWFkIG5yICVkIGVudGVycyBmaXJzdCBzZWN0aW9uIGFuZCBnZXRzIHNsZWVwaW5nLlxuIiwgcmFuayk7CisJCQkJbXlfc2xlZXAoU0xFRVBUSU1FKTsKKwkJCQljb3VudCA9IDE7CisJCQkJZnByaW50ZiAobG9nRmlsZSwgIlRocmVhZCBuciAlZCB3b2tlIHVwIGFuIHNldCBjb3VudCB0byAxLlxuIiwgcmFuayk7CisjcHJhZ21hIG9tcCBmbHVzaChjb3VudCkKKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmcHJpbnRmIChsb2dGaWxlLCAiVGhyZWFkIG5yICVkIGV4ZWN1dGVkIHdvcmsgaW4gdGhlIGZpcnN0IHNlY3Rpb24uXG4iLCByYW5rKTsKKwkJCX0KKwkJfQorLyogQmVnaW4gb2Ygc2Vjb25kIHNlY3Rpb25zIGVudmlyb25tZW50ICovCisjcHJhZ21hIG9tcCBzZWN0aW9ucworCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZnByaW50ZiAobG9nRmlsZSwgIlRocmVhZCBuciAlZCBleGVjdXRlZCB3b3JrIGluIHRoZSBzZWNvbmQgc2VjdGlvbi5cbiIsIHJhbmspOworCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZwcmludGYgKGxvZ0ZpbGUsICJUaHJlYWQgbnIgJWQgZXhlY3V0ZWQgd29yayBpbiB0aGUgc2Vjb25kIHNlY3Rpb24gYW5kIGNvbnRyb2xzIHRoZSB2YWx1ZSBvZiBjb3VudFxuIiwgcmFuayk7CisJCQkJaWYgKGNvdW50ID09IDApCisJCQkJCXJlc3VsdCA9IDE7CisJCQkJZnByaW50ZiAobG9nRmlsZSwgImNvdXQgd2FzICVkIiwgY291bnQpOworCQkJfQorCQl9CisJPC9vbXB0czpvcnBoYW4+CisJfQorCQorCXJldHVybiByZXN1bHQ7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25zX3JlZHVjdGlvbi5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25zX3JlZHVjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNzgyOWEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbnNfcmVkdWN0aW9uLmMKQEAgLTAsMCArMSw2MTMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNlY3Rpb25zIHJlZHVjdGlvbiBkaXJlY3RpdmUgd2l0aCBhbGwgaXRzIG9wdGlvbnMuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBzZWN0aW9ucyByZWR1Y3Rpb248L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3NlY3Rpb25zX3JlZHVjdGlvbjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisJPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBzdW07CisJaW50IGtub3duX3N1bTsKKwlkb3VibGUgZHB0LGRzdW07CisJZG91YmxlIGRrbm93bl9zdW07CisJZG91YmxlIGR0PTAuNTsJCQkJLyogYmFzZSBvZiBnZW9tZXRyaWMgcm93IGZvciArIGFuZCAtIHRlc3QqLworCWRvdWJsZSByb3VuZGluZ19lcnJvcj0gMS5FLTk7CisJaW50IGRpZmY7CisJZG91YmxlIGRkaWZmOworCWludCBwcm9kdWN0OworCWludCBrbm93bl9wcm9kdWN0OworCWludCBsb2dpY19hbmQ7CisJaW50IGJpdF9hbmQ7CisJaW50IGxvZ2ljX29yOworCWludCBiaXRfb3I7CisJaW50IGV4Y2x1c2l2X2JpdF9vcjsKKwlpbnQgbG9naWNzWzEwMDBdOworCWludCBpOworCWludCByZXN1bHQ7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKwkvKiAgaW50IG15X2lzbGFyZ2VyOyovCisJLyppbnQgaXNfbGFyZ2VyPTE7Ki8KKworICAgIHN1bSA9NzsKKyAgICBkcHQgPTE7CisgICAgZHN1bT0wOworICAgIHByb2R1Y3QgPTE7CisJbG9naWNfYW5kPTE7CisJYml0X2FuZD0xOworCWxvZ2ljX29yPTA7CisJYml0X29yPTA7CisJZXhjbHVzaXZfYml0X29yPTA7CisgICAgcmVzdWx0ID0gMDsKKwlkdCA9IDEuLzMuOworCWtub3duX3N1bSA9ICg5OTkqMTAwMCkvMis3OworPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworCisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpzdW0pPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MTtpPDMwMDtpKyspCisJCQkJeworCQkJCQlzdW09c3VtK2k7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0zMDA7aTw3MDA7aSsrKQorCQkJCXsKKwkJCQkJc3VtPXN1bStpOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9NzAwO2k8MTAwMDtpKyspCisJCQkJeworCQkJCQlzdW09c3VtK2k7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYoa25vd25fc3VtIT1zdW0pCisJeworCQkrK3Jlc3VsdDsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkXG4iLCBzdW0sa25vd25fc3VtKTsKKwl9CisKKwlkaWZmID0gKDk5OSoxMDAwKS8yOworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkaWZmKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJCXsKKwkJCQkJZGlmZj1kaWZmLWk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0zMDA7aTw3MDA7aSsrKQorCQkJCXsKKwkJCQkJZGlmZj1kaWZmLWk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCQl7CisJCQkJCWRpZmY9ZGlmZi1pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmKGRpZmYgIT0gMCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mIDAuXG4iLGRpZmYpOworCX0KKworCWZvciAoaT0wO2k8MjA7KytpKQorCXsKKwkJZHB0Kj1kdDsKKwl9CisJZGtub3duX3N1bSA9ICgxLWRwdCkvKDEtZHQpOworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpkc3VtKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTA7aTw2OysraSkKKwkJCQl7CisJCQkJCWRzdW0gKz0gcG93KGR0LGkpOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9NjtpPDEyOysraSkKKwkJCQl7CisJCQkJCWRzdW0gKz0gcG93KGR0LGkpOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MTI7aTwyMDsrK2kpCisJCQkJeworCQkJCQlkc3VtICs9IHBvdyhkdCxpKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZiggZmFicyhkc3VtLWRrbm93bl9zdW0pID4gcm91bmRpbmdfZXJyb3IgKQorCXsKKwkJcmVzdWx0Kys7IAorCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJWYgaW5zdGVhZCBvZiAlZiAoRGlmZmVyZW5jZTogJUUpXG4iLGRzdW0sZGtub3duX3N1bSwgZHN1bS1ka25vd25fc3VtKTsKKwl9CisKKwlkcHQ9MTsKKworCWZvciAoaT0wO2k8MjA7KytpKQorCXsKKwkJZHB0Kj1kdDsKKwl9CisJZnByaW50Zihsb2dGaWxlLCJcbiIpOworCWRkaWZmID0gKDEtZHB0KS8oMS1kdCk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigtOmRkaWZmKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTA7aTw2OysraSkKKwkJCQl7CisJCQkJCWRkaWZmIC09IHBvdyhkdCxpKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTY7aTwxMjsrK2kpCisJCQkJeworCQkJCQlkZGlmZiAtPSBwb3coZHQsaSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0xMjtpPDIwOysraSkKKwkJCQl7CisJCQkJCWRkaWZmIC09IHBvdyhkdCxpKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZiggZmFicyhkZGlmZikgPiByb3VuZGluZ19lcnJvcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVFIGluc3RlYWQgb2YgMC4wXG4iLGRkaWZmKTsKKwl9CisKKworCWtub3duX3Byb2R1Y3QgPSAzNjI4ODAwOworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKjpwcm9kdWN0KTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CQorCQkJCWZvcihpPTE7aTwzO2krKykKKwkJCQl7CisJCQkJCXByb2R1Y3QgKj0gaTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9MztpPDc7aSsrKQorCQkJCXsKKwkJCQkJcHJvZHVjdCAqPSBpOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IoaT03O2k8MTE7aSsrKQorCQkJCXsKKwkJCQkJcHJvZHVjdCAqPSBpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmKGtub3duX3Byb2R1Y3QgIT0gcHJvZHVjdCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIFByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkXG4iLHByb2R1Y3Qsa25vd25fcHJvZHVjdCk7CisJfQorCisJZm9yKGk9MDtpPDEwMDA7aSsrKQorCXsKKwkJbG9naWNzW2ldPTE7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmJjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MTtpPDMwMDtpKyspCisJCQkJeworCQkJCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0zMDA7aTw3MDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9NzAwO2k8MTAwMDtpKyspCisJCQkJeworCQkJCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYoIWxvZ2ljX2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDFcbiIpOworCX0KKworCWxvZ2ljX2FuZCA9IDE7CisJbG9naWNzWzUwMV0gPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmJjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MTtpPDMwMDtpKyspCisJCQkJeworCQkJCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0zMDA7aTw3MDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9NzAwO2k8MTAwMDtpKyspCisJCQkJeworCQkJCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYobG9naWNfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMlxuIik7CisJfQorCisJZm9yKGk9MDtpPDEwMDA7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofHw6bG9naWNfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MTtpPDMwMDtpKyspCisJCQkJeworCQkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCQl7CisJCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCQl7CisJCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYobG9naWNfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJcbkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMVxuIik7CisJfQorCisJbG9naWNfb3IgPSAwOworCWxvZ2ljc1s1MDFdPTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8fDpsb2dpY19vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0xO2k8MzAwO2krKykKKwkJCQl7CisJCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0zMDA7aTw3MDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZighbG9naWNfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDJcbiIpOworCX0KKworCisJZm9yKGk9MDtpPDEwMDA7KytpKQorCXsKKwkJbG9naWNzW2ldPTE7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJjpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CQorCQkJCWZvcihpPTA7aTwzMDA7KytpKQorCQkJCXsKKwkJCQkJYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CQorCQkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQkJeworCQkJCQliaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsJCisJCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQkJeworCQkJCQliaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZighYml0X2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBBTkQgcGFydCAxXG4iKTsKKwl9CisKKwliaXRfYW5kID0gMTsKKwlsb2dpY3NbNTAxXT0wOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJjpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9MDtpPDMwMDsrK2kpCisJCQkJeworCQkJCQliaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9MzAwO2k8NzAwOysraSkKKwkJCQl7CisJCQkJCWJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IoaT03MDA7aTwxMDAwOysraSkKKwkJCQl7CisJCQkJCWJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZihiaXRfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDJcbiIpOworCX0KKworCWZvcihpPTA7aTwxMDAwO2krKykKKwl7CisJCWxvZ2ljc1tpXT0wOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHw6Yml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9MDtpPDMwMDsrK2kpCisJCQkJeworCQkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQkJeworCQkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJCXsKKwkJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZihiaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgT1IgcGFydCAxXG4iKTsKKwl9CisJYml0X29yID0gMDsKKwlsb2dpY3NbNTAxXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofDpiaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCQl7CisJCQkJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9MzAwO2k8NzAwOysraSkKKwkJCQl7CisJCQkJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQkJeworCQkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmKCFiaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgT1IgcGFydCAyXG4iKTsKKwl9CisKKwlmb3IoaT0wO2k8MTAwMDtpKyspCisJeworCQlsb2dpY3NbaV09MDsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJewkKKwkJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCQl7CisJCQkJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CQorCQkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQkJeworCQkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJewkKKwkJCQlmb3IoaT03MDA7aTwxMDAwOysraSkKKwkJCQl7CisJCQkJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYoZXhjbHVzaXZfYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMVxuIik7CisJfQorCisJZXhjbHVzaXZfYml0X29yID0gMDsKKwlsb2dpY3NbNTAxXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCQl7CisJCQkJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9MzAwO2k8NzAwOysraSkKKwkJCQl7CisJCQkJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQkJeworCQkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmKCFleGNsdXNpdl9iaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAyXG4iKTsKKwl9Cis8L29tcHRzOm9ycGhhbj4KKwkvKnByaW50ZigiXG5SZXN1bHQ6JWRcbiIscmVzdWx0KTsqLworCXJldHVybiAocmVzdWx0PT0wKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMyYjBkMgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGUuYwpAQCAtMCwwICsxLDQzIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBzaW5nbGUgZGlyZWN0aXZlIGJ5IGNvbnRyb2xsaW5nIGhvdyBvZnRlbiBhIGRpcmVjdGl2ZSBpcyBjYWxsZWQgaW4gYW4gb21wIHNpbmdsZSByZWdpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBzaW5nbGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFyYWxsZWwgcHJpdmF0ZSxvbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfc2luZ2xlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisJaW50IHJlc3VsdDsKKwlpbnQgbnJfaXRlcmF0aW9uczsKKwlpbnQgaTsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUgPSAwOworICAgIHJlc3VsdCA9IDA7CisgICAgbnJfaXRlcmF0aW9ucyA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUoaSkKKyAgICB7CisJZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorCXsKKwkgICAgPG9tcHRzOm9ycGhhbj4KKwkJPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIHNpbmdsZSA8L29tcHRzOmNoZWNrPgorCQl7ICAKKyNwcmFnbWEgb21wIGZsdXNoCisJCSAgICBucl90aHJlYWRzX2luX3NpbmdsZSsrOworI3ByYWdtYSBvbXAgZmx1c2ggICAgICAgICAgICAgICAgICAgICAgICAgCisJCSAgICBucl9pdGVyYXRpb25zKys7CisJCSAgICBucl90aHJlYWRzX2luX3NpbmdsZS0tOworCQkgICAgcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisJCX0gLyogZW5kIG9mIHNpbmdsZSAqLyAgICAKKwkgICAgPC9vbXB0czpvcnBoYW4+CisJfSAvKiBlbmQgb2YgZm9yICAqLworICAgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisgICAgcmV0dXJuICgocmVzdWx0ID09IDApICYmIChucl9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworfSAvKiBlbmQgb2YgY2hlY2tfc2luZ2xlKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlX2NvcHlwcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlX2NvcHlwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM3Y2Q1NAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGVfY29weXByaXZhdGUuYwpAQCAtMCwwICsxLDUwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBzaW5nbGUgY29weXByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2luZ2xlIGNvcHlwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmxsZWwsb21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCBqOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShqKQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfc2luZ2xlX2NvcHlwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCByZXN1bHQ7CisJaW50IG5yX2l0ZXJhdGlvbnM7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIHJlc3VsdCA9IDA7CisgICAgbnJfaXRlcmF0aW9ucyA9IDA7CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKwkgICAgeworCQkvKgorCQkgICBpbnQgdGhyZWFkOworCQkgICB0aHJlYWQgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisJCSAqLworI3ByYWdtYSBvbXAgc2luZ2xlIDxvbXB0czpjaGVjaz5jb3B5cHJpdmF0ZShqKTwvb21wdHM6Y2hlY2s+CisJCXsKKwkJICAgIG5yX2l0ZXJhdGlvbnMrKzsKKwkJICAgIGogPSBpOworCQkgICAgLypwcmludGYgKCJ0aHJlYWQgJWQgYXNzaWducywgaiA9ICVkLCBpID0gJWRcbiIsIHRocmVhZCwgaiwgaSk7Ki8KKwkJfQorCQkvKgkjcHJhZ21hIG9tcCBiYXJyaWVyKi8KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCXsKKwkJICAgIC8qcHJpbnRmICgidGhyZWFkID0gJWQsIGogPSAlZCwgaSA9ICVkXG4iLCB0aHJlYWQsIGosIGkpOyovCisJCSAgICByZXN1bHQgPSByZXN1bHQgKyBqIC0gaTsKKwkJfQorI3ByYWdtYSBvbXAgYmFycmllcgorCSAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICAgIHJldHVybiAoKHJlc3VsdCA9PSAwKSAmJiAobnJfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlX25vd2FpdC5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NpbmdsZV9ub3dhaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjdhMjUwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NpbmdsZV9ub3dhaXQuYwpAQCAtMCwwICsxLDYwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+PC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBzaW5nbGUgbm93YWl0PC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBhdG9taWM8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgbXlfaXRlcmF0aW9uczsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUobXlfaXRlcmF0aW9ucykKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3NpbmdsZV9ub3dhaXQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBucl9pdGVyYXRpb25zOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBpbnQgdG90YWxfaXRlcmF0aW9ucyA9IDA7CisgICAgaW50IGk7CisKKyAgICBucl9pdGVyYXRpb25zID0gMDsKKyAgICBteV9pdGVyYXRpb25zID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKQorICAgIHsKKwlmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisJeworCSAgICA8b21wdHM6b3JwaGFuPgorCQk8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgc2luZ2xlIG5vd2FpdDwvb21wdHM6Y2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIGF0b21pYyAgCisJCSAgICBucl9pdGVyYXRpb25zKys7CisJCX0gLyogZW5kIG9mIHNpbmdsZSovICAgIAorCSAgICA8L29tcHRzOm9ycGhhbj4KKwl9IC8qIGVuZCBvZiBmb3IgICovCisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKSAKKyAgICB7CisJbXlfaXRlcmF0aW9ucyA9IDA7CisJZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorCXsKKwkgICAgPG9tcHRzOm9ycGhhbj4KKwkJPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIHNpbmdsZSBub3dhaXQ8L29tcHRzOmNoZWNrPgorCQl7CisJCSAgICBteV9pdGVyYXRpb25zKys7CisJCX0gLyogZW5kIG9mIHNpbmdsZSovICAgIAorCSAgICA8L29tcHRzOm9ycGhhbj4KKwl9IC8qIGVuZCBvZiBmb3IgICovCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgICAgdG90YWxfaXRlcmF0aW9ucyArPSBteV9pdGVyYXRpb25zOworCX0KKworICAgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisgICAgcmV0dXJuICgobnJfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpICYmICh0b3RhbF9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworfSAvKiBlbmQgb2YgY2hlY2tfc2luZ2xlX25vd2FpdCovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NpbmdsZV9wcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzUwMmM3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3NpbmdsZV9wcml2YXRlLmMKQEAgLTAsMCArMSw1NiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgc2luZ2xlIHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2luZ2VsIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIGZsdXNoLG9tcCBzaW5nbGUgbm93YWl0PC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IG15aXQgPSAwOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShteWl0KQoraW50IG15cmVzdWx0ID0gMDsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUobXlyZXN1bHQpCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9zaW5nbGVfcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IG5yX3RocmVhZHNfaW5fc2luZ2xlOworCWludCByZXN1bHQ7CisJaW50IG5yX2l0ZXJhdGlvbnM7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgaTsKKworICAgIG15aXQgPSAwOworICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlID0gMDsKKyAgICBucl9pdGVyYXRpb25zID0gMDsKKyAgICByZXN1bHQgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKGkpCisgICAgeworCW15cmVzdWx0ID0gMDsKKwlteWl0ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisJeworCTxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBzaW5nbGUgPG9tcHRzOmNoZWNrPnByaXZhdGUobnJfdGhyZWFkc19pbl9zaW5nbGUpIDwvb21wdHM6Y2hlY2s+bm93YWl0CisJICAgIHsgIAorCQlucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisjcHJhZ21hIG9tcCBmbHVzaAorCQlucl90aHJlYWRzX2luX3NpbmdsZSsrOworI3ByYWdtYSBvbXAgZmx1c2ggICAgICAgICAgICAgICAgICAgICAgICAgCisJCW15aXQrKzsKKwkJbXlyZXN1bHQgPSBteXJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlOworCSAgICB9IC8qIGVuZCBvZiBzaW5nbGUgKi8gICAgCisJPC9vbXB0czpvcnBoYW4+CisJfSAvKiBlbmQgb2YgZm9yICovCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKyAgICAgICAgICAgIHJlc3VsdCArPSBucl90aHJlYWRzX2luX3NpbmdsZTsKKwkgICAgbnJfaXRlcmF0aW9ucyArPSBteWl0OworCX0KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICAgIHJldHVybiAoKHJlc3VsdCA9PSAwKSAmJiAobnJfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKK30gLyogZW5kIG9mIGNoZWNrX3NpbmdsZSBwcml2YXRlICovIAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFzay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlODk3OTAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFzay5jCkBAIC0wLDAgKzEsNTIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHRhc2sgZGlyZWN0aXZlLiBUaGUgaWRlYSBvZiB0aGUgdGVzdHMgaXMgdG8gZ2VuZXJhdGUgYSBzZXQgb2YgdGFza3MgaW4gYSBzaW5nbGUgcmVnaW9uLiBXZSBsZXQgcGF1c2UgdGhlIHRhc2tzIGdlbmVyYXRlZCBzbyB0aGF0IG90aGVyIHRocmVhZHMgZ2V0IHNoZWR1bGVkIHRvIHRoZSBuZXdseSBvcGVuZWQgdGFza3MuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IHRpZHNbTlVNX1RBU0tTXTsKKyAgICBpbnQgaTsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKK3sKKyNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgLyogRmlyc3Qgd2UgaGF2ZSB0byBzdG9yZSB0aGUgdmFsdWUgb2YgdGhlIGxvb3AgaW5kZXggaW4gYSBuZXcgdmFyaWFibGUKKyAgICAgICAgICAgICAqIHdoaWNoIHdpbGwgYmUgcHJpdmF0ZSBmb3IgZWFjaCB0YXNrIGJlY2F1c2Ugb3RoZXJ3aXNlIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4KKyAgICAgICAgICAgICAqIGlmIHRoZSBleGVjdXRpb24gb2YgdGhlIHRhc2sgdGFrZXMgbG9uZ2VyIHRoYW4gdGhlIHRpbWUgd2hpY2ggaXMgbmVlZGVkIHRvIAorICAgICAgICAgICAgICogZW50ZXIgdGhlIG5leHQgc3RlcCBvZiB0aGUgbG9vcCEKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaW50IG15aTsKKyAgICAgICAgICAgIG15aSA9IGk7CisKKzxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCB0YXNrPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBteV9zbGVlcCAoU0xFRVBUSU1FKTsKKworICAgICAgICAgICAgICAgIHRpZHNbbXlpXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgICAgfSAvKiBlbmQgb2Ygb21wIHRhc2sgKi8KKyAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKyAgICB9IC8qIGVuZCBvZiBzaW5nbGUgKi8KK30gLyplbmQgb2YgcGFyYWxsZWwgKi8KKworLyogTm93IHdlIGNrZWNrIGlmIG1vcmUgdGhhbiBvbmUgdGhyZWFkIGV4ZWN1dGVkIHRoZSB0YXNrcy4gKi8KKyAgICBmb3IgKGkgPSAxOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgaWYgKHRpZHNbMF0gIT0gdGlkc1tpXSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30gLyogZW5kIG9mIGNoZWNrX3BhcmFsbGVsX2Zvcl9wcml2YXRlICovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfZmluYWwuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2ZpbmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUwMGM1ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2ZpbmFsLmMKQEAgLTAsMCArMSw1MiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgdGFzayBkaXJlY3RpdmUuIFRoZSBpZGVhIG9mIHRoZSB0ZXN0cyBpcyB0byBnZW5lcmF0ZSBhIHNldCBvZiB0YXNrcyBpbiBhIHNpbmdsZSByZWdpb24uIFdlIGxldCBwYXVzZSB0aGUgdGFza3MgZ2VuZXJhdGVkIHNvIHRoYXQgb3RoZXIgdGhyZWFkcyBnZXQgc2hlZHVsZWQgdG8gdGhlIG5ld2x5IG9wZW5lZCB0YXNrcy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2sgZmluYWw8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfZmluYWw8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgdGlkc1tOVU1fVEFTS1NdOworICAgIGludCBpOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IGVycm9yOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCit7CisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIC8qIEZpcnN0IHdlIGhhdmUgdG8gc3RvcmUgdGhlIHZhbHVlIG9mIHRoZSBsb29wIGluZGV4IGluIGEgbmV3IHZhcmlhYmxlCisgICAgICAgICAgICAgKiB3aGljaCB3aWxsIGJlIHByaXZhdGUgZm9yIGVhY2ggdGFzayBiZWNhdXNlIG90aGVyd2lzZSBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuCisgICAgICAgICAgICAgKiBpZiB0aGUgZXhlY3V0aW9uIG9mIHRoZSB0YXNrIHRha2VzIGxvbmdlciB0aGFuIHRoZSB0aW1lIHdoaWNoIGlzIG5lZWRlZCB0byAKKyAgICAgICAgICAgICAqIGVudGVyIHRoZSBuZXh0IHN0ZXAgb2YgdGhlIGxvb3AhCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGludCBteWk7CisgICAgICAgICAgICBteWkgPSBpOworCisgICAgICAgICAgICAjcHJhZ21hIG9tcCB0YXNrIDxvbXB0czpjaGVjaz5maW5hbChpPj0xMCk8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG15X3NsZWVwIChTTEVFUFRJTUUpOworCisgICAgICAgICAgICAgICAgdGlkc1tteWldID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgIH0gLyogZW5kIG9mIGZvciAqLworICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworfSAvKmVuZCBvZiBwYXJhbGxlbCAqLworCisvKiBOb3cgd2UgY2tlY2sgaWYgbW9yZSB0aGFuIG9uZSB0aHJlYWQgZXhlY3V0ZWQgdGhlIHRhc2tzLiAqLworICAgIGZvciAoaSA9IDEwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgaWYgKHRpZHNbMTBdICE9IHRpZHNbaV0pCisgICAgICAgICAgICBlcnJvcisrOworICAgIH0KKyAgICByZXR1cm4gKGVycm9yPT0wKTsKK30gLyogZW5kIG9mIGNoZWNrX3BhcmFsbGVsX2Zvcl9wcml2YXRlICovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfZmlyc3Rwcml2YXRlLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza19maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWEwNzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfZmlyc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw1MSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBmaXJzdHByaXZhdGUgY2xhdXNlIG9mIHRoZSB0YXNrIGRpcmVjdGl2ZS4gV2UgY3JlYXRlIGEgc2V0IG9mIHRhc2tzIGluIGEgc2luZ2xlIHJlZ2lvbi4gV2UgZGVmaW5lcyBhIHZhcmlhYmxlIG5hbWVkIHN1bSB1bmVxdWFsIHplcm8gd2hpY2ggZ2V0cyBkZWNsYXJlZCBmaXJzdHByaXZhdGUgZm9yIGVhY2ggdGFzay4gTm93IGVhY2ggdGFzayBjYWxjdWFsdGVzIGEgc3VtIHVzaW5nIHRoaXMgcHJpdmF0ZSB2YXJpYWJsZS4gQmVmb3JlIGVhY2ggY2FsY3VhbGF0aW9uIHN0ZXAgd2UgaW50cm9kdWNlIGEgZmx1c2ggY29tbWFuZCBzbyB0aGF0IG1heWJlIHRoZSBwcml2YXRlIHZhcmlhYmVsIGdldHMgYmFkLiBBdCB0aGUgZW5kIHdlIGNoZWNrIGlmIHRoZSBjYWxjdWxhdGVkIHN1bSB3YXMgcmlnaHQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrIGZpcnN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGUsb21wIGZsdXNoLG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFza19maXJzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIGludCBpOworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgc3VtID0gMTIzNDsKKyAgICBpbnQga25vd25fc3VtOworICAgIGludCByZXN1bHQgPSAwOyAvKiBjb3VudHMgdGhlIHdyb25nIHN1bXMgZnJvbSB0YXNrcyAqLworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBrbm93bl9zdW0gPSAxMjM0ICsgKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyNwcmFnbWEgb21wIHNpbmdsZQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIHRhc2sgPG9tcHRzOmNoZWNrPmZpcnN0cHJpdmF0ZShzdW0pPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBqOworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDw9IExPT1BDT1VOVDsgaisrKSB7CisjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGo7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBpZiBjYWxjdWxhdGVkIHN1bSB3YXMgcmlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1bSAhPSBrbm93bl9zdW0pIHsKKyNwcmFnbWEgb21wIGNyaXRpY2FsIAorICAgICAgICAgICAgICAgICAgICAgIHsgcmVzdWx0Kys7IH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgICAgICB9CS8qIGVuZCBvZiBmb3IgKi8KKyAgICAgICAgfSAvKiBlbmQgb2Ygc2luZ2xlICovCisgICAgfQkvKiBlbmQgb2YgcGFyYWxsZWwqLworCisgICAgcmV0dXJuIChyZXN1bHQgPT0gMCk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfaWYuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA3YWIyZgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2lmLmMKQEAgLTAsMCArMSw0MyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBpZiBjbGF1c2Ugb2YgdGhlIG9tcCB0YXNrIGRpcmVjdGl2ZS4gVGhlIGlkZWFyIG9mIHRoZSB0ZXN0cyBpcyB0byBnZW5lcmF0ZSBhIHRhc2tzIGluIGEgc2luZ2xlIHJlZ2lvbiBhbmQgcGF1c2UgaXQgaW1tZWRpYXRlbHkuIFRoZSBwYXJlbnQgdGhyZWFkIG5vdyBzaGFsbCBzZXQgYSBjb3VudGVyIHZhcmlhYmxlIHdoaWNoIHRoZSBwYXVzZWQgdGFzayBzaGFsbCBldmFsdWF0ZSB3aGVuIHdva2UgdXAuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrIGlmPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZSxvbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFza19pZjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBjb25kaXRpb25fZmFsc2U7CisgICAgaW50IGNvdW50OworICAgIGludCByZXN1bHQ7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBjb3VudD0wOworICAgIGNvbmRpdGlvbl9mYWxzZSA9IChsb2dGaWxlID09IE5VTEwpOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCit7CisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCB0YXNrIDxvbXB0czpjaGVjaz5pZiAoY29uZGl0aW9uX2ZhbHNlKTwvb21wdHM6Y2hlY2s+IHNoYXJlZChjb3VudCwgcmVzdWx0KQorICAgICAgICB7CisgICAgICAgICAgICBteV9zbGVlcCAoU0xFRVBUSU1FX0xPTkcpOworLy8jcHJhZ21hIG9tcCBmbHVzaCAoY291bnQpCisgICAgICAgICAgICByZXN1bHQgPSAoMCA9PSBjb3VudCk7CisgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorCisgICAgICAgIGNvdW50ID0gMTsKKy8vI3ByYWdtYSBvbXAgZmx1c2ggKGNvdW50KQorCisgICAgfSAvKiBlbmQgb2Ygc2luZ2xlICovCit9IC8qZW5kIG9mIHBhcmFsbGVsICovCisKKyAgICByZXR1cm4gcmVzdWx0OworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2ltcF9maXJzdHByaXZhdGUuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2ltcF9maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjhmMGVmCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfaW1wX2ZpcnN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj4gVGVzdCB0byBzZWUgaWYgaW1wbGllZCBwcml2YXRlIHdvcmtzIHByb3Blcmx5PC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKKworCisvKiBVdGlsaXR5IGZ1bmN0aW9uIGRvIHNwZW5kIHNvbWUgdGltZSBpbiBhIGxvb3AgKi8KK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrX2ltcF9maXJzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIGludCBpPTU7CisgICAgaW50IGsgPSAwOworICAgIGludCByZXN1bHQgPSAwOworICAgIGludCB0YXNrX3Jlc3VsdCA9IDE7CisgICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGUoaSkKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICAgIHsKKyAgICAgCisgICAgICAgIAorICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBOVU1fVEFTS1M7IGsrKykKKwkgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgI3ByYWdtYSBvbXAgdGFzayBzaGFyZWQocmVzdWx0ICwgdGFza19yZXN1bHQ8b21wdHM6Y3Jvc3NjaGVjaz4sIGk8L29tcHRzOmNyb3NzY2hlY2s+KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgajsKKwkJCSAgLy9jaGVjayBpZiBpIGlzIHByaXZhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaSAhPSA1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tfcmVzdWx0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihqID0gMDsgaiA8IE5VTV9UQVNLUzsgaisrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMgc2hvdWxkIGJlIGZpcnN0cHJpdmF0ZSBpbXBsaWNpdGx5CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCX0KKworCSAgI3ByYWdtYSBvbXAgdGFza3dhaXQKKwkgIHJlc3VsdCA9ICh0YXNrX3Jlc3VsdCAmJiBpPT01KTsKKyAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgfQorICAgIAorICAgIHJldHVybiByZXN1bHQ7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfcHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfcHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZTI2ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza19wcml2YXRlLmMKQEAgLTAsMCArMSw1MyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBwcml2YXRlIGNsYXVzZSBvZiB0aGUgdGFzayBkaXJlY3RpdmUuIFdlIGNyZWF0ZSBhIHNldCBvZiB0YXNrcyBpbiBhIHNpbmdsZSByZWdpb24uIFdlIGRlZmluZXMgYSB2YXJpYWJsZSBuYW1lZCBzdW0gd2hpY2ggZ2V0cyBkZWNsYXJlZCBwcml2YXRlIGZvciBlYWNoIHRhc2suIE5vdyBlYWNoIHRhc2sgY2FsY3VhbHRlcyBhIHN1bSB1c2luZyB0aGlzIHByaXZhdGUgdmFyaWFibGUuIEJlZm9yZSBlYWNoIGNhbGN1YWxhdGlvbiBzdGVwIHdlIGludHJvZHVjZSBhIGZsdXNoIGNvbW1hbmQgc28gdGhhdCBtYXliZSB0aGUgcHJpdmF0ZSB2YXJpYWJlbCBnZXRzIGJhZC4gQXQgdGhlIGVuZCB3ZSBjaGVjayBpZiB0aGUgY2FsY3VsYXRlZCBzdW0gd2FzIHJpZ2h0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzayBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZSxvbXAgZmx1c2gsb21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gZG8gc3BlbmQgc29tZSB0aW1lIGluIGEgbG9vcCAqLworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgaW50IGk7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBrbm93bl9zdW07CisgICAgaW50IHN1bSA9IDA7CisgICAgaW50IHJlc3VsdCA9IDA7IC8qIGNvdW50cyB0aGUgd3Jvbmcgc3VtcyBmcm9tIHRhc2tzICovCisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCB0YXNrIDxvbXB0czpjaGVjaz5wcml2YXRlKHN1bSk8L29tcHRzOmNoZWNrPiBzaGFyZWQocmVzdWx0LCBrbm93bl9zdW0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgajsKKwkJICAgIC8vaWYgc3VtIGlzIHByaXZhdGUsIGluaXRpYWxpemUgdG8gMAorCQkgICAgPG9tcHRzOmNoZWNrPnN1bSA9IDA7PC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8PSBMT09QQ09VTlQ7IGorKykgeworI3ByYWdtYSBvbXAgZmx1c2gKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBqOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIGlmIGNhbGN1bGF0ZWQgc3VtIHdhcyByaWdodCAqLworICAgICAgICAgICAgICAgICAgICBpZiAoc3VtICE9IGtub3duX3N1bSkgeworI3ByYWdtYSBvbXAgY3JpdGljYWwgCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgICAgICB9CS8qIGVuZCBvZiBmb3IgKi8KKyAgICAgICAgfSAvKiBlbmQgb2Ygc2luZ2xlICovCisgICAgfQkvKiBlbmQgb2YgcGFyYWxsZWwqLworCisgICAgcmV0dXJuIChyZXN1bHQgPT0gMCk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfc2hhcmVkLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza19zaGFyZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGMyMTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfc2hhcmVkLmMKQEAgLTAsMCArMSw0NyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPiBUZXN0IHRvIHNlZSBpZiBpbXBsaWVkIHNoYXJlZCB3b3JrcyBjb3JyZWN0bHk8L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2s8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlLCBvbXAgdGFzayBmaXJzdHByaXZhdGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCisKKworLyogVXRpbGl0eSBmdW5jdGlvbiBkbyBzcGVuZCBzb21lIHRpbWUgaW4gYSBsb29wICovCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFza19pbXBfc2hhcmVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgaTsKKyAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgaT0wOworICAgIGludCBrID0gMDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKworICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgICAgICAgZm9yIChrID0gMDsgayA8IE5VTV9UQVNLUzsgaysrKSAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICAgICAgICAgICNwcmFnbWEgb21wIHRhc2sgPG9tcHRzOmNyb3NzY2hlY2s+IGZpcnN0cHJpdmF0ZShpKSA8L29tcHRzOmNyb3NzY2hlY2s+IDxvbXB0czpjaGVjaz4gc2hhcmVkKGkpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMgc2hvdWxkIGJlIHNoYXJlZCBpbXBsaWNpdGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+IAorICAgICAgICAgICAgICAgICAgfQorCisgICAgfQorCityZXN1bHQgPSBpOworcmV0dXJuICgocmVzdWx0ID09IE5VTV9UQVNLUykpOworICAgICAKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza191bnRpZWQuYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90YXNrX3VudGllZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNmViZTIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza191bnRpZWQuYwpAQCAtMCwwICsxLDY5IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCBmb3IgdW50aWVkIGNsYXVzZS4gRmlyc3QgZ2VuZXJhdGUgYSBzZXQgb2YgdGFza3MgYW5kIHBhdXNlIGl0IGltbWVkaWF0ZWx5LiBUaGVuIHdlIHJlc3VtZSBoYWxmIG9mIHRoZW0gYW5kIGNoZWNrIHdoZXRoZXIgdGhleSBhcmUgc2NoZWR1bGVkIGJ5IGRpZmZlcmVudCB0aHJlYWRzPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrIHVudGllZDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCB0YXNrd2FpdDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFza191bnRpZWQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworCisgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgaW50IGk7CisgIGludCBjb3VudDsKKyAgaW50IHN0YXJ0X3RpZFtOVU1fVEFTS1NdOworICBpbnQgY3VycmVudF90aWRbTlVNX1RBU0tTXTsKKyAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgY291bnQgPSAwOworICAKKyAgLyppbml0aWFsaXphdGlvbiovCisgIGZvciAoaT0wOyBpPCBOVU1fVEFTS1M7IGkrKyl7CisgICAgc3RhcnRfdGlkW2ldPTA7CisgICAgY3VycmVudF90aWRbaV09MDsKKyAgfQorICAKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlKGkpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgaW50IG15aSA9IGk7CisgICAgICAgICNwcmFnbWEgb21wIHRhc2sgPG9tcHRzOmNoZWNrPnVudGllZDwvb21wdHM6Y2hlY2s+CisgICAgICAgIHsKKyAgICAgICAgICBteV9zbGVlcChTTEVFUFRJTUUpOworICAgICAgICAgIHN0YXJ0X3RpZFtteWldID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgY3VycmVudF90aWRbbXlpXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgIAorICAgICAgICAgICNwcmFnbWEgb21wIHRhc2t3YWl0CisgICAgICAgICAgCisgICAgICAgICAgPG9tcHRzOmNoZWNrPmlmKChzdGFydF90aWRbbXlpXSAlMikgIT0wKXs8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgbXlfc2xlZXAoU0xFRVBUSU1FKTsKKyAgICAgICAgICAgIGN1cnJlbnRfdGlkW215aV0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICAgICAgfSAvKiBlbmQgb2YgaWYgKi8gCisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjdXJyZW50X3RpZFtteWldID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgfQorICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisKKyAgICAgICAgfSAvKmVuZCBvZiBvbXAgdGFzayAqLworICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgIH0gLyogZW5kIG9mIGZvciAqLworICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgIGZvciAoaT0wO2k8TlVNX1RBU0tTOyBpKyspCisgIHsKKyAgICBwcmludGYoInN0YXJ0X3RpZFslZF09JWQsIGN1cnJlbnRfdGlkWyVkXT0lZFxuIixpLCBzdGFydF90aWRbaV0sIGkgLCBjdXJyZW50X3RpZFtpXSk7CisgICAgaWYgKGN1cnJlbnRfdGlkW2ldID09IHN0YXJ0X3RpZFtpXSkKKyAgICAgIGNvdW50Kys7CisgIH0KKyAgcmV0dXJuIChjb3VudDxOVU1fVEFTS1MpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKworPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2t3YWl0LmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza3dhaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODc2MWYyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2t3YWl0LmMKQEAgLTAsMCArMSw3NSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgdGFza3dhaXQgZGlyZWN0aXZlLiBGaXJzdCB3ZSBnZW5lcmF0ZSBhIHNldCBvZiB0YXNrcywgd2hpY2ggc2V0IHRoZSBlbGVtZW50cyBvZiBhbiBhcnJheSB0byBhIHNwZWNpZmljIHZhbHVlLiBUaGVuIHdlIGRvIGEgdGFza3dhaXQgYW5kIGNoZWNrIGlmIGFsbCB0YXNrcyBmaW5pc2hlZCBtZWFuaW5nIGFsbCBhcnJheSBlbGVtZW50cyBjb250YWluIHRoZSByaWdodCB2YWx1ZS4gVGhlbiB3ZSBnZW5lcmF0ZSBhIHNlY29uZCBzZXQgc2V0dGluZyB0aGUgYXJyYXkgZWxlbWVudHMgdG8gYW5vdGhlciB2YWx1ZS4gQWZ0ZXIgdGhlIHBhcmFsbGVsIHJlZ2lvbiB3ZSBjaGVjayBpZiBhbGwgdGFza3Mgb2YgdGhlIHNlY29uZCBzZXQgZmluaXNoZWQgYW5kIHdlcmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIHRhc2tzIG9mIHRoZSBmaXJzdCBzZXQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrd2FpdDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGUsb21wIHRhc2s8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFza3dhaXQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIGludCByZXN1bHQxID0gMDsgICAgIC8qIFN0b3JlcyBudW1iZXIgb2Ygbm90IGZpbmlzaGVkIHRhc2tzIGFmdGVyIHRoZSB0YXNrd2FpdCAqLworICAgIGludCByZXN1bHQyID0gMDsgICAgIC8qIFN0b3JlcyBudW1iZXIgb2Ygd3JvbmcgYXJyYXkgZWxlbWVudHMgYXQgdGhlIGVuZCAqLworCisgICAgaW50IGFycmF5W05VTV9UQVNLU107CisgICAgaW50IGk7CisKKyAgICAvKiBmaWxsIGFycmF5ICovCisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSAKKyAgICAgICAgYXJyYXlbaV0gPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgLyogRmlyc3Qgd2UgaGF2ZSB0byBzdG9yZSB0aGUgdmFsdWUgb2YgdGhlIGxvb3AgaW5kZXggaW4gYSBuZXcgdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgKiB3aGljaCB3aWxsIGJlIHByaXZhdGUgZm9yIGVhY2ggdGFzayBiZWNhdXNlIG90aGVyd2lzZSBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuCisgICAgICAgICAgICAgICAgICogaWYgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgdGFzayB0YWtlcyBsb25nZXIgdGhhbiB0aGUgdGltZSB3aGljaCBpcyBuZWVkZWQgdG8gCisgICAgICAgICAgICAgICAgICogZW50ZXIgdGhlIG5leHQgc3RlcCBvZiB0aGUgbG9vcCEKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpbnQgbXlpOworICAgICAgICAgICAgICAgIG15aSA9IGk7CisjcHJhZ21hIG9tcCB0YXNrCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBteV9zbGVlcCAoU0xFRVBUSU1FKTsKKyAgICAgICAgICAgICAgICAgICAgYXJyYXlbbXlpXSA9IDE7CisgICAgICAgICAgICAgICAgfSAvKiBlbmQgb2Ygb21wIHRhc2sgKi8KKyAgICAgICAgICAgIH0gLyogZW5kIG9mIGZvciAqLworCis8b21wdHM6b3JwaGFuPgorPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIHRhc2t3YWl0PC9vbXB0czpjaGVjaz4KKzwvb21wdHM6b3JwaGFuPgorCisgICAgICAgICAgICAvKiBjaGVjayBpZiBhbGwgdGFza3Mgd2VyZSBmaW5pc2hlZCAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSAKKyAgICAgICAgICAgICAgICBpZiAoYXJyYXlbaV0gIT0gMSkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0MSsrOworCisgICAgICAgICAgICAvKiBnZW5lcmF0ZSBzb21lIG1vcmUgdGFza3Mgd2hpY2ggbm93IHNoYWxsIG92ZXJ3cml0ZSAKKyAgICAgICAgICAgICAqIHRoZSB2YWx1ZXMgaW4gdGhlIHRpZHMgYXJyYXkgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBteWk7CisgICAgICAgICAgICAgICAgbXlpID0gaTsKKyNwcmFnbWEgb21wIHRhc2sKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFycmF5W215aV0gPSAyOworICAgICAgICAgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICAgICAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKworICAgICAgICB9IC8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgICB9IC8qZW5kIG9mIHBhcmFsbGVsICovCisKKyAgICAvKiBmaW5hbCBjaGVjaywgaWYgYWxsIGFycmF5IGVsZW1lbnRzIGNvbnRhaW4gdGhlIHJpZ2h0IHZhbHVlczogKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgaWYgKGFycmF5W2ldICE9IDIpCisgICAgICAgICAgICByZXN1bHQyKys7CisgICAgfQorCisgICAgcmV0dXJuICgocmVzdWx0MSA9PSAwKSAmJiAocmVzdWx0MiA9PSAwKSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2t5aWVsZC5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rhc2t5aWVsZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMTI3MWUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGFza3lpZWxkLmMKQEAgLTAsMCArMSw1OSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3QgdGFza3lpZWxkIGRpcmVjdGl2ZS4gRmlyc3QgZ2VuZXJhdGUgYSBzZXQgb2YgdGFza3MgYW5kIHBhdXNlIGl0IGltbWVkaWF0ZWx5LiBUaGVuIHdlIHJlc3VtZSBoYWxmIG9mIHRoZW0gYW5kIGNoZWNrIHdoZXRoZXIgdGhleSBhcmUgc2NoZWR1bGVkIGJ5IGRpZmZlcmVudCB0aHJlYWRzPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNreWllbGQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgdGFza3dhaXQ8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2t5aWVsZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisKKyAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgaTsKKyAgaW50IGNvdW50ID0gMDsKKyAgaW50IHN0YXJ0X3RpZFtOVU1fVEFTS1NdOworICBpbnQgY3VycmVudF90aWRbTlVNX1RBU0tTXTsKKyAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgZm9yIChpPTA7IGk8IE5VTV9UQVNLUzsgaSsrKXsKKyAgICBzdGFydF90aWRbaV09MDsKKyAgICBjdXJyZW50X3RpZFtpXT0wOworICB9CisgIAorICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgIGludCBteWkgPSBpOworICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgdGFzayB1bnRpZWQ8L29tcHRzOmNoZWNrPgorICAgICAgICB7CisgICAgICAgICAgbXlfc2xlZXAoU0xFRVBUSU1FKTsKKyAgICAgICAgICBzdGFydF90aWRbbXlpXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgIAorICAgICAgICAgICNwcmFnbWEgb21wIHRhc2t5aWVsZAorICAgICAgICAgIAorICAgICAgICAgIGlmKChzdGFydF90aWRbbXlpXSAlMikgPT0wKXsKKyAgICAgICAgICAgIG15X3NsZWVwKFNMRUVQVElNRSk7CisgICAgICAgICAgICBjdXJyZW50X3RpZFtteWldID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgfSAvKmVuZCBvZiBpZiovCisgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgfSAvKiBlbmQgb2YgZm9yICovCisgICAgfSAvKiBlbmQgb2Ygc2luZ2xlICovCisgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisKKyAgZm9yIChpPTA7aTxOVU1fVEFTS1M7IGkrKykKKyAgeworICAgIC8vcHJpbnRmKCJzdGFydF90aWRbJWRdPSVkLCBjdXJyZW50X3RpZFslZF09JWRcbiIsaSwgc3RhcnRfdGlkW2ldLCBpICwgY3VycmVudF90aWRbaV0pOworICAgIGlmIChjdXJyZW50X3RpZFtpXSA9PSBzdGFydF90aWRbaV0pCisgICAgICBjb3VudCsrOworICB9CisgIHJldHVybiAoY291bnQ8TlVNX1RBU0tTKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+CisKKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90ZXN0X2xvY2suYyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90ZXN0X2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODg5ZGZiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rlc3RfbG9jay5jCkBAIC0wLDAgKzEsNDcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wX3Rlc3Rsb2NrIGZ1bmN0aW9uLiBUaGUgdGVzdCBjb3VudHMgdGhlIHRocmVhZHMgZW50ZXJpbmcgYW5kIGV4aXRpbmcgYSBzaW5nbGUgcmVnaW9uIHdoaWNoIGlzIGJ1aWxkIHdpdGggYSB0ZXN0X2xvY2sgaW4gYW4gZW5kbGVzcyBsb29wLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfdGVzdF9sb2NrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworb21wX2xvY2tfdCBsY2s7CisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90ZXN0X2xvY2s8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgaW50IG5yX3RocmVhZHNfaW5fc2luZ2xlID0gMDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBpbnQgbnJfaXRlcmF0aW9ucyA9IDA7CisgICAgaW50IGk7CisKKyAgICBvbXBfaW5pdF9sb2NrICgmbGNrKTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKGxjaykgIAorICAgIHsKKworI3ByYWdtYSBvbXAgZm9yCisJZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorCXsKKwkgICAgLypvbXBfc2V0X2xvY2soJmxjayk7Ki8KKwkgICAgPG9tcHRzOm9ycGhhbj4KKwkJPG9tcHRzOmNoZWNrPndoaWxlICghb21wX3Rlc3RfbG9jayAoJmxjaykpCisJCXt9Ozwvb21wdHM6Y2hlY2s+CisJICAgIDwvb21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgZmx1c2gKKwkgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUrKzsKKyNwcmFnbWEgb21wIGZsdXNoICAgICAgICAgICAKKwkgICAgbnJfaXRlcmF0aW9ucysrOworCSAgICBucl90aHJlYWRzX2luX3NpbmdsZS0tOworCSAgICByZXN1bHQgPSByZXN1bHQgKyBucl90aHJlYWRzX2luX3NpbmdsZTsKKwkgICAgPG9tcHRzOmNoZWNrPm9tcF91bnNldF9sb2NrICgmbGNrKTs8L29tcHRzOmNoZWNrPgorCX0KKyAgICB9CisgICAgb21wX2Rlc3Ryb3lfbG9jaygmbGNrKTsKKworICAgIHJldHVybiAoKHJlc3VsdCA9PSAwKSAmJiAobnJfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKKworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90ZXN0X25lc3RfbG9jay5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3Rlc3RfbmVzdF9sb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThkNmE0NQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9jL29tcF90ZXN0X25lc3RfbG9jay5jCkBAIC0wLDAgKzEsNDggQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wX3Rlc3RfbmVzdF9sb2NrIGZ1bmN0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfdGVzdF9uZXN0X2xvY2s8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKK3N0YXRpYyBvbXBfbmVzdF9sb2NrX3QgbGNrOworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGVzdF9uZXN0X2xvY2s8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgCisgICAgaW50IG5yX3RocmVhZHNfaW5fc2luZ2xlID0gMDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBpbnQgbnJfaXRlcmF0aW9ucyA9IDA7CisgICAgaW50IGk7CisKKyAgICBvbXBfaW5pdF9uZXN0X2xvY2sgKCZsY2spOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQobGNrKSAKKyAgICB7CisKKyNwcmFnbWEgb21wIGZvcgorCWZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKwl7CisJICAgIC8qb21wX3NldF9sb2NrKCZsY2spOyovCis8b21wdHM6b3JwaGFuPgorCSAgICA8b21wdHM6Y2hlY2s+d2hpbGUoIW9tcF90ZXN0X25lc3RfbG9jayAoJmxjaykpCisJICAgIHt9Ozwvb21wdHM6Y2hlY2s+Cis8L29tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIGZsdXNoCisJICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlKys7CisjcHJhZ21hIG9tcCBmbHVzaCAgICAgICAgICAgCisJICAgIG5yX2l0ZXJhdGlvbnMrKzsKKwkgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUtLTsKKwkgICAgcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisJICAgIDxvbXB0czpjaGVjaz5vbXBfdW5zZXRfbmVzdF9sb2NrICgmbGNrKTs8L29tcHRzOmNoZWNrPgorCX0KKyAgICB9CisgICAgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrICgmbGNrKTsKKworICAgIHJldHVybiAoKHJlc3VsdCA9PSAwKSAmJiAobnJfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGhyZWFkcHJpdmF0ZS5jIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3RocmVhZHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTRkN2FhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3RocmVhZHByaXZhdGUuYwpAQCAtMCwwICsxLDk3IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCB0aHJlYWRwcml2YXRlIGRpcmVjdGl2ZSBieSBmaWxsaW5nIGFuIGFycmF5IHdpdGggcmFuZG9tIG51bWJlcnMgaW4gYW4gcGFyYWxsZWxpc2VkIHJlZ2lvbi4gRWFjaCB0aHJlYWQgZ2VuZXJhdGVzIG9uZSBudW1iZXIgb2YgdGhlIGFycmF5IGFuZCBzYXZlcyB0aGlzIGluIGEgdGVtcG9yYXJ5IHRocmVhZHByaXZhdGUgdmFyaWFibGUuIEluIGEgc2Vjb25kIHBhcmFsbGVsaXNlZCByZWdpb24gdGhlIHRlc3QgY29udHJvbHMsIHRoYXQgdGhlIHRlbXBvcmFyeSB2YXJpYWJsZSBjb250YWlucyBzdGlsbCB0aGUgZm9ybWVyIHZhbHVlIGJ5IGNvbXBhcmluZyBpdCB3aXRoIHRoZSBvbmUgaW4gdGhlIGFycmF5Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGhyZWFkcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxvbXBfc2V0X2R5bmFtaWMsb21wX2dldF9udW1fdGhyZWFkczwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisvKgorICogVGhyZWFkcHJpdmF0ZSBpcyB0ZXN0ZWQgaW4gMiB3YXlzOgorICogMS4gVGhlIGdsb2JhbCB2YXJpYWJsZSBkZWNsYXJlZCBhcyB0aHJlYWRwcml2YXRlIHNob3VsZCBoYXZlCisgKiAgICBsb2NhbCBjb3B5IGZvciBlYWNoIHRocmVhZC4gT3RoZXJ3aXNlIHJhY2UgY29uZGl0aW9uIGFuZCAKKyAqICAgIHdyb25nIHJlc3VsdC4KKyAqIDIuIElmIHRoZSB2YWx1ZSBvZiBsb2NhbCBjb3B5IGlzIHJldGFpbmVkIGZvciB0aGUgdHdvIGFkamFjZW50CisgKiAgICBwYXJhbGxlbCByZWdpb25zCisgKi8KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIGludCBzdW0wPTA7CitzdGF0aWMgaW50IG15dmFsdWUgPSAwOworCis8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShzdW0wKTwvb21wdHM6Y2hlY2s+Cis8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShteXZhbHVlKTwvb21wdHM6Y2hlY2s+CisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3RocmVhZHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisJaW50IHN1bSA9IDA7CisJaW50IGtub3duX3N1bTsKKwlpbnQgaTsgCisJaW50IGl0ZXI7CisJaW50ICpkYXRhOworCWludCBzaXplOworCWludCBmYWlsZWQgPSAwOworCWludCBteV9yYW5kb207CisJb21wX3NldF9keW5hbWljKDApOworCisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKSAKKyAgICB7CisJICBzdW0wID0gMDsKKyAgICAgICNwcmFnbWEgb21wIGZvciAKKwkgICAgZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKwkJeworCQkJc3VtMCA9IHN1bTAgKyBpOworCQl9IC8qZW5kIG9mIGZvciovCisgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorCSAgeworCSAgICAgIHN1bSA9IHN1bSArIHN1bTA7CisJICB9IC8qZW5kIG9mIGNyaXRpY2FsICovCisJfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8gICAgCisJa25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworCWlmIChrbm93bl9zdW0gIT0gc3VtICkgeworCQlmcHJpbnRmIChsb2dGaWxlLCAiIGtub3duX3N1bSA9ICVkLCBzdW0gPSAlZFxuIiwga25vd25fc3VtLCBzdW0pOworCX0KKworCS8qIHRoZSBuZXh0IHBhcmFsbGVsIHJlZ2lvbiBpcyBqdXN0IHVzZWQgdG8gZ2V0IHRoZSBudW1iZXIgb2YgdGhyZWFkcyovCisJb21wX3NldF9keW5hbWljKDApOworICAgICNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworICAgICAgI3ByYWdtYSBvbXAgbWFzdGVyCisJICB7CisJCQlzaXplPW9tcF9nZXRfbnVtX3RocmVhZHMoKTsKKwkJCWRhdGE9KGludCopIG1hbGxvYyhzaXplKnNpemVvZihpbnQpKTsKKwkgIH0KKwl9LyogZW5kIHBhcmFsbGVsKi8KKworCisJc3JhbmQoNDUpOworCWZvciAoaXRlciA9IDA7IGl0ZXIgPCAxMDA7IGl0ZXIrKyl7CisJCW15X3JhbmRvbSA9IHJhbmQoKTsJLyogcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgaXMgY2FsbGVkIGluc2lkZSBzZXJpYWwgcmVnaW9uKi8KKworCS8qIHRoZSBmaXJzdCBwYXJhbGxlbCByZWdpb24gaXMgdXNlZCB0byBpbml0aWFsaXllIG15dmFsdWUgYW5kIHRoZSBhcnJheSB3aXRoIG15X3JhbmRvbStyYW5rKi8KKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKwkgICAgaW50IHJhbms7CisJCXJhbmsgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisJCW15dmFsdWUgPSBkYXRhW3JhbmtdID0gbXlfcmFuZG9tICsgcmFuazsKKwl9CisKKwkvKiB0aGUgc2Vjb25kIHBhcmFsbGVsIHJlZ2lvbiB2ZXJpZmllcyB0aGF0IHRoZSB2YWx1ZSBvZiAibXl2YWx1ZSIgaXMgcmV0YWluZWQgKi8KKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbCByZWR1Y3Rpb24oKzpmYWlsZWQpCisJeworCSAgICBpbnQgcmFuazsKKwkJcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKwkJZmFpbGVkID0gZmFpbGVkICsgKG15dmFsdWUgIT0gZGF0YVtyYW5rXSk7CisJCWlmKG15dmFsdWUgIT0gZGF0YVtyYW5rXSl7CisJCSAgZnByaW50ZiAobG9nRmlsZSwgIiBteXZhbHVlID0gJWQsIGRhdGFbcmFua109ICVkXG4iLCBteXZhbHVlLCBkYXRhW3JhbmtdKTsKKwkJfQorCX0KKyAgfQorICBmcmVlIChkYXRhKTsKKworCXJldHVybiAoa25vd25fc3VtID09IHN1bSkgJiYgIWZhaWxlZDsKKworfSAvKiBlbmQgb2YgY2hlY2tfdGhyZWFkcHJpdmF0ZSovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3RocmVhZHByaXZhdGVfZm9yLmMgYi9maW5hbC90ZXN0c3VpdGUvYy9vbXBfdGhyZWFkcHJpdmF0ZV9mb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzQzNTlkCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2Mvb21wX3RocmVhZHByaXZhdGVfZm9yLmMKQEAgLTAsMCArMSw0NCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIGlmIGEgdmFyaWFibGUgZGVjbGFyZWQgYXMgdGhyZWFkcHJpdmF0ZSBjYW4gYmUgdXNlZCBhcyBhIGxvb3BpbmRleC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRocmVhZHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitzdGF0aWMgaW50IGk7Cis8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShpKTwvb21wdHM6Y2hlY2s+CisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90aHJlYWRwcml2YXRlX2Zvcjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKwkJaW50IGtub3duX3N1bTsKKwkJaW50IHN1bTsKKwkJa25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworCQlzdW0gPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKwkJaW50IHN1bTAgPSAwOworI3ByYWdtYSBvbXAgZm9yCisJCWZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisJCXsKKwkJCXN1bTAgPSBzdW0wICsgaTsKKwkJfSAvKmVuZCBvZiBmb3IqLworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJeworCQkJc3VtID0gc3VtICsgc3VtMDsKKwkJfSAvKmVuZCBvZiBjcml0aWNhbCAqLworCX0gLyogZW5kIG9mIHBhcmFsbGVsICovICAgIAorCQorCWlmIChrbm93bl9zdW0gIT0gc3VtICkgeworCQlmcHJpbnRmIChsb2dGaWxlLCAiIGtub3duX3N1bSA9ICVkLCBzdW0gPSAlZFxuIiwga25vd25fc3VtLCBzdW0pOworCX0KKworCXJldHVybiAoa25vd25fc3VtID09IHN1bSk7CisKK30gLyogZW5kIG9mIGNoZWNrX3RocmVhZHByaXZhdGUqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KKwpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2NvbW1vbl91dGlsaXR5LmYgYi9maW5hbC90ZXN0c3VpdGUvY29tbW9uX3V0aWxpdHkuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmQxMDc4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2NvbW1vbl91dGlsaXR5LmYKQEAgLTAsMCArMSw1NyBAQAorICAgICAgc3Vicm91dGluZSBwcmludF9yZXN1bHQocyxjcm9zc2ZhaWxlZCxNLG5hbWUpICAgICAKKyAgICAgIGltcGxpY2l0IG5vbmUKKyAgICAgIGNoYXJhY3RlciAobGVuPSopOjpuYW1lCisJICAgcmVhbCBjZXJ0CisJICAgaW50ZWdlciBNLGNyb3NzZmFpbGVkCisJICAgaW50ZWdlciBzCisJICAgY2hhcmFjdGVyIChsZW49MTEpIDo6IGMKKyAJICAgY2hhcmFjdGVyIChsZW49MTgpIDo6IGMyCisJICAgY2VydD0xMDAuMCpjcm9zc2ZhaWxlZC9NCishICAgICAgICAgICBwcmludCAqLCAiY2VydCIsIGNlcnQsICJjcm9zcyAiLCBjcm9zc2ZhaWxlZAorIQl0ZXN0MT1odW5kcmVkKmNyb3NzZmFpbGVkCisJICAgYz0iJSBjZXJ0YWludHkiCisJICAgYzI9IiAuLi4gdmVyaWZpZWQgd2l0aCAiCisgICAgICBpZihzLmVxLjEpIHRoZW4KKyAgICAgICAgIHdyaXRlICgqLCIoQSwgQSwgRjcuMiwgQSkiKSBuYW1lLCBjMiwgY2VydCwgYworICAgICAgZWxzZQorICAgICAgICAgd3JpdGUgKCosIihBLEEpIikgbmFtZSwiIC4uLiBGQUlMRUQiCisgICAgICBlbmRpZgorCSAgIGVuZAorCisgICAgICBzdWJyb3V0aW5lIGRvX3Rlc3QodGVzdF9mdW5jLGNyb3NzX3Rlc3RfZnVuYyxuYW1lLE4sZmFpbGVkLAorICAgICB4ICBudW1fdGVzdHMsY3Jvc3NjaGVja2VkKQorICAgICAgaW1wbGljaXQgbm9uZQorICAgICAgaW50ZWdlciBzdWNjZWVkCisgICAgICBpbnRlZ2VyIGNyb3NzZmFpbAorICAgICAgaW50ZWdlciBmYWlsZWQKKyAgICAgIGludGVnZXIsIGV4dGVybmFsOjp0ZXN0X2Z1bmMKKyAgICAgIGludGVnZXIsIGV4dGVybmFsOjpjcm9zc190ZXN0X2Z1bmMKKyAgICAgIGNoYXJhY3RlciAobGVuPSopOjpuYW1lCisgICAgICBpbnRlZ2VyIGZhaWwKKyAgICAgIGludGVnZXIgTixpCisgICAgICBpbnRlZ2VyIG51bV90ZXN0cyxjcm9zc2NoZWNrZWQKKyAgICAgIG51bV90ZXN0cz1udW1fdGVzdHMrMQorICAgICAgc3VjY2VlZD0xCisgICAgICBjcm9zc2ZhaWw9MAorICAgICAgZmFpbD0wCisgICAgICBkbyBpPTEsTgorICAgICAgICAgaWYodGVzdF9mdW5jKCkuZXEuMCkgdGhlbgorICAgICAgICAgICAgc3VjY2VlZD0wCisgICAgICAgICAgICBmYWlsPWZhaWwrMQorICAgICAgICAgICAgZXhpdAorICAgICAgICAgZW5kIGlmCisgICAgICAgICBpZihjcm9zc190ZXN0X2Z1bmMoKS5lcS4wKSB0aGVuCishICAgICAgICAgICAgcHJpbnQgKiwgY3Jvc3NmYWlsCisgICAgICAgICAgICBjcm9zc2ZhaWw9Y3Jvc3NmYWlsKzEuMCAKKyAgICAgICAgIGVuZCBpZgorICAgICAgZW5kZG8KKyAgICAgIAorICAgICAgaWYgKGZhaWwgLm5lLiAwKSB0aGVuCisgICAgICAgICBmYWlsZWQ9ZmFpbGVkKzEKKyAgICAgIGVsc2UKKyAgICAgICAgIGlmKGNyb3NzZmFpbCAubmUuIDApIHRoZW4KKyAgICAgICAgICAgIGNyb3NzY2hlY2tlZD1jcm9zc2NoZWNrZWQrMQorICAgICAgICAgZW5kIGlmCisgICAgICBlbmRpZgorICAgICAgY2FsbCBwcmludF9yZXN1bHQoc3VjY2VlZCxjcm9zc2ZhaWwsTixuYW1lKQorICAgICAgZW5kCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9PTVAxX1RFU1QgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9PTVAxX1RFU1QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE2NGNlMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL09NUDFfVEVTVApAQCAtMCwwICsxLDM2IEBACitoYXNfb3Blbm1wCitvbXBfbmVzdGVkCitvbXBfZ2V0X251bV90aHJlYWRzCitvbXBfaW5fcGFyYWxsZWwKK2RvX29yZGVyZWQKK2RvX3JlZHVjdGlvbgorZG9fcHJpdmF0ZQorZG9fZmlyc3Rwcml2YXRlCitkb19sYXN0cHJpdmF0ZQorc2VjdGlvbl9yZWR1Y3Rpb24KK3NlY3Rpb25fcHJpdmF0ZQorc2VjdGlvbl9maXJzdHByaXZhdGUKK3NlY3Rpb25fbGFzdHByaXZhdGUKK3NpbmdsZQorc2luZ2xlX3ByaXZhdGUKK3NpbmdsZV9ub3dhaXQKK3Bhcl9kb19vcmRlcmVkCitwYXJfZG9fcmVkdWN0aW9uCitwYXJfZG9fcHJpdmF0ZQorcGFyX2RvX2ZpcnN0cHJpdmF0ZQorcGFyX2RvX2xhc3Rwcml2YXRlCitwYXJfc2VjdGlvbl9yZWR1Y3Rpb24KK3Bhcl9zZWN0aW9uX3ByaXZhdGUKK3Bhcl9zZWN0aW9uX2ZpcnN0cHJpdmF0ZQorcGFyX3NlY3Rpb25fbGFzdHByaXZhdGUKK29tcF9tYXN0ZXJfdGhyZWFkCitvbXBfY3JpdGljYWwKK29tcF9hdG9taWMKK29tcF9iYXJyaWVyCitvbXBfZmx1c2gKK29tcF90aHJlYWRwcml2YXRlCitvbXBfY29weWluCitvbXBfbG9jaworb21wX3Rlc3Rsb2NrCitvbXBfbmVzdF9sb2NrCitvbXBfbmVzdF90ZXN0bG9jawpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vT01QMl9URVNUIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vT01QMl9URVNUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNDc2NjUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9PTVAyX1RFU1QKQEAgLTAsMCArMSw1IEBACitvbXBfbnVtX3RocmVhZHMKK29tcF93b3Jrc2hhcmUKK29tcF90aW1lCitvbXBfdGlja3NfdGltZQorc2luZ2xlX2NvcHlwcml2YXRlCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9jb21tb25fdXRpbGl0eS5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vY29tbW9uX3V0aWxpdHkuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmQxMDc4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vY29tbW9uX3V0aWxpdHkuZgpAQCAtMCwwICsxLDU3IEBACisgICAgICBzdWJyb3V0aW5lIHByaW50X3Jlc3VsdChzLGNyb3NzZmFpbGVkLE0sbmFtZSkgICAgIAorICAgICAgaW1wbGljaXQgbm9uZQorICAgICAgY2hhcmFjdGVyIChsZW49Kik6Om5hbWUKKwkgICByZWFsIGNlcnQKKwkgICBpbnRlZ2VyIE0sY3Jvc3NmYWlsZWQKKwkgICBpbnRlZ2VyIHMKKwkgICBjaGFyYWN0ZXIgKGxlbj0xMSkgOjogYworIAkgICBjaGFyYWN0ZXIgKGxlbj0xOCkgOjogYzIKKwkgICBjZXJ0PTEwMC4wKmNyb3NzZmFpbGVkL00KKyEgICAgICAgICAgIHByaW50ICosICJjZXJ0IiwgY2VydCwgImNyb3NzICIsIGNyb3NzZmFpbGVkCishCXRlc3QxPWh1bmRyZWQqY3Jvc3NmYWlsZWQKKwkgICBjPSIlIGNlcnRhaW50eSIKKwkgICBjMj0iIC4uLiB2ZXJpZmllZCB3aXRoICIKKyAgICAgIGlmKHMuZXEuMSkgdGhlbgorICAgICAgICAgd3JpdGUgKCosIihBLCBBLCBGNy4yLCBBKSIpIG5hbWUsIGMyLCBjZXJ0LCBjCisgICAgICBlbHNlCisgICAgICAgICB3cml0ZSAoKiwiKEEsQSkiKSBuYW1lLCIgLi4uIEZBSUxFRCIKKyAgICAgIGVuZGlmCisJICAgZW5kCisKKyAgICAgIHN1YnJvdXRpbmUgZG9fdGVzdCh0ZXN0X2Z1bmMsY3Jvc3NfdGVzdF9mdW5jLG5hbWUsTixmYWlsZWQsCisgICAgIHggIG51bV90ZXN0cyxjcm9zc2NoZWNrZWQpCisgICAgICBpbXBsaWNpdCBub25lCisgICAgICBpbnRlZ2VyIHN1Y2NlZWQKKyAgICAgIGludGVnZXIgY3Jvc3NmYWlsCisgICAgICBpbnRlZ2VyIGZhaWxlZAorICAgICAgaW50ZWdlciwgZXh0ZXJuYWw6OnRlc3RfZnVuYworICAgICAgaW50ZWdlciwgZXh0ZXJuYWw6OmNyb3NzX3Rlc3RfZnVuYworICAgICAgY2hhcmFjdGVyIChsZW49Kik6Om5hbWUKKyAgICAgIGludGVnZXIgZmFpbAorICAgICAgaW50ZWdlciBOLGkKKyAgICAgIGludGVnZXIgbnVtX3Rlc3RzLGNyb3NzY2hlY2tlZAorICAgICAgbnVtX3Rlc3RzPW51bV90ZXN0cysxCisgICAgICBzdWNjZWVkPTEKKyAgICAgIGNyb3NzZmFpbD0wCisgICAgICBmYWlsPTAKKyAgICAgIGRvIGk9MSxOCisgICAgICAgICBpZih0ZXN0X2Z1bmMoKS5lcS4wKSB0aGVuCisgICAgICAgICAgICBzdWNjZWVkPTAKKyAgICAgICAgICAgIGZhaWw9ZmFpbCsxCisgICAgICAgICAgICBleGl0CisgICAgICAgICBlbmQgaWYKKyAgICAgICAgIGlmKGNyb3NzX3Rlc3RfZnVuYygpLmVxLjApIHRoZW4KKyEgICAgICAgICAgICBwcmludCAqLCBjcm9zc2ZhaWwKKyAgICAgICAgICAgIGNyb3NzZmFpbD1jcm9zc2ZhaWwrMS4wIAorICAgICAgICAgZW5kIGlmCisgICAgICBlbmRkbworICAgICAgCisgICAgICBpZiAoZmFpbCAubmUuIDApIHRoZW4KKyAgICAgICAgIGZhaWxlZD1mYWlsZWQrMQorICAgICAgZWxzZQorICAgICAgICAgaWYoY3Jvc3NmYWlsIC5uZS4gMCkgdGhlbgorICAgICAgICAgICAgY3Jvc3NjaGVja2VkPWNyb3NzY2hlY2tlZCsxCisgICAgICAgICBlbmQgaWYKKyAgICAgIGVuZGlmCisgICAgICBjYWxsIHByaW50X3Jlc3VsdChzdWNjZWVkLGNyb3NzZmFpbCxOLG5hbWUpCisgICAgICBlbmQKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX2NvbGxhcHNlLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9kb19jb2xsYXBzZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MTcyNTAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9kb19jb2xsYXBzZS5mCkBAIC0wLDAgKzEsNjcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdpdGggb21wIGZvciBjb2xsYXBzZSBjbGF1c2UuIEJpbmQgd2l0aCB0d28gbG9vcHMuIFdpdGhvdXQgdGhlIGNvbGxhcHNlIGNsYXVzZSwgdGhlIGZpcnN0IGxvb3Agd2lsbCBub3QgYmUgb3JkZXJlZDwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZG8gY29sbGFwc2U8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIGRvIHNjaGVkdWxlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIExPR0lDQUwgRlVOQ1RJT04gY2hlY2tfaXNfbGFyZ2VyKGkpCisgICAgICAgIGltcGxpY2l0IG5vbmUKKyAgICAgICAgSU5URUdFUiA6OiBpCisgICAgICAgIElOVEVHRVIsIHNhdmUgOjogbGFzdF9pCisgICAgICAgIExPR0lDQUwgOjogaXNfbGFyZ2VyCisKKyAgICAgICAgaWYgKGkgLmVxLiAxKSBsYXN0X2kgPSAwCisKKyAgICAgICAgaXNfbGFyZ2VyID0gKGkgLmdlLiBsYXN0X2kpIC5hbmQuICgoaS1sYXN0X2kpIC5sZS4gMSkKKyAgICAgICAgbGFzdF9pID0gaQorCisgICAgICAgIGNoZWNrX2lzX2xhcmdlciA9IGlzX2xhcmdlcgorCisgICAgICBFTkQgRlVOQ1RJT04gY2hlY2tfaXNfbGFyZ2VyCisKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5kb19jb2xsYXBzZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBpLCBqCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIExPR0lDQUwgY2hlY2tfaXNfbGFyZ2VyCisgICAgICAgIExPR0lDQUwgbXlfaXNfbGFyZ2VyCisgICAgICAgIExPR0lDQUwgaXNfbGFyZ2VyCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGlzX2xhcmdlcgorPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisKKyAgICAgICAgaXNfbGFyZ2VyID0gLnRydWUuCisKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUobXlfaXNfbGFyZ2VyKQorPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgbXlfaXNfbGFyZ2VyID0gLnRydWUuCishJG9tcCBkbyBwcml2YXRlKGksaikgc2NoZWR1bGUoc3RhdGljLDEpIDxvbXB0czpjaGVjaz5jb2xsYXBzZSgyKTwvb21wdHM6Y2hlY2s+CishJG9tcCsgICBvcmRlcmVkCisgICAgICAgIERPIGk9MSwxMDAKKyAgICAgICAgICA8b21wdHM6Y3Jvc3NjaGVjaz4KKyAgICAgICAgICBteV9pc19sYXJnZXIgPSBjaGVja19pc19sYXJnZXIoaSkgLmFuZC4gbXlfaXNfbGFyZ2VyCisgICAgICAgICAgPC9vbXB0czpjcm9zc2NoZWNrPgorICAgICAgICAgIERPIGo9MSwwMAorICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyEkb21wIG9yZGVyZWQKKyAgICAgICAgICAgIG15X2lzX2xhcmdlciA9IGNoZWNrX2lzX2xhcmdlcihpKSAuYW5kLiBteV9pc19sYXJnZXIKKyEkb21wIGVuZCBvcmRlcmVkCisgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBFTkQgRE8KKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIGlzX2xhcmdlciA9IGlzX2xhcmdlciAuYW5kLiBteV9pc19sYXJnZXIKKyEkb21wIGVuZCBjcml0aWNhbAorPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgaWYgKGlzX2xhcmdlcikgdGhlbgorICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgZWxzZQorICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgZW5kIGlmCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9kb19maXJzdHByaXZhdGUuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX2ZpcnN0cHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3OTIzNjEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9kb19maXJzdHByaXZhdGUuZgpAQCAtMCwwICsxLDU2IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBkbyBmaXJzdHByaXZhdGUgY2xhdXNlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgbG9vcC4gRWFjaCB0aHJlYWQgaGFzIGEgZmlyc3Rwcml2YXRlIHZhcmlhYmxlICgxKSBhbmQgYW4gdmFyaWFibGUgKDIpIGRlY2xhcmVkIGJ5IGRvIGZpcnN0cHJpdmF0ZS4gRmlyc3QgaXQgc3RvcmVzIHRoZSByZXN1bHQgb2YgaXRzIGxhc3QgaXRlcmF0aW9uIGluIHZhcmlhYmxlICgyKS4gVGhlbiBpdCBzdG9yZXMgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSAoMikgaW4gaXRzIGZpcnN0cHJpdmF0ZSB2YXJpYWJsZSAoMSkuIEF0IHRoZSBlbmQgYWxsIGZpcnN0cHJpdmF0ZSB2YXJpYWJsZXMgKDEpIGFyZSBhZGRlZCB0byBhIHRvdGFsIHN1bSBpbiBhIGNyaXRpY2FsIHNlY3Rpb24gYW5kIGNvbXBhcmVkIHdpdGggdGhlIGNvcnJlY3QgcmVzdWx0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOnZlcnNpb24+Mi4wPC9vbXB0czp2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZG8gZmlyc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmFsbGVsIHByaXZhdGUsIG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+ZG9fZmlyc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSwga25vd25fc3VtCisgICAgICAgIElOVEVHRVIgbnVtdGhyZWFkcworICAgICAgICBJTlRFR0VSIG9tcF9nZXRfbnVtX3RocmVhZHMKKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBzdW0wLCBzdW0xLCBpCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHN1bTAsIHN1bTEsIGkKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisgIAorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgIAorICAgICAgICBzdW0gPSAwCisgICAgICAgIHN1bTAgPSAxMjM0NQorICAgICAgICBzdW0xID0gMAorICAKKyAgCishJG9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGUoc3VtMSkKKyEkb21wIHNpbmdsZQorICAgICAgICBudW10aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcygpCishJG9tcCBlbmQgc2luZ2xlCisKKworPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIDxvbXB0czpjaGVjaz5maXJzdHByaXZhdGUoc3VtMCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUgKHN1bTApPC9vbXB0czpjcm9zc2NoZWNrPgorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgICAgc3VtMSA9IHN1bTAKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorCisKKyEkb21wIGNyaXRpY2FsCisgICAgICAgIFdSSVRFICgxLCopIHN1bTAKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMQorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBlbmQgcGFyYWxsZWwKKworCisgICAgICAgIGtub3duX3N1bT0xMjM0NSpudW10aHJlYWRzKyAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzIKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIFdSSVRFICgxLCopICJGb3VuZCBzdW0gd2FzIiwgc3VtLCAiaW5zdGVhZCBvZiIsIGtub3duX3N1bQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fbGFzdHByaXZhdGUuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX2xhc3Rwcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIwMmU1MAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX2xhc3Rwcml2YXRlLmYKQEAgLTAsMCArMSwzOSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgZG8gbGFzdHByaXZhdGUgY2xhdXNlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgbG9vcC4gRWFjaCB0aHJlYWQgc2F2ZXMgdGhlIG5leHQgc3VtbWFuZCBpbiBhIGxhc3Rwcml2YXRlIHZhcmlhYmxlIGkwLiBBdCB0aGUgZW5kIGkwIGlzIGNvbXBhcmVkIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZXhwZWN0ZWQgbGFzdCBzdW1tYW5kLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOnZlcnNpb24+Mi4wPC9vbXB0czp2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZG8gcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGUsIG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+ZG9fbGFzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgc3VtLGtub3duX3N1bQorPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIHN1bTAsaTAsaQorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBzdW0wLGkwLGkKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgc3VtID0gMAorICAgICAgICBzdW0wID0gMAorICAgICAgICBpMCA9IC0xCishJG9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGUoc3VtMCkKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShzdGF0aWMsNykgPG9tcHRzOmNoZWNrPmxhc3Rwcml2YXRlKGkwKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgICAgaTAgPSBpCisgICAgICAgIEVORCBETworPG9tcHRzOmNoZWNrPiEkb21wIGVuZCBkbzwvb21wdHM6Y2hlY2s+Cis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzIKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gLkFORC4gaTAgLkVRLiBMT09QQ09VTlQgKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fb3JkZXJlZC5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fb3JkZXJlZC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwODdmODEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9kb19vcmRlcmVkLmYKQEAgLTAsMCArMSw3MyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6ZGlyZWN0aXZlPmRvIG9yZGVyZWQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp2ZXJzaW9uPjIuMDwvb21wdHM6dmVyc2lvbj4KKzxvbXB0czpkZXBlbmRlbmNlcz5wYXJhbGxlbCBwcml2YXRlLCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIGlfaXNsYXJnZXIoaSkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIGksIGlzbGFyZ2VyCisgICAgICAgIElOVEVHRVIgbGFzdF9pCisgICAgICAgIENPTU1PTiAvbXljb20vIGxhc3RfaQorICAgICAgICBJRiAoIGkgLkdULiBsYXN0X2kpIFRIRU4KKyAgICAgICAgICBpc2xhcmdlciA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIGlzbGFyZ2VyID0gMAorICAgICAgICBFTkQgSWYKKyAgICAgICAgbGFzdF9pID0gaQorICAgICAgICBpX2lzbGFyZ2VyID0gaXNsYXJnZXIKKyAgICAgIEVORAorCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+ZG9fb3JkZXJlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBrbm93bl9zdW0sIGlzX2xhcmdlcgorICAgICAgICBJTlRFR0VSIGxhc3RfaQorICAgICAgICBJTlRFR0VSIGlfaXNsYXJnZXIKKyAgICAgICAgQ09NTU9OIC9teWNvbS8gbGFzdF9pCisKKzxvbXB0czpvcnBoYW46cGFybXM+IGkgPC9vbXB0czpvcnBoYW46cGFybXM+CisKKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBzdW0sIGksIG15X2lzbGFyZ2VyCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIG15X2lzbGFyZ2VyLCBzdW0KKzwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgc3VtID0gMAorICAgICAgICBpc19sYXJnZXIgPSAxCisgICAgICAgIGxhc3RfaSA9IDAKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUobXlfaXNsYXJnZXIpCisgICAgICAgIG15X2lzbGFyZ2VyID0gMQorISRvbXAgZG8gc2NoZWR1bGUoc3RhdGljLDEpIG9yZGVyZWQKKyAgICAgICAgRE8gaT0xLCA5OQorPG9tcHRzOm9ycGhhbj4KKzxvbXB0czpjaGVjaz4KKyEkb21wIG9yZGVyZWQKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgSUYgKGlfaXNsYXJnZXIoaSkgLkVRLiAxIC5BTkQuIG15X2lzbGFyZ2VyIC5FUS4gMSkgVEhFTgorICAgICAgICAgICAgbXlfaXNsYXJnZXIgPSAxCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgbXlfaXNsYXJnZXIgPSAwCisgICAgICAgICAgRU5EIElGCisgICAgICAgICAgc3VtID0gc3VtICsgaQorPG9tcHRzOmNoZWNrPgorISRvbXAgZW5kIG9yZGVyZWQKKzwvb21wdHM6Y2hlY2s+Cis8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIElGIChpc19sYXJnZXIgLkVRLiAxIC5BTkQuIG15X2lzbGFyZ2VyIC5FUS4gMSApIFRIRU4KKyAgICAgICAgICBpc19sYXJnZXIgPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICBpc19sYXJnZXIgPSAwCisgICAgICAgIEVORCBJRgorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAga25vd25fc3VtID0gKDk5KjEwMCkvMgorICAgICAgICBJRiAoIGtub3duX3N1bSAuRVEuIHN1bSAuQU5ELiBpc19sYXJnZXIgLkVRLiAxKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fcHJpdmF0ZS5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fcHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNTg3Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9kb19wcml2YXRlLmYKQEAgLTAsMCArMSw2NyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgZG8gcHJpdmF0ZSBjbGF1c2UgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIHBhcmFsbGVsaXplZCBsb29wLiBFYWNoIHRocmVhZCBoYXMgYSBwcml2YXRlIHZhcmlhYmxlICgxKSBhbmQgYW4gdmFyaWFibGUgKDIpIGRlY2xhcmVkIGJ5IGZvciBwcml2YXRlLiBGaXJzdCBpdCBzdG9yZXMgdGhlIHJlc3VsdCBvZiBpdHMgbGFzdCBpdGVyYXRpb24gaW4gdmFyaWFibGUgKDIpLiBUaGVuIHRoaXMgdGhyZWFkIHdhaXRzIHNvbWUgdGltZSBiZWZvcmUgaXQgc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgKDIpIGluIGl0cyBwcml2YXRlIHZhcmlhYmxlICgxKS4gQXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBpdGVyYXRpb24gdGhlIHZhbHVlIG9mICgxKSBpcyBhc3NpZ25lZCB0byAoMikuIEF0IHRoZSBlbmQgYWxsIHByaXZhdGUgdmFyaWFibGVzICgxKSBhcmUgYWRkZWQgdG8gYSB0b3RhbCBzdW0gaW4gYSBjcml0aWNhbCBzZWN0aW9uIGFuZCBjb21wYXJlZCB3aXRoIHRoZSBjb3JyZWN0IHJlc3VsdC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czp2ZXJzaW9uPjIuMDwvb21wdHM6dmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGRvIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFyYWxsZWwgcHJpdmF0ZSwgb21wIGZsdXNoLCBvbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgU1VCUk9VVElORSBkb19zb21lX3dvcmsoKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgaQorICAgICAgICBJTlRSSU5TSUMgc3FydAorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIHN1bQorCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgc3VtPTAuMAorICAgICAgICBETyBpPTAsIExPT1BDT1VOVC0xCisgICAgICAgICAgc3VtID0gc3VtICsgc3FydChSRUFMKGkpKQorICAgICAgICBFTkRETworCisgICAgICBFTkQKKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPmRvX3ByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgc3VtLCBrbm93bl9zdW0KKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBzdW0wLCBzdW0xLCBpCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHN1bTAsIHN1bTEsIGkKKzwvb21wdHM6b3JwaGFuOnZhcnM+ICAgICAgICAKKworICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisKKyAgICAgICAgc3VtICA9IDAKKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgc3VtMSA9IDAKKworISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShzdW0xKQorICAgICAgICBzdW0wID0gMAorICAgICAgICBzdW0xID0gMAorCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gPG9tcHRzOmNoZWNrPnByaXZhdGUoc3VtMCk8L29tcHRzOmNoZWNrPiBzY2hlZHVsZShzdGF0aWMsMSkKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBzdW0wID0gc3VtMQorISRvbXAgZmx1c2gKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgICBDQUxMIGRvX3NvbWVfd29yaygpCishJG9tcCBmbHVzaAorISAgICAgICAgICBwcmludCAqLCBzdW0wCisgICAgICAgICAgc3VtMSA9IHN1bTAKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0xCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQqKExPT1BDT1VOVCsxKSkvMgorISAgICAgICAgcHJpbnQgKiwgInN1bToiLCBzdW0sICJrbm93bl9zdW0iLCBrbm93bl9zdW0KKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0pIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9kb19yZWR1Y3Rpb24uZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX3JlZHVjdGlvbi5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMjVhNDUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9kb19yZWR1Y3Rpb24uZgpAQCAtMCwwICsxLDUxNCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgZG8gcmVkdWN0aW9uIGRpcmVjdGl2ZSB3aWNoIGFsbCBpdHMgb3B0aW9ucy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGRvIHJlZHVjdGlvbjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPmRvX3JlZHVjdGlvbjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBzdW0yLCBrbm93bl9zdW0KKyAgICAgICAgSU5URUdFUiBrbm93bl9wcm9kdWN0CisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gcm91bmRpbmdfZXJyb3IsIGRwdAorICAgICAgICBJTlRFR0VSIGRvdWJsZV9ESUdJVFMKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBka25vd25fc3VtCisgICAgICAgIElOVEVHRVIgcmVzdWx0CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgUEFSQU1FVEVSIChrbm93bl9wcm9kdWN0PTM2Mjg4MDApCisgICAgICAgIFBBUkFNRVRFUiAocm91bmRpbmdfZXJyb3I9MS5FLTYpCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgc3VtLGRpZmYscHJvZHVjdCxpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZHN1bSxkZGlmZixkdAorICAgICAgICBMT0dJQ0FMIGxvZ2ljX2FuZCwgbG9naWNfb3IsIGxvZ2ljX2Vxdixsb2dpY19uZXF2CisgICAgICAgIExPR0lDQUwgbG9naWNzKExPT1BDT1VOVCkKKyAgICAgICAgSU5URUdFUiBiaXRfYW5kLCBiaXRfb3IKKyAgICAgICAgSU5URUdFUiBleGNsdXNpdl9iaXRfb3IKKyAgICAgICAgSU5URUdFUiBtaW5fdmFsdWUsIG1heF92YWx1ZQorICAgICAgICBJTlRFR0VSIGludF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZG1pbiwgZG1heAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBzdW0scHJvZHVjdCxkaWZmLGksZHN1bSxkZGlmZixkdCxsb2dpY19hbmQsCisgICAgICYgICAgbG9naWNfb3IsbG9naWNfZXF2LGxvZ2ljX25lcXYsbG9naWNzLGJpdF9hbmQsYml0X29yLGludF9hcnJheSwKKyAgICAgJiAgICBleGNsdXNpdl9iaXRfb3IsbWluX3ZhbHVlLGRtaW4sZG1heCxkX2FycmF5LG1heF92YWx1ZQorICAgICAgICBJTlRFR0VSIE1BWF9GQUNUT1IKKyAgICAgICAgUEFSQU1FVEVSIChkb3VibGVfRElHSVRTPTIwLE1BWF9GQUNUT1I9MTApCis8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIGR0ID0gMS4vMy4KKyAgICAgICAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyCisgICAgICAgIHByb2R1Y3QgPSAxCisgICAgICAgIHN1bTIgPSAwCisgICAgICAgIHN1bSA9IDAKKyAgICAgICAgZHN1bSA9IDAuCisgICAgICAgIHJlc3VsdCA9MCAKKyAgICAgICAgbG9naWNfYW5kID0gLnRydWUuCisgICAgICAgIGxvZ2ljX29yID0gLmZhbHNlLgorICAgICAgICBiaXRfYW5kID0gMQorICAgICAgICBiaXRfb3IgPSAwCisgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IDAKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywgMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOnN1bSk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoa25vd25fc3VtIC5ORS4gc3VtKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgc3VtLCJpbnN0ZWFkIG9mICIsIGtub3duX3N1bQorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIGRpZmYgPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywgMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiAoLTogZGlmZik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgZGlmZiA9IGRpZmYgLSBpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorICAKKyAgICAgICAgSUYgKCBkaWZmIC5ORS4gMCApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gZGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgc3VtLCJpbnN0ZWFkIG9mIDAuIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGZvciBkb3VibGVzCisgICAgICAgIGRzdW0gPTAuCisgICAgICAgIGRwdCA9IDEKKworICAgICAgICBETyBpPTEsIERPVUJMRV9ESUdJVFMKKyAgICAgICAgICBkcHQ9IGRwdCAqIGR0CisgICAgICAgIEVORCBETworICAgICAgICBka25vd25fc3VtID0gKDEtZHB0KS8oMS1kdCkKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpkc3VtKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MCxET1VCTEVfRElHSVRTLTEKKyAgICAgICAgICBkc3VtID0gZHN1bSArIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgCisgICAgICAgIElGKGRzdW0gLk5FLiBka25vd25fc3VtIC5BTkQuIAorICAgICAmICAgICBBQlMoZHN1bSAtIGRrbm93bl9zdW0pIC5HVC4gcm91bmRpbmdfZXJyb3IgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBkc3VtLCJpbnN0ZWFkIG9mICIsZGtub3duX3N1bSwiKERpZmZlcmVuY2U6ICIsCisgICAgICYgICAgICAgZHN1bSAtIGRrbm93bl9zdW0sIikiCisgICAgICAgIEVORCBJRgorICAgICAgICBkcHQgPSAxCisKKworICAgICAgCisgICAgICAgIERPIGk9MSwgRE9VQkxFX0RJR0lUUworICAgICAgICAgICBkcHQgPSBkcHQqZHQKKyAgICAgICAgRU5EIERPCisgICAgICAgIGRkaWZmID0gKCAxLWRwdCkvKDEtZHQpCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigtOmRkaWZmKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MCwgRE9VQkxFX0RJR0lUUy0xCisgICAgICAgICAgZGRpZmYgPSBkZGlmZiAtIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggQUJTKGRkaWZmKSAuR1QuIHJvdW5kaW5nX2Vycm9yICkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICAgZGRpZmYsImluc3RlYWQgb2YgMC4wIgorICAgICAgICBFTkQgSUYKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKjpwcm9kdWN0KTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSxNQVhfRkFDVE9SCisgICAgICAgICAgIHByb2R1Y3QgPSBwcm9kdWN0ICogaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoa25vd25fcHJvZHVjdCAuTkUuIHByb2R1Y3QpIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICB3cml0ZSgxLCopICJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBwcm9kdWN0LCIgaW5zdGVhZCBvZiIsa25vd25fcHJvZHVjdCAKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljcyhpKSA9IC5UUlVFLgorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLkFORC46bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICguTk9ULiBsb2dpY19hbmQpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBsb2dpY19hbmQgPSAuVFJVRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5GQUxTRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLkFORC46bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGIChsb2dpY19hbmQpIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBBTkQgcGFzcyAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgbG9naWNzKGkpID0gLkZBTFNFLgorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk9SLjpsb2dpY19vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKGxvZ2ljX29yKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgbG9naWNfb3IgPSAuRkFMU0UuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuVFJVRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk9SLjpsb2dpY19vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCAuTk9ULiBsb2dpY19vciApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGxvZ2ljIEVRViwgdW5pcXVlIGluIEZvcnRyYW4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgIGxvZ2ljcyhpKSA9IC5UUlVFLgorICAgICAgICBFTkQgRE8KKworICAgICAgICBsb2dpY19lcXYgPSAuVFJVRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLkVRVi46bG9naWNfZXF2KTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfZXF2ID0gbG9naWNfZXF2IC5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoLk5PVC4gbG9naWNfZXF2KSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIEVRViBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGxvZ2ljX2VxdiA9IC5UUlVFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLkZBTFNFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguRVFWLjpsb2dpY19lcXYpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggbG9naWNfZXF2ICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBFUVYgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGxvZ2ljIE5FUVYsIHdoaWNoIGlzIHVuaXF1ZSBpbiBGb3J0cmFuCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICBsb2dpY3MoaSkgPSAuRkFMU0UuCisgICAgICAgIEVORCBETworCisgICAgICAgIGxvZ2ljX25lcXYgPSAuRkFMU0UuCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5ORVFWLjpsb2dpY19uZXF2KTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAobG9naWNfbmVxdikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBORVFWIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgbG9naWNfbmVxdiA9IC5GQUxTRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigubmVxdi46bG9naWNfbmVxdik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX25lcXYgPSBsb2dpY19uZXF2IC5ORVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCAuTk9ULiBsb2dpY19uZXF2ICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBORVFWIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICAgaW50X2FycmF5KGkpID0gMQorICAgICAgICBFTkQgRE8KKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElBTkQ6Yml0X2FuZCk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorIS4uLiBpYW5kKEksSik6IFJldHVybnMgdmFsdWUgcmVzdWx0aW5nIGZyb20gYm9vbGVhbiBBTkQgb2YgCishLi4uIHBhaXIgb2YgYml0cyBpbiBlYWNoIG9mIEkgYW5kIEouIAorICAgICAgICAgIGJpdF9hbmQgPSBJQU5EKGJpdF9hbmQsaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGJpdF9hbmQgLkxULiAxICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJQU5EIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgYml0X2FuZCA9IDEKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDAKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oSUFORDpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgYml0X2FuZCA9IElBTkQgKCBiaXRfYW5kLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiggYml0X2FuZCAuR0UuIDEpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSUFORCBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgaW50X2FycmF5KGkpID0gMAorICAgICAgICBFTkQgRE8KKworCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJT1I6Yml0X29yKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCishLi4uIElvcihJLEopOiBSZXR1cm5zIHZhbHVlIHJlc3VsdGluZyBmcm9tIGJvb2xlYW4gT1Igb2YgCishLi4uIHBhaXIgb2YgYml0cyBpbiBlYWNoIG9mIEkgYW5kIEouIAorICAgICAgICAgIGJpdF9vciA9IElPUihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggYml0X29yIC5HRS4gMSkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJb3IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIGJpdF9vciA9IDAKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDEKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElPUjpiaXRfb3IpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBiaXRfb3IgPSBJT1IoYml0X29yLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGJpdF9vciAuTEUuIDApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSW9yIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAwCisgICAgICAgIEVORCBETworCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJRU9SOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gaWVvcihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBleGNsdXNpdl9iaXRfb3IgLmdlLiAxKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIEllb3IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSAwCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAxCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElFT1I6ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBJRU9SKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGV4Y2x1c2l2X2JpdF9vciAuTEUuIDApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSWVvciBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAxMCAtIGkKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbWluX3ZhbHVlID0gNjU1MzUKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUlOOm1pbl92YWx1ZSk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgbWluX3ZhbHVlID0gTUlOKG1pbl92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIG1pbl92YWx1ZSAuR1QuICgxMC1MT09QQ09VTlQpIClUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGludGVnZXIgTUlOIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgaW50X2FycmF5KGkpID0gaQorICAgICAgICBFTkQgRE8KKworICAgICAgICBtYXhfdmFsdWUgPSAtMzI3NjgKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUFYOm1heF92YWx1ZSk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgbWF4X3ZhbHVlID0gTUFYKG1heF92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIG1heF92YWx1ZSAuTFQuIExPT1BDT1VOVCApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBpbnRlZ2VyIE1BWCIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gdGVzdCBkb3VibGUgbWluLCBtYXgKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBkX2FycmF5KGkpID0gMTAgLSBpKmR0CisgICAgICAgIEVORCBETworCisgICAgICAgIGRtaW4gPSAyKioxMAorICAgICAgICBkdCA9IDAuNQorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihNSU46ZG1pbik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgICBkbWluPSBNSU4oZG1pbixkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBkbWluIC5HVC4gKDEwLWR0KSApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBkb3VibGUgTUlOIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgZF9hcnJheShpKSA9IGkgKiBkdAorICAgICAgICBFTkQgRE8KKworICAgICAgICBkbWF4PSAtICgyKioxMCkKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUFYOmRtYXgpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgICAgZG1heD0gTUFYKGRtYXgsZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggZG1heCAuTFQuIExPT1BDT1VOVCpkdCApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBkb3VibGUgTUFYIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBJRiAoIHJlc3VsdCAuRVEuIDAgKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9ICAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gIDAKKyAgICAgICAgRU5EIElGCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX3NjaGVkdWxlX2R5bmFtaWMuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX3NjaGVkdWxlX2R5bmFtaWMuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGY4YmE3Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fc2NoZWR1bGVfZHluYW1pYy5mCkBAIC0wLDAgKzEsOTAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgZHluYW1pYyBvcHRpb24gb2YgdGhlIG9tcCBkbyBzY2hlZHVsZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBkbyBzY2hlZHVsZShkeW5hbWljKTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmbHVzaCxvbXAgZG8gbm93YWl0LG9tcCBjcml0aWNhbCxvbXAgc2luZ2xlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKworCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+ZG9fc2NoZWR1bGVfZHluYW1pYzwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgQ0hBUkFDVEVSKjMwIGxvZ2ZpbGUKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X3RocmVhZF9udW0sb21wX2dldF9udW1fdGhyZWFkcworICAgICAgICBJTlRFR0VSIHRocmVhZHMKKyAgICAgICAgSU5URUdFUiBjb3VudCwgdG1wX2NvdW50CisgICAgICAgIElOVEVHRVIsQUxMT0NBVEFCTEU6OiB0bXAoOikKKyAgICAgICAgSU5URUdFUiBpaQorICAgICAgICBJTlRFR0VSIHJlc3VsdAorCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgQ0ZETUFYX1NJWkUKKyAgICAgICAgUEFSQU1FVEVSIChDRkRNQVhfU0laRSA9IDEwMDApCisgICAgICAgIElOVEVHRVIgaSx0aWRzKDA6Q0ZETUFYX1NJWkUtMSksdGlkLGNodW5rX3NpemUKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gaSx0aWRzLHRpZCxjaHVua19zaXplCis8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIGNodW5rX3NpemUgPSA3CisgICAgICAgIGNvdW50ID0gMAorICAgICAgICB0bXBfY291bnQgPSAwCisgICAgICAgIHJlc3VsdCA9IDAKKyAgICAgICAgaWkgPSAwCisKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUodGlkKQorICAgICAgICB0aWQgPSBvbXBfZ2V0X3RocmVhZF9udW0oKQorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIDxvbXB0czpjaGVjaz5zY2hlZHVsZShkeW5hbWljLGNodW5rX3NpemUpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0wLCBDRkRNQVhfU0laRS0xCisgICAgICAgICAgdGlkcyhpKSA9IHRpZAorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBETyBpPTAsIENGRE1BWF9TSVpFIC0gMgorICAgICAgICAgIElGICggdGlkcyhpKSAubmUuIHRpZHMoaSsxKSApIFRIRU4KKyAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxCisgICAgICAgICAgRU5EIElGCisgICAgICAgIEVORCBETworIAorICAgICAgICBBTExPQ0FURSggdG1wKDA6Y291bnQpICkKKyAgICAgICAgdG1wKDApID0gMQorIAorICAgICAgICBETyBpID0gMCwgQ0ZETUFYX1NJWkUgLSAyCisgICAgICAgICAgSUYgKCB0bXBfY291bnQgLkdULiBjb3VudCApIFRIRU4KKyAgICAgICAgICAgIFdSSVRFKCosKikgIi0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgICAgICAgICAgV1JJVEUoKiwqKSAiVGVzdGludGVybmFsIEVycm9yOiBMaXN0IHRvbyBzbWFsbCEhISIKKyAgICAgICAgICAgIFdSSVRFKCosKikgIi0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgICAgICAgICAgR09UTyAxMAorICAgICAgICAgIEVORCBJZgorICAgICAgICAgIElGICggdGlkcyhpKSAuTkUuIHRpZHMoaSsxKSApIHRoZW4KKyAgICAgICAgICAgIHRtcF9jb3VudCA9IHRtcF9jb3VudCArIDEKKyAgICAgICAgICAgIHRtcCh0bXBfY291bnQpID0gMQorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIHRtcCh0bXBfY291bnQpID0gdG1wKHRtcF9jb3VudCkgKzEKKyAgICAgICAgICBFTkQgSUYgCisgICAgICAgIEVORCBETyAgICAgICAgICAKKworIS4uLiBpcyBkeW5hbWljIHN0YXRlbWVudCB3b3JraW5nPyAKKworIDEwICAgICBETyBpPTAsIGNvdW50IC0xCisgICAgICAgICAgSUYgKCBNT0QodG1wKGkpLGNodW5rX3NpemUpIC5uZS4gMCApIFRIRU4KKyEgLi4uIGl0IGlzIHBvc3NpYmxlIGZvciAyIGFkamFjZW50IGNodW5rcyBhc3NpZ25lZCB0byBhIHNhbWUgdGhyZWFkIAorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICAgV1JJVEUoMSwqKSAiVGhlIGludGVybWVkaWF0ZSBkaXNwYXRjaCBoYXMgd3JvbmcgY2h1bmtzaXplLiIKKyAgICAgICAgICBFTkQgSUYKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgSUYgKCBNT0QodG1wKGNvdW50KSwgY2h1bmtfc2l6ZSkgLk5FLiAKKyAgICAgJiAgICAgTU9EIChDRkRNQVhfU0laRSwgY2h1bmtfc2l6ZSkgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgInRoZSBsYXN0IGRpc3BhdGNoIGhhcyB3cm9uZyBjaHVua3NpemUuIgorICAgICAgICBFTkQgSUYKKyAgICAgICAgIAorICAgICAgICBJRiAoIHJlc3VsdCAuZXEuIDApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9kb19zY2hlZHVsZV9ndWlkZWQuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX3NjaGVkdWxlX2d1aWRlZC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMGU3ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9kb19zY2hlZHVsZV9ndWlkZWQuZgpAQCAtMCwwICsxLDE3NCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBndWlkZWQgb3B0aW9uIG9mIHRoZSBvbXAgZG8gc2NoZWR1bGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZG8gc2NoZWR1bGUoZ3VpZGVkKTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmbHVzaCxvbXAgZG8gbm93YWl0LG9tcCBjcml0aWNhbCxvbXAgc2luZ2xlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgISBUT0RPOgorICAhIEMuIE5pZXRoYW1tZXI6CisgICEgICAgICAgRmluZCBjaGVjayB0byBkZWNpZGUgaWYgdGhlIHRlc3Qgd2FzIHJ1biBhcyBzY2hlZHVsZShzdGF0aWMpIGJlY2F1c2UKKyAgISAgICAgICB0aGlzIGFsc28gY2FuIHBhc3MgdGhlIHRlc3QgaWYgdGhlIHdvcmsgaXMgZGl2aWRlZCBpbnRvIHRocmVhZC1jb3VudHMgCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+ZG9fc2NoZWR1bGVfZ3VpZGVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIG9tcF9nZXRfdGhyZWFkX251bSxvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgIENIQVJBQ1RFUioyMCBsb2dmaWxlCisgICAgICAgIElOVEVHRVIgdGhyZWFkcworICAgICAgICBJTlRFR0VSIHRtcF9jb3VudAorICAgICAgICBJTlRFR0VSLCBhbGxvY2F0YWJsZSA6OiB0bXAoOikKKyAgICAgICAgSU5URUdFUiBpaSwgZmxhZworICAgICAgICBJTlRFR0VSIHJlc3VsdAorICAgICAgICBJTlRFR0VSIGV4cGVjdGVkCisgICAgICAgIElOVEVHRVIgb3BlbndvcmsKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBjCisKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgaQorICAgICAgICBJTlRFR0VSIHRpZAorICAgICAgICBJTlRFR0VSIGNvdW50CisKKyAgICAgICAgSU5URUdFUiBERUxBWSAKKyAgICAgICAgSU5URUdFUiBNQVhfVElNRQorICAgICAgICBJTlRFR0VSIENGU01BWF9TSVpFCisKKyEgLi4uIGNob29zZSBzbWFsbCBpdGVyYXRpb24gc3BhY2UgZm9yIHNtYWxsIHN5bmMuIG92ZXJoZWFkCisgICAgICAgIFBBUkFNRVRFUiAoREVMQVkgPSAxKQorICAgICAgICBQQVJBTUVURVIgKE1BWF9USU1FID0gNSkKKyAgICAgICAgUEFSQU1FVEVSIChDRlNNQVhfU0laRSA9IDE1MCkKKworICAgICAgICBJTlRFR0VSIG5vdG91dAorICAgICAgICBJTlRFR0VSIG1heGl0ZXIKKyAgICAgICAgSU5URUdFUiB0aWRzKDA6Q0ZTTUFYX1NJWkUtMSkKKworICAgICAgICBDT01NT04gL29ycGh2YXJzLyBub3RvdXQsbWF4aXRlcix0aWRzCisgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICByZXN1bHQgPSAwCisgICAgICAgIG5vdG91dCA9IDEKKyAgICAgICAgbWF4aXRlciA9IDAKKyAgICAgICAgY291bnQgPSAwCisgICAgICAgIHRtcF9jb3VudCA9IDAKKyAgICAgICAgb3BlbndvcmsgPSBDRlNNQVhfU0laRQorPG9tcHRzOmNoZWNrPgorCishIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSB0aHJlYWRzCishJG9tcCBwYXJhbGxlbCAKKyEkb21wIHNpbmdsZQorICAgICAgICB0aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcygpCishJG9tcCBlbmQgc2luZ2xlCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAgSUYgKCB0aHJlYWRzIC5MVC4gMikgVEhFTgorICAgICAgICAgIFBSSU5UICosIlRoaXMgdGVzdCBvbmx5IHdvcmtzIHdpdGggYXQgbGVhc3QgdHdvIHRocmVhZHMiCisgICAgICAgICAgV1JJVEUoMSwqKSAiVGhpcyB0ZXN0IG9ubHkgd29ya3Mgd2l0aCBhdCBsZWFzdCB0d28gdGhyZWFkcyIKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICAgIFNUT1AKKyAgICAgICAgRU5EIElGCisKKyEgLi4uIE5vdyB0aGUgcmVhbCBwYXJhbGxlbCB3b3JrOgorISAuLi4gRWFjaCB0aHJlYWQgd2lsbCBzdGFydCBpbW1lZGlhdGVseSB3aXRoIHRoZSBmaXJzdCBjaHVuay4KKyAgICAKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUodGlkLGNvdW50KSBzaGFyZWQodGlkcyxtYXhpdGVyKQorICAgICAgICB0aWQgPSBvbXBfZ2V0X3RocmVhZF9udW0oKQorICAgICAgICA8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZ3VpZGVkKQorICAgICAgICBETyBpID0gMCAsIENGU01BWF9TSVpFLTEKKyAgICAgICAgICBjb3VudCA9IDAKKyEkb21wIGZsdXNoKG1heGl0ZXIpCisgICAgICAgICAgSUYgKCBpIC5HVC4gbWF4aXRlciApIFRIRU4gICAgICAgICAgICAgICAgIAorISRvbXAgY3JpdGljYWwKKyAgICAgICAgICAgIG1heGl0ZXIgPSBpCishJG9tcCBlbmQgY3JpdGljYWwKKyAgICAgICAgICBFTkQgSUYKKworIS4uICAgICAgICAgaWYgaXQgaXMgbm90IG91ciB0dXJuIHdlIHdhaXQKKyEgICAgICAgICAgIGEpIHVudGlsIGFub3RoZXIgdGhyZWFkIGV4ZWN1dGVkIGFuIGl0ZXJhdGlvbgorISAgICAgICAgICAgd2l0aCBhIGhpZ2hlciBpdGVyYXRpb24gY291bnQKKyEgICAgICAgICAgIGIpIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsb29wIChmaXJzdCB0aHJlYWQgZmluaXNoZWQKKyEgICAgICAgICAgICAgYW5kIHNldCBub3RvdXQ9MCBPUgorISAgICAgICAgICAgYykgdGltZW91dCBhcnJpdmVkIAorCishJG9tcCBmbHVzaChtYXhpdGVyLG5vdG91dCkKKyAgICAgICAgICBJRiAoIG5vdG91dCAuR0UuIDEgLkFORC4gY291bnQgLkxULiBNQVhfVElNRQorICAgICAmICAgICAgICAgLkFORC4gbWF4aXRlciAuRVEuIGkgKSBUSEVOCisgICAgICAgICAgICAgIERPIFdISUxFICggbm90b3V0IC5HRS4gMSAuQU5ELiBjb3VudCAuTFQuIE1BWF9USU1FCisgICAgICYgICAgICAgICAgLkFORC4gbWF4aXRlciAuRVEuIGkgKQorICAgICAgICAgICAgICAgIENBTEwgc2xlZXAoREVMQVkpCisgICAgICAgICAgICAgICAgY291bnQgPSBjb3VudCArIERFTEFZCisgICAgICAgICAgICAgIEVORCBETyAgICAgICAgIAorICAgICAgICAgIEVORCBJRgorICAgICAgICAgICB0aWRzKGkpID0gdGlkCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvIG5vd2FpdAorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKworICAgICAgICBub3RvdXQgPSAwCishJG9tcCBmbHVzaChub3RvdXQpCisKKyEkb21wIGVuZCBwYXJhbGxlbCAKKworISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohCishIGV2YWx1YXRpb24gb2YgdGhlIHZhbHVlcworISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohCisgICAgICAgIGNvdW50ID0gMAorCisgICAgICAgIERPIGk9MCwgQ0ZTTUFYX1NJWkUgLSAyCisgICAgICAgICAgSUYgKCB0aWRzKGkpIC5ORS4gdGlkcyhpKzEpICkgVEhFTgorICAgICAgICAgICAgY291bnQgPSBjb3VudCArIDEKKyAgICAgICAgICBFTkQgSUYKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgQUxMT0NBVEUoIHRtcCgwOmNvdW50KSAgKQorICAgICAgICB0bXBfY291bnQgPSAwCisgICAgICAgIHRtcCgwKSA9IDEKKyEgLi4uIGNhbGN1bGF0ZSB0aGUgY2h1bmtzaXplIGZvciBlYWNoIGRpc3BhdGNoCisKKyAgICAgICAgRE8gaT0wLCBDRlNNQVhfU0laRSAtIDIKKyAgICAgICAgICBJRiAoIHRpZHMoaSkgLkVRLiB0aWRzKGkrMSkgKSBUSEVOCisgICAgICAgICAgIHRtcCh0bXBfY291bnQpID0gdG1wKHRtcF9jb3VudCkgKyAxCisgICAgICAgICAgRUxTRQorICAgICAgICAgICAgdG1wX2NvdW50ID0gdG1wX2NvdW50ICsgMQorICAgICAgICAgICAgdG1wKHRtcF9jb3VudCkgPSAxCisgICAgICAgICAgRU5EIElGCisgICAgICAgIEVORCBETworCishIC4uLiBDaGVjayBpZiBjaHVuayBzaXplcyBhcmUgZGVjcmVhc2VkIHVudGlsIGVxdWFscyB0byAKKyEgLi4uIHRoZSBzcGVjaWZpZWQgb25lLCBpZ25vcmUgdGhlIGxhc3QgZGlzcGF0Y2ggCishIC4uLiBmb3IgcG9zc2libGUgc21hbGxlciByZW1haW5kZXIKKworISBEZXRlcm1pbmUgdGhlIGNvbnN0YW50IAorICAgICAgICBleHBlY3RlZCA9IG9wZW53b3JrIC8gdGhyZWFkcworICAgICAgICBjID0gcmVhbCh0bXAoMCkpIC8gcmVhbChleHBlY3RlZCkKKyAgICAgICAgV1JJVEUoMSwqKSAiRm91bmQgY29uc3RhbnQgdG8gYmUgIiwgYworCisgICAgICAgIERPIGkgPSAwLCBjb3VudCAtIDIKKyAgICAgICAgICBXUklURSgxLCopICJvcGVuOiIsIG9wZW53b3JrLCAic2l6ZToiLCB0bXAoaSkKKyAgICAgICAgICBJRiAoZXhwZWN0ZWQgLkdULiAxKSBUSEVOCisgICAgICAgICAgICBleHBlY3RlZCA9IGMgKiBvcGVud29yayAvIHRocmVhZHMKKyAgICAgICAgICBFTkQgSUYKKworICAgICAgICAgIElGIChhYnModG1wKGkpIC0gZXhwZWN0ZWQpIC5HRS4gMiApIFRIRU4KKyAgICAgICAgICAgIHJlc3VsdCA9IDEKKyAgICAgICAgICAgIFdSSVRFKDEsKikgIkNodW5rc2l6ZSBkaWZmZXJlZCBmcm9tIGV4cGVjdGVkICIsCisgICAgICYgICAgICAgICAidmFsdWU6ICIsdG1wKGkpLCAiaW5zdGVhZCAiLCBleHBlY3RlZAorICAgICAgICAgIEVORCBJRgorCisgICAgICAgICAgSUYgKGkgLkdULiAwIC5BTkQuICh0bXAoaS0xKSAtIHRtcChpKSkgLkxULiAwKSBUSEVOCisgICAgICAgICAgICBXUklURSgxLCopICJDaHVua3NpemUgZGlkIG5vdCBkZWNyZWFzZTogIiwgdG1wKGkpLAorICAgICAmICAgICAgICAgImluc3RlYWQiLHRtcChpLTEpCisgICAgICAgICAgRU5EIElGCisKKyAgICAgICAgICBvcGVud29yayA9IG9wZW53b3JrIC0gdG1wKGkpICAKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgSUYgKCByZXN1bHQgLkVRLiAwICkgVEhFTgorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMSAKKyAgICAgICAgRUxTRQorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORAorPC9vbXB0czpjaGVjaz4KKzxvbXB0czpjcm9zc2NoZWNrPgorICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgIEVORAorPC9vbXB0czpjcm9zc2NoZWNrPgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb210cHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX3NjaGVkdWxlX3N0YXRpYy5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fc2NoZWR1bGVfc3RhdGljLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FiMDJmOAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX3NjaGVkdWxlX3N0YXRpYy5mCkBAIC0wLDAgKzEsNzAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgc3RhdGljIG9wdGlvbiBvZiB0aGUgb21wIGRvIHNjaGVkdWxlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGRvIHNjaGVkdWxlKHN0YXRpYyk8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZG8gbm93YWl0LG9tcCBmbHVzaCxvbXAgY3JpdGljYWwsb21wIHNpbmdsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5kb19zY2hlZHVsZV9zdGF0aWM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgb21wX2dldF90aHJlYWRfbnVtLG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgQ0hBUkFDVEVSKjMwIGxvZ2ZpbGUKKyAgICAgICAgSU5URUdFUiB0aHJlYWRzCisgICAgICAgIElOVEVHRVIgY291bnQKKyAgICAgICAgSU5URUdFUiBpaQorICAgICAgICBJTlRFR0VSIHJlc3VsdAorPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIENGU01BWF9TSVpFCisgICAgICAgIFBBUkFNRVRFUiAoQ0ZTTUFYX1NJWkUgPSAxMDAwKQorICAgICAgICBJTlRFR0VSIGksdGlkcygwOkNGU01BWF9TSVpFLTEpLCB0aWQsIGNodW5rX3NpemUKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gaSx0aWQsdGlkcyxjaHVua19zaXplCis8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIGNodW5rX3NpemUgPSA3CisgICAgICAgIHJlc3VsdCA9IDAKKyAgICAgICAgaWkgPSAwCisKKyEkb21wIHBhcmFsbGVsIAorISRvbXAgc2luZ2xlCisgICAgICAgIHRocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzKCkKKyEkb21wIGVuZCBzaW5nbGUKKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggdGhyZWFkcyAuTFQuIDIpIFRIRU4KKyAgICAgICAgICBQUklOVCAqLCJUaGlzIHRlc3Qgb25seSB3b3JrcyB3aXRoIGF0IGxlYXN0IHR3byB0aHJlYWRzIgorICAgICAgICAgIFdSSVRFKDEsKikgIlRoaXMgdGVzdCBvbmx5IHdvcmtzIHdpdGggYXQgbGVhc3QgdHdvIHRocmVhZHMiCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgICBTVE9QCisgICAgICAgIEVMU0UKKyAgICAgICAgICBXUklURSgxLCopICJVc2luZyBhbiBpbnRlcm5hbCBjb3VudCBvZiAiLENGU01BWF9TSVpFCisgICAgICAgICAgV1JJVEUoMSwqKSAiVXNpbmcgYSBzcGVjaWZpZWQgY2h1bmtzaXplIG9mICIsY2h1bmtfc2l6ZQorICAgIAorISRvbXAgcGFyYWxsZWwgcHJpdmF0ZSh0aWQpIHNoYXJlZCh0aWRzKQorICAgICAgICAgIHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSgpCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gPG9tcHRzOmNoZWNrPnNjaGVkdWxlKHN0YXRpYyxjaHVua19zaXplKTwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgRE8gaSA9IDAgLENGU01BWF9TSVpFIC0xCisgICAgICAgICAgICB0aWRzKGkpID0gdGlkCisgICAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgICBETyBpID0gMCwgQ0ZTTUFYX1NJWkUtMQorIS4uLiByb3VuZC1yb2JpbiBmb3Igc3RhdGljIGNodW5rCisgICAgICAgICAgICBpaSA9IG1vZCggaS9jaHVua19zaXplLHRocmVhZHMpCisgICAgICAgICAgICBJRiAodGlkcyhpKSAuTkUuIGlpICkgVEhFTgorICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgICAgIFdSSVRFKDEsKikiSXRlcmF0aW9uICIsaSwic2hvdWxkIGJlIGFzc2lnbmVkIHRvICIsCisgICAgICYgICAgICAgICAgIGlpLCJpbnN0ZWFkIG9mICIsdGlkcyhpKQorICAgICAgICAgICAgRU5EIElGCisgICAgICAgICAgRU5EIERPCisgICAgICAgICAgSUYgKCByZXN1bHQgLkVRLiAwIClUSEVOCisgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgICAgRU5EIElGCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vaGFzX29wZW5tcC5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vaGFzX29wZW5tcC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ODVlZjIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9oYXNfb3Blbm1wLmYKQEAgLTAsMCArMSwyNSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dmVyc2lvbj4yLjA8L29tcHRzOnZlcnNpb24+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3RpbmcgaWYgdGhlIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGlzIHN1cHBvcnRlZCBvciBub3QuICAKK1lpIFdlbiBhdCAwNTAzMjAwNDogRG8gd2Ugd2FudCB0byB3cml0ZSB0d28gdmVyc2lvbnMgb2YgaGFzX29tcD8gIGJvdGggQzIzNDU2Nzg5IAorYW5kICNpZmRlZiBmb3JtYXRzIGFyZSBzdXBwb3NlZCB0byB3b3JrLiBBdCBsZWFzdCBTdW4ncyBjb21waWxlciBjYW5ub3QgZGVhbCB3aXRoIAordGhlIHNlY29uZCBmb3JtYXQgKCNpZmRlZik8L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKworPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPmhhc19vcGVubXA8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorCis8b21wdHM6Y2hlY2s+CishdmVyc2lvbiAxLgorIUMyMzQ1Njc4OSAKKyEkICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorCishIHZlcnNpb24gMi4KKyEjaWZkZWYgX09QRU5NUAorICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorISNlbmRpZgorPC9vbXB0czpjaGVjaz4KKworICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2F0b21pYy5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2F0b21pYy5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNzQ0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfYXRvbWljLmYKQEAgLTAsMCArMSw1ODggQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGF0b21pYyBkaXJlY3RpdmUgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIHBhcmFsbGVsaXplZCBsb29wIHdpdGggYW4gYXRvbWljIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGF0b21pYzwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCishIEZ1bmN0aW9uczogb21wX2F0b21pYworISBjaGFuZ2UgImNoYXJhY3RlcioyMCIgaW50byAiY2hhcmFjdGVyIChMRU49MjApOjoiCishIGdldCByaWQgb2YgdGhlICJ0YWIiIGtleSBieSBaaGVueWluZyBMaXUsIG9uIE9jdC4gMTYsIDIwMDUuCishKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfYXRvbWljPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIElOVEVHRVIgc3VtMiwga25vd25fc3VtCisgICAgICAgIElOVEVHRVIga25vd25fcHJvZHVjdCwgaW50X2NvbnN0CisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gcm91bmRpbmdfZXJyb3IsIGRwdAorICAgICAgICBJTlRFR0VSIGRvdWJsZV9ESUdJVFMKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBka25vd25fc3VtCisgICAgICAgIElOVEVHRVIgcmVzdWx0CisgICAgICAgIFBBUkFNRVRFUiAoaW50X2NvbnN0PTEwLGtub3duX3Byb2R1Y3Q9MzYyODgwMCkKKyAgICAgICAgUEFSQU1FVEVSIChyb3VuZGluZ19lcnJvcj0xLkUtMikKKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBzdW0saSxkaWZmLHByb2R1Y3QKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkc3VtLGR0LGRkaWZmCisgICAgICAgIExPR0lDQUwgbG9naWNfYW5kLCBsb2dpY19vciwgbG9naWNfZXF2LGxvZ2ljX25lcXYKKyAgICAgICAgSU5URUdFUiBiaXRfYW5kLCBiaXRfb3IKKyAgICAgICAgSU5URUdFUiBleGNsdXNpdl9iaXRfb3IKKyAgICAgICAgSU5URUdFUiBtaW5fdmFsdWUsIG1heF92YWx1ZQorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIGRtaW4sIGRtYXgKKyAgICAgICAgTE9HSUNBTCBsb2dpY3MoTE9PUENPVU5UKQorICAgICAgICBJTlRFR0VSIGludF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHN1bSxwcm9kdWN0LGRpZmYsaSxkc3VtLGRkaWZmLGR0LGxvZ2ljX2FuZCwKKyAgICAgJiAgICBsb2dpY19vcixsb2dpY19lcXYsbG9naWNfbmVxdixsb2dpY3MsYml0X2FuZCxiaXRfb3IsaW50X2FycmF5LAorICAgICAmICAgIGV4Y2x1c2l2X2JpdF9vcixtaW5fdmFsdWUsZG1pbixkbWF4LGRfYXJyYXksbWF4X3ZhbHVlCisgICAgICAgIElOVEVHRVIgTUFYX0ZBQ1RPUgorICAgICAgICBQQVJBTUVURVIgKGRvdWJsZV9ESUdJVFM9MjAsTUFYX0ZBQ1RPUj0xMCkKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgZHQgPSAxLi8zLgorICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIKKyAgICAgICAgcHJvZHVjdCA9IDEKKyAgICAgICAgc3VtMiA9IDAKKyAgICAgICAgc3VtID0gMAorICAgICAgICBkc3VtID0gMC4KKyAgICAgICAgcmVzdWx0ID0wIAorICAgICAgICBsb2dpY19hbmQgPSAudHJ1ZS4KKyAgICAgICAgbG9naWNfb3IgPSAuZmFsc2UuCisgICAgICAgIGJpdF9hbmQgPSAxCisgICAgICAgIGJpdF9vciA9IDAKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gMAorISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaSA9MSwgTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoa25vd25fc3VtIC5ORS4gc3VtKSBUSEVOCisgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgc3VtLCJpbnN0ZWFkIG9mICIsIGtub3duX3N1bQorICAgICAgICBFTkQgSWYKKworICAgICAgICBkaWZmID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyCisKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaSA9MSwgTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgZGlmZiA9IGRpZmYgLSBpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorICAKKyAgICAgICAgSUYgKCBkaWZmIC5ORS4gMCApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGRpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgZGlmZiwiaW5zdGVhZCBvZiAwLiIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gVGVzdCBmb3IgZG91YmxlcworICAgICAgICBkc3VtID0gMC4KKyAgICAgICAgZHB0ID0gMQorCisgICAgICAgIERPIGk9MSwgRE9VQkxFX0RJR0lUUworICAgICAgICAgIGRwdD0gZHB0ICogZHQKKyAgICAgICAgRU5EIERPCisgICAgICAgIGRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KQorISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaT0wLERPVUJMRV9ESUdJVFMtMQorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICBkc3VtID0gZHN1bSArIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgCisgICAgICAgIElGIChkc3VtIC5ORS4gZGtub3duX3N1bSAuQU5ELiAKKyAgICAgJiAgICAgQUJTKGRzdW0gLSBka25vd25fc3VtKSAuR1QuIHJvdW5kaW5nX2Vycm9yICkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBkc3VtLCJpbnN0ZWFkIG9mICIsZGtub3duX3N1bSwiKERpZmZlcmVuY2U6ICIsCisgICAgICYgICAgICAgZHN1bSAtIGRrbm93bl9zdW0sIikiCisgICAgICAgIEVORCBJRgorICAgICAgICBkcHQgPSAxCisKKyAgICAgIAorICAgICAgICBETyBpPTEsIERPVUJMRV9ESUdJVFMKKyAgICAgICAgICAgZHB0ID0gZHB0KmR0CisgICAgICAgIEVORCBETworCisgICAgICAgIGRkaWZmID0gKCAxLWRwdCkvKDEtZHQpCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpPTAsIERPVUJMRV9ESUdJVFMtMQorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgIGRkaWZmID0gZGRpZmYgLSBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIEFCUyhkZGlmZikgLkdULiByb3VuZGluZ19lcnJvciApIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgIGRkaWZmLCJpbnN0ZWFkIG9mIDAuMCIKKyAgICAgICAgRU5EIElGCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGk9MSxNQVhfRkFDVE9SCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgIHByb2R1Y3QgPSBwcm9kdWN0ICogaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoa25vd25fcHJvZHVjdCAuTkUuIHByb2R1Y3QpIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBwcm9kdWN0LCIgaW5zdGVhZCBvZiIsa25vd25fcHJvZHVjdCAKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljcyhpKSA9IC5UUlVFLgorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKC5OT1QuIGxvZ2ljX2FuZCkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIGxvZ2ljX2FuZCA9IC5UUlVFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLkZBTFNFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGIChsb2dpY19hbmQpIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBBTkQgcGFzcyAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgbG9naWNzKGkpID0gLkZBTFNFLgorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGIChsb2dpY19vcikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGxvZ2ljX29yID0gLkZBTFNFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLlRSVUUuCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgbG9naWNfb3IgPSBsb2dpY19vciAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIC5OT1QuIGxvZ2ljX29yICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCishLi4uIFRlc3QgbG9naWMgRVFWLCB1bmlxdWUgaW4gRm9ydHJhbgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgbG9naWNzKGkpID0gLlRSVUUuCisgICAgICAgIEVORCBETworCisgICAgICAgIGxvZ2ljX2VxdiA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKC5OT1QuIGxvZ2ljX2VxdikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBFUVYgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19lcXYgPSAuVFJVRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5GQUxTRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggbG9naWNfZXF2ICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBFUVYgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGxvZ2ljIE5FUVYsIHdoaWNoIGlzIHVuaXF1ZSBpbiBGb3J0cmFuCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICBsb2dpY3MoaSkgPSAuRkFMU0UuCisgICAgICAgIEVORCBETworCisgICAgICAgIGxvZ2ljX25lcXYgPSAuRkFMU0UuCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKGxvZ2ljX25lcXYpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgTkVRViBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGxvZ2ljX25lcXYgPSAuRkFMU0UuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuVFJVRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIC5OT1QuIGxvZ2ljX25lcXYgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIE5FUVYgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGludF9hcnJheShpKSA9IDEKKyAgICAgICAgRU5EIERPCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorIS4uLiBpYW5kKEksSik6IFJldHVybnMgdmFsdWUgcmVzdWx0aW5nIGZyb20gYm9vbGVhbiBBTkQgb2YgCishLi4uIHBhaXIgb2YgYml0cyBpbiBlYWNoIG9mIEkgYW5kIEouIAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgIGJpdF9hbmQgPSBJQU5EKGJpdF9hbmQsaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGJpdF9hbmQgLkxULiAxICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJQU5EIHBhcnQgMSIKKyAgICAgICAgRU5EIElmCisKKyAgICAgICAgYml0X2FuZCA9IDEKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDAKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBiaXRfYW5kID0gSUFORCAoIGJpdF9hbmQsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGKCBiaXRfYW5kIC5HRS4gMSkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJQU5EIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAwCisgICAgICAgIEVORCBETworCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCishLi4uIElvcihJLEopOiBSZXR1cm5zIHZhbHVlIHJlc3VsdGluZyBmcm9tIGJvb2xlYW4gT1Igb2YgCishLi4uIHBhaXIgb2YgYml0cyBpbiBlYWNoIG9mIEkgYW5kIEouIAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgIGJpdF9vciA9IElvcihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggYml0X29yIC5HRS4gMSkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJb3IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIGJpdF9vciA9IDAKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDEKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgYml0X29yID0gSU9SKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBiaXRfb3IgLmxlLiAwKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElvciBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgaW50X2FycmF5KGkpID0gMAorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gSUVPUihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBleGNsdXNpdl9iaXRfb3IgLkdFLiAxKSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSWVvciBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IDAKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDEKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gaWVvcihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBleGNsdXNpdl9iaXRfb3IgLkxFLiAwKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIEllb3IgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGludF9hcnJheShpKSA9IDEwIC0gaQorICAgICAgICBFTkQgRE8KKworICAgICAgICBtaW5fdmFsdWUgPSA2NTUzNQorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICBtaW5fdmFsdWUgPSBtaW4obWluX3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggbWluX3ZhbHVlIC5HVC4gKDEwLUxPT1BDT1VOVCkgKVRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gaW50ZWdlciBNSU4iCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBpbnRfYXJyYXkoaSkgPSBpCisgICAgICAgIEVORCBETworCisgICAgICAgIG1heF92YWx1ZSA9IC0zMjc2OAorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICBtYXhfdmFsdWUgPSBtYXgobWF4X3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggbWF4X3ZhbHVlIC5MVC4gTE9PUENPVU5UIClUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGludGVnZXIgTUFYIgorICAgICAgICBFTkQgSUYKKworIS4uLiB0ZXN0IGRvdWJsZSBtaW4sIG1heAorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGRfYXJyYXkoaSkgPSAxMCAtIGkqZHQKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgZG1pbiA9IDIqKjEwCisgICAgICAgIGR0ID0gMC41CisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgIGRtaW49IE1JTihkbWluLGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGRtaW4gLkdULiAoMTAtZHQpIClUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGRvdWJsZSBNSU4iCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGRfYXJyYXkoaSkgPSBpICogZHQKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgZG1heD0gLSAoMioqMTApCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBkbWF4PSBtYXgoZG1heCxkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBkbWF4IC5MVC4gTE9PUENPVU5UKmR0IClUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGRvdWJsZSBNQVgiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIElGICggcmVzdWx0IC5FUS4gMCApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PSAgMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPj0gIDAKKyAgICAgICAgRU5EIElGCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9iYXJyaWVyLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfYmFycmllci5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMjU5OTQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfYmFycmllci5mCkBAIC0wLDAgKzEsNTAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGJhcnJpZXIgZGlyZWN0aXZlLiBUaGUgdGVzdCAgICBjcmVhdGVzIHNldmVyYWwgdGhyZWFkcyBhbmQgc2VuZHMgb25lIG9mIHRoZW0gc2xlZXBpbmcgYmVmb3JlIHNldHRpbmcgYSBmbGFnLiAgQWZ0ZXIgdGhlIGJhcnJpZXIgdGhlIG90aGVyIG9uZXMgZG8gc29tZSBsaXR0bGUgd29yayBkZXBlbmRpbmcgb24gdGhlIGZsYWcuPC8gICBvbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBiYXJyaWVyPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisKKyAgICAgIFNVQlJPVVRJTkUgZG9fc29tZV93b3JrMygpCisgICAgICAgIFJFQUwgaQorICAgICAgICBJTlRSSU5TSUMgc3FydAorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIHN1bQorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIHN1bSA9IDAuMAorICAgICAgICBETyBXSElMRSAoaSA8IExPT1BDT1VOVC0xKQorICAgICAgICAgIHN1bSA9IHN1bSArIHNxcnQoaSkKKyAgICAgICAgICBpID0gaSArIDEKKyAgICAgICAgRU5EIERPCisgICAgICBFTkQKKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9iYXJyaWVyPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHNsZWVwdGltZQorICAgICAgICBJTlRFR0VSIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICBJTlRFR0VSIHJlc3VsdDEsIHJlc3VsdDIsIHJhbmsKKyAgICAgICAgcmVzdWx0MSA9IDAKKyAgICAgICAgcmVzdWx0MiA9IDAKKyAgICAgICAgc2xlZXB0aW1lID0gMQorISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShyYW5rKQorICAgICAgICByYW5rID0gb21wX2dldF90aHJlYWRfbnVtKCkKKyEgICAgICAgIFBSSU5UICosICJyYW5rIiwgcmFuaworICAgICAgICBJRiAoIHJhbmsgLkVRLiAxICkgVEhFTgorICAgICAgICAgIENBTEwgc2xlZXAoc2xlZXB0aW1lKQorICAgICAgICAgIHJlc3VsdDIgPSAzCisgICAgICAgIEVORCBJRgorICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICA8b21wdHM6Y2hlY2s+CishJG9tcCBiYXJyaWVyCisgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBJRiAoIHJhbmsgLkVRLiAwICkgVEhFTgorICAgICAgICAgIHJlc3VsdDEgPSByZXN1bHQyCisgICAgICAgIEVORCBJRgorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIElGICggcmVzdWx0MSAuRVEuIDMgKSBUSEVOCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfY29weWluLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfY29weWluLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE0ZjE0OQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9jb3B5aW4uZgpAQCAtMCwwICsxLDQ3IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBjb3B5aW4gZGlyZWN0aXZlLjwvICAgb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgY29weWluPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCB0aHJlYWRwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyEgQ2hhbmdlbG9nOgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9jb3B5aW48L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIga25vd25fc3VtCisJCTxvbXB0czpvcnBoYW46dmFycz4KKyEgICAgICAgIElOVEVHRVIsIFNBVkU6OnN1bTEgCishICAgICAgICBpbXBsaWNpdGx5IGJ5IG9tcF90aHJlYWRwcml2YXRlLCBzZWUgc3BlYzI1IENoYXAuIDIuOC4yCisgICAgICAgIElOVEVHRVIgc3VtMQorICAgICAgICBDT01NT04gL2NzdW0xLyBzdW0xCisgICAgICAgIElOVEVHRVIgc3VtLCBpLCB0aHJlYWRzCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHN1bSwgaSwgdGhyZWFkcworISAgIEMuIE5pZXRoYW1tZXIgMzAuMTEuMDY6IG1vdmVkIHRocmVhZHByaXZhdGUgc3RhdGVtZW50IGludG8gdGhlIG9ycGhhbmVkCishICAgICAgZnVuY3Rpb24KKyEkb21wIHRocmVhZHByaXZhdGUoL2NzdW0xLykKKwkJPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICBzdW0gPSAwCisgICAgICAgIHN1bTEgPSA3CisgICAgICAgIHRocmVhZHMgPSAwCisJCTxvbXB0czpvcnBoYW4+CishJG9tcCBwYXJhbGxlbCA8b21wdHM6Y2hlY2s+Y29weWluKHN1bTEpPC9vbXB0czpjaGVjaz4KKyEgICAgICAgIHByaW50ICosInN1bTEiLHN1bTEKKyEkb21wIGRvCisgICAgICAgIERPIGk9MSwgOTk5CisgICAgICAgICAgc3VtMSA9IHN1bTEgKyBpCisgICAgICAgIEVORCBETworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMQorICAgICAgICB0aHJlYWRzID0gdGhyZWFkcyArIDEKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgZW5kIHBhcmFsbGVsCisJCTwvb21wdHM6b3JwaGFuPgorICAgICAgICBrbm93bl9zdW0gPSA5OTkqMTAwMC8yICsgNyp0aHJlYWRzCisgICAgICAgIElGICgga25vd25fc3VtIC5FUS4gc3VtICkgVEhFTgorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2NyaXRpY2FsLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfY3JpdGljYWwuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTJkZDJiCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2NyaXRpY2FsLmYKQEAgLTAsMCArMSw1OSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgY3JpdGljYWwgZGlyZWN0aXZlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgcmVnaW9uIHdpdGhpbiBhIGNyaXRpY2FsIHNlY3Rpb24uCisKKzwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgY3JpdGljYWw8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfY3JpdGljYWw8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIga25vd25fc3VtCisgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBpLGosbXlpLG15aiwgc3VtCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHN1bSwgbXlpLCBteWoKKyAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgc3VtID0gMAorICAgICAgICBteWkgPSAwCisgICAgICAgIG15aiA9IDUwMAorISRvbXAgcGFyYWxsZWwKKyEkb21wIHNlY3Rpb25zCisKKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IDAgLCA0OTkKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyEkb21wIGNyaXRpY2FsCisgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgc3VtID0gc3VtICsgbXlpCisgICAgICAgICAgIG15aSA9IG15aSArIDEKKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CishJG9tcCBlbmQgY3JpdGljYWwKKyAgICAgICAgICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBFTkQgRE8KKworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBqID0gNTAwICwgOTk5CisgICAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CishJG9tcCBjcml0aWNhbAorICAgICAgICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgIHN1bSA9IHN1bSArIG15agorICAgICAgICAgICBteWogPSBteWogKyAxCisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPgorISRvbXAgZW5kIGNyaXRpY2FsCisgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgc2VjdGlvbnMKKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBrbm93bl9zdW0gPSA5OTkqMTAwMC8yCisgICAgICAgIElGICgga25vd25fc3VtIC5FUS4gc3VtICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICBXUklURSAoMSwqKSAiRm91bmQgc3VtIHdhcyIsIHN1bSwgImluc3RlYWQiLCBrbm93bl9zdW0KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9mbHVzaC5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2ZsdXNoLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBkYWY1MAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9mbHVzaC5mCkBAIC0wLDAgKzEsNDkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGZsdXNoIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZsdXNoPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGJhcnJpZXI8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2ZsdXNoPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHJlc3VsdDEsIGR1bW15LCByYW5rCisgICAgICAgIElOVEVHRVIgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiByZXN1bHQyCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHJlc3VsdDIKKyAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgcmVzdWx0MT0wCisgICAgICAgIHJlc3VsdDI9MAorISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShyYW5rKQorICAgICAgICByYW5rID0gb21wX2dldF90aHJlYWRfbnVtKCkKKyEkb21wIGJhcnJpZXIKKyAgICAgICAgSUYgKCByYW5rIC5FUS4gMSApIFRIRU4KKyAgICAgICAgICByZXN1bHQyID0gMworICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgPG9tcHRzOmNoZWNrPgorISRvbXAgZmx1c2gocmVzdWx0MikKKyAgICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICAgIGR1bW15ID0gcmVzdWx0MgorICAgICAgICBFTkQgSUYKKyAgICAgICAgSUYgKCByYW5rIC5FUS4gMCApIFRIRU4KKyAgICAgICAgICBjYWxsIHNsZWVwKDEpCisgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICA8b21wdHM6Y2hlY2s+CishJG9tcCBmbHVzaChyZXN1bHQyKQorICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgICAgcmVzdWx0MSA9IHJlc3VsdDIKKyAgICAgICAgRU5EIElGCishJG9tcCBlbmQgcGFyYWxsZWwKKworISAgICAgICAgUFJJTlQgKiwiMToiLCByZXN1bHQxLCAiMjoiLCByZXN1bHQyLCAiZHVtbXkiLCBkdW1teQorICAgICAgICBJRiAoIChyZXN1bHQxIC5FUS4gcmVzdWx0MikgLkFORC4gKHJlc3VsdDIgLkVRLiBkdW1teSkgLkFORC4KKyAgICAgJiAgICAgICAocmVzdWx0MiAuRVEuIDMpICkgVEhFTgorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2dldF9udW1fdGhyZWFkcy5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2dldF9udW1fdGhyZWFkcy5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2N2FkOWYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfZ2V0X251bV90aHJlYWRzLmYKQEAgLTAsMCArMSwzNyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoYXQgdGhlIG9tcF9nZXRfbnVtX3RocmVhZHMgcmV0dXJucyB0aGUgY29ycmVjdCBudW1iZXIgb2YgdGhyZWFkcy4gVGhlcmVmb3IgaXQgY291bnRzIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgc2VjdGlvbiBhbmQgY29tcGFycyB0aGlzIHZhbHVlIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgb21wX2dldF9udW1fdGhyZWFkcyBmdW5jdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2dldF9udW1fdGhyZWFkczwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxzb21wIHNpbmdsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2dldF9udW1fdGhyZWFkczwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElOVEVHRVIgbnRocmVhZHMKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X251bV90aHJlYWRzCisJCTxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBudGhyZWFkc19saWIKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gbnRocmVhZHNfbGliCisJCTwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIG50aHJlYWRzPTAKKyAgICAgICAgbnRocmVhZHNfbGliPS0xCisKKyEkb21wIHBhcmFsbGVsCishc2hhcmVkKG50aHJlYWRzLG50aHJlYWRzX2xpYikKKyEkb21wIGNyaXRpY2FsCisgICAgICAgIG50aHJlYWRzID0gbnRocmVhZHMgKyAxCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIHNpbmdsZQorCQk8b21wdHM6b3JwaGFuPgorCQk8b21wdHM6Y2hlY2s+CisgICAgICAgIG50aHJlYWRzX2xpYj1vbXBfZ2V0X251bV90aHJlYWRzKCkKKwkJPC9vbXB0czpjaGVjaz4KKwkJPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgc2luZ2xlCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAgSUYgKG50aHJlYWRzIC5FUS4gbnRocmVhZHNfbGliKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2dldF93dGlja3MuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9nZXRfd3RpY2tzLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYyZDAzZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9nZXRfd3RpY2tzLmYKQEAgLTAsMCArMSwyOCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXBfZ2V0X3d0aWNrIGZ1bmN0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfZ2V0X3d0aWNrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2dldF93dGlja3M8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gdGljaworICAgICAgICBDT01NT04gL29ycGh2YXJzLyB0aWNrCisgICAgICAgIGluY2x1ZGUgIm9tcF9saWIuaCIKKzwvb21wdHM6b3JwaGFuOnZhcnM+CishICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIG9tcF9nZXRfd3RpY2sKKyAgICAgICAgdGljayA9IDEKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorPG9tcHRzOmNoZWNrPgorICAgICAgICB0aWNrPW9tcF9nZXRfd3RpY0soKQorPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgV1JJVEUoMSwqKSAid29yayB0b29rIix0aWNrLCJzZWMuIHRpbWUuIgorICAgICAgICBJRih0aWNrIC5HVC4gMC4gLkFORC4gdGljayAuTFQuIDAuMDEpIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT49MAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9pbl9wYXJhbGxlbC5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2luX3BhcmFsbGVsLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVlZGZmNgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9pbl9wYXJhbGxlbC5mCkBAIC0wLDAgKzEsNDEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGF0IG9tcF9pbl9wYXJhbGxlbCByZXR1cm5zIGZhbHNlIHdoZW4gY2FsbGVkIGZyb20gYSBzZXJpYWwgcmVnaW9uIGFuZCB0cnVlIHdoZW4gY2FsbGVkIHdpdGhpbiBhIHBhcmFsbGVsIHJlZ2lvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2luX3BhcmFsbGVsPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2luX3BhcmFsbGVsPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyEgICBjaGVja3MgdGhhdCBmYWxzZSBpcyByZXR1cm5lZCB3aGVuIGNhbGxlZCBmcm9tIHNlcmlhbCByZWdpb24KKyEgICBhbmQgdHJ1ZSBpcyByZXR1cm5lZCB3aGVuIGNhbGxlZCB3aXRoaW4gcGFyYWxsZWwgcmVnaW9uCisgICAgICAgIExPR0lDQUwgb21wX2luX3BhcmFsbGVsCisJCTxvbXB0czpvcnBoYW46dmFycz4KKyEgICAgICAgIExPR0lDQUwgb21wX2luX3BhcmFsbGVsCisgICAgICAgIExPR0lDQUwgc2VyaWFsLCBwYXJhbGxlbAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBzZXJpYWwsIHBhcmFsbGVsCisJCTwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIHNlcmlhbD0uVFJVRS4KKyAgICAgICAgcGFyYWxsZWw9LkZBTFNFLgorCisJCTxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz4KKyAgICAgICAgc2VyaWFsPW9tcF9pbl9wYXJhbGxlbCgpCisJCTwvb21wdHM6Y2hlY2s+CisJCTwvb21wdHM6b3JwaGFuPgorCishJG9tcCBwYXJhbGxlbAorISRvbXAgc2luZ2xlCisJCTxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz4KKyAgICAgICAgcGFyYWxsZWw9b21wX2luX3BhcmFsbGVsKCk7CisJCTwvb21wdHM6Y2hlY2s+CisJCTwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHNpbmdsZQorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCAoLk5PVC4gc2VyaWFsKSAuQU5ELiAocGFyYWxsZWwpICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT49MQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPj0wCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2xvY2suZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9sb2NrLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkwMjZjNQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9sb2NrLmYKQEAgLTAsMCArMSw1OCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXBfc2V0X2xvY2sgIGFuZCB0aGUgb21wX3Vuc2V0X2xvY2sgZnVuY3Rpb24gYnkgY291bnRpbmcgdGhlIHRocmVhZHMgZW50ZXJpbmcgYW5kIGV4aXRpbmcgYSBzaW5nbGUgcmVnaW9uIHdpdGggbG9ja3MuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF9sb2NrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfbG9jazwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiByZXN1bHQKKyAgICAgICAgSU5URUdFUiBucl90aHJlYWRzX2luX3NpbmdsZQorICAgICAgICBJTlRFR0VSIG5yX2l0ZXJhdGlvbnMKKyAgICAgICAgSU5URUdFUiBpCishbG9jayB2YXJpYWJsZQorICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5DTFVERSAib21wX2xpYi5oIgorICAgICAgICBJTlRFR0VSIChLSU5EPU9NUF9MT0NLX0tJTkQpIDo6IGxvY2sKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gbG9jaworICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKworIXJlc3VsdCBpczoKKyEgIDAgLS0gaWYgdGhlIHRlc3QgZmFpbHMKKyEgIDEgLS0gaWYgdGhlIHRlc3Qgc3VjY2VlZHMKKyAgICAgICAgQ0FMTCBvbXBfaW5pdF9sb2NrKGxvY2spCisgICAgICAgIG5yX2l0ZXJhdGlvbnM9MAorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT0wCisgICAgICAgIHJlc3VsdD0wCishJG9tcCBwYXJhbGxlbCBzaGFyZWQobG9jayxucl90aHJlYWRzX2luX3NpbmdsZSxucl9pdGVyYXRpb25zLHJlc3VsdCkKKyEkb21wIGRvCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICAgICAgQ0FMTCBvbXBfc2V0X2xvY2sobG9jaykKKyAgICAgICAgICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyEkb21wIGZsdXNoCisgICAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGU9bnJfdGhyZWFkc19pbl9zaW5nbGUrMQorISRvbXAgZmx1c2gKKyAgICAgICAgICBucl9pdGVyYXRpb25zPW5yX2l0ZXJhdGlvbnMrMQorICAgICAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlPW5yX3RocmVhZHNfaW5fc2luZ2xlLTEKKyAgICAgICAgICByZXN1bHQ9cmVzdWx0K25yX3RocmVhZHNfaW5fc2luZ2xlCisgICAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPgorICAgICAgICAgIENBTEwgb21wX3Vuc2V0X2xvY2sobG9jaykKKyAgICAgICAgICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBDQUxMIG9tcF9kZXN0cm95X2xvY2sobG9jaykKKyAgICAgICAgSUYocmVzdWx0LkVRLjAgLkFORC4gbnJfaXRlcmF0aW9ucyAuRVEuIExPT1BDT1VOVCkgVEhFTgorICAgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTEKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTAKKyAgICAgICAgRU5ESWYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9tYXN0ZXIuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9tYXN0ZXIuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWUxZjNkCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX21hc3Rlci5mCkBAIC0wLDAgKzEsMzkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIG1hc3RlciBkaXJlY3RpdmUgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIG9tcCBtYXN0ZXIgc2VjdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIG1hc3Rlcjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX21hc3Rlcjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X3RocmVhZF9udW0KKwkJPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIG50aHJlYWRzLCBleGVjdXRpbmdfdGhyZWFkCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIG50aHJlYWRzLCBleGVjdXRpbmdfdGhyZWFkCisJCTwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIG50aHJlYWRzPTAKKyAgICAgICAgZXhlY3V0aW5nX3RocmVhZD0tMQorCishJG9tcCBwYXJhbGxlbAorCQk8b21wdHM6b3JwaGFuPgorCQk8b21wdHM6Y2hlY2s+CishJG9tcCBtYXN0ZXIKKwkJPC9vbXB0czpjaGVjaz4KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIG50aHJlYWRzID0gbnRocmVhZHMgKyAxCishJG9tcCBlbmQgY3JpdGljYWwKKyAgICAgICAgZXhlY3V0aW5nX3RocmVhZD1vbXBfZ2V0X3RocmVhZF9udW0oKQorCQk8b21wdHM6Y2hlY2s+CishJG9tcCBlbmQgbWFzdGVyCisJCTwvb21wdHM6Y2hlY2s+CisJCTwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCAobnRocmVhZHMgLkVRLiAxKSAuQU5ELiAoZXhlY3V0aW5nX3RocmVhZCAuRVEuIDApICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9tYXN0ZXJfMy5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX21hc3Rlcl8zLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIyMmM0OAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9tYXN0ZXJfMy5mCkBAIC0wLDAgKzEsNDkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIG1hc3RlciBkaXJlY3RpdmUgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIG9tcCBtYXN0ZXIgc2VjdGlvbi4gSXQgYWxzbyBjaGVja3MgdGhhdCB0aGUgbWFzdGVyIHRocmVhZCBoYXMgdGhlIHRocmVhZCBudW1iZXIgMCBhcyBzcGVjaWZpZWQgaW4gdGhlIE9wZW5NUCBzdGFuZGFyZCB2ZXJzaW9uIDMuMC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIG1hc3Rlcjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX21hc3Rlcl8zPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgbnRocmVhZHMsIGV4ZWN1dGluZ190aHJlYWQKKyAgICAgICAgSU5URUdFUiB0aWRfcmVzdWx0ICEgY291bnRzIHVwIHRoZSBudW1iZXIgb2Ygd3JvbmcgdGhyZWFkIG5vLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgISBmb3IgdGhlIG1hc3RlciB0aHJlYWQKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gbnRocmVhZHMsIGV4ZWN1dGluZ190aHJlYWQsIHRpZF9yZXN1bHQKKyAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgdGlkX3Jlc3VsdCA9IDAKKyAgICAgICAgbnRocmVhZHM9MAorICAgICAgICBleGVjdXRpbmdfdGhyZWFkPS0xCisKKyEkb21wIHBhcmFsbGVsCisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgIDxvbXB0czpjaGVjaz4KKyEkb21wIG1hc3RlcgorICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICBpZiAob21wX2dldF90aHJlYWRfbnVtKCkgLm5lLiAwKSB0aGVuCishJG9tcCBjcml0aWNhbAorICAgICAgICAgICAgdGlkX3Jlc3VsdCA9IHRpZF9yZXN1bHQgKyAxCishJG9tcCBlbmQgY3JpdGljYWwKKyAgICAgICAgZW5kIGlmCishJG9tcCBjcml0aWNhbAorICAgICAgICBudGhyZWFkcyA9IG50aHJlYWRzICsgMQorISRvbXAgZW5kIGNyaXRpY2FsCisgICAgICAgIGV4ZWN1dGluZ190aHJlYWQ9b21wX2dldF90aHJlYWRfbnVtKCkKKyAgICAgICAgPG9tcHRzOmNoZWNrPgorISRvbXAgZW5kIG1hc3RlcgorICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggKG50aHJlYWRzIC5FUS4gMSkgLkFORC4gKGV4ZWN1dGluZ190aHJlYWQgLkVRLiAwKSAuQU5ELgorICAgICAmICAgICAgICh0aWRfcmVzdWx0IC5FUS4gMCkgKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgorCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfbmVzdF9sb2NrLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfbmVzdF9sb2NrLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI5ZTNhYQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9uZXN0X2xvY2suZgpAQCAtMCwwICsxLDU5IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF9zZXRfbmVzdF9sb2NrIGFuZCB0aGUgb21wX3Vuc2V0X25lc3RfbG9jayBmdW5jdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX25lc3RfbG9jazwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmbHVzaDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX25lc3RfbG9jazwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyFyZXN1bHQgaXM6CishICAwIC0tIGlmIHRoZSB0ZXN0IGZhaWxzCishICAxIC0tIGlmIHRoZSB0ZXN0IHN1Y2NlZWRzCisgICAgICAgIElOVEVHRVIgcmVzdWx0CisgICAgICAgIElOVEVHRVIgbnJfdGhyZWFkc19pbl9zaW5nbGUKKyAgICAgICAgSU5URUdFUiBucl9pdGVyYXRpb25zCisgICAgICAgIElOVEVHRVIgaQorICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5DTFVERSAib21wX2xpYi5oIgorICAgICAgICBJTlRFR0VSIChLSU5EPU9NUF9ORVNUX0xPQ0tfS0lORCkgOjogbG9jaworICAgICAgICBDT01NT04gL29ycGh2YXJzLyBsb2NrCisgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorCisgICAgICAgIG5yX2l0ZXJhdGlvbnM9MAorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT0wCisgICAgICAgIENBTEwgb21wX2luaXRfbmVzdF9sb2NrKGxvY2spCisgICAgICAgIHJlc3VsdD0wCisKKyEkb21wIHBhcmFsbGVsIHNoYXJlZChsb2NrLG5yX3RocmVhZHNfaW5fc2luZ2xlLG5yX2l0ZXJhdGlvbnMscmVzdWx0KQorISRvbXAgZG8KKyAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgICAgQ0FMTCBvbXBfc2V0X25lc3RfbG9jayhsb2NrKQorICAgICAgICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CishJG9tcCBmbHVzaAorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT1ucl90aHJlYWRzX2luX3NpbmdsZSsxCishJG9tcCBmbHVzaAorICAgICAgICBucl9pdGVyYXRpb25zPW5yX2l0ZXJhdGlvbnMrMQorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT1ucl90aHJlYWRzX2luX3NpbmdsZS0xCisgICAgICAgIHJlc3VsdD1yZXN1bHQrbnJfdGhyZWFkc19pbl9zaW5nbGUKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgICAgQ0FMTCBvbXBfdW5zZXRfbmVzdF9sb2NrKGxvY2spCisgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgIEVORCBETworISRvbXAgZW5kIGRvCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgIENBTEwgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKGxvY2spCishICAgICAgICAgICAgICAgUFJJTlQgKiwgcmVzdWx0LCBucl9pdGVyYXRpb25zCisgICAgICAgIElGKHJlc3VsdC5FUS4wIC5BTkQuIG5yX2l0ZXJhdGlvbnMgLkVRLiBMT09QQ09VTlQpIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT49MAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9uZXN0ZWQuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9uZXN0ZWQuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDM1MTUxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX25lc3RlZC5mCkBAIC0wLDAgKzEsNTMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IGlmIHRoZSBjb21waWxlciBzdXBwb3J0IG5lc3RlZCBwYXJhbGxlbGlzbS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czp2ZXJzaW9uPjIuNTwvb21wdHM6dmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+bmVzdGVkdGVzdDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX25lc3RlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIGNvdW50ZXIKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gY291bnRlcgorPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICBjb3VudGVyID0wCisgICAgICAgIAorICAgICAgICA8b21wdHM6Y2hlY2s+CishJCAgICAgIENBTEwgT01QX1NFVF9ORVNURUQoLlRSVUUuKQorISNpZmRlZiBfT1BFTk1QCishICAgICAgIENBTEwgT01QX1NFVF9ORVNURUQoLlRSVUUuKSAKKyEjZW5kaWYKKyAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgPG9tcHRzOmNyb3NzY2hlY2s+CishJCAgICAgIENBTEwgT01QX1NFVF9ORVNURUQoLkZBTFNFLikKKyEjaWZkZWYgX09QRU5NUAorISAgICAgICBDQUxMIE9NUF9TRVRfTkVTVEVEKC5GQUxTRS4pCishI2VuZGlmCisgICAgICAgIDwvb21wdHM6Y3Jvc3NjaGVjaz4KKworISRvbXAgcGFyYWxsZWwKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyEkb21wIGNyaXRpY2FsCisgICAgICAgICAgY291bnRlciA9IGNvdW50ZXIgKyAxCishJG9tcCBlbmQgY3JpdGljYWwKKworISRvbXAgcGFyYWxsZWwKKyEkb21wIGNyaXRpY2FsCisgICAgICAgICAgY291bnRlciA9IGNvdW50ZXIgLSAxCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICAKKyAgICAgICAgSUYgKGNvdW50ZXIgLkVRLiAwICkgVEhFTgorICAgICAgICAgICBXUklURSAoMSwqKSAiQ291bnRlciB3YXMgMCIKKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRUxTRQorICAgICAgICAgICBXUklURSAoMSwqKSAiQ291bnRlciB3YXMiLCBjb3VudGVyCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVORCBJRiAKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9udW1fdGhyZWFkcy5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX251bV90aHJlYWRzLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFlZGU3MwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9udW1fdGhyZWFkcy5mCkBAIC0wLDAgKzEsNjAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGF0IHRoZSBvbXBfZ2V0X251bV90aHJlYWRzIHJldHVybnMgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHRocmVhZHMuIFRoZXJlZm9yIGl0IGNvdW50cyB1cCBhIHZhcmlhYmxlIGluIGEgcGFyYWxsZWxpemVkIHNlY3Rpb24gYW5kIGNvbXBhcnMgdGhpcyB2YWx1ZSB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIG9tcF9nZXRfbnVtX3RocmVhZHMgZnVuY3Rpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF9nZXRfbnVtX3RocmVhZHM8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfbnVtX3RocmVhZHM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgaSwgbWF4X3RocmVhZHMKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X251bV90aHJlYWRzCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgZmFpbGVkLHRocmVhZHMsbnRocmVhZHMsdG1wCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGZhaWxlZCx0aHJlYWRzLG50aHJlYWRzCis8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIGZhaWxlZCA9IDAKKyAgICAgICAgbWF4X3RocmVhZHMgPSAwCisgICAgICAgICAKKyEkb21wIHBhcmFsbGVsCishJG9tcCBtYXN0ZXIKKyAgICAgICAgbWF4X3RocmVhZHMgPSBPTVBfR0VUX05VTV9USFJFQURTKCkgICAgICAgCishJG9tcCBlbmQgbWFzdGVyCishJG9tcCBlbmQgcGFyYWxsZWwKKyEgICAgICAgICBwcmludCAqLCAibWF4IHRocmVhZHM6IixtYXhfdGhyZWFkcworCishWWkgV2VuIGFkZGVkIG9tcF9TZXRfZHluYW1pY3MgaGVyZSB0byBtYWtlIHN1cmUgbnVtX3RocmVhZHMgY2xhdXNlIHdvcmsKKyFUaGFua3MgdG8gRHIuIFlpbiBNYSBpbiBBYnNvZnQuIHNob3VsZCBiZSBub3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgdGVzdCBsb29wCishYmVjYXVzZSBpdCBhbGxvd3MgdGhlIGR5bmFtaWMgYWRqdXN0bWVudCBvZiB0aGUgbnVtYmVyIG9mIHRocmVhZHMgYXQgcnVudGltZQorIWluc3RlYWQgb2YgdXNpbmcgdGhlIG1heF90aHJlYWRzIHNldC4gCisKKyAgICAgICAgIUNBTEwgT01QX1NFVF9EWU5BTUlDKC5UUlVFLikKKyAgICAgICAgRE8gdGhyZWFkcyA9IDEsIG1heF90aHJlYWRzCisgICAgICAgICAgbnRocmVhZHMgPSAwCisgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CishJG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyh0aHJlYWRzKSByZWR1Y3Rpb24oKzpmYWlsZWQpCishICAgICAgICAgIHByaW50ICosIHRocmVhZHMsIG9tcF9nZXRfbnVtX3RocmVhZHMoKQorICAgICAgICAgIHRtcCA9IG9tcF9nZXRfbnVtX3RocmVhZHMoKQorICAgICAgICAgIElGICggdGhyZWFkcyAuTkUuIHRtcCApIFRIRU4KKyAgICAgICAgICAgIGZhaWxlZCA9IGZhaWxlZCArIDEKKyAgICAgICAgICAgIFdSSVRFICgxLCopICJFcnJvcjogZm91bmQgIiwgdG1wLCAiIGluc3RlYWQgb2YgIiwKKyAgICAgJiAgICAgICAgICB0aHJlYWRzLCAiIHRocmVhZHMiCisgICAgICAgICAgRU5EIElGCishJG9tcCBhdG9taWMKKyAgICAgICAgICBudGhyZWFkcyA9IG50aHJlYWRzICsgMQorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CishICAgICAgICAgICAgcHJpbnQgKiwgdGhyZWFkcywgbnRocmVhZHMKKyAgICAgICAgICA8b21wdHM6Y2hlY2s+SUYgKCBudGhyZWFkcyAuTkUuIHRocmVhZHMgKSBUSEVOPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICA8b21wdHM6Y3Jvc3NjaGVjaz5JRiAoIG50aHJlYWRzIC5FUS4gdGhyZWFkcyApIFRIRU48L29tcHRzOmNyb3NzY2hlY2s+CisgICAgICAgICAgICBmYWlsZWQgPSBmYWlsZWQgKyAxCisgICAgICAgICAgRU5EIElGCisgICAgICAgIEVORCBETworCisgICAgICAgIElGKGZhaWxlZCAuTkUuIDApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfc2luZ2xlLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfc2luZ2xlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg4MjFjYQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9zaW5nbGUuZgpAQCAtMCwwICsxLDQwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBzaW5nbGUgZGlyZWN0aXZlIGJ5IGNvbnRyb2xsaW5nIGhvdyBvZnRlbiBhIGRpcmVjdGl2ZSBpcyBjYWxsZWQgaW4gYW4gb21wIHNpbmdsZSByZWdpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBzaW5nbGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFyYWxsZWwgcHJpdmF0ZSxvbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9zaW5nbGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgaQorCQk8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgbnJfdGhyZWFkc19pbl9zaW5nbGUsbnJfaXRlcmF0aW9ucyxyZXN1bHQKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gbnJfdGhyZWFkc19pbl9zaW5nbGUsbnJfaXRlcmF0aW9ucyxyZXN1bHQKKwkJPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT0wCisgICAgICAgIHJlc3VsdD0wCisgICAgICAgIG5yX2l0ZXJhdGlvbnM9MAorISRvbXAgcGFyYWxsZWwKKyAgICAgICAgRE8gaT0wLCBMT09QQ09VTlQtMQorCQk8b21wdHM6b3JwaGFuPgorISRvbXAgc2luZ2xlCishJG9tcCBmbHVzaAorICAgICAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlID0gbnJfdGhyZWFkc19pbl9zaW5nbGUgKyAxCishJG9tcCBmbHVzaAorICAgICAgICAgIG5yX2l0ZXJhdGlvbnMgPSBucl9pdGVyYXRpb25zICsgMQorICAgICAgICAgIDxvbXB0czpjaGVjaz5ucl90aHJlYWRzX2luX3NpbmdsZSA9IG5yX3RocmVhZHNfaW5fc2luZ2xlIC0gMTwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgPG9tcHRzOmNyb3NzY2hlY2s+bnJfdGhyZWFkc19pbl9zaW5nbGUgPSBucl90aHJlYWRzX2luX3NpbmdsZSArIDE8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGUKKyEkb21wIGVuZCBzaW5nbGUKKwkJPC9vbXB0czpvcnBoYW4+CisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIElGICggcmVzdWx0IC5FUS4gMCAuQU5ELiBucl9pdGVyYXRpb25zIC5FUS4gTE9PUENPVU5UICkgVEhFTgorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2suZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjczZDdiMAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrLmYKQEAgLTAsMCArMSw1MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgdGFzayBkaXJlY3RpdmUuIFRoZSBpZGVhIG9mIHRoZSB0ZXN0cyBpcyB0byBnZW5lcmF0ZSBhIHNldCBvZiB0YXNrcyBpbiBhIHNpbmdsZSByZWdpb24uIFdlIGxldCBwYXVzZSB0aGUgdGFza3MgZ2VuZXJhdGVkIHNvIHRoYXQgb3RoZXIgdGhyZWFkcyBnZXQgc2hlZHVsZWQgdG8gdGhlIG5ld2x5IG9wZW5lZCB0YXNrcy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2s8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOQ0xVREUgIm9tcF9teV9zbGVlcC5mIgorCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2s8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIG9tcF9nZXRfbnVtX3RocmVhZHMsIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICBFWFRFUk5BTCBteV9zbGVlcAorICAgICAgICBJTlRFR0VSIG15agorICAgICAgICBJTlRFR0VSIGksagorICAgICAgICBJTlRFR0VSIHRpZHMoTlVNX1RBU0tTKQorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBqLHRpZHMKKyAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyEkb21wIHBhcmFsbGVsIHByaXZhdGUobXlqKSBzaGFyZWQoaikKKyEkb21wIHNpbmdsZQorICAgICAgICBkbyBpPTEsIE5VTV9UQVNLUworICAgICAgICBqID0gaQorICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICBteWogPSBqCisgICAgICAgIDxvbXB0czpjaGVjaz4KKyEkb21wIHRhc2sKKyAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBjYWxsIG15X3NsZWVwKFNMRUVQVElNRSkKKyAgICAgICAgICB0aWRzKG15aikgPSBvbXBfZ2V0X3RocmVhZF9udW0oKQorICAgICAgICA8b21wdHM6Y2hlY2s+CishJG9tcCBlbmQgdGFzaworICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgZW5kIGRvCishJG9tcCBlbmQgc2luZ2xlCishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorCisgICAgICAgICEgY2hlY2sgaWYgbW9yZSB0aGFuIG9uZSB0aHJlYWQgZXhlY3V0ZWQgdGhlIHRhc2tzLgorICAgICAgICBkbyBpPTEsIE5VTV9UQVNLUworICAgICAgICAgIGlmICh0aWRzKDEpIC5uZS4gdGlkcyhpKSkgdGhlbgorICAgICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgICBlbmQgaWYKKyAgICAgICAgZW5kIGRvCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX2ZpcnN0cHJpdmF0ZS5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2tfZmlyc3Rwcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E3NzU5ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX2ZpcnN0cHJpdmF0ZS5mCkBAIC0wLDAgKzEsNTQgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgZmlyc3Rwcml2YXRlIGNsYXVzZSBvZiB0aGUgdGFzayBkaXJlY3RpdmUuIFdlIGNyZWF0ZSBhIHNldCBvZiB0YXNrcyBpbiBhIHNpbmdsZSByZWdpb24uIFdlIGRlZmluZXMgYSB2YXJpYWJsZSBuYW1lZCBzdW0gdW5lcXVhbCB6ZXJvIHdoaWNoIGdldHMgZGVjbGFyZWQgZmlyc3Rwcml2YXRlIGZvciBlYWNoIHRhc2suIE5vdyBlYWNoIHRhc2sgY2FsY3VhbHRlcyBhIHN1bSB1c2luZyB0aGlzIHByaXZhdGUgdmFyaWFibGUuIEJlZm9yZSBlYWNoIGNhbGN1YWxhdGlvbiBzdGVwIHdlIGludHJvZHVjZSBhIGZsdXNoIGNvbW1hbmQgc28gdGhhdCBtYXliZSB0aGUgcHJpdmF0ZSB2YXJpYWJlbCBnZXRzIGJhZC4gQXQgdGhlIGVuZCB3ZSBjaGVjayBpZiB0aGUgY2FsY3VsYXRlZCBzdW0gd2FzIHJpZ2h0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzayBmaXJzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlLG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTkNMVURFICJvbXBfbXlfc2xlZXAuZiIKKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrX2ZpcnN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBJTlRFR0VSIGosaQorICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIGV4dGVybmFsIG15X3NsZWVwCisgICAgICAgIElOVEVHRVIgbXlfc3VtCisgICAgICAgIElOVEVHRVIga25vd25fc3VtCisgICAgICAgIElOVEVHRVIgcnNsdAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBteV9zdW0sIGtub3duX3N1bSwgcnNsdAorICAgICAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIG15X3N1bSA9IDEyMzQKKyAgICAgICAga25vd25fc3VtID0gMTIzNCArIChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMgorCishJG9tcCBwYXJhbGxlbCBwcml2YXRlKGopCishJG9tcCBzaW5nbGUKKyAgICAgICAgZG8gaT0xLCBOVU1fVEFTS1MKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyEkb21wIHRhc2sgPG9tcHRzOmNoZWNrPmZpcnN0cHJpdmF0ZShteV9zdW0pPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBkbyBqID0gMCwgTE9PUENPVU5UCishJG9tcCBmbHVzaAorICAgICAgICAgICAgbXlfc3VtID0gbXlfc3VtICsgagorICAgICAgICAgIGVuZCBkbworCisgICAgICAgICAgISBjaGVjayBpZiBjYWxjdWxhdGVkIG15X3N1bSB3YXMgcmlnaHQKKyAgICAgICAgICBpZiAobXlfc3VtIC5uZS4ga25vd25fc3VtKSB0aGVuCishJG9tcCBjcml0aWNhbAorICAgICAgICAgICAgcnNsdCA9IHJzbHQgKyAxCishJG9tcCBlbmQgY3JpdGljYWwKKyAgICAgICAgICBlbmQgaWYKKyEkb21wIGVuZCB0YXNrCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBlbmQgZG8KKyEkb21wIGVuZCBzaW5nbGUKKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIGlmIChyc2x0IC5lcS4gMCkgdGhlbgorICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgZW5kIGlmCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX2lmLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza19pZi5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0OWY0NTcKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza19pZi5mCkBAIC0wLDAgKzEsNDUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgaWYgY2xhdXNlIG9mIHRoZSBvbXAgdGFzayBkaXJlY3RpdmUuIFRoZSBpZGVhciBvZiB0aGUgdGVzdHMgaXMgdG8gZ2VuZXJhdGUgYSB0YXNrcyBpbiBhIHNpbmdsZSByZWdpb24gYW5kIHBhdXNlIGl0IGltbWVkaWF0ZWx5LiBUaGUgcGFyZW50IHRocmVhZCBub3cgc2hhbGwgc2V0IGEgY291bnRlciB2YXJpYWJsZSB3aGljaCB0aGUgcGF1c2VkIHRhc2sgc2hhbGwgZXZhbHVhdGUgd2hlbiB3b2tlIHVwLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzayBpZjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGUsb21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOQ0xVREUgIm9tcF9teV9zbGVlcC5mIgorCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfaWY8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBleHRlcm5hbCBteV9zbGVlcAorICAgICAgICBJTlRFR0VSIGR1bW15CisgICAgICAgIExPR0lDQUwgY29uZGl0aW9uX2ZhbHNlCisgICAgICAgIElOVEVHRVIgY250CisgICAgICAgIElOVEVHRVIgcnNsdAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBjb25kaXRpb25fZmFsc2UsIGNudCwgcnNsdAorICAgICAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIGNudCA9IDAKKyAgICAgICAgY29uZGl0aW9uX2ZhbHNlID0gKGR1bW15IC5lcS4gMzE0MTU5KQorCishJG9tcCBwYXJhbGxlbAorISRvbXAgc2luZ2xlCisgICAgICAgIDxvbXB0czpvcnBoYW4+CishJG9tcCB0YXNrIDxvbXB0czpjaGVjaz5pZiAoY29uZGl0aW9uX2ZhbHNlKTwvb21wdHM6Y2hlY2s+IHNoYXJlZChjbnQscnNsdCkKKyAgICAgICAgICBjYWxsIG15X3NsZWVwKFNMRUVQVElNRV9MT05HKQorISRvbXAgZmx1c2gKKyAgICAgICAgICBpZiAoY250IC5lcS4gMCkgdGhlbgorICAgICAgICAgICAgICByc2x0ID0gMQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcnNsdCA9IDAKKyAgICAgICAgICBlbmQgaWYKKyEkb21wIGVuZCB0YXNrCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBjbnQgPSAxCishJG9tcCBlbmQgc2luZ2xlCishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gcnNsdAorCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza19wcml2YXRlLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza19wcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU0NGJjNQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX3ByaXZhdGUuZgpAQCAtMCwwICsxLDU1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIHByaXZhdGUgY2xhdXNlIG9mIHRoZSB0YXNrIGRpcmVjdGl2ZS4gV2UgY3JlYXRlIGEgc2V0IG9mIHRhc2tzIGluIGEgc2luZ2xlIHJlZ2lvbi4gV2UgZGVmaW5lcyBhIHZhcmlhYmxlIG5hbWVkIHN1bSB3aGljaCBnZXRzIGRlY2xhcmVkIHByaXZhdGUgZm9yIGVhY2ggdGFzay4gTm93IGVhY2ggdGFzayBjYWxjdWFsdGVzIGEgc3VtIHVzaW5nIHRoaXMgcHJpdmF0ZSB2YXJpYWJsZS4gQmVmb3JlIGVhY2ggY2FsY3VhbGF0aW9uIHN0ZXAgd2UgaW50cm9kdWNlIGEgZmx1c2ggY29tbWFuZCBzbyB0aGF0IG1heWJlIHRoZSBwcml2YXRlIHZhcmlhYmVsIGdldHMgYmFkLiBBdCB0aGUgZW5kIHdlIGNoZWNrIGlmIHRoZSBjYWxjdWxhdGVkIHN1bSB3YXMgcmlnaHQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlLG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTkNMVURFICJvbXBfbXlfc2xlZXAuZiIKKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrX2ZpcnN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBJTlRFR0VSIGosaQorICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIGV4dGVybmFsIG15X3NsZWVwCisgICAgICAgIElOVEVHRVIgbXlfc3VtCisgICAgICAgIElOVEVHRVIga25vd25fc3VtCisgICAgICAgIElOVEVHRVIgcnNsdAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBteV9zdW0sIGtub3duX3N1bSwgcnNsdAorICAgICAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIG15X3N1bSA9IDAKKyAgICAgICAgcnNsdCA9IDAKKyAgICAgICAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyCisKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUoaikKKyEkb21wIHNpbmdsZQorICAgICAgICBkbyBpPTEsIE5VTV9UQVNLUworICAgICAgICA8b21wdHM6b3JwaGFuPgorISRvbXAgdGFzayA8b21wdHM6Y2hlY2s+cHJpdmF0ZShteV9zdW0pPC9vbXB0czpjaGVjaz4gc2hhcmVkKHJzbHQsIGtub3duX3N1bSkKKyAgICAgICAgICA8b21wdHM6Y2hlY2s+bXlfc3VtID0gMDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgZG8gaiA9IDAsIExPT1BDT1VOVAorICAgICAgICAgICAgbXlfc3VtID0gbXlfc3VtICsgagorICAgICAgICAgIGVuZCBkbworCisgICAgICAgICAgISBjaGVjayBpZiBjYWxjdWxhdGVkIG15X3N1bSB3YXMgcmlnaHQKKyAgICAgICAgICBpZiAobXlfc3VtIC5uZS4ga25vd25fc3VtKSB0aGVuCishJG9tcCBjcml0aWNhbAorICAgICAgICAgICAgcnNsdCA9IHJzbHQgKyAxCishJG9tcCBlbmQgY3JpdGljYWwKKyAgICAgICAgICBlbmQgaWYKKyEkb21wIGVuZCB0YXNrCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBlbmQgZG8KKyEkb21wIGVuZCBzaW5nbGUKKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIGlmIChyc2x0IC5lcS4gMCkgdGhlbgorICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgZW5kIGlmCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX3NoYXJlZC5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2tfc2hhcmVkLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg1NjRiMwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX3NoYXJlZC5mCkBAIC0wLDAgKzEsNDcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj4gVGVzdCB0byBzZWUgaWYgaW1wbGllZCBzaGFyZWQgd29ya3MgY29ycmVjdGx5PC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZSwgb21wIHRhc2sgZmlyc3Rwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOQ0xVREUgIm9tcF9teV9zbGVlcC5mIgorCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfc2hhcmVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgZXh0ZXJuYWwgbXlfc2xlZXAKKyAgICAgICAgSU5URUdFUiBpCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGkKKyAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiByc2x0CisgICAgICAgIElOVEVHRVIgaworCisgICAgICAgIGkgPSAwCisgICAgICAgIGsgPSAwCisgICAgICAgIHJzbHQgPSAwCisKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUoaykgc2hhcmVkKGkpCishJG9tcCBzaW5nbGUKKyAgICAgICAgZG8gaz0xLCBOVU1fVEFTS1MKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyEkb21wIHRhc2sgPG9tcHRzOmNyb3NzY2hlY2s+Zmlyc3Rwcml2YXRlKGkpPC9vbXB0czpjcm9zc2NoZWNrPgorISRvbXArICAgICA8b21wdHM6Y2hlY2s+c2hhcmVkKGkpPC9vbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworICAgICAgICAgICAgaSA9IGkgKyAxCishJG9tcCBlbmQgdGFzaworICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgZW5kIGRvCishJG9tcCBlbmQgc2luZ2xlCishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICByc2x0ID0gaQorICAgICAgICBpZiAocnNsdCAuZXEuIE5VTV9UQVNLUykgdGhlbgorICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgZW5kIGlmCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX3VudGllZC5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2tfdW50aWVkLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU4ZTkzNQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX3VudGllZC5mCkBAIC0wLDAgKzEsNjMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IGZvciB1bnRpZWQgY2xhdXNlLiBGaXJzdCBnZW5lcmF0ZSBhIHNldCBvZiB0YXNrcyBhbmQgcGF1c2UgaXQgaW1tZWRpYXRlbHkuIFRoZW4gd2UgcmVzdW1lIGhhbGYgb2YgdGhlbSBhbmQgY2hlY2sgd2hldGhlciB0aGV5IGFyZSBzY2hlZHVsZWQgYnkgZGlmZmVyZW50IHRocmVhZHM8L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2sgdW50aWVkPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHRhc2t3YWl0PC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOQ0xVREUgIm9tcF9teV9zbGVlcC5mIgorCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfdW50aWVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgRVhURVJOQUwgbXlfc2xlZXAKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X251bV90aHJlYWRzLCBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgSU5URUdFUiBteWoKKyAgICAgICAgSU5URUdFUiBpLGoKKyAgICAgICAgSU5URUdFUiBjbnQKKyAgICAgICAgSU5URUdFUiBzdGFydF90aWQoTlVNX1RBU0tTKQorICAgICAgICBJTlRFR0VSIGN1cnJlbnRfdGlkKE5VTV9UQVNLUykKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gaiwgY250LCBzdGFydF90aWQsIGN1cnJlbnRfdGlkCisgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgY250ID0gMAorICAgICAgICBkbyBpID0gMSwgTlVNX1RBU0tTCisgICAgICAgICAgc3RhcnRfdGlkKGkpID0gMAorICAgICAgICAgIGN1cnJlbnRfdGlkKGkpID0gMAorICAgICAgICBlbmQgZG8KKworISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShteWopIHNoYXJlZChqKQorISRvbXAgc2luZ2xlCisgICAgICAgIGRvIGk9MSwgTlVNX1RBU0tTCisgICAgICAgIGogPSBpCisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgIG15aiA9IGoKKyEkb21wIHRhc2sgPG9tcHRzOmNoZWNrPnVudGllZDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgY2FsbCBteV9zbGVlcChTTEVFUFRJTUUpCisgICAgICAgICAgc3RhcnRfdGlkKG15aikgPSBvbXBfZ2V0X3RocmVhZF9udW0oKQorISRvbXAgdGFza3dhaXQKKyAgICAgIDxvbXB0czpjaGVjaz5pZiAoTU9EKHN0YXJ0X3RpZChteWopLDIpIC5uZS4gMCkgdGhlbjwvb21wdHM6Y2hlY2s+CisgICAgICAgIGNhbGwgbXlfc2xlZXAoU0xFRVBUSU1FKQorICAgICAgICBjdXJyZW50X3RpZChteWopID0gb21wX2dldF90aHJlYWRfbnVtKCkKKyAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgICBlbHNlCisgICAgICAgIGN1cnJlbnRfdGlkKG15aikgPSBvbXBfZ2V0X3RocmVhZF9udW0oKQorICAgICAgIGVuZCBpZjwvb21wdHM6Y2hlY2s+CishJG9tcCBlbmQgdGFzaworICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgZW5kIGRvCishJG9tcCBlbmQgc2luZ2xlCishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorCisgICAgICAgICEgY2hlY2sgaWYgYXQgbGVhc3Qgb25lIHVudGllZCB0YXNrIHN3aXRjaGVkIHRocmVhZHMKKyAgICAgICAgZG8gaT0xLCBOVU1fVEFTS1MKKyAgICAgICAgICBpZiAoY3VycmVudF90aWQoaSkgLm5lLiBzdGFydF90aWQoaSkpIHRoZW4KKyAgICAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgICAgZW5kIGlmCisgICAgICAgIGVuZCBkbworCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza3dhaXQuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrd2FpdC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYTk0YzQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza3dhaXQuZgpAQCAtMCwwICsxLDgzIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCB0YXNrd2FpdCBkaXJlY3RpdmUuIEZpcnN0IHdlIGdlbmVyYXRlIGEgc2V0IG9mIHRhc2tzLCB3aGljaCBzZXQgdGhlIGVsZW1lbnRzIG9mIGFuIGFycmF5IHRvIGEgc3BlY2lmaWMgdmFsdWUuIFRoZW4gd2UgZG8gYSB0YXNrd2FpdCBhbmQgY2hlY2sgaWYgYWxsIHRhc2tzIGZpbmlzaGVkIG1lYW5pbmcgYWxsIGFycmF5IGVsZW1lbnRzIGNvbnRhaW4gdGhlIHJpZ2h0IHZhbHVlLiBUaGVuIHdlIGdlbmVyYXRlIGEgc2Vjb25kIHNldCBzZXR0aW5nIHRoZSBhcnJheSBlbGVtZW50cyB0byBhbm90aGVyIHZhbHVlLiBBZnRlciB0aGUgcGFyYWxsZWwgcmVnaW9uIHdlIGNoZWNrIGlmIGFsbCB0YXNrcyBvZiB0aGUgc2Vjb25kIHNldCBmaW5pc2hlZCBhbmQgd2VyZSBleGVjdXRlZCBhZnRlciB0aGUgdGFza3Mgb2YgdGhlIGZpcnN0IHNldC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2t3YWl0PC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZSxvbXAgdGFzazwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTkNMVURFICJvbXBfbXlfc2xlZXAuZiIKKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrd2FpdDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBJTlRFR0VSIHJlc3VsdDEsIHJlc3VsdDIKKyAgICAgICAgSU5URUdFUiBhcnJheShOVU1fVEFTS1MpCisgICAgICAgIElOVEVHRVIgaSwgbXlpCisgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgZXh0ZXJuYWwgbXlfc2xlZXAKKyAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICByZXN1bHQxID0gMAorICAgICAgICByZXN1bHQyID0gMAorCisgICAgICAgICEgZmlsbCBhcnJheQorICAgICAgICBkbyBpID0gMSwgTlVNX1RBU0tTCisgICAgICAgICAgYXJyYXkoaSkgPSAwCisgICAgICAgIGVuZCBkbworCishJG9tcCBwYXJhbGxlbCBzaGFyZWQoaSkgcHJpdmF0ZShteWkpCishJG9tcCBzaW5nbGUKKyAgICAgICAgZG8gaT0xLCBOVU1fVEFTS1MKKyAgICAgICAgICEgRmlyc3Qgd2UgaGF2ZSB0byBzdG9yZSB0aGUgdmFsdWUgb2YgdGhlIGxvb3AgaW5kZXggaW4gYSBuZXcgdmFyaWFibGUKKyAgICAgICAgICEgd2hpY2ggd2lsbCBiZSBwcml2YXRlIGZvciBlYWNoIHRhc2sgYmVjYXVzZSBvdGhlcndpc2UgaXQgd2lsbCBiZQorICAgICAgICAgISBvdmVyd3JpdHRlbiBpZiB0aGUgZXhlY3V0aW9uIG9mIHRoZSB0YXNrIHRha2VzIGxvbmdlciB0aGFuIHRoZSB0aW1lCisgICAgICAgICAhIHdoaWNoIGlzIG5lZWRlZCB0byBlbnRlciB0aGUgbmV4dCBzdGVwIG9mIHRoZSBsb29wIQorCisgICAgICAgICBteWkgPSBpCisKKyEkb21wIHRhc2sKKyAgICAgICAgICBjYWxsIG15X3NsZWVwKFNMRUVQVElNRSkKKyAgICAgICAgICBhcnJheShteWkpID0gMQorISRvbXAgZW5kIHRhc2sKKyAgICAgICAgZW5kIGRvCisKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgPG9tcHRzOmNoZWNrPgorISRvbXAgdGFza3dhaXQKKyAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisKKyAgICAgICAgISBjaGVjayBpZiBhbGwgdGFza3Mgd2VyZSBmaW5pc2hlZAorICAgICAgICBkbyBpPTEsIE5VTV9UQVNLUworICAgICAgICAgIGlmIChhcnJheShpKSAubmUuIDEpIHRoZW4KKyAgICAgICAgICAgICAgcmVzdWx0MSA9IHJlc3VsdDEgKyAxCisgICAgICAgICAgZW5kIGlmCisgICAgICAgIGVuZCBkbworCisgICAgICAgICEgZ2VuZXJhdGUgc29tZSBtb3JlIHRhc2tzIHdoaWNoIG5vdyBzaGFsbCBvdmVyd3JpdGUgdGhlIHZhbHVlc2luIHRoZQorICAgICAgICAhIGFycmF5CisgICAgICAgIGRvIGk9MSwgTlVNX1RBU0tTCisgICAgICAgICAgbXlpID0gaQorISRvbXAgdGFzaworICAgICAgICAgIGFycmF5KG15aSkgPSAyCishJG9tcCBlbmQgdGFzaworICAgICAgICBlbmQgZG8KKworISRvbXAgZW5kIHNpbmdsZQorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgISBmaW5hbCBjaGVjaywgaWYgYWxsIGFycmF5IGVsZW1lbnRzIGNvbnRhaW4gdGhlIHJpZ2h0IHZhbHVlcworICAgICAgICBkbyBpPTEsIE5VTV9UQVNLUworICAgICAgICAgIGlmIChhcnJheShpKSAubmUuIDIpIHRoZW4KKyAgICAgICAgICAgIHJlc3VsdDIgPSByZXN1bHQyICsgMQorICAgICAgICAgIGVuZCBpZgorICAgICAgICBlbmQgZG8KKworICAgICAgICBpZiAoIChyZXN1bHQxIC5lcS4gMCkgLmFuZC4gKHJlc3VsdDIgLmVxLiAwKSApIHRoZW4KKyAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIGVuZCBpZgorCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGVzdF9uZXN0X2xvY2suZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90ZXN0X25lc3RfbG9jay5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOTZkMjQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGVzdF9uZXN0X2xvY2suZgpAQCAtMCwwICsxLDYxIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF90ZXN0X25lc3RfbG9jayBmdW5jdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX3Rlc3RfbmVzdF9sb2NrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGVzdF9uZXN0X2xvY2s8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgcmVzdWx0CishcmVzdWx0IGlzOgorISAgICAgIDAgLS0gaWYgdGhlIHRlc3QgZmFpbHMKKyEgICAgICAxIC0tIGlmIHRoZSB0ZXN0IHN1Y2NlZWRzCisgICAgICAgIElOVEVHRVIgbnJfdGhyZWFkc19pbl9zaW5nbGUKKyAgICAgICAgSU5URUdFUiBucl9pdGVyYXRpb25zCisgICAgICAgIElOVEVHRVIgaQorICAgICAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBpbmNsdWRlICJvbXBfbGliLmgiCisgICAgICAgIElOVEVHRVIgKEtJTkQ9T01QX05FU1RfTE9DS19LSU5EKSA6OiBsb2NrCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGxvY2sKKyAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CishICAgICAgICBJTlRFR0VSICBsY2sKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorCisgICAgICAgIG5yX2l0ZXJhdGlvbnM9MAorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT0wCisgICAgICAgIENBTEwgT01QX0lOSVRfTkVTVF9MT0NLKGxvY2spCisgICAgICAgIHJlc3VsdD0wCisKKyEkb21wIHBhcmFsbGVsIHNoYXJlZChsb2NrLG5yX3RocmVhZHNfaW5fc2luZ2xlLG5yX2l0ZXJhdGlvbnMscmVzdWx0KQorISRvbXAgZG8KKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgICAgICBETyBXSElMRShPTVBfVEVTVF9ORVNUX0xPQ0sobG9jaykgLkVRLiAwKQorICAgICAgICAgIEVORCBETworICAgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorISRvbXAgZmx1c2gKKyAgICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT1ucl90aHJlYWRzX2luX3NpbmdsZSsxCishJG9tcCBmbHVzaAorICAgICAgICAgIG5yX2l0ZXJhdGlvbnM9bnJfaXRlcmF0aW9ucysxCisgICAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGU9bnJfdGhyZWFkc19pbl9zaW5nbGUtMQorICAgICAgICAgIHJlc3VsdD1yZXN1bHQrbnJfdGhyZWFkc19pbl9zaW5nbGUKKyAgICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICAgICAgQ0FMTCBPTVBfVU5TRVRfTkVTVF9MT0NLKGxvY2spCisgICAgICAgICAgICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAgQ0FMTCBvbXBfZGVzdHJveV9uZXN0X2xvY2sobG9jaykKKyEgICAgICAgICAgICAgICBwcmludCAqLCByZXN1bHQsIG5yX2l0ZXJhdGlvbnMKKyAgICAgICAgSUYocmVzdWx0LkVRLjAgLkFORC4gbnJfaXRlcmF0aW9ucyAuRVEuIExPT1BDT1VOVCkgVEhFTgorICAgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTEKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTAKKyAgICAgICAgRU5ESUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90ZXN0bG9jay5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rlc3Rsb2NrLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IxMzA0ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90ZXN0bG9jay5mCkBAIC0wLDAgKzEsNTcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wX3Rlc3Rsb2NrIGZ1bmN0aW9uLiBUaGUgdGVzdCBjb3VudHMgdGhlIHRocmVhZHMgZW50ZXJpbmcgYW5kIGV4aXRpbmcgYSBzaW5nbGUgcmVnaW9uIHdoaWNoIGlzIGJ1aWxkIHdpdGggYSB0ZXN0X2xvY2sgaW4gYW4gZW5kbGVzcyBsb29wLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfdGVzdF9sb2NrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGVzdGxvY2s8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgcmVzdWx0CisgICAgICAgIElOVEVHRVIgbnJfdGhyZWFkc19pbl9zaW5nbGUKKyAgICAgICAgSU5URUdFUiBucl9pdGVyYXRpb25zCisgICAgICAgIElOVEVHRVIgaQorICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIGluY2x1ZGUgIm9tcF9saWIuaCIKKyAgICAgICAgSU5URUdFUiAoS0lORD1PTVBfTE9DS19LSU5EKTo6bG9jaworICAgICAgICBDT01NT04gL29ycGh2YXJzLyBsb2NrCisgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKworICAgICAgICBucl9pdGVyYXRpb25zPTAKKyAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGU9MAorICAgICAgICBDQUxMIE9NUF9JTklUX0xPQ0sobG9jaykKKyAgICAgICAgcmVzdWx0PTAKKworISRvbXAgcGFyYWxsZWwgc2hhcmVkKGxvY2ssbnJfdGhyZWFkc19pbl9zaW5nbGUsbnJfaXRlcmF0aW9ucyxyZXN1bHQpCishJG9tcCBkbworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPgorICAgICAgICAgIERPIFdISUxFICguTk9ULiBPTVBfVEVTVF9MT0NLKGxvY2spKQorICAgICAgICAgIEVORCBETworICAgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorISRvbXAgZmx1c2gKKyAgICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT1ucl90aHJlYWRzX2luX3NpbmdsZSsxCishJG9tcCBmbHVzaAorICAgICAgICAgIG5yX2l0ZXJhdGlvbnM9bnJfaXRlcmF0aW9ucysxCisgICAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGU9bnJfdGhyZWFkc19pbl9zaW5nbGUtMQorICAgICAgICAgIHJlc3VsdD1yZXN1bHQrbnJfdGhyZWFkc19pbl9zaW5nbGUKKyAgICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICAgICAgQ0FMTCBPTVBfVU5TRVRfTE9DSyhsb2NrKQorICAgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIENBTEwgT01QX0RFU1RST1lfTE9DSyhsb2NrKQorISAgICAgICAgICAgICAgIHByaW50ICosIHJlc3VsdCwgbnJfaXRlcmF0aW9ucworICAgICAgICBJRihyZXN1bHQuRVEuMCAuQU5ELiBucl9pdGVyYXRpb25zIC5FUS4gTE9PUENPVU5UKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPj0xCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTAKKyAgICAgICAgRU5ESUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90ZXN0c3VpdGUuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90ZXN0c3VpdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmQ0ODIxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rlc3RzdWl0ZS5mCkBAIC0wLDAgKzEsMiBAQAorCWludGVnZXIgTE9PUENPVU5UCisJcGFyYW1ldGVyIChMT09QQ09VTlQ9MTAwMCkKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90aHJlYWRwcml2YXRlLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGhyZWFkcHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MjA0OTgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGhyZWFkcHJpdmF0ZS5mCkBAIC0wLDAgKzEsODkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHRocmVhZHByaXZhdGUgZGlyZWN0aXZlIGJ5IGZpbGxpbmcgYW4gYXJyYXkgd2l0aCByYW5kb20gbnVtYmVycyBpbiBhbiBwYXJhbGxlbGlzZWQgcmVnaW9uLiBFYWNoIHRocmVhZCBnZW5lcmF0ZXMgb25lIG51bWJlciBvZiB0aGUgYXJyYXkgYW5kIHNhdmVzIHRoaXMgaW4gYSB0ZW1wb3JhcnkgdGhyZWFkcHJpdmF0ZSB2YXJpYWJsZS4gSW4gYSBzZWNvbmQgcGFyYWxsZWxpc2VkIHJlZ2lvbiB0aGUgdGVzdCBjb250cm9scywgdGhhdCB0aGUgdGVtcG9yYXJ5IHZhcmlhYmxlIGNvbnRhaW5zIHN0aWxsIHRoZSBmb3JtZXIgdmFsdWUgYnkgY29tcGFyaW5nIGl0IHdpdGggdGhlIG9uZSBpbiB0aGUgYXJyYXkuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0aHJlYWRwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcF9zZXRfZHluYW1pYyxvbXBfZ2V0X251bV90aHJlYWRzLG9tcCBtYXN0ZXI8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorIVlpIFdlbiBtb2RpZmllZCB0aGlzIGZ1bmN0aW9uIGZyb20gaGlzIG93biB1bmRlcnN0YW5kaW5nIG9mIHRoZSBzZW1hbnRpY3MKKyFvZiBDIHZlcnNpb24gYXQgMDUwNDIwMDQKKyFUaGUgdW5kZWVzdGFuZGluZyBpcyB0aGF0IHN1bTAgYW5kIG15dmFsdWUgY2FuIGJlIGxvY2FsIHN0YXRpYyB2YXJpYWJsZXMKKyFvZiB0aGUgY2hrX29tcF90aHJlYWRwcml2YXRlIGZ1bmN0aW9uLiBUaGVyZSBpcyBubyBuZWVkIHRvIHVzZSBjb21tb24KKyFibG9jaworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90aHJlYWRwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSwga25vd25fc3VtLCBpICwgaXRlciwgcmFuayxzaXplLCBmYWlsZWQKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X251bV90aHJlYWRzLCBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgUkVBTCBteV9yYW5kb20KKyAgICAgICAgUkVBTCwgQUxMT0NBVEFCTEU6OiBkYXRhKDopCisgICAgICAgIElOVEVHRVIgcmFuZG9tX3NpemUKKyAgICAgICAgSU5UUklOU0lDIHJhbmRvbV9udW1iZXIKKyAgICAgICAgSU5UUklOU0lDIHJhbmRvbV9zZWVkCisgICAgICAgIEVYVEVSTkFMIG9tcF9zZXRfZHluYW1pYworCishWWkgV2VuIG1vZGlmaWVkIGF0IDA1MDQyMDA0IDogYWRkICJzYXZlIgorICAgICAgICBJTlRFR0VSLCBTQVZFOjogc3VtMAorICAgICAgICBSRUFMLCBTQVZFOjpteXZhbHVlCishWWkgV2VuIGNvbW1lbnRlZCB0d28gY29tbW9uIGJsb2NrcworIQljb21tb24vY3N1bTAvIHN1bTAKKyEJY29tbW9uL2NteXZhbHVlLyBteXZhbHVlCishISEhISEhISEhJG9tcCB0aHJlYWRwcml2YXRlKC9jc3VtMC8sL2NteXZhbHVlLykKKwkJPG9tcHRzOmNoZWNrPgorISRvbXAgdGhyZWFkcHJpdmF0ZShzdW0wLG15dmFsdWUpCisJCTwvb21wdHM6Y2hlY2s+CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKworICAgICAgICBzdW0gPSAwCisgICAgICAgIGZhaWxlZCA9IDAKKyAgICAgICAgc3VtMD0wCisgICAgICAgIG15dmFsdWU9MAorICAgICAgICByYW5kb21fc2l6ZT00NQorICAgICAgICBDQUxMIG9tcF9zZXRfZHluYW1pYyguRkFMU0UuKQorISRvbXAgcGFyYWxsZWwKKyAgICAgICAgc3VtMCA9IDAKKyEkb21wIGRvCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzIKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLk5FLiBzdW0gKSBUSEVOCisgICAgICAgICAgUFJJTlQgKiwgJyBrbm93bl9zdW0gPScsIGtub3duX3N1bSwgJywgc3VtID0nLHN1bQorICAgICAgICBFTkQgSUYKKworICAgICAgICBDQUxMIG9tcF9zZXRfZHluYW1pYyguRkFMU0UuKQorCishJG9tcCBwYXJhbGxlbAorISRvbXAgbWFzdGVyCisgICAgICAgIHNpemUgPSBvbXBfZ2V0X251bV90aHJlYWRzKCkKKyAgICAgICAgQUxMT0NBVEUgKCBkYXRhKHNpemUpICkKKyEkb21wIGVuZCBtYXN0ZXIKKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBDQUxMIFJBTkRPTV9TRUVEKFNJWkU9cmFuZG9tX3NpemUpCisgICAgICAgIERPIGl0ZXIgPSAwLCA5OQorICAgICAgICAgIENBTEwgUkFORE9NX05VTUJFUihIQVJWRVNUPW15X3JhbmRvbSkKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUocmFuaykKKyAgICAgICAgICByYW5rID0gb21wX2dldF90aHJlYWRfbnVtKCkrMQorICAgICAgICAgIG15dmFsdWUgPSBteV9yYW5kb20gKyByYW5rCisgICAgICAgICAgZGF0YShyYW5rKSA9IG15dmFsdWUKKyEkb21wIGVuZCBwYXJhbGxlbAorISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShyYW5rKQorICAgICAgICAgIHJhbmsgPSBvbXBfZ2V0X3RocmVhZF9udW0oKSsxCisgICAgICAgICAgSUYgKCBteXZhbHVlIC5ORS4gZGF0YShyYW5rKSApIFRIRU4KKyAgICAgICAgICAgIGZhaWxlZCA9IGZhaWxlZCArIDEKKyAgICAgICAgICAgIFBSSU5UICosICcgbXl2YWx1ZSA9JyxteXZhbHVlLCcgZGF0YShyYW5rKT0nLCBkYXRhKHJhbmspCisgICAgICAgICAgRU5EIElGCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAgRU5EIERPCisgICAgICAgIERFQUxMT0NBVEUoIGRhdGEpCisgICAgICAgIElGICggKGtub3duX3N1bSAuRVEuIHN1bSkgLkFORC4gKGZhaWxlZCAuTkUuIDEpICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIGVsc2UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMCAKKyAgICAgICAgZW5kIGlmCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfd29ya3NoYXJlLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfd29ya3NoYXJlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThmYWEyNwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF93b3Jrc2hhcmUuZgpAQCAtMCwwICsxLDE0MiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIGlmIFdPUktTSEFSRSBpcyBwcmVzZW50Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgd29ya3NoYXJlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorISBGdW5jdGlvbjogb21wX3dvcmtzaGFyZQorISAKKyEgYnkgQ2h1bmh1YSBMaWFvLCBVbml2ZXJzaXR5IG9mIEhvdXN0b24KKyEgT2N0LiAyMDA1IC0gRmlyc3QgdmVyc2lvbgorISAKKyEgVGhlIGlkZWEgZm9yIHRoZSB0ZXN0IGlzIHRoYXQgaWYgV09SS1NIQVJFIGlzIG5vdCBwcmVzZW50LAorISB0aGUgYXJyYXkgYXNzaWdubWVudCBpbiBQQVJBTExFTCByZWdpb24gd2lsbCBiZSBleGVjdXRlZCBieSBlYWNoIAorISB0aHJlYWQgYW5kIHRoZW4gd3JvbmdmdWxseSByZXBlYXRlZCBzZXZlcmFsIHRpbWVzLgorIQorISBUT0RPOkRvIHdlIG5lZWQgdGVzdCBmb3IgV0hFUkUgYW5kIEZPUkFMTD8KKyEgQSBzaW1wbGUgdGVzdCBmb3IgV0hFUkUgYW5kIEZPUkFMTCBpcyBhZGRlZCBieSBaaGVueWluZyBMaXUKKyEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3dvcmtzaGFyZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiByZXN1bHQsaQorICAgICAgICBJTlRFR0VSIHNjYWxhcjAyLHNjYWxhcjEyLHNjYWxhcjIyLHNjYWxhcjMyLGNvdW50CisgICAgICAgIFJFQUwsIERJTUVOU0lPTigxMDAwKTo6RkYKKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBzY2FsYXIwLHNjYWxhcjEsc2NhbGFyMixzY2FsYXIzCisgICAgICAgIElOVEVHRVIsIERJTUVOU0lPTigxMDAwKTo6QUEsQkIsQ0MKKyAgICAgICAgUkVBTCwgRElNRU5TSU9OKDEwMDApOjpERAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBzY2FsYXIwLHNjYWxhcjEsc2NhbGFyMixzY2FsYXIzLAorICAgICAmICAgICAgQUEsQkIsQ0MsREQKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgcmVzdWx0PTAKKyAgICAgICAgc2NhbGFyMD0wCisgICAgICAgIHNjYWxhcjAyPTAKKyAgICAgICAgc2NhbGFyMT0wCisgICAgICAgIHNjYWxhcjEyPTAKKyAgICAgICAgc2NhbGFyMj0wCisgICAgICAgIHNjYWxhcjIyPTAKKyAgICAgICAgc2NhbGFyMz0wCisgICAgICAgIHNjYWxhcjMyPTAKKyAKKyAgICAgICAgY291bnQgPSAwCisKKyAgICAgICAgQUE9MAorICAgICAgICBCQj0wCisKKyAgICAgICAgZG8gaT0xLDEwMDAKKyAgICAgICAgICBDQyhpKSA9IGkKKyAgICAgICAgICBGRihpKSA9IDEuMC9pCisgICAgICAgIGVuZCBkbworCishJE9NUCBQQVJBTExFTAorPG9tcHRzOm9ycGhhbj4KKzxvbXB0czpjaGVjaz4hJE9NUCAgIFdPUktTSEFSRTwvb21wdHM6Y2hlY2s+CisKKyEgdGVzdCBpZiB3b3JrIGlzIGRpdmlkZWQgb3Igbm90IGZvciBhcnJheSBhc3NpZ25tZW50CisgICAgICAgIEFBPUFBKzEKKworISB0ZXN0IGlmIHNjYWxhciBhc3NpZ25tZW50IGlzIHRyZWF0ZWQgYXMgYSBzaW5nbGUgdW5pdCBvZiB3b3JrCisgICAgICAgIHNjYWxhcjA9c2NhbGFyMCsxIAorCishIHRlc3QgaWYgYXRvbWljIGlzIHRyZWF0ZWQgYXMgYSBzaW5nbGUgdW5pdCBvZiB3b3JrCishJE9NUCBBVE9NSUMKKyAgICAgICAgc2NhbGFyMT1zY2FsYXIxKzEgCishIHRlc3QgaWYgY3JpdGljYWwgaXMgdHJlYXRlZCBhcyBhIHNpbmdsZSB1bml0IG9mIHdvcmsKKyEkT01QIENSSVRJQ0FMCisgICAgICAgIHNjYWxhcjI9c2NhbGFyMisxCishJE9NUCBFTkQgQ1JJVElDQUwKKworISB0ZXN0IGlmIFBBUkFMTEVMIGlzIHRyZWF0ZWQgYXMgYSBzaW5nbGUgdW5pdCBvZiB3b3JrCishJE9NUCBQQVJBTExFTAorICAgICAgICBzY2FsYXIzPXNjYWxhcjMrMQorISRPTVAgRU5EIFBBUkFMTEVMCisKKyAgICAgICAgV0hFUkUgKCBDQyAubmUuIDAgKSBERCA9IDEuMC9DQworCisgICAgICAgIEZPUkFMTCAoST0xOjEwMDApIENDKGkpID0gLWkKKworPG9tcHRzOmNoZWNrPiEkT01QICAgRU5EIFdPUktTSEFSRTwvb21wdHM6Y2hlY2s+Cis8L29tcHRzOm9ycGhhbj4KKyEkT01QIEVORCBQQVJBTExFTAorCishc2VxdWVudGlhbCBlcXVpdmFsZW50IHN0YXRlbWVudHMgZm9yIGNvbXBhcmlzb24gCisgICAgICAgQkI9QkIrMQorICAgICAgIHNjYWxhcjAyPXNjYWxhcjAyKzEKKyAgICAgICBzY2FsYXIxMj1zY2FsYXIxMisxCisgICAgICAgc2NhbGFyMjI9c2NhbGFyMjIrMQorICAgICAgIHNjYWxhcjMyPXNjYWxhcjMyKzEKKworISAgICAgIHdyaXRlICgxLCopICJjazpzdW0gb2YgQUEgaXMiLFNVTShBQSksIiBzdW0gb2YgQkIgaXMgIixzdW0oQkIpCisgICAgICAgaWYgKFNVTShBQSkvPVNVTShCQikpIHRoZW4KKyAgICAgICAgICAgIHdyaXRlKDEsKikgIkFycmF5IGFzc2lnbm1lbnQgaGFzIHNvbWUgcHJvYmxlbSIKKyAgICAgICAgICAgIHJlc3VsdD1yZXN1bHQgKzEKKyAgICAgICBlbmRpZgorICAgICAgIGlmIChzY2FsYXIwLz1zY2FsYXIwMikgdGhlbgorICAgICAgICAgIHdyaXRlKDEsKikgIlNjYWxhciBhc3NpZ25tZW50IGhhcyBzb21lIHByb2JsZW0iCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsxCisgICAgICAgZW5kaWYKKyAgICAgICBpZiAoc2NhbGFyMS89c2NhbGFyMTIpIHRoZW4KKyAgICAgICAgICB3cml0ZSgxLCopICJBdG9taWMgaW5zaWRlIFdPUktTSEFSRSBoYXMgc29tZSBwcm9ibGVtIgorICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsxCisgICAgICAgZW5kaWYKKyAgICAgICBpZiAoc2NhbGFyMi89c2NhbGFyMjIpIHRoZW4KKyAgICAgICAgICB3cml0ZSgxLCopICJDUklUSUNBTCBpbnNpZGUgV09SS1NIQVJFIGhhcyBzb21lIHByb2JsZW0iCisgICAgICAgICByZXN1bHQgPSByZXN1bHQgKzEKKyAgICAgICBlbmRpZgorICAgICAgIGlmIChzY2FsYXIzLz1zY2FsYXIzMikgdGhlbgorICAgICAgICAgICB3cml0ZSgxLCopICJQQVJBTExFTCBpbnNpZGUgV09SS1NIQVJFIGhhcyBzb21lIHByb2JsZW0iCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArMQorICAgICAgIGVuZGlmCisgICAgICAgZG8gaT0xLDEwMDAKKyAgICAgICAgIGlmICggYWJzKCBERChpKS0gRkYoaSkpIC5ndC4gMS4wRS00ICkgdGhlbgorCSAgICBjb3VudCA9IGNvdW50ICsgMQorICAgICAgICAgZW5kIGlmCisgICAgICAgZW5kIGRvCisgICAgICAgaWYgKCBjb3VudCAubmUuIDAgKSB0aGVuCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgd3JpdGUoMSwqKSAiV0hFUkUgaGFzIHNvbWUgcHJvYmxlbSIKKyAgICAgICBlbmQgaWYKKworICAgICAgIGNvdW50ID0gMAorICAgICAgIGRvIGk9MSwxMDAwCisgICAgICAgICBpZiAoIENDKGkpIC5uZS4gLWkgKSB0aGVuCisgICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMQorICAgICAgICAgZW5kIGlmCisgICAgICAgZW5kIGRvCisgICAgICAgaWYgKCBjb3VudCAubmUuIDAgKSB0aGVuCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgd3JpdGUoMSwqKSAiRk9SQUxMIGhhcyBzb21lIHByb2JsZW0iCisgICAgICAgZW5kIGlmCisKKworIWlmIGFueXRoaW5nIGlzIHdyb25nLCBzZXQgcmV0dXJuIHZhbHVlIHRvIDAKKyAgICAgICBpZiAocmVzdWx0PT0wKSB0aGVuCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICBlbHNlCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICBlbmQgaWYKKyAgICAgICBlbmQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfd29ya3NoYXJlX2RlZmF1bHQuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF93b3Jrc2hhcmVfZGVmYXVsdC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NzRjNDMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfd29ya3NoYXJlX2RlZmF1bHQuZgpAQCAtMCwwICsxLDM2IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBtYXN0ZXIgZGlyZWN0aXZlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBvbXAgbWFzdGVyIHNlY3Rpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB3b3Jrc2hhcmUgZGVmYXVsdDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3dvcmtzaGFyZV9kZWZhdWx0PC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bQorICAgICAgICBJTlRFR0VSIGtub3duX3N1bQorICAgICAgICBJTlRFR0VSIG15c3VtCisgICAgICAgIElOVEVHRVIgaQorCisgICAgICAgIGtub3duX3N1bSA9IDk5OSoxMDAwLzIKKworISRvbXAgcGFyYWxsZWwgZGVmYXVsdChwcml2YXRlKSBzaGFyZWQoc3VtKQorISRvbXAgZG8gCisgICAgICAgIERPIGkgPSAxLCA5OTkKKyAgICAgICAgICAgbXlzdW0gPSBteXN1bSArIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8gCisKKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIG15c3VtCishJG9tcCBlbmQgY3JpdGljYWwKKworISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCAoa25vd25fc3VtIC5FUS4gc3VtKSApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfd3RpbWUuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF93dGltZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NzMzNGYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfd3RpbWUuZgpAQCAtMCwwICsxLDQzIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF9nZXRfd3RpbWUgZnVuY3Rpb24uIEl0IGNvbXBhcmVzIHRoZSB0aW1lIHdpdGggd2hpY2ggaXMgY2FsbGVkIGEgc2xlZXAgZnVuY3Rpb24gd2l0aCB0aGUgdGltZSBpdCB0b29rIGJ5IG1lc3N1cmluZyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjYWxsIG9mIHRoZSBzbGVlcCBmdW5jdGlvbiBhbmQgaXRzIGVuZC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2dldF93dGltZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF93dGltZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIHN0YXJ0CisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZW5kdGltZQorICAgICAgICBDT01NT04gc3RhcnQsIGVuZHRpbWUKKyAgICAgICAgaW5jbHVkZSAib21wX2xpYi5oIgorICAgICAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIHdhaXRfdGltZQorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIG1lYXN1cmVkX3RpbWUKKyAgICAgICAgSU5URUdFUiBmaWxldW5pdAorICAgICAgICB3YWl0X3RpbWU9MQorCisgICAgICAgIHN0YXJ0ID0gMDsKKyAgICAgICAgZW5kdGltZSA9IDA7CisKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgICAgc3RhcnQ9b21wX2dldF93dGltZSgpCisgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgQ0FMTCBzbGVlcCh3YWl0X3RpbWUpCisgICAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICAgIGVuZHRpbWU9b21wX2dldF93dGltZSgpCisgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgbWVhc3VyZWRfdGltZT1lbmR0aW1lLXN0YXJ0CisgICAgICAgIFdSSVRFKDEsKikgIndvcmsgdG9vayIsbWVhc3VyZWRfdGltZSwic2VjLiB0aW1lLiIKKyAgICAgICAgSUYobWVhc3VyZWRfdGltZS5HVC4wLjk5KndhaXRfdGltZSAuQU5ELgorICAgICAmIG1lYXN1cmVkX3RpbWUgLkxULiAxLjAxKndhaXRfdGltZSkgVEhFTgorICAgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTEKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fZmlyc3Rwcml2YXRlLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fZmlyc3Rwcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlhZTUyNwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19maXJzdHByaXZhdGUuZgpAQCAtMCwwICsxLDI2IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBkbyBmaXJzdHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZm9yIGZpcnN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPnBhciBkbyByZWR1Y3Rpb24scGFyIGRvIHByaXZhdGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnBhcl9kb19maXJzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgc3VtLGtub3duX3N1bSwgaTIsIGkKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBzdW0gPTAKKyAgICAgICAgaTIgPSAzCishJG9tcCBwYXJhbGxlbCBkbyA8b21wdHM6Y2hlY2s+Zmlyc3Rwcml2YXRlKGkyKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpMik8L29tcHRzOmNyb3NzY2hlY2s+IHJlZHVjdGlvbigrOnN1bSkKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBzdW0gPSBzdW0gKyAoIGkrIGkyKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzIrMypMT09QQ09VTlQKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX2RvX2lmLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9faWYuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjdmYzlhCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX2RvX2lmLmYKQEAgLTAsMCArMSwzMiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZm9yIGlmIGRpcmVjdGl2ZS4gTmVlZHMgYXQgbGVhc3QgdHdvIHRocmVhZHMuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBkbyBpZjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPjwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+cGFyX2RvX2lmPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgSU5URUdFUiBzdW0sa25vd25fc3VtLCBpLCBudW1fdGhyZWFkcworICAgICAgICBJTlRFR0VSIGNvbnRyb2wKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBzdW0gPSAwCisKKyAgICAgICAgY29udHJvbCA9IDAKKyEkb21wIHBhcmFsbGVsIGRvIDxvbXB0czpjaGVjaz5pZiAoY29udHJvbCA9PSAxKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICAgIG51bV90aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcyAoKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworICAgICAgICBXUklURSAoMSwqKSAiTnVtYmVyIG9mIHRocmVhZHMgZGV0ZXJtaW5lZCBieToiXAorICAgICAgICAgICAgICAgICAgICAib21nX2dldF9udW1fdGhyZWFzZDoiLCBudW1fdGhyZWFkcworICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzIKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gLkFORC4gbnVtX3RocmVhZHMgLkVRLiAxKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX2RvX2xhc3Rwcml2YXRlLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fbGFzdHByaXZhdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODAyMTBjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX2RvX2xhc3Rwcml2YXRlLmYKQEAgLTAsMCArMSwyOCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZG8gbGFzdHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZG8gbGFzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5wYXIgZG8gcmVkdWN0aW9uLCBwYXIgZG8gcHJpdmF0ZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+cGFyX2RvX2xhc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSwga25vd25fc3VtLCBpICwgaTAKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBzdW0gPSAwCisgICAgICAgIGkwID0gLTEKKworISRvbXAgcGFyYWxsZWwgZG8gcmVkdWN0aW9uKCs6c3VtKSBzY2hlZHVsZShzdGF0aWMsNykgPG9tcHRzOmNoZWNrPmxhc3Rwcml2YXRlKGkwKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpMCk8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICAgIGkwID0gaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzIKKyAgICAgICAgSUYgKCAoa25vd25fc3VtIC5FUS4gc3VtKSAuQU5ELiAoaTAgLkVRLiBMT09QQ09VTlQpICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCAgIAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19vcmRlcmVkLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fb3JkZXJlZC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZDRjZDAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fb3JkZXJlZC5mCkBAIC0wLDAgKzEsNjcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGRvIG9yZGVyZWQgZGlyZWN0aXZlPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBkbyBvcmRlcmVkPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+cGFyIHNjaGVkdWxlIHN0YXQ8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCishIEhlbHBlciBmdW5jdGlvbiBpc19sYXJnZXIKKyEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgSU5URUdFUiBGVU5DVElPTiBpX2lzbGFyZ2VyMihpKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgaQorICAgICAgICBJTlRFR0VSIGxhc3RfaSxpc2xhcmdlcgorICAgICAgICBDT01NT04gL2NvbS8gbGFzdF9pCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyEgICAgICAgIHByaW50ICosICJsYXN0X2kiLGxhc3RfaSwgImkiLCBpCishIGxhc3RfaSBpcyBhIGdsb2JhbCB2YXJpYWJsZQorICAgICAgICBJRiAoIGkgLkdULiBsYXN0X2kgKSBUSEVOCisgICAgICAgICAgaXNsYXJnZXIgPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICBpc2xhcmdlciA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICAgIGxhc3RfaSA9IGkKKyAgICAgICAgaV9pc2xhcmdlcjIgPSBpc2xhcmdlcgorICAgICAgRU5EIEZVTkNUSU9OCisKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5wYXJfZG9fb3JkZXJlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgQ09NTU9OIC9jb20vIGxhc3RfaQorICAgICAgICBJTlRFR0VSIGtub3duX3N1bSxpLCBsYXN0X2kKKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBpc19sYXJnZXIsc3VtLGlfaXNsYXJnZXIyCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGlzX2xhcmdlcixzdW0saQorPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgCisgICAgICAgIHN1bT0wCisgICAgICAgIGlzX2xhcmdlcj0xCisgICAgICAgIGxhc3RfaT0wCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShzdGF0aWMsIDEpIG9yZGVyZWQKKyAgICAgICAgRE8gaT0xLCA5OQorICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz4KKyEkb21wIG9yZGVyZWQKKwkJPC9vbXB0czpjaGVjaz4KKyAgICAgICAgSUYoIGlfaXNsYXJnZXIyKGkpIC5FUS4gMSAuQU5ELiBpc19sYXJnZXIgLkVRLiAxICkgVEhFTiAgCisgICAgICAgICAgaXNfbGFyZ2VyID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgaXNfbGFyZ2VyID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgICAgc3VtID0gc3VtICsgaQorCQk8b21wdHM6Y2hlY2s+CishJG9tcCBlbmQgb3JkZXJlZAorCQk8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworICAgICAgICBrbm93bl9zdW0gPSAoOTkqMTAwKS8yCishWWkgV2VuOyBTdW4gY29tcGlsZXIgd2lsbCBmYWlsIHNvbWV0aW1lcworISAgICAgICAgcHJpbnQgKiwgInN1bSIsIHN1bSwgImtzIiwga25vd25fc3VtLCAibGEiLCBpc19sYXJnZXIKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gLkFORC4gaXNfbGFyZ2VyIC5FUS4gMSApIFRIRU4KKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19wcml2YXRlLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fcHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMzlhYjkKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fcHJpdmF0ZS5mCkBAIC0wLDAgKzEsNDYgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGRvIHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZG8gcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPnBhciBkbyByZWR1Y3Rpb24sb21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIFNVQlJPVVRJTkUgZG9fc29tZV93b3JrMigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgUkVBTCBpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gc3VtCisgICAgICAgIElOVFJJTlNJQyBzcXJ0CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgc3VtID0gMC4wCisgICAgICAgIGkgPSAwCisgICAgICAgIERPIFdISUxFIChpIDwgTE9PUENPVU5UKQorICAgICAgICAgICBzdW0gPSBzdW0gKyBzcXJ0KGkpCisgICAgICAgICAgIGkgPSBpICsgMQorICAgICAgICBFTkQgRE8KKyAgICAgIEVORAorCishKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnBhcl9kb19wcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSxrbm93bl9zdW0sIGksIGkyLCBpMworICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIHN1bSA9IDAKKworISRvbXAgcGFyYWxsZWwgZG8gcmVkdWN0aW9uKCs6c3VtKSA8b21wdHM6Y2hlY2s+cHJpdmF0ZShpMik8L29tcHRzOmNoZWNrPiBzY2hlZHVsZShzdGF0aWMsMSkKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBpMiA9IGkKKyEkb21wIGZsdXNoCisgICAgICAgICAgQ0FMTCBkb19zb21lX3dvcmsyKCkKKyEkb21wIGZsdXNoCisgICAgICAgICAgc3VtID0gc3VtICsgaTIKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKyAgICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzIKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX2RvX3JlZHVjdGlvbi5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX2RvX3JlZHVjdGlvbi5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhM2Y0NTUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fcmVkdWN0aW9uLmYKQEAgLTAsMCArMSw0MTUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGRvIHJlZHVjdGlvbiBkaXJlY3RpdmUgd2l0aCBhbGwgaXRzIG9wdGlvbnMuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBkbyByZWR1Y3Rpb248L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5wYXJfZG9fcmVkdWN0aW9uPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSwgc3VtMiwga25vd25fc3VtLCBpLCBpMixkaWZmCisgICAgICAgIElOVEVHRVIgcHJvZHVjdCxrbm93bl9wcm9kdWN0LGludF9jb25zdAorICAgICAgICBJTlRFR0VSIE1BWF9GQUNUT1IKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkc3VtLGRrbm93bl9zdW0sZHQsZHB0CisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gcm91bmRpbmdfZXJyb3IsIGRkaWZmCisgICAgICAgIElOVEVHRVIgZG91YmxlX0RJR0lUUworICAgICAgICBMT0dJQ0FMIGxvZ2ljX2FuZCwgbG9naWNfb3IsIGxvZ2ljX2Vxdixsb2dpY19uZXF2CisgICAgICAgIElOVEVHRVIgYml0X2FuZCwgYml0X29yCisgICAgICAgIElOVEVHRVIgZXhjbHVzaXZfYml0X29yCisgICAgICAgIElOVEVHRVIgbWluX3ZhbHVlLCBtYXhfdmFsdWUKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkbWluLCBkbWF4CisgICAgICAgIElOVEVHRVIgcmVzdWx0CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgTE9HSUNBTCBsb2dpY3MoTE9PUENPVU5UKQorICAgICAgICBJTlRFR0VSIGludF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIFBBUkFNRVRFUiAoaW50X2NvbnN0PTEwLGtub3duX3Byb2R1Y3Q9MzYyODgwMCkKKyAgICAgICAgUEFSQU1FVEVSIChkb3VibGVfRElHSVRTPTIwLE1BWF9GQUNUT1I9MTApCisgICAgICAgIFBBUkFNRVRFUiAocm91bmRpbmdfZXJyb3I9MS5FLTYpCisKKyAgICAgICAgZHQgPSAxLi8zLgorICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIKKyAgICAgICAgcHJvZHVjdCA9IDEKKyAgICAgICAgc3VtMiA9IDAKKyAgICAgICAgc3VtID0gMAorICAgICAgICBkc3VtID0gMC4KKyAgICAgICAgcmVzdWx0ID0wIAorICAgICAgICBsb2dpY19hbmQgPSAudHJ1ZS4KKyAgICAgICAgbG9naWNfb3IgPSAuZmFsc2UuCisgICAgICAgIGJpdF9hbmQgPSAxCisgICAgICAgIGJpdF9vciA9IDAKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gMAorISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywgMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOnN1bSk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0xLCBMT09QQ09VTlQKKyAgICAgICAgICBzdW0gPSBzdW0gKyBpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKGtub3duX3N1bSAuTkUuIHN1bSkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgIHN1bSwiaW5zdGVhZCBvZiAiLCBrbm93bl9zdW0KKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgZGlmZiA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMgorCisKKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywgMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiAoLTogZGlmZik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0xLCBMT09QQ09VTlQKKyAgICAgICAgICBkaWZmID0gZGlmZiAtIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKyAgCisgICAgICAgIElGICggZGlmZiAuTkUuIDAgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGRpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgIHN1bSwiaW5zdGVhZCBvZiAwLiIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gVGVzdCBmb3IgZG91YmxlcworICAgICAgICBkc3VtID0wLgorICAgICAgICBkcHQgPSAxCisKKyAgICAgICAgRE8gaT0xLCBET1VCTEVfRElHSVRTCisgICAgICAgICAgZHB0PSBkcHQgKiBkdAorICAgICAgICBFTkQgRE8KKyAgICAgICAgZGtub3duX3N1bSA9ICgxLWRwdCkvKDEtZHQpCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpkc3VtKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MCxET1VCTEVfRElHSVRTLTEKKyAgICAgICAgICAgICAgZHN1bSA9IGRzdW0gKyBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgCisgICAgICAgIElGKGRzdW0gLk5FLiBka25vd25fc3VtIC5BTkQuIAorICAgICAmICAgIGFicyhkc3VtIC0gZGtub3duX3N1bSkgLkdULiByb3VuZGluZ19lcnJvciApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgd3JpdGUoMSwqKSAiRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgZHN1bSwiaW5zdGVhZCBvZiAiLGRrbm93bl9zdW0sIihEaWZmZXJlbmNlOiAiLAorICAgICAmICAgICAgZHN1bSAtIGRrbm93bl9zdW0sIikiCisgICAgICAgIEVORCBJRgorICAgICAgICBkcHQgPSAxCisKKyAgICAgICAgRE8gaT0xLCBET1VCTEVfRElHSVRTCisgICAgICAgICAgZHB0ID0gZHB0KmR0CisgICAgICAgIEVORCBETworICAgICAgICBkZGlmZiA9ICggMS1kcHQpLygxLWR0KQorCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkZGlmZik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTAsIERPVUJMRV9ESUdJVFMtMQorICAgICAgICAgIGRkaWZmID0gZGRpZmYgLSBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggQUJTKGRkaWZmKSAuR1QuIHJvdW5kaW5nX2Vycm9yICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgIGRkaWZmLCJpbnN0ZWFkIG9mIDAuMCIKKyAgICAgICAgRU5EIElGCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigqOnByb2R1Y3QpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLE1BWF9GQUNUT1IKKyAgICAgICAgICAgcHJvZHVjdCA9IHByb2R1Y3QgKiBpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKGtub3duX3Byb2R1Y3QgLk5FLiBwcm9kdWN0KSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gUHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICAgcHJvZHVjdCwiIGluc3RlYWQgb2YiLGtub3duX3Byb2R1Y3QgCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY3MoaSkgPSAuVFJVRS4KKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguQU5ELjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAoLk5PVC4gbG9naWNfYW5kKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgbG9naWNfYW5kID0gLlRSVUUuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuRkFMU0UuCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguQU5ELjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAobG9naWNfYW5kKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIEFORCBwYXNzIDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICBsb2dpY3MoaSkgPSAuRkFMU0UuCisgICAgICAgIEVORCBETworCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk9SLjpsb2dpY19vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLm9yLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAobG9naWNfb3IpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19vciA9IC5GQUxTRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk9SLjpsb2dpY19vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgbG9naWNfb3IgPSBsb2dpY19vciAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggLk5PVC4gbG9naWNfb3IgKSBUSEVuCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gVGVzdCBsb2dpYyBFUVYsIHVuaXF1ZSBpbiBGb3J0cmFuCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICBsb2dpY3MoaSkgPSAuVFJVRS4KKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbG9naWNfZXF2ID0gLlRSVUUuCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguRVFWLjpsb2dpY19lcXYpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKC5OT1QuIGxvZ2ljX2VxdikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBFUVYgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19lcXYgPSAuVFJVRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5GQUxTRS4KKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5FUVYuOmxvZ2ljX2Vxdik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAoIGxvZ2ljX2VxdiApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgRVFWIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gVGVzdCBsb2dpYyBORVFWLCB3aGljaCBpcyB1bmlxdWUgaW4gRm9ydHJhbgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgbG9naWNzKGkpID0gLkZBTFNFLgorICAgICAgICBFTkQgRE8KKworICAgICAgICBsb2dpY19uZXF2ID0gLkZBTFNFLgorCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk5FUVYuOmxvZ2ljX25lcXYpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuTkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKGxvZ2ljX25lcXYpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgTkVRViBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGxvZ2ljX25lcXYgPSAuRkFMU0UuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuVFJVRS4KKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5ORVFWLjpsb2dpY19uZXF2KTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLm5lcXYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggLk5PVC4gbG9naWNfbmVxdiApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgTkVRViBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgIGludF9hcnJheShpKSA9IDEKKyAgICAgICAgRU5EIERPCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oSUFORDpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCishLi4uIGlhbmQoSSxKKTogUmV0dXJucyB2YWx1ZSByZXN1bHRpbmcgZnJvbSBib29sZWFuIEFORCBvZiAKKyEuLi4gcGFpciBvZiBiaXRzIGluIGVhY2ggb2YgSSBhbmQgSi4gCisgICAgICAgICAgYml0X2FuZCA9IElBTkQoYml0X2FuZCxpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKCBiaXRfYW5kIC5MVC4gMSApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSUFORCBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGJpdF9hbmQgPSAxCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAwCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJQU5EOmJpdF9hbmQpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBiaXRfYW5kID0gSUFORCAoIGJpdF9hbmQsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYoIGJpdF9hbmQgLkdFLiAxKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElBTkQgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGludF9hcnJheShpKSA9IDAKKyAgICAgICAgRU5EIERPCisKKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSByZWR1Y3Rpb24oSU9SOmJpdF9vcikKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyEuLi4gSW9yKEksSik6IFJldHVybnMgdmFsdWUgcmVzdWx0aW5nIGZyb20gYm9vbGVhbiBPUiBvZiAKKyEuLi4gcGFpciBvZiBiaXRzIGluIGVhY2ggb2YgSSBhbmQgSi4gCisgICAgICAgICAgYml0X29yID0gSU9SKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAoIGJpdF9vciAuR0UuIDEpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSW9yIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBiaXRfb3IgPSAwCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAxCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oSU9SOmJpdF9vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGJpdF9vciA9IElPUihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKCBiaXRfb3IgLkxFLiAwKSB0aGVuCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElvciBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgaW50X2FycmF5KGkpID0gMAorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElFT1I6ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBpZW9yKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggZXhjbHVzaXZfYml0X29yIC5HRS4gMSkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIEllb3IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSAwCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAxCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJRU9SOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBJRU9SKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggZXhjbHVzaXZfYml0X29yIC5sZS4gMCkgdGhlbgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJZW9yIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAxMCAtIGkKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbWluX3ZhbHVlID0gNjU1MzUKKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKE1JTjptaW5fdmFsdWUpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgICAgbWluX3ZhbHVlID0gTUlOKG1pbl92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggbWluX3ZhbHVlIC5HVC4gKDEwLUxPT1BDT1VOVCkgKVRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gaW50ZWdlciBNSU4iCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBpbnRfYXJyYXkoaSkgPSBpCisgICAgICAgIEVORCBETworCisgICAgICAgIG1heF92YWx1ZSA9IC0zMjc2OAorCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUFYOm1heF92YWx1ZSk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgICBtYXhfdmFsdWUgPSBNQVgobWF4X3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKCBtYXhfdmFsdWUgLkxULiBMT09QQ09VTlQgKVRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gaW50ZWdlciBNQVgiCisgICAgICAgIEVORCBJRgorCishLi4uIHRlc3QgZG91YmxlIG1pbiwgbWF4CisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBkX2FycmF5KGkpID0gMTAgLSBpKmR0CisgICAgICAgIEVORCBETworCisgICAgICAgIGRtaW4gPSAyKioxMAorICAgICAgICBkdCA9IDAuNQorCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUlOOmRtaW4pPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgIGRtaW49IE1JTihkbWluLGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggZG1pbiAuR1QuICgxMC1kdCkgKVRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gZG91YmxlIE1JTiIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGRfYXJyYXkoaSkgPSBpICogZHQKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgZG1heD0gLSAoMioqMTApCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihtYXg6ZG1heCk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgZG1heD0gbWF4KGRtYXgsZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKCBkbWF4IC5MVC4gTE9PUENPVU5UKmR0IClUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGRvdWJsZSBNQVgiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIElGICggcmVzdWx0IC5FUS4gMCApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gIDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAgMAorICAgICAgICBFTkQgSUYKKworICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX3NlY3Rpb25fZmlyc3Rwcml2YXRlLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfc2VjdGlvbl9maXJzdHByaXZhdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzJiODVjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX3NlY3Rpb25fZmlyc3Rwcml2YXRlLmYKQEAgLTAsMCArMSwzNCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgZmlyc3Rwcml2YXRlIGNsYXVzZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHNlY3Rpb25zIGZpcnN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+cGFyX3NlY3Rpb25fZmlyc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSwgc3VtMCwga25vd25fc3VtCisgICAgICAgIHN1bSA9IDcKKyAgICAgICAgc3VtMCA9IDExCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+Zmlyc3Rwcml2YXRlKHN1bTApPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKHN1bTApPC9vbXB0czpjcm9zc2NoZWNrPiAgCishJG9tcCBzZWN0aW9uCishJG9tcCBjcml0aWNhbCAKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCis8b21wdHM6Y3Jvc3NjaGVjaz4hJG9tcCBzZWN0aW9uPC9vbXB0czpjcm9zc2NoZWNrPgorISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCis8b21wdHM6Y3Jvc3NjaGVjaz4hJG9tcCBzZWN0aW9uPC9vbXB0czpjcm9zc2NoZWNrPgorISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKyAgICAgICAga25vd25fc3VtID0gMTEqMyArIDcKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9zZWN0aW9uX2xhc3Rwcml2YXRlLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfc2VjdGlvbl9sYXN0cHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YzcyMWQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfc2VjdGlvbl9sYXN0cHJpdmF0ZS5mCkBAIC0wLDAgKzEsNTEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIHNlY3Rpb25zIGxhc3Rwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHNlY3Rpb25zIGxhc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5wYXJfc2VjdGlvbl9sYXN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBzdW0sIHN1bTAsIGtub3duX3N1bSwgaSAsaTAKKyAgICAgICAgc3VtID0gMAorICAgICAgICBzdW0wID0gMAorICAgICAgICBpMCA9IC0xCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+bGFzdHByaXZhdGUoaTApPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKGkwKTwvb21wdHM6Y3Jvc3NjaGVjaz4gcHJpdmF0ZShpLHN1bTApCishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIERPIGk9MSwgMzk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgICAgaTA9aQorICAgICAgICBFTkQgRE8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgc2VjdGlvbgorICAgICAgICBzdW0wID0gMAorICAgICAgICBETyBpPTQwMCwgNjk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgICAgaTAgPSBpCisgICAgICAgIEVORCBETworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIERPIGk9NzAwLCA5OTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgICBpMCA9IGkKKyAgICAgICAgRU5EIERPCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworICAgICAgICBrbm93bl9zdW0gPSAoOTk5KjEwMDApLzIKKyEgICAgICAgIHByaW50ICosICJzdW0iLCBzdW0sICJrcyIsIGtub3duX3N1bSwgaTAKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gLkFORC4gaTAgLkVRLiA5OTkgKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX3NlY3Rpb25fcHJpdmF0ZS5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX3NlY3Rpb25fcHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMGFjMGUKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfc2VjdGlvbl9wcml2YXRlLmYKQEAgLTAsMCArMSw4NiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBwYXJhbGxlbCBzZWN0aW9uIHByaXZhdGUgY2xhdXNlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgc2VjdGlvbiBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5wYXJfc2VjdGlvbl9wcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSwgc3VtMCwga25vd25fc3VtLCBpCisgICAgICAgIHN1bSA9IDcKKyAgICAgICAgc3VtMCA9IDAKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zPG9tcHRzOmNoZWNrPnByaXZhdGUoc3VtMCxpKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpKTwvb21wdHM6Y3Jvc3NjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgRE8gaT0xLCAzOTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBjcml0aWNhbAorICAgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgc2VjdGlvbgorICAgICAgICBzdW0wID0gMAorICAgICAgICBETyBpPTQwMCwgNjk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgIEVORCBETworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIERPIGk9NzAwLCA5OTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBjcml0aWNhbAorICAgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisgICAgICAgIGtub3duX3N1bSA9ICg5OTkqMTAwMCkvMis3CisgICAgICAgIElGICgga25vd25fc3VtIC5lcS4gc3VtICkgdGhlbgorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KKworICAgICAgICBpbnRlZ2VyIGZ1bmN0aW9uIGNyc2Noa19wYXJfc2VjdGlvbl9wcml2YXRlKCkKKyAgICAgICAgaW1wbGljaXQgbm9uZQorICAgICAgICBpbnRlZ2VyIHN1bSwgc3VtMCwga25vd25fc3VtLCBpCisgICAgICAgIHN1bSA9IDcKKyAgICAgICAgc3VtMCA9IDAKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkKKyEkb21wIHNlY3Rpb24KKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgZG8gaT0xLCAzOTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgZW5kIGRvCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIHNlY3Rpb24KKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgZG8gaT00MDAsIDY5OQorICAgICAgICAgIHN1bTAgPSBzdW0wICsgaQorICAgICAgICBlbmQgZG8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgc2VjdGlvbgorICAgICAgICBzdW0wID0gMAorICAgICAgICBkbyBpPTcwMCwgOTk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgIGVuZCBkbworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKyAgICAgICAga25vd25fc3VtID0gKDk5OSoxMDAwKS8yKzcKKyAgICAgICAgaWYgKCBrbm93bl9zdW0gLmVxLiBzdW0gKSB0aGVuCisgICAgICAgICAgY3JzY2hrX3Bhcl9zZWN0aW9uX3ByaXZhdGUgPSAxCisgICAgICAgIGVsc2UKKyAgICAgICAgICBjcnNjaGtfcGFyX3NlY3Rpb25fcHJpdmF0ZSA9IDAKKyAgICAgICAgZW5kIGlmCisgICAgICAgIGVuZAorCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfc2VjdGlvbl9yZWR1Y3QuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9zZWN0aW9uX3JlZHVjdC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZGUzMDQKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfc2VjdGlvbl9yZWR1Y3QuZgpAQCAtMCwwICsxLDYzMSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcmVkdWN0aW9uIGRpcmVjdGl2ZSB3aXRoIGFsbCBpdHMgb3B0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgc2VjdGlvbnMgcmVkdWN0aW9uPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+cGFyX3NlY3Rpb25fcmVkdWN0PC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSwgc3VtMiwga25vd25fc3VtLCBpLCBpMixkaWZmCisgICAgICAgIElOVEVHRVIgcHJvZHVjdCxrbm93bl9wcm9kdWN0LGludF9jb25zdAorICAgICAgICBJTlRFR0VSIE1BWF9GQUNUT1IKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkc3VtLGRrbm93bl9zdW0sZHQsZHB0CisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gcm91bmRpbmdfZXJyb3IsIGRkaWZmCisgICAgICAgIElOVEVHRVIgRE9VQkxFX0RJR0lUUworICAgICAgICBMT0dJQ0FMIGxvZ2ljX2FuZCwgbG9naWNfb3IsIGxvZ2ljX2Vxdixsb2dpY19uZXF2CisgICAgICAgIElOVEVHRVIgYml0X2FuZCwgYml0X29yCisgICAgICAgIElOVEVHRVIgZXhjbHVzaXZfYml0X29yCisgICAgICAgIElOVEVHRVIgbWluX3ZhbHVlLCBtYXhfdmFsdWUKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkbWluLCBkbWF4CisgICAgICAgIElOVEVHRVIgcmVzdWx0CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgTE9HSUNBTCBsb2dpY3MoTE9PUENPVU5UKQorICAgICAgICBJTlRFR0VSIGludF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIFBBUkFNRVRFUiAoaW50X2NvbnN0PTEwLGtub3duX3Byb2R1Y3Q9MzYyODgwMCkKKyAgICAgICAgUEFSQU1FVEVSIChET1VCTEVfRElHSVRTPTIwLE1BWF9GQUNUT1I9MTApCisgICAgICAgIFBBUkFNRVRFUiAocm91bmRpbmdfZXJyb3I9MS5FLTYpCisKKyAgICAgICAgSU5URUdFUiBjdXQxLCBjdXQyLCBjdXQzLCBjdXQ0CisKKyAgICAgICAgZHQgPSAxLi8zLgorICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIKKyAgICAgICAgcHJvZHVjdCA9IDEKKyAgICAgICAgc3VtMiA9IDAKKyAgICAgICAgc3VtID0gMAorICAgICAgICBkc3VtID0gMC4KKyAgICAgICAgcmVzdWx0ID0wIAorICAgICAgICBsb2dpY19hbmQgPSAuVFJVRS4KKyAgICAgICAgbG9naWNfb3IgPSAuRkFMU0UuCisgICAgICAgIGJpdF9hbmQgPSAxCisgICAgICAgIGJpdF9vciA9IDAKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gMAorICAgICAgICBjdXQxID0gTklOVChMT09QQ09VTlQgLyAzLikKKyAgICAgICAgY3V0MiA9IGN1dDEgKyAxCisgICAgICAgIGN1dDMgPSAyICogY3V0MQorICAgICAgICBjdXQ0ID0gY3V0MyArIDEKKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6c3VtKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPTEsIGN1dDEKKyAgICAgICAgICBzdW0gPSBzdW0gKyBpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID1jdXQyLCBjdXQzCisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9Y3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGIChrbm93bl9zdW0gLk5FLiBzdW0pIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBzdW0sImluc3RlYWQgb2YgIiwga25vd25fc3VtCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGRpZmYgPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIKKworCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uICgtOiBkaWZmKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPTEsIGN1dDEKKyAgICAgICAgICBkaWZmID0gZGlmZiAtIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPWN1dDIsIGN1dDMKKyAgICAgICAgICBkaWZmID0gZGlmZiAtIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGRpZmYgPSBkaWZmIC0gaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworICAKKyAgICAgICAgSUYgKCBkaWZmIC5ORS4gMCApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gZGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICAgc3VtLCJpbnN0ZWFkIG9mIDAuIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGZvciBkb3VibGVzCisgICAgICAgIGRzdW0gPTAuCisgICAgICAgIGRwdCA9IDEKKworICAgICAgICBETyBpPTEsIERPVUJMRV9ESUdJVFMKKyAgICAgICAgICBkcHQ9IGRwdCAqIGR0CisgICAgICAgIEVORCBETworICAgICAgICBka25vd25fc3VtID0gKDEtZHB0KS8oMS1kdCkKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpkc3VtKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MCw2CisgICAgICAgICAgIGRzdW0gPSBkc3VtICsgZHQqKmkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9NywxMgorICAgICAgICAgICBkc3VtID0gZHN1bSArIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEzLERPVUJMRV9ESUdJVFMtMQorICAgICAgICAgICBkc3VtID0gZHN1bSArIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAKKyAgICAgICAgSUYoZHN1bSAuTkUuIGRrbm93bl9zdW0gLkFORC4gCisgICAgICYgICAgIEFCUyhkc3VtIC0gZGtub3duX3N1bSkgLkdULiByb3VuZGluZ19lcnJvciApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgIGRzdW0sImluc3RlYWQgb2YgIixka25vd25fc3VtLCIoRGlmZmVyZW5jZTogIiwKKyAgICAgJiAgICAgICBkc3VtIC0gZGtub3duX3N1bSwiKSIKKyAgICAgICAgRU5EIElGCisgICAgICAgIGRwdCA9IDEKKworCisgICAgICAKKyAgICAgICAgRE8gaT0xLCBET1VCTEVfRElHSVRTCisgICAgICAgICAgIGRwdCA9IGRwdCpkdAorICAgICAgICBFTkQgRE8KKyAgICAgICAgZGRpZmYgPSAoIDEtZHB0KS8oMS1kdCkKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkZGlmZik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTAsIDYKKyAgICAgICAgICBkZGlmZiA9IGRkaWZmIC0gZHQqKmkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9NywgMTIKKyAgICAgICAgICBkZGlmZiA9IGRkaWZmIC0gZHQqKmkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MTMsIERPVUJMRV9ESUdJVFMtMQorICAgICAgICAgIGRkaWZmID0gZGRpZmYgLSBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICggQUJTKGRkaWZmKSAuR1QuIHJvdW5kaW5nX2Vycm9yICkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICAgZGRpZmYsImluc3RlYWQgb2YgMC4wIgorICAgICAgICBFTkQgSUYKKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigqOnByb2R1Y3QpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLDMKKyAgICAgICAgICAgcHJvZHVjdCA9IHByb2R1Y3QgKiBpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTQsNgorICAgICAgICAgICBwcm9kdWN0ID0gcHJvZHVjdCAqIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9NywxMAorICAgICAgICAgICBwcm9kdWN0ID0gcHJvZHVjdCAqIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAoa25vd25fcHJvZHVjdCAuTkUuIHByb2R1Y3QpIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBwcm9kdWN0LCIgaW5zdGVhZCBvZiIsa25vd25fcHJvZHVjdCAKKyAgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY3MoaSkgPSAuVFJVRS4KKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLkFORC46bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSxjdXQxCisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLGN1dDMKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsTE9PUENPVU5UCisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIGlmICgubm90LiBsb2dpY19hbmQpIHRoZW4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgd3JpdGUoMSwqKSAiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMSIKKyAgICAgICAgZW5kIGlmCisKKworICAgICAgICBsb2dpY19hbmQgPSAuVFJVRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5GQUxTRS4KKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguQU5ELjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLGN1dDEKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsY3V0MworICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKGxvZ2ljX2FuZCkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBBTkQgcGFzcyAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljcyhpKSA9IC5GQUxTRS4KKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk9SLjpsb2dpY19vcik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgbG9naWNfb3IgPSBsb2dpY19vciAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAobG9naWNfb3IpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19vciA9IC5GQUxTRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5PUi46bG9naWNfb3IpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLGN1dDEKKyAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsY3V0MworICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKCAuTk9ULiBsb2dpY19vciApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGxvZ2ljIEVRViwgdW5pcXVlIGluIEZvcnRyYW4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY3MoaSkgPSAuVFJVRS4KKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbG9naWNfZXF2ID0gLlRSVUUuCisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLkVRVi46bG9naWNfZXF2KTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfZXF2ID0gbG9naWNfZXF2IC5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICguTk9ULiBsb2dpY19lcXYpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgRVFWIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgbG9naWNfZXF2ID0gLlRSVUUuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuRkFMU0UuCisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLkVRVi46bG9naWNfZXF2KTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSxjdXQxCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0MixjdXQzCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCxMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfZXF2ID0gbG9naWNfZXF2IC5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICggbG9naWNfZXF2ICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBFUVYgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGxvZ2ljIE5FUVYsIHdoaWNoIGlzIHVuaXF1ZSBpbiBGb3J0cmFuCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgbG9naWNzKGkpID0gLkZBTFNFLgorICAgICAgICBFTkQgRE8KKworICAgICAgICBsb2dpY19uZXF2ID0gLkZBTFNFLgorCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5ORVFWLjpsb2dpY19uZXF2KTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDIsIGN1dDMKKyAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuTkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGIChsb2dpY19uZXF2KSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIE5FUVYgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19uZXF2ID0gLkZBTFNFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLlRSVUUuCisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLk5FUVYuOmxvZ2ljX25lcXYpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLGN1dDEKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLGN1dDMKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQ0LExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuTkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKCAuTk9ULiBsb2dpY19uZXF2ICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBORVFWIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAxCisgICAgICAgIEVORCBETworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJQU5EOmJpdF9hbmQpPC9vbXB0czpjaGVjaz4KKyEuLi4gaWFuZChJLEopOiBSZXR1cm5zIHZhbHVlIHJlc3VsdGluZyBmcm9tIGJvb2xlYW4gQU5EIG9mCishLi4uIHBhaXIgb2YgYml0cyBpbiBlYWNoIG9mIEkgYW5kIEouCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSwgY3V0MQorICAgICAgICAgIGJpdF9hbmQgPSBJQU5EKGJpdF9hbmQsaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLCBjdXQzCisgICAgICAgICAgYml0X2FuZCA9IElBTkQoYml0X2FuZCxpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGJpdF9hbmQgPSBJQU5EKGJpdF9hbmQsaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICggYml0X2FuZCAuTFQuIDEgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElBTkQgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBiaXRfYW5kID0gMQorICAgICAgICBpbnRfYXJyYXkoTE9PUENPVU5ULzIpID0gMAorCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElBTkQ6Yml0X2FuZCk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsIGN1dDEKKyAgICAgICAgICBiaXRfYW5kID0gSUFORCAoIGJpdF9hbmQsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsIGN1dDMKKyAgICAgICAgICBiaXRfYW5kID0gSUFORCAoIGJpdF9hbmQsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGJpdF9hbmQgPSBJQU5EICggYml0X2FuZCwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiggYml0X2FuZCAuR0UuIDEpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSUFORCBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgaW50X2FycmF5KGkpID0gMAorICAgICAgICBFTkQgRE8KKworCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElPUjpiaXRfb3IpPC9vbXB0czpjaGVjaz4KKyEuLi4gSW9yKEksSik6IFJldHVybnMgdmFsdWUgcmVzdWx0aW5nIGZyb20gYm9vbGVhbiBPUiBvZgorIS4uLiBwYWlyIG9mIGJpdHMgaW4gZWFjaCBvZiBJIGFuZCBKLgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsIGN1dDEKKyAgICAgICAgICBiaXRfb3IgPSBJT1IoYml0X29yLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLCBjdXQzCisgICAgICAgICAgYml0X29yID0gSU9SKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgYml0X29yID0gSU9SKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAoIGJpdF9vciAuR0UuIDEpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSW9yIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBiaXRfb3IgPSAwCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAxCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElPUjpiaXRfb3IpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLCBjdXQxCisgICAgICAgICAgYml0X29yID0gSU9SKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0MiwgY3V0MworICAgICAgICAgIGJpdF9vciA9IElPUihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGJpdF9vciA9IElPUihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKCBiaXRfb3IgLkxFLiAwKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElvciBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgaW50X2FycmF5KGkpID0gMAorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJRU9SOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IElFT1IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IElFT1IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gSUVPUihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAoIGV4Y2x1c2l2X2JpdF9vciAuR0UuIDEpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSWVvciBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IDAKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDEKKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJRU9SOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IElFT1IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IElFT1IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gSUVPUihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAoIGV4Y2x1c2l2X2JpdF9vciAuTEUuIDApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSWVvciBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAxMCAtIGkKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbWluX3ZhbHVlID0gNjU1MzUKKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihNSU46bWluX3ZhbHVlKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgbWluX3ZhbHVlID0gTUlOKG1pbl92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDIsIGN1dDMKKyAgICAgICAgICBtaW5fdmFsdWUgPSBNSU4obWluX3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgbWluX3ZhbHVlID0gTUlOKG1pbl92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICggbWluX3ZhbHVlIC5HVC4gKDEwLUxPT1BDT1VOVCkgKVRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gaW50ZWdlciBNSU4iCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGludF9hcnJheShpKSA9IGkKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbWF4X3ZhbHVlID0gLTMyNzY4CisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUFYOm1heF92YWx1ZSk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgIG1heF92YWx1ZSA9IE1BWChtYXhfdmFsdWUsaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgbWF4X3ZhbHVlID0gTUFYKG1heF92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIG1heF92YWx1ZSA9IE1BWChtYXhfdmFsdWUsaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAoIG1heF92YWx1ZSAuTFQuIExPT1BDT1VOVCApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBpbnRlZ2VyIE1BWCIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gdGVzdCBkb3VibGUgbWluLCBtYXgKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGRfYXJyYXkoaSkgPSAxMCAtIGkqZHQKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgZG1pbiA9IDIqKjEwCisgICAgICAgIGR0ID0gMC41CisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUlOOmRtaW4pPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IDEsIGN1dDEKKyAgICAgICAgICBkbWluPSBNSU4oZG1pbixkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgZG1pbj0gTUlOKGRtaW4sZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgZG1pbj0gTUlOKGRtaW4sZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKCBkbWluIC5HVC4gKDEwLWR0KSApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBkb3VibGUgTUlOIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBkX2FycmF5KGkpID0gaSAqIGR0CisgICAgICAgIEVORCBETworCisgICAgICAgIGRtYXg9IC0gKDIqKjEwKQorCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKE1BWDpkbWF4KTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgZG1heD0gTUFYKGRtYXgsZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgIGRtYXg9IE1BWChkbWF4LGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGRtYXg9IE1BWChkbWF4LGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICggZG1heCAubHQuIExPT1BDT1VOVCpkdCApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICB3cml0ZSgxLCopICJFcnJvciBpbiBkb3VibGUgTUFYIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBJRiAoIHJlc3VsdCAuRVEuIDAgKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9ICAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gIDAKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgQ0xPU0UoMikKKworICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vc2VjdGlvbl9maXJzdHByaXZhdGUuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3NlY3Rpb25fZmlyc3Rwcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMwMDU4YQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3NlY3Rpb25fZmlyc3Rwcml2YXRlLmYKQEAgLTAsMCArMSw0MSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgc2VjdGlvbiBmaXJzdHByaXZhdGUgZGlyZWN0aXZlIGJ5IGFkZGluZyBhIHZhcmlhYmxlIHdoaWNoIGlzIGRlZmluZWQgYmVmb3JlIHRoZSBwYXJhbGxlbCByZWdpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmaXJzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5zZWN0aW9uX2ZpcnN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBrbm93bl9zdW0KKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBzdW0sc3VtMAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBzdW0sc3VtMAorPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgc3VtID0gNworICAgICAgICBzdW0wID0gMTEKKyEkb21wIHBhcmFsbGVsCisgICAgICAgIDxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+Zmlyc3Rwcml2YXRlKHN1bTApPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKHN1bTApPC9vbXB0czpjcm9zc2NoZWNrPgorISRvbXAgc2VjdGlvbgorISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBzZWN0aW9uCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIHNlY3Rpb24KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgZW5kIHNlY3Rpb25zCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIGtub3duX3N1bSA9IDExKjMrNworICAgICAgICBJRiAoIGtub3duX3N1bSAuRVEuIHN1bSkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3NlY3Rpb25fbGFzdHByaXZhdGUuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3NlY3Rpb25fbGFzdHByaXZhdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmE3MTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vc2VjdGlvbl9sYXN0cHJpdmF0ZS5mCkBAIC0wLDAgKzEsNjIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNlY3Rpb24gbGFzdHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2VjdGlvbiBsYXN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnNlY3Rpb25fbGFzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTlRFR0VSIGtub3duX3N1bQorCisgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBpLCBpMCwgc3VtLCBzdW0wCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGksaTAsc3VtCisgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgc3VtID0gMAorICAgICAgICBzdW0wID0gMAorICAgICAgICBpMCA9IC0xCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPmxhc3Rwcml2YXRlKGkwKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpMCk8L29tcHRzOmNyb3NzY2hlY2s+IHByaXZhdGUoaSxzdW0wKQorISRvbXAgc2VjdGlvbgorICAgICAgICBzdW0wID0gMAorICAgICAgICBETyBpPTEsIDM5OQorICAgICAgICAgIHN1bTAgPSBzdW0wICsgaQorICAgICAgICAgIGkwID0gaQorICAgICAgICBFTkQgRE8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgc2VjdGlvbgorICAgICAgICBzdW0wID0gMAorICAgICAgICBETyBpPTQwMCwgNjk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgICAgaTAgPSBpCisgICAgICAgIEVORCBETworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIERPIGk9NzAwLCA5OTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgICBpMCA9IGkKKyAgICAgICAgRU5EIERPCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIGVuZCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBrbm93bl9zdW0gPSAoOTk5KjEwMDApLzIKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gLkFORC4gaTAgLkVRLiA5OTkgKSBUSEVOCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tdHM6dGVzdD4KKworCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9zZWN0aW9uX3ByaXZhdGUuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3NlY3Rpb25fcHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YjgwOTAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9zZWN0aW9uX3ByaXZhdGUuZgpAQCAtMCwwICsxLDU1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIHBhcmFsbGVsIHNlY3Rpb24gcHJpdmF0ZSBjbGF1c2UuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBzZWN0aW9uIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnNlY3Rpb25fcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBrbm93bl9zdW0KKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBzdW0sc3VtMCxpCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHN1bSxzdW0wLGkKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgc3VtID0gNworICAgICAgICBzdW0wID0gMAorISRvbXAgcGFyYWxsZWwKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5wcml2YXRlKHN1bTAsaSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoaSk8L29tcHRzOmNyb3NzY2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIERPIGk9MSwgMzk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgIEVORCBETworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIERPIGk9NDAwLCA2OTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIHNlY3Rpb24KKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgRE8gaT03MDAsIDk5OQorICAgICAgICAgIHN1bTAgPSBzdW0wICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgZW5kIHNlY3Rpb25zCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIGtub3duX3N1bSA9ICg5OTkqMTAwMCkvMis3CisgICAgICAgIElGICgga25vd25fc3VtIC5FUS4gc3VtKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vc2VjdGlvbl9yZWR1Y3Rpb24uZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3NlY3Rpb25fcmVkdWN0aW9uLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdlNzBmOQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3NlY3Rpb25fcmVkdWN0aW9uLmYKQEAgLTAsMCArMSw3NDMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNlY3Rpb25zIHJlZHVjdGlvbiBkaXJlY3RpdmUgd2l0aCBhbGwgaXRzIG9wdGlvbnMuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBzZWN0aW9ucyByZWR1Y3Rpb248L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5zZWN0aW9uX3JlZHVjdGlvbjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBzdW0yLCBrbm93bl9zdW0sIGkyCisgICAgICAgIElOVEVHRVIga25vd25fcHJvZHVjdCxpbnRfY29uc3QKKyAgICAgICAgSU5URUdFUiBNQVhfRkFDVE9SCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZGtub3duX3N1bSxkcHQKKyAgICAgICAgSU5URUdFUiByZXN1bHQKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBQQVJBTUVURVIgKGludF9jb25zdD0xMCxrbm93bl9wcm9kdWN0PTM2Mjg4MDApCisKKyAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIGksZHVtbXkKKyAgICAgICAgSU5URUdFUiBzdW0sIGRJRmYKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkdAorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIGRzdW0sIGRkSUZmCisgICAgICAgIElOVEVHRVIgcHJvZHVjdAorICAgICAgICBMT0dJQ0FMIGxvZ2ljcyhMT09QQ09VTlQpCisgICAgICAgIElOVEVHRVIgaW50X2FycmF5KExPT1BDT1VOVCkKKyAgICAgICAgTE9HSUNBTCBsb2dpY19hbmQsIGxvZ2ljX29yLCBsb2dpY19lcXYsbG9naWNfbmVxdgorICAgICAgICBJTlRFR0VSIGJpdF9hbmQsIGJpdF9vcgorICAgICAgICBJTlRFR0VSIGV4Y2x1c2l2X2JpdF9vcgorICAgICAgICBJTlRFR0VSIG1pbl92YWx1ZSwgbWF4X3ZhbHVlCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZG1pbiwgZG1heAorCisgICAgICAgIElOVEVHRVIgRE9VQkxFX0RJR0lUUworICAgICAgICBJTlRFR0VSIGN1dDEsIGN1dDIsIGN1dDMsIGN1dDQKKyAgICAgICAgUEFSQU1FVEVSIChET1VCTEVfRElHSVRTPTIwLE1BWF9GQUNUT1I9MTApCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gcm91bmRpbmdfZXJyb3IKKyAgICAgICAgUEFSQU1FVEVSIChyb3VuZGluZ19lcnJvcj0xLkUtNikKKworICAgICAgICBDT01NT04gL29ycGh2YXJzLyBpLHN1bSxkSUZmLHByb2R1Y3QsZHQsZHN1bSxkZElGZixsb2dpY19hbmQsCisgICAgICYgICAgbG9naWNfb3IsbG9naWNfZXF2LGxvZ2ljX25lcXYsbG9naWNzLGludF9hcnJheSxiaXRfYW5kLGJpdF9vciwKKyAgICAgJiAgICBleGNsdXNpdl9iaXRfb3IsbWluX3ZhbHVlLGRtaW4sZG1heCxkX2FycmF5LG1heF92YWx1ZQorICAgICAgICAKKyAgICAgICAgY3V0MSA9IE5JTlQoTE9PUENPVU5UIC8gMy4zKQorICAgICAgICBjdXQyID0gY3V0MSArIDEKKyAgICAgICAgY3V0MyA9IGN1dDEgKiAyCisgICAgICAgIGN1dDQgPSBjdXQzICsgMQorCisgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgZHQgPSAxLi8zLgorICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIKKyAgICAgICAgcHJvZHVjdCA9IDEKKyAgICAgICAgc3VtMiA9IDAKKyAgICAgICAgc3VtID0gMAorICAgICAgICBkc3VtID0gMC4KKyAgICAgICAgcmVzdWx0ID0wIAorICAgICAgICBsb2dpY19hbmQgPSAudHJ1ZS4KKyAgICAgICAgbG9naWNfb3IgPSAuZmFsc2UuCisgICAgICAgIGJpdF9hbmQgPSAxCisgICAgICAgIGJpdF9vciA9IDAKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gMAorICAgICAgICBjdXQxID0gTklOVChMT09QQ09VTlQgLyAzLjMpCisgICAgICAgIGN1dDIgPSBjdXQxICsgMQorICAgICAgICBjdXQzID0gY3V0MSAqIDIKKyAgICAgICAgY3V0NCA9IGN1dDMgKyAxCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6c3VtKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPTEsIGN1dDEKKyAgICAgICAgICBzdW0gPSBzdW0gKyBpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID1jdXQyLCBjdXQzCisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9Y3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoa25vd25fc3VtIC5ORS4gc3VtKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgIHN1bSwiaW5zdGVhZCBvZiAiLCBrbm93bl9zdW0KKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgZElGZiA9IGtub3duX3N1bQorCisKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uICgtOiBkSUZmKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPTEsIGN1dDEKKyAgICAgICAgICBkSUZmID0gZElGZiAtIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPWN1dDIsIGN1dDMKKyAgICAgICAgICBkSUZmID0gZElGZiAtIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGRJRmYgPSBkSUZmIC0gaQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKyAgCisgICAgICAgIElGICggZElGZiAuTkUuIDAgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBkSUZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICBzdW0sImluc3RlYWQgb2YgMC4iCisgICAgICAgIEVORCBJRgorCishKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEKKyEgICBUZXN0IGZvciBET3VibGVzCishKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEKKyAgICAgICAgZHN1bSA9IDAuCisgICAgICAgIGRwdCA9IDEKKworICAgICAgICBETyBpPTEsIERPVUJMRV9ESUdJVFMKKyAgICAgICAgICBkcHQ9IGRwdCAqIGR0CisgICAgICAgIEVORCBETworICAgICAgICBka25vd25fc3VtID0gKDEtZHB0KS8oMS1kdCkKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6ZHN1bSk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTAsNgorICAgICAgICAgICAgICBkc3VtID0gZHN1bSArIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTcsMTIKKyAgICAgICAgICAgICAgZHN1bSA9IGRzdW0gKyBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xMyxET1VCTEVfRElHSVRTLTEKKyAgICAgICAgICAgICAgZHN1bSA9IGRzdW0gKyBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworIAorICAgICAgICBJRiAoZHN1bSAuTkUuIGRrbm93bl9zdW0gLkFORC4gCisgICAgICYgICAgYWJzKGRzdW0gLSBka25vd25fc3VtKSAuR1QuIHJvdW5kaW5nX2Vycm9yICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBzdW0gd2l0aCBET3VibGVzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICBkc3VtLCJpbnN0ZWFkIG9mICIsZGtub3duX3N1bSwiKERJRmZlcmVuY2U6ICIsCisgICAgICYgICAgICBkc3VtIC0gZGtub3duX3N1bSwiKSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgZHB0ID0gMQorICAgICAgICBETyBpPTEsIERPVUJMRV9ESUdJVFMKKyAgICAgICAgICBkcHQgPSBkcHQqZHQKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgZGRJRmYgPSAoIDEtZHB0KS8oMS1kdCkKKyEkb21wIHBhcmFsbGVsCishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGRJRmYpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0wLCA2CisgICAgICAgICAgZGRJRmYgPSBkZElGZiAtIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTcsIDEyCisgICAgICAgICAgZGRJRmYgPSBkZElGZiAtIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEzLCBET1VCTEVfRElHSVRTLTEKKyAgICAgICAgICBkZElGZiA9IGRkSUZmIC0gZHQqKmkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKyEkb21wIEVORCBwYXJhbGxlbAorCisgICAgICAgIElGICggYWJzKGRkSUZmKSAuR1QuIHJvdW5kaW5nX2Vycm9yICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBESUZmZXJlbmNlIHdpdGggRE91YmxlczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgZGRJRmYsImluc3RlYWQgb2YgMC4wIgorICAgICAgICBFTkQgSUYKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCo6cHJvZHVjdCk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsMworICAgICAgICAgIHByb2R1Y3QgPSBwcm9kdWN0ICogaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT00LDYKKyAgICAgICAgICBwcm9kdWN0ID0gcHJvZHVjdCAqIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9NywxMAorICAgICAgICAgIHByb2R1Y3QgPSBwcm9kdWN0ICogaQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoa25vd25fcHJvZHVjdCAuTkUuIHByb2R1Y3QpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gUHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICBwcm9kdWN0LCIgaW5zdGVhZCBvZiIsa25vd25fcHJvZHVjdCAKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljcyhpKSA9IC5UUlVFLgorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5hbmQuOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsY3V0MQorICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0MixjdXQzCisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQ0LExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKC5OT1QuIGxvZ2ljX2FuZCkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIGxvZ2ljX2FuZCA9IC5UUlVFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLkZBTFNFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLmFuZC46bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSxjdXQxCisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLGN1dDMKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsTE9PUENPVU5UCisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAobG9naWNfYW5kKSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgQU5EIHBhc3MgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgIGxvZ2ljcyhpKSA9IC5GQUxTRS4KKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigub3IuOmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfb3IgPSBsb2dpY19vciAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAobG9naWNfb3IpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19vciA9IC5GQUxTRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLm9yLjpsb2dpY19vcik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsY3V0MQorICAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsY3V0MworICAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCAuTk9ULiBsb2dpY19vciApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGxvZ2ljIEVRViwgdW5pcXVlIGluIEZvcnRyYW4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgIGxvZ2ljcyhpKSA9IC5UUlVFLgorICAgICAgICBFTkQgRE8KKworICAgICAgICBsb2dpY19lcXYgPSAuVFJVRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5lcXYuOmxvZ2ljX2Vxdik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKC5OT1QuIGxvZ2ljX2VxdikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBFUVYgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19lcXYgPSAuVFJVRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5GQUxTRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5lcXYuOmxvZ2ljX2Vxdik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsY3V0MQorICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsY3V0MworICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLmVxdi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuZXF2LiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBsb2dpY19lcXYgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIEVRViBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCishLi4uIFRlc3QgbG9naWMgTkVRViwgd2hpY2ggaXMgdW5pcXVlIGluIEZvcnRyYW4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgIGxvZ2ljcyhpKSA9IC5mYWxzZS4KKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbG9naWNfbmVxdiA9IC5mYWxzZS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5uZXF2Ljpsb2dpY19uZXF2KTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgIGxvZ2ljX25lcXYgPSBsb2dpY19uZXF2IC5ORVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgIGxvZ2ljX25lcXYgPSBsb2dpY19uZXF2IC5ORVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAobG9naWNfbmVxdikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBORVFWIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgbG9naWNfbmVxdiA9IC5GQUxTRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLm5lcXYuOmxvZ2ljX25lcXYpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLGN1dDEKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLGN1dDMKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQ0LExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuTkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgRU5EIHNlY3Rpb25zCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIEVORCBwYXJhbGxlbAorCisgICAgICAgIElGICggLk5PVC4gbG9naWNfbmVxdiApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgd3JpdGUoMSwqKSAiRXJyb3IgaW4gbG9naWMgTkVRViBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgIGludF9hcnJheShpKSA9IDEKKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihpYW5kOmJpdF9hbmQpPC9vbXB0czpjaGVjaz4KKyEuLi4gaWFuZChJLEopOiBSZXR1cm5zIHZhbHVlIHJlc3VsdGluZyBmcm9tIGJvb2xlYW4gQU5EIG9mCishLi4uIHBhaXIgb2YgYml0cyBpbiBlYWNoIG9mIEkgYW5kIEouCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSwgY3V0MQorICAgICAgICAgYml0X2FuZCA9IGlhbmQoYml0X2FuZCxpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsIGN1dDMKKyAgICAgICAgIGJpdF9hbmQgPSBpYW5kKGJpdF9hbmQsaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgIGJpdF9hbmQgPSBpYW5kKGJpdF9hbmQsaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGJpdF9hbmQgLmx0LiAxICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICB3cml0ZSgxLCopICJFcnJvciBpbiBJQU5EIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgYml0X2FuZCA9IDEKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDAKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKGlhbmQ6Yml0X2FuZCk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsIGN1dDEKKyAgICAgICAgICBiaXRfYW5kID0gaWFuZCAoIGJpdF9hbmQsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsIGN1dDMKKyAgICAgICAgICBiaXRfYW5kID0gaWFuZCAoIGJpdF9hbmQsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGJpdF9hbmQgPSBpYW5kICggYml0X2FuZCwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYoIGJpdF9hbmQgLkdFLiAxKSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJQU5EIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAwCisgICAgICAgIEVORCBETworCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihpb3I6Yml0X29yKTwvb21wdHM6Y2hlY2s+CishLi4uIElvcihJLEopOiBSZXR1cm5zIHZhbHVlIHJlc3VsdGluZyBmcm9tIGJvb2xlYW4gT1Igb2YKKyEuLi4gcGFpciBvZiBiaXRzIGluIGVhY2ggb2YgSSBhbmQgSi4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLCBjdXQxCisgICAgICAgICAgYml0X29yID0gaW9yKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0MiwgY3V0MworICAgICAgICAgIGJpdF9vciA9IGlvcihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGJpdF9vciA9IGlvcihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgRU5EIHNlY3Rpb25zCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIEVORCBwYXJhbGxlbAorCisgICAgICAgIElGICggYml0X29yIC5HRS4gMSkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSW9yIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBiaXRfb3IgPSAwCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAxCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oaW9yOmJpdF9vcik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsIGN1dDEKKyAgICAgICAgICBiaXRfb3IgPSBJb3IoYml0X29yLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLCBjdXQzCisgICAgICAgICAgYml0X29yID0gSW9yKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgYml0X29yID0gSW9yKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBiaXRfb3IgLkxFLiAwKSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJb3IgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGludF9hcnJheShpKSA9IDAKKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihpZW9yOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gaWVvcihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBpZW9yKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gaWVvcihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBleGNsdXNpdl9iaXRfb3IgLkdFLiAxKSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSWVvciBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IDAKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDEKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKGllb3I6ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBpZW9yKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDIsIGN1dDMKKyAgICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IGllb3IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBpZW9yKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGV4Y2x1c2l2X2JpdF9vciAuTEUuIDApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSWVvciBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgaW50X2FycmF5KGkpID0gMTAgLSBpCisgICAgICAgIEVORCBETworCisgICAgICAgIG1pbl92YWx1ZSA9IDY1NTM1CisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihtaW46bWluX3ZhbHVlKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgICBtaW5fdmFsdWUgPSBtaW4obWluX3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgICAgbWluX3ZhbHVlID0gbWluKG1pbl92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgICAgbWluX3ZhbHVlID0gbWluKG1pbl92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIG1pbl92YWx1ZSAuR1QuICgxMC1MT09QQ09VTlQpICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBpbnRlZ2VyIE1JTiIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGludF9hcnJheShpKSA9IGkKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbWF4X3ZhbHVlID0gLTMyNzY4CisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihtYXg6bWF4X3ZhbHVlKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgICBtYXhfdmFsdWUgPSBtYXgobWF4X3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgICAgbWF4X3ZhbHVlID0gbWF4KG1heF92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgICAgbWF4X3ZhbHVlID0gbWF4KG1heF92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIG1heF92YWx1ZSAuTFQuIExPT1BDT1VOVCApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gaW50ZWdlciBNQVgiCisgICAgICAgIEVORCBJRgorCishLi4uIHRlc3QgRE91YmxlIG1pbiwgbWF4CisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgZF9hcnJheShpKSA9IDEwIC0gaSpkdAorICAgICAgICBFTkQgRE8KKworICAgICAgICBkbWluID0gMioqMTAKKyAgICAgICAgZHQgPSAwLjUKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKG1pbjpkbWluKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgICBkbWluPSBtaW4oZG1pbixkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgICBkbWluPSBtaW4oZG1pbixkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICAgIGRtaW49IG1pbihkbWluLGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGRtaW4gLkdULiAoMTAtZHQpICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBET3VibGUgTUlOIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgZF9hcnJheShpKSA9IGkgKiBkdAorICAgICAgICBFTkQgRE8KKworICAgICAgICBkbWF4PSAtICgyKioxMCkKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKG1heDpkbWF4KTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgICBkbWF4PSBtYXgoZG1heCxkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgICBkbWF4PSBtYXgoZG1heCxkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICAgIGRtYXg9IG1heChkbWF4LGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGRtYXggLkxULiBMT09QQ09VTlQqZHQgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIERPdWJsZSBNQVgiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIElGICggcmVzdWx0IC5FUS4gMCApIFRIRU4KKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9ICAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9ICAwCisgICAgICAgIEVORCBJRgorCisgICAgICAgIENMT1NFKDIpCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3NpbmdsZV9jb3B5cHJpdmF0ZS5mIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vc2luZ2xlX2NvcHlwcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg3OGE2NgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3NpbmdsZV9jb3B5cHJpdmF0ZS5mCkBAIC0wLDAgKzEsNDEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNpbmdsZSBjb3B5cHJpdmF0ZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBzaW5nbGUgY29weXByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFybGxlbCxvbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnNpbmdsZV9jb3B5cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIGksaix0aHJlYWQsbnJfaXRlcmF0aW9ucyxyZXN1bHQKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gbnJfaXRlcmF0aW9ucyxyZXN1bHQKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgcmVzdWx0PTAKKyAgICAgICAgbnJfaXRlcmF0aW9ucz0wCisKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUoaSxqLHRocmVhZCkKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgRE8gaT0wLExPT1BDT1VOVC0xCisgICAgICAgICAgdGhyZWFkPU9NUF9HRVRfVEhSRUFEX05VTSgpCishJG9tcCBzaW5nbGUgCisgICAgICAgICAgbnJfaXRlcmF0aW9ucz1ucl9pdGVyYXRpb25zKzEKKyAgICAgICAgICBqPWkKKyEkb21wIGVuZCBzaW5nbGUgPG9tcHRzOmNoZWNrPmNvcHlwcml2YXRlKGopPC9vbXB0czpjaGVjaz4KKyEkb21wIGNyaXRpY2FsCisgICAgICAgICAgcmVzdWx0PXJlc3VsdCtqLWk7CishJG9tcCBlbmQgY3JpdGljYWwKKyAgICAgICAgRU5EIERPCisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIElGKHJlc3VsdCAuRVEuIDAgLkFORC4gCisgICAgICYgICAgIG5yX2l0ZXJhdGlvbnMgLkVRLiBMT09QQ09VTlQpIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT49MAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3NpbmdsZV9ub3dhaXQuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3NpbmdsZV9ub3dhaXQuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTQ0YWY1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL2ZvcnRyYW4vc2luZ2xlX25vd2FpdC5mCkBAIC0wLDAgKzEsNTAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHNpbmdsZSBub3dhaXQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIGF0b21pYzwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+c2luZ2xlX25vd2FpdDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiByZXN1bHQsIHRvdGFsX2l0ZXJhdGlvbnMsIG15X2l0ZXJhdGlvbnMsaQorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgbnJfaXRlcmF0aW9ucworICAgICAgICBDT01NT04gL29ycGh2YXJzLyBucl9pdGVyYXRpb25zCis8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIHJlc3VsdD0wCisgICAgICAgIG5yX2l0ZXJhdGlvbnM9MAorICAgICAgICB0b3RhbF9pdGVyYXRpb25zPTAKKyAgICAgICAgbXlfaXRlcmF0aW9ucz0wCisKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUoaSkKKyAgICAgICAgRE8gaT0wLCBMT09QQ09VTlQgLTEKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKzxvbXB0czpjaGVjaz4hJG9tcCBzaW5nbGU8L29tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCisgICAgICAgICAgbnJfaXRlcmF0aW9ucyA9IG5yX2l0ZXJhdGlvbnMgKyAxCis8b21wdHM6Y2hlY2s+ISRvbXAgZW5kIHNpbmdsZSBub3dhaXQ8L29tcHRzOmNoZWNrPgorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUoaSxteV9pdGVyYXRpb25zKQorICAgICAgICBteV9pdGVyYXRpb25zID0gMAorICAgICAgICBETyBpPTAsIExPT1BDT1VOVCAtMQorPG9tcHRzOmNoZWNrPiEkb21wIHNpbmdsZTwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgbXlfaXRlcmF0aW9ucyA9IG15X2l0ZXJhdGlvbnMgKyAxCis8b21wdHM6Y2hlY2s+ISRvbXAgZW5kIHNpbmdsZSBub3dhaXQ8L29tcHRzOmNoZWNrPgorICAgICAgICBFTkQgRE8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHRvdGFsX2l0ZXJhdGlvbnMgPSB0b3RhbF9pdGVyYXRpb25zICsgbXlfaXRlcmF0aW9ucworISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAgSUYgKCBucl9pdGVyYXRpb25zIC5FUS4gTE9PUENPVU5UIC5BTkQuCisgICAgICYgICAgIHRvdGFsX2l0ZXJhdGlvbnMgLkVRLiBMT09QQ09VTlQgKSBUSEVOCisgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3NpbmdsZV9wcml2YXRlLmYgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9zaW5nbGVfcHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZDRhNmEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi9zaW5nbGVfcHJpdmF0ZS5mCkBAIC0wLDAgKzEsNTEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNpbmdsZSBwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHNpbmdlbCBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBmbHVzaCxvbXAgc2luZ2xlIG5vd2FpdDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5zaW5nbGVfcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBucl9pdGVyYXRpb25zLCBpCisJCTxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiByZXN1bHQKKyAgICAgICAgSU5URUdFUiBucl90aHJlYWRzX2luX3NpbmdsZSwgbXlyZXN1bHQsIG15aXQKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gcmVzdWx0LG5yX2l0ZXJhdGlvbnMKKwkJPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT0wCisgICAgICAgIHJlc3VsdD0wCisgICAgICAgIG15cmVzdWx0PTAKKyAgICAgICAgbXlpdD0wCisgICAgICAgIG5yX2l0ZXJhdGlvbnM9MAorISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShpLCBteXJlc3VsdCwgbXlpdCkKKzxvbXB0czpvcnBoYW4+CisgICAgICAgIG15cmVzdWx0ID0gMAorICAgICAgICBteWl0ID0gMAorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT0wCishJG9tcCBiYXJyaWVyCisgICAgICAgIERPIGk9MCwgTE9PUENPVU5UIC0xCishJG9tcCBzaW5nbGUgPG9tcHRzOmNoZWNrPnByaXZhdGUobnJfdGhyZWFkc19pbl9zaW5nbGUpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZSA9IDAKKyEkb21wIGZsdXNoCisgICAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUgPSBucl90aHJlYWRzX2luX3NpbmdsZSArIDEKKyEkb21wIGZsdXNoCisgICAgICAgICAgbXlpdCA9IG15aXQgKyAxCisgICAgICAgICAgbXlyZXN1bHQgPSBteXJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlCishJG9tcCBlbmQgc2luZ2xlIG5vd2FpdAorICAgICAgICBFTkQgRE8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlCisgICAgICAgIG5yX2l0ZXJhdGlvbnMgPSBucl9pdGVyYXRpb25zICsgbXlpdAorISRvbXAgZW5kIGNyaXRpY2FsCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBXUklURSgxLCopICJyZXN1bHQgaXMiLHJlc3VsdCwibnJfaXQgaXMiLG5yX2l0ZXJhdGlvbnMKKyAgICAgICAgSUYgKCByZXN1bHQgLkVRLiAwIC5BTkQuIG5yX2l0ZXJhdGlvbnMgLkVRLiBMT09QQ09VTlQpIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi90ZXN0bGlzdC1mLnR4dCBiL2ZpbmFsL3Rlc3RzdWl0ZS9mb3J0cmFuL3Rlc3RsaXN0LWYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNzY2ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvZm9ydHJhbi90ZXN0bGlzdC1mLnR4dApAQCAtMCwwICsxLDQ1IEBACitkb19maXJzdHByaXZhdGUuZgorZG9fbGFzdHByaXZhdGUKK2RvX29yZGVyZWQKK2RvX3ByaXZhdGUKK2RvX3JlZHVjdGlvbgorI2RvX3NjaGVkdWxlX2R5bmFtaWMKKyNkb19zY2hlZHVsZV9ndWlkZWQKKyNkb19zY2hlZHVsZV9zdGF0aWMKK2hhc19vcGVubXAKKyNvbXBfYXRvbWljCitvbXBfYmFycmllcgorb21wX2NvcHlpbgorb21wX2NyaXRpY2FsCisjb21wX2ZsdXNoCitvbXBfZ2V0X251bV90aHJlYWRzCitvbXBfaW5fcGFyYWxsZWwKK29tcF9sb2NrCitvbXBfbWFzdGVyCitvbXBfbmVzdF9sb2NrCitvbXBfbmVzdF90ZXN0bG9jaworb21wX25lc3RlZAorb21wX251bV90aHJlYWRzCitvbXBfdGVzdGxvY2sKK29tcF90ZXN0c3VpdGUKK29tcF90aHJlYWRwcml2YXRlCisjb21wX3RpY2tzX3RpbWUKKyNvbXBfd29ya3NoYXJlCisjb21wX3d0aW1lCisjcGFyX2RvZmlyc3Rwcml2YXRlCisjcGFyX2RvX2xhc3Rwcml2YXRlCisjcGFyX2RvX29yZGVyZWQKKyNwYXJfZG9fcHJpdmF0ZQorI3Bhcl9kb19yZWR1Y3Rpb24KKyNwYXJfc2VjdGlvbmlyc3Rwcml2YXRlLmYKKyNwYXJfc2VjdGlvbl9sYXN0cHJpdmF0ZQorI3Bhcl9zZWN0aW9uX3ByaXZhdGUKKyNwYXJfc2VjdGlvbl9yZWR1Y3Rpb24KKyNzZWN0aW9uaXJzdHByaXZhdGUuZgorI3NlY3Rpb25fbGFzdHByaXZhdGUKKyNzZWN0aW9uX3ByaXZhdGUKKyNzZWN0aW9uX3JlZHVjdGlvbgorI3NpbmdsZQorI3NpbmdsZV9jb3B5cHJpdmF0ZQorI3NpbmdsZV9ub3dhaXQKKyNzaW5nbGVfcHJpdmF0ZQpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL29tcF9teV9zbGVlcC5mIGIvZmluYWwvdGVzdHN1aXRlL29tcF9teV9zbGVlcC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzY2IwNGIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvb21wX215X3NsZWVwLmYKQEAgLTAsMCArMSwyNiBAQAorISBVdGlsaXR5IGZ1bmN0aW9ucyB0byBoYXZlIGEgc2xlZXAgZnVuY3Rpb24gd2l0aCBiZXR0ZXIgcmVzb2x1dGlvbiBhbmQKKyEgd2hpY2ggb25seSBzdG9wcyBvbmUgdGhyZWFkLgorCisgICAgICBzdWJyb3V0aW5lIG15X3NsZWVwKHNsZWVwdGltZSkKKyAgICAgICAgaW1wbGljaXQgbm9uZQorICAgICAgICBkb3VibGUgcHJlY2lzaW9uIDo6IHNsZWVwdGltZQorICAgICAgICBpbnRlZ2VyIDo6IHUKKyAgICAgICAgaW50ZWdlciA6OiB0KDgpCisgICAgICAgIGludGVnZXIgOjogbXMxLCBtczIKKyAgICAgICAgaW50ZWdlciA6OiBjbnQKKworICAgICAgICB1ID0gc2xlZXB0aW1lICogMTAwMAorCisgICAgICAgIGNhbGwgZGF0ZV9hbmRfdGltZSh2YWx1ZXM9dCkKKworICAgICAgICAhIGNhbGN1bGF0ZSBzdGFydCB0aW1lIGluIG1zCisgICAgICAgIG1zMSA9IHQoOCkgKyB0KDcpKjEwMDAgKyB0KDYpKjYwMDAwICsgdCg1KSozNjAwMDAwCisKKyAgICAgICAgbXMyID0gbXMxCisgICAgICAgIGNudCA9IDAKKyAgICAgICAgZG8gd2hpbGUgKCAobXMyIC0gbXMxKSA8IHUpCisgICAgICAgICAgICBjYWxsIGRhdGVfYW5kX3RpbWUodmFsdWVzPXQpCisgICAgICAgICAgICBtczIgPSB0KDgpICsgdCg3KSoxMDAwICsgdCg2KSo2MDAwMCArIHQoNSkqMzYwMDAwMAorICAgICAgICAgICAgY250ID0gY250KzEKKyAgICAgICAgZW5kIGRvCisgICAgICBlbmQgc3Vicm91dGluZQpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL29tcF9teV9zbGVlcC5oIGIvZmluYWwvdGVzdHN1aXRlL29tcF9teV9zbGVlcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOTBhNWIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvb21wX215X3NsZWVwLmgKQEAgLTAsMCArMSwzNSBAQAorI2lmbmRlZiBNWV9TTEVFUF9ICisjZGVmaW5lIE1ZX1NMRUVQX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZTxzdGRsaWIuaD4KKyNpbmNsdWRlPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8c3lzL3RpbWVzLmg+IAorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKy8qISBVdGlsaXR5IGZ1bmN0aW9uIHRvIGhhdmUgYSBzbGVlcCBmdW5jdGlvbiB3aXRoIGJldHRlciByZXNvbHV0aW9uIGFuZCB3aGljaCBvbmx5IHN0b3BzIG9uZSB0aHJlYWQuICovCisKK3N0YXRpYyB2b2lkIG15X3NsZWVwKGRvdWJsZSBzbGVlcHRpbWUpeworICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgc3RydWN0IHRpbWV6b25lIHR6cDsKKyAgZG91YmxlIHN0YXJ0OworICBkb3VibGUgcmVhbDsKKyAgaWYoZ2V0dGltZW9mZGF5KCZ0diwmdHpwKSE9MCkgeworICAgIHBlcnJvcigiZ2V0X3RpbWU6ICIpOworICAgIGV4aXQoLTEpOworICB9CisgIHN0YXJ0ID0gKGRvdWJsZSl0di50dl9zZWMgKyAoKGRvdWJsZSl0di50dl91c2VjLzEwMDAwMDAuMCk7CisgIHJlYWw9c3RhcnQ7CisgIHdoaWxlKCAocmVhbC1zdGFydCk8c2xlZXB0aW1lKXsKKyAgICBpZihnZXR0aW1lb2ZkYXkoJnR2LCZ0enApIT0wKSB7CisgICAgICBwZXJyb3IoImdldF90aW1lOiAiKTsKKyAgICAgIGV4aXQoLTEpOworICAgIH0KKyAgICByZWFsID0gKGRvdWJsZSl0di50dl9zZWMgKyAoKGRvdWJsZSl0di50dl91c2VjLzEwMDAwMDAuMCk7CisgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvb21wX3Rlc3RzdWl0ZS5mIGIvZmluYWwvdGVzdHN1aXRlL29tcF90ZXN0c3VpdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTM1MzEzCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL29tcF90ZXN0c3VpdGUuZgpAQCAtMCwwICsxLDE0IEBACisgICAgICBJTlRFR0VSIE4gIVRoZSBudW1iZXIgb2YgdGltZXMgZWFjaCB0ZXN0IGlzIHJ1bgorICAgICAgUEFSQU1FVEVSIChOPTEpCisgICAgICBDSEFSQUNURVIqOCBPTVBUU19WRVJTSU9OCisgICAgICBQQVJBTUVURVIgKE9NUFRTX1ZFUlNJT049IjMuMC5hIikKKyAgICAgIElOVEVHRVIgTE9PUENPVU5UICFUaGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggbG9vcCBpcyBydW4KKyAgICAgIFBBUkFNRVRFUiAoTE9PUENPVU5UPTEwMDApCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIFNMRUVQVElNRQorICAgICAgUEFSQU1FVEVSIChTTEVFUFRJTUUgPSAuMDEpCisgICAgICBET1VCTEUgUFJFQ0lTSU9OIFNMRUVQVElNRV9MT05HCisgICAgICBQQVJBTUVURVIgKFNMRUVQVElNRV9MT05HID0gMC41KQorICAgICAgSU5URUdFUiBOVU1fVEFTS1MKKyAgICAgIFBBUkFNRVRFUiAoTlVNX1RBU0tTPTI1KQorICAgICAgSU5URUdFUiBNQVhfVEFTS1NfUEVSX1RIUkVBRAorICAgICAgUEFSQU1FVEVSIChNQVhfVEFTS1NfUEVSX1RIUkVBRD01KQpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL29tcF90ZXN0c3VpdGUuaCBiL2ZpbmFsL3Rlc3RzdWl0ZS9vbXBfdGVzdHN1aXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgwOGQ5MgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9vbXBfdGVzdHN1aXRlLmgKQEAgLTAsMCArMSwxNjQgQEAKKy8qIEdsb2JhbCBoZWFkZXJmaWxlIG9mIHRoZSBPcGVuTVAgVGVzdHN1aXRlICovCisKKy8qIFRoaXMgZmlsZSB3YXMgY3JlYXRlZCB3aXRoIHRoZSBvbXB0c19tYWtlSGVhZGVyLnBsIHNjcmlwdCB1c2luZyB0aGUgZm9sbG93aW5nIG9waW9uczogKi8KKy8qIC1mPW9tcHRzLWMuY29uZiAtdD1jICAqLworCisKKyNpZm5kZWYgT01QX1RFU1RTVUlURV9ICisjZGVmaW5lIE9NUF9URVNUU1VJVEVfSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvbXAuaD4KKworLyogVmVyc2lvbiBpbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgT01QVFNfVkVSU0lPTiAiMy4wYSIKKworLyogR2VuZXJhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTE9PUENPVU5UIAkxMDAwCisjZGVmaW5lIFJFUEVUSVRJT05TIAkgIDIwCisvKiBmb2xsb3dpbmcgdGltZXMgYXJlIGluIHNlY29uZHMgKi8KKyNkZWZpbmUgU0xFRVBUSU1FCSAwLjAxCisjZGVmaW5lIFNMRUVQVElNRV9MT05HCSAwLjUKKworLyogRGVmaW5pdGlvbnMgZm9yIHRhc2tzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTlVNX1RBU0tTICAgICAgICAgICAgICAyNQorI2RlZmluZSBNQVhfVEFTS1NfUEVSX1RIUkVBRCAgICA1CitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIGZvciBvcmRlcmVkICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9mb3Jfb3JkZXJlZChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3Igb3JkZXJlZCAqLworaW50IHRlc3Rfb21wX3Rhc2tfaW1wX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgdGFzayAqLworaW50IGNyb3NzdGVzdF9vbXBfdGFza19pbXBfZmlyc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRhc2sgKi8KK2ludCB0ZXN0X29tcF90YXNrd2FpdChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgdGFza3dhaXQgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rhc2t3YWl0KEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRhc2t3YWl0ICovCitpbnQgdGVzdF9vbXBfYmFycmllcihGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgYmFycmllciAqLworaW50IGNyb3NzdGVzdF9vbXBfYmFycmllcihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBiYXJyaWVyICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZm9yX2lmKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3IgaWYgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2Zvcl9pZihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3IgaWYgKi8KK2ludCB0ZXN0X29tcF9hdG9taWMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGF0b21pYyAqLworaW50IGNyb3NzdGVzdF9vbXBfYXRvbWljKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGF0b21pYyAqLworaW50IHRlc3Rfb21wX2dldF9udW1fdGhyZWFkcyhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXBfZ2V0X251bV90aHJlYWRzICovCitpbnQgY3Jvc3N0ZXN0X29tcF9nZXRfbnVtX3RocmVhZHMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXBfZ2V0X251bV90aHJlYWRzICovCitpbnQgdGVzdF9vbXBfc2VjdGlvbl9wcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBzZWN0aW9uIHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3NlY3Rpb25fcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBzZWN0aW9uIHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9pZihGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgaWYgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2lmKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIGlmICovCitpbnQgdGVzdF9vbXBfbG9jayhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXBfbG9jayAqLworaW50IGNyb3NzdGVzdF9vbXBfbG9jayhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcF9sb2NrICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfc2hhcmVkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBzaGFyZWQgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX3NoYXJlZChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBzaGFyZWQgKi8KK2ludCB0ZXN0X29tcF90YXNrX2ltcF9zaGFyZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2sgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rhc2tfaW1wX3NoYXJlZChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0YXNrICovCitpbnQgdGVzdF9vbXBfdGFza19wcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCB0YXNrIHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rhc2tfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0YXNrIHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9zZWN0aW9uX2xhc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBzZWN0aW9uIGxhc3Rwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9zZWN0aW9uX2xhc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHNlY3Rpb24gbGFzdHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfZmlyc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX2Zvcl9hdXRvKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3IgYXV0byAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX2F1dG8oRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIGF1dG8gKi8KK2ludCB0ZXN0X29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3Igc2NoZWR1bGUoc3RhdGljKSAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpYyhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBmb3Igc2NoZWR1bGUoc3RhdGljKSAqLworaW50IHRlc3Rfb21wX3RocmVhZHByaXZhdGVfZm9yKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCB0aHJlYWRwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF90aHJlYWRwcml2YXRlX2ZvcihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0aHJlYWRwcml2YXRlICovCitpbnQgdGVzdF9vbXBfdGFza191bnRpZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2sgdW50aWVkICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrX3VudGllZChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0YXNrIHVudGllZCAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgcHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX3NpbmdsZV9ub3dhaXQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHNpbmdsZSBub3dhaXQgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3NpbmdsZV9ub3dhaXQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgc2luZ2xlIG5vd2FpdCAqLworaW50IHRlc3Rfb21wX2NyaXRpY2FsKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBjcml0aWNhbCAqLworaW50IGNyb3NzdGVzdF9vbXBfY3JpdGljYWwoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgY3JpdGljYWwgKi8KK2ludCB0ZXN0X29tcF9nZXRfd3RpY2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wX2dldF93dGljayAqLworaW50IGNyb3NzdGVzdF9vbXBfZ2V0X3d0aWNrKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wX2dldF93dGljayAqLworaW50IHRlc3Rfb21wX3NpbmdsZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgc2luZ2xlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9zaW5nbGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgc2luZ2xlICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcmVkdWN0aW9uKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyByZWR1Y3Rpb24gKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX3JlZHVjdGlvbihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyByZWR1Y3Rpb24gKi8KK2ludCB0ZXN0X29tcF90YXNreWllbGQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2t5aWVsZCAqLworaW50IGNyb3NzdGVzdF9vbXBfdGFza3lpZWxkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRhc2t5aWVsZCAqLworaW50IHRlc3RfaGFzX29wZW5tcChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBfT1BFTk1QICovCitpbnQgY3Jvc3N0ZXN0X2hhc19vcGVubXAoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBfT1BFTk1QICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3IgbGFzdHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2Zvcl9sYXN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3IgbGFzdHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19sYXN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgbGFzdHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIHNlY3Rpb25zIGxhc3Rwcml2YXRlICovCitpbnQgdGVzdF9vbXBfZm9yX2xhc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3IgbGFzdHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9sYXN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBmb3IgbGFzdHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIHNlY3Rpb25zIGZpcnN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfZmlyc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIHNlY3Rpb25zIGZpcnN0cHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24gKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbiAqLworaW50IHRlc3Rfb21wX3Rlc3RfbG9jayhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXBfdGVzdF9sb2NrICovCitpbnQgY3Jvc3N0ZXN0X29tcF90ZXN0X2xvY2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXBfdGVzdF9sb2NrICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZm9yX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIGZpcnN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfZm9yX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3IgZmlyc3Rwcml2YXRlICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfbnVtX3RocmVhZHMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmVsbGVsIG51bV90aHJlYWRzICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9udW1fdGhyZWFkcyhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJlbGxlbCBudW1fdGhyZWFkcyAqLworaW50IHRlc3Rfb21wX2Zvcl9yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciByZWR1Y3Rpb24gKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIHJlZHVjdGlvbiAqLworaW50IHRlc3Rfb21wX3NlY3Rpb25zX25vd2FpdChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgbm93YWl0ICovCitpbnQgY3Jvc3N0ZXN0X29tcF9zZWN0aW9uc19ub3dhaXQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgbm93YWl0ICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfcmVkdWN0aW9uKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCByZWR1Y3Rpb24gKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX3JlZHVjdGlvbihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCByZWR1Y3Rpb24gKi8KK2ludCB0ZXN0X29tcF9uZXN0ZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wX25lc3RlZCAqLworaW50IGNyb3NzdGVzdF9vbXBfbmVzdGVkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wX25lc3RlZCAqLworaW50IHRlc3Rfb21wX3RocmVhZHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRocmVhZHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3RocmVhZHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgdGhyZWFkcHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX3NlY3Rpb25zX3JlZHVjdGlvbihGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgc2VjdGlvbnMgcmVkdWN0aW9uICovCitpbnQgY3Jvc3N0ZXN0X29tcF9zZWN0aW9uc19yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgc2VjdGlvbnMgcmVkdWN0aW9uICovCitpbnQgdGVzdF9vbXBfZm9yX3NjaGVkdWxlX2d1aWRlZChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgZm9yIHNjaGVkdWxlKGd1aWRlZCkgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9zY2hlZHVsZV9ndWlkZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIHNjaGVkdWxlKGd1aWRlZCkgKi8KK2ludCB0ZXN0X29tcF90YXNrX2ZpbmFsKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCB0YXNrIGZpbmFsICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrX2ZpbmFsKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRhc2sgZmluYWwgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2Zvcl9wcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIGZvciBwcml2YXRlICovCitpbnQgdGVzdF9vbXBfZmx1c2goRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZsdXNoICovCitpbnQgY3Jvc3N0ZXN0X29tcF9mbHVzaChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBmbHVzaCAqLworaW50IHRlc3Rfb21wX2Zvcl9wcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3IgcHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9mb3Jfb3JkZXJlZChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgZm9yIG9yZGVyZWQgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9vcmRlcmVkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGZvciBvcmRlcmVkICovCitpbnQgdGVzdF9vbXBfc2luZ2xlX2NvcHlwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBzaW5nbGUgY29weXByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3NpbmdsZV9jb3B5cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBzaW5nbGUgY29weXByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF90YXNrX2lmKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCB0YXNrIGlmICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrX2lmKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRhc2sgaWYgKi8KK2ludCB0ZXN0X29tcF9zZWN0aW9uX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgZmlyc3Rwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9zZWN0aW9uX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBmaXJzdHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljXzMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciBzY2hlZHVsZShzdGF0aWMpICovCitpbnQgY3Jvc3N0ZXN0X29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljXzMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIHNjaGVkdWxlKHN0YXRpYykgKi8KK2ludCB0ZXN0X29tcF90YXNrX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgdGFzayBmaXJzdHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rhc2tfZmlyc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRhc2sgZmlyc3Rwcml2YXRlICovCitpbnQgdGVzdF9vbXBfZm9yX2NvbGxhcHNlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3IgY29sbGFwc2UgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9jb2xsYXBzZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBmb3IgY29sbGFwc2UgKi8KK2ludCB0ZXN0X29tcF9pbl9wYXJhbGxlbChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXBfaW5fcGFyYWxsZWwgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2luX3BhcmFsbGVsKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wX2luX3BhcmFsbGVsICovCitpbnQgdGVzdF9vbXBfZm9yX3NjaGVkdWxlX2R5bmFtaWMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciBzY2hlZHVsZShkeW5hbWljKSAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX3NjaGVkdWxlX2R5bmFtaWMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMpICovCitpbnQgdGVzdF9vbXBfZm9yX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgZm9yIGZpcnN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBmb3IgZmlyc3Rwcml2YXRlICovCitpbnQgdGVzdF9vbXBfbWFzdGVyKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBtYXN0ZXIgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX21hc3RlcihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBtYXN0ZXIgKi8KK2ludCB0ZXN0X29tcF9zaW5nbGVfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgc2luZ2VsIHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3NpbmdsZV9wcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHNpbmdlbCBwcml2YXRlICovCitpbnQgdGVzdF9vbXBfdGFzayhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgdGFzayAqLworaW50IGNyb3NzdGVzdF9vbXBfdGFzayhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0YXNrICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZGVmYXVsdChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgZGVmYXVsdCAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfZGVmYXVsdChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBkZWZhdWx0ICovCitpbnQgdGVzdF9vbXBfZm9yX25vd2FpdChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIG5vd2FpdCAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX25vd2FpdChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3Igbm93YWl0ICovCitpbnQgdGVzdF9vbXBfdGVzdF9uZXN0X2xvY2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wX3Rlc3RfbmVzdF9sb2NrICovCitpbnQgY3Jvc3N0ZXN0X29tcF90ZXN0X25lc3RfbG9jayhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcF90ZXN0X25lc3RfbG9jayAqLworaW50IHRlc3Rfb21wX25lc3RfbG9jayhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXBfbmVzdF9sb2NrICovCitpbnQgY3Jvc3N0ZXN0X29tcF9uZXN0X2xvY2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXBfbmVzdF9sb2NrICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfY29weWluKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBjb3B5aW4gKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2NvcHlpbihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBjb3B5aW4gKi8KK2ludCB0ZXN0X29tcF9tYXN0ZXJfMyhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgbWFzdGVyICovCitpbnQgY3Jvc3N0ZXN0X29tcF9tYXN0ZXJfMyhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBtYXN0ZXIgKi8KK2ludCB0ZXN0X29tcF9nZXRfd3RpbWUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wX2dldF93dGltZSAqLworaW50IGNyb3NzdGVzdF9vbXBfZ2V0X3d0aW1lKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wX2dldF93dGltZSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9vbXB0cy1jLmNvbmYgYi9maW5hbC90ZXN0c3VpdGUvb21wdHMtYy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMGI5NTAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvb21wdHMtYy5jb25mCkBAIC0wLDAgKzEsMTkgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9tcC5oPgorCisvKiBWZXJzaW9uIGluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBPTVBUU19WRVJTSU9OICIzLjBhIgorCisvKiBHZW5lcmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBMT09QQ09VTlQgCTEwMDAKKyNkZWZpbmUgUkVQRVRJVElPTlMgCSAgMjAKKy8qIGZvbGxvd2luZyB0aW1lcyBhcmUgaW4gc2Vjb25kcyAqLworI2RlZmluZSBTTEVFUFRJTUUJIDAuMDEKKyNkZWZpbmUgU0xFRVBUSU1FX0xPTkcJIDAuNQorCisvKiBEZWZpbml0aW9ucyBmb3IgdGFza3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBOVU1fVEFTS1MgICAgICAgICAgICAgIDI1CisjZGVmaW5lIE1BWF9UQVNLU19QRVJfVEhSRUFEICAgIDUKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9vbXB0cy1mLmNvbmYgYi9maW5hbC90ZXN0c3VpdGUvb21wdHMtZi5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNWFmMzAKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvb21wdHMtZi5jb25mCkBAIC0wLDAgKzEgQEAKKyFFbXB0eSBjb25maWcgZmlsZQpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL29tcHRzLmNvbmYgYi9maW5hbC90ZXN0c3VpdGUvb21wdHMuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMzEzNWI1Ci0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL29tcHRzLmNvbmYKQEAgLTAsMCArMSwyNiBAQAorPGNvbmZpZz4KKzxnbG9iYWxjb25maWc+Cis8bG9nZmlsZT5vbXB0cy5sb2c8L2xvZ2ZpbGU+Cis8c2luZ2xldGVzdHRpbWVvdXQ+MTIwPC9zaW5nbGV0ZXN0dGltZW91dD4KKzxkaXNwbGF5ZXJyb3JzPjE8L2Rpc3BsYXllcnJvcnM+Cis8ZGlzcGxheXdhcm5pbmdzPjA8L2Rpc3BsYXl3YXJuaW5ncz4KKzxlbnZzZXR0aHJlYWRzY29tbWFuZD5PTVBfTlVNX1RIUkVBRFM9JW47IGV4cG9ydCBPTVBfTlVNX1RIUkVBRFM7PC9lbnZzZXR0aHJlYWRzY29tbWFuZD4KKzxyZXN1bHRzZmlsZT5yZXN1bHRzLnR4dDwvcmVzdWx0c2ZpbGU+Cis8bnVtdGhyZWFkcz44PC9udW10aHJlYWRzPgorPC9nbG9iYWxjb25maWc+CisKKzxsYW5ndWFnZXM+Cis8bGFuZ3VhZ2U+Cis8bGFuZ3VhZ2VuYW1lPmM8L2xhbmd1YWdlbmFtZT4KKzxkaXI+YzwvZGlyPgorPGZpbGVleHRlbnNpb24+YzwvZmlsZWV4dGVuc2lvbj4KKzx0ZW1wbGF0ZXBhcnNlcm5hbWU+dGVtcGxhdGVfcGFyc2VyX2MucGw8L3RlbXBsYXRlcGFyc2VybmFtZT4KKzwvbGFuZ3VhZ2U+Cis8bGFuZ3VhZ2U+Cis8bGFuZ3VhZ2VuYW1lPmZvcnRyYW48L2xhbmd1YWdlbmFtZT4KKzxkaXI+Zm9ydHJhbjwvZGlyPgorPGZpbGVleHRlbnNpb24+ZjwvZmlsZWV4dGVuc2lvbj4KKzx0ZW1wbGF0ZXBhcnNlcm5hbWU+dGVtcGxhdGVfcGFyc2VyX2ZvcnRyYW4ucGw8L3RlbXBsYXRlcGFyc2VybmFtZT4KKzwvbGFuZ3VhZ2U+Cis8L2xhbmd1YWdlcz4KKzwvY29uZmlnPgpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL29tcHRzX21ha2VIZWFkZXIucGwgYi9maW5hbC90ZXN0c3VpdGUvb21wdHNfbWFrZUhlYWRlci5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MjEyY2VjCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL29tcHRzX21ha2VIZWFkZXIucGwKQEAgLTAsMCArMSwxMDEgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworCisjIG9tcHRzX21ha2VIZWFkZXIgW29wdGlvbnNdIC1mPU5BTUUgLXQ9RElSCisjCisjIENyZWF0cyB0aGUgaGVhZGVyZmlsZSBmb3IgdGhlIE9wZW5NUC1UZXN0c3VpdGUgb3V0IG9mIHRoZSB0ZW1wbGF0ZWZpbGVzIAorIyB3aXRjaCBhcmUgaW4gdGhlIGRlZmF1bHQvZXhwbGljaXRlbHkgc3BlY2lmaWVkIGRpciBhbmQgdGhlIHNldHRpbmdzIGluIHRoZQorIyBnaXZlbiBjb25maWcgZmlsZS4gCisjIAorIyBBVFRFTlRJT046CisjCUF0IHRoZSBtb21lbnQgaXQgYnVpbHRzIG9ubHkgYSBjLWhlYWRlcmZpbGUhCisjCisjIC1mPUZJTEVOQU1FOiBVc2luZyBmaWxlIEZJTEVOQU1FIGFzIGNvbmZpZ2ZpbGUKKyMgLXQ9RElSOglEaXJlY3RvcnkgaG9sZGluZyB0aGUgdGVtcGxhdGUgZmlsZXMKKyMgCisjIG9wdGlvbnMKKyMgLWk9RklMRU5BTUU6IEluY2x1ZGUgb3RoZXIgSGVhZGVyZmlsZS4gVGhlIGZpbGVzIHRvIGJlIGluY2x1ZGVkIG11c3QgYmUgc3BlY2lmaWVkCisjIAlhZnRlciBzZXR0aW5nIHRoaXMgb3B0aW9uLiAoTm90IGltcGxlbWVudGVkIHlldC4pCisjIC1vPUZJTEVOQU1FOiBvdXRwdXRmaWxlbmFtZSAoZGVmYXVsdCBpcyAib21wX3Rlc3RzdWl0ZS5oIikKKworJGhlYWRlcmZpbGUgPSAiXC9cKiBHbG9iYWwgaGVhZGVyZmlsZSBvZiB0aGUgT3Blbk1QIFRlc3RzdWl0ZSBcKlwvXG5cblwvXCogVGhpcyBmaWxlIHdhcyBjcmVhdGVkIHdpdGggdGhlIG9tcHRzX21ha2VIZWFkZXIucGwgc2NyaXB0IHVzaW5nIHRoZSBmb2xsb3dpbmcgb3Bpb25zOlwgKlwvXG5cL1wqICI7CitpZihAQVJHViA+IDApCit7CisJZm9yZWFjaCAkb3B0IChAQVJHVikKKwl7CisJCSRoZWFkZXJmaWxlIC49ICIkb3B0ICI7CisJfQorfQorZWxzZQoreworCSRoZWFkZXJmaWxlIC49ICJObyBvcHRpb25zIHdlcmUgc3BlY2lmaWVkIjsKK30KKyRoZWFkZXJmaWxlIC49IiBcKlwvXG5cblxuIjsKKwordXNlIEdldG9wdDo6TG9uZzsKK0dldE9wdGlvbnMoIi1vPXMiID0+IFwkb3V0ZmlsZSwgIi1mPXMiID0+XCRjb25maWdmaWxlLCAiLXQ9cyIgPT4gXCR0ZW1wbGF0ZWRpciwgIi1pPXMiID0+IFwkaW5jbHVkZSk7CisKKyRpbmNsdWRlID0gIiI7CisKKworIyBHZXR0aW5nIGFuZCB2ZXJpZnlpbmcgdGhlIG5lY2Vzc2FyeSBvcHRpb25zOgoraWYoISRjb25maWdmaWxlKSB7CQorCWRpZSAiQ29uZmlnIGZpbGUgbmFtZSBpcyBtaXNzaW5nLiI7Cit9CQorZWxzZSB7CisgICAgaWYgKCEoLWUgJGNvbmZpZ2ZpbGUpKSB7CisJICBkaWUgIkNvdWxkIG5vdCBmaW5kIGNvbmZpZyBmaWxlICRjb25maWdmaWxlLiI7CisJfQorfQorCQoraWYoISR0ZW1wbGF0ZWRpcikgewkKKwlkaWUgIkRpcmVjdG9yeW5hbWUgaXMgbWlzc2luZy4iOworfQkKKworaWYoISRvdXRmaWxlKXsKKwkkb3V0ZmlsZSA9ICJvbXBfdGVzdHN1aXRlLmgiOwkjIHNldHRpbmcgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGhlYWRlcmZpbGUKK30KKworCisKKyNAaW5jbHVkZWZpbGVzOwkJCQkJIyBsaXN0IGhvbGluZyBleHRyYSBpbmNsdWRlZmlsZXMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIAorCisKKyMgZ2VuZXJhdGluZyB0aGUgaGVhZCBvZiB0aGUgaW5jbHVkZWd1YXJkOgorJGhlYWRlcmZpbGUgLj0gIlwjaWZuZGVmIE9NUF9URVNUU1VJVEVfSFxuXCNkZWZpbmUgT01QX1RFU1RTVUlURV9IXG5cbiI7CisKKyMgaW5zZXJ0aW5nIGdlbmVyYWwgc2V0dGluZ3Mgb3V0IG9mIHRoZSBjb25maWdmaWxlOgorb3BlbihPTVBUU19DT05GLCRjb25maWdmaWxlKSBvciBkaWUgIkNvdWxkIG5vdCBvcGVuIHRoZSBnbG9iYWwgY29uZmlnIGZpbGUgJGNvbmZpZ2ZpbGUuIjsKK3doaWxlKDxPTVBUU19DT05GPil7CisJJGhlYWRlcmZpbGUgLj0gJF87Cit9CitjbG9zZShPTVBUU19DT05GKTsKKworIyBzZWFyY2hpbmcgdGhlIHRlc3RzOgorb3BlbmRpciBURU1QTEFURURJUiwgJHRlbXBsYXRlZGlyIG9yIGRpZSAiQ291bGQgbm90IG9wZW4gZGlyICR0ZW1wbGF0ZWRpci4iOworQHRlbXBsYXRlcyA9IGdyZXAgLyguKilcLmMvLCByZWFkZGlyIFRFTVBMQVRFRElSOworY2xvc2VkaXIgVEVNUExBVEVESVI7CisKKyMgaW5zZXJ0aW5nIHRoZSBmdW5jdGlvbiBkZWNsYXJhdGlvbnM6Citmb3JlYWNoICR0ZW1wbGF0ZSAoQHRlbXBsYXRlcyl7CisJJHNvdXJjZSA9ICIiOworCW9wZW4oVEVNUExBVEUsJHRlbXBsYXRlZGlyLiIvIi4kdGVtcGxhdGUpIG9yIGRpZSAiQ291bGQgbm90IG9wZW4gdGhlIGZvbGxvd2luZyBzb3VyY2VmaWxlOiAiLiR0ZW1wbGF0ZWRpci4iLyIuJHRlbXBsYXRlOworCXdoaWxlKDxURU1QTEFURT4peworCQkkc291cmNlIC49ICRfOworCX0KKwljbG9zZShURU1QTEFURSk7CisJJHNvdXJjZSA9fiAvXDxvbXB0c1w6dGVzdGNvZGVcOmZ1bmN0aW9ubmFtZVw+KC4qKVw8XC9vbXB0c1w6dGVzdGNvZGVcOmZ1bmN0aW9ubmFtZVw+LzsKKwkkZnVuY3Rpb25uYW1lID0gJDEuIihGSUxFIFwqIGxvZ2ZpbGUpOyI7CisJJHNvdXJjZSA9fiAvXDxvbXB0c1w6ZGlyZWN0aXZlXD4oLiopXDxcL29tcHRzXDpkaXJlY3RpdmVcPi87CisJJGRpcmVjdGl2ZSA9ICQxOworCSRoZWFkZXJmaWxlIC49ICJpbnQgdGVzdF8iLiRmdW5jdGlvbm5hbWUuIiAgLyogVGVzdCBmb3IgIi4kZGlyZWN0aXZlLiIgKi9cbiI7CisJJGhlYWRlcmZpbGUgLj0gImludCBjcm9zc3Rlc3RfIi4kZnVuY3Rpb25uYW1lLiIgIC8qIENyb3NzdGVzdCBmb3IgIi4kZGlyZWN0aXZlLiIgKi9cbiI7Cit9CisKKyMgaW5zZXJ0aW5nIHRoZSBlbmQgb2YgdGhlIGluY2x1ZGVndWFyZDoKKyRoZWFkZXJmaWxlIC49ICJcbiNlbmRpZiI7CisKKyMgY3JhZXRpbmcgdGhlIGhlYWRlcmZpbGU6CitvcGVuKE9VVEZJTEUsIj4iLiRvdXRmaWxlKSBvciBkaWUgIkNvdWxkIG5vdCBjcmVhdGUgdGhlIGhhZWRhZXJmaWxlICgkb3V0ZmlsZSkiOworcHJpbnQgT1VURklMRSAkaGVhZGVyZmlsZS4iXG4iOworY2xvc2UoT1VURklMRSk7CisKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9vbXB0c19wYXJzZXIucGwgYi9maW5hbC90ZXN0c3VpdGUvb21wdHNfcGFyc2VyLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk4ZDcyNzEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvb21wdHNfcGFyc2VyLnBsCkBAIC0wLDAgKzEsMTY3IEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMgb21wdHNfcGFyc2VyIFtvcHRpb25dIFNPVVJDRUZJTEUKKyMgCisjIENyZWF0cyB0aGUgdGVzdHMgYW5kIHRoZSBjcm9zc3Rlc3RzIGZvciB0aGUgT3Blbk1QLVRlc3RzdWl0ZSBvdXQgb2YgYW4gdGVtcGxhdGVmaWxlcyB3aGljaCBhcmUgZ2l2ZW4gdG8gdGhlIHByb2dyYW1tLgorIyAKKyMgT3B0aW9uczoKKyMgLXRlc3Q6IAltYWtlIHRlc3QKKyMgLWNyb3NzdGVzdDogCW1ha2UgY3Jvc3N0ZXN0CisjIC1vcnBoYW4JaWYgcG9zc2libGUgZ2VuZXJhdGUgdGVzdHMgdXNpbmcgb3JwaGFuIHJlZ2lvbnMgKG5vdCBpbXBsZW1lbnRlZCB5ZXQpCisjIC1sYW5nPUxBTkcJcHJlcHJvY2Vzc2luZyBmb3IgbGFuZ3VhZ2UgTEFORywgd2hlcmUgTEFORyBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBsYW5ndWFnZXM6CisjCQljLCBmb3J0cmFuCisjIC1vPUZJTEVOQU1FCW91dHB1dGZpbGUgKG9ubHkgd2hlbiBvbmUgdGVtcGxhdGVmaWxlIGlzIHNwZWNpZmllZCkKKworCisjIFVzaW5nIEdldG9wdDo6bG9uZyB0byBleHRyYWN0IHRoZSBwcm9ncmFtbSBvcHRpb25zCit1c2UgR2V0b3B0OjpMb25nOworIyBVc2luZyBmdW5jdGlvbnM6IFNldCBvZiBzdWJyb3V0aW5lcyB0byBtb2RpZnkgdGhlIHRlc3Rjb2RlCit1c2Ugb21wdHNfcGFyc2VyRnVuY3Rpb25zOworCisjIEdldHRpbmcgZ2l2ZW4gb3B0aW9ucworR2V0T3B0aW9ucygiLXRlc3QiID0+IFwkdGVzdCwiLWNyb3NzdGVzdCIgPT4gXCRjcm9zc3Rlc3QsICItbz1zIiA9PiBcJG91dHB1dGZpbGUsICItb3JwaGFuIiA9PiBcJG9ycGhhbiwgIi1mISIsICItbGFuZz1zIiA9PiBcJGxhbmd1YWdlKTsKKworIyBSZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0aGUgdGVtcGxhdGVmaWxlcy4gCisjIEFkZGluZyB0aGVzZSB0byB0aGUgbGlzdCBvZiB0byBiZSBwYXJzZWQgZmlsZXMgaWYgdGhleSBleGlzdC4KK2ZvcmVhY2ggJGZpbGUoQEFSR1YpCit7CisJaWYoLWUgJGZpbGUpeyBwdXNoKEBzb3VyY2VmaWxlcywkZmlsZSk7IH0KKwllbHNlIHsgcHJpbnQgIkVycm9yOiBVbmtub3duIE9wdGlvbiAkZmlsZVxuIjsgfQorfQorCQorIyBDaGVja2luZyBpZiBvcHRpb25zIHdlcmUgdmFsaWQ6CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBwcmVwYXJhdGlvbnMgYW5kIGNoZWNrcyBmb3Igc291cmNlZmlsZXMKK2lmKEBzb3VyY2VmaWxlcyA9PSAwKXtkaWUgIk5vIGZpbGVzIHRvIHBhcnNlIGFyZSBzcGVjaWZpZWQhIjt9CitpZigkb3V0cHV0ZmlsZSAmJiAoQHNvdXJjZWZpbGVzICE9IDEgfHwgKCR0ZXN0ICYmICRjcm9zc3Rlc3QpICkgKXtkaWUgIlRoZXJlIHdlcmUgbXVsdGlwbGUgZmlsZXMgZm9yIG9uZSBvdXRwdXRmaWxlcyBzcGVjaWZpZWQhIjt9IAorIyBwcmVwYXJhdGlvbnMgZm9wciBvcnBoYW4gdGVzdHMKK2lmKCRvcnBoYW4peyAkb3JwaGFucHJlZml4ID0gIm9ycGhhbmVkIjsgfQorZWxzZSB7ICRvcnBoYW5wcmVmaXggPSAiIjsgfQorIyBwcmVwYXJhdGlvbnMgZm9yIHRlc3QgLyBjcm9zc3Rlc3QKK2lmKCR0ZXN0KXtwdXNoKEB0ZXN0dHlwZXMsInRlc3QiKTsgCisjICVjaGVja3NbJ3Rlc3QnXT0iY2hlY2siOworfQoraWYoJGNyb3NzdGVzdCl7cHVzaChAdGVzdHR5cGVzLCJjdGVzdCIpOworIyAlY2hlY2tzWydjcm9zc3Rlc3QnXT0iY3Jvc3NjaGVjayI7Cit9CisjIHByZXBhcmF0aW9ucyBhbmQgY2hlY2tzIGZvciBsYW5ndWFnZQoraWYoJGxhbmd1YWdlIGVxImMiKSB7ICRleHRlbnNpb24gPSAiYyI7fQorZWxzaWYoJGxhbmd1YWdlIGVxICJmb3J0cmFuIiBvciAkbGFuZ3VhZ2UgZXEgImYiKSB7ICRsYW5ndWFnZSA9ICJmIjsgJGV4dGVuc2lvbiA9ICJmIjt9CitlbHNlIHsgZGllICJZb3UgbXVzdCBzcGVjaWZ5IGEgdmFsaWQgbGFuZ3VhZ2UhIjsgfQorICAgIAorCisjIFJlYWRpbmcgdGhlIHRlbXBsYXRlcyBmb3IgdGhlIHRlc3RzIGludG8gQHNvdXJjZXMKK2ZvcmVhY2ggJHNyY2ZpbGUgKEBzb3VyY2VmaWxlcykKK3sKKwkjIFJlYWRpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIGN1cnJlbnQgc291cmNlZmlsZQlpbnRvICRzcmMKKwlvcGVuKFRFU1QsJHNyY2ZpbGUpIG9yIHByaW50ICJFcnJvcjogQ291bGQgbm90IG9wZW4gdGVtcGxhdGUgJHNyY2ZpbGVcbiI7CisJd2hpbGUoPFRFU1Q+KXsgJHNyYyAuPSAkXzsgfQorCWNsb3NlKFRFU1QpOworCSMgQWRkaW5nIHRoZSBjb250ZW50ICRzcmMgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBAc291cmNlcworCXB1c2goQHNvdXJjZXMsJHNyYyk7Cit9CisKKyMgRXh0cmFjdGluZyB0aGUgc291cmNlIGZvciB0aGUgbWFpbnByb2dyYW1tIGFuZCBzYXZpbmcgaXQgaW4gJG1haW5wcm9jc3JjCitpZigkbGFuZ3VhZ2UgZXEgImMiKSB7ICRtYWlucHJvY3NyYyA9ICJvbXB0c19zdGFuZGFsb25lUHJvYy5jIjsgfQorZWxzaWYoJGxhbmd1YWdlIGVxICJmIikgeyAkbWFpbnByb2NzcmMgPSAib21wdHNfc3RhbmRhbG9uZVByb2MuZiI7IH0gCitvcGVuKE1BSU5QUk9DLCRtYWlucHJvY3NyYykgb3IgZGllICJDb3VsZCBub3Qgb3BlbiB0aGUgc291cmNlZmlsZSBmb3IgdGhlIG1haW4gcHJvZ3JhbSAkbWFpbnByb2NzcmMiOword2hpbGUoPE1BSU5QUk9DPil7CisJJG1haW5wcm9jIC49ICRfOworfQorCitmb3JlYWNoICR0ZXN0dHlwZSAoQHRlc3R0eXBlcykKK3sKKyAgZm9yZWFjaCAkc3JjKEBzb3VyY2VzKQorICB7CisjIFNvbWUgdGVtcG9yYXJ5IHRlc3RpbmZvcm1hdGlvbjoKKyAgICAoJGRlc2NyaXB0aW9uKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czp0ZXN0ZGVzY3JpcHRpb24nLCRzcmMpOworICAgICgkZGlyZWN0aXZlKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czpkaXJlY3RpdmUnLCRzcmMpOworICAgICgkZnVuY3Rpb25uYW1lKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWUnLCRzcmMpOworCisgICAgb3BlbihPVVRGSUxFLCI+Ii4kbGFuZ3VhZ2UuJG9ycGhhbnByZWZpeC4kdGVzdHR5cGUuIl8iLiRmdW5jdGlvbm5hbWUuIi4iLiRleHRlbnNpb24pIG9yIGRpZSgiQ291bGQgbm90IGNyZWF0ZSB0aGUgb3V0cHV0IGZpbGUgZm9yICRkaXJlY3RpdmUiKTsKKworIyBDcmVhdGluZyB0aGUgc291cmNlIGZvciB0aGUgdGVzdDoKKyAgICAoJGNvZGUpID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOnRlc3Rjb2RlJywkc3JjKTsKKyMgUHV0dGluZyB0b2dldGhlciB0aGUgZnVuY3Rpb25zIGFuZCB0aGUgbWFpbnByb2dyYW1tOgorICAgICRjb2RlIC49ICRtYWlucHJvYzsKKyAgICAKKyMgZ2V0IHRoZSBwYXJhbWV0ZXJzIDxvbXB0czpvcnBoYW46cGFyYW1zPiBieSBqb29uCisjIHRoYW5rcyB0byBEci4gWWluIE1hIGluIEFic29mdAorICAgICgkcGFybXMpID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOm9ycGhhbjpwYXJtcycsJGNvZGUpOworICAgICgkcGFybXMpID0gbGVhdmVfc2luZ2xlX3NwYWNlKCRwYXJtcyk7CisjIHRvIHJlbW92ZSBwYXJhbWV0ZXJzIHRhZyBiZXR3ZWVuICdvbXB0czpvcnBoYW46cGFybXMnIGJ5IGpvb24KKyAgICAoJGNvZGUpID0gcmVwbGFjZV90YWdzKCdvbXB0czpvcnBoYW46cGFybXMnLCcnLCRjb2RlKTsKKyAgICAKKyMgTWFrZSBtb2RpZmljYXRpb25zIGZvciB0aGUgb3JwaGFuZWQgdGVzdHZlcnNpb24gaWYgbmVjZXNzYXJ5OgorICAgIGlmKCRvcnBoYW4pCisgICAgeworIyBHZXQgdGhlIGdsb2JhbCB2YXJpYWJsZXM6CisgICAgICBAZGVmcyA9IGdldF90YWdfdmFsdWVzKCJvbXB0czpvcnBoYW46dmFycyIsJGNvZGUpOworICAgICAgJG9ycGh2YXJzZGVmID0gIiI7CisgICAgICBmb3JlYWNoICRfIChAZGVmcykKKyAgICAgIHsKKwkjcHJpbnQgJF87CisJaWYobm90IC9eWyBdKiQvZ3MpIHsgJG9ycGh2YXJzZGVmID0gam9pbigiXG4iLCRvcnBodmFyc2RlZiwkXyk7IH0gCisJI3ByaW50ICJPS1xuIi4kb3JwaHZhcnNkZWY7IAorICAgICAgfQorICAgICAgaWYoJGxhbmd1YWdlIGVxICJmIikKKyAgICAgIHsKKyMgR2VuZXJhdGUgdGhlIG9ycGhhbiBzdWJyb3V0aW5lczoKKwkkb3JwaGZ1bmNzID0gY3JlYXRlX29ycGhfZm9ydHJhbmZ1bmN0aW9ucygiJHRlc3R0eXBlXyIsICRjb2RlKTsKKyMgUmVwbGFjZSBvcnBoYW4gcmVnaW9ucyBieSBmdW5jdGlvbmNhbGxzOgorCSgkY29kZSkgPSBvcnBoYW5fcmVnaW9uczJmb3J0cmFuZnVuY3Rpb25zKCAiJHRlc3R0eXBlXyIsICgkY29kZSkgKTsKKwkoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpvcnBoYW46dmFycycsJycsJycsKCRjb2RlKSk7CisgICAgKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6b3JwaGFuOnBhcm1zJywnJywnJywoJGNvZGUpKTsKKyAgICAjdG8gZmluZCBvcnBoYW4gY2FsbCBzdGF0ZW1ldG4gYW5kIGFkZCBwYXJhbWV0ZXJzCisgICAgCisjIFB1dCBhbGwgdG9nZXRoZXI6CisJJGNvZGUgPSAkY29kZSAuICRvcnBoZnVuY3M7CisgICAgICB9CisgICAgICBlbHNpZigkbGFuZ3VhZ2UgZXEgImMiKQorICAgICAgeworIyBHZW5lcmF0ZSBwcmVkZWNsYXJhdGlvbnMgZm9yIG9ycGFobiBmdW5jdGlvbnM6CisJJG9ycGhmdW5jc2RlZnMgPSBvcnBoX2Z1bmN0aW9uc19kZWNsYXJhdGlvbnMoIiR0ZXN0dHlwZV8iLCRjb2RlKTsKKyMgR2VuZXJhdGUgdGhlIG9ycGhhbiBmdW5jdGlvbnM6CisJJG9ycGhmdW5jcyA9IGNyZWF0ZV9vcnBoX2NmdW5jdGlvbnMoIiR0ZXN0dHlwZV8iLCRjb2RlKTsKKyMgUmVwbGE6ZSBvcnBoYW4gcmVnaW9ucyBieSBmdW5jdGlvbmNhbGxzOgorCSgkY29kZSkgPSBvcnBoYW5fcmVnaW9uczJjZnVuY3Rpb25zKCAiJHRlc3R0eXBlXyIsICgkY29kZSkgKTsKKyMgRGVsZXRpbmcgdGhlIGZvcm1lciBkZWNsYXJhdGlvbnMgb2YgdGhlIHZhcmlhYmxlcyBpbiB0aGUgb3JwaGFuIHJlZ2lvbnM6CisJKCRjb2RlKSA9IGRlbGV0ZV90YWdzKCdvbXB0czpvcnBoYW46dmFycycsKCRjb2RlKSk7CisjIFB1dCBhbGwgdG9nZXRoZXI6CisJJGNvZGUgPSAiI2luY2x1ZGUgXCJvbXBfdGVzdHN1aXRlLmhcIlxuIi4kb3JwaHZhcnNkZWYgLiAkb3JwaGZ1bmNzZGVmcyAuICRjb2RlIC4gJG9ycGhmdW5jczsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworCXByaW50ICJBbiBlcnJvciBvY2N1cnJlZCEiOworICAgICAgfQorICAgIH0KKyMgcmVtb3ZlIHBhcmFtZXRlcnMgYmV0d2VlbiA8b21wdHM6b3JwaGFuOnBhcm1zPiB0YWdzLCBhZGRlZCBieSBqb29uCisgICAgKCRjb2RlKT0gcmVwbGFjZV90YWdzKCdvbXB0czpvcnBoYW46cGFybXMnLCRjb2RlKTsKKyAgICAKKyMgUmVtb3ZlIHRoZSBtYXJrcyBmb3IgdGhlIG9ycGFobiByZWdpb25zIGFuZCBpdHMgdmFyaWFibGVzOgorICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOm9ycGhhbicsJycsJycsKCRjb2RlKSk7CisgICAgKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6b3JwaGFuOnZhcnMnLCcnLCcnLCgkY29kZSkpOworCisjIHJlbW92ZSBwYXJhbWV0ZXJzIGJldHdlZW4gZm9yIG9ycGhhbmVkIGRpcmVjdGl2ZSBwYXJhbWV0ZXMsIGFkZGVkIGJ5IGpvb24KKyAgICAoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpvcnBoYW46cGFybXMnLCcnLCcnLCgkY29kZSkpOworICAgIAorICAgIGlmKCR0ZXN0dHlwZSBlcSAidGVzdCIpIHsKKyMgUmVtb3ZlIHRoZSBtYXJrcyBmb3IgdGhlIHRlc3Rjb2RlIGFuZCByZW1vdmUgdGhlIGNvZGUgZm9yIHRoZSBjcm9zc3Rlc3RzOiAKKyAgICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOmNoZWNrJywnJywnJywoJGNvZGUpKTsKKyAgICAgICgkY29kZSkgPSBkZWxldGVfdGFncygnb21wdHM6Y3Jvc3NjaGVjaycsKCRjb2RlKSk7CQkKKyAgICB9CisgICAgZWxzaWYoJHRlc3R0eXBlIGVxICJjdGVzdCIpIHsKKyMgUmVtb3ZlIHRoZSBtYXJrcyBmb3IgdGhlIGNyb3NzdGVzdGNvZGUgYW5kIHJlbW92ZSB0aGUgY29kZSBmb3IgdGhlIHRlc3RzOiAKKyAgICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOmNyb3NzY2hlY2snLCcnLCcnLCgkY29kZSkpOworICAgICAgKCRjb2RlKSA9IGRlbGV0ZV90YWdzKCdvbXB0czpjaGVjaycsKCRjb2RlKSk7CQkKKyAgICB9CisjIE1ha2luZyBzb21lIGZpbmFsIG1vZGlmaWNhdGlvbnM6CisgICAgKCRjb2RlKSA9IHJlcGxhY2VfdGFncygndGVzdGZ1bmN0aW9ubmFtZScsJHRlc3R0eXBlLiJfIi4kZnVuY3Rpb25uYW1lLCgkY29kZSkpOworICAgICgkY29kZSkgPSByZXBsYWNlX3RhZ3MoJ2RpcmVjdGl2ZScsJGRpcmVjdGl2ZSwoJGNvZGUpKTsKKyAgICAoJGNvZGUpID0gcmVwbGFjZV90YWdzKCdkZXNjcmlwdGlvbicsJGRlc2NyaXB0aW9uLCgkY29kZSkpOworICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZScsJHRlc3R0eXBlLiJfIiwnJywoJGNvZGUpICk7CisjCSRjb2RlID0gICJcI2luY2x1ZGUgXCJvbXBfdGVzdHN1aXRlLmhcIlxuIi4kY29kZTsKKyMgV3JpdGUgdGhlIHJlc3VsdCBpbnRvIHRoZSBmaWxlIGFuZCBjbG9zZSBpdDoKKyAgICBwcmludCBPVVRGSUxFICRjb2RlOworICAgIGNsb3NlKE9VVEZJTEUpOworICB9Cit9CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvb21wdHNfcGFyc2VyRnVuY3Rpb25zLnBtIGIvZmluYWwvdGVzdHN1aXRlL29tcHRzX3BhcnNlckZ1bmN0aW9ucy5wbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zOGNlZGIwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL29tcHRzX3BhcnNlckZ1bmN0aW9ucy5wbQpAQCAtMCwwICsxLDI4MCBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisKKyMgZnVuY3Rpb25zLnBtCisjIFRoaXMgcGFja2FnZSBjb250YWlucyBhIHNldCBvZiBzdWJyb3V0aW5lcyB0byBtb2RpZnkgdGhlIHRlbXBsYXRlcyBmb3IgdGhlIG9wZW5NUCBUZXN0dWl0ZS4KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBzdWJyb3V0aW5lcyB0byBleHRyYWN0LCBtb2RpZnkgb3IgZGVsZXRlIHRhZ3MgZnJvbSB0aGUgdGVtcGxhdGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgTElTVCBnZXRfdGFnX3ZhbHVlcyggJHRhZ25hbWUsICRzdHJpbmcgKQorIyBzdWJydXRpbmUgdG8gZ2V0IHRoZSB0ZXh0IGVuY2xvZGVkIGJ5IGEgdGFnLgorIyBSZXR1cm5zIGEgbGlzdCBjb250YWluaW5nIHRoZSBpbm5lciB0ZXh0cyBvZiB0aGUgZm91bmQgdGFncworc3ViIGdldF90YWdfdmFsdWVzCit7CisJbXkgKCAkdGFnbmFtZSwgJHN0cmluZyApOworCSggJHRhZ25hbWUsICRzdHJpbmcgKSA9IEBfOworCW15IChAdG1wLEB0bXAyKTsKKyAgIAlAdG1wID0gc3BsaXQoL1w8JHRhZ25hbWVcPi8sJHN0cmluZyk7IAorCWZvcmVhY2ggJF8oQHRtcCl7CisJCXB1c2goQHRtcDIsc3BsaXQoL1w8XC8kdGFnbmFtZVw+LykpOworCX0KKwlteShAcmVzdWx0LCRpKTsKKwkkaT0xOyAjIGNvdXRlciB0byBnZXQgb25seSBldmVyeSBzZWNvbmQgaXRlbQorCWZvcmVhY2ggJF8oQHRtcDIpeworCQlpZigkaSUyIGVxIDApeworCQkJcHVzaChAcmVzdWx0LCRfKTsKKwkJfQorCQkkaSsrOworCX0KKwlyZXR1cm4gQHJlc3VsdDsKK30KKworIyBMSVNUIHJlcGxhY2VfdGFncyggJHRhZ25hbWUsICRyZXBsYWNlc3RyaW5nLCBAbGlzdCApCisjIHN1YnJ1dGluZSB0byByZXBsYWNlIHRhZ3MgYnkgYSByZXBsYWNlc3RyaW5nLiAKKyMgUmV0dXJucyBhIGxpc3Qgb2YgdGhlIHNyaW5ncyBhZnRlciBjb252ZXJzaW9uLgorc3ViIHJlcGxhY2VfdGFncworeworCW15ICgkdGFnbmFtZSwgJHJlcGxhY2VzdHJpbmcsIEBzdHJpbmdsaXN0LCBAcmVzdWx0KTsKKwkoJHRhZ25hbWUsICRyZXBsYWNlc3RyaW5nLCBAc3RyaW5nbGlzdCkgPSBAXzsKKwlmb3JlYWNoICRfKEBzdHJpbmdsaXN0KSB7CisJCXMjXDwkdGFnbmFtZVw+KC4qPylcPFwvJHRhZ25hbWVcPiMkcmVwbGFjZXN0cmluZyNnczsKKwkJcHVzaChAcmVzdWx0LCRfKTsKKwl9CisJcmV0dXJuIEByZXN1bHQ7Cit9CisKKyMgTElTVCBlbmxhcmdlX3RhZ3MoICR0YWduYW1lLCAkYmVmb3JlLCAkYWZ0ZXIsIEBsaXN0ICkKKyMgc3VicnV0aW5lIHRvIHJlcGxhY2UgdGFncyBieSB0aGUgdGFncyBhZGRlZCBieSBhIHN0cmluZyBiZWZvcmUgYW5kIGFmdGVyLiAKKyMgUmV0dXJucyBhIGxpc3Qgb2YgdGhlIHNyaW5ncyBhZnRlciBjb252ZXJzaW9uLgorc3ViIGVubGFyZ2VfdGFncworeworCW15ICgkdGFnbmFtZSwgJGJlZm9yZSwgJGFmdGVyLCBAc3RyaW5nbGlzdCxAcmVzdWx0KTsKKwkoJHRhZ25hbWUsICRiZWZvcmUsICRhZnRlciwgQHN0cmluZ2xpc3QpID0gQF87CisJZm9yZWFjaCAkXyhAc3RyaW5nbGlzdCkgeworCQlzI1w8JHRhZ25hbWVcPiguKj8pXDxcLyR0YWduYW1lXD4jJGJlZm9yZSQxJGFmdGVyI2dzOworCQlwdXNoKEByZXN1bHQsJF8pOworCX0KKwlyZXR1cm4gQHJlc3VsdDsKK30KKworIyBMSVNUIGRlbGV0ZV90YWdzKCAkdGFnbmFtZSwgQGxpc3QgKQorIyBzdWJydXRpbmUgdG8gZGVsZXRlIHRhZ3MgaW4gYSBzdHJpbmcuIAorIyBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgY2xlYXJlZCBzdHJpbmdzCitzdWIgZGVsZXRlX3RhZ3MKK3sKKwlteSgkdGFnbmFtZSxAc3RyaW5nbGlzdCk7CisJKCR0YWduYW1lLCBAc3RyaW5nbGlzdCkgPSBAXzsKKwlteShAcmVzdWx0KTsKKwlmb3JlYWNoICRfKEBzdHJpbmdsaXN0KSB7CisJCXMjXDwkdGFnbmFtZVw+KC4qPylcPFwvJHRhZ25hbWVcPiMjZ3M7CisJCXB1c2goQHJlc3VsdCwkXyk7CisJfQorCXJldHVybiBAcmVzdWx0OworfQorCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgc3Vicm91dGluZXMgZm9yIGdlbmVyYXRpbmcgIm9ycGFobmVkIiB0ZXN0cyAJCQkJCQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBTQ0FMQVIgY3JlYXRlX29ycGhfY2Z1bmN0aW9ucyggJHByZWZpeCwgJGNvZGUgKQorIyByZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGRlZmluaXRpb25zIG9mIHRoZSBmdW5jdGlvbnMgZm9yIHRoZSAKKyMgb3JwaGFuIHJlZ2lvbnMuCitzdWIgY3JlYXRlX29ycGhfY2Z1bmN0aW9ucworeworCW15ICgkY29kZSxAZGVmcyk7CisJKCRjb2RlKSA9IEBfOworCUBkZWZzID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOm9ycGhhbicsJGNvZGUpOworCSgkZnVuY3Rpb25uYW1lKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWUnLCRjb2RlKTsKKwlteSAoIEByZXN1bHQsJGZ1bmN0aW9uc3JjLCAkaSk7CisJJGZ1bmN0aW9uc3JjID0gICJcbi8qIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGRlZmluaXRpb25zIG9mIHRoZSBvcnBoYW4gZnVuY3Rpb25zICovXG4iOworCisJJGkgPSAxOworCWZvcmVhY2ggKEBkZWZzKSB7CisJCSRmdW5jdGlvbnNyYyAuPSAiXG52b2lkIG9ycGgkaVxfJGZ1bmN0aW9ubmFtZSAoRklMRSAqIGxvZ0ZpbGUpIHsiOworCQkkZnVuY3Rpb25zcmMgLj0gJF87CisJCSRmdW5jdGlvbnNyYyAuPSAiXG59XG4iOworCQkkaSsrOworCX0KKwkkZnVuY3Rpb25zcmMgLj0gIi8qIEVuZCBvZiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBkZWZpbml0aW9ucyAqL1xuIjsKKwlyZXR1cm4gJGZ1bmN0aW9uc3JjOworfQorCisjIFNDQUxBUiBjcmVhdGVfb3JwaF9mb3J0cmFuZnVuY3Rpb25zKCAkcHJlZml4LCAkY29kZSApCisjIHJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIGZ1bmN0aW9ucyBmb3IgdGhlIAorIyBvcnBoYW4gcmVnaW9ucy4KK3N1YiBjcmVhdGVfb3JwaF9mb3J0cmFuZnVuY3Rpb25zCit7CisJbXkgKCRwcmVmaXgsJGNvZGUsQGRlZnMsJG9ycGhhbl9wYXJtcyk7CisJKCRwcmVmaXgsJGNvZGUsJG9ycGhhbl9wYXJtcykgPSBAXzsKKwlAZGVmcyA9IGdldF90YWdfdmFsdWVzKCdvbXB0czpvcnBoYW4nLCRjb2RlKTsKKworICAgICN0byByZW1vdmUgc3BhY2UgYW5kIHB1dCBhIHNpbmdsZSBzcGFjZQorICAgIGlmKCRvcnBoYW5fcGFybXMgbmUgIiIpCisgICAgeworICAgICAgJG9ycGhhbl9wYXJtcyA9fiBzL1sgXHRdKy8vc2c7CisgICAgICAkb3JwaGFuX3Bhcm1zID1+IHMvWyBcdF0rXG4vXG4vc2c7CisgICAgfQorICAgIAorCSgkb3JwaGFudmFyc2RlZnMpID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOm9ycGhhbjp2YXJzJywkY29kZSk7CisJZm9yZWFjaCAoQHZhcnNkZWYpIHsKKwkJaWYgKG5vdCAvW14gXG4kXSovKXsgJG9ycGhhbnZhcnNkZWZzID0gam9pbigiXG4iLCRvcnBoYW52YXJzZGVmLCRfKTt9CisJfQorCSgkZnVuY3Rpb25uYW1lKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWUnLCRjb2RlKTsKKwlteSAoIEByZXN1bHQsJGZ1bmN0aW9uc3JjLCAkaSk7CisJJGZ1bmN0aW9uc3JjID0gICJcbiEgRGVmaW5pdGlvbnMgb2YgdGhlIG9ycGhhbiBmdW5jdGlvbnNcbiI7CisJJGkgPSAxOworCWZvcmVhY2ggJF8oQGRlZnMpCisJeworCQkkZnVuY3Rpb25zcmMgLj0gIlxuICAgICAgU1VCUk9VVElORSBvcnBoJGlcXyRwcmVmaXhcXyRmdW5jdGlvbm5hbWVcKCRvcnBoYW5fcGFybXNcKVxuICAgICAgIjsKKyAgICAgICAgJGZ1bmN0aW9uc3JjIC49ICJJTkNMVURFIFwib21wX3Rlc3RzdWl0ZS5mXCJcbiI7CisJCSRmdW5jdGlvbnNyYyAuPSAkb3JwaGFudmFyc2RlZnMuIlxuIjsKKwkJJGZ1bmN0aW9uc3JjIC49ICRfOworCQkkZnVuY3Rpb25zcmMgLj0gIlxuIjsKKwkJJGZ1bmN0aW9uc3JjIC49ICIgICAgICBFTkQgU1VCUk9VVElORVxuISBFbmQgb2YgZGVmaW5pdGlvblxuXG4iOworCQkkaSsrOworCX0KKwlyZXR1cm4gJGZ1bmN0aW9uc3JjOworfQorCisjIExJU1Qgb3JwaGFuX3JlZ2lvbnMyY2Z1bmN0aW9ucyggJHByZWZpeCwgQGNvZGUgKQorIyByZXBsYWNlcyBvcnBoYW4gcmVnaW9ucyBieSBmdW5jdGlvbmNhbGxzIGluIEMvQysrLgorc3ViIG9ycGhhbl9yZWdpb25zMmNmdW5jdGlvbnMKK3sKKwlteSAoJGNvZGUsICRpLCAkZnVuY3Rpb25uYW1lKTsKKwkoJGNvZGUpID0gQF87CisJJGkgPSAxOworCSgkZnVuY3Rpb25uYW1lKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWUnLCRjb2RlKTsKKyAgICAgICAgd2hpbGUoIC9cPG9tcHRzXDpvcnBoYW5cPiguKilcPFwvb21wdHNcOm9ycGhhblw+L3MpIHsKKyAgICAgICAgICAgIHMjXDxvbXB0c1w6b3JwaGFuXD4oLio/KVw8XC9vbXB0c1w6b3JwaGFuXD4jb3JwaCRpXF8kZnVuY3Rpb25uYW1lIChsb2dGaWxlKTsjczsKKyAgICAgICAgICAgICRpKys7CisgICAgICAgIH0KKwlyZXR1cm4gJGNvZGU7Cit9CisKKyMgTElTVCBvcnBoYW5fcmVnaW9uczJmb3J0cmFuZnVuY3Rpb25zKCAkcHJlZml4LCBAY29kZSApCisjIHJlcGxhY2VzIG9ycGhhbiByZWdpb25zIGJ5IGZ1bmN0aW9uY2FsbHMgaW4gZm9ydHJhbgorc3ViIG9ycGhhbl9yZWdpb25zMmZvcnRyYW5mdW5jdGlvbnMKK3sKKwlteSAoICRwcmVmaXgsIEBjb2RlLCAkbXlfcGFybXMsICRpLCAkZnVuY3Rpb25uYW1lKTsKKwkoJHByZWZpeCwgKCRjb2RlKSwgJG15X3Bhcm1zKSA9IEBfOworCSRpID0gMTsKKwkoJGZ1bmN0aW9ubmFtZSkgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lJywkY29kZSk7CisJZm9yZWFjaCAkXygoJGNvZGUpKQorCXsKKwkJd2hpbGUoIC9cPG9tcHRzXDpvcnBoYW5cPiguKilcPFwvb21wdHNcOm9ycGhhblw+L3MpCisJCXsKKwkJCXMjXDxvbXB0c1w6b3JwaGFuXD4oLio/KVw8XC9vbXB0c1w6b3JwaGFuXD4jICAgICAgQ0FMTCBvcnBoJGlcXyRwcmVmaXhcXyRmdW5jdGlvbm5hbWVcKCRteV9wYXJtc1wpOyNzOworCQkJJGkrKzsKKwkJfQorCX0KKwlyZXR1cm4gKCRjb2RlKTsKK30KKworIyBTQ0FMQVIgb3JwaF9mdW5jdGlvbnNfZGVjbGFyYXRpb25zKCAkcHJlZml4LCAkY29kZSApCisjIHJldHVybnMgYSBzcmluZyBpbmNsdWRpbmcgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBmdW5jdGlvbnMgdXNlZCAKKyMgaW4gdGhlIG9ycGhhbiByZWdpb25zLiBUaGUgZnVuY3Rpb24gbmFtZXMgYXJlIGdlbmVyYXRlZCB1c2luZyAKKyMgdGhlICRwcmVmaXggYXMgcHJlZml4IGZvciB0aGUgZnVuY3Rpb25uYW1lLgorc3ViIG9ycGhfZnVuY3Rpb25zX2RlY2xhcmF0aW9ucworeworCW15ICgkcHJlZml4LCAkY29kZSk7CisJKCRwcmVmaXgsICRjb2RlKSA9IEBfOworCW15ICggQGRlZnMsICRyZXN1bHQgKTsKKwkKKwkjIGNyZWF0aW5nIGRlY2xhcmF0aW9ucyBmb3IgbGF0ZXIgdXNlZCBmdW5jdGlvbnMKKwkkcmVzdWx0IC49ICJcblxuLyogRGVjbGFyYXRpb24gb2YgdGhlIGZ1bmN0aW9ucyBjb250YWluaW5nIHRoZSBjb2RlIGZvciB0aGUgb3JwaGFuIHJlZ2lvbnMgKi9cbiNpbmNsdWRlIDxzdGRpby5oPlxuIjsKKwlAZGVmcyA9IGdldF90YWdfdmFsdWVzKCdvbXB0czpvcnBoYW4nLCRjb2RlKTsKKwlteSAoJGZ1bmN0aW9ubmFtZSwkaSk7CisJKCRmdW5jdGlvbm5hbWUpID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZScsJGNvZGUpOworCSRpID0gMTsKKwlmb3JlYWNoICRfKEBkZWZzKSB7CisJCSRyZXN1bHQgLj0gIlxudm9pZCBvcnBoJGlcXyRwcmVmaXhcXyRmdW5jdGlvbm5hbWUgKCBGSUxFICogbG9nRmlsZSApOyI7CisJCSRpKys7CisJfQorCSRyZXN1bHQgLj0gIlxuXG4vKiBFbmQgb2YgZGVjbGFyYXRpb24gKi9cblxuIjsKKwlyZXR1cm4gJHJlc3VsdDsKK30KKworIyBTQ0FMQVIgbWFrZV9nbG9iYWxfdmFyc19kZWZpbml0aW9uKCAkY29kZSApCisjIHJldHVybnMgYSBzcmluZyBpbmNsdWRpbmcgdGhlIGRlY2xhcmF0aW9uIGZvciB0aGUgdmFycyBuZWVkZWQgdG8KKyMgYmUgZGVjbGFyZWQgZ2xvYmFsIGZvciB0aGUgb3JwaGFuIHJlZ2lvbi4KK3N1YiBtYWtlX2dsb2JhbF92YXJzX2RlZgoreworCW15ICggJGNvZGUgKTsKKwkoJGNvZGUpID0gQF87CisJbXkgKCBAZGVmcywgJHJlc3VsdCwgQHRtcCwgQHRtcDIgLCRwcmVkZWZpbml0aW9ucyk7CisJCisJIyBjcmVhdGluZyBnbG9iYWwgZGVjbGFyYXRpb25zIGZvciB0aGUgdmFyaWFibGVzLgorCSRyZXN1bHQgID0gIlxuXG4vKiBEZWNsYXJhdGlvbiBvZiB0aGUgdmFyaWFibGVzIHVzZWQgaW4gdGhlIG9ycGhhbiByZWdpb24uICovXG4iOworCQorCSMgZ2V0IGFsbCB0YWdzIGNvbnRhaW5pbmcgdGhlIHZhcmlhYmxlIGRlZmluaXRpb25zCisJQGRlZnMgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6b3JwaGFuOnZhcnMnLCRjb2RlKTsKKwlmb3JlYWNoICRfKEBkZWZzKQorCXsKKwkJIyBjdXR0aW5nIHRoZSBkaWZmZXJlbnQgZGVjbGFyYXRpb25zIGluIHRoZSBzYW1lIHRhZyBieSB0aGUgJzsnIGFzIGN1dHRtYXJrCisJCUB0bXAgPSBzcGxpdCgvOy8sJF8pOworCQlmb3JlYWNoICRfKEB0bXApCisJCXsKKwkJCSMgcmVwbGFjaW5nIG5ld2xpbmVzIGFuZCBkb3VibGUgc3BhY2VzCisJCQlzL1xuLy9nczsKKwkJCXMvICAvL2dzOworCQkJIyBwdXQgdGhlIG5ldyBkZWNsYXJhdGlvbiBhdCB0aGUgZW5kIG9mICRyZXN1bHQKKwkJCWlmKCRfIG5lICIiKXsgJHJlc3VsdCAuPSAiXG4gJF87IjsgfQorCQl9CisJfQorCSRyZXN1bHQgLj0gIlxuXG4vKiBFbmQgb2YgZGVjbGFyYXRpb24uICovXG5cbiI7CisJcmV0dXJuICRyZXN1bHQ7Cit9CisKKyMgU0NBTEFSIGV4dGVybl92YXJzX2RlZmluaXRpb24oICRjb2RlICkKKyMgcmV0dXJucyBhIHNyaW5nIGluY2x1ZGluZyB0aGUgZGVjbGFyYXRpb24gZm9yIHRoZSB2YXJzIG5lZWRlZCB0bworIyBiZSBkZWNsYXJlZCBleHRlcm4gZm9yIHRoZSBvcnBoYW4gcmVnaW9uLgorc3ViIGV4dGVybl92YXJzX2RlZgoreworCW15ICggJGNvZGUgKTsKKwkoJGNvZGUpID0gQF87CisJbXkgKCBAZGVmcywgJHJlc3VsdCwgQHRtcCwgQHRtcDIgLCRwcmVkZWZpbml0aW9ucyk7CisJCisJIyBjcmVhdGluZyBkZWNsYXJhdGlvbnMgZm9yIHRoZSBleHRlcm4gdmFyaWFibGVzLgorCSRyZXN1bHQgID0gIlxuXG4vKiBEZWNsYXJhdGlvbiBvZiB0aGUgZXh0ZXJuIHZhcmlhYmxlcyB1c2VkIGluIHRoZSBvcnBoYW4gcmVnaW9uLiAqL1xuIjsKKwkjICRyZXN1bHQgLj0gIlxuI2luY2x1ZGUgPHN0ZGlvLmg+XG4jaW5jbHVkZSA8b21wLmg+XG4iOworCSRyZXN1bHQgLj0gIlxuZXh0ZXJuIEZJTEUgKiBsb2dGaWxlOyI7CisJCisJIyBnZXQgYWxsIHRhZ3MgY29udGFpbmluZyB0aGUgdmFyaWFibGUgZGVmaW5pdGlvbnMKKwlAZGVmcyA9IGdldF90YWdfdmFsdWVzKCdvbXB0czpvcnBoYW46dmFycycsJGNvZGUpOworCWZvcmVhY2ggJF8oQGRlZnMpCisJeworCQkjIGN1dHRpbmcgdGhlIGRpZmZlcmVudCBkZWNsYXJhdGlvbnMgaW4gdGhlIHNhbWUgdGFnIGJ5IHRoZSAnOycgYXMgY3V0dG1hcmsKKwkJQHRtcCA9IHNwbGl0KC87LywkXyk7CisJCWZvcmVhY2ggJF8oQHRtcCkKKwkJeworCQkJIyByZXBsYWNpbmcgbmV3bGluZXMgYW5kIGRvdWJsZSBzcGFjZXMKKwkJCXMvXG4vL2dzOworCQkJcy8gIC8vZ3M7CisJCQkjIGN1dHRpbmcgb2ZmIGRlZmluaXRpb25zCisJCQlAdG1wMiA9IHNwbGl0KCI9IiwkXyk7CisJCQkjIHB1dCB0aGUgbmV3IGRlY2xhcmF0aW9uIGF0IHRoZSBlbmQgb2YgJHJlc3VsdAorCQkJJHJlc3VsdCAuPSAiXG5leHRlcm4gJHRtcDJbMF07IjsKKwkJfQorCX0KKwkkcmVzdWx0IC49ICJcblxuLyogRW5kIG9mIGRlY2xhcmF0aW9uLiAqL1xuXG4iOworCXJldHVybiAkcmVzdWx0OworfQorCitzdWIgbGVhdmVfc2luZ2xlX3NwYWNlCit7CisgIG15KCRzdHIpOworICAoJHN0cik9QF87CisgIGlmKCRzdHIgbmUgIiIpCisgIHsKKyAgICAkc3RyID1+IHMvXlsgXHRdKy8gLzsKKyAgICAkc3RyID1+IHMvWyBcdF0rXG4kL1xuLzsKKyAgICAkc3RyID1+IHMvWyBcdF0rLy9nOworICB9CisgIHJldHVybiAkc3RyOworfQorCityZXR1cm4gMTsKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS9vbXB0c19zdGFuZGFsb25lUHJvYy5jIGIvZmluYWwvdGVzdHN1aXRlL29tcHRzX3N0YW5kYWxvbmVQcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxYjU5MwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS9vbXB0c19zdGFuZGFsb25lUHJvYy5jCkBAIC0wLDAgKzEsNTEgQEAKK2ludCBtYWluKCkKK3sKKwlpbnQgaTsJCQkvKiBMb29wIGluZGV4ICovCisJaW50IHJlc3VsdDsJCS8qIHJldHVybiB2YWx1ZSBvZiB0aGUgcHJvZ3JhbSAqLworCWludCBmYWlsZWQ9MDsgCQkvKiBOdW1iZXIgb2YgZmFpbGVkIHRlc3RzICovCisJaW50IHN1Y2Nlc3M9MDsJCS8qIG51bWJlciBvZiBzdWNjZWVkZWQgdGVzdHMgKi8KKwlzdGF0aWMgRklMRSAqIGxvZ0ZpbGU7CS8qIHBvaW50ZXIgb250byB0aGUgbG9nZmlsZSAqLworCXN0YXRpYyBjb25zdCBjaGFyICogbG9nRmlsZU5hbWUgPSAiPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPi5sb2ciOwkvKiBuYW1lIG9mIHRoZSBsb2dmaWxlICovCisKKworCS8qIE9wZW4gYSBuZXcgTG9nZmlsZSBvciBvdmVyd3JpdGUgdGhlIGV4aXN0aW5nIG9uZS4gKi8KKwlsb2dGaWxlID0gZm9wZW4obG9nRmlsZU5hbWUsIncrIik7CisKKwlwcmludGYoIiMjIyMjIyMjIE9wZW5NUCBWYWxpZGF0aW9uIFN1aXRlIFYgJXMgIyMjIyMjXG4iLCBPTVBUU19WRVJTSU9OICk7CisJcHJpbnRmKCIjIyBSZXBldGl0aW9uczogJTNkICAgICAgICAgICAgICAgICAgICAgICAjIyMjXG4iLFJFUEVUSVRJT05TKTsKKwlwcmludGYoIiMjIExvb3AgQ291bnQgOiAlNmQgICAgICAgICAgICAgICAgICAgICMjIyNcbiIsTE9PUENPVU5UKTsKKwlwcmludGYoIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiIpOworCXByaW50ZigiVGVzdGluZyA8ZGlyZWN0aXZlPjwvZGlyZWN0aXZlPlxuXG4iKTsKKworCWZwcmludGYobG9nRmlsZSwiIyMjIyMjIyMgT3Blbk1QIFZhbGlkYXRpb24gU3VpdGUgViAlcyAjIyMjIyNcbiIsIE9NUFRTX1ZFUlNJT04gKTsKKwlmcHJpbnRmKGxvZ0ZpbGUsIiMjIFJlcGV0aXRpb25zOiAlM2QgICAgICAgICAgICAgICAgICAgICAgICMjIyNcbiIsUkVQRVRJVElPTlMpOworCWZwcmludGYobG9nRmlsZSwiIyMgTG9vcCBDb3VudCA6ICU2ZCAgICAgICAgICAgICAgICAgICAgIyMjI1xuIixMT09QQ09VTlQpOworCWZwcmludGYobG9nRmlsZSwiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuIik7CisJZnByaW50Zihsb2dGaWxlLCJUZXN0aW5nIDxkaXJlY3RpdmU+PC9kaXJlY3RpdmU+XG5cbiIpOworCisJZm9yICggaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrICkgeworCQlmcHJpbnRmIChsb2dGaWxlLCAiXG5cbiVkLiBydW4gb2YgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiBvdXQgb2YgJWRcblxuIixpKzEsUkVQRVRJVElPTlMpOworCQlpZig8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+KGxvZ0ZpbGUpKXsKKwkJCWZwcmludGYobG9nRmlsZSwiVGVzdCBzdWNjZXNzZnVsLlxuIik7CisJCQlzdWNjZXNzKys7CisJCX0KKwkJZWxzZSB7CisJCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yOiBUZXN0IGZhaWxlZC5cbiIpOworCQkJcHJpbnRmKCJFcnJvcjogVGVzdCBmYWlsZWQuXG4iKTsKKwkJCWZhaWxlZCsrOworCQl9CisJfQorCisgICAgaWYoZmFpbGVkPT0wKXsKKwkJZnByaW50Zihsb2dGaWxlLCJcbkRpcmVjdGl2ZSB3b3JrZWQgd2l0aG91dCBlcnJvcnMuXG4iKTsKKwkJcHJpbnRmKCJEaXJlY3RpdmUgd29ya2VkIHdpdGhvdXQgZXJyb3JzLlxuIik7CisJCXJlc3VsdD0wOworCX0KKwllbHNleworCQlmcHJpbnRmKGxvZ0ZpbGUsIlxuRGlyZWN0aXZlIGZhaWxlZCB0aGUgdGVzdCAlaSB0aW1lcyBvdXQgb2YgJWkuICVpIHdlcmUgc3VjY2Vzc2Z1bFxuIixmYWlsZWQsUkVQRVRJVElPTlMsc3VjY2Vzcyk7CisJCXByaW50ZigiRGlyZWN0aXZlIGZhaWxlZCB0aGUgdGVzdCAlaSB0aW1lcyBvdXQgb2YgJWkuXG4laSB0ZXN0KHMpIHdlcmUgc3VjY2Vzc2Z1bFxuIixmYWlsZWQsUkVQRVRJVElPTlMsc3VjY2Vzcyk7CisJCXJlc3VsdCA9IChpbnQpICgoKGRvdWJsZSkgZmFpbGVkIC8gKGRvdWJsZSkgUkVQRVRJVElPTlMgKSAqIDEwMCApOworCX0KKwlwcmludGYgKCJSZXN1bHQ6ICVpXG4iLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvb21wdHNfc3RhbmRhbG9uZVByb2MuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS9vbXB0c19zdGFuZGFsb25lUHJvYy5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZmNhYjYKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvb21wdHNfc3RhbmRhbG9uZVByb2MuZgpAQCAtMCwwICsxLDY4IEBACishVGhpcyBpcyB0aGUgbWFpbiBkcml2ZXIgdG8gaW52b2tlIGRpZmZlcmVudCB0ZXN0IGZ1bmN0aW9ucworICAgICAgUFJPR1JBTSA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+X21haW4KKyAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgIElOVEVHRVIgZmFpbGVkLCBzdWNjZXNzICFOdW1iZXIgb2YgZmFpbGVkL3N1Y2NlZWRlZCB0ZXN0cworICAgICAgSU5URUdFUiBudW1fdGVzdHMsY3Jvc3NjaGVja2VkLCBjcm9zc2ZhaWxlZCwgagorICAgICAgSU5URUdFUiB0ZW1wLHRlbXAxCisgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisKKyAgICAgIElOVEVHRVIgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPgorCisKKyAgICAgIENIQVJBQ1RFUio1MCBsb2dmaWxlbmFtZSAhUG9pbnRlciB0byBsb2dmaWxlCisgICAgICBJTlRFR0VSIHJlc3VsdCAKKworICAgICAgbnVtX3Rlc3RzID0gMAorICAgICAgY3Jvc3NjaGVja2VkID0gMAorICAgICAgY3Jvc3NmYWlsZWQgPSAwCisgICAgICByZXN1bHQgPSAxCisgICAgICBmYWlsZWQgPSAwCisKKyAgICAgICFPcGVuIGEgbmV3IGxvZ2ZpbGUgb3Igb3ZlcndyaXRlIHRoZSBleGlzdGluZyBvbmUuCisgICAgICBsb2dmaWxlbmFtZSA9ICJiaW4vZm9ydHJhbi88dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+LmxvZyIKKyEgICAgICBXUklURSAoKiwqKSAiRW50ZXIgbG9nRmlsZW5hbWU6IiAKKyEgICAgICBSRUFEICAoKiwqKSBsb2dmaWxlbmFtZQorCisgICAgICBPUEVOICgxLCBGSUxFID0gbG9nZmlsZW5hbWUpCisgCisgICAgICBXUklURSAoKiwqKSAiIyMjIyMjIyMgT3Blbk1QIFZhbGlkYXRpb24gU3VpdGUgViAzLjBhICMjIyMjIyIKKyAgICAgIFdSSVRFICgqLCopICIjIyBSZXBldGl0aW9uczoiLCBOIAorICAgICAgV1JJVEUgKCosKikgIiMjIExvb3AgQ291bnQgOiIsIExPT1BDT1VOVAorICAgICAgV1JJVEUgKCosKikgIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiCisgICAgICBXUklURSAoKiwqKQorCisgICAgICBjcm9zc2ZhaWxlZD0wCisgICAgICByZXN1bHQ9MQorICAgICAgV1JJVEUgKDEsKikgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgICAgV1JJVEUgKDEsKikgIlRlc3RpbmcgPGRpcmVjdGl2ZT48L2RpcmVjdGl2ZT4iCisgICAgICBXUklURSAoMSwqKSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisgICAgICBXUklURSAoMSwqKSAKKyAgICAgIFdSSVRFICgxLCopICJ0ZXN0bmFtZTogPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiIKKyAgICAgIFdSSVRFICgxLCopICIoQ3Jvc3N0ZXN0cyBzaG91bGQgZmFpbCkiCisgICAgICBXUklURSAoMSwqKQorICAgICAgCisgICAgICBETyBqID0gMSwgTgorICAgICAgICB0ZW1wID0gIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJRiAodGVtcCAuRVEuIDEpIFRIRU4KKyAgICAgICAgICBXUklURSAoMSwqKSAgaiwgIi4gdGVzdCBzdWNjZXNzZnVsLiIKKyAgICAgICAgICBzdWNjZXNzID0gc3VjY2VzcyArIDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIFdSSVRFICgxLCopICJFcnJvcjogIixqLCAiLiB0ZXN0IGZhaWxlZC4iCisgICAgICAgICAgZmFpbGVkID0gZmFpbGVkICsgMQorICAgICAgICBFTkRJRgorICAgICAgRU5EIERPCisKKyAgICAgIAorICAgICAgSUYgKGZhaWxlZCAuRVEuIDApIFRIRU4KKyAgICAgICAgV1JJVEUgKDEsKikgIkRpcmVjdGl2ZSB3b3JrZWQgd2l0aG91dCBlcnJvcnMuIgorICAgICAgICBXUklURSAoKiwqKSAiRGlyZWN0aXZlIHdvcmtlZCB3aXRob3V0IGVycm9ycy4iCisgICAgICAgIHJlc3VsdCA9IDAKKyAgICAgICAgV1JJVEUgKCosKikgIlJlc3VsdDoiLHJlc3VsdAorICAgICAgRUxTRQorICAgICAgICBXUklURSAoMSwqKSAiRGlyZWN0aXZlIGZhaWxlZCB0aGUgdGVzdCAiLCBmYWlsZWQsICIgdGltZXMuIgorICAgICAgICBXUklURSAoKiwqKSAiRGlyZWN0aXZlIGZhaWxlZCB0aGUgdGVzdCAiLCBmYWlsZWQsICIgdGltZXMuIgorICAgICAgICByZXN1bHQgPSBmYWlsZWQgKiAxMDAgLyBOCisgICAgICAgIFdSSVRFICgqLCopICJSZXN1bHQ6IixyZXN1bHQKKyAgICAgIEVORElGCisgICAgICBDQUxMIEVYSVQgKHJlc3VsdCkKKyAgICAgIEVORCBQUk9HUkFNIApkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL3J1bnRlc3QucGwgYi9maW5hbC90ZXN0c3VpdGUvcnVudGVzdC5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNDcyMzUxCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL3J1bnRlc3QucGwKQEAgLTAsMCArMSw1OTIgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIyBydW50ZXN0IFtvcHRpb25zXSBGSUxFTkFNRQorIworIyBSZWFkIHRoZSBmaWxlIEZJTEVOQU1FLiBFYWNoIGxpbmUgY29udGFpbnMgYSB0ZXN0LgorIyBDb252ZXJ0IHRlbXBsYXRlIHRvIHRlc3QgYW5kIGNyb3NzdGVzdC4KKyMgSWYgcG9zc2lsYmxlIGdlbmVyYXRlIG9ycGhhbmVkIHRlc3R2ZXJzaW9ucywgdG9vLgorIyBVc2UgbWFrZSB0byBjb21waWxlIHRoZSB0ZXN0CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEdsb2JhbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBydW50ZXN0c2NyaXB0IGl0c2VsZjoKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgbmFtZSBvZiB0aGUgZ2xvYmFsIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIHRlc3RzdWl0ZToKKyRjb25maWdfZmlsZSAgICA9ICJvbXB0cy5jb25mIjsKKyRsb2dmaWxlICAgICAgICA9ICJvbXB0cy5sb2ciOyAjIG92ZXJ3cml0ZWFibGUgYnkgdmFsdWUgaW4gY29uZmlnIGZpbGUKKyRlbnZfc2V0X3RocmVhZHNfY29tbWFuZCA9ICdPTVBfTlVNX1RIUkVBRFM9JW47IGV4cG9ydCBPTVBfTlVNX1RIUkVBRFM7JzsKKyRkZWJ1Z19tb2RlICAgICA9IDA7CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBBZnRlciB0aGlzIGxpbmUgdGhlIHNjcmlwdCBwYXJ0IGJlZ2lucyEgRG8gbm90IGVkaXQgYW5pdGhpbmcgYmVsb3cKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKworIyBOYW1lc3BhY2VzOgordXNlIEdldG9wdDo6TG9uZzsKKyN1c2UgVW5peDo6UElEOwordXNlIERhdGE6OkR1bXBlcjsKK3VzZSBvbXB0c19wYXJzZXJGdW5jdGlvbnM7CisKKyMgRXh0cmFjdGluZyBnaXZlbiBvcHRpb25zCitHZXRPcHRpb25zKCJoZWxwIiwKKyAgICAgICJsaXN0bGFuZ3VhZ2VzIiwKKyAgICAgICJsYW5nPXMiLAorICAgICAgImxpc3QiLAorICAgICAgInRlc3RpbmZvPXMiLAorICAgICAgIm51bXRocmVhZHM9aSIsCisgICAgICAidGVzdD1zIiwKKyAgICAgICJjb21waWxlISIsCisgICAgICAicnVuISIsCisgICAgICAib3JwaGFuISIsCisgICAgICAicmVzdWx0ZmlsZT1zIgorICAgICAgKTsKKworIyBHZXQgZ2xvYmFsIGNvbmZpZ3VyYXRpbm8gb3B0aW9ucyBmcm9tIGNvbmZpZyBmaWxlOgoraWYoISAtZSAkY29uZmlnX2ZpbGUpeyBlcnJvciAoIkNvdWxkIG5vdCBmaW5kIGNvbmZpZyBmaWxlICRjb25maWdfZmlsZVxuIiwgMSk7fQorb3BlbiAoQ09ORklHLCAiPCRjb25maWdfZmlsZSIpIG9yIGVycm9yICgiQ291bGQgbm90IG9wZW4gY29uZmlnIGZpbGUgJGNvbmZpZ19maWxlXG4iLCAyKTsKK3doaWxlICg8Q09ORklHPikgeyAkY29uZmlnIC49ICRfOyB9CitjbG9zZSAoQ09ORklHKTsKKworKCRsb2dmaWxlKSA9IGdldF90YWdfdmFsdWVzICgibG9nZmlsZSIsICRjb25maWcpOworKCR0aW1lb3V0KSA9IGdldF90YWdfdmFsdWVzICgic2luZ2xldGVzdHRpbWVvdXQiLCAkY29uZmlnKTsKKygkZGlzcGxheV9lcnJvcnMpID0gZ2V0X3RhZ192YWx1ZXMoImRpc3BsYXllcnJvcnMiLCAkY29uZmlnKTsKKygkZGlzcGxheV93YXJuaW5ncykgPSBnZXRfdGFnX3ZhbHVlcyAoImRpc3BsYXl3YXJuaW5ncyIsICRjb25maWcpOworKCRudW10aHJlYWRzKSA9IGdldF90YWdfdmFsdWVzICgibnVtdGhyZWFkcyIsICRjb25maWcpOworKCRlbnZfc2V0X3RocmVhZHNfY29tbWFuZCkgPSBnZXRfdGFnX3ZhbHVlcygiZW52c2V0dGhyZWFkc2NvbW1hbmQiLCRjb25maWcpOworJGVudl9zZXRfdGhyZWFkc19jb21tYW5kID1+IHMvXCVuLyRudW10aHJlYWRzL2c7CitAbGFuZ3VhZ2VzID0gZ2V0X3RhZ192YWx1ZXMgKCJsYW5ndWFnZSIsICRjb25maWcpOworCitpZiAoIWRlZmluZWQoJG9wdF9jb21waWxlKSkgeyRvcHRfY29tcGlsZSA9IDE7fQoraWYgKCFkZWZpbmVkKCRvcHRfcnVuKSkgICAgIHskb3B0X3J1biA9IDE7fQoraWYgKCFkZWZpbmVkKCRvcHRfb3JwaGFuKSkgeyRvcHRfb3JwaGFuID0gMTt9CitpZiAoIWRlZmluZWQoJG9wdF9yZXN1bHRzZmlsZSkpIHsoJG9wdF9yZXN1bHRzZmlsZSkgPSBnZXRfdGFnX3ZhbHVlcygicmVzdWx0c2ZpbGUiLCAkY29uZmlnKTt9CitpZiAoIGRlZmluZWQoJG9wdF9udW10aHJlYWRzKSAmJiAoJG9wdF9udW10aHJlYWRzID4gMCkpIHskbnVtdGhyZWFkcyA9ICRvcHRfbnVtdGhyZWFkczt9CitpZiAoJGRlYnVnX21vZGUpIHsKK3ByaW50IDw8RU9GOworVGVzdHN1aXRlIGNvbmZpZ3VyYXRpb246CitMb2dmaWxlID0gJGxvZ2ZpbGUKK1RpbWVvdXQgPSAkdGltZW91dCBzZWNvbmRzCitMYW5ndWFnZTogICRvcHRfbGFuZworRGlzcGxheSBlcnJvcnM6ICAgJGRpc3BsYXlfZXJyb3JzCitEaXNwbGF5IHdhcm5pbmdzOiAkZGlzcGxheV93YXJuaW5ncworUmVzdWx0c2ZpbGU6ICAgICAgJG9wdF9yZXN1bHRzZmlsZQorTnVtdGhyZWFkczogJG51bXRocmVhZHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRU9GCit9CisKKyRudW1fY29uc3RydWNzICAgID0gMDsKKyRudW1fdGVzdHMgICAgICAgID0gMDsKKyRudW1fZmFpbGVkX3Rlc3RzID0gMDsKKyRudW1fc3VjY2Vzc2Z1bF90ZXN0cyAgID0gMDsKKyRudW1fdmVyaWZpZWRfdGVzdHMgICAgID0gMDsKKyRudW1fZmFpbGVkX2NvbXBpbGF0aW9uID0gMDsKKworJG51bV9ub3JtYWxfdGVzdHNfZmFpbGVkID0gMDsKKyRudW1fbm9ybWFsX3Rlc3RzX2NvbXBpbGVfZXJyb3IgPSAwOworJG51bV9ub3JtYWxfdGVzdHNfdGltZWRfb3V0ID0gMDsKKyRudW1fbm9ybWFsX3Rlc3RzX3N1Y2Nlc3NmdWwgPSAwOworJG51bV9ub3JtYWxfdGVzdHNfdmVyaWZpZWQgPSAwOworCiskbnVtX29ycGhhbmVkX3Rlc3RzX2ZhaWxlZCA9IDA7CiskbnVtX29ycGhhbmVkX3Rlc3RzX2NvbXBpbGVfZXJyb3IgPSAwOworJG51bV9vcnBoYW5lZF90ZXN0c190aW1lZF9vdXQgPSAwOworJG51bV9vcnBoYW5lZF90ZXN0c19zdWNjZXNzZnVsID0gMDsKKyRudW1fb3JwaGFuZWRfdGVzdHNfdmVyaWZpZWQgPSAwOworCitpZiAoJG9wdF9oZWxwKSAgICAgICAgIHsgcHJpbnRfaGVscF90ZXh0ICgpOyAgIGV4aXQgMDsgfQoraWYgKCRvcHRfbGlzdGxhbmd1YWdlcyl7IHByaW50X2F2YWlsX2xhbmdzICgpOyBleGl0IDA7IH0KK2lmICgkb3B0X2xpc3QpICAgICB7IHByaW50X2F2YWlsX3Rlc3RzICgpOyAgIGV4aXQgMDsgfQoraWYgKCRvcHRfdGVzdGluZm8pIHsgcHJpbnRfdGVzdGluZm8gKCk7ICAgICAgZXhpdCAwOyB9CitpZiAoJG9wdF90ZXN0KSAgICAgeyB3cml0ZV9yZXN1bHRfZmlsZV9oZWFkKCk7CisgICAgICAgICAgICAgICAgICAgICBleGVjdXRlX3NpbmdsZV90ZXN0ICgpOyBleGl0IDA7IH0KK2lmICgtZSAkQVJHVlswXSkgICB7IHdyaXRlX3Jlc3VsdF9maWxlX2hlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVfdGVzdGxpc3QoJEFSR1ZbMF0pOyBwcmludF9yZXN1bHRzKCk7CisgICAgICAgICAgICAgICAgICAgICByZXN1bHRfc3VtbWFyeSgpOyBleGl0IDA7fQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBzdWIgZnVuY3Rpb24gZGVmaW5pdGlvbnMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgRnVuY3Rpb24gd2hpY2ggcHJpbnRzIHRoZSByZXN1bHRzIGZpbGUKK3N1YiBwcmludF9yZXN1bHRzCit7CisgICAgc3lzdGVtKCJlY2hvOyBjYXQgJG9wdF9yZXN1bHRzZmlsZTsgZWNobzsiKTsKK30KKworIyBGdW5jdGlvbiB3aGljaCBwcmludHMgYSBzdW1tYXJ5IG9mIGFsbCB0ZXN0CitzdWIgcmVzdWx0X3N1bW1hcnkKK3sKKyAgICBteSAkbnVtX2RpcmVjdGl2ZXMgPSBAdGVzdF9yZXN1bHRzOworCisgICAgcHJpbnQgPDxFT0Y7CisKK1N1bW1hcnk6CitTIE51bWJlciBvZiB0ZXN0ZWQgT3BlbiBNUCBjb25zdHJ1Y3RzOiAkbnVtX2NvbnN0cnVjdHMKK1MgTnVtYmVyIG9mIHVzZWQgdGVzdHM6ICAgICAgICAgICAgICAgICRudW1fdGVzdHMKK1MgTnVtYmVyIG9mIGZhaWxlZCB0ZXN0czogICAgICAgICAgICAgICRudW1fZmFpbGVkX3Rlc3RzCitTIE51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3RzOiAgICAgICAgICAkbnVtX3N1Y2Nlc3NmdWxfdGVzdHMKK1MgKyBmcm9tIHRoaXMgd2VyZSB2ZXJpZmllZDogICAgICAgICAgICRudW1fdmVyaWZpZWRfdGVzdHMKKworTm9ybWFsIHRlc3RzOgorTiBOdW1iZXIgb2YgZmFpbGVkIHRlc3RzOiAgICAgICAgICAgICAgJG51bV9ub3JtYWxfdGVzdHNfZmFpbGVkCitOICsgZnJvbSB0aGlzIGZhaWwgY29tcGlsYXRpb246ICAgICAgICAkbnVtX25vcm1hbF90ZXN0c19jb21waWxlX2Vycm9yCitOICsgZnJvbSB0aGlzIHRpbWVkIG91dCAgICAgICAgICAgICAgICAkbnVtX25vcm1hbF90ZXN0c190aW1lZF9vdXQKK04gTnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHM6ICAgICAgICAgICRudW1fbm9ybWFsX3Rlc3RzX3N1Y2Nlc3NmdWwKK04gKyBmcm9tIHRoaXMgd2VyZSB2ZXJpZmllZDogICAgICAgICAgICRudW1fbm9ybWFsX3Rlc3RzX3ZlcmlmaWVkCisKK09ycGhhbmVkIHRlc3RzOgorTyBOdW1iZXIgb2YgZmFpbGVkIHRlc3RzOiAgICAgICAgICAgICAgJG51bV9vcnBoYW5lZF90ZXN0c19mYWlsZWQKK08gKyBmcm9tIHRoaXMgZmFpbCBjb21waWxhdGlvbjogICAgICAgICRudW1fb3JwaGFuZWRfdGVzdHNfY29tcGlsZV9lcnJvcgorTyArIGZyb20gdGhpcyB0aW1lZCBvdXQgICAgICAgICAgICAgICAgJG51bV9vcnBoYW5lZF90ZXN0c190aW1lZF9vdXQKK08gTnVtYmVyIG9mIHN1Y2Nlc3NmdWwgdGVzdHM6ICAgICAgICAgICRudW1fb3JwaGFuZWRfdGVzdHNfc3VjY2Vzc2Z1bAorTyArIGZyb20gdGhpcyB3ZXJlIHZlcmlmaWVkOiAgICAgICAgICAgJG51bV9vcnBoYW5lZF90ZXN0c192ZXJpZmllZAorRU9GCisKK30KKworIyBGdW5jdGlvbiB0aGF0IGV4ZWN1dGVzdCB0aGUgdGVzdHMgc3BlY2lmaWVkIGluIHRoZSBnaXZlbiBsaXN0CitzdWIgZXhlY3V0ZV90ZXN0bGlzdAoreworICAgIG15ICgkZmlsZW5hbWUpID0gQF87CisgICAgIyBvcGVuaW5nIHRlc3RsaXN0CisgICAgb3BlbihURVNUUywkZmlsZW5hbWUpIG9yIGVycm9yICgiQ291bGQgbm90IG9wZW4gICRmaWxlbmFtZVxuIiwgMSk7CitURVNUOiB3aGlsZSAoPFRFU1RTPikgeworICAgICAgICBpZiAoL15ccyojLykge25leHQgVEVTVDt9CisgICAgICAgIGlmICgvXlxzKiQvKSB7bmV4dCBURVNUO30KKyAgICAgICAgJG9wdF90ZXN0ID0gJF87CisgICAgICAgIGNob21wICgkb3B0X3Rlc3QpOworICAgICAgICBleGVjdXRlX3NpbmdsZV90ZXN0ICgpOworICAgIH0KKyMgcHJpbnQgRHVtcGVyKEB0ZXN0X3Jlc3VsdHMpOworfQorCisjIEZ1bmN0aW9uIHRoYXQgZXhlY3V0ZXMgYSBzeXN0ZW0gY29tbWFuZCBidXQgdGFrZXMgY2FyZSBvZiB0aGUgZ2xvYmFsIHRpbWVvdXQKKyMgSWYgY29tbWFuZCBkaWQgbm90IGZpbmlzaCBpbmJldHdlZW4gcmV0dXJucyAnLScgb3RoZXJ3aXNlIHRoZSBleGl0IHN0YXR1cyBvZgorIyB0aGUgc3lzdGVtIGNvbW1hbmQKK3N1YiB0aW1lZF9zeXNfY29tbWFuZAoreworICAgIG15ICgkY29tbWFuZCkgPSBAXzsKKyAgICBteSAkZXhpdF9zdGF0dXMgPSAnLSc7CisKKyMgc2V0IHVwIHRoZSB0aW1lb3V0IGZvciB0aGUgY29tbWFuZAorICAgIGV2YWwgeworICAgICAgICBsb2NhbCAkU0lHe0FMUk19ID0gc3ViIHtkaWUgImFsYXJtXG4ifTsKKyAgICAgICAgYWxhcm0gJHRpbWVvdXQ7CisgICAgICAgIGxvZ19tZXNzYWdlX2FkZCAoIlN0YXJ0aW5nIGNvbW1hbmQgXCIkY29tbWFuZFwiIik7CisgICAgICAgICRleGl0X3N0YXR1cyA9IHN5c3RlbSAoJGNvbW1hbmQpOworICAgICAgICBhbGFybSAwOworICAgIH07CisjIGNoZWNrIGlmIGNvbW1hbmQgZmluaXNoZWQgZHVyaW5nIHRoZSBtYXhpbXVtIGV4ZWN1dGlvbiB0aW1lCisgICAgaWYgKCRAIGVxICJhbGFybVxuIikgeworIyB0ZXN0IHRpbWVkIG91dAorIwkJbXkgJHBpZCA9IFVuaXg6OlBJRC0+bmV3KCk7CisjCQkkcGlkLT5nZXRfcGlkb2YoJGNvbW1hbmQsIDEpOworIwkJJHBpZC0+a2lsbCgpOworICAgICAgICBpZiAoJGRlYnVnX21vZGUpIHsKKwkgICAgbG9nX21lc3NhZ2VfYWRkICgiQ29tbWFuZCBcIiRjb21tYW5kXCIgcmVhY2hlZCBtYXggZXhlY3V0aW9uIHRpbWUuXG4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIlRPIjsKKyAgICB9CisjIHRlc3QgZmluaXNoZWQKKyAgICByZXR1cm4gJGV4aXRfc3RhdHVzOworfQorCisjIEZ1bmN0aW9uIHRoYXQgcnVucyB0aGUgdGVzdHMgZ2l2ZW4gYXMgYSBhcnJheSBjb250YWluaW5nIHRoZSB0ZXN0bmFtZXMKKyMgUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBwZXJjZW50IHZhbHVlcyBvZiB0aGUgcGFzc2VkIHRlc3RzIGFuZCB0aGUKKyMgc3VjY2Vzc2Z1bCBjcm9zc3Rlc3RzLgorc3ViIHJ1bl90ZXN0Cit7CisgICAgbXkgKCR0ZXN0bmFtZSwgJG9ycGhhbikgPSBAXzsKKyAgICBteSAkYmluX25hbWUsICRjYmluX25hbWU7CisgICAgbXkgJGNtZCwgJGV4aXRfc3RhdHVzLCAkZmFpbGVkOworICAgIG15ICRyZXN1bHR0ZXN0LCAkcmVzdWx0Y3Rlc3Q7CisKKyMgcGF0aCB0byB0ZXN0IGFuZCBjcm9zc3Rlc3QgZWl0aGVyIGluIG5vcm1hbCBvciBpbiBvcnBoYW5lZCB2ZXJzaW9uCisgICAgaWYgKCRvcnBoYW4pIHsKKyAgICAgICAgJGJpbl9uYW1lICA9ICJiaW4vJG9wdF9sYW5nL29ycGhfdGVzdF8kdGVzdG5hbWUiOworICAgICAgICAkY2Jpbl9uYW1lID0gImJpbi8kb3B0X2xhbmcvb3JwaF9jdGVzdF8kdGVzdG5hbWUiOworICAgIH0gZWxzZSB7CisgICAgICAgICRiaW5fbmFtZSAgPSAiYmluLyRvcHRfbGFuZy90ZXN0XyR0ZXN0bmFtZSI7CisgICAgICAgICRjYmluX25hbWUgPSAiYmluLyRvcHRfbGFuZy9jdGVzdF8kdGVzdG5hbWUiOworICAgIH0KKyMgQ2hlY2sgaWYgZXhlY3V0YWJsZXMgZXhpc3QKKyAgICBpZiAoISAtZSAkYmluX25hbWUpIHsKKyAgICAgICAgdGVzdF9lcnJvciAoIkNvdWxkIG5vdCBmaW5kIGV4ZWN1dGFibGUgXCIkYmluX25hbWVcIi4iKTsKKyAgICAgICAgcmV0dXJuICgndGVzdCcgPT4gJy0nLCAnY3Jvc3N0ZXN0JyA9PiAnLScpOworICAgIH0KKyMgcnVuIHRoZSB0ZXN0CisgICAgJGNtZCA9ICIkZW52X3NldF90aHJlYWRzX2NvbW1hbmQgLi8kYmluX25hbWUgPiRiaW5fbmFtZS5vdXQiOworICAgIHByaW50ICJSdW5uaW5nIHRlc3Qgd2l0aCAkbnVtdGhyZWFkcyB0aHJlYWRzIC4iOworICAgICRleGl0X3N0YXR1cyA9IHRpbWVkX3N5c19jb21tYW5kICgkY21kKTsKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDaGVjayBpZiB0ZXN0IGZpbmlzaGVkIHdpdGhpbiBtYXggZXhlY3V0aW9uIHRpbWUKKyAgICBpZiAoJGV4aXRfc3RhdHVzIGVxICdUTycpIHsKKyAgICAgICAgcHJpbnQgIi4uLi4gZmFpbGVkICh0aW1lb3V0KVxuIjsKKyAgICAgICAgcmV0dXJuICgndGVzdCcgPT4gJ1RPJywgJ2Nyb3NzdGVzdCcgPT4gJy0nKQorICAgIH0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBjaGVjayBpZiBhbGwgdGVzdHMgd2VyZSBzdWNjZXNzZnVsCisgICAgJGZhaWxlZCA9ICRleGl0X3N0YXR1cyA+PiA4OworICAgIGlmICgkZmFpbGVkIDwgMCBvciAkZmFpbGVkID4gMTAwKSB7ICRmYWlsZWQgPSAxMDA7IH0KKyAgICAkcmVzdWx0dGVzdCA9IDEwMCAtICRmYWlsZWQ7CisgICAgaWYgKCRyZXN1bHR0ZXN0IGVxIDEwMCkgeworICAgICAgICBwcmludCAiLi4uLiBzdWNjZXNzIC4uLiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnQgIi4uLi4gZmFpbGVkICRmYWlsZWRcJSBvZiB0aGUgdGVzdHNcbiI7CisgICAgICAgIHJldHVybiAoJ3Rlc3QnID0+ICRyZXN1bHR0ZXN0LCAnY3Jvc3N0ZXN0JyA9PiAnLScpOworICAgIH0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRvIGNyb3NzdGVzdAorIyBjaGVjayBpZiBleGVjdXRhYmxlIGV4aXN0CisgICAgaWYgKCEgLWUgJGNiaW5fbmFtZSkgeworICAgICAgICB0ZXN0X2Vycm9yICgiQ291bGQgbm90IGZpbmQgZXhlY3V0YWJsZSBcIiRjYmluX25hbWVcIi4iKTsKKyAgICAgICAgcHJpbnQgIi4uLiBub3QgdmVyaWZpZWQgKGNyb3NzdGVzdCBtaXNzaW5nKVxuIjsKKyAgICAgICAgcmV0dXJuICgndGVzdCcgPT4gJHJlc3VsdHRlc3QsICdjcm9zc3Rlc3QnID0+ICctJyk7CisgICAgfQorIyBydW4gY3Jvc3N0ZXN0CisjIFRlc3Qgd2FzIHN1Y2Nlc3NmdWwsIHNvIGl0IG1ha2VzIHNlbnNlIHRvIHJ1biB0aGUgY3Jvc3N0ZXN0CisgICAgJGNtZCA9ICIkZW52X3NldF90aHJlYWRzX2NvbW1hbmQgLi8kY2Jpbl9uYW1lID4gJGNiaW5fbmFtZS5vdXQiOworICAgICRleGl0X3N0YXR1cyA9IHRpbWVkX3N5c19jb21tYW5kICgkY21kKTsKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDaGVjayBpZiBjcm9zc3Rlc3QgZmluaXNoZWQgd2l0aGluIG1heCBleGVjdXRpb24gdGltZQorICAgIGlmICgkZXhpdF9zdGF0dXMgZXEgJ1RPJykgeworICAgICAgICBwcmludCAiLi4uIG5vdCB2ZXJpZmllZCAodGltZW91dClcbiI7CisgICAgICAgIHJldHVybiAoJ3Rlc3QnID0+ICRyZXN1bHQsICdjcm9zc3Rlc3QnID0+ICdUTycpOworICAgIH0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyB0ZXN0IGlmIGNyb3NzdGVzdHMgZmFpbGVkIGFzIGV4cGVjdGVkCisgICAgJHJlc3VsdGN0ZXN0ID0gJGV4aXRfc3RhdHVzID4+IDg7CisgICAgaWYgKCRyZXN1bHRjdGVzdCA+IDApIHsKKyAgICAgICAgcHJpbnQgIi4uLiBhbmQgdmVyaWZpZWQgd2l0aCAkcmVzdWx0Y3Rlc3RcJSBjZXJ0YWludHlcbiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnQgIi4uLiBidXQgbWlnaHQgYmUgbHVja3lcbiI7CisgICAgfQorICAgIHJldHVybiAoJ3Rlc3QnID0+ICRyZXN1bHR0ZXN0LCAnY3Jvc3N0ZXN0JyA9PiAkcmVzdWx0Y3Rlc3QpOworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCit9CisKKyMgRnVuY3Rpb24gdGhhdCBnZW5lcmF0ZXMgdGhlIHRlc3QgYmluYXJpZXMgb3V0IG9mIHRoZSBzb3VyY2Vjb2RlCitzdWIgY29tcGlsZV9zcmMKK3sKKyAgICBteSAoJHRlc3RuYW1lLCAkb3JwaGFuKSA9IEBfOworICAgIHByaW50ICJDb21waWxpbmcgc291cmVzIC4uLi4uLi4uLi4uLiI7CisgICAgaWYgKCRvcnBoYW4pIHsKKyMgTWFrZSBvcnBoYW5lZCB0ZXN0cworICAgICAgICAkZXhlY19uYW1lICAgICA9ICJiaW4vJG9wdF9sYW5nL29ycGhfdGVzdF8kdGVzdG5hbWUiOworICAgICAgICAkY3Jvc3NleGVfbmFtZSA9ICJiaW4vJG9wdF9sYW5nL29ycGhfY3Rlc3RfJHRlc3RuYW1lIjsKKyAgICAgICAgJHJlc3VsdHRlc3QgID0gc3lzdGVtICgibWFrZSAkZXhlY19uYW1lID4gJGV4ZWNfbmFtZVxfY29tcGlsZS5sb2ciICk7CisgICAgICAgICRyZXN1bHRjdGVzdCA9IHN5c3RlbSAoIm1ha2UgJGNyb3NzZXhlX25hbWUgPiAkY3Jvc3NleGVfbmFtZVxfY29tcGlsZS5sb2ciICk7CisgICAgfSBlbHNlIHsKKyMgTWFrZSB0ZXN0CisgICAgICAgICRleGVjX25hbWUgICAgID0gImJpbi8kb3B0X2xhbmcvdGVzdF8kdGVzdG5hbWUiOworICAgICAgICAkY3Jvc3NleGVfbmFtZSA9ICJiaW4vJG9wdF9sYW5nL2N0ZXN0XyR0ZXN0bmFtZSI7CisgICAgICAgICRyZXN1bHR0ZXN0ICA9IHN5c3RlbSAoIm1ha2UgJGV4ZWNfbmFtZSA+ICRleGVjX25hbWVcX2NvbXBpbGUubG9nIiApOworICAgICAgICAkcmVzdWx0Y3Rlc3QgPSBzeXN0ZW0gKCJtYWtlICRjcm9zc2V4ZV9uYW1lID4gJGNyb3NzZXhlX25hbWVcX2NvbXBpbGUubG9nIiApOworICAgIH0KKyAgICBpZiAoJHJlc3VsdHRlc3QpIHsgdGVzdF9lcnJvciAoIkNvbXBpbGF0aW9uIG9mIHRoZSB0ZXN0IGZhaWxlZC4iKTsgfQorICAgIGlmICgkcmVzdWx0Y3Rlc3QpeyB0ZXN0X2Vycm9yICgiQ29tcGlsYXRpb24gb2YgdGhlIGNyb3NzdGVzdCBmYWlsZWQuIik7IH0KKworICAgIGlmICgkcmVzdWx0dGVzdCBvciAkcmVzdWx0Y3Rlc3QpIHsKKyAgICAgICAgcHJpbnQgIi4uLi4gZmFpbGVkXG4iOworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludCAiLi4uLiBzdWNjZXNzXG4iOworICAgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKKyMgRnVuY3Rpb24gd2hpY2ggcHJlcGFyZSB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZToKK3N1YiBpbml0X2RpcmVjdG9yeV9zdHJ1Y3R1cmUKK3sKKyAgICBteSAoJGxhbmd1YWdlKSA9IEBfOworICAgIGlmICgtZSAiYmluIiAmJiAtZCAiYmluIikgeyB3YXJuaW5nICgiT2xkIGJpbmFyeSBkaXJlY3RvcnkgZGV0ZWN0ZWQhIik7fQorICAgIGVsc2UgeyBzeXN0ZW0gKCJta2RpciBiaW4iKTsgfQorICAgIGlmICgtZSAiYmluLyRsYW5ndWFnZSIgJiYgLWQgImJpbi8kbGFuZ3VhZ2UiKSB7CisgICAgICAgIHdhcm5pbmcgKCJPbGQgYmluYXJ5IGRpcmVjdG9yeSBmb3IgbGFuZ3VhZ2UgJGxhbmd1YWdlIGZvdW5kLiIpO30KKyAgICBlbHNlIHsgc3lzdGVtICgibWtkaXIgYmluLyRsYW5ndWFnZSIpOyB9Cit9CisKKyMgRnVuY3Rpb24gdGhhdCBnZW5lcmF0ZXMgdGhlIHNvdXJjZWNvZGUgZm9yIHRoZSBnaXZlbiB0ZXN0CitzdWIgbWFrZV9zcmMKK3sKKyAgICBteSAoJHRlc3RuYW1lLCAkb3JwaGFuKSA9IEBfOworICAgIG15ICR0ZW1wbGF0ZV9maWxlOworICAgIG15ICRzcmNfbmFtZTsKKworICAgICR0ZW1wbGF0ZV9maWxlID0gIiRkaXIvJHRlc3RuYW1lLiRleHRlbnNpb24iOworICAgIGlmICghLWUgJHRlbXBsYXRlX2ZpbGUpIHsgdGVzdF9lcnJvciAoIkNvdWxkIG5vdCBmaW5kIHRlbXBsYXRlIGZvciBcIiR0ZXN0bmFtZVwiIik7IH0KKworICAgIHByaW50ICJHZW5lcmF0aW5nIHNvdXJjZXMgLi4uLi4uLi4uLiI7CisgICAgaWYgKCRvcnBoYW4pIHsKKyMgTWFrZSBvcnBoYW5lZCB0ZXN0cworICAgICAgICAkc3JjX25hbWUgPSAiYmluLyRvcHRfbGFuZy9vcnBoX3Rlc3RfJHRlc3RuYW1lLiRleHRlbnNpb24iOworICAgICAgICAkcmVzdWx0dGVzdCA9IHN5c3RlbSAoIi4vJHRlbXBsYXRlcGFyc2VybmFtZSAtLXRlc3QgLS1vcnBoYW4gJHRlbXBsYXRlX2ZpbGUgJHNyY19uYW1lIik7CisgICAgICAgICRzcmNfbmFtZSA9ICJiaW4vJG9wdF9sYW5nL29ycGhfY3Rlc3RfJHRlc3RuYW1lLiRleHRlbnNpb24iOworICAgICAgICAkcmVzdWx0Y3Rlc3QgPSBzeXN0ZW0gKCIuLyR0ZW1wbGF0ZXBhcnNlcm5hbWUgLS1jcm9zc3Rlc3QgLS1vcnBoYW4gJHRlbXBsYXRlX2ZpbGUgJHNyY19uYW1lIik7CisgICAgfSBlbHNlIHsKKyMgTWFrZSB0ZXN0CisgICAgICAgICRzcmNfbmFtZSA9ICJiaW4vJG9wdF9sYW5nL3Rlc3RfJHRlc3RuYW1lLiRleHRlbnNpb24iOworICAgICAgICAkcmVzdWx0dGVzdCA9IHN5c3RlbSAoIi4vJHRlbXBsYXRlcGFyc2VybmFtZSAtLXRlc3QgLS1ub29ycGhhbiAkdGVtcGxhdGVfZmlsZSAkc3JjX25hbWUiKTsKKyAgICAgICAgJHNyY19uYW1lID0gImJpbi8kb3B0X2xhbmcvY3Rlc3RfJHRlc3RuYW1lLiRleHRlbnNpb24iOworICAgICAgICAkcmVzdWx0Y3Rlc3QgPSBzeXN0ZW0gKCIuLyR0ZW1wbGF0ZXBhcnNlcm5hbWUgLS1jcm9zc3Rlc3QgLS1ub29ycGhhbiAkdGVtcGxhdGVfZmlsZSAkc3JjX25hbWUiKTsKKyAgICB9CisgICAgaWYgKCRyZXN1bHR0ZXN0KSB7IHRlc3RfZXJyb3IgKCJHZW5lcmF0aW9uIG9mIHNvdXJjZWNvZGUgZm9yIHRoZSB0ZXN0IGZhaWxlZC4iKTsgfQorICAgIGlmICgkcmVzdWx0Y3Rlc3QpeyB0ZXN0X2Vycm9yICgiR2VuZXJhdGlvbiBvZiBzb3VyY2Vjb2RlIGZvciB0aGUgY3Jvc3N0ZXN0IGZhaWxlZC4iKTsgfQorCisgICAgaWYgKCRyZXN1bHR0ZXN0IG9yICRyZXN1bHRjdGVzdCkgeworICAgICAgICBwcmludCAiLi4uLiBmYWlsZWRcbiI7CisgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICBwcmludCAiLi4uLiBzdWNjZXNzXG4iOworICAgICAgIHJldHVybiAxOworICAgIH0KK30KKworIyBGdW5jdGlvbiB3aGljaCBjaGVja3MgaWYgYSBnaXZlbiB0ZXN0IGlzIG9ycGhhbmFibGUKK3N1YiB0ZXN0X2lzX29ycGhhbmFibGUKK3sKKyAgICBteSAoJHRlc3RuYW1lKSA9IEBfOworICAgIG15ICRzcmM7CisgICAgbXkgJGZpbGUgPSAiJGRpci8kdGVzdG5hbWUuJGV4dGVuc2lvbiI7CisgICAgaWYoISAtZSAkZmlsZSl7IHRlc3RfZXJyb3IgKCJDb3VsZCBub3QgZmluZCB0ZXN0IGZpbGUgJGZpbGVcbiIpO30KKyAgICBvcGVuIChURVNULCAiPCRmaWxlIikgb3IgdGVzdF9lcnJvciAoIkNvdWxkIG5vdCBvcGVuIHRlc3QgZmlsZSAkZmlsZVxuIik7CisgICAgd2hpbGUgKDxURVNUPikgeyAkc3JjIC49ICRfOyB9CisgICAgY2xvc2UgKFRFU1QpOworICAgIHJldHVybiAkc3JjID1+L29tcHRzOm9ycGhhbi87Cit9CisKK3N1YiB3cml0ZV9yZXN1bHRfZmlsZV9oZWFkCit7CisgICAgb3BlbiAoUkVTVUxUUywgIj4kb3B0X3Jlc3VsdHNmaWxlIikgb3IgZXJyb3IgKCJDb3VsZCBub3Qgb3BlbiBmaWxlICckb3B0X3Jlc3VsdHNmaWxlJyB0byB3cml0ZSByZXN1bHRzLiIsIDEpOworICAgICRyZXN1bHRsaW5lID0gc3ByaW50ZiAiJS0yNXMgJS1zXG4iLCAiI1Rlc3RlZCBEaXJlY3RpdmUiLCAiXHR0XHRjdFx0b3RcdG9jdCI7CisgICAgcHJpbnQgUkVTVUxUUyAkcmVzdWx0bGluZTsKK30KKworIyBGdW5jdGlvbiB3aGljaCBhZGRzIGEgcmVzdWx0IHRvIHRoZSBsaXN0IG9mIHJlc3VsdHMKK3N1YiBhZGRfcmVzdWx0Cit7CisgICAgbXkgKCR0ZXN0bmFtZSwgJHJlc3VsdCkgPSBAXzsKKyMJcHJpbnQgRHVtcGVyKEB7JHJlc3VsdH0pOworCisgICAgJG51bV9jb25zdHJ1Y3RzKys7CisKKyAgICBvcGVuIChSRVNVTFRTLCAiPj4kb3B0X3Jlc3VsdHNmaWxlIikgb3IgZXJyb3IgKCJDb3VsZCBub3Qgb3BlbiBmaWxlICckb3B0X3Jlc3VsdHNmaWxlJyB0byB3cml0ZSByZXN1bHRzLiIsIDEpOworCisgICAgaWYgKCR7JHJlc3VsdH1bMF1bMF0pIHsKKwkJJG51bV90ZXN0cyArKzt9CisKKwlpZiAoJG9wdF9jb21waWxlIGFuZCAkeyRyZXN1bHR9WzBdWzFdIGVxIDApIHsKKwkJJHskcmVzdWx0fVswXVsyXXt0ZXN0fSAgICAgID0gJ2NlJzsKKwkJJHskcmVzdWx0fVswXVsyXXtjcm9zc3Rlc3R9ID0gJy0nOworCQkkbnVtX25vcm1hbF90ZXN0c19jb21waWxlX2Vycm9yKys7CisJICAgICRudW1fbm9ybWFsX3Rlc3RzX2ZhaWxlZCsrOworCX0KKworICAgIGlmICgkb3B0X3J1biBhbmQgJHskcmVzdWx0fVswXVsyXSBhbmQgJHskcmVzdWx0fVswXVsyXXt0ZXN0fSBuZSAnY2UnKSB7CisgICAgICAgIGlmICgkeyRyZXN1bHR9WzBdWzJde3Rlc3R9ID09IDEwMCkgeworICAgICAgICAgICAgJG51bV9ub3JtYWxfdGVzdHNfc3VjY2Vzc2Z1bCsrOworICAgICAgICAgICAgaWYgKCR7JHJlc3VsdH1bMF1bMl17Y3Jvc3N0ZXN0fSA9PSAxMDApeworCQkJCSRudW1fbm9ybWFsX3Rlc3RzX3ZlcmlmaWVkKys7fQorCQl9IGVsc2lmICgkeyRyZXN1bHR9WzBdWzJde3Rlc3R9IGVxICdUTycpeworCQkJJG51bV9ub3JtYWxfdGVzdHNfdGltZWRfb3V0Kys7CisJCQkkbnVtX25vcm1hbF90ZXN0c19mYWlsZWQrKzsKKwkJfSBlbHNlIHsKKwkJCSRudW1fbm9ybWFsX3Rlc3RzX2ZhaWxlZCsrOworCQl9CisgICAgfQorICAgICRyZXN1bHRsaW5lID0gIiR7JHJlc3VsdH1bMF1bMl17dGVzdH1cdCR7JHJlc3VsdH1bMF1bMl17Y3Jvc3N0ZXN0fVx0IjsKKworICAgIGlmICgkeyRyZXN1bHR9WzFdWzBdKSB7CisJCSRudW1fdGVzdHMgKys7fQorICAgIGVsc2UgeyAkcmVzdWx0bGluZSAuPSAiLVx0LVxuIjsgfQorCisgICAgaWYgKCRvcHRfY29tcGlsZSBhbmQgJHskcmVzdWx0fVsxXVsxXSBlcSAwKSB7CisJCSR7JHJlc3VsdH1bMV1bMl17dGVzdH0gICAgICA9ICdjZSc7CisJCSR7JHJlc3VsdH1bMV1bMl17Y3Jvc3N0ZXN0fSA9ICctJzsKKwkJJG51bV9vcnBoYW5lZF90ZXN0c19jb21waWxlX2Vycm9yKys7CisJCSRudW1fb3JwaGFuZWRfdGVzdHNfZmFpbGVkKys7CisJfQorCisgICAgaWYgKCRvcHRfcnVuIGFuZCAkeyRyZXN1bHR9WzFdWzJdIGFuZCAkeyRyZXN1bHR9WzFdWzJde3Rlc3R9IG5lICdjZScpIHsKKyAgICAgICAgaWYgKCR7JHJlc3VsdH1bMV1bMl17dGVzdH0gPT0gMTAwKSB7CisgICAgICAgICAgICAkbnVtX29ycGhhbmVkX3Rlc3RzX3N1Y2Nlc3NmdWwrKzsKKyAgICAgICAgICAgIGlmICgkeyRyZXN1bHR9WzFdWzJde2Nyb3NzdGVzdH0gPT0gMTAwKXsKKwkJCQkkbnVtX29ycGhhbmVkX3Rlc3RzX3ZlcmlmaWVkKys7fQorCQl9IGVsc2lmICgkeyRyZXN1bHR9WzFdWzJde3Rlc3R9IGVxICdUTycpeworCQkJJG51bV9vcnBoYW5lZF90ZXN0c190aW1lZF9vdXQrKzsKKwkJCSRudW1fb3JwaGFuZWRfdGVzdHNfZmFpbGVkKys7CisgICAgICAgIH0gZWxzZSB7CisJCQkkbnVtX29ycGhhbmVkX3Rlc3RzX2ZhaWxlZCsrOworCQl9CisgICAgfQorICAgICRyZXN1bHRsaW5lIC49ICIkeyRyZXN1bHR9WzFdWzJde3Rlc3R9XHQkeyRyZXN1bHR9WzFdWzJde2Nyb3NzdGVzdH1cbiI7CisKKyAgICAkbnVtX2ZhaWxlZF90ZXN0cyA9ICRudW1fbm9ybWFsX3Rlc3RzX2ZhaWxlZCArICRudW1fb3JwaGFuZWRfdGVzdHNfZmFpbGVkOworCSRudW1fZmFpbGVkX2NvbXBpbGF0aW9uID0gJG51bV9ub3JtYWxfdGVzdHNfY29tcGlsZV9lcnJvciArICRudW1fb3JwaGFuZWRfdGVzdHNfY29tcGlsZV9lcnJvcjsKKwkkbnVtX3N1Y2Nlc3NmdWxfdGVzdHMgPSAkbnVtX25vcm1hbF90ZXN0c19zdWNjZXNzZnVsICsgJG51bV9vcnBoYW5lZF90ZXN0c19zdWNjZXNzZnVsOworCSRudW1fdmVyaWZpZWRfdGVzdHMgPSAkbnVtX25vcm1hbF90ZXN0c192ZXJpZmllZCArICRudW1fb3JwaGFuZWRfdGVzdHNfdmVyaWZpZWQ7CisKKyAgICAkcmVzdWx0bGluZTIgPSBzcHJpbnRmICIlLTI1cyAlLXMiLCAiJHRlc3RuYW1lIiwgIlx0JHJlc3VsdGxpbmUiOworICAgIHByaW50IFJFU1VMVFMgJHJlc3VsdGxpbmUyOworfQorCisjIEZ1bmN0aW9uIHdoaWNoIGV4ZWN1dGVzIGEgc2luZ2xlIHRlc3QKK3N1YiBleGVjdXRlX3NpbmdsZV90ZXN0Cit7CisgICAgbXkgQHJlc3VsdDsKKyAgICBpbml0X2xhbmd1YWdlX3NldHRpbmdzICgkb3B0X2xhbmcpOworICAgIGluaXRfZGlyZWN0b3J5X3N0cnVjdHVyZSAoJG9wdF9sYW5nKTsKKyAgICBsb2dfbWVzc2FnZV9hZGQgKCJUZXN0aW5nIGZvciBcIiRvcHRfdGVzdFwiOiIpOworICAgIHByaW50ICJUZXN0aW5nIGZvciBcIiRvcHRfdGVzdFwiOlxuIjsKKyMgdGVzdHMgaW4gbm9ybWFsIG1vZGUKKyAgICBpZiAoJG9wdF9jb21waWxlKXsgJHJlc3VsdFswXVswXSA9IG1ha2Vfc3JjICgkb3B0X3Rlc3QsIDApOworICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0WzBdWzFdID0gY29tcGlsZV9zcmMgKCRvcHRfdGVzdCwgMCk7fQorICAgIGlmICgkb3B0X3J1biAmJiAkcmVzdWx0WzBdWzFdID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdFswXVsyXSA9IHtydW5fdGVzdCAoJG9wdF90ZXN0LCAwKX07fQorIyB0ZXN0cyBpbiBvcnBoYW5lZCBtb2RlCisgICAgaWYgKCRvcHRfb3JwaGFuICYmIHRlc3RfaXNfb3JwaGFuYWJsZSgkb3B0X3Rlc3QpKXsKKyAgICAgICAgbG9nX21lc3NhZ2VfYWRkICgiVGVzdGluZyBmb3IgXCIkb3B0X3Rlc3RcIiBpbiBvcnBoYW5lZCBtb2RlOiIpOworICAgICAgICBwcmludCAiKyBvcnBoYW5lZCBtb2RlOlxuIjsKKyAgICAgICAgaWYgKCRvcHRfY29tcGlsZSkgeyAkcmVzdWx0WzFdWzBdID0gbWFrZV9zcmMgKCRvcHRfdGVzdCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdFsxXVsxXSA9IGNvbXBpbGVfc3JjICgkb3B0X3Rlc3QsIDEpO30KKyAgICAgICAgaWYgKCRvcHRfcnVuICYmICRyZXN1bHRbMV1bMV0gPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHRbMV1bMl0gPSB7cnVuX3Rlc3QgKCRvcHRfdGVzdCwgMSl9O30KKyAgICB9CisgICAgYWRkX3Jlc3VsdCgkb3B0X3Rlc3QsIFxAcmVzdWx0KTsKK30KKworIyBGdW5jdGlvbiB0aGF0IHByaW50cyBpbmZvIGFib3V0IGEgZ2l2ZW4gdGVzdAorc3ViIHByaW50X3Rlc3RpbmZvCit7CisgICAgaW5pdF9sYW5ndWFnZV9zZXR0aW5ncygkb3B0X2xhbmcpOworICAgIG15ICRkb2MgPSAiIjsKKyAgICBteSAkZmlsZSA9ICRkaXIuIi8iLiRvcHRfdGVzdGluZm8uIi4iLiRleHRlbnNpb247CisgICAgaWYgKCEgLWUgJGZpbGUpIHtlcnJvciAoIkNvdWxkIG5vdCBmaW5kIHRlbXBsYXRlIGZvciB0ZXN0ICRvcHRfdGVzdGluZm8iLCA1KTt9CisgICAgb3BlbiAoVEVTVCwiPCRmaWxlIikgb3IgZXJyb3IgKCJDb3VsZCBub3Qgb3BlbiB0ZW1wbGF0ZSBmaWxlIFwiJGZpbGVcIiBmb3IgdGVzdCAkb3B0X3Rlc3RpbmZvIiwgNik7CisgICAgd2hpbGUgKDxURVNUPikgeyRkb2MgLj0gJF87fQorICAgIGNsb3NlIChURVNUKTsKKworICAgIChteSAkb21wX3ZlcnNpb24pID0gZ2V0X3RhZ192YWx1ZXMgKCJvbXB0czpvbXB2ZXJzaW9uIiwgJGRvYyk7CisgICAgKG15ICRkZXBlbmRlbmNlcykgPSBnZXRfdGFnX3ZhbHVlcyAoIm9tcHRzOmRlcGVuZGVuY2VzIiwgJGRvYyk7CisgICAgKG15ICRkZXNjcmlwdGlvbikgPSBnZXRfdGFnX3ZhbHVlcyAoIm9tcHRzOnRlc3RkZXNjcmlwdGlvbiIsICRkb2MpOworICAgIG15ICRvcnBoYW5hYmxlID0gJ25vJzsKKyAgICBpZiAoJGRvYyA9fiAvb21wdHM6b3JwaGFuLykgeyRvcnBoYW5hYmxlID0gJ3llcyc7fQorICAgIHByaW50IDw8RU9GOworSW5mbyBmb3IgdGVzdCAkb3B0X3Rlc3RpbmZvOgorT3BlbiBNUCBzdGFuZGFyZDogJG9tcF92ZXJzaW9uCitPcnBoYW5lZCBtb2RlOiAkb3JwaGFuYWJsZQorRGVwZW5kZW5jaWVzOiAgJGRlcGVuZGVuY2VzCitEZXNjcmlwdGlvbjogICAkZGVzY3JpcHRpb24KK0VPRgorfQorCisjIEZ1bmN0aW9uIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIHNldHRpbmdzIGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2UKK3N1YiBpbml0X2xhbmd1YWdlX3NldHRpbmdzCit7CisgICAgbXkgKCRsYW5ndWFnZSkgPSBAXzsKKyAgICBmb3JlYWNoIG15ICRsYW5nIChAbGFuZ3VhZ2VzKSB7CisgICAgICAgIChteSAkbmFtZSkgPSBnZXRfdGFnX3ZhbHVlcyAoImxhbmd1YWdlbmFtZSIsICRsYW5nKTsKKyAgICAgICAgaWYgKCRuYW1lIGVxICRsYW5ndWFnZSkgeworICAgICAgICAgICAgKCRleHRlbnNpb24pID0gZ2V0X3RhZ192YWx1ZXMgKCJmaWxlZXh0ZW5zaW9uIiwgJGxhbmcpOworICAgICAgICAgICAgKCRkaXIpICAgICAgID0gZ2V0X3RhZ192YWx1ZXMgKCJkaXIiLCAkbGFuZyk7CisgICAgICAgICAgICAoJHRlbXBsYXRlcGFyc2VybmFtZSkgPSBnZXRfdGFnX3ZhbHVlcyAoInRlbXBsYXRlcGFyc2VybmFtZSIsICRsYW5nKTsKKyAgICAgICAgICAgIGxhc3Q7CisgICAgICAgIH0KKyAgICB9CisgICAgIyBDaGVjayBpZiB3ZSBmb3VuZCB0aGUgc3BlY2lmaWVkIGxhbmd1YWdlIGluIHRoZSBjb25maWcgZmlsZQorICAgIGlmICghJGV4dGVuc2lvbiBhbmQgISRkaXIpIHsKKyAgICAgIGVycm9yICgiTGFuZ3VhZ2UgJGxhbmd1YWdlIGNvdWxkIG5vdCBiZSBmb3VuZC5cbiIsIDMpOworICAgIH0KK30KKworCisKKyMgRnVuY3Rpb24gdGhhdCBwcmludHMgYWxsIGF2YWlsYWJsZSB0ZXN0cyBmb3IgdGhlIGdpdmVuIGxhbmd1YWdlCitzdWIgcHJpbnRfYXZhaWxfdGVzdHMKK3sKKyAgICBpbml0X2xhbmd1YWdlX3NldHRpbmdzKCRvcHRfbGFuZyk7CisgICAgbXkgQHRlc3RzOworICAgIG9wZW5kaXIoRElSLCIkZGlyIikgb3IgZXJyb3IgKCJDb3VsZCBub3Qgb3BlbiBkaXJlY3RvcnkgJGRpciIsIDQpOworICAgIHdoaWxlKCRfID0gcmVhZGRpcihESVIpKSB7IGlmICgvXC4kZXh0ZW5zaW9uJC8pIHtzL1wuJGV4dGVuc2lvbi8vOyBwdXNoIChAdGVzdHMsICRfKTt9fQorICAgIGNsb3NlZGlyKERJUik7CisgICAgcHJpbnQgIkZvdW5kICIuKEB0ZXN0cykuIiB0ZXN0czpcbiIuICItIiB4IDMwIC4gIlxuIjsKKyAgICBmb3JlYWNoIChAdGVzdHMpIHsgcHJpbnQgJF8uIlxuIjt9Cit9CisKKyMgRnVuY3Rpb24gdGhhdCBwcmludHMgYWxsIGF2YWlsYWJsZSB0ZXN0cyBmb3IgdGhlIGdpdmVuIGxhbmd1YWdlCitzdWIgcHJpbnRfYXZhaWxfbGFuZ3MKK3sKKyAgICBpZiAoQGxhbmd1YWdlcyA+IDApIHsKKyAgICAgICAgcHJpbnQgIkF2YWlsYWJsZSBsYW5ndWFnZXM6XG4iOworICAgICAgICBmb3JlYWNoIChAbGFuZ3VhZ2VzKSB7CisgICAgICAgICAgICAobXkgJG5hbWUpID0gZ2V0X3RhZ192YWx1ZXMgKCJsYW5ndWFnZW5hbWUiLCAkXyk7CisgICAgICAgICAgICBwcmludCAiJG5hbWVcbiI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBwcmludCAiTm8gbGFuZ3VhZ2VzIGF2YWlsYWJsZVxuIjsKKyAgICB9Cit9CisKKyMgRnVuY3Rpb24gdGhhdCBwcmludHMgdGhlIGVycm9yIG1lc3NhZ2UKK3N1YiBwcmludF9oZWxwX3RleHQKK3sKKyAgICBwcmludCA8PEVPRjsKK3J1bnRlc3QucGwgW29wdGlvbnNdIFtGSUxFXQorCitFeGVjdXRlcyB0aGUgdGVzdHMgbGlzdGVkIGluIEZJTEUuIEZJTEUgaGFzIHRvIGNvbnRhaW4gdGhlIG5hbWVzIG9mIHRoZSB0ZXN0cywKK29uZSB0ZXN0IHBlciBsaW5lLiBMaW5lcyBzdGFydGluZyB3aXRoICcjJyB3aWxsIGJlIGlnbm9yZWQuCitBIGxhbmd1YWdlIGhhcyB0byBiZSBzcGVjaWZpZWQgZm9yIGFsbCBjb21tYW5kcyBleGNlcHQgLS1oZWxwIGFuZCAtLWxpc3RsYW5ndWFnZXMuCisKK09wdGlvbnM6CisgIC0taGVscCAgICAgICAgICAgIGRpc3BsYXlzIHRoaXMgaGVscCBtZXNzYWdlCisgIC0tbGlzdGxhbmd1YWdlcyAgIGxpc3RzIGFsbCBhdmFpbGFibGUgbGFuZ3VhZ2VzCisgIC0tbGFuZz1zICAgICAgICAgIHNlbGVjdCBsYW5ndWFnZQorICAtLWxpc3QgICAgICAgICAgICBsaXN0IGF2YWlsYWJsZSB0ZXN0cyBmb3IgYSBsYW5ndWFnZQorICAtLXRlc3RpbmZvPU5BTUUgICBzaG93IGluZm8gZm9yIHRlc3QgTkFNRQorICAtLW51bXRocmVhZHM9TlVNICBzZXQgbnVtYmVyIG9mIHRocmVhZHMgKG92ZXJ3cml0ZXMgY29uZmlnIGZpbGUgc2V0dGluZ3MpCisgIC0tdGVzdD1OQU1FICAgICAgIGV4ZWN1dGUgc2luZ2xlIHRlc3QgTkFNRQorICAtLW5vY29tcGlsZSAgICAgICBkbyBub3QgY29tcGlsZSB0ZXN0cworICAtLW5vcnVuICAgICAgICAgICBkbyBub3QgcnVuIHRlc3RzCisgIC0tbm9vcnBoYW4gICAgICAgIHN3aXRjaCBvZiBvcnBoYW5lZCB0ZXN0cworICAtLXJlc3VsdGZpbGU9TkFNRSB1c2UgTkFNRSBhcyByZXN1bHRmaWxlIChvdmVyd3JpdGVzIGNvbmZpZyBmaWxlIHNldHRpbmdzKQorRU9GCit9CisKKyMgRnVuY3Rpb24gdGhhdCB3cml0ZXMgYW4gZXJyb3IgbWVzc2FnZSBmb3IgYSBmYWlsZWQgdGVzdCAvIHBhcnQgb2YgYSB0ZXN0CitzdWIgdGVzdF9lcnJvcgoreworICAgbXkgKCRtZXNzYWdlKSA9IEBfOworICAgbG9nX21lc3NhZ2VfYWRkICgiRVJST1I6ICRtZXNzYWdlIik7CisgICBpZiAoJGRpc3BsYXlfZXJyb3JzIGVxIDEpIHsgcHJpbnQgU1RERVJSICJFUlJPUjogJG1lc3NhZ2VcbiI7IH0KK30KKworIyBGdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gd2FybmluZyBtZXNzYWdlCitzdWIgd2FybmluZyB7CisgIG15ICgkbWVzc2FnZSkgPSBAXzsKKyAgaWYgKCRkaXNwbGF5X3dhcm5pbmdzIGVxIDEpIHsgcHJpbnQgIldhcm5pb25nOiAkbWVzc2FnZVxuIjsgfQorICBsb2dfbWVzc2FnZV9hZGQgKCJXYXJuaW5nOiAkbWVzc2FnZSIpOworfQorCisjIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBlcnJvciBtZXNzYWdlIGFuZCBleGl0cyB3aXRoIHRoZSBzcGVjaWZpZWQgZXJyb3IgY29kZQorc3ViIGVycm9yIHsKKyAgbXkgKCRtZXNzYWdlLCAkZXJyb3JfY29kZSkgPSBAXzsKKyAgaWYgKCRkaXNwbGF5X2Vycm9ycyBlcSAxKSB7IHByaW50IFNUREVSUiAiRVJST1I6ICRtZXNzYWdlXG4iOyB9CisgIGxvZ19tZXNzYWdlX2FkZCAoIkVSUk9SOiAkbWVzc2FnZSIpOworICBleGl0ICgkZXJyb3JfY29kZSk7Cit9CisKKyMgRnVuY3Rpb24gd2hpY2ggYWRkcyBhbiBuZXcgZW50cnkgaW50byB0aGUgbG9nZmlsZSB0b2dldGhlciB3aXRoIGEgdGltZXN0YW1wCitzdWIgbG9nX21lc3NhZ2VfYWRkCit7CisgICAgKG15ICRtZXNzYWdlKSA9IEBfOworICAgICgkc2VjLCRtaW4sJGhvdXIsJG1kYXksJG1vbiwkeWVhciwkd2RheSwkeWRhdCwkaXNkc3QpID0gbG9jYWx0aW1lKCk7CisgICAgaWYobGVuZ3RoKCRob3VyKSA9PSAxKSB7ICRob3VyPSIwJGhvdXIiOyB9CisgICAgaWYobGVuZ3RoKCRtaW4pID09IDEpICB7ICRtaW49IjAkbWluIjsgICB9CisgICAgaWYobGVuZ3RoKCRzZWMpID09IDEpICB7ICRzZWM9IjAkc2VjIjsgICB9CisgICAgJG1vbj0kbW9uKzE7CisgICAgJHllYXI9JHllYXIrMTkwMDsKKyAgICBvcGVuIChMT0dGSUxFLCI+PiRsb2dmaWxlIikgb3IgZGllICJFUlJPUjogQ291bGQgbm90IGNyZWF0ZSAkbG9nZmlsZVxuIjsKKyAgICBwcmludCBMT0dGSUxFICIkbWRheS8kbW9uLyR5ZWFyICRob3VyLiRtaW4uJHNlYzogJG1lc3NhZ2VcbiI7Cit9CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvdGVtcGxhdGVfcGFyc2VyX2MucGwgYi9maW5hbC90ZXN0c3VpdGUvdGVtcGxhdGVfcGFyc2VyX2MucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2Q2ZjM0NgotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS90ZW1wbGF0ZV9wYXJzZXJfYy5wbApAQCAtMCwwICsxLDExNCBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjIG9tcHRzX3BhcnNlciBbb3B0aW9uXSBJTkZJTEUgT1VURklMRQorIyAKKyMgQ3JlYXRzIHRoZSB0ZXN0cyBhbmQgdGhlIGNyb3NzdGVzdHMgZm9yIHRoZSBPcGVuTVAtVGVzdHN1aXRlIG91dCBvZiBhbiB0ZW1wbGF0ZWZpbGVzIHdoaWNoIGFyZSBnaXZlbiB0byB0aGUgcHJvZ3JhbW0uCisjIAorIyBPcHRpb25zOgorIyAtLXRlc3Q6IAltYWtlIHRlc3QKKyMgLS1jcm9zc3Rlc3Q6IAltYWtlIGNyb3NzdGVzdAorIyAtLW9ycGhhbglpZiBwb3NzaWJsZSBnZW5lcmF0ZSB0ZXN0cyB1c2luZyBvcnBoYW4gCisjCisjIFJldHVybjoKKyMgICAgICAgU3VjY2VzOiAgICAgICAgICAgICAgICAgMAorIyAgICAgICBUZW1wbGF0ZSBub3QgZm91bmQgICAgICAtMQorIworCisjIFVzaW5nIEdldG9wdDo6bG9uZyB0byBleHRyYWN0IHRoZSBwcm9ncmFtbSBvcHRpb25zCit1c2UgR2V0b3B0OjpMb25nOworIyBVc2luZyBmdW5jdGlvbnM6IFNldCBvZiBzdWJyb3V0aW5lcyB0byBtb2RpZnkgdGhlIHRlc3Rjb2RlCit1c2Ugb21wdHNfcGFyc2VyRnVuY3Rpb25zOworCisjIEdldHRpbmcgZ2l2ZW4gb3B0aW9ucworR2V0T3B0aW9ucygidGVzdCIgPT4gXCR0ZXN0LCJjcm9zc3Rlc3QiID0+IFwkY3Jvc3N0ZXN0LCAib3JwaGFuISIgPT4gXCRvcnBoYW4pOworCisjIFJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRoZSB0ZW1wbGF0ZWZpbGVzLiAKKyMgQWRkaW5nIHRoZXNlIHRvIHRoZSBsaXN0IG9mIHRvIGJlIHBhcnNlZCBmaWxlcyBpZiB0aGV5IGV4aXN0LgorCitteSAkdGVtcGxhdGVmaWxlOworbXkgJHNvdXJjZWZpbGU7CitteSAkbWFpbnByb2NzcmMgPSAib21wdHNfc3RhbmRhbG9uZVByb2MuYyI7IAorCiskdGVtcGxhdGVmaWxlID0gJEFSR1ZbMF07Ciskb3V0ZmlsZSA9ICRBUkdWWzFdOworCitpZiAoIS1lICR0ZW1wbGF0ZWZpbGUpIHsKKyAgICBwcmludCAiVGVtYXBsdGUgZmlsZSBub3QgZm91bmQiOworICAgIGV4aXQgLTE7Cit9CisKKwkKKyMgQ2hlY2tpbmcgaWYgb3B0aW9ucyB3ZXJlIHZhbGlkOgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgcHJlcGFyYXRpb25zIGFuZCBjaGVja3MgZm9yIHNvdXJjZWZpbGVzCisKKyMgUmVhZGluZyB0aGUgdGVtcGxhdGUgZm9yIHRoZSB0ZXN0cyAKK29wZW4oVEVTVCwkdGVtcGxhdGVmaWxlKSBvciBkaWUgIkVycm9yOiBDb3VsZCBub3Qgb3BlbiB0ZW1wbGF0ZSAkc3JjZmlsZVxuIjsKK3doaWxlKDxURVNUPil7ICRzcmMgLj0gJF87IH0KK2Nsb3NlKFRFU1QpOworCisjIEV4dHJhY3RpbmcgdGhlIHNvdXJjZSBmb3IgdGhlIG1haW5wcm9ncmFtbSBhbmQgc2F2aW5nIGl0IGluICRtYWlucHJvY3NyYworb3BlbihNQUlOUFJPQywkbWFpbnByb2NzcmMpIG9yIGRpZSAiQ291bGQgbm90IG9wZW4gdGhlIHNvdXJjZWZpbGUgZm9yIHRoZSBtYWluIHByb2dyYW0gJG1haW5wcm9jc3JjIjsKK3doaWxlKDxNQUlOUFJPQz4peyAkbWFpbnByb2MgLj0gJF87IH0KK2Nsb3NlIChNQUlOUFJPQyk7CisKKyMgU29tZSB0ZW1wb3JhcnkgdGVzdGluZm9ybWF0aW9uOgorbXkgKCRkZXNjcmlwdGlvbikgID0gZ2V0X3RhZ192YWx1ZXMgKCdvbXB0czp0ZXN0ZGVzY3JpcHRpb24nLCRzcmMpOworbXkgKCRkaXJlY3RpdmUpICAgID0gZ2V0X3RhZ192YWx1ZXMgKCdvbXB0czpkaXJlY3RpdmUnLCRzcmMpOworbXkgKCRmdW5jdGlvbm5hbWUpID0gZ2V0X3RhZ192YWx1ZXMgKCdvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWUnLCRzcmMpOworCitvcGVuIChPVVRGSUxFLCI+JG91dGZpbGUiKSBvciBkaWUgIkNvdWxkIG5vdCBjcmVhdGUgdGhlIG91dHB1dCBmaWxlIGZvciAkZGlyZWN0aXZlIjsKKworIyBDcmVhdGluZyB0aGUgc291cmNlIGZvciB0aGUgdGVzdDoKK215ICgkY29kZSkgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6dGVzdGNvZGUnLCRzcmMpOworIyBQdXR0aW5nIHRvZ2V0aGVyIHRoZSBmdW5jdGlvbnMgYW5kIHRoZSBtYWlucHJvZ3JhbW06CiskY29kZSAuPSAkbWFpbnByb2M7CisKK215ICR0ZXN0cHJlZml4ID0gIiI7CisKKyMgTWFrZSBtb2RpZmljYXRpb25zIGZvciB0aGUgb3JwaGFuZWQgdGVzdHZlcnNpb24gaWYgbmVjZXNzYXJ5OgoraWYgKCRvcnBoYW4pIHsKKyMgR2V0IHRoZSBnbG9iYWwgdmFyaWFibGVzOgorICAgIEBkZWZzID0gZ2V0X3RhZ192YWx1ZXMoIm9tcHRzOm9ycGhhbjp2YXJzIiwkY29kZSk7CisgICAgJG9ycGh2YXJzZGVmID0gIiI7CisgICAgZm9yZWFjaCAoQGRlZnMpIHsKKyAgICAgICAgJG9ycGh2YXJzZGVmID0gam9pbigiXG4iLCRvcnBodmFyc2RlZiwkXyk7IAorICAgIH0KKyMgR2VuZXJhdGUgcHJlZGVjbGFyYXRpb25zIGZvciBvcnBhaG4gZnVuY3Rpb25zOgorICAgICRvcnBoZnVuY3NkZWZzID0gb3JwaF9mdW5jdGlvbnNfZGVjbGFyYXRpb25zKCRjb2RlKTsKKyMgR2VuZXJhdGUgdGhlIG9ycGhhbiBmdW5jdGlvbnM6CisgICAgJG9ycGhmdW5jcyA9IGNyZWF0ZV9vcnBoX2NmdW5jdGlvbnMoJGNvZGUpOworIyBSZXBsYTplIG9ycGhhbiByZWdpb25zIGJ5IGZ1bmN0aW9uY2FsbHM6CisgICAgJGNvZGUgPSBvcnBoYW5fcmVnaW9uczJjZnVuY3Rpb25zKCRjb2RlKTsKKyMgRGVsZXRpbmcgdGhlIGZvcm1lciBkZWNsYXJhdGlvbnMgb2YgdGhlIHZhcmlhYmxlcyBpbiB0aGUgb3JwaGFuIHJlZ2lvbnM6CisgICAgKCRjb2RlKSA9IGRlbGV0ZV90YWdzKCdvbXB0czpvcnBoYW46dmFycycsKCRjb2RlKSk7CisjIFB1dCBhbGwgdG9nZXRoZXI6CisgICAgJGNvZGUgPSAiI2luY2x1ZGUgXCJvbXBfdGVzdHN1aXRlLmhcIlxuIiAuICRvcnBodmFyc2RlZiAuICRvcnBoZnVuY3NkZWZzIC4gJGNvZGUgLiAkb3JwaGZ1bmNzOworICAgICR0ZXN0cHJlZml4IC49ICJvcnBoXyI7Cit9CisKKyMgUmVtb3ZlIHJlbWFpbmluZyBtYXJrcyBmb3IgdGhlIG9ycGFobiByZWdpb25zIGFuZCBpdHMgdmFyaWFibGVzOgorKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6b3JwaGFuJywnJywnJywoJGNvZGUpKTsKKygkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOm9ycGhhbjp2YXJzJywnJywnJywoJGNvZGUpKTsKKworaWYoJHRlc3QpIHsKKyMgUmVtb3ZlIHRoZSBtYXJrcyBmb3IgdGhlIHRlc3Rjb2RlIGFuZCByZW1vdmUgdGhlIGNvZGUgZm9yIHRoZSBjcm9zc3Rlc3RzOiAKKyAgICAoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpjaGVjaycsJycsJycsKCRjb2RlKSk7CisgICAgKCRjb2RlKSA9IGRlbGV0ZV90YWdzKCdvbXB0czpjcm9zc2NoZWNrJywoJGNvZGUpKTsJCQorICAgICR0ZXN0cHJlZml4IC49ICJ0ZXN0XyI7Cit9CitlbHNpZigkY3Jvc3N0ZXN0KSB7CisjIFJlbW92ZSB0aGUgbWFya3MgZm9yIHRoZSBjcm9zc3Rlc3Rjb2RlIGFuZCByZW1vdmUgdGhlIGNvZGUgZm9yIHRoZSB0ZXN0czogCisgICAgKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6Y3Jvc3NjaGVjaycsJycsJycsKCRjb2RlKSk7CisgICAgKCRjb2RlKSA9IGRlbGV0ZV90YWdzKCdvbXB0czpjaGVjaycsKCRjb2RlKSk7CQkKKyAgICAkdGVzdHByZWZpeCAuPSAiY3Rlc3RfIjsKK30KKyMgTWFraW5nIHNvbWUgZmluYWwgbW9kaWZpY2F0aW9uczoKKygkY29kZSkgPSByZXBsYWNlX3RhZ3MoJ3Rlc3RmdW5jdGlvbm5hbWUnLCR0ZXN0cHJlZml4LiRmdW5jdGlvbm5hbWUsKCRjb2RlKSk7CisoJGNvZGUpID0gcmVwbGFjZV90YWdzKCdkaXJlY3RpdmUnLCRkaXJlY3RpdmUsKCRjb2RlKSk7CisoJGNvZGUpID0gcmVwbGFjZV90YWdzKCdkZXNjcmlwdGlvbicsJGRlc2NyaXB0aW9uLCgkY29kZSkpOworKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lJywkdGVzdHByZWZpeCwnJywoJGNvZGUpICk7CisjCSRjb2RlID0gICJcI2luY2x1ZGUgXCJvbXBfdGVzdHN1aXRlLmhcIlxuIi4kY29kZTsKKyMgV3JpdGUgdGhlIHJlc3VsdCBpbnRvIHRoZSBmaWxlIGFuZCBjbG9zZSBpdDoKK3ByaW50IE9VVEZJTEUgJGNvZGU7CitjbG9zZShPVVRGSUxFKTsKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS90ZW1wbGF0ZV9wYXJzZXJfZm9ydHJhbi5wbCBiL2ZpbmFsL3Rlc3RzdWl0ZS90ZW1wbGF0ZV9wYXJzZXJfZm9ydHJhbi5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NzBhNGUwCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvdGVzdHN1aXRlL3RlbXBsYXRlX3BhcnNlcl9mb3J0cmFuLnBsCkBAIC0wLDAgKzEsMTE1IEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMgb21wdHNfcGFyc2VyIFtvcHRpb25dIElORklMRSBPVVRGSUxFCisjIAorIyBDcmVhdHMgdGhlIHRlc3RzIGFuZCB0aGUgY3Jvc3N0ZXN0cyBmb3IgdGhlIE9wZW5NUC1UZXN0c3VpdGUgb3V0IG9mIGFuIHRlbXBsYXRlZmlsZXMgd2hpY2ggYXJlIGdpdmVuIHRvIHRoZSBwcm9ncmFtbS4KKyMgCisjIE9wdGlvbnM6CisjIC0tdGVzdDogCW1ha2UgdGVzdAorIyAtLWNyb3NzdGVzdDogCW1ha2UgY3Jvc3N0ZXN0CisjIC0tb3JwaGFuCWlmIHBvc3NpYmxlIGdlbmVyYXRlIHRlc3RzIHVzaW5nIG9ycGhhbiAKKyMKKyMgUmV0dXJuOgorIyAgICAgICBTdWNjZXM6ICAgICAgICAgICAgICAgICAwCisjICAgICAgIFRlbXBsYXRlIG5vdCBmb3VuZCAgICAgIC0xCisjCisKKyMgVXNpbmcgR2V0b3B0Ojpsb25nIHRvIGV4dHJhY3QgdGhlIHByb2dyYW1tIG9wdGlvbnMKK3VzZSBHZXRvcHQ6Okxvbmc7CisjIFVzaW5nIGZ1bmN0aW9uczogU2V0IG9mIHN1YnJvdXRpbmVzIHRvIG1vZGlmeSB0aGUgdGVzdGNvZGUKK3VzZSBvbXB0c19wYXJzZXJGdW5jdGlvbnM7CisKKyMgR2V0dGluZyBnaXZlbiBvcHRpb25zCitHZXRPcHRpb25zKCJ0ZXN0IiA9PiBcJHRlc3QsImNyb3NzdGVzdCIgPT4gXCRjcm9zc3Rlc3QsICJvcnBoYW4hIiA9PiBcJG9ycGhhbik7CisKKyMgUmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhlIHRlbXBsYXRlZmlsZXMuIAorIyBBZGRpbmcgdGhlc2UgdG8gdGhlIGxpc3Qgb2YgdG8gYmUgcGFyc2VkIGZpbGVzIGlmIHRoZXkgZXhpc3QuCisKK215ICR0ZW1wbGF0ZWZpbGU7CitteSAkc291cmNlZmlsZTsKK215ICRtYWlucHJvY3NyYyA9ICJvbXB0c19zdGFuZGFsb25lUHJvYy5mIjsgCisKKyR0ZW1wbGF0ZWZpbGUgPSAkQVJHVlswXTsKKyRvdXRmaWxlID0gJEFSR1ZbMV07CisKK2lmICghLWUgJHRlbXBsYXRlZmlsZSkgeworICAgIHByaW50ICJUZW1hcGx0ZSBmaWxlIG5vdCBmb3VuZCI7CisgICAgZXhpdCAtMTsKK30KKworCQorIyBDaGVja2luZyBpZiBvcHRpb25zIHdlcmUgdmFsaWQ6CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBwcmVwYXJhdGlvbnMgYW5kIGNoZWNrcyBmb3Igc291cmNlZmlsZXMKKworIyBSZWFkaW5nIHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIHRlc3RzIAorb3BlbihURVNULCR0ZW1wbGF0ZWZpbGUpIG9yIGRpZSAiRXJyb3I6IENvdWxkIG5vdCBvcGVuIHRlbXBsYXRlICRzcmNmaWxlXG4iOword2hpbGUoPFRFU1Q+KXsgJHNyYyAuPSAkXzsgfQorY2xvc2UoVEVTVCk7CisKKyMgRXh0cmFjdGluZyB0aGUgc291cmNlIGZvciB0aGUgbWFpbnByb2dyYW1tIGFuZCBzYXZpbmcgaXQgaW4gJG1haW5wcm9jc3JjCitvcGVuKE1BSU5QUk9DLCRtYWlucHJvY3NyYykgb3IgZGllICJDb3VsZCBub3Qgb3BlbiB0aGUgc291cmNlZmlsZSBmb3IgdGhlIG1haW4gcHJvZ3JhbSAkbWFpbnByb2NzcmMiOword2hpbGUoPE1BSU5QUk9DPil7ICRtYWlucHJvYyAuPSAkXzsgfQorY2xvc2UgKE1BSU5QUk9DKTsKKworIyBTb21lIHRlbXBvcmFyeSB0ZXN0aW5mb3JtYXRpb246CisoJGRlc2NyaXB0aW9uKSAgPSBnZXRfdGFnX3ZhbHVlcyAoJ29tcHRzOnRlc3RkZXNjcmlwdGlvbicsJHNyYyk7CisoJGRpcmVjdGl2ZSkgICAgPSBnZXRfdGFnX3ZhbHVlcyAoJ29tcHRzOmRpcmVjdGl2ZScsJHNyYyk7CisoJGZ1bmN0aW9ubmFtZSkgPSBnZXRfdGFnX3ZhbHVlcyAoJ29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZScsJHNyYyk7CisKK29wZW4gKE9VVEZJTEUsIj4kb3V0ZmlsZSIpIG9yIGRpZSAiQ291bGQgbm90IGNyZWF0ZSB0aGUgb3V0cHV0IGZpbGUgZm9yICRkaXJlY3RpdmUiOworCisjIENyZWF0aW5nIHRoZSBzb3VyY2UgZm9yIHRoZSB0ZXN0OgorKCRjb2RlKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czp0ZXN0Y29kZScsJHNyYyk7CisjIFB1dHRpbmcgdG9nZXRoZXIgdGhlIGZ1bmN0aW9ucyBhbmQgdGhlIG1haW5wcm9ncmFtbToKKyRjb2RlIC49ICRtYWlucHJvYzsKKworI3RoYW5rcyB0byBEci4gWWluIE1hIGluIEFic29mdCwgZ2V0IHRoZSBwYXJhbWV0ZXJzIDxvbXB0czpvcnBoYW46cGFyYW1zPiBieSBqb29uCisgKCRwYXJtcykgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6b3JwaGFuOnBhcm1zJywoJGNvZGUpKTsKKyAoJHBhcm1zKSA9IGxlYXZlX3NpbmdsZV9zcGFjZSgkcGFybXMpOworICgkY29kZSkgPSByZXBsYWNlX3RhZ3MoJ29tcHRzOm9ycGhhbjpwYXJtcycsJycsJGNvZGUpOworCisjIE1ha2UgbW9kaWZpY2F0aW9ucyBmb3IgdGhlIG9ycGhhbmVkIHRlc3R2ZXJzaW9uIGlmIG5lY2Vzc2FyeToKK2lmICgkb3JwaGFuKSB7CisjIEdldCB0aGUgZ2xvYmFsIHZhcmlhYmxlczoKKyAgICBAZGVmcyA9IGdldF90YWdfdmFsdWVzKCJvbXB0czpvcnBoYW46dmFycyIsJGNvZGUpOworICAgICRvcnBodmFyc2RlZiA9ICIiOworICAgIGZvcmVhY2ggKEBkZWZzKSB7CisgICAgICAgIGlmIChub3QgL15bIF0qJC9ncykgeyAkb3JwaHZhcnNkZWYgPSBqb2luKCJcbiIsJG9ycGh2YXJzZGVmLCRfKTsgfSAKKyAgICB9CisjIEdlbmVyYXRlIHRoZSBvcnBoYW4gc3Vicm91dGluZXM6CisgICAgICAgICRvcnBoZnVuY3MgPSBjcmVhdGVfb3JwaF9mb3J0cmFuZnVuY3Rpb25zICgiIiwgKCRjb2RlKSwoJHBhcm1zKSk7CisjIFJlcGxhY2Ugb3JwaGFuIHJlZ2lvbnMgYnkgZnVuY3Rpb25jYWxsczoKKyAgICAgICAgKCRjb2RlKSA9IG9ycGhhbl9yZWdpb25zMmZvcnRyYW5mdW5jdGlvbnMgKCIiLCAoJGNvZGUpLCgkcGFybXMpKTsKKyAgICAgICAgKCRjb2RlKSA9IGVubGFyZ2VfdGFncyAoJ29tcHRzOm9ycGhhbjp2YXJzJywnJywnJywoJGNvZGUpKTsKKyMgdG8gZmluZCBvcnBoYW4gY2FsbCBzdGF0ZW1lbnQgYW5kIGFkZCBwYXJhbWV0ZXJzLCBieSBqb29uCisgICAgICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOm9ycGhhbjpwYXJtcycsJycsJycsKCRjb2RlKSk7CisjIFB1dCBhbGwgdG9nZXRoZXI6CisgICAgICAgICRjb2RlID0gJGNvZGUgLiAkb3JwaGZ1bmNzOworfQorCisjIFJlbW92ZSByZW1haW5pbmcgbWFya3MgZm9yIHRoZSBvcnBhaG4gcmVnaW9ucyBhbmQgaXRzIHZhcmlhYmxlczoKKygkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOm9ycGhhbicsJycsJycsKCRjb2RlKSk7CisoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpvcnBoYW46dmFycycsJycsJycsKCRjb2RlKSk7CisjIHJlbW92ZSBwYXJhbWV0ZXJzIGJldHdlZW4gZm9yIG9ycGhhbmVkIGRpcmVjdGl2ZSBwYXJhbWV0ZXMsIGFkZGVkIGJ5am9vbgorKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6b3JwaGFuOnBhcm1zJywnJywnJywoJGNvZGUpKTsKKworaWYoJHRlc3QpIHsKKyMgUmVtb3ZlIHRoZSBtYXJrcyBmb3IgdGhlIHRlc3Rjb2RlIGFuZCByZW1vdmUgdGhlIGNvZGUgZm9yIHRoZSBjcm9zc3Rlc3RzOiAKKyAgICAoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpjaGVjaycsJycsJycsKCRjb2RlKSk7CisgICAgKCRjb2RlKSA9IGRlbGV0ZV90YWdzKCdvbXB0czpjcm9zc2NoZWNrJywoJGNvZGUpKTsJCQorfQorZWxzaWYoJGNyb3NzdGVzdCkgeworIyBSZW1vdmUgdGhlIG1hcmtzIGZvciB0aGUgY3Jvc3N0ZXN0Y29kZSBhbmQgcmVtb3ZlIHRoZSBjb2RlIGZvciB0aGUgdGVzdHM6IAorICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOmNyb3NzY2hlY2snLCcnLCcnLCgkY29kZSkpOworICAgICgkY29kZSkgPSBkZWxldGVfdGFncygnb21wdHM6Y2hlY2snLCgkY29kZSkpOwkJCit9CisjIE1ha2luZyBzb21lIGZpbmFsIG1vZGlmaWNhdGlvbnM6CisoJGNvZGUpID0gcmVwbGFjZV90YWdzKCd0ZXN0ZnVuY3Rpb25uYW1lJywidGVzdF8iLiRmdW5jdGlvbm5hbWUsKCRjb2RlKSk7CisoJGNvZGUpID0gcmVwbGFjZV90YWdzKCdkaXJlY3RpdmUnLCRkaXJlY3RpdmUsKCRjb2RlKSk7CisoJGNvZGUpID0gcmVwbGFjZV90YWdzKCdkZXNjcmlwdGlvbicsJGRlc2NyaXB0aW9uLCgkY29kZSkpOworKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lJywidGVzdF8iLCcnLCgkY29kZSkgKTsKKyMJJGNvZGUgPSAgIlwjaW5jbHVkZSBcIm9tcF90ZXN0c3VpdGUuaFwiXG4iLiRjb2RlOworIyBXcml0ZSB0aGUgcmVzdWx0IGludG8gdGhlIGZpbGUgYW5kIGNsb3NlIGl0OgorcHJpbnQgT1VURklMRSAkY29kZTsKK2Nsb3NlKE9VVEZJTEUpOwpkaWZmIC0tZ2l0IGEvZmluYWwvdGVzdHN1aXRlL3Rlc3RsaXN0LWMudHh0IGIvZmluYWwvdGVzdHN1aXRlL3Rlc3RsaXN0LWMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxM2EyMTgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvdGVzdGxpc3QtYy50eHQKQEAgLTAsMCArMSw2OCBAQAorIyBMaXN0IGNvbnRhaW5pbmcgdGhlIHRlc3RzIG9mIHRoZSBPcGVuTVBWYWxpZGFpb24gU3VpdGUgYXZhaWxhYmxlIHRvIGNoZWNrCisjIHRoZSBjIGltcGxlbWVudGF0aW9uLgoraGFzX29wZW5tcAorb21wX2F0b21pYworb21wX2JhcnJpZXIKK29tcF9jcml0aWNhbAorb21wX2ZsdXNoCitvbXBfZm9yX2ZpcnN0cHJpdmF0ZQorb21wX2Zvcl9sYXN0cHJpdmF0ZQorb21wX2Zvcl9vcmRlcmVkCitvbXBfZm9yX3ByaXZhdGUKK29tcF9mb3JfcmVkdWN0aW9uCitvbXBfZm9yX3NjaGVkdWxlX2R5bmFtaWMKK29tcF9mb3Jfc2NoZWR1bGVfZ3VpZGVkCitvbXBfZm9yX3NjaGVkdWxlX3N0YXRpYworb21wX2Zvcl9ub3dhaXQKK29tcF9nZXRfbnVtX3RocmVhZHMKK29tcF9nZXRfd3RpY2sKK29tcF9nZXRfd3RpbWUKK29tcF9pbl9wYXJhbGxlbAorb21wX2xvY2sKK29tcF9tYXN0ZXIKK29tcF9uZXN0X2xvY2sKK29tcF9wYXJhbGxlbF9jb3B5aW4KK29tcF9wYXJhbGxlbF9mb3JfZmlyc3Rwcml2YXRlCitvbXBfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlCitvbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQKK29tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZQorb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24KK29tcF9wYXJhbGxlbF9udW1fdGhyZWFkcworb21wX3BhcmFsbGVsX3NlY3Rpb25zX2ZpcnN0cHJpdmF0ZQorb21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlCitvbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZQorb21wX3BhcmFsbGVsX3NlY3Rpb25zX3JlZHVjdGlvbgorb21wX3NlY3Rpb25fZmlyc3Rwcml2YXRlCitvbXBfc2VjdGlvbl9sYXN0cHJpdmF0ZQorb21wX3NlY3Rpb25fcHJpdmF0ZQorb21wX3NlY3Rpb25zX3JlZHVjdGlvbgorb21wX3NlY3Rpb25zX25vd2FpdAorb21wX3BhcmFsbGVsX2Zvcl9pZgorb21wX3NpbmdsZV9jb3B5cHJpdmF0ZQorb21wX3NpbmdsZV9ub3dhaXQKK29tcF9zaW5nbGVfcHJpdmF0ZQorb21wX3NpbmdsZQorb21wX3Rlc3RfbG9jaworb21wX3Rlc3RfbmVzdF9sb2NrCitvbXBfdGhyZWFkcHJpdmF0ZQorb21wX3BhcmFsbGVsX2RlZmF1bHQKK29tcF9wYXJhbGxlbF9zaGFyZWQKK29tcF9wYXJhbGxlbF9wcml2YXRlCitvbXBfcGFyYWxsZWxfZmlyc3Rwcml2YXRlCitvbXBfcGFyYWxsZWxfaWYKK29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24KKworIyBOZXcgdGVzdHMgZm9yIE9wZW5NUCAzLjAKK29tcF9mb3JfY29sbGFwc2UKK29tcF9tYXN0ZXJfMworb21wX3Rhc2sKK29tcF90YXNrX2lmCitvbXBfdGFza191bnRpZWQKK29tcF90YXNrX3NoYXJlZAorb21wX3Rhc2tfcHJpdmF0ZQorb21wX3Rhc2tfZmlyc3Rwcml2YXRlCitvbXBfdGFza3dhaXQKKworIyBOZXcgdGVzdHMgZm9yIE9wZW5NUCAzLjEKK29tcF90YXNreWllbGQKK29tcF90YXNrX2ZpbmFsCmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvdGVzdGxpc3QtZi50eHQgYi9maW5hbC90ZXN0c3VpdGUvdGVzdGxpc3QtZi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUzODlhNQotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS90ZXN0bGlzdC1mLnR4dApAQCAtMCwwICsxLDYzIEBACisjIExpc3QgY29udGFpbmluZyB0aGUgdGVzdHMgb2YgdGhlIE9wZW5NUFZhbGlkYWlvbiBTdWl0ZSBhdmFpbGFibGUgdG8gY2hlY2sKKyMgdGhlIGZvcnRhbiBpbXBsZW1lbnRhdGlvbi4KK2RvX2ZpcnN0cHJpdmF0ZQorZG9fbGFzdHByaXZhdGUKK2RvX29yZGVyZWQKK2RvX3ByaXZhdGUKK2RvX3JlZHVjdGlvbgorZG9fc2NoZWR1bGVfZHluYW1pYworZG9fc2NoZWR1bGVfZ3VpZGVkCitkb19zY2hlZHVsZV9zdGF0aWMKK2hhc19vcGVubXAKK29tcF9hdG9taWMKK29tcF9iYXJyaWVyCitvbXBfY29weWluCitvbXBfY3JpdGljYWwKK29tcF9mbHVzaAorb21wX2dldF9udW1fdGhyZWFkcworb21wX2luX3BhcmFsbGVsCitvbXBfbG9jaworb21wX21hc3Rlcgorb21wX25lc3RfbG9jaworb21wX3Rlc3RfbmVzdF9sb2NrCitvbXBfbmVzdGVkCitvbXBfbnVtX3RocmVhZHMKK29tcF90ZXN0bG9jaworb21wX3RocmVhZHByaXZhdGUKK29tcF9nZXRfd3RpY2tzCisjIyNvbXBfd29ya3NoYXJlX2RlZmF1bHQKK29tcF93b3Jrc2hhcmUKKyMjIyBCcmF1Y2h0IG1hbiBkZW4gb2RlciBvYmlnZW4gZXJ3ZWl0ZXJuPworb21wX3d0aW1lCitwYXJfZG9fZmlyc3Rwcml2YXRlCitwYXJfZG9fbGFzdHByaXZhdGUKK3Bhcl9kb19vcmRlcmVkCitwYXJfZG9fcHJpdmF0ZQorcGFyX2RvX3JlZHVjdGlvbgorcGFyX3NlY3Rpb25fZmlyc3Rwcml2YXRlCitwYXJfc2VjdGlvbl9sYXN0cHJpdmF0ZQorcGFyX3NlY3Rpb25fcHJpdmF0ZQorcGFyX3NlY3Rpb25fcmVkdWN0CitzZWN0aW9uX2ZpcnN0cHJpdmF0ZQorc2VjdGlvbl9sYXN0cHJpdmF0ZQorc2VjdGlvbl9wcml2YXRlCitzZWN0aW9uX3JlZHVjdGlvbgorb21wX3NpbmdsZQorc2luZ2xlX2NvcHlwcml2YXRlCitzaW5nbGVfbm93YWl0CitzaW5nbGVfcHJpdmF0ZQorCisjIE5ldyB0ZXN0cyBmb3IgT3Blbk1QIDMuMAorZG9fY29sbGFwc2UKK29tcF9tYXN0ZXJfMworb21wX3Rhc2sKK29tcF90YXNrX2lmCitvbXBfdGFza191bnRpZWQKK29tcF90YXNrX3NoYXJlZAorb21wX3Rhc2tfcHJpdmF0ZQorb21wX3Rhc2tfZmlyc3Rwcml2YXRlCitvbXBfdGFza3dhaXQKKworIyBOZXcgdGVzdHMgZm9yIE9wZW5NUCAzLjEKKyNvbXBfdGFza3lpZWxkCisjb21wX3Rhc2tfZmluYWwKZGlmZiAtLWdpdCBhL2ZpbmFsL3Rlc3RzdWl0ZS90ZXN0c190b19pbnRlZ3JhdGUvb21wX3NldF91bnNldF9sb2NrX2hpbnRlZC5jIGIvZmluYWwvdGVzdHN1aXRlL3Rlc3RzX3RvX2ludGVncmF0ZS9vbXBfc2V0X3Vuc2V0X2xvY2tfaGludGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EwMTUzNAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3Rlc3RzdWl0ZS90ZXN0c190b19pbnRlZ3JhdGUvb21wX3NldF91bnNldF9sb2NrX2hpbnRlZC5jCkBAIC0wLDAgKzEsNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgIEV4dGVuZGVkIHZlcnNpb24gb2Ygb21wX3NldF91bnNldF9sb2NrLmMgZm9yIHRlc3RpbmcgaGludGVkIGxvY2tzLgorICBDaGVjayB0byBtYWtlIHN1cmUgT3Blbk1QIGxvY2tzIGd1YXJhbnRlZSBtdXR1YWwgCisgIGV4Y2x1c2lvbiBmb3IgbXVsdGlwbGUgdGhyZWFkcy4KK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxvbXAuaD4KKwordm9pZCBjc2NhbGwoaW50IGlkLCBpbnQgblsxMDAwXSwgaW50ICpwYXNzZWQsIG9tcF9sb2NrX3QgKmxvY2spIHsKKyAgICBpbnQgaTsKKworICAgIG9tcF9zZXRfbG9jayggbG9jayApOworICAgIGZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgbltpXSA9IGlkOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgIGlmICggbltpXSAhPSBpZCApIHsKKyAgICAgICAgICAgICpwYXNzZWQgPSAwOworICAgICAgICB9CisgICAgfQorICAgIG9tcF91bnNldF9sb2NrKCBsb2NrICk7Cit9CisKK2ludCBoaW50ZWRfbG9jayhrbXBfbG9ja19oaW50X3QgaGludCkgeworICAgIGludCBwYXNzZWQsIG5bMTAwMF0sIGosIGlkOworICAgIG9tcF9sb2NrX3QgbG9jazsKKyAgICAKKyAgICBwYXNzZWQgPSAxOworCisgICAga21wX2luaXRfbG9ja19oaW50ZWQoJmxvY2ssIGhpbnQpOworCisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKG4sIHBhc3NlZCwgbG9jaykgcHJpdmF0ZShpZCwgaikJCisgICAgeworICAgICAgICBpZCA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICBmb3IgKGogPSAxOyBqIDw9IDEwMDAwOyBqKyspIHsKKyAgICAgICAgICAgIGNzY2FsbCggaWQsIG4sICZwYXNzZWQsICZsb2NrICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvbXBfZGVzdHJveV9sb2NrKCZsb2NrKTsKKworICAgIGlmIChwYXNzZWQpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorCitpbnQgbWFpbigpIHsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICByZXQgKz0gaGludGVkX2xvY2soa21wX2xvY2tfaGludF9ub25lKTsKKyAgICByZXQgKz0gaGludGVkX2xvY2soa21wX2xvY2tfaGludF9jb250ZW5kZWQpOworICAgIHJldCArPSBoaW50ZWRfbG9jayhrbXBfbG9ja19oaW50X3VuY29udGVuZGVkKTsKKyAgICByZXQgKz0gaGludGVkX2xvY2soa21wX2xvY2tfaGludF9ub25zcGVjdWxhdGl2ZSk7CisgICAgcmV0ICs9IGhpbnRlZF9sb2NrKGttcF9sb2NrX2hpbnRfc3BlY3VsYXRpdmUpOworICAgIC8vIFRoaXMgb25lIHdpbGwgZW1pdCBXYXJuaW5nIG9uIG1hY2hpbmVzIHdpdGggbm8gVFNYLiAKKyAgICByZXQgKz0gaGludGVkX2xvY2soa21wX2xvY2tfaGludF9hZGFwdGl2ZSk7CisgICAgaWYgKHJldCkgeworICAgICAgICBwcmludGYoIiBUZXN0ICVzIGZhaWxlZFxuIiwgX19GSUxFX18pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiBUZXN0ICVzIHBhc3NlZFxuIiwgX19GSUxFX18pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9maW5hbC90ZXN0c3VpdGUvdGVzdHNfdG9faW50ZWdyYXRlL29tcF9zZXRfdW5zZXRfbG9ja19oaW50ZWQuZiBiL2ZpbmFsL3Rlc3RzdWl0ZS90ZXN0c190b19pbnRlZ3JhdGUvb21wX3NldF91bnNldF9sb2NrX2hpbnRlZC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NDNkMzgKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC90ZXN0c3VpdGUvdGVzdHNfdG9faW50ZWdyYXRlL29tcF9zZXRfdW5zZXRfbG9ja19oaW50ZWQuZgpAQCAtMCwwICsxLDkwIEBACishCishIE1vZGlmaWVkIHZlcnNpb24gb2Ygb21wX3NldF91bnNldF9sb2NrLkYsIHVzaW5nIGhpbnRlZCBsb2NrIEFQSQorIQorICAgICAgcHJvZ3JhbSBvbXBfc2V0X3Vuc2V0X2xvY2tfaGludGVkCisKKyAgICAgIGludGVnZXIgcmV0CisjaWYgZGVmaW5lZChfT1BFTk1QKQorICAgICAgaW5jbHVkZSAnb21wX2xpYi5oJworCisgICAgICByZXQgPSAwCisgICAgICBjYWxsIGhpbnRlZF9sb2NrKGttcF9sb2NrX2hpbnRfbm9uZSwgcmV0KQorICAgICAgY2FsbCBoaW50ZWRfbG9jayhrbXBfbG9ja19oaW50X2NvbnRlbmRlZCwgcmV0KQorICAgICAgY2FsbCBoaW50ZWRfbG9jayhrbXBfbG9ja19oaW50X3VuY29udGVuZGVkLCByZXQpCisgICAgICBjYWxsIGhpbnRlZF9sb2NrKGttcF9sb2NrX2hpbnRfbm9uc3BlY3VsYXRpdmUsIHJldCkKKyAgICAgIGNhbGwgaGludGVkX2xvY2soa21wX2xvY2tfaGludF9zcGVjdWxhdGl2ZSwgcmV0KQorICAgICAgY2FsbCBoaW50ZWRfbG9jayhrbXBfbG9ja19oaW50X2FkYXB0aXZlLCByZXQpCisjZWxzZQorICAgICAgcmV0ID0gMAorI2VuZGlmCisKKyAgICAgIGlmIChyZXQgLmVxLiAwKSB0aGVuCisgICAgICAgICAgcHJpbnQgKiwgJ1Rlc3Qgb21wX3NldF91bnNldF9sb2NrX2hpbnRlZC5mIHBhc3NlZCcKKyAgICAgIGVsc2UKKyAgICAgICAgICBwcmludCAqLCAnVGVzdCBvbXBfc2V0X3Vuc2V0X2xvY2tfaGludGVkLmYgZmFpbGVkJworICAgICAgZW5kaWYKKworICAgICAgc3RvcAorICAgICAgZW5kCisKKyAgICAgIHN1YnJvdXRpbmUgaGludGVkX2xvY2sobG9ja19oaW50LCByZXQpCisjaWYgZGVmaW5lZChfT1BFTk1QKQorICAgICAgaW5jbHVkZSAnb21wX2xpYi5oJworICAgICAgaW50ZWdlcihvbXBfbG9ja19raW5kKSBsb2NrCisgICAgICBpbnRlZ2VyKGttcF9sb2NrX2hpbnRfa2luZCkgbG9ja19oaW50CisjZWxzZQorICAgICAgaW50ZWdlciBsb2NrCisgICAgICBpbnRlZ2VyIGxvY2tfaGludAorI2VuZGlmCisgICAgICBpbnRlZ2VyIHJldAorICAgICAgbG9naWNhbCBwYXNzZWQKKyAgICAgIGludGVnZXIgbigxMDAwKSwgaiwgaWQKKyAgICAgIAorICAgICAgcGFzc2VkID0gLlRSVUUuCisKKyAgICAgIGNhbGwga21wX2luaXRfbG9ja19oaW50ZWQobG9jaywgbG9ja19oaW50KQorCishJG9tcCAgcGFyYWxsZWwKKyEkb21wJiAgICAgc2hhcmVkICAgICAgIChuLHBhc3NlZCxsb2NrKQorISRvbXAmICAgICBwcml2YXRlICAgICAgKGlkLGopICAgICAgCisjaWYgZGVmaW5lZChfT1BFTk1QKSAmJiAhZGVmaW5lZChfQVNTVVJFKQorICAgICAgaWQgPSBvbXBfZ2V0X3RocmVhZF9udW0oKQorI2Vsc2UKKyAgICAgIGlkID0gMAorI2VuZGlmCisjaWYgZGVmaW5lZChfQVNTVVJFKQorICAgICAgZG8gaiA9IDEsIDEwCisjZWxzZQorICAgICAgZG8gaiA9IDEsIDEwMDAwCisjZW5kaWYKKyAgICAgICAgICBjYWxsIGNzY2FsbChpZCwgbiwgcGFzc2VkLCBsb2NrKQorICAgICAgZW5kZG8KKyEkb21wICBlbmQgcGFyYWxsZWwKKworICAgICAgY2FsbCBvbXBfZGVzdHJveV9sb2NrKGxvY2spCisKKyAgICAgIGlmICgubm90LiBwYXNzZWQpIHRoZW4KKyAgICAgICAgICByZXQgPSByZXQgKyAxCisgICAgICBlbmRpZgorCisgICAgICBlbmQKKworICAgICAgc3Vicm91dGluZSBjc2NhbGwoaWQsIG4sIHBhc3NlZCwgbG9jaykKKyNpZiBkZWZpbmVkKF9PUEVOTVApCisgICAgICAgIGluY2x1ZGUgJ29tcF9saWIuaCcKKyAgICAgIGludGVnZXIob21wX2xvY2tfa2luZCkgbG9jaworI2Vsc2UKKyAgICAgIGludGVnZXIgbG9jaworI2VuZGlmCisgICAgICBpbnRlZ2VyIGlkLCBpLCBuKDEwMDApCisgICAgICBsb2dpY2FsIHBhc3NlZAorCisgICAgICBjYWxsIG9tcF9zZXRfbG9jayhsb2NrKQorICAgICAgZG8gaSA9IDEsMTAwMAorICAgICAgICAgIG4oaSkgPSBpZAorICAgICAgZW5kZG8KKyAgICAgIGRvIGkgPSAxLDEwMDAKKyAgICAgICAgICBpZiAobihpKSAubmUuIGlkKSBwYXNzZWQgPSAuRkFMU0UuCisgICAgICBlbmRkbworICAgICAgY2FsbCBvbXBfdW5zZXRfbG9jayhsb2NrKQorICAgICAgZW5kCmRpZmYgLS1naXQgYS9maW5hbC93d3cvUkVBRE1FLnR4dCBiL2ZpbmFsL3d3dy9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNjA2NTMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC93d3cvUkVBRE1FLnR4dApAQCAtMCwwICsxLDExNiBAQAorCisgICAgICAgICAgICAgICBSRUFETUUgZm9yIHRoZSBMTFZNKiBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeQorICAgICAgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSG93IHRvIEJ1aWxkIERvY3VtZW50YXRpb24KKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBtYWluIGRvY3VtZW50YXRpb24gaXMgaW4gRG94eWdlbiogZm9ybWF0LCBhbmQgdGhpcyBkaXN0cmlidXRpb24KK3Nob3VsZCBjb21lIHdpdGggcHJlLWJ1aWx0IFBERiBkb2N1bWVudGF0aW9uIGluIGRvYy9SZWZlcmVuY2UucGRmLgorSG93ZXZlciwgYW4gSFRNTCB2ZXJzaW9uIGNhbiBiZSBidWlsdCBieSBleGVjdXRpbmc6CisKKyUgZG94eWdlbiBkb2MvZG94eWdlbi9jb25maWcKKworaW4gdGhlIHJ1bnRpbWUgZGlyZWN0b3J5LgorCitUaGF0IHdpbGwgcHJvZHVjZSBIVE1MIGRvY3VtZW50YXRpb24gaW4gdGhlIGRvYy9kb3h5Z2VuL2dlbmVyYXRlZAorZGlyZWN0b3J5LCB3aGljaCBjYW4gYmUgYWNjZXNzZWQgYnkgcG9pbnRpbmcgYSB3ZWIgYnJvd3NlciBhdCB0aGUKK2luZGV4Lmh0bWwgZmlsZSB0aGVyZS4KKworSWYgeW91IGRvbid0IGhhdmUgRG94eWdlbiBpbnN0YWxsZWQsIHlvdSBjYW4gZG93bmxvYWQgaXQgZnJvbQord3d3LmRveHlnZW4ub3JnLgorCisKK0hvdyB0byBCdWlsZCB0aGUgTExWTSogT3Blbk1QKiBSdW50aW1lIExpYnJhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0luLXRyZWUgYnVpbGQ6CisKKyQgY2Qgd2hlcmUteW91LXdhbnQtdG8tbGl2ZQorQ2hlY2sgb3V0IG9wZW5tcCBpbnRvIGxsdm0vcHJvamVjdHMKKyQgY2Qgd2hlcmUteW91LXdhbnQtdG8tYnVpbGQKKyQgbWtkaXIgYnVpbGQgJiYgY2QgYnVpbGQKKyQgY21ha2UgcGF0aC90by9sbHZtIC1EQ01BS0VfQ19DT01QSUxFUj08QyBjb21waWxlcj4gLURDTUFLRV9DWFhfQ09NUElMRVI9PEMrKyBjb21waWxlcj4KKyQgbWFrZSBvbXAKKworT3V0LW9mLXRyZWUgYnVpbGQ6CisKKyQgY2Qgd2hlcmUteW91LXdhbnQtdG8tbGl2ZQorQ2hlY2sgb3V0IG9wZW5tcAorJCBjZCB3aGVyZS15b3Utd2FudC10by1saXZlL29wZW5tcC9ydW50aW1lCiskIG1rZGlyIGJ1aWxkICYmIGNkIGJ1aWxkCiskIGNtYWtlIHBhdGgvdG8vb3Blbm1wIC1EQ01BS0VfQ19DT01QSUxFUj08QyBjb21waWxlcj4gLURDTUFLRV9DWFhfQ09NUElMRVI9PEMrKyBjb21waWxlcj4KKyQgbWFrZQorCitGb3IgZGV0YWlscyBhYm91dCBidWlsZGluZywgcGxlYXNlIGxvb2sgYXQgQnVpbGRfV2l0aF9DTWFrZS50eHQKKworQXJjaGl0ZWN0dXJlcyBTdXBwb3J0ZWQKKz09PT09PT09PT09PT09PT09PT09PT09CisqIElBLTMyIGFyY2hpdGVjdHVyZQorKiBJbnRlbChSKSA2NCBhcmNoaXRlY3R1cmUKKyogSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlCisqIEFSTSogYXJjaGl0ZWN0dXJlCisqIEFhcmNoNjQgKDY0LWJpdCBBUk0pIGFyY2hpdGVjdHVyZQorKiBJQk0oUikgUG93ZXIgYXJjaGl0ZWN0dXJlIChiaWcgZW5kaWFuKQorKiBJQk0oUikgUG93ZXIgYXJjaGl0ZWN0dXJlIChsaXR0bGUgZW5kaWFuKQorKiBNSVBTIGFuZCBNSVBTNjQgYXJjaGl0ZWN0dXJlcworCitTdXBwb3J0ZWQgUlRMIEJ1aWxkIENvbmZpZ3VyYXRpb25zCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1N1cHBvcnRlZCBBcmNoaXRlY3R1cmVzOiBJQS0zMiBhcmNoaXRlY3R1cmUsIEludGVsKFIpIDY0LCBhbmQKK0ludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZQorCisgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgfCAgIGljYy9pY2wgICAgIHwgICAgZ2NjICAgICAgfCAgIGNsYW5nICAgICAgfAorLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IExpbnV4KiBPUyAgIHwgICBZZXMoMSw1KSAgICB8ICBZZXMoMiw0KSAgIHwgWWVzKDQsNiw3KSAgIHwKK3wgRnJlZUJTRCogICAgfCAgIE5vICAgICAgICAgIHwgIE5vICAgICAgICAgfCBZZXMoNCw2LDcsOCkgfAorfCBPUyBYKiAgICAgICB8ICAgWWVzKDEsMyw0KSAgfCAgTm8gICAgICAgICB8IFllcyg0LDYsNykgICB8Cit8IFdpbmRvd3MqIE9TIHwgICBZZXMoMSw0KSAgICB8ICBObyAgICAgICAgIHwgTm8gICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisoMSkgT24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbChSKSA2NCwgaWNjL2ljbCB2ZXJzaW9ucyAxMi54IGFyZQorICAgIHN1cHBvcnRlZCAoMTIuMSBpcyByZWNvbW1lbmRlZCkuCisoMikgR0NDKiB2ZXJzaW9uIDQuNyBpcyBzdXBwb3J0ZWQuCisoMykgRm9yIGljYyBvbiBPUyBYKiwgT1MgWCogdmVyc2lvbiAxMC41LjggaXMgc3VwcG9ydGVkLgorKDQpIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSBub3Qgc3VwcG9ydGVkLgorKDUpIE9uIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSwgaWNjL2ljbCB2ZXJzaW9ucyAxMy4wCisgICAgb3IgbGF0ZXIgYXJlIHJlcXVpcmVkLgorKDYpIENsYW5nKiB2ZXJzaW9uIDMuMyBpcyBzdXBwb3J0ZWQuCisoNykgQ2xhbmcqIGN1cnJlbnRseSBkb2VzIG5vdCBvZmZlciBhIHNvZnR3YXJlLWltcGxlbWVudGVkIDEyOCBiaXQgZXh0ZW5kZWQKKyAgICBwcmVjaXNpb24gdHlwZS4gIFRodXMsIGFsbCBlbnRyeSBwb2ludHMgcmVsaWFudCBvbiB0aGlzIHR5cGUgYXJlIHJlbW92ZWQKKyAgICBmcm9tIHRoZSBsaWJyYXJ5IGFuZCBjYW5ub3QgYmUgY2FsbGVkIGluIHRoZSB1c2VyIHByb2dyYW0uICBUaGUgZm9sbG93aW5nCisgICAgZnVuY3Rpb25zIGFyZSBub3QgYXZhaWxhYmxlOgorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl8qCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2XyoKKyAgICBfX2ttcGNfYXRvbWljXypfZnAKKyg4KSBDb21tdW5pdHkgY29udHJpYnV0aW9uIHByb3ZpZGVkIEFTIElTLCBub3QgdGVzdGVkIGJ5IEludGVsLgorCitTdXBwb3J0ZWQgQXJjaGl0ZWN0dXJlczogSUJNKFIpIFBvd2VyIDcgYW5kIFBvd2VyIDgKKworICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICB8ICAgZ2NjICAgICAgfCAgIGNsYW5nICAgICAgfAorLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tfAorfCBMaW51eCogT1MgICB8ICBZZXMoMSwyKSAgfCBZZXMoMyw0KSAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisoMSkgT24gUG93ZXIgNywgZ2NjIHZlcnNpb24gNC44LjIgaXMgc3VwcG9ydGVkLgorKDIpIE9uIFBvd2VyIDgsIGdjYyB2ZXJzaW9uIDQuOC4yIGlzIHN1cHBvcnRlZC4KKygzKSBPbiBQb3dlciA3LCBjbGFuZyB2ZXJzaW9uIDMuNyBpcyBzdXBwb3J0ZWQuCisoNCkgT24gUG93ZXIgOCwgY2xhbmcgdmVyc2lvbiAzLjcgaXMgc3VwcG9ydGVkLgorCisKK0Zyb250LWVuZCBDb21waWxlcnMgdGhhdCB3b3JrIHdpdGggdGhpcyBSVEwKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIGZvbGxvd2luZyBjb21waWxlcnMgYXJlIGtub3duIHRvIGRvIGNvbXBhdGlibGUgY29kZSBnZW5lcmF0aW9uIGZvcgordGhpcyBSVEw6IGNsYW5nIChmcm9tIHRoZSBPcGVuTVAgZGV2ZWxvcG1lbnQgYnJhbmNoIGF0CitodHRwOi8vY2xhbmctb21wLmdpdGh1Yi5pby8gKSwgSW50ZWwgY29tcGlsZXJzLCBHQ0MuICBTZWUgdGhlIGRvY3VtZW50YXRpb24KK2ZvciBtb3JlIGRldGFpbHMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05vdGljZXMKKz09PT09PT0KKworKk90aGVyIG5hbWVzIGFuZCBicmFuZHMgbWF5IGJlIGNsYWltZWQgYXMgdGhlIHByb3BlcnR5IG9mIG90aGVycy4KZGlmZiAtLWdpdCBhL2ZpbmFsL3d3dy9SZWZlcmVuY2UucGRmIGIvZmluYWwvd3d3L1JlZmVyZW5jZS5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk3YzQwYwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmFsL3d3dy9SZWZlcmVuY2UucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZpbmFsL3d3dy9jb250ZW50LmNzcyBiL2ZpbmFsL3d3dy9jb250ZW50LmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2E2YTMyCi0tLSAvZGV2L251bGwKKysrIGIvZmluYWwvd3d3L2NvbnRlbnQuY3NzCkBAIC0wLDAgKzEsMjcgQEAKK2h0bWwgeyBtYXJnaW46IDBweDsgfSBib2R5IHsgbWFyZ2luOiA4cHg7IH0KKworaHRtbCwgYm9keSB7CisgIHBhZGRpbmc6MHB4OworICBmb250LXNpemU6c21hbGw7IGZvbnQtZmFtaWx5OiJMdWNpZGEgR3JhbmRlIiwgIkx1Y2lkYSBTYW5zIFVuaWNvZGUiLCBBcmlhbCwgVmVyZGFuYSwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOyBjb2xvcjogIzIyMjsKKyAgbGluZS1oZWlnaHQ6MS41OworfQorCitoMSwgaDIsIGgzLCB0dCB7IGNvbG9yOiAjMDAwIH0KKworaDEgeyBwYWRkaW5nLXRvcDowcHg7IG1hcmdpbi10b3A6MHB4O30KK2gyIHsgY29sb3I6IzMzMzMzMzsgcGFkZGluZy10b3A6MC41ZW07IH0KK2gzIHsgcGFkZGluZy10b3A6IDAuNWVtOyBtYXJnaW4tYm90dG9tOiAtMC4yNWVtOyBjb2xvcjojMmQ1OGI3fQorbGkgeyBwYWRkaW5nLWJvdHRvbTogMC41ZW07IH0KK3VsIHsgcGFkZGluZy1sZWZ0OjEuNWVtOyB9CisKKy8qIFNsaWRlcyAqLworSU1HLmltZ19zbGlkZSB7CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgbWFyZ2luLWxlZnQ6IGF1dG87CisgICAgbWFyZ2luLXJpZ2h0OiBhdXRvCit9CisKKy5pdGVtVGl0bGUgeyBjb2xvcjojMmQ1OGI3IH0KKworLyogVGFibGVzICovCit0ciB7IHZlcnRpY2FsLWFsaWduOnRvcCB9CmRpZmYgLS1naXQgYS9maW5hbC93d3cvaW5kZXguaHRtbCBiL2ZpbmFsL3d3dy9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YzNlMGIKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC93d3cvaW5kZXguaHRtbApAQCAtMCwwICsxLDI0MyBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOIgorICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4KKzwhLS0gTWF0ZXJpYWwgdXNlZCBmcm9tOiBIVE1MIDQuMDEgc3BlY3M6IGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0MDEvIC0tPgorPGh0bWw+Cis8aGVhZD4KKyAgPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+CisgIDx0aXRsZT5PcGVuTVAqIDogU3VwcG9ydCBmb3IgdGhlIE9wZW5NUCBsYW5ndWFnZTwvdGl0bGU+CisgIDxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9Im1lbnUuY3NzIj4KKyAgPGxpbmsgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iY29udGVudC5jc3MiPgorPC9oZWFkPgorCis8Ym9keT4KKzxkaXYgaWQ9Im1lbnUiPgorICA8ZGl2PgorICAgIDxhIGhyZWY9Imh0dHA6Ly9sbHZtLm9yZy8iPkxMVk0gSG9tZTwvYT4KKyAgPC9kaXY+CisKKyAgPGRpdiBjbGFzcz0ic3VibWVudSI+CisgICAgPGxhYmVsPk9wZW5NUCBJbmZvPC9sYWJlbD4KKyAgICA8YSBocmVmPSIvaW5kZXguaHRtbCI+QWJvdXQ8L2E+CisgIDwvZGl2PgorCisgIDxkaXYgY2xhc3M9InN1Ym1lbnUiPgorICAgIDxsYWJlbD5RdWljayBMaW5rczwvbGFiZWw+CisgICAgPGEgaHJlZj0iaHR0cDovL2xpc3RzLmxsdm0ub3JnL21haWxtYW4vbGlzdGluZm8vb3Blbm1wLWRldiI+b3Blbm1wLWRldjwvYT4KKyAgICA8YSBocmVmPSJodHRwOi8vbGlzdHMubGx2bS5vcmcvbWFpbG1hbi9saXN0aW5mby9vcGVubXAtY29tbWl0cyI+b3Blbm1wLWNvbW1pdHM8L2E+CisgICAgPGEgaHJlZj0iaHR0cDovL2xsdm0ub3JnL2J1Z3MvIj5CdWcgUmVwb3J0czwvYT4KKyAgICA8YSBocmVmPSJodHRwOi8vbGx2bS5vcmcvc3ZuL2xsdm0tcHJvamVjdC9vcGVubXAvdHJ1bmsvIj5Ccm93c2UgU1ZOPC9hPgorICAgIDxhIGhyZWY9Imh0dHA6Ly9sbHZtLm9yZy92aWV3dmMvbGx2bS1wcm9qZWN0L29wZW5tcC90cnVuay8iPkJyb3dzZSBWaWV3VkM8L2E+CisgIDwvZGl2PgorPC9kaXY+CisKKzxkaXYgaWQ9ImNvbnRlbnQiPgorICA8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLS0+CisgIDxoMT5PcGVuTVAmcmVnOzogU3VwcG9ydCBmb3IgdGhlIE9wZW5NUCBsYW5ndWFnZTwvaDE+CisgIDwhLS0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotLT4KKworICA8cD5UaGUgT3Blbk1QIHN1YnByb2plY3Qgb2YgTExWTSBjb250YWlucyB0aGUKKyAgICAgY29tcG9uZW50cyByZXF1aXJlZCB0byBidWlsZCBhbiBleGVjdXRhYmxlIE9wZW5NUCBwcm9ncmFtIHRoYXQgYXJlCisgICAgIG91dHNpZGUgdGhlIGNvbXBpbGVyIGl0c2VsZi4KKyAgPC9wPgorCisgIDxwPkhlcmUgeW91IGNhbiBmaW5kIDotCisgICAgPHVsPgorICAgICAgPGxpPgorICAgICAgICB0aGUgY29kZSBmb3IgdGhlIHJ1bnRpbWUgbGlicmFyeSBhZ2FpbnN0IHdoaWNoCisgICAgICAgIGNvZGUgY29tcGlsZWQgYnkgPHR0PmNsYW5nIC1mb3Blbm1wPC90dD4gbXVzdCBiZSBsaW5rZWQgYmVmb3JlIGl0CisgICAgICAgIGNhbiBydW4uCisgICAgICA8L2xpPgorICAgICAgPGxpPgorICAgICAgICB0aGUgbGlicmFyeSB0aGF0IHN1cHBvcnRzIG9mZmxvYWQgdG8gdGFyZ2V0IGRldmljZXMgKGluCisgICAgICAgICJvZmZsb2FkIikKKyAgICAgIDwvbGk+CisgICAgICA8bGk+CisgICAgICAgIHRoZSBPcGVuVUggdGVzdC1zdWl0ZSB1c2VkIHRvIHZhbGlkYXRlIHRoZSBPcGVuTVAgcnVudGltZQorICAgICAgPC9saT4KKyAgICA8L3VsPgorICA8L3A+CisKKyAgPHA+U3VwcG9ydCBmb3IgdGhlIHBhcnRzIG9mIHRoZSBPcGVuTVAgNC4wIChhbmQgbGF0ZXIpIGxhbmd1YWdlIHRoYXQgYXJlIG5vdAorICBhc3NvY2lhdGVkIHdpdGggdGhlICJ0YXJnZXQiIGNvbnN0cnVjdHMgYXJlIGNvbnRhaW5lZCBpbiB0aGUKKyAgInJ1bnRpbWUiIGRpcmVjdG9yeS4gU3VwcG9ydCBmb3Igb2ZmbG9hZGluZyBjb21wdXRhdGlvbiB2aWEgdGhlCisgICJ0YXJnZXQiIGRpcmVjdGl2ZSBpcyBpbiB0aGUgc2VwYXJhdGUgIm9mZmxvYWQiIGRpcmVjdG9yeS4gVGhhdAorICBidWlsZHMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIHRyYW5zZmVycmluZyBjb2RlCisgIGFuZCBkYXRhIHRvIGF0dGFjaGVkIGNvbXB1dGF0aW9uYWwgZGV2aWNlcyBzdWNoIGFzCisgIHRoZSBJbnRlbCZyZWcgWGVvbiBQaGkmIzAxNTMgY29wcm9jZXNzb3Igb3IgR1BVcy4KKyAgVGhlIFJFQURNRS50eHQgaW4gdGhlICJvZmZsb2FkIgorICBkaXJlY3RvcnkgZGVzY3JpYmVzIGhvdyB0byBidWlsZCB0aGUgb2ZmbG9hZCBsaWJyYXJ5LgorICA8L3A+CisKKyAgPHA+QWxsIG9mIHRoZSBjb2RlIGhlcmUgaXMgPGEKKyAgICAgaHJlZj0iaHR0cDovL2xsdm0ub3JnL2RvY3MvRGV2ZWxvcGVyUG9saWN5Lmh0bWwjbGljZW5zZSI+ZHVhbCBsaWNlbnNlZDwvYT4KKyAgICAgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGFuZCB0aGUgVUlVQyBMaWNlbnNlIChhIEJTRC1saWtlIGxpY2Vuc2UpLgorICAgICBUaGUgTElDRU5TRS50eHQgZmlsZSBhdCB0aGUgdG9wIG9mIHRoZSBPcGVuTVAgcHJvamVjdCBjb250YWlucworICAgICB0aGUgbGljZW5zZSB0ZXh0IGFuZCBhc3NvY2lhdGVkIHBhdGVudCBncmFudHMuCisgIDwvcD4KKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDxoMiBpZD0iZGlyLXN0cnVjdHVyZSI+U3RhdHVzPC9oMj4KKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorCisgICA8cD5XaXRoIHRoZSByZWxlYXNlIG9mIENsYW5nIDMuOC4wLCBPcGVuTVAgMy4xIHN1cHBvcnQgaXMgZW5hYmxlZCBpbgorICAgQ2xhbmcgYnkgZGVmYXVsdCwgYW5kIHRoZSBPcGVuTVAgcnVudGltZSBpcyB0aGVyZWZvcmUgYnVpbHQgYXMgYQorICAgbm9ybWFsIHBhcnQgb2YgdGhlIENsYW5nIGJ1aWxkLCBhbmQgZGlzdHJpYnV0ZWQgd2l0aCB0aGUgYmluYXJ5CisgICBkaXN0cmlidXRpb25zLllvdSBkbyBub3QsIHRoZXJlZm9yZSwgbmVlZCBleHBsaWNpdGx5IHRvIGNoZWNrIG91dCB0aGlzIGNvZGUsIG9yCisgICBidWlsZCBpdCBvdXQgb2YgdHJlZTsgYSBub3JtYWwgQ2xhbmcgY2hlY2sgb3V0IGFuZCBidWlsZCB3aWxsCisgICBhdXRvbWF0aWNhbGx5IGluY2x1ZGUgYnVpbGRpbmcgdGhlc2UgcnVudGltZSBsaWJyYXJpZXMuCisgICA8L3A+CisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8aDIgaWQ9ImdvYWxzIj5GZWF0dXJlcyBhbmQgR29hbHM8L2gyPgorICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKyAgICA8dWw+CisgICAgICAgIDxsaT5TdXBwb3J0IGZvciB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVubXAub3JnL21wLWRvY3VtZW50cy9PcGVuTVAzLjEucGRmIj5PcGVuTVAKKyAgICAgICAgICAzLjEgc3RhbmRhcmQgKFBERik8L2E+IGhhcyBiZWVuIGFjaGlldmVkIGluIHRoZSBDbGFuZyAzLjguMAorICAgICAgICAgIHJlbGVhc2UuCisgICAgICAgIDwvbGk+CisKKyAgICAgICAgPGxpPlN1cHBvcnQgZm9yIHRoZQorIDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbm1wLm9yZy9tcC1kb2N1bWVudHMvT3Blbk1QNC4wLjAucGRmIj5PcGVuTVAKKyAgICAgICAgICA0LjAgc3RhbmRhcmQgKFBERik8L2E+IGFuZCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5tcC5vcmcvbXAtZG9jdW1lbnRzL09wZW5NUDQuNS5wZGYiPk9wZW5NUAorICAgICAgICAgIDQuNSBzdGFuZGFyZCAoUERGKTwvYT4gaXMgbm93IGJlaW5nIGltcGxlbWVudGVkLiAoU29tZSBPcGVuTVAgNC4wCisgICAgICAgICAgYW5kIDQuNSBmZWF0dXJlcyBhcmUgYWxyZWFkeSBhdmFpbGFibGUpLgorICAgICAgICA8bGk+SGlnaCBwZXJmb3JtYW5jZS48L2xpPgorICAgICAgICA8bGk+QUJJIGNvbXBhdGliaWxpdHkgd2l0aCA8YSBocmVmPSJodHRwOi8vZ2NjLmdudS5vcmciPkdjYzwvYT4gYW5kCisgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9zb2Z0d2FyZS5pbnRlbC5jb20vZW4tdXMvaW50ZWwtY29tcGlsZXJzIj5JbnRlbCdzCisgICAgICAgIGV4aXN0aW5nIE9wZW5NUCBjb21waWxlcnMuPC9hPgorICAgICAgICBXZSBjdXJyZW50bHkgaGF2ZSBiaW5hcnkgY29tcGF0aWJpbGl0eSB3aXRoIE9wZW5NUAorICAgICAgICAzLjEgY29kZSBjb21waWxlZCBieSBnY2MgNC45LCBob3dldmVyIHdlIGRvIG5vdCBoYXZlIHN1cHBvcnQKKyAgICAgICAgZm9yIE9wZW5NUCA0LjAgY29kZSB0aGF0IHVzZXMgdGFzayBjYW5jZWxsYXRpb24gd2hlbiBjb21waWxlZAorICAgICAgICBieSBnY2MgNC45LiBIb3cgd2Ugd2lsbCBzdXBwb3J0IHN1Y2ggY29kZSByZW1haW5zIGEgcmVzZWFyY2ggaXNzdWUuCisgICAgICAgIDwvbGk+CisgICAgPC91bD4KKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDxoMiBpZD0id2h5Ij5XaHkgaGF2ZSB0aGUgcnVudGltZSBjb2RlIGhlcmU/PC9oMj4KKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorCisgIDxwPkl0IG1ha2VzIHNlbnNlIHRvIGhhdmUgdGhlIHJ1bnRpbWUgc291cmNlcyBpbiB0aGUgc2FtZSBwbGFjZQorICAgIChhbmQgd2l0aCB0aGUgc2FtZSBsaWNlbnNlKSBhcyB0aGUgY29tcGlsZXIuCisgIDwvcD4KKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDxoMiBpZD0icmVxdWlyZW1lbnRzIj5QbGF0Zm9ybSBTdXBwb3J0PC9oMj4KKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorCisgICA8cD5UaGUgcnVudGltZSBjYW4gYmUgYnVpbHQgd2l0aCBnY2MsIGljYyBvciBjbGFuZy4gSG93ZXZlciwgbm90ZQorICAgdGhhdCBhIHJ1bnRpbWUgYnVpbHQgd2l0aCBjbGFuZyBjYW5ub3QgYmUgZ3VhcmFudGVlZCB0byB3b3JrIHdpdGgKKyAgIE9wZW5NUCBjb2RlIGNvbXBpbGVkIGJ5IHRoZSBvdGhlciBjb21waWxlcnMsIHNpbmNlIGNsYW5nIGRvZXMgbm90IHN1cHBvcnQKKyAgIGEgMTI4LWJpdCBmbG9hdCB0eXBlLCBhbmQgY2Fubm90IHRoZXJlZm9yZSBnZW5lcmF0ZSB0aGUgY29kZSB1c2VkCisgICBmb3IgcmVkdWN0aW9ucyBvZiB0aGF0IHR5cGUgKHdoaWNoIG1heSBvY2N1ciBpbiB1c2VyIGNvZGUgY29tcGlsZWQKKyAgIGJ5IHRoZSBvdGhlciBjb21waWxlcnMpLgorICAgPC9wPgorCisgIDxwPlRoZSBPcGVuTVAgcnVudGltZSBpcyBrbm93biB0byB3b3JrIG9uCisgICAgPHVsPgorICAgICAgPGxpPkFSTSZyZWc7Jm5ic3A7IGFyY2hpdGVjdHVyZSBwcm9jZXNzb3JzPC9saT4KKyAgICAgIDxsaT5Qb3dlclBDJnRyYWRlOyZuYnNwOyBwcm9jZXNzb3JzPC9saT4KKyAgICAgIDxsaT4zMiBhbmQgNjQgYml0IFg4NgorICAgICAgICBwcm9jZXNzb3JzIHdoZW4gY29tcGlsZWQgd2l0aCBjbGFuZywgd2l0aCB0aGUgSW50ZWwgY29tcGlsZXIKKyAgICAgICAgb3Igd2l0aCBnY2MsIGFuZCBhbHNvIHRoZSBJbnRlbCZyZWc7Jm5ic3A7WGVvbiBQaGkmdHJhZGU7IHByb2R1Y3QgZmFtaWx5LCB3aGVuIGNvbXBpbGVkIHdpdGgKKyAgICAgICAgdGhlIEludGVsIGNvbXBpbGVyLgorICAgICAgPC9saT4KKyAgICAgIDxsaT5NSVBTIGFuZCBNSVBTNjQ8L2xpPgorICAgIDwvdWw+CisgICAgUG9ydHMgdG8gb3RoZXIgYXJjaGl0ZWN0dXJlcyBhbmQgb3BlcmF0aW5nIHN5c3RlbXMgYXJlIHdlbGNvbWUuCisgIDwvcD4KKworICA8cD5BIGZ1bGwgT1MgYW5kIGFyY2hpZWN0dXJlIGNvbXBhdGliaWxpdHkgbWF0cml4IGlzIGluCisgICAgPGEgaHJlZj0iUkVBRE1FLnR4dCI+UkVBRE1FLnR4dDwvYT4KKyAgPC9wPgorCisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8aDI+R2V0IGl0IGFuZCBnZXQgaW52b2x2ZWQhPC9oMj4KKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorCisgIDxwPkZpcnN0IHBsZWFzZSByZXZpZXcgb3VyCisgICAgIDxhIGhyZWY9Imh0dHA6Ly9sbHZtLm9yZy9kb2NzL0RldmVsb3BlclBvbGljeS5odG1sIj5EZXZlbG9wZXIncyBQb2xpY3k8L2E+LgorCisgIDxwPlRvIGNoZWNrIG91dCB0aGUgY29kZSwgdXNlOjwvcD4KKworICA8dWw+CisgIDxsaT48Y29kZT5zdm4gY28gaHR0cDovL2xsdm0ub3JnL3N2bi9sbHZtLXByb2plY3Qvb3Blbm1wL3RydW5rIG9wZW5tcDwvY29kZT48L2xpPgorICA8L3VsPgorCisgIDxwPgorICAgICBOb3RlIHRoYXQgZm9yIGFuIGluLXRyZWUgYnVpbGQsIHlvdSBzaG91bGQgY2hlY2sgb3V0IG9wZW5tcCB0byBsbHZtL3Byb2plY3RzLgorICA8L3A+CisKKyAgPHA+SW4tdHJlZSBidWlsZDo8L3A+CisgIDx1bD4KKyAgICA8bGk+PGNvZGU+Y2Qgd2hlcmUteW91LXdhbnQtdG8tbGl2ZTwvY29kZT48L2xpPgorICAgIDxsaT5DaGVjayBvdXQgb3Blbm1wIGludG8gbGx2bS9wcm9qZWN0czwvbGk+CisgICAgPGxpPjxjb2RlPmNkIHdoZXJlLXlvdS13YW50LXRvLWJ1aWxkPC9jb2RlPjwvbGk+CisgICAgPGxpPjxjb2RlPm1rZGlyIGJ1aWxkICZhbXA7JmFtcDsgY2QgYnVpbGQ8L2NvZGU+PC9saT4KKyAgICA8bGk+PGNvZGU+Y21ha2UgcGF0aC90by9sbHZtIC1EQ01BS0VfQ19DT01QSUxFUj0mbHQ7QyBjb21waWxlciZndDsgLURDTUFLRV9DWFhfQ09NUElMRVI9Jmx0O0MrKyBjb21waWxlciZndDs8L2NvZGU+PC9saT4KKyAgICA8bGk+PGNvZGU+bWFrZSBvbXA8L2NvZGU+PC9saT4KKyAgPC91bD4KKworICA8cD5PdXQtb2YtdHJlZSBidWlsZDo8L3A+CisgIDx1bD4KKyAgICA8bGk+PGNvZGU+Y2Qgd2hlcmUteW91LXdhbnQtdG8tbGl2ZTwvY29kZT48L2xpPgorICAgIDxsaT5DaGVjayBvdXQgb3Blbm1wPC9saT4KKyAgICA8bGk+PGNvZGU+Y2Qgd2hlcmUteW91LXdhbnQtdG8tbGl2ZS9vcGVubXAvcnVudGltZTwvY29kZT48L2xpPgorICAgIDxsaT48Y29kZT5ta2RpciBidWlsZCAmYW1wOyZhbXA7IGNkIGJ1aWxkPC9jb2RlPjwvbGk+CisgICAgPGxpPjxjb2RlPmNtYWtlIHBhdGgvdG8vb3Blbm1wIC1EQ01BS0VfQ19DT01QSUxFUj0mbHQ7QyBjb21waWxlciZndDsgLURDTUFLRV9DWFhfQ09NUElMRVI9Jmx0O0MrKyBjb21waWxlciZndDs8L2NvZGU+PC9saT4KKyAgICA8bGk+PGNvZGU+bWFrZTwvY29kZT48L2xpPgorICA8L3VsPgorCisgIDxwPkZ1bGwgZGV0YWlscyBvZiBob3cgdG8gYnVpbGQgYXJlIGluIHRoZQorICAgIDxhIGhyZWY9IlJFQURNRS50eHQiPlJFQURNRS50eHQ8L2E+IGFuZCBCdWlsZF9XaXRoX0NNYWtlLnR4dCAoaW5zaWRlIHRoZSBydW50aW1lLyBzdWJkaXJlY3RvcnkpCisgIDwvcD4KKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDxoMz5Ob3RlczwvaDM+CisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKworPHA+CisKKzwvcD4KKworICA8cD5TZW5kIGRpc2N1c3Npb25zIHRvIHRoZQorICAoPGEgaHJlZj0iaHR0cDovL2xpc3RzLmxsdm0ub3JnL21haWxtYW4vbGlzdGluZm8vb3Blbm1wLWRldiI+T3Blbk1QIG1haWxpbmcgbGlzdDwvYT4pLjwvcD4KKworCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPGgyPkRlc2lnbiBEb2N1bWVudHM8L2gyPgorICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKzx1bD4KKzxsaT48YSBocmVmPSJSZWZlcmVuY2UucGRmIj5SdW50aW1lIGRlc2lnbiAoUERGKTwvYT48L2xpPgorPC91bD4KKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDxoMj5Db3B5cmlnaHQgbm90aWNlczwvaDI+CisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKzx1bD4KKzxsaT4KKyAgVGhlIE9wZW5NUCBuYW1lIGFuZCB0aGUgT3Blbk1QIGxvZ28gYXJlIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiB0aGUKKyAgT3Blbk1QIEFyY2hpdGVjdHVyZSBSZXZpZXcgQm9hcmQuCis8L2xpPgorPGxpPgorICBJbnRlbCBpcyBhIHRyYWRlbWFyayBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBpbiB0aGUgVS5TLiBhbmQvb3Igb3RoZXIKKyAgY291bnRyaWVzLgorPC9saT4KKzxsaT4KKyAgUG93ZXJQQyBpcyBhIHRyYWRlbWFyayBvZiBJQk0gQ29ycG9yYXRpb24gaW4gdGhlIFUuUy4gYW5kL29yIG90aGVyCisgIGNvdW50cmllcy4KKzwvbGk+Cis8bGk+CisgIEFSTSBpcyBhIHRyYWRlbWFyayBvZiBBUk0gQ29ycG9yYXRpb24gaW4gdGhlIFUuUy4gYW5kL29yCisgIG90aGVyIGNvdW50cmllcy4KKzwvbGk+Cis8bGk+CisgIE1JUFMgaXMgYSB0cmFkZW1hcmsgb2YgTUlQUyBDb21wdXRlciBTeXN0ZW1zIGluIHRoZSBVLlMuIGFuZC9vcgorICBvdGhlciBjb3VudHJpZXMuCis8L2xpPgorPC91bD4KKzwvZGl2PgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmluYWwvd3d3L21lbnUuY3NzIGIvZmluYWwvd3d3L21lbnUuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhODg3YjEKLS0tIC9kZXYvbnVsbAorKysgYi9maW5hbC93d3cvbWVudS5jc3MKQEAgLTAsMCArMSwzOSBAQAorLyoqKioqKioqKioqKioqKi8KKy8qIHBhZ2UgbGF5b3V0ICovCisvKioqKioqKioqKioqKioqLworCitbaWQ9bWVudV0geworCXBvc2l0aW9uOmZpeGVkOworCXdpZHRoOjI1ZXg7Cit9CitbaWQ9Y29udGVudF0geworCS8qICoqKioqICBFRElUIFRISVMgVkFMVUUgSUYgQ09OVEVOVCBPVkVSTEFQUyBNRU5VICoqKioqICovCisJcG9zaXRpb246YWJzb2x1dGU7CisgIGxlZnQ6MjlleDsKKwlwYWRkaW5nLXJpZ2h0OjRleDsKK30KKworLyoqKioqKioqKioqKioqLworLyogbWVudSBzdHlsZSAqLworLyoqKioqKioqKioqKioqLworCisjbWVudSAuc3VibWVudSB7CisJcGFkZGluZy10b3A6MWVtOworCWRpc3BsYXk6YmxvY2s7Cit9CisKKyNtZW51IGxhYmVsIHsKKwlkaXNwbGF5OmJsb2NrOworCWZvbnQtd2VpZ2h0OiBib2xkOworCXRleHQtYWxpZ246IGNlbnRlcjsKKwliYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTkyLDE5MiwxOTIpOworfQorI21lbnUgYSB7CisJcGFkZGluZzowIC4yZW07CisJZGlzcGxheTpibG9jazsKKwl0ZXh0LWFsaWduOiBjZW50ZXI7CisJYmFja2dyb3VuZC1jb2xvcjogcmdiKDIzNSwyMzUsMjM1KTsKK30KKyNtZW51IGE6dmlzaXRlZCB7CisJY29sb3I6cmdiKDEwMCw1MCwxMDApOworfQo=